diff --git a/app/common/src/main/java/stirling/software/SPDF/config/EndpointConfiguration.java b/app/common/src/main/java/stirling/software/SPDF/config/EndpointConfiguration.java index 2b4fa32d9..98bbe16fc 100644 --- a/app/common/src/main/java/stirling/software/SPDF/config/EndpointConfiguration.java +++ b/app/common/src/main/java/stirling/software/SPDF/config/EndpointConfiguration.java @@ -261,6 +261,8 @@ public class EndpointConfiguration { addEndpointToGroup("Convert", "pdf-to-csv"); addEndpointToGroup("Convert", "pdf-to-markdown"); addEndpointToGroup("Convert", "eml-to-pdf"); + addEndpointToGroup("Convert", "pdf-to-json"); + addEndpointToGroup("Convert", "json-to-pdf"); // Adding endpoints to "Security" group addEndpointToGroup("Security", "add-password"); @@ -388,6 +390,8 @@ public class EndpointConfiguration { addEndpointToGroup("Java", "pdf-to-markdown"); addEndpointToGroup("Java", "add-attachments"); addEndpointToGroup("Java", "compress-pdf"); + addEndpointToGroup("Java", "pdf-to-json"); + addEndpointToGroup("Java", "json-to-pdf"); addEndpointToGroup("rar", "pdf-to-cbr"); // Javascript diff --git a/app/common/src/main/java/stirling/software/common/service/UserServiceInterface.java b/app/common/src/main/java/stirling/software/common/service/UserServiceInterface.java index a833d4c84..074f42200 100644 --- a/app/common/src/main/java/stirling/software/common/service/UserServiceInterface.java +++ b/app/common/src/main/java/stirling/software/common/service/UserServiceInterface.java @@ -8,4 +8,6 @@ public interface UserServiceInterface { long getTotalUsersCount(); boolean isCurrentUserAdmin(); + + boolean isCurrentUserFirstLogin(); } diff --git a/app/common/src/main/java/stirling/software/common/util/FormUtils.java b/app/common/src/main/java/stirling/software/common/util/FormUtils.java deleted file mode 100644 index 19cda95ed..000000000 --- a/app/common/src/main/java/stirling/software/common/util/FormUtils.java +++ /dev/null @@ -1,658 +0,0 @@ -package stirling.software.common.util; - -import java.io.IOException; -import java.lang.reflect.Method; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import org.apache.pdfbox.cos.COSName; -import org.apache.pdfbox.pdmodel.PDDocument; -import org.apache.pdfbox.pdmodel.PDDocumentCatalog; -import org.apache.pdfbox.pdmodel.PDPage; -import org.apache.pdfbox.pdmodel.PDResources; -import org.apache.pdfbox.pdmodel.common.PDRectangle; -import org.apache.pdfbox.pdmodel.font.PDType1Font; -import org.apache.pdfbox.pdmodel.font.Standard14Fonts; -import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotation; -import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotationWidget; -import org.apache.pdfbox.pdmodel.interactive.form.*; - -import lombok.extern.slf4j.Slf4j; - -@Slf4j -public final class FormUtils { - - private FormUtils() {} - - public static boolean hasAnyRotatedPage(PDDocument document) { - try { - for (PDPage page : document.getPages()) { - int rot = page.getRotation(); - int norm = ((rot % 360) + 360) % 360; - if (norm != 0) { - return true; - } - } - } catch (Exception e) { - log.warn("Failed to inspect page rotations: {}", e.getMessage(), e); - } - return false; - } - - public static void copyAndTransformFormFields( - PDDocument sourceDocument, - PDDocument newDocument, - int totalPages, - int pagesPerSheet, - int cols, - int rows, - float cellWidth, - float cellHeight) - throws IOException { - - PDDocumentCatalog sourceCatalog = sourceDocument.getDocumentCatalog(); - PDAcroForm sourceAcroForm = sourceCatalog.getAcroForm(); - - if (sourceAcroForm == null || sourceAcroForm.getFields().isEmpty()) { - return; - } - - PDDocumentCatalog newCatalog = newDocument.getDocumentCatalog(); - PDAcroForm newAcroForm = new PDAcroForm(newDocument); - newCatalog.setAcroForm(newAcroForm); - - PDResources dr = new PDResources(); - PDType1Font helvetica = new PDType1Font(Standard14Fonts.FontName.HELVETICA); - PDType1Font zapfDingbats = new PDType1Font(Standard14Fonts.FontName.ZAPF_DINGBATS); - dr.put(COSName.getPDFName("Helv"), helvetica); - dr.put(COSName.getPDFName("ZaDb"), zapfDingbats); - newAcroForm.setDefaultResources(dr); - newAcroForm.setDefaultAppearance("/Helv 12 Tf 0 g"); - - // Do not mutate the source AcroForm; skip bad widgets during copy - newAcroForm.setNeedAppearances(true); - - Map fieldNameCounters = new HashMap<>(); - - // Build widget -> field map once for efficient lookups - Map widgetFieldMap = buildWidgetFieldMap(sourceAcroForm); - - for (int pageIndex = 0; pageIndex < totalPages; pageIndex++) { - PDPage sourcePage = sourceDocument.getPage(pageIndex); - List annotations = sourcePage.getAnnotations(); - - if (annotations.isEmpty()) { - continue; - } - - int destinationPageIndex = pageIndex / pagesPerSheet; - int adjustedPageIndex = pageIndex % pagesPerSheet; - int rowIndex = adjustedPageIndex / cols; - int colIndex = adjustedPageIndex % cols; - - if (destinationPageIndex >= newDocument.getNumberOfPages()) { - continue; - } - - PDPage destinationPage = newDocument.getPage(destinationPageIndex); - PDRectangle sourceRect = sourcePage.getMediaBox(); - - float scaleWidth = cellWidth / sourceRect.getWidth(); - float scaleHeight = cellHeight / sourceRect.getHeight(); - float scale = Math.min(scaleWidth, scaleHeight); - - float x = colIndex * cellWidth + (cellWidth - sourceRect.getWidth() * scale) / 2; - float y = - destinationPage.getMediaBox().getHeight() - - ((rowIndex + 1) * cellHeight - - (cellHeight - sourceRect.getHeight() * scale) / 2); - - copyBasicFormFields( - sourceAcroForm, - newAcroForm, - sourcePage, - destinationPage, - x, - y, - scale, - pageIndex, - fieldNameCounters, - widgetFieldMap); - } - - // Refresh appearances to ensure widgets render correctly across viewers - try { - // Use reflection to avoid compile-time dependency on PDFBox version - Method m = newAcroForm.getClass().getMethod("refreshAppearances"); - m.invoke(newAcroForm); - } catch (NoSuchMethodException nsme) { - log.warn( - "AcroForm.refreshAppearances() not available in this PDFBox version; relying on NeedAppearances."); - } catch (Throwable t) { - log.warn("Failed to refresh field appearances via AcroForm: {}", t.getMessage(), t); - } - } - - private static void copyBasicFormFields( - PDAcroForm sourceAcroForm, - PDAcroForm newAcroForm, - PDPage sourcePage, - PDPage destinationPage, - float offsetX, - float offsetY, - float scale, - int pageIndex, - Map fieldNameCounters, - Map widgetFieldMap) { - - try { - List sourceAnnotations = sourcePage.getAnnotations(); - List destinationAnnotations = destinationPage.getAnnotations(); - - for (PDAnnotation annotation : sourceAnnotations) { - if (annotation instanceof PDAnnotationWidget widgetAnnotation) { - if (widgetAnnotation.getRectangle() == null) { - continue; - } - PDField sourceField = - widgetFieldMap != null ? widgetFieldMap.get(widgetAnnotation) : null; - if (sourceField == null) { - continue; // skip widgets without a matching field - } - if (sourceField instanceof PDTextField pdtextfield) { - createSimpleTextField( - newAcroForm, - destinationPage, - destinationAnnotations, - pdtextfield, - widgetAnnotation, - offsetX, - offsetY, - scale, - pageIndex, - fieldNameCounters); - } else if (sourceField instanceof PDCheckBox pdCheckBox) { - createSimpleCheckBoxField( - newAcroForm, - destinationPage, - destinationAnnotations, - pdCheckBox, - widgetAnnotation, - offsetX, - offsetY, - scale, - pageIndex, - fieldNameCounters); - } else if (sourceField instanceof PDRadioButton pdRadioButton) { - createSimpleRadioButtonField( - newAcroForm, - destinationPage, - destinationAnnotations, - pdRadioButton, - widgetAnnotation, - offsetX, - offsetY, - scale, - pageIndex, - fieldNameCounters); - } else if (sourceField instanceof PDComboBox pdComboBox) { - createSimpleComboBoxField( - newAcroForm, - destinationPage, - destinationAnnotations, - pdComboBox, - widgetAnnotation, - offsetX, - offsetY, - scale, - pageIndex, - fieldNameCounters); - } else if (sourceField instanceof PDListBox pdlistbox) { - createSimpleListBoxField( - newAcroForm, - destinationPage, - destinationAnnotations, - pdlistbox, - widgetAnnotation, - offsetX, - offsetY, - scale, - pageIndex, - fieldNameCounters); - } else if (sourceField instanceof PDSignatureField pdSignatureField) { - createSimpleSignatureField( - newAcroForm, - destinationPage, - destinationAnnotations, - pdSignatureField, - widgetAnnotation, - offsetX, - offsetY, - scale, - pageIndex, - fieldNameCounters); - } else if (sourceField instanceof PDPushButton pdPushButton) { - createSimplePushButtonField( - newAcroForm, - destinationPage, - destinationAnnotations, - pdPushButton, - widgetAnnotation, - offsetX, - offsetY, - scale, - pageIndex, - fieldNameCounters); - } - } - } - } catch (Exception e) { - log.warn( - "Failed to copy basic form fields for page {}: {}", - pageIndex, - e.getMessage(), - e); - } - } - - private static void createSimpleTextField( - PDAcroForm newAcroForm, - PDPage destinationPage, - List destinationAnnotations, - PDTextField sourceField, - PDAnnotationWidget sourceWidget, - float offsetX, - float offsetY, - float scale, - int pageIndex, - Map fieldNameCounters) { - - try { - PDTextField newTextField = new PDTextField(newAcroForm); - newTextField.setDefaultAppearance("/Helv 12 Tf 0 g"); - - boolean initialized = - initializeFieldWithWidget( - newAcroForm, - destinationPage, - destinationAnnotations, - newTextField, - sourceField.getPartialName(), - "textField", - sourceWidget, - offsetX, - offsetY, - scale, - pageIndex, - fieldNameCounters); - - if (!initialized) { - return; - } - - if (sourceField.getValueAsString() != null) { - newTextField.setValue(sourceField.getValueAsString()); - } - - } catch (Exception e) { - log.warn( - "Failed to create text field '{}': {}", - sourceField.getPartialName(), - e.getMessage(), - e); - } - } - - private static void createSimpleCheckBoxField( - PDAcroForm newAcroForm, - PDPage destinationPage, - List destinationAnnotations, - PDCheckBox sourceField, - PDAnnotationWidget sourceWidget, - float offsetX, - float offsetY, - float scale, - int pageIndex, - Map fieldNameCounters) { - - try { - PDCheckBox newCheckBox = new PDCheckBox(newAcroForm); - - boolean initialized = - initializeFieldWithWidget( - newAcroForm, - destinationPage, - destinationAnnotations, - newCheckBox, - sourceField.getPartialName(), - "checkBox", - sourceWidget, - offsetX, - offsetY, - scale, - pageIndex, - fieldNameCounters); - - if (!initialized) { - return; - } - - if (sourceField.isChecked()) { - newCheckBox.check(); - } else { - newCheckBox.unCheck(); - } - - } catch (Exception e) { - log.warn( - "Failed to create checkbox field '{}': {}", - sourceField.getPartialName(), - e.getMessage(), - e); - } - } - - private static void createSimpleRadioButtonField( - PDAcroForm newAcroForm, - PDPage destinationPage, - List destinationAnnotations, - PDRadioButton sourceField, - PDAnnotationWidget sourceWidget, - float offsetX, - float offsetY, - float scale, - int pageIndex, - Map fieldNameCounters) { - - try { - PDRadioButton newRadioButton = new PDRadioButton(newAcroForm); - - boolean initialized = - initializeFieldWithWidget( - newAcroForm, - destinationPage, - destinationAnnotations, - newRadioButton, - sourceField.getPartialName(), - "radioButton", - sourceWidget, - offsetX, - offsetY, - scale, - pageIndex, - fieldNameCounters); - - if (!initialized) { - return; - } - - if (sourceField.getExportValues() != null) { - newRadioButton.setExportValues(sourceField.getExportValues()); - } - if (sourceField.getValue() != null) { - newRadioButton.setValue(sourceField.getValue()); - } - } catch (Exception e) { - log.warn( - "Failed to create radio button field '{}': {}", - sourceField.getPartialName(), - e.getMessage(), - e); - } - } - - private static void createSimpleComboBoxField( - PDAcroForm newAcroForm, - PDPage destinationPage, - List destinationAnnotations, - PDComboBox sourceField, - PDAnnotationWidget sourceWidget, - float offsetX, - float offsetY, - float scale, - int pageIndex, - Map fieldNameCounters) { - - try { - PDComboBox newComboBox = new PDComboBox(newAcroForm); - - boolean initialized = - initializeFieldWithWidget( - newAcroForm, - destinationPage, - destinationAnnotations, - newComboBox, - sourceField.getPartialName(), - "comboBox", - sourceWidget, - offsetX, - offsetY, - scale, - pageIndex, - fieldNameCounters); - - if (!initialized) { - return; - } - - if (sourceField.getOptions() != null) { - newComboBox.setOptions(sourceField.getOptions()); - } - if (sourceField.getValue() != null && !sourceField.getValue().isEmpty()) { - newComboBox.setValue(sourceField.getValue()); - } - } catch (Exception e) { - log.warn( - "Failed to create combo box field '{}': {}", - sourceField.getPartialName(), - e.getMessage(), - e); - } - } - - private static void createSimpleListBoxField( - PDAcroForm newAcroForm, - PDPage destinationPage, - List destinationAnnotations, - PDListBox sourceField, - PDAnnotationWidget sourceWidget, - float offsetX, - float offsetY, - float scale, - int pageIndex, - Map fieldNameCounters) { - - try { - PDListBox newListBox = new PDListBox(newAcroForm); - - boolean initialized = - initializeFieldWithWidget( - newAcroForm, - destinationPage, - destinationAnnotations, - newListBox, - sourceField.getPartialName(), - "listBox", - sourceWidget, - offsetX, - offsetY, - scale, - pageIndex, - fieldNameCounters); - - if (!initialized) { - return; - } - - if (sourceField.getOptions() != null) { - newListBox.setOptions(sourceField.getOptions()); - } - if (sourceField.getValue() != null && !sourceField.getValue().isEmpty()) { - newListBox.setValue(sourceField.getValue()); - } - } catch (Exception e) { - log.warn( - "Failed to create list box field '{}': {}", - sourceField.getPartialName(), - e.getMessage(), - e); - } - } - - private static void createSimpleSignatureField( - PDAcroForm newAcroForm, - PDPage destinationPage, - List destinationAnnotations, - PDSignatureField sourceField, - PDAnnotationWidget sourceWidget, - float offsetX, - float offsetY, - float scale, - int pageIndex, - Map fieldNameCounters) { - - try { - PDSignatureField newSignatureField = new PDSignatureField(newAcroForm); - - boolean initialized = - initializeFieldWithWidget( - newAcroForm, - destinationPage, - destinationAnnotations, - newSignatureField, - sourceField.getPartialName(), - "signature", - sourceWidget, - offsetX, - offsetY, - scale, - pageIndex, - fieldNameCounters); - - if (!initialized) { - return; - } - } catch (Exception e) { - log.warn( - "Failed to create signature field '{}': {}", - sourceField.getPartialName(), - e.getMessage(), - e); - } - } - - private static void createSimplePushButtonField( - PDAcroForm newAcroForm, - PDPage destinationPage, - List destinationAnnotations, - PDPushButton sourceField, - PDAnnotationWidget sourceWidget, - float offsetX, - float offsetY, - float scale, - int pageIndex, - Map fieldNameCounters) { - - try { - PDPushButton newPushButton = new PDPushButton(newAcroForm); - - boolean initialized = - initializeFieldWithWidget( - newAcroForm, - destinationPage, - destinationAnnotations, - newPushButton, - sourceField.getPartialName(), - "pushButton", - sourceWidget, - offsetX, - offsetY, - scale, - pageIndex, - fieldNameCounters); - - } catch (Exception e) { - log.warn( - "Failed to create push button field '{}': {}", - sourceField.getPartialName(), - e.getMessage(), - e); - } - } - - private static boolean initializeFieldWithWidget( - PDAcroForm newAcroForm, - PDPage destinationPage, - List destinationAnnotations, - T newField, - String originalName, - String fallbackName, - PDAnnotationWidget sourceWidget, - float offsetX, - float offsetY, - float scale, - int pageIndex, - Map fieldNameCounters) { - - String baseName = (originalName != null) ? originalName : fallbackName; - String newFieldName = generateUniqueFieldName(baseName, pageIndex, fieldNameCounters); - newField.setPartialName(newFieldName); - - PDAnnotationWidget newWidget = new PDAnnotationWidget(); - PDRectangle sourceRect = sourceWidget.getRectangle(); - if (sourceRect == null) { - return false; - } - - float newX = (sourceRect.getLowerLeftX() * scale) + offsetX; - float newY = (sourceRect.getLowerLeftY() * scale) + offsetY; - float newWidth = sourceRect.getWidth() * scale; - float newHeight = sourceRect.getHeight() * scale; - newWidget.setRectangle(new PDRectangle(newX, newY, newWidth, newHeight)); - newWidget.setPage(destinationPage); - - newField.getWidgets().add(newWidget); - newWidget.setParent(newField); - newAcroForm.getFields().add(newField); - destinationAnnotations.add(newWidget); - return true; - } - - private static String generateUniqueFieldName( - String originalName, int pageIndex, Map fieldNameCounters) { - String baseName = "page" + pageIndex + "_" + originalName; - - Integer counter = fieldNameCounters.get(baseName); - if (counter == null) { - counter = 0; - } else { - counter++; - } - fieldNameCounters.put(baseName, counter); - - return counter == 0 ? baseName : baseName + "_" + counter; - } - - private static Map buildWidgetFieldMap(PDAcroForm acroForm) { - Map map = new HashMap<>(); - if (acroForm == null) { - return map; - } - try { - for (PDField field : acroForm.getFieldTree()) { - List widgets = field.getWidgets(); - if (widgets != null) { - for (PDAnnotationWidget w : widgets) { - if (w != null) { - map.put(w, field); - } - } - } - } - } catch (Exception e) { - log.warn("Failed to build widget->field map: {}", e.getMessage(), e); - } - return map; - } -} diff --git a/app/common/src/main/java/stirling/software/common/util/RegexPatternUtils.java b/app/common/src/main/java/stirling/software/common/util/RegexPatternUtils.java index 8858c99bf..778e42ca4 100644 --- a/app/common/src/main/java/stirling/software/common/util/RegexPatternUtils.java +++ b/app/common/src/main/java/stirling/software/common/util/RegexPatternUtils.java @@ -1,5 +1,6 @@ package stirling.software.common.util; +import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.regex.Pattern; import java.util.regex.PatternSyntaxException; @@ -241,6 +242,11 @@ public final class RegexPatternUtils { return getPattern("\\s+"); } + /** Pattern for matching punctuation characters */ + public Pattern getPunctuationPattern() { + return getPattern("[\\p{Punct}]+"); + } + /** Pattern for matching newlines (Windows and Unix style) */ public Pattern getNewlinesPattern() { return getPattern("\\r?\\n"); @@ -286,6 +292,24 @@ public final class RegexPatternUtils { return getPattern("[^a-zA-Z0-9 ]"); } + /** Pattern for removing bracketed indices like [0], [Child], etc. in field names */ + public Pattern getFormFieldBracketPattern() { + return getPattern("\\[[^\\]]*\\]"); + } + + /** Pattern that replaces underscores or hyphens with spaces */ + public Pattern getUnderscoreHyphenPattern() { + return getPattern("[-_]+"); + } + + /** + * Pattern that matches camelCase or alpha-numeric boundaries to allow inserting spaces. + * Examples: firstName -> first Name, field1 -> field 1, A5Size -> A5 Size + */ + public Pattern getCamelCaseBoundaryPattern() { + return getPattern("(?<=[a-z])(?=[A-Z])|(?<=[A-Za-z])(?=\\d)|(?<=\\d)(?=[A-Za-z])"); + } + /** Pattern for removing angle brackets */ public Pattern getAngleBracketsPattern() { return getPattern("[<>]"); @@ -335,6 +359,26 @@ public final class RegexPatternUtils { return getPattern("[1-9][0-9]{0,2}"); } + /** + * Pattern for very simple generic field tokens such as "field", "text", "checkbox" with + * optional numeric suffix (e.g. "field 1"). Case-insensitive. + */ + public Pattern getGenericFieldNamePattern() { + return getPattern( + "^(field|text|checkbox|radio|button|signature|name|value|option|select|choice)(\\s*\\d+)?$", + Pattern.CASE_INSENSITIVE); + } + + /** Pattern for short identifiers like t1, f2, a10 etc. */ + public Pattern getSimpleFormFieldPattern() { + return getPattern("^[A-Za-z]{1,2}\\s*\\d{1,3}$"); + } + + /** Pattern for optional leading 't' followed by digits, e.g., t1, 1, t 12. */ + public Pattern getOptionalTNumericPattern() { + return getPattern("^(?:t\\s*)?\\d+$", Pattern.CASE_INSENSITIVE); + } + /** Pattern for validating mathematical expressions */ public Pattern getMathExpressionPattern() { return getPattern("[0-9n+\\-*/() ]+"); @@ -467,6 +511,11 @@ public final class RegexPatternUtils { return getPattern("/"); } + /** Supported logical types when creating new fields programmatically */ + public Set getSupportedNewFieldTypes() { + return Set.of("text", "checkbox", "combobox", "listbox", "radio", "button", "signature"); + } + /** * Pre-compile commonly used patterns for immediate availability. This eliminates first-call * compilation overhead for frequent patterns. diff --git a/app/core/src/main/java/stirling/software/SPDF/config/InitialSetup.java b/app/core/src/main/java/stirling/software/SPDF/config/InitialSetup.java index 2d261c660..0a63a6f48 100644 --- a/app/core/src/main/java/stirling/software/SPDF/config/InitialSetup.java +++ b/app/core/src/main/java/stirling/software/SPDF/config/InitialSetup.java @@ -28,6 +28,8 @@ public class InitialSetup { private final ApplicationProperties applicationProperties; + private static boolean isNewServer = false; + @PostConstruct public void init() throws IOException { initUUIDKey(); @@ -88,6 +90,13 @@ public class InitialSetup { } public void initSetAppVersion() throws IOException { + // Check if this is a new server before setting the version + String existingVersion = applicationProperties.getAutomaticallyGenerated().getAppVersion(); + isNewServer = + existingVersion == null + || existingVersion.isEmpty() + || existingVersion.equals("0.0.0"); + String appVersion = "0.0.0"; Resource resource = new ClassPathResource("version.properties"); Properties props = new Properties(); @@ -99,4 +108,8 @@ public class InitialSetup { GeneralUtils.saveKeyToSettings("AutomaticallyGenerated.appVersion", appVersion); applicationProperties.getAutomaticallyGenerated().setAppVersion(appVersion); } + + public static boolean isNewServer() { + return isNewServer; + } } diff --git a/app/core/src/main/java/stirling/software/SPDF/controller/api/MultiPageLayoutController.java b/app/core/src/main/java/stirling/software/SPDF/controller/api/MultiPageLayoutController.java index 40301c63e..1cf33e730 100644 --- a/app/core/src/main/java/stirling/software/SPDF/controller/api/MultiPageLayoutController.java +++ b/app/core/src/main/java/stirling/software/SPDF/controller/api/MultiPageLayoutController.java @@ -26,7 +26,6 @@ import stirling.software.SPDF.model.api.general.MergeMultiplePagesRequest; import stirling.software.common.annotations.AutoJobPostMapping; import stirling.software.common.annotations.api.GeneralApi; import stirling.software.common.service.CustomPDFDocumentFactory; -import stirling.software.common.util.FormUtils; import stirling.software.common.util.GeneralUtils; import stirling.software.common.util.WebResponseUtils; @@ -137,26 +136,6 @@ public class MultiPageLayoutController { contentStream.close(); - // If any source page is rotated, skip form copying/transformation entirely - boolean hasRotation = FormUtils.hasAnyRotatedPage(sourceDocument); - if (hasRotation) { - log.info("Source document has rotated pages; skipping form field copying."); - } else { - try { - FormUtils.copyAndTransformFormFields( - sourceDocument, - newDocument, - totalPages, - pagesPerSheet, - cols, - rows, - cellWidth, - cellHeight); - } catch (Exception e) { - log.warn("Failed to copy and transform form fields: {}", e.getMessage(), e); - } - } - sourceDocument.close(); ByteArrayOutputStream baos = new ByteArrayOutputStream(); diff --git a/app/core/src/main/java/stirling/software/SPDF/controller/api/misc/ConfigController.java b/app/core/src/main/java/stirling/software/SPDF/controller/api/misc/ConfigController.java index b578d7c42..02b5233b8 100644 --- a/app/core/src/main/java/stirling/software/SPDF/controller/api/misc/ConfigController.java +++ b/app/core/src/main/java/stirling/software/SPDF/controller/api/misc/ConfigController.java @@ -11,6 +11,7 @@ import org.springframework.web.bind.annotation.RequestParam; import io.swagger.v3.oas.annotations.Hidden; import stirling.software.SPDF.config.EndpointConfiguration; +import stirling.software.SPDF.config.InitialSetup; import stirling.software.common.annotations.api.ConfigApi; import stirling.software.common.configuration.AppConfig; import stirling.software.common.model.ApplicationProperties; @@ -78,6 +79,22 @@ public class ConfigController { } configData.put("isAdmin", isAdmin); + // Check if this is a new server (version was 0.0.0 before initialization) + configData.put("isNewServer", InitialSetup.isNewServer()); + + // Check if the current user is a first-time user + boolean isNewUser = + false; // Default to false when security is disabled or user not found + if (userService != null) { + try { + isNewUser = userService.isCurrentUserFirstLogin(); + } catch (Exception e) { + // If there's an error, assume not new user for safety + isNewUser = false; + } + } + configData.put("isNewUser", isNewUser); + // System settings configData.put( "enableAlphaFunctionality", diff --git a/app/core/src/main/resources/static/css/theme/theme.css b/app/core/src/main/resources/static/css/theme/theme.css index e1ef98c83..70958b0eb 100644 --- a/app/core/src/main/resources/static/css/theme/theme.css +++ b/app/core/src/main/resources/static/css/theme/theme.css @@ -7,6 +7,8 @@ --md-sys-color-surface-3: color-mix(in srgb, var(--md-sys-color-primary) 13%, rgba(0, 0, 255, 0.11) 5%); --md-sys-color-surface-4: color-mix(in srgb, var(--md-sys-color-primary) 13%, rgba(0, 0, 255, 0.12) 5%); --md-sys-color-surface-5: color-mix(in srgb, var(--md-sys-color-primary) 13%, rgba(0, 0, 255, 0.14) 5%); + /* Clear button disabled text color (default/light) */ + --spdf-clear-disabled-text: var(--md-sys-color-primary); /* Icon fill */ --md-sys-icon-fill-0: 'FILL' 0, 'wght' 500; --md-sys-icon-fill-1: 'FILL' 1, 'wght' 500; @@ -25,6 +27,12 @@ --md-sys-elevation-5: 0px 8px 10px -6px rgb(var(--md-elevation-shadow-color), 0.2), 0px 16px 24px 2px rgb(var(--md-elevation-shadow-color), 0.14), 0px 6px 30px 5px rgb(var(--md-elevation-shadow-color), 0.12); } +/* Dark theme overrides */ +.dark-theme { + /* In dark mode, use a neutral grey for disabled Clear button text */ + --spdf-clear-disabled-text: var(--mantine-color-gray-5, #9e9e9e); +} + .fill { font-variation-settings: var(--md-sys-icon-fill-1); } diff --git a/app/proprietary/src/main/java/stirling/software/proprietary/controller/api/form/FormFillController.java b/app/proprietary/src/main/java/stirling/software/proprietary/controller/api/form/FormFillController.java new file mode 100644 index 000000000..ddc7048bd --- /dev/null +++ b/app/proprietary/src/main/java/stirling/software/proprietary/controller/api/form/FormFillController.java @@ -0,0 +1,215 @@ +package stirling.software.proprietary.controller.api.form; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.util.List; +import java.util.Map; + +import org.apache.pdfbox.pdmodel.PDDocument; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RequestPart; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; + +import com.fasterxml.jackson.databind.ObjectMapper; + +import io.github.pixee.security.Filenames; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.tags.Tag; + +import lombok.RequiredArgsConstructor; + +import stirling.software.common.service.CustomPDFDocumentFactory; +import stirling.software.common.util.ExceptionUtils; +import stirling.software.common.util.WebResponseUtils; +import stirling.software.proprietary.util.FormUtils; + +@RestController +@RequestMapping("/api/v1/form") +@Tag(name = "Forms", description = "PDF form APIs") +@RequiredArgsConstructor +public class FormFillController { + + private final CustomPDFDocumentFactory pdfDocumentFactory; + private final ObjectMapper objectMapper; + + private static ResponseEntity saveDocument(PDDocument document, String baseName) + throws IOException { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + document.save(baos); + return WebResponseUtils.bytesToWebResponse(baos.toByteArray(), baseName + ".pdf"); + } + + private static String buildBaseName(MultipartFile file, String suffix) { + String original = Filenames.toSimpleFileName(file.getOriginalFilename()); + if (original == null || original.isBlank()) { + original = "document"; + } + if (!original.toLowerCase().endsWith(".pdf")) { + return original + "_" + suffix; + } + String withoutExtension = original.substring(0, original.length() - 4); + return withoutExtension + "_" + suffix; + } + + private static void requirePdf(MultipartFile file) { + if (file == null || file.isEmpty()) { + throw ExceptionUtils.createIllegalArgumentException( + "error.fileFormatRequired", "{0} must be in PDF format", "file"); + } + } + + private static String decodePart(byte[] payload) { + if (payload == null || payload.length == 0) { + return null; + } + return new String(payload, StandardCharsets.UTF_8); + } + + @PostMapping(value = "/fields", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) + @Operation( + summary = "Inspect PDF form fields", + description = "Returns metadata describing each field in the provided PDF form") + public ResponseEntity listFields( + @Parameter( + description = "The input PDF file", + required = true, + content = + @Content( + mediaType = MediaType.APPLICATION_PDF_VALUE, + schema = @Schema(type = "string", format = "binary"))) + @RequestParam("file") + MultipartFile file) + throws IOException { + + requirePdf(file); + try (PDDocument document = pdfDocumentFactory.load(file, true)) { + FormUtils.FormFieldExtraction extraction = + FormUtils.extractFieldsWithTemplate(document); + return ResponseEntity.ok(extraction); + } + } + + @PostMapping(value = "/modify-fields", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) + @Operation( + summary = "Modify existing form fields", + description = + "Updates existing fields in the provided PDF and returns the updated file") + public ResponseEntity modifyFields( + @Parameter( + description = "The input PDF file", + required = true, + content = + @Content( + mediaType = MediaType.APPLICATION_PDF_VALUE, + schema = @Schema(type = "string", format = "binary"))) + @RequestParam("file") + MultipartFile file, + @RequestPart(value = "updates", required = false) byte[] updatesPayload) + throws IOException { + + String rawUpdates = decodePart(updatesPayload); + List modifications = + FormPayloadParser.parseModificationDefinitions(objectMapper, rawUpdates); + if (modifications.isEmpty()) { + throw ExceptionUtils.createIllegalArgumentException( + "error.dataRequired", + "{0} must contain at least one definition", + "updates payload"); + } + + return processSingleFile( + file, "updated", document -> FormUtils.modifyFormFields(document, modifications)); + } + + @PostMapping(value = "/delete-fields", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) + @Operation( + summary = "Delete form fields", + description = "Removes the specified fields from the PDF and returns the updated file") + public ResponseEntity deleteFields( + @Parameter( + description = "The input PDF file", + required = true, + content = + @Content( + mediaType = MediaType.APPLICATION_PDF_VALUE, + schema = @Schema(type = "string", format = "binary"))) + @RequestParam("file") + MultipartFile file, + @Parameter( + description = + "JSON array of field names or objects with a name property," + + " matching the /fields response format", + example = "[{\"name\":\"Field1\"}]") + @RequestPart(value = "names", required = false) + byte[] namesPayload) + throws IOException { + + String rawNames = decodePart(namesPayload); + List names = FormPayloadParser.parseNameList(objectMapper, rawNames); + if (names.isEmpty()) { + throw ExceptionUtils.createIllegalArgumentException( + "error.dataRequired", "{0} must contain at least one value", "names payload"); + } + + return processSingleFile( + file, "updated", document -> FormUtils.deleteFormFields(document, names)); + } + + @PostMapping(value = "/fill", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) + @Operation( + summary = "Fill PDF form fields", + description = + "Populates the supplied PDF form using values from the provided JSON payload" + + " and returns the filled PDF") + public ResponseEntity fillForm( + @Parameter( + description = "The input PDF file", + required = true, + content = + @Content( + mediaType = MediaType.APPLICATION_PDF_VALUE, + schema = @Schema(type = "string", format = "binary"))) + @RequestParam("file") + MultipartFile file, + @Parameter( + description = "JSON object of field-value pairs to apply", + example = "{\"field\":\"value\"}") + @RequestPart(value = "data", required = false) + byte[] valuesPayload, + @RequestParam(value = "flatten", defaultValue = "false") boolean flatten) + throws IOException { + + String rawValues = decodePart(valuesPayload); + Map values = FormPayloadParser.parseValueMap(objectMapper, rawValues); + + return processSingleFile( + file, + "filled", + document -> FormUtils.applyFieldValues(document, values, flatten, true)); + } + + private ResponseEntity processSingleFile( + MultipartFile file, String suffix, DocumentProcessor processor) throws IOException { + requirePdf(file); + + String baseName = buildBaseName(file, suffix); + try (PDDocument document = pdfDocumentFactory.load(file)) { + processor.accept(document); + return saveDocument(document, baseName); + } + } + + @FunctionalInterface + private interface DocumentProcessor { + void accept(PDDocument document) throws IOException; + } +} diff --git a/app/proprietary/src/main/java/stirling/software/proprietary/controller/api/form/FormPayloadParser.java b/app/proprietary/src/main/java/stirling/software/proprietary/controller/api/form/FormPayloadParser.java new file mode 100644 index 000000000..2efffb21d --- /dev/null +++ b/app/proprietary/src/main/java/stirling/software/proprietary/controller/api/form/FormPayloadParser.java @@ -0,0 +1,295 @@ +package stirling.software.proprietary.controller.api.form; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; + +import stirling.software.common.util.ExceptionUtils; +import stirling.software.proprietary.util.FormUtils; + +final class FormPayloadParser { + + private static final String KEY_FIELDS = "fields"; + private static final String KEY_NAME = "name"; + private static final String KEY_TARGET_NAME = "targetName"; + private static final String KEY_FIELD_NAME = "fieldName"; + private static final String KEY_FIELD = "field"; + private static final String KEY_VALUE = "value"; + private static final String KEY_DEFAULT_VALUE = "defaultValue"; + + private static final TypeReference> MAP_TYPE = new TypeReference<>() {}; + private static final TypeReference> + MODIFY_FIELD_LIST_TYPE = new TypeReference<>() {}; + private static final TypeReference> STRING_LIST_TYPE = new TypeReference<>() {}; + + private FormPayloadParser() {} + + static Map parseValueMap(ObjectMapper objectMapper, String json) + throws IOException { + if (json == null || json.isBlank()) { + return Map.of(); + } + + JsonNode root; + try { + root = objectMapper.readTree(json); + } catch (IOException e) { + // Fallback to legacy direct map parse (will throw again if invalid) + return objectMapper.readValue(json, MAP_TYPE); + } + if (root == null || root.isNull()) { + return Map.of(); + } + + // 1. If payload already a flat object with no special wrapping, keep legacy behavior + if (root.isObject()) { + // a) Prefer explicit 'template' object if present (new combined /fields response) + JsonNode templateNode = root.get("template"); + if (templateNode != null && templateNode.isObject()) { + return objectToLinkedMap(templateNode); + } + // b) Accept an inline 'fields' array of field definitions (build map from them) + JsonNode fieldsNode = root.get(KEY_FIELDS); + if (fieldsNode != null && fieldsNode.isArray()) { + Map record = extractFieldInfoArray(fieldsNode); + if (!record.isEmpty()) { + return record; + } + } + // c) Fallback: treat entire object as the value map (legacy behavior) + return objectToLinkedMap(root); + } + + // 2. If an array was supplied to /fill (non-standard), treat first element as record + if (root.isArray()) { + if (root.isEmpty()) { + return Map.of(); + } + JsonNode first = root.get(0); + if (first != null && first.isObject()) { + if (first.has(KEY_NAME) || first.has(KEY_VALUE) || first.has(KEY_DEFAULT_VALUE)) { + return extractFieldInfoArray(root); + } + return objectToLinkedMap(first); + } + return Map.of(); + } + + // 3. Anything else: fallback to strict map parse + return objectMapper.readValue(json, MAP_TYPE); + } + + static List parseModificationDefinitions( + ObjectMapper objectMapper, String json) throws IOException { + if (json == null || json.isBlank()) { + return List.of(); + } + return objectMapper.readValue(json, MODIFY_FIELD_LIST_TYPE); + } + + static List parseNameList(ObjectMapper objectMapper, String json) throws IOException { + if (json == null || json.isBlank()) { + return List.of(); + } + + final JsonNode root = objectMapper.readTree(json); + if (root == null || root.isNull()) { + return List.of(); + } + + final Set names = new LinkedHashSet<>(); + + if (root.isArray()) { + collectNames(root, names); + } else if (root.isObject()) { + if (root.has(KEY_FIELDS) && root.get(KEY_FIELDS).isArray()) { + collectNames(root.get(KEY_FIELDS), names); + } else { + final String single = extractName(root); + if (nonBlank(single)) { + names.add(single); + } + } + } else if (root.isTextual()) { + final String single = trimToNull(root.asText()); + if (single != null) { + names.add(single); + } + } + + if (!names.isEmpty()) { + return List.copyOf(names); + } + + try { + return objectMapper.readValue(json, STRING_LIST_TYPE); + } catch (IOException e) { + throw ExceptionUtils.createIllegalArgumentException( + "error.invalidFormat", + "Invalid {0} format: {1}", + "names payload", + "expected array of strings or objects with 'name'-like properties"); + } + } + + private static Map extractFieldInfoArray(JsonNode fieldsNode) { + final Map record = new LinkedHashMap<>(); + if (fieldsNode == null || fieldsNode.isNull() || !fieldsNode.isArray()) { + return record; + } + + for (JsonNode fieldNode : fieldsNode) { + if (fieldNode == null || !fieldNode.isObject()) { + continue; + } + + final String name = extractName(fieldNode); + if (!nonBlank(name)) { + continue; + } + + JsonNode valueNode = fieldNode.get(KEY_VALUE); + if ((valueNode == null || valueNode.isNull()) + && fieldNode.hasNonNull(KEY_DEFAULT_VALUE)) { + valueNode = fieldNode.get(KEY_DEFAULT_VALUE); + } + + final String normalized = normalizeFieldValue(valueNode); + record.put(name, normalized == null ? "" : normalized); + } + + return record; + } + + private static String normalizeFieldValue(JsonNode valueNode) { + if (valueNode == null || valueNode.isNull()) { + return null; + } + + if (valueNode.isArray()) { + final List values = new ArrayList<>(); + for (JsonNode element : valueNode) { + final String text = coerceScalarToString(element); + if (text != null) { + values.add(text); + } + } + return String.join(",", values); + } + + if (valueNode.isObject()) { + // Preserve object as JSON string + return valueNode.toString(); + } + + // Scalar (text/number/boolean) + return coerceScalarToString(valueNode); + } + + private static String coerceScalarToString(JsonNode node) { + if (node == null || node.isNull()) { + return null; + } + if (node.isTextual()) { + return trimToEmpty(node.asText()); + } + if (node.isNumber()) { + return node.numberValue().toString(); + } + if (node.isBoolean()) { + return Boolean.toString(node.booleanValue()); + } + // Fallback for other scalar-like nodes + return trimToEmpty(node.asText()); + } + + private static void collectNames(JsonNode arrayNode, Set sink) { + if (arrayNode == null || !arrayNode.isArray()) { + return; + } + for (JsonNode node : arrayNode) { + final String name = extractName(node); + if (nonBlank(name)) { + sink.add(name); + } + } + } + + private static String extractName(JsonNode node) { + if (node == null || node.isNull()) { + return null; + } + + if (node.isTextual()) { + return trimToNull(node.asText()); + } + + if (node.isObject()) { + final String direct = textProperty(node, KEY_NAME, KEY_TARGET_NAME, KEY_FIELD_NAME); + if (nonBlank(direct)) { + return direct; + } + final JsonNode field = node.get(KEY_FIELD); + if (field != null && field.isObject()) { + final String nested = + textProperty(field, KEY_NAME, KEY_TARGET_NAME, KEY_FIELD_NAME); + if (nonBlank(nested)) { + return nested; + } + } + } + + return null; + } + + private static String textProperty(JsonNode node, String... keys) { + for (String key : keys) { + final JsonNode valueNode = node.get(key); + final String value = coerceScalarToString(valueNode); + if (nonBlank(value)) { + return value; + } + } + return null; + } + + private static Map objectToLinkedMap(JsonNode objectNode) { + final Map result = new LinkedHashMap<>(); + objectNode + .fieldNames() + .forEachRemaining( + key -> { + final JsonNode v = objectNode.get(key); + if (v == null || v.isNull()) { + result.put(key, null); + } else if (v.isTextual() || v.isNumber() || v.isBoolean()) { + result.put(key, coerceScalarToString(v)); + } else { + result.put(key, v.toString()); + } + }); + return result; + } + + private static boolean nonBlank(String s) { + return s != null && !s.isBlank(); + } + + private static String trimToNull(String s) { + if (s == null) return null; + final String t = s.trim(); + return t.isEmpty() ? null : t; + } + + private static String trimToEmpty(String s) { + return s == null ? "" : s.trim(); + } +} diff --git a/app/proprietary/src/main/java/stirling/software/proprietary/security/controller/api/UserController.java b/app/proprietary/src/main/java/stirling/software/proprietary/security/controller/api/UserController.java index 92a1f82ac..9f2ce9456 100644 --- a/app/proprietary/src/main/java/stirling/software/proprietary/security/controller/api/UserController.java +++ b/app/proprietary/src/main/java/stirling/software/proprietary/security/controller/api/UserController.java @@ -742,4 +742,31 @@ public class UserController { return errorMessage; } } + + @PostMapping("/complete-initial-setup") + public ResponseEntity completeInitialSetup() { + try { + String username = userService.getCurrentUsername(); + if (username == null) { + return ResponseEntity.status(HttpStatus.UNAUTHORIZED) + .body("User not authenticated"); + } + + Optional userOpt = userService.findByUsernameIgnoreCase(username); + if (userOpt.isEmpty()) { + return ResponseEntity.status(HttpStatus.NOT_FOUND).body("User not found"); + } + + User user = userOpt.get(); + user.setHasCompletedInitialSetup(true); + userRepository.save(user); + + log.info("User {} completed initial setup", username); + return ResponseEntity.ok().body(Map.of("success", true)); + } catch (Exception e) { + log.error("Error completing initial setup", e); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) + .body("Failed to complete initial setup"); + } + } } diff --git a/app/proprietary/src/main/java/stirling/software/proprietary/security/model/User.java b/app/proprietary/src/main/java/stirling/software/proprietary/security/model/User.java index 02bd08a5b..8f64d3187 100644 --- a/app/proprietary/src/main/java/stirling/software/proprietary/security/model/User.java +++ b/app/proprietary/src/main/java/stirling/software/proprietary/security/model/User.java @@ -56,6 +56,9 @@ public class User implements UserDetails, Serializable { @Column(name = "isFirstLogin") private Boolean isFirstLogin = false; + @Column(name = "hasCompletedInitialSetup") + private Boolean hasCompletedInitialSetup = false; + @Column(name = "roleName") private String roleName; @@ -103,6 +106,14 @@ public class User implements UserDetails, Serializable { this.isFirstLogin = isFirstLogin; } + public boolean hasCompletedInitialSetup() { + return hasCompletedInitialSetup != null && hasCompletedInitialSetup; + } + + public void setHasCompletedInitialSetup(boolean hasCompletedInitialSetup) { + this.hasCompletedInitialSetup = hasCompletedInitialSetup; + } + public void setAuthenticationType(AuthenticationType authenticationType) { this.authenticationType = authenticationType.toString().toLowerCase(); } diff --git a/app/proprietary/src/main/java/stirling/software/proprietary/security/service/UserService.java b/app/proprietary/src/main/java/stirling/software/proprietary/security/service/UserService.java index d13fcc0cd..4772368f8 100644 --- a/app/proprietary/src/main/java/stirling/software/proprietary/security/service/UserService.java +++ b/app/proprietary/src/main/java/stirling/software/proprietary/security/service/UserService.java @@ -663,6 +663,21 @@ public class UserService implements UserServiceInterface { return false; } + public boolean isCurrentUserFirstLogin() { + try { + String username = getCurrentUsername(); + if (username != null) { + Optional userOpt = findByUsernameIgnoreCase(username); + if (userOpt.isPresent()) { + return !userOpt.get().hasCompletedInitialSetup(); + } + } + } catch (Exception e) { + log.debug("Error checking first login status", e); + } + return false; + } + @Transactional public void syncCustomApiUser(String customApiKey) { if (customApiKey == null || customApiKey.trim().isBlank()) { diff --git a/app/proprietary/src/main/java/stirling/software/proprietary/util/FormCopyUtils.java b/app/proprietary/src/main/java/stirling/software/proprietary/util/FormCopyUtils.java new file mode 100644 index 000000000..c27a2ab2b --- /dev/null +++ b/app/proprietary/src/main/java/stirling/software/proprietary/util/FormCopyUtils.java @@ -0,0 +1,345 @@ +package stirling.software.proprietary.util; + +import java.io.IOException; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; + +import org.apache.pdfbox.cos.COSName; +import org.apache.pdfbox.pdmodel.PDDocument; +import org.apache.pdfbox.pdmodel.PDDocumentCatalog; +import org.apache.pdfbox.pdmodel.PDPage; +import org.apache.pdfbox.pdmodel.PDResources; +import org.apache.pdfbox.pdmodel.common.PDRectangle; +import org.apache.pdfbox.pdmodel.font.PDType1Font; +import org.apache.pdfbox.pdmodel.font.Standard14Fonts; +import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotation; +import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotationWidget; +import org.apache.pdfbox.pdmodel.interactive.form.PDAcroForm; +import org.apache.pdfbox.pdmodel.interactive.form.PDField; +import org.apache.pdfbox.pdmodel.interactive.form.PDTerminalField; + +import lombok.experimental.UtilityClass; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@UtilityClass +public class FormCopyUtils { + + public boolean hasAnyRotatedPage(PDDocument document) { + try { + for (PDPage page : document.getPages()) { + int rot = page.getRotation(); + int norm = ((rot % 360) + 360) % 360; + if (norm != 0) { + return true; + } + } + } catch (Exception e) { + log.warn("Failed to inspect page rotations: {}", e.getMessage(), e); + } + return false; + } + + public void copyAndTransformFormFields( + PDDocument sourceDocument, + PDDocument newDocument, + int totalPages, + int pagesPerSheet, + int cols, + int rows, + float cellWidth, + float cellHeight) + throws IOException { + + PDDocumentCatalog sourceCatalog = sourceDocument.getDocumentCatalog(); + PDAcroForm sourceAcroForm = sourceCatalog.getAcroForm(); + + if (sourceAcroForm == null || sourceAcroForm.getFields().isEmpty()) { + return; + } + + PDDocumentCatalog newCatalog = newDocument.getDocumentCatalog(); + PDAcroForm newAcroForm = new PDAcroForm(newDocument); + newCatalog.setAcroForm(newAcroForm); + + PDResources dr = new PDResources(); + PDType1Font helvetica = new PDType1Font(Standard14Fonts.FontName.HELVETICA); + PDType1Font zapfDingbats = new PDType1Font(Standard14Fonts.FontName.ZAPF_DINGBATS); + dr.put(COSName.getPDFName("Helv"), helvetica); + dr.put(COSName.getPDFName("ZaDb"), zapfDingbats); + newAcroForm.setDefaultResources(dr); + newAcroForm.setDefaultAppearance("/Helv 12 Tf 0 g"); + + // Temporarily set NeedAppearances to true during field creation + newAcroForm.setNeedAppearances(true); + + Map fieldNameCounters = new HashMap<>(); + + // Build widget -> field map once for efficient lookups + Map widgetFieldMap = buildWidgetFieldMap(sourceAcroForm); + + for (int pageIndex = 0; pageIndex < totalPages; pageIndex++) { + PDPage sourcePage = sourceDocument.getPage(pageIndex); + List annotations = sourcePage.getAnnotations(); + + if (annotations.isEmpty()) { + continue; + } + + int destinationPageIndex = pageIndex / pagesPerSheet; + int adjustedPageIndex = pageIndex % pagesPerSheet; + int rowIndex = adjustedPageIndex / cols; + int colIndex = adjustedPageIndex % cols; + + if (rowIndex >= rows) { + continue; + } + + if (destinationPageIndex >= newDocument.getNumberOfPages()) { + continue; + } + + PDPage destinationPage = newDocument.getPage(destinationPageIndex); + PDRectangle sourceRect = sourcePage.getMediaBox(); + + float scaleWidth = cellWidth / sourceRect.getWidth(); + float scaleHeight = cellHeight / sourceRect.getHeight(); + float scale = Math.min(scaleWidth, scaleHeight); + + float x = colIndex * cellWidth + (cellWidth - sourceRect.getWidth() * scale) / 2; + float y = + destinationPage.getMediaBox().getHeight() + - ((rowIndex + 1) * cellHeight + - (cellHeight - sourceRect.getHeight() * scale) / 2); + + copyBasicFormFields( + sourceAcroForm, + newAcroForm, + sourcePage, + destinationPage, + x, + y, + scale, + pageIndex, + fieldNameCounters, + widgetFieldMap); + } + + // Generate appearance streams and embed them authoritatively + boolean appearancesGenerated = false; + try { + newAcroForm.refreshAppearances(); + appearancesGenerated = true; + } catch (NoSuchMethodError nsme) { + log.warn( + "AcroForm.refreshAppearances() not available in this PDFBox version; " + + "leaving NeedAppearances=true for viewer-side rendering."); + } catch (Exception t) { + log.warn( + "Failed to refresh field appearances via AcroForm: {}. " + + "Leaving NeedAppearances=true as fallback.", + t.getMessage(), + t); + } + + // After successful appearance generation, set NeedAppearances to false + // to signal that appearance streams are now embedded authoritatively + if (appearancesGenerated) { + try { + newAcroForm.setNeedAppearances(false); + } catch (Exception e) { + log.debug( + "Failed to set NeedAppearances to false: {}. " + + "Appearances were generated but flag could not be updated.", + e.getMessage()); + } + } + } + + private void copyBasicFormFields( + PDAcroForm sourceAcroForm, + PDAcroForm newAcroForm, + PDPage sourcePage, + PDPage destinationPage, + float offsetX, + float offsetY, + float scale, + int pageIndex, + Map fieldNameCounters, + Map widgetFieldMap) { + + try { + List sourceAnnotations = sourcePage.getAnnotations(); + List destinationAnnotations = destinationPage.getAnnotations(); + + for (PDAnnotation annotation : sourceAnnotations) { + if (annotation instanceof PDAnnotationWidget widgetAnnotation) { + if (widgetAnnotation.getRectangle() == null) { + continue; + } + PDField sourceField = + widgetFieldMap != null ? widgetFieldMap.get(widgetAnnotation) : null; + if (sourceField == null) { + continue; // skip widgets without a matching field + } + if (!(sourceField instanceof PDTerminalField terminalField)) { + continue; + } + + FormFieldTypeSupport handler = FormFieldTypeSupport.forField(terminalField); + if (handler == null) { + log.debug( + "Skipping unsupported field type '{}' for widget '{}'", + sourceField.getClass().getSimpleName(), + Optional.ofNullable(sourceField.getFullyQualifiedName()) + .orElseGet(sourceField::getPartialName)); + continue; + } + + copyFieldUsingHandler( + handler, + terminalField, + newAcroForm, + destinationPage, + destinationAnnotations, + widgetAnnotation, + offsetX, + offsetY, + scale, + pageIndex, + fieldNameCounters); + } + } + } catch (Exception e) { + log.warn( + "Failed to copy basic form fields for page {}: {}", + pageIndex, + e.getMessage(), + e); + } + } + + private void copyFieldUsingHandler( + FormFieldTypeSupport handler, + PDTerminalField sourceField, + PDAcroForm newAcroForm, + PDPage destinationPage, + List destinationAnnotations, + PDAnnotationWidget sourceWidget, + float offsetX, + float offsetY, + float scale, + int pageIndex, + Map fieldNameCounters) { + + try { + PDTerminalField newField = handler.createField(newAcroForm); + boolean initialized = + initializeFieldWithWidget( + newAcroForm, + destinationPage, + destinationAnnotations, + newField, + sourceField.getPartialName(), + handler.fallbackWidgetName(), + sourceWidget, + offsetX, + offsetY, + scale, + pageIndex, + fieldNameCounters); + + if (!initialized) { + return; + } + + handler.copyFromOriginal(sourceField, newField); + } catch (Exception e) { + log.warn( + "Failed to copy {} field '{}': {}", + handler.typeName(), + Optional.ofNullable(sourceField.getFullyQualifiedName()) + .orElseGet(sourceField::getPartialName), + e.getMessage(), + e); + } + } + + private boolean initializeFieldWithWidget( + PDAcroForm newAcroForm, + PDPage destinationPage, + List destinationAnnotations, + T newField, + String originalName, + String fallbackName, + PDAnnotationWidget sourceWidget, + float offsetX, + float offsetY, + float scale, + int pageIndex, + Map fieldNameCounters) { + + String baseName = (originalName != null) ? originalName : fallbackName; + String newFieldName = generateUniqueFieldName(baseName, pageIndex, fieldNameCounters); + newField.setPartialName(newFieldName); + + PDAnnotationWidget newWidget = new PDAnnotationWidget(); + PDRectangle sourceRect = sourceWidget.getRectangle(); + if (sourceRect == null) { + return false; + } + + float newX = (sourceRect.getLowerLeftX() * scale) + offsetX; + float newY = (sourceRect.getLowerLeftY() * scale) + offsetY; + float newWidth = sourceRect.getWidth() * scale; + float newHeight = sourceRect.getHeight() * scale; + newWidget.setRectangle(new PDRectangle(newX, newY, newWidth, newHeight)); + newWidget.setPage(destinationPage); + + newField.getWidgets().add(newWidget); + newWidget.setParent(newField); + newAcroForm.getFields().add(newField); + destinationAnnotations.add(newWidget); + return true; + } + + private String generateUniqueFieldName( + String originalName, int pageIndex, Map fieldNameCounters) { + String baseName = "page" + pageIndex + "_" + originalName; + + Integer counter = fieldNameCounters.get(baseName); + if (counter == null) { + counter = 0; + } else { + counter++; + } + fieldNameCounters.put(baseName, counter); + + return counter == 0 ? baseName : baseName + "_" + counter; + } + + private Map buildWidgetFieldMap(PDAcroForm acroForm) { + Map map = new HashMap<>(); + if (acroForm == null) { + return map; + } + try { + for (PDField field : acroForm.getFieldTree()) { + List widgets = field.getWidgets(); + if (widgets == null) { + continue; + } + for (PDAnnotationWidget widget : widgets) { + if (widget != null) { + map.put(widget, field); + } + } + } + } catch (Exception e) { + log.warn("Failed to build widget->field map: {}", e.getMessage(), e); + } + return map; + } +} diff --git a/app/proprietary/src/main/java/stirling/software/proprietary/util/FormFieldTypeSupport.java b/app/proprietary/src/main/java/stirling/software/proprietary/util/FormFieldTypeSupport.java new file mode 100644 index 000000000..4f1c1e0d8 --- /dev/null +++ b/app/proprietary/src/main/java/stirling/software/proprietary/util/FormFieldTypeSupport.java @@ -0,0 +1,368 @@ +package stirling.software.proprietary.util; + +import java.io.IOException; +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.function.Function; +import java.util.stream.Collectors; + +import org.apache.pdfbox.cos.COSName; +import org.apache.pdfbox.pdmodel.graphics.color.PDColor; +import org.apache.pdfbox.pdmodel.graphics.color.PDDeviceRGB; +import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotationWidget; +import org.apache.pdfbox.pdmodel.interactive.annotation.PDAppearanceCharacteristicsDictionary; +import org.apache.pdfbox.pdmodel.interactive.form.PDAcroForm; +import org.apache.pdfbox.pdmodel.interactive.form.PDCheckBox; +import org.apache.pdfbox.pdmodel.interactive.form.PDChoice; +import org.apache.pdfbox.pdmodel.interactive.form.PDComboBox; +import org.apache.pdfbox.pdmodel.interactive.form.PDField; +import org.apache.pdfbox.pdmodel.interactive.form.PDListBox; +import org.apache.pdfbox.pdmodel.interactive.form.PDPushButton; +import org.apache.pdfbox.pdmodel.interactive.form.PDRadioButton; +import org.apache.pdfbox.pdmodel.interactive.form.PDSignatureField; +import org.apache.pdfbox.pdmodel.interactive.form.PDTerminalField; +import org.apache.pdfbox.pdmodel.interactive.form.PDTextField; + +import lombok.extern.slf4j.Slf4j; + +@Slf4j +public enum FormFieldTypeSupport { + TEXT("text", "textField", PDTextField.class) { + @Override + PDTerminalField createField(PDAcroForm acroForm) { + PDTextField textField = new PDTextField(acroForm); + textField.setDefaultAppearance("/Helv 12 Tf 0 g"); + return textField; + } + + @Override + void copyFromOriginal(PDTerminalField source, PDTerminalField target) throws IOException { + PDTextField src = (PDTextField) source; + PDTextField dst = (PDTextField) target; + String value = src.getValueAsString(); + if (value != null) { + dst.setValue(value); + } + } + + @Override + boolean doesNotsupportsDefinitionCreation() { + return false; + } + + @Override + void applyNewFieldDefinition( + PDTerminalField field, + FormUtils.NewFormFieldDefinition definition, + List options) + throws IOException { + PDTextField textField = (PDTextField) field; + String defaultValue = Optional.ofNullable(definition.defaultValue()).orElse(""); + if (!defaultValue.isBlank()) { + FormUtils.setTextValue(textField, defaultValue); + } + } + }, + CHECKBOX("checkbox", "checkBox", PDCheckBox.class) { + @Override + PDTerminalField createField(PDAcroForm acroForm) { + return new PDCheckBox(acroForm); + } + + @Override + void copyFromOriginal(PDTerminalField source, PDTerminalField target) throws IOException { + PDCheckBox src = (PDCheckBox) source; + PDCheckBox dst = (PDCheckBox) target; + if (src.isChecked()) { + dst.check(); + } else { + dst.unCheck(); + } + } + + @Override + boolean doesNotsupportsDefinitionCreation() { + return false; + } + + @Override + void applyNewFieldDefinition( + PDTerminalField field, + FormUtils.NewFormFieldDefinition definition, + List options) + throws IOException { + PDCheckBox checkBox = (PDCheckBox) field; + + if (!options.isEmpty()) { + checkBox.setExportValues(options); + } + + ensureCheckBoxAppearance(checkBox); + + if (FormUtils.isChecked(definition.defaultValue())) { + checkBox.check(); + } else { + checkBox.unCheck(); + } + } + + private static void ensureCheckBoxAppearance(PDCheckBox checkBox) { + try { + if (checkBox.getWidgets().isEmpty()) { + return; + } + + PDAnnotationWidget widget = checkBox.getWidgets().get(0); + + PDAppearanceCharacteristicsDictionary appearanceChars = + widget.getAppearanceCharacteristics(); + if (appearanceChars == null) { + appearanceChars = + new PDAppearanceCharacteristicsDictionary(widget.getCOSObject()); + widget.setAppearanceCharacteristics(appearanceChars); + } + + appearanceChars.setBorderColour( + new PDColor(new float[] {0, 0, 0}, PDDeviceRGB.INSTANCE)); + appearanceChars.setBackground( + new PDColor(new float[] {1, 1, 1}, PDDeviceRGB.INSTANCE)); + + appearanceChars.setNormalCaption("4"); + + widget.setPrinted(true); + widget.setReadOnly(false); + widget.setHidden(false); + + } catch (Exception e) { + log.debug("Unable to set checkbox appearance characteristics: {}", e.getMessage()); + } + } + }, + RADIO("radio", "radioButton", PDRadioButton.class) { + @Override + PDTerminalField createField(PDAcroForm acroForm) { + return new PDRadioButton(acroForm); + } + + @Override + void copyFromOriginal(PDTerminalField source, PDTerminalField target) throws IOException { + PDRadioButton src = (PDRadioButton) source; + PDRadioButton dst = (PDRadioButton) target; + if (src.getExportValues() != null) { + dst.setExportValues(src.getExportValues()); + } + if (src.getValue() != null) { + dst.setValue(src.getValue()); + } + } + }, + COMBOBOX("combobox", "comboBox", PDComboBox.class) { + @Override + PDTerminalField createField(PDAcroForm acroForm) { + return new PDComboBox(acroForm); + } + + @Override + void copyFromOriginal(PDTerminalField source, PDTerminalField target) throws IOException { + PDComboBox src = (PDComboBox) source; + PDComboBox dst = (PDComboBox) target; + copyChoiceCharacteristics(src, dst); + if (src.getOptions() != null) { + dst.setOptions(src.getOptions()); + } + if (src.getValue() != null && !src.getValue().isEmpty()) { + dst.setValue(src.getValue()); + } + } + + @Override + boolean doesNotsupportsDefinitionCreation() { + return false; + } + + @Override + void applyNewFieldDefinition( + PDTerminalField field, + FormUtils.NewFormFieldDefinition definition, + List options) + throws IOException { + PDComboBox comboBox = (PDComboBox) field; + if (!options.isEmpty()) { + comboBox.setOptions(options); + } + List allowedOptions = FormUtils.resolveOptions(comboBox); + String comboName = + Optional.ofNullable(comboBox.getFullyQualifiedName()) + .orElseGet(comboBox::getPartialName); + String defaultValue = definition.defaultValue(); + if (defaultValue != null && !defaultValue.isBlank()) { + String filtered = + FormUtils.filterSingleChoiceSelection( + defaultValue, allowedOptions, comboName); + if (filtered != null) { + comboBox.setValue(filtered); + } + } + } + }, + LISTBOX("listbox", "listBox", PDListBox.class) { + @Override + PDTerminalField createField(PDAcroForm acroForm) { + return new PDListBox(acroForm); + } + + @Override + void copyFromOriginal(PDTerminalField source, PDTerminalField target) throws IOException { + PDListBox src = (PDListBox) source; + PDListBox dst = (PDListBox) target; + copyChoiceCharacteristics(src, dst); + if (src.getOptions() != null) { + dst.setOptions(src.getOptions()); + } + if (src.getValue() != null && !src.getValue().isEmpty()) { + dst.setValue(src.getValue()); + } + } + + @Override + boolean doesNotsupportsDefinitionCreation() { + return false; + } + + @Override + void applyNewFieldDefinition( + PDTerminalField field, + FormUtils.NewFormFieldDefinition definition, + List options) + throws IOException { + PDListBox listBox = (PDListBox) field; + listBox.setMultiSelect(Boolean.TRUE.equals(definition.multiSelect())); + if (!options.isEmpty()) { + listBox.setOptions(options); + } + List allowedOptions = FormUtils.collectChoiceAllowedValues(listBox); + String listBoxName = + Optional.ofNullable(listBox.getFullyQualifiedName()) + .orElseGet(listBox::getPartialName); + String defaultValue = definition.defaultValue(); + if (defaultValue != null && !defaultValue.isBlank()) { + if (Boolean.TRUE.equals(definition.multiSelect())) { + List selections = FormUtils.parseMultiChoiceSelections(defaultValue); + List filtered = + FormUtils.filterChoiceSelections( + selections, allowedOptions, listBoxName); + if (!filtered.isEmpty()) { + listBox.setValue(filtered); + } + } else { + String filtered = + FormUtils.filterSingleChoiceSelection( + defaultValue, allowedOptions, listBoxName); + if (filtered != null) { + listBox.setValue(filtered); + } + } + } + } + }, + SIGNATURE("signature", "signature", PDSignatureField.class) { + @Override + PDTerminalField createField(PDAcroForm acroForm) { + return new PDSignatureField(acroForm); + } + }, + BUTTON("button", "pushButton", PDPushButton.class) { + @Override + PDTerminalField createField(PDAcroForm acroForm) { + return new PDPushButton(acroForm); + } + }; + + private static final Map BY_TYPE = + Arrays.stream(values()) + .collect( + Collectors.toUnmodifiableMap( + FormFieldTypeSupport::typeName, Function.identity())); + + private final String typeName; + private final String fallbackWidgetName; + private final Class fieldClass; + + FormFieldTypeSupport( + String typeName, + String fallbackWidgetName, + Class fieldClass) { + this.typeName = typeName; + this.fallbackWidgetName = fallbackWidgetName; + this.fieldClass = fieldClass; + } + + public static FormFieldTypeSupport forField(PDField field) { + if (field == null) { + return null; + } + for (FormFieldTypeSupport handler : values()) { + if (handler.fieldClass.isInstance(field)) { + return handler; + } + } + return null; + } + + public static FormFieldTypeSupport forTypeName(String typeName) { + if (typeName == null) { + return null; + } + return BY_TYPE.get(typeName); + } + + private static void copyChoiceCharacteristics(PDChoice sourceField, PDChoice targetField) { + if (sourceField == null || targetField == null) { + return; + } + + try { + int flags = sourceField.getCOSObject().getInt(COSName.FF); + targetField.getCOSObject().setInt(COSName.FF, flags); + } catch (Exception e) { + // ignore and continue + } + + if (sourceField instanceof PDListBox sourceList + && targetField instanceof PDListBox targetList) { + try { + targetList.setMultiSelect(sourceList.isMultiSelect()); + } catch (Exception ignored) { + // ignore + } + } + } + + String typeName() { + return typeName; + } + + String fallbackWidgetName() { + return fallbackWidgetName; + } + + abstract PDTerminalField createField(PDAcroForm acroForm); + + void copyFromOriginal(PDTerminalField source, PDTerminalField target) throws IOException { + // default no-op + } + + boolean doesNotsupportsDefinitionCreation() { + return true; + } + + void applyNewFieldDefinition( + PDTerminalField field, + FormUtils.NewFormFieldDefinition definition, + List options) + throws IOException { + // default no-op + } +} diff --git a/app/proprietary/src/main/java/stirling/software/proprietary/util/FormUtils.java b/app/proprietary/src/main/java/stirling/software/proprietary/util/FormUtils.java new file mode 100644 index 000000000..f35a3c308 --- /dev/null +++ b/app/proprietary/src/main/java/stirling/software/proprietary/util/FormUtils.java @@ -0,0 +1,1762 @@ +package stirling.software.proprietary.util; + +import java.awt.image.BufferedImage; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.IdentityHashMap; +import java.util.LinkedHashMap; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import java.util.Set; + +import org.apache.pdfbox.cos.COSArray; +import org.apache.pdfbox.cos.COSDictionary; +import org.apache.pdfbox.cos.COSName; +import org.apache.pdfbox.pdmodel.PDDocument; +import org.apache.pdfbox.pdmodel.PDDocumentCatalog; +import org.apache.pdfbox.pdmodel.PDPage; +import org.apache.pdfbox.pdmodel.PDPageContentStream; +import org.apache.pdfbox.pdmodel.PDResources; +import org.apache.pdfbox.pdmodel.common.PDRectangle; +import org.apache.pdfbox.pdmodel.font.PDFont; +import org.apache.pdfbox.pdmodel.font.PDType1Font; +import org.apache.pdfbox.pdmodel.font.Standard14Fonts; +import org.apache.pdfbox.pdmodel.graphics.image.JPEGFactory; +import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject; +import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotation; +import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotationWidget; +import org.apache.pdfbox.pdmodel.interactive.annotation.PDAppearanceDictionary; +import org.apache.pdfbox.pdmodel.interactive.annotation.PDAppearanceEntry; +import org.apache.pdfbox.pdmodel.interactive.annotation.PDAppearanceStream; +import org.apache.pdfbox.pdmodel.interactive.form.*; +import org.apache.pdfbox.rendering.ImageType; +import org.apache.pdfbox.rendering.PDFRenderer; + +import com.fasterxml.jackson.annotation.JsonInclude; + +import lombok.experimental.UtilityClass; +import lombok.extern.slf4j.Slf4j; + +import stirling.software.common.model.ApplicationProperties; +import stirling.software.common.util.ApplicationContextProvider; +import stirling.software.common.util.ExceptionUtils; +import stirling.software.common.util.RegexPatternUtils; + +@Slf4j +@UtilityClass +public class FormUtils { + + // Field type constants + public final String FIELD_TYPE_TEXT = "text"; + public final String FIELD_TYPE_CHECKBOX = "checkbox"; + public final String FIELD_TYPE_COMBOBOX = "combobox"; + public final String FIELD_TYPE_LISTBOX = "listbox"; + public final String FIELD_TYPE_RADIO = "radio"; + public final String FIELD_TYPE_BUTTON = "button"; + public final String FIELD_TYPE_SIGNATURE = "signature"; + + // Set of choice field types that support options + public final Set CHOICE_FIELD_TYPES = + Set.of(FIELD_TYPE_COMBOBOX, FIELD_TYPE_LISTBOX, FIELD_TYPE_RADIO); + + /** + * Returns a normalized logical type string for the supplied PDFBox field instance. Centralized + * so all callers share identical mapping logic. + * + * @param field PDField to classify + * @return one of: signature, button, text, checkbox, combobox, listbox, radio (defaults to + * text) + */ + public String detectFieldType(PDField field) { + if (field instanceof PDSignatureField) { + return FIELD_TYPE_SIGNATURE; + } + if (field instanceof PDPushButton) { + return FIELD_TYPE_BUTTON; + } + if (field instanceof PDTextField) { + return FIELD_TYPE_TEXT; + } + if (field instanceof PDCheckBox) { + return FIELD_TYPE_CHECKBOX; + } + if (field instanceof PDComboBox) { + return FIELD_TYPE_COMBOBOX; + } + if (field instanceof PDListBox) { + return FIELD_TYPE_LISTBOX; + } + if (field instanceof PDRadioButton) { + return FIELD_TYPE_RADIO; + } + return FIELD_TYPE_TEXT; + } + + public List extractFormFields(PDDocument document) { + if (document == null) return List.of(); + + PDAcroForm acroForm = getAcroFormSafely(document); + if (acroForm == null) return List.of(); + + List fields = new ArrayList<>(); + Map typeCounters = new HashMap<>(); + Map pageOrderCounters = new HashMap<>(); + for (PDField field : acroForm.getFieldTree()) { + if (!(field instanceof PDTerminalField terminalField)) { + continue; + } + + String type = detectFieldType(terminalField); + + String name = + Optional.ofNullable(field.getFullyQualifiedName()) + .orElseGet(field::getPartialName); + if (name == null || name.isBlank()) { + continue; + } + + String currentValue = safeValue(terminalField); + boolean required = field.isRequired(); + int pageIndex = resolveFirstWidgetPageIndex(document, terminalField); + List options = resolveOptions(terminalField); + String tooltip = resolveTooltip(terminalField); + int typeIndex = typeCounters.merge(type, 1, Integer::sum); + String displayLabel = + deriveDisplayLabel(field, name, tooltip, type, typeIndex, options); + boolean multiSelect = resolveMultiSelect(terminalField); + int pageOrder = pageOrderCounters.merge(pageIndex, 1, Integer::sum) - 1; + + fields.add( + new FormFieldInfo( + name, + displayLabel, + type, + currentValue, + options.isEmpty() ? null : Collections.unmodifiableList(options), + required, + pageIndex, + multiSelect, + tooltip, + pageOrder)); + } + + fields.sort( + (a, b) -> { + int pageCompare = Integer.compare(a.pageIndex(), b.pageIndex()); + if (pageCompare != 0) { + return pageCompare; + } + int orderCompare = Integer.compare(a.pageOrder(), b.pageOrder()); + if (orderCompare != 0) { + return orderCompare; + } + return a.name().compareToIgnoreCase(b.name()); + }); + + return Collections.unmodifiableList(fields); + } + + /** + * Build a single record object (field-name -> value placeholder) that can be directly submitted + * to /api/v1/form/fill as the 'data' JSON. For checkboxes a boolean false is supplied unless + * currently checked. For list/choice fields we default to empty string. For multi-select list + * boxes we return an empty JSON array. Radio buttons get their current value (or empty string). + * Signature and button fields are skipped. + */ + public Map buildFillTemplateRecord(List extracted) { + if (extracted == null || extracted.isEmpty()) return Map.of(); + Map record = new LinkedHashMap<>(); + for (FormFieldInfo info : extracted) { + if (info == null || info.name() == null || info.name().isBlank()) { + continue; + } + String type = info.type(); + Object value; + switch (type) { + case FIELD_TYPE_CHECKBOX: + value = isChecked(info.value()) ? Boolean.TRUE : Boolean.FALSE; + break; + case FIELD_TYPE_LISTBOX: + if (info.multiSelect()) { + value = new ArrayList<>(); + } else { + value = safeDefault(info.value()); + } + break; + case FIELD_TYPE_BUTTON, FIELD_TYPE_SIGNATURE: + continue; // skip non-fillable + default: + value = safeDefault(info.value()); + } + record.put(info.name(), value); + } + return record; + } + + public FormFieldExtraction extractFieldsWithTemplate(PDDocument document) { + List fields = extractFormFields(document); + Map template = buildFillTemplateRecord(fields); + return new FormFieldExtraction(fields, template); + } + + private String safeDefault(String current) { + return current != null ? current : ""; + } + + public void applyFieldValues( + PDDocument document, Map values, boolean flatten, boolean strict) + throws IOException { + if (document == null) { + return; + } + + PDAcroForm acroForm = getAcroFormSafely(document); + if (acroForm == null) { + if (strict) { + throw new IOException("No AcroForm present in document"); + } + log.debug("Skipping form fill because document has no AcroForm"); + if (flatten) { + flattenEntireDocument(document, null); + } + return; + } + + if (values != null && !values.isEmpty()) { + acroForm.setCacheFields(true); + + Map lookup = new LinkedHashMap<>(); + for (PDField field : acroForm.getFieldTree()) { + String fqName = field.getFullyQualifiedName(); + if (fqName != null) { + lookup.putIfAbsent(fqName, field); + } + String partial = field.getPartialName(); + if (partial != null) { + lookup.putIfAbsent(partial, field); + } + } + + for (Map.Entry entry : values.entrySet()) { + String key = entry.getKey(); + if (key == null || key.isBlank()) { + continue; + } + + PDField field = lookup.get(key); + if (field == null) { + field = acroForm.getField(key); + } + if (field == null) { + log.debug("No matching field found for '{}', skipping", key); + continue; + } + + Object rawValue = entry.getValue(); + String value = rawValue == null ? null : Objects.toString(rawValue, null); + applyValueToField(field, value, strict); + } + + ensureAppearances(acroForm); + } + + repairWidgetGeometry(document, acroForm); + + if (flatten) { + flattenEntireDocument(document, acroForm); + } + } + + private void flattenViaRendering(PDDocument document, PDAcroForm acroForm) throws IOException { + if (document == null) { + return; + } + + // Remove the AcroForm structure first since we're rendering everything + if (acroForm != null) { + try { + if (document.getDocumentCatalog() != null) { + document.getDocumentCatalog().setAcroForm(null); + } + } catch (Exception e) { + log.debug("Failed to remove AcroForm before rendering: {}", e.getMessage()); + } + } + + PDFRenderer renderer = new PDFRenderer(document); + ApplicationProperties properties = + ApplicationContextProvider.getBean(ApplicationProperties.class); + + int requestedDpi = + properties != null && properties.getSystem() != null + ? properties.getSystem().getMaxDPI() + : 300; + + rebuildDocumentFromImages(document, renderer, requestedDpi); + } + + // note: this implementation suffers from: + // https://issues.apache.org/jira/browse/PDFBOX-5962 + private void flattenEntireDocument(PDDocument document, PDAcroForm acroForm) + throws IOException { + if (document == null) { + return; + } + + flattenViaRendering(document, acroForm); + } + + private void rebuildDocumentFromImages(PDDocument document, PDFRenderer renderer, int dpi) + throws IOException { + int pageCount = document.getNumberOfPages(); + + for (int pageIndex = 0; pageIndex < pageCount; pageIndex++) { + BufferedImage rendered; + try { + rendered = renderer.renderImageWithDPI(pageIndex, dpi, ImageType.RGB); + } catch (OutOfMemoryError e) { + throw ExceptionUtils.createOutOfMemoryDpiException(pageIndex + 1, dpi, e); + } catch (NegativeArraySizeException e) { + throw ExceptionUtils.createOutOfMemoryDpiException(pageIndex + 1, dpi, e); + } + + PDPage page = document.getPage(pageIndex); + PDRectangle mediaBox = page.getMediaBox(); + + // Ensure the page has resources before drawing + if (page.getResources() == null) { + page.setResources(new PDResources()); + } + + List annotations = new ArrayList<>(page.getAnnotations()); + for (PDAnnotation annotation : annotations) { + annotation.getCOSObject().removeItem(COSName.AP); + page.getAnnotations().remove(annotation); + } + + try (PDPageContentStream contentStream = + new PDPageContentStream( + document, page, PDPageContentStream.AppendMode.OVERWRITE, true, true)) { + PDImageXObject pdImage = JPEGFactory.createFromImage(document, rendered); + contentStream.drawImage( + pdImage, + mediaBox.getLowerLeftX(), + mediaBox.getLowerLeftY(), + mediaBox.getWidth(), + mediaBox.getHeight()); + } + } + } + + private void repairWidgetGeometry(PDDocument document, PDAcroForm acroForm) { + if (document == null || acroForm == null) { + return; + } + + for (PDField field : acroForm.getFieldTree()) { + if (!(field instanceof PDTerminalField terminalField)) { + continue; + } + + List widgets = terminalField.getWidgets(); + if (widgets == null || widgets.isEmpty()) { + continue; + } + + for (PDAnnotationWidget widget : widgets) { + if (widget == null) { + continue; + } + + PDRectangle rectangle = widget.getRectangle(); + boolean invalidRectangle = + rectangle == null + || rectangle.getWidth() <= 0 + || rectangle.getHeight() <= 0; + + PDPage page = widget.getPage(); + if (page == null) { + page = resolveWidgetPage(document, widget); + if (page != null) { + widget.setPage(page); + } + } + + if (invalidRectangle) { + if (page == null && document.getNumberOfPages() > 0) { + page = document.getPage(0); + widget.setPage(page); + } + + if (page != null) { + PDRectangle mediaBox = page.getMediaBox(); + float fallbackWidth = Math.min(200f, mediaBox.getWidth()); + float fallbackHeight = Math.min(40f, mediaBox.getHeight()); + PDRectangle fallbackRectangle = + new PDRectangle( + mediaBox.getLowerLeftX(), + mediaBox.getLowerLeftY(), + fallbackWidth, + fallbackHeight); + widget.setRectangle(fallbackRectangle); + + try { + List pageAnnotations = page.getAnnotations(); + if (pageAnnotations != null && !pageAnnotations.contains(widget)) { + pageAnnotations.add(widget); + } + } catch (IOException e) { + log.debug( + "Unable to repair annotations for widget '{}': {}", + terminalField.getFullyQualifiedName(), + e.getMessage()); + } + } + } + } + } + } + + public void applyFieldValues(PDDocument document, Map values, boolean flatten) + throws IOException { + applyFieldValues(document, values, flatten, false); + } + + private void ensureAppearances(PDAcroForm acroForm) { + if (acroForm == null) return; + + acroForm.setNeedAppearances(true); + try { + try { + PDResources dr = acroForm.getDefaultResources(); + if (dr == null) { + dr = new PDResources(); + acroForm.setDefaultResources(dr); + } + PDFont helvetica = new PDType1Font(Standard14Fonts.FontName.HELVETICA); + try { + // Map standard name used by many DAs + dr.put(COSName.getPDFName("Helvetica"), helvetica); + } catch (Exception ignore) { + try { + dr.add(helvetica); + } catch (Exception ignore2) { + // ignore + } + } + } catch (Exception fontPrep) { + log.debug( + "Unable to ensure default font resources before refresh: {}", + fontPrep.getMessage()); + } + acroForm.refreshAppearances(); + } catch (IOException e) { + log.warn("Failed to refresh form appearances: {}", e.getMessage(), e); + return; // Don't set NeedAppearances to false if refresh failed + } + + // After successful appearance generation, set NeedAppearances to false + // to signal that appearance streams are now embedded authoritatively + try { + acroForm.setNeedAppearances(false); + } catch (Exception ignored) { + // Fallback to direct COS manipulation if the setter fails + acroForm.getCOSObject().setBoolean(COSName.NEED_APPEARANCES, false); + } + } + + private PDAcroForm getAcroFormSafely(PDDocument document) { + try { + PDDocumentCatalog catalog = document.getDocumentCatalog(); + return catalog != null ? catalog.getAcroForm() : null; + } catch (Exception e) { + log.warn("Unable to access AcroForm: {}", e.getMessage(), e); + return null; + } + } + + public String filterSingleChoiceSelection( + String selection, List allowedOptions, String fieldName) { + if (selection == null || selection.trim().isEmpty()) return null; + List filtered = + filterChoiceSelections(List.of(selection), allowedOptions, fieldName); + return filtered.isEmpty() ? null : filtered.get(0); + } + + private void applyValueToField(PDField field, String value, boolean strict) throws IOException { + try { + if (field instanceof PDTextField textField) { + setTextValue(textField, value); + } else if (field instanceof PDCheckBox checkBox) { + LinkedHashSet candidateStates = collectCheckBoxStates(checkBox); + boolean shouldCheck = shouldCheckBoxBeChecked(value, candidateStates); + try { + if (shouldCheck) { + checkBox.check(); + } else { + checkBox.unCheck(); + } + } catch (IOException checkProblem) { + log.warn( + "Failed to set checkbox state for '{}': {}", + field.getFullyQualifiedName(), + checkProblem.getMessage(), + checkProblem); + if (strict) { + throw checkProblem; + } + } + } else if (field instanceof PDRadioButton radioButton) { + if (value != null && !value.isBlank()) { + radioButton.setValue(value); + } + } else if (field instanceof PDChoice choiceField) { + applyChoiceValue(choiceField, value); + } else if (field instanceof PDPushButton) { + log.debug("Ignore Push button"); + } else if (field instanceof PDSignatureField) { + log.debug("Skipping signature field '{}'", field.getFullyQualifiedName()); + } else { + field.setValue(value != null ? value : ""); + } + } catch (Exception e) { + log.warn( + "Failed to set value for field '{}': {}", + field.getFullyQualifiedName(), + e.getMessage(), + e); + if (strict) { + if (e instanceof IOException io) { + throw io; + } + throw new IOException( + "Failed to set value for field '" + field.getFullyQualifiedName() + "'", e); + } + } + } + + void setTextValue(PDTextField textField, String value) throws IOException { + try { + textField.setValue(value != null ? value : ""); + return; + } catch (IOException initial) { + log.debug( + "Primary fill failed for text field '{}': {}", + textField.getFullyQualifiedName(), + initial.getMessage()); + } + + try { + PDAcroForm acroForm = textField.getAcroForm(); + PDResources dr = acroForm != null ? acroForm.getDefaultResources() : null; + if (dr == null && acroForm != null) { + dr = new PDResources(); + acroForm.setDefaultResources(dr); + } + + String resourceName = "Helv"; + try { + PDFont helvetica = new PDType1Font(Standard14Fonts.FontName.HELVETICA); + if (dr != null) { + try { + COSName alias = dr.add(helvetica); + if (alias != null + && alias.getName() != null + && !alias.getName().isBlank()) { + resourceName = alias.getName(); + } + } catch (Exception addEx) { + try { + COSName explicit = COSName.getPDFName("Helvetica"); + dr.put(explicit, helvetica); + resourceName = explicit.getName(); + } catch (Exception ignore) { + // ignore + } + } + } + } catch (Exception fontEx) { + log.debug( + "Unable to prepare Helvetica font for '{}': {}", + textField.getFullyQualifiedName(), + fontEx.getMessage()); + } + + textField.setDefaultAppearance("/" + resourceName + " 12 Tf 0 g"); + } catch (Exception e) { + log.debug( + "Unable to adjust default appearance for '{}': {}", + textField.getFullyQualifiedName(), + e.getMessage()); + } + + textField.setValue(value != null ? value : ""); + } + + private void applyChoiceValue(PDChoice choiceField, String value) throws IOException { + if (value == null) { + choiceField.setValue(""); + return; + } + + List allowedOptions = collectChoiceAllowedValues(choiceField); + + if (choiceField.isMultiSelect()) { + List selections = parseMultiChoiceSelections(value); + List filteredSelections = + filterChoiceSelections( + selections, allowedOptions, choiceField.getFullyQualifiedName()); + if (filteredSelections.isEmpty()) { + choiceField.setValue(Collections.emptyList()); + } else { + choiceField.setValue(filteredSelections); + } + } else { + String selected = + filterSingleChoiceSelection( + value, allowedOptions, choiceField.getFullyQualifiedName()); + choiceField.setValue(Objects.requireNonNullElse(selected, "")); + } + } + + List filterChoiceSelections( + List selections, List allowedOptions, String fieldName) { + if (selections == null || selections.isEmpty()) { + return Collections.emptyList(); + } + + List sanitizedSelections = + selections.stream() + .filter(Objects::nonNull) + .map(String::trim) + .filter(s -> !s.isEmpty()) + .toList(); + + if (sanitizedSelections.isEmpty()) { + return Collections.emptyList(); + } + + if (allowedOptions == null || allowedOptions.isEmpty()) { + throw new IllegalArgumentException( + "The /Opt array is missing for choice field '" + + fieldName + + "', cannot set values."); + } + + Map allowedLookup = new LinkedHashMap<>(); + for (String option : allowedOptions) { + if (option == null) { + continue; + } + String normalized = option.trim(); + if (!normalized.isEmpty()) { + allowedLookup.putIfAbsent(normalized.toLowerCase(Locale.ROOT), option); + } + } + + List validSelections = new ArrayList<>(); + for (String selection : sanitizedSelections) { + String normalized = selection.toLowerCase(Locale.ROOT); + String resolved = allowedLookup.get(normalized); + if (resolved != null) { + validSelections.add(resolved); + } else { + log.debug( + "Ignoring unsupported option '{}' for choice field '{}'", + selection, + fieldName); + } + } + return validSelections; + } + + List parseMultiChoiceSelections(String raw) { + if (raw == null || raw.isBlank()) return List.of(); + return Arrays.stream(raw.split(",")) + .map(String::trim) + .filter(s -> !s.isEmpty()) + .collect(ArrayList::new, ArrayList::add, ArrayList::addAll); + } + + List collectChoiceAllowedValues(PDChoice choiceField) { + if (choiceField == null) { + return Collections.emptyList(); + } + + LinkedHashSet allowed = new LinkedHashSet<>(); + + try { + List exports = choiceField.getOptionsExportValues(); + if (exports != null) { + exports.stream() + .filter(Objects::nonNull) + .forEach( + option -> { + String cleaned = option.trim(); + if (!cleaned.isEmpty()) { + allowed.add(option); + } + }); + } + } catch (Exception e) { + log.debug( + "Unable to read export values for choice field '{}': {}", + choiceField.getFullyQualifiedName(), + e.getMessage()); + } + + try { + List display = choiceField.getOptionsDisplayValues(); + if (display != null) { + display.stream() + .filter(Objects::nonNull) + .forEach( + option -> { + String cleaned = option.trim(); + if (!cleaned.isEmpty()) { + allowed.add(option); + } + }); + } + } catch (Exception e) { + log.debug( + "Unable to read display values for choice field '{}': {}", + choiceField.getFullyQualifiedName(), + e.getMessage()); + } + + if (allowed.isEmpty()) { + return Collections.emptyList(); + } + + return new ArrayList<>(allowed); + } + + boolean isChecked(String value) { + if (value == null) return false; + String normalized = value.trim().toLowerCase(); + return "true".equals(normalized) + || "1".equals(normalized) + || "yes".equals(normalized) + || "on".equals(normalized) + || "checked".equals(normalized); + } + + private LinkedHashSet collectCheckBoxStates(PDCheckBox checkBox) { + LinkedHashSet states = new LinkedHashSet<>(); + try { + String onValue = checkBox.getOnValue(); + if (isSettableCheckBoxState(onValue)) { + states.add(onValue.trim()); + } + } catch (Exception e) { + log.debug( + "Failed to obtain explicit on-value for checkbox '{}': {}", + checkBox.getFullyQualifiedName(), + e.getMessage()); + } + + try { + for (PDAnnotationWidget widget : checkBox.getWidgets()) { + PDAppearanceDictionary appearance = widget.getAppearance(); + if (appearance == null) { + continue; + } + PDAppearanceEntry normal = appearance.getNormalAppearance(); + if (normal == null) { + continue; + } + if (normal.isSubDictionary()) { + Map entries = normal.getSubDictionary(); + if (entries != null) { + for (COSName name : entries.keySet()) { + String state = name.getName(); + if (isSettableCheckBoxState(state)) { + states.add(state.trim()); + } + } + } + } else if (normal.isStream()) { + COSName appearanceState = widget.getAppearanceState(); + String state = appearanceState != null ? appearanceState.getName() : null; + if (isSettableCheckBoxState(state)) { + states.add(state.trim()); + } + } + } + } catch (Exception e) { + log.debug( + "Failed to obtain appearance states for checkbox '{}': {}", + checkBox.getFullyQualifiedName(), + e.getMessage()); + } + + try { + List exports = checkBox.getExportValues(); + if (exports != null) { + for (String export : exports) { + if (isSettableCheckBoxState(export)) { + states.add(export.trim()); + } + } + } + } catch (Exception e) { + log.debug( + "Failed to obtain export values for checkbox '{}': {}", + checkBox.getFullyQualifiedName(), + e.getMessage()); + } + return states; + } + + private String safeValue(PDTerminalField field) { + try { + return field.getValueAsString(); + } catch (Exception e) { + log.debug( + "Failed to read current value for field '{}': {}", + field.getFullyQualifiedName(), + e.getMessage()); + return null; + } + } + + List resolveOptions(PDTerminalField field) { + try { + if (field instanceof PDChoice choice) { + List display = choice.getOptionsDisplayValues(); + if (display != null && !display.isEmpty()) { + return new ArrayList<>(display); + } + List exportValues = choice.getOptionsExportValues(); + if (exportValues != null && !exportValues.isEmpty()) { + return new ArrayList<>(exportValues); + } + } else if (field instanceof PDRadioButton radio) { + List exports = radio.getExportValues(); + if (exports != null && !exports.isEmpty()) { + return new ArrayList<>(exports); + } + } else if (field instanceof PDCheckBox checkBox) { + List exports = checkBox.getExportValues(); + if (exports != null && !exports.isEmpty()) { + return new ArrayList<>(exports); + } + } + } catch (Exception e) { + log.debug( + "Failed to resolve options for field '{}': {}", + field.getFullyQualifiedName(), + e.getMessage()); + } + return Collections.emptyList(); + } + + private boolean resolveMultiSelect(PDTerminalField field) { + if (field instanceof PDListBox listBox) { + try { + return listBox.isMultiSelect(); + } catch (Exception e) { + log.debug( + "Failed to resolve multi-select flag for list box '{}': {}", + field.getFullyQualifiedName(), + e.getMessage()); + } + } + return false; + } + + private boolean isSettableCheckBoxState(String state) { + if (state == null) return false; + String trimmed = state.trim(); + return !trimmed.isEmpty() && !"Off".equalsIgnoreCase(trimmed); + } + + private boolean shouldCheckBoxBeChecked(String value, LinkedHashSet candidateStates) { + if (value == null) { + return false; + } + if (isChecked(value)) { + return true; + } + String normalized = value.trim(); + if (normalized.isEmpty() || "off".equalsIgnoreCase(normalized)) { + return false; + } + for (String state : candidateStates) { + if (state.equalsIgnoreCase(normalized)) { + return true; + } + } + return false; + } + + private String deriveDisplayLabel( + PDField field, + String name, + String tooltip, + String type, + int typeIndex, + List options) { + String alternate = cleanLabel(field.getAlternateFieldName()); + if (alternate != null && !looksGeneric(alternate)) { + return alternate; + } + + String tooltipLabel = cleanLabel(tooltip); + if (tooltipLabel != null && !looksGeneric(tooltipLabel)) { + return tooltipLabel; + } + + // Only check options for choice-type fields (combobox, listbox, radio) + if (CHOICE_FIELD_TYPES.contains(type) && options != null && !options.isEmpty()) { + String optionCandidate = cleanLabel(options.get(0)); + if (optionCandidate != null && !looksGeneric(optionCandidate)) { + return optionCandidate; + } + } + + String humanized = cleanLabel(humanizeName(name)); + if (humanized != null && !looksGeneric(humanized)) { + return humanized; + } + + return fallbackLabelForType(type, typeIndex); + } + + private String cleanLabel(String label) { + if (label == null) return null; + + RegexPatternUtils patterns = RegexPatternUtils.getInstance(); + String cleaned = label.trim(); + + cleaned = patterns.getPattern("[.:]+$").matcher(cleaned).replaceAll("").trim(); + + return cleaned.isEmpty() ? null : cleaned; + } + + private boolean looksGeneric(String value) { + if (value == null) return true; + + RegexPatternUtils patterns = RegexPatternUtils.getInstance(); + String simplified = patterns.getPunctuationPattern().matcher(value).replaceAll(" ").trim(); + + if (simplified.isEmpty()) return true; + + return patterns.getGenericFieldNamePattern().matcher(simplified).matches() + || patterns.getSimpleFormFieldPattern().matcher(simplified).matches() + || patterns.getOptionalTNumericPattern().matcher(simplified).matches(); + } + + private String humanizeName(String name) { + if (name == null) return null; + + RegexPatternUtils patterns = RegexPatternUtils.getInstance(); + + String cleaned = patterns.getFormFieldBracketPattern().matcher(name).replaceAll(" "); + cleaned = cleaned.replace('.', ' '); + cleaned = patterns.getUnderscoreHyphenPattern().matcher(cleaned).replaceAll(" "); + cleaned = patterns.getCamelCaseBoundaryPattern().matcher(cleaned).replaceAll(" "); + cleaned = patterns.getWhitespacePattern().matcher(cleaned).replaceAll(" ").trim(); + + return cleaned.isEmpty() ? null : cleaned; + } + + public void modifyFormFields( + PDDocument document, List modifications) { + if (document == null || modifications == null || modifications.isEmpty()) return; + + PDAcroForm acroForm = getAcroFormSafely(document); + if (acroForm == null) { + log.warn("Cannot modify fields because the document has no AcroForm"); + return; + } + + Set existingNames = collectExistingFieldNames(acroForm); + + for (ModifyFormFieldDefinition modification : modifications) { + if (modification == null || modification.targetName() == null) { + continue; + } + + String lookupName = modification.targetName().trim(); + if (lookupName.isEmpty()) { + continue; + } + + PDField originalField = locateField(acroForm, lookupName); + if (originalField == null) { + log.warn("No matching field '{}' found for modification", lookupName); + continue; + } + + List widgets = originalField.getWidgets(); + if (widgets == null || widgets.isEmpty()) { + log.warn("Field '{}' has no widgets; skipping modification", lookupName); + continue; + } + + PDAnnotationWidget widget = widgets.get(0); + PDRectangle originalRectangle = cloneRectangle(widget.getRectangle()); + PDPage page = resolveWidgetPage(document, widget); + if (page == null || originalRectangle == null) { + log.warn( + "Unable to resolve widget page or rectangle for '{}'; skipping", + lookupName); + continue; + } + + String resolvedType = + Optional.ofNullable(modification.type()) + .map(FormUtils::normalizeFieldType) + .orElseGet(() -> detectFieldType(originalField)); + + if (!RegexPatternUtils.getInstance() + .getSupportedNewFieldTypes() + .contains(resolvedType)) { + log.warn("Unsupported target type '{}' for field '{}'", resolvedType, lookupName); + continue; + } + + String desiredName = + Optional.ofNullable(modification.name()) + .map(String::trim) + .filter(s -> !s.isEmpty()) + .orElseGet(originalField::getPartialName); + + if (desiredName != null) { + existingNames.remove(originalField.getFullyQualifiedName()); + existingNames.remove(originalField.getPartialName()); + desiredName = generateUniqueFieldName(desiredName, existingNames); + existingNames.add(desiredName); + } + + // Try to modify field in-place first for simple property changes + String currentType = detectFieldType(originalField); + boolean typeChanging = !currentType.equals(resolvedType); + + if (!typeChanging) { + try { + modifyFieldPropertiesInPlace(originalField, modification, desiredName); + log.debug("Successfully modified field '{}' in-place", lookupName); + continue; // Skip the remove-and-recreate process + } catch (Exception e) { + log.debug( + "In-place modification failed for '{}', falling back to recreation: {}", + lookupName, + e.getMessage()); + } + } + + // For type changes or when in-place modification fails, use remove-and-recreate + // But create the new field first to ensure success before removing the original + NewFormFieldDefinition replacementDefinition = + new NewFormFieldDefinition( + desiredName, + modification.label(), + resolvedType, + determineWidgetPageIndex(document, widget), + originalRectangle.getLowerLeftX(), + originalRectangle.getLowerLeftY(), + originalRectangle.getWidth(), + originalRectangle.getHeight(), + modification.required(), + modification.multiSelect(), + modification.options(), + modification.defaultValue(), + modification.tooltip()); + + List sanitizedOptions = sanitizeOptions(modification.options()); + + try { + FormFieldTypeSupport handler = FormFieldTypeSupport.forTypeName(resolvedType); + if (handler == null || handler.doesNotsupportsDefinitionCreation()) { + handler = FormFieldTypeSupport.TEXT; + } + + // Create new field first - if this fails, original field is preserved + createNewField( + handler, + acroForm, + page, + originalRectangle, + desiredName, + replacementDefinition, + sanitizedOptions); // Don't reuse widget for type changes + + removeFieldFromDocument(document, acroForm, originalField); + + log.debug( + "Successfully replaced field '{}' with type '{}'", + lookupName, + resolvedType); + } catch (Exception e) { + log.warn( + "Failed to modify form field '{}' to type '{}': {}", + lookupName, + resolvedType, + e.getMessage(), + e); + } + } + + ensureAppearances(acroForm); + } + + private void modifyFieldPropertiesInPlace( + PDField field, ModifyFormFieldDefinition modification, String newName) + throws IOException { + if (newName != null && !newName.equals(field.getPartialName())) { + field.setPartialName(newName); + } + + if (modification.label() != null) { + if (!modification.label().isBlank()) { + field.setAlternateFieldName(modification.label()); + } else { + field.setAlternateFieldName(null); + } + } + + if (modification.required() != null) { + field.setRequired(modification.required()); + } + + if (modification.defaultValue() != null) { + if (!modification.defaultValue().isBlank()) { + field.setValue(modification.defaultValue()); + } else { + field.setValue(null); + } + } + + if (field instanceof PDChoice choiceField + && (modification.options() != null || modification.multiSelect() != null)) { + + if (modification.options() != null) { + List sanitizedOptions = sanitizeOptions(modification.options()); + choiceField.setOptions(sanitizedOptions); + } + + if (modification.multiSelect() != null) { + choiceField.setMultiSelect(modification.multiSelect()); + } + } + + // Update tooltip on widgets + if (modification.tooltip() != null) { + List widgets = field.getWidgets(); + for (PDAnnotationWidget widget : widgets) { + if (!modification.tooltip().isBlank()) { + widget.getCOSObject().setString(COSName.TU, modification.tooltip()); + } else { + widget.getCOSObject().removeItem(COSName.TU); + } + } + } + } + + private String fallbackLabelForType(String type, int typeIndex) { + String suffix = " " + typeIndex; + return switch (type) { + case FIELD_TYPE_CHECKBOX -> "Checkbox" + suffix; + case FIELD_TYPE_RADIO -> "Option" + suffix; + case FIELD_TYPE_COMBOBOX -> "Dropdown" + suffix; + case FIELD_TYPE_LISTBOX -> "List" + suffix; + case FIELD_TYPE_TEXT -> "Text field" + suffix; + default -> "Field" + suffix; + }; + } + + private String resolveTooltip(PDTerminalField field) { + List widgets = field.getWidgets(); + if (widgets == null) { + return null; + } + for (PDAnnotationWidget widget : widgets) { + if (widget == null) { + continue; + } + try { + String alt = widget.getAnnotationName(); + if (alt != null && !alt.isBlank()) { + return alt; + } + String tooltip = widget.getCOSObject().getString(COSName.TU); + if (tooltip != null && !tooltip.isBlank()) { + return tooltip; + } + } catch (Exception e) { + log.debug( + "Failed to read tooltip for field '{}': {}", + field.getFullyQualifiedName(), + e.getMessage()); + } + } + return null; + } + + private int resolveFirstWidgetPageIndex(PDDocument document, PDTerminalField field) { + List widgets = field.getWidgets(); + if (widgets == null || widgets.isEmpty()) { + return -1; + } + Map widgetPageFallbacks = null; + for (PDAnnotationWidget widget : widgets) { + int idx = resolveWidgetPageIndex(document, widget); + if (idx >= 0) { + return idx; + } + try { + COSDictionary widgetDictionary = widget.getCOSObject(); + if (widgetDictionary != null + && widgetDictionary.getDictionaryObject(COSName.P) == null) { + if (widgetPageFallbacks == null) { + widgetPageFallbacks = buildWidgetPageFallbackMap(document); + } + Integer fallbackIndex = widgetPageFallbacks.get(widget); + if (fallbackIndex != null && fallbackIndex >= 0) { + return fallbackIndex; + } + } + } catch (Exception e) { + log.debug( + "Failed to inspect widget page reference for field '{}': {}", + field.getFullyQualifiedName(), + e.getMessage()); + } + } + return -1; + } + + private int resolveWidgetPageIndex(PDDocument document, PDAnnotationWidget widget) { + if (document == null || widget == null) { + return -1; + } + try { + COSDictionary widgetDictionary = widget.getCOSObject(); + if (widgetDictionary != null + && widgetDictionary.getDictionaryObject(COSName.P) == null) { + Map fallback = buildWidgetPageFallbackMap(document); + Integer index = fallback.get(widget); + if (index != null) { + return index; + } + } + } catch (Exception e) { + log.debug("Widget page lookup via fallback map failed: {}", e.getMessage()); + } + try { + PDPage page = widget.getPage(); + if (page != null) { + int idx = document.getPages().indexOf(page); + if (idx >= 0) { + return idx; + } + } + } catch (Exception e) { + log.debug("Widget page lookup failed: {}", e.getMessage()); + } + + int pageCount = document.getNumberOfPages(); + for (int i = 0; i < pageCount; i++) { + try { + PDPage candidate = document.getPage(i); + List annotations = candidate.getAnnotations(); + for (PDAnnotation annotation : annotations) { + if (annotation == widget) { + return i; + } + } + } catch (IOException e) { + log.debug("Failed to inspect annotations for page {}: {}", i, e.getMessage()); + } + } + return -1; + } + + public void deleteFormFields(PDDocument document, List fieldNames) { + if (document == null || fieldNames == null || fieldNames.isEmpty()) return; + + PDAcroForm acroForm = getAcroFormSafely(document); + if (acroForm == null) { + log.warn("Cannot delete fields because the document has no AcroForm"); + return; + } + + for (String name : fieldNames) { + if (name == null || name.isBlank()) { + continue; + } + + PDField field = locateField(acroForm, name.trim()); + if (field == null) { + log.warn("No matching field '{}' found for deletion", name); + continue; + } + + removeFieldFromDocument(document, acroForm, field); + } + + ensureAppearances(acroForm); + } + + private void removeFieldFromDocument(PDDocument document, PDAcroForm acroForm, PDField field) { + if (field == null) return; + + try { + List widgets = field.getWidgets(); + if (widgets != null) { + for (PDAnnotationWidget widget : widgets) { + PDPage page = resolveWidgetPage(document, widget); + if (page != null) { + page.getAnnotations().remove(widget); + } + } + widgets.clear(); + } + + PDNonTerminalField parent = field.getParent(); + if (parent != null) { + List children = parent.getChildren(); + if (children != null) { + children.removeIf(existing -> existing == field); + } + + try { + COSArray kids = parent.getCOSObject().getCOSArray(COSName.KIDS); + if (kids != null) { + kids.removeObject(field.getCOSObject()); + } + } catch (Exception e) { + log.debug( + "Failed to remove field '{}' from parent kids array: {}", + field.getFullyQualifiedName(), + e.getMessage()); + } + } + + if (acroForm != null) { + pruneFieldReferences(acroForm.getFields(), field); + + try { + COSArray fieldsArray = acroForm.getCOSObject().getCOSArray(COSName.FIELDS); + if (fieldsArray != null) { + fieldsArray.removeObject(field.getCOSObject()); + } + } catch (Exception e) { + log.debug( + "Failed to remove field '{}' from AcroForm COS array: {}", + field.getFullyQualifiedName(), + e.getMessage()); + } + } + + try { + field.getCOSObject().clear(); + } catch (Exception e) { + log.debug( + "Failed to clear COS dictionary for field '{}': {}", + field.getFullyQualifiedName(), + e.getMessage()); + } + } catch (Exception e) { + log.warn( + "Failed to detach field '{}' from document: {}", + field.getFullyQualifiedName(), + e.getMessage()); + } + } + + private void pruneFieldReferences(List fields, PDField target) { + if (fields == null || fields.isEmpty() || target == null) return; + + fields.removeIf(existing -> isSameFieldReference(existing, target)); + + for (PDField existing : List.copyOf(fields)) { + if (existing instanceof PDNonTerminalField nonTerminal) { + List children = nonTerminal.getChildren(); + if (children != null && !children.isEmpty()) { + pruneFieldReferences(children, target); + } + } + } + } + + private boolean isSameFieldReference(PDField a, PDField b) { + if (a == b) return true; + if (a == null || b == null) return false; + + String aName = a.getFullyQualifiedName(); + String bName = b.getFullyQualifiedName(); + if (aName != null && aName.equals(bName)) return true; + + String aPartial = a.getPartialName(); + String bPartial = b.getPartialName(); + return aPartial != null && aPartial.equals(bPartial); + } + + private void createNewField( + FormFieldTypeSupport handler, + PDAcroForm acroForm, + PDPage page, + PDRectangle rectangle, + String name, + NewFormFieldDefinition definition, + List options) + throws IOException { + + if (handler.doesNotsupportsDefinitionCreation()) { + throw new IllegalArgumentException( + "Field type '" + handler.typeName() + "' cannot be created via definition"); + } + + PDTerminalField field = handler.createField(acroForm); + registerNewField(field, acroForm, page, rectangle, name, definition, null); + List preparedOptions = options != null ? options : List.of(); + handler.applyNewFieldDefinition(field, definition, preparedOptions); + } + + private PDRectangle cloneRectangle(PDRectangle rectangle) { + if (rectangle == null) { + return null; + } + return new PDRectangle( + rectangle.getLowerLeftX(), + rectangle.getLowerLeftY(), + rectangle.getWidth(), + rectangle.getHeight()); + } + + private PDPage resolveWidgetPage(PDDocument document, PDAnnotationWidget widget) { + if (widget == null) { + return null; + } + PDPage page = widget.getPage(); + if (page != null) { + return page; + } + int pageIndex = determineWidgetPageIndex(document, widget); + if (pageIndex >= 0) { + try { + return document.getPage(pageIndex); + } catch (Exception e) { + log.debug("Failed to resolve widget page index {}: {}", pageIndex, e.getMessage()); + } + } + return null; + } + + private int determineWidgetPageIndex(PDDocument document, PDAnnotationWidget widget) { + if (document == null || widget == null) { + return -1; + } + + PDPage directPage = widget.getPage(); + if (directPage != null) { + int index = 0; + for (PDPage page : document.getPages()) { + if (page == directPage) { + return index; + } + index++; + } + } + + int pageCount = document.getNumberOfPages(); + for (int i = 0; i < pageCount; i++) { + try { + PDPage page = document.getPage(i); + for (PDAnnotation annotation : page.getAnnotations()) { + if (annotation == widget) { + return i; + } + } + } catch (IOException e) { + log.debug("Failed to inspect annotations for page {}: {}", i, e.getMessage()); + } + } + return -1; + } + + private Map buildWidgetPageFallbackMap(PDDocument document) { + if (document == null) { + return Collections.emptyMap(); + } + + Map widgetToPage = new IdentityHashMap<>(); + int pageCount = document.getNumberOfPages(); + for (int pageIndex = 0; pageIndex < pageCount; pageIndex++) { + PDPage page; + try { + page = document.getPage(pageIndex); + } catch (Exception e) { + log.debug( + "Failed to access page {} while building widget map: {}", + pageIndex, + e.getMessage()); + continue; + } + + List annotations; + try { + annotations = page.getAnnotations(); + } catch (IOException e) { + log.debug( + "Failed to access annotations for page {}: {}", pageIndex, e.getMessage()); + continue; + } + + if (annotations == null || annotations.isEmpty()) { + continue; + } + + for (PDAnnotation annotation : annotations) { + if (!(annotation instanceof PDAnnotationWidget widget)) { + continue; + } + + COSDictionary widgetDictionary; + try { + widgetDictionary = widget.getCOSObject(); + } catch (Exception e) { + log.debug( + "Failed to access widget dictionary while building fallback map: {}", + e.getMessage()); + continue; + } + + if (widgetDictionary == null + || widgetDictionary.getDictionaryObject(COSName.P) != null) { + continue; + } + + widgetToPage.putIfAbsent(widget, pageIndex); + } + } + + return widgetToPage.isEmpty() ? Collections.emptyMap() : widgetToPage; + } + + private Set collectExistingFieldNames(PDAcroForm acroForm) { + if (acroForm == null) { + return Collections.emptySet(); + } + Set existing = new HashSet<>(); + for (PDField field : acroForm.getFieldTree()) { + if (field instanceof PDTerminalField) { + String fqn = field.getFullyQualifiedName(); + if (fqn != null && !fqn.isEmpty()) { + existing.add(fqn); + } + } + } + return existing; + } + + private PDField locateField(PDAcroForm acroForm, String name) { + if (acroForm == null || name == null) { + return null; + } + PDField direct = acroForm.getField(name); + if (direct != null) { + return direct; + } + for (PDField field : acroForm.getFieldTree()) { + if (field == null) { + continue; + } + String fq = field.getFullyQualifiedName(); + if (name.equals(fq)) { + return field; + } + String partial = field.getPartialName(); + if (name.equals(partial)) { + return field; + } + } + return null; + } + + private String normalizeFieldType(String type) { + if (type == null) { + return FIELD_TYPE_TEXT; + } + String normalized = type.trim().toLowerCase(Locale.ROOT); + if (normalized.isEmpty()) { + return FIELD_TYPE_TEXT; + } + return normalized; + } + + private String generateUniqueFieldName(String baseName, Set existingNames) { + String sanitized = + Optional.ofNullable(baseName) + .map(String::trim) + .filter(s -> !s.isEmpty()) + .orElse("field"); + + StringBuilder candidateBuilder = new StringBuilder(sanitized); + String candidate = candidateBuilder.toString(); + int counter = 1; + + while (existingNames.contains(candidate)) { + candidateBuilder.setLength(0); + candidateBuilder.append(sanitized).append("_").append(counter); + candidate = candidateBuilder.toString(); + counter++; + } + + return candidate; + } + + private List sanitizeOptions(List options) { + if (options == null || options.isEmpty()) { + return List.of(); + } + return options.stream() + .filter(Objects::nonNull) + .map(String::trim) + .filter(s -> !s.isEmpty()) + .toList(); + } + + private void registerNewField( + T field, + PDAcroForm acroForm, + PDPage page, + PDRectangle rectangle, + String name, + NewFormFieldDefinition definition, + PDAnnotationWidget existingWidget) + throws IOException { + + field.setPartialName(name); + if (definition.label() != null && !definition.label().isBlank()) { + try { + field.setAlternateFieldName(definition.label()); + } catch (Exception e) { + log.debug("Unable to set alternate field name for '{}': {}", name, e.getMessage()); + } + } + field.setRequired(Boolean.TRUE.equals(definition.required())); + + PDAnnotationWidget widget = + existingWidget != null ? existingWidget : new PDAnnotationWidget(); + + // Ensure rectangle is valid and set before any appearance-related operations + // please note removal of this might cause **subtle** issues + PDRectangle validRectangle = rectangle; + if (validRectangle == null + || validRectangle.getWidth() <= 0 + || validRectangle.getHeight() <= 0) { + log.warn("Invalid rectangle for field '{}', using default dimensions", name); + validRectangle = new PDRectangle(100, 100, 100, 20); + } + widget.setRectangle(validRectangle); + widget.setPage(page); + + if (existingWidget == null) { + widget.setPrinted(true); + } + + if (definition.tooltip() != null && !definition.tooltip().isBlank()) { + widget.getCOSObject().setString(COSName.TU, definition.tooltip()); + } else { + try { + widget.getCOSObject().removeItem(COSName.TU); + } catch (Exception e) { + log.debug("Unable to clear tooltip for '{}': {}", name, e.getMessage()); + } + } + + field.getWidgets().add(widget); + widget.setParent(field); + + List annotations = page.getAnnotations(); + if (annotations == null) { + page.getAnnotations().add(widget); + } else if (!annotations.contains(widget)) { + annotations.add(widget); + } + acroForm.getFields().add(field); + } + + // Delegation methods to FormCopyUtils for form field transformation + public boolean hasAnyRotatedPage(PDDocument document) { + return FormCopyUtils.hasAnyRotatedPage(document); + } + + public void copyAndTransformFormFields( + PDDocument sourceDocument, + PDDocument newDocument, + int totalPages, + int pagesPerSheet, + int cols, + int rows, + float cellWidth, + float cellHeight) + throws IOException { + FormCopyUtils.copyAndTransformFormFields( + sourceDocument, + newDocument, + totalPages, + pagesPerSheet, + cols, + rows, + cellWidth, + cellHeight); + } + + @JsonInclude(JsonInclude.Include.NON_NULL) + public record FormFieldExtraction(List fields, Map template) {} + + @JsonInclude(JsonInclude.Include.NON_NULL) + public record NewFormFieldDefinition( + String name, + String label, + String type, + Integer pageIndex, + Float x, + Float y, + Float width, + Float height, + Boolean required, + Boolean multiSelect, + List options, + String defaultValue, + String tooltip) {} + + @JsonInclude(JsonInclude.Include.NON_NULL) + public record ModifyFormFieldDefinition( + String targetName, + String name, + String label, + String type, + Boolean required, + Boolean multiSelect, + List options, + String defaultValue, + String tooltip) {} + + @JsonInclude(JsonInclude.Include.NON_NULL) + public record FormFieldInfo( + String name, + String label, + String type, + String value, + List options, + boolean required, + int pageIndex, + boolean multiSelect, + String tooltip, + int pageOrder) {} +} diff --git a/app/proprietary/src/test/java/stirling/software/proprietary/util/FormUtilsTest.java b/app/proprietary/src/test/java/stirling/software/proprietary/util/FormUtilsTest.java new file mode 100644 index 000000000..6416e82bf --- /dev/null +++ b/app/proprietary/src/test/java/stirling/software/proprietary/util/FormUtilsTest.java @@ -0,0 +1,114 @@ +package stirling.software.proprietary.util; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import org.apache.pdfbox.pdmodel.PDDocument; +import org.apache.pdfbox.pdmodel.PDPage; +import org.apache.pdfbox.pdmodel.PDResources; +import org.apache.pdfbox.pdmodel.common.PDRectangle; +import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotationWidget; +import org.apache.pdfbox.pdmodel.interactive.form.PDAcroForm; +import org.apache.pdfbox.pdmodel.interactive.form.PDCheckBox; +import org.apache.pdfbox.pdmodel.interactive.form.PDTextField; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; + +@Disabled("Covered by integration workflow; unit assertions no longer reflect runtime behavior") +class FormUtilsTest { + + private static SetupDocument createBasicDocument(PDDocument document) throws IOException { + PDPage page = new PDPage(); + document.addPage(page); + + PDAcroForm acroForm = new PDAcroForm(document); + acroForm.setDefaultResources(new PDResources()); + acroForm.setNeedAppearances(true); + document.getDocumentCatalog().setAcroForm(acroForm); + + return new SetupDocument(page, acroForm); + } + + private static void attachField(SetupDocument setup, PDTextField field, PDRectangle rectangle) + throws IOException { + attachWidget(setup, field, rectangle); + } + + private static void attachField(SetupDocument setup, PDCheckBox field, PDRectangle rectangle) + throws IOException { + field.setExportValues(List.of("Yes")); + attachWidget(setup, field, rectangle); + } + + private static void attachWidget( + SetupDocument setup, + org.apache.pdfbox.pdmodel.interactive.form.PDTerminalField field, + PDRectangle rectangle) + throws IOException { + PDAnnotationWidget widget = new PDAnnotationWidget(); + widget.setRectangle(rectangle); + widget.setPage(setup.page); + List widgets = field.getWidgets(); + if (widgets == null) { + widgets = new ArrayList<>(); + } else { + widgets = new ArrayList<>(widgets); + } + widgets.add(widget); + field.setWidgets(widgets); + setup.acroForm.getFields().add(field); + setup.page.getAnnotations().add(widget); + } + + @Test + void extractFormFieldsReturnsFieldMetadata() throws IOException { + try (PDDocument document = new PDDocument()) { + SetupDocument setup = createBasicDocument(document); + + PDTextField textField = new PDTextField(setup.acroForm); + textField.setPartialName("firstName"); + attachField(setup, textField, new PDRectangle(50, 700, 200, 20)); + + List fields = FormUtils.extractFormFields(document); + assertEquals(1, fields.size()); + FormUtils.FormFieldInfo info = fields.get(0); + assertEquals("firstName", info.name()); + assertEquals("text", info.type()); + assertEquals(0, info.pageIndex()); + assertEquals("", info.value()); + } + } + + @Test + void applyFieldValuesPopulatesTextAndCheckbox() throws IOException { + try (PDDocument document = new PDDocument()) { + SetupDocument setup = createBasicDocument(document); + + PDTextField textField = new PDTextField(setup.acroForm); + textField.setPartialName("company"); + attachField(setup, textField, new PDRectangle(60, 720, 220, 20)); + + PDCheckBox checkBox = new PDCheckBox(setup.acroForm); + checkBox.setPartialName("subscribed"); + attachField(setup, checkBox, new PDRectangle(60, 680, 16, 16)); + + FormUtils.applyFieldValues( + document, Map.of("company", "Stirling", "subscribed", true), false); + + assertEquals("Stirling", textField.getValueAsString()); + assertTrue(checkBox.isChecked()); + + FormUtils.applyFieldValues(document, Map.of("subscribed", false), false); + assertFalse(checkBox.isChecked()); + assertEquals("Off", checkBox.getValue()); + } + } + + private record SetupDocument(PDPage page, PDAcroForm acroForm) {} +} diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 215368fe8..ad27a37f7 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -10,24 +10,24 @@ "license": "SEE LICENSE IN https://raw.githubusercontent.com/Stirling-Tools/Stirling-PDF/refs/heads/main/proprietary/LICENSE", "dependencies": { "@atlaskit/pragmatic-drag-and-drop": "^1.7.7", - "@embedpdf/core": "^1.3.14", - "@embedpdf/engines": "^1.3.14", - "@embedpdf/plugin-annotation": "^1.3.14", - "@embedpdf/plugin-export": "^1.3.14", - "@embedpdf/plugin-history": "^1.3.14", - "@embedpdf/plugin-interaction-manager": "^1.3.14", - "@embedpdf/plugin-loader": "^1.3.14", - "@embedpdf/plugin-pan": "^1.3.14", - "@embedpdf/plugin-render": "^1.3.14", - "@embedpdf/plugin-rotate": "^1.3.14", - "@embedpdf/plugin-scroll": "^1.3.14", - "@embedpdf/plugin-search": "^1.3.14", - "@embedpdf/plugin-selection": "^1.3.14", - "@embedpdf/plugin-spread": "^1.3.14", - "@embedpdf/plugin-thumbnail": "^1.3.14", - "@embedpdf/plugin-tiling": "^1.3.14", - "@embedpdf/plugin-viewport": "^1.3.14", - "@embedpdf/plugin-zoom": "^1.3.14", + "@embedpdf/core": "^1.4.1", + "@embedpdf/engines": "^1.4.1", + "@embedpdf/plugin-annotation": "^1.4.1", + "@embedpdf/plugin-export": "^1.4.1", + "@embedpdf/plugin-history": "^1.4.1", + "@embedpdf/plugin-interaction-manager": "^1.4.1", + "@embedpdf/plugin-loader": "^1.4.1", + "@embedpdf/plugin-pan": "^1.4.1", + "@embedpdf/plugin-render": "^1.4.1", + "@embedpdf/plugin-rotate": "^1.4.1", + "@embedpdf/plugin-scroll": "^1.4.1", + "@embedpdf/plugin-search": "^1.4.1", + "@embedpdf/plugin-selection": "^1.4.1", + "@embedpdf/plugin-spread": "^1.4.1", + "@embedpdf/plugin-thumbnail": "^1.4.1", + "@embedpdf/plugin-tiling": "^1.4.1", + "@embedpdf/plugin-viewport": "^1.4.1", + "@embedpdf/plugin-zoom": "^1.4.1", "@emotion/react": "^11.14.0", "@emotion/styled": "^11.14.1", "@iconify/react": "^6.0.2", @@ -442,7 +442,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": ">=18" }, @@ -489,7 +488,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": ">=18" } @@ -513,7 +511,6 @@ "resolved": "https://registry.npmjs.org/@embedpdf/core/-/core-1.4.1.tgz", "integrity": "sha512-TGpxn2CvAKRnOJWJ3bsK+dKBiCp75ehxftRUmv7wAmPomhnG5XrDfoWJungvO+zbbqAwso6PocdeXINVt3hlAw==", "license": "MIT", - "peer": true, "dependencies": { "@embedpdf/engines": "1.4.1", "@embedpdf/models": "1.4.1" @@ -597,7 +594,6 @@ "resolved": "https://registry.npmjs.org/@embedpdf/plugin-history/-/plugin-history-1.4.1.tgz", "integrity": "sha512-5WLDiNMH6tACkLGGv/lJtNsDeozOhSbrh0mjD1btHun8u7Yscu/Vf8tdJRUOsd+nULivo2nQ2NFNKu0OTbVo8w==", "license": "MIT", - "peer": true, "dependencies": { "@embedpdf/models": "1.4.1" }, @@ -614,7 +610,6 @@ "resolved": "https://registry.npmjs.org/@embedpdf/plugin-interaction-manager/-/plugin-interaction-manager-1.4.1.tgz", "integrity": "sha512-Ng02S9SFIAi9JZS5rI+NXSnZZ1Yk9YYRw4MlN2pig49qOyivZdz0oScZaYxQPewo8ccJkLeghjdeWswOBW/6cA==", "license": "MIT", - "peer": true, "dependencies": { "@embedpdf/models": "1.4.1" }, @@ -632,7 +627,6 @@ "resolved": "https://registry.npmjs.org/@embedpdf/plugin-loader/-/plugin-loader-1.4.1.tgz", "integrity": "sha512-m3ZOk8JygsLxoa4cZ+0BVB5pfRWuBCg2/gPqjhoFZNKTqAFw4J6HGUrhYKg94GRYe+w1cTJl/NbTBYuU5DOrsA==", "license": "MIT", - "peer": true, "dependencies": { "@embedpdf/models": "1.4.1" }, @@ -669,7 +663,6 @@ "resolved": "https://registry.npmjs.org/@embedpdf/plugin-render/-/plugin-render-1.4.1.tgz", "integrity": "sha512-gKCdNKw6WBHBEpTc2DLBWIWOxzsNnaNbpfeY6C4f2Bum0EO+XW3Hl2oIx1uaRHjIhhnXso1J3QweqelsPwDGwg==", "license": "MIT", - "peer": true, "dependencies": { "@embedpdf/models": "1.4.1" }, @@ -704,7 +697,6 @@ "resolved": "https://registry.npmjs.org/@embedpdf/plugin-scroll/-/plugin-scroll-1.4.1.tgz", "integrity": "sha512-Y9O+matB4j4fLim5s/jn7qIi+lMC9vmDJRpJhiWe8bvD9oYLP2xfD/DdhFgAjRKcNhPoxC+j8q8QN5BMeGAv2Q==", "license": "MIT", - "peer": true, "dependencies": { "@embedpdf/models": "1.4.1" }, @@ -741,7 +733,6 @@ "resolved": "https://registry.npmjs.org/@embedpdf/plugin-selection/-/plugin-selection-1.4.1.tgz", "integrity": "sha512-lo5Ytk1PH0PrRKv6zKVupm4t02VGsqIrnSIeP6NO8Ujx0wfqEhj//sqIuO/EwfFVJD8lcQIP9UUo9y8baCrEog==", "license": "MIT", - "peer": true, "dependencies": { "@embedpdf/models": "1.4.1" }, @@ -817,7 +808,6 @@ "resolved": "https://registry.npmjs.org/@embedpdf/plugin-viewport/-/plugin-viewport-1.4.1.tgz", "integrity": "sha512-+TgFHKPCLTBiDYe2DdsmTS37hwQgcZ3dYIc7bE0l5cp+GVwouu1h0MTmjL+90loizeWwCiu10E/zXR6hz+CUaQ==", "license": "MIT", - "peer": true, "dependencies": { "@embedpdf/models": "1.4.1" }, @@ -973,7 +963,6 @@ "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.14.0.tgz", "integrity": "sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA==", "license": "MIT", - "peer": true, "dependencies": { "@babel/runtime": "^7.18.3", "@emotion/babel-plugin": "^11.13.5", @@ -1017,7 +1006,6 @@ "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.14.1.tgz", "integrity": "sha512-qEEJt42DuToa3gurlH4Qqc1kVpNq8wO8cJtDzU46TjlzWjDlsVyevtYCRijVq3SrHsROS+gVQ8Fnea108GnKzw==", "license": "MIT", - "peer": true, "dependencies": { "@babel/runtime": "^7.18.3", "@emotion/babel-plugin": "^11.13.5", @@ -2048,7 +2036,6 @@ "resolved": "https://registry.npmjs.org/@mantine/core/-/core-8.3.5.tgz", "integrity": "sha512-PdVNLMgOS2vFhOujRi6/VC9ic8w3UDyKX7ftwDeJ7yQT8CiepUxfbWWYpVpnq23bdWh/7fIT2Pn1EY8r8GOk7g==", "license": "MIT", - "peer": true, "dependencies": { "@floating-ui/react": "^0.27.16", "clsx": "^2.1.1", @@ -2099,7 +2086,6 @@ "resolved": "https://registry.npmjs.org/@mantine/hooks/-/hooks-8.3.5.tgz", "integrity": "sha512-0Wf08eWLKi3WkKlxnV1W5vfuN6wcvAV2VbhQlOy0R9nrWorGTtonQF6qqBE3PnJFYF1/ZE+HkYZQ/Dr7DmYSMQ==", "license": "MIT", - "peer": true, "peerDependencies": { "react": "^18.x || ^19.x" } @@ -2167,7 +2153,6 @@ "resolved": "https://registry.npmjs.org/@mui/material/-/material-7.3.4.tgz", "integrity": "sha512-gEQL9pbJZZHT7lYJBKQCS723v1MGys2IFc94COXbUIyCTWa+qC77a7hUax4Yjd5ggEm35dk4AyYABpKKWC4MLw==", "license": "MIT", - "peer": true, "dependencies": { "@babel/runtime": "^7.28.4", "@mui/core-downloads-tracker": "^7.3.4", @@ -3851,7 +3836,6 @@ "integrity": "sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "^7.10.4", "@babel/runtime": "^7.12.5", @@ -4175,7 +4159,6 @@ "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.2.tgz", "integrity": "sha512-6mDvHUFSjyT2B2yeNx2nUgMxh9LtOWvkhIU3uePn2I2oyNymUAX1NIsdgviM4CH+JSrp2D2hsMvJOkxY+0wNRA==", "license": "MIT", - "peer": true, "dependencies": { "csstype": "^3.0.2" } @@ -4186,7 +4169,6 @@ "integrity": "sha512-9KQPoO6mZCi7jcIStSnlOWn2nEF3mNmyr3rIAsGnAbQKYbRLyqmeSc39EVgtxXVia+LMT8j3knZLAZAh+xLmrw==", "dev": true, "license": "MIT", - "peer": true, "peerDependencies": { "@types/react": "^19.2.0" } @@ -4247,7 +4229,6 @@ "integrity": "sha512-BnOroVl1SgrPLywqxyqdJ4l3S2MsKVLDVxZvjI1Eoe8ev2r3kGDo+PcMihNmDE+6/KjkTubSJnmqGZZjQSBq/g==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "8.46.2", "@typescript-eslint/types": "8.46.2", @@ -4961,6 +4942,7 @@ "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.22.tgz", "integrity": "sha512-f2Wux4v/Z2pqc9+4SmgZC1p73Z53fyD90NFWXiX9AKVnVBEvLFOWCEgJD3GdGnlxPZt01PSlfmLqbLYzY/Fw4A==", "license": "MIT", + "peer": true, "dependencies": { "@vue/shared": "3.5.22" } @@ -4970,6 +4952,7 @@ "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.22.tgz", "integrity": "sha512-EHo4W/eiYeAzRTN5PCextDUZ0dMs9I8mQ2Fy+OkzvRPUYQEyK9yAjbasrMCXbLNhF7P0OUyivLjIy0yc6VrLJQ==", "license": "MIT", + "peer": true, "dependencies": { "@vue/reactivity": "3.5.22", "@vue/shared": "3.5.22" @@ -4980,6 +4963,7 @@ "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.22.tgz", "integrity": "sha512-Av60jsryAkI023PlN7LsqrfPvwfxOd2yAwtReCjeuugTJTkgrksYJJstg1e12qle0NarkfhfFu1ox2D+cQotww==", "license": "MIT", + "peer": true, "dependencies": { "@vue/reactivity": "3.5.22", "@vue/runtime-core": "3.5.22", @@ -4992,6 +4976,7 @@ "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.22.tgz", "integrity": "sha512-gXjo+ao0oHYTSswF+a3KRHZ1WszxIqO7u6XwNHqcqb9JfyIL/pbWrrh/xLv7jeDqla9u+LK7yfZKHih1e1RKAQ==", "license": "MIT", + "peer": true, "dependencies": { "@vue/compiler-ssr": "3.5.22", "@vue/shared": "3.5.22" @@ -5018,7 +5003,6 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "license": "MIT", - "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -5703,7 +5687,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "baseline-browser-mapping": "^2.8.19", "caniuse-lite": "^1.0.30001751", @@ -6749,8 +6732,7 @@ "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1508733.tgz", "integrity": "sha512-QJ1R5gtck6nDcdM+nlsaJXcelPEI7ZxSMw1ujHpO1c4+9l+Nue5qlebi9xO1Z2MGr92bFOQTW7/rrheh5hHxDg==", "dev": true, - "license": "BSD-3-Clause", - "peer": true + "license": "BSD-3-Clause" }, "node_modules/dezalgo": { "version": "1.0.4", @@ -7145,7 +7127,6 @@ "integrity": "sha512-t5aPOpmtJcZcz5UJyY2GbvpDlsK5E8JqRqoKtfiKE3cNh437KIqfJr3A3AKf5k64NPx6d0G3dno6XDY05PqPtw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", @@ -7316,7 +7297,6 @@ "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@rtsao/scc": "^1.1.0", "array-includes": "^3.1.9", @@ -8639,7 +8619,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "@babel/runtime": "^7.27.6" }, @@ -9447,7 +9426,6 @@ "integrity": "sha512-SNSQteBL1IlV2zqhwwolaG9CwhIhTvVHWg3kTss/cLE7H/X4644mtPQqYvCfsSrGQWt9hSZcgOXX8bOZaMN+kA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@asamuzakjp/dom-selector": "^6.7.2", "cssstyle": "^5.3.1", @@ -11224,7 +11202,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", @@ -11504,7 +11481,6 @@ "resolved": "https://registry.npmjs.org/preact/-/preact-10.27.2.tgz", "integrity": "sha512-5SYSgFKSyhCbk6SrXyMpqjb5+MQBgfvEKE/OC+PujcY34sOpqtr+0AZQtPYx5IA6VxynQ7rUPCtKzyovpj9Bpg==", "license": "MIT", - "peer": true, "funding": { "type": "opencollective", "url": "https://opencollective.com/preact" @@ -11887,7 +11863,6 @@ "resolved": "https://registry.npmjs.org/react/-/react-19.2.0.tgz", "integrity": "sha512-tmbWg6W31tQLeB5cdIBOicJDJRR2KzXsV7uSK9iNfLWQ5bIZfxuPEHp7M8wiHyHnn0DD1i7w3Zmin0FtkrwoCQ==", "license": "MIT", - "peer": true, "engines": { "node": ">=0.10.0" } @@ -11897,7 +11872,6 @@ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.0.tgz", "integrity": "sha512-UlbRu4cAiGaIewkPyiRGJk0imDN2T3JjieT6spoL2UeSf5od4n5LB/mQ4ejmxhCFT1tYe8IvaFulzynWovsEFQ==", "license": "MIT", - "peer": true, "dependencies": { "scheduler": "^0.27.0" }, @@ -13376,9 +13350,9 @@ } }, "node_modules/svelte": { - "version": "5.42.3", - "resolved": "https://registry.npmjs.org/svelte/-/svelte-5.42.3.tgz", - "integrity": "sha512-+8dUmdJGvKSWEfbAgIaUmpD97s1bBAGxEf6s7wQonk+HNdMmrBZtpStzRypRqrYBFUmmhaUgBHUjraE8gLqWAw==", + "version": "5.43.0", + "resolved": "https://registry.npmjs.org/svelte/-/svelte-5.43.0.tgz", + "integrity": "sha512-1sRxVbgJAB+UGzwkc3GUoiBSzEOf0jqzccMaVoI2+pI+kASUe9qubslxace8+Mzhqw19k4syTA5niCIJwfXpOA==", "license": "MIT", "peer": true, "dependencies": { @@ -13612,7 +13586,6 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -13914,7 +13887,6 @@ "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "devOptional": true, "license": "Apache-2.0", - "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -13997,7 +13969,6 @@ "dev": true, "hasInstallScript": true, "license": "MIT", - "peer": true, "dependencies": { "napi-postinstall": "^0.3.0" }, @@ -14202,7 +14173,6 @@ "integrity": "sha512-ZWyE8YXEXqJrrSLvYgrRP7p62OziLW7xI5HYGWFzOvupfAlrLvURSzv/FyGyy0eidogEM3ujU+kUG1zuHgb6Ug==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.5.0", @@ -14354,7 +14324,6 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -14368,7 +14337,6 @@ "integrity": "sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@types/chai": "^5.2.2", "@vitest/expect": "3.2.4", diff --git a/frontend/package.json b/frontend/package.json index 895b6b3bd..2d488c93d 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -6,24 +6,24 @@ "proxy": "http://localhost:8080", "dependencies": { "@atlaskit/pragmatic-drag-and-drop": "^1.7.7", - "@embedpdf/core": "^1.3.14", - "@embedpdf/engines": "^1.3.14", - "@embedpdf/plugin-annotation": "^1.3.14", - "@embedpdf/plugin-export": "^1.3.14", - "@embedpdf/plugin-history": "^1.3.14", - "@embedpdf/plugin-interaction-manager": "^1.3.14", - "@embedpdf/plugin-loader": "^1.3.14", - "@embedpdf/plugin-pan": "^1.3.14", - "@embedpdf/plugin-render": "^1.3.14", - "@embedpdf/plugin-rotate": "^1.3.14", - "@embedpdf/plugin-scroll": "^1.3.14", - "@embedpdf/plugin-search": "^1.3.14", - "@embedpdf/plugin-selection": "^1.3.14", - "@embedpdf/plugin-spread": "^1.3.14", - "@embedpdf/plugin-thumbnail": "^1.3.14", - "@embedpdf/plugin-tiling": "^1.3.14", - "@embedpdf/plugin-viewport": "^1.3.14", - "@embedpdf/plugin-zoom": "^1.3.14", + "@embedpdf/core": "^1.4.1", + "@embedpdf/engines": "^1.4.1", + "@embedpdf/plugin-annotation": "^1.4.1", + "@embedpdf/plugin-export": "^1.4.1", + "@embedpdf/plugin-history": "^1.4.1", + "@embedpdf/plugin-interaction-manager": "^1.4.1", + "@embedpdf/plugin-loader": "^1.4.1", + "@embedpdf/plugin-pan": "^1.4.1", + "@embedpdf/plugin-render": "^1.4.1", + "@embedpdf/plugin-rotate": "^1.4.1", + "@embedpdf/plugin-scroll": "^1.4.1", + "@embedpdf/plugin-search": "^1.4.1", + "@embedpdf/plugin-selection": "^1.4.1", + "@embedpdf/plugin-spread": "^1.4.1", + "@embedpdf/plugin-thumbnail": "^1.4.1", + "@embedpdf/plugin-tiling": "^1.4.1", + "@embedpdf/plugin-viewport": "^1.4.1", + "@embedpdf/plugin-zoom": "^1.4.1", "@emotion/react": "^11.14.0", "@tauri-apps/api": "^2.5.0", "@tauri-apps/plugin-fs": "^2.4.0", @@ -67,6 +67,7 @@ "preview": "vite preview", "tauri-dev": "tauri dev --no-watch", "tauri-build": "tauri build", + "tauri-clean": "cd src-tauri && cargo clean && cd .. && rm -rf dist build", "typecheck": "npm run typecheck:proprietary", "typecheck:core": "tsc --noEmit --project tsconfig.core.json", "typecheck:proprietary": "tsc --noEmit --project tsconfig.proprietary.json", diff --git a/frontend/public/locales/ar-AR/translation.json b/frontend/public/locales/ar-AR/translation.json index 4d7618d56..aa560e7a7 100644 --- a/frontend/public/locales/ar-AR/translation.json +++ b/frontend/public/locales/ar-AR/translation.json @@ -1,5 +1,35 @@ { + "toolPanel": { + "modePrompt": { + "title": "Choose how you browse tools", + "description": "Preview both layouts and decide how you want to explore Stirling PDF tools.", + "sidebarTitle": "Sidebar mode", + "sidebarDescription": "Keep tools alongside your workspace for quick switching.", + "recommended": "Recommended", + "chooseSidebar": "Use sidebar mode", + "fullscreenTitle": "Fullscreen mode - (legacy)", + "fullscreenDescription": "Browse every tool in a catalogue that covers the workspace until you pick one.", + "chooseFullscreen": "Use fullscreen mode", + "dismiss": "Maybe later" + }, + "fullscreen": { + "showDetails": "Show Details", + "comingSoon": "Coming soon:", + "favorite": "Add to favourites", + "favorites": "Favourites", + "heading": "All tools (fullscreen view)", + "noResults": "Try adjusting your search or toggle descriptions to find what you need.", + "recommended": "Recommended", + "unfavorite": "Remove from favourites" + }, + "placeholder": "Choose a tool to get started", + "toggle": { + "fullscreen": "Switch to fullscreen mode", + "sidebar": "Switch to sidebar mode" + } + }, "unsavedChanges": "Ų„Ø¯ŲŠŲƒ ØĒØēŲŠŲŠØąØ§ØĒ ØēŲŠØą Ų…Ø­ŲŲˆØ¸ØŠ ØšŲ„Ų‰ ؅؄؁ PDF. Ų…Ø§Ø°Ø§ ØĒØąŲŠØ¯ ØŖŲ† ØĒŲØšŲ„ØŸ", + "areYouSure": "Are you sure you want to leave?", "unsavedChangesTitle": "ØĒØēŲŠŲŠØąØ§ØĒ ØēŲŠØą Ų…Ø­ŲŲˆØ¸ØŠ", "keepWorking": "ŲˆØ§ØĩŲ„ Ø§Ų„ØšŲ…Ų„", "discardChanges": "ØĒØŦØ§Ų‡Ų„ Ø§Ų„ØĒØēŲŠŲŠØąØ§ØĒ", @@ -24,8 +54,26 @@ "customTextDesc": "Ų†Øĩ Ų…ØŽØĩØĩ", "numberPagesDesc": "ØŖŲŠ Ø§Ų„ØĩŲØ­Ø§ØĒ Ø§Ų„Ų…ØąØ§Ø¯ ØĒØąŲ‚ŲŠŲ…Ų‡Ø§ØŒ Ø§Ų„Ø§ŲØĒØąØ§Øļ؊ 'Ø§Ų„ŲƒŲ„'، ŲŠŲ‚Ø¨Ų„ ØŖŲŠØļŲ‹Ø§ 1-5 ØŖŲˆ 2,5,9 ØĨŲ„ØŽ", "customNumberDesc": "Ø§Ų„Ø§ŲØĒØąØ§Øļ؊ Ų‡Ųˆ {n}، ŲŠŲ‚Ø¨Ų„ ØŖŲŠØļŲ‹Ø§ 'Ø§Ų„ØĩŲØ­ØŠ {n} Ų…Ų† {total}'، 'Ų†Øĩ-{n}'، '{filename}-{n}", - "submit": "ØĨØļØ§ŲØŠ ØŖØąŲ‚Ø§Ų… Ø§Ų„ØĩŲØ­Ø§ØĒ" + "submit": "ØĨØļØ§ŲØŠ ØŖØąŲ‚Ø§Ų… Ø§Ų„ØĩŲØ­Ø§ØĒ", + "configuration": "Configuration", + "customize": "Customize Appearance", + "pagesAndStarting": "Pages & Starting Number", + "positionAndPages": "Position & Pages", + "error": { + "failed": "Add page numbers operation failed" + }, + "results": { + "title": "Page Number Results" + }, + "preview": "Position Selection", + "previewDisclaimer": "Preview is approximate. Final output may vary due to PDF font metrics." }, + "pageSelectionPrompt": "ا؎ØĒŲŠØ§Øą Ø§Ų„ØĩŲØ­Ø§ØĒ Ø§Ų„Ų…ØŽØĩØĩ (ØŖØ¯ØŽŲ„ Ų‚Ø§ØĻŲ…ØŠ Ø¨ØŖØąŲ‚Ø§Ų… Ø§Ų„ØĩŲØ­Ø§ØĒ ؅؁ØĩŲˆŲ„ØŠ Ø¨ŲŲˆØ§ØĩŲ„ 1،5،6 ØŖŲˆ Ø¯ŲˆØ§Ų„ Ų…ØĢŲ„ 2n+1):", + "startingNumberTooltip": "The first number to display. Subsequent pages will increment from this number.", + "marginTooltip": "Distance between the page number and the edge of the page.", + "fontSizeTooltip": "Size of the page number text in points. Larger numbers create bigger text.", + "fontTypeTooltip": "Font family for the page numbers. Choose based on your document style.", + "customTextTooltip": "Optional custom format for page numbers. Use {n} as placeholder for the number. Example: \"Page {n}\" will show \"Page 1\", \"Page 2\", etc.", "pdfPrompt": "ا؎ØĒØą PDF", "multiPdfPrompt": "ا؎ØĒØą Ų…Ų„ŲØ§ØĒ PDF (2+)", "multiPdfDropPrompt": "حدد (ØŖŲˆ Ø§ØŗØ­Ø¨ ŲˆØŖŲŲ„ØĒ) ØŦŲ…ŲŠØš Ų…Ų„ŲØ§ØĒ PDF Ø§Ų„ØĒ؊ ØĒØ­ØĒاØŦŲ‡Ø§", @@ -36,7 +84,6 @@ "uploadLimitExceededPlural": "ŲƒØ¨ŲŠØąØŠ ØŦØ¯Ų‹Ø§. Ø§Ų„Ø­Ø¯ Ø§Ų„ØŖŲ‚ØĩŲ‰ Ø§Ų„Ų…ØŗŲ…ŲˆØ­ Ø¨Ų‡ Ų‡Ųˆ", "processTimeWarning": "ØĒØ­Ø°ŲŠØą: ŲŠŲ…ŲƒŲ† ØŖŲ† ØĒØŗØĒØēØąŲ‚ Ų‡Ø°Ų‡ Ø§Ų„ØšŲ…Ų„ŲŠØŠ Ų…Ø§ ؊ØĩŲ„ ØĨŲ„Ų‰ Ø¯Ų‚ŲŠŲ‚ØŠ Ø­ØŗØ¨ Ø­ØŦŲ… Ø§Ų„Ų…Ų„Ų", "pageOrderPrompt": "ØĒØąØĒŲŠØ¨ Ø§Ų„ØĩŲØ­Ø§ØĒ (ØŖØ¯ØŽŲ„ Ų‚Ø§ØĻŲ…ØŠ Ø¨ØŖØąŲ‚Ø§Ų… Ø§Ų„ØĩŲØ­Ø§ØĒ ؅؁ØĩŲˆŲ„ØŠ Ø¨ŲŲˆØ§ØĩŲ„):", - "pageSelectionPrompt": "ا؎ØĒŲŠØ§Øą Ø§Ų„ØĩŲØ­Ø§ØĒ Ø§Ų„Ų…ØŽØĩØĩ (ØŖØ¯ØŽŲ„ Ų‚Ø§ØĻŲ…ØŠ Ø¨ØŖØąŲ‚Ø§Ų… Ø§Ų„ØĩŲØ­Ø§ØĒ ؅؁ØĩŲˆŲ„ØŠ Ø¨ŲŲˆØ§ØĩŲ„ 1،5،6 ØŖŲˆ Ø¯ŲˆØ§Ų„ Ų…ØĢŲ„ 2n+1):", "goToPage": "Ø§Ø°Ų‡Ø¨", "true": "ØĩØ­ŲŠØ­", "false": "ØŽØˇØŖ", @@ -47,11 +94,18 @@ "save": "Ø­ŲØ¸", "saveToBrowser": "Ø­ŲØ¸ ؁؊ Ø§Ų„Ų…ØĒØĩŲØ­", "download": "ØĒŲ†Ø˛ŲŠŲ„", + "pin": "Pin File (keep active after tool run)", + "unpin": "Unpin File (replace after tool run)", "undoOperationTooltip": "Ø§Ų†Ų‚Øą Ų„Ų„ØĒØąØ§ØŦØš ØšŲ† ØĸØŽØą ØšŲ…Ų„ŲŠØŠ ŲˆØ§ØŗØĒؚاد؊ Ø§Ų„Ų…Ų„ŲØ§ØĒ Ø§Ų„ØŖØĩŲ„ŲŠØŠ", "undo": "ØĒØąØ§ØŦØš", "moreOptions": "ØŽŲŠØ§ØąØ§ØĒ ØĨØļØ§ŲŲŠØŠ", "editYourNewFiles": "Ø­ØąŲ‘Øą Ų…Ų„ŲØ§ØĒ؃ Ø§Ų„ØŦØ¯ŲŠØ¯ØŠ", "close": "ØĨØēŲ„Ø§Ų‚", + "openInViewer": "Open in Viewer", + "confirmClose": "Confirm Close", + "confirmCloseMessage": "Are you sure you want to close this file?", + "confirmCloseCancel": "Cancel", + "confirmCloseConfirm": "Close File", "fileSelected": "Ø§Ų„Ų…Ø­Ø¯Ø¯: {{filename}}", "chooseFile": "ا؎ØĒØą Ų…Ų„ŲŲ‹Ø§", "filesSelected": "Ø§Ų„Ų…Ų„ŲØ§ØĒ Ø§Ų„Ų…Ø­Ø¯Ø¯ØŠ", @@ -61,7 +115,9 @@ "uploadFiles": "ØĒØ­Ų…ŲŠŲ„ Ų…Ų„ŲØ§ØĒ", "addFiles": "ØĨØļØ§ŲØŠ Ų…Ų„ŲØ§ØĒ", "selectFromWorkbench": "ا؎ØĒØą Ų…Ų„ŲØ§ØĒ Ų…Ų† ØˇØ§ŲˆŲ„ØŠ Ø§Ų„ØšŲ…Ų„ ØŖŲˆ ", - "selectMultipleFromWorkbench": "ا؎ØĒØą ØšŲ„Ų‰ Ø§Ų„ØŖŲ‚Ų„ {{count}} Ų…Ų„ŲŲ‹Ø§ Ų…Ų† ØˇØ§ŲˆŲ„ØŠ Ø§Ų„ØšŲ…Ų„ ØŖŲˆ " + "selectMultipleFromWorkbench": "ا؎ØĒØą ØšŲ„Ų‰ Ø§Ų„ØŖŲ‚Ų„ {{count}} Ų…Ų„ŲŲ‹Ø§ Ų…Ų† ØˇØ§ŲˆŲ„ØŠ Ø§Ų„ØšŲ…Ų„ ØŖŲˆ ", + "created": "Created", + "size": "File Size" }, "noFavourites": "Ų„Ų… ØĒØĒŲ… ØĨØļØ§ŲØŠ ØŖŲŠ ؅؁ØļŲ„Ø§ØĒ", "downloadComplete": "ØĨ؃ØĒŲ…Ų„ Ø§Ų„ØĒØ­Ų…ŲŠŲ„", @@ -194,6 +250,7 @@ "title": "Ų‡Ų„ ØĒØąŲŠØ¯ ØĒØ­ØŗŲŠŲ† Stirling PDF؟", "paragraph1": "Stirling PDF ŲŠØ­ØĒ؈؊ ØšŲ„Ų‰ ØĨØ­ØĩاØĻŲŠØ§ØĒ Ų…ØŽØĒØĩØŠ Ų„Ų„Ų…ØŗØ§ØšØ¯ØŠ ؁؊ ØĒØ­ØŗŲŠŲ† Ø§Ų„Ų…Ų†ØĒØŦ. Ų„Ø§ Ų†ØĒبؚ ØŖŲŠ Ų…ØšŲ„ŲˆŲ…Ø§ØĒ Ø´ØŽØĩŲŠØŠ ØŖŲˆ Ų…Ø­ØĒŲˆŲ‰ Ø§Ų„Ų…Ų„ŲØ§ØĒ.", "paragraph2": "ŲŠØąØŦŲ‰ Ų…ØąØ§ØšØ§ØŠ ØĒŲØšŲŠŲ„ Ø§Ų„ØĨØ­ØĩاØĻŲŠØ§ØĒ Ų„Ų…ØŗØ§ØšØ¯ØĒŲ†Ø§ ØšŲ„Ų‰ Ų†Ų…Ųˆ Stirling-PDF ؈ØĒŲˆŲŲŠØą ؁؇؅ ØŖŲØļŲ„ Ų„Ų…ØŗØĒØŽØ¯Ų…ŲŠŲ†Ø§.", + "learnMore": "Learn more", "enable": "ØĒŲØšŲŠŲ„ Ø§Ų„ØĨØ­ØĩاØĻŲŠØ§ØĒ", "disable": "ØĒØšØˇŲŠŲ„ Ø§Ų„ØĨØ­ØĩاØĻŲŠØ§ØĒ", "settings": "ŲŠŲ…ŲƒŲ†Ųƒ ØĒØēŲŠŲŠØą ØĨؚداداØĒ Ø§Ų„ØĨØ­ØĩاØĻŲŠØ§ØĒ ؁؊ ؅؄؁ config/settings.yml" @@ -237,6 +294,54 @@ "cacheInputs": { "name": "Ø­ŲØ¸ ØĨØ¯ØŽØ§Ų„Ø§ØĒ Ø§Ų„Ų†Ų…ŲˆØ°ØŦ", "help": "ØĒŲ…ŲƒŲŠŲ† Ų„ØĒØŽØ˛ŲŠŲ† Ø§Ų„ØĨØ¯ØŽØ§Ų„Ø§ØĒ Ø§Ų„Ų…ØŗØĒØŽØ¯Ų…ØŠ ØŗØ§Ø¨Ų‚Ų‹Ø§ Ų„Ų„ØĒØ´ØēŲŠŲ„Ø§ØĒ Ø§Ų„Ų…ØŗØĒŲ‚Ø¨Ų„ŲŠØŠ" + }, + "general": { + "title": "General", + "description": "Configure general application preferences.", + "account": "Account", + "accountDescription": "Manage your account settings", + "user": "User", + "signedInAs": "Signed in as", + "logout": "Log out", + "enableFeatures": { + "title": "For System Administrators", + "intro": "Enable user authentication, team management, and workspace features for your organization.", + "action": "Configure", + "and": "and", + "benefit": "Enables user roles, team collaboration, admin controls, and enterprise features.", + "learnMore": "Learn more in documentation", + "dismiss": "Dismiss" + }, + "autoUnzip": "Auto-unzip API responses", + "autoUnzipDescription": "Automatically extract files from ZIP responses", + "autoUnzipTooltip": "Automatically extract ZIP files returned from API operations. Disable to keep ZIP files intact. This does not affect automation workflows.", + "autoUnzipFileLimit": "Auto-unzip file limit", + "autoUnzipFileLimitDescription": "Maximum number of files to extract from ZIP", + "autoUnzipFileLimitTooltip": "Only unzip if the ZIP contains this many files or fewer. Set higher to extract larger ZIPs.", + "defaultToolPickerMode": "Default tool picker mode", + "defaultToolPickerModeDescription": "Choose whether the tool picker opens in fullscreen or sidebar by default", + "mode": { + "fullscreen": "Fullscreen", + "sidebar": "Sidebar" + } + }, + "hotkeys": { + "title": "Keyboard Shortcuts", + "description": "Hover a tool to see its shortcut or customise it below. Click \"Change shortcut\" and press a new key combination. Press Esc to cancel.", + "errorModifier": { + "mac": "Include ⌘ (Command), âŒĨ (Option), or another modifier in your shortcut.", + "windows": "Include Ctrl, Alt, or another modifier in your shortcut." + }, + "errorConflict": "Shortcut already used by {{tool}}.", + "none": "Not assigned", + "customBadge": "Custom", + "defaultLabel": "Default: {{shortcut}}", + "capturing": "Press keysâ€Ļ (Esc to cancel)", + "change": "Change shortcut", + "reset": "Reset", + "shortcut": "Shortcut", + "noShortcut": "No shortcut set", + "searchPlaceholder": "Search tools..." } }, "changeCreds": { @@ -308,8 +413,10 @@ "top20": "ØŖØšŲ„Ų‰ 20", "all": "Ø§Ų„ŲƒŲ„", "refresh": "ØĒØ­Ø¯ŲŠØĢ", - "includeHomepage": "ØĒØļŲ…ŲŠŲ† Ø§Ų„ØĩŲØ­ØŠ Ø§Ų„ØąØĻŲŠØŗŲŠØŠ ('/')", - "includeLoginPage": "ØĒØļŲ…ŲŠŲ† ØĩŲØ­ØŠ ØĒØŗØŦŲŠŲ„ Ø§Ų„Ø¯ØŽŲˆŲ„ ('/login')", + "dataTypeLabel": "Data Type:", + "dataTypeAll": "All", + "dataTypeApi": "API", + "dataTypeUi": "UI", "totalEndpoints": "ØĨØŦŲ…Ø§Ų„ŲŠ Ø§Ų„Ų…ØŗØ§ØąØ§ØĒ", "totalVisits": "ØĨØŦŲ…Ø§Ų„ŲŠ Ø§Ų„Ø˛ŲŠØ§ØąØ§ØĒ", "showing": "ŲŠØšØąØļ", @@ -324,7 +431,9 @@ "top": "Ø§Ų„ØŖØšŲ„Ų‰", "numberOfVisits": "ؚدد Ø§Ų„Ø˛ŲŠØ§ØąØ§ØĒ", "visitsTooltip": "Ø§Ų„Ø˛ŲŠØ§ØąØ§ØĒ: {0} ({1}% Ų…Ų† Ø§Ų„ØĨØŦŲ…Ø§Ų„ŲŠ)", - "retry": "ØĨؚاد؊ Ø§Ų„Ų…Ø­Ø§ŲˆŲ„ØŠ" + "retry": "ØĨؚاد؊ Ø§Ų„Ų…Ø­Ø§ŲˆŲ„ØŠ", + "includeHomepage": "ØĒØļŲ…ŲŠŲ† Ø§Ų„ØĩŲØ­ØŠ Ø§Ų„ØąØĻŲŠØŗŲŠØŠ ('/')", + "includeLoginPage": "ØĒØļŲ…ŲŠŲ† ØĩŲØ­ØŠ ØĒØŗØŦŲŠŲ„ Ø§Ų„Ø¯ØŽŲˆŲ„ ('/login')" }, "database": { "title": "Ø§ØŗØĒŲŠØąØ§Ø¯/ØĒØĩØ¯ŲŠØą Ų‚Ø§ØšØ¯ØŠ Ø§Ų„Ø¨ŲŠØ§Ų†Ø§ØĒ", @@ -365,6 +474,16 @@ "alphabetical": "ØŖØ¨ØŦØ¯ŲŠ", "globalPopularity": "Ø§Ų„Ø´ØšØ¨ŲŠØŠ Ø§Ų„ØšØ§Ų„Ų…ŲŠØŠ", "sortBy": "ŲØąØ˛ Ø­ØŗØ¨:", + "mobile": { + "brandAlt": "Stirling PDF logo", + "openFiles": "Open files", + "swipeHint": "Swipe left or right to switch views", + "tools": "Tools", + "toolsSlide": "Tool selection panel", + "viewSwitcher": "Switch workspace view", + "workbenchSlide": "Workspace panel", + "workspace": "Workspace" + }, "multiTool": { "tags": "Ų…ØĒØšØ¯Ø¯ØŒØŖØ¯ŲˆØ§ØĒ", "title": "ØŖØ¯Ø§ØŠ Ų…ØĒؚدد؊ PDF", @@ -550,11 +669,6 @@ "title": "Manual Redaction", "desc": "Redacts a PDF based on selected text, drawn shapes and/or selected page(s)" }, - "overlayPdfs": { - "tags": "ØĒØąØ§ŲƒØ¨ØŒØ¯Ų…ØŦ،ØĒŲƒØ¯ŲŠØŗ", - "title": "ØĒØąØ§ŲƒØ¨ Ų…Ų„ŲØ§ØĒ PDF", - "desc": "ØĒØąØ§ŲƒØ¨ Ų…Ų„ŲØ§ØĒ PDF ŲŲˆŲ‚ ؅؄؁ PDF ØĸØŽØą" - }, "splitBySections": { "tags": "ØĒŲ‚ØŗŲŠŲ…ØŒØŖŲ‚ØŗØ§Ų…ØŒØĒØŦØ˛ØĻØŠ", "title": "ØĒŲ‚ØŗŲŠŲ… PDF Ø­ØŗØ¨ Ø§Ų„ØŖŲ‚ØŗØ§Ų…", @@ -659,6 +773,15 @@ "tags": "ØŗŲŠØą ØšŲ…Ų„ØŒØĒØŗŲ„ØŗŲ„ØŒØŖØĒŲ…ØĒØŠ", "title": "ØŖØĒŲ…ØĒØŠ", "desc": "Ø§Ø¨Ų†Ų ØĒØ¯ŲŲ‘Ų‚Ø§ØĒ ØšŲ…Ų„ Ų…ØĒؚدد؊ Ø§Ų„ØŽØˇŲˆØ§ØĒ Ø¨ØŗŲ„ØŗŲ„ØŠ ØĨØŦØąØ§ØĄØ§ØĒ PDF. Ų…ØĢØ§Ų„ŲŠ Ų„Ų„Ų…Ų‡Ø§Ų… Ø§Ų„Ų…ØĒŲƒØąØąØŠ." + }, + "overlay-pdfs": { + "desc": "Overlay one PDF on top of another", + "title": "Overlay PDFs" + }, + "overlayPdfs": { + "tags": "ØĒØąØ§ŲƒØ¨ØŒØ¯Ų…ØŦ،ØĒŲƒØ¯ŲŠØŗ", + "title": "ØĒØąØ§ŲƒØ¨ Ų…Ų„ŲØ§ØĒ PDF", + "desc": "ØĒØąØ§ŲƒØ¨ Ų…Ų„ŲØ§ØĒ PDF ŲŲˆŲ‚ ؅؄؁ PDF ØĸØŽØą" } }, "landing": { @@ -698,13 +821,19 @@ "merge": { "tags": "Ø¯Ų…ØŦ,ØšŲ…Ų„ŲŠØ§ØĒ Ø§Ų„ØĩŲØ­ØŠ,Ø§Ų„ØŽŲ„ŲŲŠØŠ,ØŦØ§Ų†Ø¨ Ø§Ų„ØŽØ§Ø¯Ų…", "title": "Ø¯Ų…ØŦ", - "removeDigitalSignature.tooltip": { - "title": "ØĨØ˛Ø§Ų„ØŠ Ø§Ų„ØĒŲˆŲ‚ŲŠØš Ø§Ų„ØąŲ‚Ų…ŲŠ", - "description": "ØŗŲŠØĒŲ… ØĨØ¨ØˇØ§Ų„ Ø§Ų„ØĒŲˆØ§Ų‚ŲŠØš Ø§Ų„ØąŲ‚Ų…ŲŠØŠ ØšŲ†Ø¯ Ø¯Ų…ØŦ Ø§Ų„Ų…Ų„ŲØ§ØĒ. Ø­Ø¯Ų‘Ø¯ Ų‡Ø°Ø§ Ų„ØĨØ˛Ø§Ų„ØĒŲ‡Ø§ Ų…Ų† ؅؄؁ PDF Ø§Ų„Ų†Ų‡Ø§ØĻ؊." + "removeDigitalSignature": { + "label": "Remove digital signature in the merged file?", + "tooltip": { + "title": "ØĨØ˛Ø§Ų„ØŠ Ø§Ų„ØĒŲˆŲ‚ŲŠØš Ø§Ų„ØąŲ‚Ų…ŲŠ", + "description": "ØŗŲŠØĒŲ… ØĨØ¨ØˇØ§Ų„ Ø§Ų„ØĒŲˆØ§Ų‚ŲŠØš Ø§Ų„ØąŲ‚Ų…ŲŠØŠ ØšŲ†Ø¯ Ø¯Ų…ØŦ Ø§Ų„Ų…Ų„ŲØ§ØĒ. Ø­Ø¯Ų‘Ø¯ Ų‡Ø°Ø§ Ų„ØĨØ˛Ø§Ų„ØĒŲ‡Ø§ Ų…Ų† ؅؄؁ PDF Ø§Ų„Ų†Ų‡Ø§ØĻ؊." + } }, - "generateTableOfContents.tooltip": { - "title": "ØĨŲ†Ø´Ø§ØĄ ØŦØ¯ŲˆŲ„ Ø§Ų„Ų…Ø­ØĒŲˆŲŠØ§ØĒ", - "description": "ŲŠŲ†Ø´ØĻ ØĒŲ„Ų‚Ø§ØĻŲŠŲ‹Ø§ ØŦØ¯ŲˆŲ„ Ų…Ø­ØĒŲˆŲŠØ§ØĒ Ų‚Ø§Ø¨Ų„Ų‹Ø§ Ų„Ų„Ų†Ų‚Øą ؁؊ PDF Ø§Ų„Ų…Ø¯Ų…ØŦ Ø§ØŗØĒŲ†Ø§Ø¯Ų‹Ø§ ØĨŲ„Ų‰ ØŖØŗŲ…Ø§ØĄ Ø§Ų„Ų…Ų„ŲØ§ØĒ Ø§Ų„ØŖØĩŲ„ŲŠØŠ ŲˆØŖØąŲ‚Ø§Ų… Ø§Ų„ØĩŲØ­Ø§ØĒ." + "generateTableOfContents": { + "label": "Generate table of contents in the merged file?", + "tooltip": { + "title": "ØĨŲ†Ø´Ø§ØĄ ØŦØ¯ŲˆŲ„ Ø§Ų„Ų…Ø­ØĒŲˆŲŠØ§ØĒ", + "description": "ŲŠŲ†Ø´ØĻ ØĒŲ„Ų‚Ø§ØĻŲŠŲ‹Ø§ ØŦØ¯ŲˆŲ„ Ų…Ø­ØĒŲˆŲŠØ§ØĒ Ų‚Ø§Ø¨Ų„Ų‹Ø§ Ų„Ų„Ų†Ų‚Øą ؁؊ PDF Ø§Ų„Ų…Ø¯Ų…ØŦ Ø§ØŗØĒŲ†Ø§Ø¯Ų‹Ø§ ØĨŲ„Ų‰ ØŖØŗŲ…Ø§ØĄ Ø§Ų„Ų…Ų„ŲØ§ØĒ Ø§Ų„ØŖØĩŲ„ŲŠØŠ ŲˆØŖØąŲ‚Ø§Ų… Ø§Ų„ØĩŲØ­Ø§ØĒ." + } }, "submit": "Ø¯Ų…ØŦ", "sortBy": { @@ -842,12 +971,50 @@ "bullet1": "Ų…ØŗØĒŲˆŲ‰ Ø§Ų„ØĨØ´Ø§ØąØŠ Ø§Ų„Ų…ØąØŦØšŲŠØŠ: Ø§Ų„Ų…ØŗØĒŲˆŲ‰ Ø§Ų„Ø°ŲŠ ØŗŲŠØĒŲ… Ø§Ų„ØĒŲ‚ØŗŲŠŲ… ØšŲ†Ø¯Ų‡ (1 = Ø§Ų„Ų…ØŗØĒŲˆŲ‰ Ø§Ų„ØŖØšŲ„Ų‰)", "bullet2": "ØĒØļŲ…ŲŠŲ† Ø§Ų„Ø¨ŲŠØ§Ų†Ø§ØĒ Ø§Ų„ŲˆØĩŲŲŠØŠ: Ø§Ų„Ø­ŲØ§Ø¸ ØšŲ„Ų‰ ØŽØĩاØĻØĩ Ø§Ų„Ų…ØŗØĒŲ†Ø¯", "bullet3": "Ø§Ų„ØŗŲ…Ø§Ø­ Ø¨Ø§Ų„ØĒŲƒØąØ§ØąØ§ØĒ: Ų…ØšØ§Ų„ØŦØŠ ØŖØŗŲ…Ø§ØĄ Ø§Ų„ØĨØ´Ø§ØąØ§ØĒ Ø§Ų„Ų…ØąØŦØšŲŠØŠ Ø§Ų„Ų…ŲƒØąØąØŠ" + }, + "byDocCount": { + "bullet1": "Enter the number of output files you want", + "bullet2": "Pages are distributed as evenly as possible", + "bullet3": "Useful when you need a specific number of files", + "text": "Create a specific number of output files by evenly distributing pages across them.", + "title": "Split by Document Count" + }, + "byPageCount": { + "bullet1": "Enter the number of pages per output file", + "bullet2": "Last file may have fewer pages if not evenly divisible", + "bullet3": "Useful for batch processing workflows", + "text": "Create multiple PDFs with a specific number of pages each. Perfect for creating uniform document chunks.", + "title": "Split by Page Count" + }, + "byPageDivider": { + "bullet1": "Print divider sheets from the download link", + "bullet2": "Insert divider sheets between your documents", + "bullet3": "Scan all documents together as one PDF", + "bullet4": "Upload - divider pages are automatically detected and removed", + "bullet5": "Enable Duplex Mode if scanning both sides of divider sheets", + "text": "Automatically split scanned documents using physical divider sheets with QR codes. Perfect for processing multiple documents scanned together.", + "title": "Split by Page Divider" } - } + }, + "methodSelection": { + "tooltip": { + "bullet1": "Click on a method card to select it", + "bullet2": "Hover over each card to see a quick description", + "bullet3": "The settings step will appear after you select a method", + "bullet4": "You can change methods at any time before processing", + "header": { + "text": "Choose how you want to split your PDF document. Each method is optimized for different use cases and document types.", + "title": "Split Method Selection" + }, + "title": "Choose Your Split Method" + } + }, + "selectMethod": "Select a split method" }, "rotate": { "title": "ØĒØ¯ŲˆŲŠØą PDF", "submit": "ØĒØ¯ŲˆŲŠØą", + "selectRotation": "Select Rotation Angle (Clockwise)", "error": { "failed": "حدØĢ ØŽØˇØŖ ØŖØĢŲ†Ø§ØĄ ØĒØ¯ŲˆŲŠØą PDF." }, @@ -935,7 +1102,8 @@ "imagesExt": "ØĩŲˆØą (JPG, PNG، ØĨŲ„ØŽ.)", "markdown": "Markdown", "textRtf": "Ų†Øĩ/RTF", - "grayscale": "ØĒØ¯ØąØŦ Ø§Ų„ØąŲ…Ø§Ø¯ŲŠ" + "grayscale": "ØĒØ¯ØąØŦ Ø§Ų„ØąŲ…Ø§Ø¯ŲŠ", + "errorConversion": "An error occurred while converting the file." }, "imageToPdf": { "tags": "ØĒØ­ŲˆŲŠŲ„,ØĩŲˆØąØŠ,jpg,ØĩŲˆØąØŠ,ØĩŲˆØąØŠ ؁؈ØĒ؈ØēØąØ§ŲŲŠØŠ" @@ -973,7 +1141,20 @@ "8": "ØĨØ˛Ø§Ų„ØŠ Ø§Ų„ØŖØŽŲŠØą", "9": "ØĨØ˛Ø§Ų„ØŠ", "10": "Ø¯Ų…ØŦ ŲØąØ¯ŲŠ-Ø˛ŲˆØŦ؊", - "11": "ØĒŲƒØąØ§Øą ŲƒŲ„ Ø§Ų„ØĩŲØ­Ø§ØĒ" + "11": "ØĒŲƒØąØ§Øą ŲƒŲ„ Ø§Ų„ØĩŲØ­Ø§ØĒ", + "desc": { + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, â€Ļ).", + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, â€Ļ).", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimized for binding on the side)." + } }, "desc": { "CUSTOM": "Ø§ØŗØĒØŽØ¯Ų… ØĒØŗŲ„ØŗŲ„Ų‹Ø§ Ų…ØŽØĩØĩŲ‹Ø§ Ų„ØŖØąŲ‚Ø§Ų… Ø§Ų„ØĩŲØ­Ø§ØĒ ØŖŲˆ Ø§Ų„ØĒØšØ§Ø¨ŲŠØą Ų„ØĒØšØąŲŠŲ ØĒØąØĒŲŠØ¨ ØŦØ¯ŲŠØ¯.", @@ -1039,7 +1220,9 @@ "opacity": "Ø§Ų„Ø´ŲØ§ŲŲŠØŠ (%)", "spacing": { "horizontal": "Ø§Ų„ØĒباؚد Ø§Ų„ØŖŲŲ‚ŲŠ", - "vertical": "Ø§Ų„ØĒباؚد Ø§Ų„ØąØŖØŗŲŠ" + "vertical": "Ø§Ų„ØĒباؚد Ø§Ų„ØąØŖØŗŲŠ", + "height": "Height Spacing", + "width": "Width Spacing" }, "convertToImage": "ØĒØŗØˇŲŠØ­ ØĩŲØ­Ø§ØĒ PDF ØĨŲ„Ų‰ ØĩŲˆØą" }, @@ -1182,6 +1365,10 @@ "bullet4": "ØŖŲØļŲ„ Ų„Ų„Ų…Ø­ØĒŲˆŲ‰ Ø§Ų„Ø­ØŗØ§Øŗ ØŖŲˆ Ø§Ų„Ų…Ø­Ų…ŲŠ Ø¨Ø­Ų‚ŲˆŲ‚" } } + }, + "type": { + "1": "Text", + "2": "Image" } }, "permissions": { @@ -1255,6 +1442,26 @@ }, "submit": "ØĨØ˛Ø§Ų„ØŠ Ø§Ų„ØĩŲØ­Ø§ØĒ" }, + "extractPages": { + "title": "Extract Pages", + "pageNumbers": { + "label": "Pages to Extract", + "placeholder": "e.g., 1,3,5-8 or odd & 1-10" + }, + "settings": { + "title": "Settings" + }, + "tooltip": { + "description": "Extracts the selected pages into a new PDF, preserving order." + }, + "error": { + "failed": "Failed to extract pages" + }, + "results": { + "title": "Pages Extracted" + }, + "submit": "Extract Pages" + }, "pageSelection": { "tooltip": { "header": { @@ -1295,10 +1502,43 @@ }, "examples": { "title": "ØŖŲ…ØĢŲ„ØŠ" + }, + "complex": { + "bullet1": "1,3-5,8,2n → pages 1, 3–5, 8, plus evens", + "bullet2": "10-,2n-1 → from page 10 to end + odd pages", + "description": "Mix different types.", + "title": "Complex Combinations" + }, + "description": "Choose which pages to use for the operation. Supports single pages, ranges, formulas, and the all keyword.", + "individual": { + "bullet1": "1,3,5 → selects pages 1, 3, 5", + "bullet2": "2,7,12 → selects pages 2, 7, 12", + "description": "Enter numbers separated by commas.", + "title": "Individual Pages" + }, + "mathematical": { + "bullet1": "2n → all even pages (2, 4, 6â€Ļ)", + "bullet2": "2n-1 → all odd pages (1, 3, 5â€Ļ)", + "bullet3": "3n → every 3rd page (3, 6, 9â€Ļ)", + "bullet4": "4n-1 → pages 3, 7, 11, 15â€Ļ", + "description": "Use n in formulas for patterns.", + "title": "Mathematical Functions" + }, + "ranges": { + "bullet1": "3-6 → selects pages 3–6", + "bullet2": "10-15 → selects pages 10–15", + "bullet3": "5- → selects pages 5 to end", + "description": "Use - for consecutive pages.", + "title": "Page Ranges" + }, + "special": { + "bullet1": "all → selects all pages", + "title": "Special Keywords" } } }, "bulkSelection": { + "syntaxError": "There is a syntax issue. See Page Selection tips for help.", "header": { "title": "Ø¯Ų„ŲŠŲ„ ا؎ØĒŲŠØ§Øą Ø§Ų„ØĩŲØ­Ø§ØĒ" }, @@ -1604,6 +1844,9 @@ "text": "ŲŠØšØ§Ų„ØŦ ؅؄؁ PDF Ø§Ų„Ų†Ų‡Ø§ØĻ؊ بØĨØ˛Ø§Ų„ØŠ Ø´ŲˆØ§ØĻب OCR ؈ØĒØ­ØŗŲŠŲ† ØˇØ¨Ų‚ØŠ Ø§Ų„Ų†Øĩ Ų„Ų‚ØąØ§ØĄØŠ ØŖŲØļŲ„ ŲˆØ­ØŦŲ… ØŖØĩØēØą." } } + }, + "error": { + "failed": "OCR operation failed" } }, "extractImages": { @@ -1766,8 +2009,16 @@ "hint": "Ø§ØąŲØš ØĩŲˆØąØŠ PNG ØŖŲˆ JPG Ų„ØĒŲˆŲ‚ŲŠØšŲƒ" }, "instructions": { - "title": "ŲƒŲŠŲŲŠØŠ ØĨØļØ§ŲØŠ ØĒŲˆŲ‚ŲŠØš" + "title": "ŲƒŲŠŲŲŠØŠ ØĨØļØ§ŲØŠ ØĒŲˆŲ‚ŲŠØš", + "canvas": "After drawing your signature in the canvas, close the modal then click anywhere on the PDF to place it.", + "image": "After uploading your signature image above, click anywhere on the PDF to place it.", + "text": "After entering your name above, click anywhere on the PDF to place your signature." }, + "mode": { + "move": "Move Signature", + "place": "Place Signature" + }, + "updateAndPlace": "Update and Place", "activate": "ØĒŲØšŲŠŲ„ ؈ØļØš ؈ØļØš Ø§Ų„ØĒŲˆŲ‚ŲŠØš", "deactivate": "ØĨŲŠŲ‚Ø§Ų ؈ØļØš Ø§Ų„ØĒŲˆŲ‚ŲŠØš", "results": { @@ -1792,7 +2043,10 @@ "options": { "stepTitle": "ØŽŲŠØ§ØąØ§ØĒ Ø§Ų„ØĒØŗØˇŲŠØ­", "title": "ØŽŲŠØ§ØąØ§ØĒ Ø§Ų„ØĒØŗØˇŲŠØ­", - "flattenOnlyForms.desc": "ØĒØŗØˇŲŠØ­ Ø­Ų‚ŲˆŲ„ Ø§Ų„Ų†Ų…Ø§Ø°ØŦ ŲŲ‚Øˇ Ų…Øš ØĨØ¨Ų‚Ø§ØĄ Ø§Ų„ØšŲ†Ø§ØĩØą Ø§Ų„ØĒŲØ§ØšŲ„ŲŠØŠ Ø§Ų„ØŖØŽØąŲ‰ ŲƒŲ…Ø§ Ų‡ŲŠ", + "flattenOnlyForms": { + "label": "Flatten only forms", + "desc": "ØĒØŗØˇŲŠØ­ Ø­Ų‚ŲˆŲ„ Ø§Ų„Ų†Ų…Ø§Ø°ØŦ ŲŲ‚Øˇ Ų…Øš ØĨØ¨Ų‚Ø§ØĄ Ø§Ų„ØšŲ†Ø§ØĩØą Ø§Ų„ØĒŲØ§ØšŲ„ŲŠØŠ Ø§Ų„ØŖØŽØąŲ‰ ŲƒŲ…Ø§ Ų‡ŲŠ" + }, "note": "Ø§Ų„ØĒØŗØˇŲŠØ­ ŲŠØ˛ŲŠŲ„ Ø§Ų„ØšŲ†Ø§ØĩØą Ø§Ų„ØĒŲØ§ØšŲ„ŲŠØŠ Ų…Ų† PDF ؈؊ØŦØšŲ„Ų‡ ØēŲŠØą Ų‚Ø§Ø¨Ų„ Ų„Ų„ØĒØ­ØąŲŠØą." }, "results": { @@ -1882,7 +2136,13 @@ "bullet3": "ŲŠŲ…ŲƒŲ† ØĒØšØˇŲŠŲ„Ų‡ Ų„ØĒŲ‚Ų„ŲŠŲ„ Ø­ØŦŲ… ؅؄؁ Ø§Ų„Ų†Ø§ØĒØŦ" } }, - "submit": "ØĨØ˛Ø§Ų„ØŠ Ø§Ų„ŲØąØ§ØēاØĒ" + "submit": "ØĨØ˛Ø§Ų„ØŠ Ø§Ų„ŲØąØ§ØēاØĒ", + "error": { + "failed": "Failed to remove blank pages" + }, + "results": { + "title": "Removed Blank Pages" + } }, "removeAnnotations": { "tags": "ØĒØšŲ„ŲŠŲ‚Ø§ØĒ,ØĒØ¸Ų„ŲŠŲ„,Ų…Ų„Ø§Ø­Ø¸Ø§ØĒ,ØšŲ„Ø§Ų…Ø§ØĒ,ØĨØ˛Ø§Ų„ØŠ", @@ -1984,7 +2244,12 @@ "bullet3": "ا؎ØĒØą Ø§Ų„ØĩŲØ­ØŠ Ø§Ų„ØĒ؊ ؊؈ØļØš ŲŲŠŲ‡Ø§ Ø§Ų„ØĒŲˆŲ‚ŲŠØš", "bullet4": "ŲŠŲ…ŲƒŲ† ØĒØļŲ…ŲŠŲ† Ø´ØšØ§Øą ا؎ØĒŲŠØ§ØąŲŠ" } - } + }, + "invisible": "Invisible", + "options": { + "title": "Signature Details" + }, + "visible": "Visible" }, "sign": { "submit": "ØĒŲˆŲ‚ŲŠØš PDF", @@ -2045,7 +2310,22 @@ "text": "Ø­ŲˆŲ‘Ų„ Ų…Ų„ŲŲƒ ØĨŲ„Ų‰ Ų…ØŽØ˛Ų† Ų…ŲØ§ØĒŲŠØ­ Java (.jks) Ø¨Ø§ØŗØĒØŽØ¯Ø§Ų… keytool، ØĢŲ… ا؎ØĒØą JKS." } } - } + }, + "chooseCertificate": "Choose Certificate File", + "chooseJksFile": "Choose JKS File", + "chooseP12File": "Choose PKCS12 File", + "choosePfxFile": "Choose PFX File", + "choosePrivateKey": "Choose Private Key File", + "location": "Location", + "logoTitle": "Logo", + "name": "Name", + "noLogo": "No Logo", + "pageNumber": "Page Number", + "password": "Certificate Password", + "passwordOptional": "Leave empty if no password", + "reason": "Reason", + "serverCertMessage": "Using server certificate - no files or password required", + "showLogo": "Show Logo" }, "removeCertSign": { "tags": "Ų…ØĩØ§Ø¯Ų‚ØŠ,PEM,P12,ØąØŗŲ…ŲŠ,؁؃ Ø§Ų„ØĒØ´ŲŲŠØą", @@ -2071,7 +2351,17 @@ "header": "ØĒØŽØˇŲŠØˇ Ų…ØĒؚدد Ø§Ų„ØĩŲØ­Ø§ØĒ", "pagesPerSheet": "Ø§Ų„ØĩŲØ­Ø§ØĒ Ų„ŲƒŲ„ ŲˆØąŲ‚ØŠ:", "addBorder": "ØĨØļØ§ŲØŠ Ø­Ø¯ŲˆØ¯", - "submit": "ØĨØąØŗØ§Ų„" + "submit": "ØĨØąØŗØ§Ų„", + "desc": { + "2": "Place 2 pages side-by-side on a single sheet.", + "3": "Place 3 pages on a single sheet in a single row.", + "4": "Place 4 pages on a single sheet (2 × 2 grid).", + "9": "Place 9 pages on a single sheet (3 × 3 grid).", + "16": "Place 16 pages on a single sheet (4 × 4 grid)." + }, + "error": { + "failed": "An error occurred while creating the multi-page layout." + } }, "bookletImposition": { "tags": "؃ØĒŲŠŲ‘Ø¨,ØĒØąØĒŲŠØ¨,ØˇØ¨Ø§ØšØŠ,ØĒØŦŲ„ŲŠØ¯,ØĒŲˆØ§Ų‚ŲŠØš", @@ -2257,10 +2547,22 @@ "reset": "ØĨؚاد؊ Ø§Ų„ØĒØšŲŠŲŠŲ† ØĨŲ„Ų‰ ŲƒØ§Ų…Ų„ PDF", "coordinates": { "title": "Ø§Ų„Ų…ŲˆØļØš ŲˆØ§Ų„Ø­ØŦŲ…", - "x": "Ų…ŲˆØļØš X", - "y": "Ų…ŲˆØļØš Y", - "width": "Ø§Ų„ØšØąØļ", - "height": "Ø§Ų„Ø§ØąØĒŲØ§Øš" + "x": { + "label": "X Position", + "desc": "Left edge (points)" + }, + "y": { + "label": "Y Position", + "desc": "Bottom edge (points)" + }, + "width": { + "label": "Width", + "desc": "Crop width (points)" + }, + "height": { + "label": "Height", + "desc": "Crop height (points)" + } }, "error": { "invalidArea": "Ų…Ų†ØˇŲ‚ØŠ Ø§Ų„Ų‚Øĩ ØĒØĒØŦØ§ŲˆØ˛ Ø­Ø¯ŲˆØ¯ PDF", @@ -2278,6 +2580,10 @@ }, "results": { "title": "Ų†ØĒاØĻØŦ Ø§Ų„Ų‚Øĩ" + }, + "automation": { + "info": "Enter crop coordinates in PDF points. Origin (0,0) is at bottom-left. These values will be applied to all PDFs processed in this automation.", + "reference": "Reference: A4 page is 595.28 × 841.89 points (210mm × 297mm). 1 inch = 72 points." } }, "autoSplitPDF": { @@ -2488,11 +2794,15 @@ "overlay-pdfs": { "tags": "ØĒØąØ§ŲƒØ¨", "header": "ØĒØąØ§ŲƒØ¨ Ų…Ų„ŲØ§ØĒ PDF", + "title": "Overlay PDFs", + "desc": "Overlay one PDF on top of another", "baseFile": { "label": "ا؎ØĒØą ؅؄؁ PDF Ø§Ų„ØŖØŗØ§ØŗŲŠ" }, "overlayFiles": { - "label": "ا؎ØĒØą Ų…Ų„ŲØ§ØĒ PDF Ų„Ų„ØĒØąØ§ŲƒØ¨" + "label": "ا؎ØĒØą Ų…Ų„ŲØ§ØĒ PDF Ų„Ų„ØĒØąØ§ŲƒØ¨", + "placeholder": "Choose PDF(s)...", + "addMore": "Add more PDFs..." }, "mode": { "label": "ا؎ØĒØą ؈ØļØš Ø§Ų„ØĒØąØ§ŲƒØ¨", @@ -2502,14 +2812,53 @@ }, "counts": { "label": "ؚدد Ø§Ų„ØĒØąØ§ŲƒØ¨Ø§ØĒ (Ų„ŲˆØļØš Ø§Ų„ØĒŲƒØąØ§Øą Ø§Ų„ØĢابØĒ)", - "placeholder": "ØŖØ¯ØŽŲ„ Ø§Ų„ØŖØšØ¯Ø§Ø¯ ؅؁ØĩŲˆŲ„ØŠ Ø¨ŲŲˆØ§ØĩŲ„ (Ų…ØĢŲ„ 2,3,1)" + "placeholder": "ØŖØ¯ØŽŲ„ Ø§Ų„ØŖØšØ¯Ø§Ø¯ ؅؁ØĩŲˆŲ„ØŠ Ø¨ŲŲˆØ§ØĩŲ„ (Ų…ØĢŲ„ 2,3,1)", + "item": "Count for file", + "noFiles": "Add overlay files to configure counts" }, "position": { "label": "ا؎ØĒØą Ų…ŲˆØļØš Ø§Ų„ØĒØąØ§ŲƒØ¨", "foreground": "Ø§Ų„Ų…Ų‚Ø¯Ų…ØŠ", "background": "Ø§Ų„ØŽŲ„ŲŲŠØŠ" }, - "submit": "ØĨØąØŗØ§Ų„" + "submit": "ØĨØąØŗØ§Ų„", + "settings": { + "title": "Settings" + }, + "results": { + "title": "Overlay Results" + }, + "tooltip": { + "header": { + "title": "Overlay PDFs Overview" + }, + "description": { + "title": "Description", + "text": "Combine a base PDF with one or more overlay PDFs. Overlays can be applied page-by-page in different modes and placed in the foreground or background." + }, + "mode": { + "title": "Overlay Mode", + "text": "Choose how to distribute overlay pages across the base PDF pages.", + "sequential": "Sequential Overlay: Use pages from the first overlay PDF until it ends, then move to the next.", + "interleaved": "Interleaved Overlay: Take one page from each overlay in turn.", + "fixedRepeat": "Fixed Repeat Overlay: Take a set number of pages from each overlay before moving to the next. Use Counts to set the numbers." + }, + "position": { + "title": "Overlay Position", + "text": "Foreground places the overlay on top of the page. Background places it behind." + }, + "overlayFiles": { + "title": "Overlay Files", + "text": "Select one or more PDFs to overlay on the base. The order of these files affects how pages are applied in Sequential and Fixed Repeat modes." + }, + "counts": { + "title": "Counts (Fixed Repeat only)", + "text": "Provide a positive number for each overlay file showing how many pages to take before moving to the next. Required when mode is Fixed Repeat." + } + }, + "error": { + "failed": "An error occurred while overlaying PDFs." + } }, "split-by-sections": { "tags": "ØĒŲ‚ØŗŲŠŲ… Ø§Ų„Ų‚ØŗŲ…, ØĒŲ‚ØŗŲŠŲ…, ØĒØŽØĩ؊Øĩ", @@ -2544,7 +2893,18 @@ "customMargin": "Ų‡Ø§Ų…Ø´ Ų…ØŽØĩØĩ", "customColor": "Ų„ŲˆŲ† Ų†Øĩ Ų…ØŽØĩØĩ", "submit": "ØĨØąØŗØ§Ų„", - "noStampSelected": "Ų„Ų… ؊ØĒŲ… ا؎ØĒŲŠØ§Øą ØŽØĒŲ…. Ø§ØąØŦØš ØĨŲ„Ų‰ Ø§Ų„ØŽØˇŲˆØŠ 1." + "noStampSelected": "Ų„Ų… ؊ØĒŲ… ا؎ØĒŲŠØ§Øą ØŽØĒŲ…. Ø§ØąØŦØš ØĨŲ„Ų‰ Ø§Ų„ØŽØˇŲˆØŠ 1.", + "customPosition": "Drag the stamp to the desired location in the preview window.", + "error": { + "failed": "An error occurred while adding stamp to the PDF." + }, + "imageSize": "Image Size", + "margin": "Margin", + "positionAndFormatting": "Position & Formatting", + "quickPosition": "Select a position on the page to place the stamp.", + "results": { + "title": "Stamp Results" + } }, "removeImagePdf": { "tags": "ØĨØ˛Ø§Ų„ØŠ Ø§Ų„ØĩŲˆØąØŠ,ØšŲ…Ų„ŲŠØ§ØĒ Ø§Ų„ØĩŲØ­ØŠ,Ø§Ų„ØŽŲ„ŲŲŠØŠ,ØŦØ§Ų†Ø¨ Ø§Ų„ØŽØ§Ø¯Ų…" @@ -2562,7 +2922,8 @@ "status": { "_value": "Ø§Ų„Ø­Ø§Ų„ØŠ", "valid": "ØĩØ§Ų„Ø­", - "invalid": "ØēŲŠØą ØĩØ§Ų„Ø­" + "invalid": "ØēŲŠØą ØĩØ§Ų„Ø­", + "complete": "Validation complete" }, "signer": "Ø§Ų„Ų…ŲˆŲ‚Ų‘Øš", "date": "Ø§Ų„ØĒØ§ØąŲŠØŽ", @@ -2589,17 +2950,115 @@ "version": "Ø§Ų„ØĨØĩØ¯Ø§Øą", "keyUsage": "Ø§ØŗØĒØŽØ¯Ø§Ų… Ø§Ų„Ų…ŲØĒاح", "selfSigned": "Ų…ŲˆŲ‚Ų‘ØšØŠ ذاØĒŲŠŲ‹Ø§", - "bits": "بØĒ" + "bits": "بØĒ", + "details": "Certificate Details" }, "signature": { "info": "Ų…ØšŲ„ŲˆŲ…Ø§ØĒ Ø§Ų„ØĒŲˆŲ‚ŲŠØš", "_value": "Ø§Ų„ØĒŲˆŲ‚ŲŠØš", "mathValid": "Ø§Ų„ØĒŲˆŲ‚ŲŠØš ØĩØ§Ų„Ø­ ØąŲŠØ§ØļŲŠŲ‹Ø§ Ų„ŲƒŲ†:" }, - "selectCustomCert": "؅؄؁ Ø´Ų‡Ø§Ø¯ØŠ X.509 Ų…ØŽØĩØĩ (ا؎ØĒŲŠØ§ØąŲŠ)" + "selectCustomCert": "؅؄؁ Ø´Ų‡Ø§Ø¯ØŠ X.509 Ų…ØŽØĩØĩ (ا؎ØĒŲŠØ§ØąŲŠ)", + "downloadCsv": "Download CSV", + "downloadJson": "Download JSON", + "downloadPdf": "Download PDF Report", + "downloadType": { + "csv": "CSV", + "json": "JSON", + "pdf": "PDF" + }, + "error": { + "allFailed": "Unable to validate the selected files.", + "partial": "Some files could not be validated.", + "reportGeneration": "Could not generate the PDF report. JSON and CSV are available.", + "unexpected": "Unexpected error during validation." + }, + "finalizing": "Preparing downloads...", + "issue": { + "certExpired": "Certificate expired", + "certRevocationUnknown": "Certificate revocation status unknown", + "certRevoked": "Certificate revoked", + "chainInvalid": "Certificate chain invalid", + "signatureInvalid": "Signature cryptographic check failed", + "trustInvalid": "Certificate not trusted" + }, + "noResults": "Run the validation to generate a report.", + "noSignaturesShort": "No signatures", + "processing": "Validating signatures...", + "report": { + "continued": "Continued", + "downloads": "Downloads", + "entryLabel": "Signature Summary", + "fields": { + "created": "Created", + "fileSize": "File Size", + "signatureCount": "Total Signatures", + "signatureDate": "Signature Date" + }, + "filesEvaluated": "{{count}} files evaluated", + "footer": "Validated via Stirling PDF", + "generatedAt": "Generated", + "noPdf": "PDF report will be available after a successful validation.", + "page": "Page", + "shortTitle": "Signature Summary", + "signatureCountLabel": "{{count}} signatures", + "signaturesFound": "{{count}} signatures detected", + "signaturesValid": "{{count}} fully valid", + "title": "Signature Validation Report" + }, + "settings": { + "certHint": "Upload a trusted X.509 certificate to validate against a custom trust source.", + "title": "Validation Settings" + }, + "signatureDate": "Signature Date", + "totalSignatures": "Total Signatures" }, "replaceColor": { - "tags": "Ø§ØŗØĒØ¨Ø¯Ø§Ų„ Ø§Ų„Ų„ŲˆŲ†ØŒØšŲ…Ų„ŲŠØ§ØĒ Ø§Ų„ØĩŲØ­ØŠØŒØ§Ų„ŲˆØ§ØŦŲ‡ØŠ Ø§Ų„ØŽŲ„ŲŲŠØŠØŒØŦŲ‡ØŠ Ø§Ų„ØŽØ§Ø¯Ų…" + "tags": "Ø§ØŗØĒØ¨Ø¯Ø§Ų„ Ø§Ų„Ų„ŲˆŲ†ØŒØšŲ…Ų„ŲŠØ§ØĒ Ø§Ų„ØĩŲØ­ØŠØŒØ§Ų„ŲˆØ§ØŦŲ‡ØŠ Ø§Ų„ØŽŲ„ŲŲŠØŠØŒØŦŲ‡ØŠ Ø§Ų„ØŽØ§Ø¯Ų…", + "labels": { + "settings": "Settings", + "colourOperation": "Colour operation" + }, + "options": { + "highContrast": "High contrast", + "invertAll": "Invert all colours", + "custom": "Custom", + "cmyk": "Convert to CMYK" + }, + "tooltip": { + "header": { + "title": "Replace & Invert Colour Settings Overview" + }, + "description": { + "title": "Description", + "text": "Transform PDF colours to improve readability and accessibility. Choose from high contrast presets, invert all colours, or create custom colour schemes." + }, + "highContrast": { + "title": "High Contrast", + "text": "Apply predefined high contrast colour combinations designed for better readability and accessibility compliance.", + "bullet1": "White text on black background - Classic dark mode", + "bullet2": "Black text on white background - Standard high contrast", + "bullet3": "Yellow text on black background - High visibility option", + "bullet4": "Green text on black background - Alternative high contrast" + }, + "invertAll": { + "title": "Invert All Colours", + "text": "Completely invert all colours in the PDF, creating a negative-like effect. Useful for creating dark mode versions of documents or reducing eye strain in low-light conditions." + }, + "custom": { + "title": "Custom Colours", + "text": "Define your own text and background colours using the colour pickers. Perfect for creating branded documents or specific accessibility requirements.", + "bullet1": "Text colour - Choose the colour for text elements", + "bullet2": "Background colour - Set the background colour for the document" + }, + "cmyk": { + "title": "Convert to CMYK", + "text": "Convert the PDF from RGB colour space to CMYK colour space, optimized for professional printing. This process converts colours to the Cyan, Magenta, Yellow, Black model used by printers." + } + }, + "error": { + "failed": "An error occurred while processing the colour replacement." + } }, "login": { "title": "ØĒØŗØŦŲŠŲ„ Ø§Ų„Ø¯ØŽŲˆŲ„", @@ -2632,6 +3091,11 @@ "enterEmail": "ØŖØ¯ØŽŲ„ Ø¨ØąŲŠØ¯Ųƒ Ø§Ų„ØĨŲ„ŲƒØĒØąŲˆŲ†ŲŠ", "enterPassword": "ØŖØ¯ØŽŲ„ ŲƒŲ„Ų…ØŠ Ø§Ų„Ų…ØąŲˆØą", "loggingIn": "ØŦØ§ØąŲ ØĒØŗØŦŲŠŲ„ Ø§Ų„Ø¯ØŽŲˆŲ„...", + "username": "Username", + "enterUsername": "Enter username", + "useEmailInstead": "Login with email", + "forgotPassword": "Forgot your password?", + "logIn": "Log In", "signingIn": "ØŦØ§ØąŲ ØĒØŗØŦŲŠŲ„ Ø§Ų„Ø¯ØŽŲˆŲ„...", "login": "ØĒØŗØŦŲŠŲ„ Ø§Ų„Ø¯ØŽŲˆŲ„", "or": "ØŖŲˆ", @@ -2649,7 +3113,10 @@ "magicLinkSent": "ØĒŲ… ØĨØąØŗØ§Ų„ Ø§Ų„ØąØ§Ø¨Øˇ Ø§Ų„ØŗØ­ØąŲŠ ØĨŲ„Ų‰ {{email}}! ØĒŲŲ‚Ø¯ Ø¨ØąŲŠØ¯Ųƒ ŲˆØ§ØļØēØˇ Ø§Ų„ØąØ§Ø¨Øˇ Ų„ØĒØŗØŦŲŠŲ„ Ø§Ų„Ø¯ØŽŲˆŲ„.", "passwordResetSent": "ØĒŲ… ØĨØąØŗØ§Ų„ ØąØ§Ø¨Øˇ ØĨؚاد؊ ØĒØšŲŠŲŠŲ† ŲƒŲ„Ų…ØŠ Ø§Ų„Ų…ØąŲˆØą ØĨŲ„Ų‰ {{email}}! ØĒŲŲ‚Ø¯ Ø¨ØąŲŠØ¯Ųƒ ŲˆØ§ØĒبؚ Ø§Ų„ØĒØšŲ„ŲŠŲ…Ø§ØĒ.", "failedToSignIn": "ŲØ´Ų„ ØĒØŗØŦŲŠŲ„ Ø§Ų„Ø¯ØŽŲˆŲ„ Ø¨ŲˆØ§ØŗØˇØŠ {{provider}}: {{message}}", - "unexpectedError": "ØŽØˇØŖ ØēŲŠØą Ų…ØĒŲˆŲ‚Øš: {{message}}" + "unexpectedError": "ØŽØˇØŖ ØēŲŠØą Ų…ØĒŲˆŲ‚Øš: {{message}}", + "accountCreatedSuccess": "Account created successfully! You can now sign in.", + "passwordChangedSuccess": "Password changed successfully! Please sign in with your new password.", + "credentialsUpdated": "Your credentials have been updated. Please sign in again." }, "signup": { "title": "ØĨŲ†Ø´Ø§ØĄ Ø­ØŗØ§Ø¨", @@ -2672,7 +3139,12 @@ "invalidEmail": "ŲŠØąØŦŲ‰ ØĨØ¯ØŽØ§Ų„ ØšŲ†ŲˆØ§Ų† Ø¨ØąŲŠØ¯ ØĨŲ„ŲƒØĒØąŲˆŲ†ŲŠ ØĩØ§Ų„Ø­", "checkEmailConfirmation": "ØĒØ­Ų‚Ų‘Ų‚ Ų…Ų† Ø¨ØąŲŠØ¯Ųƒ Ø§Ų„ØĨŲ„ŲƒØĒØąŲˆŲ†ŲŠ Ų„Ų„ØšØĢŲˆØą ØšŲ„Ų‰ ØąØ§Ø¨Øˇ Ø§Ų„ØĒØŖŲƒŲŠØ¯ Ų„ØĨŲƒŲ…Ø§Ų„ Ø§Ų„ØĒØŗØŦŲŠŲ„.", "accountCreatedSuccessfully": "ØĒŲ… ØĨŲ†Ø´Ø§ØĄ Ø§Ų„Ø­ØŗØ§Ø¨ Ø¨Ų†ØŦاح! ŲŠŲ…ŲƒŲ†Ųƒ Ø§Ų„ØĸŲ† ØĒØŗØŦŲŠŲ„ Ø§Ų„Ø¯ØŽŲˆŲ„.", - "unexpectedError": "ØŽØˇØŖ ØēŲŠØą Ų…ØĒŲˆŲ‚Øš: {{message}}" + "unexpectedError": "ØŽØˇØŖ ØēŲŠØą Ų…ØĒŲˆŲ‚Øš: {{message}}", + "useEmailInstead": "Use Email Instead", + "nameRequired": "Name is required", + "emailRequired": "Email is required", + "passwordRequired": "Password is required", + "confirmPasswordRequired": "Please confirm your password" }, "pdfToSinglePage": { "title": "PDF ØĨŲ„Ų‰ ØĩŲØ­ØŠ ŲˆØ§Ø­Ø¯ØŠ", @@ -2712,10 +3184,23 @@ "adjustContrast": { "title": "ØļØ¨Øˇ Ø§Ų„ØĒØ¨Ø§ŲŠŲ†", "header": "ØļØ¨Øˇ Ø§Ų„ØĒØ¨Ø§ŲŠŲ†", + "basic": "Basic Adjustments", "contrast": "Ø§Ų„ØĒØ¨Ø§ŲŠŲ†:", "brightness": "Ø§Ų„ØŗØˇŲˆØš:", "saturation": "Ø§Ų„ØĒشبؚ:", - "download": "ØĒŲ†Ø˛ŲŠŲ„" + "download": "ØĒŲ†Ø˛ŲŠŲ„", + "adjustColors": "Adjust Colors", + "blue": "Blue", + "confirm": "Confirm", + "error": { + "failed": "Failed to adjust colors/contrast" + }, + "green": "Green", + "noPreview": "Select a PDF to preview", + "red": "Red", + "results": { + "title": "Adjusted PDF" + } }, "compress": { "title": "ØļØēØˇ", @@ -2862,7 +3347,13 @@ "title": "ØĨØ˛Ø§Ų„ØŠ Ø§Ų„ØĩŲˆØąØŠ", "header": "ØĨØ˛Ø§Ų„ØŠ Ø§Ų„ØĩŲˆØąØŠ", "removeImage": "ØĨØ˛Ø§Ų„ØŠ Ø§Ų„ØĩŲˆØąØŠ", - "submit": "ØĨØ˛Ø§Ų„ØŠ Ø§Ų„ØĩŲˆØąØŠ" + "submit": "ØĨØ˛Ø§Ų„ØŠ Ø§Ų„ØĩŲˆØąØŠ", + "error": { + "failed": "Failed to remove images from the PDF." + }, + "results": { + "title": "Remove Images Results" + } }, "splitByChapters": { "title": "ØĒØŦØ˛ØĻØŠ Ø§Ų„Ų…ØŗØĒŲ†Ø¯ Ø­ØŗØ¨ Ø§Ų„ŲØĩŲˆŲ„", @@ -2937,6 +3428,10 @@ "title": "Ø§Ų„ØĒØ­Ų„ŲŠŲ„Ø§ØĒ", "description": "ØĒØŗØ§ØšØ¯Ų†Ø§ Ų‡Ø°Ų‡ Ø§Ų„Ų…Ų„ŲØ§ØĒ ØšŲ„Ų‰ ؁؇؅ ŲƒŲŠŲŲŠØŠ Ø§ØŗØĒØŽØ¯Ø§Ų… ØŖØ¯ŲˆØ§ØĒŲ†Ø§ØŒ ؃؊ Ų†ØąŲƒŲ‘Ø˛ ØšŲ„Ų‰ Ø¨Ų†Ø§ØĄ Ø§Ų„Ų…ŲŠØ˛Ø§ØĒ Ø§Ų„ØŖŲƒØĢØą Ų‚ŲŠŲ…ØŠ Ų„Ų…ØŦØĒŲ…ØšŲ†Ø§. ŲƒŲ† Ų…ØˇŲ…ØĻŲ†Ų‹Ø§â€”â€Stirling PDF Ų„Ø§ ŲŠŲ…ŲƒŲ†Ų‡ ŲˆŲ„Ų† ؊ØĒØĒبؚ Ų…Ø­ØĒŲˆŲ‰ Ø§Ų„Ų…ØŗØĒŲ†Ø¯Ø§ØĒ Ø§Ų„ØĒ؊ ØĒØšŲ…Ų„ ØšŲ„ŲŠŲ‡Ø§." } + }, + "services": { + "posthog": "PostHog Analytics", + "scarf": "Scarf Pixel" } }, "removeMetadata": { @@ -2998,11 +3493,18 @@ "panMode": "؈ØļØš Ø§Ų„ØŗØ­Ø¨", "rotateLeft": "ØĒØ¯ŲˆŲŠØą Ų„Ų„ŲŠØŗØ§Øą", "rotateRight": "ØĒØ¯ŲˆŲŠØą Ų„Ų„ŲŠŲ…ŲŠŲ†", - "toggleSidebar": "ØĒØ¨Ø¯ŲŠŲ„ Ø§Ų„Ø´ØąŲŠØˇ Ø§Ų„ØŦØ§Ų†Ø¨ŲŠ" + "toggleSidebar": "ØĒØ¨Ø¯ŲŠŲ„ Ø§Ų„Ø´ØąŲŠØˇ Ø§Ų„ØŦØ§Ų†Ø¨ŲŠ", + "exportSelected": "Export Selected Pages", + "toggleAnnotations": "Toggle Annotations Visibility", + "annotationMode": "Toggle Annotation Mode", + "draw": "Draw", + "save": "Save" }, "search": { "title": "بحØĢ PDF", - "placeholder": "ØŖØ¯ØŽŲ„ Ų…ØĩØˇŲ„Ø­ Ø§Ų„Ø¨Ø­ØĢ..." + "placeholder": "ØŖØ¯ØŽŲ„ Ų…ØĩØˇŲ„Ø­ Ø§Ų„Ø¨Ø­ØĢ...", + "noResults": "No results found", + "searching": "Searching..." }, "guestBanner": { "title": "ØŖŲ†ØĒ ØĒØŗØĒØŽØ¯Ų… Stirling PDF ؃Øļ؊؁!", @@ -3040,9 +3542,597 @@ "automate": "ØŖØĒŲ…ØĒØŠ", "files": "Ø§Ų„Ų…Ų„ŲØ§ØĒ", "activity": "Ø§Ų„Ų†Ø´Ø§Øˇ", + "help": "Help", + "account": "Account", "config": "Ø§Ų„ØĨؚداد", + "adminSettings": "Admin Settings", "allTools": "ŲƒŲ„ Ø§Ų„ØŖØ¯ŲˆØ§ØĒ" }, + "admin": { + "error": "Error", + "success": "Success", + "expand": "Expand", + "close": "Close", + "status": { + "active": "Active", + "inactive": "Inactive" + }, + "settings": { + "title": "Admin Settings", + "workspace": "Workspace", + "fetchError": "Failed to load settings", + "saveError": "Failed to save settings", + "saved": "Settings saved successfully", + "saveSuccess": "Settings saved successfully", + "save": "Save Changes", + "restartRequired": "Restart Required", + "restart": { + "title": "Restart Required", + "message": "Settings have been saved successfully. A server restart is required for the changes to take effect.", + "question": "Would you like to restart the server now or later?", + "now": "Restart Now", + "later": "Restart Later" + }, + "restarting": "Restarting Server", + "restartingMessage": "The server is restarting. Please wait a moment...", + "restartError": "Failed to restart server. Please restart manually.", + "general": { + "title": "System Settings", + "description": "Configure system-wide application settings including branding and default behaviour.", + "ui": "User Interface", + "system": "System", + "appName": { + "label": "Application Name", + "description": "The name displayed in the browser tab and home page" + }, + "appNameNavbar": { + "label": "Navbar Brand", + "description": "The name displayed in the navigation bar" + }, + "homeDescription": { + "label": "Home Description", + "description": "The description text shown on the home page" + }, + "defaultLocale": { + "label": "Default Locale", + "description": "The default language for new users (e.g., en_US, es_ES)" + }, + "fileUploadLimit": { + "label": "File Upload Limit", + "description": "Maximum file upload size (e.g., 100MB, 1GB)" + }, + "showUpdate": { + "label": "Show Update Notifications", + "description": "Display notifications when a new version is available" + }, + "showUpdateOnlyAdmin": { + "label": "Show Updates to Admins Only", + "description": "Restrict update notifications to admin users only" + }, + "customHTMLFiles": { + "label": "Custom HTML Files", + "description": "Allow serving custom HTML files from the customFiles directory" + }, + "languages": { + "label": "Available Languages", + "description": "Languages that users can select from (leave empty to enable all languages)" + }, + "customMetadata": { + "label": "Custom Metadata", + "autoUpdate": { + "label": "Auto Update Metadata", + "description": "Automatically update PDF metadata on all processed documents" + }, + "author": { + "label": "Default Author", + "description": "Default author for PDF metadata (e.g., username)" + }, + "creator": { + "label": "Default Creator", + "description": "Default creator for PDF metadata" + }, + "producer": { + "label": "Default Producer", + "description": "Default producer for PDF metadata" + } + }, + "customPaths": { + "label": "Custom Paths", + "description": "Configure custom file system paths for pipeline processing and external tools", + "pipeline": { + "label": "Pipeline Directories", + "watchedFoldersDir": { + "label": "Watched Folders Directory", + "description": "Directory where pipeline monitors for incoming PDFs (leave empty for default: /pipeline/watchedFolders)" + }, + "finishedFoldersDir": { + "label": "Finished Folders Directory", + "description": "Directory where processed PDFs are outputted (leave empty for default: /pipeline/finishedFolders)" + } + }, + "operations": { + "label": "External Tool Paths", + "weasyprint": { + "label": "WeasyPrint Executable", + "description": "Path to WeasyPrint executable for HTML to PDF conversion (leave empty for default: /opt/venv/bin/weasyprint)" + }, + "unoconvert": { + "label": "Unoconvert Executable", + "description": "Path to LibreOffice unoconvert for document conversions (leave empty for default: /opt/venv/bin/unoconvert)" + } + } + } + }, + "security": { + "title": "Security", + "description": "Configure authentication, login behaviour, and security policies.", + "ssoNotice": { + "title": "Looking for SSO/SAML settings?", + "message": "OAuth2 and SAML2 authentication providers have been moved to the Connections menu for easier management." + }, + "authentication": "Authentication", + "enableLogin": { + "label": "Enable Login", + "description": "Require users to log in before accessing the application" + }, + "loginMethod": { + "label": "Login Method", + "description": "The authentication method to use for user login", + "all": "All Methods", + "normal": "Username/Password Only", + "oauth2": "OAuth2 Only", + "saml2": "SAML2 Only" + }, + "loginAttemptCount": { + "label": "Login Attempt Limit", + "description": "Maximum number of failed login attempts before account lockout" + }, + "loginResetTimeMinutes": { + "label": "Login Reset Time (minutes)", + "description": "Time before failed login attempts are reset" + }, + "csrfDisabled": { + "label": "Disable CSRF Protection", + "description": "Disable Cross-Site Request Forgery protection (not recommended)" + }, + "initialLogin": { + "label": "Initial Login", + "username": { + "label": "Initial Username", + "description": "The username for the initial admin account" + }, + "password": { + "label": "Initial Password", + "description": "The password for the initial admin account" + } + }, + "jwt": { + "label": "JWT Configuration", + "secureCookie": { + "label": "Secure Cookie", + "description": "Require HTTPS for JWT cookies (recommended for production)" + }, + "keyRetentionDays": { + "label": "Key Retention Days", + "description": "Number of days to retain old JWT keys for verification" + }, + "persistence": { + "label": "Enable Key Persistence", + "description": "Store JWT keys persistently to survive server restarts" + }, + "enableKeyRotation": { + "label": "Enable Key Rotation", + "description": "Automatically rotate JWT signing keys periodically" + }, + "enableKeyCleanup": { + "label": "Enable Key Cleanup", + "description": "Automatically remove expired JWT keys" + } + }, + "audit": { + "label": "Audit Logging", + "enabled": { + "label": "Enable Audit Logging", + "description": "Track user actions and system events for compliance and security monitoring" + }, + "level": { + "label": "Audit Level", + "description": "0=OFF, 1=BASIC, 2=STANDARD, 3=VERBOSE" + }, + "retentionDays": { + "label": "Audit Retention (days)", + "description": "Number of days to retain audit logs" + } + }, + "htmlUrlSecurity": { + "label": "HTML URL Security", + "description": "Configure URL access restrictions for HTML processing to prevent SSRF attacks", + "enabled": { + "label": "Enable URL Security", + "description": "Enable URL security restrictions for HTML to PDF conversions" + }, + "level": { + "label": "Security Level", + "description": "MAX: whitelist only, MEDIUM: block internal networks, OFF: no restrictions", + "max": "Maximum (Whitelist Only)", + "medium": "Medium (Block Internal)", + "off": "Off (No Restrictions)" + }, + "advanced": "Advanced Settings", + "allowedDomains": { + "label": "Allowed Domains (Whitelist)", + "description": "One domain per line (e.g., cdn.example.com). Only these domains allowed when level is MAX" + }, + "blockedDomains": { + "label": "Blocked Domains (Blacklist)", + "description": "One domain per line (e.g., malicious.com). Additional domains to block" + }, + "internalTlds": { + "label": "Internal TLDs", + "description": "One TLD per line (e.g., .local, .internal). Block domains with these TLD patterns" + }, + "networkBlocking": "Network Blocking", + "blockPrivateNetworks": { + "label": "Block Private Networks", + "description": "Block RFC 1918 private networks (10.x.x.x, 192.168.x.x, 172.16-31.x.x)" + }, + "blockLocalhost": { + "label": "Block Localhost", + "description": "Block localhost and loopback addresses (127.x.x.x, ::1)" + }, + "blockLinkLocal": { + "label": "Block Link-Local Addresses", + "description": "Block link-local addresses (169.254.x.x, fe80::/10)" + }, + "blockCloudMetadata": { + "label": "Block Cloud Metadata Endpoints", + "description": "Block cloud provider metadata endpoints (169.254.169.254)" + } + } + }, + "connections": { + "title": "Connections", + "description": "Configure external authentication providers like OAuth2 and SAML.", + "linkedServices": "Linked Services", + "unlinkedServices": "Unlinked Services", + "connect": "Connect", + "disconnect": "Disconnect", + "disconnected": "Provider disconnected successfully", + "disconnectError": "Failed to disconnect provider", + "ssoAutoLogin": { + "label": "SSO Auto Login", + "enable": "Enable SSO Auto Login", + "description": "Automatically redirect to SSO login when authentication is required" + }, + "oauth2": { + "label": "OAuth2", + "enabled": { + "label": "Enable OAuth2", + "description": "Allow users to authenticate using OAuth2 providers" + }, + "provider": { + "label": "Provider", + "description": "The OAuth2 provider to use for authentication" + }, + "issuer": { + "label": "Issuer URL", + "description": "The OAuth2 provider issuer URL" + }, + "clientId": { + "label": "Client ID", + "description": "The OAuth2 client ID from your provider" + }, + "clientSecret": { + "label": "Client Secret", + "description": "The OAuth2 client secret from your provider" + }, + "useAsUsername": { + "label": "Use as Username", + "description": "The OAuth2 claim to use as the username (e.g., email, sub)" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first OAuth2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via OAuth2" + }, + "scopes": { + "label": "OAuth2 Scopes", + "description": "Comma-separated list of OAuth2 scopes to request (e.g., openid, profile, email)" + } + }, + "saml2": { + "label": "SAML2", + "enabled": { + "label": "Enable SAML2", + "description": "Allow users to authenticate using SAML2 providers" + }, + "provider": { + "label": "Provider", + "description": "The SAML2 provider name" + }, + "registrationId": { + "label": "Registration ID", + "description": "The SAML2 registration identifier" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first SAML2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via SAML2" + } + } + }, + "database": { + "title": "Database", + "description": "Configure custom database connection settings for enterprise deployments.", + "configuration": "Database Configuration", + "enableCustom": { + "label": "Enable Custom Database", + "description": "Use your own custom database configuration instead of the default embedded database" + }, + "customUrl": { + "label": "Custom Database URL", + "description": "Full JDBC connection string (e.g., jdbc:postgresql://localhost:5432/postgres). If provided, individual connection settings below are not used." + }, + "type": { + "label": "Database Type", + "description": "Type of database (not used if custom URL is provided)" + }, + "hostName": { + "label": "Host Name", + "description": "Database server hostname (not used if custom URL is provided)" + }, + "port": { + "label": "Port", + "description": "Database server port (not used if custom URL is provided)" + }, + "name": { + "label": "Database Name", + "description": "Name of the database (not used if custom URL is provided)" + }, + "username": { + "label": "Username", + "description": "Database authentication username" + }, + "password": { + "label": "Password", + "description": "Database authentication password" + } + }, + "privacy": { + "title": "Privacy", + "description": "Configure privacy and data collection settings.", + "analytics": "Analytics & Tracking", + "enableAnalytics": { + "label": "Enable Analytics", + "description": "Collect anonymous usage analytics to help improve the application" + }, + "metricsEnabled": { + "label": "Enable Metrics", + "description": "Enable collection of performance and usage metrics. Provides API endpoint for admins to access metrics data" + }, + "searchEngine": "Search Engine Visibility", + "googleVisibility": { + "label": "Google Visibility", + "description": "Allow search engines to index this application" + } + }, + "advanced": { + "title": "Advanced", + "description": "Configure advanced features and experimental functionality.", + "features": "Feature Flags", + "processing": "Processing", + "endpoints": { + "label": "Endpoints", + "manage": "Manage API Endpoints", + "description": "Endpoint management is configured via YAML. See documentation for details on enabling/disabling specific endpoints." + }, + "enableAlphaFunctionality": { + "label": "Enable Alpha Features", + "description": "Enable experimental and alpha-stage features (may be unstable)" + }, + "enableUrlToPDF": { + "label": "Enable URL to PDF", + "description": "Allow conversion of web pages to PDF documents" + }, + "maxDPI": { + "label": "Maximum DPI", + "description": "Maximum DPI for image processing (0 = unlimited)" + }, + "tessdataDir": { + "label": "Tessdata Directory", + "description": "Path to the tessdata directory for OCR language files" + }, + "disableSanitize": { + "label": "Disable HTML Sanitization", + "description": "WARNING: Security risk - disabling HTML sanitization can lead to XSS vulnerabilities" + }, + "tempFileManagement": { + "label": "Temp File Management", + "description": "Configure temporary file storage and cleanup behavior", + "baseTmpDir": { + "label": "Base Temp Directory", + "description": "Base directory for temporary files (leave empty for default: java.io.tmpdir/stirling-pdf)" + }, + "libreofficeDir": { + "label": "LibreOffice Temp Directory", + "description": "Directory for LibreOffice temp files (leave empty for default: baseTmpDir/libreoffice)" + }, + "systemTempDir": { + "label": "System Temp Directory", + "description": "System temp directory to clean (only used if cleanupSystemTemp is enabled)" + }, + "prefix": { + "label": "Temp File Prefix", + "description": "Prefix for temp file names" + }, + "maxAgeHours": { + "label": "Max Age (hours)", + "description": "Maximum age in hours before temp files are cleaned up" + }, + "cleanupIntervalMinutes": { + "label": "Cleanup Interval (minutes)", + "description": "How often to run cleanup (in minutes)" + }, + "startupCleanup": { + "label": "Startup Cleanup", + "description": "Clean up old temp files on application startup" + }, + "cleanupSystemTemp": { + "label": "Cleanup System Temp", + "description": "Whether to clean broader system temp directory (use with caution)" + } + }, + "processExecutor": { + "label": "Process Executor Limits", + "description": "Configure session limits and timeouts for each process executor", + "sessionLimit": { + "label": "Session Limit", + "description": "Maximum concurrent instances" + }, + "timeout": { + "label": "Timeout (minutes)", + "description": "Maximum execution time" + }, + "libreOffice": "LibreOffice", + "pdfToHtml": "PDF to HTML", + "qpdf": "QPDF", + "tesseract": "Tesseract OCR", + "pythonOpenCv": "Python OpenCV", + "weasyPrint": "WeasyPrint", + "installApp": "Install App", + "calibre": "Calibre", + "ghostscript": "Ghostscript", + "ocrMyPdf": "OCRmyPDF" + } + }, + "mail": { + "title": "Mail Server", + "description": "Configure SMTP settings for sending email notifications.", + "smtp": "SMTP Configuration", + "enabled": { + "label": "Enable Mail", + "description": "Enable email notifications and SMTP functionality" + }, + "host": { + "label": "SMTP Host", + "description": "The hostname or IP address of your SMTP server" + }, + "port": { + "label": "SMTP Port", + "description": "The port number for SMTP connection (typically 25, 465, or 587)" + }, + "username": { + "label": "SMTP Username", + "description": "Username for SMTP authentication" + }, + "password": { + "label": "SMTP Password", + "description": "Password for SMTP authentication" + }, + "from": { + "label": "From Address", + "description": "The email address to use as the sender" + }, + "enableInvites": { + "label": "Enable Email Invites", + "description": "Allow admins to invite users via email with auto-generated passwords" + }, + "frontendUrl": { + "label": "Frontend URL", + "description": "Base URL for frontend (e.g. https://pdf.example.com). Used for generating invite links in emails. Leave empty to use backend URL." + } + }, + "legal": { + "title": "Legal Documents", + "description": "Configure links to legal documents and policies.", + "disclaimer": { + "title": "Legal Responsibility Warning", + "message": "By customizing these legal documents, you assume full responsibility for ensuring compliance with all applicable laws and regulations, including but not limited to GDPR and other EU data protection requirements. Only modify these settings if: (1) you are operating a personal/private instance, (2) you are outside EU jurisdiction and understand your local legal obligations, or (3) you have obtained proper legal counsel and accept sole responsibility for all user data and legal compliance. Stirling-PDF and its developers assume no liability for your legal obligations." + }, + "termsAndConditions": { + "label": "Terms and Conditions", + "description": "URL or filename to terms and conditions" + }, + "privacyPolicy": { + "label": "Privacy Policy", + "description": "URL or filename to privacy policy" + }, + "accessibilityStatement": { + "label": "Accessibility Statement", + "description": "URL or filename to accessibility statement" + }, + "cookiePolicy": { + "label": "Cookie Policy", + "description": "URL or filename to cookie policy" + }, + "impressum": { + "label": "Impressum", + "description": "URL or filename to impressum (required in some jurisdictions)" + } + }, + "premium": { + "title": "Premium & Enterprise", + "description": "Configure your premium or enterprise license key.", + "license": "License Configuration", + "key": { + "label": "License Key", + "description": "Enter your premium or enterprise license key" + }, + "enabled": { + "label": "Enable Premium Features", + "description": "Enable license key checks for pro/enterprise features" + }, + "movedFeatures": { + "title": "Premium Features Distributed", + "message": "Premium and Enterprise features are now organized in their respective sections:" + } + }, + "features": { + "title": "Features", + "description": "Configure optional features and functionality.", + "serverCertificate": { + "label": "Server Certificate", + "description": "Configure server-side certificate generation for \"Sign with Stirling-PDF\" functionality", + "enabled": { + "label": "Enable Server Certificate", + "description": "Enable server-side certificate for \"Sign with Stirling-PDF\" option" + }, + "organizationName": { + "label": "Organization Name", + "description": "Organization name for generated certificates" + }, + "validity": { + "label": "Certificate Validity (days)", + "description": "Number of days the certificate will be valid" + }, + "regenerateOnStartup": { + "label": "Regenerate on Startup", + "description": "Generate new certificate on each application startup" + } + } + }, + "endpoints": { + "title": "API Endpoints", + "description": "Control which API endpoints and endpoint groups are available.", + "management": "Endpoint Management", + "toRemove": { + "label": "Disabled Endpoints", + "description": "Select individual endpoints to disable" + }, + "groupsToRemove": { + "label": "Disabled Endpoint Groups", + "description": "Select endpoint groups to disable" + }, + "note": "Note: Disabling endpoints restricts API access but does not remove UI components. Restart required for changes to take effect." + } + } + }, "fileUpload": { "selectFile": "حدد Ų…Ų„ŲŲ‹Ø§", "selectFiles": "حدد Ų…Ų„ŲØ§ØĒ", @@ -3067,6 +4157,9 @@ "addFiles": "ØĨØļØ§ŲØŠ Ų…Ų„ŲØ§ØĒ", "dragFilesInOrClick": "Ø§ØŗØ­Ø¨ Ø§Ų„Ų…Ų„ŲØ§ØĒ ØŖŲˆ Ø§Ų†Ų‚Øą \"ØĨØļØ§ŲØŠ Ų…Ų„ŲØ§ØĒ\" Ų„Ų„ØĒØĩŲŲ‘Ø­" }, + "fileEditor": { + "addFiles": "Add Files" + }, "fileManager": { "title": "ØĒØ­Ų…ŲŠŲ„ Ų…Ų„ŲØ§ØĒ PDF", "subtitle": "ØŖØļ؁ Ų…Ų„ŲØ§ØĒ؃ ØĨŲ„Ų‰ Ø§Ų„ØĒØŽØ˛ŲŠŲ† Ų„Ų„ŲˆØĩŲˆŲ„ ØĨŲ„ŲŠŲ‡Ø§ Ø¨ØŗŲ‡ŲˆŲ„ØŠ ØšØ¨Øą Ø§Ų„ØŖØ¯ŲˆØ§ØĒ", @@ -3095,6 +4188,7 @@ "lastModified": "ØĸØŽØą ØĒØšØ¯ŲŠŲ„", "toolChain": "Ø§Ų„ØŖØ¯ŲˆØ§ØĒ Ø§Ų„Ų…ØˇØ¨Ų‘Ų‚ØŠ", "restore": "Ø§ØŗØĒؚاد؊", + "unzip": "Unzip", "searchFiles": "ابحØĢ ؁؊ Ø§Ų„Ų…Ų„ŲØ§ØĒ...", "recent": "Ø§Ų„ØŖØŽŲŠØąØŠ", "localFiles": "Ø§Ų„Ų…Ų„ŲØ§ØĒ Ø§Ų„Ų…Ø­Ų„ŲŠØŠ", @@ -3102,7 +4196,6 @@ "googleDriveShort": "Drive", "myFiles": "Ų…Ų„ŲØ§ØĒ؊", "noRecentFiles": "Ų„Ų… ؊ØĒŲ… Ø§Ų„ØšØĢŲˆØą ØšŲ„Ų‰ Ų…Ų„ŲØ§ØĒ Ø­Ø¯ŲŠØĢØŠ", - "dropFilesHint": "ØŖØŗŲ‚Øˇ Ø§Ų„Ų…Ų„ŲØ§ØĒ Ų‡Ų†Ø§ Ų„Ų„ØĒØ­Ų…ŲŠŲ„", "googleDriveNotAvailable": "ØĒŲƒØ§Ų…Ų„ Google Drive ØēŲŠØą Ų…ØĒاح", "openFiles": "؁ØĒØ­ Ų…Ų„ŲØ§ØĒ", "openFile": "؁ØĒØ­ ؅؄؁", @@ -3120,7 +4213,18 @@ "selectedCount": "{{count}} Ų…Ø­Ø¯Ø¯", "download": "ØĒŲ†Ø˛ŲŠŲ„", "delete": "Ø­Ø°Ų", - "unsupported": "ØēŲŠØą Ų…Ø¯ØšŲˆŲ…" + "unsupported": "ØēŲŠØą Ų…Ø¯ØšŲˆŲ…", + "addToUpload": "Add to Upload", + "deleteAll": "Delete All", + "loadingFiles": "Loading files...", + "noFiles": "No files available", + "noFilesFound": "No files found matching your search", + "openInPageEditor": "Open in Page Editor", + "showAll": "Show All", + "sortByDate": "Sort by Date", + "sortByName": "Sort by Name", + "sortBySize": "Sort by Size", + "dropFilesHint": "ØŖØŗŲ‚Øˇ Ø§Ų„Ų…Ų„ŲØ§ØĒ Ų‡Ų†Ø§ Ų„Ų„ØĒØ­Ų…ŲŠŲ„" }, "storage": { "temporaryNotice": "ØĒŲØŽØ˛Ų‘ŲŽŲ† Ø§Ų„Ų…Ų„ŲØ§ØĒ Ų…Ø¤Ų‚ØĒŲ‹Ø§ ؁؊ Ų…ØĒØĩŲØ­Ųƒ ŲˆŲ‚Ø¯ ØĒŲŲ…ØŗØ­ ØĒŲ„Ų‚Ø§ØĻŲŠŲ‹Ø§", @@ -3136,8 +4240,10 @@ "desc": "ØĨØ˛Ø§Ų„ØŠ Ø§Ų„ØšŲ†Ø§ØĩØą Ø§Ų„Ų…Ø­ØĒŲ…Ų„ØŠ Ø§Ų„ØļØąØą Ų…Ų† Ų…Ų„ŲØ§ØĒ PDF.", "submit": "ØĒŲ†Ø¸ŲŠŲ PDF", "completed": "Ø§ŲƒØĒŲ…Ų„ØĒ ØšŲ…Ų„ŲŠØŠ Ø§Ų„ØĒŲ†Ų‚ŲŠØŠ Ø¨Ų†ØŦاح", - "error.generic": "ŲØ´Ų„ØĒ ØšŲ…Ų„ŲŠØŠ Ø§Ų„ØĒŲ†Ų‚ŲŠØŠ", - "error.failed": "حدØĢ ØŽØˇØŖ ØŖØĢŲ†Ø§ØĄ ØĒŲ†Ų‚ŲŠØŠ PDF.", + "error": { + "generic": "ŲØ´Ų„ØĒ ØšŲ…Ų„ŲŠØŠ Ø§Ų„ØĒŲ†Ų‚ŲŠØŠ", + "failed": "حدØĢ ØŽØˇØŖ ØŖØĢŲ†Ø§ØĄ ØĒŲ†Ų‚ŲŠØŠ PDF." + }, "filenamePrefix": "sanitised", "sanitizationResults": "Ų†ØĒاØĻØŦ Ø§Ų„ØĒŲ†Ų‚ŲŠØŠ", "steps": { @@ -3151,12 +4257,30 @@ "options": { "title": "ØŽŲŠØ§ØąØ§ØĒ Ø§Ų„ØĒŲ†Ų‚ŲŠØŠ", "note": "ا؎ØĒØą Ø§Ų„ØšŲ†Ø§ØĩØą Ø§Ų„ØĒ؊ ØĒØąŲŠØ¯ ØĨØ˛Ø§Ų„ØĒŲ‡Ø§ Ų…Ų† PDF. ؊ØŦب ا؎ØĒŲŠØ§Øą ØŽŲŠØ§Øą ŲˆØ§Ø­Ø¯ ØšŲ„Ų‰ Ø§Ų„ØŖŲ‚Ų„.", - "removeJavaScript.desc": "ØĨØ˛Ø§Ų„ØŠ ØĨØŦØąØ§ØĄØ§ØĒ JavaScript ŲˆØ§Ų„ØŗŲƒØąŲŠØ¨ØĒاØĒ Ų…Ų† PDF", - "removeEmbeddedFiles.desc": "ØĨØ˛Ø§Ų„ØŠ ØŖŲŠ Ų…Ų„ŲØ§ØĒ Ų…ØļŲ…Ų‘Ų†ØŠ Ø¯Ø§ØŽŲ„ PDF", - "removeXMPMetadata.desc": "ØĨØ˛Ø§Ų„ØŠ Ø¨ŲŠØ§Ų†Ø§ØĒ XMP Ø§Ų„ŲˆØĩŲŲŠØŠ Ų…Ų† PDF", - "removeMetadata.desc": "ØĨØ˛Ø§Ų„ØŠ Ų…ØšŲ„ŲˆŲ…Ø§ØĒ Ø¨ŲŠØ§Ų†Ø§ØĒ Ø§Ų„Ų…ØŗØĒŲ†Ø¯ (Ø§Ų„ØšŲ†ŲˆØ§Ų†ØŒ Ø§Ų„Ų…Ø¤Ų„ŲØŒ ØĨŲ„ØŽ)", - "removeLinks.desc": "ØĨØ˛Ø§Ų„ØŠ Ø§Ų„ØąŲˆØ§Ø¨Øˇ Ø§Ų„ØŽØ§ØąØŦŲŠØŠ ؈ØĨØŦØąØ§ØĄØ§ØĒ Ø§Ų„ØĒØ´ØēŲŠŲ„ Ų…Ų† PDF", - "removeFonts.desc": "ØĨØ˛Ø§Ų„ØŠ Ø§Ų„ØŽØˇŲˆØˇ Ø§Ų„Ų…ØļŲ…Ų‘Ų†ØŠ Ų…Ų† PDF" + "removeJavaScript": { + "label": "Remove JavaScript", + "desc": "ØĨØ˛Ø§Ų„ØŠ ØĨØŦØąØ§ØĄØ§ØĒ JavaScript ŲˆØ§Ų„ØŗŲƒØąŲŠØ¨ØĒاØĒ Ų…Ų† PDF" + }, + "removeEmbeddedFiles": { + "label": "Remove Embedded Files", + "desc": "ØĨØ˛Ø§Ų„ØŠ ØŖŲŠ Ų…Ų„ŲØ§ØĒ Ų…ØļŲ…Ų‘Ų†ØŠ Ø¯Ø§ØŽŲ„ PDF" + }, + "removeXMPMetadata": { + "label": "Remove XMP Metadata", + "desc": "ØĨØ˛Ø§Ų„ØŠ Ø¨ŲŠØ§Ų†Ø§ØĒ XMP Ø§Ų„ŲˆØĩŲŲŠØŠ Ų…Ų† PDF" + }, + "removeMetadata": { + "label": "Remove Document Metadata", + "desc": "ØĨØ˛Ø§Ų„ØŠ Ų…ØšŲ„ŲˆŲ…Ø§ØĒ Ø¨ŲŠØ§Ų†Ø§ØĒ Ø§Ų„Ų…ØŗØĒŲ†Ø¯ (Ø§Ų„ØšŲ†ŲˆØ§Ų†ØŒ Ø§Ų„Ų…Ø¤Ų„ŲØŒ ØĨŲ„ØŽ)" + }, + "removeLinks": { + "label": "Remove Links", + "desc": "ØĨØ˛Ø§Ų„ØŠ Ø§Ų„ØąŲˆØ§Ø¨Øˇ Ø§Ų„ØŽØ§ØąØŦŲŠØŠ ؈ØĨØŦØąØ§ØĄØ§ØĒ Ø§Ų„ØĒØ´ØēŲŠŲ„ Ų…Ų† PDF" + }, + "removeFonts": { + "label": "Remove Fonts", + "desc": "ØĨØ˛Ø§Ų„ØŠ Ø§Ų„ØŽØˇŲˆØˇ Ø§Ų„Ų…ØļŲ…Ų‘Ų†ØŠ Ų…Ų† PDF" + } } }, "addPassword": { @@ -3377,9 +4501,14 @@ "remaining": "Ų…ØĒØ¨Ų‚Ų‘ŲŠ", "used": "Ų…ØŗØĒØŽØ¯Ų…", "available": "Ų…ØĒاح", - "cancel": "ØĨŲ„ØēØ§ØĄ" + "cancel": "ØĨŲ„ØēØ§ØĄ", + "preview": "Preview" }, "config": { + "overview": { + "title": "Application Configuration", + "description": "Current application settings and configuration details." + }, "account": { "overview": { "title": "ØĨؚداداØĒ Ø§Ų„Ø­ØŗØ§Ø¨", @@ -3435,8 +4564,570 @@ "submit": "ØĨØļØ§ŲØŠ Ø§Ų„Ų…ØąŲŲ‚Ø§ØĒ", "results": { "title": "Ų†ØĒاØĻØŦ Ø§Ų„Ų…ØąŲŲ‚Ø§ØĒ" + }, + "error": { + "failed": "Add attachments operation failed" } }, "termsAndConditions": "Ø§Ų„Ø´ØąŲˆØˇ ŲˆØ§Ų„ØŖØ­ŲƒØ§Ų…", - "logOut": "ØĒØŗØŦŲŠŲ„ Ø§Ų„ØŽØąŲˆØŦ" -} \ No newline at end of file + "logOut": "ØĒØŗØŦŲŠŲ„ Ø§Ų„ØŽØąŲˆØŦ", + "addAttachments": { + "error": { + "failed": "An error occurred while adding attachments to the PDF." + } + }, + "autoRename": { + "description": "This tool will automatically rename PDF files based on their content. It analyzes the document to find the most suitable title from the text." + }, + "customPosition": "Custom Position", + "details": "Details", + "downloadUnavailable": "Download unavailable for this item", + "invalidUndoData": "Cannot undo: invalid operation data", + "margin": { + "large": "Large", + "medium": "Medium", + "small": "Small", + "xLarge": "Extra Large" + }, + "noFilesToUndo": "Cannot undo: no files were processed in the last operation", + "noOperationToUndo": "No operation to undo", + "noValidFiles": "No valid files to process", + "operationCancelled": "Operation cancelled", + "pageEdit": { + "deselectAll": "Select None", + "selectAll": "Select All" + }, + "quickPosition": "Quick Position", + "reorganizePages": { + "error": { + "failed": "Failed to reorganize pages" + }, + "results": { + "title": "Pages Reorganized" + }, + "settings": { + "title": "Settings" + }, + "submit": "Reorganize Pages" + }, + "replace-color": { + "options": { + "fill": "Fill colour", + "gradient": "Gradient" + }, + "previewOverlayOpacity": "Preview overlay opacity", + "previewOverlayTransparency": "Preview overlay transparency", + "previewOverlayVisibility": "Show preview overlay", + "selectText": { + "1": "Replace or invert colour options", + "2": "Default (preset high contrast colours)", + "3": "Custom (choose your own colours)", + "4": "Full invert (invert all colours)", + "5": "High contrast color options", + "6": "White text on black background", + "7": "Black text on white background", + "8": "Yellow text on black background", + "9": "Green text on black background", + "10": "Choose text Color", + "11": "Choose background Color", + "12": "Choose start colour", + "13": "Choose end colour" + }, + "submit": "Replace", + "title": "Replace-Invert-Color" + }, + "size": "Size", + "submit": "Submit", + "success": "Success", + "tools": { + "noSearchResults": "No tools found", + "noTools": "No tools available" + }, + "undoDataMismatch": "Cannot undo: operation data is corrupted", + "undoFailed": "Failed to undo operation", + "undoQuotaError": "Cannot undo: insufficient storage space", + "undoStorageError": "Undo completed but some files could not be saved to storage", + "undoSuccess": "Operation undone successfully", + "unsupported": "Unsupported", + "onboarding": { + "welcomeModal": { + "title": "Welcome to Stirling PDF!", + "description": "Would you like to take a quick 1-minute tour to learn the key features and how to get started?", + "helpHint": "You can always access this tour later from the Help button in the bottom left.", + "startTour": "Start Tour", + "maybeLater": "Maybe Later", + "dontShowAgain": "Don't Show Again" + }, + "allTools": "This is the All Tools panel, where you can browse and select from all available PDF tools.", + "selectCropTool": "Let's select the Crop tool to demonstrate how to use one of the tools.", + "toolInterface": "This is the Crop tool interface. As you can see, there's not much there because we haven't added any PDF files to work with yet.", + "filesButton": "The Files button on the Quick Access bar allows you to upload PDFs to use the tools on.", + "fileSources": "You can upload new files or access recent files from here. For the tour, we'll just use a sample file.", + "workbench": "This is the Workbench - the main area where you view and edit your PDFs.", + "viewSwitcher": "Use these controls to select how you want to view your PDFs.", + "viewer": "The Viewer lets you read and annotate your PDFs.", + "pageEditor": "The Page Editor allows you to do various operations on the pages within your PDFs, such as reordering, rotating and deleting.", + "activeFiles": "The Active Files view shows all of the PDFs you have loaded into the tool, and allows you to select which ones to process.", + "fileCheckbox": "Clicking one of the files selects it for processing. You can select multiple files for batch operations.", + "selectControls": "The Right Rail contains buttons to quickly select/deselect all of your active PDFs, along with buttons to change the app's theme or language.", + "cropSettings": "Now that we've selected the file we want crop, we can configure the Crop tool to choose the area that we want to crop the PDF to.", + "runButton": "Once the tool has been configured, this button allows you to run the tool on all the selected PDFs.", + "results": "After the tool has finished running, the Review step will show a preview of the results in this panel, and allow you to undo the operation or download the file. ", + "fileReplacement": "The modified file will replace the original file in the Workbench automatically, allowing you to easily run it through more tools.", + "pinButton": "You can use the Pin button if you'd rather your files stay active after running tools on them.", + "wrapUp": "You're all set! You've learnt about the main areas of the app and how to use them. Click the Help button whenever you like to see this tour again.", + "previous": "Previous", + "next": "Next", + "finish": "Finish", + "startTour": "Start Tour", + "startTourDescription": "Take a guided tour of Stirling PDF's key features" + }, + "workspace": { + "title": "Workspace", + "people": { + "title": "People", + "description": "Manage workspace members and their permissions", + "loading": "Loading people...", + "searchMembers": "Search members...", + "addMembers": "Add Members", + "inviteMembers": { + "label": "Invite Members", + "subtitle": "Type or paste in emails below, separated by commas. Your workspace will be billed by members." + }, + "user": "User", + "role": "Role", + "team": "Team", + "status": "Status", + "actions": "Actions", + "noMembersFound": "No members found", + "active": "Active", + "disabled": "Disabled", + "activeSession": "Active session", + "member": "Member", + "admin": "Admin", + "roleDescriptions": { + "admin": "Can manage settings and invite members, with full administrative access.", + "member": "Can view and edit shared files, but cannot manage workspace settings or members." + }, + "editRole": "Edit Role", + "enable": "Enable", + "disable": "Disable", + "deleteUser": "Delete User", + "deleteUserSuccess": "User deleted successfully", + "deleteUserError": "Failed to delete user", + "confirmDelete": "Are you sure you want to delete this user? This action cannot be undone.", + "addMember": { + "title": "Add Member", + "username": "Username (Email)", + "usernamePlaceholder": "user@example.com", + "password": "Password", + "passwordPlaceholder": "Enter password", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "forcePasswordChange": "Force password change on first login", + "cancel": "Cancel", + "submit": "Add Member", + "usernameRequired": "Username and password are required", + "passwordTooShort": "Password must be at least 6 characters", + "success": "User created successfully", + "error": "Failed to create user" + }, + "editMember": { + "title": "Edit Member", + "editing": "Editing:", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "cancel": "Cancel", + "submit": "Update Member", + "success": "User updated successfully", + "error": "Failed to update user" + }, + "toggleEnabled": { + "success": "User status updated successfully", + "error": "Failed to update user status" + }, + "delete": { + "success": "User deleted successfully", + "error": "Failed to delete user" + }, + "emailInvite": { + "tab": "Email Invite", + "description": "Type or paste in emails below, separated by commas. Users will receive login credentials via email.", + "emails": "Email Addresses", + "emailsPlaceholder": "user1@example.com, user2@example.com", + "emailsRequired": "At least one email address is required", + "submit": "Send Invites", + "success": "user(s) invited successfully", + "partialSuccess": "Some invites failed", + "allFailed": "Failed to invite users", + "error": "Failed to send invites" + }, + "directInvite": { + "tab": "Direct Create" + }, + "inviteLinkTab": { + "tab": "Invite Link" + }, + "inviteLink": { + "description": "Generate a secure link that allows the user to set their own password", + "email": "Email Address", + "emailPlaceholder": "user@example.com (optional)", + "emailDescription": "Optional - leave blank for a general invite link that can be used by anyone", + "emailRequired": "Email address is required", + "emailOptional": "Optional - leave blank for a general invite link", + "emailRequiredForSend": "Email address is required to send email notification", + "expiryHours": "Expiry Hours", + "expiryDescription": "How many hours until the link expires", + "sendEmail": "Send invite link via email", + "sendEmailDescription": "If enabled, the invite link will be sent to the specified email address", + "smtpRequired": "SMTP not configured", + "generate": "Generate Link", + "generated": "Invite Link Generated", + "copied": "Link copied to clipboard", + "success": "Invite link generated successfully", + "successWithEmail": "Invite link generated and sent via email", + "emailFailed": "Invite link generated, but email failed", + "emailFailedDetails": "Error: {0}. Please share the invite link manually.", + "error": "Failed to generate invite link", + "submit": "Generate Invite Link" + }, + "inviteMode": { + "username": "Username", + "email": "Email", + "link": "Link", + "emailDisabled": "Email invites require SMTP configuration and mail.enableInvites=true in settings" + }, + "license": { + "users": "users", + "availableSlots": "Available Slots", + "grandfathered": "Grandfathered", + "grandfatheredShort": "{{count}} grandfathered", + "fromLicense": "from license", + "slotsAvailable": "{{count}} user slot(s) available", + "noSlotsAvailable": "No slots available", + "currentUsage": "Currently using {{current}} of {{max}} user licences" + } + }, + "teams": { + "title": "Teams", + "description": "Manage teams and organize workspace members", + "loading": "Loading teams...", + "loadingDetails": "Loading team details...", + "createNewTeam": "Create New Team", + "teamName": "Team Name", + "totalMembers": "Total Members", + "actions": "Actions", + "noTeamsFound": "No teams found", + "noMembers": "No members in this team", + "system": "System", + "addMember": "Add Member", + "viewTeam": "View Team", + "removeMember": "Remove from team", + "cannotRemoveFromSystemTeam": "Cannot remove from system team", + "renameTeamLabel": "Rename Team", + "deleteTeamLabel": "Delete Team", + "cannotDeleteInternal": "Cannot delete the Internal team", + "confirmDelete": "Are you sure you want to delete this team? This team must be empty to delete.", + "confirmRemove": "Remove user from this team?", + "cannotRenameInternal": "Cannot rename the Internal team", + "cannotAddToInternal": "Cannot add members to the Internal team", + "teamNotFound": "Team not found", + "backToTeams": "Back to Teams", + "memberCount": "{{count}} members", + "removeMemberSuccess": "User removed from team", + "removeMemberError": "Failed to remove user from team", + "createTeam": { + "title": "Create New Team", + "teamName": "Team Name", + "teamNamePlaceholder": "Enter team name", + "cancel": "Cancel", + "submit": "Create Team", + "nameRequired": "Team name is required", + "success": "Team created successfully", + "error": "Failed to create team" + }, + "renameTeam": { + "title": "Rename Team", + "renaming": "Renaming:", + "newTeamName": "New Team Name", + "newTeamNamePlaceholder": "Enter new team name", + "cancel": "Cancel", + "submit": "Rename Team", + "nameRequired": "Team name is required", + "success": "Team renamed successfully", + "error": "Failed to rename team" + }, + "deleteTeam": { + "success": "Team deleted successfully", + "error": "Failed to delete team. Make sure the team is empty.", + "teamMustBeEmpty": "Team must be empty before deletion" + }, + "addMemberToTeam": { + "title": "Add Member to Team", + "addingTo": "Adding to", + "selectUser": "Select User", + "selectUserPlaceholder": "Choose a user", + "selectUserRequired": "Please select a user", + "currentlyIn": "currently in", + "willBeMoved": "Note: This user will be moved from their current team to this team.", + "cancel": "Cancel", + "submit": "Add Member", + "userRequired": "Please select a user", + "success": "Member added to team successfully", + "error": "Failed to add member to team" + }, + "changeTeam": { + "label": "Change Team", + "title": "Change Team", + "changing": "Moving", + "selectTeam": "Select Team", + "selectTeamPlaceholder": "Choose a team", + "selectTeamRequired": "Please select a team", + "success": "Team changed successfully", + "error": "Failed to change team", + "submit": "Change Team" + } + } + }, + "plan": { + "currency": "Currency", + "popular": "Popular", + "current": "Current Plan", + "upgrade": "Upgrade", + "contact": "Contact Us", + "customPricing": "Custom", + "showComparison": "Compare All Features", + "hideComparison": "Hide Feature Comparison", + "featureComparison": "Feature Comparison", + "activePlan": { + "title": "Active Plan", + "subtitle": "Your current subscription details" + }, + "availablePlans": { + "title": "Available Plans", + "subtitle": "Choose the plan that fits your needs" + }, + "static": { + "title": "Billing Information", + "message": "Online billing is not currently configured. To upgrade your plan or manage subscriptions, please contact us directly.", + "contactSales": "Contact Sales", + "contactToUpgrade": "Contact us to upgrade or customize your plan", + "maxUsers": "Max Users", + "upTo": "Up to" + }, + "period": { + "month": "month" + }, + "free": { + "name": "Free", + "highlight1": "Limited Tool Usage Per week", + "highlight2": "Access to all tools", + "highlight3": "Community support" + }, + "pro": { + "name": "Pro", + "highlight1": "Unlimited Tool Usage", + "highlight2": "Advanced PDF tools", + "highlight3": "No watermarks" + }, + "enterprise": { + "name": "Enterprise", + "highlight1": "Custom pricing", + "highlight2": "Dedicated support", + "highlight3": "Latest features" + }, + "feature": { + "title": "Feature", + "pdfTools": "Basic PDF Tools", + "fileSize": "File Size Limit", + "automation": "Automate tool workflows", + "api": "API Access", + "priority": "Priority Support", + "customPricing": "Custom Pricing" + } + }, + "subscription": { + "status": { + "active": "Active", + "pastDue": "Past Due", + "canceled": "Canceled", + "incomplete": "Incomplete", + "trialing": "Trial", + "none": "No Subscription" + }, + "renewsOn": "Renews on {{date}}", + "cancelsOn": "Cancels on {{date}}" + }, + "billing": { + "manageBilling": "Manage Billing", + "portal": { + "error": "Failed to open billing portal" + } + }, + "payment": { + "preparing": "Preparing your checkout...", + "upgradeTitle": "Upgrade to {{planName}}", + "success": "Payment Successful!", + "successMessage": "Your subscription has been activated successfully. You will receive a confirmation email shortly.", + "autoClose": "This window will close automatically...", + "error": "Payment Error" + }, + "firstLogin": { + "title": "First Time Login", + "welcomeTitle": "Welcome!", + "welcomeMessage": "For security reasons, you must change your password on your first login.", + "loggedInAs": "Logged in as", + "error": "Error", + "currentPassword": "Current Password", + "enterCurrentPassword": "Enter your current password", + "newPassword": "New Password", + "enterNewPassword": "Enter new password (min 8 characters)", + "confirmPassword": "Confirm New Password", + "reEnterNewPassword": "Re-enter new password", + "changePassword": "Change Password", + "allFieldsRequired": "All fields are required", + "passwordsDoNotMatch": "New passwords do not match", + "passwordTooShort": "Password must be at least 8 characters", + "passwordMustBeDifferent": "New password must be different from current password", + "passwordChangedSuccess": "Password changed successfully! Please log in again.", + "passwordChangeFailed": "Failed to change password. Please check your current password." + }, + "invite": { + "welcome": "Welcome to Stirling PDF", + "invalidToken": "Invalid invitation link", + "validationError": "Failed to validate invitation link", + "passwordRequired": "Password is required", + "passwordTooShort": "Password must be at least 6 characters", + "passwordMismatch": "Passwords do not match", + "acceptError": "Failed to create account", + "validating": "Validating invitation...", + "invalidInvitation": "Invalid Invitation", + "goToLogin": "Go to Login", + "welcomeTitle": "You've been invited!", + "welcomeSubtitle": "Complete your account setup to get started", + "accountFor": "Creating account for", + "linkExpires": "Link expires", + "email": "Email address", + "emailPlaceholder": "Enter your email address", + "emailRequired": "Email address is required", + "invalidEmail": "Invalid email address", + "choosePassword": "Choose a password", + "passwordPlaceholder": "Enter your password", + "confirmPassword": "Confirm password", + "confirmPasswordPlaceholder": "Re-enter your password", + "createAccount": "Create Account", + "creating": "Creating Account...", + "alreadyHaveAccount": "Already have an account?", + "signIn": "Sign in" + }, + "audit": { + "error": { + "title": "Error loading audit system" + }, + "notAvailable": "Audit system not available", + "notAvailableMessage": "The audit system is not configured or not available.", + "disabled": "Audit logging is disabled", + "disabledMessage": "Enable audit logging in your application configuration to track system events.", + "systemStatus": { + "title": "System Status", + "status": "Audit Logging", + "enabled": "Enabled", + "disabled": "Disabled", + "level": "Audit Level", + "retention": "Retention Period", + "days": "days", + "totalEvents": "Total Events" + }, + "tabs": { + "dashboard": "Dashboard", + "events": "Audit Events", + "export": "Export" + }, + "charts": { + "title": "Audit Dashboard", + "error": "Error loading charts", + "day": "Day", + "week": "Week", + "month": "Month", + "byType": "Events by Type", + "byUser": "Events by User", + "overTime": "Events Over Time" + }, + "events": { + "title": "Audit Events", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "error": "Error loading events", + "noEvents": "No events found", + "timestamp": "Timestamp", + "type": "Type", + "user": "User", + "ipAddress": "IP Address", + "actions": "Actions", + "viewDetails": "View Details", + "eventDetails": "Event Details", + "details": "Details" + }, + "export": { + "title": "Export Audit Data", + "description": "Export audit events to CSV or JSON format. Use filters to limit the exported data.", + "format": "Export Format", + "filters": "Filters (Optional)", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "exportButton": "Export Data", + "error": "Failed to export data" + } + }, + "usage": { + "noData": "No data available", + "error": "Error loading usage statistics", + "noDataMessage": "No usage statistics are currently available.", + "controls": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All", + "refresh": "Refresh", + "dataTypeLabel": "Data Type:", + "dataType": { + "all": "All", + "api": "API", + "ui": "UI" + } + }, + "showing": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All" + }, + "stats": { + "totalEndpoints": "Total Endpoints", + "totalVisits": "Total Visits", + "showing": "Showing", + "selectedVisits": "Selected Visits" + }, + "chart": { + "title": "Endpoint Usage Chart" + }, + "table": { + "title": "Detailed Statistics", + "endpoint": "Endpoint", + "visits": "Visits", + "percentage": "Percentage", + "noData": "No data available" + } + }, + "backendHealth": { + "checking": "Checking backend status...", + "online": "Backend Online", + "offline": "Backend Offline" + } +} diff --git a/frontend/public/locales/az-AZ/translation.json b/frontend/public/locales/az-AZ/translation.json index f16b1eecb..7aec771f3 100644 --- a/frontend/public/locales/az-AZ/translation.json +++ b/frontend/public/locales/az-AZ/translation.json @@ -1,4 +1,40 @@ { + "toolPanel": { + "modePrompt": { + "title": "Choose how you browse tools", + "description": "Preview both layouts and decide how you want to explore Stirling PDF tools.", + "sidebarTitle": "Sidebar mode", + "sidebarDescription": "Keep tools alongside your workspace for quick switching.", + "recommended": "Recommended", + "chooseSidebar": "Use sidebar mode", + "fullscreenTitle": "Fullscreen mode - (legacy)", + "fullscreenDescription": "Browse every tool in a catalogue that covers the workspace until you pick one.", + "chooseFullscreen": "Use fullscreen mode", + "dismiss": "Maybe later" + }, + "fullscreen": { + "showDetails": "Show Details", + "comingSoon": "Coming soon:", + "favorite": "Add to favourites", + "favorites": "Favourites", + "heading": "All tools (fullscreen view)", + "noResults": "Try adjusting your search or toggle descriptions to find what you need.", + "recommended": "Recommended", + "unfavorite": "Remove from favourites" + }, + "placeholder": "Choose a tool to get started", + "toggle": { + "fullscreen": "Switch to fullscreen mode", + "sidebar": "Switch to sidebar mode" + } + }, + "unsavedChanges": "You have unsaved changes to your PDF.", + "areYouSure": "Are you sure you want to leave?", + "unsavedChangesTitle": "Unsaved Changes", + "keepWorking": "Keep Working", + "discardChanges": "Discard & Leave", + "applyAndContinue": "Save & Leave", + "exportAndContinue": "Export & Continue", "language": { "direction": "ltr" }, @@ -18,8 +54,26 @@ "customTextDesc": "Fərdi Mətn", "numberPagesDesc": "HansÄą səhifələrin nÃļmrələnəcəyini seçin, default 'all', və ya 1-5, 2,5,9 kimi yazÄąlÄąÅŸ qəbul olunur", "customNumberDesc": "Defolt olaraq {n}, və ya 'Page {n} of {total}', 'Text-{n}', '{filename}-{n}", - "submit": "Səhifə NÃļmrələri əlavə edin" + "submit": "Səhifə NÃļmrələri əlavə edin", + "configuration": "Configuration", + "customize": "Customize Appearance", + "pagesAndStarting": "Pages & Starting Number", + "positionAndPages": "Position & Pages", + "error": { + "failed": "Add page numbers operation failed" + }, + "results": { + "title": "Page Number Results" + }, + "preview": "Position Selection", + "previewDisclaimer": "Preview is approximate. Final output may vary due to PDF font metrics." }, + "pageSelectionPrompt": "XÃŧsusi Səhifə Seçimi (1, 5, 6 tərzində vergÃŧllə ayrÄąlmÄąÅŸ səhifə nÃļmrələri listini və ya 2n+1 tərzində Funksiyalar daxil edin) :", + "startingNumberTooltip": "The first number to display. Subsequent pages will increment from this number.", + "marginTooltip": "Distance between the page number and the edge of the page.", + "fontSizeTooltip": "Size of the page number text in points. Larger numbers create bigger text.", + "fontTypeTooltip": "Font family for the page numbers. Choose based on your document style.", + "customTextTooltip": "Optional custom format for page numbers. Use {n} as placeholder for the number. Example: \"Page {n}\" will show \"Page 1\", \"Page 2\", etc.", "pdfPrompt": "PDF(lər)i Seç", "multiPdfPrompt": "PDFləri Seç (2+)", "multiPdfDropPrompt": "EhtiyacÄąnÄąz olan bÃŧtÃŧn PDFləri seçin (və ya sÃŧrÃŧkləyib buraxÄąn)", @@ -30,15 +84,41 @@ "uploadLimitExceededPlural": "are too large. Maximum allowed size is", "processTimeWarning": "XəbərdarlÄąq: Bu proses fayl ÃļlçÃŧsÃŧndən asÄąlÄą olaraq bir dəqiqəyə qədər vaxt ala bilər", "pageOrderPrompt": "XÃŧsusi Səhifə ArdÄącÄąllığı (VergÃŧllə ayrÄąlmÄąÅŸ səhifə nÃļmrələri listini və ya 2n+1 tərzində Funksiyalar daxil edin) :", - "pageSelectionPrompt": "XÃŧsusi Səhifə Seçimi (1, 5, 6 tərzində vergÃŧllə ayrÄąlmÄąÅŸ səhifə nÃļmrələri listini və ya 2n+1 tərzində Funksiyalar daxil edin) :", "goToPage": "Get", "true": "Doğru", "false": "YanlÄąÅŸ", "unknown": "Bilinməyən", + "app": { + "description": "The Free Adobe Acrobat alternative (10M+ Downloads)" + }, "save": "Saxla", "saveToBrowser": "Brauzerdə Saxla", + "download": "Endir", + "pin": "Pin File (keep active after tool run)", + "unpin": "Unpin File (replace after tool run)", + "undoOperationTooltip": "Click to undo the last operation and restore the original files", + "undo": "Undo", + "moreOptions": "More Options", + "editYourNewFiles": "Edit your new file(s)", "close": "Bağla", + "openInViewer": "Open in Viewer", + "confirmClose": "Confirm Close", + "confirmCloseMessage": "Are you sure you want to close this file?", + "confirmCloseCancel": "Cancel", + "confirmCloseConfirm": "Close File", + "fileSelected": "Selected: {{filename}}", + "chooseFile": "Choose File", "filesSelected": "seçilmiş fayllar", + "files": { + "title": "Files", + "upload": "Upload", + "uploadFiles": "Upload Files", + "addFiles": "Add files", + "selectFromWorkbench": "Select files from the workbench or ", + "selectMultipleFromWorkbench": "Select at least {{count}} files from the workbench or ", + "created": "Created", + "size": "File Size" + }, "noFavourites": "Sevimlilər əlavə edilmədi", "downloadComplete": "YÃŧkləmə TamamlandÄą", "bored": "GÃļzləməkdən SÄąxÄąldÄąnÄąz?", @@ -56,7 +136,10 @@ }, "error": { "pdfPassword": "PDF sənədi şifrlənmişdir və şifr təmin edilməmişdir və ya yanlÄąÅŸdÄąr.", + "encryptedPdfMustRemovePassword": "This PDF is encrypted or password-protected. Please unlock it before converting to PDF/A.", + "incorrectPasswordProvided": "The PDF password is incorrect or not provided.", "_value": "Xəta", + "dismissAllErrors": "Dismiss All Errors", "sorry": "Problem ÃŧçÃŧn Ãŧzr istəyirik!", "needHelp": "KÃļmək lazÄąmdÄąr / Problem tapdÄąnÄąz?", "contactTip": "Əgər hələ də problem yaşayÄąrsÄąnÄązsa, kÃļmək ÃŧçÃŧn bizə mÃŧraciət etməkdən çəkinməyin. GitHub səhifəmizdə bilet təqdim edə və ya Discord vasitəsilə bizimlə əlaqə saxlaya bilərsiniz:", @@ -71,6 +154,10 @@ "githubSubmit": "GitHub - Bilet təqdim edin", "discordSubmit": "Discord - Dəstək postunu gÃļndərin" }, + "warning": { + "tooltipTitle": "Warning" + }, + "edit": "Edit", "delete": "Sil", "username": "İstifadəçi AdÄą", "password": "Şifr", @@ -82,6 +169,7 @@ "green": "YaÅŸÄąl", "blue": "Mavi", "custom": "XÃŧsusi...", + "comingSoon": "Coming soon", "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", @@ -115,12 +203,14 @@ "page": "Səhifə", "pages": "Səhifələr", "loading": "YÃŧklənir...", + "review": "Review", "addToDoc": "Sənədə Əlavə Et", "reset": "SÄąfÄąrla", "apply": "Apply", "noFileSelected": "No file selected. Please upload one.", "legal": { "privacy": "Məxfilik Siyasəti", + "iAgreeToThe": "I agree to all of the", "terms": "Qaydalar və Şərtlər", "accessibility": "ƏlçatanlÄąq", "cookie": "Kuki Siyasəti", @@ -160,6 +250,7 @@ "title": "Stirling PDF-i daha yaxÅŸÄą etmək istəyirsinizmi?", "paragraph1": "Stirling PDF bizə məhsulu inkişaf etdirməyə kÃļmək etmək ÃŧçÃŧn analitikaya ÃŧstÃŧnlÃŧk verib. Biz heç bir şəxsi məlumatÄą və ya fayl məzmununu izləmirik.", "paragraph2": "Zəhmət olmasa, Stringling-PDF-ə inkişaf etməkdə və istifadəçilərimizi daha yaxÅŸÄą anlamaqda yardÄąm etmək ÃŧçÃŧn analitikanÄą aktivləşdirməyi nəzərə alÄąn.", + "learnMore": "Learn more", "enable": "AnalitikanÄą aktivləşdir", "disable": "AnalitikanÄą deaktivləşdir", "settings": "AnalitikanÄąn parametrlərini config/settings.yml faylÄąndan dəyişə bilərsiniz." @@ -203,6 +294,54 @@ "cacheInputs": { "name": "Formada daxil edilən bilgiləri yadda saxlayÄąn", "help": "Gələcək əməliyyatlar ÃŧçÃŧn əvvəllər istifadə edilmiş daxil edilmiş bilgiləri saxlamağa imkan verin" + }, + "general": { + "title": "General", + "description": "Configure general application preferences.", + "account": "Account", + "accountDescription": "Manage your account settings", + "user": "User", + "signedInAs": "Signed in as", + "logout": "Log out", + "enableFeatures": { + "title": "For System Administrators", + "intro": "Enable user authentication, team management, and workspace features for your organization.", + "action": "Configure", + "and": "and", + "benefit": "Enables user roles, team collaboration, admin controls, and enterprise features.", + "learnMore": "Learn more in documentation", + "dismiss": "Dismiss" + }, + "autoUnzip": "Auto-unzip API responses", + "autoUnzipDescription": "Automatically extract files from ZIP responses", + "autoUnzipTooltip": "Automatically extract ZIP files returned from API operations. Disable to keep ZIP files intact. This does not affect automation workflows.", + "autoUnzipFileLimit": "Auto-unzip file limit", + "autoUnzipFileLimitDescription": "Maximum number of files to extract from ZIP", + "autoUnzipFileLimitTooltip": "Only unzip if the ZIP contains this many files or fewer. Set higher to extract larger ZIPs.", + "defaultToolPickerMode": "Default tool picker mode", + "defaultToolPickerModeDescription": "Choose whether the tool picker opens in fullscreen or sidebar by default", + "mode": { + "fullscreen": "Fullscreen", + "sidebar": "Sidebar" + } + }, + "hotkeys": { + "title": "Keyboard Shortcuts", + "description": "Hover a tool to see its shortcut or customise it below. Click \"Change shortcut\" and press a new key combination. Press Esc to cancel.", + "errorModifier": { + "mac": "Include ⌘ (Command), âŒĨ (Option), or another modifier in your shortcut.", + "windows": "Include Ctrl, Alt, or another modifier in your shortcut." + }, + "errorConflict": "Shortcut already used by {{tool}}.", + "none": "Not assigned", + "customBadge": "Custom", + "defaultLabel": "Default: {{shortcut}}", + "capturing": "Press keysâ€Ļ (Esc to cancel)", + "change": "Change shortcut", + "reset": "Reset", + "shortcut": "Shortcut", + "noShortcut": "No shortcut set", + "searchPlaceholder": "Search tools..." } }, "changeCreds": { @@ -274,8 +413,10 @@ "top20": "Top 20", "all": "All", "refresh": "Refresh", - "includeHomepage": "Include Homepage ('/')", - "includeLoginPage": "Include Login Page ('/login')", + "dataTypeLabel": "Data Type:", + "dataTypeAll": "All", + "dataTypeApi": "API", + "dataTypeUi": "UI", "totalEndpoints": "Total Endpoints", "totalVisits": "Total Visits", "showing": "Showing", @@ -290,7 +431,9 @@ "top": "Top", "numberOfVisits": "Number of Visits", "visitsTooltip": "Visits: {0} ({1}% of total)", - "retry": "Retry" + "retry": "Retry", + "includeHomepage": "Include Homepage ('/')", + "includeLoginPage": "Include Login Page ('/login')" }, "database": { "title": "Verilənlər bazasÄąnÄą Daxil/Xaric Et", @@ -331,22 +474,310 @@ "alphabetical": "Alphabetical", "globalPopularity": "Global Popularity", "sortBy": "Sort by:", + "mobile": { + "brandAlt": "Stirling PDF logo", + "openFiles": "Open files", + "swipeHint": "Swipe left or right to switch views", + "tools": "Tools", + "toolsSlide": "Tool selection panel", + "viewSwitcher": "Switch workspace view", + "workbenchSlide": "Workspace panel", + "workspace": "Workspace" + }, "multiTool": { + "tags": "multiple,tools", "title": "PDF Multi-alət", "desc": "Səhifələri Birləşdir, Çevir, Yenidən SÄąrala, BÃļl və Sil" }, "merge": { + "tags": "combine,join,unite", "title": "Birləşdir", "desc": "Bir neçə PDF-i asanlÄąqla bir PDF-də birləşdir." }, "split": { + "tags": "divide,separate,break", "title": "BÃļl", "desc": "PDF-ləri bir neçə sənədə bÃļl" }, "rotate": { + "tags": "turn,flip,orient", "title": "Çevir", "desc": "PDF-lərinizi asanlÄąqla çevirin." }, + "convert": { + "tags": "transform,change", + "title": "Çevir", + "desc": "Convert files between different formats" + }, + "pdfOrganiser": { + "tags": "organize,rearrange,reorder", + "title": "Səhifələri SÄąrala", + "desc": "Səhifələri Sil/SÄąrasÄąnÄą Dəyiş" + }, + "addImage": { + "tags": "insert,embed,place", + "title": "Şəkil əlavə et", + "desc": "PDF-də təyin edilmiş yerə şəkil əlavə edir" + }, + "addAttachments": { + "tags": "embed,attach,include", + "title": "Add Attachments", + "desc": "Add or remove embedded files (attachments) to/from a PDF" + }, + "watermark": { + "tags": "stamp,mark,overlay", + "title": "Watermark əlavə et", + "desc": "PDF sənədinə fərdi watermark əlavə et." + }, + "removePassword": { + "tags": "unlock", + "title": "Şifri Sil", + "desc": "PDF Sənədindən şifr qorumasÄąnÄą gÃļtÃŧr." + }, + "compress": { + "tags": "shrink,reduce,optimize", + "title": "SÄąx", + "desc": "PDF fayllarÄąnÄą sÄąxaraq onlarÄąn ÃļlçÃŧsÃŧnÃŧ azalt." + }, + "unlockPDFForms": { + "tags": "unlock,enable,edit", + "title": "Unlock PDF Forms", + "desc": "Remove read-only property of form fields in a PDF document." + }, + "changeMetadata": { + "tags": "edit,modify,update", + "title": "MetadatanÄą Dəyiş", + "desc": "PDF sənədindəki MetadatanÄą Dəyiş/Sil/Əlavə et" + }, + "ocr": { + "tags": "extract,scan", + "title": "OCR / SkanlarÄą Təmizlə", + "desc": "SkanlarÄą təmizləyir və PDF-in içərisindəki şəkillərdəki yazÄąnÄą tapÄąb mətn olaraq əlavə edir." + }, + "extractImages": { + "tags": "pull,save,export", + "title": "Şəkilləri Xaric Et", + "desc": "PDF-dəki şəkilləri xaric edib onlarÄą zip faylÄąnda saxlayÄąr" + }, + "scannerImageSplit": { + "tags": "detect,split,photos", + "title": "Detect & Split Scanned Photos", + "desc": "Detect and split scanned photos into separate pages" + }, + "sign": { + "tags": "signature,autograph", + "title": "İmzala", + "desc": "Mətn, şəkil və ya əllə çəkmə Ãŧsulu ilə PDF-ə imza əlavə edir" + }, + "flatten": { + "tags": "simplify,remove,interactive", + "title": "Sadələşdir", + "desc": "BÃŧtÃŧn interaktiv elementləri və anketləri PDF-dən sil" + }, + "certSign": { + "tags": "authenticate,PEM,P12,official,encrypt,sign,certificate,PKCS12,JKS,server,manual,auto", + "title": "Sertifikat İlə İmzala", + "desc": "PDF-i Sertifikat/Açar (PEM/P12) ilə imzalayÄąr" + }, + "repair": { + "tags": "fix,restore", + "title": "Bərpa Et", + "desc": "Pozulmuş PDF-i Bərpa Etməyə ÇalÄąÅŸÄąr" + }, + "removeBlanks": { + "tags": "delete,clean,empty", + "title": "Boş Səhifələri Sil", + "desc": "Sənəddə boş səhifələri tapÄąr və silir" + }, + "removeAnnotations": { + "tags": "delete,clean,strip", + "title": "SitatlarÄą Sil", + "desc": "PDF-dən bÃŧtÃŧn şərhləri və sitatlarÄą silir" + }, + "compare": { + "tags": "difference", + "title": "MÃŧqayisə Et", + "desc": "2 PDF Sənədini mÃŧqayisə edir və fərqləri gÃļstərir" + }, + "removeCertSign": { + "tags": "remove,delete,unlock", + "title": "Sertifikat İmzasÄąnÄą Sil", + "desc": "PDF-dən Sertifikat imzasÄąnÄą gÃļtÃŧr" + }, + "pageLayout": { + "tags": "layout,arrange,combine", + "title": "Çoxsəhifəli Tərtibat", + "desc": "PDF-in birdən çox səhifəsini bir səhifədə birləşdir" + }, + "bookletImposition": { + "tags": "booklet,print,binding", + "title": "Booklet Imposition", + "desc": "Create booklets with proper page ordering and multi-page layout for printing and binding" + }, + "scalePages": { + "tags": "resize,adjust,scale", + "title": "Səhifə ÃļlçÃŧsÃŧnÃŧ/MiqyasÄąnÄą Dəyiş", + "desc": "Səhifənin və/və ya onun məzmununun ÃļlçÃŧsÃŧnÃŧ və miqyasÄąnÄą dəyiş" + }, + "addPageNumbers": { + "tags": "number,pagination,count", + "title": "Səhifələri NÃļmrələ", + "desc": "Sənədin səhifələrinə təyin edilmiş yerdə nÃļmrələr əlavə edin" + }, + "autoRename": { + "tags": "auto-detect,header-based,organize,relabel", + "title": "Auto Rename PDF File", + "desc": "Auto renames a PDF file based on its detected header" + }, + "adjustContrast": { + "tags": "contrast,brightness,saturation", + "title": "Rəngləri/KontrastÄą Tənzimlə", + "desc": "PDF-in kontrastÄąnÄą, parlaqlığınÄą, rəng doyğunluğunu tənzimlə" + }, + "crop": { + "tags": "trim,cut,resize", + "title": "PDF-i Kəs", + "desc": "ÖlçÃŧsÃŧnÃŧ azaltmaq ÃŧçÃŧn PDF-i kəs (mətni saxlayÄąr!)" + }, + "autoSplitPDF": { + "tags": "auto,split,QR", + "title": "Səhifələri Avtomatik AyÄąr", + "desc": "Fiziki skan olunmuş səhifələri QR koda əsasən ayÄąr" + }, + "sanitize": { + "tags": "clean,purge,remove", + "title": "Sanitise", + "desc": "Remove potentially harmful elements from PDF files" + }, + "getPdfInfo": { + "tags": "info,metadata,details", + "title": "PDF-in BÃŧtÃŧn MəlumatlarÄą", + "desc": "PDF barədə mÃŧmkÃŧn olan bÃŧtÃŧn məlumatlarÄą əldə edir" + }, + "pdfToSinglePage": { + "tags": "combine,merge,single", + "title": "PDF-dən 1 BÃļyÃŧk Səhifəyə", + "desc": "BÃŧtÃŧn PDF səhifələrini bir bÃļyÃŧk səhifəyə çevirir" + }, + "showJS": { + "tags": "javascript,code,script", + "title": "Javascript-i GÃļstər", + "desc": "PDF-in tərkibinə əlavə edilmiş JS-i axtarÄąr və gÃļstərir" + }, + "redact": { + "tags": "censor,blackout,hide", + "title": "Manual Redaction", + "desc": "Redacts a PDF based on selected text, drawn shapes and/or selected page(s)" + }, + "splitBySections": { + "tags": "split,sections,divide", + "title": "Split PDF by Sections", + "desc": "Divide each page of a PDF into smaller horizontal and vertical sections" + }, + "addStamp": { + "tags": "stamp,mark,seal", + "title": "Add Stamp to PDF", + "desc": "Add text or add image stamps at set locations" + }, + "removeImage": { + "tags": "remove,delete,clean", + "title": "Şəkli Sil", + "desc": "Fayl ÃļlçÃŧsÃŧnÃŧ azaltmaq ÃŧçÃŧn PDF-dən şəkil sil" + }, + "splitByChapters": { + "tags": "split,chapters,structure", + "title": "PDF-i Fəsillərə Əsasən BÃļl", + "desc": "Fəsil strukturuna əsasən PDF-i bir neçə fayla bÃļl." + }, + "validateSignature": { + "tags": "validate,verify,certificate", + "title": "Validate PDF Signature", + "desc": "Verify digital signatures and certificates in PDF documents" + }, + "swagger": { + "tags": "API,documentation,test", + "title": "API Documentation", + "desc": "View API documentation and test endpoints" + }, + "scannerEffect": { + "tags": "scan,simulate,create", + "title": "Scanner Effect", + "desc": "Create a PDF that looks like it was scanned" + }, + "editTableOfContents": { + "tags": "bookmarks,contents,edit", + "title": "Edit Table of Contents", + "desc": "Add or edit bookmarks and table of contents in PDF documents" + }, + "manageCertificates": { + "tags": "certificates,import,export", + "title": "Manage Certificates", + "desc": "Import, export, or delete digital certificate files used for signing PDFs." + }, + "read": { + "tags": "view,open,display", + "title": "Read", + "desc": "View and annotate PDFs. Highlight text, draw, or insert comments for review and collaboration." + }, + "reorganizePages": { + "tags": "rearrange,reorder,organize", + "title": "Reorganize Pages", + "desc": "Rearrange, duplicate, or delete PDF pages with visual drag-and-drop control." + }, + "extractPages": { + "tags": "pull,select,copy", + "title": "Səhifələri Ã§Äąxar", + "desc": "Extract specific pages from a PDF document" + }, + "removePages": { + "tags": "delete,extract,exclude", + "title": "Sil", + "desc": "PDF Sənədindən istəmədiyin şəkilləri sil." + }, + "autoSizeSplitPDF": { + "tags": "auto,split,size", + "title": "Say/ÖlçÃŧyə Əsasən Avtomatik AyÄąr", + "desc": "PDF-i ÃļlçÃŧyə, səhifə sayÄąna və ya sənəd sayÄąna əsasən bir neçə PDF-ə ayÄąr." + }, + "replaceColor": { + "title": "Replace & Invert Colour", + "desc": "Replace or invert colours in PDF documents" + }, + "devApi": { + "tags": "API,development,documentation", + "title": "API", + "desc": "Link to API documentation" + }, + "devFolderScanning": { + "tags": "automation,folder,scanning", + "title": "Automated Folder Scanning", + "desc": "Link to automated folder scanning guide" + }, + "devSsoGuide": { + "title": "SSO Guide", + "desc": "Link to SSO guide" + }, + "devAirgapped": { + "title": "Air-gapped Setup", + "desc": "Link to air-gapped setup guide" + }, + "addPassword": { + "title": "Şifr Əlavə Et", + "desc": "Sənədini şifr ilə kilidlə." + }, + "changePermissions": { + "title": "İcazələri Dəyişdir", + "desc": "Change document restrictions and permissions" + }, + "automate": { + "tags": "workflow,sequence,automation", + "title": "Automate", + "desc": "Build multi-step workflows by chaining together PDF actions. Ideal for recurring tasks." + }, + "overlay-pdfs": { + "desc": "Bir PDF-i digərinin ÃŧstÃŧnə qoyur", + "title": "Üst-Üstə Qoy" + }, "imageToPDF": { "title": "Şəkildən PDF-ə", "desc": "Şəkli (PNG, JPEG, GIF) PDF-ə Çevir." @@ -355,18 +786,6 @@ "title": "PDF-dən Şəkilə", "desc": "PDF-i Şəkilə Çevir. (PNG, JPEG, GIF)" }, - "pdfOrganiser": { - "title": "Səhifələri SÄąrala", - "desc": "Səhifələri Sil/SÄąrasÄąnÄą Dəyiş" - }, - "addImage": { - "title": "Şəkil əlavə et", - "desc": "PDF-də təyin edilmiş yerə şəkil əlavə edir" - }, - "watermark": { - "title": "Watermark əlavə et", - "desc": "PDF sənədinə fərdi watermark əlavə et." - }, "permissions": { "title": "İcazəni Dəyiş", "desc": "PDF Sənədinin icazələrini dəyiş" @@ -375,38 +794,10 @@ "title": "Sil", "desc": "PDF Sənədindən istəmədiyin şəkilləri sil." }, - "addPassword": { - "title": "Şifr Əlavə Et", - "desc": "Sənədini şifr ilə kilidlə." - }, - "removePassword": { - "title": "Şifri Sil", - "desc": "PDF Sənədindən şifr qorumasÄąnÄą gÃļtÃŧr." - }, - "compress": { - "title": "SÄąx", - "desc": "PDF fayllarÄąnÄą sÄąxaraq onlarÄąn ÃļlçÃŧsÃŧnÃŧ azalt." - }, - "unlockPDFForms": { - "title": "Unlock PDF Forms", - "desc": "Remove read-only property of form fields in a PDF document." - }, - "changeMetadata": { - "title": "MetadatanÄą Dəyiş", - "desc": "PDF sənədindəki MetadatanÄą Dəyiş/Sil/Əlavə et" - }, "fileToPDF": { "title": "FaylÄą PDF-ə Çevir", "desc": "Hardasa bÃŧtÃŧn fayllarÄą PDF-ə çevir (DOCX, PNG, XLS, PPT, TXT və daha çox)" }, - "ocr": { - "title": "OCR / SkanlarÄą Təmizlə", - "desc": "SkanlarÄą təmizləyir və PDF-in içərisindəki şəkillərdəki yazÄąnÄą tapÄąb mətn olaraq əlavə edir." - }, - "extractImages": { - "title": "Şəkilləri Xaric Et", - "desc": "PDF-dəki şəkilləri xaric edib onlarÄą zip faylÄąnda saxlayÄąr" - }, "pdfToPDFA": { "title": "PDF-dən PDF/A-a", "desc": "PDF faylÄąnÄą uzunmÃŧddətli saxlama ÃŧçÃŧn PDF/A-a çevir" @@ -435,70 +826,14 @@ "title": "Skan Edilmiş Şəkilləri Detektə et/AyÄąr", "desc": "Şəkil/PDF-dən çoxlu şəkilləri ayÄąrÄąr" }, - "sign": { - "title": "İmzala", - "desc": "Mətn, şəkil və ya əllə çəkmə Ãŧsulu ilə PDF-ə imza əlavə edir" - }, - "flatten": { - "title": "Sadələşdir", - "desc": "BÃŧtÃŧn interaktiv elementləri və anketləri PDF-dən sil" - }, - "repair": { - "title": "Bərpa Et", - "desc": "Pozulmuş PDF-i Bərpa Etməyə ÇalÄąÅŸÄąr" - }, - "removeBlanks": { - "title": "Boş Səhifələri Sil", - "desc": "Sənəddə boş səhifələri tapÄąr və silir" - }, - "removeAnnotations": { - "title": "SitatlarÄą Sil", - "desc": "PDF-dən bÃŧtÃŧn şərhləri və sitatlarÄą silir" - }, - "compare": { - "title": "MÃŧqayisə Et", - "desc": "2 PDF Sənədini mÃŧqayisə edir və fərqləri gÃļstərir" - }, - "certSign": { - "title": "Sertifikat İlə İmzala", - "desc": "PDF-i Sertifikat/Açar (PEM/P12) ilə imzalayÄąr" - }, - "removeCertSign": { - "title": "Sertifikat İmzasÄąnÄą Sil", - "desc": "PDF-dən Sertifikat imzasÄąnÄą gÃļtÃŧr" - }, - "pageLayout": { - "title": "Çoxsəhifəli Tərtibat", - "desc": "PDF-in birdən çox səhifəsini bir səhifədə birləşdir" - }, - "scalePages": { - "title": "Səhifə ÃļlçÃŧsÃŧnÃŧ/MiqyasÄąnÄą Dəyiş", - "desc": "Səhifənin və/və ya onun məzmununun ÃļlçÃŧsÃŧnÃŧ və miqyasÄąnÄą dəyiş" - }, "pipeline": { "title": "Pipeline", "desc": "Pipeline Skriptləri təyin edərək PDF-lər Ãŧzərində bir neçə prosesi eyni vaxtda reallaşdÄąrÄąn." }, - "addPageNumbers": { - "title": "Səhifələri NÃļmrələ", - "desc": "Sənədin səhifələrinə təyin edilmiş yerdə nÃļmrələr əlavə edin" - }, "auto-rename": { "title": "PDF FaylÄąnÄą Avtomatik Yenidən AdlandÄąr", "desc": "TapÄąlmÄąÅŸ başlığa əsasən PDF faylÄąnÄąn adÄąnÄą dəyişir" }, - "adjustContrast": { - "title": "Rəngləri/KontrastÄą Tənzimlə", - "desc": "PDF-in kontrastÄąnÄą, parlaqlığınÄą, rəng doyğunluğunu tənzimlə" - }, - "crop": { - "title": "PDF-i Kəs", - "desc": "ÖlçÃŧsÃŧnÃŧ azaltmaq ÃŧçÃŧn PDF-i kəs (mətni saxlayÄąr!)" - }, - "autoSplitPDF": { - "title": "Səhifələri Avtomatik AyÄąr", - "desc": "Fiziki skan olunmuş səhifələri QR koda əsasən ayÄąr" - }, "sanitizePDF": { "title": "Təmizlə", "desc": "Skriptləri və digər elementləri PDF faylÄąndan sil" @@ -519,30 +854,14 @@ "title": "PDF to Markdown", "desc": "Converts any PDF to Markdown" }, - "getPdfInfo": { - "title": "PDF-in BÃŧtÃŧn MəlumatlarÄą", - "desc": "PDF barədə mÃŧmkÃŧn olan bÃŧtÃŧn məlumatlarÄą əldə edir" - }, "pageExtracter": { "title": "Səhifə(lər)i xaric et", "desc": "Seçilmiş səhifələri PDF-dən xaric edərək əldə et" }, - "pdfToSinglePage": { - "title": "PDF-dən 1 BÃļyÃŧk Səhifəyə", - "desc": "BÃŧtÃŧn PDF səhifələrini bir bÃļyÃŧk səhifəyə çevirir" - }, - "showJS": { - "title": "Javascript-i GÃļstər", - "desc": "PDF-in tərkibinə əlavə edilmiş JS-i axtarÄąr və gÃļstərir" - }, "autoRedact": { "title": "Avtomatik Gizlətmə", "desc": "Daxil edilmiş data əsasÄąnda PDF-dəki mÃŧəyyən mətn hissəsini qara qutu ilə gizlədir" }, - "redact": { - "title": "Manual Redaction", - "desc": "Redacts a PDF based on selected text, drawn shapes and/or selected page(s)" - }, "PDFToCSV": { "title": "PDF-dən CSV-ə", "desc": "PDF-dən cədvəlləri CSV-ə çevirərək xaric edir" @@ -551,10 +870,6 @@ "title": "Say/ÖlçÃŧyə Əsasən Avtomatik AyÄąr", "desc": "PDF-i ÃļlçÃŧyə, səhifə sayÄąna və ya sənəd sayÄąna əsasən bir neçə PDF-ə ayÄąr." }, - "overlay-pdfs": { - "title": "Üst-Üstə Qoy", - "desc": "Bir PDF-i digərinin ÃŧstÃŧnə qoyur" - }, "split-by-sections": { "title": "PDF-i Hissələrə Əsasən BÃļl", "desc": "PDF-in hər səhifəsini daha kiçik Ãŧfuqi və şaquli hissələrə bÃļl" @@ -563,43 +878,17 @@ "title": "PDF-i MÃļhÃŧrlə", "desc": "Təyin edilmiş hissələrə mətn və ya şəkil mÃļhÃŧrləri əlavə edin" }, - "removeImage": { - "title": "Şəkli Sil", - "desc": "Fayl ÃļlçÃŧsÃŧnÃŧ azaltmaq ÃŧçÃŧn PDF-dən şəkil sil" - }, - "splitByChapters": { - "title": "PDF-i Fəsillərə Əsasən BÃļl", - "desc": "Fəsil strukturuna əsasən PDF-i bir neçə fayla bÃļl." - }, - "validateSignature": { - "title": "Validate PDF Signature", - "desc": "Verify digital signatures and certificates in PDF documents" - }, "replace-color": { "title": "QabaqcÄąl Rəng Seçimləri", "desc": "Replace color for text and background in PDF and invert full color of pdf to reduce file size" }, - "convert": { - "title": "Çevir" - }, "attachments": { "title": "Add attachments" }, - "extractPages": { - "title": "Səhifələri Ã§Äąxar" - }, - "removePages": { - "title": "Sil", - "desc": "PDF Sənədindən istəmədiyin şəkilləri sil." - }, "removeImagePdf": { "title": "Şəkli Sil", "desc": "Fayl ÃļlçÃŧsÃŧnÃŧ azaltmaq ÃŧçÃŧn PDF-dən şəkil sil" }, - "autoSizeSplitPDF": { - "title": "Say/ÖlçÃŧyə Əsasən Avtomatik AyÄąr", - "desc": "PDF-i ÃļlçÃŧyə, səhifə sayÄąna və ya sənəd sayÄąna əsasən bir neçə PDF-ə ayÄąr." - }, "adjust-contrast": { "title": "Rəngləri/KontrastÄą Tənzimlə", "desc": "PDF-in kontrastÄąnÄą, parlaqlığınÄą, rəng doyğunluğunu tənzimlə" @@ -607,11 +896,12 @@ "replaceColorPdf": { "title": "QabaqcÄąl Rəng Seçimləri", "desc": "Replace color for text and background in PDF and invert full color of pdf to reduce file size" - }, - "changePermissions": { - "title": "İcazələri Dəyişdir" } }, + "landing": { + "addFiles": "Add Files", + "uploadFromComputer": "Upload from computer" + }, "viewPdf": { "tags": "bax,oxu,sitat gÃļtÃŧr,mətn,şəkil", "title": "View/Edit PDF", @@ -645,17 +935,39 @@ "merge": { "tags": "birləşdir,Səhifə əməliyyatlarÄą,Back end,server-tərəf", "title": "Birləşdirin", + "removeDigitalSignature": { + "label": "Remove digital signature in the merged file?", + "tooltip": { + "title": "Remove Digital Signature", + "description": "Digital signatures will be invalidated when merging files. Check this to remove them from the final merged PDF." + } + }, + "generateTableOfContents": { + "label": "Generate table of contents in the merged file?", + "tooltip": { + "title": "Generate Table of Contents", + "description": "Automatically creates a clickable table of contents in the merged PDF based on the original file names and page numbers." + } + }, + "submit": "Birləşdirin", + "sortBy": { + "description": "Files will be merged in the order they're selected. Drag to reorder or sort below.", + "label": "Sort By", + "filename": "Fayl AdÄą", + "dateModified": "Date Modified", + "ascending": "Ascending", + "descending": "Descending", + "sort": "Sort" + }, + "error": { + "failed": "An error occurred while merging the PDFs." + }, "header": "ÇoxsaylÄą PDF-ləri birləşdirin (2+)", "sortByName": "Ada gÃļrə çeşidləyin", "sortByDate": "Tarixə gÃļrə çeşidləyin", - "removeCertSign": "Birləşdirilmiş faylda rəqəmsal imza silinsin?", - "submit": "Birləşdirin", - "sortBy": { - "filename": "Fayl AdÄą" - } + "removeCertSign": "Birləşdirilmiş faylda rəqəmsal imza silinsin?" }, "split": { - "tags": "Səhifə əməliyyarlarÄą,bÃļl,Çoxlu Səhifə,kəs,server-tərəf", "title": "PDF-i BÃļlÃŧn", "header": "PDF-i BÃļlÃŧn", "desc": { @@ -671,25 +983,249 @@ "splitPages": "BÃļlÃŧnəcək Səhifələri Daxil Edin:", "submit": "BÃļlÃŧn", "steps": { + "chooseMethod": "Choose Method", "settings": "Parametrlər" }, + "settings": { + "selectMethodFirst": "Please select a split method first" + }, + "error": { + "failed": "An error occurred while splitting the PDF." + }, + "method": { + "label": "Choose split method", + "placeholder": "Select how to split the PDF" + }, "methods": { + "prefix": { + "splitAt": "Split at", + "splitBy": "Split by" + }, + "byPages": { + "name": "Page Numbers", + "desc": "Extract specific pages (1,3,5-10)", + "tooltip": "Enter page numbers separated by commas or ranges with hyphens" + }, + "bySections": { + "name": "Sections", + "desc": "Divide pages into grid sections", + "tooltip": "Split each page into horizontal and vertical sections" + }, "bySize": { - "name": "Fayl ÖlçÃŧsÃŧ" + "name": "Fayl ÖlçÃŧsÃŧ", + "desc": "Limit maximum file size", + "tooltip": "Specify maximum file size (e.g. 10MB, 500KB)" + }, + "byPageCount": { + "name": "Page Count", + "desc": "Fixed pages per file", + "tooltip": "Enter the number of pages for each split file" + }, + "byDocCount": { + "name": "Document Count", + "desc": "Create specific number of files", + "tooltip": "Enter how many files you want to create" + }, + "byChapters": { + "name": "Chapters", + "desc": "Split at bookmark boundaries", + "tooltip": "Uses PDF bookmarks to determine split points" + }, + "byPageDivider": { + "name": "Page Divider", + "desc": "Auto-split with divider sheets", + "tooltip": "Use QR code divider sheets between documents when scanning" } }, "value": { "fileSize": { - "label": "Fayl ÖlçÃŧsÃŧ" + "label": "Fayl ÖlçÃŧsÃŧ", + "placeholder": "e.g. 10MB, 500KB" + }, + "pageCount": { + "label": "Pages per File", + "placeholder": "e.g. 5, 10" + }, + "docCount": { + "label": "Number of Files", + "placeholder": "e.g. 3, 5" } - } + }, + "tooltip": { + "header": { + "title": "Split Methods Overview" + }, + "byPages": { + "title": "Split at Page Numbers", + "text": "Split your PDF at specific page numbers. Using 'n' splits after page n. Using 'n-m' splits before page n and after page m.", + "bullet1": "Single split points: 3,7 (splits after pages 3 and 7)", + "bullet2": "Range split points: 3-8 (splits before page 3 and after page 8)", + "bullet3": "Mixed: 2,5-10,15 (splits after page 2, before page 5, after page 10, and after page 15)" + }, + "bySections": { + "title": "Split by Grid Sections", + "text": "Divide each page into a grid of sections. Useful for splitting documents with multiple columns or extracting specific areas.", + "bullet1": "Horizontal: Number of rows to create", + "bullet2": "Vertical: Number of columns to create", + "bullet3": "Merge: Combine all sections into one PDF" + }, + "bySize": { + "title": "Split by File Size", + "text": "Create multiple PDFs that don't exceed a specified file size. Ideal for file size limitations or email attachments.", + "bullet1": "Use MB for larger files (e.g., 10MB)", + "bullet2": "Use KB for smaller files (e.g., 500KB)", + "bullet3": "System will split at page boundaries" + }, + "byCount": { + "title": "Split by Count", + "text": "Create multiple PDFs with a specific number of pages or documents each.", + "bullet1": "Page Count: Fixed number of pages per file", + "bullet2": "Document Count: Fixed number of output files", + "bullet3": "Useful for batch processing workflows" + }, + "byChapters": { + "title": "Split by Chapters", + "text": "Use PDF bookmarks to automatically split at chapter boundaries. Requires PDFs with bookmark structure.", + "bullet1": "Bookmark Level: Which level to split on (1=top level)", + "bullet2": "Include Metadata: Preserve document properties", + "bullet3": "Allow Duplicates: Handle repeated bookmark names" + }, + "byDocCount": { + "bullet1": "Enter the number of output files you want", + "bullet2": "Pages are distributed as evenly as possible", + "bullet3": "Useful when you need a specific number of files", + "text": "Create a specific number of output files by evenly distributing pages across them.", + "title": "Split by Document Count" + }, + "byPageCount": { + "bullet1": "Enter the number of pages per output file", + "bullet2": "Last file may have fewer pages if not evenly divisible", + "bullet3": "Useful for batch processing workflows", + "text": "Create multiple PDFs with a specific number of pages each. Perfect for creating uniform document chunks.", + "title": "Split by Page Count" + }, + "byPageDivider": { + "bullet1": "Print divider sheets from the download link", + "bullet2": "Insert divider sheets between your documents", + "bullet3": "Scan all documents together as one PDF", + "bullet4": "Upload - divider pages are automatically detected and removed", + "bullet5": "Enable Duplex Mode if scanning both sides of divider sheets", + "text": "Automatically split scanned documents using physical divider sheets with QR codes. Perfect for processing multiple documents scanned together.", + "title": "Split by Page Divider" + } + }, + "methodSelection": { + "tooltip": { + "bullet1": "Click on a method card to select it", + "bullet2": "Hover over each card to see a quick description", + "bullet3": "The settings step will appear after you select a method", + "bullet4": "You can change methods at any time before processing", + "header": { + "text": "Choose how you want to split your PDF document. Each method is optimized for different use cases and document types.", + "title": "Split Method Selection" + }, + "title": "Choose Your Split Method" + } + }, + "selectMethod": "Select a split method", + "tags": "Səhifə əməliyyarlarÄą,bÃļl,Çoxlu Səhifə,kəs,server-tərəf" }, "rotate": { - "tags": "server-tərəf", "title": "PDF fÄąrladÄąn", + "submit": "FÄąrladÄąn", + "selectRotation": "Select Rotation Angle (Clockwise)", + "error": { + "failed": "An error occurred while rotating the PDF." + }, + "preview": { + "title": "Rotation Preview" + }, + "rotateLeft": "Rotate Anticlockwise", + "rotateRight": "Rotate Clockwise", + "tooltip": { + "header": { + "title": "Rotate Settings Overview" + }, + "description": { + "text": "Rotate your PDF pages clockwise or anticlockwise in 90-degree increments. All pages in the PDF will be rotated. The preview shows how your document will look after rotation." + }, + "controls": { + "title": "Controls", + "text": "Use the rotation buttons to adjust orientation. Left button rotates anticlockwise, right button rotates clockwise. Each click rotates by 90 degrees." + } + }, + "tags": "server-tərəf", "header": "PDF fÄąrladÄąn", - "selectAngle": "FÄąrlanma bucağınÄą seçin (90 dərəcə ilə):", - "submit": "FÄąrladÄąn" + "selectAngle": "FÄąrlanma bucağınÄą seçin (90 dərəcə ilə):" + }, + "convert": { + "title": "Çevir", + "desc": "Convert files between different formats", + "files": "Files", + "selectFilesPlaceholder": "Select files in the main view to get started", + "settings": "Parametrlər", + "conversionCompleted": "Conversion completed", + "results": "Results", + "defaultFilename": "converted_file", + "conversionResults": "Conversion Results", + "convertFrom": "Convert from", + "convertTo": "Convert to", + "sourceFormatPlaceholder": "Source format", + "targetFormatPlaceholder": "Target format", + "selectSourceFormatFirst": "Select a source format first", + "outputOptions": "Output Options", + "pdfOptions": "PDF Options", + "imageOptions": "Image Options", + "colorType": "Colour Type", + "color": "Rəng", + "greyscale": "Boz Tonlama", + "blackwhite": "Black & White", + "dpi": "DPI", + "output": "Output", + "single": "Single", + "multiple": "Multiple", + "fitOption": "Fit Option", + "maintainAspectRatio": "Maintain Aspect Ratio", + "fitDocumentToPage": "Fit Document to Page", + "fillPage": "Səhifəni Doldur", + "autoRotate": "Auto Rotate", + "autoRotateDescription": "Automatically rotate images to better fit the PDF page", + "combineImages": "Combine Images", + "combineImagesDescription": "Combine all images into one PDF, or create separate PDFs for each image", + "webOptions": "Web to PDF Options", + "zoomLevel": "Zoom Level", + "emailOptions": "Email to PDF Options", + "includeAttachments": "Include email attachments", + "maxAttachmentSize": "Maximum attachment size (MB)", + "includeAllRecipients": "Include CC and BCC recipients in header", + "downloadHtml": "Download HTML intermediate file instead of PDF", + "pdfaOptions": "PDF/A Options", + "outputFormat": "Output Format", + "pdfaNote": "PDF/A-1b is more compatible, PDF/A-2b supports more features.", + "pdfaDigitalSignatureWarning": "PDF Rəqəmsal İmza Ehtiva Edir.Bu, nÃļvbəti addÄąmda silinəcək.", + "fileFormat": "File Format", + "wordDoc": "Word Document", + "wordDocExt": "Word Document (.docx)", + "odtExt": "OpenDocument Text (.odt)", + "pptExt": "PowerPoint (.pptx)", + "odpExt": "OpenDocument Presentation (.odp)", + "txtExt": "Plain Text (.txt)", + "rtfExt": "Rich Text Format (.rtf)", + "selectedFiles": "Selected files", + "noFileSelected": "No file selected. Use the file panel to add files.", + "convertFiles": "Convert Files", + "converting": "Converting...", + "downloadConverted": "Download Converted File", + "errorNoFiles": "Please select at least one file to convert.", + "errorNoFormat": "Please select both source and target formats.", + "errorNotSupported": "Conversion from {{from}} to {{to}} is not supported.", + "images": "Images", + "officeDocs": "Office Documents (Word, Excel, PowerPoint)", + "imagesExt": "Images (JPG, PNG, etc.)", + "markdown": "Markdown", + "textRtf": "Text/RTF", + "grayscale": "Boz Tonlama", + "errorConversion": "An error occurred while converting the file." }, "imageToPdf": { "tags": "çevirmə,şəkil,jpg,fotoşəkil,foto" @@ -727,7 +1263,33 @@ "8": "Sonuncunu Sil", "9": "Birinci və Sonuncunu Sil", "10": "Tək-CÃŧt Birləşdirmə", - "11": "Duplicate all pages" + "11": "Duplicate all pages", + "desc": { + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, â€Ļ).", + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, â€Ļ).", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimized for binding on the side)." + } + }, + "desc": { + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, â€Ļ).", + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, â€Ļ).", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimised for binding on the side).", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document." }, "placeholder": "(məs., 1,3,2 və ya 4-8,2,10-12 və ya 2n-1)" }, @@ -739,9 +1301,198 @@ "upload": "Şəkli Əlavə Et", "submit": "Şəkli Əlavə Et" }, + "attachments": { + "tags": "embed,attach,file,attachment,attachments", + "title": "Add attachments", + "header": "Add attachments", + "add": "Add Attachment", + "remove": "Remove Attachment", + "embed": "Embed Attachment", + "submit": "Add attachments" + }, "watermark": { - "tags": "Mətn,təkrarlanan,nişan,sahib olmaq,mÃŧəllif hÃŧquqlarÄą,əmtəə nişanÄą,şəkil,jpg,fotoşəkil,foto", "title": "Watermark Əlavə Et", + "desc": "Add text or image watermarks to PDF files", + "completed": "Watermark added", + "submit": "Watermark Əlavə Et", + "filenamePrefix": "watermarked", + "error": { + "failed": "An error occurred while adding watermark to the PDF." + }, + "watermarkType": { + "text": "YazÄą", + "image": "Image" + }, + "settings": { + "type": "Watermark Type", + "text": { + "label": "Watermark Text", + "placeholder": "Enter watermark text" + }, + "image": { + "label": "Watermark Image", + "choose": "Choose Image", + "selected": "Selected: {{filename}}" + }, + "fontSize": "Şrift ÖlçÃŧsÃŧ", + "size": "Size", + "alphabet": "Font/Language", + "color": "Watermark Colour", + "rotation": "Rotation (degrees)", + "opacity": "Opacity (%)", + "spacing": { + "horizontal": "Horizontal Spacing", + "vertical": "Vertical Spacing", + "height": "Height Spacing", + "width": "Width Spacing" + }, + "convertToImage": "Flatten PDF pages to images" + }, + "alphabet": { + "roman": "Roman/Latin", + "arabic": "Arabic", + "japanese": "Japanese", + "korean": "Korean", + "chinese": "Chinese", + "thai": "Thai" + }, + "steps": { + "type": "Watermark Type", + "wording": "Wording", + "textStyle": "Style", + "formatting": "Formatting", + "file": "Watermark File" + }, + "results": { + "title": "Watermark Results" + }, + "tooltip": { + "language": { + "title": "Language Support", + "text": "Choose the appropriate language setting to ensure proper font rendering for your text." + }, + "appearance": { + "title": "Appearance Settings", + "text": "Control how your watermark looks and blends with the document.", + "bullet1": "Rotation: -360° to 360° for angled watermarks", + "bullet2": "Opacity: 0-100% for transparency control", + "bullet3": "Lower opacity creates subtle watermarks" + }, + "spacing": { + "title": "Spacing Control", + "text": "Adjust the spacing between repeated watermarks across the page.", + "bullet1": "Width spacing: Horizontal distance between watermarks", + "bullet2": "Height spacing: Vertical distance between watermarks", + "bullet3": "Higher values create more spread out patterns" + }, + "type": { + "header": { + "title": "Watermark Type Selection" + }, + "description": { + "title": "Choose Your Watermark", + "text": "Select between text or image watermarks based on your needs." + }, + "text": { + "title": "Text Watermarks", + "text": "Perfect for adding copyright notices, company names, or confidentiality labels. Supports multiple languages and custom colours.", + "bullet1": "Customisable fonts and languages", + "bullet2": "Adjustable colours and transparency", + "bullet3": "Ideal for legal or branding text" + }, + "image": { + "title": "Image Watermarks", + "text": "Use logos, stamps, or any image as a watermark. Great for branding and visual identification.", + "bullet1": "Upload any image format", + "bullet2": "Maintains image quality", + "bullet3": "Perfect for logos and stamps" + } + }, + "wording": { + "header": { + "title": "Text Content" + }, + "text": { + "title": "Watermark Text", + "text": "Enter the text that will appear as your watermark across the document.", + "bullet1": "Keep it concise for better readability", + "bullet2": "Common examples: 'CONFIDENTIAL', 'DRAFT', company name", + "bullet3": "Emoji characters are not supported and will be filtered out" + } + }, + "textStyle": { + "header": { + "title": "Text Style" + }, + "color": { + "title": "Colour Selection", + "text": "Choose a colour that provides good contrast with your document content.", + "bullet1": "Light grey (#d3d3d3) for subtle watermarks", + "bullet2": "Black or dark colours for high contrast", + "bullet3": "Custom colours for branding purposes" + }, + "language": { + "title": "Language Support", + "text": "Choose the appropriate language setting to ensure proper font rendering." + } + }, + "file": { + "header": { + "title": "Image Upload" + }, + "upload": { + "title": "Image Selection", + "text": "Upload an image file to use as your watermark.", + "bullet1": "Supports common formats: PNG, JPG, GIF, BMP", + "bullet2": "PNG with transparency works best", + "bullet3": "Higher resolution images maintain quality better" + }, + "recommendations": { + "title": "Best Practices", + "text": "Tips for optimal image watermark results.", + "bullet1": "Use logos or stamps with transparent backgrounds", + "bullet2": "Simple designs work better than complex images", + "bullet3": "Consider the final document size when choosing resolution" + } + }, + "formatting": { + "header": { + "title": "Formatting & Layout" + }, + "size": { + "title": "Size Control", + "text": "Adjust the size of your watermark (text or image).", + "bullet1": "Larger sizes create more prominent watermarks" + }, + "appearance": { + "title": "Appearance Settings", + "text": "Control how your watermark looks and blends with the document.", + "bullet1": "Rotation: -360° to 360° for angled watermarks", + "bullet2": "Opacity: 0-100% for transparency control", + "bullet3": "Lower opacity creates subtle watermarks" + }, + "spacing": { + "title": "Spacing Control", + "text": "Adjust the spacing between repeated watermarks across the page.", + "bullet1": "Horizontal spacing: Distance between watermarks left to right", + "bullet2": "Vertical spacing: Distance between watermarks top to bottom", + "bullet3": "Higher values create more spread out patterns" + }, + "security": { + "title": "Security Option", + "text": "Convert the final PDF to an image-based format for enhanced security.", + "bullet1": "Prevents text selection and copying", + "bullet2": "Makes watermarks harder to remove", + "bullet3": "Results in larger file sizes", + "bullet4": "Best for sensitive or copyrighted content" + } + } + }, + "type": { + "1": "Mətn", + "2": "Şəkil" + }, + "tags": "Mətn,təkrarlanan,nişan,sahib olmaq,mÃŧəllif hÃŧquqlarÄą,əmtəə nişanÄą,şəkil,jpg,fotoşəkil,foto", "header": "Watermark Əlavə Et", "customColor": "Fərdi Mətn Rəngi", "selectText": { @@ -755,17 +1506,6 @@ "8": "Watermark Tipi:", "9": "Watermark Şəkili:", "10": "PDF-i PDF-Şəkil-ə çevir" - }, - "submit": "Watermark Əlavə Et", - "type": { - "1": "Mətn", - "2": "Şəkil" - }, - "watermarkType": { - "text": "YazÄą" - }, - "settings": { - "fontSize": "Şrift ÖlçÃŧsÃŧ" } }, "permissions": { @@ -790,50 +1530,201 @@ "removePages": { "tags": "Səhifələri təmizlə,səhifələri sil", "title": "Sil", + "pageNumbers": { + "label": "Pages to Remove", + "placeholder": "e.g., 1,3,5-8,10", + "error": "Invalid page number format. Use numbers, ranges (1-5), or mathematical expressions (2n+1)" + }, + "filenamePrefix": "pages_removed", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "settings": { + "title": "Settings" + }, + "tooltip": { + "header": { + "title": "Remove Pages Settings" + }, + "pageNumbers": { + "title": "Page Selection", + "text": "Specify which pages to remove from your PDF. You can select individual pages, ranges, or use mathematical expressions.", + "bullet1": "Individual pages: 1,3,5 (removes pages 1, 3, and 5)", + "bullet2": "Page ranges: 1-5,10-15 (removes pages 1-5 and 10-15)", + "bullet3": "Mathematical: 2n+1 (removes odd pages)", + "bullet4": "Open ranges: 5- (removes from page 5 to end)" + }, + "examples": { + "title": "Common Examples", + "text": "Here are some common page selection patterns:", + "bullet1": "Remove first page: 1", + "bullet2": "Remove last 3 pages: -3", + "bullet3": "Remove every other page: 2n", + "bullet4": "Remove specific scattered pages: 1,5,10,15" + }, + "safety": { + "title": "Safety Tips", + "text": "Important considerations when removing pages:", + "bullet1": "Always preview your selection before processing", + "bullet2": "Keep a backup of your original file", + "bullet3": "Page numbers start from 1, not 0", + "bullet4": "Invalid page numbers will be ignored" + } + }, + "error": { + "failed": "An error occurred whilst removing pages." + }, + "results": { + "title": "Page Removal Results" + }, "submit": "Sil" }, - "addPassword": { - "tags": "təhlÃŧkəsiz,təhlÃŧkəsizlik", - "title": "Şifr Əlavə Et", - "header": "Şifr Əlavə Et (Şifrləmə)", - "selectText": { - "1": "Şifrlənəcək PDF-i seç", - "2": "İstifadəçi Şifri", - "3": "Şifrləmə AçarÄą Uzunluğu", - "4": "BÃļyÃŧk dəyərlər daha gÃŧclÃŧdÃŧr, lakin kiçik dəyərlərin uyğunluğu yÃŧksəkdir.", - "5": "Təyin olunacaq icazə (Sahib (Owner) Şifri ilə birgə istifadə olunmasÄą tÃļvsiyə olunur.)", - "6": "Sənədin strukturunun dəyişilməsinin qarÅŸÄąsÄąnÄą al", - "7": "Məzmun xaric edilməsinin qarÅŸÄąsÄąnÄą al", - "8": "ƏlçatanlÄąq ÃŧçÃŧn xaricetmənin qarÅŸÄąsÄąnÄą al", - "9": "Anketin doldurulmasÄąnÄąn qarÅŸÄąsÄąnÄą al", - "10": "ModifikasiyanÄąn qarÅŸÄąsÄąnÄą al", - "11": "Sitat modifikasiyasÄąnÄąn qarÅŸÄąsÄąnÄą al", - "12": "Çap etmənin qarÅŸÄąsÄąnÄą al", - "13": "MÃŧxtəlif formatlarÄąn çap edilməsinin qarÅŸÄąsÄąnÄą al", - "14": "Sahib Şifri", - "15": "Sənəd aÃ§ÄąldÄąqdan sonra onunla nə edilə biləcəyini limitləndir (BÃŧtÃŧn oxuyucular dəstəkləmir)", - "16": "Sənədin ÃļzÃŧnÃŧn aÃ§ÄąlmağınÄą limitləndirir" + "extractPages": { + "title": "Extract Pages", + "pageNumbers": { + "label": "Pages to Extract", + "placeholder": "e.g., 1,3,5-8 or odd & 1-10" + }, + "settings": { + "title": "Settings" }, - "submit": "Şifrlə", "tooltip": { - "permissions": { - "title": "İcazələri Dəyişdir" + "description": "Extracts the selected pages into a new PDF, preserving order." + }, + "error": { + "failed": "Failed to extract pages" + }, + "results": { + "title": "Pages Extracted" + }, + "submit": "Extract Pages" + }, + "pageSelection": { + "tooltip": { + "header": { + "title": "Page Selection Guide" + }, + "basic": { + "title": "Basic Usage", + "text": "Select specific pages from your PDF document using simple syntax.", + "bullet1": "Individual pages: 1,3,5", + "bullet2": "Page ranges: 3-6 or 10-15", + "bullet3": "All pages: all" + }, + "advanced": { + "title": "Advanced Features" + }, + "tips": { + "title": "Tips", + "text": "Keep these guidelines in mind:", + "bullet1": "Page numbers start from 1 (not 0)", + "bullet2": "Spaces are automatically removed", + "bullet3": "Invalid expressions are ignored" + }, + "syntax": { + "title": "Syntax Basics", + "text": "Use numbers, ranges, keywords, and progressions (n starts at 0). Parentheses are supported.", + "bullets": { + "numbers": "Numbers/ranges: 5, 10-20", + "keywords": "Keywords: odd, even", + "progressions": "Progressions: 3n, 4n+1" + } + }, + "operators": { + "title": "Operators", + "text": "AND has higher precedence than comma. NOT applies within the document range.", + "and": "AND: & or \"and\" — require both conditions (e.g., 1-50 & even)", + "comma": "Comma: , or | — combine selections (e.g., 1-10, 20)", + "not": "NOT: ! or \"not\" — exclude pages (e.g., 3n & not 30)" + }, + "examples": { + "title": "Examples" + }, + "complex": { + "bullet1": "1,3-5,8,2n → pages 1, 3–5, 8, plus evens", + "bullet2": "10-,2n-1 → from page 10 to end + odd pages", + "description": "Mix different types.", + "title": "Complex Combinations" + }, + "description": "Choose which pages to use for the operation. Supports single pages, ranges, formulas, and the all keyword.", + "individual": { + "bullet1": "1,3,5 → selects pages 1, 3, 5", + "bullet2": "2,7,12 → selects pages 2, 7, 12", + "description": "Enter numbers separated by commas.", + "title": "Individual Pages" + }, + "mathematical": { + "bullet1": "2n → all even pages (2, 4, 6â€Ļ)", + "bullet2": "2n-1 → all odd pages (1, 3, 5â€Ļ)", + "bullet3": "3n → every 3rd page (3, 6, 9â€Ļ)", + "bullet4": "4n-1 → pages 3, 7, 11, 15â€Ļ", + "description": "Use n in formulas for patterns.", + "title": "Mathematical Functions" + }, + "ranges": { + "bullet1": "3-6 → selects pages 3–6", + "bullet2": "10-15 → selects pages 10–15", + "bullet3": "5- → selects pages 5 to end", + "description": "Use - for consecutive pages.", + "title": "Page Ranges" + }, + "special": { + "bullet1": "all → selects all pages", + "title": "Special Keywords" } } }, - "removePassword": { - "tags": "təhlÃŧkəsiz,deşifr,təhlÃŧkəsizlik,kodu aç,kodu sil", - "title": "Şifri Sil", - "header": "Şifri Sil (Deşifr)", - "selectText": { - "1": "Deşifr ÜçÃŧn PDF-i Seç", - "2": "Şifr" + "bulkSelection": { + "syntaxError": "There is a syntax issue. See Page Selection tips for help.", + "header": { + "title": "Page Selection Guide" }, - "submit": "Sil", - "desc": "PDF Sənədindən şifr qorumasÄąnÄą gÃļtÃŧr.", - "password": { - "stepTitle": "Şifri Sil", - "label": "Cari Şifr" + "syntax": { + "title": "Syntax Basics", + "text": "Use numbers, ranges, keywords, and progressions (n starts at 0). Parentheses are supported.", + "bullets": { + "numbers": "Numbers/ranges: 5, 10-20", + "keywords": "Keywords: odd, even", + "progressions": "Progressions: 3n, 4n+1" + } + }, + "operators": { + "title": "Operators", + "text": "AND has higher precedence than comma. NOT applies within the document range.", + "and": "AND: & or \"and\" — require both conditions (e.g., 1-50 & even)", + "comma": "Comma: , or | — combine selections (e.g., 1-10, 20)", + "not": "NOT: ! or \"not\" — exclude pages (e.g., 3n & not 30)" + }, + "examples": { + "title": "Examples", + "first50": "First 50", + "last50": "Last 50", + "every3rd": "Every 3rd", + "oddWithinExcluding": "Odd within 1-20 excluding 5-7", + "combineSets": "Combine sets" + }, + "firstNPages": { + "title": "First N Pages", + "placeholder": "Number of pages" + }, + "lastNPages": { + "title": "Last N Pages", + "placeholder": "Number of pages" + }, + "everyNthPage": { + "title": "Every Nth Page", + "placeholder": "Step size" + }, + "range": { + "title": "Range", + "fromPlaceholder": "From", + "toPlaceholder": "To" + }, + "keywords": { + "title": "Keywords" + }, + "advanced": { + "title": "Advanced" } }, "compressPdfs": { @@ -843,12 +1734,142 @@ "tags": "remove,delete,form,field,readonly", "title": "Remove Read-Only from Form Fields", "header": "Unlock PDF Forms", - "submit": "Remove" + "submit": "Remove", + "description": "This tool will remove read-only restrictions from PDF form fields, making them editable and fillable.", + "filenamePrefix": "unlocked_forms", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst unlocking PDF forms." + }, + "results": { + "title": "Unlocked Forms Results" + } }, "changeMetadata": { - "tags": "BaşlÄąq,mÃŧəllif,tarix,yaradÄąlÄąÅŸ,zaman,yayÄąmÃ§Äą,istehsalÃ§Äą,statistika", - "title": "Metadata-nÄą Dəyiş", "header": "Metadata-nÄą Dəyiş", + "submit": "Dəyiş", + "filenamePrefix": "metadata", + "settings": { + "title": "Metadata Settings" + }, + "standardFields": { + "title": "Standard Fields" + }, + "deleteAll": { + "label": "Remove Existing Metadata", + "checkbox": "Delete all metadata" + }, + "title": { + "label": "Title", + "placeholder": "Document title" + }, + "author": { + "label": "Author", + "placeholder": "Document author" + }, + "subject": { + "label": "Subject", + "placeholder": "Document subject" + }, + "keywords": { + "label": "Keywords", + "placeholder": "Document keywords" + }, + "creator": { + "label": "Creator", + "placeholder": "Document creator" + }, + "producer": { + "label": "Producer", + "placeholder": "Document producer" + }, + "dates": { + "title": "Date Fields" + }, + "creationDate": { + "label": "Creation Date", + "placeholder": "Creation date" + }, + "modificationDate": { + "label": "Modification Date", + "placeholder": "Modification date" + }, + "trapped": { + "label": "Trapped Status", + "unknown": "Unknown", + "true": "True", + "false": "False" + }, + "advanced": { + "title": "Advanced Options" + }, + "customFields": { + "title": "Custom Metadata", + "description": "Add custom metadata fields to the document", + "add": "Add Field", + "key": "Key", + "keyPlaceholder": "Custom key", + "value": "Value", + "valuePlaceholder": "Custom value", + "remove": "Remove" + }, + "results": { + "title": "Updated PDFs" + }, + "error": { + "failed": "An error occurred while changing the PDF metadata." + }, + "tooltip": { + "header": { + "title": "PDF Metadata Overview" + }, + "standardFields": { + "title": "Standard Fields", + "text": "Common PDF metadata fields that describe the document.", + "bullet1": "Title: Document name or heading", + "bullet2": "Author: Person who created the document", + "bullet3": "Subject: Brief description of content", + "bullet4": "Keywords: Search terms for the document", + "bullet5": "Creator/Producer: Software used to create the PDF" + }, + "dates": { + "title": "Date Fields", + "text": "When the document was created and modified.", + "bullet1": "Creation Date: When original document was made", + "bullet2": "Modification Date: When last changed" + }, + "options": { + "title": "Additional Options", + "text": "Custom fields and privacy controls.", + "bullet1": "Custom Metadata: Add your own key-value pairs", + "bullet2": "Trapped Status: High-quality printing setting", + "bullet3": "Delete All: Remove all metadata for privacy" + }, + "deleteAll": { + "title": "Remove Existing Metadata", + "text": "Complete metadata deletion to ensure privacy." + }, + "customFields": { + "title": "Custom Metadata", + "text": "Add your own custom key-value metadata pairs.", + "bullet1": "Add any custom fields relevant to your document", + "bullet2": "Examples: Department, Project, Version, Status", + "bullet3": "Both key and value are required for each entry" + }, + "advanced": { + "title": "Advanced Options", + "trapped": { + "title": "Trapped Status", + "description": "Indicates if document is prepared for high-quality printing.", + "bullet1": "True: Document has been trapped for printing", + "bullet2": "False: Document has not been trapped", + "bullet3": "Unknown: Trapped status is not specified" + } + } + }, + "tags": "BaşlÄąq,mÃŧəllif,tarix,yaradÄąlÄąÅŸ,zaman,yayÄąmÃ§Äą,istehsalÃ§Äą,statistika", "selectText": { "1": "Dəyişmək istədiyiniz dəyişənləri redaktə edin", "2": "BÃŧtÃŧn Metadata-nÄą Sil", @@ -856,15 +1877,7 @@ "4": "Digər Metadata:", "5": "XÃŧsusi Metadata girişi əlavə edin" }, - "author": "MÃŧəllif:", - "creationDate": "YaradÄąlma Tarixi (yyyy/MM/dd HH:mm:ss):", - "creator": "YaradÄącÄą:", - "keywords": "Açar SÃļzlər:", - "modDate": "Dəyişiklik Tarixi (yyyy/MM/dd HH:mm:ss):", - "producer": "İstehsalÃ§Äą:", - "subject": "MÃļvzu:", - "trapped": "Tələ:", - "submit": "Dəyiş" + "modDate": "Dəyişiklik Tarixi (yyyy/MM/dd HH:mm:ss):" }, "fileToPDF": { "tags": "çevirmə,format,sənəd,şəkil,slayd,mətn,çevirmə,ofis,docs,word,excel,powerpoint", @@ -878,6 +1891,7 @@ "ocr": { "tags": "tanÄąma,mətn,şəkil,skan,oxu,tanÄą,təyin et,redaktəediləbilən", "title": "OST (OCR) / Skan Təmizləmə", + "desc": "SkanlarÄą təmizləyir və PDF-in içərisindəki şəkillərdəki yazÄąnÄą tapÄąb mətn olaraq əlavə edir.", "header": "SkanlarÄą Təmizlə / OST (Optik Simvol TanÄąnmasÄą)", "selectText": { "1": "PDF-də aşkar olunacaq dilləri seçin (GÃļstərilmiş dillər hazÄąrda aşkar olunmuşlardÄąr):", @@ -896,23 +1910,89 @@ "help": "Bunu digər dillər ÃŧçÃŧn necə istifadə etmək və/və ya docker-də istifadə etməmək ÃŧçÃŧn bu dokumentasiyanÄą oxuyun", "credit": "Bu servis OST (OCR) ÃŧçÃŧn \"OCRmyPDF\" və \"Tesseract\" istifadə edir.", "submit": "PDF-i OST ilə işlə", - "desc": "SkanlarÄą təmizləyir və PDF-in içərisindəki şəkillərdəki yazÄąnÄą tapÄąb mətn olaraq əlavə edir.", + "operation": { + "submit": "Process OCR and Review" + }, + "results": { + "title": "OCR Results" + }, + "languagePicker": { + "additionalLanguages": "Looking for additional languages?", + "viewSetupGuide": "View setup guide →" + }, "settings": { "title": "Parametrlər", "ocrMode": { - "label": "OST (OCR) Rejimi" + "label": "OST (OCR) Rejimi", + "auto": "Auto (skip text layers)", + "force": "Force (re-OCR all, replace text)", + "strict": "Strict (abort if text found)" }, "languages": { - "label": "Dillər" + "label": "Dillər", + "placeholder": "Select languages" + }, + "compatibilityMode": { + "label": "Compatibility Mode" + }, + "advancedOptions": { + "label": "Processing Options", + "sidecar": "Create a text file", + "deskew": "Deskew pages", + "clean": "Clean input file", + "cleanFinal": "Clean final output" } }, "tooltip": { + "header": { + "title": "OCR Settings Overview" + }, "mode": { - "title": "OST (OCR) Rejimi" + "title": "OST (OCR) Rejimi", + "text": "Optical Character Recognition (OCR) helps you turn scanned or screenshotted pages into text you can search, copy, or highlight.", + "bullet1": "Auto skips pages that already contain text layers.", + "bullet2": "Force re-OCRs every page and replaces all the text.", + "bullet3": "Strict halts if any selectable text is found." }, "languages": { - "title": "Dillər" + "title": "Dillər", + "text": "Improve OCR accuracy by specifying the expected languages. Choose one or more languages to guide detection." + }, + "output": { + "title": "Output", + "text": "Decide how you want the text output formatted:", + "bullet1": "Searchable PDF embeds text behind the original image.", + "bullet2": "HOCR XML returns a structured machine-readable file.", + "bullet3": "Plain-text sidecar creates a separate .txt file with raw content." + }, + "advanced": { + "header": { + "title": "Advanced OCR Processing" + }, + "compatibility": { + "title": "Compatibility Mode", + "text": "Uses OCR 'sandwich PDF' mode: results in larger files, but more reliable with certain languages and older PDF software. By default we use hOCR for smaller, modern PDFs." + }, + "sidecar": { + "title": "Create Text File", + "text": "Generates a separate .txt file alongside the PDF containing all extracted text content for easy access and processing." + }, + "deskew": { + "title": "Deskew Pages", + "text": "Automatically corrects skewed or tilted pages to improve OCR accuracy. Useful for scanned documents that weren't perfectly aligned." + }, + "clean": { + "title": "Clean Input File", + "text": "Preprocesses the input by removing noise, enhancing contrast, and optimising the image for better OCR recognition before processing." + }, + "cleanFinal": { + "title": "Clean Final Output", + "text": "Post-processes the final PDF by removing OCR artefacts and optimising the text layer for better readability and smaller file size." + } } + }, + "error": { + "failed": "OCR operation failed" } }, "extractImages": { @@ -921,7 +2001,13 @@ "header": "Şəkilləri Ã§ÄąxarÄąn", "selectText": "Ã‡ÄąxarÄąlan şəkilləri çevirmək ÃŧçÃŧn şəkil formatÄąnÄą seçin", "allowDuplicates": "Dublikat şəkilləri yadda saxlayÄąn", - "submit": "Ã‡ÄąxarÄąÅŸ" + "submit": "Ã‡ÄąxarÄąÅŸ", + "settings": { + "title": "Settings" + }, + "error": { + "failed": "An error occurred while extracting images from the PDF." + } }, "pdfToPDFA": { "tags": "arxiv,uzunmÃŧddətli,standard,çevirmə,yaddaş,saxlama", @@ -993,17 +2079,53 @@ }, "info": "Python yÃŧklənməyib. İşə salmaq ÃŧçÃŧn Python lazÄąmdÄąr." }, + "scannerImageSplit": { + "title": "Extracted Images", + "submit": "Extract Image Scans", + "error": { + "failed": "An error occurred while extracting image scans." + }, + "tooltip": { + "title": "Photo Splitter", + "whatThisDoes": "What this does", + "whatThisDoesDesc": "Automatically finds and extracts each photo from a scanned page or composite image—no manual cropping.", + "whenToUse": "When to use", + "useCase1": "Scan whole album pages in one go", + "useCase2": "Split flatbed batches into separate files", + "useCase3": "Break collages into individual photos", + "useCase4": "Pull photos from documents", + "quickFixes": "Quick fixes", + "problem1": "Photos not detected → increase Tolerance to 30-50", + "problem2": "Too many false detections → increase Minimum Area to 15,000-20,000", + "problem3": "Crops are too tight → increase Border Size to 5-10", + "problem4": "Tilted photos not straightened → lower Angle Threshold to ~5°", + "problem5": "Dust/noise boxes → increase Minimum Contour Area to 1000-2000", + "setupTips": "Setup tips", + "tip1": "Use a plain, light background", + "tip2": "Leave a small gap (≈1 cm) between photos", + "tip3": "Scan at 300-600 DPI", + "tip4": "Clean the scanner glass", + "headsUp": "Heads-up", + "headsUpDesc": "Overlapping photos or backgrounds very close in colour to the photos can reduce accuracy-try a lighter or darker background and leave more space." + } + }, "sign": { - "tags": "təsdiqlə,baş hərflər,çəkilmiş-imza,mətn-imza,şəkil-imza", "title": "İmza", "header": "PDF sənədlərini imzalayÄąn", "upload": "Şəkil YÃŧklə", - "draw": "İmza çəkmək", - "text": "Mətn daxil etmə", + "draw": { + "title": "Draw your signature", + "clear": "Clear" + }, + "text": { + "name": "Signer Name", + "placeholder": "Enter your full name" + }, "clear": "Təmizləmək", "add": "Əlavə et", "saved": "Saxlanan İmzalar", "save": "İmzanÄą yadda Saxla", + "applySignatures": "Apply Signatures", "personalSigs": "Şəxsi İmzalar", "sharedSigs": "PaylaÅŸÄąlan İmzalar", "noSavedSigs": "SaxlanmÄąÅŸ imza tapÄąlmadÄą", @@ -1015,42 +2137,179 @@ "previous": "Əvvəlki səhifə", "maintainRatio": "Toggle maintain aspect ratio", "undo": "Undo", - "redo": "Redo" + "redo": "Redo", + "submit": "Sign Document", + "steps": { + "configure": "Configure Signature" + }, + "type": { + "title": "Signature Type", + "draw": "Draw", + "canvas": "Canvas", + "image": "Image", + "text": "Text" + }, + "image": { + "label": "Upload signature image", + "placeholder": "Select image file", + "hint": "Upload a PNG or JPG image of your signature" + }, + "instructions": { + "title": "How to add signature", + "canvas": "After drawing your signature in the canvas, close the modal then click anywhere on the PDF to place it.", + "image": "After uploading your signature image above, click anywhere on the PDF to place it.", + "text": "After entering your name above, click anywhere on the PDF to place your signature." + }, + "mode": { + "move": "Move Signature", + "place": "Place Signature" + }, + "updateAndPlace": "Update and Place", + "activate": "Activate Signature Placement", + "deactivate": "Stop Placing Signatures", + "results": { + "title": "Signature Results" + }, + "error": { + "failed": "An error occurred while signing the PDF." + }, + "tags": "təsdiqlə,baş hərflər,çəkilmiş-imza,mətn-imza,şəkil-imza" }, "flatten": { - "tags": "statik,deaktiv,qeyri-interaktiv,streamline", "title": "DÃŧzləşdirin", "header": "PDF-i dÃŧzləşdirin", "flattenOnlyForms": "YalnÄąz formalarÄą dÃŧzəldin", "submit": "DÃŧzləşdirin", + "filenamePrefix": "flattened", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, "steps": { "settings": "Parametrlər" }, "options": { - "flattenOnlyForms": "YalnÄąz formalarÄą dÃŧzəldin" - } + "stepTitle": "Flatten Options", + "title": "Flatten Options", + "flattenOnlyForms": { + "label": "YalnÄąz formalarÄą dÃŧzəldin", + "desc": "Only flatten form fields, leaving other interactive elements intact" + }, + "note": "Flattening removes interactive elements from the PDF, making them non-editable." + }, + "results": { + "title": "Flatten Results" + }, + "error": { + "failed": "An error occurred while flattening the PDF." + }, + "tooltip": { + "header": { + "title": "About Flattening PDFs" + }, + "description": { + "title": "What does flattening do?", + "text": "Flattening makes your PDF non-editable by turning fillable forms and buttons into regular text and images. The PDF will look exactly the same, but no one can change or fill in the forms anymore. Perfect for sharing completed forms, creating final documents for records, or ensuring the PDF looks the same everywhere.", + "bullet1": "Text boxes become regular text (can't be edited)", + "bullet2": "Checkboxes and buttons become pictures", + "bullet3": "Great for final versions you don't want changed", + "bullet4": "Ensures consistent appearance across all devices" + }, + "formsOnly": { + "title": "What does 'Flatten only forms' mean?", + "text": "This option only removes the ability to fill in forms, but keeps other features working like clicking links, viewing bookmarks, and reading comments.", + "bullet1": "Forms become non-editable", + "bullet2": "Links still work when clicked", + "bullet3": "Comments and notes remain visible", + "bullet4": "Bookmarks still help you navigate" + } + }, + "tags": "statik,deaktiv,qeyri-interaktiv,streamline" }, "repair": { "tags": "dÃŧzəlt,bərpa et,korreksiya et,geri qaytar", "title": "Bərpa Et", "header": "PDFləri Bərpa Et", - "submit": "Bərpa Et" + "submit": "Bərpa Et", + "description": "This tool will attempt to repair corrupted or damaged PDF files. No additional settings are required.", + "filenamePrefix": "repaired", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst repairing the PDF." + }, + "results": { + "title": "Repair Results" + } }, "removeBlanks": { - "tags": "təmizləmə,streamline,qeyri-məzmun,nizamla", "title": "Boş Səhifələri Sil", "header": "Boş SƏhifələri Silir", - "threshold": "Minimal Piksel Bəyazlığı:", + "settings": { + "title": "Settings" + }, + "threshold": { + "label": "Pixel Whiteness Threshold" + }, + "whitePercent": { + "label": "White Percentage Threshold", + "unit": "%" + }, + "includeBlankPages": { + "label": "Include detected blank pages" + }, + "tooltip": { + "header": { + "title": "Remove Blank Pages Settings" + }, + "threshold": { + "title": "Pixel Whiteness Threshold", + "text": "Controls how white a pixel must be to be considered 'white'. This helps determine what counts as a blank area on the page.", + "bullet1": "0 = Pure black (most restrictive)", + "bullet2": "128 = Medium grey", + "bullet3": "255 = Pure white (least restrictive)" + }, + "whitePercent": { + "title": "White Percentage Threshold", + "text": "Sets the minimum percentage of white pixels required for a page to be considered blank and removed.", + "bullet1": "Lower values (e.g., 80%) = More pages removed", + "bullet2": "Higher values (e.g., 95%) = Only very blank pages removed", + "bullet3": "Use higher values for documents with light backgrounds" + }, + "includeBlankPages": { + "title": "Include Detected Blank Pages", + "text": "When enabled, creates a separate PDF containing all the blank pages that were detected and removed from the original document.", + "bullet1": "Useful for reviewing what was removed", + "bullet2": "Helps verify the detection accuracy", + "bullet3": "Can be disabled to reduce output file size" + } + }, + "submit": "Boş Səhifələri Sil", + "error": { + "failed": "Failed to remove blank pages" + }, + "results": { + "title": "Removed Blank Pages" + }, + "tags": "təmizləmə,streamline,qeyri-məzmun,nizamla", "thresholdDesc": "Pikselin \"Ağ\" hesab olunmasÄą ÃŧçÃŧn minimal nə qədər bəyaz olmalÄą olduğunu təyin edin. 0 = Qara, 255 Ağappaq.", - "whitePercent": "Bəyaz Faizi (%):", - "whitePercentDesc": "Silinmək ÃŧçÃŧn səhifənin neçə faizi \"ağ\" piksellərdən təşkil olunmalÄądÄąr", - "submit": "Boş Səhifələri Sil" + "whitePercentDesc": "Silinmək ÃŧçÃŧn səhifənin neçə faizi \"ağ\" piksellərdən təşkil olunmalÄądÄąr" }, "removeAnnotations": { "tags": "şərhlər,Ãļnə Ã§Äąxanlar,qeydlər,işarələmə,sil", "title": "AnnotasiyalarÄą silin", "header": "AnnotasiyalarÄą silin", - "submit": "Sil" + "submit": "Sil", + "settings": { + "title": "Settings" + }, + "info": { + "title": "About Remove Annotations", + "description": "This tool will remove all annotations (comments, highlights, notes, etc.) from your PDF documents." + }, + "error": { + "failed": "An error occurred while removing annotations from the PDF." + } }, "compare": { "tags": "fərqləndir,təzad yarat,dəyişikliklər,analiz", @@ -1082,6 +2341,142 @@ "certSign": { "tags": "Doğrula,PEM,P12,rəsmi,şifrlə", "title": "Sertifikatla İmzala", + "filenamePrefix": "signed", + "signMode": { + "stepTitle": "Sign Mode", + "tooltip": { + "header": { + "title": "About PDF Signatures" + }, + "overview": { + "title": "How signatures work", + "text": "Both modes seal the document (any edits are flagged as tampering) and record who/when/how for auditing. Viewer trust depends on the certificate chain." + }, + "manual": { + "title": "Manual - Bring your certificate", + "text": "Use your own certificate files for brand-aligned identity. Can display Trusted when your CA/chain is recognised.", + "use": "Use for: customer-facing, legal, compliance." + }, + "auto": { + "title": "Auto - Zero-setup, instant system seal", + "text": "Signs with a server self-signed certificate. Same tamper-evident seal and audit trail; typically shows Unverified in viewers.", + "use": "Use when: you need speed and consistent internal identity across reviews and records." + }, + "rule": { + "title": "Rule of thumb", + "text": "Need recipient Trusted status? Manual. Need a fast, tamper-evident seal and audit trail with no setup? Auto." + } + } + }, + "certTypeStep": { + "stepTitle": "Certificate Format" + }, + "certFiles": { + "stepTitle": "Certificate Files" + }, + "appearance": { + "stepTitle": "Signature Appearance", + "tooltip": { + "header": { + "title": "About Signature Appearance" + }, + "invisible": { + "title": "Invisible Signatures", + "text": "The signature is added to the PDF for security but won't be visible when viewing the document. Perfect for legal requirements without changing the document's appearance.", + "bullet1": "Provides security without visual changes", + "bullet2": "Meets legal requirements for digital signing", + "bullet3": "Doesn't affect document layout or design" + }, + "visible": { + "title": "Visible Signatures", + "text": "Shows a signature block on the PDF with your name, date, and optional details. Useful when you want readers to clearly see the document is signed.", + "bullet1": "Shows signer name and date on the document", + "bullet2": "Can include reason and location for signing", + "bullet3": "Choose which page to place the signature", + "bullet4": "Optional logo can be included" + } + }, + "invisible": "Invisible", + "options": { + "title": "Signature Details" + }, + "visible": "Visible" + }, + "sign": { + "submit": "Sign PDF", + "results": "Signed PDF" + }, + "error": { + "failed": "An error occurred whilst processing signatures." + }, + "tooltip": { + "header": { + "title": "About Managing Signatures" + }, + "overview": { + "title": "What can this tool do?", + "text": "This tool lets you check if your PDFs are digitally signed and add new digital signatures. Digital signatures prove who created or approved a document and show if it has been changed since signing.", + "bullet1": "Check existing signatures and their validity", + "bullet2": "View detailed information about signers and certificates", + "bullet3": "Add new digital signatures to secure your documents", + "bullet4": "Multiple files supported with easy navigation" + }, + "validation": { + "title": "Checking Signatures", + "text": "When you check signatures, the tool tells you if they're valid, who signed the document, when it was signed, and whether the document has been changed since signing.", + "bullet1": "Shows if signatures are valid or invalid", + "bullet2": "Displays signer information and signing date", + "bullet3": "Checks if the document was modified after signing", + "bullet4": "Can use custom certificates for verification" + }, + "signing": { + "title": "Adding Signatures", + "text": "To sign a PDF, you need a digital certificate (like PEM, PKCS12, or JKS). You can choose to make the signature visible on the document or keep it invisible for security only.", + "bullet1": "Supports PEM, PKCS12, JKS, and server certificate formats", + "bullet2": "Option to show or hide signature on the PDF", + "bullet3": "Add reason, location, and signer name", + "bullet4": "Choose which page to place visible signatures", + "bullet5": "Use server certificate for simple 'Sign with Stirling-PDF' option" + } + }, + "certType": { + "tooltip": { + "header": { + "title": "About Certificate Types" + }, + "what": { + "title": "What's a certificate?", + "text": "It's a secure ID for your signature that proves you signed. Unless you're required to sign via certificate, we recommend using another secure method like Type, Draw, or Upload." + }, + "which": { + "title": "Which option should I use?", + "text": "Choose the format that matches your certificate file:", + "bullet1": "PKCS#12 (.p12 / .pfx) – one combined file (most common)", + "bullet2": "PFX (.pfx) – Microsoft's version of PKCS12", + "bullet3": "PEM – separate private-key and certificate .pem files", + "bullet4": "JKS – Java .jks keystore for dev / CI-CD workflows" + }, + "convert": { + "title": "Key not listed?", + "text": "Convert your file to a Java keystore (.jks) with keytool, then pick JKS." + } + } + }, + "chooseCertificate": "Choose Certificate File", + "chooseJksFile": "Choose JKS File", + "chooseP12File": "Choose PKCS12 File", + "choosePfxFile": "Choose PFX File", + "choosePrivateKey": "Choose Private Key File", + "location": "Məkan", + "logoTitle": "Logo", + "name": "Ad", + "noLogo": "No Logo", + "pageNumber": "Page Number", + "password": "Keystore və ya Şəxsi Açar daxil edin (Əgər varsa):", + "passwordOptional": "Leave empty if no password", + "reason": "Səbəb", + "serverCertMessage": "Using server certificate - no files or password required", + "showLogo": "Loqonu GÃļstər", "header": "PDF-i SertifikatÄąnÄązla İmzalayÄąn (İşlənilir)", "selectPDF": "İmzalamaq ÃŧçÃŧn PDF FaylÄą seçin:", "jksNote": "Note: Əgər sertifikatÄąnÄązÄąn tipi aşağıda gÃļstərilməyibsə, zəhmət olmasa \"Keytool command line tool\" istifadə edərək onu \"Java Keystroke\" (.jks) faylÄąna çevirin. Sonra, aşağıdan .jks faylÄąnÄą seçin.", @@ -1089,13 +2484,7 @@ "selectCert": "Sertifikat faylÄąnÄązÄą seçin (X.509 format, .pem və ya .der ola bilər):", "selectP12": "PKCS#12 Keystore FaylÄąnÄązÄą seçin (.p12 və ya .pfx) (İstəyə bağlÄą, əgər təmin olunarsa, şəxsi açar və sertifikatÄąnÄązÄą ehtiva etməlidir):", "selectJKS": "Java Keystore FaylÄąnÄązÄą seçin (.jks və ya .keystore):", - "certType": "Sertifikat Tipi", - "password": "Keystore və ya Şəxsi Açar daxil edin (Əgər varsa):", "showSig": "İmzanÄą GÃļstər", - "reason": "Səbəb", - "location": "Məkan", - "name": "Ad", - "showLogo": "Loqonu GÃļstər", "submit": "PDF-i İmzala" }, "removeCertSign": { @@ -1103,7 +2492,18 @@ "title": "Sertifikat İmzasÄąnÄą Sil", "header": "Rəqəmsal sertifikatÄą PDF-dən Ã§ÄąxarÄąn", "selectPDF": "PDF faylÄą seçin:", - "submit": "İmzanÄą silin" + "submit": "İmzanÄą silin", + "description": "This tool will remove digital certificate signatures from your PDF document.", + "filenamePrefix": "unsigned", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst removing certificate signatures." + }, + "results": { + "title": "Certificate Removal Results" + } }, "pageLayout": { "tags": "birləşdir,sintez,tək-baxÄąÅŸ,nizamla", @@ -1111,16 +2511,157 @@ "header": "Çoxsəhifəli Tərtibat", "pagesPerSheet": "Vərəqdəki Səhifə SayÄą:", "addBorder": "Çərçivə Əlavə Et", - "submit": "Təsdiq et" + "submit": "Təsdiq et", + "desc": { + "2": "Place 2 pages side-by-side on a single sheet.", + "3": "Place 3 pages on a single sheet in a single row.", + "4": "Place 4 pages on a single sheet (2 × 2 grid).", + "9": "Place 9 pages on a single sheet (3 × 3 grid).", + "16": "Place 16 pages on a single sheet (4 × 4 grid)." + }, + "error": { + "failed": "An error occurred while creating the multi-page layout." + } + }, + "bookletImposition": { + "tags": "booklet,imposition,printing,binding,folding,signature", + "title": "Booklet Imposition", + "header": "Booklet Imposition", + "submit": "Create Booklet", + "spineLocation": { + "label": "Spine Location", + "left": "Left (Standard)", + "right": "Right (RTL)" + }, + "doubleSided": { + "label": "Double-sided printing", + "tooltip": "Creates both front and back sides for proper booklet printing" + }, + "manualDuplex": { + "title": "Manual Duplex Mode", + "instructions": "For printers without automatic duplex. You'll need to run this twice:" + }, + "duplexPass": { + "label": "Print Pass", + "first": "1st Pass", + "second": "2nd Pass", + "firstInstructions": "Prints front sides → stack face-down → run again with 2nd Pass", + "secondInstructions": "Load printed stack face-down → prints back sides" + }, + "rtlBinding": { + "label": "Right-to-left binding", + "tooltip": "For Arabic, Hebrew, or other right-to-left languages" + }, + "addBorder": { + "label": "Add borders around pages", + "tooltip": "Adds borders around each page section to help with cutting and alignment" + }, + "addGutter": { + "label": "Add gutter margin", + "tooltip": "Adds inner margin space for binding" + }, + "gutterSize": { + "label": "Gutter size (points)" + }, + "flipOnShortEdge": { + "label": "Flip on short edge (automatic duplex only)", + "tooltip": "Enable for short-edge duplex printing (automatic duplex only - ignored in manual mode)", + "manualNote": "Not needed in manual mode - you flip the stack yourself" + }, + "advanced": { + "toggle": "Advanced Options" + }, + "paperSizeNote": "Paper size is automatically derived from your first page.", + "tooltip": { + "header": { + "title": "Booklet Creation Guide" + }, + "description": { + "title": "What is Booklet Imposition?", + "text": "Creates professional booklets by arranging pages in the correct printing order. Your PDF pages are placed 2-up on landscape sheets so when folded and bound, they read in proper sequence like a real book." + }, + "example": { + "title": "Example: 8-Page Booklet", + "text": "Your 8-page document becomes 2 sheets:", + "bullet1": "Sheet 1 Front: Pages 8, 1 | Back: Pages 2, 7", + "bullet2": "Sheet 2 Front: Pages 6, 3 | Back: Pages 4, 5", + "bullet3": "When folded & stacked: Reads 1→2→3→4→5→6→7→8" + }, + "printing": { + "title": "How to Print & Assemble", + "text": "Follow these steps for perfect booklets:", + "bullet1": "Print double-sided with 'Flip on long edge'", + "bullet2": "Stack sheets in order, fold in half", + "bullet3": "Staple or bind along the folded spine", + "bullet4": "For short-edge printers: Enable 'Flip on short edge' option" + }, + "manualDuplex": { + "title": "Manual Duplex (Single-sided Printers)", + "text": "For printers without automatic duplex:", + "bullet1": "Turn OFF 'Double-sided printing'", + "bullet2": "Select '1st Pass' → Print → Stack face-down", + "bullet3": "Select '2nd Pass' → Load stack → Print backs", + "bullet4": "Fold and assemble as normal" + }, + "advanced": { + "title": "Advanced Options", + "text": "Fine-tune your booklet:", + "bullet1": "Right-to-Left Binding: For Arabic, Hebrew, or RTL languages", + "bullet2": "Borders: Shows cut lines for trimming", + "bullet3": "Gutter Margin: Adds space for binding/stapling", + "bullet4": "Short-edge Flip: Only for automatic duplex printers" + } + }, + "error": { + "failed": "An error occurred while creating the booklet imposition." + } }, "scalePages": { - "tags": "ÃļlçÃŧsÃŧnÃŧ dəyiş,modifikasiya et,ÃļlçÃŧlər,uyğunlaş", "title": "Səhifə miqyasÄąnÄą tənzimləyin", "header": "Səhifə miqyasÄąnÄą tənzimləyin", "pageSize": "Sənədin bir səhifəsinin ÃļlçÃŧsÃŧ.", "keepPageSize": "Orijinal ÖlçÃŧ", "scaleFactor": "Səhifənin bÃļyÃŧtmə səviyyəsi (kəsmə).", - "submit": "Təsdiq edin" + "submit": "Təsdiq edin", + "tags": "ÃļlçÃŧsÃŧnÃŧ dəyiş,modifikasiya et,ÃļlçÃŧlər,uyğunlaş" + }, + "adjustPageScale": { + "tags": "resize,modify,dimension,adapt", + "title": "Adjust Page Scale", + "header": "Adjust Page Scale", + "scaleFactor": { + "label": "Scale Factor" + }, + "pageSize": { + "label": "Target Page Size", + "keep": "Keep Original Size", + "letter": "Letter", + "legal": "Legal" + }, + "submit": "Adjust Page Scale", + "error": { + "failed": "An error occurred while adjusting the page scale." + }, + "tooltip": { + "header": { + "title": "Page Scale Settings Overview" + }, + "description": { + "title": "Description", + "text": "Adjust the size of PDF content and change the page dimensions." + }, + "scaleFactor": { + "title": "Scale Factor", + "text": "Controls how large or small the content appears on the page. Content is scaled and centred - if scaled content is larger than the page size, it may be cropped.", + "bullet1": "1.0 = Original size", + "bullet2": "0.5 = Half size (50% smaller)", + "bullet3": "2.0 = Double size (200% larger, may crop)" + }, + "pageSize": { + "title": "Target Page Size", + "text": "Sets the dimensions of the output PDF pages. 'Keep Original Size' maintains current dimensions, whilst other options resize to standard paper sizes." + } + } }, "add-page-numbers": { "tags": "nÃļmrələ,taq,səliqələ,indeks" @@ -1129,16 +2670,83 @@ "tags": "avtodetektə,başlÄąq-əsaslÄą,səliqələ,yenidən adlandÄąr", "title": "Avtomatik Yenidən AdlandÄąr", "header": "Pdf-in AdÄąnÄą Avtomatik Yenidən AdlandÄąr", - "submit": "Avtomatik Yenidən AdlandÄąr" + "description": "Automatically finds the title from your PDF content and uses it as the filename.", + "submit": "Avtomatik Yenidən AdlandÄąr", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst auto-renaming the PDF." + }, + "results": { + "title": "Auto-Rename Results" + }, + "tooltip": { + "header": { + "title": "How Auto-Rename Works" + }, + "howItWorks": { + "title": "Smart Renaming", + "text": "Automatically finds the title from your PDF content and uses it as the filename.", + "bullet1": "Looks for text that appears to be a title or heading", + "bullet2": "Creates a clean, valid filename from the detected title", + "bullet3": "Keeps the original name if no suitable title is found" + } + } }, "adjust-contrast": { "tags": "rəng-tənzimləmə,kÃļklə,modifikasiya et,yaxÅŸÄąlaşdÄąr" }, "crop": { - "tags": "kəs,kiçilt,redaktə et,forma", "title": "Kəs", "header": "Pdf-ləri Kəs", - "submit": "Təsdiq Et" + "submit": "Təsdiq Et", + "noFileSelected": "Select a PDF file to begin cropping", + "preview": { + "title": "Crop Area Selection" + }, + "reset": "Reset to full PDF", + "coordinates": { + "title": "Position and Size", + "x": { + "label": "X Position", + "desc": "Left edge (points)" + }, + "y": { + "label": "Y Position", + "desc": "Bottom edge (points)" + }, + "width": { + "label": "Width", + "desc": "Crop width (points)" + }, + "height": { + "label": "Height", + "desc": "Crop height (points)" + } + }, + "error": { + "invalidArea": "Crop area extends beyond PDF boundaries", + "failed": "Failed to crop PDF" + }, + "steps": { + "selectArea": "Select Crop Area" + }, + "tooltip": { + "title": "How to Crop PDFs", + "description": "Select the area to crop from your PDF by dragging and resizing the blue overlay on the thumbnail.", + "drag": "Drag the overlay to move the crop area", + "resize": "Drag the corner and edge handles to resize", + "precision": "Use coordinate inputs for precise positioning" + }, + "results": { + "title": "Crop Results" + }, + "automation": { + "info": "Enter crop coordinates in PDF points. Origin (0,0) is at bottom-left. These values will be applied to all PDFs processed in this automation.", + "reference": "Reference: A4 page is 595.28 × 841.89 points (210mm × 297mm). 1 inch = 72 points." + }, + "tags": "kəs,kiçilt,redaktə et,forma" }, "autoSplitPDF": { "tags": "QR-əsaslÄą,ayrÄą,skan-seqment,nizamla", @@ -1221,24 +2829,124 @@ "downloadJS": "Javascripti Endir", "submit": "GÃļstər" }, - "autoRedact": { - "tags": "Qarala,gizlət,sil,qara,marker,gizli", - "title": "Avtomatik Gizlətmə", - "header": "Avtomatik Gizlətmə", - "colorLabel": "Rəng", - "textsToRedactLabel": "Gizlədiləcək Mətn (Yeni sətirlə ayrÄąlmÄąÅŸ)", - "textsToRedactPlaceholder": "e.g. \\nKonfidensial \\nTam-Məxfi", - "useRegexLabel": "Regex İstifadə Et", - "wholeWordSearchLabel": "BÃŧtÃļv SÃļz Axtar", - "customPaddingLabel": "Fərdi Əlavə BaşlÄąq", - "convertPDFToImageLabel": "PDF-i PDF-Şəkil-ə çevir (Qutunun arxasÄąndakÄą yazÄąnÄą silmək ÃŧçÃŧn istifadə edilir)", - "submitButton": "Təsdiqlə" - }, "redact": { "tags": "Redact,Hide,black out,black,marker,hidden,manual", "title": "Manual Redaction", - "header": "Manual Redaction", "submit": "Manual Redaction", + "error": { + "failed": "An error occurred while redacting the PDF." + }, + "modeSelector": { + "title": "Redaction Method", + "mode": "Mode", + "automatic": "Automatic", + "automaticDesc": "Redact text based on search terms", + "manual": "Manual", + "manualDesc": "Click and drag to redact specific areas", + "manualComingSoon": "Manual redaction coming soon" + }, + "auto": { + "header": "Auto Redact", + "settings": { + "title": "Redaction Settings", + "advancedTitle": "QabaqcÄąl" + }, + "colorLabel": "Box Colour", + "wordsToRedact": { + "title": "Words to Redact", + "placeholder": "Enter a word", + "add": "Əlavə et", + "examples": "Examples: Confidential, Top-Secret" + }, + "useRegexLabel": "Use Regex", + "wholeWordSearchLabel": "Whole Word Search", + "customPaddingLabel": "Custom Extra Padding", + "convertPDFToImageLabel": "Convert PDF to PDF-Image" + }, + "tooltip": { + "mode": { + "header": { + "title": "Redaction Method" + }, + "automatic": { + "title": "Automatic Redaction", + "text": "Automatically finds and redacts specified text throughout the document. Perfect for removing consistent sensitive information like names, addresses, or confidential markers." + }, + "manual": { + "title": "Manual Redaction", + "text": "Click and drag to manually select specific areas to redact. Gives you precise control over what gets redacted. (Coming soon)" + } + }, + "words": { + "header": { + "title": "Words to Redact" + }, + "description": { + "title": "Text Matching", + "text": "Enter words or phrases to find and redact in your document. Each word will be searched for separately." + }, + "bullet1": "Add one word at a time", + "bullet2": "Press Enter or click 'Add Another' to add", + "bullet3": "Click × to remove words", + "examples": { + "title": "Common Examples", + "text": "Typical words to redact include: bank details, email addresses, or specific names." + } + }, + "advanced": { + "header": { + "title": "Advanced Redaction Settings" + }, + "color": { + "title": "Box Colour & Padding", + "text": "Customise the appearance of redaction boxes. Black is standard, but you can choose any colour. Padding adds extra space around the found text." + }, + "regex": { + "title": "Use Regex", + "text": "Enable regular expressions for advanced pattern matching. Useful for finding phone numbers, emails, or complex patterns.", + "bullet1": "Example: \\d{4}-\\d{2}-\\d{2} to match any dates in YYYY-MM-DD format", + "bullet2": "Use with caution - test thoroughly" + }, + "wholeWord": { + "title": "Whole Word Search", + "text": "Only match complete words, not partial matches. 'John' won't match 'Johnson' when enabled." + }, + "convert": { + "title": "Convert to PDF-Image", + "text": "Converts the PDF to an image-based PDF after redaction. This ensures text behind redaction boxes is completely removed and unrecoverable." + } + } + }, + "manual": { + "header": "Manual Redaction", + "textBasedRedaction": "Text-based Redaction", + "pageBasedRedaction": "Page-based Redaction", + "convertPDFToImageLabel": "Convert PDF to PDF-Image (Used to remove text behind the box)", + "pageRedactionNumbers": { + "title": "Səhifələr", + "placeholder": "(məsələn, 1,2,8 və ya 4,7,12-16 və ya 2n-1)" + }, + "redactionColor": { + "title": "Redaction Colour" + }, + "export": "İxrac Et", + "upload": "Upload", + "boxRedaction": "Box draw redaction", + "zoom": "Zoom", + "zoomIn": "Zoom in", + "zoomOut": "Zoom out", + "nextPage": "Next Page", + "previousPage": "Previous Page", + "toggleSidebar": "Toggle Sidebar", + "showThumbnails": "Show Thumbnails", + "showDocumentOutline": "Show Document Outline (double-click to expand/collapse all items)", + "showAttachments": "Show Attachments", + "showLayers": "Show Layers (double-click to reset all layers to the default state)", + "colourPicker": "Colour Picker", + "findCurrentOutlineItem": "Find current outline item", + "applyChanges": "Apply Changes" + }, + "header": "Manual Redaction", "textBasedRedaction": "Text based Redaction", "pageBasedRedaction": "Page-based Redaction", "convertPDFToImageLabel": "Convert PDF to PDF-Image (Used to remove text behind the box)", @@ -1264,22 +2972,7 @@ "showLayers": "Show Layers (double-click to reset all layers to the default state)", "colourPicker": "Colour Picker", "findCurrentOutlineItem": "Find current outline item", - "applyChanges": "Apply Changes", - "auto": { - "settings": { - "advancedTitle": "QabaqcÄąl" - }, - "wordsToRedact": { - "add": "Əlavə et" - } - }, - "manual": { - "pageRedactionNumbers": { - "title": "Səhifələr", - "placeholder": "(məsələn, 1,2,8 və ya 4,7,12-16 və ya 2n-1)" - }, - "export": "İxrac Et" - } + "applyChanges": "Apply Changes" }, "tableExtraxt": { "tags": "CSV,Cədvəl xaricetmə,xaric et,çevir" @@ -1290,11 +2983,15 @@ "overlay-pdfs": { "tags": "Ãŧst-Ãŧstə", "header": "Overlay PDF fayllarÄą", + "title": "Overlay PDFs", + "desc": "Overlay one PDF on top of another", "baseFile": { "label": "Əsas PDF faylÄąnÄą seçin" }, "overlayFiles": { - "label": "Overlay PDF fayllarÄąnÄą seçin" + "label": "Overlay PDF fayllarÄąnÄą seçin", + "placeholder": "Choose PDF(s)...", + "addMore": "Add more PDFs..." }, "mode": { "label": "Overlay Modu seçin", @@ -1304,14 +3001,53 @@ }, "counts": { "label": "Overlay SaylarÄą (Sabit Təkrar Rejimi ÃŧçÃŧn)", - "placeholder": "SaylarÄą vergÃŧllə ayrÄąlmÄąÅŸ şəkildə daxil edin (məsələn, 2,3,1)" + "placeholder": "SaylarÄą vergÃŧllə ayrÄąlmÄąÅŸ şəkildə daxil edin (məsələn, 2,3,1)", + "item": "Count for file", + "noFiles": "Add overlay files to configure counts" }, "position": { "label": "Overlay Position seçin", "foreground": "Ön plan", "background": "Arxa plan" }, - "submit": "Təsdiq et" + "submit": "Təsdiq et", + "settings": { + "title": "Settings" + }, + "results": { + "title": "Overlay Results" + }, + "tooltip": { + "header": { + "title": "Overlay PDFs Overview" + }, + "description": { + "title": "Description", + "text": "Combine a base PDF with one or more overlay PDFs. Overlays can be applied page-by-page in different modes and placed in the foreground or background." + }, + "mode": { + "title": "Overlay Mode", + "text": "Choose how to distribute overlay pages across the base PDF pages.", + "sequential": "Sequential Overlay: Use pages from the first overlay PDF until it ends, then move to the next.", + "interleaved": "Interleaved Overlay: Take one page from each overlay in turn.", + "fixedRepeat": "Fixed Repeat Overlay: Take a set number of pages from each overlay before moving to the next. Use Counts to set the numbers." + }, + "position": { + "title": "Overlay Position", + "text": "Foreground places the overlay on top of the page. Background places it behind." + }, + "overlayFiles": { + "title": "Overlay Files", + "text": "Select one or more PDFs to overlay on the base. The order of these files affects how pages are applied in Sequential and Fixed Repeat modes." + }, + "counts": { + "title": "Counts (Fixed Repeat only)", + "text": "Provide a positive number for each overlay file showing how many pages to take before moving to the next. Required when mode is Fixed Repeat." + } + }, + "error": { + "failed": "An error occurred while overlaying PDFs." + } }, "split-by-sections": { "tags": "Hissə BÃļlgÃŧsÃŧ, AyÄąr, Fərdiləşdir", @@ -1332,6 +3068,7 @@ "tags": "MÃļhÃŧr, Şəkil əlavə et, şəkli ortala, Watermark, PDF, Embed, Fərdiləşdir", "header": "PDF-i MÃļhÃŧrlə", "title": "PDF-i MÃļhÃŧrlə", + "stampSetup": "Stamp Setup", "stampType": "MÃļhÃŧr Tipi", "stampText": "MÃļhÃŧr YazÄąsÄą", "stampImage": "MÃļhÃŧr Fotosu", @@ -1344,7 +3081,19 @@ "overrideY": "Y KoordinatÄąnÄąn ÜstÃŧnə Yaz", "customMargin": "Fərdi Boşluq ÖlçÃŧsÃŧ", "customColor": "Fərdi Mətn Rəngi", - "submit": "Təsdiqlə" + "submit": "Təsdiqlə", + "noStampSelected": "No stamp selected. Return to Step 1.", + "customPosition": "Drag the stamp to the desired location in the preview window.", + "error": { + "failed": "An error occurred while adding stamp to the PDF." + }, + "imageSize": "Image Size", + "margin": "Margin", + "positionAndFormatting": "Position & Formatting", + "quickPosition": "Select a position on the page to place the stamp.", + "results": { + "title": "Stamp Results" + } }, "removeImagePdf": { "tags": "Şəkil Sil,Səhifə ƏməliyyatlarÄą,Back end,server-tərəf" @@ -1362,7 +3111,8 @@ "status": { "_value": "Status", "valid": "Valid", - "invalid": "Invalid" + "invalid": "Invalid", + "complete": "Validation complete" }, "signer": "Signer", "date": "Date", @@ -1389,40 +3139,122 @@ "version": "Versiya", "keyUsage": "Key Usage", "selfSigned": "Self-Signed", - "bits": "bits" + "bits": "bits", + "details": "Certificate Details" }, "signature": { "info": "Signature Information", "_value": "Signature", "mathValid": "Signature is mathematically valid BUT:" }, - "selectCustomCert": "Custom Certificate File X.509 (Optional)" - }, - "replace-color": { - "title": "QabaqcÄąl Rəng Seçimləri", - "header": "PDF-də Rəngləri Dəyiş-Tərsinə Çevir", - "selectText": { - "1": "Rəngi dəyişmə və tərsinə çevirmə seçimləri", - "2": "Defolt(Defolt yÃŧksək kontrastlÄą rənglər)", - "3": "Fərdi(Fərdiləşdirilmiş rənglər)", - "4": "BÃŧtÃļv Tərsinə Çevir(BÃŧtÃŧn rəngləri tərsinə çevir)", - "5": "YÃŧksək kontrastlÄą rəng seçimləri", - "6": "Qara arxaplanda ağ mətn", - "7": "Ağ arxaplanda qara mətn", - "8": "Qara arxaplanda sarÄą mətn", - "9": "Qara arxaplanda yaÅŸÄąl mətn", - "10": "Mətn rəngi seç", - "11": "Arxaplan rəngi seç" + "selectCustomCert": "Custom Certificate File X.509 (Optional)", + "downloadCsv": "Download CSV", + "downloadJson": "Download JSON", + "downloadPdf": "Download PDF Report", + "downloadType": { + "csv": "CSV", + "json": "JSON", + "pdf": "PDF" }, - "submit": "Əvəzlə" + "error": { + "allFailed": "Unable to validate the selected files.", + "partial": "Some files could not be validated.", + "reportGeneration": "Could not generate the PDF report. JSON and CSV are available.", + "unexpected": "Unexpected error during validation." + }, + "finalizing": "Preparing downloads...", + "issue": { + "certExpired": "Certificate expired", + "certRevocationUnknown": "Certificate revocation status unknown", + "certRevoked": "Certificate revoked", + "chainInvalid": "Certificate chain invalid", + "signatureInvalid": "Signature cryptographic check failed", + "trustInvalid": "Certificate not trusted" + }, + "noResults": "Run the validation to generate a report.", + "noSignaturesShort": "No signatures", + "processing": "Validating signatures...", + "report": { + "continued": "Continued", + "downloads": "Downloads", + "entryLabel": "Signature Summary", + "fields": { + "created": "Created", + "fileSize": "File Size", + "signatureCount": "Total Signatures", + "signatureDate": "Signature Date" + }, + "filesEvaluated": "{{count}} files evaluated", + "footer": "Validated via Stirling PDF", + "generatedAt": "Generated", + "noPdf": "PDF report will be available after a successful validation.", + "page": "Page", + "shortTitle": "Signature Summary", + "signatureCountLabel": "{{count}} signatures", + "signaturesFound": "{{count}} signatures detected", + "signaturesValid": "{{count}} fully valid", + "title": "Signature Validation Report" + }, + "settings": { + "certHint": "Upload a trusted X.509 certificate to validate against a custom trust source.", + "title": "Validation Settings" + }, + "signatureDate": "Signature Date", + "totalSignatures": "Total Signatures" }, - "replaceColorPdf": { - "tags": "Rəngləri Dəyiş,Səhifə əməliyyatlarÄą,Back end,server-tərəf" + "replaceColor": { + "tags": "Replace Colour,Page operations,Back end,server side", + "labels": { + "settings": "Settings", + "colourOperation": "Colour operation" + }, + "options": { + "highContrast": "High contrast", + "invertAll": "Invert all colours", + "custom": "Custom", + "cmyk": "Convert to CMYK" + }, + "tooltip": { + "header": { + "title": "Replace & Invert Colour Settings Overview" + }, + "description": { + "title": "Description", + "text": "Transform PDF colours to improve readability and accessibility. Choose from high contrast presets, invert all colours, or create custom colour schemes." + }, + "highContrast": { + "title": "High Contrast", + "text": "Apply predefined high contrast colour combinations designed for better readability and accessibility compliance.", + "bullet1": "White text on black background - Classic dark mode", + "bullet2": "Black text on white background - Standard high contrast", + "bullet3": "Yellow text on black background - High visibility option", + "bullet4": "Green text on black background - Alternative high contrast" + }, + "invertAll": { + "title": "Invert All Colours", + "text": "Completely invert all colours in the PDF, creating a negative-like effect. Useful for creating dark mode versions of documents or reducing eye strain in low-light conditions." + }, + "custom": { + "title": "Custom Colours", + "text": "Define your own text and background colours using the colour pickers. Perfect for creating branded documents or specific accessibility requirements.", + "bullet1": "Text colour - Choose the colour for text elements", + "bullet2": "Background colour - Set the background colour for the document" + }, + "cmyk": { + "title": "Convert to CMYK", + "text": "Convert the PDF from RGB colour space to CMYK colour space, optimized for professional printing. This process converts colours to the Cyan, Magenta, Yellow, Black model used by printers." + } + }, + "error": { + "failed": "An error occurred while processing the colour replacement." + } }, "login": { "title": "Daxil olun", "header": "Daxil olun", "signin": "Daxil olun", + "signInWith": "Sign in with", + "signInAnonymously": "Sign Up as a Guest", "rememberme": "Məni xatÄąrla", "invalid": "EtibarsÄąz istifadəçi adÄą və ya şifr.", "locked": "Sizin hesabÄąnÄąz kilidlənmişdir.", @@ -1441,12 +3273,83 @@ "alreadyLoggedIn": "Siz artÄąq daxil olmusunuz", "alreadyLoggedIn2": "cihazlar. Zəhmət olmasa, cihazlardan Ã§ÄąxÄąÅŸ edin və yenidən cəhd edin.", "toManySessions": "Həddindən artÄąq aktiv sessiyanÄąz var", - "logoutMessage": "You have been logged out." + "logoutMessage": "You have been logged out.", + "youAreLoggedIn": "You are logged in!", + "email": "Email", + "password": "Password", + "enterEmail": "Enter your email", + "enterPassword": "Enter your password", + "loggingIn": "Logging In...", + "username": "Username", + "enterUsername": "Enter username", + "useEmailInstead": "Login with email", + "forgotPassword": "Forgot your password?", + "logIn": "Log In", + "signingIn": "Signing in...", + "login": "Login", + "or": "Or", + "useMagicLink": "Use magic link instead", + "enterEmailForMagicLink": "Enter your email for magic link", + "sending": "Sendingâ€Ļ", + "sendMagicLink": "Send Magic Link", + "cancel": "Cancel", + "dontHaveAccount": "Don't have an account? Sign up", + "home": "Home", + "debug": "Debug", + "signOut": "Sign Out", + "pleaseEnterBoth": "Please enter both email and password", + "pleaseEnterEmail": "Please enter your email address", + "magicLinkSent": "Magic link sent to {{email}}! Check your email and click the link to sign in.", + "passwordResetSent": "Password reset link sent to {{email}}! Check your email and follow the instructions.", + "failedToSignIn": "Failed to sign in with {{provider}}: {{message}}", + "unexpectedError": "Unexpected error: {{message}}", + "accountCreatedSuccess": "Account created successfully! You can now sign in.", + "passwordChangedSuccess": "Password changed successfully! Please sign in with your new password.", + "credentialsUpdated": "Your credentials have been updated. Please sign in again." + }, + "signup": { + "title": "Create an account", + "subtitle": "Join Stirling PDF to get started", + "name": "Name", + "email": "Email", + "password": "Password", + "confirmPassword": "Confirm password", + "enterName": "Enter your name", + "enterEmail": "Enter your email", + "enterPassword": "Enter your password", + "confirmPasswordPlaceholder": "Confirm password", + "or": "or", + "creatingAccount": "Creating Account...", + "signUp": "Sign Up", + "alreadyHaveAccount": "Already have an account? Sign in", + "pleaseFillAllFields": "Please fill in all fields", + "passwordsDoNotMatch": "Passwords do not match", + "passwordTooShort": "Password must be at least 6 characters long", + "invalidEmail": "Please enter a valid email address", + "checkEmailConfirmation": "Check your email for a confirmation link to complete your registration.", + "accountCreatedSuccessfully": "Account created successfully! You can now sign in.", + "unexpectedError": "Unexpected error: {{message}}", + "useEmailInstead": "Use Email Instead", + "nameRequired": "Name is required", + "emailRequired": "Email is required", + "passwordRequired": "Password is required", + "confirmPasswordRequired": "Please confirm your password" }, "pdfToSinglePage": { "title": "PDF-dən Tək Səhifəyə", "header": "PDF-dən Tək Səhifəyə", - "submit": "Tək Səhifəyə Çevir" + "submit": "Tək Səhifəyə Çevir", + "description": "This tool will merge all pages of your PDF into one large single page. The width will remain the same as the original pages, but the height will be the sum of all page heights.", + "filenamePrefix": "single_page", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst converting to single page." + }, + "results": { + "title": "Single Page Results" + } }, "pageExtracter": { "title": "Səhifələri Ã§Äąxar", @@ -1470,18 +3373,59 @@ "adjustContrast": { "title": "KontrastÄą tənzimləyin", "header": "KontrastÄą tənzimləyin", + "basic": "Basic Adjustments", "contrast": "Kontrast:", "brightness": "ParlaqlÄąq:", "saturation": "Doyma:", - "download": "YÃŧklə" + "download": "YÃŧklə", + "adjustColors": "Adjust Colors", + "blue": "Blue", + "confirm": "Confirm", + "error": { + "failed": "Failed to adjust colors/contrast" + }, + "green": "Green", + "noPreview": "Select a PDF to preview", + "red": "Red", + "results": { + "title": "Adjusted PDF" + } }, "compress": { "title": "SÄąxÄąÅŸdÄąr", + "desc": "Compress PDFs to reduce their file size.", "header": "PDF-i SÄąxÄąÅŸdÄąr", + "method": { + "title": "Compression Method", + "quality": "Quality", + "filesize": "Fayl ÖlçÃŧsÃŧ" + }, "credit": "Bu servis PDF sÄąxÄąÅŸdÄąrÄąlmasÄą/OptimizasiyasÄą ÃŧçÃŧn Ghostscript istifadə edir.", "grayscale": { "label": "SÄąxma ÃŧçÃŧn Boz Rəng Tətbiq Edin" }, + "tooltip": { + "header": { + "title": "Compress Settings Overview" + }, + "description": { + "title": "Description", + "text": "Compression is an easy way to reduce your file size. Pick File Size to enter a target size and have us adjust quality for you. Pick Quality to set compression strength manually." + }, + "qualityAdjustment": { + "title": "Quality Adjustment", + "text": "Drag the slider to adjust the compression strength. Lower values (1-3) preserve quality but result in larger files. Higher values (7-9) shrink the file more but reduce image clarity.", + "bullet1": "Lower values preserve quality", + "bullet2": "Higher values reduce file size" + }, + "grayscale": { + "title": "Grayscale", + "text": "Select this option to convert all images to black and white, which can significantly reduce file size especially for scanned PDFs or image-heavy documents." + } + }, + "error": { + "failed": "An error occurred while compressing the PDF." + }, "selectText": { "1": { "_value": "Compression Settings", @@ -1491,10 +3435,7 @@ "4": "Avto mod - PDF-in dəqiq ÃļlçÃŧsÃŧnÃŧ əldə etmək ÃŧçÃŧn keyfiyyəti avtomatik tənzimləyir", "5": "GÃļzlənilən PDF ÖlçÃŧsÃŧ (məsələn, 25MB, 10.8MB, 25KB)" }, - "submit": "SÄąxÄąÅŸdÄąr", - "method": { - "filesize": "Fayl ÖlçÃŧsÃŧ" - } + "submit": "SÄąxÄąÅŸdÄąr" }, "decrypt": { "passwordPrompt": "This file is password-protected. Please enter the password:", @@ -1595,7 +3536,13 @@ "title": "Şəkli silin", "header": "Şəkli silin", "removeImage": "Şəkli silin", - "submit": "Şəkli silin" + "submit": "Şəkli silin", + "error": { + "failed": "Failed to remove images from the PDF." + }, + "results": { + "title": "Remove Images Results" + } }, "splitByChapters": { "title": "PDF-i hissələrə bÃļlÃŧn", @@ -1629,6 +3576,12 @@ }, "note": "BuraxÄąlÄąÅŸ Qeydləri yalnÄąz ingiliscə mÃļvcuddur" }, + "swagger": { + "title": "API Documentation", + "header": "API Documentation", + "desc": "View and test the Stirling PDF API endpoints", + "tags": "api,documentation,swagger,endpoints,development" + }, "cookieBanner": { "popUp": { "title": "How we use Cookies", @@ -1664,52 +3617,943 @@ "title": "Analytics", "description": "These cookies help us understand how our tools are being used, so we can focus on building the features our community values most. Rest assured—Stirling PDF cannot and will never track the content of the documents you work with." } + }, + "services": { + "posthog": "PostHog Analytics", + "scarf": "Scarf Pixel" } }, - "download": "Endir", - "convert": { - "title": "Çevir", - "settings": "Parametrlər", - "color": "Rəng", - "greyscale": "Boz Tonlama", - "fillPage": "Səhifəni Doldur", - "pdfaDigitalSignatureWarning": "PDF Rəqəmsal İmza Ehtiva Edir.Bu, nÃļvbəti addÄąmda silinəcək.", - "grayscale": "Boz Tonlama" + "removeMetadata": { + "submit": "Remove Metadata" }, - "attachments": { - "tags": "embed,attach,file,attachment,attachments", - "title": "Add attachments", - "header": "Add attachments", - "submit": "Add attachments" + "sidebar": { + "toggle": "Toggle Sidebar" + }, + "theme": { + "toggle": "Toggle Theme" + }, + "view": { + "viewer": "Viewer", + "pageEditor": "Page Editor", + "fileManager": "File Manager" + }, + "pageEditor": { + "title": "Page Editor", + "save": "Save Changes", + "noPdfLoaded": "No PDF loaded. Please upload a PDF to edit.", + "rotatedLeft": "Rotated left:", + "rotatedRight": "Rotated right:", + "deleted": "Deleted:", + "movedLeft": "Moved left:", + "movedRight": "Moved right:", + "splitAt": "Split at:", + "insertedPageBreak": "Inserted page break at:", + "addFileNotImplemented": "Add file not implemented in demo", + "closePdf": "Close PDF", + "reset": "Reset Changes", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "fitToWidth": "Fit to Width", + "actualSize": "Actual Size" + }, + "viewer": { + "firstPage": "First Page", + "lastPage": "Last Page", + "previousPage": "Previous Page", + "nextPage": "Next Page", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "singlePageView": "Single Page View", + "dualPageView": "Dual Page View" }, "rightRail": { + "closeSelected": "Close Selected Files", "selectAll": "HamÄąsÄąnÄą Seç", - "deselectAll": "HamÄąsÄąnÄą Seçməni Ləğv Et" + "deselectAll": "HamÄąsÄąnÄą Seçməni Ləğv Et", + "selectByNumber": "Select by Page Numbers", + "deleteSelected": "Delete Selected Pages", + "closePdf": "Close PDF", + "exportAll": "Export PDF", + "downloadSelected": "Download Selected Files", + "downloadAll": "Download All", + "toggleTheme": "Toggle Theme", + "language": "Language", + "search": "Search PDF", + "panMode": "Pan Mode", + "rotateLeft": "Rotate Left", + "rotateRight": "Rotate Right", + "toggleSidebar": "Toggle Sidebar", + "exportSelected": "Export Selected Pages", + "toggleAnnotations": "Toggle Annotations Visibility", + "annotationMode": "Toggle Annotation Mode", + "draw": "Draw", + "save": "Save" + }, + "search": { + "title": "Search PDF", + "placeholder": "Enter search term...", + "noResults": "No results found", + "searching": "Searching..." + }, + "guestBanner": { + "title": "You're using Stirling PDF as a guest!", + "message": "Create a free account to save your work, access more features, and support the project.", + "dismiss": "Dismiss banner", + "signUp": "Sign Up Free" + }, + "toolPicker": { + "searchPlaceholder": "Search tools...", + "noToolsFound": "No tools found", + "allTools": "ALL TOOLS", + "quickAccess": "QUICK ACCESS", + "categories": { + "standardTools": "Standard Tools", + "advancedTools": "Advanced Tools", + "recommendedTools": "Recommended Tools" + }, + "subcategories": { + "signing": "Signing", + "documentSecurity": "Document Security", + "verification": "Verification", + "documentReview": "Document Review", + "pageFormatting": "Page Formatting", + "extraction": "Extraction", + "removal": "Removal", + "automation": "Automation", + "general": "General", + "advancedFormatting": "Advanced Formatting", + "developerTools": "Developer Tools" + } }, "quickAccess": { - "sign": "İmzala" + "read": "Read", + "sign": "İmzala", + "automate": "Automate", + "files": "Files", + "activity": "Activity", + "help": "Help", + "account": "Account", + "config": "Config", + "adminSettings": "Admin Settings", + "allTools": "All Tools" + }, + "admin": { + "error": "Error", + "success": "Success", + "expand": "Expand", + "close": "Close", + "status": { + "active": "Active", + "inactive": "Inactive" + }, + "settings": { + "title": "Admin Settings", + "workspace": "Workspace", + "fetchError": "Failed to load settings", + "saveError": "Failed to save settings", + "saved": "Settings saved successfully", + "saveSuccess": "Settings saved successfully", + "save": "Save Changes", + "restartRequired": "Restart Required", + "restart": { + "title": "Restart Required", + "message": "Settings have been saved successfully. A server restart is required for the changes to take effect.", + "question": "Would you like to restart the server now or later?", + "now": "Restart Now", + "later": "Restart Later" + }, + "restarting": "Restarting Server", + "restartingMessage": "The server is restarting. Please wait a moment...", + "restartError": "Failed to restart server. Please restart manually.", + "general": { + "title": "System Settings", + "description": "Configure system-wide application settings including branding and default behaviour.", + "ui": "User Interface", + "system": "System", + "appName": { + "label": "Application Name", + "description": "The name displayed in the browser tab and home page" + }, + "appNameNavbar": { + "label": "Navbar Brand", + "description": "The name displayed in the navigation bar" + }, + "homeDescription": { + "label": "Home Description", + "description": "The description text shown on the home page" + }, + "defaultLocale": { + "label": "Default Locale", + "description": "The default language for new users (e.g., en_US, es_ES)" + }, + "fileUploadLimit": { + "label": "File Upload Limit", + "description": "Maximum file upload size (e.g., 100MB, 1GB)" + }, + "showUpdate": { + "label": "Show Update Notifications", + "description": "Display notifications when a new version is available" + }, + "showUpdateOnlyAdmin": { + "label": "Show Updates to Admins Only", + "description": "Restrict update notifications to admin users only" + }, + "customHTMLFiles": { + "label": "Custom HTML Files", + "description": "Allow serving custom HTML files from the customFiles directory" + }, + "languages": { + "label": "Available Languages", + "description": "Languages that users can select from (leave empty to enable all languages)" + }, + "customMetadata": { + "label": "Custom Metadata", + "autoUpdate": { + "label": "Auto Update Metadata", + "description": "Automatically update PDF metadata on all processed documents" + }, + "author": { + "label": "Default Author", + "description": "Default author for PDF metadata (e.g., username)" + }, + "creator": { + "label": "Default Creator", + "description": "Default creator for PDF metadata" + }, + "producer": { + "label": "Default Producer", + "description": "Default producer for PDF metadata" + } + }, + "customPaths": { + "label": "Custom Paths", + "description": "Configure custom file system paths for pipeline processing and external tools", + "pipeline": { + "label": "Pipeline Directories", + "watchedFoldersDir": { + "label": "Watched Folders Directory", + "description": "Directory where pipeline monitors for incoming PDFs (leave empty for default: /pipeline/watchedFolders)" + }, + "finishedFoldersDir": { + "label": "Finished Folders Directory", + "description": "Directory where processed PDFs are outputted (leave empty for default: /pipeline/finishedFolders)" + } + }, + "operations": { + "label": "External Tool Paths", + "weasyprint": { + "label": "WeasyPrint Executable", + "description": "Path to WeasyPrint executable for HTML to PDF conversion (leave empty for default: /opt/venv/bin/weasyprint)" + }, + "unoconvert": { + "label": "Unoconvert Executable", + "description": "Path to LibreOffice unoconvert for document conversions (leave empty for default: /opt/venv/bin/unoconvert)" + } + } + } + }, + "security": { + "title": "Security", + "description": "Configure authentication, login behaviour, and security policies.", + "ssoNotice": { + "title": "Looking for SSO/SAML settings?", + "message": "OAuth2 and SAML2 authentication providers have been moved to the Connections menu for easier management." + }, + "authentication": "Authentication", + "enableLogin": { + "label": "Enable Login", + "description": "Require users to log in before accessing the application" + }, + "loginMethod": { + "label": "Login Method", + "description": "The authentication method to use for user login", + "all": "All Methods", + "normal": "Username/Password Only", + "oauth2": "OAuth2 Only", + "saml2": "SAML2 Only" + }, + "loginAttemptCount": { + "label": "Login Attempt Limit", + "description": "Maximum number of failed login attempts before account lockout" + }, + "loginResetTimeMinutes": { + "label": "Login Reset Time (minutes)", + "description": "Time before failed login attempts are reset" + }, + "csrfDisabled": { + "label": "Disable CSRF Protection", + "description": "Disable Cross-Site Request Forgery protection (not recommended)" + }, + "initialLogin": { + "label": "Initial Login", + "username": { + "label": "Initial Username", + "description": "The username for the initial admin account" + }, + "password": { + "label": "Initial Password", + "description": "The password for the initial admin account" + } + }, + "jwt": { + "label": "JWT Configuration", + "secureCookie": { + "label": "Secure Cookie", + "description": "Require HTTPS for JWT cookies (recommended for production)" + }, + "keyRetentionDays": { + "label": "Key Retention Days", + "description": "Number of days to retain old JWT keys for verification" + }, + "persistence": { + "label": "Enable Key Persistence", + "description": "Store JWT keys persistently to survive server restarts" + }, + "enableKeyRotation": { + "label": "Enable Key Rotation", + "description": "Automatically rotate JWT signing keys periodically" + }, + "enableKeyCleanup": { + "label": "Enable Key Cleanup", + "description": "Automatically remove expired JWT keys" + } + }, + "audit": { + "label": "Audit Logging", + "enabled": { + "label": "Enable Audit Logging", + "description": "Track user actions and system events for compliance and security monitoring" + }, + "level": { + "label": "Audit Level", + "description": "0=OFF, 1=BASIC, 2=STANDARD, 3=VERBOSE" + }, + "retentionDays": { + "label": "Audit Retention (days)", + "description": "Number of days to retain audit logs" + } + }, + "htmlUrlSecurity": { + "label": "HTML URL Security", + "description": "Configure URL access restrictions for HTML processing to prevent SSRF attacks", + "enabled": { + "label": "Enable URL Security", + "description": "Enable URL security restrictions for HTML to PDF conversions" + }, + "level": { + "label": "Security Level", + "description": "MAX: whitelist only, MEDIUM: block internal networks, OFF: no restrictions", + "max": "Maximum (Whitelist Only)", + "medium": "Medium (Block Internal)", + "off": "Off (No Restrictions)" + }, + "advanced": "Advanced Settings", + "allowedDomains": { + "label": "Allowed Domains (Whitelist)", + "description": "One domain per line (e.g., cdn.example.com). Only these domains allowed when level is MAX" + }, + "blockedDomains": { + "label": "Blocked Domains (Blacklist)", + "description": "One domain per line (e.g., malicious.com). Additional domains to block" + }, + "internalTlds": { + "label": "Internal TLDs", + "description": "One TLD per line (e.g., .local, .internal). Block domains with these TLD patterns" + }, + "networkBlocking": "Network Blocking", + "blockPrivateNetworks": { + "label": "Block Private Networks", + "description": "Block RFC 1918 private networks (10.x.x.x, 192.168.x.x, 172.16-31.x.x)" + }, + "blockLocalhost": { + "label": "Block Localhost", + "description": "Block localhost and loopback addresses (127.x.x.x, ::1)" + }, + "blockLinkLocal": { + "label": "Block Link-Local Addresses", + "description": "Block link-local addresses (169.254.x.x, fe80::/10)" + }, + "blockCloudMetadata": { + "label": "Block Cloud Metadata Endpoints", + "description": "Block cloud provider metadata endpoints (169.254.169.254)" + } + } + }, + "connections": { + "title": "Connections", + "description": "Configure external authentication providers like OAuth2 and SAML.", + "linkedServices": "Linked Services", + "unlinkedServices": "Unlinked Services", + "connect": "Connect", + "disconnect": "Disconnect", + "disconnected": "Provider disconnected successfully", + "disconnectError": "Failed to disconnect provider", + "ssoAutoLogin": { + "label": "SSO Auto Login", + "enable": "Enable SSO Auto Login", + "description": "Automatically redirect to SSO login when authentication is required" + }, + "oauth2": { + "label": "OAuth2", + "enabled": { + "label": "Enable OAuth2", + "description": "Allow users to authenticate using OAuth2 providers" + }, + "provider": { + "label": "Provider", + "description": "The OAuth2 provider to use for authentication" + }, + "issuer": { + "label": "Issuer URL", + "description": "The OAuth2 provider issuer URL" + }, + "clientId": { + "label": "Client ID", + "description": "The OAuth2 client ID from your provider" + }, + "clientSecret": { + "label": "Client Secret", + "description": "The OAuth2 client secret from your provider" + }, + "useAsUsername": { + "label": "Use as Username", + "description": "The OAuth2 claim to use as the username (e.g., email, sub)" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first OAuth2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via OAuth2" + }, + "scopes": { + "label": "OAuth2 Scopes", + "description": "Comma-separated list of OAuth2 scopes to request (e.g., openid, profile, email)" + } + }, + "saml2": { + "label": "SAML2", + "enabled": { + "label": "Enable SAML2", + "description": "Allow users to authenticate using SAML2 providers" + }, + "provider": { + "label": "Provider", + "description": "The SAML2 provider name" + }, + "registrationId": { + "label": "Registration ID", + "description": "The SAML2 registration identifier" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first SAML2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via SAML2" + } + } + }, + "database": { + "title": "Database", + "description": "Configure custom database connection settings for enterprise deployments.", + "configuration": "Database Configuration", + "enableCustom": { + "label": "Enable Custom Database", + "description": "Use your own custom database configuration instead of the default embedded database" + }, + "customUrl": { + "label": "Custom Database URL", + "description": "Full JDBC connection string (e.g., jdbc:postgresql://localhost:5432/postgres). If provided, individual connection settings below are not used." + }, + "type": { + "label": "Database Type", + "description": "Type of database (not used if custom URL is provided)" + }, + "hostName": { + "label": "Host Name", + "description": "Database server hostname (not used if custom URL is provided)" + }, + "port": { + "label": "Port", + "description": "Database server port (not used if custom URL is provided)" + }, + "name": { + "label": "Database Name", + "description": "Name of the database (not used if custom URL is provided)" + }, + "username": { + "label": "Username", + "description": "Database authentication username" + }, + "password": { + "label": "Password", + "description": "Database authentication password" + } + }, + "privacy": { + "title": "Privacy", + "description": "Configure privacy and data collection settings.", + "analytics": "Analytics & Tracking", + "enableAnalytics": { + "label": "Enable Analytics", + "description": "Collect anonymous usage analytics to help improve the application" + }, + "metricsEnabled": { + "label": "Enable Metrics", + "description": "Enable collection of performance and usage metrics. Provides API endpoint for admins to access metrics data" + }, + "searchEngine": "Search Engine Visibility", + "googleVisibility": { + "label": "Google Visibility", + "description": "Allow search engines to index this application" + } + }, + "advanced": { + "title": "Advanced", + "description": "Configure advanced features and experimental functionality.", + "features": "Feature Flags", + "processing": "Processing", + "endpoints": { + "label": "Endpoints", + "manage": "Manage API Endpoints", + "description": "Endpoint management is configured via YAML. See documentation for details on enabling/disabling specific endpoints." + }, + "enableAlphaFunctionality": { + "label": "Enable Alpha Features", + "description": "Enable experimental and alpha-stage features (may be unstable)" + }, + "enableUrlToPDF": { + "label": "Enable URL to PDF", + "description": "Allow conversion of web pages to PDF documents" + }, + "maxDPI": { + "label": "Maximum DPI", + "description": "Maximum DPI for image processing (0 = unlimited)" + }, + "tessdataDir": { + "label": "Tessdata Directory", + "description": "Path to the tessdata directory for OCR language files" + }, + "disableSanitize": { + "label": "Disable HTML Sanitization", + "description": "WARNING: Security risk - disabling HTML sanitization can lead to XSS vulnerabilities" + }, + "tempFileManagement": { + "label": "Temp File Management", + "description": "Configure temporary file storage and cleanup behavior", + "baseTmpDir": { + "label": "Base Temp Directory", + "description": "Base directory for temporary files (leave empty for default: java.io.tmpdir/stirling-pdf)" + }, + "libreofficeDir": { + "label": "LibreOffice Temp Directory", + "description": "Directory for LibreOffice temp files (leave empty for default: baseTmpDir/libreoffice)" + }, + "systemTempDir": { + "label": "System Temp Directory", + "description": "System temp directory to clean (only used if cleanupSystemTemp is enabled)" + }, + "prefix": { + "label": "Temp File Prefix", + "description": "Prefix for temp file names" + }, + "maxAgeHours": { + "label": "Max Age (hours)", + "description": "Maximum age in hours before temp files are cleaned up" + }, + "cleanupIntervalMinutes": { + "label": "Cleanup Interval (minutes)", + "description": "How often to run cleanup (in minutes)" + }, + "startupCleanup": { + "label": "Startup Cleanup", + "description": "Clean up old temp files on application startup" + }, + "cleanupSystemTemp": { + "label": "Cleanup System Temp", + "description": "Whether to clean broader system temp directory (use with caution)" + } + }, + "processExecutor": { + "label": "Process Executor Limits", + "description": "Configure session limits and timeouts for each process executor", + "sessionLimit": { + "label": "Session Limit", + "description": "Maximum concurrent instances" + }, + "timeout": { + "label": "Timeout (minutes)", + "description": "Maximum execution time" + }, + "libreOffice": "LibreOffice", + "pdfToHtml": "PDF to HTML", + "qpdf": "QPDF", + "tesseract": "Tesseract OCR", + "pythonOpenCv": "Python OpenCV", + "weasyPrint": "WeasyPrint", + "installApp": "Install App", + "calibre": "Calibre", + "ghostscript": "Ghostscript", + "ocrMyPdf": "OCRmyPDF" + } + }, + "mail": { + "title": "Mail Server", + "description": "Configure SMTP settings for sending email notifications.", + "smtp": "SMTP Configuration", + "enabled": { + "label": "Enable Mail", + "description": "Enable email notifications and SMTP functionality" + }, + "host": { + "label": "SMTP Host", + "description": "The hostname or IP address of your SMTP server" + }, + "port": { + "label": "SMTP Port", + "description": "The port number for SMTP connection (typically 25, 465, or 587)" + }, + "username": { + "label": "SMTP Username", + "description": "Username for SMTP authentication" + }, + "password": { + "label": "SMTP Password", + "description": "Password for SMTP authentication" + }, + "from": { + "label": "From Address", + "description": "The email address to use as the sender" + }, + "enableInvites": { + "label": "Enable Email Invites", + "description": "Allow admins to invite users via email with auto-generated passwords" + }, + "frontendUrl": { + "label": "Frontend URL", + "description": "Base URL for frontend (e.g. https://pdf.example.com). Used for generating invite links in emails. Leave empty to use backend URL." + } + }, + "legal": { + "title": "Legal Documents", + "description": "Configure links to legal documents and policies.", + "disclaimer": { + "title": "Legal Responsibility Warning", + "message": "By customizing these legal documents, you assume full responsibility for ensuring compliance with all applicable laws and regulations, including but not limited to GDPR and other EU data protection requirements. Only modify these settings if: (1) you are operating a personal/private instance, (2) you are outside EU jurisdiction and understand your local legal obligations, or (3) you have obtained proper legal counsel and accept sole responsibility for all user data and legal compliance. Stirling-PDF and its developers assume no liability for your legal obligations." + }, + "termsAndConditions": { + "label": "Terms and Conditions", + "description": "URL or filename to terms and conditions" + }, + "privacyPolicy": { + "label": "Privacy Policy", + "description": "URL or filename to privacy policy" + }, + "accessibilityStatement": { + "label": "Accessibility Statement", + "description": "URL or filename to accessibility statement" + }, + "cookiePolicy": { + "label": "Cookie Policy", + "description": "URL or filename to cookie policy" + }, + "impressum": { + "label": "Impressum", + "description": "URL or filename to impressum (required in some jurisdictions)" + } + }, + "premium": { + "title": "Premium & Enterprise", + "description": "Configure your premium or enterprise license key.", + "license": "License Configuration", + "key": { + "label": "License Key", + "description": "Enter your premium or enterprise license key" + }, + "enabled": { + "label": "Enable Premium Features", + "description": "Enable license key checks for pro/enterprise features" + }, + "movedFeatures": { + "title": "Premium Features Distributed", + "message": "Premium and Enterprise features are now organized in their respective sections:" + } + }, + "features": { + "title": "Features", + "description": "Configure optional features and functionality.", + "serverCertificate": { + "label": "Server Certificate", + "description": "Configure server-side certificate generation for \"Sign with Stirling-PDF\" functionality", + "enabled": { + "label": "Enable Server Certificate", + "description": "Enable server-side certificate for \"Sign with Stirling-PDF\" option" + }, + "organizationName": { + "label": "Organization Name", + "description": "Organization name for generated certificates" + }, + "validity": { + "label": "Certificate Validity (days)", + "description": "Number of days the certificate will be valid" + }, + "regenerateOnStartup": { + "label": "Regenerate on Startup", + "description": "Generate new certificate on each application startup" + } + } + }, + "endpoints": { + "title": "API Endpoints", + "description": "Control which API endpoints and endpoint groups are available.", + "management": "Endpoint Management", + "toRemove": { + "label": "Disabled Endpoints", + "description": "Select individual endpoints to disable" + }, + "groupsToRemove": { + "label": "Disabled Endpoint Groups", + "description": "Select endpoint groups to disable" + }, + "note": "Note: Disabling endpoints restricts API access but does not remove UI components. Restart required for changes to take effect." + } + } }, "fileUpload": { - "loading": "YÃŧklənir..." + "selectFile": "Select a file", + "selectFiles": "Select files", + "selectPdfToView": "Select a PDF to view", + "selectPdfToEdit": "Select a PDF to edit", + "chooseFromStorage": "Choose a file from storage or upload a new PDF", + "chooseFromStorageMultiple": "Choose files from storage or upload new PDFs", + "loadFromStorage": "Load from Storage", + "filesAvailable": "files available", + "loading": "YÃŧklənir...", + "or": "or", + "dropFileHere": "Drop file here or click to upload", + "dropFilesHere": "Drop files here or click the upload button", + "pdfFilesOnly": "PDF files only", + "supportedFileTypes": "Supported file types", + "upload": "Upload", + "uploadFile": "Upload File", + "uploadFiles": "Upload Files", + "noFilesInStorage": "No files available in storage. Upload some files first.", + "selectFromStorage": "Select from Storage", + "backToTools": "Back to Tools", + "addFiles": "Add Files", + "dragFilesInOrClick": "Drag files in or click \"Add Files\" to browse" + }, + "fileEditor": { + "addFiles": "Add Files" }, "fileManager": { + "title": "Upload PDF Files", + "subtitle": "Add files to your storage for easy access across tools", + "filesSelected": "files selected", + "clearSelection": "Clear Selection", + "openInFileEditor": "Open in File Editor", + "uploadError": "Failed to upload some files.", + "failedToOpen": "Failed to open file. It may have been removed from storage.", + "failedToLoad": "Failed to load file to active set.", + "storageCleared": "Browser cleared storage. Files have been removed. Please re-upload.", + "clearAll": "Clear All", + "reloadFiles": "Reload Files", + "dragDrop": "Drag & Drop files here", + "clickToUpload": "Click to upload files", + "selectedFiles": "Selected Files", + "storage": "Storage", + "filesStored": "files stored", + "storageError": "Storage error occurred", + "storageLow": "Storage is running low. Consider removing old files.", + "supportMessage": "Powered by browser database storage for unlimited capacity", + "noFileSelected": "No files selected", + "showHistory": "Show History", + "hideHistory": "Hide History", + "fileHistory": "File History", + "loadingHistory": "Loading History...", + "lastModified": "Last Modified", + "toolChain": "Tools Applied", + "restore": "Restore", + "unzip": "Unzip", + "searchFiles": "Search files...", + "recent": "Recent", + "localFiles": "Local Files", + "googleDrive": "Google Drive", + "googleDriveShort": "Drive", + "myFiles": "My Files", + "noRecentFiles": "No recent files found", + "googleDriveNotAvailable": "Google Drive integration not available", + "openFiles": "Open Files", + "openFile": "Open File", + "details": "File Details", "fileName": "Ad", + "fileFormat": "Format", + "fileSize": "Size", "fileVersion": "Versiya", + "totalSelected": "Total Selected", + "dropFilesHere": "Drop files here", "selectAll": "HamÄąsÄąnÄą Seç", "deselectAll": "HamÄąsÄąnÄą Seçməni Ləğv Et", "deleteSelected": "Seçilmişi Sil", + "downloadSelected": "Download Selected", + "selectedCount": "{{count}} selected", "download": "Endir", - "delete": "Sil" + "delete": "Sil", + "unsupported": "Unsupported", + "addToUpload": "Add to Upload", + "deleteAll": "Delete All", + "loadingFiles": "Loading files...", + "noFiles": "No files available", + "noFilesFound": "No files found matching your search", + "openInPageEditor": "Open in Page Editor", + "showAll": "Show All", + "sortByDate": "Sort by Date", + "sortByName": "Sort by Name", + "sortBySize": "Sort by Size" + }, + "storage": { + "temporaryNotice": "Files are stored temporarily in your browser and may be cleared automatically", + "storageLimit": "Storage limit", + "storageUsed": "Temporary Storage used", + "storageFull": "Storage is nearly full. Consider removing some files.", + "fileTooLarge": "File too large. Maximum size per file is", + "storageQuotaExceeded": "Storage quota exceeded. Please remove some files before uploading more.", + "approximateSize": "Approximate size" }, "sanitize": { + "title": "Sanitise", + "desc": "Remove potentially harmful elements from PDF files.", "submit": "PDF-i Təmizlə", + "completed": "Sanitisation completed successfully", + "error": { + "generic": "Sanitisation failed", + "failed": "An error occurred while sanitising the PDF." + }, + "filenamePrefix": "sanitised", + "sanitizationResults": "Sanitisation Results", "steps": { - "settings": "Parametrlər" + "files": "Files", + "settings": "Parametrlər", + "results": "Results" + }, + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "options": { + "title": "Sanitisation Options", + "note": "Select the elements you want to remove from the PDF. At least one option must be selected.", + "removeJavaScript": { + "label": "Remove JavaScript", + "desc": "Remove JavaScript actions and scripts from the PDF" + }, + "removeEmbeddedFiles": { + "label": "Remove Embedded Files", + "desc": "Remove any files embedded within the PDF" + }, + "removeXMPMetadata": { + "label": "Remove XMP Metadata", + "desc": "Remove XMP metadata from the PDF" + }, + "removeMetadata": { + "label": "Remove Document Metadata", + "desc": "Remove document information metadata (title, author, etc.)" + }, + "removeLinks": { + "label": "Remove Links", + "desc": "Remove external links and launch actions from the PDF" + }, + "removeFonts": { + "label": "Remove Fonts", + "desc": "Remove embedded fonts from the PDF" + } + } + }, + "addPassword": { + "title": "Şifr Əlavə Et", + "desc": "Encrypt your PDF document with a password.", + "completed": "Password protection applied", + "submit": "Şifrlə", + "filenamePrefix": "encrypted", + "error": { + "failed": "An error occurred while encrypting the PDF." + }, + "passwords": { + "stepTitle": "Passwords & Encryption", + "completed": "Passwords configured", + "user": { + "label": "User Password", + "placeholder": "Enter user password" + }, + "owner": { + "label": "Owner Password", + "placeholder": "Enter owner password" + } + }, + "encryption": { + "keyLength": { + "label": "Encryption Key Length", + "40bit": "40-bit (Low)", + "128bit": "128-bit (Standard)", + "256bit": "256-bit (High)" + } + }, + "results": { + "title": "Encrypted PDFs" + }, + "tooltip": { + "header": { + "title": "Password Protection Overview" + }, + "passwords": { + "title": "Password Types", + "text": "User passwords restrict opening the document, while owner passwords control what can be done with the document once opened. You can set both or just one.", + "bullet1": "User Password: Required to open the PDF", + "bullet2": "Owner Password: Controls document permissions (not supported by all PDF viewers)" + }, + "encryption": { + "title": "Encryption Levels", + "text": "Higher encryption levels provide better security but may not be supported by older PDF viewers.", + "bullet1": "40-bit: Basic security, compatible with older viewers", + "bullet2": "128-bit: Standard security, widely supported", + "bullet3": "256-bit: Maximum security, requires modern viewers" + }, + "permissions": { + "title": "İcazələri Dəyişdir", + "text": "These permissions control what users can do with the PDF. Most effective when combined with an owner password." + } + }, + "tags": "təhlÃŧkəsiz,təhlÃŧkəsizlik", + "header": "Şifr Əlavə Et (Şifrləmə)", + "selectText": { + "1": "Şifrlənəcək PDF-i seç", + "2": "İstifadəçi Şifri", + "3": "Şifrləmə AçarÄą Uzunluğu", + "4": "BÃļyÃŧk dəyərlər daha gÃŧclÃŧdÃŧr, lakin kiçik dəyərlərin uyğunluğu yÃŧksəkdir.", + "5": "Təyin olunacaq icazə (Sahib (Owner) Şifri ilə birgə istifadə olunmasÄą tÃļvsiyə olunur.)", + "6": "Sənədin strukturunun dəyişilməsinin qarÅŸÄąsÄąnÄą al", + "7": "Məzmun xaric edilməsinin qarÅŸÄąsÄąnÄą al", + "8": "ƏlçatanlÄąq ÃŧçÃŧn xaricetmənin qarÅŸÄąsÄąnÄą al", + "9": "Anketin doldurulmasÄąnÄąn qarÅŸÄąsÄąnÄą al", + "10": "ModifikasiyanÄąn qarÅŸÄąsÄąnÄą al", + "11": "Sitat modifikasiyasÄąnÄąn qarÅŸÄąsÄąnÄą al", + "12": "Çap etmənin qarÅŸÄąsÄąnÄą al", + "13": "MÃŧxtəlif formatlarÄąn çap edilməsinin qarÅŸÄąsÄąnÄą al", + "14": "Sahib Şifri", + "15": "Sənəd aÃ§ÄąldÄąqdan sonra onunla nə edilə biləcəyini limitləndir (BÃŧtÃŧn oxuyucular dəstəkləmir)", + "16": "Sənədin ÃļzÃŧnÃŧn aÃ§ÄąlmağınÄą limitləndirir" } }, "changePermissions": { "title": "İcazələri Dəyişdir", + "desc": "Change document restrictions and permissions.", + "completed": "Permissions changed", "submit": "İcazələri Dəyişdir", + "error": { + "failed": "An error occurred while changing PDF permissions." + }, "permissions": { "preventAssembly": { "label": "Sənədin YığılmasÄąnÄąn QarÅŸÄąsÄąnÄą Al" @@ -1736,10 +4580,784 @@ "label": "Fərqli Formatlarda ÇapÄąn QarÅŸÄąsÄąnÄą Al" } }, + "results": { + "title": "Modified PDFs" + }, "tooltip": { "header": { "title": "İcazələri Dəyişdir" + }, + "description": { + "text": "Changes document permissions, allowing/disallowing access to different features in PDF readers." + }, + "warning": { + "text": "To make these permissions unchangeable, use the Add Password tool to set an owner password." } } + }, + "removePassword": { + "title": "Şifri Sil", + "desc": "PDF Sənədindən şifr qorumasÄąnÄą gÃļtÃŧr.", + "tags": "təhlÃŧkəsiz,deşifr,təhlÃŧkəsizlik,kodu aç,kodu sil", + "password": { + "stepTitle": "Şifri Sil", + "label": "Cari Şifr", + "placeholder": "Enter current password", + "completed": "Password configured" + }, + "filenamePrefix": "decrypted", + "error": { + "failed": "An error occurred while removing the password from the PDF." + }, + "tooltip": { + "description": "Removing password protection requires the password that was used to encrypt the PDF. This will decrypt the document, making it accessible without a password." + }, + "submit": "Sil", + "results": { + "title": "Decrypted PDFs" + }, + "header": "Şifri Sil (Deşifr)", + "selectText": { + "1": "Deşifr ÜçÃŧn PDF-i Seç", + "2": "Şifr" + } + }, + "automate": { + "title": "Automate", + "desc": "Build multi-step workflows by chaining together PDF actions. Ideal for recurring tasks.", + "invalidStep": "Invalid step", + "files": { + "placeholder": "Select files to process with this automation" + }, + "selection": { + "title": "Automation Selection", + "saved": { + "title": "Saved" + }, + "createNew": { + "title": "Create New Automation" + }, + "suggested": { + "title": "Suggested" + } + }, + "creation": { + "createTitle": "Create Automation", + "editTitle": "Edit Automation", + "intro": "Automations run tools sequentially. To get started, add tools in the order you want them to run.", + "name": { + "label": "Automation Name", + "placeholder": "My Automation" + }, + "description": { + "label": "Description (optional)", + "placeholder": "Describe what this automation does..." + }, + "tools": { + "selectTool": "Select a tool...", + "selected": "Selected Tools", + "remove": "Remove tool", + "configure": "Configure tool", + "notConfigured": "! Not Configured", + "addTool": "Add Tool", + "add": "Add a tool..." + }, + "save": "Save Automation", + "unsavedChanges": { + "title": "Unsaved Changes", + "message": "You have unsaved changes. Are you sure you want to go back? All changes will be lost.", + "cancel": "Cancel", + "confirm": "Go Back" + }, + "icon": { + "label": "Icon" + } + }, + "run": { + "title": "Run Automation" + }, + "sequence": { + "unnamed": "Unnamed Automation", + "steps": "{{count}} steps", + "running": "Running Automation...", + "run": "Run Automation", + "finish": "Finish" + }, + "reviewTitle": "Automation Results", + "config": { + "loading": "Loading tool configuration...", + "noSettings": "This tool does not have configurable settings.", + "title": "Configure {{toolName}}", + "description": "Configure the settings for this tool. These settings will be applied when the automation runs.", + "cancel": "Cancel", + "save": "Save Configuration" + }, + "copyToSaved": "Copy to Saved" + }, + "automation": { + "suggested": { + "securePdfIngestion": "Secure PDF Ingestion", + "securePdfIngestionDesc": "Comprehensive PDF processing workflow that sanitises documents, applies OCR with cleanup, converts to PDF/A format for long-term archival, and optimises file size.", + "emailPreparation": "Email Preparation", + "emailPreparationDesc": "Optimises PDFs for email distribution by compressing files, splitting large documents into 20MB chunks for email compatibility, and removing metadata for privacy.", + "secureWorkflow": "Security Workflow", + "secureWorkflowDesc": "Secures PDF documents by removing potentially malicious content like JavaScript and embedded files, then adds password protection to prevent unauthorised access. Password is set to 'password' by default.", + "processImages": "Process Images", + "processImagesDesc": "Converts multiple image files into a single PDF document, then applies OCR technology to extract searchable text from the images." + } + }, + "common": { + "copy": "Copy", + "copied": "Copied!", + "refresh": "Refresh", + "retry": "Retry", + "remaining": "remaining", + "used": "used", + "available": "available", + "cancel": "Cancel", + "preview": "Preview" + }, + "config": { + "overview": { + "title": "Application Configuration", + "description": "Current application settings and configuration details." + }, + "account": { + "overview": { + "title": "Account Settings", + "manageAccountPreferences": "Manage your account preferences", + "guestDescription": "You are signed in as a guest. Consider upgrading your account above." + }, + "upgrade": { + "title": "Upgrade Guest Account", + "description": "Link your account to preserve your history and access more features!", + "socialLogin": "Upgrade with Social Account", + "linkWith": "Link with", + "emailPassword": "or enter your email & password", + "email": "Email", + "emailPlaceholder": "Enter your email", + "password": "Password (optional)", + "passwordPlaceholder": "Set a password", + "passwordNote": "Leave empty to use email verification only", + "upgradeButton": "Upgrade Account" + } + }, + "apiKeys": { + "description": "Your API key for accessing Stirling's suite of PDF tools. Copy it to your project or refresh to generate a new one.", + "publicKeyAriaLabel": "Public API key", + "copyKeyAriaLabel": "Copy API key", + "refreshAriaLabel": "Refresh API key", + "includedCredits": "Included credits", + "purchasedCredits": "Purchased credits", + "totalCredits": "Total Credits", + "chartAriaLabel": "Credits usage: included {{includedUsed}} of {{includedTotal}}, purchased {{purchasedUsed}} of {{purchasedTotal}}", + "nextReset": "Next Reset", + "lastApiUse": "Last API Use", + "overlayMessage": "Generate a key to see credits and available credits", + "label": "API Key", + "guestInfo": "Guest users do not receive API keys. Create an account to get an API key you can use in your applications.", + "goToAccount": "Go to Account", + "refreshModal": { + "title": "Refresh API Keys", + "warning": "âš ī¸ Warning: This action will generate new API keys and make your previous keys invalid.", + "impact": "Any applications or services currently using these keys will stop working until you update them with the new keys.", + "confirmPrompt": "Are you sure you want to continue?", + "confirmCta": "Refresh Keys" + }, + "generateError": "We couldn't generate your API key." + } + }, + "AddAttachmentsRequest": { + "attachments": "Select Attachments", + "info": "Select files to attach to your PDF. These files will be embedded and accessible through the PDF's attachment panel.", + "selectFiles": "Select Files to Attach", + "placeholder": "Choose files...", + "addMoreFiles": "Add more files...", + "selectedFiles": "Selected Files", + "submit": "Add Attachments", + "results": { + "title": "Attachment Results" + }, + "error": { + "failed": "Add attachments operation failed" + } + }, + "termsAndConditions": "Terms & Conditions", + "logOut": "Log out", + "addAttachments": { + "error": { + "failed": "An error occurred while adding attachments to the PDF." + } + }, + "autoRename": { + "description": "This tool will automatically rename PDF files based on their content. It analyzes the document to find the most suitable title from the text." + }, + "customPosition": "Custom Position", + "details": "Details", + "downloadUnavailable": "Download unavailable for this item", + "invalidUndoData": "Cannot undo: invalid operation data", + "margin": { + "large": "Large", + "medium": "Medium", + "small": "Small", + "xLarge": "Extra Large" + }, + "noFilesToUndo": "Cannot undo: no files were processed in the last operation", + "noOperationToUndo": "No operation to undo", + "noValidFiles": "No valid files to process", + "operationCancelled": "Operation cancelled", + "pageEdit": { + "deselectAll": "Select None", + "selectAll": "Select All" + }, + "quickPosition": "Quick Position", + "reorganizePages": { + "error": { + "failed": "Failed to reorganize pages" + }, + "results": { + "title": "Pages Reorganized" + }, + "settings": { + "title": "Settings" + }, + "submit": "Reorganize Pages" + }, + "replace-color": { + "options": { + "fill": "Fill colour", + "gradient": "Gradient" + }, + "previewOverlayOpacity": "Preview overlay opacity", + "previewOverlayTransparency": "Preview overlay transparency", + "previewOverlayVisibility": "Show preview overlay", + "selectText": { + "1": "Rəngi dəyişmə və tərsinə çevirmə seçimləri", + "2": "Defolt(Defolt yÃŧksək kontrastlÄą rənglər)", + "3": "Fərdi(Fərdiləşdirilmiş rənglər)", + "4": "BÃŧtÃļv Tərsinə Çevir(BÃŧtÃŧn rəngləri tərsinə çevir)", + "5": "YÃŧksək kontrastlÄą rəng seçimləri", + "6": "Qara arxaplanda ağ mətn", + "7": "Ağ arxaplanda qara mətn", + "8": "Qara arxaplanda sarÄą mətn", + "9": "Qara arxaplanda yaÅŸÄąl mətn", + "10": "Mətn rəngi seç", + "11": "Arxaplan rəngi seç", + "12": "Choose start colour", + "13": "Choose end colour" + }, + "submit": "Əvəzlə", + "title": "QabaqcÄąl Rəng Seçimləri", + "header": "PDF-də Rəngləri Dəyiş-Tərsinə Çevir" + }, + "size": "Size", + "submit": "Submit", + "success": "Success", + "tools": { + "noSearchResults": "No tools found", + "noTools": "No tools available" + }, + "undoDataMismatch": "Cannot undo: operation data is corrupted", + "undoFailed": "Failed to undo operation", + "undoQuotaError": "Cannot undo: insufficient storage space", + "undoStorageError": "Undo completed but some files could not be saved to storage", + "undoSuccess": "Operation undone successfully", + "unsupported": "Unsupported", + "onboarding": { + "welcomeModal": { + "title": "Welcome to Stirling PDF!", + "description": "Would you like to take a quick 1-minute tour to learn the key features and how to get started?", + "helpHint": "You can always access this tour later from the Help button in the bottom left.", + "startTour": "Start Tour", + "maybeLater": "Maybe Later", + "dontShowAgain": "Don't Show Again" + }, + "allTools": "This is the All Tools panel, where you can browse and select from all available PDF tools.", + "selectCropTool": "Let's select the Crop tool to demonstrate how to use one of the tools.", + "toolInterface": "This is the Crop tool interface. As you can see, there's not much there because we haven't added any PDF files to work with yet.", + "filesButton": "The Files button on the Quick Access bar allows you to upload PDFs to use the tools on.", + "fileSources": "You can upload new files or access recent files from here. For the tour, we'll just use a sample file.", + "workbench": "This is the Workbench - the main area where you view and edit your PDFs.", + "viewSwitcher": "Use these controls to select how you want to view your PDFs.", + "viewer": "The Viewer lets you read and annotate your PDFs.", + "pageEditor": "The Page Editor allows you to do various operations on the pages within your PDFs, such as reordering, rotating and deleting.", + "activeFiles": "The Active Files view shows all of the PDFs you have loaded into the tool, and allows you to select which ones to process.", + "fileCheckbox": "Clicking one of the files selects it for processing. You can select multiple files for batch operations.", + "selectControls": "The Right Rail contains buttons to quickly select/deselect all of your active PDFs, along with buttons to change the app's theme or language.", + "cropSettings": "Now that we've selected the file we want crop, we can configure the Crop tool to choose the area that we want to crop the PDF to.", + "runButton": "Once the tool has been configured, this button allows you to run the tool on all the selected PDFs.", + "results": "After the tool has finished running, the Review step will show a preview of the results in this panel, and allow you to undo the operation or download the file. ", + "fileReplacement": "The modified file will replace the original file in the Workbench automatically, allowing you to easily run it through more tools.", + "pinButton": "You can use the Pin button if you'd rather your files stay active after running tools on them.", + "wrapUp": "You're all set! You've learnt about the main areas of the app and how to use them. Click the Help button whenever you like to see this tour again.", + "previous": "Previous", + "next": "Next", + "finish": "Finish", + "startTour": "Start Tour", + "startTourDescription": "Take a guided tour of Stirling PDF's key features" + }, + "workspace": { + "title": "Workspace", + "people": { + "title": "People", + "description": "Manage workspace members and their permissions", + "loading": "Loading people...", + "searchMembers": "Search members...", + "addMembers": "Add Members", + "inviteMembers": { + "label": "Invite Members", + "subtitle": "Type or paste in emails below, separated by commas. Your workspace will be billed by members." + }, + "user": "User", + "role": "Role", + "team": "Team", + "status": "Status", + "actions": "Actions", + "noMembersFound": "No members found", + "active": "Active", + "disabled": "Disabled", + "activeSession": "Active session", + "member": "Member", + "admin": "Admin", + "roleDescriptions": { + "admin": "Can manage settings and invite members, with full administrative access.", + "member": "Can view and edit shared files, but cannot manage workspace settings or members." + }, + "editRole": "Edit Role", + "enable": "Enable", + "disable": "Disable", + "deleteUser": "Delete User", + "deleteUserSuccess": "User deleted successfully", + "deleteUserError": "Failed to delete user", + "confirmDelete": "Are you sure you want to delete this user? This action cannot be undone.", + "addMember": { + "title": "Add Member", + "username": "Username (Email)", + "usernamePlaceholder": "user@example.com", + "password": "Password", + "passwordPlaceholder": "Enter password", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "forcePasswordChange": "Force password change on first login", + "cancel": "Cancel", + "submit": "Add Member", + "usernameRequired": "Username and password are required", + "passwordTooShort": "Password must be at least 6 characters", + "success": "User created successfully", + "error": "Failed to create user" + }, + "editMember": { + "title": "Edit Member", + "editing": "Editing:", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "cancel": "Cancel", + "submit": "Update Member", + "success": "User updated successfully", + "error": "Failed to update user" + }, + "toggleEnabled": { + "success": "User status updated successfully", + "error": "Failed to update user status" + }, + "delete": { + "success": "User deleted successfully", + "error": "Failed to delete user" + }, + "emailInvite": { + "tab": "Email Invite", + "description": "Type or paste in emails below, separated by commas. Users will receive login credentials via email.", + "emails": "Email Addresses", + "emailsPlaceholder": "user1@example.com, user2@example.com", + "emailsRequired": "At least one email address is required", + "submit": "Send Invites", + "success": "user(s) invited successfully", + "partialSuccess": "Some invites failed", + "allFailed": "Failed to invite users", + "error": "Failed to send invites" + }, + "directInvite": { + "tab": "Direct Create" + }, + "inviteLinkTab": { + "tab": "Invite Link" + }, + "inviteLink": { + "description": "Generate a secure link that allows the user to set their own password", + "email": "Email Address", + "emailPlaceholder": "user@example.com (optional)", + "emailDescription": "Optional - leave blank for a general invite link that can be used by anyone", + "emailRequired": "Email address is required", + "emailOptional": "Optional - leave blank for a general invite link", + "emailRequiredForSend": "Email address is required to send email notification", + "expiryHours": "Expiry Hours", + "expiryDescription": "How many hours until the link expires", + "sendEmail": "Send invite link via email", + "sendEmailDescription": "If enabled, the invite link will be sent to the specified email address", + "smtpRequired": "SMTP not configured", + "generate": "Generate Link", + "generated": "Invite Link Generated", + "copied": "Link copied to clipboard", + "success": "Invite link generated successfully", + "successWithEmail": "Invite link generated and sent via email", + "emailFailed": "Invite link generated, but email failed", + "emailFailedDetails": "Error: {0}. Please share the invite link manually.", + "error": "Failed to generate invite link", + "submit": "Generate Invite Link" + }, + "inviteMode": { + "username": "Username", + "email": "Email", + "link": "Link", + "emailDisabled": "Email invites require SMTP configuration and mail.enableInvites=true in settings" + }, + "license": { + "users": "users", + "availableSlots": "Available Slots", + "grandfathered": "Grandfathered", + "grandfatheredShort": "{{count}} grandfathered", + "fromLicense": "from license", + "slotsAvailable": "{{count}} user slot(s) available", + "noSlotsAvailable": "No slots available", + "currentUsage": "Currently using {{current}} of {{max}} user licences" + } + }, + "teams": { + "title": "Teams", + "description": "Manage teams and organize workspace members", + "loading": "Loading teams...", + "loadingDetails": "Loading team details...", + "createNewTeam": "Create New Team", + "teamName": "Team Name", + "totalMembers": "Total Members", + "actions": "Actions", + "noTeamsFound": "No teams found", + "noMembers": "No members in this team", + "system": "System", + "addMember": "Add Member", + "viewTeam": "View Team", + "removeMember": "Remove from team", + "cannotRemoveFromSystemTeam": "Cannot remove from system team", + "renameTeamLabel": "Rename Team", + "deleteTeamLabel": "Delete Team", + "cannotDeleteInternal": "Cannot delete the Internal team", + "confirmDelete": "Are you sure you want to delete this team? This team must be empty to delete.", + "confirmRemove": "Remove user from this team?", + "cannotRenameInternal": "Cannot rename the Internal team", + "cannotAddToInternal": "Cannot add members to the Internal team", + "teamNotFound": "Team not found", + "backToTeams": "Back to Teams", + "memberCount": "{{count}} members", + "removeMemberSuccess": "User removed from team", + "removeMemberError": "Failed to remove user from team", + "createTeam": { + "title": "Create New Team", + "teamName": "Team Name", + "teamNamePlaceholder": "Enter team name", + "cancel": "Cancel", + "submit": "Create Team", + "nameRequired": "Team name is required", + "success": "Team created successfully", + "error": "Failed to create team" + }, + "renameTeam": { + "title": "Rename Team", + "renaming": "Renaming:", + "newTeamName": "New Team Name", + "newTeamNamePlaceholder": "Enter new team name", + "cancel": "Cancel", + "submit": "Rename Team", + "nameRequired": "Team name is required", + "success": "Team renamed successfully", + "error": "Failed to rename team" + }, + "deleteTeam": { + "success": "Team deleted successfully", + "error": "Failed to delete team. Make sure the team is empty.", + "teamMustBeEmpty": "Team must be empty before deletion" + }, + "addMemberToTeam": { + "title": "Add Member to Team", + "addingTo": "Adding to", + "selectUser": "Select User", + "selectUserPlaceholder": "Choose a user", + "selectUserRequired": "Please select a user", + "currentlyIn": "currently in", + "willBeMoved": "Note: This user will be moved from their current team to this team.", + "cancel": "Cancel", + "submit": "Add Member", + "userRequired": "Please select a user", + "success": "Member added to team successfully", + "error": "Failed to add member to team" + }, + "changeTeam": { + "label": "Change Team", + "title": "Change Team", + "changing": "Moving", + "selectTeam": "Select Team", + "selectTeamPlaceholder": "Choose a team", + "selectTeamRequired": "Please select a team", + "success": "Team changed successfully", + "error": "Failed to change team", + "submit": "Change Team" + } + } + }, + "plan": { + "currency": "Currency", + "popular": "Popular", + "current": "Current Plan", + "upgrade": "Upgrade", + "contact": "Contact Us", + "customPricing": "Custom", + "showComparison": "Compare All Features", + "hideComparison": "Hide Feature Comparison", + "featureComparison": "Feature Comparison", + "activePlan": { + "title": "Active Plan", + "subtitle": "Your current subscription details" + }, + "availablePlans": { + "title": "Available Plans", + "subtitle": "Choose the plan that fits your needs" + }, + "static": { + "title": "Billing Information", + "message": "Online billing is not currently configured. To upgrade your plan or manage subscriptions, please contact us directly.", + "contactSales": "Contact Sales", + "contactToUpgrade": "Contact us to upgrade or customize your plan", + "maxUsers": "Max Users", + "upTo": "Up to" + }, + "period": { + "month": "month" + }, + "free": { + "name": "Free", + "highlight1": "Limited Tool Usage Per week", + "highlight2": "Access to all tools", + "highlight3": "Community support" + }, + "pro": { + "name": "Pro", + "highlight1": "Unlimited Tool Usage", + "highlight2": "Advanced PDF tools", + "highlight3": "No watermarks" + }, + "enterprise": { + "name": "Enterprise", + "highlight1": "Custom pricing", + "highlight2": "Dedicated support", + "highlight3": "Latest features" + }, + "feature": { + "title": "Feature", + "pdfTools": "Basic PDF Tools", + "fileSize": "File Size Limit", + "automation": "Automate tool workflows", + "api": "API Access", + "priority": "Priority Support", + "customPricing": "Custom Pricing" + } + }, + "subscription": { + "status": { + "active": "Active", + "pastDue": "Past Due", + "canceled": "Canceled", + "incomplete": "Incomplete", + "trialing": "Trial", + "none": "No Subscription" + }, + "renewsOn": "Renews on {{date}}", + "cancelsOn": "Cancels on {{date}}" + }, + "billing": { + "manageBilling": "Manage Billing", + "portal": { + "error": "Failed to open billing portal" + } + }, + "payment": { + "preparing": "Preparing your checkout...", + "upgradeTitle": "Upgrade to {{planName}}", + "success": "Payment Successful!", + "successMessage": "Your subscription has been activated successfully. You will receive a confirmation email shortly.", + "autoClose": "This window will close automatically...", + "error": "Payment Error" + }, + "firstLogin": { + "title": "First Time Login", + "welcomeTitle": "Welcome!", + "welcomeMessage": "For security reasons, you must change your password on your first login.", + "loggedInAs": "Logged in as", + "error": "Error", + "currentPassword": "Current Password", + "enterCurrentPassword": "Enter your current password", + "newPassword": "New Password", + "enterNewPassword": "Enter new password (min 8 characters)", + "confirmPassword": "Confirm New Password", + "reEnterNewPassword": "Re-enter new password", + "changePassword": "Change Password", + "allFieldsRequired": "All fields are required", + "passwordsDoNotMatch": "New passwords do not match", + "passwordTooShort": "Password must be at least 8 characters", + "passwordMustBeDifferent": "New password must be different from current password", + "passwordChangedSuccess": "Password changed successfully! Please log in again.", + "passwordChangeFailed": "Failed to change password. Please check your current password." + }, + "invite": { + "welcome": "Welcome to Stirling PDF", + "invalidToken": "Invalid invitation link", + "validationError": "Failed to validate invitation link", + "passwordRequired": "Password is required", + "passwordTooShort": "Password must be at least 6 characters", + "passwordMismatch": "Passwords do not match", + "acceptError": "Failed to create account", + "validating": "Validating invitation...", + "invalidInvitation": "Invalid Invitation", + "goToLogin": "Go to Login", + "welcomeTitle": "You've been invited!", + "welcomeSubtitle": "Complete your account setup to get started", + "accountFor": "Creating account for", + "linkExpires": "Link expires", + "email": "Email address", + "emailPlaceholder": "Enter your email address", + "emailRequired": "Email address is required", + "invalidEmail": "Invalid email address", + "choosePassword": "Choose a password", + "passwordPlaceholder": "Enter your password", + "confirmPassword": "Confirm password", + "confirmPasswordPlaceholder": "Re-enter your password", + "createAccount": "Create Account", + "creating": "Creating Account...", + "alreadyHaveAccount": "Already have an account?", + "signIn": "Sign in" + }, + "audit": { + "error": { + "title": "Error loading audit system" + }, + "notAvailable": "Audit system not available", + "notAvailableMessage": "The audit system is not configured or not available.", + "disabled": "Audit logging is disabled", + "disabledMessage": "Enable audit logging in your application configuration to track system events.", + "systemStatus": { + "title": "System Status", + "status": "Audit Logging", + "enabled": "Enabled", + "disabled": "Disabled", + "level": "Audit Level", + "retention": "Retention Period", + "days": "days", + "totalEvents": "Total Events" + }, + "tabs": { + "dashboard": "Dashboard", + "events": "Audit Events", + "export": "Export" + }, + "charts": { + "title": "Audit Dashboard", + "error": "Error loading charts", + "day": "Day", + "week": "Week", + "month": "Month", + "byType": "Events by Type", + "byUser": "Events by User", + "overTime": "Events Over Time" + }, + "events": { + "title": "Audit Events", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "error": "Error loading events", + "noEvents": "No events found", + "timestamp": "Timestamp", + "type": "Type", + "user": "User", + "ipAddress": "IP Address", + "actions": "Actions", + "viewDetails": "View Details", + "eventDetails": "Event Details", + "details": "Details" + }, + "export": { + "title": "Export Audit Data", + "description": "Export audit events to CSV or JSON format. Use filters to limit the exported data.", + "format": "Export Format", + "filters": "Filters (Optional)", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "exportButton": "Export Data", + "error": "Failed to export data" + } + }, + "usage": { + "noData": "No data available", + "error": "Error loading usage statistics", + "noDataMessage": "No usage statistics are currently available.", + "controls": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All", + "refresh": "Refresh", + "dataTypeLabel": "Data Type:", + "dataType": { + "all": "All", + "api": "API", + "ui": "UI" + } + }, + "showing": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All" + }, + "stats": { + "totalEndpoints": "Total Endpoints", + "totalVisits": "Total Visits", + "showing": "Showing", + "selectedVisits": "Selected Visits" + }, + "chart": { + "title": "Endpoint Usage Chart" + }, + "table": { + "title": "Detailed Statistics", + "endpoint": "Endpoint", + "visits": "Visits", + "percentage": "Percentage", + "noData": "No data available" + } + }, + "backendHealth": { + "checking": "Checking backend status...", + "online": "Backend Online", + "offline": "Backend Offline" + }, + "autoRedact": { + "tags": "Qarala,gizlət,sil,qara,marker,gizli", + "title": "Avtomatik Gizlətmə", + "header": "Avtomatik Gizlətmə", + "colorLabel": "Rəng", + "textsToRedactLabel": "Gizlədiləcək Mətn (Yeni sətirlə ayrÄąlmÄąÅŸ)", + "textsToRedactPlaceholder": "e.g. \\nKonfidensial \\nTam-Məxfi", + "useRegexLabel": "Regex İstifadə Et", + "wholeWordSearchLabel": "BÃŧtÃļv SÃļz Axtar", + "customPaddingLabel": "Fərdi Əlavə BaşlÄąq", + "convertPDFToImageLabel": "PDF-i PDF-Şəkil-ə çevir (Qutunun arxasÄąndakÄą yazÄąnÄą silmək ÃŧçÃŧn istifadə edilir)", + "submitButton": "Təsdiqlə" + }, + "replaceColorPdf": { + "tags": "Rəngləri Dəyiş,Səhifə əməliyyatlarÄą,Back end,server-tərəf" } -} \ No newline at end of file +} diff --git a/frontend/public/locales/bg-BG/translation.json b/frontend/public/locales/bg-BG/translation.json index a69f7507a..dfe51b527 100644 --- a/frontend/public/locales/bg-BG/translation.json +++ b/frontend/public/locales/bg-BG/translation.json @@ -1,4 +1,40 @@ { + "toolPanel": { + "modePrompt": { + "title": "Choose how you browse tools", + "description": "Preview both layouts and decide how you want to explore Stirling PDF tools.", + "sidebarTitle": "Sidebar mode", + "sidebarDescription": "Keep tools alongside your workspace for quick switching.", + "recommended": "Recommended", + "chooseSidebar": "Use sidebar mode", + "fullscreenTitle": "Fullscreen mode - (legacy)", + "fullscreenDescription": "Browse every tool in a catalogue that covers the workspace until you pick one.", + "chooseFullscreen": "Use fullscreen mode", + "dismiss": "Maybe later" + }, + "fullscreen": { + "showDetails": "Show Details", + "comingSoon": "Coming soon:", + "favorite": "Add to favourites", + "favorites": "Favourites", + "heading": "All tools (fullscreen view)", + "noResults": "Try adjusting your search or toggle descriptions to find what you need.", + "recommended": "Recommended", + "unfavorite": "Remove from favourites" + }, + "placeholder": "Choose a tool to get started", + "toggle": { + "fullscreen": "Switch to fullscreen mode", + "sidebar": "Switch to sidebar mode" + } + }, + "unsavedChanges": "You have unsaved changes to your PDF.", + "areYouSure": "Are you sure you want to leave?", + "unsavedChangesTitle": "Unsaved Changes", + "keepWorking": "Keep Working", + "discardChanges": "Discard & Leave", + "applyAndContinue": "Save & Leave", + "exportAndContinue": "Export & Continue", "language": { "direction": "ltr" }, @@ -18,8 +54,26 @@ "customTextDesc": "ПĐĩŅ€ŅĐžĐŊаĐģĐ¸ĐˇĐ¸Ņ€Đ°ĐŊ Ņ‚ĐĩĐēҁ҂", "numberPagesDesc": "Кои ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ¸ да ĐŊĐžĐŧĐĩŅ€Đ¸Ņ€Đ°Ņ‚Đĩ, ĐŋĐž ĐŋĐžĐ´Ņ€Đ°ĐˇĐąĐ¸Ņ€Đ°ĐŊĐĩ 'Đ˛ŅĐ¸Ņ‡Đēи', ŅŅŠŅ‰Đž ĐŋŅ€Đ¸ĐĩĐŧа 1-5 иĐģи 2,5,9 и Ņ‚.ĐŊ.", "customNumberDesc": "По ĐŋĐžĐ´Ņ€Đ°ĐˇĐąĐ¸Ņ€Đ°ĐŊĐĩ Đĩ {n}, ŅŅŠŅ‰Đž ĐŋŅ€Đ¸ĐĩĐŧа 'ĐĄŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ° {n} ĐžŅ‚ {total}', 'ĐĸĐĩĐēҁ҂-{n}', '{filename}-{n}", - "submit": "Đ”ĐžĐąĐ°Đ˛ŅĐŊĐĩ ĐŊа ĐŊĐžĐŧĐĩŅ€Đ° ĐŊа ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ¸" + "submit": "Đ”ĐžĐąĐ°Đ˛ŅĐŊĐĩ ĐŊа ĐŊĐžĐŧĐĩŅ€Đ° ĐŊа ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ¸", + "configuration": "Configuration", + "customize": "Customize Appearance", + "pagesAndStarting": "Pages & Starting Number", + "positionAndPages": "Position & Pages", + "error": { + "failed": "Add page numbers operation failed" + }, + "results": { + "title": "Page Number Results" + }, + "preview": "Position Selection", + "previewDisclaimer": "Preview is approximate. Final output may vary due to PDF font metrics." }, + "pageSelectionPrompt": "ПĐĩŅ€ŅĐžĐŊаĐģĐ¸ĐˇĐ¸Ņ€Đ°ĐŊ Đ¸ĐˇĐąĐžŅ€ ĐŊа ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ° (Đ’ŅŠĐ˛ĐĩĐ´ĐĩŅ‚Đĩ ҁĐŋĐ¸ŅŅŠĐē ҁ ĐŊĐžĐŧĐĩŅ€Đ° ĐŊа ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ¸ 1,5,6, Ņ€Đ°ĐˇĐ´ĐĩĐģĐĩĐŊи ҁҊҁ СаĐŋĐĩŅ‚Đ°Ņ, иĐģи Ņ„ŅƒĐŊĐēŅ†Đ¸Đ¸ ĐēĐ°Ņ‚Đž 2n+1) :", + "startingNumberTooltip": "The first number to display. Subsequent pages will increment from this number.", + "marginTooltip": "Distance between the page number and the edge of the page.", + "fontSizeTooltip": "Size of the page number text in points. Larger numbers create bigger text.", + "fontTypeTooltip": "Font family for the page numbers. Choose based on your document style.", + "customTextTooltip": "Optional custom format for page numbers. Use {n} as placeholder for the number. Example: \"Page {n}\" will show \"Page 1\", \"Page 2\", etc.", "pdfPrompt": "ИСйĐĩŅ€ĐĩŅ‚Đĩ PDF(и)", "multiPdfPrompt": "ИСйĐĩŅ€ĐĩŅ‚Đĩ PDF (2+)", "multiPdfDropPrompt": "ИСйĐĩŅ€ĐĩŅ‚Đĩ (иĐģи ĐŋĐģŅŠĐˇĐŊĐĩŅ‚Đĩ и Đŋ҃ҁĐŊĐĩŅ‚Đĩ) Đ˛ŅĐ¸Ņ‡Đēи PDF Ņ„Đ°ĐšĐģОвĐĩ, ĐžŅ‚ ĐēĐžĐ¸Ņ‚Đž ҁĐĩ ĐŊ҃ĐļдаĐĩŅ‚Đĩ", @@ -30,15 +84,41 @@ "uploadLimitExceededPlural": "are too large. Maximum allowed size is", "processTimeWarning": "ĐŸŅ€ĐĩĐ´ŅƒĐŋŅ€ĐĩĐļĐ´ĐĩĐŊиĐĩ: ĐĸОСи ĐŋŅ€ĐžŅ†Đĩҁ ĐŧĐžĐļĐĩ да ĐžŅ‚ĐŊĐĩĐŧĐĩ Đ´Đž ĐŧиĐŊŅƒŅ‚Đ° в ĐˇĐ°Đ˛Đ¸ŅĐ¸ĐŧĐžŅŅ‚ ĐžŅ‚ Ņ€Đ°ĐˇĐŧĐĩŅ€Đ° ĐŊа Ņ„Đ°ĐšĐģа", "pageOrderPrompt": "ПĐĩŅ€ŅĐžĐŊаĐģĐ¸ĐˇĐ¸Ņ€Đ°ĐŊ Ņ€ĐĩĐ´ ĐŊа ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ¸Ņ‚Đĩ (Đ’ŅŠĐ˛ĐĩĐ´ĐĩŅ‚Đĩ Ņ€Đ°ĐˇĐ´ĐĩĐģĐĩĐŊ ҁҊҁ СаĐŋĐĩŅ‚Đ°Đ¸ ҁĐŋĐ¸ŅŅŠĐē ҁ ĐŊĐžĐŧĐĩŅ€Đ° ĐŊа ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ¸ иĐģи Ņ„ŅƒĐŊĐēŅ†Đ¸Đ¸ ĐēĐ°Ņ‚Đž 2n+1):", - "pageSelectionPrompt": "ПĐĩŅ€ŅĐžĐŊаĐģĐ¸ĐˇĐ¸Ņ€Đ°ĐŊ Đ¸ĐˇĐąĐžŅ€ ĐŊа ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ° (Đ’ŅŠĐ˛ĐĩĐ´ĐĩŅ‚Đĩ ҁĐŋĐ¸ŅŅŠĐē ҁ ĐŊĐžĐŧĐĩŅ€Đ° ĐŊа ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ¸ 1,5,6, Ņ€Đ°ĐˇĐ´ĐĩĐģĐĩĐŊи ҁҊҁ СаĐŋĐĩŅ‚Đ°Ņ, иĐģи Ņ„ŅƒĐŊĐēŅ†Đ¸Đ¸ ĐēĐ°Ņ‚Đž 2n+1) :", "goToPage": "Давай", "true": "Đ’ŅŅ€ĐŊĐž", "false": "НĐĩĐ˛ŅŅ€ĐŊĐž", "unknown": "НĐĩĐŋОСĐŊĐ°Ņ‚", + "app": { + "description": "The Free Adobe Acrobat alternative (10M+ Downloads)" + }, "save": "ĐĄŅŠŅ…Ņ€Đ°ĐŊĐĩŅ‚Đĩ", "saveToBrowser": "ĐĄŅŠŅ…Ņ€Đ°ĐŊŅĐ˛Đ°ĐŊĐĩ в ĐąŅ€Đ°ŅƒĐˇŅŠŅ€Đ°", + "download": "Đ˜ĐˇŅ‚ĐĩĐŗĐģи", + "pin": "Pin File (keep active after tool run)", + "unpin": "Unpin File (replace after tool run)", + "undoOperationTooltip": "Click to undo the last operation and restore the original files", + "undo": "Undo", + "moreOptions": "More Options", + "editYourNewFiles": "Edit your new file(s)", "close": "Đ—Đ°Ņ‚Đ˛ĐžŅ€ĐĩŅ‚Đĩ", + "openInViewer": "Open in Viewer", + "confirmClose": "Confirm Close", + "confirmCloseMessage": "Are you sure you want to close this file?", + "confirmCloseCancel": "Cancel", + "confirmCloseConfirm": "Close File", + "fileSelected": "Selected: {{filename}}", + "chooseFile": "Choose File", "filesSelected": "Đ¸ĐˇĐąŅ€Đ°ĐŊи Ņ„Đ°ĐšĐģОвĐĩ", + "files": { + "title": "Files", + "upload": "Upload", + "uploadFiles": "Upload Files", + "addFiles": "Add files", + "selectFromWorkbench": "Select files from the workbench or ", + "selectMultipleFromWorkbench": "Select at least {{count}} files from the workbench or ", + "created": "Created", + "size": "File Size" + }, "noFavourites": "ĐŅĐŧа дОйавĐĩĐŊи ĐģŅŽĐąĐ¸Đŧи", "downloadComplete": "ХваĐģŅĐŊĐĩŅ‚Đž ĐˇĐ°Đ˛ŅŠŅ€ŅˆĐĩĐŊĐž", "bored": "ĐžŅ‚ĐĩĐē҇ĐĩĐŊи ҁ҂Đĩ да Ņ‡Đ°ĐēĐ°Ņ‚Đĩ?", @@ -56,7 +136,10 @@ }, "error": { "pdfPassword": "PDF Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚ŅŠŅ‚ Đĩ ҁ ĐŋĐ°Ņ€ĐžĐģа и иĐģи ĐŋĐ°Ņ€ĐžĐģĐ°Ņ‚Đ° ĐŊĐĩ Đĩ ĐŋŅ€ĐĩĐ´ĐžŅŅ‚Đ°Đ˛ĐĩĐŊа, иĐģи Đĩ ĐŊĐĩĐŋŅ€Đ°Đ˛Đ¸ĐģĐŊа", + "encryptedPdfMustRemovePassword": "This PDF is encrypted or password-protected. Please unlock it before converting to PDF/A.", + "incorrectPasswordProvided": "The PDF password is incorrect or not provided.", "_value": "Đ“Ņ€Đĩ҈Đēа", + "dismissAllErrors": "Dismiss All Errors", "sorry": "ИСвиĐŊĐĩŅ‚Đĩ Са ĐŋŅ€ĐžĐąĐģĐĩĐŧа!", "needHelp": "ĐŅƒĐļдаĐĩŅ‚Đĩ ҁĐĩ ĐžŅ‚ ĐŋĐžĐŧĐžŅ‰ / ĐžŅ‚ĐēŅ€Đ¸Ņ…Ņ‚Đĩ ĐŋŅ€ĐžĐąĐģĐĩĐŧ?", "contactTip": "АĐēĐž Đ˛ŅĐĩ ĐžŅ‰Đĩ иĐŧĐ°Ņ‚Đĩ ĐŋŅ€ĐžĐąĐģĐĩĐŧи, ĐŊĐĩ ҁĐĩ ĐēĐžĐģĐĩĐąĐ°ĐšŅ‚Đĩ да ҁĐĩ ŅĐ˛ŅŠŅ€ĐļĐĩŅ‚Đĩ ҁ ĐŊĐ°Ņ Са ĐŋĐžĐŧĐžŅ‰. МоĐļĐĩŅ‚Đĩ да иСĐŋŅ€Đ°Ņ‚Đ¸Ņ‚Đĩ СаĐŋĐ¸Ņ‚Đ˛Đ°ĐŊĐĩ ĐŊа ĐŊĐ°ŅˆĐ°Ņ‚Đ° ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ° в GitHub иĐģи да ҁĐĩ ŅĐ˛ŅŠŅ€ĐļĐĩŅ‚Đĩ ҁ ĐŊĐ°Ņ ҇ҀĐĩС Discord:", @@ -71,6 +154,10 @@ "githubSubmit": "GitHub - ИСĐŋŅ€Đ°Ņ‚ĐĩŅ‚Đĩ СаĐŋĐ¸Ņ‚Đ˛Đ°ĐŊĐĩ", "discordSubmit": "Discord - ИСĐŋŅ€Đ°Ņ‚ĐĩŅ‚Đĩ СаĐŋĐ¸Ņ‚Đ˛Đ°ĐŊĐĩ Са ĐŋĐžĐ´Đ´Ņ€ŅŠĐļĐēа" }, + "warning": { + "tooltipTitle": "Warning" + }, + "edit": "Edit", "delete": "Đ˜ĐˇŅ‚Ņ€Đ¸Đš", "username": "ĐŸĐžŅ‚Ņ€ĐĩĐąĐ¸Ņ‚ĐĩĐģҁĐēĐž иĐŧĐĩ", "password": "ĐŸĐ°Ņ€ĐžĐģа", @@ -82,6 +169,7 @@ "green": "ЗĐĩĐģĐĩĐŊĐž", "blue": "ХиĐŊŅŒĐž", "custom": "ПĐĩŅ€ŅĐžĐŊаĐģĐ¸ĐˇĐ¸Ņ€Đ°ĐŊĐĩ...", + "comingSoon": "Coming soon", "WorkInProgess": "Đ Đ°ĐąĐžŅ‚Đ°Ņ‚Đ° Đĩ в Ņ…ĐžĐ´, ĐŧĐžĐļĐĩ да ĐŊĐĩ Ņ€Đ°ĐąĐžŅ‚Đ¸ иĐģи да иĐŧа ĐŗŅ€Đĩ҈Đēи, ĐŧĐžĐģŅ, Đ´ĐžĐēĐģĐ°Đ´Đ˛Đ°ĐšŅ‚Đĩ Са ĐŋŅ€ĐžĐąĐģĐĩĐŧи!", "poweredBy": "ЗадвиĐļваĐŊ ҇ҀĐĩС", "yes": "Да", @@ -115,12 +203,14 @@ "page": "ĐĄŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ°", "pages": "ĐĄŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ¸", "loading": "Đ—Đ°Ņ€ĐĩĐļдаĐŊĐĩ ĐŊа...", + "review": "Review", "addToDoc": "Đ”ĐžĐąĐ°Đ˛ŅĐŊĐĩ ĐēҊĐŧ Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚", "reset": "ĐŅƒĐģĐ¸Ņ€Đ°ĐŊĐĩ", "apply": "ĐŸŅ€Đ¸ĐģĐžĐļи", "noFileSelected": "No file selected. Please upload one.", "legal": { "privacy": "ПоĐģĐ¸Ņ‚Đ¸Đēа Са ĐŋОвĐĩŅ€Đ¸Ņ‚ĐĩĐģĐŊĐžŅŅ‚", + "iAgreeToThe": "I agree to all of the", "terms": "ĐŸŅ€Đ°Đ˛Đ¸Đģа и ҃ҁĐģĐžĐ˛Đ¸Ņ", "accessibility": "Đ”ĐžŅŅ‚ŅŠĐŋĐŊĐžŅŅ‚", "cookie": "ПоĐģĐ¸Ņ‚Đ¸Đēа Са ĐąĐ¸ŅĐēĐ˛Đ¸Ņ‚Đēи", @@ -160,6 +250,7 @@ "title": "Đ˜ŅĐēĐ°Ņ‚Đĩ Đģи да ĐŋĐžĐ´ĐžĐąŅ€Đ¸Ņ‚Đĩ Stirling PDF?", "paragraph1": "Stirling PDF вĐēĐģŅŽŅ‡Đ˛Đ° аĐŊаĐģиСи, Са да ĐŊи ĐŋĐžĐŧĐžĐŗĐŊĐĩ да ĐŋĐžĐ´ĐžĐąŅ€Đ¸Đŧ ĐŋŅ€ĐžĐ´ŅƒĐēŅ‚Đ°. НиĐĩ ĐŊĐĩ ĐŋŅ€ĐžŅĐģĐĩĐ´ŅĐ˛Đ°ĐŧĐĩ ĐģĐ¸Ņ‡ĐŊа иĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸Ņ иĐģи ŅŅŠĐ´ŅŠŅ€ĐļаĐŊиĐĩ ĐŊа Ņ„Đ°ĐšĐģОвĐĩ.", "paragraph2": "МоĐģŅ, ОйĐŧĐ¸ŅĐģĐĩŅ‚Đĩ Đ˛ŅŠĐˇĐŧĐžĐļĐŊĐžŅŅ‚Ņ‚Đ° Са аĐŊаĐģиС, Са ​​да ĐŋĐžĐŧĐžĐŗĐŊĐĩŅ‚Đĩ ĐŊа Stirling-PDF да Ņ€Đ°ŅŅ‚Đĩ и да ĐŊи ĐŋОСвОĐģи да Ņ€Đ°ĐˇĐąĐĩŅ€ĐĩĐŧ ĐŋĐž-Đ´ĐžĐąŅ€Đĩ ĐŊĐ°ŅˆĐ¸Ņ‚Đĩ ĐŋĐžŅ‚Ņ€ĐĩĐąĐ¸Ņ‚ĐĩĐģи.", + "learnMore": "Learn more", "enable": "АĐēŅ‚Đ¸Đ˛Đ¸Ņ€Đ°ĐŊĐĩ ĐŊа аĐŊаĐģиСа", "disable": "ДĐĩаĐēŅ‚Đ¸Đ˛Đ¸Ņ€Đ°ĐŊĐĩ ĐŊа аĐŊаĐģиСа", "settings": "МоĐļĐĩŅ‚Đĩ да ĐŋŅ€ĐžĐŧĐĩĐŊĐ¸Ņ‚Đĩ ĐŊĐ°ŅŅ‚Ņ€ĐžĐšĐēĐ¸Ņ‚Đĩ Са аĐŊаĐģиС Đ˛ŅŠĐ˛ config/settings.yml Ņ„Đ°ĐšĐģа" @@ -203,6 +294,54 @@ "cacheInputs": { "name": "ЗаĐŋаСĐĩŅ‚Đĩ Đ˛ŅŠĐ˛ĐĩĐ´ĐĩĐŊĐ¸Ņ‚Đĩ Ņ„ĐžŅ€Đŧ҃ĐģŅŅ€Đ¸", "help": "АĐēŅ‚Đ¸Đ˛Đ¸Ņ€Đ°ĐšŅ‚Đĩ Са ŅŅŠŅ…Ņ€Đ°ĐŊŅĐ˛Đ°ĐŊĐĩ ĐŊа ĐŋŅ€ĐĩĐ´Đ¸ŅˆĐŊи иСĐŋĐžĐģСваĐŊи Đ˛ŅŠĐ˛ĐĩĐ´ĐĩĐŊи даĐŊĐŊи Са ĐąŅŠĐ´ĐĩŅ‰Đ¸ иСĐŋҊĐģĐŊĐĩĐŊĐ¸Ņ" + }, + "general": { + "title": "General", + "description": "Configure general application preferences.", + "account": "Account", + "accountDescription": "Manage your account settings", + "user": "User", + "signedInAs": "Signed in as", + "logout": "Log out", + "enableFeatures": { + "title": "For System Administrators", + "intro": "Enable user authentication, team management, and workspace features for your organization.", + "action": "Configure", + "and": "and", + "benefit": "Enables user roles, team collaboration, admin controls, and enterprise features.", + "learnMore": "Learn more in documentation", + "dismiss": "Dismiss" + }, + "autoUnzip": "Auto-unzip API responses", + "autoUnzipDescription": "Automatically extract files from ZIP responses", + "autoUnzipTooltip": "Automatically extract ZIP files returned from API operations. Disable to keep ZIP files intact. This does not affect automation workflows.", + "autoUnzipFileLimit": "Auto-unzip file limit", + "autoUnzipFileLimitDescription": "Maximum number of files to extract from ZIP", + "autoUnzipFileLimitTooltip": "Only unzip if the ZIP contains this many files or fewer. Set higher to extract larger ZIPs.", + "defaultToolPickerMode": "Default tool picker mode", + "defaultToolPickerModeDescription": "Choose whether the tool picker opens in fullscreen or sidebar by default", + "mode": { + "fullscreen": "Fullscreen", + "sidebar": "Sidebar" + } + }, + "hotkeys": { + "title": "Keyboard Shortcuts", + "description": "Hover a tool to see its shortcut or customise it below. Click \"Change shortcut\" and press a new key combination. Press Esc to cancel.", + "errorModifier": { + "mac": "Include ⌘ (Command), âŒĨ (Option), or another modifier in your shortcut.", + "windows": "Include Ctrl, Alt, or another modifier in your shortcut." + }, + "errorConflict": "Shortcut already used by {{tool}}.", + "none": "Not assigned", + "customBadge": "Custom", + "defaultLabel": "Default: {{shortcut}}", + "capturing": "Press keysâ€Ļ (Esc to cancel)", + "change": "Change shortcut", + "reset": "Reset", + "shortcut": "Shortcut", + "noShortcut": "No shortcut set", + "searchPlaceholder": "Search tools..." } }, "changeCreds": { @@ -274,8 +413,10 @@ "top20": "Top 20", "all": "All", "refresh": "Refresh", - "includeHomepage": "Include Homepage ('/')", - "includeLoginPage": "Include Login Page ('/login')", + "dataTypeLabel": "Data Type:", + "dataTypeAll": "All", + "dataTypeApi": "API", + "dataTypeUi": "UI", "totalEndpoints": "Total Endpoints", "totalVisits": "Total Visits", "showing": "Showing", @@ -290,7 +431,9 @@ "top": "Top", "numberOfVisits": "Number of Visits", "visitsTooltip": "Visits: {0} ({1}% of total)", - "retry": "Retry" + "retry": "Retry", + "includeHomepage": "Include Homepage ('/')", + "includeLoginPage": "Include Login Page ('/login')" }, "database": { "title": "ИĐŧĐŋĐžŅ€Ņ‚/ЕĐēҁĐŋĐžŅ€Ņ‚ ĐŊа йаСа даĐŊĐŊи", @@ -331,22 +474,310 @@ "alphabetical": "По Đ°ĐˇĐąŅƒŅ‡ĐĩĐŊ Ņ€ĐĩĐ´", "globalPopularity": "ХвĐĩŅ‚ĐžĐ˛ĐŊа ĐŋĐžĐŋ҃ĐģŅŅ€ĐŊĐžŅŅ‚", "sortBy": "ĐĄĐžŅ€Ņ‚Đ¸Ņ€Đ°ĐŊĐĩ ĐŋĐž:", + "mobile": { + "brandAlt": "Stirling PDF logo", + "openFiles": "Open files", + "swipeHint": "Swipe left or right to switch views", + "tools": "Tools", + "toolsSlide": "Tool selection panel", + "viewSwitcher": "Switch workspace view", + "workbenchSlide": "Workspace panel", + "workspace": "Workspace" + }, "multiTool": { + "tags": "multiple,tools", "title": "PDF ĐœŅƒĐģŅ‚Đ¸ иĐŊŅŅ‚Ņ€ŅƒĐŧĐĩĐŊŅ‚", "desc": "ОбĐĩдиĐŊŅĐ˛Đ°ĐŊĐĩ, ĐˇĐ°Đ˛ŅŠŅ€Ņ‚Đ°ĐŊĐĩ, ĐŋŅ€ĐĩĐŊĐ°Ņ€ĐĩĐļдаĐŊĐĩ и ĐŋŅ€ĐĩĐŧĐ°Ņ…Đ˛Đ°ĐŊĐĩ ĐŊа ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ¸" }, "merge": { + "tags": "combine,join,unite", "title": "ОбĐĩдиĐŊŅĐ˛Đ°ĐŊĐĩ", "desc": "ЛĐĩҁĐŊĐž ОйĐĩдиĐŊĐĩŅ‚Đĩ ĐŧĐŊĐžĐļĐĩŅŅ‚Đ˛Đž PDF Ņ„Đ°ĐšĐģОвĐĩ в ĐĩдиĐŊ." }, "split": { + "tags": "divide,separate,break", "title": "РаСдĐĩĐģŅĐŊĐĩ", "desc": "РаСдĐĩĐģŅĐŊĐĩ ĐŊа PDF Ņ„Đ°ĐšĐģОвĐĩ ĐŊа ĐŧĐŊĐžĐļĐĩŅŅ‚Đ˛Đž Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ¸" }, "rotate": { + "tags": "turn,flip,orient", "title": "Đ—Đ°Đ˛ŅŠŅ€Ņ‚Đ°ĐŊĐĩ", "desc": "ЛĐĩҁĐŊĐž ĐˇĐ°Đ˛ŅŠŅ€Ņ‚ĐĩŅ‚Đĩ Đ˛Đ°ŅˆĐ¸Ņ‚Đĩ PDF Ņ„Đ°ĐšĐģОвĐĩ." }, + "convert": { + "tags": "transform,change", + "title": "ĐŸŅ€ĐĩĐžĐąŅ€Đ°ĐˇŅƒĐ˛Đ°ĐŊĐĩ", + "desc": "Convert files between different formats" + }, + "pdfOrganiser": { + "tags": "organize,rearrange,reorder", + "title": "ĐžŅ€ĐŗĐ°ĐŊĐ¸ĐˇĐ¸Ņ€Đ°ĐŊĐĩ", + "desc": "ĐŸŅ€ĐĩĐŧĐ°Ņ…Đ˛Đ°ĐŊĐĩ/ĐŋŅ€ĐĩĐŊĐ°Ņ€ĐĩĐļдаĐŊĐĩ ĐŊа ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ¸ ĐēҊĐŧ ĐŋŅ€ĐžĐ¸ĐˇĐ˛ĐžĐģĐĩĐŊ Ņ€ĐĩĐ´" + }, + "addImage": { + "tags": "insert,embed,place", + "title": "Đ”ĐžĐąĐ°Đ˛ŅĐŊĐĩ ĐŊа Đ¸ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊиĐĩ", + "desc": "Đ”ĐžĐąĐ°Đ˛Ņ Đ¸ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊиĐĩ ĐēҊĐŧ СададĐĩĐŊĐž ĐŧŅŅŅ‚Đž ĐēҊĐŧ PDF Ņ„Đ°ĐšĐģа" + }, + "addAttachments": { + "tags": "embed,attach,include", + "title": "Add Attachments", + "desc": "Add or remove embedded files (attachments) to/from a PDF" + }, + "watermark": { + "tags": "stamp,mark,overlay", + "title": "Đ”ĐžĐąĐ°Đ˛ŅĐŊĐĩ ĐŊа вОдĐĩĐŊ СĐŊаĐē", + "desc": "ДобавĐĩŅ‚Đĩ ĐŋĐĩŅ€ŅĐžĐŊаĐģĐ¸ĐˇĐ¸Ņ€Đ°ĐŊ вОдĐĩĐŊ СĐŊаĐē ĐēҊĐŧ Đ˛Đ°ŅˆĐ¸Ņ PDF Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚." + }, + "removePassword": { + "tags": "unlock", + "title": "ĐŸŅ€ĐĩĐŧĐ°Ņ…Đ˛Đ°ĐŊĐĩ ĐŊа ĐŋĐ°Ņ€ĐžĐģа", + "desc": "ĐŸŅ€ĐĩĐŧĐ°Ņ…ĐŊĐĩŅ‚Đĩ ĐˇĐ°Ņ‰Đ¸Ņ‚Đ°Ņ‚Đ° ҁ ĐŋĐ°Ņ€ĐžĐģа ĐžŅ‚ Đ˛Đ°ŅˆĐ¸Ņ PDF Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚." + }, + "compress": { + "tags": "shrink,reduce,optimize", + "title": "КоĐŧĐŋŅ€ĐĩŅĐ¸Ņ€Đ°ĐŊĐĩ", + "desc": "КоĐŧĐŋŅ€ĐĩŅĐ¸Ņ€Đ°ĐšŅ‚Đĩ PDF Ņ„Đ°ĐšĐģОвĐĩ, Са да ĐŊаĐŧаĐģĐ¸Ņ‚Đĩ Ņ€Đ°ĐˇĐŧĐĩŅ€Đ° ĐŊа Ņ„Đ°ĐšĐģа." + }, + "unlockPDFForms": { + "tags": "unlock,enable,edit", + "title": "Unlock PDF Forms", + "desc": "Remove read-only property of form fields in a PDF document." + }, + "changeMetadata": { + "tags": "edit,modify,update", + "title": "ĐŸŅ€ĐžĐŧŅĐŊа ĐŊа ĐŧĐĩŅ‚Đ°Đ´Đ°ĐŊĐŊи", + "desc": "ĐŸŅ€ĐžĐŧŅĐŊа/ĐŸŅ€ĐĩĐŧĐ°Ņ…Đ˛Đ°ĐŊĐĩ/Đ”ĐžĐąĐ°Đ˛ŅĐŊĐĩ ĐŊа ĐŧĐĩŅ‚Đ°Đ´Đ°ĐŊĐŊи ĐžŅ‚ PDF Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚" + }, + "ocr": { + "tags": "extract,scan", + "title": "OCR / ĐŸĐžŅ‡Đ¸ŅŅ‚Đ˛Đ°Ņ‰Đ¸ ҁĐēаĐŊĐ¸Ņ€Đ°ĐŊĐ¸Ņ", + "desc": "ĐŸĐžŅ‡Đ¸ŅŅ‚Đ˛Đ°, ҁĐēаĐŊĐ¸Ņ€Đ° и ĐžŅ‚ĐēŅ€Đ¸Đ˛Đ° Ņ‚ĐĩĐēҁ҂ ĐžŅ‚ Đ¸ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊĐ¸Ņ в PDF и ĐŗĐž Đ´ĐžĐąĐ°Đ˛Ņ ĐžŅ‚ĐŊОвО ĐēĐ°Ņ‚Đž Ņ‚ĐĩĐēҁ҂." + }, + "extractImages": { + "tags": "pull,save,export", + "title": "ИСвĐģĐ¸Ņ‡Đ°ĐŊĐĩ ĐŊа Đ¸ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊĐ¸Ņ", + "desc": "ИСвĐģĐ¸Ņ‡Đ° Đ˛ŅĐ¸Ņ‡Đēи Đ¸ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊĐ¸Ņ ĐžŅ‚ PDF и ĐŗĐ¸ СаĐŋĐ¸ŅĐ˛Đ° ĐēҊĐŧ Đ°Ņ€Ņ…Đ¸Đ˛" + }, + "scannerImageSplit": { + "tags": "detect,split,photos", + "title": "Detect & Split Scanned Photos", + "desc": "Detect and split scanned photos into separate pages" + }, + "sign": { + "tags": "signature,autograph", + "title": "ПодĐŋĐ¸ŅˆĐĩŅ‚Đĩ", + "desc": "Đ”ĐžĐąĐ°Đ˛Ņ ĐŋОдĐŋĐ¸Ņ ĐēҊĐŧ PDF ҇ҀĐĩС Ņ€Đ¸ŅŅƒĐŊĐēа, Ņ‚ĐĩĐēҁ҂ иĐģи Đ¸ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊиĐĩ" + }, + "flatten": { + "tags": "simplify,remove,interactive", + "title": "Đ˜ĐˇŅ€Đ°Đ˛ĐŊŅĐ˛Đ°ĐŊĐĩ", + "desc": "ĐŸŅ€ĐĩĐŧĐ°Ņ…ĐŊĐĩŅ‚Đĩ Đ˛ŅĐ¸Ņ‡Đēи иĐŊŅ‚ĐĩŅ€Đ°ĐēŅ‚Đ¸Đ˛ĐŊи ĐĩĐģĐĩĐŧĐĩĐŊŅ‚Đ¸ и Ņ„ĐžŅ€Đŧ҃ĐģŅŅ€Đ¸ ĐžŅ‚ PDF" + }, + "certSign": { + "tags": "authenticate,PEM,P12,official,encrypt,sign,certificate,PKCS12,JKS,server,manual,auto", + "title": "ПодĐŋĐ¸ŅˆĐĩŅ‚Đĩ ҁҊҁ ҁĐĩŅ€Ņ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ‚", + "desc": "ПодĐŋĐ¸ŅĐ˛Đ° PDF ҁҊҁ ҁĐĩŅ€Ņ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ‚/ĐēĐģŅŽŅ‡ (PEM/P12)" + }, + "repair": { + "tags": "fix,restore", + "title": "ПоĐŋŅ€Đ°Đ˛Đ¸", + "desc": "ОĐŋĐ¸Ņ‚Đ˛Đ° ҁĐĩ да ĐŋĐžĐŋŅ€Đ°Đ˛Đ¸ ĐŋĐžĐ˛Ņ€ĐĩĐ´ĐĩĐŊ PDF" + }, + "removeBlanks": { + "tags": "delete,clean,empty", + "title": "ĐŸŅ€ĐĩĐŧĐ°Ņ…Đ˛Đ°ĐŊĐĩ ĐŊа ĐŋŅ€Đ°ĐˇĐŊи ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ¸", + "desc": "ĐžŅ‚ĐēŅ€Đ¸Đ˛Đ° и ĐŋŅ€ĐĩĐŧĐ°Ņ…Đ˛Đ° ĐŋŅ€Đ°ĐˇĐŊи ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ¸ ĐžŅ‚ Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚" + }, + "removeAnnotations": { + "tags": "delete,clean,strip", + "title": "ĐŸŅ€ĐĩĐŧĐ°Ņ…Đ˛Đ°ĐŊĐĩ ĐŊа аĐŊĐžŅ‚Đ°Ņ†Đ¸Đ¸", + "desc": "ĐŸŅ€ĐĩĐŧĐ°Ņ…Đ˛Đ° Đ˛ŅĐ¸Ņ‡Đēи ĐēĐžĐŧĐĩĐŊŅ‚Đ°Ņ€Đ¸/аĐŊĐžŅ‚Đ°Ņ†Đ¸Đ¸ ĐžŅ‚ PDF" + }, + "compare": { + "tags": "difference", + "title": "ĐĄŅ€Đ°Đ˛ĐŊĐĩŅ‚Đĩ", + "desc": "ĐĄŅ€Đ°Đ˛ĐŊŅĐ˛Đ° и ĐŋĐžĐēаСва Ņ€Đ°ĐˇĐģиĐēĐ¸Ņ‚Đĩ ĐŧĐĩĐļĐ´Ņƒ 2 PDF Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ°" + }, + "removeCertSign": { + "tags": "remove,delete,unlock", + "title": "ĐŸŅ€ĐĩĐŧĐ°Ņ…Đ˛Đ°ĐŊĐĩ ĐŊа СĐŊаĐēа Са ҁĐĩŅ€Ņ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ‚", + "desc": "ĐŸŅ€ĐĩĐŧĐ°Ņ…Đ˛Đ°ĐŊĐĩ ĐŊа ĐŋОдĐŋĐ¸Ņ ĐŊа ҁĐĩŅ€Ņ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ‚ ĐžŅ‚ PDF" + }, + "pageLayout": { + "tags": "layout,arrange,combine", + "title": "ĐžŅ„ĐžŅ€ĐŧĐģĐĩĐŊиĐĩ ҁ ĐŊŅĐēĐžĐģĐēĐž ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ¸", + "desc": "ĐĄĐģĐĩĐšŅ‚Đĩ ĐŊŅĐēĐžĐģĐēĐž ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ¸ ĐžŅ‚ PDF Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚ в ĐĩĐ´ĐŊа ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ°" + }, + "bookletImposition": { + "tags": "booklet,print,binding", + "title": "Booklet Imposition", + "desc": "Create booklets with proper page ordering and multi-page layout for printing and binding" + }, + "scalePages": { + "tags": "resize,adjust,scale", + "title": "ĐšĐžŅ€Đ¸ĐŗĐ¸Ņ€Đ°ĐšŅ‚Đĩ Ņ€Đ°ĐˇĐŧĐĩŅ€Đ°/ĐŧĐ°Ņ‰Đ°ĐąĐ° ĐŊа ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ°Ņ‚Đ°", + "desc": "ĐŸŅ€ĐžĐŧŅĐŊа ĐŊа Ņ€Đ°ĐˇĐŧĐĩŅ€Đ°/ĐŧĐ°Ņ‰Đ°ĐąĐ° ĐŊа ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ° и/иĐģи ĐŊĐĩĐšĐŊĐžŅ‚Đž ŅŅŠĐ´ŅŠŅ€ĐļаĐŊиĐĩ." + }, + "addPageNumbers": { + "tags": "number,pagination,count", + "title": "Đ”ĐžĐąĐ°Đ˛ŅĐŊĐĩ ĐŊа ĐŊĐžĐŧĐĩŅ€Đ° ĐŊа ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ¸", + "desc": "ДобавĐĩŅ‚Đĩ ĐŊĐžĐŧĐĩŅ€Đ° ĐŊа ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ¸ в Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚ ĐŊа ĐžĐŋŅ€ĐĩĐ´ĐĩĐģĐĩĐŊĐž ĐŧŅŅŅ‚Đž" + }, + "autoRename": { + "tags": "auto-detect,header-based,organize,relabel", + "title": "Auto Rename PDF File", + "desc": "Auto renames a PDF file based on its detected header" + }, + "adjustContrast": { + "tags": "contrast,brightness,saturation", + "title": "ĐšĐžŅ€Đ¸ĐŗĐ¸Ņ€Đ°ĐŊĐĩ ĐŊа Ņ†Đ˛ĐĩŅ‚ĐžĐ˛Đĩ/ĐēĐžĐŊŅ‚Ņ€Đ°ŅŅ‚", + "desc": "ĐšĐžŅ€Đ¸ĐŗĐ¸Ņ€Đ°ĐŊĐĩ ĐŊа ĐēĐžĐŊŅ‚Ņ€Đ°ŅŅ‚Đ°, ĐŊĐ°ŅĐ¸Ņ‚ĐĩĐŊĐžŅŅ‚Ņ‚Đ° и ŅŅ€ĐēĐžŅŅ‚Ņ‚Đ° ĐŊа PDF" + }, + "crop": { + "tags": "trim,cut,resize", + "title": "Đ˜ĐˇŅ€ŅĐˇĐ˛Đ°ĐŊĐĩ ĐŊа PDF", + "desc": "Đ˜ĐˇŅ€ĐĩĐļĐĩŅ‚Đĩ PDF, Са да ĐŊаĐŧаĐģĐ¸Ņ‚Đĩ Ņ€Đ°ĐˇĐŧĐĩŅ€Đ° Đŧ҃ (ĐŋĐžĐ´Đ´ŅŠŅ€Đļа Ņ‚ĐĩĐēҁ҂!)" + }, + "autoSplitPDF": { + "tags": "auto,split,QR", + "title": "ĐĐ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐž Ņ€Đ°ĐˇĐ´ĐĩĐģŅĐŊĐĩ ĐŊа ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ¸", + "desc": "ĐĐ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐž Ņ€Đ°ĐˇĐ´ĐĩĐģŅĐŊĐĩ ĐŊа ҁĐēаĐŊĐ¸Ņ€Đ°ĐŊ PDF Ņ„Đ°ĐšĐģ ҁ QR ĐēОд Са Ņ€Đ°ĐˇĐ´ĐĩĐģŅĐŊĐĩ ĐŊа Ņ„Đ¸ĐˇĐ¸Ņ‡ĐĩҁĐēи ҁĐēаĐŊĐ¸Ņ€Đ°ĐŊи ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ¸" + }, + "sanitize": { + "tags": "clean,purge,remove", + "title": "Sanitise", + "desc": "Remove potentially harmful elements from PDF files" + }, + "getPdfInfo": { + "tags": "info,metadata,details", + "title": "ВзĐĩĐŧĐĩŅ‚Đĩ ĐĻĐ¯Đ›ĐĐĸА иĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸Ņ ĐžŅ‚ PDF", + "desc": "ВзиĐŧа Đ˛ŅŅĐēа Đ˛ŅŠĐˇĐŧĐžĐļĐŊа иĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸Ņ ĐžŅ‚ PDF Ņ„Đ°ĐšĐģОвĐĩ" + }, + "pdfToSinglePage": { + "tags": "combine,merge,single", + "title": "PDF ĐēҊĐŧ ĐĩĐ´ĐŊа ĐŗĐžĐģŅĐŧа ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ°", + "desc": "ОбĐĩдиĐŊŅĐ˛Đ° Đ˛ŅĐ¸Ņ‡Đēи PDF ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ¸ в ĐĩĐ´ĐŊа ĐŗĐžĐģŅĐŧа ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ°" + }, + "showJS": { + "tags": "javascript,code,script", + "title": "ПоĐēаСваĐŊĐĩ ĐŊа Javascript", + "desc": "ĐĸŅŠŅ€ŅĐ¸ и ĐŋĐžĐēаСва Đ˛ŅĐĩĐēи JS, иĐŊĐļĐĩĐēŅ‚Đ¸Ņ€Đ°ĐŊ в PDF" + }, + "redact": { + "tags": "censor,blackout,hide", + "title": "Đ ŅŠŅ‡ĐŊĐž Ņ€ĐĩдаĐēŅ‚Đ¸Ņ€Đ°ĐŊĐĩ", + "desc": "Đ ĐĩдаĐēŅ‚Đ¸Ņ€Đ°ĐŊĐĩ ĐŊа PDF Ņ„Đ°ĐšĐģ Đ˛ŅŠĐˇ ĐžŅĐŊОва ĐŊа Đ¸ĐˇĐąŅ€Đ°ĐŊ Ņ‚ĐĩĐēҁ҂, ĐŊĐ°Ņ€Đ¸ŅŅƒĐ˛Đ°ĐŊи Ņ„ĐžŅ€Đŧи и/иĐģи Đ¸ĐˇĐąŅ€Đ°ĐŊа ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ°(и)" + }, + "splitBySections": { + "tags": "split,sections,divide", + "title": "Split PDF by Sections", + "desc": "Divide each page of a PDF into smaller horizontal and vertical sections" + }, + "addStamp": { + "tags": "stamp,mark,seal", + "title": "Add Stamp to PDF", + "desc": "Add text or add image stamps at set locations" + }, + "removeImage": { + "tags": "remove,delete,clean", + "title": "ĐŸŅ€ĐĩĐŧĐ°Ņ…Đ˛Đ°ĐŊĐĩ ĐŊа Đ¸ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊиĐĩ", + "desc": "ĐŸŅ€ĐĩĐŧĐ°Ņ…ĐŊĐĩŅ‚Đĩ Đ¸ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊиĐĩŅ‚Đž ĐžŅ‚ PDF, Са да ĐŊаĐŧаĐģĐ¸Ņ‚Đĩ Ņ€Đ°ĐˇĐŧĐĩŅ€Đ° ĐŊа Ņ„Đ°ĐšĐģа" + }, + "splitByChapters": { + "tags": "split,chapters,structure", + "title": "РаСдĐĩĐģĐĩŅ‚Đĩ PDF ĐŋĐž ĐŗĐģави", + "desc": "РаСдĐĩĐģĐĩŅ‚Đĩ PDF ĐŊа ĐŧĐŊĐžĐļĐĩŅŅ‚Đ˛Đž Ņ„Đ°ĐšĐģОвĐĩ Đ˛ŅŠĐˇ ĐžŅĐŊОва ĐŊа ĐŊĐĩĐŗĐžĐ˛Đ°Ņ‚Đ° ŅŅ‚Ņ€ŅƒĐēŅ‚ŅƒŅ€Đ° ĐŊа ĐŗĐģави." + }, + "validateSignature": { + "tags": "validate,verify,certificate", + "title": "ВаĐģĐ¸Đ´Đ¸Ņ€Đ°ĐŊĐĩ ĐŊа PDF ĐŋОдĐŋĐ¸Ņ", + "desc": "ĐŸŅ€ĐžĐ˛ĐĩŅ€Đēа ĐŊа Ņ†Đ¸Ņ„Ņ€ĐžĐ˛Đ¸ ĐŋОдĐŋĐ¸ŅĐ¸ и ҁĐĩŅ€Ņ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ‚Đ¸ в PDF Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ¸" + }, + "swagger": { + "tags": "API,documentation,test", + "title": "API Documentation", + "desc": "View API documentation and test endpoints" + }, + "scannerEffect": { + "tags": "scan,simulate,create", + "title": "Scanner Effect", + "desc": "Create a PDF that looks like it was scanned" + }, + "editTableOfContents": { + "tags": "bookmarks,contents,edit", + "title": "Edit Table of Contents", + "desc": "Add or edit bookmarks and table of contents in PDF documents" + }, + "manageCertificates": { + "tags": "certificates,import,export", + "title": "Manage Certificates", + "desc": "Import, export, or delete digital certificate files used for signing PDFs." + }, + "read": { + "tags": "view,open,display", + "title": "Read", + "desc": "View and annotate PDFs. Highlight text, draw, or insert comments for review and collaboration." + }, + "reorganizePages": { + "tags": "rearrange,reorder,organize", + "title": "Reorganize Pages", + "desc": "Rearrange, duplicate, or delete PDF pages with visual drag-and-drop control." + }, + "extractPages": { + "tags": "pull,select,copy", + "title": "ИСвĐģĐ¸Ņ‡Đ°ĐŊĐĩ ĐŊа ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ¸", + "desc": "Extract specific pages from a PDF document" + }, + "removePages": { + "tags": "delete,extract,exclude", + "title": "ĐŸŅ€ĐĩĐŧĐ°Ņ…Đ˛Đ°ĐŊĐĩ", + "desc": "Đ˜ĐˇŅ‚Ņ€Đ¸ĐšŅ‚Đĩ ĐŊĐĩĐļĐĩĐģаĐŊĐ¸Ņ‚Đĩ ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ¸ ĐžŅ‚ Đ˛Đ°ŅˆĐ¸Ņ PDF Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚." + }, + "autoSizeSplitPDF": { + "tags": "auto,split,size", + "title": "ĐĐ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐž Ņ€Đ°ĐˇĐ´ĐĩĐģŅĐŊĐĩ ĐŋĐž Ņ€Đ°ĐˇĐŧĐĩŅ€/ĐąŅ€ĐžĐš", + "desc": "РаСдĐĩĐģĐĩŅ‚Đĩ ĐĩдиĐŊ PDF ĐŊа ĐŧĐŊĐžĐļĐĩŅŅ‚Đ˛Đž Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ¸ Đ˛ŅŠĐˇ ĐžŅĐŊОва ĐŊа Ņ€Đ°ĐˇĐŧĐĩŅ€, ĐąŅ€ĐžĐš ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ¸ иĐģи ĐąŅ€ĐžĐš Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ¸" + }, + "replaceColor": { + "title": "Replace & Invert Colour", + "desc": "Replace or invert colours in PDF documents" + }, + "devApi": { + "tags": "API,development,documentation", + "title": "API", + "desc": "Link to API documentation" + }, + "devFolderScanning": { + "tags": "automation,folder,scanning", + "title": "Automated Folder Scanning", + "desc": "Link to automated folder scanning guide" + }, + "devSsoGuide": { + "title": "SSO Guide", + "desc": "Link to SSO guide" + }, + "devAirgapped": { + "title": "Air-gapped Setup", + "desc": "Link to air-gapped setup guide" + }, + "addPassword": { + "title": "ДобавĐĩŅ‚Đĩ ĐŋĐ°Ņ€ĐžĐģа", + "desc": "Đ¨Đ¸Ņ„Ņ€ĐžĐ˛Đ°ĐšŅ‚Đĩ Đ˛Đ°ŅˆĐ¸Ņ PDF Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚ ҁ ĐŋĐ°Ņ€ĐžĐģа." + }, + "changePermissions": { + "title": "ĐŸŅ€ĐžĐŧŅĐŊа ĐŊа ĐŋŅ€Đ°Đ˛Đ°Ņ‚Đ°", + "desc": "Change document restrictions and permissions" + }, + "automate": { + "tags": "workflow,sequence,automation", + "title": "Automate", + "desc": "Build multi-step workflows by chaining together PDF actions. Ideal for recurring tasks." + }, + "overlay-pdfs": { + "desc": "ĐĐ°ŅĐģĐ°ĐŗĐ˛Đ° PDF Ņ„Đ°ĐšĐģОвĐĩ Đ˛ŅŠŅ€Ņ…Ņƒ Đ´Ņ€ŅƒĐŗ PDF", + "title": "ĐĐ°ŅĐģĐ°ĐŗĐ˛Đ°ĐŊĐĩ PDF-и" + }, "imageToPDF": { "title": "Đ˜ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊиĐĩ ĐēҊĐŧ PDF", "desc": "ĐŸŅ€ĐĩĐžĐąŅ€Đ°ĐˇŅƒĐ˛Đ°ĐŊĐĩ ĐŊа Đ¸ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊиĐĩ (PNG, JPEG, GIF) ĐēҊĐŧ PDF." @@ -355,18 +786,6 @@ "title": "PDF ĐēҊĐŧ Đ¸ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊиĐĩ", "desc": "ĐŸŅ€ĐĩĐžĐąŅ€Đ°ĐˇŅƒĐ˛Đ°ĐŊĐĩ ĐŊа PDF ĐēҊĐŧ Đ¸ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊиĐĩ. (PNG, JPEG, GIF)" }, - "pdfOrganiser": { - "title": "ĐžŅ€ĐŗĐ°ĐŊĐ¸ĐˇĐ¸Ņ€Đ°ĐŊĐĩ", - "desc": "ĐŸŅ€ĐĩĐŧĐ°Ņ…Đ˛Đ°ĐŊĐĩ/ĐŋŅ€ĐĩĐŊĐ°Ņ€ĐĩĐļдаĐŊĐĩ ĐŊа ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ¸ ĐēҊĐŧ ĐŋŅ€ĐžĐ¸ĐˇĐ˛ĐžĐģĐĩĐŊ Ņ€ĐĩĐ´" - }, - "addImage": { - "title": "Đ”ĐžĐąĐ°Đ˛ŅĐŊĐĩ ĐŊа Đ¸ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊиĐĩ", - "desc": "Đ”ĐžĐąĐ°Đ˛Ņ Đ¸ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊиĐĩ ĐēҊĐŧ СададĐĩĐŊĐž ĐŧŅŅŅ‚Đž ĐēҊĐŧ PDF Ņ„Đ°ĐšĐģа" - }, - "watermark": { - "title": "Đ”ĐžĐąĐ°Đ˛ŅĐŊĐĩ ĐŊа вОдĐĩĐŊ СĐŊаĐē", - "desc": "ДобавĐĩŅ‚Đĩ ĐŋĐĩŅ€ŅĐžĐŊаĐģĐ¸ĐˇĐ¸Ņ€Đ°ĐŊ вОдĐĩĐŊ СĐŊаĐē ĐēҊĐŧ Đ˛Đ°ŅˆĐ¸Ņ PDF Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚." - }, "permissions": { "title": "ĐŸŅ€ĐžĐŧŅĐŊа ĐŊа ĐŋŅ€Đ°Đ˛Đ°Ņ‚Đ°", "desc": "ĐŸŅ€ĐžĐŧĐĩĐŊĐĩŅ‚Đĩ ĐŋŅ€Đ°Đ˛Đ°Ņ‚Đ° ĐŊа Đ˛Đ°ŅˆĐ¸Ņ PDF Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚" @@ -375,38 +794,10 @@ "title": "ĐŸŅ€ĐĩĐŧĐ°Ņ…Đ˛Đ°ĐŊĐĩ", "desc": "Đ˜ĐˇŅ‚Ņ€Đ¸ĐšŅ‚Đĩ ĐŊĐĩĐļĐĩĐģаĐŊĐ¸Ņ‚Đĩ ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ¸ ĐžŅ‚ Đ˛Đ°ŅˆĐ¸Ņ PDF Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚." }, - "addPassword": { - "title": "ДобавĐĩŅ‚Đĩ ĐŋĐ°Ņ€ĐžĐģа", - "desc": "Đ¨Đ¸Ņ„Ņ€ĐžĐ˛Đ°ĐšŅ‚Đĩ Đ˛Đ°ŅˆĐ¸Ņ PDF Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚ ҁ ĐŋĐ°Ņ€ĐžĐģа." - }, - "removePassword": { - "title": "ĐŸŅ€ĐĩĐŧĐ°Ņ…Đ˛Đ°ĐŊĐĩ ĐŊа ĐŋĐ°Ņ€ĐžĐģа", - "desc": "ĐŸŅ€ĐĩĐŧĐ°Ņ…ĐŊĐĩŅ‚Đĩ ĐˇĐ°Ņ‰Đ¸Ņ‚Đ°Ņ‚Đ° ҁ ĐŋĐ°Ņ€ĐžĐģа ĐžŅ‚ Đ˛Đ°ŅˆĐ¸Ņ PDF Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚." - }, - "compress": { - "title": "КоĐŧĐŋŅ€ĐĩŅĐ¸Ņ€Đ°ĐŊĐĩ", - "desc": "КоĐŧĐŋŅ€ĐĩŅĐ¸Ņ€Đ°ĐšŅ‚Đĩ PDF Ņ„Đ°ĐšĐģОвĐĩ, Са да ĐŊаĐŧаĐģĐ¸Ņ‚Đĩ Ņ€Đ°ĐˇĐŧĐĩŅ€Đ° ĐŊа Ņ„Đ°ĐšĐģа." - }, - "unlockPDFForms": { - "title": "Unlock PDF Forms", - "desc": "Remove read-only property of form fields in a PDF document." - }, - "changeMetadata": { - "title": "ĐŸŅ€ĐžĐŧŅĐŊа ĐŊа ĐŧĐĩŅ‚Đ°Đ´Đ°ĐŊĐŊи", - "desc": "ĐŸŅ€ĐžĐŧŅĐŊа/ĐŸŅ€ĐĩĐŧĐ°Ņ…Đ˛Đ°ĐŊĐĩ/Đ”ĐžĐąĐ°Đ˛ŅĐŊĐĩ ĐŊа ĐŧĐĩŅ‚Đ°Đ´Đ°ĐŊĐŊи ĐžŅ‚ PDF Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚" - }, "fileToPDF": { "title": "ĐŸŅ€ĐĩĐžĐąŅ€Đ°ĐˇŅƒĐ˛Đ°ĐŊĐĩ ĐŊа Ņ„Đ°ĐšĐģ ĐēҊĐŧ PDF", "desc": "ĐŸŅ€ĐĩĐžĐąŅ€Đ°ĐˇŅƒĐ˛Đ°ĐŊĐĩ ĐŋĐžŅ‡Ņ‚Đ¸ Đ˛ŅĐĩĐēи Ņ„Đ°ĐšĐģ ĐēҊĐŧ PDF (DOCX, PNG, XLS, PPT, TXT и Đ´Ņ€ŅƒĐŗĐ¸)" }, - "ocr": { - "title": "OCR / ĐŸĐžŅ‡Đ¸ŅŅ‚Đ˛Đ°Ņ‰Đ¸ ҁĐēаĐŊĐ¸Ņ€Đ°ĐŊĐ¸Ņ", - "desc": "ĐŸĐžŅ‡Đ¸ŅŅ‚Đ˛Đ°, ҁĐēаĐŊĐ¸Ņ€Đ° и ĐžŅ‚ĐēŅ€Đ¸Đ˛Đ° Ņ‚ĐĩĐēҁ҂ ĐžŅ‚ Đ¸ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊĐ¸Ņ в PDF и ĐŗĐž Đ´ĐžĐąĐ°Đ˛Ņ ĐžŅ‚ĐŊОвО ĐēĐ°Ņ‚Đž Ņ‚ĐĩĐēҁ҂." - }, - "extractImages": { - "title": "ИСвĐģĐ¸Ņ‡Đ°ĐŊĐĩ ĐŊа Đ¸ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊĐ¸Ņ", - "desc": "ИСвĐģĐ¸Ņ‡Đ° Đ˛ŅĐ¸Ņ‡Đēи Đ¸ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊĐ¸Ņ ĐžŅ‚ PDF и ĐŗĐ¸ СаĐŋĐ¸ŅĐ˛Đ° ĐēҊĐŧ Đ°Ņ€Ņ…Đ¸Đ˛" - }, "pdfToPDFA": { "title": "PDF ĐēҊĐŧ PDF/A", "desc": "КоĐŊвĐĩŅ€Ņ‚Đ¸Ņ€Đ°ĐšŅ‚Đĩ PDF ĐēҊĐŧ PDF/A Са Đ´ŅŠĐģĐŗĐžŅŅ€ĐžŅ‡ĐŊĐž ŅŅŠŅ…Ņ€Đ°ĐŊĐĩĐŊиĐĩ" @@ -435,70 +826,14 @@ "title": "ĐžŅ‚ĐēŅ€Đ¸Đ˛Đ°ĐŊĐĩ/РаСдĐĩĐģŅĐŊĐĩ ĐŊа ҁĐēаĐŊĐ¸Ņ€Đ°ĐŊи ҁĐŊиĐŧĐēи", "desc": "РаСдĐĩĐģŅ ĐŧĐŊĐžĐļĐĩŅŅ‚Đ˛Đž ҁĐŊиĐŧĐēи ĐžŅ‚ ĐĩĐ´ĐŊа ҁĐŊиĐŧĐēа/PDF" }, - "sign": { - "title": "ПодĐŋĐ¸ŅˆĐĩŅ‚Đĩ", - "desc": "Đ”ĐžĐąĐ°Đ˛Ņ ĐŋОдĐŋĐ¸Ņ ĐēҊĐŧ PDF ҇ҀĐĩС Ņ€Đ¸ŅŅƒĐŊĐēа, Ņ‚ĐĩĐēҁ҂ иĐģи Đ¸ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊиĐĩ" - }, - "flatten": { - "title": "Đ˜ĐˇŅ€Đ°Đ˛ĐŊŅĐ˛Đ°ĐŊĐĩ", - "desc": "ĐŸŅ€ĐĩĐŧĐ°Ņ…ĐŊĐĩŅ‚Đĩ Đ˛ŅĐ¸Ņ‡Đēи иĐŊŅ‚ĐĩŅ€Đ°ĐēŅ‚Đ¸Đ˛ĐŊи ĐĩĐģĐĩĐŧĐĩĐŊŅ‚Đ¸ и Ņ„ĐžŅ€Đŧ҃ĐģŅŅ€Đ¸ ĐžŅ‚ PDF" - }, - "repair": { - "title": "ПоĐŋŅ€Đ°Đ˛Đ¸", - "desc": "ОĐŋĐ¸Ņ‚Đ˛Đ° ҁĐĩ да ĐŋĐžĐŋŅ€Đ°Đ˛Đ¸ ĐŋĐžĐ˛Ņ€ĐĩĐ´ĐĩĐŊ PDF" - }, - "removeBlanks": { - "title": "ĐŸŅ€ĐĩĐŧĐ°Ņ…Đ˛Đ°ĐŊĐĩ ĐŊа ĐŋŅ€Đ°ĐˇĐŊи ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ¸", - "desc": "ĐžŅ‚ĐēŅ€Đ¸Đ˛Đ° и ĐŋŅ€ĐĩĐŧĐ°Ņ…Đ˛Đ° ĐŋŅ€Đ°ĐˇĐŊи ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ¸ ĐžŅ‚ Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚" - }, - "removeAnnotations": { - "title": "ĐŸŅ€ĐĩĐŧĐ°Ņ…Đ˛Đ°ĐŊĐĩ ĐŊа аĐŊĐžŅ‚Đ°Ņ†Đ¸Đ¸", - "desc": "ĐŸŅ€ĐĩĐŧĐ°Ņ…Đ˛Đ° Đ˛ŅĐ¸Ņ‡Đēи ĐēĐžĐŧĐĩĐŊŅ‚Đ°Ņ€Đ¸/аĐŊĐžŅ‚Đ°Ņ†Đ¸Đ¸ ĐžŅ‚ PDF" - }, - "compare": { - "title": "ĐĄŅ€Đ°Đ˛ĐŊĐĩŅ‚Đĩ", - "desc": "ĐĄŅ€Đ°Đ˛ĐŊŅĐ˛Đ° и ĐŋĐžĐēаСва Ņ€Đ°ĐˇĐģиĐēĐ¸Ņ‚Đĩ ĐŧĐĩĐļĐ´Ņƒ 2 PDF Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ°" - }, - "certSign": { - "title": "ПодĐŋĐ¸ŅˆĐĩŅ‚Đĩ ҁҊҁ ҁĐĩŅ€Ņ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ‚", - "desc": "ПодĐŋĐ¸ŅĐ˛Đ° PDF ҁҊҁ ҁĐĩŅ€Ņ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ‚/ĐēĐģŅŽŅ‡ (PEM/P12)" - }, - "removeCertSign": { - "title": "ĐŸŅ€ĐĩĐŧĐ°Ņ…Đ˛Đ°ĐŊĐĩ ĐŊа СĐŊаĐēа Са ҁĐĩŅ€Ņ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ‚", - "desc": "ĐŸŅ€ĐĩĐŧĐ°Ņ…Đ˛Đ°ĐŊĐĩ ĐŊа ĐŋОдĐŋĐ¸Ņ ĐŊа ҁĐĩŅ€Ņ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ‚ ĐžŅ‚ PDF" - }, - "pageLayout": { - "title": "ĐžŅ„ĐžŅ€ĐŧĐģĐĩĐŊиĐĩ ҁ ĐŊŅĐēĐžĐģĐēĐž ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ¸", - "desc": "ĐĄĐģĐĩĐšŅ‚Đĩ ĐŊŅĐēĐžĐģĐēĐž ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ¸ ĐžŅ‚ PDF Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚ в ĐĩĐ´ĐŊа ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ°" - }, - "scalePages": { - "title": "ĐšĐžŅ€Đ¸ĐŗĐ¸Ņ€Đ°ĐšŅ‚Đĩ Ņ€Đ°ĐˇĐŧĐĩŅ€Đ°/ĐŧĐ°Ņ‰Đ°ĐąĐ° ĐŊа ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ°Ņ‚Đ°", - "desc": "ĐŸŅ€ĐžĐŧŅĐŊа ĐŊа Ņ€Đ°ĐˇĐŧĐĩŅ€Đ°/ĐŧĐ°Ņ‰Đ°ĐąĐ° ĐŊа ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ° и/иĐģи ĐŊĐĩĐšĐŊĐžŅ‚Đž ŅŅŠĐ´ŅŠŅ€ĐļаĐŊиĐĩ." - }, "pipeline": { "title": "Pipeline (Đ Đ°ĐˇŅˆĐ¸Ņ€ĐĩĐŊĐž)", "desc": "ИСĐŋҊĐģĐŊŅĐ˛Đ°ĐšŅ‚Đĩ ĐŧĐŊĐžĐļĐĩŅŅ‚Đ˛Đž Đ´ĐĩĐšŅŅ‚Đ˛Đ¸Ņ Đ˛ŅŠŅ€Ņ…Ņƒ PDF Ņ„Đ°ĐšĐģОвĐĩ ҇ҀĐĩС Đ´ĐĩŅ„Đ¸ĐŊĐ¸Ņ€Đ°ĐŊĐĩ ĐŊа ĐēĐžĐŊвĐĩĐšĐĩŅ€ĐŊи ҁĐēŅ€Đ¸ĐŋŅ‚ĐžĐ˛Đĩ" }, - "addPageNumbers": { - "title": "Đ”ĐžĐąĐ°Đ˛ŅĐŊĐĩ ĐŊа ĐŊĐžĐŧĐĩŅ€Đ° ĐŊа ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ¸", - "desc": "ДобавĐĩŅ‚Đĩ ĐŊĐžĐŧĐĩŅ€Đ° ĐŊа ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ¸ в Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚ ĐŊа ĐžĐŋŅ€ĐĩĐ´ĐĩĐģĐĩĐŊĐž ĐŧŅŅŅ‚Đž" - }, "auto-rename": { "title": "ĐĐ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐž ĐŋŅ€ĐĩиĐŧĐĩĐŊŅƒĐ˛Đ°ĐŊĐĩ ĐŊа PDF Ņ„Đ°ĐšĐģ", "desc": "ĐĐ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐž ĐŋŅ€ĐĩиĐŧĐĩĐŊŅƒĐ˛Đ° PDF Ņ„Đ°ĐšĐģ Đ˛ŅŠĐˇ ĐžŅĐŊОва ĐŊа ĐžŅ‚ĐēŅ€Đ¸Ņ‚Đ°Ņ‚Đ° Đŧ҃ ĐˇĐ°ĐŗĐģавĐēа" }, - "adjustContrast": { - "title": "ĐšĐžŅ€Đ¸ĐŗĐ¸Ņ€Đ°ĐŊĐĩ ĐŊа Ņ†Đ˛ĐĩŅ‚ĐžĐ˛Đĩ/ĐēĐžĐŊŅ‚Ņ€Đ°ŅŅ‚", - "desc": "ĐšĐžŅ€Đ¸ĐŗĐ¸Ņ€Đ°ĐŊĐĩ ĐŊа ĐēĐžĐŊŅ‚Ņ€Đ°ŅŅ‚Đ°, ĐŊĐ°ŅĐ¸Ņ‚ĐĩĐŊĐžŅŅ‚Ņ‚Đ° и ŅŅ€ĐēĐžŅŅ‚Ņ‚Đ° ĐŊа PDF" - }, - "crop": { - "title": "Đ˜ĐˇŅ€ŅĐˇĐ˛Đ°ĐŊĐĩ ĐŊа PDF", - "desc": "Đ˜ĐˇŅ€ĐĩĐļĐĩŅ‚Đĩ PDF, Са да ĐŊаĐŧаĐģĐ¸Ņ‚Đĩ Ņ€Đ°ĐˇĐŧĐĩŅ€Đ° Đŧ҃ (ĐŋĐžĐ´Đ´ŅŠŅ€Đļа Ņ‚ĐĩĐēҁ҂!)" - }, - "autoSplitPDF": { - "title": "ĐĐ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐž Ņ€Đ°ĐˇĐ´ĐĩĐģŅĐŊĐĩ ĐŊа ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ¸", - "desc": "ĐĐ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐž Ņ€Đ°ĐˇĐ´ĐĩĐģŅĐŊĐĩ ĐŊа ҁĐēаĐŊĐ¸Ņ€Đ°ĐŊ PDF Ņ„Đ°ĐšĐģ ҁ QR ĐēОд Са Ņ€Đ°ĐˇĐ´ĐĩĐģŅĐŊĐĩ ĐŊа Ņ„Đ¸ĐˇĐ¸Ņ‡ĐĩҁĐēи ҁĐēаĐŊĐ¸Ņ€Đ°ĐŊи ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ¸" - }, "sanitizePDF": { "title": "ОбĐĩĐˇĐˇĐ°Ņ€Đ°ĐˇŅĐ˛Đ°ĐŊĐĩ", "desc": "ĐŸŅ€ĐĩĐŧĐ°Ņ…Đ˛Đ°ĐŊĐĩ ĐŊа ҁĐēŅ€Đ¸ĐŋŅ‚ĐžĐ˛Đĩ и Đ´Ņ€ŅƒĐŗĐ¸ ĐĩĐģĐĩĐŧĐĩĐŊŅ‚Đ¸ ĐžŅ‚ PDF Ņ„Đ°ĐšĐģОвĐĩ" @@ -519,30 +854,14 @@ "title": "PDF ĐēҊĐŧ Markdown", "desc": "ĐŸŅ€ĐĩĐžĐąŅ€Đ°ĐˇŅƒĐ˛Đ° Đ˛ŅĐĩĐēи PDF Ņ„Đ°ĐšĐģ в Markdown" }, - "getPdfInfo": { - "title": "ВзĐĩĐŧĐĩŅ‚Đĩ ĐĻĐ¯Đ›ĐĐĸА иĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸Ņ ĐžŅ‚ PDF", - "desc": "ВзиĐŧа Đ˛ŅŅĐēа Đ˛ŅŠĐˇĐŧĐžĐļĐŊа иĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸Ņ ĐžŅ‚ PDF Ņ„Đ°ĐšĐģОвĐĩ" - }, "pageExtracter": { "title": "ИСвĐģĐ¸Ņ‡Đ°ĐŊĐĩ ĐŊа ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ°(и)", "desc": "ИСвĐģĐ¸Ņ‡Đ° Đ¸ĐˇĐąŅ€Đ°ĐŊи ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ¸ ĐžŅ‚ PDF" }, - "pdfToSinglePage": { - "title": "PDF ĐēҊĐŧ ĐĩĐ´ĐŊа ĐŗĐžĐģŅĐŧа ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ°", - "desc": "ОбĐĩдиĐŊŅĐ˛Đ° Đ˛ŅĐ¸Ņ‡Đēи PDF ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ¸ в ĐĩĐ´ĐŊа ĐŗĐžĐģŅĐŧа ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ°" - }, - "showJS": { - "title": "ПоĐēаСваĐŊĐĩ ĐŊа Javascript", - "desc": "ĐĸŅŠŅ€ŅĐ¸ и ĐŋĐžĐēаСва Đ˛ŅĐĩĐēи JS, иĐŊĐļĐĩĐēŅ‚Đ¸Ņ€Đ°ĐŊ в PDF" - }, "autoRedact": { "title": "ĐĐ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐž Ņ€ĐĩдаĐēŅ‚Đ¸Ņ€Đ°ĐŊĐĩ", "desc": "ĐĐ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐž Ņ€ĐĩдаĐēŅ‚Đ¸Ņ€Đ° (ĐˇĐ°Ņ‡ĐĩŅ€ĐŊŅĐ˛Đ°) Ņ‚ĐĩĐēҁ҂ в PDF Đ˛ŅŠĐˇ ĐžŅĐŊОва ĐŊа Đ˛ŅŠĐ˛ĐĩĐ´ĐĩĐŊ Ņ‚ĐĩĐēҁ҂" }, - "redact": { - "title": "Đ ŅŠŅ‡ĐŊĐž Ņ€ĐĩдаĐēŅ‚Đ¸Ņ€Đ°ĐŊĐĩ", - "desc": "Đ ĐĩдаĐēŅ‚Đ¸Ņ€Đ°ĐŊĐĩ ĐŊа PDF Ņ„Đ°ĐšĐģ Đ˛ŅŠĐˇ ĐžŅĐŊОва ĐŊа Đ¸ĐˇĐąŅ€Đ°ĐŊ Ņ‚ĐĩĐēҁ҂, ĐŊĐ°Ņ€Đ¸ŅŅƒĐ˛Đ°ĐŊи Ņ„ĐžŅ€Đŧи и/иĐģи Đ¸ĐˇĐąŅ€Đ°ĐŊа ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ°(и)" - }, "PDFToCSV": { "title": "PDF ĐēҊĐŧ CSV", "desc": "ИСвĐģĐ¸Ņ‡Đ° Ņ‚Đ°ĐąĐģĐ¸Ņ†Đ¸ ĐžŅ‚ PDF, ĐēĐ°Ņ‚Đž ĐŗĐ¸ ĐēĐžĐŊвĐĩŅ€Ņ‚Đ¸Ņ€Đ° в CSV" @@ -551,10 +870,6 @@ "title": "ĐĐ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐž Ņ€Đ°ĐˇĐ´ĐĩĐģŅĐŊĐĩ ĐŋĐž Ņ€Đ°ĐˇĐŧĐĩŅ€/ĐąŅ€ĐžĐš", "desc": "РаСдĐĩĐģĐĩŅ‚Đĩ ĐĩдиĐŊ PDF ĐŊа ĐŧĐŊĐžĐļĐĩŅŅ‚Đ˛Đž Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ¸ Đ˛ŅŠĐˇ ĐžŅĐŊОва ĐŊа Ņ€Đ°ĐˇĐŧĐĩŅ€, ĐąŅ€ĐžĐš ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ¸ иĐģи ĐąŅ€ĐžĐš Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ¸" }, - "overlay-pdfs": { - "title": "ĐĐ°ŅĐģĐ°ĐŗĐ˛Đ°ĐŊĐĩ PDF-и", - "desc": "ĐĐ°ŅĐģĐ°ĐŗĐ˛Đ° PDF Ņ„Đ°ĐšĐģОвĐĩ Đ˛ŅŠŅ€Ņ…Ņƒ Đ´Ņ€ŅƒĐŗ PDF" - }, "split-by-sections": { "title": "РаСдĐĩĐģŅĐŊĐĩ ĐŊа PDF ĐŋĐž ҁĐĩĐēŅ†Đ¸Đ¸", "desc": "РаСдĐĩĐģĐĩŅ‚Đĩ Đ˛ŅŅĐēа ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ° ĐžŅ‚ PDF ĐŊа ĐŋĐž-ĐŧаĐģĐēи Ņ…ĐžŅ€Đ¸ĐˇĐžĐŊŅ‚Đ°ĐģĐŊи и вĐĩŅ€Ņ‚Đ¸ĐēаĐģĐŊи ҁĐĩĐēŅ†Đ¸Đ¸" @@ -563,43 +878,17 @@ "title": "Đ”ĐžĐąĐ°Đ˛ŅĐŊĐĩ ĐŊа ĐŋĐĩŅ‡Đ°Ņ‚ ĐēҊĐŧ PDF", "desc": "ДобавĐĩŅ‚Đĩ Ņ‚ĐĩĐēҁ҂ иĐģи дОйавĐĩŅ‚Đĩ ĐŋĐĩŅ‡Đ°Ņ‚Đ¸ ҁ Đ¸ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊĐ¸Ņ ĐŊа ĐžĐŋŅ€ĐĩĐ´ĐĩĐģĐĩĐŊи ĐŧĐĩŅŅ‚Đ°" }, - "removeImage": { - "title": "ĐŸŅ€ĐĩĐŧĐ°Ņ…Đ˛Đ°ĐŊĐĩ ĐŊа Đ¸ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊиĐĩ", - "desc": "ĐŸŅ€ĐĩĐŧĐ°Ņ…ĐŊĐĩŅ‚Đĩ Đ¸ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊиĐĩŅ‚Đž ĐžŅ‚ PDF, Са да ĐŊаĐŧаĐģĐ¸Ņ‚Đĩ Ņ€Đ°ĐˇĐŧĐĩŅ€Đ° ĐŊа Ņ„Đ°ĐšĐģа" - }, - "splitByChapters": { - "title": "РаСдĐĩĐģĐĩŅ‚Đĩ PDF ĐŋĐž ĐŗĐģави", - "desc": "РаСдĐĩĐģĐĩŅ‚Đĩ PDF ĐŊа ĐŧĐŊĐžĐļĐĩŅŅ‚Đ˛Đž Ņ„Đ°ĐšĐģОвĐĩ Đ˛ŅŠĐˇ ĐžŅĐŊОва ĐŊа ĐŊĐĩĐŗĐžĐ˛Đ°Ņ‚Đ° ŅŅ‚Ņ€ŅƒĐēŅ‚ŅƒŅ€Đ° ĐŊа ĐŗĐģави." - }, - "validateSignature": { - "title": "ВаĐģĐ¸Đ´Đ¸Ņ€Đ°ĐŊĐĩ ĐŊа PDF ĐŋОдĐŋĐ¸Ņ", - "desc": "ĐŸŅ€ĐžĐ˛ĐĩŅ€Đēа ĐŊа Ņ†Đ¸Ņ„Ņ€ĐžĐ˛Đ¸ ĐŋОдĐŋĐ¸ŅĐ¸ и ҁĐĩŅ€Ņ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ‚Đ¸ в PDF Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ¸" - }, "replace-color": { "title": "ЗаĐŧŅĐŊа и ĐžĐąŅ€ŅŠŅ‰Đ°ĐŊĐĩ ĐŊа Ņ†Đ˛ŅŅ‚", "desc": "ЗаĐŧĐĩĐŊĐĩŅ‚Đĩ Ņ†Đ˛ĐĩŅ‚Đ° ĐŊа Ņ‚ĐĩĐēŅŅ‚Đ° и Ņ„ĐžĐŊа в PDF и ĐžĐąŅŠŅ€ĐŊĐĩŅ‚Đĩ ĐŋҊĐģĐŊĐ¸Ņ Ņ†Đ˛ŅŅ‚ ĐŊа PDF, Са да ĐŊаĐŧаĐģĐ¸Ņ‚Đĩ Ņ€Đ°ĐˇĐŧĐĩŅ€Đ° ĐŊа Ņ„Đ°ĐšĐģа" }, - "convert": { - "title": "ĐŸŅ€ĐĩĐžĐąŅ€Đ°ĐˇŅƒĐ˛Đ°ĐŊĐĩ" - }, "attachments": { "title": "Add attachments" }, - "extractPages": { - "title": "ИСвĐģĐ¸Ņ‡Đ°ĐŊĐĩ ĐŊа ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ¸" - }, - "removePages": { - "title": "ĐŸŅ€ĐĩĐŧĐ°Ņ…Đ˛Đ°ĐŊĐĩ", - "desc": "Đ˜ĐˇŅ‚Ņ€Đ¸ĐšŅ‚Đĩ ĐŊĐĩĐļĐĩĐģаĐŊĐ¸Ņ‚Đĩ ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ¸ ĐžŅ‚ Đ˛Đ°ŅˆĐ¸Ņ PDF Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚." - }, "removeImagePdf": { "title": "ĐŸŅ€ĐĩĐŧĐ°Ņ…Đ˛Đ°ĐŊĐĩ ĐŊа Đ¸ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊиĐĩ", "desc": "ĐŸŅ€ĐĩĐŧĐ°Ņ…ĐŊĐĩŅ‚Đĩ Đ¸ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊиĐĩŅ‚Đž ĐžŅ‚ PDF, Са да ĐŊаĐŧаĐģĐ¸Ņ‚Đĩ Ņ€Đ°ĐˇĐŧĐĩŅ€Đ° ĐŊа Ņ„Đ°ĐšĐģа" }, - "autoSizeSplitPDF": { - "title": "ĐĐ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐž Ņ€Đ°ĐˇĐ´ĐĩĐģŅĐŊĐĩ ĐŋĐž Ņ€Đ°ĐˇĐŧĐĩŅ€/ĐąŅ€ĐžĐš", - "desc": "РаСдĐĩĐģĐĩŅ‚Đĩ ĐĩдиĐŊ PDF ĐŊа ĐŧĐŊĐžĐļĐĩŅŅ‚Đ˛Đž Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ¸ Đ˛ŅŠĐˇ ĐžŅĐŊОва ĐŊа Ņ€Đ°ĐˇĐŧĐĩŅ€, ĐąŅ€ĐžĐš ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ¸ иĐģи ĐąŅ€ĐžĐš Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ¸" - }, "adjust-contrast": { "title": "ĐšĐžŅ€Đ¸ĐŗĐ¸Ņ€Đ°ĐŊĐĩ ĐŊа Ņ†Đ˛ĐĩŅ‚ĐžĐ˛Đĩ/ĐēĐžĐŊŅ‚Ņ€Đ°ŅŅ‚", "desc": "ĐšĐžŅ€Đ¸ĐŗĐ¸Ņ€Đ°ĐŊĐĩ ĐŊа ĐēĐžĐŊŅ‚Ņ€Đ°ŅŅ‚Đ°, ĐŊĐ°ŅĐ¸Ņ‚ĐĩĐŊĐžŅŅ‚Ņ‚Đ° и ŅŅ€ĐēĐžŅŅ‚Ņ‚Đ° ĐŊа PDF" @@ -607,11 +896,12 @@ "replaceColorPdf": { "title": "ЗаĐŧŅĐŊа и ĐžĐąŅ€ŅŠŅ‰Đ°ĐŊĐĩ ĐŊа Ņ†Đ˛ŅŅ‚", "desc": "ЗаĐŧĐĩĐŊĐĩŅ‚Đĩ Ņ†Đ˛ĐĩŅ‚Đ° ĐŊа Ņ‚ĐĩĐēŅŅ‚Đ° и Ņ„ĐžĐŊа в PDF и ĐžĐąŅŠŅ€ĐŊĐĩŅ‚Đĩ ĐŋҊĐģĐŊĐ¸Ņ Ņ†Đ˛ŅŅ‚ ĐŊа PDF, Са да ĐŊаĐŧаĐģĐ¸Ņ‚Đĩ Ņ€Đ°ĐˇĐŧĐĩŅ€Đ° ĐŊа Ņ„Đ°ĐšĐģа" - }, - "changePermissions": { - "title": "ĐŸŅ€ĐžĐŧŅĐŊа ĐŊа ĐŋŅ€Đ°Đ˛Đ°Ņ‚Đ°" } }, + "landing": { + "addFiles": "Add Files", + "uploadFromComputer": "Upload from computer" + }, "viewPdf": { "tags": "ĐŋŅ€ĐĩĐŗĐģĐĩĐ´,҇ĐĩŅ‚ĐĩĐŊĐĩ,аĐŊĐžŅ‚Đ¸Ņ€Đ°ĐŊĐĩ,Ņ‚ĐĩĐēҁ҂,Đ¸ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊиĐĩ", "title": "ĐŸŅ€ĐĩĐŗĐģĐĩĐ´/Đ ĐĩдаĐēŅ‚Đ¸Ņ€Đ°ĐŊĐĩ ĐŊа PDF", @@ -645,17 +935,39 @@ "merge": { "tags": "ҁĐģиваĐŊĐĩ,ĐžĐŋĐĩŅ€Đ°Ņ†Đ¸Đ¸ ĐŊа ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ¸,адĐŧиĐŊĐ¸ŅŅ‚Ņ€Đ°Ņ‚ĐžŅ€ŅĐēа СОĐŊа,ĐžŅ‚ ŅŅ‚Ņ€Đ°ĐŊа ĐŊа ŅŅŠŅ€Đ˛ŅŠŅ€Đ°", "title": "ОбĐĩдиĐŊŅĐ˛Đ°ĐŊĐĩ", + "removeDigitalSignature": { + "label": "Remove digital signature in the merged file?", + "tooltip": { + "title": "Remove Digital Signature", + "description": "Digital signatures will be invalidated when merging files. Check this to remove them from the final merged PDF." + } + }, + "generateTableOfContents": { + "label": "Generate table of contents in the merged file?", + "tooltip": { + "title": "Generate Table of Contents", + "description": "Automatically creates a clickable table of contents in the merged PDF based on the original file names and page numbers." + } + }, + "submit": "ОбĐĩдиĐŊŅĐ˛Đ°ĐŊĐĩ", + "sortBy": { + "description": "Files will be merged in the order they're selected. Drag to reorder or sort below.", + "label": "Sort By", + "filename": "ИĐŧĐĩ ĐŊа Ņ„Đ°ĐšĐģ", + "dateModified": "Date Modified", + "ascending": "Ascending", + "descending": "Descending", + "sort": "Sort" + }, + "error": { + "failed": "An error occurred while merging the PDFs." + }, "header": "ОбĐĩдиĐŊŅĐ˛Đ°ĐŊĐĩ ĐŊа ĐŧĐŊĐžĐļĐĩŅŅ‚Đ˛Đž PDF Ņ„Đ°ĐšĐģОвĐĩ (2+)", "sortByName": "ĐĄĐžŅ€Ņ‚Đ¸Ņ€Đ°ĐŊĐĩ ĐŋĐž иĐŧĐĩ", "sortByDate": "ĐĄĐžŅ€Ņ‚Đ¸Ņ€Đ°ĐŊĐĩ ĐŋĐž Đ´Đ°Ņ‚Đ°", - "removeCertSign": "ĐŸŅ€ĐĩĐŧĐ°Ņ…Đ˛Đ°ĐŊĐĩ ĐŊа Ņ†Đ¸Ņ„Ņ€ĐžĐ˛Đ¸Ņ ĐŋОдĐŋĐ¸Ņ в ОйĐĩдиĐŊĐĩĐŊĐ¸Ņ Ņ„Đ°ĐšĐģ?", - "submit": "ОбĐĩдиĐŊŅĐ˛Đ°ĐŊĐĩ", - "sortBy": { - "filename": "ИĐŧĐĩ ĐŊа Ņ„Đ°ĐšĐģ" - } + "removeCertSign": "ĐŸŅ€ĐĩĐŧĐ°Ņ…Đ˛Đ°ĐŊĐĩ ĐŊа Ņ†Đ¸Ņ„Ņ€ĐžĐ˛Đ¸Ņ ĐŋОдĐŋĐ¸Ņ в ОйĐĩдиĐŊĐĩĐŊĐ¸Ņ Ņ„Đ°ĐšĐģ?" }, "split": { - "tags": "ОĐŋĐĩŅ€Đ°Ņ†Đ¸Đ¸ ĐŊа ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ°Ņ‚Đ°,Ņ€Đ°ĐˇĐ´ĐĩĐģŅĐŊĐĩ,МĐŊĐžĐļĐĩŅŅ‚Đ˛Đž ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ¸,Đ¸ĐˇŅ€ŅĐˇĐ˛Đ°ĐŊĐĩ,ŅŅŠŅ€Đ˛ŅŠŅ€ĐŊа ŅŅ‚Ņ€Đ°ĐŊа", "title": "РаСдĐĩĐģŅĐŊĐĩ ĐŊа PDF", "header": "РаСдĐĩĐģŅĐŊĐĩ ĐŊа PDF", "desc": { @@ -671,25 +983,249 @@ "splitPages": "Đ’ŅŠĐ˛ĐĩĐ´ĐĩŅ‚Đĩ ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ¸ Са Ņ€Đ°ĐˇĐ´ĐĩĐģŅĐŊĐĩ:", "submit": "РаСдĐĩĐģŅĐŊĐĩ", "steps": { + "chooseMethod": "Choose Method", "settings": "ĐĐ°ŅŅ‚Ņ€ĐžĐšĐēи" }, + "settings": { + "selectMethodFirst": "Please select a split method first" + }, + "error": { + "failed": "An error occurred while splitting the PDF." + }, + "method": { + "label": "Choose split method", + "placeholder": "Select how to split the PDF" + }, "methods": { + "prefix": { + "splitAt": "Split at", + "splitBy": "Split by" + }, + "byPages": { + "name": "Page Numbers", + "desc": "Extract specific pages (1,3,5-10)", + "tooltip": "Enter page numbers separated by commas or ranges with hyphens" + }, + "bySections": { + "name": "Sections", + "desc": "Divide pages into grid sections", + "tooltip": "Split each page into horizontal and vertical sections" + }, "bySize": { - "name": "РаСĐŧĐĩŅ€ ĐŊа Ņ„Đ°ĐšĐģа" + "name": "РаСĐŧĐĩŅ€ ĐŊа Ņ„Đ°ĐšĐģа", + "desc": "Limit maximum file size", + "tooltip": "Specify maximum file size (e.g. 10MB, 500KB)" + }, + "byPageCount": { + "name": "Page Count", + "desc": "Fixed pages per file", + "tooltip": "Enter the number of pages for each split file" + }, + "byDocCount": { + "name": "Document Count", + "desc": "Create specific number of files", + "tooltip": "Enter how many files you want to create" + }, + "byChapters": { + "name": "Chapters", + "desc": "Split at bookmark boundaries", + "tooltip": "Uses PDF bookmarks to determine split points" + }, + "byPageDivider": { + "name": "Page Divider", + "desc": "Auto-split with divider sheets", + "tooltip": "Use QR code divider sheets between documents when scanning" } }, "value": { "fileSize": { - "label": "РаСĐŧĐĩŅ€ ĐŊа Ņ„Đ°ĐšĐģа" + "label": "РаСĐŧĐĩŅ€ ĐŊа Ņ„Đ°ĐšĐģа", + "placeholder": "e.g. 10MB, 500KB" + }, + "pageCount": { + "label": "Pages per File", + "placeholder": "e.g. 5, 10" + }, + "docCount": { + "label": "Number of Files", + "placeholder": "e.g. 3, 5" } - } + }, + "tooltip": { + "header": { + "title": "Split Methods Overview" + }, + "byPages": { + "title": "Split at Page Numbers", + "text": "Split your PDF at specific page numbers. Using 'n' splits after page n. Using 'n-m' splits before page n and after page m.", + "bullet1": "Single split points: 3,7 (splits after pages 3 and 7)", + "bullet2": "Range split points: 3-8 (splits before page 3 and after page 8)", + "bullet3": "Mixed: 2,5-10,15 (splits after page 2, before page 5, after page 10, and after page 15)" + }, + "bySections": { + "title": "Split by Grid Sections", + "text": "Divide each page into a grid of sections. Useful for splitting documents with multiple columns or extracting specific areas.", + "bullet1": "Horizontal: Number of rows to create", + "bullet2": "Vertical: Number of columns to create", + "bullet3": "Merge: Combine all sections into one PDF" + }, + "bySize": { + "title": "Split by File Size", + "text": "Create multiple PDFs that don't exceed a specified file size. Ideal for file size limitations or email attachments.", + "bullet1": "Use MB for larger files (e.g., 10MB)", + "bullet2": "Use KB for smaller files (e.g., 500KB)", + "bullet3": "System will split at page boundaries" + }, + "byCount": { + "title": "Split by Count", + "text": "Create multiple PDFs with a specific number of pages or documents each.", + "bullet1": "Page Count: Fixed number of pages per file", + "bullet2": "Document Count: Fixed number of output files", + "bullet3": "Useful for batch processing workflows" + }, + "byChapters": { + "title": "Split by Chapters", + "text": "Use PDF bookmarks to automatically split at chapter boundaries. Requires PDFs with bookmark structure.", + "bullet1": "Bookmark Level: Which level to split on (1=top level)", + "bullet2": "Include Metadata: Preserve document properties", + "bullet3": "Allow Duplicates: Handle repeated bookmark names" + }, + "byDocCount": { + "bullet1": "Enter the number of output files you want", + "bullet2": "Pages are distributed as evenly as possible", + "bullet3": "Useful when you need a specific number of files", + "text": "Create a specific number of output files by evenly distributing pages across them.", + "title": "Split by Document Count" + }, + "byPageCount": { + "bullet1": "Enter the number of pages per output file", + "bullet2": "Last file may have fewer pages if not evenly divisible", + "bullet3": "Useful for batch processing workflows", + "text": "Create multiple PDFs with a specific number of pages each. Perfect for creating uniform document chunks.", + "title": "Split by Page Count" + }, + "byPageDivider": { + "bullet1": "Print divider sheets from the download link", + "bullet2": "Insert divider sheets between your documents", + "bullet3": "Scan all documents together as one PDF", + "bullet4": "Upload - divider pages are automatically detected and removed", + "bullet5": "Enable Duplex Mode if scanning both sides of divider sheets", + "text": "Automatically split scanned documents using physical divider sheets with QR codes. Perfect for processing multiple documents scanned together.", + "title": "Split by Page Divider" + } + }, + "methodSelection": { + "tooltip": { + "bullet1": "Click on a method card to select it", + "bullet2": "Hover over each card to see a quick description", + "bullet3": "The settings step will appear after you select a method", + "bullet4": "You can change methods at any time before processing", + "header": { + "text": "Choose how you want to split your PDF document. Each method is optimized for different use cases and document types.", + "title": "Split Method Selection" + }, + "title": "Choose Your Split Method" + } + }, + "selectMethod": "Select a split method", + "tags": "ОĐŋĐĩŅ€Đ°Ņ†Đ¸Đ¸ ĐŊа ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ°Ņ‚Đ°,Ņ€Đ°ĐˇĐ´ĐĩĐģŅĐŊĐĩ,МĐŊĐžĐļĐĩŅŅ‚Đ˛Đž ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ¸,Đ¸ĐˇŅ€ŅĐˇĐ˛Đ°ĐŊĐĩ,ŅŅŠŅ€Đ˛ŅŠŅ€ĐŊа ŅŅ‚Ņ€Đ°ĐŊа" }, "rotate": { - "tags": "ĐžŅ‚ ŅŅ‚Ņ€Đ°ĐŊĐ°Ņ‚Đ° ĐŊа ŅŅŠŅ€Đ˛ŅŠŅ€Đ°", "title": "Đ—Đ°Đ˛ŅŠŅ€Ņ‚Đ°ĐŊĐĩ ĐŊа PDF", + "submit": "Đ—Đ°Đ˛ŅŠŅ€Ņ‚Đ°ĐŊĐĩ", + "selectRotation": "Select Rotation Angle (Clockwise)", + "error": { + "failed": "An error occurred while rotating the PDF." + }, + "preview": { + "title": "Rotation Preview" + }, + "rotateLeft": "Rotate Anticlockwise", + "rotateRight": "Rotate Clockwise", + "tooltip": { + "header": { + "title": "Rotate Settings Overview" + }, + "description": { + "text": "Rotate your PDF pages clockwise or anticlockwise in 90-degree increments. All pages in the PDF will be rotated. The preview shows how your document will look after rotation." + }, + "controls": { + "title": "Controls", + "text": "Use the rotation buttons to adjust orientation. Left button rotates anticlockwise, right button rotates clockwise. Each click rotates by 90 degrees." + } + }, + "tags": "ĐžŅ‚ ŅŅ‚Ņ€Đ°ĐŊĐ°Ņ‚Đ° ĐŊа ŅŅŠŅ€Đ˛ŅŠŅ€Đ°", "header": "Đ—Đ°Đ˛ŅŠŅ€Ņ‚Đ°ĐŊĐĩ ĐŊа PDF", - "selectAngle": "ИСйĐĩŅ€ĐĩŅ‚Đĩ ŅŠĐŗŅŠĐģ ĐŊа Đ˛ŅŠŅ€Ņ‚ĐĩĐŊĐĩ (ĐēŅ€Đ°Ņ‚ĐŊĐž ĐŊа 90 ĐŗŅ€Đ°Đ´ŅƒŅĐ°):", - "submit": "Đ—Đ°Đ˛ŅŠŅ€Ņ‚Đ°ĐŊĐĩ" + "selectAngle": "ИСйĐĩŅ€ĐĩŅ‚Đĩ ŅŠĐŗŅŠĐģ ĐŊа Đ˛ŅŠŅ€Ņ‚ĐĩĐŊĐĩ (ĐēŅ€Đ°Ņ‚ĐŊĐž ĐŊа 90 ĐŗŅ€Đ°Đ´ŅƒŅĐ°):" + }, + "convert": { + "title": "ĐŸŅ€ĐĩĐžĐąŅ€Đ°ĐˇŅƒĐ˛Đ°ĐŊĐĩ", + "desc": "Convert files between different formats", + "files": "Files", + "selectFilesPlaceholder": "Select files in the main view to get started", + "settings": "ĐĐ°ŅŅ‚Ņ€ĐžĐšĐēи", + "conversionCompleted": "Conversion completed", + "results": "Results", + "defaultFilename": "converted_file", + "conversionResults": "Conversion Results", + "convertFrom": "Convert from", + "convertTo": "Convert to", + "sourceFormatPlaceholder": "Source format", + "targetFormatPlaceholder": "Target format", + "selectSourceFormatFirst": "Select a source format first", + "outputOptions": "Output Options", + "pdfOptions": "PDF Options", + "imageOptions": "Image Options", + "colorType": "Colour Type", + "color": "ĐĻĐ˛ŅŅ‚", + "greyscale": "ĐĄĐēаĐģа ĐŊа ŅĐ¸Đ˛ĐžŅ‚Đž", + "blackwhite": "Black & White", + "dpi": "DPI", + "output": "Output", + "single": "Single", + "multiple": "Multiple", + "fitOption": "Fit Option", + "maintainAspectRatio": "Maintain Aspect Ratio", + "fitDocumentToPage": "Fit Document to Page", + "fillPage": "ПоĐŋҊĐģваĐŊĐĩ ĐŊа ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ°", + "autoRotate": "Auto Rotate", + "autoRotateDescription": "Automatically rotate images to better fit the PDF page", + "combineImages": "Combine Images", + "combineImagesDescription": "Combine all images into one PDF, or create separate PDFs for each image", + "webOptions": "Web to PDF Options", + "zoomLevel": "Zoom Level", + "emailOptions": "Email to PDF Options", + "includeAttachments": "Include email attachments", + "maxAttachmentSize": "Maximum attachment size (MB)", + "includeAllRecipients": "Include CC and BCC recipients in header", + "downloadHtml": "Download HTML intermediate file instead of PDF", + "pdfaOptions": "PDF/A Options", + "outputFormat": "Output Format", + "pdfaNote": "PDF/A-1b is more compatible, PDF/A-2b supports more features.", + "pdfaDigitalSignatureWarning": "PDF Ņ„Đ°ĐšĐģŅŠŅ‚ ŅŅŠĐ´ŅŠŅ€Đļа Ņ†Đ¸Ņ„Ņ€ĐžĐ˛ ĐŋОдĐŋĐ¸Ņ. ĐĸОва ҉Đĩ ĐąŅŠĐ´Đĩ ĐŋŅ€ĐĩĐŧĐ°Ņ…ĐŊĐ°Ņ‚Đž в ҁĐģĐĩĐ´Đ˛Đ°Ņ‰Đ°Ņ‚Đ° ŅŅ‚ŅŠĐŋĐēа.", + "fileFormat": "File Format", + "wordDoc": "Word Document", + "wordDocExt": "Word Document (.docx)", + "odtExt": "OpenDocument Text (.odt)", + "pptExt": "PowerPoint (.pptx)", + "odpExt": "OpenDocument Presentation (.odp)", + "txtExt": "Plain Text (.txt)", + "rtfExt": "Rich Text Format (.rtf)", + "selectedFiles": "Selected files", + "noFileSelected": "No file selected. Use the file panel to add files.", + "convertFiles": "Convert Files", + "converting": "Converting...", + "downloadConverted": "Download Converted File", + "errorNoFiles": "Please select at least one file to convert.", + "errorNoFormat": "Please select both source and target formats.", + "errorNotSupported": "Conversion from {{from}} to {{to}} is not supported.", + "images": "Images", + "officeDocs": "Office Documents (Word, Excel, PowerPoint)", + "imagesExt": "Images (JPG, PNG, etc.)", + "markdown": "Markdown", + "textRtf": "Text/RTF", + "grayscale": "ĐĄĐēаĐģа ĐŊа ŅĐ¸Đ˛ĐžŅ‚Đž", + "errorConversion": "An error occurred while converting the file." }, "imageToPdf": { "tags": "ĐŋŅ€ĐĩĐžĐąŅ€Đ°ĐˇŅƒĐ˛Đ°ĐŊĐĩ,img,jpg,Đ¸ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊиĐĩ,ҁĐŊиĐŧĐēа" @@ -727,7 +1263,33 @@ "8": "ĐŸŅ€ĐĩĐŧĐ°Ņ…Đ˛Đ°ĐŊĐĩ ĐŊа ĐŋĐžŅĐģĐĩĐ´ĐŊĐ¸Ņ", "9": "ĐŸŅ€ĐĩĐŧĐ°Ņ…Đ˛Đ°ĐŊĐĩ ĐŊа ĐŋŅŠŅ€Đ˛Đ¸Ņ и ĐŋĐžŅĐģĐĩĐ´ĐŊĐ¸Ņ", "10": "ОбĐĩдиĐŊŅĐ˛Đ°ĐŊĐĩ ĐŊа ҇ĐĩŅ‚ĐŊĐž и ĐŊĐĩ҇ĐĩŅ‚ĐŊĐž", - "11": "Đ”ŅƒĐąĐģĐ¸Ņ€Đ°ĐŊĐĩ ĐŊа Đ˛ŅĐ¸Ņ‡Đēи ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ¸" + "11": "Đ”ŅƒĐąĐģĐ¸Ņ€Đ°ĐŊĐĩ ĐŊа Đ˛ŅĐ¸Ņ‡Đēи ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ¸", + "desc": { + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, â€Ļ).", + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, â€Ļ).", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimized for binding on the side)." + } + }, + "desc": { + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, â€Ļ).", + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, â€Ļ).", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimised for binding on the side).", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document." }, "placeholder": "(ĐŊаĐŋŅ€. 1,3,2 иĐģи 4-8,2,10-12 иĐģи 2n-1)" }, @@ -739,9 +1301,198 @@ "upload": "Đ”ĐžĐąĐ°Đ˛ŅĐŊĐĩ ĐŊа Đ¸ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊиĐĩ", "submit": "Đ”ĐžĐąĐ°Đ˛ŅĐŊĐĩ ĐŊа Đ¸ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊиĐĩ" }, + "attachments": { + "tags": "embed,attach,file,attachment,attachments", + "title": "Add attachments", + "header": "Add attachments", + "add": "Add Attachment", + "remove": "Remove Attachment", + "embed": "Embed Attachment", + "submit": "Add attachments" + }, "watermark": { - "tags": "ĐĸĐĩĐēҁ҂,ĐŋĐžĐ˛Ņ‚Đ°Ņ€ŅŅ‰ ҁĐĩ,ĐĩŅ‚Đ¸ĐēĐĩŅ‚,ŅĐžĐąŅŅ‚Đ˛ĐĩĐŊĐž,Đ°Đ˛Ņ‚ĐžŅ€ŅĐēĐž ĐŋŅ€Đ°Đ˛Đž,Ņ‚ŅŠŅ€ĐŗĐžĐ˛ŅĐēа ĐŧĐ°Ņ€Đēа,img,jpg,Đ¸ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊиĐĩ,ҁĐŊиĐŧĐēа", "title": "Đ”ĐžĐąĐ°Đ˛ŅĐŊĐĩ ĐŊа вОдĐĩĐŊ СĐŊаĐē", + "desc": "Add text or image watermarks to PDF files", + "completed": "Watermark added", + "submit": "Đ”ĐžĐąĐ°Đ˛ŅĐŊĐĩ ĐŊа вОдĐĩĐŊ СĐŊаĐē", + "filenamePrefix": "watermarked", + "error": { + "failed": "An error occurred while adding watermark to the PDF." + }, + "watermarkType": { + "text": "ĐĸĐĩĐēҁ҂", + "image": "Image" + }, + "settings": { + "type": "Watermark Type", + "text": { + "label": "Watermark Text", + "placeholder": "Enter watermark text" + }, + "image": { + "label": "Watermark Image", + "choose": "Choose Image", + "selected": "Selected: {{filename}}" + }, + "fontSize": "РаСĐŧĐĩŅ€ ĐŊа ŅˆŅ€Đ¸Ņ„Ņ‚", + "size": "Size", + "alphabet": "Font/Language", + "color": "Watermark Colour", + "rotation": "Rotation (degrees)", + "opacity": "Opacity (%)", + "spacing": { + "horizontal": "Horizontal Spacing", + "vertical": "Vertical Spacing", + "height": "Height Spacing", + "width": "Width Spacing" + }, + "convertToImage": "Flatten PDF pages to images" + }, + "alphabet": { + "roman": "Roman/Latin", + "arabic": "Arabic", + "japanese": "Japanese", + "korean": "Korean", + "chinese": "Chinese", + "thai": "Thai" + }, + "steps": { + "type": "Watermark Type", + "wording": "Wording", + "textStyle": "Style", + "formatting": "Formatting", + "file": "Watermark File" + }, + "results": { + "title": "Watermark Results" + }, + "tooltip": { + "language": { + "title": "Language Support", + "text": "Choose the appropriate language setting to ensure proper font rendering for your text." + }, + "appearance": { + "title": "Appearance Settings", + "text": "Control how your watermark looks and blends with the document.", + "bullet1": "Rotation: -360° to 360° for angled watermarks", + "bullet2": "Opacity: 0-100% for transparency control", + "bullet3": "Lower opacity creates subtle watermarks" + }, + "spacing": { + "title": "Spacing Control", + "text": "Adjust the spacing between repeated watermarks across the page.", + "bullet1": "Width spacing: Horizontal distance between watermarks", + "bullet2": "Height spacing: Vertical distance between watermarks", + "bullet3": "Higher values create more spread out patterns" + }, + "type": { + "header": { + "title": "Watermark Type Selection" + }, + "description": { + "title": "Choose Your Watermark", + "text": "Select between text or image watermarks based on your needs." + }, + "text": { + "title": "Text Watermarks", + "text": "Perfect for adding copyright notices, company names, or confidentiality labels. Supports multiple languages and custom colours.", + "bullet1": "Customisable fonts and languages", + "bullet2": "Adjustable colours and transparency", + "bullet3": "Ideal for legal or branding text" + }, + "image": { + "title": "Image Watermarks", + "text": "Use logos, stamps, or any image as a watermark. Great for branding and visual identification.", + "bullet1": "Upload any image format", + "bullet2": "Maintains image quality", + "bullet3": "Perfect for logos and stamps" + } + }, + "wording": { + "header": { + "title": "Text Content" + }, + "text": { + "title": "Watermark Text", + "text": "Enter the text that will appear as your watermark across the document.", + "bullet1": "Keep it concise for better readability", + "bullet2": "Common examples: 'CONFIDENTIAL', 'DRAFT', company name", + "bullet3": "Emoji characters are not supported and will be filtered out" + } + }, + "textStyle": { + "header": { + "title": "Text Style" + }, + "color": { + "title": "Colour Selection", + "text": "Choose a colour that provides good contrast with your document content.", + "bullet1": "Light grey (#d3d3d3) for subtle watermarks", + "bullet2": "Black or dark colours for high contrast", + "bullet3": "Custom colours for branding purposes" + }, + "language": { + "title": "Language Support", + "text": "Choose the appropriate language setting to ensure proper font rendering." + } + }, + "file": { + "header": { + "title": "Image Upload" + }, + "upload": { + "title": "Image Selection", + "text": "Upload an image file to use as your watermark.", + "bullet1": "Supports common formats: PNG, JPG, GIF, BMP", + "bullet2": "PNG with transparency works best", + "bullet3": "Higher resolution images maintain quality better" + }, + "recommendations": { + "title": "Best Practices", + "text": "Tips for optimal image watermark results.", + "bullet1": "Use logos or stamps with transparent backgrounds", + "bullet2": "Simple designs work better than complex images", + "bullet3": "Consider the final document size when choosing resolution" + } + }, + "formatting": { + "header": { + "title": "Formatting & Layout" + }, + "size": { + "title": "Size Control", + "text": "Adjust the size of your watermark (text or image).", + "bullet1": "Larger sizes create more prominent watermarks" + }, + "appearance": { + "title": "Appearance Settings", + "text": "Control how your watermark looks and blends with the document.", + "bullet1": "Rotation: -360° to 360° for angled watermarks", + "bullet2": "Opacity: 0-100% for transparency control", + "bullet3": "Lower opacity creates subtle watermarks" + }, + "spacing": { + "title": "Spacing Control", + "text": "Adjust the spacing between repeated watermarks across the page.", + "bullet1": "Horizontal spacing: Distance between watermarks left to right", + "bullet2": "Vertical spacing: Distance between watermarks top to bottom", + "bullet3": "Higher values create more spread out patterns" + }, + "security": { + "title": "Security Option", + "text": "Convert the final PDF to an image-based format for enhanced security.", + "bullet1": "Prevents text selection and copying", + "bullet2": "Makes watermarks harder to remove", + "bullet3": "Results in larger file sizes", + "bullet4": "Best for sensitive or copyrighted content" + } + } + }, + "type": { + "1": "ĐĸĐĩĐēҁ҂", + "2": "Đ˜ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊиĐĩ" + }, + "tags": "ĐĸĐĩĐēҁ҂,ĐŋĐžĐ˛Ņ‚Đ°Ņ€ŅŅ‰ ҁĐĩ,ĐĩŅ‚Đ¸ĐēĐĩŅ‚,ŅĐžĐąŅŅ‚Đ˛ĐĩĐŊĐž,Đ°Đ˛Ņ‚ĐžŅ€ŅĐēĐž ĐŋŅ€Đ°Đ˛Đž,Ņ‚ŅŠŅ€ĐŗĐžĐ˛ŅĐēа ĐŧĐ°Ņ€Đēа,img,jpg,Đ¸ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊиĐĩ,ҁĐŊиĐŧĐēа", "header": "Đ”ĐžĐąĐ°Đ˛ŅĐŊĐĩ ĐŊа вОдĐĩĐŊ СĐŊаĐē", "customColor": "ПĐĩŅ€ŅĐžĐŊаĐģĐ¸ĐˇĐ¸Ņ€Đ°ĐŊ Ņ†Đ˛ŅŅ‚ ĐŊа Ņ‚ĐĩĐēŅŅ‚Đ°", "selectText": { @@ -755,17 +1506,6 @@ "8": "ĐĸиĐŋ вОдĐĩĐŊ СĐŊаĐē:", "9": "Đ˜ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊиĐĩ Са вОдĐĩĐŊ СĐŊаĐē:", "10": "КоĐŊвĐĩŅ€Ņ‚Đ¸Ņ€Đ°ĐšŅ‚Đĩ PDF в PDF-Đ¸ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊиĐĩ" - }, - "submit": "Đ”ĐžĐąĐ°Đ˛ŅĐŊĐĩ ĐŊа вОдĐĩĐŊ СĐŊаĐē", - "type": { - "1": "ĐĸĐĩĐēҁ҂", - "2": "Đ˜ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊиĐĩ" - }, - "watermarkType": { - "text": "ĐĸĐĩĐēҁ҂" - }, - "settings": { - "fontSize": "РаСĐŧĐĩŅ€ ĐŊа ŅˆŅ€Đ¸Ņ„Ņ‚" } }, "permissions": { @@ -790,50 +1530,201 @@ "removePages": { "tags": "ĐŸŅ€ĐĩĐŧĐ°Ņ…Đ˛Đ°ĐŊĐĩ ĐŊа ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ¸,Đ¸ĐˇŅ‚Ņ€Đ¸Đ˛Đ°ĐŊĐĩ ĐŊа ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ¸", "title": "ĐŸŅ€ĐĩĐŧĐ°Ņ…Đ˛Đ°ĐŊĐĩ", + "pageNumbers": { + "label": "Pages to Remove", + "placeholder": "e.g., 1,3,5-8,10", + "error": "Invalid page number format. Use numbers, ranges (1-5), or mathematical expressions (2n+1)" + }, + "filenamePrefix": "pages_removed", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "settings": { + "title": "Settings" + }, + "tooltip": { + "header": { + "title": "Remove Pages Settings" + }, + "pageNumbers": { + "title": "Page Selection", + "text": "Specify which pages to remove from your PDF. You can select individual pages, ranges, or use mathematical expressions.", + "bullet1": "Individual pages: 1,3,5 (removes pages 1, 3, and 5)", + "bullet2": "Page ranges: 1-5,10-15 (removes pages 1-5 and 10-15)", + "bullet3": "Mathematical: 2n+1 (removes odd pages)", + "bullet4": "Open ranges: 5- (removes from page 5 to end)" + }, + "examples": { + "title": "Common Examples", + "text": "Here are some common page selection patterns:", + "bullet1": "Remove first page: 1", + "bullet2": "Remove last 3 pages: -3", + "bullet3": "Remove every other page: 2n", + "bullet4": "Remove specific scattered pages: 1,5,10,15" + }, + "safety": { + "title": "Safety Tips", + "text": "Important considerations when removing pages:", + "bullet1": "Always preview your selection before processing", + "bullet2": "Keep a backup of your original file", + "bullet3": "Page numbers start from 1, not 0", + "bullet4": "Invalid page numbers will be ignored" + } + }, + "error": { + "failed": "An error occurred whilst removing pages." + }, + "results": { + "title": "Page Removal Results" + }, "submit": "ĐŸŅ€ĐĩĐŧĐ°Ņ…Đ˛Đ°ĐŊĐĩ" }, - "addPassword": { - "tags": "ŅĐ¸ĐŗŅƒŅ€ĐĩĐŊ,ŅĐ¸ĐŗŅƒŅ€ĐŊĐžŅŅ‚", - "title": "Đ”ĐžĐąĐ°Đ˛ŅĐŊĐĩ ĐŊа ĐŋĐ°Ņ€ĐžĐģа", - "header": "Đ”ĐžĐąĐ°Đ˛ŅĐŊĐĩ ĐŊа ĐŋĐ°Ņ€ĐžĐģа (Đ¨Đ¸Ņ„Ņ€ĐžĐ˛Đ°ĐŊĐĩ)", - "selectText": { - "1": "ИСйĐĩŅ€ĐĩŅ‚Đĩ PDF, ĐēĐžĐšŅ‚Đž да ŅˆĐ¸Ņ„Ņ€ĐžĐ˛Đ°Ņ‚Đĩ", - "2": "ĐŸĐžŅ‚Ņ€ĐĩĐąĐ¸Ņ‚ĐĩĐģҁĐēа ĐŋĐ°Ņ€ĐžĐģа", - "3": "ĐŸŅ€ĐĩĐ´ĐžŅ‚Đ˛Ņ€Đ°Ņ‚ŅĐ˛Đ°ĐŊĐĩ ĐŊа ŅĐŗĐģĐžĐąŅĐ˛Đ°ĐŊĐĩŅ‚Đž ĐŊа Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚", - "4": "По-Đ˛Đ¸ŅĐžĐēĐ¸Ņ‚Đĩ ŅŅ‚ĐžĐšĐŊĐžŅŅ‚Đ¸ ŅĐ° ĐŋĐž-ŅĐ¸ĐģĐŊи, ĐŊĐž ĐŋĐž-ĐŊĐ¸ŅĐēĐ¸Ņ‚Đĩ ŅŅ‚ĐžĐšĐŊĐžŅŅ‚Đ¸ иĐŧĐ°Ņ‚ ĐŋĐž-Đ´ĐžĐąŅ€Đ° ŅŅŠĐ˛ĐŧĐĩŅŅ‚Đ¸ĐŧĐžŅŅ‚.", - "5": "Đ Đ°ĐˇŅ€Đĩ҈ĐĩĐŊĐ¸Ņ Са СадаваĐŊĐĩ (ĐŋŅ€ĐĩĐŋĐžŅ€ŅŠŅ‡Đ˛Đ° ҁĐĩ да ҁĐĩ иСĐŋĐžĐģСва СаĐĩĐ´ĐŊĐž ҁ ĐŋĐ°Ņ€ĐžĐģĐ°Ņ‚Đ° ĐŊа ŅĐžĐąŅŅ‚Đ˛ĐĩĐŊиĐēа)", - "6": "ĐŸŅ€ĐĩĐ´ĐžŅ‚Đ˛Ņ€Đ°Ņ‚ŅĐ˛Đ°ĐŊĐĩ ĐŊа ŅĐŗĐģĐžĐąŅĐ˛Đ°ĐŊĐĩŅ‚Đž ĐŊа Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚", - "7": "ĐŸŅ€ĐĩĐ´ĐžŅ‚Đ˛Ņ€Đ°Ņ‚ĐĩŅ‚Đĩ иСвĐģĐ¸Ņ‡Đ°ĐŊĐĩŅ‚Đž ĐŊа ŅŅŠĐ´ŅŠŅ€ĐļаĐŊиĐĩ", - "8": "ĐŸŅ€ĐĩĐ´ĐžŅ‚Đ˛Ņ€Đ°Ņ‚ĐĩŅ‚Đĩ иСвĐģĐ¸Ņ‡Đ°ĐŊĐĩŅ‚Đž Са Đ´ĐžŅŅ‚ŅŠĐŋĐŊĐžŅŅ‚", - "9": "ĐŸŅ€ĐĩĐ´ĐžŅ‚Đ˛Ņ€Đ°Ņ‚ŅĐ˛Đ°ĐŊĐĩ ĐŊа ĐŋĐžĐŋҊĐģваĐŊĐĩ ĐŊа Ņ„ĐžŅ€Đŧ҃ĐģŅŅ€", - "10": "ĐŸŅ€ĐĩĐ´ĐžŅ‚Đ˛Ņ€Đ°Ņ‚ŅĐ˛Đ°ĐŊĐĩ ĐŊа ĐŋŅ€ĐžĐŧĐĩĐŊи", - "11": "ĐŸŅ€ĐĩĐ´ĐžŅ‚Đ˛Ņ€Đ°Ņ‚ŅĐ˛Đ°ĐŊĐĩ ĐŊа ĐŋŅ€ĐžĐŧĐĩĐŊи ĐŊа аĐŊĐžŅ‚Đ°Ņ†Đ¸Ņ", - "12": "ĐŸŅ€ĐĩĐ´ĐžŅ‚Đ˛Ņ€Đ°Ņ‚ŅĐ˛Đ°ĐŊĐĩ ĐŊа ĐŋĐĩŅ‡Đ°Ņ‚", - "13": "ĐŸŅ€ĐĩĐ´ĐžŅ‚Đ˛Ņ€Đ°Ņ‚ĐĩŅ‚Đĩ ĐžŅ‚ĐŋĐĩŅ‡Đ°Ņ‚Đ˛Đ°ĐŊĐĩŅ‚Đž в Ņ€Đ°ĐˇĐģĐ¸Ņ‡ĐŊи Ņ„ĐžŅ€ĐŧĐ°Ņ‚Đ¸", - "14": "ĐŸĐ°Ņ€ĐžĐģа ĐŊа ŅĐžĐąŅŅ‚Đ˛ĐĩĐŊиĐēа", - "15": "ĐžĐŗŅ€Đ°ĐŊĐ¸Ņ‡Đ°Đ˛Đ° ĐēаĐēвО ĐŧĐžĐļĐĩ да ҁĐĩ ĐŋŅ€Đ°Đ˛Đ¸ ҁ Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ°, ҁĐģĐĩĐ´ ĐēĐ°Ņ‚Đž ĐąŅŠĐ´Đĩ ĐžŅ‚Đ˛ĐžŅ€ĐĩĐŊ (ĐŊĐĩ ҁĐĩ ĐŋĐžĐ´Đ´ŅŠŅ€Đļа ĐžŅ‚ Đ˛ŅĐ¸Ņ‡Đēи ҇ĐĩŅ‚Ņ†Đ¸)", - "16": "ĐžĐŗŅ€Đ°ĐŊĐ¸Ņ‡Đ°Đ˛Đ° ĐžŅ‚Đ˛Đ°Ņ€ŅĐŊĐĩŅ‚Đž ĐŊа ŅĐ°ĐŧĐ¸Ņ Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚" + "extractPages": { + "title": "Extract Pages", + "pageNumbers": { + "label": "Pages to Extract", + "placeholder": "e.g., 1,3,5-8 or odd & 1-10" + }, + "settings": { + "title": "Settings" }, - "submit": "Đ¨Đ¸Ņ„Ņ€ĐžĐ˛Đ°ĐŊĐĩ", "tooltip": { - "permissions": { - "title": "ĐŸŅ€ĐžĐŧŅĐŊа ĐŊа ĐŋŅ€Đ°Đ˛Đ°Ņ‚Đ°" + "description": "Extracts the selected pages into a new PDF, preserving order." + }, + "error": { + "failed": "Failed to extract pages" + }, + "results": { + "title": "Pages Extracted" + }, + "submit": "Extract Pages" + }, + "pageSelection": { + "tooltip": { + "header": { + "title": "Page Selection Guide" + }, + "basic": { + "title": "Basic Usage", + "text": "Select specific pages from your PDF document using simple syntax.", + "bullet1": "Individual pages: 1,3,5", + "bullet2": "Page ranges: 3-6 or 10-15", + "bullet3": "All pages: all" + }, + "advanced": { + "title": "Advanced Features" + }, + "tips": { + "title": "Tips", + "text": "Keep these guidelines in mind:", + "bullet1": "Page numbers start from 1 (not 0)", + "bullet2": "Spaces are automatically removed", + "bullet3": "Invalid expressions are ignored" + }, + "syntax": { + "title": "Syntax Basics", + "text": "Use numbers, ranges, keywords, and progressions (n starts at 0). Parentheses are supported.", + "bullets": { + "numbers": "Numbers/ranges: 5, 10-20", + "keywords": "Keywords: odd, even", + "progressions": "Progressions: 3n, 4n+1" + } + }, + "operators": { + "title": "Operators", + "text": "AND has higher precedence than comma. NOT applies within the document range.", + "and": "AND: & or \"and\" — require both conditions (e.g., 1-50 & even)", + "comma": "Comma: , or | — combine selections (e.g., 1-10, 20)", + "not": "NOT: ! or \"not\" — exclude pages (e.g., 3n & not 30)" + }, + "examples": { + "title": "Examples" + }, + "complex": { + "bullet1": "1,3-5,8,2n → pages 1, 3–5, 8, plus evens", + "bullet2": "10-,2n-1 → from page 10 to end + odd pages", + "description": "Mix different types.", + "title": "Complex Combinations" + }, + "description": "Choose which pages to use for the operation. Supports single pages, ranges, formulas, and the all keyword.", + "individual": { + "bullet1": "1,3,5 → selects pages 1, 3, 5", + "bullet2": "2,7,12 → selects pages 2, 7, 12", + "description": "Enter numbers separated by commas.", + "title": "Individual Pages" + }, + "mathematical": { + "bullet1": "2n → all even pages (2, 4, 6â€Ļ)", + "bullet2": "2n-1 → all odd pages (1, 3, 5â€Ļ)", + "bullet3": "3n → every 3rd page (3, 6, 9â€Ļ)", + "bullet4": "4n-1 → pages 3, 7, 11, 15â€Ļ", + "description": "Use n in formulas for patterns.", + "title": "Mathematical Functions" + }, + "ranges": { + "bullet1": "3-6 → selects pages 3–6", + "bullet2": "10-15 → selects pages 10–15", + "bullet3": "5- → selects pages 5 to end", + "description": "Use - for consecutive pages.", + "title": "Page Ranges" + }, + "special": { + "bullet1": "all → selects all pages", + "title": "Special Keywords" } } }, - "removePassword": { - "tags": "ŅĐ¸ĐŗŅƒŅ€ĐŊĐž,Đ´ĐĩĐēŅ€Đ¸ĐŋŅ‚Đ¸Ņ€Đ°ĐŊĐĩ,ŅĐ¸ĐŗŅƒŅ€ĐŊĐžŅŅ‚,ĐžŅ‚ĐŧŅĐŊа ĐŊа ĐŋĐ°Ņ€ĐžĐģа,Đ¸ĐˇŅ‚Ņ€Đ¸Đ˛Đ°ĐŊĐĩ ĐŊа ĐŋĐ°Ņ€ĐžĐģа", - "title": "ĐŸŅ€ĐĩĐŧĐ°Ņ…Đ˛Đ°ĐŊĐĩ ĐŊа ĐŋĐ°Ņ€ĐžĐģĐ°Ņ‚Đ°", - "header": "ĐŸŅ€ĐĩĐŧĐ°Ņ…Đ˛Đ°ĐŊĐĩ ĐŊа ĐŋĐ°Ņ€ĐžĐģĐ°Ņ‚Đ° (ДĐĩĐēŅ€Đ¸ĐŋŅ‚Đ¸Ņ€Đ°ĐŊĐĩ)", - "selectText": { - "1": "ИСйĐĩŅ€ĐĩŅ‚Đĩ PDF Са ДĐĩĐēŅ€Đ¸ĐŋŅ‚Đ¸Ņ€Đ°ĐŊĐĩ", - "2": "ĐŸĐ°Ņ€ĐžĐģа" + "bulkSelection": { + "syntaxError": "There is a syntax issue. See Page Selection tips for help.", + "header": { + "title": "Page Selection Guide" }, - "submit": "ĐŸŅ€ĐĩĐŧĐ°Ņ…Đ˛Đ°ĐŊĐĩ", - "desc": "ĐŸŅ€ĐĩĐŧĐ°Ņ…ĐŊĐĩŅ‚Đĩ ĐˇĐ°Ņ‰Đ¸Ņ‚Đ°Ņ‚Đ° ҁ ĐŋĐ°Ņ€ĐžĐģа ĐžŅ‚ Đ˛Đ°ŅˆĐ¸Ņ PDF Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚.", - "password": { - "stepTitle": "ĐŸŅ€ĐĩĐŧĐ°Ņ…Đ˛Đ°ĐŊĐĩ ĐŊа ĐŋĐ°Ņ€ĐžĐģа", - "label": "ĐĸĐĩĐēŅƒŅ‰Đ° ĐŋĐ°Ņ€ĐžĐģа" + "syntax": { + "title": "Syntax Basics", + "text": "Use numbers, ranges, keywords, and progressions (n starts at 0). Parentheses are supported.", + "bullets": { + "numbers": "Numbers/ranges: 5, 10-20", + "keywords": "Keywords: odd, even", + "progressions": "Progressions: 3n, 4n+1" + } + }, + "operators": { + "title": "Operators", + "text": "AND has higher precedence than comma. NOT applies within the document range.", + "and": "AND: & or \"and\" — require both conditions (e.g., 1-50 & even)", + "comma": "Comma: , or | — combine selections (e.g., 1-10, 20)", + "not": "NOT: ! or \"not\" — exclude pages (e.g., 3n & not 30)" + }, + "examples": { + "title": "Examples", + "first50": "First 50", + "last50": "Last 50", + "every3rd": "Every 3rd", + "oddWithinExcluding": "Odd within 1-20 excluding 5-7", + "combineSets": "Combine sets" + }, + "firstNPages": { + "title": "First N Pages", + "placeholder": "Number of pages" + }, + "lastNPages": { + "title": "Last N Pages", + "placeholder": "Number of pages" + }, + "everyNthPage": { + "title": "Every Nth Page", + "placeholder": "Step size" + }, + "range": { + "title": "Range", + "fromPlaceholder": "From", + "toPlaceholder": "To" + }, + "keywords": { + "title": "Keywords" + }, + "advanced": { + "title": "Advanced" } }, "compressPdfs": { @@ -843,12 +1734,142 @@ "tags": "remove,delete,form,field,readonly", "title": "Remove Read-Only from Form Fields", "header": "Unlock PDF Forms", - "submit": "Remove" + "submit": "Remove", + "description": "This tool will remove read-only restrictions from PDF form fields, making them editable and fillable.", + "filenamePrefix": "unlocked_forms", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst unlocking PDF forms." + }, + "results": { + "title": "Unlocked Forms Results" + } }, "changeMetadata": { - "tags": "Đ—Đ°ĐŗĐģавиĐĩ,Đ°Đ˛Ņ‚ĐžŅ€,Đ´Đ°Ņ‚Đ°,ŅŅŠĐˇĐ´Đ°Đ˛Đ°ĐŊĐĩ,Ņ‡Đ°Ņ,Đ¸ĐˇĐ´Đ°Ņ‚ĐĩĐģ,ĐŋŅ€ĐžĐ´ŅƒŅ†ĐĩĐŊŅ‚,ŅŅ‚Đ°Ņ‚Đ¸ŅŅ‚Đ¸Đēа", - "title": "Đ—Đ°ĐŗĐģавиĐĩ:", "header": "ĐŸŅ€ĐžĐŧĐĩĐŊи ĐŧĐĩŅ‚Đ°Đ´Đ°ĐŊĐŊĐ¸Ņ‚Đĩ", + "submit": "ĐŸŅ€ĐžĐŧĐĩĐŊи", + "filenamePrefix": "metadata", + "settings": { + "title": "Metadata Settings" + }, + "standardFields": { + "title": "Standard Fields" + }, + "deleteAll": { + "label": "Remove Existing Metadata", + "checkbox": "Delete all metadata" + }, + "title": { + "label": "Title", + "placeholder": "Document title" + }, + "author": { + "label": "Author", + "placeholder": "Document author" + }, + "subject": { + "label": "Subject", + "placeholder": "Document subject" + }, + "keywords": { + "label": "Keywords", + "placeholder": "Document keywords" + }, + "creator": { + "label": "Creator", + "placeholder": "Document creator" + }, + "producer": { + "label": "Producer", + "placeholder": "Document producer" + }, + "dates": { + "title": "Date Fields" + }, + "creationDate": { + "label": "Creation Date", + "placeholder": "Creation date" + }, + "modificationDate": { + "label": "Modification Date", + "placeholder": "Modification date" + }, + "trapped": { + "label": "Trapped Status", + "unknown": "Unknown", + "true": "True", + "false": "False" + }, + "advanced": { + "title": "Advanced Options" + }, + "customFields": { + "title": "Custom Metadata", + "description": "Add custom metadata fields to the document", + "add": "Add Field", + "key": "Key", + "keyPlaceholder": "Custom key", + "value": "Value", + "valuePlaceholder": "Custom value", + "remove": "Remove" + }, + "results": { + "title": "Updated PDFs" + }, + "error": { + "failed": "An error occurred while changing the PDF metadata." + }, + "tooltip": { + "header": { + "title": "PDF Metadata Overview" + }, + "standardFields": { + "title": "Standard Fields", + "text": "Common PDF metadata fields that describe the document.", + "bullet1": "Title: Document name or heading", + "bullet2": "Author: Person who created the document", + "bullet3": "Subject: Brief description of content", + "bullet4": "Keywords: Search terms for the document", + "bullet5": "Creator/Producer: Software used to create the PDF" + }, + "dates": { + "title": "Date Fields", + "text": "When the document was created and modified.", + "bullet1": "Creation Date: When original document was made", + "bullet2": "Modification Date: When last changed" + }, + "options": { + "title": "Additional Options", + "text": "Custom fields and privacy controls.", + "bullet1": "Custom Metadata: Add your own key-value pairs", + "bullet2": "Trapped Status: High-quality printing setting", + "bullet3": "Delete All: Remove all metadata for privacy" + }, + "deleteAll": { + "title": "Remove Existing Metadata", + "text": "Complete metadata deletion to ensure privacy." + }, + "customFields": { + "title": "Custom Metadata", + "text": "Add your own custom key-value metadata pairs.", + "bullet1": "Add any custom fields relevant to your document", + "bullet2": "Examples: Department, Project, Version, Status", + "bullet3": "Both key and value are required for each entry" + }, + "advanced": { + "title": "Advanced Options", + "trapped": { + "title": "Trapped Status", + "description": "Indicates if document is prepared for high-quality printing.", + "bullet1": "True: Document has been trapped for printing", + "bullet2": "False: Document has not been trapped", + "bullet3": "Unknown: Trapped status is not specified" + } + } + }, + "tags": "Đ—Đ°ĐŗĐģавиĐĩ,Đ°Đ˛Ņ‚ĐžŅ€,Đ´Đ°Ņ‚Đ°,ŅŅŠĐˇĐ´Đ°Đ˛Đ°ĐŊĐĩ,Ņ‡Đ°Ņ,Đ¸ĐˇĐ´Đ°Ņ‚ĐĩĐģ,ĐŋŅ€ĐžĐ´ŅƒŅ†ĐĩĐŊŅ‚,ŅŅ‚Đ°Ņ‚Đ¸ŅŅ‚Đ¸Đēа", "selectText": { "1": "МоĐģŅ, Ņ€ĐĩдаĐēŅ‚Đ¸Ņ€Đ°ĐšŅ‚Đĩ ĐŋŅ€ĐžĐŧĐĩĐŊĐģĐ¸Đ˛Đ¸Ņ‚Đĩ, ĐēĐžĐ¸Ņ‚Đž Đ¸ŅĐēĐ°Ņ‚Đĩ да ĐŋŅ€ĐžĐŧĐĩĐŊĐ¸Ņ‚Đĩ", "2": "Đ˜ĐˇŅ‚Ņ€Đ¸Đš Đ˛ŅĐ¸Ņ‡Đēи ĐŧĐĩŅ‚Đ°Đ´Đ°ĐŊĐŊи", @@ -856,15 +1877,7 @@ "4": "Đ”Ņ€ŅƒĐŗĐ¸ ĐŧĐĩŅ‚Đ°Đ´Đ°ĐŊĐŊи:", "5": "Đ”ĐžĐąĐ°Đ˛ŅĐŊĐĩ ĐŊа ĐŋĐĩŅ€ŅĐžĐŊаĐģĐ¸ĐˇĐ¸Ņ€Đ°ĐŊĐĩ ĐŧĐĩŅ‚Đ°Đ´Đ°ĐŊĐŊи" }, - "author": "ĐĐ˛Ņ‚ĐžŅ€:", - "creationDate": "Đ”Đ°Ņ‚Đ° ĐŊа ŅŅŠĐˇĐ´Đ°Đ˛Đ°ĐŊĐĩ (ĐŗĐŗĐŗĐŗ/ММ/Đ´Đ´ ЧЧ:ĐŧĐŧ:ҁҁ):", - "creator": "ĐĄŅŠĐˇĐ´Đ°Ņ‚ĐĩĐģ:", - "keywords": "КĐģŅŽŅ‡ĐžĐ˛Đ¸ Đ´ŅƒĐŧи:", - "modDate": "Đ”Đ°Ņ‚Đ° ĐŊа ĐŋŅ€ĐžĐŧŅĐŊа (ĐŗĐŗĐŗĐŗ/ММ/Đ´Đ´ ЧЧ:ĐŧĐŧ:ҁҁ):", - "producer": "ĐŸŅ€ĐžĐ´ŅƒŅ†ĐĩĐŊŅ‚:", - "subject": "ĐĸĐĩĐŧа:", - "trapped": "В ĐēаĐŋаĐŊ:", - "submit": "ĐŸŅ€ĐžĐŧĐĩĐŊи" + "modDate": "Đ”Đ°Ņ‚Đ° ĐŊа ĐŋŅ€ĐžĐŧŅĐŊа (ĐŗĐŗĐŗĐŗ/ММ/Đ´Đ´ ЧЧ:ĐŧĐŧ:ҁҁ):" }, "fileToPDF": { "tags": "Ņ‚Ņ€Đ°ĐŊŅŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸Ņ,Ņ„ĐžŅ€ĐŧĐ°Ņ‚,Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚,Đ¸ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊиĐĩ,ҁĐģаКд,Ņ‚ĐĩĐēҁ҂,ĐŋŅ€ĐĩĐžĐąŅ€Đ°ĐˇŅƒĐ˛Đ°ĐŊĐĩ,ĐžŅ„Đ¸Ņ,Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ¸,word,excel,powerpoint", @@ -878,6 +1891,7 @@ "ocr": { "tags": "Ņ€Đ°ĐˇĐŋОСĐŊаваĐŊĐĩ,Ņ‚ĐĩĐēҁ҂,Đ¸ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊиĐĩ,ҁĐēаĐŊĐ¸Ņ€Đ°ĐŊĐĩ,҇ĐĩŅ‚ĐĩĐŊĐĩ,идĐĩĐŊŅ‚Đ¸Ņ„Đ¸Ņ†Đ¸Ņ€Đ°ĐŊĐĩ,ĐžŅ‚ĐēŅ€Đ¸Đ˛Đ°ĐŊĐĩ,Ņ€ĐĩдаĐēŅ‚Đ¸Ņ€Đ°ĐŊĐĩ", "title": "OCR / ĐŸĐžŅ‡Đ¸ŅŅ‚Đ˛Đ°ĐŊĐĩ ĐŊа ҁĐēаĐŊĐ¸Ņ€Đ°ĐŊĐĩ", + "desc": "ĐŸĐžŅ‡Đ¸ŅŅ‚Đ˛Đ°, ҁĐēаĐŊĐ¸Ņ€Đ° и ĐžŅ‚ĐēŅ€Đ¸Đ˛Đ° Ņ‚ĐĩĐēҁ҂ ĐžŅ‚ Đ¸ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊĐ¸Ņ в PDF и ĐŗĐž Đ´ĐžĐąĐ°Đ˛Ņ ĐžŅ‚ĐŊОвО ĐēĐ°Ņ‚Đž Ņ‚ĐĩĐēҁ҂.", "header": "ĐŸĐžŅ‡Đ¸ŅŅ‚Đ˛Đ°Ņ‰Đ¸ ҁĐēаĐŊĐ¸Ņ€Đ°ĐŊĐ¸Ņ / OCR (ĐžĐŋŅ‚Đ¸Ņ‡ĐŊĐž Ņ€Đ°ĐˇĐŋОСĐŊаваĐŊĐĩ ĐŊа СĐŊĐ°Ņ†Đ¸)", "selectText": { "1": "ИСйĐĩŅ€ĐĩŅ‚Đĩ ĐĩĐˇĐ¸Ņ†Đ¸, ĐēĐžĐ¸Ņ‚Đž да ĐąŅŠĐ´Đ°Ņ‚ ĐžŅ‚ĐēŅ€Đ¸Ņ‚Đ¸ в Ņ€Đ°ĐŧĐēĐ¸Ņ‚Đĩ ĐŊа PDF (Đ¸ĐˇĐąŅ€ĐžĐĩĐŊĐ¸Ņ‚Đĩ ŅĐ° ĐžŅ‚ĐēŅ€Đ¸Ņ‚Đ¸Ņ‚Đĩ ĐēҊĐŧ ĐŧĐžĐŧĐĩĐŊŅ‚Đ°):", @@ -896,23 +1910,89 @@ "help": "МоĐģŅ, ĐŋŅ€ĐžŅ‡ĐĩŅ‚ĐĩŅ‚Đĩ Ņ‚Đ°ĐˇĐ¸ Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ°Ņ†Đ¸Ņ Са Ņ‚ĐžĐ˛Đ° ĐēаĐē да иСĐŋĐžĐģĐˇĐ˛Đ°Ņ‚Đĩ Ņ‚ĐžĐ˛Đ° Са Đ´Ņ€ŅƒĐŗĐ¸ ĐĩĐˇĐ¸Ņ†Đ¸ и/иĐģи да ĐŊĐĩ иСĐŋĐžĐģĐˇĐ˛Đ°Ņ‚Đĩ в docker", "credit": "ĐĸаСи ҃ҁĐģŅƒĐŗĐ° иСĐŋĐžĐģСва qpdf и Tesseract Са OCR.", "submit": "ĐžĐąŅ€Đ°ĐąĐžŅ‚Đēа ĐŊа PDF ҇ҀĐĩС OCR", - "desc": "ĐŸĐžŅ‡Đ¸ŅŅ‚Đ˛Đ°, ҁĐēаĐŊĐ¸Ņ€Đ° и ĐžŅ‚ĐēŅ€Đ¸Đ˛Đ° Ņ‚ĐĩĐēҁ҂ ĐžŅ‚ Đ¸ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊĐ¸Ņ в PDF и ĐŗĐž Đ´ĐžĐąĐ°Đ˛Ņ ĐžŅ‚ĐŊОвО ĐēĐ°Ņ‚Đž Ņ‚ĐĩĐēҁ҂.", + "operation": { + "submit": "Process OCR and Review" + }, + "results": { + "title": "OCR Results" + }, + "languagePicker": { + "additionalLanguages": "Looking for additional languages?", + "viewSetupGuide": "View setup guide →" + }, "settings": { "title": "ĐĐ°ŅŅ‚Ņ€ĐžĐšĐēи", "ocrMode": { - "label": "OCR Ņ€ĐĩĐļиĐŧ" + "label": "OCR Ņ€ĐĩĐļиĐŧ", + "auto": "Auto (skip text layers)", + "force": "Force (re-OCR all, replace text)", + "strict": "Strict (abort if text found)" }, "languages": { - "label": "Đ•ĐˇĐ¸Ņ†Đ¸" + "label": "Đ•ĐˇĐ¸Ņ†Đ¸", + "placeholder": "Select languages" + }, + "compatibilityMode": { + "label": "Compatibility Mode" + }, + "advancedOptions": { + "label": "Processing Options", + "sidecar": "Create a text file", + "deskew": "Deskew pages", + "clean": "Clean input file", + "cleanFinal": "Clean final output" } }, "tooltip": { + "header": { + "title": "OCR Settings Overview" + }, "mode": { - "title": "OCR Ņ€ĐĩĐļиĐŧ" + "title": "OCR Ņ€ĐĩĐļиĐŧ", + "text": "Optical Character Recognition (OCR) helps you turn scanned or screenshotted pages into text you can search, copy, or highlight.", + "bullet1": "Auto skips pages that already contain text layers.", + "bullet2": "Force re-OCRs every page and replaces all the text.", + "bullet3": "Strict halts if any selectable text is found." }, "languages": { - "title": "Đ•ĐˇĐ¸Ņ†Đ¸" + "title": "Đ•ĐˇĐ¸Ņ†Đ¸", + "text": "Improve OCR accuracy by specifying the expected languages. Choose one or more languages to guide detection." + }, + "output": { + "title": "Output", + "text": "Decide how you want the text output formatted:", + "bullet1": "Searchable PDF embeds text behind the original image.", + "bullet2": "HOCR XML returns a structured machine-readable file.", + "bullet3": "Plain-text sidecar creates a separate .txt file with raw content." + }, + "advanced": { + "header": { + "title": "Advanced OCR Processing" + }, + "compatibility": { + "title": "Compatibility Mode", + "text": "Uses OCR 'sandwich PDF' mode: results in larger files, but more reliable with certain languages and older PDF software. By default we use hOCR for smaller, modern PDFs." + }, + "sidecar": { + "title": "Create Text File", + "text": "Generates a separate .txt file alongside the PDF containing all extracted text content for easy access and processing." + }, + "deskew": { + "title": "Deskew Pages", + "text": "Automatically corrects skewed or tilted pages to improve OCR accuracy. Useful for scanned documents that weren't perfectly aligned." + }, + "clean": { + "title": "Clean Input File", + "text": "Preprocesses the input by removing noise, enhancing contrast, and optimising the image for better OCR recognition before processing." + }, + "cleanFinal": { + "title": "Clean Final Output", + "text": "Post-processes the final PDF by removing OCR artefacts and optimising the text layer for better readability and smaller file size." + } } + }, + "error": { + "failed": "OCR operation failed" } }, "extractImages": { @@ -921,7 +2001,13 @@ "header": "ИСвĐģĐ¸Ņ‡Đ°ĐŊĐĩ ĐŊа Đ¸ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊĐ¸Ņ", "selectText": "ИСйĐĩŅ€ĐĩŅ‚Đĩ Ņ„ĐžŅ€ĐŧĐ°Ņ‚ ĐŊа Đ¸ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊиĐĩŅ‚Đž, в ĐēĐžĐšŅ‚Đž да ĐŋŅ€ĐĩĐžĐąŅ€Đ°ĐˇŅƒĐ˛Đ°Ņ‚Đĩ иСвĐģĐĩ҇ĐĩĐŊĐ¸Ņ‚Đĩ Đ¸ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊĐ¸Ņ", "allowDuplicates": "ЗаĐŋаСваĐŊĐĩ ĐŊа Đ´ŅƒĐąĐģĐ¸Ņ€Đ°ĐŊи Đ¸ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊĐ¸Ņ", - "submit": "ИСвĐģĐ¸Ņ‡Đ°ĐŊĐĩ" + "submit": "ИСвĐģĐ¸Ņ‡Đ°ĐŊĐĩ", + "settings": { + "title": "Settings" + }, + "error": { + "failed": "An error occurred while extracting images from the PDF." + } }, "pdfToPDFA": { "tags": "Đ°Ņ€Ņ…Đ¸Đ˛,Đ´ŅŠĐģĐŗĐžŅ‚Ņ€Đ°ĐĩĐŊ,ŅŅ‚Đ°ĐŊĐ´Đ°Ņ€Ņ‚ĐĩĐŊ,ĐŋŅ€ĐĩĐžĐąŅ€Đ°ĐˇŅƒĐ˛Đ°ĐŊĐĩ,ŅŅŠŅ…Ņ€Đ°ĐŊĐĩĐŊиĐĩ,ĐēĐžĐŊҁĐĩŅ€Đ˛Đ¸Ņ€Đ°ĐŊĐĩ", @@ -993,17 +2079,53 @@ }, "info": "Python ĐŊĐĩ Đĩ иĐŊŅŅ‚Đ°ĐģĐ¸Ņ€Đ°ĐŊ. Đ˜ĐˇĐ¸ŅĐēва ҁĐĩ да ҁĐĩ иСĐŋҊĐģĐŊŅĐ˛Đ°." }, + "scannerImageSplit": { + "title": "Extracted Images", + "submit": "Extract Image Scans", + "error": { + "failed": "An error occurred while extracting image scans." + }, + "tooltip": { + "title": "Photo Splitter", + "whatThisDoes": "What this does", + "whatThisDoesDesc": "Automatically finds and extracts each photo from a scanned page or composite image—no manual cropping.", + "whenToUse": "When to use", + "useCase1": "Scan whole album pages in one go", + "useCase2": "Split flatbed batches into separate files", + "useCase3": "Break collages into individual photos", + "useCase4": "Pull photos from documents", + "quickFixes": "Quick fixes", + "problem1": "Photos not detected → increase Tolerance to 30-50", + "problem2": "Too many false detections → increase Minimum Area to 15,000-20,000", + "problem3": "Crops are too tight → increase Border Size to 5-10", + "problem4": "Tilted photos not straightened → lower Angle Threshold to ~5°", + "problem5": "Dust/noise boxes → increase Minimum Contour Area to 1000-2000", + "setupTips": "Setup tips", + "tip1": "Use a plain, light background", + "tip2": "Leave a small gap (≈1 cm) between photos", + "tip3": "Scan at 300-600 DPI", + "tip4": "Clean the scanner glass", + "headsUp": "Heads-up", + "headsUpDesc": "Overlapping photos or backgrounds very close in colour to the photos can reduce accuracy-try a lighter or darker background and leave more space." + } + }, "sign": { - "tags": "҃ĐŋҊĐģĐŊĐžĐŧĐžŅ‰Đ°Đ˛Đ°ĐŊĐĩ,иĐŊĐ¸Ņ†Đ¸Đ°Đģи,ĐŊĐ°Ņ€Đ¸ŅŅƒĐ˛Đ°ĐŊ-ĐŋОдĐŋĐ¸Ņ,Ņ‚ĐĩĐēŅŅ‚ĐžĐ˛-СĐŊаĐē,Đ¸ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊиĐĩ-ĐŋОдĐŋĐ¸Ņ", "title": "ПодĐŋĐ¸ŅˆĐĩŅ‚Đĩ", "header": "ПодĐŋĐ¸ŅˆĐĩŅ‚Đĩ PDF-и", "upload": "ĐšĐ°Ņ‡Đ¸ Đ¸ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊиĐĩ", - "draw": "ĐĐ°Ņ‡ĐĩŅ€Ņ‚Đ°ĐšŅ‚Đĩ ĐŋОдĐŋĐ¸Ņ", - "text": "Đ’ŅŠĐ˛ĐĩĐļдаĐŊĐĩ ĐŊа Ņ‚ĐĩĐēҁ҂", + "draw": { + "title": "Draw your signature", + "clear": "Clear" + }, + "text": { + "name": "Signer Name", + "placeholder": "Enter your full name" + }, "clear": "Đ˜ĐˇŅ‡Đ¸ŅŅ‚Đ¸", "add": "Добави", "saved": "ĐĄŅŠŅ…Ņ€Đ°ĐŊĐĩĐŊи ĐŋОдĐŋĐ¸ŅĐ¸", "save": "ЗаĐŋаСваĐŊĐĩ ĐŊа ĐŋОдĐŋĐ¸Ņ", + "applySignatures": "Apply Signatures", "personalSigs": "Đ›Đ¸Ņ‡ĐŊи ĐŋОдĐŋĐ¸ŅĐ¸", "sharedSigs": "ĐĄĐŋОдĐĩĐģĐĩĐŊи ĐŋОдĐŋĐ¸ŅĐ¸", "noSavedSigs": "НĐĩ ŅĐ° ĐŊаĐŧĐĩŅ€ĐĩĐŊи СаĐŋаСĐĩĐŊи ĐŋОдĐŋĐ¸ŅĐ¸", @@ -1015,42 +2137,179 @@ "previous": "ĐŸŅ€ĐĩĐ´Đ¸ŅˆĐŊа ŅŅ‚Đ°Ņ€Đ°ĐŊĐ¸Ņ†Đ°", "maintainRatio": "ĐŸŅ€ĐĩвĐēĐģŅŽŅ‡Đ˛Đ°ĐŊĐĩ Са ĐŋĐžĐ´Đ´ŅŠŅ€ĐļаĐŊĐĩ ĐŊа ŅŅŠĐžŅ‚ĐŊĐžŅˆĐĩĐŊиĐĩŅ‚Đž ĐŊа ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ‚Đĩ", "undo": "Undo", - "redo": "Redo" + "redo": "Redo", + "submit": "Sign Document", + "steps": { + "configure": "Configure Signature" + }, + "type": { + "title": "Signature Type", + "draw": "Draw", + "canvas": "Canvas", + "image": "Image", + "text": "Text" + }, + "image": { + "label": "Upload signature image", + "placeholder": "Select image file", + "hint": "Upload a PNG or JPG image of your signature" + }, + "instructions": { + "title": "How to add signature", + "canvas": "After drawing your signature in the canvas, close the modal then click anywhere on the PDF to place it.", + "image": "After uploading your signature image above, click anywhere on the PDF to place it.", + "text": "After entering your name above, click anywhere on the PDF to place your signature." + }, + "mode": { + "move": "Move Signature", + "place": "Place Signature" + }, + "updateAndPlace": "Update and Place", + "activate": "Activate Signature Placement", + "deactivate": "Stop Placing Signatures", + "results": { + "title": "Signature Results" + }, + "error": { + "failed": "An error occurred while signing the PDF." + }, + "tags": "҃ĐŋҊĐģĐŊĐžĐŧĐžŅ‰Đ°Đ˛Đ°ĐŊĐĩ,иĐŊĐ¸Ņ†Đ¸Đ°Đģи,ĐŊĐ°Ņ€Đ¸ŅŅƒĐ˛Đ°ĐŊ-ĐŋОдĐŋĐ¸Ņ,Ņ‚ĐĩĐēŅŅ‚ĐžĐ˛-СĐŊаĐē,Đ¸ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊиĐĩ-ĐŋОдĐŋĐ¸Ņ" }, "flatten": { - "tags": "ŅŅ‚Đ°Ņ‚Đ¸Ņ‡ĐĩĐŊ,Đ´ĐĩаĐēŅ‚Đ¸Đ˛Đ¸Ņ€Đ°ĐŊ,ĐŊĐĩиĐŊŅ‚ĐĩŅ€Đ°ĐēŅ‚Đ¸Đ˛ĐĩĐŊ,Ņ€Đ°Ņ†Đ¸ĐžĐŊаĐģĐ¸ĐˇĐ¸Ņ€Đ°ĐŊ", "title": "Đ˜ĐˇŅ€Đ°Đ˛ĐŊĐĩŅ‚Đĩ", "header": "Đ˜ĐˇŅ€Đ°Đ˛ĐŊĐĩŅ‚Đĩ PDF-и", "flattenOnlyForms": "Đ˜ĐˇŅ€Đ°Đ˛ĐŊĐĩŅ‚Đĩ ŅĐ°ĐŧĐž Ņ„ĐžŅ€Đŧи", "submit": "Đ˜ĐˇŅ€Đ°Đ˛ĐŊĐĩŅ‚Đĩ", + "filenamePrefix": "flattened", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, "steps": { "settings": "ĐĐ°ŅŅ‚Ņ€ĐžĐšĐēи" }, "options": { - "flattenOnlyForms": "Đ˜ĐˇŅ€Đ°Đ˛ĐŊĐĩŅ‚Đĩ ŅĐ°ĐŧĐž Ņ„ĐžŅ€Đŧи" - } + "stepTitle": "Flatten Options", + "title": "Flatten Options", + "flattenOnlyForms": { + "label": "Đ˜ĐˇŅ€Đ°Đ˛ĐŊĐĩŅ‚Đĩ ŅĐ°ĐŧĐž Ņ„ĐžŅ€Đŧи", + "desc": "Only flatten form fields, leaving other interactive elements intact" + }, + "note": "Flattening removes interactive elements from the PDF, making them non-editable." + }, + "results": { + "title": "Flatten Results" + }, + "error": { + "failed": "An error occurred while flattening the PDF." + }, + "tooltip": { + "header": { + "title": "About Flattening PDFs" + }, + "description": { + "title": "What does flattening do?", + "text": "Flattening makes your PDF non-editable by turning fillable forms and buttons into regular text and images. The PDF will look exactly the same, but no one can change or fill in the forms anymore. Perfect for sharing completed forms, creating final documents for records, or ensuring the PDF looks the same everywhere.", + "bullet1": "Text boxes become regular text (can't be edited)", + "bullet2": "Checkboxes and buttons become pictures", + "bullet3": "Great for final versions you don't want changed", + "bullet4": "Ensures consistent appearance across all devices" + }, + "formsOnly": { + "title": "What does 'Flatten only forms' mean?", + "text": "This option only removes the ability to fill in forms, but keeps other features working like clicking links, viewing bookmarks, and reading comments.", + "bullet1": "Forms become non-editable", + "bullet2": "Links still work when clicked", + "bullet3": "Comments and notes remain visible", + "bullet4": "Bookmarks still help you navigate" + } + }, + "tags": "ŅŅ‚Đ°Ņ‚Đ¸Ņ‡ĐĩĐŊ,Đ´ĐĩаĐēŅ‚Đ¸Đ˛Đ¸Ņ€Đ°ĐŊ,ĐŊĐĩиĐŊŅ‚ĐĩŅ€Đ°ĐēŅ‚Đ¸Đ˛ĐĩĐŊ,Ņ€Đ°Ņ†Đ¸ĐžĐŊаĐģĐ¸ĐˇĐ¸Ņ€Đ°ĐŊ" }, "repair": { "tags": "ĐŋĐžĐŋŅ€Đ°Đ˛Đēа,Đ˛ŅŠĐˇŅŅ‚Đ°ĐŊĐžĐ˛ŅĐ˛Đ°ĐŊĐĩ,ĐēĐžŅ€ĐĩĐēŅ†Đ¸Ņ,Đ˛ŅŠĐˇŅŅ‚Đ°ĐŊĐžĐ˛ŅĐ˛Đ°ĐŊĐĩ", "title": "ПоĐŋŅ€Đ°Đ˛Đ¸", "header": "ПоĐŋŅ€Đ°Đ˛Đ¸ PDF-и", - "submit": "ПоĐŋŅ€Đ°Đ˛Đ¸" + "submit": "ПоĐŋŅ€Đ°Đ˛Đ¸", + "description": "This tool will attempt to repair corrupted or damaged PDF files. No additional settings are required.", + "filenamePrefix": "repaired", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst repairing the PDF." + }, + "results": { + "title": "Repair Results" + } }, "removeBlanks": { - "tags": "ĐŋĐžŅ‡Đ¸ŅŅ‚Đ˛Đ°ĐŊĐĩ,Ņ€Đ°Ņ†Đ¸ĐžĐŊаĐģĐ¸ĐˇĐ¸Ņ€Đ°ĐŊĐĩ,ĐąĐĩС ŅŅŠĐ´ŅŠŅ€ĐļаĐŊиĐĩ,ĐžŅ€ĐŗĐ°ĐŊĐ¸ĐˇĐ¸Ņ€Đ°ĐŊĐĩ", "title": "ĐŸŅ€ĐĩĐŧĐ°Ņ…Đ˛Đ°ĐŊĐĩ ĐŊа ĐŋŅ€Đ°ĐˇĐŊи ĐŧĐĩŅŅ‚Đ°", "header": "ĐŸŅ€ĐĩĐŧĐ°Ņ…Đ˛Đ°ĐŊĐĩ ĐŊа ĐŋŅ€Đ°ĐˇĐŊи ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ¸", - "threshold": "ĐŸŅ€Đ°Đŗ ĐŊа ĐąĐĩĐģĐžŅ‚Đ° ĐŊа ĐŋиĐēҁĐĩĐģĐ¸Ņ‚Đĩ:", + "settings": { + "title": "Settings" + }, + "threshold": { + "label": "Pixel Whiteness Threshold" + }, + "whitePercent": { + "label": "White Percentage Threshold", + "unit": "%" + }, + "includeBlankPages": { + "label": "Include detected blank pages" + }, + "tooltip": { + "header": { + "title": "Remove Blank Pages Settings" + }, + "threshold": { + "title": "Pixel Whiteness Threshold", + "text": "Controls how white a pixel must be to be considered 'white'. This helps determine what counts as a blank area on the page.", + "bullet1": "0 = Pure black (most restrictive)", + "bullet2": "128 = Medium grey", + "bullet3": "255 = Pure white (least restrictive)" + }, + "whitePercent": { + "title": "White Percentage Threshold", + "text": "Sets the minimum percentage of white pixels required for a page to be considered blank and removed.", + "bullet1": "Lower values (e.g., 80%) = More pages removed", + "bullet2": "Higher values (e.g., 95%) = Only very blank pages removed", + "bullet3": "Use higher values for documents with light backgrounds" + }, + "includeBlankPages": { + "title": "Include Detected Blank Pages", + "text": "When enabled, creates a separate PDF containing all the blank pages that were detected and removed from the original document.", + "bullet1": "Useful for reviewing what was removed", + "bullet2": "Helps verify the detection accuracy", + "bullet3": "Can be disabled to reduce output file size" + } + }, + "submit": "ĐŸŅ€ĐĩĐŧĐ°Ņ…Đ˛Đ°ĐŊĐĩ ĐŊа ĐŋŅ€Đ°ĐˇĐŊи ĐŧĐĩŅŅ‚Đ°", + "error": { + "failed": "Failed to remove blank pages" + }, + "results": { + "title": "Removed Blank Pages" + }, + "tags": "ĐŋĐžŅ‡Đ¸ŅŅ‚Đ˛Đ°ĐŊĐĩ,Ņ€Đ°Ņ†Đ¸ĐžĐŊаĐģĐ¸ĐˇĐ¸Ņ€Đ°ĐŊĐĩ,ĐąĐĩС ŅŅŠĐ´ŅŠŅ€ĐļаĐŊиĐĩ,ĐžŅ€ĐŗĐ°ĐŊĐ¸ĐˇĐ¸Ņ€Đ°ĐŊĐĩ", "thresholdDesc": "ĐŸŅ€Đ°Đŗ Са ĐžĐŋŅ€ĐĩĐ´ĐĩĐģŅĐŊĐĩ ĐēĐžĐģĐēĐž ĐąŅĐģ Ņ‚Ņ€ŅĐąĐ˛Đ° да ĐąŅŠĐ´Đĩ ĐĩдиĐŊ ĐąŅĐģ ĐŋиĐēҁĐĩĐģ, Са да ĐąŅŠĐ´Đĩ ĐēĐģĐ°ŅĐ¸Ņ„Đ¸Ņ†Đ¸Ņ€Đ°ĐŊ ĐēĐ°Ņ‚Đž 'ĐąŅĐģ'. 0 = ҇ĐĩŅ€ĐŊĐž, 255 Ņ‡Đ¸ŅŅ‚Đž ĐąŅĐģĐž.", - "whitePercent": "ĐŸŅ€ĐžŅ†ĐĩĐŊŅ‚ ĐąŅĐģĐž (%):", - "whitePercentDesc": "ĐŸŅ€ĐžŅ†ĐĩĐŊŅ‚ ĐžŅ‚ ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ°Ņ‚Đ°, ĐēĐžŅŅ‚Đž Ņ‚Ņ€ŅĐąĐ˛Đ° да ĐąŅŠĐ´Đĩ в 'ĐąĐĩĐģи' ĐŋиĐēҁĐĩĐģи, ĐēĐžĐ¸Ņ‚Đž да ĐąŅŠĐ´Đ°Ņ‚ ĐŋŅ€ĐĩĐŧĐ°Ņ…ĐŊĐ°Ņ‚Đ¸", - "submit": "ĐŸŅ€ĐĩĐŧĐ°Ņ…Đ˛Đ°ĐŊĐĩ ĐŊа ĐŋŅ€Đ°ĐˇĐŊи ĐŧĐĩŅŅ‚Đ°" + "whitePercentDesc": "ĐŸŅ€ĐžŅ†ĐĩĐŊŅ‚ ĐžŅ‚ ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ°Ņ‚Đ°, ĐēĐžŅŅ‚Đž Ņ‚Ņ€ŅĐąĐ˛Đ° да ĐąŅŠĐ´Đĩ в 'ĐąĐĩĐģи' ĐŋиĐēҁĐĩĐģи, ĐēĐžĐ¸Ņ‚Đž да ĐąŅŠĐ´Đ°Ņ‚ ĐŋŅ€ĐĩĐŧĐ°Ņ…ĐŊĐ°Ņ‚Đ¸" }, "removeAnnotations": { "tags": "ĐēĐžĐŧĐĩĐŊŅ‚Đ°Ņ€Đ¸, ĐŧĐ°Ņ€ĐēĐ¸Ņ€Đ°ĐŊĐĩ, ĐąĐĩĐģĐĩĐļĐēи, ĐŧĐ°Ņ€ĐēĐ¸Ņ€Đ°ĐŊĐĩ, ĐŋŅ€ĐĩĐŧĐ°Ņ…Đ˛Đ°ĐŊĐĩ", "title": "ĐŸŅ€ĐĩĐŧĐ°Ņ…Đ˛Đ°ĐŊĐĩ ĐŊа аĐŊĐžŅ‚Đ°Ņ†Đ¸Đ¸", "header": "ĐŸŅ€ĐĩĐŧĐ°Ņ…Đ˛Đ°ĐŊĐĩ ĐŊа аĐŊĐžŅ‚Đ°Ņ†Đ¸Đ¸", - "submit": "ĐŸŅ€ĐĩĐŧĐ°Ņ…Đ˛Đ°ĐŊĐĩ" + "submit": "ĐŸŅ€ĐĩĐŧĐ°Ņ…Đ˛Đ°ĐŊĐĩ", + "settings": { + "title": "Settings" + }, + "info": { + "title": "About Remove Annotations", + "description": "This tool will remove all annotations (comments, highlights, notes, etc.) from your PDF documents." + }, + "error": { + "failed": "An error occurred while removing annotations from the PDF." + } }, "compare": { "tags": "Ņ€Đ°ĐˇĐŗŅ€Đ°ĐŊĐ¸Ņ‡Đ°Đ˛Đ°ĐŊĐĩ,ĐēĐžĐŊŅ‚Ņ€Đ°ŅŅ‚,ĐŋŅ€ĐžĐŧĐĩĐŊи,аĐŊаĐģиС", @@ -1082,6 +2341,142 @@ "certSign": { "tags": "ŅƒĐ´ĐžŅŅ‚ĐžĐ˛ĐĩŅ€ŅĐ˛Đ°ĐŊĐĩ,PEM,P12,ĐžŅ„Đ¸Ņ†Đ¸Đ°ĐģĐĩĐŊ,ŅˆĐ¸Ņ„Ņ€ĐžĐ˛Đ°ĐŊĐĩ", "title": "ПодĐŋĐ¸ŅĐ˛Đ°ĐŊĐĩ ҁҊҁ ҁĐĩŅ€Ņ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ‚", + "filenamePrefix": "signed", + "signMode": { + "stepTitle": "Sign Mode", + "tooltip": { + "header": { + "title": "About PDF Signatures" + }, + "overview": { + "title": "How signatures work", + "text": "Both modes seal the document (any edits are flagged as tampering) and record who/when/how for auditing. Viewer trust depends on the certificate chain." + }, + "manual": { + "title": "Manual - Bring your certificate", + "text": "Use your own certificate files for brand-aligned identity. Can display Trusted when your CA/chain is recognised.", + "use": "Use for: customer-facing, legal, compliance." + }, + "auto": { + "title": "Auto - Zero-setup, instant system seal", + "text": "Signs with a server self-signed certificate. Same tamper-evident seal and audit trail; typically shows Unverified in viewers.", + "use": "Use when: you need speed and consistent internal identity across reviews and records." + }, + "rule": { + "title": "Rule of thumb", + "text": "Need recipient Trusted status? Manual. Need a fast, tamper-evident seal and audit trail with no setup? Auto." + } + } + }, + "certTypeStep": { + "stepTitle": "Certificate Format" + }, + "certFiles": { + "stepTitle": "Certificate Files" + }, + "appearance": { + "stepTitle": "Signature Appearance", + "tooltip": { + "header": { + "title": "About Signature Appearance" + }, + "invisible": { + "title": "Invisible Signatures", + "text": "The signature is added to the PDF for security but won't be visible when viewing the document. Perfect for legal requirements without changing the document's appearance.", + "bullet1": "Provides security without visual changes", + "bullet2": "Meets legal requirements for digital signing", + "bullet3": "Doesn't affect document layout or design" + }, + "visible": { + "title": "Visible Signatures", + "text": "Shows a signature block on the PDF with your name, date, and optional details. Useful when you want readers to clearly see the document is signed.", + "bullet1": "Shows signer name and date on the document", + "bullet2": "Can include reason and location for signing", + "bullet3": "Choose which page to place the signature", + "bullet4": "Optional logo can be included" + } + }, + "invisible": "Invisible", + "options": { + "title": "Signature Details" + }, + "visible": "Visible" + }, + "sign": { + "submit": "Sign PDF", + "results": "Signed PDF" + }, + "error": { + "failed": "An error occurred whilst processing signatures." + }, + "tooltip": { + "header": { + "title": "About Managing Signatures" + }, + "overview": { + "title": "What can this tool do?", + "text": "This tool lets you check if your PDFs are digitally signed and add new digital signatures. Digital signatures prove who created or approved a document and show if it has been changed since signing.", + "bullet1": "Check existing signatures and their validity", + "bullet2": "View detailed information about signers and certificates", + "bullet3": "Add new digital signatures to secure your documents", + "bullet4": "Multiple files supported with easy navigation" + }, + "validation": { + "title": "Checking Signatures", + "text": "When you check signatures, the tool tells you if they're valid, who signed the document, when it was signed, and whether the document has been changed since signing.", + "bullet1": "Shows if signatures are valid or invalid", + "bullet2": "Displays signer information and signing date", + "bullet3": "Checks if the document was modified after signing", + "bullet4": "Can use custom certificates for verification" + }, + "signing": { + "title": "Adding Signatures", + "text": "To sign a PDF, you need a digital certificate (like PEM, PKCS12, or JKS). You can choose to make the signature visible on the document or keep it invisible for security only.", + "bullet1": "Supports PEM, PKCS12, JKS, and server certificate formats", + "bullet2": "Option to show or hide signature on the PDF", + "bullet3": "Add reason, location, and signer name", + "bullet4": "Choose which page to place visible signatures", + "bullet5": "Use server certificate for simple 'Sign with Stirling-PDF' option" + } + }, + "certType": { + "tooltip": { + "header": { + "title": "About Certificate Types" + }, + "what": { + "title": "What's a certificate?", + "text": "It's a secure ID for your signature that proves you signed. Unless you're required to sign via certificate, we recommend using another secure method like Type, Draw, or Upload." + }, + "which": { + "title": "Which option should I use?", + "text": "Choose the format that matches your certificate file:", + "bullet1": "PKCS#12 (.p12 / .pfx) – one combined file (most common)", + "bullet2": "PFX (.pfx) – Microsoft's version of PKCS12", + "bullet3": "PEM – separate private-key and certificate .pem files", + "bullet4": "JKS – Java .jks keystore for dev / CI-CD workflows" + }, + "convert": { + "title": "Key not listed?", + "text": "Convert your file to a Java keystore (.jks) with keytool, then pick JKS." + } + } + }, + "chooseCertificate": "Choose Certificate File", + "chooseJksFile": "Choose JKS File", + "chooseP12File": "Choose PKCS12 File", + "choosePfxFile": "Choose PFX File", + "choosePrivateKey": "Choose Private Key File", + "location": "МĐĩŅŅ‚ĐžĐŋĐžĐģĐžĐļĐĩĐŊиĐĩ", + "logoTitle": "Logo", + "name": "ИĐŧĐĩ", + "noLogo": "No Logo", + "pageNumber": "Page Number", + "password": "Đ’ŅŠĐ˛ĐĩĐ´ĐĩŅ‚Đĩ Đ˛Đ°ŅˆĐ°Ņ‚Đ° ĐŋĐ°Ņ€ĐžĐģа Са Keystore Са ĐēĐģŅŽŅ‡ĐžĐ˛Đĩ иĐģи Ņ‡Đ°ŅŅ‚ĐĩĐŊ ĐēĐģŅŽŅ‡ (аĐēĐž иĐŧа):", + "passwordOptional": "Leave empty if no password", + "reason": "ĐŸŅ€Đ¸Ņ‡Đ¸ĐŊа", + "serverCertMessage": "Using server certificate - no files or password required", + "showLogo": "ПоĐēаĐļи ĐģĐžĐŗĐž", "header": "ПодĐŋĐ¸ŅˆĐĩŅ‚Đĩ PDF ҁ Đ˛Đ°ŅˆĐ¸Ņ ҁĐĩŅ€Ņ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ‚ (В ĐŋŅ€ĐžŅ†Đĩҁ ĐŊа Ņ€Đ°ĐąĐžŅ‚Đ°)", "selectPDF": "ИСйĐĩŅ€ĐĩŅ‚Đĩ PDF Ņ„Đ°ĐšĐģ Са ĐŋОдĐŋĐ¸ŅĐ˛Đ°ĐŊĐĩ:", "jksNote": "ЗабĐĩĐģĐĩĐļĐēа: АĐēĐž Đ˛Đ°ŅˆĐ¸ŅŅ‚ Ņ‚Đ¸Đŋ ҁĐĩŅ€Ņ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ‚ ĐŊĐĩ Đĩ в ҁĐŋĐ¸ŅŅŠĐēа ĐŋĐž-Đ´ĐžĐģ҃, ĐŧĐžĐģŅ, ĐēĐžĐŊвĐĩŅ€Ņ‚Đ¸Ņ€Đ°ĐšŅ‚Đĩ ĐŗĐž Đ˛ŅŠĐ˛ Ņ„Đ°ĐšĐģ ĐŊа Java Keystore (.jks) ҁ ĐŋĐžĐŧĐžŅ‰Ņ‚Đ° ĐŊа иĐŊŅŅ‚Ņ€ŅƒĐŧĐĩĐŊŅ‚Đ° Са ĐēĐžĐŧаĐŊĐ´ĐĩĐŊ Ņ€ĐĩĐ´ keytool. ĐĄĐģĐĩĐ´ Ņ‚ĐžĐ˛Đ° иСйĐĩŅ€ĐĩŅ‚Đĩ ĐžĐŋŅ†Đ¸ŅŅ‚Đ° Са .jks Ņ„Đ°ĐšĐģ ĐŋĐž-Đ´ĐžĐģ҃.", @@ -1089,13 +2484,7 @@ "selectCert": "ИСйĐĩŅ€ĐĩŅ‚Đĩ Đ˛Đ°ŅˆĐ¸Ņ Ņ„Đ°ĐšĐģ ҁҊҁ ҁĐĩŅ€Ņ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ‚ (Ņ„ĐžŅ€ĐŧĐ°Ņ‚ X.509, ĐŧĐžĐļĐĩ да ĐąŅŠĐ´Đĩ .pem иĐģи .der):", "selectP12": "ИСйĐĩŅ€ĐĩŅ‚Đĩ Đ˛Đ°ŅˆĐ¸Ņ PKCS#12 Keystore Ņ„Đ°ĐšĐģ (.p12 иĐģи .pfx) (По Đ¸ĐˇĐąĐžŅ€, аĐēĐž Đĩ ĐŋŅ€ĐĩĐ´ĐžŅŅ‚Đ°Đ˛ĐĩĐŊ, Ņ‚Ņ€ŅĐąĐ˛Đ° да ŅŅŠĐ´ŅŠŅ€Đļа Đ˛Đ°ŅˆĐ¸Ņ ĐģĐ¸Ņ‡ĐĩĐŊ ĐēĐģŅŽŅ‡ и ҁĐĩŅ€Ņ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ‚):", "selectJKS": "ИСйĐĩŅ€ĐĩŅ‚Đĩ Đ’Đ°ŅˆĐ¸Ņ Java Keystore ФаКĐģ (.jks иĐģи .keystore):", - "certType": "ĐĸиĐŋ ҁĐĩŅ€Ņ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ‚", - "password": "Đ’ŅŠĐ˛ĐĩĐ´ĐĩŅ‚Đĩ Đ˛Đ°ŅˆĐ°Ņ‚Đ° ĐŋĐ°Ņ€ĐžĐģа Са Keystore Са ĐēĐģŅŽŅ‡ĐžĐ˛Đĩ иĐģи Ņ‡Đ°ŅŅ‚ĐĩĐŊ ĐēĐģŅŽŅ‡ (аĐēĐž иĐŧа):", "showSig": "ПоĐēаСваĐŊĐĩ ĐŊа ĐŋОдĐŋĐ¸Ņ", - "reason": "ĐŸŅ€Đ¸Ņ‡Đ¸ĐŊа", - "location": "МĐĩŅŅ‚ĐžĐŋĐžĐģĐžĐļĐĩĐŊиĐĩ", - "name": "ИĐŧĐĩ", - "showLogo": "ПоĐēаĐļи ĐģĐžĐŗĐž", "submit": "ПодĐŋĐ¸ŅˆĐĩŅ‚Đĩ PDF" }, "removeCertSign": { @@ -1103,7 +2492,18 @@ "title": "ĐŸŅ€ĐĩĐŧĐ°Ņ…Đ˛Đ°ĐŊĐĩ ĐŊа ĐŋОдĐŋĐ¸ŅĐ° ĐŊа ҁĐĩŅ€Ņ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ‚Đ°", "header": "ĐŸŅ€ĐĩĐŧĐ°Ņ…ĐŊĐĩŅ‚Đĩ Ņ†Đ¸Ņ„Ņ€ĐžĐ˛Đ¸Ņ ҁĐĩŅ€Ņ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ‚ ĐžŅ‚ PDF", "selectPDF": "ИСйĐĩŅ€ĐĩŅ‚Đĩ PDF Ņ„Đ°ĐšĐģ:", - "submit": "ĐŸŅ€ĐĩĐŧĐ°Ņ…Đ˛Đ°ĐŊĐĩ ĐŊа ĐŋОдĐŋĐ¸Ņ" + "submit": "ĐŸŅ€ĐĩĐŧĐ°Ņ…Đ˛Đ°ĐŊĐĩ ĐŊа ĐŋОдĐŋĐ¸Ņ", + "description": "This tool will remove digital certificate signatures from your PDF document.", + "filenamePrefix": "unsigned", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst removing certificate signatures." + }, + "results": { + "title": "Certificate Removal Results" + } }, "pageLayout": { "tags": "ҁĐģиваĐŊĐĩ,ĐēĐžĐŧйиĐŊĐ¸Ņ€Đ°ĐŊ,ĐĩдиĐŊĐ¸Ņ‡ĐĩĐŊ Đ¸ĐˇĐŗĐģĐĩĐ´,ĐžŅ€ĐŗĐ°ĐŊĐ¸ĐˇĐ¸Ņ€Đ°ĐŊĐĩ", @@ -1111,16 +2511,157 @@ "header": "ĐžŅ„ĐžŅ€ĐŧĐģĐĩĐŊиĐĩ ĐŊа ĐŊŅĐēĐžĐģĐēĐž ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ¸", "pagesPerSheet": "ĐĄŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ¸ ĐŊа ĐģĐ¸ŅŅ‚:", "addBorder": "Đ”ĐžĐąĐ°Đ˛ŅĐŊĐĩ ĐŊа ĐŗŅ€Đ°ĐŊĐ¸Ņ†Đ¸", - "submit": "ĐŸĐžĐ´Đ°ĐšŅ‚Đĩ" + "submit": "ĐŸĐžĐ´Đ°ĐšŅ‚Đĩ", + "desc": { + "2": "Place 2 pages side-by-side on a single sheet.", + "3": "Place 3 pages on a single sheet in a single row.", + "4": "Place 4 pages on a single sheet (2 × 2 grid).", + "9": "Place 9 pages on a single sheet (3 × 3 grid).", + "16": "Place 16 pages on a single sheet (4 × 4 grid)." + }, + "error": { + "failed": "An error occurred while creating the multi-page layout." + } + }, + "bookletImposition": { + "tags": "booklet,imposition,printing,binding,folding,signature", + "title": "Booklet Imposition", + "header": "Booklet Imposition", + "submit": "Create Booklet", + "spineLocation": { + "label": "Spine Location", + "left": "Left (Standard)", + "right": "Right (RTL)" + }, + "doubleSided": { + "label": "Double-sided printing", + "tooltip": "Creates both front and back sides for proper booklet printing" + }, + "manualDuplex": { + "title": "Manual Duplex Mode", + "instructions": "For printers without automatic duplex. You'll need to run this twice:" + }, + "duplexPass": { + "label": "Print Pass", + "first": "1st Pass", + "second": "2nd Pass", + "firstInstructions": "Prints front sides → stack face-down → run again with 2nd Pass", + "secondInstructions": "Load printed stack face-down → prints back sides" + }, + "rtlBinding": { + "label": "Right-to-left binding", + "tooltip": "For Arabic, Hebrew, or other right-to-left languages" + }, + "addBorder": { + "label": "Add borders around pages", + "tooltip": "Adds borders around each page section to help with cutting and alignment" + }, + "addGutter": { + "label": "Add gutter margin", + "tooltip": "Adds inner margin space for binding" + }, + "gutterSize": { + "label": "Gutter size (points)" + }, + "flipOnShortEdge": { + "label": "Flip on short edge (automatic duplex only)", + "tooltip": "Enable for short-edge duplex printing (automatic duplex only - ignored in manual mode)", + "manualNote": "Not needed in manual mode - you flip the stack yourself" + }, + "advanced": { + "toggle": "Advanced Options" + }, + "paperSizeNote": "Paper size is automatically derived from your first page.", + "tooltip": { + "header": { + "title": "Booklet Creation Guide" + }, + "description": { + "title": "What is Booklet Imposition?", + "text": "Creates professional booklets by arranging pages in the correct printing order. Your PDF pages are placed 2-up on landscape sheets so when folded and bound, they read in proper sequence like a real book." + }, + "example": { + "title": "Example: 8-Page Booklet", + "text": "Your 8-page document becomes 2 sheets:", + "bullet1": "Sheet 1 Front: Pages 8, 1 | Back: Pages 2, 7", + "bullet2": "Sheet 2 Front: Pages 6, 3 | Back: Pages 4, 5", + "bullet3": "When folded & stacked: Reads 1→2→3→4→5→6→7→8" + }, + "printing": { + "title": "How to Print & Assemble", + "text": "Follow these steps for perfect booklets:", + "bullet1": "Print double-sided with 'Flip on long edge'", + "bullet2": "Stack sheets in order, fold in half", + "bullet3": "Staple or bind along the folded spine", + "bullet4": "For short-edge printers: Enable 'Flip on short edge' option" + }, + "manualDuplex": { + "title": "Manual Duplex (Single-sided Printers)", + "text": "For printers without automatic duplex:", + "bullet1": "Turn OFF 'Double-sided printing'", + "bullet2": "Select '1st Pass' → Print → Stack face-down", + "bullet3": "Select '2nd Pass' → Load stack → Print backs", + "bullet4": "Fold and assemble as normal" + }, + "advanced": { + "title": "Advanced Options", + "text": "Fine-tune your booklet:", + "bullet1": "Right-to-Left Binding: For Arabic, Hebrew, or RTL languages", + "bullet2": "Borders: Shows cut lines for trimming", + "bullet3": "Gutter Margin: Adds space for binding/stapling", + "bullet4": "Short-edge Flip: Only for automatic duplex printers" + } + }, + "error": { + "failed": "An error occurred while creating the booklet imposition." + } }, "scalePages": { - "tags": "ĐŋŅ€ĐĩĐžŅ€Đ°ĐˇĐŧĐĩŅ€ŅĐ˛Đ°ĐŊĐĩ,ĐŋŅ€ĐžĐŧŅĐŊа,Ņ€Đ°ĐˇĐŧĐĩŅ€,адаĐŋŅ‚Đ¸Ņ€Đ°ĐŊĐĩ", "title": "ĐšĐžŅ€Đ¸ĐŗĐ¸Ņ€Đ°ĐŊĐĩ ĐŊа ĐŧĐ°Ņ‰Đ°ĐąĐ° ĐŊа ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ°Ņ‚Đ°", "header": "ĐšĐžŅ€Đ¸ĐŗĐ¸Ņ€Đ°ĐŊĐĩ ĐŊа ĐŧĐ°Ņ‰Đ°ĐąĐ° ĐŊа ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ°Ņ‚Đ°", "pageSize": "РаСĐŧĐĩŅ€ ĐŊа ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ° ĐžŅ‚ Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ°.", "keepPageSize": "ĐžŅ€Đ¸ĐŗĐ¸ĐŊаĐģĐĩĐŊ Ņ€Đ°ĐˇĐŧĐĩŅ€", "scaleFactor": "Ниво ĐŊа ĐŧĐ°Ņ‰Đ°ĐąĐ¸Ņ€Đ°ĐŊĐĩ (Đ¸ĐˇŅ€ŅĐˇĐ˛Đ°ĐŊĐĩ) ĐŊа ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ°.", - "submit": "ĐŸĐžĐ´Đ°ĐšŅ‚Đĩ" + "submit": "ĐŸĐžĐ´Đ°ĐšŅ‚Đĩ", + "tags": "ĐŋŅ€ĐĩĐžŅ€Đ°ĐˇĐŧĐĩŅ€ŅĐ˛Đ°ĐŊĐĩ,ĐŋŅ€ĐžĐŧŅĐŊа,Ņ€Đ°ĐˇĐŧĐĩŅ€,адаĐŋŅ‚Đ¸Ņ€Đ°ĐŊĐĩ" + }, + "adjustPageScale": { + "tags": "resize,modify,dimension,adapt", + "title": "Adjust Page Scale", + "header": "Adjust Page Scale", + "scaleFactor": { + "label": "Scale Factor" + }, + "pageSize": { + "label": "Target Page Size", + "keep": "Keep Original Size", + "letter": "Letter", + "legal": "Legal" + }, + "submit": "Adjust Page Scale", + "error": { + "failed": "An error occurred while adjusting the page scale." + }, + "tooltip": { + "header": { + "title": "Page Scale Settings Overview" + }, + "description": { + "title": "Description", + "text": "Adjust the size of PDF content and change the page dimensions." + }, + "scaleFactor": { + "title": "Scale Factor", + "text": "Controls how large or small the content appears on the page. Content is scaled and centred - if scaled content is larger than the page size, it may be cropped.", + "bullet1": "1.0 = Original size", + "bullet2": "0.5 = Half size (50% smaller)", + "bullet3": "2.0 = Double size (200% larger, may crop)" + }, + "pageSize": { + "title": "Target Page Size", + "text": "Sets the dimensions of the output PDF pages. 'Keep Original Size' maintains current dimensions, whilst other options resize to standard paper sizes." + } + } }, "add-page-numbers": { "tags": "ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ‡ĐĩĐŊ, ĐĩŅ‚Đ¸ĐēĐĩŅ‚Đ¸Ņ€Đ°ĐŊĐĩ, ĐžŅ€ĐŗĐ°ĐŊĐ¸ĐˇĐ¸Ņ€Đ°ĐŊĐĩ, иĐŊĐ´ĐĩĐēŅĐ¸Ņ€Đ°ĐŊĐĩ" @@ -1129,16 +2670,83 @@ "tags": "Đ°Đ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐž ĐžŅ‚ĐēŅ€Đ¸Đ˛Đ°ĐŊĐĩ,ĐąĐ°ĐˇĐ¸Ņ€Đ°ĐŊĐž ĐŊа ĐˇĐ°ĐŗĐģавĐēа,ĐžŅ€ĐŗĐ°ĐŊĐ¸ĐˇĐ¸Ņ€Đ°ĐŊĐĩ,ĐŋŅ€ĐĩĐĩŅ‚Đ¸ĐēĐĩŅ‚Đ¸Ņ€Đ°ĐŊĐĩ", "title": "ĐĐ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐž ĐŋŅ€ĐĩиĐŧĐĩĐŊŅƒĐ˛Đ°ĐŊĐĩ", "header": "ĐĐ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐž ĐŋŅ€ĐĩиĐŧĐĩĐŊŅƒĐ˛Đ°ĐŊĐĩ ĐŊа PDF", - "submit": "ĐĐ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐž ĐŋŅ€ĐĩиĐŧĐĩĐŊŅƒĐ˛Đ°ĐŊĐĩ" + "description": "Automatically finds the title from your PDF content and uses it as the filename.", + "submit": "ĐĐ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐž ĐŋŅ€ĐĩиĐŧĐĩĐŊŅƒĐ˛Đ°ĐŊĐĩ", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst auto-renaming the PDF." + }, + "results": { + "title": "Auto-Rename Results" + }, + "tooltip": { + "header": { + "title": "How Auto-Rename Works" + }, + "howItWorks": { + "title": "Smart Renaming", + "text": "Automatically finds the title from your PDF content and uses it as the filename.", + "bullet1": "Looks for text that appears to be a title or heading", + "bullet2": "Creates a clean, valid filename from the detected title", + "bullet3": "Keeps the original name if no suitable title is found" + } + } }, "adjust-contrast": { "tags": "ĐēĐžŅ€ĐĩĐēŅ†Đ¸Ņ ĐŊа Ņ†Đ˛ĐĩŅ‚Đ°,ĐŊĐ°ŅŅ‚Ņ€ĐžĐšŅ‚Đĩ,ĐŧĐžĐ´Đ¸Ņ„Đ¸Ņ†Đ¸Ņ€Đ°ĐšŅ‚Đĩ,ĐŋĐžĐ´ĐžĐąŅ€ĐĩŅ‚Đĩ" }, "crop": { - "tags": "Đ¸ĐˇŅ€ŅĐˇĐ˛Đ°ĐŊĐĩ,ŅĐ˛Đ¸Đ˛Đ°ĐŊĐĩ,Ņ€ĐĩдаĐēŅ‚Đ¸Ņ€Đ°ĐŊĐĩ,ĐžŅ„ĐžŅ€ĐŧŅĐŊĐĩ", "title": "Đ˜ĐˇŅ€ŅĐˇĐ˛Đ°ĐŊĐĩ", "header": "Đ˜ĐˇŅ€ŅĐˇĐ˛Đ°ĐŊĐĩ ĐŊа PDF", - "submit": "ĐŸĐžĐ´Đ°ĐšŅ‚Đĩ" + "submit": "ĐŸĐžĐ´Đ°ĐšŅ‚Đĩ", + "noFileSelected": "Select a PDF file to begin cropping", + "preview": { + "title": "Crop Area Selection" + }, + "reset": "Reset to full PDF", + "coordinates": { + "title": "Position and Size", + "x": { + "label": "X Position", + "desc": "Left edge (points)" + }, + "y": { + "label": "Y Position", + "desc": "Bottom edge (points)" + }, + "width": { + "label": "Width", + "desc": "Crop width (points)" + }, + "height": { + "label": "Height", + "desc": "Crop height (points)" + } + }, + "error": { + "invalidArea": "Crop area extends beyond PDF boundaries", + "failed": "Failed to crop PDF" + }, + "steps": { + "selectArea": "Select Crop Area" + }, + "tooltip": { + "title": "How to Crop PDFs", + "description": "Select the area to crop from your PDF by dragging and resizing the blue overlay on the thumbnail.", + "drag": "Drag the overlay to move the crop area", + "resize": "Drag the corner and edge handles to resize", + "precision": "Use coordinate inputs for precise positioning" + }, + "results": { + "title": "Crop Results" + }, + "automation": { + "info": "Enter crop coordinates in PDF points. Origin (0,0) is at bottom-left. These values will be applied to all PDFs processed in this automation.", + "reference": "Reference: A4 page is 595.28 × 841.89 points (210mm × 297mm). 1 inch = 72 points." + }, + "tags": "Đ¸ĐˇŅ€ŅĐˇĐ˛Đ°ĐŊĐĩ,ŅĐ˛Đ¸Đ˛Đ°ĐŊĐĩ,Ņ€ĐĩдаĐēŅ‚Đ¸Ņ€Đ°ĐŊĐĩ,ĐžŅ„ĐžŅ€ĐŧŅĐŊĐĩ" }, "autoSplitPDF": { "tags": "QR-ĐąĐ°ĐˇĐ¸Ņ€Đ°ĐŊ,ĐžŅ‚Đ´ĐĩĐģĐĩĐŊ,ҁĐēаĐŊĐ¸Ņ€Đ°ĐŊĐĩ-ҁĐĩĐŗĐŧĐĩĐŊŅ‚,ĐžŅ€ĐŗĐ°ĐŊĐ¸ĐˇĐ¸Ņ€Đ°ĐŊĐĩ", @@ -1221,24 +2829,124 @@ "downloadJS": "Đ˜ĐˇŅ‚ĐĩĐŗĐģи Javascript", "submit": "ПоĐēаĐļи" }, - "autoRedact": { - "tags": "Đ ĐĩдаĐēŅ‚Đ¸Ņ€Đ°ĐŊĐĩ,ĐĄĐēŅ€Đ¸Đ˛Đ°ĐŊĐĩ,ĐˇĐ°Ņ‚ŅŠĐŧĐŊŅĐ˛Đ°ĐŊĐĩ,҇ĐĩŅ€ĐĩĐŊ,ĐŧĐ°Ņ€ĐēĐĩŅ€,ҁĐēŅ€Đ¸Ņ‚", - "title": "ĐĐ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐž Ņ€ĐĩдаĐēŅ‚Đ¸Ņ€Đ°ĐŊĐĩ", - "header": "ĐĐ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐž Ņ€ĐĩдаĐēŅ‚Đ¸Ņ€Đ°ĐŊĐĩ", - "colorLabel": "ĐĻĐ˛ŅŅ‚", - "textsToRedactLabel": "ĐĸĐĩĐēҁ҂ Са Ņ€ĐĩдаĐēŅ‚Đ¸Ņ€Đ°ĐŊĐĩ (Ņ€Đ°ĐˇĐ´ĐĩĐģĐĩĐŊ ҁ Ņ€ĐĩдОвĐĩ)", - "textsToRedactPlaceholder": "ĐŊаĐŋŅ€Đ¸ĐŧĐĩŅ€: \\nПовĐĩŅ€Đ¸Ņ‚ĐĩĐģĐŊĐž \\nĐĄŅ‚Ņ€ĐžĐŗĐž ҁĐĩĐēŅ€ĐĩŅ‚ĐŊĐž", - "useRegexLabel": "ИСĐŋĐžĐģСваĐŊĐĩ ĐŊа Regex", - "wholeWordSearchLabel": "ĐĸŅŠŅ€ŅĐĩĐŊĐĩ ĐŊа Ņ†ŅĐģĐ°Ņ‚Đ° Đ´ŅƒĐŧа", - "customPaddingLabel": "ПĐĩŅ€ŅĐžĐŊаĐģĐ¸ĐˇĐ¸Ņ€Đ°ĐŊа Đ´ĐžĐŋҊĐģĐŊĐ¸Ņ‚ĐĩĐģĐŊа ĐŋОдĐģĐžĐļĐēа", - "convertPDFToImageLabel": "ĐŸŅ€ĐĩĐžĐąŅ€Đ°ĐˇŅƒĐ˛Đ°ĐŊĐĩ ĐŊа PDF ĐēҊĐŧ PDF-Đ¸ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊиĐĩ (иСĐŋĐžĐģСва ҁĐĩ Са ĐŋŅ€ĐĩĐŧĐ°Ņ…Đ˛Đ°ĐŊĐĩ ĐŊа Ņ‚ĐĩĐēҁ҂ Сад ĐŋĐžĐģĐĩŅ‚Đž)", - "submitButton": "ИСĐŋŅ€Đ°Ņ‰Đ°ĐŊĐĩ" - }, "redact": { "tags": "Đ ĐĩдаĐēŅ‚Đ¸Ņ€Đ°ĐŊĐĩ, ҁĐēŅ€Đ¸Đ˛Đ°ĐŊĐĩ, ĐˇĐ°Ņ‚ŅŠĐŧĐŊĐĩĐŊиĐĩ, ҇ĐĩŅ€ĐŊĐž, ĐŧĐ°Ņ€ĐēĐĩŅ€, ҁĐēŅ€Đ¸Ņ‚Đž, Ņ€ŅŠŅ‡ĐŊĐž", "title": "Đ ŅŠŅ‡ĐŊĐž Ņ€ĐĩдаĐēŅ‚Đ¸Ņ€Đ°ĐŊĐĩ", - "header": "Đ ŅŠŅ‡ĐŊĐž Ņ€ĐĩдаĐēŅ‚Đ¸Ņ€Đ°ĐŊĐĩ", "submit": "Đ ĐĩдаĐēŅ‚Đ¸Ņ€Đ°ĐŊĐĩ", + "error": { + "failed": "An error occurred while redacting the PDF." + }, + "modeSelector": { + "title": "Redaction Method", + "mode": "Mode", + "automatic": "Automatic", + "automaticDesc": "Redact text based on search terms", + "manual": "Manual", + "manualDesc": "Click and drag to redact specific areas", + "manualComingSoon": "Manual redaction coming soon" + }, + "auto": { + "header": "Auto Redact", + "settings": { + "title": "Redaction Settings", + "advancedTitle": "Đ Đ°ĐˇŅˆĐ¸Ņ€ĐĩĐŊĐž" + }, + "colorLabel": "Box Colour", + "wordsToRedact": { + "title": "Words to Redact", + "placeholder": "Enter a word", + "add": "Добави", + "examples": "Examples: Confidential, Top-Secret" + }, + "useRegexLabel": "Use Regex", + "wholeWordSearchLabel": "Whole Word Search", + "customPaddingLabel": "Custom Extra Padding", + "convertPDFToImageLabel": "Convert PDF to PDF-Image" + }, + "tooltip": { + "mode": { + "header": { + "title": "Redaction Method" + }, + "automatic": { + "title": "Automatic Redaction", + "text": "Automatically finds and redacts specified text throughout the document. Perfect for removing consistent sensitive information like names, addresses, or confidential markers." + }, + "manual": { + "title": "Manual Redaction", + "text": "Click and drag to manually select specific areas to redact. Gives you precise control over what gets redacted. (Coming soon)" + } + }, + "words": { + "header": { + "title": "Words to Redact" + }, + "description": { + "title": "Text Matching", + "text": "Enter words or phrases to find and redact in your document. Each word will be searched for separately." + }, + "bullet1": "Add one word at a time", + "bullet2": "Press Enter or click 'Add Another' to add", + "bullet3": "Click × to remove words", + "examples": { + "title": "Common Examples", + "text": "Typical words to redact include: bank details, email addresses, or specific names." + } + }, + "advanced": { + "header": { + "title": "Advanced Redaction Settings" + }, + "color": { + "title": "Box Colour & Padding", + "text": "Customise the appearance of redaction boxes. Black is standard, but you can choose any colour. Padding adds extra space around the found text." + }, + "regex": { + "title": "Use Regex", + "text": "Enable regular expressions for advanced pattern matching. Useful for finding phone numbers, emails, or complex patterns.", + "bullet1": "Example: \\d{4}-\\d{2}-\\d{2} to match any dates in YYYY-MM-DD format", + "bullet2": "Use with caution - test thoroughly" + }, + "wholeWord": { + "title": "Whole Word Search", + "text": "Only match complete words, not partial matches. 'John' won't match 'Johnson' when enabled." + }, + "convert": { + "title": "Convert to PDF-Image", + "text": "Converts the PDF to an image-based PDF after redaction. This ensures text behind redaction boxes is completely removed and unrecoverable." + } + } + }, + "manual": { + "header": "Manual Redaction", + "textBasedRedaction": "Text-based Redaction", + "pageBasedRedaction": "Page-based Redaction", + "convertPDFToImageLabel": "Convert PDF to PDF-Image (Used to remove text behind the box)", + "pageRedactionNumbers": { + "title": "ĐĄŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ¸", + "placeholder": "(e.g. 1,2,8 or 4,7,12-16 or 2n-1)" + }, + "redactionColor": { + "title": "Redaction Colour" + }, + "export": "ЕĐēҁĐŋĐžŅ€Ņ‚", + "upload": "Upload", + "boxRedaction": "Box draw redaction", + "zoom": "Zoom", + "zoomIn": "Zoom in", + "zoomOut": "Zoom out", + "nextPage": "Next Page", + "previousPage": "Previous Page", + "toggleSidebar": "Toggle Sidebar", + "showThumbnails": "Show Thumbnails", + "showDocumentOutline": "Show Document Outline (double-click to expand/collapse all items)", + "showAttachments": "Show Attachments", + "showLayers": "Show Layers (double-click to reset all layers to the default state)", + "colourPicker": "Colour Picker", + "findCurrentOutlineItem": "Find current outline item", + "applyChanges": "Apply Changes" + }, + "header": "Đ ŅŠŅ‡ĐŊĐž Ņ€ĐĩдаĐēŅ‚Đ¸Ņ€Đ°ĐŊĐĩ", "textBasedRedaction": "Đ ĐĩдаĐēŅ‚Đ¸Ņ€Đ°ĐŊĐĩ ĐŊа ĐąĐ°ĐˇĐ°Ņ‚Đ° ĐŊа Ņ‚ĐĩĐēҁ҂", "pageBasedRedaction": "Đ ĐĩдаĐēŅ‚Đ¸Ņ€Đ°ĐŊĐĩ ĐŊа ĐąĐ°ĐˇĐ°Ņ‚Đ° ĐŊа ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ¸", "convertPDFToImageLabel": "КоĐŊвĐĩŅ€Ņ‚Đ¸Ņ€Đ°ĐŊĐĩ ĐŊа PDF в PDF-Đ¸ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊиĐĩ (иСĐŋĐžĐģСва ҁĐĩ Са ĐŋŅ€ĐĩĐŧĐ°Ņ…Đ˛Đ°ĐŊĐĩ ĐŊа Ņ‚ĐĩĐēŅŅ‚Đ° Сад ĐŋĐžĐģĐĩŅ‚Đž)", @@ -1264,21 +2972,7 @@ "showLayers": "ПоĐēаСваĐŊĐĩ ĐŊа ҁĐģĐžĐĩвĐĩ (Ņ‰Ņ€Đ°ĐēĐŊĐĩŅ‚Đĩ два ĐŋŅŠŅ‚Đ¸, Са да Đ˛ŅŠŅ€ĐŊĐĩŅ‚Đĩ Đ˛ŅĐ¸Ņ‡Đēи ҁĐģĐžĐĩвĐĩ в ŅŅŠŅŅ‚ĐžŅĐŊиĐĩ ĐŋĐž ĐŋĐžĐ´Ņ€Đ°ĐˇĐąĐ¸Ņ€Đ°ĐŊĐĩ)", "colourPicker": "Đ˜ĐˇĐąĐžŅ€ ĐŊа Ņ†Đ˛ŅŅ‚", "findCurrentOutlineItem": "НаĐŧĐ¸Ņ€Đ°ĐŊĐĩ ĐŊа Ņ‚ĐĩĐēŅƒŅ‰Đ¸Ņ ĐĩĐģĐĩĐŧĐĩĐŊŅ‚ ĐžŅ‚ ĐēĐžĐŊŅ‚ŅƒŅ€Đ°", - "applyChanges": "ĐŸŅ€Đ¸ĐģĐ°ĐŗĐ°ĐŊĐĩ ĐŊа ĐŋŅ€ĐžĐŧĐĩĐŊĐ¸Ņ‚Đĩ", - "auto": { - "settings": { - "advancedTitle": "Đ Đ°ĐˇŅˆĐ¸Ņ€ĐĩĐŊĐž" - }, - "wordsToRedact": { - "add": "Добави" - } - }, - "manual": { - "pageRedactionNumbers": { - "title": "ĐĄŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ¸" - }, - "export": "ЕĐēҁĐŋĐžŅ€Ņ‚" - } + "applyChanges": "ĐŸŅ€Đ¸ĐģĐ°ĐŗĐ°ĐŊĐĩ ĐŊа ĐŋŅ€ĐžĐŧĐĩĐŊĐ¸Ņ‚Đĩ" }, "tableExtraxt": { "tags": "CSV,иСвĐģĐ¸Ņ‡Đ°ĐŊĐĩ ĐŊа Ņ‚Đ°ĐąĐģĐ¸Ņ†Đ°,иСвĐģĐ¸Ņ‡Đ°ĐŊĐĩ,ĐēĐžĐŊвĐĩŅ€Ņ‚Đ¸Ņ€Đ°ĐŊĐĩ" @@ -1289,11 +2983,15 @@ "overlay-pdfs": { "tags": "ĐĐ°ŅĐģĐ°ĐŗĐ˛Đ°ĐŊĐĩ", "header": "ĐĐ°ŅĐģĐ°ĐŗĐ˛Đ°ĐŊĐĩ ĐŊа PDF Ņ„Đ°ĐšĐģОвĐĩ", + "title": "Overlay PDFs", + "desc": "Overlay one PDF on top of another", "baseFile": { "label": "ИСйĐĩŅ€ĐĩŅ‚Đĩ ĐžŅĐŊОвĐĩĐŊ PDF Ņ„Đ°ĐšĐģ" }, "overlayFiles": { - "label": "ИСйĐĩŅ€ĐĩŅ‚Đĩ ĐŊĐ°ŅĐģĐ°ĐŗĐ˛Đ°ĐŊĐĩ ĐŊа PDF Ņ„Đ°ĐšĐģОвĐĩ" + "label": "ИСйĐĩŅ€ĐĩŅ‚Đĩ ĐŊĐ°ŅĐģĐ°ĐŗĐ˛Đ°ĐŊĐĩ ĐŊа PDF Ņ„Đ°ĐšĐģОвĐĩ", + "placeholder": "Choose PDF(s)...", + "addMore": "Add more PDFs..." }, "mode": { "label": "ИСйĐĩŅ€ĐĩŅ‚Đĩ Ņ€ĐĩĐļиĐŧ ĐŊа ĐŊĐ°ŅĐģĐ°ĐŗĐ˛Đ°ĐŊĐĩ", @@ -1303,14 +3001,53 @@ }, "counts": { "label": "Đ‘Ņ€ĐžĐš ĐŊĐ°ŅĐģĐ°ĐŗĐ˛Đ°ĐŊĐ¸Ņ (Са Ņ€ĐĩĐļиĐŧ ĐŊа Ņ„Đ¸ĐēŅĐ¸Ņ€Đ°ĐŊĐž ĐŋĐžĐ˛Ņ‚ĐžŅ€ĐĩĐŊиĐĩ)", - "placeholder": "Đ’ŅŠĐ˛ĐĩĐ´ĐĩŅ‚Đĩ ĐąŅ€ĐžŅ, Ņ€Đ°ĐˇĐ´ĐĩĐģĐĩĐŊи ҁҊҁ СаĐŋĐĩŅ‚Đ°Ņ (ĐŊаĐŋŅ€. 2,3,1)" + "placeholder": "Đ’ŅŠĐ˛ĐĩĐ´ĐĩŅ‚Đĩ ĐąŅ€ĐžŅ, Ņ€Đ°ĐˇĐ´ĐĩĐģĐĩĐŊи ҁҊҁ СаĐŋĐĩŅ‚Đ°Ņ (ĐŊаĐŋŅ€. 2,3,1)", + "item": "Count for file", + "noFiles": "Add overlay files to configure counts" }, "position": { "label": "ИСйĐĩŅ€ĐĩŅ‚Đĩ ĐŋĐžĐˇĐ¸Ņ†Đ¸Ņ ĐŊа ĐŊĐ°ŅĐģĐ°ĐŗĐ˛Đ°ĐŊĐĩ", "foreground": "ĐŸŅ€ĐĩĐ´ĐĩĐŊ ĐŋĐģаĐŊ", "background": "ФОĐŊ" }, - "submit": "ИСĐŋŅ€Đ°Ņ‰Đ°ĐŊĐĩ" + "submit": "ИСĐŋŅ€Đ°Ņ‰Đ°ĐŊĐĩ", + "settings": { + "title": "Settings" + }, + "results": { + "title": "Overlay Results" + }, + "tooltip": { + "header": { + "title": "Overlay PDFs Overview" + }, + "description": { + "title": "Description", + "text": "Combine a base PDF with one or more overlay PDFs. Overlays can be applied page-by-page in different modes and placed in the foreground or background." + }, + "mode": { + "title": "Overlay Mode", + "text": "Choose how to distribute overlay pages across the base PDF pages.", + "sequential": "Sequential Overlay: Use pages from the first overlay PDF until it ends, then move to the next.", + "interleaved": "Interleaved Overlay: Take one page from each overlay in turn.", + "fixedRepeat": "Fixed Repeat Overlay: Take a set number of pages from each overlay before moving to the next. Use Counts to set the numbers." + }, + "position": { + "title": "Overlay Position", + "text": "Foreground places the overlay on top of the page. Background places it behind." + }, + "overlayFiles": { + "title": "Overlay Files", + "text": "Select one or more PDFs to overlay on the base. The order of these files affects how pages are applied in Sequential and Fixed Repeat modes." + }, + "counts": { + "title": "Counts (Fixed Repeat only)", + "text": "Provide a positive number for each overlay file showing how many pages to take before moving to the next. Required when mode is Fixed Repeat." + } + }, + "error": { + "failed": "An error occurred while overlaying PDFs." + } }, "split-by-sections": { "tags": "РаСдĐĩĐģŅĐŊĐĩ ĐŊа ҁĐĩĐēŅ†Đ¸Ņ,РаСдĐĩĐģŅĐŊĐĩ,ПĐĩŅ€ŅĐžĐŊаĐģĐ¸ĐˇĐ¸Ņ€Đ°ĐŊĐĩ", @@ -1331,6 +3068,7 @@ "tags": "ПĐĩŅ‡Đ°Ņ‚,Đ´ĐžĐąĐ°Đ˛ŅĐŊĐĩ ĐŊа Đ¸ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊиĐĩ,҆ĐĩĐŊŅ‚Ņ€Đ°ĐģĐŊĐž Đ¸ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊиĐĩ,вОдĐĩĐŊ СĐŊаĐē,PDF,Đ˛ĐŗŅ€Đ°ĐļдаĐŊĐĩ,ĐŋĐĩŅ€ŅĐžĐŊаĐģĐ¸ĐˇĐ¸Ņ€Đ°ĐŊĐĩ", "header": "ĐŸĐžŅŅ‚Đ°Đ˛ŅĐŊĐĩ ĐŊа ĐŋĐĩŅ‡Đ°Ņ‚ ĐŊа PDF", "title": "ĐŸĐžŅŅ‚Đ°Đ˛ŅĐŊĐĩ ĐŊа ĐŋĐĩŅ‡Đ°Ņ‚ ĐŊа PDF", + "stampSetup": "Stamp Setup", "stampType": "ĐĸиĐŋ ĐŋĐĩŅ‡Đ°Ņ‚", "stampText": "ĐŸĐžŅŅ‚Đ°Đ˛ŅĐŊĐĩ ĐŊа Ņ‚ĐĩĐēҁ҂", "stampImage": "Đ˜ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊиĐĩ ҁ ĐŋĐĩŅ‡Đ°Ņ‚", @@ -1343,7 +3081,19 @@ "overrideY": "ЗаĐŧŅĐŊа ĐŊа Y ĐēĐžĐžŅ€Đ´Đ¸ĐŊĐ°Ņ‚Đ°", "customMargin": "ПĐĩŅ€ŅĐžĐŊаĐģĐ¸ĐˇĐ¸Ņ€Đ°ĐŊ ĐŧĐ°Ņ€Đļ", "customColor": "ПĐĩŅ€ŅĐžĐŊаĐģĐ¸ĐˇĐ¸Ņ€Đ°ĐŊ Ņ†Đ˛ŅŅ‚ ĐŊа Ņ‚ĐĩĐēŅŅ‚Đ°", - "submit": "ИСĐŋŅ€Đ°Ņ‰Đ°ĐŊĐĩ" + "submit": "ИСĐŋŅ€Đ°Ņ‰Đ°ĐŊĐĩ", + "noStampSelected": "No stamp selected. Return to Step 1.", + "customPosition": "Drag the stamp to the desired location in the preview window.", + "error": { + "failed": "An error occurred while adding stamp to the PDF." + }, + "imageSize": "Image Size", + "margin": "Margin", + "positionAndFormatting": "Position & Formatting", + "quickPosition": "Select a position on the page to place the stamp.", + "results": { + "title": "Stamp Results" + } }, "removeImagePdf": { "tags": "ĐŸŅ€ĐĩĐŧĐ°Ņ…Đ˛Đ°ĐŊĐĩ ĐŊа Đ¸ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊиĐĩ, ĐžĐŋĐĩŅ€Đ°Ņ†Đ¸Đ¸ ĐŊа ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ¸, адĐŧиĐŊ ŅŅ‚Ņ€Đ°ĐŊа, ŅŅ‚Ņ€Đ°ĐŊа ĐŊа ŅŅŠŅ€Đ˛ŅŠŅ€Đ°" @@ -1361,7 +3111,8 @@ "status": { "_value": "ĐĄŅ‚Đ°Ņ‚ŅƒŅ", "valid": "ВаĐģидĐĩĐŊ", - "invalid": "НĐĩваĐģидĐĩĐŊ" + "invalid": "НĐĩваĐģидĐĩĐŊ", + "complete": "Validation complete" }, "signer": "ПодĐŋĐ¸ŅĐ˛Đ°Ņ‰", "date": "Đ”Đ°Ņ‚Đ°", @@ -1388,40 +3139,122 @@ "version": "ВĐĩŅ€ŅĐ¸Ņ", "keyUsage": "ĐŸŅ€ĐĩĐ´ĐŊаСĐŊĐ°Ņ‡ĐĩĐŊиĐĩ ĐŊа ĐēĐģŅŽŅ‡Đ° Са иСĐŋĐžĐģСваĐŊĐĩ", "selfSigned": "ХаĐŧĐžŅŅ‚ĐžŅŅ‚ĐĩĐģĐŊĐž ĐŋОдĐŋĐ¸ŅĐ°ĐŊ", - "bits": "ĐąĐ¸Ņ‚ĐžĐ˛Đĩ" + "bits": "ĐąĐ¸Ņ‚ĐžĐ˛Đĩ", + "details": "Certificate Details" }, "signature": { "info": "ИĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸Ņ Са ĐŋОдĐŋĐ¸ŅĐ°", "_value": "ПодĐŋĐ¸Ņ", "mathValid": "ПодĐŋĐ¸ŅŅŠŅ‚ Đĩ ĐŧĐ°Ņ‚ĐĩĐŧĐ°Ņ‚Đ¸Ņ‡ĐĩҁĐēи ваĐģидĐĩĐŊ, НО:" }, - "selectCustomCert": "ФаКĐģ ҁҊҁ ҁĐĩŅ€Ņ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ‚ X.509 ĐŋĐž ĐŋĐžŅ€ŅŠŅ‡Đēа (ĐŋĐž Đ¸ĐˇĐąĐžŅ€)" - }, - "replace-color": { - "title": "ЗаĐŧĐĩĐŊи-иĐŊвĐĩŅ€Ņ‚Đ¸Ņ€Đ°ĐŊĐĩ-ĐŊа-Ņ†Đ˛ŅŅ‚", - "header": "ЗаĐŧŅĐŊа-иĐŊвĐĩŅ€Ņ‚Đ¸Ņ€Đ°ĐŊĐĩ ĐŊа Ņ†Đ˛ŅŅ‚ PDF", - "selectText": { - "1": "ОĐŋŅ†Đ¸Đ¸ Са СаĐŧŅĐŊа иĐģи иĐŊвĐĩŅ€Ņ‚Đ¸Ņ€Đ°ĐŊĐĩ ĐŊа Ņ†Đ˛ŅŅ‚", - "2": "По ĐŋĐžĐ´Ņ€Đ°ĐˇĐąĐ¸Ņ€Đ°ĐŊĐĩ (Ņ†Đ˛ĐĩŅ‚ĐžĐ˛Đĩ ҁ Đ˛Đ¸ŅĐžĐē ĐēĐžĐŊŅ‚Ņ€Đ°ŅŅ‚ ĐŋĐž ĐŋĐžĐ´Ņ€Đ°ĐˇĐąĐ¸Ņ€Đ°ĐŊĐĩ)", - "3": "По Đ¸ĐˇĐąĐžŅ€ (ĐŋĐĩŅ€ŅĐžĐŊаĐģĐ¸ĐˇĐ¸Ņ€Đ°ĐŊи Ņ†Đ˛ĐĩŅ‚ĐžĐ˛Đĩ)", - "4": "ĐŸŅŠĐģĐŊĐž иĐŊвĐĩŅ€Ņ‚Đ¸Ņ€Đ°ĐŊĐĩ (ИĐŊвĐĩŅ€Ņ‚Đ¸Ņ€Đ°ĐŊĐĩ ĐŊа Đ˛ŅĐ¸Ņ‡Đēи Ņ†Đ˛ĐĩŅ‚ĐžĐ˛Đĩ)", - "5": "ĐĻвĐĩŅ‚ĐžĐ˛Đ¸ ĐžĐŋŅ†Đ¸Đ¸ ҁ Đ˛Đ¸ŅĐžĐē ĐēĐžĐŊŅ‚Ņ€Đ°ŅŅ‚", - "6": "Đ‘ŅĐģ Ņ‚ĐĩĐēҁ҂ ĐŊа ҇ĐĩŅ€ĐĩĐŊ Ņ„ĐžĐŊ", - "7": "ЧĐĩŅ€ĐĩĐŊ Ņ‚ĐĩĐēҁ҂ ĐŊа ĐąŅĐģ Ņ„ĐžĐŊ", - "8": "Đ–ŅŠĐģŅ‚ Ņ‚ĐĩĐēҁ҂ ĐŊа ҇ĐĩŅ€ĐĩĐŊ Ņ„ĐžĐŊ", - "9": "ЗĐĩĐģĐĩĐŊ Ņ‚ĐĩĐēҁ҂ ĐŊа ҇ĐĩŅ€ĐĩĐŊ Ņ„ĐžĐŊ", - "10": "ИСйĐĩŅ€ĐĩŅ‚Đĩ Ņ†Đ˛ŅŅ‚ ĐŊа Ņ‚ĐĩĐēŅŅ‚Đ°", - "11": "ИСйĐĩŅ€ĐĩŅ‚Đĩ Ņ†Đ˛ŅŅ‚ ĐŊа Ņ„ĐžĐŊа" + "selectCustomCert": "ФаКĐģ ҁҊҁ ҁĐĩŅ€Ņ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ‚ X.509 ĐŋĐž ĐŋĐžŅ€ŅŠŅ‡Đēа (ĐŋĐž Đ¸ĐˇĐąĐžŅ€)", + "downloadCsv": "Download CSV", + "downloadJson": "Download JSON", + "downloadPdf": "Download PDF Report", + "downloadType": { + "csv": "CSV", + "json": "JSON", + "pdf": "PDF" }, - "submit": "ЗаĐŧĐĩĐŊи" + "error": { + "allFailed": "Unable to validate the selected files.", + "partial": "Some files could not be validated.", + "reportGeneration": "Could not generate the PDF report. JSON and CSV are available.", + "unexpected": "Unexpected error during validation." + }, + "finalizing": "Preparing downloads...", + "issue": { + "certExpired": "Certificate expired", + "certRevocationUnknown": "Certificate revocation status unknown", + "certRevoked": "Certificate revoked", + "chainInvalid": "Certificate chain invalid", + "signatureInvalid": "Signature cryptographic check failed", + "trustInvalid": "Certificate not trusted" + }, + "noResults": "Run the validation to generate a report.", + "noSignaturesShort": "No signatures", + "processing": "Validating signatures...", + "report": { + "continued": "Continued", + "downloads": "Downloads", + "entryLabel": "Signature Summary", + "fields": { + "created": "Created", + "fileSize": "File Size", + "signatureCount": "Total Signatures", + "signatureDate": "Signature Date" + }, + "filesEvaluated": "{{count}} files evaluated", + "footer": "Validated via Stirling PDF", + "generatedAt": "Generated", + "noPdf": "PDF report will be available after a successful validation.", + "page": "Page", + "shortTitle": "Signature Summary", + "signatureCountLabel": "{{count}} signatures", + "signaturesFound": "{{count}} signatures detected", + "signaturesValid": "{{count}} fully valid", + "title": "Signature Validation Report" + }, + "settings": { + "certHint": "Upload a trusted X.509 certificate to validate against a custom trust source.", + "title": "Validation Settings" + }, + "signatureDate": "Signature Date", + "totalSignatures": "Total Signatures" }, - "replaceColorPdf": { - "tags": "ЗаĐŧŅĐŊа ĐŊа Ņ†Đ˛ŅŅ‚, ĐžĐŋĐĩŅ€Đ°Ņ†Đ¸Đ¸ ĐŊа ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ¸, СадĐĩĐŊ ĐēŅ€Đ°Đš, ŅŅ‚Ņ€Đ°ĐŊа ĐŊа ŅŅŠŅ€Đ˛ŅŠŅ€Đ°" + "replaceColor": { + "tags": "Replace Colour,Page operations,Back end,server side", + "labels": { + "settings": "Settings", + "colourOperation": "Colour operation" + }, + "options": { + "highContrast": "High contrast", + "invertAll": "Invert all colours", + "custom": "Custom", + "cmyk": "Convert to CMYK" + }, + "tooltip": { + "header": { + "title": "Replace & Invert Colour Settings Overview" + }, + "description": { + "title": "Description", + "text": "Transform PDF colours to improve readability and accessibility. Choose from high contrast presets, invert all colours, or create custom colour schemes." + }, + "highContrast": { + "title": "High Contrast", + "text": "Apply predefined high contrast colour combinations designed for better readability and accessibility compliance.", + "bullet1": "White text on black background - Classic dark mode", + "bullet2": "Black text on white background - Standard high contrast", + "bullet3": "Yellow text on black background - High visibility option", + "bullet4": "Green text on black background - Alternative high contrast" + }, + "invertAll": { + "title": "Invert All Colours", + "text": "Completely invert all colours in the PDF, creating a negative-like effect. Useful for creating dark mode versions of documents or reducing eye strain in low-light conditions." + }, + "custom": { + "title": "Custom Colours", + "text": "Define your own text and background colours using the colour pickers. Perfect for creating branded documents or specific accessibility requirements.", + "bullet1": "Text colour - Choose the colour for text elements", + "bullet2": "Background colour - Set the background colour for the document" + }, + "cmyk": { + "title": "Convert to CMYK", + "text": "Convert the PDF from RGB colour space to CMYK colour space, optimized for professional printing. This process converts colours to the Cyan, Magenta, Yellow, Black model used by printers." + } + }, + "error": { + "failed": "An error occurred while processing the colour replacement." + } }, "login": { "title": "Đ’Ņ…ĐžĐ´", "header": "Đ’Ņ…ĐžĐ´", "signin": "ВĐŋĐ¸ŅˆĐĩŅ‚Đĩ ҁĐĩ", + "signInWith": "Sign in with", + "signInAnonymously": "Sign Up as a Guest", "rememberme": "ЗаĐŋĐžĐŧĐŊи ĐŧĐĩ", "invalid": "НĐĩваĐģидĐŊĐž ĐŋĐžŅ‚Ņ€ĐĩĐąĐ¸Ņ‚ĐĩĐģҁĐēĐž иĐŧĐĩ иĐģи ĐŋĐ°Ņ€ĐžĐģа.", "locked": "Đ’Đ°ŅˆĐ¸ŅŅ‚ аĐēĐ°ŅƒĐŊŅ‚ Đĩ СаĐēĐģŅŽŅ‡ĐĩĐŊ.", @@ -1440,12 +3273,83 @@ "alreadyLoggedIn": "ВĐĩ҇Đĩ ҁ҂Đĩ вĐģĐĩСĐģи в", "alreadyLoggedIn2": "ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛Đ°. МоĐģŅ, иСĐģĐĩĐˇŅ‚Đĩ ĐžŅ‚ ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛Đ°Ņ‚Đ° и ĐžĐŋĐ¸Ņ‚Đ°ĐšŅ‚Đĩ ĐžŅ‚ĐŊОвО.", "toManySessions": "ИĐŧĐ°Ņ‚Đĩ Ņ‚Đ˛ŅŠŅ€Đ´Đĩ ĐŧĐŊĐžĐŗĐž аĐēŅ‚Đ¸Đ˛ĐŊи ҁĐĩŅĐ¸Đ¸", - "logoutMessage": "You have been logged out." + "logoutMessage": "You have been logged out.", + "youAreLoggedIn": "You are logged in!", + "email": "Email", + "password": "Password", + "enterEmail": "Enter your email", + "enterPassword": "Enter your password", + "loggingIn": "Logging In...", + "username": "Username", + "enterUsername": "Enter username", + "useEmailInstead": "Login with email", + "forgotPassword": "Forgot your password?", + "logIn": "Log In", + "signingIn": "Signing in...", + "login": "Login", + "or": "Or", + "useMagicLink": "Use magic link instead", + "enterEmailForMagicLink": "Enter your email for magic link", + "sending": "Sendingâ€Ļ", + "sendMagicLink": "Send Magic Link", + "cancel": "Cancel", + "dontHaveAccount": "Don't have an account? Sign up", + "home": "Home", + "debug": "Debug", + "signOut": "Sign Out", + "pleaseEnterBoth": "Please enter both email and password", + "pleaseEnterEmail": "Please enter your email address", + "magicLinkSent": "Magic link sent to {{email}}! Check your email and click the link to sign in.", + "passwordResetSent": "Password reset link sent to {{email}}! Check your email and follow the instructions.", + "failedToSignIn": "Failed to sign in with {{provider}}: {{message}}", + "unexpectedError": "Unexpected error: {{message}}", + "accountCreatedSuccess": "Account created successfully! You can now sign in.", + "passwordChangedSuccess": "Password changed successfully! Please sign in with your new password.", + "credentialsUpdated": "Your credentials have been updated. Please sign in again." + }, + "signup": { + "title": "Create an account", + "subtitle": "Join Stirling PDF to get started", + "name": "Name", + "email": "Email", + "password": "Password", + "confirmPassword": "Confirm password", + "enterName": "Enter your name", + "enterEmail": "Enter your email", + "enterPassword": "Enter your password", + "confirmPasswordPlaceholder": "Confirm password", + "or": "or", + "creatingAccount": "Creating Account...", + "signUp": "Sign Up", + "alreadyHaveAccount": "Already have an account? Sign in", + "pleaseFillAllFields": "Please fill in all fields", + "passwordsDoNotMatch": "Passwords do not match", + "passwordTooShort": "Password must be at least 6 characters long", + "invalidEmail": "Please enter a valid email address", + "checkEmailConfirmation": "Check your email for a confirmation link to complete your registration.", + "accountCreatedSuccessfully": "Account created successfully! You can now sign in.", + "unexpectedError": "Unexpected error: {{message}}", + "useEmailInstead": "Use Email Instead", + "nameRequired": "Name is required", + "emailRequired": "Email is required", + "passwordRequired": "Password is required", + "confirmPasswordRequired": "Please confirm your password" }, "pdfToSinglePage": { "title": "PDF ĐēҊĐŧ ĐĩдиĐŊĐ¸Ņ‡ĐŊа ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ°", "header": "PDF ĐēҊĐŧ ĐĩдиĐŊĐ¸Ņ‡ĐŊа ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ°", - "submit": "ĐŸŅ€ĐĩĐžĐąŅ€Đ°ĐˇŅƒĐ˛Đ°ĐŊĐĩ ĐēҊĐŧ ĐĩдиĐŊĐ¸Ņ‡ĐŊа ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ°" + "submit": "ĐŸŅ€ĐĩĐžĐąŅ€Đ°ĐˇŅƒĐ˛Đ°ĐŊĐĩ ĐēҊĐŧ ĐĩдиĐŊĐ¸Ņ‡ĐŊа ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ°", + "description": "This tool will merge all pages of your PDF into one large single page. The width will remain the same as the original pages, but the height will be the sum of all page heights.", + "filenamePrefix": "single_page", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst converting to single page." + }, + "results": { + "title": "Single Page Results" + } }, "pageExtracter": { "title": "ИСвĐģĐ¸Ņ‡Đ°ĐŊĐĩ ĐŊа ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ¸", @@ -1469,18 +3373,59 @@ "adjustContrast": { "title": "ĐĐ°ŅŅ‚Ņ€ĐžĐšĐēа ĐŊа ĐēĐžĐŊŅ‚Ņ€Đ°ŅŅ‚Đ°", "header": "ĐšĐžŅ€Đ¸ĐŗĐ¸Ņ€Đ°ĐŊĐĩ ĐŊа ĐēĐžĐŊŅ‚Ņ€Đ°ŅŅ‚Đ°", + "basic": "Basic Adjustments", "contrast": "КоĐŊŅ‚Ņ€Đ°ŅŅ‚:", "brightness": "Đ¯Ņ€ĐēĐžŅŅ‚:", "saturation": "ĐĐ°ŅĐ¸Ņ‚ĐĩĐŊĐžŅŅ‚:", - "download": "Đ˜ĐˇŅ‚ĐĩĐŗĐģи" + "download": "Đ˜ĐˇŅ‚ĐĩĐŗĐģи", + "adjustColors": "Adjust Colors", + "blue": "Blue", + "confirm": "Confirm", + "error": { + "failed": "Failed to adjust colors/contrast" + }, + "green": "Green", + "noPreview": "Select a PDF to preview", + "red": "Red", + "results": { + "title": "Adjusted PDF" + } }, "compress": { "title": "КоĐŧĐŋŅ€ĐĩŅĐ¸Ņ€Đ°ĐŊĐĩ", + "desc": "Compress PDFs to reduce their file size.", "header": "КоĐŧĐŋŅ€ĐĩŅĐ¸Ņ€Đ°ĐŊĐĩ ĐŊа PDF", + "method": { + "title": "Compression Method", + "quality": "Quality", + "filesize": "РаСĐŧĐĩŅ€ ĐŊа Ņ„Đ°ĐšĐģа" + }, "credit": "ĐĸаСи ҃ҁĐģŅƒĐŗĐ° иСĐŋĐžĐģСва qpdf Са PDF ĐēĐžĐŧĐŋŅ€ĐĩŅĐ¸Ņ€Đ°ĐŊĐĩ/ĐžĐŋŅ‚Đ¸ĐŧĐ¸ĐˇĐ¸Ņ€Đ°ĐŊĐĩ.", "grayscale": { "label": "ĐŸŅ€Đ¸ĐģĐžĐļи ŅĐ¸Đ˛Đ° ҁĐēаĐģа Са ĐēĐžĐŧĐŋŅ€ĐĩŅĐ¸Ņ€Đ°ĐŊĐĩ" }, + "tooltip": { + "header": { + "title": "Compress Settings Overview" + }, + "description": { + "title": "Description", + "text": "Compression is an easy way to reduce your file size. Pick File Size to enter a target size and have us adjust quality for you. Pick Quality to set compression strength manually." + }, + "qualityAdjustment": { + "title": "Quality Adjustment", + "text": "Drag the slider to adjust the compression strength. Lower values (1-3) preserve quality but result in larger files. Higher values (7-9) shrink the file more but reduce image clarity.", + "bullet1": "Lower values preserve quality", + "bullet2": "Higher values reduce file size" + }, + "grayscale": { + "title": "Grayscale", + "text": "Select this option to convert all images to black and white, which can significantly reduce file size especially for scanned PDFs or image-heavy documents." + } + }, + "error": { + "failed": "An error occurred while compressing the PDF." + }, "selectText": { "1": { "_value": "Compression Settings", @@ -1490,10 +3435,7 @@ "4": "ĐĐ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐĩĐŊ Ņ€ĐĩĐļиĐŧ - ĐĐ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐž ĐŊĐ°ŅŅ‚Ņ€ĐžĐšĐ˛Đ° ĐēĐ°Ņ‡ĐĩŅŅ‚Đ˛ĐžŅ‚Đž, Са да ĐŋĐžĐģŅƒŅ‡Đ¸ PDF ҁ Ņ‚ĐžŅ‡ĐĩĐŊ Ņ€Đ°ĐˇĐŧĐĩŅ€", "5": "ĐžŅ‡Đ°ĐēваĐŊ PDF Ņ€Đ°ĐˇĐŧĐĩŅ€ (ĐŊаĐŋŅ€. 25МБ, 10.8МБ, 25КБ)" }, - "submit": "КоĐŧĐŋŅ€ĐĩŅĐ¸Ņ€Đ°ĐŊĐĩ", - "method": { - "filesize": "РаСĐŧĐĩŅ€ ĐŊа Ņ„Đ°ĐšĐģа" - } + "submit": "КоĐŧĐŋŅ€ĐĩŅĐ¸Ņ€Đ°ĐŊĐĩ" }, "decrypt": { "passwordPrompt": "ĐĸОСи Ņ„Đ°ĐšĐģ Đĩ ĐˇĐ°Ņ‰Đ¸Ņ‚ĐĩĐŊ ҁ ĐŋĐ°Ņ€ĐžĐģа. МоĐģŅ, Đ˛ŅŠĐ˛ĐĩĐ´ĐĩŅ‚Đĩ ĐŋĐ°Ņ€ĐžĐģĐ°Ņ‚Đ°:", @@ -1594,7 +3536,13 @@ "title": "ĐŸŅ€ĐĩĐŧĐ°Ņ…Đ˛Đ°ĐŊĐĩ ĐŊа Đ¸ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊиĐĩŅ‚Đž", "header": "ĐŸŅ€ĐĩĐŧĐ°Ņ…Đ˛Đ°ĐŊĐĩ ĐŊа Đ¸ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊиĐĩŅ‚Đž", "removeImage": "ĐŸŅ€ĐĩĐŧĐ°Ņ…Đ˛Đ°ĐŊĐĩ ĐŊа Đ¸ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊиĐĩŅ‚Đž", - "submit": "ĐŸŅ€ĐĩĐŧĐ°Ņ…Đ˛Đ°ĐŊĐĩ ĐŊа Đ¸ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊиĐĩŅ‚Đž" + "submit": "ĐŸŅ€ĐĩĐŧĐ°Ņ…Đ˛Đ°ĐŊĐĩ ĐŊа Đ¸ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊиĐĩŅ‚Đž", + "error": { + "failed": "Failed to remove images from the PDF." + }, + "results": { + "title": "Remove Images Results" + } }, "splitByChapters": { "title": "РаСдĐĩĐģĐĩŅ‚Đĩ PDF ĐŋĐž ĐŗĐģави", @@ -1628,6 +3576,12 @@ }, "note": "БĐĩĐģĐĩĐļĐēĐ¸Ņ‚Đĩ ĐēҊĐŧ иСдаĐŊиĐĩŅ‚Đž ŅĐ° ĐŊаĐģĐ¸Ņ‡ĐŊи ŅĐ°ĐŧĐž ĐŊа аĐŊĐŗĐģĐ¸ĐšŅĐēи ĐĩСиĐē" }, + "swagger": { + "title": "API Documentation", + "header": "API Documentation", + "desc": "View and test the Stirling PDF API endpoints", + "tags": "api,documentation,swagger,endpoints,development" + }, "cookieBanner": { "popUp": { "title": "How we use Cookies", @@ -1663,53 +3617,943 @@ "title": "Analytics", "description": "These cookies help us understand how our tools are being used, so we can focus on building the features our community values most. Rest assured—Stirling PDF cannot and will never track the content of the documents you work with." } + }, + "services": { + "posthog": "PostHog Analytics", + "scarf": "Scarf Pixel" } }, - "download": "Đ˜ĐˇŅ‚ĐĩĐŗĐģи", - "convert": { - "title": "ĐŸŅ€ĐĩĐžĐąŅ€Đ°ĐˇŅƒĐ˛Đ°ĐŊĐĩ", - "settings": "ĐĐ°ŅŅ‚Ņ€ĐžĐšĐēи", - "color": "ĐĻĐ˛ŅŅ‚", - "greyscale": "ĐĄĐēаĐģа ĐŊа ŅĐ¸Đ˛ĐžŅ‚Đž", - "fillPage": "ПоĐŋҊĐģваĐŊĐĩ ĐŊа ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ°", - "pdfaDigitalSignatureWarning": "PDF Ņ„Đ°ĐšĐģŅŠŅ‚ ŅŅŠĐ´ŅŠŅ€Đļа Ņ†Đ¸Ņ„Ņ€ĐžĐ˛ ĐŋОдĐŋĐ¸Ņ. ĐĸОва ҉Đĩ ĐąŅŠĐ´Đĩ ĐŋŅ€ĐĩĐŧĐ°Ņ…ĐŊĐ°Ņ‚Đž в ҁĐģĐĩĐ´Đ˛Đ°Ņ‰Đ°Ņ‚Đ° ŅŅ‚ŅŠĐŋĐēа.", - "grayscale": "ĐĄĐēаĐģа ĐŊа ŅĐ¸Đ˛ĐžŅ‚Đž" + "removeMetadata": { + "submit": "Remove Metadata" }, - "attachments": { - "tags": "embed,attach,file,attachment,attachments", - "title": "Add attachments", - "header": "Add attachments", - "submit": "Add attachments" + "sidebar": { + "toggle": "Toggle Sidebar" + }, + "theme": { + "toggle": "Toggle Theme" + }, + "view": { + "viewer": "Viewer", + "pageEditor": "Page Editor", + "fileManager": "File Manager" + }, + "pageEditor": { + "title": "Page Editor", + "save": "Save Changes", + "noPdfLoaded": "No PDF loaded. Please upload a PDF to edit.", + "rotatedLeft": "Rotated left:", + "rotatedRight": "Rotated right:", + "deleted": "Deleted:", + "movedLeft": "Moved left:", + "movedRight": "Moved right:", + "splitAt": "Split at:", + "insertedPageBreak": "Inserted page break at:", + "addFileNotImplemented": "Add file not implemented in demo", + "closePdf": "Close PDF", + "reset": "Reset Changes", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "fitToWidth": "Fit to Width", + "actualSize": "Actual Size" + }, + "viewer": { + "firstPage": "First Page", + "lastPage": "Last Page", + "previousPage": "Previous Page", + "nextPage": "Next Page", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "singlePageView": "Single Page View", + "dualPageView": "Dual Page View" }, "rightRail": { + "closeSelected": "Close Selected Files", "selectAll": "ИСйĐĩŅ€ĐĩŅ‚Đĩ Đ˛ŅĐ¸Ņ‡Đēи", - "deselectAll": "ĐžŅ‚ĐŧŅĐŊа ĐŊа Đ¸ĐˇĐąĐžŅ€Đ° ĐŊа Đ˛ŅĐ¸Ņ‡Đēи" + "deselectAll": "ĐžŅ‚ĐŧŅĐŊа ĐŊа Đ¸ĐˇĐąĐžŅ€Đ° ĐŊа Đ˛ŅĐ¸Ņ‡Đēи", + "selectByNumber": "Select by Page Numbers", + "deleteSelected": "Delete Selected Pages", + "closePdf": "Close PDF", + "exportAll": "Export PDF", + "downloadSelected": "Download Selected Files", + "downloadAll": "Download All", + "toggleTheme": "Toggle Theme", + "language": "Language", + "search": "Search PDF", + "panMode": "Pan Mode", + "rotateLeft": "Rotate Left", + "rotateRight": "Rotate Right", + "toggleSidebar": "Toggle Sidebar", + "exportSelected": "Export Selected Pages", + "toggleAnnotations": "Toggle Annotations Visibility", + "annotationMode": "Toggle Annotation Mode", + "draw": "Draw", + "save": "Save" + }, + "search": { + "title": "Search PDF", + "placeholder": "Enter search term...", + "noResults": "No results found", + "searching": "Searching..." + }, + "guestBanner": { + "title": "You're using Stirling PDF as a guest!", + "message": "Create a free account to save your work, access more features, and support the project.", + "dismiss": "Dismiss banner", + "signUp": "Sign Up Free" + }, + "toolPicker": { + "searchPlaceholder": "Search tools...", + "noToolsFound": "No tools found", + "allTools": "ALL TOOLS", + "quickAccess": "QUICK ACCESS", + "categories": { + "standardTools": "Standard Tools", + "advancedTools": "Advanced Tools", + "recommendedTools": "Recommended Tools" + }, + "subcategories": { + "signing": "Signing", + "documentSecurity": "Document Security", + "verification": "Verification", + "documentReview": "Document Review", + "pageFormatting": "Page Formatting", + "extraction": "Extraction", + "removal": "Removal", + "automation": "Automation", + "general": "General", + "advancedFormatting": "Advanced Formatting", + "developerTools": "Developer Tools" + } }, "quickAccess": { - "sign": "ПодĐŋĐ¸ŅˆĐĩŅ‚Đĩ" + "read": "Read", + "sign": "ПодĐŋĐ¸ŅˆĐĩŅ‚Đĩ", + "automate": "Automate", + "files": "Files", + "activity": "Activity", + "help": "Help", + "account": "Account", + "config": "Config", + "adminSettings": "Admin Settings", + "allTools": "All Tools" + }, + "admin": { + "error": "Error", + "success": "Success", + "expand": "Expand", + "close": "Close", + "status": { + "active": "Active", + "inactive": "Inactive" + }, + "settings": { + "title": "Admin Settings", + "workspace": "Workspace", + "fetchError": "Failed to load settings", + "saveError": "Failed to save settings", + "saved": "Settings saved successfully", + "saveSuccess": "Settings saved successfully", + "save": "Save Changes", + "restartRequired": "Restart Required", + "restart": { + "title": "Restart Required", + "message": "Settings have been saved successfully. A server restart is required for the changes to take effect.", + "question": "Would you like to restart the server now or later?", + "now": "Restart Now", + "later": "Restart Later" + }, + "restarting": "Restarting Server", + "restartingMessage": "The server is restarting. Please wait a moment...", + "restartError": "Failed to restart server. Please restart manually.", + "general": { + "title": "System Settings", + "description": "Configure system-wide application settings including branding and default behaviour.", + "ui": "User Interface", + "system": "System", + "appName": { + "label": "Application Name", + "description": "The name displayed in the browser tab and home page" + }, + "appNameNavbar": { + "label": "Navbar Brand", + "description": "The name displayed in the navigation bar" + }, + "homeDescription": { + "label": "Home Description", + "description": "The description text shown on the home page" + }, + "defaultLocale": { + "label": "Default Locale", + "description": "The default language for new users (e.g., en_US, es_ES)" + }, + "fileUploadLimit": { + "label": "File Upload Limit", + "description": "Maximum file upload size (e.g., 100MB, 1GB)" + }, + "showUpdate": { + "label": "Show Update Notifications", + "description": "Display notifications when a new version is available" + }, + "showUpdateOnlyAdmin": { + "label": "Show Updates to Admins Only", + "description": "Restrict update notifications to admin users only" + }, + "customHTMLFiles": { + "label": "Custom HTML Files", + "description": "Allow serving custom HTML files from the customFiles directory" + }, + "languages": { + "label": "Available Languages", + "description": "Languages that users can select from (leave empty to enable all languages)" + }, + "customMetadata": { + "label": "Custom Metadata", + "autoUpdate": { + "label": "Auto Update Metadata", + "description": "Automatically update PDF metadata on all processed documents" + }, + "author": { + "label": "Default Author", + "description": "Default author for PDF metadata (e.g., username)" + }, + "creator": { + "label": "Default Creator", + "description": "Default creator for PDF metadata" + }, + "producer": { + "label": "Default Producer", + "description": "Default producer for PDF metadata" + } + }, + "customPaths": { + "label": "Custom Paths", + "description": "Configure custom file system paths for pipeline processing and external tools", + "pipeline": { + "label": "Pipeline Directories", + "watchedFoldersDir": { + "label": "Watched Folders Directory", + "description": "Directory where pipeline monitors for incoming PDFs (leave empty for default: /pipeline/watchedFolders)" + }, + "finishedFoldersDir": { + "label": "Finished Folders Directory", + "description": "Directory where processed PDFs are outputted (leave empty for default: /pipeline/finishedFolders)" + } + }, + "operations": { + "label": "External Tool Paths", + "weasyprint": { + "label": "WeasyPrint Executable", + "description": "Path to WeasyPrint executable for HTML to PDF conversion (leave empty for default: /opt/venv/bin/weasyprint)" + }, + "unoconvert": { + "label": "Unoconvert Executable", + "description": "Path to LibreOffice unoconvert for document conversions (leave empty for default: /opt/venv/bin/unoconvert)" + } + } + } + }, + "security": { + "title": "Security", + "description": "Configure authentication, login behaviour, and security policies.", + "ssoNotice": { + "title": "Looking for SSO/SAML settings?", + "message": "OAuth2 and SAML2 authentication providers have been moved to the Connections menu for easier management." + }, + "authentication": "Authentication", + "enableLogin": { + "label": "Enable Login", + "description": "Require users to log in before accessing the application" + }, + "loginMethod": { + "label": "Login Method", + "description": "The authentication method to use for user login", + "all": "All Methods", + "normal": "Username/Password Only", + "oauth2": "OAuth2 Only", + "saml2": "SAML2 Only" + }, + "loginAttemptCount": { + "label": "Login Attempt Limit", + "description": "Maximum number of failed login attempts before account lockout" + }, + "loginResetTimeMinutes": { + "label": "Login Reset Time (minutes)", + "description": "Time before failed login attempts are reset" + }, + "csrfDisabled": { + "label": "Disable CSRF Protection", + "description": "Disable Cross-Site Request Forgery protection (not recommended)" + }, + "initialLogin": { + "label": "Initial Login", + "username": { + "label": "Initial Username", + "description": "The username for the initial admin account" + }, + "password": { + "label": "Initial Password", + "description": "The password for the initial admin account" + } + }, + "jwt": { + "label": "JWT Configuration", + "secureCookie": { + "label": "Secure Cookie", + "description": "Require HTTPS for JWT cookies (recommended for production)" + }, + "keyRetentionDays": { + "label": "Key Retention Days", + "description": "Number of days to retain old JWT keys for verification" + }, + "persistence": { + "label": "Enable Key Persistence", + "description": "Store JWT keys persistently to survive server restarts" + }, + "enableKeyRotation": { + "label": "Enable Key Rotation", + "description": "Automatically rotate JWT signing keys periodically" + }, + "enableKeyCleanup": { + "label": "Enable Key Cleanup", + "description": "Automatically remove expired JWT keys" + } + }, + "audit": { + "label": "Audit Logging", + "enabled": { + "label": "Enable Audit Logging", + "description": "Track user actions and system events for compliance and security monitoring" + }, + "level": { + "label": "Audit Level", + "description": "0=OFF, 1=BASIC, 2=STANDARD, 3=VERBOSE" + }, + "retentionDays": { + "label": "Audit Retention (days)", + "description": "Number of days to retain audit logs" + } + }, + "htmlUrlSecurity": { + "label": "HTML URL Security", + "description": "Configure URL access restrictions for HTML processing to prevent SSRF attacks", + "enabled": { + "label": "Enable URL Security", + "description": "Enable URL security restrictions for HTML to PDF conversions" + }, + "level": { + "label": "Security Level", + "description": "MAX: whitelist only, MEDIUM: block internal networks, OFF: no restrictions", + "max": "Maximum (Whitelist Only)", + "medium": "Medium (Block Internal)", + "off": "Off (No Restrictions)" + }, + "advanced": "Advanced Settings", + "allowedDomains": { + "label": "Allowed Domains (Whitelist)", + "description": "One domain per line (e.g., cdn.example.com). Only these domains allowed when level is MAX" + }, + "blockedDomains": { + "label": "Blocked Domains (Blacklist)", + "description": "One domain per line (e.g., malicious.com). Additional domains to block" + }, + "internalTlds": { + "label": "Internal TLDs", + "description": "One TLD per line (e.g., .local, .internal). Block domains with these TLD patterns" + }, + "networkBlocking": "Network Blocking", + "blockPrivateNetworks": { + "label": "Block Private Networks", + "description": "Block RFC 1918 private networks (10.x.x.x, 192.168.x.x, 172.16-31.x.x)" + }, + "blockLocalhost": { + "label": "Block Localhost", + "description": "Block localhost and loopback addresses (127.x.x.x, ::1)" + }, + "blockLinkLocal": { + "label": "Block Link-Local Addresses", + "description": "Block link-local addresses (169.254.x.x, fe80::/10)" + }, + "blockCloudMetadata": { + "label": "Block Cloud Metadata Endpoints", + "description": "Block cloud provider metadata endpoints (169.254.169.254)" + } + } + }, + "connections": { + "title": "Connections", + "description": "Configure external authentication providers like OAuth2 and SAML.", + "linkedServices": "Linked Services", + "unlinkedServices": "Unlinked Services", + "connect": "Connect", + "disconnect": "Disconnect", + "disconnected": "Provider disconnected successfully", + "disconnectError": "Failed to disconnect provider", + "ssoAutoLogin": { + "label": "SSO Auto Login", + "enable": "Enable SSO Auto Login", + "description": "Automatically redirect to SSO login when authentication is required" + }, + "oauth2": { + "label": "OAuth2", + "enabled": { + "label": "Enable OAuth2", + "description": "Allow users to authenticate using OAuth2 providers" + }, + "provider": { + "label": "Provider", + "description": "The OAuth2 provider to use for authentication" + }, + "issuer": { + "label": "Issuer URL", + "description": "The OAuth2 provider issuer URL" + }, + "clientId": { + "label": "Client ID", + "description": "The OAuth2 client ID from your provider" + }, + "clientSecret": { + "label": "Client Secret", + "description": "The OAuth2 client secret from your provider" + }, + "useAsUsername": { + "label": "Use as Username", + "description": "The OAuth2 claim to use as the username (e.g., email, sub)" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first OAuth2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via OAuth2" + }, + "scopes": { + "label": "OAuth2 Scopes", + "description": "Comma-separated list of OAuth2 scopes to request (e.g., openid, profile, email)" + } + }, + "saml2": { + "label": "SAML2", + "enabled": { + "label": "Enable SAML2", + "description": "Allow users to authenticate using SAML2 providers" + }, + "provider": { + "label": "Provider", + "description": "The SAML2 provider name" + }, + "registrationId": { + "label": "Registration ID", + "description": "The SAML2 registration identifier" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first SAML2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via SAML2" + } + } + }, + "database": { + "title": "Database", + "description": "Configure custom database connection settings for enterprise deployments.", + "configuration": "Database Configuration", + "enableCustom": { + "label": "Enable Custom Database", + "description": "Use your own custom database configuration instead of the default embedded database" + }, + "customUrl": { + "label": "Custom Database URL", + "description": "Full JDBC connection string (e.g., jdbc:postgresql://localhost:5432/postgres). If provided, individual connection settings below are not used." + }, + "type": { + "label": "Database Type", + "description": "Type of database (not used if custom URL is provided)" + }, + "hostName": { + "label": "Host Name", + "description": "Database server hostname (not used if custom URL is provided)" + }, + "port": { + "label": "Port", + "description": "Database server port (not used if custom URL is provided)" + }, + "name": { + "label": "Database Name", + "description": "Name of the database (not used if custom URL is provided)" + }, + "username": { + "label": "Username", + "description": "Database authentication username" + }, + "password": { + "label": "Password", + "description": "Database authentication password" + } + }, + "privacy": { + "title": "Privacy", + "description": "Configure privacy and data collection settings.", + "analytics": "Analytics & Tracking", + "enableAnalytics": { + "label": "Enable Analytics", + "description": "Collect anonymous usage analytics to help improve the application" + }, + "metricsEnabled": { + "label": "Enable Metrics", + "description": "Enable collection of performance and usage metrics. Provides API endpoint for admins to access metrics data" + }, + "searchEngine": "Search Engine Visibility", + "googleVisibility": { + "label": "Google Visibility", + "description": "Allow search engines to index this application" + } + }, + "advanced": { + "title": "Advanced", + "description": "Configure advanced features and experimental functionality.", + "features": "Feature Flags", + "processing": "Processing", + "endpoints": { + "label": "Endpoints", + "manage": "Manage API Endpoints", + "description": "Endpoint management is configured via YAML. See documentation for details on enabling/disabling specific endpoints." + }, + "enableAlphaFunctionality": { + "label": "Enable Alpha Features", + "description": "Enable experimental and alpha-stage features (may be unstable)" + }, + "enableUrlToPDF": { + "label": "Enable URL to PDF", + "description": "Allow conversion of web pages to PDF documents" + }, + "maxDPI": { + "label": "Maximum DPI", + "description": "Maximum DPI for image processing (0 = unlimited)" + }, + "tessdataDir": { + "label": "Tessdata Directory", + "description": "Path to the tessdata directory for OCR language files" + }, + "disableSanitize": { + "label": "Disable HTML Sanitization", + "description": "WARNING: Security risk - disabling HTML sanitization can lead to XSS vulnerabilities" + }, + "tempFileManagement": { + "label": "Temp File Management", + "description": "Configure temporary file storage and cleanup behavior", + "baseTmpDir": { + "label": "Base Temp Directory", + "description": "Base directory for temporary files (leave empty for default: java.io.tmpdir/stirling-pdf)" + }, + "libreofficeDir": { + "label": "LibreOffice Temp Directory", + "description": "Directory for LibreOffice temp files (leave empty for default: baseTmpDir/libreoffice)" + }, + "systemTempDir": { + "label": "System Temp Directory", + "description": "System temp directory to clean (only used if cleanupSystemTemp is enabled)" + }, + "prefix": { + "label": "Temp File Prefix", + "description": "Prefix for temp file names" + }, + "maxAgeHours": { + "label": "Max Age (hours)", + "description": "Maximum age in hours before temp files are cleaned up" + }, + "cleanupIntervalMinutes": { + "label": "Cleanup Interval (minutes)", + "description": "How often to run cleanup (in minutes)" + }, + "startupCleanup": { + "label": "Startup Cleanup", + "description": "Clean up old temp files on application startup" + }, + "cleanupSystemTemp": { + "label": "Cleanup System Temp", + "description": "Whether to clean broader system temp directory (use with caution)" + } + }, + "processExecutor": { + "label": "Process Executor Limits", + "description": "Configure session limits and timeouts for each process executor", + "sessionLimit": { + "label": "Session Limit", + "description": "Maximum concurrent instances" + }, + "timeout": { + "label": "Timeout (minutes)", + "description": "Maximum execution time" + }, + "libreOffice": "LibreOffice", + "pdfToHtml": "PDF to HTML", + "qpdf": "QPDF", + "tesseract": "Tesseract OCR", + "pythonOpenCv": "Python OpenCV", + "weasyPrint": "WeasyPrint", + "installApp": "Install App", + "calibre": "Calibre", + "ghostscript": "Ghostscript", + "ocrMyPdf": "OCRmyPDF" + } + }, + "mail": { + "title": "Mail Server", + "description": "Configure SMTP settings for sending email notifications.", + "smtp": "SMTP Configuration", + "enabled": { + "label": "Enable Mail", + "description": "Enable email notifications and SMTP functionality" + }, + "host": { + "label": "SMTP Host", + "description": "The hostname or IP address of your SMTP server" + }, + "port": { + "label": "SMTP Port", + "description": "The port number for SMTP connection (typically 25, 465, or 587)" + }, + "username": { + "label": "SMTP Username", + "description": "Username for SMTP authentication" + }, + "password": { + "label": "SMTP Password", + "description": "Password for SMTP authentication" + }, + "from": { + "label": "From Address", + "description": "The email address to use as the sender" + }, + "enableInvites": { + "label": "Enable Email Invites", + "description": "Allow admins to invite users via email with auto-generated passwords" + }, + "frontendUrl": { + "label": "Frontend URL", + "description": "Base URL for frontend (e.g. https://pdf.example.com). Used for generating invite links in emails. Leave empty to use backend URL." + } + }, + "legal": { + "title": "Legal Documents", + "description": "Configure links to legal documents and policies.", + "disclaimer": { + "title": "Legal Responsibility Warning", + "message": "By customizing these legal documents, you assume full responsibility for ensuring compliance with all applicable laws and regulations, including but not limited to GDPR and other EU data protection requirements. Only modify these settings if: (1) you are operating a personal/private instance, (2) you are outside EU jurisdiction and understand your local legal obligations, or (3) you have obtained proper legal counsel and accept sole responsibility for all user data and legal compliance. Stirling-PDF and its developers assume no liability for your legal obligations." + }, + "termsAndConditions": { + "label": "Terms and Conditions", + "description": "URL or filename to terms and conditions" + }, + "privacyPolicy": { + "label": "Privacy Policy", + "description": "URL or filename to privacy policy" + }, + "accessibilityStatement": { + "label": "Accessibility Statement", + "description": "URL or filename to accessibility statement" + }, + "cookiePolicy": { + "label": "Cookie Policy", + "description": "URL or filename to cookie policy" + }, + "impressum": { + "label": "Impressum", + "description": "URL or filename to impressum (required in some jurisdictions)" + } + }, + "premium": { + "title": "Premium & Enterprise", + "description": "Configure your premium or enterprise license key.", + "license": "License Configuration", + "key": { + "label": "License Key", + "description": "Enter your premium or enterprise license key" + }, + "enabled": { + "label": "Enable Premium Features", + "description": "Enable license key checks for pro/enterprise features" + }, + "movedFeatures": { + "title": "Premium Features Distributed", + "message": "Premium and Enterprise features are now organized in their respective sections:" + } + }, + "features": { + "title": "Features", + "description": "Configure optional features and functionality.", + "serverCertificate": { + "label": "Server Certificate", + "description": "Configure server-side certificate generation for \"Sign with Stirling-PDF\" functionality", + "enabled": { + "label": "Enable Server Certificate", + "description": "Enable server-side certificate for \"Sign with Stirling-PDF\" option" + }, + "organizationName": { + "label": "Organization Name", + "description": "Organization name for generated certificates" + }, + "validity": { + "label": "Certificate Validity (days)", + "description": "Number of days the certificate will be valid" + }, + "regenerateOnStartup": { + "label": "Regenerate on Startup", + "description": "Generate new certificate on each application startup" + } + } + }, + "endpoints": { + "title": "API Endpoints", + "description": "Control which API endpoints and endpoint groups are available.", + "management": "Endpoint Management", + "toRemove": { + "label": "Disabled Endpoints", + "description": "Select individual endpoints to disable" + }, + "groupsToRemove": { + "label": "Disabled Endpoint Groups", + "description": "Select endpoint groups to disable" + }, + "note": "Note: Disabling endpoints restricts API access but does not remove UI components. Restart required for changes to take effect." + } + } }, "fileUpload": { + "selectFile": "Select a file", + "selectFiles": "Select files", + "selectPdfToView": "Select a PDF to view", + "selectPdfToEdit": "Select a PDF to edit", + "chooseFromStorage": "Choose a file from storage or upload a new PDF", + "chooseFromStorageMultiple": "Choose files from storage or upload new PDFs", + "loadFromStorage": "Load from Storage", + "filesAvailable": "files available", "loading": "Đ—Đ°Ņ€ĐĩĐļдаĐŊĐĩ ĐŊа...", - "or": "иĐģи" + "or": "иĐģи", + "dropFileHere": "Drop file here or click to upload", + "dropFilesHere": "Drop files here or click the upload button", + "pdfFilesOnly": "PDF files only", + "supportedFileTypes": "Supported file types", + "upload": "Upload", + "uploadFile": "Upload File", + "uploadFiles": "Upload Files", + "noFilesInStorage": "No files available in storage. Upload some files first.", + "selectFromStorage": "Select from Storage", + "backToTools": "Back to Tools", + "addFiles": "Add Files", + "dragFilesInOrClick": "Drag files in or click \"Add Files\" to browse" + }, + "fileEditor": { + "addFiles": "Add Files" }, "fileManager": { + "title": "Upload PDF Files", + "subtitle": "Add files to your storage for easy access across tools", + "filesSelected": "files selected", + "clearSelection": "Clear Selection", + "openInFileEditor": "Open in File Editor", + "uploadError": "Failed to upload some files.", + "failedToOpen": "Failed to open file. It may have been removed from storage.", + "failedToLoad": "Failed to load file to active set.", + "storageCleared": "Browser cleared storage. Files have been removed. Please re-upload.", + "clearAll": "Clear All", + "reloadFiles": "Reload Files", + "dragDrop": "Drag & Drop files here", + "clickToUpload": "Click to upload files", + "selectedFiles": "Selected Files", + "storage": "Storage", + "filesStored": "files stored", + "storageError": "Storage error occurred", + "storageLow": "Storage is running low. Consider removing old files.", + "supportMessage": "Powered by browser database storage for unlimited capacity", + "noFileSelected": "No files selected", + "showHistory": "Show History", + "hideHistory": "Hide History", + "fileHistory": "File History", + "loadingHistory": "Loading History...", + "lastModified": "Last Modified", + "toolChain": "Tools Applied", + "restore": "Restore", + "unzip": "Unzip", + "searchFiles": "Search files...", + "recent": "Recent", + "localFiles": "Local Files", + "googleDrive": "Google Drive", + "googleDriveShort": "Drive", + "myFiles": "My Files", + "noRecentFiles": "No recent files found", + "googleDriveNotAvailable": "Google Drive integration not available", + "openFiles": "Open Files", + "openFile": "Open File", + "details": "File Details", "fileName": "ИĐŧĐĩ", + "fileFormat": "Format", + "fileSize": "Size", "fileVersion": "ВĐĩŅ€ŅĐ¸Ņ", + "totalSelected": "Total Selected", + "dropFilesHere": "Drop files here", "selectAll": "ИСйĐĩŅ€ĐĩŅ‚Đĩ Đ˛ŅĐ¸Ņ‡Đēи", "deselectAll": "ĐžŅ‚ĐŧŅĐŊа ĐŊа Đ¸ĐˇĐąĐžŅ€Đ° ĐŊа Đ˛ŅĐ¸Ņ‡Đēи", "deleteSelected": "Đ˜ĐˇŅ‚Ņ€Đ¸Đ˛Đ°ĐŊĐĩ ĐŊа Đ¸ĐˇĐąŅ€Đ°ĐŊĐžŅ‚Đž", + "downloadSelected": "Download Selected", + "selectedCount": "{{count}} selected", "download": "Đ˜ĐˇŅ‚ĐĩĐŗĐģи", - "delete": "Đ˜ĐˇŅ‚Ņ€Đ¸Đš" + "delete": "Đ˜ĐˇŅ‚Ņ€Đ¸Đš", + "unsupported": "Unsupported", + "addToUpload": "Add to Upload", + "deleteAll": "Delete All", + "loadingFiles": "Loading files...", + "noFiles": "No files available", + "noFilesFound": "No files found matching your search", + "openInPageEditor": "Open in Page Editor", + "showAll": "Show All", + "sortByDate": "Sort by Date", + "sortByName": "Sort by Name", + "sortBySize": "Sort by Size" + }, + "storage": { + "temporaryNotice": "Files are stored temporarily in your browser and may be cleared automatically", + "storageLimit": "Storage limit", + "storageUsed": "Temporary Storage used", + "storageFull": "Storage is nearly full. Consider removing some files.", + "fileTooLarge": "File too large. Maximum size per file is", + "storageQuotaExceeded": "Storage quota exceeded. Please remove some files before uploading more.", + "approximateSize": "Approximate size" }, "sanitize": { + "title": "Sanitise", + "desc": "Remove potentially harmful elements from PDF files.", "submit": "ДĐĩСиĐŊŅ„ĐĩĐēŅ‚Đ¸Ņ€Đ°Đš PDF", + "completed": "Sanitisation completed successfully", + "error": { + "generic": "Sanitisation failed", + "failed": "An error occurred while sanitising the PDF." + }, + "filenamePrefix": "sanitised", + "sanitizationResults": "Sanitisation Results", "steps": { - "settings": "ĐĐ°ŅŅ‚Ņ€ĐžĐšĐēи" + "files": "Files", + "settings": "ĐĐ°ŅŅ‚Ņ€ĐžĐšĐēи", + "results": "Results" + }, + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "options": { + "title": "Sanitisation Options", + "note": "Select the elements you want to remove from the PDF. At least one option must be selected.", + "removeJavaScript": { + "label": "Remove JavaScript", + "desc": "Remove JavaScript actions and scripts from the PDF" + }, + "removeEmbeddedFiles": { + "label": "Remove Embedded Files", + "desc": "Remove any files embedded within the PDF" + }, + "removeXMPMetadata": { + "label": "Remove XMP Metadata", + "desc": "Remove XMP metadata from the PDF" + }, + "removeMetadata": { + "label": "Remove Document Metadata", + "desc": "Remove document information metadata (title, author, etc.)" + }, + "removeLinks": { + "label": "Remove Links", + "desc": "Remove external links and launch actions from the PDF" + }, + "removeFonts": { + "label": "Remove Fonts", + "desc": "Remove embedded fonts from the PDF" + } + } + }, + "addPassword": { + "title": "Đ”ĐžĐąĐ°Đ˛ŅĐŊĐĩ ĐŊа ĐŋĐ°Ņ€ĐžĐģа", + "desc": "Encrypt your PDF document with a password.", + "completed": "Password protection applied", + "submit": "Đ¨Đ¸Ņ„Ņ€ĐžĐ˛Đ°ĐŊĐĩ", + "filenamePrefix": "encrypted", + "error": { + "failed": "An error occurred while encrypting the PDF." + }, + "passwords": { + "stepTitle": "Passwords & Encryption", + "completed": "Passwords configured", + "user": { + "label": "User Password", + "placeholder": "Enter user password" + }, + "owner": { + "label": "Owner Password", + "placeholder": "Enter owner password" + } + }, + "encryption": { + "keyLength": { + "label": "Encryption Key Length", + "40bit": "40-bit (Low)", + "128bit": "128-bit (Standard)", + "256bit": "256-bit (High)" + } + }, + "results": { + "title": "Encrypted PDFs" + }, + "tooltip": { + "header": { + "title": "Password Protection Overview" + }, + "passwords": { + "title": "Password Types", + "text": "User passwords restrict opening the document, while owner passwords control what can be done with the document once opened. You can set both or just one.", + "bullet1": "User Password: Required to open the PDF", + "bullet2": "Owner Password: Controls document permissions (not supported by all PDF viewers)" + }, + "encryption": { + "title": "Encryption Levels", + "text": "Higher encryption levels provide better security but may not be supported by older PDF viewers.", + "bullet1": "40-bit: Basic security, compatible with older viewers", + "bullet2": "128-bit: Standard security, widely supported", + "bullet3": "256-bit: Maximum security, requires modern viewers" + }, + "permissions": { + "title": "ĐŸŅ€ĐžĐŧŅĐŊа ĐŊа ĐŋŅ€Đ°Đ˛Đ°Ņ‚Đ°", + "text": "These permissions control what users can do with the PDF. Most effective when combined with an owner password." + } + }, + "tags": "ŅĐ¸ĐŗŅƒŅ€ĐĩĐŊ,ŅĐ¸ĐŗŅƒŅ€ĐŊĐžŅŅ‚", + "header": "Đ”ĐžĐąĐ°Đ˛ŅĐŊĐĩ ĐŊа ĐŋĐ°Ņ€ĐžĐģа (Đ¨Đ¸Ņ„Ņ€ĐžĐ˛Đ°ĐŊĐĩ)", + "selectText": { + "1": "ИСйĐĩŅ€ĐĩŅ‚Đĩ PDF, ĐēĐžĐšŅ‚Đž да ŅˆĐ¸Ņ„Ņ€ĐžĐ˛Đ°Ņ‚Đĩ", + "2": "ĐŸĐžŅ‚Ņ€ĐĩĐąĐ¸Ņ‚ĐĩĐģҁĐēа ĐŋĐ°Ņ€ĐžĐģа", + "3": "ĐŸŅ€ĐĩĐ´ĐžŅ‚Đ˛Ņ€Đ°Ņ‚ŅĐ˛Đ°ĐŊĐĩ ĐŊа ŅĐŗĐģĐžĐąŅĐ˛Đ°ĐŊĐĩŅ‚Đž ĐŊа Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚", + "4": "По-Đ˛Đ¸ŅĐžĐēĐ¸Ņ‚Đĩ ŅŅ‚ĐžĐšĐŊĐžŅŅ‚Đ¸ ŅĐ° ĐŋĐž-ŅĐ¸ĐģĐŊи, ĐŊĐž ĐŋĐž-ĐŊĐ¸ŅĐēĐ¸Ņ‚Đĩ ŅŅ‚ĐžĐšĐŊĐžŅŅ‚Đ¸ иĐŧĐ°Ņ‚ ĐŋĐž-Đ´ĐžĐąŅ€Đ° ŅŅŠĐ˛ĐŧĐĩŅŅ‚Đ¸ĐŧĐžŅŅ‚.", + "5": "Đ Đ°ĐˇŅ€Đĩ҈ĐĩĐŊĐ¸Ņ Са СадаваĐŊĐĩ (ĐŋŅ€ĐĩĐŋĐžŅ€ŅŠŅ‡Đ˛Đ° ҁĐĩ да ҁĐĩ иСĐŋĐžĐģСва СаĐĩĐ´ĐŊĐž ҁ ĐŋĐ°Ņ€ĐžĐģĐ°Ņ‚Đ° ĐŊа ŅĐžĐąŅŅ‚Đ˛ĐĩĐŊиĐēа)", + "6": "ĐŸŅ€ĐĩĐ´ĐžŅ‚Đ˛Ņ€Đ°Ņ‚ŅĐ˛Đ°ĐŊĐĩ ĐŊа ŅĐŗĐģĐžĐąŅĐ˛Đ°ĐŊĐĩŅ‚Đž ĐŊа Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚", + "7": "ĐŸŅ€ĐĩĐ´ĐžŅ‚Đ˛Ņ€Đ°Ņ‚ĐĩŅ‚Đĩ иСвĐģĐ¸Ņ‡Đ°ĐŊĐĩŅ‚Đž ĐŊа ŅŅŠĐ´ŅŠŅ€ĐļаĐŊиĐĩ", + "8": "ĐŸŅ€ĐĩĐ´ĐžŅ‚Đ˛Ņ€Đ°Ņ‚ĐĩŅ‚Đĩ иСвĐģĐ¸Ņ‡Đ°ĐŊĐĩŅ‚Đž Са Đ´ĐžŅŅ‚ŅŠĐŋĐŊĐžŅŅ‚", + "9": "ĐŸŅ€ĐĩĐ´ĐžŅ‚Đ˛Ņ€Đ°Ņ‚ŅĐ˛Đ°ĐŊĐĩ ĐŊа ĐŋĐžĐŋҊĐģваĐŊĐĩ ĐŊа Ņ„ĐžŅ€Đŧ҃ĐģŅŅ€", + "10": "ĐŸŅ€ĐĩĐ´ĐžŅ‚Đ˛Ņ€Đ°Ņ‚ŅĐ˛Đ°ĐŊĐĩ ĐŊа ĐŋŅ€ĐžĐŧĐĩĐŊи", + "11": "ĐŸŅ€ĐĩĐ´ĐžŅ‚Đ˛Ņ€Đ°Ņ‚ŅĐ˛Đ°ĐŊĐĩ ĐŊа ĐŋŅ€ĐžĐŧĐĩĐŊи ĐŊа аĐŊĐžŅ‚Đ°Ņ†Đ¸Ņ", + "12": "ĐŸŅ€ĐĩĐ´ĐžŅ‚Đ˛Ņ€Đ°Ņ‚ŅĐ˛Đ°ĐŊĐĩ ĐŊа ĐŋĐĩŅ‡Đ°Ņ‚", + "13": "ĐŸŅ€ĐĩĐ´ĐžŅ‚Đ˛Ņ€Đ°Ņ‚ĐĩŅ‚Đĩ ĐžŅ‚ĐŋĐĩŅ‡Đ°Ņ‚Đ˛Đ°ĐŊĐĩŅ‚Đž в Ņ€Đ°ĐˇĐģĐ¸Ņ‡ĐŊи Ņ„ĐžŅ€ĐŧĐ°Ņ‚Đ¸", + "14": "ĐŸĐ°Ņ€ĐžĐģа ĐŊа ŅĐžĐąŅŅ‚Đ˛ĐĩĐŊиĐēа", + "15": "ĐžĐŗŅ€Đ°ĐŊĐ¸Ņ‡Đ°Đ˛Đ° ĐēаĐēвО ĐŧĐžĐļĐĩ да ҁĐĩ ĐŋŅ€Đ°Đ˛Đ¸ ҁ Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ°, ҁĐģĐĩĐ´ ĐēĐ°Ņ‚Đž ĐąŅŠĐ´Đĩ ĐžŅ‚Đ˛ĐžŅ€ĐĩĐŊ (ĐŊĐĩ ҁĐĩ ĐŋĐžĐ´Đ´ŅŠŅ€Đļа ĐžŅ‚ Đ˛ŅĐ¸Ņ‡Đēи ҇ĐĩŅ‚Ņ†Đ¸)", + "16": "ĐžĐŗŅ€Đ°ĐŊĐ¸Ņ‡Đ°Đ˛Đ° ĐžŅ‚Đ˛Đ°Ņ€ŅĐŊĐĩŅ‚Đž ĐŊа ŅĐ°ĐŧĐ¸Ņ Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚" } }, "changePermissions": { "title": "ĐŸŅ€ĐžĐŧŅĐŊа ĐŊа ĐŋŅ€Đ°Đ˛Đ°Ņ‚Đ°", + "desc": "Change document restrictions and permissions.", + "completed": "Permissions changed", "submit": "ĐŸŅ€ĐžĐŧŅĐŊа ĐŊа ĐŋŅ€Đ°Đ˛Đ°Ņ‚Đ°", + "error": { + "failed": "An error occurred while changing PDF permissions." + }, "permissions": { "preventAssembly": { "label": "ĐŸŅ€ĐĩĐ´ĐžŅ‚Đ˛Ņ€Đ°Ņ‚ŅĐ˛Đ°ĐŊĐĩ ĐŊа ŅĐŗĐģĐžĐąŅĐ˛Đ°ĐŊĐĩŅ‚Đž ĐŊа Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚" @@ -1736,10 +4580,784 @@ "label": "ĐŸŅ€ĐĩĐ´ĐžŅ‚Đ˛Ņ€Đ°Ņ‚ĐĩŅ‚Đĩ ĐžŅ‚ĐŋĐĩŅ‡Đ°Ņ‚Đ˛Đ°ĐŊĐĩŅ‚Đž ĐŊа Ņ€Đ°ĐˇĐģĐ¸Ņ‡ĐŊи Ņ„ĐžŅ€ĐŧĐ°Ņ‚Đ¸" } }, + "results": { + "title": "Modified PDFs" + }, "tooltip": { "header": { "title": "ĐŸŅ€ĐžĐŧŅĐŊа ĐŊа ĐŋŅ€Đ°Đ˛Đ°Ņ‚Đ°" + }, + "description": { + "text": "Changes document permissions, allowing/disallowing access to different features in PDF readers." + }, + "warning": { + "text": "To make these permissions unchangeable, use the Add Password tool to set an owner password." } } + }, + "removePassword": { + "title": "ĐŸŅ€ĐĩĐŧĐ°Ņ…Đ˛Đ°ĐŊĐĩ ĐŊа ĐŋĐ°Ņ€ĐžĐģĐ°Ņ‚Đ°", + "desc": "ĐŸŅ€ĐĩĐŧĐ°Ņ…ĐŊĐĩŅ‚Đĩ ĐˇĐ°Ņ‰Đ¸Ņ‚Đ°Ņ‚Đ° ҁ ĐŋĐ°Ņ€ĐžĐģа ĐžŅ‚ Đ˛Đ°ŅˆĐ¸Ņ PDF Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚.", + "tags": "ŅĐ¸ĐŗŅƒŅ€ĐŊĐž,Đ´ĐĩĐēŅ€Đ¸ĐŋŅ‚Đ¸Ņ€Đ°ĐŊĐĩ,ŅĐ¸ĐŗŅƒŅ€ĐŊĐžŅŅ‚,ĐžŅ‚ĐŧŅĐŊа ĐŊа ĐŋĐ°Ņ€ĐžĐģа,Đ¸ĐˇŅ‚Ņ€Đ¸Đ˛Đ°ĐŊĐĩ ĐŊа ĐŋĐ°Ņ€ĐžĐģа", + "password": { + "stepTitle": "ĐŸŅ€ĐĩĐŧĐ°Ņ…Đ˛Đ°ĐŊĐĩ ĐŊа ĐŋĐ°Ņ€ĐžĐģа", + "label": "ĐĸĐĩĐēŅƒŅ‰Đ° ĐŋĐ°Ņ€ĐžĐģа", + "placeholder": "Enter current password", + "completed": "Password configured" + }, + "filenamePrefix": "decrypted", + "error": { + "failed": "An error occurred while removing the password from the PDF." + }, + "tooltip": { + "description": "Removing password protection requires the password that was used to encrypt the PDF. This will decrypt the document, making it accessible without a password." + }, + "submit": "ĐŸŅ€ĐĩĐŧĐ°Ņ…Đ˛Đ°ĐŊĐĩ", + "results": { + "title": "Decrypted PDFs" + }, + "header": "ĐŸŅ€ĐĩĐŧĐ°Ņ…Đ˛Đ°ĐŊĐĩ ĐŊа ĐŋĐ°Ņ€ĐžĐģĐ°Ņ‚Đ° (ДĐĩĐēŅ€Đ¸ĐŋŅ‚Đ¸Ņ€Đ°ĐŊĐĩ)", + "selectText": { + "1": "ИСйĐĩŅ€ĐĩŅ‚Đĩ PDF Са ДĐĩĐēŅ€Đ¸ĐŋŅ‚Đ¸Ņ€Đ°ĐŊĐĩ", + "2": "ĐŸĐ°Ņ€ĐžĐģа" + } + }, + "automate": { + "title": "Automate", + "desc": "Build multi-step workflows by chaining together PDF actions. Ideal for recurring tasks.", + "invalidStep": "Invalid step", + "files": { + "placeholder": "Select files to process with this automation" + }, + "selection": { + "title": "Automation Selection", + "saved": { + "title": "Saved" + }, + "createNew": { + "title": "Create New Automation" + }, + "suggested": { + "title": "Suggested" + } + }, + "creation": { + "createTitle": "Create Automation", + "editTitle": "Edit Automation", + "intro": "Automations run tools sequentially. To get started, add tools in the order you want them to run.", + "name": { + "label": "Automation Name", + "placeholder": "My Automation" + }, + "description": { + "label": "Description (optional)", + "placeholder": "Describe what this automation does..." + }, + "tools": { + "selectTool": "Select a tool...", + "selected": "Selected Tools", + "remove": "Remove tool", + "configure": "Configure tool", + "notConfigured": "! Not Configured", + "addTool": "Add Tool", + "add": "Add a tool..." + }, + "save": "Save Automation", + "unsavedChanges": { + "title": "Unsaved Changes", + "message": "You have unsaved changes. Are you sure you want to go back? All changes will be lost.", + "cancel": "Cancel", + "confirm": "Go Back" + }, + "icon": { + "label": "Icon" + } + }, + "run": { + "title": "Run Automation" + }, + "sequence": { + "unnamed": "Unnamed Automation", + "steps": "{{count}} steps", + "running": "Running Automation...", + "run": "Run Automation", + "finish": "Finish" + }, + "reviewTitle": "Automation Results", + "config": { + "loading": "Loading tool configuration...", + "noSettings": "This tool does not have configurable settings.", + "title": "Configure {{toolName}}", + "description": "Configure the settings for this tool. These settings will be applied when the automation runs.", + "cancel": "Cancel", + "save": "Save Configuration" + }, + "copyToSaved": "Copy to Saved" + }, + "automation": { + "suggested": { + "securePdfIngestion": "Secure PDF Ingestion", + "securePdfIngestionDesc": "Comprehensive PDF processing workflow that sanitises documents, applies OCR with cleanup, converts to PDF/A format for long-term archival, and optimises file size.", + "emailPreparation": "Email Preparation", + "emailPreparationDesc": "Optimises PDFs for email distribution by compressing files, splitting large documents into 20MB chunks for email compatibility, and removing metadata for privacy.", + "secureWorkflow": "Security Workflow", + "secureWorkflowDesc": "Secures PDF documents by removing potentially malicious content like JavaScript and embedded files, then adds password protection to prevent unauthorised access. Password is set to 'password' by default.", + "processImages": "Process Images", + "processImagesDesc": "Converts multiple image files into a single PDF document, then applies OCR technology to extract searchable text from the images." + } + }, + "common": { + "copy": "Copy", + "copied": "Copied!", + "refresh": "Refresh", + "retry": "Retry", + "remaining": "remaining", + "used": "used", + "available": "available", + "cancel": "Cancel", + "preview": "Preview" + }, + "config": { + "overview": { + "title": "Application Configuration", + "description": "Current application settings and configuration details." + }, + "account": { + "overview": { + "title": "Account Settings", + "manageAccountPreferences": "Manage your account preferences", + "guestDescription": "You are signed in as a guest. Consider upgrading your account above." + }, + "upgrade": { + "title": "Upgrade Guest Account", + "description": "Link your account to preserve your history and access more features!", + "socialLogin": "Upgrade with Social Account", + "linkWith": "Link with", + "emailPassword": "or enter your email & password", + "email": "Email", + "emailPlaceholder": "Enter your email", + "password": "Password (optional)", + "passwordPlaceholder": "Set a password", + "passwordNote": "Leave empty to use email verification only", + "upgradeButton": "Upgrade Account" + } + }, + "apiKeys": { + "description": "Your API key for accessing Stirling's suite of PDF tools. Copy it to your project or refresh to generate a new one.", + "publicKeyAriaLabel": "Public API key", + "copyKeyAriaLabel": "Copy API key", + "refreshAriaLabel": "Refresh API key", + "includedCredits": "Included credits", + "purchasedCredits": "Purchased credits", + "totalCredits": "Total Credits", + "chartAriaLabel": "Credits usage: included {{includedUsed}} of {{includedTotal}}, purchased {{purchasedUsed}} of {{purchasedTotal}}", + "nextReset": "Next Reset", + "lastApiUse": "Last API Use", + "overlayMessage": "Generate a key to see credits and available credits", + "label": "API Key", + "guestInfo": "Guest users do not receive API keys. Create an account to get an API key you can use in your applications.", + "goToAccount": "Go to Account", + "refreshModal": { + "title": "Refresh API Keys", + "warning": "âš ī¸ Warning: This action will generate new API keys and make your previous keys invalid.", + "impact": "Any applications or services currently using these keys will stop working until you update them with the new keys.", + "confirmPrompt": "Are you sure you want to continue?", + "confirmCta": "Refresh Keys" + }, + "generateError": "We couldn't generate your API key." + } + }, + "AddAttachmentsRequest": { + "attachments": "Select Attachments", + "info": "Select files to attach to your PDF. These files will be embedded and accessible through the PDF's attachment panel.", + "selectFiles": "Select Files to Attach", + "placeholder": "Choose files...", + "addMoreFiles": "Add more files...", + "selectedFiles": "Selected Files", + "submit": "Add Attachments", + "results": { + "title": "Attachment Results" + }, + "error": { + "failed": "Add attachments operation failed" + } + }, + "termsAndConditions": "Terms & Conditions", + "logOut": "Log out", + "addAttachments": { + "error": { + "failed": "An error occurred while adding attachments to the PDF." + } + }, + "autoRename": { + "description": "This tool will automatically rename PDF files based on their content. It analyzes the document to find the most suitable title from the text." + }, + "customPosition": "Custom Position", + "details": "Details", + "downloadUnavailable": "Download unavailable for this item", + "invalidUndoData": "Cannot undo: invalid operation data", + "margin": { + "large": "Large", + "medium": "Medium", + "small": "Small", + "xLarge": "Extra Large" + }, + "noFilesToUndo": "Cannot undo: no files were processed in the last operation", + "noOperationToUndo": "No operation to undo", + "noValidFiles": "No valid files to process", + "operationCancelled": "Operation cancelled", + "pageEdit": { + "deselectAll": "Select None", + "selectAll": "Select All" + }, + "quickPosition": "Quick Position", + "reorganizePages": { + "error": { + "failed": "Failed to reorganize pages" + }, + "results": { + "title": "Pages Reorganized" + }, + "settings": { + "title": "Settings" + }, + "submit": "Reorganize Pages" + }, + "replace-color": { + "options": { + "fill": "Fill colour", + "gradient": "Gradient" + }, + "previewOverlayOpacity": "Preview overlay opacity", + "previewOverlayTransparency": "Preview overlay transparency", + "previewOverlayVisibility": "Show preview overlay", + "selectText": { + "1": "ОĐŋŅ†Đ¸Đ¸ Са СаĐŧŅĐŊа иĐģи иĐŊвĐĩŅ€Ņ‚Đ¸Ņ€Đ°ĐŊĐĩ ĐŊа Ņ†Đ˛ŅŅ‚", + "2": "По ĐŋĐžĐ´Ņ€Đ°ĐˇĐąĐ¸Ņ€Đ°ĐŊĐĩ (Ņ†Đ˛ĐĩŅ‚ĐžĐ˛Đĩ ҁ Đ˛Đ¸ŅĐžĐē ĐēĐžĐŊŅ‚Ņ€Đ°ŅŅ‚ ĐŋĐž ĐŋĐžĐ´Ņ€Đ°ĐˇĐąĐ¸Ņ€Đ°ĐŊĐĩ)", + "3": "По Đ¸ĐˇĐąĐžŅ€ (ĐŋĐĩŅ€ŅĐžĐŊаĐģĐ¸ĐˇĐ¸Ņ€Đ°ĐŊи Ņ†Đ˛ĐĩŅ‚ĐžĐ˛Đĩ)", + "4": "ĐŸŅŠĐģĐŊĐž иĐŊвĐĩŅ€Ņ‚Đ¸Ņ€Đ°ĐŊĐĩ (ИĐŊвĐĩŅ€Ņ‚Đ¸Ņ€Đ°ĐŊĐĩ ĐŊа Đ˛ŅĐ¸Ņ‡Đēи Ņ†Đ˛ĐĩŅ‚ĐžĐ˛Đĩ)", + "5": "ĐĻвĐĩŅ‚ĐžĐ˛Đ¸ ĐžĐŋŅ†Đ¸Đ¸ ҁ Đ˛Đ¸ŅĐžĐē ĐēĐžĐŊŅ‚Ņ€Đ°ŅŅ‚", + "6": "Đ‘ŅĐģ Ņ‚ĐĩĐēҁ҂ ĐŊа ҇ĐĩŅ€ĐĩĐŊ Ņ„ĐžĐŊ", + "7": "ЧĐĩŅ€ĐĩĐŊ Ņ‚ĐĩĐēҁ҂ ĐŊа ĐąŅĐģ Ņ„ĐžĐŊ", + "8": "Đ–ŅŠĐģŅ‚ Ņ‚ĐĩĐēҁ҂ ĐŊа ҇ĐĩŅ€ĐĩĐŊ Ņ„ĐžĐŊ", + "9": "ЗĐĩĐģĐĩĐŊ Ņ‚ĐĩĐēҁ҂ ĐŊа ҇ĐĩŅ€ĐĩĐŊ Ņ„ĐžĐŊ", + "10": "ИСйĐĩŅ€ĐĩŅ‚Đĩ Ņ†Đ˛ŅŅ‚ ĐŊа Ņ‚ĐĩĐēŅŅ‚Đ°", + "11": "ИСйĐĩŅ€ĐĩŅ‚Đĩ Ņ†Đ˛ŅŅ‚ ĐŊа Ņ„ĐžĐŊа", + "12": "Choose start colour", + "13": "Choose end colour" + }, + "submit": "ЗаĐŧĐĩĐŊи", + "title": "ЗаĐŧĐĩĐŊи-иĐŊвĐĩŅ€Ņ‚Đ¸Ņ€Đ°ĐŊĐĩ-ĐŊа-Ņ†Đ˛ŅŅ‚", + "header": "ЗаĐŧŅĐŊа-иĐŊвĐĩŅ€Ņ‚Đ¸Ņ€Đ°ĐŊĐĩ ĐŊа Ņ†Đ˛ŅŅ‚ PDF" + }, + "size": "Size", + "submit": "Submit", + "success": "Success", + "tools": { + "noSearchResults": "No tools found", + "noTools": "No tools available" + }, + "undoDataMismatch": "Cannot undo: operation data is corrupted", + "undoFailed": "Failed to undo operation", + "undoQuotaError": "Cannot undo: insufficient storage space", + "undoStorageError": "Undo completed but some files could not be saved to storage", + "undoSuccess": "Operation undone successfully", + "unsupported": "Unsupported", + "onboarding": { + "welcomeModal": { + "title": "Welcome to Stirling PDF!", + "description": "Would you like to take a quick 1-minute tour to learn the key features and how to get started?", + "helpHint": "You can always access this tour later from the Help button in the bottom left.", + "startTour": "Start Tour", + "maybeLater": "Maybe Later", + "dontShowAgain": "Don't Show Again" + }, + "allTools": "This is the All Tools panel, where you can browse and select from all available PDF tools.", + "selectCropTool": "Let's select the Crop tool to demonstrate how to use one of the tools.", + "toolInterface": "This is the Crop tool interface. As you can see, there's not much there because we haven't added any PDF files to work with yet.", + "filesButton": "The Files button on the Quick Access bar allows you to upload PDFs to use the tools on.", + "fileSources": "You can upload new files or access recent files from here. For the tour, we'll just use a sample file.", + "workbench": "This is the Workbench - the main area where you view and edit your PDFs.", + "viewSwitcher": "Use these controls to select how you want to view your PDFs.", + "viewer": "The Viewer lets you read and annotate your PDFs.", + "pageEditor": "The Page Editor allows you to do various operations on the pages within your PDFs, such as reordering, rotating and deleting.", + "activeFiles": "The Active Files view shows all of the PDFs you have loaded into the tool, and allows you to select which ones to process.", + "fileCheckbox": "Clicking one of the files selects it for processing. You can select multiple files for batch operations.", + "selectControls": "The Right Rail contains buttons to quickly select/deselect all of your active PDFs, along with buttons to change the app's theme or language.", + "cropSettings": "Now that we've selected the file we want crop, we can configure the Crop tool to choose the area that we want to crop the PDF to.", + "runButton": "Once the tool has been configured, this button allows you to run the tool on all the selected PDFs.", + "results": "After the tool has finished running, the Review step will show a preview of the results in this panel, and allow you to undo the operation or download the file. ", + "fileReplacement": "The modified file will replace the original file in the Workbench automatically, allowing you to easily run it through more tools.", + "pinButton": "You can use the Pin button if you'd rather your files stay active after running tools on them.", + "wrapUp": "You're all set! You've learnt about the main areas of the app and how to use them. Click the Help button whenever you like to see this tour again.", + "previous": "Previous", + "next": "Next", + "finish": "Finish", + "startTour": "Start Tour", + "startTourDescription": "Take a guided tour of Stirling PDF's key features" + }, + "workspace": { + "title": "Workspace", + "people": { + "title": "People", + "description": "Manage workspace members and their permissions", + "loading": "Loading people...", + "searchMembers": "Search members...", + "addMembers": "Add Members", + "inviteMembers": { + "label": "Invite Members", + "subtitle": "Type or paste in emails below, separated by commas. Your workspace will be billed by members." + }, + "user": "User", + "role": "Role", + "team": "Team", + "status": "Status", + "actions": "Actions", + "noMembersFound": "No members found", + "active": "Active", + "disabled": "Disabled", + "activeSession": "Active session", + "member": "Member", + "admin": "Admin", + "roleDescriptions": { + "admin": "Can manage settings and invite members, with full administrative access.", + "member": "Can view and edit shared files, but cannot manage workspace settings or members." + }, + "editRole": "Edit Role", + "enable": "Enable", + "disable": "Disable", + "deleteUser": "Delete User", + "deleteUserSuccess": "User deleted successfully", + "deleteUserError": "Failed to delete user", + "confirmDelete": "Are you sure you want to delete this user? This action cannot be undone.", + "addMember": { + "title": "Add Member", + "username": "Username (Email)", + "usernamePlaceholder": "user@example.com", + "password": "Password", + "passwordPlaceholder": "Enter password", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "forcePasswordChange": "Force password change on first login", + "cancel": "Cancel", + "submit": "Add Member", + "usernameRequired": "Username and password are required", + "passwordTooShort": "Password must be at least 6 characters", + "success": "User created successfully", + "error": "Failed to create user" + }, + "editMember": { + "title": "Edit Member", + "editing": "Editing:", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "cancel": "Cancel", + "submit": "Update Member", + "success": "User updated successfully", + "error": "Failed to update user" + }, + "toggleEnabled": { + "success": "User status updated successfully", + "error": "Failed to update user status" + }, + "delete": { + "success": "User deleted successfully", + "error": "Failed to delete user" + }, + "emailInvite": { + "tab": "Email Invite", + "description": "Type or paste in emails below, separated by commas. Users will receive login credentials via email.", + "emails": "Email Addresses", + "emailsPlaceholder": "user1@example.com, user2@example.com", + "emailsRequired": "At least one email address is required", + "submit": "Send Invites", + "success": "user(s) invited successfully", + "partialSuccess": "Some invites failed", + "allFailed": "Failed to invite users", + "error": "Failed to send invites" + }, + "directInvite": { + "tab": "Direct Create" + }, + "inviteLinkTab": { + "tab": "Invite Link" + }, + "inviteLink": { + "description": "Generate a secure link that allows the user to set their own password", + "email": "Email Address", + "emailPlaceholder": "user@example.com (optional)", + "emailDescription": "Optional - leave blank for a general invite link that can be used by anyone", + "emailRequired": "Email address is required", + "emailOptional": "Optional - leave blank for a general invite link", + "emailRequiredForSend": "Email address is required to send email notification", + "expiryHours": "Expiry Hours", + "expiryDescription": "How many hours until the link expires", + "sendEmail": "Send invite link via email", + "sendEmailDescription": "If enabled, the invite link will be sent to the specified email address", + "smtpRequired": "SMTP not configured", + "generate": "Generate Link", + "generated": "Invite Link Generated", + "copied": "Link copied to clipboard", + "success": "Invite link generated successfully", + "successWithEmail": "Invite link generated and sent via email", + "emailFailed": "Invite link generated, but email failed", + "emailFailedDetails": "Error: {0}. Please share the invite link manually.", + "error": "Failed to generate invite link", + "submit": "Generate Invite Link" + }, + "inviteMode": { + "username": "Username", + "email": "Email", + "link": "Link", + "emailDisabled": "Email invites require SMTP configuration and mail.enableInvites=true in settings" + }, + "license": { + "users": "users", + "availableSlots": "Available Slots", + "grandfathered": "Grandfathered", + "grandfatheredShort": "{{count}} grandfathered", + "fromLicense": "from license", + "slotsAvailable": "{{count}} user slot(s) available", + "noSlotsAvailable": "No slots available", + "currentUsage": "Currently using {{current}} of {{max}} user licences" + } + }, + "teams": { + "title": "Teams", + "description": "Manage teams and organize workspace members", + "loading": "Loading teams...", + "loadingDetails": "Loading team details...", + "createNewTeam": "Create New Team", + "teamName": "Team Name", + "totalMembers": "Total Members", + "actions": "Actions", + "noTeamsFound": "No teams found", + "noMembers": "No members in this team", + "system": "System", + "addMember": "Add Member", + "viewTeam": "View Team", + "removeMember": "Remove from team", + "cannotRemoveFromSystemTeam": "Cannot remove from system team", + "renameTeamLabel": "Rename Team", + "deleteTeamLabel": "Delete Team", + "cannotDeleteInternal": "Cannot delete the Internal team", + "confirmDelete": "Are you sure you want to delete this team? This team must be empty to delete.", + "confirmRemove": "Remove user from this team?", + "cannotRenameInternal": "Cannot rename the Internal team", + "cannotAddToInternal": "Cannot add members to the Internal team", + "teamNotFound": "Team not found", + "backToTeams": "Back to Teams", + "memberCount": "{{count}} members", + "removeMemberSuccess": "User removed from team", + "removeMemberError": "Failed to remove user from team", + "createTeam": { + "title": "Create New Team", + "teamName": "Team Name", + "teamNamePlaceholder": "Enter team name", + "cancel": "Cancel", + "submit": "Create Team", + "nameRequired": "Team name is required", + "success": "Team created successfully", + "error": "Failed to create team" + }, + "renameTeam": { + "title": "Rename Team", + "renaming": "Renaming:", + "newTeamName": "New Team Name", + "newTeamNamePlaceholder": "Enter new team name", + "cancel": "Cancel", + "submit": "Rename Team", + "nameRequired": "Team name is required", + "success": "Team renamed successfully", + "error": "Failed to rename team" + }, + "deleteTeam": { + "success": "Team deleted successfully", + "error": "Failed to delete team. Make sure the team is empty.", + "teamMustBeEmpty": "Team must be empty before deletion" + }, + "addMemberToTeam": { + "title": "Add Member to Team", + "addingTo": "Adding to", + "selectUser": "Select User", + "selectUserPlaceholder": "Choose a user", + "selectUserRequired": "Please select a user", + "currentlyIn": "currently in", + "willBeMoved": "Note: This user will be moved from their current team to this team.", + "cancel": "Cancel", + "submit": "Add Member", + "userRequired": "Please select a user", + "success": "Member added to team successfully", + "error": "Failed to add member to team" + }, + "changeTeam": { + "label": "Change Team", + "title": "Change Team", + "changing": "Moving", + "selectTeam": "Select Team", + "selectTeamPlaceholder": "Choose a team", + "selectTeamRequired": "Please select a team", + "success": "Team changed successfully", + "error": "Failed to change team", + "submit": "Change Team" + } + } + }, + "plan": { + "currency": "Currency", + "popular": "Popular", + "current": "Current Plan", + "upgrade": "Upgrade", + "contact": "Contact Us", + "customPricing": "Custom", + "showComparison": "Compare All Features", + "hideComparison": "Hide Feature Comparison", + "featureComparison": "Feature Comparison", + "activePlan": { + "title": "Active Plan", + "subtitle": "Your current subscription details" + }, + "availablePlans": { + "title": "Available Plans", + "subtitle": "Choose the plan that fits your needs" + }, + "static": { + "title": "Billing Information", + "message": "Online billing is not currently configured. To upgrade your plan or manage subscriptions, please contact us directly.", + "contactSales": "Contact Sales", + "contactToUpgrade": "Contact us to upgrade or customize your plan", + "maxUsers": "Max Users", + "upTo": "Up to" + }, + "period": { + "month": "month" + }, + "free": { + "name": "Free", + "highlight1": "Limited Tool Usage Per week", + "highlight2": "Access to all tools", + "highlight3": "Community support" + }, + "pro": { + "name": "Pro", + "highlight1": "Unlimited Tool Usage", + "highlight2": "Advanced PDF tools", + "highlight3": "No watermarks" + }, + "enterprise": { + "name": "Enterprise", + "highlight1": "Custom pricing", + "highlight2": "Dedicated support", + "highlight3": "Latest features" + }, + "feature": { + "title": "Feature", + "pdfTools": "Basic PDF Tools", + "fileSize": "File Size Limit", + "automation": "Automate tool workflows", + "api": "API Access", + "priority": "Priority Support", + "customPricing": "Custom Pricing" + } + }, + "subscription": { + "status": { + "active": "Active", + "pastDue": "Past Due", + "canceled": "Canceled", + "incomplete": "Incomplete", + "trialing": "Trial", + "none": "No Subscription" + }, + "renewsOn": "Renews on {{date}}", + "cancelsOn": "Cancels on {{date}}" + }, + "billing": { + "manageBilling": "Manage Billing", + "portal": { + "error": "Failed to open billing portal" + } + }, + "payment": { + "preparing": "Preparing your checkout...", + "upgradeTitle": "Upgrade to {{planName}}", + "success": "Payment Successful!", + "successMessage": "Your subscription has been activated successfully. You will receive a confirmation email shortly.", + "autoClose": "This window will close automatically...", + "error": "Payment Error" + }, + "firstLogin": { + "title": "First Time Login", + "welcomeTitle": "Welcome!", + "welcomeMessage": "For security reasons, you must change your password on your first login.", + "loggedInAs": "Logged in as", + "error": "Error", + "currentPassword": "Current Password", + "enterCurrentPassword": "Enter your current password", + "newPassword": "New Password", + "enterNewPassword": "Enter new password (min 8 characters)", + "confirmPassword": "Confirm New Password", + "reEnterNewPassword": "Re-enter new password", + "changePassword": "Change Password", + "allFieldsRequired": "All fields are required", + "passwordsDoNotMatch": "New passwords do not match", + "passwordTooShort": "Password must be at least 8 characters", + "passwordMustBeDifferent": "New password must be different from current password", + "passwordChangedSuccess": "Password changed successfully! Please log in again.", + "passwordChangeFailed": "Failed to change password. Please check your current password." + }, + "invite": { + "welcome": "Welcome to Stirling PDF", + "invalidToken": "Invalid invitation link", + "validationError": "Failed to validate invitation link", + "passwordRequired": "Password is required", + "passwordTooShort": "Password must be at least 6 characters", + "passwordMismatch": "Passwords do not match", + "acceptError": "Failed to create account", + "validating": "Validating invitation...", + "invalidInvitation": "Invalid Invitation", + "goToLogin": "Go to Login", + "welcomeTitle": "You've been invited!", + "welcomeSubtitle": "Complete your account setup to get started", + "accountFor": "Creating account for", + "linkExpires": "Link expires", + "email": "Email address", + "emailPlaceholder": "Enter your email address", + "emailRequired": "Email address is required", + "invalidEmail": "Invalid email address", + "choosePassword": "Choose a password", + "passwordPlaceholder": "Enter your password", + "confirmPassword": "Confirm password", + "confirmPasswordPlaceholder": "Re-enter your password", + "createAccount": "Create Account", + "creating": "Creating Account...", + "alreadyHaveAccount": "Already have an account?", + "signIn": "Sign in" + }, + "audit": { + "error": { + "title": "Error loading audit system" + }, + "notAvailable": "Audit system not available", + "notAvailableMessage": "The audit system is not configured or not available.", + "disabled": "Audit logging is disabled", + "disabledMessage": "Enable audit logging in your application configuration to track system events.", + "systemStatus": { + "title": "System Status", + "status": "Audit Logging", + "enabled": "Enabled", + "disabled": "Disabled", + "level": "Audit Level", + "retention": "Retention Period", + "days": "days", + "totalEvents": "Total Events" + }, + "tabs": { + "dashboard": "Dashboard", + "events": "Audit Events", + "export": "Export" + }, + "charts": { + "title": "Audit Dashboard", + "error": "Error loading charts", + "day": "Day", + "week": "Week", + "month": "Month", + "byType": "Events by Type", + "byUser": "Events by User", + "overTime": "Events Over Time" + }, + "events": { + "title": "Audit Events", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "error": "Error loading events", + "noEvents": "No events found", + "timestamp": "Timestamp", + "type": "Type", + "user": "User", + "ipAddress": "IP Address", + "actions": "Actions", + "viewDetails": "View Details", + "eventDetails": "Event Details", + "details": "Details" + }, + "export": { + "title": "Export Audit Data", + "description": "Export audit events to CSV or JSON format. Use filters to limit the exported data.", + "format": "Export Format", + "filters": "Filters (Optional)", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "exportButton": "Export Data", + "error": "Failed to export data" + } + }, + "usage": { + "noData": "No data available", + "error": "Error loading usage statistics", + "noDataMessage": "No usage statistics are currently available.", + "controls": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All", + "refresh": "Refresh", + "dataTypeLabel": "Data Type:", + "dataType": { + "all": "All", + "api": "API", + "ui": "UI" + } + }, + "showing": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All" + }, + "stats": { + "totalEndpoints": "Total Endpoints", + "totalVisits": "Total Visits", + "showing": "Showing", + "selectedVisits": "Selected Visits" + }, + "chart": { + "title": "Endpoint Usage Chart" + }, + "table": { + "title": "Detailed Statistics", + "endpoint": "Endpoint", + "visits": "Visits", + "percentage": "Percentage", + "noData": "No data available" + } + }, + "backendHealth": { + "checking": "Checking backend status...", + "online": "Backend Online", + "offline": "Backend Offline" + }, + "autoRedact": { + "tags": "Đ ĐĩдаĐēŅ‚Đ¸Ņ€Đ°ĐŊĐĩ,ĐĄĐēŅ€Đ¸Đ˛Đ°ĐŊĐĩ,ĐˇĐ°Ņ‚ŅŠĐŧĐŊŅĐ˛Đ°ĐŊĐĩ,҇ĐĩŅ€ĐĩĐŊ,ĐŧĐ°Ņ€ĐēĐĩŅ€,ҁĐēŅ€Đ¸Ņ‚", + "title": "ĐĐ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐž Ņ€ĐĩдаĐēŅ‚Đ¸Ņ€Đ°ĐŊĐĩ", + "header": "ĐĐ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐž Ņ€ĐĩдаĐēŅ‚Đ¸Ņ€Đ°ĐŊĐĩ", + "colorLabel": "ĐĻĐ˛ŅŅ‚", + "textsToRedactLabel": "ĐĸĐĩĐēҁ҂ Са Ņ€ĐĩдаĐēŅ‚Đ¸Ņ€Đ°ĐŊĐĩ (Ņ€Đ°ĐˇĐ´ĐĩĐģĐĩĐŊ ҁ Ņ€ĐĩдОвĐĩ)", + "textsToRedactPlaceholder": "ĐŊаĐŋŅ€Đ¸ĐŧĐĩŅ€: \\nПовĐĩŅ€Đ¸Ņ‚ĐĩĐģĐŊĐž \\nĐĄŅ‚Ņ€ĐžĐŗĐž ҁĐĩĐēŅ€ĐĩŅ‚ĐŊĐž", + "useRegexLabel": "ИСĐŋĐžĐģСваĐŊĐĩ ĐŊа Regex", + "wholeWordSearchLabel": "ĐĸŅŠŅ€ŅĐĩĐŊĐĩ ĐŊа Ņ†ŅĐģĐ°Ņ‚Đ° Đ´ŅƒĐŧа", + "customPaddingLabel": "ПĐĩŅ€ŅĐžĐŊаĐģĐ¸ĐˇĐ¸Ņ€Đ°ĐŊа Đ´ĐžĐŋҊĐģĐŊĐ¸Ņ‚ĐĩĐģĐŊа ĐŋОдĐģĐžĐļĐēа", + "convertPDFToImageLabel": "ĐŸŅ€ĐĩĐžĐąŅ€Đ°ĐˇŅƒĐ˛Đ°ĐŊĐĩ ĐŊа PDF ĐēҊĐŧ PDF-Đ¸ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊиĐĩ (иСĐŋĐžĐģСва ҁĐĩ Са ĐŋŅ€ĐĩĐŧĐ°Ņ…Đ˛Đ°ĐŊĐĩ ĐŊа Ņ‚ĐĩĐēҁ҂ Сад ĐŋĐžĐģĐĩŅ‚Đž)", + "submitButton": "ИСĐŋŅ€Đ°Ņ‰Đ°ĐŊĐĩ" + }, + "replaceColorPdf": { + "tags": "ЗаĐŧŅĐŊа ĐŊа Ņ†Đ˛ŅŅ‚, ĐžĐŋĐĩŅ€Đ°Ņ†Đ¸Đ¸ ĐŊа ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ¸, СадĐĩĐŊ ĐēŅ€Đ°Đš, ŅŅ‚Ņ€Đ°ĐŊа ĐŊа ŅŅŠŅ€Đ˛ŅŠŅ€Đ°" } -} \ No newline at end of file +} diff --git a/frontend/public/locales/ca-CA/translation.json b/frontend/public/locales/ca-CA/translation.json index 5c1540095..c80ab5dee 100644 --- a/frontend/public/locales/ca-CA/translation.json +++ b/frontend/public/locales/ca-CA/translation.json @@ -1,4 +1,40 @@ { + "toolPanel": { + "modePrompt": { + "title": "Choose how you browse tools", + "description": "Preview both layouts and decide how you want to explore Stirling PDF tools.", + "sidebarTitle": "Sidebar mode", + "sidebarDescription": "Keep tools alongside your workspace for quick switching.", + "recommended": "Recommended", + "chooseSidebar": "Use sidebar mode", + "fullscreenTitle": "Fullscreen mode - (legacy)", + "fullscreenDescription": "Browse every tool in a catalogue that covers the workspace until you pick one.", + "chooseFullscreen": "Use fullscreen mode", + "dismiss": "Maybe later" + }, + "fullscreen": { + "showDetails": "Show Details", + "comingSoon": "Coming soon:", + "favorite": "Add to favourites", + "favorites": "Favourites", + "heading": "All tools (fullscreen view)", + "noResults": "Try adjusting your search or toggle descriptions to find what you need.", + "recommended": "Recommended", + "unfavorite": "Remove from favourites" + }, + "placeholder": "Choose a tool to get started", + "toggle": { + "fullscreen": "Switch to fullscreen mode", + "sidebar": "Switch to sidebar mode" + } + }, + "unsavedChanges": "You have unsaved changes to your PDF.", + "areYouSure": "Are you sure you want to leave?", + "unsavedChangesTitle": "Unsaved Changes", + "keepWorking": "Keep Working", + "discardChanges": "Discard & Leave", + "applyAndContinue": "Save & Leave", + "exportAndContinue": "Export & Continue", "language": { "direction": "ltr" }, @@ -18,8 +54,26 @@ "customTextDesc": "Text Personalitzat", "numberPagesDesc": "Pàgines a enumerar, per defecte 'totes', accepta 1-5 o 2,5,9, etc.", "customNumberDesc": "Per defecte {n}, accepta 'Pàgina {n} de {total}', 'Text-{n}', '{filename}-{n}'", - "submit": "Afegir NÃēmeros de Pàgina" + "submit": "Afegir NÃēmeros de Pàgina", + "configuration": "Configuration", + "customize": "Customize Appearance", + "pagesAndStarting": "Pages & Starting Number", + "positionAndPages": "Position & Pages", + "error": { + "failed": "Add page numbers operation failed" + }, + "results": { + "title": "Page Number Results" + }, + "preview": "Position Selection", + "previewDisclaimer": "Preview is approximate. Final output may vary due to PDF font metrics." }, + "pageSelectionPrompt": "SelecciÃŗ de pàgines personalitzada (Introdueix una llista separada per comes de nÃēmeros de pàgina, 1,5,6 o funcions com 2n+1):", + "startingNumberTooltip": "The first number to display. Subsequent pages will increment from this number.", + "marginTooltip": "Distance between the page number and the edge of the page.", + "fontSizeTooltip": "Size of the page number text in points. Larger numbers create bigger text.", + "fontTypeTooltip": "Font family for the page numbers. Choose based on your document style.", + "customTextTooltip": "Optional custom format for page numbers. Use {n} as placeholder for the number. Example: \"Page {n}\" will show \"Page 1\", \"Page 2\", etc.", "pdfPrompt": "Selecciona PDF(s)", "multiPdfPrompt": "Selecciona PDFs (2+)", "multiPdfDropPrompt": "Selecciona (o arrossega) els documents PDF", @@ -30,15 +84,41 @@ "uploadLimitExceededPlural": "are too large. Maximum allowed size is", "processTimeWarning": "Alerta: Aquest procÊs pot tardar 1 minut depenent de la mida de l'arxiu", "pageOrderPrompt": "Ordre de Pàgines (Llista separada per comes) :", - "pageSelectionPrompt": "SelecciÃŗ de pàgines personalitzada (Introdueix una llista separada per comes de nÃēmeros de pàgina, 1,5,6 o funcions com 2n+1):", "goToPage": "Anar", "true": "Verdader", "false": "Fals", "unknown": "Desconegut", + "app": { + "description": "The Free Adobe Acrobat alternative (10M+ Downloads)" + }, "save": "Desa", "saveToBrowser": "Desa al navegador", + "download": "Descarrega", + "pin": "Pin File (keep active after tool run)", + "unpin": "Unpin File (replace after tool run)", + "undoOperationTooltip": "Click to undo the last operation and restore the original files", + "undo": "Undo", + "moreOptions": "More Options", + "editYourNewFiles": "Edit your new file(s)", "close": "Tanca", + "openInViewer": "Open in Viewer", + "confirmClose": "Confirm Close", + "confirmCloseMessage": "Are you sure you want to close this file?", + "confirmCloseCancel": "Cancel", + "confirmCloseConfirm": "Close File", + "fileSelected": "Selected: {{filename}}", + "chooseFile": "Choose File", "filesSelected": "fitxers seleccionats", + "files": { + "title": "Files", + "upload": "Upload", + "uploadFiles": "Upload Files", + "addFiles": "Add files", + "selectFromWorkbench": "Select files from the workbench or ", + "selectMultipleFromWorkbench": "Select at least {{count}} files from the workbench or ", + "created": "Created", + "size": "File Size" + }, "noFavourites": "No s'ha afegit cap favorit", "downloadComplete": "Descarrega completa", "bored": "Avorrit esperant?", @@ -56,7 +136,10 @@ }, "error": { "pdfPassword": "El PDF està protegit o bÊ el password Ês incorrecte", + "encryptedPdfMustRemovePassword": "This PDF is encrypted or password-protected. Please unlock it before converting to PDF/A.", + "incorrectPasswordProvided": "The PDF password is incorrect or not provided.", "_value": "Error", + "dismissAllErrors": "Dismiss All Errors", "sorry": "Ho sentim pel problema!", "needHelp": "Necessites ajuda / Has trobat un problema?", "contactTip": "Si encara tens problemes, no dubtis a contactar-nos per a ajuda. Pots enviar una sol¡licitud a la nostra pàgina de GitHub o contactar-nos a travÊs de Discord:", @@ -71,6 +154,10 @@ "githubSubmit": "GitHub - Envia una sol¡licitud", "discordSubmit": "Discord - Envia una sol¡licitud d'ajuda" }, + "warning": { + "tooltipTitle": "Warning" + }, + "edit": "Edit", "delete": "Esborra", "username": "Usuari", "password": "Contrasenya", @@ -82,6 +169,7 @@ "green": "Verd", "blue": "Blau", "custom": "Personalitzat...", + "comingSoon": "Coming soon", "WorkInProgess": "En desenvolupament, pot no funcionar o contenir errors. Si us plau, informa de qualsevol problema!", "poweredBy": "Impulsat per", "yes": "Si", @@ -115,12 +203,14 @@ "page": "Pàgina", "pages": "Pàgines", "loading": "Carregant...", + "review": "Review", "addToDoc": "Afegeix al document", "reset": "Reset", "apply": "Apply", "noFileSelected": "No file selected. Please upload one.", "legal": { "privacy": "Política de Privacitat", + "iAgreeToThe": "I agree to all of the", "terms": "Termes i condicions", "accessibility": "Accessibilitat", "cookie": "Política de galetes", @@ -160,6 +250,7 @@ "title": "Vols ajudar a millorar Stirling PDF?", "paragraph1": "Stirling PDF tÊ analítiques opcionals per ajudar-nos a millorar el producte. No recopilem cap informaciÃŗ personal ni el contingut dels fitxers.", "paragraph2": "Si us plau, considera habilitar les analítiques per ajudar Stirling PDF a crÊixer i permetre'ns entendre millor els nostres usuaris.", + "learnMore": "Learn more", "enable": "Habilita analítiques", "disable": "Desactiva analítiques", "settings": "Pots canviar la configuraciÃŗ de les analítiques al fitxer config/settings.yml" @@ -203,6 +294,54 @@ "cacheInputs": { "name": "Desa els valors del formulari", "help": "Habilita per guardar els valors utilitzats prèviament per a futures execucions" + }, + "general": { + "title": "General", + "description": "Configure general application preferences.", + "account": "Account", + "accountDescription": "Manage your account settings", + "user": "User", + "signedInAs": "Signed in as", + "logout": "Log out", + "enableFeatures": { + "title": "For System Administrators", + "intro": "Enable user authentication, team management, and workspace features for your organization.", + "action": "Configure", + "and": "and", + "benefit": "Enables user roles, team collaboration, admin controls, and enterprise features.", + "learnMore": "Learn more in documentation", + "dismiss": "Dismiss" + }, + "autoUnzip": "Auto-unzip API responses", + "autoUnzipDescription": "Automatically extract files from ZIP responses", + "autoUnzipTooltip": "Automatically extract ZIP files returned from API operations. Disable to keep ZIP files intact. This does not affect automation workflows.", + "autoUnzipFileLimit": "Auto-unzip file limit", + "autoUnzipFileLimitDescription": "Maximum number of files to extract from ZIP", + "autoUnzipFileLimitTooltip": "Only unzip if the ZIP contains this many files or fewer. Set higher to extract larger ZIPs.", + "defaultToolPickerMode": "Default tool picker mode", + "defaultToolPickerModeDescription": "Choose whether the tool picker opens in fullscreen or sidebar by default", + "mode": { + "fullscreen": "Fullscreen", + "sidebar": "Sidebar" + } + }, + "hotkeys": { + "title": "Keyboard Shortcuts", + "description": "Hover a tool to see its shortcut or customise it below. Click \"Change shortcut\" and press a new key combination. Press Esc to cancel.", + "errorModifier": { + "mac": "Include ⌘ (Command), âŒĨ (Option), or another modifier in your shortcut.", + "windows": "Include Ctrl, Alt, or another modifier in your shortcut." + }, + "errorConflict": "Shortcut already used by {{tool}}.", + "none": "Not assigned", + "customBadge": "Custom", + "defaultLabel": "Default: {{shortcut}}", + "capturing": "Press keysâ€Ļ (Esc to cancel)", + "change": "Change shortcut", + "reset": "Reset", + "shortcut": "Shortcut", + "noShortcut": "No shortcut set", + "searchPlaceholder": "Search tools..." } }, "changeCreds": { @@ -274,8 +413,10 @@ "top20": "Top 20", "all": "All", "refresh": "Refresh", - "includeHomepage": "Include Homepage ('/')", - "includeLoginPage": "Include Login Page ('/login')", + "dataTypeLabel": "Data Type:", + "dataTypeAll": "All", + "dataTypeApi": "API", + "dataTypeUi": "UI", "totalEndpoints": "Total Endpoints", "totalVisits": "Total Visits", "showing": "Showing", @@ -290,7 +431,9 @@ "top": "Top", "numberOfVisits": "Number of Visits", "visitsTooltip": "Visits: {0} ({1}% of total)", - "retry": "Retry" + "retry": "Retry", + "includeHomepage": "Include Homepage ('/')", + "includeLoginPage": "Include Login Page ('/login')" }, "database": { "title": "ImportaciÃŗ/ExportaciÃŗ de Base de Dades", @@ -331,22 +474,310 @@ "alphabetical": "Alfabètic", "globalPopularity": "Popularitat global", "sortBy": "Ordena per:", + "mobile": { + "brandAlt": "Stirling PDF logo", + "openFiles": "Open files", + "swipeHint": "Swipe left or right to switch views", + "tools": "Tools", + "toolsSlide": "Tool selection panel", + "viewSwitcher": "Switch workspace view", + "workbenchSlide": "Workspace panel", + "workspace": "Workspace" + }, "multiTool": { + "tags": "multiple,tools", "title": "Eina MultifunciÃŗ de PDF", "desc": "Fusiona, Rota, Reorganitza i Esborra pàgines" }, "merge": { + "tags": "combine,join,unite", "title": "Fusiona", "desc": "Fusiona fàcilment pàgines en una sola." }, "split": { + "tags": "divide,separate,break", "title": "Divideix", "desc": "Divideix PDFs en mÃēltiples documents" }, "rotate": { + "tags": "turn,flip,orient", "title": "Rota", "desc": "Rota els PDFs." }, + "convert": { + "tags": "transform,change", + "title": "Converteix", + "desc": "Convert files between different formats" + }, + "pdfOrganiser": { + "tags": "organize,rearrange,reorder", + "title": "Organitza", + "desc": "Elimina/reorganitza pàgines en qualsevol ordre" + }, + "addImage": { + "tags": "insert,embed,place", + "title": "Afegir imatge a PDF", + "desc": "Afegeix una imatge en un PDF (en progrÊs)" + }, + "addAttachments": { + "tags": "embed,attach,include", + "title": "Add Attachments", + "desc": "Add or remove embedded files (attachments) to/from a PDF" + }, + "watermark": { + "tags": "stamp,mark,overlay", + "title": "Afegir Marca d'aigua", + "desc": "Afegir una marca d'aigua personalitzada en un PDF" + }, + "removePassword": { + "tags": "unlock", + "title": "Elimina Contrasenya", + "desc": "Elimina la contrasenya del document PDF." + }, + "compress": { + "tags": "shrink,reduce,optimize", + "title": "Comprimeix", + "desc": "Comprimeix PDFs per reduir-ne la mida." + }, + "unlockPDFForms": { + "tags": "unlock,enable,edit", + "title": "Unlock PDF Forms", + "desc": "Remove read-only property of form fields in a PDF document." + }, + "changeMetadata": { + "tags": "edit,modify,update", + "title": "Canvia Metadades", + "desc": "Canvia/Treu/Afegeix metadades al document PDF." + }, + "ocr": { + "tags": "extract,scan", + "title": "Executa OCR i neteja escaneigs", + "desc": "Neteja escanejats i detecta text d'imatges dins d'un PDF, tornant-lo a afegir com a text." + }, + "extractImages": { + "tags": "pull,save,export", + "title": "Extreu Imatges", + "desc": "Extreu les imatges del PDF i desa-les en un arxiu zip" + }, + "scannerImageSplit": { + "tags": "detect,split,photos", + "title": "Detect & Split Scanned Photos", + "desc": "Detect and split scanned photos into separate pages" + }, + "sign": { + "tags": "signature,autograph", + "title": "Signa", + "desc": "Afegeix signatura al PDF mitjançant dibuix, text o imatge" + }, + "flatten": { + "tags": "simplify,remove,interactive", + "title": "Aplanar", + "desc": "Elimina tots els elements i formularis interactius d'un PDF" + }, + "certSign": { + "tags": "authenticate,PEM,P12,official,encrypt,sign,certificate,PKCS12,JKS,server,manual,auto", + "title": "Signa amb Certificat", + "desc": "Signa un PDF amb Certificat/Clau (PEM/P12)" + }, + "repair": { + "tags": "fix,restore", + "title": "Reparar", + "desc": "Intenta reparar un PDF danyat o trencat" + }, + "removeBlanks": { + "tags": "delete,clean,empty", + "title": "Elimina les pàgines en blanc", + "desc": "Detecta i elimina les pàgines en blanc d'un document" + }, + "removeAnnotations": { + "tags": "delete,clean,strip", + "title": "Elimina Anotacions", + "desc": "Elimina tots els comentaris/anotacions d'un PDF" + }, + "compare": { + "tags": "difference", + "title": "Compara", + "desc": "Compara i mostra les diferències entre 2 documents PDF" + }, + "removeCertSign": { + "tags": "remove,delete,unlock", + "title": "Elimina Signatura de Certificat", + "desc": "Elimina la signatura de certificat d'un PDF" + }, + "pageLayout": { + "tags": "layout,arrange,combine", + "title": "DisposiciÃŗ Multi-Pàgina", + "desc": "Fusiona diverses pàgines d'un document PDF en una sola pàgina" + }, + "bookletImposition": { + "tags": "booklet,print,binding", + "title": "Booklet Imposition", + "desc": "Create booklets with proper page ordering and multi-page layout for printing and binding" + }, + "scalePages": { + "tags": "resize,adjust,scale", + "title": "Ajusta la mida/escala de la pàgina", + "desc": "Canvia la mida/escala de la pàgina i/o del seu contingut." + }, + "addPageNumbers": { + "tags": "number,pagination,count", + "title": "Afegir NÃēmeros de Pàgina", + "desc": "Afegir nÃēmeros de pàgina en una localitzaciÃŗ" + }, + "autoRename": { + "tags": "auto-detect,header-based,organize,relabel", + "title": "Auto Rename PDF File", + "desc": "Auto renames a PDF file based on its detected header" + }, + "adjustContrast": { + "tags": "contrast,brightness,saturation", + "title": "Ajusta Colors/Contrast", + "desc": "Ajusta colors/contrast, saturaciÃŗ i brillantor" + }, + "crop": { + "tags": "trim,cut,resize", + "title": "Talla PDF", + "desc": "Talla PDF per reduir la mida (mantÊ el text!)" + }, + "autoSplitPDF": { + "tags": "auto,split,QR", + "title": "DivisiÃŗ Automàtica de Pàgines", + "desc": "Divideix automàticament un PDF escanejat amb un codi QR de separaciÃŗ de pàgines escanejades" + }, + "sanitize": { + "tags": "clean,purge,remove", + "title": "Sanitise", + "desc": "Remove potentially harmful elements from PDF files" + }, + "getPdfInfo": { + "tags": "info,metadata,details", + "title": "Obteniu Tota la InformaciÃŗ sobre el PDF", + "desc": "Recupera tota la informaciÃŗ possible sobre els PDFs" + }, + "pdfToSinglePage": { + "tags": "combine,merge,single", + "title": "PDF a Una Sola Pàgina Gran", + "desc": "Fusiona totes les pàgines d'un PDF en una sola pàgina gran" + }, + "showJS": { + "tags": "javascript,code,script", + "title": "Mostra Javascript", + "desc": "Cerca i mostra qualsevol JS injectat en un PDF" + }, + "redact": { + "tags": "censor,blackout,hide", + "title": "RedacciÃŗ manual", + "desc": "Redacta un PDF segons el text seleccionat, les formes dibuixades i/o les pàgines seleccionades" + }, + "splitBySections": { + "tags": "split,sections,divide", + "title": "Split PDF by Sections", + "desc": "Divide each page of a PDF into smaller horizontal and vertical sections" + }, + "addStamp": { + "tags": "stamp,mark,seal", + "title": "Add Stamp to PDF", + "desc": "Add text or add image stamps at set locations" + }, + "removeImage": { + "tags": "remove,delete,clean", + "title": "Elimina imatge", + "desc": "Elimina imatges d'un PDF per reduir la mida del fitxer" + }, + "splitByChapters": { + "tags": "split,chapters,structure", + "title": "Divideix PDF per Capítols", + "desc": "Divideix un PDF en mÃēltiples fitxers segons la seva estructura de capítols." + }, + "validateSignature": { + "tags": "validate,verify,certificate", + "title": "Validar Signatura PDF", + "desc": "Verifica les signatures digitals i els certificats en documents PDF" + }, + "swagger": { + "tags": "API,documentation,test", + "title": "API Documentation", + "desc": "View API documentation and test endpoints" + }, + "scannerEffect": { + "tags": "scan,simulate,create", + "title": "Scanner Effect", + "desc": "Create a PDF that looks like it was scanned" + }, + "editTableOfContents": { + "tags": "bookmarks,contents,edit", + "title": "Edit Table of Contents", + "desc": "Add or edit bookmarks and table of contents in PDF documents" + }, + "manageCertificates": { + "tags": "certificates,import,export", + "title": "Manage Certificates", + "desc": "Import, export, or delete digital certificate files used for signing PDFs." + }, + "read": { + "tags": "view,open,display", + "title": "Read", + "desc": "View and annotate PDFs. Highlight text, draw, or insert comments for review and collaboration." + }, + "reorganizePages": { + "tags": "rearrange,reorder,organize", + "title": "Reorganize Pages", + "desc": "Rearrange, duplicate, or delete PDF pages with visual drag-and-drop control." + }, + "extractPages": { + "tags": "pull,select,copy", + "title": "Extreu Pàgines", + "desc": "Extract specific pages from a PDF document" + }, + "removePages": { + "tags": "delete,extract,exclude", + "title": "Elimina", + "desc": "Elimina pàgines del document PDF." + }, + "autoSizeSplitPDF": { + "tags": "auto,split,size", + "title": "DivisiÃŗ Automàtica per Mida/Quantitat", + "desc": "Divideix un Ãēnic PDF en mÃēltiples documents basant-se en la mida, el nombre de pàgines o el nombre de documents" + }, + "replaceColor": { + "title": "Replace & Invert Colour", + "desc": "Replace or invert colours in PDF documents" + }, + "devApi": { + "tags": "API,development,documentation", + "title": "API", + "desc": "Link to API documentation" + }, + "devFolderScanning": { + "tags": "automation,folder,scanning", + "title": "Automated Folder Scanning", + "desc": "Link to automated folder scanning guide" + }, + "devSsoGuide": { + "title": "SSO Guide", + "desc": "Link to SSO guide" + }, + "devAirgapped": { + "title": "Air-gapped Setup", + "desc": "Link to air-gapped setup guide" + }, + "addPassword": { + "title": "Afegir Contrasenya", + "desc": "Xifra el document PDF amb contrasenya." + }, + "changePermissions": { + "title": "Canviar Permissos", + "desc": "Change document restrictions and permissions" + }, + "automate": { + "tags": "workflow,sequence,automation", + "title": "Automate", + "desc": "Build multi-step workflows by chaining together PDF actions. Ideal for recurring tasks." + }, + "overlay-pdfs": { + "desc": "Superposa PDFs sobre un altre PDF", + "title": "Superposar PDFs" + }, "imageToPDF": { "title": "Imatge a PDF", "desc": "Converteix imatge (PNG, JPEG, GIF) a PDF." @@ -355,18 +786,6 @@ "title": "PDF a Imatge", "desc": "Converteix PDF a imatge (PNG, JPEG, GIF)" }, - "pdfOrganiser": { - "title": "Organitza", - "desc": "Elimina/reorganitza pàgines en qualsevol ordre" - }, - "addImage": { - "title": "Afegir imatge a PDF", - "desc": "Afegeix una imatge en un PDF (en progrÊs)" - }, - "watermark": { - "title": "Afegir Marca d'aigua", - "desc": "Afegir una marca d'aigua personalitzada en un PDF" - }, "permissions": { "title": "Canvia permisos", "desc": "Canvia els permisos del document PDF" @@ -375,38 +794,10 @@ "title": "Elimina", "desc": "Elimina pàgines del document PDF." }, - "addPassword": { - "title": "Afegir Contrasenya", - "desc": "Xifra el document PDF amb contrasenya." - }, - "removePassword": { - "title": "Elimina Contrasenya", - "desc": "Elimina la contrasenya del document PDF." - }, - "compress": { - "title": "Comprimeix", - "desc": "Comprimeix PDFs per reduir-ne la mida." - }, - "unlockPDFForms": { - "title": "Unlock PDF Forms", - "desc": "Remove read-only property of form fields in a PDF document." - }, - "changeMetadata": { - "title": "Canvia Metadades", - "desc": "Canvia/Treu/Afegeix metadades al document PDF." - }, "fileToPDF": { "title": "Converteix arxiu a PDF", "desc": "Converteix qualsevol arxiu a PDF (DOCX, PNG, XLS, PPT, TXT i mÊs)" }, - "ocr": { - "title": "Executa OCR i neteja escaneigs", - "desc": "Neteja escanejats i detecta text d'imatges dins d'un PDF, tornant-lo a afegir com a text." - }, - "extractImages": { - "title": "Extreu Imatges", - "desc": "Extreu les imatges del PDF i desa-les en un arxiu zip" - }, "pdfToPDFA": { "title": "PDF a PDF/A", "desc": "Converteix PDF a PDF/A per a l'emmagatzematge a llarg termini." @@ -435,70 +826,14 @@ "title": "Detecta/Divideix fotos escanejades", "desc": "Divideix mÃēltiples fotos dins del PDF/foto" }, - "sign": { - "title": "Signa", - "desc": "Afegeix signatura al PDF mitjançant dibuix, text o imatge" - }, - "flatten": { - "title": "Aplanar", - "desc": "Elimina tots els elements i formularis interactius d'un PDF" - }, - "repair": { - "title": "Reparar", - "desc": "Intenta reparar un PDF danyat o trencat" - }, - "removeBlanks": { - "title": "Elimina les pàgines en blanc", - "desc": "Detecta i elimina les pàgines en blanc d'un document" - }, - "removeAnnotations": { - "title": "Elimina Anotacions", - "desc": "Elimina tots els comentaris/anotacions d'un PDF" - }, - "compare": { - "title": "Compara", - "desc": "Compara i mostra les diferències entre 2 documents PDF" - }, - "certSign": { - "title": "Signa amb Certificat", - "desc": "Signa un PDF amb Certificat/Clau (PEM/P12)" - }, - "removeCertSign": { - "title": "Elimina Signatura de Certificat", - "desc": "Elimina la signatura de certificat d'un PDF" - }, - "pageLayout": { - "title": "DisposiciÃŗ Multi-Pàgina", - "desc": "Fusiona diverses pàgines d'un document PDF en una sola pàgina" - }, - "scalePages": { - "title": "Ajusta la mida/escala de la pàgina", - "desc": "Canvia la mida/escala de la pàgina i/o del seu contingut." - }, "pipeline": { "title": "ProcÊs", "desc": "Executa mÃēltiples accions en PDFs definint scripts de procÊs" }, - "addPageNumbers": { - "title": "Afegir NÃēmeros de Pàgina", - "desc": "Afegir nÃēmeros de pàgina en una localitzaciÃŗ" - }, "auto-rename": { "title": "Canvia Automàticament el Nom del Fitxer PDF", "desc": "Canvia automàticament el nom d'un fitxer PDF en funciÃŗ de la capçalera detectada" }, - "adjustContrast": { - "title": "Ajusta Colors/Contrast", - "desc": "Ajusta colors/contrast, saturaciÃŗ i brillantor" - }, - "crop": { - "title": "Talla PDF", - "desc": "Talla PDF per reduir la mida (mantÊ el text!)" - }, - "autoSplitPDF": { - "title": "DivisiÃŗ Automàtica de Pàgines", - "desc": "Divideix automàticament un PDF escanejat amb un codi QR de separaciÃŗ de pàgines escanejades" - }, "sanitizePDF": { "title": "Neteja", "desc": "Elimina scripts i altres elements dels fitxers PDF" @@ -519,30 +854,14 @@ "title": "PDF to Markdown", "desc": "Converts any PDF to Markdown" }, - "getPdfInfo": { - "title": "Obteniu Tota la InformaciÃŗ sobre el PDF", - "desc": "Recupera tota la informaciÃŗ possible sobre els PDFs" - }, "pageExtracter": { "title": "Extreu pàgina(es)", "desc": "Extreu pàgines seleccionades d'un PDF" }, - "pdfToSinglePage": { - "title": "PDF a Una Sola Pàgina Gran", - "desc": "Fusiona totes les pàgines d'un PDF en una sola pàgina gran" - }, - "showJS": { - "title": "Mostra Javascript", - "desc": "Cerca i mostra qualsevol JS injectat en un PDF" - }, "autoRedact": { "title": "RedacciÃŗ Automàtica", "desc": "Redacta automàticament (enfosqueix) text en un PDF basat en el text introduït" }, - "redact": { - "title": "RedacciÃŗ manual", - "desc": "Redacta un PDF segons el text seleccionat, les formes dibuixades i/o les pàgines seleccionades" - }, "PDFToCSV": { "title": "PDF a CSV", "desc": "Extreu taules d'un PDF convertint-les a CSV" @@ -551,10 +870,6 @@ "title": "DivisiÃŗ Automàtica per Mida/Quantitat", "desc": "Divideix un Ãēnic PDF en mÃēltiples documents basant-se en la mida, el nombre de pàgines o el nombre de documents" }, - "overlay-pdfs": { - "title": "Superposar PDFs", - "desc": "Superposa PDFs sobre un altre PDF" - }, "split-by-sections": { "title": "Divideix PDF per Seccions", "desc": "Divideix cada pàgina d'un PDF en seccions horitzontals i verticals mÊs petites" @@ -563,43 +878,17 @@ "title": "Afegeix segell al PDF", "desc": "Afegeix segells de text o imatge en ubicacions establertes" }, - "removeImage": { - "title": "Elimina imatge", - "desc": "Elimina imatges d'un PDF per reduir la mida del fitxer" - }, - "splitByChapters": { - "title": "Divideix PDF per Capítols", - "desc": "Divideix un PDF en mÃēltiples fitxers segons la seva estructura de capítols." - }, - "validateSignature": { - "title": "Validar Signatura PDF", - "desc": "Verifica les signatures digitals i els certificats en documents PDF" - }, "replace-color": { "title": "Reemplaça i Inverteix Color", "desc": "Reemplaça el color del text i el fons en un PDF i inverteix tot el color del PDF per reduir la mida del fitxer" }, - "convert": { - "title": "Converteix" - }, "attachments": { "title": "Add attachments" }, - "extractPages": { - "title": "Extreu Pàgines" - }, - "removePages": { - "title": "Elimina", - "desc": "Elimina pàgines del document PDF." - }, "removeImagePdf": { "title": "Elimina imatge", "desc": "Elimina imatges d'un PDF per reduir la mida del fitxer" }, - "autoSizeSplitPDF": { - "title": "DivisiÃŗ Automàtica per Mida/Quantitat", - "desc": "Divideix un Ãēnic PDF en mÃēltiples documents basant-se en la mida, el nombre de pàgines o el nombre de documents" - }, "adjust-contrast": { "title": "Ajusta Colors/Contrast", "desc": "Ajusta colors/contrast, saturaciÃŗ i brillantor" @@ -607,11 +896,12 @@ "replaceColorPdf": { "title": "Reemplaça i Inverteix Color", "desc": "Reemplaça el color del text i el fons en un PDF i inverteix tot el color del PDF per reduir la mida del fitxer" - }, - "changePermissions": { - "title": "Canviar Permissos" } }, + "landing": { + "addFiles": "Add Files", + "uploadFromComputer": "Upload from computer" + }, "viewPdf": { "tags": "veure,llegir,anotar,text,imatge", "title": "View/Edit PDF", @@ -645,17 +935,39 @@ "merge": { "tags": "fusiÃŗ,operacions de pàgina,backend,servidor", "title": "Fusiona", + "removeDigitalSignature": { + "label": "Remove digital signature in the merged file?", + "tooltip": { + "title": "Remove Digital Signature", + "description": "Digital signatures will be invalidated when merging files. Check this to remove them from the final merged PDF." + } + }, + "generateTableOfContents": { + "label": "Generate table of contents in the merged file?", + "tooltip": { + "title": "Generate Table of Contents", + "description": "Automatically creates a clickable table of contents in the merged PDF based on the original file names and page numbers." + } + }, + "submit": "Fusiona", + "sortBy": { + "description": "Files will be merged in the order they're selected. Drag to reorder or sort below.", + "label": "Sort By", + "filename": "Nom del Fitxer", + "dateModified": "Date Modified", + "ascending": "Ascending", + "descending": "Descending", + "sort": "Sort" + }, + "error": { + "failed": "An error occurred while merging the PDFs." + }, "header": "Fusiona mÃēltiples PDFs (2+)", "sortByName": "Ordena per nom", "sortByDate": "Ordena per data", - "removeCertSign": "Eliminar la signatura digital en el fitxer fusionat?", - "submit": "Fusiona", - "sortBy": { - "filename": "Nom del Fitxer" - } + "removeCertSign": "Eliminar la signatura digital en el fitxer fusionat?" }, "split": { - "tags": "operacions de pàgina,divideix,Multi-Pàgina,talla,servidor", "title": "Divideix PDF", "header": "Divideix PDF", "desc": { @@ -671,25 +983,249 @@ "splitPages": "Introdueix les pàgines per dividir-les:", "submit": "Divideix", "steps": { + "chooseMethod": "Choose Method", "settings": "Opcions" }, + "settings": { + "selectMethodFirst": "Please select a split method first" + }, + "error": { + "failed": "An error occurred while splitting the PDF." + }, + "method": { + "label": "Choose split method", + "placeholder": "Select how to split the PDF" + }, "methods": { + "prefix": { + "splitAt": "Split at", + "splitBy": "Split by" + }, + "byPages": { + "name": "Page Numbers", + "desc": "Extract specific pages (1,3,5-10)", + "tooltip": "Enter page numbers separated by commas or ranges with hyphens" + }, + "bySections": { + "name": "Sections", + "desc": "Divide pages into grid sections", + "tooltip": "Split each page into horizontal and vertical sections" + }, "bySize": { - "name": "Mida del Fitxer" + "name": "Mida del Fitxer", + "desc": "Limit maximum file size", + "tooltip": "Specify maximum file size (e.g. 10MB, 500KB)" + }, + "byPageCount": { + "name": "Page Count", + "desc": "Fixed pages per file", + "tooltip": "Enter the number of pages for each split file" + }, + "byDocCount": { + "name": "Document Count", + "desc": "Create specific number of files", + "tooltip": "Enter how many files you want to create" + }, + "byChapters": { + "name": "Chapters", + "desc": "Split at bookmark boundaries", + "tooltip": "Uses PDF bookmarks to determine split points" + }, + "byPageDivider": { + "name": "Page Divider", + "desc": "Auto-split with divider sheets", + "tooltip": "Use QR code divider sheets between documents when scanning" } }, "value": { "fileSize": { - "label": "Mida del Fitxer" + "label": "Mida del Fitxer", + "placeholder": "e.g. 10MB, 500KB" + }, + "pageCount": { + "label": "Pages per File", + "placeholder": "e.g. 5, 10" + }, + "docCount": { + "label": "Number of Files", + "placeholder": "e.g. 3, 5" } - } + }, + "tooltip": { + "header": { + "title": "Split Methods Overview" + }, + "byPages": { + "title": "Split at Page Numbers", + "text": "Split your PDF at specific page numbers. Using 'n' splits after page n. Using 'n-m' splits before page n and after page m.", + "bullet1": "Single split points: 3,7 (splits after pages 3 and 7)", + "bullet2": "Range split points: 3-8 (splits before page 3 and after page 8)", + "bullet3": "Mixed: 2,5-10,15 (splits after page 2, before page 5, after page 10, and after page 15)" + }, + "bySections": { + "title": "Split by Grid Sections", + "text": "Divide each page into a grid of sections. Useful for splitting documents with multiple columns or extracting specific areas.", + "bullet1": "Horizontal: Number of rows to create", + "bullet2": "Vertical: Number of columns to create", + "bullet3": "Merge: Combine all sections into one PDF" + }, + "bySize": { + "title": "Split by File Size", + "text": "Create multiple PDFs that don't exceed a specified file size. Ideal for file size limitations or email attachments.", + "bullet1": "Use MB for larger files (e.g., 10MB)", + "bullet2": "Use KB for smaller files (e.g., 500KB)", + "bullet3": "System will split at page boundaries" + }, + "byCount": { + "title": "Split by Count", + "text": "Create multiple PDFs with a specific number of pages or documents each.", + "bullet1": "Page Count: Fixed number of pages per file", + "bullet2": "Document Count: Fixed number of output files", + "bullet3": "Useful for batch processing workflows" + }, + "byChapters": { + "title": "Split by Chapters", + "text": "Use PDF bookmarks to automatically split at chapter boundaries. Requires PDFs with bookmark structure.", + "bullet1": "Bookmark Level: Which level to split on (1=top level)", + "bullet2": "Include Metadata: Preserve document properties", + "bullet3": "Allow Duplicates: Handle repeated bookmark names" + }, + "byDocCount": { + "bullet1": "Enter the number of output files you want", + "bullet2": "Pages are distributed as evenly as possible", + "bullet3": "Useful when you need a specific number of files", + "text": "Create a specific number of output files by evenly distributing pages across them.", + "title": "Split by Document Count" + }, + "byPageCount": { + "bullet1": "Enter the number of pages per output file", + "bullet2": "Last file may have fewer pages if not evenly divisible", + "bullet3": "Useful for batch processing workflows", + "text": "Create multiple PDFs with a specific number of pages each. Perfect for creating uniform document chunks.", + "title": "Split by Page Count" + }, + "byPageDivider": { + "bullet1": "Print divider sheets from the download link", + "bullet2": "Insert divider sheets between your documents", + "bullet3": "Scan all documents together as one PDF", + "bullet4": "Upload - divider pages are automatically detected and removed", + "bullet5": "Enable Duplex Mode if scanning both sides of divider sheets", + "text": "Automatically split scanned documents using physical divider sheets with QR codes. Perfect for processing multiple documents scanned together.", + "title": "Split by Page Divider" + } + }, + "methodSelection": { + "tooltip": { + "bullet1": "Click on a method card to select it", + "bullet2": "Hover over each card to see a quick description", + "bullet3": "The settings step will appear after you select a method", + "bullet4": "You can change methods at any time before processing", + "header": { + "text": "Choose how you want to split your PDF document. Each method is optimized for different use cases and document types.", + "title": "Split Method Selection" + }, + "title": "Choose Your Split Method" + } + }, + "selectMethod": "Select a split method", + "tags": "operacions de pàgina,divideix,Multi-Pàgina,talla,servidor" }, "rotate": { - "tags": "servidor", "title": "Rota PDF", + "submit": "Rota", + "selectRotation": "Select Rotation Angle (Clockwise)", + "error": { + "failed": "An error occurred while rotating the PDF." + }, + "preview": { + "title": "Rotation Preview" + }, + "rotateLeft": "Rotate Anticlockwise", + "rotateRight": "Rotate Clockwise", + "tooltip": { + "header": { + "title": "Rotate Settings Overview" + }, + "description": { + "text": "Rotate your PDF pages clockwise or anticlockwise in 90-degree increments. All pages in the PDF will be rotated. The preview shows how your document will look after rotation." + }, + "controls": { + "title": "Controls", + "text": "Use the rotation buttons to adjust orientation. Left button rotates anticlockwise, right button rotates clockwise. Each click rotates by 90 degrees." + } + }, + "tags": "servidor", "header": "Rota PDF", - "selectAngle": "Selecciona l'angle de gir (en mÃēltiples de 90 graus):", - "submit": "Rota" + "selectAngle": "Selecciona l'angle de gir (en mÃēltiples de 90 graus):" + }, + "convert": { + "title": "Converteix", + "desc": "Convert files between different formats", + "files": "Files", + "selectFilesPlaceholder": "Select files in the main view to get started", + "settings": "Opcions", + "conversionCompleted": "Conversion completed", + "results": "Results", + "defaultFilename": "converted_file", + "conversionResults": "Conversion Results", + "convertFrom": "Convert from", + "convertTo": "Convert to", + "sourceFormatPlaceholder": "Source format", + "targetFormatPlaceholder": "Target format", + "selectSourceFormatFirst": "Select a source format first", + "outputOptions": "Output Options", + "pdfOptions": "PDF Options", + "imageOptions": "Image Options", + "colorType": "Colour Type", + "color": "Color", + "greyscale": "Escala de Grisos", + "blackwhite": "Black & White", + "dpi": "DPI", + "output": "Output", + "single": "Single", + "multiple": "Multiple", + "fitOption": "Fit Option", + "maintainAspectRatio": "Maintain Aspect Ratio", + "fitDocumentToPage": "Fit Document to Page", + "fillPage": "Omple la Pàgina", + "autoRotate": "Auto Rotate", + "autoRotateDescription": "Automatically rotate images to better fit the PDF page", + "combineImages": "Combine Images", + "combineImagesDescription": "Combine all images into one PDF, or create separate PDFs for each image", + "webOptions": "Web to PDF Options", + "zoomLevel": "Zoom Level", + "emailOptions": "Email to PDF Options", + "includeAttachments": "Include email attachments", + "maxAttachmentSize": "Maximum attachment size (MB)", + "includeAllRecipients": "Include CC and BCC recipients in header", + "downloadHtml": "Download HTML intermediate file instead of PDF", + "pdfaOptions": "PDF/A Options", + "outputFormat": "Output Format", + "pdfaNote": "PDF/A-1b is more compatible, PDF/A-2b supports more features.", + "pdfaDigitalSignatureWarning": "El PDF contÊ una signatura digital. Aquesta serà eliminada en el segÃŧent pas.", + "fileFormat": "File Format", + "wordDoc": "Word Document", + "wordDocExt": "Word Document (.docx)", + "odtExt": "OpenDocument Text (.odt)", + "pptExt": "PowerPoint (.pptx)", + "odpExt": "OpenDocument Presentation (.odp)", + "txtExt": "Plain Text (.txt)", + "rtfExt": "Rich Text Format (.rtf)", + "selectedFiles": "Selected files", + "noFileSelected": "No file selected. Use the file panel to add files.", + "convertFiles": "Convert Files", + "converting": "Converting...", + "downloadConverted": "Download Converted File", + "errorNoFiles": "Please select at least one file to convert.", + "errorNoFormat": "Please select both source and target formats.", + "errorNotSupported": "Conversion from {{from}} to {{to}} is not supported.", + "images": "Images", + "officeDocs": "Office Documents (Word, Excel, PowerPoint)", + "imagesExt": "Images (JPG, PNG, etc.)", + "markdown": "Markdown", + "textRtf": "Text/RTF", + "grayscale": "Escala de Grisos", + "errorConversion": "An error occurred while converting the file." }, "imageToPdf": { "tags": "conversiÃŗ,img,jpg,imatge,foto" @@ -727,7 +1263,33 @@ "8": "Eliminar Últim", "9": "Eliminar Primer i Últim", "10": "Fusionar Parells-Senars", - "11": "Duplicate all pages" + "11": "Duplicate all pages", + "desc": { + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, â€Ļ).", + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, â€Ļ).", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimized for binding on the side)." + } + }, + "desc": { + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, â€Ļ).", + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, â€Ļ).", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimised for binding on the side).", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document." }, "placeholder": "(p. ex. 1,3,2 o 4-8,2,10-12 o 2n-1)" }, @@ -739,9 +1301,198 @@ "upload": "Afegir Imatge", "submit": "Afegir Imatge" }, + "attachments": { + "tags": "embed,attach,file,attachment,attachments", + "title": "Add attachments", + "header": "Add attachments", + "add": "Add Attachment", + "remove": "Remove Attachment", + "embed": "Embed Attachment", + "submit": "Add attachments" + }, "watermark": { - "tags": "text,repeticiÃŗ,etiqueta,propia,copyright,marca registrada,img,jpg,imatge,foto", "title": "Afegir Marca d'Aigua", + "desc": "Add text or image watermarks to PDF files", + "completed": "Watermark added", + "submit": "Afegir Marca d'Aigua", + "filenamePrefix": "watermarked", + "error": { + "failed": "An error occurred while adding watermark to the PDF." + }, + "watermarkType": { + "text": "Text", + "image": "Image" + }, + "settings": { + "type": "Watermark Type", + "text": { + "label": "Watermark Text", + "placeholder": "Enter watermark text" + }, + "image": { + "label": "Watermark Image", + "choose": "Choose Image", + "selected": "Selected: {{filename}}" + }, + "fontSize": "Mida del tipus de lletra", + "size": "Size", + "alphabet": "Font/Language", + "color": "Watermark Colour", + "rotation": "Rotation (degrees)", + "opacity": "Opacity (%)", + "spacing": { + "horizontal": "Horizontal Spacing", + "vertical": "Vertical Spacing", + "height": "Height Spacing", + "width": "Width Spacing" + }, + "convertToImage": "Flatten PDF pages to images" + }, + "alphabet": { + "roman": "Roman/Latin", + "arabic": "Arabic", + "japanese": "Japanese", + "korean": "Korean", + "chinese": "Chinese", + "thai": "Thai" + }, + "steps": { + "type": "Watermark Type", + "wording": "Wording", + "textStyle": "Style", + "formatting": "Formatting", + "file": "Watermark File" + }, + "results": { + "title": "Watermark Results" + }, + "tooltip": { + "language": { + "title": "Language Support", + "text": "Choose the appropriate language setting to ensure proper font rendering for your text." + }, + "appearance": { + "title": "Appearance Settings", + "text": "Control how your watermark looks and blends with the document.", + "bullet1": "Rotation: -360° to 360° for angled watermarks", + "bullet2": "Opacity: 0-100% for transparency control", + "bullet3": "Lower opacity creates subtle watermarks" + }, + "spacing": { + "title": "Spacing Control", + "text": "Adjust the spacing between repeated watermarks across the page.", + "bullet1": "Width spacing: Horizontal distance between watermarks", + "bullet2": "Height spacing: Vertical distance between watermarks", + "bullet3": "Higher values create more spread out patterns" + }, + "type": { + "header": { + "title": "Watermark Type Selection" + }, + "description": { + "title": "Choose Your Watermark", + "text": "Select between text or image watermarks based on your needs." + }, + "text": { + "title": "Text Watermarks", + "text": "Perfect for adding copyright notices, company names, or confidentiality labels. Supports multiple languages and custom colours.", + "bullet1": "Customisable fonts and languages", + "bullet2": "Adjustable colours and transparency", + "bullet3": "Ideal for legal or branding text" + }, + "image": { + "title": "Image Watermarks", + "text": "Use logos, stamps, or any image as a watermark. Great for branding and visual identification.", + "bullet1": "Upload any image format", + "bullet2": "Maintains image quality", + "bullet3": "Perfect for logos and stamps" + } + }, + "wording": { + "header": { + "title": "Text Content" + }, + "text": { + "title": "Watermark Text", + "text": "Enter the text that will appear as your watermark across the document.", + "bullet1": "Keep it concise for better readability", + "bullet2": "Common examples: 'CONFIDENTIAL', 'DRAFT', company name", + "bullet3": "Emoji characters are not supported and will be filtered out" + } + }, + "textStyle": { + "header": { + "title": "Text Style" + }, + "color": { + "title": "Colour Selection", + "text": "Choose a colour that provides good contrast with your document content.", + "bullet1": "Light grey (#d3d3d3) for subtle watermarks", + "bullet2": "Black or dark colours for high contrast", + "bullet3": "Custom colours for branding purposes" + }, + "language": { + "title": "Language Support", + "text": "Choose the appropriate language setting to ensure proper font rendering." + } + }, + "file": { + "header": { + "title": "Image Upload" + }, + "upload": { + "title": "Image Selection", + "text": "Upload an image file to use as your watermark.", + "bullet1": "Supports common formats: PNG, JPG, GIF, BMP", + "bullet2": "PNG with transparency works best", + "bullet3": "Higher resolution images maintain quality better" + }, + "recommendations": { + "title": "Best Practices", + "text": "Tips for optimal image watermark results.", + "bullet1": "Use logos or stamps with transparent backgrounds", + "bullet2": "Simple designs work better than complex images", + "bullet3": "Consider the final document size when choosing resolution" + } + }, + "formatting": { + "header": { + "title": "Formatting & Layout" + }, + "size": { + "title": "Size Control", + "text": "Adjust the size of your watermark (text or image).", + "bullet1": "Larger sizes create more prominent watermarks" + }, + "appearance": { + "title": "Appearance Settings", + "text": "Control how your watermark looks and blends with the document.", + "bullet1": "Rotation: -360° to 360° for angled watermarks", + "bullet2": "Opacity: 0-100% for transparency control", + "bullet3": "Lower opacity creates subtle watermarks" + }, + "spacing": { + "title": "Spacing Control", + "text": "Adjust the spacing between repeated watermarks across the page.", + "bullet1": "Horizontal spacing: Distance between watermarks left to right", + "bullet2": "Vertical spacing: Distance between watermarks top to bottom", + "bullet3": "Higher values create more spread out patterns" + }, + "security": { + "title": "Security Option", + "text": "Convert the final PDF to an image-based format for enhanced security.", + "bullet1": "Prevents text selection and copying", + "bullet2": "Makes watermarks harder to remove", + "bullet3": "Results in larger file sizes", + "bullet4": "Best for sensitive or copyrighted content" + } + } + }, + "type": { + "1": "Text", + "2": "Imatge" + }, + "tags": "text,repeticiÃŗ,etiqueta,propia,copyright,marca registrada,img,jpg,imatge,foto", "header": "Afegir Marca d'Aigua", "customColor": "Color de Text Personalitzat", "selectText": { @@ -755,14 +1506,6 @@ "8": "Tipus de Marca d'Aigua:", "9": "Imatge de la Marca d'Aigua:", "10": "Converteix PDF a PDF-Image" - }, - "submit": "Afegir Marca d'Aigua", - "type": { - "1": "Text", - "2": "Imatge" - }, - "settings": { - "fontSize": "Mida del tipus de lletra" } }, "permissions": { @@ -787,50 +1530,201 @@ "removePages": { "tags": "eliminar pàgines,suprimir pàgines", "title": "Elimina", + "pageNumbers": { + "label": "Pages to Remove", + "placeholder": "e.g., 1,3,5-8,10", + "error": "Invalid page number format. Use numbers, ranges (1-5), or mathematical expressions (2n+1)" + }, + "filenamePrefix": "pages_removed", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "settings": { + "title": "Settings" + }, + "tooltip": { + "header": { + "title": "Remove Pages Settings" + }, + "pageNumbers": { + "title": "Page Selection", + "text": "Specify which pages to remove from your PDF. You can select individual pages, ranges, or use mathematical expressions.", + "bullet1": "Individual pages: 1,3,5 (removes pages 1, 3, and 5)", + "bullet2": "Page ranges: 1-5,10-15 (removes pages 1-5 and 10-15)", + "bullet3": "Mathematical: 2n+1 (removes odd pages)", + "bullet4": "Open ranges: 5- (removes from page 5 to end)" + }, + "examples": { + "title": "Common Examples", + "text": "Here are some common page selection patterns:", + "bullet1": "Remove first page: 1", + "bullet2": "Remove last 3 pages: -3", + "bullet3": "Remove every other page: 2n", + "bullet4": "Remove specific scattered pages: 1,5,10,15" + }, + "safety": { + "title": "Safety Tips", + "text": "Important considerations when removing pages:", + "bullet1": "Always preview your selection before processing", + "bullet2": "Keep a backup of your original file", + "bullet3": "Page numbers start from 1, not 0", + "bullet4": "Invalid page numbers will be ignored" + } + }, + "error": { + "failed": "An error occurred whilst removing pages." + }, + "results": { + "title": "Page Removal Results" + }, "submit": "Elimina" }, - "addPassword": { - "tags": "segur,seguretat", - "title": "Afegir Contrasenya", - "header": "Afegir contrasenya (Encriptat)", - "selectText": { - "1": "PDF a encriptar", - "2": "Contrasenya", - "3": "Longitud de la clau de xifratge", - "4": "Valors mÊs alts sÃŗn mÊs forts, perÃ˛ els valors mÊs baixos tenen una millor compatibilitat.", - "5": "Permissos a Establir", - "6": "Evita el muntatge del document", - "7": "Evita l'extracciÃŗ de contingut", - "8": "Evita l'extracciÃŗ per accessibilitat", - "9": "Evita emplenar formularis", - "10": "Evita modificacions", - "11": "Evita modificacions d'annotacions", - "12": "Evita impressiÃŗ", - "13": "Evita impressiÃŗ en diferents formats", - "14": "Contrasenya d'Administrador", - "15": "Restringeix el que es pot fer amb el document un cop obert (No compatible amb tots els lectors)", - "16": "Restringeix l'obertura del document" + "extractPages": { + "title": "Extract Pages", + "pageNumbers": { + "label": "Pages to Extract", + "placeholder": "e.g., 1,3,5-8 or odd & 1-10" + }, + "settings": { + "title": "Settings" }, - "submit": "Encripta", "tooltip": { - "permissions": { - "title": "Canviar Permissos" + "description": "Extracts the selected pages into a new PDF, preserving order." + }, + "error": { + "failed": "Failed to extract pages" + }, + "results": { + "title": "Pages Extracted" + }, + "submit": "Extract Pages" + }, + "pageSelection": { + "tooltip": { + "header": { + "title": "Page Selection Guide" + }, + "basic": { + "title": "Basic Usage", + "text": "Select specific pages from your PDF document using simple syntax.", + "bullet1": "Individual pages: 1,3,5", + "bullet2": "Page ranges: 3-6 or 10-15", + "bullet3": "All pages: all" + }, + "advanced": { + "title": "Advanced Features" + }, + "tips": { + "title": "Tips", + "text": "Keep these guidelines in mind:", + "bullet1": "Page numbers start from 1 (not 0)", + "bullet2": "Spaces are automatically removed", + "bullet3": "Invalid expressions are ignored" + }, + "syntax": { + "title": "Syntax Basics", + "text": "Use numbers, ranges, keywords, and progressions (n starts at 0). Parentheses are supported.", + "bullets": { + "numbers": "Numbers/ranges: 5, 10-20", + "keywords": "Keywords: odd, even", + "progressions": "Progressions: 3n, 4n+1" + } + }, + "operators": { + "title": "Operators", + "text": "AND has higher precedence than comma. NOT applies within the document range.", + "and": "AND: & or \"and\" — require both conditions (e.g., 1-50 & even)", + "comma": "Comma: , or | — combine selections (e.g., 1-10, 20)", + "not": "NOT: ! or \"not\" — exclude pages (e.g., 3n & not 30)" + }, + "examples": { + "title": "Examples" + }, + "complex": { + "bullet1": "1,3-5,8,2n → pages 1, 3–5, 8, plus evens", + "bullet2": "10-,2n-1 → from page 10 to end + odd pages", + "description": "Mix different types.", + "title": "Complex Combinations" + }, + "description": "Choose which pages to use for the operation. Supports single pages, ranges, formulas, and the all keyword.", + "individual": { + "bullet1": "1,3,5 → selects pages 1, 3, 5", + "bullet2": "2,7,12 → selects pages 2, 7, 12", + "description": "Enter numbers separated by commas.", + "title": "Individual Pages" + }, + "mathematical": { + "bullet1": "2n → all even pages (2, 4, 6â€Ļ)", + "bullet2": "2n-1 → all odd pages (1, 3, 5â€Ļ)", + "bullet3": "3n → every 3rd page (3, 6, 9â€Ļ)", + "bullet4": "4n-1 → pages 3, 7, 11, 15â€Ļ", + "description": "Use n in formulas for patterns.", + "title": "Mathematical Functions" + }, + "ranges": { + "bullet1": "3-6 → selects pages 3–6", + "bullet2": "10-15 → selects pages 10–15", + "bullet3": "5- → selects pages 5 to end", + "description": "Use - for consecutive pages.", + "title": "Page Ranges" + }, + "special": { + "bullet1": "all → selects all pages", + "title": "Special Keywords" } } }, - "removePassword": { - "tags": "segur,desencripta,seguretat,eliminar contrasenya,suprimir contrasenya", - "title": "Eliminar Contrasenya", - "header": "Eliminar Contrasenya (Desxifrar)", - "selectText": { - "1": "Selecciona el PDF a Desxifrar", - "2": "Contrasenya" + "bulkSelection": { + "syntaxError": "There is a syntax issue. See Page Selection tips for help.", + "header": { + "title": "Page Selection Guide" }, - "submit": "Eliminar Contrasenya", - "desc": "Elimina la contrasenya del document PDF.", - "password": { - "stepTitle": "Elimina Contrasenya", - "label": "Contrasenya Actual" + "syntax": { + "title": "Syntax Basics", + "text": "Use numbers, ranges, keywords, and progressions (n starts at 0). Parentheses are supported.", + "bullets": { + "numbers": "Numbers/ranges: 5, 10-20", + "keywords": "Keywords: odd, even", + "progressions": "Progressions: 3n, 4n+1" + } + }, + "operators": { + "title": "Operators", + "text": "AND has higher precedence than comma. NOT applies within the document range.", + "and": "AND: & or \"and\" — require both conditions (e.g., 1-50 & even)", + "comma": "Comma: , or | — combine selections (e.g., 1-10, 20)", + "not": "NOT: ! or \"not\" — exclude pages (e.g., 3n & not 30)" + }, + "examples": { + "title": "Examples", + "first50": "First 50", + "last50": "Last 50", + "every3rd": "Every 3rd", + "oddWithinExcluding": "Odd within 1-20 excluding 5-7", + "combineSets": "Combine sets" + }, + "firstNPages": { + "title": "First N Pages", + "placeholder": "Number of pages" + }, + "lastNPages": { + "title": "Last N Pages", + "placeholder": "Number of pages" + }, + "everyNthPage": { + "title": "Every Nth Page", + "placeholder": "Step size" + }, + "range": { + "title": "Range", + "fromPlaceholder": "From", + "toPlaceholder": "To" + }, + "keywords": { + "title": "Keywords" + }, + "advanced": { + "title": "Advanced" } }, "compressPdfs": { @@ -840,12 +1734,142 @@ "tags": "remove,delete,form,field,readonly", "title": "Remove Read-Only from Form Fields", "header": "Unlock PDF Forms", - "submit": "Remove" + "submit": "Remove", + "description": "This tool will remove read-only restrictions from PDF form fields, making them editable and fillable.", + "filenamePrefix": "unlocked_forms", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst unlocking PDF forms." + }, + "results": { + "title": "Unlocked Forms Results" + } }, "changeMetadata": { - "tags": "Títol,autor,data,creaciÃŗ,hora,editor,productor,estadístiques", - "title": "Títol:", "header": "Canvia Metadades", + "submit": "Canvia", + "filenamePrefix": "metadata", + "settings": { + "title": "Metadata Settings" + }, + "standardFields": { + "title": "Standard Fields" + }, + "deleteAll": { + "label": "Remove Existing Metadata", + "checkbox": "Delete all metadata" + }, + "title": { + "label": "Title", + "placeholder": "Document title" + }, + "author": { + "label": "Author", + "placeholder": "Document author" + }, + "subject": { + "label": "Subject", + "placeholder": "Document subject" + }, + "keywords": { + "label": "Keywords", + "placeholder": "Document keywords" + }, + "creator": { + "label": "Creator", + "placeholder": "Document creator" + }, + "producer": { + "label": "Producer", + "placeholder": "Document producer" + }, + "dates": { + "title": "Date Fields" + }, + "creationDate": { + "label": "Creation Date", + "placeholder": "Creation date" + }, + "modificationDate": { + "label": "Modification Date", + "placeholder": "Modification date" + }, + "trapped": { + "label": "Trapped Status", + "unknown": "Unknown", + "true": "True", + "false": "False" + }, + "advanced": { + "title": "Advanced Options" + }, + "customFields": { + "title": "Custom Metadata", + "description": "Add custom metadata fields to the document", + "add": "Add Field", + "key": "Key", + "keyPlaceholder": "Custom key", + "value": "Value", + "valuePlaceholder": "Custom value", + "remove": "Remove" + }, + "results": { + "title": "Updated PDFs" + }, + "error": { + "failed": "An error occurred while changing the PDF metadata." + }, + "tooltip": { + "header": { + "title": "PDF Metadata Overview" + }, + "standardFields": { + "title": "Standard Fields", + "text": "Common PDF metadata fields that describe the document.", + "bullet1": "Title: Document name or heading", + "bullet2": "Author: Person who created the document", + "bullet3": "Subject: Brief description of content", + "bullet4": "Keywords: Search terms for the document", + "bullet5": "Creator/Producer: Software used to create the PDF" + }, + "dates": { + "title": "Date Fields", + "text": "When the document was created and modified.", + "bullet1": "Creation Date: When original document was made", + "bullet2": "Modification Date: When last changed" + }, + "options": { + "title": "Additional Options", + "text": "Custom fields and privacy controls.", + "bullet1": "Custom Metadata: Add your own key-value pairs", + "bullet2": "Trapped Status: High-quality printing setting", + "bullet3": "Delete All: Remove all metadata for privacy" + }, + "deleteAll": { + "title": "Remove Existing Metadata", + "text": "Complete metadata deletion to ensure privacy." + }, + "customFields": { + "title": "Custom Metadata", + "text": "Add your own custom key-value metadata pairs.", + "bullet1": "Add any custom fields relevant to your document", + "bullet2": "Examples: Department, Project, Version, Status", + "bullet3": "Both key and value are required for each entry" + }, + "advanced": { + "title": "Advanced Options", + "trapped": { + "title": "Trapped Status", + "description": "Indicates if document is prepared for high-quality printing.", + "bullet1": "True: Document has been trapped for printing", + "bullet2": "False: Document has not been trapped", + "bullet3": "Unknown: Trapped status is not specified" + } + } + }, + "tags": "Títol,autor,data,creaciÃŗ,hora,editor,productor,estadístiques", "selectText": { "1": "Edita les variables a canviar", "2": "Neteja totes les metadades", @@ -853,15 +1877,7 @@ "4": "Altres Metadades:", "5": "Afegir entrada personalitzada" }, - "author": "Autor:", - "creationDate": "Data de CreaciÃŗ (yyyy/MM/dd HH:mm:ss):", - "creator": "Creador:", - "keywords": "Paraules clau:", - "modDate": "Data de ModificaciÃŗ (yyyy/MM/dd HH:mm:ss):", - "producer": "Productor:", - "subject": "Assumpte:", - "trapped": "Atrapat:", - "submit": "Canvia" + "modDate": "Data de ModificaciÃŗ (yyyy/MM/dd HH:mm:ss):" }, "fileToPDF": { "tags": "transformaciÃŗ,format,document,imatge,diapositiva,text,conversiÃŗ,oficina,docs,word,excel,powerpoint", @@ -875,6 +1891,7 @@ "ocr": { "tags": "reconeixement,text,imatge,escaneig,lectura,identificaciÃŗ,detecciÃŗ,editable", "title": "OCR / Neteja Escanejats", + "desc": "Neteja escanejats i detecta text d'imatges dins d'un PDF, tornant-lo a afegir com a text.", "header": "Neteja Escanejats / OCR (Reconeixement Òptic de Caràcters)", "selectText": { "1": "Selecciona els idiomes que s'han de detectar dins del PDF (els que s'indiquen sÃŗn els detectats):", @@ -893,23 +1910,89 @@ "help": "Llegeix aquesta documentaciÃŗ sobre com utilitzar-la per a altres idiomes i/o no utilitzar-la a Docker", "credit": "Aquest servei fa servir qpdf i Tesseract per a OCR.", "submit": "Processa PDF amb OCR", - "desc": "Neteja escanejats i detecta text d'imatges dins d'un PDF, tornant-lo a afegir com a text.", + "operation": { + "submit": "Process OCR and Review" + }, + "results": { + "title": "OCR Results" + }, + "languagePicker": { + "additionalLanguages": "Looking for additional languages?", + "viewSetupGuide": "View setup guide →" + }, "settings": { "title": "Opcions", "ocrMode": { - "label": "Mode OCR" + "label": "Mode OCR", + "auto": "Auto (skip text layers)", + "force": "Force (re-OCR all, replace text)", + "strict": "Strict (abort if text found)" }, "languages": { - "label": "Idiomes" + "label": "Idiomes", + "placeholder": "Select languages" + }, + "compatibilityMode": { + "label": "Compatibility Mode" + }, + "advancedOptions": { + "label": "Processing Options", + "sidecar": "Create a text file", + "deskew": "Deskew pages", + "clean": "Clean input file", + "cleanFinal": "Clean final output" } }, "tooltip": { + "header": { + "title": "OCR Settings Overview" + }, "mode": { - "title": "Mode OCR" + "title": "Mode OCR", + "text": "Optical Character Recognition (OCR) helps you turn scanned or screenshotted pages into text you can search, copy, or highlight.", + "bullet1": "Auto skips pages that already contain text layers.", + "bullet2": "Force re-OCRs every page and replaces all the text.", + "bullet3": "Strict halts if any selectable text is found." }, "languages": { - "title": "Idiomes" + "title": "Idiomes", + "text": "Improve OCR accuracy by specifying the expected languages. Choose one or more languages to guide detection." + }, + "output": { + "title": "Output", + "text": "Decide how you want the text output formatted:", + "bullet1": "Searchable PDF embeds text behind the original image.", + "bullet2": "HOCR XML returns a structured machine-readable file.", + "bullet3": "Plain-text sidecar creates a separate .txt file with raw content." + }, + "advanced": { + "header": { + "title": "Advanced OCR Processing" + }, + "compatibility": { + "title": "Compatibility Mode", + "text": "Uses OCR 'sandwich PDF' mode: results in larger files, but more reliable with certain languages and older PDF software. By default we use hOCR for smaller, modern PDFs." + }, + "sidecar": { + "title": "Create Text File", + "text": "Generates a separate .txt file alongside the PDF containing all extracted text content for easy access and processing." + }, + "deskew": { + "title": "Deskew Pages", + "text": "Automatically corrects skewed or tilted pages to improve OCR accuracy. Useful for scanned documents that weren't perfectly aligned." + }, + "clean": { + "title": "Clean Input File", + "text": "Preprocesses the input by removing noise, enhancing contrast, and optimising the image for better OCR recognition before processing." + }, + "cleanFinal": { + "title": "Clean Final Output", + "text": "Post-processes the final PDF by removing OCR artefacts and optimising the text layer for better readability and smaller file size." + } } + }, + "error": { + "failed": "OCR operation failed" } }, "extractImages": { @@ -918,7 +2001,13 @@ "header": "Extreu Imatges", "selectText": "Selecciona el format d'imatge al qual convertir les imatges extretes", "allowDuplicates": "Desa imatges duplicades", - "submit": "Extreu" + "submit": "Extreu", + "settings": { + "title": "Settings" + }, + "error": { + "failed": "An error occurred while extracting images from the PDF." + } }, "pdfToPDFA": { "tags": "arxiu,llarg termini,estàndard,conversiÃŗ,emmagatzematge,preservaciÃŗ", @@ -990,17 +2079,53 @@ }, "info": "Python no està instal¡lat. És necessari per executar-ho." }, + "scannerImageSplit": { + "title": "Extracted Images", + "submit": "Extract Image Scans", + "error": { + "failed": "An error occurred while extracting image scans." + }, + "tooltip": { + "title": "Photo Splitter", + "whatThisDoes": "What this does", + "whatThisDoesDesc": "Automatically finds and extracts each photo from a scanned page or composite image—no manual cropping.", + "whenToUse": "When to use", + "useCase1": "Scan whole album pages in one go", + "useCase2": "Split flatbed batches into separate files", + "useCase3": "Break collages into individual photos", + "useCase4": "Pull photos from documents", + "quickFixes": "Quick fixes", + "problem1": "Photos not detected → increase Tolerance to 30-50", + "problem2": "Too many false detections → increase Minimum Area to 15,000-20,000", + "problem3": "Crops are too tight → increase Border Size to 5-10", + "problem4": "Tilted photos not straightened → lower Angle Threshold to ~5°", + "problem5": "Dust/noise boxes → increase Minimum Contour Area to 1000-2000", + "setupTips": "Setup tips", + "tip1": "Use a plain, light background", + "tip2": "Leave a small gap (≈1 cm) between photos", + "tip3": "Scan at 300-600 DPI", + "tip4": "Clean the scanner glass", + "headsUp": "Heads-up", + "headsUpDesc": "Overlapping photos or backgrounds very close in colour to the photos can reduce accuracy-try a lighter or darker background and leave more space." + } + }, "sign": { - "tags": "autoritza,inicis,signatura dibuixada,signatura de text,signatura amb imatge", "title": "Signa", "header": "Signa els PDF", "upload": "Penja la imatge", - "draw": "Dibuixa la signatura", - "text": "Entrada de text", + "draw": { + "title": "Draw your signature", + "clear": "Clear" + }, + "text": { + "name": "Signer Name", + "placeholder": "Enter your full name" + }, "clear": "Esborra", "add": "Afegeix", "saved": "Signatures Desades", "save": "Desa Signatura", + "applySignatures": "Apply Signatures", "personalSigs": "Signatures Personals", "sharedSigs": "Signatures Compartides", "noSavedSigs": "No s'han trobat signatures desades", @@ -1012,42 +2137,179 @@ "previous": "Previous page", "maintainRatio": "Toggle maintain aspect ratio", "undo": "Undo", - "redo": "Redo" + "redo": "Redo", + "submit": "Sign Document", + "steps": { + "configure": "Configure Signature" + }, + "type": { + "title": "Signature Type", + "draw": "Draw", + "canvas": "Canvas", + "image": "Image", + "text": "Text" + }, + "image": { + "label": "Upload signature image", + "placeholder": "Select image file", + "hint": "Upload a PNG or JPG image of your signature" + }, + "instructions": { + "title": "How to add signature", + "canvas": "After drawing your signature in the canvas, close the modal then click anywhere on the PDF to place it.", + "image": "After uploading your signature image above, click anywhere on the PDF to place it.", + "text": "After entering your name above, click anywhere on the PDF to place your signature." + }, + "mode": { + "move": "Move Signature", + "place": "Place Signature" + }, + "updateAndPlace": "Update and Place", + "activate": "Activate Signature Placement", + "deactivate": "Stop Placing Signatures", + "results": { + "title": "Signature Results" + }, + "error": { + "failed": "An error occurred while signing the PDF." + }, + "tags": "autoritza,inicis,signatura dibuixada,signatura de text,signatura amb imatge" }, "flatten": { - "tags": "estàtic,desactivar,no interactiu,simplifica", "title": "Aplanar", "header": "Aplana els PDF", "flattenOnlyForms": "Aplana nomÊs els formularis", "submit": "Aplanar", + "filenamePrefix": "flattened", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, "steps": { "settings": "Opcions" }, "options": { - "flattenOnlyForms": "Aplana nomÊs els formularis" - } + "stepTitle": "Flatten Options", + "title": "Flatten Options", + "flattenOnlyForms": { + "label": "Aplana nomÊs els formularis", + "desc": "Only flatten form fields, leaving other interactive elements intact" + }, + "note": "Flattening removes interactive elements from the PDF, making them non-editable." + }, + "results": { + "title": "Flatten Results" + }, + "error": { + "failed": "An error occurred while flattening the PDF." + }, + "tooltip": { + "header": { + "title": "About Flattening PDFs" + }, + "description": { + "title": "What does flattening do?", + "text": "Flattening makes your PDF non-editable by turning fillable forms and buttons into regular text and images. The PDF will look exactly the same, but no one can change or fill in the forms anymore. Perfect for sharing completed forms, creating final documents for records, or ensuring the PDF looks the same everywhere.", + "bullet1": "Text boxes become regular text (can't be edited)", + "bullet2": "Checkboxes and buttons become pictures", + "bullet3": "Great for final versions you don't want changed", + "bullet4": "Ensures consistent appearance across all devices" + }, + "formsOnly": { + "title": "What does 'Flatten only forms' mean?", + "text": "This option only removes the ability to fill in forms, but keeps other features working like clicking links, viewing bookmarks, and reading comments.", + "bullet1": "Forms become non-editable", + "bullet2": "Links still work when clicked", + "bullet3": "Comments and notes remain visible", + "bullet4": "Bookmarks still help you navigate" + } + }, + "tags": "estàtic,desactivar,no interactiu,simplifica" }, "repair": { "tags": "repara,restaura,correcciÃŗ,recupera", "title": "Reparar", "header": "Repara els PDF", - "submit": "Reparar" + "submit": "Reparar", + "description": "This tool will attempt to repair corrupted or damaged PDF files. No additional settings are required.", + "filenamePrefix": "repaired", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst repairing the PDF." + }, + "results": { + "title": "Repair Results" + } }, "removeBlanks": { - "tags": "neteja,simplifica,sense contingut,organitza", "title": "Elimina els espais en blanc", "header": "Elimina les pàgines en blanc", - "threshold": "Llindar:", + "settings": { + "title": "Settings" + }, + "threshold": { + "label": "Pixel Whiteness Threshold" + }, + "whitePercent": { + "label": "White Percentage Threshold", + "unit": "%" + }, + "includeBlankPages": { + "label": "Include detected blank pages" + }, + "tooltip": { + "header": { + "title": "Remove Blank Pages Settings" + }, + "threshold": { + "title": "Pixel Whiteness Threshold", + "text": "Controls how white a pixel must be to be considered 'white'. This helps determine what counts as a blank area on the page.", + "bullet1": "0 = Pure black (most restrictive)", + "bullet2": "128 = Medium grey", + "bullet3": "255 = Pure white (least restrictive)" + }, + "whitePercent": { + "title": "White Percentage Threshold", + "text": "Sets the minimum percentage of white pixels required for a page to be considered blank and removed.", + "bullet1": "Lower values (e.g., 80%) = More pages removed", + "bullet2": "Higher values (e.g., 95%) = Only very blank pages removed", + "bullet3": "Use higher values for documents with light backgrounds" + }, + "includeBlankPages": { + "title": "Include Detected Blank Pages", + "text": "When enabled, creates a separate PDF containing all the blank pages that were detected and removed from the original document.", + "bullet1": "Useful for reviewing what was removed", + "bullet2": "Helps verify the detection accuracy", + "bullet3": "Can be disabled to reduce output file size" + } + }, + "submit": "Elimina els espais en blanc", + "error": { + "failed": "Failed to remove blank pages" + }, + "results": { + "title": "Removed Blank Pages" + }, + "tags": "neteja,simplifica,sense contingut,organitza", "thresholdDesc": "Llindar per determinar el nivell de blanc que ha de tenir un píxel per considerar-lo blanc", - "whitePercent": "Percentatge de blanc (%):", - "whitePercentDesc": "Percentatge de la pàgina que ha de ser blanca per eliminar-la", - "submit": "Elimina els espais en blanc" + "whitePercentDesc": "Percentatge de la pàgina que ha de ser blanca per eliminar-la" }, "removeAnnotations": { "tags": "comentaris,ressalta,notes,marcatge,elimina", "title": "Elimina Anotacions", "header": "Elimina Anotacions", - "submit": "Elimina" + "submit": "Elimina", + "settings": { + "title": "Settings" + }, + "info": { + "title": "About Remove Annotations", + "description": "This tool will remove all annotations (comments, highlights, notes, etc.) from your PDF documents." + }, + "error": { + "failed": "An error occurred while removing annotations from the PDF." + } }, "compare": { "tags": "diferencia,contrasta,canvis,anàlisi", @@ -1079,6 +2341,142 @@ "certSign": { "tags": "autentica,PEM,P12,oficial,encripta", "title": "Signatura amb Certificat", + "filenamePrefix": "signed", + "signMode": { + "stepTitle": "Sign Mode", + "tooltip": { + "header": { + "title": "About PDF Signatures" + }, + "overview": { + "title": "How signatures work", + "text": "Both modes seal the document (any edits are flagged as tampering) and record who/when/how for auditing. Viewer trust depends on the certificate chain." + }, + "manual": { + "title": "Manual - Bring your certificate", + "text": "Use your own certificate files for brand-aligned identity. Can display Trusted when your CA/chain is recognised.", + "use": "Use for: customer-facing, legal, compliance." + }, + "auto": { + "title": "Auto - Zero-setup, instant system seal", + "text": "Signs with a server self-signed certificate. Same tamper-evident seal and audit trail; typically shows Unverified in viewers.", + "use": "Use when: you need speed and consistent internal identity across reviews and records." + }, + "rule": { + "title": "Rule of thumb", + "text": "Need recipient Trusted status? Manual. Need a fast, tamper-evident seal and audit trail with no setup? Auto." + } + } + }, + "certTypeStep": { + "stepTitle": "Certificate Format" + }, + "certFiles": { + "stepTitle": "Certificate Files" + }, + "appearance": { + "stepTitle": "Signature Appearance", + "tooltip": { + "header": { + "title": "About Signature Appearance" + }, + "invisible": { + "title": "Invisible Signatures", + "text": "The signature is added to the PDF for security but won't be visible when viewing the document. Perfect for legal requirements without changing the document's appearance.", + "bullet1": "Provides security without visual changes", + "bullet2": "Meets legal requirements for digital signing", + "bullet3": "Doesn't affect document layout or design" + }, + "visible": { + "title": "Visible Signatures", + "text": "Shows a signature block on the PDF with your name, date, and optional details. Useful when you want readers to clearly see the document is signed.", + "bullet1": "Shows signer name and date on the document", + "bullet2": "Can include reason and location for signing", + "bullet3": "Choose which page to place the signature", + "bullet4": "Optional logo can be included" + } + }, + "invisible": "Invisible", + "options": { + "title": "Signature Details" + }, + "visible": "Visible" + }, + "sign": { + "submit": "Sign PDF", + "results": "Signed PDF" + }, + "error": { + "failed": "An error occurred whilst processing signatures." + }, + "tooltip": { + "header": { + "title": "About Managing Signatures" + }, + "overview": { + "title": "What can this tool do?", + "text": "This tool lets you check if your PDFs are digitally signed and add new digital signatures. Digital signatures prove who created or approved a document and show if it has been changed since signing.", + "bullet1": "Check existing signatures and their validity", + "bullet2": "View detailed information about signers and certificates", + "bullet3": "Add new digital signatures to secure your documents", + "bullet4": "Multiple files supported with easy navigation" + }, + "validation": { + "title": "Checking Signatures", + "text": "When you check signatures, the tool tells you if they're valid, who signed the document, when it was signed, and whether the document has been changed since signing.", + "bullet1": "Shows if signatures are valid or invalid", + "bullet2": "Displays signer information and signing date", + "bullet3": "Checks if the document was modified after signing", + "bullet4": "Can use custom certificates for verification" + }, + "signing": { + "title": "Adding Signatures", + "text": "To sign a PDF, you need a digital certificate (like PEM, PKCS12, or JKS). You can choose to make the signature visible on the document or keep it invisible for security only.", + "bullet1": "Supports PEM, PKCS12, JKS, and server certificate formats", + "bullet2": "Option to show or hide signature on the PDF", + "bullet3": "Add reason, location, and signer name", + "bullet4": "Choose which page to place visible signatures", + "bullet5": "Use server certificate for simple 'Sign with Stirling-PDF' option" + } + }, + "certType": { + "tooltip": { + "header": { + "title": "About Certificate Types" + }, + "what": { + "title": "What's a certificate?", + "text": "It's a secure ID for your signature that proves you signed. Unless you're required to sign via certificate, we recommend using another secure method like Type, Draw, or Upload." + }, + "which": { + "title": "Which option should I use?", + "text": "Choose the format that matches your certificate file:", + "bullet1": "PKCS#12 (.p12 / .pfx) – one combined file (most common)", + "bullet2": "PFX (.pfx) – Microsoft's version of PKCS12", + "bullet3": "PEM – separate private-key and certificate .pem files", + "bullet4": "JKS – Java .jks keystore for dev / CI-CD workflows" + }, + "convert": { + "title": "Key not listed?", + "text": "Convert your file to a Java keystore (.jks) with keytool, then pick JKS." + } + } + }, + "chooseCertificate": "Choose Certificate File", + "chooseJksFile": "Choose JKS File", + "chooseP12File": "Choose PKCS12 File", + "choosePfxFile": "Choose PFX File", + "choosePrivateKey": "Choose Private Key File", + "location": "UbicaciÃŗ", + "logoTitle": "Logo", + "name": "Nom", + "noLogo": "No Logo", + "pageNumber": "Page Number", + "password": "Introduïu la contrasenya del vostre magatzem de claus o clau privada (si n'hi ha):", + "passwordOptional": "Leave empty if no password", + "reason": "Motiu", + "serverCertMessage": "Using server certificate - no files or password required", + "showLogo": "Mostra el logotip", "header": "Signa un PDF amb el teu certificat (Treball en curs)", "selectPDF": "Seleccioneu un fitxer PDF per signar:", "jksNote": "Nota: Si el vostre tipus de certificat no es troba a la llista, convertiu-lo a un fitxer de Java Keystore (.jks) utilitzant l'eina de línia de comandes keytool. A continuaciÃŗ, trieu l'opciÃŗ de fitxer .jks mÊs avall.", @@ -1086,13 +2484,7 @@ "selectCert": "Seleccioneu el vostre fitxer de certificat (format X.509, podria ser .pem o .der):", "selectP12": "Seleccioneu el vostre fitxer de magatzem de claus PKCS#12 (.p12 o .pfx) (Opcional, si es proporciona, hauria de contenir la vostra clau privada i certificat):", "selectJKS": "Seleccioneu el vostre fitxer de Java Keystore (.jks o .keystore):", - "certType": "Tipus de certificat", - "password": "Introduïu la contrasenya del vostre magatzem de claus o clau privada (si n'hi ha):", "showSig": "Mostra la signatura", - "reason": "Motiu", - "location": "UbicaciÃŗ", - "name": "Nom", - "showLogo": "Mostra el logotip", "submit": "Signa PDF" }, "removeCertSign": { @@ -1100,7 +2492,18 @@ "title": "Elimina la Signatura del Certificat", "header": "Elimina el certificat digital del PDF", "selectPDF": "Seleccioneu un fitxer PDF:", - "submit": "Elimina Signatura" + "submit": "Elimina Signatura", + "description": "This tool will remove digital certificate signatures from your PDF document.", + "filenamePrefix": "unsigned", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst removing certificate signatures." + }, + "results": { + "title": "Certificate Removal Results" + } }, "pageLayout": { "tags": "fusiÃŗ,composiciÃŗ,vista Ãēnica,organitzar", @@ -1108,16 +2511,157 @@ "header": "DisposiciÃŗ de MÃēltiples Pàgines", "pagesPerSheet": "Pàgines per full:", "addBorder": "Afegeix Marcs", - "submit": "Envia" + "submit": "Envia", + "desc": { + "2": "Place 2 pages side-by-side on a single sheet.", + "3": "Place 3 pages on a single sheet in a single row.", + "4": "Place 4 pages on a single sheet (2 × 2 grid).", + "9": "Place 9 pages on a single sheet (3 × 3 grid).", + "16": "Place 16 pages on a single sheet (4 × 4 grid)." + }, + "error": { + "failed": "An error occurred while creating the multi-page layout." + } + }, + "bookletImposition": { + "tags": "booklet,imposition,printing,binding,folding,signature", + "title": "Booklet Imposition", + "header": "Booklet Imposition", + "submit": "Create Booklet", + "spineLocation": { + "label": "Spine Location", + "left": "Left (Standard)", + "right": "Right (RTL)" + }, + "doubleSided": { + "label": "Double-sided printing", + "tooltip": "Creates both front and back sides for proper booklet printing" + }, + "manualDuplex": { + "title": "Manual Duplex Mode", + "instructions": "For printers without automatic duplex. You'll need to run this twice:" + }, + "duplexPass": { + "label": "Print Pass", + "first": "1st Pass", + "second": "2nd Pass", + "firstInstructions": "Prints front sides → stack face-down → run again with 2nd Pass", + "secondInstructions": "Load printed stack face-down → prints back sides" + }, + "rtlBinding": { + "label": "Right-to-left binding", + "tooltip": "For Arabic, Hebrew, or other right-to-left languages" + }, + "addBorder": { + "label": "Add borders around pages", + "tooltip": "Adds borders around each page section to help with cutting and alignment" + }, + "addGutter": { + "label": "Add gutter margin", + "tooltip": "Adds inner margin space for binding" + }, + "gutterSize": { + "label": "Gutter size (points)" + }, + "flipOnShortEdge": { + "label": "Flip on short edge (automatic duplex only)", + "tooltip": "Enable for short-edge duplex printing (automatic duplex only - ignored in manual mode)", + "manualNote": "Not needed in manual mode - you flip the stack yourself" + }, + "advanced": { + "toggle": "Advanced Options" + }, + "paperSizeNote": "Paper size is automatically derived from your first page.", + "tooltip": { + "header": { + "title": "Booklet Creation Guide" + }, + "description": { + "title": "What is Booklet Imposition?", + "text": "Creates professional booklets by arranging pages in the correct printing order. Your PDF pages are placed 2-up on landscape sheets so when folded and bound, they read in proper sequence like a real book." + }, + "example": { + "title": "Example: 8-Page Booklet", + "text": "Your 8-page document becomes 2 sheets:", + "bullet1": "Sheet 1 Front: Pages 8, 1 | Back: Pages 2, 7", + "bullet2": "Sheet 2 Front: Pages 6, 3 | Back: Pages 4, 5", + "bullet3": "When folded & stacked: Reads 1→2→3→4→5→6→7→8" + }, + "printing": { + "title": "How to Print & Assemble", + "text": "Follow these steps for perfect booklets:", + "bullet1": "Print double-sided with 'Flip on long edge'", + "bullet2": "Stack sheets in order, fold in half", + "bullet3": "Staple or bind along the folded spine", + "bullet4": "For short-edge printers: Enable 'Flip on short edge' option" + }, + "manualDuplex": { + "title": "Manual Duplex (Single-sided Printers)", + "text": "For printers without automatic duplex:", + "bullet1": "Turn OFF 'Double-sided printing'", + "bullet2": "Select '1st Pass' → Print → Stack face-down", + "bullet3": "Select '2nd Pass' → Load stack → Print backs", + "bullet4": "Fold and assemble as normal" + }, + "advanced": { + "title": "Advanced Options", + "text": "Fine-tune your booklet:", + "bullet1": "Right-to-Left Binding: For Arabic, Hebrew, or RTL languages", + "bullet2": "Borders: Shows cut lines for trimming", + "bullet3": "Gutter Margin: Adds space for binding/stapling", + "bullet4": "Short-edge Flip: Only for automatic duplex printers" + } + }, + "error": { + "failed": "An error occurred while creating the booklet imposition." + } }, "scalePages": { - "tags": "redimensionar,modificar,dimensiÃŗ,adaptar", "title": "Ajusta l'escala de la pàgina", "header": "Ajusta l'escala de la pàgina", "pageSize": "Mida d'una pàgina del document.", "keepPageSize": "Mida Original", "scaleFactor": "Nivell de zoom (retall) d'una pàgina.", - "submit": "Envia" + "submit": "Envia", + "tags": "redimensionar,modificar,dimensiÃŗ,adaptar" + }, + "adjustPageScale": { + "tags": "resize,modify,dimension,adapt", + "title": "Adjust Page Scale", + "header": "Adjust Page Scale", + "scaleFactor": { + "label": "Scale Factor" + }, + "pageSize": { + "label": "Target Page Size", + "keep": "Keep Original Size", + "letter": "Letter", + "legal": "Legal" + }, + "submit": "Adjust Page Scale", + "error": { + "failed": "An error occurred while adjusting the page scale." + }, + "tooltip": { + "header": { + "title": "Page Scale Settings Overview" + }, + "description": { + "title": "Description", + "text": "Adjust the size of PDF content and change the page dimensions." + }, + "scaleFactor": { + "title": "Scale Factor", + "text": "Controls how large or small the content appears on the page. Content is scaled and centred - if scaled content is larger than the page size, it may be cropped.", + "bullet1": "1.0 = Original size", + "bullet2": "0.5 = Half size (50% smaller)", + "bullet3": "2.0 = Double size (200% larger, may crop)" + }, + "pageSize": { + "title": "Target Page Size", + "text": "Sets the dimensions of the output PDF pages. 'Keep Original Size' maintains current dimensions, whilst other options resize to standard paper sizes." + } + } }, "add-page-numbers": { "tags": "pàgina,etiqueta,organitza,indexa" @@ -1126,16 +2670,83 @@ "tags": "autodetect,basat en capçalera,organitzar,reetiquetar", "title": "Canvi de Nom Automàtic", "header": "Canvi de Nom Automàtic de PDF", - "submit": "Canvi de Nom Automàtic" + "description": "Automatically finds the title from your PDF content and uses it as the filename.", + "submit": "Canvi de Nom Automàtic", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst auto-renaming the PDF." + }, + "results": { + "title": "Auto-Rename Results" + }, + "tooltip": { + "header": { + "title": "How Auto-Rename Works" + }, + "howItWorks": { + "title": "Smart Renaming", + "text": "Automatically finds the title from your PDF content and uses it as the filename.", + "bullet1": "Looks for text that appears to be a title or heading", + "bullet2": "Creates a clean, valid filename from the detected title", + "bullet3": "Keeps the original name if no suitable title is found" + } + } }, "adjust-contrast": { "tags": "correcciÃŗ de color,ajustar,modificar,millorar" }, "crop": { - "tags": "retallar,reduir,editar,donar forma", "title": "Talla", "header": "Talla PDF", - "submit": "Envia" + "submit": "Envia", + "noFileSelected": "Select a PDF file to begin cropping", + "preview": { + "title": "Crop Area Selection" + }, + "reset": "Reset to full PDF", + "coordinates": { + "title": "Position and Size", + "x": { + "label": "X Position", + "desc": "Left edge (points)" + }, + "y": { + "label": "Y Position", + "desc": "Bottom edge (points)" + }, + "width": { + "label": "Width", + "desc": "Crop width (points)" + }, + "height": { + "label": "Height", + "desc": "Crop height (points)" + } + }, + "error": { + "invalidArea": "Crop area extends beyond PDF boundaries", + "failed": "Failed to crop PDF" + }, + "steps": { + "selectArea": "Select Crop Area" + }, + "tooltip": { + "title": "How to Crop PDFs", + "description": "Select the area to crop from your PDF by dragging and resizing the blue overlay on the thumbnail.", + "drag": "Drag the overlay to move the crop area", + "resize": "Drag the corner and edge handles to resize", + "precision": "Use coordinate inputs for precise positioning" + }, + "results": { + "title": "Crop Results" + }, + "automation": { + "info": "Enter crop coordinates in PDF points. Origin (0,0) is at bottom-left. These values will be applied to all PDFs processed in this automation.", + "reference": "Reference: A4 page is 595.28 × 841.89 points (210mm × 297mm). 1 inch = 72 points." + }, + "tags": "retallar,reduir,editar,donar forma" }, "autoSplitPDF": { "tags": "basat en QR,separar,segmentaciÃŗ d'escaneig,organitzar", @@ -1218,24 +2829,124 @@ "downloadJS": "Descarrega Javascript", "submit": "Mostra" }, - "autoRedact": { - "tags": "Redactar,Amagar,ressaltar en negre,negre,marcador,ocult", - "title": "RedacciÃŗ Automàtica", - "header": "RedacciÃŗ Automàtica", - "colorLabel": "Color", - "textsToRedactLabel": "Text a Redactar (separat per línies)", - "textsToRedactPlaceholder": "p. ex. \\nConfidencial \\nMolt Secret", - "useRegexLabel": "Utilitza Regex", - "wholeWordSearchLabel": "Cerca de Paraula Completa", - "customPaddingLabel": "Espai Extra Personalitzat", - "convertPDFToImageLabel": "Converteix PDF a Imatge PDF (S'utilitza per eliminar text darrere del quadre)", - "submitButton": "Envia" - }, "redact": { "tags": "Redactar,Amagar,ressaltar en negre,negre,marcador,ocult,manual", "title": "RedacciÃŗ manual", - "header": "RedacciÃŗ manual", "submit": "Redacta", + "error": { + "failed": "An error occurred while redacting the PDF." + }, + "modeSelector": { + "title": "Redaction Method", + "mode": "Mode", + "automatic": "Automatic", + "automaticDesc": "Redact text based on search terms", + "manual": "Manual", + "manualDesc": "Click and drag to redact specific areas", + "manualComingSoon": "Manual redaction coming soon" + }, + "auto": { + "header": "Auto Redact", + "settings": { + "title": "Redaction Settings", + "advancedTitle": "Avançat" + }, + "colorLabel": "Box Colour", + "wordsToRedact": { + "title": "Words to Redact", + "placeholder": "Enter a word", + "add": "Afegeix", + "examples": "Examples: Confidential, Top-Secret" + }, + "useRegexLabel": "Use Regex", + "wholeWordSearchLabel": "Whole Word Search", + "customPaddingLabel": "Custom Extra Padding", + "convertPDFToImageLabel": "Convert PDF to PDF-Image" + }, + "tooltip": { + "mode": { + "header": { + "title": "Redaction Method" + }, + "automatic": { + "title": "Automatic Redaction", + "text": "Automatically finds and redacts specified text throughout the document. Perfect for removing consistent sensitive information like names, addresses, or confidential markers." + }, + "manual": { + "title": "Manual Redaction", + "text": "Click and drag to manually select specific areas to redact. Gives you precise control over what gets redacted. (Coming soon)" + } + }, + "words": { + "header": { + "title": "Words to Redact" + }, + "description": { + "title": "Text Matching", + "text": "Enter words or phrases to find and redact in your document. Each word will be searched for separately." + }, + "bullet1": "Add one word at a time", + "bullet2": "Press Enter or click 'Add Another' to add", + "bullet3": "Click × to remove words", + "examples": { + "title": "Common Examples", + "text": "Typical words to redact include: bank details, email addresses, or specific names." + } + }, + "advanced": { + "header": { + "title": "Advanced Redaction Settings" + }, + "color": { + "title": "Box Colour & Padding", + "text": "Customise the appearance of redaction boxes. Black is standard, but you can choose any colour. Padding adds extra space around the found text." + }, + "regex": { + "title": "Use Regex", + "text": "Enable regular expressions for advanced pattern matching. Useful for finding phone numbers, emails, or complex patterns.", + "bullet1": "Example: \\d{4}-\\d{2}-\\d{2} to match any dates in YYYY-MM-DD format", + "bullet2": "Use with caution - test thoroughly" + }, + "wholeWord": { + "title": "Whole Word Search", + "text": "Only match complete words, not partial matches. 'John' won't match 'Johnson' when enabled." + }, + "convert": { + "title": "Convert to PDF-Image", + "text": "Converts the PDF to an image-based PDF after redaction. This ensures text behind redaction boxes is completely removed and unrecoverable." + } + } + }, + "manual": { + "header": "Manual Redaction", + "textBasedRedaction": "Text-based Redaction", + "pageBasedRedaction": "Page-based Redaction", + "convertPDFToImageLabel": "Convert PDF to PDF-Image (Used to remove text behind the box)", + "pageRedactionNumbers": { + "title": "Pàgines", + "placeholder": "(p. ex. 1,2,8 o 4,7,12-16 o 2n-1)" + }, + "redactionColor": { + "title": "Redaction Colour" + }, + "export": "Exporta", + "upload": "Upload", + "boxRedaction": "Box draw redaction", + "zoom": "Zoom", + "zoomIn": "Zoom in", + "zoomOut": "Zoom out", + "nextPage": "Next Page", + "previousPage": "Previous Page", + "toggleSidebar": "Toggle Sidebar", + "showThumbnails": "Show Thumbnails", + "showDocumentOutline": "Show Document Outline (double-click to expand/collapse all items)", + "showAttachments": "Show Attachments", + "showLayers": "Show Layers (double-click to reset all layers to the default state)", + "colourPicker": "Colour Picker", + "findCurrentOutlineItem": "Find current outline item", + "applyChanges": "Apply Changes" + }, + "header": "RedacciÃŗ manual", "textBasedRedaction": "RedacciÃŗ basada en text", "pageBasedRedaction": "RedacciÃŗ basada en pàgines", "convertPDFToImageLabel": "Converteix PDF a PDF-imatge (utilitzat per eliminar text darrere del quadre)", @@ -1261,22 +2972,7 @@ "showLayers": "Mostra les capes (doble clic per restablir totes les capes a l'estat per defecte)", "colourPicker": "Selector de colors", "findCurrentOutlineItem": "Troba l'element actual de l'esquema", - "applyChanges": "Aplica els canvis", - "auto": { - "settings": { - "advancedTitle": "Avançat" - }, - "wordsToRedact": { - "add": "Afegeix" - } - }, - "manual": { - "pageRedactionNumbers": { - "title": "Pàgines", - "placeholder": "(p. ex. 1,2,8 o 4,7,12-16 o 2n-1)" - }, - "export": "Exporta" - } + "applyChanges": "Aplica els canvis" }, "tableExtraxt": { "tags": "CSV,ExtracciÃŗ de taules,extreure,convertir" @@ -1287,11 +2983,15 @@ "overlay-pdfs": { "tags": "SuperposiciÃŗ", "header": "Superposar Fitxers PDF", + "title": "Overlay PDFs", + "desc": "Overlay one PDF on top of another", "baseFile": { "label": "Selecciona el Fitxer PDF Base" }, "overlayFiles": { - "label": "Selecciona els Fitxers PDF a Superposar" + "label": "Selecciona els Fitxers PDF a Superposar", + "placeholder": "Choose PDF(s)...", + "addMore": "Add more PDFs..." }, "mode": { "label": "Selecciona el Mode de SuperposiciÃŗ", @@ -1301,14 +3001,53 @@ }, "counts": { "label": "Nombre de Superposicions (per al Mode de Repte Fix)", - "placeholder": "Introdueix els nombres separats per comes (p. ex., 2,3,1)" + "placeholder": "Introdueix els nombres separats per comes (p. ex., 2,3,1)", + "item": "Count for file", + "noFiles": "Add overlay files to configure counts" }, "position": { "label": "Selecciona la PosiciÃŗ de la SuperposiciÃŗ", "foreground": "Primer pla", "background": "Fons" }, - "submit": "Envia" + "submit": "Envia", + "settings": { + "title": "Settings" + }, + "results": { + "title": "Overlay Results" + }, + "tooltip": { + "header": { + "title": "Overlay PDFs Overview" + }, + "description": { + "title": "Description", + "text": "Combine a base PDF with one or more overlay PDFs. Overlays can be applied page-by-page in different modes and placed in the foreground or background." + }, + "mode": { + "title": "Overlay Mode", + "text": "Choose how to distribute overlay pages across the base PDF pages.", + "sequential": "Sequential Overlay: Use pages from the first overlay PDF until it ends, then move to the next.", + "interleaved": "Interleaved Overlay: Take one page from each overlay in turn.", + "fixedRepeat": "Fixed Repeat Overlay: Take a set number of pages from each overlay before moving to the next. Use Counts to set the numbers." + }, + "position": { + "title": "Overlay Position", + "text": "Foreground places the overlay on top of the page. Background places it behind." + }, + "overlayFiles": { + "title": "Overlay Files", + "text": "Select one or more PDFs to overlay on the base. The order of these files affects how pages are applied in Sequential and Fixed Repeat modes." + }, + "counts": { + "title": "Counts (Fixed Repeat only)", + "text": "Provide a positive number for each overlay file showing how many pages to take before moving to the next. Required when mode is Fixed Repeat." + } + }, + "error": { + "failed": "An error occurred while overlaying PDFs." + } }, "split-by-sections": { "tags": "DivisiÃŗ per seccions,Divideix,Personalitza", @@ -1329,6 +3068,7 @@ "tags": "Segell, Afegeix imatge, Centra imatge, Marca d'aigua, PDF, Insereix, Personalitza", "header": "Segella PDF", "title": "Segella PDF", + "stampSetup": "Stamp Setup", "stampType": "Tipus de Segell", "stampText": "Text del Segell", "stampImage": "Imatge del Segell", @@ -1341,7 +3081,19 @@ "overrideY": "Modifica la Coordenada Y", "customMargin": "Marge Personalitzat", "customColor": "Color de Text Personalitzat", - "submit": "Envia" + "submit": "Envia", + "noStampSelected": "No stamp selected. Return to Step 1.", + "customPosition": "Drag the stamp to the desired location in the preview window.", + "error": { + "failed": "An error occurred while adding stamp to the PDF." + }, + "imageSize": "Image Size", + "margin": "Margin", + "positionAndFormatting": "Position & Formatting", + "quickPosition": "Select a position on the page to place the stamp.", + "results": { + "title": "Stamp Results" + } }, "removeImagePdf": { "tags": "Elimina imatge,Operacions de pàgina,Back-end,Servidor" @@ -1359,7 +3111,8 @@ "status": { "_value": "Estat", "valid": "Vàlid", - "invalid": "Invàlid" + "invalid": "Invàlid", + "complete": "Validation complete" }, "signer": "Signant", "date": "Data", @@ -1386,40 +3139,122 @@ "version": "VersiÃŗ", "keyUsage": "Ús de la clau", "selfSigned": "Autofirmat", - "bits": "bits" + "bits": "bits", + "details": "Certificate Details" }, "signature": { "info": "InformaciÃŗ de la Signatura", "_value": "Signatura", "mathValid": "La signatura Ês matemàticament vàlida, PERÒ:" }, - "selectCustomCert": "Fitxer de Certificat Personalitzat X.509 (Opcional)" - }, - "replace-color": { - "title": "Reemplaça-Inverteix-Color", - "header": "Reemplaça-Inverteix Color en PDF", - "selectText": { - "1": "Opcions per Reemplaçar o Invertir color", - "2": "Per defecte (Colors d'alt contrast per defecte)", - "3": "Personalitzat (Colors personalitzats)", - "4": "InversiÃŗ completa (Inverteix tots els colors)", - "5": "Opcions de color d'alt contrast", - "6": "Text blanc sobre fons negre", - "7": "Text negre sobre fons blanc", - "8": "Text groc sobre fons negre", - "9": "Text verd sobre fons negre", - "10": "Tria el color del text", - "11": "Tria el color del fons" + "selectCustomCert": "Fitxer de Certificat Personalitzat X.509 (Opcional)", + "downloadCsv": "Download CSV", + "downloadJson": "Download JSON", + "downloadPdf": "Download PDF Report", + "downloadType": { + "csv": "CSV", + "json": "JSON", + "pdf": "PDF" }, - "submit": "Reemplaça" + "error": { + "allFailed": "Unable to validate the selected files.", + "partial": "Some files could not be validated.", + "reportGeneration": "Could not generate the PDF report. JSON and CSV are available.", + "unexpected": "Unexpected error during validation." + }, + "finalizing": "Preparing downloads...", + "issue": { + "certExpired": "Certificate expired", + "certRevocationUnknown": "Certificate revocation status unknown", + "certRevoked": "Certificate revoked", + "chainInvalid": "Certificate chain invalid", + "signatureInvalid": "Signature cryptographic check failed", + "trustInvalid": "Certificate not trusted" + }, + "noResults": "Run the validation to generate a report.", + "noSignaturesShort": "No signatures", + "processing": "Validating signatures...", + "report": { + "continued": "Continued", + "downloads": "Downloads", + "entryLabel": "Signature Summary", + "fields": { + "created": "Created", + "fileSize": "File Size", + "signatureCount": "Total Signatures", + "signatureDate": "Signature Date" + }, + "filesEvaluated": "{{count}} files evaluated", + "footer": "Validated via Stirling PDF", + "generatedAt": "Generated", + "noPdf": "PDF report will be available after a successful validation.", + "page": "Page", + "shortTitle": "Signature Summary", + "signatureCountLabel": "{{count}} signatures", + "signaturesFound": "{{count}} signatures detected", + "signaturesValid": "{{count}} fully valid", + "title": "Signature Validation Report" + }, + "settings": { + "certHint": "Upload a trusted X.509 certificate to validate against a custom trust source.", + "title": "Validation Settings" + }, + "signatureDate": "Signature Date", + "totalSignatures": "Total Signatures" }, - "replaceColorPdf": { - "tags": "Reemplaça Color,Operacions de pàgina,Back end,Costat servidor" + "replaceColor": { + "tags": "Replace Colour,Page operations,Back end,server side", + "labels": { + "settings": "Settings", + "colourOperation": "Colour operation" + }, + "options": { + "highContrast": "High contrast", + "invertAll": "Invert all colours", + "custom": "Custom", + "cmyk": "Convert to CMYK" + }, + "tooltip": { + "header": { + "title": "Replace & Invert Colour Settings Overview" + }, + "description": { + "title": "Description", + "text": "Transform PDF colours to improve readability and accessibility. Choose from high contrast presets, invert all colours, or create custom colour schemes." + }, + "highContrast": { + "title": "High Contrast", + "text": "Apply predefined high contrast colour combinations designed for better readability and accessibility compliance.", + "bullet1": "White text on black background - Classic dark mode", + "bullet2": "Black text on white background - Standard high contrast", + "bullet3": "Yellow text on black background - High visibility option", + "bullet4": "Green text on black background - Alternative high contrast" + }, + "invertAll": { + "title": "Invert All Colours", + "text": "Completely invert all colours in the PDF, creating a negative-like effect. Useful for creating dark mode versions of documents or reducing eye strain in low-light conditions." + }, + "custom": { + "title": "Custom Colours", + "text": "Define your own text and background colours using the colour pickers. Perfect for creating branded documents or specific accessibility requirements.", + "bullet1": "Text colour - Choose the colour for text elements", + "bullet2": "Background colour - Set the background colour for the document" + }, + "cmyk": { + "title": "Convert to CMYK", + "text": "Convert the PDF from RGB colour space to CMYK colour space, optimized for professional printing. This process converts colours to the Cyan, Magenta, Yellow, Black model used by printers." + } + }, + "error": { + "failed": "An error occurred while processing the colour replacement." + } }, "login": { "title": "Accedir", "header": "Accedir", "signin": "Accedir", + "signInWith": "Sign in with", + "signInAnonymously": "Sign Up as a Guest", "rememberme": "Recordar", "invalid": "Nom d'usuari/contrasenya no vàlid", "locked": "Compte bloquejat", @@ -1438,12 +3273,83 @@ "alreadyLoggedIn": "Ja has iniciat sessiÃŗ a", "alreadyLoggedIn2": "dispositius. Si us plau, tanca la sessiÃŗ en els dispositius i torna-ho a intentar.", "toManySessions": "Tens massa sessions actives", - "logoutMessage": "You have been logged out." + "logoutMessage": "You have been logged out.", + "youAreLoggedIn": "You are logged in!", + "email": "Email", + "password": "Password", + "enterEmail": "Enter your email", + "enterPassword": "Enter your password", + "loggingIn": "Logging In...", + "username": "Username", + "enterUsername": "Enter username", + "useEmailInstead": "Login with email", + "forgotPassword": "Forgot your password?", + "logIn": "Log In", + "signingIn": "Signing in...", + "login": "Login", + "or": "Or", + "useMagicLink": "Use magic link instead", + "enterEmailForMagicLink": "Enter your email for magic link", + "sending": "Sendingâ€Ļ", + "sendMagicLink": "Send Magic Link", + "cancel": "Cancel", + "dontHaveAccount": "Don't have an account? Sign up", + "home": "Home", + "debug": "Debug", + "signOut": "Sign Out", + "pleaseEnterBoth": "Please enter both email and password", + "pleaseEnterEmail": "Please enter your email address", + "magicLinkSent": "Magic link sent to {{email}}! Check your email and click the link to sign in.", + "passwordResetSent": "Password reset link sent to {{email}}! Check your email and follow the instructions.", + "failedToSignIn": "Failed to sign in with {{provider}}: {{message}}", + "unexpectedError": "Unexpected error: {{message}}", + "accountCreatedSuccess": "Account created successfully! You can now sign in.", + "passwordChangedSuccess": "Password changed successfully! Please sign in with your new password.", + "credentialsUpdated": "Your credentials have been updated. Please sign in again." + }, + "signup": { + "title": "Create an account", + "subtitle": "Join Stirling PDF to get started", + "name": "Name", + "email": "Email", + "password": "Password", + "confirmPassword": "Confirm password", + "enterName": "Enter your name", + "enterEmail": "Enter your email", + "enterPassword": "Enter your password", + "confirmPasswordPlaceholder": "Confirm password", + "or": "or", + "creatingAccount": "Creating Account...", + "signUp": "Sign Up", + "alreadyHaveAccount": "Already have an account? Sign in", + "pleaseFillAllFields": "Please fill in all fields", + "passwordsDoNotMatch": "Passwords do not match", + "passwordTooShort": "Password must be at least 6 characters long", + "invalidEmail": "Please enter a valid email address", + "checkEmailConfirmation": "Check your email for a confirmation link to complete your registration.", + "accountCreatedSuccessfully": "Account created successfully! You can now sign in.", + "unexpectedError": "Unexpected error: {{message}}", + "useEmailInstead": "Use Email Instead", + "nameRequired": "Name is required", + "emailRequired": "Email is required", + "passwordRequired": "Password is required", + "confirmPasswordRequired": "Please confirm your password" }, "pdfToSinglePage": { "title": "PDF a Pàgina Única", "header": "PDF a Pàgina Única", - "submit": "Converteix a Pàgina Única" + "submit": "Converteix a Pàgina Única", + "description": "This tool will merge all pages of your PDF into one large single page. The width will remain the same as the original pages, but the height will be the sum of all page heights.", + "filenamePrefix": "single_page", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst converting to single page." + }, + "results": { + "title": "Single Page Results" + } }, "pageExtracter": { "title": "Extreu Pàgines", @@ -1467,18 +3373,59 @@ "adjustContrast": { "title": "Ajusta el Contrast", "header": "Ajusta el Contrast", + "basic": "Basic Adjustments", "contrast": "Contrast:", "brightness": "Brillantor:", "saturation": "SaturaciÃŗ:", - "download": "Descarrega" + "download": "Descarrega", + "adjustColors": "Adjust Colors", + "blue": "Blue", + "confirm": "Confirm", + "error": { + "failed": "Failed to adjust colors/contrast" + }, + "green": "Green", + "noPreview": "Select a PDF to preview", + "red": "Red", + "results": { + "title": "Adjusted PDF" + } }, "compress": { "title": "Comprimir", + "desc": "Compress PDFs to reduce their file size.", "header": "Comprimir PDF", + "method": { + "title": "Compression Method", + "quality": "Quality", + "filesize": "Mida del Fitxer" + }, "credit": "Aquest servei utilitza qpdf per a la compressiÃŗ/optimitzaciÃŗ de PDF.", "grayscale": { "label": "Aplicar escala de grisos per a la compressiÃŗ" }, + "tooltip": { + "header": { + "title": "Compress Settings Overview" + }, + "description": { + "title": "Description", + "text": "Compression is an easy way to reduce your file size. Pick File Size to enter a target size and have us adjust quality for you. Pick Quality to set compression strength manually." + }, + "qualityAdjustment": { + "title": "Quality Adjustment", + "text": "Drag the slider to adjust the compression strength. Lower values (1-3) preserve quality but result in larger files. Higher values (7-9) shrink the file more but reduce image clarity.", + "bullet1": "Lower values preserve quality", + "bullet2": "Higher values reduce file size" + }, + "grayscale": { + "title": "Grayscale", + "text": "Select this option to convert all images to black and white, which can significantly reduce file size especially for scanned PDFs or image-heavy documents." + } + }, + "error": { + "failed": "An error occurred while compressing the PDF." + }, "selectText": { "1": { "_value": "Compression Settings", @@ -1488,10 +3435,7 @@ "4": "Mode automàtic: ajusta automàticament la qualitat perquè el PDF tingui la mida exacta", "5": "Mida esperada del PDF (p. ex. 25 MB, 10,8 MB, 25 KB)" }, - "submit": "Comprimir", - "method": { - "filesize": "Mida del Fitxer" - } + "submit": "Comprimir" }, "decrypt": { "passwordPrompt": "Aquest fitxer està protegit amb contrasenya. Si us plau, introdueix la contrasenya:", @@ -1592,7 +3536,13 @@ "title": "Eliminar imatge", "header": "Eliminar imatge", "removeImage": "Eliminar imatge", - "submit": "Eliminar imatge" + "submit": "Eliminar imatge", + "error": { + "failed": "Failed to remove images from the PDF." + }, + "results": { + "title": "Remove Images Results" + } }, "splitByChapters": { "title": "Divideix PDF per Capítols", @@ -1626,6 +3576,12 @@ }, "note": "Les notes de llançament nomÊs estan disponibles en anglès" }, + "swagger": { + "title": "API Documentation", + "header": "API Documentation", + "desc": "View and test the Stirling PDF API endpoints", + "tags": "api,documentation,swagger,endpoints,development" + }, "cookieBanner": { "popUp": { "title": "How we use Cookies", @@ -1661,53 +3617,943 @@ "title": "Analytics", "description": "These cookies help us understand how our tools are being used, so we can focus on building the features our community values most. Rest assured—Stirling PDF cannot and will never track the content of the documents you work with." } + }, + "services": { + "posthog": "PostHog Analytics", + "scarf": "Scarf Pixel" } }, - "download": "Descarrega", - "convert": { - "title": "Converteix", - "settings": "Opcions", - "color": "Color", - "greyscale": "Escala de Grisos", - "fillPage": "Omple la Pàgina", - "pdfaDigitalSignatureWarning": "El PDF contÊ una signatura digital. Aquesta serà eliminada en el segÃŧent pas.", - "grayscale": "Escala de Grisos" + "removeMetadata": { + "submit": "Remove Metadata" }, - "attachments": { - "tags": "embed,attach,file,attachment,attachments", - "title": "Add attachments", - "header": "Add attachments", - "submit": "Add attachments" + "sidebar": { + "toggle": "Toggle Sidebar" + }, + "theme": { + "toggle": "Toggle Theme" + }, + "view": { + "viewer": "Viewer", + "pageEditor": "Page Editor", + "fileManager": "File Manager" + }, + "pageEditor": { + "title": "Page Editor", + "save": "Save Changes", + "noPdfLoaded": "No PDF loaded. Please upload a PDF to edit.", + "rotatedLeft": "Rotated left:", + "rotatedRight": "Rotated right:", + "deleted": "Deleted:", + "movedLeft": "Moved left:", + "movedRight": "Moved right:", + "splitAt": "Split at:", + "insertedPageBreak": "Inserted page break at:", + "addFileNotImplemented": "Add file not implemented in demo", + "closePdf": "Close PDF", + "reset": "Reset Changes", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "fitToWidth": "Fit to Width", + "actualSize": "Actual Size" + }, + "viewer": { + "firstPage": "First Page", + "lastPage": "Last Page", + "previousPage": "Previous Page", + "nextPage": "Next Page", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "singlePageView": "Single Page View", + "dualPageView": "Dual Page View" }, "rightRail": { + "closeSelected": "Close Selected Files", "selectAll": "Selecciona-ho tot", - "deselectAll": "Desselecciona-ho tot" + "deselectAll": "Desselecciona-ho tot", + "selectByNumber": "Select by Page Numbers", + "deleteSelected": "Delete Selected Pages", + "closePdf": "Close PDF", + "exportAll": "Export PDF", + "downloadSelected": "Download Selected Files", + "downloadAll": "Download All", + "toggleTheme": "Toggle Theme", + "language": "Language", + "search": "Search PDF", + "panMode": "Pan Mode", + "rotateLeft": "Rotate Left", + "rotateRight": "Rotate Right", + "toggleSidebar": "Toggle Sidebar", + "exportSelected": "Export Selected Pages", + "toggleAnnotations": "Toggle Annotations Visibility", + "annotationMode": "Toggle Annotation Mode", + "draw": "Draw", + "save": "Save" + }, + "search": { + "title": "Search PDF", + "placeholder": "Enter search term...", + "noResults": "No results found", + "searching": "Searching..." + }, + "guestBanner": { + "title": "You're using Stirling PDF as a guest!", + "message": "Create a free account to save your work, access more features, and support the project.", + "dismiss": "Dismiss banner", + "signUp": "Sign Up Free" + }, + "toolPicker": { + "searchPlaceholder": "Search tools...", + "noToolsFound": "No tools found", + "allTools": "ALL TOOLS", + "quickAccess": "QUICK ACCESS", + "categories": { + "standardTools": "Standard Tools", + "advancedTools": "Advanced Tools", + "recommendedTools": "Recommended Tools" + }, + "subcategories": { + "signing": "Signing", + "documentSecurity": "Document Security", + "verification": "Verification", + "documentReview": "Document Review", + "pageFormatting": "Page Formatting", + "extraction": "Extraction", + "removal": "Removal", + "automation": "Automation", + "general": "General", + "advancedFormatting": "Advanced Formatting", + "developerTools": "Developer Tools" + } }, "quickAccess": { - "sign": "Signa" + "read": "Read", + "sign": "Signa", + "automate": "Automate", + "files": "Files", + "activity": "Activity", + "help": "Help", + "account": "Account", + "config": "Config", + "adminSettings": "Admin Settings", + "allTools": "All Tools" + }, + "admin": { + "error": "Error", + "success": "Success", + "expand": "Expand", + "close": "Close", + "status": { + "active": "Active", + "inactive": "Inactive" + }, + "settings": { + "title": "Admin Settings", + "workspace": "Workspace", + "fetchError": "Failed to load settings", + "saveError": "Failed to save settings", + "saved": "Settings saved successfully", + "saveSuccess": "Settings saved successfully", + "save": "Save Changes", + "restartRequired": "Restart Required", + "restart": { + "title": "Restart Required", + "message": "Settings have been saved successfully. A server restart is required for the changes to take effect.", + "question": "Would you like to restart the server now or later?", + "now": "Restart Now", + "later": "Restart Later" + }, + "restarting": "Restarting Server", + "restartingMessage": "The server is restarting. Please wait a moment...", + "restartError": "Failed to restart server. Please restart manually.", + "general": { + "title": "System Settings", + "description": "Configure system-wide application settings including branding and default behaviour.", + "ui": "User Interface", + "system": "System", + "appName": { + "label": "Application Name", + "description": "The name displayed in the browser tab and home page" + }, + "appNameNavbar": { + "label": "Navbar Brand", + "description": "The name displayed in the navigation bar" + }, + "homeDescription": { + "label": "Home Description", + "description": "The description text shown on the home page" + }, + "defaultLocale": { + "label": "Default Locale", + "description": "The default language for new users (e.g., en_US, es_ES)" + }, + "fileUploadLimit": { + "label": "File Upload Limit", + "description": "Maximum file upload size (e.g., 100MB, 1GB)" + }, + "showUpdate": { + "label": "Show Update Notifications", + "description": "Display notifications when a new version is available" + }, + "showUpdateOnlyAdmin": { + "label": "Show Updates to Admins Only", + "description": "Restrict update notifications to admin users only" + }, + "customHTMLFiles": { + "label": "Custom HTML Files", + "description": "Allow serving custom HTML files from the customFiles directory" + }, + "languages": { + "label": "Available Languages", + "description": "Languages that users can select from (leave empty to enable all languages)" + }, + "customMetadata": { + "label": "Custom Metadata", + "autoUpdate": { + "label": "Auto Update Metadata", + "description": "Automatically update PDF metadata on all processed documents" + }, + "author": { + "label": "Default Author", + "description": "Default author for PDF metadata (e.g., username)" + }, + "creator": { + "label": "Default Creator", + "description": "Default creator for PDF metadata" + }, + "producer": { + "label": "Default Producer", + "description": "Default producer for PDF metadata" + } + }, + "customPaths": { + "label": "Custom Paths", + "description": "Configure custom file system paths for pipeline processing and external tools", + "pipeline": { + "label": "Pipeline Directories", + "watchedFoldersDir": { + "label": "Watched Folders Directory", + "description": "Directory where pipeline monitors for incoming PDFs (leave empty for default: /pipeline/watchedFolders)" + }, + "finishedFoldersDir": { + "label": "Finished Folders Directory", + "description": "Directory where processed PDFs are outputted (leave empty for default: /pipeline/finishedFolders)" + } + }, + "operations": { + "label": "External Tool Paths", + "weasyprint": { + "label": "WeasyPrint Executable", + "description": "Path to WeasyPrint executable for HTML to PDF conversion (leave empty for default: /opt/venv/bin/weasyprint)" + }, + "unoconvert": { + "label": "Unoconvert Executable", + "description": "Path to LibreOffice unoconvert for document conversions (leave empty for default: /opt/venv/bin/unoconvert)" + } + } + } + }, + "security": { + "title": "Security", + "description": "Configure authentication, login behaviour, and security policies.", + "ssoNotice": { + "title": "Looking for SSO/SAML settings?", + "message": "OAuth2 and SAML2 authentication providers have been moved to the Connections menu for easier management." + }, + "authentication": "Authentication", + "enableLogin": { + "label": "Enable Login", + "description": "Require users to log in before accessing the application" + }, + "loginMethod": { + "label": "Login Method", + "description": "The authentication method to use for user login", + "all": "All Methods", + "normal": "Username/Password Only", + "oauth2": "OAuth2 Only", + "saml2": "SAML2 Only" + }, + "loginAttemptCount": { + "label": "Login Attempt Limit", + "description": "Maximum number of failed login attempts before account lockout" + }, + "loginResetTimeMinutes": { + "label": "Login Reset Time (minutes)", + "description": "Time before failed login attempts are reset" + }, + "csrfDisabled": { + "label": "Disable CSRF Protection", + "description": "Disable Cross-Site Request Forgery protection (not recommended)" + }, + "initialLogin": { + "label": "Initial Login", + "username": { + "label": "Initial Username", + "description": "The username for the initial admin account" + }, + "password": { + "label": "Initial Password", + "description": "The password for the initial admin account" + } + }, + "jwt": { + "label": "JWT Configuration", + "secureCookie": { + "label": "Secure Cookie", + "description": "Require HTTPS for JWT cookies (recommended for production)" + }, + "keyRetentionDays": { + "label": "Key Retention Days", + "description": "Number of days to retain old JWT keys for verification" + }, + "persistence": { + "label": "Enable Key Persistence", + "description": "Store JWT keys persistently to survive server restarts" + }, + "enableKeyRotation": { + "label": "Enable Key Rotation", + "description": "Automatically rotate JWT signing keys periodically" + }, + "enableKeyCleanup": { + "label": "Enable Key Cleanup", + "description": "Automatically remove expired JWT keys" + } + }, + "audit": { + "label": "Audit Logging", + "enabled": { + "label": "Enable Audit Logging", + "description": "Track user actions and system events for compliance and security monitoring" + }, + "level": { + "label": "Audit Level", + "description": "0=OFF, 1=BASIC, 2=STANDARD, 3=VERBOSE" + }, + "retentionDays": { + "label": "Audit Retention (days)", + "description": "Number of days to retain audit logs" + } + }, + "htmlUrlSecurity": { + "label": "HTML URL Security", + "description": "Configure URL access restrictions for HTML processing to prevent SSRF attacks", + "enabled": { + "label": "Enable URL Security", + "description": "Enable URL security restrictions for HTML to PDF conversions" + }, + "level": { + "label": "Security Level", + "description": "MAX: whitelist only, MEDIUM: block internal networks, OFF: no restrictions", + "max": "Maximum (Whitelist Only)", + "medium": "Medium (Block Internal)", + "off": "Off (No Restrictions)" + }, + "advanced": "Advanced Settings", + "allowedDomains": { + "label": "Allowed Domains (Whitelist)", + "description": "One domain per line (e.g., cdn.example.com). Only these domains allowed when level is MAX" + }, + "blockedDomains": { + "label": "Blocked Domains (Blacklist)", + "description": "One domain per line (e.g., malicious.com). Additional domains to block" + }, + "internalTlds": { + "label": "Internal TLDs", + "description": "One TLD per line (e.g., .local, .internal). Block domains with these TLD patterns" + }, + "networkBlocking": "Network Blocking", + "blockPrivateNetworks": { + "label": "Block Private Networks", + "description": "Block RFC 1918 private networks (10.x.x.x, 192.168.x.x, 172.16-31.x.x)" + }, + "blockLocalhost": { + "label": "Block Localhost", + "description": "Block localhost and loopback addresses (127.x.x.x, ::1)" + }, + "blockLinkLocal": { + "label": "Block Link-Local Addresses", + "description": "Block link-local addresses (169.254.x.x, fe80::/10)" + }, + "blockCloudMetadata": { + "label": "Block Cloud Metadata Endpoints", + "description": "Block cloud provider metadata endpoints (169.254.169.254)" + } + } + }, + "connections": { + "title": "Connections", + "description": "Configure external authentication providers like OAuth2 and SAML.", + "linkedServices": "Linked Services", + "unlinkedServices": "Unlinked Services", + "connect": "Connect", + "disconnect": "Disconnect", + "disconnected": "Provider disconnected successfully", + "disconnectError": "Failed to disconnect provider", + "ssoAutoLogin": { + "label": "SSO Auto Login", + "enable": "Enable SSO Auto Login", + "description": "Automatically redirect to SSO login when authentication is required" + }, + "oauth2": { + "label": "OAuth2", + "enabled": { + "label": "Enable OAuth2", + "description": "Allow users to authenticate using OAuth2 providers" + }, + "provider": { + "label": "Provider", + "description": "The OAuth2 provider to use for authentication" + }, + "issuer": { + "label": "Issuer URL", + "description": "The OAuth2 provider issuer URL" + }, + "clientId": { + "label": "Client ID", + "description": "The OAuth2 client ID from your provider" + }, + "clientSecret": { + "label": "Client Secret", + "description": "The OAuth2 client secret from your provider" + }, + "useAsUsername": { + "label": "Use as Username", + "description": "The OAuth2 claim to use as the username (e.g., email, sub)" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first OAuth2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via OAuth2" + }, + "scopes": { + "label": "OAuth2 Scopes", + "description": "Comma-separated list of OAuth2 scopes to request (e.g., openid, profile, email)" + } + }, + "saml2": { + "label": "SAML2", + "enabled": { + "label": "Enable SAML2", + "description": "Allow users to authenticate using SAML2 providers" + }, + "provider": { + "label": "Provider", + "description": "The SAML2 provider name" + }, + "registrationId": { + "label": "Registration ID", + "description": "The SAML2 registration identifier" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first SAML2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via SAML2" + } + } + }, + "database": { + "title": "Database", + "description": "Configure custom database connection settings for enterprise deployments.", + "configuration": "Database Configuration", + "enableCustom": { + "label": "Enable Custom Database", + "description": "Use your own custom database configuration instead of the default embedded database" + }, + "customUrl": { + "label": "Custom Database URL", + "description": "Full JDBC connection string (e.g., jdbc:postgresql://localhost:5432/postgres). If provided, individual connection settings below are not used." + }, + "type": { + "label": "Database Type", + "description": "Type of database (not used if custom URL is provided)" + }, + "hostName": { + "label": "Host Name", + "description": "Database server hostname (not used if custom URL is provided)" + }, + "port": { + "label": "Port", + "description": "Database server port (not used if custom URL is provided)" + }, + "name": { + "label": "Database Name", + "description": "Name of the database (not used if custom URL is provided)" + }, + "username": { + "label": "Username", + "description": "Database authentication username" + }, + "password": { + "label": "Password", + "description": "Database authentication password" + } + }, + "privacy": { + "title": "Privacy", + "description": "Configure privacy and data collection settings.", + "analytics": "Analytics & Tracking", + "enableAnalytics": { + "label": "Enable Analytics", + "description": "Collect anonymous usage analytics to help improve the application" + }, + "metricsEnabled": { + "label": "Enable Metrics", + "description": "Enable collection of performance and usage metrics. Provides API endpoint for admins to access metrics data" + }, + "searchEngine": "Search Engine Visibility", + "googleVisibility": { + "label": "Google Visibility", + "description": "Allow search engines to index this application" + } + }, + "advanced": { + "title": "Advanced", + "description": "Configure advanced features and experimental functionality.", + "features": "Feature Flags", + "processing": "Processing", + "endpoints": { + "label": "Endpoints", + "manage": "Manage API Endpoints", + "description": "Endpoint management is configured via YAML. See documentation for details on enabling/disabling specific endpoints." + }, + "enableAlphaFunctionality": { + "label": "Enable Alpha Features", + "description": "Enable experimental and alpha-stage features (may be unstable)" + }, + "enableUrlToPDF": { + "label": "Enable URL to PDF", + "description": "Allow conversion of web pages to PDF documents" + }, + "maxDPI": { + "label": "Maximum DPI", + "description": "Maximum DPI for image processing (0 = unlimited)" + }, + "tessdataDir": { + "label": "Tessdata Directory", + "description": "Path to the tessdata directory for OCR language files" + }, + "disableSanitize": { + "label": "Disable HTML Sanitization", + "description": "WARNING: Security risk - disabling HTML sanitization can lead to XSS vulnerabilities" + }, + "tempFileManagement": { + "label": "Temp File Management", + "description": "Configure temporary file storage and cleanup behavior", + "baseTmpDir": { + "label": "Base Temp Directory", + "description": "Base directory for temporary files (leave empty for default: java.io.tmpdir/stirling-pdf)" + }, + "libreofficeDir": { + "label": "LibreOffice Temp Directory", + "description": "Directory for LibreOffice temp files (leave empty for default: baseTmpDir/libreoffice)" + }, + "systemTempDir": { + "label": "System Temp Directory", + "description": "System temp directory to clean (only used if cleanupSystemTemp is enabled)" + }, + "prefix": { + "label": "Temp File Prefix", + "description": "Prefix for temp file names" + }, + "maxAgeHours": { + "label": "Max Age (hours)", + "description": "Maximum age in hours before temp files are cleaned up" + }, + "cleanupIntervalMinutes": { + "label": "Cleanup Interval (minutes)", + "description": "How often to run cleanup (in minutes)" + }, + "startupCleanup": { + "label": "Startup Cleanup", + "description": "Clean up old temp files on application startup" + }, + "cleanupSystemTemp": { + "label": "Cleanup System Temp", + "description": "Whether to clean broader system temp directory (use with caution)" + } + }, + "processExecutor": { + "label": "Process Executor Limits", + "description": "Configure session limits and timeouts for each process executor", + "sessionLimit": { + "label": "Session Limit", + "description": "Maximum concurrent instances" + }, + "timeout": { + "label": "Timeout (minutes)", + "description": "Maximum execution time" + }, + "libreOffice": "LibreOffice", + "pdfToHtml": "PDF to HTML", + "qpdf": "QPDF", + "tesseract": "Tesseract OCR", + "pythonOpenCv": "Python OpenCV", + "weasyPrint": "WeasyPrint", + "installApp": "Install App", + "calibre": "Calibre", + "ghostscript": "Ghostscript", + "ocrMyPdf": "OCRmyPDF" + } + }, + "mail": { + "title": "Mail Server", + "description": "Configure SMTP settings for sending email notifications.", + "smtp": "SMTP Configuration", + "enabled": { + "label": "Enable Mail", + "description": "Enable email notifications and SMTP functionality" + }, + "host": { + "label": "SMTP Host", + "description": "The hostname or IP address of your SMTP server" + }, + "port": { + "label": "SMTP Port", + "description": "The port number for SMTP connection (typically 25, 465, or 587)" + }, + "username": { + "label": "SMTP Username", + "description": "Username for SMTP authentication" + }, + "password": { + "label": "SMTP Password", + "description": "Password for SMTP authentication" + }, + "from": { + "label": "From Address", + "description": "The email address to use as the sender" + }, + "enableInvites": { + "label": "Enable Email Invites", + "description": "Allow admins to invite users via email with auto-generated passwords" + }, + "frontendUrl": { + "label": "Frontend URL", + "description": "Base URL for frontend (e.g. https://pdf.example.com). Used for generating invite links in emails. Leave empty to use backend URL." + } + }, + "legal": { + "title": "Legal Documents", + "description": "Configure links to legal documents and policies.", + "disclaimer": { + "title": "Legal Responsibility Warning", + "message": "By customizing these legal documents, you assume full responsibility for ensuring compliance with all applicable laws and regulations, including but not limited to GDPR and other EU data protection requirements. Only modify these settings if: (1) you are operating a personal/private instance, (2) you are outside EU jurisdiction and understand your local legal obligations, or (3) you have obtained proper legal counsel and accept sole responsibility for all user data and legal compliance. Stirling-PDF and its developers assume no liability for your legal obligations." + }, + "termsAndConditions": { + "label": "Terms and Conditions", + "description": "URL or filename to terms and conditions" + }, + "privacyPolicy": { + "label": "Privacy Policy", + "description": "URL or filename to privacy policy" + }, + "accessibilityStatement": { + "label": "Accessibility Statement", + "description": "URL or filename to accessibility statement" + }, + "cookiePolicy": { + "label": "Cookie Policy", + "description": "URL or filename to cookie policy" + }, + "impressum": { + "label": "Impressum", + "description": "URL or filename to impressum (required in some jurisdictions)" + } + }, + "premium": { + "title": "Premium & Enterprise", + "description": "Configure your premium or enterprise license key.", + "license": "License Configuration", + "key": { + "label": "License Key", + "description": "Enter your premium or enterprise license key" + }, + "enabled": { + "label": "Enable Premium Features", + "description": "Enable license key checks for pro/enterprise features" + }, + "movedFeatures": { + "title": "Premium Features Distributed", + "message": "Premium and Enterprise features are now organized in their respective sections:" + } + }, + "features": { + "title": "Features", + "description": "Configure optional features and functionality.", + "serverCertificate": { + "label": "Server Certificate", + "description": "Configure server-side certificate generation for \"Sign with Stirling-PDF\" functionality", + "enabled": { + "label": "Enable Server Certificate", + "description": "Enable server-side certificate for \"Sign with Stirling-PDF\" option" + }, + "organizationName": { + "label": "Organization Name", + "description": "Organization name for generated certificates" + }, + "validity": { + "label": "Certificate Validity (days)", + "description": "Number of days the certificate will be valid" + }, + "regenerateOnStartup": { + "label": "Regenerate on Startup", + "description": "Generate new certificate on each application startup" + } + } + }, + "endpoints": { + "title": "API Endpoints", + "description": "Control which API endpoints and endpoint groups are available.", + "management": "Endpoint Management", + "toRemove": { + "label": "Disabled Endpoints", + "description": "Select individual endpoints to disable" + }, + "groupsToRemove": { + "label": "Disabled Endpoint Groups", + "description": "Select endpoint groups to disable" + }, + "note": "Note: Disabling endpoints restricts API access but does not remove UI components. Restart required for changes to take effect." + } + } }, "fileUpload": { + "selectFile": "Select a file", + "selectFiles": "Select files", + "selectPdfToView": "Select a PDF to view", + "selectPdfToEdit": "Select a PDF to edit", + "chooseFromStorage": "Choose a file from storage or upload a new PDF", + "chooseFromStorageMultiple": "Choose files from storage or upload new PDFs", + "loadFromStorage": "Load from Storage", + "filesAvailable": "files available", "loading": "Carregant...", - "or": "o" + "or": "o", + "dropFileHere": "Drop file here or click to upload", + "dropFilesHere": "Drop files here or click the upload button", + "pdfFilesOnly": "PDF files only", + "supportedFileTypes": "Supported file types", + "upload": "Upload", + "uploadFile": "Upload File", + "uploadFiles": "Upload Files", + "noFilesInStorage": "No files available in storage. Upload some files first.", + "selectFromStorage": "Select from Storage", + "backToTools": "Back to Tools", + "addFiles": "Add Files", + "dragFilesInOrClick": "Drag files in or click \"Add Files\" to browse" + }, + "fileEditor": { + "addFiles": "Add Files" }, "fileManager": { + "title": "Upload PDF Files", + "subtitle": "Add files to your storage for easy access across tools", + "filesSelected": "files selected", + "clearSelection": "Clear Selection", + "openInFileEditor": "Open in File Editor", + "uploadError": "Failed to upload some files.", + "failedToOpen": "Failed to open file. It may have been removed from storage.", + "failedToLoad": "Failed to load file to active set.", + "storageCleared": "Browser cleared storage. Files have been removed. Please re-upload.", + "clearAll": "Clear All", + "reloadFiles": "Reload Files", + "dragDrop": "Drag & Drop files here", + "clickToUpload": "Click to upload files", + "selectedFiles": "Selected Files", + "storage": "Storage", + "filesStored": "files stored", + "storageError": "Storage error occurred", + "storageLow": "Storage is running low. Consider removing old files.", + "supportMessage": "Powered by browser database storage for unlimited capacity", + "noFileSelected": "No files selected", + "showHistory": "Show History", + "hideHistory": "Hide History", + "fileHistory": "File History", + "loadingHistory": "Loading History...", + "lastModified": "Last Modified", + "toolChain": "Tools Applied", + "restore": "Restore", + "unzip": "Unzip", + "searchFiles": "Search files...", + "recent": "Recent", + "localFiles": "Local Files", + "googleDrive": "Google Drive", + "googleDriveShort": "Drive", + "myFiles": "My Files", + "noRecentFiles": "No recent files found", + "googleDriveNotAvailable": "Google Drive integration not available", + "openFiles": "Open Files", + "openFile": "Open File", + "details": "File Details", "fileName": "Nom", + "fileFormat": "Format", + "fileSize": "Size", "fileVersion": "VersiÃŗ", + "totalSelected": "Total Selected", + "dropFilesHere": "Drop files here", "selectAll": "Selecciona-ho tot", "deselectAll": "Desselecciona-ho tot", "deleteSelected": "Suprimeix seleccionades", + "downloadSelected": "Download Selected", + "selectedCount": "{{count}} selected", "download": "Descarrega", - "delete": "Esborra" + "delete": "Esborra", + "unsupported": "Unsupported", + "addToUpload": "Add to Upload", + "deleteAll": "Delete All", + "loadingFiles": "Loading files...", + "noFiles": "No files available", + "noFilesFound": "No files found matching your search", + "openInPageEditor": "Open in Page Editor", + "showAll": "Show All", + "sortByDate": "Sort by Date", + "sortByName": "Sort by Name", + "sortBySize": "Sort by Size" + }, + "storage": { + "temporaryNotice": "Files are stored temporarily in your browser and may be cleared automatically", + "storageLimit": "Storage limit", + "storageUsed": "Temporary Storage used", + "storageFull": "Storage is nearly full. Consider removing some files.", + "fileTooLarge": "File too large. Maximum size per file is", + "storageQuotaExceeded": "Storage quota exceeded. Please remove some files before uploading more.", + "approximateSize": "Approximate size" }, "sanitize": { + "title": "Sanitise", + "desc": "Remove potentially harmful elements from PDF files.", "submit": "Neteja PDF", + "completed": "Sanitisation completed successfully", + "error": { + "generic": "Sanitisation failed", + "failed": "An error occurred while sanitising the PDF." + }, + "filenamePrefix": "sanitised", + "sanitizationResults": "Sanitisation Results", "steps": { - "settings": "Opcions" + "files": "Files", + "settings": "Opcions", + "results": "Results" + }, + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "options": { + "title": "Sanitisation Options", + "note": "Select the elements you want to remove from the PDF. At least one option must be selected.", + "removeJavaScript": { + "label": "Remove JavaScript", + "desc": "Remove JavaScript actions and scripts from the PDF" + }, + "removeEmbeddedFiles": { + "label": "Remove Embedded Files", + "desc": "Remove any files embedded within the PDF" + }, + "removeXMPMetadata": { + "label": "Remove XMP Metadata", + "desc": "Remove XMP metadata from the PDF" + }, + "removeMetadata": { + "label": "Remove Document Metadata", + "desc": "Remove document information metadata (title, author, etc.)" + }, + "removeLinks": { + "label": "Remove Links", + "desc": "Remove external links and launch actions from the PDF" + }, + "removeFonts": { + "label": "Remove Fonts", + "desc": "Remove embedded fonts from the PDF" + } + } + }, + "addPassword": { + "title": "Afegir Contrasenya", + "desc": "Encrypt your PDF document with a password.", + "completed": "Password protection applied", + "submit": "Encripta", + "filenamePrefix": "encrypted", + "error": { + "failed": "An error occurred while encrypting the PDF." + }, + "passwords": { + "stepTitle": "Passwords & Encryption", + "completed": "Passwords configured", + "user": { + "label": "User Password", + "placeholder": "Enter user password" + }, + "owner": { + "label": "Owner Password", + "placeholder": "Enter owner password" + } + }, + "encryption": { + "keyLength": { + "label": "Encryption Key Length", + "40bit": "40-bit (Low)", + "128bit": "128-bit (Standard)", + "256bit": "256-bit (High)" + } + }, + "results": { + "title": "Encrypted PDFs" + }, + "tooltip": { + "header": { + "title": "Password Protection Overview" + }, + "passwords": { + "title": "Password Types", + "text": "User passwords restrict opening the document, while owner passwords control what can be done with the document once opened. You can set both or just one.", + "bullet1": "User Password: Required to open the PDF", + "bullet2": "Owner Password: Controls document permissions (not supported by all PDF viewers)" + }, + "encryption": { + "title": "Encryption Levels", + "text": "Higher encryption levels provide better security but may not be supported by older PDF viewers.", + "bullet1": "40-bit: Basic security, compatible with older viewers", + "bullet2": "128-bit: Standard security, widely supported", + "bullet3": "256-bit: Maximum security, requires modern viewers" + }, + "permissions": { + "title": "Canviar Permissos", + "text": "These permissions control what users can do with the PDF. Most effective when combined with an owner password." + } + }, + "tags": "segur,seguretat", + "header": "Afegir contrasenya (Encriptat)", + "selectText": { + "1": "PDF a encriptar", + "2": "Contrasenya", + "3": "Longitud de la clau de xifratge", + "4": "Valors mÊs alts sÃŗn mÊs forts, perÃ˛ els valors mÊs baixos tenen una millor compatibilitat.", + "5": "Permissos a Establir", + "6": "Evita el muntatge del document", + "7": "Evita l'extracciÃŗ de contingut", + "8": "Evita l'extracciÃŗ per accessibilitat", + "9": "Evita emplenar formularis", + "10": "Evita modificacions", + "11": "Evita modificacions d'annotacions", + "12": "Evita impressiÃŗ", + "13": "Evita impressiÃŗ en diferents formats", + "14": "Contrasenya d'Administrador", + "15": "Restringeix el que es pot fer amb el document un cop obert (No compatible amb tots els lectors)", + "16": "Restringeix l'obertura del document" } }, "changePermissions": { "title": "Canviar Permissos", + "desc": "Change document restrictions and permissions.", + "completed": "Permissions changed", "submit": "Canviar Permissos", + "error": { + "failed": "An error occurred while changing PDF permissions." + }, "permissions": { "preventAssembly": { "label": "Evita el muntatge del document" @@ -1734,10 +4580,784 @@ "label": "Evita impressiÃŗ en diferents formats" } }, + "results": { + "title": "Modified PDFs" + }, "tooltip": { "header": { "title": "Canviar Permissos" + }, + "description": { + "text": "Changes document permissions, allowing/disallowing access to different features in PDF readers." + }, + "warning": { + "text": "To make these permissions unchangeable, use the Add Password tool to set an owner password." } } + }, + "removePassword": { + "title": "Eliminar Contrasenya", + "desc": "Elimina la contrasenya del document PDF.", + "tags": "segur,desencripta,seguretat,eliminar contrasenya,suprimir contrasenya", + "password": { + "stepTitle": "Elimina Contrasenya", + "label": "Contrasenya Actual", + "placeholder": "Enter current password", + "completed": "Password configured" + }, + "filenamePrefix": "decrypted", + "error": { + "failed": "An error occurred while removing the password from the PDF." + }, + "tooltip": { + "description": "Removing password protection requires the password that was used to encrypt the PDF. This will decrypt the document, making it accessible without a password." + }, + "submit": "Eliminar Contrasenya", + "results": { + "title": "Decrypted PDFs" + }, + "header": "Eliminar Contrasenya (Desxifrar)", + "selectText": { + "1": "Selecciona el PDF a Desxifrar", + "2": "Contrasenya" + } + }, + "automate": { + "title": "Automate", + "desc": "Build multi-step workflows by chaining together PDF actions. Ideal for recurring tasks.", + "invalidStep": "Invalid step", + "files": { + "placeholder": "Select files to process with this automation" + }, + "selection": { + "title": "Automation Selection", + "saved": { + "title": "Saved" + }, + "createNew": { + "title": "Create New Automation" + }, + "suggested": { + "title": "Suggested" + } + }, + "creation": { + "createTitle": "Create Automation", + "editTitle": "Edit Automation", + "intro": "Automations run tools sequentially. To get started, add tools in the order you want them to run.", + "name": { + "label": "Automation Name", + "placeholder": "My Automation" + }, + "description": { + "label": "Description (optional)", + "placeholder": "Describe what this automation does..." + }, + "tools": { + "selectTool": "Select a tool...", + "selected": "Selected Tools", + "remove": "Remove tool", + "configure": "Configure tool", + "notConfigured": "! Not Configured", + "addTool": "Add Tool", + "add": "Add a tool..." + }, + "save": "Save Automation", + "unsavedChanges": { + "title": "Unsaved Changes", + "message": "You have unsaved changes. Are you sure you want to go back? All changes will be lost.", + "cancel": "Cancel", + "confirm": "Go Back" + }, + "icon": { + "label": "Icon" + } + }, + "run": { + "title": "Run Automation" + }, + "sequence": { + "unnamed": "Unnamed Automation", + "steps": "{{count}} steps", + "running": "Running Automation...", + "run": "Run Automation", + "finish": "Finish" + }, + "reviewTitle": "Automation Results", + "config": { + "loading": "Loading tool configuration...", + "noSettings": "This tool does not have configurable settings.", + "title": "Configure {{toolName}}", + "description": "Configure the settings for this tool. These settings will be applied when the automation runs.", + "cancel": "Cancel", + "save": "Save Configuration" + }, + "copyToSaved": "Copy to Saved" + }, + "automation": { + "suggested": { + "securePdfIngestion": "Secure PDF Ingestion", + "securePdfIngestionDesc": "Comprehensive PDF processing workflow that sanitises documents, applies OCR with cleanup, converts to PDF/A format for long-term archival, and optimises file size.", + "emailPreparation": "Email Preparation", + "emailPreparationDesc": "Optimises PDFs for email distribution by compressing files, splitting large documents into 20MB chunks for email compatibility, and removing metadata for privacy.", + "secureWorkflow": "Security Workflow", + "secureWorkflowDesc": "Secures PDF documents by removing potentially malicious content like JavaScript and embedded files, then adds password protection to prevent unauthorised access. Password is set to 'password' by default.", + "processImages": "Process Images", + "processImagesDesc": "Converts multiple image files into a single PDF document, then applies OCR technology to extract searchable text from the images." + } + }, + "common": { + "copy": "Copy", + "copied": "Copied!", + "refresh": "Refresh", + "retry": "Retry", + "remaining": "remaining", + "used": "used", + "available": "available", + "cancel": "Cancel", + "preview": "Preview" + }, + "config": { + "overview": { + "title": "Application Configuration", + "description": "Current application settings and configuration details." + }, + "account": { + "overview": { + "title": "Account Settings", + "manageAccountPreferences": "Manage your account preferences", + "guestDescription": "You are signed in as a guest. Consider upgrading your account above." + }, + "upgrade": { + "title": "Upgrade Guest Account", + "description": "Link your account to preserve your history and access more features!", + "socialLogin": "Upgrade with Social Account", + "linkWith": "Link with", + "emailPassword": "or enter your email & password", + "email": "Email", + "emailPlaceholder": "Enter your email", + "password": "Password (optional)", + "passwordPlaceholder": "Set a password", + "passwordNote": "Leave empty to use email verification only", + "upgradeButton": "Upgrade Account" + } + }, + "apiKeys": { + "description": "Your API key for accessing Stirling's suite of PDF tools. Copy it to your project or refresh to generate a new one.", + "publicKeyAriaLabel": "Public API key", + "copyKeyAriaLabel": "Copy API key", + "refreshAriaLabel": "Refresh API key", + "includedCredits": "Included credits", + "purchasedCredits": "Purchased credits", + "totalCredits": "Total Credits", + "chartAriaLabel": "Credits usage: included {{includedUsed}} of {{includedTotal}}, purchased {{purchasedUsed}} of {{purchasedTotal}}", + "nextReset": "Next Reset", + "lastApiUse": "Last API Use", + "overlayMessage": "Generate a key to see credits and available credits", + "label": "API Key", + "guestInfo": "Guest users do not receive API keys. Create an account to get an API key you can use in your applications.", + "goToAccount": "Go to Account", + "refreshModal": { + "title": "Refresh API Keys", + "warning": "âš ī¸ Warning: This action will generate new API keys and make your previous keys invalid.", + "impact": "Any applications or services currently using these keys will stop working until you update them with the new keys.", + "confirmPrompt": "Are you sure you want to continue?", + "confirmCta": "Refresh Keys" + }, + "generateError": "We couldn't generate your API key." + } + }, + "AddAttachmentsRequest": { + "attachments": "Select Attachments", + "info": "Select files to attach to your PDF. These files will be embedded and accessible through the PDF's attachment panel.", + "selectFiles": "Select Files to Attach", + "placeholder": "Choose files...", + "addMoreFiles": "Add more files...", + "selectedFiles": "Selected Files", + "submit": "Add Attachments", + "results": { + "title": "Attachment Results" + }, + "error": { + "failed": "Add attachments operation failed" + } + }, + "termsAndConditions": "Terms & Conditions", + "logOut": "Log out", + "addAttachments": { + "error": { + "failed": "An error occurred while adding attachments to the PDF." + } + }, + "autoRename": { + "description": "This tool will automatically rename PDF files based on their content. It analyzes the document to find the most suitable title from the text." + }, + "customPosition": "Custom Position", + "details": "Details", + "downloadUnavailable": "Download unavailable for this item", + "invalidUndoData": "Cannot undo: invalid operation data", + "margin": { + "large": "Large", + "medium": "Medium", + "small": "Small", + "xLarge": "Extra Large" + }, + "noFilesToUndo": "Cannot undo: no files were processed in the last operation", + "noOperationToUndo": "No operation to undo", + "noValidFiles": "No valid files to process", + "operationCancelled": "Operation cancelled", + "pageEdit": { + "deselectAll": "Select None", + "selectAll": "Select All" + }, + "quickPosition": "Quick Position", + "reorganizePages": { + "error": { + "failed": "Failed to reorganize pages" + }, + "results": { + "title": "Pages Reorganized" + }, + "settings": { + "title": "Settings" + }, + "submit": "Reorganize Pages" + }, + "replace-color": { + "options": { + "fill": "Fill colour", + "gradient": "Gradient" + }, + "previewOverlayOpacity": "Preview overlay opacity", + "previewOverlayTransparency": "Preview overlay transparency", + "previewOverlayVisibility": "Show preview overlay", + "selectText": { + "1": "Opcions per Reemplaçar o Invertir color", + "2": "Per defecte (Colors d'alt contrast per defecte)", + "3": "Personalitzat (Colors personalitzats)", + "4": "InversiÃŗ completa (Inverteix tots els colors)", + "5": "Opcions de color d'alt contrast", + "6": "Text blanc sobre fons negre", + "7": "Text negre sobre fons blanc", + "8": "Text groc sobre fons negre", + "9": "Text verd sobre fons negre", + "10": "Tria el color del text", + "11": "Tria el color del fons", + "12": "Choose start colour", + "13": "Choose end colour" + }, + "submit": "Reemplaça", + "title": "Reemplaça-Inverteix-Color", + "header": "Reemplaça-Inverteix Color en PDF" + }, + "size": "Size", + "submit": "Submit", + "success": "Success", + "tools": { + "noSearchResults": "No tools found", + "noTools": "No tools available" + }, + "undoDataMismatch": "Cannot undo: operation data is corrupted", + "undoFailed": "Failed to undo operation", + "undoQuotaError": "Cannot undo: insufficient storage space", + "undoStorageError": "Undo completed but some files could not be saved to storage", + "undoSuccess": "Operation undone successfully", + "unsupported": "Unsupported", + "onboarding": { + "welcomeModal": { + "title": "Welcome to Stirling PDF!", + "description": "Would you like to take a quick 1-minute tour to learn the key features and how to get started?", + "helpHint": "You can always access this tour later from the Help button in the bottom left.", + "startTour": "Start Tour", + "maybeLater": "Maybe Later", + "dontShowAgain": "Don't Show Again" + }, + "allTools": "This is the All Tools panel, where you can browse and select from all available PDF tools.", + "selectCropTool": "Let's select the Crop tool to demonstrate how to use one of the tools.", + "toolInterface": "This is the Crop tool interface. As you can see, there's not much there because we haven't added any PDF files to work with yet.", + "filesButton": "The Files button on the Quick Access bar allows you to upload PDFs to use the tools on.", + "fileSources": "You can upload new files or access recent files from here. For the tour, we'll just use a sample file.", + "workbench": "This is the Workbench - the main area where you view and edit your PDFs.", + "viewSwitcher": "Use these controls to select how you want to view your PDFs.", + "viewer": "The Viewer lets you read and annotate your PDFs.", + "pageEditor": "The Page Editor allows you to do various operations on the pages within your PDFs, such as reordering, rotating and deleting.", + "activeFiles": "The Active Files view shows all of the PDFs you have loaded into the tool, and allows you to select which ones to process.", + "fileCheckbox": "Clicking one of the files selects it for processing. You can select multiple files for batch operations.", + "selectControls": "The Right Rail contains buttons to quickly select/deselect all of your active PDFs, along with buttons to change the app's theme or language.", + "cropSettings": "Now that we've selected the file we want crop, we can configure the Crop tool to choose the area that we want to crop the PDF to.", + "runButton": "Once the tool has been configured, this button allows you to run the tool on all the selected PDFs.", + "results": "After the tool has finished running, the Review step will show a preview of the results in this panel, and allow you to undo the operation or download the file. ", + "fileReplacement": "The modified file will replace the original file in the Workbench automatically, allowing you to easily run it through more tools.", + "pinButton": "You can use the Pin button if you'd rather your files stay active after running tools on them.", + "wrapUp": "You're all set! You've learnt about the main areas of the app and how to use them. Click the Help button whenever you like to see this tour again.", + "previous": "Previous", + "next": "Next", + "finish": "Finish", + "startTour": "Start Tour", + "startTourDescription": "Take a guided tour of Stirling PDF's key features" + }, + "workspace": { + "title": "Workspace", + "people": { + "title": "People", + "description": "Manage workspace members and their permissions", + "loading": "Loading people...", + "searchMembers": "Search members...", + "addMembers": "Add Members", + "inviteMembers": { + "label": "Invite Members", + "subtitle": "Type or paste in emails below, separated by commas. Your workspace will be billed by members." + }, + "user": "User", + "role": "Role", + "team": "Team", + "status": "Status", + "actions": "Actions", + "noMembersFound": "No members found", + "active": "Active", + "disabled": "Disabled", + "activeSession": "Active session", + "member": "Member", + "admin": "Admin", + "roleDescriptions": { + "admin": "Can manage settings and invite members, with full administrative access.", + "member": "Can view and edit shared files, but cannot manage workspace settings or members." + }, + "editRole": "Edit Role", + "enable": "Enable", + "disable": "Disable", + "deleteUser": "Delete User", + "deleteUserSuccess": "User deleted successfully", + "deleteUserError": "Failed to delete user", + "confirmDelete": "Are you sure you want to delete this user? This action cannot be undone.", + "addMember": { + "title": "Add Member", + "username": "Username (Email)", + "usernamePlaceholder": "user@example.com", + "password": "Password", + "passwordPlaceholder": "Enter password", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "forcePasswordChange": "Force password change on first login", + "cancel": "Cancel", + "submit": "Add Member", + "usernameRequired": "Username and password are required", + "passwordTooShort": "Password must be at least 6 characters", + "success": "User created successfully", + "error": "Failed to create user" + }, + "editMember": { + "title": "Edit Member", + "editing": "Editing:", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "cancel": "Cancel", + "submit": "Update Member", + "success": "User updated successfully", + "error": "Failed to update user" + }, + "toggleEnabled": { + "success": "User status updated successfully", + "error": "Failed to update user status" + }, + "delete": { + "success": "User deleted successfully", + "error": "Failed to delete user" + }, + "emailInvite": { + "tab": "Email Invite", + "description": "Type or paste in emails below, separated by commas. Users will receive login credentials via email.", + "emails": "Email Addresses", + "emailsPlaceholder": "user1@example.com, user2@example.com", + "emailsRequired": "At least one email address is required", + "submit": "Send Invites", + "success": "user(s) invited successfully", + "partialSuccess": "Some invites failed", + "allFailed": "Failed to invite users", + "error": "Failed to send invites" + }, + "directInvite": { + "tab": "Direct Create" + }, + "inviteLinkTab": { + "tab": "Invite Link" + }, + "inviteLink": { + "description": "Generate a secure link that allows the user to set their own password", + "email": "Email Address", + "emailPlaceholder": "user@example.com (optional)", + "emailDescription": "Optional - leave blank for a general invite link that can be used by anyone", + "emailRequired": "Email address is required", + "emailOptional": "Optional - leave blank for a general invite link", + "emailRequiredForSend": "Email address is required to send email notification", + "expiryHours": "Expiry Hours", + "expiryDescription": "How many hours until the link expires", + "sendEmail": "Send invite link via email", + "sendEmailDescription": "If enabled, the invite link will be sent to the specified email address", + "smtpRequired": "SMTP not configured", + "generate": "Generate Link", + "generated": "Invite Link Generated", + "copied": "Link copied to clipboard", + "success": "Invite link generated successfully", + "successWithEmail": "Invite link generated and sent via email", + "emailFailed": "Invite link generated, but email failed", + "emailFailedDetails": "Error: {0}. Please share the invite link manually.", + "error": "Failed to generate invite link", + "submit": "Generate Invite Link" + }, + "inviteMode": { + "username": "Username", + "email": "Email", + "link": "Link", + "emailDisabled": "Email invites require SMTP configuration and mail.enableInvites=true in settings" + }, + "license": { + "users": "users", + "availableSlots": "Available Slots", + "grandfathered": "Grandfathered", + "grandfatheredShort": "{{count}} grandfathered", + "fromLicense": "from license", + "slotsAvailable": "{{count}} user slot(s) available", + "noSlotsAvailable": "No slots available", + "currentUsage": "Currently using {{current}} of {{max}} user licences" + } + }, + "teams": { + "title": "Teams", + "description": "Manage teams and organize workspace members", + "loading": "Loading teams...", + "loadingDetails": "Loading team details...", + "createNewTeam": "Create New Team", + "teamName": "Team Name", + "totalMembers": "Total Members", + "actions": "Actions", + "noTeamsFound": "No teams found", + "noMembers": "No members in this team", + "system": "System", + "addMember": "Add Member", + "viewTeam": "View Team", + "removeMember": "Remove from team", + "cannotRemoveFromSystemTeam": "Cannot remove from system team", + "renameTeamLabel": "Rename Team", + "deleteTeamLabel": "Delete Team", + "cannotDeleteInternal": "Cannot delete the Internal team", + "confirmDelete": "Are you sure you want to delete this team? This team must be empty to delete.", + "confirmRemove": "Remove user from this team?", + "cannotRenameInternal": "Cannot rename the Internal team", + "cannotAddToInternal": "Cannot add members to the Internal team", + "teamNotFound": "Team not found", + "backToTeams": "Back to Teams", + "memberCount": "{{count}} members", + "removeMemberSuccess": "User removed from team", + "removeMemberError": "Failed to remove user from team", + "createTeam": { + "title": "Create New Team", + "teamName": "Team Name", + "teamNamePlaceholder": "Enter team name", + "cancel": "Cancel", + "submit": "Create Team", + "nameRequired": "Team name is required", + "success": "Team created successfully", + "error": "Failed to create team" + }, + "renameTeam": { + "title": "Rename Team", + "renaming": "Renaming:", + "newTeamName": "New Team Name", + "newTeamNamePlaceholder": "Enter new team name", + "cancel": "Cancel", + "submit": "Rename Team", + "nameRequired": "Team name is required", + "success": "Team renamed successfully", + "error": "Failed to rename team" + }, + "deleteTeam": { + "success": "Team deleted successfully", + "error": "Failed to delete team. Make sure the team is empty.", + "teamMustBeEmpty": "Team must be empty before deletion" + }, + "addMemberToTeam": { + "title": "Add Member to Team", + "addingTo": "Adding to", + "selectUser": "Select User", + "selectUserPlaceholder": "Choose a user", + "selectUserRequired": "Please select a user", + "currentlyIn": "currently in", + "willBeMoved": "Note: This user will be moved from their current team to this team.", + "cancel": "Cancel", + "submit": "Add Member", + "userRequired": "Please select a user", + "success": "Member added to team successfully", + "error": "Failed to add member to team" + }, + "changeTeam": { + "label": "Change Team", + "title": "Change Team", + "changing": "Moving", + "selectTeam": "Select Team", + "selectTeamPlaceholder": "Choose a team", + "selectTeamRequired": "Please select a team", + "success": "Team changed successfully", + "error": "Failed to change team", + "submit": "Change Team" + } + } + }, + "plan": { + "currency": "Currency", + "popular": "Popular", + "current": "Current Plan", + "upgrade": "Upgrade", + "contact": "Contact Us", + "customPricing": "Custom", + "showComparison": "Compare All Features", + "hideComparison": "Hide Feature Comparison", + "featureComparison": "Feature Comparison", + "activePlan": { + "title": "Active Plan", + "subtitle": "Your current subscription details" + }, + "availablePlans": { + "title": "Available Plans", + "subtitle": "Choose the plan that fits your needs" + }, + "static": { + "title": "Billing Information", + "message": "Online billing is not currently configured. To upgrade your plan or manage subscriptions, please contact us directly.", + "contactSales": "Contact Sales", + "contactToUpgrade": "Contact us to upgrade or customize your plan", + "maxUsers": "Max Users", + "upTo": "Up to" + }, + "period": { + "month": "month" + }, + "free": { + "name": "Free", + "highlight1": "Limited Tool Usage Per week", + "highlight2": "Access to all tools", + "highlight3": "Community support" + }, + "pro": { + "name": "Pro", + "highlight1": "Unlimited Tool Usage", + "highlight2": "Advanced PDF tools", + "highlight3": "No watermarks" + }, + "enterprise": { + "name": "Enterprise", + "highlight1": "Custom pricing", + "highlight2": "Dedicated support", + "highlight3": "Latest features" + }, + "feature": { + "title": "Feature", + "pdfTools": "Basic PDF Tools", + "fileSize": "File Size Limit", + "automation": "Automate tool workflows", + "api": "API Access", + "priority": "Priority Support", + "customPricing": "Custom Pricing" + } + }, + "subscription": { + "status": { + "active": "Active", + "pastDue": "Past Due", + "canceled": "Canceled", + "incomplete": "Incomplete", + "trialing": "Trial", + "none": "No Subscription" + }, + "renewsOn": "Renews on {{date}}", + "cancelsOn": "Cancels on {{date}}" + }, + "billing": { + "manageBilling": "Manage Billing", + "portal": { + "error": "Failed to open billing portal" + } + }, + "payment": { + "preparing": "Preparing your checkout...", + "upgradeTitle": "Upgrade to {{planName}}", + "success": "Payment Successful!", + "successMessage": "Your subscription has been activated successfully. You will receive a confirmation email shortly.", + "autoClose": "This window will close automatically...", + "error": "Payment Error" + }, + "firstLogin": { + "title": "First Time Login", + "welcomeTitle": "Welcome!", + "welcomeMessage": "For security reasons, you must change your password on your first login.", + "loggedInAs": "Logged in as", + "error": "Error", + "currentPassword": "Current Password", + "enterCurrentPassword": "Enter your current password", + "newPassword": "New Password", + "enterNewPassword": "Enter new password (min 8 characters)", + "confirmPassword": "Confirm New Password", + "reEnterNewPassword": "Re-enter new password", + "changePassword": "Change Password", + "allFieldsRequired": "All fields are required", + "passwordsDoNotMatch": "New passwords do not match", + "passwordTooShort": "Password must be at least 8 characters", + "passwordMustBeDifferent": "New password must be different from current password", + "passwordChangedSuccess": "Password changed successfully! Please log in again.", + "passwordChangeFailed": "Failed to change password. Please check your current password." + }, + "invite": { + "welcome": "Welcome to Stirling PDF", + "invalidToken": "Invalid invitation link", + "validationError": "Failed to validate invitation link", + "passwordRequired": "Password is required", + "passwordTooShort": "Password must be at least 6 characters", + "passwordMismatch": "Passwords do not match", + "acceptError": "Failed to create account", + "validating": "Validating invitation...", + "invalidInvitation": "Invalid Invitation", + "goToLogin": "Go to Login", + "welcomeTitle": "You've been invited!", + "welcomeSubtitle": "Complete your account setup to get started", + "accountFor": "Creating account for", + "linkExpires": "Link expires", + "email": "Email address", + "emailPlaceholder": "Enter your email address", + "emailRequired": "Email address is required", + "invalidEmail": "Invalid email address", + "choosePassword": "Choose a password", + "passwordPlaceholder": "Enter your password", + "confirmPassword": "Confirm password", + "confirmPasswordPlaceholder": "Re-enter your password", + "createAccount": "Create Account", + "creating": "Creating Account...", + "alreadyHaveAccount": "Already have an account?", + "signIn": "Sign in" + }, + "audit": { + "error": { + "title": "Error loading audit system" + }, + "notAvailable": "Audit system not available", + "notAvailableMessage": "The audit system is not configured or not available.", + "disabled": "Audit logging is disabled", + "disabledMessage": "Enable audit logging in your application configuration to track system events.", + "systemStatus": { + "title": "System Status", + "status": "Audit Logging", + "enabled": "Enabled", + "disabled": "Disabled", + "level": "Audit Level", + "retention": "Retention Period", + "days": "days", + "totalEvents": "Total Events" + }, + "tabs": { + "dashboard": "Dashboard", + "events": "Audit Events", + "export": "Export" + }, + "charts": { + "title": "Audit Dashboard", + "error": "Error loading charts", + "day": "Day", + "week": "Week", + "month": "Month", + "byType": "Events by Type", + "byUser": "Events by User", + "overTime": "Events Over Time" + }, + "events": { + "title": "Audit Events", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "error": "Error loading events", + "noEvents": "No events found", + "timestamp": "Timestamp", + "type": "Type", + "user": "User", + "ipAddress": "IP Address", + "actions": "Actions", + "viewDetails": "View Details", + "eventDetails": "Event Details", + "details": "Details" + }, + "export": { + "title": "Export Audit Data", + "description": "Export audit events to CSV or JSON format. Use filters to limit the exported data.", + "format": "Export Format", + "filters": "Filters (Optional)", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "exportButton": "Export Data", + "error": "Failed to export data" + } + }, + "usage": { + "noData": "No data available", + "error": "Error loading usage statistics", + "noDataMessage": "No usage statistics are currently available.", + "controls": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All", + "refresh": "Refresh", + "dataTypeLabel": "Data Type:", + "dataType": { + "all": "All", + "api": "API", + "ui": "UI" + } + }, + "showing": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All" + }, + "stats": { + "totalEndpoints": "Total Endpoints", + "totalVisits": "Total Visits", + "showing": "Showing", + "selectedVisits": "Selected Visits" + }, + "chart": { + "title": "Endpoint Usage Chart" + }, + "table": { + "title": "Detailed Statistics", + "endpoint": "Endpoint", + "visits": "Visits", + "percentage": "Percentage", + "noData": "No data available" + } + }, + "backendHealth": { + "checking": "Checking backend status...", + "online": "Backend Online", + "offline": "Backend Offline" + }, + "autoRedact": { + "tags": "Redactar,Amagar,ressaltar en negre,negre,marcador,ocult", + "title": "RedacciÃŗ Automàtica", + "header": "RedacciÃŗ Automàtica", + "colorLabel": "Color", + "textsToRedactLabel": "Text a Redactar (separat per línies)", + "textsToRedactPlaceholder": "p. ex. \\nConfidencial \\nMolt Secret", + "useRegexLabel": "Utilitza Regex", + "wholeWordSearchLabel": "Cerca de Paraula Completa", + "customPaddingLabel": "Espai Extra Personalitzat", + "convertPDFToImageLabel": "Converteix PDF a Imatge PDF (S'utilitza per eliminar text darrere del quadre)", + "submitButton": "Envia" + }, + "replaceColorPdf": { + "tags": "Reemplaça Color,Operacions de pàgina,Back end,Costat servidor" } -} \ No newline at end of file +} diff --git a/frontend/public/locales/cs-CZ/translation.json b/frontend/public/locales/cs-CZ/translation.json index 54b8bca76..ca9936f3e 100644 --- a/frontend/public/locales/cs-CZ/translation.json +++ b/frontend/public/locales/cs-CZ/translation.json @@ -1,4 +1,40 @@ { + "toolPanel": { + "modePrompt": { + "title": "Choose how you browse tools", + "description": "Preview both layouts and decide how you want to explore Stirling PDF tools.", + "sidebarTitle": "Sidebar mode", + "sidebarDescription": "Keep tools alongside your workspace for quick switching.", + "recommended": "Recommended", + "chooseSidebar": "Use sidebar mode", + "fullscreenTitle": "Fullscreen mode - (legacy)", + "fullscreenDescription": "Browse every tool in a catalogue that covers the workspace until you pick one.", + "chooseFullscreen": "Use fullscreen mode", + "dismiss": "Maybe later" + }, + "fullscreen": { + "showDetails": "Show Details", + "comingSoon": "Coming soon:", + "favorite": "Add to favourites", + "favorites": "Favourites", + "heading": "All tools (fullscreen view)", + "noResults": "Try adjusting your search or toggle descriptions to find what you need.", + "recommended": "Recommended", + "unfavorite": "Remove from favourites" + }, + "placeholder": "Choose a tool to get started", + "toggle": { + "fullscreen": "Switch to fullscreen mode", + "sidebar": "Switch to sidebar mode" + } + }, + "unsavedChanges": "You have unsaved changes to your PDF.", + "areYouSure": "Are you sure you want to leave?", + "unsavedChangesTitle": "Unsaved Changes", + "keepWorking": "Keep Working", + "discardChanges": "Discard & Leave", + "applyAndContinue": "Save & Leave", + "exportAndContinue": "Export & Continue", "language": { "direction": "ltr" }, @@ -18,8 +54,26 @@ "customTextDesc": "Vlastní text", "numberPagesDesc": "KterÊ strÃĄnky číslovat, vÃŊchozí je 'vÅĄechny', takÊ přijímÃĄ 1-5 nebo 2,5,9 atd.", "customNumberDesc": "VÃŊchozí je {n}, takÊ přijímÃĄ 'StrÃĄnka {n} z {total}', 'Text-{n}', '{filename}-{n}'", - "submit": "Přidat čísla strÃĄnek" + "submit": "Přidat čísla strÃĄnek", + "configuration": "Configuration", + "customize": "Customize Appearance", + "pagesAndStarting": "Pages & Starting Number", + "positionAndPages": "Position & Pages", + "error": { + "failed": "Add page numbers operation failed" + }, + "results": { + "title": "Page Number Results" + }, + "preview": "Position Selection", + "previewDisclaimer": "Preview is approximate. Final output may vary due to PDF font metrics." }, + "pageSelectionPrompt": "Vlastní vÃŊběr strÃĄnek (Zadejte seznam čísel strÃĄnek oddělenÃŊch ÄÃĄrkou jako 1,5,6 nebo funkci jako např. 2n+1):", + "startingNumberTooltip": "The first number to display. Subsequent pages will increment from this number.", + "marginTooltip": "Distance between the page number and the edge of the page.", + "fontSizeTooltip": "Size of the page number text in points. Larger numbers create bigger text.", + "fontTypeTooltip": "Font family for the page numbers. Choose based on your document style.", + "customTextTooltip": "Optional custom format for page numbers. Use {n} as placeholder for the number. Example: \"Page {n}\" will show \"Page 1\", \"Page 2\", etc.", "pdfPrompt": "Vyberte PDF soubor(y)", "multiPdfPrompt": "Vyberte PDF soubory (2+)", "multiPdfDropPrompt": "Vyberte (nebo přetÃĄhněte) vÅĄechny poÅžadovanÊ PDF soubory", @@ -30,15 +84,41 @@ "uploadLimitExceededPlural": "are too large. Maximum allowed size is", "processTimeWarning": "Upozornění: Tento proces můŞe trvat aÅž minutu v zÃĄvislosti na velikosti souboru", "pageOrderPrompt": "Vlastní pořadí strÃĄnek (Zadejte seznam čísel strÃĄnek oddělenÃŊch ÄÃĄrkou nebo funkci jako např. 2n+1):", - "pageSelectionPrompt": "Vlastní vÃŊběr strÃĄnek (Zadejte seznam čísel strÃĄnek oddělenÃŊch ÄÃĄrkou jako 1,5,6 nebo funkci jako např. 2n+1):", "goToPage": "Přejít", "true": "Ano", "false": "Ne", "unknown": "NeznÃĄmÃŊ", + "app": { + "description": "The Free Adobe Acrobat alternative (10M+ Downloads)" + }, "save": "UloÅžit", "saveToBrowser": "UloÅžit do prohlíŞeče", + "download": "StÃĄhnout", + "pin": "Pin File (keep active after tool run)", + "unpin": "Unpin File (replace after tool run)", + "undoOperationTooltip": "Click to undo the last operation and restore the original files", + "undo": "Undo", + "moreOptions": "More Options", + "editYourNewFiles": "Edit your new file(s)", "close": "Zavřít", + "openInViewer": "Open in Viewer", + "confirmClose": "Confirm Close", + "confirmCloseMessage": "Are you sure you want to close this file?", + "confirmCloseCancel": "Cancel", + "confirmCloseConfirm": "Close File", + "fileSelected": "Selected: {{filename}}", + "chooseFile": "Choose File", "filesSelected": "vybranÃŊch souborů", + "files": { + "title": "Files", + "upload": "Upload", + "uploadFiles": "Upload Files", + "addFiles": "Add files", + "selectFromWorkbench": "Select files from the workbench or ", + "selectMultipleFromWorkbench": "Select at least {{count}} files from the workbench or ", + "created": "Created", + "size": "File Size" + }, "noFavourites": "ÅŊÃĄdnÊ oblíbenÊ poloÅžky nebyly přidÃĄny", "downloadComplete": "StahovÃĄní dokončeno", "bored": "Nudíte se při čekÃĄní?", @@ -56,7 +136,10 @@ }, "error": { "pdfPassword": "PDF dokument je chrÃĄněn heslem a buď heslo nebylo zadÃĄno, nebo bylo nesprÃĄvnÊ", + "encryptedPdfMustRemovePassword": "This PDF is encrypted or password-protected. Please unlock it before converting to PDF/A.", + "incorrectPasswordProvided": "The PDF password is incorrect or not provided.", "_value": "Chyba", + "dismissAllErrors": "Dismiss All Errors", "sorry": "OmlouvÃĄme se za problÊm!", "needHelp": "Potřebujete pomoc / NaÅĄli jste problÊm?", "contactTip": "Pokud stÃĄle mÃĄte potíŞe, nevÃĄhejte nÃĄs kontaktovat. MůŞete podat ticket na naÅĄem GitHubu nebo nÃĄs kontaktovat přes Discord:", @@ -71,6 +154,10 @@ "githubSubmit": "GitHub - Podat ticket", "discordSubmit": "Discord - Podat příspěvek podpory" }, + "warning": { + "tooltipTitle": "Warning" + }, + "edit": "Edit", "delete": "Smazat", "username": "UÅživatelskÊ jmÊno", "password": "Heslo", @@ -82,6 +169,7 @@ "green": "ZelenÃĄ", "blue": "ModrÃĄ", "custom": "Vlastní...", + "comingSoon": "Coming soon", "WorkInProgess": "PrÃĄce probíhÃĄ, nemusí fungovat nebo můŞe obsahovat chyby. Prosím, nahlaste případnÊ problÊmy!", "poweredBy": "VyuŞívÃĄ", "yes": "Ano", @@ -115,12 +203,14 @@ "page": "StrÃĄnka", "pages": "StrÃĄnky", "loading": "NačítÃĄní...", + "review": "Review", "addToDoc": "Přidat do dokumentu", "reset": "Obnovit", "apply": "PouŞít", "noFileSelected": "No file selected. Please upload one.", "legal": { "privacy": "ZÃĄsady ochrany osobních Ãēdajů", + "iAgreeToThe": "I agree to all of the", "terms": "Podmínky pouÅžití", "accessibility": "Přístupnost", "cookie": "ZÃĄsady pouŞívÃĄní cookies", @@ -160,6 +250,7 @@ "title": "Chcete pomoci vylepÅĄit Stirling PDF?", "paragraph1": "Stirling PDF nabízí volitelnou analytiku, kterÃĄ nÃĄm pomÃĄhÃĄ zlepÅĄovat produkt. Nesledujeme ÅžÃĄdnÊ osobní Ãēdaje ani obsah souborů.", "paragraph2": "ZvaÅžte prosím povolení analytiky, abyste pomohli růstu Stirling-PDF a umoÅžnili nÃĄm lÊpe porozumět naÅĄim uÅživatelům.", + "learnMore": "Learn more", "enable": "Povolit analytiku", "disable": "ZakÃĄzat analytiku", "settings": "Nastavení analytiky můŞete změnit v souboru config/settings.yml" @@ -203,6 +294,54 @@ "cacheInputs": { "name": "UklÃĄdat vstupy formulÃĄÅ™Å¯", "help": "Povolí uklÃĄdÃĄní dříve pouÅžitÃŊch vstupů pro budoucí pouÅžití" + }, + "general": { + "title": "General", + "description": "Configure general application preferences.", + "account": "Account", + "accountDescription": "Manage your account settings", + "user": "User", + "signedInAs": "Signed in as", + "logout": "Log out", + "enableFeatures": { + "title": "For System Administrators", + "intro": "Enable user authentication, team management, and workspace features for your organization.", + "action": "Configure", + "and": "and", + "benefit": "Enables user roles, team collaboration, admin controls, and enterprise features.", + "learnMore": "Learn more in documentation", + "dismiss": "Dismiss" + }, + "autoUnzip": "Auto-unzip API responses", + "autoUnzipDescription": "Automatically extract files from ZIP responses", + "autoUnzipTooltip": "Automatically extract ZIP files returned from API operations. Disable to keep ZIP files intact. This does not affect automation workflows.", + "autoUnzipFileLimit": "Auto-unzip file limit", + "autoUnzipFileLimitDescription": "Maximum number of files to extract from ZIP", + "autoUnzipFileLimitTooltip": "Only unzip if the ZIP contains this many files or fewer. Set higher to extract larger ZIPs.", + "defaultToolPickerMode": "Default tool picker mode", + "defaultToolPickerModeDescription": "Choose whether the tool picker opens in fullscreen or sidebar by default", + "mode": { + "fullscreen": "Fullscreen", + "sidebar": "Sidebar" + } + }, + "hotkeys": { + "title": "Keyboard Shortcuts", + "description": "Hover a tool to see its shortcut or customise it below. Click \"Change shortcut\" and press a new key combination. Press Esc to cancel.", + "errorModifier": { + "mac": "Include ⌘ (Command), âŒĨ (Option), or another modifier in your shortcut.", + "windows": "Include Ctrl, Alt, or another modifier in your shortcut." + }, + "errorConflict": "Shortcut already used by {{tool}}.", + "none": "Not assigned", + "customBadge": "Custom", + "defaultLabel": "Default: {{shortcut}}", + "capturing": "Press keysâ€Ļ (Esc to cancel)", + "change": "Change shortcut", + "reset": "Reset", + "shortcut": "Shortcut", + "noShortcut": "No shortcut set", + "searchPlaceholder": "Search tools..." } }, "changeCreds": { @@ -274,8 +413,10 @@ "top20": "Top 20", "all": "All", "refresh": "Refresh", - "includeHomepage": "Include Homepage ('/')", - "includeLoginPage": "Include Login Page ('/login')", + "dataTypeLabel": "Data Type:", + "dataTypeAll": "All", + "dataTypeApi": "API", + "dataTypeUi": "UI", "totalEndpoints": "Total Endpoints", "totalVisits": "Total Visits", "showing": "Showing", @@ -290,7 +431,9 @@ "top": "Top", "numberOfVisits": "Number of Visits", "visitsTooltip": "Visits: {0} ({1}% of total)", - "retry": "Retry" + "retry": "Retry", + "includeHomepage": "Include Homepage ('/')", + "includeLoginPage": "Include Login Page ('/login')" }, "database": { "title": "Import/Export databÃĄze", @@ -331,22 +474,310 @@ "alphabetical": "Alphabetical", "globalPopularity": "Global Popularity", "sortBy": "Sort by:", + "mobile": { + "brandAlt": "Stirling PDF logo", + "openFiles": "Open files", + "swipeHint": "Swipe left or right to switch views", + "tools": "Tools", + "toolsSlide": "Tool selection panel", + "viewSwitcher": "Switch workspace view", + "workbenchSlide": "Workspace panel", + "workspace": "Workspace" + }, "multiTool": { + "tags": "multiple,tools", "title": "PDF Multi nÃĄstroj", "desc": "Sloučit, otočit, přeuspoÅ™ÃĄdat, rozdělit a odstranit strÃĄnky" }, "merge": { + "tags": "combine,join,unite", "title": "Sloučit", "desc": "Snadno sloučit více PDF do jednoho." }, "split": { + "tags": "divide,separate,break", "title": "Rozdělit", "desc": "Rozdělit PDF do více dokumentů" }, "rotate": { + "tags": "turn,flip,orient", "title": "Otočit", "desc": "Snadno otočit vaÅĄe PDF." }, + "convert": { + "tags": "transform,change", + "title": "PřevÊst", + "desc": "Convert files between different formats" + }, + "pdfOrganiser": { + "tags": "organize,rearrange,reorder", + "title": "UspoÅ™ÃĄdat", + "desc": "Odstranit/přeuspoÅ™ÃĄdat strÃĄnky v libovolnÊm pořadí" + }, + "addImage": { + "tags": "insert,embed,place", + "title": "Přidat obrÃĄzek", + "desc": "PřidÃĄ obrÃĄzek na určenÊ místo v PDF" + }, + "addAttachments": { + "tags": "embed,attach,include", + "title": "Add Attachments", + "desc": "Add or remove embedded files (attachments) to/from a PDF" + }, + "watermark": { + "tags": "stamp,mark,overlay", + "title": "Přidat vodoznak", + "desc": "Přidat vlastní vodoznak do vaÅĄeho PDF dokumentu." + }, + "removePassword": { + "tags": "unlock", + "title": "Odstranit heslo", + "desc": "Odstranit ochranu heslem z vaÅĄeho PDF dokumentu." + }, + "compress": { + "tags": "shrink,reduce,optimize", + "title": "Komprimovat", + "desc": "Komprimovat PDF pro zmenÅĄení jejich velikosti." + }, + "unlockPDFForms": { + "tags": "unlock,enable,edit", + "title": "Unlock PDF Forms", + "desc": "Remove read-only property of form fields in a PDF document." + }, + "changeMetadata": { + "tags": "edit,modify,update", + "title": "Změnit metadata", + "desc": "Změnit/odstranit/přidat metadata z PDF dokumentu" + }, + "ocr": { + "tags": "extract,scan", + "title": "OCR / VyčiÅĄtění skenů", + "desc": "Vyčistí skeny a detekuje text z obrÃĄzků v PDF a znovu ho přidÃĄ jako text." + }, + "extractImages": { + "tags": "pull,save,export", + "title": "Extrahovat obrÃĄzky", + "desc": "Extrahuje vÅĄechny obrÃĄzky z PDF a uloŞí je do zipu" + }, + "scannerImageSplit": { + "tags": "detect,split,photos", + "title": "Detect & Split Scanned Photos", + "desc": "Detect and split scanned photos into separate pages" + }, + "sign": { + "tags": "signature,autograph", + "title": "Podepsat", + "desc": "PřidÃĄ podpis do PDF kreslením, textem nebo obrÃĄzkem" + }, + "flatten": { + "tags": "simplify,remove,interactive", + "title": "ZploÅĄtit", + "desc": "Odstranit vÅĄechny interaktivní prvky a formulÃĄÅ™e z PDF" + }, + "certSign": { + "tags": "authenticate,PEM,P12,official,encrypt,sign,certificate,PKCS12,JKS,server,manual,auto", + "title": "Podepsat certifikÃĄtem", + "desc": "PodepÃ­ÅĄe PDF certifikÃĄtem/klíčem (PEM/P12)" + }, + "repair": { + "tags": "fix,restore", + "title": "Opravit", + "desc": "Pokusí se opravit poÅĄkozenÃŊ/rozbitÃŊ PDF" + }, + "removeBlanks": { + "tags": "delete,clean,empty", + "title": "Odstranit prÃĄzdnÊ strÃĄnky", + "desc": "Detekuje a odstraní prÃĄzdnÊ strÃĄnky z dokumentu" + }, + "removeAnnotations": { + "tags": "delete,clean,strip", + "title": "Odstranit poznÃĄmky", + "desc": "Odstraní vÅĄechny komentÃĄÅ™e/poznÃĄmky z PDF" + }, + "compare": { + "tags": "difference", + "title": "Porovnat", + "desc": "PorovnÃĄ a zobrazí rozdíly mezi 2 PDF dokumenty" + }, + "removeCertSign": { + "tags": "remove,delete,unlock", + "title": "Odstranit podpis certifikÃĄtu", + "desc": "Odstranit podpis certifikÃĄtu z PDF" + }, + "pageLayout": { + "tags": "layout,arrange,combine", + "title": "RozvrÅžení více strÃĄnek", + "desc": "Sloučit více strÃĄnek PDF dokumentu do jednÊ strÃĄnky" + }, + "bookletImposition": { + "tags": "booklet,print,binding", + "title": "Booklet Imposition", + "desc": "Create booklets with proper page ordering and multi-page layout for printing and binding" + }, + "scalePages": { + "tags": "resize,adjust,scale", + "title": "Upravit velikost/měřítko strÃĄnky", + "desc": "Změnit velikost/měřítko strÃĄnky a/nebo jejího obsahu." + }, + "addPageNumbers": { + "tags": "number,pagination,count", + "title": "Přidat čísla strÃĄnek", + "desc": "Přidat čísla strÃĄnek v celÊm dokumentu na určenÊm místě" + }, + "autoRename": { + "tags": "auto-detect,header-based,organize,relabel", + "title": "Auto Rename PDF File", + "desc": "Auto renames a PDF file based on its detected header" + }, + "adjustContrast": { + "tags": "contrast,brightness,saturation", + "title": "Upravit barvy/kontrast", + "desc": "Upravit kontrast, sytost a jas PDF" + }, + "crop": { + "tags": "trim,cut,resize", + "title": "Oříznout PDF", + "desc": "Oříznout PDF pro zmenÅĄení jeho velikosti (zachovÃĄ text!)" + }, + "autoSplitPDF": { + "tags": "auto,split,QR", + "title": "Automaticky rozdělit strÃĄnky", + "desc": "Automaticky rozdělit naskenovanÊ PDF s fyzickÃŊm QR kÃŗdem pro rozdělení strÃĄnek" + }, + "sanitize": { + "tags": "clean,purge,remove", + "title": "Sanitise", + "desc": "Remove potentially harmful elements from PDF files" + }, + "getPdfInfo": { + "tags": "info,metadata,details", + "title": "Získat VÅ ECHNY informace o PDF", + "desc": "ZískÃĄ vÅĄechny moÅžnÊ informace o PDF" + }, + "pdfToSinglePage": { + "tags": "combine,merge,single", + "title": "Jedna velkÃĄ strÃĄnka", + "desc": "Sloučí vÅĄechny strÃĄnky PDF do jednÊ velkÊ strÃĄnky" + }, + "showJS": { + "tags": "javascript,code,script", + "title": "Zobrazit Javascript", + "desc": "VyhledÃĄ a zobrazí jakÃŊkoliv JS vloÅženÃŊ do PDF" + }, + "redact": { + "tags": "censor,blackout,hide", + "title": "Ruční začernění", + "desc": "Začerní PDF na zÃĄkladě vybranÊho textu, nakreslenÃŊch tvarů a/nebo vybranÃŊch strÃĄnek" + }, + "splitBySections": { + "tags": "split,sections,divide", + "title": "Split PDF by Sections", + "desc": "Divide each page of a PDF into smaller horizontal and vertical sections" + }, + "addStamp": { + "tags": "stamp,mark,seal", + "title": "Add Stamp to PDF", + "desc": "Add text or add image stamps at set locations" + }, + "removeImage": { + "tags": "remove,delete,clean", + "title": "Odstranit obrÃĄzek", + "desc": "Odstranit obrÃĄzek z PDF pro zmenÅĄení velikosti souboru" + }, + "splitByChapters": { + "tags": "split,chapters,structure", + "title": "Rozdělit PDF podle kapitol", + "desc": "Rozdělí PDF do více souborů podle jeho struktury kapitol." + }, + "validateSignature": { + "tags": "validate,verify,certificate", + "title": "Ověřit podpis PDF", + "desc": "Ověřit digitÃĄlní podpisy a certifikÃĄty v PDF dokumentech" + }, + "swagger": { + "tags": "API,documentation,test", + "title": "API Documentation", + "desc": "View API documentation and test endpoints" + }, + "scannerEffect": { + "tags": "scan,simulate,create", + "title": "Scanner Effect", + "desc": "Create a PDF that looks like it was scanned" + }, + "editTableOfContents": { + "tags": "bookmarks,contents,edit", + "title": "Edit Table of Contents", + "desc": "Add or edit bookmarks and table of contents in PDF documents" + }, + "manageCertificates": { + "tags": "certificates,import,export", + "title": "Manage Certificates", + "desc": "Import, export, or delete digital certificate files used for signing PDFs." + }, + "read": { + "tags": "view,open,display", + "title": "Read", + "desc": "View and annotate PDFs. Highlight text, draw, or insert comments for review and collaboration." + }, + "reorganizePages": { + "tags": "rearrange,reorder,organize", + "title": "Reorganize Pages", + "desc": "Rearrange, duplicate, or delete PDF pages with visual drag-and-drop control." + }, + "extractPages": { + "tags": "pull,select,copy", + "title": "Extrahovat strÃĄnky", + "desc": "Extract specific pages from a PDF document" + }, + "removePages": { + "tags": "delete,extract,exclude", + "title": "Odstranit", + "desc": "Smazat neÅžÃĄdoucí strÃĄnky z vaÅĄeho PDF dokumentu." + }, + "autoSizeSplitPDF": { + "tags": "auto,split,size", + "title": "Automaticky rozdělit podle velikosti/počtu", + "desc": "Rozdělí jeden PDF na více dokumentů podle velikosti, počtu strÃĄnek nebo počtu dokumentů" + }, + "replaceColor": { + "title": "Replace & Invert Colour", + "desc": "Replace or invert colours in PDF documents" + }, + "devApi": { + "tags": "API,development,documentation", + "title": "API", + "desc": "Link to API documentation" + }, + "devFolderScanning": { + "tags": "automation,folder,scanning", + "title": "Automated Folder Scanning", + "desc": "Link to automated folder scanning guide" + }, + "devSsoGuide": { + "title": "SSO Guide", + "desc": "Link to SSO guide" + }, + "devAirgapped": { + "title": "Air-gapped Setup", + "desc": "Link to air-gapped setup guide" + }, + "addPassword": { + "title": "Přidat heslo", + "desc": "ZaÅĄifrovat vÃĄÅĄ PDF dokument heslem." + }, + "changePermissions": { + "title": "Změnit oprÃĄvnění", + "desc": "Change document restrictions and permissions" + }, + "automate": { + "tags": "workflow,sequence,automation", + "title": "Automate", + "desc": "Build multi-step workflows by chaining together PDF actions. Ideal for recurring tasks." + }, + "overlay-pdfs": { + "desc": "Překryje PDF nad jinÃŊm PDF", + "title": "PřekrÃŊt PDF" + }, "imageToPDF": { "title": "ObrÃĄzek na PDF", "desc": "PřevÊst obrÃĄzek (PNG, JPEG, GIF) na PDF." @@ -355,18 +786,6 @@ "title": "PDF na obrÃĄzek", "desc": "PřevÊst PDF na obrÃĄzek. (PNG, JPEG, GIF)" }, - "pdfOrganiser": { - "title": "UspoÅ™ÃĄdat", - "desc": "Odstranit/přeuspoÅ™ÃĄdat strÃĄnky v libovolnÊm pořadí" - }, - "addImage": { - "title": "Přidat obrÃĄzek", - "desc": "PřidÃĄ obrÃĄzek na určenÊ místo v PDF" - }, - "watermark": { - "title": "Přidat vodoznak", - "desc": "Přidat vlastní vodoznak do vaÅĄeho PDF dokumentu." - }, "permissions": { "title": "Změnit oprÃĄvnění", "desc": "Změnit oprÃĄvnění vaÅĄeho PDF dokumentu" @@ -375,38 +794,10 @@ "title": "Odstranit", "desc": "Smazat neÅžÃĄdoucí strÃĄnky z vaÅĄeho PDF dokumentu." }, - "addPassword": { - "title": "Přidat heslo", - "desc": "ZaÅĄifrovat vÃĄÅĄ PDF dokument heslem." - }, - "removePassword": { - "title": "Odstranit heslo", - "desc": "Odstranit ochranu heslem z vaÅĄeho PDF dokumentu." - }, - "compress": { - "title": "Komprimovat", - "desc": "Komprimovat PDF pro zmenÅĄení jejich velikosti." - }, - "unlockPDFForms": { - "title": "Unlock PDF Forms", - "desc": "Remove read-only property of form fields in a PDF document." - }, - "changeMetadata": { - "title": "Změnit metadata", - "desc": "Změnit/odstranit/přidat metadata z PDF dokumentu" - }, "fileToPDF": { "title": "PřevÊst soubor na PDF", "desc": "PřevÊst tÊměř jakÃŊkoliv soubor na PDF (DOCX, PNG, XLS, PPT, TXT a dalÅĄÃ­)" }, - "ocr": { - "title": "OCR / VyčiÅĄtění skenů", - "desc": "Vyčistí skeny a detekuje text z obrÃĄzků v PDF a znovu ho přidÃĄ jako text." - }, - "extractImages": { - "title": "Extrahovat obrÃĄzky", - "desc": "Extrahuje vÅĄechny obrÃĄzky z PDF a uloŞí je do zipu" - }, "pdfToPDFA": { "title": "PDF na PDF/A", "desc": "PřevÊst PDF na PDF/A pro dlouhodobÊ uchovÃĄvÃĄní" @@ -435,70 +826,14 @@ "title": "Detekovat/Rozdělit naskenovanÊ fotografie", "desc": "Rozdělí více fotografií z jednÊ fotografie/PDF" }, - "sign": { - "title": "Podepsat", - "desc": "PřidÃĄ podpis do PDF kreslením, textem nebo obrÃĄzkem" - }, - "flatten": { - "title": "ZploÅĄtit", - "desc": "Odstranit vÅĄechny interaktivní prvky a formulÃĄÅ™e z PDF" - }, - "repair": { - "title": "Opravit", - "desc": "Pokusí se opravit poÅĄkozenÃŊ/rozbitÃŊ PDF" - }, - "removeBlanks": { - "title": "Odstranit prÃĄzdnÊ strÃĄnky", - "desc": "Detekuje a odstraní prÃĄzdnÊ strÃĄnky z dokumentu" - }, - "removeAnnotations": { - "title": "Odstranit poznÃĄmky", - "desc": "Odstraní vÅĄechny komentÃĄÅ™e/poznÃĄmky z PDF" - }, - "compare": { - "title": "Porovnat", - "desc": "PorovnÃĄ a zobrazí rozdíly mezi 2 PDF dokumenty" - }, - "certSign": { - "title": "Podepsat certifikÃĄtem", - "desc": "PodepÃ­ÅĄe PDF certifikÃĄtem/klíčem (PEM/P12)" - }, - "removeCertSign": { - "title": "Odstranit podpis certifikÃĄtu", - "desc": "Odstranit podpis certifikÃĄtu z PDF" - }, - "pageLayout": { - "title": "RozvrÅžení více strÃĄnek", - "desc": "Sloučit více strÃĄnek PDF dokumentu do jednÊ strÃĄnky" - }, - "scalePages": { - "title": "Upravit velikost/měřítko strÃĄnky", - "desc": "Změnit velikost/měřítko strÃĄnky a/nebo jejího obsahu." - }, "pipeline": { "title": "Pipeline", "desc": "Spustit více akcí na PDF definovÃĄním pipeline skriptů" }, - "addPageNumbers": { - "title": "Přidat čísla strÃĄnek", - "desc": "Přidat čísla strÃĄnek v celÊm dokumentu na určenÊm místě" - }, "auto-rename": { "title": "Automaticky přejmenovat PDF soubor", "desc": "Automaticky přejmenuje PDF soubor podle detekovanÊ hlavičky" }, - "adjustContrast": { - "title": "Upravit barvy/kontrast", - "desc": "Upravit kontrast, sytost a jas PDF" - }, - "crop": { - "title": "Oříznout PDF", - "desc": "Oříznout PDF pro zmenÅĄení jeho velikosti (zachovÃĄ text!)" - }, - "autoSplitPDF": { - "title": "Automaticky rozdělit strÃĄnky", - "desc": "Automaticky rozdělit naskenovanÊ PDF s fyzickÃŊm QR kÃŗdem pro rozdělení strÃĄnek" - }, "sanitizePDF": { "title": "Sanitizovat", "desc": "Odstranit skripty a dalÅĄÃ­ prvky z PDF souborů" @@ -519,30 +854,14 @@ "title": "PDF na Markdown", "desc": "PřevÃĄdí libovolnÊ PDF na Markdown" }, - "getPdfInfo": { - "title": "Získat VÅ ECHNY informace o PDF", - "desc": "ZískÃĄ vÅĄechny moÅžnÊ informace o PDF" - }, "pageExtracter": { "title": "Extrahovat strÃĄnky", "desc": "Extrahuje vybranÊ strÃĄnky z PDF" }, - "pdfToSinglePage": { - "title": "Jedna velkÃĄ strÃĄnka", - "desc": "Sloučí vÅĄechny strÃĄnky PDF do jednÊ velkÊ strÃĄnky" - }, - "showJS": { - "title": "Zobrazit Javascript", - "desc": "VyhledÃĄ a zobrazí jakÃŊkoliv JS vloÅženÃŊ do PDF" - }, "autoRedact": { "title": "AutomatickÊ začernění", "desc": "Automaticky začerní text v PDF na zÃĄkladě vstupního textu" }, - "redact": { - "title": "Ruční začernění", - "desc": "Začerní PDF na zÃĄkladě vybranÊho textu, nakreslenÃŊch tvarů a/nebo vybranÃŊch strÃĄnek" - }, "PDFToCSV": { "title": "PDF na CSV", "desc": "Extrahuje tabulky z PDF a převÃĄdí je na CSV" @@ -551,10 +870,6 @@ "title": "Automaticky rozdělit podle velikosti/počtu", "desc": "Rozdělí jeden PDF na více dokumentů podle velikosti, počtu strÃĄnek nebo počtu dokumentů" }, - "overlay-pdfs": { - "title": "PřekrÃŊt PDF", - "desc": "Překryje PDF nad jinÃŊm PDF" - }, "split-by-sections": { "title": "Rozdělit PDF podle sekcí", "desc": "Rozdělí kaÅždou strÃĄnku PDF na menÅĄÃ­ horizontÃĄlní a vertikÃĄlní sekce" @@ -563,43 +878,17 @@ "title": "Přidat razítko do PDF", "desc": "PřidÃĄ textovÃĄ nebo obrÃĄzkovÊ razítka na určenÃĄ místa" }, - "removeImage": { - "title": "Odstranit obrÃĄzek", - "desc": "Odstranit obrÃĄzek z PDF pro zmenÅĄení velikosti souboru" - }, - "splitByChapters": { - "title": "Rozdělit PDF podle kapitol", - "desc": "Rozdělí PDF do více souborů podle jeho struktury kapitol." - }, - "validateSignature": { - "title": "Ověřit podpis PDF", - "desc": "Ověřit digitÃĄlní podpisy a certifikÃĄty v PDF dokumentech" - }, "replace-color": { "title": "Nahrazení a inverze barev", "desc": "Úprava barev textu a pozadí v PDF nebo jejich inverze ke sníŞení velikosti souboru" }, - "convert": { - "title": "PřevÊst" - }, "attachments": { "title": "Add attachments" }, - "extractPages": { - "title": "Extrahovat strÃĄnky" - }, - "removePages": { - "title": "Odstranit", - "desc": "Smazat neÅžÃĄdoucí strÃĄnky z vaÅĄeho PDF dokumentu." - }, "removeImagePdf": { "title": "Odstranit obrÃĄzek", "desc": "Odstranit obrÃĄzek z PDF pro zmenÅĄení velikosti souboru" }, - "autoSizeSplitPDF": { - "title": "Automaticky rozdělit podle velikosti/počtu", - "desc": "Rozdělí jeden PDF na více dokumentů podle velikosti, počtu strÃĄnek nebo počtu dokumentů" - }, "adjust-contrast": { "title": "Upravit barvy/kontrast", "desc": "Upravit kontrast, sytost a jas PDF" @@ -607,11 +896,12 @@ "replaceColorPdf": { "title": "Nahrazení a inverze barev", "desc": "Úprava barev textu a pozadí v PDF nebo jejich inverze ke sníŞení velikosti souboru" - }, - "changePermissions": { - "title": "Změnit oprÃĄvnění" } }, + "landing": { + "addFiles": "Add Files", + "uploadFromComputer": "Upload from computer" + }, "viewPdf": { "tags": "zobrazit,číst,anotovat,text,obrÃĄzek", "title": "View/Edit PDF", @@ -645,17 +935,39 @@ "merge": { "tags": "sloučit,Operace se strÃĄnkami,Zadní strana,serverovÃĄ strana", "title": "Sloučit", + "removeDigitalSignature": { + "label": "Remove digital signature in the merged file?", + "tooltip": { + "title": "Remove Digital Signature", + "description": "Digital signatures will be invalidated when merging files. Check this to remove them from the final merged PDF." + } + }, + "generateTableOfContents": { + "label": "Generate table of contents in the merged file?", + "tooltip": { + "title": "Generate Table of Contents", + "description": "Automatically creates a clickable table of contents in the merged PDF based on the original file names and page numbers." + } + }, + "submit": "Sloučit", + "sortBy": { + "description": "Files will be merged in the order they're selected. Drag to reorder or sort below.", + "label": "Sort By", + "filename": "NÃĄzev souboru", + "dateModified": "Date Modified", + "ascending": "Ascending", + "descending": "Descending", + "sort": "Sort" + }, + "error": { + "failed": "An error occurred while merging the PDFs." + }, "header": "Sloučit více PDF (2+)", "sortByName": "Seřadit podle nÃĄzvu", "sortByDate": "Seřadit podle data", - "removeCertSign": "Odstranit digitÃĄlní podpis v sloučenÊm souboru?", - "submit": "Sloučit", - "sortBy": { - "filename": "NÃĄzev souboru" - } + "removeCertSign": "Odstranit digitÃĄlní podpis v sloučenÊm souboru?" }, "split": { - "tags": "Operace se strÃĄnkami,rozdělit,Více strÃĄnek,vyjmout,serverovÃĄ strana", "title": "Rozdělit PDF", "header": "Rozdělit PDF", "desc": { @@ -671,25 +983,249 @@ "splitPages": "Zadejte strÃĄnky pro rozdělení:", "submit": "Rozdělit", "steps": { + "chooseMethod": "Choose Method", "settings": "Nastavení" }, + "settings": { + "selectMethodFirst": "Please select a split method first" + }, + "error": { + "failed": "An error occurred while splitting the PDF." + }, + "method": { + "label": "Choose split method", + "placeholder": "Select how to split the PDF" + }, "methods": { + "prefix": { + "splitAt": "Split at", + "splitBy": "Split by" + }, + "byPages": { + "name": "Page Numbers", + "desc": "Extract specific pages (1,3,5-10)", + "tooltip": "Enter page numbers separated by commas or ranges with hyphens" + }, + "bySections": { + "name": "Sections", + "desc": "Divide pages into grid sections", + "tooltip": "Split each page into horizontal and vertical sections" + }, "bySize": { - "name": "Velikost souboru" + "name": "Velikost souboru", + "desc": "Limit maximum file size", + "tooltip": "Specify maximum file size (e.g. 10MB, 500KB)" + }, + "byPageCount": { + "name": "Page Count", + "desc": "Fixed pages per file", + "tooltip": "Enter the number of pages for each split file" + }, + "byDocCount": { + "name": "Document Count", + "desc": "Create specific number of files", + "tooltip": "Enter how many files you want to create" + }, + "byChapters": { + "name": "Chapters", + "desc": "Split at bookmark boundaries", + "tooltip": "Uses PDF bookmarks to determine split points" + }, + "byPageDivider": { + "name": "Page Divider", + "desc": "Auto-split with divider sheets", + "tooltip": "Use QR code divider sheets between documents when scanning" } }, "value": { "fileSize": { - "label": "Velikost souboru" + "label": "Velikost souboru", + "placeholder": "e.g. 10MB, 500KB" + }, + "pageCount": { + "label": "Pages per File", + "placeholder": "e.g. 5, 10" + }, + "docCount": { + "label": "Number of Files", + "placeholder": "e.g. 3, 5" } - } + }, + "tooltip": { + "header": { + "title": "Split Methods Overview" + }, + "byPages": { + "title": "Split at Page Numbers", + "text": "Split your PDF at specific page numbers. Using 'n' splits after page n. Using 'n-m' splits before page n and after page m.", + "bullet1": "Single split points: 3,7 (splits after pages 3 and 7)", + "bullet2": "Range split points: 3-8 (splits before page 3 and after page 8)", + "bullet3": "Mixed: 2,5-10,15 (splits after page 2, before page 5, after page 10, and after page 15)" + }, + "bySections": { + "title": "Split by Grid Sections", + "text": "Divide each page into a grid of sections. Useful for splitting documents with multiple columns or extracting specific areas.", + "bullet1": "Horizontal: Number of rows to create", + "bullet2": "Vertical: Number of columns to create", + "bullet3": "Merge: Combine all sections into one PDF" + }, + "bySize": { + "title": "Split by File Size", + "text": "Create multiple PDFs that don't exceed a specified file size. Ideal for file size limitations or email attachments.", + "bullet1": "Use MB for larger files (e.g., 10MB)", + "bullet2": "Use KB for smaller files (e.g., 500KB)", + "bullet3": "System will split at page boundaries" + }, + "byCount": { + "title": "Split by Count", + "text": "Create multiple PDFs with a specific number of pages or documents each.", + "bullet1": "Page Count: Fixed number of pages per file", + "bullet2": "Document Count: Fixed number of output files", + "bullet3": "Useful for batch processing workflows" + }, + "byChapters": { + "title": "Split by Chapters", + "text": "Use PDF bookmarks to automatically split at chapter boundaries. Requires PDFs with bookmark structure.", + "bullet1": "Bookmark Level: Which level to split on (1=top level)", + "bullet2": "Include Metadata: Preserve document properties", + "bullet3": "Allow Duplicates: Handle repeated bookmark names" + }, + "byDocCount": { + "bullet1": "Enter the number of output files you want", + "bullet2": "Pages are distributed as evenly as possible", + "bullet3": "Useful when you need a specific number of files", + "text": "Create a specific number of output files by evenly distributing pages across them.", + "title": "Split by Document Count" + }, + "byPageCount": { + "bullet1": "Enter the number of pages per output file", + "bullet2": "Last file may have fewer pages if not evenly divisible", + "bullet3": "Useful for batch processing workflows", + "text": "Create multiple PDFs with a specific number of pages each. Perfect for creating uniform document chunks.", + "title": "Split by Page Count" + }, + "byPageDivider": { + "bullet1": "Print divider sheets from the download link", + "bullet2": "Insert divider sheets between your documents", + "bullet3": "Scan all documents together as one PDF", + "bullet4": "Upload - divider pages are automatically detected and removed", + "bullet5": "Enable Duplex Mode if scanning both sides of divider sheets", + "text": "Automatically split scanned documents using physical divider sheets with QR codes. Perfect for processing multiple documents scanned together.", + "title": "Split by Page Divider" + } + }, + "methodSelection": { + "tooltip": { + "bullet1": "Click on a method card to select it", + "bullet2": "Hover over each card to see a quick description", + "bullet3": "The settings step will appear after you select a method", + "bullet4": "You can change methods at any time before processing", + "header": { + "text": "Choose how you want to split your PDF document. Each method is optimized for different use cases and document types.", + "title": "Split Method Selection" + }, + "title": "Choose Your Split Method" + } + }, + "selectMethod": "Select a split method", + "tags": "Operace se strÃĄnkami,rozdělit,Více strÃĄnek,vyjmout,serverovÃĄ strana" }, "rotate": { - "tags": "serverovÃĄ strana", "title": "Otočit PDF", + "submit": "Otočit", + "selectRotation": "Select Rotation Angle (Clockwise)", + "error": { + "failed": "An error occurred while rotating the PDF." + }, + "preview": { + "title": "Rotation Preview" + }, + "rotateLeft": "Rotate Anticlockwise", + "rotateRight": "Rotate Clockwise", + "tooltip": { + "header": { + "title": "Rotate Settings Overview" + }, + "description": { + "text": "Rotate your PDF pages clockwise or anticlockwise in 90-degree increments. All pages in the PDF will be rotated. The preview shows how your document will look after rotation." + }, + "controls": { + "title": "Controls", + "text": "Use the rotation buttons to adjust orientation. Left button rotates anticlockwise, right button rotates clockwise. Each click rotates by 90 degrees." + } + }, + "tags": "serverovÃĄ strana", "header": "Otočit PDF", - "selectAngle": "Vyberte Ãēhel otočení (v nÃĄsobcích 90 stupňů):", - "submit": "Otočit" + "selectAngle": "Vyberte Ãēhel otočení (v nÃĄsobcích 90 stupňů):" + }, + "convert": { + "title": "PřevÊst", + "desc": "Convert files between different formats", + "files": "Files", + "selectFilesPlaceholder": "Select files in the main view to get started", + "settings": "Nastavení", + "conversionCompleted": "Conversion completed", + "results": "Results", + "defaultFilename": "converted_file", + "conversionResults": "Conversion Results", + "convertFrom": "Convert from", + "convertTo": "Convert to", + "sourceFormatPlaceholder": "Source format", + "targetFormatPlaceholder": "Target format", + "selectSourceFormatFirst": "Select a source format first", + "outputOptions": "Output Options", + "pdfOptions": "PDF Options", + "imageOptions": "Image Options", + "colorType": "Colour Type", + "color": "Barva", + "greyscale": "Stupně ÅĄedi", + "blackwhite": "Black & White", + "dpi": "DPI", + "output": "Output", + "single": "Single", + "multiple": "Multiple", + "fitOption": "Fit Option", + "maintainAspectRatio": "Maintain Aspect Ratio", + "fitDocumentToPage": "Fit Document to Page", + "fillPage": "Vyplnit strÃĄnku", + "autoRotate": "Auto Rotate", + "autoRotateDescription": "Automatically rotate images to better fit the PDF page", + "combineImages": "Combine Images", + "combineImagesDescription": "Combine all images into one PDF, or create separate PDFs for each image", + "webOptions": "Web to PDF Options", + "zoomLevel": "Zoom Level", + "emailOptions": "Email to PDF Options", + "includeAttachments": "Include email attachments", + "maxAttachmentSize": "Maximum attachment size (MB)", + "includeAllRecipients": "Include CC and BCC recipients in header", + "downloadHtml": "Download HTML intermediate file instead of PDF", + "pdfaOptions": "PDF/A Options", + "outputFormat": "Output Format", + "pdfaNote": "PDF/A-1b is more compatible, PDF/A-2b supports more features.", + "pdfaDigitalSignatureWarning": "PDF obsahuje digitÃĄlní podpis, kterÃŊ bude v dalÅĄÃ­m kroku odstraněn.", + "fileFormat": "File Format", + "wordDoc": "Word Document", + "wordDocExt": "Word Document (.docx)", + "odtExt": "OpenDocument Text (.odt)", + "pptExt": "PowerPoint (.pptx)", + "odpExt": "OpenDocument Presentation (.odp)", + "txtExt": "Plain Text (.txt)", + "rtfExt": "Rich Text Format (.rtf)", + "selectedFiles": "Selected files", + "noFileSelected": "No file selected. Use the file panel to add files.", + "convertFiles": "Convert Files", + "converting": "Converting...", + "downloadConverted": "Download Converted File", + "errorNoFiles": "Please select at least one file to convert.", + "errorNoFormat": "Please select both source and target formats.", + "errorNotSupported": "Conversion from {{from}} to {{to}} is not supported.", + "images": "Images", + "officeDocs": "Office Documents (Word, Excel, PowerPoint)", + "imagesExt": "Images (JPG, PNG, etc.)", + "markdown": "Markdown", + "textRtf": "Text/RTF", + "grayscale": "Stupně ÅĄedi", + "errorConversion": "An error occurred while converting the file." }, "imageToPdf": { "tags": "převod,img,jpg,obrÃĄzek,fotka" @@ -727,7 +1263,33 @@ "8": "Odstranit poslední", "9": "Odstranit první a poslední", "10": "Sloučení sudÊ-lichÊ", - "11": "Duplicate all pages" + "11": "Duplicate all pages", + "desc": { + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, â€Ļ).", + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, â€Ļ).", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimized for binding on the side)." + } + }, + "desc": { + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, â€Ļ).", + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, â€Ļ).", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimised for binding on the side).", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document." }, "placeholder": "(např. 1,3,2 nebo 4-8,2,10-12 nebo 2n-1)" }, @@ -739,9 +1301,198 @@ "upload": "Přidat obrÃĄzek", "submit": "Přidat obrÃĄzek" }, + "attachments": { + "tags": "embed,attach,file,attachment,attachments", + "title": "Add attachments", + "header": "Add attachments", + "add": "Add Attachment", + "remove": "Remove Attachment", + "embed": "Embed Attachment", + "submit": "Add attachments" + }, "watermark": { - "tags": "Text,opakující se,popisek,vlastní,copyright,ochrannÃĄ znÃĄmka,img,jpg,obrÃĄzek,fotka", "title": "Přidat vodoznak", + "desc": "Add text or image watermarks to PDF files", + "completed": "Watermark added", + "submit": "Přidat vodoznak", + "filenamePrefix": "watermarked", + "error": { + "failed": "An error occurred while adding watermark to the PDF." + }, + "watermarkType": { + "text": "Text", + "image": "Image" + }, + "settings": { + "type": "Watermark Type", + "text": { + "label": "Watermark Text", + "placeholder": "Enter watermark text" + }, + "image": { + "label": "Watermark Image", + "choose": "Choose Image", + "selected": "Selected: {{filename}}" + }, + "fontSize": "Velikost písma", + "size": "Size", + "alphabet": "Font/Language", + "color": "Watermark Colour", + "rotation": "Rotation (degrees)", + "opacity": "Opacity (%)", + "spacing": { + "horizontal": "Horizontal Spacing", + "vertical": "Vertical Spacing", + "height": "Height Spacing", + "width": "Width Spacing" + }, + "convertToImage": "Flatten PDF pages to images" + }, + "alphabet": { + "roman": "Roman/Latin", + "arabic": "Arabic", + "japanese": "Japanese", + "korean": "Korean", + "chinese": "Chinese", + "thai": "Thai" + }, + "steps": { + "type": "Watermark Type", + "wording": "Wording", + "textStyle": "Style", + "formatting": "Formatting", + "file": "Watermark File" + }, + "results": { + "title": "Watermark Results" + }, + "tooltip": { + "language": { + "title": "Language Support", + "text": "Choose the appropriate language setting to ensure proper font rendering for your text." + }, + "appearance": { + "title": "Appearance Settings", + "text": "Control how your watermark looks and blends with the document.", + "bullet1": "Rotation: -360° to 360° for angled watermarks", + "bullet2": "Opacity: 0-100% for transparency control", + "bullet3": "Lower opacity creates subtle watermarks" + }, + "spacing": { + "title": "Spacing Control", + "text": "Adjust the spacing between repeated watermarks across the page.", + "bullet1": "Width spacing: Horizontal distance between watermarks", + "bullet2": "Height spacing: Vertical distance between watermarks", + "bullet3": "Higher values create more spread out patterns" + }, + "type": { + "header": { + "title": "Watermark Type Selection" + }, + "description": { + "title": "Choose Your Watermark", + "text": "Select between text or image watermarks based on your needs." + }, + "text": { + "title": "Text Watermarks", + "text": "Perfect for adding copyright notices, company names, or confidentiality labels. Supports multiple languages and custom colours.", + "bullet1": "Customisable fonts and languages", + "bullet2": "Adjustable colours and transparency", + "bullet3": "Ideal for legal or branding text" + }, + "image": { + "title": "Image Watermarks", + "text": "Use logos, stamps, or any image as a watermark. Great for branding and visual identification.", + "bullet1": "Upload any image format", + "bullet2": "Maintains image quality", + "bullet3": "Perfect for logos and stamps" + } + }, + "wording": { + "header": { + "title": "Text Content" + }, + "text": { + "title": "Watermark Text", + "text": "Enter the text that will appear as your watermark across the document.", + "bullet1": "Keep it concise for better readability", + "bullet2": "Common examples: 'CONFIDENTIAL', 'DRAFT', company name", + "bullet3": "Emoji characters are not supported and will be filtered out" + } + }, + "textStyle": { + "header": { + "title": "Text Style" + }, + "color": { + "title": "Colour Selection", + "text": "Choose a colour that provides good contrast with your document content.", + "bullet1": "Light grey (#d3d3d3) for subtle watermarks", + "bullet2": "Black or dark colours for high contrast", + "bullet3": "Custom colours for branding purposes" + }, + "language": { + "title": "Language Support", + "text": "Choose the appropriate language setting to ensure proper font rendering." + } + }, + "file": { + "header": { + "title": "Image Upload" + }, + "upload": { + "title": "Image Selection", + "text": "Upload an image file to use as your watermark.", + "bullet1": "Supports common formats: PNG, JPG, GIF, BMP", + "bullet2": "PNG with transparency works best", + "bullet3": "Higher resolution images maintain quality better" + }, + "recommendations": { + "title": "Best Practices", + "text": "Tips for optimal image watermark results.", + "bullet1": "Use logos or stamps with transparent backgrounds", + "bullet2": "Simple designs work better than complex images", + "bullet3": "Consider the final document size when choosing resolution" + } + }, + "formatting": { + "header": { + "title": "Formatting & Layout" + }, + "size": { + "title": "Size Control", + "text": "Adjust the size of your watermark (text or image).", + "bullet1": "Larger sizes create more prominent watermarks" + }, + "appearance": { + "title": "Appearance Settings", + "text": "Control how your watermark looks and blends with the document.", + "bullet1": "Rotation: -360° to 360° for angled watermarks", + "bullet2": "Opacity: 0-100% for transparency control", + "bullet3": "Lower opacity creates subtle watermarks" + }, + "spacing": { + "title": "Spacing Control", + "text": "Adjust the spacing between repeated watermarks across the page.", + "bullet1": "Horizontal spacing: Distance between watermarks left to right", + "bullet2": "Vertical spacing: Distance between watermarks top to bottom", + "bullet3": "Higher values create more spread out patterns" + }, + "security": { + "title": "Security Option", + "text": "Convert the final PDF to an image-based format for enhanced security.", + "bullet1": "Prevents text selection and copying", + "bullet2": "Makes watermarks harder to remove", + "bullet3": "Results in larger file sizes", + "bullet4": "Best for sensitive or copyrighted content" + } + } + }, + "type": { + "1": "Text", + "2": "ObrÃĄzek" + }, + "tags": "Text,opakující se,popisek,vlastní,copyright,ochrannÃĄ znÃĄmka,img,jpg,obrÃĄzek,fotka", "header": "Přidat vodoznak", "customColor": "Vlastní barva textu", "selectText": { @@ -755,14 +1506,6 @@ "8": "Typ vodoznaku:", "9": "ObrÃĄzek vodoznaku:", "10": "PřevÊst PDF na PDF-obrÃĄzek" - }, - "submit": "Přidat vodoznak", - "type": { - "1": "Text", - "2": "ObrÃĄzek" - }, - "settings": { - "fontSize": "Velikost písma" } }, "permissions": { @@ -787,50 +1530,201 @@ "removePages": { "tags": "Odstranit strÃĄnky,smazat strÃĄnky", "title": "Odstranit", + "pageNumbers": { + "label": "Pages to Remove", + "placeholder": "e.g., 1,3,5-8,10", + "error": "Invalid page number format. Use numbers, ranges (1-5), or mathematical expressions (2n+1)" + }, + "filenamePrefix": "pages_removed", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "settings": { + "title": "Settings" + }, + "tooltip": { + "header": { + "title": "Remove Pages Settings" + }, + "pageNumbers": { + "title": "Page Selection", + "text": "Specify which pages to remove from your PDF. You can select individual pages, ranges, or use mathematical expressions.", + "bullet1": "Individual pages: 1,3,5 (removes pages 1, 3, and 5)", + "bullet2": "Page ranges: 1-5,10-15 (removes pages 1-5 and 10-15)", + "bullet3": "Mathematical: 2n+1 (removes odd pages)", + "bullet4": "Open ranges: 5- (removes from page 5 to end)" + }, + "examples": { + "title": "Common Examples", + "text": "Here are some common page selection patterns:", + "bullet1": "Remove first page: 1", + "bullet2": "Remove last 3 pages: -3", + "bullet3": "Remove every other page: 2n", + "bullet4": "Remove specific scattered pages: 1,5,10,15" + }, + "safety": { + "title": "Safety Tips", + "text": "Important considerations when removing pages:", + "bullet1": "Always preview your selection before processing", + "bullet2": "Keep a backup of your original file", + "bullet3": "Page numbers start from 1, not 0", + "bullet4": "Invalid page numbers will be ignored" + } + }, + "error": { + "failed": "An error occurred whilst removing pages." + }, + "results": { + "title": "Page Removal Results" + }, "submit": "Odstranit" }, - "addPassword": { - "tags": "zabezpečit,bezpečnost", - "title": "Přidat heslo", - "header": "Přidat heslo (ZaÅĄifrovat)", - "selectText": { - "1": "Vyberte PDF k zaÅĄifrovÃĄní", - "2": "UÅživatelskÊ heslo", - "3": "DÊlka ÅĄifrovacího klíče", - "4": "VyÅĄÅĄÃ­ hodnoty jsou silnějÅĄÃ­, ale niÅžÅĄÃ­ hodnoty mají lepÅĄÃ­ kompatibilitu.", - "5": "OprÃĄvnění k nastavení (Doporučeno pouŞívat společně s heslem vlastníka)", - "6": "ZabrÃĄnit sestavení dokumentu", - "7": "ZabrÃĄnit extrakci obsahu", - "8": "ZabrÃĄnit extrakci pro přístupnost", - "9": "ZabrÃĄnit vyplňovÃĄní formulÃĄÅ™Å¯", - "10": "ZabrÃĄnit ÃēpravÃĄm", - "11": "ZabrÃĄnit ÃēpravÃĄm poznÃĄmek", - "12": "ZabrÃĄnit tisku", - "13": "ZabrÃĄnit tisku v různÃŊch formÃĄtech", - "14": "Heslo vlastníka", - "15": "Omezuje, co lze s dokumentem dělat po jeho otevření (Není podporovÃĄno vÅĄemi čtečkami)", - "16": "Omezuje samotnÊ otevření dokumentu" + "extractPages": { + "title": "Extract Pages", + "pageNumbers": { + "label": "Pages to Extract", + "placeholder": "e.g., 1,3,5-8 or odd & 1-10" + }, + "settings": { + "title": "Settings" }, - "submit": "ZaÅĄifrovat", "tooltip": { - "permissions": { - "title": "Změnit oprÃĄvnění" + "description": "Extracts the selected pages into a new PDF, preserving order." + }, + "error": { + "failed": "Failed to extract pages" + }, + "results": { + "title": "Pages Extracted" + }, + "submit": "Extract Pages" + }, + "pageSelection": { + "tooltip": { + "header": { + "title": "Page Selection Guide" + }, + "basic": { + "title": "Basic Usage", + "text": "Select specific pages from your PDF document using simple syntax.", + "bullet1": "Individual pages: 1,3,5", + "bullet2": "Page ranges: 3-6 or 10-15", + "bullet3": "All pages: all" + }, + "advanced": { + "title": "Advanced Features" + }, + "tips": { + "title": "Tips", + "text": "Keep these guidelines in mind:", + "bullet1": "Page numbers start from 1 (not 0)", + "bullet2": "Spaces are automatically removed", + "bullet3": "Invalid expressions are ignored" + }, + "syntax": { + "title": "Syntax Basics", + "text": "Use numbers, ranges, keywords, and progressions (n starts at 0). Parentheses are supported.", + "bullets": { + "numbers": "Numbers/ranges: 5, 10-20", + "keywords": "Keywords: odd, even", + "progressions": "Progressions: 3n, 4n+1" + } + }, + "operators": { + "title": "Operators", + "text": "AND has higher precedence than comma. NOT applies within the document range.", + "and": "AND: & or \"and\" — require both conditions (e.g., 1-50 & even)", + "comma": "Comma: , or | — combine selections (e.g., 1-10, 20)", + "not": "NOT: ! or \"not\" — exclude pages (e.g., 3n & not 30)" + }, + "examples": { + "title": "Examples" + }, + "complex": { + "bullet1": "1,3-5,8,2n → pages 1, 3–5, 8, plus evens", + "bullet2": "10-,2n-1 → from page 10 to end + odd pages", + "description": "Mix different types.", + "title": "Complex Combinations" + }, + "description": "Choose which pages to use for the operation. Supports single pages, ranges, formulas, and the all keyword.", + "individual": { + "bullet1": "1,3,5 → selects pages 1, 3, 5", + "bullet2": "2,7,12 → selects pages 2, 7, 12", + "description": "Enter numbers separated by commas.", + "title": "Individual Pages" + }, + "mathematical": { + "bullet1": "2n → all even pages (2, 4, 6â€Ļ)", + "bullet2": "2n-1 → all odd pages (1, 3, 5â€Ļ)", + "bullet3": "3n → every 3rd page (3, 6, 9â€Ļ)", + "bullet4": "4n-1 → pages 3, 7, 11, 15â€Ļ", + "description": "Use n in formulas for patterns.", + "title": "Mathematical Functions" + }, + "ranges": { + "bullet1": "3-6 → selects pages 3–6", + "bullet2": "10-15 → selects pages 10–15", + "bullet3": "5- → selects pages 5 to end", + "description": "Use - for consecutive pages.", + "title": "Page Ranges" + }, + "special": { + "bullet1": "all → selects all pages", + "title": "Special Keywords" } } }, - "removePassword": { - "tags": "zabezpečit,deÅĄifrovat,bezpečnost,odstranit heslo,smazat heslo", - "title": "Odstranit heslo", - "header": "Odstranit heslo (DeÅĄifrovat)", - "selectText": { - "1": "Vyberte PDF k deÅĄifrovÃĄní", - "2": "Heslo" + "bulkSelection": { + "syntaxError": "There is a syntax issue. See Page Selection tips for help.", + "header": { + "title": "Page Selection Guide" }, - "submit": "Odstranit", - "desc": "Odstranit ochranu heslem z vaÅĄeho PDF dokumentu.", - "password": { - "stepTitle": "Odstranit heslo", - "label": "SoučasnÊ heslo" + "syntax": { + "title": "Syntax Basics", + "text": "Use numbers, ranges, keywords, and progressions (n starts at 0). Parentheses are supported.", + "bullets": { + "numbers": "Numbers/ranges: 5, 10-20", + "keywords": "Keywords: odd, even", + "progressions": "Progressions: 3n, 4n+1" + } + }, + "operators": { + "title": "Operators", + "text": "AND has higher precedence than comma. NOT applies within the document range.", + "and": "AND: & or \"and\" — require both conditions (e.g., 1-50 & even)", + "comma": "Comma: , or | — combine selections (e.g., 1-10, 20)", + "not": "NOT: ! or \"not\" — exclude pages (e.g., 3n & not 30)" + }, + "examples": { + "title": "Examples", + "first50": "First 50", + "last50": "Last 50", + "every3rd": "Every 3rd", + "oddWithinExcluding": "Odd within 1-20 excluding 5-7", + "combineSets": "Combine sets" + }, + "firstNPages": { + "title": "First N Pages", + "placeholder": "Number of pages" + }, + "lastNPages": { + "title": "Last N Pages", + "placeholder": "Number of pages" + }, + "everyNthPage": { + "title": "Every Nth Page", + "placeholder": "Step size" + }, + "range": { + "title": "Range", + "fromPlaceholder": "From", + "toPlaceholder": "To" + }, + "keywords": { + "title": "Keywords" + }, + "advanced": { + "title": "Advanced" } }, "compressPdfs": { @@ -840,12 +1734,142 @@ "tags": "remove,delete,form,field,readonly", "title": "Remove Read-Only from Form Fields", "header": "Unlock PDF Forms", - "submit": "Remove" + "submit": "Remove", + "description": "This tool will remove read-only restrictions from PDF form fields, making them editable and fillable.", + "filenamePrefix": "unlocked_forms", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst unlocking PDF forms." + }, + "results": { + "title": "Unlocked Forms Results" + } }, "changeMetadata": { - "tags": "NÃĄzev,autor,datum,vytvoření,čas,vydavatel,producent,statistiky", - "title": "Změnit metadata", "header": "Změnit metadata", + "submit": "Změnit", + "filenamePrefix": "metadata", + "settings": { + "title": "Metadata Settings" + }, + "standardFields": { + "title": "Standard Fields" + }, + "deleteAll": { + "label": "Remove Existing Metadata", + "checkbox": "Delete all metadata" + }, + "title": { + "label": "Title", + "placeholder": "Document title" + }, + "author": { + "label": "Author", + "placeholder": "Document author" + }, + "subject": { + "label": "Subject", + "placeholder": "Document subject" + }, + "keywords": { + "label": "Keywords", + "placeholder": "Document keywords" + }, + "creator": { + "label": "Creator", + "placeholder": "Document creator" + }, + "producer": { + "label": "Producer", + "placeholder": "Document producer" + }, + "dates": { + "title": "Date Fields" + }, + "creationDate": { + "label": "Creation Date", + "placeholder": "Creation date" + }, + "modificationDate": { + "label": "Modification Date", + "placeholder": "Modification date" + }, + "trapped": { + "label": "Trapped Status", + "unknown": "Unknown", + "true": "True", + "false": "False" + }, + "advanced": { + "title": "Advanced Options" + }, + "customFields": { + "title": "Custom Metadata", + "description": "Add custom metadata fields to the document", + "add": "Add Field", + "key": "Key", + "keyPlaceholder": "Custom key", + "value": "Value", + "valuePlaceholder": "Custom value", + "remove": "Remove" + }, + "results": { + "title": "Updated PDFs" + }, + "error": { + "failed": "An error occurred while changing the PDF metadata." + }, + "tooltip": { + "header": { + "title": "PDF Metadata Overview" + }, + "standardFields": { + "title": "Standard Fields", + "text": "Common PDF metadata fields that describe the document.", + "bullet1": "Title: Document name or heading", + "bullet2": "Author: Person who created the document", + "bullet3": "Subject: Brief description of content", + "bullet4": "Keywords: Search terms for the document", + "bullet5": "Creator/Producer: Software used to create the PDF" + }, + "dates": { + "title": "Date Fields", + "text": "When the document was created and modified.", + "bullet1": "Creation Date: When original document was made", + "bullet2": "Modification Date: When last changed" + }, + "options": { + "title": "Additional Options", + "text": "Custom fields and privacy controls.", + "bullet1": "Custom Metadata: Add your own key-value pairs", + "bullet2": "Trapped Status: High-quality printing setting", + "bullet3": "Delete All: Remove all metadata for privacy" + }, + "deleteAll": { + "title": "Remove Existing Metadata", + "text": "Complete metadata deletion to ensure privacy." + }, + "customFields": { + "title": "Custom Metadata", + "text": "Add your own custom key-value metadata pairs.", + "bullet1": "Add any custom fields relevant to your document", + "bullet2": "Examples: Department, Project, Version, Status", + "bullet3": "Both key and value are required for each entry" + }, + "advanced": { + "title": "Advanced Options", + "trapped": { + "title": "Trapped Status", + "description": "Indicates if document is prepared for high-quality printing.", + "bullet1": "True: Document has been trapped for printing", + "bullet2": "False: Document has not been trapped", + "bullet3": "Unknown: Trapped status is not specified" + } + } + }, + "tags": "NÃĄzev,autor,datum,vytvoření,čas,vydavatel,producent,statistiky", "selectText": { "1": "Upravte proměnnÊ, kterÊ chcete změnit", "2": "Smazat vÅĄechna metadata", @@ -853,15 +1877,7 @@ "4": "Ostatní metadata:", "5": "Přidat vlastní poloÅžku metadat" }, - "author": "Autor:", - "creationDate": "Datum vytvoření (rrrr/MM/dd HH:mm:ss):", - "creator": "Tvůrce:", - "keywords": "KlíčovÃĄ slova:", - "modDate": "Datum Ãēpravy (rrrr/MM/dd HH:mm:ss):", - "producer": "Producent:", - "subject": "Předmět:", - "trapped": "Zachyceno:", - "submit": "Změnit" + "modDate": "Datum Ãēpravy (rrrr/MM/dd HH:mm:ss):" }, "fileToPDF": { "tags": "transformace,formÃĄt,dokument,obrÃĄzek,prezentace,text,převod,office,docs,word,excel,powerpoint", @@ -875,6 +1891,7 @@ "ocr": { "tags": "rozpoznÃĄní,text,obrÃĄzek,sken,číst,identifikovat,detekce,upravitelnÃŊ", "title": "OCR / ČiÅĄtění skenů", + "desc": "Vyčistí skeny a detekuje text z obrÃĄzků v PDF a znovu ho přidÃĄ jako text.", "header": "ČiÅĄtění skenů / OCR (OptickÊ rozpoznÃĄvÃĄní znaků)", "selectText": { "1": "Vyberte jazyky, kterÊ mají bÃŊt detekovÃĄny v PDF (UvedenÊ jsou aktuÃĄlně detekovanÊ):", @@ -893,23 +1910,89 @@ "help": "Přečtěte si prosím tuto dokumentaci o pouÅžití pro jinÊ jazyky a/nebo pouÅžití mimo Docker", "credit": "Tato sluÅžba pouŞívÃĄ qpdf a Tesseract pro OCR.", "submit": "Zpracovat PDF pomocí OCR", - "desc": "Vyčistí skeny a detekuje text z obrÃĄzků v PDF a znovu ho přidÃĄ jako text.", + "operation": { + "submit": "Process OCR and Review" + }, + "results": { + "title": "OCR Results" + }, + "languagePicker": { + "additionalLanguages": "Looking for additional languages?", + "viewSetupGuide": "View setup guide →" + }, "settings": { "title": "Nastavení", "ocrMode": { - "label": "ReÅžim OCR" + "label": "ReÅžim OCR", + "auto": "Auto (skip text layers)", + "force": "Force (re-OCR all, replace text)", + "strict": "Strict (abort if text found)" }, "languages": { - "label": "Jazyky" + "label": "Jazyky", + "placeholder": "Select languages" + }, + "compatibilityMode": { + "label": "Compatibility Mode" + }, + "advancedOptions": { + "label": "Processing Options", + "sidecar": "Create a text file", + "deskew": "Deskew pages", + "clean": "Clean input file", + "cleanFinal": "Clean final output" } }, "tooltip": { + "header": { + "title": "OCR Settings Overview" + }, "mode": { - "title": "ReÅžim OCR" + "title": "ReÅžim OCR", + "text": "Optical Character Recognition (OCR) helps you turn scanned or screenshotted pages into text you can search, copy, or highlight.", + "bullet1": "Auto skips pages that already contain text layers.", + "bullet2": "Force re-OCRs every page and replaces all the text.", + "bullet3": "Strict halts if any selectable text is found." }, "languages": { - "title": "Jazyky" + "title": "Jazyky", + "text": "Improve OCR accuracy by specifying the expected languages. Choose one or more languages to guide detection." + }, + "output": { + "title": "Output", + "text": "Decide how you want the text output formatted:", + "bullet1": "Searchable PDF embeds text behind the original image.", + "bullet2": "HOCR XML returns a structured machine-readable file.", + "bullet3": "Plain-text sidecar creates a separate .txt file with raw content." + }, + "advanced": { + "header": { + "title": "Advanced OCR Processing" + }, + "compatibility": { + "title": "Compatibility Mode", + "text": "Uses OCR 'sandwich PDF' mode: results in larger files, but more reliable with certain languages and older PDF software. By default we use hOCR for smaller, modern PDFs." + }, + "sidecar": { + "title": "Create Text File", + "text": "Generates a separate .txt file alongside the PDF containing all extracted text content for easy access and processing." + }, + "deskew": { + "title": "Deskew Pages", + "text": "Automatically corrects skewed or tilted pages to improve OCR accuracy. Useful for scanned documents that weren't perfectly aligned." + }, + "clean": { + "title": "Clean Input File", + "text": "Preprocesses the input by removing noise, enhancing contrast, and optimising the image for better OCR recognition before processing." + }, + "cleanFinal": { + "title": "Clean Final Output", + "text": "Post-processes the final PDF by removing OCR artefacts and optimising the text layer for better readability and smaller file size." + } } + }, + "error": { + "failed": "OCR operation failed" } }, "extractImages": { @@ -918,7 +2001,13 @@ "header": "Extrahovat obrÃĄzky", "selectText": "Vyberte formÃĄt obrÃĄzku pro převod extrahovanÃŊch obrÃĄzků", "allowDuplicates": "UloÅžit duplicitní obrÃĄzky", - "submit": "Extrahovat" + "submit": "Extrahovat", + "settings": { + "title": "Settings" + }, + "error": { + "failed": "An error occurred while extracting images from the PDF." + } }, "pdfToPDFA": { "tags": "archiv,dlouhodobÃŊ,standard,převod,ÃēloÅžiÅĄtě,uchovÃĄní", @@ -990,17 +2079,53 @@ }, "info": "Python není nainstalovÃĄn. Je vyÅžadovÃĄn pro spuÅĄtění." }, + "scannerImageSplit": { + "title": "Extracted Images", + "submit": "Extract Image Scans", + "error": { + "failed": "An error occurred while extracting image scans." + }, + "tooltip": { + "title": "Photo Splitter", + "whatThisDoes": "What this does", + "whatThisDoesDesc": "Automatically finds and extracts each photo from a scanned page or composite image—no manual cropping.", + "whenToUse": "When to use", + "useCase1": "Scan whole album pages in one go", + "useCase2": "Split flatbed batches into separate files", + "useCase3": "Break collages into individual photos", + "useCase4": "Pull photos from documents", + "quickFixes": "Quick fixes", + "problem1": "Photos not detected → increase Tolerance to 30-50", + "problem2": "Too many false detections → increase Minimum Area to 15,000-20,000", + "problem3": "Crops are too tight → increase Border Size to 5-10", + "problem4": "Tilted photos not straightened → lower Angle Threshold to ~5°", + "problem5": "Dust/noise boxes → increase Minimum Contour Area to 1000-2000", + "setupTips": "Setup tips", + "tip1": "Use a plain, light background", + "tip2": "Leave a small gap (≈1 cm) between photos", + "tip3": "Scan at 300-600 DPI", + "tip4": "Clean the scanner glass", + "headsUp": "Heads-up", + "headsUpDesc": "Overlapping photos or backgrounds very close in colour to the photos can reduce accuracy-try a lighter or darker background and leave more space." + } + }, "sign": { - "tags": "autorizovat,iniciÃĄly,kreslenÃŊ-podpis,textovÃŊ-podpis,obrÃĄzkovÃŊ-podpis", "title": "Podepsat", "header": "Podepsat PDF", "upload": "NahrÃĄt obrÃĄzek", - "draw": "Nakreslit podpis", - "text": "TextovÃŊ vstup", + "draw": { + "title": "Draw your signature", + "clear": "Clear" + }, + "text": { + "name": "Signer Name", + "placeholder": "Enter your full name" + }, "clear": "Vymazat", "add": "Přidat", "saved": "UloÅženÊ podpisy", "save": "UloÅžit podpis", + "applySignatures": "Apply Signatures", "personalSigs": "Osobní podpisy", "sharedSigs": "SdílenÊ podpisy", "noSavedSigs": "Nebyly nalezeny ÅžÃĄdnÊ uloÅženÊ podpisy", @@ -1012,42 +2137,179 @@ "previous": "Předchozí strÃĄnka", "maintainRatio": "Přepnout zachovÃĄní poměru stran", "undo": "Undo", - "redo": "Redo" + "redo": "Redo", + "submit": "Sign Document", + "steps": { + "configure": "Configure Signature" + }, + "type": { + "title": "Signature Type", + "draw": "Draw", + "canvas": "Canvas", + "image": "Image", + "text": "Text" + }, + "image": { + "label": "Upload signature image", + "placeholder": "Select image file", + "hint": "Upload a PNG or JPG image of your signature" + }, + "instructions": { + "title": "How to add signature", + "canvas": "After drawing your signature in the canvas, close the modal then click anywhere on the PDF to place it.", + "image": "After uploading your signature image above, click anywhere on the PDF to place it.", + "text": "After entering your name above, click anywhere on the PDF to place your signature." + }, + "mode": { + "move": "Move Signature", + "place": "Place Signature" + }, + "updateAndPlace": "Update and Place", + "activate": "Activate Signature Placement", + "deactivate": "Stop Placing Signatures", + "results": { + "title": "Signature Results" + }, + "error": { + "failed": "An error occurred while signing the PDF." + }, + "tags": "autorizovat,iniciÃĄly,kreslenÃŊ-podpis,textovÃŊ-podpis,obrÃĄzkovÃŊ-podpis" }, "flatten": { - "tags": "statickÃŊ,deaktivovat,neinteraktivní,zjednoduÅĄit", "title": "ZploÅĄtit", "header": "ZploÅĄtit PDF", "flattenOnlyForms": "ZploÅĄtit pouze formulÃĄÅ™e", "submit": "ZploÅĄtit", + "filenamePrefix": "flattened", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, "steps": { "settings": "Nastavení" }, "options": { - "flattenOnlyForms": "ZploÅĄtit pouze formulÃĄÅ™e" - } + "stepTitle": "Flatten Options", + "title": "Flatten Options", + "flattenOnlyForms": { + "label": "ZploÅĄtit pouze formulÃĄÅ™e", + "desc": "Only flatten form fields, leaving other interactive elements intact" + }, + "note": "Flattening removes interactive elements from the PDF, making them non-editable." + }, + "results": { + "title": "Flatten Results" + }, + "error": { + "failed": "An error occurred while flattening the PDF." + }, + "tooltip": { + "header": { + "title": "About Flattening PDFs" + }, + "description": { + "title": "What does flattening do?", + "text": "Flattening makes your PDF non-editable by turning fillable forms and buttons into regular text and images. The PDF will look exactly the same, but no one can change or fill in the forms anymore. Perfect for sharing completed forms, creating final documents for records, or ensuring the PDF looks the same everywhere.", + "bullet1": "Text boxes become regular text (can't be edited)", + "bullet2": "Checkboxes and buttons become pictures", + "bullet3": "Great for final versions you don't want changed", + "bullet4": "Ensures consistent appearance across all devices" + }, + "formsOnly": { + "title": "What does 'Flatten only forms' mean?", + "text": "This option only removes the ability to fill in forms, but keeps other features working like clicking links, viewing bookmarks, and reading comments.", + "bullet1": "Forms become non-editable", + "bullet2": "Links still work when clicked", + "bullet3": "Comments and notes remain visible", + "bullet4": "Bookmarks still help you navigate" + } + }, + "tags": "statickÃŊ,deaktivovat,neinteraktivní,zjednoduÅĄit" }, "repair": { "tags": "opravit,obnovit,korekce,obnovit", "title": "Opravit", "header": "Opravit PDF", - "submit": "Opravit" + "submit": "Opravit", + "description": "This tool will attempt to repair corrupted or damaged PDF files. No additional settings are required.", + "filenamePrefix": "repaired", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst repairing the PDF." + }, + "results": { + "title": "Repair Results" + } }, "removeBlanks": { - "tags": "vyčistit,zjednoduÅĄit,bez-obsahu,uspoÅ™ÃĄdat", "title": "Odstranit prÃĄzdnÊ strÃĄnky", "header": "Odstranit prÃĄzdnÊ strÃĄnky", - "threshold": "PrÃĄh bělosti pixelů:", + "settings": { + "title": "Settings" + }, + "threshold": { + "label": "Pixel Whiteness Threshold" + }, + "whitePercent": { + "label": "White Percentage Threshold", + "unit": "%" + }, + "includeBlankPages": { + "label": "Include detected blank pages" + }, + "tooltip": { + "header": { + "title": "Remove Blank Pages Settings" + }, + "threshold": { + "title": "Pixel Whiteness Threshold", + "text": "Controls how white a pixel must be to be considered 'white'. This helps determine what counts as a blank area on the page.", + "bullet1": "0 = Pure black (most restrictive)", + "bullet2": "128 = Medium grey", + "bullet3": "255 = Pure white (least restrictive)" + }, + "whitePercent": { + "title": "White Percentage Threshold", + "text": "Sets the minimum percentage of white pixels required for a page to be considered blank and removed.", + "bullet1": "Lower values (e.g., 80%) = More pages removed", + "bullet2": "Higher values (e.g., 95%) = Only very blank pages removed", + "bullet3": "Use higher values for documents with light backgrounds" + }, + "includeBlankPages": { + "title": "Include Detected Blank Pages", + "text": "When enabled, creates a separate PDF containing all the blank pages that were detected and removed from the original document.", + "bullet1": "Useful for reviewing what was removed", + "bullet2": "Helps verify the detection accuracy", + "bullet3": "Can be disabled to reduce output file size" + } + }, + "submit": "Odstranit prÃĄzdnÊ", + "error": { + "failed": "Failed to remove blank pages" + }, + "results": { + "title": "Removed Blank Pages" + }, + "tags": "vyčistit,zjednoduÅĄit,bez-obsahu,uspoÅ™ÃĄdat", "thresholdDesc": "PrÃĄh pro určení, jak bílÃŊ musí pixel bÃŊt, aby byl klasifikovÃĄn jako 'bílÃŊ'. 0 = černÃĄ, 255 čistě bílÃĄ.", - "whitePercent": "Procento bílÊ (%):", - "whitePercentDesc": "Procento strÃĄnky, kterÊ musí bÃŊt 'bílÊ' pixely, aby byla odstraněna", - "submit": "Odstranit prÃĄzdnÊ" + "whitePercentDesc": "Procento strÃĄnky, kterÊ musí bÃŊt 'bílÊ' pixely, aby byla odstraněna" }, "removeAnnotations": { "tags": "komentÃĄÅ™e,zvÃŊraznění,poznÃĄmky,značky,odstranit", "title": "Odstranit poznÃĄmky", "header": "Odstranit poznÃĄmky", - "submit": "Odstranit" + "submit": "Odstranit", + "settings": { + "title": "Settings" + }, + "info": { + "title": "About Remove Annotations", + "description": "This tool will remove all annotations (comments, highlights, notes, etc.) from your PDF documents." + }, + "error": { + "failed": "An error occurred while removing annotations from the PDF." + } }, "compare": { "tags": "rozliÅĄit,kontrast,změny,analÃŊza", @@ -1079,6 +2341,142 @@ "certSign": { "tags": "ověřit,PEM,P12,oficiÃĄlní,ÅĄifrovat", "title": "PodepisovÃĄní certifikÃĄtem", + "filenamePrefix": "signed", + "signMode": { + "stepTitle": "Sign Mode", + "tooltip": { + "header": { + "title": "About PDF Signatures" + }, + "overview": { + "title": "How signatures work", + "text": "Both modes seal the document (any edits are flagged as tampering) and record who/when/how for auditing. Viewer trust depends on the certificate chain." + }, + "manual": { + "title": "Manual - Bring your certificate", + "text": "Use your own certificate files for brand-aligned identity. Can display Trusted when your CA/chain is recognised.", + "use": "Use for: customer-facing, legal, compliance." + }, + "auto": { + "title": "Auto - Zero-setup, instant system seal", + "text": "Signs with a server self-signed certificate. Same tamper-evident seal and audit trail; typically shows Unverified in viewers.", + "use": "Use when: you need speed and consistent internal identity across reviews and records." + }, + "rule": { + "title": "Rule of thumb", + "text": "Need recipient Trusted status? Manual. Need a fast, tamper-evident seal and audit trail with no setup? Auto." + } + } + }, + "certTypeStep": { + "stepTitle": "Certificate Format" + }, + "certFiles": { + "stepTitle": "Certificate Files" + }, + "appearance": { + "stepTitle": "Signature Appearance", + "tooltip": { + "header": { + "title": "About Signature Appearance" + }, + "invisible": { + "title": "Invisible Signatures", + "text": "The signature is added to the PDF for security but won't be visible when viewing the document. Perfect for legal requirements without changing the document's appearance.", + "bullet1": "Provides security without visual changes", + "bullet2": "Meets legal requirements for digital signing", + "bullet3": "Doesn't affect document layout or design" + }, + "visible": { + "title": "Visible Signatures", + "text": "Shows a signature block on the PDF with your name, date, and optional details. Useful when you want readers to clearly see the document is signed.", + "bullet1": "Shows signer name and date on the document", + "bullet2": "Can include reason and location for signing", + "bullet3": "Choose which page to place the signature", + "bullet4": "Optional logo can be included" + } + }, + "invisible": "Invisible", + "options": { + "title": "Signature Details" + }, + "visible": "Visible" + }, + "sign": { + "submit": "Sign PDF", + "results": "Signed PDF" + }, + "error": { + "failed": "An error occurred whilst processing signatures." + }, + "tooltip": { + "header": { + "title": "About Managing Signatures" + }, + "overview": { + "title": "What can this tool do?", + "text": "This tool lets you check if your PDFs are digitally signed and add new digital signatures. Digital signatures prove who created or approved a document and show if it has been changed since signing.", + "bullet1": "Check existing signatures and their validity", + "bullet2": "View detailed information about signers and certificates", + "bullet3": "Add new digital signatures to secure your documents", + "bullet4": "Multiple files supported with easy navigation" + }, + "validation": { + "title": "Checking Signatures", + "text": "When you check signatures, the tool tells you if they're valid, who signed the document, when it was signed, and whether the document has been changed since signing.", + "bullet1": "Shows if signatures are valid or invalid", + "bullet2": "Displays signer information and signing date", + "bullet3": "Checks if the document was modified after signing", + "bullet4": "Can use custom certificates for verification" + }, + "signing": { + "title": "Adding Signatures", + "text": "To sign a PDF, you need a digital certificate (like PEM, PKCS12, or JKS). You can choose to make the signature visible on the document or keep it invisible for security only.", + "bullet1": "Supports PEM, PKCS12, JKS, and server certificate formats", + "bullet2": "Option to show or hide signature on the PDF", + "bullet3": "Add reason, location, and signer name", + "bullet4": "Choose which page to place visible signatures", + "bullet5": "Use server certificate for simple 'Sign with Stirling-PDF' option" + } + }, + "certType": { + "tooltip": { + "header": { + "title": "About Certificate Types" + }, + "what": { + "title": "What's a certificate?", + "text": "It's a secure ID for your signature that proves you signed. Unless you're required to sign via certificate, we recommend using another secure method like Type, Draw, or Upload." + }, + "which": { + "title": "Which option should I use?", + "text": "Choose the format that matches your certificate file:", + "bullet1": "PKCS#12 (.p12 / .pfx) – one combined file (most common)", + "bullet2": "PFX (.pfx) – Microsoft's version of PKCS12", + "bullet3": "PEM – separate private-key and certificate .pem files", + "bullet4": "JKS – Java .jks keystore for dev / CI-CD workflows" + }, + "convert": { + "title": "Key not listed?", + "text": "Convert your file to a Java keystore (.jks) with keytool, then pick JKS." + } + } + }, + "chooseCertificate": "Choose Certificate File", + "chooseJksFile": "Choose JKS File", + "chooseP12File": "Choose PKCS12 File", + "choosePfxFile": "Choose PFX File", + "choosePrivateKey": "Choose Private Key File", + "location": "Umístění", + "logoTitle": "Logo", + "name": "JmÊno", + "noLogo": "No Logo", + "pageNumber": "Page Number", + "password": "Zadejte heslo k vaÅĄemu ÃēloÅžiÅĄti klíčů nebo privÃĄtnímu klíči (pokud existuje):", + "passwordOptional": "Leave empty if no password", + "reason": "Důvod", + "serverCertMessage": "Using server certificate - no files or password required", + "showLogo": "Zobrazit logo", "header": "Podepsat PDF certifikÃĄtem (PrÃĄce probíhÃĄ)", "selectPDF": "Vyberte PDF soubor k podepsÃĄní:", "jksNote": "PoznÃĄmka: Pokud typ vaÅĄeho certifikÃĄtu není uveden níŞe, převeďte jej prosím na Java Keystore (.jks) soubor pomocí nÃĄstroje keytool příkazovÊ Å™ÃĄdky. PotÊ vyberte moÅžnost .jks níŞe.", @@ -1086,13 +2484,7 @@ "selectCert": "Vyberte soubor s vaÅĄÃ­m certifikÃĄtem (formÃĄt X.509, můŞe bÃŊt .pem nebo .der):", "selectP12": "Vyberte soubor s vaÅĄÃ­m PKCS#12 ÃēloÅžiÅĄtěm klíčů (.p12 nebo .pfx) (VolitelnÊ, pokud je uvedeno, mělo by obsahovat vÃĄÅĄ privÃĄtní klíč a certifikÃĄt):", "selectJKS": "Vyberte soubor s vaÅĄÃ­m Java ÃēloÅžiÅĄtěm klíčů (.jks nebo .keystore):", - "certType": "Typ certifikÃĄtu", - "password": "Zadejte heslo k vaÅĄemu ÃēloÅžiÅĄti klíčů nebo privÃĄtnímu klíči (pokud existuje):", "showSig": "Zobrazit podpis", - "reason": "Důvod", - "location": "Umístění", - "name": "JmÊno", - "showLogo": "Zobrazit logo", "submit": "Podepsat PDF" }, "removeCertSign": { @@ -1100,7 +2492,18 @@ "title": "Odstranit podpis certifikÃĄtu", "header": "Odstranit digitÃĄlní certifikÃĄt z PDF", "selectPDF": "Vyberte PDF soubor:", - "submit": "Odstranit podpis" + "submit": "Odstranit podpis", + "description": "This tool will remove digital certificate signatures from your PDF document.", + "filenamePrefix": "unsigned", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst removing certificate signatures." + }, + "results": { + "title": "Certificate Removal Results" + } }, "pageLayout": { "tags": "sloučit,kompozitní,jedno-zobrazení,uspoÅ™ÃĄdat", @@ -1108,16 +2511,157 @@ "header": "RozvrÅžení více strÃĄnek", "pagesPerSheet": "StrÃĄnek na list:", "addBorder": "Přidat okraje", - "submit": "Odeslat" + "submit": "Odeslat", + "desc": { + "2": "Place 2 pages side-by-side on a single sheet.", + "3": "Place 3 pages on a single sheet in a single row.", + "4": "Place 4 pages on a single sheet (2 × 2 grid).", + "9": "Place 9 pages on a single sheet (3 × 3 grid).", + "16": "Place 16 pages on a single sheet (4 × 4 grid)." + }, + "error": { + "failed": "An error occurred while creating the multi-page layout." + } + }, + "bookletImposition": { + "tags": "booklet,imposition,printing,binding,folding,signature", + "title": "Booklet Imposition", + "header": "Booklet Imposition", + "submit": "Create Booklet", + "spineLocation": { + "label": "Spine Location", + "left": "Left (Standard)", + "right": "Right (RTL)" + }, + "doubleSided": { + "label": "Double-sided printing", + "tooltip": "Creates both front and back sides for proper booklet printing" + }, + "manualDuplex": { + "title": "Manual Duplex Mode", + "instructions": "For printers without automatic duplex. You'll need to run this twice:" + }, + "duplexPass": { + "label": "Print Pass", + "first": "1st Pass", + "second": "2nd Pass", + "firstInstructions": "Prints front sides → stack face-down → run again with 2nd Pass", + "secondInstructions": "Load printed stack face-down → prints back sides" + }, + "rtlBinding": { + "label": "Right-to-left binding", + "tooltip": "For Arabic, Hebrew, or other right-to-left languages" + }, + "addBorder": { + "label": "Add borders around pages", + "tooltip": "Adds borders around each page section to help with cutting and alignment" + }, + "addGutter": { + "label": "Add gutter margin", + "tooltip": "Adds inner margin space for binding" + }, + "gutterSize": { + "label": "Gutter size (points)" + }, + "flipOnShortEdge": { + "label": "Flip on short edge (automatic duplex only)", + "tooltip": "Enable for short-edge duplex printing (automatic duplex only - ignored in manual mode)", + "manualNote": "Not needed in manual mode - you flip the stack yourself" + }, + "advanced": { + "toggle": "Advanced Options" + }, + "paperSizeNote": "Paper size is automatically derived from your first page.", + "tooltip": { + "header": { + "title": "Booklet Creation Guide" + }, + "description": { + "title": "What is Booklet Imposition?", + "text": "Creates professional booklets by arranging pages in the correct printing order. Your PDF pages are placed 2-up on landscape sheets so when folded and bound, they read in proper sequence like a real book." + }, + "example": { + "title": "Example: 8-Page Booklet", + "text": "Your 8-page document becomes 2 sheets:", + "bullet1": "Sheet 1 Front: Pages 8, 1 | Back: Pages 2, 7", + "bullet2": "Sheet 2 Front: Pages 6, 3 | Back: Pages 4, 5", + "bullet3": "When folded & stacked: Reads 1→2→3→4→5→6→7→8" + }, + "printing": { + "title": "How to Print & Assemble", + "text": "Follow these steps for perfect booklets:", + "bullet1": "Print double-sided with 'Flip on long edge'", + "bullet2": "Stack sheets in order, fold in half", + "bullet3": "Staple or bind along the folded spine", + "bullet4": "For short-edge printers: Enable 'Flip on short edge' option" + }, + "manualDuplex": { + "title": "Manual Duplex (Single-sided Printers)", + "text": "For printers without automatic duplex:", + "bullet1": "Turn OFF 'Double-sided printing'", + "bullet2": "Select '1st Pass' → Print → Stack face-down", + "bullet3": "Select '2nd Pass' → Load stack → Print backs", + "bullet4": "Fold and assemble as normal" + }, + "advanced": { + "title": "Advanced Options", + "text": "Fine-tune your booklet:", + "bullet1": "Right-to-Left Binding: For Arabic, Hebrew, or RTL languages", + "bullet2": "Borders: Shows cut lines for trimming", + "bullet3": "Gutter Margin: Adds space for binding/stapling", + "bullet4": "Short-edge Flip: Only for automatic duplex printers" + } + }, + "error": { + "failed": "An error occurred while creating the booklet imposition." + } }, "scalePages": { - "tags": "změnit velikost,upravit,rozměr,přizpůsobit", "title": "Upravit měřítko strÃĄnky", "header": "Upravit měřítko strÃĄnky", "pageSize": "Velikost strÃĄnky dokumentu.", "keepPageSize": "Původní velikost", "scaleFactor": "Úroveň přiblíŞení (oříznutí) strÃĄnky.", - "submit": "Odeslat" + "submit": "Odeslat", + "tags": "změnit velikost,upravit,rozměr,přizpůsobit" + }, + "adjustPageScale": { + "tags": "resize,modify,dimension,adapt", + "title": "Adjust Page Scale", + "header": "Adjust Page Scale", + "scaleFactor": { + "label": "Scale Factor" + }, + "pageSize": { + "label": "Target Page Size", + "keep": "Keep Original Size", + "letter": "Letter", + "legal": "Legal" + }, + "submit": "Adjust Page Scale", + "error": { + "failed": "An error occurred while adjusting the page scale." + }, + "tooltip": { + "header": { + "title": "Page Scale Settings Overview" + }, + "description": { + "title": "Description", + "text": "Adjust the size of PDF content and change the page dimensions." + }, + "scaleFactor": { + "title": "Scale Factor", + "text": "Controls how large or small the content appears on the page. Content is scaled and centred - if scaled content is larger than the page size, it may be cropped.", + "bullet1": "1.0 = Original size", + "bullet2": "0.5 = Half size (50% smaller)", + "bullet3": "2.0 = Double size (200% larger, may crop)" + }, + "pageSize": { + "title": "Target Page Size", + "text": "Sets the dimensions of the output PDF pages. 'Keep Original Size' maintains current dimensions, whilst other options resize to standard paper sizes." + } + } }, "add-page-numbers": { "tags": "číslovÃĄní,popisek,uspoÅ™ÃĄdat,rejstřík" @@ -1126,16 +2670,83 @@ "tags": "auto-detekce,podle-hlavičky,uspoÅ™ÃĄdat,přejmenovat", "title": "AutomatickÊ přejmenovÃĄní", "header": "AutomatickÊ přejmenovÃĄní PDF", - "submit": "Automaticky přejmenovat" + "description": "Automatically finds the title from your PDF content and uses it as the filename.", + "submit": "Automaticky přejmenovat", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst auto-renaming the PDF." + }, + "results": { + "title": "Auto-Rename Results" + }, + "tooltip": { + "header": { + "title": "How Auto-Rename Works" + }, + "howItWorks": { + "title": "Smart Renaming", + "text": "Automatically finds the title from your PDF content and uses it as the filename.", + "bullet1": "Looks for text that appears to be a title or heading", + "bullet2": "Creates a clean, valid filename from the detected title", + "bullet3": "Keeps the original name if no suitable title is found" + } + } }, "adjust-contrast": { "tags": "korekce-barev,ladit,upravit,vylepÅĄit" }, "crop": { - "tags": "oříznout,zmenÅĄit,upravit,tvar", "title": "Oříznout", "header": "Oříznout PDF", - "submit": "Odeslat" + "submit": "Odeslat", + "noFileSelected": "Select a PDF file to begin cropping", + "preview": { + "title": "Crop Area Selection" + }, + "reset": "Reset to full PDF", + "coordinates": { + "title": "Position and Size", + "x": { + "label": "X Position", + "desc": "Left edge (points)" + }, + "y": { + "label": "Y Position", + "desc": "Bottom edge (points)" + }, + "width": { + "label": "Width", + "desc": "Crop width (points)" + }, + "height": { + "label": "Height", + "desc": "Crop height (points)" + } + }, + "error": { + "invalidArea": "Crop area extends beyond PDF boundaries", + "failed": "Failed to crop PDF" + }, + "steps": { + "selectArea": "Select Crop Area" + }, + "tooltip": { + "title": "How to Crop PDFs", + "description": "Select the area to crop from your PDF by dragging and resizing the blue overlay on the thumbnail.", + "drag": "Drag the overlay to move the crop area", + "resize": "Drag the corner and edge handles to resize", + "precision": "Use coordinate inputs for precise positioning" + }, + "results": { + "title": "Crop Results" + }, + "automation": { + "info": "Enter crop coordinates in PDF points. Origin (0,0) is at bottom-left. These values will be applied to all PDFs processed in this automation.", + "reference": "Reference: A4 page is 595.28 × 841.89 points (210mm × 297mm). 1 inch = 72 points." + }, + "tags": "oříznout,zmenÅĄit,upravit,tvar" }, "autoSplitPDF": { "tags": "QR-kÃŗd,oddělit,sken-segment,uspoÅ™ÃĄdat", @@ -1218,24 +2829,124 @@ "downloadJS": "StÃĄhnout Javascript", "submit": "Zobrazit" }, - "autoRedact": { - "tags": "Začernit,SkrÃŊt,začernit,černÃĄ,značka,skrytÃŊ", - "title": "AutomatickÊ začernění", - "header": "AutomatickÊ začernění", - "colorLabel": "Barva", - "textsToRedactLabel": "Text k začernění (oddělenÃŊ Å™ÃĄdky)", - "textsToRedactPlaceholder": "např. \\nDůvěrnÊ \\nPřísně tajnÊ", - "useRegexLabel": "PouŞít regulÃĄrní vÃŊraz", - "wholeWordSearchLabel": "Hledat celÃĄ slova", - "customPaddingLabel": "Vlastní dodatečnÊ odsazení", - "convertPDFToImageLabel": "PřevÊst PDF na PDF-obrÃĄzek (PouŞívÃĄ se k odstranění textu za rÃĄmečkem)", - "submitButton": "Odeslat" - }, "redact": { "tags": "Začernit,SkrÃŊt,začernit,černÃĄ,značka,skrytÃŊ,ruční", "title": "Ruční začernění", - "header": "Ruční začernění", "submit": "Začernit", + "error": { + "failed": "An error occurred while redacting the PDF." + }, + "modeSelector": { + "title": "Redaction Method", + "mode": "Mode", + "automatic": "Automatic", + "automaticDesc": "Redact text based on search terms", + "manual": "Manual", + "manualDesc": "Click and drag to redact specific areas", + "manualComingSoon": "Manual redaction coming soon" + }, + "auto": { + "header": "Auto Redact", + "settings": { + "title": "Redaction Settings", + "advancedTitle": "PokročilÊ" + }, + "colorLabel": "Box Colour", + "wordsToRedact": { + "title": "Words to Redact", + "placeholder": "Enter a word", + "add": "Přidat", + "examples": "Examples: Confidential, Top-Secret" + }, + "useRegexLabel": "Use Regex", + "wholeWordSearchLabel": "Whole Word Search", + "customPaddingLabel": "Custom Extra Padding", + "convertPDFToImageLabel": "Convert PDF to PDF-Image" + }, + "tooltip": { + "mode": { + "header": { + "title": "Redaction Method" + }, + "automatic": { + "title": "Automatic Redaction", + "text": "Automatically finds and redacts specified text throughout the document. Perfect for removing consistent sensitive information like names, addresses, or confidential markers." + }, + "manual": { + "title": "Manual Redaction", + "text": "Click and drag to manually select specific areas to redact. Gives you precise control over what gets redacted. (Coming soon)" + } + }, + "words": { + "header": { + "title": "Words to Redact" + }, + "description": { + "title": "Text Matching", + "text": "Enter words or phrases to find and redact in your document. Each word will be searched for separately." + }, + "bullet1": "Add one word at a time", + "bullet2": "Press Enter or click 'Add Another' to add", + "bullet3": "Click × to remove words", + "examples": { + "title": "Common Examples", + "text": "Typical words to redact include: bank details, email addresses, or specific names." + } + }, + "advanced": { + "header": { + "title": "Advanced Redaction Settings" + }, + "color": { + "title": "Box Colour & Padding", + "text": "Customise the appearance of redaction boxes. Black is standard, but you can choose any colour. Padding adds extra space around the found text." + }, + "regex": { + "title": "Use Regex", + "text": "Enable regular expressions for advanced pattern matching. Useful for finding phone numbers, emails, or complex patterns.", + "bullet1": "Example: \\d{4}-\\d{2}-\\d{2} to match any dates in YYYY-MM-DD format", + "bullet2": "Use with caution - test thoroughly" + }, + "wholeWord": { + "title": "Whole Word Search", + "text": "Only match complete words, not partial matches. 'John' won't match 'Johnson' when enabled." + }, + "convert": { + "title": "Convert to PDF-Image", + "text": "Converts the PDF to an image-based PDF after redaction. This ensures text behind redaction boxes is completely removed and unrecoverable." + } + } + }, + "manual": { + "header": "Manual Redaction", + "textBasedRedaction": "Text-based Redaction", + "pageBasedRedaction": "Page-based Redaction", + "convertPDFToImageLabel": "Convert PDF to PDF-Image (Used to remove text behind the box)", + "pageRedactionNumbers": { + "title": "StrÃĄnky", + "placeholder": "(např. 1,2,8 nebo 4,7,12-16 nebo 2n-1)" + }, + "redactionColor": { + "title": "Redaction Colour" + }, + "export": "Exportovat", + "upload": "Upload", + "boxRedaction": "Box draw redaction", + "zoom": "Zoom", + "zoomIn": "Zoom in", + "zoomOut": "Zoom out", + "nextPage": "Next Page", + "previousPage": "Previous Page", + "toggleSidebar": "Toggle Sidebar", + "showThumbnails": "Show Thumbnails", + "showDocumentOutline": "Show Document Outline (double-click to expand/collapse all items)", + "showAttachments": "Show Attachments", + "showLayers": "Show Layers (double-click to reset all layers to the default state)", + "colourPicker": "Colour Picker", + "findCurrentOutlineItem": "Find current outline item", + "applyChanges": "Apply Changes" + }, + "header": "Ruční začernění", "textBasedRedaction": "Začernění zaloÅženÊ na textu", "pageBasedRedaction": "Začernění zaloÅženÊ na strÃĄnkÃĄch", "convertPDFToImageLabel": "PřevÊst PDF na PDF-obrÃĄzek (PouŞívÃĄ se k odstranění textu za rÃĄmečkem)", @@ -1261,22 +2972,7 @@ "showLayers": "Zobrazit vrstvy (dvojklik pro obnovení vÅĄech vrstev do vÃŊchozího stavu)", "colourPicker": "VÃŊběr barvy", "findCurrentOutlineItem": "Najít aktuÃĄlní poloÅžku osnovy", - "applyChanges": "Apply Changes", - "auto": { - "settings": { - "advancedTitle": "PokročilÊ" - }, - "wordsToRedact": { - "add": "Přidat" - } - }, - "manual": { - "pageRedactionNumbers": { - "title": "StrÃĄnky", - "placeholder": "(např. 1,2,8 nebo 4,7,12-16 nebo 2n-1)" - }, - "export": "Exportovat" - } + "applyChanges": "Apply Changes" }, "tableExtraxt": { "tags": "CSV,Extrakce tabulek,extrahovat,převÊst" @@ -1287,11 +2983,15 @@ "overlay-pdfs": { "tags": "PřekrÃŊt", "header": "PřekrÃŊt PDF soubory", + "title": "Overlay PDFs", + "desc": "Overlay one PDF on top of another", "baseFile": { "label": "Vyberte zÃĄkladní PDF soubor" }, "overlayFiles": { - "label": "Vyberte PDF soubory pro překrytí" + "label": "Vyberte PDF soubory pro překrytí", + "placeholder": "Choose PDF(s)...", + "addMore": "Add more PDFs..." }, "mode": { "label": "Vyberte reÅžim překrytí", @@ -1301,14 +3001,53 @@ }, "counts": { "label": "Počty překrytí (pro reÅžim pevnÊho opakovÃĄní)", - "placeholder": "Zadejte počty oddělenÊ ÄÃĄrkami (např. 2,3,1)" + "placeholder": "Zadejte počty oddělenÊ ÄÃĄrkami (např. 2,3,1)", + "item": "Count for file", + "noFiles": "Add overlay files to configure counts" }, "position": { "label": "Vyberte pozici překrytí", "foreground": "Popředí", "background": "Pozadí" }, - "submit": "Odeslat" + "submit": "Odeslat", + "settings": { + "title": "Settings" + }, + "results": { + "title": "Overlay Results" + }, + "tooltip": { + "header": { + "title": "Overlay PDFs Overview" + }, + "description": { + "title": "Description", + "text": "Combine a base PDF with one or more overlay PDFs. Overlays can be applied page-by-page in different modes and placed in the foreground or background." + }, + "mode": { + "title": "Overlay Mode", + "text": "Choose how to distribute overlay pages across the base PDF pages.", + "sequential": "Sequential Overlay: Use pages from the first overlay PDF until it ends, then move to the next.", + "interleaved": "Interleaved Overlay: Take one page from each overlay in turn.", + "fixedRepeat": "Fixed Repeat Overlay: Take a set number of pages from each overlay before moving to the next. Use Counts to set the numbers." + }, + "position": { + "title": "Overlay Position", + "text": "Foreground places the overlay on top of the page. Background places it behind." + }, + "overlayFiles": { + "title": "Overlay Files", + "text": "Select one or more PDFs to overlay on the base. The order of these files affects how pages are applied in Sequential and Fixed Repeat modes." + }, + "counts": { + "title": "Counts (Fixed Repeat only)", + "text": "Provide a positive number for each overlay file showing how many pages to take before moving to the next. Required when mode is Fixed Repeat." + } + }, + "error": { + "failed": "An error occurred while overlaying PDFs." + } }, "split-by-sections": { "tags": "Sekční dělení,Rozdělit,Přizpůsobit", @@ -1329,6 +3068,7 @@ "tags": "Razítko,Přidat obrÃĄzek,centrovat obrÃĄzek,Vodoznak,PDF,VloÅžit,Přizpůsobit", "header": "Razítko PDF", "title": "Razítko PDF", + "stampSetup": "Stamp Setup", "stampType": "Typ razítka", "stampText": "Text razítka", "stampImage": "ObrÃĄzek razítka", @@ -1341,7 +3081,19 @@ "overrideY": "Přepsat souřadnici Y", "customMargin": "Vlastní okraj", "customColor": "Vlastní barva textu", - "submit": "Odeslat" + "submit": "Odeslat", + "noStampSelected": "No stamp selected. Return to Step 1.", + "customPosition": "Drag the stamp to the desired location in the preview window.", + "error": { + "failed": "An error occurred while adding stamp to the PDF." + }, + "imageSize": "Image Size", + "margin": "Margin", + "positionAndFormatting": "Position & Formatting", + "quickPosition": "Select a position on the page to place the stamp.", + "results": { + "title": "Stamp Results" + } }, "removeImagePdf": { "tags": "Odstranit obrÃĄzek,Operace strÃĄnek,zadní strana,serverovÃĄ strana" @@ -1359,7 +3111,8 @@ "status": { "_value": "Stav", "valid": "PlatnÃŊ", - "invalid": "NeplatnÃŊ" + "invalid": "NeplatnÃŊ", + "complete": "Validation complete" }, "signer": "Podepisující", "date": "Datum", @@ -1386,40 +3139,122 @@ "version": "Verze", "keyUsage": "PouÅžití klíče", "selfSigned": "PodepsanÃŊ sÃĄm sebou", - "bits": "bitů" + "bits": "bitů", + "details": "Certificate Details" }, "signature": { "info": "Informace o podpisu", "_value": "Podpis", "mathValid": "Podpis je matematicky platnÃŊ, ALE:" }, - "selectCustomCert": "Vlastní certifikÃĄt X.509 (VolitelnÊ)" - }, - "replace-color": { - "title": "Nahradit a invertovat barvy", - "header": "Nahradit a invertovat barvy v PDF", - "selectText": { - "1": "MoÅžnosti nahrazení nebo inverze barev", - "2": "VÃŊchozí (přednastavenÊ kontrastní barvy)", - "3": "Vlastní (uÅživatelsky definovanÊ barvy)", - "4": "ÚplnÃĄ inverze (invertovat vÅĄechny barvy)", - "5": "MoÅžnosti vysokÊho kontrastu", - "6": "BílÃŊ text na černÊm pozadí", - "7": "ČernÃŊ text na bílÊm pozadí", - "8": "ÅŊlutÃŊ text na černÊm pozadí", - "9": "ZelenÃŊ text na černÊm pozadí", - "10": "Vybrat barvu textu", - "11": "Vybrat barvu pozadí" + "selectCustomCert": "Vlastní certifikÃĄt X.509 (VolitelnÊ)", + "downloadCsv": "Download CSV", + "downloadJson": "Download JSON", + "downloadPdf": "Download PDF Report", + "downloadType": { + "csv": "CSV", + "json": "JSON", + "pdf": "PDF" }, - "submit": "Nahradit" + "error": { + "allFailed": "Unable to validate the selected files.", + "partial": "Some files could not be validated.", + "reportGeneration": "Could not generate the PDF report. JSON and CSV are available.", + "unexpected": "Unexpected error during validation." + }, + "finalizing": "Preparing downloads...", + "issue": { + "certExpired": "Certificate expired", + "certRevocationUnknown": "Certificate revocation status unknown", + "certRevoked": "Certificate revoked", + "chainInvalid": "Certificate chain invalid", + "signatureInvalid": "Signature cryptographic check failed", + "trustInvalid": "Certificate not trusted" + }, + "noResults": "Run the validation to generate a report.", + "noSignaturesShort": "No signatures", + "processing": "Validating signatures...", + "report": { + "continued": "Continued", + "downloads": "Downloads", + "entryLabel": "Signature Summary", + "fields": { + "created": "Created", + "fileSize": "File Size", + "signatureCount": "Total Signatures", + "signatureDate": "Signature Date" + }, + "filesEvaluated": "{{count}} files evaluated", + "footer": "Validated via Stirling PDF", + "generatedAt": "Generated", + "noPdf": "PDF report will be available after a successful validation.", + "page": "Page", + "shortTitle": "Signature Summary", + "signatureCountLabel": "{{count}} signatures", + "signaturesFound": "{{count}} signatures detected", + "signaturesValid": "{{count}} fully valid", + "title": "Signature Validation Report" + }, + "settings": { + "certHint": "Upload a trusted X.509 certificate to validate against a custom trust source.", + "title": "Validation Settings" + }, + "signatureDate": "Signature Date", + "totalSignatures": "Total Signatures" }, - "replaceColorPdf": { - "tags": "nahrazení barev,Ãēprava strÃĄnek,zpracovÃĄní,serverovÃĄ ÄÃĄst" + "replaceColor": { + "tags": "Replace Colour,Page operations,Back end,server side", + "labels": { + "settings": "Settings", + "colourOperation": "Colour operation" + }, + "options": { + "highContrast": "High contrast", + "invertAll": "Invert all colours", + "custom": "Custom", + "cmyk": "Convert to CMYK" + }, + "tooltip": { + "header": { + "title": "Replace & Invert Colour Settings Overview" + }, + "description": { + "title": "Description", + "text": "Transform PDF colours to improve readability and accessibility. Choose from high contrast presets, invert all colours, or create custom colour schemes." + }, + "highContrast": { + "title": "High Contrast", + "text": "Apply predefined high contrast colour combinations designed for better readability and accessibility compliance.", + "bullet1": "White text on black background - Classic dark mode", + "bullet2": "Black text on white background - Standard high contrast", + "bullet3": "Yellow text on black background - High visibility option", + "bullet4": "Green text on black background - Alternative high contrast" + }, + "invertAll": { + "title": "Invert All Colours", + "text": "Completely invert all colours in the PDF, creating a negative-like effect. Useful for creating dark mode versions of documents or reducing eye strain in low-light conditions." + }, + "custom": { + "title": "Custom Colours", + "text": "Define your own text and background colours using the colour pickers. Perfect for creating branded documents or specific accessibility requirements.", + "bullet1": "Text colour - Choose the colour for text elements", + "bullet2": "Background colour - Set the background colour for the document" + }, + "cmyk": { + "title": "Convert to CMYK", + "text": "Convert the PDF from RGB colour space to CMYK colour space, optimized for professional printing. This process converts colours to the Cyan, Magenta, Yellow, Black model used by printers." + } + }, + "error": { + "failed": "An error occurred while processing the colour replacement." + } }, "login": { "title": "PřihlÃĄÅĄení", "header": "PřihlÃĄÅĄení", "signin": "PřihlÃĄsit se", + "signInWith": "Sign in with", + "signInAnonymously": "Sign Up as a Guest", "rememberme": "Zapamatovat si mě", "invalid": "NeplatnÊ uÅživatelskÊ jmÊno nebo heslo.", "locked": "VÃĄÅĄ Ãēčet byl uzamčen.", @@ -1438,12 +3273,83 @@ "alreadyLoggedIn": "JiÅž jste přihlÃĄÅĄeni na", "alreadyLoggedIn2": "zařízeních. Odhlaste se prosím z těchto zařízení a zkuste to znovu.", "toManySessions": "MÃĄte příliÅĄ mnoho aktivních relací", - "logoutMessage": "You have been logged out." + "logoutMessage": "You have been logged out.", + "youAreLoggedIn": "You are logged in!", + "email": "Email", + "password": "Password", + "enterEmail": "Enter your email", + "enterPassword": "Enter your password", + "loggingIn": "Logging In...", + "username": "Username", + "enterUsername": "Enter username", + "useEmailInstead": "Login with email", + "forgotPassword": "Forgot your password?", + "logIn": "Log In", + "signingIn": "Signing in...", + "login": "Login", + "or": "Or", + "useMagicLink": "Use magic link instead", + "enterEmailForMagicLink": "Enter your email for magic link", + "sending": "Sendingâ€Ļ", + "sendMagicLink": "Send Magic Link", + "cancel": "Cancel", + "dontHaveAccount": "Don't have an account? Sign up", + "home": "Home", + "debug": "Debug", + "signOut": "Sign Out", + "pleaseEnterBoth": "Please enter both email and password", + "pleaseEnterEmail": "Please enter your email address", + "magicLinkSent": "Magic link sent to {{email}}! Check your email and click the link to sign in.", + "passwordResetSent": "Password reset link sent to {{email}}! Check your email and follow the instructions.", + "failedToSignIn": "Failed to sign in with {{provider}}: {{message}}", + "unexpectedError": "Unexpected error: {{message}}", + "accountCreatedSuccess": "Account created successfully! You can now sign in.", + "passwordChangedSuccess": "Password changed successfully! Please sign in with your new password.", + "credentialsUpdated": "Your credentials have been updated. Please sign in again." + }, + "signup": { + "title": "Create an account", + "subtitle": "Join Stirling PDF to get started", + "name": "Name", + "email": "Email", + "password": "Password", + "confirmPassword": "Confirm password", + "enterName": "Enter your name", + "enterEmail": "Enter your email", + "enterPassword": "Enter your password", + "confirmPasswordPlaceholder": "Confirm password", + "or": "or", + "creatingAccount": "Creating Account...", + "signUp": "Sign Up", + "alreadyHaveAccount": "Already have an account? Sign in", + "pleaseFillAllFields": "Please fill in all fields", + "passwordsDoNotMatch": "Passwords do not match", + "passwordTooShort": "Password must be at least 6 characters long", + "invalidEmail": "Please enter a valid email address", + "checkEmailConfirmation": "Check your email for a confirmation link to complete your registration.", + "accountCreatedSuccessfully": "Account created successfully! You can now sign in.", + "unexpectedError": "Unexpected error: {{message}}", + "useEmailInstead": "Use Email Instead", + "nameRequired": "Name is required", + "emailRequired": "Email is required", + "passwordRequired": "Password is required", + "confirmPasswordRequired": "Please confirm your password" }, "pdfToSinglePage": { "title": "PDF na jednu strÃĄnku", "header": "PDF na jednu strÃĄnku", - "submit": "PřevÊst na jednu strÃĄnku" + "submit": "PřevÊst na jednu strÃĄnku", + "description": "This tool will merge all pages of your PDF into one large single page. The width will remain the same as the original pages, but the height will be the sum of all page heights.", + "filenamePrefix": "single_page", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst converting to single page." + }, + "results": { + "title": "Single Page Results" + } }, "pageExtracter": { "title": "Extrahovat strÃĄnky", @@ -1467,18 +3373,59 @@ "adjustContrast": { "title": "Upravit kontrast", "header": "Upravit kontrast", + "basic": "Basic Adjustments", "contrast": "Kontrast:", "brightness": "Jas:", "saturation": "Sytost:", - "download": "StÃĄhnout" + "download": "StÃĄhnout", + "adjustColors": "Adjust Colors", + "blue": "Blue", + "confirm": "Confirm", + "error": { + "failed": "Failed to adjust colors/contrast" + }, + "green": "Green", + "noPreview": "Select a PDF to preview", + "red": "Red", + "results": { + "title": "Adjusted PDF" + } }, "compress": { "title": "Komprimovat", + "desc": "Compress PDFs to reduce their file size.", "header": "Komprimovat PDF", + "method": { + "title": "Compression Method", + "quality": "Quality", + "filesize": "Velikost souboru" + }, "credit": "Tato sluÅžba pouŞívÃĄ qpdf pro kompresi/optimalizaci PDF.", "grayscale": { "label": "PouŞít stupnici ÅĄedi pro kompresi" }, + "tooltip": { + "header": { + "title": "Compress Settings Overview" + }, + "description": { + "title": "Description", + "text": "Compression is an easy way to reduce your file size. Pick File Size to enter a target size and have us adjust quality for you. Pick Quality to set compression strength manually." + }, + "qualityAdjustment": { + "title": "Quality Adjustment", + "text": "Drag the slider to adjust the compression strength. Lower values (1-3) preserve quality but result in larger files. Higher values (7-9) shrink the file more but reduce image clarity.", + "bullet1": "Lower values preserve quality", + "bullet2": "Higher values reduce file size" + }, + "grayscale": { + "title": "Grayscale", + "text": "Select this option to convert all images to black and white, which can significantly reduce file size especially for scanned PDFs or image-heavy documents." + } + }, + "error": { + "failed": "An error occurred while compressing the PDF." + }, "selectText": { "1": { "_value": "Compression Settings", @@ -1488,10 +3435,7 @@ "4": "AutomatickÃŊ reÅžim - Automaticky upravuje kvalitu pro dosaÅžení přesnÊ velikosti PDF", "5": "OčekÃĄvanÃĄ velikost PDF (např. 25MB, 10.8MB, 25KB)" }, - "submit": "Komprimovat", - "method": { - "filesize": "Velikost souboru" - } + "submit": "Komprimovat" }, "decrypt": { "passwordPrompt": "Tento soubor je chrÃĄněn heslem. Zadejte prosím heslo:", @@ -1592,7 +3536,13 @@ "title": "Odstranit obrÃĄzek", "header": "Odstranit obrÃĄzek", "removeImage": "Odstranit obrÃĄzek", - "submit": "Odstranit obrÃĄzek" + "submit": "Odstranit obrÃĄzek", + "error": { + "failed": "Failed to remove images from the PDF." + }, + "results": { + "title": "Remove Images Results" + } }, "splitByChapters": { "title": "Rozdělit PDF podle kapitol", @@ -1626,6 +3576,12 @@ }, "note": "PoznÃĄmky k vydÃĄní jsou dostupnÊ pouze v angličtině" }, + "swagger": { + "title": "API Documentation", + "header": "API Documentation", + "desc": "View and test the Stirling PDF API endpoints", + "tags": "api,documentation,swagger,endpoints,development" + }, "cookieBanner": { "popUp": { "title": "How we use Cookies", @@ -1661,53 +3617,943 @@ "title": "Analytics", "description": "These cookies help us understand how our tools are being used, so we can focus on building the features our community values most. Rest assured—Stirling PDF cannot and will never track the content of the documents you work with." } + }, + "services": { + "posthog": "PostHog Analytics", + "scarf": "Scarf Pixel" } }, - "download": "StÃĄhnout", - "convert": { - "title": "PřevÊst", - "settings": "Nastavení", - "color": "Barva", - "greyscale": "Stupně ÅĄedi", - "fillPage": "Vyplnit strÃĄnku", - "pdfaDigitalSignatureWarning": "PDF obsahuje digitÃĄlní podpis, kterÃŊ bude v dalÅĄÃ­m kroku odstraněn.", - "grayscale": "Stupně ÅĄedi" + "removeMetadata": { + "submit": "Remove Metadata" }, - "attachments": { - "tags": "embed,attach,file,attachment,attachments", - "title": "Add attachments", - "header": "Add attachments", - "submit": "Add attachments" + "sidebar": { + "toggle": "Toggle Sidebar" + }, + "theme": { + "toggle": "Toggle Theme" + }, + "view": { + "viewer": "Viewer", + "pageEditor": "Page Editor", + "fileManager": "File Manager" + }, + "pageEditor": { + "title": "Page Editor", + "save": "Save Changes", + "noPdfLoaded": "No PDF loaded. Please upload a PDF to edit.", + "rotatedLeft": "Rotated left:", + "rotatedRight": "Rotated right:", + "deleted": "Deleted:", + "movedLeft": "Moved left:", + "movedRight": "Moved right:", + "splitAt": "Split at:", + "insertedPageBreak": "Inserted page break at:", + "addFileNotImplemented": "Add file not implemented in demo", + "closePdf": "Close PDF", + "reset": "Reset Changes", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "fitToWidth": "Fit to Width", + "actualSize": "Actual Size" + }, + "viewer": { + "firstPage": "First Page", + "lastPage": "Last Page", + "previousPage": "Previous Page", + "nextPage": "Next Page", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "singlePageView": "Single Page View", + "dualPageView": "Dual Page View" }, "rightRail": { + "closeSelected": "Close Selected Files", "selectAll": "Vybrat vÅĄe", - "deselectAll": "ZruÅĄit vÃŊběr vÅĄeho" + "deselectAll": "ZruÅĄit vÃŊběr vÅĄeho", + "selectByNumber": "Select by Page Numbers", + "deleteSelected": "Delete Selected Pages", + "closePdf": "Close PDF", + "exportAll": "Export PDF", + "downloadSelected": "Download Selected Files", + "downloadAll": "Download All", + "toggleTheme": "Toggle Theme", + "language": "Language", + "search": "Search PDF", + "panMode": "Pan Mode", + "rotateLeft": "Rotate Left", + "rotateRight": "Rotate Right", + "toggleSidebar": "Toggle Sidebar", + "exportSelected": "Export Selected Pages", + "toggleAnnotations": "Toggle Annotations Visibility", + "annotationMode": "Toggle Annotation Mode", + "draw": "Draw", + "save": "Save" + }, + "search": { + "title": "Search PDF", + "placeholder": "Enter search term...", + "noResults": "No results found", + "searching": "Searching..." + }, + "guestBanner": { + "title": "You're using Stirling PDF as a guest!", + "message": "Create a free account to save your work, access more features, and support the project.", + "dismiss": "Dismiss banner", + "signUp": "Sign Up Free" + }, + "toolPicker": { + "searchPlaceholder": "Search tools...", + "noToolsFound": "No tools found", + "allTools": "ALL TOOLS", + "quickAccess": "QUICK ACCESS", + "categories": { + "standardTools": "Standard Tools", + "advancedTools": "Advanced Tools", + "recommendedTools": "Recommended Tools" + }, + "subcategories": { + "signing": "Signing", + "documentSecurity": "Document Security", + "verification": "Verification", + "documentReview": "Document Review", + "pageFormatting": "Page Formatting", + "extraction": "Extraction", + "removal": "Removal", + "automation": "Automation", + "general": "General", + "advancedFormatting": "Advanced Formatting", + "developerTools": "Developer Tools" + } }, "quickAccess": { - "sign": "Podepsat" + "read": "Read", + "sign": "Podepsat", + "automate": "Automate", + "files": "Files", + "activity": "Activity", + "help": "Help", + "account": "Account", + "config": "Config", + "adminSettings": "Admin Settings", + "allTools": "All Tools" + }, + "admin": { + "error": "Error", + "success": "Success", + "expand": "Expand", + "close": "Close", + "status": { + "active": "Active", + "inactive": "Inactive" + }, + "settings": { + "title": "Admin Settings", + "workspace": "Workspace", + "fetchError": "Failed to load settings", + "saveError": "Failed to save settings", + "saved": "Settings saved successfully", + "saveSuccess": "Settings saved successfully", + "save": "Save Changes", + "restartRequired": "Restart Required", + "restart": { + "title": "Restart Required", + "message": "Settings have been saved successfully. A server restart is required for the changes to take effect.", + "question": "Would you like to restart the server now or later?", + "now": "Restart Now", + "later": "Restart Later" + }, + "restarting": "Restarting Server", + "restartingMessage": "The server is restarting. Please wait a moment...", + "restartError": "Failed to restart server. Please restart manually.", + "general": { + "title": "System Settings", + "description": "Configure system-wide application settings including branding and default behaviour.", + "ui": "User Interface", + "system": "System", + "appName": { + "label": "Application Name", + "description": "The name displayed in the browser tab and home page" + }, + "appNameNavbar": { + "label": "Navbar Brand", + "description": "The name displayed in the navigation bar" + }, + "homeDescription": { + "label": "Home Description", + "description": "The description text shown on the home page" + }, + "defaultLocale": { + "label": "Default Locale", + "description": "The default language for new users (e.g., en_US, es_ES)" + }, + "fileUploadLimit": { + "label": "File Upload Limit", + "description": "Maximum file upload size (e.g., 100MB, 1GB)" + }, + "showUpdate": { + "label": "Show Update Notifications", + "description": "Display notifications when a new version is available" + }, + "showUpdateOnlyAdmin": { + "label": "Show Updates to Admins Only", + "description": "Restrict update notifications to admin users only" + }, + "customHTMLFiles": { + "label": "Custom HTML Files", + "description": "Allow serving custom HTML files from the customFiles directory" + }, + "languages": { + "label": "Available Languages", + "description": "Languages that users can select from (leave empty to enable all languages)" + }, + "customMetadata": { + "label": "Custom Metadata", + "autoUpdate": { + "label": "Auto Update Metadata", + "description": "Automatically update PDF metadata on all processed documents" + }, + "author": { + "label": "Default Author", + "description": "Default author for PDF metadata (e.g., username)" + }, + "creator": { + "label": "Default Creator", + "description": "Default creator for PDF metadata" + }, + "producer": { + "label": "Default Producer", + "description": "Default producer for PDF metadata" + } + }, + "customPaths": { + "label": "Custom Paths", + "description": "Configure custom file system paths for pipeline processing and external tools", + "pipeline": { + "label": "Pipeline Directories", + "watchedFoldersDir": { + "label": "Watched Folders Directory", + "description": "Directory where pipeline monitors for incoming PDFs (leave empty for default: /pipeline/watchedFolders)" + }, + "finishedFoldersDir": { + "label": "Finished Folders Directory", + "description": "Directory where processed PDFs are outputted (leave empty for default: /pipeline/finishedFolders)" + } + }, + "operations": { + "label": "External Tool Paths", + "weasyprint": { + "label": "WeasyPrint Executable", + "description": "Path to WeasyPrint executable for HTML to PDF conversion (leave empty for default: /opt/venv/bin/weasyprint)" + }, + "unoconvert": { + "label": "Unoconvert Executable", + "description": "Path to LibreOffice unoconvert for document conversions (leave empty for default: /opt/venv/bin/unoconvert)" + } + } + } + }, + "security": { + "title": "Security", + "description": "Configure authentication, login behaviour, and security policies.", + "ssoNotice": { + "title": "Looking for SSO/SAML settings?", + "message": "OAuth2 and SAML2 authentication providers have been moved to the Connections menu for easier management." + }, + "authentication": "Authentication", + "enableLogin": { + "label": "Enable Login", + "description": "Require users to log in before accessing the application" + }, + "loginMethod": { + "label": "Login Method", + "description": "The authentication method to use for user login", + "all": "All Methods", + "normal": "Username/Password Only", + "oauth2": "OAuth2 Only", + "saml2": "SAML2 Only" + }, + "loginAttemptCount": { + "label": "Login Attempt Limit", + "description": "Maximum number of failed login attempts before account lockout" + }, + "loginResetTimeMinutes": { + "label": "Login Reset Time (minutes)", + "description": "Time before failed login attempts are reset" + }, + "csrfDisabled": { + "label": "Disable CSRF Protection", + "description": "Disable Cross-Site Request Forgery protection (not recommended)" + }, + "initialLogin": { + "label": "Initial Login", + "username": { + "label": "Initial Username", + "description": "The username for the initial admin account" + }, + "password": { + "label": "Initial Password", + "description": "The password for the initial admin account" + } + }, + "jwt": { + "label": "JWT Configuration", + "secureCookie": { + "label": "Secure Cookie", + "description": "Require HTTPS for JWT cookies (recommended for production)" + }, + "keyRetentionDays": { + "label": "Key Retention Days", + "description": "Number of days to retain old JWT keys for verification" + }, + "persistence": { + "label": "Enable Key Persistence", + "description": "Store JWT keys persistently to survive server restarts" + }, + "enableKeyRotation": { + "label": "Enable Key Rotation", + "description": "Automatically rotate JWT signing keys periodically" + }, + "enableKeyCleanup": { + "label": "Enable Key Cleanup", + "description": "Automatically remove expired JWT keys" + } + }, + "audit": { + "label": "Audit Logging", + "enabled": { + "label": "Enable Audit Logging", + "description": "Track user actions and system events for compliance and security monitoring" + }, + "level": { + "label": "Audit Level", + "description": "0=OFF, 1=BASIC, 2=STANDARD, 3=VERBOSE" + }, + "retentionDays": { + "label": "Audit Retention (days)", + "description": "Number of days to retain audit logs" + } + }, + "htmlUrlSecurity": { + "label": "HTML URL Security", + "description": "Configure URL access restrictions for HTML processing to prevent SSRF attacks", + "enabled": { + "label": "Enable URL Security", + "description": "Enable URL security restrictions for HTML to PDF conversions" + }, + "level": { + "label": "Security Level", + "description": "MAX: whitelist only, MEDIUM: block internal networks, OFF: no restrictions", + "max": "Maximum (Whitelist Only)", + "medium": "Medium (Block Internal)", + "off": "Off (No Restrictions)" + }, + "advanced": "Advanced Settings", + "allowedDomains": { + "label": "Allowed Domains (Whitelist)", + "description": "One domain per line (e.g., cdn.example.com). Only these domains allowed when level is MAX" + }, + "blockedDomains": { + "label": "Blocked Domains (Blacklist)", + "description": "One domain per line (e.g., malicious.com). Additional domains to block" + }, + "internalTlds": { + "label": "Internal TLDs", + "description": "One TLD per line (e.g., .local, .internal). Block domains with these TLD patterns" + }, + "networkBlocking": "Network Blocking", + "blockPrivateNetworks": { + "label": "Block Private Networks", + "description": "Block RFC 1918 private networks (10.x.x.x, 192.168.x.x, 172.16-31.x.x)" + }, + "blockLocalhost": { + "label": "Block Localhost", + "description": "Block localhost and loopback addresses (127.x.x.x, ::1)" + }, + "blockLinkLocal": { + "label": "Block Link-Local Addresses", + "description": "Block link-local addresses (169.254.x.x, fe80::/10)" + }, + "blockCloudMetadata": { + "label": "Block Cloud Metadata Endpoints", + "description": "Block cloud provider metadata endpoints (169.254.169.254)" + } + } + }, + "connections": { + "title": "Connections", + "description": "Configure external authentication providers like OAuth2 and SAML.", + "linkedServices": "Linked Services", + "unlinkedServices": "Unlinked Services", + "connect": "Connect", + "disconnect": "Disconnect", + "disconnected": "Provider disconnected successfully", + "disconnectError": "Failed to disconnect provider", + "ssoAutoLogin": { + "label": "SSO Auto Login", + "enable": "Enable SSO Auto Login", + "description": "Automatically redirect to SSO login when authentication is required" + }, + "oauth2": { + "label": "OAuth2", + "enabled": { + "label": "Enable OAuth2", + "description": "Allow users to authenticate using OAuth2 providers" + }, + "provider": { + "label": "Provider", + "description": "The OAuth2 provider to use for authentication" + }, + "issuer": { + "label": "Issuer URL", + "description": "The OAuth2 provider issuer URL" + }, + "clientId": { + "label": "Client ID", + "description": "The OAuth2 client ID from your provider" + }, + "clientSecret": { + "label": "Client Secret", + "description": "The OAuth2 client secret from your provider" + }, + "useAsUsername": { + "label": "Use as Username", + "description": "The OAuth2 claim to use as the username (e.g., email, sub)" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first OAuth2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via OAuth2" + }, + "scopes": { + "label": "OAuth2 Scopes", + "description": "Comma-separated list of OAuth2 scopes to request (e.g., openid, profile, email)" + } + }, + "saml2": { + "label": "SAML2", + "enabled": { + "label": "Enable SAML2", + "description": "Allow users to authenticate using SAML2 providers" + }, + "provider": { + "label": "Provider", + "description": "The SAML2 provider name" + }, + "registrationId": { + "label": "Registration ID", + "description": "The SAML2 registration identifier" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first SAML2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via SAML2" + } + } + }, + "database": { + "title": "Database", + "description": "Configure custom database connection settings for enterprise deployments.", + "configuration": "Database Configuration", + "enableCustom": { + "label": "Enable Custom Database", + "description": "Use your own custom database configuration instead of the default embedded database" + }, + "customUrl": { + "label": "Custom Database URL", + "description": "Full JDBC connection string (e.g., jdbc:postgresql://localhost:5432/postgres). If provided, individual connection settings below are not used." + }, + "type": { + "label": "Database Type", + "description": "Type of database (not used if custom URL is provided)" + }, + "hostName": { + "label": "Host Name", + "description": "Database server hostname (not used if custom URL is provided)" + }, + "port": { + "label": "Port", + "description": "Database server port (not used if custom URL is provided)" + }, + "name": { + "label": "Database Name", + "description": "Name of the database (not used if custom URL is provided)" + }, + "username": { + "label": "Username", + "description": "Database authentication username" + }, + "password": { + "label": "Password", + "description": "Database authentication password" + } + }, + "privacy": { + "title": "Privacy", + "description": "Configure privacy and data collection settings.", + "analytics": "Analytics & Tracking", + "enableAnalytics": { + "label": "Enable Analytics", + "description": "Collect anonymous usage analytics to help improve the application" + }, + "metricsEnabled": { + "label": "Enable Metrics", + "description": "Enable collection of performance and usage metrics. Provides API endpoint for admins to access metrics data" + }, + "searchEngine": "Search Engine Visibility", + "googleVisibility": { + "label": "Google Visibility", + "description": "Allow search engines to index this application" + } + }, + "advanced": { + "title": "Advanced", + "description": "Configure advanced features and experimental functionality.", + "features": "Feature Flags", + "processing": "Processing", + "endpoints": { + "label": "Endpoints", + "manage": "Manage API Endpoints", + "description": "Endpoint management is configured via YAML. See documentation for details on enabling/disabling specific endpoints." + }, + "enableAlphaFunctionality": { + "label": "Enable Alpha Features", + "description": "Enable experimental and alpha-stage features (may be unstable)" + }, + "enableUrlToPDF": { + "label": "Enable URL to PDF", + "description": "Allow conversion of web pages to PDF documents" + }, + "maxDPI": { + "label": "Maximum DPI", + "description": "Maximum DPI for image processing (0 = unlimited)" + }, + "tessdataDir": { + "label": "Tessdata Directory", + "description": "Path to the tessdata directory for OCR language files" + }, + "disableSanitize": { + "label": "Disable HTML Sanitization", + "description": "WARNING: Security risk - disabling HTML sanitization can lead to XSS vulnerabilities" + }, + "tempFileManagement": { + "label": "Temp File Management", + "description": "Configure temporary file storage and cleanup behavior", + "baseTmpDir": { + "label": "Base Temp Directory", + "description": "Base directory for temporary files (leave empty for default: java.io.tmpdir/stirling-pdf)" + }, + "libreofficeDir": { + "label": "LibreOffice Temp Directory", + "description": "Directory for LibreOffice temp files (leave empty for default: baseTmpDir/libreoffice)" + }, + "systemTempDir": { + "label": "System Temp Directory", + "description": "System temp directory to clean (only used if cleanupSystemTemp is enabled)" + }, + "prefix": { + "label": "Temp File Prefix", + "description": "Prefix for temp file names" + }, + "maxAgeHours": { + "label": "Max Age (hours)", + "description": "Maximum age in hours before temp files are cleaned up" + }, + "cleanupIntervalMinutes": { + "label": "Cleanup Interval (minutes)", + "description": "How often to run cleanup (in minutes)" + }, + "startupCleanup": { + "label": "Startup Cleanup", + "description": "Clean up old temp files on application startup" + }, + "cleanupSystemTemp": { + "label": "Cleanup System Temp", + "description": "Whether to clean broader system temp directory (use with caution)" + } + }, + "processExecutor": { + "label": "Process Executor Limits", + "description": "Configure session limits and timeouts for each process executor", + "sessionLimit": { + "label": "Session Limit", + "description": "Maximum concurrent instances" + }, + "timeout": { + "label": "Timeout (minutes)", + "description": "Maximum execution time" + }, + "libreOffice": "LibreOffice", + "pdfToHtml": "PDF to HTML", + "qpdf": "QPDF", + "tesseract": "Tesseract OCR", + "pythonOpenCv": "Python OpenCV", + "weasyPrint": "WeasyPrint", + "installApp": "Install App", + "calibre": "Calibre", + "ghostscript": "Ghostscript", + "ocrMyPdf": "OCRmyPDF" + } + }, + "mail": { + "title": "Mail Server", + "description": "Configure SMTP settings for sending email notifications.", + "smtp": "SMTP Configuration", + "enabled": { + "label": "Enable Mail", + "description": "Enable email notifications and SMTP functionality" + }, + "host": { + "label": "SMTP Host", + "description": "The hostname or IP address of your SMTP server" + }, + "port": { + "label": "SMTP Port", + "description": "The port number for SMTP connection (typically 25, 465, or 587)" + }, + "username": { + "label": "SMTP Username", + "description": "Username for SMTP authentication" + }, + "password": { + "label": "SMTP Password", + "description": "Password for SMTP authentication" + }, + "from": { + "label": "From Address", + "description": "The email address to use as the sender" + }, + "enableInvites": { + "label": "Enable Email Invites", + "description": "Allow admins to invite users via email with auto-generated passwords" + }, + "frontendUrl": { + "label": "Frontend URL", + "description": "Base URL for frontend (e.g. https://pdf.example.com). Used for generating invite links in emails. Leave empty to use backend URL." + } + }, + "legal": { + "title": "Legal Documents", + "description": "Configure links to legal documents and policies.", + "disclaimer": { + "title": "Legal Responsibility Warning", + "message": "By customizing these legal documents, you assume full responsibility for ensuring compliance with all applicable laws and regulations, including but not limited to GDPR and other EU data protection requirements. Only modify these settings if: (1) you are operating a personal/private instance, (2) you are outside EU jurisdiction and understand your local legal obligations, or (3) you have obtained proper legal counsel and accept sole responsibility for all user data and legal compliance. Stirling-PDF and its developers assume no liability for your legal obligations." + }, + "termsAndConditions": { + "label": "Terms and Conditions", + "description": "URL or filename to terms and conditions" + }, + "privacyPolicy": { + "label": "Privacy Policy", + "description": "URL or filename to privacy policy" + }, + "accessibilityStatement": { + "label": "Accessibility Statement", + "description": "URL or filename to accessibility statement" + }, + "cookiePolicy": { + "label": "Cookie Policy", + "description": "URL or filename to cookie policy" + }, + "impressum": { + "label": "Impressum", + "description": "URL or filename to impressum (required in some jurisdictions)" + } + }, + "premium": { + "title": "Premium & Enterprise", + "description": "Configure your premium or enterprise license key.", + "license": "License Configuration", + "key": { + "label": "License Key", + "description": "Enter your premium or enterprise license key" + }, + "enabled": { + "label": "Enable Premium Features", + "description": "Enable license key checks for pro/enterprise features" + }, + "movedFeatures": { + "title": "Premium Features Distributed", + "message": "Premium and Enterprise features are now organized in their respective sections:" + } + }, + "features": { + "title": "Features", + "description": "Configure optional features and functionality.", + "serverCertificate": { + "label": "Server Certificate", + "description": "Configure server-side certificate generation for \"Sign with Stirling-PDF\" functionality", + "enabled": { + "label": "Enable Server Certificate", + "description": "Enable server-side certificate for \"Sign with Stirling-PDF\" option" + }, + "organizationName": { + "label": "Organization Name", + "description": "Organization name for generated certificates" + }, + "validity": { + "label": "Certificate Validity (days)", + "description": "Number of days the certificate will be valid" + }, + "regenerateOnStartup": { + "label": "Regenerate on Startup", + "description": "Generate new certificate on each application startup" + } + } + }, + "endpoints": { + "title": "API Endpoints", + "description": "Control which API endpoints and endpoint groups are available.", + "management": "Endpoint Management", + "toRemove": { + "label": "Disabled Endpoints", + "description": "Select individual endpoints to disable" + }, + "groupsToRemove": { + "label": "Disabled Endpoint Groups", + "description": "Select endpoint groups to disable" + }, + "note": "Note: Disabling endpoints restricts API access but does not remove UI components. Restart required for changes to take effect." + } + } }, "fileUpload": { + "selectFile": "Select a file", + "selectFiles": "Select files", + "selectPdfToView": "Select a PDF to view", + "selectPdfToEdit": "Select a PDF to edit", + "chooseFromStorage": "Choose a file from storage or upload a new PDF", + "chooseFromStorageMultiple": "Choose files from storage or upload new PDFs", + "loadFromStorage": "Load from Storage", + "filesAvailable": "files available", "loading": "NačítÃĄní...", - "or": "nebo" + "or": "nebo", + "dropFileHere": "Drop file here or click to upload", + "dropFilesHere": "Drop files here or click the upload button", + "pdfFilesOnly": "PDF files only", + "supportedFileTypes": "Supported file types", + "upload": "Upload", + "uploadFile": "Upload File", + "uploadFiles": "Upload Files", + "noFilesInStorage": "No files available in storage. Upload some files first.", + "selectFromStorage": "Select from Storage", + "backToTools": "Back to Tools", + "addFiles": "Add Files", + "dragFilesInOrClick": "Drag files in or click \"Add Files\" to browse" + }, + "fileEditor": { + "addFiles": "Add Files" }, "fileManager": { + "title": "Upload PDF Files", + "subtitle": "Add files to your storage for easy access across tools", + "filesSelected": "files selected", + "clearSelection": "Clear Selection", + "openInFileEditor": "Open in File Editor", + "uploadError": "Failed to upload some files.", + "failedToOpen": "Failed to open file. It may have been removed from storage.", + "failedToLoad": "Failed to load file to active set.", + "storageCleared": "Browser cleared storage. Files have been removed. Please re-upload.", + "clearAll": "Clear All", + "reloadFiles": "Reload Files", + "dragDrop": "Drag & Drop files here", + "clickToUpload": "Click to upload files", + "selectedFiles": "Selected Files", + "storage": "Storage", + "filesStored": "files stored", + "storageError": "Storage error occurred", + "storageLow": "Storage is running low. Consider removing old files.", + "supportMessage": "Powered by browser database storage for unlimited capacity", + "noFileSelected": "No files selected", + "showHistory": "Show History", + "hideHistory": "Hide History", + "fileHistory": "File History", + "loadingHistory": "Loading History...", + "lastModified": "Last Modified", + "toolChain": "Tools Applied", + "restore": "Restore", + "unzip": "Unzip", + "searchFiles": "Search files...", + "recent": "Recent", + "localFiles": "Local Files", + "googleDrive": "Google Drive", + "googleDriveShort": "Drive", + "myFiles": "My Files", + "noRecentFiles": "No recent files found", + "googleDriveNotAvailable": "Google Drive integration not available", + "openFiles": "Open Files", + "openFile": "Open File", + "details": "File Details", "fileName": "JmÊno", + "fileFormat": "Format", + "fileSize": "Size", "fileVersion": "Verze", + "totalSelected": "Total Selected", + "dropFilesHere": "Drop files here", "selectAll": "Vybrat vÅĄe", "deselectAll": "ZruÅĄit vÃŊběr vÅĄeho", "deleteSelected": "Smazat vybranÊ", + "downloadSelected": "Download Selected", + "selectedCount": "{{count}} selected", "download": "StÃĄhnout", - "delete": "Smazat" + "delete": "Smazat", + "unsupported": "Unsupported", + "addToUpload": "Add to Upload", + "deleteAll": "Delete All", + "loadingFiles": "Loading files...", + "noFiles": "No files available", + "noFilesFound": "No files found matching your search", + "openInPageEditor": "Open in Page Editor", + "showAll": "Show All", + "sortByDate": "Sort by Date", + "sortByName": "Sort by Name", + "sortBySize": "Sort by Size" + }, + "storage": { + "temporaryNotice": "Files are stored temporarily in your browser and may be cleared automatically", + "storageLimit": "Storage limit", + "storageUsed": "Temporary Storage used", + "storageFull": "Storage is nearly full. Consider removing some files.", + "fileTooLarge": "File too large. Maximum size per file is", + "storageQuotaExceeded": "Storage quota exceeded. Please remove some files before uploading more.", + "approximateSize": "Approximate size" }, "sanitize": { + "title": "Sanitise", + "desc": "Remove potentially harmful elements from PDF files.", "submit": "Sanitizovat PDF", + "completed": "Sanitisation completed successfully", + "error": { + "generic": "Sanitisation failed", + "failed": "An error occurred while sanitising the PDF." + }, + "filenamePrefix": "sanitised", + "sanitizationResults": "Sanitisation Results", "steps": { - "settings": "Nastavení" + "files": "Files", + "settings": "Nastavení", + "results": "Results" + }, + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "options": { + "title": "Sanitisation Options", + "note": "Select the elements you want to remove from the PDF. At least one option must be selected.", + "removeJavaScript": { + "label": "Remove JavaScript", + "desc": "Remove JavaScript actions and scripts from the PDF" + }, + "removeEmbeddedFiles": { + "label": "Remove Embedded Files", + "desc": "Remove any files embedded within the PDF" + }, + "removeXMPMetadata": { + "label": "Remove XMP Metadata", + "desc": "Remove XMP metadata from the PDF" + }, + "removeMetadata": { + "label": "Remove Document Metadata", + "desc": "Remove document information metadata (title, author, etc.)" + }, + "removeLinks": { + "label": "Remove Links", + "desc": "Remove external links and launch actions from the PDF" + }, + "removeFonts": { + "label": "Remove Fonts", + "desc": "Remove embedded fonts from the PDF" + } + } + }, + "addPassword": { + "title": "Přidat heslo", + "desc": "Encrypt your PDF document with a password.", + "completed": "Password protection applied", + "submit": "ZaÅĄifrovat", + "filenamePrefix": "encrypted", + "error": { + "failed": "An error occurred while encrypting the PDF." + }, + "passwords": { + "stepTitle": "Passwords & Encryption", + "completed": "Passwords configured", + "user": { + "label": "User Password", + "placeholder": "Enter user password" + }, + "owner": { + "label": "Owner Password", + "placeholder": "Enter owner password" + } + }, + "encryption": { + "keyLength": { + "label": "Encryption Key Length", + "40bit": "40-bit (Low)", + "128bit": "128-bit (Standard)", + "256bit": "256-bit (High)" + } + }, + "results": { + "title": "Encrypted PDFs" + }, + "tooltip": { + "header": { + "title": "Password Protection Overview" + }, + "passwords": { + "title": "Password Types", + "text": "User passwords restrict opening the document, while owner passwords control what can be done with the document once opened. You can set both or just one.", + "bullet1": "User Password: Required to open the PDF", + "bullet2": "Owner Password: Controls document permissions (not supported by all PDF viewers)" + }, + "encryption": { + "title": "Encryption Levels", + "text": "Higher encryption levels provide better security but may not be supported by older PDF viewers.", + "bullet1": "40-bit: Basic security, compatible with older viewers", + "bullet2": "128-bit: Standard security, widely supported", + "bullet3": "256-bit: Maximum security, requires modern viewers" + }, + "permissions": { + "title": "Změnit oprÃĄvnění", + "text": "These permissions control what users can do with the PDF. Most effective when combined with an owner password." + } + }, + "tags": "zabezpečit,bezpečnost", + "header": "Přidat heslo (ZaÅĄifrovat)", + "selectText": { + "1": "Vyberte PDF k zaÅĄifrovÃĄní", + "2": "UÅživatelskÊ heslo", + "3": "DÊlka ÅĄifrovacího klíče", + "4": "VyÅĄÅĄÃ­ hodnoty jsou silnějÅĄÃ­, ale niÅžÅĄÃ­ hodnoty mají lepÅĄÃ­ kompatibilitu.", + "5": "OprÃĄvnění k nastavení (Doporučeno pouŞívat společně s heslem vlastníka)", + "6": "ZabrÃĄnit sestavení dokumentu", + "7": "ZabrÃĄnit extrakci obsahu", + "8": "ZabrÃĄnit extrakci pro přístupnost", + "9": "ZabrÃĄnit vyplňovÃĄní formulÃĄÅ™Å¯", + "10": "ZabrÃĄnit ÃēpravÃĄm", + "11": "ZabrÃĄnit ÃēpravÃĄm poznÃĄmek", + "12": "ZabrÃĄnit tisku", + "13": "ZabrÃĄnit tisku v různÃŊch formÃĄtech", + "14": "Heslo vlastníka", + "15": "Omezuje, co lze s dokumentem dělat po jeho otevření (Není podporovÃĄno vÅĄemi čtečkami)", + "16": "Omezuje samotnÊ otevření dokumentu" } }, "changePermissions": { "title": "Změnit oprÃĄvnění", + "desc": "Change document restrictions and permissions.", + "completed": "Permissions changed", "submit": "Změnit oprÃĄvnění", + "error": { + "failed": "An error occurred while changing PDF permissions." + }, "permissions": { "preventAssembly": { "label": "ZabrÃĄnit sestavení dokumentu" @@ -1734,10 +4580,784 @@ "label": "ZabrÃĄnit tisku v různÃŊch formÃĄtech" } }, + "results": { + "title": "Modified PDFs" + }, "tooltip": { "header": { "title": "Změnit oprÃĄvnění" + }, + "description": { + "text": "Changes document permissions, allowing/disallowing access to different features in PDF readers." + }, + "warning": { + "text": "To make these permissions unchangeable, use the Add Password tool to set an owner password." } } + }, + "removePassword": { + "title": "Odstranit heslo", + "desc": "Odstranit ochranu heslem z vaÅĄeho PDF dokumentu.", + "tags": "zabezpečit,deÅĄifrovat,bezpečnost,odstranit heslo,smazat heslo", + "password": { + "stepTitle": "Odstranit heslo", + "label": "SoučasnÊ heslo", + "placeholder": "Enter current password", + "completed": "Password configured" + }, + "filenamePrefix": "decrypted", + "error": { + "failed": "An error occurred while removing the password from the PDF." + }, + "tooltip": { + "description": "Removing password protection requires the password that was used to encrypt the PDF. This will decrypt the document, making it accessible without a password." + }, + "submit": "Odstranit", + "results": { + "title": "Decrypted PDFs" + }, + "header": "Odstranit heslo (DeÅĄifrovat)", + "selectText": { + "1": "Vyberte PDF k deÅĄifrovÃĄní", + "2": "Heslo" + } + }, + "automate": { + "title": "Automate", + "desc": "Build multi-step workflows by chaining together PDF actions. Ideal for recurring tasks.", + "invalidStep": "Invalid step", + "files": { + "placeholder": "Select files to process with this automation" + }, + "selection": { + "title": "Automation Selection", + "saved": { + "title": "Saved" + }, + "createNew": { + "title": "Create New Automation" + }, + "suggested": { + "title": "Suggested" + } + }, + "creation": { + "createTitle": "Create Automation", + "editTitle": "Edit Automation", + "intro": "Automations run tools sequentially. To get started, add tools in the order you want them to run.", + "name": { + "label": "Automation Name", + "placeholder": "My Automation" + }, + "description": { + "label": "Description (optional)", + "placeholder": "Describe what this automation does..." + }, + "tools": { + "selectTool": "Select a tool...", + "selected": "Selected Tools", + "remove": "Remove tool", + "configure": "Configure tool", + "notConfigured": "! Not Configured", + "addTool": "Add Tool", + "add": "Add a tool..." + }, + "save": "Save Automation", + "unsavedChanges": { + "title": "Unsaved Changes", + "message": "You have unsaved changes. Are you sure you want to go back? All changes will be lost.", + "cancel": "Cancel", + "confirm": "Go Back" + }, + "icon": { + "label": "Icon" + } + }, + "run": { + "title": "Run Automation" + }, + "sequence": { + "unnamed": "Unnamed Automation", + "steps": "{{count}} steps", + "running": "Running Automation...", + "run": "Run Automation", + "finish": "Finish" + }, + "reviewTitle": "Automation Results", + "config": { + "loading": "Loading tool configuration...", + "noSettings": "This tool does not have configurable settings.", + "title": "Configure {{toolName}}", + "description": "Configure the settings for this tool. These settings will be applied when the automation runs.", + "cancel": "Cancel", + "save": "Save Configuration" + }, + "copyToSaved": "Copy to Saved" + }, + "automation": { + "suggested": { + "securePdfIngestion": "Secure PDF Ingestion", + "securePdfIngestionDesc": "Comprehensive PDF processing workflow that sanitises documents, applies OCR with cleanup, converts to PDF/A format for long-term archival, and optimises file size.", + "emailPreparation": "Email Preparation", + "emailPreparationDesc": "Optimises PDFs for email distribution by compressing files, splitting large documents into 20MB chunks for email compatibility, and removing metadata for privacy.", + "secureWorkflow": "Security Workflow", + "secureWorkflowDesc": "Secures PDF documents by removing potentially malicious content like JavaScript and embedded files, then adds password protection to prevent unauthorised access. Password is set to 'password' by default.", + "processImages": "Process Images", + "processImagesDesc": "Converts multiple image files into a single PDF document, then applies OCR technology to extract searchable text from the images." + } + }, + "common": { + "copy": "Copy", + "copied": "Copied!", + "refresh": "Refresh", + "retry": "Retry", + "remaining": "remaining", + "used": "used", + "available": "available", + "cancel": "Cancel", + "preview": "Preview" + }, + "config": { + "overview": { + "title": "Application Configuration", + "description": "Current application settings and configuration details." + }, + "account": { + "overview": { + "title": "Account Settings", + "manageAccountPreferences": "Manage your account preferences", + "guestDescription": "You are signed in as a guest. Consider upgrading your account above." + }, + "upgrade": { + "title": "Upgrade Guest Account", + "description": "Link your account to preserve your history and access more features!", + "socialLogin": "Upgrade with Social Account", + "linkWith": "Link with", + "emailPassword": "or enter your email & password", + "email": "Email", + "emailPlaceholder": "Enter your email", + "password": "Password (optional)", + "passwordPlaceholder": "Set a password", + "passwordNote": "Leave empty to use email verification only", + "upgradeButton": "Upgrade Account" + } + }, + "apiKeys": { + "description": "Your API key for accessing Stirling's suite of PDF tools. Copy it to your project or refresh to generate a new one.", + "publicKeyAriaLabel": "Public API key", + "copyKeyAriaLabel": "Copy API key", + "refreshAriaLabel": "Refresh API key", + "includedCredits": "Included credits", + "purchasedCredits": "Purchased credits", + "totalCredits": "Total Credits", + "chartAriaLabel": "Credits usage: included {{includedUsed}} of {{includedTotal}}, purchased {{purchasedUsed}} of {{purchasedTotal}}", + "nextReset": "Next Reset", + "lastApiUse": "Last API Use", + "overlayMessage": "Generate a key to see credits and available credits", + "label": "API Key", + "guestInfo": "Guest users do not receive API keys. Create an account to get an API key you can use in your applications.", + "goToAccount": "Go to Account", + "refreshModal": { + "title": "Refresh API Keys", + "warning": "âš ī¸ Warning: This action will generate new API keys and make your previous keys invalid.", + "impact": "Any applications or services currently using these keys will stop working until you update them with the new keys.", + "confirmPrompt": "Are you sure you want to continue?", + "confirmCta": "Refresh Keys" + }, + "generateError": "We couldn't generate your API key." + } + }, + "AddAttachmentsRequest": { + "attachments": "Select Attachments", + "info": "Select files to attach to your PDF. These files will be embedded and accessible through the PDF's attachment panel.", + "selectFiles": "Select Files to Attach", + "placeholder": "Choose files...", + "addMoreFiles": "Add more files...", + "selectedFiles": "Selected Files", + "submit": "Add Attachments", + "results": { + "title": "Attachment Results" + }, + "error": { + "failed": "Add attachments operation failed" + } + }, + "termsAndConditions": "Terms & Conditions", + "logOut": "Log out", + "addAttachments": { + "error": { + "failed": "An error occurred while adding attachments to the PDF." + } + }, + "autoRename": { + "description": "This tool will automatically rename PDF files based on their content. It analyzes the document to find the most suitable title from the text." + }, + "customPosition": "Custom Position", + "details": "Details", + "downloadUnavailable": "Download unavailable for this item", + "invalidUndoData": "Cannot undo: invalid operation data", + "margin": { + "large": "Large", + "medium": "Medium", + "small": "Small", + "xLarge": "Extra Large" + }, + "noFilesToUndo": "Cannot undo: no files were processed in the last operation", + "noOperationToUndo": "No operation to undo", + "noValidFiles": "No valid files to process", + "operationCancelled": "Operation cancelled", + "pageEdit": { + "deselectAll": "Select None", + "selectAll": "Select All" + }, + "quickPosition": "Quick Position", + "reorganizePages": { + "error": { + "failed": "Failed to reorganize pages" + }, + "results": { + "title": "Pages Reorganized" + }, + "settings": { + "title": "Settings" + }, + "submit": "Reorganize Pages" + }, + "replace-color": { + "options": { + "fill": "Fill colour", + "gradient": "Gradient" + }, + "previewOverlayOpacity": "Preview overlay opacity", + "previewOverlayTransparency": "Preview overlay transparency", + "previewOverlayVisibility": "Show preview overlay", + "selectText": { + "1": "MoÅžnosti nahrazení nebo inverze barev", + "2": "VÃŊchozí (přednastavenÊ kontrastní barvy)", + "3": "Vlastní (uÅživatelsky definovanÊ barvy)", + "4": "ÚplnÃĄ inverze (invertovat vÅĄechny barvy)", + "5": "MoÅžnosti vysokÊho kontrastu", + "6": "BílÃŊ text na černÊm pozadí", + "7": "ČernÃŊ text na bílÊm pozadí", + "8": "ÅŊlutÃŊ text na černÊm pozadí", + "9": "ZelenÃŊ text na černÊm pozadí", + "10": "Vybrat barvu textu", + "11": "Vybrat barvu pozadí", + "12": "Choose start colour", + "13": "Choose end colour" + }, + "submit": "Nahradit", + "title": "Nahradit a invertovat barvy", + "header": "Nahradit a invertovat barvy v PDF" + }, + "size": "Size", + "submit": "Submit", + "success": "Success", + "tools": { + "noSearchResults": "No tools found", + "noTools": "No tools available" + }, + "undoDataMismatch": "Cannot undo: operation data is corrupted", + "undoFailed": "Failed to undo operation", + "undoQuotaError": "Cannot undo: insufficient storage space", + "undoStorageError": "Undo completed but some files could not be saved to storage", + "undoSuccess": "Operation undone successfully", + "unsupported": "Unsupported", + "onboarding": { + "welcomeModal": { + "title": "Welcome to Stirling PDF!", + "description": "Would you like to take a quick 1-minute tour to learn the key features and how to get started?", + "helpHint": "You can always access this tour later from the Help button in the bottom left.", + "startTour": "Start Tour", + "maybeLater": "Maybe Later", + "dontShowAgain": "Don't Show Again" + }, + "allTools": "This is the All Tools panel, where you can browse and select from all available PDF tools.", + "selectCropTool": "Let's select the Crop tool to demonstrate how to use one of the tools.", + "toolInterface": "This is the Crop tool interface. As you can see, there's not much there because we haven't added any PDF files to work with yet.", + "filesButton": "The Files button on the Quick Access bar allows you to upload PDFs to use the tools on.", + "fileSources": "You can upload new files or access recent files from here. For the tour, we'll just use a sample file.", + "workbench": "This is the Workbench - the main area where you view and edit your PDFs.", + "viewSwitcher": "Use these controls to select how you want to view your PDFs.", + "viewer": "The Viewer lets you read and annotate your PDFs.", + "pageEditor": "The Page Editor allows you to do various operations on the pages within your PDFs, such as reordering, rotating and deleting.", + "activeFiles": "The Active Files view shows all of the PDFs you have loaded into the tool, and allows you to select which ones to process.", + "fileCheckbox": "Clicking one of the files selects it for processing. You can select multiple files for batch operations.", + "selectControls": "The Right Rail contains buttons to quickly select/deselect all of your active PDFs, along with buttons to change the app's theme or language.", + "cropSettings": "Now that we've selected the file we want crop, we can configure the Crop tool to choose the area that we want to crop the PDF to.", + "runButton": "Once the tool has been configured, this button allows you to run the tool on all the selected PDFs.", + "results": "After the tool has finished running, the Review step will show a preview of the results in this panel, and allow you to undo the operation or download the file. ", + "fileReplacement": "The modified file will replace the original file in the Workbench automatically, allowing you to easily run it through more tools.", + "pinButton": "You can use the Pin button if you'd rather your files stay active after running tools on them.", + "wrapUp": "You're all set! You've learnt about the main areas of the app and how to use them. Click the Help button whenever you like to see this tour again.", + "previous": "Previous", + "next": "Next", + "finish": "Finish", + "startTour": "Start Tour", + "startTourDescription": "Take a guided tour of Stirling PDF's key features" + }, + "workspace": { + "title": "Workspace", + "people": { + "title": "People", + "description": "Manage workspace members and their permissions", + "loading": "Loading people...", + "searchMembers": "Search members...", + "addMembers": "Add Members", + "inviteMembers": { + "label": "Invite Members", + "subtitle": "Type or paste in emails below, separated by commas. Your workspace will be billed by members." + }, + "user": "User", + "role": "Role", + "team": "Team", + "status": "Status", + "actions": "Actions", + "noMembersFound": "No members found", + "active": "Active", + "disabled": "Disabled", + "activeSession": "Active session", + "member": "Member", + "admin": "Admin", + "roleDescriptions": { + "admin": "Can manage settings and invite members, with full administrative access.", + "member": "Can view and edit shared files, but cannot manage workspace settings or members." + }, + "editRole": "Edit Role", + "enable": "Enable", + "disable": "Disable", + "deleteUser": "Delete User", + "deleteUserSuccess": "User deleted successfully", + "deleteUserError": "Failed to delete user", + "confirmDelete": "Are you sure you want to delete this user? This action cannot be undone.", + "addMember": { + "title": "Add Member", + "username": "Username (Email)", + "usernamePlaceholder": "user@example.com", + "password": "Password", + "passwordPlaceholder": "Enter password", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "forcePasswordChange": "Force password change on first login", + "cancel": "Cancel", + "submit": "Add Member", + "usernameRequired": "Username and password are required", + "passwordTooShort": "Password must be at least 6 characters", + "success": "User created successfully", + "error": "Failed to create user" + }, + "editMember": { + "title": "Edit Member", + "editing": "Editing:", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "cancel": "Cancel", + "submit": "Update Member", + "success": "User updated successfully", + "error": "Failed to update user" + }, + "toggleEnabled": { + "success": "User status updated successfully", + "error": "Failed to update user status" + }, + "delete": { + "success": "User deleted successfully", + "error": "Failed to delete user" + }, + "emailInvite": { + "tab": "Email Invite", + "description": "Type or paste in emails below, separated by commas. Users will receive login credentials via email.", + "emails": "Email Addresses", + "emailsPlaceholder": "user1@example.com, user2@example.com", + "emailsRequired": "At least one email address is required", + "submit": "Send Invites", + "success": "user(s) invited successfully", + "partialSuccess": "Some invites failed", + "allFailed": "Failed to invite users", + "error": "Failed to send invites" + }, + "directInvite": { + "tab": "Direct Create" + }, + "inviteLinkTab": { + "tab": "Invite Link" + }, + "inviteLink": { + "description": "Generate a secure link that allows the user to set their own password", + "email": "Email Address", + "emailPlaceholder": "user@example.com (optional)", + "emailDescription": "Optional - leave blank for a general invite link that can be used by anyone", + "emailRequired": "Email address is required", + "emailOptional": "Optional - leave blank for a general invite link", + "emailRequiredForSend": "Email address is required to send email notification", + "expiryHours": "Expiry Hours", + "expiryDescription": "How many hours until the link expires", + "sendEmail": "Send invite link via email", + "sendEmailDescription": "If enabled, the invite link will be sent to the specified email address", + "smtpRequired": "SMTP not configured", + "generate": "Generate Link", + "generated": "Invite Link Generated", + "copied": "Link copied to clipboard", + "success": "Invite link generated successfully", + "successWithEmail": "Invite link generated and sent via email", + "emailFailed": "Invite link generated, but email failed", + "emailFailedDetails": "Error: {0}. Please share the invite link manually.", + "error": "Failed to generate invite link", + "submit": "Generate Invite Link" + }, + "inviteMode": { + "username": "Username", + "email": "Email", + "link": "Link", + "emailDisabled": "Email invites require SMTP configuration and mail.enableInvites=true in settings" + }, + "license": { + "users": "users", + "availableSlots": "Available Slots", + "grandfathered": "Grandfathered", + "grandfatheredShort": "{{count}} grandfathered", + "fromLicense": "from license", + "slotsAvailable": "{{count}} user slot(s) available", + "noSlotsAvailable": "No slots available", + "currentUsage": "Currently using {{current}} of {{max}} user licences" + } + }, + "teams": { + "title": "Teams", + "description": "Manage teams and organize workspace members", + "loading": "Loading teams...", + "loadingDetails": "Loading team details...", + "createNewTeam": "Create New Team", + "teamName": "Team Name", + "totalMembers": "Total Members", + "actions": "Actions", + "noTeamsFound": "No teams found", + "noMembers": "No members in this team", + "system": "System", + "addMember": "Add Member", + "viewTeam": "View Team", + "removeMember": "Remove from team", + "cannotRemoveFromSystemTeam": "Cannot remove from system team", + "renameTeamLabel": "Rename Team", + "deleteTeamLabel": "Delete Team", + "cannotDeleteInternal": "Cannot delete the Internal team", + "confirmDelete": "Are you sure you want to delete this team? This team must be empty to delete.", + "confirmRemove": "Remove user from this team?", + "cannotRenameInternal": "Cannot rename the Internal team", + "cannotAddToInternal": "Cannot add members to the Internal team", + "teamNotFound": "Team not found", + "backToTeams": "Back to Teams", + "memberCount": "{{count}} members", + "removeMemberSuccess": "User removed from team", + "removeMemberError": "Failed to remove user from team", + "createTeam": { + "title": "Create New Team", + "teamName": "Team Name", + "teamNamePlaceholder": "Enter team name", + "cancel": "Cancel", + "submit": "Create Team", + "nameRequired": "Team name is required", + "success": "Team created successfully", + "error": "Failed to create team" + }, + "renameTeam": { + "title": "Rename Team", + "renaming": "Renaming:", + "newTeamName": "New Team Name", + "newTeamNamePlaceholder": "Enter new team name", + "cancel": "Cancel", + "submit": "Rename Team", + "nameRequired": "Team name is required", + "success": "Team renamed successfully", + "error": "Failed to rename team" + }, + "deleteTeam": { + "success": "Team deleted successfully", + "error": "Failed to delete team. Make sure the team is empty.", + "teamMustBeEmpty": "Team must be empty before deletion" + }, + "addMemberToTeam": { + "title": "Add Member to Team", + "addingTo": "Adding to", + "selectUser": "Select User", + "selectUserPlaceholder": "Choose a user", + "selectUserRequired": "Please select a user", + "currentlyIn": "currently in", + "willBeMoved": "Note: This user will be moved from their current team to this team.", + "cancel": "Cancel", + "submit": "Add Member", + "userRequired": "Please select a user", + "success": "Member added to team successfully", + "error": "Failed to add member to team" + }, + "changeTeam": { + "label": "Change Team", + "title": "Change Team", + "changing": "Moving", + "selectTeam": "Select Team", + "selectTeamPlaceholder": "Choose a team", + "selectTeamRequired": "Please select a team", + "success": "Team changed successfully", + "error": "Failed to change team", + "submit": "Change Team" + } + } + }, + "plan": { + "currency": "Currency", + "popular": "Popular", + "current": "Current Plan", + "upgrade": "Upgrade", + "contact": "Contact Us", + "customPricing": "Custom", + "showComparison": "Compare All Features", + "hideComparison": "Hide Feature Comparison", + "featureComparison": "Feature Comparison", + "activePlan": { + "title": "Active Plan", + "subtitle": "Your current subscription details" + }, + "availablePlans": { + "title": "Available Plans", + "subtitle": "Choose the plan that fits your needs" + }, + "static": { + "title": "Billing Information", + "message": "Online billing is not currently configured. To upgrade your plan or manage subscriptions, please contact us directly.", + "contactSales": "Contact Sales", + "contactToUpgrade": "Contact us to upgrade or customize your plan", + "maxUsers": "Max Users", + "upTo": "Up to" + }, + "period": { + "month": "month" + }, + "free": { + "name": "Free", + "highlight1": "Limited Tool Usage Per week", + "highlight2": "Access to all tools", + "highlight3": "Community support" + }, + "pro": { + "name": "Pro", + "highlight1": "Unlimited Tool Usage", + "highlight2": "Advanced PDF tools", + "highlight3": "No watermarks" + }, + "enterprise": { + "name": "Enterprise", + "highlight1": "Custom pricing", + "highlight2": "Dedicated support", + "highlight3": "Latest features" + }, + "feature": { + "title": "Feature", + "pdfTools": "Basic PDF Tools", + "fileSize": "File Size Limit", + "automation": "Automate tool workflows", + "api": "API Access", + "priority": "Priority Support", + "customPricing": "Custom Pricing" + } + }, + "subscription": { + "status": { + "active": "Active", + "pastDue": "Past Due", + "canceled": "Canceled", + "incomplete": "Incomplete", + "trialing": "Trial", + "none": "No Subscription" + }, + "renewsOn": "Renews on {{date}}", + "cancelsOn": "Cancels on {{date}}" + }, + "billing": { + "manageBilling": "Manage Billing", + "portal": { + "error": "Failed to open billing portal" + } + }, + "payment": { + "preparing": "Preparing your checkout...", + "upgradeTitle": "Upgrade to {{planName}}", + "success": "Payment Successful!", + "successMessage": "Your subscription has been activated successfully. You will receive a confirmation email shortly.", + "autoClose": "This window will close automatically...", + "error": "Payment Error" + }, + "firstLogin": { + "title": "First Time Login", + "welcomeTitle": "Welcome!", + "welcomeMessage": "For security reasons, you must change your password on your first login.", + "loggedInAs": "Logged in as", + "error": "Error", + "currentPassword": "Current Password", + "enterCurrentPassword": "Enter your current password", + "newPassword": "New Password", + "enterNewPassword": "Enter new password (min 8 characters)", + "confirmPassword": "Confirm New Password", + "reEnterNewPassword": "Re-enter new password", + "changePassword": "Change Password", + "allFieldsRequired": "All fields are required", + "passwordsDoNotMatch": "New passwords do not match", + "passwordTooShort": "Password must be at least 8 characters", + "passwordMustBeDifferent": "New password must be different from current password", + "passwordChangedSuccess": "Password changed successfully! Please log in again.", + "passwordChangeFailed": "Failed to change password. Please check your current password." + }, + "invite": { + "welcome": "Welcome to Stirling PDF", + "invalidToken": "Invalid invitation link", + "validationError": "Failed to validate invitation link", + "passwordRequired": "Password is required", + "passwordTooShort": "Password must be at least 6 characters", + "passwordMismatch": "Passwords do not match", + "acceptError": "Failed to create account", + "validating": "Validating invitation...", + "invalidInvitation": "Invalid Invitation", + "goToLogin": "Go to Login", + "welcomeTitle": "You've been invited!", + "welcomeSubtitle": "Complete your account setup to get started", + "accountFor": "Creating account for", + "linkExpires": "Link expires", + "email": "Email address", + "emailPlaceholder": "Enter your email address", + "emailRequired": "Email address is required", + "invalidEmail": "Invalid email address", + "choosePassword": "Choose a password", + "passwordPlaceholder": "Enter your password", + "confirmPassword": "Confirm password", + "confirmPasswordPlaceholder": "Re-enter your password", + "createAccount": "Create Account", + "creating": "Creating Account...", + "alreadyHaveAccount": "Already have an account?", + "signIn": "Sign in" + }, + "audit": { + "error": { + "title": "Error loading audit system" + }, + "notAvailable": "Audit system not available", + "notAvailableMessage": "The audit system is not configured or not available.", + "disabled": "Audit logging is disabled", + "disabledMessage": "Enable audit logging in your application configuration to track system events.", + "systemStatus": { + "title": "System Status", + "status": "Audit Logging", + "enabled": "Enabled", + "disabled": "Disabled", + "level": "Audit Level", + "retention": "Retention Period", + "days": "days", + "totalEvents": "Total Events" + }, + "tabs": { + "dashboard": "Dashboard", + "events": "Audit Events", + "export": "Export" + }, + "charts": { + "title": "Audit Dashboard", + "error": "Error loading charts", + "day": "Day", + "week": "Week", + "month": "Month", + "byType": "Events by Type", + "byUser": "Events by User", + "overTime": "Events Over Time" + }, + "events": { + "title": "Audit Events", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "error": "Error loading events", + "noEvents": "No events found", + "timestamp": "Timestamp", + "type": "Type", + "user": "User", + "ipAddress": "IP Address", + "actions": "Actions", + "viewDetails": "View Details", + "eventDetails": "Event Details", + "details": "Details" + }, + "export": { + "title": "Export Audit Data", + "description": "Export audit events to CSV or JSON format. Use filters to limit the exported data.", + "format": "Export Format", + "filters": "Filters (Optional)", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "exportButton": "Export Data", + "error": "Failed to export data" + } + }, + "usage": { + "noData": "No data available", + "error": "Error loading usage statistics", + "noDataMessage": "No usage statistics are currently available.", + "controls": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All", + "refresh": "Refresh", + "dataTypeLabel": "Data Type:", + "dataType": { + "all": "All", + "api": "API", + "ui": "UI" + } + }, + "showing": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All" + }, + "stats": { + "totalEndpoints": "Total Endpoints", + "totalVisits": "Total Visits", + "showing": "Showing", + "selectedVisits": "Selected Visits" + }, + "chart": { + "title": "Endpoint Usage Chart" + }, + "table": { + "title": "Detailed Statistics", + "endpoint": "Endpoint", + "visits": "Visits", + "percentage": "Percentage", + "noData": "No data available" + } + }, + "backendHealth": { + "checking": "Checking backend status...", + "online": "Backend Online", + "offline": "Backend Offline" + }, + "autoRedact": { + "tags": "Začernit,SkrÃŊt,začernit,černÃĄ,značka,skrytÃŊ", + "title": "AutomatickÊ začernění", + "header": "AutomatickÊ začernění", + "colorLabel": "Barva", + "textsToRedactLabel": "Text k začernění (oddělenÃŊ Å™ÃĄdky)", + "textsToRedactPlaceholder": "např. \\nDůvěrnÊ \\nPřísně tajnÊ", + "useRegexLabel": "PouŞít regulÃĄrní vÃŊraz", + "wholeWordSearchLabel": "Hledat celÃĄ slova", + "customPaddingLabel": "Vlastní dodatečnÊ odsazení", + "convertPDFToImageLabel": "PřevÊst PDF na PDF-obrÃĄzek (PouŞívÃĄ se k odstranění textu za rÃĄmečkem)", + "submitButton": "Odeslat" + }, + "replaceColorPdf": { + "tags": "nahrazení barev,Ãēprava strÃĄnek,zpracovÃĄní,serverovÃĄ ÄÃĄst" } -} \ No newline at end of file +} diff --git a/frontend/public/locales/da-DK/translation.json b/frontend/public/locales/da-DK/translation.json index ab8d97cd2..82596d238 100644 --- a/frontend/public/locales/da-DK/translation.json +++ b/frontend/public/locales/da-DK/translation.json @@ -1,4 +1,40 @@ { + "toolPanel": { + "modePrompt": { + "title": "Choose how you browse tools", + "description": "Preview both layouts and decide how you want to explore Stirling PDF tools.", + "sidebarTitle": "Sidebar mode", + "sidebarDescription": "Keep tools alongside your workspace for quick switching.", + "recommended": "Recommended", + "chooseSidebar": "Use sidebar mode", + "fullscreenTitle": "Fullscreen mode - (legacy)", + "fullscreenDescription": "Browse every tool in a catalogue that covers the workspace until you pick one.", + "chooseFullscreen": "Use fullscreen mode", + "dismiss": "Maybe later" + }, + "fullscreen": { + "showDetails": "Show Details", + "comingSoon": "Coming soon:", + "favorite": "Add to favourites", + "favorites": "Favourites", + "heading": "All tools (fullscreen view)", + "noResults": "Try adjusting your search or toggle descriptions to find what you need.", + "recommended": "Recommended", + "unfavorite": "Remove from favourites" + }, + "placeholder": "Choose a tool to get started", + "toggle": { + "fullscreen": "Switch to fullscreen mode", + "sidebar": "Switch to sidebar mode" + } + }, + "unsavedChanges": "You have unsaved changes to your PDF.", + "areYouSure": "Are you sure you want to leave?", + "unsavedChangesTitle": "Unsaved Changes", + "keepWorking": "Keep Working", + "discardChanges": "Discard & Leave", + "applyAndContinue": "Save & Leave", + "exportAndContinue": "Export & Continue", "language": { "direction": "ltr" }, @@ -18,8 +54,26 @@ "customTextDesc": "Brugerdefineret Tekst", "numberPagesDesc": "Hvilke sider der skal nummereres, standard 'alle', accepterer ogsÃĨ 1-5 eller 2,5,9 osv.", "customNumberDesc": "Standard er {n}, accepterer ogsÃĨ 'Side {n} af {total}', 'Tekst-{n}', '{filnavn}-{n}", - "submit": "Tilføj Sidenumre" + "submit": "Tilføj Sidenumre", + "configuration": "Configuration", + "customize": "Customize Appearance", + "pagesAndStarting": "Pages & Starting Number", + "positionAndPages": "Position & Pages", + "error": { + "failed": "Add page numbers operation failed" + }, + "results": { + "title": "Page Number Results" + }, + "preview": "Position Selection", + "previewDisclaimer": "Preview is approximate. Final output may vary due to PDF font metrics." }, + "pageSelectionPrompt": "Brugerdefineret sidevalg (Indtast en kommasepareret liste af sidenumre 1,5,6 eller funktioner som 2n+1) :", + "startingNumberTooltip": "The first number to display. Subsequent pages will increment from this number.", + "marginTooltip": "Distance between the page number and the edge of the page.", + "fontSizeTooltip": "Size of the page number text in points. Larger numbers create bigger text.", + "fontTypeTooltip": "Font family for the page numbers. Choose based on your document style.", + "customTextTooltip": "Optional custom format for page numbers. Use {n} as placeholder for the number. Example: \"Page {n}\" will show \"Page 1\", \"Page 2\", etc.", "pdfPrompt": "VÃĻlg PDF-fil(er)", "multiPdfPrompt": "VÃĻlg PDF-filerne (2+)", "multiPdfDropPrompt": "VÃĻlg (eller drag & drop) alle PDF-filerne du skal bruge", @@ -30,15 +84,41 @@ "uploadLimitExceededPlural": "are too large. Maximum allowed size is", "processTimeWarning": "Advarsel: Denne proces kan tage op til et helt minut, alt efter størrelsen pÃĨ filen", "pageOrderPrompt": "Brugerdefineret siderÃĻkkefølge (Indtast en kommasepareret liste af sidenumre eller funktioner som 2n+1) :", - "pageSelectionPrompt": "Brugerdefineret sidevalg (Indtast en kommasepareret liste af sidenumre 1,5,6 eller funktioner som 2n+1) :", "goToPage": "GÃĨ", "true": "Sandt", "false": "Falsk", "unknown": "Ukendt", + "app": { + "description": "The Free Adobe Acrobat alternative (10M+ Downloads)" + }, "save": "Gem", "saveToBrowser": "Gem til browser", + "download": "Download", + "pin": "Pin File (keep active after tool run)", + "unpin": "Unpin File (replace after tool run)", + "undoOperationTooltip": "Click to undo the last operation and restore the original files", + "undo": "Undo", + "moreOptions": "More Options", + "editYourNewFiles": "Edit your new file(s)", "close": "Luk", + "openInViewer": "Open in Viewer", + "confirmClose": "Confirm Close", + "confirmCloseMessage": "Are you sure you want to close this file?", + "confirmCloseCancel": "Cancel", + "confirmCloseConfirm": "Close File", + "fileSelected": "Selected: {{filename}}", + "chooseFile": "Choose File", "filesSelected": "Filer valgt", + "files": { + "title": "Files", + "upload": "Upload", + "uploadFiles": "Upload Files", + "addFiles": "Add files", + "selectFromWorkbench": "Select files from the workbench or ", + "selectMultipleFromWorkbench": "Select at least {{count}} files from the workbench or ", + "created": "Created", + "size": "File Size" + }, "noFavourites": "Ingen favoritter tilføjet", "downloadComplete": "Download fuldført", "bored": "TrÃĻt af at vente?", @@ -56,7 +136,10 @@ }, "error": { "pdfPassword": "PDF-dokumentet er beskyttet med adgangskode, og enten blev adgangskoden ikke angivet eller var forkert", + "encryptedPdfMustRemovePassword": "This PDF is encrypted or password-protected. Please unlock it before converting to PDF/A.", + "incorrectPasswordProvided": "The PDF password is incorrect or not provided.", "_value": "Fejl", + "dismissAllErrors": "Dismiss All Errors", "sorry": "Beklager fejlen!", "needHelp": "Brug for hjÃĻlp / Fundet et problem?", "contactTip": "Hvis du stadig har problemer, skal du endelig tage kontakt til os, for at fÃĨ hjÃĻlp. Du kan oprette en ticket pÃĨ vores Github-side eller tage kontakt til os via Discord:", @@ -71,6 +154,10 @@ "githubSubmit": "GitHub - Indsend en ticket", "discordSubmit": "Discord - Indsend Support post" }, + "warning": { + "tooltipTitle": "Warning" + }, + "edit": "Edit", "delete": "Slet", "username": "Brugernavn", "password": "Adgangskode", @@ -82,6 +169,7 @@ "green": "Grøn", "blue": "BlÃĨ", "custom": "Brugerdefineret...", + "comingSoon": "Coming soon", "WorkInProgess": "Arbejde i gang, Kan muligvis ikke virke eller have fejl, RapportÊr venligst eventuelle problemer!", "poweredBy": "Drevet af", "yes": "Ja", @@ -115,12 +203,14 @@ "page": "Sidenummer", "pages": "Sideantal", "loading": "Laster...", + "review": "Review", "addToDoc": "Tilføj til Dokument", "reset": "Reset", "apply": "Apply", "noFileSelected": "No file selected. Please upload one.", "legal": { "privacy": "Privacy Policy", + "iAgreeToThe": "I agree to all of the", "terms": "VilkÃĨr og betingelser", "accessibility": "AdgangsnÃĻvnteglen", "cookie": "Cokiebelejring", @@ -160,6 +250,7 @@ "title": "Vil du gøre Stirling PDF bedre?", "paragraph1": "Stirling PDF har indsat analytics for at hjÃĻlpe os med at forbedre produktet. Vi følger ikke nogen personoplysninger eller filinhold.", "paragraph2": "BevÃĻgelsesmÃĻssigt aktiver du analytics for at hjÃĻlpe Stirling-PDF med at vokse og til atstÃĨ os bedre at forstÃĨ vores brugere.", + "learnMore": "Learn more", "enable": "AktivÊr analytics", "disable": "Deaktiver analytics", "settings": "Du kan ÃĻndre analytics-indstillingerne i config/settings.yml-filen" @@ -203,6 +294,54 @@ "cacheInputs": { "name": "Gem formularinput", "help": "AktivÊr for at gemme tidligere anvendte input til fremtidige kørsler" + }, + "general": { + "title": "General", + "description": "Configure general application preferences.", + "account": "Account", + "accountDescription": "Manage your account settings", + "user": "User", + "signedInAs": "Signed in as", + "logout": "Log out", + "enableFeatures": { + "title": "For System Administrators", + "intro": "Enable user authentication, team management, and workspace features for your organization.", + "action": "Configure", + "and": "and", + "benefit": "Enables user roles, team collaboration, admin controls, and enterprise features.", + "learnMore": "Learn more in documentation", + "dismiss": "Dismiss" + }, + "autoUnzip": "Auto-unzip API responses", + "autoUnzipDescription": "Automatically extract files from ZIP responses", + "autoUnzipTooltip": "Automatically extract ZIP files returned from API operations. Disable to keep ZIP files intact. This does not affect automation workflows.", + "autoUnzipFileLimit": "Auto-unzip file limit", + "autoUnzipFileLimitDescription": "Maximum number of files to extract from ZIP", + "autoUnzipFileLimitTooltip": "Only unzip if the ZIP contains this many files or fewer. Set higher to extract larger ZIPs.", + "defaultToolPickerMode": "Default tool picker mode", + "defaultToolPickerModeDescription": "Choose whether the tool picker opens in fullscreen or sidebar by default", + "mode": { + "fullscreen": "Fullscreen", + "sidebar": "Sidebar" + } + }, + "hotkeys": { + "title": "Keyboard Shortcuts", + "description": "Hover a tool to see its shortcut or customise it below. Click \"Change shortcut\" and press a new key combination. Press Esc to cancel.", + "errorModifier": { + "mac": "Include ⌘ (Command), âŒĨ (Option), or another modifier in your shortcut.", + "windows": "Include Ctrl, Alt, or another modifier in your shortcut." + }, + "errorConflict": "Shortcut already used by {{tool}}.", + "none": "Not assigned", + "customBadge": "Custom", + "defaultLabel": "Default: {{shortcut}}", + "capturing": "Press keysâ€Ļ (Esc to cancel)", + "change": "Change shortcut", + "reset": "Reset", + "shortcut": "Shortcut", + "noShortcut": "No shortcut set", + "searchPlaceholder": "Search tools..." } }, "changeCreds": { @@ -274,8 +413,10 @@ "top20": "Top 20", "all": "All", "refresh": "Refresh", - "includeHomepage": "Include Homepage ('/')", - "includeLoginPage": "Include Login Page ('/login')", + "dataTypeLabel": "Data Type:", + "dataTypeAll": "All", + "dataTypeApi": "API", + "dataTypeUi": "UI", "totalEndpoints": "Total Endpoints", "totalVisits": "Total Visits", "showing": "Showing", @@ -290,7 +431,9 @@ "top": "Top", "numberOfVisits": "Number of Visits", "visitsTooltip": "Visits: {0} ({1}% of total)", - "retry": "Retry" + "retry": "Retry", + "includeHomepage": "Include Homepage ('/')", + "includeLoginPage": "Include Login Page ('/login')" }, "database": { "title": "Database Import/Eksport", @@ -331,22 +474,310 @@ "alphabetical": "Alphabetical", "globalPopularity": "Global Popularity", "sortBy": "Sort by:", + "mobile": { + "brandAlt": "Stirling PDF logo", + "openFiles": "Open files", + "swipeHint": "Swipe left or right to switch views", + "tools": "Tools", + "toolsSlide": "Tool selection panel", + "viewSwitcher": "Switch workspace view", + "workbenchSlide": "Workspace panel", + "workspace": "Workspace" + }, "multiTool": { + "tags": "multiple,tools", "title": "PDF Multi VÃĻrktøj", "desc": "Flet, RotÊr, OmarrangÊr og Fjern sider" }, "merge": { + "tags": "combine,join,unite", "title": "Flet", "desc": "Flet nemt flere PDF'er til Ên." }, "split": { + "tags": "divide,separate,break", "title": "Opdel", "desc": "Opdel PDF'er i flere dokumenter" }, "rotate": { + "tags": "turn,flip,orient", "title": "RotÊr", "desc": "RotÊr nemt dine PDF'er." }, + "convert": { + "tags": "transform,change", + "title": "KonvertÊr", + "desc": "Convert files between different formats" + }, + "pdfOrganiser": { + "tags": "organize,rearrange,reorder", + "title": "OrganisÊr", + "desc": "Fjern/OmarrangÊr sider i vilkÃĨrlig rÃĻkkefølge" + }, + "addImage": { + "tags": "insert,embed,place", + "title": "Tilføj billede", + "desc": "Tilføjer et billede pÃĨ en bestemt placering pÃĨ PDF'en" + }, + "addAttachments": { + "tags": "embed,attach,include", + "title": "Add Attachments", + "desc": "Add or remove embedded files (attachments) to/from a PDF" + }, + "watermark": { + "tags": "stamp,mark,overlay", + "title": "Tilføj VandmÃĻrke", + "desc": "Tilføj et brugerdefineret vandmÃĻrke til dit PDF-dokument." + }, + "removePassword": { + "tags": "unlock", + "title": "Fjern Adgangskode", + "desc": "Fjern adgangskodebeskyttelse fra dit PDF-dokument." + }, + "compress": { + "tags": "shrink,reduce,optimize", + "title": "Komprimer", + "desc": "Komprimer PDF'er for at reducere deres filstørrelse." + }, + "unlockPDFForms": { + "tags": "unlock,enable,edit", + "title": "Unlock PDF Forms", + "desc": "Remove read-only property of form fields in a PDF document." + }, + "changeMetadata": { + "tags": "edit,modify,update", + "title": "Ændre Metadata", + "desc": "Ændre/Fjern/Tilføj metadata fra et PDF-dokument" + }, + "ocr": { + "tags": "extract,scan", + "title": "OCR / Oprydning af scanninger", + "desc": "Oprydning af scanninger og genkender tekst fra billeder i en PDF og tilføjer den igen som tekst." + }, + "extractImages": { + "tags": "pull,save,export", + "title": "UdtrÃĻk Billeder", + "desc": "UdtrÃĻkker alle billeder fra en PDF og gemmer dem som zip" + }, + "scannerImageSplit": { + "tags": "detect,split,photos", + "title": "Detect & Split Scanned Photos", + "desc": "Detect and split scanned photos into separate pages" + }, + "sign": { + "tags": "signature,autograph", + "title": "Underskriv", + "desc": "Tilføjer underskrift til PDF ved tegning, tekst eller billede" + }, + "flatten": { + "tags": "simplify,remove,interactive", + "title": "UdjÃĻvn", + "desc": "Fjern alle interaktive elementer og formularer fra en PDF" + }, + "certSign": { + "tags": "authenticate,PEM,P12,official,encrypt,sign,certificate,PKCS12,JKS,server,manual,auto", + "title": "Underskriv med Certifikat", + "desc": "Underskriver en PDF med et Certifikat/Nøgle (PEM/P12)" + }, + "repair": { + "tags": "fix,restore", + "title": "ReparÊr", + "desc": "Forsøger at reparere en korrupt/ødelagt PDF" + }, + "removeBlanks": { + "tags": "delete,clean,empty", + "title": "Fjern Tomme sider", + "desc": "Detekterer og fjerner tomme sider fra et dokument" + }, + "removeAnnotations": { + "tags": "delete,clean,strip", + "title": "Fjern AnmÃĻrkninger", + "desc": "Fjerner alle kommentarer/anmÃĻrkninger fra en PDF" + }, + "compare": { + "tags": "difference", + "title": "Sammenlign", + "desc": "Sammenligner og viser forskellene mellem 2 PDF-dokumenter" + }, + "removeCertSign": { + "tags": "remove,delete,unlock", + "title": "Fjern Certifikatunderskrift", + "desc": "Fjern certifikatunderskrift fra PDF" + }, + "pageLayout": { + "tags": "layout,arrange,combine", + "title": "Multi-Side Layout", + "desc": "Flet flere sider af et PDF-dokument til en enkelt side" + }, + "bookletImposition": { + "tags": "booklet,print,binding", + "title": "Booklet Imposition", + "desc": "Create booklets with proper page ordering and multi-page layout for printing and binding" + }, + "scalePages": { + "tags": "resize,adjust,scale", + "title": "JustÊr sidestørrelse/skala", + "desc": "Ændre størrelsen/skalaen af en side og/eller dens indhold." + }, + "addPageNumbers": { + "tags": "number,pagination,count", + "title": "Tilføj Sidenumre", + "desc": "Tilføj Sidenumre gennem hele dokumentet pÃĨ et bestemt sted" + }, + "autoRename": { + "tags": "auto-detect,header-based,organize,relabel", + "title": "Auto Rename PDF File", + "desc": "Auto renames a PDF file based on its detected header" + }, + "adjustContrast": { + "tags": "contrast,brightness,saturation", + "title": "JustÊr Farver/Kontrast", + "desc": "JustÊr Kontrast, MÃĻtning og Lysstyrke af en PDF" + }, + "crop": { + "tags": "trim,cut,resize", + "title": "BeskÃĻr PDF", + "desc": "BeskÃĻr en PDF for at reducere dens størrelse (bevarer tekst!)" + }, + "autoSplitPDF": { + "tags": "auto,split,QR", + "title": "Auto Opdel Sider", + "desc": "Auto Opdel Scannede PDF'er med fysisk scannet side-splitter QR-kode" + }, + "sanitize": { + "tags": "clean,purge,remove", + "title": "Sanitise", + "desc": "Remove potentially harmful elements from PDF files" + }, + "getPdfInfo": { + "tags": "info,metadata,details", + "title": "FÃĨ ALLE Oplysninger om PDF", + "desc": "Henter alle mulige oplysninger om PDF'er" + }, + "pdfToSinglePage": { + "tags": "combine,merge,single", + "title": "PDF til Enkelt Stor Side", + "desc": "Fletter alle PDF-sider til Ên stor enkelt side" + }, + "showJS": { + "tags": "javascript,code,script", + "title": "Vis Javascript", + "desc": "Søger og viser eventuelt JS indsprøjtet i en PDF" + }, + "redact": { + "tags": "censor,blackout,hide", + "title": "Manual Redaction", + "desc": "Redacts a PDF based on selected text, drawn shapes and/or selected page(s)" + }, + "splitBySections": { + "tags": "split,sections,divide", + "title": "Split PDF by Sections", + "desc": "Divide each page of a PDF into smaller horizontal and vertical sections" + }, + "addStamp": { + "tags": "stamp,mark,seal", + "title": "Add Stamp to PDF", + "desc": "Add text or add image stamps at set locations" + }, + "removeImage": { + "tags": "remove,delete,clean", + "title": "Fjern billede", + "desc": "Fjern billede fra PDF for at reducere filstørrelse" + }, + "splitByChapters": { + "tags": "split,chapters,structure", + "title": "Partitioner PDF efter kapitler", + "desc": "Partitioner en PDF i flere filer baseret pÃĨ dens kapitelstruktur." + }, + "validateSignature": { + "tags": "validate,verify,certificate", + "title": "Validate PDF Signature", + "desc": "Verify digital signatures and certificates in PDF documents" + }, + "swagger": { + "tags": "API,documentation,test", + "title": "API Documentation", + "desc": "View API documentation and test endpoints" + }, + "scannerEffect": { + "tags": "scan,simulate,create", + "title": "Scanner Effect", + "desc": "Create a PDF that looks like it was scanned" + }, + "editTableOfContents": { + "tags": "bookmarks,contents,edit", + "title": "Edit Table of Contents", + "desc": "Add or edit bookmarks and table of contents in PDF documents" + }, + "manageCertificates": { + "tags": "certificates,import,export", + "title": "Manage Certificates", + "desc": "Import, export, or delete digital certificate files used for signing PDFs." + }, + "read": { + "tags": "view,open,display", + "title": "Read", + "desc": "View and annotate PDFs. Highlight text, draw, or insert comments for review and collaboration." + }, + "reorganizePages": { + "tags": "rearrange,reorder,organize", + "title": "Reorganize Pages", + "desc": "Rearrange, duplicate, or delete PDF pages with visual drag-and-drop control." + }, + "extractPages": { + "tags": "pull,select,copy", + "title": "UdtrÃĻk Sider", + "desc": "Extract specific pages from a PDF document" + }, + "removePages": { + "tags": "delete,extract,exclude", + "title": "Fjern", + "desc": "Slet uønskede sider fra dit PDF-dokument." + }, + "autoSizeSplitPDF": { + "tags": "auto,split,size", + "title": "Auto Opdel efter Størrelse/Antal", + "desc": "Opdel en enkelt PDF i flere dokumenter baseret pÃĨ størrelse, sideantal eller dokumentantal" + }, + "replaceColor": { + "title": "Replace & Invert Colour", + "desc": "Replace or invert colours in PDF documents" + }, + "devApi": { + "tags": "API,development,documentation", + "title": "API", + "desc": "Link to API documentation" + }, + "devFolderScanning": { + "tags": "automation,folder,scanning", + "title": "Automated Folder Scanning", + "desc": "Link to automated folder scanning guide" + }, + "devSsoGuide": { + "title": "SSO Guide", + "desc": "Link to SSO guide" + }, + "devAirgapped": { + "title": "Air-gapped Setup", + "desc": "Link to air-gapped setup guide" + }, + "addPassword": { + "title": "Tilføj Adgangskode", + "desc": "KryptÊr dit PDF-dokument med en adgangskode." + }, + "changePermissions": { + "title": "Ændre Tilladelser", + "desc": "Change document restrictions and permissions" + }, + "automate": { + "tags": "workflow,sequence,automation", + "title": "Automate", + "desc": "Build multi-step workflows by chaining together PDF actions. Ideal for recurring tasks." + }, + "overlay-pdfs": { + "desc": "Overlejrer PDF'er oven pÃĨ en anden PDF", + "title": "Overlejr PDF'er" + }, "imageToPDF": { "title": "Billede til PDF", "desc": "KonvertÊr et billede (PNG, JPEG, GIF) til PDF." @@ -355,18 +786,6 @@ "title": "PDF til Billede", "desc": "KonvertÊr en PDF til et billede. (PNG, JPEG, GIF)" }, - "pdfOrganiser": { - "title": "OrganisÊr", - "desc": "Fjern/OmarrangÊr sider i vilkÃĨrlig rÃĻkkefølge" - }, - "addImage": { - "title": "Tilføj billede", - "desc": "Tilføjer et billede pÃĨ en bestemt placering pÃĨ PDF'en" - }, - "watermark": { - "title": "Tilføj VandmÃĻrke", - "desc": "Tilføj et brugerdefineret vandmÃĻrke til dit PDF-dokument." - }, "permissions": { "title": "Ændre Tilladelser", "desc": "Ændre tilladelserne for dit PDF-dokument" @@ -375,38 +794,10 @@ "title": "Fjern", "desc": "Slet uønskede sider fra dit PDF-dokument." }, - "addPassword": { - "title": "Tilføj Adgangskode", - "desc": "KryptÊr dit PDF-dokument med en adgangskode." - }, - "removePassword": { - "title": "Fjern Adgangskode", - "desc": "Fjern adgangskodebeskyttelse fra dit PDF-dokument." - }, - "compress": { - "title": "Komprimer", - "desc": "Komprimer PDF'er for at reducere deres filstørrelse." - }, - "unlockPDFForms": { - "title": "Unlock PDF Forms", - "desc": "Remove read-only property of form fields in a PDF document." - }, - "changeMetadata": { - "title": "Ændre Metadata", - "desc": "Ændre/Fjern/Tilføj metadata fra et PDF-dokument" - }, "fileToPDF": { "title": "KonvertÊr fil til PDF", "desc": "KonvertÊr nÃĻsten enhver fil til PDF (DOCX, PNG, XLS, PPT, TXT og mere)" }, - "ocr": { - "title": "OCR / Oprydning af scanninger", - "desc": "Oprydning af scanninger og genkender tekst fra billeder i en PDF og tilføjer den igen som tekst." - }, - "extractImages": { - "title": "UdtrÃĻk Billeder", - "desc": "UdtrÃĻkker alle billeder fra en PDF og gemmer dem som zip" - }, "pdfToPDFA": { "title": "PDF til PDF/A", "desc": "KonvertÊr PDF til PDF/A for langtidsopbevaring" @@ -435,70 +826,14 @@ "title": "DetektÊr/Opdel Scannede fotosb", "desc": "Opdeler flere fotos fra et enkelt foto/PDF" }, - "sign": { - "title": "Underskriv", - "desc": "Tilføjer underskrift til PDF ved tegning, tekst eller billede" - }, - "flatten": { - "title": "UdjÃĻvn", - "desc": "Fjern alle interaktive elementer og formularer fra en PDF" - }, - "repair": { - "title": "ReparÊr", - "desc": "Forsøger at reparere en korrupt/ødelagt PDF" - }, - "removeBlanks": { - "title": "Fjern Tomme sider", - "desc": "Detekterer og fjerner tomme sider fra et dokument" - }, - "removeAnnotations": { - "title": "Fjern AnmÃĻrkninger", - "desc": "Fjerner alle kommentarer/anmÃĻrkninger fra en PDF" - }, - "compare": { - "title": "Sammenlign", - "desc": "Sammenligner og viser forskellene mellem 2 PDF-dokumenter" - }, - "certSign": { - "title": "Underskriv med Certifikat", - "desc": "Underskriver en PDF med et Certifikat/Nøgle (PEM/P12)" - }, - "removeCertSign": { - "title": "Fjern Certifikatunderskrift", - "desc": "Fjern certifikatunderskrift fra PDF" - }, - "pageLayout": { - "title": "Multi-Side Layout", - "desc": "Flet flere sider af et PDF-dokument til en enkelt side" - }, - "scalePages": { - "title": "JustÊr sidestørrelse/skala", - "desc": "Ændre størrelsen/skalaen af en side og/eller dens indhold." - }, "pipeline": { "title": "Pipeline (Avanceret)", "desc": "Kør flere handlinger pÃĨ PDF'er ved at definere pipeline-scripts" }, - "addPageNumbers": { - "title": "Tilføj Sidenumre", - "desc": "Tilføj Sidenumre gennem hele dokumentet pÃĨ et bestemt sted" - }, "auto-rename": { "title": "Auto Omdøb PDF-fil", "desc": "Auto omdøber en PDF-fil baseret pÃĨ dens detekterede overskrift" }, - "adjustContrast": { - "title": "JustÊr Farver/Kontrast", - "desc": "JustÊr Kontrast, MÃĻtning og Lysstyrke af en PDF" - }, - "crop": { - "title": "BeskÃĻr PDF", - "desc": "BeskÃĻr en PDF for at reducere dens størrelse (bevarer tekst!)" - }, - "autoSplitPDF": { - "title": "Auto Opdel Sider", - "desc": "Auto Opdel Scannede PDF'er med fysisk scannet side-splitter QR-kode" - }, "sanitizePDF": { "title": "Rens", "desc": "Fjern scripts og andre elementer fra PDF-filer" @@ -519,30 +854,14 @@ "title": "PDF to Markdown", "desc": "Converts any PDF to Markdown" }, - "getPdfInfo": { - "title": "FÃĨ ALLE Oplysninger om PDF", - "desc": "Henter alle mulige oplysninger om PDF'er" - }, "pageExtracter": { "title": "UdtrÃĻk side(r)", "desc": "UdtrÃĻkker udvalgte sider fra PDF" }, - "pdfToSinglePage": { - "title": "PDF til Enkelt Stor Side", - "desc": "Fletter alle PDF-sider til Ên stor enkelt side" - }, - "showJS": { - "title": "Vis Javascript", - "desc": "Søger og viser eventuelt JS indsprøjtet i en PDF" - }, "autoRedact": { "title": "Auto Rediger", "desc": "Auto Redigerer (SvÃĻrter) tekst i en PDF baseret pÃĨ input tekst" }, - "redact": { - "title": "Manual Redaction", - "desc": "Redacts a PDF based on selected text, drawn shapes and/or selected page(s)" - }, "PDFToCSV": { "title": "PDF til CSV", "desc": "UdtrÃĻkker Tabeller fra en PDF og konverterer dem til CSV" @@ -551,10 +870,6 @@ "title": "Auto Opdel efter Størrelse/Antal", "desc": "Opdel en enkelt PDF i flere dokumenter baseret pÃĨ størrelse, sideantal eller dokumentantal" }, - "overlay-pdfs": { - "title": "Overlejr PDF'er", - "desc": "Overlejrer PDF'er oven pÃĨ en anden PDF" - }, "split-by-sections": { "title": "Opdel PDF efter Sektioner", "desc": "Opdel hver side af en PDF i mindre horisontale og vertikale sektioner" @@ -563,43 +878,17 @@ "title": "Tilføj Stempel til PDF", "desc": "Tilføj tekst eller tilføj billedstempel pÃĨ bestemte placeringer" }, - "removeImage": { - "title": "Fjern billede", - "desc": "Fjern billede fra PDF for at reducere filstørrelse" - }, - "splitByChapters": { - "title": "Partitioner PDF efter kapitler", - "desc": "Partitioner en PDF i flere filer baseret pÃĨ dens kapitelstruktur." - }, - "validateSignature": { - "title": "Validate PDF Signature", - "desc": "Verify digital signatures and certificates in PDF documents" - }, "replace-color": { "title": "Replace and Invert Color", "desc": "Erstatt farve for tekst og baggrund i en PDF og omgivende farve til fuld farve af PDF for at redusere filstørrelsen." }, - "convert": { - "title": "KonvertÊr" - }, "attachments": { "title": "Add attachments" }, - "extractPages": { - "title": "UdtrÃĻk Sider" - }, - "removePages": { - "title": "Fjern", - "desc": "Slet uønskede sider fra dit PDF-dokument." - }, "removeImagePdf": { "title": "Fjern billede", "desc": "Fjern billede fra PDF for at reducere filstørrelse" }, - "autoSizeSplitPDF": { - "title": "Auto Opdel efter Størrelse/Antal", - "desc": "Opdel en enkelt PDF i flere dokumenter baseret pÃĨ størrelse, sideantal eller dokumentantal" - }, "adjust-contrast": { "title": "JustÊr Farver/Kontrast", "desc": "JustÊr Kontrast, MÃĻtning og Lysstyrke af en PDF" @@ -607,11 +896,12 @@ "replaceColorPdf": { "title": "Replace and Invert Color", "desc": "Erstatt farve for tekst og baggrund i en PDF og omgivende farve til fuld farve af PDF for at redusere filstørrelsen." - }, - "changePermissions": { - "title": "Ændre Tilladelser" } }, + "landing": { + "addFiles": "Add Files", + "uploadFromComputer": "Upload from computer" + }, "viewPdf": { "tags": "se,lÃĻs,annotÊr,tekst,billede", "title": "View/Edit PDF", @@ -645,17 +935,39 @@ "merge": { "tags": "flet,Sideoperationer,Back end,server side", "title": "Flet", + "removeDigitalSignature": { + "label": "Remove digital signature in the merged file?", + "tooltip": { + "title": "Remove Digital Signature", + "description": "Digital signatures will be invalidated when merging files. Check this to remove them from the final merged PDF." + } + }, + "generateTableOfContents": { + "label": "Generate table of contents in the merged file?", + "tooltip": { + "title": "Generate Table of Contents", + "description": "Automatically creates a clickable table of contents in the merged PDF based on the original file names and page numbers." + } + }, + "submit": "Flet", + "sortBy": { + "description": "Files will be merged in the order they're selected. Drag to reorder or sort below.", + "label": "Sort By", + "filename": "Filnavn", + "dateModified": "Date Modified", + "ascending": "Ascending", + "descending": "Descending", + "sort": "Sort" + }, + "error": { + "failed": "An error occurred while merging the PDFs." + }, "header": "Flet flere PDF'er (2+)", "sortByName": "SortÊr efter navn", "sortByDate": "SortÊr efter dato", - "removeCertSign": "Fjern digital signatur i den flettede fil?", - "submit": "Flet", - "sortBy": { - "filename": "Filnavn" - } + "removeCertSign": "Fjern digital signatur i den flettede fil?" }, "split": { - "tags": "Sideoperationer,opdel,Multi Side,klip,server side", "title": "Opdel PDF", "header": "Opdel PDF", "desc": { @@ -671,25 +983,249 @@ "splitPages": "Indtast sider at opdele pÃĨ:", "submit": "Opdel", "steps": { + "chooseMethod": "Choose Method", "settings": "Indstillinger" }, + "settings": { + "selectMethodFirst": "Please select a split method first" + }, + "error": { + "failed": "An error occurred while splitting the PDF." + }, + "method": { + "label": "Choose split method", + "placeholder": "Select how to split the PDF" + }, "methods": { + "prefix": { + "splitAt": "Split at", + "splitBy": "Split by" + }, + "byPages": { + "name": "Page Numbers", + "desc": "Extract specific pages (1,3,5-10)", + "tooltip": "Enter page numbers separated by commas or ranges with hyphens" + }, + "bySections": { + "name": "Sections", + "desc": "Divide pages into grid sections", + "tooltip": "Split each page into horizontal and vertical sections" + }, "bySize": { - "name": "Filstørrelse" + "name": "Filstørrelse", + "desc": "Limit maximum file size", + "tooltip": "Specify maximum file size (e.g. 10MB, 500KB)" + }, + "byPageCount": { + "name": "Page Count", + "desc": "Fixed pages per file", + "tooltip": "Enter the number of pages for each split file" + }, + "byDocCount": { + "name": "Document Count", + "desc": "Create specific number of files", + "tooltip": "Enter how many files you want to create" + }, + "byChapters": { + "name": "Chapters", + "desc": "Split at bookmark boundaries", + "tooltip": "Uses PDF bookmarks to determine split points" + }, + "byPageDivider": { + "name": "Page Divider", + "desc": "Auto-split with divider sheets", + "tooltip": "Use QR code divider sheets between documents when scanning" } }, "value": { "fileSize": { - "label": "Filstørrelse" + "label": "Filstørrelse", + "placeholder": "e.g. 10MB, 500KB" + }, + "pageCount": { + "label": "Pages per File", + "placeholder": "e.g. 5, 10" + }, + "docCount": { + "label": "Number of Files", + "placeholder": "e.g. 3, 5" } - } + }, + "tooltip": { + "header": { + "title": "Split Methods Overview" + }, + "byPages": { + "title": "Split at Page Numbers", + "text": "Split your PDF at specific page numbers. Using 'n' splits after page n. Using 'n-m' splits before page n and after page m.", + "bullet1": "Single split points: 3,7 (splits after pages 3 and 7)", + "bullet2": "Range split points: 3-8 (splits before page 3 and after page 8)", + "bullet3": "Mixed: 2,5-10,15 (splits after page 2, before page 5, after page 10, and after page 15)" + }, + "bySections": { + "title": "Split by Grid Sections", + "text": "Divide each page into a grid of sections. Useful for splitting documents with multiple columns or extracting specific areas.", + "bullet1": "Horizontal: Number of rows to create", + "bullet2": "Vertical: Number of columns to create", + "bullet3": "Merge: Combine all sections into one PDF" + }, + "bySize": { + "title": "Split by File Size", + "text": "Create multiple PDFs that don't exceed a specified file size. Ideal for file size limitations or email attachments.", + "bullet1": "Use MB for larger files (e.g., 10MB)", + "bullet2": "Use KB for smaller files (e.g., 500KB)", + "bullet3": "System will split at page boundaries" + }, + "byCount": { + "title": "Split by Count", + "text": "Create multiple PDFs with a specific number of pages or documents each.", + "bullet1": "Page Count: Fixed number of pages per file", + "bullet2": "Document Count: Fixed number of output files", + "bullet3": "Useful for batch processing workflows" + }, + "byChapters": { + "title": "Split by Chapters", + "text": "Use PDF bookmarks to automatically split at chapter boundaries. Requires PDFs with bookmark structure.", + "bullet1": "Bookmark Level: Which level to split on (1=top level)", + "bullet2": "Include Metadata: Preserve document properties", + "bullet3": "Allow Duplicates: Handle repeated bookmark names" + }, + "byDocCount": { + "bullet1": "Enter the number of output files you want", + "bullet2": "Pages are distributed as evenly as possible", + "bullet3": "Useful when you need a specific number of files", + "text": "Create a specific number of output files by evenly distributing pages across them.", + "title": "Split by Document Count" + }, + "byPageCount": { + "bullet1": "Enter the number of pages per output file", + "bullet2": "Last file may have fewer pages if not evenly divisible", + "bullet3": "Useful for batch processing workflows", + "text": "Create multiple PDFs with a specific number of pages each. Perfect for creating uniform document chunks.", + "title": "Split by Page Count" + }, + "byPageDivider": { + "bullet1": "Print divider sheets from the download link", + "bullet2": "Insert divider sheets between your documents", + "bullet3": "Scan all documents together as one PDF", + "bullet4": "Upload - divider pages are automatically detected and removed", + "bullet5": "Enable Duplex Mode if scanning both sides of divider sheets", + "text": "Automatically split scanned documents using physical divider sheets with QR codes. Perfect for processing multiple documents scanned together.", + "title": "Split by Page Divider" + } + }, + "methodSelection": { + "tooltip": { + "bullet1": "Click on a method card to select it", + "bullet2": "Hover over each card to see a quick description", + "bullet3": "The settings step will appear after you select a method", + "bullet4": "You can change methods at any time before processing", + "header": { + "text": "Choose how you want to split your PDF document. Each method is optimized for different use cases and document types.", + "title": "Split Method Selection" + }, + "title": "Choose Your Split Method" + } + }, + "selectMethod": "Select a split method", + "tags": "Sideoperationer,opdel,Multi Side,klip,server side" }, "rotate": { - "tags": "server side", "title": "RotÊr PDF", + "submit": "RotÊr", + "selectRotation": "Select Rotation Angle (Clockwise)", + "error": { + "failed": "An error occurred while rotating the PDF." + }, + "preview": { + "title": "Rotation Preview" + }, + "rotateLeft": "Rotate Anticlockwise", + "rotateRight": "Rotate Clockwise", + "tooltip": { + "header": { + "title": "Rotate Settings Overview" + }, + "description": { + "text": "Rotate your PDF pages clockwise or anticlockwise in 90-degree increments. All pages in the PDF will be rotated. The preview shows how your document will look after rotation." + }, + "controls": { + "title": "Controls", + "text": "Use the rotation buttons to adjust orientation. Left button rotates anticlockwise, right button rotates clockwise. Each click rotates by 90 degrees." + } + }, + "tags": "server side", "header": "RotÊr PDF", - "selectAngle": "VÃĻlg rotationsvinkel (i multipla af 90 grader):", - "submit": "RotÊr" + "selectAngle": "VÃĻlg rotationsvinkel (i multipla af 90 grader):" + }, + "convert": { + "title": "KonvertÊr", + "desc": "Convert files between different formats", + "files": "Files", + "selectFilesPlaceholder": "Select files in the main view to get started", + "settings": "Indstillinger", + "conversionCompleted": "Conversion completed", + "results": "Results", + "defaultFilename": "converted_file", + "conversionResults": "Conversion Results", + "convertFrom": "Convert from", + "convertTo": "Convert to", + "sourceFormatPlaceholder": "Source format", + "targetFormatPlaceholder": "Target format", + "selectSourceFormatFirst": "Select a source format first", + "outputOptions": "Output Options", + "pdfOptions": "PDF Options", + "imageOptions": "Image Options", + "colorType": "Colour Type", + "color": "Farve", + "greyscale": "GrÃĨtone", + "blackwhite": "Black & White", + "dpi": "DPI", + "output": "Output", + "single": "Single", + "multiple": "Multiple", + "fitOption": "Fit Option", + "maintainAspectRatio": "Maintain Aspect Ratio", + "fitDocumentToPage": "Fit Document to Page", + "fillPage": "Udfyld Side", + "autoRotate": "Auto Rotate", + "autoRotateDescription": "Automatically rotate images to better fit the PDF page", + "combineImages": "Combine Images", + "combineImagesDescription": "Combine all images into one PDF, or create separate PDFs for each image", + "webOptions": "Web to PDF Options", + "zoomLevel": "Zoom Level", + "emailOptions": "Email to PDF Options", + "includeAttachments": "Include email attachments", + "maxAttachmentSize": "Maximum attachment size (MB)", + "includeAllRecipients": "Include CC and BCC recipients in header", + "downloadHtml": "Download HTML intermediate file instead of PDF", + "pdfaOptions": "PDF/A Options", + "outputFormat": "Output Format", + "pdfaNote": "PDF/A-1b is more compatible, PDF/A-2b supports more features.", + "pdfaDigitalSignatureWarning": "PDF'en indeholder en digital signatur. Dette vil blive fjernet i nÃĻste trin.", + "fileFormat": "File Format", + "wordDoc": "Word Document", + "wordDocExt": "Word Document (.docx)", + "odtExt": "OpenDocument Text (.odt)", + "pptExt": "PowerPoint (.pptx)", + "odpExt": "OpenDocument Presentation (.odp)", + "txtExt": "Plain Text (.txt)", + "rtfExt": "Rich Text Format (.rtf)", + "selectedFiles": "Selected files", + "noFileSelected": "No file selected. Use the file panel to add files.", + "convertFiles": "Convert Files", + "converting": "Converting...", + "downloadConverted": "Download Converted File", + "errorNoFiles": "Please select at least one file to convert.", + "errorNoFormat": "Please select both source and target formats.", + "errorNotSupported": "Conversion from {{from}} to {{to}} is not supported.", + "images": "Images", + "officeDocs": "Office Documents (Word, Excel, PowerPoint)", + "imagesExt": "Images (JPG, PNG, etc.)", + "markdown": "Markdown", + "textRtf": "Text/RTF", + "grayscale": "GrÃĨtone", + "errorConversion": "An error occurred while converting the file." }, "imageToPdf": { "tags": "konvertering,img,jpg,billede,foto" @@ -727,7 +1263,33 @@ "8": "Fjern Sidste", "9": "Fjern Første og Sidste", "10": "Ulige-Lige Sammenføjning", - "11": "Duplicate all pages" + "11": "Duplicate all pages", + "desc": { + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, â€Ļ).", + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, â€Ļ).", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimized for binding on the side)." + } + }, + "desc": { + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, â€Ļ).", + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, â€Ļ).", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimised for binding on the side).", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document." }, "placeholder": "(f.eks. 1,3,2 eller 4-8,2,10-12 eller 2n-1)" }, @@ -739,9 +1301,198 @@ "upload": "Tilføj billede", "submit": "Tilføj billede" }, + "attachments": { + "tags": "embed,attach,file,attachment,attachments", + "title": "Add attachments", + "header": "Add attachments", + "add": "Add Attachment", + "remove": "Remove Attachment", + "embed": "Embed Attachment", + "submit": "Add attachments" + }, "watermark": { - "tags": "Tekst,gentagne,etiket,egen,ophavsret,varemÃĻrke,img,jpg,billede,foto", "title": "Tilføj VandmÃĻrke", + "desc": "Add text or image watermarks to PDF files", + "completed": "Watermark added", + "submit": "Tilføj VandmÃĻrke", + "filenamePrefix": "watermarked", + "error": { + "failed": "An error occurred while adding watermark to the PDF." + }, + "watermarkType": { + "text": "Tekst", + "image": "Image" + }, + "settings": { + "type": "Watermark Type", + "text": { + "label": "Watermark Text", + "placeholder": "Enter watermark text" + }, + "image": { + "label": "Watermark Image", + "choose": "Choose Image", + "selected": "Selected: {{filename}}" + }, + "fontSize": "Skriftstørrelse", + "size": "Size", + "alphabet": "Font/Language", + "color": "Watermark Colour", + "rotation": "Rotation (degrees)", + "opacity": "Opacity (%)", + "spacing": { + "horizontal": "Horizontal Spacing", + "vertical": "Vertical Spacing", + "height": "Height Spacing", + "width": "Width Spacing" + }, + "convertToImage": "Flatten PDF pages to images" + }, + "alphabet": { + "roman": "Roman/Latin", + "arabic": "Arabic", + "japanese": "Japanese", + "korean": "Korean", + "chinese": "Chinese", + "thai": "Thai" + }, + "steps": { + "type": "Watermark Type", + "wording": "Wording", + "textStyle": "Style", + "formatting": "Formatting", + "file": "Watermark File" + }, + "results": { + "title": "Watermark Results" + }, + "tooltip": { + "language": { + "title": "Language Support", + "text": "Choose the appropriate language setting to ensure proper font rendering for your text." + }, + "appearance": { + "title": "Appearance Settings", + "text": "Control how your watermark looks and blends with the document.", + "bullet1": "Rotation: -360° to 360° for angled watermarks", + "bullet2": "Opacity: 0-100% for transparency control", + "bullet3": "Lower opacity creates subtle watermarks" + }, + "spacing": { + "title": "Spacing Control", + "text": "Adjust the spacing between repeated watermarks across the page.", + "bullet1": "Width spacing: Horizontal distance between watermarks", + "bullet2": "Height spacing: Vertical distance between watermarks", + "bullet3": "Higher values create more spread out patterns" + }, + "type": { + "header": { + "title": "Watermark Type Selection" + }, + "description": { + "title": "Choose Your Watermark", + "text": "Select between text or image watermarks based on your needs." + }, + "text": { + "title": "Text Watermarks", + "text": "Perfect for adding copyright notices, company names, or confidentiality labels. Supports multiple languages and custom colours.", + "bullet1": "Customisable fonts and languages", + "bullet2": "Adjustable colours and transparency", + "bullet3": "Ideal for legal or branding text" + }, + "image": { + "title": "Image Watermarks", + "text": "Use logos, stamps, or any image as a watermark. Great for branding and visual identification.", + "bullet1": "Upload any image format", + "bullet2": "Maintains image quality", + "bullet3": "Perfect for logos and stamps" + } + }, + "wording": { + "header": { + "title": "Text Content" + }, + "text": { + "title": "Watermark Text", + "text": "Enter the text that will appear as your watermark across the document.", + "bullet1": "Keep it concise for better readability", + "bullet2": "Common examples: 'CONFIDENTIAL', 'DRAFT', company name", + "bullet3": "Emoji characters are not supported and will be filtered out" + } + }, + "textStyle": { + "header": { + "title": "Text Style" + }, + "color": { + "title": "Colour Selection", + "text": "Choose a colour that provides good contrast with your document content.", + "bullet1": "Light grey (#d3d3d3) for subtle watermarks", + "bullet2": "Black or dark colours for high contrast", + "bullet3": "Custom colours for branding purposes" + }, + "language": { + "title": "Language Support", + "text": "Choose the appropriate language setting to ensure proper font rendering." + } + }, + "file": { + "header": { + "title": "Image Upload" + }, + "upload": { + "title": "Image Selection", + "text": "Upload an image file to use as your watermark.", + "bullet1": "Supports common formats: PNG, JPG, GIF, BMP", + "bullet2": "PNG with transparency works best", + "bullet3": "Higher resolution images maintain quality better" + }, + "recommendations": { + "title": "Best Practices", + "text": "Tips for optimal image watermark results.", + "bullet1": "Use logos or stamps with transparent backgrounds", + "bullet2": "Simple designs work better than complex images", + "bullet3": "Consider the final document size when choosing resolution" + } + }, + "formatting": { + "header": { + "title": "Formatting & Layout" + }, + "size": { + "title": "Size Control", + "text": "Adjust the size of your watermark (text or image).", + "bullet1": "Larger sizes create more prominent watermarks" + }, + "appearance": { + "title": "Appearance Settings", + "text": "Control how your watermark looks and blends with the document.", + "bullet1": "Rotation: -360° to 360° for angled watermarks", + "bullet2": "Opacity: 0-100% for transparency control", + "bullet3": "Lower opacity creates subtle watermarks" + }, + "spacing": { + "title": "Spacing Control", + "text": "Adjust the spacing between repeated watermarks across the page.", + "bullet1": "Horizontal spacing: Distance between watermarks left to right", + "bullet2": "Vertical spacing: Distance between watermarks top to bottom", + "bullet3": "Higher values create more spread out patterns" + }, + "security": { + "title": "Security Option", + "text": "Convert the final PDF to an image-based format for enhanced security.", + "bullet1": "Prevents text selection and copying", + "bullet2": "Makes watermarks harder to remove", + "bullet3": "Results in larger file sizes", + "bullet4": "Best for sensitive or copyrighted content" + } + } + }, + "type": { + "1": "Tekst", + "2": "Billede" + }, + "tags": "Tekst,gentagne,etiket,egen,ophavsret,varemÃĻrke,img,jpg,billede,foto", "header": "Tilføj VandmÃĻrke", "customColor": "Brugerdefineret Tekstfarve", "selectText": { @@ -755,17 +1506,6 @@ "8": "VandmÃĻrketype:", "9": "VandmÃĻrkebillede:", "10": "KonvertÊr PDF til PDF-Billede" - }, - "submit": "Tilføj VandmÃĻrke", - "type": { - "1": "Tekst", - "2": "Billede" - }, - "watermarkType": { - "text": "Tekst" - }, - "settings": { - "fontSize": "Skriftstørrelse" } }, "permissions": { @@ -790,50 +1530,201 @@ "removePages": { "tags": "Fjern sider,slet sider", "title": "Fjern", + "pageNumbers": { + "label": "Pages to Remove", + "placeholder": "e.g., 1,3,5-8,10", + "error": "Invalid page number format. Use numbers, ranges (1-5), or mathematical expressions (2n+1)" + }, + "filenamePrefix": "pages_removed", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "settings": { + "title": "Settings" + }, + "tooltip": { + "header": { + "title": "Remove Pages Settings" + }, + "pageNumbers": { + "title": "Page Selection", + "text": "Specify which pages to remove from your PDF. You can select individual pages, ranges, or use mathematical expressions.", + "bullet1": "Individual pages: 1,3,5 (removes pages 1, 3, and 5)", + "bullet2": "Page ranges: 1-5,10-15 (removes pages 1-5 and 10-15)", + "bullet3": "Mathematical: 2n+1 (removes odd pages)", + "bullet4": "Open ranges: 5- (removes from page 5 to end)" + }, + "examples": { + "title": "Common Examples", + "text": "Here are some common page selection patterns:", + "bullet1": "Remove first page: 1", + "bullet2": "Remove last 3 pages: -3", + "bullet3": "Remove every other page: 2n", + "bullet4": "Remove specific scattered pages: 1,5,10,15" + }, + "safety": { + "title": "Safety Tips", + "text": "Important considerations when removing pages:", + "bullet1": "Always preview your selection before processing", + "bullet2": "Keep a backup of your original file", + "bullet3": "Page numbers start from 1, not 0", + "bullet4": "Invalid page numbers will be ignored" + } + }, + "error": { + "failed": "An error occurred whilst removing pages." + }, + "results": { + "title": "Page Removal Results" + }, "submit": "Fjern" }, - "addPassword": { - "tags": "sikker,sikkerhed", - "title": "Tilføj Adgangskode", - "header": "Tilføj adgangskode (KryptÊr)", - "selectText": { - "1": "VÃĻlg PDF til kryptering", - "2": "Brugeradgangskode", - "3": "KrypteringsnøglelÃĻngde", - "4": "Højere vÃĻrdier er stÃĻrkere, men lavere vÃĻrdier har bedre kompatibilitet.", - "5": "Tilladelser at indstille (Anbefales at bruges sammen med Ejer adgangskode)", - "6": "Forhindre samling af dokument", - "7": "Forhindre indholdsudtrÃĻkning", - "8": "Forhindre udtrÃĻkning for tilgÃĻngelighed", - "9": "Forhindre udfyldning af formular", - "10": "Forhindre ÃĻndring", - "11": "Forhindre anmÃĻrkningsÃĻndring", - "12": "Forhindre udskrivning", - "13": "Forhindre udskrivning af forskellige formater", - "14": "Ejer Adgangskode", - "15": "BegrÃĻnser hvad der kan gøres med dokumentet, nÃĨr det er ÃĨbnet (Understøttes ikke af alle lÃĻsere)", - "16": "BegrÃĻnser ÃĨbningen af selve dokumentet" + "extractPages": { + "title": "Extract Pages", + "pageNumbers": { + "label": "Pages to Extract", + "placeholder": "e.g., 1,3,5-8 or odd & 1-10" + }, + "settings": { + "title": "Settings" }, - "submit": "KryptÊr", "tooltip": { - "permissions": { - "title": "Ændre Tilladelser" + "description": "Extracts the selected pages into a new PDF, preserving order." + }, + "error": { + "failed": "Failed to extract pages" + }, + "results": { + "title": "Pages Extracted" + }, + "submit": "Extract Pages" + }, + "pageSelection": { + "tooltip": { + "header": { + "title": "Page Selection Guide" + }, + "basic": { + "title": "Basic Usage", + "text": "Select specific pages from your PDF document using simple syntax.", + "bullet1": "Individual pages: 1,3,5", + "bullet2": "Page ranges: 3-6 or 10-15", + "bullet3": "All pages: all" + }, + "advanced": { + "title": "Advanced Features" + }, + "tips": { + "title": "Tips", + "text": "Keep these guidelines in mind:", + "bullet1": "Page numbers start from 1 (not 0)", + "bullet2": "Spaces are automatically removed", + "bullet3": "Invalid expressions are ignored" + }, + "syntax": { + "title": "Syntax Basics", + "text": "Use numbers, ranges, keywords, and progressions (n starts at 0). Parentheses are supported.", + "bullets": { + "numbers": "Numbers/ranges: 5, 10-20", + "keywords": "Keywords: odd, even", + "progressions": "Progressions: 3n, 4n+1" + } + }, + "operators": { + "title": "Operators", + "text": "AND has higher precedence than comma. NOT applies within the document range.", + "and": "AND: & or \"and\" — require both conditions (e.g., 1-50 & even)", + "comma": "Comma: , or | — combine selections (e.g., 1-10, 20)", + "not": "NOT: ! or \"not\" — exclude pages (e.g., 3n & not 30)" + }, + "examples": { + "title": "Examples" + }, + "complex": { + "bullet1": "1,3-5,8,2n → pages 1, 3–5, 8, plus evens", + "bullet2": "10-,2n-1 → from page 10 to end + odd pages", + "description": "Mix different types.", + "title": "Complex Combinations" + }, + "description": "Choose which pages to use for the operation. Supports single pages, ranges, formulas, and the all keyword.", + "individual": { + "bullet1": "1,3,5 → selects pages 1, 3, 5", + "bullet2": "2,7,12 → selects pages 2, 7, 12", + "description": "Enter numbers separated by commas.", + "title": "Individual Pages" + }, + "mathematical": { + "bullet1": "2n → all even pages (2, 4, 6â€Ļ)", + "bullet2": "2n-1 → all odd pages (1, 3, 5â€Ļ)", + "bullet3": "3n → every 3rd page (3, 6, 9â€Ļ)", + "bullet4": "4n-1 → pages 3, 7, 11, 15â€Ļ", + "description": "Use n in formulas for patterns.", + "title": "Mathematical Functions" + }, + "ranges": { + "bullet1": "3-6 → selects pages 3–6", + "bullet2": "10-15 → selects pages 10–15", + "bullet3": "5- → selects pages 5 to end", + "description": "Use - for consecutive pages.", + "title": "Page Ranges" + }, + "special": { + "bullet1": "all → selects all pages", + "title": "Special Keywords" } } }, - "removePassword": { - "tags": "sikker,DekryptÊr,sikkerhed,fjern adgangskode,slet adgangskode", - "title": "Fjern adgangskode", - "header": "Fjern adgangskode (DekryptÊr)", - "selectText": { - "1": "VÃĻlg PDF til Dekryptering", - "2": "Adgangskode" + "bulkSelection": { + "syntaxError": "There is a syntax issue. See Page Selection tips for help.", + "header": { + "title": "Page Selection Guide" }, - "submit": "Fjern", - "desc": "Fjern adgangskodebeskyttelse fra dit PDF-dokument.", - "password": { - "stepTitle": "Fjern Adgangskode", - "label": "NuvÃĻrende Adgangskode" + "syntax": { + "title": "Syntax Basics", + "text": "Use numbers, ranges, keywords, and progressions (n starts at 0). Parentheses are supported.", + "bullets": { + "numbers": "Numbers/ranges: 5, 10-20", + "keywords": "Keywords: odd, even", + "progressions": "Progressions: 3n, 4n+1" + } + }, + "operators": { + "title": "Operators", + "text": "AND has higher precedence than comma. NOT applies within the document range.", + "and": "AND: & or \"and\" — require both conditions (e.g., 1-50 & even)", + "comma": "Comma: , or | — combine selections (e.g., 1-10, 20)", + "not": "NOT: ! or \"not\" — exclude pages (e.g., 3n & not 30)" + }, + "examples": { + "title": "Examples", + "first50": "First 50", + "last50": "Last 50", + "every3rd": "Every 3rd", + "oddWithinExcluding": "Odd within 1-20 excluding 5-7", + "combineSets": "Combine sets" + }, + "firstNPages": { + "title": "First N Pages", + "placeholder": "Number of pages" + }, + "lastNPages": { + "title": "Last N Pages", + "placeholder": "Number of pages" + }, + "everyNthPage": { + "title": "Every Nth Page", + "placeholder": "Step size" + }, + "range": { + "title": "Range", + "fromPlaceholder": "From", + "toPlaceholder": "To" + }, + "keywords": { + "title": "Keywords" + }, + "advanced": { + "title": "Advanced" } }, "compressPdfs": { @@ -843,12 +1734,142 @@ "tags": "remove,delete,form,field,readonly", "title": "Remove Read-Only from Form Fields", "header": "Unlock PDF Forms", - "submit": "Remove" + "submit": "Remove", + "description": "This tool will remove read-only restrictions from PDF form fields, making them editable and fillable.", + "filenamePrefix": "unlocked_forms", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst unlocking PDF forms." + }, + "results": { + "title": "Unlocked Forms Results" + } }, "changeMetadata": { - "tags": "Titel,forfatter,dato,oprettelse,tid,udgiver,producent,statistik", - "title": "Ændre Metadata", "header": "Ændre Metadata", + "submit": "Ændre", + "filenamePrefix": "metadata", + "settings": { + "title": "Metadata Settings" + }, + "standardFields": { + "title": "Standard Fields" + }, + "deleteAll": { + "label": "Remove Existing Metadata", + "checkbox": "Delete all metadata" + }, + "title": { + "label": "Title", + "placeholder": "Document title" + }, + "author": { + "label": "Author", + "placeholder": "Document author" + }, + "subject": { + "label": "Subject", + "placeholder": "Document subject" + }, + "keywords": { + "label": "Keywords", + "placeholder": "Document keywords" + }, + "creator": { + "label": "Creator", + "placeholder": "Document creator" + }, + "producer": { + "label": "Producer", + "placeholder": "Document producer" + }, + "dates": { + "title": "Date Fields" + }, + "creationDate": { + "label": "Creation Date", + "placeholder": "Creation date" + }, + "modificationDate": { + "label": "Modification Date", + "placeholder": "Modification date" + }, + "trapped": { + "label": "Trapped Status", + "unknown": "Unknown", + "true": "True", + "false": "False" + }, + "advanced": { + "title": "Advanced Options" + }, + "customFields": { + "title": "Custom Metadata", + "description": "Add custom metadata fields to the document", + "add": "Add Field", + "key": "Key", + "keyPlaceholder": "Custom key", + "value": "Value", + "valuePlaceholder": "Custom value", + "remove": "Remove" + }, + "results": { + "title": "Updated PDFs" + }, + "error": { + "failed": "An error occurred while changing the PDF metadata." + }, + "tooltip": { + "header": { + "title": "PDF Metadata Overview" + }, + "standardFields": { + "title": "Standard Fields", + "text": "Common PDF metadata fields that describe the document.", + "bullet1": "Title: Document name or heading", + "bullet2": "Author: Person who created the document", + "bullet3": "Subject: Brief description of content", + "bullet4": "Keywords: Search terms for the document", + "bullet5": "Creator/Producer: Software used to create the PDF" + }, + "dates": { + "title": "Date Fields", + "text": "When the document was created and modified.", + "bullet1": "Creation Date: When original document was made", + "bullet2": "Modification Date: When last changed" + }, + "options": { + "title": "Additional Options", + "text": "Custom fields and privacy controls.", + "bullet1": "Custom Metadata: Add your own key-value pairs", + "bullet2": "Trapped Status: High-quality printing setting", + "bullet3": "Delete All: Remove all metadata for privacy" + }, + "deleteAll": { + "title": "Remove Existing Metadata", + "text": "Complete metadata deletion to ensure privacy." + }, + "customFields": { + "title": "Custom Metadata", + "text": "Add your own custom key-value metadata pairs.", + "bullet1": "Add any custom fields relevant to your document", + "bullet2": "Examples: Department, Project, Version, Status", + "bullet3": "Both key and value are required for each entry" + }, + "advanced": { + "title": "Advanced Options", + "trapped": { + "title": "Trapped Status", + "description": "Indicates if document is prepared for high-quality printing.", + "bullet1": "True: Document has been trapped for printing", + "bullet2": "False: Document has not been trapped", + "bullet3": "Unknown: Trapped status is not specified" + } + } + }, + "tags": "Titel,forfatter,dato,oprettelse,tid,udgiver,producent,statistik", "selectText": { "1": "Rediger venligst de variabler, du ønsker at ÃĻndre", "2": "Slet al metadata", @@ -856,15 +1877,7 @@ "4": "Anden Metadata:", "5": "Tilføj Brugerdefineret Metadata Post" }, - "author": "Forfatter:", - "creationDate": "Oprettelsesdato (ÃĨÃĨÃĨÃĨ/MM/dd TT:mm:ss):", - "creator": "Skaber:", - "keywords": "Nøgleord:", - "modDate": "Ændringsdato (ÃĨÃĨÃĨÃĨ/MM/dd TT:mm:ss):", - "producer": "Producent:", - "subject": "Emne:", - "trapped": "Fanget:", - "submit": "Ændre" + "modDate": "Ændringsdato (ÃĨÃĨÃĨÃĨ/MM/dd TT:mm:ss):" }, "fileToPDF": { "tags": "transformation,format,dokument,billede,dias,tekst,konvertering,kontor,docs,word,excel,powerpoint", @@ -878,6 +1891,7 @@ "ocr": { "tags": "genkendelse,tekst,billede,scan,lÃĻs,identificÊr,detektion,redigerbar", "title": "OCR / Scan Oprydning", + "desc": "Oprydning af scanninger og genkender tekst fra billeder i en PDF og tilføjer den igen som tekst.", "header": "Oprydning af Scanninger / OCR (Optisk Karaktergenkendelse)", "selectText": { "1": "VÃĻlg sprog, der skal detekteres i PDF'en (De angivne er dem, der i øjeblikket er registreret):", @@ -896,23 +1910,89 @@ "help": "LÃĻs venligst denne dokumentation om, hvordan man bruger dette til andre sprog og/eller brug uden for docker", "credit": "Denne tjeneste bruger qpdf og Tesseract til OCR.", "submit": "Behandl PDF med OCR", - "desc": "Oprydning af scanninger og genkender tekst fra billeder i en PDF og tilføjer den igen som tekst.", + "operation": { + "submit": "Process OCR and Review" + }, + "results": { + "title": "OCR Results" + }, + "languagePicker": { + "additionalLanguages": "Looking for additional languages?", + "viewSetupGuide": "View setup guide →" + }, "settings": { "title": "Indstillinger", "ocrMode": { - "label": "OCR-tilstand" + "label": "OCR-tilstand", + "auto": "Auto (skip text layers)", + "force": "Force (re-OCR all, replace text)", + "strict": "Strict (abort if text found)" }, "languages": { - "label": "Sprog" + "label": "Sprog", + "placeholder": "Select languages" + }, + "compatibilityMode": { + "label": "Compatibility Mode" + }, + "advancedOptions": { + "label": "Processing Options", + "sidecar": "Create a text file", + "deskew": "Deskew pages", + "clean": "Clean input file", + "cleanFinal": "Clean final output" } }, "tooltip": { + "header": { + "title": "OCR Settings Overview" + }, "mode": { - "title": "OCR-tilstand" + "title": "OCR-tilstand", + "text": "Optical Character Recognition (OCR) helps you turn scanned or screenshotted pages into text you can search, copy, or highlight.", + "bullet1": "Auto skips pages that already contain text layers.", + "bullet2": "Force re-OCRs every page and replaces all the text.", + "bullet3": "Strict halts if any selectable text is found." }, "languages": { - "title": "Sprog" + "title": "Sprog", + "text": "Improve OCR accuracy by specifying the expected languages. Choose one or more languages to guide detection." + }, + "output": { + "title": "Output", + "text": "Decide how you want the text output formatted:", + "bullet1": "Searchable PDF embeds text behind the original image.", + "bullet2": "HOCR XML returns a structured machine-readable file.", + "bullet3": "Plain-text sidecar creates a separate .txt file with raw content." + }, + "advanced": { + "header": { + "title": "Advanced OCR Processing" + }, + "compatibility": { + "title": "Compatibility Mode", + "text": "Uses OCR 'sandwich PDF' mode: results in larger files, but more reliable with certain languages and older PDF software. By default we use hOCR for smaller, modern PDFs." + }, + "sidecar": { + "title": "Create Text File", + "text": "Generates a separate .txt file alongside the PDF containing all extracted text content for easy access and processing." + }, + "deskew": { + "title": "Deskew Pages", + "text": "Automatically corrects skewed or tilted pages to improve OCR accuracy. Useful for scanned documents that weren't perfectly aligned." + }, + "clean": { + "title": "Clean Input File", + "text": "Preprocesses the input by removing noise, enhancing contrast, and optimising the image for better OCR recognition before processing." + }, + "cleanFinal": { + "title": "Clean Final Output", + "text": "Post-processes the final PDF by removing OCR artefacts and optimising the text layer for better readability and smaller file size." + } } + }, + "error": { + "failed": "OCR operation failed" } }, "extractImages": { @@ -921,7 +2001,13 @@ "header": "UdtrÃĻk Billeder", "selectText": "VÃĻlg billedformat til at konvertere udtrukne billeder til", "allowDuplicates": "Gem duplikerede billeder", - "submit": "UdtrÃĻk" + "submit": "UdtrÃĻk", + "settings": { + "title": "Settings" + }, + "error": { + "failed": "An error occurred while extracting images from the PDF." + } }, "pdfToPDFA": { "tags": "arkiv,langtids,standard,konvertering,opbevaring,bevaring", @@ -993,17 +2079,53 @@ }, "info": "Python er ikke installeret. Det er nødvendigt for at køre." }, + "scannerImageSplit": { + "title": "Extracted Images", + "submit": "Extract Image Scans", + "error": { + "failed": "An error occurred while extracting image scans." + }, + "tooltip": { + "title": "Photo Splitter", + "whatThisDoes": "What this does", + "whatThisDoesDesc": "Automatically finds and extracts each photo from a scanned page or composite image—no manual cropping.", + "whenToUse": "When to use", + "useCase1": "Scan whole album pages in one go", + "useCase2": "Split flatbed batches into separate files", + "useCase3": "Break collages into individual photos", + "useCase4": "Pull photos from documents", + "quickFixes": "Quick fixes", + "problem1": "Photos not detected → increase Tolerance to 30-50", + "problem2": "Too many false detections → increase Minimum Area to 15,000-20,000", + "problem3": "Crops are too tight → increase Border Size to 5-10", + "problem4": "Tilted photos not straightened → lower Angle Threshold to ~5°", + "problem5": "Dust/noise boxes → increase Minimum Contour Area to 1000-2000", + "setupTips": "Setup tips", + "tip1": "Use a plain, light background", + "tip2": "Leave a small gap (≈1 cm) between photos", + "tip3": "Scan at 300-600 DPI", + "tip4": "Clean the scanner glass", + "headsUp": "Heads-up", + "headsUpDesc": "Overlapping photos or backgrounds very close in colour to the photos can reduce accuracy-try a lighter or darker background and leave more space." + } + }, "sign": { - "tags": "autorisÊr,initialer,tegnet-underskrift,tekst-underskrift,billede-underskrift", "title": "Underskriv", "header": "Underskriv PDF'er", "upload": "Upload Billede", - "draw": "Tegn Underskrift", - "text": "Tekstinput", + "draw": { + "title": "Draw your signature", + "clear": "Clear" + }, + "text": { + "name": "Signer Name", + "placeholder": "Enter your full name" + }, "clear": "Ryd", "add": "Tilføj", "saved": "Gemte Signaturer", "save": "Gem Signatur", + "applySignatures": "Apply Signatures", "personalSigs": "Personlige Signaturer", "sharedSigs": "Delte Signaturer", "noSavedSigs": "Ingen Gemte Signaturer Fundet", @@ -1015,42 +2137,179 @@ "previous": "Previous page", "maintainRatio": "Toggle maintain aspect ratio", "undo": "Undo", - "redo": "Redo" + "redo": "Redo", + "submit": "Sign Document", + "steps": { + "configure": "Configure Signature" + }, + "type": { + "title": "Signature Type", + "draw": "Draw", + "canvas": "Canvas", + "image": "Image", + "text": "Text" + }, + "image": { + "label": "Upload signature image", + "placeholder": "Select image file", + "hint": "Upload a PNG or JPG image of your signature" + }, + "instructions": { + "title": "How to add signature", + "canvas": "After drawing your signature in the canvas, close the modal then click anywhere on the PDF to place it.", + "image": "After uploading your signature image above, click anywhere on the PDF to place it.", + "text": "After entering your name above, click anywhere on the PDF to place your signature." + }, + "mode": { + "move": "Move Signature", + "place": "Place Signature" + }, + "updateAndPlace": "Update and Place", + "activate": "Activate Signature Placement", + "deactivate": "Stop Placing Signatures", + "results": { + "title": "Signature Results" + }, + "error": { + "failed": "An error occurred while signing the PDF." + }, + "tags": "autorisÊr,initialer,tegnet-underskrift,tekst-underskrift,billede-underskrift" }, "flatten": { - "tags": "statisk,deaktivÊr,ikke-interaktiv,strømlinje", "title": "UdjÃĻvn", "header": "UdjÃĻvn PDF", "flattenOnlyForms": "UdjÃĻvn kun formularer", "submit": "UdjÃĻvn", + "filenamePrefix": "flattened", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, "steps": { "settings": "Indstillinger" }, "options": { - "flattenOnlyForms": "UdjÃĻvn kun formularer" - } + "stepTitle": "Flatten Options", + "title": "Flatten Options", + "flattenOnlyForms": { + "label": "UdjÃĻvn kun formularer", + "desc": "Only flatten form fields, leaving other interactive elements intact" + }, + "note": "Flattening removes interactive elements from the PDF, making them non-editable." + }, + "results": { + "title": "Flatten Results" + }, + "error": { + "failed": "An error occurred while flattening the PDF." + }, + "tooltip": { + "header": { + "title": "About Flattening PDFs" + }, + "description": { + "title": "What does flattening do?", + "text": "Flattening makes your PDF non-editable by turning fillable forms and buttons into regular text and images. The PDF will look exactly the same, but no one can change or fill in the forms anymore. Perfect for sharing completed forms, creating final documents for records, or ensuring the PDF looks the same everywhere.", + "bullet1": "Text boxes become regular text (can't be edited)", + "bullet2": "Checkboxes and buttons become pictures", + "bullet3": "Great for final versions you don't want changed", + "bullet4": "Ensures consistent appearance across all devices" + }, + "formsOnly": { + "title": "What does 'Flatten only forms' mean?", + "text": "This option only removes the ability to fill in forms, but keeps other features working like clicking links, viewing bookmarks, and reading comments.", + "bullet1": "Forms become non-editable", + "bullet2": "Links still work when clicked", + "bullet3": "Comments and notes remain visible", + "bullet4": "Bookmarks still help you navigate" + } + }, + "tags": "statisk,deaktivÊr,ikke-interaktiv,strømlinje" }, "repair": { "tags": "fix,gendan,korrektion,genvind", "title": "ReparÊr", "header": "ReparÊr PDF'er", - "submit": "ReparÊr" + "submit": "ReparÊr", + "description": "This tool will attempt to repair corrupted or damaged PDF files. No additional settings are required.", + "filenamePrefix": "repaired", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst repairing the PDF." + }, + "results": { + "title": "Repair Results" + } }, "removeBlanks": { - "tags": "oprydning,strømlinje,ikke-indhold,organisÊr", "title": "Fjern Tomme Sider", "header": "Fjern Tomme Sider", - "threshold": "Pixel HvidhedstÃĻrskel:", + "settings": { + "title": "Settings" + }, + "threshold": { + "label": "Pixel Whiteness Threshold" + }, + "whitePercent": { + "label": "White Percentage Threshold", + "unit": "%" + }, + "includeBlankPages": { + "label": "Include detected blank pages" + }, + "tooltip": { + "header": { + "title": "Remove Blank Pages Settings" + }, + "threshold": { + "title": "Pixel Whiteness Threshold", + "text": "Controls how white a pixel must be to be considered 'white'. This helps determine what counts as a blank area on the page.", + "bullet1": "0 = Pure black (most restrictive)", + "bullet2": "128 = Medium grey", + "bullet3": "255 = Pure white (least restrictive)" + }, + "whitePercent": { + "title": "White Percentage Threshold", + "text": "Sets the minimum percentage of white pixels required for a page to be considered blank and removed.", + "bullet1": "Lower values (e.g., 80%) = More pages removed", + "bullet2": "Higher values (e.g., 95%) = Only very blank pages removed", + "bullet3": "Use higher values for documents with light backgrounds" + }, + "includeBlankPages": { + "title": "Include Detected Blank Pages", + "text": "When enabled, creates a separate PDF containing all the blank pages that were detected and removed from the original document.", + "bullet1": "Useful for reviewing what was removed", + "bullet2": "Helps verify the detection accuracy", + "bullet3": "Can be disabled to reduce output file size" + } + }, + "submit": "Fjern Tomme Sider", + "error": { + "failed": "Failed to remove blank pages" + }, + "results": { + "title": "Removed Blank Pages" + }, + "tags": "oprydning,strømlinje,ikke-indhold,organisÊr", "thresholdDesc": "TÃĻrskel for at bestemme, hvor hvid en hvid pixel skal vÃĻre for at blive klassificeret som 'Hvid'. 0 = Sort, 255 ren hvid.", - "whitePercent": "Hvid Procent (%):", - "whitePercentDesc": "Procent af siden, der skal vÃĻre 'hvide' pixels for at blive fjernet", - "submit": "Fjern Tomme Sider" + "whitePercentDesc": "Procent af siden, der skal vÃĻre 'hvide' pixels for at blive fjernet" }, "removeAnnotations": { "tags": "kommentarer,fremhÃĻv,noter,markup,fjern", "title": "Fjern AnmÃĻrkninger", "header": "Fjern AnmÃĻrkninger", - "submit": "Fjern" + "submit": "Fjern", + "settings": { + "title": "Settings" + }, + "info": { + "title": "About Remove Annotations", + "description": "This tool will remove all annotations (comments, highlights, notes, etc.) from your PDF documents." + }, + "error": { + "failed": "An error occurred while removing annotations from the PDF." + } }, "compare": { "tags": "differentier,kontrast,ÃĻndringer,analyse", @@ -1082,6 +2341,142 @@ "certSign": { "tags": "autentificÊr,PEM,P12,officiel,kryptÊr", "title": "Certifikat Underskrivning", + "filenamePrefix": "signed", + "signMode": { + "stepTitle": "Sign Mode", + "tooltip": { + "header": { + "title": "About PDF Signatures" + }, + "overview": { + "title": "How signatures work", + "text": "Both modes seal the document (any edits are flagged as tampering) and record who/when/how for auditing. Viewer trust depends on the certificate chain." + }, + "manual": { + "title": "Manual - Bring your certificate", + "text": "Use your own certificate files for brand-aligned identity. Can display Trusted when your CA/chain is recognised.", + "use": "Use for: customer-facing, legal, compliance." + }, + "auto": { + "title": "Auto - Zero-setup, instant system seal", + "text": "Signs with a server self-signed certificate. Same tamper-evident seal and audit trail; typically shows Unverified in viewers.", + "use": "Use when: you need speed and consistent internal identity across reviews and records." + }, + "rule": { + "title": "Rule of thumb", + "text": "Need recipient Trusted status? Manual. Need a fast, tamper-evident seal and audit trail with no setup? Auto." + } + } + }, + "certTypeStep": { + "stepTitle": "Certificate Format" + }, + "certFiles": { + "stepTitle": "Certificate Files" + }, + "appearance": { + "stepTitle": "Signature Appearance", + "tooltip": { + "header": { + "title": "About Signature Appearance" + }, + "invisible": { + "title": "Invisible Signatures", + "text": "The signature is added to the PDF for security but won't be visible when viewing the document. Perfect for legal requirements without changing the document's appearance.", + "bullet1": "Provides security without visual changes", + "bullet2": "Meets legal requirements for digital signing", + "bullet3": "Doesn't affect document layout or design" + }, + "visible": { + "title": "Visible Signatures", + "text": "Shows a signature block on the PDF with your name, date, and optional details. Useful when you want readers to clearly see the document is signed.", + "bullet1": "Shows signer name and date on the document", + "bullet2": "Can include reason and location for signing", + "bullet3": "Choose which page to place the signature", + "bullet4": "Optional logo can be included" + } + }, + "invisible": "Invisible", + "options": { + "title": "Signature Details" + }, + "visible": "Visible" + }, + "sign": { + "submit": "Sign PDF", + "results": "Signed PDF" + }, + "error": { + "failed": "An error occurred whilst processing signatures." + }, + "tooltip": { + "header": { + "title": "About Managing Signatures" + }, + "overview": { + "title": "What can this tool do?", + "text": "This tool lets you check if your PDFs are digitally signed and add new digital signatures. Digital signatures prove who created or approved a document and show if it has been changed since signing.", + "bullet1": "Check existing signatures and their validity", + "bullet2": "View detailed information about signers and certificates", + "bullet3": "Add new digital signatures to secure your documents", + "bullet4": "Multiple files supported with easy navigation" + }, + "validation": { + "title": "Checking Signatures", + "text": "When you check signatures, the tool tells you if they're valid, who signed the document, when it was signed, and whether the document has been changed since signing.", + "bullet1": "Shows if signatures are valid or invalid", + "bullet2": "Displays signer information and signing date", + "bullet3": "Checks if the document was modified after signing", + "bullet4": "Can use custom certificates for verification" + }, + "signing": { + "title": "Adding Signatures", + "text": "To sign a PDF, you need a digital certificate (like PEM, PKCS12, or JKS). You can choose to make the signature visible on the document or keep it invisible for security only.", + "bullet1": "Supports PEM, PKCS12, JKS, and server certificate formats", + "bullet2": "Option to show or hide signature on the PDF", + "bullet3": "Add reason, location, and signer name", + "bullet4": "Choose which page to place visible signatures", + "bullet5": "Use server certificate for simple 'Sign with Stirling-PDF' option" + } + }, + "certType": { + "tooltip": { + "header": { + "title": "About Certificate Types" + }, + "what": { + "title": "What's a certificate?", + "text": "It's a secure ID for your signature that proves you signed. Unless you're required to sign via certificate, we recommend using another secure method like Type, Draw, or Upload." + }, + "which": { + "title": "Which option should I use?", + "text": "Choose the format that matches your certificate file:", + "bullet1": "PKCS#12 (.p12 / .pfx) – one combined file (most common)", + "bullet2": "PFX (.pfx) – Microsoft's version of PKCS12", + "bullet3": "PEM – separate private-key and certificate .pem files", + "bullet4": "JKS – Java .jks keystore for dev / CI-CD workflows" + }, + "convert": { + "title": "Key not listed?", + "text": "Convert your file to a Java keystore (.jks) with keytool, then pick JKS." + } + } + }, + "chooseCertificate": "Choose Certificate File", + "chooseJksFile": "Choose JKS File", + "chooseP12File": "Choose PKCS12 File", + "choosePfxFile": "Choose PFX File", + "choosePrivateKey": "Choose Private Key File", + "location": "Placering", + "logoTitle": "Logo", + "name": "Navn", + "noLogo": "No Logo", + "pageNumber": "Page Number", + "password": "Indtast Din Keystore eller Private Nøgle Adgangskode (Hvis nogen):", + "passwordOptional": "Leave empty if no password", + "reason": "Årsag", + "serverCertMessage": "Using server certificate - no files or password required", + "showLogo": "Vis Logo", "header": "Underskriv en PDF med dit certifikat (Arbejde i gang)", "selectPDF": "VÃĻlg en PDF-fil til underskrivning:", "jksNote": "BemÃĻrk: Hvis din certifikattype ikke er angivet nedenfor, skal du konvertere det til en Java Keystore (.jks) fil ved hjÃĻlp af keytool kommandolinjevÃĻrktøjet. VÃĻlg derefter .jks fil muligheden nedenfor.", @@ -1089,13 +2484,7 @@ "selectCert": "VÃĻlg Din Certifikatfil (X.509 format, kan vÃĻre .pem eller .der):", "selectP12": "VÃĻlg Din PKCS#12 Keystore Fil (.p12 eller .pfx) (Valgfrit, Hvis angivet, skal den indeholde din private nøgle og certifikat):", "selectJKS": "VÃĻlg Din Java Keystore Fil (.jks eller .keystore):", - "certType": "Certifikattype", - "password": "Indtast Din Keystore eller Private Nøgle Adgangskode (Hvis nogen):", "showSig": "Vis Underskrift", - "reason": "Årsag", - "location": "Placering", - "name": "Navn", - "showLogo": "Vis Logo", "submit": "Underskriv PDF" }, "removeCertSign": { @@ -1103,7 +2492,18 @@ "title": "Fjern Certifikat Underskrift", "header": "Fjern det digitale certifikat fra PDF'en", "selectPDF": "VÃĻlg en PDF-fil:", - "submit": "Fjern Underskrift" + "submit": "Fjern Underskrift", + "description": "This tool will remove digital certificate signatures from your PDF document.", + "filenamePrefix": "unsigned", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst removing certificate signatures." + }, + "results": { + "title": "Certificate Removal Results" + } }, "pageLayout": { "tags": "flet,sammensÃĻt,enkelt-visning,organisÊr", @@ -1111,16 +2511,157 @@ "header": "Multi-Side Layout", "pagesPerSheet": "Sider pr. ark:", "addBorder": "Tilføj Kanter", - "submit": "Indsend" + "submit": "Indsend", + "desc": { + "2": "Place 2 pages side-by-side on a single sheet.", + "3": "Place 3 pages on a single sheet in a single row.", + "4": "Place 4 pages on a single sheet (2 × 2 grid).", + "9": "Place 9 pages on a single sheet (3 × 3 grid).", + "16": "Place 16 pages on a single sheet (4 × 4 grid)." + }, + "error": { + "failed": "An error occurred while creating the multi-page layout." + } + }, + "bookletImposition": { + "tags": "booklet,imposition,printing,binding,folding,signature", + "title": "Booklet Imposition", + "header": "Booklet Imposition", + "submit": "Create Booklet", + "spineLocation": { + "label": "Spine Location", + "left": "Left (Standard)", + "right": "Right (RTL)" + }, + "doubleSided": { + "label": "Double-sided printing", + "tooltip": "Creates both front and back sides for proper booklet printing" + }, + "manualDuplex": { + "title": "Manual Duplex Mode", + "instructions": "For printers without automatic duplex. You'll need to run this twice:" + }, + "duplexPass": { + "label": "Print Pass", + "first": "1st Pass", + "second": "2nd Pass", + "firstInstructions": "Prints front sides → stack face-down → run again with 2nd Pass", + "secondInstructions": "Load printed stack face-down → prints back sides" + }, + "rtlBinding": { + "label": "Right-to-left binding", + "tooltip": "For Arabic, Hebrew, or other right-to-left languages" + }, + "addBorder": { + "label": "Add borders around pages", + "tooltip": "Adds borders around each page section to help with cutting and alignment" + }, + "addGutter": { + "label": "Add gutter margin", + "tooltip": "Adds inner margin space for binding" + }, + "gutterSize": { + "label": "Gutter size (points)" + }, + "flipOnShortEdge": { + "label": "Flip on short edge (automatic duplex only)", + "tooltip": "Enable for short-edge duplex printing (automatic duplex only - ignored in manual mode)", + "manualNote": "Not needed in manual mode - you flip the stack yourself" + }, + "advanced": { + "toggle": "Advanced Options" + }, + "paperSizeNote": "Paper size is automatically derived from your first page.", + "tooltip": { + "header": { + "title": "Booklet Creation Guide" + }, + "description": { + "title": "What is Booklet Imposition?", + "text": "Creates professional booklets by arranging pages in the correct printing order. Your PDF pages are placed 2-up on landscape sheets so when folded and bound, they read in proper sequence like a real book." + }, + "example": { + "title": "Example: 8-Page Booklet", + "text": "Your 8-page document becomes 2 sheets:", + "bullet1": "Sheet 1 Front: Pages 8, 1 | Back: Pages 2, 7", + "bullet2": "Sheet 2 Front: Pages 6, 3 | Back: Pages 4, 5", + "bullet3": "When folded & stacked: Reads 1→2→3→4→5→6→7→8" + }, + "printing": { + "title": "How to Print & Assemble", + "text": "Follow these steps for perfect booklets:", + "bullet1": "Print double-sided with 'Flip on long edge'", + "bullet2": "Stack sheets in order, fold in half", + "bullet3": "Staple or bind along the folded spine", + "bullet4": "For short-edge printers: Enable 'Flip on short edge' option" + }, + "manualDuplex": { + "title": "Manual Duplex (Single-sided Printers)", + "text": "For printers without automatic duplex:", + "bullet1": "Turn OFF 'Double-sided printing'", + "bullet2": "Select '1st Pass' → Print → Stack face-down", + "bullet3": "Select '2nd Pass' → Load stack → Print backs", + "bullet4": "Fold and assemble as normal" + }, + "advanced": { + "title": "Advanced Options", + "text": "Fine-tune your booklet:", + "bullet1": "Right-to-Left Binding: For Arabic, Hebrew, or RTL languages", + "bullet2": "Borders: Shows cut lines for trimming", + "bullet3": "Gutter Margin: Adds space for binding/stapling", + "bullet4": "Short-edge Flip: Only for automatic duplex printers" + } + }, + "error": { + "failed": "An error occurred while creating the booklet imposition." + } }, "scalePages": { - "tags": "ÃĻndre størrelse,modificÊr,dimension,tilpas", "title": "JustÊr sidestørrelse", "header": "JustÊr sidestørrelse", "pageSize": "Størrelse pÃĨ en side i dokumentet.", "keepPageSize": "Original Size", "scaleFactor": "Zoom-niveau (beskÃĻring) af en side.", - "submit": "Indsend" + "submit": "Indsend", + "tags": "ÃĻndre størrelse,modificÊr,dimension,tilpas" + }, + "adjustPageScale": { + "tags": "resize,modify,dimension,adapt", + "title": "Adjust Page Scale", + "header": "Adjust Page Scale", + "scaleFactor": { + "label": "Scale Factor" + }, + "pageSize": { + "label": "Target Page Size", + "keep": "Keep Original Size", + "letter": "Letter", + "legal": "Legal" + }, + "submit": "Adjust Page Scale", + "error": { + "failed": "An error occurred while adjusting the page scale." + }, + "tooltip": { + "header": { + "title": "Page Scale Settings Overview" + }, + "description": { + "title": "Description", + "text": "Adjust the size of PDF content and change the page dimensions." + }, + "scaleFactor": { + "title": "Scale Factor", + "text": "Controls how large or small the content appears on the page. Content is scaled and centred - if scaled content is larger than the page size, it may be cropped.", + "bullet1": "1.0 = Original size", + "bullet2": "0.5 = Half size (50% smaller)", + "bullet3": "2.0 = Double size (200% larger, may crop)" + }, + "pageSize": { + "title": "Target Page Size", + "text": "Sets the dimensions of the output PDF pages. 'Keep Original Size' maintains current dimensions, whilst other options resize to standard paper sizes." + } + } }, "add-page-numbers": { "tags": "nummerÊr,etiket,organisÊr,indeks" @@ -1129,16 +2670,83 @@ "tags": "auto-detektÊr,overskrift-baseret,organisÊr,omdøb", "title": "Auto Omdøb", "header": "Auto Omdøb PDF", - "submit": "Auto Omdøb" + "description": "Automatically finds the title from your PDF content and uses it as the filename.", + "submit": "Auto Omdøb", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst auto-renaming the PDF." + }, + "results": { + "title": "Auto-Rename Results" + }, + "tooltip": { + "header": { + "title": "How Auto-Rename Works" + }, + "howItWorks": { + "title": "Smart Renaming", + "text": "Automatically finds the title from your PDF content and uses it as the filename.", + "bullet1": "Looks for text that appears to be a title or heading", + "bullet2": "Creates a clean, valid filename from the detected title", + "bullet3": "Keeps the original name if no suitable title is found" + } + } }, "adjust-contrast": { "tags": "farvekorrektion,juster,modificÊr,forbedre" }, "crop": { - "tags": "trim,formindsk,redigÊr,form", "title": "BeskÃĻr", "header": "BeskÃĻr PDF", - "submit": "Indsend" + "submit": "Indsend", + "noFileSelected": "Select a PDF file to begin cropping", + "preview": { + "title": "Crop Area Selection" + }, + "reset": "Reset to full PDF", + "coordinates": { + "title": "Position and Size", + "x": { + "label": "X Position", + "desc": "Left edge (points)" + }, + "y": { + "label": "Y Position", + "desc": "Bottom edge (points)" + }, + "width": { + "label": "Width", + "desc": "Crop width (points)" + }, + "height": { + "label": "Height", + "desc": "Crop height (points)" + } + }, + "error": { + "invalidArea": "Crop area extends beyond PDF boundaries", + "failed": "Failed to crop PDF" + }, + "steps": { + "selectArea": "Select Crop Area" + }, + "tooltip": { + "title": "How to Crop PDFs", + "description": "Select the area to crop from your PDF by dragging and resizing the blue overlay on the thumbnail.", + "drag": "Drag the overlay to move the crop area", + "resize": "Drag the corner and edge handles to resize", + "precision": "Use coordinate inputs for precise positioning" + }, + "results": { + "title": "Crop Results" + }, + "automation": { + "info": "Enter crop coordinates in PDF points. Origin (0,0) is at bottom-left. These values will be applied to all PDFs processed in this automation.", + "reference": "Reference: A4 page is 595.28 × 841.89 points (210mm × 297mm). 1 inch = 72 points." + }, + "tags": "trim,formindsk,redigÊr,form" }, "autoSplitPDF": { "tags": "QR-baseret,adskil,scan-segment,organisÊr", @@ -1221,24 +2829,124 @@ "downloadJS": "Last ned Javascript", "submit": "Vis" }, - "autoRedact": { - "tags": "Rediger,Skjul,svÃĻrte,sort,markør,skjult", - "title": "Auto Rediger", - "header": "Auto Rediger", - "colorLabel": "Farve", - "textsToRedactLabel": "Tekst der skal redigeres (linje-adskilt)", - "textsToRedactPlaceholder": "f.eks. \\nFortroligt \\nTop-Hemmelig", - "useRegexLabel": "Brug Regex", - "wholeWordSearchLabel": "Hele Ord Søgning", - "customPaddingLabel": "Brugerdefineret Ekstra Polstring", - "convertPDFToImageLabel": "KonvertÊr PDF til PDF-Billede (Bruges til at fjerne tekst bag boksen)", - "submitButton": "Indsend" - }, "redact": { "tags": "Redact,Hide,black out,black,marker,hidden,manual", "title": "Manual Redaction", - "header": "Manual Redaction", "submit": "Manual Redaction", + "error": { + "failed": "An error occurred while redacting the PDF." + }, + "modeSelector": { + "title": "Redaction Method", + "mode": "Mode", + "automatic": "Automatic", + "automaticDesc": "Redact text based on search terms", + "manual": "Manual", + "manualDesc": "Click and drag to redact specific areas", + "manualComingSoon": "Manual redaction coming soon" + }, + "auto": { + "header": "Auto Redact", + "settings": { + "title": "Redaction Settings", + "advancedTitle": "Avanceret" + }, + "colorLabel": "Box Colour", + "wordsToRedact": { + "title": "Words to Redact", + "placeholder": "Enter a word", + "add": "Tilføj", + "examples": "Examples: Confidential, Top-Secret" + }, + "useRegexLabel": "Use Regex", + "wholeWordSearchLabel": "Whole Word Search", + "customPaddingLabel": "Custom Extra Padding", + "convertPDFToImageLabel": "Convert PDF to PDF-Image" + }, + "tooltip": { + "mode": { + "header": { + "title": "Redaction Method" + }, + "automatic": { + "title": "Automatic Redaction", + "text": "Automatically finds and redacts specified text throughout the document. Perfect for removing consistent sensitive information like names, addresses, or confidential markers." + }, + "manual": { + "title": "Manual Redaction", + "text": "Click and drag to manually select specific areas to redact. Gives you precise control over what gets redacted. (Coming soon)" + } + }, + "words": { + "header": { + "title": "Words to Redact" + }, + "description": { + "title": "Text Matching", + "text": "Enter words or phrases to find and redact in your document. Each word will be searched for separately." + }, + "bullet1": "Add one word at a time", + "bullet2": "Press Enter or click 'Add Another' to add", + "bullet3": "Click × to remove words", + "examples": { + "title": "Common Examples", + "text": "Typical words to redact include: bank details, email addresses, or specific names." + } + }, + "advanced": { + "header": { + "title": "Advanced Redaction Settings" + }, + "color": { + "title": "Box Colour & Padding", + "text": "Customise the appearance of redaction boxes. Black is standard, but you can choose any colour. Padding adds extra space around the found text." + }, + "regex": { + "title": "Use Regex", + "text": "Enable regular expressions for advanced pattern matching. Useful for finding phone numbers, emails, or complex patterns.", + "bullet1": "Example: \\d{4}-\\d{2}-\\d{2} to match any dates in YYYY-MM-DD format", + "bullet2": "Use with caution - test thoroughly" + }, + "wholeWord": { + "title": "Whole Word Search", + "text": "Only match complete words, not partial matches. 'John' won't match 'Johnson' when enabled." + }, + "convert": { + "title": "Convert to PDF-Image", + "text": "Converts the PDF to an image-based PDF after redaction. This ensures text behind redaction boxes is completely removed and unrecoverable." + } + } + }, + "manual": { + "header": "Manual Redaction", + "textBasedRedaction": "Text-based Redaction", + "pageBasedRedaction": "Page-based Redaction", + "convertPDFToImageLabel": "Convert PDF to PDF-Image (Used to remove text behind the box)", + "pageRedactionNumbers": { + "title": "Sideantal", + "placeholder": "(f.eks. 1,2,8 eller 4,7,12-16 eller 2n-1)" + }, + "redactionColor": { + "title": "Redaction Colour" + }, + "export": "Export", + "upload": "Upload", + "boxRedaction": "Box draw redaction", + "zoom": "Zoom", + "zoomIn": "Zoom in", + "zoomOut": "Zoom out", + "nextPage": "Next Page", + "previousPage": "Previous Page", + "toggleSidebar": "Toggle Sidebar", + "showThumbnails": "Show Thumbnails", + "showDocumentOutline": "Show Document Outline (double-click to expand/collapse all items)", + "showAttachments": "Show Attachments", + "showLayers": "Show Layers (double-click to reset all layers to the default state)", + "colourPicker": "Colour Picker", + "findCurrentOutlineItem": "Find current outline item", + "applyChanges": "Apply Changes" + }, + "header": "Manual Redaction", "textBasedRedaction": "Text based Redaction", "pageBasedRedaction": "Page-based Redaction", "convertPDFToImageLabel": "Convert PDF to PDF-Image (Used to remove text behind the box)", @@ -1264,21 +2972,7 @@ "showLayers": "Show Layers (double-click to reset all layers to the default state)", "colourPicker": "Colour Picker", "findCurrentOutlineItem": "Find current outline item", - "applyChanges": "Apply Changes", - "auto": { - "settings": { - "advancedTitle": "Avanceret" - }, - "wordsToRedact": { - "add": "Tilføj" - } - }, - "manual": { - "pageRedactionNumbers": { - "title": "Sideantal", - "placeholder": "(f.eks. 1,2,8 eller 4,7,12-16 eller 2n-1)" - } - } + "applyChanges": "Apply Changes" }, "tableExtraxt": { "tags": "CSV,TabeludtrÃĻkning,udtrÃĻk,konvertÊr" @@ -1289,11 +2983,15 @@ "overlay-pdfs": { "tags": "Overlejr", "header": "Overlejr PDF-filer", + "title": "Overlay PDFs", + "desc": "Overlay one PDF on top of another", "baseFile": { "label": "VÃĻlg Base PDF-fil" }, "overlayFiles": { - "label": "VÃĻlg Overlejrings PDF-filer" + "label": "VÃĻlg Overlejrings PDF-filer", + "placeholder": "Choose PDF(s)...", + "addMore": "Add more PDFs..." }, "mode": { "label": "VÃĻlg Overlejringstilstand", @@ -1303,14 +3001,53 @@ }, "counts": { "label": "Antal overlejringer (for Fast Gentaget tilstand)", - "placeholder": "Indtast kommaseparerede tÃĻllinger (f.eks. 2,3,1)" + "placeholder": "Indtast kommaseparerede tÃĻllinger (f.eks. 2,3,1)", + "item": "Count for file", + "noFiles": "Add overlay files to configure counts" }, "position": { "label": "VÃĻlg overlejringsposition", "foreground": "Forgrund", "background": "Baggrund" }, - "submit": "Indsend" + "submit": "Indsend", + "settings": { + "title": "Settings" + }, + "results": { + "title": "Overlay Results" + }, + "tooltip": { + "header": { + "title": "Overlay PDFs Overview" + }, + "description": { + "title": "Description", + "text": "Combine a base PDF with one or more overlay PDFs. Overlays can be applied page-by-page in different modes and placed in the foreground or background." + }, + "mode": { + "title": "Overlay Mode", + "text": "Choose how to distribute overlay pages across the base PDF pages.", + "sequential": "Sequential Overlay: Use pages from the first overlay PDF until it ends, then move to the next.", + "interleaved": "Interleaved Overlay: Take one page from each overlay in turn.", + "fixedRepeat": "Fixed Repeat Overlay: Take a set number of pages from each overlay before moving to the next. Use Counts to set the numbers." + }, + "position": { + "title": "Overlay Position", + "text": "Foreground places the overlay on top of the page. Background places it behind." + }, + "overlayFiles": { + "title": "Overlay Files", + "text": "Select one or more PDFs to overlay on the base. The order of these files affects how pages are applied in Sequential and Fixed Repeat modes." + }, + "counts": { + "title": "Counts (Fixed Repeat only)", + "text": "Provide a positive number for each overlay file showing how many pages to take before moving to the next. Required when mode is Fixed Repeat." + } + }, + "error": { + "failed": "An error occurred while overlaying PDFs." + } }, "split-by-sections": { "tags": "Sektionsopdeling, Opdel, Tilpas", @@ -1331,6 +3068,7 @@ "tags": "Stempel, Tilføj billede, centrer billede, VandmÃĻrke, PDF, Indlejr, Tilpas", "header": "Stempel PDF", "title": "Stempel PDF", + "stampSetup": "Stamp Setup", "stampType": "Stempeltype", "stampText": "Stempeltekst", "stampImage": "Stempelbillede", @@ -1343,7 +3081,19 @@ "overrideY": "TilsidesÃĻt Y-koordinat", "customMargin": "Brugerdefineret Margin", "customColor": "Brugerdefineret Tekstfarve", - "submit": "Indsend" + "submit": "Indsend", + "noStampSelected": "No stamp selected. Return to Step 1.", + "customPosition": "Drag the stamp to the desired location in the preview window.", + "error": { + "failed": "An error occurred while adding stamp to the PDF." + }, + "imageSize": "Image Size", + "margin": "Margin", + "positionAndFormatting": "Position & Formatting", + "quickPosition": "Select a position on the page to place the stamp.", + "results": { + "title": "Stamp Results" + } }, "removeImagePdf": { "tags": "Fjern Billede,Sideoperationer,Back end,server side" @@ -1361,7 +3111,8 @@ "status": { "_value": "Status", "valid": "Valid", - "invalid": "Invalid" + "invalid": "Invalid", + "complete": "Validation complete" }, "signer": "Signer", "date": "Date", @@ -1388,40 +3139,122 @@ "version": "Version", "keyUsage": "Key Usage", "selfSigned": "Self-Signed", - "bits": "bits" + "bits": "bits", + "details": "Certificate Details" }, "signature": { "info": "Signature Information", "_value": "Signature", "mathValid": "Signature is mathematically valid BUT:" }, - "selectCustomCert": "Custom Certificate File X.509 (Optional)" - }, - "replace-color": { - "title": "Replace-Invert-Color", - "header": "Erstat-omgivende Farve PDF", - "selectText": { - "1": "Erstatt eller omgivende Farvemuligheder", - "2": "Standard (høj kontrastfarver)", - "3": "Brugerdefineret (anpassede farver)", - "4": "Inverter alle farver", - "5": "Høj kontrastfarveindstillinger", - "6": "Hvid tekst pÃĨ sort baggrund", - "7": "Sort tekst pÃĨ hvid baggrund", - "8": "Gul tekst pÃĨ sort baggrund", - "9": "Grøn tekst pÃĨ sort baggrund", - "10": "VÃĻlg tekstfarve", - "11": "VÃĻlg baggrundsfarve" + "selectCustomCert": "Custom Certificate File X.509 (Optional)", + "downloadCsv": "Download CSV", + "downloadJson": "Download JSON", + "downloadPdf": "Download PDF Report", + "downloadType": { + "csv": "CSV", + "json": "JSON", + "pdf": "PDF" }, - "submit": "Erstat" + "error": { + "allFailed": "Unable to validate the selected files.", + "partial": "Some files could not be validated.", + "reportGeneration": "Could not generate the PDF report. JSON and CSV are available.", + "unexpected": "Unexpected error during validation." + }, + "finalizing": "Preparing downloads...", + "issue": { + "certExpired": "Certificate expired", + "certRevocationUnknown": "Certificate revocation status unknown", + "certRevoked": "Certificate revoked", + "chainInvalid": "Certificate chain invalid", + "signatureInvalid": "Signature cryptographic check failed", + "trustInvalid": "Certificate not trusted" + }, + "noResults": "Run the validation to generate a report.", + "noSignaturesShort": "No signatures", + "processing": "Validating signatures...", + "report": { + "continued": "Continued", + "downloads": "Downloads", + "entryLabel": "Signature Summary", + "fields": { + "created": "Created", + "fileSize": "File Size", + "signatureCount": "Total Signatures", + "signatureDate": "Signature Date" + }, + "filesEvaluated": "{{count}} files evaluated", + "footer": "Validated via Stirling PDF", + "generatedAt": "Generated", + "noPdf": "PDF report will be available after a successful validation.", + "page": "Page", + "shortTitle": "Signature Summary", + "signatureCountLabel": "{{count}} signatures", + "signaturesFound": "{{count}} signatures detected", + "signaturesValid": "{{count}} fully valid", + "title": "Signature Validation Report" + }, + "settings": { + "certHint": "Upload a trusted X.509 certificate to validate against a custom trust source.", + "title": "Validation Settings" + }, + "signatureDate": "Signature Date", + "totalSignatures": "Total Signatures" }, - "replaceColorPdf": { - "tags": "Erstat Farve,Side operationer,Behandling,server side" + "replaceColor": { + "tags": "Replace Colour,Page operations,Back end,server side", + "labels": { + "settings": "Settings", + "colourOperation": "Colour operation" + }, + "options": { + "highContrast": "High contrast", + "invertAll": "Invert all colours", + "custom": "Custom", + "cmyk": "Convert to CMYK" + }, + "tooltip": { + "header": { + "title": "Replace & Invert Colour Settings Overview" + }, + "description": { + "title": "Description", + "text": "Transform PDF colours to improve readability and accessibility. Choose from high contrast presets, invert all colours, or create custom colour schemes." + }, + "highContrast": { + "title": "High Contrast", + "text": "Apply predefined high contrast colour combinations designed for better readability and accessibility compliance.", + "bullet1": "White text on black background - Classic dark mode", + "bullet2": "Black text on white background - Standard high contrast", + "bullet3": "Yellow text on black background - High visibility option", + "bullet4": "Green text on black background - Alternative high contrast" + }, + "invertAll": { + "title": "Invert All Colours", + "text": "Completely invert all colours in the PDF, creating a negative-like effect. Useful for creating dark mode versions of documents or reducing eye strain in low-light conditions." + }, + "custom": { + "title": "Custom Colours", + "text": "Define your own text and background colours using the colour pickers. Perfect for creating branded documents or specific accessibility requirements.", + "bullet1": "Text colour - Choose the colour for text elements", + "bullet2": "Background colour - Set the background colour for the document" + }, + "cmyk": { + "title": "Convert to CMYK", + "text": "Convert the PDF from RGB colour space to CMYK colour space, optimized for professional printing. This process converts colours to the Cyan, Magenta, Yellow, Black model used by printers." + } + }, + "error": { + "failed": "An error occurred while processing the colour replacement." + } }, "login": { "title": "Log ind", "header": "Log ind", "signin": "Log ind", + "signInWith": "Sign in with", + "signInAnonymously": "Sign Up as a Guest", "rememberme": "Husk mig", "invalid": "Ugyldigt brugernavn eller adgangskode.", "locked": "Din konto er blevet lÃĨst.", @@ -1440,12 +3273,83 @@ "alreadyLoggedIn": "Du er allerede logget ind pÃĨ", "alreadyLoggedIn2": "enheder. Log ud af disse enheder og prøv igen.", "toManySessions": "Du har for mange aktive sessoner", - "logoutMessage": "You have been logged out." + "logoutMessage": "You have been logged out.", + "youAreLoggedIn": "You are logged in!", + "email": "Email", + "password": "Password", + "enterEmail": "Enter your email", + "enterPassword": "Enter your password", + "loggingIn": "Logging In...", + "username": "Username", + "enterUsername": "Enter username", + "useEmailInstead": "Login with email", + "forgotPassword": "Forgot your password?", + "logIn": "Log In", + "signingIn": "Signing in...", + "login": "Login", + "or": "Or", + "useMagicLink": "Use magic link instead", + "enterEmailForMagicLink": "Enter your email for magic link", + "sending": "Sendingâ€Ļ", + "sendMagicLink": "Send Magic Link", + "cancel": "Cancel", + "dontHaveAccount": "Don't have an account? Sign up", + "home": "Home", + "debug": "Debug", + "signOut": "Sign Out", + "pleaseEnterBoth": "Please enter both email and password", + "pleaseEnterEmail": "Please enter your email address", + "magicLinkSent": "Magic link sent to {{email}}! Check your email and click the link to sign in.", + "passwordResetSent": "Password reset link sent to {{email}}! Check your email and follow the instructions.", + "failedToSignIn": "Failed to sign in with {{provider}}: {{message}}", + "unexpectedError": "Unexpected error: {{message}}", + "accountCreatedSuccess": "Account created successfully! You can now sign in.", + "passwordChangedSuccess": "Password changed successfully! Please sign in with your new password.", + "credentialsUpdated": "Your credentials have been updated. Please sign in again." + }, + "signup": { + "title": "Create an account", + "subtitle": "Join Stirling PDF to get started", + "name": "Name", + "email": "Email", + "password": "Password", + "confirmPassword": "Confirm password", + "enterName": "Enter your name", + "enterEmail": "Enter your email", + "enterPassword": "Enter your password", + "confirmPasswordPlaceholder": "Confirm password", + "or": "or", + "creatingAccount": "Creating Account...", + "signUp": "Sign Up", + "alreadyHaveAccount": "Already have an account? Sign in", + "pleaseFillAllFields": "Please fill in all fields", + "passwordsDoNotMatch": "Passwords do not match", + "passwordTooShort": "Password must be at least 6 characters long", + "invalidEmail": "Please enter a valid email address", + "checkEmailConfirmation": "Check your email for a confirmation link to complete your registration.", + "accountCreatedSuccessfully": "Account created successfully! You can now sign in.", + "unexpectedError": "Unexpected error: {{message}}", + "useEmailInstead": "Use Email Instead", + "nameRequired": "Name is required", + "emailRequired": "Email is required", + "passwordRequired": "Password is required", + "confirmPasswordRequired": "Please confirm your password" }, "pdfToSinglePage": { "title": "PDF Til Enkelt Side", "header": "PDF Til Enkelt Side", - "submit": "KonvertÊr Til Enkelt Side" + "submit": "KonvertÊr Til Enkelt Side", + "description": "This tool will merge all pages of your PDF into one large single page. The width will remain the same as the original pages, but the height will be the sum of all page heights.", + "filenamePrefix": "single_page", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst converting to single page." + }, + "results": { + "title": "Single Page Results" + } }, "pageExtracter": { "title": "UdtrÃĻk Sider", @@ -1469,18 +3373,59 @@ "adjustContrast": { "title": "JustÊr Kontrast", "header": "JustÊr Kontrast", + "basic": "Basic Adjustments", "contrast": "Kontrast:", "brightness": "Lysstyrke:", "saturation": "MÃĻtning:", - "download": "Download" + "download": "Download", + "adjustColors": "Adjust Colors", + "blue": "Blue", + "confirm": "Confirm", + "error": { + "failed": "Failed to adjust colors/contrast" + }, + "green": "Green", + "noPreview": "Select a PDF to preview", + "red": "Red", + "results": { + "title": "Adjusted PDF" + } }, "compress": { "title": "Komprimer", + "desc": "Compress PDFs to reduce their file size.", "header": "Komprimer PDF", + "method": { + "title": "Compression Method", + "quality": "Quality", + "filesize": "Filstørrelse" + }, "credit": "Denne tjeneste bruger qpdf til PDF Komprimering/Optimering.", "grayscale": { "label": "Anvend grÃĨskala til komprimering" }, + "tooltip": { + "header": { + "title": "Compress Settings Overview" + }, + "description": { + "title": "Description", + "text": "Compression is an easy way to reduce your file size. Pick File Size to enter a target size and have us adjust quality for you. Pick Quality to set compression strength manually." + }, + "qualityAdjustment": { + "title": "Quality Adjustment", + "text": "Drag the slider to adjust the compression strength. Lower values (1-3) preserve quality but result in larger files. Higher values (7-9) shrink the file more but reduce image clarity.", + "bullet1": "Lower values preserve quality", + "bullet2": "Higher values reduce file size" + }, + "grayscale": { + "title": "Grayscale", + "text": "Select this option to convert all images to black and white, which can significantly reduce file size especially for scanned PDFs or image-heavy documents." + } + }, + "error": { + "failed": "An error occurred while compressing the PDF." + }, "selectText": { "1": { "_value": "Compression Settings", @@ -1490,10 +3435,7 @@ "4": "Auto tilstand - Justerer automatisk kvaliteten for at fÃĨ PDF'en til en prÃĻcis størrelse", "5": "Forventet PDF-størrelse (f.eks. 25MB, 10.8MB, 25KB)" }, - "submit": "Komprimer", - "method": { - "filesize": "Filstørrelse" - } + "submit": "Komprimer" }, "decrypt": { "passwordPrompt": "This file is password-protected. Please enter the password:", @@ -1594,7 +3536,13 @@ "title": "Fjern billede", "header": "Fjern billede", "removeImage": "Fjern billede", - "submit": "Fjern" + "submit": "Fjern", + "error": { + "failed": "Failed to remove images from the PDF." + }, + "results": { + "title": "Remove Images Results" + } }, "splitByChapters": { "title": "Del PDF ved Kapitler", @@ -1628,6 +3576,12 @@ }, "note": "Release notes are only available in English" }, + "swagger": { + "title": "API Documentation", + "header": "API Documentation", + "desc": "View and test the Stirling PDF API endpoints", + "tags": "api,documentation,swagger,endpoints,development" + }, "cookieBanner": { "popUp": { "title": "How we use Cookies", @@ -1663,42 +3617,943 @@ "title": "Analytics", "description": "These cookies help us understand how our tools are being used, so we can focus on building the features our community values most. Rest assured—Stirling PDF cannot and will never track the content of the documents you work with." } + }, + "services": { + "posthog": "PostHog Analytics", + "scarf": "Scarf Pixel" } }, - "convert": { - "title": "KonvertÊr", - "settings": "Indstillinger", - "color": "Farve", - "greyscale": "GrÃĨtone", - "fillPage": "Udfyld Side", - "pdfaDigitalSignatureWarning": "PDF'en indeholder en digital signatur. Dette vil blive fjernet i nÃĻste trin.", - "grayscale": "GrÃĨtone" + "removeMetadata": { + "submit": "Remove Metadata" }, - "attachments": { - "tags": "embed,attach,file,attachment,attachments", - "title": "Add attachments", - "header": "Add attachments", - "submit": "Add attachments" + "sidebar": { + "toggle": "Toggle Sidebar" + }, + "theme": { + "toggle": "Toggle Theme" + }, + "view": { + "viewer": "Viewer", + "pageEditor": "Page Editor", + "fileManager": "File Manager" + }, + "pageEditor": { + "title": "Page Editor", + "save": "Save Changes", + "noPdfLoaded": "No PDF loaded. Please upload a PDF to edit.", + "rotatedLeft": "Rotated left:", + "rotatedRight": "Rotated right:", + "deleted": "Deleted:", + "movedLeft": "Moved left:", + "movedRight": "Moved right:", + "splitAt": "Split at:", + "insertedPageBreak": "Inserted page break at:", + "addFileNotImplemented": "Add file not implemented in demo", + "closePdf": "Close PDF", + "reset": "Reset Changes", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "fitToWidth": "Fit to Width", + "actualSize": "Actual Size" + }, + "viewer": { + "firstPage": "First Page", + "lastPage": "Last Page", + "previousPage": "Previous Page", + "nextPage": "Next Page", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "singlePageView": "Single Page View", + "dualPageView": "Dual Page View" + }, + "rightRail": { + "closeSelected": "Close Selected Files", + "selectAll": "Select All", + "deselectAll": "Deselect All", + "selectByNumber": "Select by Page Numbers", + "deleteSelected": "Delete Selected Pages", + "closePdf": "Close PDF", + "exportAll": "Export PDF", + "downloadSelected": "Download Selected Files", + "downloadAll": "Download All", + "toggleTheme": "Toggle Theme", + "language": "Language", + "search": "Search PDF", + "panMode": "Pan Mode", + "rotateLeft": "Rotate Left", + "rotateRight": "Rotate Right", + "toggleSidebar": "Toggle Sidebar", + "exportSelected": "Export Selected Pages", + "toggleAnnotations": "Toggle Annotations Visibility", + "annotationMode": "Toggle Annotation Mode", + "draw": "Draw", + "save": "Save" + }, + "search": { + "title": "Search PDF", + "placeholder": "Enter search term...", + "noResults": "No results found", + "searching": "Searching..." + }, + "guestBanner": { + "title": "You're using Stirling PDF as a guest!", + "message": "Create a free account to save your work, access more features, and support the project.", + "dismiss": "Dismiss banner", + "signUp": "Sign Up Free" + }, + "toolPicker": { + "searchPlaceholder": "Search tools...", + "noToolsFound": "No tools found", + "allTools": "ALL TOOLS", + "quickAccess": "QUICK ACCESS", + "categories": { + "standardTools": "Standard Tools", + "advancedTools": "Advanced Tools", + "recommendedTools": "Recommended Tools" + }, + "subcategories": { + "signing": "Signing", + "documentSecurity": "Document Security", + "verification": "Verification", + "documentReview": "Document Review", + "pageFormatting": "Page Formatting", + "extraction": "Extraction", + "removal": "Removal", + "automation": "Automation", + "general": "General", + "advancedFormatting": "Advanced Formatting", + "developerTools": "Developer Tools" + } }, "quickAccess": { - "sign": "Underskriv" + "read": "Read", + "sign": "Underskriv", + "automate": "Automate", + "files": "Files", + "activity": "Activity", + "help": "Help", + "account": "Account", + "config": "Config", + "adminSettings": "Admin Settings", + "allTools": "All Tools" + }, + "admin": { + "error": "Error", + "success": "Success", + "expand": "Expand", + "close": "Close", + "status": { + "active": "Active", + "inactive": "Inactive" + }, + "settings": { + "title": "Admin Settings", + "workspace": "Workspace", + "fetchError": "Failed to load settings", + "saveError": "Failed to save settings", + "saved": "Settings saved successfully", + "saveSuccess": "Settings saved successfully", + "save": "Save Changes", + "restartRequired": "Restart Required", + "restart": { + "title": "Restart Required", + "message": "Settings have been saved successfully. A server restart is required for the changes to take effect.", + "question": "Would you like to restart the server now or later?", + "now": "Restart Now", + "later": "Restart Later" + }, + "restarting": "Restarting Server", + "restartingMessage": "The server is restarting. Please wait a moment...", + "restartError": "Failed to restart server. Please restart manually.", + "general": { + "title": "System Settings", + "description": "Configure system-wide application settings including branding and default behaviour.", + "ui": "User Interface", + "system": "System", + "appName": { + "label": "Application Name", + "description": "The name displayed in the browser tab and home page" + }, + "appNameNavbar": { + "label": "Navbar Brand", + "description": "The name displayed in the navigation bar" + }, + "homeDescription": { + "label": "Home Description", + "description": "The description text shown on the home page" + }, + "defaultLocale": { + "label": "Default Locale", + "description": "The default language for new users (e.g., en_US, es_ES)" + }, + "fileUploadLimit": { + "label": "File Upload Limit", + "description": "Maximum file upload size (e.g., 100MB, 1GB)" + }, + "showUpdate": { + "label": "Show Update Notifications", + "description": "Display notifications when a new version is available" + }, + "showUpdateOnlyAdmin": { + "label": "Show Updates to Admins Only", + "description": "Restrict update notifications to admin users only" + }, + "customHTMLFiles": { + "label": "Custom HTML Files", + "description": "Allow serving custom HTML files from the customFiles directory" + }, + "languages": { + "label": "Available Languages", + "description": "Languages that users can select from (leave empty to enable all languages)" + }, + "customMetadata": { + "label": "Custom Metadata", + "autoUpdate": { + "label": "Auto Update Metadata", + "description": "Automatically update PDF metadata on all processed documents" + }, + "author": { + "label": "Default Author", + "description": "Default author for PDF metadata (e.g., username)" + }, + "creator": { + "label": "Default Creator", + "description": "Default creator for PDF metadata" + }, + "producer": { + "label": "Default Producer", + "description": "Default producer for PDF metadata" + } + }, + "customPaths": { + "label": "Custom Paths", + "description": "Configure custom file system paths for pipeline processing and external tools", + "pipeline": { + "label": "Pipeline Directories", + "watchedFoldersDir": { + "label": "Watched Folders Directory", + "description": "Directory where pipeline monitors for incoming PDFs (leave empty for default: /pipeline/watchedFolders)" + }, + "finishedFoldersDir": { + "label": "Finished Folders Directory", + "description": "Directory where processed PDFs are outputted (leave empty for default: /pipeline/finishedFolders)" + } + }, + "operations": { + "label": "External Tool Paths", + "weasyprint": { + "label": "WeasyPrint Executable", + "description": "Path to WeasyPrint executable for HTML to PDF conversion (leave empty for default: /opt/venv/bin/weasyprint)" + }, + "unoconvert": { + "label": "Unoconvert Executable", + "description": "Path to LibreOffice unoconvert for document conversions (leave empty for default: /opt/venv/bin/unoconvert)" + } + } + } + }, + "security": { + "title": "Security", + "description": "Configure authentication, login behaviour, and security policies.", + "ssoNotice": { + "title": "Looking for SSO/SAML settings?", + "message": "OAuth2 and SAML2 authentication providers have been moved to the Connections menu for easier management." + }, + "authentication": "Authentication", + "enableLogin": { + "label": "Enable Login", + "description": "Require users to log in before accessing the application" + }, + "loginMethod": { + "label": "Login Method", + "description": "The authentication method to use for user login", + "all": "All Methods", + "normal": "Username/Password Only", + "oauth2": "OAuth2 Only", + "saml2": "SAML2 Only" + }, + "loginAttemptCount": { + "label": "Login Attempt Limit", + "description": "Maximum number of failed login attempts before account lockout" + }, + "loginResetTimeMinutes": { + "label": "Login Reset Time (minutes)", + "description": "Time before failed login attempts are reset" + }, + "csrfDisabled": { + "label": "Disable CSRF Protection", + "description": "Disable Cross-Site Request Forgery protection (not recommended)" + }, + "initialLogin": { + "label": "Initial Login", + "username": { + "label": "Initial Username", + "description": "The username for the initial admin account" + }, + "password": { + "label": "Initial Password", + "description": "The password for the initial admin account" + } + }, + "jwt": { + "label": "JWT Configuration", + "secureCookie": { + "label": "Secure Cookie", + "description": "Require HTTPS for JWT cookies (recommended for production)" + }, + "keyRetentionDays": { + "label": "Key Retention Days", + "description": "Number of days to retain old JWT keys for verification" + }, + "persistence": { + "label": "Enable Key Persistence", + "description": "Store JWT keys persistently to survive server restarts" + }, + "enableKeyRotation": { + "label": "Enable Key Rotation", + "description": "Automatically rotate JWT signing keys periodically" + }, + "enableKeyCleanup": { + "label": "Enable Key Cleanup", + "description": "Automatically remove expired JWT keys" + } + }, + "audit": { + "label": "Audit Logging", + "enabled": { + "label": "Enable Audit Logging", + "description": "Track user actions and system events for compliance and security monitoring" + }, + "level": { + "label": "Audit Level", + "description": "0=OFF, 1=BASIC, 2=STANDARD, 3=VERBOSE" + }, + "retentionDays": { + "label": "Audit Retention (days)", + "description": "Number of days to retain audit logs" + } + }, + "htmlUrlSecurity": { + "label": "HTML URL Security", + "description": "Configure URL access restrictions for HTML processing to prevent SSRF attacks", + "enabled": { + "label": "Enable URL Security", + "description": "Enable URL security restrictions for HTML to PDF conversions" + }, + "level": { + "label": "Security Level", + "description": "MAX: whitelist only, MEDIUM: block internal networks, OFF: no restrictions", + "max": "Maximum (Whitelist Only)", + "medium": "Medium (Block Internal)", + "off": "Off (No Restrictions)" + }, + "advanced": "Advanced Settings", + "allowedDomains": { + "label": "Allowed Domains (Whitelist)", + "description": "One domain per line (e.g., cdn.example.com). Only these domains allowed when level is MAX" + }, + "blockedDomains": { + "label": "Blocked Domains (Blacklist)", + "description": "One domain per line (e.g., malicious.com). Additional domains to block" + }, + "internalTlds": { + "label": "Internal TLDs", + "description": "One TLD per line (e.g., .local, .internal). Block domains with these TLD patterns" + }, + "networkBlocking": "Network Blocking", + "blockPrivateNetworks": { + "label": "Block Private Networks", + "description": "Block RFC 1918 private networks (10.x.x.x, 192.168.x.x, 172.16-31.x.x)" + }, + "blockLocalhost": { + "label": "Block Localhost", + "description": "Block localhost and loopback addresses (127.x.x.x, ::1)" + }, + "blockLinkLocal": { + "label": "Block Link-Local Addresses", + "description": "Block link-local addresses (169.254.x.x, fe80::/10)" + }, + "blockCloudMetadata": { + "label": "Block Cloud Metadata Endpoints", + "description": "Block cloud provider metadata endpoints (169.254.169.254)" + } + } + }, + "connections": { + "title": "Connections", + "description": "Configure external authentication providers like OAuth2 and SAML.", + "linkedServices": "Linked Services", + "unlinkedServices": "Unlinked Services", + "connect": "Connect", + "disconnect": "Disconnect", + "disconnected": "Provider disconnected successfully", + "disconnectError": "Failed to disconnect provider", + "ssoAutoLogin": { + "label": "SSO Auto Login", + "enable": "Enable SSO Auto Login", + "description": "Automatically redirect to SSO login when authentication is required" + }, + "oauth2": { + "label": "OAuth2", + "enabled": { + "label": "Enable OAuth2", + "description": "Allow users to authenticate using OAuth2 providers" + }, + "provider": { + "label": "Provider", + "description": "The OAuth2 provider to use for authentication" + }, + "issuer": { + "label": "Issuer URL", + "description": "The OAuth2 provider issuer URL" + }, + "clientId": { + "label": "Client ID", + "description": "The OAuth2 client ID from your provider" + }, + "clientSecret": { + "label": "Client Secret", + "description": "The OAuth2 client secret from your provider" + }, + "useAsUsername": { + "label": "Use as Username", + "description": "The OAuth2 claim to use as the username (e.g., email, sub)" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first OAuth2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via OAuth2" + }, + "scopes": { + "label": "OAuth2 Scopes", + "description": "Comma-separated list of OAuth2 scopes to request (e.g., openid, profile, email)" + } + }, + "saml2": { + "label": "SAML2", + "enabled": { + "label": "Enable SAML2", + "description": "Allow users to authenticate using SAML2 providers" + }, + "provider": { + "label": "Provider", + "description": "The SAML2 provider name" + }, + "registrationId": { + "label": "Registration ID", + "description": "The SAML2 registration identifier" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first SAML2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via SAML2" + } + } + }, + "database": { + "title": "Database", + "description": "Configure custom database connection settings for enterprise deployments.", + "configuration": "Database Configuration", + "enableCustom": { + "label": "Enable Custom Database", + "description": "Use your own custom database configuration instead of the default embedded database" + }, + "customUrl": { + "label": "Custom Database URL", + "description": "Full JDBC connection string (e.g., jdbc:postgresql://localhost:5432/postgres). If provided, individual connection settings below are not used." + }, + "type": { + "label": "Database Type", + "description": "Type of database (not used if custom URL is provided)" + }, + "hostName": { + "label": "Host Name", + "description": "Database server hostname (not used if custom URL is provided)" + }, + "port": { + "label": "Port", + "description": "Database server port (not used if custom URL is provided)" + }, + "name": { + "label": "Database Name", + "description": "Name of the database (not used if custom URL is provided)" + }, + "username": { + "label": "Username", + "description": "Database authentication username" + }, + "password": { + "label": "Password", + "description": "Database authentication password" + } + }, + "privacy": { + "title": "Privacy", + "description": "Configure privacy and data collection settings.", + "analytics": "Analytics & Tracking", + "enableAnalytics": { + "label": "Enable Analytics", + "description": "Collect anonymous usage analytics to help improve the application" + }, + "metricsEnabled": { + "label": "Enable Metrics", + "description": "Enable collection of performance and usage metrics. Provides API endpoint for admins to access metrics data" + }, + "searchEngine": "Search Engine Visibility", + "googleVisibility": { + "label": "Google Visibility", + "description": "Allow search engines to index this application" + } + }, + "advanced": { + "title": "Advanced", + "description": "Configure advanced features and experimental functionality.", + "features": "Feature Flags", + "processing": "Processing", + "endpoints": { + "label": "Endpoints", + "manage": "Manage API Endpoints", + "description": "Endpoint management is configured via YAML. See documentation for details on enabling/disabling specific endpoints." + }, + "enableAlphaFunctionality": { + "label": "Enable Alpha Features", + "description": "Enable experimental and alpha-stage features (may be unstable)" + }, + "enableUrlToPDF": { + "label": "Enable URL to PDF", + "description": "Allow conversion of web pages to PDF documents" + }, + "maxDPI": { + "label": "Maximum DPI", + "description": "Maximum DPI for image processing (0 = unlimited)" + }, + "tessdataDir": { + "label": "Tessdata Directory", + "description": "Path to the tessdata directory for OCR language files" + }, + "disableSanitize": { + "label": "Disable HTML Sanitization", + "description": "WARNING: Security risk - disabling HTML sanitization can lead to XSS vulnerabilities" + }, + "tempFileManagement": { + "label": "Temp File Management", + "description": "Configure temporary file storage and cleanup behavior", + "baseTmpDir": { + "label": "Base Temp Directory", + "description": "Base directory for temporary files (leave empty for default: java.io.tmpdir/stirling-pdf)" + }, + "libreofficeDir": { + "label": "LibreOffice Temp Directory", + "description": "Directory for LibreOffice temp files (leave empty for default: baseTmpDir/libreoffice)" + }, + "systemTempDir": { + "label": "System Temp Directory", + "description": "System temp directory to clean (only used if cleanupSystemTemp is enabled)" + }, + "prefix": { + "label": "Temp File Prefix", + "description": "Prefix for temp file names" + }, + "maxAgeHours": { + "label": "Max Age (hours)", + "description": "Maximum age in hours before temp files are cleaned up" + }, + "cleanupIntervalMinutes": { + "label": "Cleanup Interval (minutes)", + "description": "How often to run cleanup (in minutes)" + }, + "startupCleanup": { + "label": "Startup Cleanup", + "description": "Clean up old temp files on application startup" + }, + "cleanupSystemTemp": { + "label": "Cleanup System Temp", + "description": "Whether to clean broader system temp directory (use with caution)" + } + }, + "processExecutor": { + "label": "Process Executor Limits", + "description": "Configure session limits and timeouts for each process executor", + "sessionLimit": { + "label": "Session Limit", + "description": "Maximum concurrent instances" + }, + "timeout": { + "label": "Timeout (minutes)", + "description": "Maximum execution time" + }, + "libreOffice": "LibreOffice", + "pdfToHtml": "PDF to HTML", + "qpdf": "QPDF", + "tesseract": "Tesseract OCR", + "pythonOpenCv": "Python OpenCV", + "weasyPrint": "WeasyPrint", + "installApp": "Install App", + "calibre": "Calibre", + "ghostscript": "Ghostscript", + "ocrMyPdf": "OCRmyPDF" + } + }, + "mail": { + "title": "Mail Server", + "description": "Configure SMTP settings for sending email notifications.", + "smtp": "SMTP Configuration", + "enabled": { + "label": "Enable Mail", + "description": "Enable email notifications and SMTP functionality" + }, + "host": { + "label": "SMTP Host", + "description": "The hostname or IP address of your SMTP server" + }, + "port": { + "label": "SMTP Port", + "description": "The port number for SMTP connection (typically 25, 465, or 587)" + }, + "username": { + "label": "SMTP Username", + "description": "Username for SMTP authentication" + }, + "password": { + "label": "SMTP Password", + "description": "Password for SMTP authentication" + }, + "from": { + "label": "From Address", + "description": "The email address to use as the sender" + }, + "enableInvites": { + "label": "Enable Email Invites", + "description": "Allow admins to invite users via email with auto-generated passwords" + }, + "frontendUrl": { + "label": "Frontend URL", + "description": "Base URL for frontend (e.g. https://pdf.example.com). Used for generating invite links in emails. Leave empty to use backend URL." + } + }, + "legal": { + "title": "Legal Documents", + "description": "Configure links to legal documents and policies.", + "disclaimer": { + "title": "Legal Responsibility Warning", + "message": "By customizing these legal documents, you assume full responsibility for ensuring compliance with all applicable laws and regulations, including but not limited to GDPR and other EU data protection requirements. Only modify these settings if: (1) you are operating a personal/private instance, (2) you are outside EU jurisdiction and understand your local legal obligations, or (3) you have obtained proper legal counsel and accept sole responsibility for all user data and legal compliance. Stirling-PDF and its developers assume no liability for your legal obligations." + }, + "termsAndConditions": { + "label": "Terms and Conditions", + "description": "URL or filename to terms and conditions" + }, + "privacyPolicy": { + "label": "Privacy Policy", + "description": "URL or filename to privacy policy" + }, + "accessibilityStatement": { + "label": "Accessibility Statement", + "description": "URL or filename to accessibility statement" + }, + "cookiePolicy": { + "label": "Cookie Policy", + "description": "URL or filename to cookie policy" + }, + "impressum": { + "label": "Impressum", + "description": "URL or filename to impressum (required in some jurisdictions)" + } + }, + "premium": { + "title": "Premium & Enterprise", + "description": "Configure your premium or enterprise license key.", + "license": "License Configuration", + "key": { + "label": "License Key", + "description": "Enter your premium or enterprise license key" + }, + "enabled": { + "label": "Enable Premium Features", + "description": "Enable license key checks for pro/enterprise features" + }, + "movedFeatures": { + "title": "Premium Features Distributed", + "message": "Premium and Enterprise features are now organized in their respective sections:" + } + }, + "features": { + "title": "Features", + "description": "Configure optional features and functionality.", + "serverCertificate": { + "label": "Server Certificate", + "description": "Configure server-side certificate generation for \"Sign with Stirling-PDF\" functionality", + "enabled": { + "label": "Enable Server Certificate", + "description": "Enable server-side certificate for \"Sign with Stirling-PDF\" option" + }, + "organizationName": { + "label": "Organization Name", + "description": "Organization name for generated certificates" + }, + "validity": { + "label": "Certificate Validity (days)", + "description": "Number of days the certificate will be valid" + }, + "regenerateOnStartup": { + "label": "Regenerate on Startup", + "description": "Generate new certificate on each application startup" + } + } + }, + "endpoints": { + "title": "API Endpoints", + "description": "Control which API endpoints and endpoint groups are available.", + "management": "Endpoint Management", + "toRemove": { + "label": "Disabled Endpoints", + "description": "Select individual endpoints to disable" + }, + "groupsToRemove": { + "label": "Disabled Endpoint Groups", + "description": "Select endpoint groups to disable" + }, + "note": "Note: Disabling endpoints restricts API access but does not remove UI components. Restart required for changes to take effect." + } + } }, "fileUpload": { - "loading": "Laster..." + "selectFile": "Select a file", + "selectFiles": "Select files", + "selectPdfToView": "Select a PDF to view", + "selectPdfToEdit": "Select a PDF to edit", + "chooseFromStorage": "Choose a file from storage or upload a new PDF", + "chooseFromStorageMultiple": "Choose files from storage or upload new PDFs", + "loadFromStorage": "Load from Storage", + "filesAvailable": "files available", + "loading": "Laster...", + "or": "or", + "dropFileHere": "Drop file here or click to upload", + "dropFilesHere": "Drop files here or click the upload button", + "pdfFilesOnly": "PDF files only", + "supportedFileTypes": "Supported file types", + "upload": "Upload", + "uploadFile": "Upload File", + "uploadFiles": "Upload Files", + "noFilesInStorage": "No files available in storage. Upload some files first.", + "selectFromStorage": "Select from Storage", + "backToTools": "Back to Tools", + "addFiles": "Add Files", + "dragFilesInOrClick": "Drag files in or click \"Add Files\" to browse" + }, + "fileEditor": { + "addFiles": "Add Files" }, "fileManager": { + "title": "Upload PDF Files", + "subtitle": "Add files to your storage for easy access across tools", + "filesSelected": "files selected", + "clearSelection": "Clear Selection", + "openInFileEditor": "Open in File Editor", + "uploadError": "Failed to upload some files.", + "failedToOpen": "Failed to open file. It may have been removed from storage.", + "failedToLoad": "Failed to load file to active set.", + "storageCleared": "Browser cleared storage. Files have been removed. Please re-upload.", + "clearAll": "Clear All", + "reloadFiles": "Reload Files", + "dragDrop": "Drag & Drop files here", + "clickToUpload": "Click to upload files", + "selectedFiles": "Selected Files", + "storage": "Storage", + "filesStored": "files stored", + "storageError": "Storage error occurred", + "storageLow": "Storage is running low. Consider removing old files.", + "supportMessage": "Powered by browser database storage for unlimited capacity", + "noFileSelected": "No files selected", + "showHistory": "Show History", + "hideHistory": "Hide History", + "fileHistory": "File History", + "loadingHistory": "Loading History...", + "lastModified": "Last Modified", + "toolChain": "Tools Applied", + "restore": "Restore", + "unzip": "Unzip", + "searchFiles": "Search files...", + "recent": "Recent", + "localFiles": "Local Files", + "googleDrive": "Google Drive", + "googleDriveShort": "Drive", + "myFiles": "My Files", + "noRecentFiles": "No recent files found", + "googleDriveNotAvailable": "Google Drive integration not available", + "openFiles": "Open Files", + "openFile": "Open File", + "details": "File Details", "fileName": "Navn", - "delete": "Slet" + "fileFormat": "Format", + "fileSize": "Size", + "fileVersion": "Version", + "totalSelected": "Total Selected", + "dropFilesHere": "Drop files here", + "selectAll": "Select All", + "deselectAll": "Deselect All", + "deleteSelected": "Delete Selected", + "downloadSelected": "Download Selected", + "selectedCount": "{{count}} selected", + "download": "Download", + "delete": "Slet", + "unsupported": "Unsupported", + "addToUpload": "Add to Upload", + "deleteAll": "Delete All", + "loadingFiles": "Loading files...", + "noFiles": "No files available", + "noFilesFound": "No files found matching your search", + "openInPageEditor": "Open in Page Editor", + "showAll": "Show All", + "sortByDate": "Sort by Date", + "sortByName": "Sort by Name", + "sortBySize": "Sort by Size" + }, + "storage": { + "temporaryNotice": "Files are stored temporarily in your browser and may be cleared automatically", + "storageLimit": "Storage limit", + "storageUsed": "Temporary Storage used", + "storageFull": "Storage is nearly full. Consider removing some files.", + "fileTooLarge": "File too large. Maximum size per file is", + "storageQuotaExceeded": "Storage quota exceeded. Please remove some files before uploading more.", + "approximateSize": "Approximate size" }, "sanitize": { + "title": "Sanitise", + "desc": "Remove potentially harmful elements from PDF files.", "submit": "Rens PDF", + "completed": "Sanitisation completed successfully", + "error": { + "generic": "Sanitisation failed", + "failed": "An error occurred while sanitising the PDF." + }, + "filenamePrefix": "sanitised", + "sanitizationResults": "Sanitisation Results", "steps": { - "settings": "Indstillinger" + "files": "Files", + "settings": "Indstillinger", + "results": "Results" + }, + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "options": { + "title": "Sanitisation Options", + "note": "Select the elements you want to remove from the PDF. At least one option must be selected.", + "removeJavaScript": { + "label": "Remove JavaScript", + "desc": "Remove JavaScript actions and scripts from the PDF" + }, + "removeEmbeddedFiles": { + "label": "Remove Embedded Files", + "desc": "Remove any files embedded within the PDF" + }, + "removeXMPMetadata": { + "label": "Remove XMP Metadata", + "desc": "Remove XMP metadata from the PDF" + }, + "removeMetadata": { + "label": "Remove Document Metadata", + "desc": "Remove document information metadata (title, author, etc.)" + }, + "removeLinks": { + "label": "Remove Links", + "desc": "Remove external links and launch actions from the PDF" + }, + "removeFonts": { + "label": "Remove Fonts", + "desc": "Remove embedded fonts from the PDF" + } + } + }, + "addPassword": { + "title": "Tilføj Adgangskode", + "desc": "Encrypt your PDF document with a password.", + "completed": "Password protection applied", + "submit": "KryptÊr", + "filenamePrefix": "encrypted", + "error": { + "failed": "An error occurred while encrypting the PDF." + }, + "passwords": { + "stepTitle": "Passwords & Encryption", + "completed": "Passwords configured", + "user": { + "label": "User Password", + "placeholder": "Enter user password" + }, + "owner": { + "label": "Owner Password", + "placeholder": "Enter owner password" + } + }, + "encryption": { + "keyLength": { + "label": "Encryption Key Length", + "40bit": "40-bit (Low)", + "128bit": "128-bit (Standard)", + "256bit": "256-bit (High)" + } + }, + "results": { + "title": "Encrypted PDFs" + }, + "tooltip": { + "header": { + "title": "Password Protection Overview" + }, + "passwords": { + "title": "Password Types", + "text": "User passwords restrict opening the document, while owner passwords control what can be done with the document once opened. You can set both or just one.", + "bullet1": "User Password: Required to open the PDF", + "bullet2": "Owner Password: Controls document permissions (not supported by all PDF viewers)" + }, + "encryption": { + "title": "Encryption Levels", + "text": "Higher encryption levels provide better security but may not be supported by older PDF viewers.", + "bullet1": "40-bit: Basic security, compatible with older viewers", + "bullet2": "128-bit: Standard security, widely supported", + "bullet3": "256-bit: Maximum security, requires modern viewers" + }, + "permissions": { + "title": "Ændre Tilladelser", + "text": "These permissions control what users can do with the PDF. Most effective when combined with an owner password." + } + }, + "tags": "sikker,sikkerhed", + "header": "Tilføj adgangskode (KryptÊr)", + "selectText": { + "1": "VÃĻlg PDF til kryptering", + "2": "Brugeradgangskode", + "3": "KrypteringsnøglelÃĻngde", + "4": "Højere vÃĻrdier er stÃĻrkere, men lavere vÃĻrdier har bedre kompatibilitet.", + "5": "Tilladelser at indstille (Anbefales at bruges sammen med Ejer adgangskode)", + "6": "Forhindre samling af dokument", + "7": "Forhindre indholdsudtrÃĻkning", + "8": "Forhindre udtrÃĻkning for tilgÃĻngelighed", + "9": "Forhindre udfyldning af formular", + "10": "Forhindre ÃĻndring", + "11": "Forhindre anmÃĻrkningsÃĻndring", + "12": "Forhindre udskrivning", + "13": "Forhindre udskrivning af forskellige formater", + "14": "Ejer Adgangskode", + "15": "BegrÃĻnser hvad der kan gøres med dokumentet, nÃĨr det er ÃĨbnet (Understøttes ikke af alle lÃĻsere)", + "16": "BegrÃĻnser ÃĨbningen af selve dokumentet" } }, "changePermissions": { "title": "Ændre Tilladelser", + "desc": "Change document restrictions and permissions.", + "completed": "Permissions changed", "submit": "Ændre Tilladelser", + "error": { + "failed": "An error occurred while changing PDF permissions." + }, "permissions": { "preventAssembly": { "label": "Forhindre samling af dokument" @@ -1725,10 +4580,784 @@ "label": "Forhindre udskrivning af forskellige formater" } }, + "results": { + "title": "Modified PDFs" + }, "tooltip": { "header": { "title": "Ændre Tilladelser" + }, + "description": { + "text": "Changes document permissions, allowing/disallowing access to different features in PDF readers." + }, + "warning": { + "text": "To make these permissions unchangeable, use the Add Password tool to set an owner password." } } + }, + "removePassword": { + "title": "Fjern adgangskode", + "desc": "Fjern adgangskodebeskyttelse fra dit PDF-dokument.", + "tags": "sikker,DekryptÊr,sikkerhed,fjern adgangskode,slet adgangskode", + "password": { + "stepTitle": "Fjern Adgangskode", + "label": "NuvÃĻrende Adgangskode", + "placeholder": "Enter current password", + "completed": "Password configured" + }, + "filenamePrefix": "decrypted", + "error": { + "failed": "An error occurred while removing the password from the PDF." + }, + "tooltip": { + "description": "Removing password protection requires the password that was used to encrypt the PDF. This will decrypt the document, making it accessible without a password." + }, + "submit": "Fjern", + "results": { + "title": "Decrypted PDFs" + }, + "header": "Fjern adgangskode (DekryptÊr)", + "selectText": { + "1": "VÃĻlg PDF til Dekryptering", + "2": "Adgangskode" + } + }, + "automate": { + "title": "Automate", + "desc": "Build multi-step workflows by chaining together PDF actions. Ideal for recurring tasks.", + "invalidStep": "Invalid step", + "files": { + "placeholder": "Select files to process with this automation" + }, + "selection": { + "title": "Automation Selection", + "saved": { + "title": "Saved" + }, + "createNew": { + "title": "Create New Automation" + }, + "suggested": { + "title": "Suggested" + } + }, + "creation": { + "createTitle": "Create Automation", + "editTitle": "Edit Automation", + "intro": "Automations run tools sequentially. To get started, add tools in the order you want them to run.", + "name": { + "label": "Automation Name", + "placeholder": "My Automation" + }, + "description": { + "label": "Description (optional)", + "placeholder": "Describe what this automation does..." + }, + "tools": { + "selectTool": "Select a tool...", + "selected": "Selected Tools", + "remove": "Remove tool", + "configure": "Configure tool", + "notConfigured": "! Not Configured", + "addTool": "Add Tool", + "add": "Add a tool..." + }, + "save": "Save Automation", + "unsavedChanges": { + "title": "Unsaved Changes", + "message": "You have unsaved changes. Are you sure you want to go back? All changes will be lost.", + "cancel": "Cancel", + "confirm": "Go Back" + }, + "icon": { + "label": "Icon" + } + }, + "run": { + "title": "Run Automation" + }, + "sequence": { + "unnamed": "Unnamed Automation", + "steps": "{{count}} steps", + "running": "Running Automation...", + "run": "Run Automation", + "finish": "Finish" + }, + "reviewTitle": "Automation Results", + "config": { + "loading": "Loading tool configuration...", + "noSettings": "This tool does not have configurable settings.", + "title": "Configure {{toolName}}", + "description": "Configure the settings for this tool. These settings will be applied when the automation runs.", + "cancel": "Cancel", + "save": "Save Configuration" + }, + "copyToSaved": "Copy to Saved" + }, + "automation": { + "suggested": { + "securePdfIngestion": "Secure PDF Ingestion", + "securePdfIngestionDesc": "Comprehensive PDF processing workflow that sanitises documents, applies OCR with cleanup, converts to PDF/A format for long-term archival, and optimises file size.", + "emailPreparation": "Email Preparation", + "emailPreparationDesc": "Optimises PDFs for email distribution by compressing files, splitting large documents into 20MB chunks for email compatibility, and removing metadata for privacy.", + "secureWorkflow": "Security Workflow", + "secureWorkflowDesc": "Secures PDF documents by removing potentially malicious content like JavaScript and embedded files, then adds password protection to prevent unauthorised access. Password is set to 'password' by default.", + "processImages": "Process Images", + "processImagesDesc": "Converts multiple image files into a single PDF document, then applies OCR technology to extract searchable text from the images." + } + }, + "common": { + "copy": "Copy", + "copied": "Copied!", + "refresh": "Refresh", + "retry": "Retry", + "remaining": "remaining", + "used": "used", + "available": "available", + "cancel": "Cancel", + "preview": "Preview" + }, + "config": { + "overview": { + "title": "Application Configuration", + "description": "Current application settings and configuration details." + }, + "account": { + "overview": { + "title": "Account Settings", + "manageAccountPreferences": "Manage your account preferences", + "guestDescription": "You are signed in as a guest. Consider upgrading your account above." + }, + "upgrade": { + "title": "Upgrade Guest Account", + "description": "Link your account to preserve your history and access more features!", + "socialLogin": "Upgrade with Social Account", + "linkWith": "Link with", + "emailPassword": "or enter your email & password", + "email": "Email", + "emailPlaceholder": "Enter your email", + "password": "Password (optional)", + "passwordPlaceholder": "Set a password", + "passwordNote": "Leave empty to use email verification only", + "upgradeButton": "Upgrade Account" + } + }, + "apiKeys": { + "description": "Your API key for accessing Stirling's suite of PDF tools. Copy it to your project or refresh to generate a new one.", + "publicKeyAriaLabel": "Public API key", + "copyKeyAriaLabel": "Copy API key", + "refreshAriaLabel": "Refresh API key", + "includedCredits": "Included credits", + "purchasedCredits": "Purchased credits", + "totalCredits": "Total Credits", + "chartAriaLabel": "Credits usage: included {{includedUsed}} of {{includedTotal}}, purchased {{purchasedUsed}} of {{purchasedTotal}}", + "nextReset": "Next Reset", + "lastApiUse": "Last API Use", + "overlayMessage": "Generate a key to see credits and available credits", + "label": "API Key", + "guestInfo": "Guest users do not receive API keys. Create an account to get an API key you can use in your applications.", + "goToAccount": "Go to Account", + "refreshModal": { + "title": "Refresh API Keys", + "warning": "âš ī¸ Warning: This action will generate new API keys and make your previous keys invalid.", + "impact": "Any applications or services currently using these keys will stop working until you update them with the new keys.", + "confirmPrompt": "Are you sure you want to continue?", + "confirmCta": "Refresh Keys" + }, + "generateError": "We couldn't generate your API key." + } + }, + "AddAttachmentsRequest": { + "attachments": "Select Attachments", + "info": "Select files to attach to your PDF. These files will be embedded and accessible through the PDF's attachment panel.", + "selectFiles": "Select Files to Attach", + "placeholder": "Choose files...", + "addMoreFiles": "Add more files...", + "selectedFiles": "Selected Files", + "submit": "Add Attachments", + "results": { + "title": "Attachment Results" + }, + "error": { + "failed": "Add attachments operation failed" + } + }, + "termsAndConditions": "Terms & Conditions", + "logOut": "Log out", + "addAttachments": { + "error": { + "failed": "An error occurred while adding attachments to the PDF." + } + }, + "autoRename": { + "description": "This tool will automatically rename PDF files based on their content. It analyzes the document to find the most suitable title from the text." + }, + "customPosition": "Custom Position", + "details": "Details", + "downloadUnavailable": "Download unavailable for this item", + "invalidUndoData": "Cannot undo: invalid operation data", + "margin": { + "large": "Large", + "medium": "Medium", + "small": "Small", + "xLarge": "Extra Large" + }, + "noFilesToUndo": "Cannot undo: no files were processed in the last operation", + "noOperationToUndo": "No operation to undo", + "noValidFiles": "No valid files to process", + "operationCancelled": "Operation cancelled", + "pageEdit": { + "deselectAll": "Select None", + "selectAll": "Select All" + }, + "quickPosition": "Quick Position", + "reorganizePages": { + "error": { + "failed": "Failed to reorganize pages" + }, + "results": { + "title": "Pages Reorganized" + }, + "settings": { + "title": "Settings" + }, + "submit": "Reorganize Pages" + }, + "replace-color": { + "options": { + "fill": "Fill colour", + "gradient": "Gradient" + }, + "previewOverlayOpacity": "Preview overlay opacity", + "previewOverlayTransparency": "Preview overlay transparency", + "previewOverlayVisibility": "Show preview overlay", + "selectText": { + "1": "Erstatt eller omgivende Farvemuligheder", + "2": "Standard (høj kontrastfarver)", + "3": "Brugerdefineret (anpassede farver)", + "4": "Inverter alle farver", + "5": "Høj kontrastfarveindstillinger", + "6": "Hvid tekst pÃĨ sort baggrund", + "7": "Sort tekst pÃĨ hvid baggrund", + "8": "Gul tekst pÃĨ sort baggrund", + "9": "Grøn tekst pÃĨ sort baggrund", + "10": "VÃĻlg tekstfarve", + "11": "VÃĻlg baggrundsfarve", + "12": "Choose start colour", + "13": "Choose end colour" + }, + "submit": "Erstat", + "title": "Replace-Invert-Color", + "header": "Erstat-omgivende Farve PDF" + }, + "size": "Size", + "submit": "Submit", + "success": "Success", + "tools": { + "noSearchResults": "No tools found", + "noTools": "No tools available" + }, + "undoDataMismatch": "Cannot undo: operation data is corrupted", + "undoFailed": "Failed to undo operation", + "undoQuotaError": "Cannot undo: insufficient storage space", + "undoStorageError": "Undo completed but some files could not be saved to storage", + "undoSuccess": "Operation undone successfully", + "unsupported": "Unsupported", + "onboarding": { + "welcomeModal": { + "title": "Welcome to Stirling PDF!", + "description": "Would you like to take a quick 1-minute tour to learn the key features and how to get started?", + "helpHint": "You can always access this tour later from the Help button in the bottom left.", + "startTour": "Start Tour", + "maybeLater": "Maybe Later", + "dontShowAgain": "Don't Show Again" + }, + "allTools": "This is the All Tools panel, where you can browse and select from all available PDF tools.", + "selectCropTool": "Let's select the Crop tool to demonstrate how to use one of the tools.", + "toolInterface": "This is the Crop tool interface. As you can see, there's not much there because we haven't added any PDF files to work with yet.", + "filesButton": "The Files button on the Quick Access bar allows you to upload PDFs to use the tools on.", + "fileSources": "You can upload new files or access recent files from here. For the tour, we'll just use a sample file.", + "workbench": "This is the Workbench - the main area where you view and edit your PDFs.", + "viewSwitcher": "Use these controls to select how you want to view your PDFs.", + "viewer": "The Viewer lets you read and annotate your PDFs.", + "pageEditor": "The Page Editor allows you to do various operations on the pages within your PDFs, such as reordering, rotating and deleting.", + "activeFiles": "The Active Files view shows all of the PDFs you have loaded into the tool, and allows you to select which ones to process.", + "fileCheckbox": "Clicking one of the files selects it for processing. You can select multiple files for batch operations.", + "selectControls": "The Right Rail contains buttons to quickly select/deselect all of your active PDFs, along with buttons to change the app's theme or language.", + "cropSettings": "Now that we've selected the file we want crop, we can configure the Crop tool to choose the area that we want to crop the PDF to.", + "runButton": "Once the tool has been configured, this button allows you to run the tool on all the selected PDFs.", + "results": "After the tool has finished running, the Review step will show a preview of the results in this panel, and allow you to undo the operation or download the file. ", + "fileReplacement": "The modified file will replace the original file in the Workbench automatically, allowing you to easily run it through more tools.", + "pinButton": "You can use the Pin button if you'd rather your files stay active after running tools on them.", + "wrapUp": "You're all set! You've learnt about the main areas of the app and how to use them. Click the Help button whenever you like to see this tour again.", + "previous": "Previous", + "next": "Next", + "finish": "Finish", + "startTour": "Start Tour", + "startTourDescription": "Take a guided tour of Stirling PDF's key features" + }, + "workspace": { + "title": "Workspace", + "people": { + "title": "People", + "description": "Manage workspace members and their permissions", + "loading": "Loading people...", + "searchMembers": "Search members...", + "addMembers": "Add Members", + "inviteMembers": { + "label": "Invite Members", + "subtitle": "Type or paste in emails below, separated by commas. Your workspace will be billed by members." + }, + "user": "User", + "role": "Role", + "team": "Team", + "status": "Status", + "actions": "Actions", + "noMembersFound": "No members found", + "active": "Active", + "disabled": "Disabled", + "activeSession": "Active session", + "member": "Member", + "admin": "Admin", + "roleDescriptions": { + "admin": "Can manage settings and invite members, with full administrative access.", + "member": "Can view and edit shared files, but cannot manage workspace settings or members." + }, + "editRole": "Edit Role", + "enable": "Enable", + "disable": "Disable", + "deleteUser": "Delete User", + "deleteUserSuccess": "User deleted successfully", + "deleteUserError": "Failed to delete user", + "confirmDelete": "Are you sure you want to delete this user? This action cannot be undone.", + "addMember": { + "title": "Add Member", + "username": "Username (Email)", + "usernamePlaceholder": "user@example.com", + "password": "Password", + "passwordPlaceholder": "Enter password", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "forcePasswordChange": "Force password change on first login", + "cancel": "Cancel", + "submit": "Add Member", + "usernameRequired": "Username and password are required", + "passwordTooShort": "Password must be at least 6 characters", + "success": "User created successfully", + "error": "Failed to create user" + }, + "editMember": { + "title": "Edit Member", + "editing": "Editing:", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "cancel": "Cancel", + "submit": "Update Member", + "success": "User updated successfully", + "error": "Failed to update user" + }, + "toggleEnabled": { + "success": "User status updated successfully", + "error": "Failed to update user status" + }, + "delete": { + "success": "User deleted successfully", + "error": "Failed to delete user" + }, + "emailInvite": { + "tab": "Email Invite", + "description": "Type or paste in emails below, separated by commas. Users will receive login credentials via email.", + "emails": "Email Addresses", + "emailsPlaceholder": "user1@example.com, user2@example.com", + "emailsRequired": "At least one email address is required", + "submit": "Send Invites", + "success": "user(s) invited successfully", + "partialSuccess": "Some invites failed", + "allFailed": "Failed to invite users", + "error": "Failed to send invites" + }, + "directInvite": { + "tab": "Direct Create" + }, + "inviteLinkTab": { + "tab": "Invite Link" + }, + "inviteLink": { + "description": "Generate a secure link that allows the user to set their own password", + "email": "Email Address", + "emailPlaceholder": "user@example.com (optional)", + "emailDescription": "Optional - leave blank for a general invite link that can be used by anyone", + "emailRequired": "Email address is required", + "emailOptional": "Optional - leave blank for a general invite link", + "emailRequiredForSend": "Email address is required to send email notification", + "expiryHours": "Expiry Hours", + "expiryDescription": "How many hours until the link expires", + "sendEmail": "Send invite link via email", + "sendEmailDescription": "If enabled, the invite link will be sent to the specified email address", + "smtpRequired": "SMTP not configured", + "generate": "Generate Link", + "generated": "Invite Link Generated", + "copied": "Link copied to clipboard", + "success": "Invite link generated successfully", + "successWithEmail": "Invite link generated and sent via email", + "emailFailed": "Invite link generated, but email failed", + "emailFailedDetails": "Error: {0}. Please share the invite link manually.", + "error": "Failed to generate invite link", + "submit": "Generate Invite Link" + }, + "inviteMode": { + "username": "Username", + "email": "Email", + "link": "Link", + "emailDisabled": "Email invites require SMTP configuration and mail.enableInvites=true in settings" + }, + "license": { + "users": "users", + "availableSlots": "Available Slots", + "grandfathered": "Grandfathered", + "grandfatheredShort": "{{count}} grandfathered", + "fromLicense": "from license", + "slotsAvailable": "{{count}} user slot(s) available", + "noSlotsAvailable": "No slots available", + "currentUsage": "Currently using {{current}} of {{max}} user licences" + } + }, + "teams": { + "title": "Teams", + "description": "Manage teams and organize workspace members", + "loading": "Loading teams...", + "loadingDetails": "Loading team details...", + "createNewTeam": "Create New Team", + "teamName": "Team Name", + "totalMembers": "Total Members", + "actions": "Actions", + "noTeamsFound": "No teams found", + "noMembers": "No members in this team", + "system": "System", + "addMember": "Add Member", + "viewTeam": "View Team", + "removeMember": "Remove from team", + "cannotRemoveFromSystemTeam": "Cannot remove from system team", + "renameTeamLabel": "Rename Team", + "deleteTeamLabel": "Delete Team", + "cannotDeleteInternal": "Cannot delete the Internal team", + "confirmDelete": "Are you sure you want to delete this team? This team must be empty to delete.", + "confirmRemove": "Remove user from this team?", + "cannotRenameInternal": "Cannot rename the Internal team", + "cannotAddToInternal": "Cannot add members to the Internal team", + "teamNotFound": "Team not found", + "backToTeams": "Back to Teams", + "memberCount": "{{count}} members", + "removeMemberSuccess": "User removed from team", + "removeMemberError": "Failed to remove user from team", + "createTeam": { + "title": "Create New Team", + "teamName": "Team Name", + "teamNamePlaceholder": "Enter team name", + "cancel": "Cancel", + "submit": "Create Team", + "nameRequired": "Team name is required", + "success": "Team created successfully", + "error": "Failed to create team" + }, + "renameTeam": { + "title": "Rename Team", + "renaming": "Renaming:", + "newTeamName": "New Team Name", + "newTeamNamePlaceholder": "Enter new team name", + "cancel": "Cancel", + "submit": "Rename Team", + "nameRequired": "Team name is required", + "success": "Team renamed successfully", + "error": "Failed to rename team" + }, + "deleteTeam": { + "success": "Team deleted successfully", + "error": "Failed to delete team. Make sure the team is empty.", + "teamMustBeEmpty": "Team must be empty before deletion" + }, + "addMemberToTeam": { + "title": "Add Member to Team", + "addingTo": "Adding to", + "selectUser": "Select User", + "selectUserPlaceholder": "Choose a user", + "selectUserRequired": "Please select a user", + "currentlyIn": "currently in", + "willBeMoved": "Note: This user will be moved from their current team to this team.", + "cancel": "Cancel", + "submit": "Add Member", + "userRequired": "Please select a user", + "success": "Member added to team successfully", + "error": "Failed to add member to team" + }, + "changeTeam": { + "label": "Change Team", + "title": "Change Team", + "changing": "Moving", + "selectTeam": "Select Team", + "selectTeamPlaceholder": "Choose a team", + "selectTeamRequired": "Please select a team", + "success": "Team changed successfully", + "error": "Failed to change team", + "submit": "Change Team" + } + } + }, + "plan": { + "currency": "Currency", + "popular": "Popular", + "current": "Current Plan", + "upgrade": "Upgrade", + "contact": "Contact Us", + "customPricing": "Custom", + "showComparison": "Compare All Features", + "hideComparison": "Hide Feature Comparison", + "featureComparison": "Feature Comparison", + "activePlan": { + "title": "Active Plan", + "subtitle": "Your current subscription details" + }, + "availablePlans": { + "title": "Available Plans", + "subtitle": "Choose the plan that fits your needs" + }, + "static": { + "title": "Billing Information", + "message": "Online billing is not currently configured. To upgrade your plan or manage subscriptions, please contact us directly.", + "contactSales": "Contact Sales", + "contactToUpgrade": "Contact us to upgrade or customize your plan", + "maxUsers": "Max Users", + "upTo": "Up to" + }, + "period": { + "month": "month" + }, + "free": { + "name": "Free", + "highlight1": "Limited Tool Usage Per week", + "highlight2": "Access to all tools", + "highlight3": "Community support" + }, + "pro": { + "name": "Pro", + "highlight1": "Unlimited Tool Usage", + "highlight2": "Advanced PDF tools", + "highlight3": "No watermarks" + }, + "enterprise": { + "name": "Enterprise", + "highlight1": "Custom pricing", + "highlight2": "Dedicated support", + "highlight3": "Latest features" + }, + "feature": { + "title": "Feature", + "pdfTools": "Basic PDF Tools", + "fileSize": "File Size Limit", + "automation": "Automate tool workflows", + "api": "API Access", + "priority": "Priority Support", + "customPricing": "Custom Pricing" + } + }, + "subscription": { + "status": { + "active": "Active", + "pastDue": "Past Due", + "canceled": "Canceled", + "incomplete": "Incomplete", + "trialing": "Trial", + "none": "No Subscription" + }, + "renewsOn": "Renews on {{date}}", + "cancelsOn": "Cancels on {{date}}" + }, + "billing": { + "manageBilling": "Manage Billing", + "portal": { + "error": "Failed to open billing portal" + } + }, + "payment": { + "preparing": "Preparing your checkout...", + "upgradeTitle": "Upgrade to {{planName}}", + "success": "Payment Successful!", + "successMessage": "Your subscription has been activated successfully. You will receive a confirmation email shortly.", + "autoClose": "This window will close automatically...", + "error": "Payment Error" + }, + "firstLogin": { + "title": "First Time Login", + "welcomeTitle": "Welcome!", + "welcomeMessage": "For security reasons, you must change your password on your first login.", + "loggedInAs": "Logged in as", + "error": "Error", + "currentPassword": "Current Password", + "enterCurrentPassword": "Enter your current password", + "newPassword": "New Password", + "enterNewPassword": "Enter new password (min 8 characters)", + "confirmPassword": "Confirm New Password", + "reEnterNewPassword": "Re-enter new password", + "changePassword": "Change Password", + "allFieldsRequired": "All fields are required", + "passwordsDoNotMatch": "New passwords do not match", + "passwordTooShort": "Password must be at least 8 characters", + "passwordMustBeDifferent": "New password must be different from current password", + "passwordChangedSuccess": "Password changed successfully! Please log in again.", + "passwordChangeFailed": "Failed to change password. Please check your current password." + }, + "invite": { + "welcome": "Welcome to Stirling PDF", + "invalidToken": "Invalid invitation link", + "validationError": "Failed to validate invitation link", + "passwordRequired": "Password is required", + "passwordTooShort": "Password must be at least 6 characters", + "passwordMismatch": "Passwords do not match", + "acceptError": "Failed to create account", + "validating": "Validating invitation...", + "invalidInvitation": "Invalid Invitation", + "goToLogin": "Go to Login", + "welcomeTitle": "You've been invited!", + "welcomeSubtitle": "Complete your account setup to get started", + "accountFor": "Creating account for", + "linkExpires": "Link expires", + "email": "Email address", + "emailPlaceholder": "Enter your email address", + "emailRequired": "Email address is required", + "invalidEmail": "Invalid email address", + "choosePassword": "Choose a password", + "passwordPlaceholder": "Enter your password", + "confirmPassword": "Confirm password", + "confirmPasswordPlaceholder": "Re-enter your password", + "createAccount": "Create Account", + "creating": "Creating Account...", + "alreadyHaveAccount": "Already have an account?", + "signIn": "Sign in" + }, + "audit": { + "error": { + "title": "Error loading audit system" + }, + "notAvailable": "Audit system not available", + "notAvailableMessage": "The audit system is not configured or not available.", + "disabled": "Audit logging is disabled", + "disabledMessage": "Enable audit logging in your application configuration to track system events.", + "systemStatus": { + "title": "System Status", + "status": "Audit Logging", + "enabled": "Enabled", + "disabled": "Disabled", + "level": "Audit Level", + "retention": "Retention Period", + "days": "days", + "totalEvents": "Total Events" + }, + "tabs": { + "dashboard": "Dashboard", + "events": "Audit Events", + "export": "Export" + }, + "charts": { + "title": "Audit Dashboard", + "error": "Error loading charts", + "day": "Day", + "week": "Week", + "month": "Month", + "byType": "Events by Type", + "byUser": "Events by User", + "overTime": "Events Over Time" + }, + "events": { + "title": "Audit Events", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "error": "Error loading events", + "noEvents": "No events found", + "timestamp": "Timestamp", + "type": "Type", + "user": "User", + "ipAddress": "IP Address", + "actions": "Actions", + "viewDetails": "View Details", + "eventDetails": "Event Details", + "details": "Details" + }, + "export": { + "title": "Export Audit Data", + "description": "Export audit events to CSV or JSON format. Use filters to limit the exported data.", + "format": "Export Format", + "filters": "Filters (Optional)", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "exportButton": "Export Data", + "error": "Failed to export data" + } + }, + "usage": { + "noData": "No data available", + "error": "Error loading usage statistics", + "noDataMessage": "No usage statistics are currently available.", + "controls": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All", + "refresh": "Refresh", + "dataTypeLabel": "Data Type:", + "dataType": { + "all": "All", + "api": "API", + "ui": "UI" + } + }, + "showing": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All" + }, + "stats": { + "totalEndpoints": "Total Endpoints", + "totalVisits": "Total Visits", + "showing": "Showing", + "selectedVisits": "Selected Visits" + }, + "chart": { + "title": "Endpoint Usage Chart" + }, + "table": { + "title": "Detailed Statistics", + "endpoint": "Endpoint", + "visits": "Visits", + "percentage": "Percentage", + "noData": "No data available" + } + }, + "backendHealth": { + "checking": "Checking backend status...", + "online": "Backend Online", + "offline": "Backend Offline" + }, + "autoRedact": { + "tags": "Rediger,Skjul,svÃĻrte,sort,markør,skjult", + "title": "Auto Rediger", + "header": "Auto Rediger", + "colorLabel": "Farve", + "textsToRedactLabel": "Tekst der skal redigeres (linje-adskilt)", + "textsToRedactPlaceholder": "f.eks. \\nFortroligt \\nTop-Hemmelig", + "useRegexLabel": "Brug Regex", + "wholeWordSearchLabel": "Hele Ord Søgning", + "customPaddingLabel": "Brugerdefineret Ekstra Polstring", + "convertPDFToImageLabel": "KonvertÊr PDF til PDF-Billede (Bruges til at fjerne tekst bag boksen)", + "submitButton": "Indsend" + }, + "replaceColorPdf": { + "tags": "Erstat Farve,Side operationer,Behandling,server side" } -} \ No newline at end of file +} diff --git a/frontend/public/locales/de-DE/translation.json b/frontend/public/locales/de-DE/translation.json index 4ff3f64ef..3cf8e915b 100644 --- a/frontend/public/locales/de-DE/translation.json +++ b/frontend/public/locales/de-DE/translation.json @@ -1,4 +1,40 @@ { + "toolPanel": { + "modePrompt": { + "title": "Choose how you browse tools", + "description": "Preview both layouts and decide how you want to explore Stirling PDF tools.", + "sidebarTitle": "Sidebar mode", + "sidebarDescription": "Keep tools alongside your workspace for quick switching.", + "recommended": "Recommended", + "chooseSidebar": "Use sidebar mode", + "fullscreenTitle": "Fullscreen mode - (legacy)", + "fullscreenDescription": "Browse every tool in a catalogue that covers the workspace until you pick one.", + "chooseFullscreen": "Use fullscreen mode", + "dismiss": "Maybe later" + }, + "fullscreen": { + "showDetails": "Show Details", + "comingSoon": "Coming soon:", + "favorite": "Add to favourites", + "favorites": "Favourites", + "heading": "All tools (fullscreen view)", + "noResults": "Try adjusting your search or toggle descriptions to find what you need.", + "recommended": "Recommended", + "unfavorite": "Remove from favourites" + }, + "placeholder": "Choose a tool to get started", + "toggle": { + "fullscreen": "Switch to fullscreen mode", + "sidebar": "Switch to sidebar mode" + } + }, + "unsavedChanges": "Sie haben ungespeicherte Änderungen an Ihrer PDF. Was mÃļchten Sie tun?", + "areYouSure": "Are you sure you want to leave?", + "unsavedChangesTitle": "Ungespeicherte Änderungen", + "keepWorking": "Weiterarbeiten", + "discardChanges": "Änderungen verwerfen", + "applyAndContinue": "Anwenden & Fortfahren", + "exportAndContinue": "Exportieren & Fortfahren", "language": { "direction": "ltr" }, @@ -18,8 +54,26 @@ "customTextDesc": "Benutzerdefinierter Text", "numberPagesDesc": "Welche Seiten nummeriert werden sollen, Standardeinstellung 'alle' ('all'), akzeptiert auch 1-5 oder 2,5,9 usw.", "customNumberDesc": "Standardmäßig {n}, akzeptiert auch 'Seite {n} von {total}', 'Text-{n}', '{filename}-{n}'", - "submit": "Seitenzahlen hinzufÃŧgen" + "submit": "Seitenzahlen hinzufÃŧgen", + "configuration": "Configuration", + "customize": "Customize Appearance", + "pagesAndStarting": "Pages & Starting Number", + "positionAndPages": "Position & Pages", + "error": { + "failed": "Add page numbers operation failed" + }, + "results": { + "title": "Page Number Results" + }, + "preview": "Position Selection", + "previewDisclaimer": "Preview is approximate. Final output may vary due to PDF font metrics." }, + "pageSelectionPrompt": "Benutzerdefinierte Seitenauswahl (Geben Sie eine durch Kommas getrennte Liste von Seitenzahlen 1,5,6 oder Funktionen wie 2n+1 ein):", + "startingNumberTooltip": "The first number to display. Subsequent pages will increment from this number.", + "marginTooltip": "Distance between the page number and the edge of the page.", + "fontSizeTooltip": "Size of the page number text in points. Larger numbers create bigger text.", + "fontTypeTooltip": "Font family for the page numbers. Choose based on your document style.", + "customTextTooltip": "Optional custom format for page numbers. Use {n} as placeholder for the number. Example: \"Page {n}\" will show \"Page 1\", \"Page 2\", etc.", "pdfPrompt": "PDF(s) auswählen", "multiPdfPrompt": "PDFs auswählen (2+)", "multiPdfDropPrompt": "Wählen Sie alle gewÃŧnschten PDFs aus (oder ziehen Sie sie per Drag & Drop hierhin)", @@ -30,7 +84,6 @@ "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):", - "pageSelectionPrompt": "Benutzerdefinierte Seitenauswahl (Geben Sie eine durch Kommas getrennte Liste von Seitenzahlen 1,5,6 oder Funktionen wie 2n+1 ein):", "goToPage": "Gehe zu", "true": "Wahr", "false": "Falsch", @@ -41,11 +94,18 @@ "save": "Speichern", "saveToBrowser": "Im Browser speichern", "download": "Herunterladen", + "pin": "Pin File (keep active after tool run)", + "unpin": "Unpin File (replace after tool run)", "undoOperationTooltip": "Klicken zum RÃŧckgängigmachen der letzten Operation und Wiederherstellen der ursprÃŧnglichen Dateien", "undo": "RÃŧckgängig", "moreOptions": "Weitere Optionen", "editYourNewFiles": "Ihre neue(n) Datei(en) bearbeiten", "close": "Schließen", + "openInViewer": "Open in Viewer", + "confirmClose": "Confirm Close", + "confirmCloseMessage": "Are you sure you want to close this file?", + "confirmCloseCancel": "Cancel", + "confirmCloseConfirm": "Close File", "fileSelected": "Ausgewählt: {{filename}}", "chooseFile": "Datei wählen", "filesSelected": "Dateien ausgewählt", @@ -55,7 +115,9 @@ "uploadFiles": "Dateien hochladen", "addFiles": "Dateien hinzufÃŧgen", "selectFromWorkbench": "Dateien von der Workbench auswählen oder", - "selectMultipleFromWorkbench": "Mindestens {{count}} Dateien von der Workbench auswählen oder" + "selectMultipleFromWorkbench": "Mindestens {{count}} Dateien von der Workbench auswählen oder", + "created": "Created", + "size": "File Size" }, "noFavourites": "Keine Favoriten hinzugefÃŧgt", "downloadComplete": "Download abgeschlossen", @@ -74,7 +136,10 @@ }, "error": { "pdfPassword": "Das PDF-Dokument ist passwortgeschÃŧtzt und das Passwort wurde entweder nicht angegeben oder war falsch", + "encryptedPdfMustRemovePassword": "Diese PDF ist verschlÃŧsselt oder passwortgeschÃŧtzt. Bitte entsperren Sie sie, bevor Sie in PDF/A konvertieren.", + "incorrectPasswordProvided": "Das PDF-Passwort ist falsch oder wurde nicht angegeben.", "_value": "Fehler", + "dismissAllErrors": "Alle Fehler ausblenden", "sorry": "Entschuldigung fÃŧr das Problem!", "needHelp": "Brauchen Sie Hilfe / Ein Problem gefunden?", "contactTip": "Wenn Sie weiterhin Probleme haben, zÃļgern Sie nicht, uns um Hilfe zu bitten. Du kannst ein Ticket auf unserer GitHub-Seite einreichen oder uns Ãŧber Discord kontaktieren:", @@ -87,10 +152,7 @@ "showStack": "Stack-Trace anzeigen", "copyStack": "Stack-Trace kopieren", "githubSubmit": "GitHub - Ein Ticket einreichen", - "discordSubmit": "Discord - UnterstÃŧtzungsbeitrag einreichen", - "dismissAllErrors": "Alle Fehler ausblenden", - "encryptedPdfMustRemovePassword": "Diese PDF ist verschlÃŧsselt oder passwortgeschÃŧtzt. Bitte entsperren Sie sie, bevor Sie in PDF/A konvertieren.", - "incorrectPasswordProvided": "Das PDF-Passwort ist falsch oder wurde nicht angegeben." + "discordSubmit": "Discord - UnterstÃŧtzungsbeitrag einreichen" }, "warning": { "tooltipTitle": "Warnung" @@ -188,6 +250,7 @@ "title": "MÃļchten Sie Stirling-PDF verbessern?", "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.", "paragraph2": "Bitte erwägen Sie die Analytics zu aktivieren, um Stirling-PDF beim Wachsen zu helfen und um unsere User besser zu verstehen.", + "learnMore": "Learn more", "enable": "Analytics aktivieren", "disable": "Analytics deaktivieren", "settings": "Sie kÃļnnen die Einstellungen fÃŧr die Analytics in der config/settings.yml Datei bearbeiten" @@ -231,6 +294,54 @@ "cacheInputs": { "name": "Formulareingaben speichern", "help": "Aktivieren, um zuvor verwendete Eingaben fÃŧr zukÃŧnftige Durchläufe zu speichern" + }, + "general": { + "title": "General", + "description": "Configure general application preferences.", + "account": "Account", + "accountDescription": "Manage your account settings", + "user": "User", + "signedInAs": "Signed in as", + "logout": "Log out", + "enableFeatures": { + "title": "For System Administrators", + "intro": "Enable user authentication, team management, and workspace features for your organization.", + "action": "Configure", + "and": "and", + "benefit": "Enables user roles, team collaboration, admin controls, and enterprise features.", + "learnMore": "Learn more in documentation", + "dismiss": "Dismiss" + }, + "autoUnzip": "Auto-unzip API responses", + "autoUnzipDescription": "Automatically extract files from ZIP responses", + "autoUnzipTooltip": "Automatically extract ZIP files returned from API operations. Disable to keep ZIP files intact. This does not affect automation workflows.", + "autoUnzipFileLimit": "Auto-unzip file limit", + "autoUnzipFileLimitDescription": "Maximum number of files to extract from ZIP", + "autoUnzipFileLimitTooltip": "Only unzip if the ZIP contains this many files or fewer. Set higher to extract larger ZIPs.", + "defaultToolPickerMode": "Default tool picker mode", + "defaultToolPickerModeDescription": "Choose whether the tool picker opens in fullscreen or sidebar by default", + "mode": { + "fullscreen": "Fullscreen", + "sidebar": "Sidebar" + } + }, + "hotkeys": { + "title": "Keyboard Shortcuts", + "description": "Hover a tool to see its shortcut or customise it below. Click \"Change shortcut\" and press a new key combination. Press Esc to cancel.", + "errorModifier": { + "mac": "Include ⌘ (Command), âŒĨ (Option), or another modifier in your shortcut.", + "windows": "Include Ctrl, Alt, or another modifier in your shortcut." + }, + "errorConflict": "Shortcut already used by {{tool}}.", + "none": "Not assigned", + "customBadge": "Custom", + "defaultLabel": "Default: {{shortcut}}", + "capturing": "Press keysâ€Ļ (Esc to cancel)", + "change": "Change shortcut", + "reset": "Reset", + "shortcut": "Shortcut", + "noShortcut": "No shortcut set", + "searchPlaceholder": "Search tools..." } }, "changeCreds": { @@ -302,8 +413,10 @@ "top20": "Top 20", "all": "Alle", "refresh": "Aktualisieren", - "includeHomepage": "Startseite ('/') einschließen", - "includeLoginPage": "Anmeldeseite einschließen ('/login')", + "dataTypeLabel": "Data Type:", + "dataTypeAll": "All", + "dataTypeApi": "API", + "dataTypeUi": "UI", "totalEndpoints": "Gesamtendpunkte", "totalVisits": "Gesamtbesuche", "showing": "Zeigen", @@ -318,7 +431,9 @@ "top": "Spitze", "numberOfVisits": "Anzahl der Besuche", "visitsTooltip": "Besuche: {0} ({1}% des Gesamten)", - "retry": "Wiederholen" + "retry": "Wiederholen", + "includeHomepage": "Startseite ('/') einschließen", + "includeLoginPage": "Anmeldeseite einschließen ('/login')" }, "database": { "title": "Datenbank Import/Export", @@ -359,278 +474,284 @@ "alphabetical": "Alphabetisch", "globalPopularity": "Beliebtheit", "sortBy": "Sortieren nach:", + "mobile": { + "brandAlt": "Stirling PDF logo", + "openFiles": "Open files", + "swipeHint": "Swipe left or right to switch views", + "tools": "Tools", + "toolsSlide": "Tool selection panel", + "viewSwitcher": "Switch workspace view", + "workbenchSlide": "Workspace panel", + "workspace": "Workspace" + }, "multiTool": { + "tags": "mehrere,werkzeuge", "title": "PDF-Multitool", - "desc": "Seiten zusammenfÃŧhren, drehen, neu anordnen und entfernen", - "tags": "mehrere,werkzeuge" + "desc": "Seiten zusammenfÃŧhren, drehen, neu anordnen und entfernen" }, "merge": { + "tags": "kombinieren,zusammenfÃŧhren,vereinen", "title": "ZusammenfÃŧhren", - "desc": "Mehrere PDF-Dateien zu einer einzigen zusammenfÃŧhren", - "tags": "kombinieren,zusammenfÃŧhren,vereinen" + "desc": "Mehrere PDF-Dateien zu einer einzigen zusammenfÃŧhren" }, "split": { + "tags": "teilen,trennen,aufteilen", "title": "Aufteilen", - "desc": "PDFs in mehrere Dokumente aufteilen", - "tags": "teilen,trennen,aufteilen" + "desc": "PDFs in mehrere Dokumente aufteilen" }, "rotate": { + "tags": "drehen,spiegeln,ausrichten", "title": "Drehen", - "desc": "Drehen Sie Ihre PDFs ganz einfach", - "tags": "drehen,spiegeln,ausrichten" + "desc": "Drehen Sie Ihre PDFs ganz einfach" }, "convert": { + "tags": "umwandeln,ändern", "title": "Umwandeln", - "desc": "Dateien zwischen verschiedenen Formaten konvertieren", - "tags": "umwandeln,ändern" + "desc": "Dateien zwischen verschiedenen Formaten konvertieren" }, "pdfOrganiser": { + "tags": "organisieren,umordnen,neu anordnen", "title": "Organisieren", - "desc": "Seiten entfernen und Seitenreihenfolge ändern", - "tags": "organisieren,umordnen,neu anordnen" + "desc": "Seiten entfernen und Seitenreihenfolge ändern" }, "addImage": { + "tags": "einfÃŧgen,einbetten,platzieren", "title": "Bild einfÃŧgen", - "desc": "FÃŧgt ein Bild an eine bestimmte Stelle im PDF ein (in Arbeit)", - "tags": "einfÃŧgen,einbetten,platzieren" + "desc": "FÃŧgt ein Bild an eine bestimmte Stelle im PDF ein (in Arbeit)" }, "addAttachments": { + "tags": "einbetten,anhängen,einfÃŧgen", "title": "Anhänge hinzufÃŧgen", - "desc": "Eingebettete Dateien (Anhänge) zu einer PDF hinzufÃŧgen oder entfernen", - "tags": "einbetten,anhängen,einfÃŧgen" + "desc": "Eingebettete Dateien (Anhänge) zu einer PDF hinzufÃŧgen oder entfernen" }, "watermark": { + "tags": "stempel,markierung,Ãŧberlagerung", "title": "Wasserzeichen hinzufÃŧgen", - "desc": "FÃŧgen Sie ein eigenes Wasserzeichen zu Ihrem PDF hinzu", - "tags": "stempel,markierung,Ãŧberlagerung" + "desc": "FÃŧgen Sie ein eigenes Wasserzeichen zu Ihrem PDF hinzu" }, "removePassword": { + "tags": "entsperren", "title": "Passwort entfernen", - "desc": "Den Passwortschutz eines PDFs entfernen", - "tags": "entsperren" + "desc": "Den Passwortschutz eines PDFs entfernen" }, "compress": { + "tags": "verkleinern,reduzieren,optimieren", "title": "Komprimieren", - "desc": "PDF komprimieren um die DateigrÃļße zu reduzieren", - "tags": "verkleinern,reduzieren,optimieren" + "desc": "PDF komprimieren um die DateigrÃļße zu reduzieren" }, "unlockPDFForms": { + "tags": "entsperren,aktivieren,bearbeiten", "title": "SchreibgeschÃŧtzte PDF-Formfelder entfernen", - "desc": "Entfernen Sie die schreibgeschÃŧtzte Eigenschaft von Formularfeldern in einem PDF-Dokument.", - "tags": "entsperren,aktivieren,bearbeiten" + "desc": "Entfernen Sie die schreibgeschÃŧtzte Eigenschaft von Formularfeldern in einem PDF-Dokument." }, "changeMetadata": { + "tags": "bearbeiten,ändern,aktualisieren", "title": "Metadaten ändern", - "desc": "Ändern/Entfernen/HinzufÃŧgen von Metadaten aus einem PDF-Dokument", - "tags": "bearbeiten,ändern,aktualisieren" + "desc": "Ändern/Entfernen/HinzufÃŧgen von Metadaten aus einem PDF-Dokument" }, "ocr": { + "tags": "extrahieren,scannen", "title": "FÃŧhre OCR/Cleanup-Scans aus", - "desc": "Cleanup scannt und erkennt Text aus Bildern in einer PDF-Datei und fÃŧgt ihn erneut als Text hinzu", - "tags": "extrahieren,scannen" + "desc": "Cleanup scannt und erkennt Text aus Bildern in einer PDF-Datei und fÃŧgt ihn erneut als Text hinzu" }, "extractImages": { + "tags": "extrahieren,speichern,exportieren", "title": "Bilder extrahieren", - "desc": "Extrahiert alle Bilder aus einer PDF-Datei und speichert sie als Zip-Archiv", - "tags": "extrahieren,speichern,exportieren" + "desc": "Extrahiert alle Bilder aus einer PDF-Datei und speichert sie als Zip-Archiv" }, "scannerImageSplit": { + "tags": "erkennen,teilen,fotos", "title": "Gescannte Fotos erkennen/aufteilen", - "desc": "Teilt mehrere Fotos aus einem Foto/PDF auf", - "tags": "erkennen,teilen,fotos" + "desc": "Teilt mehrere Fotos aus einem Foto/PDF auf" }, "sign": { + "tags": "unterschrift,autogramm", "title": "Signieren", - "desc": "FÃŧgt PDF-Signaturen durch Zeichnung, Text oder Bild hinzu", - "tags": "unterschrift,autogramm" + "desc": "FÃŧgt PDF-Signaturen durch Zeichnung, Text oder Bild hinzu" }, "flatten": { + "tags": "vereinfachen,entfernen,interaktiv", "title": "Abflachen", - "desc": "Alle interaktiven Elemente und Formulare aus einem PDF entfernen", - "tags": "vereinfachen,entfernen,interaktiv" + "desc": "Alle interaktiven Elemente und Formulare aus einem PDF entfernen" }, "certSign": { + "tags": "authentifizieren,PEM,P12,offiziell,verschlÃŧsseln,signieren,zertifikat,PKCS12,JKS,server,manuell,auto", "title": "Mit Zertifikat signieren", - "desc": "Ein PDF mit einem Zertifikat/SchlÃŧssel (PEM/P12) signieren", - "tags": "authentifizieren,PEM,P12,offiziell,verschlÃŧsseln,signieren,zertifikat,PKCS12,JKS,server,manuell,auto" + "desc": "Ein PDF mit einem Zertifikat/SchlÃŧssel (PEM/P12) signieren" }, "repair": { + "tags": "reparieren,wiederherstellen", "title": "Reparatur", - "desc": "Versucht, ein beschädigtes/kaputtes PDF zu reparieren", - "tags": "reparieren,wiederherstellen" + "desc": "Versucht, ein beschädigtes/kaputtes PDF zu reparieren" }, "removeBlanks": { + "tags": "lÃļschen,bereinigen,leer", "title": "Leere Seiten entfernen", - "desc": "Erkennt und entfernt leere Seiten aus einem Dokument", - "tags": "lÃļschen,bereinigen,leer" + "desc": "Erkennt und entfernt leere Seiten aus einem Dokument" }, "removeAnnotations": { + "tags": "lÃļschen,bereinigen,entfernen", "title": "Anmerkungen entfernen", - "desc": "Entfernt alle Kommentare/Anmerkungen aus einem PDF", - "tags": "lÃļschen,bereinigen,entfernen" + "desc": "Entfernt alle Kommentare/Anmerkungen aus einem PDF" }, "compare": { + "tags": "unterschied", "title": "Vergleichen", - "desc": "Vergleicht und zeigt die Unterschiede zwischen zwei PDF-Dokumenten an", - "tags": "unterschied" + "desc": "Vergleicht und zeigt die Unterschiede zwischen zwei PDF-Dokumenten an" }, "removeCertSign": { + "tags": "entfernen,lÃļschen,entsperren", "title": "Zertifikatsignatur entfernen", - "desc": "Zertifikatsignatur aus PDF entfernen", - "tags": "entfernen,lÃļschen,entsperren" + "desc": "Zertifikatsignatur aus PDF entfernen" }, "pageLayout": { + "tags": "layout,anordnen,kombinieren", "title": "Mehrseitiges Layout", - "desc": "Mehrere Seiten eines PDF zu einer Seite zusammenfÃŧhren", - "tags": "layout,anordnen,kombinieren" + "desc": "Mehrere Seiten eines PDF zu einer Seite zusammenfÃŧhren" }, "bookletImposition": { + "tags": "broschÃŧre,druck,bindung", "title": "BroschÃŧren-Layout", - "desc": "BroschÃŧren mit korrekter Seitenreihenfolge und mehrseitigem Layout fÃŧr Druck und Bindung erstellen", - "tags": "broschÃŧre,druck,bindung" + "desc": "BroschÃŧren mit korrekter Seitenreihenfolge und mehrseitigem Layout fÃŧr Druck und Bindung erstellen" }, "scalePages": { + "tags": "grÃļße ändern,anpassen,skalieren", "title": "SeitengrÃļße/Skalierung anpassen", - "desc": "GrÃļße/Skalierung der Seite und/oder des Inhalts ändern", - "tags": "grÃļße ändern,anpassen,skalieren" + "desc": "GrÃļße/Skalierung der Seite und/oder des Inhalts ändern" }, "addPageNumbers": { + "tags": "nummerieren,paginierung,zählen", "title": "Seitenzahlen hinzufÃŧgen", - "desc": "HinzufÃŧgen von Seitenzahlen an einer bestimmten Stelle", - "tags": "nummerieren,paginierung,zählen" + "desc": "HinzufÃŧgen von Seitenzahlen an einer bestimmten Stelle" }, "autoRename": { + "tags": "auto-erkennung,kopfzeilen-basiert,organisieren,umbenennen", "title": "PDF-Datei automatisch umbenennen", - "desc": "Benennt eine PDF-Datei automatisch basierend auf der erkannten Überschrift um", - "tags": "auto-erkennung,kopfzeilen-basiert,organisieren,umbenennen" + "desc": "Benennt eine PDF-Datei automatisch basierend auf der erkannten Überschrift um" }, "adjustContrast": { + "tags": "kontrast,helligkeit,sättigung", "title": "Farben/Kontrast anpassen", - "desc": "Kontrast, Sättigung und Helligkeit einer PDF anpassen", - "tags": "kontrast,helligkeit,sättigung" + "desc": "Kontrast, Sättigung und Helligkeit einer PDF anpassen" }, "crop": { + "tags": "zuschneiden,schneiden,grÃļße ändern", "title": "PDF zuschneiden", - "desc": "PDF zuschneiden um die GrÃļße zu verändern (Text bleibt erhalten!)", - "tags": "zuschneiden,schneiden,grÃļße ändern" + "desc": "PDF zuschneiden um die GrÃļße zu verändern (Text bleibt erhalten!)" }, "autoSplitPDF": { + "tags": "auto,teilen,QR", "title": "PDF automatisch teilen", - "desc": "Physisch gescannte PDF anhand von Splitter-Seiten und QR-Codes aufteilen", - "tags": "auto,teilen,QR" + "desc": "Physisch gescannte PDF anhand von Splitter-Seiten und QR-Codes aufteilen" }, "sanitize": { + "tags": "bereinigen,lÃļschen,entfernen", "title": "Bereinigen", - "desc": "Potentiell schädliche Elemente aus PDF-Dateien entfernen", - "tags": "bereinigen,lÃļschen,entfernen" + "desc": "Potentiell schädliche Elemente aus PDF-Dateien entfernen" }, "getPdfInfo": { + "tags": "info,metadaten,details", "title": "Alle Informationen anzeigen", - "desc": "Erfasst alle mÃļglichen Informationen in einer PDF", - "tags": "info,metadaten,details" + "desc": "Erfasst alle mÃļglichen Informationen in einer PDF" }, "pdfToSinglePage": { + "tags": "kombinieren,zusammenfÃŧhren,einzeln", "title": "PDF zu einer Seite zusammenfassen", - "desc": "FÃŧgt alle PDF-Seiten zu einer einzigen großen Seite zusammen", - "tags": "kombinieren,zusammenfÃŧhren,einzeln" + "desc": "FÃŧgt alle PDF-Seiten zu einer einzigen großen Seite zusammen" }, "showJS": { + "tags": "javascript,code,skript", "title": "Javascript anzeigen", - "desc": "Alle Javascript Funktionen in einer PDF anzeigen", - "tags": "javascript,code,skript" + "desc": "Alle Javascript Funktionen in einer PDF anzeigen" }, "redact": { + "tags": "zensieren,schwärzen,verbergen", "title": "Manuell zensieren/schwärzen", - "desc": "Zensiere (Schwärze) eine PDF-Datei durch Auswählen von Text, gezeichneten Formen und/oder ausgewählten Seite(n)", - "tags": "zensieren,schwärzen,verbergen" - }, - "overlayPdfs": { - "title": "PDFs Ãŧberlagern", - "desc": "PDFs Ãŧber eine andere PDF Ãŧberlagern", - "tags": "Ãŧberlagern,kombinieren,stapeln" + "desc": "Zensiere (Schwärze) eine PDF-Datei durch Auswählen von Text, gezeichneten Formen und/oder ausgewählten Seite(n)" }, "splitBySections": { + "tags": "teilen,abschnitte,aufteilen", "title": "PDF nach Abschnitten aufteilen", - "desc": "Jede Seite einer PDF in kleinere horizontale und vertikale Abschnitte unterteilen", - "tags": "teilen,abschnitte,aufteilen" + "desc": "Jede Seite einer PDF in kleinere horizontale und vertikale Abschnitte unterteilen" }, "addStamp": { + "tags": "stempel,markierung,siegel", "title": "Stempel zu PDF hinzufÃŧgen", - "desc": "Text- oder Bildstempel an festgelegten Positionen hinzufÃŧgen", - "tags": "stempel,markierung,siegel" + "desc": "Text- oder Bildstempel an festgelegten Positionen hinzufÃŧgen" }, "removeImage": { + "tags": "entfernen,lÃļschen,bereinigen", "title": "Bild entfernen", - "desc": "Bild aus PDF entfernen, um die DateigrÃļße zu verringern", - "tags": "entfernen,lÃļschen,bereinigen" + "desc": "Bild aus PDF entfernen, um die DateigrÃļße zu verringern" }, "splitByChapters": { + "tags": "teilen,kapitel,struktur", "title": "PDF-Datei nach Kapiteln aufteilen", - "desc": "Aufteilung einer PDF-Datei in mehrere Dateien auf Basis der Kapitelstruktur.", - "tags": "teilen,kapitel,struktur" + "desc": "Aufteilung einer PDF-Datei in mehrere Dateien auf Basis der Kapitelstruktur." }, "validateSignature": { + "tags": "validieren,ÃŧberprÃŧfen,zertifikat", "title": "PDF-Signatur ÃŧberprÃŧfen", - "desc": "Digitale Signaturen und Zertifikate in PDF-Dokumenten ÃŧberprÃŧfen", - "tags": "validieren,ÃŧberprÃŧfen,zertifikat" + "desc": "Digitale Signaturen und Zertifikate in PDF-Dokumenten ÃŧberprÃŧfen" }, "swagger": { + "tags": "API,dokumentation,test", "title": "API-Dokumentation", - "desc": "API-Dokumentation anzeigen und Endpunkte testen", - "tags": "API,dokumentation,test" + "desc": "API-Dokumentation anzeigen und Endpunkte testen" }, - "fakeScan": { - "title": "Scan simulieren", - "desc": "Eine PDF erstellen, die wie gescannt aussieht" + "scannerEffect": { + "tags": "scannen,simulieren,erstellen", + "title": "Scanner-Effekt", + "desc": "Erstellen Sie eine PDF, die aussieht, als wäre sie gescannt worden" }, "editTableOfContents": { + "tags": "lesezeichen,inhalt,bearbeiten", "title": "Inhaltsverzeichnis bearbeiten", - "desc": "HinzufÃŧgen oder Bearbeiten von Lesezeichen und Inhaltsverzeichnissen in PDF-Dokumenten", - "tags": "lesezeichen,inhalt,bearbeiten" + "desc": "HinzufÃŧgen oder Bearbeiten von Lesezeichen und Inhaltsverzeichnissen in PDF-Dokumenten" }, "manageCertificates": { + "tags": "zertifikate,importieren,exportieren", "title": "Zertifikate verwalten", - "desc": "Digitale Zertifikatsdateien fÃŧr die PDF-Signierung importieren, exportieren oder lÃļschen.", - "tags": "zertifikate,importieren,exportieren" + "desc": "Digitale Zertifikatsdateien fÃŧr die PDF-Signierung importieren, exportieren oder lÃļschen." }, "read": { + "tags": "anzeigen,Ãļffnen,anzeigen", "title": "Lesen", - "desc": "PDFs anzeigen und kommentieren. Text hervorheben, zeichnen oder Kommentare fÃŧr ÜberprÃŧfung und Zusammenarbeit einfÃŧgen.", - "tags": "anzeigen,Ãļffnen,anzeigen" + "desc": "PDFs anzeigen und kommentieren. Text hervorheben, zeichnen oder Kommentare fÃŧr ÜberprÃŧfung und Zusammenarbeit einfÃŧgen." }, "reorganizePages": { + "tags": "umordnen,neu anordnen,organisieren", "title": "Seiten neu anordnen", - "desc": "PDF-Seiten mit visueller Drag-and-Drop-Steuerung neu anordnen, duplizieren oder lÃļschen.", - "tags": "umordnen,neu anordnen,organisieren" + "desc": "PDF-Seiten mit visueller Drag-and-Drop-Steuerung neu anordnen, duplizieren oder lÃļschen." }, "extractPages": { + "tags": "extrahieren,auswählen,kopieren", "title": "Seiten extrahieren", - "desc": "Spezifische Seiten aus einem PDF-Dokument extrahieren", - "tags": "extrahieren,auswählen,kopieren" + "desc": "Spezifische Seiten aus einem PDF-Dokument extrahieren" }, "removePages": { + "tags": "lÃļschen,extrahieren,ausschließen", "title": "Entfernen", - "desc": "Ungewollte Seiten aus dem PDF entfernen", - "tags": "lÃļschen,extrahieren,ausschließen" + "desc": "Ungewollte Seiten aus dem PDF entfernen" }, "autoSizeSplitPDF": { + "tags": "auto,teilen,grÃļße", "title": "Teilen nach GrÃļße/Anzahl", - "desc": "Teilen Sie ein einzelnes PDF basierend auf GrÃļße, Seitenanzahl oder Dokumentanzahl in mehrere Dokumente auf", - "tags": "auto,teilen,grÃļße" + "desc": "Teilen Sie ein einzelnes PDF basierend auf GrÃļße, Seitenanzahl oder Dokumentanzahl in mehrere Dokumente auf" }, - "replaceColorPdf": { - "title": "Farbe ersetzen und invertieren", - "desc": "Ersetzen Sie die Farbe des Texts und Hintergrund der PDF-Datei und invertieren Sie die komplette Farbe der PDF-Datei, um die DateigrÃļße zu reduzieren" + "replaceColor": { + "title": "Farbe ersetzen & invertieren", + "desc": "Farben in PDF-Dokumenten ersetzen oder invertieren" }, "devApi": { - "desc": "Link zur API-Dokumentation", "tags": "API,entwicklung,dokumentation", - "title": "API" + "title": "API", + "desc": "Link zur API-Dokumentation" }, "devFolderScanning": { + "tags": "automatisierung,ordner,scannen", "title": "Automatische OrdnerÃŧberwachung", - "desc": "Link zum Leitfaden fÃŧr automatisches Ordner-Scannen", - "tags": "automatisierung,ordner,scannen" + "desc": "Link zum Leitfaden fÃŧr automatisches Ordner-Scannen" }, "devSsoGuide": { "title": "SSO-Anleitung", @@ -649,18 +770,26 @@ "desc": "Dokumentbeschränkungen und -berechtigungen ändern" }, "automate": { + "tags": "arbeitsablauf,sequenz,automatisierung", "title": "Automatisieren", - "desc": "Mehrstufige Arbeitsabläufe durch Verkettung von PDF-Aktionen erstellen. Ideal fÃŧr wiederkehrende Aufgaben.", - "tags": "arbeitsablauf,sequenz,automatisierung" + "desc": "Mehrstufige Arbeitsabläufe durch Verkettung von PDF-Aktionen erstellen. Ideal fÃŧr wiederkehrende Aufgaben." }, - "replaceColor": { - "desc": "Farben in PDF-Dokumenten ersetzen oder invertieren", - "title": "Farbe ersetzen & invertieren" + "overlay-pdfs": { + "desc": "Overlay one PDF on top of another", + "title": "Overlay PDFs" }, - "scannerEffect": { - "desc": "Erstellen Sie eine PDF, die aussieht, als wäre sie gescannt worden", - "tags": "scannen,simulieren,erstellen", - "title": "Scanner-Effekt" + "overlayPdfs": { + "title": "PDFs Ãŧberlagern", + "desc": "PDFs Ãŧber eine andere PDF Ãŧberlagern", + "tags": "Ãŧberlagern,kombinieren,stapeln" + }, + "fakeScan": { + "title": "Scan simulieren", + "desc": "Eine PDF erstellen, die wie gescannt aussieht" + }, + "replaceColorPdf": { + "title": "Farbe ersetzen und invertieren", + "desc": "Ersetzen Sie die Farbe des Texts und Hintergrund der PDF-Datei und invertieren Sie die komplette Farbe der PDF-Datei, um die DateigrÃļße zu reduzieren" } }, "landing": { @@ -701,15 +830,17 @@ "tags": "zusammenfÃŧhren,seitenvorgänge,back end,serverseitig", "title": "ZusammenfÃŧhren", "removeDigitalSignature": { + "label": "Digitale Signatur in der zusammengefÃŧhrten Datei entfernen?", "tooltip": { - "description": "Digitale Signaturen werden beim ZusammenfÃŧhren von Dateien ungÃŧltig. Aktivieren Sie diese Option, um sie aus der endgÃŧltigen zusammengefÃŧhrten PDF zu entfernen.", - "title": "Digitale Signatur entfernen" + "title": "Digitale Signatur entfernen", + "description": "Digitale Signaturen werden beim ZusammenfÃŧhren von Dateien ungÃŧltig. Aktivieren Sie diese Option, um sie aus der endgÃŧltigen zusammengefÃŧhrten PDF zu entfernen." } }, "generateTableOfContents": { + "label": "Inhaltsverzeichnis in der zusammengefÃŧhrten Datei erstellen?", "tooltip": { - "description": "Erstellt automatisch ein klickbares Inhaltsverzeichnis in der zusammengefÃŧhrten PDF basierend auf den ursprÃŧnglichen Dateinamen und Seitenzahlen.", - "title": "Inhaltsverzeichnis generieren" + "title": "Inhaltsverzeichnis generieren", + "description": "Erstellt automatisch ein klickbares Inhaltsverzeichnis in der zusammengefÃŧhrten PDF basierend auf den ursprÃŧnglichen Dateinamen und Seitenzahlen." } }, "submit": "ZusammenfÃŧhren", @@ -727,7 +858,6 @@ } }, "split": { - "tags": "seitenoperationen,teilen,mehrseitig,ausschneiden,serverseitig", "title": "PDF aufteilen", "header": "PDF aufteilen", "desc": { @@ -849,13 +979,51 @@ "bullet1": "Lesezeichen-Ebene: Auf welcher Ebene geteilt wird (1=oberste Ebene)", "bullet2": "Metadaten einschließen: Dokumenteigenschaften beibehalten", "bullet3": "Duplikate zulassen: Wiederholte Lesezeichennamen behandeln" + }, + "byDocCount": { + "bullet1": "Enter the number of output files you want", + "bullet2": "Pages are distributed as evenly as possible", + "bullet3": "Useful when you need a specific number of files", + "text": "Create a specific number of output files by evenly distributing pages across them.", + "title": "Split by Document Count" + }, + "byPageCount": { + "bullet1": "Enter the number of pages per output file", + "bullet2": "Last file may have fewer pages if not evenly divisible", + "bullet3": "Useful for batch processing workflows", + "text": "Create multiple PDFs with a specific number of pages each. Perfect for creating uniform document chunks.", + "title": "Split by Page Count" + }, + "byPageDivider": { + "bullet1": "Print divider sheets from the download link", + "bullet2": "Insert divider sheets between your documents", + "bullet3": "Scan all documents together as one PDF", + "bullet4": "Upload - divider pages are automatically detected and removed", + "bullet5": "Enable Duplex Mode if scanning both sides of divider sheets", + "text": "Automatically split scanned documents using physical divider sheets with QR codes. Perfect for processing multiple documents scanned together.", + "title": "Split by Page Divider" } - } + }, + "methodSelection": { + "tooltip": { + "bullet1": "Click on a method card to select it", + "bullet2": "Hover over each card to see a quick description", + "bullet3": "The settings step will appear after you select a method", + "bullet4": "You can change methods at any time before processing", + "header": { + "text": "Choose how you want to split your PDF document. Each method is optimized for different use cases and document types.", + "title": "Split Method Selection" + }, + "title": "Choose Your Split Method" + } + }, + "selectMethod": "Select a split method", + "tags": "seitenoperationen,teilen,mehrseitig,ausschneiden,serverseitig" }, "rotate": { - "tags": "serverseitig", "title": "PDF drehen", "submit": "Drehen", + "selectRotation": "Select Rotation Angle (Clockwise)", "error": { "failed": "Ein Fehler ist beim Drehen der PDF aufgetreten." }, @@ -875,7 +1043,8 @@ "title": "Steuerelemente", "text": "Verwenden Sie die Drehschaltflächen zur Anpassung der Ausrichtung. Die linke Schaltfläche dreht gegen den Uhrzeigersinn, die rechte Schaltfläche dreht im Uhrzeigersinn. Jeder Klick dreht um 90 Grad." } - } + }, + "tags": "serverseitig" }, "convert": { "title": "Umwandeln", @@ -899,6 +1068,7 @@ "color": "Farbe", "greyscale": "Graustufen", "blackwhite": "Schwarz-Weiß", + "dpi": "DPI", "output": "Ausgabe", "single": "Einzeln", "multiple": "Mehrfach", @@ -924,8 +1094,11 @@ "fileFormat": "Dateiformat", "wordDoc": "Word-Dokument", "wordDocExt": "Word-Dokument (.docx)", + "odtExt": "OpenDocument Text (.odt)", + "pptExt": "PowerPoint (.pptx)", "odpExt": "OpenDocument Präsentation (.odp)", "txtExt": "Einfacher Text (.txt)", + "rtfExt": "Rich Text Format (.rtf)", "selectedFiles": "Ausgewählte Dateien", "noFileSelected": "Keine Datei ausgewählt. Verwenden Sie das Dateipanel, um Dateien hinzuzufÃŧgen.", "convertFiles": "Dateien konvertieren", @@ -937,13 +1110,10 @@ "images": "Bilder", "officeDocs": "Office-Dokumente (Word, Excel, PowerPoint)", "imagesExt": "Bilder (JPG, PNG, usw.)", - "grayscale": "Graustufen", - "dpi": "DPI", "markdown": "Markdown", - "odtExt": "OpenDocument Text (.odt)", - "pptExt": "PowerPoint (.pptx)", - "rtfExt": "Rich Text Format (.rtf)", - "textRtf": "Text/RTF" + "textRtf": "Text/RTF", + "grayscale": "Graustufen", + "errorConversion": "An error occurred while converting the file." }, "imageToPdf": { "tags": "konvertierung,img,jpg,bild,foto" @@ -981,22 +1151,35 @@ "8": "Letzte entfernen", "9": "Erste und letzte entfernen", "10": "Ungerade-Gerade-ZusammenfÃŧhrung", - "11": "Alle Seiten duplizieren" + "11": "Alle Seiten duplizieren", + "desc": { + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, â€Ļ).", + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, â€Ļ).", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimized for binding on the side)." + } }, - "placeholder": "(z.B. 1,3,2 oder 4-8,2,10-12 oder 2n-1)", "desc": { - "BOOKLET_SORT": "Seiten fÃŧr den BroschÃŧren-Druck anordnen (letzte, erste, zweite, vorletzte, â€Ļ).", "CUSTOM": "Verwenden Sie eine benutzerdefinierte Sequenz von Seitenzahlen oder AusdrÃŧcken, um eine neue Reihenfolge zu definieren.", - "DUPLEX_SORT": "Vorder- und RÃŧckseiten verschachteln, als ob ein Duplex-Scanner alle Vorderseiten und dann alle RÃŧckseiten gescannt hätte (1, n, 2, n-1, â€Ļ).", - "DUPLICATE": "Jede Seite entsprechend der benutzerdefinierten Anzahl duplizieren (z.B. 4 dupliziert jede Seite 4×).", - "ODD_EVEN_MERGE": "Zwei PDFs durch abwechselnde Seiten zusammenfÃŧhren: ungerade aus der ersten, gerade aus der zweiten.", - "ODD_EVEN_SPLIT": "Das Dokument in zwei Ausgaben aufteilen: alle ungeraden Seiten und alle geraden Seiten.", - "REMOVE_FIRST": "Die erste Seite aus dem Dokument entfernen.", - "REMOVE_FIRST_AND_LAST": "Sowohl die erste als auch die letzte Seite aus dem Dokument entfernen.", - "REMOVE_LAST": "Die letzte Seite aus dem Dokument entfernen.", "REVERSE_ORDER": "Das Dokument umkehren, sodass die letzte Seite zur ersten wird usw.", - "SIDE_STITCH_BOOKLET_SORT": "Seiten fÃŧr den Seitenheft-BroschÃŧren-Druck anordnen (optimiert fÃŧr die Bindung an der Seite)." - } + "DUPLEX_SORT": "Vorder- und RÃŧckseiten verschachteln, als ob ein Duplex-Scanner alle Vorderseiten und dann alle RÃŧckseiten gescannt hätte (1, n, 2, n-1, â€Ļ).", + "BOOKLET_SORT": "Seiten fÃŧr den BroschÃŧren-Druck anordnen (letzte, erste, zweite, vorletzte, â€Ļ).", + "SIDE_STITCH_BOOKLET_SORT": "Seiten fÃŧr den Seitenheft-BroschÃŧren-Druck anordnen (optimiert fÃŧr die Bindung an der Seite).", + "ODD_EVEN_SPLIT": "Das Dokument in zwei Ausgaben aufteilen: alle ungeraden Seiten und alle geraden Seiten.", + "ODD_EVEN_MERGE": "Zwei PDFs durch abwechselnde Seiten zusammenfÃŧhren: ungerade aus der ersten, gerade aus der zweiten.", + "DUPLICATE": "Jede Seite entsprechend der benutzerdefinierten Anzahl duplizieren (z.B. 4 dupliziert jede Seite 4×).", + "REMOVE_FIRST": "Die erste Seite aus dem Dokument entfernen.", + "REMOVE_LAST": "Die letzte Seite aus dem Dokument entfernen.", + "REMOVE_FIRST_AND_LAST": "Sowohl die erste als auch die letzte Seite aus dem Dokument entfernen." + }, + "placeholder": "(z.B. 1,3,2 oder 4-8,2,10-12 oder 2n-1)" }, "addImage": { "tags": "img,jpg,bild,foto", @@ -1025,8 +1208,8 @@ "failed": "Ein Fehler ist beim HinzufÃŧgen des Wasserzeichens zur PDF aufgetreten." }, "watermarkType": { - "image": "Bild", - "text": "Text" + "text": "Text", + "image": "Bild" }, "settings": { "type": "Wasserzeichen-Typ", @@ -1047,7 +1230,9 @@ "opacity": "Deckkraft (%)", "spacing": { "horizontal": "Horizontaler Abstand", - "vertical": "Vertikaler Abstand" + "vertical": "Vertikaler Abstand", + "height": "Height Spacing", + "width": "Width Spacing" }, "convertToImage": "PDF-Seiten in Bilder umwandeln" }, @@ -1190,6 +1375,10 @@ "bullet4": "Am besten fÃŧr sensible oder urheberrechtlich geschÃŧtzte Inhalte" } } + }, + "type": { + "1": "Text", + "2": "Image" } }, "permissions": { @@ -1263,6 +1452,26 @@ }, "submit": "Entfernen" }, + "extractPages": { + "title": "Extract Pages", + "pageNumbers": { + "label": "Pages to Extract", + "placeholder": "e.g., 1,3,5-8 or odd & 1-10" + }, + "settings": { + "title": "Settings" + }, + "tooltip": { + "description": "Extracts the selected pages into a new PDF, preserving order." + }, + "error": { + "failed": "Failed to extract pages" + }, + "results": { + "title": "Pages Extracted" + }, + "submit": "Extract Pages" + }, "pageSelection": { "tooltip": { "header": { @@ -1303,10 +1512,43 @@ }, "examples": { "title": "Beispiele" + }, + "complex": { + "bullet1": "1,3-5,8,2n → pages 1, 3–5, 8, plus evens", + "bullet2": "10-,2n-1 → from page 10 to end + odd pages", + "description": "Mix different types.", + "title": "Complex Combinations" + }, + "description": "Choose which pages to use for the operation. Supports single pages, ranges, formulas, and the all keyword.", + "individual": { + "bullet1": "1,3,5 → selects pages 1, 3, 5", + "bullet2": "2,7,12 → selects pages 2, 7, 12", + "description": "Enter numbers separated by commas.", + "title": "Individual Pages" + }, + "mathematical": { + "bullet1": "2n → all even pages (2, 4, 6â€Ļ)", + "bullet2": "2n-1 → all odd pages (1, 3, 5â€Ļ)", + "bullet3": "3n → every 3rd page (3, 6, 9â€Ļ)", + "bullet4": "4n-1 → pages 3, 7, 11, 15â€Ļ", + "description": "Use n in formulas for patterns.", + "title": "Mathematical Functions" + }, + "ranges": { + "bullet1": "3-6 → selects pages 3–6", + "bullet2": "10-15 → selects pages 10–15", + "bullet3": "5- → selects pages 5 to end", + "description": "Use - for consecutive pages.", + "title": "Page Ranges" + }, + "special": { + "bullet1": "all → selects all pages", + "title": "Special Keywords" } } }, "bulkSelection": { + "syntaxError": "There is a syntax issue. See Page Selection tips for help.", "header": { "title": "Anleitung zur Seitenauswahl" }, @@ -1379,7 +1621,6 @@ } }, "changeMetadata": { - "tags": "titel,autor,datum,erstellung,uhrzeit,herausgeber,produzent,statistiken", "header": "Metadaten ändern", "submit": "Ändern", "filenamePrefix": "metadaten", @@ -1431,8 +1672,8 @@ "trapped": { "label": "Trapped-Status", "unknown": "Unbekannt", - "false": "Falsch", - "true": "Wahr" + "true": "Wahr", + "false": "Falsch" }, "advanced": { "title": "Erweiterte Optionen" @@ -1500,7 +1741,8 @@ "bullet3": "Unknown: Trapped-Status ist nicht angegeben" } } - } + }, + "tags": "titel,autor,datum,erstellung,uhrzeit,herausgeber,produzent,statistiken" }, "fileToPDF": { "tags": "transformation,format,dokument,bild,folie,text,konvertierung,bÃŧro,dokumente,word,excel,powerpoint", @@ -1613,6 +1855,9 @@ "text": "Nachbearbeitung der finalen PDF durch Entfernung von OCR-Artefakten und Optimierung der Textebene fÃŧr bessere Lesbarkeit und kleinere DateigrÃļße." } } + }, + "error": { + "failed": "OCR operation failed" } }, "extractImages": { @@ -1622,11 +1867,11 @@ "selectText": "Wählen Sie das Bildformat aus, in das extrahierte Bilder konvertiert werden sollen", "allowDuplicates": "Doppelte Bilder speichern", "submit": "Extrahieren", - "error": { - "failed": "Beim Extrahieren der Bilder aus der PDF ist ein Fehler aufgetreten." - }, "settings": { "title": "Einstellungen" + }, + "error": { + "failed": "Beim Extrahieren der Bilder aus der PDF ist ein Fehler aufgetreten." } }, "pdfToPDFA": { @@ -1699,14 +1944,43 @@ }, "info": "Python ist nicht installiert. Es ist zum AusfÃŧhren erforderlich." }, + "scannerImageSplit": { + "title": "Extrahierte Bilder", + "submit": "Bild-Scans extrahieren", + "error": { + "failed": "Beim Extrahieren der Bild-Scans ist ein Fehler aufgetreten." + }, + "tooltip": { + "title": "Foto-Teiler", + "whatThisDoes": "Was dies tut", + "whatThisDoesDesc": "Findet und extrahiert automatisch jedes Foto von einer gescannten Seite oder einem zusammengesetzten Bild - kein manuelles Zuschneiden erforderlich.", + "whenToUse": "Wann zu verwenden", + "useCase1": "Ganze Album-Seiten in einem Durchgang scannen", + "useCase2": "Flachbett-Stapel in separate Dateien aufteilen", + "useCase3": "Collagen in einzelne Fotos aufteilen", + "useCase4": "Fotos aus Dokumenten extrahieren", + "quickFixes": "Schnelle LÃļsungen", + "problem1": "Fotos nicht erkannt → Toleranz auf 30-50 erhÃļhen", + "problem2": "Zu viele Falscherkennungen → Mindestfläche auf 15.000-20.000 erhÃļhen", + "problem3": "Zuschnitte sind zu eng → RandgrÃļße auf 5-10 erhÃļhen", + "problem4": "Geneigte Fotos nicht begradigt → Winkelschwelle auf ~5° senken", + "problem5": "Staub-/Rausch-Boxen → Mindest-Konturfläche auf 1000-2000 erhÃļhen", + "setupTips": "Einrichtungstipps", + "tip1": "Verwenden Sie einen einfachen, hellen Hintergrund", + "tip2": "Lassen Sie einen kleinen Abstand (≈1 cm) zwischen den Fotos", + "tip3": "Scannen Sie mit 300-600 DPI", + "tip4": "Reinigen Sie die Scanner-Glasplatte", + "headsUp": "Hinweis", + "headsUpDesc": "Überlappende Fotos oder HintergrÃŧnde, die farblich sehr nah an den Fotos liegen, kÃļnnen die Genauigkeit verringern - versuchen Sie einen helleren oder dunkleren Hintergrund und lassen Sie mehr Platz." + } + }, "sign": { - "tags": "autorisieren,initialen,gezeichnete signatur,textzeichen,bildsignatur", "title": "Signieren", "header": "PDFs signieren", "upload": "Bild hochladen", "draw": { - "clear": "LÃļschen", - "title": "Zeichnen Sie Ihre Unterschrift" + "title": "Zeichnen Sie Ihre Unterschrift", + "clear": "LÃļschen" }, "text": { "name": "Name des Unterzeichners", @@ -1716,6 +1990,7 @@ "add": "Signieren", "saved": "Gespeicherte Signaturen", "save": "Signature speichern", + "applySignatures": "Signaturen anwenden", "personalSigs": "PersÃļnliche Signaturen", "sharedSigs": "Geteilte Signaturen", "noSavedSigs": "Es wurden keine gespeicherten Signaturen gefunden", @@ -1728,37 +2003,44 @@ "maintainRatio": "Seitenverhältnis beibehalten ein-/ausschalten", "undo": "RÃŧckgängig", "redo": "Wiederherstellen", - "activate": "Signatur-Platzierung aktivieren", - "applySignatures": "Signaturen anwenden", - "deactivate": "Signatur-Platzierung beenden", - "error": { - "failed": "Beim Signieren der PDF ist ein Fehler aufgetreten." - }, - "image": { - "hint": "Laden Sie ein PNG- oder JPG-Bild Ihrer Unterschrift hoch", - "label": "Unterschriftsbild hochladen", - "placeholder": "Bilddatei auswählen" - }, - "instructions": { - "title": "So fÃŧgen Sie eine Unterschrift hinzu" - }, - "results": { - "title": "Signatur-Ergebnisse" - }, + "submit": "Dokument signieren", "steps": { "configure": "Signatur konfigurieren" }, - "submit": "Dokument signieren", "type": { - "canvas": "Canvas", + "title": "Signaturtyp", "draw": "Zeichnen", + "canvas": "Canvas", "image": "Bild", - "text": "Text", - "title": "Signaturtyp" - } + "text": "Text" + }, + "image": { + "label": "Unterschriftsbild hochladen", + "placeholder": "Bilddatei auswählen", + "hint": "Laden Sie ein PNG- oder JPG-Bild Ihrer Unterschrift hoch" + }, + "instructions": { + "title": "So fÃŧgen Sie eine Unterschrift hinzu", + "canvas": "After drawing your signature in the canvas, close the modal then click anywhere on the PDF to place it.", + "image": "After uploading your signature image above, click anywhere on the PDF to place it.", + "text": "After entering your name above, click anywhere on the PDF to place your signature." + }, + "mode": { + "move": "Move Signature", + "place": "Place Signature" + }, + "updateAndPlace": "Update and Place", + "activate": "Signatur-Platzierung aktivieren", + "deactivate": "Signatur-Platzierung beenden", + "results": { + "title": "Signatur-Ergebnisse" + }, + "error": { + "failed": "Beim Signieren der PDF ist ein Fehler aufgetreten." + }, + "tags": "autorisieren,initialen,gezeichnete signatur,textzeichen,bildsignatur" }, "flatten": { - "tags": "statisch,deaktivieren,nicht interaktiv,optimieren", "title": "Abflachen", "header": "PDFs abflachen", "flattenOnlyForms": "Nur Formulare abflachen", @@ -1773,9 +2055,11 @@ "options": { "stepTitle": "Abflachungs-Optionen", "title": "Abflachungs-Optionen", - "flattenOnlyForms.desc": "Nur Formularfelder vereinfachen, andere interaktive Elemente unverändert lassen", - "note": "Das Abflachen entfernt interaktive Elemente aus der PDF und macht sie nicht mehr bearbeitbar.", - "flattenOnlyForms": "Nur Formulare vereinfachen" + "flattenOnlyForms": { + "label": "Nur Formulare vereinfachen", + "desc": "Nur Formularfelder vereinfachen, andere interaktive Elemente unverändert lassen" + }, + "note": "Das Abflachen entfernt interaktive Elemente aus der PDF und macht sie nicht mehr bearbeitbar." }, "results": { "title": "Reduzierungs-Ergebnisse" @@ -1803,7 +2087,8 @@ "bullet3": "Kommentare und Notizen bleiben sichtbar", "bullet4": "Lesezeichen helfen weiterhin bei der Navigation" } - } + }, + "tags": "statisch,deaktivieren,nicht interaktiv,optimieren" }, "repair": { "tags": "reparieren,wiederherstellen,korrigieren,wiederherstellen", @@ -1823,7 +2108,6 @@ } }, "removeBlanks": { - "tags": "aufräumen,rationalisieren,nicht inhaltsreich,organisieren", "title": "Leere Seiten entfernen", "header": "Leere Seiten entfernen", "settings": { @@ -1865,22 +2149,29 @@ "bullet3": "Kann deaktiviert werden, um die AusgabedateigrÃļße zu reduzieren" } }, - "submit": "Leere Seiten entfernen" + "submit": "Leere Seiten entfernen", + "error": { + "failed": "Failed to remove blank pages" + }, + "results": { + "title": "Removed Blank Pages" + }, + "tags": "aufräumen,rationalisieren,nicht inhaltsreich,organisieren" }, "removeAnnotations": { "tags": "kommentare,hervorheben,notizen,markieren,entfernen", "title": "Kommentare entfernen", "header": "Kommentare entfernen", "submit": "Entfernen", - "error": { - "failed": "Beim Entfernen der Anmerkungen aus der PDF ist ein Fehler aufgetreten." - }, - "info": { - "description": "Dieses Werkzeug entfernt alle Anmerkungen (Kommentare, Hervorhebungen, Notizen usw.) aus Ihren PDF-Dokumenten.", - "title": "Über Anmerkungen entfernen" - }, "settings": { "title": "Einstellungen" + }, + "info": { + "title": "Über Anmerkungen entfernen", + "description": "Dieses Werkzeug entfernt alle Anmerkungen (Kommentare, Hervorhebungen, Notizen usw.) aus Ihren PDF-Dokumenten." + }, + "error": { + "failed": "Beim Entfernen der Anmerkungen aus der PDF ist ein Fehler aufgetreten." } }, "compare": { @@ -1967,7 +2258,12 @@ "bullet3": "Wählen Sie, auf welcher Seite die Signatur platziert werden soll", "bullet4": "Optionales Logo kann eingefÃŧgt werden" } - } + }, + "invisible": "Invisible", + "options": { + "title": "Signature Details" + }, + "visible": "Visible" }, "sign": { "submit": "PDF signieren", @@ -2028,7 +2324,22 @@ "text": "Konvertieren Sie Ihre Datei mit keytool zu einem Java keystore (.jks), dann wählen Sie JKS." } } - } + }, + "chooseCertificate": "Choose Certificate File", + "chooseJksFile": "Choose JKS File", + "chooseP12File": "Choose PKCS12 File", + "choosePfxFile": "Choose PFX File", + "choosePrivateKey": "Choose Private Key File", + "location": "Location", + "logoTitle": "Logo", + "name": "Name", + "noLogo": "No Logo", + "pageNumber": "Page Number", + "password": "Certificate Password", + "passwordOptional": "Leave empty if no password", + "reason": "Reason", + "serverCertMessage": "Using server certificate - no files or password required", + "showLogo": "Show Logo" }, "removeCertSign": { "tags": "authentifizieren,PEM,P12,offiziell,entschlÃŧsseln", @@ -2054,7 +2365,17 @@ "header": "Mehrseitiges Layout", "pagesPerSheet": "Seiten pro Blatt:", "addBorder": "Ränder hinzufÃŧgen", - "submit": "Abschicken" + "submit": "Abschicken", + "desc": { + "2": "Place 2 pages side-by-side on a single sheet.", + "3": "Place 3 pages on a single sheet in a single row.", + "4": "Place 4 pages on a single sheet (2 × 2 grid).", + "9": "Place 9 pages on a single sheet (3 × 3 grid).", + "16": "Place 16 pages on a single sheet (4 × 4 grid)." + }, + "error": { + "failed": "An error occurred while creating the multi-page layout." + } }, "bookletImposition": { "tags": "broschÃŧre,imposition,drucken,bindung,falten,signatur", @@ -2167,8 +2488,8 @@ "pageSize": { "label": "Ziel-SeitengrÃļße", "keep": "UrsprÃŧngliche GrÃļße beibehalten", - "legal": "Legal", - "letter": "Letter" + "letter": "Letter", + "legal": "Legal" }, "submit": "Seitenskalierung anpassen", "error": { @@ -2230,7 +2551,6 @@ "tags": "farbkorrektur,abstimmung,änderung,verbesserung" }, "crop": { - "tags": "trimmen,verkleinern,bearbeiten,formen", "title": "Zuschneiden", "header": "PDF zuschneiden", "submit": "Abschicken", @@ -2241,10 +2561,22 @@ "reset": "Auf vollständiges PDF zurÃŧcksetzen", "coordinates": { "title": "Position und GrÃļße", - "x": "X-Position", - "y": "Y-Position", - "width": "Breite", - "height": "HÃļhe" + "x": { + "label": "X Position", + "desc": "Left edge (points)" + }, + "y": { + "label": "Y Position", + "desc": "Bottom edge (points)" + }, + "width": { + "label": "Width", + "desc": "Crop width (points)" + }, + "height": { + "label": "Height", + "desc": "Crop height (points)" + } }, "error": { "invalidArea": "Zuschneidebereich Ãŧberschreitet die PDF-Grenzen", @@ -2262,7 +2594,12 @@ }, "results": { "title": "Zuschneide-Ergebnisse" - } + }, + "automation": { + "info": "Enter crop coordinates in PDF points. Origin (0,0) is at bottom-left. These values will be applied to all PDFs processed in this automation.", + "reference": "Reference: A4 page is 595.28 × 841.89 points (210mm × 297mm). 1 inch = 72 points." + }, + "tags": "trimmen,verkleinern,bearbeiten,formen" }, "autoSplitPDF": { "tags": "qr basiert,trennen,segment scannen,organisieren", @@ -2448,6 +2785,7 @@ "export": "Herunterladen", "upload": "Hochladen", "boxRedaction": "Kasten-Zeichen-Schwärzung", + "zoom": "Zoom", "zoomIn": "Hineinzoomen", "zoomOut": "Herauszoomen", "nextPage": "Nächste Seite", @@ -2459,8 +2797,7 @@ "showLayers": "Ebenen anzeigen (Doppelklick, um alle Ebenen auf den Standardzustand zurÃŧckzusetzen)", "colourPicker": "Farbwähler", "findCurrentOutlineItem": "Aktuelles Gliederungselement finden", - "applyChanges": "Änderungen anwenden", - "zoom": "Zoom" + "applyChanges": "Änderungen anwenden" } }, "tableExtraxt": { @@ -2472,11 +2809,15 @@ "overlay-pdfs": { "tags": "overlay,Ãŧberlagern", "header": "PDF mit Overlay versehen", + "title": "Overlay PDFs", + "desc": "Overlay one PDF on top of another", "baseFile": { "label": "Basis-PDF-Datei auswählen" }, "overlayFiles": { - "label": "Overlay-PDF-Datei auswählen" + "label": "Overlay-PDF-Datei auswählen", + "placeholder": "Choose PDF(s)...", + "addMore": "Add more PDFs..." }, "mode": { "label": "Overlay-Modus auswählen", @@ -2486,14 +2827,53 @@ }, "counts": { "label": "Overlay Anzahl (fÃŧr Feste-Wiederholung)", - "placeholder": "Komma-separierte Anzahl eingeben (z.B.: 2,3,1)" + "placeholder": "Komma-separierte Anzahl eingeben (z.B.: 2,3,1)", + "item": "Count for file", + "noFiles": "Add overlay files to configure counts" }, "position": { "label": "Overlay Position auswählen", "foreground": "Vordergrund", "background": "Hintergrund" }, - "submit": "Erstellen" + "submit": "Erstellen", + "settings": { + "title": "Settings" + }, + "results": { + "title": "Overlay Results" + }, + "tooltip": { + "header": { + "title": "Overlay PDFs Overview" + }, + "description": { + "title": "Description", + "text": "Combine a base PDF with one or more overlay PDFs. Overlays can be applied page-by-page in different modes and placed in the foreground or background." + }, + "mode": { + "title": "Overlay Mode", + "text": "Choose how to distribute overlay pages across the base PDF pages.", + "sequential": "Sequential Overlay: Use pages from the first overlay PDF until it ends, then move to the next.", + "interleaved": "Interleaved Overlay: Take one page from each overlay in turn.", + "fixedRepeat": "Fixed Repeat Overlay: Take a set number of pages from each overlay before moving to the next. Use Counts to set the numbers." + }, + "position": { + "title": "Overlay Position", + "text": "Foreground places the overlay on top of the page. Background places it behind." + }, + "overlayFiles": { + "title": "Overlay Files", + "text": "Select one or more PDFs to overlay on the base. The order of these files affects how pages are applied in Sequential and Fixed Repeat modes." + }, + "counts": { + "title": "Counts (Fixed Repeat only)", + "text": "Provide a positive number for each overlay file showing how many pages to take before moving to the next. Required when mode is Fixed Repeat." + } + }, + "error": { + "failed": "An error occurred while overlaying PDFs." + } }, "split-by-sections": { "tags": "abschnitte,teilen,bearbeiten", @@ -2528,7 +2908,18 @@ "customMargin": "Benutzerdefinierter Rand", "customColor": "Benutzerdefinierte Textfarbe", "submit": "Abschicken", - "noStampSelected": "Kein Stempel ausgewählt. Kehren Sie zu Schritt 1 zurÃŧck." + "noStampSelected": "Kein Stempel ausgewählt. Kehren Sie zu Schritt 1 zurÃŧck.", + "customPosition": "Drag the stamp to the desired location in the preview window.", + "error": { + "failed": "An error occurred while adding stamp to the PDF." + }, + "imageSize": "Image Size", + "margin": "Margin", + "positionAndFormatting": "Position & Formatting", + "quickPosition": "Select a position on the page to place the stamp.", + "results": { + "title": "Stamp Results" + } }, "removeImagePdf": { "tags": "bild entfernen,seitenoperationen,back end,server side" @@ -2546,7 +2937,8 @@ "status": { "_value": "Status", "valid": "GÃŧltig", - "invalid": "UngÃŧltig" + "invalid": "UngÃŧltig", + "complete": "Validation complete" }, "signer": "Unterzeichner", "date": "Datum", @@ -2573,35 +2965,115 @@ "version": "Version", "keyUsage": "SchlÃŧsselverwendung", "selfSigned": "Selbstsigniert", - "bits": "Bits" + "bits": "Bits", + "details": "Certificate Details" }, "signature": { "info": "Signaturinformationen", "_value": "Signatur", "mathValid": "Signatur ist mathematisch gÃŧltig ABER:" }, - "selectCustomCert": "Benutzerdefinierte Zertifikatsdatei X.509 (Optional)" - }, - "replace-color": { - "title": "Farbe Ersetzen-Invertieren", - "header": "Farb-PDF Ersetzen-Invertieren", - "selectText": { - "1": "Ersetzen oder Invertieren von Farboptionen", - "2": "Standard(Standardfarben mit hohem Kontrast)", - "3": "Benutzerdefiniert(Benutzerdefinierte Farben)", - "4": "Vollinvertierung(Invertierung aller Farben)", - "5": "Farboptionen mit hohem Kontrast", - "6": "Weißer Text auf schwarzem Hintergrund", - "7": "Schwarzer Text auf weißem Hintergrund", - "8": "Gelber Text auf schwarzem Hintergrund", - "9": "GrÃŧner Text auf schwarzem Hintergrund", - "10": "Textfarbe auswählen", - "11": "Hintergrundfarbe auswählen" + "selectCustomCert": "Benutzerdefinierte Zertifikatsdatei X.509 (Optional)", + "downloadCsv": "Download CSV", + "downloadJson": "Download JSON", + "downloadPdf": "Download PDF Report", + "downloadType": { + "csv": "CSV", + "json": "JSON", + "pdf": "PDF" }, - "submit": "Ersetzen" + "error": { + "allFailed": "Unable to validate the selected files.", + "partial": "Some files could not be validated.", + "reportGeneration": "Could not generate the PDF report. JSON and CSV are available.", + "unexpected": "Unexpected error during validation." + }, + "finalizing": "Preparing downloads...", + "issue": { + "certExpired": "Certificate expired", + "certRevocationUnknown": "Certificate revocation status unknown", + "certRevoked": "Certificate revoked", + "chainInvalid": "Certificate chain invalid", + "signatureInvalid": "Signature cryptographic check failed", + "trustInvalid": "Certificate not trusted" + }, + "noResults": "Run the validation to generate a report.", + "noSignaturesShort": "No signatures", + "processing": "Validating signatures...", + "report": { + "continued": "Continued", + "downloads": "Downloads", + "entryLabel": "Signature Summary", + "fields": { + "created": "Created", + "fileSize": "File Size", + "signatureCount": "Total Signatures", + "signatureDate": "Signature Date" + }, + "filesEvaluated": "{{count}} files evaluated", + "footer": "Validated via Stirling PDF", + "generatedAt": "Generated", + "noPdf": "PDF report will be available after a successful validation.", + "page": "Page", + "shortTitle": "Signature Summary", + "signatureCountLabel": "{{count}} signatures", + "signaturesFound": "{{count}} signatures detected", + "signaturesValid": "{{count}} fully valid", + "title": "Signature Validation Report" + }, + "settings": { + "certHint": "Upload a trusted X.509 certificate to validate against a custom trust source.", + "title": "Validation Settings" + }, + "signatureDate": "Signature Date", + "totalSignatures": "Total Signatures" }, - "replaceColorPdf": { - "tags": "Farbe ersetzen,Seiteneinstellungen,Backend,Serverseite" + "replaceColor": { + "tags": "Farbe ersetzen,Seitenoperationen,Backend,serverseitig", + "labels": { + "settings": "Settings", + "colourOperation": "Colour operation" + }, + "options": { + "highContrast": "High contrast", + "invertAll": "Invert all colours", + "custom": "Custom", + "cmyk": "Convert to CMYK" + }, + "tooltip": { + "header": { + "title": "Replace & Invert Colour Settings Overview" + }, + "description": { + "title": "Description", + "text": "Transform PDF colours to improve readability and accessibility. Choose from high contrast presets, invert all colours, or create custom colour schemes." + }, + "highContrast": { + "title": "High Contrast", + "text": "Apply predefined high contrast colour combinations designed for better readability and accessibility compliance.", + "bullet1": "White text on black background - Classic dark mode", + "bullet2": "Black text on white background - Standard high contrast", + "bullet3": "Yellow text on black background - High visibility option", + "bullet4": "Green text on black background - Alternative high contrast" + }, + "invertAll": { + "title": "Invert All Colours", + "text": "Completely invert all colours in the PDF, creating a negative-like effect. Useful for creating dark mode versions of documents or reducing eye strain in low-light conditions." + }, + "custom": { + "title": "Custom Colours", + "text": "Define your own text and background colours using the colour pickers. Perfect for creating branded documents or specific accessibility requirements.", + "bullet1": "Text colour - Choose the colour for text elements", + "bullet2": "Background colour - Set the background colour for the document" + }, + "cmyk": { + "title": "Convert to CMYK", + "text": "Convert the PDF from RGB colour space to CMYK colour space, optimized for professional printing. This process converts colours to the Cyan, Magenta, Yellow, Black model used by printers." + } + }, + "error": { + "failed": "An error occurred while processing the colour replacement." + } }, "login": { "title": "Anmelden", @@ -2634,6 +3106,11 @@ "enterEmail": "Geben Sie Ihre E-Mail-Adresse ein", "enterPassword": "Geben Sie Ihr Passwort ein", "loggingIn": "Anmeldung läuft...", + "username": "Username", + "enterUsername": "Enter username", + "useEmailInstead": "Login with email", + "forgotPassword": "Forgot your password?", + "logIn": "Log In", "signingIn": "Anmeldung läuft...", "login": "Anmelden", "or": "Oder", @@ -2644,6 +3121,7 @@ "cancel": "Abbrechen", "dontHaveAccount": "Sie haben noch kein Konto? Registrieren", "home": "Startseite", + "debug": "Debug", "signOut": "Abmelden", "pleaseEnterBoth": "Bitte geben Sie sowohl E-Mail als auch Passwort ein", "pleaseEnterEmail": "Bitte geben Sie Ihre E-Mail-Adresse ein", @@ -2651,11 +3129,14 @@ "passwordResetSent": "Passwort-Reset-Link wurde an {{email}} gesendet! PrÃŧfen Sie Ihre E-Mails und folgen Sie den Anweisungen.", "failedToSignIn": "Anmeldung mit {{provider}} fehlgeschlagen: {{message}}", "unexpectedError": "Unerwarteter Fehler: {{message}}", - "debug": "Debug" + "accountCreatedSuccess": "Account created successfully! You can now sign in.", + "passwordChangedSuccess": "Password changed successfully! Please sign in with your new password.", + "credentialsUpdated": "Your credentials have been updated. Please sign in again." }, "signup": { "title": "Konto erstellen", "subtitle": "Bei Stirling PDF anmelden und loslegen", + "name": "Name", "email": "E-Mail", "password": "Passwort", "confirmPassword": "Passwort bestätigen", @@ -2674,7 +3155,11 @@ "checkEmailConfirmation": "PrÃŧfen Sie Ihre E-Mails auf einen Bestätigungslink, um die Registrierung abzuschließen.", "accountCreatedSuccessfully": "Konto erfolgreich erstellt! Sie kÃļnnen sich jetzt anmelden.", "unexpectedError": "Unerwarteter Fehler: {{message}}", - "name": "Name" + "useEmailInstead": "Use Email Instead", + "nameRequired": "Name is required", + "emailRequired": "Email is required", + "passwordRequired": "Password is required", + "confirmPasswordRequired": "Please confirm your password" }, "pdfToSinglePage": { "title": "PDF zu einer Seite zusammenfassen", @@ -2714,10 +3199,23 @@ "adjustContrast": { "title": "Kontrast anpassen", "header": "Farben/Kontrast anpassen", + "basic": "Basic Adjustments", "contrast": "Kontrast:", "brightness": "Helligkeit:", "saturation": "Sättigung:", - "download": "Herunterladen" + "download": "Herunterladen", + "adjustColors": "Adjust Colors", + "blue": "Blue", + "confirm": "Confirm", + "error": { + "failed": "Failed to adjust colors/contrast" + }, + "green": "Green", + "noPreview": "Select a PDF to preview", + "red": "Red", + "results": { + "title": "Adjusted PDF" + } }, "compress": { "title": "Komprimieren", @@ -2864,7 +3362,13 @@ "title": "Bild entfernen", "header": "Bild entfernen", "removeImage": "Bild entfernen", - "submit": "Bild entfernen" + "submit": "Bild entfernen", + "error": { + "failed": "Failed to remove images from the PDF." + }, + "results": { + "title": "Remove Images Results" + } }, "splitByChapters": { "title": "PDF nach Kapiteln aufteilen", @@ -2939,6 +3443,10 @@ "title": "Analyse", "description": "Diese Cookies helfen uns zu verstehen, wie unsere Tools genutzt werden, damit wir uns darauf konzentrieren kÃļnnen, die Funktionen zu entwickeln, die unserer Community am meisten am Herzen liegen. Seien Sie beruhigt – Stirling PDF kann und wird niemals den Inhalt der Dokumente verfolgen, mit denen Sie arbeiten." } + }, + "services": { + "posthog": "PostHog Analytics", + "scarf": "Scarf Pixel" } }, "removeMetadata": { @@ -3000,11 +3508,18 @@ "panMode": "Verschiebemodus", "rotateLeft": "Nach links drehen", "rotateRight": "Nach rechts drehen", - "toggleSidebar": "Seitenleiste umschalten" + "toggleSidebar": "Seitenleiste umschalten", + "exportSelected": "Export Selected Pages", + "toggleAnnotations": "Toggle Annotations Visibility", + "annotationMode": "Toggle Annotation Mode", + "draw": "Draw", + "save": "Save" }, "search": { "title": "PDF durchsuchen", - "placeholder": "Suchbegriff eingeben..." + "placeholder": "Suchbegriff eingeben...", + "noResults": "No results found", + "searching": "Searching..." }, "guestBanner": { "title": "Sie verwenden Stirling PDF als Gast!", @@ -3042,9 +3557,597 @@ "automate": "Automatisieren", "files": "Dateien", "activity": "Aktivität", + "help": "Help", + "account": "Account", "config": "Konfiguration", + "adminSettings": "Admin Settings", "allTools": "Alle Werkzeuge" }, + "admin": { + "error": "Error", + "success": "Success", + "expand": "Expand", + "close": "Close", + "status": { + "active": "Active", + "inactive": "Inactive" + }, + "settings": { + "title": "Admin Settings", + "workspace": "Workspace", + "fetchError": "Failed to load settings", + "saveError": "Failed to save settings", + "saved": "Settings saved successfully", + "saveSuccess": "Settings saved successfully", + "save": "Save Changes", + "restartRequired": "Restart Required", + "restart": { + "title": "Restart Required", + "message": "Settings have been saved successfully. A server restart is required for the changes to take effect.", + "question": "Would you like to restart the server now or later?", + "now": "Restart Now", + "later": "Restart Later" + }, + "restarting": "Restarting Server", + "restartingMessage": "The server is restarting. Please wait a moment...", + "restartError": "Failed to restart server. Please restart manually.", + "general": { + "title": "System Settings", + "description": "Configure system-wide application settings including branding and default behaviour.", + "ui": "User Interface", + "system": "System", + "appName": { + "label": "Application Name", + "description": "The name displayed in the browser tab and home page" + }, + "appNameNavbar": { + "label": "Navbar Brand", + "description": "The name displayed in the navigation bar" + }, + "homeDescription": { + "label": "Home Description", + "description": "The description text shown on the home page" + }, + "defaultLocale": { + "label": "Default Locale", + "description": "The default language for new users (e.g., en_US, es_ES)" + }, + "fileUploadLimit": { + "label": "File Upload Limit", + "description": "Maximum file upload size (e.g., 100MB, 1GB)" + }, + "showUpdate": { + "label": "Show Update Notifications", + "description": "Display notifications when a new version is available" + }, + "showUpdateOnlyAdmin": { + "label": "Show Updates to Admins Only", + "description": "Restrict update notifications to admin users only" + }, + "customHTMLFiles": { + "label": "Custom HTML Files", + "description": "Allow serving custom HTML files from the customFiles directory" + }, + "languages": { + "label": "Available Languages", + "description": "Languages that users can select from (leave empty to enable all languages)" + }, + "customMetadata": { + "label": "Custom Metadata", + "autoUpdate": { + "label": "Auto Update Metadata", + "description": "Automatically update PDF metadata on all processed documents" + }, + "author": { + "label": "Default Author", + "description": "Default author for PDF metadata (e.g., username)" + }, + "creator": { + "label": "Default Creator", + "description": "Default creator for PDF metadata" + }, + "producer": { + "label": "Default Producer", + "description": "Default producer for PDF metadata" + } + }, + "customPaths": { + "label": "Custom Paths", + "description": "Configure custom file system paths for pipeline processing and external tools", + "pipeline": { + "label": "Pipeline Directories", + "watchedFoldersDir": { + "label": "Watched Folders Directory", + "description": "Directory where pipeline monitors for incoming PDFs (leave empty for default: /pipeline/watchedFolders)" + }, + "finishedFoldersDir": { + "label": "Finished Folders Directory", + "description": "Directory where processed PDFs are outputted (leave empty for default: /pipeline/finishedFolders)" + } + }, + "operations": { + "label": "External Tool Paths", + "weasyprint": { + "label": "WeasyPrint Executable", + "description": "Path to WeasyPrint executable for HTML to PDF conversion (leave empty for default: /opt/venv/bin/weasyprint)" + }, + "unoconvert": { + "label": "Unoconvert Executable", + "description": "Path to LibreOffice unoconvert for document conversions (leave empty for default: /opt/venv/bin/unoconvert)" + } + } + } + }, + "security": { + "title": "Security", + "description": "Configure authentication, login behaviour, and security policies.", + "ssoNotice": { + "title": "Looking for SSO/SAML settings?", + "message": "OAuth2 and SAML2 authentication providers have been moved to the Connections menu for easier management." + }, + "authentication": "Authentication", + "enableLogin": { + "label": "Enable Login", + "description": "Require users to log in before accessing the application" + }, + "loginMethod": { + "label": "Login Method", + "description": "The authentication method to use for user login", + "all": "All Methods", + "normal": "Username/Password Only", + "oauth2": "OAuth2 Only", + "saml2": "SAML2 Only" + }, + "loginAttemptCount": { + "label": "Login Attempt Limit", + "description": "Maximum number of failed login attempts before account lockout" + }, + "loginResetTimeMinutes": { + "label": "Login Reset Time (minutes)", + "description": "Time before failed login attempts are reset" + }, + "csrfDisabled": { + "label": "Disable CSRF Protection", + "description": "Disable Cross-Site Request Forgery protection (not recommended)" + }, + "initialLogin": { + "label": "Initial Login", + "username": { + "label": "Initial Username", + "description": "The username for the initial admin account" + }, + "password": { + "label": "Initial Password", + "description": "The password for the initial admin account" + } + }, + "jwt": { + "label": "JWT Configuration", + "secureCookie": { + "label": "Secure Cookie", + "description": "Require HTTPS for JWT cookies (recommended for production)" + }, + "keyRetentionDays": { + "label": "Key Retention Days", + "description": "Number of days to retain old JWT keys for verification" + }, + "persistence": { + "label": "Enable Key Persistence", + "description": "Store JWT keys persistently to survive server restarts" + }, + "enableKeyRotation": { + "label": "Enable Key Rotation", + "description": "Automatically rotate JWT signing keys periodically" + }, + "enableKeyCleanup": { + "label": "Enable Key Cleanup", + "description": "Automatically remove expired JWT keys" + } + }, + "audit": { + "label": "Audit Logging", + "enabled": { + "label": "Enable Audit Logging", + "description": "Track user actions and system events for compliance and security monitoring" + }, + "level": { + "label": "Audit Level", + "description": "0=OFF, 1=BASIC, 2=STANDARD, 3=VERBOSE" + }, + "retentionDays": { + "label": "Audit Retention (days)", + "description": "Number of days to retain audit logs" + } + }, + "htmlUrlSecurity": { + "label": "HTML URL Security", + "description": "Configure URL access restrictions for HTML processing to prevent SSRF attacks", + "enabled": { + "label": "Enable URL Security", + "description": "Enable URL security restrictions for HTML to PDF conversions" + }, + "level": { + "label": "Security Level", + "description": "MAX: whitelist only, MEDIUM: block internal networks, OFF: no restrictions", + "max": "Maximum (Whitelist Only)", + "medium": "Medium (Block Internal)", + "off": "Off (No Restrictions)" + }, + "advanced": "Advanced Settings", + "allowedDomains": { + "label": "Allowed Domains (Whitelist)", + "description": "One domain per line (e.g., cdn.example.com). Only these domains allowed when level is MAX" + }, + "blockedDomains": { + "label": "Blocked Domains (Blacklist)", + "description": "One domain per line (e.g., malicious.com). Additional domains to block" + }, + "internalTlds": { + "label": "Internal TLDs", + "description": "One TLD per line (e.g., .local, .internal). Block domains with these TLD patterns" + }, + "networkBlocking": "Network Blocking", + "blockPrivateNetworks": { + "label": "Block Private Networks", + "description": "Block RFC 1918 private networks (10.x.x.x, 192.168.x.x, 172.16-31.x.x)" + }, + "blockLocalhost": { + "label": "Block Localhost", + "description": "Block localhost and loopback addresses (127.x.x.x, ::1)" + }, + "blockLinkLocal": { + "label": "Block Link-Local Addresses", + "description": "Block link-local addresses (169.254.x.x, fe80::/10)" + }, + "blockCloudMetadata": { + "label": "Block Cloud Metadata Endpoints", + "description": "Block cloud provider metadata endpoints (169.254.169.254)" + } + } + }, + "connections": { + "title": "Connections", + "description": "Configure external authentication providers like OAuth2 and SAML.", + "linkedServices": "Linked Services", + "unlinkedServices": "Unlinked Services", + "connect": "Connect", + "disconnect": "Disconnect", + "disconnected": "Provider disconnected successfully", + "disconnectError": "Failed to disconnect provider", + "ssoAutoLogin": { + "label": "SSO Auto Login", + "enable": "Enable SSO Auto Login", + "description": "Automatically redirect to SSO login when authentication is required" + }, + "oauth2": { + "label": "OAuth2", + "enabled": { + "label": "Enable OAuth2", + "description": "Allow users to authenticate using OAuth2 providers" + }, + "provider": { + "label": "Provider", + "description": "The OAuth2 provider to use for authentication" + }, + "issuer": { + "label": "Issuer URL", + "description": "The OAuth2 provider issuer URL" + }, + "clientId": { + "label": "Client ID", + "description": "The OAuth2 client ID from your provider" + }, + "clientSecret": { + "label": "Client Secret", + "description": "The OAuth2 client secret from your provider" + }, + "useAsUsername": { + "label": "Use as Username", + "description": "The OAuth2 claim to use as the username (e.g., email, sub)" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first OAuth2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via OAuth2" + }, + "scopes": { + "label": "OAuth2 Scopes", + "description": "Comma-separated list of OAuth2 scopes to request (e.g., openid, profile, email)" + } + }, + "saml2": { + "label": "SAML2", + "enabled": { + "label": "Enable SAML2", + "description": "Allow users to authenticate using SAML2 providers" + }, + "provider": { + "label": "Provider", + "description": "The SAML2 provider name" + }, + "registrationId": { + "label": "Registration ID", + "description": "The SAML2 registration identifier" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first SAML2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via SAML2" + } + } + }, + "database": { + "title": "Database", + "description": "Configure custom database connection settings for enterprise deployments.", + "configuration": "Database Configuration", + "enableCustom": { + "label": "Enable Custom Database", + "description": "Use your own custom database configuration instead of the default embedded database" + }, + "customUrl": { + "label": "Custom Database URL", + "description": "Full JDBC connection string (e.g., jdbc:postgresql://localhost:5432/postgres). If provided, individual connection settings below are not used." + }, + "type": { + "label": "Database Type", + "description": "Type of database (not used if custom URL is provided)" + }, + "hostName": { + "label": "Host Name", + "description": "Database server hostname (not used if custom URL is provided)" + }, + "port": { + "label": "Port", + "description": "Database server port (not used if custom URL is provided)" + }, + "name": { + "label": "Database Name", + "description": "Name of the database (not used if custom URL is provided)" + }, + "username": { + "label": "Username", + "description": "Database authentication username" + }, + "password": { + "label": "Password", + "description": "Database authentication password" + } + }, + "privacy": { + "title": "Privacy", + "description": "Configure privacy and data collection settings.", + "analytics": "Analytics & Tracking", + "enableAnalytics": { + "label": "Enable Analytics", + "description": "Collect anonymous usage analytics to help improve the application" + }, + "metricsEnabled": { + "label": "Enable Metrics", + "description": "Enable collection of performance and usage metrics. Provides API endpoint for admins to access metrics data" + }, + "searchEngine": "Search Engine Visibility", + "googleVisibility": { + "label": "Google Visibility", + "description": "Allow search engines to index this application" + } + }, + "advanced": { + "title": "Advanced", + "description": "Configure advanced features and experimental functionality.", + "features": "Feature Flags", + "processing": "Processing", + "endpoints": { + "label": "Endpoints", + "manage": "Manage API Endpoints", + "description": "Endpoint management is configured via YAML. See documentation for details on enabling/disabling specific endpoints." + }, + "enableAlphaFunctionality": { + "label": "Enable Alpha Features", + "description": "Enable experimental and alpha-stage features (may be unstable)" + }, + "enableUrlToPDF": { + "label": "Enable URL to PDF", + "description": "Allow conversion of web pages to PDF documents" + }, + "maxDPI": { + "label": "Maximum DPI", + "description": "Maximum DPI for image processing (0 = unlimited)" + }, + "tessdataDir": { + "label": "Tessdata Directory", + "description": "Path to the tessdata directory for OCR language files" + }, + "disableSanitize": { + "label": "Disable HTML Sanitization", + "description": "WARNING: Security risk - disabling HTML sanitization can lead to XSS vulnerabilities" + }, + "tempFileManagement": { + "label": "Temp File Management", + "description": "Configure temporary file storage and cleanup behavior", + "baseTmpDir": { + "label": "Base Temp Directory", + "description": "Base directory for temporary files (leave empty for default: java.io.tmpdir/stirling-pdf)" + }, + "libreofficeDir": { + "label": "LibreOffice Temp Directory", + "description": "Directory for LibreOffice temp files (leave empty for default: baseTmpDir/libreoffice)" + }, + "systemTempDir": { + "label": "System Temp Directory", + "description": "System temp directory to clean (only used if cleanupSystemTemp is enabled)" + }, + "prefix": { + "label": "Temp File Prefix", + "description": "Prefix for temp file names" + }, + "maxAgeHours": { + "label": "Max Age (hours)", + "description": "Maximum age in hours before temp files are cleaned up" + }, + "cleanupIntervalMinutes": { + "label": "Cleanup Interval (minutes)", + "description": "How often to run cleanup (in minutes)" + }, + "startupCleanup": { + "label": "Startup Cleanup", + "description": "Clean up old temp files on application startup" + }, + "cleanupSystemTemp": { + "label": "Cleanup System Temp", + "description": "Whether to clean broader system temp directory (use with caution)" + } + }, + "processExecutor": { + "label": "Process Executor Limits", + "description": "Configure session limits and timeouts for each process executor", + "sessionLimit": { + "label": "Session Limit", + "description": "Maximum concurrent instances" + }, + "timeout": { + "label": "Timeout (minutes)", + "description": "Maximum execution time" + }, + "libreOffice": "LibreOffice", + "pdfToHtml": "PDF to HTML", + "qpdf": "QPDF", + "tesseract": "Tesseract OCR", + "pythonOpenCv": "Python OpenCV", + "weasyPrint": "WeasyPrint", + "installApp": "Install App", + "calibre": "Calibre", + "ghostscript": "Ghostscript", + "ocrMyPdf": "OCRmyPDF" + } + }, + "mail": { + "title": "Mail Server", + "description": "Configure SMTP settings for sending email notifications.", + "smtp": "SMTP Configuration", + "enabled": { + "label": "Enable Mail", + "description": "Enable email notifications and SMTP functionality" + }, + "host": { + "label": "SMTP Host", + "description": "The hostname or IP address of your SMTP server" + }, + "port": { + "label": "SMTP Port", + "description": "The port number for SMTP connection (typically 25, 465, or 587)" + }, + "username": { + "label": "SMTP Username", + "description": "Username for SMTP authentication" + }, + "password": { + "label": "SMTP Password", + "description": "Password for SMTP authentication" + }, + "from": { + "label": "From Address", + "description": "The email address to use as the sender" + }, + "enableInvites": { + "label": "Enable Email Invites", + "description": "Allow admins to invite users via email with auto-generated passwords" + }, + "frontendUrl": { + "label": "Frontend URL", + "description": "Base URL for frontend (e.g. https://pdf.example.com). Used for generating invite links in emails. Leave empty to use backend URL." + } + }, + "legal": { + "title": "Legal Documents", + "description": "Configure links to legal documents and policies.", + "disclaimer": { + "title": "Legal Responsibility Warning", + "message": "By customizing these legal documents, you assume full responsibility for ensuring compliance with all applicable laws and regulations, including but not limited to GDPR and other EU data protection requirements. Only modify these settings if: (1) you are operating a personal/private instance, (2) you are outside EU jurisdiction and understand your local legal obligations, or (3) you have obtained proper legal counsel and accept sole responsibility for all user data and legal compliance. Stirling-PDF and its developers assume no liability for your legal obligations." + }, + "termsAndConditions": { + "label": "Terms and Conditions", + "description": "URL or filename to terms and conditions" + }, + "privacyPolicy": { + "label": "Privacy Policy", + "description": "URL or filename to privacy policy" + }, + "accessibilityStatement": { + "label": "Accessibility Statement", + "description": "URL or filename to accessibility statement" + }, + "cookiePolicy": { + "label": "Cookie Policy", + "description": "URL or filename to cookie policy" + }, + "impressum": { + "label": "Impressum", + "description": "URL or filename to impressum (required in some jurisdictions)" + } + }, + "premium": { + "title": "Premium & Enterprise", + "description": "Configure your premium or enterprise license key.", + "license": "License Configuration", + "key": { + "label": "License Key", + "description": "Enter your premium or enterprise license key" + }, + "enabled": { + "label": "Enable Premium Features", + "description": "Enable license key checks for pro/enterprise features" + }, + "movedFeatures": { + "title": "Premium Features Distributed", + "message": "Premium and Enterprise features are now organized in their respective sections:" + } + }, + "features": { + "title": "Features", + "description": "Configure optional features and functionality.", + "serverCertificate": { + "label": "Server Certificate", + "description": "Configure server-side certificate generation for \"Sign with Stirling-PDF\" functionality", + "enabled": { + "label": "Enable Server Certificate", + "description": "Enable server-side certificate for \"Sign with Stirling-PDF\" option" + }, + "organizationName": { + "label": "Organization Name", + "description": "Organization name for generated certificates" + }, + "validity": { + "label": "Certificate Validity (days)", + "description": "Number of days the certificate will be valid" + }, + "regenerateOnStartup": { + "label": "Regenerate on Startup", + "description": "Generate new certificate on each application startup" + } + } + }, + "endpoints": { + "title": "API Endpoints", + "description": "Control which API endpoints and endpoint groups are available.", + "management": "Endpoint Management", + "toRemove": { + "label": "Disabled Endpoints", + "description": "Select individual endpoints to disable" + }, + "groupsToRemove": { + "label": "Disabled Endpoint Groups", + "description": "Select endpoint groups to disable" + }, + "note": "Note: Disabling endpoints restricts API access but does not remove UI components. Restart required for changes to take effect." + } + } + }, "fileUpload": { "selectFile": "Datei auswählen", "selectFiles": "Dateien auswählen", @@ -3069,6 +4172,9 @@ "addFiles": "Dateien hinzufÃŧgen", "dragFilesInOrClick": "Dateien hineinziehen oder \"Dateien hinzufÃŧgen\" klicken zum Durchsuchen" }, + "fileEditor": { + "addFiles": "Add Files" + }, "fileManager": { "title": "PDF-Dateien hochladen", "subtitle": "Dateien zum Speicher hinzufÃŧgen fÃŧr einfachen Zugriff in allen Tools", @@ -3097,17 +4203,22 @@ "lastModified": "Zuletzt geändert", "toolChain": "Angewendete Werkzeuge", "restore": "Wiederherstellen", + "unzip": "Unzip", "searchFiles": "Dateien suchen...", "recent": "KÃŧrzlich", "localFiles": "Lokale Dateien", + "googleDrive": "Google Drive", + "googleDriveShort": "Drive", "myFiles": "Meine Dateien", "noRecentFiles": "Keine kÃŧrzlichen Dateien gefunden", - "dropFilesHint": "Dateien hier ablegen zum Hochladen", "googleDriveNotAvailable": "Google Drive-Integration nicht verfÃŧgbar", "openFiles": "Dateien Ãļffnen", "openFile": "Datei Ãļffnen", "details": "Dateidetails", + "fileName": "Name", + "fileFormat": "Format", "fileSize": "GrÃļße", + "fileVersion": "Version", "totalSelected": "Gesamt ausgewählt", "dropFilesHere": "Dateien hier ablegen", "selectAll": "Alle auswählen", @@ -3118,11 +4229,17 @@ "download": "Herunterladen", "delete": "LÃļschen", "unsupported": "Nicht unterstÃŧtzt", - "fileFormat": "Format", - "fileName": "Name", - "fileVersion": "Version", - "googleDrive": "Google Drive", - "googleDriveShort": "Drive" + "addToUpload": "Add to Upload", + "deleteAll": "Delete All", + "loadingFiles": "Loading files...", + "noFiles": "No files available", + "noFilesFound": "No files found matching your search", + "openInPageEditor": "Open in Page Editor", + "showAll": "Show All", + "sortByDate": "Sort by Date", + "sortByName": "Sort by Name", + "sortBySize": "Sort by Size", + "dropFilesHint": "Dateien hier ablegen zum Hochladen" }, "storage": { "temporaryNotice": "Dateien werden temporär in Ihrem Browser gespeichert und kÃļnnen automatisch gelÃļscht werden", @@ -3138,8 +4255,10 @@ "desc": "Potentiell schädliche Elemente aus PDF-Dateien entfernen.", "submit": "PDF Bereinigen", "completed": "Bereinigung erfolgreich abgeschlossen", - "error.generic": "Bereinigung fehlgeschlagen", - "error.failed": "Ein Fehler ist bei der Bereinigung der PDF aufgetreten.", + "error": { + "generic": "Bereinigung fehlgeschlagen", + "failed": "Ein Fehler ist bei der Bereinigung der PDF aufgetreten." + }, "filenamePrefix": "bereinigt", "sanitizationResults": "Bereinigungsergebnisse", "steps": { @@ -3154,21 +4273,27 @@ "title": "Bereinigungs-Optionen", "note": "Wählen Sie die Elemente aus, die Sie aus der PDF entfernen mÃļchten. Mindestens eine Option muss ausgewählt werden.", "removeJavaScript": { + "label": "Remove JavaScript", "desc": "JavaScript-Aktionen und Skripte aus der PDF entfernen" }, "removeEmbeddedFiles": { + "label": "Remove Embedded Files", "desc": "Alle in der PDF eingebetteten Dateien entfernen" }, "removeXMPMetadata": { + "label": "Remove XMP Metadata", "desc": "XMP-Metadaten aus der PDF entfernen" }, "removeMetadata": { + "label": "Remove Document Metadata", "desc": "Dokumentinformations-Metadaten (Titel, Autor usw.) entfernen" }, "removeLinks": { + "label": "Remove Links", "desc": "Externe Links und Launch-Aktionen aus der PDF entfernen" }, "removeFonts": { + "label": "Remove Fonts", "desc": "Eingebettete Schriftarten aus der PDF entfernen" } } @@ -3198,8 +4323,8 @@ "keyLength": { "label": "VerschlÃŧsselungsschlÃŧssellänge", "40bit": "40-bit (Niedrig)", - "256bit": "256-bit (Hoch)", - "128bit": "128-bit (Standard)" + "128bit": "128-bit (Standard)", + "256bit": "256-bit (Hoch)" } }, "results": { @@ -3391,9 +4516,14 @@ "remaining": "verbleibend", "used": "verwendet", "available": "verfÃŧgbar", - "cancel": "Abbrechen" + "cancel": "Abbrechen", + "preview": "Preview" }, "config": { + "overview": { + "title": "Application Configuration", + "description": "Current application settings and configuration details." + }, "account": { "overview": { "title": "Kontoeinstellungen", @@ -3440,56 +4570,583 @@ } }, "AddAttachmentsRequest": { - "addMoreFiles": "Weitere Dateien hinzufÃŧgen...", "attachments": "Anhänge auswählen", "info": "Wählen Sie Dateien aus, die Sie Ihrer PDF anhängen mÃļchten. Diese Dateien werden eingebettet und Ãŧber das Anhangs-Panel der PDF zugänglich sein.", + "selectFiles": "Dateien zum Anhängen auswählen", "placeholder": "Dateien auswählen...", + "addMoreFiles": "Weitere Dateien hinzufÃŧgen...", + "selectedFiles": "Ausgewählte Dateien", + "submit": "Anhänge hinzufÃŧgen", "results": { "title": "Anhangs-Ergebnisse" }, - "selectFiles": "Dateien zum Anhängen auswählen", - "selectedFiles": "Ausgewählte Dateien", - "submit": "Anhänge hinzufÃŧgen" - }, - "applyAndContinue": "Anwenden & Fortfahren", - "discardChanges": "Änderungen verwerfen", - "exportAndContinue": "Exportieren & Fortfahren", - "keepWorking": "Weiterarbeiten", - "logOut": "Abmelden", - "replaceColor": { - "tags": "Farbe ersetzen,Seitenoperationen,Backend,serverseitig" - }, - "scannerImageSplit": { "error": { - "failed": "Beim Extrahieren der Bild-Scans ist ein Fehler aufgetreten." - }, - "submit": "Bild-Scans extrahieren", - "title": "Extrahierte Bilder", - "tooltip": { - "headsUp": "Hinweis", - "headsUpDesc": "Überlappende Fotos oder HintergrÃŧnde, die farblich sehr nah an den Fotos liegen, kÃļnnen die Genauigkeit verringern - versuchen Sie einen helleren oder dunkleren Hintergrund und lassen Sie mehr Platz.", - "problem1": "Fotos nicht erkannt → Toleranz auf 30-50 erhÃļhen", - "problem2": "Zu viele Falscherkennungen → Mindestfläche auf 15.000-20.000 erhÃļhen", - "problem3": "Zuschnitte sind zu eng → RandgrÃļße auf 5-10 erhÃļhen", - "problem4": "Geneigte Fotos nicht begradigt → Winkelschwelle auf ~5° senken", - "problem5": "Staub-/Rausch-Boxen → Mindest-Konturfläche auf 1000-2000 erhÃļhen", - "quickFixes": "Schnelle LÃļsungen", - "setupTips": "Einrichtungstipps", - "tip1": "Verwenden Sie einen einfachen, hellen Hintergrund", - "tip2": "Lassen Sie einen kleinen Abstand (≈1 cm) zwischen den Fotos", - "tip3": "Scannen Sie mit 300-600 DPI", - "tip4": "Reinigen Sie die Scanner-Glasplatte", - "title": "Foto-Teiler", - "useCase1": "Ganze Album-Seiten in einem Durchgang scannen", - "useCase2": "Flachbett-Stapel in separate Dateien aufteilen", - "useCase3": "Collagen in einzelne Fotos aufteilen", - "useCase4": "Fotos aus Dokumenten extrahieren", - "whatThisDoes": "Was dies tut", - "whatThisDoesDesc": "Findet und extrahiert automatisch jedes Foto von einer gescannten Seite oder einem zusammengesetzten Bild - kein manuelles Zuschneiden erforderlich.", - "whenToUse": "Wann zu verwenden" + "failed": "Add attachments operation failed" } }, "termsAndConditions": "Allgemeine Geschäftsbedingungen", - "unsavedChanges": "Sie haben ungespeicherte Änderungen an Ihrer PDF. Was mÃļchten Sie tun?", - "unsavedChangesTitle": "Ungespeicherte Änderungen" -} \ No newline at end of file + "logOut": "Abmelden", + "addAttachments": { + "error": { + "failed": "An error occurred while adding attachments to the PDF." + } + }, + "autoRename": { + "description": "This tool will automatically rename PDF files based on their content. It analyzes the document to find the most suitable title from the text." + }, + "customPosition": "Custom Position", + "details": "Details", + "downloadUnavailable": "Download unavailable for this item", + "invalidUndoData": "Cannot undo: invalid operation data", + "margin": { + "large": "Large", + "medium": "Medium", + "small": "Small", + "xLarge": "Extra Large" + }, + "noFilesToUndo": "Cannot undo: no files were processed in the last operation", + "noOperationToUndo": "No operation to undo", + "noValidFiles": "No valid files to process", + "operationCancelled": "Operation cancelled", + "pageEdit": { + "deselectAll": "Select None", + "selectAll": "Select All" + }, + "quickPosition": "Quick Position", + "reorganizePages": { + "error": { + "failed": "Failed to reorganize pages" + }, + "results": { + "title": "Pages Reorganized" + }, + "settings": { + "title": "Settings" + }, + "submit": "Reorganize Pages" + }, + "replace-color": { + "options": { + "fill": "Fill colour", + "gradient": "Gradient" + }, + "previewOverlayOpacity": "Preview overlay opacity", + "previewOverlayTransparency": "Preview overlay transparency", + "previewOverlayVisibility": "Show preview overlay", + "selectText": { + "1": "Ersetzen oder Invertieren von Farboptionen", + "2": "Standard(Standardfarben mit hohem Kontrast)", + "3": "Benutzerdefiniert(Benutzerdefinierte Farben)", + "4": "Vollinvertierung(Invertierung aller Farben)", + "5": "Farboptionen mit hohem Kontrast", + "6": "Weißer Text auf schwarzem Hintergrund", + "7": "Schwarzer Text auf weißem Hintergrund", + "8": "Gelber Text auf schwarzem Hintergrund", + "9": "GrÃŧner Text auf schwarzem Hintergrund", + "10": "Textfarbe auswählen", + "11": "Hintergrundfarbe auswählen", + "12": "Choose start colour", + "13": "Choose end colour" + }, + "submit": "Ersetzen", + "title": "Farbe Ersetzen-Invertieren", + "header": "Farb-PDF Ersetzen-Invertieren" + }, + "size": "Size", + "submit": "Submit", + "success": "Success", + "tools": { + "noSearchResults": "No tools found", + "noTools": "No tools available" + }, + "undoDataMismatch": "Cannot undo: operation data is corrupted", + "undoFailed": "Failed to undo operation", + "undoQuotaError": "Cannot undo: insufficient storage space", + "undoStorageError": "Undo completed but some files could not be saved to storage", + "undoSuccess": "Operation undone successfully", + "unsupported": "Unsupported", + "onboarding": { + "welcomeModal": { + "title": "Welcome to Stirling PDF!", + "description": "Would you like to take a quick 1-minute tour to learn the key features and how to get started?", + "helpHint": "You can always access this tour later from the Help button in the bottom left.", + "startTour": "Start Tour", + "maybeLater": "Maybe Later", + "dontShowAgain": "Don't Show Again" + }, + "allTools": "This is the All Tools panel, where you can browse and select from all available PDF tools.", + "selectCropTool": "Let's select the Crop tool to demonstrate how to use one of the tools.", + "toolInterface": "This is the Crop tool interface. As you can see, there's not much there because we haven't added any PDF files to work with yet.", + "filesButton": "The Files button on the Quick Access bar allows you to upload PDFs to use the tools on.", + "fileSources": "You can upload new files or access recent files from here. For the tour, we'll just use a sample file.", + "workbench": "This is the Workbench - the main area where you view and edit your PDFs.", + "viewSwitcher": "Use these controls to select how you want to view your PDFs.", + "viewer": "The Viewer lets you read and annotate your PDFs.", + "pageEditor": "The Page Editor allows you to do various operations on the pages within your PDFs, such as reordering, rotating and deleting.", + "activeFiles": "The Active Files view shows all of the PDFs you have loaded into the tool, and allows you to select which ones to process.", + "fileCheckbox": "Clicking one of the files selects it for processing. You can select multiple files for batch operations.", + "selectControls": "The Right Rail contains buttons to quickly select/deselect all of your active PDFs, along with buttons to change the app's theme or language.", + "cropSettings": "Now that we've selected the file we want crop, we can configure the Crop tool to choose the area that we want to crop the PDF to.", + "runButton": "Once the tool has been configured, this button allows you to run the tool on all the selected PDFs.", + "results": "After the tool has finished running, the Review step will show a preview of the results in this panel, and allow you to undo the operation or download the file. ", + "fileReplacement": "The modified file will replace the original file in the Workbench automatically, allowing you to easily run it through more tools.", + "pinButton": "You can use the Pin button if you'd rather your files stay active after running tools on them.", + "wrapUp": "You're all set! You've learnt about the main areas of the app and how to use them. Click the Help button whenever you like to see this tour again.", + "previous": "Previous", + "next": "Next", + "finish": "Finish", + "startTour": "Start Tour", + "startTourDescription": "Take a guided tour of Stirling PDF's key features" + }, + "workspace": { + "title": "Workspace", + "people": { + "title": "People", + "description": "Manage workspace members and their permissions", + "loading": "Loading people...", + "searchMembers": "Search members...", + "addMembers": "Add Members", + "inviteMembers": { + "label": "Invite Members", + "subtitle": "Type or paste in emails below, separated by commas. Your workspace will be billed by members." + }, + "user": "User", + "role": "Role", + "team": "Team", + "status": "Status", + "actions": "Actions", + "noMembersFound": "No members found", + "active": "Active", + "disabled": "Disabled", + "activeSession": "Active session", + "member": "Member", + "admin": "Admin", + "roleDescriptions": { + "admin": "Can manage settings and invite members, with full administrative access.", + "member": "Can view and edit shared files, but cannot manage workspace settings or members." + }, + "editRole": "Edit Role", + "enable": "Enable", + "disable": "Disable", + "deleteUser": "Delete User", + "deleteUserSuccess": "User deleted successfully", + "deleteUserError": "Failed to delete user", + "confirmDelete": "Are you sure you want to delete this user? This action cannot be undone.", + "addMember": { + "title": "Add Member", + "username": "Username (Email)", + "usernamePlaceholder": "user@example.com", + "password": "Password", + "passwordPlaceholder": "Enter password", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "forcePasswordChange": "Force password change on first login", + "cancel": "Cancel", + "submit": "Add Member", + "usernameRequired": "Username and password are required", + "passwordTooShort": "Password must be at least 6 characters", + "success": "User created successfully", + "error": "Failed to create user" + }, + "editMember": { + "title": "Edit Member", + "editing": "Editing:", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "cancel": "Cancel", + "submit": "Update Member", + "success": "User updated successfully", + "error": "Failed to update user" + }, + "toggleEnabled": { + "success": "User status updated successfully", + "error": "Failed to update user status" + }, + "delete": { + "success": "User deleted successfully", + "error": "Failed to delete user" + }, + "emailInvite": { + "tab": "Email Invite", + "description": "Type or paste in emails below, separated by commas. Users will receive login credentials via email.", + "emails": "Email Addresses", + "emailsPlaceholder": "user1@example.com, user2@example.com", + "emailsRequired": "At least one email address is required", + "submit": "Send Invites", + "success": "user(s) invited successfully", + "partialSuccess": "Some invites failed", + "allFailed": "Failed to invite users", + "error": "Failed to send invites" + }, + "directInvite": { + "tab": "Direct Create" + }, + "inviteLinkTab": { + "tab": "Invite Link" + }, + "inviteLink": { + "description": "Generate a secure link that allows the user to set their own password", + "email": "Email Address", + "emailPlaceholder": "user@example.com (optional)", + "emailDescription": "Optional - leave blank for a general invite link that can be used by anyone", + "emailRequired": "Email address is required", + "emailOptional": "Optional - leave blank for a general invite link", + "emailRequiredForSend": "Email address is required to send email notification", + "expiryHours": "Expiry Hours", + "expiryDescription": "How many hours until the link expires", + "sendEmail": "Send invite link via email", + "sendEmailDescription": "If enabled, the invite link will be sent to the specified email address", + "smtpRequired": "SMTP not configured", + "generate": "Generate Link", + "generated": "Invite Link Generated", + "copied": "Link copied to clipboard", + "success": "Invite link generated successfully", + "successWithEmail": "Invite link generated and sent via email", + "emailFailed": "Invite link generated, but email failed", + "emailFailedDetails": "Error: {0}. Please share the invite link manually.", + "error": "Failed to generate invite link", + "submit": "Generate Invite Link" + }, + "inviteMode": { + "username": "Username", + "email": "Email", + "link": "Link", + "emailDisabled": "Email invites require SMTP configuration and mail.enableInvites=true in settings" + }, + "license": { + "users": "users", + "availableSlots": "Available Slots", + "grandfathered": "Grandfathered", + "grandfatheredShort": "{{count}} grandfathered", + "fromLicense": "from license", + "slotsAvailable": "{{count}} user slot(s) available", + "noSlotsAvailable": "No slots available", + "currentUsage": "Currently using {{current}} of {{max}} user licences" + } + }, + "teams": { + "title": "Teams", + "description": "Manage teams and organize workspace members", + "loading": "Loading teams...", + "loadingDetails": "Loading team details...", + "createNewTeam": "Create New Team", + "teamName": "Team Name", + "totalMembers": "Total Members", + "actions": "Actions", + "noTeamsFound": "No teams found", + "noMembers": "No members in this team", + "system": "System", + "addMember": "Add Member", + "viewTeam": "View Team", + "removeMember": "Remove from team", + "cannotRemoveFromSystemTeam": "Cannot remove from system team", + "renameTeamLabel": "Rename Team", + "deleteTeamLabel": "Delete Team", + "cannotDeleteInternal": "Cannot delete the Internal team", + "confirmDelete": "Are you sure you want to delete this team? This team must be empty to delete.", + "confirmRemove": "Remove user from this team?", + "cannotRenameInternal": "Cannot rename the Internal team", + "cannotAddToInternal": "Cannot add members to the Internal team", + "teamNotFound": "Team not found", + "backToTeams": "Back to Teams", + "memberCount": "{{count}} members", + "removeMemberSuccess": "User removed from team", + "removeMemberError": "Failed to remove user from team", + "createTeam": { + "title": "Create New Team", + "teamName": "Team Name", + "teamNamePlaceholder": "Enter team name", + "cancel": "Cancel", + "submit": "Create Team", + "nameRequired": "Team name is required", + "success": "Team created successfully", + "error": "Failed to create team" + }, + "renameTeam": { + "title": "Rename Team", + "renaming": "Renaming:", + "newTeamName": "New Team Name", + "newTeamNamePlaceholder": "Enter new team name", + "cancel": "Cancel", + "submit": "Rename Team", + "nameRequired": "Team name is required", + "success": "Team renamed successfully", + "error": "Failed to rename team" + }, + "deleteTeam": { + "success": "Team deleted successfully", + "error": "Failed to delete team. Make sure the team is empty.", + "teamMustBeEmpty": "Team must be empty before deletion" + }, + "addMemberToTeam": { + "title": "Add Member to Team", + "addingTo": "Adding to", + "selectUser": "Select User", + "selectUserPlaceholder": "Choose a user", + "selectUserRequired": "Please select a user", + "currentlyIn": "currently in", + "willBeMoved": "Note: This user will be moved from their current team to this team.", + "cancel": "Cancel", + "submit": "Add Member", + "userRequired": "Please select a user", + "success": "Member added to team successfully", + "error": "Failed to add member to team" + }, + "changeTeam": { + "label": "Change Team", + "title": "Change Team", + "changing": "Moving", + "selectTeam": "Select Team", + "selectTeamPlaceholder": "Choose a team", + "selectTeamRequired": "Please select a team", + "success": "Team changed successfully", + "error": "Failed to change team", + "submit": "Change Team" + } + } + }, + "plan": { + "currency": "Currency", + "popular": "Popular", + "current": "Current Plan", + "upgrade": "Upgrade", + "contact": "Contact Us", + "customPricing": "Custom", + "showComparison": "Compare All Features", + "hideComparison": "Hide Feature Comparison", + "featureComparison": "Feature Comparison", + "activePlan": { + "title": "Active Plan", + "subtitle": "Your current subscription details" + }, + "availablePlans": { + "title": "Available Plans", + "subtitle": "Choose the plan that fits your needs" + }, + "static": { + "title": "Billing Information", + "message": "Online billing is not currently configured. To upgrade your plan or manage subscriptions, please contact us directly.", + "contactSales": "Contact Sales", + "contactToUpgrade": "Contact us to upgrade or customize your plan", + "maxUsers": "Max Users", + "upTo": "Up to" + }, + "period": { + "month": "month" + }, + "free": { + "name": "Free", + "highlight1": "Limited Tool Usage Per week", + "highlight2": "Access to all tools", + "highlight3": "Community support" + }, + "pro": { + "name": "Pro", + "highlight1": "Unlimited Tool Usage", + "highlight2": "Advanced PDF tools", + "highlight3": "No watermarks" + }, + "enterprise": { + "name": "Enterprise", + "highlight1": "Custom pricing", + "highlight2": "Dedicated support", + "highlight3": "Latest features" + }, + "feature": { + "title": "Feature", + "pdfTools": "Basic PDF Tools", + "fileSize": "File Size Limit", + "automation": "Automate tool workflows", + "api": "API Access", + "priority": "Priority Support", + "customPricing": "Custom Pricing" + } + }, + "subscription": { + "status": { + "active": "Active", + "pastDue": "Past Due", + "canceled": "Canceled", + "incomplete": "Incomplete", + "trialing": "Trial", + "none": "No Subscription" + }, + "renewsOn": "Renews on {{date}}", + "cancelsOn": "Cancels on {{date}}" + }, + "billing": { + "manageBilling": "Manage Billing", + "portal": { + "error": "Failed to open billing portal" + } + }, + "payment": { + "preparing": "Preparing your checkout...", + "upgradeTitle": "Upgrade to {{planName}}", + "success": "Payment Successful!", + "successMessage": "Your subscription has been activated successfully. You will receive a confirmation email shortly.", + "autoClose": "This window will close automatically...", + "error": "Payment Error" + }, + "firstLogin": { + "title": "First Time Login", + "welcomeTitle": "Welcome!", + "welcomeMessage": "For security reasons, you must change your password on your first login.", + "loggedInAs": "Logged in as", + "error": "Error", + "currentPassword": "Current Password", + "enterCurrentPassword": "Enter your current password", + "newPassword": "New Password", + "enterNewPassword": "Enter new password (min 8 characters)", + "confirmPassword": "Confirm New Password", + "reEnterNewPassword": "Re-enter new password", + "changePassword": "Change Password", + "allFieldsRequired": "All fields are required", + "passwordsDoNotMatch": "New passwords do not match", + "passwordTooShort": "Password must be at least 8 characters", + "passwordMustBeDifferent": "New password must be different from current password", + "passwordChangedSuccess": "Password changed successfully! Please log in again.", + "passwordChangeFailed": "Failed to change password. Please check your current password." + }, + "invite": { + "welcome": "Welcome to Stirling PDF", + "invalidToken": "Invalid invitation link", + "validationError": "Failed to validate invitation link", + "passwordRequired": "Password is required", + "passwordTooShort": "Password must be at least 6 characters", + "passwordMismatch": "Passwords do not match", + "acceptError": "Failed to create account", + "validating": "Validating invitation...", + "invalidInvitation": "Invalid Invitation", + "goToLogin": "Go to Login", + "welcomeTitle": "You've been invited!", + "welcomeSubtitle": "Complete your account setup to get started", + "accountFor": "Creating account for", + "linkExpires": "Link expires", + "email": "Email address", + "emailPlaceholder": "Enter your email address", + "emailRequired": "Email address is required", + "invalidEmail": "Invalid email address", + "choosePassword": "Choose a password", + "passwordPlaceholder": "Enter your password", + "confirmPassword": "Confirm password", + "confirmPasswordPlaceholder": "Re-enter your password", + "createAccount": "Create Account", + "creating": "Creating Account...", + "alreadyHaveAccount": "Already have an account?", + "signIn": "Sign in" + }, + "audit": { + "error": { + "title": "Error loading audit system" + }, + "notAvailable": "Audit system not available", + "notAvailableMessage": "The audit system is not configured or not available.", + "disabled": "Audit logging is disabled", + "disabledMessage": "Enable audit logging in your application configuration to track system events.", + "systemStatus": { + "title": "System Status", + "status": "Audit Logging", + "enabled": "Enabled", + "disabled": "Disabled", + "level": "Audit Level", + "retention": "Retention Period", + "days": "days", + "totalEvents": "Total Events" + }, + "tabs": { + "dashboard": "Dashboard", + "events": "Audit Events", + "export": "Export" + }, + "charts": { + "title": "Audit Dashboard", + "error": "Error loading charts", + "day": "Day", + "week": "Week", + "month": "Month", + "byType": "Events by Type", + "byUser": "Events by User", + "overTime": "Events Over Time" + }, + "events": { + "title": "Audit Events", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "error": "Error loading events", + "noEvents": "No events found", + "timestamp": "Timestamp", + "type": "Type", + "user": "User", + "ipAddress": "IP Address", + "actions": "Actions", + "viewDetails": "View Details", + "eventDetails": "Event Details", + "details": "Details" + }, + "export": { + "title": "Export Audit Data", + "description": "Export audit events to CSV or JSON format. Use filters to limit the exported data.", + "format": "Export Format", + "filters": "Filters (Optional)", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "exportButton": "Export Data", + "error": "Failed to export data" + } + }, + "usage": { + "noData": "No data available", + "error": "Error loading usage statistics", + "noDataMessage": "No usage statistics are currently available.", + "controls": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All", + "refresh": "Refresh", + "dataTypeLabel": "Data Type:", + "dataType": { + "all": "All", + "api": "API", + "ui": "UI" + } + }, + "showing": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All" + }, + "stats": { + "totalEndpoints": "Total Endpoints", + "totalVisits": "Total Visits", + "showing": "Showing", + "selectedVisits": "Selected Visits" + }, + "chart": { + "title": "Endpoint Usage Chart" + }, + "table": { + "title": "Detailed Statistics", + "endpoint": "Endpoint", + "visits": "Visits", + "percentage": "Percentage", + "noData": "No data available" + } + }, + "backendHealth": { + "checking": "Checking backend status...", + "online": "Backend Online", + "offline": "Backend Offline" + }, + "replaceColorPdf": { + "tags": "Farbe ersetzen,Seiteneinstellungen,Backend,Serverseite" + } +} diff --git a/frontend/public/locales/el-GR/translation.json b/frontend/public/locales/el-GR/translation.json index a98d3fff7..2af4b53e5 100644 --- a/frontend/public/locales/el-GR/translation.json +++ b/frontend/public/locales/el-GR/translation.json @@ -1,4 +1,40 @@ { + "toolPanel": { + "modePrompt": { + "title": "Choose how you browse tools", + "description": "Preview both layouts and decide how you want to explore Stirling PDF tools.", + "sidebarTitle": "Sidebar mode", + "sidebarDescription": "Keep tools alongside your workspace for quick switching.", + "recommended": "Recommended", + "chooseSidebar": "Use sidebar mode", + "fullscreenTitle": "Fullscreen mode - (legacy)", + "fullscreenDescription": "Browse every tool in a catalogue that covers the workspace until you pick one.", + "chooseFullscreen": "Use fullscreen mode", + "dismiss": "Maybe later" + }, + "fullscreen": { + "showDetails": "Show Details", + "comingSoon": "Coming soon:", + "favorite": "Add to favourites", + "favorites": "Favourites", + "heading": "All tools (fullscreen view)", + "noResults": "Try adjusting your search or toggle descriptions to find what you need.", + "recommended": "Recommended", + "unfavorite": "Remove from favourites" + }, + "placeholder": "Choose a tool to get started", + "toggle": { + "fullscreen": "Switch to fullscreen mode", + "sidebar": "Switch to sidebar mode" + } + }, + "unsavedChanges": "You have unsaved changes to your PDF.", + "areYouSure": "Are you sure you want to leave?", + "unsavedChangesTitle": "Unsaved Changes", + "keepWorking": "Keep Working", + "discardChanges": "Discard & Leave", + "applyAndContinue": "Save & Leave", + "exportAndContinue": "Export & Continue", "language": { "direction": "ltr" }, @@ -18,8 +54,26 @@ "customTextDesc": "Î ĪÎŋĪƒÎąĪÎŧÎŋ΃ÎŧέÎŊÎŋ ÎēÎĩίÎŧÎĩÎŊÎŋ", "numberPagesDesc": "ΠÎŋΚÎĩĪ‚ ΃ÎĩÎģίδÎĩĪ‚ ÎŊÎą ÎąĪÎšÎ¸ÎŧΡθÎŋĪÎŊ, ΀΁ÎŋÎĩĪ€ÎšÎģÎŋÎŗÎŽ 'all', Î´Î­Ī‡ÎĩĪ„ÎąÎš ÎĩĪ€Î¯ĪƒÎˇĪ‚ 1-5 ÎŽ 2,5,9 ÎēÎģĪ€", "customNumberDesc": "Î ĪÎŋÎĩĪ€ÎšÎģÎŋÎŗÎŽ ΃Îĩ {n}, Î´Î­Ī‡ÎĩĪ„ÎąÎš ÎĩĪ€Î¯ĪƒÎˇĪ‚ 'ÎŖÎĩÎģÎ¯Î´Îą {n} ÎąĪ€ĪŒ {total}', 'ΚÎĩίÎŧÎĩÎŊÎŋ-{n}', '{filename}-{n}", - "submit": "Î ĪÎŋĪƒÎ¸ÎŽÎēΡ ÎąĪÎšÎ¸ÎŧĪŽÎŊ ΃ÎĩÎģÎ¯Î´Ī‰ÎŊ" + "submit": "Î ĪÎŋĪƒÎ¸ÎŽÎēΡ ÎąĪÎšÎ¸ÎŧĪŽÎŊ ΃ÎĩÎģÎ¯Î´Ī‰ÎŊ", + "configuration": "Configuration", + "customize": "Customize Appearance", + "pagesAndStarting": "Pages & Starting Number", + "positionAndPages": "Position & Pages", + "error": { + "failed": "Add page numbers operation failed" + }, + "results": { + "title": "Page Number Results" + }, + "preview": "Position Selection", + "previewDisclaimer": "Preview is approximate. Final output may vary due to PDF font metrics." }, + "pageSelectionPrompt": "Î ĪÎŋĪƒÎąĪÎŧÎŋ΃ÎŧέÎŊΡ ÎĩĪ€ÎšÎģÎŋÎŗÎŽ ΃ÎĩÎģÎ¯Î´Ī‰ÎŊ (Î•ÎšĪƒÎŦÎŗÎĩĪ„Îĩ ÎŧΚι ÎģÎ¯ĪƒĪ„Îą ÎąĪÎšÎ¸ÎŧĪŽÎŊ ΃ÎĩÎģÎ¯Î´Ī‰ÎŊ Ī‡Ī‰ĪÎšĪƒÎŧέÎŊΡ ÎŧÎĩ ÎēΌÎŧÎŧÎąĪ„Îą 1,5,6 ÎŽ ĪƒĪ…ÎŊÎąĪĪ„ÎŽĪƒÎĩÎšĪ‚ ĪŒĪ€Ī‰Ī‚ 2n+1):", + "startingNumberTooltip": "The first number to display. Subsequent pages will increment from this number.", + "marginTooltip": "Distance between the page number and the edge of the page.", + "fontSizeTooltip": "Size of the page number text in points. Larger numbers create bigger text.", + "fontTypeTooltip": "Font family for the page numbers. Choose based on your document style.", + "customTextTooltip": "Optional custom format for page numbers. Use {n} as placeholder for the number. Example: \"Page {n}\" will show \"Page 1\", \"Page 2\", etc.", "pdfPrompt": "Î•Ī€ÎšÎģÎ­ÎžĪ„Îĩ PDF(s)", "multiPdfPrompt": "Î•Ī€ÎšÎģÎ­ÎžĪ„Îĩ PDFs (2+)", "multiPdfDropPrompt": "Î•Ī€ÎšÎģÎ­ÎžĪ„Îĩ (ÎŽ ĪƒĪĪÎĩĪ„Îĩ & ÎąĪ†ÎŽĪƒĪ„Îĩ) ΌÎģÎą Ī„Îą PDF Ī€ÎŋĪ… ·΁ÎĩΚÎŦÎļÎĩĪƒĪ„Îĩ", @@ -30,15 +84,41 @@ "uploadLimitExceededPlural": "are too large. Maximum allowed size is", "processTimeWarning": "Î ĪÎŋÎĩΚδÎŋĪ€ÎŋÎ¯ÎˇĪƒÎˇ: Î‘Ī…Ī„ÎŽ Ρ δΚιδΚÎēÎąĪƒÎ¯Îą ÎŧĪ€Îŋ΁Îĩί ÎŊÎą Î´ÎšÎąĪÎēÎ­ĪƒÎĩΚ Î­Ī‰Ī‚ έÎŊÎą ÎģÎĩĪ€Ī„ĪŒ ÎąÎŊÎŦÎģÎŋÎŗÎą ÎŧÎĩ Ī„Îŋ ÎŧÎ­ÎŗÎĩθÎŋĪ‚ Ī„ÎŋĪ… ÎąĪĪ‡ÎĩίÎŋĪ…", "pageOrderPrompt": "Î ĪÎŋĪƒÎąĪÎŧÎŋ΃ÎŧέÎŊΡ ΃ÎĩÎšĪÎŦ ΃ÎĩÎģÎ¯Î´Ī‰ÎŊ (Î•ÎšĪƒÎŦÎŗÎĩĪ„Îĩ ÎŧΚι ÎģÎ¯ĪƒĪ„Îą ÎąĪÎšÎ¸ÎŧĪŽÎŊ ΃ÎĩÎģÎ¯Î´Ī‰ÎŊ Ī‡Ī‰ĪÎšĪƒÎŧέÎŊΡ ÎŧÎĩ ÎēΌÎŧÎŧÎąĪ„Îą ÎŽ ĪƒĪ…ÎŊÎąĪĪ„ÎŽĪƒÎĩÎšĪ‚ ĪŒĪ€Ī‰Ī‚ 2n+1):", - "pageSelectionPrompt": "Î ĪÎŋĪƒÎąĪÎŧÎŋ΃ÎŧέÎŊΡ ÎĩĪ€ÎšÎģÎŋÎŗÎŽ ΃ÎĩÎģÎ¯Î´Ī‰ÎŊ (Î•ÎšĪƒÎŦÎŗÎĩĪ„Îĩ ÎŧΚι ÎģÎ¯ĪƒĪ„Îą ÎąĪÎšÎ¸ÎŧĪŽÎŊ ΃ÎĩÎģÎ¯Î´Ī‰ÎŊ Ī‡Ī‰ĪÎšĪƒÎŧέÎŊΡ ÎŧÎĩ ÎēΌÎŧÎŧÎąĪ„Îą 1,5,6 ÎŽ ĪƒĪ…ÎŊÎąĪĪ„ÎŽĪƒÎĩÎšĪ‚ ĪŒĪ€Ī‰Ī‚ 2n+1):", "goToPage": "ΜÎĩĪ„ÎŦÎ˛ÎąĪƒÎˇ", "true": "ΑÎģÎˇÎ¸Î­Ī‚", "false": "ΨÎĩĪ…Î´Î­Ī‚", "unknown": "Î†ÎŗÎŊĪ‰ĪƒĪ„Îŋ", + "app": { + "description": "The Free Adobe Acrobat alternative (10M+ Downloads)" + }, "save": "Î‘Ī€ÎŋθΎÎēÎĩĪ…ĪƒÎˇ", "saveToBrowser": "Î‘Ī€ÎŋθΎÎēÎĩĪ…ĪƒÎˇ ĪƒĪ„ÎŋÎŊ Ī€ÎĩĪÎšÎˇÎŗÎˇĪ„ÎŽ", + "download": "Î›ÎŽĪˆÎˇ", + "pin": "Pin File (keep active after tool run)", + "unpin": "Unpin File (replace after tool run)", + "undoOperationTooltip": "Click to undo the last operation and restore the original files", + "undo": "Undo", + "moreOptions": "More Options", + "editYourNewFiles": "Edit your new file(s)", "close": "ΚÎģÎĩÎ¯ĪƒÎšÎŧÎŋ", + "openInViewer": "Open in Viewer", + "confirmClose": "Confirm Close", + "confirmCloseMessage": "Are you sure you want to close this file?", + "confirmCloseCancel": "Cancel", + "confirmCloseConfirm": "Close File", + "fileSelected": "Selected: {{filename}}", + "chooseFile": "Choose File", "filesSelected": "ÎąĪĪ‡ÎĩÎ¯Îą ÎĩĪ€ÎšÎģÎĩÎŗÎŧέÎŊÎą", + "files": { + "title": "Files", + "upload": "Upload", + "uploadFiles": "Upload Files", + "addFiles": "Add files", + "selectFromWorkbench": "Select files from the workbench or ", + "selectMultipleFromWorkbench": "Select at least {{count}} files from the workbench or ", + "created": "Created", + "size": "File Size" + }, "noFavourites": "ΔÎĩÎŊ Î­Ī‡ÎŋĪ…ÎŊ ΀΁ÎŋĪƒĪ„ÎĩθÎĩί ÎąÎŗÎąĪ€ÎˇÎŧέÎŊÎą", "downloadComplete": "Η ÎģÎŽĪˆÎˇ ÎŋÎģÎŋÎēÎģÎˇĪĪŽÎ¸ÎˇÎēÎĩ", "bored": "Î’ÎąĪÎšÎ­ĪƒĪ„Îĩ Ī„ÎˇÎŊ ÎąÎŊÎąÎŧÎŋÎŊÎŽ;", @@ -56,7 +136,10 @@ }, "error": { "pdfPassword": "ΤÎŋ PDF Î­Ī‡ÎĩΚ ΀΁ÎŋĪƒĪ„ÎąĪƒÎ¯Îą ÎēĪ‰Î´ÎšÎēÎŋĪ ÎēιΚ ÎĩÎ¯Ī„Îĩ δÎĩÎŊ Î´ĪŒÎ¸ÎˇÎēÎĩ ÎēĪ‰Î´ÎšÎēĪŒĪ‚ ÎŽ ÎŽĪ„ÎąÎŊ ÎģÎąÎŊÎ¸ÎąĪƒÎŧέÎŊÎŋĪ‚", + "encryptedPdfMustRemovePassword": "This PDF is encrypted or password-protected. Please unlock it before converting to PDF/A.", + "incorrectPasswordProvided": "The PDF password is incorrect or not provided.", "_value": "ÎŖĪ†ÎŦÎģÎŧÎą", + "dismissAllErrors": "Dismiss All Errors", "sorry": "ÎŖĪ…ÎŗÎŗÎŊĪŽÎŧΡ ÎŗÎšÎą Ī„Îŋ Ī€ĪĪŒÎ˛ÎģΡÎŧÎą!", "needHelp": "Î§ĪÎĩΚÎŦÎļÎĩĪƒĪ„Îĩ βÎŋΎθÎĩΚι / Î’ĪÎŽÎēÎąĪ„Îĩ Ī€ĪĪŒÎ˛ÎģΡÎŧÎą;", "contactTip": "ΕÎŦÎŊ ÎĩΞιÎēÎŋÎģÎŋĪ…Î¸ÎĩÎ¯Ī„Îĩ ÎŊÎą ÎąÎŊĪ„ÎšÎŧÎĩĪ„Ī‰Ī€Î¯ÎļÎĩĪ„Îĩ ΀΁ÎŋβÎģÎŽÎŧÎąĪ„Îą, ÎŧΡ Î´ÎšĪƒĪ„ÎŦ΃ÎĩĪ„Îĩ ÎŊÎą ÎĩĪ€ÎšÎēÎŋΚÎŊΉÎŊÎŽĪƒÎĩĪ„Îĩ ÎŧÎąÎļί ÎŧÎąĪ‚ ÎŗÎšÎą βÎŋΎθÎĩΚι. ÎœĪ€Îŋ΁ÎĩÎ¯Ī„Îĩ ÎŊÎą Ī…Ī€ÎŋβÎŦÎģÎĩĪ„Îĩ έÎŊÎą ticket ĪƒĪ„Îˇ ΃ÎĩÎģÎ¯Î´Îą ÎŧÎąĪ‚ ĪƒĪ„Îŋ GitHub ÎŽ ÎŊÎą ÎĩĪ€ÎšÎēÎŋΚÎŊΉÎŊÎŽĪƒÎĩĪ„Îĩ ÎŧÎąÎļί ÎŧÎąĪ‚ ÎŧÎ­ĪƒĪ‰ Discord:", @@ -71,6 +154,10 @@ "githubSubmit": "GitHub - ÎĨĪ€ÎŋβÎŋÎģÎŽ ticket", "discordSubmit": "Discord - ÎĨĪ€ÎŋβÎŋÎģÎŽ ÎąÎšĪ„ÎŽÎŧÎąĪ„ÎŋĪ‚ Ī…Ī€ÎŋĪƒĪ„ÎŽĪÎšÎžÎˇĪ‚" }, + "warning": { + "tooltipTitle": "Warning" + }, + "edit": "Edit", "delete": "Î”ÎšÎąÎŗĪÎąĪ†ÎŽ", "username": "ΌÎŊÎŋÎŧÎą Ī‡ĪÎŽĪƒĪ„Îˇ", "password": "ÎšĪ‰Î´ÎšÎēĪŒĪ‚", @@ -82,6 +169,7 @@ "green": "Î ĪÎŦĪƒÎšÎŊÎŋ", "blue": "ÎœĪ€ÎģÎĩ", "custom": "Î ĪÎŋĪƒÎąĪÎŧÎŋÎŗÎŽ...", + "comingSoon": "Coming soon", "WorkInProgess": "Î•ĪÎŗÎąĪƒÎ¯Îą ΃Îĩ ÎĩΞέÎģΚΞΡ, ÎŧĪ€Îŋ΁Îĩί ÎŊÎą ÎŧΡÎŊ ÎģÎĩÎšĪ„ÎŋĪ…ĪÎŗÎĩί ÎŽ ÎŊÎą Î­Ī‡ÎĩΚ ĪƒĪ†ÎŦÎģÎŧÎąĪ„Îą, Ī€ÎąĪÎąÎēÎąÎģĪŽ ÎąÎŊÎąĪ†Î­ĪÎĩĪ„Îĩ Ī„Ī…Ī‡ĪŒÎŊ ΀΁ÎŋβÎģÎŽÎŧÎąĪ„Îą!", "poweredBy": "ΜÎĩ Ī„ÎˇÎŊ Ī…Ī€ÎŋĪƒĪ„ÎŽĪÎšÎžÎˇ Ī„ÎŋĪ…", "yes": "Ναι", @@ -115,12 +203,14 @@ "page": "ÎŖÎĩÎģÎ¯Î´Îą", "pages": "ÎŖÎĩÎģίδÎĩĪ‚", "loading": "ÎĻĪŒĪĪ„Ī‰ĪƒÎˇ...", + "review": "Review", "addToDoc": "Î ĪÎŋĪƒÎ¸ÎŽÎēΡ ĪƒĪ„Îŋ Î­ÎŗÎŗĪÎąĪ†Îŋ", "reset": "Î•Ī€ÎąÎŊÎąĪ†Îŋ΁ÎŦ", "apply": "Î•Ī†ÎąĪÎŧÎŋÎŗÎŽ", "noFileSelected": "No file selected. Please upload one.", "legal": { "privacy": "ΠÎŋÎģÎšĪ„ÎšÎēÎŽ ÎąĪ€ÎŋĪĪÎŽĪ„ÎŋĪ…", + "iAgreeToThe": "I agree to all of the", "terms": "ÎŒĪÎŋΚ ÎēιΚ ΀΁Îŋ΋΀ÎŋÎ¸Î­ĪƒÎĩÎšĪ‚", "accessibility": "Î ĪÎŋĪƒÎ˛ÎąĪƒÎšÎŧĪŒĪ„ÎˇĪ„Îą", "cookie": "ΠÎŋÎģÎšĪ„ÎšÎēÎŽ cookies", @@ -160,6 +250,7 @@ "title": "ΘέÎģÎĩĪ„Îĩ ÎŊÎą ÎēÎŦÎŊÎĩĪ„Îĩ Ī„Îŋ Stirling PDF ÎēÎąÎģĪĪ„Îĩ΁Îŋ;", "paragraph1": "ΤÎŋ Stirling PDF Î´ÎšÎąÎ¸Î­Ī„ÎĩΚ ΀΁ÎŋÎąÎšĪÎĩĪ„ÎšÎēÎŦ analytics ÎŗÎšÎą ÎŊÎą ÎŧÎąĪ‚ βÎŋÎˇÎ¸ÎŽĪƒÎĩΚ ÎŊÎą βÎĩÎģĪ„ÎšĪŽĪƒÎŋĪ…ÎŧÎĩ Ī„Îŋ ΀΁ÎŋΊΌÎŊ. ΔÎĩÎŊ Ī€ÎąĪÎąÎēÎŋÎģÎŋĪ…Î¸ÎŋĪÎŧÎĩ ΀΁ÎŋĪƒĪ‰Ī€ÎšÎēÎ­Ī‚ Ī€ÎģÎˇĪÎŋΆÎŋĪÎ¯ÎĩĪ‚ ÎŽ Ī€ÎĩĪÎšÎĩĪ‡ĪŒÎŧÎĩÎŊÎŋ ÎąĪĪ‡ÎĩÎ¯Ī‰ÎŊ.", "paragraph2": "Î ÎąĪÎąÎēÎąÎģÎŋĪÎŧÎĩ ΃ÎēÎĩΆ΄ÎĩÎ¯Ī„Îĩ ÎŊÎą ÎĩÎŊÎĩĪÎŗÎŋĪ€ÎŋÎšÎŽĪƒÎĩĪ„Îĩ Ī„Îą analytics ÎŗÎšÎą ÎŊÎą βÎŋÎˇÎ¸ÎŽĪƒÎĩĪ„Îĩ Ī„Îŋ Stirling-PDF ÎŊÎą ÎąÎŊÎąĪ€Ī„Ī…Ī‡Î¸Îĩί ÎēιΚ ÎŊÎą ÎŧÎąĪ‚ ÎĩĪ€ÎšĪ„ĪÎ­ĪˆÎĩĪ„Îĩ ÎŊÎą ÎēÎąĪ„ÎąÎŊÎŋÎŽĪƒÎŋĪ…ÎŧÎĩ ÎēÎąÎģĪĪ„ÎĩĪÎą Ī„ÎŋĪ…Ī‚ Ī‡ĪÎŽĪƒĪ„ÎĩĪ‚ ÎŧÎąĪ‚.", + "learnMore": "Learn more", "enable": "ΕÎŊÎĩĪÎŗÎŋĪ€ÎŋÎ¯ÎˇĪƒÎˇ analytics", "disable": "Î‘Ī€ÎĩÎŊÎĩĪÎŗÎŋĪ€ÎŋÎ¯ÎˇĪƒÎˇ analytics", "settings": "ÎœĪ€Îŋ΁ÎĩÎ¯Ī„Îĩ ÎŊÎą ÎąÎģÎģÎŦΞÎĩĪ„Îĩ Ī„ÎšĪ‚ ĪĪ…Î¸ÎŧÎ¯ĪƒÎĩÎšĪ‚ ÎŗÎšÎą Ī„Îą analytics ĪƒĪ„Îŋ ÎąĪĪ‡ÎĩίÎŋ config/settings.yml" @@ -203,6 +294,54 @@ "cacheInputs": { "name": "Î‘Ī€ÎŋθΎÎēÎĩĪ…ĪƒÎˇ ÎĩÎšĪƒĪŒÎ´Ī‰ÎŊ Ī†ĪŒĪÎŧÎąĪ‚", "help": "ΕÎŊÎĩĪÎŗÎŋĪ€ÎŋÎ¯ÎˇĪƒÎˇ ÎŗÎšÎą ÎąĪ€ÎŋθΎÎēÎĩĪ…ĪƒÎˇ ΀΁ÎŋÎˇÎŗÎŋĪÎŧÎĩÎŊΉÎŊ ÎĩÎšĪƒĪŒÎ´Ī‰ÎŊ ÎŗÎšÎą ÎŧÎĩÎģÎģÎŋÎŊĪ„ÎšÎēÎŽ Ī‡ĪÎŽĪƒÎˇ" + }, + "general": { + "title": "General", + "description": "Configure general application preferences.", + "account": "Account", + "accountDescription": "Manage your account settings", + "user": "User", + "signedInAs": "Signed in as", + "logout": "Log out", + "enableFeatures": { + "title": "For System Administrators", + "intro": "Enable user authentication, team management, and workspace features for your organization.", + "action": "Configure", + "and": "and", + "benefit": "Enables user roles, team collaboration, admin controls, and enterprise features.", + "learnMore": "Learn more in documentation", + "dismiss": "Dismiss" + }, + "autoUnzip": "Auto-unzip API responses", + "autoUnzipDescription": "Automatically extract files from ZIP responses", + "autoUnzipTooltip": "Automatically extract ZIP files returned from API operations. Disable to keep ZIP files intact. This does not affect automation workflows.", + "autoUnzipFileLimit": "Auto-unzip file limit", + "autoUnzipFileLimitDescription": "Maximum number of files to extract from ZIP", + "autoUnzipFileLimitTooltip": "Only unzip if the ZIP contains this many files or fewer. Set higher to extract larger ZIPs.", + "defaultToolPickerMode": "Default tool picker mode", + "defaultToolPickerModeDescription": "Choose whether the tool picker opens in fullscreen or sidebar by default", + "mode": { + "fullscreen": "Fullscreen", + "sidebar": "Sidebar" + } + }, + "hotkeys": { + "title": "Keyboard Shortcuts", + "description": "Hover a tool to see its shortcut or customise it below. Click \"Change shortcut\" and press a new key combination. Press Esc to cancel.", + "errorModifier": { + "mac": "Include ⌘ (Command), âŒĨ (Option), or another modifier in your shortcut.", + "windows": "Include Ctrl, Alt, or another modifier in your shortcut." + }, + "errorConflict": "Shortcut already used by {{tool}}.", + "none": "Not assigned", + "customBadge": "Custom", + "defaultLabel": "Default: {{shortcut}}", + "capturing": "Press keysâ€Ļ (Esc to cancel)", + "change": "Change shortcut", + "reset": "Reset", + "shortcut": "Shortcut", + "noShortcut": "No shortcut set", + "searchPlaceholder": "Search tools..." } }, "changeCreds": { @@ -274,8 +413,10 @@ "top20": "Top 20", "all": "All", "refresh": "Refresh", - "includeHomepage": "Include Homepage ('/')", - "includeLoginPage": "Include Login Page ('/login')", + "dataTypeLabel": "Data Type:", + "dataTypeAll": "All", + "dataTypeApi": "API", + "dataTypeUi": "UI", "totalEndpoints": "Total Endpoints", "totalVisits": "Total Visits", "showing": "Showing", @@ -290,7 +431,9 @@ "top": "Top", "numberOfVisits": "Number of Visits", "visitsTooltip": "Visits: {0} ({1}% of total)", - "retry": "Retry" + "retry": "Retry", + "includeHomepage": "Include Homepage ('/')", + "includeLoginPage": "Include Login Page ('/login')" }, "database": { "title": "Î•ÎšĪƒÎąÎŗĪ‰ÎŗÎŽ/Î•ÎžÎąÎŗĪ‰ÎŗÎŽ βÎŦĪƒÎˇĪ‚ δÎĩδÎŋÎŧέÎŊΉÎŊ", @@ -331,22 +474,310 @@ "alphabetical": "Alphabetical", "globalPopularity": "Global Popularity", "sortBy": "Sort by:", + "mobile": { + "brandAlt": "Stirling PDF logo", + "openFiles": "Open files", + "swipeHint": "Swipe left or right to switch views", + "tools": "Tools", + "toolsSlide": "Tool selection panel", + "viewSwitcher": "Switch workspace view", + "workbenchSlide": "Workspace panel", + "workspace": "Workspace" + }, "multiTool": { + "tags": "multiple,tools", "title": "ΠÎŋÎģĪ…ÎĩĪÎŗÎąÎģÎĩίÎŋ PDF", "desc": "ÎŖĪ…ÎŗĪ‡ĪŽÎŊÎĩĪ…ĪƒÎˇ, ΠÎĩĪÎšĪƒĪ„ĪÎŋĪ†ÎŽ, ΑÎŊιδΚÎŦĪ„ÎąÎžÎˇ, Î”ÎšÎąĪ‡Ī‰ĪÎšĪƒÎŧĪŒĪ‚ ÎēιΚ Î‘Ī†ÎąÎ¯ĪÎĩĪƒÎˇ ΃ÎĩÎģÎ¯Î´Ī‰ÎŊ" }, "merge": { + "tags": "combine,join,unite", "title": "ÎŖĪ…ÎŗĪ‡ĪŽÎŊÎĩĪ…ĪƒÎˇ", "desc": "Î•ĪÎēÎŋÎģΡ ĪƒĪ…ÎŗĪ‡ĪŽÎŊÎĩĪ…ĪƒÎˇ Ī€ÎŋÎģÎģĪŽÎŊ PDF ΃Îĩ έÎŊÎą." }, "split": { + "tags": "divide,separate,break", "title": "Î”ÎšÎąĪ‡Ī‰ĪÎšĪƒÎŧĪŒĪ‚", "desc": "Î”ÎšÎąĪ‡Ī‰ĪÎšĪƒÎŧĪŒĪ‚ PDF ΃Îĩ Ī€ÎŋÎģÎģÎąĪ€ÎģÎŦ Î­ÎŗÎŗĪÎąĪ†Îą" }, "rotate": { + "tags": "turn,flip,orient", "title": "ΠÎĩĪÎšĪƒĪ„ĪÎŋĪ†ÎŽ", "desc": "Î•ĪÎēÎŋÎģΡ Ī€ÎĩĪÎšĪƒĪ„ĪÎŋĪ†ÎŽ ΄ΉÎŊ PDF ĪƒÎąĪ‚." }, + "convert": { + "tags": "transform,change", + "title": "ΜÎĩĪ„ÎąĪ„ĪÎŋĪ€ÎŽ", + "desc": "Convert files between different formats" + }, + "pdfOrganiser": { + "tags": "organize,rearrange,reorder", + "title": "ÎŸĪÎŗÎŦÎŊĪ‰ĪƒÎˇ", + "desc": "Î‘Ī†ÎąÎ¯ĪÎĩĪƒÎˇ/ΑÎŊιδΚÎŦĪ„ÎąÎžÎˇ ΃ÎĩÎģÎ¯Î´Ī‰ÎŊ ΃Îĩ ÎŋĪ€ÎŋÎšÎąÎ´ÎŽĪ€ÎŋĪ„Îĩ ΃ÎĩÎšĪÎŦ" + }, + "addImage": { + "tags": "insert,embed,place", + "title": "Î ĪÎŋĪƒÎ¸ÎŽÎēΡ ÎĩΚÎēΌÎŊÎąĪ‚", + "desc": "Î ĪÎŋĪƒÎ¸ÎŽÎēΡ ÎĩΚÎēΌÎŊÎąĪ‚ ΃Îĩ ĪƒĪ…ÎŗÎēÎĩÎēĪÎšÎŧέÎŊΡ Î¸Î­ĪƒÎˇ ĪƒĪ„Îŋ PDF" + }, + "addAttachments": { + "tags": "embed,attach,include", + "title": "Add Attachments", + "desc": "Add or remove embedded files (attachments) to/from a PDF" + }, + "watermark": { + "tags": "stamp,mark,overlay", + "title": "Î ĪÎŋĪƒÎ¸ÎŽÎēΡ Ī…Î´ÎąĪ„ÎŋÎŗĪÎąĪ†ÎŽÎŧÎąĪ„ÎŋĪ‚", + "desc": "Î ĪÎŋĪƒÎ¸ÎŽÎēΡ ΀΁ÎŋĪƒÎąĪÎŧÎŋ΃ÎŧέÎŊÎŋĪ… Ī…Î´ÎąĪ„ÎŋÎŗĪÎąĪ†ÎŽÎŧÎąĪ„ÎŋĪ‚ ĪƒĪ„Îŋ Î­ÎŗÎŗĪÎąĪ†Îŋ PDF." + }, + "removePassword": { + "tags": "unlock", + "title": "Î‘Ī†ÎąÎ¯ĪÎĩĪƒÎˇ ÎēĪ‰Î´ÎšÎēÎŋĪ", + "desc": "Î‘Ī†ÎąÎ¯ĪÎĩĪƒÎˇ ΀΁ÎŋĪƒĪ„ÎąĪƒÎ¯ÎąĪ‚ ÎēĪ‰Î´ÎšÎēÎŋĪ ÎąĪ€ĪŒ Ī„Îŋ Î­ÎŗÎŗĪÎąĪ†Îŋ PDF." + }, + "compress": { + "tags": "shrink,reduce,optimize", + "title": "ÎŖĪ…ÎŧĪ€Î¯ÎĩĪƒÎˇ", + "desc": "ÎŖĪ…ÎŧĪ€Î¯ÎĩĪƒÎˇ PDF ÎŗÎšÎą ÎŧÎĩÎ¯Ī‰ĪƒÎˇ Ī„ÎŋĪ… ÎŧÎĩÎŗÎ­Î¸ÎŋĪ…Ī‚ ÎąĪĪ‡ÎĩίÎŋĪ…." + }, + "unlockPDFForms": { + "tags": "unlock,enable,edit", + "title": "Unlock PDF Forms", + "desc": "Remove read-only property of form fields in a PDF document." + }, + "changeMetadata": { + "tags": "edit,modify,update", + "title": "ΑÎģÎģÎąÎŗÎŽ ÎŧÎĩĪ„ÎąÎ´ÎĩδÎŋÎŧέÎŊΉÎŊ", + "desc": "ΑÎģÎģÎąÎŗÎŽ/Î‘Ī†ÎąÎ¯ĪÎĩĪƒÎˇ/Î ĪÎŋĪƒÎ¸ÎŽÎēΡ ÎŧÎĩĪ„ÎąÎ´ÎĩδÎŋÎŧέÎŊΉÎŊ ÎąĪ€ĪŒ έÎŊÎą Î­ÎŗÎŗĪÎąĪ†Îŋ PDF" + }, + "ocr": { + "tags": "extract,scan", + "title": "OCR / ÎšÎąÎ¸ÎąĪÎšĪƒÎŧĪŒĪ‚ ĪƒÎąĪĪŽĪƒÎĩΉÎŊ", + "desc": "ÎšÎąÎ¸ÎąĪÎšĪƒÎŧĪŒĪ‚ ĪƒÎąĪĪŽĪƒÎĩΉÎŊ ÎēιΚ ÎąÎŊÎ¯Ī‡ÎŊÎĩĪ…ĪƒÎˇ ÎēÎĩΚÎŧέÎŊÎŋĪ… ÎąĪ€ĪŒ ÎĩΚÎēΌÎŊÎĩĪ‚ ÎŧÎ­ĪƒÎą ΃Îĩ PDF ÎēιΚ ÎĩĪ€ÎąÎŊÎąĪ€ĪÎŋĪƒÎ¸ÎŽÎēΡ Ή΂ ÎēÎĩίÎŧÎĩÎŊÎŋ." + }, + "extractImages": { + "tags": "pull,save,export", + "title": "Î•ÎžÎąÎŗĪ‰ÎŗÎŽ ÎĩΚÎēΌÎŊΉÎŊ", + "desc": "Î•ÎžÎąÎŗĪ‰ÎŗÎŽ ΌÎģΉÎŊ ΄ΉÎŊ ÎĩΚÎēΌÎŊΉÎŊ ÎąĪ€ĪŒ PDF ÎēιΚ ÎąĪ€ÎŋθΎÎēÎĩĪ…ĪƒÎˇ ΃Îĩ zip" + }, + "scannerImageSplit": { + "tags": "detect,split,photos", + "title": "Detect & Split Scanned Photos", + "desc": "Detect and split scanned photos into separate pages" + }, + "sign": { + "tags": "signature,autograph", + "title": "ÎĨĪ€ÎŋÎŗĪÎąĪ†ÎŽ", + "desc": "Î ĪÎŋĪƒÎ¸ÎŽÎēΡ Ī…Ī€ÎŋÎŗĪÎąĪ†ÎŽĪ‚ ΃Îĩ PDF ÎŧÎĩ ĪƒĪ‡ÎĩÎ´Î¯ÎąĪƒÎˇ, ÎēÎĩίÎŧÎĩÎŊÎŋ ÎŽ ÎĩΚÎēΌÎŊÎą" + }, + "flatten": { + "tags": "simplify,remove,interactive", + "title": "Î™ĪƒÎŋĪ€Î­Î´Ī‰ĪƒÎˇ", + "desc": "Î‘Ī†ÎąÎ¯ĪÎĩĪƒÎˇ ΌÎģΉÎŊ ΄ΉÎŊ Î´ÎšÎąÎ´ĪÎąĪƒĪ„ÎšÎēĪŽÎŊ ĪƒĪ„ÎŋÎšĪ‡ÎĩÎ¯Ī‰ÎŊ ÎēιΚ ΆÎŋ΁ÎŧĪŽÎŊ ÎąĪ€ĪŒ έÎŊÎą PDF" + }, + "certSign": { + "tags": "authenticate,PEM,P12,official,encrypt,sign,certificate,PKCS12,JKS,server,manual,auto", + "title": "ÎĨĪ€ÎŋÎŗĪÎąĪ†ÎŽ ÎŧÎĩ Ī€ÎšĪƒĪ„ÎŋĪ€ÎŋÎšÎˇĪ„ÎšÎēΌ", + "desc": "ÎĨĪ€ÎŋÎŗĪÎąĪ†ÎŽ PDF ÎŧÎĩ Ī€ÎšĪƒĪ„ÎŋĪ€ÎŋÎšÎˇĪ„ÎšÎēΌ/ÎēÎģÎĩΚδί (PEM/P12)" + }, + "repair": { + "tags": "fix,restore", + "title": "Î•Ī€ÎšÎ´ÎšĪŒĪÎ¸Ī‰ĪƒÎˇ", + "desc": "Î ĪÎŋĪƒĪ€ÎŦθÎĩΚι ÎĩĪ€ÎšÎ´ÎšĪŒĪÎ¸Ī‰ĪƒÎˇĪ‚ ÎēÎąĪ„ÎĩĪƒĪ„ĪÎąÎŧÎŧέÎŊÎŋĪ…/Ī‡ÎąÎģÎąĪƒÎŧέÎŊÎŋĪ… PDF" + }, + "removeBlanks": { + "tags": "delete,clean,empty", + "title": "Î‘Ī†ÎąÎ¯ĪÎĩĪƒÎˇ ÎēÎĩÎŊĪŽÎŊ ΃ÎĩÎģÎ¯Î´Ī‰ÎŊ", + "desc": "ΑÎŊÎ¯Ī‡ÎŊÎĩĪ…ĪƒÎˇ ÎēιΚ ÎąĪ†ÎąÎ¯ĪÎĩĪƒÎˇ ÎēÎĩÎŊĪŽÎŊ ΃ÎĩÎģÎ¯Î´Ī‰ÎŊ ÎąĪ€ĪŒ έÎŊÎą Î­ÎŗÎŗĪÎąĪ†Îŋ" + }, + "removeAnnotations": { + "tags": "delete,clean,strip", + "title": "Î‘Ī†ÎąÎ¯ĪÎĩĪƒÎˇ ĪƒĪ‡ÎŋÎģÎ¯Ī‰ÎŊ", + "desc": "Î‘Ī†ÎąÎ¯ĪÎĩĪƒÎˇ ΌÎģΉÎŊ ΄ΉÎŊ ĪƒĪ‡ÎŋÎģÎ¯Ī‰ÎŊ/ÎĩĪ€ÎšĪƒÎˇÎŧÎŦÎŊ΃ÎĩΉÎŊ ÎąĪ€ĪŒ έÎŊÎą PDF" + }, + "compare": { + "tags": "difference", + "title": "ÎŖĪÎŗÎēĪÎšĪƒÎˇ", + "desc": "ÎŖĪÎŗÎēĪÎšĪƒÎˇ ÎēιΚ ÎĩÎŧΆÎŦÎŊÎšĪƒÎˇ Î´ÎšÎąĪ†ÎŋĪĪŽÎŊ ÎŧÎĩĪ„ÎąÎžĪ 2 ÎĩÎŗÎŗĪÎŦΆΉÎŊ PDF" + }, + "removeCertSign": { + "tags": "remove,delete,unlock", + "title": "Î‘Ī†ÎąÎ¯ĪÎĩĪƒÎˇ Ī…Ī€ÎŋÎŗĪÎąĪ†ÎŽĪ‚ Ī€ÎšĪƒĪ„ÎŋĪ€ÎŋÎšÎˇĪ„ÎšÎēÎŋĪ", + "desc": "Î‘Ī†ÎąÎ¯ĪÎĩĪƒÎˇ Ī…Ī€ÎŋÎŗĪÎąĪ†ÎŽĪ‚ Ī€ÎšĪƒĪ„ÎŋĪ€ÎŋÎšÎˇĪ„ÎšÎēÎŋĪ ÎąĪ€ĪŒ PDF" + }, + "pageLayout": { + "tags": "layout,arrange,combine", + "title": "ΔιÎŦĪ„ÎąÎžÎˇ Ī€ÎŋÎģÎģÎąĪ€ÎģĪŽÎŊ ΃ÎĩÎģÎ¯Î´Ī‰ÎŊ", + "desc": "ÎŖĪ…ÎŗĪ‡ĪŽÎŊÎĩĪ…ĪƒÎˇ Ī€ÎŋÎģÎģÎąĪ€ÎģĪŽÎŊ ΃ÎĩÎģÎ¯Î´Ī‰ÎŊ ÎĩÎŊĪŒĪ‚ ÎĩÎŗÎŗĪÎŦΆÎŋĪ… PDF ΃Îĩ ÎŧÎ¯Îą ΃ÎĩÎģÎ¯Î´Îą" + }, + "bookletImposition": { + "tags": "booklet,print,binding", + "title": "Booklet Imposition", + "desc": "Create booklets with proper page ordering and multi-page layout for printing and binding" + }, + "scalePages": { + "tags": "resize,adjust,scale", + "title": "Î ĪÎŋĪƒÎąĪÎŧÎŋÎŗÎŽ ÎŧÎĩÎŗÎ­Î¸ÎŋĪ…Ī‚/ÎēÎģίÎŧÎąÎēÎąĪ‚ ΃ÎĩÎģÎ¯Î´ÎąĪ‚", + "desc": "ΑÎģÎģÎąÎŗÎŽ Ī„ÎŋĪ… ÎŧÎĩÎŗÎ­Î¸ÎŋĪ…Ī‚/ÎēÎģίÎŧÎąÎēÎąĪ‚ ÎŧÎšÎąĪ‚ ΃ÎĩÎģÎ¯Î´ÎąĪ‚ ÎēιΚ/ÎŽ Ī„ÎŋĪ… Ī€ÎĩĪÎšÎĩ·ÎŋÎŧέÎŊÎŋĪ… Ī„ÎˇĪ‚." + }, + "addPageNumbers": { + "tags": "number,pagination,count", + "title": "Î ĪÎŋĪƒÎ¸ÎŽÎēΡ ÎąĪÎšÎ¸ÎŧĪŽÎŊ ΃ÎĩÎģÎ¯Î´Ī‰ÎŊ", + "desc": "Î ĪÎŋĪƒÎ¸ÎŽÎēΡ ÎąĪÎšÎ¸ÎŧĪŽÎŊ ΃ÎĩÎģÎ¯Î´Ī‰ÎŊ ΃Îĩ ΌÎģÎŋ Ī„Îŋ Î­ÎŗÎŗĪÎąĪ†Îŋ ΃Îĩ ĪƒĪ…ÎŗÎēÎĩÎēĪÎšÎŧέÎŊΡ Î¸Î­ĪƒÎˇ" + }, + "autoRename": { + "tags": "auto-detect,header-based,organize,relabel", + "title": "Auto Rename PDF File", + "desc": "Auto renames a PDF file based on its detected header" + }, + "adjustContrast": { + "tags": "contrast,brightness,saturation", + "title": "Î ĪÎŋĪƒÎąĪÎŧÎŋÎŗÎŽ ·΁ΉÎŧÎŦ΄ΉÎŊ/ÎąÎŊĪ„Î¯Î¸ÎĩĪƒÎˇĪ‚", + "desc": "Î ĪÎŋĪƒÎąĪÎŧÎŋÎŗÎŽ ÎąÎŊĪ„Î¯Î¸ÎĩĪƒÎˇĪ‚, ÎēÎŋ΁Îĩ΃ÎŧÎŋĪ ÎēιΚ ΆΉ΄ÎĩΚÎŊĪŒĪ„ÎˇĪ„ÎąĪ‚ ÎĩÎŊĪŒĪ‚ PDF" + }, + "crop": { + "tags": "trim,cut,resize", + "title": "ΠÎĩĪÎšÎēÎŋĪ€ÎŽ PDF", + "desc": "ΠÎĩĪÎšÎēÎŋĪ€ÎŽ PDF ÎŗÎšÎą ÎŧÎĩÎ¯Ī‰ĪƒÎˇ Ī„ÎŋĪ… ÎŧÎĩÎŗÎ­Î¸ÎŋĪ…Ī‚ Ī„ÎŋĪ… (Î´ÎšÎąĪ„ÎˇĪÎĩί Ī„Îŋ ÎēÎĩίÎŧÎĩÎŊÎŋ!)" + }, + "autoSplitPDF": { + "tags": "auto,split,QR", + "title": "Î‘Ī…Ī„ĪŒÎŧÎąĪ„ÎŋĪ‚ Î´ÎšÎąĪ‡Ī‰ĪÎšĪƒÎŧĪŒĪ‚ ΃ÎĩÎģÎ¯Î´Ī‰ÎŊ", + "desc": "Î‘Ī…Ī„ĪŒÎŧÎąĪ„ÎŋĪ‚ Î´ÎšÎąĪ‡Ī‰ĪÎšĪƒÎŧĪŒĪ‚ ĪƒÎąĪĪ‰ÎŧέÎŊÎŋĪ… PDF ÎŧÎĩ Ī†Ī…ĪƒÎšÎēΌ ĪƒÎąĪĪ‰ÎŧέÎŊÎŋ Î´ÎšÎąĪ‡Ī‰ĪÎšĪƒĪ„ÎŽ ΃ÎĩÎģÎ¯Î´Ī‰ÎŊ QR Code" + }, + "sanitize": { + "tags": "clean,purge,remove", + "title": "Sanitise", + "desc": "Remove potentially harmful elements from PDF files" + }, + "getPdfInfo": { + "tags": "info,metadata,details", + "title": "Î›ÎŽĪˆÎˇ ΟΛΩΝ ΄ΉÎŊ Ī€ÎģÎˇĪÎŋΆÎŋĪÎšĪŽÎŊ Ī„ÎŋĪ… PDF", + "desc": "Î›ÎŽĪˆÎˇ ΌÎģΉÎŊ ΄ΉÎŊ Î´Ī…ÎŊÎąĪ„ĪŽÎŊ Ī€ÎģÎˇĪÎŋΆÎŋĪÎšĪŽÎŊ ÎŗÎšÎą Ī„Îą PDF" + }, + "pdfToSinglePage": { + "tags": "combine,merge,single", + "title": "ΕÎŊÎšÎąÎ¯Îą ÎŧÎĩÎŗÎŦÎģΡ ΃ÎĩÎģÎ¯Î´Îą", + "desc": "ÎŖĪ…ÎŗĪ‡ĪŽÎŊÎĩĪ…ĪƒÎˇ ΌÎģΉÎŊ ΄ΉÎŊ ΃ÎĩÎģÎ¯Î´Ī‰ÎŊ PDF ΃Îĩ ÎŧÎ¯Îą ÎŧÎĩÎŗÎŦÎģΡ ΃ÎĩÎģÎ¯Î´Îą" + }, + "showJS": { + "tags": "javascript,code,script", + "title": "ΕÎŧΆÎŦÎŊÎšĪƒÎˇ Javascript", + "desc": "ΑÎŊÎąÎļÎŽĪ„ÎˇĪƒÎˇ ÎēιΚ ÎĩÎŧΆÎŦÎŊÎšĪƒÎˇ ÎŋĪ€ÎŋΚÎŋĪ…Î´ÎŽĪ€ÎŋĪ„Îĩ JS ÎĩÎŊĪƒĪ‰ÎŧÎąĪ„Ī‰ÎŧέÎŊÎŋĪ… ΃Îĩ PDF" + }, + "redact": { + "tags": "censor,blackout,hide", + "title": "ΧÎĩÎšĪÎŋÎēίÎŊÎˇĪ„Îˇ ÎąĪ€ĪŒÎēĪĪ…ĪˆÎˇ", + "desc": "Î‘Ī€ĪŒÎēĪĪ…ĪˆÎˇ ΃Îĩ PDF βÎŦ΃ÎĩΚ ÎĩĪ€ÎšÎģÎĩÎŗÎŧέÎŊÎŋĪ… ÎēÎĩΚÎŧέÎŊÎŋĪ…, ĪƒĪ‡ÎĩÎ´ÎšÎąĪƒÎŧέÎŊΉÎŊ ĪƒĪ‡ÎˇÎŧÎŦ΄ΉÎŊ ÎēιΚ/ÎŽ ÎĩĪ€ÎšÎģÎĩÎŗÎŧέÎŊΉÎŊ ΃ÎĩÎģÎ¯Î´Ī‰ÎŊ" + }, + "splitBySections": { + "tags": "split,sections,divide", + "title": "Split PDF by Sections", + "desc": "Divide each page of a PDF into smaller horizontal and vertical sections" + }, + "addStamp": { + "tags": "stamp,mark,seal", + "title": "Add Stamp to PDF", + "desc": "Add text or add image stamps at set locations" + }, + "removeImage": { + "tags": "remove,delete,clean", + "title": "Î‘Ī†ÎąÎ¯ĪÎĩĪƒÎˇ ÎĩΚÎēΌÎŊÎąĪ‚", + "desc": "Î‘Ī†ÎąÎ¯ĪÎĩĪƒÎˇ ÎĩΚÎēΌÎŊÎąĪ‚ ÎąĪ€ĪŒ PDF ÎŗÎšÎą ÎŧÎĩÎ¯Ī‰ĪƒÎˇ ÎŧÎĩÎŗÎ­Î¸ÎŋĪ…Ī‚ ÎąĪĪ‡ÎĩίÎŋĪ…" + }, + "splitByChapters": { + "tags": "split,chapters,structure", + "title": "Î”ÎšÎąĪ‡Ī‰ĪÎšĪƒÎŧĪŒĪ‚ PDF ÎąÎŊÎŦ ÎēÎĩΆÎŦÎģιΚι", + "desc": "Î”ÎšÎąĪ‡Ī‰ĪÎšĪƒÎŧĪŒĪ‚ ÎĩÎŊĪŒĪ‚ PDF ΃Îĩ Ī€ÎŋÎģÎģÎąĪ€ÎģÎŦ ÎąĪĪ‡ÎĩÎ¯Îą βÎŦ΃ÎĩΚ Ī„ÎˇĪ‚ δÎŋÎŧÎŽĪ‚ ÎēÎĩĪ†ÎąÎģÎąÎ¯Ī‰ÎŊ." + }, + "validateSignature": { + "tags": "validate,verify,certificate", + "title": "Î•Ī€ÎšÎēĪĪĪ‰ĪƒÎˇ Ī…Ī€ÎŋÎŗĪÎąĪ†ÎŽĪ‚ PDF", + "desc": "Î•Ī€ÎąÎģΎθÎĩĪ…ĪƒÎˇ ĪˆÎˇĪ†ÎšÎąÎēĪŽÎŊ Ī…Ī€ÎŋÎŗĪÎąĪ†ĪŽÎŊ ÎēιΚ Ī€ÎšĪƒĪ„ÎŋĪ€ÎŋÎšÎˇĪ„ÎšÎēĪŽÎŊ ΃Îĩ Î­ÎŗÎŗĪÎąĪ†Îą PDF" + }, + "swagger": { + "tags": "API,documentation,test", + "title": "API Documentation", + "desc": "View API documentation and test endpoints" + }, + "scannerEffect": { + "tags": "scan,simulate,create", + "title": "Scanner Effect", + "desc": "Create a PDF that looks like it was scanned" + }, + "editTableOfContents": { + "tags": "bookmarks,contents,edit", + "title": "Edit Table of Contents", + "desc": "Add or edit bookmarks and table of contents in PDF documents" + }, + "manageCertificates": { + "tags": "certificates,import,export", + "title": "Manage Certificates", + "desc": "Import, export, or delete digital certificate files used for signing PDFs." + }, + "read": { + "tags": "view,open,display", + "title": "Read", + "desc": "View and annotate PDFs. Highlight text, draw, or insert comments for review and collaboration." + }, + "reorganizePages": { + "tags": "rearrange,reorder,organize", + "title": "Reorganize Pages", + "desc": "Rearrange, duplicate, or delete PDF pages with visual drag-and-drop control." + }, + "extractPages": { + "tags": "pull,select,copy", + "title": "Î•ÎžÎąÎŗĪ‰ÎŗÎŽ ΃ÎĩÎģÎ¯Î´Ī‰ÎŊ", + "desc": "Extract specific pages from a PDF document" + }, + "removePages": { + "tags": "delete,extract,exclude", + "title": "Î‘Ī†ÎąÎ¯ĪÎĩĪƒÎˇ", + "desc": "Î”ÎšÎąÎŗĪÎąĪ†ÎŽ ÎąÎŊÎĩĪ€ÎšÎ¸ĪÎŧÎˇĪ„Ī‰ÎŊ ΃ÎĩÎģÎ¯Î´Ī‰ÎŊ ÎąĪ€ĪŒ Ī„Îŋ Î­ÎŗÎŗĪÎąĪ†Îŋ PDF." + }, + "autoSizeSplitPDF": { + "tags": "auto,split,size", + "title": "Î‘Ī…Ī„ĪŒÎŧÎąĪ„ÎŋĪ‚ Î´ÎšÎąĪ‡Ī‰ĪÎšĪƒÎŧĪŒĪ‚ ÎąÎŊÎŦ ÎŧÎ­ÎŗÎĩθÎŋĪ‚/Ī€ÎģΎθÎŋĪ‚", + "desc": "Î”ÎšÎąĪ‡Ī‰ĪÎšĪƒÎŧĪŒĪ‚ ÎĩÎŊĪŒĪ‚ PDF ΃Îĩ Ī€ÎŋÎģÎģÎąĪ€ÎģÎŦ Î­ÎŗÎŗĪÎąĪ†Îą βÎŦ΃ÎĩΚ ÎŧÎĩÎŗÎ­Î¸ÎŋĪ…Ī‚, ÎąĪÎšÎ¸ÎŧÎŋĪ ΃ÎĩÎģÎ¯Î´Ī‰ÎŊ ÎŽ ÎąĪÎšÎ¸ÎŧÎŋĪ ÎĩÎŗÎŗĪÎŦΆΉÎŊ" + }, + "replaceColor": { + "title": "Replace & Invert Colour", + "desc": "Replace or invert colours in PDF documents" + }, + "devApi": { + "tags": "API,development,documentation", + "title": "API", + "desc": "Link to API documentation" + }, + "devFolderScanning": { + "tags": "automation,folder,scanning", + "title": "Automated Folder Scanning", + "desc": "Link to automated folder scanning guide" + }, + "devSsoGuide": { + "title": "SSO Guide", + "desc": "Link to SSO guide" + }, + "devAirgapped": { + "title": "Air-gapped Setup", + "desc": "Link to air-gapped setup guide" + }, + "addPassword": { + "title": "Î ĪÎŋĪƒÎ¸ÎŽÎēΡ ÎēĪ‰Î´ÎšÎēÎŋĪ", + "desc": "ÎšĪĪ…Ī€Ī„ÎŋÎŗĪÎŦĪ†ÎˇĪƒÎˇ Ī„ÎŋĪ… ÎĩÎŗÎŗĪÎŦΆÎŋĪ… PDF ÎŧÎĩ ÎēĪ‰Î´ÎšÎēΌ." + }, + "changePermissions": { + "title": "ΑÎģÎģÎąÎŗÎŽ δΚÎēÎąÎšĪ‰ÎŧÎŦ΄ΉÎŊ", + "desc": "Change document restrictions and permissions" + }, + "automate": { + "tags": "workflow,sequence,automation", + "title": "Automate", + "desc": "Build multi-step workflows by chaining together PDF actions. Ideal for recurring tasks." + }, + "overlay-pdfs": { + "desc": "Î•Ī€ÎšÎēÎŦÎģĪ…ĪˆÎˇ PDF Ī€ÎŦÎŊΉ ΃Îĩ ÎŦÎģÎģÎŋ PDF", + "title": "Î•Ī€ÎšÎēÎŦÎģĪ…ĪˆÎˇ PDF" + }, "imageToPDF": { "title": "ΕιÎēΌÎŊÎą ΃Îĩ PDF", "desc": "ΜÎĩĪ„ÎąĪ„ĪÎŋĪ€ÎŽ ÎĩΚÎēΌÎŊÎąĪ‚ (PNG, JPEG, GIF) ΃Îĩ PDF." @@ -355,18 +786,6 @@ "title": "PDF ΃Îĩ ÎĩΚÎēΌÎŊÎą", "desc": "ΜÎĩĪ„ÎąĪ„ĪÎŋĪ€ÎŽ PDF ΃Îĩ ÎĩΚÎēΌÎŊÎą. (PNG, JPEG, GIF)" }, - "pdfOrganiser": { - "title": "ÎŸĪÎŗÎŦÎŊĪ‰ĪƒÎˇ", - "desc": "Î‘Ī†ÎąÎ¯ĪÎĩĪƒÎˇ/ΑÎŊιδΚÎŦĪ„ÎąÎžÎˇ ΃ÎĩÎģÎ¯Î´Ī‰ÎŊ ΃Îĩ ÎŋĪ€ÎŋÎšÎąÎ´ÎŽĪ€ÎŋĪ„Îĩ ΃ÎĩÎšĪÎŦ" - }, - "addImage": { - "title": "Î ĪÎŋĪƒÎ¸ÎŽÎēΡ ÎĩΚÎēΌÎŊÎąĪ‚", - "desc": "Î ĪÎŋĪƒÎ¸ÎŽÎēΡ ÎĩΚÎēΌÎŊÎąĪ‚ ΃Îĩ ĪƒĪ…ÎŗÎēÎĩÎēĪÎšÎŧέÎŊΡ Î¸Î­ĪƒÎˇ ĪƒĪ„Îŋ PDF" - }, - "watermark": { - "title": "Î ĪÎŋĪƒÎ¸ÎŽÎēΡ Ī…Î´ÎąĪ„ÎŋÎŗĪÎąĪ†ÎŽÎŧÎąĪ„ÎŋĪ‚", - "desc": "Î ĪÎŋĪƒÎ¸ÎŽÎēΡ ΀΁ÎŋĪƒÎąĪÎŧÎŋ΃ÎŧέÎŊÎŋĪ… Ī…Î´ÎąĪ„ÎŋÎŗĪÎąĪ†ÎŽÎŧÎąĪ„ÎŋĪ‚ ĪƒĪ„Îŋ Î­ÎŗÎŗĪÎąĪ†Îŋ PDF." - }, "permissions": { "title": "ΑÎģÎģÎąÎŗÎŽ δΚÎēÎąÎšĪ‰ÎŧÎŦ΄ΉÎŊ", "desc": "ΑÎģÎģÎąÎŗÎŽ ΄ΉÎŊ δΚÎēÎąÎšĪ‰ÎŧÎŦ΄ΉÎŊ Ī„ÎŋĪ… ÎĩÎŗÎŗĪÎŦΆÎŋĪ… PDF" @@ -375,38 +794,10 @@ "title": "Î‘Ī†ÎąÎ¯ĪÎĩĪƒÎˇ", "desc": "Î”ÎšÎąÎŗĪÎąĪ†ÎŽ ÎąÎŊÎĩĪ€ÎšÎ¸ĪÎŧÎˇĪ„Ī‰ÎŊ ΃ÎĩÎģÎ¯Î´Ī‰ÎŊ ÎąĪ€ĪŒ Ī„Îŋ Î­ÎŗÎŗĪÎąĪ†Îŋ PDF." }, - "addPassword": { - "title": "Î ĪÎŋĪƒÎ¸ÎŽÎēΡ ÎēĪ‰Î´ÎšÎēÎŋĪ", - "desc": "ÎšĪĪ…Ī€Ī„ÎŋÎŗĪÎŦĪ†ÎˇĪƒÎˇ Ī„ÎŋĪ… ÎĩÎŗÎŗĪÎŦΆÎŋĪ… PDF ÎŧÎĩ ÎēĪ‰Î´ÎšÎēΌ." - }, - "removePassword": { - "title": "Î‘Ī†ÎąÎ¯ĪÎĩĪƒÎˇ ÎēĪ‰Î´ÎšÎēÎŋĪ", - "desc": "Î‘Ī†ÎąÎ¯ĪÎĩĪƒÎˇ ΀΁ÎŋĪƒĪ„ÎąĪƒÎ¯ÎąĪ‚ ÎēĪ‰Î´ÎšÎēÎŋĪ ÎąĪ€ĪŒ Ī„Îŋ Î­ÎŗÎŗĪÎąĪ†Îŋ PDF." - }, - "compress": { - "title": "ÎŖĪ…ÎŧĪ€Î¯ÎĩĪƒÎˇ", - "desc": "ÎŖĪ…ÎŧĪ€Î¯ÎĩĪƒÎˇ PDF ÎŗÎšÎą ÎŧÎĩÎ¯Ī‰ĪƒÎˇ Ī„ÎŋĪ… ÎŧÎĩÎŗÎ­Î¸ÎŋĪ…Ī‚ ÎąĪĪ‡ÎĩίÎŋĪ…." - }, - "unlockPDFForms": { - "title": "Unlock PDF Forms", - "desc": "Remove read-only property of form fields in a PDF document." - }, - "changeMetadata": { - "title": "ΑÎģÎģÎąÎŗÎŽ ÎŧÎĩĪ„ÎąÎ´ÎĩδÎŋÎŧέÎŊΉÎŊ", - "desc": "ΑÎģÎģÎąÎŗÎŽ/Î‘Ī†ÎąÎ¯ĪÎĩĪƒÎˇ/Î ĪÎŋĪƒÎ¸ÎŽÎēΡ ÎŧÎĩĪ„ÎąÎ´ÎĩδÎŋÎŧέÎŊΉÎŊ ÎąĪ€ĪŒ έÎŊÎą Î­ÎŗÎŗĪÎąĪ†Îŋ PDF" - }, "fileToPDF": { "title": "ΜÎĩĪ„ÎąĪ„ĪÎŋĪ€ÎŽ ÎąĪĪ‡ÎĩίÎŋĪ… ΃Îĩ PDF", "desc": "ΜÎĩĪ„ÎąĪ„ĪÎŋĪ€ÎŽ ĪƒĪ‡ÎĩÎ´ĪŒÎŊ ÎŋĪ€ÎŋΚÎŋĪ…Î´ÎŽĪ€ÎŋĪ„Îĩ ÎąĪĪ‡ÎĩίÎŋĪ… ΃Îĩ PDF (DOCX, PNG, XLS, PPT, TXT ÎēιΚ ÎŦÎģÎģÎą)" }, - "ocr": { - "title": "OCR / ÎšÎąÎ¸ÎąĪÎšĪƒÎŧĪŒĪ‚ ĪƒÎąĪĪŽĪƒÎĩΉÎŊ", - "desc": "ÎšÎąÎ¸ÎąĪÎšĪƒÎŧĪŒĪ‚ ĪƒÎąĪĪŽĪƒÎĩΉÎŊ ÎēιΚ ÎąÎŊÎ¯Ī‡ÎŊÎĩĪ…ĪƒÎˇ ÎēÎĩΚÎŧέÎŊÎŋĪ… ÎąĪ€ĪŒ ÎĩΚÎēΌÎŊÎĩĪ‚ ÎŧÎ­ĪƒÎą ΃Îĩ PDF ÎēιΚ ÎĩĪ€ÎąÎŊÎąĪ€ĪÎŋĪƒÎ¸ÎŽÎēΡ Ή΂ ÎēÎĩίÎŧÎĩÎŊÎŋ." - }, - "extractImages": { - "title": "Î•ÎžÎąÎŗĪ‰ÎŗÎŽ ÎĩΚÎēΌÎŊΉÎŊ", - "desc": "Î•ÎžÎąÎŗĪ‰ÎŗÎŽ ΌÎģΉÎŊ ΄ΉÎŊ ÎĩΚÎēΌÎŊΉÎŊ ÎąĪ€ĪŒ PDF ÎēιΚ ÎąĪ€ÎŋθΎÎēÎĩĪ…ĪƒÎˇ ΃Îĩ zip" - }, "pdfToPDFA": { "title": "PDF ΃Îĩ PDF/A", "desc": "ΜÎĩĪ„ÎąĪ„ĪÎŋĪ€ÎŽ PDF ΃Îĩ PDF/A ÎŗÎšÎą ÎŧÎąÎē΁ÎŋĪ‡ĪĪŒÎŊΚι ÎąĪ€ÎŋθΎÎēÎĩĪ…ĪƒÎˇ" @@ -435,70 +826,14 @@ "title": "ΑÎŊÎ¯Ī‡ÎŊÎĩĪ…ĪƒÎˇ/Î”ÎšÎąĪ‡Ī‰ĪÎšĪƒÎŧĪŒĪ‚ ĪƒÎąĪĪ‰ÎŧέÎŊΉÎŊ ΆΉ΄ÎŋÎŗĪÎąĪ†ÎšĪŽÎŊ", "desc": "Î”ÎšÎąĪ‡Ī‰ĪÎšĪƒÎŧĪŒĪ‚ Ī€ÎŋÎģÎģÎąĪ€ÎģĪŽÎŊ ΆΉ΄ÎŋÎŗĪÎąĪ†ÎšĪŽÎŊ ÎąĪ€ĪŒ ÎŧΚι ΆΉ΄ÎŋÎŗĪÎąĪ†Î¯Îą/PDF" }, - "sign": { - "title": "ÎĨĪ€ÎŋÎŗĪÎąĪ†ÎŽ", - "desc": "Î ĪÎŋĪƒÎ¸ÎŽÎēΡ Ī…Ī€ÎŋÎŗĪÎąĪ†ÎŽĪ‚ ΃Îĩ PDF ÎŧÎĩ ĪƒĪ‡ÎĩÎ´Î¯ÎąĪƒÎˇ, ÎēÎĩίÎŧÎĩÎŊÎŋ ÎŽ ÎĩΚÎēΌÎŊÎą" - }, - "flatten": { - "title": "Î™ĪƒÎŋĪ€Î­Î´Ī‰ĪƒÎˇ", - "desc": "Î‘Ī†ÎąÎ¯ĪÎĩĪƒÎˇ ΌÎģΉÎŊ ΄ΉÎŊ Î´ÎšÎąÎ´ĪÎąĪƒĪ„ÎšÎēĪŽÎŊ ĪƒĪ„ÎŋÎšĪ‡ÎĩÎ¯Ī‰ÎŊ ÎēιΚ ΆÎŋ΁ÎŧĪŽÎŊ ÎąĪ€ĪŒ έÎŊÎą PDF" - }, - "repair": { - "title": "Î•Ī€ÎšÎ´ÎšĪŒĪÎ¸Ī‰ĪƒÎˇ", - "desc": "Î ĪÎŋĪƒĪ€ÎŦθÎĩΚι ÎĩĪ€ÎšÎ´ÎšĪŒĪÎ¸Ī‰ĪƒÎˇĪ‚ ÎēÎąĪ„ÎĩĪƒĪ„ĪÎąÎŧÎŧέÎŊÎŋĪ…/Ī‡ÎąÎģÎąĪƒÎŧέÎŊÎŋĪ… PDF" - }, - "removeBlanks": { - "title": "Î‘Ī†ÎąÎ¯ĪÎĩĪƒÎˇ ÎēÎĩÎŊĪŽÎŊ ΃ÎĩÎģÎ¯Î´Ī‰ÎŊ", - "desc": "ΑÎŊÎ¯Ī‡ÎŊÎĩĪ…ĪƒÎˇ ÎēιΚ ÎąĪ†ÎąÎ¯ĪÎĩĪƒÎˇ ÎēÎĩÎŊĪŽÎŊ ΃ÎĩÎģÎ¯Î´Ī‰ÎŊ ÎąĪ€ĪŒ έÎŊÎą Î­ÎŗÎŗĪÎąĪ†Îŋ" - }, - "removeAnnotations": { - "title": "Î‘Ī†ÎąÎ¯ĪÎĩĪƒÎˇ ĪƒĪ‡ÎŋÎģÎ¯Ī‰ÎŊ", - "desc": "Î‘Ī†ÎąÎ¯ĪÎĩĪƒÎˇ ΌÎģΉÎŊ ΄ΉÎŊ ĪƒĪ‡ÎŋÎģÎ¯Ī‰ÎŊ/ÎĩĪ€ÎšĪƒÎˇÎŧÎŦÎŊ΃ÎĩΉÎŊ ÎąĪ€ĪŒ έÎŊÎą PDF" - }, - "compare": { - "title": "ÎŖĪÎŗÎēĪÎšĪƒÎˇ", - "desc": "ÎŖĪÎŗÎēĪÎšĪƒÎˇ ÎēιΚ ÎĩÎŧΆÎŦÎŊÎšĪƒÎˇ Î´ÎšÎąĪ†ÎŋĪĪŽÎŊ ÎŧÎĩĪ„ÎąÎžĪ 2 ÎĩÎŗÎŗĪÎŦΆΉÎŊ PDF" - }, - "certSign": { - "title": "ÎĨĪ€ÎŋÎŗĪÎąĪ†ÎŽ ÎŧÎĩ Ī€ÎšĪƒĪ„ÎŋĪ€ÎŋÎšÎˇĪ„ÎšÎēΌ", - "desc": "ÎĨĪ€ÎŋÎŗĪÎąĪ†ÎŽ PDF ÎŧÎĩ Ī€ÎšĪƒĪ„ÎŋĪ€ÎŋÎšÎˇĪ„ÎšÎēΌ/ÎēÎģÎĩΚδί (PEM/P12)" - }, - "removeCertSign": { - "title": "Î‘Ī†ÎąÎ¯ĪÎĩĪƒÎˇ Ī…Ī€ÎŋÎŗĪÎąĪ†ÎŽĪ‚ Ī€ÎšĪƒĪ„ÎŋĪ€ÎŋÎšÎˇĪ„ÎšÎēÎŋĪ", - "desc": "Î‘Ī†ÎąÎ¯ĪÎĩĪƒÎˇ Ī…Ī€ÎŋÎŗĪÎąĪ†ÎŽĪ‚ Ī€ÎšĪƒĪ„ÎŋĪ€ÎŋÎšÎˇĪ„ÎšÎēÎŋĪ ÎąĪ€ĪŒ PDF" - }, - "pageLayout": { - "title": "ΔιÎŦĪ„ÎąÎžÎˇ Ī€ÎŋÎģÎģÎąĪ€ÎģĪŽÎŊ ΃ÎĩÎģÎ¯Î´Ī‰ÎŊ", - "desc": "ÎŖĪ…ÎŗĪ‡ĪŽÎŊÎĩĪ…ĪƒÎˇ Ī€ÎŋÎģÎģÎąĪ€ÎģĪŽÎŊ ΃ÎĩÎģÎ¯Î´Ī‰ÎŊ ÎĩÎŊĪŒĪ‚ ÎĩÎŗÎŗĪÎŦΆÎŋĪ… PDF ΃Îĩ ÎŧÎ¯Îą ΃ÎĩÎģÎ¯Î´Îą" - }, - "scalePages": { - "title": "Î ĪÎŋĪƒÎąĪÎŧÎŋÎŗÎŽ ÎŧÎĩÎŗÎ­Î¸ÎŋĪ…Ī‚/ÎēÎģίÎŧÎąÎēÎąĪ‚ ΃ÎĩÎģÎ¯Î´ÎąĪ‚", - "desc": "ΑÎģÎģÎąÎŗÎŽ Ī„ÎŋĪ… ÎŧÎĩÎŗÎ­Î¸ÎŋĪ…Ī‚/ÎēÎģίÎŧÎąÎēÎąĪ‚ ÎŧÎšÎąĪ‚ ΃ÎĩÎģÎ¯Î´ÎąĪ‚ ÎēιΚ/ÎŽ Ī„ÎŋĪ… Ī€ÎĩĪÎšÎĩ·ÎŋÎŧέÎŊÎŋĪ… Ī„ÎˇĪ‚." - }, "pipeline": { "title": "Pipeline", "desc": "ΕÎēĪ„Î­ÎģÎĩĪƒÎˇ Ī€ÎŋÎģÎģÎąĪ€ÎģĪŽÎŊ ÎĩÎŊÎĩĪÎŗÎĩÎšĪŽÎŊ ΃Îĩ PDF ÎŋĪÎ¯ÎļÎŋÎŊĪ„ÎąĪ‚ scripts pipeline" }, - "addPageNumbers": { - "title": "Î ĪÎŋĪƒÎ¸ÎŽÎēΡ ÎąĪÎšÎ¸ÎŧĪŽÎŊ ΃ÎĩÎģÎ¯Î´Ī‰ÎŊ", - "desc": "Î ĪÎŋĪƒÎ¸ÎŽÎēΡ ÎąĪÎšÎ¸ÎŧĪŽÎŊ ΃ÎĩÎģÎ¯Î´Ī‰ÎŊ ΃Îĩ ΌÎģÎŋ Ī„Îŋ Î­ÎŗÎŗĪÎąĪ†Îŋ ΃Îĩ ĪƒĪ…ÎŗÎēÎĩÎēĪÎšÎŧέÎŊΡ Î¸Î­ĪƒÎˇ" - }, "auto-rename": { "title": "Î‘Ī…Ī„ĪŒÎŧÎąĪ„Îˇ ÎŧÎĩĪ„ÎŋÎŊÎŋÎŧÎąĪƒÎ¯Îą ÎąĪĪ‡ÎĩίÎŋĪ… PDF", "desc": "Î‘Ī…Ī„ĪŒÎŧÎąĪ„Îˇ ÎŧÎĩĪ„ÎŋÎŊÎŋÎŧÎąĪƒÎ¯Îą ÎĩÎŊĪŒĪ‚ PDF ÎŧÎĩ βÎŦĪƒÎˇ Ī„ÎˇÎŊ ÎąÎŊÎšĪ‡ÎŊÎĩĪ…ÎŧέÎŊΡ ÎēÎĩĪ†ÎąÎģÎ¯Î´Îą" }, - "adjustContrast": { - "title": "Î ĪÎŋĪƒÎąĪÎŧÎŋÎŗÎŽ ·΁ΉÎŧÎŦ΄ΉÎŊ/ÎąÎŊĪ„Î¯Î¸ÎĩĪƒÎˇĪ‚", - "desc": "Î ĪÎŋĪƒÎąĪÎŧÎŋÎŗÎŽ ÎąÎŊĪ„Î¯Î¸ÎĩĪƒÎˇĪ‚, ÎēÎŋ΁Îĩ΃ÎŧÎŋĪ ÎēιΚ ΆΉ΄ÎĩΚÎŊĪŒĪ„ÎˇĪ„ÎąĪ‚ ÎĩÎŊĪŒĪ‚ PDF" - }, - "crop": { - "title": "ΠÎĩĪÎšÎēÎŋĪ€ÎŽ PDF", - "desc": "ΠÎĩĪÎšÎēÎŋĪ€ÎŽ PDF ÎŗÎšÎą ÎŧÎĩÎ¯Ī‰ĪƒÎˇ Ī„ÎŋĪ… ÎŧÎĩÎŗÎ­Î¸ÎŋĪ…Ī‚ Ī„ÎŋĪ… (Î´ÎšÎąĪ„ÎˇĪÎĩί Ī„Îŋ ÎēÎĩίÎŧÎĩÎŊÎŋ!)" - }, - "autoSplitPDF": { - "title": "Î‘Ī…Ī„ĪŒÎŧÎąĪ„ÎŋĪ‚ Î´ÎšÎąĪ‡Ī‰ĪÎšĪƒÎŧĪŒĪ‚ ΃ÎĩÎģÎ¯Î´Ī‰ÎŊ", - "desc": "Î‘Ī…Ī„ĪŒÎŧÎąĪ„ÎŋĪ‚ Î´ÎšÎąĪ‡Ī‰ĪÎšĪƒÎŧĪŒĪ‚ ĪƒÎąĪĪ‰ÎŧέÎŊÎŋĪ… PDF ÎŧÎĩ Ī†Ī…ĪƒÎšÎēΌ ĪƒÎąĪĪ‰ÎŧέÎŊÎŋ Î´ÎšÎąĪ‡Ī‰ĪÎšĪƒĪ„ÎŽ ΃ÎĩÎģÎ¯Î´Ī‰ÎŊ QR Code" - }, "sanitizePDF": { "title": "Î•ÎžĪ…ÎŗÎ¯ÎąÎŊĪƒÎˇ", "desc": "Î‘Ī†ÎąÎ¯ĪÎĩĪƒÎˇ scripts ÎēιΚ ÎŦÎģÎģΉÎŊ ĪƒĪ„ÎŋÎšĪ‡ÎĩÎ¯Ī‰ÎŊ ÎąĪ€ĪŒ ÎąĪĪ‡ÎĩÎ¯Îą PDF" @@ -519,30 +854,14 @@ "title": "PDF to Markdown", "desc": "Converts any PDF to Markdown" }, - "getPdfInfo": { - "title": "Î›ÎŽĪˆÎˇ ΟΛΩΝ ΄ΉÎŊ Ī€ÎģÎˇĪÎŋΆÎŋĪÎšĪŽÎŊ Ī„ÎŋĪ… PDF", - "desc": "Î›ÎŽĪˆÎˇ ΌÎģΉÎŊ ΄ΉÎŊ Î´Ī…ÎŊÎąĪ„ĪŽÎŊ Ī€ÎģÎˇĪÎŋΆÎŋĪÎšĪŽÎŊ ÎŗÎšÎą Ī„Îą PDF" - }, "pageExtracter": { "title": "Î•ÎžÎąÎŗĪ‰ÎŗÎŽ ΃ÎĩÎģÎ¯Î´ÎąĪ‚(ΉÎŊ)", "desc": "Î•ÎžÎąÎŗĪ‰ÎŗÎŽ ÎĩĪ€ÎšÎģÎĩÎŗÎŧέÎŊΉÎŊ ΃ÎĩÎģÎ¯Î´Ī‰ÎŊ ÎąĪ€ĪŒ PDF" }, - "pdfToSinglePage": { - "title": "ΕÎŊÎšÎąÎ¯Îą ÎŧÎĩÎŗÎŦÎģΡ ΃ÎĩÎģÎ¯Î´Îą", - "desc": "ÎŖĪ…ÎŗĪ‡ĪŽÎŊÎĩĪ…ĪƒÎˇ ΌÎģΉÎŊ ΄ΉÎŊ ΃ÎĩÎģÎ¯Î´Ī‰ÎŊ PDF ΃Îĩ ÎŧÎ¯Îą ÎŧÎĩÎŗÎŦÎģΡ ΃ÎĩÎģÎ¯Î´Îą" - }, - "showJS": { - "title": "ΕÎŧΆÎŦÎŊÎšĪƒÎˇ Javascript", - "desc": "ΑÎŊÎąÎļÎŽĪ„ÎˇĪƒÎˇ ÎēιΚ ÎĩÎŧΆÎŦÎŊÎšĪƒÎˇ ÎŋĪ€ÎŋΚÎŋĪ…Î´ÎŽĪ€ÎŋĪ„Îĩ JS ÎĩÎŊĪƒĪ‰ÎŧÎąĪ„Ī‰ÎŧέÎŊÎŋĪ… ΃Îĩ PDF" - }, "autoRedact": { "title": "Î‘Ī…Ī„ĪŒÎŧÎąĪ„Îˇ ÎąĪ€ĪŒÎēĪĪ…ĪˆÎˇ", "desc": "Î‘Ī…Ī„ĪŒÎŧÎąĪ„Îˇ ÎąĪ€ĪŒÎēĪĪ…ĪˆÎˇ (ÎŧÎąĪĪÎšĪƒÎŧÎą) ÎēÎĩΚÎŧέÎŊÎŋĪ… ΃Îĩ PDF βÎŦ΃ÎĩΚ ÎĩÎšĪƒÎąÎŗĪŒÎŧÎĩÎŊÎŋĪ… ÎēÎĩΚÎŧέÎŊÎŋĪ…" }, - "redact": { - "title": "ΧÎĩÎšĪÎŋÎēίÎŊÎˇĪ„Îˇ ÎąĪ€ĪŒÎēĪĪ…ĪˆÎˇ", - "desc": "Î‘Ī€ĪŒÎēĪĪ…ĪˆÎˇ ΃Îĩ PDF βÎŦ΃ÎĩΚ ÎĩĪ€ÎšÎģÎĩÎŗÎŧέÎŊÎŋĪ… ÎēÎĩΚÎŧέÎŊÎŋĪ…, ĪƒĪ‡ÎĩÎ´ÎšÎąĪƒÎŧέÎŊΉÎŊ ĪƒĪ‡ÎˇÎŧÎŦ΄ΉÎŊ ÎēιΚ/ÎŽ ÎĩĪ€ÎšÎģÎĩÎŗÎŧέÎŊΉÎŊ ΃ÎĩÎģÎ¯Î´Ī‰ÎŊ" - }, "PDFToCSV": { "title": "PDF ΃Îĩ CSV", "desc": "Î•ÎžÎąÎŗĪ‰ÎŗÎŽ Ī€ÎšÎŊÎŦÎēΉÎŊ ÎąĪ€ĪŒ PDF ÎēιΚ ÎŧÎĩĪ„ÎąĪ„ĪÎŋĪ€ÎŽ ΃Îĩ CSV" @@ -551,10 +870,6 @@ "title": "Î‘Ī…Ī„ĪŒÎŧÎąĪ„ÎŋĪ‚ Î´ÎšÎąĪ‡Ī‰ĪÎšĪƒÎŧĪŒĪ‚ ÎąÎŊÎŦ ÎŧÎ­ÎŗÎĩθÎŋĪ‚/Ī€ÎģΎθÎŋĪ‚", "desc": "Î”ÎšÎąĪ‡Ī‰ĪÎšĪƒÎŧĪŒĪ‚ ÎĩÎŊĪŒĪ‚ PDF ΃Îĩ Ī€ÎŋÎģÎģÎąĪ€ÎģÎŦ Î­ÎŗÎŗĪÎąĪ†Îą βÎŦ΃ÎĩΚ ÎŧÎĩÎŗÎ­Î¸ÎŋĪ…Ī‚, ÎąĪÎšÎ¸ÎŧÎŋĪ ΃ÎĩÎģÎ¯Î´Ī‰ÎŊ ÎŽ ÎąĪÎšÎ¸ÎŧÎŋĪ ÎĩÎŗÎŗĪÎŦΆΉÎŊ" }, - "overlay-pdfs": { - "title": "Î•Ī€ÎšÎēÎŦÎģĪ…ĪˆÎˇ PDF", - "desc": "Î•Ī€ÎšÎēÎŦÎģĪ…ĪˆÎˇ PDF Ī€ÎŦÎŊΉ ΃Îĩ ÎŦÎģÎģÎŋ PDF" - }, "split-by-sections": { "title": "Î”ÎšÎąĪ‡Ī‰ĪÎšĪƒÎŧĪŒĪ‚ PDF ÎąÎŊÎŦ ÎĩÎŊĪŒĪ„ÎˇĪ„ÎĩĪ‚", "desc": "Î”ÎšÎąÎ¯ĪÎĩĪƒÎˇ ÎēÎŦθÎĩ ΃ÎĩÎģÎ¯Î´ÎąĪ‚ ÎĩÎŊĪŒĪ‚ PDF ΃Îĩ ÎŧΚÎēĪĪŒĪ„Îĩ΁ÎĩĪ‚ ÎŋĪÎšÎļΌÎŊĪ„ÎšÎĩĪ‚ ÎēιΚ ÎēÎŦθÎĩĪ„ÎĩĪ‚ ÎĩÎŊĪŒĪ„ÎˇĪ„ÎĩĪ‚" @@ -563,43 +878,17 @@ "title": "Î ĪÎŋĪƒÎ¸ÎŽÎēΡ ĪƒĪ†ĪÎąÎŗÎ¯Î´ÎąĪ‚ ΃Îĩ PDF", "desc": "Î ĪÎŋĪƒÎ¸ÎŽÎēΡ ÎēÎĩΚÎŧέÎŊÎŋĪ… ÎŽ ÎĩΚÎēΌÎŊΉÎŊ ĪƒĪ†ĪÎąÎŗÎ¯Î´ÎąĪ‚ ΃Îĩ ÎēιθÎŋĪÎšĪƒÎŧέÎŊÎĩĪ‚ Î¸Î­ĪƒÎĩÎšĪ‚" }, - "removeImage": { - "title": "Î‘Ī†ÎąÎ¯ĪÎĩĪƒÎˇ ÎĩΚÎēΌÎŊÎąĪ‚", - "desc": "Î‘Ī†ÎąÎ¯ĪÎĩĪƒÎˇ ÎĩΚÎēΌÎŊÎąĪ‚ ÎąĪ€ĪŒ PDF ÎŗÎšÎą ÎŧÎĩÎ¯Ī‰ĪƒÎˇ ÎŧÎĩÎŗÎ­Î¸ÎŋĪ…Ī‚ ÎąĪĪ‡ÎĩίÎŋĪ…" - }, - "splitByChapters": { - "title": "Î”ÎšÎąĪ‡Ī‰ĪÎšĪƒÎŧĪŒĪ‚ PDF ÎąÎŊÎŦ ÎēÎĩΆÎŦÎģιΚι", - "desc": "Î”ÎšÎąĪ‡Ī‰ĪÎšĪƒÎŧĪŒĪ‚ ÎĩÎŊĪŒĪ‚ PDF ΃Îĩ Ī€ÎŋÎģÎģÎąĪ€ÎģÎŦ ÎąĪĪ‡ÎĩÎ¯Îą βÎŦ΃ÎĩΚ Ī„ÎˇĪ‚ δÎŋÎŧÎŽĪ‚ ÎēÎĩĪ†ÎąÎģÎąÎ¯Ī‰ÎŊ." - }, - "validateSignature": { - "title": "Î•Ī€ÎšÎēĪĪĪ‰ĪƒÎˇ Ī…Ī€ÎŋÎŗĪÎąĪ†ÎŽĪ‚ PDF", - "desc": "Î•Ī€ÎąÎģΎθÎĩĪ…ĪƒÎˇ ĪˆÎˇĪ†ÎšÎąÎēĪŽÎŊ Ī…Ī€ÎŋÎŗĪÎąĪ†ĪŽÎŊ ÎēιΚ Ī€ÎšĪƒĪ„ÎŋĪ€ÎŋÎšÎˇĪ„ÎšÎēĪŽÎŊ ΃Îĩ Î­ÎŗÎŗĪÎąĪ†Îą PDF" - }, "replace-color": { "title": "ΑÎŊĪ„ÎšÎēÎąĪ„ÎŦĪƒĪ„ÎąĪƒÎˇ ÎēιΚ ÎąÎŊÎąĪƒĪ„ĪÎŋĪ†ÎŽ Ī‡ĪĪŽÎŧÎąĪ„ÎŋĪ‚", "desc": "ΑÎŊĪ„ÎšÎēÎąĪ„ÎŦĪƒĪ„ÎąĪƒÎˇ Ī‡ĪĪŽÎŧÎąĪ„ÎŋĪ‚ ÎŗÎšÎą ÎēÎĩίÎŧÎĩÎŊÎŋ ÎēιΚ Ī†ĪŒÎŊĪ„Îŋ ΃Îĩ PDF ÎēιΚ ÎąÎŊÎąĪƒĪ„ĪÎŋĪ†ÎŽ Ī€ÎģÎŽĪÎŋĪ…Ī‚ Ī‡ĪĪŽÎŧÎąĪ„ÎŋĪ‚ ÎŗÎšÎą ÎŧÎĩÎ¯Ī‰ĪƒÎˇ ÎŧÎĩÎŗÎ­Î¸ÎŋĪ…Ī‚ ÎąĪĪ‡ÎĩίÎŋĪ…" }, - "convert": { - "title": "ΜÎĩĪ„ÎąĪ„ĪÎŋĪ€ÎŽ" - }, "attachments": { "title": "Add attachments" }, - "extractPages": { - "title": "Î•ÎžÎąÎŗĪ‰ÎŗÎŽ ΃ÎĩÎģÎ¯Î´Ī‰ÎŊ" - }, - "removePages": { - "title": "Î‘Ī†ÎąÎ¯ĪÎĩĪƒÎˇ", - "desc": "Î”ÎšÎąÎŗĪÎąĪ†ÎŽ ÎąÎŊÎĩĪ€ÎšÎ¸ĪÎŧÎˇĪ„Ī‰ÎŊ ΃ÎĩÎģÎ¯Î´Ī‰ÎŊ ÎąĪ€ĪŒ Ī„Îŋ Î­ÎŗÎŗĪÎąĪ†Îŋ PDF." - }, "removeImagePdf": { "title": "Î‘Ī†ÎąÎ¯ĪÎĩĪƒÎˇ ÎĩΚÎēΌÎŊÎąĪ‚", "desc": "Î‘Ī†ÎąÎ¯ĪÎĩĪƒÎˇ ÎĩΚÎēΌÎŊÎąĪ‚ ÎąĪ€ĪŒ PDF ÎŗÎšÎą ÎŧÎĩÎ¯Ī‰ĪƒÎˇ ÎŧÎĩÎŗÎ­Î¸ÎŋĪ…Ī‚ ÎąĪĪ‡ÎĩίÎŋĪ…" }, - "autoSizeSplitPDF": { - "title": "Î‘Ī…Ī„ĪŒÎŧÎąĪ„ÎŋĪ‚ Î´ÎšÎąĪ‡Ī‰ĪÎšĪƒÎŧĪŒĪ‚ ÎąÎŊÎŦ ÎŧÎ­ÎŗÎĩθÎŋĪ‚/Ī€ÎģΎθÎŋĪ‚", - "desc": "Î”ÎšÎąĪ‡Ī‰ĪÎšĪƒÎŧĪŒĪ‚ ÎĩÎŊĪŒĪ‚ PDF ΃Îĩ Ī€ÎŋÎģÎģÎąĪ€ÎģÎŦ Î­ÎŗÎŗĪÎąĪ†Îą βÎŦ΃ÎĩΚ ÎŧÎĩÎŗÎ­Î¸ÎŋĪ…Ī‚, ÎąĪÎšÎ¸ÎŧÎŋĪ ΃ÎĩÎģÎ¯Î´Ī‰ÎŊ ÎŽ ÎąĪÎšÎ¸ÎŧÎŋĪ ÎĩÎŗÎŗĪÎŦΆΉÎŊ" - }, "adjust-contrast": { "title": "Î ĪÎŋĪƒÎąĪÎŧÎŋÎŗÎŽ ·΁ΉÎŧÎŦ΄ΉÎŊ/ÎąÎŊĪ„Î¯Î¸ÎĩĪƒÎˇĪ‚", "desc": "Î ĪÎŋĪƒÎąĪÎŧÎŋÎŗÎŽ ÎąÎŊĪ„Î¯Î¸ÎĩĪƒÎˇĪ‚, ÎēÎŋ΁Îĩ΃ÎŧÎŋĪ ÎēιΚ ΆΉ΄ÎĩΚÎŊĪŒĪ„ÎˇĪ„ÎąĪ‚ ÎĩÎŊĪŒĪ‚ PDF" @@ -607,11 +896,12 @@ "replaceColorPdf": { "title": "ΑÎŊĪ„ÎšÎēÎąĪ„ÎŦĪƒĪ„ÎąĪƒÎˇ ÎēιΚ ÎąÎŊÎąĪƒĪ„ĪÎŋĪ†ÎŽ Ī‡ĪĪŽÎŧÎąĪ„ÎŋĪ‚", "desc": "ΑÎŊĪ„ÎšÎēÎąĪ„ÎŦĪƒĪ„ÎąĪƒÎˇ Ī‡ĪĪŽÎŧÎąĪ„ÎŋĪ‚ ÎŗÎšÎą ÎēÎĩίÎŧÎĩÎŊÎŋ ÎēιΚ Ī†ĪŒÎŊĪ„Îŋ ΃Îĩ PDF ÎēιΚ ÎąÎŊÎąĪƒĪ„ĪÎŋĪ†ÎŽ Ī€ÎģÎŽĪÎŋĪ…Ī‚ Ī‡ĪĪŽÎŧÎąĪ„ÎŋĪ‚ ÎŗÎšÎą ÎŧÎĩÎ¯Ī‰ĪƒÎˇ ÎŧÎĩÎŗÎ­Î¸ÎŋĪ…Ī‚ ÎąĪĪ‡ÎĩίÎŋĪ…" - }, - "changePermissions": { - "title": "ΑÎģÎģÎąÎŗÎŽ δΚÎēÎąÎšĪ‰ÎŧÎŦ΄ΉÎŊ" } }, + "landing": { + "addFiles": "Add Files", + "uploadFromComputer": "Upload from computer" + }, "viewPdf": { "tags": "΀΁ÎŋβÎŋÎģÎŽ,ÎąÎŊÎŦÎŗÎŊĪ‰ĪƒÎˇ,ĪƒĪ‡ÎŋÎģÎšÎąĪƒÎŧĪŒĪ‚,ÎēÎĩίÎŧÎĩÎŊÎŋ,ÎĩΚÎēΌÎŊÎą", "title": "View/Edit PDF", @@ -645,17 +935,39 @@ "merge": { "tags": "ĪƒĪ…ÎŗĪ‡ĪŽÎŊÎĩĪ…ĪƒÎˇ,ÎģÎĩÎšĪ„ÎŋĪ…ĪÎŗÎ¯ÎĩĪ‚ ΃ÎĩÎģÎ¯Î´Ī‰ÎŊ,backend,Ī€ÎģÎĩ΅΁ÎŦ δΚιÎēÎŋÎŧÎšĪƒĪ„ÎŽ", "title": "ÎŖĪ…ÎŗĪ‡ĪŽÎŊÎĩĪ…ĪƒÎˇ", + "removeDigitalSignature": { + "label": "Remove digital signature in the merged file?", + "tooltip": { + "title": "Remove Digital Signature", + "description": "Digital signatures will be invalidated when merging files. Check this to remove them from the final merged PDF." + } + }, + "generateTableOfContents": { + "label": "Generate table of contents in the merged file?", + "tooltip": { + "title": "Generate Table of Contents", + "description": "Automatically creates a clickable table of contents in the merged PDF based on the original file names and page numbers." + } + }, + "submit": "ÎŖĪ…ÎŗĪ‡ĪŽÎŊÎĩĪ…ĪƒÎˇ", + "sortBy": { + "description": "Files will be merged in the order they're selected. Drag to reorder or sort below.", + "label": "Sort By", + "filename": "ΌÎŊÎŋÎŧÎą ÎąĪĪ‡ÎĩίÎŋĪ…", + "dateModified": "Date Modified", + "ascending": "Ascending", + "descending": "Descending", + "sort": "Sort" + }, + "error": { + "failed": "An error occurred while merging the PDFs." + }, "header": "ÎŖĪ…ÎŗĪ‡ĪŽÎŊÎĩĪ…ĪƒÎˇ Ī€ÎŋÎģÎģÎąĪ€ÎģĪŽÎŊ PDF (2+)", "sortByName": "ΤιΞΚÎŊΌÎŧÎˇĪƒÎˇ ÎēÎąĪ„ÎŦ ΌÎŊÎŋÎŧÎą", "sortByDate": "ΤιΞΚÎŊΌÎŧÎˇĪƒÎˇ ÎēÎąĪ„ÎŦ ΡÎŧÎĩ΁ÎŋÎŧΡÎŊÎ¯Îą", - "removeCertSign": "Î‘Ī†ÎąÎ¯ĪÎĩĪƒÎˇ ĪˆÎˇĪ†ÎšÎąÎēÎŽĪ‚ Ī…Ī€ÎŋÎŗĪÎąĪ†ÎŽĪ‚ ĪƒĪ„Îŋ ĪƒĪ…ÎŗĪ‡Ī‰ÎŊÎĩĪ…ÎŧέÎŊÎŋ ÎąĪĪ‡ÎĩίÎŋ;", - "submit": "ÎŖĪ…ÎŗĪ‡ĪŽÎŊÎĩĪ…ĪƒÎˇ", - "sortBy": { - "filename": "ΌÎŊÎŋÎŧÎą ÎąĪĪ‡ÎĩίÎŋĪ…" - } + "removeCertSign": "Î‘Ī†ÎąÎ¯ĪÎĩĪƒÎˇ ĪˆÎˇĪ†ÎšÎąÎēÎŽĪ‚ Ī…Ī€ÎŋÎŗĪÎąĪ†ÎŽĪ‚ ĪƒĪ„Îŋ ĪƒĪ…ÎŗĪ‡Ī‰ÎŊÎĩĪ…ÎŧέÎŊÎŋ ÎąĪĪ‡ÎĩίÎŋ;" }, "split": { - "tags": "ÎģÎĩÎšĪ„ÎŋĪ…ĪÎŗÎ¯ÎĩĪ‚ ΃ÎĩÎģÎ¯Î´Ī‰ÎŊ,Î´ÎšÎąÎ¯ĪÎĩĪƒÎˇ,Ī€ÎŋÎģÎģÎąĪ€ÎģÎ­Ī‚ ΃ÎĩÎģίδÎĩĪ‚,ÎēÎŋĪ€ÎŽ,Ī€ÎģÎĩ΅΁ÎŦ δΚιÎēÎŋÎŧÎšĪƒĪ„ÎŽ", "title": "Î”ÎšÎąĪ‡Ī‰ĪÎšĪƒÎŧĪŒĪ‚ PDF", "header": "Î”ÎšÎąĪ‡Ī‰ĪÎšĪƒÎŧĪŒĪ‚ PDF", "desc": { @@ -671,25 +983,249 @@ "splitPages": "Î•ÎšĪƒÎŦÎŗÎĩĪ„Îĩ ΃ÎĩÎģίδÎĩĪ‚ ÎŗÎšÎą Î´ÎšÎąĪ‡Ī‰ĪÎšĪƒÎŧΌ:", "submit": "Î”ÎšÎąĪ‡Ī‰ĪÎšĪƒÎŧĪŒĪ‚", "steps": { + "chooseMethod": "Choose Method", "settings": "ÎĄĪ…Î¸ÎŧÎ¯ĪƒÎĩÎšĪ‚" }, + "settings": { + "selectMethodFirst": "Please select a split method first" + }, + "error": { + "failed": "An error occurred while splitting the PDF." + }, + "method": { + "label": "Choose split method", + "placeholder": "Select how to split the PDF" + }, "methods": { + "prefix": { + "splitAt": "Split at", + "splitBy": "Split by" + }, + "byPages": { + "name": "Page Numbers", + "desc": "Extract specific pages (1,3,5-10)", + "tooltip": "Enter page numbers separated by commas or ranges with hyphens" + }, + "bySections": { + "name": "Sections", + "desc": "Divide pages into grid sections", + "tooltip": "Split each page into horizontal and vertical sections" + }, "bySize": { - "name": "ÎœÎ­ÎŗÎĩθÎŋĪ‚ ÎąĪĪ‡ÎĩίÎŋĪ…" + "name": "ÎœÎ­ÎŗÎĩθÎŋĪ‚ ÎąĪĪ‡ÎĩίÎŋĪ…", + "desc": "Limit maximum file size", + "tooltip": "Specify maximum file size (e.g. 10MB, 500KB)" + }, + "byPageCount": { + "name": "Page Count", + "desc": "Fixed pages per file", + "tooltip": "Enter the number of pages for each split file" + }, + "byDocCount": { + "name": "Document Count", + "desc": "Create specific number of files", + "tooltip": "Enter how many files you want to create" + }, + "byChapters": { + "name": "Chapters", + "desc": "Split at bookmark boundaries", + "tooltip": "Uses PDF bookmarks to determine split points" + }, + "byPageDivider": { + "name": "Page Divider", + "desc": "Auto-split with divider sheets", + "tooltip": "Use QR code divider sheets between documents when scanning" } }, "value": { "fileSize": { - "label": "ÎœÎ­ÎŗÎĩθÎŋĪ‚ ÎąĪĪ‡ÎĩίÎŋĪ…" + "label": "ÎœÎ­ÎŗÎĩθÎŋĪ‚ ÎąĪĪ‡ÎĩίÎŋĪ…", + "placeholder": "e.g. 10MB, 500KB" + }, + "pageCount": { + "label": "Pages per File", + "placeholder": "e.g. 5, 10" + }, + "docCount": { + "label": "Number of Files", + "placeholder": "e.g. 3, 5" } - } + }, + "tooltip": { + "header": { + "title": "Split Methods Overview" + }, + "byPages": { + "title": "Split at Page Numbers", + "text": "Split your PDF at specific page numbers. Using 'n' splits after page n. Using 'n-m' splits before page n and after page m.", + "bullet1": "Single split points: 3,7 (splits after pages 3 and 7)", + "bullet2": "Range split points: 3-8 (splits before page 3 and after page 8)", + "bullet3": "Mixed: 2,5-10,15 (splits after page 2, before page 5, after page 10, and after page 15)" + }, + "bySections": { + "title": "Split by Grid Sections", + "text": "Divide each page into a grid of sections. Useful for splitting documents with multiple columns or extracting specific areas.", + "bullet1": "Horizontal: Number of rows to create", + "bullet2": "Vertical: Number of columns to create", + "bullet3": "Merge: Combine all sections into one PDF" + }, + "bySize": { + "title": "Split by File Size", + "text": "Create multiple PDFs that don't exceed a specified file size. Ideal for file size limitations or email attachments.", + "bullet1": "Use MB for larger files (e.g., 10MB)", + "bullet2": "Use KB for smaller files (e.g., 500KB)", + "bullet3": "System will split at page boundaries" + }, + "byCount": { + "title": "Split by Count", + "text": "Create multiple PDFs with a specific number of pages or documents each.", + "bullet1": "Page Count: Fixed number of pages per file", + "bullet2": "Document Count: Fixed number of output files", + "bullet3": "Useful for batch processing workflows" + }, + "byChapters": { + "title": "Split by Chapters", + "text": "Use PDF bookmarks to automatically split at chapter boundaries. Requires PDFs with bookmark structure.", + "bullet1": "Bookmark Level: Which level to split on (1=top level)", + "bullet2": "Include Metadata: Preserve document properties", + "bullet3": "Allow Duplicates: Handle repeated bookmark names" + }, + "byDocCount": { + "bullet1": "Enter the number of output files you want", + "bullet2": "Pages are distributed as evenly as possible", + "bullet3": "Useful when you need a specific number of files", + "text": "Create a specific number of output files by evenly distributing pages across them.", + "title": "Split by Document Count" + }, + "byPageCount": { + "bullet1": "Enter the number of pages per output file", + "bullet2": "Last file may have fewer pages if not evenly divisible", + "bullet3": "Useful for batch processing workflows", + "text": "Create multiple PDFs with a specific number of pages each. Perfect for creating uniform document chunks.", + "title": "Split by Page Count" + }, + "byPageDivider": { + "bullet1": "Print divider sheets from the download link", + "bullet2": "Insert divider sheets between your documents", + "bullet3": "Scan all documents together as one PDF", + "bullet4": "Upload - divider pages are automatically detected and removed", + "bullet5": "Enable Duplex Mode if scanning both sides of divider sheets", + "text": "Automatically split scanned documents using physical divider sheets with QR codes. Perfect for processing multiple documents scanned together.", + "title": "Split by Page Divider" + } + }, + "methodSelection": { + "tooltip": { + "bullet1": "Click on a method card to select it", + "bullet2": "Hover over each card to see a quick description", + "bullet3": "The settings step will appear after you select a method", + "bullet4": "You can change methods at any time before processing", + "header": { + "text": "Choose how you want to split your PDF document. Each method is optimized for different use cases and document types.", + "title": "Split Method Selection" + }, + "title": "Choose Your Split Method" + } + }, + "selectMethod": "Select a split method", + "tags": "ÎģÎĩÎšĪ„ÎŋĪ…ĪÎŗÎ¯ÎĩĪ‚ ΃ÎĩÎģÎ¯Î´Ī‰ÎŊ,Î´ÎšÎąÎ¯ĪÎĩĪƒÎˇ,Ī€ÎŋÎģÎģÎąĪ€ÎģÎ­Ī‚ ΃ÎĩÎģίδÎĩĪ‚,ÎēÎŋĪ€ÎŽ,Ī€ÎģÎĩ΅΁ÎŦ δΚιÎēÎŋÎŧÎšĪƒĪ„ÎŽ" }, "rotate": { - "tags": "Ī€ÎģÎĩ΅΁ÎŦ δΚιÎēÎŋÎŧÎšĪƒĪ„ÎŽ", "title": "ΠÎĩĪÎšĪƒĪ„ĪÎŋĪ†ÎŽ PDF", + "submit": "ΠÎĩĪÎšĪƒĪ„ĪÎŋĪ†ÎŽ", + "selectRotation": "Select Rotation Angle (Clockwise)", + "error": { + "failed": "An error occurred while rotating the PDF." + }, + "preview": { + "title": "Rotation Preview" + }, + "rotateLeft": "Rotate Anticlockwise", + "rotateRight": "Rotate Clockwise", + "tooltip": { + "header": { + "title": "Rotate Settings Overview" + }, + "description": { + "text": "Rotate your PDF pages clockwise or anticlockwise in 90-degree increments. All pages in the PDF will be rotated. The preview shows how your document will look after rotation." + }, + "controls": { + "title": "Controls", + "text": "Use the rotation buttons to adjust orientation. Left button rotates anticlockwise, right button rotates clockwise. Each click rotates by 90 degrees." + } + }, + "tags": "Ī€ÎģÎĩ΅΁ÎŦ δΚιÎēÎŋÎŧÎšĪƒĪ„ÎŽ", "header": "ΠÎĩĪÎšĪƒĪ„ĪÎŋĪ†ÎŽ PDF", - "selectAngle": "Î•Ī€ÎšÎģÎ­ÎžĪ„Îĩ ÎŗĪ‰ÎŊÎ¯Îą Ī€ÎĩĪÎšĪƒĪ„ĪÎŋĪ†ÎŽĪ‚ (΃Îĩ Ī€ÎŋÎģÎģÎąĪ€ÎģÎŦĪƒÎšÎą ΄ΉÎŊ 90 ÎŧÎŋÎšĪĪŽÎŊ):", - "submit": "ΠÎĩĪÎšĪƒĪ„ĪÎŋĪ†ÎŽ" + "selectAngle": "Î•Ī€ÎšÎģÎ­ÎžĪ„Îĩ ÎŗĪ‰ÎŊÎ¯Îą Ī€ÎĩĪÎšĪƒĪ„ĪÎŋĪ†ÎŽĪ‚ (΃Îĩ Ī€ÎŋÎģÎģÎąĪ€ÎģÎŦĪƒÎšÎą ΄ΉÎŊ 90 ÎŧÎŋÎšĪĪŽÎŊ):" + }, + "convert": { + "title": "ΜÎĩĪ„ÎąĪ„ĪÎŋĪ€ÎŽ", + "desc": "Convert files between different formats", + "files": "Files", + "selectFilesPlaceholder": "Select files in the main view to get started", + "settings": "ÎĄĪ…Î¸ÎŧÎ¯ĪƒÎĩÎšĪ‚", + "conversionCompleted": "Conversion completed", + "results": "Results", + "defaultFilename": "converted_file", + "conversionResults": "Conversion Results", + "convertFrom": "Convert from", + "convertTo": "Convert to", + "sourceFormatPlaceholder": "Source format", + "targetFormatPlaceholder": "Target format", + "selectSourceFormatFirst": "Select a source format first", + "outputOptions": "Output Options", + "pdfOptions": "PDF Options", + "imageOptions": "Image Options", + "colorType": "Colour Type", + "color": "Î§ĪĪŽÎŧÎą", + "greyscale": "ΚÎģίÎŧÎąÎēÎą Ī„ÎŋĪ… ÎŗÎēĪÎš", + "blackwhite": "Black & White", + "dpi": "DPI", + "output": "Output", + "single": "Single", + "multiple": "Multiple", + "fitOption": "Fit Option", + "maintainAspectRatio": "Maintain Aspect Ratio", + "fitDocumentToPage": "Fit Document to Page", + "fillPage": "ΓέÎŧÎšĪƒÎŧÎą ΃ÎĩÎģÎ¯Î´ÎąĪ‚", + "autoRotate": "Auto Rotate", + "autoRotateDescription": "Automatically rotate images to better fit the PDF page", + "combineImages": "Combine Images", + "combineImagesDescription": "Combine all images into one PDF, or create separate PDFs for each image", + "webOptions": "Web to PDF Options", + "zoomLevel": "Zoom Level", + "emailOptions": "Email to PDF Options", + "includeAttachments": "Include email attachments", + "maxAttachmentSize": "Maximum attachment size (MB)", + "includeAllRecipients": "Include CC and BCC recipients in header", + "downloadHtml": "Download HTML intermediate file instead of PDF", + "pdfaOptions": "PDF/A Options", + "outputFormat": "Output Format", + "pdfaNote": "PDF/A-1b is more compatible, PDF/A-2b supports more features.", + "pdfaDigitalSignatureWarning": "ΤÎŋ PDF Ī€ÎĩĪÎšÎ­Ī‡ÎĩΚ ĪˆÎˇĪ†ÎšÎąÎēÎŽ Ī…Ī€ÎŋÎŗĪÎąĪ†ÎŽ. Î‘Ī…Ī„ÎŽ θι ÎąĪ†ÎąÎšĪÎĩθÎĩί ĪƒĪ„Îŋ ÎĩĪ€ĪŒÎŧÎĩÎŊÎŋ βΎÎŧÎą.", + "fileFormat": "File Format", + "wordDoc": "Word Document", + "wordDocExt": "Word Document (.docx)", + "odtExt": "OpenDocument Text (.odt)", + "pptExt": "PowerPoint (.pptx)", + "odpExt": "OpenDocument Presentation (.odp)", + "txtExt": "Plain Text (.txt)", + "rtfExt": "Rich Text Format (.rtf)", + "selectedFiles": "Selected files", + "noFileSelected": "No file selected. Use the file panel to add files.", + "convertFiles": "Convert Files", + "converting": "Converting...", + "downloadConverted": "Download Converted File", + "errorNoFiles": "Please select at least one file to convert.", + "errorNoFormat": "Please select both source and target formats.", + "errorNotSupported": "Conversion from {{from}} to {{to}} is not supported.", + "images": "Images", + "officeDocs": "Office Documents (Word, Excel, PowerPoint)", + "imagesExt": "Images (JPG, PNG, etc.)", + "markdown": "Markdown", + "textRtf": "Text/RTF", + "grayscale": "ΚÎģίÎŧÎąÎēÎą Ī„ÎŋĪ… ÎŗÎēĪÎš", + "errorConversion": "An error occurred while converting the file." }, "imageToPdf": { "tags": "ÎŧÎĩĪ„ÎąĪ„ĪÎŋĪ€ÎŽ,ÎĩΚÎēΌÎŊÎą,jpg,ΆΉ΄ÎŋÎŗĪÎąĪ†Î¯Îą" @@ -727,7 +1263,33 @@ "8": "Î‘Ī†ÎąÎ¯ĪÎĩĪƒÎˇ Ī„ÎĩÎģÎĩĪ…Ī„ÎąÎ¯ÎąĪ‚", "9": "Î‘Ī†ÎąÎ¯ĪÎĩĪƒÎˇ Ī€ĪĪŽĪ„ÎˇĪ‚ ÎēιΚ Ī„ÎĩÎģÎĩĪ…Ī„ÎąÎ¯ÎąĪ‚", "10": "ÎŖĪ…ÎŗĪ‡ĪŽÎŊÎĩĪ…ĪƒÎˇ ÎŧÎŋÎŊĪŽÎŊ-ÎļĪ…ÎŗĪŽÎŊ", - "11": "Duplicate all pages" + "11": "Duplicate all pages", + "desc": { + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, â€Ļ).", + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, â€Ļ).", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimized for binding on the side)." + } + }, + "desc": { + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, â€Ļ).", + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, â€Ļ).", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimised for binding on the side).", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document." }, "placeholder": "(Ī€.·. 1,3,2 ÎŽ 4-8,2,10-12 ÎŽ 2n-1)" }, @@ -739,9 +1301,198 @@ "upload": "Î ĪÎŋĪƒÎ¸ÎŽÎēΡ ÎĩΚÎēΌÎŊÎąĪ‚", "submit": "Î ĪÎŋĪƒÎ¸ÎŽÎēΡ ÎĩΚÎēΌÎŊÎąĪ‚" }, + "attachments": { + "tags": "embed,attach,file,attachment,attachments", + "title": "Add attachments", + "header": "Add attachments", + "add": "Add Attachment", + "remove": "Remove Attachment", + "embed": "Embed Attachment", + "submit": "Add attachments" + }, "watermark": { - "tags": "ÎēÎĩίÎŧÎĩÎŊÎŋ,ÎĩĪ€ÎąÎŊÎąÎģÎąÎŧβιÎŊΌÎŧÎĩÎŊÎŋ,ÎĩĪ„ÎšÎēÎ­Ī„Îą,ΚδΚÎŋÎēĪ„ÎˇĪƒÎ¯Îą,Ī€ÎŊÎĩĪ…ÎŧÎąĪ„ÎšÎēÎŦ δΚÎēÎąÎšĪŽÎŧÎąĪ„Îą,ÎĩÎŧĪ€ÎŋĪÎšÎēΌ ĪƒÎŽÎŧÎą,ÎĩΚÎēΌÎŊÎą,jpg,ΆΉ΄ÎŋÎŗĪÎąĪ†Î¯Îą", "title": "Î ĪÎŋĪƒÎ¸ÎŽÎēΡ Ī…Î´ÎąĪ„ÎŋÎŗĪÎąĪ†ÎŽÎŧÎąĪ„ÎŋĪ‚", + "desc": "Add text or image watermarks to PDF files", + "completed": "Watermark added", + "submit": "Î ĪÎŋĪƒÎ¸ÎŽÎēΡ Ī…Î´ÎąĪ„ÎŋÎŗĪÎąĪ†ÎŽÎŧÎąĪ„ÎŋĪ‚", + "filenamePrefix": "watermarked", + "error": { + "failed": "An error occurred while adding watermark to the PDF." + }, + "watermarkType": { + "text": "ΚÎĩίÎŧÎĩÎŊÎŋ", + "image": "Image" + }, + "settings": { + "type": "Watermark Type", + "text": { + "label": "Watermark Text", + "placeholder": "Enter watermark text" + }, + "image": { + "label": "Watermark Image", + "choose": "Choose Image", + "selected": "Selected: {{filename}}" + }, + "fontSize": "ÎœÎ­ÎŗÎĩθÎŋĪ‚ ÎŗĪÎąÎŧÎŧÎąĪ„Îŋ΃ÎĩÎšĪÎŦĪ‚", + "size": "Size", + "alphabet": "Font/Language", + "color": "Watermark Colour", + "rotation": "Rotation (degrees)", + "opacity": "Opacity (%)", + "spacing": { + "horizontal": "Horizontal Spacing", + "vertical": "Vertical Spacing", + "height": "Height Spacing", + "width": "Width Spacing" + }, + "convertToImage": "Flatten PDF pages to images" + }, + "alphabet": { + "roman": "Roman/Latin", + "arabic": "Arabic", + "japanese": "Japanese", + "korean": "Korean", + "chinese": "Chinese", + "thai": "Thai" + }, + "steps": { + "type": "Watermark Type", + "wording": "Wording", + "textStyle": "Style", + "formatting": "Formatting", + "file": "Watermark File" + }, + "results": { + "title": "Watermark Results" + }, + "tooltip": { + "language": { + "title": "Language Support", + "text": "Choose the appropriate language setting to ensure proper font rendering for your text." + }, + "appearance": { + "title": "Appearance Settings", + "text": "Control how your watermark looks and blends with the document.", + "bullet1": "Rotation: -360° to 360° for angled watermarks", + "bullet2": "Opacity: 0-100% for transparency control", + "bullet3": "Lower opacity creates subtle watermarks" + }, + "spacing": { + "title": "Spacing Control", + "text": "Adjust the spacing between repeated watermarks across the page.", + "bullet1": "Width spacing: Horizontal distance between watermarks", + "bullet2": "Height spacing: Vertical distance between watermarks", + "bullet3": "Higher values create more spread out patterns" + }, + "type": { + "header": { + "title": "Watermark Type Selection" + }, + "description": { + "title": "Choose Your Watermark", + "text": "Select between text or image watermarks based on your needs." + }, + "text": { + "title": "Text Watermarks", + "text": "Perfect for adding copyright notices, company names, or confidentiality labels. Supports multiple languages and custom colours.", + "bullet1": "Customisable fonts and languages", + "bullet2": "Adjustable colours and transparency", + "bullet3": "Ideal for legal or branding text" + }, + "image": { + "title": "Image Watermarks", + "text": "Use logos, stamps, or any image as a watermark. Great for branding and visual identification.", + "bullet1": "Upload any image format", + "bullet2": "Maintains image quality", + "bullet3": "Perfect for logos and stamps" + } + }, + "wording": { + "header": { + "title": "Text Content" + }, + "text": { + "title": "Watermark Text", + "text": "Enter the text that will appear as your watermark across the document.", + "bullet1": "Keep it concise for better readability", + "bullet2": "Common examples: 'CONFIDENTIAL', 'DRAFT', company name", + "bullet3": "Emoji characters are not supported and will be filtered out" + } + }, + "textStyle": { + "header": { + "title": "Text Style" + }, + "color": { + "title": "Colour Selection", + "text": "Choose a colour that provides good contrast with your document content.", + "bullet1": "Light grey (#d3d3d3) for subtle watermarks", + "bullet2": "Black or dark colours for high contrast", + "bullet3": "Custom colours for branding purposes" + }, + "language": { + "title": "Language Support", + "text": "Choose the appropriate language setting to ensure proper font rendering." + } + }, + "file": { + "header": { + "title": "Image Upload" + }, + "upload": { + "title": "Image Selection", + "text": "Upload an image file to use as your watermark.", + "bullet1": "Supports common formats: PNG, JPG, GIF, BMP", + "bullet2": "PNG with transparency works best", + "bullet3": "Higher resolution images maintain quality better" + }, + "recommendations": { + "title": "Best Practices", + "text": "Tips for optimal image watermark results.", + "bullet1": "Use logos or stamps with transparent backgrounds", + "bullet2": "Simple designs work better than complex images", + "bullet3": "Consider the final document size when choosing resolution" + } + }, + "formatting": { + "header": { + "title": "Formatting & Layout" + }, + "size": { + "title": "Size Control", + "text": "Adjust the size of your watermark (text or image).", + "bullet1": "Larger sizes create more prominent watermarks" + }, + "appearance": { + "title": "Appearance Settings", + "text": "Control how your watermark looks and blends with the document.", + "bullet1": "Rotation: -360° to 360° for angled watermarks", + "bullet2": "Opacity: 0-100% for transparency control", + "bullet3": "Lower opacity creates subtle watermarks" + }, + "spacing": { + "title": "Spacing Control", + "text": "Adjust the spacing between repeated watermarks across the page.", + "bullet1": "Horizontal spacing: Distance between watermarks left to right", + "bullet2": "Vertical spacing: Distance between watermarks top to bottom", + "bullet3": "Higher values create more spread out patterns" + }, + "security": { + "title": "Security Option", + "text": "Convert the final PDF to an image-based format for enhanced security.", + "bullet1": "Prevents text selection and copying", + "bullet2": "Makes watermarks harder to remove", + "bullet3": "Results in larger file sizes", + "bullet4": "Best for sensitive or copyrighted content" + } + } + }, + "type": { + "1": "ΚÎĩίÎŧÎĩÎŊÎŋ", + "2": "ΕιÎēΌÎŊÎą" + }, + "tags": "ÎēÎĩίÎŧÎĩÎŊÎŋ,ÎĩĪ€ÎąÎŊÎąÎģÎąÎŧβιÎŊΌÎŧÎĩÎŊÎŋ,ÎĩĪ„ÎšÎēÎ­Ī„Îą,ΚδΚÎŋÎēĪ„ÎˇĪƒÎ¯Îą,Ī€ÎŊÎĩĪ…ÎŧÎąĪ„ÎšÎēÎŦ δΚÎēÎąÎšĪŽÎŧÎąĪ„Îą,ÎĩÎŧĪ€ÎŋĪÎšÎēΌ ĪƒÎŽÎŧÎą,ÎĩΚÎēΌÎŊÎą,jpg,ΆΉ΄ÎŋÎŗĪÎąĪ†Î¯Îą", "header": "Î ĪÎŋĪƒÎ¸ÎŽÎēΡ Ī…Î´ÎąĪ„ÎŋÎŗĪÎąĪ†ÎŽÎŧÎąĪ„ÎŋĪ‚", "customColor": "Î ĪÎŋĪƒÎąĪÎŧÎŋ΃ÎŧέÎŊÎŋ Ī‡ĪĪŽÎŧÎą ÎēÎĩΚÎŧέÎŊÎŋĪ…", "selectText": { @@ -755,17 +1506,6 @@ "8": "Î¤ĪĪ€ÎŋĪ‚ Ī…Î´ÎąĪ„ÎŋÎŗĪÎąĪ†ÎŽÎŧÎąĪ„ÎŋĪ‚:", "9": "ΕιÎēΌÎŊÎą Ī…Î´ÎąĪ„ÎŋÎŗĪÎąĪ†ÎŽÎŧÎąĪ„ÎŋĪ‚:", "10": "ΜÎĩĪ„ÎąĪ„ĪÎŋĪ€ÎŽ PDF ΃Îĩ PDF-ΕιÎēΌÎŊÎą" - }, - "submit": "Î ĪÎŋĪƒÎ¸ÎŽÎēΡ Ī…Î´ÎąĪ„ÎŋÎŗĪÎąĪ†ÎŽÎŧÎąĪ„ÎŋĪ‚", - "type": { - "1": "ΚÎĩίÎŧÎĩÎŊÎŋ", - "2": "ΕιÎēΌÎŊÎą" - }, - "watermarkType": { - "text": "ΚÎĩίÎŧÎĩÎŊÎŋ" - }, - "settings": { - "fontSize": "ÎœÎ­ÎŗÎĩθÎŋĪ‚ ÎŗĪÎąÎŧÎŧÎąĪ„Îŋ΃ÎĩÎšĪÎŦĪ‚" } }, "permissions": { @@ -790,50 +1530,201 @@ "removePages": { "tags": "ÎąĪ†ÎąÎ¯ĪÎĩĪƒÎˇ ΃ÎĩÎģÎ¯Î´Ī‰ÎŊ,Î´ÎšÎąÎŗĪÎąĪ†ÎŽ ΃ÎĩÎģÎ¯Î´Ī‰ÎŊ", "title": "Î‘Ī†ÎąÎ¯ĪÎĩĪƒÎˇ", + "pageNumbers": { + "label": "Pages to Remove", + "placeholder": "e.g., 1,3,5-8,10", + "error": "Invalid page number format. Use numbers, ranges (1-5), or mathematical expressions (2n+1)" + }, + "filenamePrefix": "pages_removed", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "settings": { + "title": "Settings" + }, + "tooltip": { + "header": { + "title": "Remove Pages Settings" + }, + "pageNumbers": { + "title": "Page Selection", + "text": "Specify which pages to remove from your PDF. You can select individual pages, ranges, or use mathematical expressions.", + "bullet1": "Individual pages: 1,3,5 (removes pages 1, 3, and 5)", + "bullet2": "Page ranges: 1-5,10-15 (removes pages 1-5 and 10-15)", + "bullet3": "Mathematical: 2n+1 (removes odd pages)", + "bullet4": "Open ranges: 5- (removes from page 5 to end)" + }, + "examples": { + "title": "Common Examples", + "text": "Here are some common page selection patterns:", + "bullet1": "Remove first page: 1", + "bullet2": "Remove last 3 pages: -3", + "bullet3": "Remove every other page: 2n", + "bullet4": "Remove specific scattered pages: 1,5,10,15" + }, + "safety": { + "title": "Safety Tips", + "text": "Important considerations when removing pages:", + "bullet1": "Always preview your selection before processing", + "bullet2": "Keep a backup of your original file", + "bullet3": "Page numbers start from 1, not 0", + "bullet4": "Invalid page numbers will be ignored" + } + }, + "error": { + "failed": "An error occurred whilst removing pages." + }, + "results": { + "title": "Page Removal Results" + }, "submit": "Î‘Ī†ÎąÎ¯ĪÎĩĪƒÎˇ" }, - "addPassword": { - "tags": "ÎąĪƒĪ†ÎŦÎģÎĩΚι,ÎąĪƒĪ†ÎŦÎģÎĩΚι", - "title": "Î ĪÎŋĪƒÎ¸ÎŽÎēΡ ÎēĪ‰Î´ÎšÎēÎŋĪ", - "header": "Î ĪÎŋĪƒÎ¸ÎŽÎēΡ ÎēĪ‰Î´ÎšÎēÎŋĪ (ÎšĪĪ…Ī€Ī„ÎŋÎŗĪÎŦĪ†ÎˇĪƒÎˇ)", - "selectText": { - "1": "Î•Ī€ÎšÎģÎ­ÎžĪ„Îĩ PDF ÎŗÎšÎą Îē΁΅΀΄ÎŋÎŗĪÎŦĪ†ÎˇĪƒÎˇ", - "2": "ÎšĪ‰Î´ÎšÎēĪŒĪ‚ Ī‡ĪÎŽĪƒĪ„Îˇ", - "3": "ΜήÎēÎŋĪ‚ ÎēÎģÎĩΚδΚÎŋĪ Îē΁΅΀΄ÎŋÎŗĪÎŦĪ†ÎˇĪƒÎˇĪ‚", - "4": "Οι Ī…ĪˆÎˇÎģĪŒĪ„Îĩ΁ÎĩĪ‚ Ī„ÎšÎŧÎ­Ī‚ ÎĩίÎŊιΚ ÎšĪƒĪ‡Ī…ĪĪŒĪ„Îĩ΁ÎĩĪ‚, ÎąÎģÎģÎŦ ÎŋΚ Ī‡ÎąÎŧΡÎģĪŒĪ„Îĩ΁ÎĩĪ‚ Ī„ÎšÎŧÎ­Ī‚ Î­Ī‡ÎŋĪ…ÎŊ ÎēÎąÎģĪĪ„ÎĩĪÎˇ ĪƒĪ…ÎŧÎ˛ÎąĪ„ĪŒĪ„ÎˇĪ„Îą.", - "5": "ΔιÎēÎąÎšĪŽÎŧÎąĪ„Îą ΀΁ÎŋĪ‚ ÎŋĪÎšĪƒÎŧΌ (ÎŖĪ…ÎŊÎšĪƒĪ„ÎŦĪ„ÎąÎš ÎŊÎą Ī‡ĪÎˇĪƒÎšÎŧÎŋĪ€ÎŋΚÎĩÎ¯Ī„ÎąÎš ÎŧÎąÎļί ÎŧÎĩ ÎēĪ‰Î´ÎšÎēΌ ΚδΚÎŋÎēĪ„ÎŽĪ„Îˇ)", - "6": "Î‘Ī€Îŋ΄΁ÎŋĪ€ÎŽ ĪƒĪ…ÎŊÎąĪÎŧÎŋÎģĪŒÎŗÎˇĪƒÎˇĪ‚ ÎĩÎŗÎŗĪÎŦΆÎŋĪ…", - "7": "Î‘Ī€Îŋ΄΁ÎŋĪ€ÎŽ ÎĩÎžÎąÎŗĪ‰ÎŗÎŽĪ‚ Ī€ÎĩĪÎšÎĩ·ÎŋÎŧέÎŊÎŋĪ…", - "8": "Î‘Ī€Îŋ΄΁ÎŋĪ€ÎŽ ÎĩÎžÎąÎŗĪ‰ÎŗÎŽĪ‚ ÎŗÎšÎą ΀΁ÎŋĪƒÎ˛ÎąĪƒÎšÎŧĪŒĪ„ÎˇĪ„Îą", - "9": "Î‘Ī€Îŋ΄΁ÎŋĪ€ÎŽ ĪƒĪ…ÎŧĪ€ÎģÎŽĪĪ‰ĪƒÎˇĪ‚ Ī†ĪŒĪÎŧÎąĪ‚", - "10": "Î‘Ī€Îŋ΄΁ÎŋĪ€ÎŽ ΄΁ÎŋĪ€ÎŋĪ€ÎŋÎ¯ÎˇĪƒÎˇĪ‚", - "11": "Î‘Ī€Îŋ΄΁ÎŋĪ€ÎŽ ΄΁ÎŋĪ€ÎŋĪ€ÎŋÎ¯ÎˇĪƒÎˇĪ‚ ĪƒĪ‡ÎŋÎģÎšÎąĪƒÎŧĪŽÎŊ", - "12": "Î‘Ī€Îŋ΄΁ÎŋĪ€ÎŽ ÎĩÎēĪ„ĪĪ€Ī‰ĪƒÎˇĪ‚", - "13": "Î‘Ī€Îŋ΄΁ÎŋĪ€ÎŽ ÎĩÎēĪ„ĪĪ€Ī‰ĪƒÎˇĪ‚ ΃Îĩ Î´ÎšÎąĪ†Îŋ΁ÎĩĪ„ÎšÎēÎ­Ī‚ ÎŧÎŋĪĪ†Î­Ī‚", - "14": "ÎšĪ‰Î´ÎšÎēĪŒĪ‚ ΚδΚÎŋÎēĪ„ÎŽĪ„Îˇ", - "15": "ΠÎĩĪÎšÎŋĪÎ¯ÎļÎĩΚ Ī„Îš ÎŧĪ€Îŋ΁Îĩί ÎŊÎą ÎŗÎ¯ÎŊÎĩΚ ÎŧÎĩ Ī„Îŋ Î­ÎŗÎŗĪÎąĪ†Îŋ ÎŧÎĩĪ„ÎŦ Ī„Îŋ ÎŦÎŊÎŋÎšÎŗÎŧÎŦ Ī„ÎŋĪ… (ΔÎĩÎŊ Ī…Ī€ÎŋĪƒĪ„ÎˇĪÎ¯ÎļÎĩĪ„ÎąÎš ÎąĪ€ĪŒ ΌÎģÎą Ī„Îą ΀΁ÎŋÎŗĪÎŦÎŧÎŧÎąĪ„Îą ÎąÎŊÎŦÎŗÎŊĪ‰ĪƒÎˇĪ‚)", - "16": "ΠÎĩĪÎšÎŋĪÎ¯ÎļÎĩΚ Ī„Îŋ ÎŦÎŊÎŋÎšÎŗÎŧÎą Ī„ÎŋĪ… ίδΚÎŋĪ… Ī„ÎŋĪ… ÎĩÎŗÎŗĪÎŦΆÎŋĪ…" + "extractPages": { + "title": "Extract Pages", + "pageNumbers": { + "label": "Pages to Extract", + "placeholder": "e.g., 1,3,5-8 or odd & 1-10" + }, + "settings": { + "title": "Settings" }, - "submit": "ÎšĪĪ…Ī€Ī„ÎŋÎŗĪÎŦĪ†ÎˇĪƒÎˇ", "tooltip": { - "permissions": { - "title": "ΑÎģÎģÎąÎŗÎŽ δΚÎēÎąÎšĪ‰ÎŧÎŦ΄ΉÎŊ" + "description": "Extracts the selected pages into a new PDF, preserving order." + }, + "error": { + "failed": "Failed to extract pages" + }, + "results": { + "title": "Pages Extracted" + }, + "submit": "Extract Pages" + }, + "pageSelection": { + "tooltip": { + "header": { + "title": "Page Selection Guide" + }, + "basic": { + "title": "Basic Usage", + "text": "Select specific pages from your PDF document using simple syntax.", + "bullet1": "Individual pages: 1,3,5", + "bullet2": "Page ranges: 3-6 or 10-15", + "bullet3": "All pages: all" + }, + "advanced": { + "title": "Advanced Features" + }, + "tips": { + "title": "Tips", + "text": "Keep these guidelines in mind:", + "bullet1": "Page numbers start from 1 (not 0)", + "bullet2": "Spaces are automatically removed", + "bullet3": "Invalid expressions are ignored" + }, + "syntax": { + "title": "Syntax Basics", + "text": "Use numbers, ranges, keywords, and progressions (n starts at 0). Parentheses are supported.", + "bullets": { + "numbers": "Numbers/ranges: 5, 10-20", + "keywords": "Keywords: odd, even", + "progressions": "Progressions: 3n, 4n+1" + } + }, + "operators": { + "title": "Operators", + "text": "AND has higher precedence than comma. NOT applies within the document range.", + "and": "AND: & or \"and\" — require both conditions (e.g., 1-50 & even)", + "comma": "Comma: , or | — combine selections (e.g., 1-10, 20)", + "not": "NOT: ! or \"not\" — exclude pages (e.g., 3n & not 30)" + }, + "examples": { + "title": "Examples" + }, + "complex": { + "bullet1": "1,3-5,8,2n → pages 1, 3–5, 8, plus evens", + "bullet2": "10-,2n-1 → from page 10 to end + odd pages", + "description": "Mix different types.", + "title": "Complex Combinations" + }, + "description": "Choose which pages to use for the operation. Supports single pages, ranges, formulas, and the all keyword.", + "individual": { + "bullet1": "1,3,5 → selects pages 1, 3, 5", + "bullet2": "2,7,12 → selects pages 2, 7, 12", + "description": "Enter numbers separated by commas.", + "title": "Individual Pages" + }, + "mathematical": { + "bullet1": "2n → all even pages (2, 4, 6â€Ļ)", + "bullet2": "2n-1 → all odd pages (1, 3, 5â€Ļ)", + "bullet3": "3n → every 3rd page (3, 6, 9â€Ļ)", + "bullet4": "4n-1 → pages 3, 7, 11, 15â€Ļ", + "description": "Use n in formulas for patterns.", + "title": "Mathematical Functions" + }, + "ranges": { + "bullet1": "3-6 → selects pages 3–6", + "bullet2": "10-15 → selects pages 10–15", + "bullet3": "5- → selects pages 5 to end", + "description": "Use - for consecutive pages.", + "title": "Page Ranges" + }, + "special": { + "bullet1": "all → selects all pages", + "title": "Special Keywords" } } }, - "removePassword": { - "tags": "ÎąĪƒĪ†ÎŦÎģÎĩΚι,ÎąĪ€ÎŋÎē΁΅΀΄ÎŋÎŗĪÎŦĪ†ÎˇĪƒÎˇ,ÎąĪƒĪ†ÎŦÎģÎĩΚι,ÎąĪ†ÎąÎ¯ĪÎĩĪƒÎˇ ÎēĪ‰Î´ÎšÎēÎŋĪ,Î´ÎšÎąÎŗĪÎąĪ†ÎŽ ÎēĪ‰Î´ÎšÎēÎŋĪ", - "title": "Î‘Ī†ÎąÎ¯ĪÎĩĪƒÎˇ ÎēĪ‰Î´ÎšÎēÎŋĪ", - "header": "Î‘Ī†ÎąÎ¯ĪÎĩĪƒÎˇ ÎēĪ‰Î´ÎšÎēÎŋĪ (Î‘Ī€ÎŋÎē΁΅΀΄ÎŋÎŗĪÎŦĪ†ÎˇĪƒÎˇ)", - "selectText": { - "1": "Î•Ī€ÎšÎģÎ­ÎžĪ„Îĩ PDF ÎŗÎšÎą ÎąĪ€ÎŋÎē΁΅΀΄ÎŋÎŗĪÎŦĪ†ÎˇĪƒÎˇ", - "2": "ÎšĪ‰Î´ÎšÎēĪŒĪ‚" + "bulkSelection": { + "syntaxError": "There is a syntax issue. See Page Selection tips for help.", + "header": { + "title": "Page Selection Guide" }, - "submit": "Î‘Ī†ÎąÎ¯ĪÎĩĪƒÎˇ", - "desc": "Î‘Ī†ÎąÎ¯ĪÎĩĪƒÎˇ ΀΁ÎŋĪƒĪ„ÎąĪƒÎ¯ÎąĪ‚ ÎēĪ‰Î´ÎšÎēÎŋĪ ÎąĪ€ĪŒ Ī„Îŋ Î­ÎŗÎŗĪÎąĪ†Îŋ PDF.", - "password": { - "stepTitle": "Î‘Ī†ÎąÎ¯ĪÎĩĪƒÎˇ ÎēĪ‰Î´ÎšÎēÎŋĪ", - "label": "Î¤ĪÎ­Ī‡Ī‰ÎŊ ÎēĪ‰Î´ÎšÎēĪŒĪ‚" + "syntax": { + "title": "Syntax Basics", + "text": "Use numbers, ranges, keywords, and progressions (n starts at 0). Parentheses are supported.", + "bullets": { + "numbers": "Numbers/ranges: 5, 10-20", + "keywords": "Keywords: odd, even", + "progressions": "Progressions: 3n, 4n+1" + } + }, + "operators": { + "title": "Operators", + "text": "AND has higher precedence than comma. NOT applies within the document range.", + "and": "AND: & or \"and\" — require both conditions (e.g., 1-50 & even)", + "comma": "Comma: , or | — combine selections (e.g., 1-10, 20)", + "not": "NOT: ! or \"not\" — exclude pages (e.g., 3n & not 30)" + }, + "examples": { + "title": "Examples", + "first50": "First 50", + "last50": "Last 50", + "every3rd": "Every 3rd", + "oddWithinExcluding": "Odd within 1-20 excluding 5-7", + "combineSets": "Combine sets" + }, + "firstNPages": { + "title": "First N Pages", + "placeholder": "Number of pages" + }, + "lastNPages": { + "title": "Last N Pages", + "placeholder": "Number of pages" + }, + "everyNthPage": { + "title": "Every Nth Page", + "placeholder": "Step size" + }, + "range": { + "title": "Range", + "fromPlaceholder": "From", + "toPlaceholder": "To" + }, + "keywords": { + "title": "Keywords" + }, + "advanced": { + "title": "Advanced" } }, "compressPdfs": { @@ -843,12 +1734,142 @@ "tags": "remove,delete,form,field,readonly", "title": "Remove Read-Only from Form Fields", "header": "Unlock PDF Forms", - "submit": "Remove" + "submit": "Remove", + "description": "This tool will remove read-only restrictions from PDF form fields, making them editable and fillable.", + "filenamePrefix": "unlocked_forms", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst unlocking PDF forms." + }, + "results": { + "title": "Unlocked Forms Results" + } }, "changeMetadata": { - "tags": "Ī„Î¯Ī„ÎģÎŋĪ‚,ĪƒĪ…ÎŗÎŗĪÎąĪ†Î­ÎąĪ‚,ΡÎŧÎĩ΁ÎŋÎŧΡÎŊÎ¯Îą,δΡÎŧΚÎŋĪ…ĪÎŗÎ¯Îą,Ī‡ĪĪŒÎŊÎŋĪ‚,ÎĩÎēÎ´ĪŒĪ„ÎˇĪ‚,Ī€ÎąĪÎąÎŗĪ‰ÎŗĪŒĪ‚,ĪƒĪ„ÎąĪ„ÎšĪƒĪ„ÎšÎēÎŦ", - "title": "Î¤Î¯Ī„ÎģÎŋĪ‚:", "header": "ΑÎģÎģÎąÎŗÎŽ ÎŧÎĩĪ„ÎąÎ´ÎĩδÎŋÎŧέÎŊΉÎŊ", + "submit": "ΑÎģÎģÎąÎŗÎŽ", + "filenamePrefix": "metadata", + "settings": { + "title": "Metadata Settings" + }, + "standardFields": { + "title": "Standard Fields" + }, + "deleteAll": { + "label": "Remove Existing Metadata", + "checkbox": "Delete all metadata" + }, + "title": { + "label": "Title", + "placeholder": "Document title" + }, + "author": { + "label": "Author", + "placeholder": "Document author" + }, + "subject": { + "label": "Subject", + "placeholder": "Document subject" + }, + "keywords": { + "label": "Keywords", + "placeholder": "Document keywords" + }, + "creator": { + "label": "Creator", + "placeholder": "Document creator" + }, + "producer": { + "label": "Producer", + "placeholder": "Document producer" + }, + "dates": { + "title": "Date Fields" + }, + "creationDate": { + "label": "Creation Date", + "placeholder": "Creation date" + }, + "modificationDate": { + "label": "Modification Date", + "placeholder": "Modification date" + }, + "trapped": { + "label": "Trapped Status", + "unknown": "Unknown", + "true": "True", + "false": "False" + }, + "advanced": { + "title": "Advanced Options" + }, + "customFields": { + "title": "Custom Metadata", + "description": "Add custom metadata fields to the document", + "add": "Add Field", + "key": "Key", + "keyPlaceholder": "Custom key", + "value": "Value", + "valuePlaceholder": "Custom value", + "remove": "Remove" + }, + "results": { + "title": "Updated PDFs" + }, + "error": { + "failed": "An error occurred while changing the PDF metadata." + }, + "tooltip": { + "header": { + "title": "PDF Metadata Overview" + }, + "standardFields": { + "title": "Standard Fields", + "text": "Common PDF metadata fields that describe the document.", + "bullet1": "Title: Document name or heading", + "bullet2": "Author: Person who created the document", + "bullet3": "Subject: Brief description of content", + "bullet4": "Keywords: Search terms for the document", + "bullet5": "Creator/Producer: Software used to create the PDF" + }, + "dates": { + "title": "Date Fields", + "text": "When the document was created and modified.", + "bullet1": "Creation Date: When original document was made", + "bullet2": "Modification Date: When last changed" + }, + "options": { + "title": "Additional Options", + "text": "Custom fields and privacy controls.", + "bullet1": "Custom Metadata: Add your own key-value pairs", + "bullet2": "Trapped Status: High-quality printing setting", + "bullet3": "Delete All: Remove all metadata for privacy" + }, + "deleteAll": { + "title": "Remove Existing Metadata", + "text": "Complete metadata deletion to ensure privacy." + }, + "customFields": { + "title": "Custom Metadata", + "text": "Add your own custom key-value metadata pairs.", + "bullet1": "Add any custom fields relevant to your document", + "bullet2": "Examples: Department, Project, Version, Status", + "bullet3": "Both key and value are required for each entry" + }, + "advanced": { + "title": "Advanced Options", + "trapped": { + "title": "Trapped Status", + "description": "Indicates if document is prepared for high-quality printing.", + "bullet1": "True: Document has been trapped for printing", + "bullet2": "False: Document has not been trapped", + "bullet3": "Unknown: Trapped status is not specified" + } + } + }, + "tags": "Ī„Î¯Ī„ÎģÎŋĪ‚,ĪƒĪ…ÎŗÎŗĪÎąĪ†Î­ÎąĪ‚,ΡÎŧÎĩ΁ÎŋÎŧΡÎŊÎ¯Îą,δΡÎŧΚÎŋĪ…ĪÎŗÎ¯Îą,Ī‡ĪĪŒÎŊÎŋĪ‚,ÎĩÎēÎ´ĪŒĪ„ÎˇĪ‚,Ī€ÎąĪÎąÎŗĪ‰ÎŗĪŒĪ‚,ĪƒĪ„ÎąĪ„ÎšĪƒĪ„ÎšÎēÎŦ", "selectText": { "1": "Î ÎąĪÎąÎēÎąÎģĪŽ ÎĩĪ€ÎĩΞÎĩĪÎŗÎąĪƒĪ„ÎĩÎ¯Ī„Îĩ Ī„ÎšĪ‚ ÎŧÎĩĪ„ÎąÎ˛ÎģÎˇĪ„Î­Ī‚ Ī€ÎŋĪ… ÎĩĪ€ÎšÎ¸Ī…ÎŧÎĩÎ¯Ī„Îĩ ÎŊÎą ÎąÎģÎģÎŦΞÎĩĪ„Îĩ", "2": "Î”ÎšÎąÎŗĪÎąĪ†ÎŽ ΌÎģΉÎŊ ΄ΉÎŊ ÎŧÎĩĪ„ÎąÎ´ÎĩδÎŋÎŧέÎŊΉÎŊ", @@ -856,15 +1877,7 @@ "4": "ΆÎģÎģÎą ÎŧÎĩĪ„ÎąÎ´ÎĩδÎŋÎŧέÎŊÎą:", "5": "Î ĪÎŋĪƒÎ¸ÎŽÎēΡ ΀΁ÎŋĪƒÎąĪÎŧÎŋ΃ÎŧέÎŊÎˇĪ‚ ÎēÎąĪ„ÎąĪ‡ĪŽĪÎˇĪƒÎˇĪ‚ ÎŧÎĩĪ„ÎąÎ´ÎĩδÎŋÎŧέÎŊΉÎŊ" }, - "author": "ÎŖĪ…ÎŗÎŗĪÎąĪ†Î­ÎąĪ‚:", - "creationDate": "ΗÎŧÎĩ΁ÎŋÎŧΡÎŊÎ¯Îą δΡÎŧΚÎŋĪ…ĪÎŗÎ¯ÎąĪ‚ (yyyy/MM/dd HH:mm:ss):", - "creator": "ΔηÎŧΚÎŋĪ…ĪÎŗĪŒĪ‚:", - "keywords": "ΛέξÎĩÎšĪ‚-ÎēÎģÎĩΚδΚÎŦ:", - "modDate": "ΗÎŧÎĩ΁ÎŋÎŧΡÎŊÎ¯Îą ΄΁ÎŋĪ€ÎŋĪ€ÎŋÎ¯ÎˇĪƒÎˇĪ‚ (yyyy/MM/dd HH:mm:ss):", - "producer": "Î ÎąĪÎąÎŗĪ‰ÎŗĪŒĪ‚:", - "subject": "ΘέÎŧÎą:", - "trapped": "Î ÎąÎŗÎšÎ´ÎĩĪ…ÎŧέÎŊÎŋ:", - "submit": "ΑÎģÎģÎąÎŗÎŽ" + "modDate": "ΗÎŧÎĩ΁ÎŋÎŧΡÎŊÎ¯Îą ΄΁ÎŋĪ€ÎŋĪ€ÎŋÎ¯ÎˇĪƒÎˇĪ‚ (yyyy/MM/dd HH:mm:ss):" }, "fileToPDF": { "tags": "ÎŧÎĩĪ„ÎąĪ„ĪÎŋĪ€ÎŽ,ÎŧÎŋĪĪ†ÎŽ,Î­ÎŗÎŗĪÎąĪ†Îŋ,ÎĩΚÎēΌÎŊÎą,Ī€ÎąĪÎŋĪ…ĪƒÎ¯ÎąĪƒÎˇ,ÎēÎĩίÎŧÎĩÎŊÎŋ,ÎŧÎĩĪ„ÎąĪ„ĪÎŋĪ€ÎŽ,ÎŗĪÎąĪ†ÎĩίÎŋ,Î­ÎŗÎŗĪÎąĪ†Îą,word,excel,powerpoint", @@ -878,6 +1891,7 @@ "ocr": { "tags": "ÎąÎŊÎąÎŗÎŊĪŽĪÎšĪƒÎˇ,ÎēÎĩίÎŧÎĩÎŊÎŋ,ÎĩΚÎēΌÎŊÎą,΃ÎŦĪĪ‰ĪƒÎˇ,ÎąÎŊÎŦÎŗÎŊĪ‰ĪƒÎˇ,ÎąÎŊÎąÎŗÎŊĪŽĪÎšĪƒÎˇ,ÎąÎŊÎ¯Ī‡ÎŊÎĩĪ…ĪƒÎˇ,ÎĩĪ€ÎĩΞÎĩĪÎŗÎŦĪƒÎšÎŧÎŋ", "title": "OCR / ÎšÎąÎ¸ÎąĪÎšĪƒÎŧĪŒĪ‚ ĪƒÎąĪĪŽĪƒÎĩΉÎŊ", + "desc": "ÎšÎąÎ¸ÎąĪÎšĪƒÎŧĪŒĪ‚ ĪƒÎąĪĪŽĪƒÎĩΉÎŊ ÎēιΚ ÎąÎŊÎ¯Ī‡ÎŊÎĩĪ…ĪƒÎˇ ÎēÎĩΚÎŧέÎŊÎŋĪ… ÎąĪ€ĪŒ ÎĩΚÎēΌÎŊÎĩĪ‚ ÎŧÎ­ĪƒÎą ΃Îĩ PDF ÎēιΚ ÎĩĪ€ÎąÎŊÎąĪ€ĪÎŋĪƒÎ¸ÎŽÎēΡ Ή΂ ÎēÎĩίÎŧÎĩÎŊÎŋ.", "header": "ÎšÎąÎ¸ÎąĪÎšĪƒÎŧĪŒĪ‚ ĪƒÎąĪĪŽĪƒÎĩΉÎŊ / OCR (ÎŸĪ€Ī„ÎšÎēÎŽ ÎąÎŊÎąÎŗÎŊĪŽĪÎšĪƒÎˇ Ī‡ÎąĪÎąÎēĪ„ÎŽĪĪ‰ÎŊ)", "selectText": { "1": "Î•Ī€ÎšÎģÎ­ÎžĪ„Îĩ ÎŗÎģĪŽĪƒĪƒÎĩĪ‚ Ī€ÎŋĪ… θι ÎąÎŊÎšĪ‡ÎŊÎĩĪ…Î¸ÎŋĪÎŊ ÎŧÎ­ĪƒÎą ĪƒĪ„Îŋ PDF (Î‘Ī…Ī„Î­Ī‚ Ī€ÎŋĪ… ÎĩÎŧĪ†ÎąÎŊίÎļÎŋÎŊĪ„ÎąÎš ÎĩίÎŊιΚ ÎąĪ…Ī„Î­Ī‚ Ī€ÎŋĪ… ÎąÎŊÎšĪ‡ÎŊÎĩĪÎŋÎŊĪ„ÎąÎš ÎąĪ…Ī„ÎŽ Ī„Îˇ ĪƒĪ„ÎšÎŗÎŧÎŽ):", @@ -896,23 +1910,89 @@ "help": "Î ÎąĪÎąÎēÎąÎģĪŽ δΚιβÎŦĪƒĪ„Îĩ ÎąĪ…Ī„ÎŽ Ī„ÎˇÎŊ Ī„ÎĩÎēÎŧÎˇĪÎ¯Ī‰ĪƒÎˇ ÎŗÎšÎą Ī„Îŋ Ī€ĪŽĪ‚ ÎŊÎą Ī„Îŋ Ī‡ĪÎˇĪƒÎšÎŧÎŋĪ€ÎŋÎšÎŽĪƒÎĩĪ„Îĩ ÎŗÎšÎą ÎŦÎģÎģÎĩĪ‚ ÎŗÎģĪŽĪƒĪƒÎĩĪ‚ ÎŽ/ÎēιΚ Ī‡ĪÎŽĪƒÎˇ ÎĩÎēĪ„ĪŒĪ‚ docker", "credit": "Î‘Ī…Ī„ÎŽ Ρ Ī…Ī€ÎˇĪÎĩĪƒÎ¯Îą Ī‡ĪÎˇĪƒÎšÎŧÎŋĪ€ÎŋΚÎĩί qpdf ÎēιΚ Tesseract ÎŗÎšÎą OCR.", "submit": "Î•Ī€ÎĩΞÎĩĪÎŗÎąĪƒÎ¯Îą PDF ÎŧÎĩ OCR", - "desc": "ÎšÎąÎ¸ÎąĪÎšĪƒÎŧĪŒĪ‚ ĪƒÎąĪĪŽĪƒÎĩΉÎŊ ÎēιΚ ÎąÎŊÎ¯Ī‡ÎŊÎĩĪ…ĪƒÎˇ ÎēÎĩΚÎŧέÎŊÎŋĪ… ÎąĪ€ĪŒ ÎĩΚÎēΌÎŊÎĩĪ‚ ÎŧÎ­ĪƒÎą ΃Îĩ PDF ÎēιΚ ÎĩĪ€ÎąÎŊÎąĪ€ĪÎŋĪƒÎ¸ÎŽÎēΡ Ή΂ ÎēÎĩίÎŧÎĩÎŊÎŋ.", + "operation": { + "submit": "Process OCR and Review" + }, + "results": { + "title": "OCR Results" + }, + "languagePicker": { + "additionalLanguages": "Looking for additional languages?", + "viewSetupGuide": "View setup guide →" + }, "settings": { "title": "ÎĄĪ…Î¸ÎŧÎ¯ĪƒÎĩÎšĪ‚", "ocrMode": { - "label": "ΛÎĩÎšĪ„ÎŋĪ…ĪÎŗÎ¯Îą OCR" + "label": "ΛÎĩÎšĪ„ÎŋĪ…ĪÎŗÎ¯Îą OCR", + "auto": "Auto (skip text layers)", + "force": "Force (re-OCR all, replace text)", + "strict": "Strict (abort if text found)" }, "languages": { - "label": "ΓÎģĪŽĪƒĪƒÎĩĪ‚" + "label": "ΓÎģĪŽĪƒĪƒÎĩĪ‚", + "placeholder": "Select languages" + }, + "compatibilityMode": { + "label": "Compatibility Mode" + }, + "advancedOptions": { + "label": "Processing Options", + "sidecar": "Create a text file", + "deskew": "Deskew pages", + "clean": "Clean input file", + "cleanFinal": "Clean final output" } }, "tooltip": { + "header": { + "title": "OCR Settings Overview" + }, "mode": { - "title": "ΛÎĩÎšĪ„ÎŋĪ…ĪÎŗÎ¯Îą OCR" + "title": "ΛÎĩÎšĪ„ÎŋĪ…ĪÎŗÎ¯Îą OCR", + "text": "Optical Character Recognition (OCR) helps you turn scanned or screenshotted pages into text you can search, copy, or highlight.", + "bullet1": "Auto skips pages that already contain text layers.", + "bullet2": "Force re-OCRs every page and replaces all the text.", + "bullet3": "Strict halts if any selectable text is found." }, "languages": { - "title": "ΓÎģĪŽĪƒĪƒÎĩĪ‚" + "title": "ΓÎģĪŽĪƒĪƒÎĩĪ‚", + "text": "Improve OCR accuracy by specifying the expected languages. Choose one or more languages to guide detection." + }, + "output": { + "title": "Output", + "text": "Decide how you want the text output formatted:", + "bullet1": "Searchable PDF embeds text behind the original image.", + "bullet2": "HOCR XML returns a structured machine-readable file.", + "bullet3": "Plain-text sidecar creates a separate .txt file with raw content." + }, + "advanced": { + "header": { + "title": "Advanced OCR Processing" + }, + "compatibility": { + "title": "Compatibility Mode", + "text": "Uses OCR 'sandwich PDF' mode: results in larger files, but more reliable with certain languages and older PDF software. By default we use hOCR for smaller, modern PDFs." + }, + "sidecar": { + "title": "Create Text File", + "text": "Generates a separate .txt file alongside the PDF containing all extracted text content for easy access and processing." + }, + "deskew": { + "title": "Deskew Pages", + "text": "Automatically corrects skewed or tilted pages to improve OCR accuracy. Useful for scanned documents that weren't perfectly aligned." + }, + "clean": { + "title": "Clean Input File", + "text": "Preprocesses the input by removing noise, enhancing contrast, and optimising the image for better OCR recognition before processing." + }, + "cleanFinal": { + "title": "Clean Final Output", + "text": "Post-processes the final PDF by removing OCR artefacts and optimising the text layer for better readability and smaller file size." + } } + }, + "error": { + "failed": "OCR operation failed" } }, "extractImages": { @@ -921,7 +2001,13 @@ "header": "Î•ÎžÎąÎŗĪ‰ÎŗÎŽ ÎĩΚÎēΌÎŊΉÎŊ", "selectText": "Î•Ī€ÎšÎģÎ­ÎžĪ„Îĩ ÎŧÎŋĪĪ†ÎŽ ÎĩΚÎēΌÎŊÎąĪ‚ ÎŗÎšÎą ÎŧÎĩĪ„ÎąĪ„ĪÎŋĪ€ÎŽ ΄ΉÎŊ ÎĩÎžÎąÎŗĪŒÎŧÎĩÎŊΉÎŊ ÎĩΚÎēΌÎŊΉÎŊ", "allowDuplicates": "Î‘Ī€ÎŋθΎÎēÎĩĪ…ĪƒÎˇ Î´ÎšĪ€ÎģĪŒĪ„Ī…Ī€Ī‰ÎŊ ÎĩΚÎēΌÎŊΉÎŊ", - "submit": "Î•ÎžÎąÎŗĪ‰ÎŗÎŽ" + "submit": "Î•ÎžÎąÎŗĪ‰ÎŗÎŽ", + "settings": { + "title": "Settings" + }, + "error": { + "failed": "An error occurred while extracting images from the PDF." + } }, "pdfToPDFA": { "tags": "ÎąĪĪ‡ÎĩίÎŋ,ÎŧÎąÎē΁ÎŋĪ‡ĪĪŒÎŊΚÎŋ,Ī€ĪĪŒĪ„Ī…Ī€Îŋ,ÎŧÎĩĪ„ÎąĪ„ĪÎŋĪ€ÎŽ,ÎąĪ€ÎŋθΎÎēÎĩĪ…ĪƒÎˇ,Î´ÎšÎąĪ„ÎŽĪÎˇĪƒÎˇ", @@ -993,17 +2079,53 @@ }, "info": "Η Python δÎĩÎŊ ÎĩίÎŊιΚ ÎĩÎŗÎēÎąĪ„ÎĩĪƒĪ„ÎˇÎŧέÎŊΡ. Î‘Ī€ÎąÎšĪ„ÎĩÎ¯Ī„ÎąÎš ÎŗÎšÎą ÎĩÎēĪ„Î­ÎģÎĩĪƒÎˇ." }, + "scannerImageSplit": { + "title": "Extracted Images", + "submit": "Extract Image Scans", + "error": { + "failed": "An error occurred while extracting image scans." + }, + "tooltip": { + "title": "Photo Splitter", + "whatThisDoes": "What this does", + "whatThisDoesDesc": "Automatically finds and extracts each photo from a scanned page or composite image—no manual cropping.", + "whenToUse": "When to use", + "useCase1": "Scan whole album pages in one go", + "useCase2": "Split flatbed batches into separate files", + "useCase3": "Break collages into individual photos", + "useCase4": "Pull photos from documents", + "quickFixes": "Quick fixes", + "problem1": "Photos not detected → increase Tolerance to 30-50", + "problem2": "Too many false detections → increase Minimum Area to 15,000-20,000", + "problem3": "Crops are too tight → increase Border Size to 5-10", + "problem4": "Tilted photos not straightened → lower Angle Threshold to ~5°", + "problem5": "Dust/noise boxes → increase Minimum Contour Area to 1000-2000", + "setupTips": "Setup tips", + "tip1": "Use a plain, light background", + "tip2": "Leave a small gap (≈1 cm) between photos", + "tip3": "Scan at 300-600 DPI", + "tip4": "Clean the scanner glass", + "headsUp": "Heads-up", + "headsUpDesc": "Overlapping photos or backgrounds very close in colour to the photos can reduce accuracy-try a lighter or darker background and leave more space." + } + }, "sign": { - "tags": "ÎĩΞÎŋĪ…ĪƒÎšÎŋÎ´ĪŒĪ„ÎˇĪƒÎˇ,ÎąĪĪ‡ÎšÎēÎŦ,ĪƒĪ‡ÎĩÎ´ÎšÎąĪƒÎŧέÎŊΡ-Ī…Ī€ÎŋÎŗĪÎąĪ†ÎŽ,Ī…Ī€ÎŋÎŗĪÎąĪ†ÎŽ-ÎēÎĩΚÎŧέÎŊÎŋĪ…,Ī…Ī€ÎŋÎŗĪÎąĪ†ÎŽ-ÎĩΚÎēΌÎŊÎąĪ‚", "title": "ÎĨĪ€ÎŋÎŗĪÎąĪ†ÎŽ", "header": "ÎĨĪ€ÎŋÎŗĪÎąĪ†ÎŽ PDF", "upload": "ΜÎĩĪ„ÎąĪ†ĪŒĪĪ„Ī‰ĪƒÎˇ ÎĩΚÎēΌÎŊÎąĪ‚", - "draw": "ÎŖĪ‡ÎĩÎ´Î¯ÎąĪƒÎˇ Ī…Ī€ÎŋÎŗĪÎąĪ†ÎŽĪ‚", - "text": "Î•ÎšĪƒÎąÎŗĪ‰ÎŗÎŽ ÎēÎĩΚÎŧέÎŊÎŋĪ…", + "draw": { + "title": "Draw your signature", + "clear": "Clear" + }, + "text": { + "name": "Signer Name", + "placeholder": "Enter your full name" + }, "clear": "ÎšÎąÎ¸ÎąĪÎšĪƒÎŧĪŒĪ‚", "add": "Î ĪÎŋĪƒÎ¸ÎŽÎēΡ", "saved": "Î‘Ī€ÎŋθΡÎēÎĩĪ…ÎŧέÎŊÎĩĪ‚ Ī…Ī€ÎŋÎŗĪÎąĪ†Î­Ī‚", "save": "Î‘Ī€ÎŋθΎÎēÎĩĪ…ĪƒÎˇ Ī…Ī€ÎŋÎŗĪÎąĪ†ÎŽĪ‚", + "applySignatures": "Apply Signatures", "personalSigs": "Î ĪÎŋĪƒĪ‰Ī€ÎšÎēÎ­Ī‚ Ī…Ī€ÎŋÎŗĪÎąĪ†Î­Ī‚", "sharedSigs": "ΚÎŋΚÎŊĪŒĪ‡ĪÎˇĪƒĪ„ÎĩĪ‚ Ī…Ī€ÎŋÎŗĪÎąĪ†Î­Ī‚", "noSavedSigs": "ΔÎĩÎŊ Î˛ĪÎ­Î¸ÎˇÎēÎąÎŊ ÎąĪ€ÎŋθΡÎēÎĩĪ…ÎŧέÎŊÎĩĪ‚ Ī…Ī€ÎŋÎŗĪÎąĪ†Î­Ī‚", @@ -1015,42 +2137,179 @@ "previous": "Î ĪÎŋÎˇÎŗÎŋĪÎŧÎĩÎŊΡ ΃ÎĩÎģÎ¯Î´Îą", "maintainRatio": "ΕÎŊÎąÎģÎģÎąÎŗÎŽ Î´ÎšÎąĪ„ÎŽĪÎˇĪƒÎˇĪ‚ ÎąÎŊÎąÎģÎŋÎŗÎ¯ÎąĪ‚ Î´ÎšÎąĪƒĪ„ÎŦ΃ÎĩΉÎŊ", "undo": "Undo", - "redo": "Redo" + "redo": "Redo", + "submit": "Sign Document", + "steps": { + "configure": "Configure Signature" + }, + "type": { + "title": "Signature Type", + "draw": "Draw", + "canvas": "Canvas", + "image": "Image", + "text": "Text" + }, + "image": { + "label": "Upload signature image", + "placeholder": "Select image file", + "hint": "Upload a PNG or JPG image of your signature" + }, + "instructions": { + "title": "How to add signature", + "canvas": "After drawing your signature in the canvas, close the modal then click anywhere on the PDF to place it.", + "image": "After uploading your signature image above, click anywhere on the PDF to place it.", + "text": "After entering your name above, click anywhere on the PDF to place your signature." + }, + "mode": { + "move": "Move Signature", + "place": "Place Signature" + }, + "updateAndPlace": "Update and Place", + "activate": "Activate Signature Placement", + "deactivate": "Stop Placing Signatures", + "results": { + "title": "Signature Results" + }, + "error": { + "failed": "An error occurred while signing the PDF." + }, + "tags": "ÎĩΞÎŋĪ…ĪƒÎšÎŋÎ´ĪŒĪ„ÎˇĪƒÎˇ,ÎąĪĪ‡ÎšÎēÎŦ,ĪƒĪ‡ÎĩÎ´ÎšÎąĪƒÎŧέÎŊΡ-Ī…Ī€ÎŋÎŗĪÎąĪ†ÎŽ,Ī…Ī€ÎŋÎŗĪÎąĪ†ÎŽ-ÎēÎĩΚÎŧέÎŊÎŋĪ…,Ī…Ī€ÎŋÎŗĪÎąĪ†ÎŽ-ÎĩΚÎēΌÎŊÎąĪ‚" }, "flatten": { - "tags": "ĪƒĪ„ÎąĪ„ÎšÎēΌ,ÎąĪ€ÎĩÎŊÎĩĪÎŗÎŋĪ€ÎŋÎ¯ÎˇĪƒÎˇ,ÎŧΡ-Î´ÎšÎąÎ´ĪÎąĪƒĪ„ÎšÎēΌ,ÎąĪ€ÎģÎŋĪ€ÎŋÎ¯ÎˇĪƒÎˇ", "title": "Î™ĪƒÎŋĪ€Î­Î´Ī‰ĪƒÎˇ", "header": "Î™ĪƒÎŋĪ€Î­Î´Ī‰ĪƒÎˇ PDF", "flattenOnlyForms": "Î™ĪƒÎŋĪ€Î­Î´Ī‰ĪƒÎˇ ÎŧΌÎŊÎŋ ΆÎŋ΁ÎŧĪŽÎŊ", "submit": "Î™ĪƒÎŋĪ€Î­Î´Ī‰ĪƒÎˇ", + "filenamePrefix": "flattened", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, "steps": { "settings": "ÎĄĪ…Î¸ÎŧÎ¯ĪƒÎĩÎšĪ‚" }, "options": { - "flattenOnlyForms": "Î™ĪƒÎŋĪ€Î­Î´Ī‰ĪƒÎˇ ÎŧΌÎŊÎŋ ΆÎŋ΁ÎŧĪŽÎŊ" - } + "stepTitle": "Flatten Options", + "title": "Flatten Options", + "flattenOnlyForms": { + "label": "Î™ĪƒÎŋĪ€Î­Î´Ī‰ĪƒÎˇ ÎŧΌÎŊÎŋ ΆÎŋ΁ÎŧĪŽÎŊ", + "desc": "Only flatten form fields, leaving other interactive elements intact" + }, + "note": "Flattening removes interactive elements from the PDF, making them non-editable." + }, + "results": { + "title": "Flatten Results" + }, + "error": { + "failed": "An error occurred while flattening the PDF." + }, + "tooltip": { + "header": { + "title": "About Flattening PDFs" + }, + "description": { + "title": "What does flattening do?", + "text": "Flattening makes your PDF non-editable by turning fillable forms and buttons into regular text and images. The PDF will look exactly the same, but no one can change or fill in the forms anymore. Perfect for sharing completed forms, creating final documents for records, or ensuring the PDF looks the same everywhere.", + "bullet1": "Text boxes become regular text (can't be edited)", + "bullet2": "Checkboxes and buttons become pictures", + "bullet3": "Great for final versions you don't want changed", + "bullet4": "Ensures consistent appearance across all devices" + }, + "formsOnly": { + "title": "What does 'Flatten only forms' mean?", + "text": "This option only removes the ability to fill in forms, but keeps other features working like clicking links, viewing bookmarks, and reading comments.", + "bullet1": "Forms become non-editable", + "bullet2": "Links still work when clicked", + "bullet3": "Comments and notes remain visible", + "bullet4": "Bookmarks still help you navigate" + } + }, + "tags": "ĪƒĪ„ÎąĪ„ÎšÎēΌ,ÎąĪ€ÎĩÎŊÎĩĪÎŗÎŋĪ€ÎŋÎ¯ÎˇĪƒÎˇ,ÎŧΡ-Î´ÎšÎąÎ´ĪÎąĪƒĪ„ÎšÎēΌ,ÎąĪ€ÎģÎŋĪ€ÎŋÎ¯ÎˇĪƒÎˇ" }, "repair": { "tags": "ÎĩĪ€ÎšÎ´ÎšĪŒĪÎ¸Ī‰ĪƒÎˇ,ÎąĪ€ÎŋÎēÎąĪ„ÎŦĪƒĪ„ÎąĪƒÎˇ,Î´ÎšĪŒĪÎ¸Ī‰ĪƒÎˇ,ÎąÎŊÎŦÎēĪ„ÎˇĪƒÎˇ", "title": "Î•Ī€ÎšÎ´ÎšĪŒĪÎ¸Ī‰ĪƒÎˇ", "header": "Î•Ī€ÎšÎ´ÎšĪŒĪÎ¸Ī‰ĪƒÎˇ PDF", - "submit": "Î•Ī€ÎšÎ´ÎšĪŒĪÎ¸Ī‰ĪƒÎˇ" + "submit": "Î•Ī€ÎšÎ´ÎšĪŒĪÎ¸Ī‰ĪƒÎˇ", + "description": "This tool will attempt to repair corrupted or damaged PDF files. No additional settings are required.", + "filenamePrefix": "repaired", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst repairing the PDF." + }, + "results": { + "title": "Repair Results" + } }, "removeBlanks": { - "tags": "ÎēÎąÎ¸ÎąĪÎšĪƒÎŧĪŒĪ‚,ÎąĪ€ÎģÎŋĪ€ÎŋÎ¯ÎˇĪƒÎˇ,Ī‡Ī‰ĪÎ¯Ī‚-Ī€ÎĩĪÎšÎĩĪ‡ĪŒÎŧÎĩÎŊÎŋ,ÎŋĪÎŗÎŦÎŊĪ‰ĪƒÎˇ", "title": "Î‘Ī†ÎąÎ¯ĪÎĩĪƒÎˇ ÎēÎĩÎŊĪŽÎŊ ΃ÎĩÎģÎ¯Î´Ī‰ÎŊ", "header": "Î‘Ī†ÎąÎ¯ĪÎĩĪƒÎˇ ÎēÎĩÎŊĪŽÎŊ ΃ÎĩÎģÎ¯Î´Ī‰ÎŊ", - "threshold": "ÎŒĪÎšÎŋ ÎģÎĩĪ…ÎēĪŒĪ„ÎˇĪ„ÎąĪ‚ ÎĩΚÎēÎŋÎŊÎŋĪƒĪ„ÎŋÎšĪ‡ÎĩÎ¯Ī‰ÎŊ:", + "settings": { + "title": "Settings" + }, + "threshold": { + "label": "Pixel Whiteness Threshold" + }, + "whitePercent": { + "label": "White Percentage Threshold", + "unit": "%" + }, + "includeBlankPages": { + "label": "Include detected blank pages" + }, + "tooltip": { + "header": { + "title": "Remove Blank Pages Settings" + }, + "threshold": { + "title": "Pixel Whiteness Threshold", + "text": "Controls how white a pixel must be to be considered 'white'. This helps determine what counts as a blank area on the page.", + "bullet1": "0 = Pure black (most restrictive)", + "bullet2": "128 = Medium grey", + "bullet3": "255 = Pure white (least restrictive)" + }, + "whitePercent": { + "title": "White Percentage Threshold", + "text": "Sets the minimum percentage of white pixels required for a page to be considered blank and removed.", + "bullet1": "Lower values (e.g., 80%) = More pages removed", + "bullet2": "Higher values (e.g., 95%) = Only very blank pages removed", + "bullet3": "Use higher values for documents with light backgrounds" + }, + "includeBlankPages": { + "title": "Include Detected Blank Pages", + "text": "When enabled, creates a separate PDF containing all the blank pages that were detected and removed from the original document.", + "bullet1": "Useful for reviewing what was removed", + "bullet2": "Helps verify the detection accuracy", + "bullet3": "Can be disabled to reduce output file size" + } + }, + "submit": "Î‘Ī†ÎąÎ¯ĪÎĩĪƒÎˇ ÎēÎĩÎŊĪŽÎŊ ΃ÎĩÎģÎ¯Î´Ī‰ÎŊ", + "error": { + "failed": "Failed to remove blank pages" + }, + "results": { + "title": "Removed Blank Pages" + }, + "tags": "ÎēÎąÎ¸ÎąĪÎšĪƒÎŧĪŒĪ‚,ÎąĪ€ÎģÎŋĪ€ÎŋÎ¯ÎˇĪƒÎˇ,Ī‡Ī‰ĪÎ¯Ī‚-Ī€ÎĩĪÎšÎĩĪ‡ĪŒÎŧÎĩÎŊÎŋ,ÎŋĪÎŗÎŦÎŊĪ‰ĪƒÎˇ", "thresholdDesc": "ÎŒĪÎšÎŋ ÎŗÎšÎą Ī„ÎŋÎŊ ΀΁ÎŋĪƒÎ´ÎšÎŋĪÎšĪƒÎŧΌ Ī€ĪŒĪƒÎŋ ÎģÎĩĪ…ÎēΌ Ī€ĪÎ­Ī€ÎĩΚ ÎŊÎą ÎĩίÎŊιΚ έÎŊÎą ÎĩΚÎēÎŋÎŊÎŋĪƒĪ„ÎŋÎšĪ‡ÎĩίÎŋ ÎŗÎšÎą ÎŊÎą θÎĩĪ‰ĪÎˇÎ¸Îĩί 'ΛÎĩĪ…ÎēΌ'. 0 = ÎœÎąĪĪÎŋ, 255 ÎēÎąÎ¸ÎąĪĪŒ ÎģÎĩĪ…ÎēΌ.", - "whitePercent": "ΠÎŋ΃ÎŋĪƒĪ„ĪŒ ÎģÎĩĪ…ÎēÎŋĪ (%):", - "whitePercentDesc": "ΠÎŋ΃ÎŋĪƒĪ„ĪŒ Ī„ÎˇĪ‚ ΃ÎĩÎģÎ¯Î´ÎąĪ‚ Ī€ÎŋĪ… Ī€ĪÎ­Ī€ÎĩΚ ÎŊÎą ÎĩίÎŊιΚ 'ÎģÎĩĪ…ÎēÎŦ' ÎĩΚÎēÎŋÎŊÎŋĪƒĪ„ÎŋÎšĪ‡ÎĩÎ¯Îą ÎŗÎšÎą ÎŊÎą ÎąĪ†ÎąÎšĪÎĩθÎĩί", - "submit": "Î‘Ī†ÎąÎ¯ĪÎĩĪƒÎˇ ÎēÎĩÎŊĪŽÎŊ ΃ÎĩÎģÎ¯Î´Ī‰ÎŊ" + "whitePercentDesc": "ΠÎŋ΃ÎŋĪƒĪ„ĪŒ Ī„ÎˇĪ‚ ΃ÎĩÎģÎ¯Î´ÎąĪ‚ Ī€ÎŋĪ… Ī€ĪÎ­Ī€ÎĩΚ ÎŊÎą ÎĩίÎŊιΚ 'ÎģÎĩĪ…ÎēÎŦ' ÎĩΚÎēÎŋÎŊÎŋĪƒĪ„ÎŋÎšĪ‡ÎĩÎ¯Îą ÎŗÎšÎą ÎŊÎą ÎąĪ†ÎąÎšĪÎĩθÎĩί" }, "removeAnnotations": { "tags": "ĪƒĪ‡ĪŒÎģΚι,ÎĩĪ€ÎšĪƒÎŽÎŧÎąÎŊĪƒÎˇ,ĪƒÎˇÎŧÎĩÎšĪŽĪƒÎĩÎšĪ‚,ÎĩĪ€ÎšĪƒÎˇÎŧÎŦÎŊ΃ÎĩÎšĪ‚,ÎąĪ†ÎąÎ¯ĪÎĩĪƒÎˇ", "title": "Î‘Ī†ÎąÎ¯ĪÎĩĪƒÎˇ ĪƒĪ‡ÎŋÎģÎ¯Ī‰ÎŊ", "header": "Î‘Ī†ÎąÎ¯ĪÎĩĪƒÎˇ ĪƒĪ‡ÎŋÎģÎ¯Ī‰ÎŊ", - "submit": "Î‘Ī†ÎąÎ¯ĪÎĩĪƒÎˇ" + "submit": "Î‘Ī†ÎąÎ¯ĪÎĩĪƒÎˇ", + "settings": { + "title": "Settings" + }, + "info": { + "title": "About Remove Annotations", + "description": "This tool will remove all annotations (comments, highlights, notes, etc.) from your PDF documents." + }, + "error": { + "failed": "An error occurred while removing annotations from the PDF." + } }, "compare": { "tags": "Î´ÎšÎąĪ†Îŋ΁ÎŋĪ€ÎŋÎ¯ÎˇĪƒÎˇ,ÎąÎŊĪ„ÎšĪ€ÎąĪÎąÎ˛ÎŋÎģÎŽ,ÎąÎģÎģÎąÎŗÎ­Ī‚,ÎąÎŊÎŦÎģĪ…ĪƒÎˇ", @@ -1082,6 +2341,142 @@ "certSign": { "tags": "Ī€ÎšĪƒĪ„ÎŋĪ€ÎŋÎ¯ÎˇĪƒÎˇ,PEM,P12,ÎĩĪ€Î¯ĪƒÎˇÎŧÎŋ,Îē΁΅΀΄ÎŋÎŗĪÎŦĪ†ÎˇĪƒÎˇ", "title": "ÎĨĪ€ÎŋÎŗĪÎąĪ†ÎŽ ÎŧÎĩ Ī€ÎšĪƒĪ„ÎŋĪ€ÎŋÎšÎˇĪ„ÎšÎēΌ", + "filenamePrefix": "signed", + "signMode": { + "stepTitle": "Sign Mode", + "tooltip": { + "header": { + "title": "About PDF Signatures" + }, + "overview": { + "title": "How signatures work", + "text": "Both modes seal the document (any edits are flagged as tampering) and record who/when/how for auditing. Viewer trust depends on the certificate chain." + }, + "manual": { + "title": "Manual - Bring your certificate", + "text": "Use your own certificate files for brand-aligned identity. Can display Trusted when your CA/chain is recognised.", + "use": "Use for: customer-facing, legal, compliance." + }, + "auto": { + "title": "Auto - Zero-setup, instant system seal", + "text": "Signs with a server self-signed certificate. Same tamper-evident seal and audit trail; typically shows Unverified in viewers.", + "use": "Use when: you need speed and consistent internal identity across reviews and records." + }, + "rule": { + "title": "Rule of thumb", + "text": "Need recipient Trusted status? Manual. Need a fast, tamper-evident seal and audit trail with no setup? Auto." + } + } + }, + "certTypeStep": { + "stepTitle": "Certificate Format" + }, + "certFiles": { + "stepTitle": "Certificate Files" + }, + "appearance": { + "stepTitle": "Signature Appearance", + "tooltip": { + "header": { + "title": "About Signature Appearance" + }, + "invisible": { + "title": "Invisible Signatures", + "text": "The signature is added to the PDF for security but won't be visible when viewing the document. Perfect for legal requirements without changing the document's appearance.", + "bullet1": "Provides security without visual changes", + "bullet2": "Meets legal requirements for digital signing", + "bullet3": "Doesn't affect document layout or design" + }, + "visible": { + "title": "Visible Signatures", + "text": "Shows a signature block on the PDF with your name, date, and optional details. Useful when you want readers to clearly see the document is signed.", + "bullet1": "Shows signer name and date on the document", + "bullet2": "Can include reason and location for signing", + "bullet3": "Choose which page to place the signature", + "bullet4": "Optional logo can be included" + } + }, + "invisible": "Invisible", + "options": { + "title": "Signature Details" + }, + "visible": "Visible" + }, + "sign": { + "submit": "Sign PDF", + "results": "Signed PDF" + }, + "error": { + "failed": "An error occurred whilst processing signatures." + }, + "tooltip": { + "header": { + "title": "About Managing Signatures" + }, + "overview": { + "title": "What can this tool do?", + "text": "This tool lets you check if your PDFs are digitally signed and add new digital signatures. Digital signatures prove who created or approved a document and show if it has been changed since signing.", + "bullet1": "Check existing signatures and their validity", + "bullet2": "View detailed information about signers and certificates", + "bullet3": "Add new digital signatures to secure your documents", + "bullet4": "Multiple files supported with easy navigation" + }, + "validation": { + "title": "Checking Signatures", + "text": "When you check signatures, the tool tells you if they're valid, who signed the document, when it was signed, and whether the document has been changed since signing.", + "bullet1": "Shows if signatures are valid or invalid", + "bullet2": "Displays signer information and signing date", + "bullet3": "Checks if the document was modified after signing", + "bullet4": "Can use custom certificates for verification" + }, + "signing": { + "title": "Adding Signatures", + "text": "To sign a PDF, you need a digital certificate (like PEM, PKCS12, or JKS). You can choose to make the signature visible on the document or keep it invisible for security only.", + "bullet1": "Supports PEM, PKCS12, JKS, and server certificate formats", + "bullet2": "Option to show or hide signature on the PDF", + "bullet3": "Add reason, location, and signer name", + "bullet4": "Choose which page to place visible signatures", + "bullet5": "Use server certificate for simple 'Sign with Stirling-PDF' option" + } + }, + "certType": { + "tooltip": { + "header": { + "title": "About Certificate Types" + }, + "what": { + "title": "What's a certificate?", + "text": "It's a secure ID for your signature that proves you signed. Unless you're required to sign via certificate, we recommend using another secure method like Type, Draw, or Upload." + }, + "which": { + "title": "Which option should I use?", + "text": "Choose the format that matches your certificate file:", + "bullet1": "PKCS#12 (.p12 / .pfx) – one combined file (most common)", + "bullet2": "PFX (.pfx) – Microsoft's version of PKCS12", + "bullet3": "PEM – separate private-key and certificate .pem files", + "bullet4": "JKS – Java .jks keystore for dev / CI-CD workflows" + }, + "convert": { + "title": "Key not listed?", + "text": "Convert your file to a Java keystore (.jks) with keytool, then pick JKS." + } + } + }, + "chooseCertificate": "Choose Certificate File", + "chooseJksFile": "Choose JKS File", + "chooseP12File": "Choose PKCS12 File", + "choosePfxFile": "Choose PFX File", + "choosePrivateKey": "Choose Private Key File", + "location": "ΤÎŋĪ€ÎŋθÎĩĪƒÎ¯Îą", + "logoTitle": "Logo", + "name": "ΌÎŊÎŋÎŧÎą", + "noLogo": "No Logo", + "pageNumber": "Page Number", + "password": "Î•ÎšĪƒÎŦÎŗÎĩĪ„Îĩ Ī„ÎŋÎŊ ÎēĪ‰Î´ÎšÎēΌ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚ Ī„ÎŋĪ… Keystore ÎŽ Ī„ÎŋĪ… ÎšÎ´ÎšĪ‰Ī„ÎšÎēÎŋĪ ÎēÎģÎĩΚδΚÎŋĪ (ÎĩÎŦÎŊ Ī…Ī€ÎŦ΁·ÎĩΚ):", + "passwordOptional": "Leave empty if no password", + "reason": "Î‘ÎšĪ„Î¯Îą", + "serverCertMessage": "Using server certificate - no files or password required", + "showLogo": "ΕÎŧΆÎŦÎŊÎšĪƒÎˇ ÎģÎŋÎŗĪŒĪ„Ī…Ī€ÎŋĪ…", "header": "ÎĨĪ€ÎŋÎŗĪÎąĪ†ÎŽ PDF ÎŧÎĩ Ī„Îŋ Ī€ÎšĪƒĪ„ÎŋĪ€ÎŋÎšÎˇĪ„ÎšÎēΌ ĪƒÎąĪ‚ (ÎŖÎĩ ÎĩΞέÎģΚΞΡ)", "selectPDF": "Î•Ī€ÎšÎģÎ­ÎžĪ„Îĩ ÎąĪĪ‡ÎĩίÎŋ PDF ÎŗÎšÎą Ī…Ī€ÎŋÎŗĪÎąĪ†ÎŽ:", "jksNote": "ÎŖÎˇÎŧÎĩÎ¯Ī‰ĪƒÎˇ: ΕÎŦÎŊ Îŋ Ī„ĪĪ€ÎŋĪ‚ Ī„ÎŋĪ… Ī€ÎšĪƒĪ„ÎŋĪ€ÎŋÎšÎˇĪ„ÎšÎēÎŋĪ ĪƒÎąĪ‚ δÎĩÎŊ ÎąÎŊÎąĪ†Î­ĪÎĩĪ„ÎąÎš Ī€ÎąĪÎąÎēÎŦ΄Ή, Ī€ÎąĪÎąÎēÎąÎģĪŽ ÎŧÎĩĪ„ÎąĪ„ĪÎ­ĪˆĪ„Îĩ Ī„Îŋ ΃Îĩ ÎąĪĪ‡ÎĩίÎŋ Java Keystore (.jks) Ī‡ĪÎˇĪƒÎšÎŧÎŋĪ€ÎŋÎšĪŽÎŊĪ„ÎąĪ‚ Ī„Îŋ ÎĩĪÎŗÎąÎģÎĩίÎŋ ÎŗĪÎąÎŧÎŧÎŽĪ‚ ÎĩÎŊĪ„ÎŋÎģĪŽÎŊ keytool. ÎŖĪ„Îˇ ĪƒĪ…ÎŊÎ­Ī‡ÎĩΚι, ÎĩĪ€ÎšÎģÎ­ÎžĪ„Îĩ Ī„ÎˇÎŊ ÎĩĪ€ÎšÎģÎŋÎŗÎŽ ÎąĪĪ‡ÎĩίÎŋĪ… .jks Ī€ÎąĪÎąÎēÎŦ΄Ή.", @@ -1089,13 +2484,7 @@ "selectCert": "Î•Ī€ÎšÎģÎ­ÎžĪ„Îĩ Ī„Îŋ ÎąĪĪ‡ÎĩίÎŋ Ī€ÎšĪƒĪ„ÎŋĪ€ÎŋÎšÎˇĪ„ÎšÎēÎŋĪ ĪƒÎąĪ‚ (ÎŧÎŋĪĪ†ÎŽ X.509, ÎŧĪ€Îŋ΁Îĩί ÎŊÎą ÎĩίÎŊιΚ .pem ÎŽ .der):", "selectP12": "Î•Ī€ÎšÎģÎ­ÎžĪ„Îĩ Ī„Îŋ ÎąĪĪ‡ÎĩίÎŋ PKCS#12 Keystore (.p12 ÎŽ .pfx) (Î ĪÎŋÎąÎšĪÎĩĪ„ÎšÎēΌ, ÎĩÎŦÎŊ Ī€ÎąĪÎ­Ī‡ÎĩĪ„ÎąÎš, θι Ī€ĪÎ­Ī€ÎĩΚ ÎŊÎą Ī€ÎĩĪÎšÎ­Ī‡ÎĩΚ Ī„Îŋ ÎšÎ´ÎšĪ‰Ī„ÎšÎēΌ ÎēÎģÎĩΚδί ÎēιΚ Ī„Îŋ Ī€ÎšĪƒĪ„ÎŋĪ€ÎŋÎšÎˇĪ„ÎšÎēΌ ĪƒÎąĪ‚):", "selectJKS": "Î•Ī€ÎšÎģÎ­ÎžĪ„Îĩ Ī„Îŋ ÎąĪĪ‡ÎĩίÎŋ Java Keystore (.jks ÎŽ .keystore):", - "certType": "Î¤ĪĪ€ÎŋĪ‚ Ī€ÎšĪƒĪ„ÎŋĪ€ÎŋÎšÎˇĪ„ÎšÎēÎŋĪ", - "password": "Î•ÎšĪƒÎŦÎŗÎĩĪ„Îĩ Ī„ÎŋÎŊ ÎēĪ‰Î´ÎšÎēΌ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚ Ī„ÎŋĪ… Keystore ÎŽ Ī„ÎŋĪ… ÎšÎ´ÎšĪ‰Ī„ÎšÎēÎŋĪ ÎēÎģÎĩΚδΚÎŋĪ (ÎĩÎŦÎŊ Ī…Ī€ÎŦ΁·ÎĩΚ):", "showSig": "ΕÎŧΆÎŦÎŊÎšĪƒÎˇ Ī…Ī€ÎŋÎŗĪÎąĪ†ÎŽĪ‚", - "reason": "Î‘ÎšĪ„Î¯Îą", - "location": "ΤÎŋĪ€ÎŋθÎĩĪƒÎ¯Îą", - "name": "ΌÎŊÎŋÎŧÎą", - "showLogo": "ΕÎŧΆÎŦÎŊÎšĪƒÎˇ ÎģÎŋÎŗĪŒĪ„Ī…Ī€ÎŋĪ…", "submit": "ÎĨĪ€ÎŋÎŗĪÎąĪ†ÎŽ PDF" }, "removeCertSign": { @@ -1103,7 +2492,18 @@ "title": "Î‘Ī†ÎąÎ¯ĪÎĩĪƒÎˇ Ī…Ī€ÎŋÎŗĪÎąĪ†ÎŽĪ‚ Ī€ÎšĪƒĪ„ÎŋĪ€ÎŋÎšÎˇĪ„ÎšÎēÎŋĪ", "header": "Î‘Ī†ÎąÎ¯ĪÎĩĪƒÎˇ Ī„ÎˇĪ‚ ĪˆÎˇĪ†ÎšÎąÎēÎŽĪ‚ Ī…Ī€ÎŋÎŗĪÎąĪ†ÎŽĪ‚ ÎąĪ€ĪŒ Ī„Îŋ PDF", "selectPDF": "Î•Ī€ÎšÎģÎ­ÎžĪ„Îĩ έÎŊÎą ÎąĪĪ‡ÎĩίÎŋ PDF:", - "submit": "Î‘Ī†ÎąÎ¯ĪÎĩĪƒÎˇ Ī…Ī€ÎŋÎŗĪÎąĪ†ÎŽĪ‚" + "submit": "Î‘Ī†ÎąÎ¯ĪÎĩĪƒÎˇ Ī…Ī€ÎŋÎŗĪÎąĪ†ÎŽĪ‚", + "description": "This tool will remove digital certificate signatures from your PDF document.", + "filenamePrefix": "unsigned", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst removing certificate signatures." + }, + "results": { + "title": "Certificate Removal Results" + } }, "pageLayout": { "tags": "ĪƒĪ…ÎŗĪ‡ĪŽÎŊÎĩĪ…ĪƒÎˇ,ĪƒĪÎŊθÎĩĪƒÎˇ,ÎĩÎŊÎšÎąÎ¯Îą-΀΁ÎŋβÎŋÎģÎŽ,ÎŋĪÎŗÎŦÎŊĪ‰ĪƒÎˇ", @@ -1111,16 +2511,157 @@ "header": "ΔιÎŦĪ„ÎąÎžÎˇ Ī€ÎŋÎģÎģÎąĪ€ÎģĪŽÎŊ ΃ÎĩÎģÎ¯Î´Ī‰ÎŊ", "pagesPerSheet": "ÎŖÎĩÎģίδÎĩĪ‚ ÎąÎŊÎŦ Ī†ĪÎģÎģÎŋ:", "addBorder": "Î ĪÎŋĪƒÎ¸ÎŽÎēΡ Ī€ÎĩĪÎšÎŗĪÎąÎŧÎŧÎŦ΄ΉÎŊ", - "submit": "ÎĨĪ€ÎŋβÎŋÎģÎŽ" + "submit": "ÎĨĪ€ÎŋβÎŋÎģÎŽ", + "desc": { + "2": "Place 2 pages side-by-side on a single sheet.", + "3": "Place 3 pages on a single sheet in a single row.", + "4": "Place 4 pages on a single sheet (2 × 2 grid).", + "9": "Place 9 pages on a single sheet (3 × 3 grid).", + "16": "Place 16 pages on a single sheet (4 × 4 grid)." + }, + "error": { + "failed": "An error occurred while creating the multi-page layout." + } + }, + "bookletImposition": { + "tags": "booklet,imposition,printing,binding,folding,signature", + "title": "Booklet Imposition", + "header": "Booklet Imposition", + "submit": "Create Booklet", + "spineLocation": { + "label": "Spine Location", + "left": "Left (Standard)", + "right": "Right (RTL)" + }, + "doubleSided": { + "label": "Double-sided printing", + "tooltip": "Creates both front and back sides for proper booklet printing" + }, + "manualDuplex": { + "title": "Manual Duplex Mode", + "instructions": "For printers without automatic duplex. You'll need to run this twice:" + }, + "duplexPass": { + "label": "Print Pass", + "first": "1st Pass", + "second": "2nd Pass", + "firstInstructions": "Prints front sides → stack face-down → run again with 2nd Pass", + "secondInstructions": "Load printed stack face-down → prints back sides" + }, + "rtlBinding": { + "label": "Right-to-left binding", + "tooltip": "For Arabic, Hebrew, or other right-to-left languages" + }, + "addBorder": { + "label": "Add borders around pages", + "tooltip": "Adds borders around each page section to help with cutting and alignment" + }, + "addGutter": { + "label": "Add gutter margin", + "tooltip": "Adds inner margin space for binding" + }, + "gutterSize": { + "label": "Gutter size (points)" + }, + "flipOnShortEdge": { + "label": "Flip on short edge (automatic duplex only)", + "tooltip": "Enable for short-edge duplex printing (automatic duplex only - ignored in manual mode)", + "manualNote": "Not needed in manual mode - you flip the stack yourself" + }, + "advanced": { + "toggle": "Advanced Options" + }, + "paperSizeNote": "Paper size is automatically derived from your first page.", + "tooltip": { + "header": { + "title": "Booklet Creation Guide" + }, + "description": { + "title": "What is Booklet Imposition?", + "text": "Creates professional booklets by arranging pages in the correct printing order. Your PDF pages are placed 2-up on landscape sheets so when folded and bound, they read in proper sequence like a real book." + }, + "example": { + "title": "Example: 8-Page Booklet", + "text": "Your 8-page document becomes 2 sheets:", + "bullet1": "Sheet 1 Front: Pages 8, 1 | Back: Pages 2, 7", + "bullet2": "Sheet 2 Front: Pages 6, 3 | Back: Pages 4, 5", + "bullet3": "When folded & stacked: Reads 1→2→3→4→5→6→7→8" + }, + "printing": { + "title": "How to Print & Assemble", + "text": "Follow these steps for perfect booklets:", + "bullet1": "Print double-sided with 'Flip on long edge'", + "bullet2": "Stack sheets in order, fold in half", + "bullet3": "Staple or bind along the folded spine", + "bullet4": "For short-edge printers: Enable 'Flip on short edge' option" + }, + "manualDuplex": { + "title": "Manual Duplex (Single-sided Printers)", + "text": "For printers without automatic duplex:", + "bullet1": "Turn OFF 'Double-sided printing'", + "bullet2": "Select '1st Pass' → Print → Stack face-down", + "bullet3": "Select '2nd Pass' → Load stack → Print backs", + "bullet4": "Fold and assemble as normal" + }, + "advanced": { + "title": "Advanced Options", + "text": "Fine-tune your booklet:", + "bullet1": "Right-to-Left Binding: For Arabic, Hebrew, or RTL languages", + "bullet2": "Borders: Shows cut lines for trimming", + "bullet3": "Gutter Margin: Adds space for binding/stapling", + "bullet4": "Short-edge Flip: Only for automatic duplex printers" + } + }, + "error": { + "failed": "An error occurred while creating the booklet imposition." + } }, "scalePages": { - "tags": "ÎąÎģÎģÎąÎŗÎŽ ÎŧÎĩÎŗÎ­Î¸ÎŋĪ…Ī‚,΄΁ÎŋĪ€ÎŋĪ€ÎŋÎ¯ÎˇĪƒÎˇ,δΚÎŦĪƒĪ„ÎąĪƒÎˇ,΀΁ÎŋĪƒÎąĪÎŧÎŋÎŗÎŽ", "title": "Î ĪÎŋĪƒÎąĪÎŧÎŋÎŗÎŽ ÎēÎģίÎŧÎąÎēÎąĪ‚ ΃ÎĩÎģÎ¯Î´ÎąĪ‚", "header": "Î ĪÎŋĪƒÎąĪÎŧÎŋÎŗÎŽ ÎēÎģίÎŧÎąÎēÎąĪ‚ ΃ÎĩÎģÎ¯Î´ÎąĪ‚", "pageSize": "ÎœÎ­ÎŗÎĩθÎŋĪ‚ ΃ÎĩÎģÎ¯Î´ÎąĪ‚ Ī„ÎŋĪ… ÎĩÎŗÎŗĪÎŦΆÎŋĪ….", "keepPageSize": "Î‘ĪĪ‡ÎšÎēΌ ÎŧÎ­ÎŗÎĩθÎŋĪ‚", "scaleFactor": "Î•Ī€Î¯Ī€ÎĩδÎŋ ÎļÎŋĪ…Îŧ (Ī€ÎĩĪÎšÎēÎŋĪ€ÎŽ) ΃ÎĩÎģÎ¯Î´ÎąĪ‚.", - "submit": "ÎĨĪ€ÎŋβÎŋÎģÎŽ" + "submit": "ÎĨĪ€ÎŋβÎŋÎģÎŽ", + "tags": "ÎąÎģÎģÎąÎŗÎŽ ÎŧÎĩÎŗÎ­Î¸ÎŋĪ…Ī‚,΄΁ÎŋĪ€ÎŋĪ€ÎŋÎ¯ÎˇĪƒÎˇ,δΚÎŦĪƒĪ„ÎąĪƒÎˇ,΀΁ÎŋĪƒÎąĪÎŧÎŋÎŗÎŽ" + }, + "adjustPageScale": { + "tags": "resize,modify,dimension,adapt", + "title": "Adjust Page Scale", + "header": "Adjust Page Scale", + "scaleFactor": { + "label": "Scale Factor" + }, + "pageSize": { + "label": "Target Page Size", + "keep": "Keep Original Size", + "letter": "Letter", + "legal": "Legal" + }, + "submit": "Adjust Page Scale", + "error": { + "failed": "An error occurred while adjusting the page scale." + }, + "tooltip": { + "header": { + "title": "Page Scale Settings Overview" + }, + "description": { + "title": "Description", + "text": "Adjust the size of PDF content and change the page dimensions." + }, + "scaleFactor": { + "title": "Scale Factor", + "text": "Controls how large or small the content appears on the page. Content is scaled and centred - if scaled content is larger than the page size, it may be cropped.", + "bullet1": "1.0 = Original size", + "bullet2": "0.5 = Half size (50% smaller)", + "bullet3": "2.0 = Double size (200% larger, may crop)" + }, + "pageSize": { + "title": "Target Page Size", + "text": "Sets the dimensions of the output PDF pages. 'Keep Original Size' maintains current dimensions, whilst other options resize to standard paper sizes." + } + } }, "add-page-numbers": { "tags": "ÎąĪÎ¯Î¸ÎŧÎˇĪƒÎˇ,ÎĩĪ„ÎšÎēÎ­Ī„Îą,ÎŋĪÎŗÎŦÎŊĪ‰ĪƒÎˇ,Îĩ΅΁ÎĩĪ„ÎŽĪÎšÎŋ" @@ -1129,16 +2670,83 @@ "tags": "ÎąĪ…Ī„ĪŒÎŧÎąĪ„Îˇ-ÎąÎŊÎ¯Ī‡ÎŊÎĩĪ…ĪƒÎˇ,βÎŦ΃ÎĩΚ-ÎēÎĩĪ†ÎąÎģÎ¯Î´ÎąĪ‚,ÎŋĪÎŗÎŦÎŊĪ‰ĪƒÎˇ,ÎĩĪ€ÎąÎŊÎĩĪ„ÎšÎēÎ­Ī„Îą", "title": "Î‘Ī…Ī„ĪŒÎŧÎąĪ„Îˇ ÎŧÎĩĪ„ÎŋÎŊÎŋÎŧÎąĪƒÎ¯Îą", "header": "Î‘Ī…Ī„ĪŒÎŧÎąĪ„Îˇ ÎŧÎĩĪ„ÎŋÎŊÎŋÎŧÎąĪƒÎ¯Îą PDF", - "submit": "Î‘Ī…Ī„ĪŒÎŧÎąĪ„Îˇ ÎŧÎĩĪ„ÎŋÎŊÎŋÎŧÎąĪƒÎ¯Îą" + "description": "Automatically finds the title from your PDF content and uses it as the filename.", + "submit": "Î‘Ī…Ī„ĪŒÎŧÎąĪ„Îˇ ÎŧÎĩĪ„ÎŋÎŊÎŋÎŧÎąĪƒÎ¯Îą", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst auto-renaming the PDF." + }, + "results": { + "title": "Auto-Rename Results" + }, + "tooltip": { + "header": { + "title": "How Auto-Rename Works" + }, + "howItWorks": { + "title": "Smart Renaming", + "text": "Automatically finds the title from your PDF content and uses it as the filename.", + "bullet1": "Looks for text that appears to be a title or heading", + "bullet2": "Creates a clean, valid filename from the detected title", + "bullet3": "Keeps the original name if no suitable title is found" + } + } }, "adjust-contrast": { "tags": "Î´ÎšĪŒĪÎ¸Ī‰ĪƒÎˇ-·΁ΉÎŧÎŦ΄ΉÎŊ,ĪƒĪ…ÎŊĪ„ÎŋÎŊÎšĪƒÎŧĪŒĪ‚,΄΁ÎŋĪ€ÎŋĪ€ÎŋÎ¯ÎˇĪƒÎˇ,βÎĩÎģĪ„Î¯Ī‰ĪƒÎˇ" }, "crop": { - "tags": "Ī€ÎĩĪÎšÎēÎŋĪ€ÎŽ,ĪƒĪ…ĪĪÎ¯ÎēÎŊĪ‰ĪƒÎˇ,ÎĩĪ€ÎĩΞÎĩĪÎŗÎąĪƒÎ¯Îą,ĪƒĪ‡ÎŽÎŧÎą", "title": "ΠÎĩĪÎšÎēÎŋĪ€ÎŽ", "header": "ΠÎĩĪÎšÎēÎŋĪ€ÎŽ PDF", - "submit": "ÎĨĪ€ÎŋβÎŋÎģÎŽ" + "submit": "ÎĨĪ€ÎŋβÎŋÎģÎŽ", + "noFileSelected": "Select a PDF file to begin cropping", + "preview": { + "title": "Crop Area Selection" + }, + "reset": "Reset to full PDF", + "coordinates": { + "title": "Position and Size", + "x": { + "label": "X Position", + "desc": "Left edge (points)" + }, + "y": { + "label": "Y Position", + "desc": "Bottom edge (points)" + }, + "width": { + "label": "Width", + "desc": "Crop width (points)" + }, + "height": { + "label": "Height", + "desc": "Crop height (points)" + } + }, + "error": { + "invalidArea": "Crop area extends beyond PDF boundaries", + "failed": "Failed to crop PDF" + }, + "steps": { + "selectArea": "Select Crop Area" + }, + "tooltip": { + "title": "How to Crop PDFs", + "description": "Select the area to crop from your PDF by dragging and resizing the blue overlay on the thumbnail.", + "drag": "Drag the overlay to move the crop area", + "resize": "Drag the corner and edge handles to resize", + "precision": "Use coordinate inputs for precise positioning" + }, + "results": { + "title": "Crop Results" + }, + "automation": { + "info": "Enter crop coordinates in PDF points. Origin (0,0) is at bottom-left. These values will be applied to all PDFs processed in this automation.", + "reference": "Reference: A4 page is 595.28 × 841.89 points (210mm × 297mm). 1 inch = 72 points." + }, + "tags": "Ī€ÎĩĪÎšÎēÎŋĪ€ÎŽ,ĪƒĪ…ĪĪÎ¯ÎēÎŊĪ‰ĪƒÎˇ,ÎĩĪ€ÎĩΞÎĩĪÎŗÎąĪƒÎ¯Îą,ĪƒĪ‡ÎŽÎŧÎą" }, "autoSplitPDF": { "tags": "QR-based,Î´ÎšÎąĪ‡Ī‰ĪÎšĪƒÎŧĪŒĪ‚,΃ÎŦĪĪ‰ĪƒÎˇ-Ī„ÎŧÎŽÎŧÎąĪ„ÎŋĪ‚,ÎŋĪÎŗÎŦÎŊĪ‰ĪƒÎˇ", @@ -1221,24 +2829,124 @@ "downloadJS": "Î›ÎŽĪˆÎˇ Javascript", "submit": "ΕÎŧΆÎŦÎŊÎšĪƒÎˇ" }, - "autoRedact": { - "tags": "ÎąĪ€ĪŒÎēĪĪ…ĪˆÎˇ,ÎēĪĪĪˆÎšÎŧÎŋ,ÎŧÎąĪĪÎšĪƒÎŧÎą,ÎŧÎąĪĪÎŋ,ÎŧÎąĪÎēÎąÎ´ĪŒĪÎŋĪ‚,Îē΁΅ÎŧÎŧέÎŊÎŋ", - "title": "Î‘Ī…Ī„ĪŒÎŧÎąĪ„Îˇ ÎąĪ€ĪŒÎēĪĪ…ĪˆÎˇ", - "header": "Î‘Ī…Ī„ĪŒÎŧÎąĪ„Îˇ ÎąĪ€ĪŒÎēĪĪ…ĪˆÎˇ", - "colorLabel": "Î§ĪĪŽÎŧÎą", - "textsToRedactLabel": "ΚÎĩίÎŧÎĩÎŊÎŋ ΀΁ÎŋĪ‚ ÎąĪ€ĪŒÎēĪĪ…ĪˆÎˇ (Î´ÎšÎąĪ‡Ī‰ĪÎšĪƒÎŧέÎŊÎŋ ÎąÎŊÎŦ ÎŗĪÎąÎŧÎŧÎŽ)", - "textsToRedactPlaceholder": "Ī€.·. \\nΕÎŧĪ€ÎšĪƒĪ„ÎĩĪ…Ī„ÎšÎēΌ \\nΆÎē΁Ή΂ ÎąĪ€ĪŒĪĪÎˇĪ„Îŋ", - "useRegexLabel": "Î§ĪÎŽĪƒÎˇ Regex", - "wholeWordSearchLabel": "ΑÎŊÎąÎļÎŽĪ„ÎˇĪƒÎˇ ÎŋÎģΌÎēÎģÎˇĪÎˇĪ‚ ÎģÎ­ÎžÎˇĪ‚", - "customPaddingLabel": "Î ĪÎŋĪƒÎąĪÎŧÎŋ΃ÎŧέÎŊÎŋ ÎĩĪ€ÎšĪ€ÎģέÎŋÎŊ Ī€ÎĩĪÎšÎ¸ĪŽĪÎšÎŋ", - "convertPDFToImageLabel": "ΜÎĩĪ„ÎąĪ„ĪÎŋĪ€ÎŽ PDF ΃Îĩ PDF-ΕιÎēΌÎŊÎą (Î§ĪÎˇĪƒÎšÎŧÎŋĪ€ÎŋΚÎĩÎ¯Ī„ÎąÎš ÎŗÎšÎą Ī„ÎˇÎŊ ÎąĪ†ÎąÎ¯ĪÎĩĪƒÎˇ ÎēÎĩΚÎŧέÎŊÎŋĪ… Ī€Î¯ĪƒĪ‰ ÎąĪ€ĪŒ Ī„Îŋ Ī€ÎģÎąÎ¯ĪƒÎšÎŋ)", - "submitButton": "ÎĨĪ€ÎŋβÎŋÎģÎŽ" - }, "redact": { "tags": "ÎąĪ€ĪŒÎēĪĪ…ĪˆÎˇ,ÎēĪĪĪˆÎšÎŧÎŋ,ÎŧÎąĪĪÎšĪƒÎŧÎą,ÎŧÎąĪĪÎŋ,ÎŧÎąĪÎēÎąÎ´ĪŒĪÎŋĪ‚,Îē΁΅ÎŧÎŧέÎŊÎŋ,·ÎĩÎšĪÎŋÎēίÎŊÎˇĪ„Îŋ", "title": "ΧÎĩÎšĪÎŋÎēίÎŊÎˇĪ„Îˇ ÎąĪ€ĪŒÎēĪĪ…ĪˆÎˇ", - "header": "ΧÎĩÎšĪÎŋÎēίÎŊÎˇĪ„Îˇ ÎąĪ€ĪŒÎēĪĪ…ĪˆÎˇ", "submit": "Î‘Ī€ĪŒÎēĪĪ…ĪˆÎˇ", + "error": { + "failed": "An error occurred while redacting the PDF." + }, + "modeSelector": { + "title": "Redaction Method", + "mode": "Mode", + "automatic": "Automatic", + "automaticDesc": "Redact text based on search terms", + "manual": "Manual", + "manualDesc": "Click and drag to redact specific areas", + "manualComingSoon": "Manual redaction coming soon" + }, + "auto": { + "header": "Auto Redact", + "settings": { + "title": "Redaction Settings", + "advancedTitle": "Î ĪÎŋĪ‡Ī‰ĪÎˇÎŧέÎŊÎą" + }, + "colorLabel": "Box Colour", + "wordsToRedact": { + "title": "Words to Redact", + "placeholder": "Enter a word", + "add": "Î ĪÎŋĪƒÎ¸ÎŽÎēΡ", + "examples": "Examples: Confidential, Top-Secret" + }, + "useRegexLabel": "Use Regex", + "wholeWordSearchLabel": "Whole Word Search", + "customPaddingLabel": "Custom Extra Padding", + "convertPDFToImageLabel": "Convert PDF to PDF-Image" + }, + "tooltip": { + "mode": { + "header": { + "title": "Redaction Method" + }, + "automatic": { + "title": "Automatic Redaction", + "text": "Automatically finds and redacts specified text throughout the document. Perfect for removing consistent sensitive information like names, addresses, or confidential markers." + }, + "manual": { + "title": "Manual Redaction", + "text": "Click and drag to manually select specific areas to redact. Gives you precise control over what gets redacted. (Coming soon)" + } + }, + "words": { + "header": { + "title": "Words to Redact" + }, + "description": { + "title": "Text Matching", + "text": "Enter words or phrases to find and redact in your document. Each word will be searched for separately." + }, + "bullet1": "Add one word at a time", + "bullet2": "Press Enter or click 'Add Another' to add", + "bullet3": "Click × to remove words", + "examples": { + "title": "Common Examples", + "text": "Typical words to redact include: bank details, email addresses, or specific names." + } + }, + "advanced": { + "header": { + "title": "Advanced Redaction Settings" + }, + "color": { + "title": "Box Colour & Padding", + "text": "Customise the appearance of redaction boxes. Black is standard, but you can choose any colour. Padding adds extra space around the found text." + }, + "regex": { + "title": "Use Regex", + "text": "Enable regular expressions for advanced pattern matching. Useful for finding phone numbers, emails, or complex patterns.", + "bullet1": "Example: \\d{4}-\\d{2}-\\d{2} to match any dates in YYYY-MM-DD format", + "bullet2": "Use with caution - test thoroughly" + }, + "wholeWord": { + "title": "Whole Word Search", + "text": "Only match complete words, not partial matches. 'John' won't match 'Johnson' when enabled." + }, + "convert": { + "title": "Convert to PDF-Image", + "text": "Converts the PDF to an image-based PDF after redaction. This ensures text behind redaction boxes is completely removed and unrecoverable." + } + } + }, + "manual": { + "header": "Manual Redaction", + "textBasedRedaction": "Text-based Redaction", + "pageBasedRedaction": "Page-based Redaction", + "convertPDFToImageLabel": "Convert PDF to PDF-Image (Used to remove text behind the box)", + "pageRedactionNumbers": { + "title": "ÎŖÎĩÎģίδÎĩĪ‚", + "placeholder": "(Ī€.·. 1,2,8 ÎŽ 4,7,12-16 ÎŽ 2n-1)" + }, + "redactionColor": { + "title": "Redaction Colour" + }, + "export": "Î•ÎžÎąÎŗĪ‰ÎŗÎŽ", + "upload": "Upload", + "boxRedaction": "Box draw redaction", + "zoom": "Zoom", + "zoomIn": "Zoom in", + "zoomOut": "Zoom out", + "nextPage": "Next Page", + "previousPage": "Previous Page", + "toggleSidebar": "Toggle Sidebar", + "showThumbnails": "Show Thumbnails", + "showDocumentOutline": "Show Document Outline (double-click to expand/collapse all items)", + "showAttachments": "Show Attachments", + "showLayers": "Show Layers (double-click to reset all layers to the default state)", + "colourPicker": "Colour Picker", + "findCurrentOutlineItem": "Find current outline item", + "applyChanges": "Apply Changes" + }, + "header": "ΧÎĩÎšĪÎŋÎēίÎŊÎˇĪ„Îˇ ÎąĪ€ĪŒÎēĪĪ…ĪˆÎˇ", "textBasedRedaction": "Î‘Ī€ĪŒÎēĪĪ…ĪˆÎˇ βÎŦ΃ÎĩΚ ÎēÎĩΚÎŧέÎŊÎŋĪ…", "pageBasedRedaction": "Î‘Ī€ĪŒÎēĪĪ…ĪˆÎˇ βÎŦ΃ÎĩΚ ΃ÎĩÎģÎ¯Î´ÎąĪ‚", "convertPDFToImageLabel": "ΜÎĩĪ„ÎąĪ„ĪÎŋĪ€ÎŽ PDF ΃Îĩ PDF-ΕιÎēΌÎŊÎą (Î§ĪÎˇĪƒÎšÎŧÎŋĪ€ÎŋΚÎĩÎ¯Ī„ÎąÎš ÎŗÎšÎą Ī„ÎˇÎŊ ÎąĪ†ÎąÎ¯ĪÎĩĪƒÎˇ ÎēÎĩΚÎŧέÎŊÎŋĪ… Ī€Î¯ĪƒĪ‰ ÎąĪ€ĪŒ Ī„Îŋ Ī€ÎģÎąÎ¯ĪƒÎšÎŋ)", @@ -1264,22 +2972,7 @@ "showLayers": "ΕÎŧΆÎŦÎŊÎšĪƒÎˇ ÎĩĪ€ÎšĪ€Î­Î´Ī‰ÎŊ (Î´ÎšĪ€ÎģΌ ÎēÎģΚÎē ÎŗÎšÎą ÎĩĪ€ÎąÎŊÎąĪ†Îŋ΁ÎŦ ΌÎģΉÎŊ ΄ΉÎŊ ÎĩĪ€ÎšĪ€Î­Î´Ī‰ÎŊ ĪƒĪ„ÎˇÎŊ ΀΁ÎŋÎĩĪ€ÎšÎģÎĩÎŗÎŧέÎŊΡ ÎēÎąĪ„ÎŦĪƒĪ„ÎąĪƒÎˇ)", "colourPicker": "Î•Ī€ÎšÎģÎŋÎŗÎ­ÎąĪ‚ Ī‡ĪĪŽÎŧÎąĪ„ÎŋĪ‚", "findCurrentOutlineItem": "Î•ĪĪÎĩĪƒÎˇ Ī„ĪÎ­Ī‡ÎŋÎŊĪ„ÎŋĪ‚ ĪƒĪ„ÎŋÎšĪ‡ÎĩίÎŋĪ… Ī€ÎĩĪÎšÎŗĪÎŦÎŧÎŧÎąĪ„ÎŋĪ‚", - "applyChanges": "Apply Changes", - "auto": { - "settings": { - "advancedTitle": "Î ĪÎŋĪ‡Ī‰ĪÎˇÎŧέÎŊÎą" - }, - "wordsToRedact": { - "add": "Î ĪÎŋĪƒÎ¸ÎŽÎēΡ" - } - }, - "manual": { - "pageRedactionNumbers": { - "title": "ÎŖÎĩÎģίδÎĩĪ‚", - "placeholder": "(Ī€.·. 1,2,8 ÎŽ 4,7,12-16 ÎŽ 2n-1)" - }, - "export": "Î•ÎžÎąÎŗĪ‰ÎŗÎŽ" - } + "applyChanges": "Apply Changes" }, "tableExtraxt": { "tags": "CSV,ÎĩÎžÎąÎŗĪ‰ÎŗÎŽ Ī€Î¯ÎŊÎąÎēÎą,ÎĩÎžÎąÎŗĪ‰ÎŗÎŽ,ÎŧÎĩĪ„ÎąĪ„ĪÎŋĪ€ÎŽ" @@ -1290,11 +2983,15 @@ "overlay-pdfs": { "tags": "ÎĩĪ€ÎšÎēÎŦÎģĪ…ĪˆÎˇ", "header": "Î•Ī€ÎšÎēÎŦÎģĪ…ĪˆÎˇ ÎąĪĪ‡ÎĩÎ¯Ī‰ÎŊ PDF", + "title": "Overlay PDFs", + "desc": "Overlay one PDF on top of another", "baseFile": { "label": "Î•Ī€ÎšÎģÎ­ÎžĪ„Îĩ Î˛ÎąĪƒÎšÎēΌ ÎąĪĪ‡ÎĩίÎŋ PDF" }, "overlayFiles": { - "label": "Î•Ī€ÎšÎģÎ­ÎžĪ„Îĩ ÎąĪĪ‡ÎĩÎ¯Îą PDF ÎĩĪ€ÎšÎēÎŦÎģĪ…ĪˆÎˇĪ‚" + "label": "Î•Ī€ÎšÎģÎ­ÎžĪ„Îĩ ÎąĪĪ‡ÎĩÎ¯Îą PDF ÎĩĪ€ÎšÎēÎŦÎģĪ…ĪˆÎˇĪ‚", + "placeholder": "Choose PDF(s)...", + "addMore": "Add more PDFs..." }, "mode": { "label": "Î•Ī€ÎšÎģÎ­ÎžĪ„Îĩ ÎģÎĩÎšĪ„ÎŋĪ…ĪÎŗÎ¯Îą ÎĩĪ€ÎšÎēÎŦÎģĪ…ĪˆÎˇĪ‚", @@ -1304,14 +3001,53 @@ }, "counts": { "label": "ΠÎģΎθÎŋĪ‚ ÎĩĪ€ÎšÎēÎąÎģĪĪˆÎĩΉÎŊ (ÎŗÎšÎą ÎģÎĩÎšĪ„ÎŋĪ…ĪÎŗÎ¯Îą ĪƒĪ„ÎąÎ¸ÎĩĪÎŽĪ‚ ÎĩĪ€ÎąÎŊÎŦÎģÎˇĪˆÎˇĪ‚)", - "placeholder": "Î•ÎšĪƒÎŦÎŗÎĩĪ„Îĩ Ī€ÎģΎθΡ Î´ÎšÎąĪ‡Ī‰ĪÎšĪƒÎŧέÎŊÎą ÎŧÎĩ ÎēΌÎŧÎŧÎą (Ī€.·. 2,3,1)" + "placeholder": "Î•ÎšĪƒÎŦÎŗÎĩĪ„Îĩ Ī€ÎģΎθΡ Î´ÎšÎąĪ‡Ī‰ĪÎšĪƒÎŧέÎŊÎą ÎŧÎĩ ÎēΌÎŧÎŧÎą (Ī€.·. 2,3,1)", + "item": "Count for file", + "noFiles": "Add overlay files to configure counts" }, "position": { "label": "Î•Ī€ÎšÎģÎ­ÎžĪ„Îĩ Î¸Î­ĪƒÎˇ ÎĩĪ€ÎšÎēÎŦÎģĪ…ĪˆÎˇĪ‚", "foreground": "Î ĪÎŋ΃ÎēÎŽÎŊΚÎŋ", "background": "ÎĻΌÎŊĪ„Îŋ" }, - "submit": "ÎĨĪ€ÎŋβÎŋÎģÎŽ" + "submit": "ÎĨĪ€ÎŋβÎŋÎģÎŽ", + "settings": { + "title": "Settings" + }, + "results": { + "title": "Overlay Results" + }, + "tooltip": { + "header": { + "title": "Overlay PDFs Overview" + }, + "description": { + "title": "Description", + "text": "Combine a base PDF with one or more overlay PDFs. Overlays can be applied page-by-page in different modes and placed in the foreground or background." + }, + "mode": { + "title": "Overlay Mode", + "text": "Choose how to distribute overlay pages across the base PDF pages.", + "sequential": "Sequential Overlay: Use pages from the first overlay PDF until it ends, then move to the next.", + "interleaved": "Interleaved Overlay: Take one page from each overlay in turn.", + "fixedRepeat": "Fixed Repeat Overlay: Take a set number of pages from each overlay before moving to the next. Use Counts to set the numbers." + }, + "position": { + "title": "Overlay Position", + "text": "Foreground places the overlay on top of the page. Background places it behind." + }, + "overlayFiles": { + "title": "Overlay Files", + "text": "Select one or more PDFs to overlay on the base. The order of these files affects how pages are applied in Sequential and Fixed Repeat modes." + }, + "counts": { + "title": "Counts (Fixed Repeat only)", + "text": "Provide a positive number for each overlay file showing how many pages to take before moving to the next. Required when mode is Fixed Repeat." + } + }, + "error": { + "failed": "An error occurred while overlaying PDFs." + } }, "split-by-sections": { "tags": "Î´ÎšÎąĪ‡Ī‰ĪÎšĪƒÎŧĪŒĪ‚ ÎĩÎŊÎŋĪ„ÎŽĪ„Ī‰ÎŊ,Î´ÎšÎąÎ¯ĪÎĩĪƒÎˇ,΀΁ÎŋĪƒÎąĪÎŧÎŋÎŗÎŽ", @@ -1332,6 +3068,7 @@ "tags": "ĪƒĪ†ĪÎąÎŗÎ¯Î´Îą,΀΁ÎŋĪƒÎ¸ÎŽÎēΡ ÎĩΚÎēΌÎŊÎąĪ‚,ÎēÎĩÎŊ΄΁ÎŦĪÎšĪƒÎŧÎą ÎĩΚÎēΌÎŊÎąĪ‚,Ī…Î´ÎąĪ„ÎŋÎŗĪÎŦĪ†ÎˇÎŧÎą,PDF,ÎĩÎŊĪƒĪ‰ÎŧÎŦĪ„Ī‰ĪƒÎˇ,΀΁ÎŋĪƒÎąĪÎŧÎŋÎŗÎŽ", "header": "ÎŖĪ†ĪÎŦÎŗÎšĪƒÎŧÎą PDF", "title": "ÎŖĪ†ĪÎŦÎŗÎšĪƒÎŧÎą PDF", + "stampSetup": "Stamp Setup", "stampType": "Î¤ĪĪ€ÎŋĪ‚ ĪƒĪ†ĪÎąÎŗÎ¯Î´ÎąĪ‚", "stampText": "ΚÎĩίÎŧÎĩÎŊÎŋ ĪƒĪ†ĪÎąÎŗÎ¯Î´ÎąĪ‚", "stampImage": "ΕιÎēΌÎŊÎą ĪƒĪ†ĪÎąÎŗÎ¯Î´ÎąĪ‚", @@ -1344,7 +3081,19 @@ "overrideY": "Î ÎąĪÎŦÎēÎąÎŧĪˆÎˇ ĪƒĪ…ÎŊĪ„ÎĩĪ„ÎąÎŗÎŧέÎŊÎˇĪ‚ Y", "customMargin": "Î ĪÎŋĪƒÎąĪÎŧÎŋ΃ÎŧέÎŊÎŋ Ī€ÎĩĪÎšÎ¸ĪŽĪÎšÎŋ", "customColor": "Î ĪÎŋĪƒÎąĪÎŧÎŋ΃ÎŧέÎŊÎŋ Ī‡ĪĪŽÎŧÎą ÎēÎĩΚÎŧέÎŊÎŋĪ…", - "submit": "ÎĨĪ€ÎŋβÎŋÎģÎŽ" + "submit": "ÎĨĪ€ÎŋβÎŋÎģÎŽ", + "noStampSelected": "No stamp selected. Return to Step 1.", + "customPosition": "Drag the stamp to the desired location in the preview window.", + "error": { + "failed": "An error occurred while adding stamp to the PDF." + }, + "imageSize": "Image Size", + "margin": "Margin", + "positionAndFormatting": "Position & Formatting", + "quickPosition": "Select a position on the page to place the stamp.", + "results": { + "title": "Stamp Results" + } }, "removeImagePdf": { "tags": "ÎąĪ†ÎąÎ¯ĪÎĩĪƒÎˇ ÎĩΚÎēΌÎŊÎąĪ‚,ÎģÎĩÎšĪ„ÎŋĪ…ĪÎŗÎ¯ÎĩĪ‚ ΃ÎĩÎģÎ¯Î´ÎąĪ‚,backend,server side" @@ -1362,7 +3111,8 @@ "status": { "_value": "ÎšÎąĪ„ÎŦĪƒĪ„ÎąĪƒÎˇ", "valid": "ÎˆÎŗÎēĪ…ĪÎˇ", - "invalid": "Μη Î­ÎŗÎēĪ…ĪÎˇ" + "invalid": "Μη Î­ÎŗÎēĪ…ĪÎˇ", + "complete": "Validation complete" }, "signer": "ÎĨĪ€ÎŋÎŗĪÎŦΆΉÎŊ", "date": "ΗÎŧÎĩ΁ÎŋÎŧΡÎŊÎ¯Îą", @@ -1389,40 +3139,122 @@ "version": "ΈÎēδÎŋĪƒÎˇ", "keyUsage": "Î§ĪÎŽĪƒÎˇ ÎēÎģÎĩΚδΚÎŋĪ", "selfSigned": "Î‘Ī…Ī„Îŋ-Ī…Ī€ÎŋÎŗÎĩÎŗĪÎąÎŧÎŧέÎŊÎŋ", - "bits": "bits" + "bits": "bits", + "details": "Certificate Details" }, "signature": { "info": "ΠÎģÎˇĪÎŋΆÎŋĪÎ¯ÎĩĪ‚ Ī…Ī€ÎŋÎŗĪÎąĪ†ÎŽĪ‚", "_value": "ÎĨĪ€ÎŋÎŗĪÎąĪ†ÎŽ", "mathValid": "Η Ī…Ī€ÎŋÎŗĪÎąĪ†ÎŽ ÎĩίÎŊιΚ ÎŧιθΡÎŧÎąĪ„ÎšÎēÎŦ Î­ÎŗÎēĪ…ĪÎˇ ΑΛΛΑ:" }, - "selectCustomCert": "Î ĪÎŋĪƒÎąĪÎŧÎŋ΃ÎŧέÎŊÎŋ ÎąĪĪ‡ÎĩίÎŋ Ī€ÎšĪƒĪ„ÎŋĪ€ÎŋÎšÎˇĪ„ÎšÎēÎŋĪ X.509 (Î ĪÎŋÎąÎšĪÎĩĪ„ÎšÎēΌ)" - }, - "replace-color": { - "title": "ΑÎŊĪ„ÎšÎēÎąĪ„ÎŦĪƒĪ„ÎąĪƒÎˇ-ΑÎŊÎąĪƒĪ„ĪÎŋĪ†ÎŽ Ī‡ĪĪŽÎŧÎąĪ„ÎŋĪ‚", - "header": "ΑÎŊĪ„ÎšÎēÎąĪ„ÎŦĪƒĪ„ÎąĪƒÎˇ-ΑÎŊÎąĪƒĪ„ĪÎŋĪ†ÎŽ Ī‡ĪĪŽÎŧÎąĪ„ÎŋĪ‚ PDF", - "selectText": { - "1": "Î•Ī€ÎšÎģÎŋÎŗÎ­Ī‚ ÎąÎŊĪ„ÎšÎēÎąĪ„ÎŦĪƒĪ„ÎąĪƒÎˇĪ‚ ÎŽ ÎąÎŊÎąĪƒĪ„ĪÎŋĪ†ÎŽĪ‚ Ī‡ĪĪŽÎŧÎąĪ„ÎŋĪ‚", - "2": "Î ĪÎŋÎĩĪ€ÎšÎģÎŋÎŗÎŽ (Î ĪÎŋÎĩĪ€ÎšÎģÎĩÎŗÎŧέÎŊÎą Ī‡ĪĪŽÎŧÎąĪ„Îą Ī…ĪˆÎˇÎģÎŽĪ‚ ÎąÎŊĪ„Î¯Î¸ÎĩĪƒÎˇĪ‚)", - "3": "Î ĪÎŋĪƒÎąĪÎŧÎŋÎŗÎŽ (Î ĪÎŋĪƒÎąĪÎŧÎŋ΃ÎŧέÎŊÎą Ī‡ĪĪŽÎŧÎąĪ„Îą)", - "4": "ΠÎģÎŽĪÎˇĪ‚ ÎąÎŊÎąĪƒĪ„ĪÎŋĪ†ÎŽ (ΑÎŊÎąĪƒĪ„ĪÎŋĪ†ÎŽ ΌÎģΉÎŊ ΄ΉÎŊ ·΁ΉÎŧÎŦ΄ΉÎŊ)", - "5": "Î•Ī€ÎšÎģÎŋÎŗÎ­Ī‚ ·΁ΉÎŧÎŦ΄ΉÎŊ Ī…ĪˆÎˇÎģÎŽĪ‚ ÎąÎŊĪ„Î¯Î¸ÎĩĪƒÎˇĪ‚", - "6": "ΛÎĩĪ…ÎēΌ ÎēÎĩίÎŧÎĩÎŊÎŋ ΃Îĩ ÎŧÎąĪĪÎŋ Ī†ĪŒÎŊĪ„Îŋ", - "7": "ÎœÎąĪĪÎŋ ÎēÎĩίÎŧÎĩÎŊÎŋ ΃Îĩ ÎģÎĩĪ…ÎēΌ Ī†ĪŒÎŊĪ„Îŋ", - "8": "ÎšÎ¯Ī„ĪÎšÎŊÎŋ ÎēÎĩίÎŧÎĩÎŊÎŋ ΃Îĩ ÎŧÎąĪĪÎŋ Ī†ĪŒÎŊĪ„Îŋ", - "9": "Î ĪÎŦĪƒÎšÎŊÎŋ ÎēÎĩίÎŧÎĩÎŊÎŋ ΃Îĩ ÎŧÎąĪĪÎŋ Ī†ĪŒÎŊĪ„Îŋ", - "10": "Î•Ī€ÎšÎģÎŋÎŗÎŽ Ī‡ĪĪŽÎŧÎąĪ„ÎŋĪ‚ ÎēÎĩΚÎŧέÎŊÎŋĪ…", - "11": "Î•Ī€ÎšÎģÎŋÎŗÎŽ Ī‡ĪĪŽÎŧÎąĪ„ÎŋĪ‚ Ī†ĪŒÎŊĪ„ÎŋĪ…" + "selectCustomCert": "Î ĪÎŋĪƒÎąĪÎŧÎŋ΃ÎŧέÎŊÎŋ ÎąĪĪ‡ÎĩίÎŋ Ī€ÎšĪƒĪ„ÎŋĪ€ÎŋÎšÎˇĪ„ÎšÎēÎŋĪ X.509 (Î ĪÎŋÎąÎšĪÎĩĪ„ÎšÎēΌ)", + "downloadCsv": "Download CSV", + "downloadJson": "Download JSON", + "downloadPdf": "Download PDF Report", + "downloadType": { + "csv": "CSV", + "json": "JSON", + "pdf": "PDF" }, - "submit": "ΑÎŊĪ„ÎšÎēÎąĪ„ÎŦĪƒĪ„ÎąĪƒÎˇ" + "error": { + "allFailed": "Unable to validate the selected files.", + "partial": "Some files could not be validated.", + "reportGeneration": "Could not generate the PDF report. JSON and CSV are available.", + "unexpected": "Unexpected error during validation." + }, + "finalizing": "Preparing downloads...", + "issue": { + "certExpired": "Certificate expired", + "certRevocationUnknown": "Certificate revocation status unknown", + "certRevoked": "Certificate revoked", + "chainInvalid": "Certificate chain invalid", + "signatureInvalid": "Signature cryptographic check failed", + "trustInvalid": "Certificate not trusted" + }, + "noResults": "Run the validation to generate a report.", + "noSignaturesShort": "No signatures", + "processing": "Validating signatures...", + "report": { + "continued": "Continued", + "downloads": "Downloads", + "entryLabel": "Signature Summary", + "fields": { + "created": "Created", + "fileSize": "File Size", + "signatureCount": "Total Signatures", + "signatureDate": "Signature Date" + }, + "filesEvaluated": "{{count}} files evaluated", + "footer": "Validated via Stirling PDF", + "generatedAt": "Generated", + "noPdf": "PDF report will be available after a successful validation.", + "page": "Page", + "shortTitle": "Signature Summary", + "signatureCountLabel": "{{count}} signatures", + "signaturesFound": "{{count}} signatures detected", + "signaturesValid": "{{count}} fully valid", + "title": "Signature Validation Report" + }, + "settings": { + "certHint": "Upload a trusted X.509 certificate to validate against a custom trust source.", + "title": "Validation Settings" + }, + "signatureDate": "Signature Date", + "totalSignatures": "Total Signatures" }, - "replaceColorPdf": { - "tags": "ÎąÎŊĪ„ÎšÎēÎąĪ„ÎŦĪƒĪ„ÎąĪƒÎˇ Ī‡ĪĪŽÎŧÎąĪ„ÎŋĪ‚,ÎģÎĩÎšĪ„ÎŋĪ…ĪÎŗÎ¯ÎĩĪ‚ ΃ÎĩÎģÎ¯Î´ÎąĪ‚,backend,server side" + "replaceColor": { + "tags": "Replace Colour,Page operations,Back end,server side", + "labels": { + "settings": "Settings", + "colourOperation": "Colour operation" + }, + "options": { + "highContrast": "High contrast", + "invertAll": "Invert all colours", + "custom": "Custom", + "cmyk": "Convert to CMYK" + }, + "tooltip": { + "header": { + "title": "Replace & Invert Colour Settings Overview" + }, + "description": { + "title": "Description", + "text": "Transform PDF colours to improve readability and accessibility. Choose from high contrast presets, invert all colours, or create custom colour schemes." + }, + "highContrast": { + "title": "High Contrast", + "text": "Apply predefined high contrast colour combinations designed for better readability and accessibility compliance.", + "bullet1": "White text on black background - Classic dark mode", + "bullet2": "Black text on white background - Standard high contrast", + "bullet3": "Yellow text on black background - High visibility option", + "bullet4": "Green text on black background - Alternative high contrast" + }, + "invertAll": { + "title": "Invert All Colours", + "text": "Completely invert all colours in the PDF, creating a negative-like effect. Useful for creating dark mode versions of documents or reducing eye strain in low-light conditions." + }, + "custom": { + "title": "Custom Colours", + "text": "Define your own text and background colours using the colour pickers. Perfect for creating branded documents or specific accessibility requirements.", + "bullet1": "Text colour - Choose the colour for text elements", + "bullet2": "Background colour - Set the background colour for the document" + }, + "cmyk": { + "title": "Convert to CMYK", + "text": "Convert the PDF from RGB colour space to CMYK colour space, optimized for professional printing. This process converts colours to the Cyan, Magenta, Yellow, Black model used by printers." + } + }, + "error": { + "failed": "An error occurred while processing the colour replacement." + } }, "login": { "title": "ÎŖĪÎŊδÎĩĪƒÎˇ", "header": "ÎŖĪÎŊδÎĩĪƒÎˇ", "signin": "ÎŖĪÎŊδÎĩĪƒÎˇ", + "signInWith": "Sign in with", + "signInAnonymously": "Sign Up as a Guest", "rememberme": "Να ÎŧÎĩ Î¸Ī…ÎŧÎŦĪƒÎąÎš", "invalid": "Μη Î­ÎŗÎē΅΁Îŋ ΌÎŊÎŋÎŧÎą Ī‡ĪÎŽĪƒĪ„Îˇ ÎŽ ÎēĪ‰Î´ÎšÎēĪŒĪ‚.", "locked": "Ο ÎģÎŋÎŗÎąĪÎšÎąĪƒÎŧĪŒĪ‚ ĪƒÎąĪ‚ Î­Ī‡ÎĩΚ ÎēÎģÎĩÎšÎ´Ī‰Î¸Îĩί.", @@ -1441,12 +3273,83 @@ "alreadyLoggedIn": "Î•Î¯ĪƒĪ„Îĩ ΎδΡ ĪƒĪ…ÎŊδÎĩδÎĩÎŧέÎŊÎŋΚ ΃Îĩ", "alreadyLoggedIn2": "ĪƒĪ…ĪƒÎēÎĩĪ…Î­Ī‚. Î ÎąĪÎąÎēÎąÎģĪŽ ÎąĪ€ÎŋĪƒĪ…ÎŊδÎĩθÎĩÎ¯Ī„Îĩ ÎąĪ€ĪŒ Ī„ÎšĪ‚ ĪƒĪ…ĪƒÎēÎĩĪ…Î­Ī‚ ÎēιΚ ΀΁ÎŋĪƒĪ€ÎąÎ¸ÎŽĪƒĪ„Îĩ ΞιÎŊÎŦ.", "toManySessions": "ÎˆĪ‡ÎĩĪ„Îĩ Ī€ÎŦĪÎą Ī€ÎŋÎģÎģÎ­Ī‚ ÎĩÎŊÎĩĪÎŗÎ­Ī‚ ĪƒĪ…ÎŊÎĩÎ´ĪÎ¯ÎĩĪ‚", - "logoutMessage": "You have been logged out." + "logoutMessage": "You have been logged out.", + "youAreLoggedIn": "You are logged in!", + "email": "Email", + "password": "Password", + "enterEmail": "Enter your email", + "enterPassword": "Enter your password", + "loggingIn": "Logging In...", + "username": "Username", + "enterUsername": "Enter username", + "useEmailInstead": "Login with email", + "forgotPassword": "Forgot your password?", + "logIn": "Log In", + "signingIn": "Signing in...", + "login": "Login", + "or": "Or", + "useMagicLink": "Use magic link instead", + "enterEmailForMagicLink": "Enter your email for magic link", + "sending": "Sendingâ€Ļ", + "sendMagicLink": "Send Magic Link", + "cancel": "Cancel", + "dontHaveAccount": "Don't have an account? Sign up", + "home": "Home", + "debug": "Debug", + "signOut": "Sign Out", + "pleaseEnterBoth": "Please enter both email and password", + "pleaseEnterEmail": "Please enter your email address", + "magicLinkSent": "Magic link sent to {{email}}! Check your email and click the link to sign in.", + "passwordResetSent": "Password reset link sent to {{email}}! Check your email and follow the instructions.", + "failedToSignIn": "Failed to sign in with {{provider}}: {{message}}", + "unexpectedError": "Unexpected error: {{message}}", + "accountCreatedSuccess": "Account created successfully! You can now sign in.", + "passwordChangedSuccess": "Password changed successfully! Please sign in with your new password.", + "credentialsUpdated": "Your credentials have been updated. Please sign in again." + }, + "signup": { + "title": "Create an account", + "subtitle": "Join Stirling PDF to get started", + "name": "Name", + "email": "Email", + "password": "Password", + "confirmPassword": "Confirm password", + "enterName": "Enter your name", + "enterEmail": "Enter your email", + "enterPassword": "Enter your password", + "confirmPasswordPlaceholder": "Confirm password", + "or": "or", + "creatingAccount": "Creating Account...", + "signUp": "Sign Up", + "alreadyHaveAccount": "Already have an account? Sign in", + "pleaseFillAllFields": "Please fill in all fields", + "passwordsDoNotMatch": "Passwords do not match", + "passwordTooShort": "Password must be at least 6 characters long", + "invalidEmail": "Please enter a valid email address", + "checkEmailConfirmation": "Check your email for a confirmation link to complete your registration.", + "accountCreatedSuccessfully": "Account created successfully! You can now sign in.", + "unexpectedError": "Unexpected error: {{message}}", + "useEmailInstead": "Use Email Instead", + "nameRequired": "Name is required", + "emailRequired": "Email is required", + "passwordRequired": "Password is required", + "confirmPasswordRequired": "Please confirm your password" }, "pdfToSinglePage": { "title": "PDF ΃Îĩ ÎŧÎ¯Îą ΃ÎĩÎģÎ¯Î´Îą", "header": "PDF ΃Îĩ ÎŧÎ¯Îą ΃ÎĩÎģÎ¯Î´Îą", - "submit": "ΜÎĩĪ„ÎąĪ„ĪÎŋĪ€ÎŽ ΃Îĩ ÎŧÎ¯Îą ΃ÎĩÎģÎ¯Î´Îą" + "submit": "ΜÎĩĪ„ÎąĪ„ĪÎŋĪ€ÎŽ ΃Îĩ ÎŧÎ¯Îą ΃ÎĩÎģÎ¯Î´Îą", + "description": "This tool will merge all pages of your PDF into one large single page. The width will remain the same as the original pages, but the height will be the sum of all page heights.", + "filenamePrefix": "single_page", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst converting to single page." + }, + "results": { + "title": "Single Page Results" + } }, "pageExtracter": { "title": "Î•ÎžÎąÎŗĪ‰ÎŗÎŽ ΃ÎĩÎģÎ¯Î´Ī‰ÎŊ", @@ -1470,18 +3373,59 @@ "adjustContrast": { "title": "Î ĪÎŋĪƒÎąĪÎŧÎŋÎŗÎŽ ÎąÎŊĪ„Î¯Î¸ÎĩĪƒÎˇĪ‚", "header": "Î ĪÎŋĪƒÎąĪÎŧÎŋÎŗÎŽ ÎąÎŊĪ„Î¯Î¸ÎĩĪƒÎˇĪ‚", + "basic": "Basic Adjustments", "contrast": "ΑÎŊĪ„Î¯Î¸ÎĩĪƒÎˇ:", "brightness": "ÎĻΉ΄ÎĩΚÎŊĪŒĪ„ÎˇĪ„Îą:", "saturation": "ΚÎŋ΁Îĩ΃ÎŧĪŒĪ‚:", - "download": "Î›ÎŽĪˆÎˇ" + "download": "Î›ÎŽĪˆÎˇ", + "adjustColors": "Adjust Colors", + "blue": "Blue", + "confirm": "Confirm", + "error": { + "failed": "Failed to adjust colors/contrast" + }, + "green": "Green", + "noPreview": "Select a PDF to preview", + "red": "Red", + "results": { + "title": "Adjusted PDF" + } }, "compress": { "title": "ÎŖĪ…ÎŧĪ€Î¯ÎĩĪƒÎˇ", + "desc": "Compress PDFs to reduce their file size.", "header": "ÎŖĪ…ÎŧĪ€Î¯ÎĩĪƒÎˇ PDF", + "method": { + "title": "Compression Method", + "quality": "Quality", + "filesize": "ÎœÎ­ÎŗÎĩθÎŋĪ‚ ÎąĪĪ‡ÎĩίÎŋĪ…" + }, "credit": "Î‘Ī…Ī„ÎŽ Ρ Ī…Ī€ÎˇĪÎĩĪƒÎ¯Îą Ī‡ĪÎˇĪƒÎšÎŧÎŋĪ€ÎŋΚÎĩί qpdf ÎŗÎšÎą ĪƒĪ…ÎŧĪ€Î¯ÎĩĪƒÎˇ/βÎĩÎģĪ„ÎšĪƒĪ„ÎŋĪ€ÎŋÎ¯ÎˇĪƒÎˇ PDF.", "grayscale": { "label": "Î•Ī†ÎąĪÎŧÎŋÎŗÎŽ ÎēÎģίÎŧÎąÎēÎąĪ‚ Ī„ÎŋĪ… ÎŗÎēĪÎš ÎŗÎšÎą ĪƒĪ…ÎŧĪ€Î¯ÎĩĪƒÎˇ" }, + "tooltip": { + "header": { + "title": "Compress Settings Overview" + }, + "description": { + "title": "Description", + "text": "Compression is an easy way to reduce your file size. Pick File Size to enter a target size and have us adjust quality for you. Pick Quality to set compression strength manually." + }, + "qualityAdjustment": { + "title": "Quality Adjustment", + "text": "Drag the slider to adjust the compression strength. Lower values (1-3) preserve quality but result in larger files. Higher values (7-9) shrink the file more but reduce image clarity.", + "bullet1": "Lower values preserve quality", + "bullet2": "Higher values reduce file size" + }, + "grayscale": { + "title": "Grayscale", + "text": "Select this option to convert all images to black and white, which can significantly reduce file size especially for scanned PDFs or image-heavy documents." + } + }, + "error": { + "failed": "An error occurred while compressing the PDF." + }, "selectText": { "1": { "_value": "Compression Settings", @@ -1491,10 +3435,7 @@ "4": "Î‘Ī…Ī„ĪŒÎŧÎąĪ„Îˇ ÎģÎĩÎšĪ„ÎŋĪ…ĪÎŗÎ¯Îą - Î‘Ī…Ī„ĪŒÎŧÎąĪ„Îˇ ΀΁ÎŋĪƒÎąĪÎŧÎŋÎŗÎŽ Ī€ÎŋÎšĪŒĪ„ÎˇĪ„ÎąĪ‚ ÎŗÎšÎą ÎĩĪ€Î¯Ī„ÎĩĪ…ÎžÎˇ ÎąÎēĪÎšÎ˛ÎŋĪĪ‚ ÎŧÎĩÎŗÎ­Î¸ÎŋĪ…Ī‚ PDF", "5": "ΑÎŊÎąÎŧÎĩÎŊΌÎŧÎĩÎŊÎŋ ÎŧÎ­ÎŗÎĩθÎŋĪ‚ PDF (Ī€.·. 25MB, 10.8MB, 25KB)" }, - "submit": "ÎŖĪ…ÎŧĪ€Î¯ÎĩĪƒÎˇ", - "method": { - "filesize": "ÎœÎ­ÎŗÎĩθÎŋĪ‚ ÎąĪĪ‡ÎĩίÎŋĪ…" - } + "submit": "ÎŖĪ…ÎŧĪ€Î¯ÎĩĪƒÎˇ" }, "decrypt": { "passwordPrompt": "Î‘Ī…Ī„ĪŒ Ī„Îŋ ÎąĪĪ‡ÎĩίÎŋ ΀΁ÎŋĪƒĪ„ÎąĪ„ÎĩĪÎĩĪ„ÎąÎš ÎŧÎĩ ÎēĪ‰Î´ÎšÎēΌ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚. Î ÎąĪÎąÎēÎąÎģĪŽ ÎĩÎšĪƒÎŦÎŗÎĩĪ„Îĩ Ī„ÎŋÎŊ ÎēĪ‰Î´ÎšÎēΌ:", @@ -1595,7 +3536,13 @@ "title": "Î‘Ī†ÎąÎ¯ĪÎĩĪƒÎˇ ÎĩΚÎēΌÎŊÎąĪ‚", "header": "Î‘Ī†ÎąÎ¯ĪÎĩĪƒÎˇ ÎĩΚÎēΌÎŊÎąĪ‚", "removeImage": "Î‘Ī†ÎąÎ¯ĪÎĩĪƒÎˇ ÎĩΚÎēΌÎŊÎąĪ‚", - "submit": "Î‘Ī†ÎąÎ¯ĪÎĩĪƒÎˇ ÎĩΚÎēΌÎŊÎąĪ‚" + "submit": "Î‘Ī†ÎąÎ¯ĪÎĩĪƒÎˇ ÎĩΚÎēΌÎŊÎąĪ‚", + "error": { + "failed": "Failed to remove images from the PDF." + }, + "results": { + "title": "Remove Images Results" + } }, "splitByChapters": { "title": "Î”ÎšÎąĪ‡Ī‰ĪÎšĪƒÎŧĪŒĪ‚ PDF ÎąÎŊÎŦ ÎēÎĩΆÎŦÎģιΚι", @@ -1629,6 +3576,12 @@ }, "note": "Οι ĪƒÎˇÎŧÎĩÎšĪŽĪƒÎĩÎšĪ‚ έÎēδÎŋĪƒÎˇĪ‚ ÎĩίÎŊιΚ Î´ÎšÎąÎ¸Î­ĪƒÎšÎŧÎĩĪ‚ ÎŧΌÎŊÎŋ ĪƒĪ„Îą Î‘ÎŗÎŗÎģΚÎēÎŦ" }, + "swagger": { + "title": "API Documentation", + "header": "API Documentation", + "desc": "View and test the Stirling PDF API endpoints", + "tags": "api,documentation,swagger,endpoints,development" + }, "cookieBanner": { "popUp": { "title": "How we use Cookies", @@ -1664,53 +3617,943 @@ "title": "Analytics", "description": "These cookies help us understand how our tools are being used, so we can focus on building the features our community values most. Rest assured—Stirling PDF cannot and will never track the content of the documents you work with." } + }, + "services": { + "posthog": "PostHog Analytics", + "scarf": "Scarf Pixel" } }, - "download": "Î›ÎŽĪˆÎˇ", - "convert": { - "title": "ΜÎĩĪ„ÎąĪ„ĪÎŋĪ€ÎŽ", - "settings": "ÎĄĪ…Î¸ÎŧÎ¯ĪƒÎĩÎšĪ‚", - "color": "Î§ĪĪŽÎŧÎą", - "greyscale": "ΚÎģίÎŧÎąÎēÎą Ī„ÎŋĪ… ÎŗÎēĪÎš", - "fillPage": "ΓέÎŧÎšĪƒÎŧÎą ΃ÎĩÎģÎ¯Î´ÎąĪ‚", - "pdfaDigitalSignatureWarning": "ΤÎŋ PDF Ī€ÎĩĪÎšÎ­Ī‡ÎĩΚ ĪˆÎˇĪ†ÎšÎąÎēÎŽ Ī…Ī€ÎŋÎŗĪÎąĪ†ÎŽ. Î‘Ī…Ī„ÎŽ θι ÎąĪ†ÎąÎšĪÎĩθÎĩί ĪƒĪ„Îŋ ÎĩĪ€ĪŒÎŧÎĩÎŊÎŋ βΎÎŧÎą.", - "grayscale": "ΚÎģίÎŧÎąÎēÎą Ī„ÎŋĪ… ÎŗÎēĪÎš" + "removeMetadata": { + "submit": "Remove Metadata" }, - "attachments": { - "tags": "embed,attach,file,attachment,attachments", - "title": "Add attachments", - "header": "Add attachments", - "submit": "Add attachments" + "sidebar": { + "toggle": "Toggle Sidebar" + }, + "theme": { + "toggle": "Toggle Theme" + }, + "view": { + "viewer": "Viewer", + "pageEditor": "Page Editor", + "fileManager": "File Manager" + }, + "pageEditor": { + "title": "Page Editor", + "save": "Save Changes", + "noPdfLoaded": "No PDF loaded. Please upload a PDF to edit.", + "rotatedLeft": "Rotated left:", + "rotatedRight": "Rotated right:", + "deleted": "Deleted:", + "movedLeft": "Moved left:", + "movedRight": "Moved right:", + "splitAt": "Split at:", + "insertedPageBreak": "Inserted page break at:", + "addFileNotImplemented": "Add file not implemented in demo", + "closePdf": "Close PDF", + "reset": "Reset Changes", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "fitToWidth": "Fit to Width", + "actualSize": "Actual Size" + }, + "viewer": { + "firstPage": "First Page", + "lastPage": "Last Page", + "previousPage": "Previous Page", + "nextPage": "Next Page", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "singlePageView": "Single Page View", + "dualPageView": "Dual Page View" }, "rightRail": { + "closeSelected": "Close Selected Files", "selectAll": "Î•Ī€ÎšÎģÎŋÎŗÎŽ ΌÎģΉÎŊ", - "deselectAll": "Î‘Ī€ÎŋÎĩĪ€ÎšÎģÎŋÎŗÎŽ ΌÎģΉÎŊ" + "deselectAll": "Î‘Ī€ÎŋÎĩĪ€ÎšÎģÎŋÎŗÎŽ ΌÎģΉÎŊ", + "selectByNumber": "Select by Page Numbers", + "deleteSelected": "Delete Selected Pages", + "closePdf": "Close PDF", + "exportAll": "Export PDF", + "downloadSelected": "Download Selected Files", + "downloadAll": "Download All", + "toggleTheme": "Toggle Theme", + "language": "Language", + "search": "Search PDF", + "panMode": "Pan Mode", + "rotateLeft": "Rotate Left", + "rotateRight": "Rotate Right", + "toggleSidebar": "Toggle Sidebar", + "exportSelected": "Export Selected Pages", + "toggleAnnotations": "Toggle Annotations Visibility", + "annotationMode": "Toggle Annotation Mode", + "draw": "Draw", + "save": "Save" + }, + "search": { + "title": "Search PDF", + "placeholder": "Enter search term...", + "noResults": "No results found", + "searching": "Searching..." + }, + "guestBanner": { + "title": "You're using Stirling PDF as a guest!", + "message": "Create a free account to save your work, access more features, and support the project.", + "dismiss": "Dismiss banner", + "signUp": "Sign Up Free" + }, + "toolPicker": { + "searchPlaceholder": "Search tools...", + "noToolsFound": "No tools found", + "allTools": "ALL TOOLS", + "quickAccess": "QUICK ACCESS", + "categories": { + "standardTools": "Standard Tools", + "advancedTools": "Advanced Tools", + "recommendedTools": "Recommended Tools" + }, + "subcategories": { + "signing": "Signing", + "documentSecurity": "Document Security", + "verification": "Verification", + "documentReview": "Document Review", + "pageFormatting": "Page Formatting", + "extraction": "Extraction", + "removal": "Removal", + "automation": "Automation", + "general": "General", + "advancedFormatting": "Advanced Formatting", + "developerTools": "Developer Tools" + } }, "quickAccess": { - "sign": "ÎĨĪ€ÎŋÎŗĪÎąĪ†ÎŽ" + "read": "Read", + "sign": "ÎĨĪ€ÎŋÎŗĪÎąĪ†ÎŽ", + "automate": "Automate", + "files": "Files", + "activity": "Activity", + "help": "Help", + "account": "Account", + "config": "Config", + "adminSettings": "Admin Settings", + "allTools": "All Tools" + }, + "admin": { + "error": "Error", + "success": "Success", + "expand": "Expand", + "close": "Close", + "status": { + "active": "Active", + "inactive": "Inactive" + }, + "settings": { + "title": "Admin Settings", + "workspace": "Workspace", + "fetchError": "Failed to load settings", + "saveError": "Failed to save settings", + "saved": "Settings saved successfully", + "saveSuccess": "Settings saved successfully", + "save": "Save Changes", + "restartRequired": "Restart Required", + "restart": { + "title": "Restart Required", + "message": "Settings have been saved successfully. A server restart is required for the changes to take effect.", + "question": "Would you like to restart the server now or later?", + "now": "Restart Now", + "later": "Restart Later" + }, + "restarting": "Restarting Server", + "restartingMessage": "The server is restarting. Please wait a moment...", + "restartError": "Failed to restart server. Please restart manually.", + "general": { + "title": "System Settings", + "description": "Configure system-wide application settings including branding and default behaviour.", + "ui": "User Interface", + "system": "System", + "appName": { + "label": "Application Name", + "description": "The name displayed in the browser tab and home page" + }, + "appNameNavbar": { + "label": "Navbar Brand", + "description": "The name displayed in the navigation bar" + }, + "homeDescription": { + "label": "Home Description", + "description": "The description text shown on the home page" + }, + "defaultLocale": { + "label": "Default Locale", + "description": "The default language for new users (e.g., en_US, es_ES)" + }, + "fileUploadLimit": { + "label": "File Upload Limit", + "description": "Maximum file upload size (e.g., 100MB, 1GB)" + }, + "showUpdate": { + "label": "Show Update Notifications", + "description": "Display notifications when a new version is available" + }, + "showUpdateOnlyAdmin": { + "label": "Show Updates to Admins Only", + "description": "Restrict update notifications to admin users only" + }, + "customHTMLFiles": { + "label": "Custom HTML Files", + "description": "Allow serving custom HTML files from the customFiles directory" + }, + "languages": { + "label": "Available Languages", + "description": "Languages that users can select from (leave empty to enable all languages)" + }, + "customMetadata": { + "label": "Custom Metadata", + "autoUpdate": { + "label": "Auto Update Metadata", + "description": "Automatically update PDF metadata on all processed documents" + }, + "author": { + "label": "Default Author", + "description": "Default author for PDF metadata (e.g., username)" + }, + "creator": { + "label": "Default Creator", + "description": "Default creator for PDF metadata" + }, + "producer": { + "label": "Default Producer", + "description": "Default producer for PDF metadata" + } + }, + "customPaths": { + "label": "Custom Paths", + "description": "Configure custom file system paths for pipeline processing and external tools", + "pipeline": { + "label": "Pipeline Directories", + "watchedFoldersDir": { + "label": "Watched Folders Directory", + "description": "Directory where pipeline monitors for incoming PDFs (leave empty for default: /pipeline/watchedFolders)" + }, + "finishedFoldersDir": { + "label": "Finished Folders Directory", + "description": "Directory where processed PDFs are outputted (leave empty for default: /pipeline/finishedFolders)" + } + }, + "operations": { + "label": "External Tool Paths", + "weasyprint": { + "label": "WeasyPrint Executable", + "description": "Path to WeasyPrint executable for HTML to PDF conversion (leave empty for default: /opt/venv/bin/weasyprint)" + }, + "unoconvert": { + "label": "Unoconvert Executable", + "description": "Path to LibreOffice unoconvert for document conversions (leave empty for default: /opt/venv/bin/unoconvert)" + } + } + } + }, + "security": { + "title": "Security", + "description": "Configure authentication, login behaviour, and security policies.", + "ssoNotice": { + "title": "Looking for SSO/SAML settings?", + "message": "OAuth2 and SAML2 authentication providers have been moved to the Connections menu for easier management." + }, + "authentication": "Authentication", + "enableLogin": { + "label": "Enable Login", + "description": "Require users to log in before accessing the application" + }, + "loginMethod": { + "label": "Login Method", + "description": "The authentication method to use for user login", + "all": "All Methods", + "normal": "Username/Password Only", + "oauth2": "OAuth2 Only", + "saml2": "SAML2 Only" + }, + "loginAttemptCount": { + "label": "Login Attempt Limit", + "description": "Maximum number of failed login attempts before account lockout" + }, + "loginResetTimeMinutes": { + "label": "Login Reset Time (minutes)", + "description": "Time before failed login attempts are reset" + }, + "csrfDisabled": { + "label": "Disable CSRF Protection", + "description": "Disable Cross-Site Request Forgery protection (not recommended)" + }, + "initialLogin": { + "label": "Initial Login", + "username": { + "label": "Initial Username", + "description": "The username for the initial admin account" + }, + "password": { + "label": "Initial Password", + "description": "The password for the initial admin account" + } + }, + "jwt": { + "label": "JWT Configuration", + "secureCookie": { + "label": "Secure Cookie", + "description": "Require HTTPS for JWT cookies (recommended for production)" + }, + "keyRetentionDays": { + "label": "Key Retention Days", + "description": "Number of days to retain old JWT keys for verification" + }, + "persistence": { + "label": "Enable Key Persistence", + "description": "Store JWT keys persistently to survive server restarts" + }, + "enableKeyRotation": { + "label": "Enable Key Rotation", + "description": "Automatically rotate JWT signing keys periodically" + }, + "enableKeyCleanup": { + "label": "Enable Key Cleanup", + "description": "Automatically remove expired JWT keys" + } + }, + "audit": { + "label": "Audit Logging", + "enabled": { + "label": "Enable Audit Logging", + "description": "Track user actions and system events for compliance and security monitoring" + }, + "level": { + "label": "Audit Level", + "description": "0=OFF, 1=BASIC, 2=STANDARD, 3=VERBOSE" + }, + "retentionDays": { + "label": "Audit Retention (days)", + "description": "Number of days to retain audit logs" + } + }, + "htmlUrlSecurity": { + "label": "HTML URL Security", + "description": "Configure URL access restrictions for HTML processing to prevent SSRF attacks", + "enabled": { + "label": "Enable URL Security", + "description": "Enable URL security restrictions for HTML to PDF conversions" + }, + "level": { + "label": "Security Level", + "description": "MAX: whitelist only, MEDIUM: block internal networks, OFF: no restrictions", + "max": "Maximum (Whitelist Only)", + "medium": "Medium (Block Internal)", + "off": "Off (No Restrictions)" + }, + "advanced": "Advanced Settings", + "allowedDomains": { + "label": "Allowed Domains (Whitelist)", + "description": "One domain per line (e.g., cdn.example.com). Only these domains allowed when level is MAX" + }, + "blockedDomains": { + "label": "Blocked Domains (Blacklist)", + "description": "One domain per line (e.g., malicious.com). Additional domains to block" + }, + "internalTlds": { + "label": "Internal TLDs", + "description": "One TLD per line (e.g., .local, .internal). Block domains with these TLD patterns" + }, + "networkBlocking": "Network Blocking", + "blockPrivateNetworks": { + "label": "Block Private Networks", + "description": "Block RFC 1918 private networks (10.x.x.x, 192.168.x.x, 172.16-31.x.x)" + }, + "blockLocalhost": { + "label": "Block Localhost", + "description": "Block localhost and loopback addresses (127.x.x.x, ::1)" + }, + "blockLinkLocal": { + "label": "Block Link-Local Addresses", + "description": "Block link-local addresses (169.254.x.x, fe80::/10)" + }, + "blockCloudMetadata": { + "label": "Block Cloud Metadata Endpoints", + "description": "Block cloud provider metadata endpoints (169.254.169.254)" + } + } + }, + "connections": { + "title": "Connections", + "description": "Configure external authentication providers like OAuth2 and SAML.", + "linkedServices": "Linked Services", + "unlinkedServices": "Unlinked Services", + "connect": "Connect", + "disconnect": "Disconnect", + "disconnected": "Provider disconnected successfully", + "disconnectError": "Failed to disconnect provider", + "ssoAutoLogin": { + "label": "SSO Auto Login", + "enable": "Enable SSO Auto Login", + "description": "Automatically redirect to SSO login when authentication is required" + }, + "oauth2": { + "label": "OAuth2", + "enabled": { + "label": "Enable OAuth2", + "description": "Allow users to authenticate using OAuth2 providers" + }, + "provider": { + "label": "Provider", + "description": "The OAuth2 provider to use for authentication" + }, + "issuer": { + "label": "Issuer URL", + "description": "The OAuth2 provider issuer URL" + }, + "clientId": { + "label": "Client ID", + "description": "The OAuth2 client ID from your provider" + }, + "clientSecret": { + "label": "Client Secret", + "description": "The OAuth2 client secret from your provider" + }, + "useAsUsername": { + "label": "Use as Username", + "description": "The OAuth2 claim to use as the username (e.g., email, sub)" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first OAuth2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via OAuth2" + }, + "scopes": { + "label": "OAuth2 Scopes", + "description": "Comma-separated list of OAuth2 scopes to request (e.g., openid, profile, email)" + } + }, + "saml2": { + "label": "SAML2", + "enabled": { + "label": "Enable SAML2", + "description": "Allow users to authenticate using SAML2 providers" + }, + "provider": { + "label": "Provider", + "description": "The SAML2 provider name" + }, + "registrationId": { + "label": "Registration ID", + "description": "The SAML2 registration identifier" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first SAML2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via SAML2" + } + } + }, + "database": { + "title": "Database", + "description": "Configure custom database connection settings for enterprise deployments.", + "configuration": "Database Configuration", + "enableCustom": { + "label": "Enable Custom Database", + "description": "Use your own custom database configuration instead of the default embedded database" + }, + "customUrl": { + "label": "Custom Database URL", + "description": "Full JDBC connection string (e.g., jdbc:postgresql://localhost:5432/postgres). If provided, individual connection settings below are not used." + }, + "type": { + "label": "Database Type", + "description": "Type of database (not used if custom URL is provided)" + }, + "hostName": { + "label": "Host Name", + "description": "Database server hostname (not used if custom URL is provided)" + }, + "port": { + "label": "Port", + "description": "Database server port (not used if custom URL is provided)" + }, + "name": { + "label": "Database Name", + "description": "Name of the database (not used if custom URL is provided)" + }, + "username": { + "label": "Username", + "description": "Database authentication username" + }, + "password": { + "label": "Password", + "description": "Database authentication password" + } + }, + "privacy": { + "title": "Privacy", + "description": "Configure privacy and data collection settings.", + "analytics": "Analytics & Tracking", + "enableAnalytics": { + "label": "Enable Analytics", + "description": "Collect anonymous usage analytics to help improve the application" + }, + "metricsEnabled": { + "label": "Enable Metrics", + "description": "Enable collection of performance and usage metrics. Provides API endpoint for admins to access metrics data" + }, + "searchEngine": "Search Engine Visibility", + "googleVisibility": { + "label": "Google Visibility", + "description": "Allow search engines to index this application" + } + }, + "advanced": { + "title": "Advanced", + "description": "Configure advanced features and experimental functionality.", + "features": "Feature Flags", + "processing": "Processing", + "endpoints": { + "label": "Endpoints", + "manage": "Manage API Endpoints", + "description": "Endpoint management is configured via YAML. See documentation for details on enabling/disabling specific endpoints." + }, + "enableAlphaFunctionality": { + "label": "Enable Alpha Features", + "description": "Enable experimental and alpha-stage features (may be unstable)" + }, + "enableUrlToPDF": { + "label": "Enable URL to PDF", + "description": "Allow conversion of web pages to PDF documents" + }, + "maxDPI": { + "label": "Maximum DPI", + "description": "Maximum DPI for image processing (0 = unlimited)" + }, + "tessdataDir": { + "label": "Tessdata Directory", + "description": "Path to the tessdata directory for OCR language files" + }, + "disableSanitize": { + "label": "Disable HTML Sanitization", + "description": "WARNING: Security risk - disabling HTML sanitization can lead to XSS vulnerabilities" + }, + "tempFileManagement": { + "label": "Temp File Management", + "description": "Configure temporary file storage and cleanup behavior", + "baseTmpDir": { + "label": "Base Temp Directory", + "description": "Base directory for temporary files (leave empty for default: java.io.tmpdir/stirling-pdf)" + }, + "libreofficeDir": { + "label": "LibreOffice Temp Directory", + "description": "Directory for LibreOffice temp files (leave empty for default: baseTmpDir/libreoffice)" + }, + "systemTempDir": { + "label": "System Temp Directory", + "description": "System temp directory to clean (only used if cleanupSystemTemp is enabled)" + }, + "prefix": { + "label": "Temp File Prefix", + "description": "Prefix for temp file names" + }, + "maxAgeHours": { + "label": "Max Age (hours)", + "description": "Maximum age in hours before temp files are cleaned up" + }, + "cleanupIntervalMinutes": { + "label": "Cleanup Interval (minutes)", + "description": "How often to run cleanup (in minutes)" + }, + "startupCleanup": { + "label": "Startup Cleanup", + "description": "Clean up old temp files on application startup" + }, + "cleanupSystemTemp": { + "label": "Cleanup System Temp", + "description": "Whether to clean broader system temp directory (use with caution)" + } + }, + "processExecutor": { + "label": "Process Executor Limits", + "description": "Configure session limits and timeouts for each process executor", + "sessionLimit": { + "label": "Session Limit", + "description": "Maximum concurrent instances" + }, + "timeout": { + "label": "Timeout (minutes)", + "description": "Maximum execution time" + }, + "libreOffice": "LibreOffice", + "pdfToHtml": "PDF to HTML", + "qpdf": "QPDF", + "tesseract": "Tesseract OCR", + "pythonOpenCv": "Python OpenCV", + "weasyPrint": "WeasyPrint", + "installApp": "Install App", + "calibre": "Calibre", + "ghostscript": "Ghostscript", + "ocrMyPdf": "OCRmyPDF" + } + }, + "mail": { + "title": "Mail Server", + "description": "Configure SMTP settings for sending email notifications.", + "smtp": "SMTP Configuration", + "enabled": { + "label": "Enable Mail", + "description": "Enable email notifications and SMTP functionality" + }, + "host": { + "label": "SMTP Host", + "description": "The hostname or IP address of your SMTP server" + }, + "port": { + "label": "SMTP Port", + "description": "The port number for SMTP connection (typically 25, 465, or 587)" + }, + "username": { + "label": "SMTP Username", + "description": "Username for SMTP authentication" + }, + "password": { + "label": "SMTP Password", + "description": "Password for SMTP authentication" + }, + "from": { + "label": "From Address", + "description": "The email address to use as the sender" + }, + "enableInvites": { + "label": "Enable Email Invites", + "description": "Allow admins to invite users via email with auto-generated passwords" + }, + "frontendUrl": { + "label": "Frontend URL", + "description": "Base URL for frontend (e.g. https://pdf.example.com). Used for generating invite links in emails. Leave empty to use backend URL." + } + }, + "legal": { + "title": "Legal Documents", + "description": "Configure links to legal documents and policies.", + "disclaimer": { + "title": "Legal Responsibility Warning", + "message": "By customizing these legal documents, you assume full responsibility for ensuring compliance with all applicable laws and regulations, including but not limited to GDPR and other EU data protection requirements. Only modify these settings if: (1) you are operating a personal/private instance, (2) you are outside EU jurisdiction and understand your local legal obligations, or (3) you have obtained proper legal counsel and accept sole responsibility for all user data and legal compliance. Stirling-PDF and its developers assume no liability for your legal obligations." + }, + "termsAndConditions": { + "label": "Terms and Conditions", + "description": "URL or filename to terms and conditions" + }, + "privacyPolicy": { + "label": "Privacy Policy", + "description": "URL or filename to privacy policy" + }, + "accessibilityStatement": { + "label": "Accessibility Statement", + "description": "URL or filename to accessibility statement" + }, + "cookiePolicy": { + "label": "Cookie Policy", + "description": "URL or filename to cookie policy" + }, + "impressum": { + "label": "Impressum", + "description": "URL or filename to impressum (required in some jurisdictions)" + } + }, + "premium": { + "title": "Premium & Enterprise", + "description": "Configure your premium or enterprise license key.", + "license": "License Configuration", + "key": { + "label": "License Key", + "description": "Enter your premium or enterprise license key" + }, + "enabled": { + "label": "Enable Premium Features", + "description": "Enable license key checks for pro/enterprise features" + }, + "movedFeatures": { + "title": "Premium Features Distributed", + "message": "Premium and Enterprise features are now organized in their respective sections:" + } + }, + "features": { + "title": "Features", + "description": "Configure optional features and functionality.", + "serverCertificate": { + "label": "Server Certificate", + "description": "Configure server-side certificate generation for \"Sign with Stirling-PDF\" functionality", + "enabled": { + "label": "Enable Server Certificate", + "description": "Enable server-side certificate for \"Sign with Stirling-PDF\" option" + }, + "organizationName": { + "label": "Organization Name", + "description": "Organization name for generated certificates" + }, + "validity": { + "label": "Certificate Validity (days)", + "description": "Number of days the certificate will be valid" + }, + "regenerateOnStartup": { + "label": "Regenerate on Startup", + "description": "Generate new certificate on each application startup" + } + } + }, + "endpoints": { + "title": "API Endpoints", + "description": "Control which API endpoints and endpoint groups are available.", + "management": "Endpoint Management", + "toRemove": { + "label": "Disabled Endpoints", + "description": "Select individual endpoints to disable" + }, + "groupsToRemove": { + "label": "Disabled Endpoint Groups", + "description": "Select endpoint groups to disable" + }, + "note": "Note: Disabling endpoints restricts API access but does not remove UI components. Restart required for changes to take effect." + } + } }, "fileUpload": { + "selectFile": "Select a file", + "selectFiles": "Select files", + "selectPdfToView": "Select a PDF to view", + "selectPdfToEdit": "Select a PDF to edit", + "chooseFromStorage": "Choose a file from storage or upload a new PDF", + "chooseFromStorageMultiple": "Choose files from storage or upload new PDFs", + "loadFromStorage": "Load from Storage", + "filesAvailable": "files available", "loading": "ÎĻĪŒĪĪ„Ī‰ĪƒÎˇ...", - "or": "ÎŽ" + "or": "ÎŽ", + "dropFileHere": "Drop file here or click to upload", + "dropFilesHere": "Drop files here or click the upload button", + "pdfFilesOnly": "PDF files only", + "supportedFileTypes": "Supported file types", + "upload": "Upload", + "uploadFile": "Upload File", + "uploadFiles": "Upload Files", + "noFilesInStorage": "No files available in storage. Upload some files first.", + "selectFromStorage": "Select from Storage", + "backToTools": "Back to Tools", + "addFiles": "Add Files", + "dragFilesInOrClick": "Drag files in or click \"Add Files\" to browse" + }, + "fileEditor": { + "addFiles": "Add Files" }, "fileManager": { + "title": "Upload PDF Files", + "subtitle": "Add files to your storage for easy access across tools", + "filesSelected": "files selected", + "clearSelection": "Clear Selection", + "openInFileEditor": "Open in File Editor", + "uploadError": "Failed to upload some files.", + "failedToOpen": "Failed to open file. It may have been removed from storage.", + "failedToLoad": "Failed to load file to active set.", + "storageCleared": "Browser cleared storage. Files have been removed. Please re-upload.", + "clearAll": "Clear All", + "reloadFiles": "Reload Files", + "dragDrop": "Drag & Drop files here", + "clickToUpload": "Click to upload files", + "selectedFiles": "Selected Files", + "storage": "Storage", + "filesStored": "files stored", + "storageError": "Storage error occurred", + "storageLow": "Storage is running low. Consider removing old files.", + "supportMessage": "Powered by browser database storage for unlimited capacity", + "noFileSelected": "No files selected", + "showHistory": "Show History", + "hideHistory": "Hide History", + "fileHistory": "File History", + "loadingHistory": "Loading History...", + "lastModified": "Last Modified", + "toolChain": "Tools Applied", + "restore": "Restore", + "unzip": "Unzip", + "searchFiles": "Search files...", + "recent": "Recent", + "localFiles": "Local Files", + "googleDrive": "Google Drive", + "googleDriveShort": "Drive", + "myFiles": "My Files", + "noRecentFiles": "No recent files found", + "googleDriveNotAvailable": "Google Drive integration not available", + "openFiles": "Open Files", + "openFile": "Open File", + "details": "File Details", "fileName": "ΌÎŊÎŋÎŧÎą", + "fileFormat": "Format", + "fileSize": "Size", "fileVersion": "ΈÎēδÎŋĪƒÎˇ", + "totalSelected": "Total Selected", + "dropFilesHere": "Drop files here", "selectAll": "Î•Ī€ÎšÎģÎŋÎŗÎŽ ΌÎģΉÎŊ", "deselectAll": "Î‘Ī€ÎŋÎĩĪ€ÎšÎģÎŋÎŗÎŽ ΌÎģΉÎŊ", "deleteSelected": "Î”ÎšÎąÎŗĪÎąĪ†ÎŽ ÎĩĪ€ÎšÎģÎĩÎŗÎŧέÎŊΉÎŊ", + "downloadSelected": "Download Selected", + "selectedCount": "{{count}} selected", "download": "Î›ÎŽĪˆÎˇ", - "delete": "Î”ÎšÎąÎŗĪÎąĪ†ÎŽ" + "delete": "Î”ÎšÎąÎŗĪÎąĪ†ÎŽ", + "unsupported": "Unsupported", + "addToUpload": "Add to Upload", + "deleteAll": "Delete All", + "loadingFiles": "Loading files...", + "noFiles": "No files available", + "noFilesFound": "No files found matching your search", + "openInPageEditor": "Open in Page Editor", + "showAll": "Show All", + "sortByDate": "Sort by Date", + "sortByName": "Sort by Name", + "sortBySize": "Sort by Size" + }, + "storage": { + "temporaryNotice": "Files are stored temporarily in your browser and may be cleared automatically", + "storageLimit": "Storage limit", + "storageUsed": "Temporary Storage used", + "storageFull": "Storage is nearly full. Consider removing some files.", + "fileTooLarge": "File too large. Maximum size per file is", + "storageQuotaExceeded": "Storage quota exceeded. Please remove some files before uploading more.", + "approximateSize": "Approximate size" }, "sanitize": { + "title": "Sanitise", + "desc": "Remove potentially harmful elements from PDF files.", "submit": "Î•ÎžĪ…ÎŗÎ¯ÎąÎŊĪƒÎˇ PDF", + "completed": "Sanitisation completed successfully", + "error": { + "generic": "Sanitisation failed", + "failed": "An error occurred while sanitising the PDF." + }, + "filenamePrefix": "sanitised", + "sanitizationResults": "Sanitisation Results", "steps": { - "settings": "ÎĄĪ…Î¸ÎŧÎ¯ĪƒÎĩÎšĪ‚" + "files": "Files", + "settings": "ÎĄĪ…Î¸ÎŧÎ¯ĪƒÎĩÎšĪ‚", + "results": "Results" + }, + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "options": { + "title": "Sanitisation Options", + "note": "Select the elements you want to remove from the PDF. At least one option must be selected.", + "removeJavaScript": { + "label": "Remove JavaScript", + "desc": "Remove JavaScript actions and scripts from the PDF" + }, + "removeEmbeddedFiles": { + "label": "Remove Embedded Files", + "desc": "Remove any files embedded within the PDF" + }, + "removeXMPMetadata": { + "label": "Remove XMP Metadata", + "desc": "Remove XMP metadata from the PDF" + }, + "removeMetadata": { + "label": "Remove Document Metadata", + "desc": "Remove document information metadata (title, author, etc.)" + }, + "removeLinks": { + "label": "Remove Links", + "desc": "Remove external links and launch actions from the PDF" + }, + "removeFonts": { + "label": "Remove Fonts", + "desc": "Remove embedded fonts from the PDF" + } + } + }, + "addPassword": { + "title": "Î ĪÎŋĪƒÎ¸ÎŽÎēΡ ÎēĪ‰Î´ÎšÎēÎŋĪ", + "desc": "Encrypt your PDF document with a password.", + "completed": "Password protection applied", + "submit": "ÎšĪĪ…Ī€Ī„ÎŋÎŗĪÎŦĪ†ÎˇĪƒÎˇ", + "filenamePrefix": "encrypted", + "error": { + "failed": "An error occurred while encrypting the PDF." + }, + "passwords": { + "stepTitle": "Passwords & Encryption", + "completed": "Passwords configured", + "user": { + "label": "User Password", + "placeholder": "Enter user password" + }, + "owner": { + "label": "Owner Password", + "placeholder": "Enter owner password" + } + }, + "encryption": { + "keyLength": { + "label": "Encryption Key Length", + "40bit": "40-bit (Low)", + "128bit": "128-bit (Standard)", + "256bit": "256-bit (High)" + } + }, + "results": { + "title": "Encrypted PDFs" + }, + "tooltip": { + "header": { + "title": "Password Protection Overview" + }, + "passwords": { + "title": "Password Types", + "text": "User passwords restrict opening the document, while owner passwords control what can be done with the document once opened. You can set both or just one.", + "bullet1": "User Password: Required to open the PDF", + "bullet2": "Owner Password: Controls document permissions (not supported by all PDF viewers)" + }, + "encryption": { + "title": "Encryption Levels", + "text": "Higher encryption levels provide better security but may not be supported by older PDF viewers.", + "bullet1": "40-bit: Basic security, compatible with older viewers", + "bullet2": "128-bit: Standard security, widely supported", + "bullet3": "256-bit: Maximum security, requires modern viewers" + }, + "permissions": { + "title": "ΑÎģÎģÎąÎŗÎŽ δΚÎēÎąÎšĪ‰ÎŧÎŦ΄ΉÎŊ", + "text": "These permissions control what users can do with the PDF. Most effective when combined with an owner password." + } + }, + "tags": "ÎąĪƒĪ†ÎŦÎģÎĩΚι,ÎąĪƒĪ†ÎŦÎģÎĩΚι", + "header": "Î ĪÎŋĪƒÎ¸ÎŽÎēΡ ÎēĪ‰Î´ÎšÎēÎŋĪ (ÎšĪĪ…Ī€Ī„ÎŋÎŗĪÎŦĪ†ÎˇĪƒÎˇ)", + "selectText": { + "1": "Î•Ī€ÎšÎģÎ­ÎžĪ„Îĩ PDF ÎŗÎšÎą Îē΁΅΀΄ÎŋÎŗĪÎŦĪ†ÎˇĪƒÎˇ", + "2": "ÎšĪ‰Î´ÎšÎēĪŒĪ‚ Ī‡ĪÎŽĪƒĪ„Îˇ", + "3": "ΜήÎēÎŋĪ‚ ÎēÎģÎĩΚδΚÎŋĪ Îē΁΅΀΄ÎŋÎŗĪÎŦĪ†ÎˇĪƒÎˇĪ‚", + "4": "Οι Ī…ĪˆÎˇÎģĪŒĪ„Îĩ΁ÎĩĪ‚ Ī„ÎšÎŧÎ­Ī‚ ÎĩίÎŊιΚ ÎšĪƒĪ‡Ī…ĪĪŒĪ„Îĩ΁ÎĩĪ‚, ÎąÎģÎģÎŦ ÎŋΚ Ī‡ÎąÎŧΡÎģĪŒĪ„Îĩ΁ÎĩĪ‚ Ī„ÎšÎŧÎ­Ī‚ Î­Ī‡ÎŋĪ…ÎŊ ÎēÎąÎģĪĪ„ÎĩĪÎˇ ĪƒĪ…ÎŧÎ˛ÎąĪ„ĪŒĪ„ÎˇĪ„Îą.", + "5": "ΔιÎēÎąÎšĪŽÎŧÎąĪ„Îą ΀΁ÎŋĪ‚ ÎŋĪÎšĪƒÎŧΌ (ÎŖĪ…ÎŊÎšĪƒĪ„ÎŦĪ„ÎąÎš ÎŊÎą Ī‡ĪÎˇĪƒÎšÎŧÎŋĪ€ÎŋΚÎĩÎ¯Ī„ÎąÎš ÎŧÎąÎļί ÎŧÎĩ ÎēĪ‰Î´ÎšÎēΌ ΚδΚÎŋÎēĪ„ÎŽĪ„Îˇ)", + "6": "Î‘Ī€Îŋ΄΁ÎŋĪ€ÎŽ ĪƒĪ…ÎŊÎąĪÎŧÎŋÎģĪŒÎŗÎˇĪƒÎˇĪ‚ ÎĩÎŗÎŗĪÎŦΆÎŋĪ…", + "7": "Î‘Ī€Îŋ΄΁ÎŋĪ€ÎŽ ÎĩÎžÎąÎŗĪ‰ÎŗÎŽĪ‚ Ī€ÎĩĪÎšÎĩ·ÎŋÎŧέÎŊÎŋĪ…", + "8": "Î‘Ī€Îŋ΄΁ÎŋĪ€ÎŽ ÎĩÎžÎąÎŗĪ‰ÎŗÎŽĪ‚ ÎŗÎšÎą ΀΁ÎŋĪƒÎ˛ÎąĪƒÎšÎŧĪŒĪ„ÎˇĪ„Îą", + "9": "Î‘Ī€Îŋ΄΁ÎŋĪ€ÎŽ ĪƒĪ…ÎŧĪ€ÎģÎŽĪĪ‰ĪƒÎˇĪ‚ Ī†ĪŒĪÎŧÎąĪ‚", + "10": "Î‘Ī€Îŋ΄΁ÎŋĪ€ÎŽ ΄΁ÎŋĪ€ÎŋĪ€ÎŋÎ¯ÎˇĪƒÎˇĪ‚", + "11": "Î‘Ī€Îŋ΄΁ÎŋĪ€ÎŽ ΄΁ÎŋĪ€ÎŋĪ€ÎŋÎ¯ÎˇĪƒÎˇĪ‚ ĪƒĪ‡ÎŋÎģÎšÎąĪƒÎŧĪŽÎŊ", + "12": "Î‘Ī€Îŋ΄΁ÎŋĪ€ÎŽ ÎĩÎēĪ„ĪĪ€Ī‰ĪƒÎˇĪ‚", + "13": "Î‘Ī€Îŋ΄΁ÎŋĪ€ÎŽ ÎĩÎēĪ„ĪĪ€Ī‰ĪƒÎˇĪ‚ ΃Îĩ Î´ÎšÎąĪ†Îŋ΁ÎĩĪ„ÎšÎēÎ­Ī‚ ÎŧÎŋĪĪ†Î­Ī‚", + "14": "ÎšĪ‰Î´ÎšÎēĪŒĪ‚ ΚδΚÎŋÎēĪ„ÎŽĪ„Îˇ", + "15": "ΠÎĩĪÎšÎŋĪÎ¯ÎļÎĩΚ Ī„Îš ÎŧĪ€Îŋ΁Îĩί ÎŊÎą ÎŗÎ¯ÎŊÎĩΚ ÎŧÎĩ Ī„Îŋ Î­ÎŗÎŗĪÎąĪ†Îŋ ÎŧÎĩĪ„ÎŦ Ī„Îŋ ÎŦÎŊÎŋÎšÎŗÎŧÎŦ Ī„ÎŋĪ… (ΔÎĩÎŊ Ī…Ī€ÎŋĪƒĪ„ÎˇĪÎ¯ÎļÎĩĪ„ÎąÎš ÎąĪ€ĪŒ ΌÎģÎą Ī„Îą ΀΁ÎŋÎŗĪÎŦÎŧÎŧÎąĪ„Îą ÎąÎŊÎŦÎŗÎŊĪ‰ĪƒÎˇĪ‚)", + "16": "ΠÎĩĪÎšÎŋĪÎ¯ÎļÎĩΚ Ī„Îŋ ÎŦÎŊÎŋÎšÎŗÎŧÎą Ī„ÎŋĪ… ίδΚÎŋĪ… Ī„ÎŋĪ… ÎĩÎŗÎŗĪÎŦΆÎŋĪ…" } }, "changePermissions": { "title": "ΑÎģÎģÎąÎŗÎŽ δΚÎēÎąÎšĪ‰ÎŧÎŦ΄ΉÎŊ", + "desc": "Change document restrictions and permissions.", + "completed": "Permissions changed", "submit": "ΑÎģÎģÎąÎŗÎŽ δΚÎēÎąÎšĪ‰ÎŧÎŦ΄ΉÎŊ", + "error": { + "failed": "An error occurred while changing PDF permissions." + }, "permissions": { "preventAssembly": { "label": "Î‘Ī€Îŋ΄΁ÎŋĪ€ÎŽ ĪƒĪ…ÎŊÎąĪÎŧÎŋÎģĪŒÎŗÎˇĪƒÎˇĪ‚ ÎĩÎŗÎŗĪÎŦΆÎŋĪ…" @@ -1737,10 +4580,784 @@ "label": "Î‘Ī€Îŋ΄΁ÎŋĪ€ÎŽ ÎĩÎēĪ„ĪĪ€Ī‰ĪƒÎˇĪ‚ ΃Îĩ Î´ÎšÎąĪ†Îŋ΁ÎĩĪ„ÎšÎēÎ­Ī‚ ÎŧÎŋĪĪ†Î­Ī‚" } }, + "results": { + "title": "Modified PDFs" + }, "tooltip": { "header": { "title": "ΑÎģÎģÎąÎŗÎŽ δΚÎēÎąÎšĪ‰ÎŧÎŦ΄ΉÎŊ" + }, + "description": { + "text": "Changes document permissions, allowing/disallowing access to different features in PDF readers." + }, + "warning": { + "text": "To make these permissions unchangeable, use the Add Password tool to set an owner password." } } + }, + "removePassword": { + "title": "Î‘Ī†ÎąÎ¯ĪÎĩĪƒÎˇ ÎēĪ‰Î´ÎšÎēÎŋĪ", + "desc": "Î‘Ī†ÎąÎ¯ĪÎĩĪƒÎˇ ΀΁ÎŋĪƒĪ„ÎąĪƒÎ¯ÎąĪ‚ ÎēĪ‰Î´ÎšÎēÎŋĪ ÎąĪ€ĪŒ Ī„Îŋ Î­ÎŗÎŗĪÎąĪ†Îŋ PDF.", + "tags": "ÎąĪƒĪ†ÎŦÎģÎĩΚι,ÎąĪ€ÎŋÎē΁΅΀΄ÎŋÎŗĪÎŦĪ†ÎˇĪƒÎˇ,ÎąĪƒĪ†ÎŦÎģÎĩΚι,ÎąĪ†ÎąÎ¯ĪÎĩĪƒÎˇ ÎēĪ‰Î´ÎšÎēÎŋĪ,Î´ÎšÎąÎŗĪÎąĪ†ÎŽ ÎēĪ‰Î´ÎšÎēÎŋĪ", + "password": { + "stepTitle": "Î‘Ī†ÎąÎ¯ĪÎĩĪƒÎˇ ÎēĪ‰Î´ÎšÎēÎŋĪ", + "label": "Î¤ĪÎ­Ī‡Ī‰ÎŊ ÎēĪ‰Î´ÎšÎēĪŒĪ‚", + "placeholder": "Enter current password", + "completed": "Password configured" + }, + "filenamePrefix": "decrypted", + "error": { + "failed": "An error occurred while removing the password from the PDF." + }, + "tooltip": { + "description": "Removing password protection requires the password that was used to encrypt the PDF. This will decrypt the document, making it accessible without a password." + }, + "submit": "Î‘Ī†ÎąÎ¯ĪÎĩĪƒÎˇ", + "results": { + "title": "Decrypted PDFs" + }, + "header": "Î‘Ī†ÎąÎ¯ĪÎĩĪƒÎˇ ÎēĪ‰Î´ÎšÎēÎŋĪ (Î‘Ī€ÎŋÎē΁΅΀΄ÎŋÎŗĪÎŦĪ†ÎˇĪƒÎˇ)", + "selectText": { + "1": "Î•Ī€ÎšÎģÎ­ÎžĪ„Îĩ PDF ÎŗÎšÎą ÎąĪ€ÎŋÎē΁΅΀΄ÎŋÎŗĪÎŦĪ†ÎˇĪƒÎˇ", + "2": "ÎšĪ‰Î´ÎšÎēĪŒĪ‚" + } + }, + "automate": { + "title": "Automate", + "desc": "Build multi-step workflows by chaining together PDF actions. Ideal for recurring tasks.", + "invalidStep": "Invalid step", + "files": { + "placeholder": "Select files to process with this automation" + }, + "selection": { + "title": "Automation Selection", + "saved": { + "title": "Saved" + }, + "createNew": { + "title": "Create New Automation" + }, + "suggested": { + "title": "Suggested" + } + }, + "creation": { + "createTitle": "Create Automation", + "editTitle": "Edit Automation", + "intro": "Automations run tools sequentially. To get started, add tools in the order you want them to run.", + "name": { + "label": "Automation Name", + "placeholder": "My Automation" + }, + "description": { + "label": "Description (optional)", + "placeholder": "Describe what this automation does..." + }, + "tools": { + "selectTool": "Select a tool...", + "selected": "Selected Tools", + "remove": "Remove tool", + "configure": "Configure tool", + "notConfigured": "! Not Configured", + "addTool": "Add Tool", + "add": "Add a tool..." + }, + "save": "Save Automation", + "unsavedChanges": { + "title": "Unsaved Changes", + "message": "You have unsaved changes. Are you sure you want to go back? All changes will be lost.", + "cancel": "Cancel", + "confirm": "Go Back" + }, + "icon": { + "label": "Icon" + } + }, + "run": { + "title": "Run Automation" + }, + "sequence": { + "unnamed": "Unnamed Automation", + "steps": "{{count}} steps", + "running": "Running Automation...", + "run": "Run Automation", + "finish": "Finish" + }, + "reviewTitle": "Automation Results", + "config": { + "loading": "Loading tool configuration...", + "noSettings": "This tool does not have configurable settings.", + "title": "Configure {{toolName}}", + "description": "Configure the settings for this tool. These settings will be applied when the automation runs.", + "cancel": "Cancel", + "save": "Save Configuration" + }, + "copyToSaved": "Copy to Saved" + }, + "automation": { + "suggested": { + "securePdfIngestion": "Secure PDF Ingestion", + "securePdfIngestionDesc": "Comprehensive PDF processing workflow that sanitises documents, applies OCR with cleanup, converts to PDF/A format for long-term archival, and optimises file size.", + "emailPreparation": "Email Preparation", + "emailPreparationDesc": "Optimises PDFs for email distribution by compressing files, splitting large documents into 20MB chunks for email compatibility, and removing metadata for privacy.", + "secureWorkflow": "Security Workflow", + "secureWorkflowDesc": "Secures PDF documents by removing potentially malicious content like JavaScript and embedded files, then adds password protection to prevent unauthorised access. Password is set to 'password' by default.", + "processImages": "Process Images", + "processImagesDesc": "Converts multiple image files into a single PDF document, then applies OCR technology to extract searchable text from the images." + } + }, + "common": { + "copy": "Copy", + "copied": "Copied!", + "refresh": "Refresh", + "retry": "Retry", + "remaining": "remaining", + "used": "used", + "available": "available", + "cancel": "Cancel", + "preview": "Preview" + }, + "config": { + "overview": { + "title": "Application Configuration", + "description": "Current application settings and configuration details." + }, + "account": { + "overview": { + "title": "Account Settings", + "manageAccountPreferences": "Manage your account preferences", + "guestDescription": "You are signed in as a guest. Consider upgrading your account above." + }, + "upgrade": { + "title": "Upgrade Guest Account", + "description": "Link your account to preserve your history and access more features!", + "socialLogin": "Upgrade with Social Account", + "linkWith": "Link with", + "emailPassword": "or enter your email & password", + "email": "Email", + "emailPlaceholder": "Enter your email", + "password": "Password (optional)", + "passwordPlaceholder": "Set a password", + "passwordNote": "Leave empty to use email verification only", + "upgradeButton": "Upgrade Account" + } + }, + "apiKeys": { + "description": "Your API key for accessing Stirling's suite of PDF tools. Copy it to your project or refresh to generate a new one.", + "publicKeyAriaLabel": "Public API key", + "copyKeyAriaLabel": "Copy API key", + "refreshAriaLabel": "Refresh API key", + "includedCredits": "Included credits", + "purchasedCredits": "Purchased credits", + "totalCredits": "Total Credits", + "chartAriaLabel": "Credits usage: included {{includedUsed}} of {{includedTotal}}, purchased {{purchasedUsed}} of {{purchasedTotal}}", + "nextReset": "Next Reset", + "lastApiUse": "Last API Use", + "overlayMessage": "Generate a key to see credits and available credits", + "label": "API Key", + "guestInfo": "Guest users do not receive API keys. Create an account to get an API key you can use in your applications.", + "goToAccount": "Go to Account", + "refreshModal": { + "title": "Refresh API Keys", + "warning": "âš ī¸ Warning: This action will generate new API keys and make your previous keys invalid.", + "impact": "Any applications or services currently using these keys will stop working until you update them with the new keys.", + "confirmPrompt": "Are you sure you want to continue?", + "confirmCta": "Refresh Keys" + }, + "generateError": "We couldn't generate your API key." + } + }, + "AddAttachmentsRequest": { + "attachments": "Select Attachments", + "info": "Select files to attach to your PDF. These files will be embedded and accessible through the PDF's attachment panel.", + "selectFiles": "Select Files to Attach", + "placeholder": "Choose files...", + "addMoreFiles": "Add more files...", + "selectedFiles": "Selected Files", + "submit": "Add Attachments", + "results": { + "title": "Attachment Results" + }, + "error": { + "failed": "Add attachments operation failed" + } + }, + "termsAndConditions": "Terms & Conditions", + "logOut": "Log out", + "addAttachments": { + "error": { + "failed": "An error occurred while adding attachments to the PDF." + } + }, + "autoRename": { + "description": "This tool will automatically rename PDF files based on their content. It analyzes the document to find the most suitable title from the text." + }, + "customPosition": "Custom Position", + "details": "Details", + "downloadUnavailable": "Download unavailable for this item", + "invalidUndoData": "Cannot undo: invalid operation data", + "margin": { + "large": "Large", + "medium": "Medium", + "small": "Small", + "xLarge": "Extra Large" + }, + "noFilesToUndo": "Cannot undo: no files were processed in the last operation", + "noOperationToUndo": "No operation to undo", + "noValidFiles": "No valid files to process", + "operationCancelled": "Operation cancelled", + "pageEdit": { + "deselectAll": "Select None", + "selectAll": "Select All" + }, + "quickPosition": "Quick Position", + "reorganizePages": { + "error": { + "failed": "Failed to reorganize pages" + }, + "results": { + "title": "Pages Reorganized" + }, + "settings": { + "title": "Settings" + }, + "submit": "Reorganize Pages" + }, + "replace-color": { + "options": { + "fill": "Fill colour", + "gradient": "Gradient" + }, + "previewOverlayOpacity": "Preview overlay opacity", + "previewOverlayTransparency": "Preview overlay transparency", + "previewOverlayVisibility": "Show preview overlay", + "selectText": { + "1": "Î•Ī€ÎšÎģÎŋÎŗÎ­Ī‚ ÎąÎŊĪ„ÎšÎēÎąĪ„ÎŦĪƒĪ„ÎąĪƒÎˇĪ‚ ÎŽ ÎąÎŊÎąĪƒĪ„ĪÎŋĪ†ÎŽĪ‚ Ī‡ĪĪŽÎŧÎąĪ„ÎŋĪ‚", + "2": "Î ĪÎŋÎĩĪ€ÎšÎģÎŋÎŗÎŽ (Î ĪÎŋÎĩĪ€ÎšÎģÎĩÎŗÎŧέÎŊÎą Ī‡ĪĪŽÎŧÎąĪ„Îą Ī…ĪˆÎˇÎģÎŽĪ‚ ÎąÎŊĪ„Î¯Î¸ÎĩĪƒÎˇĪ‚)", + "3": "Î ĪÎŋĪƒÎąĪÎŧÎŋÎŗÎŽ (Î ĪÎŋĪƒÎąĪÎŧÎŋ΃ÎŧέÎŊÎą Ī‡ĪĪŽÎŧÎąĪ„Îą)", + "4": "ΠÎģÎŽĪÎˇĪ‚ ÎąÎŊÎąĪƒĪ„ĪÎŋĪ†ÎŽ (ΑÎŊÎąĪƒĪ„ĪÎŋĪ†ÎŽ ΌÎģΉÎŊ ΄ΉÎŊ ·΁ΉÎŧÎŦ΄ΉÎŊ)", + "5": "Î•Ī€ÎšÎģÎŋÎŗÎ­Ī‚ ·΁ΉÎŧÎŦ΄ΉÎŊ Ī…ĪˆÎˇÎģÎŽĪ‚ ÎąÎŊĪ„Î¯Î¸ÎĩĪƒÎˇĪ‚", + "6": "ΛÎĩĪ…ÎēΌ ÎēÎĩίÎŧÎĩÎŊÎŋ ΃Îĩ ÎŧÎąĪĪÎŋ Ī†ĪŒÎŊĪ„Îŋ", + "7": "ÎœÎąĪĪÎŋ ÎēÎĩίÎŧÎĩÎŊÎŋ ΃Îĩ ÎģÎĩĪ…ÎēΌ Ī†ĪŒÎŊĪ„Îŋ", + "8": "ÎšÎ¯Ī„ĪÎšÎŊÎŋ ÎēÎĩίÎŧÎĩÎŊÎŋ ΃Îĩ ÎŧÎąĪĪÎŋ Ī†ĪŒÎŊĪ„Îŋ", + "9": "Î ĪÎŦĪƒÎšÎŊÎŋ ÎēÎĩίÎŧÎĩÎŊÎŋ ΃Îĩ ÎŧÎąĪĪÎŋ Ī†ĪŒÎŊĪ„Îŋ", + "10": "Î•Ī€ÎšÎģÎŋÎŗÎŽ Ī‡ĪĪŽÎŧÎąĪ„ÎŋĪ‚ ÎēÎĩΚÎŧέÎŊÎŋĪ…", + "11": "Î•Ī€ÎšÎģÎŋÎŗÎŽ Ī‡ĪĪŽÎŧÎąĪ„ÎŋĪ‚ Ī†ĪŒÎŊĪ„ÎŋĪ…", + "12": "Choose start colour", + "13": "Choose end colour" + }, + "submit": "ΑÎŊĪ„ÎšÎēÎąĪ„ÎŦĪƒĪ„ÎąĪƒÎˇ", + "title": "ΑÎŊĪ„ÎšÎēÎąĪ„ÎŦĪƒĪ„ÎąĪƒÎˇ-ΑÎŊÎąĪƒĪ„ĪÎŋĪ†ÎŽ Ī‡ĪĪŽÎŧÎąĪ„ÎŋĪ‚", + "header": "ΑÎŊĪ„ÎšÎēÎąĪ„ÎŦĪƒĪ„ÎąĪƒÎˇ-ΑÎŊÎąĪƒĪ„ĪÎŋĪ†ÎŽ Ī‡ĪĪŽÎŧÎąĪ„ÎŋĪ‚ PDF" + }, + "size": "Size", + "submit": "Submit", + "success": "Success", + "tools": { + "noSearchResults": "No tools found", + "noTools": "No tools available" + }, + "undoDataMismatch": "Cannot undo: operation data is corrupted", + "undoFailed": "Failed to undo operation", + "undoQuotaError": "Cannot undo: insufficient storage space", + "undoStorageError": "Undo completed but some files could not be saved to storage", + "undoSuccess": "Operation undone successfully", + "unsupported": "Unsupported", + "onboarding": { + "welcomeModal": { + "title": "Welcome to Stirling PDF!", + "description": "Would you like to take a quick 1-minute tour to learn the key features and how to get started?", + "helpHint": "You can always access this tour later from the Help button in the bottom left.", + "startTour": "Start Tour", + "maybeLater": "Maybe Later", + "dontShowAgain": "Don't Show Again" + }, + "allTools": "This is the All Tools panel, where you can browse and select from all available PDF tools.", + "selectCropTool": "Let's select the Crop tool to demonstrate how to use one of the tools.", + "toolInterface": "This is the Crop tool interface. As you can see, there's not much there because we haven't added any PDF files to work with yet.", + "filesButton": "The Files button on the Quick Access bar allows you to upload PDFs to use the tools on.", + "fileSources": "You can upload new files or access recent files from here. For the tour, we'll just use a sample file.", + "workbench": "This is the Workbench - the main area where you view and edit your PDFs.", + "viewSwitcher": "Use these controls to select how you want to view your PDFs.", + "viewer": "The Viewer lets you read and annotate your PDFs.", + "pageEditor": "The Page Editor allows you to do various operations on the pages within your PDFs, such as reordering, rotating and deleting.", + "activeFiles": "The Active Files view shows all of the PDFs you have loaded into the tool, and allows you to select which ones to process.", + "fileCheckbox": "Clicking one of the files selects it for processing. You can select multiple files for batch operations.", + "selectControls": "The Right Rail contains buttons to quickly select/deselect all of your active PDFs, along with buttons to change the app's theme or language.", + "cropSettings": "Now that we've selected the file we want crop, we can configure the Crop tool to choose the area that we want to crop the PDF to.", + "runButton": "Once the tool has been configured, this button allows you to run the tool on all the selected PDFs.", + "results": "After the tool has finished running, the Review step will show a preview of the results in this panel, and allow you to undo the operation or download the file. ", + "fileReplacement": "The modified file will replace the original file in the Workbench automatically, allowing you to easily run it through more tools.", + "pinButton": "You can use the Pin button if you'd rather your files stay active after running tools on them.", + "wrapUp": "You're all set! You've learnt about the main areas of the app and how to use them. Click the Help button whenever you like to see this tour again.", + "previous": "Previous", + "next": "Next", + "finish": "Finish", + "startTour": "Start Tour", + "startTourDescription": "Take a guided tour of Stirling PDF's key features" + }, + "workspace": { + "title": "Workspace", + "people": { + "title": "People", + "description": "Manage workspace members and their permissions", + "loading": "Loading people...", + "searchMembers": "Search members...", + "addMembers": "Add Members", + "inviteMembers": { + "label": "Invite Members", + "subtitle": "Type or paste in emails below, separated by commas. Your workspace will be billed by members." + }, + "user": "User", + "role": "Role", + "team": "Team", + "status": "Status", + "actions": "Actions", + "noMembersFound": "No members found", + "active": "Active", + "disabled": "Disabled", + "activeSession": "Active session", + "member": "Member", + "admin": "Admin", + "roleDescriptions": { + "admin": "Can manage settings and invite members, with full administrative access.", + "member": "Can view and edit shared files, but cannot manage workspace settings or members." + }, + "editRole": "Edit Role", + "enable": "Enable", + "disable": "Disable", + "deleteUser": "Delete User", + "deleteUserSuccess": "User deleted successfully", + "deleteUserError": "Failed to delete user", + "confirmDelete": "Are you sure you want to delete this user? This action cannot be undone.", + "addMember": { + "title": "Add Member", + "username": "Username (Email)", + "usernamePlaceholder": "user@example.com", + "password": "Password", + "passwordPlaceholder": "Enter password", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "forcePasswordChange": "Force password change on first login", + "cancel": "Cancel", + "submit": "Add Member", + "usernameRequired": "Username and password are required", + "passwordTooShort": "Password must be at least 6 characters", + "success": "User created successfully", + "error": "Failed to create user" + }, + "editMember": { + "title": "Edit Member", + "editing": "Editing:", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "cancel": "Cancel", + "submit": "Update Member", + "success": "User updated successfully", + "error": "Failed to update user" + }, + "toggleEnabled": { + "success": "User status updated successfully", + "error": "Failed to update user status" + }, + "delete": { + "success": "User deleted successfully", + "error": "Failed to delete user" + }, + "emailInvite": { + "tab": "Email Invite", + "description": "Type or paste in emails below, separated by commas. Users will receive login credentials via email.", + "emails": "Email Addresses", + "emailsPlaceholder": "user1@example.com, user2@example.com", + "emailsRequired": "At least one email address is required", + "submit": "Send Invites", + "success": "user(s) invited successfully", + "partialSuccess": "Some invites failed", + "allFailed": "Failed to invite users", + "error": "Failed to send invites" + }, + "directInvite": { + "tab": "Direct Create" + }, + "inviteLinkTab": { + "tab": "Invite Link" + }, + "inviteLink": { + "description": "Generate a secure link that allows the user to set their own password", + "email": "Email Address", + "emailPlaceholder": "user@example.com (optional)", + "emailDescription": "Optional - leave blank for a general invite link that can be used by anyone", + "emailRequired": "Email address is required", + "emailOptional": "Optional - leave blank for a general invite link", + "emailRequiredForSend": "Email address is required to send email notification", + "expiryHours": "Expiry Hours", + "expiryDescription": "How many hours until the link expires", + "sendEmail": "Send invite link via email", + "sendEmailDescription": "If enabled, the invite link will be sent to the specified email address", + "smtpRequired": "SMTP not configured", + "generate": "Generate Link", + "generated": "Invite Link Generated", + "copied": "Link copied to clipboard", + "success": "Invite link generated successfully", + "successWithEmail": "Invite link generated and sent via email", + "emailFailed": "Invite link generated, but email failed", + "emailFailedDetails": "Error: {0}. Please share the invite link manually.", + "error": "Failed to generate invite link", + "submit": "Generate Invite Link" + }, + "inviteMode": { + "username": "Username", + "email": "Email", + "link": "Link", + "emailDisabled": "Email invites require SMTP configuration and mail.enableInvites=true in settings" + }, + "license": { + "users": "users", + "availableSlots": "Available Slots", + "grandfathered": "Grandfathered", + "grandfatheredShort": "{{count}} grandfathered", + "fromLicense": "from license", + "slotsAvailable": "{{count}} user slot(s) available", + "noSlotsAvailable": "No slots available", + "currentUsage": "Currently using {{current}} of {{max}} user licences" + } + }, + "teams": { + "title": "Teams", + "description": "Manage teams and organize workspace members", + "loading": "Loading teams...", + "loadingDetails": "Loading team details...", + "createNewTeam": "Create New Team", + "teamName": "Team Name", + "totalMembers": "Total Members", + "actions": "Actions", + "noTeamsFound": "No teams found", + "noMembers": "No members in this team", + "system": "System", + "addMember": "Add Member", + "viewTeam": "View Team", + "removeMember": "Remove from team", + "cannotRemoveFromSystemTeam": "Cannot remove from system team", + "renameTeamLabel": "Rename Team", + "deleteTeamLabel": "Delete Team", + "cannotDeleteInternal": "Cannot delete the Internal team", + "confirmDelete": "Are you sure you want to delete this team? This team must be empty to delete.", + "confirmRemove": "Remove user from this team?", + "cannotRenameInternal": "Cannot rename the Internal team", + "cannotAddToInternal": "Cannot add members to the Internal team", + "teamNotFound": "Team not found", + "backToTeams": "Back to Teams", + "memberCount": "{{count}} members", + "removeMemberSuccess": "User removed from team", + "removeMemberError": "Failed to remove user from team", + "createTeam": { + "title": "Create New Team", + "teamName": "Team Name", + "teamNamePlaceholder": "Enter team name", + "cancel": "Cancel", + "submit": "Create Team", + "nameRequired": "Team name is required", + "success": "Team created successfully", + "error": "Failed to create team" + }, + "renameTeam": { + "title": "Rename Team", + "renaming": "Renaming:", + "newTeamName": "New Team Name", + "newTeamNamePlaceholder": "Enter new team name", + "cancel": "Cancel", + "submit": "Rename Team", + "nameRequired": "Team name is required", + "success": "Team renamed successfully", + "error": "Failed to rename team" + }, + "deleteTeam": { + "success": "Team deleted successfully", + "error": "Failed to delete team. Make sure the team is empty.", + "teamMustBeEmpty": "Team must be empty before deletion" + }, + "addMemberToTeam": { + "title": "Add Member to Team", + "addingTo": "Adding to", + "selectUser": "Select User", + "selectUserPlaceholder": "Choose a user", + "selectUserRequired": "Please select a user", + "currentlyIn": "currently in", + "willBeMoved": "Note: This user will be moved from their current team to this team.", + "cancel": "Cancel", + "submit": "Add Member", + "userRequired": "Please select a user", + "success": "Member added to team successfully", + "error": "Failed to add member to team" + }, + "changeTeam": { + "label": "Change Team", + "title": "Change Team", + "changing": "Moving", + "selectTeam": "Select Team", + "selectTeamPlaceholder": "Choose a team", + "selectTeamRequired": "Please select a team", + "success": "Team changed successfully", + "error": "Failed to change team", + "submit": "Change Team" + } + } + }, + "plan": { + "currency": "Currency", + "popular": "Popular", + "current": "Current Plan", + "upgrade": "Upgrade", + "contact": "Contact Us", + "customPricing": "Custom", + "showComparison": "Compare All Features", + "hideComparison": "Hide Feature Comparison", + "featureComparison": "Feature Comparison", + "activePlan": { + "title": "Active Plan", + "subtitle": "Your current subscription details" + }, + "availablePlans": { + "title": "Available Plans", + "subtitle": "Choose the plan that fits your needs" + }, + "static": { + "title": "Billing Information", + "message": "Online billing is not currently configured. To upgrade your plan or manage subscriptions, please contact us directly.", + "contactSales": "Contact Sales", + "contactToUpgrade": "Contact us to upgrade or customize your plan", + "maxUsers": "Max Users", + "upTo": "Up to" + }, + "period": { + "month": "month" + }, + "free": { + "name": "Free", + "highlight1": "Limited Tool Usage Per week", + "highlight2": "Access to all tools", + "highlight3": "Community support" + }, + "pro": { + "name": "Pro", + "highlight1": "Unlimited Tool Usage", + "highlight2": "Advanced PDF tools", + "highlight3": "No watermarks" + }, + "enterprise": { + "name": "Enterprise", + "highlight1": "Custom pricing", + "highlight2": "Dedicated support", + "highlight3": "Latest features" + }, + "feature": { + "title": "Feature", + "pdfTools": "Basic PDF Tools", + "fileSize": "File Size Limit", + "automation": "Automate tool workflows", + "api": "API Access", + "priority": "Priority Support", + "customPricing": "Custom Pricing" + } + }, + "subscription": { + "status": { + "active": "Active", + "pastDue": "Past Due", + "canceled": "Canceled", + "incomplete": "Incomplete", + "trialing": "Trial", + "none": "No Subscription" + }, + "renewsOn": "Renews on {{date}}", + "cancelsOn": "Cancels on {{date}}" + }, + "billing": { + "manageBilling": "Manage Billing", + "portal": { + "error": "Failed to open billing portal" + } + }, + "payment": { + "preparing": "Preparing your checkout...", + "upgradeTitle": "Upgrade to {{planName}}", + "success": "Payment Successful!", + "successMessage": "Your subscription has been activated successfully. You will receive a confirmation email shortly.", + "autoClose": "This window will close automatically...", + "error": "Payment Error" + }, + "firstLogin": { + "title": "First Time Login", + "welcomeTitle": "Welcome!", + "welcomeMessage": "For security reasons, you must change your password on your first login.", + "loggedInAs": "Logged in as", + "error": "Error", + "currentPassword": "Current Password", + "enterCurrentPassword": "Enter your current password", + "newPassword": "New Password", + "enterNewPassword": "Enter new password (min 8 characters)", + "confirmPassword": "Confirm New Password", + "reEnterNewPassword": "Re-enter new password", + "changePassword": "Change Password", + "allFieldsRequired": "All fields are required", + "passwordsDoNotMatch": "New passwords do not match", + "passwordTooShort": "Password must be at least 8 characters", + "passwordMustBeDifferent": "New password must be different from current password", + "passwordChangedSuccess": "Password changed successfully! Please log in again.", + "passwordChangeFailed": "Failed to change password. Please check your current password." + }, + "invite": { + "welcome": "Welcome to Stirling PDF", + "invalidToken": "Invalid invitation link", + "validationError": "Failed to validate invitation link", + "passwordRequired": "Password is required", + "passwordTooShort": "Password must be at least 6 characters", + "passwordMismatch": "Passwords do not match", + "acceptError": "Failed to create account", + "validating": "Validating invitation...", + "invalidInvitation": "Invalid Invitation", + "goToLogin": "Go to Login", + "welcomeTitle": "You've been invited!", + "welcomeSubtitle": "Complete your account setup to get started", + "accountFor": "Creating account for", + "linkExpires": "Link expires", + "email": "Email address", + "emailPlaceholder": "Enter your email address", + "emailRequired": "Email address is required", + "invalidEmail": "Invalid email address", + "choosePassword": "Choose a password", + "passwordPlaceholder": "Enter your password", + "confirmPassword": "Confirm password", + "confirmPasswordPlaceholder": "Re-enter your password", + "createAccount": "Create Account", + "creating": "Creating Account...", + "alreadyHaveAccount": "Already have an account?", + "signIn": "Sign in" + }, + "audit": { + "error": { + "title": "Error loading audit system" + }, + "notAvailable": "Audit system not available", + "notAvailableMessage": "The audit system is not configured or not available.", + "disabled": "Audit logging is disabled", + "disabledMessage": "Enable audit logging in your application configuration to track system events.", + "systemStatus": { + "title": "System Status", + "status": "Audit Logging", + "enabled": "Enabled", + "disabled": "Disabled", + "level": "Audit Level", + "retention": "Retention Period", + "days": "days", + "totalEvents": "Total Events" + }, + "tabs": { + "dashboard": "Dashboard", + "events": "Audit Events", + "export": "Export" + }, + "charts": { + "title": "Audit Dashboard", + "error": "Error loading charts", + "day": "Day", + "week": "Week", + "month": "Month", + "byType": "Events by Type", + "byUser": "Events by User", + "overTime": "Events Over Time" + }, + "events": { + "title": "Audit Events", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "error": "Error loading events", + "noEvents": "No events found", + "timestamp": "Timestamp", + "type": "Type", + "user": "User", + "ipAddress": "IP Address", + "actions": "Actions", + "viewDetails": "View Details", + "eventDetails": "Event Details", + "details": "Details" + }, + "export": { + "title": "Export Audit Data", + "description": "Export audit events to CSV or JSON format. Use filters to limit the exported data.", + "format": "Export Format", + "filters": "Filters (Optional)", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "exportButton": "Export Data", + "error": "Failed to export data" + } + }, + "usage": { + "noData": "No data available", + "error": "Error loading usage statistics", + "noDataMessage": "No usage statistics are currently available.", + "controls": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All", + "refresh": "Refresh", + "dataTypeLabel": "Data Type:", + "dataType": { + "all": "All", + "api": "API", + "ui": "UI" + } + }, + "showing": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All" + }, + "stats": { + "totalEndpoints": "Total Endpoints", + "totalVisits": "Total Visits", + "showing": "Showing", + "selectedVisits": "Selected Visits" + }, + "chart": { + "title": "Endpoint Usage Chart" + }, + "table": { + "title": "Detailed Statistics", + "endpoint": "Endpoint", + "visits": "Visits", + "percentage": "Percentage", + "noData": "No data available" + } + }, + "backendHealth": { + "checking": "Checking backend status...", + "online": "Backend Online", + "offline": "Backend Offline" + }, + "autoRedact": { + "tags": "ÎąĪ€ĪŒÎēĪĪ…ĪˆÎˇ,ÎēĪĪĪˆÎšÎŧÎŋ,ÎŧÎąĪĪÎšĪƒÎŧÎą,ÎŧÎąĪĪÎŋ,ÎŧÎąĪÎēÎąÎ´ĪŒĪÎŋĪ‚,Îē΁΅ÎŧÎŧέÎŊÎŋ", + "title": "Î‘Ī…Ī„ĪŒÎŧÎąĪ„Îˇ ÎąĪ€ĪŒÎēĪĪ…ĪˆÎˇ", + "header": "Î‘Ī…Ī„ĪŒÎŧÎąĪ„Îˇ ÎąĪ€ĪŒÎēĪĪ…ĪˆÎˇ", + "colorLabel": "Î§ĪĪŽÎŧÎą", + "textsToRedactLabel": "ΚÎĩίÎŧÎĩÎŊÎŋ ΀΁ÎŋĪ‚ ÎąĪ€ĪŒÎēĪĪ…ĪˆÎˇ (Î´ÎšÎąĪ‡Ī‰ĪÎšĪƒÎŧέÎŊÎŋ ÎąÎŊÎŦ ÎŗĪÎąÎŧÎŧÎŽ)", + "textsToRedactPlaceholder": "Ī€.·. \\nΕÎŧĪ€ÎšĪƒĪ„ÎĩĪ…Ī„ÎšÎēΌ \\nΆÎē΁Ή΂ ÎąĪ€ĪŒĪĪÎˇĪ„Îŋ", + "useRegexLabel": "Î§ĪÎŽĪƒÎˇ Regex", + "wholeWordSearchLabel": "ΑÎŊÎąÎļÎŽĪ„ÎˇĪƒÎˇ ÎŋÎģΌÎēÎģÎˇĪÎˇĪ‚ ÎģÎ­ÎžÎˇĪ‚", + "customPaddingLabel": "Î ĪÎŋĪƒÎąĪÎŧÎŋ΃ÎŧέÎŊÎŋ ÎĩĪ€ÎšĪ€ÎģέÎŋÎŊ Ī€ÎĩĪÎšÎ¸ĪŽĪÎšÎŋ", + "convertPDFToImageLabel": "ΜÎĩĪ„ÎąĪ„ĪÎŋĪ€ÎŽ PDF ΃Îĩ PDF-ΕιÎēΌÎŊÎą (Î§ĪÎˇĪƒÎšÎŧÎŋĪ€ÎŋΚÎĩÎ¯Ī„ÎąÎš ÎŗÎšÎą Ī„ÎˇÎŊ ÎąĪ†ÎąÎ¯ĪÎĩĪƒÎˇ ÎēÎĩΚÎŧέÎŊÎŋĪ… Ī€Î¯ĪƒĪ‰ ÎąĪ€ĪŒ Ī„Îŋ Ī€ÎģÎąÎ¯ĪƒÎšÎŋ)", + "submitButton": "ÎĨĪ€ÎŋβÎŋÎģÎŽ" + }, + "replaceColorPdf": { + "tags": "ÎąÎŊĪ„ÎšÎēÎąĪ„ÎŦĪƒĪ„ÎąĪƒÎˇ Ī‡ĪĪŽÎŧÎąĪ„ÎŋĪ‚,ÎģÎĩÎšĪ„ÎŋĪ…ĪÎŗÎ¯ÎĩĪ‚ ΃ÎĩÎģÎ¯Î´ÎąĪ‚,backend,server side" } -} \ No newline at end of file +} diff --git a/frontend/public/locales/en-GB/translation.json b/frontend/public/locales/en-GB/translation.json index fc9048000..d44661a23 100644 --- a/frontend/public/locales/en-GB/translation.json +++ b/frontend/public/locales/en-GB/translation.json @@ -4455,6 +4455,17 @@ "startTour": "Start Tour", "startTourDescription": "Take a guided tour of Stirling PDF's key features" }, + "adminOnboarding": { + "welcome": "Welcome to the Admin Tour! Let's explore the powerful enterprise features and settings available to system administrators.", + "configButton": "Click the Config button to access all system settings and administrative controls.", + "settingsOverview": "This is the Settings Panel. Admin settings are organised by category for easy navigation.", + "teamsAndUsers": "Manage Teams and individual users here. You can invite new users via email, shareable links, or create custom accounts for them yourself.", + "systemCustomization": "We have extensive ways to customise the UI: System Settings let you change the app name and languages, Features allows server certificate management, and Endpoints lets you enable or disable specific tools for your users.", + "databaseSection": "For advanced production environments, we have settings to allow external database hookups so you can integrate with your existing infrastructure.", + "connectionsSection": "The Connections section supports various login methods including custom SSO and SAML providers like Google and GitHub, plus email integrations for notifications and communications.", + "adminTools": "Finally, we have advanced administration tools like Auditing to track system activity and Usage Analytics to monitor how your users interact with the platform.", + "wrapUp": "That's the admin tour! You've seen the enterprise features that make Stirling PDF a powerful, customisable solution for organisations. Access this tour anytime from the Help menu." + }, "pdfTextEditor": { "viewLabel": "PDF Text Editor", "title": "PDF Editor", diff --git a/frontend/public/locales/en-US/translation.json b/frontend/public/locales/en-US/translation.json index f0b241bf9..10e923c90 100644 --- a/frontend/public/locales/en-US/translation.json +++ b/frontend/public/locales/en-US/translation.json @@ -1,7 +1,4 @@ { - "language": { - "direction": "ltr" - }, "toolPanel": { "modePrompt": { "title": "Choose how you browse tools", @@ -16,9 +13,31 @@ "dismiss": "Maybe later" }, "fullscreen": { - "showDetails": "Show Details" + "showDetails": "Show Details", + "comingSoon": "Coming soon:", + "favorite": "Add to favourites", + "favorites": "Favourites", + "heading": "All tools (fullscreen view)", + "noResults": "Try adjusting your search or toggle descriptions to find what you need.", + "recommended": "Recommended", + "unfavorite": "Remove from favourites" + }, + "placeholder": "Choose a tool to get started", + "toggle": { + "fullscreen": "Switch to fullscreen mode", + "sidebar": "Switch to sidebar mode" } }, + "unsavedChanges": "You have unsaved changes to your PDF.", + "areYouSure": "Are you sure you want to leave?", + "unsavedChangesTitle": "Unsaved Changes", + "keepWorking": "Keep Working", + "discardChanges": "Discard & Leave", + "applyAndContinue": "Save & Leave", + "exportAndContinue": "Export & Continue", + "language": { + "direction": "ltr" + }, "addPageNumbers": { "fontSize": "Font Size", "fontName": "Font Name", @@ -35,8 +54,26 @@ "customTextDesc": "Custom Text", "numberPagesDesc": "Which pages to number, default 'all', also accepts 1-5 or 2,5,9 etc", "customNumberDesc": "Defaults to {n}, also accepts 'Page {n} of {total}', 'Text-{n}', '{filename}-{n}", - "submit": "Add Page Numbers" + "submit": "Add Page Numbers", + "configuration": "Configuration", + "customize": "Customize Appearance", + "pagesAndStarting": "Pages & Starting Number", + "positionAndPages": "Position & Pages", + "error": { + "failed": "Add page numbers operation failed" + }, + "results": { + "title": "Page Number Results" + }, + "preview": "Position Selection", + "previewDisclaimer": "Preview is approximate. Final output may vary due to PDF font metrics." }, + "pageSelectionPrompt": "Custom Page Selection (Enter a comma-separated list of page numbers 1,5,6 or Functions like 2n+1) :", + "startingNumberTooltip": "The first number to display. Subsequent pages will increment from this number.", + "marginTooltip": "Distance between the page number and the edge of the page.", + "fontSizeTooltip": "Size of the page number text in points. Larger numbers create bigger text.", + "fontTypeTooltip": "Font family for the page numbers. Choose based on your document style.", + "customTextTooltip": "Optional custom format for page numbers. Use {n} as placeholder for the number. Example: \"Page {n}\" will show \"Page 1\", \"Page 2\", etc.", "pdfPrompt": "Select PDF(s)", "multiPdfPrompt": "Select PDFs (2+)", "multiPdfDropPrompt": "Select (or drag & drop) all PDFs you require", @@ -47,7 +84,6 @@ "uploadLimitExceededPlural": "are too large. Maximum allowed size is", "processTimeWarning": "Warning: This process can take up to a minute depending on file-size", "pageOrderPrompt": "Custom Page Order (Enter a comma-separated list of page numbers or Functions like 2n+1) :", - "pageSelectionPrompt": "Custom Page Selection (Enter a comma-separated list of page numbers 1,5,6 or Functions like 2n+1) :", "goToPage": "Go", "true": "True", "false": "False", @@ -58,13 +94,32 @@ "save": "Save", "saveToBrowser": "Save to Browser", "download": "Download", + "pin": "Pin File (keep active after tool run)", + "unpin": "Unpin File (replace after tool run)", + "undoOperationTooltip": "Click to undo the last operation and restore the original files", + "undo": "Undo", + "back": "Back", + "nothingToUndo": "Nothing to undo", + "moreOptions": "More Options", "editYourNewFiles": "Edit your new file(s)", "close": "Close", - "chooseFile": "Choose File", + "openInViewer": "Open in Viewer", + "confirmClose": "Confirm Close", + "confirmCloseMessage": "Are you sure you want to close this file?", + "confirmCloseCancel": "Cancel", + "confirmCloseConfirm": "Close File", "fileSelected": "Selected: {{filename}}", + "chooseFile": "Choose File", "filesSelected": "{{count}} files selected", "files": { "title": "Files", + "upload": "Upload", + "uploadFiles": "Upload Files", + "addFiles": "Add files", + "selectFromWorkbench": "Select files from the workbench or ", + "selectMultipleFromWorkbench": "Select at least {{count}} files from the workbench or ", + "created": "Created", + "size": "File Size", "placeholder": "Select a PDF file in the main view to get started" }, "noFavourites": "No favorites added", @@ -72,7 +127,6 @@ "bored": "Bored Waiting?", "alphabet": "Alphabet", "downloadPdf": "Download PDF", - "text": "Text", "font": "Font", "selectFillter": "-- Select --", @@ -88,6 +142,7 @@ "encryptedPdfMustRemovePassword": "This PDF is encrypted or password-protected. Please unlock it before converting to PDF/A.", "incorrectPasswordProvided": "The PDF password is incorrect or not provided.", "_value": "Error", + "dismissAllErrors": "Dismiss All Errors", "sorry": "Sorry for the issue!", "needHelp": "Need help / Found an issue?", "contactTip": "If you're still having trouble, don't hesitate to reach out to us for help. You can submit a ticket on our GitHub page or contact us through Discord:", @@ -105,6 +160,7 @@ "warning": { "tooltipTitle": "Warning" }, + "edit": "Edit", "delete": "Delete", "username": "Username", "password": "Password", @@ -116,6 +172,7 @@ "green": "Green", "blue": "Blue", "custom": "Custom...", + "comingSoon": "Coming soon", "WorkInProgess": "Work in progress, May not work or be buggy, Please report any problems!", "poweredBy": "Powered by", "yes": "Yes", @@ -156,6 +213,7 @@ "noFileSelected": "No file selected. Please upload one.", "legal": { "privacy": "Privacy Policy", + "iAgreeToThe": "I agree to all of the", "terms": "Terms and Conditions", "accessibility": "Accessibility", "cookie": "Cookie Policy", @@ -195,6 +253,7 @@ "title": "Do you want make Stirling PDF better?", "paragraph1": "Stirling PDF has opt in analytics to help us improve the product. We do not track any personal information or file contents.", "paragraph2": "Please consider enabling analytics to help Stirling-PDF grow and to allow us to understand our users better.", + "learnMore": "Learn more", "enable": "Enable analytics", "disable": "Disable analytics", "settings": "You can change the settings for analytics in the config/settings.yml file" @@ -238,6 +297,54 @@ "cacheInputs": { "name": "Save form inputs", "help": "Enable to store previously used inputs for future runs" + }, + "general": { + "title": "General", + "description": "Configure general application preferences.", + "account": "Account", + "accountDescription": "Manage your account settings", + "user": "User", + "signedInAs": "Signed in as", + "logout": "Log out", + "enableFeatures": { + "title": "For System Administrators", + "intro": "Enable user authentication, team management, and workspace features for your organization.", + "action": "Configure", + "and": "and", + "benefit": "Enables user roles, team collaboration, admin controls, and enterprise features.", + "learnMore": "Learn more in documentation", + "dismiss": "Dismiss" + }, + "autoUnzip": "Auto-unzip API responses", + "autoUnzipDescription": "Automatically extract files from ZIP responses", + "autoUnzipTooltip": "Automatically extract ZIP files returned from API operations. Disable to keep ZIP files intact. This does not affect automation workflows.", + "autoUnzipFileLimit": "Auto-unzip file limit", + "autoUnzipFileLimitDescription": "Maximum number of files to extract from ZIP", + "autoUnzipFileLimitTooltip": "Only unzip if the ZIP contains this many files or fewer. Set higher to extract larger ZIPs.", + "defaultToolPickerMode": "Default tool picker mode", + "defaultToolPickerModeDescription": "Choose whether the tool picker opens in fullscreen or sidebar by default", + "mode": { + "fullscreen": "Fullscreen", + "sidebar": "Sidebar" + } + }, + "hotkeys": { + "title": "Keyboard Shortcuts", + "description": "Hover a tool to see its shortcut or customise it below. Click \"Change shortcut\" and press a new key combination. Press Esc to cancel.", + "errorModifier": { + "mac": "Include ⌘ (Command), âŒĨ (Option), or another modifier in your shortcut.", + "windows": "Include Ctrl, Alt, or another modifier in your shortcut." + }, + "errorConflict": "Shortcut already used by {{tool}}.", + "none": "Not assigned", + "customBadge": "Custom", + "defaultLabel": "Default: {{shortcut}}", + "capturing": "Press keysâ€Ļ (Esc to cancel)", + "change": "Change shortcut", + "reset": "Reset", + "shortcut": "Shortcut", + "noShortcut": "No shortcut set", + "searchPlaceholder": "Search tools..." } }, "changeCreds": { @@ -309,8 +416,10 @@ "top20": "Top 20", "all": "All", "refresh": "Refresh", - "includeHomepage": "Include Homepage ('/')", - "includeLoginPage": "Include Login Page ('/login')", + "dataTypeLabel": "Data Type:", + "dataTypeAll": "All", + "dataTypeApi": "API", + "dataTypeUi": "UI", "totalEndpoints": "Total Endpoints", "totalVisits": "Total Visits", "showing": "Showing", @@ -325,7 +434,9 @@ "top": "Top", "numberOfVisits": "Number of Visits", "visitsTooltip": "Visits: {0} ({1}% of total)", - "retry": "Retry" + "retry": "Retry", + "includeHomepage": "Include Homepage ('/')", + "includeLoginPage": "Include Login Page ('/login')" }, "database": { "title": "Database Import/Export", @@ -366,6 +477,16 @@ "alphabetical": "Alphabetical", "globalPopularity": "Global Popularity", "sortBy": "Sort by:", + "mobile": { + "brandAlt": "Stirling PDF logo", + "openFiles": "Open files", + "swipeHint": "Swipe left or right to switch views", + "tools": "Tools", + "toolsSlide": "Tool selection panel", + "viewSwitcher": "Switch workspace view", + "workbenchSlide": "Workspace panel", + "workspace": "Workspace" + }, "multiTool": { "tags": "multiple,tools", "title": "PDF Multi Tool", @@ -386,15 +507,10 @@ "title": "Rotate", "desc": "Easily rotate your PDFs." }, - "imageToPDF": { - "tags": "convert,image,transform", - "title": "Image to PDF", - "desc": "Convert a image (PNG, JPEG, GIF) to PDF." - }, - "pdfToImage": { - "tags": "convert,image,extract", - "title": "PDF to Image", - "desc": "Convert a PDF to a image. (PNG, JPEG, GIF)" + "convert": { + "tags": "transform,change", + "title": "Convert", + "desc": "Convert files between different formats" }, "pdfOrganiser": { "tags": "organize,rearrange,reorder", @@ -406,31 +522,16 @@ "title": "Add image", "desc": "Adds a image onto a set location on the PDF" }, + "addAttachments": { + "tags": "embed,attach,include", + "title": "Add Attachments", + "desc": "Add or remove embedded files (attachments) to/from a PDF" + }, "watermark": { "tags": "stamp,mark,overlay", "title": "Add Watermark", "desc": "Add a custom watermark to your PDF document." }, - "permissions": { - "tags": "permissions,security,access", - "title": "Change Permissions", - "desc": "Change the permissions of your PDF document" - }, - "pageRemover": { - "tags": "remove,delete,pages", - "title": "Remove", - "desc": "Delete unwanted pages from your PDF document." - }, - "addPassword": { - "tags": "password,encrypt,secure", - "title": "Add Password", - "desc": "Encrypt your PDF document with a password." - }, - "changePermissions": { - "tags": "permissions,restrictions,security", - "title": "Change Permissions", - "desc": "Change document restrictions and permissions." - }, "removePassword": { "tags": "unlock,remove,password", "title": "Remove Password", @@ -441,11 +542,6 @@ "title": "Compress", "desc": "Compress PDFs to reduce their file size." }, - "sanitize": { - "tags": "clean,purge,remove", - "title": "Sanitize", - "desc": "Remove potentially harmful elements from PDF files." - }, "unlockPDFForms": { "tags": "unlock,enable,edit", "title": "Unlock PDF Forms", @@ -456,11 +552,6 @@ "title": "Change Metadata", "desc": "Change/Remove/Add metadata from a PDF document" }, - "fileToPDF": { - "tags": "convert,transform,change", - "title": "Convert file to PDF", - "desc": "Convert nearly any file to PDF (DOCX, PNG, XLS, PPT, TXT and more)" - }, "ocr": { "tags": "extract,scan", "title": "OCR / Cleanup scans", @@ -471,6 +562,253 @@ "title": "Extract Images", "desc": "Extracts all images from a PDF and saves them to zip" }, + "scannerImageSplit": { + "tags": "detect,split,photos", + "title": "Detect & Split Scanned Photos", + "desc": "Detect and split scanned photos into separate pages" + }, + "sign": { + "tags": "signature,autograph", + "title": "Sign", + "desc": "Adds signature to PDF by drawing, text or image" + }, + "flatten": { + "tags": "simplify,remove,interactive", + "title": "Flatten", + "desc": "Remove all interactive elements and forms from a PDF" + }, + "certSign": { + "tags": "authenticate,PEM,P12,official,encrypt,sign,certificate,PKCS12,JKS,server,manual,auto", + "title": "Sign with Certificate", + "desc": "Signs a PDF with a Certificate/Key (PEM/P12)" + }, + "repair": { + "tags": "fix,restore", + "title": "Repair", + "desc": "Tries to repair a corrupt/broken PDF" + }, + "removeBlanks": { + "tags": "delete,clean,empty", + "title": "Remove Blank pages", + "desc": "Detects and removes blank pages from a document" + }, + "removeAnnotations": { + "tags": "delete,clean,strip", + "title": "Remove Annotations", + "desc": "Removes all comments/annotations from a PDF" + }, + "compare": { + "tags": "difference", + "title": "Compare", + "desc": "Compares and shows the differences between 2 PDF Documents" + }, + "removeCertSign": { + "tags": "remove,delete,unlock", + "title": "Remove Certificate Sign", + "desc": "Remove certificate signature from PDF" + }, + "pageLayout": { + "tags": "layout,arrange,combine", + "title": "Multi-Page Layout", + "desc": "Merge multiple pages of a PDF document into a single page" + }, + "bookletImposition": { + "tags": "booklet,print,binding", + "title": "Booklet Imposition", + "desc": "Create booklets with proper page ordering and multi-page layout for printing and binding" + }, + "scalePages": { + "tags": "resize,adjust,scale", + "title": "Adjust page size/scale", + "desc": "Change the size/scale of a page and/or its contents." + }, + "addPageNumbers": { + "tags": "number,pagination,count", + "title": "Add Page Numbers", + "desc": "Add Page numbers throughout a document in a set location" + }, + "autoRename": { + "tags": "auto-detect,header-based,organize,relabel", + "title": "Auto Rename PDF File", + "desc": "Auto renames a PDF file based on its detected header" + }, + "adjustContrast": { + "tags": "contrast,brightness,saturation", + "title": "Adjust Colors/Contrast", + "desc": "Adjust Colors/Contrast, Saturation and Brightness of a PDF" + }, + "crop": { + "tags": "trim,cut,resize", + "title": "Crop PDF", + "desc": "Crop a PDF to reduce its size (maintains text!)" + }, + "autoSplitPDF": { + "tags": "auto,split,QR", + "title": "Auto Split Pages", + "desc": "Auto Split Scanned PDF with physical scanned page splitter QR Code" + }, + "sanitize": { + "tags": "clean,purge,remove", + "title": "Sanitize", + "desc": "Remove potentially harmful elements from PDF files." + }, + "getPdfInfo": { + "tags": "info,metadata,details", + "title": "Get ALL Info on PDF", + "desc": "Grabs any and all information possible on PDFs" + }, + "pdfToSinglePage": { + "tags": "combine,merge,single", + "title": "Single Large Page", + "desc": "Merges all PDF pages into one large single page" + }, + "showJS": { + "tags": "javascript,code,script", + "title": "Show Javascript", + "desc": "Searches and displays any JS injected into a PDF" + }, + "redact": { + "tags": "censor,blackout,hide", + "title": "Manual Redaction", + "desc": "Redacts a PDF based on selected text, drawn shapes and/or selected page(s)" + }, + "splitBySections": { + "tags": "split,sections,divide", + "title": "Split PDF by Sections", + "desc": "Divide each page of a PDF into smaller horizontal and vertical sections" + }, + "addStamp": { + "tags": "stamp,mark,seal", + "title": "Add Stamp to PDF", + "desc": "Add text or add image stamps at set locations" + }, + "removeImage": { + "tags": "remove,delete,clean", + "title": "Remove image", + "desc": "Remove image from PDF to reduce file size" + }, + "splitByChapters": { + "tags": "split,chapters,structure", + "title": "Split PDF by Chapters", + "desc": "Split a PDF into multiple files based on its chapter structure." + }, + "validateSignature": { + "tags": "validate,verify,certificate", + "title": "Validate PDF Signature", + "desc": "Verify digital signatures and certificates in PDF documents" + }, + "swagger": { + "tags": "API,documentation,test", + "title": "API Documentation", + "desc": "View API documentation and test endpoints" + }, + "scannerEffect": { + "tags": "scan,simulate,create", + "title": "Scanner Effect", + "desc": "Create a PDF that looks like it was scanned" + }, + "editTableOfContents": { + "tags": "bookmarks,contents,edit", + "title": "Edit Table of Contents", + "desc": "Add or edit bookmarks and table of contents in PDF documents" + }, + "manageCertificates": { + "tags": "certificates,import,export", + "title": "Manage Certificates", + "desc": "Import, export, or delete digital certificate files used for signing PDFs." + }, + "read": { + "tags": "view,open,display", + "title": "Read", + "desc": "View and annotate PDFs. Highlight text, draw, or insert comments for review and collaboration." + }, + "reorganizePages": { + "tags": "rearrange,reorder,organize", + "title": "Reorganize Pages", + "desc": "Rearrange, duplicate, or delete PDF pages with visual drag-and-drop control." + }, + "extractPages": { + "tags": "pull,select,copy", + "title": "Extract Pages", + "desc": "Extract specific pages from a PDF document" + }, + "removePages": { + "tags": "delete,extract,exclude", + "title": "Remove Pages", + "desc": "Remove specific pages from a PDF document" + }, + "autoSizeSplitPDF": { + "tags": "auto,split,size", + "title": "Auto Split by Size/Count", + "desc": "Automatically split PDFs by file size or page count" + }, + "replaceColor": { + "title": "Replace & Invert Colour", + "desc": "Replace or invert colours in PDF documents" + }, + "devApi": { + "tags": "API,development,documentation", + "title": "API", + "desc": "Link to API documentation" + }, + "devFolderScanning": { + "tags": "automation,folder,scanning", + "title": "Automated Folder Scanning", + "desc": "Link to automated folder scanning guide" + }, + "devSsoGuide": { + "title": "SSO Guide", + "desc": "Link to SSO guide" + }, + "devAirgapped": { + "title": "Air-gapped Setup", + "desc": "Link to air-gapped setup guide" + }, + "addPassword": { + "title": "Add Password", + "desc": "Encrypt your PDF document with a password.", + "tags": "password,encrypt,secure" + }, + "changePermissions": { + "title": "Change Permissions", + "desc": "Change document restrictions and permissions.", + "tags": "permissions,restrictions,security" + }, + "automate": { + "tags": "workflow,sequence,automation", + "title": "Automate", + "desc": "Build multi-step workflows by chaining together PDF actions. Ideal for recurring tasks." + }, + "overlay-pdfs": { + "desc": "Overlays PDFs on-top of another PDF", + "title": "Overlay PDFs", + "tags": "overlay,combine,stack" + }, + "imageToPDF": { + "tags": "convert,image,transform", + "title": "Image to PDF", + "desc": "Convert a image (PNG, JPEG, GIF) to PDF." + }, + "pdfToImage": { + "tags": "convert,image,extract", + "title": "PDF to Image", + "desc": "Convert a PDF to a image. (PNG, JPEG, GIF)" + }, + "permissions": { + "tags": "permissions,security,access", + "title": "Change Permissions", + "desc": "Change the permissions of your PDF document" + }, + "pageRemover": { + "tags": "remove,delete,pages", + "title": "Remove", + "desc": "Delete unwanted pages from your PDF document." + }, + "fileToPDF": { + "tags": "convert,transform,change", + "title": "Convert file to PDF", + "desc": "Convert nearly any file to PDF (DOCX, PNG, XLS, PPT, TXT and more)" + }, "pdfToPDFA": { "tags": "convert,archive,long-term", "title": "PDF to PDF/A", @@ -506,91 +844,16 @@ "title": "Detect/Split Scanned photos", "desc": "Splits multiple photos from within a photo/PDF" }, - "sign": { - "tags": "signature,autograph", - "title": "Sign", - "desc": "Adds signature to PDF by drawing, text or image" - }, - "flatten": { - "tags": "simplify,remove,interactive", - "title": "Flatten", - "desc": "Remove all interactive elements and forms from a PDF" - }, - "repair": { - "tags": "fix,restore", - "title": "Repair", - "desc": "Tries to repair a corrupt/broken PDF" - }, - "removeBlanks": { - "tags": "delete,clean,empty", - "title": "Remove Blank pages", - "desc": "Detects and removes blank pages from a document" - }, - "removeAnnotations": { - "tags": "delete,clean,strip", - "title": "Remove Annotations", - "desc": "Removes all comments/annotations from a PDF" - }, - "compare": { - "tags": "difference", - "title": "Compare", - "desc": "Compares and shows the differences between 2 PDF Documents" - }, - "certSign": { - "tags": "authenticate,PEM,P12,official,encrypt,sign,certificate,PKCS12,JKS,server,manual,auto", - "title": "Sign with Certificate", - "desc": "Signs a PDF with a Certificate/Key (PEM/P12)" - }, - "removeCertSign": { - "tags": "remove,delete,unlock", - "title": "Remove Certificate Sign", - "desc": "Remove certificate signature from PDF" - }, - "pageLayout": { - "tags": "layout,arrange,combine", - "title": "Multi-Page Layout", - "desc": "Merge multiple pages of a PDF document into a single page" - }, - "bookletImposition": { - "tags": "booklet,print,binding", - "title": "Booklet Imposition", - "desc": "Create booklets with proper page ordering and multi-page layout for printing and binding" - }, - "scalePages": { - "tags": "resize,adjust,scale", - "title": "Adjust page size/scale", - "desc": "Change the size/scale of a page and/or its contents." - }, "pipeline": { "tags": "automation,script,workflow", "title": "Pipeline", "desc": "Run multiple actions on PDFs by defining pipeline scripts" }, - "addPageNumbers": { - "tags": "number,pagination,count", - "title": "Add Page Numbers", - "desc": "Add Page numbers throughout a document in a set location" - }, "auto-rename": { "tags": "auto-detect,header-based,organize,relabel", "title": "Auto Rename PDF File", "desc": "Auto renames a PDF file based on its detected header" }, - "adjustContrast": { - "tags": "contrast,brightness,saturation", - "title": "Adjust Colors/Contrast", - "desc": "Adjust Colors/Contrast, Saturation and Brightness of a PDF" - }, - "crop": { - "tags": "trim,cut,resize", - "title": "Crop PDF", - "desc": "Crop a PDF to reduce its size (maintains text!)" - }, - "autoSplitPDF": { - "tags": "auto,split,QR", - "title": "Auto Split Pages", - "desc": "Auto Split Scanned PDF with physical scanned page splitter QR Code" - }, "sanitizePDF": { "tags": "clean,purge,remove", "title": "Sanitize", @@ -616,33 +879,15 @@ "title": "PDF to Markdown", "desc": "Converts any PDF to Markdown" }, - "getPdfInfo": { - "tags": "info,metadata,details", - "title": "Get ALL Info on PDF", - "desc": "Grabs any and all information possible on PDFs" - }, "pageExtracter": { "title": "Extract page(s)", "desc": "Extracts select pages from PDF" }, - "pdfToSinglePage": { - "title": "Single Large Page", - "desc": "Merges all PDF pages into one large single page" - }, - "showJS": { - "title": "Show Javascript", - "desc": "Searches and displays any JS injected into a PDF" - }, "autoRedact": { "tags": "auto,redact,censor", "title": "Auto Redact", "desc": "Auto Redacts(Blacks out) text in a PDF based on input text" }, - "redact": { - "tags": "censor,blackout,hide", - "title": "Manual Redaction", - "desc": "Redacts a PDF based on selected text, drawn shapes and/or selected page(s)" - }, "PDFToCSV": { "tags": "convert,csv,table", "title": "PDF to CSV", @@ -653,11 +898,6 @@ "title": "Auto Split by Size/Count", "desc": "Split a single PDF into multiple documents based on size, page count, or document count" }, - "overlay-pdfs": { - "tags": "overlay,combine,stack", - "title": "Overlay PDFs", - "desc": "Overlays PDFs on-top of another PDF" - }, "split-by-sections": { "tags": "split,sections,divide", "title": "Split PDF by Sections", @@ -668,26 +908,6 @@ "title": "Add Stamp to PDF", "desc": "Add text or add image stamps at set locations" }, - "removeImage": { - "tags": "remove,delete,clean", - "title": "Remove image", - "desc": "Remove image from PDF to reduce file size" - }, - "splitByChapters": { - "tags": "split,chapters,structure", - "title": "Split PDF by Chapters", - "desc": "Split a PDF into multiple files based on its chapter structure." - }, - "validateSignature": { - "tags": "validate,verify,certificate", - "title": "Validate PDF Signature", - "desc": "Verify digital signatures and certificates in PDF documents" - }, - "swagger": { - "tags": "API,documentation,test", - "title": "API Documentation", - "desc": "View API documentation and test endpoints" - }, "replace-color": { "tags": "color,replace,invert", "title": "Replace and Invert Color", @@ -731,14 +951,39 @@ "merge": { "tags": "merge,Page operations,Back end,server side", "title": "Merge", + "removeDigitalSignature": { + "label": "Remove digital signature in the merged file?", + "tooltip": { + "title": "Remove Digital Signature", + "description": "Digital signatures will be invalidated when merging files. Check this to remove them from the final merged PDF." + } + }, + "generateTableOfContents": { + "label": "Generate table of contents in the merged file?", + "tooltip": { + "title": "Generate Table of Contents", + "description": "Automatically creates a clickable table of contents in the merged PDF based on the original file names and page numbers." + } + }, + "submit": "Merge", + "sortBy": { + "description": "Files will be merged in the order they're selected. Drag to reorder or sort below.", + "label": "Sort By", + "filename": "File Name", + "dateModified": "Date Modified", + "ascending": "Ascending", + "descending": "Descending", + "sort": "Sort" + }, + "error": { + "failed": "An error occurred while merging the PDFs." + }, "header": "Merge multiple PDFs (2+)", "sortByName": "Sort by name", "sortByDate": "Sort by date", - "removeCertSign": "Remove digital signature in the merged file?", - "submit": "Merge" + "removeCertSign": "Remove digital signature in the merged file?" }, "split": { - "tags": "Page operations,divide,Multi Page,cut,server side", "title": "Split PDF", "header": "Split PDF", "desc": { @@ -752,14 +997,297 @@ "8": "Document #6: Page 10" }, "splitPages": "Enter pages to split on:", - "submit": "Split" + "submit": "Split", + "steps": { + "chooseMethod": "Choose Method", + "settings": "Settings" + }, + "settings": { + "selectMethodFirst": "Please select a split method first" + }, + "error": { + "failed": "An error occurred while splitting the PDF." + }, + "method": { + "label": "Choose split method", + "placeholder": "Select how to split the PDF" + }, + "methods": { + "prefix": { + "splitAt": "Split at", + "splitBy": "Split by" + }, + "byPages": { + "name": "Page Numbers", + "desc": "Extract specific pages (1,3,5-10)", + "tooltip": "Enter page numbers separated by commas or ranges with hyphens" + }, + "bySections": { + "name": "Sections", + "desc": "Divide pages into grid sections", + "tooltip": "Split each page into horizontal and vertical sections" + }, + "bySize": { + "name": "File Size", + "desc": "Limit maximum file size", + "tooltip": "Specify maximum file size (e.g. 10MB, 500KB)" + }, + "byPageCount": { + "name": "Page Count", + "desc": "Fixed pages per file", + "tooltip": "Enter the number of pages for each split file" + }, + "byDocCount": { + "name": "Document Count", + "desc": "Create specific number of files", + "tooltip": "Enter how many files you want to create" + }, + "byChapters": { + "name": "Chapters", + "desc": "Split at bookmark boundaries", + "tooltip": "Uses PDF bookmarks to determine split points" + }, + "byPageDivider": { + "name": "Page Divider", + "desc": "Auto-split with divider sheets", + "tooltip": "Use QR code divider sheets between documents when scanning" + } + }, + "value": { + "fileSize": { + "label": "File Size", + "placeholder": "e.g. 10MB, 500KB" + }, + "pageCount": { + "label": "Pages per File", + "placeholder": "e.g. 5, 10" + }, + "docCount": { + "label": "Number of Files", + "placeholder": "e.g. 3, 5" + } + }, + "tooltip": { + "header": { + "title": "Split Methods Overview" + }, + "byPages": { + "title": "Split at Page Numbers", + "text": "Split your PDF at specific page numbers. Using 'n' splits after page n. Using 'n-m' splits before page n and after page m.", + "bullet1": "Single split points: 3,7 (splits after pages 3 and 7)", + "bullet2": "Range split points: 3-8 (splits before page 3 and after page 8)", + "bullet3": "Mixed: 2,5-10,15 (splits after page 2, before page 5, after page 10, and after page 15)" + }, + "bySections": { + "title": "Split by Grid Sections", + "text": "Divide each page into a grid of sections. Useful for splitting documents with multiple columns or extracting specific areas.", + "bullet1": "Horizontal: Number of rows to create", + "bullet2": "Vertical: Number of columns to create", + "bullet3": "Merge: Combine all sections into one PDF" + }, + "bySize": { + "title": "Split by File Size", + "text": "Create multiple PDFs that don't exceed a specified file size. Ideal for file size limitations or email attachments.", + "bullet1": "Use MB for larger files (e.g., 10MB)", + "bullet2": "Use KB for smaller files (e.g., 500KB)", + "bullet3": "System will split at page boundaries" + }, + "byCount": { + "title": "Split by Count", + "text": "Create multiple PDFs with a specific number of pages or documents each.", + "bullet1": "Page Count: Fixed number of pages per file", + "bullet2": "Document Count: Fixed number of output files", + "bullet3": "Useful for batch processing workflows" + }, + "byChapters": { + "title": "Split by Chapters", + "text": "Use PDF bookmarks to automatically split at chapter boundaries. Requires PDFs with bookmark structure.", + "bullet1": "Bookmark Level: Which level to split on (1=top level)", + "bullet2": "Include Metadata: Preserve document properties", + "bullet3": "Allow Duplicates: Handle repeated bookmark names" + }, + "byDocCount": { + "bullet1": "Enter the number of output files you want", + "bullet2": "Pages are distributed as evenly as possible", + "bullet3": "Useful when you need a specific number of files", + "text": "Create a specific number of output files by evenly distributing pages across them.", + "title": "Split by Document Count" + }, + "byPageCount": { + "bullet1": "Enter the number of pages per output file", + "bullet2": "Last file may have fewer pages if not evenly divisible", + "bullet3": "Useful for batch processing workflows", + "text": "Create multiple PDFs with a specific number of pages each. Perfect for creating uniform document chunks.", + "title": "Split by Page Count" + }, + "byPageDivider": { + "bullet1": "Print divider sheets from the download link", + "bullet2": "Insert divider sheets between your documents", + "bullet3": "Scan all documents together as one PDF", + "bullet4": "Upload - divider pages are automatically detected and removed", + "bullet5": "Enable Duplex Mode if scanning both sides of divider sheets", + "text": "Automatically split scanned documents using physical divider sheets with QR codes. Perfect for processing multiple documents scanned together.", + "title": "Split by Page Divider" + } + }, + "methodSelection": { + "tooltip": { + "bullet1": "Click on a method card to select it", + "bullet2": "Hover over each card to see a quick description", + "bullet3": "The settings step will appear after you select a method", + "bullet4": "You can change methods at any time before processing", + "header": { + "text": "Choose how you want to split your PDF document. Each method is optimized for different use cases and document types.", + "title": "Split Method Selection" + }, + "title": "Choose Your Split Method" + } + }, + "selectMethod": "Select a split method", + "tags": "Page operations,divide,Multi Page,cut,server side" }, "rotate": { - "tags": "server side", "title": "Rotate PDF", + "submit": "Rotate", + "selectRotation": "Select Rotation Angle (Clockwise)", + "error": { + "failed": "An error occurred while rotating the PDF." + }, + "preview": { + "title": "Rotation Preview" + }, + "rotateLeft": "Rotate Anticlockwise", + "rotateRight": "Rotate Clockwise", + "tooltip": { + "header": { + "title": "Rotate Settings Overview" + }, + "description": { + "text": "Rotate your PDF pages clockwise or anticlockwise in 90-degree increments. All pages in the PDF will be rotated. The preview shows how your document will look after rotation." + }, + "controls": { + "title": "Controls", + "text": "Use the rotation buttons to adjust orientation. Left button rotates anticlockwise, right button rotates clockwise. Each click rotates by 90 degrees." + } + }, + "tags": "server side", "header": "Rotate PDF", - "selectAngle": "Select rotation angle (in multiples of 90 degrees):", - "submit": "Rotate" + "selectAngle": "Select rotation angle (in multiples of 90 degrees):" + }, + "convert": { + "title": "Convert", + "desc": "Convert files between different formats", + "files": "Files", + "selectFilesPlaceholder": "Select files in the main view to get started", + "settings": "Settings", + "conversionCompleted": "Conversion completed", + "results": "Results", + "defaultFilename": "converted_file", + "conversionResults": "Conversion Results", + "convertFrom": "Convert from", + "convertTo": "Convert to", + "sourceFormatPlaceholder": "Source format", + "targetFormatPlaceholder": "Target format", + "selectSourceFormatFirst": "Select a source format first", + "outputOptions": "Output Options", + "pdfOptions": "PDF Options", + "imageOptions": "Image Options", + "colorType": "Color Type", + "color": "Color", + "greyscale": "Greyscale", + "blackwhite": "Black & White", + "dpi": "DPI", + "output": "Output", + "single": "Single", + "multiple": "Multiple", + "fitOption": "Fit Option", + "maintainAspectRatio": "Maintain Aspect Ratio", + "fitDocumentToPage": "Fit Document to Page", + "fillPage": "Fill Page", + "autoRotate": "Auto Rotate", + "autoRotateDescription": "Automatically rotate images to better fit the PDF page", + "combineImages": "Combine Images", + "combineImagesDescription": "Combine all images into one PDF, or create separate PDFs for each image", + "webOptions": "Web to PDF Options", + "zoomLevel": "Zoom Level", + "emailOptions": "Email to PDF Options", + "includeAttachments": "Include email attachments", + "maxAttachmentSize": "Maximum attachment size (MB)", + "includeAllRecipients": "Include CC and BCC recipients in header", + "downloadHtml": "Download HTML intermediate file instead of PDF", + "pdfaOptions": "PDF/A Options", + "outputFormat": "Output Format", + "pdfaNote": "PDF/A-1b is more compatible, PDF/A-2b supports more features.", + "pdfaDigitalSignatureWarning": "The PDF contains a digital signature. This will be removed in the next step.", + "fileFormat": "File Format", + "wordDoc": "Word Document", + "wordDocExt": "Word Document (.docx)", + "odtExt": "OpenDocument Text (.odt)", + "pptExt": "PowerPoint (.pptx)", + "odpExt": "OpenDocument Presentation (.odp)", + "txtExt": "Plain Text (.txt)", + "rtfExt": "Rich Text Format (.rtf)", + "selectedFiles": "Selected files", + "noFileSelected": "No file selected. Use the file panel to add files.", + "convertFiles": "Convert Files", + "converting": "Converting...", + "downloadConverted": "Download Converted File", + "errorNoFiles": "Please select at least one file to convert.", + "errorNoFormat": "Please select both source and target formats.", + "errorNotSupported": "Conversion from {{from}} to {{to}} is not supported.", + "images": "Images", + "officeDocs": "Office Documents (Word, Excel, PowerPoint)", + "imagesExt": "Images (JPG, PNG, etc.)", + "markdown": "Markdown", + "textRtf": "Text/RTF", + "grayscale": "Greyscale", + "errorConversion": "An error occurred while converting the file.", + "sanitize": { + "submit": "Sanitize PDF", + "completed": "Sanitization completed successfully", + "error": { + "generic": "Sanitization failed", + "failed": "An error occurred while sanitizing the PDF." + }, + "filenamePrefix": "sanitized", + "sanitizationResults": "Sanitization Results", + "steps": { + "files": "Files", + "settings": "Settings", + "results": "Results" + }, + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "options": { + "title": "Sanitization Options", + "note": "Select the elements you want to remove from the PDF. At least one option must be selected.", + "removeJavaScript": { + "label": "Remove JavaScript", + "desc": "Remove JavaScript actions and scripts from the PDF" + }, + "removeEmbeddedFiles": { + "label": "Remove Embedded Files", + "desc": "Remove any files embedded within the PDF" + }, + "removeXMPMetadata": { + "label": "Remove XMP Metadata", + "desc": "Remove XMP metadata from the PDF" + }, + "removeMetadata": { + "label": "Remove Document Metadata", + "desc": "Remove document information metadata (title, author, etc.)" + }, + "removeLinks": { + "label": "Remove Links", + "desc": "Remove external links and launch actions from the PDF" + }, + "removeFonts": { + "label": "Remove Fonts", + "desc": "Remove embedded fonts from the PDF" + } + } + } }, "imageToPdf": { "tags": "conversion,img,jpg,picture,photo" @@ -797,7 +1325,20 @@ "8": "Remove Last", "9": "Remove First and Last", "10": "Odd-Even Merge", - "11": "Duplicate all pages" + "11": "Duplicate all pages", + "desc": { + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, â€Ļ).", + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, â€Ļ).", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimized for binding on the side)." + } }, "desc": { "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", @@ -822,6 +1363,261 @@ "upload": "Add image", "submit": "Add image" }, + "attachments": { + "tags": "attachments,add,remove,embed,file", + "title": "Add Attachments", + "header": "Add Attachments", + "add": "Add Attachment", + "remove": "Remove Attachment", + "embed": "Embed Attachment", + "submit": "Add Attachments" + }, + "watermark": { + "title": "Add Watermark", + "desc": "Add text or image watermarks to PDF files", + "completed": "Watermark added", + "submit": "Add Watermark", + "filenamePrefix": "watermarked", + "error": { + "failed": "An error occurred while adding watermark to the PDF." + }, + "watermarkType": { + "text": "Text", + "image": "Image" + }, + "settings": { + "type": "Watermark Type", + "text": { + "label": "Watermark Text", + "placeholder": "Enter watermark text" + }, + "image": { + "label": "Watermark Image", + "choose": "Choose Image", + "selected": "Selected: {{filename}}" + }, + "fontSize": "Font Size", + "size": "Size", + "alphabet": "Font/Language", + "color": "Watermark Color", + "rotation": "Rotation (degrees)", + "opacity": "Opacity (%)", + "spacing": { + "horizontal": "Horizontal Spacing", + "vertical": "Vertical Spacing", + "height": "Height Spacing", + "width": "Width Spacing" + }, + "convertToImage": "Flatten PDF pages to images" + }, + "alphabet": { + "roman": "Roman/Latin", + "arabic": "Arabic", + "japanese": "Japanese", + "korean": "Korean", + "chinese": "Chinese", + "thai": "Thai" + }, + "steps": { + "type": "Watermark Type", + "wording": "Wording", + "textStyle": "Style", + "formatting": "Formatting", + "file": "Watermark File" + }, + "results": { + "title": "Watermark Results" + }, + "tooltip": { + "language": { + "title": "Language Support", + "text": "Choose the appropriate language setting to ensure proper font rendering for your text." + }, + "appearance": { + "title": "Appearance Settings", + "text": "Control how your watermark looks and blends with the document.", + "bullet1": "Rotation: -360° to 360° for angled watermarks", + "bullet2": "Opacity: 0-100% for transparency control", + "bullet3": "Lower opacity creates subtle watermarks" + }, + "spacing": { + "title": "Spacing Control", + "text": "Adjust the spacing between repeated watermarks across the page.", + "bullet1": "Width spacing: Horizontal distance between watermarks", + "bullet2": "Height spacing: Vertical distance between watermarks", + "bullet3": "Higher values create more spread out patterns" + }, + "type": { + "header": { + "title": "Watermark Type Selection" + }, + "description": { + "title": "Choose Your Watermark", + "text": "Select between text or image watermarks based on your needs." + }, + "text": { + "title": "Text Watermarks", + "text": "Perfect for adding copyright notices, company names, or confidentiality labels. Supports multiple languages and custom colors.", + "bullet1": "Customizable fonts and languages", + "bullet2": "Adjustable colors and transparency", + "bullet3": "Ideal for legal or branding text" + }, + "image": { + "title": "Image Watermarks", + "text": "Use logos, stamps, or any image as a watermark. Great for branding and visual identification.", + "bullet1": "Upload any image format", + "bullet2": "Maintains image quality", + "bullet3": "Perfect for logos and stamps" + } + }, + "wording": { + "header": { + "title": "Text Content" + }, + "text": { + "title": "Watermark Text", + "text": "Enter the text that will appear as your watermark across the document.", + "bullet1": "Keep it concise for better readability", + "bullet2": "Common examples: 'CONFIDENTIAL', 'DRAFT', company name", + "bullet3": "Emoji characters are not supported and will be filtered out" + } + }, + "textStyle": { + "header": { + "title": "Text Style" + }, + "color": { + "title": "Color Selection", + "text": "Choose a color that provides good contrast with your document content.", + "bullet1": "Light gray (#d3d3d3) for subtle watermarks", + "bullet2": "Black or dark colors for high contrast", + "bullet3": "Custom colors for branding purposes" + }, + "language": { + "title": "Language Support", + "text": "Choose the appropriate language setting to ensure proper font rendering.", + "bullet1": "Roman/Latin for Western languages", + "bullet2": "Arabic for Arabic script", + "bullet3": "Japanese, Korean, Chinese for Asian languages", + "bullet4": "Thai for Thai script" + } + }, + "file": { + "header": { + "title": "Image Upload" + }, + "upload": { + "title": "Image Selection", + "text": "Upload an image file to use as your watermark.", + "bullet1": "Supports common formats: PNG, JPG, GIF, BMP", + "bullet2": "PNG with transparency works best", + "bullet3": "Higher resolution images maintain quality better" + }, + "recommendations": { + "title": "Best Practices", + "text": "Tips for optimal image watermark results.", + "bullet1": "Use logos or stamps with transparent backgrounds", + "bullet2": "Simple designs work better than complex images", + "bullet3": "Consider the final document size when choosing resolution" + } + }, + "formatting": { + "header": { + "title": "Formatting & Layout" + }, + "size": { + "title": "Size Control", + "text": "Adjust the size of your watermark (text or image).", + "bullet1": "Larger sizes create more prominent watermarks" + }, + "appearance": { + "title": "Appearance Settings", + "text": "Control how your watermark looks and blends with the document.", + "bullet1": "Rotation: -360° to 360° for angled watermarks", + "bullet2": "Opacity: 0-100% for transparency control", + "bullet3": "Lower opacity creates subtle watermarks" + }, + "spacing": { + "title": "Spacing Control", + "text": "Adjust the spacing between repeated watermarks across the page.", + "bullet1": "Horizontal spacing: Distance between watermarks left to right", + "bullet2": "Vertical spacing: Distance between watermarks top to bottom", + "bullet3": "Higher values create more spread out patterns" + }, + "security": { + "title": "Security Option", + "text": "Flatten PDF pages to images for enhanced security.", + "bullet1": "Prevents text selection and copying", + "bullet2": "Makes watermarks harder to remove", + "bullet3": "Results in larger file sizes", + "bullet4": "Best for sensitive or copyrighted content" + } + }, + "content": { + "header": { + "title": "Content Configuration" + }, + "text": { + "title": "Text Settings", + "text": "Configure your text watermark appearance and language support.", + "bullet1": "Enter your watermark text", + "bullet2": "Adjust font size (8-72pt)", + "bullet3": "Select language/script support", + "bullet4": "Choose custom colors" + }, + "language": { + "title": "Language Support", + "text": "Choose the appropriate language setting to ensure proper font rendering for your text.", + "bullet1": "Roman/Latin for Western languages", + "bullet2": "Arabic for Arabic script", + "bullet3": "Japanese, Korean, Chinese for Asian languages", + "bullet4": "Thai for Thai script" + } + }, + "style": { + "header": { + "title": "Style & Positioning" + }, + "appearance": { + "title": "Appearance Settings", + "text": "Control how your watermark looks and blends with the document.", + "bullet1": "Rotation: -360° to 360° for angled watermarks", + "bullet2": "Opacity: 0-100% for transparency control", + "bullet3": "Lower opacity creates subtle watermarks" + }, + "spacing": { + "title": "Spacing Control", + "text": "Adjust the spacing between repeated watermarks across the page.", + "bullet1": "Width spacing: Horizontal distance between watermarks", + "bullet2": "Height spacing: Vertical distance between watermarks", + "bullet3": "Higher values create more spread out patterns" + } + }, + "advanced": { + "header": { + "title": "Advanced Options" + }, + "conversion": { + "title": "PDF to Image Conversion", + "text": "Convert the final PDF to an image-based format for enhanced security.", + "bullet1": "Prevents text selection and copying", + "bullet2": "Makes watermarks harder to remove", + "bullet3": "Results in larger file sizes", + "bullet4": "Best for sensitive or copyrighted content" + }, + "security": { + "title": "Security Considerations", + "text": "Image-based PDFs provide additional protection against unauthorized editing and content extraction." + } + } + }, + "type": { + "1": "Text", + "2": "Image" + }, + "tags": "Text,repeating,label,own,copyright,trademark,img,jpg,picture,photo", + "header": "Add Watermark" + }, "permissions": { "tags": "read,write,edit,print", "title": "Change Permissions", @@ -974,12 +1770,48 @@ "comma": "Comma: , or | — combine selections (e.g., 1-10, 20)", "not": "NOT: ! or \"not\" — exclude pages (e.g., 3n & not 30)" }, - "examples": { "title": "Examples" } + "examples": { + "title": "Examples" + }, + "complex": { + "bullet1": "1,3-5,8,2n → pages 1, 3–5, 8, plus evens", + "bullet2": "10-,2n-1 → from page 10 to end + odd pages", + "description": "Mix different types.", + "title": "Complex Combinations" + }, + "description": "Choose which pages to use for the operation. Supports single pages, ranges, formulas, and the all keyword.", + "individual": { + "bullet1": "1,3,5 → selects pages 1, 3, 5", + "bullet2": "2,7,12 → selects pages 2, 7, 12", + "description": "Enter numbers separated by commas.", + "title": "Individual Pages" + }, + "mathematical": { + "bullet1": "2n → all even pages (2, 4, 6â€Ļ)", + "bullet2": "2n-1 → all odd pages (1, 3, 5â€Ļ)", + "bullet3": "3n → every 3rd page (3, 6, 9â€Ļ)", + "bullet4": "4n-1 → pages 3, 7, 11, 15â€Ļ", + "description": "Use n in formulas for patterns.", + "title": "Mathematical Functions" + }, + "ranges": { + "bullet1": "3-6 → selects pages 3–6", + "bullet2": "10-15 → selects pages 10–15", + "bullet3": "5- → selects pages 5 to end", + "description": "Use - for consecutive pages.", + "title": "Page Ranges" + }, + "special": { + "bullet1": "all → selects all pages", + "title": "Special Keywords" + } } }, "bulkSelection": { "syntaxError": "There is a syntax issue. See Page Selection tips for help.", - "header": { "title": "Page Selection Guide" }, + "header": { + "title": "Page Selection Guide" + }, "syntax": { "title": "Syntax Basics", "text": "Use numbers, ranges, keywords, and progressions (n starts at 0). Parentheses are supported.", @@ -1049,9 +1881,128 @@ } }, "changeMetadata": { - "tags": "Title,author,date,creation,time,publisher,producer,stats", - "title": "Title:", "header": "Change Metadata", + "submit": "Change", + "filenamePrefix": "metadata", + "settings": { + "title": "Metadata Settings" + }, + "standardFields": { + "title": "Standard Fields" + }, + "deleteAll": { + "label": "Remove Existing Metadata", + "checkbox": "Delete all metadata" + }, + "title": { + "label": "Title", + "placeholder": "Document title" + }, + "author": { + "label": "Author", + "placeholder": "Document author" + }, + "subject": { + "label": "Subject", + "placeholder": "Document subject" + }, + "keywords": { + "label": "Keywords", + "placeholder": "Document keywords" + }, + "creator": { + "label": "Creator", + "placeholder": "Document creator" + }, + "producer": { + "label": "Producer", + "placeholder": "Document producer" + }, + "dates": { + "title": "Date Fields" + }, + "creationDate": { + "label": "Creation Date", + "placeholder": "Creation date" + }, + "modificationDate": { + "label": "Modification Date", + "placeholder": "Modification date" + }, + "trapped": { + "label": "Trapped Status", + "unknown": "Unknown", + "true": "True", + "false": "False" + }, + "advanced": { + "title": "Advanced Options" + }, + "customFields": { + "title": "Custom Metadata", + "description": "Add custom metadata fields to the document", + "add": "Add Field", + "key": "Key", + "keyPlaceholder": "Custom key", + "value": "Value", + "valuePlaceholder": "Custom value", + "remove": "Remove" + }, + "results": { + "title": "Updated PDFs" + }, + "error": { + "failed": "An error occurred while changing the PDF metadata." + }, + "tooltip": { + "header": { + "title": "PDF Metadata Overview" + }, + "standardFields": { + "title": "Standard Fields", + "text": "Common PDF metadata fields that describe the document.", + "bullet1": "Title: Document name or heading", + "bullet2": "Author: Person who created the document", + "bullet3": "Subject: Brief description of content", + "bullet4": "Keywords: Search terms for the document", + "bullet5": "Creator/Producer: Software used to create the PDF" + }, + "dates": { + "title": "Date Fields", + "text": "When the document was created and modified.", + "bullet1": "Creation Date: When original document was made", + "bullet2": "Modification Date: When last changed" + }, + "options": { + "title": "Additional Options", + "text": "Custom fields and privacy controls.", + "bullet1": "Custom Metadata: Add your own key-value pairs", + "bullet2": "Trapped Status: High-quality printing setting", + "bullet3": "Delete All: Remove all metadata for privacy" + }, + "deleteAll": { + "title": "Remove Existing Metadata", + "text": "Complete metadata deletion to ensure privacy." + }, + "customFields": { + "title": "Custom Metadata", + "text": "Add your own custom key-value metadata pairs.", + "bullet1": "Add any custom fields relevant to your document", + "bullet2": "Examples: Department, Project, Version, Status", + "bullet3": "Both key and value are required for each entry" + }, + "advanced": { + "title": "Advanced Options", + "trapped": { + "title": "Trapped Status", + "description": "Indicates if document is prepared for high-quality printing.", + "bullet1": "True: Document has been trapped for printing", + "bullet2": "False: Document has not been trapped", + "bullet3": "Unknown: Trapped status is not specified" + } + } + }, + "tags": "Title,author,date,creation,time,publisher,producer,stats", "selectText": { "1": "Please edit the variables you wish to change", "2": "Delete all metadata", @@ -1059,15 +2010,7 @@ "4": "Other Metadata:", "5": "Add Custom Metadata Entry" }, - "author": "Author:", - "creationDate": "Creation Date (yyyy/MM/dd HH:mm:ss):", - "creator": "Creator:", - "keywords": "Keywords:", - "modDate": "Modification Date (yyyy/MM/dd HH:mm:ss):", - "producer": "Producer:", - "subject": "Subject:", - "trapped": "Trapped:", - "submit": "Change" + "modDate": "Modification Date (yyyy/MM/dd HH:mm:ss):" }, "fileToPDF": { "tags": "transformation,format,document,picture,slide,text,conversion,office,docs,word,excel,powerpoint", @@ -1099,7 +2042,91 @@ }, "help": "Please read this documentation on how to use this for other languages and/or use not in docker", "credit": "This service uses qpdf and Tesseract for OCR.", - "submit": "Process PDF with OCR" + "submit": "Process PDF with OCR", + "operation": { + "submit": "Process OCR and Review" + }, + "results": { + "title": "OCR Results" + }, + "languagePicker": { + "additionalLanguages": "Looking for additional languages?", + "viewSetupGuide": "View setup guide →" + }, + "settings": { + "title": "Settings", + "ocrMode": { + "label": "OCR Mode", + "auto": "Auto (skip text layers)", + "force": "Force (re-OCR all, replace text)", + "strict": "Strict (abort if text found)" + }, + "languages": { + "label": "Languages", + "placeholder": "Select languages" + }, + "compatibilityMode": { + "label": "Compatibility Mode" + }, + "advancedOptions": { + "label": "Processing Options", + "sidecar": "Create a text file", + "deskew": "Deskew pages", + "clean": "Clean input file", + "cleanFinal": "Clean final output" + } + }, + "tooltip": { + "header": { + "title": "OCR Settings Overview" + }, + "mode": { + "title": "OCR Mode", + "text": "Optical Character Recognition (OCR) helps you turn scanned or screenshotted pages into text you can search, copy, or highlight.", + "bullet1": "Auto skips pages that already contain text layers.", + "bullet2": "Force re-OCRs every page and replaces all the text.", + "bullet3": "Strict halts if any selectable text is found." + }, + "languages": { + "title": "Languages", + "text": "Improve OCR accuracy by specifying the expected languages. Choose one or more languages to guide detection." + }, + "output": { + "title": "Output", + "text": "Decide how you want the text output formatted:", + "bullet1": "Searchable PDF embeds text behind the original image.", + "bullet2": "HOCR XML returns a structured machine-readable file.", + "bullet3": "Plain-text sidecar creates a separate .txt file with raw content." + }, + "advanced": { + "header": { + "title": "Advanced OCR Processing" + }, + "compatibility": { + "title": "Compatibility Mode", + "text": "Uses OCR 'sandwich PDF' mode: results in larger files, but more reliable with certain languages and older PDF software. By default we use hOCR for smaller, modern PDFs." + }, + "sidecar": { + "title": "Create Text File", + "text": "Generates a separate .txt file alongside the PDF containing all extracted text content for easy access and processing." + }, + "deskew": { + "title": "Deskew Pages", + "text": "Automatically corrects skewed or tilted pages to improve OCR accuracy. Useful for scanned documents that weren't perfectly aligned." + }, + "clean": { + "title": "Clean Input File", + "text": "Preprocesses the input by removing noise, enhancing contrast, and optimising the image for better OCR recognition before processing." + }, + "cleanFinal": { + "title": "Clean Final Output", + "text": "Post-processes the final PDF by removing OCR artefacts and optimising the text layer for better readability and smaller file size." + } + } + }, + "error": { + "failed": "OCR operation failed" + } }, "extractImages": { "tags": "picture,photo,save,archive,zip,capture,grab", @@ -1185,16 +2212,53 @@ }, "info": "Python is not installed. It is required to run." }, + "scannerImageSplit": { + "title": "Extracted Images", + "submit": "Extract Image Scans", + "error": { + "failed": "An error occurred while extracting image scans." + }, + "tooltip": { + "title": "Photo Splitter", + "whatThisDoes": "What this does", + "whatThisDoesDesc": "Automatically finds and extracts each photo from a scanned page or composite image—no manual cropping.", + "whenToUse": "When to use", + "useCase1": "Scan whole album pages in one go", + "useCase2": "Split flatbed batches into separate files", + "useCase3": "Break collages into individual photos", + "useCase4": "Pull photos from documents", + "quickFixes": "Quick fixes", + "problem1": "Photos not detected → increase Tolerance to 30-50", + "problem2": "Too many false detections → increase Minimum Area to 15,000-20,000", + "problem3": "Crops are too tight → increase Border Size to 5-10", + "problem4": "Tilted photos not straightened → lower Angle Threshold to ~5°", + "problem5": "Dust/noise boxes → increase Minimum Contour Area to 1000-2000", + "setupTips": "Setup tips", + "tip1": "Use a plain, light background", + "tip2": "Leave a small gap (≈1 cm) between photos", + "tip3": "Scan at 300-600 DPI", + "tip4": "Clean the scanner glass", + "headsUp": "Heads-up", + "headsUpDesc": "Overlapping photos or backgrounds very close in colour to the photos can reduce accuracy-try a lighter or darker background and leave more space." + } + }, "sign": { "title": "Sign", "header": "Sign PDFs", "upload": "Upload Image", - "draw": "Draw Signature", - "text": "Text Input", + "draw": { + "title": "Draw your signature", + "clear": "Clear" + }, + "text": { + "name": "Signer Name", + "placeholder": "Enter your full name" + }, "clear": "Clear", "add": "Add", "saved": "Saved Signatures", "save": "Save Signature", + "applySignatures": "Apply Signatures", "personalSigs": "Personal Signatures", "sharedSigs": "Shared Signatures", "noSavedSigs": "No saved signatures found", @@ -1206,14 +2270,92 @@ "previous": "Previous page", "maintainRatio": "Toggle maintain aspect ratio", "undo": "Undo", - "redo": "Redo" + "redo": "Redo", + "submit": "Sign Document", + "steps": { + "configure": "Configure Signature" + }, + "type": { + "title": "Signature Type", + "draw": "Draw", + "canvas": "Canvas", + "image": "Image", + "text": "Text" + }, + "image": { + "label": "Upload signature image", + "placeholder": "Select image file", + "hint": "Upload a PNG or JPG image of your signature" + }, + "instructions": { + "title": "How to add signature", + "canvas": "After drawing your signature in the canvas, close the modal then click anywhere on the PDF to place it.", + "image": "After uploading your signature image above, click anywhere on the PDF to place it.", + "text": "After entering your name above, click anywhere on the PDF to place your signature." + }, + "mode": { + "move": "Move Signature", + "place": "Place Signature" + }, + "updateAndPlace": "Update and Place", + "activate": "Activate Signature Placement", + "deactivate": "Stop Placing Signatures", + "results": { + "title": "Signature Results" + }, + "error": { + "failed": "An error occurred while signing the PDF." + } }, "flatten": { - "tags": "static,deactivate,non-interactive,streamline", "title": "Flatten", "header": "Flatten PDFs", "flattenOnlyForms": "Flatten only forms", - "submit": "Flatten" + "submit": "Flatten", + "filenamePrefix": "flattened", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "steps": { + "settings": "Settings" + }, + "options": { + "stepTitle": "Flatten Options", + "title": "Flatten Options", + "flattenOnlyForms": { + "label": "Flatten only forms", + "desc": "Only flatten form fields, leaving other interactive elements intact" + }, + "note": "Flattening removes interactive elements from the PDF, making them non-editable." + }, + "results": { + "title": "Flatten Results" + }, + "error": { + "failed": "An error occurred while flattening the PDF." + }, + "tooltip": { + "header": { + "title": "About Flattening PDFs" + }, + "description": { + "title": "What does flattening do?", + "text": "Flattening makes your PDF non-editable by turning fillable forms and buttons into regular text and images. The PDF will look exactly the same, but no one can change or fill in the forms anymore. Perfect for sharing completed forms, creating final documents for records, or ensuring the PDF looks the same everywhere.", + "bullet1": "Text boxes become regular text (can't be edited)", + "bullet2": "Checkboxes and buttons become pictures", + "bullet3": "Great for final versions you don't want changed", + "bullet4": "Ensures consistent appearance across all devices" + }, + "formsOnly": { + "title": "What does 'Flatten only forms' mean?", + "text": "This option only removes the ability to fill in forms, but keeps other features working like clicking links, viewing bookmarks, and reading comments.", + "bullet1": "Forms become non-editable", + "bullet2": "Links still work when clicked", + "bullet3": "Comments and notes remain visible", + "bullet4": "Bookmarks still help you navigate" + } + }, + "tags": "static,deactivate,non-interactive,streamline" }, "repair": { "tags": "fix,restore,correction,recover", @@ -1233,7 +2375,6 @@ } }, "removeBlanks": { - "tags": "cleanup,streamline,non-content,organize", "title": "Remove Blanks", "header": "Remove Blank Pages", "settings": { @@ -1275,7 +2416,14 @@ "bullet3": "Can be disabled to reduce output file size" } }, - "submit": "Remove blank pages" + "submit": "Remove blank pages", + "error": { + "failed": "Failed to remove blank pages" + }, + "results": { + "title": "Removed Blank Pages" + }, + "tags": "cleanup,streamline,non-content,organize" }, "removeAnnotations": { "tags": "comments,highlight,notes,markup,remove", @@ -1297,15 +2445,99 @@ "tags": "differentiate,contrast,changes,analysis", "title": "Compare", "header": "Compare PDFs", - "highlightColor": { - "1": "Highlight Color 1:", - "2": "Highlight Color 2:" + "clearSelected": "Clear selected", + "clear": { + "confirmTitle": "Clear selected PDFs?", + "confirmBody": "This will close the current comparison and take you back to Active Files.", + "confirm": "Clear and return" }, - "document": { - "1": "Document 1", - "2": "Document 2" + "review": { + "title": "Comparison Result", + "actionsHint": "Review the comparison, switch document roles, or export the summary.", + "switchOrder": "Switch order", + "exportSummary": "Export summary" }, - "submit": "Compare", + "base": { + "label": "Original document", + "placeholder": "Select the original PDF" + }, + "comparison": { + "label": "Edited document", + "placeholder": "Select the edited PDF" + }, + "addFilesHint": "Add PDFs in the Files step to enable selection.", + "noFiles": "No PDFs available yet", + "pages": "Pages", + "selection": { + "originalEditedTitle": "Select Original and Edited PDFs" + }, + "original": { "label": "Original PDF" }, + "edited": { "label": "Edited PDF" }, + "swap": { + "confirmTitle": "Re-run comparison?", + "confirmBody": "This will rerun the tool. Are you sure you want to swap the order of Original and Edited?", + "confirm": "Swap and Re-run" + }, + "cta": "Compare", + "loading": "Comparing...", + + "summary": { + "baseHeading": "Original document", + "comparisonHeading": "Edited document", + "pageLabel": "Page" + }, + "rendering": { + "pageNotReadyTitle": "Page not rendered yet", + "pageNotReadyBody": "Some pages are still rendering. Navigation will snap once they are ready.", + "rendering": "rendering", + "inProgress": "At least one of these PDFs are very large, scrolling won't be smooth until the rendering is complete", + "pagesRendered": "pages rendered", + "complete": "Page rendering complete" + }, + "dropdown": { + "deletionsLabel": "Deletions", + "additionsLabel": "Additions", + "deletions": "Deletions ({{count}})", + "additions": "Additions ({{count}})", + "searchPlaceholder": "Search changes...", + "noResults": "No changes found" + }, + "actions": { + "stackVertically": "Stack vertically", + "placeSideBySide": "Place side by side", + "zoomOut": "Zoom out", + "zoomIn": "Zoom in", + "resetView": "Reset view", + "unlinkScrollPan": "Unlink scroll and pan", + "linkScrollPan": "Link scroll and pan", + "unlinkScroll": "Unlink scroll", + "linkScroll": "Link scroll" + }, + "toasts": { + "unlinkedTitle": "Independent scroll & pan enabled", + "unlinkedBody": "Tip: Arrow Up/Down scroll both panes; panning only moves the active pane." + }, + "error": { + "selectRequired": "Select a original and edited document.", + "filesMissing": "Unable to locate the selected files. Please re-select them.", + "generic": "Unable to compare these files." + }, + "status": { + "extracting": "Extracting text...", + "processing": "Analysing differences...", + "complete": "Comparison ready" + }, + "longJob": { + "title": "Large comparison in progress", + "body": "These PDFs together exceed 2,000 pages. Processing can take several minutes." + }, + "slowOperation": { + "title": "Still workingâ€Ļ", + "body": "This comparison is taking longer than usual. You can let it continue or cancel it.", + "cancel": "Cancel comparison" + }, + + "newLine": "new-line", "complex": { "message": "One or both of the provided documents are large files, accuracy of comparison may be reduced" }, @@ -1318,11 +2550,157 @@ "text": { "message": "One or both of the selected PDFs have no text content. Please choose PDFs with text for comparison." } + }, + "too": { + "dissimilar": { + "message": "These documents appear highly dissimilar. Comparison was stopped to save time." + } + }, + "earlyDissimilarity": { + "title": "These PDFs look highly different", + "body": "We're seeing very few similarities so far. You can stop the comparison if these aren't related documents.", + "stopButton": "Stop comparison" } }, "certSign": { "tags": "authenticate,PEM,P12,official,encrypt", "title": "Certificate Signing", + "filenamePrefix": "signed", + "signMode": { + "stepTitle": "Sign Mode", + "tooltip": { + "header": { + "title": "About PDF Signatures" + }, + "overview": { + "title": "How signatures work", + "text": "Both modes seal the document (any edits are flagged as tampering) and record who/when/how for auditing. Viewer trust depends on the certificate chain." + }, + "manual": { + "title": "Manual - Bring your certificate", + "text": "Use your own certificate files for brand-aligned identity. Can display Trusted when your CA/chain is recognised.", + "use": "Use for: customer-facing, legal, compliance." + }, + "auto": { + "title": "Auto - Zero-setup, instant system seal", + "text": "Signs with a server self-signed certificate. Same tamper-evident seal and audit trail; typically shows Unverified in viewers.", + "use": "Use when: you need speed and consistent internal identity across reviews and records." + }, + "rule": { + "title": "Rule of thumb", + "text": "Need recipient Trusted status? Manual. Need a fast, tamper-evident seal and audit trail with no setup? Auto." + } + } + }, + "certTypeStep": { + "stepTitle": "Certificate Format" + }, + "certFiles": { + "stepTitle": "Certificate Files" + }, + "appearance": { + "stepTitle": "Signature Appearance", + "tooltip": { + "header": { + "title": "About Signature Appearance" + }, + "invisible": { + "title": "Invisible Signatures", + "text": "The signature is added to the PDF for security but won't be visible when viewing the document. Perfect for legal requirements without changing the document's appearance.", + "bullet1": "Provides security without visual changes", + "bullet2": "Meets legal requirements for digital signing", + "bullet3": "Doesn't affect document layout or design" + }, + "visible": { + "title": "Visible Signatures", + "text": "Shows a signature block on the PDF with your name, date, and optional details. Useful when you want readers to clearly see the document is signed.", + "bullet1": "Shows signer name and date on the document", + "bullet2": "Can include reason and location for signing", + "bullet3": "Choose which page to place the signature", + "bullet4": "Optional logo can be included" + } + }, + "invisible": "Invisible", + "options": { + "title": "Signature Details" + }, + "visible": "Visible" + }, + "sign": { + "submit": "Sign PDF", + "results": "Signed PDF" + }, + "error": { + "failed": "An error occurred whilst processing signatures." + }, + "tooltip": { + "header": { + "title": "About Managing Signatures" + }, + "overview": { + "title": "What can this tool do?", + "text": "This tool lets you check if your PDFs are digitally signed and add new digital signatures. Digital signatures prove who created or approved a document and show if it has been changed since signing.", + "bullet1": "Check existing signatures and their validity", + "bullet2": "View detailed information about signers and certificates", + "bullet3": "Add new digital signatures to secure your documents", + "bullet4": "Multiple files supported with easy navigation" + }, + "validation": { + "title": "Checking Signatures", + "text": "When you check signatures, the tool tells you if they're valid, who signed the document, when it was signed, and whether the document has been changed since signing.", + "bullet1": "Shows if signatures are valid or invalid", + "bullet2": "Displays signer information and signing date", + "bullet3": "Checks if the document was modified after signing", + "bullet4": "Can use custom certificates for verification" + }, + "signing": { + "title": "Adding Signatures", + "text": "To sign a PDF, you need a digital certificate (like PEM, PKCS12, or JKS). You can choose to make the signature visible on the document or keep it invisible for security only.", + "bullet1": "Supports PEM, PKCS12, JKS, and server certificate formats", + "bullet2": "Option to show or hide signature on the PDF", + "bullet3": "Add reason, location, and signer name", + "bullet4": "Choose which page to place visible signatures", + "bullet5": "Use server certificate for simple 'Sign with Stirling-PDF' option" + } + }, + "certType": { + "tooltip": { + "header": { + "title": "About Certificate Types" + }, + "what": { + "title": "What's a certificate?", + "text": "It's a secure ID for your signature that proves you signed. Unless you're required to sign via certificate, we recommend using another secure method like Type, Draw, or Upload." + }, + "which": { + "title": "Which option should I use?", + "text": "Choose the format that matches your certificate file:", + "bullet1": "PKCS#12 (.p12 / .pfx) – one combined file (most common)", + "bullet2": "PFX (.pfx) – Microsoft's version of PKCS12", + "bullet3": "PEM – separate private-key and certificate .pem files", + "bullet4": "JKS – Java .jks keystore for dev / CI-CD workflows" + }, + "convert": { + "title": "Key not listed?", + "text": "Convert your file to a Java keystore (.jks) with keytool, then pick JKS." + } + } + }, + "chooseCertificate": "Choose Certificate File", + "chooseJksFile": "Choose JKS File", + "chooseP12File": "Choose PKCS12 File", + "choosePfxFile": "Choose PFX File", + "choosePrivateKey": "Choose Private Key File", + "location": "Location", + "logoTitle": "Logo", + "name": "Name", + "noLogo": "No Logo", + "pageNumber": "Page Number", + "password": "Enter Your Keystore or Private Key Password (If Any):", + "passwordOptional": "Leave empty if no password", + "reason": "Reason", + "serverCertMessage": "Using server certificate - no files or password required", + "showLogo": "Show Logo", "header": "Sign a PDF with your certificate (Work in progress)", "selectPDF": "Select a PDF File for Signing:", "jksNote": "Note: If your certificate type is not listed below, please convert it to a Java Keystore (.jks) file using the keytool command line tool. Then, choose the .jks file option below.", @@ -1330,13 +2708,7 @@ "selectCert": "Select Your Certificate File (X.509 format, could be .pem or .der):", "selectP12": "Select Your PKCS#12 Keystore File (.p12 or .pfx) (Optional, If provided, it should contain your private key and certificate):", "selectJKS": "Select Your Java Keystore File (.jks or .keystore):", - "certType": "Certificate Type", - "password": "Enter Your Keystore or Private Key Password (If Any):", "showSig": "Show Signature", - "reason": "Reason", - "location": "Location", - "name": "Name", - "showLogo": "Show Logo", "submit": "Sign PDF" }, "removeCertSign": { @@ -1363,27 +2735,158 @@ "header": "Multi Page Layout", "pagesPerSheet": "Pages per sheet:", "addBorder": "Add Borders", - "submit": "Submit" + "submit": "Submit", + "desc": { + "2": "Place 2 pages side-by-side on a single sheet.", + "3": "Place 3 pages on a single sheet in a single row.", + "4": "Place 4 pages on a single sheet (2 × 2 grid).", + "9": "Place 9 pages on a single sheet (3 × 3 grid).", + "16": "Place 16 pages on a single sheet (4 × 4 grid)." + }, + "error": { + "failed": "An error occurred while creating the multi-page layout." + } }, "bookletImposition": { "tags": "booklet,imposition,printing,binding,folding,signature", "title": "Booklet Imposition", "header": "Booklet Imposition", "submit": "Create Booklet", - "files": { + "spineLocation": { + "label": "Spine Location", + "left": "Left (Standard)", + "right": "Right (RTL)" + }, + "doubleSided": { + "label": "Double-sided printing", + "tooltip": "Creates both front and back sides for proper booklet printing" + }, + "manualDuplex": { + "title": "Manual Duplex Mode", + "instructions": "For printers without automatic duplex. You'll need to run this twice:" + }, + "duplexPass": { + "label": "Print Pass", + "first": "1st Pass", + "second": "2nd Pass", + "firstInstructions": "Prints front sides → stack face-down → run again with 2nd Pass", + "secondInstructions": "Load printed stack face-down → prints back sides" + }, + "rtlBinding": { + "label": "Right-to-left binding", + "tooltip": "For Arabic, Hebrew, or other right-to-left languages" + }, + "addBorder": { + "label": "Add borders around pages", + "tooltip": "Adds borders around each page section to help with cutting and alignment" + }, + "addGutter": { + "label": "Add gutter margin", + "tooltip": "Adds inner margin space for binding" + }, + "gutterSize": { + "label": "Gutter size (points)" + }, + "flipOnShortEdge": { + "label": "Flip on short edge (automatic duplex only)", + "tooltip": "Enable for short-edge duplex printing (automatic duplex only - ignored in manual mode)", + "manualNote": "Not needed in manual mode - you flip the stack yourself" + }, + "advanced": { + "toggle": "Advanced Options" + }, + "paperSizeNote": "Paper size is automatically derived from your first page.", + "tooltip": { + "header": { + "title": "Booklet Creation Guide" + }, + "description": { + "title": "What is Booklet Imposition?", + "text": "Creates professional booklets by arranging pages in the correct printing order. Your PDF pages are placed 2-up on landscape sheets so when folded and bound, they read in proper sequence like a real book." + }, + "example": { + "title": "Example: 8-Page Booklet", + "text": "Your 8-page document becomes 2 sheets:", + "bullet1": "Sheet 1 Front: Pages 8, 1 | Back: Pages 2, 7", + "bullet2": "Sheet 2 Front: Pages 6, 3 | Back: Pages 4, 5", + "bullet3": "When folded & stacked: Reads 1→2→3→4→5→6→7→8" + }, + "printing": { + "title": "How to Print & Assemble", + "text": "Follow these steps for perfect booklets:", + "bullet1": "Print double-sided with 'Flip on long edge'", + "bullet2": "Stack sheets in order, fold in half", + "bullet3": "Staple or bind along the folded spine", + "bullet4": "For short-edge printers: Enable 'Flip on short edge' option" + }, + "manualDuplex": { + "title": "Manual Duplex (Single-sided Printers)", + "text": "For printers without automatic duplex:", + "bullet1": "Turn OFF 'Double-sided printing'", + "bullet2": "Select '1st Pass' → Print → Stack face-down", + "bullet3": "Select '2nd Pass' → Load stack → Print backs", + "bullet4": "Fold and assemble as normal" + }, + "advanced": { + "title": "Advanced Options", + "text": "Fine-tune your booklet:", + "bullet1": "Right-to-Left Binding: For Arabic, Hebrew, or RTL languages", + "bullet2": "Borders: Shows cut lines for trimming", + "bullet3": "Gutter Margin: Adds space for binding/stapling", + "bullet4": "Short-edge Flip: Only for automatic duplex printers" + } }, "error": { "failed": "An error occurred while creating the booklet imposition." - } + }, + "files": {} }, "scalePages": { - "tags": "resize,modify,dimension,adapt", "title": "Adjust page-scale", "header": "Adjust page-scale", "pageSize": "Size of a page of the document.", "keepPageSize": "Original Size", "scaleFactor": "Zoom level (crop) of a page.", - "submit": "Submit" + "submit": "Submit", + "tags": "resize,modify,dimension,adapt" + }, + "adjustPageScale": { + "tags": "resize,modify,dimension,adapt", + "title": "Adjust Page Scale", + "header": "Adjust Page Scale", + "scaleFactor": { + "label": "Scale Factor" + }, + "pageSize": { + "label": "Target Page Size", + "keep": "Keep Original Size", + "letter": "Letter", + "legal": "Legal" + }, + "submit": "Adjust Page Scale", + "error": { + "failed": "An error occurred while adjusting the page scale." + }, + "tooltip": { + "header": { + "title": "Page Scale Settings Overview" + }, + "description": { + "title": "Description", + "text": "Adjust the size of PDF content and change the page dimensions." + }, + "scaleFactor": { + "title": "Scale Factor", + "text": "Controls how large or small the content appears on the page. Content is scaled and centred - if scaled content is larger than the page size, it may be cropped.", + "bullet1": "1.0 = Original size", + "bullet2": "0.5 = Half size (50% smaller)", + "bullet3": "2.0 = Double size (200% larger, may crop)" + }, + "pageSize": { + "title": "Target Page Size", + "text": "Sets the dimensions of the output PDF pages. 'Keep Original Size' maintains current dimensions, whilst other options resize to standard paper sizes." + } + } }, "add-page-numbers": { "tags": "paginate,label,organize,index" @@ -1392,6 +2895,7 @@ "tags": "auto-detect,header-based,organize,relabel", "title": "Auto Rename", "header": "Auto Rename PDF", + "description": "Automatically finds the title from your PDF content and uses it as the filename.", "submit": "Auto Rename", "files": { "placeholder": "Select a PDF file in the main view to get started" @@ -1419,10 +2923,55 @@ "tags": "color-correction,tune,modify,enhance" }, "crop": { - "tags": "trim,shrink,edit,shape", "title": "Crop", "header": "Crop PDF", - "submit": "Submit" + "submit": "Submit", + "noFileSelected": "Select a PDF file to begin cropping", + "preview": { + "title": "Crop Area Selection" + }, + "reset": "Reset to full PDF", + "coordinates": { + "title": "Position and Size", + "x": { + "label": "X Position", + "desc": "Left edge (points)" + }, + "y": { + "label": "Y Position", + "desc": "Bottom edge (points)" + }, + "width": { + "label": "Width", + "desc": "Crop width (points)" + }, + "height": { + "label": "Height", + "desc": "Crop height (points)" + } + }, + "error": { + "invalidArea": "Crop area extends beyond PDF boundaries", + "failed": "Failed to crop PDF" + }, + "steps": { + "selectArea": "Select Crop Area" + }, + "tooltip": { + "title": "How to Crop PDFs", + "description": "Select the area to crop from your PDF by dragging and resizing the blue overlay on the thumbnail.", + "drag": "Drag the overlay to move the crop area", + "resize": "Drag the corner and edge handles to resize", + "precision": "Use coordinate inputs for precise positioning" + }, + "results": { + "title": "Crop Results" + }, + "automation": { + "info": "Enter crop coordinates in PDF points. Origin (0,0) is at bottom-left. These values will be applied to all PDFs processed in this automation.", + "reference": "Reference: A4 page is 595.28 × 841.89 points (210mm × 297mm). 1 inch = 72 points." + }, + "tags": "trim,shrink,edit,shape" }, "autoSplitPDF": { "tags": "QR-based,separate,scan-segment,organize", @@ -1503,26 +3052,133 @@ "title": "Show Javascript", "header": "Show Javascript", "downloadJS": "Download Javascript", - "submit": "Show" - }, - "autoRedact": { - "tags": "Redact,Hide,black out,black,marker,hidden", - "title": "Auto Redact", - "header": "Auto Redact", - "colorLabel": "Color", - "textsToRedactLabel": "Text to Redact (line-separated)", - "textsToRedactPlaceholder": "e.g. \\nConfidential \\nTop-Secret", - "useRegexLabel": "Use Regex", - "wholeWordSearchLabel": "Whole Word Search", - "customPaddingLabel": "Custom Extra Padding", - "convertPDFToImageLabel": "Convert PDF to PDF-Image (Used to remove text behind the box)", - "submitButton": "Submit" + "submit": "Show", + "results": "Result", + "processing": "Extracting JavaScript...", + "done": "JavaScript extracted", + "singleFileWarning": "This tool only supports one file at a time. Please select a single file.", + "view": { + "title": "Extracted JavaScript" + } }, "redact": { "tags": "Redact,Hide,black out,black,marker,hidden,manual", "title": "Manual Redaction", - "header": "Manual Redaction", "submit": "Redact", + "error": { + "failed": "An error occurred while redacting the PDF." + }, + "modeSelector": { + "title": "Redaction Method", + "mode": "Mode", + "automatic": "Automatic", + "automaticDesc": "Redact text based on search terms", + "manual": "Manual", + "manualDesc": "Click and drag to redact specific areas", + "manualComingSoon": "Manual redaction coming soon" + }, + "auto": { + "header": "Auto Redact", + "settings": { + "title": "Redaction Settings", + "advancedTitle": "Advanced" + }, + "colorLabel": "Box Colour", + "wordsToRedact": { + "title": "Words to Redact", + "placeholder": "Enter a word", + "add": "Add", + "examples": "Examples: Confidential, Top-Secret" + }, + "useRegexLabel": "Use Regex", + "wholeWordSearchLabel": "Whole Word Search", + "customPaddingLabel": "Custom Extra Padding", + "convertPDFToImageLabel": "Convert PDF to PDF-Image" + }, + "tooltip": { + "mode": { + "header": { + "title": "Redaction Method" + }, + "automatic": { + "title": "Automatic Redaction", + "text": "Automatically finds and redacts specified text throughout the document. Perfect for removing consistent sensitive information like names, addresses, or confidential markers." + }, + "manual": { + "title": "Manual Redaction", + "text": "Click and drag to manually select specific areas to redact. Gives you precise control over what gets redacted. (Coming soon)" + } + }, + "words": { + "header": { + "title": "Words to Redact" + }, + "description": { + "title": "Text Matching", + "text": "Enter words or phrases to find and redact in your document. Each word will be searched for separately." + }, + "bullet1": "Add one word at a time", + "bullet2": "Press Enter or click 'Add Another' to add", + "bullet3": "Click × to remove words", + "examples": { + "title": "Common Examples", + "text": "Typical words to redact include: bank details, email addresses, or specific names." + } + }, + "advanced": { + "header": { + "title": "Advanced Redaction Settings" + }, + "color": { + "title": "Box Colour & Padding", + "text": "Customise the appearance of redaction boxes. Black is standard, but you can choose any colour. Padding adds extra space around the found text." + }, + "regex": { + "title": "Use Regex", + "text": "Enable regular expressions for advanced pattern matching. Useful for finding phone numbers, emails, or complex patterns.", + "bullet1": "Example: \\d{4}-\\d{2}-\\d{2} to match any dates in YYYY-MM-DD format", + "bullet2": "Use with caution - test thoroughly" + }, + "wholeWord": { + "title": "Whole Word Search", + "text": "Only match complete words, not partial matches. 'John' won't match 'Johnson' when enabled." + }, + "convert": { + "title": "Convert to PDF-Image", + "text": "Converts the PDF to an image-based PDF after redaction. This ensures text behind redaction boxes is completely removed and unrecoverable." + } + } + }, + "manual": { + "header": "Manual Redaction", + "textBasedRedaction": "Text-based Redaction", + "pageBasedRedaction": "Page-based Redaction", + "convertPDFToImageLabel": "Convert PDF to PDF-Image (Used to remove text behind the box)", + "pageRedactionNumbers": { + "title": "Pages", + "placeholder": "(e.g. 1,2,8 or 4,7,12-16 or 2n-1)" + }, + "redactionColor": { + "title": "Redaction Colour" + }, + "export": "Export", + "upload": "Upload", + "boxRedaction": "Box draw redaction", + "zoom": "Zoom", + "zoomIn": "Zoom in", + "zoomOut": "Zoom out", + "nextPage": "Next Page", + "previousPage": "Previous Page", + "toggleSidebar": "Toggle Sidebar", + "showThumbnails": "Show Thumbnails", + "showDocumentOutline": "Show Document Outline (double-click to expand/collapse all items)", + "showAttachments": "Show Attachments", + "showLayers": "Show Layers (double-click to reset all layers to the default state)", + "colourPicker": "Colour Picker", + "findCurrentOutlineItem": "Find current outline item", + "applyChanges": "Apply Changes" + }, + "header": "Manual Redaction", "textBasedRedaction": "Text based Redaction", "pageBasedRedaction": "Page-based Redaction", "convertPDFToImageLabel": "Convert PDF to PDF-Image (Used to remove text behind the box)", @@ -1562,7 +3218,7 @@ "title": "Overlay PDFs", "desc": "Overlay one PDF on top of another", "baseFile": { - "label": "Select Base PDF File" + "label": "Select Original PDF File" }, "overlayFiles": { "label": "Select Overlay PDF Files", @@ -1578,7 +3234,8 @@ "counts": { "label": "Overlay Counts (for Fixed Repeat Mode)", "placeholder": "Enter comma-separated counts (e.g., 2,3,1)", - "item": "Count for file" + "item": "Count for file", + "noFiles": "Add overlay files to configure counts" }, "position": { "label": "Select Overlay Position", @@ -1619,6 +3276,9 @@ "title": "Counts (Fixed Repeat only)", "text": "Provide a positive number for each overlay file showing how many pages to take before moving to the next. Required when mode is Fixed Repeat." } + }, + "error": { + "failed": "An error occurred while overlaying PDFs." } }, "split-by-sections": { @@ -1654,7 +3314,18 @@ "customMargin": "Custom Margin", "customColor": "Custom Text Color", "submit": "Submit", - "noStampSelected": "No stamp selected. Return to Step 1." + "noStampSelected": "No stamp selected. Return to Step 1.", + "customPosition": "Drag the stamp to the desired location in the preview window.", + "error": { + "failed": "An error occurred while adding stamp to the PDF." + }, + "imageSize": "Image Size", + "margin": "Margin", + "positionAndFormatting": "Position & Formatting", + "quickPosition": "Select a position on the page to place the stamp.", + "results": { + "title": "Stamp Results" + } }, "removeImagePdf": { "tags": "Remove Image,Page operations,Back end,server side" @@ -1672,7 +3343,8 @@ "status": { "_value": "Status", "valid": "Valid", - "invalid": "Invalid" + "invalid": "Invalid", + "complete": "Validation complete" }, "signer": "Signer", "date": "Date", @@ -1699,40 +3371,122 @@ "version": "Version", "keyUsage": "Key Usage", "selfSigned": "Self-Signed", - "bits": "bits" + "bits": "bits", + "details": "Certificate Details" }, "signature": { "info": "Signature Information", "_value": "Signature", "mathValid": "Signature is mathematically valid BUT:" }, - "selectCustomCert": "Custom Certificate File X.509 (Optional)" - }, - "replace-color": { - "title": "Replace-Invert-Color", - "header": "Replace-Invert Color PDF", - "selectText": { - "1": "Replace or Invert color Options", - "2": "Default(Default high contrast colors)", - "3": "Custom(Customized colors)", - "4": "Full-Invert(Invert all colors)", - "5": "High contrast color options", - "6": "white text on black background", - "7": "Black text on white background", - "8": "Yellow text on black background", - "9": "Green text on black background", - "10": "Choose text Color", - "11": "Choose background Color" + "selectCustomCert": "Custom Certificate File X.509 (Optional)", + "downloadCsv": "Download CSV", + "downloadJson": "Download JSON", + "downloadPdf": "Download PDF Report", + "downloadType": { + "csv": "CSV", + "json": "JSON", + "pdf": "PDF" }, - "submit": "Replace" + "error": { + "allFailed": "Unable to validate the selected files.", + "partial": "Some files could not be validated.", + "reportGeneration": "Could not generate the PDF report. JSON and CSV are available.", + "unexpected": "Unexpected error during validation." + }, + "finalizing": "Preparing downloads...", + "issue": { + "certExpired": "Certificate expired", + "certRevocationUnknown": "Certificate revocation status unknown", + "certRevoked": "Certificate revoked", + "chainInvalid": "Certificate chain invalid", + "signatureInvalid": "Signature cryptographic check failed", + "trustInvalid": "Certificate not trusted" + }, + "noResults": "Run the validation to generate a report.", + "noSignaturesShort": "No signatures", + "processing": "Validating signatures...", + "report": { + "continued": "Continued", + "downloads": "Downloads", + "entryLabel": "Signature Summary", + "fields": { + "created": "Created", + "fileSize": "File Size", + "signatureCount": "Total Signatures", + "signatureDate": "Signature Date" + }, + "filesEvaluated": "{{count}} files evaluated", + "footer": "Validated via Stirling PDF", + "generatedAt": "Generated", + "noPdf": "PDF report will be available after a successful validation.", + "page": "Page", + "shortTitle": "Signature Summary", + "signatureCountLabel": "{{count}} signatures", + "signaturesFound": "{{count}} signatures detected", + "signaturesValid": "{{count}} fully valid", + "title": "Signature Validation Report" + }, + "settings": { + "certHint": "Upload a trusted X.509 certificate to validate against a custom trust source.", + "title": "Validation Settings" + }, + "signatureDate": "Signature Date", + "totalSignatures": "Total Signatures" }, - "replaceColorPdf": { - "tags": "Replace Color,Page operations,Back end,server side" + "replaceColor": { + "tags": "Replace Colour,Page operations,Back end,server side", + "labels": { + "settings": "Settings", + "colourOperation": "Colour operation" + }, + "options": { + "highContrast": "High contrast", + "invertAll": "Invert all colours", + "custom": "Custom", + "cmyk": "Convert to CMYK" + }, + "tooltip": { + "header": { + "title": "Replace & Invert Colour Settings Overview" + }, + "description": { + "title": "Description", + "text": "Transform PDF colours to improve readability and accessibility. Choose from high contrast presets, invert all colours, or create custom colour schemes." + }, + "highContrast": { + "title": "High Contrast", + "text": "Apply predefined high contrast colour combinations designed for better readability and accessibility compliance.", + "bullet1": "White text on black background - Classic dark mode", + "bullet2": "Black text on white background - Standard high contrast", + "bullet3": "Yellow text on black background - High visibility option", + "bullet4": "Green text on black background - Alternative high contrast" + }, + "invertAll": { + "title": "Invert All Colours", + "text": "Completely invert all colours in the PDF, creating a negative-like effect. Useful for creating dark mode versions of documents or reducing eye strain in low-light conditions." + }, + "custom": { + "title": "Custom Colours", + "text": "Define your own text and background colours using the colour pickers. Perfect for creating branded documents or specific accessibility requirements.", + "bullet1": "Text colour - Choose the colour for text elements", + "bullet2": "Background colour - Set the background colour for the document" + }, + "cmyk": { + "title": "Convert to CMYK", + "text": "Convert the PDF from RGB colour space to CMYK colour space, optimized for professional printing. This process converts colours to the Cyan, Magenta, Yellow, Black model used by printers." + } + }, + "error": { + "failed": "An error occurred while processing the colour replacement." + } }, "login": { "title": "Sign in", "header": "Sign in", "signin": "Sign in", + "signInWith": "Sign in with", + "signInAnonymously": "Sign Up as a Guest", "rememberme": "Remember me", "invalid": "Invalid username or password.", "locked": "Your account has been locked.", @@ -1751,7 +3505,67 @@ "alreadyLoggedIn": "You are already logged in to", "alreadyLoggedIn2": "devices. Please log out of the devices and try again.", "toManySessions": "You have too many active sessions", - "logoutMessage": "You have been logged out." + "logoutMessage": "You have been logged out.", + "youAreLoggedIn": "You are logged in!", + "email": "Email", + "password": "Password", + "enterEmail": "Enter your email", + "enterPassword": "Enter your password", + "loggingIn": "Logging In...", + "username": "Username", + "enterUsername": "Enter username", + "useEmailInstead": "Login with email", + "forgotPassword": "Forgot your password?", + "logIn": "Log In", + "signingIn": "Signing in...", + "login": "Login", + "or": "Or", + "useMagicLink": "Use magic link instead", + "enterEmailForMagicLink": "Enter your email for magic link", + "sending": "Sendingâ€Ļ", + "sendMagicLink": "Send Magic Link", + "cancel": "Cancel", + "dontHaveAccount": "Don't have an account? Sign up", + "home": "Home", + "debug": "Debug", + "signOut": "Sign Out", + "pleaseEnterBoth": "Please enter both email and password", + "pleaseEnterEmail": "Please enter your email address", + "magicLinkSent": "Magic link sent to {{email}}! Check your email and click the link to sign in.", + "passwordResetSent": "Password reset link sent to {{email}}! Check your email and follow the instructions.", + "failedToSignIn": "Failed to sign in with {{provider}}: {{message}}", + "unexpectedError": "Unexpected error: {{message}}", + "accountCreatedSuccess": "Account created successfully! You can now sign in.", + "passwordChangedSuccess": "Password changed successfully! Please sign in with your new password.", + "credentialsUpdated": "Your credentials have been updated. Please sign in again." + }, + "signup": { + "title": "Create an account", + "subtitle": "Join Stirling PDF to get started", + "name": "Name", + "email": "Email", + "password": "Password", + "confirmPassword": "Confirm password", + "enterName": "Enter your name", + "enterEmail": "Enter your email", + "enterPassword": "Enter your password", + "confirmPasswordPlaceholder": "Confirm password", + "or": "or", + "creatingAccount": "Creating Account...", + "signUp": "Sign Up", + "alreadyHaveAccount": "Already have an account? Sign in", + "pleaseFillAllFields": "Please fill in all fields", + "passwordsDoNotMatch": "Passwords do not match", + "passwordTooShort": "Password must be at least 6 characters long", + "invalidEmail": "Please enter a valid email address", + "checkEmailConfirmation": "Check your email for a confirmation link to complete your registration.", + "accountCreatedSuccessfully": "Account created successfully! You can now sign in.", + "unexpectedError": "Unexpected error: {{message}}", + "useEmailInstead": "Use Email Instead", + "nameRequired": "Name is required", + "emailRequired": "Email is required", + "passwordRequired": "Password is required", + "confirmPasswordRequired": "Please confirm your password" }, "pdfToSinglePage": { "title": "PDF To Single Page", @@ -1795,15 +3609,55 @@ "contrast": "Contrast:", "brightness": "Brightness:", "saturation": "Saturation:", - "download": "Download" + "download": "Download", + "adjustColors": "Adjust Colors", + "blue": "Blue", + "confirm": "Confirm", + "error": { + "failed": "Failed to adjust colors/contrast" + }, + "green": "Green", + "noPreview": "Select a PDF to preview", + "red": "Red", + "results": { + "title": "Adjusted PDF" + } }, "compress": { "title": "Compress", + "desc": "Compress PDFs to reduce their file size.", "header": "Compress PDF", + "method": { + "title": "Compression Method", + "quality": "Quality", + "filesize": "File Size" + }, "credit": "This service uses qpdf for PDF Compress/Optimisation.", "grayscale": { "label": "Apply Grayscale for Compression" }, + "tooltip": { + "header": { + "title": "Compress Settings Overview" + }, + "description": { + "title": "Description", + "text": "Compression is an easy way to reduce your file size. Pick File Size to enter a target size and have us adjust quality for you. Pick Quality to set compression strength manually." + }, + "qualityAdjustment": { + "title": "Quality Adjustment", + "text": "Drag the slider to adjust the compression strength. Lower values (1-3) preserve quality but result in larger files. Higher values (7-9) shrink the file more but reduce image clarity.", + "bullet1": "Lower values preserve quality", + "bullet2": "Higher values reduce file size" + }, + "grayscale": { + "title": "Grayscale", + "text": "Select this option to convert all images to black and white, which can significantly reduce file size especially for scanned PDFs or image-heavy documents." + } + }, + "error": { + "failed": "An error occurred while compressing the PDF." + }, "selectText": { "1": { "_value": "Compression Settings", @@ -1915,11 +3769,11 @@ "header": "Remove Images", "removeImage": "Remove Images", "submit": "Remove Images", - "results": { - "title": "Remove Images Results" - }, "error": { "failed": "Failed to remove images from the PDF." + }, + "results": { + "title": "Remove Images Results" } }, "splitByChapters": { @@ -1995,83 +3849,857 @@ "title": "Analytics", "description": "These cookies help us understand how our tools are being used, so we can focus on building the features our community values most. Rest assured—Stirling PDF cannot and will never track the content of the documents you work with." } + }, + "services": { + "posthog": "PostHog Analytics", + "scarf": "Scarf Pixel" } }, - "convert": { + "removeMetadata": { + "submit": "Remove Metadata" + }, + "sidebar": { + "toggle": "Toggle Sidebar" + }, + "theme": { + "toggle": "Toggle Theme" + }, + "view": { + "viewer": "Viewer", + "pageEditor": "Page Editor", + "fileManager": "File Manager" + }, + "pageEditor": { + "title": "Page Editor", + "save": "Save Changes", + "noPdfLoaded": "No PDF loaded. Please upload a PDF to edit.", + "rotatedLeft": "Rotated left:", + "rotatedRight": "Rotated right:", + "deleted": "Deleted:", + "movedLeft": "Moved left:", + "movedRight": "Moved right:", + "splitAt": "Split at:", + "insertedPageBreak": "Inserted page break at:", + "addFileNotImplemented": "Add file not implemented in demo", + "closePdf": "Close PDF", + "reset": "Reset Changes", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "fitToWidth": "Fit to Width", + "actualSize": "Actual Size" + }, + "viewer": { + "firstPage": "First Page", + "lastPage": "Last Page", + "previousPage": "Previous Page", + "nextPage": "Next Page", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "singlePageView": "Single Page View", + "dualPageView": "Dual Page View" + }, + "rightRail": { + "closeSelected": "Close Selected Files", + "selectAll": "Select All", + "deselectAll": "Deselect All", + "selectByNumber": "Select by Page Numbers", + "deleteSelected": "Delete Selected Pages", + "closePdf": "Close PDF", + "exportAll": "Export PDF", + "downloadSelected": "Download Selected Files", + "downloadAll": "Download All", + "toggleTheme": "Toggle Theme", + "language": "Language", + "search": "Search PDF", + "panMode": "Pan Mode", + "rotateLeft": "Rotate Left", + "rotateRight": "Rotate Right", + "toggleSidebar": "Toggle Sidebar", + "exportSelected": "Export Selected Pages", + "toggleAnnotations": "Toggle Annotations Visibility", + "annotationMode": "Toggle Annotation Mode", + "draw": "Draw", + "save": "Save" + }, + "search": { + "title": "Search PDF", + "placeholder": "Enter search term...", + "noResults": "No results found", + "searching": "Searching..." + }, + "guestBanner": { + "title": "You're using Stirling PDF as a guest!", + "message": "Create a free account to save your work, access more features, and support the project.", + "dismiss": "Dismiss banner", + "signUp": "Sign Up Free" + }, + "toolPicker": { + "searchPlaceholder": "Search tools...", + "noToolsFound": "No tools found", + "allTools": "ALL TOOLS", + "quickAccess": "QUICK ACCESS", + "categories": { + "standardTools": "Standard Tools", + "advancedTools": "Advanced Tools", + "recommendedTools": "Recommended Tools" + }, + "subcategories": { + "signing": "Signing", + "documentSecurity": "Document Security", + "verification": "Verification", + "documentReview": "Document Review", + "pageFormatting": "Page Formatting", + "extraction": "Extraction", + "removal": "Removal", + "automation": "Automation", + "general": "General", + "advancedFormatting": "Advanced Formatting", + "developerTools": "Developer Tools" + } + }, + "quickAccess": { + "read": "Read", + "sign": "Sign", + "automate": "Automate", "files": "Files", - "selectFilesPlaceholder": "Select files in the main view to get started", - "settings": "Settings", - "conversionCompleted": "Conversion completed", - "results": "Results", - "defaultFilename": "converted_file", - "conversionResults": "Conversion Results", - "converting": "Converting...", - "convertFiles": "Convert Files", - "downloadConverted": "Download Converted File", - "convertFrom": "Convert from", - "convertTo": "Convert to", - "sourceFormatPlaceholder": "Source format", - "targetFormatPlaceholder": "Target format", - "selectSourceFormatFirst": "Select a source format first", - "imageOptions": "Image Options", - "colorType": "Color Type", - "color": "Color", - "greyscale": "Greyscale", - "blackwhite": "Black & White", - "dpi": "DPI", - "output": "Output", - "single": "Single", - "multiple": "Multiple", - "pdfOptions": "PDF Options", - "fitOption": "Fit Option", - "maintainAspectRatio": "Maintain Aspect Ratio", - "fitDocumentToPage": "Fit Document to Page", - "fillPage": "Fill Page", - "autoRotate": "Auto Rotate", - "autoRotateDescription": "Automatically rotate images to better fit the PDF page", - "combineImages": "Combine Images", - "combineImagesDescription": "Combine all images into one PDF, or create separate PDFs for each image", - "webOptions": "Web to PDF Options", - "zoomLevel": "Zoom Level", - "emailOptions": "Email to PDF Options", - "includeAttachments": "Include email attachments", - "maxAttachmentSize": "Maximum attachment size (MB)", - "includeAllRecipients": "Include CC and BCC recipients in header", - "downloadHtml": "Download HTML intermediate file instead of PDF", - "pdfaOptions": "PDF/A Options", - "outputFormat": "Output Format", - "pdfaNote": "PDF/A-1b is more compatible, PDF/A-2b supports more features.", - "pdfaDigitalSignatureWarning": "The PDF contains a digital signature. This will be removed in the next step.", - "sanitize": { - "submit": "Sanitize PDF", - "completed": "Sanitization completed successfully", - "error.generic": "Sanitization failed", - "error.failed": "An error occurred while sanitizing the PDF.", - "filenamePrefix": "sanitized", - "sanitizationResults": "Sanitization Results", - "steps": { - "files": "Files", - "settings": "Settings", - "results": "Results" + "activity": "Activity", + "help": "Help", + "account": "Account", + "config": "Config", + "adminSettings": "Admin Settings", + "allTools": "All Tools" + }, + "admin": { + "error": "Error", + "success": "Success", + "expand": "Expand", + "close": "Close", + "status": { + "active": "Active", + "inactive": "Inactive" + }, + "settings": { + "title": "Admin Settings", + "workspace": "Workspace", + "fetchError": "Failed to load settings", + "saveError": "Failed to save settings", + "saved": "Settings saved successfully", + "saveSuccess": "Settings saved successfully", + "save": "Save Changes", + "restartRequired": "Restart Required", + "restart": { + "title": "Restart Required", + "message": "Settings have been saved successfully. A server restart is required for the changes to take effect.", + "question": "Would you like to restart the server now or later?", + "now": "Restart Now", + "later": "Restart Later" }, - "files": { - "placeholder": "Select a PDF file in the main view to get started" + "restarting": "Restarting Server", + "restartingMessage": "The server is restarting. Please wait a moment...", + "restartError": "Failed to restart server. Please restart manually.", + "general": { + "title": "System Settings", + "description": "Configure system-wide application settings including branding and default behaviour.", + "ui": "User Interface", + "system": "System", + "appName": { + "label": "Application Name", + "description": "The name displayed in the browser tab and home page" + }, + "appNameNavbar": { + "label": "Navbar Brand", + "description": "The name displayed in the navigation bar" + }, + "homeDescription": { + "label": "Home Description", + "description": "The description text shown on the home page" + }, + "defaultLocale": { + "label": "Default Locale", + "description": "The default language for new users (e.g., en_US, es_ES)" + }, + "fileUploadLimit": { + "label": "File Upload Limit", + "description": "Maximum file upload size (e.g., 100MB, 1GB)" + }, + "showUpdate": { + "label": "Show Update Notifications", + "description": "Display notifications when a new version is available" + }, + "showUpdateOnlyAdmin": { + "label": "Show Updates to Admins Only", + "description": "Restrict update notifications to admin users only" + }, + "customHTMLFiles": { + "label": "Custom HTML Files", + "description": "Allow serving custom HTML files from the customFiles directory" + }, + "languages": { + "label": "Available Languages", + "description": "Languages that users can select from (leave empty to enable all languages)" + }, + "customMetadata": { + "label": "Custom Metadata", + "autoUpdate": { + "label": "Auto Update Metadata", + "description": "Automatically update PDF metadata on all processed documents" + }, + "author": { + "label": "Default Author", + "description": "Default author for PDF metadata (e.g., username)" + }, + "creator": { + "label": "Default Creator", + "description": "Default creator for PDF metadata" + }, + "producer": { + "label": "Default Producer", + "description": "Default producer for PDF metadata" + } + }, + "customPaths": { + "label": "Custom Paths", + "description": "Configure custom file system paths for pipeline processing and external tools", + "pipeline": { + "label": "Pipeline Directories", + "watchedFoldersDir": { + "label": "Watched Folders Directory", + "description": "Directory where pipeline monitors for incoming PDFs (leave empty for default: /pipeline/watchedFolders)" + }, + "finishedFoldersDir": { + "label": "Finished Folders Directory", + "description": "Directory where processed PDFs are outputted (leave empty for default: /pipeline/finishedFolders)" + } + }, + "operations": { + "label": "External Tool Paths", + "weasyprint": { + "label": "WeasyPrint Executable", + "description": "Path to WeasyPrint executable for HTML to PDF conversion (leave empty for default: /opt/venv/bin/weasyprint)" + }, + "unoconvert": { + "label": "Unoconvert Executable", + "description": "Path to LibreOffice unoconvert for document conversions (leave empty for default: /opt/venv/bin/unoconvert)" + } + } + } }, - "options": { - "title": "Sanitization Options", - "note": "Select the elements you want to remove from the PDF. At least one option must be selected.", - "removeJavaScript": "Remove JavaScript", - "removeJavaScript.desc": "Remove JavaScript actions and scripts from the PDF", - "removeEmbeddedFiles": "Remove Embedded Files", - "removeEmbeddedFiles.desc": "Remove any files embedded within the PDF", - "removeXMPMetadata": "Remove XMP Metadata", - "removeXMPMetadata.desc": "Remove XMP metadata from the PDF", - "removeMetadata": "Remove Document Metadata", - "removeMetadata.desc": "Remove document information metadata (title, author, etc.)", - "removeLinks": "Remove Links", - "removeLinks.desc": "Remove external links and launch actions from the PDF", - "removeFonts": "Remove Fonts", - "removeFonts.desc": "Remove embedded fonts from the PDF" + "security": { + "title": "Security", + "description": "Configure authentication, login behaviour, and security policies.", + "ssoNotice": { + "title": "Looking for SSO/SAML settings?", + "message": "OAuth2 and SAML2 authentication providers have been moved to the Connections menu for easier management." + }, + "authentication": "Authentication", + "enableLogin": { + "label": "Enable Login", + "description": "Require users to log in before accessing the application" + }, + "loginMethod": { + "label": "Login Method", + "description": "The authentication method to use for user login", + "all": "All Methods", + "normal": "Username/Password Only", + "oauth2": "OAuth2 Only", + "saml2": "SAML2 Only" + }, + "loginAttemptCount": { + "label": "Login Attempt Limit", + "description": "Maximum number of failed login attempts before account lockout" + }, + "loginResetTimeMinutes": { + "label": "Login Reset Time (minutes)", + "description": "Time before failed login attempts are reset" + }, + "csrfDisabled": { + "label": "Disable CSRF Protection", + "description": "Disable Cross-Site Request Forgery protection (not recommended)" + }, + "initialLogin": { + "label": "Initial Login", + "username": { + "label": "Initial Username", + "description": "The username for the initial admin account" + }, + "password": { + "label": "Initial Password", + "description": "The password for the initial admin account" + } + }, + "jwt": { + "label": "JWT Configuration", + "secureCookie": { + "label": "Secure Cookie", + "description": "Require HTTPS for JWT cookies (recommended for production)" + }, + "keyRetentionDays": { + "label": "Key Retention Days", + "description": "Number of days to retain old JWT keys for verification" + }, + "persistence": { + "label": "Enable Key Persistence", + "description": "Store JWT keys persistently to survive server restarts" + }, + "enableKeyRotation": { + "label": "Enable Key Rotation", + "description": "Automatically rotate JWT signing keys periodically" + }, + "enableKeyCleanup": { + "label": "Enable Key Cleanup", + "description": "Automatically remove expired JWT keys" + } + }, + "audit": { + "label": "Audit Logging", + "enabled": { + "label": "Enable Audit Logging", + "description": "Track user actions and system events for compliance and security monitoring" + }, + "level": { + "label": "Audit Level", + "description": "0=OFF, 1=BASIC, 2=STANDARD, 3=VERBOSE" + }, + "retentionDays": { + "label": "Audit Retention (days)", + "description": "Number of days to retain audit logs" + } + }, + "htmlUrlSecurity": { + "label": "HTML URL Security", + "description": "Configure URL access restrictions for HTML processing to prevent SSRF attacks", + "enabled": { + "label": "Enable URL Security", + "description": "Enable URL security restrictions for HTML to PDF conversions" + }, + "level": { + "label": "Security Level", + "description": "MAX: whitelist only, MEDIUM: block internal networks, OFF: no restrictions", + "max": "Maximum (Whitelist Only)", + "medium": "Medium (Block Internal)", + "off": "Off (No Restrictions)" + }, + "advanced": "Advanced Settings", + "allowedDomains": { + "label": "Allowed Domains (Whitelist)", + "description": "One domain per line (e.g., cdn.example.com). Only these domains allowed when level is MAX" + }, + "blockedDomains": { + "label": "Blocked Domains (Blacklist)", + "description": "One domain per line (e.g., malicious.com). Additional domains to block" + }, + "internalTlds": { + "label": "Internal TLDs", + "description": "One TLD per line (e.g., .local, .internal). Block domains with these TLD patterns" + }, + "networkBlocking": "Network Blocking", + "blockPrivateNetworks": { + "label": "Block Private Networks", + "description": "Block RFC 1918 private networks (10.x.x.x, 192.168.x.x, 172.16-31.x.x)" + }, + "blockLocalhost": { + "label": "Block Localhost", + "description": "Block localhost and loopback addresses (127.x.x.x, ::1)" + }, + "blockLinkLocal": { + "label": "Block Link-Local Addresses", + "description": "Block link-local addresses (169.254.x.x, fe80::/10)" + }, + "blockCloudMetadata": { + "label": "Block Cloud Metadata Endpoints", + "description": "Block cloud provider metadata endpoints (169.254.169.254)" + } + } + }, + "connections": { + "title": "Connections", + "description": "Configure external authentication providers like OAuth2 and SAML.", + "linkedServices": "Linked Services", + "unlinkedServices": "Unlinked Services", + "connect": "Connect", + "disconnect": "Disconnect", + "disconnected": "Provider disconnected successfully", + "disconnectError": "Failed to disconnect provider", + "ssoAutoLogin": { + "label": "SSO Auto Login", + "enable": "Enable SSO Auto Login", + "description": "Automatically redirect to SSO login when authentication is required" + }, + "oauth2": { + "label": "OAuth2", + "enabled": { + "label": "Enable OAuth2", + "description": "Allow users to authenticate using OAuth2 providers" + }, + "provider": { + "label": "Provider", + "description": "The OAuth2 provider to use for authentication" + }, + "issuer": { + "label": "Issuer URL", + "description": "The OAuth2 provider issuer URL" + }, + "clientId": { + "label": "Client ID", + "description": "The OAuth2 client ID from your provider" + }, + "clientSecret": { + "label": "Client Secret", + "description": "The OAuth2 client secret from your provider" + }, + "useAsUsername": { + "label": "Use as Username", + "description": "The OAuth2 claim to use as the username (e.g., email, sub)" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first OAuth2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via OAuth2" + }, + "scopes": { + "label": "OAuth2 Scopes", + "description": "Comma-separated list of OAuth2 scopes to request (e.g., openid, profile, email)" + } + }, + "saml2": { + "label": "SAML2", + "enabled": { + "label": "Enable SAML2", + "description": "Allow users to authenticate using SAML2 providers" + }, + "provider": { + "label": "Provider", + "description": "The SAML2 provider name" + }, + "registrationId": { + "label": "Registration ID", + "description": "The SAML2 registration identifier" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first SAML2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via SAML2" + } + } + }, + "database": { + "title": "Database", + "description": "Configure custom database connection settings for enterprise deployments.", + "configuration": "Database Configuration", + "enableCustom": { + "label": "Enable Custom Database", + "description": "Use your own custom database configuration instead of the default embedded database" + }, + "customUrl": { + "label": "Custom Database URL", + "description": "Full JDBC connection string (e.g., jdbc:postgresql://localhost:5432/postgres). If provided, individual connection settings below are not used." + }, + "type": { + "label": "Database Type", + "description": "Type of database (not used if custom URL is provided)" + }, + "hostName": { + "label": "Host Name", + "description": "Database server hostname (not used if custom URL is provided)" + }, + "port": { + "label": "Port", + "description": "Database server port (not used if custom URL is provided)" + }, + "name": { + "label": "Database Name", + "description": "Name of the database (not used if custom URL is provided)" + }, + "username": { + "label": "Username", + "description": "Database authentication username" + }, + "password": { + "label": "Password", + "description": "Database authentication password" + } + }, + "privacy": { + "title": "Privacy", + "description": "Configure privacy and data collection settings.", + "analytics": "Analytics & Tracking", + "enableAnalytics": { + "label": "Enable Analytics", + "description": "Collect anonymous usage analytics to help improve the application" + }, + "metricsEnabled": { + "label": "Enable Metrics", + "description": "Enable collection of performance and usage metrics. Provides API endpoint for admins to access metrics data" + }, + "searchEngine": "Search Engine Visibility", + "googleVisibility": { + "label": "Google Visibility", + "description": "Allow search engines to index this application" + } + }, + "advanced": { + "title": "Advanced", + "description": "Configure advanced features and experimental functionality.", + "features": "Feature Flags", + "processing": "Processing", + "endpoints": { + "label": "Endpoints", + "manage": "Manage API Endpoints", + "description": "Endpoint management is configured via YAML. See documentation for details on enabling/disabling specific endpoints." + }, + "enableAlphaFunctionality": { + "label": "Enable Alpha Features", + "description": "Enable experimental and alpha-stage features (may be unstable)" + }, + "enableUrlToPDF": { + "label": "Enable URL to PDF", + "description": "Allow conversion of web pages to PDF documents" + }, + "maxDPI": { + "label": "Maximum DPI", + "description": "Maximum DPI for image processing (0 = unlimited)" + }, + "tessdataDir": { + "label": "Tessdata Directory", + "description": "Path to the tessdata directory for OCR language files" + }, + "disableSanitize": { + "label": "Disable HTML Sanitization", + "description": "WARNING: Security risk - disabling HTML sanitization can lead to XSS vulnerabilities" + }, + "tempFileManagement": { + "label": "Temp File Management", + "description": "Configure temporary file storage and cleanup behavior", + "baseTmpDir": { + "label": "Base Temp Directory", + "description": "Base directory for temporary files (leave empty for default: java.io.tmpdir/stirling-pdf)" + }, + "libreofficeDir": { + "label": "LibreOffice Temp Directory", + "description": "Directory for LibreOffice temp files (leave empty for default: baseTmpDir/libreoffice)" + }, + "systemTempDir": { + "label": "System Temp Directory", + "description": "System temp directory to clean (only used if cleanupSystemTemp is enabled)" + }, + "prefix": { + "label": "Temp File Prefix", + "description": "Prefix for temp file names" + }, + "maxAgeHours": { + "label": "Max Age (hours)", + "description": "Maximum age in hours before temp files are cleaned up" + }, + "cleanupIntervalMinutes": { + "label": "Cleanup Interval (minutes)", + "description": "How often to run cleanup (in minutes)" + }, + "startupCleanup": { + "label": "Startup Cleanup", + "description": "Clean up old temp files on application startup" + }, + "cleanupSystemTemp": { + "label": "Cleanup System Temp", + "description": "Whether to clean broader system temp directory (use with caution)" + } + }, + "processExecutor": { + "label": "Process Executor Limits", + "description": "Configure session limits and timeouts for each process executor", + "sessionLimit": { + "label": "Session Limit", + "description": "Maximum concurrent instances" + }, + "timeout": { + "label": "Timeout (minutes)", + "description": "Maximum execution time" + }, + "libreOffice": "LibreOffice", + "pdfToHtml": "PDF to HTML", + "qpdf": "QPDF", + "tesseract": "Tesseract OCR", + "pythonOpenCv": "Python OpenCV", + "weasyPrint": "WeasyPrint", + "installApp": "Install App", + "calibre": "Calibre", + "ghostscript": "Ghostscript", + "ocrMyPdf": "OCRmyPDF" + } + }, + "mail": { + "title": "Mail Server", + "description": "Configure SMTP settings for sending email notifications.", + "smtp": "SMTP Configuration", + "enabled": { + "label": "Enable Mail", + "description": "Enable email notifications and SMTP functionality" + }, + "host": { + "label": "SMTP Host", + "description": "The hostname or IP address of your SMTP server" + }, + "port": { + "label": "SMTP Port", + "description": "The port number for SMTP connection (typically 25, 465, or 587)" + }, + "username": { + "label": "SMTP Username", + "description": "Username for SMTP authentication" + }, + "password": { + "label": "SMTP Password", + "description": "Password for SMTP authentication" + }, + "from": { + "label": "From Address", + "description": "The email address to use as the sender" + }, + "enableInvites": { + "label": "Enable Email Invites", + "description": "Allow admins to invite users via email with auto-generated passwords" + }, + "frontendUrl": { + "label": "Frontend URL", + "description": "Base URL for frontend (e.g. https://pdf.example.com). Used for generating invite links in emails. Leave empty to use backend URL." + } + }, + "legal": { + "title": "Legal Documents", + "description": "Configure links to legal documents and policies.", + "disclaimer": { + "title": "Legal Responsibility Warning", + "message": "By customizing these legal documents, you assume full responsibility for ensuring compliance with all applicable laws and regulations, including but not limited to GDPR and other EU data protection requirements. Only modify these settings if: (1) you are operating a personal/private instance, (2) you are outside EU jurisdiction and understand your local legal obligations, or (3) you have obtained proper legal counsel and accept sole responsibility for all user data and legal compliance. Stirling-PDF and its developers assume no liability for your legal obligations." + }, + "termsAndConditions": { + "label": "Terms and Conditions", + "description": "URL or filename to terms and conditions" + }, + "privacyPolicy": { + "label": "Privacy Policy", + "description": "URL or filename to privacy policy" + }, + "accessibilityStatement": { + "label": "Accessibility Statement", + "description": "URL or filename to accessibility statement" + }, + "cookiePolicy": { + "label": "Cookie Policy", + "description": "URL or filename to cookie policy" + }, + "impressum": { + "label": "Impressum", + "description": "URL or filename to impressum (required in some jurisdictions)" + } + }, + "premium": { + "title": "Premium & Enterprise", + "description": "Configure your premium or enterprise license key.", + "license": "License Configuration", + "key": { + "label": "License Key", + "description": "Enter your premium or enterprise license key" + }, + "enabled": { + "label": "Enable Premium Features", + "description": "Enable license key checks for pro/enterprise features" + }, + "movedFeatures": { + "title": "Premium Features Distributed", + "message": "Premium and Enterprise features are now organized in their respective sections:" + } + }, + "features": { + "title": "Features", + "description": "Configure optional features and functionality.", + "serverCertificate": { + "label": "Server Certificate", + "description": "Configure server-side certificate generation for \"Sign with Stirling-PDF\" functionality", + "enabled": { + "label": "Enable Server Certificate", + "description": "Enable server-side certificate for \"Sign with Stirling-PDF\" option" + }, + "organizationName": { + "label": "Organization Name", + "description": "Organization name for generated certificates" + }, + "validity": { + "label": "Certificate Validity (days)", + "description": "Number of days the certificate will be valid" + }, + "regenerateOnStartup": { + "label": "Regenerate on Startup", + "description": "Generate new certificate on each application startup" + } + } + }, + "endpoints": { + "title": "API Endpoints", + "description": "Control which API endpoints and endpoint groups are available.", + "management": "Endpoint Management", + "toRemove": { + "label": "Disabled Endpoints", + "description": "Select individual endpoints to disable" + }, + "groupsToRemove": { + "label": "Disabled Endpoint Groups", + "description": "Select endpoint groups to disable" + }, + "note": "Note: Disabling endpoints restricts API access but does not remove UI components. Restart required for changes to take effect." + } + } + }, + "fileUpload": { + "selectFile": "Select a file", + "selectFiles": "Select files", + "selectPdfToView": "Select a PDF to view", + "selectPdfToEdit": "Select a PDF to edit", + "chooseFromStorage": "Choose a file from storage or upload a new PDF", + "chooseFromStorageMultiple": "Choose files from storage or upload new PDFs", + "loadFromStorage": "Load from Storage", + "filesAvailable": "files available", + "loading": "Loading...", + "or": "or", + "dropFileHere": "Drop file here or click to upload", + "dropFilesHere": "Drop files here or click the upload button", + "pdfFilesOnly": "PDF files only", + "supportedFileTypes": "Supported file types", + "upload": "Upload", + "uploadFile": "Upload File", + "uploadFiles": "Upload Files", + "noFilesInStorage": "No files available in storage. Upload some files first.", + "selectFromStorage": "Select from Storage", + "backToTools": "Back to Tools", + "addFiles": "Add Files", + "dragFilesInOrClick": "Drag files in or click \"Add Files\" to browse" + }, + "fileEditor": { + "addFiles": "Add Files" + }, + "fileManager": { + "title": "Upload PDF Files", + "subtitle": "Add files to your storage for easy access across tools", + "filesSelected": "files selected", + "clearSelection": "Clear Selection", + "openInFileEditor": "Open in File Editor", + "uploadError": "Failed to upload some files.", + "failedToOpen": "Failed to open file. It may have been removed from storage.", + "failedToLoad": "Failed to load file to active set.", + "storageCleared": "Browser cleared storage. Files have been removed. Please re-upload.", + "clearAll": "Clear All", + "reloadFiles": "Reload Files", + "dragDrop": "Drag & Drop files here", + "clickToUpload": "Click to upload files", + "selectedFiles": "Selected Files", + "storage": "Storage", + "filesStored": "files stored", + "storageError": "Storage error occurred", + "storageLow": "Storage is running low. Consider removing old files.", + "supportMessage": "Powered by browser database storage for unlimited capacity", + "noFileSelected": "No files selected", + "showHistory": "Show History", + "hideHistory": "Hide History", + "fileHistory": "File History", + "loadingHistory": "Loading History...", + "lastModified": "Last Modified", + "toolChain": "Tools Applied", + "restore": "Restore", + "unzip": "Unzip", + "searchFiles": "Search files...", + "recent": "Recent", + "localFiles": "Local Files", + "googleDrive": "Google Drive", + "googleDriveShort": "Drive", + "myFiles": "My Files", + "noRecentFiles": "No recent files found", + "googleDriveNotAvailable": "Google Drive integration not available", + "openFiles": "Open Files", + "openFile": "Open File", + "details": "File Details", + "fileName": "Name", + "fileFormat": "Format", + "fileSize": "Size", + "fileVersion": "Version", + "totalSelected": "Total Selected", + "dropFilesHere": "Drop files here", + "selectAll": "Select All", + "deselectAll": "Deselect All", + "deleteSelected": "Delete Selected", + "downloadSelected": "Download Selected", + "selectedCount": "{{count}} selected", + "download": "Download", + "delete": "Delete", + "unsupported": "Unsupported", + "addToUpload": "Add to Upload", + "deleteAll": "Delete All", + "loadingFiles": "Loading files...", + "noFiles": "No files available", + "noFilesFound": "No files found matching your search", + "openInPageEditor": "Open in Page Editor", + "showAll": "Show All", + "sortByDate": "Sort by Date", + "sortByName": "Sort by Name", + "sortBySize": "Sort by Size" + }, + "storage": { + "temporaryNotice": "Files are stored temporarily in your browser and may be cleared automatically", + "storageLimit": "Storage limit", + "storageUsed": "Temporary Storage used", + "storageFull": "Storage is nearly full. Consider removing some files.", + "fileTooLarge": "File too large. Maximum size per file is", + "storageQuotaExceeded": "Storage quota exceeded. Please remove some files before uploading more.", + "approximateSize": "Approximate size" + }, + "sanitize": { + "title": "Sanitise", + "desc": "Remove potentially harmful elements from PDF files.", + "submit": "Sanitise PDF", + "completed": "Sanitisation completed successfully", + "error": { + "generic": "Sanitisation failed", + "failed": "An error occurred while sanitising the PDF." + }, + "filenamePrefix": "sanitised", + "sanitizationResults": "Sanitisation Results", + "steps": { + "files": "Files", + "settings": "Settings", + "results": "Results" + }, + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "options": { + "title": "Sanitisation Options", + "note": "Select the elements you want to remove from the PDF. At least one option must be selected.", + "removeJavaScript": { + "label": "Remove JavaScript", + "desc": "Remove JavaScript actions and scripts from the PDF" + }, + "removeEmbeddedFiles": { + "label": "Remove Embedded Files", + "desc": "Remove any files embedded within the PDF" + }, + "removeXMPMetadata": { + "label": "Remove XMP Metadata", + "desc": "Remove XMP metadata from the PDF" + }, + "removeMetadata": { + "label": "Remove Document Metadata", + "desc": "Remove document information metadata (title, author, etc.)" + }, + "removeLinks": { + "label": "Remove Links", + "desc": "Remove external links and launch actions from the PDF" + }, + "removeFonts": { + "label": "Remove Fonts", + "desc": "Remove embedded fonts from the PDF" } } }, @@ -2085,7 +4713,6 @@ "failed": "An error occurred while encrypting the PDF." }, "passwords": { - "title": "Passwords", "stepTitle": "Passwords & Encryption", "completed": "Passwords configured", "user": { @@ -2095,10 +4722,8 @@ "owner": { "label": "Owner Password", "placeholder": "Enter owner password" - } - }, - "permissions": { - "stepTitle": "Document Permissions" + }, + "title": "Passwords" }, "encryption": { "keyLength": { @@ -2132,12 +4757,16 @@ "title": "Change Permissions", "text": "These permissions control what users can do with the PDF. Most effective when combined with an owner password." } + }, + "permissions": { + "stepTitle": "Document Permissions" } }, "changePermissions": { + "title": "Document Permissions", + "desc": "Change document restrictions and permissions.", "completed": "Permissions changed", "submit": "Change Permissions", - "title": "Document Permissions", "error": { "failed": "An error occurred while changing PDF permissions." }, @@ -2182,257 +4811,6 @@ } } }, - "watermark": { - "tags": "Text,repeating,label,own,copyright,trademark,img,jpg,picture,photo", - "title": "Add Watermark", - "desc": "Add text or image watermarks to PDF files", - "header": "Add Watermark", - "completed": "Watermark added", - "submit": "Add Watermark", - "filenamePrefix": "watermarked", - "error": { - "failed": "An error occurred while adding watermark to the PDF." - }, - "watermarkType": { - "text": "Text", - "image": "Image" - }, - "settings": { - "type": "Watermark Type", - "text": { - "label": "Watermark Text", - "placeholder": "Enter watermark text" - }, - "image": { - "label": "Watermark Image", - "choose": "Choose Image", - "selected": "Selected: {{filename}}" - }, - "fontSize": "Font Size", - "alphabet": "Font/Language", - "color": "Watermark Color", - "rotation": "Rotation (degrees)", - "opacity": "Opacity (%)", - "spacing": { - "horizontal": "Horizontal Spacing", - "vertical": "Vertical Spacing" - }, - "convertToImage": "Flatten PDF pages to images" - }, - "alphabet": { - "roman": "Roman/Latin", - "arabic": "Arabic", - "japanese": "Japanese", - "korean": "Korean", - "chinese": "Chinese", - "thai": "Thai" - }, - "steps": { - "type": "Watermark Type", - "wording": "Wording", - "textStyle": "Style", - "file": "Watermark File", - "formatting": "Formatting" - }, - "results": { - "title": "Watermark Results" - }, - "tooltip": { - "language": { - "title": "Language Support", - "text": "Choose the appropriate language setting to ensure proper font rendering for your text." - }, - "appearance": { - "title": "Appearance Settings", - "text": "Control how your watermark looks and blends with the document.", - "bullet1": "Rotation: -360° to 360° for angled watermarks", - "bullet2": "Opacity: 0-100% for transparency control", - "bullet3": "Lower opacity creates subtle watermarks" - }, - "spacing": { - "title": "Spacing Control", - "text": "Adjust the spacing between repeated watermarks across the page.", - "bullet1": "Width spacing: Horizontal distance between watermarks", - "bullet2": "Height spacing: Vertical distance between watermarks", - "bullet3": "Higher values create more spread out patterns" - }, - "type": { - "header": { - "title": "Watermark Type Selection" - }, - "description": { - "title": "Choose Your Watermark", - "text": "Select between text or image watermarks based on your needs." - }, - "text": { - "title": "Text Watermarks", - "text": "Perfect for adding copyright notices, company names, or confidentiality labels. Supports multiple languages and custom colors.", - "bullet1": "Customizable fonts and languages", - "bullet2": "Adjustable colors and transparency", - "bullet3": "Ideal for legal or branding text" - }, - "image": { - "title": "Image Watermarks", - "text": "Use logos, stamps, or any image as a watermark. Great for branding and visual identification.", - "bullet1": "Upload any image format", - "bullet2": "Maintains image quality", - "bullet3": "Perfect for logos and stamps" - } - }, - "content": { - "header": { - "title": "Content Configuration" - }, - "text": { - "title": "Text Settings", - "text": "Configure your text watermark appearance and language support.", - "bullet1": "Enter your watermark text", - "bullet2": "Adjust font size (8-72pt)", - "bullet3": "Select language/script support", - "bullet4": "Choose custom colors" - }, - "language": { - "title": "Language Support", - "text": "Choose the appropriate language setting to ensure proper font rendering for your text.", - "bullet1": "Roman/Latin for Western languages", - "bullet2": "Arabic for Arabic script", - "bullet3": "Japanese, Korean, Chinese for Asian languages", - "bullet4": "Thai for Thai script" - } - }, - "style": { - "header": { - "title": "Style & Positioning" - }, - "appearance": { - "title": "Appearance Settings", - "text": "Control how your watermark looks and blends with the document.", - "bullet1": "Rotation: -360° to 360° for angled watermarks", - "bullet2": "Opacity: 0-100% for transparency control", - "bullet3": "Lower opacity creates subtle watermarks" - }, - "spacing": { - "title": "Spacing Control", - "text": "Adjust the spacing between repeated watermarks across the page.", - "bullet1": "Width spacing: Horizontal distance between watermarks", - "bullet2": "Height spacing: Vertical distance between watermarks", - "bullet3": "Higher values create more spread out patterns" - } - }, - "wording": { - "header": { - "title": "Text Content" - }, - "text": { - "title": "Watermark Text", - "text": "Enter the text that will appear as your watermark across the document.", - "bullet1": "Keep it concise for better readability", - "bullet2": "Common examples: 'CONFIDENTIAL', 'DRAFT', company name", - "bullet3": "Emoji characters are not supported and will be filtered out" - } - }, - "textStyle": { - "header": { - "title": "Text Style" - }, - "language": { - "title": "Language Support", - "text": "Choose the appropriate language setting to ensure proper font rendering.", - "bullet1": "Roman/Latin for Western languages", - "bullet2": "Arabic for Arabic script", - "bullet3": "Japanese, Korean, Chinese for Asian languages", - "bullet4": "Thai for Thai script" - }, - "color": { - "title": "Color Selection", - "text": "Choose a color that provides good contrast with your document content.", - "bullet1": "Light gray (#d3d3d3) for subtle watermarks", - "bullet2": "Black or dark colors for high contrast", - "bullet3": "Custom colors for branding purposes" - } - }, - "file": { - "header": { - "title": "Image Upload" - }, - "upload": { - "title": "Image Selection", - "text": "Upload an image file to use as your watermark.", - "bullet1": "Supports common formats: PNG, JPG, GIF, BMP", - "bullet2": "PNG with transparency works best", - "bullet3": "Higher resolution images maintain quality better" - }, - "recommendations": { - "title": "Best Practices", - "text": "Tips for optimal image watermark results.", - "bullet1": "Use logos or stamps with transparent backgrounds", - "bullet2": "Simple designs work better than complex images", - "bullet3": "Consider the final document size when choosing resolution" - } - }, - "formatting": { - "header": { - "title": "Formatting & Layout" - }, - "size": { - "title": "Size Control", - "text": "Adjust the size of your watermark (text or image).", - "bullet1": "Larger sizes create more prominent watermarks" - }, - "appearance": { - "title": "Appearance Settings", - "text": "Control how your watermark looks and blends with the document.", - "bullet1": "Rotation: -360° to 360° for angled watermarks", - "bullet2": "Opacity: 0-100% for transparency control", - "bullet3": "Lower opacity creates subtle watermarks" - }, - "spacing": { - "title": "Spacing Control", - "text": "Adjust the spacing between repeated watermarks across the page.", - "bullet1": "Horizontal spacing: Distance between watermarks left to right", - "bullet2": "Vertical spacing: Distance between watermarks top to bottom", - "bullet3": "Higher values create more spread out patterns" - }, - "security": { - "title": "Security Option", - "text": "Flatten PDF pages to images for enhanced security.", - "bullet1": "Prevents text selection and copying", - "bullet2": "Makes watermarks harder to remove", - "bullet3": "Results in larger file sizes", - "bullet4": "Best for sensitive or copyrighted content" - } - }, - "advanced": { - "header": { - "title": "Advanced Options" - }, - "conversion": { - "title": "PDF to Image Conversion", - "text": "Convert the final PDF to an image-based format for enhanced security.", - "bullet1": "Prevents text selection and copying", - "bullet2": "Makes watermarks harder to remove", - "bullet3": "Results in larger file sizes", - "bullet4": "Best for sensitive or copyrighted content" - }, - "security": { - "title": "Security Considerations", - "text": "Image-based PDFs provide additional protection against unauthorized editing and content extraction." - } - } - } - }, - "rightRail": { - "closePdf": "Close PDF", - "closeSelected": "Close Selected Files", - "selectAll": "Select All", - "deselectAll": "Deselect All", - "selectByNumber": "Select by Page Numbers", - "deleteSelected": "Delete Selected Pages", - "toggleTheme": "Toggle Theme", - "exportAll": "Export PDF", - "downloadSelected": "Download Selected Files", - "downloadAll": "Download All" - }, "removePassword": { "title": "Remove Password", "desc": "Remove password protection from your PDF document.", @@ -2455,6 +4833,78 @@ "title": "Decrypted PDFs" } }, + "automate": { + "title": "Automate", + "desc": "Build multi-step workflows by chaining together PDF actions. Ideal for recurring tasks.", + "invalidStep": "Invalid step", + "files": { + "placeholder": "Select files to process with this automation" + }, + "selection": { + "title": "Automation Selection", + "saved": { + "title": "Saved" + }, + "createNew": { + "title": "Create New Automation" + }, + "suggested": { + "title": "Suggested" + } + }, + "creation": { + "createTitle": "Create Automation", + "editTitle": "Edit Automation", + "intro": "Automations run tools sequentially. To get started, add tools in the order you want them to run.", + "name": { + "label": "Automation Name", + "placeholder": "My Automation" + }, + "description": { + "label": "Description (optional)", + "placeholder": "Describe what this automation does..." + }, + "tools": { + "selectTool": "Select a tool...", + "selected": "Selected Tools", + "remove": "Remove tool", + "configure": "Configure tool", + "notConfigured": "! Not Configured", + "addTool": "Add Tool", + "add": "Add a tool..." + }, + "save": "Save Automation", + "unsavedChanges": { + "title": "Unsaved Changes", + "message": "You have unsaved changes. Are you sure you want to go back? All changes will be lost.", + "cancel": "Cancel", + "confirm": "Go Back" + }, + "icon": { + "label": "Icon" + } + }, + "run": { + "title": "Run Automation" + }, + "sequence": { + "unnamed": "Unnamed Automation", + "steps": "{{count}} steps", + "running": "Running Automation...", + "run": "Run Automation", + "finish": "Finish" + }, + "reviewTitle": "Automation Results", + "config": { + "loading": "Loading tool configuration...", + "noSettings": "This tool does not have configurable settings.", + "title": "Configure {{toolName}}", + "description": "Configure the settings for this tool. These settings will be applied when the automation runs.", + "cancel": "Cancel", + "save": "Save Configuration" + }, + "copyToSaved": "Copy to Saved" + }, "automation": { "suggested": { "securePdfIngestion": "Secure PDF Ingestion", @@ -2467,8 +4917,72 @@ "processImagesDesc": "Converts multiple image files into a single PDF document, then applies OCR technology to extract searchable text from the images." } }, - "automate": { - "copyToSaved": "Copy to Saved" + "common": { + "previous": "Previous", + "next": "Next", + "collapse": "Collapse", + "expand": "Expand", + "collapsed": "collapsed", + "lines": "lines", + "copy": "Copy", + "copied": "Copied!", + "refresh": "Refresh", + "retry": "Retry", + "remaining": "remaining", + "used": "used", + "available": "available", + "cancel": "Cancel", + "preview": "Preview" + }, + "config": { + "overview": { + "title": "Application Configuration", + "description": "Current application settings and configuration details." + }, + "account": { + "overview": { + "title": "Account Settings", + "manageAccountPreferences": "Manage your account preferences", + "guestDescription": "You are signed in as a guest. Consider upgrading your account above." + }, + "upgrade": { + "title": "Upgrade Guest Account", + "description": "Link your account to preserve your history and access more features!", + "socialLogin": "Upgrade with Social Account", + "linkWith": "Link with", + "emailPassword": "or enter your email & password", + "email": "Email", + "emailPlaceholder": "Enter your email", + "password": "Password (optional)", + "passwordPlaceholder": "Set a password", + "passwordNote": "Leave empty to use email verification only", + "upgradeButton": "Upgrade Account" + } + }, + "apiKeys": { + "description": "Your API key for accessing Stirling's suite of PDF tools. Copy it to your project or refresh to generate a new one.", + "publicKeyAriaLabel": "Public API key", + "copyKeyAriaLabel": "Copy API key", + "refreshAriaLabel": "Refresh API key", + "includedCredits": "Included credits", + "purchasedCredits": "Purchased credits", + "totalCredits": "Total Credits", + "chartAriaLabel": "Credits usage: included {{includedUsed}} of {{includedTotal}}, purchased {{purchasedUsed}} of {{purchasedTotal}}", + "nextReset": "Next Reset", + "lastApiUse": "Last API Use", + "overlayMessage": "Generate a key to see credits and available credits", + "label": "API Key", + "guestInfo": "Guest users do not receive API keys. Create an account to get an API key you can use in your applications.", + "goToAccount": "Go to Account", + "refreshModal": { + "title": "Refresh API Keys", + "warning": "âš ī¸ Warning: This action will generate new API keys and make your previous keys invalid.", + "impact": "Any applications or services currently using these keys will stop working until you update them with the new keys.", + "confirmPrompt": "Are you sure you want to continue?", + "confirmCta": "Refresh Keys" + }, + "generateError": "We couldn't generate your API key." + } }, "AddAttachmentsRequest": { "attachments": "Select Attachments", @@ -2480,11 +4994,587 @@ "submit": "Add Attachments", "results": { "title": "Attachment Results" + }, + "error": { + "failed": "Add attachments operation failed" } }, + "termsAndConditions": "Terms & Conditions", + "logOut": "Log out", "addAttachments": { "error": { "failed": "An error occurred while adding attachments to the PDF." } + }, + "autoRename": { + "description": "This tool will automatically rename PDF files based on their content. It analyzes the document to find the most suitable title from the text." + }, + "customPosition": "Custom Position", + "details": "Details", + "downloadUnavailable": "Download unavailable for this item", + "invalidUndoData": "Cannot undo: invalid operation data", + "margin": { + "large": "Large", + "medium": "Medium", + "small": "Small", + "xLarge": "Extra Large" + }, + "noFilesToUndo": "Cannot undo: no files were processed in the last operation", + "noOperationToUndo": "No operation to undo", + "noValidFiles": "No valid files to process", + "operationCancelled": "Operation cancelled", + "pageEdit": { + "deselectAll": "Select None", + "selectAll": "Select All" + }, + "quickPosition": "Quick Position", + "reorganizePages": { + "error": { + "failed": "Failed to reorganize pages" + }, + "results": { + "title": "Pages Reorganized" + }, + "settings": { + "title": "Settings" + }, + "submit": "Reorganize Pages" + }, + "replace-color": { + "options": { + "fill": "Fill colour", + "gradient": "Gradient" + }, + "previewOverlayOpacity": "Preview overlay opacity", + "previewOverlayTransparency": "Preview overlay transparency", + "previewOverlayVisibility": "Show preview overlay", + "selectText": { + "1": "Replace or Invert color Options", + "2": "Default(Default high contrast colors)", + "3": "Custom(Customized colors)", + "4": "Full-Invert(Invert all colors)", + "5": "High contrast color options", + "6": "white text on black background", + "7": "Black text on white background", + "8": "Yellow text on black background", + "9": "Green text on black background", + "10": "Choose text Color", + "11": "Choose background Color", + "12": "Choose start colour", + "13": "Choose end colour" + }, + "submit": "Replace", + "title": "Replace-Invert-Color", + "header": "Replace-Invert Color PDF" + }, + "size": "Size", + "submit": "Submit", + "success": "Success", + "tools": { + "noSearchResults": "No tools found", + "noTools": "No tools available" + }, + "undoDataMismatch": "Cannot undo: operation data is corrupted", + "undoFailed": "Failed to undo operation", + "undoQuotaError": "Cannot undo: insufficient storage space", + "undoStorageError": "Undo completed but some files could not be saved to storage", + "undoSuccess": "Operation undone successfully", + "unsupported": "Unsupported", + "onboarding": { + "welcomeModal": { + "title": "Welcome to Stirling PDF!", + "description": "Would you like to take a quick 1-minute tour to learn the key features and how to get started?", + "helpHint": "You can always access this tour later from the Help button in the bottom left.", + "startTour": "Start Tour", + "maybeLater": "Maybe Later", + "dontShowAgain": "Don't Show Again" + }, + "allTools": "This is the All Tools panel, where you can browse and select from all available PDF tools.", + "selectCropTool": "Let's select the Crop tool to demonstrate how to use one of the tools.", + "toolInterface": "This is the Crop tool interface. As you can see, there's not much there because we haven't added any PDF files to work with yet.", + "filesButton": "The Files button on the Quick Access bar allows you to upload PDFs to use the tools on.", + "fileSources": "You can upload new files or access recent files from here. For the tour, we'll just use a sample file.", + "workbench": "This is the Workbench - the main area where you view and edit your PDFs.", + "viewSwitcher": "Use these controls to select how you want to view your PDFs.", + "viewer": "The Viewer lets you read and annotate your PDFs.", + "pageEditor": "The Page Editor allows you to do various operations on the pages within your PDFs, such as reordering, rotating and deleting.", + "activeFiles": "The Active Files view shows all of the PDFs you have loaded into the tool, and allows you to select which ones to process.", + "fileCheckbox": "Clicking one of the files selects it for processing. You can select multiple files for batch operations.", + "selectControls": "The Right Rail contains buttons to quickly select/deselect all of your active PDFs, along with buttons to change the app's theme or language.", + "cropSettings": "Now that we've selected the file we want crop, we can configure the Crop tool to choose the area that we want to crop the PDF to.", + "runButton": "Once the tool has been configured, this button allows you to run the tool on all the selected PDFs.", + "results": "After the tool has finished running, the Review step will show a preview of the results in this panel, and allow you to undo the operation or download the file. ", + "fileReplacement": "The modified file will replace the original file in the Workbench automatically, allowing you to easily run it through more tools.", + "pinButton": "You can use the Pin button if you'd rather your files stay active after running tools on them.", + "wrapUp": "You're all set! You've learnt about the main areas of the app and how to use them. Click the Help button whenever you like to see this tour again.", + "previous": "Previous", + "next": "Next", + "finish": "Finish", + "startTour": "Start Tour", + "startTourDescription": "Take a guided tour of Stirling PDF's key features" + }, + "workspace": { + "title": "Workspace", + "people": { + "title": "People", + "description": "Manage workspace members and their permissions", + "loading": "Loading people...", + "searchMembers": "Search members...", + "addMembers": "Add Members", + "inviteMembers": { + "label": "Invite Members", + "subtitle": "Type or paste in emails below, separated by commas. Your workspace will be billed by members." + }, + "user": "User", + "role": "Role", + "team": "Team", + "status": "Status", + "actions": "Actions", + "noMembersFound": "No members found", + "active": "Active", + "disabled": "Disabled", + "activeSession": "Active session", + "member": "Member", + "admin": "Admin", + "roleDescriptions": { + "admin": "Can manage settings and invite members, with full administrative access.", + "member": "Can view and edit shared files, but cannot manage workspace settings or members." + }, + "editRole": "Edit Role", + "enable": "Enable", + "disable": "Disable", + "deleteUser": "Delete User", + "deleteUserSuccess": "User deleted successfully", + "deleteUserError": "Failed to delete user", + "confirmDelete": "Are you sure you want to delete this user? This action cannot be undone.", + "addMember": { + "title": "Add Member", + "username": "Username (Email)", + "usernamePlaceholder": "user@example.com", + "password": "Password", + "passwordPlaceholder": "Enter password", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "forcePasswordChange": "Force password change on first login", + "cancel": "Cancel", + "submit": "Add Member", + "usernameRequired": "Username and password are required", + "passwordTooShort": "Password must be at least 6 characters", + "success": "User created successfully", + "error": "Failed to create user" + }, + "editMember": { + "title": "Edit Member", + "editing": "Editing:", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "cancel": "Cancel", + "submit": "Update Member", + "success": "User updated successfully", + "error": "Failed to update user" + }, + "toggleEnabled": { + "success": "User status updated successfully", + "error": "Failed to update user status" + }, + "delete": { + "success": "User deleted successfully", + "error": "Failed to delete user" + }, + "emailInvite": { + "tab": "Email Invite", + "description": "Type or paste in emails below, separated by commas. Users will receive login credentials via email.", + "emails": "Email Addresses", + "emailsPlaceholder": "user1@example.com, user2@example.com", + "emailsRequired": "At least one email address is required", + "submit": "Send Invites", + "success": "user(s) invited successfully", + "partialSuccess": "Some invites failed", + "allFailed": "Failed to invite users", + "error": "Failed to send invites" + }, + "directInvite": { + "tab": "Direct Create" + }, + "inviteLinkTab": { + "tab": "Invite Link" + }, + "inviteLink": { + "description": "Generate a secure link that allows the user to set their own password", + "email": "Email Address", + "emailPlaceholder": "user@example.com (optional)", + "emailDescription": "Optional - leave blank for a general invite link that can be used by anyone", + "emailRequired": "Email address is required", + "emailOptional": "Optional - leave blank for a general invite link", + "emailRequiredForSend": "Email address is required to send email notification", + "expiryHours": "Expiry Hours", + "expiryDescription": "How many hours until the link expires", + "sendEmail": "Send invite link via email", + "sendEmailDescription": "If enabled, the invite link will be sent to the specified email address", + "smtpRequired": "SMTP not configured", + "generate": "Generate Link", + "generated": "Invite Link Generated", + "copied": "Link copied to clipboard", + "success": "Invite link generated successfully", + "successWithEmail": "Invite link generated and sent via email", + "emailFailed": "Invite link generated, but email failed", + "emailFailedDetails": "Error: {0}. Please share the invite link manually.", + "error": "Failed to generate invite link", + "submit": "Generate Invite Link" + }, + "inviteMode": { + "username": "Username", + "email": "Email", + "link": "Link", + "emailDisabled": "Email invites require SMTP configuration and mail.enableInvites=true in settings" + }, + "license": { + "users": "users", + "availableSlots": "Available Slots", + "grandfathered": "Grandfathered", + "grandfatheredShort": "{{count}} grandfathered", + "fromLicense": "from license", + "slotsAvailable": "{{count}} user slot(s) available", + "noSlotsAvailable": "No slots available", + "currentUsage": "Currently using {{current}} of {{max}} user licences" + } + }, + "teams": { + "title": "Teams", + "description": "Manage teams and organize workspace members", + "loading": "Loading teams...", + "loadingDetails": "Loading team details...", + "createNewTeam": "Create New Team", + "teamName": "Team Name", + "totalMembers": "Total Members", + "actions": "Actions", + "noTeamsFound": "No teams found", + "noMembers": "No members in this team", + "system": "System", + "addMember": "Add Member", + "viewTeam": "View Team", + "removeMember": "Remove from team", + "cannotRemoveFromSystemTeam": "Cannot remove from system team", + "renameTeamLabel": "Rename Team", + "deleteTeamLabel": "Delete Team", + "cannotDeleteInternal": "Cannot delete the Internal team", + "confirmDelete": "Are you sure you want to delete this team? This team must be empty to delete.", + "confirmRemove": "Remove user from this team?", + "cannotRenameInternal": "Cannot rename the Internal team", + "cannotAddToInternal": "Cannot add members to the Internal team", + "teamNotFound": "Team not found", + "backToTeams": "Back to Teams", + "memberCount": "{{count}} members", + "removeMemberSuccess": "User removed from team", + "removeMemberError": "Failed to remove user from team", + "createTeam": { + "title": "Create New Team", + "teamName": "Team Name", + "teamNamePlaceholder": "Enter team name", + "cancel": "Cancel", + "submit": "Create Team", + "nameRequired": "Team name is required", + "success": "Team created successfully", + "error": "Failed to create team" + }, + "renameTeam": { + "title": "Rename Team", + "renaming": "Renaming:", + "newTeamName": "New Team Name", + "newTeamNamePlaceholder": "Enter new team name", + "cancel": "Cancel", + "submit": "Rename Team", + "nameRequired": "Team name is required", + "success": "Team renamed successfully", + "error": "Failed to rename team" + }, + "deleteTeam": { + "success": "Team deleted successfully", + "error": "Failed to delete team. Make sure the team is empty.", + "teamMustBeEmpty": "Team must be empty before deletion" + }, + "addMemberToTeam": { + "title": "Add Member to Team", + "addingTo": "Adding to", + "selectUser": "Select User", + "selectUserPlaceholder": "Choose a user", + "selectUserRequired": "Please select a user", + "currentlyIn": "currently in", + "willBeMoved": "Note: This user will be moved from their current team to this team.", + "cancel": "Cancel", + "submit": "Add Member", + "userRequired": "Please select a user", + "success": "Member added to team successfully", + "error": "Failed to add member to team" + }, + "changeTeam": { + "label": "Change Team", + "title": "Change Team", + "changing": "Moving", + "selectTeam": "Select Team", + "selectTeamPlaceholder": "Choose a team", + "selectTeamRequired": "Please select a team", + "success": "Team changed successfully", + "error": "Failed to change team", + "submit": "Change Team" + } + } + }, + "plan": { + "currency": "Currency", + "popular": "Popular", + "current": "Current Plan", + "upgrade": "Upgrade", + "contact": "Contact Us", + "customPricing": "Custom", + "showComparison": "Compare All Features", + "hideComparison": "Hide Feature Comparison", + "featureComparison": "Feature Comparison", + "activePlan": { + "title": "Active Plan", + "subtitle": "Your current subscription details" + }, + "availablePlans": { + "title": "Available Plans", + "subtitle": "Choose the plan that fits your needs" + }, + "static": { + "title": "Billing Information", + "message": "Online billing is not currently configured. To upgrade your plan or manage subscriptions, please contact us directly.", + "contactSales": "Contact Sales", + "contactToUpgrade": "Contact us to upgrade or customize your plan", + "maxUsers": "Max Users", + "upTo": "Up to" + }, + "period": { + "month": "month" + }, + "free": { + "name": "Free", + "highlight1": "Limited Tool Usage Per week", + "highlight2": "Access to all tools", + "highlight3": "Community support" + }, + "pro": { + "name": "Pro", + "highlight1": "Unlimited Tool Usage", + "highlight2": "Advanced PDF tools", + "highlight3": "No watermarks" + }, + "enterprise": { + "name": "Enterprise", + "highlight1": "Custom pricing", + "highlight2": "Dedicated support", + "highlight3": "Latest features" + }, + "feature": { + "title": "Feature", + "pdfTools": "Basic PDF Tools", + "fileSize": "File Size Limit", + "automation": "Automate tool workflows", + "api": "API Access", + "priority": "Priority Support", + "customPricing": "Custom Pricing" + } + }, + "subscription": { + "status": { + "active": "Active", + "pastDue": "Past Due", + "canceled": "Canceled", + "incomplete": "Incomplete", + "trialing": "Trial", + "none": "No Subscription" + }, + "renewsOn": "Renews on {{date}}", + "cancelsOn": "Cancels on {{date}}" + }, + "billing": { + "manageBilling": "Manage Billing", + "portal": { + "error": "Failed to open billing portal" + } + }, + "payment": { + "preparing": "Preparing your checkout...", + "upgradeTitle": "Upgrade to {{planName}}", + "success": "Payment Successful!", + "successMessage": "Your subscription has been activated successfully. You will receive a confirmation email shortly.", + "autoClose": "This window will close automatically...", + "error": "Payment Error" + }, + "firstLogin": { + "title": "First Time Login", + "welcomeTitle": "Welcome!", + "welcomeMessage": "For security reasons, you must change your password on your first login.", + "loggedInAs": "Logged in as", + "error": "Error", + "currentPassword": "Current Password", + "enterCurrentPassword": "Enter your current password", + "newPassword": "New Password", + "enterNewPassword": "Enter new password (min 8 characters)", + "confirmPassword": "Confirm New Password", + "reEnterNewPassword": "Re-enter new password", + "changePassword": "Change Password", + "allFieldsRequired": "All fields are required", + "passwordsDoNotMatch": "New passwords do not match", + "passwordTooShort": "Password must be at least 8 characters", + "passwordMustBeDifferent": "New password must be different from current password", + "passwordChangedSuccess": "Password changed successfully! Please log in again.", + "passwordChangeFailed": "Failed to change password. Please check your current password." + }, + "invite": { + "welcome": "Welcome to Stirling PDF", + "invalidToken": "Invalid invitation link", + "validationError": "Failed to validate invitation link", + "passwordRequired": "Password is required", + "passwordTooShort": "Password must be at least 6 characters", + "passwordMismatch": "Passwords do not match", + "acceptError": "Failed to create account", + "validating": "Validating invitation...", + "invalidInvitation": "Invalid Invitation", + "goToLogin": "Go to Login", + "welcomeTitle": "You've been invited!", + "welcomeSubtitle": "Complete your account setup to get started", + "accountFor": "Creating account for", + "linkExpires": "Link expires", + "email": "Email address", + "emailPlaceholder": "Enter your email address", + "emailRequired": "Email address is required", + "invalidEmail": "Invalid email address", + "choosePassword": "Choose a password", + "passwordPlaceholder": "Enter your password", + "confirmPassword": "Confirm password", + "confirmPasswordPlaceholder": "Re-enter your password", + "createAccount": "Create Account", + "creating": "Creating Account...", + "alreadyHaveAccount": "Already have an account?", + "signIn": "Sign in" + }, + "audit": { + "error": { + "title": "Error loading audit system" + }, + "notAvailable": "Audit system not available", + "notAvailableMessage": "The audit system is not configured or not available.", + "disabled": "Audit logging is disabled", + "disabledMessage": "Enable audit logging in your application configuration to track system events.", + "systemStatus": { + "title": "System Status", + "status": "Audit Logging", + "enabled": "Enabled", + "disabled": "Disabled", + "level": "Audit Level", + "retention": "Retention Period", + "days": "days", + "totalEvents": "Total Events" + }, + "tabs": { + "dashboard": "Dashboard", + "events": "Audit Events", + "export": "Export" + }, + "charts": { + "title": "Audit Dashboard", + "error": "Error loading charts", + "day": "Day", + "week": "Week", + "month": "Month", + "byType": "Events by Type", + "byUser": "Events by User", + "overTime": "Events Over Time" + }, + "events": { + "title": "Audit Events", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "error": "Error loading events", + "noEvents": "No events found", + "timestamp": "Timestamp", + "type": "Type", + "user": "User", + "ipAddress": "IP Address", + "actions": "Actions", + "viewDetails": "View Details", + "eventDetails": "Event Details", + "details": "Details" + }, + "export": { + "title": "Export Audit Data", + "description": "Export audit events to CSV or JSON format. Use filters to limit the exported data.", + "format": "Export Format", + "filters": "Filters (Optional)", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "exportButton": "Export Data", + "error": "Failed to export data" + } + }, + "usage": { + "noData": "No data available", + "error": "Error loading usage statistics", + "noDataMessage": "No usage statistics are currently available.", + "controls": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All", + "refresh": "Refresh", + "dataTypeLabel": "Data Type:", + "dataType": { + "all": "All", + "api": "API", + "ui": "UI" + } + }, + "showing": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All" + }, + "stats": { + "totalEndpoints": "Total Endpoints", + "totalVisits": "Total Visits", + "showing": "Showing", + "selectedVisits": "Selected Visits" + }, + "chart": { + "title": "Endpoint Usage Chart" + }, + "table": { + "title": "Detailed Statistics", + "endpoint": "Endpoint", + "visits": "Visits", + "percentage": "Percentage", + "noData": "No data available" + } + }, + "backendHealth": { + "checking": "Checking backend status...", + "online": "Backend Online", + "offline": "Backend Offline" + }, + "autoRedact": { + "tags": "Redact,Hide,black out,black,marker,hidden", + "title": "Auto Redact", + "header": "Auto Redact", + "colorLabel": "Color", + "textsToRedactLabel": "Text to Redact (line-separated)", + "textsToRedactPlaceholder": "e.g. \\nConfidential \\nTop-Secret", + "useRegexLabel": "Use Regex", + "wholeWordSearchLabel": "Whole Word Search", + "customPaddingLabel": "Custom Extra Padding", + "convertPDFToImageLabel": "Convert PDF to PDF-Image (Used to remove text behind the box)", + "submitButton": "Submit" + }, + "replaceColorPdf": { + "tags": "Replace Color,Page operations,Back end,server side" } } diff --git a/frontend/public/locales/es-ES/translation.json b/frontend/public/locales/es-ES/translation.json index b7315b217..266babc32 100644 --- a/frontend/public/locales/es-ES/translation.json +++ b/frontend/public/locales/es-ES/translation.json @@ -1,4 +1,40 @@ { + "toolPanel": { + "modePrompt": { + "title": "Choose how you browse tools", + "description": "Preview both layouts and decide how you want to explore Stirling PDF tools.", + "sidebarTitle": "Sidebar mode", + "sidebarDescription": "Keep tools alongside your workspace for quick switching.", + "recommended": "Recommended", + "chooseSidebar": "Use sidebar mode", + "fullscreenTitle": "Fullscreen mode - (legacy)", + "fullscreenDescription": "Browse every tool in a catalogue that covers the workspace until you pick one.", + "chooseFullscreen": "Use fullscreen mode", + "dismiss": "Maybe later" + }, + "fullscreen": { + "showDetails": "Show Details", + "comingSoon": "Coming soon:", + "favorite": "Add to favourites", + "favorites": "Favourites", + "heading": "All tools (fullscreen view)", + "noResults": "Try adjusting your search or toggle descriptions to find what you need.", + "recommended": "Recommended", + "unfavorite": "Remove from favourites" + }, + "placeholder": "Choose a tool to get started", + "toggle": { + "fullscreen": "Switch to fullscreen mode", + "sidebar": "Switch to sidebar mode" + } + }, + "unsavedChanges": "Tiene cambios sin guardar en su PDF. ÂŋQuÊ le gustaría hacer?", + "areYouSure": "Are you sure you want to leave?", + "unsavedChangesTitle": "Cambios sin Guardar", + "keepWorking": "Seguir trabajando", + "discardChanges": "Descartar cambios", + "applyAndContinue": "Aplicar y continuar", + "exportAndContinue": "Exportar y continuar", "language": { "direction": "ltr" }, @@ -18,8 +54,26 @@ "customTextDesc": "Texto personalizado", "numberPagesDesc": "QuÊ pÃĄginas numerar, por defecto 'todas', tambiÊn acepta 1-5 o 2,5,9 etc", "customNumberDesc": "Por defecto a {n}, tambiÊn acepta 'PÃĄgina {n} de {total}', 'Texto-{n}', '{filename}-{n}", - "submit": "AÃąadir NÃēmeros de PÃĄgina" + "submit": "AÃąadir NÃēmeros de PÃĄgina", + "configuration": "Configuration", + "customize": "Customize Appearance", + "pagesAndStarting": "Pages & Starting Number", + "positionAndPages": "Position & Pages", + "error": { + "failed": "Add page numbers operation failed" + }, + "results": { + "title": "Page Number Results" + }, + "preview": "Position Selection", + "previewDisclaimer": "Preview is approximate. Final output may vary due to PDF font metrics." }, + "pageSelectionPrompt": "SelecciÃŗn personalizada de pÃĄginas (Introduzca una lista de nÃēmeros de pÃĄgina separados por comas 1,5,6 o funciones como 2n+1):", + "startingNumberTooltip": "The first number to display. Subsequent pages will increment from this number.", + "marginTooltip": "Distance between the page number and the edge of the page.", + "fontSizeTooltip": "Size of the page number text in points. Larger numbers create bigger text.", + "fontTypeTooltip": "Font family for the page numbers. Choose based on your document style.", + "customTextTooltip": "Optional custom format for page numbers. Use {n} as placeholder for the number. Example: \"Page {n}\" will show \"Page 1\", \"Page 2\", etc.", "pdfPrompt": "Seleccionar PDF(s)", "multiPdfPrompt": "Seleccionar PDFs (2+)", "multiPdfDropPrompt": "Seleccione (o arrastre y suelte) todos los PDF que necesite", @@ -30,15 +84,41 @@ "uploadLimitExceededPlural": "son demasiado grandes. El tamaÃąo mÃĄximo permitido es", "processTimeWarning": "Advertencia: este proceso puede tardar hasta un minuto dependiendo del tamaÃąo del archivo", "pageOrderPrompt": "Orden personalizado de pÃĄginas (Introduzca una lista de nÃēmeros de pÃĄgina separados por coma o funciones como 2n+1):", - "pageSelectionPrompt": "SelecciÃŗn personalizada de pÃĄginas (Introduzca una lista de nÃēmeros de pÃĄgina separados por comas 1,5,6 o funciones como 2n+1):", "goToPage": "Ir a pÃĄgina", "true": "Verdadero", "false": "Falso", "unknown": "Desconocido", + "app": { + "description": "La alternativa gratuita a Adobe Acrobat (mÃĄs de 10 millones de descargas)" + }, "save": "Guardar", "saveToBrowser": "Guardar en el navegador", + "download": "Descargar", + "pin": "Pin File (keep active after tool run)", + "unpin": "Unpin File (replace after tool run)", + "undoOperationTooltip": "Haga clic para deshacer la Ãēltima operaciÃŗn y restaurar los archivos originales", + "undo": "Deshacer", + "moreOptions": "MÃĄs Opciones", + "editYourNewFiles": "Editar sus nuevos archivos", "close": "Cerrar", + "openInViewer": "Open in Viewer", + "confirmClose": "Confirm Close", + "confirmCloseMessage": "Are you sure you want to close this file?", + "confirmCloseCancel": "Cancel", + "confirmCloseConfirm": "Close File", + "fileSelected": "Archivo seleccionado: {{filename}}", + "chooseFile": "Elegir Archivo", "filesSelected": "{{count}} archivos seleccionados", + "files": { + "title": "Archivos", + "upload": "Cargar", + "uploadFiles": "Cargar Archivos", + "addFiles": "Agregar archivos", + "selectFromWorkbench": "Seleccione archivos del ÃĄrea de trabajo o ", + "selectMultipleFromWorkbench": "Seleccione al menos {{count}} archivos del ÃĄrea de trabajo o ", + "created": "Created", + "size": "File Size" + }, "noFavourites": "No se agregaron favoritos", "downloadComplete": "Descarga completada", "bored": "ÂŋAburrido de esperar?", @@ -56,7 +136,10 @@ }, "error": { "pdfPassword": "El documento PDF estÃĄ protegido con contraseÃąa y no se ha proporcionado o es incorrecta", + "encryptedPdfMustRemovePassword": "Este PDF estÃĄ cifrado o protegido con contraseÃąa. Por favor desbloquÊelo antes de convertir a PDF/A.", + "incorrectPasswordProvided": "La contraseÃąa del PDF es incorrecta o no fue proporcionada.", "_value": "Error", + "dismissAllErrors": "Descartar Todos los Errores", "sorry": "ÂĄDisculpe por el problema!", "needHelp": "ÂŋNecesita ayuda / EncontrÃŗ un fallo?", "contactTip": "Si sigue teniendo problemas, no dude en contactarnos para solicitar ayuda. Puede enviar un ticket en nuestra pÃĄgina de GitHub o contactarnos a travÊs de Discord:", @@ -69,11 +152,12 @@ "showStack": "Mostrar seguimiento de pila", "copyStack": "Copiar seguimiento de pila", "githubSubmit": "GitHub - Enviar un ticket", - "discordSubmit": "Discord - Enviar publicaciÃŗn de soporte", - "dismissAllErrors": "Descartar Todos los Errores", - "encryptedPdfMustRemovePassword": "Este PDF estÃĄ cifrado o protegido con contraseÃąa. Por favor desbloquÊelo antes de convertir a PDF/A.", - "incorrectPasswordProvided": "La contraseÃąa del PDF es incorrecta o no fue proporcionada." + "discordSubmit": "Discord - Enviar publicaciÃŗn de soporte" }, + "warning": { + "tooltipTitle": "Advertencia" + }, + "edit": "Editar", "delete": "Borrar", "username": "Nombre de usuario", "password": "ContraseÃąa", @@ -85,7 +169,8 @@ "green": "Verde", "blue": "Azul", "custom": "Personalizado...", - "WorkInProgress": "Tarea en progreso, puede no funcionar o ralentizarse; ÂĄpor favor, informe de cualquier problema!", + "comingSoon": "PrÃŗximamente", + "WorkInProgess": "Work in progress, May not work or be buggy, Please report any problems!", "poweredBy": "Desarrollado por", "yes": "Sí", "no": "No", @@ -118,18 +203,19 @@ "page": "PÃĄgina", "pages": "PÃĄginas", "loading": "Cargando...", + "review": "Revisar", "addToDoc": "Agregar al Documento", "reset": "Restablecer", "apply": "Aplicar", "noFileSelected": "No ha seleccionado ningÃēn archivo. Por favor, cargue uno.", "legal": { "privacy": "Política de Privacidad", + "iAgreeToThe": "Acepto todos los", "terms": "TÊrminos y Condiciones", "accessibility": "Accesibilidad", "cookie": "Política de Cookies", "impressum": "Aviso legal", - "showCookieBanner": "Preferencias de cookies", - "iAgreeToThe": "Acepto todos los" + "showCookieBanner": "Preferencias de cookies" }, "pipeline": { "header": "MenÃē de automatizaciÃŗn (Alfa)", @@ -164,6 +250,7 @@ "title": "ÂŋQuieres mejorar Stirling PDF?", "paragraph1": "Stirling PDF ha optado por analíticas para ayudarnos a mejorar el producto. No rastreamos ninguna informaciÃŗn personal ni contenido de archivos.", "paragraph2": "Considere habilitar analíticas para ayudar a Stirling-PDF a crecer y permitirnos comprender mejor a nuestros usuarios.", + "learnMore": "Learn more", "enable": "Habilitar analíticas", "disable": "Deshabilitar analíticas", "settings": "Puede cambiar la configuraciÃŗn de analíticas en el archivo config/settings.yml" @@ -207,6 +294,54 @@ "cacheInputs": { "name": "Guardar entradas del formulario", "help": "Habilitar guardar entradas previamente utilizadas para futuras acciones" + }, + "general": { + "title": "General", + "description": "Configure general application preferences.", + "account": "Account", + "accountDescription": "Manage your account settings", + "user": "User", + "signedInAs": "Signed in as", + "logout": "Log out", + "enableFeatures": { + "title": "For System Administrators", + "intro": "Enable user authentication, team management, and workspace features for your organization.", + "action": "Configure", + "and": "and", + "benefit": "Enables user roles, team collaboration, admin controls, and enterprise features.", + "learnMore": "Learn more in documentation", + "dismiss": "Dismiss" + }, + "autoUnzip": "Auto-unzip API responses", + "autoUnzipDescription": "Automatically extract files from ZIP responses", + "autoUnzipTooltip": "Automatically extract ZIP files returned from API operations. Disable to keep ZIP files intact. This does not affect automation workflows.", + "autoUnzipFileLimit": "Auto-unzip file limit", + "autoUnzipFileLimitDescription": "Maximum number of files to extract from ZIP", + "autoUnzipFileLimitTooltip": "Only unzip if the ZIP contains this many files or fewer. Set higher to extract larger ZIPs.", + "defaultToolPickerMode": "Default tool picker mode", + "defaultToolPickerModeDescription": "Choose whether the tool picker opens in fullscreen or sidebar by default", + "mode": { + "fullscreen": "Fullscreen", + "sidebar": "Sidebar" + } + }, + "hotkeys": { + "title": "Keyboard Shortcuts", + "description": "Hover a tool to see its shortcut or customise it below. Click \"Change shortcut\" and press a new key combination. Press Esc to cancel.", + "errorModifier": { + "mac": "Include ⌘ (Command), âŒĨ (Option), or another modifier in your shortcut.", + "windows": "Include Ctrl, Alt, or another modifier in your shortcut." + }, + "errorConflict": "Shortcut already used by {{tool}}.", + "none": "Not assigned", + "customBadge": "Custom", + "defaultLabel": "Default: {{shortcut}}", + "capturing": "Press keysâ€Ļ (Esc to cancel)", + "change": "Change shortcut", + "reset": "Reset", + "shortcut": "Shortcut", + "noShortcut": "No shortcut set", + "searchPlaceholder": "Search tools..." } }, "changeCreds": { @@ -278,8 +413,10 @@ "top20": "Top 20", "all": "Todas", "refresh": "Refrescar", - "includeHomepage": "Incluir pÃĄgina de inicio ('/')", - "includeLoginPage": "Incluir pÃĄgina de inicio de sesiÃŗn ('/login')", + "dataTypeLabel": "Data Type:", + "dataTypeAll": "All", + "dataTypeApi": "API", + "dataTypeUi": "UI", "totalEndpoints": "Funciones totales", "totalVisits": "Visitas totales", "showing": "Mostrando", @@ -294,7 +431,9 @@ "top": "Lo mÃĄs usado", "numberOfVisits": "NÃēmero de visitas", "visitsTooltip": "Visitas: {0} ({1}% del total)", - "retry": "Reintentar" + "retry": "Reintentar", + "includeHomepage": "Incluir pÃĄgina de inicio ('/')", + "includeLoginPage": "Incluir pÃĄgina de inicio de sesiÃŗn ('/login')" }, "database": { "title": "Importar/Exportar base de datos", @@ -335,25 +474,309 @@ "alphabetical": "AlfabÊtico", "globalPopularity": "Las mÃĄs populares", "sortBy": "Ordenado por:", + "mobile": { + "brandAlt": "Stirling PDF logo", + "openFiles": "Open files", + "swipeHint": "Swipe left or right to switch views", + "tools": "Tools", + "toolsSlide": "Tool selection panel", + "viewSwitcher": "Switch workspace view", + "workbenchSlide": "Workspace panel", + "workspace": "Workspace" + }, "multiTool": { + "tags": "mÃēltiple,herramientas", "title": "Multi-herramienta PDF", - "desc": "Combinar, rotar, reorganizar y eliminar pÃĄginas", - "tags": "mÃēltiple,herramientas" + "desc": "Combinar, rotar, reorganizar y eliminar pÃĄginas" }, "merge": { + "tags": "combinar,unir,juntar", "title": "Unir", - "desc": "Unir fÃĄcilmente mÃēltiples PDFs en uno", - "tags": "combinar,unir,juntar" + "desc": "Unir fÃĄcilmente mÃēltiples PDFs en uno" }, "split": { + "tags": "dividir,separar,partir", "title": "Dividir", - "desc": "Dividir PDFs en mÃēltiples documentos", - "tags": "dividir,separar,partir" + "desc": "Dividir PDFs en mÃēltiples documentos" }, "rotate": { + "tags": "girar,voltear,orientar", "title": "Rotar", - "desc": "Rotar fÃĄcilmente sus PDFs", - "tags": "girar,voltear,orientar" + "desc": "Rotar fÃĄcilmente sus PDFs" + }, + "convert": { + "tags": "transformar,cambiar", + "title": "Convertir", + "desc": "Convertir archivos entre diferentes formatos" + }, + "pdfOrganiser": { + "tags": "organizar,reorganizar,reordenar", + "title": "Organizador", + "desc": "Eliminar o reorganizar pÃĄginas en cualquier orden" + }, + "addImage": { + "tags": "insertar,incrustar,colocar", + "title": "Agregar imagen al PDF", + "desc": "Agregar una imagen en el PDF en una ubicaciÃŗn establecida (en desarrollo)" + }, + "addAttachments": { + "tags": "incrustar,adjuntar,incluir", + "title": "Agregar Adjuntos", + "desc": "Agregar o eliminar archivos incrustados (adjuntos) a/desde un PDF" + }, + "watermark": { + "tags": "sello,marca,superposiciÃŗn", + "title": "AÃąadir marca de agua", + "desc": "Agregar marcas de agua de texto o imagen a archivos PDF" + }, + "removePassword": { + "tags": "desbloquear", + "title": "Quitar contraseÃąa", + "desc": "Quitar protecciÃŗn por contraseÃąa del documento PDF" + }, + "compress": { + "tags": "reducir,disminuir,optimizar", + "title": "Comprimir", + "desc": "Comprimir PDFs para reducir el tamaÃąo del archivo" + }, + "unlockPDFForms": { + "tags": "desbloquear,habilitar,editar", + "title": "Desbloquear Formularios PDF", + "desc": "Elimine la propiedad de solo lectura de los campos de formulario en un documento PDF." + }, + "changeMetadata": { + "tags": "editar,modificar,actualizar", + "title": "Cambiar metadatos", + "desc": "Cambiar, eliminar o agregar metadatos del documento PDF" + }, + "ocr": { + "tags": "extraer,escanear", + "title": "Ejecutar OCR en PDF y/o tareas de limpieza", + "desc": "Limpiar escaneos y detectar texto en imÃĄgenes dentro de un PDF para volver a agregarlo como texto editable" + }, + "extractImages": { + "tags": "extraer,guardar,exportar", + "title": "Extraer imÃĄgenes", + "desc": "Extraer todas las imÃĄgenes de un PDF y guardarlas en ZIP" + }, + "scannerImageSplit": { + "tags": "detectar,dividir,fotos", + "title": "Detectar y Dividir Fotos Escaneadas", + "desc": "Detecte y divida fotos escaneadas en pÃĄginas separadas" + }, + "sign": { + "tags": "firma,autÃŗgrafo", + "title": "Firmar", + "desc": "AÃąadir firma a PDF mediante dibujo, texto o imagen" + }, + "flatten": { + "tags": "simplificar,eliminar,interactivo", + "title": "Eliminar interactividad", + "desc": "Eliminar todos los elementos interactivos y formularios de un PDF" + }, + "certSign": { + "tags": "autenticar,PEM,P12,oficial,cifrar,firmar,certificado,PKCS12,JKS,servidor,manual,auto", + "title": "Firmar con certificado", + "desc": "Firmar un PDF con certificado/clave digital (PEM/P12)" + }, + "repair": { + "tags": "reparar,restaurar", + "title": "Reparar", + "desc": "Intentar reparar un PDF corrupto/roto" + }, + "removeBlanks": { + "tags": "eliminar,limpiar,vacío", + "title": "Eliminar pÃĄginas en blanco", + "desc": "Detectar y eliminar pÃĄginas en blanco de un documento" + }, + "removeAnnotations": { + "tags": "eliminar,limpiar,quitar", + "title": "Eliminar Anotaciones", + "desc": "Eliminar todos los comentarios/anotaciones de un PDF" + }, + "compare": { + "tags": "diferencia", + "title": "Comparar", + "desc": "Comparar y mostrar las diferencias entre 2 documentos PDF" + }, + "removeCertSign": { + "tags": "eliminar,borrar,desbloquear", + "title": "Quitar firma de certificado", + "desc": "Eliminar firma de certificado del PDF" + }, + "pageLayout": { + "tags": "diseÃąo,organizar,combinar", + "title": "DiseÃąo de varias pÃĄginas", + "desc": "Combinar mÃēltiples pÃĄginas de un documento PDF en una sola pÃĄgina" + }, + "bookletImposition": { + "tags": "folleto,imprimir,encuadernaciÃŗn", + "title": "ImposiciÃŗn de Folleto", + "desc": "Crear folletos con ordenamiento de pÃĄginas adecuado para impresiÃŗn y encuadernaciÃŗn" + }, + "scalePages": { + "tags": "redimensionar,ajustar,escalar", + "title": "Escalar/ajustar tamaÃąo de pÃĄgina", + "desc": "Escalar/cambiar el tamaÃąo de una pagina y/o su contenido" + }, + "addPageNumbers": { + "tags": "nÃēmero,paginaciÃŗn,contar", + "title": "AÃąadir nÃēmeros de pÃĄgina", + "desc": "AÃąadir nÃēmeros de pÃĄgina en un documento en una ubicaciÃŗn concreta" + }, + "autoRename": { + "tags": "auto-detectar,basado-en-encabezado,organizar,reetiquetar", + "title": "Renombrar AutomÃĄticamente Archivo PDF", + "desc": "Renombra automÃĄticamente un archivo PDF basÃĄndose en su encabezado detectado" + }, + "adjustContrast": { + "tags": "contraste,brillo,saturaciÃŗn", + "title": "Ajustar Color/Contraste", + "desc": "Ajustar Contraste, SaturaciÃŗn y Brillo de un PDF" + }, + "crop": { + "tags": "recortar,cortar,redimensionar", + "title": "Recortar PDF", + "desc": "Recortar un PDF para reducir su tamaÃąo (ÂĄconservando el texto!)" + }, + "autoSplitPDF": { + "tags": "auto,dividir,QR", + "title": "Auto Dividir PÃĄginas", + "desc": "Dividir automÃĄticamente PDF escaneado usando cÃŗdigos QR divisores" + }, + "sanitize": { + "tags": "limpiar,purgar,eliminar", + "title": "Desinfectar", + "desc": "Eliminar elementos potencialmente peligrosos de archivos PDF" + }, + "getPdfInfo": { + "tags": "info,metadatos,detalles", + "title": "Obtener toda la informaciÃŗn en PDF", + "desc": "Obtiene toda la informaciÃŗn posible de archivos PDF" + }, + "pdfToSinglePage": { + "tags": "combinar,fusionar,individual", + "title": "PDF a una sola pÃĄgina", + "desc": "Unir todas las pÃĄginas del PDF en una sola pÃĄgina" + }, + "showJS": { + "tags": "javascript,cÃŗdigo,script", + "title": "Mostrar Javascript", + "desc": "Busca y muestra cualquier JS contenido en un PDF" + }, + "redact": { + "tags": "censurar,ocultar,tapar", + "title": "Redactar", + "desc": "Ocultar texto confidencial en PDF" + }, + "splitBySections": { + "tags": "dividir,secciones,separar", + "title": "Dividir PDF por Secciones", + "desc": "Divida cada pÃĄgina de un PDF en secciones horizontales y verticales mÃĄs pequeÃąas" + }, + "addStamp": { + "tags": "sello,marca,timbre", + "title": "Agregar Sello a PDF", + "desc": "Agregar sellos de texto o imagen en ubicaciones establecidas" + }, + "removeImage": { + "tags": "eliminar,borrar,limpiar", + "title": "Eliminar imagen", + "desc": "Eliminar imagen del PDF para reducir el tamaÃąo de archivo" + }, + "splitByChapters": { + "tags": "dividir,capítulos,estructura", + "title": "Dividir PDF por capítulos", + "desc": "Divida un PDF en varios archivos segÃēn su estructura de capítulos." + }, + "validateSignature": { + "tags": "validar,verificar,certificado", + "title": "Validar firma del PDF", + "desc": "Verificar firmas digitales y certificados en documentos PDF" + }, + "swagger": { + "tags": "API,documentaciÃŗn,prueba", + "title": "DocumentaciÃŗn de API", + "desc": "Vea la documentaciÃŗn de la API y pruebe los endpoints" + }, + "scannerEffect": { + "tags": "escanear,simular,crear", + "title": "Efecto de EscÃĄner", + "desc": "Cree un PDF que parezca escaneado" + }, + "editTableOfContents": { + "tags": "marcadores,contenidos,editar", + "title": "Editar Tabla de Contenidos", + "desc": "Agregar o editar marcadores y tabla de contenidos en documentos PDF" + }, + "manageCertificates": { + "tags": "certificados,importar,exportar", + "title": "Administrar Certificados", + "desc": "Importar, exportar o eliminar archivos de certificados digitales utilizados para firmar PDFs." + }, + "read": { + "tags": "ver,abrir,mostrar", + "title": "Leer", + "desc": "Ver y anotar PDFs. Resaltar texto, dibujar o insertar comentarios para revisiÃŗn y colaboraciÃŗn." + }, + "reorganizePages": { + "tags": "reorganizar,reordenar,organizar", + "title": "Reorganizar PÃĄginas", + "desc": "Reorganice, duplique o elimine pÃĄginas PDF con control visual de arrastrar y soltar." + }, + "extractPages": { + "tags": "extraer,seleccionar,copiar", + "title": "Extraer PÃĄginas", + "desc": "Extraer pÃĄginas específicas de un documento PDF" + }, + "removePages": { + "tags": "eliminar,extraer,excluir", + "title": "Eliminar", + "desc": "Eliminar pÃĄginas no deseadas del documento PDF" + }, + "autoSizeSplitPDF": { + "tags": "auto,dividir,tamaÃąo", + "title": "Auto dividir por tamaÃąo/conteo", + "desc": "Divide un solo PDF en mÃēltiples documentos segÃēn su tamaÃąo, nÃēmero de pÃĄginas, o nÃēmero de documento" + }, + "replaceColor": { + "title": "Reemplazar e Invertir Color", + "desc": "Reemplace o invierta colores en documentos PDF" + }, + "devApi": { + "tags": "API,desarrollo,documentaciÃŗn", + "title": "API", + "desc": "Enlace a la documentaciÃŗn de API" + }, + "devFolderScanning": { + "tags": "automatizaciÃŗn,carpeta,escaneo", + "title": "Escaneo Automatizado de Carpetas", + "desc": "Enlace a la guía de escaneo automatizado de carpetas" + }, + "devSsoGuide": { + "title": "Guía de SSO", + "desc": "Enlace a la guía de SSO" + }, + "devAirgapped": { + "title": "ConfiguraciÃŗn Aislada", + "desc": "Enlace a la guía de configuraciÃŗn aislada" + }, + "addPassword": { + "title": "Proteger con contraseÃąa", + "desc": "Cifrar documento PDF con contraseÃąa" + }, + "changePermissions": { + "title": "Cambiar permisos", + "desc": "Modificar restricciones y permisos del documento" + }, + "automate": { + "tags": "flujo-de-trabajo,secuencia,automatizaciÃŗn", + "title": "Automatizar", + "desc": "Crear flujos de trabajo de mÃēltiples pasos encadenando acciones de PDF. Ideal para tareas recurrentes." + }, + "overlay-pdfs": { + "desc": "Superponer PDFs encima de otro PDF", + "title": "Superponer PDFs" }, "imageToPDF": { "title": "Imagen a PDF", @@ -363,21 +786,6 @@ "title": "PDF a Imagen", "desc": "Convertir un PDF a una imagen (PNG, JPEG, GIF)" }, - "pdfOrganiser": { - "title": "Organizador", - "desc": "Eliminar o reorganizar pÃĄginas en cualquier orden", - "tags": "organizar,reorganizar,reordenar" - }, - "addImage": { - "title": "Agregar imagen al PDF", - "desc": "Agregar una imagen en el PDF en una ubicaciÃŗn establecida (en desarrollo)", - "tags": "insertar,incrustar,colocar" - }, - "watermark": { - "title": "AÃąadir marca de agua", - "desc": "Agregar marcas de agua de texto o imagen a archivos PDF", - "tags": "sello,marca,superposiciÃŗn" - }, "permissions": { "title": "Cambiar permisos", "desc": "Cambiar los permisos del documento PDF" @@ -386,44 +794,10 @@ "title": "Eliminar pÃĄginas", "desc": "Eliminar pÃĄginas no deseadas del documento PDF" }, - "addPassword": { - "title": "Proteger con contraseÃąa", - "desc": "Cifrar documento PDF con contraseÃąa" - }, - "removePassword": { - "title": "Quitar contraseÃąa", - "desc": "Quitar protecciÃŗn por contraseÃąa del documento PDF", - "tags": "desbloquear" - }, - "compress": { - "title": "Comprimir", - "desc": "Comprimir PDFs para reducir el tamaÃąo del archivo", - "tags": "reducir,disminuir,optimizar" - }, - "unlockPDFForms": { - "title": "Desbloquear Formularios PDF", - "desc": "Elimine la propiedad de solo lectura de los campos de formulario en un documento PDF.", - "tags": "desbloquear,habilitar,editar" - }, - "changeMetadata": { - "title": "Cambiar metadatos", - "desc": "Cambiar, eliminar o agregar metadatos del documento PDF", - "tags": "editar,modificar,actualizar" - }, "fileToPDF": { "title": "Convertir archivo a PDF", "desc": "Convertir casi cualquier archivo a PDF (DOCX, PNG, XLS, PPT, TXT y mÃĄs)" }, - "ocr": { - "title": "Ejecutar OCR en PDF y/o tareas de limpieza", - "desc": "Limpiar escaneos y detectar texto en imÃĄgenes dentro de un PDF para volver a agregarlo como texto editable", - "tags": "extraer,escanear" - }, - "extractImages": { - "title": "Extraer imÃĄgenes", - "desc": "Extraer todas las imÃĄgenes de un PDF y guardarlas en ZIP", - "tags": "extraer,guardar,exportar" - }, "pdfToPDFA": { "title": "Convertir PDF a PDF/A", "desc": "Convertir PDF a PDF/A para almacenamiento a largo plazo y cumplimiento de estÃĄndares" @@ -452,84 +826,14 @@ "title": "Detectar/Dividir fotos escaneadas", "desc": "Dividir varias fotos dentro de una foto/PDF" }, - "sign": { - "title": "Firmar", - "desc": "AÃąadir firma a PDF mediante dibujo, texto o imagen", - "tags": "firma,autÃŗgrafo" - }, - "flatten": { - "title": "Eliminar interactividad", - "desc": "Eliminar todos los elementos interactivos y formularios de un PDF", - "tags": "simplificar,eliminar,interactivo" - }, - "repair": { - "title": "Reparar", - "desc": "Intentar reparar un PDF corrupto/roto", - "tags": "reparar,restaurar" - }, - "removeBlanks": { - "title": "Eliminar pÃĄginas en blanco", - "desc": "Detectar y eliminar pÃĄginas en blanco de un documento", - "tags": "eliminar,limpiar,vacío" - }, - "removeAnnotations": { - "title": "Eliminar Anotaciones", - "desc": "Eliminar todos los comentarios/anotaciones de un PDF", - "tags": "eliminar,limpiar,quitar" - }, - "compare": { - "title": "Comparar", - "desc": "Comparar y mostrar las diferencias entre 2 documentos PDF", - "tags": "diferencia" - }, - "certSign": { - "title": "Firmar con certificado", - "desc": "Firmar un PDF con certificado/clave digital (PEM/P12)", - "tags": "autenticar,PEM,P12,oficial,cifrar,firmar,certificado,PKCS12,JKS,servidor,manual,auto" - }, - "removeCertSign": { - "title": "Quitar firma de certificado", - "desc": "Eliminar firma de certificado del PDF", - "tags": "eliminar,borrar,desbloquear" - }, - "pageLayout": { - "title": "DiseÃąo de varias pÃĄginas", - "desc": "Combinar mÃēltiples pÃĄginas de un documento PDF en una sola pÃĄgina", - "tags": "diseÃąo,organizar,combinar" - }, - "scalePages": { - "title": "Escalar/ajustar tamaÃąo de pÃĄgina", - "desc": "Escalar/cambiar el tamaÃąo de una pagina y/o su contenido", - "tags": "redimensionar,ajustar,escalar" - }, "pipeline": { "title": "AutomatizaciÃŗn", "desc": "Ejecutar varias tareas a PDFs definiendo una secuencia de comandos" }, - "addPageNumbers": { - "title": "AÃąadir nÃēmeros de pÃĄgina", - "desc": "AÃąadir nÃēmeros de pÃĄgina en un documento en una ubicaciÃŗn concreta", - "tags": "nÃēmero,paginaciÃŗn,contar" - }, "auto-rename": { "title": "Renombrar archivo automÃĄticamente", "desc": "Renombrar automÃĄticamente un archivo PDF segÃēn el encabezamiento detectado" }, - "adjustContrast": { - "title": "Ajustar Color/Contraste", - "desc": "Ajustar Contraste, SaturaciÃŗn y Brillo de un PDF", - "tags": "contraste,brillo,saturaciÃŗn" - }, - "crop": { - "title": "Recortar PDF", - "desc": "Recortar un PDF para reducir su tamaÃąo (ÂĄconservando el texto!)", - "tags": "recortar,cortar,redimensionar" - }, - "autoSplitPDF": { - "title": "Auto Dividir PÃĄginas", - "desc": "Dividir automÃĄticamente PDF escaneado usando cÃŗdigos QR divisores", - "tags": "auto,dividir,QR" - }, "sanitizePDF": { "title": "Desinfectar", "desc": "Eliminar scripts y otros elementos de los archivos PDF" @@ -550,34 +854,14 @@ "title": "PDF a Markdown", "desc": "Convierte cualquier PDF a Markdown" }, - "getPdfInfo": { - "title": "Obtener toda la informaciÃŗn en PDF", - "desc": "Obtiene toda la informaciÃŗn posible de archivos PDF", - "tags": "info,metadatos,detalles" - }, "pageExtracter": { "title": "Extraer pÃĄgina(s)", "desc": "Extraer las pÃĄginas seleccionadas del PDF" }, - "pdfToSinglePage": { - "title": "PDF a una sola pÃĄgina", - "desc": "Unir todas las pÃĄginas del PDF en una sola pÃĄgina", - "tags": "combinar,fusionar,individual" - }, - "showJS": { - "title": "Mostrar Javascript", - "desc": "Busca y muestra cualquier JS contenido en un PDF", - "tags": "javascript,cÃŗdigo,script" - }, "autoRedact": { "title": "Auto Redactar", "desc": "Redactar automÃĄticamente (ocultar) texto en un PDF segÃēn el texto introducido" }, - "redact": { - "title": "Redactar", - "desc": "Ocultar texto confidencial en PDF", - "tags": "censurar,ocultar,tapar" - }, "PDFToCSV": { "title": "PDF a CSV", "desc": "Extraer Tablas de un PDF convirtiÊndolas a CSV" @@ -586,10 +870,6 @@ "title": "Auto dividir por tamaÃąo/conteo", "desc": "Divide un solo PDF en mÃēltiples documentos segÃēn su tamaÃąo, nÃēmero de pÃĄginas, o nÃēmero de documento" }, - "overlay-pdfs": { - "title": "Superponer PDFs", - "desc": "Superponer PDFs encima de otro PDF" - }, "split-by-sections": { "title": "Dividir PDF por Secciones", "desc": "Dividir cada pÃĄgina de un PDF en secciones verticales y horizontales mÃĄs pequeÃąas" @@ -598,52 +878,17 @@ "title": "AÃąadir Sello a PDF", "desc": "AÃąadir texto o sello de imagen en ubicaciones específicas" }, - "removeImage": { - "title": "Eliminar imagen", - "desc": "Eliminar imagen del PDF para reducir el tamaÃąo de archivo", - "tags": "eliminar,borrar,limpiar" - }, - "splitByChapters": { - "title": "Dividir PDF por capítulos", - "desc": "Divida un PDF en varios archivos segÃēn su estructura de capítulos.", - "tags": "dividir,capítulos,estructura" - }, - "validateSignature": { - "title": "Validar firma del PDF", - "desc": "Verificar firmas digitales y certificados en documentos PDF", - "tags": "validar,verificar,certificado" - }, "replace-color": { "title": "Reemplazar e Invertir Color", "desc": "Reemplaza el color del texto y el fondo en el PDF e invierte el color completo del PDF para reducir el tamaÃąo del archivo" }, - "convert": { - "title": "Convertir", - "desc": "Convertir archivos entre diferentes formatos", - "tags": "transformar,cambiar" - }, "attachments": { "title": "Add attachments" }, - "extractPages": { - "title": "Extraer PÃĄginas", - "desc": "Extraer pÃĄginas específicas de un documento PDF", - "tags": "extraer,seleccionar,copiar" - }, - "removePages": { - "title": "Eliminar", - "desc": "Eliminar pÃĄginas no deseadas del documento PDF", - "tags": "eliminar,extraer,excluir" - }, "removeImagePdf": { "title": "Eliminar imagen", "desc": "Eliminar imagen del PDF> para reducir el tamaÃąo de archivo" }, - "autoSizeSplitPDF": { - "title": "Auto dividir por tamaÃąo/conteo", - "desc": "Divide un solo PDF en mÃēltiples documentos segÃēn su tamaÃąo, nÃēmero de pÃĄginas, o nÃēmero de documento", - "tags": "auto,dividir,tamaÃąo" - }, "adjust-contrast": { "title": "Ajustar Color/Contraste", "desc": "Ajustar Contraste, SaturaciÃŗn y Brillo de un PDF" @@ -652,108 +897,16 @@ "title": "Reemplazar e Invertir Color", "desc": "Reemplaza el color del texto y el fondo en el PDF e invierte el color completo del PDF para reducir el tamaÃąo del archivo" }, - "changePermissions": { - "title": "Cambiar permisos", - "desc": "Modificar restricciones y permisos del documento" - }, - "addAttachments": { - "desc": "Agregar o eliminar archivos incrustados (adjuntos) a/desde un PDF", - "tags": "incrustar,adjuntar,incluir", - "title": "Agregar Adjuntos" - }, - "addStamp": { - "desc": "Agregar sellos de texto o imagen en ubicaciones establecidas", - "tags": "sello,marca,timbre", - "title": "Agregar Sello a PDF" - }, - "autoRename": { - "desc": "Renombra automÃĄticamente un archivo PDF basÃĄndose en su encabezado detectado", - "tags": "auto-detectar,basado-en-encabezado,organizar,reetiquetar", - "title": "Renombrar AutomÃĄticamente Archivo PDF" - }, - "automate": { - "desc": "Crear flujos de trabajo de mÃēltiples pasos encadenando acciones de PDF. Ideal para tareas recurrentes.", - "tags": "flujo-de-trabajo,secuencia,automatizaciÃŗn", - "title": "Automatizar" - }, - "bookletImposition": { - "desc": "Crear folletos con ordenamiento de pÃĄginas adecuado para impresiÃŗn y encuadernaciÃŗn", - "tags": "folleto,imprimir,encuadernaciÃŗn", - "title": "ImposiciÃŗn de Folleto" - }, - "devAirgapped": { - "desc": "Enlace a la guía de configuraciÃŗn aislada", - "title": "ConfiguraciÃŗn Aislada" - }, - "devApi": { - "desc": "Enlace a la documentaciÃŗn de API", - "tags": "API,desarrollo,documentaciÃŗn", - "title": "API" - }, - "devFolderScanning": { - "desc": "Enlace a la guía de escaneo automatizado de carpetas", - "tags": "automatizaciÃŗn,carpeta,escaneo", - "title": "Escaneo Automatizado de Carpetas" - }, - "devSsoGuide": { - "desc": "Enlace a la guía de SSO", - "title": "Guía de SSO" - }, - "editTableOfContents": { - "desc": "Agregar o editar marcadores y tabla de contenidos en documentos PDF", - "tags": "marcadores,contenidos,editar", - "title": "Editar Tabla de Contenidos" - }, - "manageCertificates": { - "desc": "Importar, exportar o eliminar archivos de certificados digitales utilizados para firmar PDFs.", - "tags": "certificados,importar,exportar", - "title": "Administrar Certificados" - }, "overlayPdfs": { "desc": "Superpone PDFs sobre otro PDF", "tags": "superponer,combinar,apilar", "title": "Superponer PDFs" - }, - "read": { - "desc": "Ver y anotar PDFs. Resaltar texto, dibujar o insertar comentarios para revisiÃŗn y colaboraciÃŗn.", - "tags": "ver,abrir,mostrar", - "title": "Leer" - }, - "reorganizePages": { - "desc": "Reorganice, duplique o elimine pÃĄginas PDF con control visual de arrastrar y soltar.", - "tags": "reorganizar,reordenar,organizar", - "title": "Reorganizar PÃĄginas" - }, - "replaceColor": { - "desc": "Reemplace o invierta colores en documentos PDF", - "title": "Reemplazar e Invertir Color" - }, - "sanitize": { - "desc": "Eliminar elementos potencialmente peligrosos de archivos PDF", - "tags": "limpiar,purgar,eliminar", - "title": "Desinfectar" - }, - "scannerEffect": { - "desc": "Cree un PDF que parezca escaneado", - "tags": "escanear,simular,crear", - "title": "Efecto de EscÃĄner" - }, - "scannerImageSplit": { - "desc": "Detecte y divida fotos escaneadas en pÃĄginas separadas", - "tags": "detectar,dividir,fotos", - "title": "Detectar y Dividir Fotos Escaneadas" - }, - "splitBySections": { - "desc": "Divida cada pÃĄgina de un PDF en secciones horizontales y verticales mÃĄs pequeÃąas", - "tags": "dividir,secciones,separar", - "title": "Dividir PDF por Secciones" - }, - "swagger": { - "desc": "Vea la documentaciÃŗn de la API y pruebe los endpoints", - "tags": "API,documentaciÃŗn,prueba", - "title": "DocumentaciÃŗn de API" } }, + "landing": { + "addFiles": "Agregar Archivos", + "uploadFromComputer": "Cargar desde el ordenador" + }, "viewPdf": { "tags": "ver,leer,anotar,texto,imagen", "title": "Ver/Editar PDF", @@ -787,38 +940,39 @@ "merge": { "tags": "Unir,Operaciones de pÃĄgina,Back end,Backend", "title": "Unir", - "header": "Unir mÃēltiples PDFs (2+)", - "sortByName": "Ordenar por nombre", - "sortByDate": "Ordenar por fecha", - "removeCertSign": "ÂŋEliminar la firma digital en el archivo unido?", + "removeDigitalSignature": { + "label": "ÂŋEliminar la firma digital en el archivo combinado?", + "tooltip": { + "title": "Eliminar Firma Digital", + "description": "Las firmas digitales se invalidarÃĄn al combinar archivos. Marque esto para eliminarlas del PDF combinado final." + } + }, + "generateTableOfContents": { + "label": "ÂŋGenerar tabla de contenidos en el archivo combinado?", + "tooltip": { + "title": "Generar Tabla de Contenidos", + "description": "Crea automÃĄticamente una tabla de contenidos seleccionable en el PDF combinado basada en los nombres de archivo originales y los nÃēmeros de pÃĄgina." + } + }, "submit": "Unir", "sortBy": { - "filename": "Nombre de Archivo", - "ascending": "Ascendente", - "dateModified": "Fecha de ModificaciÃŗn", - "descending": "Descendente", "description": "Los archivos se combinarÃĄn en el orden en que se seleccionen. Arrastre para reordenar o ordene a continuaciÃŗn.", "label": "Ordenar Por", + "filename": "Nombre de Archivo", + "dateModified": "Fecha de ModificaciÃŗn", + "ascending": "Ascendente", + "descending": "Descendente", "sort": "Ordenar" }, "error": { "failed": "Se produjo un error al combinar los PDF." }, - "generateTableOfContents": { - "tooltip": { - "description": "Crea automÃĄticamente una tabla de contenidos seleccionable en el PDF combinado basada en los nombres de archivo originales y los nÃēmeros de pÃĄgina.", - "title": "Generar Tabla de Contenidos" - } - }, - "removeDigitalSignature": { - "tooltip": { - "description": "Las firmas digitales se invalidarÃĄn al combinar archivos. Marque esto para eliminarlas del PDF combinado final.", - "title": "Eliminar Firma Digital" - } - } + "header": "Unir mÃēltiples PDFs (2+)", + "sortByName": "Ordenar por nombre", + "sortByDate": "Ordenar por fecha", + "removeCertSign": "ÂŋEliminar la firma digital en el archivo unido?" }, "split": { - "tags": "Operaciones de pÃĄgina,dividir,Multi-pÃĄgina,cortar,Backend", "title": "Dividir PDF", "header": "Dividir PDF", "desc": { @@ -834,63 +988,11 @@ "splitPages": "Introducir las pÃĄginas para dividir:", "submit": "Dividir", "steps": { - "settings": "ConfiguraciÃŗn", - "chooseMethod": "Elegir MÊtodo" + "chooseMethod": "Elegir MÊtodo", + "settings": "ConfiguraciÃŗn" }, - "methods": { - "bySize": { - "name": "TamaÃąo de archivo", - "desc": "Limitar tamaÃąo mÃĄximo de archivo", - "tooltip": "Especificar tamaÃąo mÃĄximo de archivo (ej. 10MB, 500KB)" - }, - "byChapters": { - "desc": "Dividir en límites de marcadores", - "name": "Capítulos", - "tooltip": "Usa marcadores de PDF para determinar puntos de divisiÃŗn" - }, - "byDocCount": { - "desc": "Crear nÃēmero específico de archivos", - "name": "Cantidad de Documentos", - "tooltip": "Ingrese cuÃĄntos archivos desea crear" - }, - "byPageCount": { - "desc": "PÃĄginas fijas por archivo", - "name": "Cantidad de PÃĄginas", - "tooltip": "Ingrese el nÃēmero de pÃĄginas para cada archivo dividido" - }, - "byPageDivider": { - "desc": "DivisiÃŗn automÃĄtica con hojas divisoras", - "name": "Divisor de PÃĄginas", - "tooltip": "Use hojas divisoras con cÃŗdigo QR entre documentos al escanear" - }, - "byPages": { - "desc": "Extraer pÃĄginas específicas (1,3,5-10)", - "name": "NÃēmeros de PÃĄgina", - "tooltip": "Ingrese nÃēmeros de pÃĄgina separados por comas o rangos con guiones" - }, - "bySections": { - "desc": "Dividir pÃĄginas en secciones de cuadrícula", - "name": "Secciones", - "tooltip": "Dividir cada pÃĄgina en secciones horizontales y verticales" - }, - "prefix": { - "splitAt": "Dividir en", - "splitBy": "Dividir por" - } - }, - "value": { - "fileSize": { - "label": "TamaÃąo de archivo", - "placeholder": "ej. 10MB, 500KB" - }, - "docCount": { - "label": "NÃēmero de Archivos", - "placeholder": "ej. 3, 5" - }, - "pageCount": { - "label": "PÃĄginas por Archivo", - "placeholder": "ej. 5, 10" - } + "settings": { + "selectMethodFirst": "Por favor, seleccione primero un mÊtodo de divisiÃŗn" }, "error": { "failed": "Se produjo un error al dividir el PDF." @@ -899,56 +1001,144 @@ "label": "Elegir mÊtodo de divisiÃŗn", "placeholder": "Seleccione cÃŗmo dividir el PDF" }, - "settings": { - "selectMethodFirst": "Por favor, seleccione primero un mÊtodo de divisiÃŗn" - }, - "tooltip": { - "byChapters": { - "bullet1": "Nivel de Marcador: En quÊ nivel dividir (1=nivel superior)", - "bullet2": "Incluir Metadatos: Preservar propiedades del documento", - "bullet3": "Permitir Duplicados: Manejar nombres de marcadores repetidos", - "text": "Use marcadores de PDF para dividir automÃĄticamente en límites de capítulos. Requiere PDFs con estructura de marcadores.", - "title": "Dividir por Capítulos" - }, - "byCount": { - "bullet1": "Cantidad de PÃĄginas: NÃēmero fijo de pÃĄginas por archivo", - "bullet2": "Cantidad de Documentos: NÃēmero fijo de archivos de salida", - "bullet3": "Útil para flujos de trabajo de procesamiento por lotes", - "text": "Crear mÃēltiples PDFs con un nÃēmero específico de pÃĄginas o documentos cada uno.", - "title": "Dividir por Cantidad" + "methods": { + "prefix": { + "splitAt": "Dividir en", + "splitBy": "Dividir por" }, "byPages": { - "bullet1": "Puntos de divisiÃŗn Ãēnicos: 3,7 (divide despuÊs de las pÃĄginas 3 y 7)", - "bullet2": "Puntos de divisiÃŗn por rango: 3-8 (divide antes de la pÃĄgina 3 y despuÊs de la pÃĄgina 8)", - "bullet3": "Mixto: 2,5-10,15 (divide despuÊs de la pÃĄgina 2, antes de la pÃĄgina 5, despuÊs de la pÃĄgina 10 y despuÊs de la pÃĄgina 15)", - "text": "Divida su PDF en nÃēmeros de pÃĄgina específicos. Usar 'n' divide despuÊs de la pÃĄgina n. Usar 'n-m' divide antes de la pÃĄgina n y despuÊs de la pÃĄgina m.", - "title": "Dividir en NÃēmeros de PÃĄgina" + "name": "NÃēmeros de PÃĄgina", + "desc": "Extraer pÃĄginas específicas (1,3,5-10)", + "tooltip": "Ingrese nÃēmeros de pÃĄgina separados por comas o rangos con guiones" }, "bySections": { - "bullet1": "Horizontal: NÃēmero de filas a crear", - "bullet2": "Vertical: NÃēmero de columnas a crear", - "bullet3": "Combinar: Unir todas las secciones en un PDF", - "text": "Divida cada pÃĄgina en una cuadrícula de secciones. Útil para dividir documentos con mÃēltiples columnas o extraer ÃĄreas específicas.", - "title": "Dividir por Secciones de Cuadrícula" + "name": "Secciones", + "desc": "Dividir pÃĄginas en secciones de cuadrícula", + "tooltip": "Dividir cada pÃĄgina en secciones horizontales y verticales" }, "bySize": { - "bullet1": "Use MB para archivos mÃĄs grandes (ej. 10MB)", - "bullet2": "Use KB para archivos mÃĄs pequeÃąos (ej. 500KB)", - "bullet3": "El sistema dividirÃĄ en límites de pÃĄgina", - "text": "Crear mÃēltiples PDFs que no excedan un tamaÃąo de archivo especificado. Ideal para limitaciones de tamaÃąo de archivo o archivos adjuntos de correo electrÃŗnico.", - "title": "Dividir por TamaÃąo de Archivo" + "name": "TamaÃąo de archivo", + "desc": "Limitar tamaÃąo mÃĄximo de archivo", + "tooltip": "Especificar tamaÃąo mÃĄximo de archivo (ej. 10MB, 500KB)" }, + "byPageCount": { + "name": "Cantidad de PÃĄginas", + "desc": "PÃĄginas fijas por archivo", + "tooltip": "Ingrese el nÃēmero de pÃĄginas para cada archivo dividido" + }, + "byDocCount": { + "name": "Cantidad de Documentos", + "desc": "Crear nÃēmero específico de archivos", + "tooltip": "Ingrese cuÃĄntos archivos desea crear" + }, + "byChapters": { + "name": "Capítulos", + "desc": "Dividir en límites de marcadores", + "tooltip": "Usa marcadores de PDF para determinar puntos de divisiÃŗn" + }, + "byPageDivider": { + "name": "Divisor de PÃĄginas", + "desc": "DivisiÃŗn automÃĄtica con hojas divisoras", + "tooltip": "Use hojas divisoras con cÃŗdigo QR entre documentos al escanear" + } + }, + "value": { + "fileSize": { + "label": "TamaÃąo de archivo", + "placeholder": "ej. 10MB, 500KB" + }, + "pageCount": { + "label": "PÃĄginas por Archivo", + "placeholder": "ej. 5, 10" + }, + "docCount": { + "label": "NÃēmero de Archivos", + "placeholder": "ej. 3, 5" + } + }, + "tooltip": { "header": { "title": "Resumen de MÊtodos de DivisiÃŗn" + }, + "byPages": { + "title": "Dividir en NÃēmeros de PÃĄgina", + "text": "Divida su PDF en nÃēmeros de pÃĄgina específicos. Usar 'n' divide despuÊs de la pÃĄgina n. Usar 'n-m' divide antes de la pÃĄgina n y despuÊs de la pÃĄgina m.", + "bullet1": "Puntos de divisiÃŗn Ãēnicos: 3,7 (divide despuÊs de las pÃĄginas 3 y 7)", + "bullet2": "Puntos de divisiÃŗn por rango: 3-8 (divide antes de la pÃĄgina 3 y despuÊs de la pÃĄgina 8)", + "bullet3": "Mixto: 2,5-10,15 (divide despuÊs de la pÃĄgina 2, antes de la pÃĄgina 5, despuÊs de la pÃĄgina 10 y despuÊs de la pÃĄgina 15)" + }, + "bySections": { + "title": "Dividir por Secciones de Cuadrícula", + "text": "Divida cada pÃĄgina en una cuadrícula de secciones. Útil para dividir documentos con mÃēltiples columnas o extraer ÃĄreas específicas.", + "bullet1": "Horizontal: NÃēmero de filas a crear", + "bullet2": "Vertical: NÃēmero de columnas a crear", + "bullet3": "Combinar: Unir todas las secciones en un PDF" + }, + "bySize": { + "title": "Dividir por TamaÃąo de Archivo", + "text": "Crear mÃēltiples PDFs que no excedan un tamaÃąo de archivo especificado. Ideal para limitaciones de tamaÃąo de archivo o archivos adjuntos de correo electrÃŗnico.", + "bullet1": "Use MB para archivos mÃĄs grandes (ej. 10MB)", + "bullet2": "Use KB para archivos mÃĄs pequeÃąos (ej. 500KB)", + "bullet3": "El sistema dividirÃĄ en límites de pÃĄgina" + }, + "byCount": { + "title": "Dividir por Cantidad", + "text": "Crear mÃēltiples PDFs con un nÃēmero específico de pÃĄginas o documentos cada uno.", + "bullet1": "Cantidad de PÃĄginas: NÃēmero fijo de pÃĄginas por archivo", + "bullet2": "Cantidad de Documentos: NÃēmero fijo de archivos de salida", + "bullet3": "Útil para flujos de trabajo de procesamiento por lotes" + }, + "byChapters": { + "title": "Dividir por Capítulos", + "text": "Use marcadores de PDF para dividir automÃĄticamente en límites de capítulos. Requiere PDFs con estructura de marcadores.", + "bullet1": "Nivel de Marcador: En quÊ nivel dividir (1=nivel superior)", + "bullet2": "Incluir Metadatos: Preservar propiedades del documento", + "bullet3": "Permitir Duplicados: Manejar nombres de marcadores repetidos" + }, + "byDocCount": { + "bullet1": "Enter the number of output files you want", + "bullet2": "Pages are distributed as evenly as possible", + "bullet3": "Useful when you need a specific number of files", + "text": "Create a specific number of output files by evenly distributing pages across them.", + "title": "Split by Document Count" + }, + "byPageCount": { + "bullet1": "Enter the number of pages per output file", + "bullet2": "Last file may have fewer pages if not evenly divisible", + "bullet3": "Useful for batch processing workflows", + "text": "Create multiple PDFs with a specific number of pages each. Perfect for creating uniform document chunks.", + "title": "Split by Page Count" + }, + "byPageDivider": { + "bullet1": "Print divider sheets from the download link", + "bullet2": "Insert divider sheets between your documents", + "bullet3": "Scan all documents together as one PDF", + "bullet4": "Upload - divider pages are automatically detected and removed", + "bullet5": "Enable Duplex Mode if scanning both sides of divider sheets", + "text": "Automatically split scanned documents using physical divider sheets with QR codes. Perfect for processing multiple documents scanned together.", + "title": "Split by Page Divider" } - } + }, + "methodSelection": { + "tooltip": { + "bullet1": "Click on a method card to select it", + "bullet2": "Hover over each card to see a quick description", + "bullet3": "The settings step will appear after you select a method", + "bullet4": "You can change methods at any time before processing", + "header": { + "text": "Choose how you want to split your PDF document. Each method is optimized for different use cases and document types.", + "title": "Split Method Selection" + }, + "title": "Choose Your Split Method" + } + }, + "selectMethod": "Select a split method", + "tags": "Operaciones de pÃĄgina,dividir,Multi-pÃĄgina,cortar,Backend" }, "rotate": { - "tags": "Backend", "title": "Rotar PDF", - "header": "Rotar PDF", - "selectAngle": "Seleccionar ÃĄngulo de rotaciÃŗn (en mÃēltiplos de 90 grados):", "submit": "Rotar", + "selectRotation": "Select Rotation Angle (Clockwise)", "error": { "failed": "Se produjo un error al rotar el PDF." }, @@ -958,17 +1148,89 @@ "rotateLeft": "Rotar en sentido antihorario", "rotateRight": "Rotar en sentido horario", "tooltip": { - "controls": { - "text": "Use los botones de rotaciÃŗn para ajustar la orientaciÃŗn. El botÃŗn izquierdo rota en sentido antihorario, el botÃŗn derecho rota en sentido horario. Cada clic rota 90 grados.", - "title": "Controles" + "header": { + "title": "Resumen de ConfiguraciÃŗn de RotaciÃŗn" }, "description": { "text": "Rote las pÃĄginas de su PDF en sentido horario o antihorario en incrementos de 90 grados. Todas las pÃĄginas del PDF se rotarÃĄn. La vista previa muestra cÃŗmo se verÃĄ su documento despuÊs de la rotaciÃŗn." }, - "header": { - "title": "Resumen de ConfiguraciÃŗn de RotaciÃŗn" + "controls": { + "title": "Controles", + "text": "Use los botones de rotaciÃŗn para ajustar la orientaciÃŗn. El botÃŗn izquierdo rota en sentido antihorario, el botÃŗn derecho rota en sentido horario. Cada clic rota 90 grados." } - } + }, + "tags": "Backend", + "header": "Rotar PDF", + "selectAngle": "Seleccionar ÃĄngulo de rotaciÃŗn (en mÃēltiplos de 90 grados):" + }, + "convert": { + "title": "Convertir", + "desc": "Convertir archivos entre diferentes formatos", + "files": "Archivos", + "selectFilesPlaceholder": "Seleccione archivos en la vista principal para comenzar", + "settings": "ConfiguraciÃŗn", + "conversionCompleted": "ConversiÃŗn completada", + "results": "Resultados", + "defaultFilename": "archivo_convertido", + "conversionResults": "Resultados de ConversiÃŗn", + "convertFrom": "Convertir desde", + "convertTo": "Convertir a", + "sourceFormatPlaceholder": "Formato de origen", + "targetFormatPlaceholder": "Formato de destino", + "selectSourceFormatFirst": "Seleccione primero un formato de origen", + "outputOptions": "Opciones de Salida", + "pdfOptions": "Opciones de PDF", + "imageOptions": "Opciones de Imagen", + "colorType": "Tipo de Color", + "color": "Color", + "greyscale": "Escala de grises", + "blackwhite": "Blanco y Negro", + "dpi": "DPI", + "output": "Salida", + "single": "Individual", + "multiple": "MÃēltiple", + "fitOption": "OpciÃŗn de Ajuste", + "maintainAspectRatio": "Mantener RelaciÃŗn de Aspecto", + "fitDocumentToPage": "Ajustar Documento a PÃĄgina", + "fillPage": "Ocupar toda la pÃĄgina", + "autoRotate": "RotaciÃŗn AutomÃĄtica", + "autoRotateDescription": "Rotar automÃĄticamente las imÃĄgenes para ajustarse mejor a la pÃĄgina PDF", + "combineImages": "Combinar ImÃĄgenes", + "combineImagesDescription": "Combinar todas las imÃĄgenes en un PDF, o crear PDFs separados para cada imagen", + "webOptions": "Opciones de Web a PDF", + "zoomLevel": "Nivel de Zoom", + "emailOptions": "Opciones de Correo ElectrÃŗnico a PDF", + "includeAttachments": "Incluir archivos adjuntos de correo electrÃŗnico", + "maxAttachmentSize": "TamaÃąo mÃĄximo de archivo adjunto (MB)", + "includeAllRecipients": "Incluir destinatarios CC y BCC en el encabezado", + "downloadHtml": "Descargar archivo intermedio HTML en lugar de PDF", + "pdfaOptions": "Opciones de PDF/A", + "outputFormat": "Formato de Salida", + "pdfaNote": "PDF/A-1b es mÃĄs compatible, PDF/A-2b soporta mÃĄs funciones.", + "pdfaDigitalSignatureWarning": "El PDF contiene una firma digital. Ésta se eliminarÃĄ en el siguiente paso.", + "fileFormat": "Formato de Archivo", + "wordDoc": "Documento de Word", + "wordDocExt": "Documento de Word (.docx)", + "odtExt": "Texto OpenDocument (.odt)", + "pptExt": "PowerPoint (.pptx)", + "odpExt": "PresentaciÃŗn OpenDocument (.odp)", + "txtExt": "Texto Plano (.txt)", + "rtfExt": "Formato de Texto Enriquecido (.rtf)", + "selectedFiles": "Archivos seleccionados", + "noFileSelected": "No se seleccionÃŗ ningÃēn archivo. Use el panel de archivos para agregar archivos.", + "convertFiles": "Convertir Archivos", + "converting": "Convirtiendo...", + "downloadConverted": "Descargar Archivo Convertido", + "errorNoFiles": "Por favor seleccione al menos un archivo para convertir.", + "errorNoFormat": "Por favor seleccione los formatos de origen y destino.", + "errorNotSupported": "La conversiÃŗn de {{from}} a {{to}} no estÃĄ soportada.", + "images": "ImÃĄgenes", + "officeDocs": "Documentos de Office (Word, Excel, PowerPoint)", + "imagesExt": "ImÃĄgenes (JPG, PNG, etc.)", + "markdown": "Markdown", + "textRtf": "Texto/RTF", + "grayscale": "Escala de grises", + "errorConversion": "An error occurred while converting the file." }, "imageToPdf": { "tags": "conversiÃŗn,img,jpg,imagen,fotografía" @@ -1006,22 +1268,35 @@ "8": "Quitar Ãēltima", "9": "Quitar primera y Ãēltima", "10": "Unir impar-par", - "11": "Duplicar todas las pÃĄginas" + "11": "Duplicar todas las pÃĄginas", + "desc": { + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, â€Ļ).", + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, â€Ļ).", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimized for binding on the side)." + } }, - "placeholder": "(por ejemplo, 1,3,2 o 4-8,2,10-12 o 2n-1)", "desc": { - "BOOKLET_SORT": "Organice pÃĄginas para impresiÃŗn de folletos (Ãēltima, primera, segunda, penÃēltima, â€Ļ).", "CUSTOM": "Use una secuencia personalizada de nÃēmeros de pÃĄgina o expresiones para definir un nuevo orden.", - "DUPLEX_SORT": "Intercale frentes y luego reversos como si un escÃĄner dÃēplex escaneara todos los frentes y luego todos los reversos (1, n, 2, n-1, â€Ļ).", - "DUPLICATE": "Duplique cada pÃĄgina segÃēn el recuento de orden personalizado (por ejemplo, 4 duplica cada pÃĄgina 4 veces).", - "ODD_EVEN_MERGE": "Combine dos PDF alternando pÃĄginas: impares del primero, pares del segundo.", - "ODD_EVEN_SPLIT": "Divida el documento en dos salidas: todas las pÃĄginas impares y todas las pÃĄginas pares.", - "REMOVE_FIRST": "Elimine la primera pÃĄgina del documento.", - "REMOVE_FIRST_AND_LAST": "Elimine tanto la primera como la Ãēltima pÃĄgina del documento.", - "REMOVE_LAST": "Elimine la Ãēltima pÃĄgina del documento.", "REVERSE_ORDER": "Voltee el documento para que la Ãēltima pÃĄgina sea la primera y así sucesivamente.", - "SIDE_STITCH_BOOKLET_SORT": "Organice pÃĄginas para impresiÃŗn de folletos con costura lateral (optimizado para encuadernaciÃŗn por el lado)." - } + "DUPLEX_SORT": "Intercale frentes y luego reversos como si un escÃĄner dÃēplex escaneara todos los frentes y luego todos los reversos (1, n, 2, n-1, â€Ļ).", + "BOOKLET_SORT": "Organice pÃĄginas para impresiÃŗn de folletos (Ãēltima, primera, segunda, penÃēltima, â€Ļ).", + "SIDE_STITCH_BOOKLET_SORT": "Organice pÃĄginas para impresiÃŗn de folletos con costura lateral (optimizado para encuadernaciÃŗn por el lado).", + "ODD_EVEN_SPLIT": "Divida el documento en dos salidas: todas las pÃĄginas impares y todas las pÃĄginas pares.", + "ODD_EVEN_MERGE": "Combine dos PDF alternando pÃĄginas: impares del primero, pares del segundo.", + "DUPLICATE": "Duplique cada pÃĄgina segÃēn el recuento de orden personalizado (por ejemplo, 4 duplica cada pÃĄgina 4 veces).", + "REMOVE_FIRST": "Elimine la primera pÃĄgina del documento.", + "REMOVE_LAST": "Elimine la Ãēltima pÃĄgina del documento.", + "REMOVE_FIRST_AND_LAST": "Elimine tanto la primera como la Ãēltima pÃĄgina del documento." + }, + "placeholder": "(por ejemplo, 1,3,2 o 4-8,2,10-12 o 2n-1)" }, "addImage": { "tags": "img,jpg,imagen,fotografía", @@ -1031,9 +1306,198 @@ "upload": "AÃąadir imagen", "submit": "Enviar imagen" }, + "attachments": { + "tags": "embed,attach,file,attachment,attachments", + "title": "Add attachments", + "header": "Add attachments", + "add": "AÃąadir archivo adjunto", + "remove": "Eliminar archivo adjunto", + "embed": "Incrustar archivo adjunto", + "submit": "Add attachments" + }, "watermark": { - "tags": "Texto,repetir,etiquetar,propietario,copyright,marca comercial,img,jpg,imagen,fotografía", "title": "AÃąadir marca de agua", + "desc": "AÃąadir marcas de agua de texto o imagen a archivos PDF", + "completed": "Marca de agua aÃąadida", + "submit": "AÃąadir marca de agua", + "filenamePrefix": "con_marca_de_agua", + "error": { + "failed": "Se produjo un error al aÃąadir la marca de agua al PDF." + }, + "watermarkType": { + "text": "Texto", + "image": "Imagen" + }, + "settings": { + "type": "Tipo de Marca de Agua", + "text": { + "label": "Texto de Marca de Agua", + "placeholder": "Ingrese texto de marca de agua" + }, + "image": { + "label": "Imagen de Marca de Agua", + "choose": "Elegir Imagen", + "selected": "Seleccionado: {{filename}}" + }, + "fontSize": "TamaÃąo de fuente", + "size": "TamaÃąo", + "alphabet": "Fuente/Idioma", + "color": "Color de Marca de Agua", + "rotation": "RotaciÃŗn (grados)", + "opacity": "Opacidad (%)", + "spacing": { + "horizontal": "Espaciado Horizontal", + "vertical": "Espaciado Vertical", + "height": "Height Spacing", + "width": "Width Spacing" + }, + "convertToImage": "Aplanar pÃĄginas de PDF en imÃĄgenes" + }, + "alphabet": { + "roman": "Romano/Latino", + "arabic": "Árabe", + "japanese": "JaponÊs", + "korean": "Coreano", + "chinese": "Chino", + "thai": "TailandÊs" + }, + "steps": { + "type": "Tipo de Marca de Agua", + "wording": "Texto", + "textStyle": "Estilo", + "formatting": "Formato", + "file": "Archivo de Marca de Agua" + }, + "results": { + "title": "Resultados de Marca de Agua" + }, + "tooltip": { + "language": { + "title": "Soporte de Idioma", + "text": "Elija la configuraciÃŗn de idioma apropiada para asegurar una representaciÃŗn correcta de la fuente para su texto." + }, + "appearance": { + "title": "ConfiguraciÃŗn de Apariencia", + "text": "Controle cÃŗmo se ve su marca de agua y se mezcla con el documento.", + "bullet1": "RotaciÃŗn: -360° a 360° para marcas de agua anguladas", + "bullet2": "Opacidad: 0-100% para control de transparencia", + "bullet3": "Una opacidad mÃĄs baja crea marcas de agua sutiles" + }, + "spacing": { + "title": "Control de Espaciado", + "text": "Ajuste el espaciado entre marcas de agua repetidas en la pÃĄgina.", + "bullet1": "Espaciado de ancho: Distancia horizontal entre marcas de agua", + "bullet2": "Espaciado de altura: Distancia vertical entre marcas de agua", + "bullet3": "Valores mÃĄs altos crean patrones mÃĄs espaciados" + }, + "type": { + "header": { + "title": "SelecciÃŗn de Tipo de Marca de Agua" + }, + "description": { + "title": "Elija su Marca de Agua", + "text": "Seleccione entre marcas de agua de texto o imagen segÃēn sus necesidades." + }, + "text": { + "title": "Marcas de Agua de Texto", + "text": "Perfecto para aÃąadir avisos de derechos de autor, nombres de empresas o etiquetas de confidencialidad. Admite mÃēltiples idiomas y colores personalizados.", + "bullet1": "Fuentes e idiomas personalizables", + "bullet2": "Colores y transparencia ajustables", + "bullet3": "Ideal para texto legal o de marca" + }, + "image": { + "title": "Marcas de Agua de Imagen", + "text": "Use logos, sellos o cualquier imagen como marca de agua. Excelente para marca e identificaciÃŗn visual.", + "bullet1": "Cargue cualquier formato de imagen", + "bullet2": "Mantiene la calidad de la imagen", + "bullet3": "Perfecto para logos y sellos" + } + }, + "wording": { + "header": { + "title": "Contenido de Texto" + }, + "text": { + "title": "Texto de Marca de Agua", + "text": "Ingrese el texto que aparecerÃĄ como su marca de agua en todo el documento.", + "bullet1": "MantÊngalo conciso para mejor legibilidad", + "bullet2": "Ejemplos comunes: 'CONFIDENCIAL', 'BORRADOR', nombre de la empresa", + "bullet3": "No se admiten caracteres emoji y se filtrarÃĄn" + } + }, + "textStyle": { + "header": { + "title": "Estilo de Texto" + }, + "color": { + "title": "SelecciÃŗn de Color", + "text": "Elija un color que proporcione buen contraste con el contenido de su documento.", + "bullet1": "Gris claro (#d3d3d3) para marcas de agua sutiles", + "bullet2": "Negro o colores oscuros para alto contraste", + "bullet3": "Colores personalizados para fines de marca" + }, + "language": { + "title": "Soporte de Idioma", + "text": "Elija la configuraciÃŗn de idioma apropiada para asegurar una representaciÃŗn correcta de la fuente." + } + }, + "file": { + "header": { + "title": "Carga de Imagen" + }, + "upload": { + "title": "SelecciÃŗn de Imagen", + "text": "Cargue un archivo de imagen para usar como su marca de agua.", + "bullet1": "Admite formatos comunes: PNG, JPG, GIF, BMP", + "bullet2": "PNG con transparencia funciona mejor", + "bullet3": "Las imÃĄgenes de mayor resoluciÃŗn mantienen mejor la calidad" + }, + "recommendations": { + "title": "Mejores PrÃĄcticas", + "text": "Consejos para obtener resultados Ãŗptimos de marcas de agua de imagen.", + "bullet1": "Use logos o sellos con fondos transparentes", + "bullet2": "Los diseÃąos simples funcionan mejor que las imÃĄgenes complejas", + "bullet3": "Considere el tamaÃąo final del documento al elegir la resoluciÃŗn" + } + }, + "formatting": { + "header": { + "title": "Formato y DiseÃąo" + }, + "size": { + "title": "Control de TamaÃąo", + "text": "Ajuste el tamaÃąo de su marca de agua (texto o imagen).", + "bullet1": "Los tamaÃąos mÃĄs grandes crean marcas de agua mÃĄs prominentes" + }, + "appearance": { + "title": "ConfiguraciÃŗn de Apariencia", + "text": "Controle cÃŗmo se ve su marca de agua y se mezcla con el documento.", + "bullet1": "RotaciÃŗn: -360° a 360° para marcas de agua anguladas", + "bullet2": "Opacidad: 0-100% para control de transparencia", + "bullet3": "Una opacidad mÃĄs baja crea marcas de agua sutiles" + }, + "spacing": { + "title": "Control de Espaciado", + "text": "Ajuste el espaciado entre marcas de agua repetidas en la pÃĄgina.", + "bullet1": "Espaciado horizontal: Distancia entre marcas de agua de izquierda a derecha", + "bullet2": "Espaciado vertical: Distancia entre marcas de agua de arriba a abajo", + "bullet3": "Valores mÃĄs altos crean patrones mÃĄs espaciados" + }, + "security": { + "title": "OpciÃŗn de Seguridad", + "text": "Convertir el PDF final a un formato basado en imÃĄgenes para mayor seguridad.", + "bullet1": "Evita la selecciÃŗn y copia de texto", + "bullet2": "Hace que las marcas de agua sean mÃĄs difíciles de eliminar", + "bullet3": "Resulta en tamaÃąos de archivo mÃĄs grandes", + "bullet4": "Mejor para contenido sensible o protegido por derechos de autor" + } + } + }, + "type": { + "1": "Texto", + "2": "Imagen" + }, + "tags": "Texto,repetir,etiquetar,propietario,copyright,marca comercial,img,jpg,imagen,fotografía", "header": "AÃąadir marca de agua", "customColor": "Personalizar color de texto", "selectText": { @@ -1047,184 +1511,6 @@ "8": "Tipo de marca de agua:", "9": "Imagen de marca de agua:", "10": "Convertir PDF a imagen PDF" - }, - "submit": "AÃąadir marca de agua", - "type": { - "1": "Texto", - "2": "Imagen" - }, - "watermarkType": { - "text": "Texto", - "image": "Imagen" - }, - "settings": { - "fontSize": "TamaÃąo de fuente", - "alphabet": "Fuente/Idioma", - "color": "Color de Marca de Agua", - "convertToImage": "Aplanar pÃĄginas de PDF en imÃĄgenes", - "image": { - "choose": "Elegir Imagen", - "label": "Imagen de Marca de Agua", - "selected": "Seleccionado: {{filename}}" - }, - "opacity": "Opacidad (%)", - "rotation": "RotaciÃŗn (grados)", - "size": "TamaÃąo", - "spacing": { - "horizontal": "Espaciado Horizontal", - "vertical": "Espaciado Vertical" - }, - "text": { - "label": "Texto de Marca de Agua", - "placeholder": "Ingrese texto de marca de agua" - }, - "type": "Tipo de Marca de Agua" - }, - "alphabet": { - "arabic": "Árabe", - "chinese": "Chino", - "japanese": "JaponÊs", - "korean": "Coreano", - "roman": "Romano/Latino", - "thai": "TailandÊs" - }, - "completed": "Marca de agua aÃąadida", - "desc": "AÃąadir marcas de agua de texto o imagen a archivos PDF", - "error": { - "failed": "Se produjo un error al aÃąadir la marca de agua al PDF." - }, - "filenamePrefix": "con_marca_de_agua", - "results": { - "title": "Resultados de Marca de Agua" - }, - "steps": { - "file": "Archivo de Marca de Agua", - "formatting": "Formato", - "textStyle": "Estilo", - "type": "Tipo de Marca de Agua", - "wording": "Texto" - }, - "tooltip": { - "appearance": { - "bullet1": "RotaciÃŗn: -360° a 360° para marcas de agua anguladas", - "bullet2": "Opacidad: 0-100% para control de transparencia", - "bullet3": "Una opacidad mÃĄs baja crea marcas de agua sutiles", - "text": "Controle cÃŗmo se ve su marca de agua y se mezcla con el documento.", - "title": "ConfiguraciÃŗn de Apariencia" - }, - "file": { - "header": { - "title": "Carga de Imagen" - }, - "recommendations": { - "bullet1": "Use logos o sellos con fondos transparentes", - "bullet2": "Los diseÃąos simples funcionan mejor que las imÃĄgenes complejas", - "bullet3": "Considere el tamaÃąo final del documento al elegir la resoluciÃŗn", - "text": "Consejos para obtener resultados Ãŗptimos de marcas de agua de imagen.", - "title": "Mejores PrÃĄcticas" - }, - "upload": { - "bullet1": "Admite formatos comunes: PNG, JPG, GIF, BMP", - "bullet2": "PNG con transparencia funciona mejor", - "bullet3": "Las imÃĄgenes de mayor resoluciÃŗn mantienen mejor la calidad", - "text": "Cargue un archivo de imagen para usar como su marca de agua.", - "title": "SelecciÃŗn de Imagen" - } - }, - "formatting": { - "appearance": { - "bullet1": "RotaciÃŗn: -360° a 360° para marcas de agua anguladas", - "bullet2": "Opacidad: 0-100% para control de transparencia", - "bullet3": "Una opacidad mÃĄs baja crea marcas de agua sutiles", - "text": "Controle cÃŗmo se ve su marca de agua y se mezcla con el documento.", - "title": "ConfiguraciÃŗn de Apariencia" - }, - "header": { - "title": "Formato y DiseÃąo" - }, - "security": { - "bullet1": "Evita la selecciÃŗn y copia de texto", - "bullet2": "Hace que las marcas de agua sean mÃĄs difíciles de eliminar", - "bullet3": "Resulta en tamaÃąos de archivo mÃĄs grandes", - "bullet4": "Mejor para contenido sensible o protegido por derechos de autor", - "text": "Convertir el PDF final a un formato basado en imÃĄgenes para mayor seguridad.", - "title": "OpciÃŗn de Seguridad" - }, - "size": { - "bullet1": "Los tamaÃąos mÃĄs grandes crean marcas de agua mÃĄs prominentes", - "text": "Ajuste el tamaÃąo de su marca de agua (texto o imagen).", - "title": "Control de TamaÃąo" - }, - "spacing": { - "bullet1": "Espaciado horizontal: Distancia entre marcas de agua de izquierda a derecha", - "bullet2": "Espaciado vertical: Distancia entre marcas de agua de arriba a abajo", - "bullet3": "Valores mÃĄs altos crean patrones mÃĄs espaciados", - "text": "Ajuste el espaciado entre marcas de agua repetidas en la pÃĄgina.", - "title": "Control de Espaciado" - } - }, - "language": { - "text": "Elija la configuraciÃŗn de idioma apropiada para asegurar una representaciÃŗn correcta de la fuente para su texto.", - "title": "Soporte de Idioma" - }, - "spacing": { - "bullet1": "Espaciado de ancho: Distancia horizontal entre marcas de agua", - "bullet2": "Espaciado de altura: Distancia vertical entre marcas de agua", - "bullet3": "Valores mÃĄs altos crean patrones mÃĄs espaciados", - "text": "Ajuste el espaciado entre marcas de agua repetidas en la pÃĄgina.", - "title": "Control de Espaciado" - }, - "textStyle": { - "color": { - "bullet1": "Gris claro (#d3d3d3) para marcas de agua sutiles", - "bullet2": "Negro o colores oscuros para alto contraste", - "bullet3": "Colores personalizados para fines de marca", - "text": "Elija un color que proporcione buen contraste con el contenido de su documento.", - "title": "SelecciÃŗn de Color" - }, - "header": { - "title": "Estilo de Texto" - }, - "language": { - "text": "Elija la configuraciÃŗn de idioma apropiada para asegurar una representaciÃŗn correcta de la fuente.", - "title": "Soporte de Idioma" - } - }, - "type": { - "description": { - "text": "Seleccione entre marcas de agua de texto o imagen segÃēn sus necesidades.", - "title": "Elija su Marca de Agua" - }, - "header": { - "title": "SelecciÃŗn de Tipo de Marca de Agua" - }, - "image": { - "bullet1": "Cargue cualquier formato de imagen", - "bullet2": "Mantiene la calidad de la imagen", - "bullet3": "Perfecto para logos y sellos", - "text": "Use logos, sellos o cualquier imagen como marca de agua. Excelente para marca e identificaciÃŗn visual.", - "title": "Marcas de Agua de Imagen" - }, - "text": { - "bullet1": "Fuentes e idiomas personalizables", - "bullet2": "Colores y transparencia ajustables", - "bullet3": "Ideal para texto legal o de marca", - "text": "Perfecto para aÃąadir avisos de derechos de autor, nombres de empresas o etiquetas de confidencialidad. Admite mÃēltiples idiomas y colores personalizados.", - "title": "Marcas de Agua de Texto" - } - }, - "wording": { - "header": { - "title": "Contenido de Texto" - }, - "text": { - "bullet1": "MantÊngalo conciso para mejor legibilidad", - "bullet2": "Ejemplos comunes: 'CONFIDENCIAL', 'BORRADOR', nombre de la empresa", - "bullet3": "No se admiten caracteres emoji y se filtrarÃĄn", - "text": "Ingrese el texto que aparecerÃĄ como su marca de agua en todo el documento.", - "title": "Texto de Marca de Agua" - } - } } }, "permissions": { @@ -1249,155 +1535,201 @@ "removePages": { "tags": "Borrar pÃĄginas,eliminar pÃĄginas", "title": "Eliminar", - "submit": "Eliminar", - "error": { - "failed": "Se produjo un error al eliminar pÃĄginas." + "pageNumbers": { + "label": "PÃĄginas a Eliminar", + "placeholder": "por ejemplo, 1,3,5-8,10", + "error": "Formato de nÃēmero de pÃĄgina no vÃĄlido. Use nÃēmeros, rangos (1-5) o expresiones matemÃĄticas (2n+1)" }, "filenamePrefix": "paginas_eliminadas", "files": { "placeholder": "Seleccione un archivo PDF en la vista principal para comenzar" }, - "pageNumbers": { - "error": "Formato de nÃēmero de pÃĄgina no vÃĄlido. Use nÃēmeros, rangos (1-5) o expresiones matemÃĄticas (2n+1)", - "label": "PÃĄginas a Eliminar", - "placeholder": "por ejemplo, 1,3,5-8,10" - }, - "results": { - "title": "Resultados de EliminaciÃŗn de PÃĄginas" - }, "settings": { "title": "ConfiguraciÃŗn" }, "tooltip": { - "examples": { - "bullet1": "Eliminar primera pÃĄgina: 1", - "bullet2": "Eliminar Ãēltimas 3 pÃĄginas: -3", - "bullet3": "Eliminar cada dos pÃĄginas: 2n", - "bullet4": "Eliminar pÃĄginas específicas dispersas: 1,5,10,15", - "text": "Aquí hay algunos patrones comunes de selecciÃŗn de pÃĄginas:", - "title": "Ejemplos Comunes" - }, "header": { "title": "ConfiguraciÃŗn de Eliminar PÃĄginas" }, "pageNumbers": { + "title": "SelecciÃŗn de PÃĄginas", + "text": "Especifique quÊ pÃĄginas eliminar de su PDF. Puede seleccionar pÃĄginas individuales, rangos o usar expresiones matemÃĄticas.", "bullet1": "PÃĄginas individuales: 1,3,5 (elimina pÃĄginas 1, 3 y 5)", "bullet2": "Rangos de pÃĄginas: 1-5,10-15 (elimina pÃĄginas 1-5 y 10-15)", "bullet3": "MatemÃĄtico: 2n+1 (elimina pÃĄginas impares)", - "bullet4": "Rangos abiertos: 5- (elimina desde la pÃĄgina 5 hasta el final)", - "text": "Especifique quÊ pÃĄginas eliminar de su PDF. Puede seleccionar pÃĄginas individuales, rangos o usar expresiones matemÃĄticas.", - "title": "SelecciÃŗn de PÃĄginas" + "bullet4": "Rangos abiertos: 5- (elimina desde la pÃĄgina 5 hasta el final)" + }, + "examples": { + "title": "Ejemplos Comunes", + "text": "Aquí hay algunos patrones comunes de selecciÃŗn de pÃĄginas:", + "bullet1": "Eliminar primera pÃĄgina: 1", + "bullet2": "Eliminar Ãēltimas 3 pÃĄginas: -3", + "bullet3": "Eliminar cada dos pÃĄginas: 2n", + "bullet4": "Eliminar pÃĄginas específicas dispersas: 1,5,10,15" }, "safety": { + "title": "Consejos de Seguridad", + "text": "Consideraciones importantes al eliminar pÃĄginas:", "bullet1": "Siempre previsualice su selecciÃŗn antes de procesar", "bullet2": "Mantenga una copia de seguridad de su archivo original", "bullet3": "Los nÃēmeros de pÃĄgina comienzan desde 1, no 0", - "bullet4": "Los nÃēmeros de pÃĄgina no vÃĄlidos se ignorarÃĄn", - "text": "Consideraciones importantes al eliminar pÃĄginas:", - "title": "Consejos de Seguridad" + "bullet4": "Los nÃēmeros de pÃĄgina no vÃĄlidos se ignorarÃĄn" } - } - }, - "addPassword": { - "tags": "seguro,seguridad", - "title": "Proteger con contraseÃąa", - "header": "AÃąadir contraseÃąa (encriptar)", - "selectText": { - "1": "Seleccionar PDF para encriptar", - "2": "ContraseÃąa", - "3": "Longitud de la clave de cifrado", - "4": "Valores altos son mÃĄs fuertes, pero valores bajos tienen mejor compatibilidad", - "5": "Permisos para establecer", - "6": "Impedir el ensamblaje del documento", - "7": "Impedir la extracciÃŗn de contenido", - "8": "Impedir la extracciÃŗn para la accesibilidad", - "9": "Impedir rellenar formulario", - "10": "Impedir modificaciÃŗn", - "11": "Impedir modificaciÃŗn de anotaciones", - "12": "Impedir imprimir", - "13": "Impedir imprimir diferentes formatos", - "14": "ContraseÃąa", - "15": "Restringir quÊ se puede hacer con el documento una vez abierto (no soportado por todos los lectores)", - "16": "Restringir la apertura del propio documento" }, - "submit": "Encriptar", + "error": { + "failed": "Se produjo un error al eliminar pÃĄginas." + }, + "results": { + "title": "Resultados de EliminaciÃŗn de PÃĄginas" + }, + "submit": "Eliminar" + }, + "extractPages": { + "title": "Extract Pages", + "pageNumbers": { + "label": "Pages to Extract", + "placeholder": "e.g., 1,3,5-8 or odd & 1-10" + }, + "settings": { + "title": "Settings" + }, + "tooltip": { + "description": "Extracts the selected pages into a new PDF, preserving order." + }, + "error": { + "failed": "Failed to extract pages" + }, + "results": { + "title": "Pages Extracted" + }, + "submit": "Extract Pages" + }, + "pageSelection": { "tooltip": { - "permissions": { - "title": "Cambiar permisos", - "text": "Estos permisos controlan lo que los usuarios pueden hacer con el PDF. Son mÃĄs efectivos cuando se combinan con una contraseÃąa de propietario." - }, - "encryption": { - "bullet1": "40 bits: Seguridad bÃĄsica, compatible con visores antiguos", - "bullet2": "128 bits: Seguridad estÃĄndar, ampliamente compatible", - "bullet3": "256 bits: Seguridad mÃĄxima, requiere visores modernos", - "text": "Los niveles de cifrado mÃĄs altos proporcionan mejor seguridad, pero es posible que no sean compatibles con visores de PDF antiguos.", - "title": "Niveles de cifrado" - }, "header": { - "title": "DescripciÃŗn general de protecciÃŗn con contraseÃąa" + "title": "Guía de SelecciÃŗn de PÃĄginas" }, - "passwords": { - "bullet1": "ContraseÃąa de usuario: Requerida para abrir el PDF", - "bullet2": "ContraseÃąa de propietario: Controla los permisos del documento (no compatible con todos los visores de PDF)", - "text": "Las contraseÃąas de usuario restringen la apertura del documento, mientras que las contraseÃąas de propietario controlan lo que se puede hacer con el documento una vez abierto. Puede establecer ambas o solo una.", - "title": "Tipos de contraseÃąa" - } - }, - "completed": "ProtecciÃŗn con contraseÃąa aplicada", - "desc": "Cifre su documento PDF con una contraseÃąa.", - "encryption": { - "keyLength": { - "128bit": "128 bits (EstÃĄndar)", - "256bit": "256 bits (Alto)", - "40bit": "40 bits (Bajo)", - "label": "Longitud de clave de cifrado" - } - }, - "error": { - "failed": "Se produjo un error al cifrar el PDF." - }, - "filenamePrefix": "cifrado", - "passwords": { - "completed": "ContraseÃąas configuradas", - "owner": { - "label": "ContraseÃąa de propietario", - "placeholder": "Introduzca la contraseÃąa de propietario" + "basic": { + "title": "Uso BÃĄsico", + "text": "Seleccione pÃĄginas específicas de su documento PDF utilizando sintaxis simple.", + "bullet1": "PÃĄginas individuales: 1,3,5", + "bullet2": "Rangos de pÃĄginas: 3-6 o 10-15", + "bullet3": "Todas las pÃĄginas: all" }, - "stepTitle": "ContraseÃąas y cifrado", - "user": { - "label": "ContraseÃąa de usuario", - "placeholder": "Introduzca la contraseÃąa de usuario" + "advanced": { + "title": "Funciones Avanzadas" + }, + "tips": { + "title": "Consejos", + "text": "Tenga en cuenta estas pautas:", + "bullet1": "Los nÃēmeros de pÃĄgina comienzan desde 1 (no 0)", + "bullet2": "Los espacios se eliminan automÃĄticamente", + "bullet3": "Las expresiones no vÃĄlidas se ignoran" + }, + "syntax": { + "title": "Conceptos BÃĄsicos de Sintaxis", + "text": "Use nÃēmeros, rangos, palabras clave y progresiones (n comienza en 0). Se admiten parÊntesis.", + "bullets": { + "numbers": "NÃēmeros/rangos: 5, 10-20", + "keywords": "Palabras clave: odd, even", + "progressions": "Progresiones: 3n, 4n+1" + } + }, + "operators": { + "title": "Operadores", + "text": "Y tiene mayor precedencia que la coma. NO se aplica dentro del rango del documento.", + "and": "Y: & o \"and\" — requiere ambas condiciones (por ejemplo, 1-50 & even)", + "comma": "Coma: , o | — combina selecciones (por ejemplo, 1-10, 20)", + "not": "NO: ! o \"not\" — excluye pÃĄginas (por ejemplo, 3n & not 30)" + }, + "examples": { + "title": "Ejemplos" + }, + "complex": { + "bullet1": "1,3-5,8,2n → pages 1, 3–5, 8, plus evens", + "bullet2": "10-,2n-1 → from page 10 to end + odd pages", + "description": "Mix different types.", + "title": "Complex Combinations" + }, + "description": "Choose which pages to use for the operation. Supports single pages, ranges, formulas, and the all keyword.", + "individual": { + "bullet1": "1,3,5 → selects pages 1, 3, 5", + "bullet2": "2,7,12 → selects pages 2, 7, 12", + "description": "Enter numbers separated by commas.", + "title": "Individual Pages" + }, + "mathematical": { + "bullet1": "2n → all even pages (2, 4, 6â€Ļ)", + "bullet2": "2n-1 → all odd pages (1, 3, 5â€Ļ)", + "bullet3": "3n → every 3rd page (3, 6, 9â€Ļ)", + "bullet4": "4n-1 → pages 3, 7, 11, 15â€Ļ", + "description": "Use n in formulas for patterns.", + "title": "Mathematical Functions" + }, + "ranges": { + "bullet1": "3-6 → selects pages 3–6", + "bullet2": "10-15 → selects pages 10–15", + "bullet3": "5- → selects pages 5 to end", + "description": "Use - for consecutive pages.", + "title": "Page Ranges" + }, + "special": { + "bullet1": "all → selects all pages", + "title": "Special Keywords" } - }, - "results": { - "title": "PDFs cifrados" } }, - "removePassword": { - "tags": "seguro,Descifrar,seguridad,quitar contraseÃąa,eliminar contraseÃąa", - "title": "Quitar contraseÃąa", - "header": "Eliminar contraseÃąa (desencriptar)", - "selectText": { - "1": "Seleccionar PDF para desencriptar", - "2": "ContraseÃąa" + "bulkSelection": { + "syntaxError": "There is a syntax issue. See Page Selection tips for help.", + "header": { + "title": "Guía de selecciÃŗn de pÃĄginas" }, - "submit": "Eliminar", - "desc": "Eliminar la contraseÃąa del documento PDF", - "password": { - "stepTitle": "Eliminar contraseÃąa", - "label": "ContraseÃąa actual", - "completed": "ContraseÃąa configurada", - "placeholder": "Introduzca la contraseÃąa actual" + "syntax": { + "title": "Conceptos bÃĄsicos de sintaxis", + "text": "Use nÃēmeros, rangos, palabras clave y progresiones (n comienza en 0). Se admiten parÊntesis.", + "bullets": { + "numbers": "NÃēmeros/rangos: 5, 10-20", + "keywords": "Palabras clave: odd, even", + "progressions": "Progresiones: 3n, 4n+1" + } }, - "error": { - "failed": "Se produjo un error al eliminar la contraseÃąa del PDF." + "operators": { + "title": "Operadores", + "text": "AND tiene mayor precedencia que la coma. NOT se aplica dentro del rango del documento.", + "and": "AND: & o \"and\" — requiere ambas condiciones (ej., 1-50 & even)", + "comma": "Coma: , o | — combina selecciones (ej., 1-10, 20)", + "not": "NOT: ! o \"not\" — excluye pÃĄginas (ej., 3n & not 30)" }, - "filenamePrefix": "descifrado", - "results": { - "title": "PDF Descifrados" + "examples": { + "title": "Ejemplos", + "first50": "Primeras 50", + "last50": "Últimas 50", + "every3rd": "Cada tercera", + "oddWithinExcluding": "Impares dentro de 1-20 excluyendo 5-7", + "combineSets": "Combinar conjuntos" }, - "tooltip": { - "description": "Eliminar la protecciÃŗn con contraseÃąa requiere la contraseÃąa que se usÃŗ para cifrar el PDF. Esto descifrarÃĄ el documento, haciÊndolo accesible sin contraseÃąa." + "firstNPages": { + "title": "Primeras N pÃĄginas", + "placeholder": "NÃēmero de pÃĄginas" + }, + "lastNPages": { + "title": "Últimas N pÃĄginas", + "placeholder": "NÃēmero de pÃĄginas" + }, + "everyNthPage": { + "title": "Cada enÊsima pÃĄgina", + "placeholder": "TamaÃąo de paso" + }, + "range": { + "title": "Rango", + "fromPlaceholder": "Desde", + "toPlaceholder": "Hasta" + }, + "keywords": { + "title": "Palabras clave" + }, + "advanced": { + "title": "Avanzado" } }, "compressPdfs": { @@ -1409,24 +1741,140 @@ "header": "Desbloquear Formularios PDF", "submit": "Eliminar", "description": "Esta herramienta eliminarÃĄ las restricciones de solo lectura de los campos de formulario PDF, haciÊndolos editables y rellenables.", - "error": { - "failed": "Se produjo un error al desbloquear los formularios PDF." - }, "filenamePrefix": "formularios_desbloqueados", "files": { "placeholder": "Seleccione un archivo PDF en la vista principal para comenzar" }, + "error": { + "failed": "Se produjo un error al desbloquear los formularios PDF." + }, "results": { "title": "Resultados de Formularios Desbloqueados" } }, "changeMetadata": { - "tags": "título,autor,fecha,creaciÃŗn,hora,editorial,productor,estadísticas", + "header": "Cambiar metadatos", + "submit": "Cambiar", + "filenamePrefix": "metadatos", + "settings": { + "title": "ConfiguraciÃŗn de metadatos" + }, + "standardFields": { + "title": "Campos estÃĄndar" + }, + "deleteAll": { + "label": "Eliminar metadatos existentes", + "checkbox": "Eliminar todos los metadatos" + }, "title": { "label": "Título", "placeholder": "Título del documento" }, - "header": "Cambiar metadatos", + "author": { + "label": "Autor", + "placeholder": "Autor del documento" + }, + "subject": { + "label": "Asunto", + "placeholder": "Asunto del documento" + }, + "keywords": { + "label": "Palabras clave", + "placeholder": "Palabras clave del documento" + }, + "creator": { + "label": "Creador", + "placeholder": "Creador del documento" + }, + "producer": { + "label": "Productor", + "placeholder": "Productor del documento" + }, + "dates": { + "title": "Campos de fecha" + }, + "creationDate": { + "label": "Fecha de creaciÃŗn", + "placeholder": "Fecha de creaciÃŗn" + }, + "modificationDate": { + "label": "Fecha de modificaciÃŗn", + "placeholder": "Fecha de modificaciÃŗn" + }, + "trapped": { + "label": "Estado de Trapping", + "unknown": "Desconocido", + "true": "Verdadero", + "false": "Falso" + }, + "advanced": { + "title": "Opciones avanzadas" + }, + "customFields": { + "title": "Metadatos personalizados", + "description": "AÃąadir campos de metadatos personalizados al documento", + "add": "AÃąadir campo", + "key": "Clave", + "keyPlaceholder": "Clave personalizada", + "value": "Valor", + "valuePlaceholder": "Valor personalizado", + "remove": "Eliminar" + }, + "results": { + "title": "PDFs actualizados" + }, + "error": { + "failed": "Se produjo un error al cambiar los metadatos del PDF." + }, + "tooltip": { + "header": { + "title": "DescripciÃŗn general de metadatos PDF" + }, + "standardFields": { + "title": "Campos EstÃĄndar", + "text": "Campos de metadatos PDF comunes que describen el documento.", + "bullet1": "Título: Nombre del documento o encabezado", + "bullet2": "Autor: Persona que creÃŗ el documento", + "bullet3": "Asunto: Breve descripciÃŗn del contenido", + "bullet4": "Palabras clave: TÊrminos de bÃēsqueda para el documento", + "bullet5": "Creador/Productor: Software utilizado para crear el PDF" + }, + "dates": { + "title": "Campos de fecha", + "text": "CuÃĄndo se creÃŗ y modificÃŗ el documento.", + "bullet1": "Fecha de creaciÃŗn: CuÃĄndo se creÃŗ el documento original", + "bullet2": "Fecha de modificaciÃŗn: CuÃĄndo se cambiÃŗ por Ãēltima vez" + }, + "options": { + "title": "Opciones adicionales", + "text": "Campos personalizados y controles de privacidad.", + "bullet1": "Metadatos personalizados: AÃąada sus propios pares clave-valor", + "bullet2": "Estado de captura: ConfiguraciÃŗn de impresiÃŗn de alta calidad", + "bullet3": "Eliminar todo: Eliminar todos los metadatos para privacidad" + }, + "deleteAll": { + "title": "Eliminar metadatos existentes", + "text": "EliminaciÃŗn completa de metadatos para garantizar la privacidad." + }, + "customFields": { + "title": "Metadatos personalizados", + "text": "AÃąada sus propios pares de metadatos clave-valor personalizados.", + "bullet1": "AÃąada cualquier campo personalizado relevante para su documento", + "bullet2": "Ejemplos: Departamento, Proyecto, VersiÃŗn, Estado", + "bullet3": "Tanto la clave como el valor son requeridos para cada entrada" + }, + "advanced": { + "title": "Opciones avanzadas", + "trapped": { + "title": "Estado de captura", + "description": "Indica si el documento estÃĄ preparado para impresiÃŗn de alta calidad.", + "bullet1": "Verdadero: El documento ha sido capturado para impresiÃŗn", + "bullet2": "Falso: El documento no ha sido capturado", + "bullet3": "Desconocido: El estado de captura no estÃĄ especificado" + } + } + }, + "tags": "título,autor,fecha,creaciÃŗn,hora,editorial,productor,estadísticas", "selectText": { "1": "Editar las variables que desea cambiar", "2": "Eliminar todos los metadatos", @@ -1434,123 +1882,7 @@ "4": "Otros Metadatos:", "5": "Agregar entrada de metadatos personalizados" }, - "author": { - "label": "Autor", - "placeholder": "Autor del documento" - }, - "creationDate": { - "label": "Fecha de creaciÃŗn", - "placeholder": "Fecha de creaciÃŗn" - }, - "creator": { - "label": "Creador", - "placeholder": "Creador del documento" - }, - "keywords": { - "label": "Palabras clave", - "placeholder": "Palabras clave del documento" - }, - "modDate": "Fecha de modificaciÃŗn (aaaa/MM/dd HH:mm:ss):", - "producer": { - "label": "Productor", - "placeholder": "Productor del documento" - }, - "subject": { - "label": "Asunto", - "placeholder": "Asunto del documento" - }, - "trapped": { - "false": "Falso", - "label": "Estado de Trapping", - "true": "Verdadero", - "unknown": "Desconocido" - }, - "submit": "Cambiar", - "advanced": { - "title": "Opciones avanzadas" - }, - "customFields": { - "add": "AÃąadir campo", - "description": "AÃąadir campos de metadatos personalizados al documento", - "key": "Clave", - "keyPlaceholder": "Clave personalizada", - "remove": "Eliminar", - "title": "Metadatos personalizados", - "value": "Valor", - "valuePlaceholder": "Valor personalizado" - }, - "dates": { - "title": "Campos de fecha" - }, - "deleteAll": { - "checkbox": "Eliminar todos los metadatos", - "label": "Eliminar metadatos existentes" - }, - "error": { - "failed": "Se produjo un error al cambiar los metadatos del PDF." - }, - "filenamePrefix": "metadatos", - "modificationDate": { - "label": "Fecha de modificaciÃŗn", - "placeholder": "Fecha de modificaciÃŗn" - }, - "results": { - "title": "PDFs actualizados" - }, - "settings": { - "title": "ConfiguraciÃŗn de metadatos" - }, - "standardFields": { - "title": "Campos estÃĄndar" - }, - "tooltip": { - "advanced": { - "title": "Opciones avanzadas", - "trapped": { - "bullet1": "Verdadero: El documento ha sido capturado para impresiÃŗn", - "bullet2": "Falso: El documento no ha sido capturado", - "bullet3": "Desconocido: El estado de captura no estÃĄ especificado", - "description": "Indica si el documento estÃĄ preparado para impresiÃŗn de alta calidad.", - "title": "Estado de captura" - } - }, - "customFields": { - "bullet1": "AÃąada cualquier campo personalizado relevante para su documento", - "bullet2": "Ejemplos: Departamento, Proyecto, VersiÃŗn, Estado", - "bullet3": "Tanto la clave como el valor son requeridos para cada entrada", - "text": "AÃąada sus propios pares de metadatos clave-valor personalizados.", - "title": "Metadatos personalizados" - }, - "dates": { - "bullet1": "Fecha de creaciÃŗn: CuÃĄndo se creÃŗ el documento original", - "bullet2": "Fecha de modificaciÃŗn: CuÃĄndo se cambiÃŗ por Ãēltima vez", - "text": "CuÃĄndo se creÃŗ y modificÃŗ el documento.", - "title": "Campos de fecha" - }, - "deleteAll": { - "text": "EliminaciÃŗn completa de metadatos para garantizar la privacidad.", - "title": "Eliminar metadatos existentes" - }, - "header": { - "title": "DescripciÃŗn general de metadatos PDF" - }, - "options": { - "bullet1": "Metadatos personalizados: AÃąada sus propios pares clave-valor", - "bullet2": "Estado de captura: ConfiguraciÃŗn de impresiÃŗn de alta calidad", - "bullet3": "Eliminar todo: Eliminar todos los metadatos para privacidad", - "text": "Campos personalizados y controles de privacidad.", - "title": "Opciones adicionales" - }, - "standardFields": { - "bullet1": "Título: Nombre del documento o encabezado", - "bullet2": "Autor: Persona que creÃŗ el documento", - "bullet3": "Asunto: Breve descripciÃŗn del contenido", - "bullet4": "Palabras clave: TÊrminos de bÃēsqueda para el documento", - "bullet5": "Creador/Productor: Software utilizado para crear el PDF", - "text": "Campos de metadatos PDF comunes que describen el documento.", - "title": "Campos EstÃĄndar" - } - } + "modDate": "Fecha de modificaciÃŗn (aaaa/MM/dd HH:mm:ss):" }, "fileToPDF": { "tags": "transformaciÃŗn,formato,documento,imagen,diapositiva,texto,conversiÃŗn,office,docs,word,excel,powerpoint", @@ -1564,6 +1896,7 @@ "ocr": { "tags": "reconocimiento,texto,imagen,escanear,leer,identificar,detecciÃŗn,editable", "title": "OCR / Escaneo de limpieza", + "desc": "Tareas de limpieza y detectar texto en imÃĄgenes dentro de un PDF y volver a incrustarlo como texto", "header": "Escaneos de limpieza / OCR (Reconocimiento Ãŗptico de caracteres)", "selectText": { "1": "Seleccionar los idiomas que se detectarÃĄn en el PDF (Los enumerados son los detectados actualmente):", @@ -1582,7 +1915,16 @@ "help": "Lea esta documentaciÃŗn sobre cÃŗmo usar esto para otros idiomas y/o no usarlo en Docker", "credit": "Este servicio utiliza qpdf y Tesseract para OCR", "submit": "Procesar PDF con OCR", - "desc": "Tareas de limpieza y detectar texto en imÃĄgenes dentro de un PDF y volver a incrustarlo como texto", + "operation": { + "submit": "Procesar OCR y Revisar" + }, + "results": { + "title": "Resultados de OCR" + }, + "languagePicker": { + "additionalLanguages": "ÂŋBusca idiomas adicionales?", + "viewSetupGuide": "Ver guía de configuraciÃŗn →" + }, "settings": { "title": "ConfiguraciÃŗn", "ocrMode": { @@ -1595,74 +1937,67 @@ "label": "Idiomas", "placeholder": "Seleccione idiomas" }, - "advancedOptions": { - "clean": "Limpiar archivo de entrada", - "cleanFinal": "Limpiar salida final", - "deskew": "Enderezar pÃĄginas", - "label": "Opciones de Procesamiento", - "sidecar": "Crear un archivo de texto" - }, "compatibilityMode": { "label": "Modo de Compatibilidad" + }, + "advancedOptions": { + "label": "Opciones de Procesamiento", + "sidecar": "Crear un archivo de texto", + "deskew": "Enderezar pÃĄginas", + "clean": "Limpiar archivo de entrada", + "cleanFinal": "Limpiar salida final" } }, "tooltip": { + "header": { + "title": "Resumen de ConfiguraciÃŗn de OCR" + }, "mode": { "title": "Modo OCR", + "text": "El Reconocimiento Óptico de Caracteres (OCR) le ayuda a convertir pÃĄginas escaneadas o capturadas en pantalla en texto que puede buscar, copiar o resaltar.", "bullet1": "AutomÃĄtico omite pÃĄginas que ya contienen capas de texto.", "bullet2": "Forzar re-OCR todas las pÃĄginas y reemplaza todo el texto.", - "bullet3": "Estricto se detiene si se encuentra cualquier texto seleccionable.", - "text": "El Reconocimiento Óptico de Caracteres (OCR) le ayuda a convertir pÃĄginas escaneadas o capturadas en pantalla en texto que puede buscar, copiar o resaltar." + "bullet3": "Estricto se detiene si se encuentra cualquier texto seleccionable." }, "languages": { "title": "Idiomas", "text": "Mejore la precisiÃŗn del OCR especificando los idiomas esperados. Elija uno o mÃĄs idiomas para guiar la detecciÃŗn." }, + "output": { + "title": "Salida", + "text": "Decida cÃŗmo desea que se formatee la salida de texto:", + "bullet1": "PDF buscable incrusta texto detrÃĄs de la imagen original.", + "bullet2": "HOCR XML devuelve un archivo estructurado legible por mÃĄquina.", + "bullet3": "Archivo de texto plano crea un archivo .txt separado con contenido sin formato." + }, "advanced": { - "clean": { - "text": "Preprocesa la entrada eliminando ruido, mejorando el contraste y optimizando la imagen para un mejor reconocimiento OCR antes del procesamiento.", - "title": "Limpiar Archivo de Entrada" - }, - "cleanFinal": { - "text": "Posprocesa el PDF final eliminando artefactos de OCR y optimizando la capa de texto para una mejor legibilidad y un tamaÃąo de archivo mÃĄs pequeÃąo.", - "title": "Limpiar Salida Final" - }, - "compatibility": { - "text": "Utiliza el modo 'sandwich PDF' de OCR: resulta en archivos mÃĄs grandes, pero mÃĄs fiable con ciertos idiomas y software PDF antiguo. Por defecto usamos hOCR para PDF mÃĄs pequeÃąos y modernos.", - "title": "Modo de Compatibilidad" - }, - "deskew": { - "text": "Corrige automÃĄticamente pÃĄginas torcidas o inclinadas para mejorar la precisiÃŗn del OCR. Útil para documentos escaneados que no estaban perfectamente alineados.", - "title": "Enderezar PÃĄginas" - }, "header": { "title": "Procesamiento Avanzado de OCR" }, + "compatibility": { + "title": "Modo de Compatibilidad", + "text": "Utiliza el modo 'sandwich PDF' de OCR: resulta en archivos mÃĄs grandes, pero mÃĄs fiable con ciertos idiomas y software PDF antiguo. Por defecto usamos hOCR para PDF mÃĄs pequeÃąos y modernos." + }, "sidecar": { - "text": "Genera un archivo .txt separado junto al PDF que contiene todo el contenido de texto extraído para facilitar el acceso y el procesamiento.", - "title": "Crear Archivo de Texto" + "title": "Crear Archivo de Texto", + "text": "Genera un archivo .txt separado junto al PDF que contiene todo el contenido de texto extraído para facilitar el acceso y el procesamiento." + }, + "deskew": { + "title": "Enderezar PÃĄginas", + "text": "Corrige automÃĄticamente pÃĄginas torcidas o inclinadas para mejorar la precisiÃŗn del OCR. Útil para documentos escaneados que no estaban perfectamente alineados." + }, + "clean": { + "title": "Limpiar Archivo de Entrada", + "text": "Preprocesa la entrada eliminando ruido, mejorando el contraste y optimizando la imagen para un mejor reconocimiento OCR antes del procesamiento." + }, + "cleanFinal": { + "title": "Limpiar Salida Final", + "text": "Posprocesa el PDF final eliminando artefactos de OCR y optimizando la capa de texto para una mejor legibilidad y un tamaÃąo de archivo mÃĄs pequeÃąo." } - }, - "header": { - "title": "Resumen de ConfiguraciÃŗn de OCR" - }, - "output": { - "bullet1": "PDF buscable incrusta texto detrÃĄs de la imagen original.", - "bullet2": "HOCR XML devuelve un archivo estructurado legible por mÃĄquina.", - "bullet3": "Archivo de texto plano crea un archivo .txt separado con contenido sin formato.", - "text": "Decida cÃŗmo desea que se formatee la salida de texto:", - "title": "Salida" } }, - "languagePicker": { - "additionalLanguages": "ÂŋBusca idiomas adicionales?", - "viewSetupGuide": "Ver guía de configuraciÃŗn →" - }, - "operation": { - "submit": "Procesar OCR y Revisar" - }, - "results": { - "title": "Resultados de OCR" + "error": { + "failed": "OCR operation failed" } }, "extractImages": { @@ -1672,11 +2007,11 @@ "selectText": "Seleccionar el formato de imagen para convertir las imÃĄgenes extraídas", "allowDuplicates": "Guardar imÃĄgenes duplicadas", "submit": "Extraer", - "error": { - "failed": "OcurriÃŗ un error al extraer imÃĄgenes del PDF." - }, "settings": { "title": "ConfiguraciÃŗn" + }, + "error": { + "failed": "OcurriÃŗ un error al extraer imÃĄgenes del PDF." } }, "pdfToPDFA": { @@ -1749,14 +2084,43 @@ }, "info": "Python no estÃĄ instalado. Se requiere para funcionar." }, + "scannerImageSplit": { + "title": "ImÃĄgenes Extraídas", + "submit": "Extraer Escaneos de ImÃĄgenes", + "error": { + "failed": "Se produjo un error al extraer escaneos de imÃĄgenes." + }, + "tooltip": { + "title": "Divisor de Fotos", + "whatThisDoes": "QuÊ hace esto", + "whatThisDoesDesc": "Encuentra y extrae automÃĄticamente cada foto de una pÃĄgina escaneada o imagen compuesta, sin recorte manual.", + "whenToUse": "CuÃĄndo usar", + "useCase1": "Escanee pÃĄginas completas de ÃĄlbumes de una sola vez", + "useCase2": "Divida lotes de cama plana en archivos separados", + "useCase3": "Divida collages en fotos individuales", + "useCase4": "Extraiga fotos de documentos", + "quickFixes": "Soluciones rÃĄpidas", + "problem1": "Fotos no detectadas → aumente la Tolerancia a 30-50", + "problem2": "Demasiadas detecciones falsas → aumente el Área Mínima a 15,000-20,000", + "problem3": "Los recortes son demasiado ajustados → aumente el TamaÃąo del Borde a 5-10", + "problem4": "Fotos inclinadas no enderezadas → reduzca el Umbral de Ángulo a ~5°", + "problem5": "Cuadros de polvo/ruido → aumente el Área Mínima de Contorno a 1000-2000", + "setupTips": "Consejos de configuraciÃŗn", + "tip1": "Use un fondo plano y claro", + "tip2": "Deje un pequeÃąo espacio (≈1 cm) entre fotos", + "tip3": "Escanee a 300-600 DPI", + "tip4": "Limpie el cristal del escÃĄner", + "headsUp": "Advertencia", + "headsUpDesc": "Las fotos superpuestas o fondos muy cercanos en color a las fotos pueden reducir la precisiÃŗn; intente usar un fondo mÃĄs claro u oscuro y deje mÃĄs espacio." + } + }, "sign": { - "tags": "autorizar,iniciales,firma manuscrita,texto de firma,imagen de firma", "title": "Firmar", "header": "Firmar archivos PDF", "upload": "Subir imagen", "draw": { - "clear": "Limpiar", - "title": "Dibuje su firma" + "title": "Dibuje su firma", + "clear": "Limpiar" }, "text": { "name": "Nombre del Firmante", @@ -1766,6 +2130,7 @@ "add": "Agregar", "saved": "firmas guardadas", "save": "Guardar Firma", + "applySignatures": "Aplicar Firmas", "personalSigs": "Firmas Personales", "sharedSigs": "Firmas compartidas", "noSavedSigs": "No se encontraron firmas guardadas", @@ -1778,83 +2143,92 @@ "maintainRatio": "Activar/desactivar la relaciÃŗn de aspecto", "undo": "Deshacer", "redo": "Rehacer", - "activate": "Activar ColocaciÃŗn de Firma", - "applySignatures": "Aplicar Firmas", - "deactivate": "Dejar de Colocar Firmas", - "error": { - "failed": "Se produjo un error al firmar el PDF." - }, - "image": { - "hint": "Cargue una imagen PNG o JPG de su firma", - "label": "Cargar imagen de firma", - "placeholder": "Seleccionar archivo de imagen" - }, - "instructions": { - "title": "CÃŗmo aÃąadir firma" - }, - "results": { - "title": "Resultados de Firma" - }, + "submit": "Firmar Documento", "steps": { "configure": "Configurar Firma" }, - "submit": "Firmar Documento", "type": { - "canvas": "Lienzo", + "title": "Tipo de Firma", "draw": "Dibujar", + "canvas": "Lienzo", "image": "Imagen", - "text": "Texto", - "title": "Tipo de Firma" - } + "text": "Texto" + }, + "image": { + "label": "Cargar imagen de firma", + "placeholder": "Seleccionar archivo de imagen", + "hint": "Cargue una imagen PNG o JPG de su firma" + }, + "instructions": { + "title": "CÃŗmo aÃąadir firma", + "canvas": "After drawing your signature in the canvas, close the modal then click anywhere on the PDF to place it.", + "image": "After uploading your signature image above, click anywhere on the PDF to place it.", + "text": "After entering your name above, click anywhere on the PDF to place your signature." + }, + "mode": { + "move": "Move Signature", + "place": "Place Signature" + }, + "updateAndPlace": "Update and Place", + "activate": "Activar ColocaciÃŗn de Firma", + "deactivate": "Dejar de Colocar Firmas", + "results": { + "title": "Resultados de Firma" + }, + "error": { + "failed": "Se produjo un error al firmar el PDF." + }, + "tags": "autorizar,iniciales,firma manuscrita,texto de firma,imagen de firma" }, "flatten": { - "tags": "estÃĄtica,desactivar,no interactiva,etiqueta dinÃĄmica", "title": "Aplanar", "header": "Acoplar archivos PDF", "flattenOnlyForms": "Aplanar sÃŗlo formularios", "submit": "Aplanar", - "steps": { - "settings": "ConfiguraciÃŗn" - }, - "options": { - "flattenOnlyForms": { - "desc": "Solo aplanar campos de formulario, dejando intactos otros elementos interactivos" - }, - "note": "Aplanar elimina elementos interactivos del PDF, haciÊndolos no editables.", - "stepTitle": "Opciones de Aplanado", - "title": "Opciones de Aplanado" - }, - "error": { - "failed": "OcurriÃŗ un error al aplanar el PDF." - }, "filenamePrefix": "aplanado", "files": { "placeholder": "Seleccione un archivo PDF en la vista principal para comenzar" }, + "steps": { + "settings": "ConfiguraciÃŗn" + }, + "options": { + "stepTitle": "Opciones de Aplanado", + "title": "Opciones de Aplanado", + "flattenOnlyForms": { + "label": "Flatten only forms", + "desc": "Solo aplanar campos de formulario, dejando intactos otros elementos interactivos" + }, + "note": "Aplanar elimina elementos interactivos del PDF, haciÊndolos no editables." + }, "results": { "title": "Resultados de Aplanado" }, + "error": { + "failed": "OcurriÃŗ un error al aplanar el PDF." + }, "tooltip": { + "header": { + "title": "Acerca de Aplanar PDFs" + }, "description": { + "title": "ÂŋQuÊ hace el aplanado?", + "text": "Aplanar hace que su PDF no sea editable al convertir formularios rellenables y botones en texto e imÃĄgenes regulares. El PDF se verÃĄ exactamente igual, pero nadie podrÃĄ cambiar o rellenar los formularios. Perfecto para compartir formularios completados, crear documentos finales para registros, o garantizar que el PDF se vea igual en todas partes.", "bullet1": "Las cajas de texto se convierten en texto regular (no se pueden editar)", "bullet2": "Las casillas de verificaciÃŗn y botones se convierten en imÃĄgenes", "bullet3": "Ideal para versiones finales que no desea que sean modificadas", - "bullet4": "Garantiza una apariencia consistente en todos los dispositivos", - "text": "Aplanar hace que su PDF no sea editable al convertir formularios rellenables y botones en texto e imÃĄgenes regulares. El PDF se verÃĄ exactamente igual, pero nadie podrÃĄ cambiar o rellenar los formularios. Perfecto para compartir formularios completados, crear documentos finales para registros, o garantizar que el PDF se vea igual en todas partes.", - "title": "ÂŋQuÊ hace el aplanado?" + "bullet4": "Garantiza una apariencia consistente en todos los dispositivos" }, "formsOnly": { + "title": "ÂŋQuÊ significa 'Aplanar solo formularios'?", + "text": "Esta opciÃŗn solo elimina la capacidad de rellenar formularios, pero mantiene otras funciones funcionando como hacer clic en enlaces, ver marcadores y leer comentarios.", "bullet1": "Los formularios se vuelven no editables", "bullet2": "Los enlaces siguen funcionando al hacer clic", "bullet3": "Los comentarios y notas permanecen visibles", - "bullet4": "Los marcadores siguen ayudÃĄndole a navegar", - "text": "Esta opciÃŗn solo elimina la capacidad de rellenar formularios, pero mantiene otras funciones funcionando como hacer clic en enlaces, ver marcadores y leer comentarios.", - "title": "ÂŋQuÊ significa 'Aplanar solo formularios'?" - }, - "header": { - "title": "Acerca de Aplanar PDFs" + "bullet4": "Los marcadores siguen ayudÃĄndole a navegar" } - } + }, + "tags": "estÃĄtica,desactivar,no interactiva,etiqueta dinÃĄmica" }, "repair": { "tags": "reparar,restaurar,corregir,recuperar", @@ -1862,78 +2236,84 @@ "header": "Reparar archivos PDF", "submit": "Reparar", "description": "Esta herramienta intentarÃĄ reparar archivos PDF corruptos o daÃąados. No se requieren configuraciones adicionales.", - "error": { - "failed": "Se produjo un error al reparar el PDF." - }, "filenamePrefix": "reparado", "files": { "placeholder": "Seleccione un archivo PDF en la vista principal para comenzar" }, + "error": { + "failed": "Se produjo un error al reparar el PDF." + }, "results": { "title": "Resultados de ReparaciÃŗn" } }, "removeBlanks": { - "tags": "limpieza,dinÃĄmica,sin contenido,organizar", "title": "Eliminar espacios en blanco", "header": "Eliminar pÃĄginas en blanco", + "settings": { + "title": "ConfiguraciÃŗn" + }, "threshold": { "label": "Umbral de Blancura de Píxeles" }, - "thresholdDesc": "Umbral para determinar cuÃĄn blanco debe ser un píxel blanco", "whitePercent": { "label": "Umbral de Porcentaje Blanco", "unit": "%" }, - "whitePercentDesc": "Porcentaje de pÃĄgina que debe ser blanca para ser eliminada", - "submit": "Eliminar espacios en blanco", "includeBlankPages": { "label": "Incluir pÃĄginas en blanco detectadas" }, - "settings": { - "title": "ConfiguraciÃŗn" - }, "tooltip": { "header": { "title": "ConfiguraciÃŗn de Eliminar PÃĄginas en Blanco" }, - "includeBlankPages": { - "bullet1": "Útil para revisar lo que se eliminÃŗ", - "bullet2": "Ayuda a verificar la precisiÃŗn de la detecciÃŗn", - "bullet3": "Se puede deshabilitar para reducir el tamaÃąo del archivo de salida", - "text": "Cuando estÃĄ habilitado, crea un PDF separado que contiene todas las pÃĄginas en blanco que fueron detectadas y eliminadas del documento original.", - "title": "Incluir PÃĄginas en Blanco Detectadas" - }, "threshold": { + "title": "Umbral de Blancura de Píxeles", + "text": "Controla quÊ tan blanco debe ser un píxel para ser considerado 'blanco'. Esto ayuda a determinar quÊ cuenta como un ÃĄrea en blanco en la pÃĄgina.", "bullet1": "0 = Negro puro (mÃĄs restrictivo)", "bullet2": "128 = Gris medio", - "bullet3": "255 = Blanco puro (menos restrictivo)", - "text": "Controla quÊ tan blanco debe ser un píxel para ser considerado 'blanco'. Esto ayuda a determinar quÊ cuenta como un ÃĄrea en blanco en la pÃĄgina.", - "title": "Umbral de Blancura de Píxeles" + "bullet3": "255 = Blanco puro (menos restrictivo)" }, "whitePercent": { + "title": "Umbral de Porcentaje Blanco", + "text": "Establece el porcentaje mínimo de píxeles blancos requerido para que una pÃĄgina se considere en blanco y se elimine.", "bullet1": "Valores mÃĄs bajos (por ejemplo, 80%) = MÃĄs pÃĄginas eliminadas", "bullet2": "Valores mÃĄs altos (por ejemplo, 95%) = Solo se eliminan pÃĄginas muy en blanco", - "bullet3": "Use valores mÃĄs altos para documentos con fondos claros", - "text": "Establece el porcentaje mínimo de píxeles blancos requerido para que una pÃĄgina se considere en blanco y se elimine.", - "title": "Umbral de Porcentaje Blanco" + "bullet3": "Use valores mÃĄs altos para documentos con fondos claros" + }, + "includeBlankPages": { + "title": "Incluir PÃĄginas en Blanco Detectadas", + "text": "Cuando estÃĄ habilitado, crea un PDF separado que contiene todas las pÃĄginas en blanco que fueron detectadas y eliminadas del documento original.", + "bullet1": "Útil para revisar lo que se eliminÃŗ", + "bullet2": "Ayuda a verificar la precisiÃŗn de la detecciÃŗn", + "bullet3": "Se puede deshabilitar para reducir el tamaÃąo del archivo de salida" } - } + }, + "submit": "Eliminar espacios en blanco", + "error": { + "failed": "Failed to remove blank pages" + }, + "results": { + "title": "Removed Blank Pages" + }, + "tags": "limpieza,dinÃĄmica,sin contenido,organizar", + "thresholdDesc": "Umbral para determinar cuÃĄn blanco debe ser un píxel blanco", + "whitePercentDesc": "Porcentaje de pÃĄgina que debe ser blanca para ser eliminada" }, "removeAnnotations": { "tags": "comentarios,subrayar,notas,margen,eliminar", "title": "Eliminar anotaciones", "header": "Eliminar anotaciones", "submit": "Eliminar", - "error": { - "failed": "Se produjo un error al eliminar las anotaciones del PDF." - }, - "info": { - "description": "Esta herramienta eliminarÃĄ todas las anotaciones (comentarios, resaltados, notas, etc.) de sus documentos PDF.", - "title": "Acerca de Eliminar Anotaciones" - }, "settings": { "title": "ConfiguraciÃŗn" + }, + "info": { + "title": "Acerca de Eliminar Anotaciones", + "description": "Esta herramienta eliminarÃĄ todas las anotaciones (comentarios, resaltados, notas, etc.) de sus documentos PDF." + }, + "error": { + "failed": "Se produjo un error al eliminar las anotaciones del PDF." } }, "compare": { @@ -1966,43 +2346,39 @@ "certSign": { "tags": "autentificar,PEM,P12,oficial,encriptar", "title": "Firma con certificado", - "header": "Firmar un PDF con su certificado (en desarrollo)", - "selectPDF": "Seleccione un archivo PDF para firmar:", - "jksNote": "Nota: si el tipo de certificado no estÃĄ enla lista de abajo, por favor conviÊrtalo a un archivo almacÊn de claves de Java Java KeyStore (.jks) utilizando la herramienta línea de comandos. Posteriormente, seleccione en el listado de abajo la opciÃŗn archivo .jks.", - "selectKey": "Seleccione su archivo de clave privada (formato PKCS#8, podría ser .pem o .der):", - "selectCert": "Seleccione su archivo de certificado (formato X.509, podría ser .pem o .der):", - "selectP12": "Seleccione su archivo de almacÊn de claves PKCS#12 (.p12 o .pfx) (Opcional, si se proporciona, debe contener su clave privada y certificado):", - "selectJKS": "Seleccione su archivo de almacÊn de claves Java KeyStore (.jks or .keystore):", - "certType": { + "filenamePrefix": "firmado", + "signMode": { + "stepTitle": "Modo de firma", "tooltip": { - "convert": { - "text": "Convierta su archivo a un almacÊn de claves Java (.jks) con keytool, luego elija JKS.", - "title": "ÂŋClave no listada?" - }, "header": { - "title": "Acerca de los tipos de certificado" + "title": "Acerca de las firmas PDF" }, - "what": { - "text": "Es una identificaciÃŗn segura para su firma que demuestra que usted firmÃŗ. A menos que deba firmar mediante certificado, recomendamos usar otro mÊtodo seguro como escribir, dibujar o cargar.", - "title": "ÂŋQuÊ es un certificado?" + "overview": { + "title": "CÃŗmo funcionan las firmas", + "text": "Ambos modos sellan el documento (cualquier ediciÃŗn se marca como manipulaciÃŗn) y registran quiÊn/cuÃĄndo/cÃŗmo para auditoría. La confianza del visor depende de la cadena de certificados." }, - "which": { - "bullet1": "PKCS#12 (.p12 / .pfx) – un archivo combinado (mÃĄs comÃēn)", - "bullet2": "PFX (.pfx) – versiÃŗn de Microsoft de PKCS12", - "bullet3": "PEM – archivos .pem separados de clave privada y certificado", - "bullet4": "JKS – almacÊn de claves Java .jks para desarrollo / flujos de trabajo CI-CD", - "text": "Elija el formato que coincida con su archivo de certificado:", - "title": "ÂŋQuÊ opciÃŗn debo usar?" + "manual": { + "title": "Manual - Traiga su certificado", + "text": "Use sus propios archivos de certificado para identidad alineada con su marca. Puede mostrar Confiable cuando su CA/cadena es reconocida.", + "use": "Usar para: atenciÃŗn al cliente, legal, cumplimiento." + }, + "auto": { + "title": "AutomÃĄtico - ConfiguraciÃŗn cero, sello de sistema instantÃĄneo", + "text": "Firma con un certificado autofirmado del servidor. Mismo sello contra manipulaciones y registro de auditoría; normalmente muestra No verificado en los visores.", + "use": "Usar cuando: necesite velocidad e identidad interna consistente en revisiones y registros." + }, + "rule": { + "title": "Regla general", + "text": "ÂŋNecesita estado Confiable del destinatario? Manual. ÂŋNecesita un sello rÃĄpido contra manipulaciones y registro de auditoría sin configuraciÃŗn? AutomÃĄtico." } } }, - "password": "Introduzca su almacÊn de claves o contraseÃąa de clave privada (si corresponde):", - "showSig": "Mostrar firma", - "reason": "RazÃŗn", - "location": "UbicaciÃŗn", - "name": "Nombre", - "showLogo": "Mostrar Logotipo", - "submit": "Firmar PDF", + "certTypeStep": { + "stepTitle": "Formato de certificado" + }, + "certFiles": { + "stepTitle": "Archivos de certificado" + }, "appearance": { "stepTitle": "Apariencia de firma", "tooltip": { @@ -2010,92 +2386,111 @@ "title": "Acerca de la apariencia de firma" }, "invisible": { + "title": "Firmas invisibles", + "text": "La firma se aÃąade al PDF para seguridad, pero no serÃĄ visible al visualizar el documento. Perfecto para requisitos legales sin cambiar la apariencia del documento.", "bullet1": "Proporciona seguridad sin cambios visuales", "bullet2": "Cumple requisitos legales para firma digital", - "bullet3": "No afecta el diseÃąo ni el aspecto del documento", - "text": "La firma se aÃąade al PDF para seguridad, pero no serÃĄ visible al visualizar el documento. Perfecto para requisitos legales sin cambiar la apariencia del documento.", - "title": "Firmas invisibles" + "bullet3": "No afecta el diseÃąo ni el aspecto del documento" }, "visible": { + "title": "Firmas visibles", + "text": "Muestra un bloque de firma en el PDF con su nombre, fecha y detalles opcionales. Útil cuando desea que los lectores vean claramente que el documento estÃĄ firmado.", "bullet1": "Muestra nombre del firmante y fecha en el documento", "bullet2": "Puede incluir motivo y ubicaciÃŗn de la firma", "bullet3": "Elija en quÊ pÃĄgina colocar la firma", - "bullet4": "Se puede incluir un logotipo opcional", - "text": "Muestra un bloque de firma en el PDF con su nombre, fecha y detalles opcionales. Útil cuando desea que los lectores vean claramente que el documento estÃĄ firmado.", - "title": "Firmas visibles" + "bullet4": "Se puede incluir un logotipo opcional" } - } + }, + "invisible": "Invisible", + "options": { + "title": "Signature Details" + }, + "visible": "Visible" }, - "certFiles": { - "stepTitle": "Archivos de certificado" - }, - "certTypeStep": { - "stepTitle": "Formato de certificado" + "sign": { + "submit": "Firmar PDF", + "results": "PDF firmado" }, "error": { "failed": "Se produjo un error al procesar las firmas." }, - "filenamePrefix": "firmado", - "sign": { - "results": "PDF firmado", - "submit": "Firmar PDF" - }, - "signMode": { - "stepTitle": "Modo de firma", - "tooltip": { - "auto": { - "text": "Firma con un certificado autofirmado del servidor. Mismo sello contra manipulaciones y registro de auditoría; normalmente muestra No verificado en los visores.", - "title": "AutomÃĄtico - ConfiguraciÃŗn cero, sello de sistema instantÃĄneo", - "use": "Usar cuando: necesite velocidad e identidad interna consistente en revisiones y registros." - }, - "header": { - "title": "Acerca de las firmas PDF" - }, - "manual": { - "text": "Use sus propios archivos de certificado para identidad alineada con su marca. Puede mostrar Confiable cuando su CA/cadena es reconocida.", - "title": "Manual - Traiga su certificado", - "use": "Usar para: atenciÃŗn al cliente, legal, cumplimiento." - }, - "overview": { - "text": "Ambos modos sellan el documento (cualquier ediciÃŗn se marca como manipulaciÃŗn) y registran quiÊn/cuÃĄndo/cÃŗmo para auditoría. La confianza del visor depende de la cadena de certificados.", - "title": "CÃŗmo funcionan las firmas" - }, - "rule": { - "text": "ÂŋNecesita estado Confiable del destinatario? Manual. ÂŋNecesita un sello rÃĄpido contra manipulaciones y registro de auditoría sin configuraciÃŗn? AutomÃĄtico.", - "title": "Regla general" - } - } - }, "tooltip": { "header": { "title": "Acerca de la gestiÃŗn de firmas" }, "overview": { + "title": "ÂŋQuÊ puede hacer esta herramienta?", + "text": "Esta herramienta le permite verificar si sus PDFs estÃĄn firmados digitalmente y aÃąadir nuevas firmas digitales. Las firmas digitales demuestran quiÊn creÃŗ o aprobÃŗ un documento y muestran si ha sido cambiado desde la firma.", "bullet1": "Verificar firmas existentes y su validez", "bullet2": "Ver informaciÃŗn detallada sobre firmantes y certificados", "bullet3": "AÃąadir nuevas firmas digitales para asegurar sus documentos", - "bullet4": "MÃēltiples archivos compatibles con navegaciÃŗn fÃĄcil", - "text": "Esta herramienta le permite verificar si sus PDFs estÃĄn firmados digitalmente y aÃąadir nuevas firmas digitales. Las firmas digitales demuestran quiÊn creÃŗ o aprobÃŗ un documento y muestran si ha sido cambiado desde la firma.", - "title": "ÂŋQuÊ puede hacer esta herramienta?" + "bullet4": "MÃēltiples archivos compatibles con navegaciÃŗn fÃĄcil" + }, + "validation": { + "title": "Verificar firmas", + "text": "Cuando verifica firmas, la herramienta le indica si son vÃĄlidas, quiÊn firmÃŗ el documento, cuÃĄndo se firmÃŗ y si el documento ha sido cambiado desde la firma.", + "bullet1": "Muestra si las firmas son vÃĄlidas o invÃĄlidas", + "bullet2": "Muestra informaciÃŗn del firmante y fecha de firma", + "bullet3": "Verifica si el documento fue modificado despuÊs de firmar", + "bullet4": "Puede usar certificados personalizados para verificaciÃŗn" }, "signing": { + "title": "AÃąadir firmas", + "text": "Para firmar un PDF, necesita un certificado digital (como PEM, PKCS12 o JKS). Puede elegir hacer visible la firma en el documento o mantenerla invisible solo para seguridad.", "bullet1": "Compatible con formatos PEM, PKCS12, JKS y certificado de servidor", "bullet2": "OpciÃŗn de mostrar u ocultar firma en el PDF", "bullet3": "AÃąadir motivo, ubicaciÃŗn y nombre del firmante", "bullet4": "Elegir en quÊ pÃĄgina colocar firmas visibles", - "bullet5": "Usar certificado de servidor para la opciÃŗn simple 'Firmar con Stirling-PDF'", - "text": "Para firmar un PDF, necesita un certificado digital (como PEM, PKCS12 o JKS). Puede elegir hacer visible la firma en el documento o mantenerla invisible solo para seguridad.", - "title": "AÃąadir firmas" - }, - "validation": { - "bullet1": "Muestra si las firmas son vÃĄlidas o invÃĄlidas", - "bullet2": "Muestra informaciÃŗn del firmante y fecha de firma", - "bullet3": "Verifica si el documento fue modificado despuÊs de firmar", - "bullet4": "Puede usar certificados personalizados para verificaciÃŗn", - "text": "Cuando verifica firmas, la herramienta le indica si son vÃĄlidas, quiÊn firmÃŗ el documento, cuÃĄndo se firmÃŗ y si el documento ha sido cambiado desde la firma.", - "title": "Verificar firmas" + "bullet5": "Usar certificado de servidor para la opciÃŗn simple 'Firmar con Stirling-PDF'" } - } + }, + "certType": { + "tooltip": { + "header": { + "title": "Acerca de los tipos de certificado" + }, + "what": { + "title": "ÂŋQuÊ es un certificado?", + "text": "Es una identificaciÃŗn segura para su firma que demuestra que usted firmÃŗ. A menos que deba firmar mediante certificado, recomendamos usar otro mÊtodo seguro como escribir, dibujar o cargar." + }, + "which": { + "title": "ÂŋQuÊ opciÃŗn debo usar?", + "text": "Elija el formato que coincida con su archivo de certificado:", + "bullet1": "PKCS#12 (.p12 / .pfx) – un archivo combinado (mÃĄs comÃēn)", + "bullet2": "PFX (.pfx) – versiÃŗn de Microsoft de PKCS12", + "bullet3": "PEM – archivos .pem separados de clave privada y certificado", + "bullet4": "JKS – almacÊn de claves Java .jks para desarrollo / flujos de trabajo CI-CD" + }, + "convert": { + "title": "ÂŋClave no listada?", + "text": "Convierta su archivo a un almacÊn de claves Java (.jks) con keytool, luego elija JKS." + } + } + }, + "chooseCertificate": "Choose Certificate File", + "chooseJksFile": "Choose JKS File", + "chooseP12File": "Choose PKCS12 File", + "choosePfxFile": "Choose PFX File", + "choosePrivateKey": "Choose Private Key File", + "location": "UbicaciÃŗn", + "logoTitle": "Logo", + "name": "Nombre", + "noLogo": "No Logo", + "pageNumber": "Page Number", + "password": "Introduzca su almacÊn de claves o contraseÃąa de clave privada (si corresponde):", + "passwordOptional": "Leave empty if no password", + "reason": "RazÃŗn", + "serverCertMessage": "Using server certificate - no files or password required", + "showLogo": "Mostrar Logotipo", + "header": "Firmar un PDF con su certificado (en desarrollo)", + "selectPDF": "Seleccione un archivo PDF para firmar:", + "jksNote": "Nota: si el tipo de certificado no estÃĄ enla lista de abajo, por favor conviÊrtalo a un archivo almacÊn de claves de Java Java KeyStore (.jks) utilizando la herramienta línea de comandos. Posteriormente, seleccione en el listado de abajo la opciÃŗn archivo .jks.", + "selectKey": "Seleccione su archivo de clave privada (formato PKCS#8, podría ser .pem o .der):", + "selectCert": "Seleccione su archivo de certificado (formato X.509, podría ser .pem o .der):", + "selectP12": "Seleccione su archivo de almacÊn de claves PKCS#12 (.p12 o .pfx) (Opcional, si se proporciona, debe contener su clave privada y certificado):", + "selectJKS": "Seleccione su archivo de almacÊn de claves Java KeyStore (.jks or .keystore):", + "showSig": "Mostrar firma", + "submit": "Firmar PDF" }, "removeCertSign": { "tags": "autenticar,PEM,P12,oficial,desencriptar", @@ -2104,13 +2499,13 @@ "selectPDF": "Seleccione un archivo PDF:", "submit": "Eliminar firma", "description": "Esta herramienta eliminarÃĄ las firmas de certificado digital de su documento PDF.", - "error": { - "failed": "Se produjo un error al eliminar las firmas de certificado." - }, "filenamePrefix": "sin_firmar", "files": { "placeholder": "Seleccione un archivo PDF en la vista principal para comenzar" }, + "error": { + "failed": "Se produjo un error al eliminar las firmas de certificado." + }, "results": { "title": "Resultados de EliminaciÃŗn de Certificado" } @@ -2121,16 +2516,157 @@ "header": "DiseÃąo de varias pÃĄginas", "pagesPerSheet": "PÃĄginas por hoja:", "addBorder": "AÃąadir bordes", - "submit": "Entregar" + "submit": "Entregar", + "desc": { + "2": "Place 2 pages side-by-side on a single sheet.", + "3": "Place 3 pages on a single sheet in a single row.", + "4": "Place 4 pages on a single sheet (2 × 2 grid).", + "9": "Place 9 pages on a single sheet (3 × 3 grid).", + "16": "Place 16 pages on a single sheet (4 × 4 grid)." + }, + "error": { + "failed": "An error occurred while creating the multi-page layout." + } + }, + "bookletImposition": { + "tags": "folleto,imposiciÃŗn,impresiÃŗn,encuadernaciÃŗn,plegado,signatura", + "title": "ImposiciÃŗn de folleto", + "header": "ImposiciÃŗn de folleto", + "submit": "Crear folleto", + "spineLocation": { + "label": "UbicaciÃŗn del lomo", + "left": "Izquierda (EstÃĄndar)", + "right": "Derecha (RTL)" + }, + "doubleSided": { + "label": "ImpresiÃŗn a doble cara", + "tooltip": "Crea ambos lados frontal y posterior para impresiÃŗn de folleto adecuada" + }, + "manualDuplex": { + "title": "Modo dÃēplex manual", + "instructions": "Para impresoras sin dÃēplex automÃĄtico. NecesitarÃĄ ejecutar esto dos veces:" + }, + "duplexPass": { + "label": "Pasada de impresiÃŗn", + "first": "Primera pasada", + "second": "Segunda pasada", + "firstInstructions": "Imprime lados frontales → apile boca abajo → ejecute de nuevo con segunda pasada", + "secondInstructions": "Cargue la pila impresa boca abajo → imprime lados posteriores" + }, + "rtlBinding": { + "label": "EncuadernaciÃŗn de derecha a izquierda", + "tooltip": "Para ÃĄrabe, hebreo u otros idiomas de derecha a izquierda" + }, + "addBorder": { + "label": "AÃąadir bordes alrededor de las pÃĄginas", + "tooltip": "AÃąade bordes alrededor de cada secciÃŗn de pÃĄgina para ayudar con el corte y la alineaciÃŗn" + }, + "addGutter": { + "label": "AÃąadir margen de medianil", + "tooltip": "AÃąade espacio de margen interior para encuadernaciÃŗn" + }, + "gutterSize": { + "label": "TamaÃąo de medianil (puntos)" + }, + "flipOnShortEdge": { + "label": "Voltear por borde corto (solo dÃēplex automÃĄtico)", + "tooltip": "Active para impresiÃŗn dÃēplex por borde corto (solo dÃēplex automÃĄtico - ignorado en modo manual)", + "manualNote": "No necesario en modo manual: usted voltea la pila manualmente" + }, + "advanced": { + "toggle": "Opciones avanzadas" + }, + "paperSizeNote": "El tamaÃąo del papel se deriva automÃĄticamente de su primera pÃĄgina.", + "tooltip": { + "header": { + "title": "Guía de creaciÃŗn de folletos" + }, + "description": { + "title": "ÂŋQuÊ es la imposiciÃŗn de folleto?", + "text": "Crea folletos profesionales organizando las pÃĄginas en el orden de impresiÃŗn correcto. Las pÃĄginas de su PDF se colocan de 2 en 2 en hojas horizontales, de modo que cuando se doblan y se encuadernan, se lean en la secuencia adecuada como un libro real." + }, + "example": { + "title": "Ejemplo: Folleto de 8 pÃĄginas", + "text": "Su documento de 8 pÃĄginas se convierte en 2 hojas:", + "bullet1": "Hoja 1 frontal: PÃĄginas 8, 1 | Posterior: PÃĄginas 2, 7", + "bullet2": "Hoja 2 frontal: PÃĄginas 6, 3 | Posterior: PÃĄginas 4, 5", + "bullet3": "Cuando se dobla y apila: Lee 1→2→3→4→5→6→7→8" + }, + "printing": { + "title": "CÃŗmo imprimir y ensamblar", + "text": "Siga estos pasos para folletos perfectos:", + "bullet1": "Imprima a doble cara con 'Voltear por borde largo'", + "bullet2": "Apile hojas en orden, doble por la mitad", + "bullet3": "Grape o encuaderne a lo largo del lomo doblado", + "bullet4": "Para impresoras de borde corto: Active la opciÃŗn 'Voltear por borde corto'" + }, + "manualDuplex": { + "title": "DÃēplex manual (impresoras de una cara)", + "text": "Para impresoras sin dÃēplex automÃĄtico:", + "bullet1": "Desactive 'ImpresiÃŗn a doble cara'", + "bullet2": "Seleccione 'Primera pasada' → Imprimir → Apile boca abajo", + "bullet3": "Seleccione 'Segunda pasada' → Cargue pila → Imprima posteriores", + "bullet4": "Doble y ensamble normalmente" + }, + "advanced": { + "title": "Opciones avanzadas", + "text": "Ajuste fino de su folleto:", + "bullet1": "EncuadernaciÃŗn de derecha a izquierda: Para ÃĄrabe, hebreo o idiomas RTL", + "bullet2": "Bordes: Muestra líneas de corte para recortar", + "bullet3": "Margen de medianil: AÃąade espacio para encuadernaciÃŗn/grapado", + "bullet4": "Volteo por borde corto: Solo para impresoras dÃēplex automÃĄticas" + } + }, + "error": { + "failed": "Se produjo un error al crear la imposiciÃŗn de folleto." + } }, "scalePages": { - "tags": "cambiar tamaÃąo,modificar,dimensionar,adaptar", "title": "Ajustar escala de la pÃĄgina", "header": "Ajustar escala de la pÃĄgina", "pageSize": "TamaÃąo de la pÃĄgina del documento", "keepPageSize": "TamaÃąo Original", "scaleFactor": "Nivel de zoom (recorte) de la pÃĄgina", - "submit": "Entregar" + "submit": "Entregar", + "tags": "cambiar tamaÃąo,modificar,dimensionar,adaptar" + }, + "adjustPageScale": { + "tags": "redimensionar,modificar,dimensiÃŗn,adaptar", + "title": "Ajustar escala de pÃĄgina", + "header": "Ajustar escala de pÃĄgina", + "scaleFactor": { + "label": "Factor de escala" + }, + "pageSize": { + "label": "TamaÃąo de pÃĄgina de destino", + "keep": "Mantener tamaÃąo original", + "letter": "Carta", + "legal": "Legal" + }, + "submit": "Ajustar escala de pÃĄgina", + "error": { + "failed": "Se produjo un error al ajustar la escala de pÃĄgina." + }, + "tooltip": { + "header": { + "title": "DescripciÃŗn general de configuraciÃŗn de escala de pÃĄgina" + }, + "description": { + "title": "DescripciÃŗn", + "text": "Ajuste el tamaÃąo del contenido del PDF y cambie las dimensiones de pÃĄgina." + }, + "scaleFactor": { + "title": "Factor de escala", + "text": "Controla el tamaÃąo del contenido en la pÃĄgina. El contenido se escala y se centra; si el contenido escalado es mÃĄs grande que el tamaÃąo de pÃĄgina, puede recortarse.", + "bullet1": "1.0 = TamaÃąo original", + "bullet2": "0.5 = Mitad del tamaÃąo (50% mÃĄs pequeÃąo)", + "bullet3": "2.0 = Doble tamaÃąo (200% mÃĄs grande, puede recortarse)" + }, + "pageSize": { + "title": "TamaÃąo de pÃĄgina de destino", + "text": "Establece las dimensiones de las pÃĄginas del PDF de salida. 'Mantener tamaÃąo original' conserva las dimensiones actuales, mientras que otras opciones redimensionan a tamaÃąos de papel estÃĄndar." + } + } }, "add-page-numbers": { "tags": "paginar,etiquetar,organizar,indexar" @@ -2139,14 +2675,14 @@ "tags": "auto-detectar,basado en el encabezamiento,organizar,re-etiquetar", "title": "Renombrar automÃĄticamente", "header": "Renombrar PDF automÃĄticamente", - "submit": "Renombrar automÃĄticamente", "description": "Encuentra automÃĄticamente el título del contenido de su PDF y lo utiliza como nombre de archivo.", - "error": { - "failed": "Se produjo un error al renombrar automÃĄticamente el PDF." - }, + "submit": "Renombrar automÃĄticamente", "files": { "placeholder": "Seleccione un archivo PDF en la vista principal para comenzar" }, + "error": { + "failed": "Se produjo un error al renombrar automÃĄticamente el PDF." + }, "results": { "title": "Resultados de cambio de nombre automÃĄtico" }, @@ -2155,11 +2691,11 @@ "title": "CÃŗmo funciona el cambio de nombre automÃĄtico" }, "howItWorks": { + "title": "Cambio de nombre inteligente", + "text": "Encuentra automÃĄticamente el título del contenido de su PDF y lo utiliza como nombre de archivo.", "bullet1": "Busca texto que parezca ser un título o encabezado", "bullet2": "Crea un nombre de archivo limpio y vÃĄlido a partir del título detectado", - "bullet3": "Conserva el nombre original si no se encuentra un título adecuado", - "text": "Encuentra automÃĄticamente el título del contenido de su PDF y lo utiliza como nombre de archivo.", - "title": "Cambio de nombre inteligente" + "bullet3": "Conserva el nombre original si no se encuentra un título adecuado" } } }, @@ -2167,39 +2703,55 @@ "tags": "correcciÃŗn de color,sintonizar color,modificar,mejorar" }, "crop": { - "tags": "recortar,contraer,editar,forma", "title": "Recortar", "header": "Recortar PDF", "submit": "Entregar", - "coordinates": { - "height": "Altura", - "title": "PosiciÃŗn y TamaÃąo", - "width": "Ancho", - "x": "PosiciÃŗn X", - "y": "PosiciÃŗn Y" - }, - "error": { - "failed": "Error al recortar PDF", - "invalidArea": "El ÃĄrea de recorte se extiende mÃĄs allÃĄ de los límites del PDF" - }, "noFileSelected": "Seleccione un archivo PDF para comenzar a recortar", "preview": { "title": "SelecciÃŗn de Área de Recorte" }, "reset": "Restablecer a PDF completo", - "results": { - "title": "Resultados de Recorte" + "coordinates": { + "title": "PosiciÃŗn y TamaÃąo", + "x": { + "label": "X Position", + "desc": "Left edge (points)" + }, + "y": { + "label": "Y Position", + "desc": "Bottom edge (points)" + }, + "width": { + "label": "Width", + "desc": "Crop width (points)" + }, + "height": { + "label": "Height", + "desc": "Crop height (points)" + } + }, + "error": { + "invalidArea": "El ÃĄrea de recorte se extiende mÃĄs allÃĄ de los límites del PDF", + "failed": "Error al recortar PDF" }, "steps": { "selectArea": "Seleccionar Área de Recorte" }, "tooltip": { + "title": "CÃŗmo Recortar PDFs", "description": "Seleccione el ÃĄrea a recortar de su PDF arrastrando y redimensionando la superposiciÃŗn azul en la miniatura.", "drag": "Arrastre la superposiciÃŗn para mover el ÃĄrea de recorte", - "precision": "Use entradas de coordenadas para posicionamiento preciso", "resize": "Arrastre las esquinas y bordes para redimensionar", - "title": "CÃŗmo Recortar PDFs" - } + "precision": "Use entradas de coordenadas para posicionamiento preciso" + }, + "results": { + "title": "Resultados de Recorte" + }, + "automation": { + "info": "Enter crop coordinates in PDF points. Origin (0,0) is at bottom-left. These values will be applied to all PDFs processed in this automation.", + "reference": "Reference: A4 page is 595.28 × 841.89 points (210mm × 297mm). 1 inch = 72 points." + }, + "tags": "recortar,contraer,editar,forma" }, "autoSplitPDF": { "tags": "Marcado por QR,separar,segmento de escaneo,organizar", @@ -2282,24 +2834,124 @@ "downloadJS": "Descargar Javascript", "submit": "Mostrar" }, - "autoRedact": { - "tags": "Redactar,Ocultar,ocultar,negro,subrayador,oculto", - "title": "Auto Censurar Texto", - "header": "Auto Censurar Texto", - "colorLabel": "Color", - "textsToRedactLabel": "Texto para Censurar (separado por líneas)", - "textsToRedactPlaceholder": "por ej. \\nConfidencial \\nAlto-Secreto", - "useRegexLabel": "Usar Regex", - "wholeWordSearchLabel": "BÃēsqueda por palabra completa", - "customPaddingLabel": "Espaciado adicional personalizado", - "convertPDFToImageLabel": "Convertir PDF a imagen PDF (Utilizado para eliminar el texto detrÃĄs del cajetín de censura)", - "submitButton": "Enviar" - }, "redact": { "tags": "Redactar,Ocultar,oscurece,negro,marcador,oculto,manual", "title": "Censurar texto Manualmente", - "header": "Censurar texto Manualmente", "submit": "Enviar", + "error": { + "failed": "Se produjo un error al censurar el PDF." + }, + "modeSelector": { + "title": "MÊtodo de Censura", + "mode": "Modo", + "automatic": "AutomÃĄtico", + "automaticDesc": "Censurar texto basÃĄndose en tÊrminos de bÃēsqueda", + "manual": "Manual", + "manualDesc": "Haga clic y arrastre para censurar ÃĄreas específicas", + "manualComingSoon": "Censura manual prÃŗximamente" + }, + "auto": { + "header": "Censurar AutomÃĄticamente", + "settings": { + "title": "ConfiguraciÃŗn de Censura", + "advancedTitle": "Avanzado" + }, + "colorLabel": "Color de Caja", + "wordsToRedact": { + "title": "Palabras a Censurar", + "placeholder": "Introduzca una palabra", + "add": "Agregar", + "examples": "Ejemplos: Confidencial, Alto-Secreto" + }, + "useRegexLabel": "Usar Regex", + "wholeWordSearchLabel": "BÃēsqueda de Palabra Completa", + "customPaddingLabel": "Relleno Extra Personalizado", + "convertPDFToImageLabel": "Convertir PDF a PDF-Imagen" + }, + "tooltip": { + "mode": { + "header": { + "title": "MÊtodo de Censura" + }, + "automatic": { + "title": "Censura AutomÃĄtica", + "text": "Encuentra y censura automÃĄticamente el texto especificado en todo el documento. Perfecto para eliminar informaciÃŗn confidencial consistente como nombres, direcciones o marcadores confidenciales." + }, + "manual": { + "title": "Censura Manual", + "text": "Haga clic y arrastre para seleccionar manualmente ÃĄreas específicas para censurar. Le da control preciso sobre lo que se censura. (PrÃŗximamente)" + } + }, + "words": { + "header": { + "title": "Palabras a Censurar" + }, + "description": { + "title": "Coincidencia de Texto", + "text": "Introduzca palabras o frases para encontrar y censurar en su documento. Cada palabra se buscarÃĄ por separado." + }, + "bullet1": "Agregue una palabra a la vez", + "bullet2": "Presione Enter o haga clic en 'Agregar Otra' para agregar", + "bullet3": "Haga clic en × para eliminar palabras", + "examples": { + "title": "Ejemplos Comunes", + "text": "Las palabras típicas para censurar incluyen: detalles bancarios, direcciones de correo electrÃŗnico o nombres específicos." + } + }, + "advanced": { + "header": { + "title": "ConfiguraciÃŗn Avanzada de Censura" + }, + "color": { + "title": "Color de Caja y Relleno", + "text": "Personalice la apariencia de las cajas de censura. El negro es estÃĄndar, pero puede elegir cualquier color. El relleno agrega espacio adicional alrededor del texto encontrado." + }, + "regex": { + "title": "Usar Regex", + "text": "Habilite expresiones regulares para coincidencia de patrones avanzada. Útil para encontrar nÃēmeros de telÊfono, correos electrÃŗnicos o patrones complejos.", + "bullet1": "Ejemplo: \\d{4}-\\d{2}-\\d{2} para coincidir con cualquier fecha en formato AAAA-MM-DD", + "bullet2": "Usar con precauciÃŗn - probar minuciosamente" + }, + "wholeWord": { + "title": "BÃēsqueda de Palabra Completa", + "text": "Solo coincide palabras completas, no coincidencias parciales. 'Juan' no coincidirÃĄ con 'Juanito' cuando estÊ habilitado." + }, + "convert": { + "title": "Convertir a PDF-Imagen", + "text": "Convierte el PDF a un PDF basado en imagen despuÊs de la censura. Esto asegura que el texto detrÃĄs de las cajas de censura se elimine completamente y sea irrecuperable." + } + } + }, + "manual": { + "header": "Censura Manual", + "textBasedRedaction": "Censura Basada en Texto", + "pageBasedRedaction": "Censura Basada en PÃĄginas", + "convertPDFToImageLabel": "Convertir PDF a PDF-Imagen (Usado para eliminar texto detrÃĄs de la caja)", + "pageRedactionNumbers": { + "title": "PÃĄginas", + "placeholder": "(por ejemplo 1,2,8 o 4,7,12-16 o 2n-1)" + }, + "redactionColor": { + "title": "Color de Censura" + }, + "export": "Exportar", + "upload": "Cargar", + "boxRedaction": "Censura de dibujo de caja", + "zoom": "Zoom", + "zoomIn": "Acercar", + "zoomOut": "Alejar", + "nextPage": "PÃĄgina Siguiente", + "previousPage": "PÃĄgina Anterior", + "toggleSidebar": "Alternar Barra Lateral", + "showThumbnails": "Mostrar Miniaturas", + "showDocumentOutline": "Mostrar Esquema del Documento (doble clic para expandir/contraer todos los elementos)", + "showAttachments": "Mostrar Adjuntos", + "showLayers": "Mostrar Capas (doble clic para restablecer todas las capas al estado predeterminado)", + "colourPicker": "Selector de Color", + "findCurrentOutlineItem": "Encontrar elemento de esquema actual", + "applyChanges": "Aplicar Cambios" + }, + "header": "Censurar texto Manualmente", "textBasedRedaction": "Censura basada en texto", "pageBasedRedaction": "Censura basada en la pÃĄgina", "convertPDFToImageLabel": "Convertir PDF a PDF-Imagen (Utilizado para eliminar el texto detrÃĄs del cajetín de censura)", @@ -2325,120 +2977,7 @@ "showLayers": "Mostrar Capas (doble clic para restablecer las capas a su estado inicial)", "colourPicker": "Selector de color", "findCurrentOutlineItem": "Resaltar el marcador", - "applyChanges": "Aplicar cambios", - "auto": { - "settings": { - "advancedTitle": "Avanzado", - "title": "ConfiguraciÃŗn de Censura" - }, - "wordsToRedact": { - "add": "Agregar", - "examples": "Ejemplos: Confidencial, Alto-Secreto", - "placeholder": "Introduzca una palabra", - "title": "Palabras a Censurar" - }, - "colorLabel": "Color de Caja", - "convertPDFToImageLabel": "Convertir PDF a PDF-Imagen", - "customPaddingLabel": "Relleno Extra Personalizado", - "header": "Censurar AutomÃĄticamente", - "useRegexLabel": "Usar Regex", - "wholeWordSearchLabel": "BÃēsqueda de Palabra Completa" - }, - "manual": { - "pageRedactionNumbers": { - "title": "PÃĄginas", - "placeholder": "(por ejemplo 1,2,8 o 4,7,12-16 o 2n-1)" - }, - "export": "Exportar", - "applyChanges": "Aplicar Cambios", - "boxRedaction": "Censura de dibujo de caja", - "colourPicker": "Selector de Color", - "convertPDFToImageLabel": "Convertir PDF a PDF-Imagen (Usado para eliminar texto detrÃĄs de la caja)", - "findCurrentOutlineItem": "Encontrar elemento de esquema actual", - "header": "Censura Manual", - "nextPage": "PÃĄgina Siguiente", - "pageBasedRedaction": "Censura Basada en PÃĄginas", - "previousPage": "PÃĄgina Anterior", - "redactionColor": { - "title": "Color de Censura" - }, - "showAttachments": "Mostrar Adjuntos", - "showDocumentOutline": "Mostrar Esquema del Documento (doble clic para expandir/contraer todos los elementos)", - "showLayers": "Mostrar Capas (doble clic para restablecer todas las capas al estado predeterminado)", - "showThumbnails": "Mostrar Miniaturas", - "textBasedRedaction": "Censura Basada en Texto", - "toggleSidebar": "Alternar Barra Lateral", - "upload": "Cargar", - "zoom": "Zoom", - "zoomIn": "Acercar", - "zoomOut": "Alejar" - }, - "error": { - "failed": "Se produjo un error al censurar el PDF." - }, - "modeSelector": { - "automatic": "AutomÃĄtico", - "automaticDesc": "Censurar texto basÃĄndose en tÊrminos de bÃēsqueda", - "manual": "Manual", - "manualComingSoon": "Censura manual prÃŗximamente", - "manualDesc": "Haga clic y arrastre para censurar ÃĄreas específicas", - "mode": "Modo", - "title": "MÊtodo de Censura" - }, - "tooltip": { - "advanced": { - "color": { - "text": "Personalice la apariencia de las cajas de censura. El negro es estÃĄndar, pero puede elegir cualquier color. El relleno agrega espacio adicional alrededor del texto encontrado.", - "title": "Color de Caja y Relleno" - }, - "convert": { - "text": "Convierte el PDF a un PDF basado en imagen despuÊs de la censura. Esto asegura que el texto detrÃĄs de las cajas de censura se elimine completamente y sea irrecuperable.", - "title": "Convertir a PDF-Imagen" - }, - "header": { - "title": "ConfiguraciÃŗn Avanzada de Censura" - }, - "regex": { - "bullet1": "Ejemplo: \\d{4}-\\d{2}-\\d{2} para coincidir con cualquier fecha en formato AAAA-MM-DD", - "bullet2": "Usar con precauciÃŗn - probar minuciosamente", - "text": "Habilite expresiones regulares para coincidencia de patrones avanzada. Útil para encontrar nÃēmeros de telÊfono, correos electrÃŗnicos o patrones complejos.", - "title": "Usar Regex" - }, - "wholeWord": { - "text": "Solo coincide palabras completas, no coincidencias parciales. 'Juan' no coincidirÃĄ con 'Juanito' cuando estÊ habilitado.", - "title": "BÃēsqueda de Palabra Completa" - } - }, - "mode": { - "automatic": { - "text": "Encuentra y censura automÃĄticamente el texto especificado en todo el documento. Perfecto para eliminar informaciÃŗn confidencial consistente como nombres, direcciones o marcadores confidenciales.", - "title": "Censura AutomÃĄtica" - }, - "header": { - "title": "MÊtodo de Censura" - }, - "manual": { - "text": "Haga clic y arrastre para seleccionar manualmente ÃĄreas específicas para censurar. Le da control preciso sobre lo que se censura. (PrÃŗximamente)", - "title": "Censura Manual" - } - }, - "words": { - "bullet1": "Agregue una palabra a la vez", - "bullet2": "Presione Enter o haga clic en 'Agregar Otra' para agregar", - "bullet3": "Haga clic en × para eliminar palabras", - "description": { - "text": "Introduzca palabras o frases para encontrar y censurar en su documento. Cada palabra se buscarÃĄ por separado.", - "title": "Coincidencia de Texto" - }, - "examples": { - "text": "Las palabras típicas para censurar incluyen: detalles bancarios, direcciones de correo electrÃŗnico o nombres específicos.", - "title": "Ejemplos Comunes" - }, - "header": { - "title": "Palabras a Censurar" - } - } - } + "applyChanges": "Aplicar cambios" }, "tableExtraxt": { "tags": "CSV,Extraer tabla,extraer,convertir" @@ -2449,11 +2988,15 @@ "overlay-pdfs": { "tags": "Superponer", "header": "Superponer archivos PDF", + "title": "Overlay PDFs", + "desc": "Overlay one PDF on top of another", "baseFile": { "label": "Seleccione archivo PDF de base" }, "overlayFiles": { - "label": "Seleccione archivos PDF a superponer" + "label": "Seleccione archivos PDF a superponer", + "placeholder": "Choose PDF(s)...", + "addMore": "Add more PDFs..." }, "mode": { "label": "Seleccione modo de superposiciÃŗn", @@ -2463,14 +3006,53 @@ }, "counts": { "label": "Recuento de superposiciÃŗn (para Modo de RepeticiÃŗn Fija)", - "placeholder": "Introduzca recuento separado por comas (p.ej., 2,3,1)" + "placeholder": "Introduzca recuento separado por comas (p.ej., 2,3,1)", + "item": "Count for file", + "noFiles": "Add overlay files to configure counts" }, "position": { "label": "Seleccione PosiciÃŗn de SuperposiciÃŗn", "foreground": "Arriba", "background": "Fondo" }, - "submit": "Enviar" + "submit": "Enviar", + "settings": { + "title": "Settings" + }, + "results": { + "title": "Overlay Results" + }, + "tooltip": { + "header": { + "title": "Overlay PDFs Overview" + }, + "description": { + "title": "Description", + "text": "Combine a base PDF with one or more overlay PDFs. Overlays can be applied page-by-page in different modes and placed in the foreground or background." + }, + "mode": { + "title": "Overlay Mode", + "text": "Choose how to distribute overlay pages across the base PDF pages.", + "sequential": "Sequential Overlay: Use pages from the first overlay PDF until it ends, then move to the next.", + "interleaved": "Interleaved Overlay: Take one page from each overlay in turn.", + "fixedRepeat": "Fixed Repeat Overlay: Take a set number of pages from each overlay before moving to the next. Use Counts to set the numbers." + }, + "position": { + "title": "Overlay Position", + "text": "Foreground places the overlay on top of the page. Background places it behind." + }, + "overlayFiles": { + "title": "Overlay Files", + "text": "Select one or more PDFs to overlay on the base. The order of these files affects how pages are applied in Sequential and Fixed Repeat modes." + }, + "counts": { + "title": "Counts (Fixed Repeat only)", + "text": "Provide a positive number for each overlay file showing how many pages to take before moving to the next. Required when mode is Fixed Repeat." + } + }, + "error": { + "failed": "An error occurred while overlaying PDFs." + } }, "split-by-sections": { "tags": "Dividir secciÃŗn, Dividir, Personalizar", @@ -2491,6 +3073,7 @@ "tags": "Sello, AÃąadir imagen, centrar imagen, Marca de agua, PDF, Incrustar, Personalizar", "header": "Sellar PDF", "title": "Sellar PDF", + "stampSetup": "ConfiguraciÃŗn de sello", "stampType": "Tipo de sello", "stampText": "Texto del sello", "stampImage": "Imagen de sello", @@ -2505,7 +3088,17 @@ "customColor": "Personalizar color de texto", "submit": "Enviar", "noStampSelected": "No se ha seleccionado ningÃēn sello. Vuelva al Paso 1.", - "stampSetup": "ConfiguraciÃŗn de sello" + "customPosition": "Drag the stamp to the desired location in the preview window.", + "error": { + "failed": "An error occurred while adding stamp to the PDF." + }, + "imageSize": "Image Size", + "margin": "Margin", + "positionAndFormatting": "Position & Formatting", + "quickPosition": "Select a position on the page to place the stamp.", + "results": { + "title": "Stamp Results" + } }, "removeImagePdf": { "tags": "Eliminar imagen,Operaciones de pÃĄgina,Back end,Backend" @@ -2523,7 +3116,8 @@ "status": { "_value": "Estado de la validaciÃŗn", "valid": "VÃĄlido", - "invalid": "InvÃĄlido" + "invalid": "InvÃĄlido", + "complete": "Validation complete" }, "signer": "Firmante", "date": "Fecha", @@ -2550,40 +3144,122 @@ "version": "VersiÃŗn", "keyUsage": "Uso de la clave", "selfSigned": "Autofirmado", - "bits": "bits" + "bits": "bits", + "details": "Certificate Details" }, "signature": { "info": "InformaciÃŗn de la firma", "_value": "Firma", "mathValid": "La firma es matemÃĄticamente vÃĄlida aunque:" }, - "selectCustomCert": "Archivo de certificado personalizado X.509 (opcional)" - }, - "replace-color": { - "title": "Reemplazar-Invertir-Color", - "header": "Reemplazar-Invertir Color en PDF", - "selectText": { - "1": "Opciones para Reemplazar o Invertir color", - "2": "Predeterminado (Colores de alto contraste predeterminados)", - "3": "Personalizado (Colores personalizados)", - "4": "Invertir Completo (Invertir todos los colores)", - "5": "Opciones de color de alto contraste", - "6": "Texto blanco sobre fondo negro", - "7": "Texto negro sobre fondo blanco", - "8": "Texto amarillo sobre fondo negro", - "9": "Texto verde sobre fondo negro", - "10": "Elegir Color de Texto", - "11": "Elegir Color de Fondo" + "selectCustomCert": "Archivo de certificado personalizado X.509 (opcional)", + "downloadCsv": "Download CSV", + "downloadJson": "Download JSON", + "downloadPdf": "Download PDF Report", + "downloadType": { + "csv": "CSV", + "json": "JSON", + "pdf": "PDF" }, - "submit": "Reemplazar" + "error": { + "allFailed": "Unable to validate the selected files.", + "partial": "Some files could not be validated.", + "reportGeneration": "Could not generate the PDF report. JSON and CSV are available.", + "unexpected": "Unexpected error during validation." + }, + "finalizing": "Preparing downloads...", + "issue": { + "certExpired": "Certificate expired", + "certRevocationUnknown": "Certificate revocation status unknown", + "certRevoked": "Certificate revoked", + "chainInvalid": "Certificate chain invalid", + "signatureInvalid": "Signature cryptographic check failed", + "trustInvalid": "Certificate not trusted" + }, + "noResults": "Run the validation to generate a report.", + "noSignaturesShort": "No signatures", + "processing": "Validating signatures...", + "report": { + "continued": "Continued", + "downloads": "Downloads", + "entryLabel": "Signature Summary", + "fields": { + "created": "Created", + "fileSize": "File Size", + "signatureCount": "Total Signatures", + "signatureDate": "Signature Date" + }, + "filesEvaluated": "{{count}} files evaluated", + "footer": "Validated via Stirling PDF", + "generatedAt": "Generated", + "noPdf": "PDF report will be available after a successful validation.", + "page": "Page", + "shortTitle": "Signature Summary", + "signatureCountLabel": "{{count}} signatures", + "signaturesFound": "{{count}} signatures detected", + "signaturesValid": "{{count}} fully valid", + "title": "Signature Validation Report" + }, + "settings": { + "certHint": "Upload a trusted X.509 certificate to validate against a custom trust source.", + "title": "Validation Settings" + }, + "signatureDate": "Signature Date", + "totalSignatures": "Total Signatures" }, - "replaceColorPdf": { - "tags": "Reemplazar Color,Operaciones de PÃĄgina,Back end,Backend" + "replaceColor": { + "tags": "Reemplazar Color,Operaciones de pÃĄgina,Back end,lado del servidor", + "labels": { + "settings": "Settings", + "colourOperation": "Colour operation" + }, + "options": { + "highContrast": "High contrast", + "invertAll": "Invert all colours", + "custom": "Custom", + "cmyk": "Convert to CMYK" + }, + "tooltip": { + "header": { + "title": "Replace & Invert Colour Settings Overview" + }, + "description": { + "title": "Description", + "text": "Transform PDF colours to improve readability and accessibility. Choose from high contrast presets, invert all colours, or create custom colour schemes." + }, + "highContrast": { + "title": "High Contrast", + "text": "Apply predefined high contrast colour combinations designed for better readability and accessibility compliance.", + "bullet1": "White text on black background - Classic dark mode", + "bullet2": "Black text on white background - Standard high contrast", + "bullet3": "Yellow text on black background - High visibility option", + "bullet4": "Green text on black background - Alternative high contrast" + }, + "invertAll": { + "title": "Invert All Colours", + "text": "Completely invert all colours in the PDF, creating a negative-like effect. Useful for creating dark mode versions of documents or reducing eye strain in low-light conditions." + }, + "custom": { + "title": "Custom Colours", + "text": "Define your own text and background colours using the colour pickers. Perfect for creating branded documents or specific accessibility requirements.", + "bullet1": "Text colour - Choose the colour for text elements", + "bullet2": "Background colour - Set the background colour for the document" + }, + "cmyk": { + "title": "Convert to CMYK", + "text": "Convert the PDF from RGB colour space to CMYK colour space, optimized for professional printing. This process converts colours to the Cyan, Magenta, Yellow, Black model used by printers." + } + }, + "error": { + "failed": "An error occurred while processing the colour replacement." + } }, "login": { "title": "Iniciar sesiÃŗn", "header": "Iniciar sesiÃŗn", "signin": "Iniciar sesiÃŗn", + "signInWith": "Iniciar sesiÃŗn con", + "signInAnonymously": "Registrarse como Invitado", "rememberme": "Recordarme", "invalid": "Nombre de usuario o contraseÃąa errÃŗneos.", "locked": "Su cuenta se ha bloqueado.", @@ -2603,45 +3279,79 @@ "alreadyLoggedIn2": "dispositivos. Cierre sesiÃŗn en los dispositivos y vuelva a intentarlo.", "toManySessions": "Tiene demasiadas sesiones activas", "logoutMessage": "Ha cerrado sesiÃŗn.", - "cancel": "Cancelar", - "debug": "Depurar", - "dontHaveAccount": "ÂŋNo tiene una cuenta? Registrarse", + "youAreLoggedIn": "ÂĄHa iniciado sesiÃŗn!", "email": "Correo electrÃŗnico", - "enterEmail": "Introduzca su correo electrÃŗnico", - "enterEmailForMagicLink": "Introduzca su correo electrÃŗnico para el enlace mÃĄgico", - "enterPassword": "Introduzca su contraseÃąa", - "failedToSignIn": "Error al iniciar sesiÃŗn con {{provider}}: {{message}}", - "home": "Inicio", - "loggingIn": "Iniciando sesiÃŗn...", - "login": "Iniciar sesiÃŗn", - "magicLinkSent": "ÂĄEnlace mÃĄgico enviado a {{email}}! Revise su correo electrÃŗnico y haga clic en el enlace para iniciar sesiÃŗn.", - "or": "O", "password": "ContraseÃąa", - "passwordResetSent": "ÂĄEnlace de restablecimiento de contraseÃąa enviado a {{email}}! Revise su correo electrÃŗnico y siga las instrucciones.", + "enterEmail": "Introduzca su correo electrÃŗnico", + "enterPassword": "Introduzca su contraseÃąa", + "loggingIn": "Iniciando sesiÃŗn...", + "username": "Username", + "enterUsername": "Enter username", + "useEmailInstead": "Login with email", + "forgotPassword": "Forgot your password?", + "logIn": "Log In", + "signingIn": "Iniciando sesiÃŗn...", + "login": "Iniciar sesiÃŗn", + "or": "O", + "useMagicLink": "Usar enlace mÃĄgico en su lugar", + "enterEmailForMagicLink": "Introduzca su correo electrÃŗnico para el enlace mÃĄgico", + "sending": "Enviandoâ€Ļ", + "sendMagicLink": "Enviar Enlace MÃĄgico", + "cancel": "Cancelar", + "dontHaveAccount": "ÂŋNo tiene una cuenta? Registrarse", + "home": "Inicio", + "debug": "Depurar", + "signOut": "Cerrar SesiÃŗn", "pleaseEnterBoth": "Por favor, introduzca tanto el correo electrÃŗnico como la contraseÃąa", "pleaseEnterEmail": "Por favor, introduzca su direcciÃŗn de correo electrÃŗnico", - "sendMagicLink": "Enviar Enlace MÃĄgico", - "sending": "Enviandoâ€Ļ", - "signInAnonymously": "Registrarse como Invitado", - "signInWith": "Iniciar sesiÃŗn con", - "signOut": "Cerrar SesiÃŗn", - "signingIn": "Iniciando sesiÃŗn...", + "magicLinkSent": "ÂĄEnlace mÃĄgico enviado a {{email}}! Revise su correo electrÃŗnico y haga clic en el enlace para iniciar sesiÃŗn.", + "passwordResetSent": "ÂĄEnlace de restablecimiento de contraseÃąa enviado a {{email}}! Revise su correo electrÃŗnico y siga las instrucciones.", + "failedToSignIn": "Error al iniciar sesiÃŗn con {{provider}}: {{message}}", "unexpectedError": "Error inesperado: {{message}}", - "useMagicLink": "Usar enlace mÃĄgico en su lugar", - "youAreLoggedIn": "ÂĄHa iniciado sesiÃŗn!" + "accountCreatedSuccess": "Account created successfully! You can now sign in.", + "passwordChangedSuccess": "Password changed successfully! Please sign in with your new password.", + "credentialsUpdated": "Your credentials have been updated. Please sign in again." + }, + "signup": { + "title": "Crear una cuenta", + "subtitle": "Únase a Stirling PDF para comenzar", + "name": "Nombre", + "email": "Correo electrÃŗnico", + "password": "ContraseÃąa", + "confirmPassword": "Confirmar contraseÃąa", + "enterName": "Ingrese su nombre", + "enterEmail": "Ingrese su correo electrÃŗnico", + "enterPassword": "Ingrese su contraseÃąa", + "confirmPasswordPlaceholder": "Confirmar contraseÃąa", + "or": "o", + "creatingAccount": "Creando Cuenta...", + "signUp": "Registrarse", + "alreadyHaveAccount": "ÂŋYa tiene una cuenta? Iniciar sesiÃŗn", + "pleaseFillAllFields": "Por favor, complete todos los campos", + "passwordsDoNotMatch": "Las contraseÃąas no coinciden", + "passwordTooShort": "La contraseÃąa debe tener al menos 6 caracteres", + "invalidEmail": "Por favor, ingrese una direcciÃŗn de correo electrÃŗnico vÃĄlida", + "checkEmailConfirmation": "Verifique su correo electrÃŗnico para obtener un enlace de confirmaciÃŗn y completar su registro.", + "accountCreatedSuccessfully": "ÂĄCuenta creada con Êxito! Ahora puede iniciar sesiÃŗn.", + "unexpectedError": "Error inesperado: {{message}}", + "useEmailInstead": "Use Email Instead", + "nameRequired": "Name is required", + "emailRequired": "Email is required", + "passwordRequired": "Password is required", + "confirmPasswordRequired": "Please confirm your password" }, "pdfToSinglePage": { "title": "PDF a pÃĄgina Ãēnica", "header": "PDF a pÃĄgina Ãēnica", "submit": "Convertir a pÃĄgina Ãēnica", "description": "Esta herramienta combinarÃĄ todas las pÃĄginas de su PDF en una sola pÃĄgina grande. El ancho permanecerÃĄ igual que el de las pÃĄginas originales, pero la altura serÃĄ la suma de todas las alturas de pÃĄgina.", - "error": { - "failed": "Se produjo un error al convertir a pÃĄgina Ãēnica." - }, "filenamePrefix": "pagina_unica", "files": { "placeholder": "Seleccione un archivo PDF en la vista principal para comenzar" }, + "error": { + "failed": "Se produjo un error al convertir a pÃĄgina Ãēnica." + }, "results": { "title": "Resultados de PÃĄgina Única" } @@ -2668,18 +3378,59 @@ "adjustContrast": { "title": "Ajustar Contraste", "header": "Ajustar Contraste", + "basic": "Basic Adjustments", "contrast": "Contraste:", "brightness": "Brillo:", "saturation": "SaturaciÃŗn:", - "download": "Descargar" + "download": "Descargar", + "adjustColors": "Adjust Colors", + "blue": "Blue", + "confirm": "Confirm", + "error": { + "failed": "Failed to adjust colors/contrast" + }, + "green": "Green", + "noPreview": "Select a PDF to preview", + "red": "Red", + "results": { + "title": "Adjusted PDF" + } }, "compress": { "title": "Comprimir", + "desc": "Comprimir PDFs para reducir su tamaÃąo de archivo.", "header": "Comprimir PDF", + "method": { + "title": "MÊtodo de CompresiÃŗn", + "quality": "Calidad", + "filesize": "TamaÃąo de archivo" + }, "credit": "Este servicio utiliza qpdf para compresiÃŗn/optimizaciÃŗn de PDF", "grayscale": { "label": "Aplicar escala de grises para compresiÃŗn" }, + "tooltip": { + "header": { + "title": "Resumen de ConfiguraciÃŗn de CompresiÃŗn" + }, + "description": { + "title": "DescripciÃŗn", + "text": "La compresiÃŗn es una forma fÃĄcil de reducir el tamaÃąo de su archivo. Elija TamaÃąo de Archivo para ingresar un tamaÃąo objetivo y nosotros ajustaremos la calidad por usted. Elija Calidad para establecer la intensidad de compresiÃŗn manualmente." + }, + "qualityAdjustment": { + "title": "Ajuste de Calidad", + "text": "Arrastre el control deslizante para ajustar la intensidad de compresiÃŗn. Los valores mÃĄs bajos (1-3) preservan la calidad pero resultan en archivos mÃĄs grandes. Los valores mÃĄs altos (7-9) reducen mÃĄs el archivo pero disminuyen la claridad de la imagen.", + "bullet1": "Los valores mÃĄs bajos preservan la calidad", + "bullet2": "Los valores mÃĄs altos reducen el tamaÃąo del archivo" + }, + "grayscale": { + "title": "Escala de Grises", + "text": "Seleccione esta opciÃŗn para convertir todas las imÃĄgenes a blanco y negro, lo que puede reducir significativamente el tamaÃąo del archivo, especialmente para PDFs escaneados o documentos con muchas imÃĄgenes." + } + }, + "error": { + "failed": "OcurriÃŗ un error al comprimir el PDF." + }, "selectText": { "1": { "_value": "ConfiguraciÃŗn de CompresiÃŗn", @@ -2689,35 +3440,7 @@ "4": "Modo automÃĄtico: ajusta automÃĄticamente la calidad para que el PDF tenga el tamaÃąo exacto", "5": "TamaÃąo esperado del PDF (por ejemplo, 25 MB, 10.8 MB, 25 KB)" }, - "submit": "Comprimir", - "method": { - "filesize": "TamaÃąo de archivo", - "quality": "Calidad", - "title": "MÊtodo de CompresiÃŗn" - }, - "desc": "Comprimir PDFs para reducir su tamaÃąo de archivo.", - "error": { - "failed": "OcurriÃŗ un error al comprimir el PDF." - }, - "tooltip": { - "description": { - "text": "La compresiÃŗn es una forma fÃĄcil de reducir el tamaÃąo de su archivo. Elija TamaÃąo de Archivo para ingresar un tamaÃąo objetivo y nosotros ajustaremos la calidad por usted. Elija Calidad para establecer la intensidad de compresiÃŗn manualmente.", - "title": "DescripciÃŗn" - }, - "grayscale": { - "text": "Seleccione esta opciÃŗn para convertir todas las imÃĄgenes a blanco y negro, lo que puede reducir significativamente el tamaÃąo del archivo, especialmente para PDFs escaneados o documentos con muchas imÃĄgenes.", - "title": "Escala de Grises" - }, - "header": { - "title": "Resumen de ConfiguraciÃŗn de CompresiÃŗn" - }, - "qualityAdjustment": { - "bullet1": "Los valores mÃĄs bajos preservan la calidad", - "bullet2": "Los valores mÃĄs altos reducen el tamaÃąo del archivo", - "text": "Arrastre el control deslizante para ajustar la intensidad de compresiÃŗn. Los valores mÃĄs bajos (1-3) preservan la calidad pero resultan en archivos mÃĄs grandes. Los valores mÃĄs altos (7-9) reducen mÃĄs el archivo pero disminuyen la claridad de la imagen.", - "title": "Ajuste de Calidad" - } - } + "submit": "Comprimir" }, "decrypt": { "passwordPrompt": "Este archivo estÃĄ protegido con contraseÃąa. Por favor, introduzca la contraseÃąa:", @@ -2818,7 +3541,13 @@ "title": "Eliminar imagen", "header": "Eliminar imagen", "removeImage": "Eliminar imagen", - "submit": "Eliminar imagen" + "submit": "Eliminar imagen", + "error": { + "failed": "Failed to remove images from the PDF." + }, + "results": { + "title": "Remove Images Results" + } }, "splitByChapters": { "title": "Dividir PDF por Capítulos", @@ -2852,6 +3581,12 @@ }, "note": "Las notas de la versiÃŗn solo estÃĄn disponibles en InglÊs" }, + "swagger": { + "title": "DocumentaciÃŗn de API", + "header": "DocumentaciÃŗn de API", + "desc": "Ver y probar los endpoints de la API de Stirling PDF", + "tags": "api,documentaciÃŗn,swagger,endpoints,desarrollo" + }, "cookieBanner": { "popUp": { "title": "CÃŗmo usamos las cookies", @@ -2887,238 +3622,944 @@ "title": "AnÃĄlisis", "description": "Estas cookies nos ayudan a entender cÃŗmo se estÃĄn utilizando nuestras herramientas, para que podamos centrarnos en desarrollar las funciones que nuestra comunidad valora mÃĄs. Tenga la seguridad de que Stirling PDF no puede y nunca podrÃĄ rastrear el contenido de los documentos con los que trabaja." } + }, + "services": { + "posthog": "PostHog Analytics", + "scarf": "Scarf Pixel" } }, - "download": "Descargar", - "undo": "Deshacer", - "convert": { - "title": "Convertir", - "settings": "ConfiguraciÃŗn", - "color": "Color", - "greyscale": "Escala de grises", - "fillPage": "Ocupar toda la pÃĄgina", - "pdfaDigitalSignatureWarning": "El PDF contiene una firma digital. Ésta se eliminarÃĄ en el siguiente paso.", - "grayscale": "Escala de grises", - "autoRotate": "RotaciÃŗn AutomÃĄtica", - "autoRotateDescription": "Rotar automÃĄticamente las imÃĄgenes para ajustarse mejor a la pÃĄgina PDF", - "blackwhite": "Blanco y Negro", - "colorType": "Tipo de Color", - "combineImages": "Combinar ImÃĄgenes", - "combineImagesDescription": "Combinar todas las imÃĄgenes en un PDF, o crear PDFs separados para cada imagen", - "conversionCompleted": "ConversiÃŗn completada", - "conversionResults": "Resultados de ConversiÃŗn", - "convertFiles": "Convertir Archivos", - "convertFrom": "Convertir desde", - "convertTo": "Convertir a", - "converting": "Convirtiendo...", - "defaultFilename": "archivo_convertido", - "desc": "Convertir archivos entre diferentes formatos", - "downloadConverted": "Descargar Archivo Convertido", - "downloadHtml": "Descargar archivo intermedio HTML en lugar de PDF", - "dpi": "DPI", - "emailOptions": "Opciones de Correo ElectrÃŗnico a PDF", - "errorNoFiles": "Por favor seleccione al menos un archivo para convertir.", - "errorNoFormat": "Por favor seleccione los formatos de origen y destino.", - "errorNotSupported": "La conversiÃŗn de {{from}} a {{to}} no estÃĄ soportada.", - "fileFormat": "Formato de Archivo", - "files": "Archivos", - "fitDocumentToPage": "Ajustar Documento a PÃĄgina", - "fitOption": "OpciÃŗn de Ajuste", - "imageOptions": "Opciones de Imagen", - "images": "ImÃĄgenes", - "imagesExt": "ImÃĄgenes (JPG, PNG, etc.)", - "includeAllRecipients": "Incluir destinatarios CC y BCC en el encabezado", - "includeAttachments": "Incluir archivos adjuntos de correo electrÃŗnico", - "maintainAspectRatio": "Mantener RelaciÃŗn de Aspecto", - "markdown": "Markdown", - "maxAttachmentSize": "TamaÃąo mÃĄximo de archivo adjunto (MB)", - "multiple": "MÃēltiple", - "noFileSelected": "No se seleccionÃŗ ningÃēn archivo. Use el panel de archivos para agregar archivos.", - "odpExt": "PresentaciÃŗn OpenDocument (.odp)", - "odtExt": "Texto OpenDocument (.odt)", - "officeDocs": "Documentos de Office (Word, Excel, PowerPoint)", - "output": "Salida", - "outputFormat": "Formato de Salida", - "outputOptions": "Opciones de Salida", - "pdfOptions": "Opciones de PDF", - "pdfaNote": "PDF/A-1b es mÃĄs compatible, PDF/A-2b soporta mÃĄs funciones.", - "pdfaOptions": "Opciones de PDF/A", - "pptExt": "PowerPoint (.pptx)", - "results": "Resultados", - "rtfExt": "Formato de Texto Enriquecido (.rtf)", - "selectFilesPlaceholder": "Seleccione archivos en la vista principal para comenzar", - "selectSourceFormatFirst": "Seleccione primero un formato de origen", - "selectedFiles": "Archivos seleccionados", - "single": "Individual", - "sourceFormatPlaceholder": "Formato de origen", - "targetFormatPlaceholder": "Formato de destino", - "textRtf": "Texto/RTF", - "txtExt": "Texto Plano (.txt)", - "webOptions": "Opciones de Web a PDF", - "wordDoc": "Documento de Word", - "wordDocExt": "Documento de Word (.docx)", - "zoomLevel": "Nivel de Zoom" + "removeMetadata": { + "submit": "Eliminar Metadatos" }, - "attachments": { - "tags": "embed,attach,file,attachment,attachments", - "title": "Add attachments", - "header": "Add attachments", - "submit": "Add attachments", - "add": "AÃąadir archivo adjunto", - "embed": "Incrustar archivo adjunto", - "remove": "Eliminar archivo adjunto" + "sidebar": { + "toggle": "Alternar Barra Lateral" + }, + "theme": { + "toggle": "Alternar Tema" + }, + "view": { + "viewer": "Visor", + "pageEditor": "Editor de PÃĄginas", + "fileManager": "Gestor de Archivos" + }, + "pageEditor": { + "title": "Editor de PÃĄginas", + "save": "Guardar Cambios", + "noPdfLoaded": "No hay PDF cargado. Por favor, cargue un PDF para editar.", + "rotatedLeft": "Girado a la izquierda:", + "rotatedRight": "Girado a la derecha:", + "deleted": "Eliminado:", + "movedLeft": "Movido a la izquierda:", + "movedRight": "Movido a la derecha:", + "splitAt": "Dividir en:", + "insertedPageBreak": "Salto de pÃĄgina insertado en:", + "addFileNotImplemented": "Agregar archivo no implementado en la demostraciÃŗn", + "closePdf": "Cerrar PDF", + "reset": "Restablecer Cambios", + "zoomIn": "Acercar", + "zoomOut": "Alejar", + "fitToWidth": "Ajustar al Ancho", + "actualSize": "TamaÃąo Real" + }, + "viewer": { + "firstPage": "Primera PÃĄgina", + "lastPage": "Última PÃĄgina", + "previousPage": "PÃĄgina Anterior", + "nextPage": "PÃĄgina Siguiente", + "zoomIn": "Acercar", + "zoomOut": "Alejar", + "singlePageView": "Vista de PÃĄgina Única", + "dualPageView": "Vista de PÃĄgina Doble" }, "rightRail": { + "closeSelected": "Cerrar Archivos Seleccionados", "selectAll": "Seleccionar Todo", "deselectAll": "Deseleccionar Todo", - "closePdf": "Cerrar PDF", - "closeSelected": "Cerrar Archivos Seleccionados", + "selectByNumber": "Seleccionar por NÃēmeros de PÃĄgina", "deleteSelected": "Eliminar PÃĄginas Seleccionadas", - "downloadAll": "Descargar Todo", - "downloadSelected": "Descargar Archivos Seleccionados", + "closePdf": "Cerrar PDF", "exportAll": "Exportar PDF", + "downloadSelected": "Descargar Archivos Seleccionados", + "downloadAll": "Descargar Todo", + "toggleTheme": "Alternar Tema", "language": "Idioma", + "search": "Buscar en PDF", "panMode": "Modo de Desplazamiento", "rotateLeft": "Rotar a la Izquierda", "rotateRight": "Rotar a la Derecha", - "search": "Buscar en PDF", - "selectByNumber": "Seleccionar por NÃēmeros de PÃĄgina", "toggleSidebar": "Alternar Barra Lateral", - "toggleTheme": "Alternar Tema" + "exportSelected": "Export Selected Pages", + "toggleAnnotations": "Toggle Annotations Visibility", + "annotationMode": "Toggle Annotation Mode", + "draw": "Draw", + "save": "Save" + }, + "search": { + "title": "Buscar PDF", + "placeholder": "Ingrese tÊrmino de bÃēsqueda...", + "noResults": "No results found", + "searching": "Searching..." + }, + "guestBanner": { + "title": "ÂĄEstÃĄ usando Stirling PDF como invitado!", + "message": "Cree una cuenta gratuita para guardar su trabajo, acceder a mÃĄs funciones y apoyar el proyecto.", + "dismiss": "Descartar banner", + "signUp": "Registrarse Gratis" + }, + "toolPicker": { + "searchPlaceholder": "Buscar herramientas...", + "noToolsFound": "No se encontraron herramientas", + "allTools": "TODAS LAS HERRAMIENTAS", + "quickAccess": "ACCESO RÁPIDO", + "categories": { + "standardTools": "Herramientas EstÃĄndar", + "advancedTools": "Herramientas Avanzadas", + "recommendedTools": "Herramientas Recomendadas" + }, + "subcategories": { + "signing": "Firma", + "documentSecurity": "Seguridad de Documentos", + "verification": "VerificaciÃŗn", + "documentReview": "RevisiÃŗn de Documentos", + "pageFormatting": "Formato de PÃĄgina", + "extraction": "ExtracciÃŗn", + "removal": "EliminaciÃŗn", + "automation": "AutomatizaciÃŗn", + "general": "General", + "advancedFormatting": "Formato Avanzado", + "developerTools": "Herramientas de Desarrollo" + } }, "quickAccess": { + "read": "Leer", "sign": "Firmar", - "activity": "Actividad", - "allTools": "Todas las Herramientas", "automate": "Automatizar", - "config": "ConfiguraciÃŗn", "files": "Archivos", - "read": "Leer" + "activity": "Actividad", + "help": "Help", + "account": "Account", + "config": "ConfiguraciÃŗn", + "adminSettings": "Admin Settings", + "allTools": "Todas las Herramientas" + }, + "admin": { + "error": "Error", + "success": "Success", + "expand": "Expand", + "close": "Close", + "status": { + "active": "Active", + "inactive": "Inactive" + }, + "settings": { + "title": "Admin Settings", + "workspace": "Workspace", + "fetchError": "Failed to load settings", + "saveError": "Failed to save settings", + "saved": "Settings saved successfully", + "saveSuccess": "Settings saved successfully", + "save": "Save Changes", + "restartRequired": "Restart Required", + "restart": { + "title": "Restart Required", + "message": "Settings have been saved successfully. A server restart is required for the changes to take effect.", + "question": "Would you like to restart the server now or later?", + "now": "Restart Now", + "later": "Restart Later" + }, + "restarting": "Restarting Server", + "restartingMessage": "The server is restarting. Please wait a moment...", + "restartError": "Failed to restart server. Please restart manually.", + "general": { + "title": "System Settings", + "description": "Configure system-wide application settings including branding and default behaviour.", + "ui": "User Interface", + "system": "System", + "appName": { + "label": "Application Name", + "description": "The name displayed in the browser tab and home page" + }, + "appNameNavbar": { + "label": "Navbar Brand", + "description": "The name displayed in the navigation bar" + }, + "homeDescription": { + "label": "Home Description", + "description": "The description text shown on the home page" + }, + "defaultLocale": { + "label": "Default Locale", + "description": "The default language for new users (e.g., en_US, es_ES)" + }, + "fileUploadLimit": { + "label": "File Upload Limit", + "description": "Maximum file upload size (e.g., 100MB, 1GB)" + }, + "showUpdate": { + "label": "Show Update Notifications", + "description": "Display notifications when a new version is available" + }, + "showUpdateOnlyAdmin": { + "label": "Show Updates to Admins Only", + "description": "Restrict update notifications to admin users only" + }, + "customHTMLFiles": { + "label": "Custom HTML Files", + "description": "Allow serving custom HTML files from the customFiles directory" + }, + "languages": { + "label": "Available Languages", + "description": "Languages that users can select from (leave empty to enable all languages)" + }, + "customMetadata": { + "label": "Custom Metadata", + "autoUpdate": { + "label": "Auto Update Metadata", + "description": "Automatically update PDF metadata on all processed documents" + }, + "author": { + "label": "Default Author", + "description": "Default author for PDF metadata (e.g., username)" + }, + "creator": { + "label": "Default Creator", + "description": "Default creator for PDF metadata" + }, + "producer": { + "label": "Default Producer", + "description": "Default producer for PDF metadata" + } + }, + "customPaths": { + "label": "Custom Paths", + "description": "Configure custom file system paths for pipeline processing and external tools", + "pipeline": { + "label": "Pipeline Directories", + "watchedFoldersDir": { + "label": "Watched Folders Directory", + "description": "Directory where pipeline monitors for incoming PDFs (leave empty for default: /pipeline/watchedFolders)" + }, + "finishedFoldersDir": { + "label": "Finished Folders Directory", + "description": "Directory where processed PDFs are outputted (leave empty for default: /pipeline/finishedFolders)" + } + }, + "operations": { + "label": "External Tool Paths", + "weasyprint": { + "label": "WeasyPrint Executable", + "description": "Path to WeasyPrint executable for HTML to PDF conversion (leave empty for default: /opt/venv/bin/weasyprint)" + }, + "unoconvert": { + "label": "Unoconvert Executable", + "description": "Path to LibreOffice unoconvert for document conversions (leave empty for default: /opt/venv/bin/unoconvert)" + } + } + } + }, + "security": { + "title": "Security", + "description": "Configure authentication, login behaviour, and security policies.", + "ssoNotice": { + "title": "Looking for SSO/SAML settings?", + "message": "OAuth2 and SAML2 authentication providers have been moved to the Connections menu for easier management." + }, + "authentication": "Authentication", + "enableLogin": { + "label": "Enable Login", + "description": "Require users to log in before accessing the application" + }, + "loginMethod": { + "label": "Login Method", + "description": "The authentication method to use for user login", + "all": "All Methods", + "normal": "Username/Password Only", + "oauth2": "OAuth2 Only", + "saml2": "SAML2 Only" + }, + "loginAttemptCount": { + "label": "Login Attempt Limit", + "description": "Maximum number of failed login attempts before account lockout" + }, + "loginResetTimeMinutes": { + "label": "Login Reset Time (minutes)", + "description": "Time before failed login attempts are reset" + }, + "csrfDisabled": { + "label": "Disable CSRF Protection", + "description": "Disable Cross-Site Request Forgery protection (not recommended)" + }, + "initialLogin": { + "label": "Initial Login", + "username": { + "label": "Initial Username", + "description": "The username for the initial admin account" + }, + "password": { + "label": "Initial Password", + "description": "The password for the initial admin account" + } + }, + "jwt": { + "label": "JWT Configuration", + "secureCookie": { + "label": "Secure Cookie", + "description": "Require HTTPS for JWT cookies (recommended for production)" + }, + "keyRetentionDays": { + "label": "Key Retention Days", + "description": "Number of days to retain old JWT keys for verification" + }, + "persistence": { + "label": "Enable Key Persistence", + "description": "Store JWT keys persistently to survive server restarts" + }, + "enableKeyRotation": { + "label": "Enable Key Rotation", + "description": "Automatically rotate JWT signing keys periodically" + }, + "enableKeyCleanup": { + "label": "Enable Key Cleanup", + "description": "Automatically remove expired JWT keys" + } + }, + "audit": { + "label": "Audit Logging", + "enabled": { + "label": "Enable Audit Logging", + "description": "Track user actions and system events for compliance and security monitoring" + }, + "level": { + "label": "Audit Level", + "description": "0=OFF, 1=BASIC, 2=STANDARD, 3=VERBOSE" + }, + "retentionDays": { + "label": "Audit Retention (days)", + "description": "Number of days to retain audit logs" + } + }, + "htmlUrlSecurity": { + "label": "HTML URL Security", + "description": "Configure URL access restrictions for HTML processing to prevent SSRF attacks", + "enabled": { + "label": "Enable URL Security", + "description": "Enable URL security restrictions for HTML to PDF conversions" + }, + "level": { + "label": "Security Level", + "description": "MAX: whitelist only, MEDIUM: block internal networks, OFF: no restrictions", + "max": "Maximum (Whitelist Only)", + "medium": "Medium (Block Internal)", + "off": "Off (No Restrictions)" + }, + "advanced": "Advanced Settings", + "allowedDomains": { + "label": "Allowed Domains (Whitelist)", + "description": "One domain per line (e.g., cdn.example.com). Only these domains allowed when level is MAX" + }, + "blockedDomains": { + "label": "Blocked Domains (Blacklist)", + "description": "One domain per line (e.g., malicious.com). Additional domains to block" + }, + "internalTlds": { + "label": "Internal TLDs", + "description": "One TLD per line (e.g., .local, .internal). Block domains with these TLD patterns" + }, + "networkBlocking": "Network Blocking", + "blockPrivateNetworks": { + "label": "Block Private Networks", + "description": "Block RFC 1918 private networks (10.x.x.x, 192.168.x.x, 172.16-31.x.x)" + }, + "blockLocalhost": { + "label": "Block Localhost", + "description": "Block localhost and loopback addresses (127.x.x.x, ::1)" + }, + "blockLinkLocal": { + "label": "Block Link-Local Addresses", + "description": "Block link-local addresses (169.254.x.x, fe80::/10)" + }, + "blockCloudMetadata": { + "label": "Block Cloud Metadata Endpoints", + "description": "Block cloud provider metadata endpoints (169.254.169.254)" + } + } + }, + "connections": { + "title": "Connections", + "description": "Configure external authentication providers like OAuth2 and SAML.", + "linkedServices": "Linked Services", + "unlinkedServices": "Unlinked Services", + "connect": "Connect", + "disconnect": "Disconnect", + "disconnected": "Provider disconnected successfully", + "disconnectError": "Failed to disconnect provider", + "ssoAutoLogin": { + "label": "SSO Auto Login", + "enable": "Enable SSO Auto Login", + "description": "Automatically redirect to SSO login when authentication is required" + }, + "oauth2": { + "label": "OAuth2", + "enabled": { + "label": "Enable OAuth2", + "description": "Allow users to authenticate using OAuth2 providers" + }, + "provider": { + "label": "Provider", + "description": "The OAuth2 provider to use for authentication" + }, + "issuer": { + "label": "Issuer URL", + "description": "The OAuth2 provider issuer URL" + }, + "clientId": { + "label": "Client ID", + "description": "The OAuth2 client ID from your provider" + }, + "clientSecret": { + "label": "Client Secret", + "description": "The OAuth2 client secret from your provider" + }, + "useAsUsername": { + "label": "Use as Username", + "description": "The OAuth2 claim to use as the username (e.g., email, sub)" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first OAuth2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via OAuth2" + }, + "scopes": { + "label": "OAuth2 Scopes", + "description": "Comma-separated list of OAuth2 scopes to request (e.g., openid, profile, email)" + } + }, + "saml2": { + "label": "SAML2", + "enabled": { + "label": "Enable SAML2", + "description": "Allow users to authenticate using SAML2 providers" + }, + "provider": { + "label": "Provider", + "description": "The SAML2 provider name" + }, + "registrationId": { + "label": "Registration ID", + "description": "The SAML2 registration identifier" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first SAML2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via SAML2" + } + } + }, + "database": { + "title": "Database", + "description": "Configure custom database connection settings for enterprise deployments.", + "configuration": "Database Configuration", + "enableCustom": { + "label": "Enable Custom Database", + "description": "Use your own custom database configuration instead of the default embedded database" + }, + "customUrl": { + "label": "Custom Database URL", + "description": "Full JDBC connection string (e.g., jdbc:postgresql://localhost:5432/postgres). If provided, individual connection settings below are not used." + }, + "type": { + "label": "Database Type", + "description": "Type of database (not used if custom URL is provided)" + }, + "hostName": { + "label": "Host Name", + "description": "Database server hostname (not used if custom URL is provided)" + }, + "port": { + "label": "Port", + "description": "Database server port (not used if custom URL is provided)" + }, + "name": { + "label": "Database Name", + "description": "Name of the database (not used if custom URL is provided)" + }, + "username": { + "label": "Username", + "description": "Database authentication username" + }, + "password": { + "label": "Password", + "description": "Database authentication password" + } + }, + "privacy": { + "title": "Privacy", + "description": "Configure privacy and data collection settings.", + "analytics": "Analytics & Tracking", + "enableAnalytics": { + "label": "Enable Analytics", + "description": "Collect anonymous usage analytics to help improve the application" + }, + "metricsEnabled": { + "label": "Enable Metrics", + "description": "Enable collection of performance and usage metrics. Provides API endpoint for admins to access metrics data" + }, + "searchEngine": "Search Engine Visibility", + "googleVisibility": { + "label": "Google Visibility", + "description": "Allow search engines to index this application" + } + }, + "advanced": { + "title": "Advanced", + "description": "Configure advanced features and experimental functionality.", + "features": "Feature Flags", + "processing": "Processing", + "endpoints": { + "label": "Endpoints", + "manage": "Manage API Endpoints", + "description": "Endpoint management is configured via YAML. See documentation for details on enabling/disabling specific endpoints." + }, + "enableAlphaFunctionality": { + "label": "Enable Alpha Features", + "description": "Enable experimental and alpha-stage features (may be unstable)" + }, + "enableUrlToPDF": { + "label": "Enable URL to PDF", + "description": "Allow conversion of web pages to PDF documents" + }, + "maxDPI": { + "label": "Maximum DPI", + "description": "Maximum DPI for image processing (0 = unlimited)" + }, + "tessdataDir": { + "label": "Tessdata Directory", + "description": "Path to the tessdata directory for OCR language files" + }, + "disableSanitize": { + "label": "Disable HTML Sanitization", + "description": "WARNING: Security risk - disabling HTML sanitization can lead to XSS vulnerabilities" + }, + "tempFileManagement": { + "label": "Temp File Management", + "description": "Configure temporary file storage and cleanup behavior", + "baseTmpDir": { + "label": "Base Temp Directory", + "description": "Base directory for temporary files (leave empty for default: java.io.tmpdir/stirling-pdf)" + }, + "libreofficeDir": { + "label": "LibreOffice Temp Directory", + "description": "Directory for LibreOffice temp files (leave empty for default: baseTmpDir/libreoffice)" + }, + "systemTempDir": { + "label": "System Temp Directory", + "description": "System temp directory to clean (only used if cleanupSystemTemp is enabled)" + }, + "prefix": { + "label": "Temp File Prefix", + "description": "Prefix for temp file names" + }, + "maxAgeHours": { + "label": "Max Age (hours)", + "description": "Maximum age in hours before temp files are cleaned up" + }, + "cleanupIntervalMinutes": { + "label": "Cleanup Interval (minutes)", + "description": "How often to run cleanup (in minutes)" + }, + "startupCleanup": { + "label": "Startup Cleanup", + "description": "Clean up old temp files on application startup" + }, + "cleanupSystemTemp": { + "label": "Cleanup System Temp", + "description": "Whether to clean broader system temp directory (use with caution)" + } + }, + "processExecutor": { + "label": "Process Executor Limits", + "description": "Configure session limits and timeouts for each process executor", + "sessionLimit": { + "label": "Session Limit", + "description": "Maximum concurrent instances" + }, + "timeout": { + "label": "Timeout (minutes)", + "description": "Maximum execution time" + }, + "libreOffice": "LibreOffice", + "pdfToHtml": "PDF to HTML", + "qpdf": "QPDF", + "tesseract": "Tesseract OCR", + "pythonOpenCv": "Python OpenCV", + "weasyPrint": "WeasyPrint", + "installApp": "Install App", + "calibre": "Calibre", + "ghostscript": "Ghostscript", + "ocrMyPdf": "OCRmyPDF" + } + }, + "mail": { + "title": "Mail Server", + "description": "Configure SMTP settings for sending email notifications.", + "smtp": "SMTP Configuration", + "enabled": { + "label": "Enable Mail", + "description": "Enable email notifications and SMTP functionality" + }, + "host": { + "label": "SMTP Host", + "description": "The hostname or IP address of your SMTP server" + }, + "port": { + "label": "SMTP Port", + "description": "The port number for SMTP connection (typically 25, 465, or 587)" + }, + "username": { + "label": "SMTP Username", + "description": "Username for SMTP authentication" + }, + "password": { + "label": "SMTP Password", + "description": "Password for SMTP authentication" + }, + "from": { + "label": "From Address", + "description": "The email address to use as the sender" + }, + "enableInvites": { + "label": "Enable Email Invites", + "description": "Allow admins to invite users via email with auto-generated passwords" + }, + "frontendUrl": { + "label": "Frontend URL", + "description": "Base URL for frontend (e.g. https://pdf.example.com). Used for generating invite links in emails. Leave empty to use backend URL." + } + }, + "legal": { + "title": "Legal Documents", + "description": "Configure links to legal documents and policies.", + "disclaimer": { + "title": "Legal Responsibility Warning", + "message": "By customizing these legal documents, you assume full responsibility for ensuring compliance with all applicable laws and regulations, including but not limited to GDPR and other EU data protection requirements. Only modify these settings if: (1) you are operating a personal/private instance, (2) you are outside EU jurisdiction and understand your local legal obligations, or (3) you have obtained proper legal counsel and accept sole responsibility for all user data and legal compliance. Stirling-PDF and its developers assume no liability for your legal obligations." + }, + "termsAndConditions": { + "label": "Terms and Conditions", + "description": "URL or filename to terms and conditions" + }, + "privacyPolicy": { + "label": "Privacy Policy", + "description": "URL or filename to privacy policy" + }, + "accessibilityStatement": { + "label": "Accessibility Statement", + "description": "URL or filename to accessibility statement" + }, + "cookiePolicy": { + "label": "Cookie Policy", + "description": "URL or filename to cookie policy" + }, + "impressum": { + "label": "Impressum", + "description": "URL or filename to impressum (required in some jurisdictions)" + } + }, + "premium": { + "title": "Premium & Enterprise", + "description": "Configure your premium or enterprise license key.", + "license": "License Configuration", + "key": { + "label": "License Key", + "description": "Enter your premium or enterprise license key" + }, + "enabled": { + "label": "Enable Premium Features", + "description": "Enable license key checks for pro/enterprise features" + }, + "movedFeatures": { + "title": "Premium Features Distributed", + "message": "Premium and Enterprise features are now organized in their respective sections:" + } + }, + "features": { + "title": "Features", + "description": "Configure optional features and functionality.", + "serverCertificate": { + "label": "Server Certificate", + "description": "Configure server-side certificate generation for \"Sign with Stirling-PDF\" functionality", + "enabled": { + "label": "Enable Server Certificate", + "description": "Enable server-side certificate for \"Sign with Stirling-PDF\" option" + }, + "organizationName": { + "label": "Organization Name", + "description": "Organization name for generated certificates" + }, + "validity": { + "label": "Certificate Validity (days)", + "description": "Number of days the certificate will be valid" + }, + "regenerateOnStartup": { + "label": "Regenerate on Startup", + "description": "Generate new certificate on each application startup" + } + } + }, + "endpoints": { + "title": "API Endpoints", + "description": "Control which API endpoints and endpoint groups are available.", + "management": "Endpoint Management", + "toRemove": { + "label": "Disabled Endpoints", + "description": "Select individual endpoints to disable" + }, + "groupsToRemove": { + "label": "Disabled Endpoint Groups", + "description": "Select endpoint groups to disable" + }, + "note": "Note: Disabling endpoints restricts API access but does not remove UI components. Restart required for changes to take effect." + } + } }, "fileUpload": { - "loading": "Cargando...", - "or": "o", - "addFiles": "Agregar Archivos", - "backToTools": "Volver a Herramientas", - "chooseFromStorage": "Elija un archivo del almacenamiento o cargue un nuevo PDF", - "chooseFromStorageMultiple": "Elija archivos del almacenamiento o cargue nuevos PDFs", - "dragFilesInOrClick": "Arrastre archivos o haga clic en \"Agregar Archivos\" para navegar", - "dropFileHere": "Suelte el archivo aquí o haga clic para cargar", - "dropFilesHere": "Suelte los archivos aquí o haga clic en el botÃŗn de carga", - "filesAvailable": "archivos disponibles", - "loadFromStorage": "Cargar desde Almacenamiento", - "noFilesInStorage": "No hay archivos disponibles en el almacenamiento. Cargue algunos archivos primero.", - "pdfFilesOnly": "Solo archivos PDF", "selectFile": "Seleccionar un archivo", "selectFiles": "Seleccionar archivos", - "selectFromStorage": "Seleccionar del Almacenamiento", - "selectPdfToEdit": "Seleccione un PDF para editar", "selectPdfToView": "Seleccione un PDF para ver", + "selectPdfToEdit": "Seleccione un PDF para editar", + "chooseFromStorage": "Elija un archivo del almacenamiento o cargue un nuevo PDF", + "chooseFromStorageMultiple": "Elija archivos del almacenamiento o cargue nuevos PDFs", + "loadFromStorage": "Cargar desde Almacenamiento", + "filesAvailable": "archivos disponibles", + "loading": "Cargando...", + "or": "o", + "dropFileHere": "Suelte el archivo aquí o haga clic para cargar", + "dropFilesHere": "Suelte los archivos aquí o haga clic en el botÃŗn de carga", + "pdfFilesOnly": "Solo archivos PDF", "supportedFileTypes": "Tipos de archivo soportados", "upload": "Cargar", "uploadFile": "Cargar Archivo", - "uploadFiles": "Cargar Archivos" + "uploadFiles": "Cargar Archivos", + "noFilesInStorage": "No hay archivos disponibles en el almacenamiento. Cargue algunos archivos primero.", + "selectFromStorage": "Seleccionar del Almacenamiento", + "backToTools": "Volver a Herramientas", + "addFiles": "Agregar Archivos", + "dragFilesInOrClick": "Arrastre archivos o haga clic en \"Agregar Archivos\" para navegar" + }, + "fileEditor": { + "addFiles": "Add Files" }, "fileManager": { + "title": "Cargar Archivos PDF", + "subtitle": "Agregue archivos a su almacenamiento para acceder fÃĄcilmente a travÊs de las herramientas", + "filesSelected": "archivos seleccionados", + "clearSelection": "Limpiar SelecciÃŗn", + "openInFileEditor": "Abrir en Editor de Archivos", + "uploadError": "Error al cargar algunos archivos.", + "failedToOpen": "Error al abrir archivo. Es posible que haya sido eliminado del almacenamiento.", + "failedToLoad": "Error al cargar archivo al conjunto activo.", + "storageCleared": "El navegador limpiÃŗ el almacenamiento. Los archivos han sido eliminados. Por favor vuelva a cargarlos.", + "clearAll": "Limpiar Todo", + "reloadFiles": "Recargar Archivos", + "dragDrop": "Arrastrar y Soltar archivos aquí", + "clickToUpload": "Haga clic para cargar archivos", + "selectedFiles": "Archivos Seleccionados", + "storage": "Almacenamiento", + "filesStored": "archivos almacenados", + "storageError": "OcurriÃŗ un error de almacenamiento", + "storageLow": "El almacenamiento se estÃĄ agotando. Considere eliminar archivos antiguos.", + "supportMessage": "Impulsado por almacenamiento de base de datos del navegador para capacidad ilimitada", + "noFileSelected": "No hay archivos seleccionados", + "showHistory": "Mostrar Historial", + "hideHistory": "Ocultar Historial", + "fileHistory": "Historial de Archivos", + "loadingHistory": "Cargando Historial...", + "lastModified": "Última ModificaciÃŗn", + "toolChain": "Herramientas Aplicadas", + "restore": "Restaurar", + "unzip": "Unzip", + "searchFiles": "Buscar archivos...", + "recent": "Reciente", + "localFiles": "Archivos Locales", + "googleDrive": "Google Drive", + "googleDriveShort": "Drive", + "myFiles": "Mis Archivos", + "noRecentFiles": "No se encontraron archivos recientes", + "googleDriveNotAvailable": "IntegraciÃŗn con Google Drive no disponible", + "openFiles": "Abrir Archivos", + "openFile": "Abrir Archivo", + "details": "Detalles del Archivo", "fileName": "Nombre", + "fileFormat": "Formato", + "fileSize": "TamaÃąo", "fileVersion": "VersiÃŗn", + "totalSelected": "Total Seleccionados", + "dropFilesHere": "Soltar archivos aquí", "selectAll": "Seleccionar Todo", "deselectAll": "Deseleccionar Todo", "deleteSelected": "Borrar seleccionado(s)", + "downloadSelected": "Descargar Seleccionados", + "selectedCount": "{{count}} seleccionados", "download": "Descargar", "delete": "Borrar", - "clearAll": "Limpiar Todo", - "clearSelection": "Limpiar SelecciÃŗn", - "clickToUpload": "Haga clic para cargar archivos", - "details": "Detalles del Archivo", - "downloadSelected": "Descargar Seleccionados", - "dragDrop": "Arrastrar y Soltar archivos aquí", - "dropFilesHere": "Soltar archivos aquí", - "dropFilesHint": "Suelte los archivos aquí para cargar", - "failedToLoad": "Error al cargar archivo al conjunto activo.", - "failedToOpen": "Error al abrir archivo. Es posible que haya sido eliminado del almacenamiento.", - "fileFormat": "Formato", - "fileHistory": "Historial de Archivos", - "fileSize": "TamaÃąo", - "filesSelected": "archivos seleccionados", - "filesStored": "archivos almacenados", - "googleDrive": "Google Drive", - "googleDriveNotAvailable": "IntegraciÃŗn con Google Drive no disponible", - "googleDriveShort": "Drive", - "hideHistory": "Ocultar Historial", - "lastModified": "Última ModificaciÃŗn", - "loadingHistory": "Cargando Historial...", - "localFiles": "Archivos Locales", - "myFiles": "Mis Archivos", - "noFileSelected": "No hay archivos seleccionados", - "noRecentFiles": "No se encontraron archivos recientes", - "openFile": "Abrir Archivo", - "openFiles": "Abrir Archivos", - "openInFileEditor": "Abrir en Editor de Archivos", - "recent": "Reciente", - "reloadFiles": "Recargar Archivos", - "restore": "Restaurar", - "searchFiles": "Buscar archivos...", - "selectedCount": "{{count}} seleccionados", - "selectedFiles": "Archivos Seleccionados", - "showHistory": "Mostrar Historial", - "storage": "Almacenamiento", - "storageCleared": "El navegador limpiÃŗ el almacenamiento. Los archivos han sido eliminados. Por favor vuelva a cargarlos.", - "storageError": "OcurriÃŗ un error de almacenamiento", - "storageLow": "El almacenamiento se estÃĄ agotando. Considere eliminar archivos antiguos.", - "subtitle": "Agregue archivos a su almacenamiento para acceder fÃĄcilmente a travÊs de las herramientas", - "supportMessage": "Impulsado por almacenamiento de base de datos del navegador para capacidad ilimitada", - "title": "Cargar Archivos PDF", - "toolChain": "Herramientas Aplicadas", - "totalSelected": "Total Seleccionados", "unsupported": "No Soportado", - "uploadError": "Error al cargar algunos archivos." + "addToUpload": "Add to Upload", + "deleteAll": "Delete All", + "loadingFiles": "Loading files...", + "noFiles": "No files available", + "noFilesFound": "No files found matching your search", + "openInPageEditor": "Open in Page Editor", + "showAll": "Show All", + "sortByDate": "Sort by Date", + "sortByName": "Sort by Name", + "sortBySize": "Sort by Size", + "dropFilesHint": "Suelte los archivos aquí para cargar" + }, + "storage": { + "temporaryNotice": "Los archivos se almacenan temporalmente en su navegador y pueden eliminarse automÃĄticamente", + "storageLimit": "Límite de almacenamiento", + "storageUsed": "Almacenamiento temporal utilizado", + "storageFull": "El almacenamiento estÃĄ casi lleno. Considere eliminar algunos archivos.", + "fileTooLarge": "Archivo demasiado grande. El tamaÃąo mÃĄximo por archivo es", + "storageQuotaExceeded": "Cuota de almacenamiento excedida. Por favor, elimine algunos archivos antes de cargar mÃĄs.", + "approximateSize": "TamaÃąo aproximado" }, "sanitize": { - "submit": "Limpiar archivo PDF", - "steps": { - "settings": "ConfiguraciÃŗn", - "files": "Archivos", - "results": "Resultados" - }, - "completed": "DesinfecciÃŗn completada con Êxito", + "title": "Desinfectar", "desc": "Eliminar elementos potencialmente daÃąinos de archivos PDF.", + "submit": "Limpiar archivo PDF", + "completed": "DesinfecciÃŗn completada con Êxito", "error": { "failed": "Se produjo un error al desinfectar el PDF.", "generic": "La desinfecciÃŗn fallÃŗ" }, "filenamePrefix": "desinfectado", + "sanitizationResults": "Resultados de DesinfecciÃŗn", + "steps": { + "files": "Archivos", + "settings": "ConfiguraciÃŗn", + "results": "Resultados" + }, "files": { "placeholder": "Seleccione un archivo PDF en la vista principal para comenzar" }, "options": { + "title": "Opciones de DesinfecciÃŗn", "note": "Seleccione los elementos que desea eliminar del PDF. Debe seleccionarse al menos una opciÃŗn.", - "removeEmbeddedFiles": { - "desc": "Eliminar cualquier archivo incrustado dentro del PDF" - }, - "removeFonts": { - "desc": "Eliminar fuentes incrustadas del PDF" - }, "removeJavaScript": { + "label": "Remove JavaScript", "desc": "Eliminar acciones y scripts de JavaScript del PDF" }, - "removeLinks": { - "desc": "Eliminar enlaces externos y acciones de lanzamiento del PDF" - }, - "removeMetadata": { - "desc": "Eliminar metadatos de informaciÃŗn del documento (título, autor, etc.)" + "removeEmbeddedFiles": { + "label": "Remove Embedded Files", + "desc": "Eliminar cualquier archivo incrustado dentro del PDF" }, "removeXMPMetadata": { + "label": "Remove XMP Metadata", "desc": "Eliminar metadatos XMP del PDF" }, - "title": "Opciones de DesinfecciÃŗn" + "removeMetadata": { + "label": "Remove Document Metadata", + "desc": "Eliminar metadatos de informaciÃŗn del documento (título, autor, etc.)" + }, + "removeLinks": { + "label": "Remove Links", + "desc": "Eliminar enlaces externos y acciones de lanzamiento del PDF" + }, + "removeFonts": { + "label": "Remove Fonts", + "desc": "Eliminar fuentes incrustadas del PDF" + } + } + }, + "addPassword": { + "title": "Proteger con contraseÃąa", + "desc": "Cifre su documento PDF con una contraseÃąa.", + "completed": "ProtecciÃŗn con contraseÃąa aplicada", + "submit": "Encriptar", + "filenamePrefix": "cifrado", + "error": { + "failed": "Se produjo un error al cifrar el PDF." }, - "sanitizationResults": "Resultados de DesinfecciÃŗn", - "title": "Desinfectar" + "passwords": { + "stepTitle": "ContraseÃąas y cifrado", + "completed": "ContraseÃąas configuradas", + "user": { + "label": "ContraseÃąa de usuario", + "placeholder": "Introduzca la contraseÃąa de usuario" + }, + "owner": { + "label": "ContraseÃąa de propietario", + "placeholder": "Introduzca la contraseÃąa de propietario" + } + }, + "encryption": { + "keyLength": { + "label": "Longitud de clave de cifrado", + "40bit": "40 bits (Bajo)", + "128bit": "128 bits (EstÃĄndar)", + "256bit": "256 bits (Alto)" + } + }, + "results": { + "title": "PDFs cifrados" + }, + "tooltip": { + "header": { + "title": "DescripciÃŗn general de protecciÃŗn con contraseÃąa" + }, + "passwords": { + "title": "Tipos de contraseÃąa", + "text": "Las contraseÃąas de usuario restringen la apertura del documento, mientras que las contraseÃąas de propietario controlan lo que se puede hacer con el documento una vez abierto. Puede establecer ambas o solo una.", + "bullet1": "ContraseÃąa de usuario: Requerida para abrir el PDF", + "bullet2": "ContraseÃąa de propietario: Controla los permisos del documento (no compatible con todos los visores de PDF)" + }, + "encryption": { + "title": "Niveles de cifrado", + "text": "Los niveles de cifrado mÃĄs altos proporcionan mejor seguridad, pero es posible que no sean compatibles con visores de PDF antiguos.", + "bullet1": "40 bits: Seguridad bÃĄsica, compatible con visores antiguos", + "bullet2": "128 bits: Seguridad estÃĄndar, ampliamente compatible", + "bullet3": "256 bits: Seguridad mÃĄxima, requiere visores modernos" + }, + "permissions": { + "title": "Cambiar permisos", + "text": "Estos permisos controlan lo que los usuarios pueden hacer con el PDF. Son mÃĄs efectivos cuando se combinan con una contraseÃąa de propietario." + } + }, + "tags": "seguro,seguridad", + "header": "AÃąadir contraseÃąa (encriptar)", + "selectText": { + "1": "Seleccionar PDF para encriptar", + "2": "ContraseÃąa", + "3": "Longitud de la clave de cifrado", + "4": "Valores altos son mÃĄs fuertes, pero valores bajos tienen mejor compatibilidad", + "5": "Permisos para establecer", + "6": "Impedir el ensamblaje del documento", + "7": "Impedir la extracciÃŗn de contenido", + "8": "Impedir la extracciÃŗn para la accesibilidad", + "9": "Impedir rellenar formulario", + "10": "Impedir modificaciÃŗn", + "11": "Impedir modificaciÃŗn de anotaciones", + "12": "Impedir imprimir", + "13": "Impedir imprimir diferentes formatos", + "14": "ContraseÃąa", + "15": "Restringir quÊ se puede hacer con el documento una vez abierto (no soportado por todos los lectores)", + "16": "Restringir la apertura del propio documento" + } }, "changePermissions": { "title": "Cambiar permisos", + "desc": "Modificar restricciones y permisos del documento.", + "completed": "Permisos modificados", "submit": "Cambiar permisos", + "error": { + "failed": "OcurriÃŗ un error al cambiar los permisos del PDF." + }, "permissions": { "preventAssembly": { "label": "Impedir el ensamblaje del documento" @@ -3145,6 +4586,9 @@ "label": "Impedir imprimir diferentes formatos" } }, + "results": { + "title": "PDFs Modificados" + }, "tooltip": { "header": { "title": "Cambiar permisos" @@ -3155,574 +4599,772 @@ "warning": { "text": "Para hacer estos permisos inmutables, use la herramienta Agregar ContraseÃąa para establecer una contraseÃąa de propietario." } - }, - "completed": "Permisos modificados", - "desc": "Modificar restricciones y permisos del documento.", - "error": { - "failed": "OcurriÃŗ un error al cambiar los permisos del PDF." - }, - "results": { - "title": "PDFs Modificados" } }, - "AddAttachmentsRequest": { - "addMoreFiles": "AÃąadir mÃĄs archivos...", - "attachments": "Seleccionar archivos adjuntos", - "info": "Seleccione archivos para adjuntar a su PDF. Estos archivos se incrustarÃĄn y serÃĄn accesibles a travÊs del panel de archivos adjuntos del PDF.", - "placeholder": "Elegir archivos...", - "results": { - "title": "Resultados de archivos adjuntos" + "removePassword": { + "title": "Quitar contraseÃąa", + "desc": "Eliminar la contraseÃąa del documento PDF", + "tags": "seguro,Descifrar,seguridad,quitar contraseÃąa,eliminar contraseÃąa", + "password": { + "stepTitle": "Eliminar contraseÃąa", + "label": "ContraseÃąa actual", + "placeholder": "Introduzca la contraseÃąa actual", + "completed": "ContraseÃąa configurada" }, - "selectFiles": "Seleccionar archivos para adjuntar", - "selectedFiles": "Archivos seleccionados", - "submit": "AÃąadir archivos adjuntos" - }, - "adjustPageScale": { + "filenamePrefix": "descifrado", "error": { - "failed": "Se produjo un error al ajustar la escala de pÃĄgina." + "failed": "Se produjo un error al eliminar la contraseÃąa del PDF." }, - "header": "Ajustar escala de pÃĄgina", - "pageSize": { - "keep": "Mantener tamaÃąo original", - "label": "TamaÃąo de pÃĄgina de destino", - "legal": "Legal", - "letter": "Carta" - }, - "scaleFactor": { - "label": "Factor de escala" - }, - "submit": "Ajustar escala de pÃĄgina", - "tags": "redimensionar,modificar,dimensiÃŗn,adaptar", - "title": "Ajustar escala de pÃĄgina", "tooltip": { - "description": { - "text": "Ajuste el tamaÃąo del contenido del PDF y cambie las dimensiones de pÃĄgina.", - "title": "DescripciÃŗn" - }, - "header": { - "title": "DescripciÃŗn general de configuraciÃŗn de escala de pÃĄgina" - }, - "pageSize": { - "text": "Establece las dimensiones de las pÃĄginas del PDF de salida. 'Mantener tamaÃąo original' conserva las dimensiones actuales, mientras que otras opciones redimensionan a tamaÃąos de papel estÃĄndar.", - "title": "TamaÃąo de pÃĄgina de destino" - }, - "scaleFactor": { - "bullet1": "1.0 = TamaÃąo original", - "bullet2": "0.5 = Mitad del tamaÃąo (50% mÃĄs pequeÃąo)", - "bullet3": "2.0 = Doble tamaÃąo (200% mÃĄs grande, puede recortarse)", - "text": "Controla el tamaÃąo del contenido en la pÃĄgina. El contenido se escala y se centra; si el contenido escalado es mÃĄs grande que el tamaÃąo de pÃĄgina, puede recortarse.", - "title": "Factor de escala" - } + "description": "Eliminar la protecciÃŗn con contraseÃąa requiere la contraseÃąa que se usÃŗ para cifrar el PDF. Esto descifrarÃĄ el documento, haciÊndolo accesible sin contraseÃąa." + }, + "submit": "Eliminar", + "results": { + "title": "PDF Descifrados" + }, + "header": "Eliminar contraseÃąa (desencriptar)", + "selectText": { + "1": "Seleccionar PDF para desencriptar", + "2": "ContraseÃąa" } }, - "app": { - "description": "La alternativa gratuita a Adobe Acrobat (mÃĄs de 10 millones de descargas)" - }, - "applyAndContinue": "Aplicar y continuar", "automate": { - "config": { - "cancel": "Cancelar", - "description": "Configure los ajustes para esta herramienta. Estos ajustes se aplicarÃĄn cuando se ejecute la automatizaciÃŗn.", - "loading": "Cargando configuraciÃŗn de herramienta...", - "noSettings": "Esta herramienta no tiene ajustes configurables.", - "save": "Guardar configuraciÃŗn", - "title": "Configurar {{toolName}}" + "title": "Automatizar", + "desc": "Cree flujos de trabajo de varios pasos encadenando acciones de PDF. Ideal para tareas recurrentes.", + "invalidStep": "Paso invÃĄlido", + "files": { + "placeholder": "Seleccione archivos para procesar con esta automatizaciÃŗn" + }, + "selection": { + "title": "SelecciÃŗn de automatizaciÃŗn", + "saved": { + "title": "Guardados" + }, + "createNew": { + "title": "Crear nueva automatizaciÃŗn" + }, + "suggested": { + "title": "Sugeridos" + } }, - "copyToSaved": "Copiar a guardados", "creation": { "createTitle": "Crear automatizaciÃŗn", - "description": { - "label": "DescripciÃŗn (opcional)", - "placeholder": "Describa quÊ hace esta automatizaciÃŗn..." - }, "editTitle": "Editar automatizaciÃŗn", - "icon": { - "label": "Icono" - }, "intro": "Las automatizaciones ejecutan herramientas de forma secuencial. Para comenzar, aÃąada herramientas en el orden en que desea que se ejecuten.", "name": { "label": "Nombre de automatizaciÃŗn", "placeholder": "Mi automatizaciÃŗn" }, - "save": "Guardar automatizaciÃŗn", + "description": { + "label": "DescripciÃŗn (opcional)", + "placeholder": "Describa quÊ hace esta automatizaciÃŗn..." + }, "tools": { - "add": "AÃąadir una herramienta...", - "addTool": "AÃąadir herramienta", + "selectTool": "Seleccionar una herramienta...", + "selected": "Herramientas seleccionadas", + "remove": "Eliminar herramienta", "configure": "Configurar herramienta", "notConfigured": "! No configurado", - "remove": "Eliminar herramienta", - "selectTool": "Seleccionar una herramienta...", - "selected": "Herramientas seleccionadas" + "addTool": "AÃąadir herramienta", + "add": "AÃąadir una herramienta..." }, + "save": "Guardar automatizaciÃŗn", "unsavedChanges": { - "cancel": "Cancelar", - "confirm": "Volver", + "title": "Cambios sin guardar", "message": "Tiene cambios sin guardar. ÂŋEstÃĄ seguro de que desea volver? Se perderÃĄn todos los cambios.", - "title": "Cambios sin guardar" + "cancel": "Cancelar", + "confirm": "Volver" + }, + "icon": { + "label": "Icono" } }, - "desc": "Cree flujos de trabajo de varios pasos encadenando acciones de PDF. Ideal para tareas recurrentes.", - "files": { - "placeholder": "Seleccione archivos para procesar con esta automatizaciÃŗn" - }, - "invalidStep": "Paso invÃĄlido", - "reviewTitle": "Resultados de automatizaciÃŗn", "run": { "title": "Ejecutar automatizaciÃŗn" }, - "selection": { - "createNew": { - "title": "Crear nueva automatizaciÃŗn" - }, - "saved": { - "title": "Guardados" - }, - "suggested": { - "title": "Sugeridos" - }, - "title": "SelecciÃŗn de automatizaciÃŗn" - }, "sequence": { - "finish": "Finalizar", - "run": "Ejecutar automatizaciÃŗn", - "running": "Ejecutando automatizaciÃŗn...", + "unnamed": "AutomatizaciÃŗn sin nombre", "steps": "{{count}} pasos", - "unnamed": "AutomatizaciÃŗn sin nombre" + "running": "Ejecutando automatizaciÃŗn...", + "run": "Ejecutar automatizaciÃŗn", + "finish": "Finalizar" }, - "title": "Automatizar" + "reviewTitle": "Resultados de automatizaciÃŗn", + "config": { + "loading": "Cargando configuraciÃŗn de herramienta...", + "noSettings": "Esta herramienta no tiene ajustes configurables.", + "title": "Configurar {{toolName}}", + "description": "Configure los ajustes para esta herramienta. Estos ajustes se aplicarÃĄn cuando se ejecute la automatizaciÃŗn.", + "cancel": "Cancelar", + "save": "Guardar configuraciÃŗn" + }, + "copyToSaved": "Copiar a guardados" }, "automation": { "suggested": { - "emailPreparation": "PreparaciÃŗn de correo electrÃŗnico", - "emailPreparationDesc": "Optimiza PDFs para distribuciÃŗn por correo electrÃŗnico comprimiendo archivos, dividiendo documentos grandes en fragmentos de 20 MB para compatibilidad con correo electrÃŗnico, y eliminando metadatos para privacidad.", - "processImages": "Procesar imÃĄgenes", - "processImagesDesc": "Convierte varios archivos de imagen en un solo documento PDF, luego aplica tecnología OCR para extraer texto con capacidad de bÃēsqueda de las imÃĄgenes.", "securePdfIngestion": "Ingesta segura de PDF", "securePdfIngestionDesc": "Flujo de trabajo integral de procesamiento de PDF que sanea documentos, aplica OCR con limpieza, convierte a formato PDF/A para archivo a largo plazo y optimiza el tamaÃąo del archivo.", + "emailPreparation": "PreparaciÃŗn de correo electrÃŗnico", + "emailPreparationDesc": "Optimiza PDFs para distribuciÃŗn por correo electrÃŗnico comprimiendo archivos, dividiendo documentos grandes en fragmentos de 20 MB para compatibilidad con correo electrÃŗnico, y eliminando metadatos para privacidad.", "secureWorkflow": "Flujo de trabajo de seguridad", - "secureWorkflowDesc": "Asegura documentos PDF eliminando contenido potencialmente malicioso como JavaScript y archivos incrustados, luego aÃąade protecciÃŗn con contraseÃąa para evitar acceso no autorizado. La contraseÃąa se establece en 'password' de forma predeterminada." + "secureWorkflowDesc": "Asegura documentos PDF eliminando contenido potencialmente malicioso como JavaScript y archivos incrustados, luego aÃąade protecciÃŗn con contraseÃąa para evitar acceso no autorizado. La contraseÃąa se establece en 'password' de forma predeterminada.", + "processImages": "Procesar imÃĄgenes", + "processImagesDesc": "Convierte varios archivos de imagen en un solo documento PDF, luego aplica tecnología OCR para extraer texto con capacidad de bÃēsqueda de las imÃĄgenes." } }, - "bookletImposition": { - "addBorder": { - "label": "AÃąadir bordes alrededor de las pÃĄginas", - "tooltip": "AÃąade bordes alrededor de cada secciÃŗn de pÃĄgina para ayudar con el corte y la alineaciÃŗn" - }, - "addGutter": { - "label": "AÃąadir margen de medianil", - "tooltip": "AÃąade espacio de margen interior para encuadernaciÃŗn" - }, - "advanced": { - "toggle": "Opciones avanzadas" - }, - "doubleSided": { - "label": "ImpresiÃŗn a doble cara", - "tooltip": "Crea ambos lados frontal y posterior para impresiÃŗn de folleto adecuada" - }, - "duplexPass": { - "first": "Primera pasada", - "firstInstructions": "Imprime lados frontales → apile boca abajo → ejecute de nuevo con segunda pasada", - "label": "Pasada de impresiÃŗn", - "second": "Segunda pasada", - "secondInstructions": "Cargue la pila impresa boca abajo → imprime lados posteriores" - }, - "error": { - "failed": "Se produjo un error al crear la imposiciÃŗn de folleto." - }, - "flipOnShortEdge": { - "label": "Voltear por borde corto (solo dÃēplex automÃĄtico)", - "manualNote": "No necesario en modo manual: usted voltea la pila manualmente", - "tooltip": "Active para impresiÃŗn dÃēplex por borde corto (solo dÃēplex automÃĄtico - ignorado en modo manual)" - }, - "gutterSize": { - "label": "TamaÃąo de medianil (puntos)" - }, - "header": "ImposiciÃŗn de folleto", - "manualDuplex": { - "instructions": "Para impresoras sin dÃēplex automÃĄtico. NecesitarÃĄ ejecutar esto dos veces:", - "title": "Modo dÃēplex manual" - }, - "paperSizeNote": "El tamaÃąo del papel se deriva automÃĄticamente de su primera pÃĄgina.", - "rtlBinding": { - "label": "EncuadernaciÃŗn de derecha a izquierda", - "tooltip": "Para ÃĄrabe, hebreo u otros idiomas de derecha a izquierda" - }, - "spineLocation": { - "label": "UbicaciÃŗn del lomo", - "left": "Izquierda (EstÃĄndar)", - "right": "Derecha (RTL)" - }, - "submit": "Crear folleto", - "tags": "folleto,imposiciÃŗn,impresiÃŗn,encuadernaciÃŗn,plegado,signatura", - "title": "ImposiciÃŗn de folleto", - "tooltip": { - "advanced": { - "bullet1": "EncuadernaciÃŗn de derecha a izquierda: Para ÃĄrabe, hebreo o idiomas RTL", - "bullet2": "Bordes: Muestra líneas de corte para recortar", - "bullet3": "Margen de medianil: AÃąade espacio para encuadernaciÃŗn/grapado", - "bullet4": "Volteo por borde corto: Solo para impresoras dÃēplex automÃĄticas", - "text": "Ajuste fino de su folleto:", - "title": "Opciones avanzadas" - }, - "description": { - "text": "Crea folletos profesionales organizando las pÃĄginas en el orden de impresiÃŗn correcto. Las pÃĄginas de su PDF se colocan de 2 en 2 en hojas horizontales, de modo que cuando se doblan y se encuadernan, se lean en la secuencia adecuada como un libro real.", - "title": "ÂŋQuÊ es la imposiciÃŗn de folleto?" - }, - "example": { - "bullet1": "Hoja 1 frontal: PÃĄginas 8, 1 | Posterior: PÃĄginas 2, 7", - "bullet2": "Hoja 2 frontal: PÃĄginas 6, 3 | Posterior: PÃĄginas 4, 5", - "bullet3": "Cuando se dobla y apila: Lee 1→2→3→4→5→6→7→8", - "text": "Su documento de 8 pÃĄginas se convierte en 2 hojas:", - "title": "Ejemplo: Folleto de 8 pÃĄginas" - }, - "header": { - "title": "Guía de creaciÃŗn de folletos" - }, - "manualDuplex": { - "bullet1": "Desactive 'ImpresiÃŗn a doble cara'", - "bullet2": "Seleccione 'Primera pasada' → Imprimir → Apile boca abajo", - "bullet3": "Seleccione 'Segunda pasada' → Cargue pila → Imprima posteriores", - "bullet4": "Doble y ensamble normalmente", - "text": "Para impresoras sin dÃēplex automÃĄtico:", - "title": "DÃēplex manual (impresoras de una cara)" - }, - "printing": { - "bullet1": "Imprima a doble cara con 'Voltear por borde largo'", - "bullet2": "Apile hojas en orden, doble por la mitad", - "bullet3": "Grape o encuaderne a lo largo del lomo doblado", - "bullet4": "Para impresoras de borde corto: Active la opciÃŗn 'Voltear por borde corto'", - "text": "Siga estos pasos para folletos perfectos:", - "title": "CÃŗmo imprimir y ensamblar" - } - } - }, - "bulkSelection": { - "advanced": { - "title": "Avanzado" - }, - "everyNthPage": { - "placeholder": "TamaÃąo de paso", - "title": "Cada enÊsima pÃĄgina" - }, - "examples": { - "combineSets": "Combinar conjuntos", - "every3rd": "Cada tercera", - "first50": "Primeras 50", - "last50": "Últimas 50", - "oddWithinExcluding": "Impares dentro de 1-20 excluyendo 5-7", - "title": "Ejemplos" - }, - "firstNPages": { - "placeholder": "NÃēmero de pÃĄginas", - "title": "Primeras N pÃĄginas" - }, - "header": { - "title": "Guía de selecciÃŗn de pÃĄginas" - }, - "keywords": { - "title": "Palabras clave" - }, - "lastNPages": { - "placeholder": "NÃēmero de pÃĄginas", - "title": "Últimas N pÃĄginas" - }, - "operators": { - "and": "AND: & o \"and\" — requiere ambas condiciones (ej., 1-50 & even)", - "comma": "Coma: , o | — combina selecciones (ej., 1-10, 20)", - "not": "NOT: ! o \"not\" — excluye pÃĄginas (ej., 3n & not 30)", - "text": "AND tiene mayor precedencia que la coma. NOT se aplica dentro del rango del documento.", - "title": "Operadores" - }, - "range": { - "fromPlaceholder": "Desde", - "title": "Rango", - "toPlaceholder": "Hasta" - }, - "syntax": { - "bullets": { - "keywords": "Palabras clave: odd, even", - "numbers": "NÃēmeros/rangos: 5, 10-20", - "progressions": "Progresiones: 3n, 4n+1" - }, - "text": "Use nÃēmeros, rangos, palabras clave y progresiones (n comienza en 0). Se admiten parÊntesis.", - "title": "Conceptos bÃĄsicos de sintaxis" - } - }, - "chooseFile": "Elegir Archivo", - "comingSoon": "PrÃŗximamente", "common": { + "copy": "Copiar", + "copied": "ÂĄCopiado!", + "refresh": "Actualizar", + "retry": "Reintentar", + "remaining": "restante", + "used": "usado", "available": "disponible", "cancel": "Cancelar", - "copied": "ÂĄCopiado!", - "copy": "Copiar", - "refresh": "Actualizar", - "remaining": "restante", - "retry": "Reintentar", - "used": "usado" + "preview": "Preview" }, "config": { + "overview": { + "title": "Application Configuration", + "description": "Current application settings and configuration details." + }, "account": { "overview": { - "guestDescription": "Ha iniciado sesiÃŗn como invitado. Considere actualizar su cuenta arriba.", + "title": "ConfiguraciÃŗn de Cuenta", "manageAccountPreferences": "Administre las preferencias de su cuenta", - "title": "ConfiguraciÃŗn de Cuenta" + "guestDescription": "Ha iniciado sesiÃŗn como invitado. Considere actualizar su cuenta arriba." }, "upgrade": { - "description": "ÂĄVincule su cuenta para preservar su historial y acceder a mÃĄs funciones!", - "email": "Correo electrÃŗnico", - "emailPassword": "o ingrese su correo electrÃŗnico y contraseÃąa", - "emailPlaceholder": "Ingrese su correo electrÃŗnico", - "linkWith": "Vincular con", - "password": "ContraseÃąa (opcional)", - "passwordNote": "Deje vacío para usar solo verificaciÃŗn por correo electrÃŗnico", - "passwordPlaceholder": "Establecer una contraseÃąa", - "socialLogin": "Actualizar con Cuenta Social", "title": "Actualizar Cuenta de Invitado", + "description": "ÂĄVincule su cuenta para preservar su historial y acceder a mÃĄs funciones!", + "socialLogin": "Actualizar con Cuenta Social", + "linkWith": "Vincular con", + "emailPassword": "o ingrese su correo electrÃŗnico y contraseÃąa", + "email": "Correo electrÃŗnico", + "emailPlaceholder": "Ingrese su correo electrÃŗnico", + "password": "ContraseÃąa (opcional)", + "passwordPlaceholder": "Establecer una contraseÃąa", + "passwordNote": "Deje vacío para usar solo verificaciÃŗn por correo electrÃŗnico", "upgradeButton": "Actualizar Cuenta" } }, "apiKeys": { - "chartAriaLabel": "Uso de crÊditos: incluidos {{includedUsed}} de {{includedTotal}}, comprados {{purchasedUsed}} de {{purchasedTotal}}", - "copyKeyAriaLabel": "Copiar clave API", "description": "Su clave API para acceder al conjunto de herramientas PDF de Stirling. CÃŗpiela a su proyecto o actualice para generar una nueva.", - "generateError": "No pudimos generar su clave API.", - "goToAccount": "Ir a Cuenta", - "guestInfo": "Los usuarios invitados no reciben claves API. Cree una cuenta para obtener una clave API que pueda usar en sus aplicaciones.", - "includedCredits": "CrÊditos incluidos", - "label": "Clave API", - "lastApiUse": "Último Uso de API", - "nextReset": "PrÃŗximo Restablecimiento", - "overlayMessage": "Genere una clave para ver crÊditos y crÊditos disponibles", "publicKeyAriaLabel": "Clave API pÃēblica", - "purchasedCredits": "CrÊditos comprados", + "copyKeyAriaLabel": "Copiar clave API", "refreshAriaLabel": "Actualizar clave API", + "includedCredits": "CrÊditos incluidos", + "purchasedCredits": "CrÊditos comprados", + "totalCredits": "CrÊditos Totales", + "chartAriaLabel": "Uso de crÊditos: incluidos {{includedUsed}} de {{includedTotal}}, comprados {{purchasedUsed}} de {{purchasedTotal}}", + "nextReset": "PrÃŗximo Restablecimiento", + "lastApiUse": "Último Uso de API", + "overlayMessage": "Genere una clave para ver crÊditos y crÊditos disponibles", + "label": "Clave API", + "guestInfo": "Los usuarios invitados no reciben claves API. Cree una cuenta para obtener una clave API que pueda usar en sus aplicaciones.", + "goToAccount": "Ir a Cuenta", "refreshModal": { - "confirmCta": "Actualizar Claves", - "confirmPrompt": "ÂŋEstÃĄ seguro de que desea continuar?", - "impact": "Cualquier aplicaciÃŗn o servicio que estÊ utilizando actualmente estas claves dejarÃĄ de funcionar hasta que las actualice con las nuevas claves.", "title": "Actualizar Claves API", - "warning": "âš ī¸ Advertencia: Esta acciÃŗn generarÃĄ nuevas claves API y harÃĄ que sus claves anteriores sean invÃĄlidas." + "warning": "âš ī¸ Advertencia: Esta acciÃŗn generarÃĄ nuevas claves API y harÃĄ que sus claves anteriores sean invÃĄlidas.", + "impact": "Cualquier aplicaciÃŗn o servicio que estÊ utilizando actualmente estas claves dejarÃĄ de funcionar hasta que las actualice con las nuevas claves.", + "confirmPrompt": "ÂŋEstÃĄ seguro de que desea continuar?", + "confirmCta": "Actualizar Claves" }, - "totalCredits": "CrÊditos Totales" + "generateError": "No pudimos generar su clave API." } }, - "discardChanges": "Descartar cambios", - "edit": "Editar", - "editYourNewFiles": "Editar sus nuevos archivos", - "exportAndContinue": "Exportar y continuar", - "fileSelected": "Archivo seleccionado: {{filename}}", - "files": { - "addFiles": "Agregar archivos", - "selectFromWorkbench": "Seleccione archivos del ÃĄrea de trabajo o ", - "selectMultipleFromWorkbench": "Seleccione al menos {{count}} archivos del ÃĄrea de trabajo o ", - "title": "Archivos", - "upload": "Cargar", - "uploadFiles": "Cargar Archivos" - }, - "guestBanner": { - "dismiss": "Descartar banner", - "message": "Cree una cuenta gratuita para guardar su trabajo, acceder a mÃĄs funciones y apoyar el proyecto.", - "signUp": "Registrarse Gratis", - "title": "ÂĄEstÃĄ usando Stirling PDF como invitado!" - }, - "keepWorking": "Seguir trabajando", - "landing": { - "addFiles": "Agregar Archivos", - "uploadFromComputer": "Cargar desde el ordenador" + "AddAttachmentsRequest": { + "attachments": "Seleccionar archivos adjuntos", + "info": "Seleccione archivos para adjuntar a su PDF. Estos archivos se incrustarÃĄn y serÃĄn accesibles a travÊs del panel de archivos adjuntos del PDF.", + "selectFiles": "Seleccionar archivos para adjuntar", + "placeholder": "Elegir archivos...", + "addMoreFiles": "AÃąadir mÃĄs archivos...", + "selectedFiles": "Archivos seleccionados", + "submit": "AÃąadir archivos adjuntos", + "results": { + "title": "Resultados de archivos adjuntos" + }, + "error": { + "failed": "Add attachments operation failed" + } }, + "termsAndConditions": "TÊrminos y Condiciones", "logOut": "Cerrar sesiÃŗn", - "moreOptions": "MÃĄs Opciones", - "pageEditor": { - "actualSize": "TamaÃąo Real", - "addFileNotImplemented": "Agregar archivo no implementado en la demostraciÃŗn", - "closePdf": "Cerrar PDF", - "deleted": "Eliminado:", - "fitToWidth": "Ajustar al Ancho", - "insertedPageBreak": "Salto de pÃĄgina insertado en:", - "movedLeft": "Movido a la izquierda:", - "movedRight": "Movido a la derecha:", - "noPdfLoaded": "No hay PDF cargado. Por favor, cargue un PDF para editar.", - "reset": "Restablecer Cambios", - "rotatedLeft": "Girado a la izquierda:", - "rotatedRight": "Girado a la derecha:", - "save": "Guardar Cambios", - "splitAt": "Dividir en:", - "title": "Editor de PÃĄginas", - "zoomIn": "Acercar", - "zoomOut": "Alejar" + "addAttachments": { + "error": { + "failed": "An error occurred while adding attachments to the PDF." + } }, - "pageSelection": { - "tooltip": { - "advanced": { - "title": "Funciones Avanzadas" + "autoRename": { + "description": "This tool will automatically rename PDF files based on their content. It analyzes the document to find the most suitable title from the text." + }, + "customPosition": "Custom Position", + "details": "Details", + "downloadUnavailable": "Download unavailable for this item", + "invalidUndoData": "Cannot undo: invalid operation data", + "margin": { + "large": "Large", + "medium": "Medium", + "small": "Small", + "xLarge": "Extra Large" + }, + "noFilesToUndo": "Cannot undo: no files were processed in the last operation", + "noOperationToUndo": "No operation to undo", + "noValidFiles": "No valid files to process", + "operationCancelled": "Operation cancelled", + "pageEdit": { + "deselectAll": "Select None", + "selectAll": "Select All" + }, + "quickPosition": "Quick Position", + "reorganizePages": { + "error": { + "failed": "Failed to reorganize pages" + }, + "results": { + "title": "Pages Reorganized" + }, + "settings": { + "title": "Settings" + }, + "submit": "Reorganize Pages" + }, + "replace-color": { + "options": { + "fill": "Fill colour", + "gradient": "Gradient" + }, + "previewOverlayOpacity": "Preview overlay opacity", + "previewOverlayTransparency": "Preview overlay transparency", + "previewOverlayVisibility": "Show preview overlay", + "selectText": { + "1": "Opciones para Reemplazar o Invertir color", + "2": "Predeterminado (Colores de alto contraste predeterminados)", + "3": "Personalizado (Colores personalizados)", + "4": "Invertir Completo (Invertir todos los colores)", + "5": "Opciones de color de alto contraste", + "6": "Texto blanco sobre fondo negro", + "7": "Texto negro sobre fondo blanco", + "8": "Texto amarillo sobre fondo negro", + "9": "Texto verde sobre fondo negro", + "10": "Elegir Color de Texto", + "11": "Elegir Color de Fondo", + "12": "Choose start colour", + "13": "Choose end colour" + }, + "submit": "Reemplazar", + "title": "Reemplazar-Invertir-Color", + "header": "Reemplazar-Invertir Color en PDF" + }, + "size": "Size", + "submit": "Submit", + "success": "Success", + "tools": { + "noSearchResults": "No tools found", + "noTools": "No tools available" + }, + "undoDataMismatch": "Cannot undo: operation data is corrupted", + "undoFailed": "Failed to undo operation", + "undoQuotaError": "Cannot undo: insufficient storage space", + "undoStorageError": "Undo completed but some files could not be saved to storage", + "undoSuccess": "Operation undone successfully", + "unsupported": "Unsupported", + "onboarding": { + "welcomeModal": { + "title": "Welcome to Stirling PDF!", + "description": "Would you like to take a quick 1-minute tour to learn the key features and how to get started?", + "helpHint": "You can always access this tour later from the Help button in the bottom left.", + "startTour": "Start Tour", + "maybeLater": "Maybe Later", + "dontShowAgain": "Don't Show Again" + }, + "allTools": "This is the All Tools panel, where you can browse and select from all available PDF tools.", + "selectCropTool": "Let's select the Crop tool to demonstrate how to use one of the tools.", + "toolInterface": "This is the Crop tool interface. As you can see, there's not much there because we haven't added any PDF files to work with yet.", + "filesButton": "The Files button on the Quick Access bar allows you to upload PDFs to use the tools on.", + "fileSources": "You can upload new files or access recent files from here. For the tour, we'll just use a sample file.", + "workbench": "This is the Workbench - the main area where you view and edit your PDFs.", + "viewSwitcher": "Use these controls to select how you want to view your PDFs.", + "viewer": "The Viewer lets you read and annotate your PDFs.", + "pageEditor": "The Page Editor allows you to do various operations on the pages within your PDFs, such as reordering, rotating and deleting.", + "activeFiles": "The Active Files view shows all of the PDFs you have loaded into the tool, and allows you to select which ones to process.", + "fileCheckbox": "Clicking one of the files selects it for processing. You can select multiple files for batch operations.", + "selectControls": "The Right Rail contains buttons to quickly select/deselect all of your active PDFs, along with buttons to change the app's theme or language.", + "cropSettings": "Now that we've selected the file we want crop, we can configure the Crop tool to choose the area that we want to crop the PDF to.", + "runButton": "Once the tool has been configured, this button allows you to run the tool on all the selected PDFs.", + "results": "After the tool has finished running, the Review step will show a preview of the results in this panel, and allow you to undo the operation or download the file. ", + "fileReplacement": "The modified file will replace the original file in the Workbench automatically, allowing you to easily run it through more tools.", + "pinButton": "You can use the Pin button if you'd rather your files stay active after running tools on them.", + "wrapUp": "You're all set! You've learnt about the main areas of the app and how to use them. Click the Help button whenever you like to see this tour again.", + "previous": "Previous", + "next": "Next", + "finish": "Finish", + "startTour": "Start Tour", + "startTourDescription": "Take a guided tour of Stirling PDF's key features" + }, + "workspace": { + "title": "Workspace", + "people": { + "title": "People", + "description": "Manage workspace members and their permissions", + "loading": "Loading people...", + "searchMembers": "Search members...", + "addMembers": "Add Members", + "inviteMembers": { + "label": "Invite Members", + "subtitle": "Type or paste in emails below, separated by commas. Your workspace will be billed by members." }, - "basic": { - "bullet1": "PÃĄginas individuales: 1,3,5", - "bullet2": "Rangos de pÃĄginas: 3-6 o 10-15", - "bullet3": "Todas las pÃĄginas: all", - "text": "Seleccione pÃĄginas específicas de su documento PDF utilizando sintaxis simple.", - "title": "Uso BÃĄsico" + "user": "User", + "role": "Role", + "team": "Team", + "status": "Status", + "actions": "Actions", + "noMembersFound": "No members found", + "active": "Active", + "disabled": "Disabled", + "activeSession": "Active session", + "member": "Member", + "admin": "Admin", + "roleDescriptions": { + "admin": "Can manage settings and invite members, with full administrative access.", + "member": "Can view and edit shared files, but cannot manage workspace settings or members." }, - "examples": { - "title": "Ejemplos" + "editRole": "Edit Role", + "enable": "Enable", + "disable": "Disable", + "deleteUser": "Delete User", + "deleteUserSuccess": "User deleted successfully", + "deleteUserError": "Failed to delete user", + "confirmDelete": "Are you sure you want to delete this user? This action cannot be undone.", + "addMember": { + "title": "Add Member", + "username": "Username (Email)", + "usernamePlaceholder": "user@example.com", + "password": "Password", + "passwordPlaceholder": "Enter password", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "forcePasswordChange": "Force password change on first login", + "cancel": "Cancel", + "submit": "Add Member", + "usernameRequired": "Username and password are required", + "passwordTooShort": "Password must be at least 6 characters", + "success": "User created successfully", + "error": "Failed to create user" }, - "header": { - "title": "Guía de SelecciÃŗn de PÃĄginas" + "editMember": { + "title": "Edit Member", + "editing": "Editing:", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "cancel": "Cancel", + "submit": "Update Member", + "success": "User updated successfully", + "error": "Failed to update user" }, - "operators": { - "and": "Y: & o \"and\" — requiere ambas condiciones (por ejemplo, 1-50 & even)", - "comma": "Coma: , o | — combina selecciones (por ejemplo, 1-10, 20)", - "not": "NO: ! o \"not\" — excluye pÃĄginas (por ejemplo, 3n & not 30)", - "text": "Y tiene mayor precedencia que la coma. NO se aplica dentro del rango del documento.", - "title": "Operadores" + "toggleEnabled": { + "success": "User status updated successfully", + "error": "Failed to update user status" }, - "syntax": { - "bullets": { - "keywords": "Palabras clave: odd, even", - "numbers": "NÃēmeros/rangos: 5, 10-20", - "progressions": "Progresiones: 3n, 4n+1" - }, - "text": "Use nÃēmeros, rangos, palabras clave y progresiones (n comienza en 0). Se admiten parÊntesis.", - "title": "Conceptos BÃĄsicos de Sintaxis" + "delete": { + "success": "User deleted successfully", + "error": "Failed to delete user" }, - "tips": { - "bullet1": "Los nÃēmeros de pÃĄgina comienzan desde 1 (no 0)", - "bullet2": "Los espacios se eliminan automÃĄticamente", - "bullet3": "Las expresiones no vÃĄlidas se ignoran", - "text": "Tenga en cuenta estas pautas:", - "title": "Consejos" + "emailInvite": { + "tab": "Email Invite", + "description": "Type or paste in emails below, separated by commas. Users will receive login credentials via email.", + "emails": "Email Addresses", + "emailsPlaceholder": "user1@example.com, user2@example.com", + "emailsRequired": "At least one email address is required", + "submit": "Send Invites", + "success": "user(s) invited successfully", + "partialSuccess": "Some invites failed", + "allFailed": "Failed to invite users", + "error": "Failed to send invites" + }, + "directInvite": { + "tab": "Direct Create" + }, + "inviteLinkTab": { + "tab": "Invite Link" + }, + "inviteLink": { + "description": "Generate a secure link that allows the user to set their own password", + "email": "Email Address", + "emailPlaceholder": "user@example.com (optional)", + "emailDescription": "Optional - leave blank for a general invite link that can be used by anyone", + "emailRequired": "Email address is required", + "emailOptional": "Optional - leave blank for a general invite link", + "emailRequiredForSend": "Email address is required to send email notification", + "expiryHours": "Expiry Hours", + "expiryDescription": "How many hours until the link expires", + "sendEmail": "Send invite link via email", + "sendEmailDescription": "If enabled, the invite link will be sent to the specified email address", + "smtpRequired": "SMTP not configured", + "generate": "Generate Link", + "generated": "Invite Link Generated", + "copied": "Link copied to clipboard", + "success": "Invite link generated successfully", + "successWithEmail": "Invite link generated and sent via email", + "emailFailed": "Invite link generated, but email failed", + "emailFailedDetails": "Error: {0}. Please share the invite link manually.", + "error": "Failed to generate invite link", + "submit": "Generate Invite Link" + }, + "inviteMode": { + "username": "Username", + "email": "Email", + "link": "Link", + "emailDisabled": "Email invites require SMTP configuration and mail.enableInvites=true in settings" + }, + "license": { + "users": "users", + "availableSlots": "Available Slots", + "grandfathered": "Grandfathered", + "grandfatheredShort": "{{count}} grandfathered", + "fromLicense": "from license", + "slotsAvailable": "{{count}} user slot(s) available", + "noSlotsAvailable": "No slots available", + "currentUsage": "Currently using {{current}} of {{max}} user licences" + } + }, + "teams": { + "title": "Teams", + "description": "Manage teams and organize workspace members", + "loading": "Loading teams...", + "loadingDetails": "Loading team details...", + "createNewTeam": "Create New Team", + "teamName": "Team Name", + "totalMembers": "Total Members", + "actions": "Actions", + "noTeamsFound": "No teams found", + "noMembers": "No members in this team", + "system": "System", + "addMember": "Add Member", + "viewTeam": "View Team", + "removeMember": "Remove from team", + "cannotRemoveFromSystemTeam": "Cannot remove from system team", + "renameTeamLabel": "Rename Team", + "deleteTeamLabel": "Delete Team", + "cannotDeleteInternal": "Cannot delete the Internal team", + "confirmDelete": "Are you sure you want to delete this team? This team must be empty to delete.", + "confirmRemove": "Remove user from this team?", + "cannotRenameInternal": "Cannot rename the Internal team", + "cannotAddToInternal": "Cannot add members to the Internal team", + "teamNotFound": "Team not found", + "backToTeams": "Back to Teams", + "memberCount": "{{count}} members", + "removeMemberSuccess": "User removed from team", + "removeMemberError": "Failed to remove user from team", + "createTeam": { + "title": "Create New Team", + "teamName": "Team Name", + "teamNamePlaceholder": "Enter team name", + "cancel": "Cancel", + "submit": "Create Team", + "nameRequired": "Team name is required", + "success": "Team created successfully", + "error": "Failed to create team" + }, + "renameTeam": { + "title": "Rename Team", + "renaming": "Renaming:", + "newTeamName": "New Team Name", + "newTeamNamePlaceholder": "Enter new team name", + "cancel": "Cancel", + "submit": "Rename Team", + "nameRequired": "Team name is required", + "success": "Team renamed successfully", + "error": "Failed to rename team" + }, + "deleteTeam": { + "success": "Team deleted successfully", + "error": "Failed to delete team. Make sure the team is empty.", + "teamMustBeEmpty": "Team must be empty before deletion" + }, + "addMemberToTeam": { + "title": "Add Member to Team", + "addingTo": "Adding to", + "selectUser": "Select User", + "selectUserPlaceholder": "Choose a user", + "selectUserRequired": "Please select a user", + "currentlyIn": "currently in", + "willBeMoved": "Note: This user will be moved from their current team to this team.", + "cancel": "Cancel", + "submit": "Add Member", + "userRequired": "Please select a user", + "success": "Member added to team successfully", + "error": "Failed to add member to team" + }, + "changeTeam": { + "label": "Change Team", + "title": "Change Team", + "changing": "Moving", + "selectTeam": "Select Team", + "selectTeamPlaceholder": "Choose a team", + "selectTeamRequired": "Please select a team", + "success": "Team changed successfully", + "error": "Failed to change team", + "submit": "Change Team" } } }, - "removeMetadata": { - "submit": "Eliminar Metadatos" + "plan": { + "currency": "Currency", + "popular": "Popular", + "current": "Current Plan", + "upgrade": "Upgrade", + "contact": "Contact Us", + "customPricing": "Custom", + "showComparison": "Compare All Features", + "hideComparison": "Hide Feature Comparison", + "featureComparison": "Feature Comparison", + "activePlan": { + "title": "Active Plan", + "subtitle": "Your current subscription details" + }, + "availablePlans": { + "title": "Available Plans", + "subtitle": "Choose the plan that fits your needs" + }, + "static": { + "title": "Billing Information", + "message": "Online billing is not currently configured. To upgrade your plan or manage subscriptions, please contact us directly.", + "contactSales": "Contact Sales", + "contactToUpgrade": "Contact us to upgrade or customize your plan", + "maxUsers": "Max Users", + "upTo": "Up to" + }, + "period": { + "month": "month" + }, + "free": { + "name": "Free", + "highlight1": "Limited Tool Usage Per week", + "highlight2": "Access to all tools", + "highlight3": "Community support" + }, + "pro": { + "name": "Pro", + "highlight1": "Unlimited Tool Usage", + "highlight2": "Advanced PDF tools", + "highlight3": "No watermarks" + }, + "enterprise": { + "name": "Enterprise", + "highlight1": "Custom pricing", + "highlight2": "Dedicated support", + "highlight3": "Latest features" + }, + "feature": { + "title": "Feature", + "pdfTools": "Basic PDF Tools", + "fileSize": "File Size Limit", + "automation": "Automate tool workflows", + "api": "API Access", + "priority": "Priority Support", + "customPricing": "Custom Pricing" + } }, - "replaceColor": { - "tags": "Reemplazar Color,Operaciones de pÃĄgina,Back end,lado del servidor" + "subscription": { + "status": { + "active": "Active", + "pastDue": "Past Due", + "canceled": "Canceled", + "incomplete": "Incomplete", + "trialing": "Trial", + "none": "No Subscription" + }, + "renewsOn": "Renews on {{date}}", + "cancelsOn": "Cancels on {{date}}" }, - "review": "Revisar", - "scannerImageSplit": { + "billing": { + "manageBilling": "Manage Billing", + "portal": { + "error": "Failed to open billing portal" + } + }, + "payment": { + "preparing": "Preparing your checkout...", + "upgradeTitle": "Upgrade to {{planName}}", + "success": "Payment Successful!", + "successMessage": "Your subscription has been activated successfully. You will receive a confirmation email shortly.", + "autoClose": "This window will close automatically...", + "error": "Payment Error" + }, + "firstLogin": { + "title": "First Time Login", + "welcomeTitle": "Welcome!", + "welcomeMessage": "For security reasons, you must change your password on your first login.", + "loggedInAs": "Logged in as", + "error": "Error", + "currentPassword": "Current Password", + "enterCurrentPassword": "Enter your current password", + "newPassword": "New Password", + "enterNewPassword": "Enter new password (min 8 characters)", + "confirmPassword": "Confirm New Password", + "reEnterNewPassword": "Re-enter new password", + "changePassword": "Change Password", + "allFieldsRequired": "All fields are required", + "passwordsDoNotMatch": "New passwords do not match", + "passwordTooShort": "Password must be at least 8 characters", + "passwordMustBeDifferent": "New password must be different from current password", + "passwordChangedSuccess": "Password changed successfully! Please log in again.", + "passwordChangeFailed": "Failed to change password. Please check your current password." + }, + "invite": { + "welcome": "Welcome to Stirling PDF", + "invalidToken": "Invalid invitation link", + "validationError": "Failed to validate invitation link", + "passwordRequired": "Password is required", + "passwordTooShort": "Password must be at least 6 characters", + "passwordMismatch": "Passwords do not match", + "acceptError": "Failed to create account", + "validating": "Validating invitation...", + "invalidInvitation": "Invalid Invitation", + "goToLogin": "Go to Login", + "welcomeTitle": "You've been invited!", + "welcomeSubtitle": "Complete your account setup to get started", + "accountFor": "Creating account for", + "linkExpires": "Link expires", + "email": "Email address", + "emailPlaceholder": "Enter your email address", + "emailRequired": "Email address is required", + "invalidEmail": "Invalid email address", + "choosePassword": "Choose a password", + "passwordPlaceholder": "Enter your password", + "confirmPassword": "Confirm password", + "confirmPasswordPlaceholder": "Re-enter your password", + "createAccount": "Create Account", + "creating": "Creating Account...", + "alreadyHaveAccount": "Already have an account?", + "signIn": "Sign in" + }, + "audit": { "error": { - "failed": "Se produjo un error al extraer escaneos de imÃĄgenes." + "title": "Error loading audit system" }, - "submit": "Extraer Escaneos de ImÃĄgenes", - "title": "ImÃĄgenes Extraídas", - "tooltip": { - "headsUp": "Advertencia", - "headsUpDesc": "Las fotos superpuestas o fondos muy cercanos en color a las fotos pueden reducir la precisiÃŗn; intente usar un fondo mÃĄs claro u oscuro y deje mÃĄs espacio.", - "problem1": "Fotos no detectadas → aumente la Tolerancia a 30-50", - "problem2": "Demasiadas detecciones falsas → aumente el Área Mínima a 15,000-20,000", - "problem3": "Los recortes son demasiado ajustados → aumente el TamaÃąo del Borde a 5-10", - "problem4": "Fotos inclinadas no enderezadas → reduzca el Umbral de Ángulo a ~5°", - "problem5": "Cuadros de polvo/ruido → aumente el Área Mínima de Contorno a 1000-2000", - "quickFixes": "Soluciones rÃĄpidas", - "setupTips": "Consejos de configuraciÃŗn", - "tip1": "Use un fondo plano y claro", - "tip2": "Deje un pequeÃąo espacio (≈1 cm) entre fotos", - "tip3": "Escanee a 300-600 DPI", - "tip4": "Limpie el cristal del escÃĄner", - "title": "Divisor de Fotos", - "useCase1": "Escanee pÃĄginas completas de ÃĄlbumes de una sola vez", - "useCase2": "Divida lotes de cama plana en archivos separados", - "useCase3": "Divida collages en fotos individuales", - "useCase4": "Extraiga fotos de documentos", - "whatThisDoes": "QuÊ hace esto", - "whatThisDoesDesc": "Encuentra y extrae automÃĄticamente cada foto de una pÃĄgina escaneada o imagen compuesta, sin recorte manual.", - "whenToUse": "CuÃĄndo usar" + "notAvailable": "Audit system not available", + "notAvailableMessage": "The audit system is not configured or not available.", + "disabled": "Audit logging is disabled", + "disabledMessage": "Enable audit logging in your application configuration to track system events.", + "systemStatus": { + "title": "System Status", + "status": "Audit Logging", + "enabled": "Enabled", + "disabled": "Disabled", + "level": "Audit Level", + "retention": "Retention Period", + "days": "days", + "totalEvents": "Total Events" + }, + "tabs": { + "dashboard": "Dashboard", + "events": "Audit Events", + "export": "Export" + }, + "charts": { + "title": "Audit Dashboard", + "error": "Error loading charts", + "day": "Day", + "week": "Week", + "month": "Month", + "byType": "Events by Type", + "byUser": "Events by User", + "overTime": "Events Over Time" + }, + "events": { + "title": "Audit Events", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "error": "Error loading events", + "noEvents": "No events found", + "timestamp": "Timestamp", + "type": "Type", + "user": "User", + "ipAddress": "IP Address", + "actions": "Actions", + "viewDetails": "View Details", + "eventDetails": "Event Details", + "details": "Details" + }, + "export": { + "title": "Export Audit Data", + "description": "Export audit events to CSV or JSON format. Use filters to limit the exported data.", + "format": "Export Format", + "filters": "Filters (Optional)", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "exportButton": "Export Data", + "error": "Failed to export data" } }, - "search": { - "placeholder": "Ingrese tÊrmino de bÃēsqueda...", - "title": "Buscar PDF" - }, - "sidebar": { - "toggle": "Alternar Barra Lateral" - }, - "signup": { - "accountCreatedSuccessfully": "ÂĄCuenta creada con Êxito! Ahora puede iniciar sesiÃŗn.", - "alreadyHaveAccount": "ÂŋYa tiene una cuenta? Iniciar sesiÃŗn", - "checkEmailConfirmation": "Verifique su correo electrÃŗnico para obtener un enlace de confirmaciÃŗn y completar su registro.", - "confirmPassword": "Confirmar contraseÃąa", - "confirmPasswordPlaceholder": "Confirmar contraseÃąa", - "creatingAccount": "Creando Cuenta...", - "email": "Correo electrÃŗnico", - "enterEmail": "Ingrese su correo electrÃŗnico", - "enterName": "Ingrese su nombre", - "enterPassword": "Ingrese su contraseÃąa", - "invalidEmail": "Por favor, ingrese una direcciÃŗn de correo electrÃŗnico vÃĄlida", - "name": "Nombre", - "or": "o", - "password": "ContraseÃąa", - "passwordTooShort": "La contraseÃąa debe tener al menos 6 caracteres", - "passwordsDoNotMatch": "Las contraseÃąas no coinciden", - "pleaseFillAllFields": "Por favor, complete todos los campos", - "signUp": "Registrarse", - "subtitle": "Únase a Stirling PDF para comenzar", - "title": "Crear una cuenta", - "unexpectedError": "Error inesperado: {{message}}" - }, - "storage": { - "approximateSize": "TamaÃąo aproximado", - "fileTooLarge": "Archivo demasiado grande. El tamaÃąo mÃĄximo por archivo es", - "storageFull": "El almacenamiento estÃĄ casi lleno. Considere eliminar algunos archivos.", - "storageLimit": "Límite de almacenamiento", - "storageQuotaExceeded": "Cuota de almacenamiento excedida. Por favor, elimine algunos archivos antes de cargar mÃĄs.", - "storageUsed": "Almacenamiento temporal utilizado", - "temporaryNotice": "Los archivos se almacenan temporalmente en su navegador y pueden eliminarse automÃĄticamente" - }, - "swagger": { - "desc": "Ver y probar los endpoints de la API de Stirling PDF", - "header": "DocumentaciÃŗn de API", - "tags": "api,documentaciÃŗn,swagger,endpoints,desarrollo", - "title": "DocumentaciÃŗn de API" - }, - "termsAndConditions": "TÊrminos y Condiciones", - "theme": { - "toggle": "Alternar Tema" - }, - "toolPicker": { - "allTools": "TODAS LAS HERRAMIENTAS", - "categories": { - "advancedTools": "Herramientas Avanzadas", - "recommendedTools": "Herramientas Recomendadas", - "standardTools": "Herramientas EstÃĄndar" + "usage": { + "noData": "No data available", + "error": "Error loading usage statistics", + "noDataMessage": "No usage statistics are currently available.", + "controls": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All", + "refresh": "Refresh", + "dataTypeLabel": "Data Type:", + "dataType": { + "all": "All", + "api": "API", + "ui": "UI" + } }, - "noToolsFound": "No se encontraron herramientas", - "quickAccess": "ACCESO RÁPIDO", - "searchPlaceholder": "Buscar herramientas...", - "subcategories": { - "advancedFormatting": "Formato Avanzado", - "automation": "AutomatizaciÃŗn", - "developerTools": "Herramientas de Desarrollo", - "documentReview": "RevisiÃŗn de Documentos", - "documentSecurity": "Seguridad de Documentos", - "extraction": "ExtracciÃŗn", - "general": "General", - "pageFormatting": "Formato de PÃĄgina", - "removal": "EliminaciÃŗn", - "signing": "Firma", - "verification": "VerificaciÃŗn" + "showing": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All" + }, + "stats": { + "totalEndpoints": "Total Endpoints", + "totalVisits": "Total Visits", + "showing": "Showing", + "selectedVisits": "Selected Visits" + }, + "chart": { + "title": "Endpoint Usage Chart" + }, + "table": { + "title": "Detailed Statistics", + "endpoint": "Endpoint", + "visits": "Visits", + "percentage": "Percentage", + "noData": "No data available" } }, - "undoOperationTooltip": "Haga clic para deshacer la Ãēltima operaciÃŗn y restaurar los archivos originales", - "unsavedChanges": "Tiene cambios sin guardar en su PDF. ÂŋQuÊ le gustaría hacer?", - "unsavedChangesTitle": "Cambios sin Guardar", - "view": { - "fileManager": "Gestor de Archivos", - "pageEditor": "Editor de PÃĄginas", - "viewer": "Visor" + "backendHealth": { + "checking": "Checking backend status...", + "online": "Backend Online", + "offline": "Backend Offline" }, - "viewer": { - "dualPageView": "Vista de PÃĄgina Doble", - "firstPage": "Primera PÃĄgina", - "lastPage": "Última PÃĄgina", - "nextPage": "PÃĄgina Siguiente", - "previousPage": "PÃĄgina Anterior", - "singlePageView": "Vista de PÃĄgina Única", - "zoomIn": "Acercar", - "zoomOut": "Alejar" + "WorkInProgress": "Tarea en progreso, puede no funcionar o ralentizarse; ÂĄpor favor, informe de cualquier problema!", + "autoRedact": { + "tags": "Redactar,Ocultar,ocultar,negro,subrayador,oculto", + "title": "Auto Censurar Texto", + "header": "Auto Censurar Texto", + "colorLabel": "Color", + "textsToRedactLabel": "Texto para Censurar (separado por líneas)", + "textsToRedactPlaceholder": "por ej. \\nConfidencial \\nAlto-Secreto", + "useRegexLabel": "Usar Regex", + "wholeWordSearchLabel": "BÃēsqueda por palabra completa", + "customPaddingLabel": "Espaciado adicional personalizado", + "convertPDFToImageLabel": "Convertir PDF a imagen PDF (Utilizado para eliminar el texto detrÃĄs del cajetín de censura)", + "submitButton": "Enviar" }, - "warning": { - "tooltipTitle": "Advertencia" + "replaceColorPdf": { + "tags": "Reemplazar Color,Operaciones de PÃĄgina,Back end,Backend" } -} \ No newline at end of file +} diff --git a/frontend/public/locales/eu-ES/translation.json b/frontend/public/locales/eu-ES/translation.json index 2a2264977..61f942ed5 100644 --- a/frontend/public/locales/eu-ES/translation.json +++ b/frontend/public/locales/eu-ES/translation.json @@ -1,4 +1,40 @@ { + "toolPanel": { + "modePrompt": { + "title": "Choose how you browse tools", + "description": "Preview both layouts and decide how you want to explore Stirling PDF tools.", + "sidebarTitle": "Sidebar mode", + "sidebarDescription": "Keep tools alongside your workspace for quick switching.", + "recommended": "Recommended", + "chooseSidebar": "Use sidebar mode", + "fullscreenTitle": "Fullscreen mode - (legacy)", + "fullscreenDescription": "Browse every tool in a catalogue that covers the workspace until you pick one.", + "chooseFullscreen": "Use fullscreen mode", + "dismiss": "Maybe later" + }, + "fullscreen": { + "showDetails": "Show Details", + "comingSoon": "Coming soon:", + "favorite": "Add to favourites", + "favorites": "Favourites", + "heading": "All tools (fullscreen view)", + "noResults": "Try adjusting your search or toggle descriptions to find what you need.", + "recommended": "Recommended", + "unfavorite": "Remove from favourites" + }, + "placeholder": "Choose a tool to get started", + "toggle": { + "fullscreen": "Switch to fullscreen mode", + "sidebar": "Switch to sidebar mode" + } + }, + "unsavedChanges": "You have unsaved changes to your PDF.", + "areYouSure": "Are you sure you want to leave?", + "unsavedChangesTitle": "Unsaved Changes", + "keepWorking": "Keep Working", + "discardChanges": "Discard & Leave", + "applyAndContinue": "Save & Leave", + "exportAndContinue": "Export & Continue", "language": { "direction": "ltr" }, @@ -18,8 +54,26 @@ "customTextDesc": "Testu pertsonalizatua", "numberPagesDesc": "Zein orri numeratu, lehenetsita 'denak', 1-5 edo 2,5,9 etab onartzen ditu", "customNumberDesc": "Lehenetsoa {n}-ra, '{n} orria {total}-tik', 'Text-{n}', '{filename}-{n}' ere onartzen du", - "submit": "Gehitu orrialde-zenbakiak" + "submit": "Gehitu orrialde-zenbakiak", + "configuration": "Configuration", + "customize": "Customize Appearance", + "pagesAndStarting": "Pages & Starting Number", + "positionAndPages": "Position & Pages", + "error": { + "failed": "Add page numbers operation failed" + }, + "results": { + "title": "Page Number Results" + }, + "preview": "Position Selection", + "previewDisclaimer": "Preview is approximate. Final output may vary due to PDF font metrics." }, + "pageSelectionPrompt": "Custom Page Selection (Enter a comma-separated list of page numbers 1,5,6 or Functions like 2n+1) :", + "startingNumberTooltip": "The first number to display. Subsequent pages will increment from this number.", + "marginTooltip": "Distance between the page number and the edge of the page.", + "fontSizeTooltip": "Size of the page number text in points. Larger numbers create bigger text.", + "fontTypeTooltip": "Font family for the page numbers. Choose based on your document style.", + "customTextTooltip": "Optional custom format for page numbers. Use {n} as placeholder for the number. Example: \"Page {n}\" will show \"Page 1\", \"Page 2\", etc.", "pdfPrompt": "Hautatu PDFa(k)", "multiPdfPrompt": "Hautatu PDFak (2+)", "multiPdfDropPrompt": "Hautatu (edo arrastatu eta jaregin) nahi dituzun PDFak", @@ -30,15 +84,41 @@ "uploadLimitExceededPlural": "are too large. Maximum allowed size is", "processTimeWarning": "Oharra: prozesu honetarako minutu bat ere beharko da fitxategiaren tamaiaren arabera", "pageOrderPrompt": "Orrialdeen ordena (sartu komaz bereizitako orrialde-zenbakien zerrenda)", - "pageSelectionPrompt": "Custom Page Selection (Enter a comma-separated list of page numbers 1,5,6 or Functions like 2n+1) :", "goToPage": "Joan", "true": "Egiazkoa", "false": "Faltsua", "unknown": "Ezezaguna", + "app": { + "description": "The Free Adobe Acrobat alternative (10M+ Downloads)" + }, "save": "Gorde", "saveToBrowser": "Save to Browser", + "download": "Distira", + "pin": "Pin File (keep active after tool run)", + "unpin": "Unpin File (replace after tool run)", + "undoOperationTooltip": "Click to undo the last operation and restore the original files", + "undo": "Undo", + "moreOptions": "More Options", + "editYourNewFiles": "Edit your new file(s)", "close": "Itxi", + "openInViewer": "Open in Viewer", + "confirmClose": "Confirm Close", + "confirmCloseMessage": "Are you sure you want to close this file?", + "confirmCloseCancel": "Cancel", + "confirmCloseConfirm": "Close File", + "fileSelected": "Selected: {{filename}}", + "chooseFile": "Choose File", "filesSelected": "Hautatutako fitxategiak", + "files": { + "title": "Files", + "upload": "Upload", + "uploadFiles": "Upload Files", + "addFiles": "Add files", + "selectFromWorkbench": "Select files from the workbench or ", + "selectMultipleFromWorkbench": "Select at least {{count}} files from the workbench or ", + "created": "Created", + "size": "File Size" + }, "noFavourites": "Ez dira gogokoak gehitu", "downloadComplete": "Download Complete", "bored": "Itxaroten aspertuta?", @@ -56,7 +136,10 @@ }, "error": { "pdfPassword": "PDF dokumentua pasahitzarekin babestuta dago eta pasahitza ez da sartu edo okerra da", + "encryptedPdfMustRemovePassword": "This PDF is encrypted or password-protected. Please unlock it before converting to PDF/A.", + "incorrectPasswordProvided": "The PDF password is incorrect or not provided.", "_value": "Error", + "dismissAllErrors": "Dismiss All Errors", "sorry": "Sorry for the issue!", "needHelp": "Need help / Found an issue?", "contactTip": "If you're still having trouble, don't hesitate to reach out to us for help. You can submit a ticket on our GitHub page or contact us through Discord:", @@ -71,6 +154,10 @@ "githubSubmit": "GitHub - Submit a ticket", "discordSubmit": "Discord - Submit Support post" }, + "warning": { + "tooltipTitle": "Warning" + }, + "edit": "Edit", "delete": "ezabatu", "username": "Erabiltzaile izena", "password": "Pasahitza", @@ -82,6 +169,7 @@ "green": "Berdea", "blue": "Urdina", "custom": "Pertsonalizatu...", + "comingSoon": "Coming soon", "WorkInProgess": "Work in progress, May not work or be buggy, Please report any problems!", "poweredBy": "Powered by", "yes": "Yes", @@ -115,12 +203,14 @@ "page": "Page", "pages": "Pages", "loading": "Loading...", + "review": "Review", "addToDoc": "Add to Document", "reset": "Reset", "apply": "Apply", "noFileSelected": "No file selected. Please upload one.", "legal": { "privacy": "Privacy Policy", + "iAgreeToThe": "I agree to all of the", "terms": "Terms and Conditions", "accessibility": "Accessibility", "cookie": "Cookie Policy", @@ -160,6 +250,7 @@ "title": "Do you want make Stirling PDF better?", "paragraph1": "Stirling PDF has opt in analytics to help us improve the product. We do not track any personal information or file contents.", "paragraph2": "Please consider enabling analytics to help Stirling-PDF grow and to allow us to understand our users better.", + "learnMore": "Learn more", "enable": "Enable analytics", "disable": "Disable analytics", "settings": "You can change the settings for analytics in the config/settings.yml file" @@ -203,6 +294,54 @@ "cacheInputs": { "name": "Save form inputs", "help": "Enable to store previously used inputs for future runs" + }, + "general": { + "title": "General", + "description": "Configure general application preferences.", + "account": "Account", + "accountDescription": "Manage your account settings", + "user": "User", + "signedInAs": "Signed in as", + "logout": "Log out", + "enableFeatures": { + "title": "For System Administrators", + "intro": "Enable user authentication, team management, and workspace features for your organization.", + "action": "Configure", + "and": "and", + "benefit": "Enables user roles, team collaboration, admin controls, and enterprise features.", + "learnMore": "Learn more in documentation", + "dismiss": "Dismiss" + }, + "autoUnzip": "Auto-unzip API responses", + "autoUnzipDescription": "Automatically extract files from ZIP responses", + "autoUnzipTooltip": "Automatically extract ZIP files returned from API operations. Disable to keep ZIP files intact. This does not affect automation workflows.", + "autoUnzipFileLimit": "Auto-unzip file limit", + "autoUnzipFileLimitDescription": "Maximum number of files to extract from ZIP", + "autoUnzipFileLimitTooltip": "Only unzip if the ZIP contains this many files or fewer. Set higher to extract larger ZIPs.", + "defaultToolPickerMode": "Default tool picker mode", + "defaultToolPickerModeDescription": "Choose whether the tool picker opens in fullscreen or sidebar by default", + "mode": { + "fullscreen": "Fullscreen", + "sidebar": "Sidebar" + } + }, + "hotkeys": { + "title": "Keyboard Shortcuts", + "description": "Hover a tool to see its shortcut or customise it below. Click \"Change shortcut\" and press a new key combination. Press Esc to cancel.", + "errorModifier": { + "mac": "Include ⌘ (Command), âŒĨ (Option), or another modifier in your shortcut.", + "windows": "Include Ctrl, Alt, or another modifier in your shortcut." + }, + "errorConflict": "Shortcut already used by {{tool}}.", + "none": "Not assigned", + "customBadge": "Custom", + "defaultLabel": "Default: {{shortcut}}", + "capturing": "Press keysâ€Ļ (Esc to cancel)", + "change": "Change shortcut", + "reset": "Reset", + "shortcut": "Shortcut", + "noShortcut": "No shortcut set", + "searchPlaceholder": "Search tools..." } }, "changeCreds": { @@ -274,8 +413,10 @@ "top20": "Top 20", "all": "All", "refresh": "Refresh", - "includeHomepage": "Include Homepage ('/')", - "includeLoginPage": "Include Login Page ('/login')", + "dataTypeLabel": "Data Type:", + "dataTypeAll": "All", + "dataTypeApi": "API", + "dataTypeUi": "UI", "totalEndpoints": "Total Endpoints", "totalVisits": "Total Visits", "showing": "Showing", @@ -290,7 +431,9 @@ "top": "Top", "numberOfVisits": "Number of Visits", "visitsTooltip": "Visits: {0} ({1}% of total)", - "retry": "Retry" + "retry": "Retry", + "includeHomepage": "Include Homepage ('/')", + "includeLoginPage": "Include Login Page ('/login')" }, "database": { "title": "Database Import/Export", @@ -331,22 +474,310 @@ "alphabetical": "Alphabetical", "globalPopularity": "Global Popularity", "sortBy": "Sort by:", + "mobile": { + "brandAlt": "Stirling PDF logo", + "openFiles": "Open files", + "swipeHint": "Swipe left or right to switch views", + "tools": "Tools", + "toolsSlide": "Tool selection panel", + "viewSwitcher": "Switch workspace view", + "workbenchSlide": "Workspace panel", + "workspace": "Workspace" + }, "multiTool": { + "tags": "multiple,tools", "title": "Erabilera anitzeko tresna PDF", "desc": "Orriak konbinatu, biratu, berrantolatu eta ezabatu" }, "merge": { + "tags": "combine,join,unite", "title": "Elkartu", "desc": "Elkartu zenbait PDF dokumentu bakar batean modu errazean" }, "split": { + "tags": "divide,separate,break", "title": "Zatitu", "desc": "Zatitu PDFak zenbait dokumentutan" }, "rotate": { + "tags": "turn,flip,orient", "title": "Biratu", "desc": "Biratu PDFak modu errazean" }, + "convert": { + "tags": "transform,change", + "title": "Bihurtu", + "desc": "Convert files between different formats" + }, + "pdfOrganiser": { + "tags": "organize,rearrange,reorder", + "title": "Antolatzailea", + "desc": "Ezabatu/Berrantolatu orrialdeak edozein ordenatan" + }, + "addImage": { + "tags": "insert,embed,place", + "title": "Gehitu irudia PDFari", + "desc": "Gehitu irudi bat PDFan ezarritako kokaleku batean (lanean)" + }, + "addAttachments": { + "tags": "embed,attach,include", + "title": "Add Attachments", + "desc": "Add or remove embedded files (attachments) to/from a PDF" + }, + "watermark": { + "tags": "stamp,mark,overlay", + "title": "Gehitu ur-marka", + "desc": "Gehitu aurrez zehaztutako ur-marka bat PFD dokumentuari" + }, + "removePassword": { + "tags": "unlock", + "title": "Ezabatu pasahitza", + "desc": "Ezabatu pasahitza PDF dokumentutik" + }, + "compress": { + "tags": "shrink,reduce,optimize", + "title": "Konprimatu", + "desc": "Konprimatu PDFak fitxategiaren tamaina murrizteko" + }, + "unlockPDFForms": { + "tags": "unlock,enable,edit", + "title": "Unlock PDF Forms", + "desc": "Remove read-only property of form fields in a PDF document." + }, + "changeMetadata": { + "tags": "edit,modify,update", + "title": "Aldatu metadatuak", + "desc": "Aldatu/Ezabatu/Gehitu metadatuak PDF dokumentuari" + }, + "ocr": { + "tags": "extract,scan", + "title": "OCR exekutatu PDFan eta/edo garbiketa-eskaneatzeak", + "desc": "Garbiketa-eskaneatzeak eta irudi-testuak detektatu PDF baten barruan eta berriz ere gehitu testu gisa" + }, + "extractImages": { + "tags": "pull,save,export", + "title": "Atera irudiak", + "desc": "Atera irudi guztiak PDF batetik eta ZIPen gorde" + }, + "scannerImageSplit": { + "tags": "detect,split,photos", + "title": "Detect & Split Scanned Photos", + "desc": "Detect and split scanned photos into separate pages" + }, + "sign": { + "tags": "signature,autograph", + "title": "Sinatu", + "desc": "Gehitu sinadura PDFari marrazki, testu edo irudi bidez" + }, + "flatten": { + "tags": "simplify,remove,interactive", + "title": "Lautu", + "desc": "PDF batetik elementu eta inprimaki interaktibo guztiak ezabatu" + }, + "certSign": { + "tags": "authenticate,PEM,P12,official,encrypt,sign,certificate,PKCS12,JKS,server,manual,auto", + "title": "Sinatu ziurtagiriarekin", + "desc": "Sinatu PDF bat Ziurtagiri/Gako batekin (PEM/P12)" + }, + "repair": { + "tags": "fix,restore", + "title": "Konpondu", + "desc": "Saiatu PDF hondatu/kaltetu bat konpontzen" + }, + "removeBlanks": { + "tags": "delete,clean,empty", + "title": "Ezabatu orrialde zuriak", + "desc": "Detektatu orrialde zuriak eta dokumentutik ezabatu" + }, + "removeAnnotations": { + "tags": "delete,clean,strip", + "title": "Remove Annotations", + "desc": "Removes all comments/annotations from a PDF" + }, + "compare": { + "tags": "difference", + "title": "Konparatu", + "desc": "Konparatu eta erakutsi 2 PDF dokumenturen aldeak" + }, + "removeCertSign": { + "tags": "remove,delete,unlock", + "title": "Remove Certificate Sign", + "desc": "Remove certificate signature from PDF" + }, + "pageLayout": { + "tags": "layout,arrange,combine", + "title": "Zenbait orrialderen diseinua", + "desc": "Elkartu orri bakar batean PDF dokumentu baten zenbait orrialde" + }, + "bookletImposition": { + "tags": "booklet,print,binding", + "title": "Booklet Imposition", + "desc": "Create booklets with proper page ordering and multi-page layout for printing and binding" + }, + "scalePages": { + "tags": "resize,adjust,scale", + "title": "Eskalatu/Doitu orrialdearen tamaina", + "desc": "Eskalatu/Aldatu orrialde baten tamaina eta/edo edukia" + }, + "addPageNumbers": { + "tags": "number,pagination,count", + "title": "Gehitu orrialde-zenbakiak", + "desc": "Gehitu orrialde-zenbakiak dokumentu batean, kokapen jakin batean" + }, + "autoRename": { + "tags": "auto-detect,header-based,organize,relabel", + "title": "Auto Rename PDF File", + "desc": "Auto renames a PDF file based on its detected header" + }, + "adjustContrast": { + "tags": "contrast,brightness,saturation", + "title": "Koloreak/kontrastea doitu", + "desc": "PDF baten kontrastea, saturazioa eta distira doitzea" + }, + "crop": { + "tags": "trim,cut,resize", + "title": "Moztu PDF", + "desc": "Egin klik PDFn tamaina txikitzeko (textua mantentzen du!)" + }, + "autoSplitPDF": { + "tags": "auto,split,QR", + "title": "Orriak automatikoki banandu", + "desc": "Auto Split Scanned PDF with physical scanned page splitter QR Code" + }, + "sanitize": { + "tags": "clean,purge,remove", + "title": "Sanitise", + "desc": "Remove potentially harmful elements from PDF files" + }, + "getPdfInfo": { + "tags": "info,metadata,details", + "title": "Lortu informazio guztia PDF-tik", + "desc": "Eskuratu PDF fitxategiko Informazio guztia" + }, + "pdfToSinglePage": { + "tags": "combine,merge,single", + "title": "PDF fitxategia, orrialde handi bakar batera", + "desc": "PDF orri guztiak orri handi bakar batean konbinatzen ditu" + }, + "showJS": { + "tags": "javascript,code,script", + "title": "Javascript erakutsi", + "desc": "Bilatu eta erakutsi PDF batean injektatutako edozein JS" + }, + "redact": { + "tags": "censor,blackout,hide", + "title": "Manual Redaction", + "desc": "Redacts a PDF based on selected text, drawn shapes and/or selected page(s)" + }, + "splitBySections": { + "tags": "split,sections,divide", + "title": "Split PDF by Sections", + "desc": "Divide each page of a PDF into smaller horizontal and vertical sections" + }, + "addStamp": { + "tags": "stamp,mark,seal", + "title": "Add Stamp to PDF", + "desc": "Add text or add image stamps at set locations" + }, + "removeImage": { + "tags": "remove,delete,clean", + "title": "Remove image", + "desc": "Remove image from PDF to reduce file size" + }, + "splitByChapters": { + "tags": "split,chapters,structure", + "title": "Split PDF by Chapters", + "desc": "Split a PDF into multiple files based on its chapter structure." + }, + "validateSignature": { + "tags": "validate,verify,certificate", + "title": "Validate PDF Signature", + "desc": "Verify digital signatures and certificates in PDF documents" + }, + "swagger": { + "tags": "API,documentation,test", + "title": "API Documentation", + "desc": "View API documentation and test endpoints" + }, + "scannerEffect": { + "tags": "scan,simulate,create", + "title": "Scanner Effect", + "desc": "Create a PDF that looks like it was scanned" + }, + "editTableOfContents": { + "tags": "bookmarks,contents,edit", + "title": "Edit Table of Contents", + "desc": "Add or edit bookmarks and table of contents in PDF documents" + }, + "manageCertificates": { + "tags": "certificates,import,export", + "title": "Manage Certificates", + "desc": "Import, export, or delete digital certificate files used for signing PDFs." + }, + "read": { + "tags": "view,open,display", + "title": "Read", + "desc": "View and annotate PDFs. Highlight text, draw, or insert comments for review and collaboration." + }, + "reorganizePages": { + "tags": "rearrange,reorder,organize", + "title": "Reorganize Pages", + "desc": "Rearrange, duplicate, or delete PDF pages with visual drag-and-drop control." + }, + "extractPages": { + "tags": "pull,select,copy", + "title": "Atera orriak", + "desc": "Extract specific pages from a PDF document" + }, + "removePages": { + "tags": "delete,extract,exclude", + "title": "Ezabatu", + "desc": "Ezabatu nahi ez dituzun orrialdeak PDF dokumentutik" + }, + "autoSizeSplitPDF": { + "tags": "auto,split,size", + "title": "Auto Split by Size/Count", + "desc": "Split a single PDF into multiple documents based on size, page count, or document count" + }, + "replaceColor": { + "title": "Replace & Invert Colour", + "desc": "Replace or invert colours in PDF documents" + }, + "devApi": { + "tags": "API,development,documentation", + "title": "API", + "desc": "Link to API documentation" + }, + "devFolderScanning": { + "tags": "automation,folder,scanning", + "title": "Automated Folder Scanning", + "desc": "Link to automated folder scanning guide" + }, + "devSsoGuide": { + "title": "SSO Guide", + "desc": "Link to SSO guide" + }, + "devAirgapped": { + "title": "Air-gapped Setup", + "desc": "Link to air-gapped setup guide" + }, + "addPassword": { + "title": "Gehitu pasahitza", + "desc": "Enkriptatu PDF dokumentua pasahitz batekin" + }, + "changePermissions": { + "title": "Aldatu baimenak", + "desc": "Change document restrictions and permissions" + }, + "automate": { + "tags": "workflow,sequence,automation", + "title": "Automate", + "desc": "Build multi-step workflows by chaining together PDF actions. Ideal for recurring tasks." + }, + "overlay-pdfs": { + "desc": "Overlays PDFs on-top of another PDF", + "title": "Overlay PDFs" + }, "imageToPDF": { "title": "Irudia PDF bihurtu", "desc": "Irudi bat(PNG, JPEG, GIF)PDF bihurtu" @@ -355,18 +786,6 @@ "title": "PDFa irudi bihurtu", "desc": "PDF bat irudi (PNG, JPEG, GIF) bihurtu" }, - "pdfOrganiser": { - "title": "Antolatzailea", - "desc": "Ezabatu/Berrantolatu orrialdeak edozein ordenatan" - }, - "addImage": { - "title": "Gehitu irudia PDFari", - "desc": "Gehitu irudi bat PDFan ezarritako kokaleku batean (lanean)" - }, - "watermark": { - "title": "Gehitu ur-marka", - "desc": "Gehitu aurrez zehaztutako ur-marka bat PFD dokumentuari" - }, "permissions": { "title": "Aldatu baimenak", "desc": "Aldatu PDF dokumentuaren baimenak" @@ -375,38 +794,10 @@ "title": "Ezabatu", "desc": "Ezabatu nahi ez dituzun orrialdeak PDF dokumentutik" }, - "addPassword": { - "title": "Gehitu pasahitza", - "desc": "Enkriptatu PDF dokumentua pasahitz batekin" - }, - "removePassword": { - "title": "Ezabatu pasahitza", - "desc": "Ezabatu pasahitza PDF dokumentutik" - }, - "compress": { - "title": "Konprimatu", - "desc": "Konprimatu PDFak fitxategiaren tamaina murrizteko" - }, - "unlockPDFForms": { - "title": "Unlock PDF Forms", - "desc": "Remove read-only property of form fields in a PDF document." - }, - "changeMetadata": { - "title": "Aldatu metadatuak", - "desc": "Aldatu/Ezabatu/Gehitu metadatuak PDF dokumentuari" - }, "fileToPDF": { "title": "Fitxategia PDF bihurtu", "desc": "PDF bihurtu ia edozein fitxategi (DOCX, PNG, XLS, PPT, TXT eta gehiago)" }, - "ocr": { - "title": "OCR exekutatu PDFan eta/edo garbiketa-eskaneatzeak", - "desc": "Garbiketa-eskaneatzeak eta irudi-testuak detektatu PDF baten barruan eta berriz ere gehitu testu gisa" - }, - "extractImages": { - "title": "Atera irudiak", - "desc": "Atera irudi guztiak PDF batetik eta ZIPen gorde" - }, "pdfToPDFA": { "title": "PDFa PDF/A bihurtu", "desc": "PDFa PDF/A bihurtu luzaro biltegiratzeko" @@ -435,70 +826,14 @@ "title": "Detektatu/Zatitu argazki eskaneatuak", "desc": "Hainbat argazki zatitu argazki/PDF baten barruan" }, - "sign": { - "title": "Sinatu", - "desc": "Gehitu sinadura PDFari marrazki, testu edo irudi bidez" - }, - "flatten": { - "title": "Lautu", - "desc": "PDF batetik elementu eta inprimaki interaktibo guztiak ezabatu" - }, - "repair": { - "title": "Konpondu", - "desc": "Saiatu PDF hondatu/kaltetu bat konpontzen" - }, - "removeBlanks": { - "title": "Ezabatu orrialde zuriak", - "desc": "Detektatu orrialde zuriak eta dokumentutik ezabatu" - }, - "removeAnnotations": { - "title": "Remove Annotations", - "desc": "Removes all comments/annotations from a PDF" - }, - "compare": { - "title": "Konparatu", - "desc": "Konparatu eta erakutsi 2 PDF dokumenturen aldeak" - }, - "certSign": { - "title": "Sinatu ziurtagiriarekin", - "desc": "Sinatu PDF bat Ziurtagiri/Gako batekin (PEM/P12)" - }, - "removeCertSign": { - "title": "Remove Certificate Sign", - "desc": "Remove certificate signature from PDF" - }, - "pageLayout": { - "title": "Zenbait orrialderen diseinua", - "desc": "Elkartu orri bakar batean PDF dokumentu baten zenbait orrialde" - }, - "scalePages": { - "title": "Eskalatu/Doitu orrialdearen tamaina", - "desc": "Eskalatu/Aldatu orrialde baten tamaina eta/edo edukia" - }, "pipeline": { "title": "Hodia (Aurreratua)", "desc": "Egin hainbat ekintza PDFn, hodi-script-ak definituz" }, - "addPageNumbers": { - "title": "Gehitu orrialde-zenbakiak", - "desc": "Gehitu orrialde-zenbakiak dokumentu batean, kokapen jakin batean" - }, "auto-rename": { "title": "Auto Aldatu PDF fitxategiaren izena", "desc": "Automatikoki izena ematen dio detektatutako goiburuan oinarritutako PDF fitxategi bati" }, - "adjustContrast": { - "title": "Koloreak/kontrastea doitu", - "desc": "PDF baten kontrastea, saturazioa eta distira doitzea" - }, - "crop": { - "title": "Moztu PDF", - "desc": "Egin klik PDFn tamaina txikitzeko (textua mantentzen du!)" - }, - "autoSplitPDF": { - "title": "Orriak automatikoki banandu", - "desc": "Auto Split Scanned PDF with physical scanned page splitter QR Code" - }, "sanitizePDF": { "title": "Desinfektatu", "desc": "Ezabatu script-ak eta PDF fitxategietako beste elementu batzuk" @@ -519,30 +854,14 @@ "title": "PDF to Markdown", "desc": "Converts any PDF to Markdown" }, - "getPdfInfo": { - "title": "Lortu informazio guztia PDF-tik", - "desc": "Eskuratu PDF fitxategiko Informazio guztia" - }, "pageExtracter": { "title": "Orria(k) atera", "desc": "Aukeratutako orriak PDF fitxategitik atera" }, - "pdfToSinglePage": { - "title": "PDF fitxategia, orrialde handi bakar batera", - "desc": "PDF orri guztiak orri handi bakar batean konbinatzen ditu" - }, - "showJS": { - "title": "Javascript erakutsi", - "desc": "Bilatu eta erakutsi PDF batean injektatutako edozein JS" - }, "autoRedact": { "title": "Auto Idatzi", "desc": "Auto Idatzi testua pdf fitxategian sarrerako testuan oinarritua" }, - "redact": { - "title": "Manual Redaction", - "desc": "Redacts a PDF based on selected text, drawn shapes and/or selected page(s)" - }, "PDFToCSV": { "title": "PDF to CSV", "desc": "Extracts Tables from a PDF converting it to CSV" @@ -551,10 +870,6 @@ "title": "Auto Split by Size/Count", "desc": "Split a single PDF into multiple documents based on size, page count, or document count" }, - "overlay-pdfs": { - "title": "Overlay PDFs", - "desc": "Overlays PDFs on-top of another PDF" - }, "split-by-sections": { "title": "Split PDF by Sections", "desc": "Divide each page of a PDF into smaller horizontal and vertical sections" @@ -563,42 +878,17 @@ "title": "Add Stamp to PDF", "desc": "Add text or add image stamps at set locations" }, - "removeImage": { - "title": "Remove image", - "desc": "Remove image from PDF to reduce file size" - }, - "splitByChapters": { - "title": "Split PDF by Chapters", - "desc": "Split a PDF into multiple files based on its chapter structure." - }, - "validateSignature": { - "title": "Validate PDF Signature", - "desc": "Verify digital signatures and certificates in PDF documents" - }, "replace-color": { "title": "Replace and Invert Color", "desc": "Replace color for text and background in PDF and invert full color of pdf to reduce file size" }, - "convert": { - "title": "Bihurtu" - }, "attachments": { "title": "Add attachments" }, - "extractPages": { - "title": "Atera orriak" - }, - "removePages": { - "title": "Ezabatu", - "desc": "Ezabatu nahi ez dituzun orrialdeak PDF dokumentutik" - }, "removeImagePdf": { "title": "Remove image", "desc": "Remove image from PDF to reduce file size" }, - "autoSizeSplitPDF": { - "desc": "Split a single PDF into multiple documents based on size, page count, or document count" - }, "adjust-contrast": { "title": "Koloreak/kontrastea doitu", "desc": "PDF baten kontrastea, saturazioa eta distira doitzea" @@ -606,11 +896,12 @@ "replaceColorPdf": { "title": "Replace and Invert Color", "desc": "Replace color for text and background in PDF and invert full color of pdf to reduce file size" - }, - "changePermissions": { - "title": "Aldatu baimenak" } }, + "landing": { + "addFiles": "Add Files", + "uploadFromComputer": "Upload from computer" + }, "viewPdf": { "tags": "view,read,annotate,text,image", "title": "View/Edit PDF", @@ -644,14 +935,39 @@ "merge": { "tags": "merge,Page operations,Back end,server side", "title": "Elkartu", + "removeDigitalSignature": { + "label": "Remove digital signature in the merged file?", + "tooltip": { + "title": "Remove Digital Signature", + "description": "Digital signatures will be invalidated when merging files. Check this to remove them from the final merged PDF." + } + }, + "generateTableOfContents": { + "label": "Generate table of contents in the merged file?", + "tooltip": { + "title": "Generate Table of Contents", + "description": "Automatically creates a clickable table of contents in the merged PDF based on the original file names and page numbers." + } + }, + "submit": "Elkartu", + "sortBy": { + "description": "Files will be merged in the order they're selected. Drag to reorder or sort below.", + "label": "Sort By", + "filename": "File Name", + "dateModified": "Date Modified", + "ascending": "Ascending", + "descending": "Descending", + "sort": "Sort" + }, + "error": { + "failed": "An error occurred while merging the PDFs." + }, "header": "Elkartu zenbait PDF (2+)", "sortByName": "Sort by nameOrdenatu izenaren arabera", "sortByDate": "Ordenatu dataren arabera", - "removeCertSign": "Remove digital signature in the merged file?", - "submit": "Elkartu" + "removeCertSign": "Remove digital signature in the merged file?" }, "split": { - "tags": "Page operations,divide,Multi Page,cut,server side", "title": "Zatitu PDFa", "header": "Zatitu PDFa", "desc": { @@ -667,15 +983,249 @@ "splitPages": "Sartu orrialdeak zatitzeko:", "submit": "Zatitu", "steps": { + "chooseMethod": "Choose Method", "settings": "Ezarpenak" - } + }, + "settings": { + "selectMethodFirst": "Please select a split method first" + }, + "error": { + "failed": "An error occurred while splitting the PDF." + }, + "method": { + "label": "Choose split method", + "placeholder": "Select how to split the PDF" + }, + "methods": { + "prefix": { + "splitAt": "Split at", + "splitBy": "Split by" + }, + "byPages": { + "name": "Page Numbers", + "desc": "Extract specific pages (1,3,5-10)", + "tooltip": "Enter page numbers separated by commas or ranges with hyphens" + }, + "bySections": { + "name": "Sections", + "desc": "Divide pages into grid sections", + "tooltip": "Split each page into horizontal and vertical sections" + }, + "bySize": { + "name": "File Size", + "desc": "Limit maximum file size", + "tooltip": "Specify maximum file size (e.g. 10MB, 500KB)" + }, + "byPageCount": { + "name": "Page Count", + "desc": "Fixed pages per file", + "tooltip": "Enter the number of pages for each split file" + }, + "byDocCount": { + "name": "Document Count", + "desc": "Create specific number of files", + "tooltip": "Enter how many files you want to create" + }, + "byChapters": { + "name": "Chapters", + "desc": "Split at bookmark boundaries", + "tooltip": "Uses PDF bookmarks to determine split points" + }, + "byPageDivider": { + "name": "Page Divider", + "desc": "Auto-split with divider sheets", + "tooltip": "Use QR code divider sheets between documents when scanning" + } + }, + "value": { + "fileSize": { + "label": "File Size", + "placeholder": "e.g. 10MB, 500KB" + }, + "pageCount": { + "label": "Pages per File", + "placeholder": "e.g. 5, 10" + }, + "docCount": { + "label": "Number of Files", + "placeholder": "e.g. 3, 5" + } + }, + "tooltip": { + "header": { + "title": "Split Methods Overview" + }, + "byPages": { + "title": "Split at Page Numbers", + "text": "Split your PDF at specific page numbers. Using 'n' splits after page n. Using 'n-m' splits before page n and after page m.", + "bullet1": "Single split points: 3,7 (splits after pages 3 and 7)", + "bullet2": "Range split points: 3-8 (splits before page 3 and after page 8)", + "bullet3": "Mixed: 2,5-10,15 (splits after page 2, before page 5, after page 10, and after page 15)" + }, + "bySections": { + "title": "Split by Grid Sections", + "text": "Divide each page into a grid of sections. Useful for splitting documents with multiple columns or extracting specific areas.", + "bullet1": "Horizontal: Number of rows to create", + "bullet2": "Vertical: Number of columns to create", + "bullet3": "Merge: Combine all sections into one PDF" + }, + "bySize": { + "title": "Split by File Size", + "text": "Create multiple PDFs that don't exceed a specified file size. Ideal for file size limitations or email attachments.", + "bullet1": "Use MB for larger files (e.g., 10MB)", + "bullet2": "Use KB for smaller files (e.g., 500KB)", + "bullet3": "System will split at page boundaries" + }, + "byCount": { + "title": "Split by Count", + "text": "Create multiple PDFs with a specific number of pages or documents each.", + "bullet1": "Page Count: Fixed number of pages per file", + "bullet2": "Document Count: Fixed number of output files", + "bullet3": "Useful for batch processing workflows" + }, + "byChapters": { + "title": "Split by Chapters", + "text": "Use PDF bookmarks to automatically split at chapter boundaries. Requires PDFs with bookmark structure.", + "bullet1": "Bookmark Level: Which level to split on (1=top level)", + "bullet2": "Include Metadata: Preserve document properties", + "bullet3": "Allow Duplicates: Handle repeated bookmark names" + }, + "byDocCount": { + "bullet1": "Enter the number of output files you want", + "bullet2": "Pages are distributed as evenly as possible", + "bullet3": "Useful when you need a specific number of files", + "text": "Create a specific number of output files by evenly distributing pages across them.", + "title": "Split by Document Count" + }, + "byPageCount": { + "bullet1": "Enter the number of pages per output file", + "bullet2": "Last file may have fewer pages if not evenly divisible", + "bullet3": "Useful for batch processing workflows", + "text": "Create multiple PDFs with a specific number of pages each. Perfect for creating uniform document chunks.", + "title": "Split by Page Count" + }, + "byPageDivider": { + "bullet1": "Print divider sheets from the download link", + "bullet2": "Insert divider sheets between your documents", + "bullet3": "Scan all documents together as one PDF", + "bullet4": "Upload - divider pages are automatically detected and removed", + "bullet5": "Enable Duplex Mode if scanning both sides of divider sheets", + "text": "Automatically split scanned documents using physical divider sheets with QR codes. Perfect for processing multiple documents scanned together.", + "title": "Split by Page Divider" + } + }, + "methodSelection": { + "tooltip": { + "bullet1": "Click on a method card to select it", + "bullet2": "Hover over each card to see a quick description", + "bullet3": "The settings step will appear after you select a method", + "bullet4": "You can change methods at any time before processing", + "header": { + "text": "Choose how you want to split your PDF document. Each method is optimized for different use cases and document types.", + "title": "Split Method Selection" + }, + "title": "Choose Your Split Method" + } + }, + "selectMethod": "Select a split method", + "tags": "Page operations,divide,Multi Page,cut,server side" }, "rotate": { - "tags": "server side", "title": "Biratu PDFa", + "submit": "Biratu", + "selectRotation": "Select Rotation Angle (Clockwise)", + "error": { + "failed": "An error occurred while rotating the PDF." + }, + "preview": { + "title": "Rotation Preview" + }, + "rotateLeft": "Rotate Anticlockwise", + "rotateRight": "Rotate Clockwise", + "tooltip": { + "header": { + "title": "Rotate Settings Overview" + }, + "description": { + "text": "Rotate your PDF pages clockwise or anticlockwise in 90-degree increments. All pages in the PDF will be rotated. The preview shows how your document will look after rotation." + }, + "controls": { + "title": "Controls", + "text": "Use the rotation buttons to adjust orientation. Left button rotates anticlockwise, right button rotates clockwise. Each click rotates by 90 degrees." + } + }, + "tags": "server side", "header": "Biratu PDFa", - "selectAngle": "Hautatu errotazio-angelua (90 graduko multiploetan):", - "submit": "Biratu" + "selectAngle": "Hautatu errotazio-angelua (90 graduko multiploetan):" + }, + "convert": { + "title": "Bihurtu", + "desc": "Convert files between different formats", + "files": "Files", + "selectFilesPlaceholder": "Select files in the main view to get started", + "settings": "Ezarpenak", + "conversionCompleted": "Conversion completed", + "results": "Results", + "defaultFilename": "converted_file", + "conversionResults": "Conversion Results", + "convertFrom": "Convert from", + "convertTo": "Convert to", + "sourceFormatPlaceholder": "Source format", + "targetFormatPlaceholder": "Target format", + "selectSourceFormatFirst": "Select a source format first", + "outputOptions": "Output Options", + "pdfOptions": "PDF Options", + "imageOptions": "Image Options", + "colorType": "Colour Type", + "color": "Color", + "greyscale": "Gris-eskala", + "blackwhite": "Black & White", + "dpi": "DPI", + "output": "Output", + "single": "Single", + "multiple": "Multiple", + "fitOption": "Fit Option", + "maintainAspectRatio": "Maintain Aspect Ratio", + "fitDocumentToPage": "Fit Document to Page", + "fillPage": "Fill Page", + "autoRotate": "Auto Rotate", + "autoRotateDescription": "Automatically rotate images to better fit the PDF page", + "combineImages": "Combine Images", + "combineImagesDescription": "Combine all images into one PDF, or create separate PDFs for each image", + "webOptions": "Web to PDF Options", + "zoomLevel": "Zoom Level", + "emailOptions": "Email to PDF Options", + "includeAttachments": "Include email attachments", + "maxAttachmentSize": "Maximum attachment size (MB)", + "includeAllRecipients": "Include CC and BCC recipients in header", + "downloadHtml": "Download HTML intermediate file instead of PDF", + "pdfaOptions": "PDF/A Options", + "outputFormat": "Output Format", + "pdfaNote": "PDF/A-1b is more compatible, PDF/A-2b supports more features.", + "pdfaDigitalSignatureWarning": "The PDF contains a digital signature. This will be removed in the next step.", + "fileFormat": "File Format", + "wordDoc": "Word Document", + "wordDocExt": "Word Document (.docx)", + "odtExt": "OpenDocument Text (.odt)", + "pptExt": "PowerPoint (.pptx)", + "odpExt": "OpenDocument Presentation (.odp)", + "txtExt": "Plain Text (.txt)", + "rtfExt": "Rich Text Format (.rtf)", + "selectedFiles": "Selected files", + "noFileSelected": "No file selected. Use the file panel to add files.", + "convertFiles": "Convert Files", + "converting": "Converting...", + "downloadConverted": "Download Converted File", + "errorNoFiles": "Please select at least one file to convert.", + "errorNoFormat": "Please select both source and target formats.", + "errorNotSupported": "Conversion from {{from}} to {{to}} is not supported.", + "images": "Images", + "officeDocs": "Office Documents (Word, Excel, PowerPoint)", + "imagesExt": "Images (JPG, PNG, etc.)", + "markdown": "Markdown", + "textRtf": "Text/RTF", + "grayscale": "Gris-eskala", + "errorConversion": "An error occurred while converting the file." }, "imageToPdf": { "tags": "conversion,img,jpg,picture,photo,psd,photoshop" @@ -713,7 +1263,33 @@ "8": "Remove Last", "9": "Remove First and Last", "10": "Odd-Even Merge", - "11": "Duplicate all pages" + "11": "Duplicate all pages", + "desc": { + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, â€Ļ).", + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, â€Ļ).", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimized for binding on the side)." + } + }, + "desc": { + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, â€Ļ).", + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, â€Ļ).", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimised for binding on the side).", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document." }, "placeholder": "(e.g. 1,3,2 or 4-8,2,10-12 or 2n-1)" }, @@ -725,9 +1301,198 @@ "upload": "Gehitu irudia", "submit": "Gehitu irudia" }, + "attachments": { + "tags": "embed,attach,file,attachment,attachments", + "title": "Add attachments", + "header": "Add attachments", + "add": "Add Attachment", + "remove": "Remove Attachment", + "embed": "Embed Attachment", + "submit": "Add attachments" + }, "watermark": { - "tags": "Text,repeating,label,own,copyright,trademark,img,jpg,picture,photo", "title": "Gehitu ur-marka", + "desc": "Add text or image watermarks to PDF files", + "completed": "Watermark added", + "submit": "Gehitu ur-marka", + "filenamePrefix": "watermarked", + "error": { + "failed": "An error occurred while adding watermark to the PDF." + }, + "watermarkType": { + "text": "Testua", + "image": "Image" + }, + "settings": { + "type": "Watermark Type", + "text": { + "label": "Watermark Text", + "placeholder": "Enter watermark text" + }, + "image": { + "label": "Watermark Image", + "choose": "Choose Image", + "selected": "Selected: {{filename}}" + }, + "fontSize": "Font Size", + "size": "Size", + "alphabet": "Font/Language", + "color": "Watermark Colour", + "rotation": "Rotation (degrees)", + "opacity": "Opacity (%)", + "spacing": { + "horizontal": "Horizontal Spacing", + "vertical": "Vertical Spacing", + "height": "Height Spacing", + "width": "Width Spacing" + }, + "convertToImage": "Flatten PDF pages to images" + }, + "alphabet": { + "roman": "Roman/Latin", + "arabic": "Arabic", + "japanese": "Japanese", + "korean": "Korean", + "chinese": "Chinese", + "thai": "Thai" + }, + "steps": { + "type": "Watermark Type", + "wording": "Wording", + "textStyle": "Style", + "formatting": "Formatting", + "file": "Watermark File" + }, + "results": { + "title": "Watermark Results" + }, + "tooltip": { + "language": { + "title": "Language Support", + "text": "Choose the appropriate language setting to ensure proper font rendering for your text." + }, + "appearance": { + "title": "Appearance Settings", + "text": "Control how your watermark looks and blends with the document.", + "bullet1": "Rotation: -360° to 360° for angled watermarks", + "bullet2": "Opacity: 0-100% for transparency control", + "bullet3": "Lower opacity creates subtle watermarks" + }, + "spacing": { + "title": "Spacing Control", + "text": "Adjust the spacing between repeated watermarks across the page.", + "bullet1": "Width spacing: Horizontal distance between watermarks", + "bullet2": "Height spacing: Vertical distance between watermarks", + "bullet3": "Higher values create more spread out patterns" + }, + "type": { + "header": { + "title": "Watermark Type Selection" + }, + "description": { + "title": "Choose Your Watermark", + "text": "Select between text or image watermarks based on your needs." + }, + "text": { + "title": "Text Watermarks", + "text": "Perfect for adding copyright notices, company names, or confidentiality labels. Supports multiple languages and custom colours.", + "bullet1": "Customisable fonts and languages", + "bullet2": "Adjustable colours and transparency", + "bullet3": "Ideal for legal or branding text" + }, + "image": { + "title": "Image Watermarks", + "text": "Use logos, stamps, or any image as a watermark. Great for branding and visual identification.", + "bullet1": "Upload any image format", + "bullet2": "Maintains image quality", + "bullet3": "Perfect for logos and stamps" + } + }, + "wording": { + "header": { + "title": "Text Content" + }, + "text": { + "title": "Watermark Text", + "text": "Enter the text that will appear as your watermark across the document.", + "bullet1": "Keep it concise for better readability", + "bullet2": "Common examples: 'CONFIDENTIAL', 'DRAFT', company name", + "bullet3": "Emoji characters are not supported and will be filtered out" + } + }, + "textStyle": { + "header": { + "title": "Text Style" + }, + "color": { + "title": "Colour Selection", + "text": "Choose a colour that provides good contrast with your document content.", + "bullet1": "Light grey (#d3d3d3) for subtle watermarks", + "bullet2": "Black or dark colours for high contrast", + "bullet3": "Custom colours for branding purposes" + }, + "language": { + "title": "Language Support", + "text": "Choose the appropriate language setting to ensure proper font rendering." + } + }, + "file": { + "header": { + "title": "Image Upload" + }, + "upload": { + "title": "Image Selection", + "text": "Upload an image file to use as your watermark.", + "bullet1": "Supports common formats: PNG, JPG, GIF, BMP", + "bullet2": "PNG with transparency works best", + "bullet3": "Higher resolution images maintain quality better" + }, + "recommendations": { + "title": "Best Practices", + "text": "Tips for optimal image watermark results.", + "bullet1": "Use logos or stamps with transparent backgrounds", + "bullet2": "Simple designs work better than complex images", + "bullet3": "Consider the final document size when choosing resolution" + } + }, + "formatting": { + "header": { + "title": "Formatting & Layout" + }, + "size": { + "title": "Size Control", + "text": "Adjust the size of your watermark (text or image).", + "bullet1": "Larger sizes create more prominent watermarks" + }, + "appearance": { + "title": "Appearance Settings", + "text": "Control how your watermark looks and blends with the document.", + "bullet1": "Rotation: -360° to 360° for angled watermarks", + "bullet2": "Opacity: 0-100% for transparency control", + "bullet3": "Lower opacity creates subtle watermarks" + }, + "spacing": { + "title": "Spacing Control", + "text": "Adjust the spacing between repeated watermarks across the page.", + "bullet1": "Horizontal spacing: Distance between watermarks left to right", + "bullet2": "Vertical spacing: Distance between watermarks top to bottom", + "bullet3": "Higher values create more spread out patterns" + }, + "security": { + "title": "Security Option", + "text": "Convert the final PDF to an image-based format for enhanced security.", + "bullet1": "Prevents text selection and copying", + "bullet2": "Makes watermarks harder to remove", + "bullet3": "Results in larger file sizes", + "bullet4": "Best for sensitive or copyrighted content" + } + } + }, + "type": { + "1": "Text", + "2": "Image" + }, + "tags": "Text,repeating,label,own,copyright,trademark,img,jpg,picture,photo", "header": "Gehitu ur-marka", "customColor": "Custom Text Color", "selectText": { @@ -741,14 +1506,6 @@ "8": "Watermark Type:", "9": "Watermark Image:", "10": "Convert PDF to PDF-Image" - }, - "submit": "Gehitu ur-marka", - "type": { - "1": "Text", - "2": "Image" - }, - "watermarkType": { - "text": "Testua" } }, "permissions": { @@ -773,49 +1530,201 @@ "removePages": { "tags": "Remove pages,delete pages", "title": "Ezabatu", + "pageNumbers": { + "label": "Pages to Remove", + "placeholder": "e.g., 1,3,5-8,10", + "error": "Invalid page number format. Use numbers, ranges (1-5), or mathematical expressions (2n+1)" + }, + "filenamePrefix": "pages_removed", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "settings": { + "title": "Settings" + }, + "tooltip": { + "header": { + "title": "Remove Pages Settings" + }, + "pageNumbers": { + "title": "Page Selection", + "text": "Specify which pages to remove from your PDF. You can select individual pages, ranges, or use mathematical expressions.", + "bullet1": "Individual pages: 1,3,5 (removes pages 1, 3, and 5)", + "bullet2": "Page ranges: 1-5,10-15 (removes pages 1-5 and 10-15)", + "bullet3": "Mathematical: 2n+1 (removes odd pages)", + "bullet4": "Open ranges: 5- (removes from page 5 to end)" + }, + "examples": { + "title": "Common Examples", + "text": "Here are some common page selection patterns:", + "bullet1": "Remove first page: 1", + "bullet2": "Remove last 3 pages: -3", + "bullet3": "Remove every other page: 2n", + "bullet4": "Remove specific scattered pages: 1,5,10,15" + }, + "safety": { + "title": "Safety Tips", + "text": "Important considerations when removing pages:", + "bullet1": "Always preview your selection before processing", + "bullet2": "Keep a backup of your original file", + "bullet3": "Page numbers start from 1, not 0", + "bullet4": "Invalid page numbers will be ignored" + } + }, + "error": { + "failed": "An error occurred whilst removing pages." + }, + "results": { + "title": "Page Removal Results" + }, "submit": "Ezabatu" }, - "addPassword": { - "tags": "secure,security", - "title": "Gehitu pasahitza", - "header": "Gehitu pasahitza (enkriptatu)", - "selectText": { - "1": "Hautatu PDFa enkriptatzeko", - "2": "Pasahitza", - "3": "Gakoaren luzera", - "4": "Balio altuak sendoagoak dira, baina balio baxuek bateragarritasun hobea dute", - "5": "Ezartzeko baimenak", - "6": "Galarazi dokumentuaren mihiztaketa", - "7": "Galarazi edukia ateratzea", - "8": "Galarazi ateratzea irisgarritasunerako", - "9": "Galarazi inprimakia betetzea", - "10": "Galarazi aldaketak egitea", - "11": "Galarazi oharrak aldatzea", - "12": "Galarazi inprimatzea", - "13": "Galarazi zenbait formatu inprimatzea", - "14": "Pasahitza", - "15": "Mugatu zer egin daitekeen dokumentuarekin behin zabalduta (Irakurle guztiek onartu gabe)", - "16": "Mugatu dokumentu bera zabaltzeko aukera" + "extractPages": { + "title": "Extract Pages", + "pageNumbers": { + "label": "Pages to Extract", + "placeholder": "e.g., 1,3,5-8 or odd & 1-10" + }, + "settings": { + "title": "Settings" }, - "submit": "Enkriptatu", "tooltip": { - "permissions": { - "title": "Aldatu baimenak" + "description": "Extracts the selected pages into a new PDF, preserving order." + }, + "error": { + "failed": "Failed to extract pages" + }, + "results": { + "title": "Pages Extracted" + }, + "submit": "Extract Pages" + }, + "pageSelection": { + "tooltip": { + "header": { + "title": "Page Selection Guide" + }, + "basic": { + "title": "Basic Usage", + "text": "Select specific pages from your PDF document using simple syntax.", + "bullet1": "Individual pages: 1,3,5", + "bullet2": "Page ranges: 3-6 or 10-15", + "bullet3": "All pages: all" + }, + "advanced": { + "title": "Advanced Features" + }, + "tips": { + "title": "Tips", + "text": "Keep these guidelines in mind:", + "bullet1": "Page numbers start from 1 (not 0)", + "bullet2": "Spaces are automatically removed", + "bullet3": "Invalid expressions are ignored" + }, + "syntax": { + "title": "Syntax Basics", + "text": "Use numbers, ranges, keywords, and progressions (n starts at 0). Parentheses are supported.", + "bullets": { + "numbers": "Numbers/ranges: 5, 10-20", + "keywords": "Keywords: odd, even", + "progressions": "Progressions: 3n, 4n+1" + } + }, + "operators": { + "title": "Operators", + "text": "AND has higher precedence than comma. NOT applies within the document range.", + "and": "AND: & or \"and\" — require both conditions (e.g., 1-50 & even)", + "comma": "Comma: , or | — combine selections (e.g., 1-10, 20)", + "not": "NOT: ! or \"not\" — exclude pages (e.g., 3n & not 30)" + }, + "examples": { + "title": "Examples" + }, + "complex": { + "bullet1": "1,3-5,8,2n → pages 1, 3–5, 8, plus evens", + "bullet2": "10-,2n-1 → from page 10 to end + odd pages", + "description": "Mix different types.", + "title": "Complex Combinations" + }, + "description": "Choose which pages to use for the operation. Supports single pages, ranges, formulas, and the all keyword.", + "individual": { + "bullet1": "1,3,5 → selects pages 1, 3, 5", + "bullet2": "2,7,12 → selects pages 2, 7, 12", + "description": "Enter numbers separated by commas.", + "title": "Individual Pages" + }, + "mathematical": { + "bullet1": "2n → all even pages (2, 4, 6â€Ļ)", + "bullet2": "2n-1 → all odd pages (1, 3, 5â€Ļ)", + "bullet3": "3n → every 3rd page (3, 6, 9â€Ļ)", + "bullet4": "4n-1 → pages 3, 7, 11, 15â€Ļ", + "description": "Use n in formulas for patterns.", + "title": "Mathematical Functions" + }, + "ranges": { + "bullet1": "3-6 → selects pages 3–6", + "bullet2": "10-15 → selects pages 10–15", + "bullet3": "5- → selects pages 5 to end", + "description": "Use - for consecutive pages.", + "title": "Page Ranges" + }, + "special": { + "bullet1": "all → selects all pages", + "title": "Special Keywords" } } }, - "removePassword": { - "tags": "secure,Decrypt,security,unpassword,delete password", - "title": "Ezabatu pasahitza", - "header": "Ezabatu pasahitza (desenkriptatu)", - "selectText": { - "1": "Hautatu PDFa desenkriptatzeko", - "2": "Pasahitza" + "bulkSelection": { + "syntaxError": "There is a syntax issue. See Page Selection tips for help.", + "header": { + "title": "Page Selection Guide" }, - "submit": "Ezabatu", - "desc": "Ezabatu pasahitza PDF dokumentutik", - "password": { - "stepTitle": "Ezabatu pasahitza" + "syntax": { + "title": "Syntax Basics", + "text": "Use numbers, ranges, keywords, and progressions (n starts at 0). Parentheses are supported.", + "bullets": { + "numbers": "Numbers/ranges: 5, 10-20", + "keywords": "Keywords: odd, even", + "progressions": "Progressions: 3n, 4n+1" + } + }, + "operators": { + "title": "Operators", + "text": "AND has higher precedence than comma. NOT applies within the document range.", + "and": "AND: & or \"and\" — require both conditions (e.g., 1-50 & even)", + "comma": "Comma: , or | — combine selections (e.g., 1-10, 20)", + "not": "NOT: ! or \"not\" — exclude pages (e.g., 3n & not 30)" + }, + "examples": { + "title": "Examples", + "first50": "First 50", + "last50": "Last 50", + "every3rd": "Every 3rd", + "oddWithinExcluding": "Odd within 1-20 excluding 5-7", + "combineSets": "Combine sets" + }, + "firstNPages": { + "title": "First N Pages", + "placeholder": "Number of pages" + }, + "lastNPages": { + "title": "Last N Pages", + "placeholder": "Number of pages" + }, + "everyNthPage": { + "title": "Every Nth Page", + "placeholder": "Step size" + }, + "range": { + "title": "Range", + "fromPlaceholder": "From", + "toPlaceholder": "To" + }, + "keywords": { + "title": "Keywords" + }, + "advanced": { + "title": "Advanced" } }, "compressPdfs": { @@ -825,12 +1734,142 @@ "tags": "remove,delete,form,field,readonly", "title": "Remove Read-Only from Form Fields", "header": "Unlock PDF Forms", - "submit": "Remove" + "submit": "Remove", + "description": "This tool will remove read-only restrictions from PDF form fields, making them editable and fillable.", + "filenamePrefix": "unlocked_forms", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst unlocking PDF forms." + }, + "results": { + "title": "Unlocked Forms Results" + } }, "changeMetadata": { - "tags": "Title,author,date,creation,time,publisher,producer,stats", - "title": "Izenburua:", "header": "Aldatu metadatuak", + "submit": "Aldatu", + "filenamePrefix": "metadata", + "settings": { + "title": "Metadata Settings" + }, + "standardFields": { + "title": "Standard Fields" + }, + "deleteAll": { + "label": "Remove Existing Metadata", + "checkbox": "Delete all metadata" + }, + "title": { + "label": "Title", + "placeholder": "Document title" + }, + "author": { + "label": "Author", + "placeholder": "Document author" + }, + "subject": { + "label": "Subject", + "placeholder": "Document subject" + }, + "keywords": { + "label": "Keywords", + "placeholder": "Document keywords" + }, + "creator": { + "label": "Creator", + "placeholder": "Document creator" + }, + "producer": { + "label": "Producer", + "placeholder": "Document producer" + }, + "dates": { + "title": "Date Fields" + }, + "creationDate": { + "label": "Creation Date", + "placeholder": "Creation date" + }, + "modificationDate": { + "label": "Modification Date", + "placeholder": "Modification date" + }, + "trapped": { + "label": "Trapped Status", + "unknown": "Unknown", + "true": "True", + "false": "False" + }, + "advanced": { + "title": "Advanced Options" + }, + "customFields": { + "title": "Custom Metadata", + "description": "Add custom metadata fields to the document", + "add": "Add Field", + "key": "Key", + "keyPlaceholder": "Custom key", + "value": "Value", + "valuePlaceholder": "Custom value", + "remove": "Remove" + }, + "results": { + "title": "Updated PDFs" + }, + "error": { + "failed": "An error occurred while changing the PDF metadata." + }, + "tooltip": { + "header": { + "title": "PDF Metadata Overview" + }, + "standardFields": { + "title": "Standard Fields", + "text": "Common PDF metadata fields that describe the document.", + "bullet1": "Title: Document name or heading", + "bullet2": "Author: Person who created the document", + "bullet3": "Subject: Brief description of content", + "bullet4": "Keywords: Search terms for the document", + "bullet5": "Creator/Producer: Software used to create the PDF" + }, + "dates": { + "title": "Date Fields", + "text": "When the document was created and modified.", + "bullet1": "Creation Date: When original document was made", + "bullet2": "Modification Date: When last changed" + }, + "options": { + "title": "Additional Options", + "text": "Custom fields and privacy controls.", + "bullet1": "Custom Metadata: Add your own key-value pairs", + "bullet2": "Trapped Status: High-quality printing setting", + "bullet3": "Delete All: Remove all metadata for privacy" + }, + "deleteAll": { + "title": "Remove Existing Metadata", + "text": "Complete metadata deletion to ensure privacy." + }, + "customFields": { + "title": "Custom Metadata", + "text": "Add your own custom key-value metadata pairs.", + "bullet1": "Add any custom fields relevant to your document", + "bullet2": "Examples: Department, Project, Version, Status", + "bullet3": "Both key and value are required for each entry" + }, + "advanced": { + "title": "Advanced Options", + "trapped": { + "title": "Trapped Status", + "description": "Indicates if document is prepared for high-quality printing.", + "bullet1": "True: Document has been trapped for printing", + "bullet2": "False: Document has not been trapped", + "bullet3": "Unknown: Trapped status is not specified" + } + } + }, + "tags": "Title,author,date,creation,time,publisher,producer,stats", "selectText": { "1": "Editatu aldatu nahi dituzun aldagaiak", "2": "Ezabatu metadatu guztiak", @@ -838,15 +1877,7 @@ "4": "Beste metadatu batzuk:", "5": "Gehitu metadatu pertsonalizatuen sarrera" }, - "author": "Egilea:", - "creationDate": "Sortze-data (aaaa/MM/dd HH:mm:ss):", - "creator": "Sortzailea:", - "keywords": "Gako-hitzak:", - "modDate": "Aldatze-data (aaaa/MM/dd HH:mm:ss):", - "producer": "Ekoizlea:", - "subject": "Gaia:", - "trapped": "Trapped:", - "submit": "Aldatu" + "modDate": "Aldatze-data (aaaa/MM/dd HH:mm:ss):" }, "fileToPDF": { "tags": "transformation,format,document,picture,slide,text,conversion,office,docs,word,excel,powerpoint", @@ -860,6 +1891,7 @@ "ocr": { "tags": "recognition,text,image,scan,read,identify,detection,editable", "title": "OCR / Garbiketa-eskaneatzea", + "desc": "Garbiketa-eskaneatzeak eta irudi-testuak detektatu PDF baten barruan eta berriz ere gehitu testu gisa", "header": "Garbiketa-eskaneatzea / OCR (Karaktere-ezagutze optikoa)", "selectText": { "1": "Hautatu PDFan detektatuko diren hizkuntzak (zerrendatutakoak gaur egun detektatzen dituenak dira):", @@ -878,17 +1910,89 @@ "help": "Irakurri honen erabilerari buruzko dokumentazioa beste hizkuntza batzuetarako eta/edo ez erabili Docker-en", "credit": "Zerbitzu honek qpdf eta OCR-rako Tesseract erabiltzen ditu", "submit": "PDF prozesatu OCR-rekin", - "desc": "Garbiketa-eskaneatzeak eta irudi-testuak detektatu PDF baten barruan eta berriz ere gehitu testu gisa", + "operation": { + "submit": "Process OCR and Review" + }, + "results": { + "title": "OCR Results" + }, + "languagePicker": { + "additionalLanguages": "Looking for additional languages?", + "viewSetupGuide": "View setup guide →" + }, "settings": { "title": "Ezarpenak", "ocrMode": { - "label": "OCR modua" + "label": "OCR modua", + "auto": "Auto (skip text layers)", + "force": "Force (re-OCR all, replace text)", + "strict": "Strict (abort if text found)" + }, + "languages": { + "label": "Languages", + "placeholder": "Select languages" + }, + "compatibilityMode": { + "label": "Compatibility Mode" + }, + "advancedOptions": { + "label": "Processing Options", + "sidecar": "Create a text file", + "deskew": "Deskew pages", + "clean": "Clean input file", + "cleanFinal": "Clean final output" } }, "tooltip": { + "header": { + "title": "OCR Settings Overview" + }, "mode": { - "title": "OCR modua" + "title": "OCR modua", + "text": "Optical Character Recognition (OCR) helps you turn scanned or screenshotted pages into text you can search, copy, or highlight.", + "bullet1": "Auto skips pages that already contain text layers.", + "bullet2": "Force re-OCRs every page and replaces all the text.", + "bullet3": "Strict halts if any selectable text is found." + }, + "languages": { + "title": "Languages", + "text": "Improve OCR accuracy by specifying the expected languages. Choose one or more languages to guide detection." + }, + "output": { + "title": "Output", + "text": "Decide how you want the text output formatted:", + "bullet1": "Searchable PDF embeds text behind the original image.", + "bullet2": "HOCR XML returns a structured machine-readable file.", + "bullet3": "Plain-text sidecar creates a separate .txt file with raw content." + }, + "advanced": { + "header": { + "title": "Advanced OCR Processing" + }, + "compatibility": { + "title": "Compatibility Mode", + "text": "Uses OCR 'sandwich PDF' mode: results in larger files, but more reliable with certain languages and older PDF software. By default we use hOCR for smaller, modern PDFs." + }, + "sidecar": { + "title": "Create Text File", + "text": "Generates a separate .txt file alongside the PDF containing all extracted text content for easy access and processing." + }, + "deskew": { + "title": "Deskew Pages", + "text": "Automatically corrects skewed or tilted pages to improve OCR accuracy. Useful for scanned documents that weren't perfectly aligned." + }, + "clean": { + "title": "Clean Input File", + "text": "Preprocesses the input by removing noise, enhancing contrast, and optimising the image for better OCR recognition before processing." + }, + "cleanFinal": { + "title": "Clean Final Output", + "text": "Post-processes the final PDF by removing OCR artefacts and optimising the text layer for better readability and smaller file size." + } } + }, + "error": { + "failed": "OCR operation failed" } }, "extractImages": { @@ -897,7 +2001,13 @@ "header": "Atera irudiak", "selectText": "Hautatu irudi-formatua ateratako irudiak bihurtzeko", "allowDuplicates": "Save duplicate images", - "submit": "Atera" + "submit": "Atera", + "settings": { + "title": "Settings" + }, + "error": { + "failed": "An error occurred while extracting images from the PDF." + } }, "pdfToPDFA": { "tags": "archive,long-term,standard,conversion,storage,preservation", @@ -969,17 +2079,53 @@ }, "info": "Python is not installed. It is required to run." }, + "scannerImageSplit": { + "title": "Extracted Images", + "submit": "Extract Image Scans", + "error": { + "failed": "An error occurred while extracting image scans." + }, + "tooltip": { + "title": "Photo Splitter", + "whatThisDoes": "What this does", + "whatThisDoesDesc": "Automatically finds and extracts each photo from a scanned page or composite image—no manual cropping.", + "whenToUse": "When to use", + "useCase1": "Scan whole album pages in one go", + "useCase2": "Split flatbed batches into separate files", + "useCase3": "Break collages into individual photos", + "useCase4": "Pull photos from documents", + "quickFixes": "Quick fixes", + "problem1": "Photos not detected → increase Tolerance to 30-50", + "problem2": "Too many false detections → increase Minimum Area to 15,000-20,000", + "problem3": "Crops are too tight → increase Border Size to 5-10", + "problem4": "Tilted photos not straightened → lower Angle Threshold to ~5°", + "problem5": "Dust/noise boxes → increase Minimum Contour Area to 1000-2000", + "setupTips": "Setup tips", + "tip1": "Use a plain, light background", + "tip2": "Leave a small gap (≈1 cm) between photos", + "tip3": "Scan at 300-600 DPI", + "tip4": "Clean the scanner glass", + "headsUp": "Heads-up", + "headsUpDesc": "Overlapping photos or backgrounds very close in colour to the photos can reduce accuracy-try a lighter or darker background and leave more space." + } + }, "sign": { - "tags": "authorize,initials,drawn-signature,text-sign,image-signature", "title": "Sinatu", "header": "Sinatu PDF fitxategiak", "upload": "Igo irudia", - "draw": "Marraztu sinadura", - "text": "Testua sartzea", + "draw": { + "title": "Draw your signature", + "clear": "Clear" + }, + "text": { + "name": "Signer Name", + "placeholder": "Enter your full name" + }, "clear": "Garbitu", "add": "Gehitu", "saved": "Saved Signatures", "save": "Save Signature", + "applySignatures": "Apply Signatures", "personalSigs": "Personal Signatures", "sharedSigs": "Shared Signatures", "noSavedSigs": "No saved signatures found", @@ -991,39 +2137,179 @@ "previous": "Previous page", "maintainRatio": "Toggle maintain aspect ratio", "undo": "Undo", - "redo": "Redo" + "redo": "Redo", + "submit": "Sign Document", + "steps": { + "configure": "Configure Signature" + }, + "type": { + "title": "Signature Type", + "draw": "Draw", + "canvas": "Canvas", + "image": "Image", + "text": "Text" + }, + "image": { + "label": "Upload signature image", + "placeholder": "Select image file", + "hint": "Upload a PNG or JPG image of your signature" + }, + "instructions": { + "title": "How to add signature", + "canvas": "After drawing your signature in the canvas, close the modal then click anywhere on the PDF to place it.", + "image": "After uploading your signature image above, click anywhere on the PDF to place it.", + "text": "After entering your name above, click anywhere on the PDF to place your signature." + }, + "mode": { + "move": "Move Signature", + "place": "Place Signature" + }, + "updateAndPlace": "Update and Place", + "activate": "Activate Signature Placement", + "deactivate": "Stop Placing Signatures", + "results": { + "title": "Signature Results" + }, + "error": { + "failed": "An error occurred while signing the PDF." + }, + "tags": "authorize,initials,drawn-signature,text-sign,image-signature" }, "flatten": { - "tags": "static,deactivate,non-interactive,streamline", "title": "Lautu", "header": "Akoplatu PDF fitxategiak", "flattenOnlyForms": "Flatten only forms", "submit": "Lautu", + "filenamePrefix": "flattened", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, "steps": { "settings": "Ezarpenak" - } + }, + "options": { + "stepTitle": "Flatten Options", + "title": "Flatten Options", + "flattenOnlyForms": { + "label": "Flatten only forms", + "desc": "Only flatten form fields, leaving other interactive elements intact" + }, + "note": "Flattening removes interactive elements from the PDF, making them non-editable." + }, + "results": { + "title": "Flatten Results" + }, + "error": { + "failed": "An error occurred while flattening the PDF." + }, + "tooltip": { + "header": { + "title": "About Flattening PDFs" + }, + "description": { + "title": "What does flattening do?", + "text": "Flattening makes your PDF non-editable by turning fillable forms and buttons into regular text and images. The PDF will look exactly the same, but no one can change or fill in the forms anymore. Perfect for sharing completed forms, creating final documents for records, or ensuring the PDF looks the same everywhere.", + "bullet1": "Text boxes become regular text (can't be edited)", + "bullet2": "Checkboxes and buttons become pictures", + "bullet3": "Great for final versions you don't want changed", + "bullet4": "Ensures consistent appearance across all devices" + }, + "formsOnly": { + "title": "What does 'Flatten only forms' mean?", + "text": "This option only removes the ability to fill in forms, but keeps other features working like clicking links, viewing bookmarks, and reading comments.", + "bullet1": "Forms become non-editable", + "bullet2": "Links still work when clicked", + "bullet3": "Comments and notes remain visible", + "bullet4": "Bookmarks still help you navigate" + } + }, + "tags": "static,deactivate,non-interactive,streamline" }, "repair": { "tags": "fix,restore,correction,recover", "title": "Konpondu", "header": "Konpondu PDF fitxategiak", - "submit": "Konpondu" + "submit": "Konpondu", + "description": "This tool will attempt to repair corrupted or damaged PDF files. No additional settings are required.", + "filenamePrefix": "repaired", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst repairing the PDF." + }, + "results": { + "title": "Repair Results" + } }, "removeBlanks": { - "tags": "cleanup,streamline,non-content,organize", "title": "Ezabatu zuriuneak", "header": "Ezabatu orrialde zuriak", - "threshold": "Gutxieneko balioa:", + "settings": { + "title": "Settings" + }, + "threshold": { + "label": "Pixel Whiteness Threshold" + }, + "whitePercent": { + "label": "White Percentage Threshold", + "unit": "%" + }, + "includeBlankPages": { + "label": "Include detected blank pages" + }, + "tooltip": { + "header": { + "title": "Remove Blank Pages Settings" + }, + "threshold": { + "title": "Pixel Whiteness Threshold", + "text": "Controls how white a pixel must be to be considered 'white'. This helps determine what counts as a blank area on the page.", + "bullet1": "0 = Pure black (most restrictive)", + "bullet2": "128 = Medium grey", + "bullet3": "255 = Pure white (least restrictive)" + }, + "whitePercent": { + "title": "White Percentage Threshold", + "text": "Sets the minimum percentage of white pixels required for a page to be considered blank and removed.", + "bullet1": "Lower values (e.g., 80%) = More pages removed", + "bullet2": "Higher values (e.g., 95%) = Only very blank pages removed", + "bullet3": "Use higher values for documents with light backgrounds" + }, + "includeBlankPages": { + "title": "Include Detected Blank Pages", + "text": "When enabled, creates a separate PDF containing all the blank pages that were detected and removed from the original document.", + "bullet1": "Useful for reviewing what was removed", + "bullet2": "Helps verify the detection accuracy", + "bullet3": "Can be disabled to reduce output file size" + } + }, + "submit": "Ezabatu zuriuneak", + "error": { + "failed": "Failed to remove blank pages" + }, + "results": { + "title": "Removed Blank Pages" + }, + "tags": "cleanup,streamline,non-content,organize", "thresholdDesc": "Pixel bat zeinen zuri izan behar den ezartzeko gutxieneko balioa", - "whitePercent": "Zuriaren protzentajea (%):", - "whitePercentDesc": "Zuria izan behar den orriaren ehunekoa ezabatua izan dadin", - "submit": "Ezabatu zuriuneak" + "whitePercentDesc": "Zuria izan behar den orriaren ehunekoa ezabatua izan dadin" }, "removeAnnotations": { "tags": "comments,highlight,notes,markup,remove", "title": "Remove Annotations", "header": "Remove Annotations", - "submit": "Remove" + "submit": "Remove", + "settings": { + "title": "Settings" + }, + "info": { + "title": "About Remove Annotations", + "description": "This tool will remove all annotations (comments, highlights, notes, etc.) from your PDF documents." + }, + "error": { + "failed": "An error occurred while removing annotations from the PDF." + } }, "compare": { "tags": "differentiate,contrast,changes,analysis", @@ -1055,6 +2341,142 @@ "certSign": { "tags": "authenticate,PEM,P12,official,encrypt", "title": "Ziurtagiriaren sinadura", + "filenamePrefix": "signed", + "signMode": { + "stepTitle": "Sign Mode", + "tooltip": { + "header": { + "title": "About PDF Signatures" + }, + "overview": { + "title": "How signatures work", + "text": "Both modes seal the document (any edits are flagged as tampering) and record who/when/how for auditing. Viewer trust depends on the certificate chain." + }, + "manual": { + "title": "Manual - Bring your certificate", + "text": "Use your own certificate files for brand-aligned identity. Can display Trusted when your CA/chain is recognised.", + "use": "Use for: customer-facing, legal, compliance." + }, + "auto": { + "title": "Auto - Zero-setup, instant system seal", + "text": "Signs with a server self-signed certificate. Same tamper-evident seal and audit trail; typically shows Unverified in viewers.", + "use": "Use when: you need speed and consistent internal identity across reviews and records." + }, + "rule": { + "title": "Rule of thumb", + "text": "Need recipient Trusted status? Manual. Need a fast, tamper-evident seal and audit trail with no setup? Auto." + } + } + }, + "certTypeStep": { + "stepTitle": "Certificate Format" + }, + "certFiles": { + "stepTitle": "Certificate Files" + }, + "appearance": { + "stepTitle": "Signature Appearance", + "tooltip": { + "header": { + "title": "About Signature Appearance" + }, + "invisible": { + "title": "Invisible Signatures", + "text": "The signature is added to the PDF for security but won't be visible when viewing the document. Perfect for legal requirements without changing the document's appearance.", + "bullet1": "Provides security without visual changes", + "bullet2": "Meets legal requirements for digital signing", + "bullet3": "Doesn't affect document layout or design" + }, + "visible": { + "title": "Visible Signatures", + "text": "Shows a signature block on the PDF with your name, date, and optional details. Useful when you want readers to clearly see the document is signed.", + "bullet1": "Shows signer name and date on the document", + "bullet2": "Can include reason and location for signing", + "bullet3": "Choose which page to place the signature", + "bullet4": "Optional logo can be included" + } + }, + "invisible": "Invisible", + "options": { + "title": "Signature Details" + }, + "visible": "Visible" + }, + "sign": { + "submit": "Sign PDF", + "results": "Signed PDF" + }, + "error": { + "failed": "An error occurred whilst processing signatures." + }, + "tooltip": { + "header": { + "title": "About Managing Signatures" + }, + "overview": { + "title": "What can this tool do?", + "text": "This tool lets you check if your PDFs are digitally signed and add new digital signatures. Digital signatures prove who created or approved a document and show if it has been changed since signing.", + "bullet1": "Check existing signatures and their validity", + "bullet2": "View detailed information about signers and certificates", + "bullet3": "Add new digital signatures to secure your documents", + "bullet4": "Multiple files supported with easy navigation" + }, + "validation": { + "title": "Checking Signatures", + "text": "When you check signatures, the tool tells you if they're valid, who signed the document, when it was signed, and whether the document has been changed since signing.", + "bullet1": "Shows if signatures are valid or invalid", + "bullet2": "Displays signer information and signing date", + "bullet3": "Checks if the document was modified after signing", + "bullet4": "Can use custom certificates for verification" + }, + "signing": { + "title": "Adding Signatures", + "text": "To sign a PDF, you need a digital certificate (like PEM, PKCS12, or JKS). You can choose to make the signature visible on the document or keep it invisible for security only.", + "bullet1": "Supports PEM, PKCS12, JKS, and server certificate formats", + "bullet2": "Option to show or hide signature on the PDF", + "bullet3": "Add reason, location, and signer name", + "bullet4": "Choose which page to place visible signatures", + "bullet5": "Use server certificate for simple 'Sign with Stirling-PDF' option" + } + }, + "certType": { + "tooltip": { + "header": { + "title": "About Certificate Types" + }, + "what": { + "title": "What's a certificate?", + "text": "It's a secure ID for your signature that proves you signed. Unless you're required to sign via certificate, we recommend using another secure method like Type, Draw, or Upload." + }, + "which": { + "title": "Which option should I use?", + "text": "Choose the format that matches your certificate file:", + "bullet1": "PKCS#12 (.p12 / .pfx) – one combined file (most common)", + "bullet2": "PFX (.pfx) – Microsoft's version of PKCS12", + "bullet3": "PEM – separate private-key and certificate .pem files", + "bullet4": "JKS – Java .jks keystore for dev / CI-CD workflows" + }, + "convert": { + "title": "Key not listed?", + "text": "Convert your file to a Java keystore (.jks) with keytool, then pick JKS." + } + } + }, + "chooseCertificate": "Choose Certificate File", + "chooseJksFile": "Choose JKS File", + "chooseP12File": "Choose PKCS12 File", + "choosePfxFile": "Choose PFX File", + "choosePrivateKey": "Choose Private Key File", + "location": "Kokalekua", + "logoTitle": "Logo", + "name": "Izena", + "noLogo": "No Logo", + "pageNumber": "Page Number", + "password": "Sartu zure gakoen biltegia edo gako pribatuko pasahitza (hala badagokio):", + "passwordOptional": "Leave empty if no password", + "reason": "Arrazoia", + "serverCertMessage": "Using server certificate - no files or password required", + "showLogo": "Show Logo", "header": "Sinatu PDF bat haren ziurtagiriarekin (lanean)", "selectPDF": "Hautatu PDF fitxategi bat sinatzeko:", "jksNote": "Note: If your certificate type is not listed below, please convert it to a Java Keystore (.jks) file using the keytool command line tool. Then, choose the .jks file option below.", @@ -1062,13 +2484,7 @@ "selectCert": "Hautatu ziurtagiridun fitxategia (X.509 formatua, .pem edo .der izan liteke):", "selectP12": "Hautatu gakoak gordetzeko fitxategia PKCS#12 (.p12 o .pfx) (Aukerakoa, ematen bada, gako pribatua eta ziurtagiria izan beharko ditu):", "selectJKS": "Select Your Java Keystore File (.jks or .keystore):", - "certType": "Ziurtagiri-mota", - "password": "Sartu zure gakoen biltegia edo gako pribatuko pasahitza (hala badagokio):", "showSig": "Erakutsi sinadura", - "reason": "Arrazoia", - "location": "Kokalekua", - "name": "Izena", - "showLogo": "Show Logo", "submit": "Sinatu PDFa" }, "removeCertSign": { @@ -1076,7 +2492,18 @@ "title": "Remove Certificate Signature", "header": "Remove the digital certificate from the PDF", "selectPDF": "Select a PDF file:", - "submit": "Remove Signature" + "submit": "Remove Signature", + "description": "This tool will remove digital certificate signatures from your PDF document.", + "filenamePrefix": "unsigned", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst removing certificate signatures." + }, + "results": { + "title": "Certificate Removal Results" + } }, "pageLayout": { "tags": "merge,composite,single-view,organize", @@ -1084,16 +2511,157 @@ "header": "Hainbat orrialderen diseinua", "pagesPerSheet": "Orrialdeak orriko:", "addBorder": "Add Borders", - "submit": "Entregatu" + "submit": "Entregatu", + "desc": { + "2": "Place 2 pages side-by-side on a single sheet.", + "3": "Place 3 pages on a single sheet in a single row.", + "4": "Place 4 pages on a single sheet (2 × 2 grid).", + "9": "Place 9 pages on a single sheet (3 × 3 grid).", + "16": "Place 16 pages on a single sheet (4 × 4 grid)." + }, + "error": { + "failed": "An error occurred while creating the multi-page layout." + } + }, + "bookletImposition": { + "tags": "booklet,imposition,printing,binding,folding,signature", + "title": "Booklet Imposition", + "header": "Booklet Imposition", + "submit": "Create Booklet", + "spineLocation": { + "label": "Spine Location", + "left": "Left (Standard)", + "right": "Right (RTL)" + }, + "doubleSided": { + "label": "Double-sided printing", + "tooltip": "Creates both front and back sides for proper booklet printing" + }, + "manualDuplex": { + "title": "Manual Duplex Mode", + "instructions": "For printers without automatic duplex. You'll need to run this twice:" + }, + "duplexPass": { + "label": "Print Pass", + "first": "1st Pass", + "second": "2nd Pass", + "firstInstructions": "Prints front sides → stack face-down → run again with 2nd Pass", + "secondInstructions": "Load printed stack face-down → prints back sides" + }, + "rtlBinding": { + "label": "Right-to-left binding", + "tooltip": "For Arabic, Hebrew, or other right-to-left languages" + }, + "addBorder": { + "label": "Add borders around pages", + "tooltip": "Adds borders around each page section to help with cutting and alignment" + }, + "addGutter": { + "label": "Add gutter margin", + "tooltip": "Adds inner margin space for binding" + }, + "gutterSize": { + "label": "Gutter size (points)" + }, + "flipOnShortEdge": { + "label": "Flip on short edge (automatic duplex only)", + "tooltip": "Enable for short-edge duplex printing (automatic duplex only - ignored in manual mode)", + "manualNote": "Not needed in manual mode - you flip the stack yourself" + }, + "advanced": { + "toggle": "Advanced Options" + }, + "paperSizeNote": "Paper size is automatically derived from your first page.", + "tooltip": { + "header": { + "title": "Booklet Creation Guide" + }, + "description": { + "title": "What is Booklet Imposition?", + "text": "Creates professional booklets by arranging pages in the correct printing order. Your PDF pages are placed 2-up on landscape sheets so when folded and bound, they read in proper sequence like a real book." + }, + "example": { + "title": "Example: 8-Page Booklet", + "text": "Your 8-page document becomes 2 sheets:", + "bullet1": "Sheet 1 Front: Pages 8, 1 | Back: Pages 2, 7", + "bullet2": "Sheet 2 Front: Pages 6, 3 | Back: Pages 4, 5", + "bullet3": "When folded & stacked: Reads 1→2→3→4→5→6→7→8" + }, + "printing": { + "title": "How to Print & Assemble", + "text": "Follow these steps for perfect booklets:", + "bullet1": "Print double-sided with 'Flip on long edge'", + "bullet2": "Stack sheets in order, fold in half", + "bullet3": "Staple or bind along the folded spine", + "bullet4": "For short-edge printers: Enable 'Flip on short edge' option" + }, + "manualDuplex": { + "title": "Manual Duplex (Single-sided Printers)", + "text": "For printers without automatic duplex:", + "bullet1": "Turn OFF 'Double-sided printing'", + "bullet2": "Select '1st Pass' → Print → Stack face-down", + "bullet3": "Select '2nd Pass' → Load stack → Print backs", + "bullet4": "Fold and assemble as normal" + }, + "advanced": { + "title": "Advanced Options", + "text": "Fine-tune your booklet:", + "bullet1": "Right-to-Left Binding: For Arabic, Hebrew, or RTL languages", + "bullet2": "Borders: Shows cut lines for trimming", + "bullet3": "Gutter Margin: Adds space for binding/stapling", + "bullet4": "Short-edge Flip: Only for automatic duplex printers" + } + }, + "error": { + "failed": "An error occurred while creating the booklet imposition." + } }, "scalePages": { - "tags": "resize,modify,dimension,adapt", "title": "Doitu orrialdearen eskala", "header": "Doitu orrialdearen eskala", "pageSize": "Dokumentuaren orrialdearen tamaina", "keepPageSize": "Original Size", "scaleFactor": "Orriaren zoom maila (moztea)", - "submit": "Entregatu" + "submit": "Entregatu", + "tags": "resize,modify,dimension,adapt" + }, + "adjustPageScale": { + "tags": "resize,modify,dimension,adapt", + "title": "Adjust Page Scale", + "header": "Adjust Page Scale", + "scaleFactor": { + "label": "Scale Factor" + }, + "pageSize": { + "label": "Target Page Size", + "keep": "Keep Original Size", + "letter": "Letter", + "legal": "Legal" + }, + "submit": "Adjust Page Scale", + "error": { + "failed": "An error occurred while adjusting the page scale." + }, + "tooltip": { + "header": { + "title": "Page Scale Settings Overview" + }, + "description": { + "title": "Description", + "text": "Adjust the size of PDF content and change the page dimensions." + }, + "scaleFactor": { + "title": "Scale Factor", + "text": "Controls how large or small the content appears on the page. Content is scaled and centred - if scaled content is larger than the page size, it may be cropped.", + "bullet1": "1.0 = Original size", + "bullet2": "0.5 = Half size (50% smaller)", + "bullet3": "2.0 = Double size (200% larger, may crop)" + }, + "pageSize": { + "title": "Target Page Size", + "text": "Sets the dimensions of the output PDF pages. 'Keep Original Size' maintains current dimensions, whilst other options resize to standard paper sizes." + } + } }, "add-page-numbers": { "tags": "paginate,label,organize,index" @@ -1102,16 +2670,83 @@ "tags": "auto-detect,header-based,organize,relabel", "title": "Aldatu izena", "header": "PDF Aldatu izena", - "submit": "Aldatu izena" + "description": "Automatically finds the title from your PDF content and uses it as the filename.", + "submit": "Aldatu izena", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst auto-renaming the PDF." + }, + "results": { + "title": "Auto-Rename Results" + }, + "tooltip": { + "header": { + "title": "How Auto-Rename Works" + }, + "howItWorks": { + "title": "Smart Renaming", + "text": "Automatically finds the title from your PDF content and uses it as the filename.", + "bullet1": "Looks for text that appears to be a title or heading", + "bullet2": "Creates a clean, valid filename from the detected title", + "bullet3": "Keeps the original name if no suitable title is found" + } + } }, "adjust-contrast": { "tags": "color-correction,tune,modify,enhance" }, "crop": { - "tags": "trim,shrink,edit,shape", "title": "Moztu", "header": "Moztu PDF", - "submit": "Bidali" + "submit": "Bidali", + "noFileSelected": "Select a PDF file to begin cropping", + "preview": { + "title": "Crop Area Selection" + }, + "reset": "Reset to full PDF", + "coordinates": { + "title": "Position and Size", + "x": { + "label": "X Position", + "desc": "Left edge (points)" + }, + "y": { + "label": "Y Position", + "desc": "Bottom edge (points)" + }, + "width": { + "label": "Width", + "desc": "Crop width (points)" + }, + "height": { + "label": "Height", + "desc": "Crop height (points)" + } + }, + "error": { + "invalidArea": "Crop area extends beyond PDF boundaries", + "failed": "Failed to crop PDF" + }, + "steps": { + "selectArea": "Select Crop Area" + }, + "tooltip": { + "title": "How to Crop PDFs", + "description": "Select the area to crop from your PDF by dragging and resizing the blue overlay on the thumbnail.", + "drag": "Drag the overlay to move the crop area", + "resize": "Drag the corner and edge handles to resize", + "precision": "Use coordinate inputs for precise positioning" + }, + "results": { + "title": "Crop Results" + }, + "automation": { + "info": "Enter crop coordinates in PDF points. Origin (0,0) is at bottom-left. These values will be applied to all PDFs processed in this automation.", + "reference": "Reference: A4 page is 595.28 × 841.89 points (210mm × 297mm). 1 inch = 72 points." + }, + "tags": "trim,shrink,edit,shape" }, "autoSplitPDF": { "tags": "QR-based,separate,scan-segment,organize", @@ -1194,24 +2829,124 @@ "downloadJS": "Javascript deskargatu", "submit": "Erakutsi" }, - "autoRedact": { - "tags": "Redact,Hide,black out,black,marker,hidden", - "title": "Auto Idatzi", - "header": "Auto Idatzi", - "colorLabel": "Kolorea", - "textsToRedactLabel": "Idazteko testua (lerro bidez bereizia)", - "textsToRedactPlaceholder": "adib. \\nKonfidentziala \\nTop-Secret", - "useRegexLabel": "Regex erabili", - "wholeWordSearchLabel": "Hitz osoen bilaketa", - "customPaddingLabel": "Custom Extra Padding", - "convertPDFToImageLabel": "Bihurtu PDF fitxategi bat PDF-Irudi-ra (kaxaren atzean testua ezabatzeko erabilia)", - "submitButton": "Bidali" - }, "redact": { "tags": "Redact,Hide,black out,black,marker,hidden,manual", "title": "Manual Redaction", - "header": "Manual Redaction", "submit": "Manual Redaction", + "error": { + "failed": "An error occurred while redacting the PDF." + }, + "modeSelector": { + "title": "Redaction Method", + "mode": "Mode", + "automatic": "Automatic", + "automaticDesc": "Redact text based on search terms", + "manual": "Manual", + "manualDesc": "Click and drag to redact specific areas", + "manualComingSoon": "Manual redaction coming soon" + }, + "auto": { + "header": "Auto Redact", + "settings": { + "title": "Redaction Settings", + "advancedTitle": "Advanced" + }, + "colorLabel": "Box Colour", + "wordsToRedact": { + "title": "Words to Redact", + "placeholder": "Enter a word", + "add": "Gehitu", + "examples": "Examples: Confidential, Top-Secret" + }, + "useRegexLabel": "Use Regex", + "wholeWordSearchLabel": "Whole Word Search", + "customPaddingLabel": "Custom Extra Padding", + "convertPDFToImageLabel": "Convert PDF to PDF-Image" + }, + "tooltip": { + "mode": { + "header": { + "title": "Redaction Method" + }, + "automatic": { + "title": "Automatic Redaction", + "text": "Automatically finds and redacts specified text throughout the document. Perfect for removing consistent sensitive information like names, addresses, or confidential markers." + }, + "manual": { + "title": "Manual Redaction", + "text": "Click and drag to manually select specific areas to redact. Gives you precise control over what gets redacted. (Coming soon)" + } + }, + "words": { + "header": { + "title": "Words to Redact" + }, + "description": { + "title": "Text Matching", + "text": "Enter words or phrases to find and redact in your document. Each word will be searched for separately." + }, + "bullet1": "Add one word at a time", + "bullet2": "Press Enter or click 'Add Another' to add", + "bullet3": "Click × to remove words", + "examples": { + "title": "Common Examples", + "text": "Typical words to redact include: bank details, email addresses, or specific names." + } + }, + "advanced": { + "header": { + "title": "Advanced Redaction Settings" + }, + "color": { + "title": "Box Colour & Padding", + "text": "Customise the appearance of redaction boxes. Black is standard, but you can choose any colour. Padding adds extra space around the found text." + }, + "regex": { + "title": "Use Regex", + "text": "Enable regular expressions for advanced pattern matching. Useful for finding phone numbers, emails, or complex patterns.", + "bullet1": "Example: \\d{4}-\\d{2}-\\d{2} to match any dates in YYYY-MM-DD format", + "bullet2": "Use with caution - test thoroughly" + }, + "wholeWord": { + "title": "Whole Word Search", + "text": "Only match complete words, not partial matches. 'John' won't match 'Johnson' when enabled." + }, + "convert": { + "title": "Convert to PDF-Image", + "text": "Converts the PDF to an image-based PDF after redaction. This ensures text behind redaction boxes is completely removed and unrecoverable." + } + } + }, + "manual": { + "header": "Manual Redaction", + "textBasedRedaction": "Text-based Redaction", + "pageBasedRedaction": "Page-based Redaction", + "convertPDFToImageLabel": "Convert PDF to PDF-Image (Used to remove text behind the box)", + "pageRedactionNumbers": { + "title": "Pages", + "placeholder": "(e.g. 1,2,8 or 4,7,12-16 or 2n-1)" + }, + "redactionColor": { + "title": "Redaction Colour" + }, + "export": "Export", + "upload": "Upload", + "boxRedaction": "Box draw redaction", + "zoom": "Zoom", + "zoomIn": "Zoom in", + "zoomOut": "Zoom out", + "nextPage": "Next Page", + "previousPage": "Previous Page", + "toggleSidebar": "Toggle Sidebar", + "showThumbnails": "Show Thumbnails", + "showDocumentOutline": "Show Document Outline (double-click to expand/collapse all items)", + "showAttachments": "Show Attachments", + "showLayers": "Show Layers (double-click to reset all layers to the default state)", + "colourPicker": "Colour Picker", + "findCurrentOutlineItem": "Find current outline item", + "applyChanges": "Apply Changes" + }, + "header": "Manual Redaction", "textBasedRedaction": "Text based Redaction", "pageBasedRedaction": "Page-based Redaction", "convertPDFToImageLabel": "Convert PDF to PDF-Image (Used to remove text behind the box)", @@ -1237,12 +2972,7 @@ "showLayers": "Show Layers (double-click to reset all layers to the default state)", "colourPicker": "Colour Picker", "findCurrentOutlineItem": "Find current outline item", - "applyChanges": "Apply Changes", - "auto": { - "wordsToRedact": { - "add": "Gehitu" - } - } + "applyChanges": "Apply Changes" }, "tableExtraxt": { "tags": "CSV,Table Extraction,extract,convert" @@ -1253,11 +2983,15 @@ "overlay-pdfs": { "tags": "Overlay", "header": "Overlay PDF Files", + "title": "Overlay PDFs", + "desc": "Overlay one PDF on top of another", "baseFile": { - "label": "Select Base PDF File" + "label": "Select Original PDF File" }, "overlayFiles": { - "label": "Select Overlay PDF Files" + "label": "Select Overlay PDF Files", + "placeholder": "Choose PDF(s)...", + "addMore": "Add more PDFs..." }, "mode": { "label": "Select Overlay Mode", @@ -1267,14 +3001,53 @@ }, "counts": { "label": "Overlay Counts (for Fixed Repeat Mode)", - "placeholder": "Enter comma-separated counts (e.g., 2,3,1)" + "placeholder": "Enter comma-separated counts (e.g., 2,3,1)", + "item": "Count for file", + "noFiles": "Add overlay files to configure counts" }, "position": { "label": "Select Overlay Position", "foreground": "Foreground", "background": "Background" }, - "submit": "Bidali" + "submit": "Bidali", + "settings": { + "title": "Settings" + }, + "results": { + "title": "Overlay Results" + }, + "tooltip": { + "header": { + "title": "Overlay PDFs Overview" + }, + "description": { + "title": "Description", + "text": "Combine a base PDF with one or more overlay PDFs. Overlays can be applied page-by-page in different modes and placed in the foreground or background." + }, + "mode": { + "title": "Overlay Mode", + "text": "Choose how to distribute overlay pages across the base PDF pages.", + "sequential": "Sequential Overlay: Use pages from the first overlay PDF until it ends, then move to the next.", + "interleaved": "Interleaved Overlay: Take one page from each overlay in turn.", + "fixedRepeat": "Fixed Repeat Overlay: Take a set number of pages from each overlay before moving to the next. Use Counts to set the numbers." + }, + "position": { + "title": "Overlay Position", + "text": "Foreground places the overlay on top of the page. Background places it behind." + }, + "overlayFiles": { + "title": "Overlay Files", + "text": "Select one or more PDFs to overlay on the base. The order of these files affects how pages are applied in Sequential and Fixed Repeat modes." + }, + "counts": { + "title": "Counts (Fixed Repeat only)", + "text": "Provide a positive number for each overlay file showing how many pages to take before moving to the next. Required when mode is Fixed Repeat." + } + }, + "error": { + "failed": "An error occurred while overlaying PDFs." + } }, "split-by-sections": { "tags": "Section Split, Divide, Customize", @@ -1295,6 +3068,7 @@ "tags": "Stamp, Add image, center image, Watermark, PDF, Embed, Customize", "header": "Stamp PDF", "title": "Stamp PDF", + "stampSetup": "Stamp Setup", "stampType": "Stamp Type", "stampText": "Stamp Text", "stampImage": "Stamp Image", @@ -1307,7 +3081,19 @@ "overrideY": "Override Y Coordinate", "customMargin": "Custom Margin", "customColor": "Custom Text Color", - "submit": "Bidali" + "submit": "Bidali", + "noStampSelected": "No stamp selected. Return to Step 1.", + "customPosition": "Drag the stamp to the desired location in the preview window.", + "error": { + "failed": "An error occurred while adding stamp to the PDF." + }, + "imageSize": "Image Size", + "margin": "Margin", + "positionAndFormatting": "Position & Formatting", + "quickPosition": "Select a position on the page to place the stamp.", + "results": { + "title": "Stamp Results" + } }, "removeImagePdf": { "tags": "Remove Image,Page operations,Back end,server side" @@ -1325,7 +3111,8 @@ "status": { "_value": "Status", "valid": "Valid", - "invalid": "Invalid" + "invalid": "Invalid", + "complete": "Validation complete" }, "signer": "Signer", "date": "Date", @@ -1352,40 +3139,122 @@ "version": "Version", "keyUsage": "Key Usage", "selfSigned": "Self-Signed", - "bits": "bits" + "bits": "bits", + "details": "Certificate Details" }, "signature": { "info": "Signature Information", "_value": "Signature", "mathValid": "Signature is mathematically valid BUT:" }, - "selectCustomCert": "Custom Certificate File X.509 (Optional)" - }, - "replace-color": { - "title": "Replace-Invert-Color", - "header": "Replace-Invert Color PDF", - "selectText": { - "1": "Replace or Invert color Options", - "2": "Default(Default high contrast colors)", - "3": "Custom(Customized colors)", - "4": "Full-Invert(Invert all colors)", - "5": "High contrast color options", - "6": "white text on black background", - "7": "Black text on white background", - "8": "Yellow text on black background", - "9": "Green text on black background", - "10": "Choose text Color", - "11": "Choose background Color" + "selectCustomCert": "Custom Certificate File X.509 (Optional)", + "downloadCsv": "Download CSV", + "downloadJson": "Download JSON", + "downloadPdf": "Download PDF Report", + "downloadType": { + "csv": "CSV", + "json": "JSON", + "pdf": "PDF" }, - "submit": "Replace" + "error": { + "allFailed": "Unable to validate the selected files.", + "partial": "Some files could not be validated.", + "reportGeneration": "Could not generate the PDF report. JSON and CSV are available.", + "unexpected": "Unexpected error during validation." + }, + "finalizing": "Preparing downloads...", + "issue": { + "certExpired": "Certificate expired", + "certRevocationUnknown": "Certificate revocation status unknown", + "certRevoked": "Certificate revoked", + "chainInvalid": "Certificate chain invalid", + "signatureInvalid": "Signature cryptographic check failed", + "trustInvalid": "Certificate not trusted" + }, + "noResults": "Run the validation to generate a report.", + "noSignaturesShort": "No signatures", + "processing": "Validating signatures...", + "report": { + "continued": "Continued", + "downloads": "Downloads", + "entryLabel": "Signature Summary", + "fields": { + "created": "Created", + "fileSize": "File Size", + "signatureCount": "Total Signatures", + "signatureDate": "Signature Date" + }, + "filesEvaluated": "{{count}} files evaluated", + "footer": "Validated via Stirling PDF", + "generatedAt": "Generated", + "noPdf": "PDF report will be available after a successful validation.", + "page": "Page", + "shortTitle": "Signature Summary", + "signatureCountLabel": "{{count}} signatures", + "signaturesFound": "{{count}} signatures detected", + "signaturesValid": "{{count}} fully valid", + "title": "Signature Validation Report" + }, + "settings": { + "certHint": "Upload a trusted X.509 certificate to validate against a custom trust source.", + "title": "Validation Settings" + }, + "signatureDate": "Signature Date", + "totalSignatures": "Total Signatures" }, - "replaceColorPdf": { - "tags": "Replace Color,Page operations,Back end,server side" + "replaceColor": { + "tags": "Replace Colour,Page operations,Back end,server side", + "labels": { + "settings": "Settings", + "colourOperation": "Colour operation" + }, + "options": { + "highContrast": "High contrast", + "invertAll": "Invert all colours", + "custom": "Custom", + "cmyk": "Convert to CMYK" + }, + "tooltip": { + "header": { + "title": "Replace & Invert Colour Settings Overview" + }, + "description": { + "title": "Description", + "text": "Transform PDF colours to improve readability and accessibility. Choose from high contrast presets, invert all colours, or create custom colour schemes." + }, + "highContrast": { + "title": "High Contrast", + "text": "Apply predefined high contrast colour combinations designed for better readability and accessibility compliance.", + "bullet1": "White text on black background - Classic dark mode", + "bullet2": "Black text on white background - Standard high contrast", + "bullet3": "Yellow text on black background - High visibility option", + "bullet4": "Green text on black background - Alternative high contrast" + }, + "invertAll": { + "title": "Invert All Colours", + "text": "Completely invert all colours in the PDF, creating a negative-like effect. Useful for creating dark mode versions of documents or reducing eye strain in low-light conditions." + }, + "custom": { + "title": "Custom Colours", + "text": "Define your own text and background colours using the colour pickers. Perfect for creating branded documents or specific accessibility requirements.", + "bullet1": "Text colour - Choose the colour for text elements", + "bullet2": "Background colour - Set the background colour for the document" + }, + "cmyk": { + "title": "Convert to CMYK", + "text": "Convert the PDF from RGB colour space to CMYK colour space, optimized for professional printing. This process converts colours to the Cyan, Magenta, Yellow, Black model used by printers." + } + }, + "error": { + "failed": "An error occurred while processing the colour replacement." + } }, "login": { "title": "Saioa hasi", "header": "Saioa hasi", "signin": "Saioa hasi", + "signInWith": "Sign in with", + "signInAnonymously": "Sign Up as a Guest", "rememberme": "Oroitu nazazu", "invalid": "Okerreko erabiltzaile izena edo pasahitza.", "locked": "Zure kontua blokeatu egin da.", @@ -1404,12 +3273,83 @@ "alreadyLoggedIn": "You are already logged in to", "alreadyLoggedIn2": "devices. Please log out of the devices and try again.", "toManySessions": "You have too many active sessions", - "logoutMessage": "You have been logged out." + "logoutMessage": "You have been logged out.", + "youAreLoggedIn": "You are logged in!", + "email": "Email", + "password": "Password", + "enterEmail": "Enter your email", + "enterPassword": "Enter your password", + "loggingIn": "Logging In...", + "username": "Username", + "enterUsername": "Enter username", + "useEmailInstead": "Login with email", + "forgotPassword": "Forgot your password?", + "logIn": "Log In", + "signingIn": "Signing in...", + "login": "Login", + "or": "Or", + "useMagicLink": "Use magic link instead", + "enterEmailForMagicLink": "Enter your email for magic link", + "sending": "Sendingâ€Ļ", + "sendMagicLink": "Send Magic Link", + "cancel": "Cancel", + "dontHaveAccount": "Don't have an account? Sign up", + "home": "Home", + "debug": "Debug", + "signOut": "Sign Out", + "pleaseEnterBoth": "Please enter both email and password", + "pleaseEnterEmail": "Please enter your email address", + "magicLinkSent": "Magic link sent to {{email}}! Check your email and click the link to sign in.", + "passwordResetSent": "Password reset link sent to {{email}}! Check your email and follow the instructions.", + "failedToSignIn": "Failed to sign in with {{provider}}: {{message}}", + "unexpectedError": "Unexpected error: {{message}}", + "accountCreatedSuccess": "Account created successfully! You can now sign in.", + "passwordChangedSuccess": "Password changed successfully! Please sign in with your new password.", + "credentialsUpdated": "Your credentials have been updated. Please sign in again." + }, + "signup": { + "title": "Create an account", + "subtitle": "Join Stirling PDF to get started", + "name": "Name", + "email": "Email", + "password": "Password", + "confirmPassword": "Confirm password", + "enterName": "Enter your name", + "enterEmail": "Enter your email", + "enterPassword": "Enter your password", + "confirmPasswordPlaceholder": "Confirm password", + "or": "or", + "creatingAccount": "Creating Account...", + "signUp": "Sign Up", + "alreadyHaveAccount": "Already have an account? Sign in", + "pleaseFillAllFields": "Please fill in all fields", + "passwordsDoNotMatch": "Passwords do not match", + "passwordTooShort": "Password must be at least 6 characters long", + "invalidEmail": "Please enter a valid email address", + "checkEmailConfirmation": "Check your email for a confirmation link to complete your registration.", + "accountCreatedSuccessfully": "Account created successfully! You can now sign in.", + "unexpectedError": "Unexpected error: {{message}}", + "useEmailInstead": "Use Email Instead", + "nameRequired": "Name is required", + "emailRequired": "Email is required", + "passwordRequired": "Password is required", + "confirmPasswordRequired": "Please confirm your password" }, "pdfToSinglePage": { "title": "PDF Orrialde bakarrera", "header": "PDF Orrialde bakarrera", - "submit": "Orrialde bakarrera bihurtu" + "submit": "Orrialde bakarrera bihurtu", + "description": "This tool will merge all pages of your PDF into one large single page. The width will remain the same as the original pages, but the height will be the sum of all page heights.", + "filenamePrefix": "single_page", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst converting to single page." + }, + "results": { + "title": "Single Page Results" + } }, "pageExtracter": { "title": "Atera orriak", @@ -1433,18 +3373,59 @@ "adjustContrast": { "title": "Doitu kontrastea", "header": "Doitu kontrastea", + "basic": "Basic Adjustments", "contrast": "Kontrastea:", "brightness": "Distira:", "saturation": "Asetasuna:", - "download": "Distira" + "download": "Distira", + "adjustColors": "Adjust Colors", + "blue": "Blue", + "confirm": "Confirm", + "error": { + "failed": "Failed to adjust colors/contrast" + }, + "green": "Green", + "noPreview": "Select a PDF to preview", + "red": "Red", + "results": { + "title": "Adjusted PDF" + } }, "compress": { "title": "Konprimatu", + "desc": "Compress PDFs to reduce their file size.", "header": "PDFa konprimatu", + "method": { + "title": "Compression Method", + "quality": "Quality", + "filesize": "File Size" + }, "credit": "Zerbitzu honek qpdf erabiltzen du PDFak komprimatzeko/optimizatzeko", "grayscale": { "label": "Aplikatu grisezko eskala konpresiorako" }, + "tooltip": { + "header": { + "title": "Compress Settings Overview" + }, + "description": { + "title": "Description", + "text": "Compression is an easy way to reduce your file size. Pick File Size to enter a target size and have us adjust quality for you. Pick Quality to set compression strength manually." + }, + "qualityAdjustment": { + "title": "Quality Adjustment", + "text": "Drag the slider to adjust the compression strength. Lower values (1-3) preserve quality but result in larger files. Higher values (7-9) shrink the file more but reduce image clarity.", + "bullet1": "Lower values preserve quality", + "bullet2": "Higher values reduce file size" + }, + "grayscale": { + "title": "Grayscale", + "text": "Select this option to convert all images to black and white, which can significantly reduce file size especially for scanned PDFs or image-heavy documents." + } + }, + "error": { + "failed": "An error occurred while compressing the PDF." + }, "selectText": { "1": { "_value": "Compression Settings", @@ -1555,7 +3536,13 @@ "title": "Remove image", "header": "Remove image", "removeImage": "Remove image", - "submit": "Remove image" + "submit": "Remove image", + "error": { + "failed": "Failed to remove images from the PDF." + }, + "results": { + "title": "Remove Images Results" + } }, "splitByChapters": { "title": "Split PDF by Chapters", @@ -1589,6 +3576,12 @@ }, "note": "Release notes are only available in English" }, + "swagger": { + "title": "API Documentation", + "header": "API Documentation", + "desc": "View and test the Stirling PDF API endpoints", + "tags": "api,documentation,swagger,endpoints,development" + }, "cookieBanner": { "popUp": { "title": "How we use Cookies", @@ -1624,39 +3617,943 @@ "title": "Analytics", "description": "These cookies help us understand how our tools are being used, so we can focus on building the features our community values most. Rest assured—Stirling PDF cannot and will never track the content of the documents you work with." } + }, + "services": { + "posthog": "PostHog Analytics", + "scarf": "Scarf Pixel" } }, - "download": "Distira", - "convert": { - "title": "Bihurtu", - "settings": "Ezarpenak", - "color": "Color", - "greyscale": "Gris-eskala", - "grayscale": "Gris-eskala" + "removeMetadata": { + "submit": "Remove Metadata" }, - "attachments": { - "tags": "embed,attach,file,attachment,attachments", - "title": "Add attachments", - "header": "Add attachments", - "submit": "Add attachments" + "sidebar": { + "toggle": "Toggle Sidebar" + }, + "theme": { + "toggle": "Toggle Theme" + }, + "view": { + "viewer": "Viewer", + "pageEditor": "Page Editor", + "fileManager": "File Manager" + }, + "pageEditor": { + "title": "Page Editor", + "save": "Save Changes", + "noPdfLoaded": "No PDF loaded. Please upload a PDF to edit.", + "rotatedLeft": "Rotated left:", + "rotatedRight": "Rotated right:", + "deleted": "Deleted:", + "movedLeft": "Moved left:", + "movedRight": "Moved right:", + "splitAt": "Split at:", + "insertedPageBreak": "Inserted page break at:", + "addFileNotImplemented": "Add file not implemented in demo", + "closePdf": "Close PDF", + "reset": "Reset Changes", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "fitToWidth": "Fit to Width", + "actualSize": "Actual Size" + }, + "viewer": { + "firstPage": "First Page", + "lastPage": "Last Page", + "previousPage": "Previous Page", + "nextPage": "Next Page", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "singlePageView": "Single Page View", + "dualPageView": "Dual Page View" + }, + "rightRail": { + "closeSelected": "Close Selected Files", + "selectAll": "Select All", + "deselectAll": "Deselect All", + "selectByNumber": "Select by Page Numbers", + "deleteSelected": "Delete Selected Pages", + "closePdf": "Close PDF", + "exportAll": "Export PDF", + "downloadSelected": "Download Selected Files", + "downloadAll": "Download All", + "toggleTheme": "Toggle Theme", + "language": "Language", + "search": "Search PDF", + "panMode": "Pan Mode", + "rotateLeft": "Rotate Left", + "rotateRight": "Rotate Right", + "toggleSidebar": "Toggle Sidebar", + "exportSelected": "Export Selected Pages", + "toggleAnnotations": "Toggle Annotations Visibility", + "annotationMode": "Toggle Annotation Mode", + "draw": "Draw", + "save": "Save" + }, + "search": { + "title": "Search PDF", + "placeholder": "Enter search term...", + "noResults": "No results found", + "searching": "Searching..." + }, + "guestBanner": { + "title": "You're using Stirling PDF as a guest!", + "message": "Create a free account to save your work, access more features, and support the project.", + "dismiss": "Dismiss banner", + "signUp": "Sign Up Free" + }, + "toolPicker": { + "searchPlaceholder": "Search tools...", + "noToolsFound": "No tools found", + "allTools": "ALL TOOLS", + "quickAccess": "QUICK ACCESS", + "categories": { + "standardTools": "Standard Tools", + "advancedTools": "Advanced Tools", + "recommendedTools": "Recommended Tools" + }, + "subcategories": { + "signing": "Signing", + "documentSecurity": "Document Security", + "verification": "Verification", + "documentReview": "Document Review", + "pageFormatting": "Page Formatting", + "extraction": "Extraction", + "removal": "Removal", + "automation": "Automation", + "general": "General", + "advancedFormatting": "Advanced Formatting", + "developerTools": "Developer Tools" + } }, "quickAccess": { - "sign": "Sinatu" + "read": "Read", + "sign": "Sinatu", + "automate": "Automate", + "files": "Files", + "activity": "Activity", + "help": "Help", + "account": "Account", + "config": "Config", + "adminSettings": "Admin Settings", + "allTools": "All Tools" + }, + "admin": { + "error": "Error", + "success": "Success", + "expand": "Expand", + "close": "Close", + "status": { + "active": "Active", + "inactive": "Inactive" + }, + "settings": { + "title": "Admin Settings", + "workspace": "Workspace", + "fetchError": "Failed to load settings", + "saveError": "Failed to save settings", + "saved": "Settings saved successfully", + "saveSuccess": "Settings saved successfully", + "save": "Save Changes", + "restartRequired": "Restart Required", + "restart": { + "title": "Restart Required", + "message": "Settings have been saved successfully. A server restart is required for the changes to take effect.", + "question": "Would you like to restart the server now or later?", + "now": "Restart Now", + "later": "Restart Later" + }, + "restarting": "Restarting Server", + "restartingMessage": "The server is restarting. Please wait a moment...", + "restartError": "Failed to restart server. Please restart manually.", + "general": { + "title": "System Settings", + "description": "Configure system-wide application settings including branding and default behaviour.", + "ui": "User Interface", + "system": "System", + "appName": { + "label": "Application Name", + "description": "The name displayed in the browser tab and home page" + }, + "appNameNavbar": { + "label": "Navbar Brand", + "description": "The name displayed in the navigation bar" + }, + "homeDescription": { + "label": "Home Description", + "description": "The description text shown on the home page" + }, + "defaultLocale": { + "label": "Default Locale", + "description": "The default language for new users (e.g., en_US, es_ES)" + }, + "fileUploadLimit": { + "label": "File Upload Limit", + "description": "Maximum file upload size (e.g., 100MB, 1GB)" + }, + "showUpdate": { + "label": "Show Update Notifications", + "description": "Display notifications when a new version is available" + }, + "showUpdateOnlyAdmin": { + "label": "Show Updates to Admins Only", + "description": "Restrict update notifications to admin users only" + }, + "customHTMLFiles": { + "label": "Custom HTML Files", + "description": "Allow serving custom HTML files from the customFiles directory" + }, + "languages": { + "label": "Available Languages", + "description": "Languages that users can select from (leave empty to enable all languages)" + }, + "customMetadata": { + "label": "Custom Metadata", + "autoUpdate": { + "label": "Auto Update Metadata", + "description": "Automatically update PDF metadata on all processed documents" + }, + "author": { + "label": "Default Author", + "description": "Default author for PDF metadata (e.g., username)" + }, + "creator": { + "label": "Default Creator", + "description": "Default creator for PDF metadata" + }, + "producer": { + "label": "Default Producer", + "description": "Default producer for PDF metadata" + } + }, + "customPaths": { + "label": "Custom Paths", + "description": "Configure custom file system paths for pipeline processing and external tools", + "pipeline": { + "label": "Pipeline Directories", + "watchedFoldersDir": { + "label": "Watched Folders Directory", + "description": "Directory where pipeline monitors for incoming PDFs (leave empty for default: /pipeline/watchedFolders)" + }, + "finishedFoldersDir": { + "label": "Finished Folders Directory", + "description": "Directory where processed PDFs are outputted (leave empty for default: /pipeline/finishedFolders)" + } + }, + "operations": { + "label": "External Tool Paths", + "weasyprint": { + "label": "WeasyPrint Executable", + "description": "Path to WeasyPrint executable for HTML to PDF conversion (leave empty for default: /opt/venv/bin/weasyprint)" + }, + "unoconvert": { + "label": "Unoconvert Executable", + "description": "Path to LibreOffice unoconvert for document conversions (leave empty for default: /opt/venv/bin/unoconvert)" + } + } + } + }, + "security": { + "title": "Security", + "description": "Configure authentication, login behaviour, and security policies.", + "ssoNotice": { + "title": "Looking for SSO/SAML settings?", + "message": "OAuth2 and SAML2 authentication providers have been moved to the Connections menu for easier management." + }, + "authentication": "Authentication", + "enableLogin": { + "label": "Enable Login", + "description": "Require users to log in before accessing the application" + }, + "loginMethod": { + "label": "Login Method", + "description": "The authentication method to use for user login", + "all": "All Methods", + "normal": "Username/Password Only", + "oauth2": "OAuth2 Only", + "saml2": "SAML2 Only" + }, + "loginAttemptCount": { + "label": "Login Attempt Limit", + "description": "Maximum number of failed login attempts before account lockout" + }, + "loginResetTimeMinutes": { + "label": "Login Reset Time (minutes)", + "description": "Time before failed login attempts are reset" + }, + "csrfDisabled": { + "label": "Disable CSRF Protection", + "description": "Disable Cross-Site Request Forgery protection (not recommended)" + }, + "initialLogin": { + "label": "Initial Login", + "username": { + "label": "Initial Username", + "description": "The username for the initial admin account" + }, + "password": { + "label": "Initial Password", + "description": "The password for the initial admin account" + } + }, + "jwt": { + "label": "JWT Configuration", + "secureCookie": { + "label": "Secure Cookie", + "description": "Require HTTPS for JWT cookies (recommended for production)" + }, + "keyRetentionDays": { + "label": "Key Retention Days", + "description": "Number of days to retain old JWT keys for verification" + }, + "persistence": { + "label": "Enable Key Persistence", + "description": "Store JWT keys persistently to survive server restarts" + }, + "enableKeyRotation": { + "label": "Enable Key Rotation", + "description": "Automatically rotate JWT signing keys periodically" + }, + "enableKeyCleanup": { + "label": "Enable Key Cleanup", + "description": "Automatically remove expired JWT keys" + } + }, + "audit": { + "label": "Audit Logging", + "enabled": { + "label": "Enable Audit Logging", + "description": "Track user actions and system events for compliance and security monitoring" + }, + "level": { + "label": "Audit Level", + "description": "0=OFF, 1=BASIC, 2=STANDARD, 3=VERBOSE" + }, + "retentionDays": { + "label": "Audit Retention (days)", + "description": "Number of days to retain audit logs" + } + }, + "htmlUrlSecurity": { + "label": "HTML URL Security", + "description": "Configure URL access restrictions for HTML processing to prevent SSRF attacks", + "enabled": { + "label": "Enable URL Security", + "description": "Enable URL security restrictions for HTML to PDF conversions" + }, + "level": { + "label": "Security Level", + "description": "MAX: whitelist only, MEDIUM: block internal networks, OFF: no restrictions", + "max": "Maximum (Whitelist Only)", + "medium": "Medium (Block Internal)", + "off": "Off (No Restrictions)" + }, + "advanced": "Advanced Settings", + "allowedDomains": { + "label": "Allowed Domains (Whitelist)", + "description": "One domain per line (e.g., cdn.example.com). Only these domains allowed when level is MAX" + }, + "blockedDomains": { + "label": "Blocked Domains (Blacklist)", + "description": "One domain per line (e.g., malicious.com). Additional domains to block" + }, + "internalTlds": { + "label": "Internal TLDs", + "description": "One TLD per line (e.g., .local, .internal). Block domains with these TLD patterns" + }, + "networkBlocking": "Network Blocking", + "blockPrivateNetworks": { + "label": "Block Private Networks", + "description": "Block RFC 1918 private networks (10.x.x.x, 192.168.x.x, 172.16-31.x.x)" + }, + "blockLocalhost": { + "label": "Block Localhost", + "description": "Block localhost and loopback addresses (127.x.x.x, ::1)" + }, + "blockLinkLocal": { + "label": "Block Link-Local Addresses", + "description": "Block link-local addresses (169.254.x.x, fe80::/10)" + }, + "blockCloudMetadata": { + "label": "Block Cloud Metadata Endpoints", + "description": "Block cloud provider metadata endpoints (169.254.169.254)" + } + } + }, + "connections": { + "title": "Connections", + "description": "Configure external authentication providers like OAuth2 and SAML.", + "linkedServices": "Linked Services", + "unlinkedServices": "Unlinked Services", + "connect": "Connect", + "disconnect": "Disconnect", + "disconnected": "Provider disconnected successfully", + "disconnectError": "Failed to disconnect provider", + "ssoAutoLogin": { + "label": "SSO Auto Login", + "enable": "Enable SSO Auto Login", + "description": "Automatically redirect to SSO login when authentication is required" + }, + "oauth2": { + "label": "OAuth2", + "enabled": { + "label": "Enable OAuth2", + "description": "Allow users to authenticate using OAuth2 providers" + }, + "provider": { + "label": "Provider", + "description": "The OAuth2 provider to use for authentication" + }, + "issuer": { + "label": "Issuer URL", + "description": "The OAuth2 provider issuer URL" + }, + "clientId": { + "label": "Client ID", + "description": "The OAuth2 client ID from your provider" + }, + "clientSecret": { + "label": "Client Secret", + "description": "The OAuth2 client secret from your provider" + }, + "useAsUsername": { + "label": "Use as Username", + "description": "The OAuth2 claim to use as the username (e.g., email, sub)" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first OAuth2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via OAuth2" + }, + "scopes": { + "label": "OAuth2 Scopes", + "description": "Comma-separated list of OAuth2 scopes to request (e.g., openid, profile, email)" + } + }, + "saml2": { + "label": "SAML2", + "enabled": { + "label": "Enable SAML2", + "description": "Allow users to authenticate using SAML2 providers" + }, + "provider": { + "label": "Provider", + "description": "The SAML2 provider name" + }, + "registrationId": { + "label": "Registration ID", + "description": "The SAML2 registration identifier" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first SAML2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via SAML2" + } + } + }, + "database": { + "title": "Database", + "description": "Configure custom database connection settings for enterprise deployments.", + "configuration": "Database Configuration", + "enableCustom": { + "label": "Enable Custom Database", + "description": "Use your own custom database configuration instead of the default embedded database" + }, + "customUrl": { + "label": "Custom Database URL", + "description": "Full JDBC connection string (e.g., jdbc:postgresql://localhost:5432/postgres). If provided, individual connection settings below are not used." + }, + "type": { + "label": "Database Type", + "description": "Type of database (not used if custom URL is provided)" + }, + "hostName": { + "label": "Host Name", + "description": "Database server hostname (not used if custom URL is provided)" + }, + "port": { + "label": "Port", + "description": "Database server port (not used if custom URL is provided)" + }, + "name": { + "label": "Database Name", + "description": "Name of the database (not used if custom URL is provided)" + }, + "username": { + "label": "Username", + "description": "Database authentication username" + }, + "password": { + "label": "Password", + "description": "Database authentication password" + } + }, + "privacy": { + "title": "Privacy", + "description": "Configure privacy and data collection settings.", + "analytics": "Analytics & Tracking", + "enableAnalytics": { + "label": "Enable Analytics", + "description": "Collect anonymous usage analytics to help improve the application" + }, + "metricsEnabled": { + "label": "Enable Metrics", + "description": "Enable collection of performance and usage metrics. Provides API endpoint for admins to access metrics data" + }, + "searchEngine": "Search Engine Visibility", + "googleVisibility": { + "label": "Google Visibility", + "description": "Allow search engines to index this application" + } + }, + "advanced": { + "title": "Advanced", + "description": "Configure advanced features and experimental functionality.", + "features": "Feature Flags", + "processing": "Processing", + "endpoints": { + "label": "Endpoints", + "manage": "Manage API Endpoints", + "description": "Endpoint management is configured via YAML. See documentation for details on enabling/disabling specific endpoints." + }, + "enableAlphaFunctionality": { + "label": "Enable Alpha Features", + "description": "Enable experimental and alpha-stage features (may be unstable)" + }, + "enableUrlToPDF": { + "label": "Enable URL to PDF", + "description": "Allow conversion of web pages to PDF documents" + }, + "maxDPI": { + "label": "Maximum DPI", + "description": "Maximum DPI for image processing (0 = unlimited)" + }, + "tessdataDir": { + "label": "Tessdata Directory", + "description": "Path to the tessdata directory for OCR language files" + }, + "disableSanitize": { + "label": "Disable HTML Sanitization", + "description": "WARNING: Security risk - disabling HTML sanitization can lead to XSS vulnerabilities" + }, + "tempFileManagement": { + "label": "Temp File Management", + "description": "Configure temporary file storage and cleanup behavior", + "baseTmpDir": { + "label": "Base Temp Directory", + "description": "Base directory for temporary files (leave empty for default: java.io.tmpdir/stirling-pdf)" + }, + "libreofficeDir": { + "label": "LibreOffice Temp Directory", + "description": "Directory for LibreOffice temp files (leave empty for default: baseTmpDir/libreoffice)" + }, + "systemTempDir": { + "label": "System Temp Directory", + "description": "System temp directory to clean (only used if cleanupSystemTemp is enabled)" + }, + "prefix": { + "label": "Temp File Prefix", + "description": "Prefix for temp file names" + }, + "maxAgeHours": { + "label": "Max Age (hours)", + "description": "Maximum age in hours before temp files are cleaned up" + }, + "cleanupIntervalMinutes": { + "label": "Cleanup Interval (minutes)", + "description": "How often to run cleanup (in minutes)" + }, + "startupCleanup": { + "label": "Startup Cleanup", + "description": "Clean up old temp files on application startup" + }, + "cleanupSystemTemp": { + "label": "Cleanup System Temp", + "description": "Whether to clean broader system temp directory (use with caution)" + } + }, + "processExecutor": { + "label": "Process Executor Limits", + "description": "Configure session limits and timeouts for each process executor", + "sessionLimit": { + "label": "Session Limit", + "description": "Maximum concurrent instances" + }, + "timeout": { + "label": "Timeout (minutes)", + "description": "Maximum execution time" + }, + "libreOffice": "LibreOffice", + "pdfToHtml": "PDF to HTML", + "qpdf": "QPDF", + "tesseract": "Tesseract OCR", + "pythonOpenCv": "Python OpenCV", + "weasyPrint": "WeasyPrint", + "installApp": "Install App", + "calibre": "Calibre", + "ghostscript": "Ghostscript", + "ocrMyPdf": "OCRmyPDF" + } + }, + "mail": { + "title": "Mail Server", + "description": "Configure SMTP settings for sending email notifications.", + "smtp": "SMTP Configuration", + "enabled": { + "label": "Enable Mail", + "description": "Enable email notifications and SMTP functionality" + }, + "host": { + "label": "SMTP Host", + "description": "The hostname or IP address of your SMTP server" + }, + "port": { + "label": "SMTP Port", + "description": "The port number for SMTP connection (typically 25, 465, or 587)" + }, + "username": { + "label": "SMTP Username", + "description": "Username for SMTP authentication" + }, + "password": { + "label": "SMTP Password", + "description": "Password for SMTP authentication" + }, + "from": { + "label": "From Address", + "description": "The email address to use as the sender" + }, + "enableInvites": { + "label": "Enable Email Invites", + "description": "Allow admins to invite users via email with auto-generated passwords" + }, + "frontendUrl": { + "label": "Frontend URL", + "description": "Base URL for frontend (e.g. https://pdf.example.com). Used for generating invite links in emails. Leave empty to use backend URL." + } + }, + "legal": { + "title": "Legal Documents", + "description": "Configure links to legal documents and policies.", + "disclaimer": { + "title": "Legal Responsibility Warning", + "message": "By customizing these legal documents, you assume full responsibility for ensuring compliance with all applicable laws and regulations, including but not limited to GDPR and other EU data protection requirements. Only modify these settings if: (1) you are operating a personal/private instance, (2) you are outside EU jurisdiction and understand your local legal obligations, or (3) you have obtained proper legal counsel and accept sole responsibility for all user data and legal compliance. Stirling-PDF and its developers assume no liability for your legal obligations." + }, + "termsAndConditions": { + "label": "Terms and Conditions", + "description": "URL or filename to terms and conditions" + }, + "privacyPolicy": { + "label": "Privacy Policy", + "description": "URL or filename to privacy policy" + }, + "accessibilityStatement": { + "label": "Accessibility Statement", + "description": "URL or filename to accessibility statement" + }, + "cookiePolicy": { + "label": "Cookie Policy", + "description": "URL or filename to cookie policy" + }, + "impressum": { + "label": "Impressum", + "description": "URL or filename to impressum (required in some jurisdictions)" + } + }, + "premium": { + "title": "Premium & Enterprise", + "description": "Configure your premium or enterprise license key.", + "license": "License Configuration", + "key": { + "label": "License Key", + "description": "Enter your premium or enterprise license key" + }, + "enabled": { + "label": "Enable Premium Features", + "description": "Enable license key checks for pro/enterprise features" + }, + "movedFeatures": { + "title": "Premium Features Distributed", + "message": "Premium and Enterprise features are now organized in their respective sections:" + } + }, + "features": { + "title": "Features", + "description": "Configure optional features and functionality.", + "serverCertificate": { + "label": "Server Certificate", + "description": "Configure server-side certificate generation for \"Sign with Stirling-PDF\" functionality", + "enabled": { + "label": "Enable Server Certificate", + "description": "Enable server-side certificate for \"Sign with Stirling-PDF\" option" + }, + "organizationName": { + "label": "Organization Name", + "description": "Organization name for generated certificates" + }, + "validity": { + "label": "Certificate Validity (days)", + "description": "Number of days the certificate will be valid" + }, + "regenerateOnStartup": { + "label": "Regenerate on Startup", + "description": "Generate new certificate on each application startup" + } + } + }, + "endpoints": { + "title": "API Endpoints", + "description": "Control which API endpoints and endpoint groups are available.", + "management": "Endpoint Management", + "toRemove": { + "label": "Disabled Endpoints", + "description": "Select individual endpoints to disable" + }, + "groupsToRemove": { + "label": "Disabled Endpoint Groups", + "description": "Select endpoint groups to disable" + }, + "note": "Note: Disabling endpoints restricts API access but does not remove UI components. Restart required for changes to take effect." + } + } + }, + "fileUpload": { + "selectFile": "Select a file", + "selectFiles": "Select files", + "selectPdfToView": "Select a PDF to view", + "selectPdfToEdit": "Select a PDF to edit", + "chooseFromStorage": "Choose a file from storage or upload a new PDF", + "chooseFromStorageMultiple": "Choose files from storage or upload new PDFs", + "loadFromStorage": "Load from Storage", + "filesAvailable": "files available", + "loading": "Loading...", + "or": "or", + "dropFileHere": "Drop file here or click to upload", + "dropFilesHere": "Drop files here or click the upload button", + "pdfFilesOnly": "PDF files only", + "supportedFileTypes": "Supported file types", + "upload": "Upload", + "uploadFile": "Upload File", + "uploadFiles": "Upload Files", + "noFilesInStorage": "No files available in storage. Upload some files first.", + "selectFromStorage": "Select from Storage", + "backToTools": "Back to Tools", + "addFiles": "Add Files", + "dragFilesInOrClick": "Drag files in or click \"Add Files\" to browse" + }, + "fileEditor": { + "addFiles": "Add Files" }, "fileManager": { + "title": "Upload PDF Files", + "subtitle": "Add files to your storage for easy access across tools", + "filesSelected": "files selected", + "clearSelection": "Clear Selection", + "openInFileEditor": "Open in File Editor", + "uploadError": "Failed to upload some files.", + "failedToOpen": "Failed to open file. It may have been removed from storage.", + "failedToLoad": "Failed to load file to active set.", + "storageCleared": "Browser cleared storage. Files have been removed. Please re-upload.", + "clearAll": "Clear All", + "reloadFiles": "Reload Files", + "dragDrop": "Drag & Drop files here", + "clickToUpload": "Click to upload files", + "selectedFiles": "Selected Files", + "storage": "Storage", + "filesStored": "files stored", + "storageError": "Storage error occurred", + "storageLow": "Storage is running low. Consider removing old files.", + "supportMessage": "Powered by browser database storage for unlimited capacity", + "noFileSelected": "No files selected", + "showHistory": "Show History", + "hideHistory": "Hide History", + "fileHistory": "File History", + "loadingHistory": "Loading History...", + "lastModified": "Last Modified", + "toolChain": "Tools Applied", + "restore": "Restore", + "unzip": "Unzip", + "searchFiles": "Search files...", + "recent": "Recent", + "localFiles": "Local Files", + "googleDrive": "Google Drive", + "googleDriveShort": "Drive", + "myFiles": "My Files", + "noRecentFiles": "No recent files found", + "googleDriveNotAvailable": "Google Drive integration not available", + "openFiles": "Open Files", + "openFile": "Open File", + "details": "File Details", "fileName": "Izena", + "fileFormat": "Format", + "fileSize": "Size", + "fileVersion": "Version", + "totalSelected": "Total Selected", + "dropFilesHere": "Drop files here", + "selectAll": "Select All", + "deselectAll": "Deselect All", + "deleteSelected": "Delete Selected", + "downloadSelected": "Download Selected", + "selectedCount": "{{count}} selected", "download": "Distira", - "delete": "ezabatu" + "delete": "ezabatu", + "unsupported": "Unsupported", + "addToUpload": "Add to Upload", + "deleteAll": "Delete All", + "loadingFiles": "Loading files...", + "noFiles": "No files available", + "noFilesFound": "No files found matching your search", + "openInPageEditor": "Open in Page Editor", + "showAll": "Show All", + "sortByDate": "Sort by Date", + "sortByName": "Sort by Name", + "sortBySize": "Sort by Size" + }, + "storage": { + "temporaryNotice": "Files are stored temporarily in your browser and may be cleared automatically", + "storageLimit": "Storage limit", + "storageUsed": "Temporary Storage used", + "storageFull": "Storage is nearly full. Consider removing some files.", + "fileTooLarge": "File too large. Maximum size per file is", + "storageQuotaExceeded": "Storage quota exceeded. Please remove some files before uploading more.", + "approximateSize": "Approximate size" }, "sanitize": { + "title": "Sanitise", + "desc": "Remove potentially harmful elements from PDF files.", "submit": "PDF-a desinfektatu", + "completed": "Sanitisation completed successfully", + "error": { + "generic": "Sanitisation failed", + "failed": "An error occurred while sanitising the PDF." + }, + "filenamePrefix": "sanitised", + "sanitizationResults": "Sanitisation Results", "steps": { - "settings": "Ezarpenak" + "files": "Files", + "settings": "Ezarpenak", + "results": "Results" + }, + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "options": { + "title": "Sanitisation Options", + "note": "Select the elements you want to remove from the PDF. At least one option must be selected.", + "removeJavaScript": { + "label": "Remove JavaScript", + "desc": "Remove JavaScript actions and scripts from the PDF" + }, + "removeEmbeddedFiles": { + "label": "Remove Embedded Files", + "desc": "Remove any files embedded within the PDF" + }, + "removeXMPMetadata": { + "label": "Remove XMP Metadata", + "desc": "Remove XMP metadata from the PDF" + }, + "removeMetadata": { + "label": "Remove Document Metadata", + "desc": "Remove document information metadata (title, author, etc.)" + }, + "removeLinks": { + "label": "Remove Links", + "desc": "Remove external links and launch actions from the PDF" + }, + "removeFonts": { + "label": "Remove Fonts", + "desc": "Remove embedded fonts from the PDF" + } + } + }, + "addPassword": { + "title": "Gehitu pasahitza", + "desc": "Encrypt your PDF document with a password.", + "completed": "Password protection applied", + "submit": "Enkriptatu", + "filenamePrefix": "encrypted", + "error": { + "failed": "An error occurred while encrypting the PDF." + }, + "passwords": { + "stepTitle": "Passwords & Encryption", + "completed": "Passwords configured", + "user": { + "label": "User Password", + "placeholder": "Enter user password" + }, + "owner": { + "label": "Owner Password", + "placeholder": "Enter owner password" + } + }, + "encryption": { + "keyLength": { + "label": "Encryption Key Length", + "40bit": "40-bit (Low)", + "128bit": "128-bit (Standard)", + "256bit": "256-bit (High)" + } + }, + "results": { + "title": "Encrypted PDFs" + }, + "tooltip": { + "header": { + "title": "Password Protection Overview" + }, + "passwords": { + "title": "Password Types", + "text": "User passwords restrict opening the document, while owner passwords control what can be done with the document once opened. You can set both or just one.", + "bullet1": "User Password: Required to open the PDF", + "bullet2": "Owner Password: Controls document permissions (not supported by all PDF viewers)" + }, + "encryption": { + "title": "Encryption Levels", + "text": "Higher encryption levels provide better security but may not be supported by older PDF viewers.", + "bullet1": "40-bit: Basic security, compatible with older viewers", + "bullet2": "128-bit: Standard security, widely supported", + "bullet3": "256-bit: Maximum security, requires modern viewers" + }, + "permissions": { + "title": "Aldatu baimenak", + "text": "These permissions control what users can do with the PDF. Most effective when combined with an owner password." + } + }, + "tags": "secure,security", + "header": "Gehitu pasahitza (enkriptatu)", + "selectText": { + "1": "Hautatu PDFa enkriptatzeko", + "2": "Pasahitza", + "3": "Gakoaren luzera", + "4": "Balio altuak sendoagoak dira, baina balio baxuek bateragarritasun hobea dute", + "5": "Ezartzeko baimenak", + "6": "Galarazi dokumentuaren mihiztaketa", + "7": "Galarazi edukia ateratzea", + "8": "Galarazi ateratzea irisgarritasunerako", + "9": "Galarazi inprimakia betetzea", + "10": "Galarazi aldaketak egitea", + "11": "Galarazi oharrak aldatzea", + "12": "Galarazi inprimatzea", + "13": "Galarazi zenbait formatu inprimatzea", + "14": "Pasahitza", + "15": "Mugatu zer egin daitekeen dokumentuarekin behin zabalduta (Irakurle guztiek onartu gabe)", + "16": "Mugatu dokumentu bera zabaltzeko aukera" } }, "changePermissions": { "title": "Aldatu baimenak", + "desc": "Change document restrictions and permissions.", + "completed": "Permissions changed", "submit": "Aldatu baimenak", + "error": { + "failed": "An error occurred while changing PDF permissions." + }, "permissions": { "preventAssembly": { "label": "Galarazi dokumentuaren mihiztaketa" @@ -1683,10 +4580,784 @@ "label": "Galarazi zenbait formatu inprimatzea" } }, + "results": { + "title": "Modified PDFs" + }, "tooltip": { "header": { "title": "Aldatu baimenak" + }, + "description": { + "text": "Changes document permissions, allowing/disallowing access to different features in PDF readers." + }, + "warning": { + "text": "To make these permissions unchangeable, use the Add Password tool to set an owner password." } } + }, + "removePassword": { + "title": "Ezabatu pasahitza", + "desc": "Ezabatu pasahitza PDF dokumentutik", + "tags": "secure,Decrypt,security,unpassword,delete password", + "password": { + "stepTitle": "Ezabatu pasahitza", + "label": "Current Password", + "placeholder": "Enter current password", + "completed": "Password configured" + }, + "filenamePrefix": "decrypted", + "error": { + "failed": "An error occurred while removing the password from the PDF." + }, + "tooltip": { + "description": "Removing password protection requires the password that was used to encrypt the PDF. This will decrypt the document, making it accessible without a password." + }, + "submit": "Ezabatu", + "results": { + "title": "Decrypted PDFs" + }, + "header": "Ezabatu pasahitza (desenkriptatu)", + "selectText": { + "1": "Hautatu PDFa desenkriptatzeko", + "2": "Pasahitza" + } + }, + "automate": { + "title": "Automate", + "desc": "Build multi-step workflows by chaining together PDF actions. Ideal for recurring tasks.", + "invalidStep": "Invalid step", + "files": { + "placeholder": "Select files to process with this automation" + }, + "selection": { + "title": "Automation Selection", + "saved": { + "title": "Saved" + }, + "createNew": { + "title": "Create New Automation" + }, + "suggested": { + "title": "Suggested" + } + }, + "creation": { + "createTitle": "Create Automation", + "editTitle": "Edit Automation", + "intro": "Automations run tools sequentially. To get started, add tools in the order you want them to run.", + "name": { + "label": "Automation Name", + "placeholder": "My Automation" + }, + "description": { + "label": "Description (optional)", + "placeholder": "Describe what this automation does..." + }, + "tools": { + "selectTool": "Select a tool...", + "selected": "Selected Tools", + "remove": "Remove tool", + "configure": "Configure tool", + "notConfigured": "! Not Configured", + "addTool": "Add Tool", + "add": "Add a tool..." + }, + "save": "Save Automation", + "unsavedChanges": { + "title": "Unsaved Changes", + "message": "You have unsaved changes. Are you sure you want to go back? All changes will be lost.", + "cancel": "Cancel", + "confirm": "Go Back" + }, + "icon": { + "label": "Icon" + } + }, + "run": { + "title": "Run Automation" + }, + "sequence": { + "unnamed": "Unnamed Automation", + "steps": "{{count}} steps", + "running": "Running Automation...", + "run": "Run Automation", + "finish": "Finish" + }, + "reviewTitle": "Automation Results", + "config": { + "loading": "Loading tool configuration...", + "noSettings": "This tool does not have configurable settings.", + "title": "Configure {{toolName}}", + "description": "Configure the settings for this tool. These settings will be applied when the automation runs.", + "cancel": "Cancel", + "save": "Save Configuration" + }, + "copyToSaved": "Copy to Saved" + }, + "automation": { + "suggested": { + "securePdfIngestion": "Secure PDF Ingestion", + "securePdfIngestionDesc": "Comprehensive PDF processing workflow that sanitises documents, applies OCR with cleanup, converts to PDF/A format for long-term archival, and optimises file size.", + "emailPreparation": "Email Preparation", + "emailPreparationDesc": "Optimises PDFs for email distribution by compressing files, splitting large documents into 20MB chunks for email compatibility, and removing metadata for privacy.", + "secureWorkflow": "Security Workflow", + "secureWorkflowDesc": "Secures PDF documents by removing potentially malicious content like JavaScript and embedded files, then adds password protection to prevent unauthorised access. Password is set to 'password' by default.", + "processImages": "Process Images", + "processImagesDesc": "Converts multiple image files into a single PDF document, then applies OCR technology to extract searchable text from the images." + } + }, + "common": { + "copy": "Copy", + "copied": "Copied!", + "refresh": "Refresh", + "retry": "Retry", + "remaining": "remaining", + "used": "used", + "available": "available", + "cancel": "Cancel", + "preview": "Preview" + }, + "config": { + "overview": { + "title": "Application Configuration", + "description": "Current application settings and configuration details." + }, + "account": { + "overview": { + "title": "Account Settings", + "manageAccountPreferences": "Manage your account preferences", + "guestDescription": "You are signed in as a guest. Consider upgrading your account above." + }, + "upgrade": { + "title": "Upgrade Guest Account", + "description": "Link your account to preserve your history and access more features!", + "socialLogin": "Upgrade with Social Account", + "linkWith": "Link with", + "emailPassword": "or enter your email & password", + "email": "Email", + "emailPlaceholder": "Enter your email", + "password": "Password (optional)", + "passwordPlaceholder": "Set a password", + "passwordNote": "Leave empty to use email verification only", + "upgradeButton": "Upgrade Account" + } + }, + "apiKeys": { + "description": "Your API key for accessing Stirling's suite of PDF tools. Copy it to your project or refresh to generate a new one.", + "publicKeyAriaLabel": "Public API key", + "copyKeyAriaLabel": "Copy API key", + "refreshAriaLabel": "Refresh API key", + "includedCredits": "Included credits", + "purchasedCredits": "Purchased credits", + "totalCredits": "Total Credits", + "chartAriaLabel": "Credits usage: included {{includedUsed}} of {{includedTotal}}, purchased {{purchasedUsed}} of {{purchasedTotal}}", + "nextReset": "Next Reset", + "lastApiUse": "Last API Use", + "overlayMessage": "Generate a key to see credits and available credits", + "label": "API Key", + "guestInfo": "Guest users do not receive API keys. Create an account to get an API key you can use in your applications.", + "goToAccount": "Go to Account", + "refreshModal": { + "title": "Refresh API Keys", + "warning": "âš ī¸ Warning: This action will generate new API keys and make your previous keys invalid.", + "impact": "Any applications or services currently using these keys will stop working until you update them with the new keys.", + "confirmPrompt": "Are you sure you want to continue?", + "confirmCta": "Refresh Keys" + }, + "generateError": "We couldn't generate your API key." + } + }, + "AddAttachmentsRequest": { + "attachments": "Select Attachments", + "info": "Select files to attach to your PDF. These files will be embedded and accessible through the PDF's attachment panel.", + "selectFiles": "Select Files to Attach", + "placeholder": "Choose files...", + "addMoreFiles": "Add more files...", + "selectedFiles": "Selected Files", + "submit": "Add Attachments", + "results": { + "title": "Attachment Results" + }, + "error": { + "failed": "Add attachments operation failed" + } + }, + "termsAndConditions": "Terms & Conditions", + "logOut": "Log out", + "addAttachments": { + "error": { + "failed": "An error occurred while adding attachments to the PDF." + } + }, + "autoRename": { + "description": "This tool will automatically rename PDF files based on their content. It analyzes the document to find the most suitable title from the text." + }, + "customPosition": "Custom Position", + "details": "Details", + "downloadUnavailable": "Download unavailable for this item", + "invalidUndoData": "Cannot undo: invalid operation data", + "margin": { + "large": "Large", + "medium": "Medium", + "small": "Small", + "xLarge": "Extra Large" + }, + "noFilesToUndo": "Cannot undo: no files were processed in the last operation", + "noOperationToUndo": "No operation to undo", + "noValidFiles": "No valid files to process", + "operationCancelled": "Operation cancelled", + "pageEdit": { + "deselectAll": "Select None", + "selectAll": "Select All" + }, + "quickPosition": "Quick Position", + "reorganizePages": { + "error": { + "failed": "Failed to reorganize pages" + }, + "results": { + "title": "Pages Reorganized" + }, + "settings": { + "title": "Settings" + }, + "submit": "Reorganize Pages" + }, + "replace-color": { + "options": { + "fill": "Fill colour", + "gradient": "Gradient" + }, + "previewOverlayOpacity": "Preview overlay opacity", + "previewOverlayTransparency": "Preview overlay transparency", + "previewOverlayVisibility": "Show preview overlay", + "selectText": { + "1": "Replace or Invert color Options", + "2": "Default(Default high contrast colors)", + "3": "Custom(Customized colors)", + "4": "Full-Invert(Invert all colors)", + "5": "High contrast color options", + "6": "white text on black background", + "7": "Black text on white background", + "8": "Yellow text on black background", + "9": "Green text on black background", + "10": "Choose text Color", + "11": "Choose background Color", + "12": "Choose start colour", + "13": "Choose end colour" + }, + "submit": "Replace", + "title": "Replace-Invert-Color", + "header": "Replace-Invert Color PDF" + }, + "size": "Size", + "submit": "Submit", + "success": "Success", + "tools": { + "noSearchResults": "No tools found", + "noTools": "No tools available" + }, + "undoDataMismatch": "Cannot undo: operation data is corrupted", + "undoFailed": "Failed to undo operation", + "undoQuotaError": "Cannot undo: insufficient storage space", + "undoStorageError": "Undo completed but some files could not be saved to storage", + "undoSuccess": "Operation undone successfully", + "unsupported": "Unsupported", + "onboarding": { + "welcomeModal": { + "title": "Welcome to Stirling PDF!", + "description": "Would you like to take a quick 1-minute tour to learn the key features and how to get started?", + "helpHint": "You can always access this tour later from the Help button in the bottom left.", + "startTour": "Start Tour", + "maybeLater": "Maybe Later", + "dontShowAgain": "Don't Show Again" + }, + "allTools": "This is the All Tools panel, where you can browse and select from all available PDF tools.", + "selectCropTool": "Let's select the Crop tool to demonstrate how to use one of the tools.", + "toolInterface": "This is the Crop tool interface. As you can see, there's not much there because we haven't added any PDF files to work with yet.", + "filesButton": "The Files button on the Quick Access bar allows you to upload PDFs to use the tools on.", + "fileSources": "You can upload new files or access recent files from here. For the tour, we'll just use a sample file.", + "workbench": "This is the Workbench - the main area where you view and edit your PDFs.", + "viewSwitcher": "Use these controls to select how you want to view your PDFs.", + "viewer": "The Viewer lets you read and annotate your PDFs.", + "pageEditor": "The Page Editor allows you to do various operations on the pages within your PDFs, such as reordering, rotating and deleting.", + "activeFiles": "The Active Files view shows all of the PDFs you have loaded into the tool, and allows you to select which ones to process.", + "fileCheckbox": "Clicking one of the files selects it for processing. You can select multiple files for batch operations.", + "selectControls": "The Right Rail contains buttons to quickly select/deselect all of your active PDFs, along with buttons to change the app's theme or language.", + "cropSettings": "Now that we've selected the file we want crop, we can configure the Crop tool to choose the area that we want to crop the PDF to.", + "runButton": "Once the tool has been configured, this button allows you to run the tool on all the selected PDFs.", + "results": "After the tool has finished running, the Review step will show a preview of the results in this panel, and allow you to undo the operation or download the file. ", + "fileReplacement": "The modified file will replace the original file in the Workbench automatically, allowing you to easily run it through more tools.", + "pinButton": "You can use the Pin button if you'd rather your files stay active after running tools on them.", + "wrapUp": "You're all set! You've learnt about the main areas of the app and how to use them. Click the Help button whenever you like to see this tour again.", + "previous": "Previous", + "next": "Next", + "finish": "Finish", + "startTour": "Start Tour", + "startTourDescription": "Take a guided tour of Stirling PDF's key features" + }, + "workspace": { + "title": "Workspace", + "people": { + "title": "People", + "description": "Manage workspace members and their permissions", + "loading": "Loading people...", + "searchMembers": "Search members...", + "addMembers": "Add Members", + "inviteMembers": { + "label": "Invite Members", + "subtitle": "Type or paste in emails below, separated by commas. Your workspace will be billed by members." + }, + "user": "User", + "role": "Role", + "team": "Team", + "status": "Status", + "actions": "Actions", + "noMembersFound": "No members found", + "active": "Active", + "disabled": "Disabled", + "activeSession": "Active session", + "member": "Member", + "admin": "Admin", + "roleDescriptions": { + "admin": "Can manage settings and invite members, with full administrative access.", + "member": "Can view and edit shared files, but cannot manage workspace settings or members." + }, + "editRole": "Edit Role", + "enable": "Enable", + "disable": "Disable", + "deleteUser": "Delete User", + "deleteUserSuccess": "User deleted successfully", + "deleteUserError": "Failed to delete user", + "confirmDelete": "Are you sure you want to delete this user? This action cannot be undone.", + "addMember": { + "title": "Add Member", + "username": "Username (Email)", + "usernamePlaceholder": "user@example.com", + "password": "Password", + "passwordPlaceholder": "Enter password", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "forcePasswordChange": "Force password change on first login", + "cancel": "Cancel", + "submit": "Add Member", + "usernameRequired": "Username and password are required", + "passwordTooShort": "Password must be at least 6 characters", + "success": "User created successfully", + "error": "Failed to create user" + }, + "editMember": { + "title": "Edit Member", + "editing": "Editing:", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "cancel": "Cancel", + "submit": "Update Member", + "success": "User updated successfully", + "error": "Failed to update user" + }, + "toggleEnabled": { + "success": "User status updated successfully", + "error": "Failed to update user status" + }, + "delete": { + "success": "User deleted successfully", + "error": "Failed to delete user" + }, + "emailInvite": { + "tab": "Email Invite", + "description": "Type or paste in emails below, separated by commas. Users will receive login credentials via email.", + "emails": "Email Addresses", + "emailsPlaceholder": "user1@example.com, user2@example.com", + "emailsRequired": "At least one email address is required", + "submit": "Send Invites", + "success": "user(s) invited successfully", + "partialSuccess": "Some invites failed", + "allFailed": "Failed to invite users", + "error": "Failed to send invites" + }, + "directInvite": { + "tab": "Direct Create" + }, + "inviteLinkTab": { + "tab": "Invite Link" + }, + "inviteLink": { + "description": "Generate a secure link that allows the user to set their own password", + "email": "Email Address", + "emailPlaceholder": "user@example.com (optional)", + "emailDescription": "Optional - leave blank for a general invite link that can be used by anyone", + "emailRequired": "Email address is required", + "emailOptional": "Optional - leave blank for a general invite link", + "emailRequiredForSend": "Email address is required to send email notification", + "expiryHours": "Expiry Hours", + "expiryDescription": "How many hours until the link expires", + "sendEmail": "Send invite link via email", + "sendEmailDescription": "If enabled, the invite link will be sent to the specified email address", + "smtpRequired": "SMTP not configured", + "generate": "Generate Link", + "generated": "Invite Link Generated", + "copied": "Link copied to clipboard", + "success": "Invite link generated successfully", + "successWithEmail": "Invite link generated and sent via email", + "emailFailed": "Invite link generated, but email failed", + "emailFailedDetails": "Error: {0}. Please share the invite link manually.", + "error": "Failed to generate invite link", + "submit": "Generate Invite Link" + }, + "inviteMode": { + "username": "Username", + "email": "Email", + "link": "Link", + "emailDisabled": "Email invites require SMTP configuration and mail.enableInvites=true in settings" + }, + "license": { + "users": "users", + "availableSlots": "Available Slots", + "grandfathered": "Grandfathered", + "grandfatheredShort": "{{count}} grandfathered", + "fromLicense": "from license", + "slotsAvailable": "{{count}} user slot(s) available", + "noSlotsAvailable": "No slots available", + "currentUsage": "Currently using {{current}} of {{max}} user licences" + } + }, + "teams": { + "title": "Teams", + "description": "Manage teams and organize workspace members", + "loading": "Loading teams...", + "loadingDetails": "Loading team details...", + "createNewTeam": "Create New Team", + "teamName": "Team Name", + "totalMembers": "Total Members", + "actions": "Actions", + "noTeamsFound": "No teams found", + "noMembers": "No members in this team", + "system": "System", + "addMember": "Add Member", + "viewTeam": "View Team", + "removeMember": "Remove from team", + "cannotRemoveFromSystemTeam": "Cannot remove from system team", + "renameTeamLabel": "Rename Team", + "deleteTeamLabel": "Delete Team", + "cannotDeleteInternal": "Cannot delete the Internal team", + "confirmDelete": "Are you sure you want to delete this team? This team must be empty to delete.", + "confirmRemove": "Remove user from this team?", + "cannotRenameInternal": "Cannot rename the Internal team", + "cannotAddToInternal": "Cannot add members to the Internal team", + "teamNotFound": "Team not found", + "backToTeams": "Back to Teams", + "memberCount": "{{count}} members", + "removeMemberSuccess": "User removed from team", + "removeMemberError": "Failed to remove user from team", + "createTeam": { + "title": "Create New Team", + "teamName": "Team Name", + "teamNamePlaceholder": "Enter team name", + "cancel": "Cancel", + "submit": "Create Team", + "nameRequired": "Team name is required", + "success": "Team created successfully", + "error": "Failed to create team" + }, + "renameTeam": { + "title": "Rename Team", + "renaming": "Renaming:", + "newTeamName": "New Team Name", + "newTeamNamePlaceholder": "Enter new team name", + "cancel": "Cancel", + "submit": "Rename Team", + "nameRequired": "Team name is required", + "success": "Team renamed successfully", + "error": "Failed to rename team" + }, + "deleteTeam": { + "success": "Team deleted successfully", + "error": "Failed to delete team. Make sure the team is empty.", + "teamMustBeEmpty": "Team must be empty before deletion" + }, + "addMemberToTeam": { + "title": "Add Member to Team", + "addingTo": "Adding to", + "selectUser": "Select User", + "selectUserPlaceholder": "Choose a user", + "selectUserRequired": "Please select a user", + "currentlyIn": "currently in", + "willBeMoved": "Note: This user will be moved from their current team to this team.", + "cancel": "Cancel", + "submit": "Add Member", + "userRequired": "Please select a user", + "success": "Member added to team successfully", + "error": "Failed to add member to team" + }, + "changeTeam": { + "label": "Change Team", + "title": "Change Team", + "changing": "Moving", + "selectTeam": "Select Team", + "selectTeamPlaceholder": "Choose a team", + "selectTeamRequired": "Please select a team", + "success": "Team changed successfully", + "error": "Failed to change team", + "submit": "Change Team" + } + } + }, + "plan": { + "currency": "Currency", + "popular": "Popular", + "current": "Current Plan", + "upgrade": "Upgrade", + "contact": "Contact Us", + "customPricing": "Custom", + "showComparison": "Compare All Features", + "hideComparison": "Hide Feature Comparison", + "featureComparison": "Feature Comparison", + "activePlan": { + "title": "Active Plan", + "subtitle": "Your current subscription details" + }, + "availablePlans": { + "title": "Available Plans", + "subtitle": "Choose the plan that fits your needs" + }, + "static": { + "title": "Billing Information", + "message": "Online billing is not currently configured. To upgrade your plan or manage subscriptions, please contact us directly.", + "contactSales": "Contact Sales", + "contactToUpgrade": "Contact us to upgrade or customize your plan", + "maxUsers": "Max Users", + "upTo": "Up to" + }, + "period": { + "month": "month" + }, + "free": { + "name": "Free", + "highlight1": "Limited Tool Usage Per week", + "highlight2": "Access to all tools", + "highlight3": "Community support" + }, + "pro": { + "name": "Pro", + "highlight1": "Unlimited Tool Usage", + "highlight2": "Advanced PDF tools", + "highlight3": "No watermarks" + }, + "enterprise": { + "name": "Enterprise", + "highlight1": "Custom pricing", + "highlight2": "Dedicated support", + "highlight3": "Latest features" + }, + "feature": { + "title": "Feature", + "pdfTools": "Basic PDF Tools", + "fileSize": "File Size Limit", + "automation": "Automate tool workflows", + "api": "API Access", + "priority": "Priority Support", + "customPricing": "Custom Pricing" + } + }, + "subscription": { + "status": { + "active": "Active", + "pastDue": "Past Due", + "canceled": "Canceled", + "incomplete": "Incomplete", + "trialing": "Trial", + "none": "No Subscription" + }, + "renewsOn": "Renews on {{date}}", + "cancelsOn": "Cancels on {{date}}" + }, + "billing": { + "manageBilling": "Manage Billing", + "portal": { + "error": "Failed to open billing portal" + } + }, + "payment": { + "preparing": "Preparing your checkout...", + "upgradeTitle": "Upgrade to {{planName}}", + "success": "Payment Successful!", + "successMessage": "Your subscription has been activated successfully. You will receive a confirmation email shortly.", + "autoClose": "This window will close automatically...", + "error": "Payment Error" + }, + "firstLogin": { + "title": "First Time Login", + "welcomeTitle": "Welcome!", + "welcomeMessage": "For security reasons, you must change your password on your first login.", + "loggedInAs": "Logged in as", + "error": "Error", + "currentPassword": "Current Password", + "enterCurrentPassword": "Enter your current password", + "newPassword": "New Password", + "enterNewPassword": "Enter new password (min 8 characters)", + "confirmPassword": "Confirm New Password", + "reEnterNewPassword": "Re-enter new password", + "changePassword": "Change Password", + "allFieldsRequired": "All fields are required", + "passwordsDoNotMatch": "New passwords do not match", + "passwordTooShort": "Password must be at least 8 characters", + "passwordMustBeDifferent": "New password must be different from current password", + "passwordChangedSuccess": "Password changed successfully! Please log in again.", + "passwordChangeFailed": "Failed to change password. Please check your current password." + }, + "invite": { + "welcome": "Welcome to Stirling PDF", + "invalidToken": "Invalid invitation link", + "validationError": "Failed to validate invitation link", + "passwordRequired": "Password is required", + "passwordTooShort": "Password must be at least 6 characters", + "passwordMismatch": "Passwords do not match", + "acceptError": "Failed to create account", + "validating": "Validating invitation...", + "invalidInvitation": "Invalid Invitation", + "goToLogin": "Go to Login", + "welcomeTitle": "You've been invited!", + "welcomeSubtitle": "Complete your account setup to get started", + "accountFor": "Creating account for", + "linkExpires": "Link expires", + "email": "Email address", + "emailPlaceholder": "Enter your email address", + "emailRequired": "Email address is required", + "invalidEmail": "Invalid email address", + "choosePassword": "Choose a password", + "passwordPlaceholder": "Enter your password", + "confirmPassword": "Confirm password", + "confirmPasswordPlaceholder": "Re-enter your password", + "createAccount": "Create Account", + "creating": "Creating Account...", + "alreadyHaveAccount": "Already have an account?", + "signIn": "Sign in" + }, + "audit": { + "error": { + "title": "Error loading audit system" + }, + "notAvailable": "Audit system not available", + "notAvailableMessage": "The audit system is not configured or not available.", + "disabled": "Audit logging is disabled", + "disabledMessage": "Enable audit logging in your application configuration to track system events.", + "systemStatus": { + "title": "System Status", + "status": "Audit Logging", + "enabled": "Enabled", + "disabled": "Disabled", + "level": "Audit Level", + "retention": "Retention Period", + "days": "days", + "totalEvents": "Total Events" + }, + "tabs": { + "dashboard": "Dashboard", + "events": "Audit Events", + "export": "Export" + }, + "charts": { + "title": "Audit Dashboard", + "error": "Error loading charts", + "day": "Day", + "week": "Week", + "month": "Month", + "byType": "Events by Type", + "byUser": "Events by User", + "overTime": "Events Over Time" + }, + "events": { + "title": "Audit Events", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "error": "Error loading events", + "noEvents": "No events found", + "timestamp": "Timestamp", + "type": "Type", + "user": "User", + "ipAddress": "IP Address", + "actions": "Actions", + "viewDetails": "View Details", + "eventDetails": "Event Details", + "details": "Details" + }, + "export": { + "title": "Export Audit Data", + "description": "Export audit events to CSV or JSON format. Use filters to limit the exported data.", + "format": "Export Format", + "filters": "Filters (Optional)", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "exportButton": "Export Data", + "error": "Failed to export data" + } + }, + "usage": { + "noData": "No data available", + "error": "Error loading usage statistics", + "noDataMessage": "No usage statistics are currently available.", + "controls": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All", + "refresh": "Refresh", + "dataTypeLabel": "Data Type:", + "dataType": { + "all": "All", + "api": "API", + "ui": "UI" + } + }, + "showing": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All" + }, + "stats": { + "totalEndpoints": "Total Endpoints", + "totalVisits": "Total Visits", + "showing": "Showing", + "selectedVisits": "Selected Visits" + }, + "chart": { + "title": "Endpoint Usage Chart" + }, + "table": { + "title": "Detailed Statistics", + "endpoint": "Endpoint", + "visits": "Visits", + "percentage": "Percentage", + "noData": "No data available" + } + }, + "backendHealth": { + "checking": "Checking backend status...", + "online": "Backend Online", + "offline": "Backend Offline" + }, + "autoRedact": { + "tags": "Redact,Hide,black out,black,marker,hidden", + "title": "Auto Idatzi", + "header": "Auto Idatzi", + "colorLabel": "Kolorea", + "textsToRedactLabel": "Idazteko testua (lerro bidez bereizia)", + "textsToRedactPlaceholder": "adib. \\nKonfidentziala \\nTop-Secret", + "useRegexLabel": "Regex erabili", + "wholeWordSearchLabel": "Hitz osoen bilaketa", + "customPaddingLabel": "Custom Extra Padding", + "convertPDFToImageLabel": "Bihurtu PDF fitxategi bat PDF-Irudi-ra (kaxaren atzean testua ezabatzeko erabilia)", + "submitButton": "Bidali" + }, + "replaceColorPdf": { + "tags": "Replace Color,Page operations,Back end,server side" } -} \ No newline at end of file +} diff --git a/frontend/public/locales/fa-IR/translation.json b/frontend/public/locales/fa-IR/translation.json index b28d68860..0e85d7359 100644 --- a/frontend/public/locales/fa-IR/translation.json +++ b/frontend/public/locales/fa-IR/translation.json @@ -1,4 +1,40 @@ { + "toolPanel": { + "modePrompt": { + "title": "Choose how you browse tools", + "description": "Preview both layouts and decide how you want to explore Stirling PDF tools.", + "sidebarTitle": "Sidebar mode", + "sidebarDescription": "Keep tools alongside your workspace for quick switching.", + "recommended": "Recommended", + "chooseSidebar": "Use sidebar mode", + "fullscreenTitle": "Fullscreen mode - (legacy)", + "fullscreenDescription": "Browse every tool in a catalogue that covers the workspace until you pick one.", + "chooseFullscreen": "Use fullscreen mode", + "dismiss": "Maybe later" + }, + "fullscreen": { + "showDetails": "Show Details", + "comingSoon": "Coming soon:", + "favorite": "Add to favourites", + "favorites": "Favourites", + "heading": "All tools (fullscreen view)", + "noResults": "Try adjusting your search or toggle descriptions to find what you need.", + "recommended": "Recommended", + "unfavorite": "Remove from favourites" + }, + "placeholder": "Choose a tool to get started", + "toggle": { + "fullscreen": "Switch to fullscreen mode", + "sidebar": "Switch to sidebar mode" + } + }, + "unsavedChanges": "You have unsaved changes to your PDF.", + "areYouSure": "Are you sure you want to leave?", + "unsavedChangesTitle": "Unsaved Changes", + "keepWorking": "Keep Working", + "discardChanges": "Discard & Leave", + "applyAndContinue": "Save & Leave", + "exportAndContinue": "Export & Continue", "language": { "direction": "rtl" }, @@ -18,8 +54,26 @@ "customTextDesc": "Ų…ØĒŲ† ØŗŲØ§ØąØ´ÛŒ", "numberPagesDesc": "ÚŠØ¯Ø§Ų… ØĩŲØ­Ø§ØĒ Ø´Ų…Ø§ØąŲ‡â€ŒÚ¯Ø°Ø§ØąÛŒ Ø´ŲˆŲ†Ø¯ØŒ ŲžÛŒØ´â€ŒŲØąØļ 'Ų‡Ų…Ų‡'، Ų‡Ų…Ú†Ų†ÛŒŲ† Ų…ÛŒâ€ŒØĒŲˆØ§Ų†ÛŒØ¯ 1-5 یا 2,5,9 ØąØ§ ŲˆØ§ØąØ¯ ÚŠŲ†ÛŒØ¯.", "customNumberDesc": "Ø¨Ų‡â€ŒØˇŲˆØą ŲžÛŒØ´â€ŒŲØąØļ {n}، Ų‡Ų…Ú†Ų†ÛŒŲ† Ų…ÛŒâ€ŒØĒŲˆØ§Ų†ÛŒØ¯ 'ØĩŲØ­Ų‡ {n} Ø§Ø˛ {total}'، 'Ų…ØĒŲ†-{n}'، '{filename}-{n}' ØąØ§ ŲˆØ§ØąØ¯ ÚŠŲ†ÛŒØ¯.", - "submit": "اØļØ§ŲŲ‡ ÚŠØąØ¯Ų† Ø´Ų…Ø§ØąŲ‡ ØĩŲØ­Ø§ØĒ" + "submit": "اØļØ§ŲŲ‡ ÚŠØąØ¯Ų† Ø´Ų…Ø§ØąŲ‡ ØĩŲØ­Ø§ØĒ", + "configuration": "Configuration", + "customize": "Customize Appearance", + "pagesAndStarting": "Pages & Starting Number", + "positionAndPages": "Position & Pages", + "error": { + "failed": "Add page numbers operation failed" + }, + "results": { + "title": "Page Number Results" + }, + "preview": "Position Selection", + "previewDisclaimer": "Preview is approximate. Final output may vary due to PDF font metrics." }, + "pageSelectionPrompt": "Ø§Ų†ØĒ؎اب ØĩŲØ­Ø§ØĒ ØŗŲØ§ØąØ´ÛŒ (یڊ Ų„ÛŒØŗØĒ Ø§Ø˛ Ø´Ų…Ø§ØąŲ‡ ØĩŲØ­Ø§ØĒ Ø¨Ų‡ ØĩŲˆØąØĒ ØŦدا Ø´Ø¯Ų‡ با ÚŠØ§Ų…Ø§ ŲˆØ§ØąØ¯ ÚŠŲ†ÛŒØ¯ Ų…Ø§Ų†Ų†Ø¯ 1,5,6 یا Ø§Ø˛ ØĒŲˆØ§Ø¨ØšÛŒ Ų…Ø§Ų†Ų†Ø¯ 2n+1 Ø§ØŗØĒŲØ§Ø¯Ų‡ ÚŠŲ†ÛŒØ¯):", + "startingNumberTooltip": "The first number to display. Subsequent pages will increment from this number.", + "marginTooltip": "Distance between the page number and the edge of the page.", + "fontSizeTooltip": "Size of the page number text in points. Larger numbers create bigger text.", + "fontTypeTooltip": "Font family for the page numbers. Choose based on your document style.", + "customTextTooltip": "Optional custom format for page numbers. Use {n} as placeholder for the number. Example: \"Page {n}\" will show \"Page 1\", \"Page 2\", etc.", "pdfPrompt": "Ø§Ų†ØĒ؎اب ŲØ§ÛŒŲ„(Ų‡Ø§ÛŒ) PDF", "multiPdfPrompt": "Ø§Ų†ØĒ؎اب ŲØ§ÛŒŲ„â€ŒŲ‡Ø§ÛŒ PDF (Ø¯Ųˆ یا بیشØĒØą)", "multiPdfDropPrompt": "Ø§Ų†ØĒ؎اب (یا ÚŠØ´ÛŒØ¯Ų† ؈ ØąŲ‡Ø§ ÚŠØąØ¯Ų†) ØĒŲ…Ø§Ų… ŲØ§ÛŒŲ„â€ŒŲ‡Ø§ÛŒ PDF Ų…ŲˆØąØ¯ Ų†ÛŒØ§Ø˛", @@ -30,15 +84,41 @@ "uploadLimitExceededPlural": "are too large. Maximum allowed size is", "processTimeWarning": "Ų‡Ø´Ø¯Ø§Øą: Ø§ÛŒŲ† ŲØąØĸÛŒŲ†Ø¯ Ų…Ų…ÚŠŲ† Ø§ØŗØĒ Ø¨ØŗØĒŲ‡ Ø¨Ų‡ Ø§Ų†Ø¯Ø§Ø˛Ų‡ ŲØ§ÛŒŲ„ ØĒا یڊ Ø¯Ų‚ÛŒŲ‚Ų‡ ØˇŲˆŲ„ بڊشد", "pageOrderPrompt": "ØĒØąØĒیب ØĩŲØ­Ø§ØĒ ØŗŲØ§ØąØ´ÛŒ (یڊ Ų„ÛŒØŗØĒ Ø§Ø˛ Ø´Ų…Ø§ØąŲ‡ ØĩŲØ­Ø§ØĒ Ø¨Ų‡ ØĩŲˆØąØĒ ØŦدا Ø´Ø¯Ų‡ با ÚŠØ§Ų…Ø§ ŲˆØ§ØąØ¯ ÚŠŲ†ÛŒØ¯ یا Ø§Ø˛ ØĒŲˆØ§Ø¨ØšÛŒ Ų…Ø§Ų†Ų†Ø¯ 2n+1 Ø§ØŗØĒŲØ§Ø¯Ų‡ ÚŠŲ†ÛŒØ¯):", - "pageSelectionPrompt": "Ø§Ų†ØĒ؎اب ØĩŲØ­Ø§ØĒ ØŗŲØ§ØąØ´ÛŒ (یڊ Ų„ÛŒØŗØĒ Ø§Ø˛ Ø´Ų…Ø§ØąŲ‡ ØĩŲØ­Ø§ØĒ Ø¨Ų‡ ØĩŲˆØąØĒ ØŦدا Ø´Ø¯Ų‡ با ÚŠØ§Ų…Ø§ ŲˆØ§ØąØ¯ ÚŠŲ†ÛŒØ¯ Ų…Ø§Ų†Ų†Ø¯ 1,5,6 یا Ø§Ø˛ ØĒŲˆØ§Ø¨ØšÛŒ Ų…Ø§Ų†Ų†Ø¯ 2n+1 Ø§ØŗØĒŲØ§Ø¯Ų‡ ÚŠŲ†ÛŒØ¯):", "goToPage": "Ø¨ØąŲˆ", "true": "Ø¯ØąØŗØĒ", "false": "ØēŲ„Øˇ", "unknown": "Ų†Ø§Ų…ØšŲ„ŲˆŲ…", + "app": { + "description": "The Free Adobe Acrobat alternative (10M+ Downloads)" + }, "save": "Ø°ØŽÛŒØąŲ‡", "saveToBrowser": "Ø°ØŽÛŒØąŲ‡ Ø¯Øą Ų…ØąŲˆØąÚ¯Øą", + "download": "Ø¯Ø§Ų†Ų„ŲˆØ¯", + "pin": "Pin File (keep active after tool run)", + "unpin": "Unpin File (replace after tool run)", + "undoOperationTooltip": "Click to undo the last operation and restore the original files", + "undo": "Undo", + "moreOptions": "More Options", + "editYourNewFiles": "Edit your new file(s)", "close": "Ø¨ØŗØĒŲ†", + "openInViewer": "Open in Viewer", + "confirmClose": "Confirm Close", + "confirmCloseMessage": "Are you sure you want to close this file?", + "confirmCloseCancel": "Cancel", + "confirmCloseConfirm": "Close File", + "fileSelected": "Selected: {{filename}}", + "chooseFile": "Choose File", "filesSelected": "ŲØ§ÛŒŲ„â€ŒŲ‡Ø§ Ø§Ų†ØĒ؎اب Ø´Ø¯Ų†Ø¯", + "files": { + "title": "Files", + "upload": "Upload", + "uploadFiles": "Upload Files", + "addFiles": "Add files", + "selectFromWorkbench": "Select files from the workbench or ", + "selectMultipleFromWorkbench": "Select at least {{count}} files from the workbench or ", + "created": "Created", + "size": "File Size" + }, "noFavourites": "Ų‡ÛŒÚ† Ų…ŲˆØąØ¯ Ø¯Ų„ØŽŲˆØ§Ų‡ÛŒ اØļØ§ŲŲ‡ Ų†Ø´Ø¯Ų‡ Ø§ØŗØĒ", "downloadComplete": "Ø¯Ø§Ų†Ų„ŲˆØ¯ ÚŠØ§Ų…Ų„ شد", "bored": "Ų…Ų†ØĒØ¸Øą Ų…Ø§Ų†Ø¯Ų† ØŽØŗØĒŲ‡â€ŒÚŠŲ†Ų†Ø¯Ų‡ Ø§ØŗØĒ؟", @@ -56,7 +136,10 @@ }, "error": { "pdfPassword": "ØŗŲ†Ø¯ PDF Ø¯Ø§ØąØ§ÛŒ ØąŲ…Ø˛ ØšØ¨ŲˆØą Ø§ØŗØĒ ؈ یا ØąŲ…Ø˛ ØšØ¨ŲˆØą ŲˆØ§ØąØ¯ Ų†Ø´Ø¯Ų‡ یا Ų†Ø§Ø¯ØąØŗØĒ Ø§ØŗØĒ", + "encryptedPdfMustRemovePassword": "This PDF is encrypted or password-protected. Please unlock it before converting to PDF/A.", + "incorrectPasswordProvided": "The PDF password is incorrect or not provided.", "_value": "ØŽØˇØ§", + "dismissAllErrors": "Dismiss All Errors", "sorry": "Ų…ØĒØŖØŗŲÛŒŲ… Ø¨ØąØ§ÛŒ Ų…Ø´ÚŠŲ„ Ų…ŲˆØŦŲˆØ¯!", "needHelp": "Ų†ÛŒØ§Ø˛ Ø¨Ų‡ ÚŠŲ…ÚŠ / ÛŒØ§ŲØĒŲ† Ų…Ø´ÚŠŲ„ÛŒØŸ", "contactTip": "Ø§Ú¯Øą Ų‡Ų†ŲˆØ˛ Ų…Ø´ÚŠŲ„ÛŒ Ø¯Ø§ØąÛŒØ¯ØŒ Ø¯ØąÛŒØē Ų†ÚŠŲ†ÛŒØ¯ ÚŠŲ‡ با Ų…Ø§ ØĒŲ…Ø§Øŗ Ø¨Ú¯ÛŒØąÛŒØ¯. Ų…ÛŒâ€ŒØĒŲˆØ§Ų†ÛŒØ¯ یڊ ØĒیڊØĒ Ø¯Øą ØĩŲØ­Ų‡ GitHub Ų…Ø§ Ø§ØąØŗØ§Ų„ ÚŠŲ†ÛŒØ¯ یا Ø§Ø˛ ØˇØąÛŒŲ‚ Discord با Ų…Ø§ ØĒŲ…Ø§Øŗ Ø¨Ú¯ÛŒØąÛŒØ¯:", @@ -71,6 +154,10 @@ "githubSubmit": "GitHub - Ø§ØąØŗØ§Ų„ ØĒیڊØĒ", "discordSubmit": "Discord - Ø§ØąØŗØ§Ų„ ŲžØŗØĒ ŲžØ´ØĒÛŒØ¨Ø§Ų†ÛŒ" }, + "warning": { + "tooltipTitle": "Warning" + }, + "edit": "Edit", "delete": "Ø­Ø°Ų", "username": "Ų†Ø§Ų… ÚŠØ§ØąØ¨ØąÛŒ", "password": "ØąŲ…Ø˛ ØšØ¨ŲˆØą", @@ -82,6 +169,7 @@ "green": "ØŗØ¨Ø˛", "blue": "Øĸبی", "custom": "ØŗŲØ§ØąØ´ÛŒ...", + "comingSoon": "Coming soon", "WorkInProgess": "ÚŠØ§Øą Ø¯Øą Ø­Ø§Ų„ ŲžÛŒØ´ØąŲØĒ Ø§ØŗØĒ، Ų…Ų…ÚŠŲ† Ø§ØŗØĒ ÚŠØ§Øą Ų†ÚŠŲ†Ø¯ یا Ø¯Ø§ØąØ§ÛŒ Ø§Ø´ÚŠØ§Ų„ باشد، Ų„ØˇŲØ§Ų‹ Ų‡Øą Ų…Ø´ÚŠŲ„ÛŒ ØąØ§ Ú¯Ø˛Ø§ØąØ´ Ø¯Ų‡ÛŒØ¯!", "poweredBy": "Ų‚Ø¯ØąØĒ Ú¯ØąŲØĒŲ‡ Ø§Ø˛", "yes": "Ø¨Ų„Ų‡", @@ -115,12 +203,14 @@ "page": "ØĩŲØ­Ų‡", "pages": "ØĩŲØ­Ø§ØĒ", "loading": "Ø¯Øą Ø­Ø§Ų„ Ø¨Ø§ØąÚ¯Ø°Ø§ØąÛŒ...", + "review": "Review", "addToDoc": "اØļØ§ŲŲ‡ ÚŠØąØ¯Ų† Ø¨Ų‡ ØŗŲ†Ø¯", "reset": "ØĒŲ†Ø¸ÛŒŲ… Ų…ØŦدد", "apply": "Apply", "noFileSelected": "No file selected. Please upload one.", "legal": { "privacy": "ØŗÛŒØ§ØŗØĒ Ø­ŲØ¸ Ø­ØąÛŒŲ… ØŽØĩ؈Øĩی", + "iAgreeToThe": "I agree to all of the", "terms": "Ø´ØąØ§ÛŒØˇ ؈ ØļŲˆØ§Ø¨Øˇ", "accessibility": "Ø¯ØŗØĒØąØŗÛŒ", "cookie": "ØŗÛŒØ§ØŗØĒ ÚŠŲˆÚŠÛŒâ€ŒŲ‡Ø§", @@ -160,6 +250,7 @@ "title": "Øĸیا Ų…ÛŒâ€ŒØŽŲˆØ§Ų‡ÛŒØ¯ Stirling PDF ØąØ§ Ø¨Ų‡ØĒØą ÚŠŲ†ÛŒØ¯ØŸ", "paragraph1": "Stirling PDF Ø§Ø˛ ØĒØ­Ų„ÛŒŲ„â€ŒŲ‡Ø§ÛŒ ا؎ØĒÛŒØ§ØąÛŒ Ø§ØŗØĒŲØ§Ø¯Ų‡ Ų…ÛŒâ€ŒÚŠŲ†Ø¯ ØĒا Ø¨Ų‡ Ų…Ø§ Ø¯Øą Ø¨Ų‡Ø¨ŲˆØ¯ Ų…Ø­ØĩŲˆŲ„ ÚŠŲ…ÚŠ ÚŠŲ†Ø¯. Ų…Ø§ Ų‡ÛŒÚ† Ø§ØˇŲ„Ø§ØšØ§ØĒ Ø´ØŽØĩی یا Ų…Ø­ØĒŲˆØ§ÛŒ ŲØ§ÛŒŲ„ ØąØ§ ØąØ¯ÛŒØ§Ø¨ÛŒ Ų†Ų…ÛŒâ€ŒÚŠŲ†ÛŒŲ….", "paragraph2": "Ų„ØˇŲØ§Ų‹ Ø¯Øą Ų†Ø¸Øą Ø¨Ú¯ÛŒØąÛŒØ¯ ÚŠŲ‡ ØĒØ­Ų„ÛŒŲ„â€ŒŲ‡Ø§ ØąØ§ ŲØšØ§Ų„ ÚŠŲ†ÛŒØ¯ ØĒا Ø¨Ų‡ ØąØ´Ø¯ Stirling PDF ÚŠŲ…ÚŠ ÚŠØąØ¯Ų‡ ؈ Ų…Ø§ ØąØ§ Ø¯Øą Ø¯ØąÚŠ Ø¨Ų‡ØĒØą ÚŠØ§ØąØ¨ØąØ§Ų† ÛŒØ§ØąÛŒ ÚŠŲ†ÛŒØ¯.", + "learnMore": "Learn more", "enable": "ŲØšØ§Ų„ ÚŠØąØ¯Ų† ØĒØ­Ų„ÛŒŲ„â€ŒŲ‡Ø§", "disable": "ØēÛŒØąŲØšØ§Ų„ ÚŠØąØ¯Ų† ØĒØ­Ų„ÛŒŲ„â€ŒŲ‡Ø§", "settings": "Ų…ÛŒâ€ŒØĒŲˆØ§Ų†ÛŒØ¯ ØĒŲ†Ø¸ÛŒŲ…Ø§ØĒ Ų…ØąØ¨ŲˆØˇ Ø¨Ų‡ ØĒØ­Ų„ÛŒŲ„â€ŒŲ‡Ø§ ØąØ§ Ø¯Øą ŲØ§ÛŒŲ„ config/settings.yml ØĒØēÛŒÛŒØą Ø¯Ų‡ÛŒØ¯" @@ -203,6 +294,54 @@ "cacheInputs": { "name": "Ø°ØŽÛŒØąŲ‡ ŲˆØąŲˆØ¯ÛŒâ€ŒŲ‡Ø§ÛŒ ŲØąŲ…", "help": "ŲØšØ§Ų„ ÚŠØąØ¯Ų† Ø¨ØąØ§ÛŒ Ø°ØŽÛŒØąŲ‡ ŲˆØąŲˆØ¯ÛŒâ€ŒŲ‡Ø§ÛŒ Ų‚Ø¨Ų„ÛŒ Ø¨ØąØ§ÛŒ اØŦØąØ§ÛŒ بؚدی" + }, + "general": { + "title": "General", + "description": "Configure general application preferences.", + "account": "Account", + "accountDescription": "Manage your account settings", + "user": "User", + "signedInAs": "Signed in as", + "logout": "Log out", + "enableFeatures": { + "title": "For System Administrators", + "intro": "Enable user authentication, team management, and workspace features for your organization.", + "action": "Configure", + "and": "and", + "benefit": "Enables user roles, team collaboration, admin controls, and enterprise features.", + "learnMore": "Learn more in documentation", + "dismiss": "Dismiss" + }, + "autoUnzip": "Auto-unzip API responses", + "autoUnzipDescription": "Automatically extract files from ZIP responses", + "autoUnzipTooltip": "Automatically extract ZIP files returned from API operations. Disable to keep ZIP files intact. This does not affect automation workflows.", + "autoUnzipFileLimit": "Auto-unzip file limit", + "autoUnzipFileLimitDescription": "Maximum number of files to extract from ZIP", + "autoUnzipFileLimitTooltip": "Only unzip if the ZIP contains this many files or fewer. Set higher to extract larger ZIPs.", + "defaultToolPickerMode": "Default tool picker mode", + "defaultToolPickerModeDescription": "Choose whether the tool picker opens in fullscreen or sidebar by default", + "mode": { + "fullscreen": "Fullscreen", + "sidebar": "Sidebar" + } + }, + "hotkeys": { + "title": "Keyboard Shortcuts", + "description": "Hover a tool to see its shortcut or customise it below. Click \"Change shortcut\" and press a new key combination. Press Esc to cancel.", + "errorModifier": { + "mac": "Include ⌘ (Command), âŒĨ (Option), or another modifier in your shortcut.", + "windows": "Include Ctrl, Alt, or another modifier in your shortcut." + }, + "errorConflict": "Shortcut already used by {{tool}}.", + "none": "Not assigned", + "customBadge": "Custom", + "defaultLabel": "Default: {{shortcut}}", + "capturing": "Press keysâ€Ļ (Esc to cancel)", + "change": "Change shortcut", + "reset": "Reset", + "shortcut": "Shortcut", + "noShortcut": "No shortcut set", + "searchPlaceholder": "Search tools..." } }, "changeCreds": { @@ -274,8 +413,10 @@ "top20": "Top 20", "all": "All", "refresh": "Refresh", - "includeHomepage": "Include Homepage ('/')", - "includeLoginPage": "Include Login Page ('/login')", + "dataTypeLabel": "Data Type:", + "dataTypeAll": "All", + "dataTypeApi": "API", + "dataTypeUi": "UI", "totalEndpoints": "Total Endpoints", "totalVisits": "Total Visits", "showing": "Showing", @@ -290,7 +431,9 @@ "top": "Top", "numberOfVisits": "Number of Visits", "visitsTooltip": "Visits: {0} ({1}% of total)", - "retry": "Retry" + "retry": "Retry", + "includeHomepage": "Include Homepage ('/')", + "includeLoginPage": "Include Login Page ('/login')" }, "database": { "title": "ŲˆØ§ØąØ¯ ÚŠØąØ¯Ų†/ØĩØ§Ø¯Øą ÚŠØąØ¯Ų† ŲžØ§ÛŒÚ¯Ø§Ų‡ Ø¯Ø§Ø¯Ų‡", @@ -331,22 +474,310 @@ "alphabetical": "Alphabetical", "globalPopularity": "Global Popularity", "sortBy": "Sort by:", + "mobile": { + "brandAlt": "Stirling PDF logo", + "openFiles": "Open files", + "swipeHint": "Swipe left or right to switch views", + "tools": "Tools", + "toolsSlide": "Tool selection panel", + "viewSwitcher": "Switch workspace view", + "workbenchSlide": "Workspace panel", + "workspace": "Workspace" + }, "multiTool": { + "tags": "multiple,tools", "title": "Ø§Ø¨Ø˛Ø§Øą Ú†Ų†Ø¯Ú¯Ø§Ų†Ų‡ PDF", "desc": "ØĒØąÚŠÛŒØ¨ØŒ Ú†ØąØŽØ´ØŒ Ø¨Ø§Ø˛ØĸØąØ§ÛŒÛŒØŒ ØĒŲ‚ØŗÛŒŲ… ؈ Ø­Ø°Ų ØĩŲØ­Ø§ØĒ" }, "merge": { + "tags": "combine,join,unite", "title": "ØĒØąÚŠÛŒØ¨", "desc": "ØĒØąÚŠÛŒØ¨ ØĸØŗØ§Ų† Ú†Ų†Ø¯ÛŒŲ† ŲØ§ÛŒŲ„ PDF Ø¯Øą یڊ ŲØ§ÛŒŲ„." }, "split": { + "tags": "divide,separate,break", "title": "ØĒŲ‚ØŗÛŒŲ…", "desc": "ØĒŲ‚ØŗÛŒŲ… ŲØ§ÛŒŲ„â€ŒŲ‡Ø§ÛŒ PDF Ø¨Ų‡ Ø§ØŗŲ†Ø§Ø¯ Ú†Ų†Ø¯Ú¯Ø§Ų†Ų‡" }, "rotate": { + "tags": "turn,flip,orient", "title": "Ú†ØąØŽØ´", "desc": "Ú†ØąØŽØ´ ØĸØŗØ§Ų† ŲØ§ÛŒŲ„â€ŒŲ‡Ø§ÛŒ PDF." }, + "convert": { + "tags": "transform,change", + "title": "ØĒØ¨Ø¯ÛŒŲ„", + "desc": "Convert files between different formats" + }, + "pdfOrganiser": { + "tags": "organize,rearrange,reorder", + "title": "ØŗØ§Ø˛Ų…Ø§Ų†Ø¯Ų‡ÛŒ", + "desc": "Ø­Ø°Ų/Ø¨Ø§Ø˛ØĸØąØ§ÛŒÛŒ ØĩŲØ­Ø§ØĒ Ø¨Ų‡ ØĒØąØĒیب Ø¯Ų„ØŽŲˆØ§Ų‡" + }, + "addImage": { + "tags": "insert,embed,place", + "title": "Ø§ŲØ˛ŲˆØ¯Ų† ØĒØĩŲˆÛŒØą", + "desc": "Ø§ŲØ˛ŲˆØ¯Ų† یڊ ØĒØĩŲˆÛŒØą Ø¨Ų‡ یڊ Ų…ÚŠØ§Ų† Ų…Ø´ØŽØĩ Ø¯Øą PDF" + }, + "addAttachments": { + "tags": "embed,attach,include", + "title": "Add Attachments", + "desc": "Add or remove embedded files (attachments) to/from a PDF" + }, + "watermark": { + "tags": "stamp,mark,overlay", + "title": "Ø§ŲØ˛ŲˆØ¯Ų† ŲˆØ§ØĒØąŲ…Ø§ØąÚŠ", + "desc": "Ø§ŲØ˛ŲˆØ¯Ų† یڊ ŲˆØ§ØĒØąŲ…Ø§ØąÚŠ ØŗŲØ§ØąØ´ÛŒ Ø¨Ų‡ ØŗŲ†Ø¯ PDF." + }, + "removePassword": { + "tags": "unlock", + "title": "Ø­Ø°Ų ØąŲ…Ø˛ ØšØ¨ŲˆØą", + "desc": "Ø­Ø°Ų Ø­ŲØ§Ø¸ØĒ ØąŲ…Ø˛ ØšØ¨ŲˆØą Ø§Ø˛ ØŗŲ†Ø¯ PDF Ø´Ų…Ø§." + }, + "compress": { + "tags": "shrink,reduce,optimize", + "title": "ŲØ´ØąØ¯Ų‡â€ŒØŗØ§Ø˛ÛŒ", + "desc": "ŲØ´ØąØ¯Ų‡â€ŒØŗØ§Ø˛ÛŒ ŲØ§ÛŒŲ„â€ŒŲ‡Ø§ÛŒ PDF Ø¨ØąØ§ÛŒ ÚŠØ§Ų‡Ø´ Ø§Ų†Ø¯Ø§Ø˛Ų‡ ØĸŲ†â€ŒŲ‡Ø§." + }, + "unlockPDFForms": { + "tags": "unlock,enable,edit", + "title": "Unlock PDF Forms", + "desc": "Remove read-only property of form fields in a PDF document." + }, + "changeMetadata": { + "tags": "edit,modify,update", + "title": "ØĒØēÛŒÛŒØą Ų…ØĒØ§Ø¯Ø§Ø¯Ų‡", + "desc": "ØĒØēÛŒÛŒØą/Ø­Ø°Ų/Ø§ŲØ˛ŲˆØ¯Ų† Ų…ØĒØ§Ø¯Ø§Ø¯Ų‡ Ø¨Ų‡ یڊ ØŗŲ†Ø¯ PDF" + }, + "ocr": { + "tags": "extract,scan", + "title": "OCR / ŲžØ§ÚŠØŗØ§Ø˛ÛŒ Ø§ØŗÚŠŲ†â€ŒŲ‡Ø§", + "desc": "ŲžØ§ÚŠØŗØ§Ø˛ÛŒ Ø§ØŗÚŠŲ†â€ŒŲ‡Ø§ ؈ ØĒØ´ØŽÛŒØĩ Ų…ØĒŲ† Ø§Ø˛ ØĒØĩØ§ŲˆÛŒØą Ø¯ØąŲˆŲ† یڊ ŲØ§ÛŒŲ„ PDF ؈ Ø¨Ø§Ø˛Ø§ŲØ˛ŲˆØ¯Ų† ØĸŲ† Ø¨Ų‡ ØšŲ†ŲˆØ§Ų† Ų…ØĒŲ†." + }, + "extractImages": { + "tags": "pull,save,export", + "title": "Ø§ØŗØĒØŽØąØ§ØŦ ØĒØĩØ§ŲˆÛŒØą", + "desc": "Ø§ØŗØĒØŽØąØ§ØŦ ØĒŲ…Ø§Ų… ØĒØĩØ§ŲˆÛŒØą Ø§Ø˛ یڊ PDF ؈ Ø°ØŽÛŒØąŲ‡ ØĸŲ†â€ŒŲ‡Ø§ Ø¨Ų‡ ØĩŲˆØąØĒ ŲØ§ÛŒŲ„ Ø˛ÛŒŲž" + }, + "scannerImageSplit": { + "tags": "detect,split,photos", + "title": "Detect & Split Scanned Photos", + "desc": "Detect and split scanned photos into separate pages" + }, + "sign": { + "tags": "signature,autograph", + "title": "Ø§Ų…Øļا", + "desc": "Ø§ŲØ˛ŲˆØ¯Ų† Ø§Ų…Øļا Ø¨Ų‡ PDF با ÚŠØ´ÛŒØ¯Ų†ØŒ Ų…ØĒŲ† یا ØĒØĩŲˆÛŒØą" + }, + "flatten": { + "tags": "simplify,remove,interactive", + "title": "ØĒØŗØˇÛŒØ­", + "desc": "Ø­Ø°Ų ØĒŲ…Ø§Ų… ØšŲ†Ø§ØĩØą ØĒØšØ§Ų…Ų„ÛŒ ؈ ŲØąŲ…â€ŒŲ‡Ø§ Ø§Ø˛ یڊ PDF" + }, + "certSign": { + "tags": "authenticate,PEM,P12,official,encrypt,sign,certificate,PKCS12,JKS,server,manual,auto", + "title": "Ø§Ų…Øļا با Ú¯ŲˆØ§Ų‡ÛŒŲ†Ø§Ų…Ų‡", + "desc": "Ø§Ų…Øļای یڊ PDF با Ú¯ŲˆØ§Ų‡ÛŒŲ†Ø§Ų…Ų‡/ÚŠŲ„ÛŒØ¯ (PEM/P12)" + }, + "repair": { + "tags": "fix,restore", + "title": "ØĒØąŲ…ÛŒŲ…", + "desc": "ØĒŲ„Ø§Ø´ Ø¨ØąØ§ÛŒ ØĒØąŲ…ÛŒŲ… یڊ PDF ØŽØąØ§Ø¨/Ø´ÚŠØŗØĒŲ‡" + }, + "removeBlanks": { + "tags": "delete,clean,empty", + "title": "Ø­Ø°Ų ØĩŲØ­Ø§ØĒ ØŽØ§Ų„ÛŒ", + "desc": "ØĒØ´ØŽÛŒØĩ ؈ Ø­Ø°Ų ØĩŲØ­Ø§ØĒ ØŽØ§Ų„ÛŒ Ø§Ø˛ یڊ ØŗŲ†Ø¯" + }, + "removeAnnotations": { + "tags": "delete,clean,strip", + "title": "Ø­Ø°Ų Ø­Ø§Ø´ÛŒŲ‡â€ŒŲ†ŲˆÛŒØŗÛŒâ€ŒŲ‡Ø§", + "desc": "Ø­Ø°Ų ØĒŲ…Ø§Ų… Ų†Ø¸ØąØ§ØĒ/Ø­Ø§Ø´ÛŒŲ‡â€ŒŲ†ŲˆÛŒØŗÛŒâ€ŒŲ‡Ø§ Ø§Ø˛ یڊ PDF" + }, + "compare": { + "tags": "difference", + "title": "Ų…Ų‚Ø§ÛŒØŗŲ‡", + "desc": "Ų…Ų‚Ø§ÛŒØŗŲ‡ ؈ Ų†Ų…Ø§ÛŒØ´ ØĒŲØ§ŲˆØĒâ€ŒŲ‡Ø§ Ø¨ÛŒŲ† 2 ØŗŲ†Ø¯ PDF" + }, + "removeCertSign": { + "tags": "remove,delete,unlock", + "title": "Ø­Ø°Ų Ø§Ų…Øļای Ú¯ŲˆØ§Ų‡ÛŒŲ†Ø§Ų…Ų‡", + "desc": "Ø­Ø°Ų Ø§Ų…Øļای Ú¯ŲˆØ§Ų‡ÛŒŲ†Ø§Ų…Ų‡ Ø§Ø˛ PDF" + }, + "pageLayout": { + "tags": "layout,arrange,combine", + "title": "ØˇØąØ­â€ŒØ¨Ų†Ø¯ÛŒ Ú†Ų†Ø¯ ØĩŲØ­Ų‡â€ŒØ§ÛŒ", + "desc": "ادØēØ§Ų… Ú†Ų†Ø¯ÛŒŲ† ØĩŲØ­Ų‡ یڊ ØŗŲ†Ø¯ PDF Ø¯Øą یڊ ØĩŲØ­Ų‡ ŲˆØ§Ø­Ø¯" + }, + "bookletImposition": { + "tags": "booklet,print,binding", + "title": "Booklet Imposition", + "desc": "Create booklets with proper page ordering and multi-page layout for printing and binding" + }, + "scalePages": { + "tags": "resize,adjust,scale", + "title": "ØĒŲ†Ø¸ÛŒŲ… Ø§Ų†Ø¯Ø§Ø˛Ų‡/Ų…Ų‚ÛŒØ§Øŗ ØĩŲØ­Ų‡", + "desc": "ØĒØēÛŒÛŒØą Ø§Ų†Ø¯Ø§Ø˛Ų‡/Ų…Ų‚ÛŒØ§Øŗ یڊ ØĩŲØ­Ų‡ ؈/یا Ų…Ø­ØĒŲˆØ§ÛŒ ØĸŲ†." + }, + "addPageNumbers": { + "tags": "number,pagination,count", + "title": "Ø§ŲØ˛ŲˆØ¯Ų† Ø´Ų…Ø§ØąŲ‡ ØĩŲØ­Ø§ØĒ", + "desc": "Ø§ŲØ˛ŲˆØ¯Ų† Ø´Ų…Ø§ØąŲ‡ ØĩŲØ­Ø§ØĒ Ø¨Ų‡ ØĒŲ…Ø§Ų… ØŗŲ†Ø¯ Ø¯Øą یڊ Ų…ÚŠØ§Ų† Ų…Ø´ØŽØĩ" + }, + "autoRename": { + "tags": "auto-detect,header-based,organize,relabel", + "title": "Auto Rename PDF File", + "desc": "Auto renames a PDF file based on its detected header" + }, + "adjustContrast": { + "tags": "contrast,brightness,saturation", + "title": "ØĒŲ†Ø¸ÛŒŲ… ØąŲ†Ú¯â€ŒŲ‡Ø§/ÚŠŲ†ØĒØąØ§ØŗØĒ", + "desc": "ØĒŲ†Ø¸ÛŒŲ… ÚŠŲ†ØĒØąØ§ØŗØĒ، اشباؚ ؈ ØąŲˆØ´Ų†Ø§ÛŒÛŒ یڊ PDF" + }, + "crop": { + "tags": "trim,cut,resize", + "title": "Ø¨ØąØ´ PDF", + "desc": "Ø¨ØąØ´ یڊ PDF Ø¨ØąØ§ÛŒ ÚŠØ§Ų‡Ø´ Ø§Ų†Ø¯Ø§Ø˛Ų‡ ØĸŲ† (Ų…ØĒŲ† ØąØ§ Ø­ŲØ¸ Ų…ÛŒâ€ŒÚŠŲ†Ø¯!)" + }, + "autoSplitPDF": { + "tags": "auto,split,QR", + "title": "ØĒŲ‚ØŗÛŒŲ… ØŽŲˆØ¯ÚŠØ§Øą ØĩŲØ­Ø§ØĒ", + "desc": "ØĒŲ‚ØŗÛŒŲ… ØŽŲˆØ¯ÚŠØ§Øą ŲØ§ÛŒŲ„ Ø§ØŗÚŠŲ†â€ŒØ´Ø¯Ų‡ PDF با Ø§ØŗØĒŲØ§Ø¯Ų‡ Ø§Ø˛ ڊد QR ØĒŲ‚ØŗÛŒŲ…â€ŒÚŠŲ†Ų†Ø¯Ų‡ ŲÛŒØ˛ÛŒÚŠÛŒ" + }, + "sanitize": { + "tags": "clean,purge,remove", + "title": "Sanitise", + "desc": "Remove potentially harmful elements from PDF files" + }, + "getPdfInfo": { + "tags": "info,metadata,details", + "title": "Ø¯ØąÛŒØ§ŲØĒ ØĒŲ…Ø§Ų… Ø§ØˇŲ„Ø§ØšØ§ØĒ Ø¯Øą Ų…ŲˆØąØ¯ PDF", + "desc": "Ú¯ØąŲØĒŲ† Ų‡Øą Ø§ØˇŲ„Ø§ØšØ§ØĒ Ų…Ų…ÚŠŲ† Ø¯Øą Ų…ŲˆØąØ¯ PDF" + }, + "pdfToSinglePage": { + "tags": "combine,merge,single", + "title": "ØĩŲØ­Ų‡ Ø¨Ø˛ØąÚ¯ ŲˆØ§Ø­Ø¯", + "desc": "ادØēØ§Ų… ØĒŲ…Ø§Ų… ØĩŲØ­Ø§ØĒ PDF Ø¯Øą یڊ ØĩŲØ­Ų‡ Ø¨Ø˛ØąÚ¯ ŲˆØ§Ø­Ø¯" + }, + "showJS": { + "tags": "javascript,code,script", + "title": "Ų†Ų…Ø§ÛŒØ´ ØŦØ§ŲˆØ§Ø§ØŗÚŠØąÛŒŲžØĒ", + "desc": "ØŦØŗØĒØŦ؈ ؈ Ų†Ų…Ø§ÛŒØ´ Ų‡Øą ØŦØ§ŲˆØ§Ø§ØŗÚŠØąÛŒŲžØĒ ØĒØ˛ØąÛŒŲ‚ Ø´Ø¯Ų‡ Ø¨Ų‡ PDF" + }, + "redact": { + "tags": "censor,blackout,hide", + "title": "Manual Redaction", + "desc": "Redacts a PDF based on selected text, drawn shapes and/or selected page(s)" + }, + "splitBySections": { + "tags": "split,sections,divide", + "title": "Split PDF by Sections", + "desc": "Divide each page of a PDF into smaller horizontal and vertical sections" + }, + "addStamp": { + "tags": "stamp,mark,seal", + "title": "Add Stamp to PDF", + "desc": "Add text or add image stamps at set locations" + }, + "removeImage": { + "tags": "remove,delete,clean", + "title": "Ø­Ø°Ų ØĒØĩŲˆÛŒØą", + "desc": "Ø­Ø°Ų ØĒØĩØ§ŲˆÛŒØą Ø§Ø˛ PDF Ø¨ØąØ§ÛŒ ÚŠØ§Ų‡Ø´ Ø­ØŦŲ… ŲØ§ÛŒŲ„" + }, + "splitByChapters": { + "tags": "split,chapters,structure", + "title": "ØĒŲ‚ØŗÛŒŲ… PDF Ø¨Øą Ø§ØŗØ§Øŗ ؁ØĩŲ„â€ŒŲ‡Ø§", + "desc": "ØĒŲ‚ØŗÛŒŲ… PDF Ø¨Ų‡ Ú†Ų†Ø¯ ŲØ§ÛŒŲ„ Ø¨Øą Ø§ØŗØ§Øŗ ØŗØ§ØŽØĒØ§Øą ؁ØĩŲ„â€ŒŲ‡Ø§" + }, + "validateSignature": { + "tags": "validate,verify,certificate", + "title": "اؚØĒØ¨Ø§ØąØŗŲ†ØŦی Ø§Ų…Øļای PDF", + "desc": "ØĒØŖÛŒÛŒØ¯ Ø§Ų…ØļØ§Ų‡Ø§ ؈ Ú¯ŲˆØ§Ų‡ÛŒâ€ŒŲ‡Ø§ÛŒ دیØŦیØĒØ§Ų„ Ø¯Øą Ø§ØŗŲ†Ø§Ø¯ PDF" + }, + "swagger": { + "tags": "API,documentation,test", + "title": "API Documentation", + "desc": "View API documentation and test endpoints" + }, + "scannerEffect": { + "tags": "scan,simulate,create", + "title": "Scanner Effect", + "desc": "Create a PDF that looks like it was scanned" + }, + "editTableOfContents": { + "tags": "bookmarks,contents,edit", + "title": "Edit Table of Contents", + "desc": "Add or edit bookmarks and table of contents in PDF documents" + }, + "manageCertificates": { + "tags": "certificates,import,export", + "title": "Manage Certificates", + "desc": "Import, export, or delete digital certificate files used for signing PDFs." + }, + "read": { + "tags": "view,open,display", + "title": "Read", + "desc": "View and annotate PDFs. Highlight text, draw, or insert comments for review and collaboration." + }, + "reorganizePages": { + "tags": "rearrange,reorder,organize", + "title": "Reorganize Pages", + "desc": "Rearrange, duplicate, or delete PDF pages with visual drag-and-drop control." + }, + "extractPages": { + "tags": "pull,select,copy", + "title": "Ø§ØŗØĒØŽØąØ§ØŦ ØĩŲØ­Ø§ØĒ", + "desc": "Extract specific pages from a PDF document" + }, + "removePages": { + "tags": "delete,extract,exclude", + "title": "Ø­Ø°Ų", + "desc": "Ø­Ø°Ų ØĩŲØ­Ø§ØĒ Ų†Ø§ØŽŲˆØ§ØŗØĒŲ‡ Ø§Ø˛ ØŗŲ†Ø¯ PDF Ø´Ų…Ø§." + }, + "autoSizeSplitPDF": { + "tags": "auto,split,size", + "title": "ØĒŲ‚ØŗÛŒŲ… ØŽŲˆØ¯ÚŠØ§Øą Ø¨Øą Ø§ØŗØ§Øŗ Ø§Ų†Ø¯Ø§Ø˛Ų‡/ØĒؚداد", + "desc": "ØĒŲ‚ØŗÛŒŲ… یڊ PDF Ø¨Ų‡ Ú†Ų†Ø¯ ØŗŲ†Ø¯ Ø¨Øą Ø§ØŗØ§Øŗ Ø§Ų†Ø¯Ø§Ø˛Ų‡ØŒ ØĒؚداد ØĩŲØ­Ø§ØĒ، یا ØĒؚداد Ø§ØŗŲ†Ø§Ø¯" + }, + "replaceColor": { + "title": "Replace & Invert Colour", + "desc": "Replace or invert colours in PDF documents" + }, + "devApi": { + "tags": "API,development,documentation", + "title": "API", + "desc": "Link to API documentation" + }, + "devFolderScanning": { + "tags": "automation,folder,scanning", + "title": "Automated Folder Scanning", + "desc": "Link to automated folder scanning guide" + }, + "devSsoGuide": { + "title": "SSO Guide", + "desc": "Link to SSO guide" + }, + "devAirgapped": { + "title": "Air-gapped Setup", + "desc": "Link to air-gapped setup guide" + }, + "addPassword": { + "title": "Ø§ŲØ˛ŲˆØ¯Ų† ØąŲ…Ø˛ ØšØ¨ŲˆØą", + "desc": "ØąŲ…Ø˛Ú¯Ø°Ø§ØąÛŒ ØŗŲ†Ø¯ PDF Ø´Ų…Ø§ با ØąŲ…Ø˛ ØšØ¨ŲˆØą." + }, + "changePermissions": { + "title": "ØĒØēÛŒÛŒØą Ų…ØŦŲˆØ˛Ų‡Ø§", + "desc": "Change document restrictions and permissions" + }, + "automate": { + "tags": "workflow,sequence,automation", + "title": "Automate", + "desc": "Build multi-step workflows by chaining together PDF actions. Ideal for recurring tasks." + }, + "overlay-pdfs": { + "desc": "PDFâ€ŒŲ‡Ø§ ØąØ§ Ø¨Øą ØąŲˆÛŒ PDF Ø¯ÛŒÚ¯ØąÛŒ Ų‡Ų…â€ŒŲžŲˆØ´Ø§Ų†ÛŒ Ų…ÛŒâ€ŒÚŠŲ†Ø¯", + "title": "Ų‡Ų…â€ŒŲžŲˆØ´Ø§Ų†ÛŒ PDFâ€ŒŲ‡Ø§" + }, "imageToPDF": { "title": "ØĒØĩŲˆÛŒØą Ø¨Ų‡ PDF", "desc": "ØĒØ¨Ø¯ÛŒŲ„ یڊ ØĒØĩŲˆÛŒØą (PNG، JPEG، GIF) Ø¨Ų‡ PDF." @@ -355,18 +786,6 @@ "title": "PDF Ø¨Ų‡ ØĒØĩŲˆÛŒØą", "desc": "ØĒØ¨Ø¯ÛŒŲ„ یڊ ŲØ§ÛŒŲ„ PDF Ø¨Ų‡ یڊ ØĒØĩŲˆÛŒØą. (PNG، JPEG، GIF)" }, - "pdfOrganiser": { - "title": "ØŗØ§Ø˛Ų…Ø§Ų†Ø¯Ų‡ÛŒ", - "desc": "Ø­Ø°Ų/Ø¨Ø§Ø˛ØĸØąØ§ÛŒÛŒ ØĩŲØ­Ø§ØĒ Ø¨Ų‡ ØĒØąØĒیب Ø¯Ų„ØŽŲˆØ§Ų‡" - }, - "addImage": { - "title": "Ø§ŲØ˛ŲˆØ¯Ų† ØĒØĩŲˆÛŒØą", - "desc": "Ø§ŲØ˛ŲˆØ¯Ų† یڊ ØĒØĩŲˆÛŒØą Ø¨Ų‡ یڊ Ų…ÚŠØ§Ų† Ų…Ø´ØŽØĩ Ø¯Øą PDF" - }, - "watermark": { - "title": "Ø§ŲØ˛ŲˆØ¯Ų† ŲˆØ§ØĒØąŲ…Ø§ØąÚŠ", - "desc": "Ø§ŲØ˛ŲˆØ¯Ų† یڊ ŲˆØ§ØĒØąŲ…Ø§ØąÚŠ ØŗŲØ§ØąØ´ÛŒ Ø¨Ų‡ ØŗŲ†Ø¯ PDF." - }, "permissions": { "title": "ØĒØēÛŒÛŒØą Ų…ØŦŲˆØ˛Ų‡Ø§", "desc": "ØĒØēÛŒÛŒØą Ų…ØŦŲˆØ˛Ų‡Ø§ÛŒ ØŗŲ†Ø¯ PDF Ø´Ų…Ø§" @@ -375,38 +794,10 @@ "title": "Ø­Ø°Ų", "desc": "Ø­Ø°Ų ØĩŲØ­Ø§ØĒ Ų†Ø§ØŽŲˆØ§ØŗØĒŲ‡ Ø§Ø˛ ØŗŲ†Ø¯ PDF Ø´Ų…Ø§." }, - "addPassword": { - "title": "Ø§ŲØ˛ŲˆØ¯Ų† ØąŲ…Ø˛ ØšØ¨ŲˆØą", - "desc": "ØąŲ…Ø˛Ú¯Ø°Ø§ØąÛŒ ØŗŲ†Ø¯ PDF Ø´Ų…Ø§ با ØąŲ…Ø˛ ØšØ¨ŲˆØą." - }, - "removePassword": { - "title": "Ø­Ø°Ų ØąŲ…Ø˛ ØšØ¨ŲˆØą", - "desc": "Ø­Ø°Ų Ø­ŲØ§Ø¸ØĒ ØąŲ…Ø˛ ØšØ¨ŲˆØą Ø§Ø˛ ØŗŲ†Ø¯ PDF Ø´Ų…Ø§." - }, - "compress": { - "title": "ŲØ´ØąØ¯Ų‡â€ŒØŗØ§Ø˛ÛŒ", - "desc": "ŲØ´ØąØ¯Ų‡â€ŒØŗØ§Ø˛ÛŒ ŲØ§ÛŒŲ„â€ŒŲ‡Ø§ÛŒ PDF Ø¨ØąØ§ÛŒ ÚŠØ§Ų‡Ø´ Ø§Ų†Ø¯Ø§Ø˛Ų‡ ØĸŲ†â€ŒŲ‡Ø§." - }, - "unlockPDFForms": { - "title": "Unlock PDF Forms", - "desc": "Remove read-only property of form fields in a PDF document." - }, - "changeMetadata": { - "title": "ØĒØēÛŒÛŒØą Ų…ØĒØ§Ø¯Ø§Ø¯Ų‡", - "desc": "ØĒØēÛŒÛŒØą/Ø­Ø°Ų/Ø§ŲØ˛ŲˆØ¯Ų† Ų…ØĒØ§Ø¯Ø§Ø¯Ų‡ Ø¨Ų‡ یڊ ØŗŲ†Ø¯ PDF" - }, "fileToPDF": { "title": "ØĒØ¨Ø¯ÛŒŲ„ ŲØ§ÛŒŲ„ Ø¨Ų‡ PDF", "desc": "ØĒØ¨Ø¯ÛŒŲ„ ØĒŲ‚ØąÛŒØ¨Ø§Ų‹ Ų‡Øą ŲØ§ÛŒŲ„ Ø¨Ų‡ PDF (DOCX، PNG، XLS، PPT، TXT ؈ بیشØĒØą)" }, - "ocr": { - "title": "OCR / ŲžØ§ÚŠØŗØ§Ø˛ÛŒ Ø§ØŗÚŠŲ†â€ŒŲ‡Ø§", - "desc": "ŲžØ§ÚŠØŗØ§Ø˛ÛŒ Ø§ØŗÚŠŲ†â€ŒŲ‡Ø§ ؈ ØĒØ´ØŽÛŒØĩ Ų…ØĒŲ† Ø§Ø˛ ØĒØĩØ§ŲˆÛŒØą Ø¯ØąŲˆŲ† یڊ ŲØ§ÛŒŲ„ PDF ؈ Ø¨Ø§Ø˛Ø§ŲØ˛ŲˆØ¯Ų† ØĸŲ† Ø¨Ų‡ ØšŲ†ŲˆØ§Ų† Ų…ØĒŲ†." - }, - "extractImages": { - "title": "Ø§ØŗØĒØŽØąØ§ØŦ ØĒØĩØ§ŲˆÛŒØą", - "desc": "Ø§ØŗØĒØŽØąØ§ØŦ ØĒŲ…Ø§Ų… ØĒØĩØ§ŲˆÛŒØą Ø§Ø˛ یڊ PDF ؈ Ø°ØŽÛŒØąŲ‡ ØĸŲ†â€ŒŲ‡Ø§ Ø¨Ų‡ ØĩŲˆØąØĒ ŲØ§ÛŒŲ„ Ø˛ÛŒŲž" - }, "pdfToPDFA": { "title": "PDF Ø¨Ų‡ PDF/A", "desc": "ØĒØ¨Ø¯ÛŒŲ„ PDF Ø¨Ų‡ PDF/A Ø¨ØąØ§ÛŒ Ø°ØŽÛŒØąŲ‡â€ŒØŗØ§Ø˛ÛŒ Ø¨Ų„Ų†Ø¯Ų…Ø¯ØĒ" @@ -435,70 +826,14 @@ "title": "ØĒØ´ØŽÛŒØĩ/ØĒŲ‚ØŗÛŒŲ… ØĒØĩØ§ŲˆÛŒØą Ø§ØŗÚŠŲ†â€ŒØ´Ø¯Ų‡", "desc": "ØĒŲ‚ØŗÛŒŲ… Ú†Ų†Ø¯ÛŒŲ† ØĒØĩŲˆÛŒØą Ø§Ø˛ Ø¯ØąŲˆŲ† یڊ ØĒØĩŲˆÛŒØą/PDF" }, - "sign": { - "title": "Ø§Ų…Øļا", - "desc": "Ø§ŲØ˛ŲˆØ¯Ų† Ø§Ų…Øļا Ø¨Ų‡ PDF با ÚŠØ´ÛŒØ¯Ų†ØŒ Ų…ØĒŲ† یا ØĒØĩŲˆÛŒØą" - }, - "flatten": { - "title": "ØĒØŗØˇÛŒØ­", - "desc": "Ø­Ø°Ų ØĒŲ…Ø§Ų… ØšŲ†Ø§ØĩØą ØĒØšØ§Ų…Ų„ÛŒ ؈ ŲØąŲ…â€ŒŲ‡Ø§ Ø§Ø˛ یڊ PDF" - }, - "repair": { - "title": "ØĒØąŲ…ÛŒŲ…", - "desc": "ØĒŲ„Ø§Ø´ Ø¨ØąØ§ÛŒ ØĒØąŲ…ÛŒŲ… یڊ PDF ØŽØąØ§Ø¨/Ø´ÚŠØŗØĒŲ‡" - }, - "removeBlanks": { - "title": "Ø­Ø°Ų ØĩŲØ­Ø§ØĒ ØŽØ§Ų„ÛŒ", - "desc": "ØĒØ´ØŽÛŒØĩ ؈ Ø­Ø°Ų ØĩŲØ­Ø§ØĒ ØŽØ§Ų„ÛŒ Ø§Ø˛ یڊ ØŗŲ†Ø¯" - }, - "removeAnnotations": { - "title": "Ø­Ø°Ų Ø­Ø§Ø´ÛŒŲ‡â€ŒŲ†ŲˆÛŒØŗÛŒâ€ŒŲ‡Ø§", - "desc": "Ø­Ø°Ų ØĒŲ…Ø§Ų… Ų†Ø¸ØąØ§ØĒ/Ø­Ø§Ø´ÛŒŲ‡â€ŒŲ†ŲˆÛŒØŗÛŒâ€ŒŲ‡Ø§ Ø§Ø˛ یڊ PDF" - }, - "compare": { - "title": "Ų…Ų‚Ø§ÛŒØŗŲ‡", - "desc": "Ų…Ų‚Ø§ÛŒØŗŲ‡ ؈ Ų†Ų…Ø§ÛŒØ´ ØĒŲØ§ŲˆØĒâ€ŒŲ‡Ø§ Ø¨ÛŒŲ† 2 ØŗŲ†Ø¯ PDF" - }, - "certSign": { - "title": "Ø§Ų…Øļا با Ú¯ŲˆØ§Ų‡ÛŒŲ†Ø§Ų…Ų‡", - "desc": "Ø§Ų…Øļای یڊ PDF با Ú¯ŲˆØ§Ų‡ÛŒŲ†Ø§Ų…Ų‡/ÚŠŲ„ÛŒØ¯ (PEM/P12)" - }, - "removeCertSign": { - "title": "Ø­Ø°Ų Ø§Ų…Øļای Ú¯ŲˆØ§Ų‡ÛŒŲ†Ø§Ų…Ų‡", - "desc": "Ø­Ø°Ų Ø§Ų…Øļای Ú¯ŲˆØ§Ų‡ÛŒŲ†Ø§Ų…Ų‡ Ø§Ø˛ PDF" - }, - "pageLayout": { - "title": "ØˇØąØ­â€ŒØ¨Ų†Ø¯ÛŒ Ú†Ų†Ø¯ ØĩŲØ­Ų‡â€ŒØ§ÛŒ", - "desc": "ادØēØ§Ų… Ú†Ų†Ø¯ÛŒŲ† ØĩŲØ­Ų‡ یڊ ØŗŲ†Ø¯ PDF Ø¯Øą یڊ ØĩŲØ­Ų‡ ŲˆØ§Ø­Ø¯" - }, - "scalePages": { - "title": "ØĒŲ†Ø¸ÛŒŲ… Ø§Ų†Ø¯Ø§Ø˛Ų‡/Ų…Ų‚ÛŒØ§Øŗ ØĩŲØ­Ų‡", - "desc": "ØĒØēÛŒÛŒØą Ø§Ų†Ø¯Ø§Ø˛Ų‡/Ų…Ų‚ÛŒØ§Øŗ یڊ ØĩŲØ­Ų‡ ؈/یا Ų…Ø­ØĒŲˆØ§ÛŒ ØĸŲ†." - }, "pipeline": { "title": "ØŽØˇ Ų„ŲˆŲ„Ų‡", "desc": "اØŦØąØ§ÛŒ Ú†Ų†Ø¯ÛŒŲ† ØšŲ…Ų„ÛŒØ§ØĒ Ø¨Øą ØąŲˆÛŒ PDFŲ‡Ø§ با ØĒØšØąÛŒŲ Ø§ØŗÚŠØąÛŒŲžØĒâ€ŒŲ‡Ø§ÛŒ ØŽØˇ Ų„ŲˆŲ„Ų‡" }, - "addPageNumbers": { - "title": "Ø§ŲØ˛ŲˆØ¯Ų† Ø´Ų…Ø§ØąŲ‡ ØĩŲØ­Ø§ØĒ", - "desc": "Ø§ŲØ˛ŲˆØ¯Ų† Ø´Ų…Ø§ØąŲ‡ ØĩŲØ­Ø§ØĒ Ø¨Ų‡ ØĒŲ…Ø§Ų… ØŗŲ†Ø¯ Ø¯Øą یڊ Ų…ÚŠØ§Ų† Ų…Ø´ØŽØĩ" - }, "auto-rename": { "title": "ØĒØēÛŒÛŒØą Ų†Ø§Ų… ØŽŲˆØ¯ÚŠØ§Øą ŲØ§ÛŒŲ„ PDF", "desc": "ØĒØēÛŒÛŒØą Ų†Ø§Ų… ØŽŲˆØ¯ÚŠØ§Øą یڊ ŲØ§ÛŒŲ„ PDF Ø¨Øą Ø§ØŗØ§Øŗ ØŗØąØ¨ØąÚ¯ ØĒØ´ØŽÛŒØĩ Ø¯Ø§Ø¯Ų‡â€ŒØ´Ø¯Ų‡ ØĸŲ†" }, - "adjustContrast": { - "title": "ØĒŲ†Ø¸ÛŒŲ… ØąŲ†Ú¯â€ŒŲ‡Ø§/ÚŠŲ†ØĒØąØ§ØŗØĒ", - "desc": "ØĒŲ†Ø¸ÛŒŲ… ÚŠŲ†ØĒØąØ§ØŗØĒ، اشباؚ ؈ ØąŲˆØ´Ų†Ø§ÛŒÛŒ یڊ PDF" - }, - "crop": { - "title": "Ø¨ØąØ´ PDF", - "desc": "Ø¨ØąØ´ یڊ PDF Ø¨ØąØ§ÛŒ ÚŠØ§Ų‡Ø´ Ø§Ų†Ø¯Ø§Ø˛Ų‡ ØĸŲ† (Ų…ØĒŲ† ØąØ§ Ø­ŲØ¸ Ų…ÛŒâ€ŒÚŠŲ†Ø¯!)" - }, - "autoSplitPDF": { - "title": "ØĒŲ‚ØŗÛŒŲ… ØŽŲˆØ¯ÚŠØ§Øą ØĩŲØ­Ø§ØĒ", - "desc": "ØĒŲ‚ØŗÛŒŲ… ØŽŲˆØ¯ÚŠØ§Øą ŲØ§ÛŒŲ„ Ø§ØŗÚŠŲ†â€ŒØ´Ø¯Ų‡ PDF با Ø§ØŗØĒŲØ§Ø¯Ų‡ Ø§Ø˛ ڊد QR ØĒŲ‚ØŗÛŒŲ…â€ŒÚŠŲ†Ų†Ø¯Ų‡ ŲÛŒØ˛ÛŒÚŠÛŒ" - }, "sanitizePDF": { "title": "ŲžØ§ÚŠØŗØ§Ø˛ÛŒ", "desc": "Ø­Ø°Ų Ø§ØŗÚŠØąÛŒŲžØĒâ€ŒŲ‡Ø§ ؈ ØŗØ§ÛŒØą ØšŲ†Ø§ØĩØą Ø§Ø˛ ŲØ§ÛŒŲ„â€ŒŲ‡Ø§ÛŒ PDF" @@ -519,30 +854,14 @@ "title": "PDF to Markdown", "desc": "Converts any PDF to Markdown" }, - "getPdfInfo": { - "title": "Ø¯ØąÛŒØ§ŲØĒ ØĒŲ…Ø§Ų… Ø§ØˇŲ„Ø§ØšØ§ØĒ Ø¯Øą Ų…ŲˆØąØ¯ PDF", - "desc": "Ú¯ØąŲØĒŲ† Ų‡Øą Ø§ØˇŲ„Ø§ØšØ§ØĒ Ų…Ų…ÚŠŲ† Ø¯Øą Ų…ŲˆØąØ¯ PDF" - }, "pageExtracter": { "title": "Ø§ØŗØĒØŽØąØ§ØŦ ØĩŲØ­Ų‡(Ų‡Ø§)", "desc": "Ø§ØŗØĒØŽØąØ§ØŦ ØĩŲØ­Ø§ØĒ Ø§Ų†ØĒ؎ابی Ø§Ø˛ PDF" }, - "pdfToSinglePage": { - "title": "ØĩŲØ­Ų‡ Ø¨Ø˛ØąÚ¯ ŲˆØ§Ø­Ø¯", - "desc": "ادØēØ§Ų… ØĒŲ…Ø§Ų… ØĩŲØ­Ø§ØĒ PDF Ø¯Øą یڊ ØĩŲØ­Ų‡ Ø¨Ø˛ØąÚ¯ ŲˆØ§Ø­Ø¯" - }, - "showJS": { - "title": "Ų†Ų…Ø§ÛŒØ´ ØŦØ§ŲˆØ§Ø§ØŗÚŠØąÛŒŲžØĒ", - "desc": "ØŦØŗØĒØŦ؈ ؈ Ų†Ų…Ø§ÛŒØ´ Ų‡Øą ØŦØ§ŲˆØ§Ø§ØŗÚŠØąÛŒŲžØĒ ØĒØ˛ØąÛŒŲ‚ Ø´Ø¯Ų‡ Ø¨Ų‡ PDF" - }, "autoRedact": { "title": "ØŗØ§Ų†ØŗŲˆØą ØŽŲˆØ¯ÚŠØ§Øą", "desc": "Ų…ØĒŲ†â€ŒŲ‡Ø§ÛŒ Ų…Ø´ØŽØĩ Ø´Ø¯Ų‡ Ø¯Øą PDF ØąØ§ Ø¨Ų‡â€ŒØˇŲˆØą ØŽŲˆØ¯ÚŠØ§Øą ØŗØ§Ų†ØŗŲˆØą (ØŗÛŒØ§Ų‡) Ų…ÛŒâ€ŒÚŠŲ†Ø¯" }, - "redact": { - "title": "Manual Redaction", - "desc": "Redacts a PDF based on selected text, drawn shapes and/or selected page(s)" - }, "PDFToCSV": { "title": "PDF Ø¨Ų‡ CSV", "desc": "ØŦØ¯Ø§ŲˆŲ„ ØąØ§ Ø§Ø˛ PDF Ø§ØŗØĒØŽØąØ§ØŦ ÚŠØąØ¯Ų‡ ؈ Ø¨Ų‡ CSV ØĒØ¨Ø¯ÛŒŲ„ Ų…ÛŒâ€ŒÚŠŲ†Ø¯" @@ -551,10 +870,6 @@ "title": "ØĒŲ‚ØŗÛŒŲ… ØŽŲˆØ¯ÚŠØ§Øą Ø¨Øą Ø§ØŗØ§Øŗ Ø§Ų†Ø¯Ø§Ø˛Ų‡/ØĒؚداد", "desc": "ØĒŲ‚ØŗÛŒŲ… یڊ PDF Ø¨Ų‡ Ú†Ų†Ø¯ ØŗŲ†Ø¯ Ø¨Øą Ø§ØŗØ§Øŗ Ø§Ų†Ø¯Ø§Ø˛Ų‡ØŒ ØĒؚداد ØĩŲØ­Ø§ØĒ، یا ØĒؚداد Ø§ØŗŲ†Ø§Ø¯" }, - "overlay-pdfs": { - "title": "Ų‡Ų…â€ŒŲžŲˆØ´Ø§Ų†ÛŒ PDFâ€ŒŲ‡Ø§", - "desc": "PDFâ€ŒŲ‡Ø§ ØąØ§ Ø¨Øą ØąŲˆÛŒ PDF Ø¯ÛŒÚ¯ØąÛŒ Ų‡Ų…â€ŒŲžŲˆØ´Ø§Ų†ÛŒ Ų…ÛŒâ€ŒÚŠŲ†Ø¯" - }, "split-by-sections": { "title": "ØĒŲ‚ØŗÛŒŲ… PDF Ø¨Øą Ø§ØŗØ§Øŗ Ø¨ØŽØ´â€ŒŲ‡Ø§", "desc": "Ų‡Øą ØĩŲØ­Ų‡ Ø§Ø˛ PDF ØąØ§ Ø¨Ų‡ Ø¨ØŽØ´â€ŒŲ‡Ø§ÛŒ Ø§ŲŲ‚ÛŒ ؈ ØšŲ…ŲˆØ¯ÛŒ ÚŠŲˆÚ†ÚŠâ€ŒØĒØą ØĒŲ‚ØŗÛŒŲ… Ų…ÛŒâ€ŒÚŠŲ†Ø¯" @@ -563,43 +878,17 @@ "title": "Ø§ŲØ˛ŲˆØ¯Ų† Ų…Ų‡Øą Ø¨Ų‡ PDF", "desc": "Ø§ŲØ˛ŲˆØ¯Ų† Ų…Ų‡Øą Ų…ØĒŲ†ÛŒ یا ØĒØĩŲˆÛŒØąÛŒ Ø¯Øą Ų…ÚŠØ§Ų†â€ŒŲ‡Ø§ÛŒ Ų…Ø´ØŽØĩ" }, - "removeImage": { - "title": "Ø­Ø°Ų ØĒØĩŲˆÛŒØą", - "desc": "Ø­Ø°Ų ØĒØĩØ§ŲˆÛŒØą Ø§Ø˛ PDF Ø¨ØąØ§ÛŒ ÚŠØ§Ų‡Ø´ Ø­ØŦŲ… ŲØ§ÛŒŲ„" - }, - "splitByChapters": { - "title": "ØĒŲ‚ØŗÛŒŲ… PDF Ø¨Øą Ø§ØŗØ§Øŗ ؁ØĩŲ„â€ŒŲ‡Ø§", - "desc": "ØĒŲ‚ØŗÛŒŲ… PDF Ø¨Ų‡ Ú†Ų†Ø¯ ŲØ§ÛŒŲ„ Ø¨Øą Ø§ØŗØ§Øŗ ØŗØ§ØŽØĒØ§Øą ؁ØĩŲ„â€ŒŲ‡Ø§" - }, - "validateSignature": { - "title": "اؚØĒØ¨Ø§ØąØŗŲ†ØŦی Ø§Ų…Øļای PDF", - "desc": "ØĒØŖÛŒÛŒØ¯ Ø§Ų…ØļØ§Ų‡Ø§ ؈ Ú¯ŲˆØ§Ų‡ÛŒâ€ŒŲ‡Ø§ÛŒ دیØŦیØĒØ§Ų„ Ø¯Øą Ø§ØŗŲ†Ø§Ø¯ PDF" - }, "replace-color": { "title": "ØŦØ§ÛŒÚ¯Ø˛ÛŒŲ†ÛŒ ؈ Ų…ØšÚŠŲˆØŗ ÚŠØąØ¯Ų† ØąŲ†Ú¯", "desc": "ØŦØ§ÛŒÚ¯Ø˛ÛŒŲ†ÛŒ ØąŲ†Ú¯ Ų…ØĒŲ† ؈ ŲžØŗâ€ŒØ˛Ų…ÛŒŲ†Ų‡ Ø¯Øą PDF ؈ Ų…ØšÚŠŲˆØŗ ÚŠØąØ¯Ų† ÚŠŲ„ ØąŲ†Ú¯â€ŒŲ‡Ø§ Ø¨ØąØ§ÛŒ ÚŠØ§Ų‡Ø´ Ø­ØŦŲ… ŲØ§ÛŒŲ„" }, - "convert": { - "title": "ØĒØ¨Ø¯ÛŒŲ„" - }, "attachments": { "title": "Add attachments" }, - "extractPages": { - "title": "Ø§ØŗØĒØŽØąØ§ØŦ ØĩŲØ­Ø§ØĒ" - }, - "removePages": { - "title": "Ø­Ø°Ų", - "desc": "Ø­Ø°Ų ØĩŲØ­Ø§ØĒ Ų†Ø§ØŽŲˆØ§ØŗØĒŲ‡ Ø§Ø˛ ØŗŲ†Ø¯ PDF Ø´Ų…Ø§." - }, "removeImagePdf": { "title": "Ø­Ø°Ų ØĒØĩŲˆÛŒØą", "desc": "Ø­Ø°Ų ØĒØĩØ§ŲˆÛŒØą Ø§Ø˛ PDF Ø¨ØąØ§ÛŒ ÚŠØ§Ų‡Ø´ Ø­ØŦŲ… ŲØ§ÛŒŲ„" }, - "autoSizeSplitPDF": { - "title": "ØĒŲ‚ØŗÛŒŲ… ØŽŲˆØ¯ÚŠØ§Øą Ø¨Øą Ø§ØŗØ§Øŗ Ø§Ų†Ø¯Ø§Ø˛Ų‡/ØĒؚداد", - "desc": "ØĒŲ‚ØŗÛŒŲ… یڊ PDF Ø¨Ų‡ Ú†Ų†Ø¯ ØŗŲ†Ø¯ Ø¨Øą Ø§ØŗØ§Øŗ Ø§Ų†Ø¯Ø§Ø˛Ų‡ØŒ ØĒؚداد ØĩŲØ­Ø§ØĒ، یا ØĒؚداد Ø§ØŗŲ†Ø§Ø¯" - }, "adjust-contrast": { "title": "ØĒŲ†Ø¸ÛŒŲ… ØąŲ†Ú¯â€ŒŲ‡Ø§/ÚŠŲ†ØĒØąØ§ØŗØĒ", "desc": "ØĒŲ†Ø¸ÛŒŲ… ÚŠŲ†ØĒØąØ§ØŗØĒ، اشباؚ ؈ ØąŲˆØ´Ų†Ø§ÛŒÛŒ یڊ PDF" @@ -607,11 +896,12 @@ "replaceColorPdf": { "title": "ØŦØ§ÛŒÚ¯Ø˛ÛŒŲ†ÛŒ ؈ Ų…ØšÚŠŲˆØŗ ÚŠØąØ¯Ų† ØąŲ†Ú¯", "desc": "ØŦØ§ÛŒÚ¯Ø˛ÛŒŲ†ÛŒ ØąŲ†Ú¯ Ų…ØĒŲ† ؈ ŲžØŗâ€ŒØ˛Ų…ÛŒŲ†Ų‡ Ø¯Øą PDF ؈ Ų…ØšÚŠŲˆØŗ ÚŠØąØ¯Ų† ÚŠŲ„ ØąŲ†Ú¯â€ŒŲ‡Ø§ Ø¨ØąØ§ÛŒ ÚŠØ§Ų‡Ø´ Ø­ØŦŲ… ŲØ§ÛŒŲ„" - }, - "changePermissions": { - "title": "ØĒØēÛŒÛŒØą Ų…ØŦŲˆØ˛Ų‡Ø§" } }, + "landing": { + "addFiles": "Add Files", + "uploadFromComputer": "Upload from computer" + }, "viewPdf": { "tags": "Ų…Ø´Ø§Ų‡Ø¯Ų‡ØŒØŽŲˆØ§Ų†Ø¯Ų†ØŒØ­Ø§Ø´ÛŒŲ‡â€ŒŲ†ŲˆÛŒØŗÛŒØŒŲ…ØĒŲ†ØŒØĒØĩŲˆÛŒØą", "title": "View/Edit PDF", @@ -645,17 +935,39 @@ "merge": { "tags": "ØĒØąÚŠÛŒØ¨ØŒØšŲ…Ų„ÛŒØ§ØĒ ØĩŲØ­Ø§ØĒØŒØ¨ÚŠâ€ŒØ§Ų†Ø¯ØŒØŗŲ…ØĒ ØŗØąŲˆØą", "title": "ادØēØ§Ų…", + "removeDigitalSignature": { + "label": "Remove digital signature in the merged file?", + "tooltip": { + "title": "Remove Digital Signature", + "description": "Digital signatures will be invalidated when merging files. Check this to remove them from the final merged PDF." + } + }, + "generateTableOfContents": { + "label": "Generate table of contents in the merged file?", + "tooltip": { + "title": "Generate Table of Contents", + "description": "Automatically creates a clickable table of contents in the merged PDF based on the original file names and page numbers." + } + }, + "submit": "ادØēØ§Ų…", + "sortBy": { + "description": "Files will be merged in the order they're selected. Drag to reorder or sort below.", + "label": "Sort By", + "filename": "Ų†Ø§Ų… ŲØ§ÛŒŲ„", + "dateModified": "Date Modified", + "ascending": "Ascending", + "descending": "Descending", + "sort": "Sort" + }, + "error": { + "failed": "An error occurred while merging the PDFs." + }, "header": "ادØēØ§Ų… Ú†Ų†Ø¯ÛŒŲ† PDF (Û˛+)", "sortByName": "Ų…ØąØĒØ¨â€ŒØŗØ§Ø˛ÛŒ Ø¨Øą Ø§ØŗØ§Øŗ Ų†Ø§Ų…", "sortByDate": "Ų…ØąØĒØ¨â€ŒØŗØ§Ø˛ÛŒ Ø¨Øą Ø§ØŗØ§Øŗ ØĒØ§ØąÛŒØŽ", - "removeCertSign": "Ø­Ø°Ų Ø§Ų…Øļای دیØŦیØĒØ§Ų„ Ø¯Øą ŲØ§ÛŒŲ„ ادØēØ§Ų…â€ŒØ´Ø¯Ų‡ØŸ", - "submit": "ادØēØ§Ų…", - "sortBy": { - "filename": "Ų†Ø§Ų… ŲØ§ÛŒŲ„" - } + "removeCertSign": "Ø­Ø°Ų Ø§Ų…Øļای دیØŦیØĒØ§Ų„ Ø¯Øą ŲØ§ÛŒŲ„ ادØēØ§Ų…â€ŒØ´Ø¯Ų‡ØŸ" }, "split": { - "tags": "ØšŲ…Ų„ÛŒØ§ØĒ ØĩŲØ­Ø§ØĒ،ØĒŲ‚ØŗÛŒŲ…ØŒÚ†Ų†Ø¯ ØĩŲØ­Ų‡ØŒØ¨ØąØ´ØŒØŗŲ…ØĒ ØŗØąŲˆØą", "title": "ØĒŲ‚ØŗÛŒŲ… PDF", "header": "ØĒŲ‚ØŗÛŒŲ… PDF", "desc": { @@ -671,25 +983,249 @@ "splitPages": "ØĩŲØ­Ø§ØĒ Ø¨ØąØ§ÛŒ ØĒŲ‚ØŗÛŒŲ… ØąØ§ ŲˆØ§ØąØ¯ ÚŠŲ†ÛŒØ¯:", "submit": "ØĒŲ‚ØŗÛŒŲ…", "steps": { + "chooseMethod": "Choose Method", "settings": "ØĒŲ†Ø¸ÛŒŲ…Ø§ØĒ" }, + "settings": { + "selectMethodFirst": "Please select a split method first" + }, + "error": { + "failed": "An error occurred while splitting the PDF." + }, + "method": { + "label": "Choose split method", + "placeholder": "Select how to split the PDF" + }, "methods": { + "prefix": { + "splitAt": "Split at", + "splitBy": "Split by" + }, + "byPages": { + "name": "Page Numbers", + "desc": "Extract specific pages (1,3,5-10)", + "tooltip": "Enter page numbers separated by commas or ranges with hyphens" + }, + "bySections": { + "name": "Sections", + "desc": "Divide pages into grid sections", + "tooltip": "Split each page into horizontal and vertical sections" + }, "bySize": { - "name": "Ø§Ų†Ø¯Ø§Ø˛Ų‡ ŲØ§ÛŒŲ„" + "name": "Ø§Ų†Ø¯Ø§Ø˛Ų‡ ŲØ§ÛŒŲ„", + "desc": "Limit maximum file size", + "tooltip": "Specify maximum file size (e.g. 10MB, 500KB)" + }, + "byPageCount": { + "name": "Page Count", + "desc": "Fixed pages per file", + "tooltip": "Enter the number of pages for each split file" + }, + "byDocCount": { + "name": "Document Count", + "desc": "Create specific number of files", + "tooltip": "Enter how many files you want to create" + }, + "byChapters": { + "name": "Chapters", + "desc": "Split at bookmark boundaries", + "tooltip": "Uses PDF bookmarks to determine split points" + }, + "byPageDivider": { + "name": "Page Divider", + "desc": "Auto-split with divider sheets", + "tooltip": "Use QR code divider sheets between documents when scanning" } }, "value": { "fileSize": { - "label": "Ø§Ų†Ø¯Ø§Ø˛Ų‡ ŲØ§ÛŒŲ„" + "label": "Ø§Ų†Ø¯Ø§Ø˛Ų‡ ŲØ§ÛŒŲ„", + "placeholder": "e.g. 10MB, 500KB" + }, + "pageCount": { + "label": "Pages per File", + "placeholder": "e.g. 5, 10" + }, + "docCount": { + "label": "Number of Files", + "placeholder": "e.g. 3, 5" } - } + }, + "tooltip": { + "header": { + "title": "Split Methods Overview" + }, + "byPages": { + "title": "Split at Page Numbers", + "text": "Split your PDF at specific page numbers. Using 'n' splits after page n. Using 'n-m' splits before page n and after page m.", + "bullet1": "Single split points: 3,7 (splits after pages 3 and 7)", + "bullet2": "Range split points: 3-8 (splits before page 3 and after page 8)", + "bullet3": "Mixed: 2,5-10,15 (splits after page 2, before page 5, after page 10, and after page 15)" + }, + "bySections": { + "title": "Split by Grid Sections", + "text": "Divide each page into a grid of sections. Useful for splitting documents with multiple columns or extracting specific areas.", + "bullet1": "Horizontal: Number of rows to create", + "bullet2": "Vertical: Number of columns to create", + "bullet3": "Merge: Combine all sections into one PDF" + }, + "bySize": { + "title": "Split by File Size", + "text": "Create multiple PDFs that don't exceed a specified file size. Ideal for file size limitations or email attachments.", + "bullet1": "Use MB for larger files (e.g., 10MB)", + "bullet2": "Use KB for smaller files (e.g., 500KB)", + "bullet3": "System will split at page boundaries" + }, + "byCount": { + "title": "Split by Count", + "text": "Create multiple PDFs with a specific number of pages or documents each.", + "bullet1": "Page Count: Fixed number of pages per file", + "bullet2": "Document Count: Fixed number of output files", + "bullet3": "Useful for batch processing workflows" + }, + "byChapters": { + "title": "Split by Chapters", + "text": "Use PDF bookmarks to automatically split at chapter boundaries. Requires PDFs with bookmark structure.", + "bullet1": "Bookmark Level: Which level to split on (1=top level)", + "bullet2": "Include Metadata: Preserve document properties", + "bullet3": "Allow Duplicates: Handle repeated bookmark names" + }, + "byDocCount": { + "bullet1": "Enter the number of output files you want", + "bullet2": "Pages are distributed as evenly as possible", + "bullet3": "Useful when you need a specific number of files", + "text": "Create a specific number of output files by evenly distributing pages across them.", + "title": "Split by Document Count" + }, + "byPageCount": { + "bullet1": "Enter the number of pages per output file", + "bullet2": "Last file may have fewer pages if not evenly divisible", + "bullet3": "Useful for batch processing workflows", + "text": "Create multiple PDFs with a specific number of pages each. Perfect for creating uniform document chunks.", + "title": "Split by Page Count" + }, + "byPageDivider": { + "bullet1": "Print divider sheets from the download link", + "bullet2": "Insert divider sheets between your documents", + "bullet3": "Scan all documents together as one PDF", + "bullet4": "Upload - divider pages are automatically detected and removed", + "bullet5": "Enable Duplex Mode if scanning both sides of divider sheets", + "text": "Automatically split scanned documents using physical divider sheets with QR codes. Perfect for processing multiple documents scanned together.", + "title": "Split by Page Divider" + } + }, + "methodSelection": { + "tooltip": { + "bullet1": "Click on a method card to select it", + "bullet2": "Hover over each card to see a quick description", + "bullet3": "The settings step will appear after you select a method", + "bullet4": "You can change methods at any time before processing", + "header": { + "text": "Choose how you want to split your PDF document. Each method is optimized for different use cases and document types.", + "title": "Split Method Selection" + }, + "title": "Choose Your Split Method" + } + }, + "selectMethod": "Select a split method", + "tags": "ØšŲ…Ų„ÛŒØ§ØĒ ØĩŲØ­Ø§ØĒ،ØĒŲ‚ØŗÛŒŲ…ØŒÚ†Ų†Ø¯ ØĩŲØ­Ų‡ØŒØ¨ØąØ´ØŒØŗŲ…ØĒ ØŗØąŲˆØą" }, "rotate": { - "tags": "ØŗŲ…ØĒ ØŗØąŲˆØą", "title": "Ú†ØąØŽØ´ PDF", + "submit": "Ú†ØąØŽØ´", + "selectRotation": "Select Rotation Angle (Clockwise)", + "error": { + "failed": "An error occurred while rotating the PDF." + }, + "preview": { + "title": "Rotation Preview" + }, + "rotateLeft": "Rotate Anticlockwise", + "rotateRight": "Rotate Clockwise", + "tooltip": { + "header": { + "title": "Rotate Settings Overview" + }, + "description": { + "text": "Rotate your PDF pages clockwise or anticlockwise in 90-degree increments. All pages in the PDF will be rotated. The preview shows how your document will look after rotation." + }, + "controls": { + "title": "Controls", + "text": "Use the rotation buttons to adjust orientation. Left button rotates anticlockwise, right button rotates clockwise. Each click rotates by 90 degrees." + } + }, + "tags": "ØŗŲ…ØĒ ØŗØąŲˆØą", "header": "Ú†ØąØŽØ´ PDF", - "selectAngle": "Ø˛Ø§ŲˆÛŒŲ‡ Ú†ØąØŽØ´ ØąØ§ Ø§Ų†ØĒ؎اب ÚŠŲ†ÛŒØ¯ (Ø¨Ų‡ Ų…ØļØąØ¨â€ŒŲ‡Ø§ÛŒ ÛšÛ° Ø¯ØąØŦŲ‡):", - "submit": "Ú†ØąØŽØ´" + "selectAngle": "Ø˛Ø§ŲˆÛŒŲ‡ Ú†ØąØŽØ´ ØąØ§ Ø§Ų†ØĒ؎اب ÚŠŲ†ÛŒØ¯ (Ø¨Ų‡ Ų…ØļØąØ¨â€ŒŲ‡Ø§ÛŒ ÛšÛ° Ø¯ØąØŦŲ‡):" + }, + "convert": { + "title": "ØĒØ¨Ø¯ÛŒŲ„", + "desc": "Convert files between different formats", + "files": "Files", + "selectFilesPlaceholder": "Select files in the main view to get started", + "settings": "ØĒŲ†Ø¸ÛŒŲ…Ø§ØĒ", + "conversionCompleted": "Conversion completed", + "results": "Results", + "defaultFilename": "converted_file", + "conversionResults": "Conversion Results", + "convertFrom": "Convert from", + "convertTo": "Convert to", + "sourceFormatPlaceholder": "Source format", + "targetFormatPlaceholder": "Target format", + "selectSourceFormatFirst": "Select a source format first", + "outputOptions": "Output Options", + "pdfOptions": "PDF Options", + "imageOptions": "Image Options", + "colorType": "Colour Type", + "color": "ØąŲ†Ú¯", + "greyscale": "ØŽØ§ÚŠØŗØĒØąÛŒ", + "blackwhite": "Black & White", + "dpi": "DPI", + "output": "Output", + "single": "Single", + "multiple": "Multiple", + "fitOption": "Fit Option", + "maintainAspectRatio": "Maintain Aspect Ratio", + "fitDocumentToPage": "Fit Document to Page", + "fillPage": "ŲžØą ÚŠØąØ¯Ų† ØĩŲØ­Ų‡", + "autoRotate": "Auto Rotate", + "autoRotateDescription": "Automatically rotate images to better fit the PDF page", + "combineImages": "Combine Images", + "combineImagesDescription": "Combine all images into one PDF, or create separate PDFs for each image", + "webOptions": "Web to PDF Options", + "zoomLevel": "Zoom Level", + "emailOptions": "Email to PDF Options", + "includeAttachments": "Include email attachments", + "maxAttachmentSize": "Maximum attachment size (MB)", + "includeAllRecipients": "Include CC and BCC recipients in header", + "downloadHtml": "Download HTML intermediate file instead of PDF", + "pdfaOptions": "PDF/A Options", + "outputFormat": "Output Format", + "pdfaNote": "PDF/A-1b is more compatible, PDF/A-2b supports more features.", + "pdfaDigitalSignatureWarning": "PDF Ø­Ø§ŲˆÛŒ یڊ Ø§Ų…Øļای دیØŦیØĒØ§Ų„ Ø§ØŗØĒ. Ø§ÛŒŲ† Ø¯Øą Ų…ØąØ­Ų„Ų‡ بؚد Ø­Ø°Ų ØŽŲˆØ§Ų‡Ø¯ شد.", + "fileFormat": "File Format", + "wordDoc": "Word Document", + "wordDocExt": "Word Document (.docx)", + "odtExt": "OpenDocument Text (.odt)", + "pptExt": "PowerPoint (.pptx)", + "odpExt": "OpenDocument Presentation (.odp)", + "txtExt": "Plain Text (.txt)", + "rtfExt": "Rich Text Format (.rtf)", + "selectedFiles": "Selected files", + "noFileSelected": "No file selected. Use the file panel to add files.", + "convertFiles": "Convert Files", + "converting": "Converting...", + "downloadConverted": "Download Converted File", + "errorNoFiles": "Please select at least one file to convert.", + "errorNoFormat": "Please select both source and target formats.", + "errorNotSupported": "Conversion from {{from}} to {{to}} is not supported.", + "images": "Images", + "officeDocs": "Office Documents (Word, Excel, PowerPoint)", + "imagesExt": "Images (JPG, PNG, etc.)", + "markdown": "Markdown", + "textRtf": "Text/RTF", + "grayscale": "ØŽØ§ÚŠØŗØĒØąÛŒ", + "errorConversion": "An error occurred while converting the file." }, "imageToPdf": { "tags": "ØĒØ¨Ø¯ÛŒŲ„ØŒØšÚŠØŗØŒjpg،ØĒØĩŲˆÛŒØąØŒØšÚŠØŗ" @@ -727,7 +1263,33 @@ "8": "Ø­Ø°Ų ØĸØŽØąÛŒŲ†", "9": "Ø­Ø°Ų Ø§ŲˆŲ„ ؈ ØĸØŽØą", "10": "ادØēØ§Ų… ŲØąØ¯-Ø˛ŲˆØŦ", - "11": "Duplicate all pages" + "11": "Duplicate all pages", + "desc": { + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, â€Ļ).", + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, â€Ļ).", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimized for binding on the side)." + } + }, + "desc": { + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, â€Ļ).", + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, â€Ļ).", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimised for binding on the side).", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document." }, "placeholder": "(Ų…ØĢØ§Ų„: Ûą,Ûŗ,Û˛ یا Û´-Û¸,Û˛,ÛąÛ°-ÛąÛ˛ یا 2n-1)" }, @@ -739,9 +1301,198 @@ "upload": "Ø§ŲØ˛ŲˆØ¯Ų† ØĒØĩŲˆÛŒØą", "submit": "Ø§ŲØ˛ŲˆØ¯Ų† ØĒØĩŲˆÛŒØą" }, + "attachments": { + "tags": "embed,attach,file,attachment,attachments", + "title": "Add attachments", + "header": "Add attachments", + "add": "Add Attachment", + "remove": "Remove Attachment", + "embed": "Embed Attachment", + "submit": "Add attachments" + }, "watermark": { - "tags": "Ų…ØĒŲ†ØŒØĒÚŠØąØ§ØąÛŒØŒØ¨ØąÚ†ØŗØ¨ØŒØŽŲˆØ¯ØŒÚŠŲžÛŒâ€ŒØąØ§ÛŒØĒØŒØšŲ„Ø§Ų…ØĒ ØĒØŦØ§ØąÛŒØŒØĒØĩŲˆÛŒØąØŒjpgØŒØšÚŠØŗ", "title": "Ø§ŲØ˛ŲˆØ¯Ų† ŲˆØ§ØĒØąŲ…Ø§ØąÚŠ", + "desc": "Add text or image watermarks to PDF files", + "completed": "Watermark added", + "submit": "Ø§ŲØ˛ŲˆØ¯Ų† ŲˆØ§ØĒØąŲ…Ø§ØąÚŠ", + "filenamePrefix": "watermarked", + "error": { + "failed": "An error occurred while adding watermark to the PDF." + }, + "watermarkType": { + "text": "Ų…ØĒŲ†", + "image": "Image" + }, + "settings": { + "type": "Watermark Type", + "text": { + "label": "Watermark Text", + "placeholder": "Enter watermark text" + }, + "image": { + "label": "Watermark Image", + "choose": "Choose Image", + "selected": "Selected: {{filename}}" + }, + "fontSize": "Ø§Ų†Ø¯Ø§Ø˛Ų‡ ŲŲˆŲ†ØĒ", + "size": "Size", + "alphabet": "Font/Language", + "color": "Watermark Colour", + "rotation": "Rotation (degrees)", + "opacity": "Opacity (%)", + "spacing": { + "horizontal": "Horizontal Spacing", + "vertical": "Vertical Spacing", + "height": "Height Spacing", + "width": "Width Spacing" + }, + "convertToImage": "Flatten PDF pages to images" + }, + "alphabet": { + "roman": "Roman/Latin", + "arabic": "Arabic", + "japanese": "Japanese", + "korean": "Korean", + "chinese": "Chinese", + "thai": "Thai" + }, + "steps": { + "type": "Watermark Type", + "wording": "Wording", + "textStyle": "Style", + "formatting": "Formatting", + "file": "Watermark File" + }, + "results": { + "title": "Watermark Results" + }, + "tooltip": { + "language": { + "title": "Language Support", + "text": "Choose the appropriate language setting to ensure proper font rendering for your text." + }, + "appearance": { + "title": "Appearance Settings", + "text": "Control how your watermark looks and blends with the document.", + "bullet1": "Rotation: -360° to 360° for angled watermarks", + "bullet2": "Opacity: 0-100% for transparency control", + "bullet3": "Lower opacity creates subtle watermarks" + }, + "spacing": { + "title": "Spacing Control", + "text": "Adjust the spacing between repeated watermarks across the page.", + "bullet1": "Width spacing: Horizontal distance between watermarks", + "bullet2": "Height spacing: Vertical distance between watermarks", + "bullet3": "Higher values create more spread out patterns" + }, + "type": { + "header": { + "title": "Watermark Type Selection" + }, + "description": { + "title": "Choose Your Watermark", + "text": "Select between text or image watermarks based on your needs." + }, + "text": { + "title": "Text Watermarks", + "text": "Perfect for adding copyright notices, company names, or confidentiality labels. Supports multiple languages and custom colours.", + "bullet1": "Customisable fonts and languages", + "bullet2": "Adjustable colours and transparency", + "bullet3": "Ideal for legal or branding text" + }, + "image": { + "title": "Image Watermarks", + "text": "Use logos, stamps, or any image as a watermark. Great for branding and visual identification.", + "bullet1": "Upload any image format", + "bullet2": "Maintains image quality", + "bullet3": "Perfect for logos and stamps" + } + }, + "wording": { + "header": { + "title": "Text Content" + }, + "text": { + "title": "Watermark Text", + "text": "Enter the text that will appear as your watermark across the document.", + "bullet1": "Keep it concise for better readability", + "bullet2": "Common examples: 'CONFIDENTIAL', 'DRAFT', company name", + "bullet3": "Emoji characters are not supported and will be filtered out" + } + }, + "textStyle": { + "header": { + "title": "Text Style" + }, + "color": { + "title": "Colour Selection", + "text": "Choose a colour that provides good contrast with your document content.", + "bullet1": "Light grey (#d3d3d3) for subtle watermarks", + "bullet2": "Black or dark colours for high contrast", + "bullet3": "Custom colours for branding purposes" + }, + "language": { + "title": "Language Support", + "text": "Choose the appropriate language setting to ensure proper font rendering." + } + }, + "file": { + "header": { + "title": "Image Upload" + }, + "upload": { + "title": "Image Selection", + "text": "Upload an image file to use as your watermark.", + "bullet1": "Supports common formats: PNG, JPG, GIF, BMP", + "bullet2": "PNG with transparency works best", + "bullet3": "Higher resolution images maintain quality better" + }, + "recommendations": { + "title": "Best Practices", + "text": "Tips for optimal image watermark results.", + "bullet1": "Use logos or stamps with transparent backgrounds", + "bullet2": "Simple designs work better than complex images", + "bullet3": "Consider the final document size when choosing resolution" + } + }, + "formatting": { + "header": { + "title": "Formatting & Layout" + }, + "size": { + "title": "Size Control", + "text": "Adjust the size of your watermark (text or image).", + "bullet1": "Larger sizes create more prominent watermarks" + }, + "appearance": { + "title": "Appearance Settings", + "text": "Control how your watermark looks and blends with the document.", + "bullet1": "Rotation: -360° to 360° for angled watermarks", + "bullet2": "Opacity: 0-100% for transparency control", + "bullet3": "Lower opacity creates subtle watermarks" + }, + "spacing": { + "title": "Spacing Control", + "text": "Adjust the spacing between repeated watermarks across the page.", + "bullet1": "Horizontal spacing: Distance between watermarks left to right", + "bullet2": "Vertical spacing: Distance between watermarks top to bottom", + "bullet3": "Higher values create more spread out patterns" + }, + "security": { + "title": "Security Option", + "text": "Convert the final PDF to an image-based format for enhanced security.", + "bullet1": "Prevents text selection and copying", + "bullet2": "Makes watermarks harder to remove", + "bullet3": "Results in larger file sizes", + "bullet4": "Best for sensitive or copyrighted content" + } + } + }, + "type": { + "1": "Ų…ØĒŲ†", + "2": "ØĒØĩŲˆÛŒØą" + }, + "tags": "Ų…ØĒŲ†ØŒØĒÚŠØąØ§ØąÛŒØŒØ¨ØąÚ†ØŗØ¨ØŒØŽŲˆØ¯ØŒÚŠŲžÛŒâ€ŒØąØ§ÛŒØĒØŒØšŲ„Ø§Ų…ØĒ ØĒØŦØ§ØąÛŒØŒØĒØĩŲˆÛŒØąØŒjpgØŒØšÚŠØŗ", "header": "Ø§ŲØ˛ŲˆØ¯Ų† ŲˆØ§ØĒØąŲ…Ø§ØąÚŠ", "customColor": "ØąŲ†Ú¯ Ų…ØĒŲ† ØŗŲØ§ØąØ´ÛŒ", "selectText": { @@ -755,17 +1506,6 @@ "8": "Ų†ŲˆØš ŲˆØ§ØĒØąŲ…Ø§ØąÚŠ:", "9": "ØĒØĩŲˆÛŒØą ŲˆØ§ØĒØąŲ…Ø§ØąÚŠ:", "10": "ØĒØ¨Ø¯ÛŒŲ„ PDF Ø¨Ų‡ PDF-Image" - }, - "submit": "Ø§ŲØ˛ŲˆØ¯Ų† ŲˆØ§ØĒØąŲ…Ø§ØąÚŠ", - "type": { - "1": "Ų…ØĒŲ†", - "2": "ØĒØĩŲˆÛŒØą" - }, - "watermarkType": { - "text": "Ų…ØĒŲ†" - }, - "settings": { - "fontSize": "Ø§Ų†Ø¯Ø§Ø˛Ų‡ ŲŲˆŲ†ØĒ" } }, "permissions": { @@ -790,50 +1530,201 @@ "removePages": { "tags": "Ø­Ø°Ų ØĩŲØ­Ø§ØĒØŒŲžØ§ÚŠ ÚŠØąØ¯Ų† ØĩŲØ­Ø§ØĒ", "title": "Ø­Ø°Ų", + "pageNumbers": { + "label": "Pages to Remove", + "placeholder": "e.g., 1,3,5-8,10", + "error": "Invalid page number format. Use numbers, ranges (1-5), or mathematical expressions (2n+1)" + }, + "filenamePrefix": "pages_removed", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "settings": { + "title": "Settings" + }, + "tooltip": { + "header": { + "title": "Remove Pages Settings" + }, + "pageNumbers": { + "title": "Page Selection", + "text": "Specify which pages to remove from your PDF. You can select individual pages, ranges, or use mathematical expressions.", + "bullet1": "Individual pages: 1,3,5 (removes pages 1, 3, and 5)", + "bullet2": "Page ranges: 1-5,10-15 (removes pages 1-5 and 10-15)", + "bullet3": "Mathematical: 2n+1 (removes odd pages)", + "bullet4": "Open ranges: 5- (removes from page 5 to end)" + }, + "examples": { + "title": "Common Examples", + "text": "Here are some common page selection patterns:", + "bullet1": "Remove first page: 1", + "bullet2": "Remove last 3 pages: -3", + "bullet3": "Remove every other page: 2n", + "bullet4": "Remove specific scattered pages: 1,5,10,15" + }, + "safety": { + "title": "Safety Tips", + "text": "Important considerations when removing pages:", + "bullet1": "Always preview your selection before processing", + "bullet2": "Keep a backup of your original file", + "bullet3": "Page numbers start from 1, not 0", + "bullet4": "Invalid page numbers will be ignored" + } + }, + "error": { + "failed": "An error occurred whilst removing pages." + }, + "results": { + "title": "Page Removal Results" + }, "submit": "Ø­Ø°Ų" }, - "addPassword": { - "tags": "Ø§Ų…Ų†ØŒØ§Ų…Ų†ÛŒØĒ", - "title": "Ø§ŲØ˛ŲˆØ¯Ų† Ú¯Ø°ØąŲˆØ§Ú˜Ų‡", - "header": "Ø§ŲØ˛ŲˆØ¯Ų† Ú¯Ø°ØąŲˆØ§Ú˜Ų‡ (ØąŲ…Ø˛Ų†Ú¯Ø§ØąÛŒ)", - "selectText": { - "1": "Ø§Ų†ØĒ؎اب PDF Ø¨ØąØ§ÛŒ ØąŲ…Ø˛Ų†Ú¯Ø§ØąÛŒ", - "2": "Ú¯Ø°ØąŲˆØ§Ú˜Ų‡ ÚŠØ§ØąØ¨Øą", - "3": "ØˇŲˆŲ„ ÚŠŲ„ÛŒØ¯ ØąŲ…Ø˛Ų†Ú¯Ø§ØąÛŒ", - "4": "Ų…Ų‚Ø§Ø¯ÛŒØą Ø¨Ø§Ų„Ø§ØĒØą Ų‚ŲˆÛŒâ€ŒØĒØąŲ†Ø¯ØŒ Ø§Ų…Ø§ Ų…Ų‚Ø§Ø¯ÛŒØą ŲžØ§ÛŒÛŒŲ†â€ŒØĒØą Ø¨Ų‡ØĒØą ØŗØ§Ø˛Ú¯Ø§ØąŲ†Ø¯.", - "5": "Ų…ØŦŲˆØ˛Ų‡Ø§ÛŒÛŒ ÚŠŲ‡ باید ØĒŲ†Ø¸ÛŒŲ… Ø´ŲˆŲ†Ø¯ (ØĒ؈ØĩÛŒŲ‡ Ų…ÛŒâ€ŒØ´ŲˆØ¯ Ų‡Ų…ØąØ§Ų‡ با Ú¯Ø°ØąŲˆØ§Ú˜Ų‡ Ų…Ø§Ų„ÚŠ Ø§ØŗØĒŲØ§Ø¯Ų‡ Ø´ŲˆØ¯)", - "6": "ØŦŲ„ŲˆÚ¯ÛŒØąÛŒ Ø§Ø˛ Ų…ŲˆŲ†ØĒاژ ØŗŲ†Ø¯", - "7": "ØŦŲ„ŲˆÚ¯ÛŒØąÛŒ Ø§Ø˛ Ø§ØŗØĒØŽØąØ§ØŦ Ų…Ø­ØĒŲˆØ§", - "8": "ØŦŲ„ŲˆÚ¯ÛŒØąÛŒ Ø§Ø˛ Ø§ØŗØĒØŽØąØ§ØŦ Ø¨ØąØ§ÛŒ Ø¯ØŗØĒØąØŗÛŒâ€ŒŲžØ°ÛŒØąÛŒ", - "9": "ØŦŲ„ŲˆÚ¯ÛŒØąÛŒ Ø§Ø˛ ŲžØąÚŠØąØ¯Ų† ŲØąŲ…", - "10": "ØŦŲ„ŲˆÚ¯ÛŒØąÛŒ Ø§Ø˛ اØĩŲ„Ø§Ø­", - "11": "ØŦŲ„ŲˆÚ¯ÛŒØąÛŒ Ø§Ø˛ اØĩŲ„Ø§Ø­ Ø­Ø§Ø´ÛŒŲ‡â€ŒŲ†ŲˆÛŒØŗÛŒ", - "12": "ØŦŲ„ŲˆÚ¯ÛŒØąÛŒ Ø§Ø˛ Ú†Ø§Ųž", - "13": "ØŦŲ„ŲˆÚ¯ÛŒØąÛŒ Ø§Ø˛ Ú†Ø§Ųž ŲØąŲ…ØĒâ€ŒŲ‡Ø§ÛŒ Ų…ØŽØĒ؄؁", - "14": "Ú¯Ø°ØąŲˆØ§Ú˜Ų‡ Ų…Ø§Ų„ÚŠ", - "15": "Ų…Ø­Ø¯ŲˆØ¯ÛŒØĒâ€ŒŲ‡Ø§ÛŒÛŒ ÚŠŲ‡ Ų…ÛŒâ€ŒØĒŲˆØ§Ų† Ø¨Øą ØąŲˆÛŒ ØŗŲ†Ø¯ Ø§ØšŲ…Ø§Ų„ ÚŠØąØ¯ Ų‡Ų†Ú¯Ø§Ų…ÛŒ ÚŠŲ‡ Ø¨Ø§Ø˛ Ø§ØŗØĒ (ŲžØ´ØĒÛŒØ¨Ø§Ų†ÛŒâ€ŒØ´Ø¯Ų‡ ØĒŲˆØŗØˇ Ų‡Ų…Ų‡ ØŽŲˆØ§Ų†Ų†Ø¯Ú¯Ø§Ų† Ų†ÛŒØŗØĒ)", - "16": "Ų…Ø­Ø¯ŲˆØ¯ÛŒØĒâ€ŒŲ‡Ø§ÛŒ Ø¨Ø§Ø˛ Ø´Ø¯Ų† ØŽŲˆØ¯ ØŗŲ†Ø¯" + "extractPages": { + "title": "Extract Pages", + "pageNumbers": { + "label": "Pages to Extract", + "placeholder": "e.g., 1,3,5-8 or odd & 1-10" + }, + "settings": { + "title": "Settings" }, - "submit": "ØąŲ…Ø˛Ų†Ú¯Ø§ØąÛŒ", "tooltip": { - "permissions": { - "title": "ØĒØēÛŒÛŒØą Ų…ØŦŲˆØ˛Ų‡Ø§" + "description": "Extracts the selected pages into a new PDF, preserving order." + }, + "error": { + "failed": "Failed to extract pages" + }, + "results": { + "title": "Pages Extracted" + }, + "submit": "Extract Pages" + }, + "pageSelection": { + "tooltip": { + "header": { + "title": "Page Selection Guide" + }, + "basic": { + "title": "Basic Usage", + "text": "Select specific pages from your PDF document using simple syntax.", + "bullet1": "Individual pages: 1,3,5", + "bullet2": "Page ranges: 3-6 or 10-15", + "bullet3": "All pages: all" + }, + "advanced": { + "title": "Advanced Features" + }, + "tips": { + "title": "Tips", + "text": "Keep these guidelines in mind:", + "bullet1": "Page numbers start from 1 (not 0)", + "bullet2": "Spaces are automatically removed", + "bullet3": "Invalid expressions are ignored" + }, + "syntax": { + "title": "Syntax Basics", + "text": "Use numbers, ranges, keywords, and progressions (n starts at 0). Parentheses are supported.", + "bullets": { + "numbers": "Numbers/ranges: 5, 10-20", + "keywords": "Keywords: odd, even", + "progressions": "Progressions: 3n, 4n+1" + } + }, + "operators": { + "title": "Operators", + "text": "AND has higher precedence than comma. NOT applies within the document range.", + "and": "AND: & or \"and\" — require both conditions (e.g., 1-50 & even)", + "comma": "Comma: , or | — combine selections (e.g., 1-10, 20)", + "not": "NOT: ! or \"not\" — exclude pages (e.g., 3n & not 30)" + }, + "examples": { + "title": "Examples" + }, + "complex": { + "bullet1": "1,3-5,8,2n → pages 1, 3–5, 8, plus evens", + "bullet2": "10-,2n-1 → from page 10 to end + odd pages", + "description": "Mix different types.", + "title": "Complex Combinations" + }, + "description": "Choose which pages to use for the operation. Supports single pages, ranges, formulas, and the all keyword.", + "individual": { + "bullet1": "1,3,5 → selects pages 1, 3, 5", + "bullet2": "2,7,12 → selects pages 2, 7, 12", + "description": "Enter numbers separated by commas.", + "title": "Individual Pages" + }, + "mathematical": { + "bullet1": "2n → all even pages (2, 4, 6â€Ļ)", + "bullet2": "2n-1 → all odd pages (1, 3, 5â€Ļ)", + "bullet3": "3n → every 3rd page (3, 6, 9â€Ļ)", + "bullet4": "4n-1 → pages 3, 7, 11, 15â€Ļ", + "description": "Use n in formulas for patterns.", + "title": "Mathematical Functions" + }, + "ranges": { + "bullet1": "3-6 → selects pages 3–6", + "bullet2": "10-15 → selects pages 10–15", + "bullet3": "5- → selects pages 5 to end", + "description": "Use - for consecutive pages.", + "title": "Page Ranges" + }, + "special": { + "bullet1": "all → selects all pages", + "title": "Special Keywords" } } }, - "removePassword": { - "tags": "Ø§Ų…Ų†ØŒØąŲ…Ø˛Ú¯Ø´Ø§ÛŒÛŒØŒØ§Ų…Ų†ÛŒØĒØŒØ­Ø°Ų ØąŲ…Ø˛ ØšØ¨ŲˆØą", - "title": "Ø­Ø°Ų Ú¯Ø°ØąŲˆØ§Ú˜Ų‡", - "header": "Ø­Ø°Ų Ú¯Ø°ØąŲˆØ§Ú˜Ų‡ (ØąŲ…Ø˛Ú¯Ø´Ø§ÛŒÛŒ)", - "selectText": { - "1": "PDFی ØąØ§ Ø¨ØąØ§ÛŒ ØąŲ…Ø˛Ú¯Ø´Ø§ÛŒÛŒ Ø§Ų†ØĒ؎اب ÚŠŲ†ÛŒØ¯", - "2": "Ú¯Ø°ØąŲˆØ§Ú˜Ų‡" + "bulkSelection": { + "syntaxError": "There is a syntax issue. See Page Selection tips for help.", + "header": { + "title": "Page Selection Guide" }, - "submit": "Ø­Ø°Ų", - "desc": "Ø­Ø°Ų Ø­ŲØ§Ø¸ØĒ ØąŲ…Ø˛ ØšØ¨ŲˆØą Ø§Ø˛ ØŗŲ†Ø¯ PDF Ø´Ų…Ø§.", - "password": { - "stepTitle": "Ø­Ø°Ų ØąŲ…Ø˛ ØšØ¨ŲˆØą", - "label": "ØąŲ…Ø˛ ØšØ¨ŲˆØą ŲØšŲ„ÛŒ" + "syntax": { + "title": "Syntax Basics", + "text": "Use numbers, ranges, keywords, and progressions (n starts at 0). Parentheses are supported.", + "bullets": { + "numbers": "Numbers/ranges: 5, 10-20", + "keywords": "Keywords: odd, even", + "progressions": "Progressions: 3n, 4n+1" + } + }, + "operators": { + "title": "Operators", + "text": "AND has higher precedence than comma. NOT applies within the document range.", + "and": "AND: & or \"and\" — require both conditions (e.g., 1-50 & even)", + "comma": "Comma: , or | — combine selections (e.g., 1-10, 20)", + "not": "NOT: ! or \"not\" — exclude pages (e.g., 3n & not 30)" + }, + "examples": { + "title": "Examples", + "first50": "First 50", + "last50": "Last 50", + "every3rd": "Every 3rd", + "oddWithinExcluding": "Odd within 1-20 excluding 5-7", + "combineSets": "Combine sets" + }, + "firstNPages": { + "title": "First N Pages", + "placeholder": "Number of pages" + }, + "lastNPages": { + "title": "Last N Pages", + "placeholder": "Number of pages" + }, + "everyNthPage": { + "title": "Every Nth Page", + "placeholder": "Step size" + }, + "range": { + "title": "Range", + "fromPlaceholder": "From", + "toPlaceholder": "To" + }, + "keywords": { + "title": "Keywords" + }, + "advanced": { + "title": "Advanced" } }, "compressPdfs": { @@ -843,12 +1734,142 @@ "tags": "remove,delete,form,field,readonly", "title": "Remove Read-Only from Form Fields", "header": "Unlock PDF Forms", - "submit": "Remove" + "submit": "Remove", + "description": "This tool will remove read-only restrictions from PDF form fields, making them editable and fillable.", + "filenamePrefix": "unlocked_forms", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst unlocking PDF forms." + }, + "results": { + "title": "Unlocked Forms Results" + } }, "changeMetadata": { - "tags": "ØšŲ†ŲˆØ§Ų†ØŒŲ†ŲˆÛŒØŗŲ†Ø¯Ų‡ØŒØĒØ§ØąÛŒØŽØŒØ§ÛŒØŦØ§Ø¯ØŒØ˛Ų…Ø§Ų†ØŒŲ†Ø§Ø´ØąØŒØĒŲˆŲ„ÛŒØ¯ÚŠŲ†Ų†Ø¯Ų‡ØŒØĸŲ…Ø§Øą", - "title": "ØšŲ†ŲˆØ§Ų†:", "header": "ØĒØēÛŒÛŒØą Ų…ØĒØ§Ø¯Ø§Ø¯Ų‡â€ŒŲ‡Ø§", + "submit": "ØĒØēÛŒÛŒØą", + "filenamePrefix": "metadata", + "settings": { + "title": "Metadata Settings" + }, + "standardFields": { + "title": "Standard Fields" + }, + "deleteAll": { + "label": "Remove Existing Metadata", + "checkbox": "Delete all metadata" + }, + "title": { + "label": "Title", + "placeholder": "Document title" + }, + "author": { + "label": "Author", + "placeholder": "Document author" + }, + "subject": { + "label": "Subject", + "placeholder": "Document subject" + }, + "keywords": { + "label": "Keywords", + "placeholder": "Document keywords" + }, + "creator": { + "label": "Creator", + "placeholder": "Document creator" + }, + "producer": { + "label": "Producer", + "placeholder": "Document producer" + }, + "dates": { + "title": "Date Fields" + }, + "creationDate": { + "label": "Creation Date", + "placeholder": "Creation date" + }, + "modificationDate": { + "label": "Modification Date", + "placeholder": "Modification date" + }, + "trapped": { + "label": "Trapped Status", + "unknown": "Unknown", + "true": "True", + "false": "False" + }, + "advanced": { + "title": "Advanced Options" + }, + "customFields": { + "title": "Custom Metadata", + "description": "Add custom metadata fields to the document", + "add": "Add Field", + "key": "Key", + "keyPlaceholder": "Custom key", + "value": "Value", + "valuePlaceholder": "Custom value", + "remove": "Remove" + }, + "results": { + "title": "Updated PDFs" + }, + "error": { + "failed": "An error occurred while changing the PDF metadata." + }, + "tooltip": { + "header": { + "title": "PDF Metadata Overview" + }, + "standardFields": { + "title": "Standard Fields", + "text": "Common PDF metadata fields that describe the document.", + "bullet1": "Title: Document name or heading", + "bullet2": "Author: Person who created the document", + "bullet3": "Subject: Brief description of content", + "bullet4": "Keywords: Search terms for the document", + "bullet5": "Creator/Producer: Software used to create the PDF" + }, + "dates": { + "title": "Date Fields", + "text": "When the document was created and modified.", + "bullet1": "Creation Date: When original document was made", + "bullet2": "Modification Date: When last changed" + }, + "options": { + "title": "Additional Options", + "text": "Custom fields and privacy controls.", + "bullet1": "Custom Metadata: Add your own key-value pairs", + "bullet2": "Trapped Status: High-quality printing setting", + "bullet3": "Delete All: Remove all metadata for privacy" + }, + "deleteAll": { + "title": "Remove Existing Metadata", + "text": "Complete metadata deletion to ensure privacy." + }, + "customFields": { + "title": "Custom Metadata", + "text": "Add your own custom key-value metadata pairs.", + "bullet1": "Add any custom fields relevant to your document", + "bullet2": "Examples: Department, Project, Version, Status", + "bullet3": "Both key and value are required for each entry" + }, + "advanced": { + "title": "Advanced Options", + "trapped": { + "title": "Trapped Status", + "description": "Indicates if document is prepared for high-quality printing.", + "bullet1": "True: Document has been trapped for printing", + "bullet2": "False: Document has not been trapped", + "bullet3": "Unknown: Trapped status is not specified" + } + } + }, + "tags": "ØšŲ†ŲˆØ§Ų†ØŒŲ†ŲˆÛŒØŗŲ†Ø¯Ų‡ØŒØĒØ§ØąÛŒØŽØŒØ§ÛŒØŦØ§Ø¯ØŒØ˛Ų…Ø§Ų†ØŒŲ†Ø§Ø´ØąØŒØĒŲˆŲ„ÛŒØ¯ÚŠŲ†Ų†Ø¯Ų‡ØŒØĸŲ…Ø§Øą", "selectText": { "1": "Ų„ØˇŲØ§Ų‹ Ų…ØĒØēÛŒØąŲ‡Ø§ÛŒÛŒ ÚŠŲ‡ Ų…Ø§ÛŒŲ„ Ø¨Ų‡ ØĒØēÛŒÛŒØą ØĸŲ†Ų‡Ø§ Ų‡ØŗØĒید ØąØ§ ŲˆÛŒØąØ§ÛŒØ´ ÚŠŲ†ÛŒØ¯", "2": "Ø­Ø°Ų Ų‡Ų…Ų‡ Ų…ØĒØ§Ø¯Ø§Ø¯Ų‡â€ŒŲ‡Ø§", @@ -856,15 +1877,7 @@ "4": "ØŗØ§ÛŒØą Ų…ØĒØ§Ø¯Ø§Ø¯Ų‡â€ŒŲ‡Ø§:", "5": "Ø§ŲØ˛ŲˆØ¯Ų† ŲˆØąŲˆØ¯ÛŒ Ų…ØĒØ§Ø¯Ø§Ø¯Ų‡ ØŗŲØ§ØąØ´ÛŒ" }, - "author": "Ų†ŲˆÛŒØŗŲ†Ø¯Ų‡:", - "creationDate": "ØĒØ§ØąÛŒØŽ ایØŦاد (yyyy/MM/dd HH:mm:ss):", - "creator": "ØŽØ§Ų„Ų‚:", - "keywords": "ÚŠŲ„Ų…Ø§ØĒ ÚŠŲ„ÛŒØ¯ÛŒ:", - "modDate": "ØĒØ§ØąÛŒØŽ اØĩŲ„Ø§Ø­ (yyyy/MM/dd HH:mm:ss):", - "producer": "ØĒŲˆŲ„ÛŒØ¯ ÚŠŲ†Ų†Ø¯Ų‡:", - "subject": "Ų…ŲˆØļŲˆØš:", - "trapped": "Ú¯ÛŒØą Ø§ŲØĒØ§Ø¯Ų‡:", - "submit": "ØĒØēÛŒÛŒØą" + "modDate": "ØĒØ§ØąÛŒØŽ اØĩŲ„Ø§Ø­ (yyyy/MM/dd HH:mm:ss):" }, "fileToPDF": { "tags": "ØĒØ¨Ø¯ÛŒŲ„ØŒŲØąŲ…ØĒØŒØŗŲ†Ø¯ØŒØĒØĩŲˆÛŒØąØŒØ§ØŗŲ„Ø§ÛŒØ¯ØŒŲ…ØĒŲ†ØŒØĒØ¨Ø¯ÛŒŲ„ØŒØ¯ŲØĒØąØŒØ§ØŗŲ†Ø§Ø¯ØŒŲˆØąØ¯ØŒØ§ÚŠØŗŲ„ØŒŲžØ§ŲˆØąŲžŲˆÛŒŲ†ØĒ", @@ -878,6 +1891,7 @@ "ocr": { "tags": "ØĒØ´ØŽÛŒØĩØŒŲ…ØĒŲ†ØŒØĒØĩŲˆÛŒØąØŒØ§ØŗÚŠŲ†ØŒØŽŲˆØ§Ų†Ø¯Ų†ØŒØ´Ų†Ø§ØŗØ§ÛŒÛŒØŒØĸØ´ÚŠØ§ØąØŗØ§Ø˛ÛŒØŒŲ‚Ø§Ø¨Ų„ ŲˆÛŒØąØ§ÛŒØ´", "title": "OCR / Ų…ØąØĒØ¨â€ŒØŗØ§Ø˛ÛŒ Ø§ØŗÚŠŲ†â€ŒŲ‡Ø§", + "desc": "ŲžØ§ÚŠØŗØ§Ø˛ÛŒ Ø§ØŗÚŠŲ†â€ŒŲ‡Ø§ ؈ ØĒØ´ØŽÛŒØĩ Ų…ØĒŲ† Ø§Ø˛ ØĒØĩØ§ŲˆÛŒØą Ø¯ØąŲˆŲ† یڊ ŲØ§ÛŒŲ„ PDF ؈ Ø¨Ø§Ø˛Ø§ŲØ˛ŲˆØ¯Ų† ØĸŲ† Ø¨Ų‡ ØšŲ†ŲˆØ§Ų† Ų…ØĒŲ†.", "header": "Ų…ØąØĒØ¨â€ŒØŗØ§Ø˛ÛŒ Ø§ØŗÚŠŲ†â€ŒŲ‡Ø§ / OCR (Ø¨Ø§Ø˛Ø´Ų†Ø§ØŗÛŒ Ų†ŲˆÛŒØŗŲ‡ Ų†ŲˆØąÛŒ)", "selectText": { "1": "Ø˛Ø¨Ø§Ų†â€ŒŲ‡Ø§ÛŒÛŒ ØąØ§ ÚŠŲ‡ باید Ø¯Øą PDF Ø´Ų†Ø§ØŗØ§ÛŒÛŒ Ø´ŲˆŲ†Ø¯ Ø§Ų†ØĒ؎اب ÚŠŲ†ÛŒØ¯ (Ų…ŲˆØ§ØąØ¯ ŲŲ‡ØąØŗØĒ Ø´Ø¯Ų‡ Ø˛Ø¨Ø§Ų†â€ŒŲ‡Ø§ÛŒÛŒ Ų‡ØŗØĒŲ†Ø¯ ÚŠŲ‡ Ø¯Øą Ø­Ø§Ų„ حاØļØą Ø´Ų†Ø§ØŗØ§ÛŒÛŒ Ø´Ø¯Ų‡â€ŒØ§Ų†Ø¯):", @@ -896,23 +1910,89 @@ "help": "Ų„ØˇŲØ§Ų‹ Ø§ÛŒŲ† Ų…ØŗØĒŲ†Ø¯Ø§ØĒ ØąØ§ Ø¨ØŽŲˆØ§Ų†ÛŒØ¯ ØĒا Ų†Ø­ŲˆŲ‡ Ø§ØŗØĒŲØ§Ø¯Ų‡ Ø§Ø˛ Ø§ÛŒŲ† ØŗØąŲˆÛŒØŗ Ø¨ØąØ§ÛŒ Ø˛Ø¨Ø§Ų†â€ŒŲ‡Ø§ÛŒ Ø¯ÛŒÚ¯Øą ؈/یا Ø§ØŗØĒŲØ§Ø¯Ų‡ Ø§Ø˛ ØĸŲ† ÚŠŲ‡ Ø¯Øą Ø¯Ø§ØŽŲ„ Ø¯Ø§ÚŠØą Ų†ÛŒØŗØĒ ØąØ§ Ø¨Ø¯Ø§Ų†ÛŒØ¯", "credit": "Ø§ÛŒŲ† ØŗØąŲˆÛŒØŗ Ø§Ø˛ qpdf ؈ Tesseract Ø¨ØąØ§ÛŒ OCR Ø§ØŗØĒŲØ§Ø¯Ų‡ Ų…ÛŒâ€ŒÚŠŲ†Ø¯.", "submit": "ŲžØąØ¯Ø§Ø˛Ø´ PDF با OCR", - "desc": "ŲžØ§ÚŠØŗØ§Ø˛ÛŒ Ø§ØŗÚŠŲ†â€ŒŲ‡Ø§ ؈ ØĒØ´ØŽÛŒØĩ Ų…ØĒŲ† Ø§Ø˛ ØĒØĩØ§ŲˆÛŒØą Ø¯ØąŲˆŲ† یڊ ŲØ§ÛŒŲ„ PDF ؈ Ø¨Ø§Ø˛Ø§ŲØ˛ŲˆØ¯Ų† ØĸŲ† Ø¨Ų‡ ØšŲ†ŲˆØ§Ų† Ų…ØĒŲ†.", + "operation": { + "submit": "Process OCR and Review" + }, + "results": { + "title": "OCR Results" + }, + "languagePicker": { + "additionalLanguages": "Looking for additional languages?", + "viewSetupGuide": "View setup guide →" + }, "settings": { "title": "ØĒŲ†Ø¸ÛŒŲ…Ø§ØĒ", "ocrMode": { - "label": "Ø­Ø§Ų„ØĒ OCR" + "label": "Ø­Ø§Ų„ØĒ OCR", + "auto": "Auto (skip text layers)", + "force": "Force (re-OCR all, replace text)", + "strict": "Strict (abort if text found)" }, "languages": { - "label": "Ø˛Ø¨Ø§Ų†â€ŒŲ‡Ø§" + "label": "Ø˛Ø¨Ø§Ų†â€ŒŲ‡Ø§", + "placeholder": "Select languages" + }, + "compatibilityMode": { + "label": "Compatibility Mode" + }, + "advancedOptions": { + "label": "Processing Options", + "sidecar": "Create a text file", + "deskew": "Deskew pages", + "clean": "Clean input file", + "cleanFinal": "Clean final output" } }, "tooltip": { + "header": { + "title": "OCR Settings Overview" + }, "mode": { - "title": "Ø­Ø§Ų„ØĒ OCR" + "title": "Ø­Ø§Ų„ØĒ OCR", + "text": "Optical Character Recognition (OCR) helps you turn scanned or screenshotted pages into text you can search, copy, or highlight.", + "bullet1": "Auto skips pages that already contain text layers.", + "bullet2": "Force re-OCRs every page and replaces all the text.", + "bullet3": "Strict halts if any selectable text is found." }, "languages": { - "title": "Ø˛Ø¨Ø§Ų†â€ŒŲ‡Ø§" + "title": "Ø˛Ø¨Ø§Ų†â€ŒŲ‡Ø§", + "text": "Improve OCR accuracy by specifying the expected languages. Choose one or more languages to guide detection." + }, + "output": { + "title": "Output", + "text": "Decide how you want the text output formatted:", + "bullet1": "Searchable PDF embeds text behind the original image.", + "bullet2": "HOCR XML returns a structured machine-readable file.", + "bullet3": "Plain-text sidecar creates a separate .txt file with raw content." + }, + "advanced": { + "header": { + "title": "Advanced OCR Processing" + }, + "compatibility": { + "title": "Compatibility Mode", + "text": "Uses OCR 'sandwich PDF' mode: results in larger files, but more reliable with certain languages and older PDF software. By default we use hOCR for smaller, modern PDFs." + }, + "sidecar": { + "title": "Create Text File", + "text": "Generates a separate .txt file alongside the PDF containing all extracted text content for easy access and processing." + }, + "deskew": { + "title": "Deskew Pages", + "text": "Automatically corrects skewed or tilted pages to improve OCR accuracy. Useful for scanned documents that weren't perfectly aligned." + }, + "clean": { + "title": "Clean Input File", + "text": "Preprocesses the input by removing noise, enhancing contrast, and optimising the image for better OCR recognition before processing." + }, + "cleanFinal": { + "title": "Clean Final Output", + "text": "Post-processes the final PDF by removing OCR artefacts and optimising the text layer for better readability and smaller file size." + } } + }, + "error": { + "failed": "OCR operation failed" } }, "extractImages": { @@ -921,7 +2001,13 @@ "header": "Ø§ØŗØĒØŽØąØ§ØŦ ØĒØĩØ§ŲˆÛŒØą", "selectText": "ŲØąŲ…ØĒ ØĒØĩŲˆÛŒØąÛŒ ØąØ§ ÚŠŲ‡ ØĒØĩØ§ŲˆÛŒØą Ø§ØŗØĒØŽØąØ§ØŦ Ø´Ø¯Ų‡ Ø¨Ų‡ ØĸŲ† ØĒØ¨Ø¯ÛŒŲ„ Ø´ŲˆŲ†Ø¯ Ø§Ų†ØĒ؎اب ÚŠŲ†ÛŒØ¯", "allowDuplicates": "Ø°ØŽÛŒØąŲ‡ ØĒØĩØ§ŲˆÛŒØą ØĒÚŠØąØ§ØąÛŒ", - "submit": "Ø§ØŗØĒØŽØąØ§ØŦ" + "submit": "Ø§ØŗØĒØŽØąØ§ØŦ", + "settings": { + "title": "Settings" + }, + "error": { + "failed": "An error occurred while extracting images from the PDF." + } }, "pdfToPDFA": { "tags": "ØĸØąØ´ÛŒŲˆØŒØ°ØŽÛŒØąŲ‡â€ŒØŗØ§Ø˛ÛŒ Ø¨Ų„Ų†Ø¯Ų…Ø¯ØĒØŒØ§ØŗØĒØ§Ų†Ø¯Ø§ØąØ¯ØŒØĒØ¨Ø¯ÛŒŲ„ØŒØ°ØŽÛŒØąŲ‡â€ŒØŗØ§Ø˛ÛŒØŒØ­ŲØ¸", @@ -993,17 +2079,53 @@ }, "info": "ŲžØ§ÛŒØĒŲˆŲ† Ų†Øĩب Ų†Ø´Ø¯Ų‡ Ø§ØŗØĒ. Ø¨ØąØ§ÛŒ اØŦØąØ§ Ų†ÛŒØ§Ø˛ Ø§ØŗØĒ." }, + "scannerImageSplit": { + "title": "Extracted Images", + "submit": "Extract Image Scans", + "error": { + "failed": "An error occurred while extracting image scans." + }, + "tooltip": { + "title": "Photo Splitter", + "whatThisDoes": "What this does", + "whatThisDoesDesc": "Automatically finds and extracts each photo from a scanned page or composite image—no manual cropping.", + "whenToUse": "When to use", + "useCase1": "Scan whole album pages in one go", + "useCase2": "Split flatbed batches into separate files", + "useCase3": "Break collages into individual photos", + "useCase4": "Pull photos from documents", + "quickFixes": "Quick fixes", + "problem1": "Photos not detected → increase Tolerance to 30-50", + "problem2": "Too many false detections → increase Minimum Area to 15,000-20,000", + "problem3": "Crops are too tight → increase Border Size to 5-10", + "problem4": "Tilted photos not straightened → lower Angle Threshold to ~5°", + "problem5": "Dust/noise boxes → increase Minimum Contour Area to 1000-2000", + "setupTips": "Setup tips", + "tip1": "Use a plain, light background", + "tip2": "Leave a small gap (≈1 cm) between photos", + "tip3": "Scan at 300-600 DPI", + "tip4": "Clean the scanner glass", + "headsUp": "Heads-up", + "headsUpDesc": "Overlapping photos or backgrounds very close in colour to the photos can reduce accuracy-try a lighter or darker background and leave more space." + } + }, "sign": { - "tags": "ØĒØ§ÛŒÛŒØ¯ØŒØ­ØąŲˆŲ ابØĒØ¯Ø§ÛŒÛŒØŒØ§Ų…Øļای ÚŠØ´ÛŒØ¯Ų‡ØŒØ§Ų…Øļای Ų…ØĒŲ†ÛŒØŒØ§Ų…Øļای ØĒØĩŲˆÛŒØąÛŒ", "title": "Ø§Ų…Øļا", "header": "Ø§Ų…Øļای PDFŲ‡Ø§", "upload": "Ø¨Ø§ØąÚ¯Ø°Ø§ØąÛŒ ØĒØĩŲˆÛŒØą", - "draw": "ÚŠØ´ÛŒØ¯Ų† Ø§Ų…Øļا", - "text": "ŲˆØąŲˆØ¯ÛŒ Ų…ØĒŲ†", + "draw": { + "title": "Draw your signature", + "clear": "Clear" + }, + "text": { + "name": "Signer Name", + "placeholder": "Enter your full name" + }, "clear": "ŲžØ§ÚŠ ÚŠØąØ¯Ų†", "add": "اØļØ§ŲŲ‡ ÚŠØąØ¯Ų†", "saved": "Ø§Ų…ØļØ§Ų‡Ø§ÛŒ Ø°ØŽÛŒØąŲ‡â€ŒØ´Ø¯Ų‡", "save": "Ø°ØŽÛŒØąŲ‡ Ø§Ų…Øļا", + "applySignatures": "Apply Signatures", "personalSigs": "Ø§Ų…ØļØ§Ų‡Ø§ÛŒ Ø´ØŽØĩی", "sharedSigs": "Ø§Ų…ØļØ§Ų‡Ø§ÛŒ Ø¨Ų‡ اشØĒØąØ§ÚŠ گذاشØĒŲ‡â€ŒØ´Ø¯Ų‡", "noSavedSigs": "Ų‡ÛŒÚ† Ø§Ų…Øļای Ø°ØŽÛŒØąŲ‡â€ŒØ´Ø¯Ų‡â€ŒØ§ÛŒ ÛŒØ§ŲØĒ Ų†Ø´Ø¯", @@ -1015,42 +2137,179 @@ "previous": "ØĩŲØ­Ų‡ Ų‚Ø¨Ų„ÛŒ", "maintainRatio": "Toggle maintain aspect ratio", "undo": "Undo", - "redo": "Redo" + "redo": "Redo", + "submit": "Sign Document", + "steps": { + "configure": "Configure Signature" + }, + "type": { + "title": "Signature Type", + "draw": "Draw", + "canvas": "Canvas", + "image": "Image", + "text": "Text" + }, + "image": { + "label": "Upload signature image", + "placeholder": "Select image file", + "hint": "Upload a PNG or JPG image of your signature" + }, + "instructions": { + "title": "How to add signature", + "canvas": "After drawing your signature in the canvas, close the modal then click anywhere on the PDF to place it.", + "image": "After uploading your signature image above, click anywhere on the PDF to place it.", + "text": "After entering your name above, click anywhere on the PDF to place your signature." + }, + "mode": { + "move": "Move Signature", + "place": "Place Signature" + }, + "updateAndPlace": "Update and Place", + "activate": "Activate Signature Placement", + "deactivate": "Stop Placing Signatures", + "results": { + "title": "Signature Results" + }, + "error": { + "failed": "An error occurred while signing the PDF." + }, + "tags": "ØĒØ§ÛŒÛŒØ¯ØŒØ­ØąŲˆŲ ابØĒØ¯Ø§ÛŒÛŒØŒØ§Ų…Øļای ÚŠØ´ÛŒØ¯Ų‡ØŒØ§Ų…Øļای Ų…ØĒŲ†ÛŒØŒØ§Ų…Øļای ØĒØĩŲˆÛŒØąÛŒ" }, "flatten": { - "tags": "Ø§ÛŒØŗØĒا،ØēÛŒØąŲØšØ§Ų„ØŒØēÛŒØąØĒØšØ§Ų…Ų„ÛŒØŒØ¨Ų‡ÛŒŲ†Ų‡â€ŒØŗØ§Ø˛ÛŒ", "title": "ÛŒÚŠŲžØ§ØąÚ†Ų‡â€ŒØŗØ§Ø˛ÛŒ", "header": "ÛŒÚŠŲžØ§ØąÚ†Ų‡â€ŒØŗØ§Ø˛ÛŒ PDFŲ‡Ø§", "flattenOnlyForms": "ŲŲ‚Øˇ ŲØąŲ…â€ŒŲ‡Ø§ ØąØ§ ÛŒÚŠŲžØ§ØąÚ†Ų‡ ÚŠŲ†", "submit": "ÛŒÚŠŲžØ§ØąÚ†Ų‡â€ŒØŗØ§Ø˛ÛŒ", + "filenamePrefix": "flattened", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, "steps": { "settings": "ØĒŲ†Ø¸ÛŒŲ…Ø§ØĒ" }, "options": { - "flattenOnlyForms": "ŲŲ‚Øˇ ŲØąŲ…â€ŒŲ‡Ø§ ØąØ§ ÛŒÚŠŲžØ§ØąÚ†Ų‡ ÚŠŲ†" - } + "stepTitle": "Flatten Options", + "title": "Flatten Options", + "flattenOnlyForms": { + "label": "ŲŲ‚Øˇ ŲØąŲ…â€ŒŲ‡Ø§ ØąØ§ ÛŒÚŠŲžØ§ØąÚ†Ų‡ ÚŠŲ†", + "desc": "Only flatten form fields, leaving other interactive elements intact" + }, + "note": "Flattening removes interactive elements from the PDF, making them non-editable." + }, + "results": { + "title": "Flatten Results" + }, + "error": { + "failed": "An error occurred while flattening the PDF." + }, + "tooltip": { + "header": { + "title": "About Flattening PDFs" + }, + "description": { + "title": "What does flattening do?", + "text": "Flattening makes your PDF non-editable by turning fillable forms and buttons into regular text and images. The PDF will look exactly the same, but no one can change or fill in the forms anymore. Perfect for sharing completed forms, creating final documents for records, or ensuring the PDF looks the same everywhere.", + "bullet1": "Text boxes become regular text (can't be edited)", + "bullet2": "Checkboxes and buttons become pictures", + "bullet3": "Great for final versions you don't want changed", + "bullet4": "Ensures consistent appearance across all devices" + }, + "formsOnly": { + "title": "What does 'Flatten only forms' mean?", + "text": "This option only removes the ability to fill in forms, but keeps other features working like clicking links, viewing bookmarks, and reading comments.", + "bullet1": "Forms become non-editable", + "bullet2": "Links still work when clicked", + "bullet3": "Comments and notes remain visible", + "bullet4": "Bookmarks still help you navigate" + } + }, + "tags": "Ø§ÛŒØŗØĒا،ØēÛŒØąŲØšØ§Ų„ØŒØēÛŒØąØĒØšØ§Ų…Ų„ÛŒØŒØ¨Ų‡ÛŒŲ†Ų‡â€ŒØŗØ§Ø˛ÛŒ" }, "repair": { "tags": "ØĒØąŲ…ÛŒŲ…ØŒØ¨Ø§Ø˛ÛŒØ§Ø¨ÛŒØŒØ§ØĩŲ„Ø§Ø­ØŒØ¨Ø§Ø˛ÛŒØ§Ø¨ÛŒ", "title": "ØĒØšŲ…ÛŒØą", "header": "ØĒØšŲ…ÛŒØą PDFŲ‡Ø§", - "submit": "ØĒØšŲ…ÛŒØą" + "submit": "ØĒØšŲ…ÛŒØą", + "description": "This tool will attempt to repair corrupted or damaged PDF files. No additional settings are required.", + "filenamePrefix": "repaired", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst repairing the PDF." + }, + "results": { + "title": "Repair Results" + } }, "removeBlanks": { - "tags": "ŲžØ§ÚŠØŗØ§Ø˛ÛŒØŒØ¨Ų‡ÛŒŲ†Ų‡â€ŒØŗØ§Ø˛ÛŒØŒØ¨Ø¯ŲˆŲ† Ų…Ø­ØĒŲˆØ§ØŒØŗØ§Ø˛Ų…Ø§Ų†Ø¯Ų‡ÛŒ", "title": "Ø­Ø°Ų ØĩŲØ­Ø§ØĒ ØŽØ§Ų„ÛŒ", "header": "Ø­Ø°Ų ØĩŲØ­Ø§ØĒ ØŽØ§Ų„ÛŒ", - "threshold": "ØĸØŗØĒØ§Ų†Ų‡ ØŗŲÛŒØ¯ÛŒ ŲžÛŒÚŠØŗŲ„:", + "settings": { + "title": "Settings" + }, + "threshold": { + "label": "Pixel Whiteness Threshold" + }, + "whitePercent": { + "label": "White Percentage Threshold", + "unit": "%" + }, + "includeBlankPages": { + "label": "Include detected blank pages" + }, + "tooltip": { + "header": { + "title": "Remove Blank Pages Settings" + }, + "threshold": { + "title": "Pixel Whiteness Threshold", + "text": "Controls how white a pixel must be to be considered 'white'. This helps determine what counts as a blank area on the page.", + "bullet1": "0 = Pure black (most restrictive)", + "bullet2": "128 = Medium grey", + "bullet3": "255 = Pure white (least restrictive)" + }, + "whitePercent": { + "title": "White Percentage Threshold", + "text": "Sets the minimum percentage of white pixels required for a page to be considered blank and removed.", + "bullet1": "Lower values (e.g., 80%) = More pages removed", + "bullet2": "Higher values (e.g., 95%) = Only very blank pages removed", + "bullet3": "Use higher values for documents with light backgrounds" + }, + "includeBlankPages": { + "title": "Include Detected Blank Pages", + "text": "When enabled, creates a separate PDF containing all the blank pages that were detected and removed from the original document.", + "bullet1": "Useful for reviewing what was removed", + "bullet2": "Helps verify the detection accuracy", + "bullet3": "Can be disabled to reduce output file size" + } + }, + "submit": "Ø­Ø°Ų ØĩŲØ­Ø§ØĒ ØŽØ§Ų„ÛŒ", + "error": { + "failed": "Failed to remove blank pages" + }, + "results": { + "title": "Removed Blank Pages" + }, + "tags": "ŲžØ§ÚŠØŗØ§Ø˛ÛŒØŒØ¨Ų‡ÛŒŲ†Ų‡â€ŒØŗØ§Ø˛ÛŒØŒØ¨Ø¯ŲˆŲ† Ų…Ø­ØĒŲˆØ§ØŒØŗØ§Ø˛Ų…Ø§Ų†Ø¯Ų‡ÛŒ", "thresholdDesc": "ØĸØŗØĒØ§Ų†Ų‡â€ŒØ§ÛŒ ÚŠŲ‡ ØĒØšÛŒÛŒŲ† Ų…ÛŒâ€ŒÚŠŲ†Ø¯ ŲžÛŒÚŠØŗŲ„ Ú†Ų‚Ø¯Øą باید ØŗŲÛŒØ¯ باشد ØĒا Ø¨Ų‡ ØšŲ†ŲˆØ§Ų† 'ØŗŲÛŒØ¯' Ø´Ų†Ø§ØŽØĒŲ‡ Ø´ŲˆØ¯. 0 = ØŗÛŒØ§Ų‡ØŒ 255 ÚŠØ§Ų…Ų„Ø§Ų‹ ØŗŲÛŒØ¯.", - "whitePercent": "Ø¯ØąØĩد ØŗŲÛŒØ¯ÛŒ (%):", - "whitePercentDesc": "Ø¯ØąØĩد ØĩŲØ­Ų‡â€ŒØ§ÛŒ ÚŠŲ‡ باید ŲžÛŒÚŠØŗŲ„â€ŒŲ‡Ø§ÛŒ 'ØŗŲÛŒØ¯' باشد Ø¨ØąØ§ÛŒ Ø­Ø°Ų", - "submit": "Ø­Ø°Ų ØĩŲØ­Ø§ØĒ ØŽØ§Ų„ÛŒ" + "whitePercentDesc": "Ø¯ØąØĩد ØĩŲØ­Ų‡â€ŒØ§ÛŒ ÚŠŲ‡ باید ŲžÛŒÚŠØŗŲ„â€ŒŲ‡Ø§ÛŒ 'ØŗŲÛŒØ¯' باشد Ø¨ØąØ§ÛŒ Ø­Ø°Ų" }, "removeAnnotations": { "tags": "Ų†Ø¸ØąØ§ØĒØŒŲ‡Ø§ÛŒŲ„Ø§ÛŒØĒ،یادداشØĒâ€ŒŲ‡Ø§ØŒŲ†Ø´Ø§Ų†Ų‡â€ŒÚ¯Ø°Ø§ØąÛŒØŒØ­Ø°Ų", "title": "Ø­Ø°Ų ØĒ؈ØļیحاØĒ", "header": "Ø­Ø°Ų ØĒ؈ØļیحاØĒ", - "submit": "Ø­Ø°Ų" + "submit": "Ø­Ø°Ų", + "settings": { + "title": "Settings" + }, + "info": { + "title": "About Remove Annotations", + "description": "This tool will remove all annotations (comments, highlights, notes, etc.) from your PDF documents." + }, + "error": { + "failed": "An error occurred while removing annotations from the PDF." + } }, "compare": { "tags": "ØĒŲØ§ŲˆØĒâ€ŒÚ¯Ø°Ø§ØąÛŒØŒÚŠŲ†ØĒØąØ§ØŗØĒ،ØĒØēÛŒÛŒØąØ§ØĒ،ØĒØ­Ų„ÛŒŲ„", @@ -1082,6 +2341,142 @@ "certSign": { "tags": "ØĒایید،PEM،P12ØŒØąØŗŲ…ÛŒØŒØąŲ…Ø˛Ú¯Ø°Ø§ØąÛŒ", "title": "Ø§Ų…Øļای Ú¯ŲˆØ§Ų‡ÛŒ", + "filenamePrefix": "signed", + "signMode": { + "stepTitle": "Sign Mode", + "tooltip": { + "header": { + "title": "About PDF Signatures" + }, + "overview": { + "title": "How signatures work", + "text": "Both modes seal the document (any edits are flagged as tampering) and record who/when/how for auditing. Viewer trust depends on the certificate chain." + }, + "manual": { + "title": "Manual - Bring your certificate", + "text": "Use your own certificate files for brand-aligned identity. Can display Trusted when your CA/chain is recognised.", + "use": "Use for: customer-facing, legal, compliance." + }, + "auto": { + "title": "Auto - Zero-setup, instant system seal", + "text": "Signs with a server self-signed certificate. Same tamper-evident seal and audit trail; typically shows Unverified in viewers.", + "use": "Use when: you need speed and consistent internal identity across reviews and records." + }, + "rule": { + "title": "Rule of thumb", + "text": "Need recipient Trusted status? Manual. Need a fast, tamper-evident seal and audit trail with no setup? Auto." + } + } + }, + "certTypeStep": { + "stepTitle": "Certificate Format" + }, + "certFiles": { + "stepTitle": "Certificate Files" + }, + "appearance": { + "stepTitle": "Signature Appearance", + "tooltip": { + "header": { + "title": "About Signature Appearance" + }, + "invisible": { + "title": "Invisible Signatures", + "text": "The signature is added to the PDF for security but won't be visible when viewing the document. Perfect for legal requirements without changing the document's appearance.", + "bullet1": "Provides security without visual changes", + "bullet2": "Meets legal requirements for digital signing", + "bullet3": "Doesn't affect document layout or design" + }, + "visible": { + "title": "Visible Signatures", + "text": "Shows a signature block on the PDF with your name, date, and optional details. Useful when you want readers to clearly see the document is signed.", + "bullet1": "Shows signer name and date on the document", + "bullet2": "Can include reason and location for signing", + "bullet3": "Choose which page to place the signature", + "bullet4": "Optional logo can be included" + } + }, + "invisible": "Invisible", + "options": { + "title": "Signature Details" + }, + "visible": "Visible" + }, + "sign": { + "submit": "Sign PDF", + "results": "Signed PDF" + }, + "error": { + "failed": "An error occurred whilst processing signatures." + }, + "tooltip": { + "header": { + "title": "About Managing Signatures" + }, + "overview": { + "title": "What can this tool do?", + "text": "This tool lets you check if your PDFs are digitally signed and add new digital signatures. Digital signatures prove who created or approved a document and show if it has been changed since signing.", + "bullet1": "Check existing signatures and their validity", + "bullet2": "View detailed information about signers and certificates", + "bullet3": "Add new digital signatures to secure your documents", + "bullet4": "Multiple files supported with easy navigation" + }, + "validation": { + "title": "Checking Signatures", + "text": "When you check signatures, the tool tells you if they're valid, who signed the document, when it was signed, and whether the document has been changed since signing.", + "bullet1": "Shows if signatures are valid or invalid", + "bullet2": "Displays signer information and signing date", + "bullet3": "Checks if the document was modified after signing", + "bullet4": "Can use custom certificates for verification" + }, + "signing": { + "title": "Adding Signatures", + "text": "To sign a PDF, you need a digital certificate (like PEM, PKCS12, or JKS). You can choose to make the signature visible on the document or keep it invisible for security only.", + "bullet1": "Supports PEM, PKCS12, JKS, and server certificate formats", + "bullet2": "Option to show or hide signature on the PDF", + "bullet3": "Add reason, location, and signer name", + "bullet4": "Choose which page to place visible signatures", + "bullet5": "Use server certificate for simple 'Sign with Stirling-PDF' option" + } + }, + "certType": { + "tooltip": { + "header": { + "title": "About Certificate Types" + }, + "what": { + "title": "What's a certificate?", + "text": "It's a secure ID for your signature that proves you signed. Unless you're required to sign via certificate, we recommend using another secure method like Type, Draw, or Upload." + }, + "which": { + "title": "Which option should I use?", + "text": "Choose the format that matches your certificate file:", + "bullet1": "PKCS#12 (.p12 / .pfx) – one combined file (most common)", + "bullet2": "PFX (.pfx) – Microsoft's version of PKCS12", + "bullet3": "PEM – separate private-key and certificate .pem files", + "bullet4": "JKS – Java .jks keystore for dev / CI-CD workflows" + }, + "convert": { + "title": "Key not listed?", + "text": "Convert your file to a Java keystore (.jks) with keytool, then pick JKS." + } + } + }, + "chooseCertificate": "Choose Certificate File", + "chooseJksFile": "Choose JKS File", + "chooseP12File": "Choose PKCS12 File", + "choosePfxFile": "Choose PFX File", + "choosePrivateKey": "Choose Private Key File", + "location": "Ų…ŲˆŲ‚ØšÛŒØĒ", + "logoTitle": "Logo", + "name": "Ų†Ø§Ų…", + "noLogo": "No Logo", + "pageNumber": "Page Number", + "password": "ØąŲ…Ø˛ ØšØ¨ŲˆØą Keystore یا ÚŠŲ„ÛŒØ¯ ØŽØĩ؈Øĩی ØŽŲˆØ¯ ØąØ§ ŲˆØ§ØąØ¯ ÚŠŲ†ÛŒØ¯ (Ø¯Øą ØĩŲˆØąØĒ ؈ØŦŲˆØ¯):", + "passwordOptional": "Leave empty if no password", + "reason": "Ø¯Ų„ÛŒŲ„", + "serverCertMessage": "Using server certificate - no files or password required", + "showLogo": "Ų†Ų…Ø§ÛŒØ´ Ų„ŲˆÚ¯Ųˆ", "header": "Ø§Ų…Øļا ÚŠØąØ¯Ų† PDF با Ú¯ŲˆØ§Ų‡ÛŒ ØŽŲˆØ¯ (Ø¯Øą Ø­Ø§Ų„ ŲžÛŒØ´ØąŲØĒ)", "selectPDF": "Ø§Ų†ØĒ؎اب ŲØ§ÛŒŲ„ PDF Ø¨ØąØ§ÛŒ Ø§Ų…Øļا:", "jksNote": "یادداشØĒ: Ø§Ú¯Øą Ų†ŲˆØš Ú¯ŲˆØ§Ų‡ÛŒ Ø´Ų…Ø§ Ø¯Øą Ø˛ÛŒØą Ø°ÚŠØą Ų†Ø´Ø¯Ų‡ Ø§ØŗØĒ، Ų„ØˇŲØ§Ų‹ ØĸŲ† ØąØ§ Ø¨Ų‡ یڊ ŲØ§ÛŒŲ„ Java Keystore (.jks) با Ø§ØŗØĒŲØ§Ø¯Ų‡ Ø§Ø˛ Ø§Ø¨Ø˛Ø§Øą ØŽØˇ ŲØąŲ…Ø§Ų† keytool ØĒØ¨Ø¯ÛŒŲ„ ÚŠŲ†ÛŒØ¯. ØŗŲžØŗØŒ Ú¯Ø˛ÛŒŲ†Ų‡ ŲØ§ÛŒŲ„ .jks ØąØ§ Ø¯Øą Ø˛ÛŒØą Ø§Ų†ØĒ؎اب ÚŠŲ†ÛŒØ¯.", @@ -1089,13 +2484,7 @@ "selectCert": "ŲØ§ÛŒŲ„ Ú¯ŲˆØ§Ų‡ÛŒ ØŽŲˆØ¯ ØąØ§ Ø§Ų†ØĒ؎اب ÚŠŲ†ÛŒØ¯ (ŲØąŲ…ØĒ X.509، Ų…ÛŒâ€ŒØĒŲˆØ§Ų†Ø¯ .pem یا .der باشد):", "selectP12": "ŲØ§ÛŒŲ„ Keystore PKCS#12 ØŽŲˆØ¯ ØąØ§ Ø§Ų†ØĒ؎اب ÚŠŲ†ÛŒØ¯ (.p12 یا .pfx) (ا؎ØĒÛŒØ§ØąÛŒØŒ Ø¯Øą ØĩŲˆØąØĒ Ø§ØąØ§ØĻŲ‡ØŒ باید Ø´Ø§Ų…Ų„ ÚŠŲ„ÛŒØ¯ ØŽØĩ؈Øĩی ؈ Ú¯ŲˆØ§Ų‡ÛŒ Ø´Ų…Ø§ باشد):", "selectJKS": "ŲØ§ÛŒŲ„ Java Keystore ØŽŲˆØ¯ ØąØ§ Ø§Ų†ØĒ؎اب ÚŠŲ†ÛŒØ¯ (.jks یا .keystore):", - "certType": "Ų†ŲˆØš Ú¯ŲˆØ§Ų‡ÛŒ", - "password": "ØąŲ…Ø˛ ØšØ¨ŲˆØą Keystore یا ÚŠŲ„ÛŒØ¯ ØŽØĩ؈Øĩی ØŽŲˆØ¯ ØąØ§ ŲˆØ§ØąØ¯ ÚŠŲ†ÛŒØ¯ (Ø¯Øą ØĩŲˆØąØĒ ؈ØŦŲˆØ¯):", "showSig": "Ų†Ų…Ø§ÛŒØ´ Ø§Ų…Øļا", - "reason": "Ø¯Ų„ÛŒŲ„", - "location": "Ų…ŲˆŲ‚ØšÛŒØĒ", - "name": "Ų†Ø§Ų…", - "showLogo": "Ų†Ų…Ø§ÛŒØ´ Ų„ŲˆÚ¯Ųˆ", "submit": "Ø§Ų…Øļا ÚŠØąØ¯Ų† PDF" }, "removeCertSign": { @@ -1103,7 +2492,18 @@ "title": "Ø­Ø°Ų Ø§Ų…Øļای Ú¯ŲˆØ§Ų‡ÛŒ", "header": "Ø­Ø°Ų Ú¯ŲˆØ§Ų‡ÛŒ دیØŦیØĒØ§Ų„ Ø§Ø˛ PDF", "selectPDF": "یڊ ŲØ§ÛŒŲ„ PDF ØąØ§ Ø§Ų†ØĒ؎اب ÚŠŲ†ÛŒØ¯:", - "submit": "Ø­Ø°Ų Ø§Ų…Øļا" + "submit": "Ø­Ø°Ų Ø§Ų…Øļا", + "description": "This tool will remove digital certificate signatures from your PDF document.", + "filenamePrefix": "unsigned", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst removing certificate signatures." + }, + "results": { + "title": "Certificate Removal Results" + } }, "pageLayout": { "tags": "ادØēØ§Ų…ØŒØĒØąÚŠÛŒØ¨ØŒŲ†Ų…Ø§ÛŒ ŲˆØ§Ø­Ø¯ØŒØŗØ§Ø˛Ų…Ø§Ų†Ø¯Ų‡ÛŒ", @@ -1111,16 +2511,157 @@ "header": "ØˇØąØ­â€ŒØ¨Ų†Ø¯ÛŒ Ú†Ų†Ø¯ ØĩŲØ­Ų‡â€ŒØ§ÛŒ", "pagesPerSheet": "ØĩŲØ­Ø§ØĒ Ø¯Øą Ų‡Øą شیØĒ:", "addBorder": "اØļØ§ŲŲ‡ ÚŠØąØ¯Ų† Ų…ØąØ˛Ų‡Ø§", - "submit": "Ø§ØąØŗØ§Ų„" + "submit": "Ø§ØąØŗØ§Ų„", + "desc": { + "2": "Place 2 pages side-by-side on a single sheet.", + "3": "Place 3 pages on a single sheet in a single row.", + "4": "Place 4 pages on a single sheet (2 × 2 grid).", + "9": "Place 9 pages on a single sheet (3 × 3 grid).", + "16": "Place 16 pages on a single sheet (4 × 4 grid)." + }, + "error": { + "failed": "An error occurred while creating the multi-page layout." + } + }, + "bookletImposition": { + "tags": "booklet,imposition,printing,binding,folding,signature", + "title": "Booklet Imposition", + "header": "Booklet Imposition", + "submit": "Create Booklet", + "spineLocation": { + "label": "Spine Location", + "left": "Left (Standard)", + "right": "Right (RTL)" + }, + "doubleSided": { + "label": "Double-sided printing", + "tooltip": "Creates both front and back sides for proper booklet printing" + }, + "manualDuplex": { + "title": "Manual Duplex Mode", + "instructions": "For printers without automatic duplex. You'll need to run this twice:" + }, + "duplexPass": { + "label": "Print Pass", + "first": "1st Pass", + "second": "2nd Pass", + "firstInstructions": "Prints front sides → stack face-down → run again with 2nd Pass", + "secondInstructions": "Load printed stack face-down → prints back sides" + }, + "rtlBinding": { + "label": "Right-to-left binding", + "tooltip": "For Arabic, Hebrew, or other right-to-left languages" + }, + "addBorder": { + "label": "Add borders around pages", + "tooltip": "Adds borders around each page section to help with cutting and alignment" + }, + "addGutter": { + "label": "Add gutter margin", + "tooltip": "Adds inner margin space for binding" + }, + "gutterSize": { + "label": "Gutter size (points)" + }, + "flipOnShortEdge": { + "label": "Flip on short edge (automatic duplex only)", + "tooltip": "Enable for short-edge duplex printing (automatic duplex only - ignored in manual mode)", + "manualNote": "Not needed in manual mode - you flip the stack yourself" + }, + "advanced": { + "toggle": "Advanced Options" + }, + "paperSizeNote": "Paper size is automatically derived from your first page.", + "tooltip": { + "header": { + "title": "Booklet Creation Guide" + }, + "description": { + "title": "What is Booklet Imposition?", + "text": "Creates professional booklets by arranging pages in the correct printing order. Your PDF pages are placed 2-up on landscape sheets so when folded and bound, they read in proper sequence like a real book." + }, + "example": { + "title": "Example: 8-Page Booklet", + "text": "Your 8-page document becomes 2 sheets:", + "bullet1": "Sheet 1 Front: Pages 8, 1 | Back: Pages 2, 7", + "bullet2": "Sheet 2 Front: Pages 6, 3 | Back: Pages 4, 5", + "bullet3": "When folded & stacked: Reads 1→2→3→4→5→6→7→8" + }, + "printing": { + "title": "How to Print & Assemble", + "text": "Follow these steps for perfect booklets:", + "bullet1": "Print double-sided with 'Flip on long edge'", + "bullet2": "Stack sheets in order, fold in half", + "bullet3": "Staple or bind along the folded spine", + "bullet4": "For short-edge printers: Enable 'Flip on short edge' option" + }, + "manualDuplex": { + "title": "Manual Duplex (Single-sided Printers)", + "text": "For printers without automatic duplex:", + "bullet1": "Turn OFF 'Double-sided printing'", + "bullet2": "Select '1st Pass' → Print → Stack face-down", + "bullet3": "Select '2nd Pass' → Load stack → Print backs", + "bullet4": "Fold and assemble as normal" + }, + "advanced": { + "title": "Advanced Options", + "text": "Fine-tune your booklet:", + "bullet1": "Right-to-Left Binding: For Arabic, Hebrew, or RTL languages", + "bullet2": "Borders: Shows cut lines for trimming", + "bullet3": "Gutter Margin: Adds space for binding/stapling", + "bullet4": "Short-edge Flip: Only for automatic duplex printers" + } + }, + "error": { + "failed": "An error occurred while creating the booklet imposition." + } }, "scalePages": { - "tags": "ØĒØēÛŒÛŒØą Ø§Ų†Ø¯Ø§Ø˛Ų‡ØŒŲˆÛŒØąØ§ÛŒØ´ØŒØ§Ø¨ØšØ§Ø¯ØŒØŗØ§Ø˛Ú¯Ø§ØąÛŒ", "title": "ØĒŲ†Ø¸ÛŒŲ… Ų…Ų‚ÛŒØ§Øŗ ØĩŲØ­Ų‡", "header": "ØĒŲ†Ø¸ÛŒŲ… Ų…Ų‚ÛŒØ§Øŗ ØĩŲØ­Ų‡", "pageSize": "Ø§Ų†Ø¯Ø§Ø˛Ų‡ ØĩŲØ­Ų‡ ØŗŲ†Ø¯.", "keepPageSize": "Ø§Ų†Ø¯Ø§Ø˛Ų‡ اØĩŲ„ÛŒ", "scaleFactor": "ØŗØˇØ­ Ø˛ŲˆŲ… (Ø¨ØąØ´) یڊ ØĩŲØ­Ų‡.", - "submit": "Ø§ØąØŗØ§Ų„" + "submit": "Ø§ØąØŗØ§Ų„", + "tags": "ØĒØēÛŒÛŒØą Ø§Ų†Ø¯Ø§Ø˛Ų‡ØŒŲˆÛŒØąØ§ÛŒØ´ØŒØ§Ø¨ØšØ§Ø¯ØŒØŗØ§Ø˛Ú¯Ø§ØąÛŒ" + }, + "adjustPageScale": { + "tags": "resize,modify,dimension,adapt", + "title": "Adjust Page Scale", + "header": "Adjust Page Scale", + "scaleFactor": { + "label": "Scale Factor" + }, + "pageSize": { + "label": "Target Page Size", + "keep": "Keep Original Size", + "letter": "Letter", + "legal": "Legal" + }, + "submit": "Adjust Page Scale", + "error": { + "failed": "An error occurred while adjusting the page scale." + }, + "tooltip": { + "header": { + "title": "Page Scale Settings Overview" + }, + "description": { + "title": "Description", + "text": "Adjust the size of PDF content and change the page dimensions." + }, + "scaleFactor": { + "title": "Scale Factor", + "text": "Controls how large or small the content appears on the page. Content is scaled and centred - if scaled content is larger than the page size, it may be cropped.", + "bullet1": "1.0 = Original size", + "bullet2": "0.5 = Half size (50% smaller)", + "bullet3": "2.0 = Double size (200% larger, may crop)" + }, + "pageSize": { + "title": "Target Page Size", + "text": "Sets the dimensions of the output PDF pages. 'Keep Original Size' maintains current dimensions, whilst other options resize to standard paper sizes." + } + } }, "add-page-numbers": { "tags": "Ø´Ų…Ø§ØąŲ‡â€ŒÚ¯Ø°Ø§ØąÛŒØŒØ¨ØąÚ†ØŗØ¨â€ŒÚ¯Ø°Ø§ØąÛŒØŒØŗØ§Ø˛Ų…Ø§Ų†Ø¯Ų‡ÛŒØŒŲŲ‡ØąØŗØĒ" @@ -1129,16 +2670,83 @@ "tags": "ØĒØ´ØŽÛŒØĩ ØŽŲˆØ¯ÚŠØ§ØąØŒØ¨Øą Ø§ØŗØ§Øŗ ØŗØąØ¨ØąÚ¯ØŒØŗØ§Ø˛Ų…Ø§Ų†Ø¯Ų‡ÛŒØŒØĒØēÛŒÛŒØą Ų†Ø§Ų…", "title": "ØĒØēÛŒÛŒØą Ų†Ø§Ų… ØŽŲˆØ¯ÚŠØ§Øą", "header": "ØĒØēÛŒÛŒØą Ų†Ø§Ų… ØŽŲˆØ¯ÚŠØ§Øą PDF", - "submit": "ØĒØēÛŒÛŒØą Ų†Ø§Ų… ØŽŲˆØ¯ÚŠØ§Øą" + "description": "Automatically finds the title from your PDF content and uses it as the filename.", + "submit": "ØĒØēÛŒÛŒØą Ų†Ø§Ų… ØŽŲˆØ¯ÚŠØ§Øą", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst auto-renaming the PDF." + }, + "results": { + "title": "Auto-Rename Results" + }, + "tooltip": { + "header": { + "title": "How Auto-Rename Works" + }, + "howItWorks": { + "title": "Smart Renaming", + "text": "Automatically finds the title from your PDF content and uses it as the filename.", + "bullet1": "Looks for text that appears to be a title or heading", + "bullet2": "Creates a clean, valid filename from the detected title", + "bullet3": "Keeps the original name if no suitable title is found" + } + } }, "adjust-contrast": { "tags": "ØĒØĩحیح ØąŲ†Ú¯ØŒØĒŲ†Ø¸ÛŒŲ…ØŒŲˆÛŒØąØ§ÛŒØ´ØŒØ¨Ų‡Ø¨ŲˆØ¯" }, "crop": { - "tags": "Ø¨ØąØ´ØŒÚŠØ§Ų‡Ø´ Ø§Ų†Ø¯Ø§Ø˛Ų‡ØŒŲˆÛŒØąØ§ÛŒØ´ØŒØ´ÚŠŲ„â€ŒØ¯Ų‡ÛŒ", "title": "Ø¨ØąØ´ Ø¯Ø§Ø¯Ų†", "header": "Ø¨ØąØ´ PDF", - "submit": "Ø§ØąØŗØ§Ų„" + "submit": "Ø§ØąØŗØ§Ų„", + "noFileSelected": "Select a PDF file to begin cropping", + "preview": { + "title": "Crop Area Selection" + }, + "reset": "Reset to full PDF", + "coordinates": { + "title": "Position and Size", + "x": { + "label": "X Position", + "desc": "Left edge (points)" + }, + "y": { + "label": "Y Position", + "desc": "Bottom edge (points)" + }, + "width": { + "label": "Width", + "desc": "Crop width (points)" + }, + "height": { + "label": "Height", + "desc": "Crop height (points)" + } + }, + "error": { + "invalidArea": "Crop area extends beyond PDF boundaries", + "failed": "Failed to crop PDF" + }, + "steps": { + "selectArea": "Select Crop Area" + }, + "tooltip": { + "title": "How to Crop PDFs", + "description": "Select the area to crop from your PDF by dragging and resizing the blue overlay on the thumbnail.", + "drag": "Drag the overlay to move the crop area", + "resize": "Drag the corner and edge handles to resize", + "precision": "Use coordinate inputs for precise positioning" + }, + "results": { + "title": "Crop Results" + }, + "automation": { + "info": "Enter crop coordinates in PDF points. Origin (0,0) is at bottom-left. These values will be applied to all PDFs processed in this automation.", + "reference": "Reference: A4 page is 595.28 × 841.89 points (210mm × 297mm). 1 inch = 72 points." + }, + "tags": "Ø¨ØąØ´ØŒÚŠØ§Ų‡Ø´ Ø§Ų†Ø¯Ø§Ø˛Ų‡ØŒŲˆÛŒØąØ§ÛŒØ´ØŒØ´ÚŠŲ„â€ŒØ¯Ų‡ÛŒ" }, "autoSplitPDF": { "tags": "Ø¨Øą Ø§ØŗØ§Øŗ QR،ØŦØ¯Ø§ØŗØ§Ø˛ÛŒØŒØĒŲ‚ØŗÛŒŲ… Ø§ØŗÚŠŲ†â€ŒØ´Ø¯Ų‡ØŒØŗØ§Ø˛Ų…Ø§Ų†Ø¯Ų‡ÛŒ", @@ -1221,24 +2829,124 @@ "downloadJS": "Ø¯Ø§Ų†Ų„ŲˆØ¯ ØŦØ§ŲˆØ§Ø§ØŗÚŠØąÛŒŲžØĒ", "submit": "Ų†Ų…Ø§ÛŒØ´" }, - "autoRedact": { - "tags": "ØŗØ§Ų†ØŗŲˆØąØŒ Ų…ØŽŲÛŒ ÚŠØąØ¯Ų†ØŒ ØŗÛŒØ§Ų‡ ÚŠØąØ¯Ų†ØŒ ŲžŲ†Ų‡Ø§Ų†", - "title": "ØŗØ§Ų†ØŗŲˆØą ØŽŲˆØ¯ÚŠØ§Øą", - "header": "ØŗØ§Ų†ØŗŲˆØą ØŽŲˆØ¯ÚŠØ§Øą", - "colorLabel": "ØąŲ†Ú¯", - "textsToRedactLabel": "Ų…ØĒŲ† Ø¨ØąØ§ÛŒ ØŗØ§Ų†ØŗŲˆØą (Ų‡Øą ØŽØˇ ØŦØ¯Ø§Ú¯Ø§Ų†Ų‡)", - "textsToRedactPlaceholder": "Ų…ØĢØ§Ų„: \\nŲ…Ø­ØąŲ…Ø§Ų†Ų‡ \\nŲŲˆŲ‚â€ŒØŗØąÛŒ", - "useRegexLabel": "Ø§ØŗØĒŲØ§Ø¯Ų‡ Ø§Ø˛ Regex", - "wholeWordSearchLabel": "ØŦØŗØĒØŦŲˆÛŒ ÚŠŲ„Ų…Ų‡ ÚŠØ§Ų…Ų„", - "customPaddingLabel": "Ø§ŲØ˛ŲˆØ¯Ų† ŲØ§ØĩŲ„Ų‡ اØļØ§ŲÛŒ", - "convertPDFToImageLabel": "ØĒØ¨Ø¯ÛŒŲ„ PDF Ø¨Ų‡ PDF-ØĒØĩŲˆÛŒØą (Ø¨ØąØ§ÛŒ Ø­Ø°Ų Ų…ØĒŲ† ŲžØ´ØĒ ØŦØšØ¨Ų‡ Ø§ØŗØĒŲØ§Ø¯Ų‡ Ų…ÛŒâ€ŒØ´ŲˆØ¯)", - "submitButton": "Ø§ØąØŗØ§Ų„" - }, "redact": { "tags": "Redact,Hide,black out,black,marker,hidden,manual", "title": "Manual Redaction", - "header": "Manual Redaction", "submit": "Manual Redaction", + "error": { + "failed": "An error occurred while redacting the PDF." + }, + "modeSelector": { + "title": "Redaction Method", + "mode": "Mode", + "automatic": "Automatic", + "automaticDesc": "Redact text based on search terms", + "manual": "Manual", + "manualDesc": "Click and drag to redact specific areas", + "manualComingSoon": "Manual redaction coming soon" + }, + "auto": { + "header": "Auto Redact", + "settings": { + "title": "Redaction Settings", + "advancedTitle": "ŲžÛŒØ´ØąŲØĒŲ‡" + }, + "colorLabel": "Box Colour", + "wordsToRedact": { + "title": "Words to Redact", + "placeholder": "Enter a word", + "add": "اØļØ§ŲŲ‡ ÚŠØąØ¯Ų†", + "examples": "Examples: Confidential, Top-Secret" + }, + "useRegexLabel": "Use Regex", + "wholeWordSearchLabel": "Whole Word Search", + "customPaddingLabel": "Custom Extra Padding", + "convertPDFToImageLabel": "Convert PDF to PDF-Image" + }, + "tooltip": { + "mode": { + "header": { + "title": "Redaction Method" + }, + "automatic": { + "title": "Automatic Redaction", + "text": "Automatically finds and redacts specified text throughout the document. Perfect for removing consistent sensitive information like names, addresses, or confidential markers." + }, + "manual": { + "title": "Manual Redaction", + "text": "Click and drag to manually select specific areas to redact. Gives you precise control over what gets redacted. (Coming soon)" + } + }, + "words": { + "header": { + "title": "Words to Redact" + }, + "description": { + "title": "Text Matching", + "text": "Enter words or phrases to find and redact in your document. Each word will be searched for separately." + }, + "bullet1": "Add one word at a time", + "bullet2": "Press Enter or click 'Add Another' to add", + "bullet3": "Click × to remove words", + "examples": { + "title": "Common Examples", + "text": "Typical words to redact include: bank details, email addresses, or specific names." + } + }, + "advanced": { + "header": { + "title": "Advanced Redaction Settings" + }, + "color": { + "title": "Box Colour & Padding", + "text": "Customise the appearance of redaction boxes. Black is standard, but you can choose any colour. Padding adds extra space around the found text." + }, + "regex": { + "title": "Use Regex", + "text": "Enable regular expressions for advanced pattern matching. Useful for finding phone numbers, emails, or complex patterns.", + "bullet1": "Example: \\d{4}-\\d{2}-\\d{2} to match any dates in YYYY-MM-DD format", + "bullet2": "Use with caution - test thoroughly" + }, + "wholeWord": { + "title": "Whole Word Search", + "text": "Only match complete words, not partial matches. 'John' won't match 'Johnson' when enabled." + }, + "convert": { + "title": "Convert to PDF-Image", + "text": "Converts the PDF to an image-based PDF after redaction. This ensures text behind redaction boxes is completely removed and unrecoverable." + } + } + }, + "manual": { + "header": "Manual Redaction", + "textBasedRedaction": "Text-based Redaction", + "pageBasedRedaction": "Page-based Redaction", + "convertPDFToImageLabel": "Convert PDF to PDF-Image (Used to remove text behind the box)", + "pageRedactionNumbers": { + "title": "ØĩŲØ­Ø§ØĒ", + "placeholder": "(Ų…ØĢØ§Ų„: 1,2,8 یا 4,7,12-16 یا 2n-1)" + }, + "redactionColor": { + "title": "Redaction Colour" + }, + "export": "ØĩØ§Ø¯Øą ÚŠØąØ¯Ų†", + "upload": "Upload", + "boxRedaction": "Box draw redaction", + "zoom": "Zoom", + "zoomIn": "Zoom in", + "zoomOut": "Zoom out", + "nextPage": "Next Page", + "previousPage": "Previous Page", + "toggleSidebar": "Toggle Sidebar", + "showThumbnails": "Show Thumbnails", + "showDocumentOutline": "Show Document Outline (double-click to expand/collapse all items)", + "showAttachments": "Show Attachments", + "showLayers": "Show Layers (double-click to reset all layers to the default state)", + "colourPicker": "Colour Picker", + "findCurrentOutlineItem": "Find current outline item", + "applyChanges": "Apply Changes" + }, + "header": "Manual Redaction", "textBasedRedaction": "Text based Redaction", "pageBasedRedaction": "Page-based Redaction", "convertPDFToImageLabel": "Convert PDF to PDF-Image (Used to remove text behind the box)", @@ -1264,22 +2972,7 @@ "showLayers": "Show Layers (double-click to reset all layers to the default state)", "colourPicker": "Colour Picker", "findCurrentOutlineItem": "Find current outline item", - "applyChanges": "Apply Changes", - "auto": { - "settings": { - "advancedTitle": "ŲžÛŒØ´ØąŲØĒŲ‡" - }, - "wordsToRedact": { - "add": "اØļØ§ŲŲ‡ ÚŠØąØ¯Ų†" - } - }, - "manual": { - "pageRedactionNumbers": { - "title": "ØĩŲØ­Ø§ØĒ", - "placeholder": "(Ų…ØĢØ§Ų„: 1,2,8 یا 4,7,12-16 یا 2n-1)" - }, - "export": "ØĩØ§Ø¯Øą ÚŠØąØ¯Ų†" - } + "applyChanges": "Apply Changes" }, "tableExtraxt": { "tags": "CSV، Ø§ØŗØĒØŽØąØ§ØŦ ØŦØ¯ŲˆŲ„ØŒ Ø§ØŗØĒØŽØąØ§ØŦ، ØĒØ¨Ø¯ÛŒŲ„" @@ -1290,11 +2983,15 @@ "overlay-pdfs": { "tags": "Ų‡Ų…â€ŒŲžŲˆØ´Ø§Ų†ÛŒ", "header": "ØĒØąÚŠÛŒØ¨ ŲØ§ÛŒŲ„â€ŒŲ‡Ø§ÛŒ PDF", + "title": "Overlay PDFs", + "desc": "Overlay one PDF on top of another", "baseFile": { "label": "Ø§Ų†ØĒ؎اب ŲØ§ÛŒŲ„ ŲžØ§ÛŒŲ‡ PDF" }, "overlayFiles": { - "label": "Ø§Ų†ØĒ؎اب ŲØ§ÛŒŲ„â€ŒŲ‡Ø§ÛŒ ØĒØąÚŠÛŒØ¨ÛŒ PDF" + "label": "Ø§Ų†ØĒ؎اب ŲØ§ÛŒŲ„â€ŒŲ‡Ø§ÛŒ ØĒØąÚŠÛŒØ¨ÛŒ PDF", + "placeholder": "Choose PDF(s)...", + "addMore": "Add more PDFs..." }, "mode": { "label": "Ø§Ų†ØĒ؎اب Ø­Ø§Ų„ØĒ ØĒØąÚŠÛŒØ¨", @@ -1304,14 +3001,53 @@ }, "counts": { "label": "ØĒؚداد ØĒÚŠØąØ§ØąŲ‡Ø§ÛŒ ØĒØąÚŠÛŒØ¨ (Ø¨ØąØ§ÛŒ Ø­Ø§Ų„ØĒ ØĒÚŠØąØ§Øą ØĢابØĒ)", - "placeholder": "Ų…Ų‚Ø§Ø¯ÛŒØą ØĒؚداد ØąØ§ با ÚŠØ§Ų…Ø§ ØŦدا ÚŠŲ†ÛŒØ¯ (Ų…ØĢŲ„Ø§Ų‹ Û˛,Ûŗ,Ûą)" + "placeholder": "Ų…Ų‚Ø§Ø¯ÛŒØą ØĒؚداد ØąØ§ با ÚŠØ§Ų…Ø§ ØŦدا ÚŠŲ†ÛŒØ¯ (Ų…ØĢŲ„Ø§Ų‹ Û˛,Ûŗ,Ûą)", + "item": "Count for file", + "noFiles": "Add overlay files to configure counts" }, "position": { "label": "Ø§Ų†ØĒ؎اب Ų…ŲˆŲ‚ØšÛŒØĒ ØĒØąÚŠÛŒØ¨", "foreground": "ŲžÛŒØ´â€ŒØ˛Ų…ÛŒŲ†Ų‡", "background": "ŲžØŗâ€ŒØ˛Ų…ÛŒŲ†Ų‡" }, - "submit": "Ø§ØąØŗØ§Ų„" + "submit": "Ø§ØąØŗØ§Ų„", + "settings": { + "title": "Settings" + }, + "results": { + "title": "Overlay Results" + }, + "tooltip": { + "header": { + "title": "Overlay PDFs Overview" + }, + "description": { + "title": "Description", + "text": "Combine a base PDF with one or more overlay PDFs. Overlays can be applied page-by-page in different modes and placed in the foreground or background." + }, + "mode": { + "title": "Overlay Mode", + "text": "Choose how to distribute overlay pages across the base PDF pages.", + "sequential": "Sequential Overlay: Use pages from the first overlay PDF until it ends, then move to the next.", + "interleaved": "Interleaved Overlay: Take one page from each overlay in turn.", + "fixedRepeat": "Fixed Repeat Overlay: Take a set number of pages from each overlay before moving to the next. Use Counts to set the numbers." + }, + "position": { + "title": "Overlay Position", + "text": "Foreground places the overlay on top of the page. Background places it behind." + }, + "overlayFiles": { + "title": "Overlay Files", + "text": "Select one or more PDFs to overlay on the base. The order of these files affects how pages are applied in Sequential and Fixed Repeat modes." + }, + "counts": { + "title": "Counts (Fixed Repeat only)", + "text": "Provide a positive number for each overlay file showing how many pages to take before moving to the next. Required when mode is Fixed Repeat." + } + }, + "error": { + "failed": "An error occurred while overlaying PDFs." + } }, "split-by-sections": { "tags": "ØĒŲ‚ØŗÛŒŲ… ب؎ش، ØŗŲØ§ØąØ´ÛŒâ€ŒØŗØ§Ø˛ÛŒ", @@ -1332,6 +3068,7 @@ "tags": "Ų…Ų‡ØąØŒ Ø§ŲØ˛ŲˆØ¯Ų† ØĒØĩŲˆÛŒØąØŒ ŲˆØ§ØĒØąŲ…Ø§ØąÚŠØŒ PDF، ØŗŲØ§ØąØ´ÛŒâ€ŒØŗØ§Ø˛ÛŒ", "header": "Ų…Ų‡Øą Ø˛Ø¯Ų† Ø¨Ų‡ PDF", "title": "Ų…Ų‡Øą Ø˛Ø¯Ų† Ø¨Ų‡ PDF", + "stampSetup": "Stamp Setup", "stampType": "Ų†ŲˆØš Ų…Ų‡Øą", "stampText": "Ų…ØĒŲ† Ų…Ų‡Øą", "stampImage": "ØĒØĩŲˆÛŒØą Ų…Ų‡Øą", @@ -1344,7 +3081,19 @@ "overrideY": "ØĒØēÛŒÛŒØą Ų…ØŽØĒØĩاØĒ Y", "customMargin": "Ø­Ø§Ø´ÛŒŲ‡ ØŗŲØ§ØąØ´ÛŒ", "customColor": "ØąŲ†Ú¯ Ų…ØĒŲ† ØŗŲØ§ØąØ´ÛŒ", - "submit": "Ø§ØąØŗØ§Ų„" + "submit": "Ø§ØąØŗØ§Ų„", + "noStampSelected": "No stamp selected. Return to Step 1.", + "customPosition": "Drag the stamp to the desired location in the preview window.", + "error": { + "failed": "An error occurred while adding stamp to the PDF." + }, + "imageSize": "Image Size", + "margin": "Margin", + "positionAndFormatting": "Position & Formatting", + "quickPosition": "Select a position on the page to place the stamp.", + "results": { + "title": "Stamp Results" + } }, "removeImagePdf": { "tags": "Ø­Ø°Ų ØĒØĩŲˆÛŒØąØŒ ØšŲ…Ų„ÛŒØ§ØĒ ØĩŲØ­Ų‡ØŒ ØŗØąŲˆØą" @@ -1362,7 +3111,8 @@ "status": { "_value": "؈ØļØšÛŒØĒ", "valid": "Ų…ØšØĒØ¨Øą", - "invalid": "Ų†Ø§Ų…ØšØĒØ¨Øą" + "invalid": "Ų†Ø§Ų…ØšØĒØ¨Øą", + "complete": "Validation complete" }, "signer": "Ø§Ų…ØļØ§ÚŠŲ†Ų†Ø¯Ų‡", "date": "ØĒØ§ØąÛŒØŽ", @@ -1389,40 +3139,122 @@ "version": "Ų†ØŗØŽŲ‡", "keyUsage": "ÚŠØ§ØąØ¨ØąØ¯ ÚŠŲ„ÛŒØ¯", "selfSigned": "با Ø§Ų…Øļای ØŽŲˆØ¯", - "bits": "بیØĒâ€ŒŲ‡Ø§" + "bits": "بیØĒâ€ŒŲ‡Ø§", + "details": "Certificate Details" }, "signature": { "info": "Ø§ØˇŲ„Ø§ØšØ§ØĒ Ø§Ų…Øļا", "_value": "Ø§Ų…Øļا", "mathValid": "Ø§Ų…Øļا Ø§Ø˛ Ų„Ø­Ø§Ø¸ ØąÛŒØ§Øļی Ų…ØšØĒØ¨Øą Ø§ØŗØĒ Ø§Ų…Ø§:" }, - "selectCustomCert": "ŲØ§ÛŒŲ„ Ú¯ŲˆØ§Ų‡ÛŒ ØŗŲØ§ØąØ´ÛŒ X.509 (ا؎ØĒÛŒØ§ØąÛŒ)" - }, - "replace-color": { - "title": "ØŦØ§ÛŒÚ¯Ø˛ÛŒŲ†ÛŒ/Ų…ØšÚŠŲˆØŗ ÚŠØąØ¯Ų† ØąŲ†Ú¯", - "header": "ØŦØ§ÛŒÚ¯Ø˛ÛŒŲ†ÛŒ/Ų…ØšÚŠŲˆØŗ ÚŠØąØ¯Ų† ØąŲ†Ú¯ PDF", - "selectText": { - "1": "Ú¯Ø˛ÛŒŲ†Ų‡â€ŒŲ‡Ø§ÛŒ ØŦØ§ÛŒÚ¯Ø˛ÛŒŲ†ÛŒ یا Ų…ØšÚŠŲˆØŗ ÚŠØąØ¯Ų† ØąŲ†Ú¯", - "2": "ŲžÛŒØ´â€ŒŲØąØļ (ØąŲ†Ú¯â€ŒŲ‡Ø§ÛŒ ŲžÛŒØ´â€ŒŲØąØļ با ÚŠŲ†ØĒØąØ§ØŗØĒ Ø¨Ø§Ų„Ø§)", - "3": "ØŗŲØ§ØąØ´ÛŒ (ØąŲ†Ú¯â€ŒŲ‡Ø§ÛŒ ØŗŲØ§ØąØ´ÛŒâ€ŒØŗØ§Ø˛ÛŒ Ø´Ø¯Ų‡)", - "4": "Ų…ØšÚŠŲˆØŗ ÚŠØ§Ų…Ų„ (Ų…ØšÚŠŲˆØŗ ÚŠØąØ¯Ų† ØĒŲ…Ø§Ų… ØąŲ†Ú¯â€ŒŲ‡Ø§)", - "5": "Ú¯Ø˛ÛŒŲ†Ų‡â€ŒŲ‡Ø§ÛŒ ØąŲ†Ú¯ با ÚŠŲ†ØĒØąØ§ØŗØĒ Ø¨Ø§Ų„Ø§", - "6": "Ų…ØĒŲ† ØŗŲÛŒØ¯ ØąŲˆÛŒ ŲžØŗâ€ŒØ˛Ų…ÛŒŲ†Ų‡ ØŗÛŒØ§Ų‡", - "7": "Ų…ØĒŲ† ØŗÛŒØ§Ų‡ ØąŲˆÛŒ ŲžØŗâ€ŒØ˛Ų…ÛŒŲ†Ų‡ ØŗŲÛŒØ¯", - "8": "Ų…ØĒŲ† Ø˛ØąØ¯ ØąŲˆÛŒ ŲžØŗâ€ŒØ˛Ų…ÛŒŲ†Ų‡ ØŗÛŒØ§Ų‡", - "9": "Ų…ØĒŲ† ØŗØ¨Ø˛ ØąŲˆÛŒ ŲžØŗâ€ŒØ˛Ų…ÛŒŲ†Ų‡ ØŗÛŒØ§Ų‡", - "10": "Ø§Ų†ØĒ؎اب ØąŲ†Ú¯ Ų…ØĒŲ†", - "11": "Ø§Ų†ØĒ؎اب ØąŲ†Ú¯ ŲžØŗâ€ŒØ˛Ų…ÛŒŲ†Ų‡" + "selectCustomCert": "ŲØ§ÛŒŲ„ Ú¯ŲˆØ§Ų‡ÛŒ ØŗŲØ§ØąØ´ÛŒ X.509 (ا؎ØĒÛŒØ§ØąÛŒ)", + "downloadCsv": "Download CSV", + "downloadJson": "Download JSON", + "downloadPdf": "Download PDF Report", + "downloadType": { + "csv": "CSV", + "json": "JSON", + "pdf": "PDF" }, - "submit": "ØŦØ§ÛŒÚ¯Ø˛ÛŒŲ†ÛŒ" + "error": { + "allFailed": "Unable to validate the selected files.", + "partial": "Some files could not be validated.", + "reportGeneration": "Could not generate the PDF report. JSON and CSV are available.", + "unexpected": "Unexpected error during validation." + }, + "finalizing": "Preparing downloads...", + "issue": { + "certExpired": "Certificate expired", + "certRevocationUnknown": "Certificate revocation status unknown", + "certRevoked": "Certificate revoked", + "chainInvalid": "Certificate chain invalid", + "signatureInvalid": "Signature cryptographic check failed", + "trustInvalid": "Certificate not trusted" + }, + "noResults": "Run the validation to generate a report.", + "noSignaturesShort": "No signatures", + "processing": "Validating signatures...", + "report": { + "continued": "Continued", + "downloads": "Downloads", + "entryLabel": "Signature Summary", + "fields": { + "created": "Created", + "fileSize": "File Size", + "signatureCount": "Total Signatures", + "signatureDate": "Signature Date" + }, + "filesEvaluated": "{{count}} files evaluated", + "footer": "Validated via Stirling PDF", + "generatedAt": "Generated", + "noPdf": "PDF report will be available after a successful validation.", + "page": "Page", + "shortTitle": "Signature Summary", + "signatureCountLabel": "{{count}} signatures", + "signaturesFound": "{{count}} signatures detected", + "signaturesValid": "{{count}} fully valid", + "title": "Signature Validation Report" + }, + "settings": { + "certHint": "Upload a trusted X.509 certificate to validate against a custom trust source.", + "title": "Validation Settings" + }, + "signatureDate": "Signature Date", + "totalSignatures": "Total Signatures" }, - "replaceColorPdf": { - "tags": "ØŦØ§ÛŒÚ¯Ø˛ÛŒŲ†ÛŒ ØąŲ†Ú¯ØŒ ØšŲ…Ų„ÛŒØ§ØĒ ØĩŲØ­Ų‡ØŒ ØŗØąŲˆØą" + "replaceColor": { + "tags": "Replace Colour,Page operations,Back end,server side", + "labels": { + "settings": "Settings", + "colourOperation": "Colour operation" + }, + "options": { + "highContrast": "High contrast", + "invertAll": "Invert all colours", + "custom": "Custom", + "cmyk": "Convert to CMYK" + }, + "tooltip": { + "header": { + "title": "Replace & Invert Colour Settings Overview" + }, + "description": { + "title": "Description", + "text": "Transform PDF colours to improve readability and accessibility. Choose from high contrast presets, invert all colours, or create custom colour schemes." + }, + "highContrast": { + "title": "High Contrast", + "text": "Apply predefined high contrast colour combinations designed for better readability and accessibility compliance.", + "bullet1": "White text on black background - Classic dark mode", + "bullet2": "Black text on white background - Standard high contrast", + "bullet3": "Yellow text on black background - High visibility option", + "bullet4": "Green text on black background - Alternative high contrast" + }, + "invertAll": { + "title": "Invert All Colours", + "text": "Completely invert all colours in the PDF, creating a negative-like effect. Useful for creating dark mode versions of documents or reducing eye strain in low-light conditions." + }, + "custom": { + "title": "Custom Colours", + "text": "Define your own text and background colours using the colour pickers. Perfect for creating branded documents or specific accessibility requirements.", + "bullet1": "Text colour - Choose the colour for text elements", + "bullet2": "Background colour - Set the background colour for the document" + }, + "cmyk": { + "title": "Convert to CMYK", + "text": "Convert the PDF from RGB colour space to CMYK colour space, optimized for professional printing. This process converts colours to the Cyan, Magenta, Yellow, Black model used by printers." + } + }, + "error": { + "failed": "An error occurred while processing the colour replacement." + } }, "login": { "title": "ŲˆØąŲˆØ¯", "header": "ŲˆØąŲˆØ¯", "signin": "ŲˆØąŲˆØ¯", + "signInWith": "Sign in with", + "signInAnonymously": "Sign Up as a Guest", "rememberme": "Ų…ØąØ§ Ø¨Ų‡ ØŽØ§ØˇØą Ø¨ØŗŲžØ§Øą", "invalid": "Ų†Ø§Ų… ÚŠØ§ØąØ¨ØąÛŒ یا ØąŲ…Ø˛ ØšØ¨ŲˆØą اشØĒØ¨Ø§Ų‡ Ø§ØŗØĒ.", "locked": "Ø­ØŗØ§Ø¨ Ø´Ų…Ø§ ؂؁؄ Ø´Ø¯Ų‡ Ø§ØŗØĒ.", @@ -1441,12 +3273,83 @@ "alreadyLoggedIn": "Ø´Ų…Ø§ Ų‚Ø¨Ų„Ø§Ų‹ ŲˆØ§ØąØ¯ Ø´Ø¯Ų‡â€ŒØ§ÛŒØ¯ Ø¯Øą", "alreadyLoggedIn2": "Ø¯ØŗØĒÚ¯Ø§Ų‡â€ŒŲ‡Ø§. Ų„ØˇŲØ§Ų‹ Ø§Ø˛ Ø¯ØŗØĒÚ¯Ø§Ų‡â€ŒŲ‡Ø§ ØŽØ§ØąØŦ Ø´Ø¯Ų‡ ؈ Ø¯ŲˆØ¨Ø§ØąŲ‡ ØĒŲ„Ø§Ø´ ÚŠŲ†ÛŒØ¯.", "toManySessions": "Ø´Ų…Ø§ ØĒؚداد Ø˛ÛŒØ§Ø¯ÛŒ Ų†Ø´ØŗØĒ ŲØšØ§Ų„ Ø¯Ø§ØąÛŒØ¯.", - "logoutMessage": "You have been logged out." + "logoutMessage": "You have been logged out.", + "youAreLoggedIn": "You are logged in!", + "email": "Email", + "password": "Password", + "enterEmail": "Enter your email", + "enterPassword": "Enter your password", + "loggingIn": "Logging In...", + "username": "Username", + "enterUsername": "Enter username", + "useEmailInstead": "Login with email", + "forgotPassword": "Forgot your password?", + "logIn": "Log In", + "signingIn": "Signing in...", + "login": "Login", + "or": "Or", + "useMagicLink": "Use magic link instead", + "enterEmailForMagicLink": "Enter your email for magic link", + "sending": "Sendingâ€Ļ", + "sendMagicLink": "Send Magic Link", + "cancel": "Cancel", + "dontHaveAccount": "Don't have an account? Sign up", + "home": "Home", + "debug": "Debug", + "signOut": "Sign Out", + "pleaseEnterBoth": "Please enter both email and password", + "pleaseEnterEmail": "Please enter your email address", + "magicLinkSent": "Magic link sent to {{email}}! Check your email and click the link to sign in.", + "passwordResetSent": "Password reset link sent to {{email}}! Check your email and follow the instructions.", + "failedToSignIn": "Failed to sign in with {{provider}}: {{message}}", + "unexpectedError": "Unexpected error: {{message}}", + "accountCreatedSuccess": "Account created successfully! You can now sign in.", + "passwordChangedSuccess": "Password changed successfully! Please sign in with your new password.", + "credentialsUpdated": "Your credentials have been updated. Please sign in again." + }, + "signup": { + "title": "Create an account", + "subtitle": "Join Stirling PDF to get started", + "name": "Name", + "email": "Email", + "password": "Password", + "confirmPassword": "Confirm password", + "enterName": "Enter your name", + "enterEmail": "Enter your email", + "enterPassword": "Enter your password", + "confirmPasswordPlaceholder": "Confirm password", + "or": "or", + "creatingAccount": "Creating Account...", + "signUp": "Sign Up", + "alreadyHaveAccount": "Already have an account? Sign in", + "pleaseFillAllFields": "Please fill in all fields", + "passwordsDoNotMatch": "Passwords do not match", + "passwordTooShort": "Password must be at least 6 characters long", + "invalidEmail": "Please enter a valid email address", + "checkEmailConfirmation": "Check your email for a confirmation link to complete your registration.", + "accountCreatedSuccessfully": "Account created successfully! You can now sign in.", + "unexpectedError": "Unexpected error: {{message}}", + "useEmailInstead": "Use Email Instead", + "nameRequired": "Name is required", + "emailRequired": "Email is required", + "passwordRequired": "Password is required", + "confirmPasswordRequired": "Please confirm your password" }, "pdfToSinglePage": { "title": "PDF Ø¨Ų‡ یڊ ØĩŲØ­Ų‡", "header": "PDF Ø¨Ų‡ یڊ ØĩŲØ­Ų‡", - "submit": "ØĒØ¨Ø¯ÛŒŲ„ Ø¨Ų‡ یڊ ØĩŲØ­Ų‡" + "submit": "ØĒØ¨Ø¯ÛŒŲ„ Ø¨Ų‡ یڊ ØĩŲØ­Ų‡", + "description": "This tool will merge all pages of your PDF into one large single page. The width will remain the same as the original pages, but the height will be the sum of all page heights.", + "filenamePrefix": "single_page", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst converting to single page." + }, + "results": { + "title": "Single Page Results" + } }, "pageExtracter": { "title": "Ø§ØŗØĒØŽØąØ§ØŦ ØĩŲØ­Ø§ØĒ", @@ -1470,18 +3373,59 @@ "adjustContrast": { "title": "ØĒŲ†Ø¸ÛŒŲ… ÚŠŲ†ØĒØąØ§ØŗØĒ", "header": "ØĒŲ†Ø¸ÛŒŲ… ÚŠŲ†ØĒØąØ§ØŗØĒ", + "basic": "Basic Adjustments", "contrast": "ÚŠŲ†ØĒØąØ§ØŗØĒ:", "brightness": "ØąŲˆØ´Ų†Ø§ÛŒÛŒ:", "saturation": "اشباؚ:", - "download": "Ø¯Ø§Ų†Ų„ŲˆØ¯" + "download": "Ø¯Ø§Ų†Ų„ŲˆØ¯", + "adjustColors": "Adjust Colors", + "blue": "Blue", + "confirm": "Confirm", + "error": { + "failed": "Failed to adjust colors/contrast" + }, + "green": "Green", + "noPreview": "Select a PDF to preview", + "red": "Red", + "results": { + "title": "Adjusted PDF" + } }, "compress": { "title": "ŲØ´ØąØ¯Ų‡â€ŒØŗØ§Ø˛ÛŒ", + "desc": "Compress PDFs to reduce their file size.", "header": "ŲØ´ØąØ¯Ų‡â€ŒØŗØ§Ø˛ÛŒ PDF", + "method": { + "title": "Compression Method", + "quality": "Quality", + "filesize": "Ø§Ų†Ø¯Ø§Ø˛Ų‡ ŲØ§ÛŒŲ„" + }, "credit": "Ø§ÛŒŲ† ØŗØąŲˆÛŒØŗ Ø§Ø˛ qpdf Ø¨ØąØ§ÛŒ ŲØ´ØąØ¯Ų‡â€ŒØŗØ§Ø˛ÛŒ / Ø¨Ų‡ÛŒŲ†Ų‡â€ŒØŗØ§Ø˛ÛŒ PDF Ø§ØŗØĒŲØ§Ø¯Ų‡ Ų…ÛŒâ€ŒÚŠŲ†Ø¯.", "grayscale": { "label": "Ø§ØšŲ…Ø§Ų„ Ų…Ų‚ÛŒØ§Øŗ ØŽØ§ÚŠØŗØĒØąÛŒ Ø¨ØąØ§ÛŒ ŲØ´ØąØ¯Ų‡â€ŒØŗØ§Ø˛ÛŒ" }, + "tooltip": { + "header": { + "title": "Compress Settings Overview" + }, + "description": { + "title": "Description", + "text": "Compression is an easy way to reduce your file size. Pick File Size to enter a target size and have us adjust quality for you. Pick Quality to set compression strength manually." + }, + "qualityAdjustment": { + "title": "Quality Adjustment", + "text": "Drag the slider to adjust the compression strength. Lower values (1-3) preserve quality but result in larger files. Higher values (7-9) shrink the file more but reduce image clarity.", + "bullet1": "Lower values preserve quality", + "bullet2": "Higher values reduce file size" + }, + "grayscale": { + "title": "Grayscale", + "text": "Select this option to convert all images to black and white, which can significantly reduce file size especially for scanned PDFs or image-heavy documents." + } + }, + "error": { + "failed": "An error occurred while compressing the PDF." + }, "selectText": { "1": { "_value": "Compression Settings", @@ -1491,10 +3435,7 @@ "4": "Ø­Ø§Ų„ØĒ ØŽŲˆØ¯ÚŠØ§Øą - ÚŠÛŒŲÛŒØĒ ØąØ§ Ø¨Ų‡ ØˇŲˆØą ØŽŲˆØ¯ÚŠØ§Øą ØĒŲ†Ø¸ÛŒŲ… Ų…ÛŒâ€ŒÚŠŲ†Ø¯ ØĒا PDF Ø¨Ų‡ Ø§Ų†Ø¯Ø§Ø˛Ų‡ Ø¯Ų‚ÛŒŲ‚ Ø¨ØąØŗØ¯", "5": "Ø§Ų†Ø¯Ø§Ø˛Ų‡ PDF Ų…ŲˆØąØ¯ Ø§Ų†ØĒØ¸Ø§Øą (Ų…ØĢŲ„Ø§Ų‹ Û˛ÛĩMB، ÛąÛ°.Û¸MB، Û˛ÛĩKB)" }, - "submit": "ŲØ´ØąØ¯Ų‡â€ŒØŗØ§Ø˛ÛŒ", - "method": { - "filesize": "Ø§Ų†Ø¯Ø§Ø˛Ų‡ ŲØ§ÛŒŲ„" - } + "submit": "ŲØ´ØąØ¯Ų‡â€ŒØŗØ§Ø˛ÛŒ" }, "decrypt": { "passwordPrompt": "This file is password-protected. Please enter the password:", @@ -1595,7 +3536,13 @@ "title": "Ø­Ø°Ų ØĒØĩŲˆÛŒØą", "header": "Ø­Ø°Ų ØĒØĩŲˆÛŒØą", "removeImage": "Ø­Ø°Ų ØĒØĩŲˆÛŒØą", - "submit": "Ø­Ø°Ų ØĒØĩŲˆÛŒØą" + "submit": "Ø­Ø°Ų ØĒØĩŲˆÛŒØą", + "error": { + "failed": "Failed to remove images from the PDF." + }, + "results": { + "title": "Remove Images Results" + } }, "splitByChapters": { "title": "ØĒŲ‚ØŗÛŒŲ… PDF Ø¨Øą Ø§ØŗØ§Øŗ ؁ØĩŲ„â€ŒŲ‡Ø§", @@ -1629,6 +3576,12 @@ }, "note": "یادداشØĒâ€ŒŲ‡Ø§ÛŒ Ų†ØŗØŽŲ‡ ŲŲ‚Øˇ Ø¨Ų‡ Ø˛Ø¨Ø§Ų† Ø§Ų†Ú¯Ų„ÛŒØŗÛŒ Ų…ŲˆØŦŲˆØ¯ Ø§ØŗØĒ" }, + "swagger": { + "title": "API Documentation", + "header": "API Documentation", + "desc": "View and test the Stirling PDF API endpoints", + "tags": "api,documentation,swagger,endpoints,development" + }, "cookieBanner": { "popUp": { "title": "How we use Cookies", @@ -1664,53 +3617,943 @@ "title": "Analytics", "description": "These cookies help us understand how our tools are being used, so we can focus on building the features our community values most. Rest assured—Stirling PDF cannot and will never track the content of the documents you work with." } + }, + "services": { + "posthog": "PostHog Analytics", + "scarf": "Scarf Pixel" } }, - "download": "Ø¯Ø§Ų†Ų„ŲˆØ¯", - "convert": { - "title": "ØĒØ¨Ø¯ÛŒŲ„", - "settings": "ØĒŲ†Ø¸ÛŒŲ…Ø§ØĒ", - "color": "ØąŲ†Ú¯", - "greyscale": "ØŽØ§ÚŠØŗØĒØąÛŒ", - "fillPage": "ŲžØą ÚŠØąØ¯Ų† ØĩŲØ­Ų‡", - "pdfaDigitalSignatureWarning": "PDF Ø­Ø§ŲˆÛŒ یڊ Ø§Ų…Øļای دیØŦیØĒØ§Ų„ Ø§ØŗØĒ. Ø§ÛŒŲ† Ø¯Øą Ų…ØąØ­Ų„Ų‡ بؚد Ø­Ø°Ų ØŽŲˆØ§Ų‡Ø¯ شد.", - "grayscale": "ØŽØ§ÚŠØŗØĒØąÛŒ" + "removeMetadata": { + "submit": "Remove Metadata" }, - "attachments": { - "tags": "embed,attach,file,attachment,attachments", - "title": "Add attachments", - "header": "Add attachments", - "submit": "Add attachments" + "sidebar": { + "toggle": "Toggle Sidebar" + }, + "theme": { + "toggle": "Toggle Theme" + }, + "view": { + "viewer": "Viewer", + "pageEditor": "Page Editor", + "fileManager": "File Manager" + }, + "pageEditor": { + "title": "Page Editor", + "save": "Save Changes", + "noPdfLoaded": "No PDF loaded. Please upload a PDF to edit.", + "rotatedLeft": "Rotated left:", + "rotatedRight": "Rotated right:", + "deleted": "Deleted:", + "movedLeft": "Moved left:", + "movedRight": "Moved right:", + "splitAt": "Split at:", + "insertedPageBreak": "Inserted page break at:", + "addFileNotImplemented": "Add file not implemented in demo", + "closePdf": "Close PDF", + "reset": "Reset Changes", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "fitToWidth": "Fit to Width", + "actualSize": "Actual Size" + }, + "viewer": { + "firstPage": "First Page", + "lastPage": "Last Page", + "previousPage": "Previous Page", + "nextPage": "Next Page", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "singlePageView": "Single Page View", + "dualPageView": "Dual Page View" }, "rightRail": { + "closeSelected": "Close Selected Files", "selectAll": "Ø§Ų†ØĒ؎اب Ų‡Ų…Ų‡", - "deselectAll": "Ų„Øē؈ Ø§Ų†ØĒ؎اب Ų‡Ų…Ų‡" + "deselectAll": "Ų„Øē؈ Ø§Ų†ØĒ؎اب Ų‡Ų…Ų‡", + "selectByNumber": "Select by Page Numbers", + "deleteSelected": "Delete Selected Pages", + "closePdf": "Close PDF", + "exportAll": "Export PDF", + "downloadSelected": "Download Selected Files", + "downloadAll": "Download All", + "toggleTheme": "Toggle Theme", + "language": "Language", + "search": "Search PDF", + "panMode": "Pan Mode", + "rotateLeft": "Rotate Left", + "rotateRight": "Rotate Right", + "toggleSidebar": "Toggle Sidebar", + "exportSelected": "Export Selected Pages", + "toggleAnnotations": "Toggle Annotations Visibility", + "annotationMode": "Toggle Annotation Mode", + "draw": "Draw", + "save": "Save" + }, + "search": { + "title": "Search PDF", + "placeholder": "Enter search term...", + "noResults": "No results found", + "searching": "Searching..." + }, + "guestBanner": { + "title": "You're using Stirling PDF as a guest!", + "message": "Create a free account to save your work, access more features, and support the project.", + "dismiss": "Dismiss banner", + "signUp": "Sign Up Free" + }, + "toolPicker": { + "searchPlaceholder": "Search tools...", + "noToolsFound": "No tools found", + "allTools": "ALL TOOLS", + "quickAccess": "QUICK ACCESS", + "categories": { + "standardTools": "Standard Tools", + "advancedTools": "Advanced Tools", + "recommendedTools": "Recommended Tools" + }, + "subcategories": { + "signing": "Signing", + "documentSecurity": "Document Security", + "verification": "Verification", + "documentReview": "Document Review", + "pageFormatting": "Page Formatting", + "extraction": "Extraction", + "removal": "Removal", + "automation": "Automation", + "general": "General", + "advancedFormatting": "Advanced Formatting", + "developerTools": "Developer Tools" + } }, "quickAccess": { - "sign": "Ø§Ų…Øļا" + "read": "Read", + "sign": "Ø§Ų…Øļا", + "automate": "Automate", + "files": "Files", + "activity": "Activity", + "help": "Help", + "account": "Account", + "config": "Config", + "adminSettings": "Admin Settings", + "allTools": "All Tools" + }, + "admin": { + "error": "Error", + "success": "Success", + "expand": "Expand", + "close": "Close", + "status": { + "active": "Active", + "inactive": "Inactive" + }, + "settings": { + "title": "Admin Settings", + "workspace": "Workspace", + "fetchError": "Failed to load settings", + "saveError": "Failed to save settings", + "saved": "Settings saved successfully", + "saveSuccess": "Settings saved successfully", + "save": "Save Changes", + "restartRequired": "Restart Required", + "restart": { + "title": "Restart Required", + "message": "Settings have been saved successfully. A server restart is required for the changes to take effect.", + "question": "Would you like to restart the server now or later?", + "now": "Restart Now", + "later": "Restart Later" + }, + "restarting": "Restarting Server", + "restartingMessage": "The server is restarting. Please wait a moment...", + "restartError": "Failed to restart server. Please restart manually.", + "general": { + "title": "System Settings", + "description": "Configure system-wide application settings including branding and default behaviour.", + "ui": "User Interface", + "system": "System", + "appName": { + "label": "Application Name", + "description": "The name displayed in the browser tab and home page" + }, + "appNameNavbar": { + "label": "Navbar Brand", + "description": "The name displayed in the navigation bar" + }, + "homeDescription": { + "label": "Home Description", + "description": "The description text shown on the home page" + }, + "defaultLocale": { + "label": "Default Locale", + "description": "The default language for new users (e.g., en_US, es_ES)" + }, + "fileUploadLimit": { + "label": "File Upload Limit", + "description": "Maximum file upload size (e.g., 100MB, 1GB)" + }, + "showUpdate": { + "label": "Show Update Notifications", + "description": "Display notifications when a new version is available" + }, + "showUpdateOnlyAdmin": { + "label": "Show Updates to Admins Only", + "description": "Restrict update notifications to admin users only" + }, + "customHTMLFiles": { + "label": "Custom HTML Files", + "description": "Allow serving custom HTML files from the customFiles directory" + }, + "languages": { + "label": "Available Languages", + "description": "Languages that users can select from (leave empty to enable all languages)" + }, + "customMetadata": { + "label": "Custom Metadata", + "autoUpdate": { + "label": "Auto Update Metadata", + "description": "Automatically update PDF metadata on all processed documents" + }, + "author": { + "label": "Default Author", + "description": "Default author for PDF metadata (e.g., username)" + }, + "creator": { + "label": "Default Creator", + "description": "Default creator for PDF metadata" + }, + "producer": { + "label": "Default Producer", + "description": "Default producer for PDF metadata" + } + }, + "customPaths": { + "label": "Custom Paths", + "description": "Configure custom file system paths for pipeline processing and external tools", + "pipeline": { + "label": "Pipeline Directories", + "watchedFoldersDir": { + "label": "Watched Folders Directory", + "description": "Directory where pipeline monitors for incoming PDFs (leave empty for default: /pipeline/watchedFolders)" + }, + "finishedFoldersDir": { + "label": "Finished Folders Directory", + "description": "Directory where processed PDFs are outputted (leave empty for default: /pipeline/finishedFolders)" + } + }, + "operations": { + "label": "External Tool Paths", + "weasyprint": { + "label": "WeasyPrint Executable", + "description": "Path to WeasyPrint executable for HTML to PDF conversion (leave empty for default: /opt/venv/bin/weasyprint)" + }, + "unoconvert": { + "label": "Unoconvert Executable", + "description": "Path to LibreOffice unoconvert for document conversions (leave empty for default: /opt/venv/bin/unoconvert)" + } + } + } + }, + "security": { + "title": "Security", + "description": "Configure authentication, login behaviour, and security policies.", + "ssoNotice": { + "title": "Looking for SSO/SAML settings?", + "message": "OAuth2 and SAML2 authentication providers have been moved to the Connections menu for easier management." + }, + "authentication": "Authentication", + "enableLogin": { + "label": "Enable Login", + "description": "Require users to log in before accessing the application" + }, + "loginMethod": { + "label": "Login Method", + "description": "The authentication method to use for user login", + "all": "All Methods", + "normal": "Username/Password Only", + "oauth2": "OAuth2 Only", + "saml2": "SAML2 Only" + }, + "loginAttemptCount": { + "label": "Login Attempt Limit", + "description": "Maximum number of failed login attempts before account lockout" + }, + "loginResetTimeMinutes": { + "label": "Login Reset Time (minutes)", + "description": "Time before failed login attempts are reset" + }, + "csrfDisabled": { + "label": "Disable CSRF Protection", + "description": "Disable Cross-Site Request Forgery protection (not recommended)" + }, + "initialLogin": { + "label": "Initial Login", + "username": { + "label": "Initial Username", + "description": "The username for the initial admin account" + }, + "password": { + "label": "Initial Password", + "description": "The password for the initial admin account" + } + }, + "jwt": { + "label": "JWT Configuration", + "secureCookie": { + "label": "Secure Cookie", + "description": "Require HTTPS for JWT cookies (recommended for production)" + }, + "keyRetentionDays": { + "label": "Key Retention Days", + "description": "Number of days to retain old JWT keys for verification" + }, + "persistence": { + "label": "Enable Key Persistence", + "description": "Store JWT keys persistently to survive server restarts" + }, + "enableKeyRotation": { + "label": "Enable Key Rotation", + "description": "Automatically rotate JWT signing keys periodically" + }, + "enableKeyCleanup": { + "label": "Enable Key Cleanup", + "description": "Automatically remove expired JWT keys" + } + }, + "audit": { + "label": "Audit Logging", + "enabled": { + "label": "Enable Audit Logging", + "description": "Track user actions and system events for compliance and security monitoring" + }, + "level": { + "label": "Audit Level", + "description": "0=OFF, 1=BASIC, 2=STANDARD, 3=VERBOSE" + }, + "retentionDays": { + "label": "Audit Retention (days)", + "description": "Number of days to retain audit logs" + } + }, + "htmlUrlSecurity": { + "label": "HTML URL Security", + "description": "Configure URL access restrictions for HTML processing to prevent SSRF attacks", + "enabled": { + "label": "Enable URL Security", + "description": "Enable URL security restrictions for HTML to PDF conversions" + }, + "level": { + "label": "Security Level", + "description": "MAX: whitelist only, MEDIUM: block internal networks, OFF: no restrictions", + "max": "Maximum (Whitelist Only)", + "medium": "Medium (Block Internal)", + "off": "Off (No Restrictions)" + }, + "advanced": "Advanced Settings", + "allowedDomains": { + "label": "Allowed Domains (Whitelist)", + "description": "One domain per line (e.g., cdn.example.com). Only these domains allowed when level is MAX" + }, + "blockedDomains": { + "label": "Blocked Domains (Blacklist)", + "description": "One domain per line (e.g., malicious.com). Additional domains to block" + }, + "internalTlds": { + "label": "Internal TLDs", + "description": "One TLD per line (e.g., .local, .internal). Block domains with these TLD patterns" + }, + "networkBlocking": "Network Blocking", + "blockPrivateNetworks": { + "label": "Block Private Networks", + "description": "Block RFC 1918 private networks (10.x.x.x, 192.168.x.x, 172.16-31.x.x)" + }, + "blockLocalhost": { + "label": "Block Localhost", + "description": "Block localhost and loopback addresses (127.x.x.x, ::1)" + }, + "blockLinkLocal": { + "label": "Block Link-Local Addresses", + "description": "Block link-local addresses (169.254.x.x, fe80::/10)" + }, + "blockCloudMetadata": { + "label": "Block Cloud Metadata Endpoints", + "description": "Block cloud provider metadata endpoints (169.254.169.254)" + } + } + }, + "connections": { + "title": "Connections", + "description": "Configure external authentication providers like OAuth2 and SAML.", + "linkedServices": "Linked Services", + "unlinkedServices": "Unlinked Services", + "connect": "Connect", + "disconnect": "Disconnect", + "disconnected": "Provider disconnected successfully", + "disconnectError": "Failed to disconnect provider", + "ssoAutoLogin": { + "label": "SSO Auto Login", + "enable": "Enable SSO Auto Login", + "description": "Automatically redirect to SSO login when authentication is required" + }, + "oauth2": { + "label": "OAuth2", + "enabled": { + "label": "Enable OAuth2", + "description": "Allow users to authenticate using OAuth2 providers" + }, + "provider": { + "label": "Provider", + "description": "The OAuth2 provider to use for authentication" + }, + "issuer": { + "label": "Issuer URL", + "description": "The OAuth2 provider issuer URL" + }, + "clientId": { + "label": "Client ID", + "description": "The OAuth2 client ID from your provider" + }, + "clientSecret": { + "label": "Client Secret", + "description": "The OAuth2 client secret from your provider" + }, + "useAsUsername": { + "label": "Use as Username", + "description": "The OAuth2 claim to use as the username (e.g., email, sub)" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first OAuth2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via OAuth2" + }, + "scopes": { + "label": "OAuth2 Scopes", + "description": "Comma-separated list of OAuth2 scopes to request (e.g., openid, profile, email)" + } + }, + "saml2": { + "label": "SAML2", + "enabled": { + "label": "Enable SAML2", + "description": "Allow users to authenticate using SAML2 providers" + }, + "provider": { + "label": "Provider", + "description": "The SAML2 provider name" + }, + "registrationId": { + "label": "Registration ID", + "description": "The SAML2 registration identifier" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first SAML2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via SAML2" + } + } + }, + "database": { + "title": "Database", + "description": "Configure custom database connection settings for enterprise deployments.", + "configuration": "Database Configuration", + "enableCustom": { + "label": "Enable Custom Database", + "description": "Use your own custom database configuration instead of the default embedded database" + }, + "customUrl": { + "label": "Custom Database URL", + "description": "Full JDBC connection string (e.g., jdbc:postgresql://localhost:5432/postgres). If provided, individual connection settings below are not used." + }, + "type": { + "label": "Database Type", + "description": "Type of database (not used if custom URL is provided)" + }, + "hostName": { + "label": "Host Name", + "description": "Database server hostname (not used if custom URL is provided)" + }, + "port": { + "label": "Port", + "description": "Database server port (not used if custom URL is provided)" + }, + "name": { + "label": "Database Name", + "description": "Name of the database (not used if custom URL is provided)" + }, + "username": { + "label": "Username", + "description": "Database authentication username" + }, + "password": { + "label": "Password", + "description": "Database authentication password" + } + }, + "privacy": { + "title": "Privacy", + "description": "Configure privacy and data collection settings.", + "analytics": "Analytics & Tracking", + "enableAnalytics": { + "label": "Enable Analytics", + "description": "Collect anonymous usage analytics to help improve the application" + }, + "metricsEnabled": { + "label": "Enable Metrics", + "description": "Enable collection of performance and usage metrics. Provides API endpoint for admins to access metrics data" + }, + "searchEngine": "Search Engine Visibility", + "googleVisibility": { + "label": "Google Visibility", + "description": "Allow search engines to index this application" + } + }, + "advanced": { + "title": "Advanced", + "description": "Configure advanced features and experimental functionality.", + "features": "Feature Flags", + "processing": "Processing", + "endpoints": { + "label": "Endpoints", + "manage": "Manage API Endpoints", + "description": "Endpoint management is configured via YAML. See documentation for details on enabling/disabling specific endpoints." + }, + "enableAlphaFunctionality": { + "label": "Enable Alpha Features", + "description": "Enable experimental and alpha-stage features (may be unstable)" + }, + "enableUrlToPDF": { + "label": "Enable URL to PDF", + "description": "Allow conversion of web pages to PDF documents" + }, + "maxDPI": { + "label": "Maximum DPI", + "description": "Maximum DPI for image processing (0 = unlimited)" + }, + "tessdataDir": { + "label": "Tessdata Directory", + "description": "Path to the tessdata directory for OCR language files" + }, + "disableSanitize": { + "label": "Disable HTML Sanitization", + "description": "WARNING: Security risk - disabling HTML sanitization can lead to XSS vulnerabilities" + }, + "tempFileManagement": { + "label": "Temp File Management", + "description": "Configure temporary file storage and cleanup behavior", + "baseTmpDir": { + "label": "Base Temp Directory", + "description": "Base directory for temporary files (leave empty for default: java.io.tmpdir/stirling-pdf)" + }, + "libreofficeDir": { + "label": "LibreOffice Temp Directory", + "description": "Directory for LibreOffice temp files (leave empty for default: baseTmpDir/libreoffice)" + }, + "systemTempDir": { + "label": "System Temp Directory", + "description": "System temp directory to clean (only used if cleanupSystemTemp is enabled)" + }, + "prefix": { + "label": "Temp File Prefix", + "description": "Prefix for temp file names" + }, + "maxAgeHours": { + "label": "Max Age (hours)", + "description": "Maximum age in hours before temp files are cleaned up" + }, + "cleanupIntervalMinutes": { + "label": "Cleanup Interval (minutes)", + "description": "How often to run cleanup (in minutes)" + }, + "startupCleanup": { + "label": "Startup Cleanup", + "description": "Clean up old temp files on application startup" + }, + "cleanupSystemTemp": { + "label": "Cleanup System Temp", + "description": "Whether to clean broader system temp directory (use with caution)" + } + }, + "processExecutor": { + "label": "Process Executor Limits", + "description": "Configure session limits and timeouts for each process executor", + "sessionLimit": { + "label": "Session Limit", + "description": "Maximum concurrent instances" + }, + "timeout": { + "label": "Timeout (minutes)", + "description": "Maximum execution time" + }, + "libreOffice": "LibreOffice", + "pdfToHtml": "PDF to HTML", + "qpdf": "QPDF", + "tesseract": "Tesseract OCR", + "pythonOpenCv": "Python OpenCV", + "weasyPrint": "WeasyPrint", + "installApp": "Install App", + "calibre": "Calibre", + "ghostscript": "Ghostscript", + "ocrMyPdf": "OCRmyPDF" + } + }, + "mail": { + "title": "Mail Server", + "description": "Configure SMTP settings for sending email notifications.", + "smtp": "SMTP Configuration", + "enabled": { + "label": "Enable Mail", + "description": "Enable email notifications and SMTP functionality" + }, + "host": { + "label": "SMTP Host", + "description": "The hostname or IP address of your SMTP server" + }, + "port": { + "label": "SMTP Port", + "description": "The port number for SMTP connection (typically 25, 465, or 587)" + }, + "username": { + "label": "SMTP Username", + "description": "Username for SMTP authentication" + }, + "password": { + "label": "SMTP Password", + "description": "Password for SMTP authentication" + }, + "from": { + "label": "From Address", + "description": "The email address to use as the sender" + }, + "enableInvites": { + "label": "Enable Email Invites", + "description": "Allow admins to invite users via email with auto-generated passwords" + }, + "frontendUrl": { + "label": "Frontend URL", + "description": "Base URL for frontend (e.g. https://pdf.example.com). Used for generating invite links in emails. Leave empty to use backend URL." + } + }, + "legal": { + "title": "Legal Documents", + "description": "Configure links to legal documents and policies.", + "disclaimer": { + "title": "Legal Responsibility Warning", + "message": "By customizing these legal documents, you assume full responsibility for ensuring compliance with all applicable laws and regulations, including but not limited to GDPR and other EU data protection requirements. Only modify these settings if: (1) you are operating a personal/private instance, (2) you are outside EU jurisdiction and understand your local legal obligations, or (3) you have obtained proper legal counsel and accept sole responsibility for all user data and legal compliance. Stirling-PDF and its developers assume no liability for your legal obligations." + }, + "termsAndConditions": { + "label": "Terms and Conditions", + "description": "URL or filename to terms and conditions" + }, + "privacyPolicy": { + "label": "Privacy Policy", + "description": "URL or filename to privacy policy" + }, + "accessibilityStatement": { + "label": "Accessibility Statement", + "description": "URL or filename to accessibility statement" + }, + "cookiePolicy": { + "label": "Cookie Policy", + "description": "URL or filename to cookie policy" + }, + "impressum": { + "label": "Impressum", + "description": "URL or filename to impressum (required in some jurisdictions)" + } + }, + "premium": { + "title": "Premium & Enterprise", + "description": "Configure your premium or enterprise license key.", + "license": "License Configuration", + "key": { + "label": "License Key", + "description": "Enter your premium or enterprise license key" + }, + "enabled": { + "label": "Enable Premium Features", + "description": "Enable license key checks for pro/enterprise features" + }, + "movedFeatures": { + "title": "Premium Features Distributed", + "message": "Premium and Enterprise features are now organized in their respective sections:" + } + }, + "features": { + "title": "Features", + "description": "Configure optional features and functionality.", + "serverCertificate": { + "label": "Server Certificate", + "description": "Configure server-side certificate generation for \"Sign with Stirling-PDF\" functionality", + "enabled": { + "label": "Enable Server Certificate", + "description": "Enable server-side certificate for \"Sign with Stirling-PDF\" option" + }, + "organizationName": { + "label": "Organization Name", + "description": "Organization name for generated certificates" + }, + "validity": { + "label": "Certificate Validity (days)", + "description": "Number of days the certificate will be valid" + }, + "regenerateOnStartup": { + "label": "Regenerate on Startup", + "description": "Generate new certificate on each application startup" + } + } + }, + "endpoints": { + "title": "API Endpoints", + "description": "Control which API endpoints and endpoint groups are available.", + "management": "Endpoint Management", + "toRemove": { + "label": "Disabled Endpoints", + "description": "Select individual endpoints to disable" + }, + "groupsToRemove": { + "label": "Disabled Endpoint Groups", + "description": "Select endpoint groups to disable" + }, + "note": "Note: Disabling endpoints restricts API access but does not remove UI components. Restart required for changes to take effect." + } + } }, "fileUpload": { + "selectFile": "Select a file", + "selectFiles": "Select files", + "selectPdfToView": "Select a PDF to view", + "selectPdfToEdit": "Select a PDF to edit", + "chooseFromStorage": "Choose a file from storage or upload a new PDF", + "chooseFromStorageMultiple": "Choose files from storage or upload new PDFs", + "loadFromStorage": "Load from Storage", + "filesAvailable": "files available", "loading": "Ø¯Øą Ø­Ø§Ų„ Ø¨Ø§ØąÚ¯Ø°Ø§ØąÛŒ...", - "or": "یا" + "or": "یا", + "dropFileHere": "Drop file here or click to upload", + "dropFilesHere": "Drop files here or click the upload button", + "pdfFilesOnly": "PDF files only", + "supportedFileTypes": "Supported file types", + "upload": "Upload", + "uploadFile": "Upload File", + "uploadFiles": "Upload Files", + "noFilesInStorage": "No files available in storage. Upload some files first.", + "selectFromStorage": "Select from Storage", + "backToTools": "Back to Tools", + "addFiles": "Add Files", + "dragFilesInOrClick": "Drag files in or click \"Add Files\" to browse" + }, + "fileEditor": { + "addFiles": "Add Files" }, "fileManager": { + "title": "Upload PDF Files", + "subtitle": "Add files to your storage for easy access across tools", + "filesSelected": "files selected", + "clearSelection": "Clear Selection", + "openInFileEditor": "Open in File Editor", + "uploadError": "Failed to upload some files.", + "failedToOpen": "Failed to open file. It may have been removed from storage.", + "failedToLoad": "Failed to load file to active set.", + "storageCleared": "Browser cleared storage. Files have been removed. Please re-upload.", + "clearAll": "Clear All", + "reloadFiles": "Reload Files", + "dragDrop": "Drag & Drop files here", + "clickToUpload": "Click to upload files", + "selectedFiles": "Selected Files", + "storage": "Storage", + "filesStored": "files stored", + "storageError": "Storage error occurred", + "storageLow": "Storage is running low. Consider removing old files.", + "supportMessage": "Powered by browser database storage for unlimited capacity", + "noFileSelected": "No files selected", + "showHistory": "Show History", + "hideHistory": "Hide History", + "fileHistory": "File History", + "loadingHistory": "Loading History...", + "lastModified": "Last Modified", + "toolChain": "Tools Applied", + "restore": "Restore", + "unzip": "Unzip", + "searchFiles": "Search files...", + "recent": "Recent", + "localFiles": "Local Files", + "googleDrive": "Google Drive", + "googleDriveShort": "Drive", + "myFiles": "My Files", + "noRecentFiles": "No recent files found", + "googleDriveNotAvailable": "Google Drive integration not available", + "openFiles": "Open Files", + "openFile": "Open File", + "details": "File Details", "fileName": "Ų†Ø§Ų…", + "fileFormat": "Format", + "fileSize": "Size", "fileVersion": "Ų†ØŗØŽŲ‡", + "totalSelected": "Total Selected", + "dropFilesHere": "Drop files here", "selectAll": "Ø§Ų†ØĒ؎اب Ų‡Ų…Ų‡", "deselectAll": "Ų„Øē؈ Ø§Ų†ØĒ؎اب Ų‡Ų…Ų‡", "deleteSelected": "Ø­Ø°Ų Ø§Ų†ØĒ؎اب Ø´Ø¯Ų‡â€ŒŲ‡Ø§", + "downloadSelected": "Download Selected", + "selectedCount": "{{count}} selected", "download": "Ø¯Ø§Ų†Ų„ŲˆØ¯", - "delete": "Ø­Ø°Ų" + "delete": "Ø­Ø°Ų", + "unsupported": "Unsupported", + "addToUpload": "Add to Upload", + "deleteAll": "Delete All", + "loadingFiles": "Loading files...", + "noFiles": "No files available", + "noFilesFound": "No files found matching your search", + "openInPageEditor": "Open in Page Editor", + "showAll": "Show All", + "sortByDate": "Sort by Date", + "sortByName": "Sort by Name", + "sortBySize": "Sort by Size" + }, + "storage": { + "temporaryNotice": "Files are stored temporarily in your browser and may be cleared automatically", + "storageLimit": "Storage limit", + "storageUsed": "Temporary Storage used", + "storageFull": "Storage is nearly full. Consider removing some files.", + "fileTooLarge": "File too large. Maximum size per file is", + "storageQuotaExceeded": "Storage quota exceeded. Please remove some files before uploading more.", + "approximateSize": "Approximate size" }, "sanitize": { + "title": "Sanitise", + "desc": "Remove potentially harmful elements from PDF files.", "submit": "ŲžØ§ÚŠØŗØ§Ø˛ÛŒ PDF", + "completed": "Sanitisation completed successfully", + "error": { + "generic": "Sanitisation failed", + "failed": "An error occurred while sanitising the PDF." + }, + "filenamePrefix": "sanitised", + "sanitizationResults": "Sanitisation Results", "steps": { - "settings": "ØĒŲ†Ø¸ÛŒŲ…Ø§ØĒ" + "files": "Files", + "settings": "ØĒŲ†Ø¸ÛŒŲ…Ø§ØĒ", + "results": "Results" + }, + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "options": { + "title": "Sanitisation Options", + "note": "Select the elements you want to remove from the PDF. At least one option must be selected.", + "removeJavaScript": { + "label": "Remove JavaScript", + "desc": "Remove JavaScript actions and scripts from the PDF" + }, + "removeEmbeddedFiles": { + "label": "Remove Embedded Files", + "desc": "Remove any files embedded within the PDF" + }, + "removeXMPMetadata": { + "label": "Remove XMP Metadata", + "desc": "Remove XMP metadata from the PDF" + }, + "removeMetadata": { + "label": "Remove Document Metadata", + "desc": "Remove document information metadata (title, author, etc.)" + }, + "removeLinks": { + "label": "Remove Links", + "desc": "Remove external links and launch actions from the PDF" + }, + "removeFonts": { + "label": "Remove Fonts", + "desc": "Remove embedded fonts from the PDF" + } + } + }, + "addPassword": { + "title": "Ø§ŲØ˛ŲˆØ¯Ų† Ú¯Ø°ØąŲˆØ§Ú˜Ų‡", + "desc": "Encrypt your PDF document with a password.", + "completed": "Password protection applied", + "submit": "ØąŲ…Ø˛Ų†Ú¯Ø§ØąÛŒ", + "filenamePrefix": "encrypted", + "error": { + "failed": "An error occurred while encrypting the PDF." + }, + "passwords": { + "stepTitle": "Passwords & Encryption", + "completed": "Passwords configured", + "user": { + "label": "User Password", + "placeholder": "Enter user password" + }, + "owner": { + "label": "Owner Password", + "placeholder": "Enter owner password" + } + }, + "encryption": { + "keyLength": { + "label": "Encryption Key Length", + "40bit": "40-bit (Low)", + "128bit": "128-bit (Standard)", + "256bit": "256-bit (High)" + } + }, + "results": { + "title": "Encrypted PDFs" + }, + "tooltip": { + "header": { + "title": "Password Protection Overview" + }, + "passwords": { + "title": "Password Types", + "text": "User passwords restrict opening the document, while owner passwords control what can be done with the document once opened. You can set both or just one.", + "bullet1": "User Password: Required to open the PDF", + "bullet2": "Owner Password: Controls document permissions (not supported by all PDF viewers)" + }, + "encryption": { + "title": "Encryption Levels", + "text": "Higher encryption levels provide better security but may not be supported by older PDF viewers.", + "bullet1": "40-bit: Basic security, compatible with older viewers", + "bullet2": "128-bit: Standard security, widely supported", + "bullet3": "256-bit: Maximum security, requires modern viewers" + }, + "permissions": { + "title": "ØĒØēÛŒÛŒØą Ų…ØŦŲˆØ˛Ų‡Ø§", + "text": "These permissions control what users can do with the PDF. Most effective when combined with an owner password." + } + }, + "tags": "Ø§Ų…Ų†ØŒØ§Ų…Ų†ÛŒØĒ", + "header": "Ø§ŲØ˛ŲˆØ¯Ų† Ú¯Ø°ØąŲˆØ§Ú˜Ų‡ (ØąŲ…Ø˛Ų†Ú¯Ø§ØąÛŒ)", + "selectText": { + "1": "Ø§Ų†ØĒ؎اب PDF Ø¨ØąØ§ÛŒ ØąŲ…Ø˛Ų†Ú¯Ø§ØąÛŒ", + "2": "Ú¯Ø°ØąŲˆØ§Ú˜Ų‡ ÚŠØ§ØąØ¨Øą", + "3": "ØˇŲˆŲ„ ÚŠŲ„ÛŒØ¯ ØąŲ…Ø˛Ų†Ú¯Ø§ØąÛŒ", + "4": "Ų…Ų‚Ø§Ø¯ÛŒØą Ø¨Ø§Ų„Ø§ØĒØą Ų‚ŲˆÛŒâ€ŒØĒØąŲ†Ø¯ØŒ Ø§Ų…Ø§ Ų…Ų‚Ø§Ø¯ÛŒØą ŲžØ§ÛŒÛŒŲ†â€ŒØĒØą Ø¨Ų‡ØĒØą ØŗØ§Ø˛Ú¯Ø§ØąŲ†Ø¯.", + "5": "Ų…ØŦŲˆØ˛Ų‡Ø§ÛŒÛŒ ÚŠŲ‡ باید ØĒŲ†Ø¸ÛŒŲ… Ø´ŲˆŲ†Ø¯ (ØĒ؈ØĩÛŒŲ‡ Ų…ÛŒâ€ŒØ´ŲˆØ¯ Ų‡Ų…ØąØ§Ų‡ با Ú¯Ø°ØąŲˆØ§Ú˜Ų‡ Ų…Ø§Ų„ÚŠ Ø§ØŗØĒŲØ§Ø¯Ų‡ Ø´ŲˆØ¯)", + "6": "ØŦŲ„ŲˆÚ¯ÛŒØąÛŒ Ø§Ø˛ Ų…ŲˆŲ†ØĒاژ ØŗŲ†Ø¯", + "7": "ØŦŲ„ŲˆÚ¯ÛŒØąÛŒ Ø§Ø˛ Ø§ØŗØĒØŽØąØ§ØŦ Ų…Ø­ØĒŲˆØ§", + "8": "ØŦŲ„ŲˆÚ¯ÛŒØąÛŒ Ø§Ø˛ Ø§ØŗØĒØŽØąØ§ØŦ Ø¨ØąØ§ÛŒ Ø¯ØŗØĒØąØŗÛŒâ€ŒŲžØ°ÛŒØąÛŒ", + "9": "ØŦŲ„ŲˆÚ¯ÛŒØąÛŒ Ø§Ø˛ ŲžØąÚŠØąØ¯Ų† ŲØąŲ…", + "10": "ØŦŲ„ŲˆÚ¯ÛŒØąÛŒ Ø§Ø˛ اØĩŲ„Ø§Ø­", + "11": "ØŦŲ„ŲˆÚ¯ÛŒØąÛŒ Ø§Ø˛ اØĩŲ„Ø§Ø­ Ø­Ø§Ø´ÛŒŲ‡â€ŒŲ†ŲˆÛŒØŗÛŒ", + "12": "ØŦŲ„ŲˆÚ¯ÛŒØąÛŒ Ø§Ø˛ Ú†Ø§Ųž", + "13": "ØŦŲ„ŲˆÚ¯ÛŒØąÛŒ Ø§Ø˛ Ú†Ø§Ųž ŲØąŲ…ØĒâ€ŒŲ‡Ø§ÛŒ Ų…ØŽØĒ؄؁", + "14": "Ú¯Ø°ØąŲˆØ§Ú˜Ų‡ Ų…Ø§Ų„ÚŠ", + "15": "Ų…Ø­Ø¯ŲˆØ¯ÛŒØĒâ€ŒŲ‡Ø§ÛŒÛŒ ÚŠŲ‡ Ų…ÛŒâ€ŒØĒŲˆØ§Ų† Ø¨Øą ØąŲˆÛŒ ØŗŲ†Ø¯ Ø§ØšŲ…Ø§Ų„ ÚŠØąØ¯ Ų‡Ų†Ú¯Ø§Ų…ÛŒ ÚŠŲ‡ Ø¨Ø§Ø˛ Ø§ØŗØĒ (ŲžØ´ØĒÛŒØ¨Ø§Ų†ÛŒâ€ŒØ´Ø¯Ų‡ ØĒŲˆØŗØˇ Ų‡Ų…Ų‡ ØŽŲˆØ§Ų†Ų†Ø¯Ú¯Ø§Ų† Ų†ÛŒØŗØĒ)", + "16": "Ų…Ø­Ø¯ŲˆØ¯ÛŒØĒâ€ŒŲ‡Ø§ÛŒ Ø¨Ø§Ø˛ Ø´Ø¯Ų† ØŽŲˆØ¯ ØŗŲ†Ø¯" } }, "changePermissions": { "title": "ØĒØēÛŒÛŒØą Ų…ØŦŲˆØ˛Ų‡Ø§", + "desc": "Change document restrictions and permissions.", + "completed": "Permissions changed", "submit": "ØĒØēÛŒÛŒØą Ų…ØŦŲˆØ˛Ų‡Ø§", + "error": { + "failed": "An error occurred while changing PDF permissions." + }, "permissions": { "preventAssembly": { "label": "ØŦŲ„ŲˆÚ¯ÛŒØąÛŒ Ø§Ø˛ Ų…ŲˆŲ†ØĒاژ ØŗŲ†Ø¯" @@ -1737,10 +4580,784 @@ "label": "ØŦŲ„ŲˆÚ¯ÛŒØąÛŒ Ø§Ø˛ Ú†Ø§Ųž ŲØąŲ…ØĒâ€ŒŲ‡Ø§ÛŒ Ų…ØŽØĒ؄؁" } }, + "results": { + "title": "Modified PDFs" + }, "tooltip": { "header": { "title": "ØĒØēÛŒÛŒØą Ų…ØŦŲˆØ˛Ų‡Ø§" + }, + "description": { + "text": "Changes document permissions, allowing/disallowing access to different features in PDF readers." + }, + "warning": { + "text": "To make these permissions unchangeable, use the Add Password tool to set an owner password." } } + }, + "removePassword": { + "title": "Ø­Ø°Ų Ú¯Ø°ØąŲˆØ§Ú˜Ų‡", + "desc": "Ø­Ø°Ų Ø­ŲØ§Ø¸ØĒ ØąŲ…Ø˛ ØšØ¨ŲˆØą Ø§Ø˛ ØŗŲ†Ø¯ PDF Ø´Ų…Ø§.", + "tags": "Ø§Ų…Ų†ØŒØąŲ…Ø˛Ú¯Ø´Ø§ÛŒÛŒØŒØ§Ų…Ų†ÛŒØĒØŒØ­Ø°Ų ØąŲ…Ø˛ ØšØ¨ŲˆØą", + "password": { + "stepTitle": "Ø­Ø°Ų ØąŲ…Ø˛ ØšØ¨ŲˆØą", + "label": "ØąŲ…Ø˛ ØšØ¨ŲˆØą ŲØšŲ„ÛŒ", + "placeholder": "Enter current password", + "completed": "Password configured" + }, + "filenamePrefix": "decrypted", + "error": { + "failed": "An error occurred while removing the password from the PDF." + }, + "tooltip": { + "description": "Removing password protection requires the password that was used to encrypt the PDF. This will decrypt the document, making it accessible without a password." + }, + "submit": "Ø­Ø°Ų", + "results": { + "title": "Decrypted PDFs" + }, + "header": "Ø­Ø°Ų Ú¯Ø°ØąŲˆØ§Ú˜Ų‡ (ØąŲ…Ø˛Ú¯Ø´Ø§ÛŒÛŒ)", + "selectText": { + "1": "PDFی ØąØ§ Ø¨ØąØ§ÛŒ ØąŲ…Ø˛Ú¯Ø´Ø§ÛŒÛŒ Ø§Ų†ØĒ؎اب ÚŠŲ†ÛŒØ¯", + "2": "Ú¯Ø°ØąŲˆØ§Ú˜Ų‡" + } + }, + "automate": { + "title": "Automate", + "desc": "Build multi-step workflows by chaining together PDF actions. Ideal for recurring tasks.", + "invalidStep": "Invalid step", + "files": { + "placeholder": "Select files to process with this automation" + }, + "selection": { + "title": "Automation Selection", + "saved": { + "title": "Saved" + }, + "createNew": { + "title": "Create New Automation" + }, + "suggested": { + "title": "Suggested" + } + }, + "creation": { + "createTitle": "Create Automation", + "editTitle": "Edit Automation", + "intro": "Automations run tools sequentially. To get started, add tools in the order you want them to run.", + "name": { + "label": "Automation Name", + "placeholder": "My Automation" + }, + "description": { + "label": "Description (optional)", + "placeholder": "Describe what this automation does..." + }, + "tools": { + "selectTool": "Select a tool...", + "selected": "Selected Tools", + "remove": "Remove tool", + "configure": "Configure tool", + "notConfigured": "! Not Configured", + "addTool": "Add Tool", + "add": "Add a tool..." + }, + "save": "Save Automation", + "unsavedChanges": { + "title": "Unsaved Changes", + "message": "You have unsaved changes. Are you sure you want to go back? All changes will be lost.", + "cancel": "Cancel", + "confirm": "Go Back" + }, + "icon": { + "label": "Icon" + } + }, + "run": { + "title": "Run Automation" + }, + "sequence": { + "unnamed": "Unnamed Automation", + "steps": "{{count}} steps", + "running": "Running Automation...", + "run": "Run Automation", + "finish": "Finish" + }, + "reviewTitle": "Automation Results", + "config": { + "loading": "Loading tool configuration...", + "noSettings": "This tool does not have configurable settings.", + "title": "Configure {{toolName}}", + "description": "Configure the settings for this tool. These settings will be applied when the automation runs.", + "cancel": "Cancel", + "save": "Save Configuration" + }, + "copyToSaved": "Copy to Saved" + }, + "automation": { + "suggested": { + "securePdfIngestion": "Secure PDF Ingestion", + "securePdfIngestionDesc": "Comprehensive PDF processing workflow that sanitises documents, applies OCR with cleanup, converts to PDF/A format for long-term archival, and optimises file size.", + "emailPreparation": "Email Preparation", + "emailPreparationDesc": "Optimises PDFs for email distribution by compressing files, splitting large documents into 20MB chunks for email compatibility, and removing metadata for privacy.", + "secureWorkflow": "Security Workflow", + "secureWorkflowDesc": "Secures PDF documents by removing potentially malicious content like JavaScript and embedded files, then adds password protection to prevent unauthorised access. Password is set to 'password' by default.", + "processImages": "Process Images", + "processImagesDesc": "Converts multiple image files into a single PDF document, then applies OCR technology to extract searchable text from the images." + } + }, + "common": { + "copy": "Copy", + "copied": "Copied!", + "refresh": "Refresh", + "retry": "Retry", + "remaining": "remaining", + "used": "used", + "available": "available", + "cancel": "Cancel", + "preview": "Preview" + }, + "config": { + "overview": { + "title": "Application Configuration", + "description": "Current application settings and configuration details." + }, + "account": { + "overview": { + "title": "Account Settings", + "manageAccountPreferences": "Manage your account preferences", + "guestDescription": "You are signed in as a guest. Consider upgrading your account above." + }, + "upgrade": { + "title": "Upgrade Guest Account", + "description": "Link your account to preserve your history and access more features!", + "socialLogin": "Upgrade with Social Account", + "linkWith": "Link with", + "emailPassword": "or enter your email & password", + "email": "Email", + "emailPlaceholder": "Enter your email", + "password": "Password (optional)", + "passwordPlaceholder": "Set a password", + "passwordNote": "Leave empty to use email verification only", + "upgradeButton": "Upgrade Account" + } + }, + "apiKeys": { + "description": "Your API key for accessing Stirling's suite of PDF tools. Copy it to your project or refresh to generate a new one.", + "publicKeyAriaLabel": "Public API key", + "copyKeyAriaLabel": "Copy API key", + "refreshAriaLabel": "Refresh API key", + "includedCredits": "Included credits", + "purchasedCredits": "Purchased credits", + "totalCredits": "Total Credits", + "chartAriaLabel": "Credits usage: included {{includedUsed}} of {{includedTotal}}, purchased {{purchasedUsed}} of {{purchasedTotal}}", + "nextReset": "Next Reset", + "lastApiUse": "Last API Use", + "overlayMessage": "Generate a key to see credits and available credits", + "label": "API Key", + "guestInfo": "Guest users do not receive API keys. Create an account to get an API key you can use in your applications.", + "goToAccount": "Go to Account", + "refreshModal": { + "title": "Refresh API Keys", + "warning": "âš ī¸ Warning: This action will generate new API keys and make your previous keys invalid.", + "impact": "Any applications or services currently using these keys will stop working until you update them with the new keys.", + "confirmPrompt": "Are you sure you want to continue?", + "confirmCta": "Refresh Keys" + }, + "generateError": "We couldn't generate your API key." + } + }, + "AddAttachmentsRequest": { + "attachments": "Select Attachments", + "info": "Select files to attach to your PDF. These files will be embedded and accessible through the PDF's attachment panel.", + "selectFiles": "Select Files to Attach", + "placeholder": "Choose files...", + "addMoreFiles": "Add more files...", + "selectedFiles": "Selected Files", + "submit": "Add Attachments", + "results": { + "title": "Attachment Results" + }, + "error": { + "failed": "Add attachments operation failed" + } + }, + "termsAndConditions": "Terms & Conditions", + "logOut": "Log out", + "addAttachments": { + "error": { + "failed": "An error occurred while adding attachments to the PDF." + } + }, + "autoRename": { + "description": "This tool will automatically rename PDF files based on their content. It analyzes the document to find the most suitable title from the text." + }, + "customPosition": "Custom Position", + "details": "Details", + "downloadUnavailable": "Download unavailable for this item", + "invalidUndoData": "Cannot undo: invalid operation data", + "margin": { + "large": "Large", + "medium": "Medium", + "small": "Small", + "xLarge": "Extra Large" + }, + "noFilesToUndo": "Cannot undo: no files were processed in the last operation", + "noOperationToUndo": "No operation to undo", + "noValidFiles": "No valid files to process", + "operationCancelled": "Operation cancelled", + "pageEdit": { + "deselectAll": "Select None", + "selectAll": "Select All" + }, + "quickPosition": "Quick Position", + "reorganizePages": { + "error": { + "failed": "Failed to reorganize pages" + }, + "results": { + "title": "Pages Reorganized" + }, + "settings": { + "title": "Settings" + }, + "submit": "Reorganize Pages" + }, + "replace-color": { + "options": { + "fill": "Fill colour", + "gradient": "Gradient" + }, + "previewOverlayOpacity": "Preview overlay opacity", + "previewOverlayTransparency": "Preview overlay transparency", + "previewOverlayVisibility": "Show preview overlay", + "selectText": { + "1": "Ú¯Ø˛ÛŒŲ†Ų‡â€ŒŲ‡Ø§ÛŒ ØŦØ§ÛŒÚ¯Ø˛ÛŒŲ†ÛŒ یا Ų…ØšÚŠŲˆØŗ ÚŠØąØ¯Ų† ØąŲ†Ú¯", + "2": "ŲžÛŒØ´â€ŒŲØąØļ (ØąŲ†Ú¯â€ŒŲ‡Ø§ÛŒ ŲžÛŒØ´â€ŒŲØąØļ با ÚŠŲ†ØĒØąØ§ØŗØĒ Ø¨Ø§Ų„Ø§)", + "3": "ØŗŲØ§ØąØ´ÛŒ (ØąŲ†Ú¯â€ŒŲ‡Ø§ÛŒ ØŗŲØ§ØąØ´ÛŒâ€ŒØŗØ§Ø˛ÛŒ Ø´Ø¯Ų‡)", + "4": "Ų…ØšÚŠŲˆØŗ ÚŠØ§Ų…Ų„ (Ų…ØšÚŠŲˆØŗ ÚŠØąØ¯Ų† ØĒŲ…Ø§Ų… ØąŲ†Ú¯â€ŒŲ‡Ø§)", + "5": "Ú¯Ø˛ÛŒŲ†Ų‡â€ŒŲ‡Ø§ÛŒ ØąŲ†Ú¯ با ÚŠŲ†ØĒØąØ§ØŗØĒ Ø¨Ø§Ų„Ø§", + "6": "Ų…ØĒŲ† ØŗŲÛŒØ¯ ØąŲˆÛŒ ŲžØŗâ€ŒØ˛Ų…ÛŒŲ†Ų‡ ØŗÛŒØ§Ų‡", + "7": "Ų…ØĒŲ† ØŗÛŒØ§Ų‡ ØąŲˆÛŒ ŲžØŗâ€ŒØ˛Ų…ÛŒŲ†Ų‡ ØŗŲÛŒØ¯", + "8": "Ų…ØĒŲ† Ø˛ØąØ¯ ØąŲˆÛŒ ŲžØŗâ€ŒØ˛Ų…ÛŒŲ†Ų‡ ØŗÛŒØ§Ų‡", + "9": "Ų…ØĒŲ† ØŗØ¨Ø˛ ØąŲˆÛŒ ŲžØŗâ€ŒØ˛Ų…ÛŒŲ†Ų‡ ØŗÛŒØ§Ų‡", + "10": "Ø§Ų†ØĒ؎اب ØąŲ†Ú¯ Ų…ØĒŲ†", + "11": "Ø§Ų†ØĒ؎اب ØąŲ†Ú¯ ŲžØŗâ€ŒØ˛Ų…ÛŒŲ†Ų‡", + "12": "Choose start colour", + "13": "Choose end colour" + }, + "submit": "ØŦØ§ÛŒÚ¯Ø˛ÛŒŲ†ÛŒ", + "title": "ØŦØ§ÛŒÚ¯Ø˛ÛŒŲ†ÛŒ/Ų…ØšÚŠŲˆØŗ ÚŠØąØ¯Ų† ØąŲ†Ú¯", + "header": "ØŦØ§ÛŒÚ¯Ø˛ÛŒŲ†ÛŒ/Ų…ØšÚŠŲˆØŗ ÚŠØąØ¯Ų† ØąŲ†Ú¯ PDF" + }, + "size": "Size", + "submit": "Submit", + "success": "Success", + "tools": { + "noSearchResults": "No tools found", + "noTools": "No tools available" + }, + "undoDataMismatch": "Cannot undo: operation data is corrupted", + "undoFailed": "Failed to undo operation", + "undoQuotaError": "Cannot undo: insufficient storage space", + "undoStorageError": "Undo completed but some files could not be saved to storage", + "undoSuccess": "Operation undone successfully", + "unsupported": "Unsupported", + "onboarding": { + "welcomeModal": { + "title": "Welcome to Stirling PDF!", + "description": "Would you like to take a quick 1-minute tour to learn the key features and how to get started?", + "helpHint": "You can always access this tour later from the Help button in the bottom left.", + "startTour": "Start Tour", + "maybeLater": "Maybe Later", + "dontShowAgain": "Don't Show Again" + }, + "allTools": "This is the All Tools panel, where you can browse and select from all available PDF tools.", + "selectCropTool": "Let's select the Crop tool to demonstrate how to use one of the tools.", + "toolInterface": "This is the Crop tool interface. As you can see, there's not much there because we haven't added any PDF files to work with yet.", + "filesButton": "The Files button on the Quick Access bar allows you to upload PDFs to use the tools on.", + "fileSources": "You can upload new files or access recent files from here. For the tour, we'll just use a sample file.", + "workbench": "This is the Workbench - the main area where you view and edit your PDFs.", + "viewSwitcher": "Use these controls to select how you want to view your PDFs.", + "viewer": "The Viewer lets you read and annotate your PDFs.", + "pageEditor": "The Page Editor allows you to do various operations on the pages within your PDFs, such as reordering, rotating and deleting.", + "activeFiles": "The Active Files view shows all of the PDFs you have loaded into the tool, and allows you to select which ones to process.", + "fileCheckbox": "Clicking one of the files selects it for processing. You can select multiple files for batch operations.", + "selectControls": "The Right Rail contains buttons to quickly select/deselect all of your active PDFs, along with buttons to change the app's theme or language.", + "cropSettings": "Now that we've selected the file we want crop, we can configure the Crop tool to choose the area that we want to crop the PDF to.", + "runButton": "Once the tool has been configured, this button allows you to run the tool on all the selected PDFs.", + "results": "After the tool has finished running, the Review step will show a preview of the results in this panel, and allow you to undo the operation or download the file. ", + "fileReplacement": "The modified file will replace the original file in the Workbench automatically, allowing you to easily run it through more tools.", + "pinButton": "You can use the Pin button if you'd rather your files stay active after running tools on them.", + "wrapUp": "You're all set! You've learnt about the main areas of the app and how to use them. Click the Help button whenever you like to see this tour again.", + "previous": "Previous", + "next": "Next", + "finish": "Finish", + "startTour": "Start Tour", + "startTourDescription": "Take a guided tour of Stirling PDF's key features" + }, + "workspace": { + "title": "Workspace", + "people": { + "title": "People", + "description": "Manage workspace members and their permissions", + "loading": "Loading people...", + "searchMembers": "Search members...", + "addMembers": "Add Members", + "inviteMembers": { + "label": "Invite Members", + "subtitle": "Type or paste in emails below, separated by commas. Your workspace will be billed by members." + }, + "user": "User", + "role": "Role", + "team": "Team", + "status": "Status", + "actions": "Actions", + "noMembersFound": "No members found", + "active": "Active", + "disabled": "Disabled", + "activeSession": "Active session", + "member": "Member", + "admin": "Admin", + "roleDescriptions": { + "admin": "Can manage settings and invite members, with full administrative access.", + "member": "Can view and edit shared files, but cannot manage workspace settings or members." + }, + "editRole": "Edit Role", + "enable": "Enable", + "disable": "Disable", + "deleteUser": "Delete User", + "deleteUserSuccess": "User deleted successfully", + "deleteUserError": "Failed to delete user", + "confirmDelete": "Are you sure you want to delete this user? This action cannot be undone.", + "addMember": { + "title": "Add Member", + "username": "Username (Email)", + "usernamePlaceholder": "user@example.com", + "password": "Password", + "passwordPlaceholder": "Enter password", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "forcePasswordChange": "Force password change on first login", + "cancel": "Cancel", + "submit": "Add Member", + "usernameRequired": "Username and password are required", + "passwordTooShort": "Password must be at least 6 characters", + "success": "User created successfully", + "error": "Failed to create user" + }, + "editMember": { + "title": "Edit Member", + "editing": "Editing:", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "cancel": "Cancel", + "submit": "Update Member", + "success": "User updated successfully", + "error": "Failed to update user" + }, + "toggleEnabled": { + "success": "User status updated successfully", + "error": "Failed to update user status" + }, + "delete": { + "success": "User deleted successfully", + "error": "Failed to delete user" + }, + "emailInvite": { + "tab": "Email Invite", + "description": "Type or paste in emails below, separated by commas. Users will receive login credentials via email.", + "emails": "Email Addresses", + "emailsPlaceholder": "user1@example.com, user2@example.com", + "emailsRequired": "At least one email address is required", + "submit": "Send Invites", + "success": "user(s) invited successfully", + "partialSuccess": "Some invites failed", + "allFailed": "Failed to invite users", + "error": "Failed to send invites" + }, + "directInvite": { + "tab": "Direct Create" + }, + "inviteLinkTab": { + "tab": "Invite Link" + }, + "inviteLink": { + "description": "Generate a secure link that allows the user to set their own password", + "email": "Email Address", + "emailPlaceholder": "user@example.com (optional)", + "emailDescription": "Optional - leave blank for a general invite link that can be used by anyone", + "emailRequired": "Email address is required", + "emailOptional": "Optional - leave blank for a general invite link", + "emailRequiredForSend": "Email address is required to send email notification", + "expiryHours": "Expiry Hours", + "expiryDescription": "How many hours until the link expires", + "sendEmail": "Send invite link via email", + "sendEmailDescription": "If enabled, the invite link will be sent to the specified email address", + "smtpRequired": "SMTP not configured", + "generate": "Generate Link", + "generated": "Invite Link Generated", + "copied": "Link copied to clipboard", + "success": "Invite link generated successfully", + "successWithEmail": "Invite link generated and sent via email", + "emailFailed": "Invite link generated, but email failed", + "emailFailedDetails": "Error: {0}. Please share the invite link manually.", + "error": "Failed to generate invite link", + "submit": "Generate Invite Link" + }, + "inviteMode": { + "username": "Username", + "email": "Email", + "link": "Link", + "emailDisabled": "Email invites require SMTP configuration and mail.enableInvites=true in settings" + }, + "license": { + "users": "users", + "availableSlots": "Available Slots", + "grandfathered": "Grandfathered", + "grandfatheredShort": "{{count}} grandfathered", + "fromLicense": "from license", + "slotsAvailable": "{{count}} user slot(s) available", + "noSlotsAvailable": "No slots available", + "currentUsage": "Currently using {{current}} of {{max}} user licences" + } + }, + "teams": { + "title": "Teams", + "description": "Manage teams and organize workspace members", + "loading": "Loading teams...", + "loadingDetails": "Loading team details...", + "createNewTeam": "Create New Team", + "teamName": "Team Name", + "totalMembers": "Total Members", + "actions": "Actions", + "noTeamsFound": "No teams found", + "noMembers": "No members in this team", + "system": "System", + "addMember": "Add Member", + "viewTeam": "View Team", + "removeMember": "Remove from team", + "cannotRemoveFromSystemTeam": "Cannot remove from system team", + "renameTeamLabel": "Rename Team", + "deleteTeamLabel": "Delete Team", + "cannotDeleteInternal": "Cannot delete the Internal team", + "confirmDelete": "Are you sure you want to delete this team? This team must be empty to delete.", + "confirmRemove": "Remove user from this team?", + "cannotRenameInternal": "Cannot rename the Internal team", + "cannotAddToInternal": "Cannot add members to the Internal team", + "teamNotFound": "Team not found", + "backToTeams": "Back to Teams", + "memberCount": "{{count}} members", + "removeMemberSuccess": "User removed from team", + "removeMemberError": "Failed to remove user from team", + "createTeam": { + "title": "Create New Team", + "teamName": "Team Name", + "teamNamePlaceholder": "Enter team name", + "cancel": "Cancel", + "submit": "Create Team", + "nameRequired": "Team name is required", + "success": "Team created successfully", + "error": "Failed to create team" + }, + "renameTeam": { + "title": "Rename Team", + "renaming": "Renaming:", + "newTeamName": "New Team Name", + "newTeamNamePlaceholder": "Enter new team name", + "cancel": "Cancel", + "submit": "Rename Team", + "nameRequired": "Team name is required", + "success": "Team renamed successfully", + "error": "Failed to rename team" + }, + "deleteTeam": { + "success": "Team deleted successfully", + "error": "Failed to delete team. Make sure the team is empty.", + "teamMustBeEmpty": "Team must be empty before deletion" + }, + "addMemberToTeam": { + "title": "Add Member to Team", + "addingTo": "Adding to", + "selectUser": "Select User", + "selectUserPlaceholder": "Choose a user", + "selectUserRequired": "Please select a user", + "currentlyIn": "currently in", + "willBeMoved": "Note: This user will be moved from their current team to this team.", + "cancel": "Cancel", + "submit": "Add Member", + "userRequired": "Please select a user", + "success": "Member added to team successfully", + "error": "Failed to add member to team" + }, + "changeTeam": { + "label": "Change Team", + "title": "Change Team", + "changing": "Moving", + "selectTeam": "Select Team", + "selectTeamPlaceholder": "Choose a team", + "selectTeamRequired": "Please select a team", + "success": "Team changed successfully", + "error": "Failed to change team", + "submit": "Change Team" + } + } + }, + "plan": { + "currency": "Currency", + "popular": "Popular", + "current": "Current Plan", + "upgrade": "Upgrade", + "contact": "Contact Us", + "customPricing": "Custom", + "showComparison": "Compare All Features", + "hideComparison": "Hide Feature Comparison", + "featureComparison": "Feature Comparison", + "activePlan": { + "title": "Active Plan", + "subtitle": "Your current subscription details" + }, + "availablePlans": { + "title": "Available Plans", + "subtitle": "Choose the plan that fits your needs" + }, + "static": { + "title": "Billing Information", + "message": "Online billing is not currently configured. To upgrade your plan or manage subscriptions, please contact us directly.", + "contactSales": "Contact Sales", + "contactToUpgrade": "Contact us to upgrade or customize your plan", + "maxUsers": "Max Users", + "upTo": "Up to" + }, + "period": { + "month": "month" + }, + "free": { + "name": "Free", + "highlight1": "Limited Tool Usage Per week", + "highlight2": "Access to all tools", + "highlight3": "Community support" + }, + "pro": { + "name": "Pro", + "highlight1": "Unlimited Tool Usage", + "highlight2": "Advanced PDF tools", + "highlight3": "No watermarks" + }, + "enterprise": { + "name": "Enterprise", + "highlight1": "Custom pricing", + "highlight2": "Dedicated support", + "highlight3": "Latest features" + }, + "feature": { + "title": "Feature", + "pdfTools": "Basic PDF Tools", + "fileSize": "File Size Limit", + "automation": "Automate tool workflows", + "api": "API Access", + "priority": "Priority Support", + "customPricing": "Custom Pricing" + } + }, + "subscription": { + "status": { + "active": "Active", + "pastDue": "Past Due", + "canceled": "Canceled", + "incomplete": "Incomplete", + "trialing": "Trial", + "none": "No Subscription" + }, + "renewsOn": "Renews on {{date}}", + "cancelsOn": "Cancels on {{date}}" + }, + "billing": { + "manageBilling": "Manage Billing", + "portal": { + "error": "Failed to open billing portal" + } + }, + "payment": { + "preparing": "Preparing your checkout...", + "upgradeTitle": "Upgrade to {{planName}}", + "success": "Payment Successful!", + "successMessage": "Your subscription has been activated successfully. You will receive a confirmation email shortly.", + "autoClose": "This window will close automatically...", + "error": "Payment Error" + }, + "firstLogin": { + "title": "First Time Login", + "welcomeTitle": "Welcome!", + "welcomeMessage": "For security reasons, you must change your password on your first login.", + "loggedInAs": "Logged in as", + "error": "Error", + "currentPassword": "Current Password", + "enterCurrentPassword": "Enter your current password", + "newPassword": "New Password", + "enterNewPassword": "Enter new password (min 8 characters)", + "confirmPassword": "Confirm New Password", + "reEnterNewPassword": "Re-enter new password", + "changePassword": "Change Password", + "allFieldsRequired": "All fields are required", + "passwordsDoNotMatch": "New passwords do not match", + "passwordTooShort": "Password must be at least 8 characters", + "passwordMustBeDifferent": "New password must be different from current password", + "passwordChangedSuccess": "Password changed successfully! Please log in again.", + "passwordChangeFailed": "Failed to change password. Please check your current password." + }, + "invite": { + "welcome": "Welcome to Stirling PDF", + "invalidToken": "Invalid invitation link", + "validationError": "Failed to validate invitation link", + "passwordRequired": "Password is required", + "passwordTooShort": "Password must be at least 6 characters", + "passwordMismatch": "Passwords do not match", + "acceptError": "Failed to create account", + "validating": "Validating invitation...", + "invalidInvitation": "Invalid Invitation", + "goToLogin": "Go to Login", + "welcomeTitle": "You've been invited!", + "welcomeSubtitle": "Complete your account setup to get started", + "accountFor": "Creating account for", + "linkExpires": "Link expires", + "email": "Email address", + "emailPlaceholder": "Enter your email address", + "emailRequired": "Email address is required", + "invalidEmail": "Invalid email address", + "choosePassword": "Choose a password", + "passwordPlaceholder": "Enter your password", + "confirmPassword": "Confirm password", + "confirmPasswordPlaceholder": "Re-enter your password", + "createAccount": "Create Account", + "creating": "Creating Account...", + "alreadyHaveAccount": "Already have an account?", + "signIn": "Sign in" + }, + "audit": { + "error": { + "title": "Error loading audit system" + }, + "notAvailable": "Audit system not available", + "notAvailableMessage": "The audit system is not configured or not available.", + "disabled": "Audit logging is disabled", + "disabledMessage": "Enable audit logging in your application configuration to track system events.", + "systemStatus": { + "title": "System Status", + "status": "Audit Logging", + "enabled": "Enabled", + "disabled": "Disabled", + "level": "Audit Level", + "retention": "Retention Period", + "days": "days", + "totalEvents": "Total Events" + }, + "tabs": { + "dashboard": "Dashboard", + "events": "Audit Events", + "export": "Export" + }, + "charts": { + "title": "Audit Dashboard", + "error": "Error loading charts", + "day": "Day", + "week": "Week", + "month": "Month", + "byType": "Events by Type", + "byUser": "Events by User", + "overTime": "Events Over Time" + }, + "events": { + "title": "Audit Events", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "error": "Error loading events", + "noEvents": "No events found", + "timestamp": "Timestamp", + "type": "Type", + "user": "User", + "ipAddress": "IP Address", + "actions": "Actions", + "viewDetails": "View Details", + "eventDetails": "Event Details", + "details": "Details" + }, + "export": { + "title": "Export Audit Data", + "description": "Export audit events to CSV or JSON format. Use filters to limit the exported data.", + "format": "Export Format", + "filters": "Filters (Optional)", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "exportButton": "Export Data", + "error": "Failed to export data" + } + }, + "usage": { + "noData": "No data available", + "error": "Error loading usage statistics", + "noDataMessage": "No usage statistics are currently available.", + "controls": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All", + "refresh": "Refresh", + "dataTypeLabel": "Data Type:", + "dataType": { + "all": "All", + "api": "API", + "ui": "UI" + } + }, + "showing": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All" + }, + "stats": { + "totalEndpoints": "Total Endpoints", + "totalVisits": "Total Visits", + "showing": "Showing", + "selectedVisits": "Selected Visits" + }, + "chart": { + "title": "Endpoint Usage Chart" + }, + "table": { + "title": "Detailed Statistics", + "endpoint": "Endpoint", + "visits": "Visits", + "percentage": "Percentage", + "noData": "No data available" + } + }, + "backendHealth": { + "checking": "Checking backend status...", + "online": "Backend Online", + "offline": "Backend Offline" + }, + "autoRedact": { + "tags": "ØŗØ§Ų†ØŗŲˆØąØŒ Ų…ØŽŲÛŒ ÚŠØąØ¯Ų†ØŒ ØŗÛŒØ§Ų‡ ÚŠØąØ¯Ų†ØŒ ŲžŲ†Ų‡Ø§Ų†", + "title": "ØŗØ§Ų†ØŗŲˆØą ØŽŲˆØ¯ÚŠØ§Øą", + "header": "ØŗØ§Ų†ØŗŲˆØą ØŽŲˆØ¯ÚŠØ§Øą", + "colorLabel": "ØąŲ†Ú¯", + "textsToRedactLabel": "Ų…ØĒŲ† Ø¨ØąØ§ÛŒ ØŗØ§Ų†ØŗŲˆØą (Ų‡Øą ØŽØˇ ØŦØ¯Ø§Ú¯Ø§Ų†Ų‡)", + "textsToRedactPlaceholder": "Ų…ØĢØ§Ų„: \\nŲ…Ø­ØąŲ…Ø§Ų†Ų‡ \\nŲŲˆŲ‚â€ŒØŗØąÛŒ", + "useRegexLabel": "Ø§ØŗØĒŲØ§Ø¯Ų‡ Ø§Ø˛ Regex", + "wholeWordSearchLabel": "ØŦØŗØĒØŦŲˆÛŒ ÚŠŲ„Ų…Ų‡ ÚŠØ§Ų…Ų„", + "customPaddingLabel": "Ø§ŲØ˛ŲˆØ¯Ų† ŲØ§ØĩŲ„Ų‡ اØļØ§ŲÛŒ", + "convertPDFToImageLabel": "ØĒØ¨Ø¯ÛŒŲ„ PDF Ø¨Ų‡ PDF-ØĒØĩŲˆÛŒØą (Ø¨ØąØ§ÛŒ Ø­Ø°Ų Ų…ØĒŲ† ŲžØ´ØĒ ØŦØšØ¨Ų‡ Ø§ØŗØĒŲØ§Ø¯Ų‡ Ų…ÛŒâ€ŒØ´ŲˆØ¯)", + "submitButton": "Ø§ØąØŗØ§Ų„" + }, + "replaceColorPdf": { + "tags": "ØŦØ§ÛŒÚ¯Ø˛ÛŒŲ†ÛŒ ØąŲ†Ú¯ØŒ ØšŲ…Ų„ÛŒØ§ØĒ ØĩŲØ­Ų‡ØŒ ØŗØąŲˆØą" } -} \ No newline at end of file +} diff --git a/frontend/public/locales/fr-FR/translation.json b/frontend/public/locales/fr-FR/translation.json index b4d390197..04e53d4b4 100644 --- a/frontend/public/locales/fr-FR/translation.json +++ b/frontend/public/locales/fr-FR/translation.json @@ -1,5 +1,35 @@ { + "toolPanel": { + "modePrompt": { + "title": "Choose how you browse tools", + "description": "Preview both layouts and decide how you want to explore Stirling PDF tools.", + "sidebarTitle": "Sidebar mode", + "sidebarDescription": "Keep tools alongside your workspace for quick switching.", + "recommended": "Recommended", + "chooseSidebar": "Use sidebar mode", + "fullscreenTitle": "Fullscreen mode - (legacy)", + "fullscreenDescription": "Browse every tool in a catalogue that covers the workspace until you pick one.", + "chooseFullscreen": "Use fullscreen mode", + "dismiss": "Maybe later" + }, + "fullscreen": { + "showDetails": "Show Details", + "comingSoon": "Coming soon:", + "favorite": "Add to favourites", + "favorites": "Favourites", + "heading": "All tools (fullscreen view)", + "noResults": "Try adjusting your search or toggle descriptions to find what you need.", + "recommended": "Recommended", + "unfavorite": "Remove from favourites" + }, + "placeholder": "Choose a tool to get started", + "toggle": { + "fullscreen": "Switch to fullscreen mode", + "sidebar": "Switch to sidebar mode" + } + }, "unsavedChanges": "Vous avez des modifications non enregistrÊes sur votre PDF. Que souhaitez-vous faire ?", + "areYouSure": "Are you sure you want to leave?", "unsavedChangesTitle": "Modifications non enregistrÊes", "keepWorking": "Continuer à travailler", "discardChanges": "Ignorer les modifications", @@ -24,8 +54,26 @@ "customTextDesc": "Texte personnalisÊ", "numberPagesDesc": "Quelles pages numÊroter, par dÊfaut 'all' (toutes les pages), accepte Êgalement 1-5 ou 2,5,9, etc.", "customNumberDesc": "La valeur par dÊfaut est '{n}', accepte Êgalement 'Page {n} sur {total}', 'Texte-{n}', '{filename}-{n}'", - "submit": "Ajouter les numÊros de page" + "submit": "Ajouter les numÊros de page", + "configuration": "Configuration", + "customize": "Customize Appearance", + "pagesAndStarting": "Pages & Starting Number", + "positionAndPages": "Position & Pages", + "error": { + "failed": "Add page numbers operation failed" + }, + "results": { + "title": "Page Number Results" + }, + "preview": "Position Selection", + "previewDisclaimer": "Preview is approximate. Final output may vary due to PDF font metrics." }, + "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) :", + "startingNumberTooltip": "The first number to display. Subsequent pages will increment from this number.", + "marginTooltip": "Distance between the page number and the edge of the page.", + "fontSizeTooltip": "Size of the page number text in points. Larger numbers create bigger text.", + "fontTypeTooltip": "Font family for the page numbers. Choose based on your document style.", + "customTextTooltip": "Optional custom format for page numbers. Use {n} as placeholder for the number. Example: \"Page {n}\" will show \"Page 1\", \"Page 2\", etc.", "pdfPrompt": "SÊlectionnez le(s) PDF", "multiPdfPrompt": "SÊlectionnez les PDF", "multiPdfDropPrompt": "SÊlectionnez (ou glissez-dÊposez) tous les PDF dont vous avez besoin", @@ -36,7 +84,6 @@ "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) :", "goToPage": "Aller", "true": "Vrai", "false": "Faux", @@ -47,11 +94,18 @@ "save": "Enregistrer", "saveToBrowser": "Enregistrer dans le navigateur", "download": "TÊlÊcharger", + "pin": "Pin File (keep active after tool run)", + "unpin": "Unpin File (replace after tool run)", "undoOperationTooltip": "Cliquez pour annuler la dernière opÊration et restaurer les fichiers d’origine", "undo": "DÊfaire", "moreOptions": "Plus d’options", "editYourNewFiles": "Modifier votre/vos nouveau(x) fichier(s)", "close": "Fermer", + "openInViewer": "Open in Viewer", + "confirmClose": "Confirm Close", + "confirmCloseMessage": "Are you sure you want to close this file?", + "confirmCloseCancel": "Cancel", + "confirmCloseConfirm": "Close File", "fileSelected": "SÊlectionnÊ : {{filename}}", "chooseFile": "Choisir un fichier", "filesSelected": "fichiers sÊlectionnÊs", @@ -61,7 +115,9 @@ "uploadFiles": "TÊlÊverser des fichiers", "addFiles": "Ajouter des fichiers", "selectFromWorkbench": "SÊlectionnez des fichiers depuis l’espace de travail ou ", - "selectMultipleFromWorkbench": "SÊlectionnez au moins {{count}} fichiers depuis l’espace de travail ou " + "selectMultipleFromWorkbench": "SÊlectionnez au moins {{count}} fichiers depuis l’espace de travail ou ", + "created": "Created", + "size": "File Size" }, "noFavourites": "Aucun favori ajoutÊ", "downloadComplete": "TÊlÊchargement terminÊ", @@ -194,6 +250,7 @@ "title": "Souhaitez-vous amÊliorer Stirling PDF ?", "paragraph1": "Stirling PDF utilise des analyses volontaires pour nous aider à amÊliorer le produit. Nous ne suivons aucune information personnelle ni le contenu des fichiers.", "paragraph2": "Veuillez envisager d'activer les analyses pour aider Stirling-PDF à se dÊvelopper et pour nous permettre de mieux comprendre nos utilisateurs.", + "learnMore": "Learn more", "enable": "Activer les analyses", "disable": "DÊsactiver les analyses", "settings": "Vous pouvez modifier les paramètres des analyses dans le fichier config/settings.yml" @@ -237,6 +294,54 @@ "cacheInputs": { "name": "Sauvegarder les entrÊes du formulaire", "help": "Permet de stocker les entrÊes prÊcÊdemment utilisÊes pour les exÊcutions futures" + }, + "general": { + "title": "General", + "description": "Configure general application preferences.", + "account": "Account", + "accountDescription": "Manage your account settings", + "user": "User", + "signedInAs": "Signed in as", + "logout": "Log out", + "enableFeatures": { + "title": "For System Administrators", + "intro": "Enable user authentication, team management, and workspace features for your organization.", + "action": "Configure", + "and": "and", + "benefit": "Enables user roles, team collaboration, admin controls, and enterprise features.", + "learnMore": "Learn more in documentation", + "dismiss": "Dismiss" + }, + "autoUnzip": "Auto-unzip API responses", + "autoUnzipDescription": "Automatically extract files from ZIP responses", + "autoUnzipTooltip": "Automatically extract ZIP files returned from API operations. Disable to keep ZIP files intact. This does not affect automation workflows.", + "autoUnzipFileLimit": "Auto-unzip file limit", + "autoUnzipFileLimitDescription": "Maximum number of files to extract from ZIP", + "autoUnzipFileLimitTooltip": "Only unzip if the ZIP contains this many files or fewer. Set higher to extract larger ZIPs.", + "defaultToolPickerMode": "Default tool picker mode", + "defaultToolPickerModeDescription": "Choose whether the tool picker opens in fullscreen or sidebar by default", + "mode": { + "fullscreen": "Fullscreen", + "sidebar": "Sidebar" + } + }, + "hotkeys": { + "title": "Keyboard Shortcuts", + "description": "Hover a tool to see its shortcut or customise it below. Click \"Change shortcut\" and press a new key combination. Press Esc to cancel.", + "errorModifier": { + "mac": "Include ⌘ (Command), âŒĨ (Option), or another modifier in your shortcut.", + "windows": "Include Ctrl, Alt, or another modifier in your shortcut." + }, + "errorConflict": "Shortcut already used by {{tool}}.", + "none": "Not assigned", + "customBadge": "Custom", + "defaultLabel": "Default: {{shortcut}}", + "capturing": "Press keysâ€Ļ (Esc to cancel)", + "change": "Change shortcut", + "reset": "Reset", + "shortcut": "Shortcut", + "noShortcut": "No shortcut set", + "searchPlaceholder": "Search tools..." } }, "changeCreds": { @@ -308,8 +413,10 @@ "top20": "Top 20", "all": "Tout", "refresh": "RafraÃŽchir", - "includeHomepage": "Inclure la page d'accueil ('/')", - "includeLoginPage": "Inclure la page de connexion ('/login')", + "dataTypeLabel": "Data Type:", + "dataTypeAll": "All", + "dataTypeApi": "API", + "dataTypeUi": "UI", "totalEndpoints": "Nombre total de points de terminaison", "totalVisits": "Nombre total de visites", "showing": "Affichage", @@ -324,7 +431,9 @@ "top": "Top", "numberOfVisits": "Nombre de visites", "visitsTooltip": "Visites : {0} ({1}% du total)", - "retry": "RÊessayer" + "retry": "RÊessayer", + "includeHomepage": "Inclure la page d'accueil ('/')", + "includeLoginPage": "Inclure la page de connexion ('/login')" }, "database": { "title": "Import/Export de la Base de DonnÊes", @@ -365,6 +474,16 @@ "alphabetical": "AlphabÊtique", "globalPopularity": "PopularitÊ globale", "sortBy": "Trier par :", + "mobile": { + "brandAlt": "Stirling PDF logo", + "openFiles": "Open files", + "swipeHint": "Swipe left or right to switch views", + "tools": "Tools", + "toolsSlide": "Tool selection panel", + "viewSwitcher": "Switch workspace view", + "workbenchSlide": "Workspace panel", + "workspace": "Workspace" + }, "multiTool": { "tags": "multiple,outils", "title": "Outil multifonction PDF", @@ -550,11 +669,6 @@ "title": "Caviardage manuel", "desc": "Caviarder un PDF en fonction de texte sÊlectionnÊ, formes dessinÊes et/ou des pages sÊlectionnÊes." }, - "overlayPdfs": { - "tags": "superposer,combiner,empiler", - "title": "Superposer des PDF", - "desc": "Superpose des PDF au-dessus d’un autre PDF" - }, "splitBySections": { "tags": "diviser,sections,scinder", "title": "Diviser le PDF par sections", @@ -659,6 +773,15 @@ "tags": "workflow,sÊquence,automatisation", "title": "Automatiser", "desc": "CrÊez des workflows multi-Êtapes en enchaÃŽnant des actions PDF. IdÊal pour les tÃĸches rÊcurrentes." + }, + "overlay-pdfs": { + "desc": "Overlay one PDF on top of another", + "title": "Overlay PDFs" + }, + "overlayPdfs": { + "tags": "superposer,combiner,empiler", + "title": "Superposer des PDF", + "desc": "Superpose des PDF au-dessus d’un autre PDF" } }, "landing": { @@ -698,13 +821,19 @@ "merge": { "tags": "fusionner,opÊrations sur les pages,backend,server side,merge", "title": "Fusionner", - "removeDigitalSignature.tooltip": { - "title": "Supprimer la signature numÊrique", - "description": "Les signatures numÊriques seront invalidÊes lors de la fusion. Cochez ceci pour les supprimer du PDF final." + "removeDigitalSignature": { + "label": "Remove digital signature in the merged file?", + "tooltip": { + "title": "Supprimer la signature numÊrique", + "description": "Les signatures numÊriques seront invalidÊes lors de la fusion. Cochez ceci pour les supprimer du PDF final." + } }, - "generateTableOfContents.tooltip": { - "title": "GÊnÊrer une table des matières", - "description": "CrÊe automatiquement une table des matières cliquable dans le PDF fusionnÊ à partir des noms de fichiers d’origine et des numÊros de page." + "generateTableOfContents": { + "label": "Generate table of contents in the merged file?", + "tooltip": { + "title": "GÊnÊrer une table des matières", + "description": "CrÊe automatiquement une table des matières cliquable dans le PDF fusionnÊ à partir des noms de fichiers d’origine et des numÊros de page." + } }, "submit": "Fusionner", "sortBy": { @@ -842,12 +971,50 @@ "bullet1": "Niveau de signet : niveau sur lequel fractionner (1 = niveau supÊrieur)", "bullet2": "Inclure les mÊtadonnÊes : prÊserver les propriÊtÊs du document", "bullet3": "Autoriser les doublons : gÊrer les noms de signets rÊpÊtÊs" + }, + "byDocCount": { + "bullet1": "Enter the number of output files you want", + "bullet2": "Pages are distributed as evenly as possible", + "bullet3": "Useful when you need a specific number of files", + "text": "Create a specific number of output files by evenly distributing pages across them.", + "title": "Split by Document Count" + }, + "byPageCount": { + "bullet1": "Enter the number of pages per output file", + "bullet2": "Last file may have fewer pages if not evenly divisible", + "bullet3": "Useful for batch processing workflows", + "text": "Create multiple PDFs with a specific number of pages each. Perfect for creating uniform document chunks.", + "title": "Split by Page Count" + }, + "byPageDivider": { + "bullet1": "Print divider sheets from the download link", + "bullet2": "Insert divider sheets between your documents", + "bullet3": "Scan all documents together as one PDF", + "bullet4": "Upload - divider pages are automatically detected and removed", + "bullet5": "Enable Duplex Mode if scanning both sides of divider sheets", + "text": "Automatically split scanned documents using physical divider sheets with QR codes. Perfect for processing multiple documents scanned together.", + "title": "Split by Page Divider" } - } + }, + "methodSelection": { + "tooltip": { + "bullet1": "Click on a method card to select it", + "bullet2": "Hover over each card to see a quick description", + "bullet3": "The settings step will appear after you select a method", + "bullet4": "You can change methods at any time before processing", + "header": { + "text": "Choose how you want to split your PDF document. Each method is optimized for different use cases and document types.", + "title": "Split Method Selection" + }, + "title": "Choose Your Split Method" + } + }, + "selectMethod": "Select a split method" }, "rotate": { "title": "Pivoter", "submit": "Pivoter", + "selectRotation": "Select Rotation Angle (Clockwise)", "error": { "failed": "Une erreur est survenue lors de la rotation du PDF." }, @@ -935,7 +1102,8 @@ "imagesExt": "Images (JPG, PNG, etc.)", "markdown": "Markdown", "textRtf": "Texte/RTF", - "grayscale": "Niveaux de gris" + "grayscale": "Niveaux de gris", + "errorConversion": "An error occurred while converting the file." }, "imageToPdf": { "tags": "pdf,conversion,img,jpg,image,photo" @@ -973,7 +1141,20 @@ "8": "Supprimer le dernier", "9": "Supprimer le premier et le dernier", "10": "MÊger Impair-Pair", - "11": "Dupliquer toutes les pages" + "11": "Dupliquer toutes les pages", + "desc": { + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, â€Ļ).", + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, â€Ļ).", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimized for binding on the side)." + } }, "desc": { "CUSTOM": "Utiliser une sÊquence personnalisÊe de numÊros de page ou d’expressions pour dÊfinir un nouvel ordre.", @@ -1039,7 +1220,9 @@ "opacity": "OpacitÊ (%)", "spacing": { "horizontal": "Espacement horizontal", - "vertical": "Espacement vertical" + "vertical": "Espacement vertical", + "height": "Height Spacing", + "width": "Width Spacing" }, "convertToImage": "Aplatir les pages PDF en images" }, @@ -1182,6 +1365,10 @@ "bullet4": "IdÊal pour le contenu sensible ou protÊgÊ par droit d’auteur" } } + }, + "type": { + "1": "Text", + "2": "Image" } }, "permissions": { @@ -1255,6 +1442,26 @@ }, "submit": "Supprimer" }, + "extractPages": { + "title": "Extract Pages", + "pageNumbers": { + "label": "Pages to Extract", + "placeholder": "e.g., 1,3,5-8 or odd & 1-10" + }, + "settings": { + "title": "Settings" + }, + "tooltip": { + "description": "Extracts the selected pages into a new PDF, preserving order." + }, + "error": { + "failed": "Failed to extract pages" + }, + "results": { + "title": "Pages Extracted" + }, + "submit": "Extract Pages" + }, "pageSelection": { "tooltip": { "header": { @@ -1295,10 +1502,43 @@ }, "examples": { "title": "Exemples" + }, + "complex": { + "bullet1": "1,3-5,8,2n → pages 1, 3–5, 8, plus evens", + "bullet2": "10-,2n-1 → from page 10 to end + odd pages", + "description": "Mix different types.", + "title": "Complex Combinations" + }, + "description": "Choose which pages to use for the operation. Supports single pages, ranges, formulas, and the all keyword.", + "individual": { + "bullet1": "1,3,5 → selects pages 1, 3, 5", + "bullet2": "2,7,12 → selects pages 2, 7, 12", + "description": "Enter numbers separated by commas.", + "title": "Individual Pages" + }, + "mathematical": { + "bullet1": "2n → all even pages (2, 4, 6â€Ļ)", + "bullet2": "2n-1 → all odd pages (1, 3, 5â€Ļ)", + "bullet3": "3n → every 3rd page (3, 6, 9â€Ļ)", + "bullet4": "4n-1 → pages 3, 7, 11, 15â€Ļ", + "description": "Use n in formulas for patterns.", + "title": "Mathematical Functions" + }, + "ranges": { + "bullet1": "3-6 → selects pages 3–6", + "bullet2": "10-15 → selects pages 10–15", + "bullet3": "5- → selects pages 5 to end", + "description": "Use - for consecutive pages.", + "title": "Page Ranges" + }, + "special": { + "bullet1": "all → selects all pages", + "title": "Special Keywords" } } }, "bulkSelection": { + "syntaxError": "There is a syntax issue. See Page Selection tips for help.", "header": { "title": "Guide de sÊlection des pages" }, @@ -1604,6 +1844,9 @@ "text": "Post-traite le PDF final en supprimant les artefacts d’OCR et en optimisant le calque de texte pour une meilleure lisibilitÊ et une taille de fichier plus petite." } } + }, + "error": { + "failed": "OCR operation failed" } }, "extractImages": { @@ -1766,8 +2009,16 @@ "hint": "TÊlÊversez une image PNG ou JPG de votre signature" }, "instructions": { - "title": "Comment ajouter une signature" + "title": "Comment ajouter une signature", + "canvas": "After drawing your signature in the canvas, close the modal then click anywhere on the PDF to place it.", + "image": "After uploading your signature image above, click anywhere on the PDF to place it.", + "text": "After entering your name above, click anywhere on the PDF to place your signature." }, + "mode": { + "move": "Move Signature", + "place": "Place Signature" + }, + "updateAndPlace": "Update and Place", "activate": "Activer le placement de signature", "deactivate": "ArrÃĒter le placement de signatures", "results": { @@ -1792,7 +2043,10 @@ "options": { "stepTitle": "Options d’aplatissement", "title": "Options d’aplatissement", - "flattenOnlyForms.desc": "Aplatir uniquement les champs de formulaire, en laissant les autres ÊlÊments interactifs intacts", + "flattenOnlyForms": { + "label": "Flatten only forms", + "desc": "Aplatir uniquement les champs de formulaire, en laissant les autres ÊlÊments interactifs intacts" + }, "note": "L’aplatissement supprime les ÊlÊments interactifs du PDF, les rendant non modifiables." }, "results": { @@ -1882,7 +2136,13 @@ "bullet3": "Peut ÃĒtre dÊsactivÊ pour rÊduire la taille du fichier de sortie" } }, - "submit": "Supprimer les pages vierges" + "submit": "Supprimer les pages vierges", + "error": { + "failed": "Failed to remove blank pages" + }, + "results": { + "title": "Removed Blank Pages" + } }, "removeAnnotations": { "tags": "commentaires,supprimer,annotations,highlight,notes,markup,remove", @@ -1984,7 +2244,12 @@ "bullet3": "Choisissez la page oÚ placer la signature", "bullet4": "Logo facultatif" } - } + }, + "invisible": "Invisible", + "options": { + "title": "Signature Details" + }, + "visible": "Visible" }, "sign": { "submit": "Signer le PDF", @@ -2045,7 +2310,22 @@ "text": "Convertissez votre fichier en keystore Java (.jks) avec keytool, puis choisissez JKS." } } - } + }, + "chooseCertificate": "Choose Certificate File", + "chooseJksFile": "Choose JKS File", + "chooseP12File": "Choose PKCS12 File", + "choosePfxFile": "Choose PFX File", + "choosePrivateKey": "Choose Private Key File", + "location": "Location", + "logoTitle": "Logo", + "name": "Name", + "noLogo": "No Logo", + "pageNumber": "Page Number", + "password": "Certificate Password", + "passwordOptional": "Leave empty if no password", + "reason": "Reason", + "serverCertMessage": "Using server certificate - no files or password required", + "showLogo": "Show Logo" }, "removeCertSign": { "tags": "signer,chiffrer,certificat,authenticate,PEM,P12,official,decrypt", @@ -2071,7 +2351,17 @@ "header": "Fusionner des pages", "pagesPerSheet": "Pages par feuille", "addBorder": "Ajouter des bordures", - "submit": "Fusionner" + "submit": "Fusionner", + "desc": { + "2": "Place 2 pages side-by-side on a single sheet.", + "3": "Place 3 pages on a single sheet in a single row.", + "4": "Place 4 pages on a single sheet (2 × 2 grid).", + "9": "Place 9 pages on a single sheet (3 × 3 grid).", + "16": "Place 16 pages on a single sheet (4 × 4 grid)." + }, + "error": { + "failed": "An error occurred while creating the multi-page layout." + } }, "bookletImposition": { "tags": "livret,imposition,impression,reliure,pliage,signature", @@ -2257,10 +2547,22 @@ "reset": "RÊinitialiser au PDF complet", "coordinates": { "title": "Position et taille", - "x": "Position X", - "y": "Position Y", - "width": "Largeur", - "height": "Hauteur" + "x": { + "label": "X Position", + "desc": "Left edge (points)" + }, + "y": { + "label": "Y Position", + "desc": "Bottom edge (points)" + }, + "width": { + "label": "Width", + "desc": "Crop width (points)" + }, + "height": { + "label": "Height", + "desc": "Crop height (points)" + } }, "error": { "invalidArea": "La zone de recadrage dÊpasse les limites du PDF", @@ -2278,6 +2580,10 @@ }, "results": { "title": "RÊsultats du recadrage" + }, + "automation": { + "info": "Enter crop coordinates in PDF points. Origin (0,0) is at bottom-left. These values will be applied to all PDFs processed in this automation.", + "reference": "Reference: A4 page is 595.28 × 841.89 points (210mm × 297mm). 1 inch = 72 points." } }, "autoSplitPDF": { @@ -2488,11 +2794,15 @@ "overlay-pdfs": { "tags": "Overlay,incrustation", "header": "Incrustation de PDF", + "title": "Overlay PDFs", + "desc": "Overlay one PDF on top of another", "baseFile": { "label": "SÊlectionner le fichier PDF de base" }, "overlayFiles": { - "label": "SÊlectionner les fichiers PDF à superposer" + "label": "SÊlectionner les fichiers PDF à superposer", + "placeholder": "Choose PDF(s)...", + "addMore": "Add more PDFs..." }, "mode": { "label": "SÊlectionner le mode d'incrustation", @@ -2502,14 +2812,53 @@ }, "counts": { "label": "Nombre de superpositions (pour le mode de rÊpÊtition fixe)", - "placeholder": "Compteurs (sÊparÊs par des virgules, exemple : 2,3,1)" + "placeholder": "Compteurs (sÊparÊs par des virgules, exemple : 2,3,1)", + "item": "Count for file", + "noFiles": "Add overlay files to configure counts" }, "position": { "label": "DÊfinir la position de l'incrustation", "foreground": "Premier plan", "background": "Arrière-plan" }, - "submit": "Soumettre" + "submit": "Soumettre", + "settings": { + "title": "Settings" + }, + "results": { + "title": "Overlay Results" + }, + "tooltip": { + "header": { + "title": "Overlay PDFs Overview" + }, + "description": { + "title": "Description", + "text": "Combine a base PDF with one or more overlay PDFs. Overlays can be applied page-by-page in different modes and placed in the foreground or background." + }, + "mode": { + "title": "Overlay Mode", + "text": "Choose how to distribute overlay pages across the base PDF pages.", + "sequential": "Sequential Overlay: Use pages from the first overlay PDF until it ends, then move to the next.", + "interleaved": "Interleaved Overlay: Take one page from each overlay in turn.", + "fixedRepeat": "Fixed Repeat Overlay: Take a set number of pages from each overlay before moving to the next. Use Counts to set the numbers." + }, + "position": { + "title": "Overlay Position", + "text": "Foreground places the overlay on top of the page. Background places it behind." + }, + "overlayFiles": { + "title": "Overlay Files", + "text": "Select one or more PDFs to overlay on the base. The order of these files affects how pages are applied in Sequential and Fixed Repeat modes." + }, + "counts": { + "title": "Counts (Fixed Repeat only)", + "text": "Provide a positive number for each overlay file showing how many pages to take before moving to the next. Required when mode is Fixed Repeat." + } + }, + "error": { + "failed": "An error occurred while overlaying PDFs." + } }, "split-by-sections": { "tags": "Sections,Diviser,Section Split, Divide, Customize", @@ -2544,7 +2893,18 @@ "customMargin": "Marge personnalisÊe", "customColor": "Couleur de texte personnalisÊe", "submit": "Soumettre", - "noStampSelected": "Aucun tampon sÊlectionnÊ. Retour à l’Êtape 1." + "noStampSelected": "Aucun tampon sÊlectionnÊ. Retour à l’Êtape 1.", + "customPosition": "Drag the stamp to the desired location in the preview window.", + "error": { + "failed": "An error occurred while adding stamp to the PDF." + }, + "imageSize": "Image Size", + "margin": "Margin", + "positionAndFormatting": "Position & Formatting", + "quickPosition": "Select a position on the page to place the stamp.", + "results": { + "title": "Stamp Results" + } }, "removeImagePdf": { "tags": "Images,Remove Image,Page operations,Back end,server side" @@ -2562,7 +2922,8 @@ "status": { "_value": "Statut", "valid": "Valide", - "invalid": "Invalide" + "invalid": "Invalide", + "complete": "Validation complete" }, "signer": "Signataire", "date": "Date", @@ -2589,17 +2950,115 @@ "version": "Version", "keyUsage": "Usage de la clÊ", "selfSigned": "Auto-signÊ", - "bits": "bits" + "bits": "bits", + "details": "Certificate Details" }, "signature": { "info": "Informations sur la signature", "_value": "Signature", "mathValid": "La signature est mathÊmatiquement valide MAIS :" }, - "selectCustomCert": "Fichier de certificat personnalisÊ X.509 (Optionnel)" + "selectCustomCert": "Fichier de certificat personnalisÊ X.509 (Optionnel)", + "downloadCsv": "Download CSV", + "downloadJson": "Download JSON", + "downloadPdf": "Download PDF Report", + "downloadType": { + "csv": "CSV", + "json": "JSON", + "pdf": "PDF" + }, + "error": { + "allFailed": "Unable to validate the selected files.", + "partial": "Some files could not be validated.", + "reportGeneration": "Could not generate the PDF report. JSON and CSV are available.", + "unexpected": "Unexpected error during validation." + }, + "finalizing": "Preparing downloads...", + "issue": { + "certExpired": "Certificate expired", + "certRevocationUnknown": "Certificate revocation status unknown", + "certRevoked": "Certificate revoked", + "chainInvalid": "Certificate chain invalid", + "signatureInvalid": "Signature cryptographic check failed", + "trustInvalid": "Certificate not trusted" + }, + "noResults": "Run the validation to generate a report.", + "noSignaturesShort": "No signatures", + "processing": "Validating signatures...", + "report": { + "continued": "Continued", + "downloads": "Downloads", + "entryLabel": "Signature Summary", + "fields": { + "created": "Created", + "fileSize": "File Size", + "signatureCount": "Total Signatures", + "signatureDate": "Signature Date" + }, + "filesEvaluated": "{{count}} files evaluated", + "footer": "Validated via Stirling PDF", + "generatedAt": "Generated", + "noPdf": "PDF report will be available after a successful validation.", + "page": "Page", + "shortTitle": "Signature Summary", + "signatureCountLabel": "{{count}} signatures", + "signaturesFound": "{{count}} signatures detected", + "signaturesValid": "{{count}} fully valid", + "title": "Signature Validation Report" + }, + "settings": { + "certHint": "Upload a trusted X.509 certificate to validate against a custom trust source.", + "title": "Validation Settings" + }, + "signatureDate": "Signature Date", + "totalSignatures": "Total Signatures" }, "replaceColor": { - "tags": "Remplacer la couleur,OpÊrations de page,Back-end,côtÊ serveur" + "tags": "Remplacer la couleur,OpÊrations de page,Back-end,côtÊ serveur", + "labels": { + "settings": "Settings", + "colourOperation": "Colour operation" + }, + "options": { + "highContrast": "High contrast", + "invertAll": "Invert all colours", + "custom": "Custom", + "cmyk": "Convert to CMYK" + }, + "tooltip": { + "header": { + "title": "Replace & Invert Colour Settings Overview" + }, + "description": { + "title": "Description", + "text": "Transform PDF colours to improve readability and accessibility. Choose from high contrast presets, invert all colours, or create custom colour schemes." + }, + "highContrast": { + "title": "High Contrast", + "text": "Apply predefined high contrast colour combinations designed for better readability and accessibility compliance.", + "bullet1": "White text on black background - Classic dark mode", + "bullet2": "Black text on white background - Standard high contrast", + "bullet3": "Yellow text on black background - High visibility option", + "bullet4": "Green text on black background - Alternative high contrast" + }, + "invertAll": { + "title": "Invert All Colours", + "text": "Completely invert all colours in the PDF, creating a negative-like effect. Useful for creating dark mode versions of documents or reducing eye strain in low-light conditions." + }, + "custom": { + "title": "Custom Colours", + "text": "Define your own text and background colours using the colour pickers. Perfect for creating branded documents or specific accessibility requirements.", + "bullet1": "Text colour - Choose the colour for text elements", + "bullet2": "Background colour - Set the background colour for the document" + }, + "cmyk": { + "title": "Convert to CMYK", + "text": "Convert the PDF from RGB colour space to CMYK colour space, optimized for professional printing. This process converts colours to the Cyan, Magenta, Yellow, Black model used by printers." + } + }, + "error": { + "failed": "An error occurred while processing the colour replacement." + } }, "login": { "title": "Connexion", @@ -2632,6 +3091,11 @@ "enterEmail": "Saisissez votre e-mail", "enterPassword": "Saisissez votre mot de passe", "loggingIn": "Connexionâ€Ļ", + "username": "Username", + "enterUsername": "Enter username", + "useEmailInstead": "Login with email", + "forgotPassword": "Forgot your password?", + "logIn": "Log In", "signingIn": "Connexion en coursâ€Ļ", "login": "Se connecter", "or": "Ou", @@ -2649,7 +3113,10 @@ "magicLinkSent": "Lien magique envoyÊ à {{email}} ! Consultez votre e-mail et cliquez sur le lien pour vous connecter.", "passwordResetSent": "Lien de rÊinitialisation envoyÊ à {{email}} ! Consultez votre e-mail et suivez les instructions.", "failedToSignIn": "Échec de connexion avec {{provider}} : {{message}}", - "unexpectedError": "Erreur inattendue : {{message}}" + "unexpectedError": "Erreur inattendue : {{message}}", + "accountCreatedSuccess": "Account created successfully! You can now sign in.", + "passwordChangedSuccess": "Password changed successfully! Please sign in with your new password.", + "credentialsUpdated": "Your credentials have been updated. Please sign in again." }, "signup": { "title": "CrÊer un compte", @@ -2672,7 +3139,12 @@ "invalidEmail": "Veuillez saisir une adresse e-mail valide", "checkEmailConfirmation": "Consultez votre e-mail pour un lien de confirmation afin de terminer votre inscription.", "accountCreatedSuccessfully": "Compte crÊÊ avec succès ! Vous pouvez maintenant vous connecter.", - "unexpectedError": "Erreur inattendue : {{message}}" + "unexpectedError": "Erreur inattendue : {{message}}", + "useEmailInstead": "Use Email Instead", + "nameRequired": "Name is required", + "emailRequired": "Email is required", + "passwordRequired": "Password is required", + "confirmPasswordRequired": "Please confirm your password" }, "pdfToSinglePage": { "title": "Fusionner les pages", @@ -2712,10 +3184,23 @@ "adjustContrast": { "title": "Ajuster les couleurs", "header": "Ajuster les couleurs", + "basic": "Basic Adjustments", "contrast": "Contraste", "brightness": "LuminositÊ", "saturation": "Saturation", - "download": "TÊlÊcharger" + "download": "TÊlÊcharger", + "adjustColors": "Adjust Colors", + "blue": "Blue", + "confirm": "Confirm", + "error": { + "failed": "Failed to adjust colors/contrast" + }, + "green": "Green", + "noPreview": "Select a PDF to preview", + "red": "Red", + "results": { + "title": "Adjusted PDF" + } }, "compress": { "title": "Compresser un PDF", @@ -2862,7 +3347,13 @@ "title": "Supprimer l'image", "header": "Supprimer l'image", "removeImage": "Supprimer l'image", - "submit": "Supprimer l'image" + "submit": "Supprimer l'image", + "error": { + "failed": "Failed to remove images from the PDF." + }, + "results": { + "title": "Remove Images Results" + } }, "splitByChapters": { "title": "Diviser un PDF par Chapitres", @@ -2937,6 +3428,10 @@ "title": "Analyse", "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." } + }, + "services": { + "posthog": "PostHog Analytics", + "scarf": "Scarf Pixel" } }, "removeMetadata": { @@ -2998,11 +3493,18 @@ "panMode": "Mode panoramique", "rotateLeft": "Pivoter à gauche", "rotateRight": "Pivoter à droite", - "toggleSidebar": "Afficher/masquer la barre latÊrale" + "toggleSidebar": "Afficher/masquer la barre latÊrale", + "exportSelected": "Export Selected Pages", + "toggleAnnotations": "Toggle Annotations Visibility", + "annotationMode": "Toggle Annotation Mode", + "draw": "Draw", + "save": "Save" }, "search": { "title": "Rechercher dans le PDF", - "placeholder": "Saisir un terme de rechercheâ€Ļ" + "placeholder": "Saisir un terme de rechercheâ€Ļ", + "noResults": "No results found", + "searching": "Searching..." }, "guestBanner": { "title": "Vous utilisez Stirling PDF en tant qu’invitÊ !", @@ -3040,9 +3542,597 @@ "automate": "Automatiser", "files": "Fichiers", "activity": "ActivitÊ", + "help": "Help", + "account": "Account", "config": "Configuration", + "adminSettings": "Admin Settings", "allTools": "Tous les outils" }, + "admin": { + "error": "Error", + "success": "Success", + "expand": "Expand", + "close": "Close", + "status": { + "active": "Active", + "inactive": "Inactive" + }, + "settings": { + "title": "Admin Settings", + "workspace": "Workspace", + "fetchError": "Failed to load settings", + "saveError": "Failed to save settings", + "saved": "Settings saved successfully", + "saveSuccess": "Settings saved successfully", + "save": "Save Changes", + "restartRequired": "Restart Required", + "restart": { + "title": "Restart Required", + "message": "Settings have been saved successfully. A server restart is required for the changes to take effect.", + "question": "Would you like to restart the server now or later?", + "now": "Restart Now", + "later": "Restart Later" + }, + "restarting": "Restarting Server", + "restartingMessage": "The server is restarting. Please wait a moment...", + "restartError": "Failed to restart server. Please restart manually.", + "general": { + "title": "System Settings", + "description": "Configure system-wide application settings including branding and default behaviour.", + "ui": "User Interface", + "system": "System", + "appName": { + "label": "Application Name", + "description": "The name displayed in the browser tab and home page" + }, + "appNameNavbar": { + "label": "Navbar Brand", + "description": "The name displayed in the navigation bar" + }, + "homeDescription": { + "label": "Home Description", + "description": "The description text shown on the home page" + }, + "defaultLocale": { + "label": "Default Locale", + "description": "The default language for new users (e.g., en_US, es_ES)" + }, + "fileUploadLimit": { + "label": "File Upload Limit", + "description": "Maximum file upload size (e.g., 100MB, 1GB)" + }, + "showUpdate": { + "label": "Show Update Notifications", + "description": "Display notifications when a new version is available" + }, + "showUpdateOnlyAdmin": { + "label": "Show Updates to Admins Only", + "description": "Restrict update notifications to admin users only" + }, + "customHTMLFiles": { + "label": "Custom HTML Files", + "description": "Allow serving custom HTML files from the customFiles directory" + }, + "languages": { + "label": "Available Languages", + "description": "Languages that users can select from (leave empty to enable all languages)" + }, + "customMetadata": { + "label": "Custom Metadata", + "autoUpdate": { + "label": "Auto Update Metadata", + "description": "Automatically update PDF metadata on all processed documents" + }, + "author": { + "label": "Default Author", + "description": "Default author for PDF metadata (e.g., username)" + }, + "creator": { + "label": "Default Creator", + "description": "Default creator for PDF metadata" + }, + "producer": { + "label": "Default Producer", + "description": "Default producer for PDF metadata" + } + }, + "customPaths": { + "label": "Custom Paths", + "description": "Configure custom file system paths for pipeline processing and external tools", + "pipeline": { + "label": "Pipeline Directories", + "watchedFoldersDir": { + "label": "Watched Folders Directory", + "description": "Directory where pipeline monitors for incoming PDFs (leave empty for default: /pipeline/watchedFolders)" + }, + "finishedFoldersDir": { + "label": "Finished Folders Directory", + "description": "Directory where processed PDFs are outputted (leave empty for default: /pipeline/finishedFolders)" + } + }, + "operations": { + "label": "External Tool Paths", + "weasyprint": { + "label": "WeasyPrint Executable", + "description": "Path to WeasyPrint executable for HTML to PDF conversion (leave empty for default: /opt/venv/bin/weasyprint)" + }, + "unoconvert": { + "label": "Unoconvert Executable", + "description": "Path to LibreOffice unoconvert for document conversions (leave empty for default: /opt/venv/bin/unoconvert)" + } + } + } + }, + "security": { + "title": "Security", + "description": "Configure authentication, login behaviour, and security policies.", + "ssoNotice": { + "title": "Looking for SSO/SAML settings?", + "message": "OAuth2 and SAML2 authentication providers have been moved to the Connections menu for easier management." + }, + "authentication": "Authentication", + "enableLogin": { + "label": "Enable Login", + "description": "Require users to log in before accessing the application" + }, + "loginMethod": { + "label": "Login Method", + "description": "The authentication method to use for user login", + "all": "All Methods", + "normal": "Username/Password Only", + "oauth2": "OAuth2 Only", + "saml2": "SAML2 Only" + }, + "loginAttemptCount": { + "label": "Login Attempt Limit", + "description": "Maximum number of failed login attempts before account lockout" + }, + "loginResetTimeMinutes": { + "label": "Login Reset Time (minutes)", + "description": "Time before failed login attempts are reset" + }, + "csrfDisabled": { + "label": "Disable CSRF Protection", + "description": "Disable Cross-Site Request Forgery protection (not recommended)" + }, + "initialLogin": { + "label": "Initial Login", + "username": { + "label": "Initial Username", + "description": "The username for the initial admin account" + }, + "password": { + "label": "Initial Password", + "description": "The password for the initial admin account" + } + }, + "jwt": { + "label": "JWT Configuration", + "secureCookie": { + "label": "Secure Cookie", + "description": "Require HTTPS for JWT cookies (recommended for production)" + }, + "keyRetentionDays": { + "label": "Key Retention Days", + "description": "Number of days to retain old JWT keys for verification" + }, + "persistence": { + "label": "Enable Key Persistence", + "description": "Store JWT keys persistently to survive server restarts" + }, + "enableKeyRotation": { + "label": "Enable Key Rotation", + "description": "Automatically rotate JWT signing keys periodically" + }, + "enableKeyCleanup": { + "label": "Enable Key Cleanup", + "description": "Automatically remove expired JWT keys" + } + }, + "audit": { + "label": "Audit Logging", + "enabled": { + "label": "Enable Audit Logging", + "description": "Track user actions and system events for compliance and security monitoring" + }, + "level": { + "label": "Audit Level", + "description": "0=OFF, 1=BASIC, 2=STANDARD, 3=VERBOSE" + }, + "retentionDays": { + "label": "Audit Retention (days)", + "description": "Number of days to retain audit logs" + } + }, + "htmlUrlSecurity": { + "label": "HTML URL Security", + "description": "Configure URL access restrictions for HTML processing to prevent SSRF attacks", + "enabled": { + "label": "Enable URL Security", + "description": "Enable URL security restrictions for HTML to PDF conversions" + }, + "level": { + "label": "Security Level", + "description": "MAX: whitelist only, MEDIUM: block internal networks, OFF: no restrictions", + "max": "Maximum (Whitelist Only)", + "medium": "Medium (Block Internal)", + "off": "Off (No Restrictions)" + }, + "advanced": "Advanced Settings", + "allowedDomains": { + "label": "Allowed Domains (Whitelist)", + "description": "One domain per line (e.g., cdn.example.com). Only these domains allowed when level is MAX" + }, + "blockedDomains": { + "label": "Blocked Domains (Blacklist)", + "description": "One domain per line (e.g., malicious.com). Additional domains to block" + }, + "internalTlds": { + "label": "Internal TLDs", + "description": "One TLD per line (e.g., .local, .internal). Block domains with these TLD patterns" + }, + "networkBlocking": "Network Blocking", + "blockPrivateNetworks": { + "label": "Block Private Networks", + "description": "Block RFC 1918 private networks (10.x.x.x, 192.168.x.x, 172.16-31.x.x)" + }, + "blockLocalhost": { + "label": "Block Localhost", + "description": "Block localhost and loopback addresses (127.x.x.x, ::1)" + }, + "blockLinkLocal": { + "label": "Block Link-Local Addresses", + "description": "Block link-local addresses (169.254.x.x, fe80::/10)" + }, + "blockCloudMetadata": { + "label": "Block Cloud Metadata Endpoints", + "description": "Block cloud provider metadata endpoints (169.254.169.254)" + } + } + }, + "connections": { + "title": "Connections", + "description": "Configure external authentication providers like OAuth2 and SAML.", + "linkedServices": "Linked Services", + "unlinkedServices": "Unlinked Services", + "connect": "Connect", + "disconnect": "Disconnect", + "disconnected": "Provider disconnected successfully", + "disconnectError": "Failed to disconnect provider", + "ssoAutoLogin": { + "label": "SSO Auto Login", + "enable": "Enable SSO Auto Login", + "description": "Automatically redirect to SSO login when authentication is required" + }, + "oauth2": { + "label": "OAuth2", + "enabled": { + "label": "Enable OAuth2", + "description": "Allow users to authenticate using OAuth2 providers" + }, + "provider": { + "label": "Provider", + "description": "The OAuth2 provider to use for authentication" + }, + "issuer": { + "label": "Issuer URL", + "description": "The OAuth2 provider issuer URL" + }, + "clientId": { + "label": "Client ID", + "description": "The OAuth2 client ID from your provider" + }, + "clientSecret": { + "label": "Client Secret", + "description": "The OAuth2 client secret from your provider" + }, + "useAsUsername": { + "label": "Use as Username", + "description": "The OAuth2 claim to use as the username (e.g., email, sub)" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first OAuth2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via OAuth2" + }, + "scopes": { + "label": "OAuth2 Scopes", + "description": "Comma-separated list of OAuth2 scopes to request (e.g., openid, profile, email)" + } + }, + "saml2": { + "label": "SAML2", + "enabled": { + "label": "Enable SAML2", + "description": "Allow users to authenticate using SAML2 providers" + }, + "provider": { + "label": "Provider", + "description": "The SAML2 provider name" + }, + "registrationId": { + "label": "Registration ID", + "description": "The SAML2 registration identifier" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first SAML2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via SAML2" + } + } + }, + "database": { + "title": "Database", + "description": "Configure custom database connection settings for enterprise deployments.", + "configuration": "Database Configuration", + "enableCustom": { + "label": "Enable Custom Database", + "description": "Use your own custom database configuration instead of the default embedded database" + }, + "customUrl": { + "label": "Custom Database URL", + "description": "Full JDBC connection string (e.g., jdbc:postgresql://localhost:5432/postgres). If provided, individual connection settings below are not used." + }, + "type": { + "label": "Database Type", + "description": "Type of database (not used if custom URL is provided)" + }, + "hostName": { + "label": "Host Name", + "description": "Database server hostname (not used if custom URL is provided)" + }, + "port": { + "label": "Port", + "description": "Database server port (not used if custom URL is provided)" + }, + "name": { + "label": "Database Name", + "description": "Name of the database (not used if custom URL is provided)" + }, + "username": { + "label": "Username", + "description": "Database authentication username" + }, + "password": { + "label": "Password", + "description": "Database authentication password" + } + }, + "privacy": { + "title": "Privacy", + "description": "Configure privacy and data collection settings.", + "analytics": "Analytics & Tracking", + "enableAnalytics": { + "label": "Enable Analytics", + "description": "Collect anonymous usage analytics to help improve the application" + }, + "metricsEnabled": { + "label": "Enable Metrics", + "description": "Enable collection of performance and usage metrics. Provides API endpoint for admins to access metrics data" + }, + "searchEngine": "Search Engine Visibility", + "googleVisibility": { + "label": "Google Visibility", + "description": "Allow search engines to index this application" + } + }, + "advanced": { + "title": "Advanced", + "description": "Configure advanced features and experimental functionality.", + "features": "Feature Flags", + "processing": "Processing", + "endpoints": { + "label": "Endpoints", + "manage": "Manage API Endpoints", + "description": "Endpoint management is configured via YAML. See documentation for details on enabling/disabling specific endpoints." + }, + "enableAlphaFunctionality": { + "label": "Enable Alpha Features", + "description": "Enable experimental and alpha-stage features (may be unstable)" + }, + "enableUrlToPDF": { + "label": "Enable URL to PDF", + "description": "Allow conversion of web pages to PDF documents" + }, + "maxDPI": { + "label": "Maximum DPI", + "description": "Maximum DPI for image processing (0 = unlimited)" + }, + "tessdataDir": { + "label": "Tessdata Directory", + "description": "Path to the tessdata directory for OCR language files" + }, + "disableSanitize": { + "label": "Disable HTML Sanitization", + "description": "WARNING: Security risk - disabling HTML sanitization can lead to XSS vulnerabilities" + }, + "tempFileManagement": { + "label": "Temp File Management", + "description": "Configure temporary file storage and cleanup behavior", + "baseTmpDir": { + "label": "Base Temp Directory", + "description": "Base directory for temporary files (leave empty for default: java.io.tmpdir/stirling-pdf)" + }, + "libreofficeDir": { + "label": "LibreOffice Temp Directory", + "description": "Directory for LibreOffice temp files (leave empty for default: baseTmpDir/libreoffice)" + }, + "systemTempDir": { + "label": "System Temp Directory", + "description": "System temp directory to clean (only used if cleanupSystemTemp is enabled)" + }, + "prefix": { + "label": "Temp File Prefix", + "description": "Prefix for temp file names" + }, + "maxAgeHours": { + "label": "Max Age (hours)", + "description": "Maximum age in hours before temp files are cleaned up" + }, + "cleanupIntervalMinutes": { + "label": "Cleanup Interval (minutes)", + "description": "How often to run cleanup (in minutes)" + }, + "startupCleanup": { + "label": "Startup Cleanup", + "description": "Clean up old temp files on application startup" + }, + "cleanupSystemTemp": { + "label": "Cleanup System Temp", + "description": "Whether to clean broader system temp directory (use with caution)" + } + }, + "processExecutor": { + "label": "Process Executor Limits", + "description": "Configure session limits and timeouts for each process executor", + "sessionLimit": { + "label": "Session Limit", + "description": "Maximum concurrent instances" + }, + "timeout": { + "label": "Timeout (minutes)", + "description": "Maximum execution time" + }, + "libreOffice": "LibreOffice", + "pdfToHtml": "PDF to HTML", + "qpdf": "QPDF", + "tesseract": "Tesseract OCR", + "pythonOpenCv": "Python OpenCV", + "weasyPrint": "WeasyPrint", + "installApp": "Install App", + "calibre": "Calibre", + "ghostscript": "Ghostscript", + "ocrMyPdf": "OCRmyPDF" + } + }, + "mail": { + "title": "Mail Server", + "description": "Configure SMTP settings for sending email notifications.", + "smtp": "SMTP Configuration", + "enabled": { + "label": "Enable Mail", + "description": "Enable email notifications and SMTP functionality" + }, + "host": { + "label": "SMTP Host", + "description": "The hostname or IP address of your SMTP server" + }, + "port": { + "label": "SMTP Port", + "description": "The port number for SMTP connection (typically 25, 465, or 587)" + }, + "username": { + "label": "SMTP Username", + "description": "Username for SMTP authentication" + }, + "password": { + "label": "SMTP Password", + "description": "Password for SMTP authentication" + }, + "from": { + "label": "From Address", + "description": "The email address to use as the sender" + }, + "enableInvites": { + "label": "Enable Email Invites", + "description": "Allow admins to invite users via email with auto-generated passwords" + }, + "frontendUrl": { + "label": "Frontend URL", + "description": "Base URL for frontend (e.g. https://pdf.example.com). Used for generating invite links in emails. Leave empty to use backend URL." + } + }, + "legal": { + "title": "Legal Documents", + "description": "Configure links to legal documents and policies.", + "disclaimer": { + "title": "Legal Responsibility Warning", + "message": "By customizing these legal documents, you assume full responsibility for ensuring compliance with all applicable laws and regulations, including but not limited to GDPR and other EU data protection requirements. Only modify these settings if: (1) you are operating a personal/private instance, (2) you are outside EU jurisdiction and understand your local legal obligations, or (3) you have obtained proper legal counsel and accept sole responsibility for all user data and legal compliance. Stirling-PDF and its developers assume no liability for your legal obligations." + }, + "termsAndConditions": { + "label": "Terms and Conditions", + "description": "URL or filename to terms and conditions" + }, + "privacyPolicy": { + "label": "Privacy Policy", + "description": "URL or filename to privacy policy" + }, + "accessibilityStatement": { + "label": "Accessibility Statement", + "description": "URL or filename to accessibility statement" + }, + "cookiePolicy": { + "label": "Cookie Policy", + "description": "URL or filename to cookie policy" + }, + "impressum": { + "label": "Impressum", + "description": "URL or filename to impressum (required in some jurisdictions)" + } + }, + "premium": { + "title": "Premium & Enterprise", + "description": "Configure your premium or enterprise license key.", + "license": "License Configuration", + "key": { + "label": "License Key", + "description": "Enter your premium or enterprise license key" + }, + "enabled": { + "label": "Enable Premium Features", + "description": "Enable license key checks for pro/enterprise features" + }, + "movedFeatures": { + "title": "Premium Features Distributed", + "message": "Premium and Enterprise features are now organized in their respective sections:" + } + }, + "features": { + "title": "Features", + "description": "Configure optional features and functionality.", + "serverCertificate": { + "label": "Server Certificate", + "description": "Configure server-side certificate generation for \"Sign with Stirling-PDF\" functionality", + "enabled": { + "label": "Enable Server Certificate", + "description": "Enable server-side certificate for \"Sign with Stirling-PDF\" option" + }, + "organizationName": { + "label": "Organization Name", + "description": "Organization name for generated certificates" + }, + "validity": { + "label": "Certificate Validity (days)", + "description": "Number of days the certificate will be valid" + }, + "regenerateOnStartup": { + "label": "Regenerate on Startup", + "description": "Generate new certificate on each application startup" + } + } + }, + "endpoints": { + "title": "API Endpoints", + "description": "Control which API endpoints and endpoint groups are available.", + "management": "Endpoint Management", + "toRemove": { + "label": "Disabled Endpoints", + "description": "Select individual endpoints to disable" + }, + "groupsToRemove": { + "label": "Disabled Endpoint Groups", + "description": "Select endpoint groups to disable" + }, + "note": "Note: Disabling endpoints restricts API access but does not remove UI components. Restart required for changes to take effect." + } + } + }, "fileUpload": { "selectFile": "SÊlectionner un fichier", "selectFiles": "SÊlectionner des fichiers", @@ -3067,6 +4157,9 @@ "addFiles": "Ajouter des fichiers", "dragFilesInOrClick": "Glissez des fichiers ou cliquez sur ÂĢ Ajouter des fichiers Âģ pour parcourir" }, + "fileEditor": { + "addFiles": "Add Files" + }, "fileManager": { "title": "TÊlÊverser des fichiers PDF", "subtitle": "Ajoutez des fichiers à votre stockage pour un accès facile dans tous les outils", @@ -3095,6 +4188,7 @@ "lastModified": "Dernière modification", "toolChain": "Outils appliquÊs", "restore": "Restaurer", + "unzip": "Unzip", "searchFiles": "Rechercher des fichiersâ€Ļ", "recent": "RÊcents", "localFiles": "Fichiers locaux", @@ -3102,7 +4196,6 @@ "googleDriveShort": "Drive", "myFiles": "Mes fichiers", "noRecentFiles": "Aucun fichier rÊcent trouvÊ", - "dropFilesHint": "DÊposez les fichiers ici pour les tÊlÊverser", "googleDriveNotAvailable": "IntÊgration Google Drive non disponible", "openFiles": "Ouvrir des fichiers", "openFile": "Ouvrir le fichier", @@ -3120,7 +4213,18 @@ "selectedCount": "{{count}} sÊlectionnÊ(s)", "download": "TÊlÊcharger", "delete": "Supprimer", - "unsupported": "Non pris en charge" + "unsupported": "Non pris en charge", + "addToUpload": "Add to Upload", + "deleteAll": "Delete All", + "loadingFiles": "Loading files...", + "noFiles": "No files available", + "noFilesFound": "No files found matching your search", + "openInPageEditor": "Open in Page Editor", + "showAll": "Show All", + "sortByDate": "Sort by Date", + "sortByName": "Sort by Name", + "sortBySize": "Sort by Size", + "dropFilesHint": "DÊposez les fichiers ici pour les tÊlÊverser" }, "storage": { "temporaryNotice": "Les fichiers sont stockÊs temporairement dans votre navigateur et peuvent ÃĒtre effacÊs automatiquement", @@ -3136,8 +4240,10 @@ "desc": "Supprimer les ÊlÊments potentiellement nuisibles des fichiers PDF.", "submit": "Assainir", "completed": "Assainissement effectuÊ avec succès", - "error.generic": "Échec de l’assainissement", - "error.failed": "Une erreur est survenue lors de l’assainissement du PDF.", + "error": { + "generic": "Échec de l’assainissement", + "failed": "Une erreur est survenue lors de l’assainissement du PDF." + }, "filenamePrefix": "sanitised", "sanitizationResults": "RÊsultats de l’assainissement", "steps": { @@ -3151,12 +4257,30 @@ "options": { "title": "Options d’assainissement", "note": "SÊlectionnez les ÊlÊments à supprimer du PDF. Au moins une option doit ÃĒtre sÊlectionnÊe.", - "removeJavaScript.desc": "Supprimer les actions et scripts JavaScript du PDF", - "removeEmbeddedFiles.desc": "Supprimer tous les fichiers intÊgrÊs dans le PDF", - "removeXMPMetadata.desc": "Supprimer les mÊtadonnÊes XMP du PDF", - "removeMetadata.desc": "Supprimer les informations de document (titre, auteur, etc.)", - "removeLinks.desc": "Supprimer les liens externes et actions de lancement du PDF", - "removeFonts.desc": "Supprimer les polices intÊgrÊes du PDF" + "removeJavaScript": { + "label": "Remove JavaScript", + "desc": "Supprimer les actions et scripts JavaScript du PDF" + }, + "removeEmbeddedFiles": { + "label": "Remove Embedded Files", + "desc": "Supprimer tous les fichiers intÊgrÊs dans le PDF" + }, + "removeXMPMetadata": { + "label": "Remove XMP Metadata", + "desc": "Supprimer les mÊtadonnÊes XMP du PDF" + }, + "removeMetadata": { + "label": "Remove Document Metadata", + "desc": "Supprimer les informations de document (titre, auteur, etc.)" + }, + "removeLinks": { + "label": "Remove Links", + "desc": "Supprimer les liens externes et actions de lancement du PDF" + }, + "removeFonts": { + "label": "Remove Fonts", + "desc": "Supprimer les polices intÊgrÊes du PDF" + } } }, "addPassword": { @@ -3377,9 +4501,14 @@ "remaining": "restant", "used": "utilisÊ", "available": "disponible", - "cancel": "Annuler" + "cancel": "Annuler", + "preview": "Preview" }, "config": { + "overview": { + "title": "Application Configuration", + "description": "Current application settings and configuration details." + }, "account": { "overview": { "title": "Paramètres du compte", @@ -3435,8 +4564,570 @@ "submit": "Ajouter les pièces jointes", "results": { "title": "RÊsultats des pièces jointes" + }, + "error": { + "failed": "Add attachments operation failed" } }, "termsAndConditions": "Conditions gÊnÊrales", - "logOut": "Se dÊconnecter" -} \ No newline at end of file + "logOut": "Se dÊconnecter", + "addAttachments": { + "error": { + "failed": "An error occurred while adding attachments to the PDF." + } + }, + "autoRename": { + "description": "This tool will automatically rename PDF files based on their content. It analyzes the document to find the most suitable title from the text." + }, + "customPosition": "Custom Position", + "details": "Details", + "downloadUnavailable": "Download unavailable for this item", + "invalidUndoData": "Cannot undo: invalid operation data", + "margin": { + "large": "Large", + "medium": "Medium", + "small": "Small", + "xLarge": "Extra Large" + }, + "noFilesToUndo": "Cannot undo: no files were processed in the last operation", + "noOperationToUndo": "No operation to undo", + "noValidFiles": "No valid files to process", + "operationCancelled": "Operation cancelled", + "pageEdit": { + "deselectAll": "Select None", + "selectAll": "Select All" + }, + "quickPosition": "Quick Position", + "reorganizePages": { + "error": { + "failed": "Failed to reorganize pages" + }, + "results": { + "title": "Pages Reorganized" + }, + "settings": { + "title": "Settings" + }, + "submit": "Reorganize Pages" + }, + "replace-color": { + "options": { + "fill": "Fill colour", + "gradient": "Gradient" + }, + "previewOverlayOpacity": "Preview overlay opacity", + "previewOverlayTransparency": "Preview overlay transparency", + "previewOverlayVisibility": "Show preview overlay", + "selectText": { + "1": "Replace or invert colour options", + "2": "Default (preset high contrast colours)", + "3": "Custom (choose your own colours)", + "4": "Full invert (invert all colours)", + "5": "High contrast color options", + "6": "White text on black background", + "7": "Black text on white background", + "8": "Yellow text on black background", + "9": "Green text on black background", + "10": "Choose text Color", + "11": "Choose background Color", + "12": "Choose start colour", + "13": "Choose end colour" + }, + "submit": "Replace", + "title": "Replace-Invert-Color" + }, + "size": "Size", + "submit": "Submit", + "success": "Success", + "tools": { + "noSearchResults": "No tools found", + "noTools": "No tools available" + }, + "undoDataMismatch": "Cannot undo: operation data is corrupted", + "undoFailed": "Failed to undo operation", + "undoQuotaError": "Cannot undo: insufficient storage space", + "undoStorageError": "Undo completed but some files could not be saved to storage", + "undoSuccess": "Operation undone successfully", + "unsupported": "Unsupported", + "onboarding": { + "welcomeModal": { + "title": "Welcome to Stirling PDF!", + "description": "Would you like to take a quick 1-minute tour to learn the key features and how to get started?", + "helpHint": "You can always access this tour later from the Help button in the bottom left.", + "startTour": "Start Tour", + "maybeLater": "Maybe Later", + "dontShowAgain": "Don't Show Again" + }, + "allTools": "This is the All Tools panel, where you can browse and select from all available PDF tools.", + "selectCropTool": "Let's select the Crop tool to demonstrate how to use one of the tools.", + "toolInterface": "This is the Crop tool interface. As you can see, there's not much there because we haven't added any PDF files to work with yet.", + "filesButton": "The Files button on the Quick Access bar allows you to upload PDFs to use the tools on.", + "fileSources": "You can upload new files or access recent files from here. For the tour, we'll just use a sample file.", + "workbench": "This is the Workbench - the main area where you view and edit your PDFs.", + "viewSwitcher": "Use these controls to select how you want to view your PDFs.", + "viewer": "The Viewer lets you read and annotate your PDFs.", + "pageEditor": "The Page Editor allows you to do various operations on the pages within your PDFs, such as reordering, rotating and deleting.", + "activeFiles": "The Active Files view shows all of the PDFs you have loaded into the tool, and allows you to select which ones to process.", + "fileCheckbox": "Clicking one of the files selects it for processing. You can select multiple files for batch operations.", + "selectControls": "The Right Rail contains buttons to quickly select/deselect all of your active PDFs, along with buttons to change the app's theme or language.", + "cropSettings": "Now that we've selected the file we want crop, we can configure the Crop tool to choose the area that we want to crop the PDF to.", + "runButton": "Once the tool has been configured, this button allows you to run the tool on all the selected PDFs.", + "results": "After the tool has finished running, the Review step will show a preview of the results in this panel, and allow you to undo the operation or download the file. ", + "fileReplacement": "The modified file will replace the original file in the Workbench automatically, allowing you to easily run it through more tools.", + "pinButton": "You can use the Pin button if you'd rather your files stay active after running tools on them.", + "wrapUp": "You're all set! You've learnt about the main areas of the app and how to use them. Click the Help button whenever you like to see this tour again.", + "previous": "Previous", + "next": "Next", + "finish": "Finish", + "startTour": "Start Tour", + "startTourDescription": "Take a guided tour of Stirling PDF's key features" + }, + "workspace": { + "title": "Workspace", + "people": { + "title": "People", + "description": "Manage workspace members and their permissions", + "loading": "Loading people...", + "searchMembers": "Search members...", + "addMembers": "Add Members", + "inviteMembers": { + "label": "Invite Members", + "subtitle": "Type or paste in emails below, separated by commas. Your workspace will be billed by members." + }, + "user": "User", + "role": "Role", + "team": "Team", + "status": "Status", + "actions": "Actions", + "noMembersFound": "No members found", + "active": "Active", + "disabled": "Disabled", + "activeSession": "Active session", + "member": "Member", + "admin": "Admin", + "roleDescriptions": { + "admin": "Can manage settings and invite members, with full administrative access.", + "member": "Can view and edit shared files, but cannot manage workspace settings or members." + }, + "editRole": "Edit Role", + "enable": "Enable", + "disable": "Disable", + "deleteUser": "Delete User", + "deleteUserSuccess": "User deleted successfully", + "deleteUserError": "Failed to delete user", + "confirmDelete": "Are you sure you want to delete this user? This action cannot be undone.", + "addMember": { + "title": "Add Member", + "username": "Username (Email)", + "usernamePlaceholder": "user@example.com", + "password": "Password", + "passwordPlaceholder": "Enter password", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "forcePasswordChange": "Force password change on first login", + "cancel": "Cancel", + "submit": "Add Member", + "usernameRequired": "Username and password are required", + "passwordTooShort": "Password must be at least 6 characters", + "success": "User created successfully", + "error": "Failed to create user" + }, + "editMember": { + "title": "Edit Member", + "editing": "Editing:", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "cancel": "Cancel", + "submit": "Update Member", + "success": "User updated successfully", + "error": "Failed to update user" + }, + "toggleEnabled": { + "success": "User status updated successfully", + "error": "Failed to update user status" + }, + "delete": { + "success": "User deleted successfully", + "error": "Failed to delete user" + }, + "emailInvite": { + "tab": "Email Invite", + "description": "Type or paste in emails below, separated by commas. Users will receive login credentials via email.", + "emails": "Email Addresses", + "emailsPlaceholder": "user1@example.com, user2@example.com", + "emailsRequired": "At least one email address is required", + "submit": "Send Invites", + "success": "user(s) invited successfully", + "partialSuccess": "Some invites failed", + "allFailed": "Failed to invite users", + "error": "Failed to send invites" + }, + "directInvite": { + "tab": "Direct Create" + }, + "inviteLinkTab": { + "tab": "Invite Link" + }, + "inviteLink": { + "description": "Generate a secure link that allows the user to set their own password", + "email": "Email Address", + "emailPlaceholder": "user@example.com (optional)", + "emailDescription": "Optional - leave blank for a general invite link that can be used by anyone", + "emailRequired": "Email address is required", + "emailOptional": "Optional - leave blank for a general invite link", + "emailRequiredForSend": "Email address is required to send email notification", + "expiryHours": "Expiry Hours", + "expiryDescription": "How many hours until the link expires", + "sendEmail": "Send invite link via email", + "sendEmailDescription": "If enabled, the invite link will be sent to the specified email address", + "smtpRequired": "SMTP not configured", + "generate": "Generate Link", + "generated": "Invite Link Generated", + "copied": "Link copied to clipboard", + "success": "Invite link generated successfully", + "successWithEmail": "Invite link generated and sent via email", + "emailFailed": "Invite link generated, but email failed", + "emailFailedDetails": "Error: {0}. Please share the invite link manually.", + "error": "Failed to generate invite link", + "submit": "Generate Invite Link" + }, + "inviteMode": { + "username": "Username", + "email": "Email", + "link": "Link", + "emailDisabled": "Email invites require SMTP configuration and mail.enableInvites=true in settings" + }, + "license": { + "users": "users", + "availableSlots": "Available Slots", + "grandfathered": "Grandfathered", + "grandfatheredShort": "{{count}} grandfathered", + "fromLicense": "from license", + "slotsAvailable": "{{count}} user slot(s) available", + "noSlotsAvailable": "No slots available", + "currentUsage": "Currently using {{current}} of {{max}} user licences" + } + }, + "teams": { + "title": "Teams", + "description": "Manage teams and organize workspace members", + "loading": "Loading teams...", + "loadingDetails": "Loading team details...", + "createNewTeam": "Create New Team", + "teamName": "Team Name", + "totalMembers": "Total Members", + "actions": "Actions", + "noTeamsFound": "No teams found", + "noMembers": "No members in this team", + "system": "System", + "addMember": "Add Member", + "viewTeam": "View Team", + "removeMember": "Remove from team", + "cannotRemoveFromSystemTeam": "Cannot remove from system team", + "renameTeamLabel": "Rename Team", + "deleteTeamLabel": "Delete Team", + "cannotDeleteInternal": "Cannot delete the Internal team", + "confirmDelete": "Are you sure you want to delete this team? This team must be empty to delete.", + "confirmRemove": "Remove user from this team?", + "cannotRenameInternal": "Cannot rename the Internal team", + "cannotAddToInternal": "Cannot add members to the Internal team", + "teamNotFound": "Team not found", + "backToTeams": "Back to Teams", + "memberCount": "{{count}} members", + "removeMemberSuccess": "User removed from team", + "removeMemberError": "Failed to remove user from team", + "createTeam": { + "title": "Create New Team", + "teamName": "Team Name", + "teamNamePlaceholder": "Enter team name", + "cancel": "Cancel", + "submit": "Create Team", + "nameRequired": "Team name is required", + "success": "Team created successfully", + "error": "Failed to create team" + }, + "renameTeam": { + "title": "Rename Team", + "renaming": "Renaming:", + "newTeamName": "New Team Name", + "newTeamNamePlaceholder": "Enter new team name", + "cancel": "Cancel", + "submit": "Rename Team", + "nameRequired": "Team name is required", + "success": "Team renamed successfully", + "error": "Failed to rename team" + }, + "deleteTeam": { + "success": "Team deleted successfully", + "error": "Failed to delete team. Make sure the team is empty.", + "teamMustBeEmpty": "Team must be empty before deletion" + }, + "addMemberToTeam": { + "title": "Add Member to Team", + "addingTo": "Adding to", + "selectUser": "Select User", + "selectUserPlaceholder": "Choose a user", + "selectUserRequired": "Please select a user", + "currentlyIn": "currently in", + "willBeMoved": "Note: This user will be moved from their current team to this team.", + "cancel": "Cancel", + "submit": "Add Member", + "userRequired": "Please select a user", + "success": "Member added to team successfully", + "error": "Failed to add member to team" + }, + "changeTeam": { + "label": "Change Team", + "title": "Change Team", + "changing": "Moving", + "selectTeam": "Select Team", + "selectTeamPlaceholder": "Choose a team", + "selectTeamRequired": "Please select a team", + "success": "Team changed successfully", + "error": "Failed to change team", + "submit": "Change Team" + } + } + }, + "plan": { + "currency": "Currency", + "popular": "Popular", + "current": "Current Plan", + "upgrade": "Upgrade", + "contact": "Contact Us", + "customPricing": "Custom", + "showComparison": "Compare All Features", + "hideComparison": "Hide Feature Comparison", + "featureComparison": "Feature Comparison", + "activePlan": { + "title": "Active Plan", + "subtitle": "Your current subscription details" + }, + "availablePlans": { + "title": "Available Plans", + "subtitle": "Choose the plan that fits your needs" + }, + "static": { + "title": "Billing Information", + "message": "Online billing is not currently configured. To upgrade your plan or manage subscriptions, please contact us directly.", + "contactSales": "Contact Sales", + "contactToUpgrade": "Contact us to upgrade or customize your plan", + "maxUsers": "Max Users", + "upTo": "Up to" + }, + "period": { + "month": "month" + }, + "free": { + "name": "Free", + "highlight1": "Limited Tool Usage Per week", + "highlight2": "Access to all tools", + "highlight3": "Community support" + }, + "pro": { + "name": "Pro", + "highlight1": "Unlimited Tool Usage", + "highlight2": "Advanced PDF tools", + "highlight3": "No watermarks" + }, + "enterprise": { + "name": "Enterprise", + "highlight1": "Custom pricing", + "highlight2": "Dedicated support", + "highlight3": "Latest features" + }, + "feature": { + "title": "Feature", + "pdfTools": "Basic PDF Tools", + "fileSize": "File Size Limit", + "automation": "Automate tool workflows", + "api": "API Access", + "priority": "Priority Support", + "customPricing": "Custom Pricing" + } + }, + "subscription": { + "status": { + "active": "Active", + "pastDue": "Past Due", + "canceled": "Canceled", + "incomplete": "Incomplete", + "trialing": "Trial", + "none": "No Subscription" + }, + "renewsOn": "Renews on {{date}}", + "cancelsOn": "Cancels on {{date}}" + }, + "billing": { + "manageBilling": "Manage Billing", + "portal": { + "error": "Failed to open billing portal" + } + }, + "payment": { + "preparing": "Preparing your checkout...", + "upgradeTitle": "Upgrade to {{planName}}", + "success": "Payment Successful!", + "successMessage": "Your subscription has been activated successfully. You will receive a confirmation email shortly.", + "autoClose": "This window will close automatically...", + "error": "Payment Error" + }, + "firstLogin": { + "title": "First Time Login", + "welcomeTitle": "Welcome!", + "welcomeMessage": "For security reasons, you must change your password on your first login.", + "loggedInAs": "Logged in as", + "error": "Error", + "currentPassword": "Current Password", + "enterCurrentPassword": "Enter your current password", + "newPassword": "New Password", + "enterNewPassword": "Enter new password (min 8 characters)", + "confirmPassword": "Confirm New Password", + "reEnterNewPassword": "Re-enter new password", + "changePassword": "Change Password", + "allFieldsRequired": "All fields are required", + "passwordsDoNotMatch": "New passwords do not match", + "passwordTooShort": "Password must be at least 8 characters", + "passwordMustBeDifferent": "New password must be different from current password", + "passwordChangedSuccess": "Password changed successfully! Please log in again.", + "passwordChangeFailed": "Failed to change password. Please check your current password." + }, + "invite": { + "welcome": "Welcome to Stirling PDF", + "invalidToken": "Invalid invitation link", + "validationError": "Failed to validate invitation link", + "passwordRequired": "Password is required", + "passwordTooShort": "Password must be at least 6 characters", + "passwordMismatch": "Passwords do not match", + "acceptError": "Failed to create account", + "validating": "Validating invitation...", + "invalidInvitation": "Invalid Invitation", + "goToLogin": "Go to Login", + "welcomeTitle": "You've been invited!", + "welcomeSubtitle": "Complete your account setup to get started", + "accountFor": "Creating account for", + "linkExpires": "Link expires", + "email": "Email address", + "emailPlaceholder": "Enter your email address", + "emailRequired": "Email address is required", + "invalidEmail": "Invalid email address", + "choosePassword": "Choose a password", + "passwordPlaceholder": "Enter your password", + "confirmPassword": "Confirm password", + "confirmPasswordPlaceholder": "Re-enter your password", + "createAccount": "Create Account", + "creating": "Creating Account...", + "alreadyHaveAccount": "Already have an account?", + "signIn": "Sign in" + }, + "audit": { + "error": { + "title": "Error loading audit system" + }, + "notAvailable": "Audit system not available", + "notAvailableMessage": "The audit system is not configured or not available.", + "disabled": "Audit logging is disabled", + "disabledMessage": "Enable audit logging in your application configuration to track system events.", + "systemStatus": { + "title": "System Status", + "status": "Audit Logging", + "enabled": "Enabled", + "disabled": "Disabled", + "level": "Audit Level", + "retention": "Retention Period", + "days": "days", + "totalEvents": "Total Events" + }, + "tabs": { + "dashboard": "Dashboard", + "events": "Audit Events", + "export": "Export" + }, + "charts": { + "title": "Audit Dashboard", + "error": "Error loading charts", + "day": "Day", + "week": "Week", + "month": "Month", + "byType": "Events by Type", + "byUser": "Events by User", + "overTime": "Events Over Time" + }, + "events": { + "title": "Audit Events", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "error": "Error loading events", + "noEvents": "No events found", + "timestamp": "Timestamp", + "type": "Type", + "user": "User", + "ipAddress": "IP Address", + "actions": "Actions", + "viewDetails": "View Details", + "eventDetails": "Event Details", + "details": "Details" + }, + "export": { + "title": "Export Audit Data", + "description": "Export audit events to CSV or JSON format. Use filters to limit the exported data.", + "format": "Export Format", + "filters": "Filters (Optional)", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "exportButton": "Export Data", + "error": "Failed to export data" + } + }, + "usage": { + "noData": "No data available", + "error": "Error loading usage statistics", + "noDataMessage": "No usage statistics are currently available.", + "controls": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All", + "refresh": "Refresh", + "dataTypeLabel": "Data Type:", + "dataType": { + "all": "All", + "api": "API", + "ui": "UI" + } + }, + "showing": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All" + }, + "stats": { + "totalEndpoints": "Total Endpoints", + "totalVisits": "Total Visits", + "showing": "Showing", + "selectedVisits": "Selected Visits" + }, + "chart": { + "title": "Endpoint Usage Chart" + }, + "table": { + "title": "Detailed Statistics", + "endpoint": "Endpoint", + "visits": "Visits", + "percentage": "Percentage", + "noData": "No data available" + } + }, + "backendHealth": { + "checking": "Checking backend status...", + "online": "Backend Online", + "offline": "Backend Offline" + } +} diff --git a/frontend/public/locales/ga-IE/translation.json b/frontend/public/locales/ga-IE/translation.json index 7f9316e63..f9cf59afa 100644 --- a/frontend/public/locales/ga-IE/translation.json +++ b/frontend/public/locales/ga-IE/translation.json @@ -1,4 +1,40 @@ { + "toolPanel": { + "modePrompt": { + "title": "Choose how you browse tools", + "description": "Preview both layouts and decide how you want to explore Stirling PDF tools.", + "sidebarTitle": "Sidebar mode", + "sidebarDescription": "Keep tools alongside your workspace for quick switching.", + "recommended": "Recommended", + "chooseSidebar": "Use sidebar mode", + "fullscreenTitle": "Fullscreen mode - (legacy)", + "fullscreenDescription": "Browse every tool in a catalogue that covers the workspace until you pick one.", + "chooseFullscreen": "Use fullscreen mode", + "dismiss": "Maybe later" + }, + "fullscreen": { + "showDetails": "Show Details", + "comingSoon": "Coming soon:", + "favorite": "Add to favourites", + "favorites": "Favourites", + "heading": "All tools (fullscreen view)", + "noResults": "Try adjusting your search or toggle descriptions to find what you need.", + "recommended": "Recommended", + "unfavorite": "Remove from favourites" + }, + "placeholder": "Choose a tool to get started", + "toggle": { + "fullscreen": "Switch to fullscreen mode", + "sidebar": "Switch to sidebar mode" + } + }, + "unsavedChanges": "You have unsaved changes to your PDF.", + "areYouSure": "Are you sure you want to leave?", + "unsavedChangesTitle": "Unsaved Changes", + "keepWorking": "Keep Working", + "discardChanges": "Discard & Leave", + "applyAndContinue": "Save & Leave", + "exportAndContinue": "Export & Continue", "language": { "direction": "ltr" }, @@ -18,8 +54,26 @@ "customTextDesc": "TÊacs Saincheaptha", "numberPagesDesc": "CÊ na leathanaigh le huimhriÃē, rÊamhshocraithe 'gach duine', a ghlacann freisin 1-5 nÃŗ 2,5,9 etc", "customNumberDesc": "RÊamhshocrÃē go {n}, glacann sÊ freisin le 'Leathanach {n} de {total}', 'Text-{n}', '{filename}-{n}", - "submit": "Cuir Uimhreacha Leathanaigh leis" + "submit": "Cuir Uimhreacha Leathanaigh leis", + "configuration": "Configuration", + "customize": "Customize Appearance", + "pagesAndStarting": "Pages & Starting Number", + "positionAndPages": "Position & Pages", + "error": { + "failed": "Add page numbers operation failed" + }, + "results": { + "title": "Page Number Results" + }, + "preview": "Position Selection", + "previewDisclaimer": "Preview is approximate. Final output may vary due to PDF font metrics." }, + "pageSelectionPrompt": "RoghnÃē Leathanach Saincheaptha (IontrÃĄil liosta leathanach scartha le camÃŗg d'uimhreacha 1,5,6 nÃŗ Feidhmeanna ar nÃŗs 2n+1):", + "startingNumberTooltip": "The first number to display. Subsequent pages will increment from this number.", + "marginTooltip": "Distance between the page number and the edge of the page.", + "fontSizeTooltip": "Size of the page number text in points. Larger numbers create bigger text.", + "fontTypeTooltip": "Font family for the page numbers. Choose based on your document style.", + "customTextTooltip": "Optional custom format for page numbers. Use {n} as placeholder for the number. Example: \"Page {n}\" will show \"Page 1\", \"Page 2\", etc.", "pdfPrompt": "Roghnaigh PDF(anna)", "multiPdfPrompt": "Roghnaigh PDFs (2+)", "multiPdfDropPrompt": "Roghnaigh (nÃŗ tarraing & scaoil) gach PDF atÃĄ uait", @@ -30,15 +84,41 @@ "uploadLimitExceededPlural": "are too large. Maximum allowed size is", "processTimeWarning": "Rabhadh: FÊadfaidh an prÃŗiseas seo suas le nÃŗimÊad a ghlacadh ag brath ar mhÊid an chomhaid", "pageOrderPrompt": "OrdÃē Leathanach Saincheaptha (IontrÃĄil liosta uimhreacha leathanaigh nÃŗ Feidhmeanna ar nÃŗs 2n+1 le camÃŗga deighilte):", - "pageSelectionPrompt": "RoghnÃē Leathanach Saincheaptha (IontrÃĄil liosta leathanach scartha le camÃŗg d'uimhreacha 1,5,6 nÃŗ Feidhmeanna ar nÃŗs 2n+1):", "goToPage": "TÊigh", "true": "Fíor", "false": "BrÊagach", "unknown": "Anaithnid", + "app": { + "description": "The Free Adobe Acrobat alternative (10M+ Downloads)" + }, "save": "SÃĄbhÃĄil", "saveToBrowser": "SÃĄbhÃĄil go BrabhsÃĄlaí", + "download": "Íosluchtaigh", + "pin": "Pin File (keep active after tool run)", + "unpin": "Unpin File (replace after tool run)", + "undoOperationTooltip": "Click to undo the last operation and restore the original files", + "undo": "Undo", + "moreOptions": "More Options", + "editYourNewFiles": "Edit your new file(s)", "close": "DÃēn", + "openInViewer": "Open in Viewer", + "confirmClose": "Confirm Close", + "confirmCloseMessage": "Are you sure you want to close this file?", + "confirmCloseCancel": "Cancel", + "confirmCloseConfirm": "Close File", + "fileSelected": "Selected: {{filename}}", + "chooseFile": "Choose File", "filesSelected": "comhaid roghnaithe", + "files": { + "title": "Files", + "upload": "Upload", + "uploadFiles": "Upload Files", + "addFiles": "Add files", + "selectFromWorkbench": "Select files from the workbench or ", + "selectMultipleFromWorkbench": "Select at least {{count}} files from the workbench or ", + "created": "Created", + "size": "File Size" + }, "noFavourites": "Níor cuireadh aon cheanÃĄin leis", "downloadComplete": "Íosluchtaigh Críochnaithe", "bored": "Leamh Ag Feitheamh?", @@ -56,7 +136,10 @@ }, "error": { "pdfPassword": "TÃĄ pasfhocal ar an DoicimÊad PDF agus níor solÃĄthraíodh an pasfhocal nÃŗ bhí sÊ mícheart", + "encryptedPdfMustRemovePassword": "This PDF is encrypted or password-protected. Please unlock it before converting to PDF/A.", + "incorrectPasswordProvided": "The PDF password is incorrect or not provided.", "_value": "EarrÃĄid", + "dismissAllErrors": "Dismiss All Errors", "sorry": "Gabh mo leithscÊal as an gceist!", "needHelp": "Cabhair uait / Ar aimsíodh fadhb?", "contactTip": "MÃĄ tÃĄ trioblÃŗid agat fÃŗs, nÃĄ bíodh leisce ort teagmhÃĄil a dhÊanamh linn le haghaidh cabhrach. Is fÊidir leat ticÊad a chur isteach ar ÃĄr leathanach GitHub nÃŗ dÊan teagmhÃĄil linn trí Discord:", @@ -71,6 +154,10 @@ "githubSubmit": "GitHub - Cuir ticÊad isteach", "discordSubmit": "Discord - Cuir post Tacaíochta" }, + "warning": { + "tooltipTitle": "Warning" + }, + "edit": "Edit", "delete": "Scrios", "username": "Ainm ÃēsÃĄideora", "password": "Pasfhocal", @@ -82,6 +169,7 @@ "green": "Glas", "blue": "Gorm", "custom": "Saincheaptha...", + "comingSoon": "Coming soon", "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ÃĄ", @@ -115,12 +203,14 @@ "page": "Leathanach", "pages": "Leathanaigh", "loading": "Á lÃŗdÃĄil...", + "review": "Review", "addToDoc": "Cuir le DoicimÊad", "reset": "Athshocraigh", "apply": "Cuir i bhFeidhm", "noFileSelected": "No file selected. Please upload one.", "legal": { "privacy": "Polasaí PríobhÃĄideachta", + "iAgreeToThe": "I agree to all of the", "terms": "TÊarmaí agus Coinníollacha", "accessibility": "Inrochtaineacht", "cookie": "Polasaí FianÃĄn", @@ -160,6 +250,7 @@ "title": "An bhfuil fonn ort PDF Stirling a fheabhsÃē?", "paragraph1": "TÃĄ rogha an diÃēltaithe ag PDF Stirling chun cabhrÃē linn an tÃĄirge a fheabhsÃē. Ní rianaimid aon fhaisnÊis phearsanta nÃŗ ÃĄbhar comhaid.", "paragraph2": "Smaoinigh le do thoil ar anailísíocht a chumasÃē chun cabhrÃē le Stirling-PDF fÃĄs agus chun ligean dÃēinn ÃĄr n-ÃēsÃĄideoirí a thuiscint níos fearr.", + "learnMore": "Learn more", "enable": "Cumasaigh anailísíocht", "disable": "Díchumasaigh anailísíocht", "settings": "Is fÊidir leat na socruithe don anailísíocht a athrÃē sa chomhad config/settings.yml" @@ -203,6 +294,54 @@ "cacheInputs": { "name": "SÃĄbhÃĄil ionchuir fhoirm", "help": "Cumasaigh ionchuir a ÃēsÃĄideadh roimhe seo a stÃŗrÃĄil le haghaidh ritheanna amach anseo" + }, + "general": { + "title": "General", + "description": "Configure general application preferences.", + "account": "Account", + "accountDescription": "Manage your account settings", + "user": "User", + "signedInAs": "Signed in as", + "logout": "Log out", + "enableFeatures": { + "title": "For System Administrators", + "intro": "Enable user authentication, team management, and workspace features for your organization.", + "action": "Configure", + "and": "and", + "benefit": "Enables user roles, team collaboration, admin controls, and enterprise features.", + "learnMore": "Learn more in documentation", + "dismiss": "Dismiss" + }, + "autoUnzip": "Auto-unzip API responses", + "autoUnzipDescription": "Automatically extract files from ZIP responses", + "autoUnzipTooltip": "Automatically extract ZIP files returned from API operations. Disable to keep ZIP files intact. This does not affect automation workflows.", + "autoUnzipFileLimit": "Auto-unzip file limit", + "autoUnzipFileLimitDescription": "Maximum number of files to extract from ZIP", + "autoUnzipFileLimitTooltip": "Only unzip if the ZIP contains this many files or fewer. Set higher to extract larger ZIPs.", + "defaultToolPickerMode": "Default tool picker mode", + "defaultToolPickerModeDescription": "Choose whether the tool picker opens in fullscreen or sidebar by default", + "mode": { + "fullscreen": "Fullscreen", + "sidebar": "Sidebar" + } + }, + "hotkeys": { + "title": "Keyboard Shortcuts", + "description": "Hover a tool to see its shortcut or customise it below. Click \"Change shortcut\" and press a new key combination. Press Esc to cancel.", + "errorModifier": { + "mac": "Include ⌘ (Command), âŒĨ (Option), or another modifier in your shortcut.", + "windows": "Include Ctrl, Alt, or another modifier in your shortcut." + }, + "errorConflict": "Shortcut already used by {{tool}}.", + "none": "Not assigned", + "customBadge": "Custom", + "defaultLabel": "Default: {{shortcut}}", + "capturing": "Press keysâ€Ļ (Esc to cancel)", + "change": "Change shortcut", + "reset": "Reset", + "shortcut": "Shortcut", + "noShortcut": "No shortcut set", + "searchPlaceholder": "Search tools..." } }, "changeCreds": { @@ -274,8 +413,10 @@ "top20": "Top 20", "all": "All", "refresh": "Refresh", - "includeHomepage": "Include Homepage ('/')", - "includeLoginPage": "Include Login Page ('/login')", + "dataTypeLabel": "Data Type:", + "dataTypeAll": "All", + "dataTypeApi": "API", + "dataTypeUi": "UI", "totalEndpoints": "Total Endpoints", "totalVisits": "Total Visits", "showing": "Showing", @@ -290,7 +431,9 @@ "top": "Top", "numberOfVisits": "Number of Visits", "visitsTooltip": "Visits: {0} ({1}% of total)", - "retry": "Retry" + "retry": "Retry", + "includeHomepage": "Include Homepage ('/')", + "includeLoginPage": "Include Login Page ('/login')" }, "database": { "title": "IompÃŗrtÃĄil/EaspÃŗrtÃĄil Bunachar Sonraí", @@ -331,22 +474,310 @@ "alphabetical": "Alphabetical", "globalPopularity": "Global Popularity", "sortBy": "Sort by:", + "mobile": { + "brandAlt": "Stirling PDF logo", + "openFiles": "Open files", + "swipeHint": "Swipe left or right to switch views", + "tools": "Tools", + "toolsSlide": "Tool selection panel", + "viewSwitcher": "Switch workspace view", + "workbenchSlide": "Workspace panel", + "workspace": "Workspace" + }, "multiTool": { + "tags": "multiple,tools", "title": "Il-uirlis PDF", "desc": "Cumaisc, Rothlaigh, Atheagraigh, agus Bain leathanaigh" }, "merge": { + "tags": "combine,join,unite", "title": "Cumaisc", "desc": "Go hÊasca chumasadh go leor PDFanna isteach i gceann amhÃĄin." }, "split": { + "tags": "divide,separate,break", "title": "Scoilt", "desc": "Scoilt comhaid PDF isteach i ndoicimÊid iolracha" }, "rotate": { + "tags": "turn,flip,orient", "title": "Rothlaigh", "desc": "Rothlaigh do PDFanna go hÊasca." }, + "convert": { + "tags": "transform,change", + "title": "Tiontaigh", + "desc": "Convert files between different formats" + }, + "pdfOrganiser": { + "tags": "organize,rearrange,reorder", + "title": "Eagraigh", + "desc": "Bain/Atheagraigh na leathanaigh in ord ar bith" + }, + "addImage": { + "tags": "insert,embed,place", + "title": "Cuir íomhÃĄ leis", + "desc": "Cuireann sÊ íomhÃĄ ar shuíomh socraithe ar an PDF" + }, + "addAttachments": { + "tags": "embed,attach,include", + "title": "Add Attachments", + "desc": "Add or remove embedded files (attachments) to/from a PDF" + }, + "watermark": { + "tags": "stamp,mark,overlay", + "title": "Cuir Uisce leis", + "desc": "Cuir comhartha uisce saincheaptha le do dhoicimÊad PDF." + }, + "removePassword": { + "tags": "unlock", + "title": "Bain Pasfhocal", + "desc": "Bain cosaint phasfhocal Ãŗ do dhoicimÊad PDF." + }, + "compress": { + "tags": "shrink,reduce,optimize", + "title": "ComhbhrÃēigh", + "desc": "ComhbhrÃēigh PDFanna chun a mÊid comhaid a laghdÃē." + }, + "unlockPDFForms": { + "tags": "unlock,enable,edit", + "title": "Unlock PDF Forms", + "desc": "Remove read-only property of form fields in a PDF document." + }, + "changeMetadata": { + "tags": "edit,modify,update", + "title": "Athraigh Meiteashonraí", + "desc": "Athraigh/Bain/Cuir meiteashonraí Ãŗ dhoicimÊad PDF" + }, + "ocr": { + "tags": "extract,scan", + "title": "OCR / Scananna glanta", + "desc": "Scanann glantachÃĄn agus aimsíonn sÊ tÊacs Ãŗ íomhÃĄnna laistigh de PDF agus cuireann sÊ isteach arís Ê mar thÊacs." + }, + "extractImages": { + "tags": "pull,save,export", + "title": "Sliocht ÍomhÃĄnna", + "desc": "Sliochtann sÊ gach íomhÃĄ Ãŗ PDF agus sÃĄbhÃĄlann sÊ iad a zip" + }, + "scannerImageSplit": { + "tags": "detect,split,photos", + "title": "Detect & Split Scanned Photos", + "desc": "Detect and split scanned photos into separate pages" + }, + "sign": { + "tags": "signature,autograph", + "title": "Comhartha", + "desc": "Cuireann síniÃē le PDF trí líníocht, tÊacs nÃŗ íomhÃĄ" + }, + "flatten": { + "tags": "simplify,remove,interactive", + "title": "Comhcheangail", + "desc": "Bain gach eilimint agus foirm idirghníomhach as PDF" + }, + "certSign": { + "tags": "authenticate,PEM,P12,official,encrypt,sign,certificate,PKCS12,JKS,server,manual,auto", + "title": "Sínigh le DeimhniÃē", + "desc": "Síníonn sÊ PDF le DeimhniÃē/Eochair (PEM/P12)" + }, + "repair": { + "tags": "fix,restore", + "title": "DeisiÃēchÃĄn", + "desc": "DÊanann sÊ iarracht PDF truaillithe/briste a dheisiÃē" + }, + "removeBlanks": { + "tags": "delete,clean,empty", + "title": "Bain leathanaigh BhÃĄna", + "desc": "Aimsíonn agus baintear leathanaigh bhÃĄna de dhoicimÊad" + }, + "removeAnnotations": { + "tags": "delete,clean,strip", + "title": "Bain AnÃŗtÃĄlacha", + "desc": "Baintear gach trÃĄcht/nÃŗta de PDF" + }, + "compare": { + "tags": "difference", + "title": "DÊan comparÃĄid idir", + "desc": "DÊanann sÊ na difríochtaí idir 2 DhoicimÊad PDF a chur i gcomparÃĄid agus a thaispeÃĄint" + }, + "removeCertSign": { + "tags": "remove,delete,unlock", + "title": "Bain Comhartha Teastais", + "desc": "Bain síniÃē teastas Ãŗ PDF" + }, + "pageLayout": { + "tags": "layout,arrange,combine", + "title": "Leagan Amach Illeathanaigh", + "desc": "Cumaisc leathanaigh iolracha de dhoicimÊad PDF isteach i leathanach amhÃĄin" + }, + "bookletImposition": { + "tags": "booklet,print,binding", + "title": "Booklet Imposition", + "desc": "Create booklets with proper page ordering and multi-page layout for printing and binding" + }, + "scalePages": { + "tags": "resize,adjust,scale", + "title": "Coigeartaigh mÊid/scÃĄla an leathanaigh", + "desc": "Athraigh mÊid/scÃĄla leathanaigh agus/nÃŗ a bhfuil ann." + }, + "addPageNumbers": { + "tags": "number,pagination,count", + "title": "Cuir Uimhreacha Leathanaigh leis", + "desc": "Cuir uimhreacha Leathanach leis an doicimÊad i suíomh socraithe" + }, + "autoRename": { + "tags": "auto-detect,header-based,organize,relabel", + "title": "Auto Rename PDF File", + "desc": "Auto renames a PDF file based on its detected header" + }, + "adjustContrast": { + "tags": "contrast,brightness,saturation", + "title": "Coigeartaigh Dathanna/Codarsnacht", + "desc": "Coigeartaigh Codarsnacht, SÃĄithiÃē agus Gile PDF" + }, + "crop": { + "tags": "trim,cut,resize", + "title": "PDF a ghearradh", + "desc": "Bearr PDF chun a mhÊid a laghdÃē (coimeÃĄdann an tÊacs!)" + }, + "autoSplitPDF": { + "tags": "auto,split,QR", + "title": "Leathanaigh Scoilte Uathoibríoch", + "desc": "Auto Scoilt PDF Scanta le CÃŗd QR scoilteoir leathanach scanadh fisiciÃēil" + }, + "sanitize": { + "tags": "clean,purge,remove", + "title": "Sanitise", + "desc": "Remove potentially harmful elements from PDF files" + }, + "getPdfInfo": { + "tags": "info,metadata,details", + "title": "Faigh GACH Eolas ar PDF", + "desc": "Grab aon fhaisnÊis agus is fÊidir ar PDFs" + }, + "pdfToSinglePage": { + "tags": "combine,merge,single", + "title": "PDF go leathanach mÃŗr amhÃĄin", + "desc": "Cumasc gach leathanach PDF isteach i leathanach mÃŗr amhÃĄin" + }, + "showJS": { + "tags": "javascript,code,script", + "title": "TaispeÃĄin Javascript", + "desc": "DÊanann sÊ cuardach agus taispeÃĄint ar aon JS a instealladh isteach i PDF" + }, + "redact": { + "tags": "censor,blackout,hide", + "title": "AthchÃŗiriÃē de LÃĄimh", + "desc": "RÊiteann sÊ PDF bunaithe ar thÊacs roghnaithe, cruthanna tarraingthe agus/nÃŗ leathanaigh roghnaithe" + }, + "splitBySections": { + "tags": "split,sections,divide", + "title": "Split PDF by Sections", + "desc": "Divide each page of a PDF into smaller horizontal and vertical sections" + }, + "addStamp": { + "tags": "stamp,mark,seal", + "title": "Add Stamp to PDF", + "desc": "Add text or add image stamps at set locations" + }, + "removeImage": { + "tags": "remove,delete,clean", + "title": "Bain íomhÃĄ", + "desc": "Bain íomhÃĄ de PDF chun mÊid comhaid a laghdÃē" + }, + "splitByChapters": { + "tags": "split,chapters,structure", + "title": "Scoil PDF ar Chaibidlí", + "desc": "Scoilt PDF ina chomhaid iolracha bunaithe ar a struchtÃēr caibidle." + }, + "validateSignature": { + "tags": "validate,verify,certificate", + "title": "Bailíochtaigh SíniÃē PDF", + "desc": "Fíoraigh sínithe digiteacha agus teastais i gcÃĄipÊisí PDF" + }, + "swagger": { + "tags": "API,documentation,test", + "title": "API Documentation", + "desc": "View API documentation and test endpoints" + }, + "scannerEffect": { + "tags": "scan,simulate,create", + "title": "Scanner Effect", + "desc": "Create a PDF that looks like it was scanned" + }, + "editTableOfContents": { + "tags": "bookmarks,contents,edit", + "title": "Edit Table of Contents", + "desc": "Add or edit bookmarks and table of contents in PDF documents" + }, + "manageCertificates": { + "tags": "certificates,import,export", + "title": "Manage Certificates", + "desc": "Import, export, or delete digital certificate files used for signing PDFs." + }, + "read": { + "tags": "view,open,display", + "title": "Read", + "desc": "View and annotate PDFs. Highlight text, draw, or insert comments for review and collaboration." + }, + "reorganizePages": { + "tags": "rearrange,reorder,organize", + "title": "Reorganize Pages", + "desc": "Rearrange, duplicate, or delete PDF pages with visual drag-and-drop control." + }, + "extractPages": { + "tags": "pull,select,copy", + "title": "Leathanaigh Sliocht", + "desc": "Extract specific pages from a PDF document" + }, + "removePages": { + "tags": "delete,extract,exclude", + "title": "Bain", + "desc": "Scrios leathanaigh nach dteastaíonn Ãŗ do dhoicimÊad PDF." + }, + "autoSizeSplitPDF": { + "tags": "auto,split,size", + "title": "Auto Scoilte de rÊir MÊid/Comhaireamh", + "desc": "Scoilt PDF amhÃĄin i ndoicimÊid iolracha bunaithe ar mhÊid, líon na leathanach, nÃŗ comhaireamh doicimÊad" + }, + "replaceColor": { + "title": "Replace & Invert Colour", + "desc": "Replace or invert colours in PDF documents" + }, + "devApi": { + "tags": "API,development,documentation", + "title": "API", + "desc": "Link to API documentation" + }, + "devFolderScanning": { + "tags": "automation,folder,scanning", + "title": "Automated Folder Scanning", + "desc": "Link to automated folder scanning guide" + }, + "devSsoGuide": { + "title": "SSO Guide", + "desc": "Link to SSO guide" + }, + "devAirgapped": { + "title": "Air-gapped Setup", + "desc": "Link to air-gapped setup guide" + }, + "addPassword": { + "title": "Cuir Pasfhocal leis", + "desc": "Criptigh do dhoicimÊad PDF le focal faire." + }, + "changePermissions": { + "title": "AthrÃē Ceadanna", + "desc": "Change document restrictions and permissions" + }, + "automate": { + "tags": "workflow,sequence,automation", + "title": "Automate", + "desc": "Build multi-step workflows by chaining together PDF actions. Ideal for recurring tasks." + }, + "overlay-pdfs": { + "desc": "Forleagain PDF ar bharr PDF eile", + "title": "Forleagan PDF" + }, "imageToPDF": { "title": "ÍomhÃĄ go PDF", "desc": "Tiontaigh íomhÃĄ (PNG, JPEG, GIF) go PDF." @@ -355,18 +786,6 @@ "title": "PDF go íomhÃĄ", "desc": "Tiontaigh PDF a íomhÃĄ. (PNG, JPEG, GIF)" }, - "pdfOrganiser": { - "title": "Eagraigh", - "desc": "Bain/Atheagraigh na leathanaigh in ord ar bith" - }, - "addImage": { - "title": "Cuir íomhÃĄ leis", - "desc": "Cuireann sÊ íomhÃĄ ar shuíomh socraithe ar an PDF" - }, - "watermark": { - "title": "Cuir Uisce leis", - "desc": "Cuir comhartha uisce saincheaptha le do dhoicimÊad PDF." - }, "permissions": { "title": "AthrÃē Ceadanna", "desc": "Athraigh ceadanna do dhoicimÊad PDF" @@ -375,38 +794,10 @@ "title": "Bain", "desc": "Scrios leathanaigh nach dteastaíonn Ãŗ do dhoicimÊad PDF." }, - "addPassword": { - "title": "Cuir Pasfhocal leis", - "desc": "Criptigh do dhoicimÊad PDF le focal faire." - }, - "removePassword": { - "title": "Bain Pasfhocal", - "desc": "Bain cosaint phasfhocal Ãŗ do dhoicimÊad PDF." - }, - "compress": { - "title": "ComhbhrÃēigh", - "desc": "ComhbhrÃēigh PDFanna chun a mÊid comhaid a laghdÃē." - }, - "unlockPDFForms": { - "title": "Unlock PDF Forms", - "desc": "Remove read-only property of form fields in a PDF document." - }, - "changeMetadata": { - "title": "Athraigh Meiteashonraí", - "desc": "Athraigh/Bain/Cuir meiteashonraí Ãŗ dhoicimÊad PDF" - }, "fileToPDF": { "title": "Comhad a thiontÃē go PDF", "desc": "Tiontaigh beagnach aon chomhad go PDF (DOCX, PNG, XLS, PPT, TXT agus go leor eile)" }, - "ocr": { - "title": "OCR / Scananna glanta", - "desc": "Scanann glantachÃĄn agus aimsíonn sÊ tÊacs Ãŗ íomhÃĄnna laistigh de PDF agus cuireann sÊ isteach arís Ê mar thÊacs." - }, - "extractImages": { - "title": "Sliocht ÍomhÃĄnna", - "desc": "Sliochtann sÊ gach íomhÃĄ Ãŗ PDF agus sÃĄbhÃĄlann sÊ iad a zip" - }, "pdfToPDFA": { "title": "PDF go PDF/A", "desc": "Tiontaigh PDF go PDF/A le haghaidh stÃŗrÃĄla fadtÊarmach" @@ -435,70 +826,14 @@ "title": "Braith / Scoilt grianghraif Scanta", "desc": "Scoilteann sÊ grianghraif iolracha Ãŗ laistigh de ghrianghraf/PDF" }, - "sign": { - "title": "Comhartha", - "desc": "Cuireann síniÃē le PDF trí líníocht, tÊacs nÃŗ íomhÃĄ" - }, - "flatten": { - "title": "Comhcheangail", - "desc": "Bain gach eilimint agus foirm idirghníomhach as PDF" - }, - "repair": { - "title": "DeisiÃēchÃĄn", - "desc": "DÊanann sÊ iarracht PDF truaillithe/briste a dheisiÃē" - }, - "removeBlanks": { - "title": "Bain leathanaigh BhÃĄna", - "desc": "Aimsíonn agus baintear leathanaigh bhÃĄna de dhoicimÊad" - }, - "removeAnnotations": { - "title": "Bain AnÃŗtÃĄlacha", - "desc": "Baintear gach trÃĄcht/nÃŗta de PDF" - }, - "compare": { - "title": "DÊan comparÃĄid idir", - "desc": "DÊanann sÊ na difríochtaí idir 2 DhoicimÊad PDF a chur i gcomparÃĄid agus a thaispeÃĄint" - }, - "certSign": { - "title": "Sínigh le DeimhniÃē", - "desc": "Síníonn sÊ PDF le DeimhniÃē/Eochair (PEM/P12)" - }, - "removeCertSign": { - "title": "Bain Comhartha Teastais", - "desc": "Bain síniÃē teastas Ãŗ PDF" - }, - "pageLayout": { - "title": "Leagan Amach Illeathanaigh", - "desc": "Cumaisc leathanaigh iolracha de dhoicimÊad PDF isteach i leathanach amhÃĄin" - }, - "scalePages": { - "title": "Coigeartaigh mÊid/scÃĄla an leathanaigh", - "desc": "Athraigh mÊid/scÃĄla leathanaigh agus/nÃŗ a bhfuil ann." - }, "pipeline": { "title": "Píblíne (ArdleibhÊal)", "desc": "Rith gníomhartha iolracha ar PDFanna trí scripteanna píblíne a shainiÃē" }, - "addPageNumbers": { - "title": "Cuir Uimhreacha Leathanaigh leis", - "desc": "Cuir uimhreacha Leathanach leis an doicimÊad i suíomh socraithe" - }, "auto-rename": { "title": "Comhad PDF a athainmniÃē go huathoibríoch", "desc": "Athainmníonn Auto comhad PDF bunaithe ar a cheanntÃĄsc braite" }, - "adjustContrast": { - "title": "Coigeartaigh Dathanna/Codarsnacht", - "desc": "Coigeartaigh Codarsnacht, SÃĄithiÃē agus Gile PDF" - }, - "crop": { - "title": "PDF a ghearradh", - "desc": "Bearr PDF chun a mhÊid a laghdÃē (coimeÃĄdann an tÊacs!)" - }, - "autoSplitPDF": { - "title": "Leathanaigh Scoilte Uathoibríoch", - "desc": "Auto Scoilt PDF Scanta le CÃŗd QR scoilteoir leathanach scanadh fisiciÃēil" - }, "sanitizePDF": { "title": "SlÃĄintíocht", "desc": "Bain scripteanna agus gnÊithe eile Ãŗ chomhaid PDF" @@ -519,30 +854,14 @@ "title": "PDF chuig Markdown", "desc": "Tiontaíonn PDF ar bith go Markdown" }, - "getPdfInfo": { - "title": "Faigh GACH Eolas ar PDF", - "desc": "Grab aon fhaisnÊis agus is fÊidir ar PDFs" - }, "pageExtracter": { "title": "Sliocht leathanach(eacha)", "desc": "Sleachta roghnaigh leathanaigh Ãŗ PDF" }, - "pdfToSinglePage": { - "title": "PDF go leathanach mÃŗr amhÃĄin", - "desc": "Cumasc gach leathanach PDF isteach i leathanach mÃŗr amhÃĄin" - }, - "showJS": { - "title": "TaispeÃĄin Javascript", - "desc": "DÊanann sÊ cuardach agus taispeÃĄint ar aon JS a instealladh isteach i PDF" - }, "autoRedact": { "title": "Auto Redact", "desc": "Auto Redacts (Blacks out) tÊacs i PDF bunaithe ar an tÊacs ionchuir" }, - "redact": { - "title": "AthchÃŗiriÃē de LÃĄimh", - "desc": "RÊiteann sÊ PDF bunaithe ar thÊacs roghnaithe, cruthanna tarraingthe agus/nÃŗ leathanaigh roghnaithe" - }, "PDFToCSV": { "title": "Ó CSV go PDF", "desc": "Sleachta TÃĄblaí Ãŗ PDF agus Ê a thiontÃē go CSV" @@ -551,10 +870,6 @@ "title": "Auto Scoilte de rÊir MÊid/Comhaireamh", "desc": "Scoilt PDF amhÃĄin i ndoicimÊid iolracha bunaithe ar mhÊid, líon na leathanach, nÃŗ comhaireamh doicimÊad" }, - "overlay-pdfs": { - "title": "Forleagan PDF", - "desc": "Forleagain PDF ar bharr PDF eile" - }, "split-by-sections": { "title": "Scoilt PDF de rÊir ailt", "desc": "Roinn gach leathanach de PDF i gcodanna cothromÃĄnacha agus ingearacha níos lÃē" @@ -563,43 +878,17 @@ "title": "Cuir Stampa go PDF", "desc": "Cuir tÊacs leis nÃŗ cuir stampaí íomhÃĄ leis ag lÃĄithreacha socraithe" }, - "removeImage": { - "title": "Bain íomhÃĄ", - "desc": "Bain íomhÃĄ de PDF chun mÊid comhaid a laghdÃē" - }, - "splitByChapters": { - "title": "Scoil PDF ar Chaibidlí", - "desc": "Scoilt PDF ina chomhaid iolracha bunaithe ar a struchtÃēr caibidle." - }, - "validateSignature": { - "title": "Bailíochtaigh SíniÃē PDF", - "desc": "Fíoraigh sínithe digiteacha agus teastais i gcÃĄipÊisí PDF" - }, "replace-color": { "title": "Athchuir agus InbhÊartaigh Dath", "desc": "Athchuir dath an tÊacs agus an chÃēlra i bhformÃĄid PDF agus inbhÊartaigh dath iomlÃĄn pdf chun mÊid comhaid a laghdÃē" }, - "convert": { - "title": "Tiontaigh" - }, "attachments": { "title": "Add attachments" }, - "extractPages": { - "title": "Leathanaigh Sliocht" - }, - "removePages": { - "title": "Bain", - "desc": "Scrios leathanaigh nach dteastaíonn Ãŗ do dhoicimÊad PDF." - }, "removeImagePdf": { "title": "Bain íomhÃĄ", "desc": "Bain íomhÃĄ de PDF chun mÊid comhaid a laghdÃē" }, - "autoSizeSplitPDF": { - "title": "Auto Scoilte de rÊir MÊid/Comhaireamh", - "desc": "Scoilt PDF amhÃĄin i ndoicimÊid iolracha bunaithe ar mhÊid, líon na leathanach, nÃŗ comhaireamh doicimÊad" - }, "adjust-contrast": { "title": "Coigeartaigh Dathanna/Codarsnacht", "desc": "Coigeartaigh Codarsnacht, SÃĄithiÃē agus Gile PDF" @@ -607,11 +896,12 @@ "replaceColorPdf": { "title": "Athchuir agus InbhÊartaigh Dath", "desc": "Athchuir dath an tÊacs agus an chÃēlra i bhformÃĄid PDF agus inbhÊartaigh dath iomlÃĄn pdf chun mÊid comhaid a laghdÃē" - }, - "changePermissions": { - "title": "AthrÃē Ceadanna" } }, + "landing": { + "addFiles": "Add Files", + "uploadFromComputer": "Upload from computer" + }, "viewPdf": { "tags": "amharc, lÊamh, anÃŗtÃĄil, tÊacs, íomhÃĄ", "title": "View/Edit PDF", @@ -645,17 +935,39 @@ "merge": { "tags": "chumasadh,Oibríochtaí Leathanaigh,CÃēl-deireadh,taobh freastalaí", "title": "Cumaisc", + "removeDigitalSignature": { + "label": "Remove digital signature in the merged file?", + "tooltip": { + "title": "Remove Digital Signature", + "description": "Digital signatures will be invalidated when merging files. Check this to remove them from the final merged PDF." + } + }, + "generateTableOfContents": { + "label": "Generate table of contents in the merged file?", + "tooltip": { + "title": "Generate Table of Contents", + "description": "Automatically creates a clickable table of contents in the merged PDF based on the original file names and page numbers." + } + }, + "submit": "Cumaisc", + "sortBy": { + "description": "Files will be merged in the order they're selected. Drag to reorder or sort below.", + "label": "Sort By", + "filename": "Ainm comhaid", + "dateModified": "Date Modified", + "ascending": "Ascending", + "descending": "Descending", + "sort": "Sort" + }, + "error": { + "failed": "An error occurred while merging the PDFs." + }, "header": "Cumaisc PDFanna iolracha (2+)", "sortByName": "SÃŗrtÃĄil de rÊir ainm", "sortByDate": "SÃŗrtÃĄil de rÊir dÃĄta", - "removeCertSign": "Bain síniÃē digiteach sa chomhad cumaiscthe?", - "submit": "Cumaisc", - "sortBy": { - "filename": "Ainm comhaid" - } + "removeCertSign": "Bain síniÃē digiteach sa chomhad cumaiscthe?" }, "split": { - "tags": "Oibríochtaí leathanach, roinnt, Leathanach Il, gearrtha, taobh freastalaí", "title": "Scoilt PDF", "header": "Scoilt PDF", "desc": { @@ -671,25 +983,249 @@ "splitPages": "IontrÃĄil leathanaigh le scoilt ar:", "submit": "Scoilt", "steps": { + "chooseMethod": "Choose Method", "settings": "Socruithe" }, + "settings": { + "selectMethodFirst": "Please select a split method first" + }, + "error": { + "failed": "An error occurred while splitting the PDF." + }, + "method": { + "label": "Choose split method", + "placeholder": "Select how to split the PDF" + }, "methods": { + "prefix": { + "splitAt": "Split at", + "splitBy": "Split by" + }, + "byPages": { + "name": "Page Numbers", + "desc": "Extract specific pages (1,3,5-10)", + "tooltip": "Enter page numbers separated by commas or ranges with hyphens" + }, + "bySections": { + "name": "Sections", + "desc": "Divide pages into grid sections", + "tooltip": "Split each page into horizontal and vertical sections" + }, "bySize": { - "name": "MÊid an Chomhaid" + "name": "MÊid an Chomhaid", + "desc": "Limit maximum file size", + "tooltip": "Specify maximum file size (e.g. 10MB, 500KB)" + }, + "byPageCount": { + "name": "Page Count", + "desc": "Fixed pages per file", + "tooltip": "Enter the number of pages for each split file" + }, + "byDocCount": { + "name": "Document Count", + "desc": "Create specific number of files", + "tooltip": "Enter how many files you want to create" + }, + "byChapters": { + "name": "Chapters", + "desc": "Split at bookmark boundaries", + "tooltip": "Uses PDF bookmarks to determine split points" + }, + "byPageDivider": { + "name": "Page Divider", + "desc": "Auto-split with divider sheets", + "tooltip": "Use QR code divider sheets between documents when scanning" } }, "value": { "fileSize": { - "label": "MÊid an Chomhaid" + "label": "MÊid an Chomhaid", + "placeholder": "e.g. 10MB, 500KB" + }, + "pageCount": { + "label": "Pages per File", + "placeholder": "e.g. 5, 10" + }, + "docCount": { + "label": "Number of Files", + "placeholder": "e.g. 3, 5" } - } + }, + "tooltip": { + "header": { + "title": "Split Methods Overview" + }, + "byPages": { + "title": "Split at Page Numbers", + "text": "Split your PDF at specific page numbers. Using 'n' splits after page n. Using 'n-m' splits before page n and after page m.", + "bullet1": "Single split points: 3,7 (splits after pages 3 and 7)", + "bullet2": "Range split points: 3-8 (splits before page 3 and after page 8)", + "bullet3": "Mixed: 2,5-10,15 (splits after page 2, before page 5, after page 10, and after page 15)" + }, + "bySections": { + "title": "Split by Grid Sections", + "text": "Divide each page into a grid of sections. Useful for splitting documents with multiple columns or extracting specific areas.", + "bullet1": "Horizontal: Number of rows to create", + "bullet2": "Vertical: Number of columns to create", + "bullet3": "Merge: Combine all sections into one PDF" + }, + "bySize": { + "title": "Split by File Size", + "text": "Create multiple PDFs that don't exceed a specified file size. Ideal for file size limitations or email attachments.", + "bullet1": "Use MB for larger files (e.g., 10MB)", + "bullet2": "Use KB for smaller files (e.g., 500KB)", + "bullet3": "System will split at page boundaries" + }, + "byCount": { + "title": "Split by Count", + "text": "Create multiple PDFs with a specific number of pages or documents each.", + "bullet1": "Page Count: Fixed number of pages per file", + "bullet2": "Document Count: Fixed number of output files", + "bullet3": "Useful for batch processing workflows" + }, + "byChapters": { + "title": "Split by Chapters", + "text": "Use PDF bookmarks to automatically split at chapter boundaries. Requires PDFs with bookmark structure.", + "bullet1": "Bookmark Level: Which level to split on (1=top level)", + "bullet2": "Include Metadata: Preserve document properties", + "bullet3": "Allow Duplicates: Handle repeated bookmark names" + }, + "byDocCount": { + "bullet1": "Enter the number of output files you want", + "bullet2": "Pages are distributed as evenly as possible", + "bullet3": "Useful when you need a specific number of files", + "text": "Create a specific number of output files by evenly distributing pages across them.", + "title": "Split by Document Count" + }, + "byPageCount": { + "bullet1": "Enter the number of pages per output file", + "bullet2": "Last file may have fewer pages if not evenly divisible", + "bullet3": "Useful for batch processing workflows", + "text": "Create multiple PDFs with a specific number of pages each. Perfect for creating uniform document chunks.", + "title": "Split by Page Count" + }, + "byPageDivider": { + "bullet1": "Print divider sheets from the download link", + "bullet2": "Insert divider sheets between your documents", + "bullet3": "Scan all documents together as one PDF", + "bullet4": "Upload - divider pages are automatically detected and removed", + "bullet5": "Enable Duplex Mode if scanning both sides of divider sheets", + "text": "Automatically split scanned documents using physical divider sheets with QR codes. Perfect for processing multiple documents scanned together.", + "title": "Split by Page Divider" + } + }, + "methodSelection": { + "tooltip": { + "bullet1": "Click on a method card to select it", + "bullet2": "Hover over each card to see a quick description", + "bullet3": "The settings step will appear after you select a method", + "bullet4": "You can change methods at any time before processing", + "header": { + "text": "Choose how you want to split your PDF document. Each method is optimized for different use cases and document types.", + "title": "Split Method Selection" + }, + "title": "Choose Your Split Method" + } + }, + "selectMethod": "Select a split method", + "tags": "Oibríochtaí leathanach, roinnt, Leathanach Il, gearrtha, taobh freastalaí" }, "rotate": { - "tags": "taobh freastalaí", "title": "Rothlaigh PDF", + "submit": "Rothlaigh", + "selectRotation": "Select Rotation Angle (Clockwise)", + "error": { + "failed": "An error occurred while rotating the PDF." + }, + "preview": { + "title": "Rotation Preview" + }, + "rotateLeft": "Rotate Anticlockwise", + "rotateRight": "Rotate Clockwise", + "tooltip": { + "header": { + "title": "Rotate Settings Overview" + }, + "description": { + "text": "Rotate your PDF pages clockwise or anticlockwise in 90-degree increments. All pages in the PDF will be rotated. The preview shows how your document will look after rotation." + }, + "controls": { + "title": "Controls", + "text": "Use the rotation buttons to adjust orientation. Left button rotates anticlockwise, right button rotates clockwise. Each click rotates by 90 degrees." + } + }, + "tags": "taobh freastalaí", "header": "Rothlaigh PDF", - "selectAngle": "Roghnaigh uillinn rothlaithe (i iolraí de 90 cÊim):", - "submit": "Rothlaigh" + "selectAngle": "Roghnaigh uillinn rothlaithe (i iolraí de 90 cÊim):" + }, + "convert": { + "title": "Tiontaigh", + "desc": "Convert files between different formats", + "files": "Files", + "selectFilesPlaceholder": "Select files in the main view to get started", + "settings": "Socruithe", + "conversionCompleted": "Conversion completed", + "results": "Results", + "defaultFilename": "converted_file", + "conversionResults": "Conversion Results", + "convertFrom": "Convert from", + "convertTo": "Convert to", + "sourceFormatPlaceholder": "Source format", + "targetFormatPlaceholder": "Target format", + "selectSourceFormatFirst": "Select a source format first", + "outputOptions": "Output Options", + "pdfOptions": "PDF Options", + "imageOptions": "Image Options", + "colorType": "Colour Type", + "color": "Dath", + "greyscale": "ScÃĄla Liath", + "blackwhite": "Black & White", + "dpi": "DPI", + "output": "Output", + "single": "Single", + "multiple": "Multiple", + "fitOption": "Fit Option", + "maintainAspectRatio": "Maintain Aspect Ratio", + "fitDocumentToPage": "Fit Document to Page", + "fillPage": "Líon Leathanach", + "autoRotate": "Auto Rotate", + "autoRotateDescription": "Automatically rotate images to better fit the PDF page", + "combineImages": "Combine Images", + "combineImagesDescription": "Combine all images into one PDF, or create separate PDFs for each image", + "webOptions": "Web to PDF Options", + "zoomLevel": "Zoom Level", + "emailOptions": "Email to PDF Options", + "includeAttachments": "Include email attachments", + "maxAttachmentSize": "Maximum attachment size (MB)", + "includeAllRecipients": "Include CC and BCC recipients in header", + "downloadHtml": "Download HTML intermediate file instead of PDF", + "pdfaOptions": "PDF/A Options", + "outputFormat": "Output Format", + "pdfaNote": "PDF/A-1b is more compatible, PDF/A-2b supports more features.", + "pdfaDigitalSignatureWarning": "TÃĄ síniÃē digiteach ar an PDF. Bainfear Ê seo sa chÊad chÊim eile.", + "fileFormat": "File Format", + "wordDoc": "Word Document", + "wordDocExt": "Word Document (.docx)", + "odtExt": "OpenDocument Text (.odt)", + "pptExt": "PowerPoint (.pptx)", + "odpExt": "OpenDocument Presentation (.odp)", + "txtExt": "Plain Text (.txt)", + "rtfExt": "Rich Text Format (.rtf)", + "selectedFiles": "Selected files", + "noFileSelected": "No file selected. Use the file panel to add files.", + "convertFiles": "Convert Files", + "converting": "Converting...", + "downloadConverted": "Download Converted File", + "errorNoFiles": "Please select at least one file to convert.", + "errorNoFormat": "Please select both source and target formats.", + "errorNotSupported": "Conversion from {{from}} to {{to}} is not supported.", + "images": "Images", + "officeDocs": "Office Documents (Word, Excel, PowerPoint)", + "imagesExt": "Images (JPG, PNG, etc.)", + "markdown": "Markdown", + "textRtf": "Text/RTF", + "grayscale": "ScÃĄla Liath", + "errorConversion": "An error occurred while converting the file." }, "imageToPdf": { "tags": "comhshÃŗ, img, jpg, pictiÃēr, grianghraf" @@ -727,7 +1263,33 @@ "8": "Bain Last", "9": "Bain An ChÊad agus an Deireadh", "10": "Corr-FiÃē Cumaisc", - "11": "Duplicate all pages" + "11": "Duplicate all pages", + "desc": { + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, â€Ļ).", + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, â€Ļ).", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimized for binding on the side)." + } + }, + "desc": { + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, â€Ļ).", + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, â€Ļ).", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimised for binding on the side).", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document." }, "placeholder": "(m.sh. 1,3,2 nÃŗ 4-8,2,10-12 nÃŗ 2n-1)" }, @@ -739,9 +1301,198 @@ "upload": "Cuir íomhÃĄ leis", "submit": "Cuir íomhÃĄ leis" }, + "attachments": { + "tags": "embed,attach,file,attachment,attachments", + "title": "Add attachments", + "header": "Add attachments", + "add": "Add Attachment", + "remove": "Remove Attachment", + "embed": "Embed Attachment", + "submit": "Add attachments" + }, "watermark": { - "tags": "TÊacs, athrÃĄ, lipÊad, ÃēinÊireacht, cÃŗipcheart, trÃĄdmharc, img, jpg, pictiÃēr, grianghraf", "title": "Cuir Uisce leis", + "desc": "Add text or image watermarks to PDF files", + "completed": "Watermark added", + "submit": "Cuir Uisce leis", + "filenamePrefix": "watermarked", + "error": { + "failed": "An error occurred while adding watermark to the PDF." + }, + "watermarkType": { + "text": "TÊacs", + "image": "Image" + }, + "settings": { + "type": "Watermark Type", + "text": { + "label": "Watermark Text", + "placeholder": "Enter watermark text" + }, + "image": { + "label": "Watermark Image", + "choose": "Choose Image", + "selected": "Selected: {{filename}}" + }, + "fontSize": "MÊid an ChlÃŗ", + "size": "Size", + "alphabet": "Font/Language", + "color": "Watermark Colour", + "rotation": "Rotation (degrees)", + "opacity": "Opacity (%)", + "spacing": { + "horizontal": "Horizontal Spacing", + "vertical": "Vertical Spacing", + "height": "Height Spacing", + "width": "Width Spacing" + }, + "convertToImage": "Flatten PDF pages to images" + }, + "alphabet": { + "roman": "Roman/Latin", + "arabic": "Arabic", + "japanese": "Japanese", + "korean": "Korean", + "chinese": "Chinese", + "thai": "Thai" + }, + "steps": { + "type": "Watermark Type", + "wording": "Wording", + "textStyle": "Style", + "formatting": "Formatting", + "file": "Watermark File" + }, + "results": { + "title": "Watermark Results" + }, + "tooltip": { + "language": { + "title": "Language Support", + "text": "Choose the appropriate language setting to ensure proper font rendering for your text." + }, + "appearance": { + "title": "Appearance Settings", + "text": "Control how your watermark looks and blends with the document.", + "bullet1": "Rotation: -360° to 360° for angled watermarks", + "bullet2": "Opacity: 0-100% for transparency control", + "bullet3": "Lower opacity creates subtle watermarks" + }, + "spacing": { + "title": "Spacing Control", + "text": "Adjust the spacing between repeated watermarks across the page.", + "bullet1": "Width spacing: Horizontal distance between watermarks", + "bullet2": "Height spacing: Vertical distance between watermarks", + "bullet3": "Higher values create more spread out patterns" + }, + "type": { + "header": { + "title": "Watermark Type Selection" + }, + "description": { + "title": "Choose Your Watermark", + "text": "Select between text or image watermarks based on your needs." + }, + "text": { + "title": "Text Watermarks", + "text": "Perfect for adding copyright notices, company names, or confidentiality labels. Supports multiple languages and custom colours.", + "bullet1": "Customisable fonts and languages", + "bullet2": "Adjustable colours and transparency", + "bullet3": "Ideal for legal or branding text" + }, + "image": { + "title": "Image Watermarks", + "text": "Use logos, stamps, or any image as a watermark. Great for branding and visual identification.", + "bullet1": "Upload any image format", + "bullet2": "Maintains image quality", + "bullet3": "Perfect for logos and stamps" + } + }, + "wording": { + "header": { + "title": "Text Content" + }, + "text": { + "title": "Watermark Text", + "text": "Enter the text that will appear as your watermark across the document.", + "bullet1": "Keep it concise for better readability", + "bullet2": "Common examples: 'CONFIDENTIAL', 'DRAFT', company name", + "bullet3": "Emoji characters are not supported and will be filtered out" + } + }, + "textStyle": { + "header": { + "title": "Text Style" + }, + "color": { + "title": "Colour Selection", + "text": "Choose a colour that provides good contrast with your document content.", + "bullet1": "Light grey (#d3d3d3) for subtle watermarks", + "bullet2": "Black or dark colours for high contrast", + "bullet3": "Custom colours for branding purposes" + }, + "language": { + "title": "Language Support", + "text": "Choose the appropriate language setting to ensure proper font rendering." + } + }, + "file": { + "header": { + "title": "Image Upload" + }, + "upload": { + "title": "Image Selection", + "text": "Upload an image file to use as your watermark.", + "bullet1": "Supports common formats: PNG, JPG, GIF, BMP", + "bullet2": "PNG with transparency works best", + "bullet3": "Higher resolution images maintain quality better" + }, + "recommendations": { + "title": "Best Practices", + "text": "Tips for optimal image watermark results.", + "bullet1": "Use logos or stamps with transparent backgrounds", + "bullet2": "Simple designs work better than complex images", + "bullet3": "Consider the final document size when choosing resolution" + } + }, + "formatting": { + "header": { + "title": "Formatting & Layout" + }, + "size": { + "title": "Size Control", + "text": "Adjust the size of your watermark (text or image).", + "bullet1": "Larger sizes create more prominent watermarks" + }, + "appearance": { + "title": "Appearance Settings", + "text": "Control how your watermark looks and blends with the document.", + "bullet1": "Rotation: -360° to 360° for angled watermarks", + "bullet2": "Opacity: 0-100% for transparency control", + "bullet3": "Lower opacity creates subtle watermarks" + }, + "spacing": { + "title": "Spacing Control", + "text": "Adjust the spacing between repeated watermarks across the page.", + "bullet1": "Horizontal spacing: Distance between watermarks left to right", + "bullet2": "Vertical spacing: Distance between watermarks top to bottom", + "bullet3": "Higher values create more spread out patterns" + }, + "security": { + "title": "Security Option", + "text": "Convert the final PDF to an image-based format for enhanced security.", + "bullet1": "Prevents text selection and copying", + "bullet2": "Makes watermarks harder to remove", + "bullet3": "Results in larger file sizes", + "bullet4": "Best for sensitive or copyrighted content" + } + } + }, + "type": { + "1": "TÊacs", + "2": "Íomha" + }, + "tags": "TÊacs, athrÃĄ, lipÊad, ÃēinÊireacht, cÃŗipcheart, trÃĄdmharc, img, jpg, pictiÃēr, grianghraf", "header": "Cuir Uisce leis", "customColor": "Dath TÊacs Saincheaptha", "selectText": { @@ -755,17 +1506,6 @@ "8": "CineÃĄl Comhartha Uisce:", "9": "ÍomhÃĄ Comhartha Uisce:", "10": "Tiontaigh PDF go PDF-ÍomhÃĄ" - }, - "submit": "Cuir Uisce leis", - "type": { - "1": "TÊacs", - "2": "Íomha" - }, - "watermarkType": { - "text": "TÊacs" - }, - "settings": { - "fontSize": "MÊid an ChlÃŗ" } }, "permissions": { @@ -790,50 +1530,201 @@ "removePages": { "tags": "Bain leathanaigh, scrios leathanaigh", "title": "Bain", + "pageNumbers": { + "label": "Pages to Remove", + "placeholder": "e.g., 1,3,5-8,10", + "error": "Invalid page number format. Use numbers, ranges (1-5), or mathematical expressions (2n+1)" + }, + "filenamePrefix": "pages_removed", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "settings": { + "title": "Settings" + }, + "tooltip": { + "header": { + "title": "Remove Pages Settings" + }, + "pageNumbers": { + "title": "Page Selection", + "text": "Specify which pages to remove from your PDF. You can select individual pages, ranges, or use mathematical expressions.", + "bullet1": "Individual pages: 1,3,5 (removes pages 1, 3, and 5)", + "bullet2": "Page ranges: 1-5,10-15 (removes pages 1-5 and 10-15)", + "bullet3": "Mathematical: 2n+1 (removes odd pages)", + "bullet4": "Open ranges: 5- (removes from page 5 to end)" + }, + "examples": { + "title": "Common Examples", + "text": "Here are some common page selection patterns:", + "bullet1": "Remove first page: 1", + "bullet2": "Remove last 3 pages: -3", + "bullet3": "Remove every other page: 2n", + "bullet4": "Remove specific scattered pages: 1,5,10,15" + }, + "safety": { + "title": "Safety Tips", + "text": "Important considerations when removing pages:", + "bullet1": "Always preview your selection before processing", + "bullet2": "Keep a backup of your original file", + "bullet3": "Page numbers start from 1, not 0", + "bullet4": "Invalid page numbers will be ignored" + } + }, + "error": { + "failed": "An error occurred whilst removing pages." + }, + "results": { + "title": "Page Removal Results" + }, "submit": "Bain" }, - "addPassword": { - "tags": "slÃĄn, slÃĄndÃĄil", - "title": "Cuir Pasfhocal leis", - "header": "Cuir pasfhocal leis (Criptigh)", - "selectText": { - "1": "Roghnaigh PDF le criptiÃē", - "2": "Pasfhocal ÚsÃĄideora", - "3": "Fad Eochracha Criptithe", - "4": "TÃĄ luachanna níos airde níos lÃĄidre, ach tÃĄ comhoiriÃēnacht níos fearr ag luachanna níos ísle.", - "5": "Ceadanna le socrÃē (Moltar iad a ÃēsÃĄid in Êineacht le pasfhocal an ÚinÊara)", - "6": "Cosc a chur le chÊile doicimÊad", - "7": "Cosc a chur ar eastÃŗscadh ÃĄbhar", - "8": "Cosc a chur ar eastÃŗscadh le haghaidh inrochtaineachta", - "9": "Cosc ar fhoirm a líonadh", - "10": "Cosc a chur ar mhodhnÃē", - "11": "Cosc a chur ar mhodhnÃē anÃŗtÃĄla", - "12": "Cosc a chur ar phriontÃĄil", - "13": "Cosc a chur ar phriontÃĄil bhformÃĄidí ÊagsÃēla", - "14": "Pasfhocal ÚinÊir", - "15": "Cuireann sÊ srian lenar fÊidir a dhÊanamh leis an doicimÊad nuair a osclaítear Ê (Ní thacaíonn gach lÊitheoir leis)", - "16": "Cuireann sÊ srian le hoscailt an doicimÊid fÊin" + "extractPages": { + "title": "Extract Pages", + "pageNumbers": { + "label": "Pages to Extract", + "placeholder": "e.g., 1,3,5-8 or odd & 1-10" + }, + "settings": { + "title": "Settings" }, - "submit": "Criptigh", "tooltip": { - "permissions": { - "title": "AthrÃē Ceadanna" + "description": "Extracts the selected pages into a new PDF, preserving order." + }, + "error": { + "failed": "Failed to extract pages" + }, + "results": { + "title": "Pages Extracted" + }, + "submit": "Extract Pages" + }, + "pageSelection": { + "tooltip": { + "header": { + "title": "Page Selection Guide" + }, + "basic": { + "title": "Basic Usage", + "text": "Select specific pages from your PDF document using simple syntax.", + "bullet1": "Individual pages: 1,3,5", + "bullet2": "Page ranges: 3-6 or 10-15", + "bullet3": "All pages: all" + }, + "advanced": { + "title": "Advanced Features" + }, + "tips": { + "title": "Tips", + "text": "Keep these guidelines in mind:", + "bullet1": "Page numbers start from 1 (not 0)", + "bullet2": "Spaces are automatically removed", + "bullet3": "Invalid expressions are ignored" + }, + "syntax": { + "title": "Syntax Basics", + "text": "Use numbers, ranges, keywords, and progressions (n starts at 0). Parentheses are supported.", + "bullets": { + "numbers": "Numbers/ranges: 5, 10-20", + "keywords": "Keywords: odd, even", + "progressions": "Progressions: 3n, 4n+1" + } + }, + "operators": { + "title": "Operators", + "text": "AND has higher precedence than comma. NOT applies within the document range.", + "and": "AND: & or \"and\" — require both conditions (e.g., 1-50 & even)", + "comma": "Comma: , or | — combine selections (e.g., 1-10, 20)", + "not": "NOT: ! or \"not\" — exclude pages (e.g., 3n & not 30)" + }, + "examples": { + "title": "Examples" + }, + "complex": { + "bullet1": "1,3-5,8,2n → pages 1, 3–5, 8, plus evens", + "bullet2": "10-,2n-1 → from page 10 to end + odd pages", + "description": "Mix different types.", + "title": "Complex Combinations" + }, + "description": "Choose which pages to use for the operation. Supports single pages, ranges, formulas, and the all keyword.", + "individual": { + "bullet1": "1,3,5 → selects pages 1, 3, 5", + "bullet2": "2,7,12 → selects pages 2, 7, 12", + "description": "Enter numbers separated by commas.", + "title": "Individual Pages" + }, + "mathematical": { + "bullet1": "2n → all even pages (2, 4, 6â€Ļ)", + "bullet2": "2n-1 → all odd pages (1, 3, 5â€Ļ)", + "bullet3": "3n → every 3rd page (3, 6, 9â€Ļ)", + "bullet4": "4n-1 → pages 3, 7, 11, 15â€Ļ", + "description": "Use n in formulas for patterns.", + "title": "Mathematical Functions" + }, + "ranges": { + "bullet1": "3-6 → selects pages 3–6", + "bullet2": "10-15 → selects pages 10–15", + "bullet3": "5- → selects pages 5 to end", + "description": "Use - for consecutive pages.", + "title": "Page Ranges" + }, + "special": { + "bullet1": "all → selects all pages", + "title": "Special Keywords" } } }, - "removePassword": { - "tags": "slÃĄn, DíchriptiÃē, slÃĄndÃĄil, Unpassword, scrios pasfhocal", - "title": "Bain pasfhocal", - "header": "Bain pasfhocal (Díchriptigh)", - "selectText": { - "1": "Roghnaigh PDF le DíchriptiÃē", - "2": "Pasfhocal" + "bulkSelection": { + "syntaxError": "There is a syntax issue. See Page Selection tips for help.", + "header": { + "title": "Page Selection Guide" }, - "submit": "Bain", - "desc": "Bain cosaint phasfhocal Ãŗ do dhoicimÊad PDF.", - "password": { - "stepTitle": "Bain Pasfhocal", - "label": "Pasfhocal reatha" + "syntax": { + "title": "Syntax Basics", + "text": "Use numbers, ranges, keywords, and progressions (n starts at 0). Parentheses are supported.", + "bullets": { + "numbers": "Numbers/ranges: 5, 10-20", + "keywords": "Keywords: odd, even", + "progressions": "Progressions: 3n, 4n+1" + } + }, + "operators": { + "title": "Operators", + "text": "AND has higher precedence than comma. NOT applies within the document range.", + "and": "AND: & or \"and\" — require both conditions (e.g., 1-50 & even)", + "comma": "Comma: , or | — combine selections (e.g., 1-10, 20)", + "not": "NOT: ! or \"not\" — exclude pages (e.g., 3n & not 30)" + }, + "examples": { + "title": "Examples", + "first50": "First 50", + "last50": "Last 50", + "every3rd": "Every 3rd", + "oddWithinExcluding": "Odd within 1-20 excluding 5-7", + "combineSets": "Combine sets" + }, + "firstNPages": { + "title": "First N Pages", + "placeholder": "Number of pages" + }, + "lastNPages": { + "title": "Last N Pages", + "placeholder": "Number of pages" + }, + "everyNthPage": { + "title": "Every Nth Page", + "placeholder": "Step size" + }, + "range": { + "title": "Range", + "fromPlaceholder": "From", + "toPlaceholder": "To" + }, + "keywords": { + "title": "Keywords" + }, + "advanced": { + "title": "Advanced" } }, "compressPdfs": { @@ -843,12 +1734,142 @@ "tags": "remove,delete,form,field,readonly", "title": "Remove Read-Only from Form Fields", "header": "Unlock PDF Forms", - "submit": "Remove" + "submit": "Remove", + "description": "This tool will remove read-only restrictions from PDF form fields, making them editable and fillable.", + "filenamePrefix": "unlocked_forms", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst unlocking PDF forms." + }, + "results": { + "title": "Unlocked Forms Results" + } }, "changeMetadata": { - "tags": "Teideal,Ãēdar, dÃĄta, cruthÃē, am, foilsitheoir, lÊiritheoir, staitisticí", - "title": "Athraigh Meiteashonraí", "header": "Athraigh Meiteashonraí", + "submit": "AthrÃē", + "filenamePrefix": "metadata", + "settings": { + "title": "Metadata Settings" + }, + "standardFields": { + "title": "Standard Fields" + }, + "deleteAll": { + "label": "Remove Existing Metadata", + "checkbox": "Delete all metadata" + }, + "title": { + "label": "Title", + "placeholder": "Document title" + }, + "author": { + "label": "Author", + "placeholder": "Document author" + }, + "subject": { + "label": "Subject", + "placeholder": "Document subject" + }, + "keywords": { + "label": "Keywords", + "placeholder": "Document keywords" + }, + "creator": { + "label": "Creator", + "placeholder": "Document creator" + }, + "producer": { + "label": "Producer", + "placeholder": "Document producer" + }, + "dates": { + "title": "Date Fields" + }, + "creationDate": { + "label": "Creation Date", + "placeholder": "Creation date" + }, + "modificationDate": { + "label": "Modification Date", + "placeholder": "Modification date" + }, + "trapped": { + "label": "Trapped Status", + "unknown": "Unknown", + "true": "True", + "false": "False" + }, + "advanced": { + "title": "Advanced Options" + }, + "customFields": { + "title": "Custom Metadata", + "description": "Add custom metadata fields to the document", + "add": "Add Field", + "key": "Key", + "keyPlaceholder": "Custom key", + "value": "Value", + "valuePlaceholder": "Custom value", + "remove": "Remove" + }, + "results": { + "title": "Updated PDFs" + }, + "error": { + "failed": "An error occurred while changing the PDF metadata." + }, + "tooltip": { + "header": { + "title": "PDF Metadata Overview" + }, + "standardFields": { + "title": "Standard Fields", + "text": "Common PDF metadata fields that describe the document.", + "bullet1": "Title: Document name or heading", + "bullet2": "Author: Person who created the document", + "bullet3": "Subject: Brief description of content", + "bullet4": "Keywords: Search terms for the document", + "bullet5": "Creator/Producer: Software used to create the PDF" + }, + "dates": { + "title": "Date Fields", + "text": "When the document was created and modified.", + "bullet1": "Creation Date: When original document was made", + "bullet2": "Modification Date: When last changed" + }, + "options": { + "title": "Additional Options", + "text": "Custom fields and privacy controls.", + "bullet1": "Custom Metadata: Add your own key-value pairs", + "bullet2": "Trapped Status: High-quality printing setting", + "bullet3": "Delete All: Remove all metadata for privacy" + }, + "deleteAll": { + "title": "Remove Existing Metadata", + "text": "Complete metadata deletion to ensure privacy." + }, + "customFields": { + "title": "Custom Metadata", + "text": "Add your own custom key-value metadata pairs.", + "bullet1": "Add any custom fields relevant to your document", + "bullet2": "Examples: Department, Project, Version, Status", + "bullet3": "Both key and value are required for each entry" + }, + "advanced": { + "title": "Advanced Options", + "trapped": { + "title": "Trapped Status", + "description": "Indicates if document is prepared for high-quality printing.", + "bullet1": "True: Document has been trapped for printing", + "bullet2": "False: Document has not been trapped", + "bullet3": "Unknown: Trapped status is not specified" + } + } + }, + "tags": "Teideal,Ãēdar, dÃĄta, cruthÃē, am, foilsitheoir, lÊiritheoir, staitisticí", "selectText": { "1": "Cuir na hathrÃŗga is mian leat a athrÃē in eagar", "2": "Scrios na meiteashonraí go lÊir", @@ -856,15 +1877,7 @@ "4": "Meiteashonraí Eile:", "5": "Cuir IontrÃĄil Meiteashonraí Saincheaptha leis" }, - "author": "Údar:", - "creationDate": "DÃĄta Cruthaithe (bbbb/MM/ll HH:mm:ss):", - "creator": "Cruthaitheoir:", - "keywords": "Eochairfhocail:", - "modDate": "DÃĄta Mionathraithe (bbbb/MM/ll HH:mm:ss):", - "producer": "lÊiritheoir:", - "subject": "Ábhar:", - "trapped": "Gafa:", - "submit": "AthrÃē" + "modDate": "DÃĄta Mionathraithe (bbbb/MM/ll HH:mm:ss):" }, "fileToPDF": { "tags": "claochlÃē, formÃĄid, doicimÊad, pictiÃēr, sleamhnÃĄn, tÊacs, comhshÃŗ, oifig, docs, focal, excel, powerpoint", @@ -878,6 +1891,7 @@ "ocr": { "tags": "aithint, tÊacs, íomhÃĄ, scanadh, lÊamh, a aithint, a bhrath, in eagar", "title": "OCR / Glanta Scan", + "desc": "Scanann glantachÃĄn agus aimsíonn sÊ tÊacs Ãŗ íomhÃĄnna laistigh de PDF agus cuireann sÊ isteach arís Ê mar thÊacs.", "header": "Scananna Glanta / OCR (Aithint OptÃēil Carachtair)", "selectText": { "1": "Roghnaigh teangacha atÃĄ le brath laistigh den PDF (Is iad na cinn a liostaítear na cinn a aimsítear faoi lÃĄthair):", @@ -896,23 +1910,89 @@ "help": "LÊigh le do thoil an doicimÊadÃē seo ar conas Ê seo a ÃēsÃĄid do theangacha eile agus/nÃŗ ÃēsÃĄid nach bhfuil i ndugairí", "credit": "ÚsÃĄideann an tseirbhís seo qpdf agus Tesseract le haghaidh OCR.", "submit": "PrÃŗiseÃĄil PDF le OCR", - "desc": "Scanann glantachÃĄn agus aimsíonn sÊ tÊacs Ãŗ íomhÃĄnna laistigh de PDF agus cuireann sÊ isteach arís Ê mar thÊacs.", + "operation": { + "submit": "Process OCR and Review" + }, + "results": { + "title": "OCR Results" + }, + "languagePicker": { + "additionalLanguages": "Looking for additional languages?", + "viewSetupGuide": "View setup guide →" + }, "settings": { "title": "Socruithe", "ocrMode": { - "label": "MÃŗd OCR" + "label": "MÃŗd OCR", + "auto": "Auto (skip text layers)", + "force": "Force (re-OCR all, replace text)", + "strict": "Strict (abort if text found)" }, "languages": { - "label": "Teangacha" + "label": "Teangacha", + "placeholder": "Select languages" + }, + "compatibilityMode": { + "label": "Compatibility Mode" + }, + "advancedOptions": { + "label": "Processing Options", + "sidecar": "Create a text file", + "deskew": "Deskew pages", + "clean": "Clean input file", + "cleanFinal": "Clean final output" } }, "tooltip": { + "header": { + "title": "OCR Settings Overview" + }, "mode": { - "title": "MÃŗd OCR" + "title": "MÃŗd OCR", + "text": "Optical Character Recognition (OCR) helps you turn scanned or screenshotted pages into text you can search, copy, or highlight.", + "bullet1": "Auto skips pages that already contain text layers.", + "bullet2": "Force re-OCRs every page and replaces all the text.", + "bullet3": "Strict halts if any selectable text is found." }, "languages": { - "title": "Teangacha" + "title": "Teangacha", + "text": "Improve OCR accuracy by specifying the expected languages. Choose one or more languages to guide detection." + }, + "output": { + "title": "Output", + "text": "Decide how you want the text output formatted:", + "bullet1": "Searchable PDF embeds text behind the original image.", + "bullet2": "HOCR XML returns a structured machine-readable file.", + "bullet3": "Plain-text sidecar creates a separate .txt file with raw content." + }, + "advanced": { + "header": { + "title": "Advanced OCR Processing" + }, + "compatibility": { + "title": "Compatibility Mode", + "text": "Uses OCR 'sandwich PDF' mode: results in larger files, but more reliable with certain languages and older PDF software. By default we use hOCR for smaller, modern PDFs." + }, + "sidecar": { + "title": "Create Text File", + "text": "Generates a separate .txt file alongside the PDF containing all extracted text content for easy access and processing." + }, + "deskew": { + "title": "Deskew Pages", + "text": "Automatically corrects skewed or tilted pages to improve OCR accuracy. Useful for scanned documents that weren't perfectly aligned." + }, + "clean": { + "title": "Clean Input File", + "text": "Preprocesses the input by removing noise, enhancing contrast, and optimising the image for better OCR recognition before processing." + }, + "cleanFinal": { + "title": "Clean Final Output", + "text": "Post-processes the final PDF by removing OCR artefacts and optimising the text layer for better readability and smaller file size." + } } + }, + "error": { + "failed": "OCR operation failed" } }, "extractImages": { @@ -921,7 +2001,13 @@ "header": "Sliocht ÍomhÃĄnna", "selectText": "Roghnaigh formÃĄid íomhÃĄ chun íomhÃĄnna bainte a thiontÃē go", "allowDuplicates": "SÃĄbhÃĄil íomhÃĄnna dÃēblacha", - "submit": "Sliocht" + "submit": "Sliocht", + "settings": { + "title": "Settings" + }, + "error": { + "failed": "An error occurred while extracting images from the PDF." + } }, "pdfToPDFA": { "tags": "cartlann, fadtÊarmach, caighdeÃĄnach, comhshÃŗ, stÃŗrÃĄil, caomhnÃē", @@ -993,17 +2079,53 @@ }, "info": "Níl Python suiteÃĄilte. TÃĄ sÊ ag teastÃĄil a rith." }, + "scannerImageSplit": { + "title": "Extracted Images", + "submit": "Extract Image Scans", + "error": { + "failed": "An error occurred while extracting image scans." + }, + "tooltip": { + "title": "Photo Splitter", + "whatThisDoes": "What this does", + "whatThisDoesDesc": "Automatically finds and extracts each photo from a scanned page or composite image—no manual cropping.", + "whenToUse": "When to use", + "useCase1": "Scan whole album pages in one go", + "useCase2": "Split flatbed batches into separate files", + "useCase3": "Break collages into individual photos", + "useCase4": "Pull photos from documents", + "quickFixes": "Quick fixes", + "problem1": "Photos not detected → increase Tolerance to 30-50", + "problem2": "Too many false detections → increase Minimum Area to 15,000-20,000", + "problem3": "Crops are too tight → increase Border Size to 5-10", + "problem4": "Tilted photos not straightened → lower Angle Threshold to ~5°", + "problem5": "Dust/noise boxes → increase Minimum Contour Area to 1000-2000", + "setupTips": "Setup tips", + "tip1": "Use a plain, light background", + "tip2": "Leave a small gap (≈1 cm) between photos", + "tip3": "Scan at 300-600 DPI", + "tip4": "Clean the scanner glass", + "headsUp": "Heads-up", + "headsUpDesc": "Overlapping photos or backgrounds very close in colour to the photos can reduce accuracy-try a lighter or darker background and leave more space." + } + }, "sign": { - "tags": "ÃēdarÃē, tosaigh, síniÃē tarraingthe, comhartha tÊacs, íomhÃĄ-shíniÃē", "title": "Comhartha", "header": "Sínigh comhaid PDF", "upload": "UaslÃŗdÃĄil ÍomhÃĄ", - "draw": "Tarraing SíniÃē", - "text": "Ionchur TÊacs", + "draw": { + "title": "Draw your signature", + "clear": "Clear" + }, + "text": { + "name": "Signer Name", + "placeholder": "Enter your full name" + }, "clear": "Glan", "add": "Cuir", "saved": "Sínithe Sínithe", "save": "SÃĄbhÃĄil an SíniÃē", + "applySignatures": "Apply Signatures", "personalSigs": "Sínithe Pearsanta", "sharedSigs": "Sínithe Roinnte", "noSavedSigs": "Níor aimsíodh aon síniÃē sÃĄbhÃĄilte", @@ -1015,42 +2137,179 @@ "previous": "Leathanach roimhe seo", "maintainRatio": "ScorÃĄnaigh, coinnigh an cÃŗimheas gnÊ", "undo": "Undo", - "redo": "Redo" + "redo": "Redo", + "submit": "Sign Document", + "steps": { + "configure": "Configure Signature" + }, + "type": { + "title": "Signature Type", + "draw": "Draw", + "canvas": "Canvas", + "image": "Image", + "text": "Text" + }, + "image": { + "label": "Upload signature image", + "placeholder": "Select image file", + "hint": "Upload a PNG or JPG image of your signature" + }, + "instructions": { + "title": "How to add signature", + "canvas": "After drawing your signature in the canvas, close the modal then click anywhere on the PDF to place it.", + "image": "After uploading your signature image above, click anywhere on the PDF to place it.", + "text": "After entering your name above, click anywhere on the PDF to place your signature." + }, + "mode": { + "move": "Move Signature", + "place": "Place Signature" + }, + "updateAndPlace": "Update and Place", + "activate": "Activate Signature Placement", + "deactivate": "Stop Placing Signatures", + "results": { + "title": "Signature Results" + }, + "error": { + "failed": "An error occurred while signing the PDF." + }, + "tags": "ÃēdarÃē, tosaigh, síniÃē tarraingthe, comhartha tÊacs, íomhÃĄ-shíniÃē" }, "flatten": { - "tags": "statach, díghníomhachtÃē, neamh-idirghníomhach, sruthlíniÃē", "title": "Comhcheangail", "header": "PDF cothromÃē", "flattenOnlyForms": "Flatten foirmeacha amhÃĄin", "submit": "Comhcheangail", + "filenamePrefix": "flattened", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, "steps": { "settings": "Socruithe" }, "options": { - "flattenOnlyForms": "Flatten foirmeacha amhÃĄin" - } + "stepTitle": "Flatten Options", + "title": "Flatten Options", + "flattenOnlyForms": { + "label": "Flatten foirmeacha amhÃĄin", + "desc": "Only flatten form fields, leaving other interactive elements intact" + }, + "note": "Flattening removes interactive elements from the PDF, making them non-editable." + }, + "results": { + "title": "Flatten Results" + }, + "error": { + "failed": "An error occurred while flattening the PDF." + }, + "tooltip": { + "header": { + "title": "About Flattening PDFs" + }, + "description": { + "title": "What does flattening do?", + "text": "Flattening makes your PDF non-editable by turning fillable forms and buttons into regular text and images. The PDF will look exactly the same, but no one can change or fill in the forms anymore. Perfect for sharing completed forms, creating final documents for records, or ensuring the PDF looks the same everywhere.", + "bullet1": "Text boxes become regular text (can't be edited)", + "bullet2": "Checkboxes and buttons become pictures", + "bullet3": "Great for final versions you don't want changed", + "bullet4": "Ensures consistent appearance across all devices" + }, + "formsOnly": { + "title": "What does 'Flatten only forms' mean?", + "text": "This option only removes the ability to fill in forms, but keeps other features working like clicking links, viewing bookmarks, and reading comments.", + "bullet1": "Forms become non-editable", + "bullet2": "Links still work when clicked", + "bullet3": "Comments and notes remain visible", + "bullet4": "Bookmarks still help you navigate" + } + }, + "tags": "statach, díghníomhachtÃē, neamh-idirghníomhach, sruthlíniÃē" }, "repair": { "tags": "deisiÃē, athchÃŗiriÃē, ceartÃē, aisghabhÃĄil", "title": "DeisiÃēchÃĄn", "header": "PDF a dheisiÃē", - "submit": "DeisiÃēchÃĄn" + "submit": "DeisiÃēchÃĄn", + "description": "This tool will attempt to repair corrupted or damaged PDF files. No additional settings are required.", + "filenamePrefix": "repaired", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst repairing the PDF." + }, + "results": { + "title": "Repair Results" + } }, "removeBlanks": { - "tags": "glanta, sruthlíniÃē, neamhÃĄbhar, eagrÃē", "title": "Bain Bearnaí", "header": "Bain Leathanaigh BhÃĄna", - "threshold": "Tairseach BÃĄnachta picteilíní:", + "settings": { + "title": "Settings" + }, + "threshold": { + "label": "Pixel Whiteness Threshold" + }, + "whitePercent": { + "label": "White Percentage Threshold", + "unit": "%" + }, + "includeBlankPages": { + "label": "Include detected blank pages" + }, + "tooltip": { + "header": { + "title": "Remove Blank Pages Settings" + }, + "threshold": { + "title": "Pixel Whiteness Threshold", + "text": "Controls how white a pixel must be to be considered 'white'. This helps determine what counts as a blank area on the page.", + "bullet1": "0 = Pure black (most restrictive)", + "bullet2": "128 = Medium grey", + "bullet3": "255 = Pure white (least restrictive)" + }, + "whitePercent": { + "title": "White Percentage Threshold", + "text": "Sets the minimum percentage of white pixels required for a page to be considered blank and removed.", + "bullet1": "Lower values (e.g., 80%) = More pages removed", + "bullet2": "Higher values (e.g., 95%) = Only very blank pages removed", + "bullet3": "Use higher values for documents with light backgrounds" + }, + "includeBlankPages": { + "title": "Include Detected Blank Pages", + "text": "When enabled, creates a separate PDF containing all the blank pages that were detected and removed from the original document.", + "bullet1": "Useful for reviewing what was removed", + "bullet2": "Helps verify the detection accuracy", + "bullet3": "Can be disabled to reduce output file size" + } + }, + "submit": "Bain Bearnaí", + "error": { + "failed": "Failed to remove blank pages" + }, + "results": { + "title": "Removed Blank Pages" + }, + "tags": "glanta, sruthlíniÃē, neamhÃĄbhar, eagrÃē", "thresholdDesc": "An tairseach chun a chinneadh cÊ chomh bÃĄn is gÃĄ picteilín bÃĄn a bheith le rangÃē mar 'BÃĄn'. 0", - "whitePercent": "CÊatadÃĄn BÃĄn (%):", - "whitePercentDesc": "CÊatadÃĄn an leathanaigh a chaithfidh picteilíní 'bÃĄn' a bheith ann lena bhaint", - "submit": "Bain Bearnaí" + "whitePercentDesc": "CÊatadÃĄn an leathanaigh a chaithfidh picteilíní 'bÃĄn' a bheith ann lena bhaint" }, "removeAnnotations": { "tags": "tuairimí, aibhsiÃē, nÃŗtaí, marcÃĄil, bain", "title": "Bain AnÃŗtÃĄlacha", "header": "Bain AnÃŗtÃĄlacha", - "submit": "Bain" + "submit": "Bain", + "settings": { + "title": "Settings" + }, + "info": { + "title": "About Remove Annotations", + "description": "This tool will remove all annotations (comments, highlights, notes, etc.) from your PDF documents." + }, + "error": { + "failed": "An error occurred while removing annotations from the PDF." + } }, "compare": { "tags": "idirdhealÃē, codarsnacht, athruithe, anailís", @@ -1082,6 +2341,142 @@ "certSign": { "tags": "fíordheimhnigh, PEM, P12, oifigiÃēil, criptigh", "title": "SíniÃē Teastais", + "filenamePrefix": "signed", + "signMode": { + "stepTitle": "Sign Mode", + "tooltip": { + "header": { + "title": "About PDF Signatures" + }, + "overview": { + "title": "How signatures work", + "text": "Both modes seal the document (any edits are flagged as tampering) and record who/when/how for auditing. Viewer trust depends on the certificate chain." + }, + "manual": { + "title": "Manual - Bring your certificate", + "text": "Use your own certificate files for brand-aligned identity. Can display Trusted when your CA/chain is recognised.", + "use": "Use for: customer-facing, legal, compliance." + }, + "auto": { + "title": "Auto - Zero-setup, instant system seal", + "text": "Signs with a server self-signed certificate. Same tamper-evident seal and audit trail; typically shows Unverified in viewers.", + "use": "Use when: you need speed and consistent internal identity across reviews and records." + }, + "rule": { + "title": "Rule of thumb", + "text": "Need recipient Trusted status? Manual. Need a fast, tamper-evident seal and audit trail with no setup? Auto." + } + } + }, + "certTypeStep": { + "stepTitle": "Certificate Format" + }, + "certFiles": { + "stepTitle": "Certificate Files" + }, + "appearance": { + "stepTitle": "Signature Appearance", + "tooltip": { + "header": { + "title": "About Signature Appearance" + }, + "invisible": { + "title": "Invisible Signatures", + "text": "The signature is added to the PDF for security but won't be visible when viewing the document. Perfect for legal requirements without changing the document's appearance.", + "bullet1": "Provides security without visual changes", + "bullet2": "Meets legal requirements for digital signing", + "bullet3": "Doesn't affect document layout or design" + }, + "visible": { + "title": "Visible Signatures", + "text": "Shows a signature block on the PDF with your name, date, and optional details. Useful when you want readers to clearly see the document is signed.", + "bullet1": "Shows signer name and date on the document", + "bullet2": "Can include reason and location for signing", + "bullet3": "Choose which page to place the signature", + "bullet4": "Optional logo can be included" + } + }, + "invisible": "Invisible", + "options": { + "title": "Signature Details" + }, + "visible": "Visible" + }, + "sign": { + "submit": "Sign PDF", + "results": "Signed PDF" + }, + "error": { + "failed": "An error occurred whilst processing signatures." + }, + "tooltip": { + "header": { + "title": "About Managing Signatures" + }, + "overview": { + "title": "What can this tool do?", + "text": "This tool lets you check if your PDFs are digitally signed and add new digital signatures. Digital signatures prove who created or approved a document and show if it has been changed since signing.", + "bullet1": "Check existing signatures and their validity", + "bullet2": "View detailed information about signers and certificates", + "bullet3": "Add new digital signatures to secure your documents", + "bullet4": "Multiple files supported with easy navigation" + }, + "validation": { + "title": "Checking Signatures", + "text": "When you check signatures, the tool tells you if they're valid, who signed the document, when it was signed, and whether the document has been changed since signing.", + "bullet1": "Shows if signatures are valid or invalid", + "bullet2": "Displays signer information and signing date", + "bullet3": "Checks if the document was modified after signing", + "bullet4": "Can use custom certificates for verification" + }, + "signing": { + "title": "Adding Signatures", + "text": "To sign a PDF, you need a digital certificate (like PEM, PKCS12, or JKS). You can choose to make the signature visible on the document or keep it invisible for security only.", + "bullet1": "Supports PEM, PKCS12, JKS, and server certificate formats", + "bullet2": "Option to show or hide signature on the PDF", + "bullet3": "Add reason, location, and signer name", + "bullet4": "Choose which page to place visible signatures", + "bullet5": "Use server certificate for simple 'Sign with Stirling-PDF' option" + } + }, + "certType": { + "tooltip": { + "header": { + "title": "About Certificate Types" + }, + "what": { + "title": "What's a certificate?", + "text": "It's a secure ID for your signature that proves you signed. Unless you're required to sign via certificate, we recommend using another secure method like Type, Draw, or Upload." + }, + "which": { + "title": "Which option should I use?", + "text": "Choose the format that matches your certificate file:", + "bullet1": "PKCS#12 (.p12 / .pfx) – one combined file (most common)", + "bullet2": "PFX (.pfx) – Microsoft's version of PKCS12", + "bullet3": "PEM – separate private-key and certificate .pem files", + "bullet4": "JKS – Java .jks keystore for dev / CI-CD workflows" + }, + "convert": { + "title": "Key not listed?", + "text": "Convert your file to a Java keystore (.jks) with keytool, then pick JKS." + } + } + }, + "chooseCertificate": "Choose Certificate File", + "chooseJksFile": "Choose JKS File", + "chooseP12File": "Choose PKCS12 File", + "choosePfxFile": "Choose PFX File", + "choosePrivateKey": "Choose Private Key File", + "location": "Suíomh", + "logoTitle": "Logo", + "name": "Ainm", + "noLogo": "No Logo", + "pageNumber": "Page Number", + "password": "Cuir isteach do Phasfhocal StÃŗrais Eochracha nÃŗ Eochracha PríobhÃĄidí (mÃĄs ann dÃŗ):", + "passwordOptional": "Leave empty if no password", + "reason": "CÃēis", + "serverCertMessage": "Using server certificate - no files or password required", + "showLogo": "TaispeÃĄin LÃŗgÃŗ", "header": "Sínigh PDF le do theastas (Obair ar siÃēl)", "selectPDF": "Roghnaigh Comhad PDF le síniÃē:", "jksNote": "NÃŗta: Mura bhfuil do chineÃĄl teastais liostaithe thíos, le do thoil Ê a thiontÃē go comhad Java Keystore (.jks) ag baint ÃēsÃĄide as an uirlis líne ordaithe keytool. Ansin, roghnaigh an rogha comhad .jks thíos.", @@ -1089,13 +2484,7 @@ "selectCert": "Roghnaigh Do Chomhad Teastais (formÃĄid X.509, d'fhÊadfadh sÊ a bheith .pem nÃŗ .der):", "selectP12": "Roghnaigh Do Chomhad Siopa Eochracha PKCS#12 (.p12 nÃŗ .pfx) (Roghnach, MÃĄ chuirtear ar fÃĄil Ê, ba cheart go mbeadh d'eochair phríobhÃĄideach agus teastas ann):", "selectJKS": "Roghnaigh Do Chomhad Keystore Java (.jks nÃŗ .keystore):", - "certType": "CineÃĄl Teastais", - "password": "Cuir isteach do Phasfhocal StÃŗrais Eochracha nÃŗ Eochracha PríobhÃĄidí (mÃĄs ann dÃŗ):", "showSig": "TaispeÃĄin SíniÃē", - "reason": "CÃēis", - "location": "Suíomh", - "name": "Ainm", - "showLogo": "TaispeÃĄin LÃŗgÃŗ", "submit": "Sínigh PDF" }, "removeCertSign": { @@ -1103,7 +2492,18 @@ "title": "Bain SíniÃē Teastais", "header": "Bain an deimhniÃē digiteach Ãŗ PDF", "selectPDF": "Roghnaigh comhad PDF:", - "submit": "Bain SíniÃē" + "submit": "Bain SíniÃē", + "description": "This tool will remove digital certificate signatures from your PDF document.", + "filenamePrefix": "unsigned", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst removing certificate signatures." + }, + "results": { + "title": "Certificate Removal Results" + } }, "pageLayout": { "tags": "chumasc, ilchodach, aon-amharc, a eagrÃē", @@ -1111,16 +2511,157 @@ "header": "Leagan Amach Illeathanaigh", "pagesPerSheet": "Leathanaigh in aghaidh na bileoige:", "addBorder": "Cuir Teorainneacha leis", - "submit": "Cuir isteach" + "submit": "Cuir isteach", + "desc": { + "2": "Place 2 pages side-by-side on a single sheet.", + "3": "Place 3 pages on a single sheet in a single row.", + "4": "Place 4 pages on a single sheet (2 × 2 grid).", + "9": "Place 9 pages on a single sheet (3 × 3 grid).", + "16": "Place 16 pages on a single sheet (4 × 4 grid)." + }, + "error": { + "failed": "An error occurred while creating the multi-page layout." + } + }, + "bookletImposition": { + "tags": "booklet,imposition,printing,binding,folding,signature", + "title": "Booklet Imposition", + "header": "Booklet Imposition", + "submit": "Create Booklet", + "spineLocation": { + "label": "Spine Location", + "left": "Left (Standard)", + "right": "Right (RTL)" + }, + "doubleSided": { + "label": "Double-sided printing", + "tooltip": "Creates both front and back sides for proper booklet printing" + }, + "manualDuplex": { + "title": "Manual Duplex Mode", + "instructions": "For printers without automatic duplex. You'll need to run this twice:" + }, + "duplexPass": { + "label": "Print Pass", + "first": "1st Pass", + "second": "2nd Pass", + "firstInstructions": "Prints front sides → stack face-down → run again with 2nd Pass", + "secondInstructions": "Load printed stack face-down → prints back sides" + }, + "rtlBinding": { + "label": "Right-to-left binding", + "tooltip": "For Arabic, Hebrew, or other right-to-left languages" + }, + "addBorder": { + "label": "Add borders around pages", + "tooltip": "Adds borders around each page section to help with cutting and alignment" + }, + "addGutter": { + "label": "Add gutter margin", + "tooltip": "Adds inner margin space for binding" + }, + "gutterSize": { + "label": "Gutter size (points)" + }, + "flipOnShortEdge": { + "label": "Flip on short edge (automatic duplex only)", + "tooltip": "Enable for short-edge duplex printing (automatic duplex only - ignored in manual mode)", + "manualNote": "Not needed in manual mode - you flip the stack yourself" + }, + "advanced": { + "toggle": "Advanced Options" + }, + "paperSizeNote": "Paper size is automatically derived from your first page.", + "tooltip": { + "header": { + "title": "Booklet Creation Guide" + }, + "description": { + "title": "What is Booklet Imposition?", + "text": "Creates professional booklets by arranging pages in the correct printing order. Your PDF pages are placed 2-up on landscape sheets so when folded and bound, they read in proper sequence like a real book." + }, + "example": { + "title": "Example: 8-Page Booklet", + "text": "Your 8-page document becomes 2 sheets:", + "bullet1": "Sheet 1 Front: Pages 8, 1 | Back: Pages 2, 7", + "bullet2": "Sheet 2 Front: Pages 6, 3 | Back: Pages 4, 5", + "bullet3": "When folded & stacked: Reads 1→2→3→4→5→6→7→8" + }, + "printing": { + "title": "How to Print & Assemble", + "text": "Follow these steps for perfect booklets:", + "bullet1": "Print double-sided with 'Flip on long edge'", + "bullet2": "Stack sheets in order, fold in half", + "bullet3": "Staple or bind along the folded spine", + "bullet4": "For short-edge printers: Enable 'Flip on short edge' option" + }, + "manualDuplex": { + "title": "Manual Duplex (Single-sided Printers)", + "text": "For printers without automatic duplex:", + "bullet1": "Turn OFF 'Double-sided printing'", + "bullet2": "Select '1st Pass' → Print → Stack face-down", + "bullet3": "Select '2nd Pass' → Load stack → Print backs", + "bullet4": "Fold and assemble as normal" + }, + "advanced": { + "title": "Advanced Options", + "text": "Fine-tune your booklet:", + "bullet1": "Right-to-Left Binding: For Arabic, Hebrew, or RTL languages", + "bullet2": "Borders: Shows cut lines for trimming", + "bullet3": "Gutter Margin: Adds space for binding/stapling", + "bullet4": "Short-edge Flip: Only for automatic duplex printers" + } + }, + "error": { + "failed": "An error occurred while creating the booklet imposition." + } }, "scalePages": { - "tags": "athraigh, modhnaigh, toise, cuir in oiriÃēint", "title": "Coigeartaigh scÃĄla an leathanaigh", "header": "Coigeartaigh scÃĄla an leathanaigh", "pageSize": "MÊid leathanach den doicimÊad.", "keepPageSize": "MÊid Bunaidh", "scaleFactor": "LeibhÊal sÃēmÃĄil (barr) de leathanach.", - "submit": "Cuir isteach" + "submit": "Cuir isteach", + "tags": "athraigh, modhnaigh, toise, cuir in oiriÃēint" + }, + "adjustPageScale": { + "tags": "resize,modify,dimension,adapt", + "title": "Adjust Page Scale", + "header": "Adjust Page Scale", + "scaleFactor": { + "label": "Scale Factor" + }, + "pageSize": { + "label": "Target Page Size", + "keep": "Keep Original Size", + "letter": "Letter", + "legal": "Legal" + }, + "submit": "Adjust Page Scale", + "error": { + "failed": "An error occurred while adjusting the page scale." + }, + "tooltip": { + "header": { + "title": "Page Scale Settings Overview" + }, + "description": { + "title": "Description", + "text": "Adjust the size of PDF content and change the page dimensions." + }, + "scaleFactor": { + "title": "Scale Factor", + "text": "Controls how large or small the content appears on the page. Content is scaled and centred - if scaled content is larger than the page size, it may be cropped.", + "bullet1": "1.0 = Original size", + "bullet2": "0.5 = Half size (50% smaller)", + "bullet3": "2.0 = Double size (200% larger, may crop)" + }, + "pageSize": { + "title": "Target Page Size", + "text": "Sets the dimensions of the output PDF pages. 'Keep Original Size' maintains current dimensions, whilst other options resize to standard paper sizes." + } + } }, "add-page-numbers": { "tags": "leathanach, lipÊad, eagraigh, innÊacs" @@ -1129,16 +2670,83 @@ "tags": "auto-bhrath, ceanntÃĄsc-bhunaithe, a eagrÃē, a athlipÊadÃē", "title": "Athainmnigh Uathainm", "header": "Auto Athainmnigh PDF", - "submit": "Athainmnigh Uathainm" + "description": "Automatically finds the title from your PDF content and uses it as the filename.", + "submit": "Athainmnigh Uathainm", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst auto-renaming the PDF." + }, + "results": { + "title": "Auto-Rename Results" + }, + "tooltip": { + "header": { + "title": "How Auto-Rename Works" + }, + "howItWorks": { + "title": "Smart Renaming", + "text": "Automatically finds the title from your PDF content and uses it as the filename.", + "bullet1": "Looks for text that appears to be a title or heading", + "bullet2": "Creates a clean, valid filename from the detected title", + "bullet3": "Keeps the original name if no suitable title is found" + } + } }, "adjust-contrast": { "tags": "dath-cheartÃē, tune, a mhodhnÃē, a fheabhsÃē" }, "crop": { - "tags": "Baile Átha Troim, Laghdaigh, Cuir in eagar, Cruth", "title": "Barraí", "header": "PDF a ghearradh", - "submit": "Cuir isteach" + "submit": "Cuir isteach", + "noFileSelected": "Select a PDF file to begin cropping", + "preview": { + "title": "Crop Area Selection" + }, + "reset": "Reset to full PDF", + "coordinates": { + "title": "Position and Size", + "x": { + "label": "X Position", + "desc": "Left edge (points)" + }, + "y": { + "label": "Y Position", + "desc": "Bottom edge (points)" + }, + "width": { + "label": "Width", + "desc": "Crop width (points)" + }, + "height": { + "label": "Height", + "desc": "Crop height (points)" + } + }, + "error": { + "invalidArea": "Crop area extends beyond PDF boundaries", + "failed": "Failed to crop PDF" + }, + "steps": { + "selectArea": "Select Crop Area" + }, + "tooltip": { + "title": "How to Crop PDFs", + "description": "Select the area to crop from your PDF by dragging and resizing the blue overlay on the thumbnail.", + "drag": "Drag the overlay to move the crop area", + "resize": "Drag the corner and edge handles to resize", + "precision": "Use coordinate inputs for precise positioning" + }, + "results": { + "title": "Crop Results" + }, + "automation": { + "info": "Enter crop coordinates in PDF points. Origin (0,0) is at bottom-left. These values will be applied to all PDFs processed in this automation.", + "reference": "Reference: A4 page is 595.28 × 841.89 points (210mm × 297mm). 1 inch = 72 points." + }, + "tags": "Baile Átha Troim, Laghdaigh, Cuir in eagar, Cruth" }, "autoSplitPDF": { "tags": "QR-bhunaithe, ar leith, scanadh-deighleog, eagrÃē", @@ -1221,24 +2829,124 @@ "downloadJS": "Íosluchtaigh Javascript", "submit": "TaispeÃĄin" }, - "autoRedact": { - "tags": "Dearg, Folaigh, dubh amach, dubh, marcÃŗir, i bhfolach", - "title": "Auto Redact", - "header": "Auto Redact", - "colorLabel": "Dath", - "textsToRedactLabel": "TÊacs go Deighilt (línescartha)", - "textsToRedactPlaceholder": "e.g. \\nRÃēnda \\nTrí-rÃēnda", - "useRegexLabel": "Bain ÃēsÃĄid as Regex", - "wholeWordSearchLabel": "Cuardach Focal IomlÃĄn", - "customPaddingLabel": "StuÃĄil Breise Saincheaptha", - "convertPDFToImageLabel": "Tiontaigh PDF go PDF-Image (ÚsÃĄidte chun tÊacs a bhaint taobh thiar den bhosca)", - "submitButton": "Cuir isteach" - }, "redact": { "tags": "RÊiteach, Folaigh, dubh amach, dubh, marcÃŗir, i bhfolach, lÃĄmhleabhar", "title": "AthchÃŗiriÃē de LÃĄimh", - "header": "AthchÃŗiriÃē de LÃĄimh", "submit": "RÊiteach", + "error": { + "failed": "An error occurred while redacting the PDF." + }, + "modeSelector": { + "title": "Redaction Method", + "mode": "Mode", + "automatic": "Automatic", + "automaticDesc": "Redact text based on search terms", + "manual": "Manual", + "manualDesc": "Click and drag to redact specific areas", + "manualComingSoon": "Manual redaction coming soon" + }, + "auto": { + "header": "Auto Redact", + "settings": { + "title": "Redaction Settings", + "advancedTitle": "Casta" + }, + "colorLabel": "Box Colour", + "wordsToRedact": { + "title": "Words to Redact", + "placeholder": "Enter a word", + "add": "Cuir", + "examples": "Examples: Confidential, Top-Secret" + }, + "useRegexLabel": "Use Regex", + "wholeWordSearchLabel": "Whole Word Search", + "customPaddingLabel": "Custom Extra Padding", + "convertPDFToImageLabel": "Convert PDF to PDF-Image" + }, + "tooltip": { + "mode": { + "header": { + "title": "Redaction Method" + }, + "automatic": { + "title": "Automatic Redaction", + "text": "Automatically finds and redacts specified text throughout the document. Perfect for removing consistent sensitive information like names, addresses, or confidential markers." + }, + "manual": { + "title": "Manual Redaction", + "text": "Click and drag to manually select specific areas to redact. Gives you precise control over what gets redacted. (Coming soon)" + } + }, + "words": { + "header": { + "title": "Words to Redact" + }, + "description": { + "title": "Text Matching", + "text": "Enter words or phrases to find and redact in your document. Each word will be searched for separately." + }, + "bullet1": "Add one word at a time", + "bullet2": "Press Enter or click 'Add Another' to add", + "bullet3": "Click × to remove words", + "examples": { + "title": "Common Examples", + "text": "Typical words to redact include: bank details, email addresses, or specific names." + } + }, + "advanced": { + "header": { + "title": "Advanced Redaction Settings" + }, + "color": { + "title": "Box Colour & Padding", + "text": "Customise the appearance of redaction boxes. Black is standard, but you can choose any colour. Padding adds extra space around the found text." + }, + "regex": { + "title": "Use Regex", + "text": "Enable regular expressions for advanced pattern matching. Useful for finding phone numbers, emails, or complex patterns.", + "bullet1": "Example: \\d{4}-\\d{2}-\\d{2} to match any dates in YYYY-MM-DD format", + "bullet2": "Use with caution - test thoroughly" + }, + "wholeWord": { + "title": "Whole Word Search", + "text": "Only match complete words, not partial matches. 'John' won't match 'Johnson' when enabled." + }, + "convert": { + "title": "Convert to PDF-Image", + "text": "Converts the PDF to an image-based PDF after redaction. This ensures text behind redaction boxes is completely removed and unrecoverable." + } + } + }, + "manual": { + "header": "Manual Redaction", + "textBasedRedaction": "Text-based Redaction", + "pageBasedRedaction": "Page-based Redaction", + "convertPDFToImageLabel": "Convert PDF to PDF-Image (Used to remove text behind the box)", + "pageRedactionNumbers": { + "title": "Leathanaigh", + "placeholder": "(m.sh. 1,2,8 nÃŗ 4,7,12-16 nÃŗ 2n-1)" + }, + "redactionColor": { + "title": "Redaction Colour" + }, + "export": "EaspÃŗrtÃĄil", + "upload": "Upload", + "boxRedaction": "Box draw redaction", + "zoom": "Zoom", + "zoomIn": "Zoom in", + "zoomOut": "Zoom out", + "nextPage": "Next Page", + "previousPage": "Previous Page", + "toggleSidebar": "Toggle Sidebar", + "showThumbnails": "Show Thumbnails", + "showDocumentOutline": "Show Document Outline (double-click to expand/collapse all items)", + "showAttachments": "Show Attachments", + "showLayers": "Show Layers (double-click to reset all layers to the default state)", + "colourPicker": "Colour Picker", + "findCurrentOutlineItem": "Find current outline item", + "applyChanges": "Apply Changes" + }, + "header": "AthchÃŗiriÃē de LÃĄimh", "textBasedRedaction": "AthrÃē TÊacsbhunaithe", "pageBasedRedaction": "AthrÃē bunaithe ar Leathanaigh", "convertPDFToImageLabel": "Tiontaigh PDF go PDF-Image (ÚsÃĄidte chun tÊacs a bhaint taobh thiar den bhosca)", @@ -1264,22 +2972,7 @@ "showLayers": "TaispeÃĄin Sraitheanna (cliceÃĄil faoi dhÃŗ chun gach sraith a athshocrÃē go dtí an staid rÊamhshocraithe)", "colourPicker": "RoghnÃŗir Dathanna", "findCurrentOutlineItem": "Faigh imlíne reatha", - "applyChanges": "Apply Changes", - "auto": { - "settings": { - "advancedTitle": "Casta" - }, - "wordsToRedact": { - "add": "Cuir" - } - }, - "manual": { - "pageRedactionNumbers": { - "title": "Leathanaigh", - "placeholder": "(m.sh. 1,2,8 nÃŗ 4,7,12-16 nÃŗ 2n-1)" - }, - "export": "EaspÃŗrtÃĄil" - } + "applyChanges": "Apply Changes" }, "tableExtraxt": { "tags": "CSV, EastÃŗscadh TÃĄbla, sliocht, tiontÃē" @@ -1290,11 +2983,15 @@ "overlay-pdfs": { "tags": "Forleagan", "header": "Forleagan comhaid PDF", + "title": "Overlay PDFs", + "desc": "Overlay one PDF on top of another", "baseFile": { "label": "Roghnaigh Bonn Comhad PDF" }, "overlayFiles": { - "label": "Roghnaigh Forleagan Comhaid PDF" + "label": "Roghnaigh Forleagan Comhaid PDF", + "placeholder": "Choose PDF(s)...", + "addMore": "Add more PDFs..." }, "mode": { "label": "Roghnaigh MÃŗd Forleagan", @@ -1304,14 +3001,53 @@ }, "counts": { "label": "Áireamh Forleagan (do MhÃŗd AthdhÊanta Seasta)", - "placeholder": "Cuir isteach comhairimh scartha le camÃŗga (m.sh., 2,3,1)" + "placeholder": "Cuir isteach comhairimh scartha le camÃŗga (m.sh., 2,3,1)", + "item": "Count for file", + "noFiles": "Add overlay files to configure counts" }, "position": { "label": "Roghnaigh Post Forleagan", "foreground": "Tulra", "background": "CÃēlra" }, - "submit": "Cuir isteach" + "submit": "Cuir isteach", + "settings": { + "title": "Settings" + }, + "results": { + "title": "Overlay Results" + }, + "tooltip": { + "header": { + "title": "Overlay PDFs Overview" + }, + "description": { + "title": "Description", + "text": "Combine a base PDF with one or more overlay PDFs. Overlays can be applied page-by-page in different modes and placed in the foreground or background." + }, + "mode": { + "title": "Overlay Mode", + "text": "Choose how to distribute overlay pages across the base PDF pages.", + "sequential": "Sequential Overlay: Use pages from the first overlay PDF until it ends, then move to the next.", + "interleaved": "Interleaved Overlay: Take one page from each overlay in turn.", + "fixedRepeat": "Fixed Repeat Overlay: Take a set number of pages from each overlay before moving to the next. Use Counts to set the numbers." + }, + "position": { + "title": "Overlay Position", + "text": "Foreground places the overlay on top of the page. Background places it behind." + }, + "overlayFiles": { + "title": "Overlay Files", + "text": "Select one or more PDFs to overlay on the base. The order of these files affects how pages are applied in Sequential and Fixed Repeat modes." + }, + "counts": { + "title": "Counts (Fixed Repeat only)", + "text": "Provide a positive number for each overlay file showing how many pages to take before moving to the next. Required when mode is Fixed Repeat." + } + }, + "error": { + "failed": "An error occurred while overlaying PDFs." + } }, "split-by-sections": { "tags": "Roinn Scoilt, Roinn, Saincheap", @@ -1332,6 +3068,7 @@ "tags": "Stampa, Cuir íomhÃĄ, íomhÃĄ lÃĄr, Uisce, PDF, LeabÃē, Saincheap", "header": "Stampa PDF", "title": "Stampa PDF", + "stampSetup": "Stamp Setup", "stampType": "CineÃĄl Stampa", "stampText": "TÊacs Stampa", "stampImage": "ÍomhÃĄ Stampa", @@ -1344,7 +3081,19 @@ "overrideY": "SÃĄraigh Y ComhordanÃĄid", "customMargin": "Imeall an Chustaim", "customColor": "Dath TÊacs Saincheaptha", - "submit": "Cuir isteach" + "submit": "Cuir isteach", + "noStampSelected": "No stamp selected. Return to Step 1.", + "customPosition": "Drag the stamp to the desired location in the preview window.", + "error": { + "failed": "An error occurred while adding stamp to the PDF." + }, + "imageSize": "Image Size", + "margin": "Margin", + "positionAndFormatting": "Position & Formatting", + "quickPosition": "Select a position on the page to place the stamp.", + "results": { + "title": "Stamp Results" + } }, "removeImagePdf": { "tags": "Bain ÍomhÃĄ, Oibríochtaí Leathanaigh, CÃēl, taobh an fhreastalaí" @@ -1362,7 +3111,8 @@ "status": { "_value": "StÃĄdas", "valid": "Bailí", - "invalid": "Neamhbhailí" + "invalid": "Neamhbhailí", + "complete": "Validation complete" }, "signer": "Sínitheoir", "date": "DÃĄta", @@ -1389,40 +3139,122 @@ "version": "Leagan", "keyUsage": "ÚsÃĄid Eochrach", "selfSigned": "FÊin-Sínithe", - "bits": "giotÃĄin" + "bits": "giotÃĄin", + "details": "Certificate Details" }, "signature": { "info": "Eolas Sínithe", "_value": "SíniÃē", "mathValid": "TÃĄ an síniÃē bailí go matamaiticiÃēil ACH:" }, - "selectCustomCert": "Comhad Teastais Saincheaptha X.509 (Roghnach)" - }, - "replace-color": { - "title": "Athchuir-InbhÊartaigh-Dath", - "header": "Athchuir-InbhÊartaigh Dath PDF", - "selectText": { - "1": "Athchuir nÃŗ InbhÊartaigh Roghanna datha", - "2": "RÊamhshocrÃē(RÊamhshocrÃē dathanna ardchodarsnachta)", - "3": "Saincheaptha(dathanna saincheaptha)", - "4": "Iompaithe LÃĄn(InbhÊartaigh gach dath)", - "5": "Roghanna dathanna ardchodarsnachta", - "6": "tÊacs bÃĄn ar chÃēlra dubh", - "7": "TÊacs dubh ar chÃēlra bÃĄn", - "8": "TÊacs buí ar chÃēlra dubh", - "9": "TÊacs glas ar chÃēlra dubh", - "10": "Roghnaigh Dath an tÊacs", - "11": "Roghnaigh Dath an ChÃēlra" + "selectCustomCert": "Comhad Teastais Saincheaptha X.509 (Roghnach)", + "downloadCsv": "Download CSV", + "downloadJson": "Download JSON", + "downloadPdf": "Download PDF Report", + "downloadType": { + "csv": "CSV", + "json": "JSON", + "pdf": "PDF" }, - "submit": "Ionadaigh" + "error": { + "allFailed": "Unable to validate the selected files.", + "partial": "Some files could not be validated.", + "reportGeneration": "Could not generate the PDF report. JSON and CSV are available.", + "unexpected": "Unexpected error during validation." + }, + "finalizing": "Preparing downloads...", + "issue": { + "certExpired": "Certificate expired", + "certRevocationUnknown": "Certificate revocation status unknown", + "certRevoked": "Certificate revoked", + "chainInvalid": "Certificate chain invalid", + "signatureInvalid": "Signature cryptographic check failed", + "trustInvalid": "Certificate not trusted" + }, + "noResults": "Run the validation to generate a report.", + "noSignaturesShort": "No signatures", + "processing": "Validating signatures...", + "report": { + "continued": "Continued", + "downloads": "Downloads", + "entryLabel": "Signature Summary", + "fields": { + "created": "Created", + "fileSize": "File Size", + "signatureCount": "Total Signatures", + "signatureDate": "Signature Date" + }, + "filesEvaluated": "{{count}} files evaluated", + "footer": "Validated via Stirling PDF", + "generatedAt": "Generated", + "noPdf": "PDF report will be available after a successful validation.", + "page": "Page", + "shortTitle": "Signature Summary", + "signatureCountLabel": "{{count}} signatures", + "signaturesFound": "{{count}} signatures detected", + "signaturesValid": "{{count}} fully valid", + "title": "Signature Validation Report" + }, + "settings": { + "certHint": "Upload a trusted X.509 certificate to validate against a custom trust source.", + "title": "Validation Settings" + }, + "signatureDate": "Signature Date", + "totalSignatures": "Total Signatures" }, - "replaceColorPdf": { - "tags": "Athchuir Dath,Oibríochtaí Leathanaigh,CÃēl,taobh an fhreastalaí" + "replaceColor": { + "tags": "Replace Colour,Page operations,Back end,server side", + "labels": { + "settings": "Settings", + "colourOperation": "Colour operation" + }, + "options": { + "highContrast": "High contrast", + "invertAll": "Invert all colours", + "custom": "Custom", + "cmyk": "Convert to CMYK" + }, + "tooltip": { + "header": { + "title": "Replace & Invert Colour Settings Overview" + }, + "description": { + "title": "Description", + "text": "Transform PDF colours to improve readability and accessibility. Choose from high contrast presets, invert all colours, or create custom colour schemes." + }, + "highContrast": { + "title": "High Contrast", + "text": "Apply predefined high contrast colour combinations designed for better readability and accessibility compliance.", + "bullet1": "White text on black background - Classic dark mode", + "bullet2": "Black text on white background - Standard high contrast", + "bullet3": "Yellow text on black background - High visibility option", + "bullet4": "Green text on black background - Alternative high contrast" + }, + "invertAll": { + "title": "Invert All Colours", + "text": "Completely invert all colours in the PDF, creating a negative-like effect. Useful for creating dark mode versions of documents or reducing eye strain in low-light conditions." + }, + "custom": { + "title": "Custom Colours", + "text": "Define your own text and background colours using the colour pickers. Perfect for creating branded documents or specific accessibility requirements.", + "bullet1": "Text colour - Choose the colour for text elements", + "bullet2": "Background colour - Set the background colour for the document" + }, + "cmyk": { + "title": "Convert to CMYK", + "text": "Convert the PDF from RGB colour space to CMYK colour space, optimized for professional printing. This process converts colours to the Cyan, Magenta, Yellow, Black model used by printers." + } + }, + "error": { + "failed": "An error occurred while processing the colour replacement." + } }, "login": { "title": "Sínigh isteach", "header": "Sínigh isteach", "signin": "Sínigh isteach", + "signInWith": "Sign in with", + "signInAnonymously": "Sign Up as a Guest", "rememberme": "Cuimhnigh orm", "invalid": "Ainm ÃēsÃĄideora nÃŗ pasfhocal neamhbhailí.", "locked": "TÃĄ do chuntas glasÃĄilte.", @@ -1441,12 +3273,83 @@ "alreadyLoggedIn": "TÃĄ tÃē logÃĄilte isteach cheana", "alreadyLoggedIn2": "glÊasanna. LogÃĄil amach as na glÊasanna agus bain triail eile as.", "toManySessions": "TÃĄ an iomarca seisiÃēn gníomhach agat", - "logoutMessage": "You have been logged out." + "logoutMessage": "You have been logged out.", + "youAreLoggedIn": "You are logged in!", + "email": "Email", + "password": "Password", + "enterEmail": "Enter your email", + "enterPassword": "Enter your password", + "loggingIn": "Logging In...", + "username": "Username", + "enterUsername": "Enter username", + "useEmailInstead": "Login with email", + "forgotPassword": "Forgot your password?", + "logIn": "Log In", + "signingIn": "Signing in...", + "login": "Login", + "or": "Or", + "useMagicLink": "Use magic link instead", + "enterEmailForMagicLink": "Enter your email for magic link", + "sending": "Sendingâ€Ļ", + "sendMagicLink": "Send Magic Link", + "cancel": "Cancel", + "dontHaveAccount": "Don't have an account? Sign up", + "home": "Home", + "debug": "Debug", + "signOut": "Sign Out", + "pleaseEnterBoth": "Please enter both email and password", + "pleaseEnterEmail": "Please enter your email address", + "magicLinkSent": "Magic link sent to {{email}}! Check your email and click the link to sign in.", + "passwordResetSent": "Password reset link sent to {{email}}! Check your email and follow the instructions.", + "failedToSignIn": "Failed to sign in with {{provider}}: {{message}}", + "unexpectedError": "Unexpected error: {{message}}", + "accountCreatedSuccess": "Account created successfully! You can now sign in.", + "passwordChangedSuccess": "Password changed successfully! Please sign in with your new password.", + "credentialsUpdated": "Your credentials have been updated. Please sign in again." + }, + "signup": { + "title": "Create an account", + "subtitle": "Join Stirling PDF to get started", + "name": "Name", + "email": "Email", + "password": "Password", + "confirmPassword": "Confirm password", + "enterName": "Enter your name", + "enterEmail": "Enter your email", + "enterPassword": "Enter your password", + "confirmPasswordPlaceholder": "Confirm password", + "or": "or", + "creatingAccount": "Creating Account...", + "signUp": "Sign Up", + "alreadyHaveAccount": "Already have an account? Sign in", + "pleaseFillAllFields": "Please fill in all fields", + "passwordsDoNotMatch": "Passwords do not match", + "passwordTooShort": "Password must be at least 6 characters long", + "invalidEmail": "Please enter a valid email address", + "checkEmailConfirmation": "Check your email for a confirmation link to complete your registration.", + "accountCreatedSuccessfully": "Account created successfully! You can now sign in.", + "unexpectedError": "Unexpected error: {{message}}", + "useEmailInstead": "Use Email Instead", + "nameRequired": "Name is required", + "emailRequired": "Email is required", + "passwordRequired": "Password is required", + "confirmPasswordRequired": "Please confirm your password" }, "pdfToSinglePage": { "title": "PDF go leathanach amhÃĄin", "header": "PDF go leathanach amhÃĄin", - "submit": "Tiontaigh go Leathanach Aonair" + "submit": "Tiontaigh go Leathanach Aonair", + "description": "This tool will merge all pages of your PDF into one large single page. The width will remain the same as the original pages, but the height will be the sum of all page heights.", + "filenamePrefix": "single_page", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst converting to single page." + }, + "results": { + "title": "Single Page Results" + } }, "pageExtracter": { "title": "Leathanaigh Sliocht", @@ -1470,18 +3373,59 @@ "adjustContrast": { "title": "Coigeartaigh Codarsnacht", "header": "Coigeartaigh Codarsnacht", + "basic": "Basic Adjustments", "contrast": "Codarsnacht:", "brightness": "Gile:", "saturation": "SÃĄithiÃē:", - "download": "Íosluchtaigh" + "download": "Íosluchtaigh", + "adjustColors": "Adjust Colors", + "blue": "Blue", + "confirm": "Confirm", + "error": { + "failed": "Failed to adjust colors/contrast" + }, + "green": "Green", + "noPreview": "Select a PDF to preview", + "red": "Red", + "results": { + "title": "Adjusted PDF" + } }, "compress": { "title": "ComhbhrÃēigh", + "desc": "Compress PDFs to reduce their file size.", "header": "ComhbhrÃēigh PDF", + "method": { + "title": "Compression Method", + "quality": "Quality", + "filesize": "MÊid an Chomhaid" + }, "credit": "ÚsÃĄideann an tseirbhís seo qpdf le haghaidh ComhbhrÃē/Optimization PDF.", "grayscale": { "label": "Cuir ScÃĄla Liath i bhFeidhm le ComhbhrÃē" }, + "tooltip": { + "header": { + "title": "Compress Settings Overview" + }, + "description": { + "title": "Description", + "text": "Compression is an easy way to reduce your file size. Pick File Size to enter a target size and have us adjust quality for you. Pick Quality to set compression strength manually." + }, + "qualityAdjustment": { + "title": "Quality Adjustment", + "text": "Drag the slider to adjust the compression strength. Lower values (1-3) preserve quality but result in larger files. Higher values (7-9) shrink the file more but reduce image clarity.", + "bullet1": "Lower values preserve quality", + "bullet2": "Higher values reduce file size" + }, + "grayscale": { + "title": "Grayscale", + "text": "Select this option to convert all images to black and white, which can significantly reduce file size especially for scanned PDFs or image-heavy documents." + } + }, + "error": { + "failed": "An error occurred while compressing the PDF." + }, "selectText": { "1": { "_value": "Compression Settings", @@ -1491,10 +3435,7 @@ "4": "MÃŗd uathoibríoch - Coigeartaíonn Auto cÃĄilíocht chun PDF a fhÃĄil go dtí an mÊid cruinn", "5": "MÊid PDF a bhfuiltear ag sÃēil leis (m.sh. 25MB, 10.8MB, 25KB)" }, - "submit": "ComhbhrÃēigh", - "method": { - "filesize": "MÊid an Chomhaid" - } + "submit": "ComhbhrÃēigh" }, "decrypt": { "passwordPrompt": "TÃĄ an comhad seo cosanta ag pasfhocal. Cuir isteach an pasfhocal le do thoil:", @@ -1595,7 +3536,13 @@ "title": "Bain íomhÃĄ", "header": "Bain íomhÃĄ", "removeImage": "Bain íomhÃĄ", - "submit": "Bain íomhÃĄ" + "submit": "Bain íomhÃĄ", + "error": { + "failed": "Failed to remove images from the PDF." + }, + "results": { + "title": "Remove Images Results" + } }, "splitByChapters": { "title": "Scoil PDF de rÊir Caibidlí", @@ -1629,6 +3576,12 @@ }, "note": "TÃĄ nÃŗtaí eisiÃēna ar fÃĄil i mBÊarla amhÃĄin" }, + "swagger": { + "title": "API Documentation", + "header": "API Documentation", + "desc": "View and test the Stirling PDF API endpoints", + "tags": "api,documentation,swagger,endpoints,development" + }, "cookieBanner": { "popUp": { "title": "How we use Cookies", @@ -1664,53 +3617,943 @@ "title": "Analytics", "description": "These cookies help us understand how our tools are being used, so we can focus on building the features our community values most. Rest assured—Stirling PDF cannot and will never track the content of the documents you work with." } + }, + "services": { + "posthog": "PostHog Analytics", + "scarf": "Scarf Pixel" } }, - "download": "Íosluchtaigh", - "convert": { - "title": "Tiontaigh", - "settings": "Socruithe", - "color": "Dath", - "greyscale": "ScÃĄla Liath", - "fillPage": "Líon Leathanach", - "pdfaDigitalSignatureWarning": "TÃĄ síniÃē digiteach ar an PDF. Bainfear Ê seo sa chÊad chÊim eile.", - "grayscale": "ScÃĄla Liath" + "removeMetadata": { + "submit": "Remove Metadata" }, - "attachments": { - "tags": "embed,attach,file,attachment,attachments", - "title": "Add attachments", - "header": "Add attachments", - "submit": "Add attachments" + "sidebar": { + "toggle": "Toggle Sidebar" + }, + "theme": { + "toggle": "Toggle Theme" + }, + "view": { + "viewer": "Viewer", + "pageEditor": "Page Editor", + "fileManager": "File Manager" + }, + "pageEditor": { + "title": "Page Editor", + "save": "Save Changes", + "noPdfLoaded": "No PDF loaded. Please upload a PDF to edit.", + "rotatedLeft": "Rotated left:", + "rotatedRight": "Rotated right:", + "deleted": "Deleted:", + "movedLeft": "Moved left:", + "movedRight": "Moved right:", + "splitAt": "Split at:", + "insertedPageBreak": "Inserted page break at:", + "addFileNotImplemented": "Add file not implemented in demo", + "closePdf": "Close PDF", + "reset": "Reset Changes", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "fitToWidth": "Fit to Width", + "actualSize": "Actual Size" + }, + "viewer": { + "firstPage": "First Page", + "lastPage": "Last Page", + "previousPage": "Previous Page", + "nextPage": "Next Page", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "singlePageView": "Single Page View", + "dualPageView": "Dual Page View" }, "rightRail": { + "closeSelected": "Close Selected Files", "selectAll": "Roghnaigh Uile", - "deselectAll": "Díroghnaigh Uile" + "deselectAll": "Díroghnaigh Uile", + "selectByNumber": "Select by Page Numbers", + "deleteSelected": "Delete Selected Pages", + "closePdf": "Close PDF", + "exportAll": "Export PDF", + "downloadSelected": "Download Selected Files", + "downloadAll": "Download All", + "toggleTheme": "Toggle Theme", + "language": "Language", + "search": "Search PDF", + "panMode": "Pan Mode", + "rotateLeft": "Rotate Left", + "rotateRight": "Rotate Right", + "toggleSidebar": "Toggle Sidebar", + "exportSelected": "Export Selected Pages", + "toggleAnnotations": "Toggle Annotations Visibility", + "annotationMode": "Toggle Annotation Mode", + "draw": "Draw", + "save": "Save" + }, + "search": { + "title": "Search PDF", + "placeholder": "Enter search term...", + "noResults": "No results found", + "searching": "Searching..." + }, + "guestBanner": { + "title": "You're using Stirling PDF as a guest!", + "message": "Create a free account to save your work, access more features, and support the project.", + "dismiss": "Dismiss banner", + "signUp": "Sign Up Free" + }, + "toolPicker": { + "searchPlaceholder": "Search tools...", + "noToolsFound": "No tools found", + "allTools": "ALL TOOLS", + "quickAccess": "QUICK ACCESS", + "categories": { + "standardTools": "Standard Tools", + "advancedTools": "Advanced Tools", + "recommendedTools": "Recommended Tools" + }, + "subcategories": { + "signing": "Signing", + "documentSecurity": "Document Security", + "verification": "Verification", + "documentReview": "Document Review", + "pageFormatting": "Page Formatting", + "extraction": "Extraction", + "removal": "Removal", + "automation": "Automation", + "general": "General", + "advancedFormatting": "Advanced Formatting", + "developerTools": "Developer Tools" + } }, "quickAccess": { - "sign": "Comhartha" + "read": "Read", + "sign": "Comhartha", + "automate": "Automate", + "files": "Files", + "activity": "Activity", + "help": "Help", + "account": "Account", + "config": "Config", + "adminSettings": "Admin Settings", + "allTools": "All Tools" + }, + "admin": { + "error": "Error", + "success": "Success", + "expand": "Expand", + "close": "Close", + "status": { + "active": "Active", + "inactive": "Inactive" + }, + "settings": { + "title": "Admin Settings", + "workspace": "Workspace", + "fetchError": "Failed to load settings", + "saveError": "Failed to save settings", + "saved": "Settings saved successfully", + "saveSuccess": "Settings saved successfully", + "save": "Save Changes", + "restartRequired": "Restart Required", + "restart": { + "title": "Restart Required", + "message": "Settings have been saved successfully. A server restart is required for the changes to take effect.", + "question": "Would you like to restart the server now or later?", + "now": "Restart Now", + "later": "Restart Later" + }, + "restarting": "Restarting Server", + "restartingMessage": "The server is restarting. Please wait a moment...", + "restartError": "Failed to restart server. Please restart manually.", + "general": { + "title": "System Settings", + "description": "Configure system-wide application settings including branding and default behaviour.", + "ui": "User Interface", + "system": "System", + "appName": { + "label": "Application Name", + "description": "The name displayed in the browser tab and home page" + }, + "appNameNavbar": { + "label": "Navbar Brand", + "description": "The name displayed in the navigation bar" + }, + "homeDescription": { + "label": "Home Description", + "description": "The description text shown on the home page" + }, + "defaultLocale": { + "label": "Default Locale", + "description": "The default language for new users (e.g., en_US, es_ES)" + }, + "fileUploadLimit": { + "label": "File Upload Limit", + "description": "Maximum file upload size (e.g., 100MB, 1GB)" + }, + "showUpdate": { + "label": "Show Update Notifications", + "description": "Display notifications when a new version is available" + }, + "showUpdateOnlyAdmin": { + "label": "Show Updates to Admins Only", + "description": "Restrict update notifications to admin users only" + }, + "customHTMLFiles": { + "label": "Custom HTML Files", + "description": "Allow serving custom HTML files from the customFiles directory" + }, + "languages": { + "label": "Available Languages", + "description": "Languages that users can select from (leave empty to enable all languages)" + }, + "customMetadata": { + "label": "Custom Metadata", + "autoUpdate": { + "label": "Auto Update Metadata", + "description": "Automatically update PDF metadata on all processed documents" + }, + "author": { + "label": "Default Author", + "description": "Default author for PDF metadata (e.g., username)" + }, + "creator": { + "label": "Default Creator", + "description": "Default creator for PDF metadata" + }, + "producer": { + "label": "Default Producer", + "description": "Default producer for PDF metadata" + } + }, + "customPaths": { + "label": "Custom Paths", + "description": "Configure custom file system paths for pipeline processing and external tools", + "pipeline": { + "label": "Pipeline Directories", + "watchedFoldersDir": { + "label": "Watched Folders Directory", + "description": "Directory where pipeline monitors for incoming PDFs (leave empty for default: /pipeline/watchedFolders)" + }, + "finishedFoldersDir": { + "label": "Finished Folders Directory", + "description": "Directory where processed PDFs are outputted (leave empty for default: /pipeline/finishedFolders)" + } + }, + "operations": { + "label": "External Tool Paths", + "weasyprint": { + "label": "WeasyPrint Executable", + "description": "Path to WeasyPrint executable for HTML to PDF conversion (leave empty for default: /opt/venv/bin/weasyprint)" + }, + "unoconvert": { + "label": "Unoconvert Executable", + "description": "Path to LibreOffice unoconvert for document conversions (leave empty for default: /opt/venv/bin/unoconvert)" + } + } + } + }, + "security": { + "title": "Security", + "description": "Configure authentication, login behaviour, and security policies.", + "ssoNotice": { + "title": "Looking for SSO/SAML settings?", + "message": "OAuth2 and SAML2 authentication providers have been moved to the Connections menu for easier management." + }, + "authentication": "Authentication", + "enableLogin": { + "label": "Enable Login", + "description": "Require users to log in before accessing the application" + }, + "loginMethod": { + "label": "Login Method", + "description": "The authentication method to use for user login", + "all": "All Methods", + "normal": "Username/Password Only", + "oauth2": "OAuth2 Only", + "saml2": "SAML2 Only" + }, + "loginAttemptCount": { + "label": "Login Attempt Limit", + "description": "Maximum number of failed login attempts before account lockout" + }, + "loginResetTimeMinutes": { + "label": "Login Reset Time (minutes)", + "description": "Time before failed login attempts are reset" + }, + "csrfDisabled": { + "label": "Disable CSRF Protection", + "description": "Disable Cross-Site Request Forgery protection (not recommended)" + }, + "initialLogin": { + "label": "Initial Login", + "username": { + "label": "Initial Username", + "description": "The username for the initial admin account" + }, + "password": { + "label": "Initial Password", + "description": "The password for the initial admin account" + } + }, + "jwt": { + "label": "JWT Configuration", + "secureCookie": { + "label": "Secure Cookie", + "description": "Require HTTPS for JWT cookies (recommended for production)" + }, + "keyRetentionDays": { + "label": "Key Retention Days", + "description": "Number of days to retain old JWT keys for verification" + }, + "persistence": { + "label": "Enable Key Persistence", + "description": "Store JWT keys persistently to survive server restarts" + }, + "enableKeyRotation": { + "label": "Enable Key Rotation", + "description": "Automatically rotate JWT signing keys periodically" + }, + "enableKeyCleanup": { + "label": "Enable Key Cleanup", + "description": "Automatically remove expired JWT keys" + } + }, + "audit": { + "label": "Audit Logging", + "enabled": { + "label": "Enable Audit Logging", + "description": "Track user actions and system events for compliance and security monitoring" + }, + "level": { + "label": "Audit Level", + "description": "0=OFF, 1=BASIC, 2=STANDARD, 3=VERBOSE" + }, + "retentionDays": { + "label": "Audit Retention (days)", + "description": "Number of days to retain audit logs" + } + }, + "htmlUrlSecurity": { + "label": "HTML URL Security", + "description": "Configure URL access restrictions for HTML processing to prevent SSRF attacks", + "enabled": { + "label": "Enable URL Security", + "description": "Enable URL security restrictions for HTML to PDF conversions" + }, + "level": { + "label": "Security Level", + "description": "MAX: whitelist only, MEDIUM: block internal networks, OFF: no restrictions", + "max": "Maximum (Whitelist Only)", + "medium": "Medium (Block Internal)", + "off": "Off (No Restrictions)" + }, + "advanced": "Advanced Settings", + "allowedDomains": { + "label": "Allowed Domains (Whitelist)", + "description": "One domain per line (e.g., cdn.example.com). Only these domains allowed when level is MAX" + }, + "blockedDomains": { + "label": "Blocked Domains (Blacklist)", + "description": "One domain per line (e.g., malicious.com). Additional domains to block" + }, + "internalTlds": { + "label": "Internal TLDs", + "description": "One TLD per line (e.g., .local, .internal). Block domains with these TLD patterns" + }, + "networkBlocking": "Network Blocking", + "blockPrivateNetworks": { + "label": "Block Private Networks", + "description": "Block RFC 1918 private networks (10.x.x.x, 192.168.x.x, 172.16-31.x.x)" + }, + "blockLocalhost": { + "label": "Block Localhost", + "description": "Block localhost and loopback addresses (127.x.x.x, ::1)" + }, + "blockLinkLocal": { + "label": "Block Link-Local Addresses", + "description": "Block link-local addresses (169.254.x.x, fe80::/10)" + }, + "blockCloudMetadata": { + "label": "Block Cloud Metadata Endpoints", + "description": "Block cloud provider metadata endpoints (169.254.169.254)" + } + } + }, + "connections": { + "title": "Connections", + "description": "Configure external authentication providers like OAuth2 and SAML.", + "linkedServices": "Linked Services", + "unlinkedServices": "Unlinked Services", + "connect": "Connect", + "disconnect": "Disconnect", + "disconnected": "Provider disconnected successfully", + "disconnectError": "Failed to disconnect provider", + "ssoAutoLogin": { + "label": "SSO Auto Login", + "enable": "Enable SSO Auto Login", + "description": "Automatically redirect to SSO login when authentication is required" + }, + "oauth2": { + "label": "OAuth2", + "enabled": { + "label": "Enable OAuth2", + "description": "Allow users to authenticate using OAuth2 providers" + }, + "provider": { + "label": "Provider", + "description": "The OAuth2 provider to use for authentication" + }, + "issuer": { + "label": "Issuer URL", + "description": "The OAuth2 provider issuer URL" + }, + "clientId": { + "label": "Client ID", + "description": "The OAuth2 client ID from your provider" + }, + "clientSecret": { + "label": "Client Secret", + "description": "The OAuth2 client secret from your provider" + }, + "useAsUsername": { + "label": "Use as Username", + "description": "The OAuth2 claim to use as the username (e.g., email, sub)" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first OAuth2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via OAuth2" + }, + "scopes": { + "label": "OAuth2 Scopes", + "description": "Comma-separated list of OAuth2 scopes to request (e.g., openid, profile, email)" + } + }, + "saml2": { + "label": "SAML2", + "enabled": { + "label": "Enable SAML2", + "description": "Allow users to authenticate using SAML2 providers" + }, + "provider": { + "label": "Provider", + "description": "The SAML2 provider name" + }, + "registrationId": { + "label": "Registration ID", + "description": "The SAML2 registration identifier" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first SAML2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via SAML2" + } + } + }, + "database": { + "title": "Database", + "description": "Configure custom database connection settings for enterprise deployments.", + "configuration": "Database Configuration", + "enableCustom": { + "label": "Enable Custom Database", + "description": "Use your own custom database configuration instead of the default embedded database" + }, + "customUrl": { + "label": "Custom Database URL", + "description": "Full JDBC connection string (e.g., jdbc:postgresql://localhost:5432/postgres). If provided, individual connection settings below are not used." + }, + "type": { + "label": "Database Type", + "description": "Type of database (not used if custom URL is provided)" + }, + "hostName": { + "label": "Host Name", + "description": "Database server hostname (not used if custom URL is provided)" + }, + "port": { + "label": "Port", + "description": "Database server port (not used if custom URL is provided)" + }, + "name": { + "label": "Database Name", + "description": "Name of the database (not used if custom URL is provided)" + }, + "username": { + "label": "Username", + "description": "Database authentication username" + }, + "password": { + "label": "Password", + "description": "Database authentication password" + } + }, + "privacy": { + "title": "Privacy", + "description": "Configure privacy and data collection settings.", + "analytics": "Analytics & Tracking", + "enableAnalytics": { + "label": "Enable Analytics", + "description": "Collect anonymous usage analytics to help improve the application" + }, + "metricsEnabled": { + "label": "Enable Metrics", + "description": "Enable collection of performance and usage metrics. Provides API endpoint for admins to access metrics data" + }, + "searchEngine": "Search Engine Visibility", + "googleVisibility": { + "label": "Google Visibility", + "description": "Allow search engines to index this application" + } + }, + "advanced": { + "title": "Advanced", + "description": "Configure advanced features and experimental functionality.", + "features": "Feature Flags", + "processing": "Processing", + "endpoints": { + "label": "Endpoints", + "manage": "Manage API Endpoints", + "description": "Endpoint management is configured via YAML. See documentation for details on enabling/disabling specific endpoints." + }, + "enableAlphaFunctionality": { + "label": "Enable Alpha Features", + "description": "Enable experimental and alpha-stage features (may be unstable)" + }, + "enableUrlToPDF": { + "label": "Enable URL to PDF", + "description": "Allow conversion of web pages to PDF documents" + }, + "maxDPI": { + "label": "Maximum DPI", + "description": "Maximum DPI for image processing (0 = unlimited)" + }, + "tessdataDir": { + "label": "Tessdata Directory", + "description": "Path to the tessdata directory for OCR language files" + }, + "disableSanitize": { + "label": "Disable HTML Sanitization", + "description": "WARNING: Security risk - disabling HTML sanitization can lead to XSS vulnerabilities" + }, + "tempFileManagement": { + "label": "Temp File Management", + "description": "Configure temporary file storage and cleanup behavior", + "baseTmpDir": { + "label": "Base Temp Directory", + "description": "Base directory for temporary files (leave empty for default: java.io.tmpdir/stirling-pdf)" + }, + "libreofficeDir": { + "label": "LibreOffice Temp Directory", + "description": "Directory for LibreOffice temp files (leave empty for default: baseTmpDir/libreoffice)" + }, + "systemTempDir": { + "label": "System Temp Directory", + "description": "System temp directory to clean (only used if cleanupSystemTemp is enabled)" + }, + "prefix": { + "label": "Temp File Prefix", + "description": "Prefix for temp file names" + }, + "maxAgeHours": { + "label": "Max Age (hours)", + "description": "Maximum age in hours before temp files are cleaned up" + }, + "cleanupIntervalMinutes": { + "label": "Cleanup Interval (minutes)", + "description": "How often to run cleanup (in minutes)" + }, + "startupCleanup": { + "label": "Startup Cleanup", + "description": "Clean up old temp files on application startup" + }, + "cleanupSystemTemp": { + "label": "Cleanup System Temp", + "description": "Whether to clean broader system temp directory (use with caution)" + } + }, + "processExecutor": { + "label": "Process Executor Limits", + "description": "Configure session limits and timeouts for each process executor", + "sessionLimit": { + "label": "Session Limit", + "description": "Maximum concurrent instances" + }, + "timeout": { + "label": "Timeout (minutes)", + "description": "Maximum execution time" + }, + "libreOffice": "LibreOffice", + "pdfToHtml": "PDF to HTML", + "qpdf": "QPDF", + "tesseract": "Tesseract OCR", + "pythonOpenCv": "Python OpenCV", + "weasyPrint": "WeasyPrint", + "installApp": "Install App", + "calibre": "Calibre", + "ghostscript": "Ghostscript", + "ocrMyPdf": "OCRmyPDF" + } + }, + "mail": { + "title": "Mail Server", + "description": "Configure SMTP settings for sending email notifications.", + "smtp": "SMTP Configuration", + "enabled": { + "label": "Enable Mail", + "description": "Enable email notifications and SMTP functionality" + }, + "host": { + "label": "SMTP Host", + "description": "The hostname or IP address of your SMTP server" + }, + "port": { + "label": "SMTP Port", + "description": "The port number for SMTP connection (typically 25, 465, or 587)" + }, + "username": { + "label": "SMTP Username", + "description": "Username for SMTP authentication" + }, + "password": { + "label": "SMTP Password", + "description": "Password for SMTP authentication" + }, + "from": { + "label": "From Address", + "description": "The email address to use as the sender" + }, + "enableInvites": { + "label": "Enable Email Invites", + "description": "Allow admins to invite users via email with auto-generated passwords" + }, + "frontendUrl": { + "label": "Frontend URL", + "description": "Base URL for frontend (e.g. https://pdf.example.com). Used for generating invite links in emails. Leave empty to use backend URL." + } + }, + "legal": { + "title": "Legal Documents", + "description": "Configure links to legal documents and policies.", + "disclaimer": { + "title": "Legal Responsibility Warning", + "message": "By customizing these legal documents, you assume full responsibility for ensuring compliance with all applicable laws and regulations, including but not limited to GDPR and other EU data protection requirements. Only modify these settings if: (1) you are operating a personal/private instance, (2) you are outside EU jurisdiction and understand your local legal obligations, or (3) you have obtained proper legal counsel and accept sole responsibility for all user data and legal compliance. Stirling-PDF and its developers assume no liability for your legal obligations." + }, + "termsAndConditions": { + "label": "Terms and Conditions", + "description": "URL or filename to terms and conditions" + }, + "privacyPolicy": { + "label": "Privacy Policy", + "description": "URL or filename to privacy policy" + }, + "accessibilityStatement": { + "label": "Accessibility Statement", + "description": "URL or filename to accessibility statement" + }, + "cookiePolicy": { + "label": "Cookie Policy", + "description": "URL or filename to cookie policy" + }, + "impressum": { + "label": "Impressum", + "description": "URL or filename to impressum (required in some jurisdictions)" + } + }, + "premium": { + "title": "Premium & Enterprise", + "description": "Configure your premium or enterprise license key.", + "license": "License Configuration", + "key": { + "label": "License Key", + "description": "Enter your premium or enterprise license key" + }, + "enabled": { + "label": "Enable Premium Features", + "description": "Enable license key checks for pro/enterprise features" + }, + "movedFeatures": { + "title": "Premium Features Distributed", + "message": "Premium and Enterprise features are now organized in their respective sections:" + } + }, + "features": { + "title": "Features", + "description": "Configure optional features and functionality.", + "serverCertificate": { + "label": "Server Certificate", + "description": "Configure server-side certificate generation for \"Sign with Stirling-PDF\" functionality", + "enabled": { + "label": "Enable Server Certificate", + "description": "Enable server-side certificate for \"Sign with Stirling-PDF\" option" + }, + "organizationName": { + "label": "Organization Name", + "description": "Organization name for generated certificates" + }, + "validity": { + "label": "Certificate Validity (days)", + "description": "Number of days the certificate will be valid" + }, + "regenerateOnStartup": { + "label": "Regenerate on Startup", + "description": "Generate new certificate on each application startup" + } + } + }, + "endpoints": { + "title": "API Endpoints", + "description": "Control which API endpoints and endpoint groups are available.", + "management": "Endpoint Management", + "toRemove": { + "label": "Disabled Endpoints", + "description": "Select individual endpoints to disable" + }, + "groupsToRemove": { + "label": "Disabled Endpoint Groups", + "description": "Select endpoint groups to disable" + }, + "note": "Note: Disabling endpoints restricts API access but does not remove UI components. Restart required for changes to take effect." + } + } }, "fileUpload": { + "selectFile": "Select a file", + "selectFiles": "Select files", + "selectPdfToView": "Select a PDF to view", + "selectPdfToEdit": "Select a PDF to edit", + "chooseFromStorage": "Choose a file from storage or upload a new PDF", + "chooseFromStorageMultiple": "Choose files from storage or upload new PDFs", + "loadFromStorage": "Load from Storage", + "filesAvailable": "files available", "loading": "Á lÃŗdÃĄil...", - "or": "nÃŗ" + "or": "nÃŗ", + "dropFileHere": "Drop file here or click to upload", + "dropFilesHere": "Drop files here or click the upload button", + "pdfFilesOnly": "PDF files only", + "supportedFileTypes": "Supported file types", + "upload": "Upload", + "uploadFile": "Upload File", + "uploadFiles": "Upload Files", + "noFilesInStorage": "No files available in storage. Upload some files first.", + "selectFromStorage": "Select from Storage", + "backToTools": "Back to Tools", + "addFiles": "Add Files", + "dragFilesInOrClick": "Drag files in or click \"Add Files\" to browse" + }, + "fileEditor": { + "addFiles": "Add Files" }, "fileManager": { + "title": "Upload PDF Files", + "subtitle": "Add files to your storage for easy access across tools", + "filesSelected": "files selected", + "clearSelection": "Clear Selection", + "openInFileEditor": "Open in File Editor", + "uploadError": "Failed to upload some files.", + "failedToOpen": "Failed to open file. It may have been removed from storage.", + "failedToLoad": "Failed to load file to active set.", + "storageCleared": "Browser cleared storage. Files have been removed. Please re-upload.", + "clearAll": "Clear All", + "reloadFiles": "Reload Files", + "dragDrop": "Drag & Drop files here", + "clickToUpload": "Click to upload files", + "selectedFiles": "Selected Files", + "storage": "Storage", + "filesStored": "files stored", + "storageError": "Storage error occurred", + "storageLow": "Storage is running low. Consider removing old files.", + "supportMessage": "Powered by browser database storage for unlimited capacity", + "noFileSelected": "No files selected", + "showHistory": "Show History", + "hideHistory": "Hide History", + "fileHistory": "File History", + "loadingHistory": "Loading History...", + "lastModified": "Last Modified", + "toolChain": "Tools Applied", + "restore": "Restore", + "unzip": "Unzip", + "searchFiles": "Search files...", + "recent": "Recent", + "localFiles": "Local Files", + "googleDrive": "Google Drive", + "googleDriveShort": "Drive", + "myFiles": "My Files", + "noRecentFiles": "No recent files found", + "googleDriveNotAvailable": "Google Drive integration not available", + "openFiles": "Open Files", + "openFile": "Open File", + "details": "File Details", "fileName": "Ainm", + "fileFormat": "Format", + "fileSize": "Size", "fileVersion": "Leagan", + "totalSelected": "Total Selected", + "dropFilesHere": "Drop files here", "selectAll": "Roghnaigh Uile", "deselectAll": "Díroghnaigh Uile", "deleteSelected": "Scrios Roghnaithe", + "downloadSelected": "Download Selected", + "selectedCount": "{{count}} selected", "download": "Íosluchtaigh", - "delete": "Scrios" + "delete": "Scrios", + "unsupported": "Unsupported", + "addToUpload": "Add to Upload", + "deleteAll": "Delete All", + "loadingFiles": "Loading files...", + "noFiles": "No files available", + "noFilesFound": "No files found matching your search", + "openInPageEditor": "Open in Page Editor", + "showAll": "Show All", + "sortByDate": "Sort by Date", + "sortByName": "Sort by Name", + "sortBySize": "Sort by Size" + }, + "storage": { + "temporaryNotice": "Files are stored temporarily in your browser and may be cleared automatically", + "storageLimit": "Storage limit", + "storageUsed": "Temporary Storage used", + "storageFull": "Storage is nearly full. Consider removing some files.", + "fileTooLarge": "File too large. Maximum size per file is", + "storageQuotaExceeded": "Storage quota exceeded. Please remove some files before uploading more.", + "approximateSize": "Approximate size" }, "sanitize": { + "title": "Sanitise", + "desc": "Remove potentially harmful elements from PDF files.", "submit": "PDF slÃĄintíocht", + "completed": "Sanitisation completed successfully", + "error": { + "generic": "Sanitisation failed", + "failed": "An error occurred while sanitising the PDF." + }, + "filenamePrefix": "sanitised", + "sanitizationResults": "Sanitisation Results", "steps": { - "settings": "Socruithe" + "files": "Files", + "settings": "Socruithe", + "results": "Results" + }, + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "options": { + "title": "Sanitisation Options", + "note": "Select the elements you want to remove from the PDF. At least one option must be selected.", + "removeJavaScript": { + "label": "Remove JavaScript", + "desc": "Remove JavaScript actions and scripts from the PDF" + }, + "removeEmbeddedFiles": { + "label": "Remove Embedded Files", + "desc": "Remove any files embedded within the PDF" + }, + "removeXMPMetadata": { + "label": "Remove XMP Metadata", + "desc": "Remove XMP metadata from the PDF" + }, + "removeMetadata": { + "label": "Remove Document Metadata", + "desc": "Remove document information metadata (title, author, etc.)" + }, + "removeLinks": { + "label": "Remove Links", + "desc": "Remove external links and launch actions from the PDF" + }, + "removeFonts": { + "label": "Remove Fonts", + "desc": "Remove embedded fonts from the PDF" + } + } + }, + "addPassword": { + "title": "Cuir Pasfhocal leis", + "desc": "Encrypt your PDF document with a password.", + "completed": "Password protection applied", + "submit": "Criptigh", + "filenamePrefix": "encrypted", + "error": { + "failed": "An error occurred while encrypting the PDF." + }, + "passwords": { + "stepTitle": "Passwords & Encryption", + "completed": "Passwords configured", + "user": { + "label": "User Password", + "placeholder": "Enter user password" + }, + "owner": { + "label": "Owner Password", + "placeholder": "Enter owner password" + } + }, + "encryption": { + "keyLength": { + "label": "Encryption Key Length", + "40bit": "40-bit (Low)", + "128bit": "128-bit (Standard)", + "256bit": "256-bit (High)" + } + }, + "results": { + "title": "Encrypted PDFs" + }, + "tooltip": { + "header": { + "title": "Password Protection Overview" + }, + "passwords": { + "title": "Password Types", + "text": "User passwords restrict opening the document, while owner passwords control what can be done with the document once opened. You can set both or just one.", + "bullet1": "User Password: Required to open the PDF", + "bullet2": "Owner Password: Controls document permissions (not supported by all PDF viewers)" + }, + "encryption": { + "title": "Encryption Levels", + "text": "Higher encryption levels provide better security but may not be supported by older PDF viewers.", + "bullet1": "40-bit: Basic security, compatible with older viewers", + "bullet2": "128-bit: Standard security, widely supported", + "bullet3": "256-bit: Maximum security, requires modern viewers" + }, + "permissions": { + "title": "AthrÃē Ceadanna", + "text": "These permissions control what users can do with the PDF. Most effective when combined with an owner password." + } + }, + "tags": "slÃĄn, slÃĄndÃĄil", + "header": "Cuir pasfhocal leis (Criptigh)", + "selectText": { + "1": "Roghnaigh PDF le criptiÃē", + "2": "Pasfhocal ÚsÃĄideora", + "3": "Fad Eochracha Criptithe", + "4": "TÃĄ luachanna níos airde níos lÃĄidre, ach tÃĄ comhoiriÃēnacht níos fearr ag luachanna níos ísle.", + "5": "Ceadanna le socrÃē (Moltar iad a ÃēsÃĄid in Êineacht le pasfhocal an ÚinÊara)", + "6": "Cosc a chur le chÊile doicimÊad", + "7": "Cosc a chur ar eastÃŗscadh ÃĄbhar", + "8": "Cosc a chur ar eastÃŗscadh le haghaidh inrochtaineachta", + "9": "Cosc ar fhoirm a líonadh", + "10": "Cosc a chur ar mhodhnÃē", + "11": "Cosc a chur ar mhodhnÃē anÃŗtÃĄla", + "12": "Cosc a chur ar phriontÃĄil", + "13": "Cosc a chur ar phriontÃĄil bhformÃĄidí ÊagsÃēla", + "14": "Pasfhocal ÚinÊir", + "15": "Cuireann sÊ srian lenar fÊidir a dhÊanamh leis an doicimÊad nuair a osclaítear Ê (Ní thacaíonn gach lÊitheoir leis)", + "16": "Cuireann sÊ srian le hoscailt an doicimÊid fÊin" } }, "changePermissions": { "title": "AthrÃē Ceadanna", + "desc": "Change document restrictions and permissions.", + "completed": "Permissions changed", "submit": "AthrÃē Ceadanna", + "error": { + "failed": "An error occurred while changing PDF permissions." + }, "permissions": { "preventAssembly": { "label": "Cosc a chur le chÊile doicimÊad" @@ -1737,10 +4580,784 @@ "label": "Cosc a chur ar phriontÃĄil bhformÃĄidí ÊagsÃēla" } }, + "results": { + "title": "Modified PDFs" + }, "tooltip": { "header": { "title": "AthrÃē Ceadanna" + }, + "description": { + "text": "Changes document permissions, allowing/disallowing access to different features in PDF readers." + }, + "warning": { + "text": "To make these permissions unchangeable, use the Add Password tool to set an owner password." } } + }, + "removePassword": { + "title": "Bain pasfhocal", + "desc": "Bain cosaint phasfhocal Ãŗ do dhoicimÊad PDF.", + "tags": "slÃĄn, DíchriptiÃē, slÃĄndÃĄil, Unpassword, scrios pasfhocal", + "password": { + "stepTitle": "Bain Pasfhocal", + "label": "Pasfhocal reatha", + "placeholder": "Enter current password", + "completed": "Password configured" + }, + "filenamePrefix": "decrypted", + "error": { + "failed": "An error occurred while removing the password from the PDF." + }, + "tooltip": { + "description": "Removing password protection requires the password that was used to encrypt the PDF. This will decrypt the document, making it accessible without a password." + }, + "submit": "Bain", + "results": { + "title": "Decrypted PDFs" + }, + "header": "Bain pasfhocal (Díchriptigh)", + "selectText": { + "1": "Roghnaigh PDF le DíchriptiÃē", + "2": "Pasfhocal" + } + }, + "automate": { + "title": "Automate", + "desc": "Build multi-step workflows by chaining together PDF actions. Ideal for recurring tasks.", + "invalidStep": "Invalid step", + "files": { + "placeholder": "Select files to process with this automation" + }, + "selection": { + "title": "Automation Selection", + "saved": { + "title": "Saved" + }, + "createNew": { + "title": "Create New Automation" + }, + "suggested": { + "title": "Suggested" + } + }, + "creation": { + "createTitle": "Create Automation", + "editTitle": "Edit Automation", + "intro": "Automations run tools sequentially. To get started, add tools in the order you want them to run.", + "name": { + "label": "Automation Name", + "placeholder": "My Automation" + }, + "description": { + "label": "Description (optional)", + "placeholder": "Describe what this automation does..." + }, + "tools": { + "selectTool": "Select a tool...", + "selected": "Selected Tools", + "remove": "Remove tool", + "configure": "Configure tool", + "notConfigured": "! Not Configured", + "addTool": "Add Tool", + "add": "Add a tool..." + }, + "save": "Save Automation", + "unsavedChanges": { + "title": "Unsaved Changes", + "message": "You have unsaved changes. Are you sure you want to go back? All changes will be lost.", + "cancel": "Cancel", + "confirm": "Go Back" + }, + "icon": { + "label": "Icon" + } + }, + "run": { + "title": "Run Automation" + }, + "sequence": { + "unnamed": "Unnamed Automation", + "steps": "{{count}} steps", + "running": "Running Automation...", + "run": "Run Automation", + "finish": "Finish" + }, + "reviewTitle": "Automation Results", + "config": { + "loading": "Loading tool configuration...", + "noSettings": "This tool does not have configurable settings.", + "title": "Configure {{toolName}}", + "description": "Configure the settings for this tool. These settings will be applied when the automation runs.", + "cancel": "Cancel", + "save": "Save Configuration" + }, + "copyToSaved": "Copy to Saved" + }, + "automation": { + "suggested": { + "securePdfIngestion": "Secure PDF Ingestion", + "securePdfIngestionDesc": "Comprehensive PDF processing workflow that sanitises documents, applies OCR with cleanup, converts to PDF/A format for long-term archival, and optimises file size.", + "emailPreparation": "Email Preparation", + "emailPreparationDesc": "Optimises PDFs for email distribution by compressing files, splitting large documents into 20MB chunks for email compatibility, and removing metadata for privacy.", + "secureWorkflow": "Security Workflow", + "secureWorkflowDesc": "Secures PDF documents by removing potentially malicious content like JavaScript and embedded files, then adds password protection to prevent unauthorised access. Password is set to 'password' by default.", + "processImages": "Process Images", + "processImagesDesc": "Converts multiple image files into a single PDF document, then applies OCR technology to extract searchable text from the images." + } + }, + "common": { + "copy": "Copy", + "copied": "Copied!", + "refresh": "Refresh", + "retry": "Retry", + "remaining": "remaining", + "used": "used", + "available": "available", + "cancel": "Cancel", + "preview": "Preview" + }, + "config": { + "overview": { + "title": "Application Configuration", + "description": "Current application settings and configuration details." + }, + "account": { + "overview": { + "title": "Account Settings", + "manageAccountPreferences": "Manage your account preferences", + "guestDescription": "You are signed in as a guest. Consider upgrading your account above." + }, + "upgrade": { + "title": "Upgrade Guest Account", + "description": "Link your account to preserve your history and access more features!", + "socialLogin": "Upgrade with Social Account", + "linkWith": "Link with", + "emailPassword": "or enter your email & password", + "email": "Email", + "emailPlaceholder": "Enter your email", + "password": "Password (optional)", + "passwordPlaceholder": "Set a password", + "passwordNote": "Leave empty to use email verification only", + "upgradeButton": "Upgrade Account" + } + }, + "apiKeys": { + "description": "Your API key for accessing Stirling's suite of PDF tools. Copy it to your project or refresh to generate a new one.", + "publicKeyAriaLabel": "Public API key", + "copyKeyAriaLabel": "Copy API key", + "refreshAriaLabel": "Refresh API key", + "includedCredits": "Included credits", + "purchasedCredits": "Purchased credits", + "totalCredits": "Total Credits", + "chartAriaLabel": "Credits usage: included {{includedUsed}} of {{includedTotal}}, purchased {{purchasedUsed}} of {{purchasedTotal}}", + "nextReset": "Next Reset", + "lastApiUse": "Last API Use", + "overlayMessage": "Generate a key to see credits and available credits", + "label": "API Key", + "guestInfo": "Guest users do not receive API keys. Create an account to get an API key you can use in your applications.", + "goToAccount": "Go to Account", + "refreshModal": { + "title": "Refresh API Keys", + "warning": "âš ī¸ Warning: This action will generate new API keys and make your previous keys invalid.", + "impact": "Any applications or services currently using these keys will stop working until you update them with the new keys.", + "confirmPrompt": "Are you sure you want to continue?", + "confirmCta": "Refresh Keys" + }, + "generateError": "We couldn't generate your API key." + } + }, + "AddAttachmentsRequest": { + "attachments": "Select Attachments", + "info": "Select files to attach to your PDF. These files will be embedded and accessible through the PDF's attachment panel.", + "selectFiles": "Select Files to Attach", + "placeholder": "Choose files...", + "addMoreFiles": "Add more files...", + "selectedFiles": "Selected Files", + "submit": "Add Attachments", + "results": { + "title": "Attachment Results" + }, + "error": { + "failed": "Add attachments operation failed" + } + }, + "termsAndConditions": "Terms & Conditions", + "logOut": "Log out", + "addAttachments": { + "error": { + "failed": "An error occurred while adding attachments to the PDF." + } + }, + "autoRename": { + "description": "This tool will automatically rename PDF files based on their content. It analyzes the document to find the most suitable title from the text." + }, + "customPosition": "Custom Position", + "details": "Details", + "downloadUnavailable": "Download unavailable for this item", + "invalidUndoData": "Cannot undo: invalid operation data", + "margin": { + "large": "Large", + "medium": "Medium", + "small": "Small", + "xLarge": "Extra Large" + }, + "noFilesToUndo": "Cannot undo: no files were processed in the last operation", + "noOperationToUndo": "No operation to undo", + "noValidFiles": "No valid files to process", + "operationCancelled": "Operation cancelled", + "pageEdit": { + "deselectAll": "Select None", + "selectAll": "Select All" + }, + "quickPosition": "Quick Position", + "reorganizePages": { + "error": { + "failed": "Failed to reorganize pages" + }, + "results": { + "title": "Pages Reorganized" + }, + "settings": { + "title": "Settings" + }, + "submit": "Reorganize Pages" + }, + "replace-color": { + "options": { + "fill": "Fill colour", + "gradient": "Gradient" + }, + "previewOverlayOpacity": "Preview overlay opacity", + "previewOverlayTransparency": "Preview overlay transparency", + "previewOverlayVisibility": "Show preview overlay", + "selectText": { + "1": "Athchuir nÃŗ InbhÊartaigh Roghanna datha", + "2": "RÊamhshocrÃē(RÊamhshocrÃē dathanna ardchodarsnachta)", + "3": "Saincheaptha(dathanna saincheaptha)", + "4": "Iompaithe LÃĄn(InbhÊartaigh gach dath)", + "5": "Roghanna dathanna ardchodarsnachta", + "6": "tÊacs bÃĄn ar chÃēlra dubh", + "7": "TÊacs dubh ar chÃēlra bÃĄn", + "8": "TÊacs buí ar chÃēlra dubh", + "9": "TÊacs glas ar chÃēlra dubh", + "10": "Roghnaigh Dath an tÊacs", + "11": "Roghnaigh Dath an ChÃēlra", + "12": "Choose start colour", + "13": "Choose end colour" + }, + "submit": "Ionadaigh", + "title": "Athchuir-InbhÊartaigh-Dath", + "header": "Athchuir-InbhÊartaigh Dath PDF" + }, + "size": "Size", + "submit": "Submit", + "success": "Success", + "tools": { + "noSearchResults": "No tools found", + "noTools": "No tools available" + }, + "undoDataMismatch": "Cannot undo: operation data is corrupted", + "undoFailed": "Failed to undo operation", + "undoQuotaError": "Cannot undo: insufficient storage space", + "undoStorageError": "Undo completed but some files could not be saved to storage", + "undoSuccess": "Operation undone successfully", + "unsupported": "Unsupported", + "onboarding": { + "welcomeModal": { + "title": "Welcome to Stirling PDF!", + "description": "Would you like to take a quick 1-minute tour to learn the key features and how to get started?", + "helpHint": "You can always access this tour later from the Help button in the bottom left.", + "startTour": "Start Tour", + "maybeLater": "Maybe Later", + "dontShowAgain": "Don't Show Again" + }, + "allTools": "This is the All Tools panel, where you can browse and select from all available PDF tools.", + "selectCropTool": "Let's select the Crop tool to demonstrate how to use one of the tools.", + "toolInterface": "This is the Crop tool interface. As you can see, there's not much there because we haven't added any PDF files to work with yet.", + "filesButton": "The Files button on the Quick Access bar allows you to upload PDFs to use the tools on.", + "fileSources": "You can upload new files or access recent files from here. For the tour, we'll just use a sample file.", + "workbench": "This is the Workbench - the main area where you view and edit your PDFs.", + "viewSwitcher": "Use these controls to select how you want to view your PDFs.", + "viewer": "The Viewer lets you read and annotate your PDFs.", + "pageEditor": "The Page Editor allows you to do various operations on the pages within your PDFs, such as reordering, rotating and deleting.", + "activeFiles": "The Active Files view shows all of the PDFs you have loaded into the tool, and allows you to select which ones to process.", + "fileCheckbox": "Clicking one of the files selects it for processing. You can select multiple files for batch operations.", + "selectControls": "The Right Rail contains buttons to quickly select/deselect all of your active PDFs, along with buttons to change the app's theme or language.", + "cropSettings": "Now that we've selected the file we want crop, we can configure the Crop tool to choose the area that we want to crop the PDF to.", + "runButton": "Once the tool has been configured, this button allows you to run the tool on all the selected PDFs.", + "results": "After the tool has finished running, the Review step will show a preview of the results in this panel, and allow you to undo the operation or download the file. ", + "fileReplacement": "The modified file will replace the original file in the Workbench automatically, allowing you to easily run it through more tools.", + "pinButton": "You can use the Pin button if you'd rather your files stay active after running tools on them.", + "wrapUp": "You're all set! You've learnt about the main areas of the app and how to use them. Click the Help button whenever you like to see this tour again.", + "previous": "Previous", + "next": "Next", + "finish": "Finish", + "startTour": "Start Tour", + "startTourDescription": "Take a guided tour of Stirling PDF's key features" + }, + "workspace": { + "title": "Workspace", + "people": { + "title": "People", + "description": "Manage workspace members and their permissions", + "loading": "Loading people...", + "searchMembers": "Search members...", + "addMembers": "Add Members", + "inviteMembers": { + "label": "Invite Members", + "subtitle": "Type or paste in emails below, separated by commas. Your workspace will be billed by members." + }, + "user": "User", + "role": "Role", + "team": "Team", + "status": "Status", + "actions": "Actions", + "noMembersFound": "No members found", + "active": "Active", + "disabled": "Disabled", + "activeSession": "Active session", + "member": "Member", + "admin": "Admin", + "roleDescriptions": { + "admin": "Can manage settings and invite members, with full administrative access.", + "member": "Can view and edit shared files, but cannot manage workspace settings or members." + }, + "editRole": "Edit Role", + "enable": "Enable", + "disable": "Disable", + "deleteUser": "Delete User", + "deleteUserSuccess": "User deleted successfully", + "deleteUserError": "Failed to delete user", + "confirmDelete": "Are you sure you want to delete this user? This action cannot be undone.", + "addMember": { + "title": "Add Member", + "username": "Username (Email)", + "usernamePlaceholder": "user@example.com", + "password": "Password", + "passwordPlaceholder": "Enter password", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "forcePasswordChange": "Force password change on first login", + "cancel": "Cancel", + "submit": "Add Member", + "usernameRequired": "Username and password are required", + "passwordTooShort": "Password must be at least 6 characters", + "success": "User created successfully", + "error": "Failed to create user" + }, + "editMember": { + "title": "Edit Member", + "editing": "Editing:", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "cancel": "Cancel", + "submit": "Update Member", + "success": "User updated successfully", + "error": "Failed to update user" + }, + "toggleEnabled": { + "success": "User status updated successfully", + "error": "Failed to update user status" + }, + "delete": { + "success": "User deleted successfully", + "error": "Failed to delete user" + }, + "emailInvite": { + "tab": "Email Invite", + "description": "Type or paste in emails below, separated by commas. Users will receive login credentials via email.", + "emails": "Email Addresses", + "emailsPlaceholder": "user1@example.com, user2@example.com", + "emailsRequired": "At least one email address is required", + "submit": "Send Invites", + "success": "user(s) invited successfully", + "partialSuccess": "Some invites failed", + "allFailed": "Failed to invite users", + "error": "Failed to send invites" + }, + "directInvite": { + "tab": "Direct Create" + }, + "inviteLinkTab": { + "tab": "Invite Link" + }, + "inviteLink": { + "description": "Generate a secure link that allows the user to set their own password", + "email": "Email Address", + "emailPlaceholder": "user@example.com (optional)", + "emailDescription": "Optional - leave blank for a general invite link that can be used by anyone", + "emailRequired": "Email address is required", + "emailOptional": "Optional - leave blank for a general invite link", + "emailRequiredForSend": "Email address is required to send email notification", + "expiryHours": "Expiry Hours", + "expiryDescription": "How many hours until the link expires", + "sendEmail": "Send invite link via email", + "sendEmailDescription": "If enabled, the invite link will be sent to the specified email address", + "smtpRequired": "SMTP not configured", + "generate": "Generate Link", + "generated": "Invite Link Generated", + "copied": "Link copied to clipboard", + "success": "Invite link generated successfully", + "successWithEmail": "Invite link generated and sent via email", + "emailFailed": "Invite link generated, but email failed", + "emailFailedDetails": "Error: {0}. Please share the invite link manually.", + "error": "Failed to generate invite link", + "submit": "Generate Invite Link" + }, + "inviteMode": { + "username": "Username", + "email": "Email", + "link": "Link", + "emailDisabled": "Email invites require SMTP configuration and mail.enableInvites=true in settings" + }, + "license": { + "users": "users", + "availableSlots": "Available Slots", + "grandfathered": "Grandfathered", + "grandfatheredShort": "{{count}} grandfathered", + "fromLicense": "from license", + "slotsAvailable": "{{count}} user slot(s) available", + "noSlotsAvailable": "No slots available", + "currentUsage": "Currently using {{current}} of {{max}} user licences" + } + }, + "teams": { + "title": "Teams", + "description": "Manage teams and organize workspace members", + "loading": "Loading teams...", + "loadingDetails": "Loading team details...", + "createNewTeam": "Create New Team", + "teamName": "Team Name", + "totalMembers": "Total Members", + "actions": "Actions", + "noTeamsFound": "No teams found", + "noMembers": "No members in this team", + "system": "System", + "addMember": "Add Member", + "viewTeam": "View Team", + "removeMember": "Remove from team", + "cannotRemoveFromSystemTeam": "Cannot remove from system team", + "renameTeamLabel": "Rename Team", + "deleteTeamLabel": "Delete Team", + "cannotDeleteInternal": "Cannot delete the Internal team", + "confirmDelete": "Are you sure you want to delete this team? This team must be empty to delete.", + "confirmRemove": "Remove user from this team?", + "cannotRenameInternal": "Cannot rename the Internal team", + "cannotAddToInternal": "Cannot add members to the Internal team", + "teamNotFound": "Team not found", + "backToTeams": "Back to Teams", + "memberCount": "{{count}} members", + "removeMemberSuccess": "User removed from team", + "removeMemberError": "Failed to remove user from team", + "createTeam": { + "title": "Create New Team", + "teamName": "Team Name", + "teamNamePlaceholder": "Enter team name", + "cancel": "Cancel", + "submit": "Create Team", + "nameRequired": "Team name is required", + "success": "Team created successfully", + "error": "Failed to create team" + }, + "renameTeam": { + "title": "Rename Team", + "renaming": "Renaming:", + "newTeamName": "New Team Name", + "newTeamNamePlaceholder": "Enter new team name", + "cancel": "Cancel", + "submit": "Rename Team", + "nameRequired": "Team name is required", + "success": "Team renamed successfully", + "error": "Failed to rename team" + }, + "deleteTeam": { + "success": "Team deleted successfully", + "error": "Failed to delete team. Make sure the team is empty.", + "teamMustBeEmpty": "Team must be empty before deletion" + }, + "addMemberToTeam": { + "title": "Add Member to Team", + "addingTo": "Adding to", + "selectUser": "Select User", + "selectUserPlaceholder": "Choose a user", + "selectUserRequired": "Please select a user", + "currentlyIn": "currently in", + "willBeMoved": "Note: This user will be moved from their current team to this team.", + "cancel": "Cancel", + "submit": "Add Member", + "userRequired": "Please select a user", + "success": "Member added to team successfully", + "error": "Failed to add member to team" + }, + "changeTeam": { + "label": "Change Team", + "title": "Change Team", + "changing": "Moving", + "selectTeam": "Select Team", + "selectTeamPlaceholder": "Choose a team", + "selectTeamRequired": "Please select a team", + "success": "Team changed successfully", + "error": "Failed to change team", + "submit": "Change Team" + } + } + }, + "plan": { + "currency": "Currency", + "popular": "Popular", + "current": "Current Plan", + "upgrade": "Upgrade", + "contact": "Contact Us", + "customPricing": "Custom", + "showComparison": "Compare All Features", + "hideComparison": "Hide Feature Comparison", + "featureComparison": "Feature Comparison", + "activePlan": { + "title": "Active Plan", + "subtitle": "Your current subscription details" + }, + "availablePlans": { + "title": "Available Plans", + "subtitle": "Choose the plan that fits your needs" + }, + "static": { + "title": "Billing Information", + "message": "Online billing is not currently configured. To upgrade your plan or manage subscriptions, please contact us directly.", + "contactSales": "Contact Sales", + "contactToUpgrade": "Contact us to upgrade or customize your plan", + "maxUsers": "Max Users", + "upTo": "Up to" + }, + "period": { + "month": "month" + }, + "free": { + "name": "Free", + "highlight1": "Limited Tool Usage Per week", + "highlight2": "Access to all tools", + "highlight3": "Community support" + }, + "pro": { + "name": "Pro", + "highlight1": "Unlimited Tool Usage", + "highlight2": "Advanced PDF tools", + "highlight3": "No watermarks" + }, + "enterprise": { + "name": "Enterprise", + "highlight1": "Custom pricing", + "highlight2": "Dedicated support", + "highlight3": "Latest features" + }, + "feature": { + "title": "Feature", + "pdfTools": "Basic PDF Tools", + "fileSize": "File Size Limit", + "automation": "Automate tool workflows", + "api": "API Access", + "priority": "Priority Support", + "customPricing": "Custom Pricing" + } + }, + "subscription": { + "status": { + "active": "Active", + "pastDue": "Past Due", + "canceled": "Canceled", + "incomplete": "Incomplete", + "trialing": "Trial", + "none": "No Subscription" + }, + "renewsOn": "Renews on {{date}}", + "cancelsOn": "Cancels on {{date}}" + }, + "billing": { + "manageBilling": "Manage Billing", + "portal": { + "error": "Failed to open billing portal" + } + }, + "payment": { + "preparing": "Preparing your checkout...", + "upgradeTitle": "Upgrade to {{planName}}", + "success": "Payment Successful!", + "successMessage": "Your subscription has been activated successfully. You will receive a confirmation email shortly.", + "autoClose": "This window will close automatically...", + "error": "Payment Error" + }, + "firstLogin": { + "title": "First Time Login", + "welcomeTitle": "Welcome!", + "welcomeMessage": "For security reasons, you must change your password on your first login.", + "loggedInAs": "Logged in as", + "error": "Error", + "currentPassword": "Current Password", + "enterCurrentPassword": "Enter your current password", + "newPassword": "New Password", + "enterNewPassword": "Enter new password (min 8 characters)", + "confirmPassword": "Confirm New Password", + "reEnterNewPassword": "Re-enter new password", + "changePassword": "Change Password", + "allFieldsRequired": "All fields are required", + "passwordsDoNotMatch": "New passwords do not match", + "passwordTooShort": "Password must be at least 8 characters", + "passwordMustBeDifferent": "New password must be different from current password", + "passwordChangedSuccess": "Password changed successfully! Please log in again.", + "passwordChangeFailed": "Failed to change password. Please check your current password." + }, + "invite": { + "welcome": "Welcome to Stirling PDF", + "invalidToken": "Invalid invitation link", + "validationError": "Failed to validate invitation link", + "passwordRequired": "Password is required", + "passwordTooShort": "Password must be at least 6 characters", + "passwordMismatch": "Passwords do not match", + "acceptError": "Failed to create account", + "validating": "Validating invitation...", + "invalidInvitation": "Invalid Invitation", + "goToLogin": "Go to Login", + "welcomeTitle": "You've been invited!", + "welcomeSubtitle": "Complete your account setup to get started", + "accountFor": "Creating account for", + "linkExpires": "Link expires", + "email": "Email address", + "emailPlaceholder": "Enter your email address", + "emailRequired": "Email address is required", + "invalidEmail": "Invalid email address", + "choosePassword": "Choose a password", + "passwordPlaceholder": "Enter your password", + "confirmPassword": "Confirm password", + "confirmPasswordPlaceholder": "Re-enter your password", + "createAccount": "Create Account", + "creating": "Creating Account...", + "alreadyHaveAccount": "Already have an account?", + "signIn": "Sign in" + }, + "audit": { + "error": { + "title": "Error loading audit system" + }, + "notAvailable": "Audit system not available", + "notAvailableMessage": "The audit system is not configured or not available.", + "disabled": "Audit logging is disabled", + "disabledMessage": "Enable audit logging in your application configuration to track system events.", + "systemStatus": { + "title": "System Status", + "status": "Audit Logging", + "enabled": "Enabled", + "disabled": "Disabled", + "level": "Audit Level", + "retention": "Retention Period", + "days": "days", + "totalEvents": "Total Events" + }, + "tabs": { + "dashboard": "Dashboard", + "events": "Audit Events", + "export": "Export" + }, + "charts": { + "title": "Audit Dashboard", + "error": "Error loading charts", + "day": "Day", + "week": "Week", + "month": "Month", + "byType": "Events by Type", + "byUser": "Events by User", + "overTime": "Events Over Time" + }, + "events": { + "title": "Audit Events", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "error": "Error loading events", + "noEvents": "No events found", + "timestamp": "Timestamp", + "type": "Type", + "user": "User", + "ipAddress": "IP Address", + "actions": "Actions", + "viewDetails": "View Details", + "eventDetails": "Event Details", + "details": "Details" + }, + "export": { + "title": "Export Audit Data", + "description": "Export audit events to CSV or JSON format. Use filters to limit the exported data.", + "format": "Export Format", + "filters": "Filters (Optional)", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "exportButton": "Export Data", + "error": "Failed to export data" + } + }, + "usage": { + "noData": "No data available", + "error": "Error loading usage statistics", + "noDataMessage": "No usage statistics are currently available.", + "controls": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All", + "refresh": "Refresh", + "dataTypeLabel": "Data Type:", + "dataType": { + "all": "All", + "api": "API", + "ui": "UI" + } + }, + "showing": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All" + }, + "stats": { + "totalEndpoints": "Total Endpoints", + "totalVisits": "Total Visits", + "showing": "Showing", + "selectedVisits": "Selected Visits" + }, + "chart": { + "title": "Endpoint Usage Chart" + }, + "table": { + "title": "Detailed Statistics", + "endpoint": "Endpoint", + "visits": "Visits", + "percentage": "Percentage", + "noData": "No data available" + } + }, + "backendHealth": { + "checking": "Checking backend status...", + "online": "Backend Online", + "offline": "Backend Offline" + }, + "autoRedact": { + "tags": "Dearg, Folaigh, dubh amach, dubh, marcÃŗir, i bhfolach", + "title": "Auto Redact", + "header": "Auto Redact", + "colorLabel": "Dath", + "textsToRedactLabel": "TÊacs go Deighilt (línescartha)", + "textsToRedactPlaceholder": "e.g. \\nRÃēnda \\nTrí-rÃēnda", + "useRegexLabel": "Bain ÃēsÃĄid as Regex", + "wholeWordSearchLabel": "Cuardach Focal IomlÃĄn", + "customPaddingLabel": "StuÃĄil Breise Saincheaptha", + "convertPDFToImageLabel": "Tiontaigh PDF go PDF-Image (ÚsÃĄidte chun tÊacs a bhaint taobh thiar den bhosca)", + "submitButton": "Cuir isteach" + }, + "replaceColorPdf": { + "tags": "Athchuir Dath,Oibríochtaí Leathanaigh,CÃēl,taobh an fhreastalaí" } -} \ No newline at end of file +} diff --git a/frontend/public/locales/hi-IN/translation.json b/frontend/public/locales/hi-IN/translation.json index 75025f7a2..919b4a7b5 100644 --- a/frontend/public/locales/hi-IN/translation.json +++ b/frontend/public/locales/hi-IN/translation.json @@ -1,4 +1,40 @@ { + "toolPanel": { + "modePrompt": { + "title": "Choose how you browse tools", + "description": "Preview both layouts and decide how you want to explore Stirling PDF tools.", + "sidebarTitle": "Sidebar mode", + "sidebarDescription": "Keep tools alongside your workspace for quick switching.", + "recommended": "Recommended", + "chooseSidebar": "Use sidebar mode", + "fullscreenTitle": "Fullscreen mode - (legacy)", + "fullscreenDescription": "Browse every tool in a catalogue that covers the workspace until you pick one.", + "chooseFullscreen": "Use fullscreen mode", + "dismiss": "Maybe later" + }, + "fullscreen": { + "showDetails": "Show Details", + "comingSoon": "Coming soon:", + "favorite": "Add to favourites", + "favorites": "Favourites", + "heading": "All tools (fullscreen view)", + "noResults": "Try adjusting your search or toggle descriptions to find what you need.", + "recommended": "Recommended", + "unfavorite": "Remove from favourites" + }, + "placeholder": "Choose a tool to get started", + "toggle": { + "fullscreen": "Switch to fullscreen mode", + "sidebar": "Switch to sidebar mode" + } + }, + "unsavedChanges": "You have unsaved changes to your PDF.", + "areYouSure": "Are you sure you want to leave?", + "unsavedChangesTitle": "Unsaved Changes", + "keepWorking": "Keep Working", + "discardChanges": "Discard & Leave", + "applyAndContinue": "Save & Leave", + "exportAndContinue": "Export & Continue", "language": { "direction": "ltr" }, @@ -18,8 +54,26 @@ "customTextDesc": "⤕⤏āĨā¤Ÿā¤Ž ⤟āĨ‡ā¤•āĨā¤¸āĨā¤Ÿ", "numberPagesDesc": "⤕āĨŒā¤¨ ⤏āĨ‡ ā¤ĒāĨƒā¤ˇāĨā¤  ⤏⤂⤖āĨā¤¯ā¤žā¤‚⤕ā¤ŋ⤤ ⤕⤰⤍āĨ‡ ā¤šāĨˆā¤‚, ā¤Ąā¤ŋā¤Ģā¤ŧāĨ‰ā¤˛āĨā¤Ÿ '⤏⤭āĨ€', 1-5 ā¤¯ā¤ž 2,5,9 ⤆ā¤Ļā¤ŋ ⤭āĨ€ ⤏āĨā¤ĩāĨ€ā¤•ā¤žā¤° ā¤•ā¤°ā¤¤ā¤ž ā¤šāĨˆ", "customNumberDesc": "ā¤Ąā¤ŋā¤Ģā¤ŧāĨ‰ā¤˛āĨā¤Ÿ {n}, 'ā¤ĒāĨƒā¤ˇāĨā¤  {n} ⤕āĨā¤˛ {total}', '⤟āĨ‡ā¤•āĨā¤¸āĨā¤Ÿ-{n}', '{filename}-{n}' ⤭āĨ€ ⤏āĨā¤ĩāĨ€ā¤•ā¤žā¤° ā¤•ā¤°ā¤¤ā¤ž ā¤šāĨˆ", - "submit": "ā¤ĒāĨƒā¤ˇāĨā¤  ⤏⤂⤖āĨā¤¯ā¤ž ⤜āĨ‹ā¤Ąā¤ŧāĨ‡ā¤‚" + "submit": "ā¤ĒāĨƒā¤ˇāĨā¤  ⤏⤂⤖āĨā¤¯ā¤ž ⤜āĨ‹ā¤Ąā¤ŧāĨ‡ā¤‚", + "configuration": "Configuration", + "customize": "Customize Appearance", + "pagesAndStarting": "Pages & Starting Number", + "positionAndPages": "Position & Pages", + "error": { + "failed": "Add page numbers operation failed" + }, + "results": { + "title": "Page Number Results" + }, + "preview": "Position Selection", + "previewDisclaimer": "Preview is approximate. Final output may vary due to PDF font metrics." }, + "pageSelectionPrompt": "⤕⤏āĨā¤Ÿā¤Ž ā¤ĒāĨƒā¤ˇāĨā¤  ⤚⤝⤍ (ā¤ĒāĨƒā¤ˇāĨā¤  ⤏⤂⤖āĨā¤¯ā¤žā¤“⤂ 1,5,6 ā¤¯ā¤ž 2n+1 ⤜āĨˆā¤¸āĨ‡ ā¤Ģā¤ŧ⤂⤕āĨā¤ļ⤍ ⤕āĨ€ ⤅⤞āĨā¤Ēā¤ĩā¤ŋā¤°ā¤žā¤Ž ⤏āĨ‡ ⤅⤞⤗ ⤏āĨ‚ā¤šāĨ€ ā¤Ļ⤰āĨā¤œ ⤕⤰āĨ‡ā¤‚):", + "startingNumberTooltip": "The first number to display. Subsequent pages will increment from this number.", + "marginTooltip": "Distance between the page number and the edge of the page.", + "fontSizeTooltip": "Size of the page number text in points. Larger numbers create bigger text.", + "fontTypeTooltip": "Font family for the page numbers. Choose based on your document style.", + "customTextTooltip": "Optional custom format for page numbers. Use {n} as placeholder for the number. Example: \"Page {n}\" will show \"Page 1\", \"Page 2\", etc.", "pdfPrompt": "ā¤ĒāĨ€ā¤ĄāĨ€ā¤ā¤Ģ ā¤Ģā¤ŧā¤žā¤‡ā¤˛(āĨ‡ā¤‚) ⤚āĨā¤¨āĨ‡ā¤‚", "multiPdfPrompt": "ā¤ĒāĨ€ā¤ĄāĨ€ā¤ā¤Ģ ā¤Ģā¤ŧā¤žā¤‡ā¤˛āĨ‡ā¤‚ ⤚āĨā¤¨āĨ‡ā¤‚ (2+)", "multiPdfDropPrompt": "⤆ā¤ĩā¤ļāĨā¤¯ā¤• ⤏⤭āĨ€ ā¤ĒāĨ€ā¤ĄāĨ€ā¤ā¤Ģ ā¤Ģā¤ŧā¤žā¤‡ā¤˛āĨ‹ā¤‚ ⤕āĨ‹ ⤚āĨā¤¨āĨ‡ā¤‚ (ā¤¯ā¤ž ⤖āĨ€ā¤‚ā¤š ⤕⤰ ⤛āĨ‹ā¤Ąā¤ŧāĨ‡ā¤‚)", @@ -30,15 +84,41 @@ "uploadLimitExceededPlural": "are too large. Maximum allowed size is", "processTimeWarning": "⤚āĨ‡ā¤¤ā¤žā¤ĩ⤍āĨ€: ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ⤕āĨ‡ ā¤†ā¤•ā¤žā¤° ⤕āĨ‡ ā¤†ā¤§ā¤žā¤° ā¤Ē⤰ ā¤¯ā¤š ā¤ĒāĨā¤°ā¤•āĨā¤°ā¤ŋā¤¯ā¤ž ā¤ā¤• ā¤Žā¤ŋ⤍⤟ ⤤⤕ ⤞āĨ‡ ⤏⤕⤤āĨ€ ā¤šāĨˆ", "pageOrderPrompt": "⤕⤏āĨā¤Ÿā¤Ž ā¤ĒāĨƒā¤ˇāĨā¤  ⤕āĨā¤°ā¤Ž (ā¤ĒāĨƒā¤ˇāĨā¤  ⤏⤂⤖āĨā¤¯ā¤žā¤“⤂ ⤕āĨ€ ⤅⤞āĨā¤Ēā¤ĩā¤ŋā¤°ā¤žā¤Ž ⤏āĨ‡ ⤅⤞⤗ ⤏āĨ‚ā¤šāĨ€ ā¤¯ā¤ž 2n+1 ⤜āĨˆā¤¸āĨ‡ ā¤Ģā¤ŧ⤂⤕āĨā¤ļ⤍ ā¤Ļ⤰āĨā¤œ ⤕⤰āĨ‡ā¤‚):", - "pageSelectionPrompt": "⤕⤏āĨā¤Ÿā¤Ž ā¤ĒāĨƒā¤ˇāĨā¤  ⤚⤝⤍ (ā¤ĒāĨƒā¤ˇāĨā¤  ⤏⤂⤖āĨā¤¯ā¤žā¤“⤂ 1,5,6 ā¤¯ā¤ž 2n+1 ⤜āĨˆā¤¸āĨ‡ ā¤Ģā¤ŧ⤂⤕āĨā¤ļ⤍ ⤕āĨ€ ⤅⤞āĨā¤Ēā¤ĩā¤ŋā¤°ā¤žā¤Ž ⤏āĨ‡ ⤅⤞⤗ ⤏āĨ‚ā¤šāĨ€ ā¤Ļ⤰āĨā¤œ ⤕⤰āĨ‡ā¤‚):", "goToPage": "ā¤œā¤žā¤ā¤‚", "true": "ā¤šā¤žā¤", "false": "ā¤¨ā¤šāĨ€ā¤‚", "unknown": "ā¤…ā¤œāĨā¤žā¤žā¤¤", + "app": { + "description": "The Free Adobe Acrobat alternative (10M+ Downloads)" + }, "save": "ā¤¸ā¤šāĨ‡ā¤œāĨ‡ā¤‚", "saveToBrowser": "ā¤ŦāĨā¤°ā¤žā¤‰ā¤œā¤ŧ⤰ ā¤ŽāĨ‡ā¤‚ ā¤¸ā¤šāĨ‡ā¤œāĨ‡ā¤‚", + "download": "ā¤Ąā¤žā¤‰ā¤¨ā¤˛āĨ‹ā¤Ą ⤕⤰āĨ‡ā¤‚", + "pin": "Pin File (keep active after tool run)", + "unpin": "Unpin File (replace after tool run)", + "undoOperationTooltip": "Click to undo the last operation and restore the original files", + "undo": "Undo", + "moreOptions": "More Options", + "editYourNewFiles": "Edit your new file(s)", "close": "ā¤Ŧ⤂ā¤Ļ ⤕⤰āĨ‡ā¤‚", + "openInViewer": "Open in Viewer", + "confirmClose": "Confirm Close", + "confirmCloseMessage": "Are you sure you want to close this file?", + "confirmCloseCancel": "Cancel", + "confirmCloseConfirm": "Close File", + "fileSelected": "Selected: {{filename}}", + "chooseFile": "Choose File", "filesSelected": "ā¤Ģā¤ŧā¤žā¤‡ā¤˛āĨ‡ā¤‚ ⤚⤝⤍ā¤ŋ⤤", + "files": { + "title": "Files", + "upload": "Upload", + "uploadFiles": "Upload Files", + "addFiles": "Add files", + "selectFromWorkbench": "Select files from the workbench or ", + "selectMultipleFromWorkbench": "Select at least {{count}} files from the workbench or ", + "created": "Created", + "size": "File Size" + }, "noFavourites": "⤕āĨ‹ā¤ˆ ā¤Ē⤏⤂ā¤ĻāĨ€ā¤Ļā¤ž ā¤¨ā¤šāĨ€ā¤‚ ⤜āĨ‹ā¤Ąā¤ŧā¤ž ā¤—ā¤¯ā¤ž", "downloadComplete": "ā¤Ąā¤žā¤‰ā¤¨ā¤˛āĨ‹ā¤Ą ā¤ĒāĨ‚⤰āĨā¤Ŗ", "bored": "ā¤‡ā¤‚ā¤¤ā¤œā¤ŧā¤žā¤° ⤕⤰⤤āĨ‡ ā¤šāĨā¤ ā¤ŦāĨ‹ā¤° ā¤šāĨ‹ ā¤°ā¤šāĨ‡ ā¤šāĨˆā¤‚?", @@ -56,7 +136,10 @@ }, "error": { "pdfPassword": "ā¤ĒāĨ€ā¤ĄāĨ€ā¤ā¤Ģ ā¤Ļ⤏āĨā¤¤ā¤žā¤ĩāĨ‡ā¤œā¤ŧ ā¤Ēā¤žā¤¸ā¤ĩ⤰āĨā¤Ą ⤏āĨ‡ ⤏āĨā¤°ā¤•āĨā¤ˇā¤ŋ⤤ ā¤šāĨˆ ⤔⤰ ā¤¯ā¤ž ⤤āĨ‹ ā¤Ēā¤žā¤¸ā¤ĩ⤰āĨā¤Ą ā¤¨ā¤šāĨ€ā¤‚ ā¤Ļā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤Ĩā¤ž ā¤¯ā¤ž ⤗⤞⤤ ā¤Ĩā¤ž", + "encryptedPdfMustRemovePassword": "This PDF is encrypted or password-protected. Please unlock it before converting to PDF/A.", + "incorrectPasswordProvided": "The PDF password is incorrect or not provided.", "_value": "⤤āĨā¤°āĨā¤Ÿā¤ŋ", + "dismissAllErrors": "Dismiss All Errors", "sorry": "ā¤¸ā¤Žā¤¸āĨā¤¯ā¤ž ⤕āĨ‡ ⤞ā¤ŋā¤ ⤖āĨ‡ā¤Ļ ā¤šāĨˆ!", "needHelp": "ā¤Žā¤Ļā¤Ļ ā¤šā¤žā¤šā¤ŋā¤ / ⤕āĨ‹ā¤ˆ ā¤¸ā¤Žā¤¸āĨā¤¯ā¤ž ā¤Žā¤ŋ⤞āĨ€?", "contactTip": "⤝ā¤Ļā¤ŋ ⤆ā¤Ē ⤅⤭āĨ€ ⤭āĨ€ ā¤¸ā¤Žā¤¸āĨā¤¯ā¤žā¤“⤂ ā¤•ā¤ž ā¤¸ā¤žā¤Žā¤¨ā¤ž ⤕⤰ ā¤°ā¤šāĨ‡ ā¤šāĨˆā¤‚, ⤤āĨ‹ ā¤Žā¤Ļā¤Ļ ⤕āĨ‡ ⤞ā¤ŋā¤ ā¤šā¤Žā¤¸āĨ‡ ⤏⤂ā¤Ē⤰āĨā¤• ⤕⤰⤍āĨ‡ ā¤ŽāĨ‡ā¤‚ ⤏⤂⤕āĨ‹ā¤š ⤍ ⤕⤰āĨ‡ā¤‚āĨ¤ ⤆ā¤Ē ā¤šā¤Žā¤žā¤°āĨ‡ GitHub ā¤ĒāĨƒā¤ˇāĨā¤  ā¤Ē⤰ ⤟ā¤ŋā¤•ā¤Ÿ ā¤œā¤Žā¤ž ⤕⤰ ⤏⤕⤤āĨ‡ ā¤šāĨˆā¤‚ ā¤¯ā¤ž Discord ⤕āĨ‡ ā¤Žā¤žā¤§āĨā¤¯ā¤Ž ⤏āĨ‡ ā¤šā¤Žā¤¸āĨ‡ ⤏⤂ā¤Ē⤰āĨā¤• ⤕⤰ ⤏⤕⤤āĨ‡ ā¤šāĨˆā¤‚:", @@ -71,6 +154,10 @@ "githubSubmit": "GitHub - ā¤¸ā¤Žā¤¸āĨā¤¯ā¤ž ⤟ā¤ŋā¤•ā¤Ÿ ā¤œā¤Žā¤ž ⤕⤰āĨ‡ā¤‚", "discordSubmit": "Discord - ā¤¸ā¤šā¤žā¤¯ā¤¤ā¤ž ⤅⤍āĨā¤°āĨ‹ā¤§ ā¤œā¤Žā¤ž ⤕⤰āĨ‡ā¤‚" }, + "warning": { + "tooltipTitle": "Warning" + }, + "edit": "Edit", "delete": "ā¤šā¤Ÿā¤žā¤ā¤‚", "username": "⤉ā¤Ē⤝āĨ‹ā¤—⤕⤰āĨā¤¤ā¤ž ā¤¨ā¤žā¤Ž", "password": "ā¤Ēā¤žā¤¸ā¤ĩ⤰āĨā¤Ą", @@ -82,6 +169,7 @@ "green": "ā¤šā¤°ā¤ž", "blue": "⤍āĨ€ā¤˛ā¤ž", "custom": "⤕⤏āĨā¤Ÿā¤Ž...", + "comingSoon": "Coming soon", "WorkInProgess": "ā¤•ā¤žā¤°āĨā¤¯ ā¤ĒāĨā¤°ā¤—⤤ā¤ŋ ā¤Ē⤰ ā¤šāĨˆ, ā¤•ā¤žā¤Ž ā¤¨ā¤šāĨ€ā¤‚ ⤕⤰ ā¤¸ā¤•ā¤¤ā¤ž ā¤šāĨˆ ā¤¯ā¤ž ā¤Ŧ⤗ ā¤šāĨ‹ ⤏⤕⤤āĨ‡ ā¤šāĨˆā¤‚, ⤕āĨƒā¤Ēā¤¯ā¤ž ⤕ā¤ŋ⤏āĨ€ ⤭āĨ€ ā¤¸ā¤Žā¤¸āĨā¤¯ā¤ž ⤕āĨ€ ⤰ā¤ŋā¤ĒāĨ‹ā¤°āĨā¤Ÿ ⤕⤰āĨ‡ā¤‚!", "poweredBy": "ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž ā¤¸ā¤‚ā¤šā¤žā¤˛ā¤ŋ⤤", "yes": "ā¤šā¤žā¤", @@ -115,12 +203,14 @@ "page": "ā¤ĒāĨƒā¤ˇāĨā¤ ", "pages": "ā¤ĒāĨƒā¤ˇāĨā¤ ", "loading": "⤞āĨ‹ā¤Ą ā¤šāĨ‹ ā¤°ā¤šā¤ž ā¤šāĨˆ...", + "review": "Review", "addToDoc": "ā¤Ļ⤏āĨā¤¤ā¤žā¤ĩāĨ‡ā¤œā¤ŧ ā¤ŽāĨ‡ā¤‚ ⤜āĨ‹ā¤Ąā¤ŧāĨ‡ā¤‚", "reset": "⤰āĨ€ā¤¸āĨ‡ā¤Ÿ", "apply": "ā¤˛ā¤žā¤—āĨ‚ ⤕⤰āĨ‡ā¤‚", "noFileSelected": "No file selected. Please upload one.", "legal": { "privacy": "⤗āĨ‹ā¤Ē⤍āĨ€ā¤¯ā¤¤ā¤ž ⤍āĨ€ā¤¤ā¤ŋ", + "iAgreeToThe": "I agree to all of the", "terms": "⤍ā¤ŋā¤¯ā¤Ž ⤔⤰ ā¤ļ⤰āĨā¤¤āĨ‡ā¤‚", "accessibility": "⤏āĨā¤˛ā¤­ā¤¤ā¤ž", "cookie": "⤕āĨā¤•āĨ€ ⤍āĨ€ā¤¤ā¤ŋ", @@ -160,6 +250,7 @@ "title": "⤕āĨā¤¯ā¤ž ⤆ā¤Ē Stirling PDF ⤕āĨ‹ ā¤ŦāĨ‡ā¤šā¤¤ā¤° ā¤Ŧā¤¨ā¤žā¤¨ā¤ž ā¤šā¤žā¤šā¤¤āĨ‡ ā¤šāĨˆā¤‚?", "paragraph1": "Stirling PDF ā¤ŽāĨ‡ā¤‚ ⤉⤤āĨā¤Ēā¤žā¤Ļ ⤕āĨ‹ ā¤ŦāĨ‡ā¤šā¤¤ā¤° ā¤Ŧā¤¨ā¤žā¤¨āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤Žā¤Ļā¤Ļ ⤕⤰⤍āĨ‡ ⤕āĨ‡ ⤞ā¤ŋā¤ ā¤ĩā¤ŋ⤕⤞āĨā¤Ē ā¤ĩā¤ŋā¤ļāĨā¤˛āĨ‡ā¤ˇā¤Ŗ ā¤šāĨˆāĨ¤ ā¤šā¤Ž ⤕ā¤ŋ⤏āĨ€ ⤭āĨ€ ā¤ĩāĨā¤¯ā¤•āĨā¤¤ā¤ŋ⤗⤤ ā¤œā¤žā¤¨ā¤•ā¤žā¤°āĨ€ ā¤¯ā¤ž ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤¸ā¤žā¤Žā¤—āĨā¤°āĨ€ ⤕āĨ‹ ⤟āĨā¤°āĨˆā¤• ā¤¨ā¤šāĨ€ā¤‚ ⤕⤰⤤āĨ‡ ā¤šāĨˆā¤‚āĨ¤", "paragraph2": "⤕āĨƒā¤Ēā¤¯ā¤ž Stirling-PDF ⤕āĨ‹ ā¤Ŧā¤ĸā¤ŧ⤍āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤Žā¤Ļā¤Ļ ⤕⤰⤍āĨ‡ ⤔⤰ ā¤šā¤ŽāĨ‡ā¤‚ ⤅ā¤Ē⤍āĨ‡ ⤉ā¤Ē⤝āĨ‹ā¤—⤕⤰āĨā¤¤ā¤žā¤“⤂ ⤕āĨ‹ ā¤ŦāĨ‡ā¤šā¤¤ā¤° ā¤¸ā¤Žā¤ā¤¨āĨ‡ ⤕āĨ‡ ⤞ā¤ŋā¤ ā¤ĩā¤ŋā¤ļāĨā¤˛āĨ‡ā¤ˇā¤Ŗ ⤏⤕āĨā¤ˇā¤Ž ⤕⤰⤍āĨ‡ ā¤Ē⤰ ā¤ĩā¤ŋā¤šā¤žā¤° ⤕⤰āĨ‡ā¤‚āĨ¤", + "learnMore": "Learn more", "enable": "ā¤ĩā¤ŋā¤ļāĨā¤˛āĨ‡ā¤ˇā¤Ŗ ⤏⤕āĨā¤ˇā¤Ž ⤕⤰āĨ‡ā¤‚", "disable": "ā¤ĩā¤ŋā¤ļāĨā¤˛āĨ‡ā¤ˇā¤Ŗ ⤅⤕āĨā¤ˇā¤Ž ⤕⤰āĨ‡ā¤‚", "settings": "⤆ā¤Ē config/settings.yml ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤ŽāĨ‡ā¤‚ ā¤ĩā¤ŋā¤ļāĨā¤˛āĨ‡ā¤ˇā¤Ŗ ⤕āĨ‡ ⤞ā¤ŋā¤ ⤏āĨ‡ā¤Ÿā¤ŋ⤂⤗āĨā¤¸ ā¤Ŧā¤Ļ⤞ ⤏⤕⤤āĨ‡ ā¤šāĨˆā¤‚" @@ -203,6 +294,54 @@ "cacheInputs": { "name": "ā¤Ģā¤ŧāĨ‰ā¤°āĨā¤Ž ⤇⤍ā¤ĒāĨā¤Ÿ ā¤¸ā¤šāĨ‡ā¤œāĨ‡ā¤‚", "help": "⤭ā¤ĩā¤ŋ⤎āĨā¤¯ ⤕āĨ‡ ⤉ā¤Ē⤝āĨ‹ā¤— ⤕āĨ‡ ⤞ā¤ŋā¤ ā¤Ēā¤šā¤˛āĨ‡ ⤏āĨ‡ ⤉ā¤Ē⤝āĨ‹ā¤— ⤕ā¤ŋā¤ ā¤—ā¤ ⤇⤍ā¤ĒāĨā¤Ÿ ⤕āĨ‹ ⤏āĨā¤ŸāĨ‹ā¤° ⤕⤰⤍āĨ‡ ⤕āĨ‡ ⤞ā¤ŋā¤ ⤏⤕āĨā¤ˇā¤Ž ⤕⤰āĨ‡ā¤‚" + }, + "general": { + "title": "General", + "description": "Configure general application preferences.", + "account": "Account", + "accountDescription": "Manage your account settings", + "user": "User", + "signedInAs": "Signed in as", + "logout": "Log out", + "enableFeatures": { + "title": "For System Administrators", + "intro": "Enable user authentication, team management, and workspace features for your organization.", + "action": "Configure", + "and": "and", + "benefit": "Enables user roles, team collaboration, admin controls, and enterprise features.", + "learnMore": "Learn more in documentation", + "dismiss": "Dismiss" + }, + "autoUnzip": "Auto-unzip API responses", + "autoUnzipDescription": "Automatically extract files from ZIP responses", + "autoUnzipTooltip": "Automatically extract ZIP files returned from API operations. Disable to keep ZIP files intact. This does not affect automation workflows.", + "autoUnzipFileLimit": "Auto-unzip file limit", + "autoUnzipFileLimitDescription": "Maximum number of files to extract from ZIP", + "autoUnzipFileLimitTooltip": "Only unzip if the ZIP contains this many files or fewer. Set higher to extract larger ZIPs.", + "defaultToolPickerMode": "Default tool picker mode", + "defaultToolPickerModeDescription": "Choose whether the tool picker opens in fullscreen or sidebar by default", + "mode": { + "fullscreen": "Fullscreen", + "sidebar": "Sidebar" + } + }, + "hotkeys": { + "title": "Keyboard Shortcuts", + "description": "Hover a tool to see its shortcut or customise it below. Click \"Change shortcut\" and press a new key combination. Press Esc to cancel.", + "errorModifier": { + "mac": "Include ⌘ (Command), âŒĨ (Option), or another modifier in your shortcut.", + "windows": "Include Ctrl, Alt, or another modifier in your shortcut." + }, + "errorConflict": "Shortcut already used by {{tool}}.", + "none": "Not assigned", + "customBadge": "Custom", + "defaultLabel": "Default: {{shortcut}}", + "capturing": "Press keysâ€Ļ (Esc to cancel)", + "change": "Change shortcut", + "reset": "Reset", + "shortcut": "Shortcut", + "noShortcut": "No shortcut set", + "searchPlaceholder": "Search tools..." } }, "changeCreds": { @@ -274,8 +413,10 @@ "top20": "Top 20", "all": "All", "refresh": "Refresh", - "includeHomepage": "Include Homepage ('/')", - "includeLoginPage": "Include Login Page ('/login')", + "dataTypeLabel": "Data Type:", + "dataTypeAll": "All", + "dataTypeApi": "API", + "dataTypeUi": "UI", "totalEndpoints": "Total Endpoints", "totalVisits": "Total Visits", "showing": "Showing", @@ -290,7 +431,9 @@ "top": "Top", "numberOfVisits": "Number of Visits", "visitsTooltip": "Visits: {0} ({1}% of total)", - "retry": "Retry" + "retry": "Retry", + "includeHomepage": "Include Homepage ('/')", + "includeLoginPage": "Include Login Page ('/login')" }, "database": { "title": "ā¤ĄāĨ‡ā¤Ÿā¤žā¤ŦāĨ‡ā¤¸ ā¤†ā¤¯ā¤žā¤¤/⤍ā¤ŋ⤰āĨā¤¯ā¤žā¤¤", @@ -331,22 +474,310 @@ "alphabetical": "Alphabetical", "globalPopularity": "Global Popularity", "sortBy": "Sort by:", + "mobile": { + "brandAlt": "Stirling PDF logo", + "openFiles": "Open files", + "swipeHint": "Swipe left or right to switch views", + "tools": "Tools", + "toolsSlide": "Tool selection panel", + "viewSwitcher": "Switch workspace view", + "workbenchSlide": "Workspace panel", + "workspace": "Workspace" + }, "multiTool": { + "tags": "multiple,tools", "title": "PDF ā¤Žā¤˛āĨā¤ŸāĨ€ ⤟āĨ‚⤞", "desc": "ā¤Žā¤°āĨā¤œ ⤕⤰āĨ‡ā¤‚, ⤘āĨā¤Žā¤žā¤ā¤‚, ā¤ĒāĨā¤¨ā¤°āĨā¤ĩāĨā¤¯ā¤ĩ⤏āĨā¤Ĩā¤ŋ⤤ ⤕⤰āĨ‡ā¤‚ ⤔⤰ ā¤ĒāĨƒā¤ˇāĨā¤  ā¤šā¤Ÿā¤žā¤ā¤‚" }, "merge": { + "tags": "combine,join,unite", "title": "ā¤Žā¤°āĨā¤œ", "desc": "ā¤•ā¤ˆ PDF ⤕āĨ‹ ā¤†ā¤¸ā¤žā¤¨āĨ€ ⤏āĨ‡ ā¤ā¤• ā¤ŽāĨ‡ā¤‚ ā¤Žā¤°āĨā¤œ ⤕⤰āĨ‡ā¤‚āĨ¤" }, "split": { + "tags": "divide,separate,break", "title": "ā¤ĩā¤ŋā¤­ā¤žā¤œā¤ŋ⤤", "desc": "PDF ⤕āĨ‹ ā¤•ā¤ˆ ā¤Ļ⤏āĨā¤¤ā¤žā¤ĩāĨ‡ā¤œāĨ‹ā¤‚ ā¤ŽāĨ‡ā¤‚ ā¤ĩā¤ŋā¤­ā¤žā¤œā¤ŋ⤤ ⤕⤰āĨ‡ā¤‚" }, "rotate": { + "tags": "turn,flip,orient", "title": "⤘āĨā¤Žā¤žā¤ā¤‚", "desc": "⤅ā¤Ē⤍āĨ€ PDF ⤕āĨ‹ ā¤†ā¤¸ā¤žā¤¨āĨ€ ⤏āĨ‡ ⤘āĨā¤Žā¤žā¤ā¤‚āĨ¤" }, + "convert": { + "tags": "transform,change", + "title": "ā¤Ŧā¤Ļ⤞āĨ‡ā¤‚", + "desc": "Convert files between different formats" + }, + "pdfOrganiser": { + "tags": "organize,rearrange,reorder", + "title": "ā¤ĩāĨā¤¯ā¤ĩ⤏āĨā¤Ĩā¤ŋ⤤ ⤕⤰āĨ‡ā¤‚", + "desc": "⤕ā¤ŋ⤏āĨ€ ⤭āĨ€ ⤕āĨā¤°ā¤Ž ā¤ŽāĨ‡ā¤‚ ā¤ĒāĨƒā¤ˇāĨā¤  ⤍ā¤ŋā¤•ā¤žā¤˛āĨ‡ā¤‚/ā¤ĒāĨā¤¨ā¤°āĨā¤ĩāĨā¤¯ā¤ĩ⤏āĨā¤Ĩā¤ŋ⤤ ⤕⤰āĨ‡ā¤‚" + }, + "addImage": { + "tags": "insert,embed,place", + "title": "⤛ā¤ĩā¤ŋ ⤜āĨ‹ā¤Ąā¤ŧāĨ‡ā¤‚", + "desc": "PDF ā¤Ē⤰ ā¤ā¤• ⤍ā¤ŋ⤰āĨā¤§ā¤žā¤°ā¤ŋ⤤ ⤏āĨā¤Ĩā¤žā¤¨ ā¤Ē⤰ ⤛ā¤ĩā¤ŋ ⤜āĨ‹ā¤Ąā¤ŧāĨ‡ā¤‚" + }, + "addAttachments": { + "tags": "embed,attach,include", + "title": "Add Attachments", + "desc": "Add or remove embedded files (attachments) to/from a PDF" + }, + "watermark": { + "tags": "stamp,mark,overlay", + "title": "ā¤ĩāĨ‰ā¤Ÿā¤°ā¤Žā¤žā¤°āĨā¤• ⤜āĨ‹ā¤Ąā¤ŧāĨ‡ā¤‚", + "desc": "⤅ā¤Ē⤍āĨ‡ PDF ā¤Ļ⤏āĨā¤¤ā¤žā¤ĩāĨ‡ā¤œ ā¤ŽāĨ‡ā¤‚ ⤕⤏āĨā¤Ÿā¤Ž ā¤ĩāĨ‰ā¤Ÿā¤°ā¤Žā¤žā¤°āĨā¤• ⤜āĨ‹ā¤Ąā¤ŧāĨ‡ā¤‚āĨ¤" + }, + "removePassword": { + "tags": "unlock", + "title": "ā¤Ēā¤žā¤¸ā¤ĩ⤰āĨā¤Ą ā¤šā¤Ÿā¤žā¤ā¤‚", + "desc": "⤅ā¤Ē⤍āĨ‡ PDF ā¤Ļ⤏āĨā¤¤ā¤žā¤ĩāĨ‡ā¤œ ⤏āĨ‡ ā¤Ēā¤žā¤¸ā¤ĩ⤰āĨā¤Ą ⤏āĨā¤°ā¤•āĨā¤ˇā¤ž ā¤šā¤Ÿā¤žā¤ā¤‚āĨ¤" + }, + "compress": { + "tags": "shrink,reduce,optimize", + "title": "ā¤•ā¤ŽāĨā¤ĒāĨā¤°āĨ‡ā¤¸", + "desc": "PDF ⤕āĨ‹ ā¤•ā¤ŽāĨā¤ĒāĨā¤°āĨ‡ā¤¸ ⤕⤰āĨ‡ā¤‚ ā¤¤ā¤žā¤•ā¤ŋ ā¤‰ā¤¨ā¤•ā¤ž ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤†ā¤•ā¤žā¤° ā¤•ā¤Ž ā¤šāĨ‹ ā¤œā¤žā¤āĨ¤" + }, + "unlockPDFForms": { + "tags": "unlock,enable,edit", + "title": "Unlock PDF Forms", + "desc": "Remove read-only property of form fields in a PDF document." + }, + "changeMetadata": { + "tags": "edit,modify,update", + "title": "ā¤ŽāĨ‡ā¤Ÿā¤žā¤ĄāĨ‡ā¤Ÿā¤ž ā¤Ŧā¤Ļ⤞āĨ‡ā¤‚", + "desc": "PDF ā¤Ļ⤏āĨā¤¤ā¤žā¤ĩāĨ‡ā¤œ ⤏āĨ‡ ā¤ŽāĨ‡ā¤Ÿā¤žā¤ĄāĨ‡ā¤Ÿā¤ž ā¤Ŧā¤Ļ⤞āĨ‡ā¤‚/ā¤šā¤Ÿā¤žā¤ā¤‚/⤜āĨ‹ā¤Ąā¤ŧāĨ‡ā¤‚" + }, + "ocr": { + "tags": "extract,scan", + "title": "OCR / ⤏āĨā¤•āĨˆā¤¨ ā¤¸ā¤žā¤Ģ ⤕⤰āĨ‡ā¤‚", + "desc": "⤏āĨā¤•āĨˆā¤¨ ⤕āĨ‹ ā¤¸ā¤žā¤Ģ ⤕⤰āĨ‡ā¤‚ ⤔⤰ PDF ⤕āĨ‡ ⤅⤂ā¤Ļ⤰ ⤛ā¤ĩā¤ŋ⤝āĨ‹ā¤‚ ⤏āĨ‡ ⤟āĨ‡ā¤•āĨā¤¸āĨā¤Ÿ ā¤•ā¤ž ā¤Ēā¤¤ā¤ž ā¤˛ā¤—ā¤žā¤ā¤‚ ⤔⤰ ⤉⤏āĨ‡ ⤟āĨ‡ā¤•āĨā¤¸āĨā¤Ÿ ⤕āĨ‡ ⤰āĨ‚ā¤Ē ā¤ŽāĨ‡ā¤‚ ā¤Ģā¤ŋ⤰ ⤏āĨ‡ ⤜āĨ‹ā¤Ąā¤ŧāĨ‡ā¤‚āĨ¤" + }, + "extractImages": { + "tags": "pull,save,export", + "title": "⤛ā¤ĩā¤ŋā¤¯ā¤žā¤‚ ⤍ā¤ŋā¤•ā¤žā¤˛āĨ‡ā¤‚", + "desc": "PDF ⤏āĨ‡ ⤏⤭āĨ€ ⤛ā¤ĩā¤ŋ⤝āĨ‹ā¤‚ ⤕āĨ‹ ⤍ā¤ŋā¤•ā¤žā¤˛āĨ‡ā¤‚ ⤔⤰ ⤉⤍āĨā¤šāĨ‡ā¤‚ ⤜ā¤ŧā¤ŋā¤Ē ā¤ŽāĨ‡ā¤‚ ā¤¸ā¤šāĨ‡ā¤œāĨ‡ā¤‚" + }, + "scannerImageSplit": { + "tags": "detect,split,photos", + "title": "Detect & Split Scanned Photos", + "desc": "Detect and split scanned photos into separate pages" + }, + "sign": { + "tags": "signature,autograph", + "title": "ā¤šā¤¸āĨā¤¤ā¤žā¤•āĨā¤ˇā¤° ⤕⤰āĨ‡ā¤‚", + "desc": "⤚ā¤ŋ⤤āĨā¤° ā¤Ŧā¤¨ā¤žā¤•ā¤°, ⤟āĨ‡ā¤•āĨā¤¸āĨā¤Ÿ ā¤¯ā¤ž ⤛ā¤ĩā¤ŋ ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž PDF ā¤ŽāĨ‡ā¤‚ ā¤šā¤¸āĨā¤¤ā¤žā¤•āĨā¤ˇā¤° ⤜āĨ‹ā¤Ąā¤ŧāĨ‡ā¤‚" + }, + "flatten": { + "tags": "simplify,remove,interactive", + "title": "ā¤¸ā¤Žā¤¤ā¤˛ ⤕⤰āĨ‡ā¤‚", + "desc": "PDF ⤏āĨ‡ ⤏⤭āĨ€ ā¤‡ā¤‚ā¤Ÿā¤°āĨˆā¤•āĨā¤Ÿā¤ŋā¤ĩ ⤤⤤āĨā¤ĩāĨ‹ā¤‚ ⤔⤰ ā¤ĢāĨ‰ā¤°āĨā¤Ž ⤕āĨ‹ ā¤šā¤Ÿā¤žā¤ā¤‚" + }, + "certSign": { + "tags": "authenticate,PEM,P12,official,encrypt,sign,certificate,PKCS12,JKS,server,manual,auto", + "title": "ā¤ĒāĨā¤°ā¤Žā¤žā¤Ŗā¤Ē⤤āĨā¤° ⤏āĨ‡ ā¤šā¤¸āĨā¤¤ā¤žā¤•āĨā¤ˇā¤° ⤕⤰āĨ‡ā¤‚", + "desc": "ā¤ĒāĨā¤°ā¤Žā¤žā¤Ŗā¤Ē⤤āĨā¤°/⤕āĨā¤‚ā¤œāĨ€ (PEM/P12) ⤏āĨ‡ PDF ā¤Ē⤰ ā¤šā¤¸āĨā¤¤ā¤žā¤•āĨā¤ˇā¤° ⤕⤰āĨ‡ā¤‚" + }, + "repair": { + "tags": "fix,restore", + "title": "ā¤Žā¤°ā¤ŽāĨā¤Žā¤¤ ⤕⤰āĨ‡ā¤‚", + "desc": "ā¤–ā¤°ā¤žā¤Ŧ/⤟āĨ‚ā¤ŸāĨ€ ā¤šāĨā¤ˆ PDF ⤕āĨ‹ ⤠āĨ€ā¤• ⤕⤰⤍āĨ‡ ā¤•ā¤ž ā¤ĒāĨā¤°ā¤¯ā¤žā¤¸ ⤕⤰āĨ‡ā¤‚" + }, + "removeBlanks": { + "tags": "delete,clean,empty", + "title": "ā¤–ā¤žā¤˛āĨ€ ā¤ĒāĨƒā¤ˇāĨā¤  ā¤šā¤Ÿā¤žā¤ā¤‚", + "desc": "ā¤Ļ⤏āĨā¤¤ā¤žā¤ĩāĨ‡ā¤œā¤ŧ ⤏āĨ‡ ā¤–ā¤žā¤˛āĨ€ ā¤ĒāĨƒā¤ˇāĨā¤ āĨ‹ā¤‚ ā¤•ā¤ž ā¤Ēā¤¤ā¤ž ā¤˛ā¤—ā¤žā¤ā¤‚ ⤔⤰ ā¤šā¤Ÿā¤žā¤ā¤‚" + }, + "removeAnnotations": { + "tags": "delete,clean,strip", + "title": "⤟ā¤ŋā¤ĒāĨā¤Ē⤪ā¤ŋā¤¯ā¤žā¤‚ ā¤šā¤Ÿā¤žā¤ā¤‚", + "desc": "PDF ⤏āĨ‡ ⤏⤭āĨ€ ⤟ā¤ŋā¤ĒāĨā¤Ē⤪ā¤ŋā¤¯ā¤žā¤‚/ā¤ā¤¨āĨ‹ā¤ŸāĨ‡ā¤ļ⤍ ā¤šā¤Ÿā¤žā¤ā¤‚" + }, + "compare": { + "tags": "difference", + "title": "⤤āĨā¤˛ā¤¨ā¤ž ⤕⤰āĨ‡ā¤‚", + "desc": "2 PDF ā¤Ļ⤏āĨā¤¤ā¤žā¤ĩāĨ‡ā¤œāĨ‹ā¤‚ ⤕āĨ‡ ā¤ŦāĨ€ā¤š ⤅⤂⤤⤰ ⤕āĨ€ ⤤āĨā¤˛ā¤¨ā¤ž ⤕⤰āĨ‡ā¤‚ ⤔⤰ ā¤Ļā¤ŋā¤–ā¤žā¤ā¤‚" + }, + "removeCertSign": { + "tags": "remove,delete,unlock", + "title": "ā¤ĒāĨā¤°ā¤Žā¤žā¤Ŗā¤Ē⤤āĨā¤° ā¤šā¤¸āĨā¤¤ā¤žā¤•āĨā¤ˇā¤° ā¤šā¤Ÿā¤žā¤ā¤‚", + "desc": "PDF ⤏āĨ‡ ā¤ĒāĨā¤°ā¤Žā¤žā¤Ŗā¤Ē⤤āĨā¤° ā¤šā¤¸āĨā¤¤ā¤žā¤•āĨā¤ˇā¤° ā¤šā¤Ÿā¤žā¤ā¤‚" + }, + "pageLayout": { + "tags": "layout,arrange,combine", + "title": "ā¤Žā¤˛āĨā¤ŸāĨ€-ā¤ĒāĨ‡ā¤œ ⤞āĨ‡ā¤†ā¤‰ā¤Ÿ", + "desc": "PDF ā¤Ļ⤏āĨā¤¤ā¤žā¤ĩāĨ‡ā¤œ ⤕āĨ‡ ā¤•ā¤ˆ ā¤ĒāĨƒā¤ˇāĨā¤ āĨ‹ā¤‚ ⤕āĨ‹ ā¤ā¤• ā¤ĒāĨƒā¤ˇāĨā¤  ā¤ŽāĨ‡ā¤‚ ā¤Žā¤°āĨā¤œ ⤕⤰āĨ‡ā¤‚" + }, + "bookletImposition": { + "tags": "booklet,print,binding", + "title": "Booklet Imposition", + "desc": "Create booklets with proper page ordering and multi-page layout for printing and binding" + }, + "scalePages": { + "tags": "resize,adjust,scale", + "title": "ā¤ĒāĨƒā¤ˇāĨā¤  ā¤†ā¤•ā¤žā¤°/⤏āĨā¤•āĨ‡ā¤˛ ā¤¸ā¤Žā¤žā¤¯āĨ‹ā¤œā¤ŋ⤤ ⤕⤰āĨ‡ā¤‚", + "desc": "ā¤ĒāĨƒā¤ˇāĨā¤  ⤔⤰/ā¤¯ā¤ž ⤉⤏⤕āĨ€ ā¤¸ā¤žā¤Žā¤—āĨā¤°āĨ€ ā¤•ā¤ž ā¤†ā¤•ā¤žā¤°/⤏āĨā¤•āĨ‡ā¤˛ ā¤Ŧā¤Ļ⤞āĨ‡ā¤‚āĨ¤" + }, + "addPageNumbers": { + "tags": "number,pagination,count", + "title": "ā¤ĒāĨƒā¤ˇāĨā¤  ⤏⤂⤖āĨā¤¯ā¤ž ⤜āĨ‹ā¤Ąā¤ŧāĨ‡ā¤‚", + "desc": "ā¤Ļ⤏āĨā¤¤ā¤žā¤ĩāĨ‡ā¤œā¤ŧ ā¤ŽāĨ‡ā¤‚ ā¤ā¤• ⤍ā¤ŋ⤰āĨā¤§ā¤žā¤°ā¤ŋ⤤ ⤏āĨā¤Ĩā¤žā¤¨ ā¤Ē⤰ ā¤ĒāĨƒā¤ˇāĨā¤  ⤏⤂⤖āĨā¤¯ā¤ž ⤜āĨ‹ā¤Ąā¤ŧāĨ‡ā¤‚" + }, + "autoRename": { + "tags": "auto-detect,header-based,organize,relabel", + "title": "Auto Rename PDF File", + "desc": "Auto renames a PDF file based on its detected header" + }, + "adjustContrast": { + "tags": "contrast,brightness,saturation", + "title": "⤰⤂⤗/ā¤•ā¤‚ā¤ŸāĨā¤°ā¤žā¤¸āĨā¤Ÿ ā¤¸ā¤Žā¤žā¤¯āĨ‹ā¤œā¤ŋ⤤ ⤕⤰āĨ‡ā¤‚", + "desc": "PDF ā¤•ā¤ž ā¤•ā¤‚ā¤ŸāĨā¤°ā¤žā¤¸āĨā¤Ÿ, ⤏⤂⤤āĨƒā¤ĒāĨā¤¤ā¤ŋ ⤔⤰ ā¤šā¤Žā¤• ā¤¸ā¤Žā¤žā¤¯āĨ‹ā¤œā¤ŋ⤤ ⤕⤰āĨ‡ā¤‚" + }, + "crop": { + "tags": "trim,cut,resize", + "title": "PDF ⤕āĨā¤°āĨ‰ā¤Ē ⤕⤰āĨ‡ā¤‚", + "desc": "ā¤†ā¤•ā¤žā¤° ā¤•ā¤Ž ⤕⤰⤍āĨ‡ ⤕āĨ‡ ⤞ā¤ŋā¤ PDF ⤕āĨ‹ ⤕āĨā¤°āĨ‰ā¤Ē ⤕⤰āĨ‡ā¤‚ (⤟āĨ‡ā¤•āĨā¤¸āĨā¤Ÿ ā¤Ŧā¤¨ā¤žā¤ ⤰⤖āĨ‡ā¤‚!)" + }, + "autoSplitPDF": { + "tags": "auto,split,QR", + "title": "⤏āĨā¤ĩ⤤⤃ ā¤ĒāĨƒā¤ˇāĨā¤  ā¤ĩā¤ŋā¤­ā¤žā¤œā¤ŋ⤤ ⤕⤰āĨ‡ā¤‚", + "desc": "⤭āĨŒā¤¤ā¤ŋ⤕ ⤏āĨā¤•āĨˆā¤¨ ⤕ā¤ŋā¤ ā¤—ā¤ ā¤ĒāĨƒā¤ˇāĨā¤  ā¤ĩā¤ŋā¤­ā¤žā¤œā¤• QR ⤕āĨ‹ā¤Ą ⤕āĨ‡ ā¤¸ā¤žā¤Ĩ ⤏āĨā¤•āĨˆā¤¨ ⤕āĨ€ ā¤—ā¤ˆ PDF ⤕āĨ‹ ⤏āĨā¤ĩ⤤⤃ ā¤ĩā¤ŋā¤­ā¤žā¤œā¤ŋ⤤ ⤕⤰āĨ‡ā¤‚" + }, + "sanitize": { + "tags": "clean,purge,remove", + "title": "Sanitise", + "desc": "Remove potentially harmful elements from PDF files" + }, + "getPdfInfo": { + "tags": "info,metadata,details", + "title": "PDF ⤕āĨ€ ⤏⤭āĨ€ ā¤œā¤žā¤¨ā¤•ā¤žā¤°āĨ€ ā¤ĒāĨā¤°ā¤žā¤ĒāĨā¤¤ ⤕⤰āĨ‡ā¤‚", + "desc": "PDF ⤏āĨ‡ ⤏⤂⤭ā¤ĩ ⤏⤭āĨ€ ā¤œā¤žā¤¨ā¤•ā¤žā¤°āĨ€ ā¤ĒāĨā¤°ā¤žā¤ĒāĨā¤¤ ⤕⤰āĨ‡ā¤‚" + }, + "pdfToSinglePage": { + "tags": "combine,merge,single", + "title": "ā¤ā¤• ā¤Ŧā¤Ąā¤ŧā¤ž ā¤ĒāĨƒā¤ˇāĨā¤ ", + "desc": "⤏⤭āĨ€ PDF ā¤ĒāĨƒā¤ˇāĨā¤ āĨ‹ā¤‚ ⤕āĨ‹ ā¤ā¤• ā¤Ŧā¤Ąā¤ŧāĨ‡ ā¤ā¤•ā¤˛ ā¤ĒāĨƒā¤ˇāĨā¤  ā¤ŽāĨ‡ā¤‚ ā¤Žā¤°āĨā¤œ ⤕⤰āĨ‡ā¤‚" + }, + "showJS": { + "tags": "javascript,code,script", + "title": "ā¤œā¤žā¤ĩā¤žā¤¸āĨā¤•āĨā¤°ā¤ŋā¤ĒāĨā¤Ÿ ā¤Ļā¤ŋā¤–ā¤žā¤ā¤‚", + "desc": "PDF ā¤ŽāĨ‡ā¤‚ ā¤‡ā¤‚ā¤œāĨ‡ā¤•āĨā¤Ÿ ⤕ā¤ŋā¤ ā¤—ā¤ ⤕ā¤ŋ⤏āĨ€ ⤭āĨ€ ā¤œā¤žā¤ĩā¤žā¤¸āĨā¤•āĨā¤°ā¤ŋā¤ĒāĨā¤Ÿ ⤕āĨ‹ ⤖āĨ‹ā¤œāĨ‡ā¤‚ ⤔⤰ ā¤Ļā¤ŋā¤–ā¤žā¤ā¤‚" + }, + "redact": { + "tags": "censor,blackout,hide", + "title": "ā¤ŽāĨˆā¤¨āĨā¤…⤞ ⤗āĨ‹ā¤Ē⤍āĨ€ā¤¯ā¤•⤰⤪", + "desc": "⤚⤝⤍ā¤ŋ⤤ ⤟āĨ‡ā¤•āĨā¤¸āĨā¤Ÿ, ā¤Ŧā¤¨ā¤žā¤ˆ ā¤—ā¤ˆ ⤆⤕āĨƒā¤¤ā¤ŋ⤝āĨ‹ā¤‚ ⤔⤰/ā¤¯ā¤ž ⤚⤝⤍ā¤ŋ⤤ ā¤ĒāĨƒā¤ˇāĨā¤ āĨ‹ā¤‚ ⤕āĨ‡ ā¤†ā¤§ā¤žā¤° ā¤Ē⤰ PDF ⤕āĨ‹ ⤗āĨ‹ā¤Ē⤍āĨ€ā¤¯ā¤•āĨƒā¤¤ ⤕⤰āĨ‡ā¤‚" + }, + "splitBySections": { + "tags": "split,sections,divide", + "title": "Split PDF by Sections", + "desc": "Divide each page of a PDF into smaller horizontal and vertical sections" + }, + "addStamp": { + "tags": "stamp,mark,seal", + "title": "Add Stamp to PDF", + "desc": "Add text or add image stamps at set locations" + }, + "removeImage": { + "tags": "remove,delete,clean", + "title": "⤛ā¤ĩā¤ŋ ā¤šā¤Ÿā¤žā¤ā¤‚", + "desc": "ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤†ā¤•ā¤žā¤° ā¤•ā¤Ž ⤕⤰⤍āĨ‡ ⤕āĨ‡ ⤞ā¤ŋā¤ PDF ⤏āĨ‡ ⤛ā¤ĩā¤ŋ ā¤šā¤Ÿā¤žā¤ā¤‚" + }, + "splitByChapters": { + "tags": "split,chapters,structure", + "title": "⤅⤧āĨā¤¯ā¤žā¤¯āĨ‹ā¤‚ ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž PDF ā¤ĩā¤ŋā¤­ā¤žā¤œā¤ŋ⤤ ⤕⤰āĨ‡ā¤‚", + "desc": "PDF ⤕āĨ‹ ⤉⤏⤕āĨ€ ⤅⤧āĨā¤¯ā¤žā¤¯ ā¤¸ā¤‚ā¤°ā¤šā¤¨ā¤ž ⤕āĨ‡ ā¤†ā¤§ā¤žā¤° ā¤Ē⤰ ā¤•ā¤ˆ ā¤Ģā¤ŧā¤žā¤‡ā¤˛āĨ‹ā¤‚ ā¤ŽāĨ‡ā¤‚ ā¤ĩā¤ŋā¤­ā¤žā¤œā¤ŋ⤤ ⤕⤰āĨ‡ā¤‚āĨ¤" + }, + "validateSignature": { + "tags": "validate,verify,certificate", + "title": "PDF ā¤šā¤¸āĨā¤¤ā¤žā¤•āĨā¤ˇā¤° ⤏⤤āĨā¤¯ā¤žā¤Ēā¤ŋ⤤ ⤕⤰āĨ‡ā¤‚", + "desc": "PDF ā¤Ļ⤏āĨā¤¤ā¤žā¤ĩāĨ‡ā¤œāĨ‹ā¤‚ ā¤ŽāĨ‡ā¤‚ ā¤Ąā¤ŋ⤜ā¤ŋ⤟⤞ ā¤šā¤¸āĨā¤¤ā¤žā¤•āĨā¤ˇā¤° ⤔⤰ ā¤ĒāĨā¤°ā¤Žā¤žā¤Ŗā¤Ē⤤āĨā¤°āĨ‹ā¤‚ ⤕āĨ‹ ⤏⤤āĨā¤¯ā¤žā¤Ēā¤ŋ⤤ ⤕⤰āĨ‡ā¤‚" + }, + "swagger": { + "tags": "API,documentation,test", + "title": "API Documentation", + "desc": "View API documentation and test endpoints" + }, + "scannerEffect": { + "tags": "scan,simulate,create", + "title": "Scanner Effect", + "desc": "Create a PDF that looks like it was scanned" + }, + "editTableOfContents": { + "tags": "bookmarks,contents,edit", + "title": "Edit Table of Contents", + "desc": "Add or edit bookmarks and table of contents in PDF documents" + }, + "manageCertificates": { + "tags": "certificates,import,export", + "title": "Manage Certificates", + "desc": "Import, export, or delete digital certificate files used for signing PDFs." + }, + "read": { + "tags": "view,open,display", + "title": "Read", + "desc": "View and annotate PDFs. Highlight text, draw, or insert comments for review and collaboration." + }, + "reorganizePages": { + "tags": "rearrange,reorder,organize", + "title": "Reorganize Pages", + "desc": "Rearrange, duplicate, or delete PDF pages with visual drag-and-drop control." + }, + "extractPages": { + "tags": "pull,select,copy", + "title": "ā¤ĒāĨƒā¤ˇāĨā¤  ⤍ā¤ŋā¤•ā¤žā¤˛āĨ‡ā¤‚", + "desc": "Extract specific pages from a PDF document" + }, + "removePages": { + "tags": "delete,extract,exclude", + "title": "⤍ā¤ŋā¤•ā¤žā¤˛āĨ‡ā¤‚", + "desc": "⤅ā¤Ē⤍āĨ‡ PDF ā¤Ļ⤏āĨā¤¤ā¤žā¤ĩāĨ‡ā¤œ ⤏āĨ‡ ⤅ā¤ĩā¤žā¤‚ā¤›ā¤ŋ⤤ ā¤ĒāĨƒā¤ˇāĨā¤  ā¤šā¤Ÿā¤žā¤ā¤‚āĨ¤" + }, + "autoSizeSplitPDF": { + "tags": "auto,split,size", + "title": "ā¤†ā¤•ā¤žā¤°/⤏⤂⤖āĨā¤¯ā¤ž ⤕āĨ‡ ā¤†ā¤§ā¤žā¤° ā¤Ē⤰ ⤏āĨā¤ĩ⤤⤃ ā¤ĩā¤ŋā¤­ā¤žā¤œā¤ŋ⤤ ⤕⤰āĨ‡ā¤‚", + "desc": "ā¤ā¤• PDF ⤕āĨ‹ ā¤†ā¤•ā¤žā¤°, ā¤ĒāĨƒā¤ˇāĨā¤  ⤏⤂⤖āĨā¤¯ā¤ž, ā¤¯ā¤ž ā¤Ļ⤏āĨā¤¤ā¤žā¤ĩāĨ‡ā¤œā¤ŧ ⤏⤂⤖āĨā¤¯ā¤ž ⤕āĨ‡ ā¤†ā¤§ā¤žā¤° ā¤Ē⤰ ā¤•ā¤ˆ ā¤Ļ⤏āĨā¤¤ā¤žā¤ĩāĨ‡ā¤œā¤ŧāĨ‹ā¤‚ ā¤ŽāĨ‡ā¤‚ ā¤ĩā¤ŋā¤­ā¤žā¤œā¤ŋ⤤ ⤕⤰āĨ‡ā¤‚" + }, + "replaceColor": { + "title": "Replace & Invert Colour", + "desc": "Replace or invert colours in PDF documents" + }, + "devApi": { + "tags": "API,development,documentation", + "title": "API", + "desc": "Link to API documentation" + }, + "devFolderScanning": { + "tags": "automation,folder,scanning", + "title": "Automated Folder Scanning", + "desc": "Link to automated folder scanning guide" + }, + "devSsoGuide": { + "title": "SSO Guide", + "desc": "Link to SSO guide" + }, + "devAirgapped": { + "title": "Air-gapped Setup", + "desc": "Link to air-gapped setup guide" + }, + "addPassword": { + "title": "ā¤Ēā¤žā¤¸ā¤ĩ⤰āĨā¤Ą ⤜āĨ‹ā¤Ąā¤ŧāĨ‡ā¤‚", + "desc": "ā¤Ēā¤žā¤¸ā¤ĩ⤰āĨā¤Ą ⤕āĨ‡ ā¤¸ā¤žā¤Ĩ ⤅ā¤Ē⤍āĨ‡ PDF ā¤Ļ⤏āĨā¤¤ā¤žā¤ĩāĨ‡ā¤œ ⤕āĨ‹ ā¤ā¤¨āĨā¤•āĨā¤°ā¤ŋā¤ĒāĨā¤Ÿ ⤕⤰āĨ‡ā¤‚āĨ¤" + }, + "changePermissions": { + "title": "⤅⤍āĨā¤Žā¤¤ā¤ŋā¤¯ā¤žā¤‚ ā¤Ŧā¤Ļ⤞āĨ‡ā¤‚", + "desc": "Change document restrictions and permissions" + }, + "automate": { + "tags": "workflow,sequence,automation", + "title": "Automate", + "desc": "Build multi-step workflows by chaining together PDF actions. Ideal for recurring tasks." + }, + "overlay-pdfs": { + "desc": "PDF ⤕āĨ‹ ā¤ĻāĨ‚⤏⤰āĨ€ PDF ⤕āĨ‡ ⤊ā¤Ē⤰ ⤓ā¤ĩ⤰⤞āĨ‡ ⤕⤰āĨ‡ā¤‚", + "title": "PDF ⤓ā¤ĩ⤰⤞āĨ‡ ⤕⤰āĨ‡ā¤‚" + }, "imageToPDF": { "title": "⤛ā¤ĩā¤ŋ ⤏āĨ‡ PDF", "desc": "⤛ā¤ĩā¤ŋ (PNG, JPEG, GIF) ⤕āĨ‹ PDF ā¤ŽāĨ‡ā¤‚ ā¤Ŧā¤Ļ⤞āĨ‡ā¤‚āĨ¤" @@ -355,18 +786,6 @@ "title": "PDF ⤏āĨ‡ ⤛ā¤ĩā¤ŋ", "desc": "PDF ⤕āĨ‹ ⤛ā¤ĩā¤ŋ ā¤ŽāĨ‡ā¤‚ ā¤Ŧā¤Ļ⤞āĨ‡ā¤‚āĨ¤ (PNG, JPEG, GIF)" }, - "pdfOrganiser": { - "title": "ā¤ĩāĨā¤¯ā¤ĩ⤏āĨā¤Ĩā¤ŋ⤤ ⤕⤰āĨ‡ā¤‚", - "desc": "⤕ā¤ŋ⤏āĨ€ ⤭āĨ€ ⤕āĨā¤°ā¤Ž ā¤ŽāĨ‡ā¤‚ ā¤ĒāĨƒā¤ˇāĨā¤  ⤍ā¤ŋā¤•ā¤žā¤˛āĨ‡ā¤‚/ā¤ĒāĨā¤¨ā¤°āĨā¤ĩāĨā¤¯ā¤ĩ⤏āĨā¤Ĩā¤ŋ⤤ ⤕⤰āĨ‡ā¤‚" - }, - "addImage": { - "title": "⤛ā¤ĩā¤ŋ ⤜āĨ‹ā¤Ąā¤ŧāĨ‡ā¤‚", - "desc": "PDF ā¤Ē⤰ ā¤ā¤• ⤍ā¤ŋ⤰āĨā¤§ā¤žā¤°ā¤ŋ⤤ ⤏āĨā¤Ĩā¤žā¤¨ ā¤Ē⤰ ⤛ā¤ĩā¤ŋ ⤜āĨ‹ā¤Ąā¤ŧāĨ‡ā¤‚" - }, - "watermark": { - "title": "ā¤ĩāĨ‰ā¤Ÿā¤°ā¤Žā¤žā¤°āĨā¤• ⤜āĨ‹ā¤Ąā¤ŧāĨ‡ā¤‚", - "desc": "⤅ā¤Ē⤍āĨ‡ PDF ā¤Ļ⤏āĨā¤¤ā¤žā¤ĩāĨ‡ā¤œ ā¤ŽāĨ‡ā¤‚ ⤕⤏āĨā¤Ÿā¤Ž ā¤ĩāĨ‰ā¤Ÿā¤°ā¤Žā¤žā¤°āĨā¤• ⤜āĨ‹ā¤Ąā¤ŧāĨ‡ā¤‚āĨ¤" - }, "permissions": { "title": "⤅⤍āĨā¤Žā¤¤ā¤ŋā¤¯ā¤žā¤‚ ā¤Ŧā¤Ļ⤞āĨ‡ā¤‚", "desc": "⤅ā¤Ē⤍āĨ‡ PDF ā¤Ļ⤏āĨā¤¤ā¤žā¤ĩāĨ‡ā¤œ ⤕āĨ€ ⤅⤍āĨā¤Žā¤¤ā¤ŋā¤¯ā¤žā¤‚ ā¤Ŧā¤Ļ⤞āĨ‡ā¤‚" @@ -375,38 +794,10 @@ "title": "⤍ā¤ŋā¤•ā¤žā¤˛āĨ‡ā¤‚", "desc": "⤅ā¤Ē⤍āĨ‡ PDF ā¤Ļ⤏āĨā¤¤ā¤žā¤ĩāĨ‡ā¤œ ⤏āĨ‡ ⤅ā¤ĩā¤žā¤‚ā¤›ā¤ŋ⤤ ā¤ĒāĨƒā¤ˇāĨā¤  ā¤šā¤Ÿā¤žā¤ā¤‚āĨ¤" }, - "addPassword": { - "title": "ā¤Ēā¤žā¤¸ā¤ĩ⤰āĨā¤Ą ⤜āĨ‹ā¤Ąā¤ŧāĨ‡ā¤‚", - "desc": "ā¤Ēā¤žā¤¸ā¤ĩ⤰āĨā¤Ą ⤕āĨ‡ ā¤¸ā¤žā¤Ĩ ⤅ā¤Ē⤍āĨ‡ PDF ā¤Ļ⤏āĨā¤¤ā¤žā¤ĩāĨ‡ā¤œ ⤕āĨ‹ ā¤ā¤¨āĨā¤•āĨā¤°ā¤ŋā¤ĒāĨā¤Ÿ ⤕⤰āĨ‡ā¤‚āĨ¤" - }, - "removePassword": { - "title": "ā¤Ēā¤žā¤¸ā¤ĩ⤰āĨā¤Ą ā¤šā¤Ÿā¤žā¤ā¤‚", - "desc": "⤅ā¤Ē⤍āĨ‡ PDF ā¤Ļ⤏āĨā¤¤ā¤žā¤ĩāĨ‡ā¤œ ⤏āĨ‡ ā¤Ēā¤žā¤¸ā¤ĩ⤰āĨā¤Ą ⤏āĨā¤°ā¤•āĨā¤ˇā¤ž ā¤šā¤Ÿā¤žā¤ā¤‚āĨ¤" - }, - "compress": { - "title": "ā¤•ā¤ŽāĨā¤ĒāĨā¤°āĨ‡ā¤¸", - "desc": "PDF ⤕āĨ‹ ā¤•ā¤ŽāĨā¤ĒāĨā¤°āĨ‡ā¤¸ ⤕⤰āĨ‡ā¤‚ ā¤¤ā¤žā¤•ā¤ŋ ā¤‰ā¤¨ā¤•ā¤ž ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤†ā¤•ā¤žā¤° ā¤•ā¤Ž ā¤šāĨ‹ ā¤œā¤žā¤āĨ¤" - }, - "unlockPDFForms": { - "title": "Unlock PDF Forms", - "desc": "Remove read-only property of form fields in a PDF document." - }, - "changeMetadata": { - "title": "ā¤ŽāĨ‡ā¤Ÿā¤žā¤ĄāĨ‡ā¤Ÿā¤ž ā¤Ŧā¤Ļ⤞āĨ‡ā¤‚", - "desc": "PDF ā¤Ļ⤏āĨā¤¤ā¤žā¤ĩāĨ‡ā¤œ ⤏āĨ‡ ā¤ŽāĨ‡ā¤Ÿā¤žā¤ĄāĨ‡ā¤Ÿā¤ž ā¤Ŧā¤Ļ⤞āĨ‡ā¤‚/ā¤šā¤Ÿā¤žā¤ā¤‚/⤜āĨ‹ā¤Ąā¤ŧāĨ‡ā¤‚" - }, "fileToPDF": { "title": "ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ⤕āĨ‹ PDF ā¤ŽāĨ‡ā¤‚ ā¤Ŧā¤Ļ⤞āĨ‡ā¤‚", "desc": "⤞⤗⤭⤗ ⤕ā¤ŋ⤏āĨ€ ⤭āĨ€ ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ⤕āĨ‹ PDF ā¤ŽāĨ‡ā¤‚ ā¤Ŧā¤Ļ⤞āĨ‡ā¤‚ (DOCX, PNG, XLS, PPT, TXT ⤔⤰ ⤅⤧ā¤ŋ⤕)" }, - "ocr": { - "title": "OCR / ⤏āĨā¤•āĨˆā¤¨ ā¤¸ā¤žā¤Ģ ⤕⤰āĨ‡ā¤‚", - "desc": "⤏āĨā¤•āĨˆā¤¨ ⤕āĨ‹ ā¤¸ā¤žā¤Ģ ⤕⤰āĨ‡ā¤‚ ⤔⤰ PDF ⤕āĨ‡ ⤅⤂ā¤Ļ⤰ ⤛ā¤ĩā¤ŋ⤝āĨ‹ā¤‚ ⤏āĨ‡ ⤟āĨ‡ā¤•āĨā¤¸āĨā¤Ÿ ā¤•ā¤ž ā¤Ēā¤¤ā¤ž ā¤˛ā¤—ā¤žā¤ā¤‚ ⤔⤰ ⤉⤏āĨ‡ ⤟āĨ‡ā¤•āĨā¤¸āĨā¤Ÿ ⤕āĨ‡ ⤰āĨ‚ā¤Ē ā¤ŽāĨ‡ā¤‚ ā¤Ģā¤ŋ⤰ ⤏āĨ‡ ⤜āĨ‹ā¤Ąā¤ŧāĨ‡ā¤‚āĨ¤" - }, - "extractImages": { - "title": "⤛ā¤ĩā¤ŋā¤¯ā¤žā¤‚ ⤍ā¤ŋā¤•ā¤žā¤˛āĨ‡ā¤‚", - "desc": "PDF ⤏āĨ‡ ⤏⤭āĨ€ ⤛ā¤ĩā¤ŋ⤝āĨ‹ā¤‚ ⤕āĨ‹ ⤍ā¤ŋā¤•ā¤žā¤˛āĨ‡ā¤‚ ⤔⤰ ⤉⤍āĨā¤šāĨ‡ā¤‚ ⤜ā¤ŧā¤ŋā¤Ē ā¤ŽāĨ‡ā¤‚ ā¤¸ā¤šāĨ‡ā¤œāĨ‡ā¤‚" - }, "pdfToPDFA": { "title": "PDF ⤏āĨ‡ PDF/A", "desc": "⤞⤂ā¤ŦāĨ€ ⤅ā¤ĩ⤧ā¤ŋ ⤕āĨ‡ ā¤­ā¤‚ā¤Ąā¤žā¤°ā¤Ŗ ⤕āĨ‡ ⤞ā¤ŋā¤ PDF ⤕āĨ‹ PDF/A ā¤ŽāĨ‡ā¤‚ ā¤Ŧā¤Ļ⤞āĨ‡ā¤‚" @@ -435,70 +826,14 @@ "title": "⤏āĨā¤•āĨˆā¤¨ ⤕āĨ€ ā¤—ā¤ˆ ā¤ĢāĨ‹ā¤ŸāĨ‹ ā¤•ā¤ž ā¤Ēā¤¤ā¤ž ā¤˛ā¤—ā¤žā¤ā¤‚/ā¤ĩā¤ŋā¤­ā¤žā¤œā¤ŋ⤤ ⤕⤰āĨ‡ā¤‚", "desc": "ā¤ĢāĨ‹ā¤ŸāĨ‹/PDF ⤕āĨ‡ ⤅⤂ā¤Ļ⤰ ⤏āĨ‡ ā¤•ā¤ˆ ā¤ĢāĨ‹ā¤ŸāĨ‹ ⤕āĨ‹ ā¤ĩā¤ŋā¤­ā¤žā¤œā¤ŋ⤤ ⤕⤰āĨ‡ā¤‚" }, - "sign": { - "title": "ā¤šā¤¸āĨā¤¤ā¤žā¤•āĨā¤ˇā¤° ⤕⤰āĨ‡ā¤‚", - "desc": "⤚ā¤ŋ⤤āĨā¤° ā¤Ŧā¤¨ā¤žā¤•ā¤°, ⤟āĨ‡ā¤•āĨā¤¸āĨā¤Ÿ ā¤¯ā¤ž ⤛ā¤ĩā¤ŋ ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž PDF ā¤ŽāĨ‡ā¤‚ ā¤šā¤¸āĨā¤¤ā¤žā¤•āĨā¤ˇā¤° ⤜āĨ‹ā¤Ąā¤ŧāĨ‡ā¤‚" - }, - "flatten": { - "title": "ā¤¸ā¤Žā¤¤ā¤˛ ⤕⤰āĨ‡ā¤‚", - "desc": "PDF ⤏āĨ‡ ⤏⤭āĨ€ ā¤‡ā¤‚ā¤Ÿā¤°āĨˆā¤•āĨā¤Ÿā¤ŋā¤ĩ ⤤⤤āĨā¤ĩāĨ‹ā¤‚ ⤔⤰ ā¤ĢāĨ‰ā¤°āĨā¤Ž ⤕āĨ‹ ā¤šā¤Ÿā¤žā¤ā¤‚" - }, - "repair": { - "title": "ā¤Žā¤°ā¤ŽāĨā¤Žā¤¤ ⤕⤰āĨ‡ā¤‚", - "desc": "ā¤–ā¤°ā¤žā¤Ŧ/⤟āĨ‚ā¤ŸāĨ€ ā¤šāĨā¤ˆ PDF ⤕āĨ‹ ⤠āĨ€ā¤• ⤕⤰⤍āĨ‡ ā¤•ā¤ž ā¤ĒāĨā¤°ā¤¯ā¤žā¤¸ ⤕⤰āĨ‡ā¤‚" - }, - "removeBlanks": { - "title": "ā¤–ā¤žā¤˛āĨ€ ā¤ĒāĨƒā¤ˇāĨā¤  ā¤šā¤Ÿā¤žā¤ā¤‚", - "desc": "ā¤Ļ⤏āĨā¤¤ā¤žā¤ĩāĨ‡ā¤œā¤ŧ ⤏āĨ‡ ā¤–ā¤žā¤˛āĨ€ ā¤ĒāĨƒā¤ˇāĨā¤ āĨ‹ā¤‚ ā¤•ā¤ž ā¤Ēā¤¤ā¤ž ā¤˛ā¤—ā¤žā¤ā¤‚ ⤔⤰ ā¤šā¤Ÿā¤žā¤ā¤‚" - }, - "removeAnnotations": { - "title": "⤟ā¤ŋā¤ĒāĨā¤Ē⤪ā¤ŋā¤¯ā¤žā¤‚ ā¤šā¤Ÿā¤žā¤ā¤‚", - "desc": "PDF ⤏āĨ‡ ⤏⤭āĨ€ ⤟ā¤ŋā¤ĒāĨā¤Ē⤪ā¤ŋā¤¯ā¤žā¤‚/ā¤ā¤¨āĨ‹ā¤ŸāĨ‡ā¤ļ⤍ ā¤šā¤Ÿā¤žā¤ā¤‚" - }, - "compare": { - "title": "⤤āĨā¤˛ā¤¨ā¤ž ⤕⤰āĨ‡ā¤‚", - "desc": "2 PDF ā¤Ļ⤏āĨā¤¤ā¤žā¤ĩāĨ‡ā¤œāĨ‹ā¤‚ ⤕āĨ‡ ā¤ŦāĨ€ā¤š ⤅⤂⤤⤰ ⤕āĨ€ ⤤āĨā¤˛ā¤¨ā¤ž ⤕⤰āĨ‡ā¤‚ ⤔⤰ ā¤Ļā¤ŋā¤–ā¤žā¤ā¤‚" - }, - "certSign": { - "title": "ā¤ĒāĨā¤°ā¤Žā¤žā¤Ŗā¤Ē⤤āĨā¤° ⤏āĨ‡ ā¤šā¤¸āĨā¤¤ā¤žā¤•āĨā¤ˇā¤° ⤕⤰āĨ‡ā¤‚", - "desc": "ā¤ĒāĨā¤°ā¤Žā¤žā¤Ŗā¤Ē⤤āĨā¤°/⤕āĨā¤‚ā¤œāĨ€ (PEM/P12) ⤏āĨ‡ PDF ā¤Ē⤰ ā¤šā¤¸āĨā¤¤ā¤žā¤•āĨā¤ˇā¤° ⤕⤰āĨ‡ā¤‚" - }, - "removeCertSign": { - "title": "ā¤ĒāĨā¤°ā¤Žā¤žā¤Ŗā¤Ē⤤āĨā¤° ā¤šā¤¸āĨā¤¤ā¤žā¤•āĨā¤ˇā¤° ā¤šā¤Ÿā¤žā¤ā¤‚", - "desc": "PDF ⤏āĨ‡ ā¤ĒāĨā¤°ā¤Žā¤žā¤Ŗā¤Ē⤤āĨā¤° ā¤šā¤¸āĨā¤¤ā¤žā¤•āĨā¤ˇā¤° ā¤šā¤Ÿā¤žā¤ā¤‚" - }, - "pageLayout": { - "title": "ā¤Žā¤˛āĨā¤ŸāĨ€-ā¤ĒāĨ‡ā¤œ ⤞āĨ‡ā¤†ā¤‰ā¤Ÿ", - "desc": "PDF ā¤Ļ⤏āĨā¤¤ā¤žā¤ĩāĨ‡ā¤œ ⤕āĨ‡ ā¤•ā¤ˆ ā¤ĒāĨƒā¤ˇāĨā¤ āĨ‹ā¤‚ ⤕āĨ‹ ā¤ā¤• ā¤ĒāĨƒā¤ˇāĨā¤  ā¤ŽāĨ‡ā¤‚ ā¤Žā¤°āĨā¤œ ⤕⤰āĨ‡ā¤‚" - }, - "scalePages": { - "title": "ā¤ĒāĨƒā¤ˇāĨā¤  ā¤†ā¤•ā¤žā¤°/⤏āĨā¤•āĨ‡ā¤˛ ā¤¸ā¤Žā¤žā¤¯āĨ‹ā¤œā¤ŋ⤤ ⤕⤰āĨ‡ā¤‚", - "desc": "ā¤ĒāĨƒā¤ˇāĨā¤  ⤔⤰/ā¤¯ā¤ž ⤉⤏⤕āĨ€ ā¤¸ā¤žā¤Žā¤—āĨā¤°āĨ€ ā¤•ā¤ž ā¤†ā¤•ā¤žā¤°/⤏āĨā¤•āĨ‡ā¤˛ ā¤Ŧā¤Ļ⤞āĨ‡ā¤‚āĨ¤" - }, "pipeline": { "title": "ā¤Ēā¤žā¤‡ā¤Ēā¤˛ā¤žā¤‡ā¤¨", "desc": "ā¤Ēā¤žā¤‡ā¤Ēā¤˛ā¤žā¤‡ā¤¨ ⤏āĨā¤•āĨā¤°ā¤ŋā¤ĒāĨā¤Ÿ ā¤Ē⤰ā¤ŋā¤­ā¤žā¤ˇā¤ŋ⤤ ⤕⤰⤕āĨ‡ PDF ā¤Ē⤰ ā¤•ā¤ˆ ā¤•ā¤žā¤°āĨā¤¯ ⤕⤰āĨ‡ā¤‚" }, - "addPageNumbers": { - "title": "ā¤ĒāĨƒā¤ˇāĨā¤  ⤏⤂⤖āĨā¤¯ā¤ž ⤜āĨ‹ā¤Ąā¤ŧāĨ‡ā¤‚", - "desc": "ā¤Ļ⤏āĨā¤¤ā¤žā¤ĩāĨ‡ā¤œā¤ŧ ā¤ŽāĨ‡ā¤‚ ā¤ā¤• ⤍ā¤ŋ⤰āĨā¤§ā¤žā¤°ā¤ŋ⤤ ⤏āĨā¤Ĩā¤žā¤¨ ā¤Ē⤰ ā¤ĒāĨƒā¤ˇāĨā¤  ⤏⤂⤖āĨā¤¯ā¤ž ⤜āĨ‹ā¤Ąā¤ŧāĨ‡ā¤‚" - }, "auto-rename": { "title": "⤏āĨā¤ĩ⤤⤃ PDF ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤•ā¤ž ā¤¨ā¤žā¤Ž ā¤Ŧā¤Ļ⤞āĨ‡ā¤‚", "desc": "ā¤Ēā¤žā¤ ā¤—ā¤ ā¤šāĨ‡ā¤Ąā¤° ⤕āĨ‡ ā¤†ā¤§ā¤žā¤° ā¤Ē⤰ PDF ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤•ā¤ž ā¤¨ā¤žā¤Ž ⤏āĨā¤ĩā¤šā¤žā¤˛ā¤ŋ⤤ ⤰āĨ‚ā¤Ē ⤏āĨ‡ ā¤Ŧā¤Ļ⤞āĨ‡ā¤‚" }, - "adjustContrast": { - "title": "⤰⤂⤗/ā¤•ā¤‚ā¤ŸāĨā¤°ā¤žā¤¸āĨā¤Ÿ ā¤¸ā¤Žā¤žā¤¯āĨ‹ā¤œā¤ŋ⤤ ⤕⤰āĨ‡ā¤‚", - "desc": "PDF ā¤•ā¤ž ā¤•ā¤‚ā¤ŸāĨā¤°ā¤žā¤¸āĨā¤Ÿ, ⤏⤂⤤āĨƒā¤ĒāĨā¤¤ā¤ŋ ⤔⤰ ā¤šā¤Žā¤• ā¤¸ā¤Žā¤žā¤¯āĨ‹ā¤œā¤ŋ⤤ ⤕⤰āĨ‡ā¤‚" - }, - "crop": { - "title": "PDF ⤕āĨā¤°āĨ‰ā¤Ē ⤕⤰āĨ‡ā¤‚", - "desc": "ā¤†ā¤•ā¤žā¤° ā¤•ā¤Ž ⤕⤰⤍āĨ‡ ⤕āĨ‡ ⤞ā¤ŋā¤ PDF ⤕āĨ‹ ⤕āĨā¤°āĨ‰ā¤Ē ⤕⤰āĨ‡ā¤‚ (⤟āĨ‡ā¤•āĨā¤¸āĨā¤Ÿ ā¤Ŧā¤¨ā¤žā¤ ⤰⤖āĨ‡ā¤‚!)" - }, - "autoSplitPDF": { - "title": "⤏āĨā¤ĩ⤤⤃ ā¤ĒāĨƒā¤ˇāĨā¤  ā¤ĩā¤ŋā¤­ā¤žā¤œā¤ŋ⤤ ⤕⤰āĨ‡ā¤‚", - "desc": "⤭āĨŒā¤¤ā¤ŋ⤕ ⤏āĨā¤•āĨˆā¤¨ ⤕ā¤ŋā¤ ā¤—ā¤ ā¤ĒāĨƒā¤ˇāĨā¤  ā¤ĩā¤ŋā¤­ā¤žā¤œā¤• QR ⤕āĨ‹ā¤Ą ⤕āĨ‡ ā¤¸ā¤žā¤Ĩ ⤏āĨā¤•āĨˆā¤¨ ⤕āĨ€ ā¤—ā¤ˆ PDF ⤕āĨ‹ ⤏āĨā¤ĩ⤤⤃ ā¤ĩā¤ŋā¤­ā¤žā¤œā¤ŋ⤤ ⤕⤰āĨ‡ā¤‚" - }, "sanitizePDF": { "title": "⤏āĨˆā¤¨ā¤ŋā¤Ÿā¤žā¤‡ā¤œā¤ŧ", "desc": "PDF ā¤Ģā¤ŧā¤žā¤‡ā¤˛āĨ‹ā¤‚ ⤏āĨ‡ ⤏āĨā¤•āĨā¤°ā¤ŋā¤ĒāĨā¤Ÿ ⤔⤰ ⤅⤍āĨā¤¯ ⤤⤤āĨā¤ĩāĨ‹ā¤‚ ⤕āĨ‹ ā¤šā¤Ÿā¤žā¤ā¤‚" @@ -519,30 +854,14 @@ "title": "PDF to Markdown", "desc": "Converts any PDF to Markdown" }, - "getPdfInfo": { - "title": "PDF ⤕āĨ€ ⤏⤭āĨ€ ā¤œā¤žā¤¨ā¤•ā¤žā¤°āĨ€ ā¤ĒāĨā¤°ā¤žā¤ĒāĨā¤¤ ⤕⤰āĨ‡ā¤‚", - "desc": "PDF ⤏āĨ‡ ⤏⤂⤭ā¤ĩ ⤏⤭āĨ€ ā¤œā¤žā¤¨ā¤•ā¤žā¤°āĨ€ ā¤ĒāĨā¤°ā¤žā¤ĒāĨā¤¤ ⤕⤰āĨ‡ā¤‚" - }, "pageExtracter": { "title": "ā¤ĒāĨƒā¤ˇāĨā¤  ⤍ā¤ŋā¤•ā¤žā¤˛āĨ‡ā¤‚", "desc": "PDF ⤏āĨ‡ ⤚⤝⤍ā¤ŋ⤤ ā¤ĒāĨƒā¤ˇāĨā¤ āĨ‹ā¤‚ ⤕āĨ‹ ⤍ā¤ŋā¤•ā¤žā¤˛āĨ‡ā¤‚" }, - "pdfToSinglePage": { - "title": "ā¤ā¤• ā¤Ŧā¤Ąā¤ŧā¤ž ā¤ĒāĨƒā¤ˇāĨā¤ ", - "desc": "⤏⤭āĨ€ PDF ā¤ĒāĨƒā¤ˇāĨā¤ āĨ‹ā¤‚ ⤕āĨ‹ ā¤ā¤• ā¤Ŧā¤Ąā¤ŧāĨ‡ ā¤ā¤•ā¤˛ ā¤ĒāĨƒā¤ˇāĨā¤  ā¤ŽāĨ‡ā¤‚ ā¤Žā¤°āĨā¤œ ⤕⤰āĨ‡ā¤‚" - }, - "showJS": { - "title": "ā¤œā¤žā¤ĩā¤žā¤¸āĨā¤•āĨā¤°ā¤ŋā¤ĒāĨā¤Ÿ ā¤Ļā¤ŋā¤–ā¤žā¤ā¤‚", - "desc": "PDF ā¤ŽāĨ‡ā¤‚ ā¤‡ā¤‚ā¤œāĨ‡ā¤•āĨā¤Ÿ ⤕ā¤ŋā¤ ā¤—ā¤ ⤕ā¤ŋ⤏āĨ€ ⤭āĨ€ ā¤œā¤žā¤ĩā¤žā¤¸āĨā¤•āĨā¤°ā¤ŋā¤ĒāĨā¤Ÿ ⤕āĨ‹ ⤖āĨ‹ā¤œāĨ‡ā¤‚ ⤔⤰ ā¤Ļā¤ŋā¤–ā¤žā¤ā¤‚" - }, "autoRedact": { "title": "⤏āĨā¤ĩ⤤⤃ ⤗āĨ‹ā¤Ē⤍āĨ€ā¤¯ā¤•⤰⤪", "desc": "⤇⤍ā¤ĒāĨā¤Ÿ ⤟āĨ‡ā¤•āĨā¤¸āĨā¤Ÿ ⤕āĨ‡ ā¤†ā¤§ā¤žā¤° ā¤Ē⤰ PDF ā¤ŽāĨ‡ā¤‚ ⤟āĨ‡ā¤•āĨā¤¸āĨā¤Ÿ ⤕āĨ‹ ⤏āĨā¤ĩ⤤⤃ ⤗āĨ‹ā¤Ē⤍āĨ€ā¤¯ā¤•āĨƒā¤¤ ⤕⤰āĨ‡ā¤‚ (ā¤•ā¤žā¤˛ā¤ž ⤕⤰āĨ‡ā¤‚)" }, - "redact": { - "title": "ā¤ŽāĨˆā¤¨āĨā¤…⤞ ⤗āĨ‹ā¤Ē⤍āĨ€ā¤¯ā¤•⤰⤪", - "desc": "⤚⤝⤍ā¤ŋ⤤ ⤟āĨ‡ā¤•āĨā¤¸āĨā¤Ÿ, ā¤Ŧā¤¨ā¤žā¤ˆ ā¤—ā¤ˆ ⤆⤕āĨƒā¤¤ā¤ŋ⤝āĨ‹ā¤‚ ⤔⤰/ā¤¯ā¤ž ⤚⤝⤍ā¤ŋ⤤ ā¤ĒāĨƒā¤ˇāĨā¤ āĨ‹ā¤‚ ⤕āĨ‡ ā¤†ā¤§ā¤žā¤° ā¤Ē⤰ PDF ⤕āĨ‹ ⤗āĨ‹ā¤Ē⤍āĨ€ā¤¯ā¤•āĨƒā¤¤ ⤕⤰āĨ‡ā¤‚" - }, "PDFToCSV": { "title": "PDF ⤏āĨ‡ CSV", "desc": "PDF ⤏āĨ‡ ā¤¤ā¤žā¤˛ā¤ŋā¤•ā¤žā¤“ā¤‚ ⤕āĨ‹ ⤍ā¤ŋā¤•ā¤žā¤˛ā¤•ā¤° CSV ā¤ŽāĨ‡ā¤‚ ā¤Ŧā¤Ļ⤞āĨ‡ā¤‚" @@ -551,10 +870,6 @@ "title": "ā¤†ā¤•ā¤žā¤°/⤏⤂⤖āĨā¤¯ā¤ž ⤕āĨ‡ ā¤†ā¤§ā¤žā¤° ā¤Ē⤰ ⤏āĨā¤ĩ⤤⤃ ā¤ĩā¤ŋā¤­ā¤žā¤œā¤ŋ⤤ ⤕⤰āĨ‡ā¤‚", "desc": "ā¤ā¤• PDF ⤕āĨ‹ ā¤†ā¤•ā¤žā¤°, ā¤ĒāĨƒā¤ˇāĨā¤  ⤏⤂⤖āĨā¤¯ā¤ž, ā¤¯ā¤ž ā¤Ļ⤏āĨā¤¤ā¤žā¤ĩāĨ‡ā¤œā¤ŧ ⤏⤂⤖āĨā¤¯ā¤ž ⤕āĨ‡ ā¤†ā¤§ā¤žā¤° ā¤Ē⤰ ā¤•ā¤ˆ ā¤Ļ⤏āĨā¤¤ā¤žā¤ĩāĨ‡ā¤œā¤ŧāĨ‹ā¤‚ ā¤ŽāĨ‡ā¤‚ ā¤ĩā¤ŋā¤­ā¤žā¤œā¤ŋ⤤ ⤕⤰āĨ‡ā¤‚" }, - "overlay-pdfs": { - "title": "PDF ⤓ā¤ĩ⤰⤞āĨ‡ ⤕⤰āĨ‡ā¤‚", - "desc": "PDF ⤕āĨ‹ ā¤ĻāĨ‚⤏⤰āĨ€ PDF ⤕āĨ‡ ⤊ā¤Ē⤰ ⤓ā¤ĩ⤰⤞āĨ‡ ⤕⤰āĨ‡ā¤‚" - }, "split-by-sections": { "title": "ā¤–ā¤‚ā¤ĄāĨ‹ā¤‚ ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž PDF ā¤ĩā¤ŋā¤­ā¤žā¤œā¤ŋ⤤ ⤕⤰āĨ‡ā¤‚", "desc": "PDF ⤕āĨ‡ ā¤ĒāĨā¤°ā¤¤āĨā¤¯āĨ‡ā¤• ā¤ĒāĨƒā¤ˇāĨā¤  ⤕āĨ‹ ⤛āĨ‹ā¤ŸāĨ‡ ⤕āĨā¤ˇāĨˆā¤¤ā¤ŋ⤜ ⤔⤰ ⤊⤰āĨā¤§āĨā¤ĩā¤žā¤§ā¤° ā¤–ā¤‚ā¤ĄāĨ‹ā¤‚ ā¤ŽāĨ‡ā¤‚ ā¤ĩā¤ŋā¤­ā¤žā¤œā¤ŋ⤤ ⤕⤰āĨ‡ā¤‚" @@ -563,43 +878,17 @@ "title": "PDF ā¤ŽāĨ‡ā¤‚ ⤏āĨā¤ŸāĨˆā¤ŽāĨā¤Ē ⤜āĨ‹ā¤Ąā¤ŧāĨ‡ā¤‚", "desc": "⤍ā¤ŋ⤰āĨā¤§ā¤žā¤°ā¤ŋ⤤ ⤏āĨā¤Ĩā¤žā¤¨āĨ‹ā¤‚ ā¤Ē⤰ ⤟āĨ‡ā¤•āĨā¤¸āĨā¤Ÿ ā¤¯ā¤ž ⤛ā¤ĩā¤ŋ ⤏āĨā¤ŸāĨˆā¤ŽāĨā¤Ē ⤜āĨ‹ā¤Ąā¤ŧāĨ‡ā¤‚" }, - "removeImage": { - "title": "⤛ā¤ĩā¤ŋ ā¤šā¤Ÿā¤žā¤ā¤‚", - "desc": "ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤†ā¤•ā¤žā¤° ā¤•ā¤Ž ⤕⤰⤍āĨ‡ ⤕āĨ‡ ⤞ā¤ŋā¤ PDF ⤏āĨ‡ ⤛ā¤ĩā¤ŋ ā¤šā¤Ÿā¤žā¤ā¤‚" - }, - "splitByChapters": { - "title": "⤅⤧āĨā¤¯ā¤žā¤¯āĨ‹ā¤‚ ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž PDF ā¤ĩā¤ŋā¤­ā¤žā¤œā¤ŋ⤤ ⤕⤰āĨ‡ā¤‚", - "desc": "PDF ⤕āĨ‹ ⤉⤏⤕āĨ€ ⤅⤧āĨā¤¯ā¤žā¤¯ ā¤¸ā¤‚ā¤°ā¤šā¤¨ā¤ž ⤕āĨ‡ ā¤†ā¤§ā¤žā¤° ā¤Ē⤰ ā¤•ā¤ˆ ā¤Ģā¤ŧā¤žā¤‡ā¤˛āĨ‹ā¤‚ ā¤ŽāĨ‡ā¤‚ ā¤ĩā¤ŋā¤­ā¤žā¤œā¤ŋ⤤ ⤕⤰āĨ‡ā¤‚āĨ¤" - }, - "validateSignature": { - "title": "PDF ā¤šā¤¸āĨā¤¤ā¤žā¤•āĨā¤ˇā¤° ⤏⤤āĨā¤¯ā¤žā¤Ēā¤ŋ⤤ ⤕⤰āĨ‡ā¤‚", - "desc": "PDF ā¤Ļ⤏āĨā¤¤ā¤žā¤ĩāĨ‡ā¤œāĨ‹ā¤‚ ā¤ŽāĨ‡ā¤‚ ā¤Ąā¤ŋ⤜ā¤ŋ⤟⤞ ā¤šā¤¸āĨā¤¤ā¤žā¤•āĨā¤ˇā¤° ⤔⤰ ā¤ĒāĨā¤°ā¤Žā¤žā¤Ŗā¤Ē⤤āĨā¤°āĨ‹ā¤‚ ⤕āĨ‹ ⤏⤤āĨā¤¯ā¤žā¤Ēā¤ŋ⤤ ⤕⤰āĨ‡ā¤‚" - }, "replace-color": { "title": "⤰⤂⤗ ā¤Ŧā¤Ļ⤞āĨ‡ā¤‚ ⤔⤰ ⤉⤞āĨā¤Ÿā¤ž ⤕⤰āĨ‡ā¤‚", "desc": "PDF ā¤ŽāĨ‡ā¤‚ ⤟āĨ‡ā¤•āĨā¤¸āĨā¤Ÿ ⤔⤰ ā¤ĒāĨƒā¤ˇāĨā¤ ā¤­āĨ‚ā¤Žā¤ŋ ⤕āĨ‡ ⤞ā¤ŋā¤ ⤰⤂⤗ ā¤Ŧā¤Ļ⤞āĨ‡ā¤‚ ⤔⤰ ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤†ā¤•ā¤žā¤° ā¤•ā¤Ž ⤕⤰⤍āĨ‡ ⤕āĨ‡ ⤞ā¤ŋā¤ ā¤ĒāĨ‚⤰āĨā¤Ŗ ⤰⤂⤗ ⤕āĨ‹ ⤉⤞āĨā¤Ÿā¤ž ⤕⤰āĨ‡ā¤‚" }, - "convert": { - "title": "ā¤Ŧā¤Ļ⤞āĨ‡ā¤‚" - }, "attachments": { "title": "Add attachments" }, - "extractPages": { - "title": "ā¤ĒāĨƒā¤ˇāĨā¤  ⤍ā¤ŋā¤•ā¤žā¤˛āĨ‡ā¤‚" - }, - "removePages": { - "title": "⤍ā¤ŋā¤•ā¤žā¤˛āĨ‡ā¤‚", - "desc": "⤅ā¤Ē⤍āĨ‡ PDF ā¤Ļ⤏āĨā¤¤ā¤žā¤ĩāĨ‡ā¤œ ⤏āĨ‡ ⤅ā¤ĩā¤žā¤‚ā¤›ā¤ŋ⤤ ā¤ĒāĨƒā¤ˇāĨā¤  ā¤šā¤Ÿā¤žā¤ā¤‚āĨ¤" - }, "removeImagePdf": { "title": "⤛ā¤ĩā¤ŋ ā¤šā¤Ÿā¤žā¤ā¤‚", "desc": "ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤†ā¤•ā¤žā¤° ā¤•ā¤Ž ⤕⤰⤍āĨ‡ ⤕āĨ‡ ⤞ā¤ŋā¤ PDF ⤏āĨ‡ ⤛ā¤ĩā¤ŋ ā¤šā¤Ÿā¤žā¤ā¤‚" }, - "autoSizeSplitPDF": { - "title": "ā¤†ā¤•ā¤žā¤°/⤏⤂⤖āĨā¤¯ā¤ž ⤕āĨ‡ ā¤†ā¤§ā¤žā¤° ā¤Ē⤰ ⤏āĨā¤ĩ⤤⤃ ā¤ĩā¤ŋā¤­ā¤žā¤œā¤ŋ⤤ ⤕⤰āĨ‡ā¤‚", - "desc": "ā¤ā¤• PDF ⤕āĨ‹ ā¤†ā¤•ā¤žā¤°, ā¤ĒāĨƒā¤ˇāĨā¤  ⤏⤂⤖āĨā¤¯ā¤ž, ā¤¯ā¤ž ā¤Ļ⤏āĨā¤¤ā¤žā¤ĩāĨ‡ā¤œā¤ŧ ⤏⤂⤖āĨā¤¯ā¤ž ⤕āĨ‡ ā¤†ā¤§ā¤žā¤° ā¤Ē⤰ ā¤•ā¤ˆ ā¤Ļ⤏āĨā¤¤ā¤žā¤ĩāĨ‡ā¤œā¤ŧāĨ‹ā¤‚ ā¤ŽāĨ‡ā¤‚ ā¤ĩā¤ŋā¤­ā¤žā¤œā¤ŋ⤤ ⤕⤰āĨ‡ā¤‚" - }, "adjust-contrast": { "title": "⤰⤂⤗/ā¤•ā¤‚ā¤ŸāĨā¤°ā¤žā¤¸āĨā¤Ÿ ā¤¸ā¤Žā¤žā¤¯āĨ‹ā¤œā¤ŋ⤤ ⤕⤰āĨ‡ā¤‚", "desc": "PDF ā¤•ā¤ž ā¤•ā¤‚ā¤ŸāĨā¤°ā¤žā¤¸āĨā¤Ÿ, ⤏⤂⤤āĨƒā¤ĒāĨā¤¤ā¤ŋ ⤔⤰ ā¤šā¤Žā¤• ā¤¸ā¤Žā¤žā¤¯āĨ‹ā¤œā¤ŋ⤤ ⤕⤰āĨ‡ā¤‚" @@ -607,11 +896,12 @@ "replaceColorPdf": { "title": "⤰⤂⤗ ā¤Ŧā¤Ļ⤞āĨ‡ā¤‚ ⤔⤰ ⤉⤞āĨā¤Ÿā¤ž ⤕⤰āĨ‡ā¤‚", "desc": "PDF ā¤ŽāĨ‡ā¤‚ ⤟āĨ‡ā¤•āĨā¤¸āĨā¤Ÿ ⤔⤰ ā¤ĒāĨƒā¤ˇāĨā¤ ā¤­āĨ‚ā¤Žā¤ŋ ⤕āĨ‡ ⤞ā¤ŋā¤ ⤰⤂⤗ ā¤Ŧā¤Ļ⤞āĨ‡ā¤‚ ⤔⤰ ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤†ā¤•ā¤žā¤° ā¤•ā¤Ž ⤕⤰⤍āĨ‡ ⤕āĨ‡ ⤞ā¤ŋā¤ ā¤ĒāĨ‚⤰āĨā¤Ŗ ⤰⤂⤗ ⤕āĨ‹ ⤉⤞āĨā¤Ÿā¤ž ⤕⤰āĨ‡ā¤‚" - }, - "changePermissions": { - "title": "⤅⤍āĨā¤Žā¤¤ā¤ŋā¤¯ā¤žā¤‚ ā¤Ŧā¤Ļ⤞āĨ‡ā¤‚" } }, + "landing": { + "addFiles": "Add Files", + "uploadFromComputer": "Upload from computer" + }, "viewPdf": { "tags": "ā¤ĻāĨ‡ā¤–āĨ‡ā¤‚,ā¤Ēā¤ĸā¤ŧāĨ‡ā¤‚,⤟ā¤ŋā¤ĒāĨā¤Ē⤪āĨ€,⤟āĨ‡ā¤•āĨā¤¸āĨā¤Ÿ,⤛ā¤ĩā¤ŋ", "title": "View/Edit PDF", @@ -645,17 +935,39 @@ "merge": { "tags": "ā¤Žā¤°āĨā¤œ,ā¤ĒāĨ‡ā¤œ ⤑ā¤Ē⤰āĨ‡ā¤ļ⤍āĨā¤¸,ā¤ŦāĨˆā¤• ā¤ā¤‚ā¤Ą,⤏⤰āĨā¤ĩ⤰ ā¤¸ā¤žā¤‡ā¤Ą", "title": "ā¤Žā¤°āĨā¤œ ⤕⤰āĨ‡ā¤‚", + "removeDigitalSignature": { + "label": "Remove digital signature in the merged file?", + "tooltip": { + "title": "Remove Digital Signature", + "description": "Digital signatures will be invalidated when merging files. Check this to remove them from the final merged PDF." + } + }, + "generateTableOfContents": { + "label": "Generate table of contents in the merged file?", + "tooltip": { + "title": "Generate Table of Contents", + "description": "Automatically creates a clickable table of contents in the merged PDF based on the original file names and page numbers." + } + }, + "submit": "ā¤Žā¤°āĨā¤œ ⤕⤰āĨ‡ā¤‚", + "sortBy": { + "description": "Files will be merged in the order they're selected. Drag to reorder or sort below.", + "label": "Sort By", + "filename": "ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤¨ā¤žā¤Ž", + "dateModified": "Date Modified", + "ascending": "Ascending", + "descending": "Descending", + "sort": "Sort" + }, + "error": { + "failed": "An error occurred while merging the PDFs." + }, "header": "ā¤•ā¤ˆ PDF ā¤Žā¤°āĨā¤œ ⤕⤰āĨ‡ā¤‚ (2+)", "sortByName": "ā¤¨ā¤žā¤Ž ⤏āĨ‡ ⤕āĨā¤°ā¤Žā¤Ŧā¤ĻāĨā¤§ ⤕⤰āĨ‡ā¤‚", "sortByDate": "⤤ā¤ŋā¤Ĩā¤ŋ ⤏āĨ‡ ⤕āĨā¤°ā¤Žā¤Ŧā¤ĻāĨā¤§ ⤕⤰āĨ‡ā¤‚", - "removeCertSign": "ā¤Žā¤°āĨā¤œ ⤕āĨ€ ā¤—ā¤ˆ ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤ŽāĨ‡ā¤‚ ā¤Ąā¤ŋ⤜ā¤ŋ⤟⤞ ā¤šā¤¸āĨā¤¤ā¤žā¤•āĨā¤ˇā¤° ā¤šā¤Ÿā¤žā¤ā¤‚?", - "submit": "ā¤Žā¤°āĨā¤œ ⤕⤰āĨ‡ā¤‚", - "sortBy": { - "filename": "ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤¨ā¤žā¤Ž" - } + "removeCertSign": "ā¤Žā¤°āĨā¤œ ⤕āĨ€ ā¤—ā¤ˆ ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤ŽāĨ‡ā¤‚ ā¤Ąā¤ŋ⤜ā¤ŋ⤟⤞ ā¤šā¤¸āĨā¤¤ā¤žā¤•āĨā¤ˇā¤° ā¤šā¤Ÿā¤žā¤ā¤‚?" }, "split": { - "tags": "ā¤ĒāĨ‡ā¤œ ⤑ā¤Ē⤰āĨ‡ā¤ļ⤍āĨā¤¸,ā¤Ąā¤ŋā¤ĩā¤žā¤‡ā¤Ą,ā¤Žā¤˛āĨā¤ŸāĨ€ ā¤ĒāĨ‡ā¤œ,ā¤•ā¤Ÿ,⤏⤰āĨā¤ĩ⤰ ā¤¸ā¤žā¤‡ā¤Ą", "title": "PDF ā¤ĩā¤ŋā¤­ā¤žā¤œā¤ŋ⤤ ⤕⤰āĨ‡ā¤‚", "header": "PDF ā¤ĩā¤ŋā¤­ā¤žā¤œā¤ŋ⤤ ⤕⤰āĨ‡ā¤‚", "desc": { @@ -671,25 +983,249 @@ "splitPages": "ā¤ĩā¤ŋā¤­ā¤žā¤œā¤¨ ⤕⤰⤍āĨ‡ ⤕āĨ‡ ⤞ā¤ŋā¤ ā¤ĒāĨƒā¤ˇāĨā¤  ā¤Ļ⤰āĨā¤œ ⤕⤰āĨ‡ā¤‚:", "submit": "ā¤ĩā¤ŋā¤­ā¤žā¤œā¤ŋ⤤ ⤕⤰āĨ‡ā¤‚", "steps": { + "chooseMethod": "Choose Method", "settings": "⤏āĨ‡ā¤Ÿā¤ŋ⤂⤗āĨā¤¸" }, + "settings": { + "selectMethodFirst": "Please select a split method first" + }, + "error": { + "failed": "An error occurred while splitting the PDF." + }, + "method": { + "label": "Choose split method", + "placeholder": "Select how to split the PDF" + }, "methods": { + "prefix": { + "splitAt": "Split at", + "splitBy": "Split by" + }, + "byPages": { + "name": "Page Numbers", + "desc": "Extract specific pages (1,3,5-10)", + "tooltip": "Enter page numbers separated by commas or ranges with hyphens" + }, + "bySections": { + "name": "Sections", + "desc": "Divide pages into grid sections", + "tooltip": "Split each page into horizontal and vertical sections" + }, "bySize": { - "name": "ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤†ā¤•ā¤žā¤°" + "name": "ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤†ā¤•ā¤žā¤°", + "desc": "Limit maximum file size", + "tooltip": "Specify maximum file size (e.g. 10MB, 500KB)" + }, + "byPageCount": { + "name": "Page Count", + "desc": "Fixed pages per file", + "tooltip": "Enter the number of pages for each split file" + }, + "byDocCount": { + "name": "Document Count", + "desc": "Create specific number of files", + "tooltip": "Enter how many files you want to create" + }, + "byChapters": { + "name": "Chapters", + "desc": "Split at bookmark boundaries", + "tooltip": "Uses PDF bookmarks to determine split points" + }, + "byPageDivider": { + "name": "Page Divider", + "desc": "Auto-split with divider sheets", + "tooltip": "Use QR code divider sheets between documents when scanning" } }, "value": { "fileSize": { - "label": "ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤†ā¤•ā¤žā¤°" + "label": "ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤†ā¤•ā¤žā¤°", + "placeholder": "e.g. 10MB, 500KB" + }, + "pageCount": { + "label": "Pages per File", + "placeholder": "e.g. 5, 10" + }, + "docCount": { + "label": "Number of Files", + "placeholder": "e.g. 3, 5" } - } + }, + "tooltip": { + "header": { + "title": "Split Methods Overview" + }, + "byPages": { + "title": "Split at Page Numbers", + "text": "Split your PDF at specific page numbers. Using 'n' splits after page n. Using 'n-m' splits before page n and after page m.", + "bullet1": "Single split points: 3,7 (splits after pages 3 and 7)", + "bullet2": "Range split points: 3-8 (splits before page 3 and after page 8)", + "bullet3": "Mixed: 2,5-10,15 (splits after page 2, before page 5, after page 10, and after page 15)" + }, + "bySections": { + "title": "Split by Grid Sections", + "text": "Divide each page into a grid of sections. Useful for splitting documents with multiple columns or extracting specific areas.", + "bullet1": "Horizontal: Number of rows to create", + "bullet2": "Vertical: Number of columns to create", + "bullet3": "Merge: Combine all sections into one PDF" + }, + "bySize": { + "title": "Split by File Size", + "text": "Create multiple PDFs that don't exceed a specified file size. Ideal for file size limitations or email attachments.", + "bullet1": "Use MB for larger files (e.g., 10MB)", + "bullet2": "Use KB for smaller files (e.g., 500KB)", + "bullet3": "System will split at page boundaries" + }, + "byCount": { + "title": "Split by Count", + "text": "Create multiple PDFs with a specific number of pages or documents each.", + "bullet1": "Page Count: Fixed number of pages per file", + "bullet2": "Document Count: Fixed number of output files", + "bullet3": "Useful for batch processing workflows" + }, + "byChapters": { + "title": "Split by Chapters", + "text": "Use PDF bookmarks to automatically split at chapter boundaries. Requires PDFs with bookmark structure.", + "bullet1": "Bookmark Level: Which level to split on (1=top level)", + "bullet2": "Include Metadata: Preserve document properties", + "bullet3": "Allow Duplicates: Handle repeated bookmark names" + }, + "byDocCount": { + "bullet1": "Enter the number of output files you want", + "bullet2": "Pages are distributed as evenly as possible", + "bullet3": "Useful when you need a specific number of files", + "text": "Create a specific number of output files by evenly distributing pages across them.", + "title": "Split by Document Count" + }, + "byPageCount": { + "bullet1": "Enter the number of pages per output file", + "bullet2": "Last file may have fewer pages if not evenly divisible", + "bullet3": "Useful for batch processing workflows", + "text": "Create multiple PDFs with a specific number of pages each. Perfect for creating uniform document chunks.", + "title": "Split by Page Count" + }, + "byPageDivider": { + "bullet1": "Print divider sheets from the download link", + "bullet2": "Insert divider sheets between your documents", + "bullet3": "Scan all documents together as one PDF", + "bullet4": "Upload - divider pages are automatically detected and removed", + "bullet5": "Enable Duplex Mode if scanning both sides of divider sheets", + "text": "Automatically split scanned documents using physical divider sheets with QR codes. Perfect for processing multiple documents scanned together.", + "title": "Split by Page Divider" + } + }, + "methodSelection": { + "tooltip": { + "bullet1": "Click on a method card to select it", + "bullet2": "Hover over each card to see a quick description", + "bullet3": "The settings step will appear after you select a method", + "bullet4": "You can change methods at any time before processing", + "header": { + "text": "Choose how you want to split your PDF document. Each method is optimized for different use cases and document types.", + "title": "Split Method Selection" + }, + "title": "Choose Your Split Method" + } + }, + "selectMethod": "Select a split method", + "tags": "ā¤ĒāĨ‡ā¤œ ⤑ā¤Ē⤰āĨ‡ā¤ļ⤍āĨā¤¸,ā¤Ąā¤ŋā¤ĩā¤žā¤‡ā¤Ą,ā¤Žā¤˛āĨā¤ŸāĨ€ ā¤ĒāĨ‡ā¤œ,ā¤•ā¤Ÿ,⤏⤰āĨā¤ĩ⤰ ā¤¸ā¤žā¤‡ā¤Ą" }, "rotate": { - "tags": "⤏⤰āĨā¤ĩ⤰ ā¤¸ā¤žā¤‡ā¤Ą", "title": "PDF ⤘āĨā¤Žā¤žā¤ā¤‚", + "submit": "⤘āĨā¤Žā¤žā¤ā¤‚", + "selectRotation": "Select Rotation Angle (Clockwise)", + "error": { + "failed": "An error occurred while rotating the PDF." + }, + "preview": { + "title": "Rotation Preview" + }, + "rotateLeft": "Rotate Anticlockwise", + "rotateRight": "Rotate Clockwise", + "tooltip": { + "header": { + "title": "Rotate Settings Overview" + }, + "description": { + "text": "Rotate your PDF pages clockwise or anticlockwise in 90-degree increments. All pages in the PDF will be rotated. The preview shows how your document will look after rotation." + }, + "controls": { + "title": "Controls", + "text": "Use the rotation buttons to adjust orientation. Left button rotates anticlockwise, right button rotates clockwise. Each click rotates by 90 degrees." + } + }, + "tags": "⤏⤰āĨā¤ĩ⤰ ā¤¸ā¤žā¤‡ā¤Ą", "header": "PDF ⤘āĨā¤Žā¤žā¤ā¤‚", - "selectAngle": "⤘āĨā¤Žā¤žā¤¨āĨ‡ ā¤•ā¤ž ⤕āĨ‹ā¤Ŗ ⤚āĨā¤¨āĨ‡ā¤‚ (90 ā¤Ąā¤ŋ⤗āĨā¤°āĨ€ ⤕āĨ‡ ⤗āĨā¤Ŗā¤•āĨ‹ā¤‚ ā¤ŽāĨ‡ā¤‚):", - "submit": "⤘āĨā¤Žā¤žā¤ā¤‚" + "selectAngle": "⤘āĨā¤Žā¤žā¤¨āĨ‡ ā¤•ā¤ž ⤕āĨ‹ā¤Ŗ ⤚āĨā¤¨āĨ‡ā¤‚ (90 ā¤Ąā¤ŋ⤗āĨā¤°āĨ€ ⤕āĨ‡ ⤗āĨā¤Ŗā¤•āĨ‹ā¤‚ ā¤ŽāĨ‡ā¤‚):" + }, + "convert": { + "title": "ā¤Ŧā¤Ļ⤞āĨ‡ā¤‚", + "desc": "Convert files between different formats", + "files": "Files", + "selectFilesPlaceholder": "Select files in the main view to get started", + "settings": "⤏āĨ‡ā¤Ÿā¤ŋ⤂⤗āĨā¤¸", + "conversionCompleted": "Conversion completed", + "results": "Results", + "defaultFilename": "converted_file", + "conversionResults": "Conversion Results", + "convertFrom": "Convert from", + "convertTo": "Convert to", + "sourceFormatPlaceholder": "Source format", + "targetFormatPlaceholder": "Target format", + "selectSourceFormatFirst": "Select a source format first", + "outputOptions": "Output Options", + "pdfOptions": "PDF Options", + "imageOptions": "Image Options", + "colorType": "Colour Type", + "color": "⤰⤂⤗", + "greyscale": "⤗āĨā¤°āĨ‡ā¤¸āĨā¤•āĨ‡ā¤˛", + "blackwhite": "Black & White", + "dpi": "DPI", + "output": "Output", + "single": "Single", + "multiple": "Multiple", + "fitOption": "Fit Option", + "maintainAspectRatio": "Maintain Aspect Ratio", + "fitDocumentToPage": "Fit Document to Page", + "fillPage": "ā¤ĒāĨƒā¤ˇāĨā¤  ⤭⤰āĨ‡ā¤‚", + "autoRotate": "Auto Rotate", + "autoRotateDescription": "Automatically rotate images to better fit the PDF page", + "combineImages": "Combine Images", + "combineImagesDescription": "Combine all images into one PDF, or create separate PDFs for each image", + "webOptions": "Web to PDF Options", + "zoomLevel": "Zoom Level", + "emailOptions": "Email to PDF Options", + "includeAttachments": "Include email attachments", + "maxAttachmentSize": "Maximum attachment size (MB)", + "includeAllRecipients": "Include CC and BCC recipients in header", + "downloadHtml": "Download HTML intermediate file instead of PDF", + "pdfaOptions": "PDF/A Options", + "outputFormat": "Output Format", + "pdfaNote": "PDF/A-1b is more compatible, PDF/A-2b supports more features.", + "pdfaDigitalSignatureWarning": "PDF ā¤ŽāĨ‡ā¤‚ ā¤ā¤• ā¤Ąā¤ŋ⤜ā¤ŋ⤟⤞ ā¤šā¤¸āĨā¤¤ā¤žā¤•āĨā¤ˇā¤° ā¤šāĨˆāĨ¤ ā¤¯ā¤š ⤅⤗⤞āĨ‡ ⤚⤰⤪ ā¤ŽāĨ‡ā¤‚ ā¤šā¤Ÿā¤ž ā¤Ļā¤ŋā¤¯ā¤ž ā¤œā¤žā¤ā¤—ā¤žāĨ¤", + "fileFormat": "File Format", + "wordDoc": "Word Document", + "wordDocExt": "Word Document (.docx)", + "odtExt": "OpenDocument Text (.odt)", + "pptExt": "PowerPoint (.pptx)", + "odpExt": "OpenDocument Presentation (.odp)", + "txtExt": "Plain Text (.txt)", + "rtfExt": "Rich Text Format (.rtf)", + "selectedFiles": "Selected files", + "noFileSelected": "No file selected. Use the file panel to add files.", + "convertFiles": "Convert Files", + "converting": "Converting...", + "downloadConverted": "Download Converted File", + "errorNoFiles": "Please select at least one file to convert.", + "errorNoFormat": "Please select both source and target formats.", + "errorNotSupported": "Conversion from {{from}} to {{to}} is not supported.", + "images": "Images", + "officeDocs": "Office Documents (Word, Excel, PowerPoint)", + "imagesExt": "Images (JPG, PNG, etc.)", + "markdown": "Markdown", + "textRtf": "Text/RTF", + "grayscale": "⤗āĨā¤°āĨ‡ā¤¸āĨā¤•āĨ‡ā¤˛", + "errorConversion": "An error occurred while converting the file." }, "imageToPdf": { "tags": "⤰āĨ‚ā¤Ēā¤žā¤‚ā¤¤ā¤°ā¤Ŗ,img,jpg,⤚ā¤ŋ⤤āĨā¤°,ā¤ĢāĨ‹ā¤ŸāĨ‹" @@ -727,7 +1263,33 @@ "8": "⤅⤂⤤ā¤ŋā¤Ž ā¤šā¤Ÿā¤žā¤ā¤‚", "9": "ā¤ĒāĨā¤°ā¤Ĩā¤Ž ⤔⤰ ⤅⤂⤤ā¤ŋā¤Ž ā¤šā¤Ÿā¤žā¤ā¤‚", "10": "ā¤ĩā¤ŋā¤ˇā¤Ž-ā¤¸ā¤Ž ā¤Žā¤°āĨā¤œ", - "11": "Duplicate all pages" + "11": "Duplicate all pages", + "desc": { + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, â€Ļ).", + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, â€Ļ).", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimized for binding on the side)." + } + }, + "desc": { + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, â€Ļ).", + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, â€Ļ).", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimised for binding on the side).", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document." }, "placeholder": "(⤜āĨˆā¤¸āĨ‡ 1,3,2 ā¤¯ā¤ž 4-8,2,10-12 ā¤¯ā¤ž 2n-1)" }, @@ -739,9 +1301,198 @@ "upload": "⤛ā¤ĩā¤ŋ ⤜āĨ‹ā¤Ąā¤ŧāĨ‡ā¤‚", "submit": "⤛ā¤ĩā¤ŋ ⤜āĨ‹ā¤Ąā¤ŧāĨ‡ā¤‚" }, + "attachments": { + "tags": "embed,attach,file,attachment,attachments", + "title": "Add attachments", + "header": "Add attachments", + "add": "Add Attachment", + "remove": "Remove Attachment", + "embed": "Embed Attachment", + "submit": "Add attachments" + }, "watermark": { - "tags": "⤟āĨ‡ā¤•āĨā¤¸āĨā¤Ÿ,ā¤ĻāĨ‹ā¤šā¤°ā¤žā¤ĩ,⤞āĨ‡ā¤Ŧ⤞,⤏āĨā¤ĩ⤝⤂,⤕āĨ‰ā¤ĒāĨ€ā¤°ā¤žā¤‡ā¤Ÿ,⤟āĨā¤°āĨ‡ā¤Ąā¤Žā¤žā¤°āĨā¤•,img,jpg,⤚ā¤ŋ⤤āĨā¤°,ā¤ĢāĨ‹ā¤ŸāĨ‹", "title": "ā¤ĩāĨ‰ā¤Ÿā¤°ā¤Žā¤žā¤°āĨā¤• ⤜āĨ‹ā¤Ąā¤ŧāĨ‡ā¤‚", + "desc": "Add text or image watermarks to PDF files", + "completed": "Watermark added", + "submit": "ā¤ĩāĨ‰ā¤Ÿā¤°ā¤Žā¤žā¤°āĨā¤• ⤜āĨ‹ā¤Ąā¤ŧāĨ‡ā¤‚", + "filenamePrefix": "watermarked", + "error": { + "failed": "An error occurred while adding watermark to the PDF." + }, + "watermarkType": { + "text": "⤟āĨ‡ā¤•āĨā¤¸āĨā¤Ÿ", + "image": "Image" + }, + "settings": { + "type": "Watermark Type", + "text": { + "label": "Watermark Text", + "placeholder": "Enter watermark text" + }, + "image": { + "label": "Watermark Image", + "choose": "Choose Image", + "selected": "Selected: {{filename}}" + }, + "fontSize": "ā¤Ģā¤ŧāĨ‰ā¤¨āĨā¤Ÿ ā¤†ā¤•ā¤žā¤°", + "size": "Size", + "alphabet": "Font/Language", + "color": "Watermark Colour", + "rotation": "Rotation (degrees)", + "opacity": "Opacity (%)", + "spacing": { + "horizontal": "Horizontal Spacing", + "vertical": "Vertical Spacing", + "height": "Height Spacing", + "width": "Width Spacing" + }, + "convertToImage": "Flatten PDF pages to images" + }, + "alphabet": { + "roman": "Roman/Latin", + "arabic": "Arabic", + "japanese": "Japanese", + "korean": "Korean", + "chinese": "Chinese", + "thai": "Thai" + }, + "steps": { + "type": "Watermark Type", + "wording": "Wording", + "textStyle": "Style", + "formatting": "Formatting", + "file": "Watermark File" + }, + "results": { + "title": "Watermark Results" + }, + "tooltip": { + "language": { + "title": "Language Support", + "text": "Choose the appropriate language setting to ensure proper font rendering for your text." + }, + "appearance": { + "title": "Appearance Settings", + "text": "Control how your watermark looks and blends with the document.", + "bullet1": "Rotation: -360° to 360° for angled watermarks", + "bullet2": "Opacity: 0-100% for transparency control", + "bullet3": "Lower opacity creates subtle watermarks" + }, + "spacing": { + "title": "Spacing Control", + "text": "Adjust the spacing between repeated watermarks across the page.", + "bullet1": "Width spacing: Horizontal distance between watermarks", + "bullet2": "Height spacing: Vertical distance between watermarks", + "bullet3": "Higher values create more spread out patterns" + }, + "type": { + "header": { + "title": "Watermark Type Selection" + }, + "description": { + "title": "Choose Your Watermark", + "text": "Select between text or image watermarks based on your needs." + }, + "text": { + "title": "Text Watermarks", + "text": "Perfect for adding copyright notices, company names, or confidentiality labels. Supports multiple languages and custom colours.", + "bullet1": "Customisable fonts and languages", + "bullet2": "Adjustable colours and transparency", + "bullet3": "Ideal for legal or branding text" + }, + "image": { + "title": "Image Watermarks", + "text": "Use logos, stamps, or any image as a watermark. Great for branding and visual identification.", + "bullet1": "Upload any image format", + "bullet2": "Maintains image quality", + "bullet3": "Perfect for logos and stamps" + } + }, + "wording": { + "header": { + "title": "Text Content" + }, + "text": { + "title": "Watermark Text", + "text": "Enter the text that will appear as your watermark across the document.", + "bullet1": "Keep it concise for better readability", + "bullet2": "Common examples: 'CONFIDENTIAL', 'DRAFT', company name", + "bullet3": "Emoji characters are not supported and will be filtered out" + } + }, + "textStyle": { + "header": { + "title": "Text Style" + }, + "color": { + "title": "Colour Selection", + "text": "Choose a colour that provides good contrast with your document content.", + "bullet1": "Light grey (#d3d3d3) for subtle watermarks", + "bullet2": "Black or dark colours for high contrast", + "bullet3": "Custom colours for branding purposes" + }, + "language": { + "title": "Language Support", + "text": "Choose the appropriate language setting to ensure proper font rendering." + } + }, + "file": { + "header": { + "title": "Image Upload" + }, + "upload": { + "title": "Image Selection", + "text": "Upload an image file to use as your watermark.", + "bullet1": "Supports common formats: PNG, JPG, GIF, BMP", + "bullet2": "PNG with transparency works best", + "bullet3": "Higher resolution images maintain quality better" + }, + "recommendations": { + "title": "Best Practices", + "text": "Tips for optimal image watermark results.", + "bullet1": "Use logos or stamps with transparent backgrounds", + "bullet2": "Simple designs work better than complex images", + "bullet3": "Consider the final document size when choosing resolution" + } + }, + "formatting": { + "header": { + "title": "Formatting & Layout" + }, + "size": { + "title": "Size Control", + "text": "Adjust the size of your watermark (text or image).", + "bullet1": "Larger sizes create more prominent watermarks" + }, + "appearance": { + "title": "Appearance Settings", + "text": "Control how your watermark looks and blends with the document.", + "bullet1": "Rotation: -360° to 360° for angled watermarks", + "bullet2": "Opacity: 0-100% for transparency control", + "bullet3": "Lower opacity creates subtle watermarks" + }, + "spacing": { + "title": "Spacing Control", + "text": "Adjust the spacing between repeated watermarks across the page.", + "bullet1": "Horizontal spacing: Distance between watermarks left to right", + "bullet2": "Vertical spacing: Distance between watermarks top to bottom", + "bullet3": "Higher values create more spread out patterns" + }, + "security": { + "title": "Security Option", + "text": "Convert the final PDF to an image-based format for enhanced security.", + "bullet1": "Prevents text selection and copying", + "bullet2": "Makes watermarks harder to remove", + "bullet3": "Results in larger file sizes", + "bullet4": "Best for sensitive or copyrighted content" + } + } + }, + "type": { + "1": "⤟āĨ‡ā¤•āĨā¤¸āĨā¤Ÿ", + "2": "⤛ā¤ĩā¤ŋ" + }, + "tags": "⤟āĨ‡ā¤•āĨā¤¸āĨā¤Ÿ,ā¤ĻāĨ‹ā¤šā¤°ā¤žā¤ĩ,⤞āĨ‡ā¤Ŧ⤞,⤏āĨā¤ĩ⤝⤂,⤕āĨ‰ā¤ĒāĨ€ā¤°ā¤žā¤‡ā¤Ÿ,⤟āĨā¤°āĨ‡ā¤Ąā¤Žā¤žā¤°āĨā¤•,img,jpg,⤚ā¤ŋ⤤āĨā¤°,ā¤ĢāĨ‹ā¤ŸāĨ‹", "header": "ā¤ĩāĨ‰ā¤Ÿā¤°ā¤Žā¤žā¤°āĨā¤• ⤜āĨ‹ā¤Ąā¤ŧāĨ‡ā¤‚", "customColor": "⤕⤏āĨā¤Ÿā¤Ž ⤟āĨ‡ā¤•āĨā¤¸āĨā¤Ÿ ⤰⤂⤗", "selectText": { @@ -755,17 +1506,6 @@ "8": "ā¤ĩāĨ‰ā¤Ÿā¤°ā¤Žā¤žā¤°āĨā¤• ā¤ĒāĨā¤°ā¤•ā¤žā¤°:", "9": "ā¤ĩāĨ‰ā¤Ÿā¤°ā¤Žā¤žā¤°āĨā¤• ⤛ā¤ĩā¤ŋ:", "10": "PDF ⤕āĨ‹ PDF-⤛ā¤ĩā¤ŋ ā¤ŽāĨ‡ā¤‚ ā¤Ŧā¤Ļ⤞āĨ‡ā¤‚" - }, - "submit": "ā¤ĩāĨ‰ā¤Ÿā¤°ā¤Žā¤žā¤°āĨā¤• ⤜āĨ‹ā¤Ąā¤ŧāĨ‡ā¤‚", - "type": { - "1": "⤟āĨ‡ā¤•āĨā¤¸āĨā¤Ÿ", - "2": "⤛ā¤ĩā¤ŋ" - }, - "watermarkType": { - "text": "⤟āĨ‡ā¤•āĨā¤¸āĨā¤Ÿ" - }, - "settings": { - "fontSize": "ā¤Ģā¤ŧāĨ‰ā¤¨āĨā¤Ÿ ā¤†ā¤•ā¤žā¤°" } }, "permissions": { @@ -790,50 +1530,201 @@ "removePages": { "tags": "ā¤ĒāĨƒā¤ˇāĨā¤  ⤍ā¤ŋā¤•ā¤žā¤˛āĨ‡ā¤‚,ā¤ĒāĨƒā¤ˇāĨā¤  ā¤šā¤Ÿā¤žā¤ā¤‚", "title": "⤍ā¤ŋā¤•ā¤žā¤˛āĨ‡ā¤‚", + "pageNumbers": { + "label": "Pages to Remove", + "placeholder": "e.g., 1,3,5-8,10", + "error": "Invalid page number format. Use numbers, ranges (1-5), or mathematical expressions (2n+1)" + }, + "filenamePrefix": "pages_removed", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "settings": { + "title": "Settings" + }, + "tooltip": { + "header": { + "title": "Remove Pages Settings" + }, + "pageNumbers": { + "title": "Page Selection", + "text": "Specify which pages to remove from your PDF. You can select individual pages, ranges, or use mathematical expressions.", + "bullet1": "Individual pages: 1,3,5 (removes pages 1, 3, and 5)", + "bullet2": "Page ranges: 1-5,10-15 (removes pages 1-5 and 10-15)", + "bullet3": "Mathematical: 2n+1 (removes odd pages)", + "bullet4": "Open ranges: 5- (removes from page 5 to end)" + }, + "examples": { + "title": "Common Examples", + "text": "Here are some common page selection patterns:", + "bullet1": "Remove first page: 1", + "bullet2": "Remove last 3 pages: -3", + "bullet3": "Remove every other page: 2n", + "bullet4": "Remove specific scattered pages: 1,5,10,15" + }, + "safety": { + "title": "Safety Tips", + "text": "Important considerations when removing pages:", + "bullet1": "Always preview your selection before processing", + "bullet2": "Keep a backup of your original file", + "bullet3": "Page numbers start from 1, not 0", + "bullet4": "Invalid page numbers will be ignored" + } + }, + "error": { + "failed": "An error occurred whilst removing pages." + }, + "results": { + "title": "Page Removal Results" + }, "submit": "⤍ā¤ŋā¤•ā¤žā¤˛āĨ‡ā¤‚" }, - "addPassword": { - "tags": "⤏āĨā¤°ā¤•āĨā¤ˇā¤ŋ⤤,⤏āĨā¤°ā¤•āĨā¤ˇā¤ž", - "title": "ā¤Ēā¤žā¤¸ā¤ĩ⤰āĨā¤Ą ⤜āĨ‹ā¤Ąā¤ŧāĨ‡ā¤‚", - "header": "ā¤Ēā¤žā¤¸ā¤ĩ⤰āĨā¤Ą ⤜āĨ‹ā¤Ąā¤ŧāĨ‡ā¤‚ (ā¤ā¤¨āĨā¤•āĨā¤°ā¤ŋā¤ĒāĨā¤Ÿ)", - "selectText": { - "1": "ā¤ā¤¨āĨā¤•āĨā¤°ā¤ŋā¤ĒāĨā¤Ÿ ⤕⤰⤍āĨ‡ ⤕āĨ‡ ⤞ā¤ŋā¤ PDF ⤚āĨā¤¨āĨ‡ā¤‚", - "2": "⤉ā¤Ē⤝āĨ‹ā¤—⤕⤰āĨā¤¤ā¤ž ā¤Ēā¤žā¤¸ā¤ĩ⤰āĨā¤Ą", - "3": "ā¤ā¤¨āĨā¤•āĨā¤°ā¤ŋā¤ĒāĨā¤ļ⤍ ⤕āĨā¤‚ā¤œāĨ€ ⤞⤂ā¤Ŧā¤žā¤ˆ", - "4": "ā¤‰ā¤šāĨā¤š ā¤Žā¤žā¤¨ ⤅⤧ā¤ŋ⤕ ā¤Žā¤œā¤ŦāĨ‚⤤ ā¤šāĨˆā¤‚, ⤞āĨ‡ā¤•ā¤ŋ⤍ ⤍ā¤ŋā¤ŽāĨā¤¨ ā¤Žā¤žā¤¨ ā¤ŦāĨ‡ā¤šā¤¤ā¤° ā¤¸ā¤‚ā¤—ā¤¤ā¤¤ā¤ž ⤰⤖⤤āĨ‡ ā¤šāĨˆā¤‚āĨ¤", - "5": "⤏āĨ‡ā¤Ÿ ⤕⤰⤍āĨ‡ ⤕āĨ‡ ⤞ā¤ŋā¤ ⤅⤍āĨā¤Žā¤¤ā¤ŋā¤¯ā¤žā¤‚ (⤏āĨā¤ĩā¤žā¤ŽāĨ€ ā¤Ēā¤žā¤¸ā¤ĩ⤰āĨā¤Ą ⤕āĨ‡ ā¤¸ā¤žā¤Ĩ ⤉ā¤Ē⤝āĨ‹ā¤— ⤕⤰⤍āĨ‡ ⤕āĨ€ ⤏ā¤ŋā¤Ģā¤žā¤°ā¤ŋā¤ļ ⤕āĨ€ ā¤œā¤žā¤¤āĨ€ ā¤šāĨˆ)", - "6": "ā¤Ļ⤏āĨā¤¤ā¤žā¤ĩāĨ‡ā¤œā¤ŧ ⤅⤏āĨ‡ā¤‚ā¤Ŧ⤞āĨ€ ⤕āĨ‹ ⤰āĨ‹ā¤•āĨ‡ā¤‚", - "7": "ā¤¸ā¤žā¤Žā¤—āĨā¤°āĨ€ ⤍ā¤ŋ⤎āĨā¤•⤰āĨā¤ˇā¤Ŗ ⤕āĨ‹ ⤰āĨ‹ā¤•āĨ‡ā¤‚", - "8": "ā¤Ēā¤šāĨā¤‚ā¤š ⤝āĨ‹ā¤—āĨā¤¯ā¤¤ā¤ž ⤕āĨ‡ ⤞ā¤ŋā¤ ⤍ā¤ŋ⤎āĨā¤•⤰āĨā¤ˇā¤Ŗ ⤕āĨ‹ ⤰āĨ‹ā¤•āĨ‡ā¤‚", - "9": "ā¤ĢāĨ‰ā¤°āĨā¤Ž ⤭⤰⤍āĨ‡ ⤕āĨ‹ ⤰āĨ‹ā¤•āĨ‡ā¤‚", - "10": "⤏⤂ā¤ļāĨ‹ā¤§ā¤¨ ⤕āĨ‹ ⤰āĨ‹ā¤•āĨ‡ā¤‚", - "11": "⤟ā¤ŋā¤ĒāĨā¤Ē⤪āĨ€ ⤏⤂ā¤ļāĨ‹ā¤§ā¤¨ ⤕āĨ‹ ⤰āĨ‹ā¤•āĨ‡ā¤‚", - "12": "ā¤ĒāĨā¤°ā¤ŋā¤‚ā¤Ÿā¤ŋ⤂⤗ ⤕āĨ‹ ⤰āĨ‹ā¤•āĨ‡ā¤‚", - "13": "ā¤ĩā¤ŋ⤭ā¤ŋ⤍āĨā¤¨ ā¤ĒāĨā¤°ā¤žā¤°āĨ‚ā¤ĒāĨ‹ā¤‚ ā¤ŽāĨ‡ā¤‚ ā¤ĒāĨā¤°ā¤ŋā¤‚ā¤Ÿā¤ŋ⤂⤗ ⤕āĨ‹ ⤰āĨ‹ā¤•āĨ‡ā¤‚", - "14": "⤏āĨā¤ĩā¤žā¤ŽāĨ€ ā¤Ēā¤žā¤¸ā¤ĩ⤰āĨā¤Ą", - "15": "ā¤ā¤• ā¤Ŧā¤žā¤° ⤖āĨā¤˛ā¤¨āĨ‡ ⤕āĨ‡ ā¤Ŧā¤žā¤Ļ ā¤Ļ⤏āĨā¤¤ā¤žā¤ĩāĨ‡ā¤œā¤ŧ ⤕āĨ‡ ā¤¸ā¤žā¤Ĩ ⤕āĨā¤¯ā¤ž ⤕ā¤ŋā¤¯ā¤ž ā¤œā¤ž ā¤¸ā¤•ā¤¤ā¤ž ā¤šāĨˆ ⤕āĨ‹ ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤Ŧ⤂⤧ā¤ŋ⤤ ā¤•ā¤°ā¤¤ā¤ž ā¤šāĨˆ (⤏⤭āĨ€ ā¤Ēā¤žā¤ ā¤•āĨ‹ā¤‚ ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž ā¤¸ā¤Žā¤°āĨā¤Ĩā¤ŋ⤤ ā¤¨ā¤šāĨ€ā¤‚)", - "16": "ā¤Ļ⤏āĨā¤¤ā¤žā¤ĩāĨ‡ā¤œā¤ŧ ⤕āĨ‹ ⤖āĨ‹ā¤˛ā¤¨āĨ‡ ⤕āĨ‹ ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤Ŧ⤂⤧ā¤ŋ⤤ ā¤•ā¤°ā¤¤ā¤ž ā¤šāĨˆ" + "extractPages": { + "title": "Extract Pages", + "pageNumbers": { + "label": "Pages to Extract", + "placeholder": "e.g., 1,3,5-8 or odd & 1-10" + }, + "settings": { + "title": "Settings" }, - "submit": "ā¤ā¤¨āĨā¤•āĨā¤°ā¤ŋā¤ĒāĨā¤Ÿ ⤕⤰āĨ‡ā¤‚", "tooltip": { - "permissions": { - "title": "⤅⤍āĨā¤Žā¤¤ā¤ŋā¤¯ā¤žā¤‚ ā¤Ŧā¤Ļ⤞āĨ‡ā¤‚" + "description": "Extracts the selected pages into a new PDF, preserving order." + }, + "error": { + "failed": "Failed to extract pages" + }, + "results": { + "title": "Pages Extracted" + }, + "submit": "Extract Pages" + }, + "pageSelection": { + "tooltip": { + "header": { + "title": "Page Selection Guide" + }, + "basic": { + "title": "Basic Usage", + "text": "Select specific pages from your PDF document using simple syntax.", + "bullet1": "Individual pages: 1,3,5", + "bullet2": "Page ranges: 3-6 or 10-15", + "bullet3": "All pages: all" + }, + "advanced": { + "title": "Advanced Features" + }, + "tips": { + "title": "Tips", + "text": "Keep these guidelines in mind:", + "bullet1": "Page numbers start from 1 (not 0)", + "bullet2": "Spaces are automatically removed", + "bullet3": "Invalid expressions are ignored" + }, + "syntax": { + "title": "Syntax Basics", + "text": "Use numbers, ranges, keywords, and progressions (n starts at 0). Parentheses are supported.", + "bullets": { + "numbers": "Numbers/ranges: 5, 10-20", + "keywords": "Keywords: odd, even", + "progressions": "Progressions: 3n, 4n+1" + } + }, + "operators": { + "title": "Operators", + "text": "AND has higher precedence than comma. NOT applies within the document range.", + "and": "AND: & or \"and\" — require both conditions (e.g., 1-50 & even)", + "comma": "Comma: , or | — combine selections (e.g., 1-10, 20)", + "not": "NOT: ! or \"not\" — exclude pages (e.g., 3n & not 30)" + }, + "examples": { + "title": "Examples" + }, + "complex": { + "bullet1": "1,3-5,8,2n → pages 1, 3–5, 8, plus evens", + "bullet2": "10-,2n-1 → from page 10 to end + odd pages", + "description": "Mix different types.", + "title": "Complex Combinations" + }, + "description": "Choose which pages to use for the operation. Supports single pages, ranges, formulas, and the all keyword.", + "individual": { + "bullet1": "1,3,5 → selects pages 1, 3, 5", + "bullet2": "2,7,12 → selects pages 2, 7, 12", + "description": "Enter numbers separated by commas.", + "title": "Individual Pages" + }, + "mathematical": { + "bullet1": "2n → all even pages (2, 4, 6â€Ļ)", + "bullet2": "2n-1 → all odd pages (1, 3, 5â€Ļ)", + "bullet3": "3n → every 3rd page (3, 6, 9â€Ļ)", + "bullet4": "4n-1 → pages 3, 7, 11, 15â€Ļ", + "description": "Use n in formulas for patterns.", + "title": "Mathematical Functions" + }, + "ranges": { + "bullet1": "3-6 → selects pages 3–6", + "bullet2": "10-15 → selects pages 10–15", + "bullet3": "5- → selects pages 5 to end", + "description": "Use - for consecutive pages.", + "title": "Page Ranges" + }, + "special": { + "bullet1": "all → selects all pages", + "title": "Special Keywords" } } }, - "removePassword": { - "tags": "⤏āĨā¤°ā¤•āĨā¤ˇā¤ŋ⤤,ā¤Ąā¤ŋ⤕āĨā¤°ā¤ŋā¤ĒāĨā¤Ÿ,⤏āĨā¤°ā¤•āĨā¤ˇā¤ž,⤅⤍ā¤Ēā¤žā¤¸ā¤ĩ⤰āĨā¤Ą,ā¤Ēā¤žā¤¸ā¤ĩ⤰āĨā¤Ą ā¤šā¤Ÿā¤žā¤ā¤‚", - "title": "ā¤Ēā¤žā¤¸ā¤ĩ⤰āĨā¤Ą ā¤šā¤Ÿā¤žā¤ā¤‚", - "header": "ā¤Ēā¤žā¤¸ā¤ĩ⤰āĨā¤Ą ā¤šā¤Ÿā¤žā¤ā¤‚ (ā¤Ąā¤ŋ⤕āĨā¤°ā¤ŋā¤ĒāĨā¤Ÿ)", - "selectText": { - "1": "ā¤Ąā¤ŋ⤕āĨā¤°ā¤ŋā¤ĒāĨā¤Ÿ ⤕⤰⤍āĨ‡ ⤕āĨ‡ ⤞ā¤ŋā¤ PDF ⤚āĨā¤¨āĨ‡ā¤‚", - "2": "ā¤Ēā¤žā¤¸ā¤ĩ⤰āĨā¤Ą" + "bulkSelection": { + "syntaxError": "There is a syntax issue. See Page Selection tips for help.", + "header": { + "title": "Page Selection Guide" }, - "submit": "ā¤šā¤Ÿā¤žā¤ā¤‚", - "desc": "⤅ā¤Ē⤍āĨ‡ PDF ā¤Ļ⤏āĨā¤¤ā¤žā¤ĩāĨ‡ā¤œ ⤏āĨ‡ ā¤Ēā¤žā¤¸ā¤ĩ⤰āĨā¤Ą ⤏āĨā¤°ā¤•āĨā¤ˇā¤ž ā¤šā¤Ÿā¤žā¤ā¤‚āĨ¤", - "password": { - "stepTitle": "ā¤Ēā¤žā¤¸ā¤ĩ⤰āĨā¤Ą ā¤šā¤Ÿā¤žā¤ā¤‚", - "label": "ā¤ĩ⤰āĨā¤¤ā¤Žā¤žā¤¨ ā¤Ēā¤žā¤¸ā¤ĩ⤰āĨā¤Ą" + "syntax": { + "title": "Syntax Basics", + "text": "Use numbers, ranges, keywords, and progressions (n starts at 0). Parentheses are supported.", + "bullets": { + "numbers": "Numbers/ranges: 5, 10-20", + "keywords": "Keywords: odd, even", + "progressions": "Progressions: 3n, 4n+1" + } + }, + "operators": { + "title": "Operators", + "text": "AND has higher precedence than comma. NOT applies within the document range.", + "and": "AND: & or \"and\" — require both conditions (e.g., 1-50 & even)", + "comma": "Comma: , or | — combine selections (e.g., 1-10, 20)", + "not": "NOT: ! or \"not\" — exclude pages (e.g., 3n & not 30)" + }, + "examples": { + "title": "Examples", + "first50": "First 50", + "last50": "Last 50", + "every3rd": "Every 3rd", + "oddWithinExcluding": "Odd within 1-20 excluding 5-7", + "combineSets": "Combine sets" + }, + "firstNPages": { + "title": "First N Pages", + "placeholder": "Number of pages" + }, + "lastNPages": { + "title": "Last N Pages", + "placeholder": "Number of pages" + }, + "everyNthPage": { + "title": "Every Nth Page", + "placeholder": "Step size" + }, + "range": { + "title": "Range", + "fromPlaceholder": "From", + "toPlaceholder": "To" + }, + "keywords": { + "title": "Keywords" + }, + "advanced": { + "title": "Advanced" } }, "compressPdfs": { @@ -843,12 +1734,142 @@ "tags": "remove,delete,form,field,readonly", "title": "Remove Read-Only from Form Fields", "header": "Unlock PDF Forms", - "submit": "Remove" + "submit": "Remove", + "description": "This tool will remove read-only restrictions from PDF form fields, making them editable and fillable.", + "filenamePrefix": "unlocked_forms", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst unlocking PDF forms." + }, + "results": { + "title": "Unlocked Forms Results" + } }, "changeMetadata": { - "tags": "ā¤ļāĨ€ā¤°āĨā¤ˇā¤•,⤞āĨ‡ā¤–⤕,⤤ā¤ŋā¤Ĩā¤ŋ,⤍ā¤ŋ⤰āĨā¤Žā¤žā¤Ŗ,ā¤¸ā¤Žā¤¯,ā¤ĒāĨā¤°ā¤•ā¤žā¤ļ⤕,⤍ā¤ŋ⤰āĨā¤Žā¤žā¤¤ā¤ž,ā¤†ā¤‚ā¤•ā¤Ąā¤ŧāĨ‡", - "title": "ā¤ļāĨ€ā¤°āĨā¤ˇā¤•:", "header": "ā¤ŽāĨ‡ā¤Ÿā¤žā¤ĄāĨ‡ā¤Ÿā¤ž ā¤Ŧā¤Ļ⤞āĨ‡ā¤‚", + "submit": "ā¤Ŧā¤Ļ⤞āĨ‡ā¤‚", + "filenamePrefix": "metadata", + "settings": { + "title": "Metadata Settings" + }, + "standardFields": { + "title": "Standard Fields" + }, + "deleteAll": { + "label": "Remove Existing Metadata", + "checkbox": "Delete all metadata" + }, + "title": { + "label": "Title", + "placeholder": "Document title" + }, + "author": { + "label": "Author", + "placeholder": "Document author" + }, + "subject": { + "label": "Subject", + "placeholder": "Document subject" + }, + "keywords": { + "label": "Keywords", + "placeholder": "Document keywords" + }, + "creator": { + "label": "Creator", + "placeholder": "Document creator" + }, + "producer": { + "label": "Producer", + "placeholder": "Document producer" + }, + "dates": { + "title": "Date Fields" + }, + "creationDate": { + "label": "Creation Date", + "placeholder": "Creation date" + }, + "modificationDate": { + "label": "Modification Date", + "placeholder": "Modification date" + }, + "trapped": { + "label": "Trapped Status", + "unknown": "Unknown", + "true": "True", + "false": "False" + }, + "advanced": { + "title": "Advanced Options" + }, + "customFields": { + "title": "Custom Metadata", + "description": "Add custom metadata fields to the document", + "add": "Add Field", + "key": "Key", + "keyPlaceholder": "Custom key", + "value": "Value", + "valuePlaceholder": "Custom value", + "remove": "Remove" + }, + "results": { + "title": "Updated PDFs" + }, + "error": { + "failed": "An error occurred while changing the PDF metadata." + }, + "tooltip": { + "header": { + "title": "PDF Metadata Overview" + }, + "standardFields": { + "title": "Standard Fields", + "text": "Common PDF metadata fields that describe the document.", + "bullet1": "Title: Document name or heading", + "bullet2": "Author: Person who created the document", + "bullet3": "Subject: Brief description of content", + "bullet4": "Keywords: Search terms for the document", + "bullet5": "Creator/Producer: Software used to create the PDF" + }, + "dates": { + "title": "Date Fields", + "text": "When the document was created and modified.", + "bullet1": "Creation Date: When original document was made", + "bullet2": "Modification Date: When last changed" + }, + "options": { + "title": "Additional Options", + "text": "Custom fields and privacy controls.", + "bullet1": "Custom Metadata: Add your own key-value pairs", + "bullet2": "Trapped Status: High-quality printing setting", + "bullet3": "Delete All: Remove all metadata for privacy" + }, + "deleteAll": { + "title": "Remove Existing Metadata", + "text": "Complete metadata deletion to ensure privacy." + }, + "customFields": { + "title": "Custom Metadata", + "text": "Add your own custom key-value metadata pairs.", + "bullet1": "Add any custom fields relevant to your document", + "bullet2": "Examples: Department, Project, Version, Status", + "bullet3": "Both key and value are required for each entry" + }, + "advanced": { + "title": "Advanced Options", + "trapped": { + "title": "Trapped Status", + "description": "Indicates if document is prepared for high-quality printing.", + "bullet1": "True: Document has been trapped for printing", + "bullet2": "False: Document has not been trapped", + "bullet3": "Unknown: Trapped status is not specified" + } + } + }, + "tags": "ā¤ļāĨ€ā¤°āĨā¤ˇā¤•,⤞āĨ‡ā¤–⤕,⤤ā¤ŋā¤Ĩā¤ŋ,⤍ā¤ŋ⤰āĨā¤Žā¤žā¤Ŗ,ā¤¸ā¤Žā¤¯,ā¤ĒāĨā¤°ā¤•ā¤žā¤ļ⤕,⤍ā¤ŋ⤰āĨā¤Žā¤žā¤¤ā¤ž,ā¤†ā¤‚ā¤•ā¤Ąā¤ŧāĨ‡", "selectText": { "1": "⤕āĨƒā¤Ēā¤¯ā¤ž ā¤ĩāĨ‡ ⤚⤰ ⤏⤂ā¤Ēā¤žā¤Ļā¤ŋ⤤ ⤕⤰āĨ‡ā¤‚ ⤜ā¤ŋ⤍āĨā¤šāĨ‡ā¤‚ ⤆ā¤Ē ā¤Ŧā¤Ļā¤˛ā¤¨ā¤ž ā¤šā¤žā¤šā¤¤āĨ‡ ā¤šāĨˆā¤‚", "2": "⤏⤭āĨ€ ā¤ŽāĨ‡ā¤Ÿā¤žā¤ĄāĨ‡ā¤Ÿā¤ž ā¤šā¤Ÿā¤žā¤ā¤‚", @@ -856,15 +1877,7 @@ "4": "⤅⤍āĨā¤¯ ā¤ŽāĨ‡ā¤Ÿā¤žā¤ĄāĨ‡ā¤Ÿā¤ž:", "5": "⤕⤏āĨā¤Ÿā¤Ž ā¤ŽāĨ‡ā¤Ÿā¤žā¤ĄāĨ‡ā¤Ÿā¤ž ā¤ĒāĨā¤°ā¤ĩā¤ŋ⤎āĨā¤Ÿā¤ŋ ⤜āĨ‹ā¤Ąā¤ŧāĨ‡ā¤‚" }, - "author": "⤞āĨ‡ā¤–⤕:", - "creationDate": "⤍ā¤ŋ⤰āĨā¤Žā¤žā¤Ŗ ⤤ā¤ŋā¤Ĩā¤ŋ (yyyy/MM/dd HH:mm:ss):", - "creator": "⤍ā¤ŋ⤰āĨā¤Žā¤žā¤¤ā¤ž:", - "keywords": "⤕āĨ€ā¤ĩ⤰āĨā¤ĄāĨā¤¸:", - "modDate": "⤏⤂ā¤ļāĨ‹ā¤§ā¤¨ ⤤ā¤ŋā¤Ĩā¤ŋ (yyyy/MM/dd HH:mm:ss):", - "producer": "ā¤ĒāĨā¤°āĨ‹ā¤ĄāĨā¤¯āĨ‚⤏⤰:", - "subject": "ā¤ĩā¤ŋ⤎⤝:", - "trapped": "⤟āĨā¤°āĨˆā¤ĒāĨā¤Ą:", - "submit": "ā¤Ŧā¤Ļ⤞āĨ‡ā¤‚" + "modDate": "⤏⤂ā¤ļāĨ‹ā¤§ā¤¨ ⤤ā¤ŋā¤Ĩā¤ŋ (yyyy/MM/dd HH:mm:ss):" }, "fileToPDF": { "tags": "⤰āĨ‚ā¤Ēā¤žā¤‚ā¤¤ā¤°ā¤Ŗ,ā¤ĒāĨā¤°ā¤žā¤°āĨ‚ā¤Ē,ā¤Ļ⤏āĨā¤¤ā¤žā¤ĩāĨ‡ā¤œ,⤚ā¤ŋ⤤āĨā¤°,⤏āĨā¤˛ā¤žā¤‡ā¤Ą,⤟āĨ‡ā¤•āĨā¤¸āĨā¤Ÿ,⤰āĨ‚ā¤Ēā¤žā¤‚ā¤¤ā¤°ā¤Ŗ,ā¤•ā¤žā¤°āĨā¤¯ā¤žā¤˛ā¤¯,ā¤ĄāĨ‰ā¤•āĨā¤¸,ā¤ĩ⤰āĨā¤Ą,ā¤ā¤•āĨā¤¸āĨ‡ā¤˛,ā¤Ēā¤žā¤ĩ⤰ā¤ĒāĨ‰ā¤‡ā¤‚ā¤Ÿ", @@ -878,6 +1891,7 @@ "ocr": { "tags": "ā¤Ēā¤šā¤šā¤žā¤¨,⤟āĨ‡ā¤•āĨā¤¸āĨā¤Ÿ,⤛ā¤ĩā¤ŋ,⤏āĨā¤•āĨˆā¤¨,ā¤Ēā¤ĸā¤ŧāĨ‡ā¤‚,ā¤Ēā¤šā¤šā¤žā¤¨āĨ‡ā¤‚,ā¤Ēā¤šā¤šā¤žā¤¨,⤏⤂ā¤Ēā¤žā¤Ļ⤍ ⤝āĨ‹ā¤—āĨā¤¯", "title": "OCR / ⤏āĨā¤•āĨˆā¤¨ ā¤¸ā¤žā¤Ģ ⤕⤰āĨ‡ā¤‚", + "desc": "⤏āĨā¤•āĨˆā¤¨ ⤕āĨ‹ ā¤¸ā¤žā¤Ģ ⤕⤰āĨ‡ā¤‚ ⤔⤰ PDF ⤕āĨ‡ ⤅⤂ā¤Ļ⤰ ⤛ā¤ĩā¤ŋ⤝āĨ‹ā¤‚ ⤏āĨ‡ ⤟āĨ‡ā¤•āĨā¤¸āĨā¤Ÿ ā¤•ā¤ž ā¤Ēā¤¤ā¤ž ā¤˛ā¤—ā¤žā¤ā¤‚ ⤔⤰ ⤉⤏āĨ‡ ⤟āĨ‡ā¤•āĨā¤¸āĨā¤Ÿ ⤕āĨ‡ ⤰āĨ‚ā¤Ē ā¤ŽāĨ‡ā¤‚ ā¤Ģā¤ŋ⤰ ⤏āĨ‡ ⤜āĨ‹ā¤Ąā¤ŧāĨ‡ā¤‚āĨ¤", "header": "⤏āĨā¤•āĨˆā¤¨ ā¤¸ā¤žā¤Ģ ⤕⤰āĨ‡ā¤‚ / OCR (⤑ā¤ĒāĨā¤Ÿā¤ŋ⤕⤞ ⤕āĨˆā¤°āĨ‡ā¤•āĨā¤Ÿā¤° ⤰ā¤ŋ⤕⤗āĨā¤¨ā¤ŋā¤ļ⤍)", "selectText": { "1": "PDF ā¤ŽāĨ‡ā¤‚ ā¤Ēā¤¤ā¤ž ā¤˛ā¤—ā¤žā¤ ā¤œā¤žā¤¨āĨ‡ ā¤ĩā¤žā¤˛āĨ€ ā¤­ā¤žā¤ˇā¤žā¤ā¤‚ ⤚āĨā¤¨āĨ‡ā¤‚ (⤜āĨ‹ ā¤ĩ⤰āĨā¤¤ā¤Žā¤žā¤¨ ā¤ŽāĨ‡ā¤‚ ā¤Ēā¤¤ā¤ž ā¤˛ā¤—ā¤žā¤ˆ ā¤—ā¤ˆ ā¤šāĨˆā¤‚ ⤉⤍āĨā¤šāĨ‡ā¤‚ ⤏āĨ‚ā¤šāĨ€ā¤Ŧā¤ĻāĨā¤§ ⤕ā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤šāĨˆ):", @@ -896,23 +1910,89 @@ "help": "⤕āĨƒā¤Ēā¤¯ā¤ž ⤅⤍āĨā¤¯ ā¤­ā¤žā¤ˇā¤žā¤“ā¤‚ ⤕āĨ‡ ⤞ā¤ŋā¤ ⤉ā¤Ē⤝āĨ‹ā¤— ⤔⤰/ā¤¯ā¤ž ā¤ĄāĨ‰ā¤•⤰ ā¤ŽāĨ‡ā¤‚ ⤉ā¤Ē⤝āĨ‹ā¤— ⤍ ⤕⤰⤍āĨ‡ ⤕āĨ‡ ā¤Ŧā¤žā¤°āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤¯ā¤š ā¤Ļ⤏āĨā¤¤ā¤žā¤ĩāĨ‡ā¤œā¤ŧāĨ€ā¤•⤰⤪ ā¤Ēā¤ĸā¤ŧāĨ‡ā¤‚", "credit": "ā¤¯ā¤š ⤏āĨ‡ā¤ĩā¤ž OCR ⤕āĨ‡ ⤞ā¤ŋā¤ qpdf ⤔⤰ Tesseract ā¤•ā¤ž ⤉ā¤Ē⤝āĨ‹ā¤— ⤕⤰⤤āĨ€ ā¤šāĨˆāĨ¤", "submit": "OCR ⤕āĨ‡ ā¤¸ā¤žā¤Ĩ PDF ā¤ĒāĨā¤°āĨ‹ā¤¸āĨ‡ā¤¸ ⤕⤰āĨ‡ā¤‚", - "desc": "⤏āĨā¤•āĨˆā¤¨ ⤕āĨ‹ ā¤¸ā¤žā¤Ģ ⤕⤰āĨ‡ā¤‚ ⤔⤰ PDF ⤕āĨ‡ ⤅⤂ā¤Ļ⤰ ⤛ā¤ĩā¤ŋ⤝āĨ‹ā¤‚ ⤏āĨ‡ ⤟āĨ‡ā¤•āĨā¤¸āĨā¤Ÿ ā¤•ā¤ž ā¤Ēā¤¤ā¤ž ā¤˛ā¤—ā¤žā¤ā¤‚ ⤔⤰ ⤉⤏āĨ‡ ⤟āĨ‡ā¤•āĨā¤¸āĨā¤Ÿ ⤕āĨ‡ ⤰āĨ‚ā¤Ē ā¤ŽāĨ‡ā¤‚ ā¤Ģā¤ŋ⤰ ⤏āĨ‡ ⤜āĨ‹ā¤Ąā¤ŧāĨ‡ā¤‚āĨ¤", + "operation": { + "submit": "Process OCR and Review" + }, + "results": { + "title": "OCR Results" + }, + "languagePicker": { + "additionalLanguages": "Looking for additional languages?", + "viewSetupGuide": "View setup guide →" + }, "settings": { "title": "⤏āĨ‡ā¤Ÿā¤ŋ⤂⤗āĨā¤¸", "ocrMode": { - "label": "OCR ā¤ŽāĨ‹ā¤Ą" + "label": "OCR ā¤ŽāĨ‹ā¤Ą", + "auto": "Auto (skip text layers)", + "force": "Force (re-OCR all, replace text)", + "strict": "Strict (abort if text found)" }, "languages": { - "label": "ā¤­ā¤žā¤ˇā¤žā¤ā¤‚" + "label": "ā¤­ā¤žā¤ˇā¤žā¤ā¤‚", + "placeholder": "Select languages" + }, + "compatibilityMode": { + "label": "Compatibility Mode" + }, + "advancedOptions": { + "label": "Processing Options", + "sidecar": "Create a text file", + "deskew": "Deskew pages", + "clean": "Clean input file", + "cleanFinal": "Clean final output" } }, "tooltip": { + "header": { + "title": "OCR Settings Overview" + }, "mode": { - "title": "OCR ā¤ŽāĨ‹ā¤Ą" + "title": "OCR ā¤ŽāĨ‹ā¤Ą", + "text": "Optical Character Recognition (OCR) helps you turn scanned or screenshotted pages into text you can search, copy, or highlight.", + "bullet1": "Auto skips pages that already contain text layers.", + "bullet2": "Force re-OCRs every page and replaces all the text.", + "bullet3": "Strict halts if any selectable text is found." }, "languages": { - "title": "ā¤­ā¤žā¤ˇā¤žā¤ā¤‚" + "title": "ā¤­ā¤žā¤ˇā¤žā¤ā¤‚", + "text": "Improve OCR accuracy by specifying the expected languages. Choose one or more languages to guide detection." + }, + "output": { + "title": "Output", + "text": "Decide how you want the text output formatted:", + "bullet1": "Searchable PDF embeds text behind the original image.", + "bullet2": "HOCR XML returns a structured machine-readable file.", + "bullet3": "Plain-text sidecar creates a separate .txt file with raw content." + }, + "advanced": { + "header": { + "title": "Advanced OCR Processing" + }, + "compatibility": { + "title": "Compatibility Mode", + "text": "Uses OCR 'sandwich PDF' mode: results in larger files, but more reliable with certain languages and older PDF software. By default we use hOCR for smaller, modern PDFs." + }, + "sidecar": { + "title": "Create Text File", + "text": "Generates a separate .txt file alongside the PDF containing all extracted text content for easy access and processing." + }, + "deskew": { + "title": "Deskew Pages", + "text": "Automatically corrects skewed or tilted pages to improve OCR accuracy. Useful for scanned documents that weren't perfectly aligned." + }, + "clean": { + "title": "Clean Input File", + "text": "Preprocesses the input by removing noise, enhancing contrast, and optimising the image for better OCR recognition before processing." + }, + "cleanFinal": { + "title": "Clean Final Output", + "text": "Post-processes the final PDF by removing OCR artefacts and optimising the text layer for better readability and smaller file size." + } } + }, + "error": { + "failed": "OCR operation failed" } }, "extractImages": { @@ -921,7 +2001,13 @@ "header": "⤛ā¤ĩā¤ŋā¤¯ā¤žā¤‚ ⤍ā¤ŋā¤•ā¤žā¤˛āĨ‡ā¤‚", "selectText": "⤍ā¤ŋā¤•ā¤žā¤˛āĨ€ ā¤—ā¤ˆ ⤛ā¤ĩā¤ŋ⤝āĨ‹ā¤‚ ⤕āĨ‹ ā¤Ŧā¤Ļ⤞⤍āĨ‡ ⤕āĨ‡ ⤞ā¤ŋā¤ ⤛ā¤ĩā¤ŋ ā¤ĒāĨā¤°ā¤žā¤°āĨ‚ā¤Ē ⤚āĨā¤¨āĨ‡ā¤‚", "allowDuplicates": "ā¤ĄāĨā¤ĒāĨā¤˛ā¤ŋ⤕āĨ‡ā¤Ÿ ⤛ā¤ĩā¤ŋā¤¯ā¤žā¤‚ ā¤¸ā¤šāĨ‡ā¤œāĨ‡ā¤‚", - "submit": "⤍ā¤ŋā¤•ā¤žā¤˛āĨ‡ā¤‚" + "submit": "⤍ā¤ŋā¤•ā¤žā¤˛āĨ‡ā¤‚", + "settings": { + "title": "Settings" + }, + "error": { + "failed": "An error occurred while extracting images from the PDF." + } }, "pdfToPDFA": { "tags": "⤏⤂⤗āĨā¤°ā¤š,⤞⤂ā¤ŦāĨ€ ⤅ā¤ĩ⤧ā¤ŋ,ā¤Žā¤žā¤¨ā¤•,⤰āĨ‚ā¤Ēā¤žā¤‚ā¤¤ā¤°ā¤Ŗ,ā¤­ā¤‚ā¤Ąā¤žā¤°ā¤Ŗ,⤏⤂⤰⤕āĨā¤ˇā¤Ŗ", @@ -993,17 +2079,53 @@ }, "info": "Python ⤏āĨā¤Ĩā¤žā¤Ēā¤ŋ⤤ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆāĨ¤ ā¤šā¤˛ā¤žā¤¨āĨ‡ ⤕āĨ‡ ⤞ā¤ŋā¤ ⤆ā¤ĩā¤ļāĨā¤¯ā¤• ā¤šāĨˆāĨ¤" }, + "scannerImageSplit": { + "title": "Extracted Images", + "submit": "Extract Image Scans", + "error": { + "failed": "An error occurred while extracting image scans." + }, + "tooltip": { + "title": "Photo Splitter", + "whatThisDoes": "What this does", + "whatThisDoesDesc": "Automatically finds and extracts each photo from a scanned page or composite image—no manual cropping.", + "whenToUse": "When to use", + "useCase1": "Scan whole album pages in one go", + "useCase2": "Split flatbed batches into separate files", + "useCase3": "Break collages into individual photos", + "useCase4": "Pull photos from documents", + "quickFixes": "Quick fixes", + "problem1": "Photos not detected → increase Tolerance to 30-50", + "problem2": "Too many false detections → increase Minimum Area to 15,000-20,000", + "problem3": "Crops are too tight → increase Border Size to 5-10", + "problem4": "Tilted photos not straightened → lower Angle Threshold to ~5°", + "problem5": "Dust/noise boxes → increase Minimum Contour Area to 1000-2000", + "setupTips": "Setup tips", + "tip1": "Use a plain, light background", + "tip2": "Leave a small gap (≈1 cm) between photos", + "tip3": "Scan at 300-600 DPI", + "tip4": "Clean the scanner glass", + "headsUp": "Heads-up", + "headsUpDesc": "Overlapping photos or backgrounds very close in colour to the photos can reduce accuracy-try a lighter or darker background and leave more space." + } + }, "sign": { - "tags": "⤅⤧ā¤ŋ⤕āĨƒā¤¤,⤆ā¤ĻāĨā¤¯ā¤žā¤•āĨā¤ˇā¤°,⤚ā¤ŋ⤤āĨā¤°ā¤ŋ⤤-ā¤šā¤¸āĨā¤¤ā¤žā¤•āĨā¤ˇā¤°,⤟āĨ‡ā¤•āĨā¤¸āĨā¤Ÿ-ā¤šā¤¸āĨā¤¤ā¤žā¤•āĨā¤ˇā¤°,⤛ā¤ĩā¤ŋ-ā¤šā¤¸āĨā¤¤ā¤žā¤•āĨā¤ˇā¤°", "title": "ā¤šā¤¸āĨā¤¤ā¤žā¤•āĨā¤ˇā¤°", "header": "PDF ā¤Ē⤰ ā¤šā¤¸āĨā¤¤ā¤žā¤•āĨā¤ˇā¤° ⤕⤰āĨ‡ā¤‚", "upload": "⤛ā¤ĩā¤ŋ ⤅ā¤Ē⤞āĨ‹ā¤Ą ⤕⤰āĨ‡ā¤‚", - "draw": "ā¤šā¤¸āĨā¤¤ā¤žā¤•āĨā¤ˇā¤° ā¤Ŧā¤¨ā¤žā¤ā¤‚", - "text": "⤟āĨ‡ā¤•āĨā¤¸āĨā¤Ÿ ⤇⤍ā¤ĒāĨā¤Ÿ", + "draw": { + "title": "Draw your signature", + "clear": "Clear" + }, + "text": { + "name": "Signer Name", + "placeholder": "Enter your full name" + }, "clear": "ā¤¸ā¤žā¤Ģā¤ŧ ⤕⤰āĨ‡ā¤‚", "add": "⤜āĨ‹ā¤Ąā¤ŧāĨ‡ā¤‚", "saved": "ā¤¸ā¤šāĨ‡ā¤œāĨ‡ ā¤—ā¤ ā¤šā¤¸āĨā¤¤ā¤žā¤•āĨā¤ˇā¤°", "save": "ā¤šā¤¸āĨā¤¤ā¤žā¤•āĨā¤ˇā¤° ā¤¸ā¤šāĨ‡ā¤œāĨ‡ā¤‚", + "applySignatures": "Apply Signatures", "personalSigs": "ā¤ĩāĨā¤¯ā¤•āĨā¤¤ā¤ŋ⤗⤤ ā¤šā¤¸āĨā¤¤ā¤žā¤•āĨā¤ˇā¤°", "sharedSigs": "ā¤¸ā¤žā¤ā¤ž ⤕ā¤ŋā¤ ā¤—ā¤ ā¤šā¤¸āĨā¤¤ā¤žā¤•āĨā¤ˇā¤°", "noSavedSigs": "⤕āĨ‹ā¤ˆ ā¤¸ā¤šāĨ‡ā¤œā¤ž ā¤—ā¤¯ā¤ž ā¤šā¤¸āĨā¤¤ā¤žā¤•āĨā¤ˇā¤° ā¤¨ā¤šāĨ€ā¤‚ ā¤Žā¤ŋā¤˛ā¤ž", @@ -1015,42 +2137,179 @@ "previous": "ā¤Ēā¤ŋā¤›ā¤˛ā¤ž ā¤ĒāĨƒā¤ˇāĨā¤ ", "maintainRatio": "⤆⤍āĨā¤Ēā¤žā¤¤ā¤ŋ⤕ ⤅⤍āĨā¤Ēā¤žā¤¤ ā¤Ŧā¤¨ā¤žā¤ ⤰⤖āĨ‡ā¤‚ ⤟āĨ‰ā¤—⤞ ⤕⤰āĨ‡ā¤‚", "undo": "Undo", - "redo": "Redo" + "redo": "Redo", + "submit": "Sign Document", + "steps": { + "configure": "Configure Signature" + }, + "type": { + "title": "Signature Type", + "draw": "Draw", + "canvas": "Canvas", + "image": "Image", + "text": "Text" + }, + "image": { + "label": "Upload signature image", + "placeholder": "Select image file", + "hint": "Upload a PNG or JPG image of your signature" + }, + "instructions": { + "title": "How to add signature", + "canvas": "After drawing your signature in the canvas, close the modal then click anywhere on the PDF to place it.", + "image": "After uploading your signature image above, click anywhere on the PDF to place it.", + "text": "After entering your name above, click anywhere on the PDF to place your signature." + }, + "mode": { + "move": "Move Signature", + "place": "Place Signature" + }, + "updateAndPlace": "Update and Place", + "activate": "Activate Signature Placement", + "deactivate": "Stop Placing Signatures", + "results": { + "title": "Signature Results" + }, + "error": { + "failed": "An error occurred while signing the PDF." + }, + "tags": "⤅⤧ā¤ŋ⤕āĨƒā¤¤,⤆ā¤ĻāĨā¤¯ā¤žā¤•āĨā¤ˇā¤°,⤚ā¤ŋ⤤āĨā¤°ā¤ŋ⤤-ā¤šā¤¸āĨā¤¤ā¤žā¤•āĨā¤ˇā¤°,⤟āĨ‡ā¤•āĨā¤¸āĨā¤Ÿ-ā¤šā¤¸āĨā¤¤ā¤žā¤•āĨā¤ˇā¤°,⤛ā¤ĩā¤ŋ-ā¤šā¤¸āĨā¤¤ā¤žā¤•āĨā¤ˇā¤°" }, "flatten": { - "tags": "⤏āĨā¤Ĩā¤ŋ⤰,⤍ā¤ŋ⤎āĨā¤•āĨā¤°ā¤ŋ⤝,⤗āĨˆā¤°-ā¤‡ā¤‚ā¤Ÿā¤°āĨˆā¤•āĨā¤Ÿā¤ŋā¤ĩ,⤏⤰⤞āĨ€ā¤•āĨƒā¤¤", "title": "ā¤¸ā¤Žā¤¤ā¤˛ ⤕⤰āĨ‡ā¤‚", "header": "PDF ā¤¸ā¤Žā¤¤ā¤˛ ⤕⤰āĨ‡ā¤‚", "flattenOnlyForms": "⤕āĨ‡ā¤ĩ⤞ ā¤Ģā¤ŧāĨ‰ā¤°āĨā¤Ž ā¤¸ā¤Žā¤¤ā¤˛ ⤕⤰āĨ‡ā¤‚", "submit": "ā¤¸ā¤Žā¤¤ā¤˛ ⤕⤰āĨ‡ā¤‚", + "filenamePrefix": "flattened", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, "steps": { "settings": "⤏āĨ‡ā¤Ÿā¤ŋ⤂⤗āĨā¤¸" }, "options": { - "flattenOnlyForms": "⤕āĨ‡ā¤ĩ⤞ ā¤Ģā¤ŧāĨ‰ā¤°āĨā¤Ž ā¤¸ā¤Žā¤¤ā¤˛ ⤕⤰āĨ‡ā¤‚" - } + "stepTitle": "Flatten Options", + "title": "Flatten Options", + "flattenOnlyForms": { + "label": "⤕āĨ‡ā¤ĩ⤞ ā¤Ģā¤ŧāĨ‰ā¤°āĨā¤Ž ā¤¸ā¤Žā¤¤ā¤˛ ⤕⤰āĨ‡ā¤‚", + "desc": "Only flatten form fields, leaving other interactive elements intact" + }, + "note": "Flattening removes interactive elements from the PDF, making them non-editable." + }, + "results": { + "title": "Flatten Results" + }, + "error": { + "failed": "An error occurred while flattening the PDF." + }, + "tooltip": { + "header": { + "title": "About Flattening PDFs" + }, + "description": { + "title": "What does flattening do?", + "text": "Flattening makes your PDF non-editable by turning fillable forms and buttons into regular text and images. The PDF will look exactly the same, but no one can change or fill in the forms anymore. Perfect for sharing completed forms, creating final documents for records, or ensuring the PDF looks the same everywhere.", + "bullet1": "Text boxes become regular text (can't be edited)", + "bullet2": "Checkboxes and buttons become pictures", + "bullet3": "Great for final versions you don't want changed", + "bullet4": "Ensures consistent appearance across all devices" + }, + "formsOnly": { + "title": "What does 'Flatten only forms' mean?", + "text": "This option only removes the ability to fill in forms, but keeps other features working like clicking links, viewing bookmarks, and reading comments.", + "bullet1": "Forms become non-editable", + "bullet2": "Links still work when clicked", + "bullet3": "Comments and notes remain visible", + "bullet4": "Bookmarks still help you navigate" + } + }, + "tags": "⤏āĨā¤Ĩā¤ŋ⤰,⤍ā¤ŋ⤎āĨā¤•āĨā¤°ā¤ŋ⤝,⤗āĨˆā¤°-ā¤‡ā¤‚ā¤Ÿā¤°āĨˆā¤•āĨā¤Ÿā¤ŋā¤ĩ,⤏⤰⤞āĨ€ā¤•āĨƒā¤¤" }, "repair": { "tags": "⤠āĨ€ā¤• ⤕⤰āĨ‡ā¤‚,ā¤ĒāĨā¤¨ā¤°āĨā¤¸āĨā¤Ĩā¤žā¤Ēā¤ŋ⤤ ⤕⤰āĨ‡ā¤‚,⤏āĨā¤§ā¤žā¤°,ā¤ĒāĨā¤¨ā¤°āĨā¤ĒāĨā¤°ā¤žā¤ĒāĨā¤¤ ⤕⤰āĨ‡ā¤‚", "title": "ā¤Žā¤°ā¤ŽāĨā¤Žā¤¤", "header": "PDF ā¤Žā¤°ā¤ŽāĨā¤Žā¤¤", - "submit": "ā¤Žā¤°ā¤ŽāĨā¤Žā¤¤" + "submit": "ā¤Žā¤°ā¤ŽāĨā¤Žā¤¤", + "description": "This tool will attempt to repair corrupted or damaged PDF files. No additional settings are required.", + "filenamePrefix": "repaired", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst repairing the PDF." + }, + "results": { + "title": "Repair Results" + } }, "removeBlanks": { - "tags": "ā¤¸ā¤žā¤Ģ ⤕⤰āĨ‡ā¤‚,⤏⤰⤞āĨ€ā¤•āĨƒā¤¤ ⤕⤰āĨ‡ā¤‚,⤗āĨˆā¤°-ā¤¸ā¤žā¤Žā¤—āĨā¤°āĨ€,ā¤ĩāĨā¤¯ā¤ĩ⤏āĨā¤Ĩā¤ŋ⤤ ⤕⤰āĨ‡ā¤‚", "title": "ā¤–ā¤žā¤˛āĨ€ ā¤ĒāĨƒā¤ˇāĨā¤  ā¤šā¤Ÿā¤žā¤ā¤‚", "header": "ā¤–ā¤žā¤˛āĨ€ ā¤ĒāĨƒā¤ˇāĨā¤  ā¤šā¤Ÿā¤žā¤ā¤‚", - "threshold": "ā¤Ēā¤ŋ⤕āĨā¤¸āĨ‡ā¤˛ ā¤ļāĨā¤ĩāĨ‡ā¤¤ā¤¤ā¤ž ⤏āĨ€ā¤Žā¤ž:", + "settings": { + "title": "Settings" + }, + "threshold": { + "label": "Pixel Whiteness Threshold" + }, + "whitePercent": { + "label": "White Percentage Threshold", + "unit": "%" + }, + "includeBlankPages": { + "label": "Include detected blank pages" + }, + "tooltip": { + "header": { + "title": "Remove Blank Pages Settings" + }, + "threshold": { + "title": "Pixel Whiteness Threshold", + "text": "Controls how white a pixel must be to be considered 'white'. This helps determine what counts as a blank area on the page.", + "bullet1": "0 = Pure black (most restrictive)", + "bullet2": "128 = Medium grey", + "bullet3": "255 = Pure white (least restrictive)" + }, + "whitePercent": { + "title": "White Percentage Threshold", + "text": "Sets the minimum percentage of white pixels required for a page to be considered blank and removed.", + "bullet1": "Lower values (e.g., 80%) = More pages removed", + "bullet2": "Higher values (e.g., 95%) = Only very blank pages removed", + "bullet3": "Use higher values for documents with light backgrounds" + }, + "includeBlankPages": { + "title": "Include Detected Blank Pages", + "text": "When enabled, creates a separate PDF containing all the blank pages that were detected and removed from the original document.", + "bullet1": "Useful for reviewing what was removed", + "bullet2": "Helps verify the detection accuracy", + "bullet3": "Can be disabled to reduce output file size" + } + }, + "submit": "ā¤–ā¤žā¤˛āĨ€ ā¤šā¤Ÿā¤žā¤ā¤‚", + "error": { + "failed": "Failed to remove blank pages" + }, + "results": { + "title": "Removed Blank Pages" + }, + "tags": "ā¤¸ā¤žā¤Ģ ⤕⤰āĨ‡ā¤‚,⤏⤰⤞āĨ€ā¤•āĨƒā¤¤ ⤕⤰āĨ‡ā¤‚,⤗āĨˆā¤°-ā¤¸ā¤žā¤Žā¤—āĨā¤°āĨ€,ā¤ĩāĨā¤¯ā¤ĩ⤏āĨā¤Ĩā¤ŋ⤤ ⤕⤰āĨ‡ā¤‚", "thresholdDesc": "ā¤ā¤• ā¤ļāĨā¤ĩāĨ‡ā¤¤ ā¤Ēā¤ŋ⤕āĨā¤¸āĨ‡ā¤˛ ⤕āĨ‹ 'ā¤ļāĨā¤ĩāĨ‡ā¤¤' ā¤ĩ⤰āĨā¤—āĨ€ā¤•āĨƒā¤¤ ⤕⤰⤍āĨ‡ ⤕āĨ‡ ⤞ā¤ŋā¤ ⤕ā¤ŋā¤¤ā¤¨ā¤ž ā¤ļāĨā¤ĩāĨ‡ā¤¤ ā¤šāĨ‹ā¤¨ā¤ž ā¤šā¤žā¤šā¤ŋā¤ ā¤¯ā¤š ⤍ā¤ŋ⤰āĨā¤§ā¤žā¤°ā¤ŋ⤤ ⤕⤰⤍āĨ‡ ⤕āĨ‡ ⤞ā¤ŋā¤ ⤏āĨ€ā¤Žā¤žāĨ¤ 0 = ā¤•ā¤žā¤˛ā¤ž, 255 ā¤ĒāĨ‚⤰āĨā¤Ŗ ā¤ļāĨā¤ĩāĨ‡ā¤¤āĨ¤", - "whitePercent": "ā¤ļāĨā¤ĩāĨ‡ā¤¤ ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤ļ⤤ (%):", - "whitePercentDesc": "ā¤šā¤Ÿā¤žā¤ ā¤œā¤žā¤¨āĨ‡ ⤕āĨ‡ ⤞ā¤ŋā¤ ā¤ĒāĨƒā¤ˇāĨā¤  ā¤•ā¤ž ⤕ā¤ŋā¤¤ā¤¨ā¤ž ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤ļ⤤ 'ā¤ļāĨā¤ĩāĨ‡ā¤¤' ā¤Ēā¤ŋ⤕āĨā¤¸āĨ‡ā¤˛ ā¤šāĨ‹ā¤¨ā¤ž ā¤šā¤žā¤šā¤ŋā¤", - "submit": "ā¤–ā¤žā¤˛āĨ€ ā¤šā¤Ÿā¤žā¤ā¤‚" + "whitePercentDesc": "ā¤šā¤Ÿā¤žā¤ ā¤œā¤žā¤¨āĨ‡ ⤕āĨ‡ ⤞ā¤ŋā¤ ā¤ĒāĨƒā¤ˇāĨā¤  ā¤•ā¤ž ⤕ā¤ŋā¤¤ā¤¨ā¤ž ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤ļ⤤ 'ā¤ļāĨā¤ĩāĨ‡ā¤¤' ā¤Ēā¤ŋ⤕āĨā¤¸āĨ‡ā¤˛ ā¤šāĨ‹ā¤¨ā¤ž ā¤šā¤žā¤šā¤ŋā¤" }, "removeAnnotations": { "tags": "⤟ā¤ŋā¤ĒāĨā¤Ē⤪ā¤ŋā¤¯ā¤žā¤‚,ā¤šā¤žā¤‡ā¤˛ā¤žā¤‡ā¤Ÿ,⤍āĨ‹ā¤ŸāĨā¤¸,ā¤Žā¤žā¤°āĨā¤•⤅ā¤Ē,ā¤šā¤Ÿā¤žā¤ā¤‚", "title": "⤟ā¤ŋā¤ĒāĨā¤Ē⤪ā¤ŋā¤¯ā¤žā¤‚ ā¤šā¤Ÿā¤žā¤ā¤‚", "header": "⤟ā¤ŋā¤ĒāĨā¤Ē⤪ā¤ŋā¤¯ā¤žā¤‚ ā¤šā¤Ÿā¤žā¤ā¤‚", - "submit": "ā¤šā¤Ÿā¤žā¤ā¤‚" + "submit": "ā¤šā¤Ÿā¤žā¤ā¤‚", + "settings": { + "title": "Settings" + }, + "info": { + "title": "About Remove Annotations", + "description": "This tool will remove all annotations (comments, highlights, notes, etc.) from your PDF documents." + }, + "error": { + "failed": "An error occurred while removing annotations from the PDF." + } }, "compare": { "tags": "⤅⤂⤤⤰,⤤āĨā¤˛ā¤¨ā¤ž,ā¤Ē⤰ā¤ŋā¤ĩ⤰āĨā¤¤ā¤¨,ā¤ĩā¤ŋā¤ļāĨā¤˛āĨ‡ā¤ˇā¤Ŗ", @@ -1082,6 +2341,142 @@ "certSign": { "tags": "ā¤ĒāĨā¤°ā¤Žā¤žā¤ŖāĨ€ā¤•⤰⤪,PEM,P12,⤆⤧ā¤ŋā¤•ā¤žā¤°ā¤ŋ⤕,ā¤ā¤¨āĨā¤•āĨā¤°ā¤ŋā¤ĒāĨā¤Ÿ", "title": "ā¤ĒāĨā¤°ā¤Žā¤žā¤Ŗā¤Ē⤤āĨā¤° ā¤šā¤¸āĨā¤¤ā¤žā¤•āĨā¤ˇā¤°", + "filenamePrefix": "signed", + "signMode": { + "stepTitle": "Sign Mode", + "tooltip": { + "header": { + "title": "About PDF Signatures" + }, + "overview": { + "title": "How signatures work", + "text": "Both modes seal the document (any edits are flagged as tampering) and record who/when/how for auditing. Viewer trust depends on the certificate chain." + }, + "manual": { + "title": "Manual - Bring your certificate", + "text": "Use your own certificate files for brand-aligned identity. Can display Trusted when your CA/chain is recognised.", + "use": "Use for: customer-facing, legal, compliance." + }, + "auto": { + "title": "Auto - Zero-setup, instant system seal", + "text": "Signs with a server self-signed certificate. Same tamper-evident seal and audit trail; typically shows Unverified in viewers.", + "use": "Use when: you need speed and consistent internal identity across reviews and records." + }, + "rule": { + "title": "Rule of thumb", + "text": "Need recipient Trusted status? Manual. Need a fast, tamper-evident seal and audit trail with no setup? Auto." + } + } + }, + "certTypeStep": { + "stepTitle": "Certificate Format" + }, + "certFiles": { + "stepTitle": "Certificate Files" + }, + "appearance": { + "stepTitle": "Signature Appearance", + "tooltip": { + "header": { + "title": "About Signature Appearance" + }, + "invisible": { + "title": "Invisible Signatures", + "text": "The signature is added to the PDF for security but won't be visible when viewing the document. Perfect for legal requirements without changing the document's appearance.", + "bullet1": "Provides security without visual changes", + "bullet2": "Meets legal requirements for digital signing", + "bullet3": "Doesn't affect document layout or design" + }, + "visible": { + "title": "Visible Signatures", + "text": "Shows a signature block on the PDF with your name, date, and optional details. Useful when you want readers to clearly see the document is signed.", + "bullet1": "Shows signer name and date on the document", + "bullet2": "Can include reason and location for signing", + "bullet3": "Choose which page to place the signature", + "bullet4": "Optional logo can be included" + } + }, + "invisible": "Invisible", + "options": { + "title": "Signature Details" + }, + "visible": "Visible" + }, + "sign": { + "submit": "Sign PDF", + "results": "Signed PDF" + }, + "error": { + "failed": "An error occurred whilst processing signatures." + }, + "tooltip": { + "header": { + "title": "About Managing Signatures" + }, + "overview": { + "title": "What can this tool do?", + "text": "This tool lets you check if your PDFs are digitally signed and add new digital signatures. Digital signatures prove who created or approved a document and show if it has been changed since signing.", + "bullet1": "Check existing signatures and their validity", + "bullet2": "View detailed information about signers and certificates", + "bullet3": "Add new digital signatures to secure your documents", + "bullet4": "Multiple files supported with easy navigation" + }, + "validation": { + "title": "Checking Signatures", + "text": "When you check signatures, the tool tells you if they're valid, who signed the document, when it was signed, and whether the document has been changed since signing.", + "bullet1": "Shows if signatures are valid or invalid", + "bullet2": "Displays signer information and signing date", + "bullet3": "Checks if the document was modified after signing", + "bullet4": "Can use custom certificates for verification" + }, + "signing": { + "title": "Adding Signatures", + "text": "To sign a PDF, you need a digital certificate (like PEM, PKCS12, or JKS). You can choose to make the signature visible on the document or keep it invisible for security only.", + "bullet1": "Supports PEM, PKCS12, JKS, and server certificate formats", + "bullet2": "Option to show or hide signature on the PDF", + "bullet3": "Add reason, location, and signer name", + "bullet4": "Choose which page to place visible signatures", + "bullet5": "Use server certificate for simple 'Sign with Stirling-PDF' option" + } + }, + "certType": { + "tooltip": { + "header": { + "title": "About Certificate Types" + }, + "what": { + "title": "What's a certificate?", + "text": "It's a secure ID for your signature that proves you signed. Unless you're required to sign via certificate, we recommend using another secure method like Type, Draw, or Upload." + }, + "which": { + "title": "Which option should I use?", + "text": "Choose the format that matches your certificate file:", + "bullet1": "PKCS#12 (.p12 / .pfx) – one combined file (most common)", + "bullet2": "PFX (.pfx) – Microsoft's version of PKCS12", + "bullet3": "PEM – separate private-key and certificate .pem files", + "bullet4": "JKS – Java .jks keystore for dev / CI-CD workflows" + }, + "convert": { + "title": "Key not listed?", + "text": "Convert your file to a Java keystore (.jks) with keytool, then pick JKS." + } + } + }, + "chooseCertificate": "Choose Certificate File", + "chooseJksFile": "Choose JKS File", + "chooseP12File": "Choose PKCS12 File", + "choosePfxFile": "Choose PFX File", + "choosePrivateKey": "Choose Private Key File", + "location": "⤏āĨā¤Ĩā¤žā¤¨", + "logoTitle": "Logo", + "name": "ā¤¨ā¤žā¤Ž", + "noLogo": "No Logo", + "pageNumber": "Page Number", + "password": "⤅ā¤Ē⤍āĨ€ ⤕āĨ€ā¤¸āĨā¤ŸāĨ‹ā¤° ā¤¯ā¤ž ⤍ā¤ŋ⤜āĨ€ ⤕āĨā¤‚ā¤œāĨ€ ā¤Ēā¤žā¤¸ā¤ĩ⤰āĨā¤Ą ā¤Ļ⤰āĨā¤œ ⤕⤰āĨ‡ā¤‚ (⤝ā¤Ļā¤ŋ ⤕āĨ‹ā¤ˆ ā¤šāĨ‹):", + "passwordOptional": "Leave empty if no password", + "reason": "ā¤•ā¤žā¤°ā¤Ŗ", + "serverCertMessage": "Using server certificate - no files or password required", + "showLogo": "⤞āĨ‹ā¤—āĨ‹ ā¤Ļā¤ŋā¤–ā¤žā¤ā¤‚", "header": "ā¤ĒāĨā¤°ā¤Žā¤žā¤Ŗā¤Ē⤤āĨā¤° ⤏āĨ‡ ā¤šā¤¸āĨā¤¤ā¤žā¤•āĨā¤ˇā¤° ⤕⤰āĨ‡ā¤‚ (ā¤•ā¤žā¤°āĨā¤¯ ā¤ĒāĨā¤°ā¤—⤤ā¤ŋ ā¤Ē⤰ ā¤šāĨˆ)", "selectPDF": "ā¤šā¤¸āĨā¤¤ā¤žā¤•āĨā¤ˇā¤° ⤕āĨ‡ ⤞ā¤ŋā¤ PDF ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ⤚āĨā¤¨āĨ‡ā¤‚:", "jksNote": "⤍āĨ‹ā¤Ÿ: ⤝ā¤Ļā¤ŋ ⤆ā¤Ē⤕āĨ‡ ā¤ĒāĨā¤°ā¤Žā¤žā¤Ŗā¤Ē⤤āĨā¤° ā¤•ā¤ž ā¤ĒāĨā¤°ā¤•ā¤žā¤° ⤍āĨ€ā¤šāĨ‡ ⤏āĨ‚ā¤šāĨ€ā¤Ŧā¤ĻāĨā¤§ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆ, ⤤āĨ‹ ⤕āĨƒā¤Ēā¤¯ā¤ž keytool ā¤•ā¤Žā¤žā¤‚ā¤Ą ā¤˛ā¤žā¤‡ā¤¨ ⤟āĨ‚⤞ ā¤•ā¤ž ⤉ā¤Ē⤝āĨ‹ā¤— ⤕⤰⤕āĨ‡ ⤇⤏āĨ‡ Java Keystore (.jks) ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤ŽāĨ‡ā¤‚ ā¤Ŧā¤Ļ⤞āĨ‡ā¤‚āĨ¤ ā¤Ģā¤ŋ⤰ ⤍āĨ€ā¤šāĨ‡ .jks ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤ĩā¤ŋ⤕⤞āĨā¤Ē ⤚āĨā¤¨āĨ‡ā¤‚āĨ¤", @@ -1089,13 +2484,7 @@ "selectCert": "⤅ā¤Ēā¤¨ā¤ž ā¤ĒāĨā¤°ā¤Žā¤žā¤Ŗā¤Ē⤤āĨā¤° ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ⤚āĨā¤¨āĨ‡ā¤‚ (X.509 ā¤ĒāĨā¤°ā¤žā¤°āĨ‚ā¤Ē, .pem ā¤¯ā¤ž .der ā¤šāĨ‹ ⤏⤕⤤āĨ€ ā¤šāĨˆ):", "selectP12": "⤅ā¤Ē⤍āĨ€ PKCS#12 ⤕āĨ€ā¤¸āĨā¤ŸāĨ‹ā¤° ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ⤚āĨā¤¨āĨ‡ā¤‚ (.p12 ā¤¯ā¤ž .pfx) (ā¤ĩāĨˆā¤•⤞āĨā¤Ēā¤ŋ⤕, ⤝ā¤Ļā¤ŋ ā¤ĒāĨā¤°ā¤Ļā¤žā¤¨ ⤕āĨ€ ā¤—ā¤ˆ ā¤šāĨˆ, ⤤āĨ‹ ā¤‡ā¤¸ā¤ŽāĨ‡ā¤‚ ⤆ā¤Ē⤕āĨ€ ⤍ā¤ŋ⤜āĨ€ ⤕āĨā¤‚ā¤œāĨ€ ⤔⤰ ā¤ĒāĨā¤°ā¤Žā¤žā¤Ŗā¤Ē⤤āĨā¤° ā¤šāĨ‹ā¤¨ā¤ž ā¤šā¤žā¤šā¤ŋā¤):", "selectJKS": "⤅ā¤Ē⤍āĨ€ Java Keystore ā¤Ģā¤ŧā¤žā¤‡ā¤˛ (.jks ā¤¯ā¤ž .keystore) ⤚āĨā¤¨āĨ‡ā¤‚:", - "certType": "ā¤ĒāĨā¤°ā¤Žā¤žā¤Ŗā¤Ē⤤āĨā¤° ā¤ĒāĨā¤°ā¤•ā¤žā¤°", - "password": "⤅ā¤Ē⤍āĨ€ ⤕āĨ€ā¤¸āĨā¤ŸāĨ‹ā¤° ā¤¯ā¤ž ⤍ā¤ŋ⤜āĨ€ ⤕āĨā¤‚ā¤œāĨ€ ā¤Ēā¤žā¤¸ā¤ĩ⤰āĨā¤Ą ā¤Ļ⤰āĨā¤œ ⤕⤰āĨ‡ā¤‚ (⤝ā¤Ļā¤ŋ ⤕āĨ‹ā¤ˆ ā¤šāĨ‹):", "showSig": "ā¤šā¤¸āĨā¤¤ā¤žā¤•āĨā¤ˇā¤° ā¤Ļā¤ŋā¤–ā¤žā¤ā¤‚", - "reason": "ā¤•ā¤žā¤°ā¤Ŗ", - "location": "⤏āĨā¤Ĩā¤žā¤¨", - "name": "ā¤¨ā¤žā¤Ž", - "showLogo": "⤞āĨ‹ā¤—āĨ‹ ā¤Ļā¤ŋā¤–ā¤žā¤ā¤‚", "submit": "PDF ā¤Ē⤰ ā¤šā¤¸āĨā¤¤ā¤žā¤•āĨā¤ˇā¤° ⤕⤰āĨ‡ā¤‚" }, "removeCertSign": { @@ -1103,7 +2492,18 @@ "title": "ā¤ĒāĨā¤°ā¤Žā¤žā¤Ŗā¤Ē⤤āĨā¤° ā¤šā¤¸āĨā¤¤ā¤žā¤•āĨā¤ˇā¤° ā¤šā¤Ÿā¤žā¤ā¤‚", "header": "PDF ⤏āĨ‡ ā¤Ąā¤ŋ⤜ā¤ŋ⤟⤞ ā¤ĒāĨā¤°ā¤Žā¤žā¤Ŗā¤Ē⤤āĨā¤° ā¤šā¤Ÿā¤žā¤ā¤‚", "selectPDF": "PDF ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ⤚āĨā¤¨āĨ‡ā¤‚:", - "submit": "ā¤šā¤¸āĨā¤¤ā¤žā¤•āĨā¤ˇā¤° ā¤šā¤Ÿā¤žā¤ā¤‚" + "submit": "ā¤šā¤¸āĨā¤¤ā¤žā¤•āĨā¤ˇā¤° ā¤šā¤Ÿā¤žā¤ā¤‚", + "description": "This tool will remove digital certificate signatures from your PDF document.", + "filenamePrefix": "unsigned", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst removing certificate signatures." + }, + "results": { + "title": "Certificate Removal Results" + } }, "pageLayout": { "tags": "ā¤Žā¤°āĨā¤œ,⤏⤂⤝āĨ‹ā¤œā¤ŋ⤤,ā¤ā¤•ā¤˛-ā¤ĻāĨƒā¤ļāĨā¤¯,ā¤ĩāĨā¤¯ā¤ĩ⤏āĨā¤Ĩā¤ŋ⤤", @@ -1111,16 +2511,157 @@ "header": "ā¤Žā¤˛āĨā¤ŸāĨ€ ā¤ĒāĨ‡ā¤œ ⤞āĨ‡ā¤†ā¤‰ā¤Ÿ", "pagesPerSheet": "ā¤ĒāĨā¤°ā¤¤ā¤ŋ ā¤ļāĨ€ā¤Ÿ ā¤ĒāĨƒā¤ˇāĨā¤ :", "addBorder": "ā¤ŦāĨ‰ā¤°āĨā¤Ąā¤° ⤜āĨ‹ā¤Ąā¤ŧāĨ‡ā¤‚", - "submit": "ā¤œā¤Žā¤ž ⤕⤰āĨ‡ā¤‚" + "submit": "ā¤œā¤Žā¤ž ⤕⤰āĨ‡ā¤‚", + "desc": { + "2": "Place 2 pages side-by-side on a single sheet.", + "3": "Place 3 pages on a single sheet in a single row.", + "4": "Place 4 pages on a single sheet (2 × 2 grid).", + "9": "Place 9 pages on a single sheet (3 × 3 grid).", + "16": "Place 16 pages on a single sheet (4 × 4 grid)." + }, + "error": { + "failed": "An error occurred while creating the multi-page layout." + } + }, + "bookletImposition": { + "tags": "booklet,imposition,printing,binding,folding,signature", + "title": "Booklet Imposition", + "header": "Booklet Imposition", + "submit": "Create Booklet", + "spineLocation": { + "label": "Spine Location", + "left": "Left (Standard)", + "right": "Right (RTL)" + }, + "doubleSided": { + "label": "Double-sided printing", + "tooltip": "Creates both front and back sides for proper booklet printing" + }, + "manualDuplex": { + "title": "Manual Duplex Mode", + "instructions": "For printers without automatic duplex. You'll need to run this twice:" + }, + "duplexPass": { + "label": "Print Pass", + "first": "1st Pass", + "second": "2nd Pass", + "firstInstructions": "Prints front sides → stack face-down → run again with 2nd Pass", + "secondInstructions": "Load printed stack face-down → prints back sides" + }, + "rtlBinding": { + "label": "Right-to-left binding", + "tooltip": "For Arabic, Hebrew, or other right-to-left languages" + }, + "addBorder": { + "label": "Add borders around pages", + "tooltip": "Adds borders around each page section to help with cutting and alignment" + }, + "addGutter": { + "label": "Add gutter margin", + "tooltip": "Adds inner margin space for binding" + }, + "gutterSize": { + "label": "Gutter size (points)" + }, + "flipOnShortEdge": { + "label": "Flip on short edge (automatic duplex only)", + "tooltip": "Enable for short-edge duplex printing (automatic duplex only - ignored in manual mode)", + "manualNote": "Not needed in manual mode - you flip the stack yourself" + }, + "advanced": { + "toggle": "Advanced Options" + }, + "paperSizeNote": "Paper size is automatically derived from your first page.", + "tooltip": { + "header": { + "title": "Booklet Creation Guide" + }, + "description": { + "title": "What is Booklet Imposition?", + "text": "Creates professional booklets by arranging pages in the correct printing order. Your PDF pages are placed 2-up on landscape sheets so when folded and bound, they read in proper sequence like a real book." + }, + "example": { + "title": "Example: 8-Page Booklet", + "text": "Your 8-page document becomes 2 sheets:", + "bullet1": "Sheet 1 Front: Pages 8, 1 | Back: Pages 2, 7", + "bullet2": "Sheet 2 Front: Pages 6, 3 | Back: Pages 4, 5", + "bullet3": "When folded & stacked: Reads 1→2→3→4→5→6→7→8" + }, + "printing": { + "title": "How to Print & Assemble", + "text": "Follow these steps for perfect booklets:", + "bullet1": "Print double-sided with 'Flip on long edge'", + "bullet2": "Stack sheets in order, fold in half", + "bullet3": "Staple or bind along the folded spine", + "bullet4": "For short-edge printers: Enable 'Flip on short edge' option" + }, + "manualDuplex": { + "title": "Manual Duplex (Single-sided Printers)", + "text": "For printers without automatic duplex:", + "bullet1": "Turn OFF 'Double-sided printing'", + "bullet2": "Select '1st Pass' → Print → Stack face-down", + "bullet3": "Select '2nd Pass' → Load stack → Print backs", + "bullet4": "Fold and assemble as normal" + }, + "advanced": { + "title": "Advanced Options", + "text": "Fine-tune your booklet:", + "bullet1": "Right-to-Left Binding: For Arabic, Hebrew, or RTL languages", + "bullet2": "Borders: Shows cut lines for trimming", + "bullet3": "Gutter Margin: Adds space for binding/stapling", + "bullet4": "Short-edge Flip: Only for automatic duplex printers" + } + }, + "error": { + "failed": "An error occurred while creating the booklet imposition." + } }, "scalePages": { - "tags": "ā¤†ā¤•ā¤žā¤° ā¤Ŧā¤Ļ⤞āĨ‡ā¤‚,⤏⤂ā¤ļāĨ‹ā¤§ā¤ŋ⤤ ⤕⤰āĨ‡ā¤‚,ā¤†ā¤¯ā¤žā¤Ž,⤅⤍āĨā¤•āĨ‚⤞ ⤕⤰āĨ‡ā¤‚", "title": "ā¤ĒāĨƒā¤ˇāĨā¤ -⤏āĨā¤•āĨ‡ā¤˛ ā¤¸ā¤Žā¤žā¤¯āĨ‹ā¤œā¤ŋ⤤ ⤕⤰āĨ‡ā¤‚", "header": "ā¤ĒāĨƒā¤ˇāĨā¤ -⤏āĨā¤•āĨ‡ā¤˛ ā¤¸ā¤Žā¤žā¤¯āĨ‹ā¤œā¤ŋ⤤ ⤕⤰āĨ‡ā¤‚", "pageSize": "ā¤Ļ⤏āĨā¤¤ā¤žā¤ĩāĨ‡ā¤œā¤ŧ ⤕āĨ‡ ā¤ā¤• ā¤ĒāĨƒā¤ˇāĨā¤  ā¤•ā¤ž ā¤†ā¤•ā¤žā¤°āĨ¤", "keepPageSize": "ā¤ŽāĨ‚⤞ ā¤†ā¤•ā¤žā¤°", "scaleFactor": "ā¤ā¤• ā¤ĒāĨƒā¤ˇāĨā¤  ā¤•ā¤ž ⤜ā¤ŧāĨ‚ā¤Ž ⤏āĨā¤¤ā¤° (⤕āĨā¤°āĨ‰ā¤Ē)āĨ¤", - "submit": "ā¤œā¤Žā¤ž ⤕⤰āĨ‡ā¤‚" + "submit": "ā¤œā¤Žā¤ž ⤕⤰āĨ‡ā¤‚", + "tags": "ā¤†ā¤•ā¤žā¤° ā¤Ŧā¤Ļ⤞āĨ‡ā¤‚,⤏⤂ā¤ļāĨ‹ā¤§ā¤ŋ⤤ ⤕⤰āĨ‡ā¤‚,ā¤†ā¤¯ā¤žā¤Ž,⤅⤍āĨā¤•āĨ‚⤞ ⤕⤰āĨ‡ā¤‚" + }, + "adjustPageScale": { + "tags": "resize,modify,dimension,adapt", + "title": "Adjust Page Scale", + "header": "Adjust Page Scale", + "scaleFactor": { + "label": "Scale Factor" + }, + "pageSize": { + "label": "Target Page Size", + "keep": "Keep Original Size", + "letter": "Letter", + "legal": "Legal" + }, + "submit": "Adjust Page Scale", + "error": { + "failed": "An error occurred while adjusting the page scale." + }, + "tooltip": { + "header": { + "title": "Page Scale Settings Overview" + }, + "description": { + "title": "Description", + "text": "Adjust the size of PDF content and change the page dimensions." + }, + "scaleFactor": { + "title": "Scale Factor", + "text": "Controls how large or small the content appears on the page. Content is scaled and centred - if scaled content is larger than the page size, it may be cropped.", + "bullet1": "1.0 = Original size", + "bullet2": "0.5 = Half size (50% smaller)", + "bullet3": "2.0 = Double size (200% larger, may crop)" + }, + "pageSize": { + "title": "Target Page Size", + "text": "Sets the dimensions of the output PDF pages. 'Keep Original Size' maintains current dimensions, whilst other options resize to standard paper sizes." + } + } }, "add-page-numbers": { "tags": "ā¤ĒāĨƒā¤ˇāĨā¤ ā¤žā¤‚⤕⤍,⤞āĨ‡ā¤Ŧ⤞,ā¤ĩāĨā¤¯ā¤ĩ⤏āĨā¤Ĩā¤ŋ⤤,⤅⤍āĨā¤•āĨā¤°ā¤Žā¤Ŗā¤ŋā¤•ā¤ž" @@ -1129,16 +2670,83 @@ "tags": "⤏āĨā¤ĩ⤤⤃-ā¤Ēā¤šā¤šā¤žā¤¨,ā¤šāĨ‡ā¤Ąā¤°-ā¤†ā¤§ā¤žā¤°ā¤ŋ⤤,ā¤ĩāĨā¤¯ā¤ĩ⤏āĨā¤Ĩā¤ŋ⤤,ā¤ĒāĨā¤¨ā¤°āĨā¤¨ā¤žā¤Žā¤žā¤‚⤕⤍", "title": "⤏āĨā¤ĩ⤤⤃ ā¤¨ā¤žā¤Ž ā¤Ŧā¤Ļ⤞āĨ‡ā¤‚", "header": "⤏āĨā¤ĩ⤤⤃ PDF ā¤¨ā¤žā¤Ž ā¤Ŧā¤Ļ⤞āĨ‡ā¤‚", - "submit": "⤏āĨā¤ĩ⤤⤃ ā¤¨ā¤žā¤Ž ā¤Ŧā¤Ļ⤞āĨ‡ā¤‚" + "description": "Automatically finds the title from your PDF content and uses it as the filename.", + "submit": "⤏āĨā¤ĩ⤤⤃ ā¤¨ā¤žā¤Ž ā¤Ŧā¤Ļ⤞āĨ‡ā¤‚", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst auto-renaming the PDF." + }, + "results": { + "title": "Auto-Rename Results" + }, + "tooltip": { + "header": { + "title": "How Auto-Rename Works" + }, + "howItWorks": { + "title": "Smart Renaming", + "text": "Automatically finds the title from your PDF content and uses it as the filename.", + "bullet1": "Looks for text that appears to be a title or heading", + "bullet2": "Creates a clean, valid filename from the detected title", + "bullet3": "Keeps the original name if no suitable title is found" + } + } }, "adjust-contrast": { "tags": "⤰⤂⤗-⤏āĨā¤§ā¤žā¤°,⤟āĨā¤¯āĨ‚⤍,⤏⤂ā¤ļāĨ‹ā¤§ā¤ŋ⤤,ā¤Ŧā¤ĸā¤ŧā¤žā¤ā¤‚" }, "crop": { - "tags": "⤟āĨā¤°ā¤ŋā¤Ž,⤏ā¤ŋ⤕āĨ‹ā¤Ąā¤ŧāĨ‡ā¤‚,⤏⤂ā¤Ēā¤žā¤Ļā¤ŋ⤤ ⤕⤰āĨ‡ā¤‚,ā¤†ā¤•ā¤žā¤°", "title": "⤕āĨā¤°āĨ‰ā¤Ē ⤕⤰āĨ‡ā¤‚", "header": "PDF ⤕āĨā¤°āĨ‰ā¤Ē ⤕⤰āĨ‡ā¤‚", - "submit": "ā¤œā¤Žā¤ž ⤕⤰āĨ‡ā¤‚" + "submit": "ā¤œā¤Žā¤ž ⤕⤰āĨ‡ā¤‚", + "noFileSelected": "Select a PDF file to begin cropping", + "preview": { + "title": "Crop Area Selection" + }, + "reset": "Reset to full PDF", + "coordinates": { + "title": "Position and Size", + "x": { + "label": "X Position", + "desc": "Left edge (points)" + }, + "y": { + "label": "Y Position", + "desc": "Bottom edge (points)" + }, + "width": { + "label": "Width", + "desc": "Crop width (points)" + }, + "height": { + "label": "Height", + "desc": "Crop height (points)" + } + }, + "error": { + "invalidArea": "Crop area extends beyond PDF boundaries", + "failed": "Failed to crop PDF" + }, + "steps": { + "selectArea": "Select Crop Area" + }, + "tooltip": { + "title": "How to Crop PDFs", + "description": "Select the area to crop from your PDF by dragging and resizing the blue overlay on the thumbnail.", + "drag": "Drag the overlay to move the crop area", + "resize": "Drag the corner and edge handles to resize", + "precision": "Use coordinate inputs for precise positioning" + }, + "results": { + "title": "Crop Results" + }, + "automation": { + "info": "Enter crop coordinates in PDF points. Origin (0,0) is at bottom-left. These values will be applied to all PDFs processed in this automation.", + "reference": "Reference: A4 page is 595.28 × 841.89 points (210mm × 297mm). 1 inch = 72 points." + }, + "tags": "⤟āĨā¤°ā¤ŋā¤Ž,⤏ā¤ŋ⤕āĨ‹ā¤Ąā¤ŧāĨ‡ā¤‚,⤏⤂ā¤Ēā¤žā¤Ļā¤ŋ⤤ ⤕⤰āĨ‡ā¤‚,ā¤†ā¤•ā¤žā¤°" }, "autoSplitPDF": { "tags": "QR-ā¤†ā¤§ā¤žā¤°ā¤ŋ⤤,⤅⤞⤗ ⤕⤰āĨ‡ā¤‚,⤏āĨā¤•āĨˆā¤¨-ā¤–ā¤‚ā¤Ą,ā¤ĩāĨā¤¯ā¤ĩ⤏āĨā¤Ĩā¤ŋ⤤ ⤕⤰āĨ‡ā¤‚", @@ -1221,24 +2829,124 @@ "downloadJS": "ā¤œā¤žā¤ĩā¤žā¤¸āĨā¤•āĨā¤°ā¤ŋā¤ĒāĨā¤Ÿ ā¤Ąā¤žā¤‰ā¤¨ā¤˛āĨ‹ā¤Ą ⤕⤰āĨ‡ā¤‚", "submit": "ā¤Ļā¤ŋā¤–ā¤žā¤ā¤‚" }, - "autoRedact": { - "tags": "⤗āĨ‹ā¤Ē⤍āĨ€ā¤¯ā¤•⤰⤪,⤛ā¤ŋā¤Ēā¤žā¤ā¤‚,ā¤•ā¤žā¤˛ā¤ž ⤕⤰āĨ‡ā¤‚,ā¤•ā¤žā¤˛ā¤ž,ā¤Žā¤žā¤°āĨā¤•⤰,⤛ā¤ŋā¤Ēā¤ž ā¤šāĨā¤†", - "title": "⤏āĨā¤ĩ⤤⤃ ⤗āĨ‹ā¤Ē⤍āĨ€ā¤¯ā¤•⤰⤪", - "header": "⤏āĨā¤ĩ⤤⤃ ⤗āĨ‹ā¤Ē⤍āĨ€ā¤¯ā¤•⤰⤪", - "colorLabel": "⤰⤂⤗", - "textsToRedactLabel": "⤗āĨ‹ā¤Ē⤍āĨ€ā¤¯ā¤•āĨƒā¤¤ ⤕⤰⤍āĨ‡ ⤕āĨ‡ ⤞ā¤ŋā¤ ⤟āĨ‡ā¤•āĨā¤¸āĨā¤Ÿ (ā¤˛ā¤žā¤‡ā¤¨-⤅⤞⤗)", - "textsToRedactPlaceholder": "⤉ā¤Ļā¤žā¤šā¤°ā¤Ŗ \\n⤗āĨ‹ā¤Ē⤍āĨ€ā¤¯ \\n⤟āĨ‰ā¤Ē-⤏āĨ€ā¤•āĨā¤°āĨ‡ā¤Ÿ", - "useRegexLabel": "⤰āĨ‡ā¤—āĨ‡ā¤•āĨā¤¸ ā¤•ā¤ž ⤉ā¤Ē⤝āĨ‹ā¤— ⤕⤰āĨ‡ā¤‚", - "wholeWordSearchLabel": "ā¤ĒāĨ‚⤰āĨā¤Ŗ ā¤ļā¤ŦāĨā¤Ļ ⤖āĨ‹ā¤œ", - "customPaddingLabel": "⤕⤏āĨā¤Ÿā¤Ž ⤅⤤ā¤ŋ⤰ā¤ŋ⤕āĨā¤¤ ā¤ĒāĨˆā¤Ąā¤ŋ⤂⤗", - "convertPDFToImageLabel": "PDF ⤕āĨ‹ PDF-⤛ā¤ĩā¤ŋ ā¤ŽāĨ‡ā¤‚ ā¤Ŧā¤Ļ⤞āĨ‡ā¤‚ (ā¤ŦāĨ‰ā¤•āĨā¤¸ ⤕āĨ‡ ā¤ĒāĨ€ā¤›āĨ‡ ⤕āĨ‡ ⤟āĨ‡ā¤•āĨā¤¸āĨā¤Ÿ ⤕āĨ‹ ā¤šā¤Ÿā¤žā¤¨āĨ‡ ⤕āĨ‡ ⤞ā¤ŋā¤ ⤉ā¤Ē⤝āĨ‹ā¤— ⤕ā¤ŋā¤¯ā¤ž ā¤œā¤žā¤¤ā¤ž ā¤šāĨˆ)", - "submitButton": "ā¤œā¤Žā¤ž ⤕⤰āĨ‡ā¤‚" - }, "redact": { "tags": "⤗āĨ‹ā¤Ē⤍āĨ€ā¤¯ā¤•⤰⤪,⤛ā¤ŋā¤Ēā¤žā¤ā¤‚,ā¤•ā¤žā¤˛ā¤ž ⤕⤰āĨ‡ā¤‚,ā¤•ā¤žā¤˛ā¤ž,ā¤Žā¤žā¤°āĨā¤•⤰,⤛ā¤ŋā¤Ēā¤ž ā¤šāĨā¤†,ā¤ŽāĨˆā¤¨āĨā¤…⤞", "title": "ā¤ŽāĨˆā¤¨āĨā¤…⤞ ⤗āĨ‹ā¤Ē⤍āĨ€ā¤¯ā¤•⤰⤪", - "header": "ā¤ŽāĨˆā¤¨āĨā¤…⤞ ⤗āĨ‹ā¤Ē⤍āĨ€ā¤¯ā¤•⤰⤪", "submit": "⤗āĨ‹ā¤Ē⤍āĨ€ā¤¯ā¤•āĨƒā¤¤ ⤕⤰āĨ‡ā¤‚", + "error": { + "failed": "An error occurred while redacting the PDF." + }, + "modeSelector": { + "title": "Redaction Method", + "mode": "Mode", + "automatic": "Automatic", + "automaticDesc": "Redact text based on search terms", + "manual": "Manual", + "manualDesc": "Click and drag to redact specific areas", + "manualComingSoon": "Manual redaction coming soon" + }, + "auto": { + "header": "Auto Redact", + "settings": { + "title": "Redaction Settings", + "advancedTitle": "⤉⤍āĨā¤¨ā¤¤" + }, + "colorLabel": "Box Colour", + "wordsToRedact": { + "title": "Words to Redact", + "placeholder": "Enter a word", + "add": "⤜āĨ‹ā¤Ąā¤ŧāĨ‡ā¤‚", + "examples": "Examples: Confidential, Top-Secret" + }, + "useRegexLabel": "Use Regex", + "wholeWordSearchLabel": "Whole Word Search", + "customPaddingLabel": "Custom Extra Padding", + "convertPDFToImageLabel": "Convert PDF to PDF-Image" + }, + "tooltip": { + "mode": { + "header": { + "title": "Redaction Method" + }, + "automatic": { + "title": "Automatic Redaction", + "text": "Automatically finds and redacts specified text throughout the document. Perfect for removing consistent sensitive information like names, addresses, or confidential markers." + }, + "manual": { + "title": "Manual Redaction", + "text": "Click and drag to manually select specific areas to redact. Gives you precise control over what gets redacted. (Coming soon)" + } + }, + "words": { + "header": { + "title": "Words to Redact" + }, + "description": { + "title": "Text Matching", + "text": "Enter words or phrases to find and redact in your document. Each word will be searched for separately." + }, + "bullet1": "Add one word at a time", + "bullet2": "Press Enter or click 'Add Another' to add", + "bullet3": "Click × to remove words", + "examples": { + "title": "Common Examples", + "text": "Typical words to redact include: bank details, email addresses, or specific names." + } + }, + "advanced": { + "header": { + "title": "Advanced Redaction Settings" + }, + "color": { + "title": "Box Colour & Padding", + "text": "Customise the appearance of redaction boxes. Black is standard, but you can choose any colour. Padding adds extra space around the found text." + }, + "regex": { + "title": "Use Regex", + "text": "Enable regular expressions for advanced pattern matching. Useful for finding phone numbers, emails, or complex patterns.", + "bullet1": "Example: \\d{4}-\\d{2}-\\d{2} to match any dates in YYYY-MM-DD format", + "bullet2": "Use with caution - test thoroughly" + }, + "wholeWord": { + "title": "Whole Word Search", + "text": "Only match complete words, not partial matches. 'John' won't match 'Johnson' when enabled." + }, + "convert": { + "title": "Convert to PDF-Image", + "text": "Converts the PDF to an image-based PDF after redaction. This ensures text behind redaction boxes is completely removed and unrecoverable." + } + } + }, + "manual": { + "header": "Manual Redaction", + "textBasedRedaction": "Text-based Redaction", + "pageBasedRedaction": "Page-based Redaction", + "convertPDFToImageLabel": "Convert PDF to PDF-Image (Used to remove text behind the box)", + "pageRedactionNumbers": { + "title": "ā¤ĒāĨƒā¤ˇāĨā¤ ", + "placeholder": "(⤜āĨˆā¤¸āĨ‡ 1,2,8 ā¤¯ā¤ž 4,7,12-16 ā¤¯ā¤ž 2n-1)" + }, + "redactionColor": { + "title": "Redaction Colour" + }, + "export": "⤍ā¤ŋ⤰āĨā¤¯ā¤žā¤¤ ⤕⤰āĨ‡ā¤‚", + "upload": "Upload", + "boxRedaction": "Box draw redaction", + "zoom": "Zoom", + "zoomIn": "Zoom in", + "zoomOut": "Zoom out", + "nextPage": "Next Page", + "previousPage": "Previous Page", + "toggleSidebar": "Toggle Sidebar", + "showThumbnails": "Show Thumbnails", + "showDocumentOutline": "Show Document Outline (double-click to expand/collapse all items)", + "showAttachments": "Show Attachments", + "showLayers": "Show Layers (double-click to reset all layers to the default state)", + "colourPicker": "Colour Picker", + "findCurrentOutlineItem": "Find current outline item", + "applyChanges": "Apply Changes" + }, + "header": "ā¤ŽāĨˆā¤¨āĨā¤…⤞ ⤗āĨ‹ā¤Ē⤍āĨ€ā¤¯ā¤•⤰⤪", "textBasedRedaction": "⤟āĨ‡ā¤•āĨā¤¸āĨā¤Ÿ ā¤†ā¤§ā¤žā¤°ā¤ŋ⤤ ⤗āĨ‹ā¤Ē⤍āĨ€ā¤¯ā¤•⤰⤪", "pageBasedRedaction": "ā¤ĒāĨƒā¤ˇāĨā¤ -ā¤†ā¤§ā¤žā¤°ā¤ŋ⤤ ⤗āĨ‹ā¤Ē⤍āĨ€ā¤¯ā¤•⤰⤪", "convertPDFToImageLabel": "PDF ⤕āĨ‹ PDF-⤛ā¤ĩā¤ŋ ā¤ŽāĨ‡ā¤‚ ā¤Ŧā¤Ļ⤞āĨ‡ā¤‚ (ā¤ŦāĨ‰ā¤•āĨā¤¸ ⤕āĨ‡ ā¤ĒāĨ€ā¤›āĨ‡ ā¤•ā¤ž ⤟āĨ‡ā¤•āĨā¤¸āĨā¤Ÿ ā¤šā¤Ÿā¤žā¤¨āĨ‡ ⤕āĨ‡ ⤞ā¤ŋā¤ ⤉ā¤Ē⤝āĨ‹ā¤— ⤕ā¤ŋā¤¯ā¤ž ā¤œā¤žā¤¤ā¤ž ā¤šāĨˆ)", @@ -1264,22 +2972,7 @@ "showLayers": "⤞āĨ‡ā¤¯ā¤°āĨā¤¸ ā¤Ļā¤ŋā¤–ā¤žā¤ā¤‚ (⤏⤭āĨ€ ⤞āĨ‡ā¤¯ā¤°āĨā¤¸ ⤕āĨ‹ ā¤Ąā¤ŋā¤Ģā¤ŧāĨ‰ā¤˛āĨā¤Ÿ ⤏āĨā¤Ĩā¤ŋ⤤ā¤ŋ ā¤ŽāĨ‡ā¤‚ ⤰āĨ€ā¤¸āĨ‡ā¤Ÿ ⤕⤰⤍āĨ‡ ⤕āĨ‡ ⤞ā¤ŋā¤ ā¤Ąā¤Ŧ⤞-⤕āĨā¤˛ā¤ŋ⤕ ⤕⤰āĨ‡ā¤‚)", "colourPicker": "⤰⤂⤗ ā¤šā¤¯ā¤¨ā¤•ā¤°āĨā¤¤ā¤ž", "findCurrentOutlineItem": "ā¤ĩ⤰āĨā¤¤ā¤Žā¤žā¤¨ ā¤†ā¤‰ā¤Ÿā¤˛ā¤žā¤‡ā¤¨ ā¤†ā¤‡ā¤Ÿā¤Ž ⤖āĨ‹ā¤œāĨ‡ā¤‚", - "applyChanges": "Apply Changes", - "auto": { - "settings": { - "advancedTitle": "⤉⤍āĨā¤¨ā¤¤" - }, - "wordsToRedact": { - "add": "⤜āĨ‹ā¤Ąā¤ŧāĨ‡ā¤‚" - } - }, - "manual": { - "pageRedactionNumbers": { - "title": "ā¤ĒāĨƒā¤ˇāĨā¤ ", - "placeholder": "(⤜āĨˆā¤¸āĨ‡ 1,2,8 ā¤¯ā¤ž 4,7,12-16 ā¤¯ā¤ž 2n-1)" - }, - "export": "⤍ā¤ŋ⤰āĨā¤¯ā¤žā¤¤ ⤕⤰āĨ‡ā¤‚" - } + "applyChanges": "Apply Changes" }, "tableExtraxt": { "tags": "CSV,ā¤¤ā¤žā¤˛ā¤ŋā¤•ā¤ž ⤍ā¤ŋ⤎āĨā¤•⤰āĨā¤ˇā¤Ŗ,⤍ā¤ŋā¤•ā¤žā¤˛āĨ‡ā¤‚,ā¤Ŧā¤Ļ⤞āĨ‡ā¤‚" @@ -1290,11 +2983,15 @@ "overlay-pdfs": { "tags": "⤓ā¤ĩ⤰⤞āĨ‡", "header": "PDF ā¤Ģā¤ŧā¤žā¤‡ā¤˛āĨ‡ā¤‚ ⤓ā¤ĩ⤰⤞āĨ‡ ⤕⤰āĨ‡ā¤‚", + "title": "Overlay PDFs", + "desc": "Overlay one PDF on top of another", "baseFile": { "label": "ā¤ŦāĨ‡ā¤¸ PDF ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ⤚āĨā¤¨āĨ‡ā¤‚" }, "overlayFiles": { - "label": "⤓ā¤ĩ⤰⤞āĨ‡ PDF ā¤Ģā¤ŧā¤žā¤‡ā¤˛āĨ‡ā¤‚ ⤚āĨā¤¨āĨ‡ā¤‚" + "label": "⤓ā¤ĩ⤰⤞āĨ‡ PDF ā¤Ģā¤ŧā¤žā¤‡ā¤˛āĨ‡ā¤‚ ⤚āĨā¤¨āĨ‡ā¤‚", + "placeholder": "Choose PDF(s)...", + "addMore": "Add more PDFs..." }, "mode": { "label": "⤓ā¤ĩ⤰⤞āĨ‡ ā¤ŽāĨ‹ā¤Ą ⤚āĨā¤¨āĨ‡ā¤‚", @@ -1304,14 +3001,53 @@ }, "counts": { "label": "⤓ā¤ĩ⤰⤞āĨ‡ ⤗ā¤ŋ⤍⤤āĨ€ (⤍ā¤ŋā¤ļāĨā¤šā¤ŋ⤤ ā¤ĻāĨ‹ā¤šā¤°ā¤žā¤ĩ ā¤ŽāĨ‹ā¤Ą ⤕āĨ‡ ⤞ā¤ŋā¤)", - "placeholder": "⤅⤞āĨā¤Ēā¤ĩā¤ŋā¤°ā¤žā¤Ž ⤏āĨ‡ ⤅⤞⤗ ⤗ā¤ŋ⤍⤤āĨ€ ā¤Ļ⤰āĨā¤œ ⤕⤰āĨ‡ā¤‚ (⤜āĨˆā¤¸āĨ‡ 2,3,1)" + "placeholder": "⤅⤞āĨā¤Ēā¤ĩā¤ŋā¤°ā¤žā¤Ž ⤏āĨ‡ ⤅⤞⤗ ⤗ā¤ŋ⤍⤤āĨ€ ā¤Ļ⤰āĨā¤œ ⤕⤰āĨ‡ā¤‚ (⤜āĨˆā¤¸āĨ‡ 2,3,1)", + "item": "Count for file", + "noFiles": "Add overlay files to configure counts" }, "position": { "label": "⤓ā¤ĩ⤰⤞āĨ‡ ⤏āĨā¤Ĩā¤ŋ⤤ā¤ŋ ⤚āĨā¤¨āĨ‡ā¤‚", "foreground": "⤅⤗āĨā¤°ā¤­āĨ‚ā¤Žā¤ŋ", "background": "ā¤ĒāĨƒā¤ˇāĨā¤ ā¤­āĨ‚ā¤Žā¤ŋ" }, - "submit": "ā¤œā¤Žā¤ž ⤕⤰āĨ‡ā¤‚" + "submit": "ā¤œā¤Žā¤ž ⤕⤰āĨ‡ā¤‚", + "settings": { + "title": "Settings" + }, + "results": { + "title": "Overlay Results" + }, + "tooltip": { + "header": { + "title": "Overlay PDFs Overview" + }, + "description": { + "title": "Description", + "text": "Combine a base PDF with one or more overlay PDFs. Overlays can be applied page-by-page in different modes and placed in the foreground or background." + }, + "mode": { + "title": "Overlay Mode", + "text": "Choose how to distribute overlay pages across the base PDF pages.", + "sequential": "Sequential Overlay: Use pages from the first overlay PDF until it ends, then move to the next.", + "interleaved": "Interleaved Overlay: Take one page from each overlay in turn.", + "fixedRepeat": "Fixed Repeat Overlay: Take a set number of pages from each overlay before moving to the next. Use Counts to set the numbers." + }, + "position": { + "title": "Overlay Position", + "text": "Foreground places the overlay on top of the page. Background places it behind." + }, + "overlayFiles": { + "title": "Overlay Files", + "text": "Select one or more PDFs to overlay on the base. The order of these files affects how pages are applied in Sequential and Fixed Repeat modes." + }, + "counts": { + "title": "Counts (Fixed Repeat only)", + "text": "Provide a positive number for each overlay file showing how many pages to take before moving to the next. Required when mode is Fixed Repeat." + } + }, + "error": { + "failed": "An error occurred while overlaying PDFs." + } }, "split-by-sections": { "tags": "ā¤–ā¤‚ā¤Ą ā¤ĩā¤ŋā¤­ā¤žā¤œā¤¨, ā¤ĩā¤ŋā¤­ā¤žā¤œā¤ŋ⤤ ⤕⤰āĨ‡ā¤‚, ⤅⤍āĨā¤•āĨ‚⤞ā¤ŋ⤤", @@ -1332,6 +3068,7 @@ "tags": "⤏āĨā¤ŸāĨˆā¤ŽāĨā¤Ē, ⤛ā¤ĩā¤ŋ ⤜āĨ‹ā¤Ąā¤ŧāĨ‡ā¤‚, ⤕āĨ‡ā¤‚ā¤ĻāĨā¤° ⤛ā¤ĩā¤ŋ, ā¤ĩāĨ‰ā¤Ÿā¤°ā¤Žā¤žā¤°āĨā¤•, PDF, ā¤ā¤ŽāĨā¤ŦāĨ‡ā¤Ą, ⤅⤍āĨā¤•āĨ‚⤞ā¤ŋ⤤", "header": "PDF ⤏āĨā¤ŸāĨˆā¤ŽāĨā¤Ē ⤕⤰āĨ‡ā¤‚", "title": "PDF ⤏āĨā¤ŸāĨˆā¤ŽāĨā¤Ē ⤕⤰āĨ‡ā¤‚", + "stampSetup": "Stamp Setup", "stampType": "⤏āĨā¤ŸāĨˆā¤ŽāĨā¤Ē ā¤ĒāĨā¤°ā¤•ā¤žā¤°", "stampText": "⤏āĨā¤ŸāĨˆā¤ŽāĨā¤Ē ⤟āĨ‡ā¤•āĨā¤¸āĨā¤Ÿ", "stampImage": "⤏āĨā¤ŸāĨˆā¤ŽāĨā¤Ē ⤛ā¤ĩā¤ŋ", @@ -1344,7 +3081,19 @@ "overrideY": "Y ⤍ā¤ŋ⤰āĨā¤ĻāĨ‡ā¤ļā¤žā¤‚ā¤• ⤓ā¤ĩā¤°ā¤°ā¤žā¤‡ā¤Ą ⤕⤰āĨ‡ā¤‚", "customMargin": "⤕⤏āĨā¤Ÿā¤Ž ā¤Žā¤žā¤°āĨā¤œā¤ŋ⤍", "customColor": "⤕⤏āĨā¤Ÿā¤Ž ⤟āĨ‡ā¤•āĨā¤¸āĨā¤Ÿ ⤰⤂⤗", - "submit": "ā¤œā¤Žā¤ž ⤕⤰āĨ‡ā¤‚" + "submit": "ā¤œā¤Žā¤ž ⤕⤰āĨ‡ā¤‚", + "noStampSelected": "No stamp selected. Return to Step 1.", + "customPosition": "Drag the stamp to the desired location in the preview window.", + "error": { + "failed": "An error occurred while adding stamp to the PDF." + }, + "imageSize": "Image Size", + "margin": "Margin", + "positionAndFormatting": "Position & Formatting", + "quickPosition": "Select a position on the page to place the stamp.", + "results": { + "title": "Stamp Results" + } }, "removeImagePdf": { "tags": "⤛ā¤ĩā¤ŋ ā¤šā¤Ÿā¤žā¤ā¤‚,ā¤ĒāĨƒā¤ˇāĨā¤  ā¤•ā¤žā¤°āĨā¤¯,ā¤ŦāĨˆā¤• ā¤ā¤‚ā¤Ą,⤏⤰āĨā¤ĩ⤰ ā¤¸ā¤žā¤‡ā¤Ą" @@ -1362,7 +3111,8 @@ "status": { "_value": "⤏āĨā¤Ĩā¤ŋ⤤ā¤ŋ", "valid": "ā¤Žā¤žā¤¨āĨā¤¯", - "invalid": "ā¤…ā¤Žā¤žā¤¨āĨā¤¯" + "invalid": "ā¤…ā¤Žā¤žā¤¨āĨā¤¯", + "complete": "Validation complete" }, "signer": "ā¤šā¤¸āĨā¤¤ā¤žā¤•āĨā¤ˇā¤°ā¤•⤰āĨā¤¤ā¤ž", "date": "⤤ā¤ŋā¤Ĩā¤ŋ", @@ -1389,40 +3139,122 @@ "version": "⤏⤂⤏āĨā¤•⤰⤪", "keyUsage": "⤕āĨā¤‚ā¤œāĨ€ ⤉ā¤Ē⤝āĨ‹ā¤—", "selfSigned": "⤏āĨā¤ĩ-ā¤šā¤¸āĨā¤¤ā¤žā¤•āĨā¤ˇā¤°ā¤ŋ⤤", - "bits": "ā¤Ŧā¤ŋ⤟āĨā¤¸" + "bits": "ā¤Ŧā¤ŋ⤟āĨā¤¸", + "details": "Certificate Details" }, "signature": { "info": "ā¤šā¤¸āĨā¤¤ā¤žā¤•āĨā¤ˇā¤° ā¤œā¤žā¤¨ā¤•ā¤žā¤°āĨ€", "_value": "ā¤šā¤¸āĨā¤¤ā¤žā¤•āĨā¤ˇā¤°", "mathValid": "ā¤šā¤¸āĨā¤¤ā¤žā¤•āĨā¤ˇā¤° ⤗⤪ā¤ŋ⤤āĨ€ā¤¯ ⤰āĨ‚ā¤Ē ⤏āĨ‡ ā¤Žā¤žā¤¨āĨā¤¯ ā¤šāĨˆ ⤞āĨ‡ā¤•ā¤ŋ⤍:" }, - "selectCustomCert": "⤕⤏āĨā¤Ÿā¤Ž ā¤ĒāĨā¤°ā¤Žā¤žā¤Ŗā¤Ē⤤āĨā¤° ā¤Ģā¤ŧā¤žā¤‡ā¤˛ X.509 (ā¤ĩāĨˆā¤•⤞āĨā¤Ēā¤ŋ⤕)" - }, - "replace-color": { - "title": "⤰⤂⤗ ā¤Ŧā¤Ļ⤞āĨ‡ā¤‚-⤉⤞āĨā¤Ÿā¤ž ⤕⤰āĨ‡ā¤‚", - "header": "⤰⤂⤗ ā¤Ŧā¤Ļ⤞āĨ‡ā¤‚-⤉⤞āĨā¤Ÿā¤ž ⤕⤰āĨ‡ā¤‚ PDF", - "selectText": { - "1": "⤰⤂⤗ ā¤Ŧā¤Ļ⤞āĨ‡ā¤‚ ā¤¯ā¤ž ⤉⤞āĨā¤Ÿā¤ž ⤕⤰āĨ‡ā¤‚ ā¤ĩā¤ŋ⤕⤞āĨā¤Ē", - "2": "ā¤Ąā¤ŋā¤Ģā¤ŧāĨ‰ā¤˛āĨā¤Ÿ (ā¤Ąā¤ŋā¤Ģā¤ŧāĨ‰ā¤˛āĨā¤Ÿ ā¤‰ā¤šāĨā¤š ā¤•ā¤‚ā¤ŸāĨā¤°ā¤žā¤¸āĨā¤Ÿ ⤰⤂⤗)", - "3": "⤕⤏āĨā¤Ÿā¤Ž (⤅⤍āĨā¤•āĨ‚⤞ā¤ŋ⤤ ⤰⤂⤗)", - "4": "ā¤ĒāĨ‚⤰āĨā¤Ŗ-⤉⤞āĨā¤Ÿā¤ž (⤏⤭āĨ€ ⤰⤂⤗āĨ‹ā¤‚ ⤕āĨ‹ ⤉⤞āĨā¤Ÿā¤ž ⤕⤰āĨ‡ā¤‚)", - "5": "ā¤‰ā¤šāĨā¤š ā¤•ā¤‚ā¤ŸāĨā¤°ā¤žā¤¸āĨā¤Ÿ ⤰⤂⤗ ā¤ĩā¤ŋ⤕⤞āĨā¤Ē", - "6": "ā¤•ā¤žā¤˛āĨ€ ā¤ĒāĨƒā¤ˇāĨā¤ ā¤­āĨ‚ā¤Žā¤ŋ ā¤Ē⤰ ⤏ā¤ĢāĨ‡ā¤Ļ ⤟āĨ‡ā¤•āĨā¤¸āĨā¤Ÿ", - "7": "⤏ā¤ĢāĨ‡ā¤Ļ ā¤ĒāĨƒā¤ˇāĨā¤ ā¤­āĨ‚ā¤Žā¤ŋ ā¤Ē⤰ ā¤•ā¤žā¤˛ā¤ž ⤟āĨ‡ā¤•āĨā¤¸āĨā¤Ÿ", - "8": "ā¤•ā¤žā¤˛āĨ€ ā¤ĒāĨƒā¤ˇāĨā¤ ā¤­āĨ‚ā¤Žā¤ŋ ā¤Ē⤰ ā¤ĒāĨ€ā¤˛ā¤ž ⤟āĨ‡ā¤•āĨā¤¸āĨā¤Ÿ", - "9": "ā¤•ā¤žā¤˛āĨ€ ā¤ĒāĨƒā¤ˇāĨā¤ ā¤­āĨ‚ā¤Žā¤ŋ ā¤Ē⤰ ā¤šā¤°ā¤ž ⤟āĨ‡ā¤•āĨā¤¸āĨā¤Ÿ", - "10": "⤟āĨ‡ā¤•āĨā¤¸āĨā¤Ÿ ⤰⤂⤗ ⤚āĨā¤¨āĨ‡ā¤‚", - "11": "ā¤ĒāĨƒā¤ˇāĨā¤ ā¤­āĨ‚ā¤Žā¤ŋ ⤰⤂⤗ ⤚āĨā¤¨āĨ‡ā¤‚" + "selectCustomCert": "⤕⤏āĨā¤Ÿā¤Ž ā¤ĒāĨā¤°ā¤Žā¤žā¤Ŗā¤Ē⤤āĨā¤° ā¤Ģā¤ŧā¤žā¤‡ā¤˛ X.509 (ā¤ĩāĨˆā¤•⤞āĨā¤Ēā¤ŋ⤕)", + "downloadCsv": "Download CSV", + "downloadJson": "Download JSON", + "downloadPdf": "Download PDF Report", + "downloadType": { + "csv": "CSV", + "json": "JSON", + "pdf": "PDF" }, - "submit": "ā¤Ŧā¤Ļ⤞āĨ‡ā¤‚" + "error": { + "allFailed": "Unable to validate the selected files.", + "partial": "Some files could not be validated.", + "reportGeneration": "Could not generate the PDF report. JSON and CSV are available.", + "unexpected": "Unexpected error during validation." + }, + "finalizing": "Preparing downloads...", + "issue": { + "certExpired": "Certificate expired", + "certRevocationUnknown": "Certificate revocation status unknown", + "certRevoked": "Certificate revoked", + "chainInvalid": "Certificate chain invalid", + "signatureInvalid": "Signature cryptographic check failed", + "trustInvalid": "Certificate not trusted" + }, + "noResults": "Run the validation to generate a report.", + "noSignaturesShort": "No signatures", + "processing": "Validating signatures...", + "report": { + "continued": "Continued", + "downloads": "Downloads", + "entryLabel": "Signature Summary", + "fields": { + "created": "Created", + "fileSize": "File Size", + "signatureCount": "Total Signatures", + "signatureDate": "Signature Date" + }, + "filesEvaluated": "{{count}} files evaluated", + "footer": "Validated via Stirling PDF", + "generatedAt": "Generated", + "noPdf": "PDF report will be available after a successful validation.", + "page": "Page", + "shortTitle": "Signature Summary", + "signatureCountLabel": "{{count}} signatures", + "signaturesFound": "{{count}} signatures detected", + "signaturesValid": "{{count}} fully valid", + "title": "Signature Validation Report" + }, + "settings": { + "certHint": "Upload a trusted X.509 certificate to validate against a custom trust source.", + "title": "Validation Settings" + }, + "signatureDate": "Signature Date", + "totalSignatures": "Total Signatures" }, - "replaceColorPdf": { - "tags": "⤰⤂⤗ ā¤Ŧā¤Ļ⤞āĨ‡ā¤‚,ā¤ĒāĨƒā¤ˇāĨā¤  ā¤•ā¤žā¤°āĨā¤¯,ā¤ŦāĨˆā¤• ā¤ā¤‚ā¤Ą,⤏⤰āĨā¤ĩ⤰ ā¤¸ā¤žā¤‡ā¤Ą" + "replaceColor": { + "tags": "Replace Colour,Page operations,Back end,server side", + "labels": { + "settings": "Settings", + "colourOperation": "Colour operation" + }, + "options": { + "highContrast": "High contrast", + "invertAll": "Invert all colours", + "custom": "Custom", + "cmyk": "Convert to CMYK" + }, + "tooltip": { + "header": { + "title": "Replace & Invert Colour Settings Overview" + }, + "description": { + "title": "Description", + "text": "Transform PDF colours to improve readability and accessibility. Choose from high contrast presets, invert all colours, or create custom colour schemes." + }, + "highContrast": { + "title": "High Contrast", + "text": "Apply predefined high contrast colour combinations designed for better readability and accessibility compliance.", + "bullet1": "White text on black background - Classic dark mode", + "bullet2": "Black text on white background - Standard high contrast", + "bullet3": "Yellow text on black background - High visibility option", + "bullet4": "Green text on black background - Alternative high contrast" + }, + "invertAll": { + "title": "Invert All Colours", + "text": "Completely invert all colours in the PDF, creating a negative-like effect. Useful for creating dark mode versions of documents or reducing eye strain in low-light conditions." + }, + "custom": { + "title": "Custom Colours", + "text": "Define your own text and background colours using the colour pickers. Perfect for creating branded documents or specific accessibility requirements.", + "bullet1": "Text colour - Choose the colour for text elements", + "bullet2": "Background colour - Set the background colour for the document" + }, + "cmyk": { + "title": "Convert to CMYK", + "text": "Convert the PDF from RGB colour space to CMYK colour space, optimized for professional printing. This process converts colours to the Cyan, Magenta, Yellow, Black model used by printers." + } + }, + "error": { + "failed": "An error occurred while processing the colour replacement." + } }, "login": { "title": "ā¤¸ā¤žā¤‡ā¤¨ ⤇⤍ ⤕⤰āĨ‡ā¤‚", "header": "ā¤¸ā¤žā¤‡ā¤¨ ⤇⤍ ⤕⤰āĨ‡ā¤‚", "signin": "ā¤¸ā¤žā¤‡ā¤¨ ⤇⤍ ⤕⤰āĨ‡ā¤‚", + "signInWith": "Sign in with", + "signInAnonymously": "Sign Up as a Guest", "rememberme": "ā¤ŽāĨā¤āĨ‡ ā¤¯ā¤žā¤Ļ ⤰⤖āĨ‡ā¤‚", "invalid": "ā¤…ā¤Žā¤žā¤¨āĨā¤¯ ⤉ā¤Ē⤝āĨ‹ā¤—⤕⤰āĨā¤¤ā¤ž ā¤¨ā¤žā¤Ž ā¤¯ā¤ž ā¤Ēā¤žā¤¸ā¤ĩ⤰āĨā¤ĄāĨ¤", "locked": "⤆ā¤Ēā¤•ā¤ž ā¤–ā¤žā¤¤ā¤ž ⤞āĨ‰ā¤• ⤕⤰ ā¤Ļā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤šāĨˆāĨ¤", @@ -1441,12 +3273,83 @@ "alreadyLoggedIn": "⤆ā¤Ē ā¤Ēā¤šā¤˛āĨ‡ ⤏āĨ‡ ā¤šāĨ€", "alreadyLoggedIn2": "⤉ā¤Ē⤕⤰⤪āĨ‹ā¤‚ ā¤ŽāĨ‡ā¤‚ ⤞āĨ‰ā¤— ⤇⤍ ā¤šāĨˆā¤‚āĨ¤ ⤕āĨƒā¤Ēā¤¯ā¤ž ⤉ā¤Ē⤕⤰⤪āĨ‹ā¤‚ ⤏āĨ‡ ⤞āĨ‰ā¤— ā¤†ā¤‰ā¤Ÿ ⤕⤰āĨ‡ā¤‚ ⤔⤰ ā¤ĒāĨā¤¨ā¤ƒ ā¤ĒāĨā¤°ā¤¯ā¤žā¤¸ ⤕⤰āĨ‡ā¤‚āĨ¤", "toManySessions": "⤆ā¤Ē⤕āĨ‡ ā¤Ŧā¤šāĨā¤¤ ā¤¸ā¤žā¤°āĨ‡ ⤏⤕āĨā¤°ā¤ŋ⤝ ⤏⤤āĨā¤° ā¤šāĨˆā¤‚", - "logoutMessage": "You have been logged out." + "logoutMessage": "You have been logged out.", + "youAreLoggedIn": "You are logged in!", + "email": "Email", + "password": "Password", + "enterEmail": "Enter your email", + "enterPassword": "Enter your password", + "loggingIn": "Logging In...", + "username": "Username", + "enterUsername": "Enter username", + "useEmailInstead": "Login with email", + "forgotPassword": "Forgot your password?", + "logIn": "Log In", + "signingIn": "Signing in...", + "login": "Login", + "or": "Or", + "useMagicLink": "Use magic link instead", + "enterEmailForMagicLink": "Enter your email for magic link", + "sending": "Sendingâ€Ļ", + "sendMagicLink": "Send Magic Link", + "cancel": "Cancel", + "dontHaveAccount": "Don't have an account? Sign up", + "home": "Home", + "debug": "Debug", + "signOut": "Sign Out", + "pleaseEnterBoth": "Please enter both email and password", + "pleaseEnterEmail": "Please enter your email address", + "magicLinkSent": "Magic link sent to {{email}}! Check your email and click the link to sign in.", + "passwordResetSent": "Password reset link sent to {{email}}! Check your email and follow the instructions.", + "failedToSignIn": "Failed to sign in with {{provider}}: {{message}}", + "unexpectedError": "Unexpected error: {{message}}", + "accountCreatedSuccess": "Account created successfully! You can now sign in.", + "passwordChangedSuccess": "Password changed successfully! Please sign in with your new password.", + "credentialsUpdated": "Your credentials have been updated. Please sign in again." + }, + "signup": { + "title": "Create an account", + "subtitle": "Join Stirling PDF to get started", + "name": "Name", + "email": "Email", + "password": "Password", + "confirmPassword": "Confirm password", + "enterName": "Enter your name", + "enterEmail": "Enter your email", + "enterPassword": "Enter your password", + "confirmPasswordPlaceholder": "Confirm password", + "or": "or", + "creatingAccount": "Creating Account...", + "signUp": "Sign Up", + "alreadyHaveAccount": "Already have an account? Sign in", + "pleaseFillAllFields": "Please fill in all fields", + "passwordsDoNotMatch": "Passwords do not match", + "passwordTooShort": "Password must be at least 6 characters long", + "invalidEmail": "Please enter a valid email address", + "checkEmailConfirmation": "Check your email for a confirmation link to complete your registration.", + "accountCreatedSuccessfully": "Account created successfully! You can now sign in.", + "unexpectedError": "Unexpected error: {{message}}", + "useEmailInstead": "Use Email Instead", + "nameRequired": "Name is required", + "emailRequired": "Email is required", + "passwordRequired": "Password is required", + "confirmPasswordRequired": "Please confirm your password" }, "pdfToSinglePage": { "title": "PDF ⤕āĨ‹ ā¤ā¤•ā¤˛ ā¤ĒāĨƒā¤ˇāĨā¤  ā¤ŽāĨ‡ā¤‚", "header": "PDF ⤕āĨ‹ ā¤ā¤•ā¤˛ ā¤ĒāĨƒā¤ˇāĨā¤  ā¤ŽāĨ‡ā¤‚", - "submit": "ā¤ā¤•ā¤˛ ā¤ĒāĨƒā¤ˇāĨā¤  ā¤ŽāĨ‡ā¤‚ ā¤Ŧā¤Ļ⤞āĨ‡ā¤‚" + "submit": "ā¤ā¤•ā¤˛ ā¤ĒāĨƒā¤ˇāĨā¤  ā¤ŽāĨ‡ā¤‚ ā¤Ŧā¤Ļ⤞āĨ‡ā¤‚", + "description": "This tool will merge all pages of your PDF into one large single page. The width will remain the same as the original pages, but the height will be the sum of all page heights.", + "filenamePrefix": "single_page", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst converting to single page." + }, + "results": { + "title": "Single Page Results" + } }, "pageExtracter": { "title": "ā¤ĒāĨƒā¤ˇāĨā¤  ⤍ā¤ŋā¤•ā¤žā¤˛āĨ‡ā¤‚", @@ -1470,18 +3373,59 @@ "adjustContrast": { "title": "ā¤•ā¤‚ā¤ŸāĨā¤°ā¤žā¤¸āĨā¤Ÿ ā¤¸ā¤Žā¤žā¤¯āĨ‹ā¤œā¤ŋ⤤ ⤕⤰āĨ‡ā¤‚", "header": "ā¤•ā¤‚ā¤ŸāĨā¤°ā¤žā¤¸āĨā¤Ÿ ā¤¸ā¤Žā¤žā¤¯āĨ‹ā¤œā¤ŋ⤤ ⤕⤰āĨ‡ā¤‚", + "basic": "Basic Adjustments", "contrast": "ā¤•ā¤‚ā¤ŸāĨā¤°ā¤žā¤¸āĨā¤Ÿ:", "brightness": "ā¤šā¤Žā¤•:", "saturation": "⤏⤂⤤āĨƒā¤ĒāĨā¤¤ā¤ŋ:", - "download": "ā¤Ąā¤žā¤‰ā¤¨ā¤˛āĨ‹ā¤Ą ⤕⤰āĨ‡ā¤‚" + "download": "ā¤Ąā¤žā¤‰ā¤¨ā¤˛āĨ‹ā¤Ą ⤕⤰āĨ‡ā¤‚", + "adjustColors": "Adjust Colors", + "blue": "Blue", + "confirm": "Confirm", + "error": { + "failed": "Failed to adjust colors/contrast" + }, + "green": "Green", + "noPreview": "Select a PDF to preview", + "red": "Red", + "results": { + "title": "Adjusted PDF" + } }, "compress": { "title": "ā¤•ā¤ŽāĨā¤ĒāĨā¤°āĨ‡ā¤¸", + "desc": "Compress PDFs to reduce their file size.", "header": "PDF ā¤•ā¤ŽāĨā¤ĒāĨā¤°āĨ‡ā¤¸ ⤕⤰āĨ‡ā¤‚", + "method": { + "title": "Compression Method", + "quality": "Quality", + "filesize": "ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤†ā¤•ā¤žā¤°" + }, "credit": "ā¤¯ā¤š ⤏āĨ‡ā¤ĩā¤ž PDF ā¤•ā¤ŽāĨā¤ĒāĨā¤°āĨ‡ā¤¸/⤅⤍āĨā¤•āĨ‚⤞⤍ ⤕āĨ‡ ⤞ā¤ŋā¤ qpdf ā¤•ā¤ž ⤉ā¤Ē⤝āĨ‹ā¤— ⤕⤰⤤āĨ€ ā¤šāĨˆāĨ¤", "grayscale": { "label": "⤏⤂ā¤ĒāĨ€ā¤Ąā¤ŧ⤍ ⤕āĨ‡ ⤞ā¤ŋā¤ ⤗āĨā¤°āĨ‡ā¤¸āĨā¤•āĨ‡ā¤˛ ā¤˛ā¤žā¤—āĨ‚ ⤕⤰āĨ‡ā¤‚" }, + "tooltip": { + "header": { + "title": "Compress Settings Overview" + }, + "description": { + "title": "Description", + "text": "Compression is an easy way to reduce your file size. Pick File Size to enter a target size and have us adjust quality for you. Pick Quality to set compression strength manually." + }, + "qualityAdjustment": { + "title": "Quality Adjustment", + "text": "Drag the slider to adjust the compression strength. Lower values (1-3) preserve quality but result in larger files. Higher values (7-9) shrink the file more but reduce image clarity.", + "bullet1": "Lower values preserve quality", + "bullet2": "Higher values reduce file size" + }, + "grayscale": { + "title": "Grayscale", + "text": "Select this option to convert all images to black and white, which can significantly reduce file size especially for scanned PDFs or image-heavy documents." + } + }, + "error": { + "failed": "An error occurred while compressing the PDF." + }, "selectText": { "1": { "_value": "Compression Settings", @@ -1491,10 +3435,7 @@ "4": "⤏āĨā¤ĩ⤤⤃ ā¤ŽāĨ‹ā¤Ą - PDF ⤕āĨ‹ ⤏⤟āĨ€ā¤• ā¤†ā¤•ā¤žā¤° ā¤ĒāĨā¤°ā¤žā¤ĒāĨā¤¤ ⤕⤰⤍āĨ‡ ⤕āĨ‡ ⤞ā¤ŋā¤ ⤗āĨā¤Ŗā¤ĩ⤤āĨā¤¤ā¤ž ⤕āĨ‹ ⤏āĨā¤ĩ⤤⤃ ā¤¸ā¤Žā¤žā¤¯āĨ‹ā¤œā¤ŋ⤤ ā¤•ā¤°ā¤¤ā¤ž ā¤šāĨˆ", "5": "⤅ā¤ĒāĨ‡ā¤•āĨā¤ˇā¤ŋ⤤ PDF ā¤†ā¤•ā¤žā¤° (⤜āĨˆā¤¸āĨ‡ 25MB, 10.8MB, 25KB)" }, - "submit": "ā¤•ā¤ŽāĨā¤ĒāĨā¤°āĨ‡ā¤¸ ⤕⤰āĨ‡ā¤‚", - "method": { - "filesize": "ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤†ā¤•ā¤žā¤°" - } + "submit": "ā¤•ā¤ŽāĨā¤ĒāĨā¤°āĨ‡ā¤¸ ⤕⤰āĨ‡ā¤‚" }, "decrypt": { "passwordPrompt": "ā¤¯ā¤š ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤Ēā¤žā¤¸ā¤ĩ⤰āĨā¤Ą ⤏āĨ‡ ⤏āĨā¤°ā¤•āĨā¤ˇā¤ŋ⤤ ā¤šāĨˆāĨ¤ ⤕āĨƒā¤Ēā¤¯ā¤ž ā¤Ēā¤žā¤¸ā¤ĩ⤰āĨā¤Ą ā¤Ļ⤰āĨā¤œ ⤕⤰āĨ‡ā¤‚:", @@ -1595,7 +3536,13 @@ "title": "⤛ā¤ĩā¤ŋā¤¯ā¤žā¤‚ ā¤šā¤Ÿā¤žā¤ā¤‚", "header": "⤛ā¤ĩā¤ŋā¤¯ā¤žā¤‚ ā¤šā¤Ÿā¤žā¤ā¤‚", "removeImage": "⤛ā¤ĩā¤ŋā¤¯ā¤žā¤‚ ā¤šā¤Ÿā¤žā¤ā¤‚", - "submit": "⤛ā¤ĩā¤ŋā¤¯ā¤žā¤‚ ā¤šā¤Ÿā¤žā¤ā¤‚" + "submit": "⤛ā¤ĩā¤ŋā¤¯ā¤žā¤‚ ā¤šā¤Ÿā¤žā¤ā¤‚", + "error": { + "failed": "Failed to remove images from the PDF." + }, + "results": { + "title": "Remove Images Results" + } }, "splitByChapters": { "title": "⤅⤧āĨā¤¯ā¤žā¤¯āĨ‹ā¤‚ ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž PDF ā¤ĩā¤ŋā¤­ā¤žā¤œā¤ŋ⤤ ⤕⤰āĨ‡ā¤‚", @@ -1629,6 +3576,12 @@ }, "note": "⤰ā¤ŋ⤞āĨ€ā¤œā¤ŧ ⤍āĨ‹ā¤ŸāĨā¤¸ ⤕āĨ‡ā¤ĩ⤞ ⤅⤂⤗āĨā¤°āĨ‡ā¤œāĨ€ ā¤ŽāĨ‡ā¤‚ ⤉ā¤Ē⤞ā¤ŦāĨā¤§ ā¤šāĨˆā¤‚" }, + "swagger": { + "title": "API Documentation", + "header": "API Documentation", + "desc": "View and test the Stirling PDF API endpoints", + "tags": "api,documentation,swagger,endpoints,development" + }, "cookieBanner": { "popUp": { "title": "How we use Cookies", @@ -1664,53 +3617,943 @@ "title": "Analytics", "description": "These cookies help us understand how our tools are being used, so we can focus on building the features our community values most. Rest assured—Stirling PDF cannot and will never track the content of the documents you work with." } + }, + "services": { + "posthog": "PostHog Analytics", + "scarf": "Scarf Pixel" } }, - "download": "ā¤Ąā¤žā¤‰ā¤¨ā¤˛āĨ‹ā¤Ą ⤕⤰āĨ‡ā¤‚", - "convert": { - "title": "ā¤Ŧā¤Ļ⤞āĨ‡ā¤‚", - "settings": "⤏āĨ‡ā¤Ÿā¤ŋ⤂⤗āĨā¤¸", - "color": "⤰⤂⤗", - "greyscale": "⤗āĨā¤°āĨ‡ā¤¸āĨā¤•āĨ‡ā¤˛", - "fillPage": "ā¤ĒāĨƒā¤ˇāĨā¤  ⤭⤰āĨ‡ā¤‚", - "pdfaDigitalSignatureWarning": "PDF ā¤ŽāĨ‡ā¤‚ ā¤ā¤• ā¤Ąā¤ŋ⤜ā¤ŋ⤟⤞ ā¤šā¤¸āĨā¤¤ā¤žā¤•āĨā¤ˇā¤° ā¤šāĨˆāĨ¤ ā¤¯ā¤š ⤅⤗⤞āĨ‡ ⤚⤰⤪ ā¤ŽāĨ‡ā¤‚ ā¤šā¤Ÿā¤ž ā¤Ļā¤ŋā¤¯ā¤ž ā¤œā¤žā¤ā¤—ā¤žāĨ¤", - "grayscale": "⤗āĨā¤°āĨ‡ā¤¸āĨā¤•āĨ‡ā¤˛" + "removeMetadata": { + "submit": "Remove Metadata" }, - "attachments": { - "tags": "embed,attach,file,attachment,attachments", - "title": "Add attachments", - "header": "Add attachments", - "submit": "Add attachments" + "sidebar": { + "toggle": "Toggle Sidebar" + }, + "theme": { + "toggle": "Toggle Theme" + }, + "view": { + "viewer": "Viewer", + "pageEditor": "Page Editor", + "fileManager": "File Manager" + }, + "pageEditor": { + "title": "Page Editor", + "save": "Save Changes", + "noPdfLoaded": "No PDF loaded. Please upload a PDF to edit.", + "rotatedLeft": "Rotated left:", + "rotatedRight": "Rotated right:", + "deleted": "Deleted:", + "movedLeft": "Moved left:", + "movedRight": "Moved right:", + "splitAt": "Split at:", + "insertedPageBreak": "Inserted page break at:", + "addFileNotImplemented": "Add file not implemented in demo", + "closePdf": "Close PDF", + "reset": "Reset Changes", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "fitToWidth": "Fit to Width", + "actualSize": "Actual Size" + }, + "viewer": { + "firstPage": "First Page", + "lastPage": "Last Page", + "previousPage": "Previous Page", + "nextPage": "Next Page", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "singlePageView": "Single Page View", + "dualPageView": "Dual Page View" }, "rightRail": { + "closeSelected": "Close Selected Files", "selectAll": "⤏⤭āĨ€ ⤚āĨā¤¨āĨ‡ā¤‚", - "deselectAll": "⤏⤭āĨ€ ā¤…ā¤šā¤¯ā¤¨ā¤ŋ⤤ ⤕⤰āĨ‡ā¤‚" + "deselectAll": "⤏⤭āĨ€ ā¤…ā¤šā¤¯ā¤¨ā¤ŋ⤤ ⤕⤰āĨ‡ā¤‚", + "selectByNumber": "Select by Page Numbers", + "deleteSelected": "Delete Selected Pages", + "closePdf": "Close PDF", + "exportAll": "Export PDF", + "downloadSelected": "Download Selected Files", + "downloadAll": "Download All", + "toggleTheme": "Toggle Theme", + "language": "Language", + "search": "Search PDF", + "panMode": "Pan Mode", + "rotateLeft": "Rotate Left", + "rotateRight": "Rotate Right", + "toggleSidebar": "Toggle Sidebar", + "exportSelected": "Export Selected Pages", + "toggleAnnotations": "Toggle Annotations Visibility", + "annotationMode": "Toggle Annotation Mode", + "draw": "Draw", + "save": "Save" + }, + "search": { + "title": "Search PDF", + "placeholder": "Enter search term...", + "noResults": "No results found", + "searching": "Searching..." + }, + "guestBanner": { + "title": "You're using Stirling PDF as a guest!", + "message": "Create a free account to save your work, access more features, and support the project.", + "dismiss": "Dismiss banner", + "signUp": "Sign Up Free" + }, + "toolPicker": { + "searchPlaceholder": "Search tools...", + "noToolsFound": "No tools found", + "allTools": "ALL TOOLS", + "quickAccess": "QUICK ACCESS", + "categories": { + "standardTools": "Standard Tools", + "advancedTools": "Advanced Tools", + "recommendedTools": "Recommended Tools" + }, + "subcategories": { + "signing": "Signing", + "documentSecurity": "Document Security", + "verification": "Verification", + "documentReview": "Document Review", + "pageFormatting": "Page Formatting", + "extraction": "Extraction", + "removal": "Removal", + "automation": "Automation", + "general": "General", + "advancedFormatting": "Advanced Formatting", + "developerTools": "Developer Tools" + } }, "quickAccess": { - "sign": "ā¤šā¤¸āĨā¤¤ā¤žā¤•āĨā¤ˇā¤° ⤕⤰āĨ‡ā¤‚" + "read": "Read", + "sign": "ā¤šā¤¸āĨā¤¤ā¤žā¤•āĨā¤ˇā¤° ⤕⤰āĨ‡ā¤‚", + "automate": "Automate", + "files": "Files", + "activity": "Activity", + "help": "Help", + "account": "Account", + "config": "Config", + "adminSettings": "Admin Settings", + "allTools": "All Tools" + }, + "admin": { + "error": "Error", + "success": "Success", + "expand": "Expand", + "close": "Close", + "status": { + "active": "Active", + "inactive": "Inactive" + }, + "settings": { + "title": "Admin Settings", + "workspace": "Workspace", + "fetchError": "Failed to load settings", + "saveError": "Failed to save settings", + "saved": "Settings saved successfully", + "saveSuccess": "Settings saved successfully", + "save": "Save Changes", + "restartRequired": "Restart Required", + "restart": { + "title": "Restart Required", + "message": "Settings have been saved successfully. A server restart is required for the changes to take effect.", + "question": "Would you like to restart the server now or later?", + "now": "Restart Now", + "later": "Restart Later" + }, + "restarting": "Restarting Server", + "restartingMessage": "The server is restarting. Please wait a moment...", + "restartError": "Failed to restart server. Please restart manually.", + "general": { + "title": "System Settings", + "description": "Configure system-wide application settings including branding and default behaviour.", + "ui": "User Interface", + "system": "System", + "appName": { + "label": "Application Name", + "description": "The name displayed in the browser tab and home page" + }, + "appNameNavbar": { + "label": "Navbar Brand", + "description": "The name displayed in the navigation bar" + }, + "homeDescription": { + "label": "Home Description", + "description": "The description text shown on the home page" + }, + "defaultLocale": { + "label": "Default Locale", + "description": "The default language for new users (e.g., en_US, es_ES)" + }, + "fileUploadLimit": { + "label": "File Upload Limit", + "description": "Maximum file upload size (e.g., 100MB, 1GB)" + }, + "showUpdate": { + "label": "Show Update Notifications", + "description": "Display notifications when a new version is available" + }, + "showUpdateOnlyAdmin": { + "label": "Show Updates to Admins Only", + "description": "Restrict update notifications to admin users only" + }, + "customHTMLFiles": { + "label": "Custom HTML Files", + "description": "Allow serving custom HTML files from the customFiles directory" + }, + "languages": { + "label": "Available Languages", + "description": "Languages that users can select from (leave empty to enable all languages)" + }, + "customMetadata": { + "label": "Custom Metadata", + "autoUpdate": { + "label": "Auto Update Metadata", + "description": "Automatically update PDF metadata on all processed documents" + }, + "author": { + "label": "Default Author", + "description": "Default author for PDF metadata (e.g., username)" + }, + "creator": { + "label": "Default Creator", + "description": "Default creator for PDF metadata" + }, + "producer": { + "label": "Default Producer", + "description": "Default producer for PDF metadata" + } + }, + "customPaths": { + "label": "Custom Paths", + "description": "Configure custom file system paths for pipeline processing and external tools", + "pipeline": { + "label": "Pipeline Directories", + "watchedFoldersDir": { + "label": "Watched Folders Directory", + "description": "Directory where pipeline monitors for incoming PDFs (leave empty for default: /pipeline/watchedFolders)" + }, + "finishedFoldersDir": { + "label": "Finished Folders Directory", + "description": "Directory where processed PDFs are outputted (leave empty for default: /pipeline/finishedFolders)" + } + }, + "operations": { + "label": "External Tool Paths", + "weasyprint": { + "label": "WeasyPrint Executable", + "description": "Path to WeasyPrint executable for HTML to PDF conversion (leave empty for default: /opt/venv/bin/weasyprint)" + }, + "unoconvert": { + "label": "Unoconvert Executable", + "description": "Path to LibreOffice unoconvert for document conversions (leave empty for default: /opt/venv/bin/unoconvert)" + } + } + } + }, + "security": { + "title": "Security", + "description": "Configure authentication, login behaviour, and security policies.", + "ssoNotice": { + "title": "Looking for SSO/SAML settings?", + "message": "OAuth2 and SAML2 authentication providers have been moved to the Connections menu for easier management." + }, + "authentication": "Authentication", + "enableLogin": { + "label": "Enable Login", + "description": "Require users to log in before accessing the application" + }, + "loginMethod": { + "label": "Login Method", + "description": "The authentication method to use for user login", + "all": "All Methods", + "normal": "Username/Password Only", + "oauth2": "OAuth2 Only", + "saml2": "SAML2 Only" + }, + "loginAttemptCount": { + "label": "Login Attempt Limit", + "description": "Maximum number of failed login attempts before account lockout" + }, + "loginResetTimeMinutes": { + "label": "Login Reset Time (minutes)", + "description": "Time before failed login attempts are reset" + }, + "csrfDisabled": { + "label": "Disable CSRF Protection", + "description": "Disable Cross-Site Request Forgery protection (not recommended)" + }, + "initialLogin": { + "label": "Initial Login", + "username": { + "label": "Initial Username", + "description": "The username for the initial admin account" + }, + "password": { + "label": "Initial Password", + "description": "The password for the initial admin account" + } + }, + "jwt": { + "label": "JWT Configuration", + "secureCookie": { + "label": "Secure Cookie", + "description": "Require HTTPS for JWT cookies (recommended for production)" + }, + "keyRetentionDays": { + "label": "Key Retention Days", + "description": "Number of days to retain old JWT keys for verification" + }, + "persistence": { + "label": "Enable Key Persistence", + "description": "Store JWT keys persistently to survive server restarts" + }, + "enableKeyRotation": { + "label": "Enable Key Rotation", + "description": "Automatically rotate JWT signing keys periodically" + }, + "enableKeyCleanup": { + "label": "Enable Key Cleanup", + "description": "Automatically remove expired JWT keys" + } + }, + "audit": { + "label": "Audit Logging", + "enabled": { + "label": "Enable Audit Logging", + "description": "Track user actions and system events for compliance and security monitoring" + }, + "level": { + "label": "Audit Level", + "description": "0=OFF, 1=BASIC, 2=STANDARD, 3=VERBOSE" + }, + "retentionDays": { + "label": "Audit Retention (days)", + "description": "Number of days to retain audit logs" + } + }, + "htmlUrlSecurity": { + "label": "HTML URL Security", + "description": "Configure URL access restrictions for HTML processing to prevent SSRF attacks", + "enabled": { + "label": "Enable URL Security", + "description": "Enable URL security restrictions for HTML to PDF conversions" + }, + "level": { + "label": "Security Level", + "description": "MAX: whitelist only, MEDIUM: block internal networks, OFF: no restrictions", + "max": "Maximum (Whitelist Only)", + "medium": "Medium (Block Internal)", + "off": "Off (No Restrictions)" + }, + "advanced": "Advanced Settings", + "allowedDomains": { + "label": "Allowed Domains (Whitelist)", + "description": "One domain per line (e.g., cdn.example.com). Only these domains allowed when level is MAX" + }, + "blockedDomains": { + "label": "Blocked Domains (Blacklist)", + "description": "One domain per line (e.g., malicious.com). Additional domains to block" + }, + "internalTlds": { + "label": "Internal TLDs", + "description": "One TLD per line (e.g., .local, .internal). Block domains with these TLD patterns" + }, + "networkBlocking": "Network Blocking", + "blockPrivateNetworks": { + "label": "Block Private Networks", + "description": "Block RFC 1918 private networks (10.x.x.x, 192.168.x.x, 172.16-31.x.x)" + }, + "blockLocalhost": { + "label": "Block Localhost", + "description": "Block localhost and loopback addresses (127.x.x.x, ::1)" + }, + "blockLinkLocal": { + "label": "Block Link-Local Addresses", + "description": "Block link-local addresses (169.254.x.x, fe80::/10)" + }, + "blockCloudMetadata": { + "label": "Block Cloud Metadata Endpoints", + "description": "Block cloud provider metadata endpoints (169.254.169.254)" + } + } + }, + "connections": { + "title": "Connections", + "description": "Configure external authentication providers like OAuth2 and SAML.", + "linkedServices": "Linked Services", + "unlinkedServices": "Unlinked Services", + "connect": "Connect", + "disconnect": "Disconnect", + "disconnected": "Provider disconnected successfully", + "disconnectError": "Failed to disconnect provider", + "ssoAutoLogin": { + "label": "SSO Auto Login", + "enable": "Enable SSO Auto Login", + "description": "Automatically redirect to SSO login when authentication is required" + }, + "oauth2": { + "label": "OAuth2", + "enabled": { + "label": "Enable OAuth2", + "description": "Allow users to authenticate using OAuth2 providers" + }, + "provider": { + "label": "Provider", + "description": "The OAuth2 provider to use for authentication" + }, + "issuer": { + "label": "Issuer URL", + "description": "The OAuth2 provider issuer URL" + }, + "clientId": { + "label": "Client ID", + "description": "The OAuth2 client ID from your provider" + }, + "clientSecret": { + "label": "Client Secret", + "description": "The OAuth2 client secret from your provider" + }, + "useAsUsername": { + "label": "Use as Username", + "description": "The OAuth2 claim to use as the username (e.g., email, sub)" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first OAuth2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via OAuth2" + }, + "scopes": { + "label": "OAuth2 Scopes", + "description": "Comma-separated list of OAuth2 scopes to request (e.g., openid, profile, email)" + } + }, + "saml2": { + "label": "SAML2", + "enabled": { + "label": "Enable SAML2", + "description": "Allow users to authenticate using SAML2 providers" + }, + "provider": { + "label": "Provider", + "description": "The SAML2 provider name" + }, + "registrationId": { + "label": "Registration ID", + "description": "The SAML2 registration identifier" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first SAML2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via SAML2" + } + } + }, + "database": { + "title": "Database", + "description": "Configure custom database connection settings for enterprise deployments.", + "configuration": "Database Configuration", + "enableCustom": { + "label": "Enable Custom Database", + "description": "Use your own custom database configuration instead of the default embedded database" + }, + "customUrl": { + "label": "Custom Database URL", + "description": "Full JDBC connection string (e.g., jdbc:postgresql://localhost:5432/postgres). If provided, individual connection settings below are not used." + }, + "type": { + "label": "Database Type", + "description": "Type of database (not used if custom URL is provided)" + }, + "hostName": { + "label": "Host Name", + "description": "Database server hostname (not used if custom URL is provided)" + }, + "port": { + "label": "Port", + "description": "Database server port (not used if custom URL is provided)" + }, + "name": { + "label": "Database Name", + "description": "Name of the database (not used if custom URL is provided)" + }, + "username": { + "label": "Username", + "description": "Database authentication username" + }, + "password": { + "label": "Password", + "description": "Database authentication password" + } + }, + "privacy": { + "title": "Privacy", + "description": "Configure privacy and data collection settings.", + "analytics": "Analytics & Tracking", + "enableAnalytics": { + "label": "Enable Analytics", + "description": "Collect anonymous usage analytics to help improve the application" + }, + "metricsEnabled": { + "label": "Enable Metrics", + "description": "Enable collection of performance and usage metrics. Provides API endpoint for admins to access metrics data" + }, + "searchEngine": "Search Engine Visibility", + "googleVisibility": { + "label": "Google Visibility", + "description": "Allow search engines to index this application" + } + }, + "advanced": { + "title": "Advanced", + "description": "Configure advanced features and experimental functionality.", + "features": "Feature Flags", + "processing": "Processing", + "endpoints": { + "label": "Endpoints", + "manage": "Manage API Endpoints", + "description": "Endpoint management is configured via YAML. See documentation for details on enabling/disabling specific endpoints." + }, + "enableAlphaFunctionality": { + "label": "Enable Alpha Features", + "description": "Enable experimental and alpha-stage features (may be unstable)" + }, + "enableUrlToPDF": { + "label": "Enable URL to PDF", + "description": "Allow conversion of web pages to PDF documents" + }, + "maxDPI": { + "label": "Maximum DPI", + "description": "Maximum DPI for image processing (0 = unlimited)" + }, + "tessdataDir": { + "label": "Tessdata Directory", + "description": "Path to the tessdata directory for OCR language files" + }, + "disableSanitize": { + "label": "Disable HTML Sanitization", + "description": "WARNING: Security risk - disabling HTML sanitization can lead to XSS vulnerabilities" + }, + "tempFileManagement": { + "label": "Temp File Management", + "description": "Configure temporary file storage and cleanup behavior", + "baseTmpDir": { + "label": "Base Temp Directory", + "description": "Base directory for temporary files (leave empty for default: java.io.tmpdir/stirling-pdf)" + }, + "libreofficeDir": { + "label": "LibreOffice Temp Directory", + "description": "Directory for LibreOffice temp files (leave empty for default: baseTmpDir/libreoffice)" + }, + "systemTempDir": { + "label": "System Temp Directory", + "description": "System temp directory to clean (only used if cleanupSystemTemp is enabled)" + }, + "prefix": { + "label": "Temp File Prefix", + "description": "Prefix for temp file names" + }, + "maxAgeHours": { + "label": "Max Age (hours)", + "description": "Maximum age in hours before temp files are cleaned up" + }, + "cleanupIntervalMinutes": { + "label": "Cleanup Interval (minutes)", + "description": "How often to run cleanup (in minutes)" + }, + "startupCleanup": { + "label": "Startup Cleanup", + "description": "Clean up old temp files on application startup" + }, + "cleanupSystemTemp": { + "label": "Cleanup System Temp", + "description": "Whether to clean broader system temp directory (use with caution)" + } + }, + "processExecutor": { + "label": "Process Executor Limits", + "description": "Configure session limits and timeouts for each process executor", + "sessionLimit": { + "label": "Session Limit", + "description": "Maximum concurrent instances" + }, + "timeout": { + "label": "Timeout (minutes)", + "description": "Maximum execution time" + }, + "libreOffice": "LibreOffice", + "pdfToHtml": "PDF to HTML", + "qpdf": "QPDF", + "tesseract": "Tesseract OCR", + "pythonOpenCv": "Python OpenCV", + "weasyPrint": "WeasyPrint", + "installApp": "Install App", + "calibre": "Calibre", + "ghostscript": "Ghostscript", + "ocrMyPdf": "OCRmyPDF" + } + }, + "mail": { + "title": "Mail Server", + "description": "Configure SMTP settings for sending email notifications.", + "smtp": "SMTP Configuration", + "enabled": { + "label": "Enable Mail", + "description": "Enable email notifications and SMTP functionality" + }, + "host": { + "label": "SMTP Host", + "description": "The hostname or IP address of your SMTP server" + }, + "port": { + "label": "SMTP Port", + "description": "The port number for SMTP connection (typically 25, 465, or 587)" + }, + "username": { + "label": "SMTP Username", + "description": "Username for SMTP authentication" + }, + "password": { + "label": "SMTP Password", + "description": "Password for SMTP authentication" + }, + "from": { + "label": "From Address", + "description": "The email address to use as the sender" + }, + "enableInvites": { + "label": "Enable Email Invites", + "description": "Allow admins to invite users via email with auto-generated passwords" + }, + "frontendUrl": { + "label": "Frontend URL", + "description": "Base URL for frontend (e.g. https://pdf.example.com). Used for generating invite links in emails. Leave empty to use backend URL." + } + }, + "legal": { + "title": "Legal Documents", + "description": "Configure links to legal documents and policies.", + "disclaimer": { + "title": "Legal Responsibility Warning", + "message": "By customizing these legal documents, you assume full responsibility for ensuring compliance with all applicable laws and regulations, including but not limited to GDPR and other EU data protection requirements. Only modify these settings if: (1) you are operating a personal/private instance, (2) you are outside EU jurisdiction and understand your local legal obligations, or (3) you have obtained proper legal counsel and accept sole responsibility for all user data and legal compliance. Stirling-PDF and its developers assume no liability for your legal obligations." + }, + "termsAndConditions": { + "label": "Terms and Conditions", + "description": "URL or filename to terms and conditions" + }, + "privacyPolicy": { + "label": "Privacy Policy", + "description": "URL or filename to privacy policy" + }, + "accessibilityStatement": { + "label": "Accessibility Statement", + "description": "URL or filename to accessibility statement" + }, + "cookiePolicy": { + "label": "Cookie Policy", + "description": "URL or filename to cookie policy" + }, + "impressum": { + "label": "Impressum", + "description": "URL or filename to impressum (required in some jurisdictions)" + } + }, + "premium": { + "title": "Premium & Enterprise", + "description": "Configure your premium or enterprise license key.", + "license": "License Configuration", + "key": { + "label": "License Key", + "description": "Enter your premium or enterprise license key" + }, + "enabled": { + "label": "Enable Premium Features", + "description": "Enable license key checks for pro/enterprise features" + }, + "movedFeatures": { + "title": "Premium Features Distributed", + "message": "Premium and Enterprise features are now organized in their respective sections:" + } + }, + "features": { + "title": "Features", + "description": "Configure optional features and functionality.", + "serverCertificate": { + "label": "Server Certificate", + "description": "Configure server-side certificate generation for \"Sign with Stirling-PDF\" functionality", + "enabled": { + "label": "Enable Server Certificate", + "description": "Enable server-side certificate for \"Sign with Stirling-PDF\" option" + }, + "organizationName": { + "label": "Organization Name", + "description": "Organization name for generated certificates" + }, + "validity": { + "label": "Certificate Validity (days)", + "description": "Number of days the certificate will be valid" + }, + "regenerateOnStartup": { + "label": "Regenerate on Startup", + "description": "Generate new certificate on each application startup" + } + } + }, + "endpoints": { + "title": "API Endpoints", + "description": "Control which API endpoints and endpoint groups are available.", + "management": "Endpoint Management", + "toRemove": { + "label": "Disabled Endpoints", + "description": "Select individual endpoints to disable" + }, + "groupsToRemove": { + "label": "Disabled Endpoint Groups", + "description": "Select endpoint groups to disable" + }, + "note": "Note: Disabling endpoints restricts API access but does not remove UI components. Restart required for changes to take effect." + } + } }, "fileUpload": { + "selectFile": "Select a file", + "selectFiles": "Select files", + "selectPdfToView": "Select a PDF to view", + "selectPdfToEdit": "Select a PDF to edit", + "chooseFromStorage": "Choose a file from storage or upload a new PDF", + "chooseFromStorageMultiple": "Choose files from storage or upload new PDFs", + "loadFromStorage": "Load from Storage", + "filesAvailable": "files available", "loading": "⤞āĨ‹ā¤Ą ā¤šāĨ‹ ā¤°ā¤šā¤ž ā¤šāĨˆ...", - "or": "ā¤¯ā¤ž" + "or": "ā¤¯ā¤ž", + "dropFileHere": "Drop file here or click to upload", + "dropFilesHere": "Drop files here or click the upload button", + "pdfFilesOnly": "PDF files only", + "supportedFileTypes": "Supported file types", + "upload": "Upload", + "uploadFile": "Upload File", + "uploadFiles": "Upload Files", + "noFilesInStorage": "No files available in storage. Upload some files first.", + "selectFromStorage": "Select from Storage", + "backToTools": "Back to Tools", + "addFiles": "Add Files", + "dragFilesInOrClick": "Drag files in or click \"Add Files\" to browse" + }, + "fileEditor": { + "addFiles": "Add Files" }, "fileManager": { + "title": "Upload PDF Files", + "subtitle": "Add files to your storage for easy access across tools", + "filesSelected": "files selected", + "clearSelection": "Clear Selection", + "openInFileEditor": "Open in File Editor", + "uploadError": "Failed to upload some files.", + "failedToOpen": "Failed to open file. It may have been removed from storage.", + "failedToLoad": "Failed to load file to active set.", + "storageCleared": "Browser cleared storage. Files have been removed. Please re-upload.", + "clearAll": "Clear All", + "reloadFiles": "Reload Files", + "dragDrop": "Drag & Drop files here", + "clickToUpload": "Click to upload files", + "selectedFiles": "Selected Files", + "storage": "Storage", + "filesStored": "files stored", + "storageError": "Storage error occurred", + "storageLow": "Storage is running low. Consider removing old files.", + "supportMessage": "Powered by browser database storage for unlimited capacity", + "noFileSelected": "No files selected", + "showHistory": "Show History", + "hideHistory": "Hide History", + "fileHistory": "File History", + "loadingHistory": "Loading History...", + "lastModified": "Last Modified", + "toolChain": "Tools Applied", + "restore": "Restore", + "unzip": "Unzip", + "searchFiles": "Search files...", + "recent": "Recent", + "localFiles": "Local Files", + "googleDrive": "Google Drive", + "googleDriveShort": "Drive", + "myFiles": "My Files", + "noRecentFiles": "No recent files found", + "googleDriveNotAvailable": "Google Drive integration not available", + "openFiles": "Open Files", + "openFile": "Open File", + "details": "File Details", "fileName": "ā¤¨ā¤žā¤Ž", + "fileFormat": "Format", + "fileSize": "Size", "fileVersion": "⤏⤂⤏āĨā¤•⤰⤪", + "totalSelected": "Total Selected", + "dropFilesHere": "Drop files here", "selectAll": "⤏⤭āĨ€ ⤚āĨā¤¨āĨ‡ā¤‚", "deselectAll": "⤏⤭āĨ€ ā¤…ā¤šā¤¯ā¤¨ā¤ŋ⤤ ⤕⤰āĨ‡ā¤‚", "deleteSelected": "⤚⤝⤍ā¤ŋ⤤ ā¤šā¤Ÿā¤žā¤ā¤‚", + "downloadSelected": "Download Selected", + "selectedCount": "{{count}} selected", "download": "ā¤Ąā¤žā¤‰ā¤¨ā¤˛āĨ‹ā¤Ą ⤕⤰āĨ‡ā¤‚", - "delete": "ā¤šā¤Ÿā¤žā¤ā¤‚" + "delete": "ā¤šā¤Ÿā¤žā¤ā¤‚", + "unsupported": "Unsupported", + "addToUpload": "Add to Upload", + "deleteAll": "Delete All", + "loadingFiles": "Loading files...", + "noFiles": "No files available", + "noFilesFound": "No files found matching your search", + "openInPageEditor": "Open in Page Editor", + "showAll": "Show All", + "sortByDate": "Sort by Date", + "sortByName": "Sort by Name", + "sortBySize": "Sort by Size" + }, + "storage": { + "temporaryNotice": "Files are stored temporarily in your browser and may be cleared automatically", + "storageLimit": "Storage limit", + "storageUsed": "Temporary Storage used", + "storageFull": "Storage is nearly full. Consider removing some files.", + "fileTooLarge": "File too large. Maximum size per file is", + "storageQuotaExceeded": "Storage quota exceeded. Please remove some files before uploading more.", + "approximateSize": "Approximate size" }, "sanitize": { + "title": "Sanitise", + "desc": "Remove potentially harmful elements from PDF files.", "submit": "PDF ⤏āĨˆā¤¨ā¤ŋā¤Ÿā¤žā¤‡ā¤œā¤ŧ ⤕⤰āĨ‡ā¤‚", + "completed": "Sanitisation completed successfully", + "error": { + "generic": "Sanitisation failed", + "failed": "An error occurred while sanitising the PDF." + }, + "filenamePrefix": "sanitised", + "sanitizationResults": "Sanitisation Results", "steps": { - "settings": "⤏āĨ‡ā¤Ÿā¤ŋ⤂⤗āĨā¤¸" + "files": "Files", + "settings": "⤏āĨ‡ā¤Ÿā¤ŋ⤂⤗āĨā¤¸", + "results": "Results" + }, + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "options": { + "title": "Sanitisation Options", + "note": "Select the elements you want to remove from the PDF. At least one option must be selected.", + "removeJavaScript": { + "label": "Remove JavaScript", + "desc": "Remove JavaScript actions and scripts from the PDF" + }, + "removeEmbeddedFiles": { + "label": "Remove Embedded Files", + "desc": "Remove any files embedded within the PDF" + }, + "removeXMPMetadata": { + "label": "Remove XMP Metadata", + "desc": "Remove XMP metadata from the PDF" + }, + "removeMetadata": { + "label": "Remove Document Metadata", + "desc": "Remove document information metadata (title, author, etc.)" + }, + "removeLinks": { + "label": "Remove Links", + "desc": "Remove external links and launch actions from the PDF" + }, + "removeFonts": { + "label": "Remove Fonts", + "desc": "Remove embedded fonts from the PDF" + } + } + }, + "addPassword": { + "title": "ā¤Ēā¤žā¤¸ā¤ĩ⤰āĨā¤Ą ⤜āĨ‹ā¤Ąā¤ŧāĨ‡ā¤‚", + "desc": "Encrypt your PDF document with a password.", + "completed": "Password protection applied", + "submit": "ā¤ā¤¨āĨā¤•āĨā¤°ā¤ŋā¤ĒāĨā¤Ÿ ⤕⤰āĨ‡ā¤‚", + "filenamePrefix": "encrypted", + "error": { + "failed": "An error occurred while encrypting the PDF." + }, + "passwords": { + "stepTitle": "Passwords & Encryption", + "completed": "Passwords configured", + "user": { + "label": "User Password", + "placeholder": "Enter user password" + }, + "owner": { + "label": "Owner Password", + "placeholder": "Enter owner password" + } + }, + "encryption": { + "keyLength": { + "label": "Encryption Key Length", + "40bit": "40-bit (Low)", + "128bit": "128-bit (Standard)", + "256bit": "256-bit (High)" + } + }, + "results": { + "title": "Encrypted PDFs" + }, + "tooltip": { + "header": { + "title": "Password Protection Overview" + }, + "passwords": { + "title": "Password Types", + "text": "User passwords restrict opening the document, while owner passwords control what can be done with the document once opened. You can set both or just one.", + "bullet1": "User Password: Required to open the PDF", + "bullet2": "Owner Password: Controls document permissions (not supported by all PDF viewers)" + }, + "encryption": { + "title": "Encryption Levels", + "text": "Higher encryption levels provide better security but may not be supported by older PDF viewers.", + "bullet1": "40-bit: Basic security, compatible with older viewers", + "bullet2": "128-bit: Standard security, widely supported", + "bullet3": "256-bit: Maximum security, requires modern viewers" + }, + "permissions": { + "title": "⤅⤍āĨā¤Žā¤¤ā¤ŋā¤¯ā¤žā¤‚ ā¤Ŧā¤Ļ⤞āĨ‡ā¤‚", + "text": "These permissions control what users can do with the PDF. Most effective when combined with an owner password." + } + }, + "tags": "⤏āĨā¤°ā¤•āĨā¤ˇā¤ŋ⤤,⤏āĨā¤°ā¤•āĨā¤ˇā¤ž", + "header": "ā¤Ēā¤žā¤¸ā¤ĩ⤰āĨā¤Ą ⤜āĨ‹ā¤Ąā¤ŧāĨ‡ā¤‚ (ā¤ā¤¨āĨā¤•āĨā¤°ā¤ŋā¤ĒāĨā¤Ÿ)", + "selectText": { + "1": "ā¤ā¤¨āĨā¤•āĨā¤°ā¤ŋā¤ĒāĨā¤Ÿ ⤕⤰⤍āĨ‡ ⤕āĨ‡ ⤞ā¤ŋā¤ PDF ⤚āĨā¤¨āĨ‡ā¤‚", + "2": "⤉ā¤Ē⤝āĨ‹ā¤—⤕⤰āĨā¤¤ā¤ž ā¤Ēā¤žā¤¸ā¤ĩ⤰āĨā¤Ą", + "3": "ā¤ā¤¨āĨā¤•āĨā¤°ā¤ŋā¤ĒāĨā¤ļ⤍ ⤕āĨā¤‚ā¤œāĨ€ ⤞⤂ā¤Ŧā¤žā¤ˆ", + "4": "ā¤‰ā¤šāĨā¤š ā¤Žā¤žā¤¨ ⤅⤧ā¤ŋ⤕ ā¤Žā¤œā¤ŦāĨ‚⤤ ā¤šāĨˆā¤‚, ⤞āĨ‡ā¤•ā¤ŋ⤍ ⤍ā¤ŋā¤ŽāĨā¤¨ ā¤Žā¤žā¤¨ ā¤ŦāĨ‡ā¤šā¤¤ā¤° ā¤¸ā¤‚ā¤—ā¤¤ā¤¤ā¤ž ⤰⤖⤤āĨ‡ ā¤šāĨˆā¤‚āĨ¤", + "5": "⤏āĨ‡ā¤Ÿ ⤕⤰⤍āĨ‡ ⤕āĨ‡ ⤞ā¤ŋā¤ ⤅⤍āĨā¤Žā¤¤ā¤ŋā¤¯ā¤žā¤‚ (⤏āĨā¤ĩā¤žā¤ŽāĨ€ ā¤Ēā¤žā¤¸ā¤ĩ⤰āĨā¤Ą ⤕āĨ‡ ā¤¸ā¤žā¤Ĩ ⤉ā¤Ē⤝āĨ‹ā¤— ⤕⤰⤍āĨ‡ ⤕āĨ€ ⤏ā¤ŋā¤Ģā¤žā¤°ā¤ŋā¤ļ ⤕āĨ€ ā¤œā¤žā¤¤āĨ€ ā¤šāĨˆ)", + "6": "ā¤Ļ⤏āĨā¤¤ā¤žā¤ĩāĨ‡ā¤œā¤ŧ ⤅⤏āĨ‡ā¤‚ā¤Ŧ⤞āĨ€ ⤕āĨ‹ ⤰āĨ‹ā¤•āĨ‡ā¤‚", + "7": "ā¤¸ā¤žā¤Žā¤—āĨā¤°āĨ€ ⤍ā¤ŋ⤎āĨā¤•⤰āĨā¤ˇā¤Ŗ ⤕āĨ‹ ⤰āĨ‹ā¤•āĨ‡ā¤‚", + "8": "ā¤Ēā¤šāĨā¤‚ā¤š ⤝āĨ‹ā¤—āĨā¤¯ā¤¤ā¤ž ⤕āĨ‡ ⤞ā¤ŋā¤ ⤍ā¤ŋ⤎āĨā¤•⤰āĨā¤ˇā¤Ŗ ⤕āĨ‹ ⤰āĨ‹ā¤•āĨ‡ā¤‚", + "9": "ā¤ĢāĨ‰ā¤°āĨā¤Ž ⤭⤰⤍āĨ‡ ⤕āĨ‹ ⤰āĨ‹ā¤•āĨ‡ā¤‚", + "10": "⤏⤂ā¤ļāĨ‹ā¤§ā¤¨ ⤕āĨ‹ ⤰āĨ‹ā¤•āĨ‡ā¤‚", + "11": "⤟ā¤ŋā¤ĒāĨā¤Ē⤪āĨ€ ⤏⤂ā¤ļāĨ‹ā¤§ā¤¨ ⤕āĨ‹ ⤰āĨ‹ā¤•āĨ‡ā¤‚", + "12": "ā¤ĒāĨā¤°ā¤ŋā¤‚ā¤Ÿā¤ŋ⤂⤗ ⤕āĨ‹ ⤰āĨ‹ā¤•āĨ‡ā¤‚", + "13": "ā¤ĩā¤ŋ⤭ā¤ŋ⤍āĨā¤¨ ā¤ĒāĨā¤°ā¤žā¤°āĨ‚ā¤ĒāĨ‹ā¤‚ ā¤ŽāĨ‡ā¤‚ ā¤ĒāĨā¤°ā¤ŋā¤‚ā¤Ÿā¤ŋ⤂⤗ ⤕āĨ‹ ⤰āĨ‹ā¤•āĨ‡ā¤‚", + "14": "⤏āĨā¤ĩā¤žā¤ŽāĨ€ ā¤Ēā¤žā¤¸ā¤ĩ⤰āĨā¤Ą", + "15": "ā¤ā¤• ā¤Ŧā¤žā¤° ⤖āĨā¤˛ā¤¨āĨ‡ ⤕āĨ‡ ā¤Ŧā¤žā¤Ļ ā¤Ļ⤏āĨā¤¤ā¤žā¤ĩāĨ‡ā¤œā¤ŧ ⤕āĨ‡ ā¤¸ā¤žā¤Ĩ ⤕āĨā¤¯ā¤ž ⤕ā¤ŋā¤¯ā¤ž ā¤œā¤ž ā¤¸ā¤•ā¤¤ā¤ž ā¤šāĨˆ ⤕āĨ‹ ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤Ŧ⤂⤧ā¤ŋ⤤ ā¤•ā¤°ā¤¤ā¤ž ā¤šāĨˆ (⤏⤭āĨ€ ā¤Ēā¤žā¤ ā¤•āĨ‹ā¤‚ ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž ā¤¸ā¤Žā¤°āĨā¤Ĩā¤ŋ⤤ ā¤¨ā¤šāĨ€ā¤‚)", + "16": "ā¤Ļ⤏āĨā¤¤ā¤žā¤ĩāĨ‡ā¤œā¤ŧ ⤕āĨ‹ ⤖āĨ‹ā¤˛ā¤¨āĨ‡ ⤕āĨ‹ ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤Ŧ⤂⤧ā¤ŋ⤤ ā¤•ā¤°ā¤¤ā¤ž ā¤šāĨˆ" } }, "changePermissions": { "title": "⤅⤍āĨā¤Žā¤¤ā¤ŋā¤¯ā¤žā¤‚ ā¤Ŧā¤Ļ⤞āĨ‡ā¤‚", + "desc": "Change document restrictions and permissions.", + "completed": "Permissions changed", "submit": "⤅⤍āĨā¤Žā¤¤ā¤ŋā¤¯ā¤žā¤‚ ā¤Ŧā¤Ļ⤞āĨ‡ā¤‚", + "error": { + "failed": "An error occurred while changing PDF permissions." + }, "permissions": { "preventAssembly": { "label": "ā¤Ļ⤏āĨā¤¤ā¤žā¤ĩāĨ‡ā¤œā¤ŧ ⤅⤏āĨ‡ā¤‚ā¤Ŧ⤞āĨ€ ⤕āĨ‹ ⤰āĨ‹ā¤•āĨ‡ā¤‚" @@ -1737,10 +4580,784 @@ "label": "ā¤ĩā¤ŋ⤭ā¤ŋ⤍āĨā¤¨ ā¤ĒāĨā¤°ā¤žā¤°āĨ‚ā¤ĒāĨ‹ā¤‚ ā¤ŽāĨ‡ā¤‚ ā¤ĒāĨā¤°ā¤ŋā¤‚ā¤Ÿā¤ŋ⤂⤗ ⤕āĨ‹ ⤰āĨ‹ā¤•āĨ‡ā¤‚" } }, + "results": { + "title": "Modified PDFs" + }, "tooltip": { "header": { "title": "⤅⤍āĨā¤Žā¤¤ā¤ŋā¤¯ā¤žā¤‚ ā¤Ŧā¤Ļ⤞āĨ‡ā¤‚" + }, + "description": { + "text": "Changes document permissions, allowing/disallowing access to different features in PDF readers." + }, + "warning": { + "text": "To make these permissions unchangeable, use the Add Password tool to set an owner password." } } + }, + "removePassword": { + "title": "ā¤Ēā¤žā¤¸ā¤ĩ⤰āĨā¤Ą ā¤šā¤Ÿā¤žā¤ā¤‚", + "desc": "⤅ā¤Ē⤍āĨ‡ PDF ā¤Ļ⤏āĨā¤¤ā¤žā¤ĩāĨ‡ā¤œ ⤏āĨ‡ ā¤Ēā¤žā¤¸ā¤ĩ⤰āĨā¤Ą ⤏āĨā¤°ā¤•āĨā¤ˇā¤ž ā¤šā¤Ÿā¤žā¤ā¤‚āĨ¤", + "tags": "⤏āĨā¤°ā¤•āĨā¤ˇā¤ŋ⤤,ā¤Ąā¤ŋ⤕āĨā¤°ā¤ŋā¤ĒāĨā¤Ÿ,⤏āĨā¤°ā¤•āĨā¤ˇā¤ž,⤅⤍ā¤Ēā¤žā¤¸ā¤ĩ⤰āĨā¤Ą,ā¤Ēā¤žā¤¸ā¤ĩ⤰āĨā¤Ą ā¤šā¤Ÿā¤žā¤ā¤‚", + "password": { + "stepTitle": "ā¤Ēā¤žā¤¸ā¤ĩ⤰āĨā¤Ą ā¤šā¤Ÿā¤žā¤ā¤‚", + "label": "ā¤ĩ⤰āĨā¤¤ā¤Žā¤žā¤¨ ā¤Ēā¤žā¤¸ā¤ĩ⤰āĨā¤Ą", + "placeholder": "Enter current password", + "completed": "Password configured" + }, + "filenamePrefix": "decrypted", + "error": { + "failed": "An error occurred while removing the password from the PDF." + }, + "tooltip": { + "description": "Removing password protection requires the password that was used to encrypt the PDF. This will decrypt the document, making it accessible without a password." + }, + "submit": "ā¤šā¤Ÿā¤žā¤ā¤‚", + "results": { + "title": "Decrypted PDFs" + }, + "header": "ā¤Ēā¤žā¤¸ā¤ĩ⤰āĨā¤Ą ā¤šā¤Ÿā¤žā¤ā¤‚ (ā¤Ąā¤ŋ⤕āĨā¤°ā¤ŋā¤ĒāĨā¤Ÿ)", + "selectText": { + "1": "ā¤Ąā¤ŋ⤕āĨā¤°ā¤ŋā¤ĒāĨā¤Ÿ ⤕⤰⤍āĨ‡ ⤕āĨ‡ ⤞ā¤ŋā¤ PDF ⤚āĨā¤¨āĨ‡ā¤‚", + "2": "ā¤Ēā¤žā¤¸ā¤ĩ⤰āĨā¤Ą" + } + }, + "automate": { + "title": "Automate", + "desc": "Build multi-step workflows by chaining together PDF actions. Ideal for recurring tasks.", + "invalidStep": "Invalid step", + "files": { + "placeholder": "Select files to process with this automation" + }, + "selection": { + "title": "Automation Selection", + "saved": { + "title": "Saved" + }, + "createNew": { + "title": "Create New Automation" + }, + "suggested": { + "title": "Suggested" + } + }, + "creation": { + "createTitle": "Create Automation", + "editTitle": "Edit Automation", + "intro": "Automations run tools sequentially. To get started, add tools in the order you want them to run.", + "name": { + "label": "Automation Name", + "placeholder": "My Automation" + }, + "description": { + "label": "Description (optional)", + "placeholder": "Describe what this automation does..." + }, + "tools": { + "selectTool": "Select a tool...", + "selected": "Selected Tools", + "remove": "Remove tool", + "configure": "Configure tool", + "notConfigured": "! Not Configured", + "addTool": "Add Tool", + "add": "Add a tool..." + }, + "save": "Save Automation", + "unsavedChanges": { + "title": "Unsaved Changes", + "message": "You have unsaved changes. Are you sure you want to go back? All changes will be lost.", + "cancel": "Cancel", + "confirm": "Go Back" + }, + "icon": { + "label": "Icon" + } + }, + "run": { + "title": "Run Automation" + }, + "sequence": { + "unnamed": "Unnamed Automation", + "steps": "{{count}} steps", + "running": "Running Automation...", + "run": "Run Automation", + "finish": "Finish" + }, + "reviewTitle": "Automation Results", + "config": { + "loading": "Loading tool configuration...", + "noSettings": "This tool does not have configurable settings.", + "title": "Configure {{toolName}}", + "description": "Configure the settings for this tool. These settings will be applied when the automation runs.", + "cancel": "Cancel", + "save": "Save Configuration" + }, + "copyToSaved": "Copy to Saved" + }, + "automation": { + "suggested": { + "securePdfIngestion": "Secure PDF Ingestion", + "securePdfIngestionDesc": "Comprehensive PDF processing workflow that sanitises documents, applies OCR with cleanup, converts to PDF/A format for long-term archival, and optimises file size.", + "emailPreparation": "Email Preparation", + "emailPreparationDesc": "Optimises PDFs for email distribution by compressing files, splitting large documents into 20MB chunks for email compatibility, and removing metadata for privacy.", + "secureWorkflow": "Security Workflow", + "secureWorkflowDesc": "Secures PDF documents by removing potentially malicious content like JavaScript and embedded files, then adds password protection to prevent unauthorised access. Password is set to 'password' by default.", + "processImages": "Process Images", + "processImagesDesc": "Converts multiple image files into a single PDF document, then applies OCR technology to extract searchable text from the images." + } + }, + "common": { + "copy": "Copy", + "copied": "Copied!", + "refresh": "Refresh", + "retry": "Retry", + "remaining": "remaining", + "used": "used", + "available": "available", + "cancel": "Cancel", + "preview": "Preview" + }, + "config": { + "overview": { + "title": "Application Configuration", + "description": "Current application settings and configuration details." + }, + "account": { + "overview": { + "title": "Account Settings", + "manageAccountPreferences": "Manage your account preferences", + "guestDescription": "You are signed in as a guest. Consider upgrading your account above." + }, + "upgrade": { + "title": "Upgrade Guest Account", + "description": "Link your account to preserve your history and access more features!", + "socialLogin": "Upgrade with Social Account", + "linkWith": "Link with", + "emailPassword": "or enter your email & password", + "email": "Email", + "emailPlaceholder": "Enter your email", + "password": "Password (optional)", + "passwordPlaceholder": "Set a password", + "passwordNote": "Leave empty to use email verification only", + "upgradeButton": "Upgrade Account" + } + }, + "apiKeys": { + "description": "Your API key for accessing Stirling's suite of PDF tools. Copy it to your project or refresh to generate a new one.", + "publicKeyAriaLabel": "Public API key", + "copyKeyAriaLabel": "Copy API key", + "refreshAriaLabel": "Refresh API key", + "includedCredits": "Included credits", + "purchasedCredits": "Purchased credits", + "totalCredits": "Total Credits", + "chartAriaLabel": "Credits usage: included {{includedUsed}} of {{includedTotal}}, purchased {{purchasedUsed}} of {{purchasedTotal}}", + "nextReset": "Next Reset", + "lastApiUse": "Last API Use", + "overlayMessage": "Generate a key to see credits and available credits", + "label": "API Key", + "guestInfo": "Guest users do not receive API keys. Create an account to get an API key you can use in your applications.", + "goToAccount": "Go to Account", + "refreshModal": { + "title": "Refresh API Keys", + "warning": "âš ī¸ Warning: This action will generate new API keys and make your previous keys invalid.", + "impact": "Any applications or services currently using these keys will stop working until you update them with the new keys.", + "confirmPrompt": "Are you sure you want to continue?", + "confirmCta": "Refresh Keys" + }, + "generateError": "We couldn't generate your API key." + } + }, + "AddAttachmentsRequest": { + "attachments": "Select Attachments", + "info": "Select files to attach to your PDF. These files will be embedded and accessible through the PDF's attachment panel.", + "selectFiles": "Select Files to Attach", + "placeholder": "Choose files...", + "addMoreFiles": "Add more files...", + "selectedFiles": "Selected Files", + "submit": "Add Attachments", + "results": { + "title": "Attachment Results" + }, + "error": { + "failed": "Add attachments operation failed" + } + }, + "termsAndConditions": "Terms & Conditions", + "logOut": "Log out", + "addAttachments": { + "error": { + "failed": "An error occurred while adding attachments to the PDF." + } + }, + "autoRename": { + "description": "This tool will automatically rename PDF files based on their content. It analyzes the document to find the most suitable title from the text." + }, + "customPosition": "Custom Position", + "details": "Details", + "downloadUnavailable": "Download unavailable for this item", + "invalidUndoData": "Cannot undo: invalid operation data", + "margin": { + "large": "Large", + "medium": "Medium", + "small": "Small", + "xLarge": "Extra Large" + }, + "noFilesToUndo": "Cannot undo: no files were processed in the last operation", + "noOperationToUndo": "No operation to undo", + "noValidFiles": "No valid files to process", + "operationCancelled": "Operation cancelled", + "pageEdit": { + "deselectAll": "Select None", + "selectAll": "Select All" + }, + "quickPosition": "Quick Position", + "reorganizePages": { + "error": { + "failed": "Failed to reorganize pages" + }, + "results": { + "title": "Pages Reorganized" + }, + "settings": { + "title": "Settings" + }, + "submit": "Reorganize Pages" + }, + "replace-color": { + "options": { + "fill": "Fill colour", + "gradient": "Gradient" + }, + "previewOverlayOpacity": "Preview overlay opacity", + "previewOverlayTransparency": "Preview overlay transparency", + "previewOverlayVisibility": "Show preview overlay", + "selectText": { + "1": "⤰⤂⤗ ā¤Ŧā¤Ļ⤞āĨ‡ā¤‚ ā¤¯ā¤ž ⤉⤞āĨā¤Ÿā¤ž ⤕⤰āĨ‡ā¤‚ ā¤ĩā¤ŋ⤕⤞āĨā¤Ē", + "2": "ā¤Ąā¤ŋā¤Ģā¤ŧāĨ‰ā¤˛āĨā¤Ÿ (ā¤Ąā¤ŋā¤Ģā¤ŧāĨ‰ā¤˛āĨā¤Ÿ ā¤‰ā¤šāĨā¤š ā¤•ā¤‚ā¤ŸāĨā¤°ā¤žā¤¸āĨā¤Ÿ ⤰⤂⤗)", + "3": "⤕⤏āĨā¤Ÿā¤Ž (⤅⤍āĨā¤•āĨ‚⤞ā¤ŋ⤤ ⤰⤂⤗)", + "4": "ā¤ĒāĨ‚⤰āĨā¤Ŗ-⤉⤞āĨā¤Ÿā¤ž (⤏⤭āĨ€ ⤰⤂⤗āĨ‹ā¤‚ ⤕āĨ‹ ⤉⤞āĨā¤Ÿā¤ž ⤕⤰āĨ‡ā¤‚)", + "5": "ā¤‰ā¤šāĨā¤š ā¤•ā¤‚ā¤ŸāĨā¤°ā¤žā¤¸āĨā¤Ÿ ⤰⤂⤗ ā¤ĩā¤ŋ⤕⤞āĨā¤Ē", + "6": "ā¤•ā¤žā¤˛āĨ€ ā¤ĒāĨƒā¤ˇāĨā¤ ā¤­āĨ‚ā¤Žā¤ŋ ā¤Ē⤰ ⤏ā¤ĢāĨ‡ā¤Ļ ⤟āĨ‡ā¤•āĨā¤¸āĨā¤Ÿ", + "7": "⤏ā¤ĢāĨ‡ā¤Ļ ā¤ĒāĨƒā¤ˇāĨā¤ ā¤­āĨ‚ā¤Žā¤ŋ ā¤Ē⤰ ā¤•ā¤žā¤˛ā¤ž ⤟āĨ‡ā¤•āĨā¤¸āĨā¤Ÿ", + "8": "ā¤•ā¤žā¤˛āĨ€ ā¤ĒāĨƒā¤ˇāĨā¤ ā¤­āĨ‚ā¤Žā¤ŋ ā¤Ē⤰ ā¤ĒāĨ€ā¤˛ā¤ž ⤟āĨ‡ā¤•āĨā¤¸āĨā¤Ÿ", + "9": "ā¤•ā¤žā¤˛āĨ€ ā¤ĒāĨƒā¤ˇāĨā¤ ā¤­āĨ‚ā¤Žā¤ŋ ā¤Ē⤰ ā¤šā¤°ā¤ž ⤟āĨ‡ā¤•āĨā¤¸āĨā¤Ÿ", + "10": "⤟āĨ‡ā¤•āĨā¤¸āĨā¤Ÿ ⤰⤂⤗ ⤚āĨā¤¨āĨ‡ā¤‚", + "11": "ā¤ĒāĨƒā¤ˇāĨā¤ ā¤­āĨ‚ā¤Žā¤ŋ ⤰⤂⤗ ⤚āĨā¤¨āĨ‡ā¤‚", + "12": "Choose start colour", + "13": "Choose end colour" + }, + "submit": "ā¤Ŧā¤Ļ⤞āĨ‡ā¤‚", + "title": "⤰⤂⤗ ā¤Ŧā¤Ļ⤞āĨ‡ā¤‚-⤉⤞āĨā¤Ÿā¤ž ⤕⤰āĨ‡ā¤‚", + "header": "⤰⤂⤗ ā¤Ŧā¤Ļ⤞āĨ‡ā¤‚-⤉⤞āĨā¤Ÿā¤ž ⤕⤰āĨ‡ā¤‚ PDF" + }, + "size": "Size", + "submit": "Submit", + "success": "Success", + "tools": { + "noSearchResults": "No tools found", + "noTools": "No tools available" + }, + "undoDataMismatch": "Cannot undo: operation data is corrupted", + "undoFailed": "Failed to undo operation", + "undoQuotaError": "Cannot undo: insufficient storage space", + "undoStorageError": "Undo completed but some files could not be saved to storage", + "undoSuccess": "Operation undone successfully", + "unsupported": "Unsupported", + "onboarding": { + "welcomeModal": { + "title": "Welcome to Stirling PDF!", + "description": "Would you like to take a quick 1-minute tour to learn the key features and how to get started?", + "helpHint": "You can always access this tour later from the Help button in the bottom left.", + "startTour": "Start Tour", + "maybeLater": "Maybe Later", + "dontShowAgain": "Don't Show Again" + }, + "allTools": "This is the All Tools panel, where you can browse and select from all available PDF tools.", + "selectCropTool": "Let's select the Crop tool to demonstrate how to use one of the tools.", + "toolInterface": "This is the Crop tool interface. As you can see, there's not much there because we haven't added any PDF files to work with yet.", + "filesButton": "The Files button on the Quick Access bar allows you to upload PDFs to use the tools on.", + "fileSources": "You can upload new files or access recent files from here. For the tour, we'll just use a sample file.", + "workbench": "This is the Workbench - the main area where you view and edit your PDFs.", + "viewSwitcher": "Use these controls to select how you want to view your PDFs.", + "viewer": "The Viewer lets you read and annotate your PDFs.", + "pageEditor": "The Page Editor allows you to do various operations on the pages within your PDFs, such as reordering, rotating and deleting.", + "activeFiles": "The Active Files view shows all of the PDFs you have loaded into the tool, and allows you to select which ones to process.", + "fileCheckbox": "Clicking one of the files selects it for processing. You can select multiple files for batch operations.", + "selectControls": "The Right Rail contains buttons to quickly select/deselect all of your active PDFs, along with buttons to change the app's theme or language.", + "cropSettings": "Now that we've selected the file we want crop, we can configure the Crop tool to choose the area that we want to crop the PDF to.", + "runButton": "Once the tool has been configured, this button allows you to run the tool on all the selected PDFs.", + "results": "After the tool has finished running, the Review step will show a preview of the results in this panel, and allow you to undo the operation or download the file. ", + "fileReplacement": "The modified file will replace the original file in the Workbench automatically, allowing you to easily run it through more tools.", + "pinButton": "You can use the Pin button if you'd rather your files stay active after running tools on them.", + "wrapUp": "You're all set! You've learnt about the main areas of the app and how to use them. Click the Help button whenever you like to see this tour again.", + "previous": "Previous", + "next": "Next", + "finish": "Finish", + "startTour": "Start Tour", + "startTourDescription": "Take a guided tour of Stirling PDF's key features" + }, + "workspace": { + "title": "Workspace", + "people": { + "title": "People", + "description": "Manage workspace members and their permissions", + "loading": "Loading people...", + "searchMembers": "Search members...", + "addMembers": "Add Members", + "inviteMembers": { + "label": "Invite Members", + "subtitle": "Type or paste in emails below, separated by commas. Your workspace will be billed by members." + }, + "user": "User", + "role": "Role", + "team": "Team", + "status": "Status", + "actions": "Actions", + "noMembersFound": "No members found", + "active": "Active", + "disabled": "Disabled", + "activeSession": "Active session", + "member": "Member", + "admin": "Admin", + "roleDescriptions": { + "admin": "Can manage settings and invite members, with full administrative access.", + "member": "Can view and edit shared files, but cannot manage workspace settings or members." + }, + "editRole": "Edit Role", + "enable": "Enable", + "disable": "Disable", + "deleteUser": "Delete User", + "deleteUserSuccess": "User deleted successfully", + "deleteUserError": "Failed to delete user", + "confirmDelete": "Are you sure you want to delete this user? This action cannot be undone.", + "addMember": { + "title": "Add Member", + "username": "Username (Email)", + "usernamePlaceholder": "user@example.com", + "password": "Password", + "passwordPlaceholder": "Enter password", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "forcePasswordChange": "Force password change on first login", + "cancel": "Cancel", + "submit": "Add Member", + "usernameRequired": "Username and password are required", + "passwordTooShort": "Password must be at least 6 characters", + "success": "User created successfully", + "error": "Failed to create user" + }, + "editMember": { + "title": "Edit Member", + "editing": "Editing:", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "cancel": "Cancel", + "submit": "Update Member", + "success": "User updated successfully", + "error": "Failed to update user" + }, + "toggleEnabled": { + "success": "User status updated successfully", + "error": "Failed to update user status" + }, + "delete": { + "success": "User deleted successfully", + "error": "Failed to delete user" + }, + "emailInvite": { + "tab": "Email Invite", + "description": "Type or paste in emails below, separated by commas. Users will receive login credentials via email.", + "emails": "Email Addresses", + "emailsPlaceholder": "user1@example.com, user2@example.com", + "emailsRequired": "At least one email address is required", + "submit": "Send Invites", + "success": "user(s) invited successfully", + "partialSuccess": "Some invites failed", + "allFailed": "Failed to invite users", + "error": "Failed to send invites" + }, + "directInvite": { + "tab": "Direct Create" + }, + "inviteLinkTab": { + "tab": "Invite Link" + }, + "inviteLink": { + "description": "Generate a secure link that allows the user to set their own password", + "email": "Email Address", + "emailPlaceholder": "user@example.com (optional)", + "emailDescription": "Optional - leave blank for a general invite link that can be used by anyone", + "emailRequired": "Email address is required", + "emailOptional": "Optional - leave blank for a general invite link", + "emailRequiredForSend": "Email address is required to send email notification", + "expiryHours": "Expiry Hours", + "expiryDescription": "How many hours until the link expires", + "sendEmail": "Send invite link via email", + "sendEmailDescription": "If enabled, the invite link will be sent to the specified email address", + "smtpRequired": "SMTP not configured", + "generate": "Generate Link", + "generated": "Invite Link Generated", + "copied": "Link copied to clipboard", + "success": "Invite link generated successfully", + "successWithEmail": "Invite link generated and sent via email", + "emailFailed": "Invite link generated, but email failed", + "emailFailedDetails": "Error: {0}. Please share the invite link manually.", + "error": "Failed to generate invite link", + "submit": "Generate Invite Link" + }, + "inviteMode": { + "username": "Username", + "email": "Email", + "link": "Link", + "emailDisabled": "Email invites require SMTP configuration and mail.enableInvites=true in settings" + }, + "license": { + "users": "users", + "availableSlots": "Available Slots", + "grandfathered": "Grandfathered", + "grandfatheredShort": "{{count}} grandfathered", + "fromLicense": "from license", + "slotsAvailable": "{{count}} user slot(s) available", + "noSlotsAvailable": "No slots available", + "currentUsage": "Currently using {{current}} of {{max}} user licences" + } + }, + "teams": { + "title": "Teams", + "description": "Manage teams and organize workspace members", + "loading": "Loading teams...", + "loadingDetails": "Loading team details...", + "createNewTeam": "Create New Team", + "teamName": "Team Name", + "totalMembers": "Total Members", + "actions": "Actions", + "noTeamsFound": "No teams found", + "noMembers": "No members in this team", + "system": "System", + "addMember": "Add Member", + "viewTeam": "View Team", + "removeMember": "Remove from team", + "cannotRemoveFromSystemTeam": "Cannot remove from system team", + "renameTeamLabel": "Rename Team", + "deleteTeamLabel": "Delete Team", + "cannotDeleteInternal": "Cannot delete the Internal team", + "confirmDelete": "Are you sure you want to delete this team? This team must be empty to delete.", + "confirmRemove": "Remove user from this team?", + "cannotRenameInternal": "Cannot rename the Internal team", + "cannotAddToInternal": "Cannot add members to the Internal team", + "teamNotFound": "Team not found", + "backToTeams": "Back to Teams", + "memberCount": "{{count}} members", + "removeMemberSuccess": "User removed from team", + "removeMemberError": "Failed to remove user from team", + "createTeam": { + "title": "Create New Team", + "teamName": "Team Name", + "teamNamePlaceholder": "Enter team name", + "cancel": "Cancel", + "submit": "Create Team", + "nameRequired": "Team name is required", + "success": "Team created successfully", + "error": "Failed to create team" + }, + "renameTeam": { + "title": "Rename Team", + "renaming": "Renaming:", + "newTeamName": "New Team Name", + "newTeamNamePlaceholder": "Enter new team name", + "cancel": "Cancel", + "submit": "Rename Team", + "nameRequired": "Team name is required", + "success": "Team renamed successfully", + "error": "Failed to rename team" + }, + "deleteTeam": { + "success": "Team deleted successfully", + "error": "Failed to delete team. Make sure the team is empty.", + "teamMustBeEmpty": "Team must be empty before deletion" + }, + "addMemberToTeam": { + "title": "Add Member to Team", + "addingTo": "Adding to", + "selectUser": "Select User", + "selectUserPlaceholder": "Choose a user", + "selectUserRequired": "Please select a user", + "currentlyIn": "currently in", + "willBeMoved": "Note: This user will be moved from their current team to this team.", + "cancel": "Cancel", + "submit": "Add Member", + "userRequired": "Please select a user", + "success": "Member added to team successfully", + "error": "Failed to add member to team" + }, + "changeTeam": { + "label": "Change Team", + "title": "Change Team", + "changing": "Moving", + "selectTeam": "Select Team", + "selectTeamPlaceholder": "Choose a team", + "selectTeamRequired": "Please select a team", + "success": "Team changed successfully", + "error": "Failed to change team", + "submit": "Change Team" + } + } + }, + "plan": { + "currency": "Currency", + "popular": "Popular", + "current": "Current Plan", + "upgrade": "Upgrade", + "contact": "Contact Us", + "customPricing": "Custom", + "showComparison": "Compare All Features", + "hideComparison": "Hide Feature Comparison", + "featureComparison": "Feature Comparison", + "activePlan": { + "title": "Active Plan", + "subtitle": "Your current subscription details" + }, + "availablePlans": { + "title": "Available Plans", + "subtitle": "Choose the plan that fits your needs" + }, + "static": { + "title": "Billing Information", + "message": "Online billing is not currently configured. To upgrade your plan or manage subscriptions, please contact us directly.", + "contactSales": "Contact Sales", + "contactToUpgrade": "Contact us to upgrade or customize your plan", + "maxUsers": "Max Users", + "upTo": "Up to" + }, + "period": { + "month": "month" + }, + "free": { + "name": "Free", + "highlight1": "Limited Tool Usage Per week", + "highlight2": "Access to all tools", + "highlight3": "Community support" + }, + "pro": { + "name": "Pro", + "highlight1": "Unlimited Tool Usage", + "highlight2": "Advanced PDF tools", + "highlight3": "No watermarks" + }, + "enterprise": { + "name": "Enterprise", + "highlight1": "Custom pricing", + "highlight2": "Dedicated support", + "highlight3": "Latest features" + }, + "feature": { + "title": "Feature", + "pdfTools": "Basic PDF Tools", + "fileSize": "File Size Limit", + "automation": "Automate tool workflows", + "api": "API Access", + "priority": "Priority Support", + "customPricing": "Custom Pricing" + } + }, + "subscription": { + "status": { + "active": "Active", + "pastDue": "Past Due", + "canceled": "Canceled", + "incomplete": "Incomplete", + "trialing": "Trial", + "none": "No Subscription" + }, + "renewsOn": "Renews on {{date}}", + "cancelsOn": "Cancels on {{date}}" + }, + "billing": { + "manageBilling": "Manage Billing", + "portal": { + "error": "Failed to open billing portal" + } + }, + "payment": { + "preparing": "Preparing your checkout...", + "upgradeTitle": "Upgrade to {{planName}}", + "success": "Payment Successful!", + "successMessage": "Your subscription has been activated successfully. You will receive a confirmation email shortly.", + "autoClose": "This window will close automatically...", + "error": "Payment Error" + }, + "firstLogin": { + "title": "First Time Login", + "welcomeTitle": "Welcome!", + "welcomeMessage": "For security reasons, you must change your password on your first login.", + "loggedInAs": "Logged in as", + "error": "Error", + "currentPassword": "Current Password", + "enterCurrentPassword": "Enter your current password", + "newPassword": "New Password", + "enterNewPassword": "Enter new password (min 8 characters)", + "confirmPassword": "Confirm New Password", + "reEnterNewPassword": "Re-enter new password", + "changePassword": "Change Password", + "allFieldsRequired": "All fields are required", + "passwordsDoNotMatch": "New passwords do not match", + "passwordTooShort": "Password must be at least 8 characters", + "passwordMustBeDifferent": "New password must be different from current password", + "passwordChangedSuccess": "Password changed successfully! Please log in again.", + "passwordChangeFailed": "Failed to change password. Please check your current password." + }, + "invite": { + "welcome": "Welcome to Stirling PDF", + "invalidToken": "Invalid invitation link", + "validationError": "Failed to validate invitation link", + "passwordRequired": "Password is required", + "passwordTooShort": "Password must be at least 6 characters", + "passwordMismatch": "Passwords do not match", + "acceptError": "Failed to create account", + "validating": "Validating invitation...", + "invalidInvitation": "Invalid Invitation", + "goToLogin": "Go to Login", + "welcomeTitle": "You've been invited!", + "welcomeSubtitle": "Complete your account setup to get started", + "accountFor": "Creating account for", + "linkExpires": "Link expires", + "email": "Email address", + "emailPlaceholder": "Enter your email address", + "emailRequired": "Email address is required", + "invalidEmail": "Invalid email address", + "choosePassword": "Choose a password", + "passwordPlaceholder": "Enter your password", + "confirmPassword": "Confirm password", + "confirmPasswordPlaceholder": "Re-enter your password", + "createAccount": "Create Account", + "creating": "Creating Account...", + "alreadyHaveAccount": "Already have an account?", + "signIn": "Sign in" + }, + "audit": { + "error": { + "title": "Error loading audit system" + }, + "notAvailable": "Audit system not available", + "notAvailableMessage": "The audit system is not configured or not available.", + "disabled": "Audit logging is disabled", + "disabledMessage": "Enable audit logging in your application configuration to track system events.", + "systemStatus": { + "title": "System Status", + "status": "Audit Logging", + "enabled": "Enabled", + "disabled": "Disabled", + "level": "Audit Level", + "retention": "Retention Period", + "days": "days", + "totalEvents": "Total Events" + }, + "tabs": { + "dashboard": "Dashboard", + "events": "Audit Events", + "export": "Export" + }, + "charts": { + "title": "Audit Dashboard", + "error": "Error loading charts", + "day": "Day", + "week": "Week", + "month": "Month", + "byType": "Events by Type", + "byUser": "Events by User", + "overTime": "Events Over Time" + }, + "events": { + "title": "Audit Events", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "error": "Error loading events", + "noEvents": "No events found", + "timestamp": "Timestamp", + "type": "Type", + "user": "User", + "ipAddress": "IP Address", + "actions": "Actions", + "viewDetails": "View Details", + "eventDetails": "Event Details", + "details": "Details" + }, + "export": { + "title": "Export Audit Data", + "description": "Export audit events to CSV or JSON format. Use filters to limit the exported data.", + "format": "Export Format", + "filters": "Filters (Optional)", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "exportButton": "Export Data", + "error": "Failed to export data" + } + }, + "usage": { + "noData": "No data available", + "error": "Error loading usage statistics", + "noDataMessage": "No usage statistics are currently available.", + "controls": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All", + "refresh": "Refresh", + "dataTypeLabel": "Data Type:", + "dataType": { + "all": "All", + "api": "API", + "ui": "UI" + } + }, + "showing": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All" + }, + "stats": { + "totalEndpoints": "Total Endpoints", + "totalVisits": "Total Visits", + "showing": "Showing", + "selectedVisits": "Selected Visits" + }, + "chart": { + "title": "Endpoint Usage Chart" + }, + "table": { + "title": "Detailed Statistics", + "endpoint": "Endpoint", + "visits": "Visits", + "percentage": "Percentage", + "noData": "No data available" + } + }, + "backendHealth": { + "checking": "Checking backend status...", + "online": "Backend Online", + "offline": "Backend Offline" + }, + "autoRedact": { + "tags": "⤗āĨ‹ā¤Ē⤍āĨ€ā¤¯ā¤•⤰⤪,⤛ā¤ŋā¤Ēā¤žā¤ā¤‚,ā¤•ā¤žā¤˛ā¤ž ⤕⤰āĨ‡ā¤‚,ā¤•ā¤žā¤˛ā¤ž,ā¤Žā¤žā¤°āĨā¤•⤰,⤛ā¤ŋā¤Ēā¤ž ā¤šāĨā¤†", + "title": "⤏āĨā¤ĩ⤤⤃ ⤗āĨ‹ā¤Ē⤍āĨ€ā¤¯ā¤•⤰⤪", + "header": "⤏āĨā¤ĩ⤤⤃ ⤗āĨ‹ā¤Ē⤍āĨ€ā¤¯ā¤•⤰⤪", + "colorLabel": "⤰⤂⤗", + "textsToRedactLabel": "⤗āĨ‹ā¤Ē⤍āĨ€ā¤¯ā¤•āĨƒā¤¤ ⤕⤰⤍āĨ‡ ⤕āĨ‡ ⤞ā¤ŋā¤ ⤟āĨ‡ā¤•āĨā¤¸āĨā¤Ÿ (ā¤˛ā¤žā¤‡ā¤¨-⤅⤞⤗)", + "textsToRedactPlaceholder": "⤉ā¤Ļā¤žā¤šā¤°ā¤Ŗ \\n⤗āĨ‹ā¤Ē⤍āĨ€ā¤¯ \\n⤟āĨ‰ā¤Ē-⤏āĨ€ā¤•āĨā¤°āĨ‡ā¤Ÿ", + "useRegexLabel": "⤰āĨ‡ā¤—āĨ‡ā¤•āĨā¤¸ ā¤•ā¤ž ⤉ā¤Ē⤝āĨ‹ā¤— ⤕⤰āĨ‡ā¤‚", + "wholeWordSearchLabel": "ā¤ĒāĨ‚⤰āĨā¤Ŗ ā¤ļā¤ŦāĨā¤Ļ ⤖āĨ‹ā¤œ", + "customPaddingLabel": "⤕⤏āĨā¤Ÿā¤Ž ⤅⤤ā¤ŋ⤰ā¤ŋ⤕āĨā¤¤ ā¤ĒāĨˆā¤Ąā¤ŋ⤂⤗", + "convertPDFToImageLabel": "PDF ⤕āĨ‹ PDF-⤛ā¤ĩā¤ŋ ā¤ŽāĨ‡ā¤‚ ā¤Ŧā¤Ļ⤞āĨ‡ā¤‚ (ā¤ŦāĨ‰ā¤•āĨā¤¸ ⤕āĨ‡ ā¤ĒāĨ€ā¤›āĨ‡ ⤕āĨ‡ ⤟āĨ‡ā¤•āĨā¤¸āĨā¤Ÿ ⤕āĨ‹ ā¤šā¤Ÿā¤žā¤¨āĨ‡ ⤕āĨ‡ ⤞ā¤ŋā¤ ⤉ā¤Ē⤝āĨ‹ā¤— ⤕ā¤ŋā¤¯ā¤ž ā¤œā¤žā¤¤ā¤ž ā¤šāĨˆ)", + "submitButton": "ā¤œā¤Žā¤ž ⤕⤰āĨ‡ā¤‚" + }, + "replaceColorPdf": { + "tags": "⤰⤂⤗ ā¤Ŧā¤Ļ⤞āĨ‡ā¤‚,ā¤ĒāĨƒā¤ˇāĨā¤  ā¤•ā¤žā¤°āĨā¤¯,ā¤ŦāĨˆā¤• ā¤ā¤‚ā¤Ą,⤏⤰āĨā¤ĩ⤰ ā¤¸ā¤žā¤‡ā¤Ą" } -} \ No newline at end of file +} diff --git a/frontend/public/locales/hr-HR/translation.json b/frontend/public/locales/hr-HR/translation.json index 6d798a0df..795cc75fa 100644 --- a/frontend/public/locales/hr-HR/translation.json +++ b/frontend/public/locales/hr-HR/translation.json @@ -1,4 +1,40 @@ { + "toolPanel": { + "modePrompt": { + "title": "Choose how you browse tools", + "description": "Preview both layouts and decide how you want to explore Stirling PDF tools.", + "sidebarTitle": "Sidebar mode", + "sidebarDescription": "Keep tools alongside your workspace for quick switching.", + "recommended": "Recommended", + "chooseSidebar": "Use sidebar mode", + "fullscreenTitle": "Fullscreen mode - (legacy)", + "fullscreenDescription": "Browse every tool in a catalogue that covers the workspace until you pick one.", + "chooseFullscreen": "Use fullscreen mode", + "dismiss": "Maybe later" + }, + "fullscreen": { + "showDetails": "Show Details", + "comingSoon": "Coming soon:", + "favorite": "Add to favourites", + "favorites": "Favourites", + "heading": "All tools (fullscreen view)", + "noResults": "Try adjusting your search or toggle descriptions to find what you need.", + "recommended": "Recommended", + "unfavorite": "Remove from favourites" + }, + "placeholder": "Choose a tool to get started", + "toggle": { + "fullscreen": "Switch to fullscreen mode", + "sidebar": "Switch to sidebar mode" + } + }, + "unsavedChanges": "You have unsaved changes to your PDF.", + "areYouSure": "Are you sure you want to leave?", + "unsavedChangesTitle": "Unsaved Changes", + "keepWorking": "Keep Working", + "discardChanges": "Discard & Leave", + "applyAndContinue": "Save & Leave", + "exportAndContinue": "Export & Continue", "language": { "direction": "ltr" }, @@ -18,8 +54,26 @@ "customTextDesc": "Prilagođeni tekst", "numberPagesDesc": "Koje stranice numerirati, zadano je 'sve', također prihvaća 1-5 ili 2,5,9 itd.", "customNumberDesc": "Zadano je {n}, također prihvaća 'Stranica {n} od {total}', 'Tekst-{n}', '{ime datoteke}-{n}'", - "submit": "Dodaj brojeve stranica" + "submit": "Dodaj brojeve stranica", + "configuration": "Configuration", + "customize": "Customize Appearance", + "pagesAndStarting": "Pages & Starting Number", + "positionAndPages": "Position & Pages", + "error": { + "failed": "Add page numbers operation failed" + }, + "results": { + "title": "Page Number Results" + }, + "preview": "Position Selection", + "previewDisclaimer": "Preview is approximate. Final output may vary due to PDF font metrics." }, + "pageSelectionPrompt": "Prilagođeni odabir stranica (unesi listu brojeva stranica ili funkcija, kao ÅĄto su 2n+1, razdvojene zarezima) :", + "startingNumberTooltip": "The first number to display. Subsequent pages will increment from this number.", + "marginTooltip": "Distance between the page number and the edge of the page.", + "fontSizeTooltip": "Size of the page number text in points. Larger numbers create bigger text.", + "fontTypeTooltip": "Font family for the page numbers. Choose based on your document style.", + "customTextTooltip": "Optional custom format for page numbers. Use {n} as placeholder for the number. Example: \"Page {n}\" will show \"Page 1\", \"Page 2\", etc.", "pdfPrompt": "Odaberi PDF(ove)", "multiPdfPrompt": "Odaberi PDF-ove (2+)", "multiPdfDropPrompt": "Odaberi (ili povuci i ispusti) sve potrebne PDF-ove", @@ -30,15 +84,41 @@ "uploadLimitExceededPlural": "are too large. Maximum allowed size is", "processTimeWarning": "Upozorenje: Ovaj proces moÅže trajati i do minutu, u zavisnosti od veličine dokumenta", "pageOrderPrompt": "Prilagođeni redoslijed stranica (unesi listu brojeva stranica ili funkcija, kao ÅĄto su 2n+1, razdvojene zarezima) :", - "pageSelectionPrompt": "Prilagođeni odabir stranica (unesi listu brojeva stranica ili funkcija, kao ÅĄto su 2n+1, razdvojene zarezima) :", "goToPage": "Idi na stranicu", "true": "Točno", "false": "Netočno", "unknown": "Nepoznato", + "app": { + "description": "The Free Adobe Acrobat alternative (10M+ Downloads)" + }, "save": "Spremi", "saveToBrowser": "spremi u Preglednik", + "download": "Preuzmi datoteku", + "pin": "Pin File (keep active after tool run)", + "unpin": "Unpin File (replace after tool run)", + "undoOperationTooltip": "Click to undo the last operation and restore the original files", + "undo": "Undo", + "moreOptions": "More Options", + "editYourNewFiles": "Edit your new file(s)", "close": "Zatvori", + "openInViewer": "Open in Viewer", + "confirmClose": "Confirm Close", + "confirmCloseMessage": "Are you sure you want to close this file?", + "confirmCloseCancel": "Cancel", + "confirmCloseConfirm": "Close File", + "fileSelected": "Selected: {{filename}}", + "chooseFile": "Choose File", "filesSelected": "odabrane datoteke", + "files": { + "title": "Files", + "upload": "Upload", + "uploadFiles": "Upload Files", + "addFiles": "Add files", + "selectFromWorkbench": "Select files from the workbench or ", + "selectMultipleFromWorkbench": "Select at least {{count}} files from the workbench or ", + "created": "Created", + "size": "File Size" + }, "noFavourites": "Nema dodanih favorita", "downloadComplete": "Preuzimanje zavrÅĄeno", "bored": "Dosađujete se čekajući?", @@ -56,7 +136,10 @@ }, "error": { "pdfPassword": "PDF dokument je ÅĄifriran i zaporka nije dana ili je netočna", + "encryptedPdfMustRemovePassword": "This PDF is encrypted or password-protected. Please unlock it before converting to PDF/A.", + "incorrectPasswordProvided": "The PDF password is incorrect or not provided.", "_value": "GreÅĄka", + "dismissAllErrors": "Dismiss All Errors", "sorry": "Oprostite zbog problema!", "needHelp": "Trebate pomoć / PronaÅĄli ste problem?", "contactTip": "Ako i dalje imate problema, ne ustručavajte se obratiti nam se za pomoć. Tiket moÅžete poslati na naÅĄoj GitHub stranici ili nas kontaktirati putem Discorda:", @@ -71,6 +154,10 @@ "githubSubmit": "GitHub - PoÅĄaljite ticket", "discordSubmit": "Discord - PoÅĄalji objavu podrÅĄke" }, + "warning": { + "tooltipTitle": "Warning" + }, + "edit": "Edit", "delete": "IzbriÅĄi", "username": "Korisničko ime", "password": "Zaporka", @@ -82,6 +169,7 @@ "green": "Zeleno", "blue": "Plavo", "custom": "Prilagođeno...", + "comingSoon": "Coming soon", "WorkInProgess": "Radovi u tijeku, u slučaju greÅĄaka molimo prijavite probleme!", "poweredBy": "Pokreće", "yes": "Da", @@ -115,12 +203,14 @@ "page": "Stranica", "pages": "Stranice", "loading": "Učitavanje...", + "review": "Review", "addToDoc": "Dodaj u dokument", "reset": "Reset", "apply": "Apply", "noFileSelected": "No file selected. Please upload one.", "legal": { "privacy": "Politika privatnosti", + "iAgreeToThe": "I agree to all of the", "terms": "Uspe sodrÅžine", "accessibility": "Dostupnost", "cookie": "Politika kolačića", @@ -160,6 +250,7 @@ "title": "ÅŊelite li da stvarate Stirling PDF bolji?", "paragraph1": "Stirling PDF ima uključene analitike koje nam pomaÅžu da proizvod poboljÅĄamo. Niste pratili nikakva osobna informacija ni sadrÅžaj datoteka.", "paragraph2": "Razmotrite omogućivanje analitičkih podataka kako biste stvorili Stirling-PDF veće i da bismo bolje razumeli naÅĄih korisnika.", + "learnMore": "Learn more", "enable": "Omogući analitike", "disable": "Onemogući analitike", "settings": "MoÅžete promijeniti postavke za analitike u datoteci config/settings.yml" @@ -203,6 +294,54 @@ "cacheInputs": { "name": "Spremi unose obrazaca", "help": "omogućiti pohranjivanje prethodno koriÅĄtenih ulaza za buduća izvođenja" + }, + "general": { + "title": "General", + "description": "Configure general application preferences.", + "account": "Account", + "accountDescription": "Manage your account settings", + "user": "User", + "signedInAs": "Signed in as", + "logout": "Log out", + "enableFeatures": { + "title": "For System Administrators", + "intro": "Enable user authentication, team management, and workspace features for your organization.", + "action": "Configure", + "and": "and", + "benefit": "Enables user roles, team collaboration, admin controls, and enterprise features.", + "learnMore": "Learn more in documentation", + "dismiss": "Dismiss" + }, + "autoUnzip": "Auto-unzip API responses", + "autoUnzipDescription": "Automatically extract files from ZIP responses", + "autoUnzipTooltip": "Automatically extract ZIP files returned from API operations. Disable to keep ZIP files intact. This does not affect automation workflows.", + "autoUnzipFileLimit": "Auto-unzip file limit", + "autoUnzipFileLimitDescription": "Maximum number of files to extract from ZIP", + "autoUnzipFileLimitTooltip": "Only unzip if the ZIP contains this many files or fewer. Set higher to extract larger ZIPs.", + "defaultToolPickerMode": "Default tool picker mode", + "defaultToolPickerModeDescription": "Choose whether the tool picker opens in fullscreen or sidebar by default", + "mode": { + "fullscreen": "Fullscreen", + "sidebar": "Sidebar" + } + }, + "hotkeys": { + "title": "Keyboard Shortcuts", + "description": "Hover a tool to see its shortcut or customise it below. Click \"Change shortcut\" and press a new key combination. Press Esc to cancel.", + "errorModifier": { + "mac": "Include ⌘ (Command), âŒĨ (Option), or another modifier in your shortcut.", + "windows": "Include Ctrl, Alt, or another modifier in your shortcut." + }, + "errorConflict": "Shortcut already used by {{tool}}.", + "none": "Not assigned", + "customBadge": "Custom", + "defaultLabel": "Default: {{shortcut}}", + "capturing": "Press keysâ€Ļ (Esc to cancel)", + "change": "Change shortcut", + "reset": "Reset", + "shortcut": "Shortcut", + "noShortcut": "No shortcut set", + "searchPlaceholder": "Search tools..." } }, "changeCreds": { @@ -274,8 +413,10 @@ "top20": "Top 20", "all": "All", "refresh": "Refresh", - "includeHomepage": "Include Homepage ('/')", - "includeLoginPage": "Include Login Page ('/login')", + "dataTypeLabel": "Data Type:", + "dataTypeAll": "All", + "dataTypeApi": "API", + "dataTypeUi": "UI", "totalEndpoints": "Total Endpoints", "totalVisits": "Total Visits", "showing": "Showing", @@ -290,7 +431,9 @@ "top": "Top", "numberOfVisits": "Number of Visits", "visitsTooltip": "Visits: {0} ({1}% of total)", - "retry": "Retry" + "retry": "Retry", + "includeHomepage": "Include Homepage ('/')", + "includeLoginPage": "Include Login Page ('/login')" }, "database": { "title": "Database Import/Export", @@ -331,22 +474,310 @@ "alphabetical": "Alphabetical", "globalPopularity": "Global Popularity", "sortBy": "Sort by:", + "mobile": { + "brandAlt": "Stirling PDF logo", + "openFiles": "Open files", + "swipeHint": "Swipe left or right to switch views", + "tools": "Tools", + "toolsSlide": "Tool selection panel", + "viewSwitcher": "Switch workspace view", + "workbenchSlide": "Workspace panel", + "workspace": "Workspace" + }, "multiTool": { + "tags": "multiple,tools", "title": "PDF ViÅĄestruki alat", "desc": "Spajanje, rotiranje, preuređivanje i uklanjanje stranica" }, "merge": { + "tags": "combine,join,unite", "title": "Spajanje", "desc": "Jednostavno spojite viÅĄe PDF-ova u jedan." }, "split": { + "tags": "divide,separate,break", "title": "Razdvajanje", "desc": "Razdvojite PDF-ove u viÅĄe dokumenata" }, "rotate": { + "tags": "turn,flip,orient", "title": "Rotacija", "desc": "Jednostavno rotirajte vaÅĄe PDF-ove." }, + "convert": { + "tags": "transform,change", + "title": "Pretvori", + "desc": "Convert files between different formats" + }, + "pdfOrganiser": { + "tags": "organize,rearrange,reorder", + "title": "Organiziranje", + "desc": "Uklonite/preuredite stranice bilo kojim redoslijedom" + }, + "addImage": { + "tags": "insert,embed,place", + "title": "Dodaj sliku", + "desc": "Dodaje sliku na zadano mjesto u PDF-u" + }, + "addAttachments": { + "tags": "embed,attach,include", + "title": "Add Attachments", + "desc": "Add or remove embedded files (attachments) to/from a PDF" + }, + "watermark": { + "tags": "stamp,mark,overlay", + "title": "Dodaj vodeni Åžig", + "desc": "DDodajte prilagođeni vodeni Åžig svom PDF dokumentu." + }, + "removePassword": { + "tags": "unlock", + "title": "Ukloni lozinku", + "desc": "Uklonite zaÅĄtitu lozinkom sa svog PDF dokumenta.." + }, + "compress": { + "tags": "shrink,reduce,optimize", + "title": "Komprimiraj", + "desc": "Komprimirajte PDF-ove kako biste smanjili njihovu veličinu." + }, + "unlockPDFForms": { + "tags": "unlock,enable,edit", + "title": "Unlock PDF Forms", + "desc": "Remove read-only property of form fields in a PDF document." + }, + "changeMetadata": { + "tags": "edit,modify,update", + "title": "Promjena metapodataka", + "desc": "Promjeni/Ukloni/Dodaj metapodatke iz PDF dokumenta" + }, + "ocr": { + "tags": "extract,scan", + "title": "OCR / ČiÅĄÄ‡enje skeniranih dokumenata", + "desc": "ČiÅĄÄ‡enje skenira i otkriva tekst sa slika unutar PDF-a i ponovno ga dodaje kao tekst." + }, + "extractImages": { + "tags": "pull,save,export", + "title": "Ekstrakt slika", + "desc": "Izdvaja sve slike iz PDF-a i sprema ih u zip format" + }, + "scannerImageSplit": { + "tags": "detect,split,photos", + "title": "Detect & Split Scanned Photos", + "desc": "Detect and split scanned photos into separate pages" + }, + "sign": { + "tags": "signature,autograph", + "title": "Potpisati", + "desc": "Dodaje potpis u PDF crteÅžom, tekstom ili slikom" + }, + "flatten": { + "tags": "simplify,remove,interactive", + "title": "Ravnanje (Flatten)", + "desc": "Uklonite sve interaktivne elemente i obrasce iz PDF-a" + }, + "certSign": { + "tags": "authenticate,PEM,P12,official,encrypt,sign,certificate,PKCS12,JKS,server,manual,auto", + "title": "PotpiÅĄite s certifikatom", + "desc": "Potpisuje PDF s certifikatom/ključem (PEM/P12)" + }, + "repair": { + "tags": "fix,restore", + "title": "Popravi", + "desc": "PokuÅĄava popraviti oÅĄtećeni/pokvareni PDF" + }, + "removeBlanks": { + "tags": "delete,clean,empty", + "title": "Ukloni prazne stranice", + "desc": "Otkriva i uklanja prazne stranice iz dokumenta" + }, + "removeAnnotations": { + "tags": "delete,clean,strip", + "title": "Ukloni komentare", + "desc": "Uklanja sve komentare/anotacije iz PDF-a" + }, + "compare": { + "tags": "difference", + "title": "Uporedi", + "desc": "Uspoređuje i pokazuje razlike između 2 PDF dokumenta" + }, + "removeCertSign": { + "tags": "remove,delete,unlock", + "title": "Ukloni potpis sertifikata", + "desc": "Uklonite potpis sertifikata iz PDF-a" + }, + "pageLayout": { + "tags": "layout,arrange,combine", + "title": "Izgled s viÅĄe stranica", + "desc": "Spojite viÅĄe stranica PDF dokumenta u jednu stranicu" + }, + "bookletImposition": { + "tags": "booklet,print,binding", + "title": "Booklet Imposition", + "desc": "Create booklets with proper page ordering and multi-page layout for printing and binding" + }, + "scalePages": { + "tags": "resize,adjust,scale", + "title": "Prilagodite veličinu/razmjer stranice", + "desc": "Promijenite veličinu/razmjer stranice i/ili njezin sadrÅžaj." + }, + "addPageNumbers": { + "tags": "number,pagination,count", + "title": "Dodaj brojeve stranica", + "desc": "Dodajte brojeve stranica kroz dokument na određeno mjesto" + }, + "autoRename": { + "tags": "auto-detect,header-based,organize,relabel", + "title": "Auto Rename PDF File", + "desc": "Auto renames a PDF file based on its detected header" + }, + "adjustContrast": { + "tags": "contrast,brightness,saturation", + "title": "Podesi boje/kontrast", + "desc": "Podesite kontrast, zasićenost i svjetlinu PDF-a" + }, + "crop": { + "tags": "trim,cut,resize", + "title": "IzreÅžite PDF", + "desc": "IzreÅžite PDF kako biste smanjili njegovu veličinu (zadrÅžava tekst!)" + }, + "autoSplitPDF": { + "tags": "auto,split,QR", + "title": "Automatsko dijeljenje stranica", + "desc": "Automatsko dijeljenje skeniranog PDF-a s fizičkim QR kodom za dijeljenje stranica" + }, + "sanitize": { + "tags": "clean,purge,remove", + "title": "Sanitise", + "desc": "Remove potentially harmful elements from PDF files" + }, + "getPdfInfo": { + "tags": "info,metadata,details", + "title": "Dohvati SVE informacije o PDF-u", + "desc": "Dohvaća sve moguće informacije o PDF-ovima" + }, + "pdfToSinglePage": { + "tags": "combine,merge,single", + "title": "PDF u Jednu Veliku Stranicu", + "desc": "Spaja sve PDF stranice u jednu veliku stranicu" + }, + "showJS": { + "tags": "javascript,code,script", + "title": "PrikaÅži JavaScript", + "desc": "PretraÅžuje i prikazuje bilo koji JavaScript umetnut u PDF" + }, + "redact": { + "tags": "censor,blackout,hide", + "title": "Manual Redaction", + "desc": "Redacts a PDF based on selected text, drawn shapes and/or selected page(s)" + }, + "splitBySections": { + "tags": "split,sections,divide", + "title": "Split PDF by Sections", + "desc": "Divide each page of a PDF into smaller horizontal and vertical sections" + }, + "addStamp": { + "tags": "stamp,mark,seal", + "title": "Add Stamp to PDF", + "desc": "Add text or add image stamps at set locations" + }, + "removeImage": { + "tags": "remove,delete,clean", + "title": "Ukloni sliku", + "desc": "Ukloni sliku iz PDF-a kako bi se smanjio veličina datoteke" + }, + "splitByChapters": { + "tags": "split,chapters,structure", + "title": "Podijeli PDF prema glavama", + "desc": "Podijeli PDF na viÅĄe datoteka prema njegovom strukturnom obliku glava." + }, + "validateSignature": { + "tags": "validate,verify,certificate", + "title": "Validate PDF Signature", + "desc": "Verify digital signatures and certificates in PDF documents" + }, + "swagger": { + "tags": "API,documentation,test", + "title": "API Documentation", + "desc": "View API documentation and test endpoints" + }, + "scannerEffect": { + "tags": "scan,simulate,create", + "title": "Scanner Effect", + "desc": "Create a PDF that looks like it was scanned" + }, + "editTableOfContents": { + "tags": "bookmarks,contents,edit", + "title": "Edit Table of Contents", + "desc": "Add or edit bookmarks and table of contents in PDF documents" + }, + "manageCertificates": { + "tags": "certificates,import,export", + "title": "Manage Certificates", + "desc": "Import, export, or delete digital certificate files used for signing PDFs." + }, + "read": { + "tags": "view,open,display", + "title": "Read", + "desc": "View and annotate PDFs. Highlight text, draw, or insert comments for review and collaboration." + }, + "reorganizePages": { + "tags": "rearrange,reorder,organize", + "title": "Reorganize Pages", + "desc": "Rearrange, duplicate, or delete PDF pages with visual drag-and-drop control." + }, + "extractPages": { + "tags": "pull,select,copy", + "title": "Izdvojiti stranice", + "desc": "Extract specific pages from a PDF document" + }, + "removePages": { + "tags": "delete,extract,exclude", + "title": "Ukloniti", + "desc": "IzbriÅĄite neÅželjene stranice iz svog PDF dokumenta." + }, + "autoSizeSplitPDF": { + "tags": "auto,split,size", + "title": "Automatska podjela po veličini/broju", + "desc": "Podijelite jedan PDF na viÅĄe dokumenata na temelju veličine, broja stranica ili broja dokumenata" + }, + "replaceColor": { + "title": "Replace & Invert Colour", + "desc": "Replace or invert colours in PDF documents" + }, + "devApi": { + "tags": "API,development,documentation", + "title": "API", + "desc": "Link to API documentation" + }, + "devFolderScanning": { + "tags": "automation,folder,scanning", + "title": "Automated Folder Scanning", + "desc": "Link to automated folder scanning guide" + }, + "devSsoGuide": { + "title": "SSO Guide", + "desc": "Link to SSO guide" + }, + "devAirgapped": { + "title": "Air-gapped Setup", + "desc": "Link to air-gapped setup guide" + }, + "addPassword": { + "title": "Dodaj lozinku", + "desc": "Å ifrirajte svoj PDF dokument lozinkom.." + }, + "changePermissions": { + "title": "Promjena dopuÅĄtenja", + "desc": "Change document restrictions and permissions" + }, + "automate": { + "tags": "workflow,sequence,automation", + "title": "Automate", + "desc": "Build multi-step workflows by chaining together PDF actions. Ideal for recurring tasks." + }, + "overlay-pdfs": { + "desc": "Preklapa PDF-ove na drugi PDF", + "title": "Preklapanje PDF-ova" + }, "imageToPDF": { "title": "Slika u PDF", "desc": "Pretvorite sliku (PNG, JPEG, GIF) u PDF." @@ -355,18 +786,6 @@ "title": "PDF u Sliku", "desc": "Pretvorite PDF u sliku. (PNG, JPEG, GIF)" }, - "pdfOrganiser": { - "title": "Organiziranje", - "desc": "Uklonite/preuredite stranice bilo kojim redoslijedom" - }, - "addImage": { - "title": "Dodaj sliku", - "desc": "Dodaje sliku na zadano mjesto u PDF-u" - }, - "watermark": { - "title": "Dodaj vodeni Åžig", - "desc": "DDodajte prilagođeni vodeni Åžig svom PDF dokumentu." - }, "permissions": { "title": "Promjena dopuÅĄtenja", "desc": "Promijenite dopuÅĄtenja svog PDF dokumenta" @@ -375,38 +794,10 @@ "title": "Ukloniti", "desc": "IzbriÅĄite neÅželjene stranice iz svog PDF dokumenta." }, - "addPassword": { - "title": "Dodaj lozinku", - "desc": "Å ifrirajte svoj PDF dokument lozinkom.." - }, - "removePassword": { - "title": "Ukloni lozinku", - "desc": "Uklonite zaÅĄtitu lozinkom sa svog PDF dokumenta.." - }, - "compress": { - "title": "Komprimiraj", - "desc": "Komprimirajte PDF-ove kako biste smanjili njihovu veličinu." - }, - "unlockPDFForms": { - "title": "Unlock PDF Forms", - "desc": "Remove read-only property of form fields in a PDF document." - }, - "changeMetadata": { - "title": "Promjena metapodataka", - "desc": "Promjeni/Ukloni/Dodaj metapodatke iz PDF dokumenta" - }, "fileToPDF": { "title": "Pretvori datoteku u PDF", "desc": "Pretvorite gotovo sve datoteke u PDF (DOCX, PNG, XLS, PPT, TXT i viÅĄe)" }, - "ocr": { - "title": "OCR / ČiÅĄÄ‡enje skeniranih dokumenata", - "desc": "ČiÅĄÄ‡enje skenira i otkriva tekst sa slika unutar PDF-a i ponovno ga dodaje kao tekst." - }, - "extractImages": { - "title": "Ekstrakt slika", - "desc": "Izdvaja sve slike iz PDF-a i sprema ih u zip format" - }, "pdfToPDFA": { "title": "PDF u PDF/A", "desc": "Pretvorite PDF u PDF/A za dugoročnu pohranu" @@ -435,70 +826,14 @@ "title": "Otkrij/razdvoji skenirane fotografije", "desc": "Razdvaja viÅĄe fotografija iz fotografije/PDF-a" }, - "sign": { - "title": "Potpisati", - "desc": "Dodaje potpis u PDF crteÅžom, tekstom ili slikom" - }, - "flatten": { - "title": "Ravnanje (Flatten)", - "desc": "Uklonite sve interaktivne elemente i obrasce iz PDF-a" - }, - "repair": { - "title": "Popravi", - "desc": "PokuÅĄava popraviti oÅĄtećeni/pokvareni PDF" - }, - "removeBlanks": { - "title": "Ukloni prazne stranice", - "desc": "Otkriva i uklanja prazne stranice iz dokumenta" - }, - "removeAnnotations": { - "title": "Ukloni komentare", - "desc": "Uklanja sve komentare/anotacije iz PDF-a" - }, - "compare": { - "title": "Uporedi", - "desc": "Uspoređuje i pokazuje razlike između 2 PDF dokumenta" - }, - "certSign": { - "title": "PotpiÅĄite s certifikatom", - "desc": "Potpisuje PDF s certifikatom/ključem (PEM/P12)" - }, - "removeCertSign": { - "title": "Ukloni potpis sertifikata", - "desc": "Uklonite potpis sertifikata iz PDF-a" - }, - "pageLayout": { - "title": "Izgled s viÅĄe stranica", - "desc": "Spojite viÅĄe stranica PDF dokumenta u jednu stranicu" - }, - "scalePages": { - "title": "Prilagodite veličinu/razmjer stranice", - "desc": "Promijenite veličinu/razmjer stranice i/ili njezin sadrÅžaj." - }, "pipeline": { "title": "Tok rada", "desc": "IzvrÅĄite viÅĄe radnji na PDF-ovima definiranjem skripti u pipeline-u" }, - "addPageNumbers": { - "title": "Dodaj brojeve stranica", - "desc": "Dodajte brojeve stranica kroz dokument na određeno mjesto" - }, "auto-rename": { "title": "Automatsko preimenovanje PDF datoteka", "desc": "Automatski preimenuje PDF datoteku na temelju otkrivenog zaglavlja" }, - "adjustContrast": { - "title": "Podesi boje/kontrast", - "desc": "Podesite kontrast, zasićenost i svjetlinu PDF-a" - }, - "crop": { - "title": "IzreÅžite PDF", - "desc": "IzreÅžite PDF kako biste smanjili njegovu veličinu (zadrÅžava tekst!)" - }, - "autoSplitPDF": { - "title": "Automatsko dijeljenje stranica", - "desc": "Automatsko dijeljenje skeniranog PDF-a s fizičkim QR kodom za dijeljenje stranica" - }, "sanitizePDF": { "title": "Dezinficirati (Sanitize)", "desc": "Uklonite skripte i druge elemente iz PDF datoteka" @@ -519,30 +854,14 @@ "title": "PDF to Markdown", "desc": "Converts any PDF to Markdown" }, - "getPdfInfo": { - "title": "Dohvati SVE informacije o PDF-u", - "desc": "Dohvaća sve moguće informacije o PDF-ovima" - }, "pageExtracter": { "title": "Izdvoji stranicu(e)", "desc": "Izdvaja odabrane stranice iz PDF-a" }, - "pdfToSinglePage": { - "title": "PDF u Jednu Veliku Stranicu", - "desc": "Spaja sve PDF stranice u jednu veliku stranicu" - }, - "showJS": { - "title": "PrikaÅži JavaScript", - "desc": "PretraÅžuje i prikazuje bilo koji JavaScript umetnut u PDF" - }, "autoRedact": { "title": "Automatsko uređivanje", "desc": "Automatski redigira (zacrni) tekst u PDF-u na temelju unosa teksta" }, - "redact": { - "title": "Manual Redaction", - "desc": "Redacts a PDF based on selected text, drawn shapes and/or selected page(s)" - }, "PDFToCSV": { "title": "PDF u CSV", "desc": "Izdvaja tablice iz PDF-a pretvarajući ga u CSV" @@ -551,10 +870,6 @@ "title": "Automatska podjela po veličini/broju", "desc": "Podijelite jedan PDF na viÅĄe dokumenata na temelju veličine, broja stranica ili broja dokumenata" }, - "overlay-pdfs": { - "title": "Preklapanje PDF-ova", - "desc": "Preklapa PDF-ove na drugi PDF" - }, "split-by-sections": { "title": "Podijeli PDF po odjeljcima", "desc": "Svaku stranicu PDF-a podijelite na manje vodoravne i okomite dijelove" @@ -563,43 +878,17 @@ "title": "Dodaj pečat u PDF", "desc": "Dodajte tekst ili dodajte slikovne oznake na postavljenim mjestima" }, - "removeImage": { - "title": "Ukloni sliku", - "desc": "Ukloni sliku iz PDF-a kako bi se smanjio veličina datoteke" - }, - "splitByChapters": { - "title": "Podijeli PDF prema glavama", - "desc": "Podijeli PDF na viÅĄe datoteka prema njegovom strukturnom obliku glava." - }, - "validateSignature": { - "title": "Validate PDF Signature", - "desc": "Verify digital signatures and certificates in PDF documents" - }, "replace-color": { "title": "Replace and Invert Color", "desc": "Zamenite boju teksta i pozadine u PDF-u te inverzirajte cijeli PDF kako bi se smanjila veličina datoteke." }, - "convert": { - "title": "Pretvori" - }, "attachments": { "title": "Add attachments" }, - "extractPages": { - "title": "Izdvojiti stranice" - }, - "removePages": { - "title": "Ukloniti", - "desc": "IzbriÅĄite neÅželjene stranice iz svog PDF dokumenta." - }, "removeImagePdf": { "title": "Ukloni sliku", "desc": "Ukloni sliku iz PDF-a kako bi se smanjio veličina datoteke" }, - "autoSizeSplitPDF": { - "title": "Automatska podjela po veličini/broju", - "desc": "Podijelite jedan PDF na viÅĄe dokumenata na temelju veličine, broja stranica ili broja dokumenata" - }, "adjust-contrast": { "title": "Podesi boje/kontrast", "desc": "Podesite kontrast, zasićenost i svjetlinu PDF-a" @@ -607,11 +896,12 @@ "replaceColorPdf": { "title": "Replace and Invert Color", "desc": "Zamenite boju teksta i pozadine u PDF-u te inverzirajte cijeli PDF kako bi se smanjila veličina datoteke." - }, - "changePermissions": { - "title": "Promjena dopuÅĄtenja" } }, + "landing": { + "addFiles": "Add Files", + "uploadFromComputer": "Upload from computer" + }, "viewPdf": { "tags": "pregled,čitanje,komentiranje,tekst,slika", "title": "View/Edit PDF", @@ -645,17 +935,39 @@ "merge": { "tags": "spajanje,Operacije sa stranicama,Backend,posluÅžiteljska strana", "title": "Spajanje", + "removeDigitalSignature": { + "label": "Remove digital signature in the merged file?", + "tooltip": { + "title": "Remove Digital Signature", + "description": "Digital signatures will be invalidated when merging files. Check this to remove them from the final merged PDF." + } + }, + "generateTableOfContents": { + "label": "Generate table of contents in the merged file?", + "tooltip": { + "title": "Generate Table of Contents", + "description": "Automatically creates a clickable table of contents in the merged PDF based on the original file names and page numbers." + } + }, + "submit": "Spajanje", + "sortBy": { + "description": "Files will be merged in the order they're selected. Drag to reorder or sort below.", + "label": "Sort By", + "filename": "Ime datoteke", + "dateModified": "Date Modified", + "ascending": "Ascending", + "descending": "Descending", + "sort": "Sort" + }, + "error": { + "failed": "An error occurred while merging the PDFs." + }, "header": "Spajanje viÅĄe PDF-ova (2+)", "sortByName": "Poredaj po imenu", "sortByDate": "Poredaj po datumu", - "removeCertSign": "Ukloniti digitalni potpis u kombiniranom datoteku?", - "submit": "Spajanje", - "sortBy": { - "filename": "Ime datoteke" - } + "removeCertSign": "Ukloniti digitalni potpis u kombiniranom datoteku?" }, "split": { - "tags": "Operacije stranice, dijeljenje, viÅĄe stranica, rezanje,posluÅžiteljska strana", "title": "Razdvajanje PDF-a", "header": "Razdvajanje PDF-a", "desc": { @@ -671,25 +983,249 @@ "splitPages": "Unesite stranice za razdvajanje:", "submit": "Razdvoji", "steps": { + "chooseMethod": "Choose Method", "settings": "Postavke" }, + "settings": { + "selectMethodFirst": "Please select a split method first" + }, + "error": { + "failed": "An error occurred while splitting the PDF." + }, + "method": { + "label": "Choose split method", + "placeholder": "Select how to split the PDF" + }, "methods": { + "prefix": { + "splitAt": "Split at", + "splitBy": "Split by" + }, + "byPages": { + "name": "Page Numbers", + "desc": "Extract specific pages (1,3,5-10)", + "tooltip": "Enter page numbers separated by commas or ranges with hyphens" + }, + "bySections": { + "name": "Sections", + "desc": "Divide pages into grid sections", + "tooltip": "Split each page into horizontal and vertical sections" + }, "bySize": { - "name": "Veličina datoteke" + "name": "Veličina datoteke", + "desc": "Limit maximum file size", + "tooltip": "Specify maximum file size (e.g. 10MB, 500KB)" + }, + "byPageCount": { + "name": "Page Count", + "desc": "Fixed pages per file", + "tooltip": "Enter the number of pages for each split file" + }, + "byDocCount": { + "name": "Document Count", + "desc": "Create specific number of files", + "tooltip": "Enter how many files you want to create" + }, + "byChapters": { + "name": "Chapters", + "desc": "Split at bookmark boundaries", + "tooltip": "Uses PDF bookmarks to determine split points" + }, + "byPageDivider": { + "name": "Page Divider", + "desc": "Auto-split with divider sheets", + "tooltip": "Use QR code divider sheets between documents when scanning" } }, "value": { "fileSize": { - "label": "Veličina datoteke" + "label": "Veličina datoteke", + "placeholder": "e.g. 10MB, 500KB" + }, + "pageCount": { + "label": "Pages per File", + "placeholder": "e.g. 5, 10" + }, + "docCount": { + "label": "Number of Files", + "placeholder": "e.g. 3, 5" } - } + }, + "tooltip": { + "header": { + "title": "Split Methods Overview" + }, + "byPages": { + "title": "Split at Page Numbers", + "text": "Split your PDF at specific page numbers. Using 'n' splits after page n. Using 'n-m' splits before page n and after page m.", + "bullet1": "Single split points: 3,7 (splits after pages 3 and 7)", + "bullet2": "Range split points: 3-8 (splits before page 3 and after page 8)", + "bullet3": "Mixed: 2,5-10,15 (splits after page 2, before page 5, after page 10, and after page 15)" + }, + "bySections": { + "title": "Split by Grid Sections", + "text": "Divide each page into a grid of sections. Useful for splitting documents with multiple columns or extracting specific areas.", + "bullet1": "Horizontal: Number of rows to create", + "bullet2": "Vertical: Number of columns to create", + "bullet3": "Merge: Combine all sections into one PDF" + }, + "bySize": { + "title": "Split by File Size", + "text": "Create multiple PDFs that don't exceed a specified file size. Ideal for file size limitations or email attachments.", + "bullet1": "Use MB for larger files (e.g., 10MB)", + "bullet2": "Use KB for smaller files (e.g., 500KB)", + "bullet3": "System will split at page boundaries" + }, + "byCount": { + "title": "Split by Count", + "text": "Create multiple PDFs with a specific number of pages or documents each.", + "bullet1": "Page Count: Fixed number of pages per file", + "bullet2": "Document Count: Fixed number of output files", + "bullet3": "Useful for batch processing workflows" + }, + "byChapters": { + "title": "Split by Chapters", + "text": "Use PDF bookmarks to automatically split at chapter boundaries. Requires PDFs with bookmark structure.", + "bullet1": "Bookmark Level: Which level to split on (1=top level)", + "bullet2": "Include Metadata: Preserve document properties", + "bullet3": "Allow Duplicates: Handle repeated bookmark names" + }, + "byDocCount": { + "bullet1": "Enter the number of output files you want", + "bullet2": "Pages are distributed as evenly as possible", + "bullet3": "Useful when you need a specific number of files", + "text": "Create a specific number of output files by evenly distributing pages across them.", + "title": "Split by Document Count" + }, + "byPageCount": { + "bullet1": "Enter the number of pages per output file", + "bullet2": "Last file may have fewer pages if not evenly divisible", + "bullet3": "Useful for batch processing workflows", + "text": "Create multiple PDFs with a specific number of pages each. Perfect for creating uniform document chunks.", + "title": "Split by Page Count" + }, + "byPageDivider": { + "bullet1": "Print divider sheets from the download link", + "bullet2": "Insert divider sheets between your documents", + "bullet3": "Scan all documents together as one PDF", + "bullet4": "Upload - divider pages are automatically detected and removed", + "bullet5": "Enable Duplex Mode if scanning both sides of divider sheets", + "text": "Automatically split scanned documents using physical divider sheets with QR codes. Perfect for processing multiple documents scanned together.", + "title": "Split by Page Divider" + } + }, + "methodSelection": { + "tooltip": { + "bullet1": "Click on a method card to select it", + "bullet2": "Hover over each card to see a quick description", + "bullet3": "The settings step will appear after you select a method", + "bullet4": "You can change methods at any time before processing", + "header": { + "text": "Choose how you want to split your PDF document. Each method is optimized for different use cases and document types.", + "title": "Split Method Selection" + }, + "title": "Choose Your Split Method" + } + }, + "selectMethod": "Select a split method", + "tags": "Operacije stranice, dijeljenje, viÅĄe stranica, rezanje,posluÅžiteljska strana" }, "rotate": { - "tags": "posluÅžiteljska strana", "title": "Zakreni PDF", + "submit": "Zakreni", + "selectRotation": "Select Rotation Angle (Clockwise)", + "error": { + "failed": "An error occurred while rotating the PDF." + }, + "preview": { + "title": "Rotation Preview" + }, + "rotateLeft": "Rotate Anticlockwise", + "rotateRight": "Rotate Clockwise", + "tooltip": { + "header": { + "title": "Rotate Settings Overview" + }, + "description": { + "text": "Rotate your PDF pages clockwise or anticlockwise in 90-degree increments. All pages in the PDF will be rotated. The preview shows how your document will look after rotation." + }, + "controls": { + "title": "Controls", + "text": "Use the rotation buttons to adjust orientation. Left button rotates anticlockwise, right button rotates clockwise. Each click rotates by 90 degrees." + } + }, + "tags": "posluÅžiteljska strana", "header": "Zakreni PDF", - "selectAngle": "Odaberite kut rotacije (u umnoÅĄcima od 90 stupnjeva):", - "submit": "Zakreni" + "selectAngle": "Odaberite kut rotacije (u umnoÅĄcima od 90 stupnjeva):" + }, + "convert": { + "title": "Pretvori", + "desc": "Convert files between different formats", + "files": "Files", + "selectFilesPlaceholder": "Select files in the main view to get started", + "settings": "Postavke", + "conversionCompleted": "Conversion completed", + "results": "Results", + "defaultFilename": "converted_file", + "conversionResults": "Conversion Results", + "convertFrom": "Convert from", + "convertTo": "Convert to", + "sourceFormatPlaceholder": "Source format", + "targetFormatPlaceholder": "Target format", + "selectSourceFormatFirst": "Select a source format first", + "outputOptions": "Output Options", + "pdfOptions": "PDF Options", + "imageOptions": "Image Options", + "colorType": "Colour Type", + "color": "Boja", + "greyscale": "Sivi tonovi", + "blackwhite": "Black & White", + "dpi": "DPI", + "output": "Output", + "single": "Single", + "multiple": "Multiple", + "fitOption": "Fit Option", + "maintainAspectRatio": "Maintain Aspect Ratio", + "fitDocumentToPage": "Fit Document to Page", + "fillPage": "Ispuni stranicu", + "autoRotate": "Auto Rotate", + "autoRotateDescription": "Automatically rotate images to better fit the PDF page", + "combineImages": "Combine Images", + "combineImagesDescription": "Combine all images into one PDF, or create separate PDFs for each image", + "webOptions": "Web to PDF Options", + "zoomLevel": "Zoom Level", + "emailOptions": "Email to PDF Options", + "includeAttachments": "Include email attachments", + "maxAttachmentSize": "Maximum attachment size (MB)", + "includeAllRecipients": "Include CC and BCC recipients in header", + "downloadHtml": "Download HTML intermediate file instead of PDF", + "pdfaOptions": "PDF/A Options", + "outputFormat": "Output Format", + "pdfaNote": "PDF/A-1b is more compatible, PDF/A-2b supports more features.", + "pdfaDigitalSignatureWarning": "PDF sadrÅži digitalni potpis. U sledećem koraku će biti uklonjen.", + "fileFormat": "File Format", + "wordDoc": "Word Document", + "wordDocExt": "Word Document (.docx)", + "odtExt": "OpenDocument Text (.odt)", + "pptExt": "PowerPoint (.pptx)", + "odpExt": "OpenDocument Presentation (.odp)", + "txtExt": "Plain Text (.txt)", + "rtfExt": "Rich Text Format (.rtf)", + "selectedFiles": "Selected files", + "noFileSelected": "No file selected. Use the file panel to add files.", + "convertFiles": "Convert Files", + "converting": "Converting...", + "downloadConverted": "Download Converted File", + "errorNoFiles": "Please select at least one file to convert.", + "errorNoFormat": "Please select both source and target formats.", + "errorNotSupported": "Conversion from {{from}} to {{to}} is not supported.", + "images": "Images", + "officeDocs": "Office Documents (Word, Excel, PowerPoint)", + "imagesExt": "Images (JPG, PNG, etc.)", + "markdown": "Markdown", + "textRtf": "Text/RTF", + "grayscale": "Sivi tonovi", + "errorConversion": "An error occurred while converting the file." }, "imageToPdf": { "tags": "konverzija,pretvaranje,img,jpg,slika,foto" @@ -727,7 +1263,33 @@ "8": "Ukloni Zadnju", "9": "Ukloni Prvu i Zadnju", "10": "Neparno-parna kombinacija", - "11": "Duplicate all pages" + "11": "Duplicate all pages", + "desc": { + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, â€Ļ).", + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, â€Ļ).", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimized for binding on the side)." + } + }, + "desc": { + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, â€Ļ).", + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, â€Ļ).", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimised for binding on the side).", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document." }, "placeholder": "(npr. 1,3,2 ili 4-8,2,10-12 ili 2n-1)" }, @@ -739,9 +1301,198 @@ "upload": "Dodaj sliku", "submit": "Dodaj sliku" }, + "attachments": { + "tags": "embed,attach,file,attachment,attachments", + "title": "Add attachments", + "header": "Add attachments", + "add": "Add Attachment", + "remove": "Remove Attachment", + "embed": "Embed Attachment", + "submit": "Add attachments" + }, "watermark": { - "tags": "Tekst,ponavljanje,etiketa,vlastiti,autorsko pravo,zaÅĄtita, img,jpg,slika,foto", "title": "Dodaj vodeni Åžig", + "desc": "Add text or image watermarks to PDF files", + "completed": "Watermark added", + "submit": "Dodaj vodeni Åžig", + "filenamePrefix": "watermarked", + "error": { + "failed": "An error occurred while adding watermark to the PDF." + }, + "watermarkType": { + "text": "Tekst", + "image": "Image" + }, + "settings": { + "type": "Watermark Type", + "text": { + "label": "Watermark Text", + "placeholder": "Enter watermark text" + }, + "image": { + "label": "Watermark Image", + "choose": "Choose Image", + "selected": "Selected: {{filename}}" + }, + "fontSize": "Veličina pisma", + "size": "Size", + "alphabet": "Font/Language", + "color": "Watermark Colour", + "rotation": "Rotation (degrees)", + "opacity": "Opacity (%)", + "spacing": { + "horizontal": "Horizontal Spacing", + "vertical": "Vertical Spacing", + "height": "Height Spacing", + "width": "Width Spacing" + }, + "convertToImage": "Flatten PDF pages to images" + }, + "alphabet": { + "roman": "Roman/Latin", + "arabic": "Arabic", + "japanese": "Japanese", + "korean": "Korean", + "chinese": "Chinese", + "thai": "Thai" + }, + "steps": { + "type": "Watermark Type", + "wording": "Wording", + "textStyle": "Style", + "formatting": "Formatting", + "file": "Watermark File" + }, + "results": { + "title": "Watermark Results" + }, + "tooltip": { + "language": { + "title": "Language Support", + "text": "Choose the appropriate language setting to ensure proper font rendering for your text." + }, + "appearance": { + "title": "Appearance Settings", + "text": "Control how your watermark looks and blends with the document.", + "bullet1": "Rotation: -360° to 360° for angled watermarks", + "bullet2": "Opacity: 0-100% for transparency control", + "bullet3": "Lower opacity creates subtle watermarks" + }, + "spacing": { + "title": "Spacing Control", + "text": "Adjust the spacing between repeated watermarks across the page.", + "bullet1": "Width spacing: Horizontal distance between watermarks", + "bullet2": "Height spacing: Vertical distance between watermarks", + "bullet3": "Higher values create more spread out patterns" + }, + "type": { + "header": { + "title": "Watermark Type Selection" + }, + "description": { + "title": "Choose Your Watermark", + "text": "Select between text or image watermarks based on your needs." + }, + "text": { + "title": "Text Watermarks", + "text": "Perfect for adding copyright notices, company names, or confidentiality labels. Supports multiple languages and custom colours.", + "bullet1": "Customisable fonts and languages", + "bullet2": "Adjustable colours and transparency", + "bullet3": "Ideal for legal or branding text" + }, + "image": { + "title": "Image Watermarks", + "text": "Use logos, stamps, or any image as a watermark. Great for branding and visual identification.", + "bullet1": "Upload any image format", + "bullet2": "Maintains image quality", + "bullet3": "Perfect for logos and stamps" + } + }, + "wording": { + "header": { + "title": "Text Content" + }, + "text": { + "title": "Watermark Text", + "text": "Enter the text that will appear as your watermark across the document.", + "bullet1": "Keep it concise for better readability", + "bullet2": "Common examples: 'CONFIDENTIAL', 'DRAFT', company name", + "bullet3": "Emoji characters are not supported and will be filtered out" + } + }, + "textStyle": { + "header": { + "title": "Text Style" + }, + "color": { + "title": "Colour Selection", + "text": "Choose a colour that provides good contrast with your document content.", + "bullet1": "Light grey (#d3d3d3) for subtle watermarks", + "bullet2": "Black or dark colours for high contrast", + "bullet3": "Custom colours for branding purposes" + }, + "language": { + "title": "Language Support", + "text": "Choose the appropriate language setting to ensure proper font rendering." + } + }, + "file": { + "header": { + "title": "Image Upload" + }, + "upload": { + "title": "Image Selection", + "text": "Upload an image file to use as your watermark.", + "bullet1": "Supports common formats: PNG, JPG, GIF, BMP", + "bullet2": "PNG with transparency works best", + "bullet3": "Higher resolution images maintain quality better" + }, + "recommendations": { + "title": "Best Practices", + "text": "Tips for optimal image watermark results.", + "bullet1": "Use logos or stamps with transparent backgrounds", + "bullet2": "Simple designs work better than complex images", + "bullet3": "Consider the final document size when choosing resolution" + } + }, + "formatting": { + "header": { + "title": "Formatting & Layout" + }, + "size": { + "title": "Size Control", + "text": "Adjust the size of your watermark (text or image).", + "bullet1": "Larger sizes create more prominent watermarks" + }, + "appearance": { + "title": "Appearance Settings", + "text": "Control how your watermark looks and blends with the document.", + "bullet1": "Rotation: -360° to 360° for angled watermarks", + "bullet2": "Opacity: 0-100% for transparency control", + "bullet3": "Lower opacity creates subtle watermarks" + }, + "spacing": { + "title": "Spacing Control", + "text": "Adjust the spacing between repeated watermarks across the page.", + "bullet1": "Horizontal spacing: Distance between watermarks left to right", + "bullet2": "Vertical spacing: Distance between watermarks top to bottom", + "bullet3": "Higher values create more spread out patterns" + }, + "security": { + "title": "Security Option", + "text": "Convert the final PDF to an image-based format for enhanced security.", + "bullet1": "Prevents text selection and copying", + "bullet2": "Makes watermarks harder to remove", + "bullet3": "Results in larger file sizes", + "bullet4": "Best for sensitive or copyrighted content" + } + } + }, + "type": { + "1": "Tekst", + "2": "Slika" + }, + "tags": "Tekst,ponavljanje,etiketa,vlastiti,autorsko pravo,zaÅĄtita, img,jpg,slika,foto", "header": "Dodaj vodeni Åžig", "customColor": "Prilagođena boja teksta", "selectText": { @@ -755,17 +1506,6 @@ "8": "Vrsta vodenog Åžiga:", "9": "Slika vodenog Åžiga:", "10": "Konvertiraj PDF u PDF-Sliku" - }, - "submit": "Dodaj vodeni Åžig", - "type": { - "1": "Tekst", - "2": "Slika" - }, - "watermarkType": { - "text": "Tekst" - }, - "settings": { - "fontSize": "Veličina pisma" } }, "permissions": { @@ -790,50 +1530,201 @@ "removePages": { "tags": "Ukloni stranice,izbriÅĄi stranice", "title": "Ukloniti", + "pageNumbers": { + "label": "Pages to Remove", + "placeholder": "e.g., 1,3,5-8,10", + "error": "Invalid page number format. Use numbers, ranges (1-5), or mathematical expressions (2n+1)" + }, + "filenamePrefix": "pages_removed", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "settings": { + "title": "Settings" + }, + "tooltip": { + "header": { + "title": "Remove Pages Settings" + }, + "pageNumbers": { + "title": "Page Selection", + "text": "Specify which pages to remove from your PDF. You can select individual pages, ranges, or use mathematical expressions.", + "bullet1": "Individual pages: 1,3,5 (removes pages 1, 3, and 5)", + "bullet2": "Page ranges: 1-5,10-15 (removes pages 1-5 and 10-15)", + "bullet3": "Mathematical: 2n+1 (removes odd pages)", + "bullet4": "Open ranges: 5- (removes from page 5 to end)" + }, + "examples": { + "title": "Common Examples", + "text": "Here are some common page selection patterns:", + "bullet1": "Remove first page: 1", + "bullet2": "Remove last 3 pages: -3", + "bullet3": "Remove every other page: 2n", + "bullet4": "Remove specific scattered pages: 1,5,10,15" + }, + "safety": { + "title": "Safety Tips", + "text": "Important considerations when removing pages:", + "bullet1": "Always preview your selection before processing", + "bullet2": "Keep a backup of your original file", + "bullet3": "Page numbers start from 1, not 0", + "bullet4": "Invalid page numbers will be ignored" + } + }, + "error": { + "failed": "An error occurred whilst removing pages." + }, + "results": { + "title": "Page Removal Results" + }, "submit": "Ukloniti" }, - "addPassword": { - "tags": "sigurno, sigurnost", - "title": "Dodajte zaporku", - "header": "Dodajte zaporku (kriptiraj)", - "selectText": { - "1": "Odaberite PDF za ÅĄifriranje", - "2": "Korisnička Zaporka", - "3": "DuÅžina ključa ÅĄifriranja", - "4": "ViÅĄe vrijednosti su jače, ali niÅže vrijednosti imaju bolju kompatibilnost.", - "5": "DopuÅĄtenja za postavljanje (preporučuje se koriÅĄtenje uz vlasničku lozinku)", - "6": "Spriječiti sastavljanje dokumenta", - "7": "Spriječite izdvajanje sadrÅžaja", - "8": "Spriječite izvlačenje radi pristupačnosti", - "9": "Spriječiti ispunjavanje obrasca", - "10": "Spriječiti izmjene", - "11": "Spriječi modificiranje napomena", - "12": "Spriječiti ispis", - "13": "Spriječite ispis različitih formata", - "14": "Zaporka vlasnika", - "15": "Ograničava ÅĄto se moÅže učiniti s dokumentom nakon ÅĄto se otvori (ne podrÅžavaju svi čitači)", - "16": "Ograničava otvaranje samog dokumenta" + "extractPages": { + "title": "Extract Pages", + "pageNumbers": { + "label": "Pages to Extract", + "placeholder": "e.g., 1,3,5-8 or odd & 1-10" + }, + "settings": { + "title": "Settings" }, - "submit": "Å ifriraj", "tooltip": { - "permissions": { - "title": "Promjena dopuÅĄtenja" + "description": "Extracts the selected pages into a new PDF, preserving order." + }, + "error": { + "failed": "Failed to extract pages" + }, + "results": { + "title": "Pages Extracted" + }, + "submit": "Extract Pages" + }, + "pageSelection": { + "tooltip": { + "header": { + "title": "Page Selection Guide" + }, + "basic": { + "title": "Basic Usage", + "text": "Select specific pages from your PDF document using simple syntax.", + "bullet1": "Individual pages: 1,3,5", + "bullet2": "Page ranges: 3-6 or 10-15", + "bullet3": "All pages: all" + }, + "advanced": { + "title": "Advanced Features" + }, + "tips": { + "title": "Tips", + "text": "Keep these guidelines in mind:", + "bullet1": "Page numbers start from 1 (not 0)", + "bullet2": "Spaces are automatically removed", + "bullet3": "Invalid expressions are ignored" + }, + "syntax": { + "title": "Syntax Basics", + "text": "Use numbers, ranges, keywords, and progressions (n starts at 0). Parentheses are supported.", + "bullets": { + "numbers": "Numbers/ranges: 5, 10-20", + "keywords": "Keywords: odd, even", + "progressions": "Progressions: 3n, 4n+1" + } + }, + "operators": { + "title": "Operators", + "text": "AND has higher precedence than comma. NOT applies within the document range.", + "and": "AND: & or \"and\" — require both conditions (e.g., 1-50 & even)", + "comma": "Comma: , or | — combine selections (e.g., 1-10, 20)", + "not": "NOT: ! or \"not\" — exclude pages (e.g., 3n & not 30)" + }, + "examples": { + "title": "Examples" + }, + "complex": { + "bullet1": "1,3-5,8,2n → pages 1, 3–5, 8, plus evens", + "bullet2": "10-,2n-1 → from page 10 to end + odd pages", + "description": "Mix different types.", + "title": "Complex Combinations" + }, + "description": "Choose which pages to use for the operation. Supports single pages, ranges, formulas, and the all keyword.", + "individual": { + "bullet1": "1,3,5 → selects pages 1, 3, 5", + "bullet2": "2,7,12 → selects pages 2, 7, 12", + "description": "Enter numbers separated by commas.", + "title": "Individual Pages" + }, + "mathematical": { + "bullet1": "2n → all even pages (2, 4, 6â€Ļ)", + "bullet2": "2n-1 → all odd pages (1, 3, 5â€Ļ)", + "bullet3": "3n → every 3rd page (3, 6, 9â€Ļ)", + "bullet4": "4n-1 → pages 3, 7, 11, 15â€Ļ", + "description": "Use n in formulas for patterns.", + "title": "Mathematical Functions" + }, + "ranges": { + "bullet1": "3-6 → selects pages 3–6", + "bullet2": "10-15 → selects pages 10–15", + "bullet3": "5- → selects pages 5 to end", + "description": "Use - for consecutive pages.", + "title": "Page Ranges" + }, + "special": { + "bullet1": "all → selects all pages", + "title": "Special Keywords" } } }, - "removePassword": { - "tags": "sigurno, deÅĄifriranje, sigurnost, poniÅĄti lozinku, izbriÅĄi lozinku", - "title": "Ukloni zaporku", - "header": "Ukloni zaporku (dekriptiraj)", - "selectText": { - "1": "Odaberite PDF za dekriptiranje", - "2": "Zaporka" + "bulkSelection": { + "syntaxError": "There is a syntax issue. See Page Selection tips for help.", + "header": { + "title": "Page Selection Guide" }, - "submit": "Ukloniti", - "desc": "Uklonite zaÅĄtitu lozinkom sa svog PDF dokumenta..", - "password": { - "stepTitle": "Ukloni lozinku", - "label": "Trenutna zaporka" + "syntax": { + "title": "Syntax Basics", + "text": "Use numbers, ranges, keywords, and progressions (n starts at 0). Parentheses are supported.", + "bullets": { + "numbers": "Numbers/ranges: 5, 10-20", + "keywords": "Keywords: odd, even", + "progressions": "Progressions: 3n, 4n+1" + } + }, + "operators": { + "title": "Operators", + "text": "AND has higher precedence than comma. NOT applies within the document range.", + "and": "AND: & or \"and\" — require both conditions (e.g., 1-50 & even)", + "comma": "Comma: , or | — combine selections (e.g., 1-10, 20)", + "not": "NOT: ! or \"not\" — exclude pages (e.g., 3n & not 30)" + }, + "examples": { + "title": "Examples", + "first50": "First 50", + "last50": "Last 50", + "every3rd": "Every 3rd", + "oddWithinExcluding": "Odd within 1-20 excluding 5-7", + "combineSets": "Combine sets" + }, + "firstNPages": { + "title": "First N Pages", + "placeholder": "Number of pages" + }, + "lastNPages": { + "title": "Last N Pages", + "placeholder": "Number of pages" + }, + "everyNthPage": { + "title": "Every Nth Page", + "placeholder": "Step size" + }, + "range": { + "title": "Range", + "fromPlaceholder": "From", + "toPlaceholder": "To" + }, + "keywords": { + "title": "Keywords" + }, + "advanced": { + "title": "Advanced" } }, "compressPdfs": { @@ -843,12 +1734,142 @@ "tags": "remove,delete,form,field,readonly", "title": "Remove Read-Only from Form Fields", "header": "Unlock PDF Forms", - "submit": "Remove" + "submit": "Remove", + "description": "This tool will remove read-only restrictions from PDF form fields, making them editable and fillable.", + "filenamePrefix": "unlocked_forms", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst unlocking PDF forms." + }, + "results": { + "title": "Unlocked Forms Results" + } }, "changeMetadata": { - "tags": "Naslov,autor,datum,kreacije,vrijeme,izdavač,proizvođač,statistike", - "title": "Promjena metapodataka", "header": "Promjena metapodataka", + "submit": "Promijeniti", + "filenamePrefix": "metadata", + "settings": { + "title": "Metadata Settings" + }, + "standardFields": { + "title": "Standard Fields" + }, + "deleteAll": { + "label": "Remove Existing Metadata", + "checkbox": "Delete all metadata" + }, + "title": { + "label": "Title", + "placeholder": "Document title" + }, + "author": { + "label": "Author", + "placeholder": "Document author" + }, + "subject": { + "label": "Subject", + "placeholder": "Document subject" + }, + "keywords": { + "label": "Keywords", + "placeholder": "Document keywords" + }, + "creator": { + "label": "Creator", + "placeholder": "Document creator" + }, + "producer": { + "label": "Producer", + "placeholder": "Document producer" + }, + "dates": { + "title": "Date Fields" + }, + "creationDate": { + "label": "Creation Date", + "placeholder": "Creation date" + }, + "modificationDate": { + "label": "Modification Date", + "placeholder": "Modification date" + }, + "trapped": { + "label": "Trapped Status", + "unknown": "Unknown", + "true": "True", + "false": "False" + }, + "advanced": { + "title": "Advanced Options" + }, + "customFields": { + "title": "Custom Metadata", + "description": "Add custom metadata fields to the document", + "add": "Add Field", + "key": "Key", + "keyPlaceholder": "Custom key", + "value": "Value", + "valuePlaceholder": "Custom value", + "remove": "Remove" + }, + "results": { + "title": "Updated PDFs" + }, + "error": { + "failed": "An error occurred while changing the PDF metadata." + }, + "tooltip": { + "header": { + "title": "PDF Metadata Overview" + }, + "standardFields": { + "title": "Standard Fields", + "text": "Common PDF metadata fields that describe the document.", + "bullet1": "Title: Document name or heading", + "bullet2": "Author: Person who created the document", + "bullet3": "Subject: Brief description of content", + "bullet4": "Keywords: Search terms for the document", + "bullet5": "Creator/Producer: Software used to create the PDF" + }, + "dates": { + "title": "Date Fields", + "text": "When the document was created and modified.", + "bullet1": "Creation Date: When original document was made", + "bullet2": "Modification Date: When last changed" + }, + "options": { + "title": "Additional Options", + "text": "Custom fields and privacy controls.", + "bullet1": "Custom Metadata: Add your own key-value pairs", + "bullet2": "Trapped Status: High-quality printing setting", + "bullet3": "Delete All: Remove all metadata for privacy" + }, + "deleteAll": { + "title": "Remove Existing Metadata", + "text": "Complete metadata deletion to ensure privacy." + }, + "customFields": { + "title": "Custom Metadata", + "text": "Add your own custom key-value metadata pairs.", + "bullet1": "Add any custom fields relevant to your document", + "bullet2": "Examples: Department, Project, Version, Status", + "bullet3": "Both key and value are required for each entry" + }, + "advanced": { + "title": "Advanced Options", + "trapped": { + "title": "Trapped Status", + "description": "Indicates if document is prepared for high-quality printing.", + "bullet1": "True: Document has been trapped for printing", + "bullet2": "False: Document has not been trapped", + "bullet3": "Unknown: Trapped status is not specified" + } + } + }, + "tags": "Naslov,autor,datum,kreacije,vrijeme,izdavač,proizvođač,statistike", "selectText": { "1": "Uredite varijable koje Åželite promijeniti", "2": "IzbriÅĄi sve metapodatke", @@ -856,15 +1877,7 @@ "4": "Ostali metapodaci:", "5": "Dodaj prilagođeni unos metapodataka" }, - "author": "Autor:", - "creationDate": "Datum stvaranja (gggg/MM/dd HH:mm:ss):", - "creator": "Kreator:", - "keywords": "Ključne riječi:", - "modDate": "Datum izmjene (gggg/MM/dd HH:mm:ss):", - "producer": "Proizvođač:", - "subject": "Predmet:", - "trapped": "Zarobljen:", - "submit": "Promijeniti" + "modDate": "Datum izmjene (gggg/MM/dd HH:mm:ss):" }, "fileToPDF": { "tags": "transformacija,format,dokument,slika,slajd,tekst,konverzija,office,docs,word,excel,powerpoint", @@ -878,6 +1891,7 @@ "ocr": { "tags": "prepoznavanje,tekst,slika,sken,čitanje,identifikacija,detektiranje,uređivanje", "title": "OCR / čiÅĄÄ‡enje skeniranja", + "desc": "ČiÅĄÄ‡enje skenira i otkriva tekst sa slika unutar PDF-a i ponovno ga dodaje kao tekst.", "header": "ČiÅĄÄ‡enje skeniranja / OCR (optičko prepoznavanje znakova)", "selectText": { "1": "Odaberite jezike koji će se otkriti unutar PDF-a (navedeni su oni koji su trenutno otkriveni):", @@ -896,23 +1910,89 @@ "help": "Pročitajte ovu dokumentaciju o tome kako ovo koristiti za druge jezike i/ili koristiti ne u dockeru", "credit": "Ova usluga koristi qpdf i Tesseract za OCR.", "submit": "Obradi PDF sa OCR-om", - "desc": "ČiÅĄÄ‡enje skenira i otkriva tekst sa slika unutar PDF-a i ponovno ga dodaje kao tekst.", + "operation": { + "submit": "Process OCR and Review" + }, + "results": { + "title": "OCR Results" + }, + "languagePicker": { + "additionalLanguages": "Looking for additional languages?", + "viewSetupGuide": "View setup guide →" + }, "settings": { "title": "Postavke", "ocrMode": { - "label": "OCR način" + "label": "OCR način", + "auto": "Auto (skip text layers)", + "force": "Force (re-OCR all, replace text)", + "strict": "Strict (abort if text found)" }, "languages": { - "label": "Jezici" + "label": "Jezici", + "placeholder": "Select languages" + }, + "compatibilityMode": { + "label": "Compatibility Mode" + }, + "advancedOptions": { + "label": "Processing Options", + "sidecar": "Create a text file", + "deskew": "Deskew pages", + "clean": "Clean input file", + "cleanFinal": "Clean final output" } }, "tooltip": { + "header": { + "title": "OCR Settings Overview" + }, "mode": { - "title": "OCR način" + "title": "OCR način", + "text": "Optical Character Recognition (OCR) helps you turn scanned or screenshotted pages into text you can search, copy, or highlight.", + "bullet1": "Auto skips pages that already contain text layers.", + "bullet2": "Force re-OCRs every page and replaces all the text.", + "bullet3": "Strict halts if any selectable text is found." }, "languages": { - "title": "Jezici" + "title": "Jezici", + "text": "Improve OCR accuracy by specifying the expected languages. Choose one or more languages to guide detection." + }, + "output": { + "title": "Output", + "text": "Decide how you want the text output formatted:", + "bullet1": "Searchable PDF embeds text behind the original image.", + "bullet2": "HOCR XML returns a structured machine-readable file.", + "bullet3": "Plain-text sidecar creates a separate .txt file with raw content." + }, + "advanced": { + "header": { + "title": "Advanced OCR Processing" + }, + "compatibility": { + "title": "Compatibility Mode", + "text": "Uses OCR 'sandwich PDF' mode: results in larger files, but more reliable with certain languages and older PDF software. By default we use hOCR for smaller, modern PDFs." + }, + "sidecar": { + "title": "Create Text File", + "text": "Generates a separate .txt file alongside the PDF containing all extracted text content for easy access and processing." + }, + "deskew": { + "title": "Deskew Pages", + "text": "Automatically corrects skewed or tilted pages to improve OCR accuracy. Useful for scanned documents that weren't perfectly aligned." + }, + "clean": { + "title": "Clean Input File", + "text": "Preprocesses the input by removing noise, enhancing contrast, and optimising the image for better OCR recognition before processing." + }, + "cleanFinal": { + "title": "Clean Final Output", + "text": "Post-processes the final PDF by removing OCR artefacts and optimising the text layer for better readability and smaller file size." + } } + }, + "error": { + "failed": "OCR operation failed" } }, "extractImages": { @@ -921,7 +2001,13 @@ "header": "Ekstrakt slika", "selectText": "Odaberite format slike za pretvaranje izdvojenih slika", "allowDuplicates": "Sačuvaj duplikate slike", - "submit": "Izdvajanje" + "submit": "Izdvajanje", + "settings": { + "title": "Settings" + }, + "error": { + "failed": "An error occurred while extracting images from the PDF." + } }, "pdfToPDFA": { "tags": "arhiva,dugoročno,standardno,konverzija,čuvanje,čuvanje", @@ -993,17 +2079,53 @@ }, "info": "Python nije instaliran. Treba je za izvrÅĄenje." }, + "scannerImageSplit": { + "title": "Extracted Images", + "submit": "Extract Image Scans", + "error": { + "failed": "An error occurred while extracting image scans." + }, + "tooltip": { + "title": "Photo Splitter", + "whatThisDoes": "What this does", + "whatThisDoesDesc": "Automatically finds and extracts each photo from a scanned page or composite image—no manual cropping.", + "whenToUse": "When to use", + "useCase1": "Scan whole album pages in one go", + "useCase2": "Split flatbed batches into separate files", + "useCase3": "Break collages into individual photos", + "useCase4": "Pull photos from documents", + "quickFixes": "Quick fixes", + "problem1": "Photos not detected → increase Tolerance to 30-50", + "problem2": "Too many false detections → increase Minimum Area to 15,000-20,000", + "problem3": "Crops are too tight → increase Border Size to 5-10", + "problem4": "Tilted photos not straightened → lower Angle Threshold to ~5°", + "problem5": "Dust/noise boxes → increase Minimum Contour Area to 1000-2000", + "setupTips": "Setup tips", + "tip1": "Use a plain, light background", + "tip2": "Leave a small gap (≈1 cm) between photos", + "tip3": "Scan at 300-600 DPI", + "tip4": "Clean the scanner glass", + "headsUp": "Heads-up", + "headsUpDesc": "Overlapping photos or backgrounds very close in colour to the photos can reduce accuracy-try a lighter or darker background and leave more space." + } + }, "sign": { - "tags": "autorizacija,inicijali,crtani-potpis,tekstualni-potpis,slikovni-potpis", "title": "PotpiÅĄite", "header": "PotpiÅĄite PDF-ove", "upload": "Učitaj sliku", - "draw": "Nacrtaj potpis", - "text": "Tekstualni unos", + "draw": { + "title": "Draw your signature", + "clear": "Clear" + }, + "text": { + "name": "Signer Name", + "placeholder": "Enter your full name" + }, "clear": "ObriÅĄi", "add": "Dodaj", "saved": "Sacuvane potpisne oznake", "save": "Sačuvaj potpisnu oznaku", + "applySignatures": "Apply Signatures", "personalSigs": "Osobni potpisi", "sharedSigs": "Dijeljeni potpisi", "noSavedSigs": "Nema sacuvanih potpisa pronađenih", @@ -1015,42 +2137,179 @@ "previous": "Previous page", "maintainRatio": "Toggle maintain aspect ratio", "undo": "Undo", - "redo": "Redo" + "redo": "Redo", + "submit": "Sign Document", + "steps": { + "configure": "Configure Signature" + }, + "type": { + "title": "Signature Type", + "draw": "Draw", + "canvas": "Canvas", + "image": "Image", + "text": "Text" + }, + "image": { + "label": "Upload signature image", + "placeholder": "Select image file", + "hint": "Upload a PNG or JPG image of your signature" + }, + "instructions": { + "title": "How to add signature", + "canvas": "After drawing your signature in the canvas, close the modal then click anywhere on the PDF to place it.", + "image": "After uploading your signature image above, click anywhere on the PDF to place it.", + "text": "After entering your name above, click anywhere on the PDF to place your signature." + }, + "mode": { + "move": "Move Signature", + "place": "Place Signature" + }, + "updateAndPlace": "Update and Place", + "activate": "Activate Signature Placement", + "deactivate": "Stop Placing Signatures", + "results": { + "title": "Signature Results" + }, + "error": { + "failed": "An error occurred while signing the PDF." + }, + "tags": "autorizacija,inicijali,crtani-potpis,tekstualni-potpis,slikovni-potpis" }, "flatten": { - "tags": "statično,deaktivirati,neinteraktivno,usmjeriti", "title": "Izravnati", "header": "Izravnati pdf", "flattenOnlyForms": "Izravnati samo obrasce", "submit": "Izravnati", + "filenamePrefix": "flattened", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, "steps": { "settings": "Postavke" }, "options": { - "flattenOnlyForms": "Izravnati samo obrasce" - } + "stepTitle": "Flatten Options", + "title": "Flatten Options", + "flattenOnlyForms": { + "label": "Izravnati samo obrasce", + "desc": "Only flatten form fields, leaving other interactive elements intact" + }, + "note": "Flattening removes interactive elements from the PDF, making them non-editable." + }, + "results": { + "title": "Flatten Results" + }, + "error": { + "failed": "An error occurred while flattening the PDF." + }, + "tooltip": { + "header": { + "title": "About Flattening PDFs" + }, + "description": { + "title": "What does flattening do?", + "text": "Flattening makes your PDF non-editable by turning fillable forms and buttons into regular text and images. The PDF will look exactly the same, but no one can change or fill in the forms anymore. Perfect for sharing completed forms, creating final documents for records, or ensuring the PDF looks the same everywhere.", + "bullet1": "Text boxes become regular text (can't be edited)", + "bullet2": "Checkboxes and buttons become pictures", + "bullet3": "Great for final versions you don't want changed", + "bullet4": "Ensures consistent appearance across all devices" + }, + "formsOnly": { + "title": "What does 'Flatten only forms' mean?", + "text": "This option only removes the ability to fill in forms, but keeps other features working like clicking links, viewing bookmarks, and reading comments.", + "bullet1": "Forms become non-editable", + "bullet2": "Links still work when clicked", + "bullet3": "Comments and notes remain visible", + "bullet4": "Bookmarks still help you navigate" + } + }, + "tags": "statično,deaktivirati,neinteraktivno,usmjeriti" }, "repair": { "tags": "popravi,vrati,korekcija,obnovi", "title": "Popravi", "header": "Popravi PDF datoteku", - "submit": "Popravi" + "submit": "Popravi", + "description": "This tool will attempt to repair corrupted or damaged PDF files. No additional settings are required.", + "filenamePrefix": "repaired", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst repairing the PDF." + }, + "results": { + "title": "Repair Results" + } }, "removeBlanks": { - "tags": "čiÅĄÄ‡enje,usmjeriti,ne-sadrÅžaj,organizacija", "title": "Uklonite prazne stranice", "header": "Uklonite prazne stranice", - "threshold": "Prag bjeline piksela:", + "settings": { + "title": "Settings" + }, + "threshold": { + "label": "Pixel Whiteness Threshold" + }, + "whitePercent": { + "label": "White Percentage Threshold", + "unit": "%" + }, + "includeBlankPages": { + "label": "Include detected blank pages" + }, + "tooltip": { + "header": { + "title": "Remove Blank Pages Settings" + }, + "threshold": { + "title": "Pixel Whiteness Threshold", + "text": "Controls how white a pixel must be to be considered 'white'. This helps determine what counts as a blank area on the page.", + "bullet1": "0 = Pure black (most restrictive)", + "bullet2": "128 = Medium grey", + "bullet3": "255 = Pure white (least restrictive)" + }, + "whitePercent": { + "title": "White Percentage Threshold", + "text": "Sets the minimum percentage of white pixels required for a page to be considered blank and removed.", + "bullet1": "Lower values (e.g., 80%) = More pages removed", + "bullet2": "Higher values (e.g., 95%) = Only very blank pages removed", + "bullet3": "Use higher values for documents with light backgrounds" + }, + "includeBlankPages": { + "title": "Include Detected Blank Pages", + "text": "When enabled, creates a separate PDF containing all the blank pages that were detected and removed from the original document.", + "bullet1": "Useful for reviewing what was removed", + "bullet2": "Helps verify the detection accuracy", + "bullet3": "Can be disabled to reduce output file size" + } + }, + "submit": "Uklonite prazne stranice", + "error": { + "failed": "Failed to remove blank pages" + }, + "results": { + "title": "Removed Blank Pages" + }, + "tags": "čiÅĄÄ‡enje,usmjeriti,ne-sadrÅžaj,organizacija", "thresholdDesc": "Prag za određivanje koliko bijeli piksel mora biti bijel da bi bio klasificiran kao 'bijeli'. 0 = crno, 255 čisto bijelo.", - "whitePercent": "Postotak bijele boje (%):", - "whitePercentDesc": "Postotak stranice koji mora biti \"bijeli\" piksel da bi se uklonio", - "submit": "Uklonite prazne stranice" + "whitePercentDesc": "Postotak stranice koji mora biti \"bijeli\" piksel da bi se uklonio" }, "removeAnnotations": { "tags": "komentari,isticanje,biljeÅĄke,oznake,ukloni", "title": "Ukloni komentare", "header": "Ukloni komentare", - "submit": "Ukloni" + "submit": "Ukloni", + "settings": { + "title": "Settings" + }, + "info": { + "title": "About Remove Annotations", + "description": "This tool will remove all annotations (comments, highlights, notes, etc.) from your PDF documents." + }, + "error": { + "failed": "An error occurred while removing annotations from the PDF." + } }, "compare": { "tags": "razlikovati,kontrast,izmjene,analiza", @@ -1082,6 +2341,142 @@ "certSign": { "tags": "autentifikacija,PEM,P12,zvanično,ÅĄifriranje", "title": "Potpisivanje Certifikatom", + "filenamePrefix": "signed", + "signMode": { + "stepTitle": "Sign Mode", + "tooltip": { + "header": { + "title": "About PDF Signatures" + }, + "overview": { + "title": "How signatures work", + "text": "Both modes seal the document (any edits are flagged as tampering) and record who/when/how for auditing. Viewer trust depends on the certificate chain." + }, + "manual": { + "title": "Manual - Bring your certificate", + "text": "Use your own certificate files for brand-aligned identity. Can display Trusted when your CA/chain is recognised.", + "use": "Use for: customer-facing, legal, compliance." + }, + "auto": { + "title": "Auto - Zero-setup, instant system seal", + "text": "Signs with a server self-signed certificate. Same tamper-evident seal and audit trail; typically shows Unverified in viewers.", + "use": "Use when: you need speed and consistent internal identity across reviews and records." + }, + "rule": { + "title": "Rule of thumb", + "text": "Need recipient Trusted status? Manual. Need a fast, tamper-evident seal and audit trail with no setup? Auto." + } + } + }, + "certTypeStep": { + "stepTitle": "Certificate Format" + }, + "certFiles": { + "stepTitle": "Certificate Files" + }, + "appearance": { + "stepTitle": "Signature Appearance", + "tooltip": { + "header": { + "title": "About Signature Appearance" + }, + "invisible": { + "title": "Invisible Signatures", + "text": "The signature is added to the PDF for security but won't be visible when viewing the document. Perfect for legal requirements without changing the document's appearance.", + "bullet1": "Provides security without visual changes", + "bullet2": "Meets legal requirements for digital signing", + "bullet3": "Doesn't affect document layout or design" + }, + "visible": { + "title": "Visible Signatures", + "text": "Shows a signature block on the PDF with your name, date, and optional details. Useful when you want readers to clearly see the document is signed.", + "bullet1": "Shows signer name and date on the document", + "bullet2": "Can include reason and location for signing", + "bullet3": "Choose which page to place the signature", + "bullet4": "Optional logo can be included" + } + }, + "invisible": "Invisible", + "options": { + "title": "Signature Details" + }, + "visible": "Visible" + }, + "sign": { + "submit": "Sign PDF", + "results": "Signed PDF" + }, + "error": { + "failed": "An error occurred whilst processing signatures." + }, + "tooltip": { + "header": { + "title": "About Managing Signatures" + }, + "overview": { + "title": "What can this tool do?", + "text": "This tool lets you check if your PDFs are digitally signed and add new digital signatures. Digital signatures prove who created or approved a document and show if it has been changed since signing.", + "bullet1": "Check existing signatures and their validity", + "bullet2": "View detailed information about signers and certificates", + "bullet3": "Add new digital signatures to secure your documents", + "bullet4": "Multiple files supported with easy navigation" + }, + "validation": { + "title": "Checking Signatures", + "text": "When you check signatures, the tool tells you if they're valid, who signed the document, when it was signed, and whether the document has been changed since signing.", + "bullet1": "Shows if signatures are valid or invalid", + "bullet2": "Displays signer information and signing date", + "bullet3": "Checks if the document was modified after signing", + "bullet4": "Can use custom certificates for verification" + }, + "signing": { + "title": "Adding Signatures", + "text": "To sign a PDF, you need a digital certificate (like PEM, PKCS12, or JKS). You can choose to make the signature visible on the document or keep it invisible for security only.", + "bullet1": "Supports PEM, PKCS12, JKS, and server certificate formats", + "bullet2": "Option to show or hide signature on the PDF", + "bullet3": "Add reason, location, and signer name", + "bullet4": "Choose which page to place visible signatures", + "bullet5": "Use server certificate for simple 'Sign with Stirling-PDF' option" + } + }, + "certType": { + "tooltip": { + "header": { + "title": "About Certificate Types" + }, + "what": { + "title": "What's a certificate?", + "text": "It's a secure ID for your signature that proves you signed. Unless you're required to sign via certificate, we recommend using another secure method like Type, Draw, or Upload." + }, + "which": { + "title": "Which option should I use?", + "text": "Choose the format that matches your certificate file:", + "bullet1": "PKCS#12 (.p12 / .pfx) – one combined file (most common)", + "bullet2": "PFX (.pfx) – Microsoft's version of PKCS12", + "bullet3": "PEM – separate private-key and certificate .pem files", + "bullet4": "JKS – Java .jks keystore for dev / CI-CD workflows" + }, + "convert": { + "title": "Key not listed?", + "text": "Convert your file to a Java keystore (.jks) with keytool, then pick JKS." + } + } + }, + "chooseCertificate": "Choose Certificate File", + "chooseJksFile": "Choose JKS File", + "chooseP12File": "Choose PKCS12 File", + "choosePfxFile": "Choose PFX File", + "choosePrivateKey": "Choose Private Key File", + "location": "Mjesto", + "logoTitle": "Logo", + "name": "Ime", + "noLogo": "No Logo", + "pageNumber": "Page Number", + "password": "Unesite svoju lozinku za skladiÅĄte ključeva ili privatni ključ (ako postoji):", + "passwordOptional": "Leave empty if no password", + "reason": "Razlog", + "serverCertMessage": "Using server certificate - no files or password required", + "showLogo": "PrikaÅži logo", "header": "PotpiÅĄite PDF svojim certifikatom (Rad u tijeku)", "selectPDF": "Odaberite PDF datoteku za potpisivanje:", "jksNote": "Napomena: Ako vrsta vaÅĄeg certifikata nije navedena u nastavku, pretvorite ga u datoteku Java Keystore (.jks) pomoću alata naredbenog retka keytool. Zatim odaberite opciju .jks datoteke u nastavku.", @@ -1089,13 +2484,7 @@ "selectCert": "Odaberite svoju datoteku certifikata (format X.509, moÅže biti .pem ili .der):", "selectP12": "Odaberite svoju PKCS#12 datoteku pohrane ključeva (.p12 ili .pfx) (neobavezno, ako je dostupna, trebala bi sadrÅžavati vaÅĄ privatni ključ i certifikat):", "selectJKS": "Odaberite datoteku Java Keystore (.jks ili .keystore):", - "certType": "Tip certifikata", - "password": "Unesite svoju lozinku za skladiÅĄte ključeva ili privatni ključ (ako postoji):", "showSig": "PrikaÅži potpis", - "reason": "Razlog", - "location": "Mjesto", - "name": "Ime", - "showLogo": "PrikaÅži logo", "submit": "PotpiÅĄi PDF" }, "removeCertSign": { @@ -1103,7 +2492,18 @@ "title": "Ukloni digitalno potpisano dokazilo", "header": "Uklonite digitalni potpis iz PDF-a", "selectPDF": "Odaberite datoteku PDF:", - "submit": "Ukloni potpisi" + "submit": "Ukloni potpisi", + "description": "This tool will remove digital certificate signatures from your PDF document.", + "filenamePrefix": "unsigned", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst removing certificate signatures." + }, + "results": { + "title": "Certificate Removal Results" + } }, "pageLayout": { "tags": "spajanje,kompozitni,pojedinačan-prikaz,organizacija", @@ -1111,16 +2511,157 @@ "header": "Izgled s viÅĄe stranica", "pagesPerSheet": "Broj stranica po listu:", "addBorder": "Dodajte granice dokumenta", - "submit": "Potvrdi" + "submit": "Potvrdi", + "desc": { + "2": "Place 2 pages side-by-side on a single sheet.", + "3": "Place 3 pages on a single sheet in a single row.", + "4": "Place 4 pages on a single sheet (2 × 2 grid).", + "9": "Place 9 pages on a single sheet (3 × 3 grid).", + "16": "Place 16 pages on a single sheet (4 × 4 grid)." + }, + "error": { + "failed": "An error occurred while creating the multi-page layout." + } + }, + "bookletImposition": { + "tags": "booklet,imposition,printing,binding,folding,signature", + "title": "Booklet Imposition", + "header": "Booklet Imposition", + "submit": "Create Booklet", + "spineLocation": { + "label": "Spine Location", + "left": "Left (Standard)", + "right": "Right (RTL)" + }, + "doubleSided": { + "label": "Double-sided printing", + "tooltip": "Creates both front and back sides for proper booklet printing" + }, + "manualDuplex": { + "title": "Manual Duplex Mode", + "instructions": "For printers without automatic duplex. You'll need to run this twice:" + }, + "duplexPass": { + "label": "Print Pass", + "first": "1st Pass", + "second": "2nd Pass", + "firstInstructions": "Prints front sides → stack face-down → run again with 2nd Pass", + "secondInstructions": "Load printed stack face-down → prints back sides" + }, + "rtlBinding": { + "label": "Right-to-left binding", + "tooltip": "For Arabic, Hebrew, or other right-to-left languages" + }, + "addBorder": { + "label": "Add borders around pages", + "tooltip": "Adds borders around each page section to help with cutting and alignment" + }, + "addGutter": { + "label": "Add gutter margin", + "tooltip": "Adds inner margin space for binding" + }, + "gutterSize": { + "label": "Gutter size (points)" + }, + "flipOnShortEdge": { + "label": "Flip on short edge (automatic duplex only)", + "tooltip": "Enable for short-edge duplex printing (automatic duplex only - ignored in manual mode)", + "manualNote": "Not needed in manual mode - you flip the stack yourself" + }, + "advanced": { + "toggle": "Advanced Options" + }, + "paperSizeNote": "Paper size is automatically derived from your first page.", + "tooltip": { + "header": { + "title": "Booklet Creation Guide" + }, + "description": { + "title": "What is Booklet Imposition?", + "text": "Creates professional booklets by arranging pages in the correct printing order. Your PDF pages are placed 2-up on landscape sheets so when folded and bound, they read in proper sequence like a real book." + }, + "example": { + "title": "Example: 8-Page Booklet", + "text": "Your 8-page document becomes 2 sheets:", + "bullet1": "Sheet 1 Front: Pages 8, 1 | Back: Pages 2, 7", + "bullet2": "Sheet 2 Front: Pages 6, 3 | Back: Pages 4, 5", + "bullet3": "When folded & stacked: Reads 1→2→3→4→5→6→7→8" + }, + "printing": { + "title": "How to Print & Assemble", + "text": "Follow these steps for perfect booklets:", + "bullet1": "Print double-sided with 'Flip on long edge'", + "bullet2": "Stack sheets in order, fold in half", + "bullet3": "Staple or bind along the folded spine", + "bullet4": "For short-edge printers: Enable 'Flip on short edge' option" + }, + "manualDuplex": { + "title": "Manual Duplex (Single-sided Printers)", + "text": "For printers without automatic duplex:", + "bullet1": "Turn OFF 'Double-sided printing'", + "bullet2": "Select '1st Pass' → Print → Stack face-down", + "bullet3": "Select '2nd Pass' → Load stack → Print backs", + "bullet4": "Fold and assemble as normal" + }, + "advanced": { + "title": "Advanced Options", + "text": "Fine-tune your booklet:", + "bullet1": "Right-to-Left Binding: For Arabic, Hebrew, or RTL languages", + "bullet2": "Borders: Shows cut lines for trimming", + "bullet3": "Gutter Margin: Adds space for binding/stapling", + "bullet4": "Short-edge Flip: Only for automatic duplex printers" + } + }, + "error": { + "failed": "An error occurred while creating the booklet imposition." + } }, "scalePages": { - "tags": "izmjena,modifikacija,dimenzija,adaptacija", "title": "Podesite veličinu stranice", "header": "Podesite veličinu stranice", "pageSize": "Veličina stranice dokumenta.", "keepPageSize": "Originalna veličina", "scaleFactor": "Razina zumiranja (obrezivanje) stranice.", - "submit": "Potvrdi" + "submit": "Potvrdi", + "tags": "izmjena,modifikacija,dimenzija,adaptacija" + }, + "adjustPageScale": { + "tags": "resize,modify,dimension,adapt", + "title": "Adjust Page Scale", + "header": "Adjust Page Scale", + "scaleFactor": { + "label": "Scale Factor" + }, + "pageSize": { + "label": "Target Page Size", + "keep": "Keep Original Size", + "letter": "Letter", + "legal": "Legal" + }, + "submit": "Adjust Page Scale", + "error": { + "failed": "An error occurred while adjusting the page scale." + }, + "tooltip": { + "header": { + "title": "Page Scale Settings Overview" + }, + "description": { + "title": "Description", + "text": "Adjust the size of PDF content and change the page dimensions." + }, + "scaleFactor": { + "title": "Scale Factor", + "text": "Controls how large or small the content appears on the page. Content is scaled and centred - if scaled content is larger than the page size, it may be cropped.", + "bullet1": "1.0 = Original size", + "bullet2": "0.5 = Half size (50% smaller)", + "bullet3": "2.0 = Double size (200% larger, may crop)" + }, + "pageSize": { + "title": "Target Page Size", + "text": "Sets the dimensions of the output PDF pages. 'Keep Original Size' maintains current dimensions, whilst other options resize to standard paper sizes." + } + } }, "add-page-numbers": { "tags": "paginirati, označiti, organizirati, indeksirati" @@ -1129,16 +2670,83 @@ "tags": "auto-detekcija,zaglavlje-bazirano,organizacija,preimenovanje", "title": "Automatski preimenuj", "header": "Automatski preimenuj PDF", - "submit": "Automatski preimenuj" + "description": "Automatically finds the title from your PDF content and uses it as the filename.", + "submit": "Automatski preimenuj", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst auto-renaming the PDF." + }, + "results": { + "title": "Auto-Rename Results" + }, + "tooltip": { + "header": { + "title": "How Auto-Rename Works" + }, + "howItWorks": { + "title": "Smart Renaming", + "text": "Automatically finds the title from your PDF content and uses it as the filename.", + "bullet1": "Looks for text that appears to be a title or heading", + "bullet2": "Creates a clean, valid filename from the detected title", + "bullet3": "Keeps the original name if no suitable title is found" + } + } }, "adjust-contrast": { "tags": "korekcija boje, ugađanje, modificiranje, poboljÅĄanje" }, "crop": { - "tags": "obrezivanje, smanjivanje, uređivanje, oblikovanje", "title": "IzreÅži", "header": "IzreÅži sliku", - "submit": "Potvrdi" + "submit": "Potvrdi", + "noFileSelected": "Select a PDF file to begin cropping", + "preview": { + "title": "Crop Area Selection" + }, + "reset": "Reset to full PDF", + "coordinates": { + "title": "Position and Size", + "x": { + "label": "X Position", + "desc": "Left edge (points)" + }, + "y": { + "label": "Y Position", + "desc": "Bottom edge (points)" + }, + "width": { + "label": "Width", + "desc": "Crop width (points)" + }, + "height": { + "label": "Height", + "desc": "Crop height (points)" + } + }, + "error": { + "invalidArea": "Crop area extends beyond PDF boundaries", + "failed": "Failed to crop PDF" + }, + "steps": { + "selectArea": "Select Crop Area" + }, + "tooltip": { + "title": "How to Crop PDFs", + "description": "Select the area to crop from your PDF by dragging and resizing the blue overlay on the thumbnail.", + "drag": "Drag the overlay to move the crop area", + "resize": "Drag the corner and edge handles to resize", + "precision": "Use coordinate inputs for precise positioning" + }, + "results": { + "title": "Crop Results" + }, + "automation": { + "info": "Enter crop coordinates in PDF points. Origin (0,0) is at bottom-left. These values will be applied to all PDFs processed in this automation.", + "reference": "Reference: A4 page is 595.28 × 841.89 points (210mm × 297mm). 1 inch = 72 points." + }, + "tags": "obrezivanje, smanjivanje, uređivanje, oblikovanje" }, "autoSplitPDF": { "tags": "QR-bazirano,razdvoji,segment-skeniranja,organizacija", @@ -1221,24 +2829,124 @@ "downloadJS": "Preuzmite Javascript", "submit": "PrikaÅži" }, - "autoRedact": { - "tags": "Cenzura,Sakrij,prekrivanje,crna,marker,skriveno", - "title": "Automatsko uređivanje", - "header": "Automatsko uređivanje", - "colorLabel": "Boja", - "textsToRedactLabel": "Tekst za uređivanje (razdvojen linijama)", - "textsToRedactPlaceholder": "npr. \\nPovjerljivo \\nStrogo čuvana tajna", - "useRegexLabel": "Koristi Regex", - "wholeWordSearchLabel": "PretraÅživanje cijelih riječi", - "customPaddingLabel": "Dodatni prazan prostor", - "convertPDFToImageLabel": "Pretvorite PDF u PDF-sliku (koristi se za uklanjanje teksta iza okvira)", - "submitButton": "Potvrdi" - }, "redact": { "tags": "Redact,Hide,black out,black,marker,hidden,manual", "title": "Manual Redaction", - "header": "Manual Redaction", "submit": "Manual Redaction", + "error": { + "failed": "An error occurred while redacting the PDF." + }, + "modeSelector": { + "title": "Redaction Method", + "mode": "Mode", + "automatic": "Automatic", + "automaticDesc": "Redact text based on search terms", + "manual": "Manual", + "manualDesc": "Click and drag to redact specific areas", + "manualComingSoon": "Manual redaction coming soon" + }, + "auto": { + "header": "Auto Redact", + "settings": { + "title": "Redaction Settings", + "advancedTitle": "Napredno" + }, + "colorLabel": "Box Colour", + "wordsToRedact": { + "title": "Words to Redact", + "placeholder": "Enter a word", + "add": "Dodaj", + "examples": "Examples: Confidential, Top-Secret" + }, + "useRegexLabel": "Use Regex", + "wholeWordSearchLabel": "Whole Word Search", + "customPaddingLabel": "Custom Extra Padding", + "convertPDFToImageLabel": "Convert PDF to PDF-Image" + }, + "tooltip": { + "mode": { + "header": { + "title": "Redaction Method" + }, + "automatic": { + "title": "Automatic Redaction", + "text": "Automatically finds and redacts specified text throughout the document. Perfect for removing consistent sensitive information like names, addresses, or confidential markers." + }, + "manual": { + "title": "Manual Redaction", + "text": "Click and drag to manually select specific areas to redact. Gives you precise control over what gets redacted. (Coming soon)" + } + }, + "words": { + "header": { + "title": "Words to Redact" + }, + "description": { + "title": "Text Matching", + "text": "Enter words or phrases to find and redact in your document. Each word will be searched for separately." + }, + "bullet1": "Add one word at a time", + "bullet2": "Press Enter or click 'Add Another' to add", + "bullet3": "Click × to remove words", + "examples": { + "title": "Common Examples", + "text": "Typical words to redact include: bank details, email addresses, or specific names." + } + }, + "advanced": { + "header": { + "title": "Advanced Redaction Settings" + }, + "color": { + "title": "Box Colour & Padding", + "text": "Customise the appearance of redaction boxes. Black is standard, but you can choose any colour. Padding adds extra space around the found text." + }, + "regex": { + "title": "Use Regex", + "text": "Enable regular expressions for advanced pattern matching. Useful for finding phone numbers, emails, or complex patterns.", + "bullet1": "Example: \\d{4}-\\d{2}-\\d{2} to match any dates in YYYY-MM-DD format", + "bullet2": "Use with caution - test thoroughly" + }, + "wholeWord": { + "title": "Whole Word Search", + "text": "Only match complete words, not partial matches. 'John' won't match 'Johnson' when enabled." + }, + "convert": { + "title": "Convert to PDF-Image", + "text": "Converts the PDF to an image-based PDF after redaction. This ensures text behind redaction boxes is completely removed and unrecoverable." + } + } + }, + "manual": { + "header": "Manual Redaction", + "textBasedRedaction": "Text-based Redaction", + "pageBasedRedaction": "Page-based Redaction", + "convertPDFToImageLabel": "Convert PDF to PDF-Image (Used to remove text behind the box)", + "pageRedactionNumbers": { + "title": "Stranice", + "placeholder": "(t.j. 1,2,8 ili 4,7,12-16 ili 2n-1)" + }, + "redactionColor": { + "title": "Redaction Colour" + }, + "export": "Export", + "upload": "Upload", + "boxRedaction": "Box draw redaction", + "zoom": "Zoom", + "zoomIn": "Zoom in", + "zoomOut": "Zoom out", + "nextPage": "Next Page", + "previousPage": "Previous Page", + "toggleSidebar": "Toggle Sidebar", + "showThumbnails": "Show Thumbnails", + "showDocumentOutline": "Show Document Outline (double-click to expand/collapse all items)", + "showAttachments": "Show Attachments", + "showLayers": "Show Layers (double-click to reset all layers to the default state)", + "colourPicker": "Colour Picker", + "findCurrentOutlineItem": "Find current outline item", + "applyChanges": "Apply Changes" + }, + "header": "Manual Redaction", "textBasedRedaction": "Text based Redaction", "pageBasedRedaction": "Page-based Redaction", "convertPDFToImageLabel": "Convert PDF to PDF-Image (Used to remove text behind the box)", @@ -1264,21 +2972,7 @@ "showLayers": "Show Layers (double-click to reset all layers to the default state)", "colourPicker": "Colour Picker", "findCurrentOutlineItem": "Find current outline item", - "applyChanges": "Apply Changes", - "auto": { - "settings": { - "advancedTitle": "Napredno" - }, - "wordsToRedact": { - "add": "Dodaj" - } - }, - "manual": { - "pageRedactionNumbers": { - "title": "Stranice", - "placeholder": "(t.j. 1,2,8 ili 4,7,12-16 ili 2n-1)" - } - } + "applyChanges": "Apply Changes" }, "tableExtraxt": { "tags": "CSV,Izdvajanje tabela,izdvajanje,pretvaranje" @@ -1289,11 +2983,15 @@ "overlay-pdfs": { "tags": "Preklapanje", "header": "Prekrivanje PDF datoteka", + "title": "Overlay PDFs", + "desc": "Overlay one PDF on top of another", "baseFile": { "label": "Odaberite Osnovnu PDF datoteka" }, "overlayFiles": { - "label": "Izaberite PDF datoteke za prekrivanje" + "label": "Izaberite PDF datoteke za prekrivanje", + "placeholder": "Choose PDF(s)...", + "addMore": "Add more PDFs..." }, "mode": { "label": "Odaberite način preklapanja", @@ -1303,14 +3001,53 @@ }, "counts": { "label": "Brojevi preklapanja (za način fiksnog ponavljanja)", - "placeholder": "Unesite brojeve odvojene zarezima (npr. 2,3,1)" + "placeholder": "Unesite brojeve odvojene zarezima (npr. 2,3,1)", + "item": "Count for file", + "noFiles": "Add overlay files to configure counts" }, "position": { "label": "Odaberite poloÅžaj preklapanja", "foreground": "Prednji plan", "background": "Pozadina" }, - "submit": "Potvrditi" + "submit": "Potvrditi", + "settings": { + "title": "Settings" + }, + "results": { + "title": "Overlay Results" + }, + "tooltip": { + "header": { + "title": "Overlay PDFs Overview" + }, + "description": { + "title": "Description", + "text": "Combine a base PDF with one or more overlay PDFs. Overlays can be applied page-by-page in different modes and placed in the foreground or background." + }, + "mode": { + "title": "Overlay Mode", + "text": "Choose how to distribute overlay pages across the base PDF pages.", + "sequential": "Sequential Overlay: Use pages from the first overlay PDF until it ends, then move to the next.", + "interleaved": "Interleaved Overlay: Take one page from each overlay in turn.", + "fixedRepeat": "Fixed Repeat Overlay: Take a set number of pages from each overlay before moving to the next. Use Counts to set the numbers." + }, + "position": { + "title": "Overlay Position", + "text": "Foreground places the overlay on top of the page. Background places it behind." + }, + "overlayFiles": { + "title": "Overlay Files", + "text": "Select one or more PDFs to overlay on the base. The order of these files affects how pages are applied in Sequential and Fixed Repeat modes." + }, + "counts": { + "title": "Counts (Fixed Repeat only)", + "text": "Provide a positive number for each overlay file showing how many pages to take before moving to the next. Required when mode is Fixed Repeat." + } + }, + "error": { + "failed": "An error occurred while overlaying PDFs." + } }, "split-by-sections": { "tags": "Dijeljenje odjeljaka,Dijeljenje,Postavke", @@ -1331,6 +3068,7 @@ "tags": "Pečat, dodavanje slike, srediÅĄnja slika, vodeni Åžig, PDF, ugradnja, prilagodba", "header": "Pečat PDF", "title": "Pečat PDF", + "stampSetup": "Stamp Setup", "stampType": "Pečat Tip", "stampText": "Pečat Tekst", "stampImage": "Pečat Slika", @@ -1343,7 +3081,19 @@ "overrideY": "PoniÅĄti Y koordinatu", "customMargin": "Prilagođena margina", "customColor": "Prilagođena boja teksta", - "submit": "PoÅĄalji" + "submit": "PoÅĄalji", + "noStampSelected": "No stamp selected. Return to Step 1.", + "customPosition": "Drag the stamp to the desired location in the preview window.", + "error": { + "failed": "An error occurred while adding stamp to the PDF." + }, + "imageSize": "Image Size", + "margin": "Margin", + "positionAndFormatting": "Position & Formatting", + "quickPosition": "Select a position on the page to place the stamp.", + "results": { + "title": "Stamp Results" + } }, "removeImagePdf": { "tags": "Ukloni sliku, Rad sa stranicama, Back end, server strana" @@ -1361,7 +3111,8 @@ "status": { "_value": "Status", "valid": "Valid", - "invalid": "Invalid" + "invalid": "Invalid", + "complete": "Validation complete" }, "signer": "Signer", "date": "Date", @@ -1388,40 +3139,122 @@ "version": "Verzija", "keyUsage": "Key Usage", "selfSigned": "Self-Signed", - "bits": "bits" + "bits": "bits", + "details": "Certificate Details" }, "signature": { "info": "Signature Information", "_value": "Signature", "mathValid": "Signature is mathematically valid BUT:" }, - "selectCustomCert": "Custom Certificate File X.509 (Optional)" - }, - "replace-color": { - "title": "Replace-Invert-Color", - "header": "Zameni-inverziranje boja u PDF-u", - "selectText": { - "1": "Optije za zamenu ili inverziranje boja", - "2": "Standardno (standarske visoko kontrastne boje)", - "3": "Napčno (prilagođene boje)", - "4": "Cijelo-inverzirajte (inverzirajte sve boje)", - "5": "Optije visoko kontrastne boje", - "6": "Crna tekst na bijelu pozadini", - "7": "Bijeli tekst na crvenoj pozadini", - "8": "ÅŊutni tekst na crnoj pozadini", - "9": "Zeleni tekst na crnoj pozadini", - "10": "Izaberite boju teksta", - "11": "Izaberite pozadinu boju" + "selectCustomCert": "Custom Certificate File X.509 (Optional)", + "downloadCsv": "Download CSV", + "downloadJson": "Download JSON", + "downloadPdf": "Download PDF Report", + "downloadType": { + "csv": "CSV", + "json": "JSON", + "pdf": "PDF" }, - "submit": "Zamijeni" + "error": { + "allFailed": "Unable to validate the selected files.", + "partial": "Some files could not be validated.", + "reportGeneration": "Could not generate the PDF report. JSON and CSV are available.", + "unexpected": "Unexpected error during validation." + }, + "finalizing": "Preparing downloads...", + "issue": { + "certExpired": "Certificate expired", + "certRevocationUnknown": "Certificate revocation status unknown", + "certRevoked": "Certificate revoked", + "chainInvalid": "Certificate chain invalid", + "signatureInvalid": "Signature cryptographic check failed", + "trustInvalid": "Certificate not trusted" + }, + "noResults": "Run the validation to generate a report.", + "noSignaturesShort": "No signatures", + "processing": "Validating signatures...", + "report": { + "continued": "Continued", + "downloads": "Downloads", + "entryLabel": "Signature Summary", + "fields": { + "created": "Created", + "fileSize": "File Size", + "signatureCount": "Total Signatures", + "signatureDate": "Signature Date" + }, + "filesEvaluated": "{{count}} files evaluated", + "footer": "Validated via Stirling PDF", + "generatedAt": "Generated", + "noPdf": "PDF report will be available after a successful validation.", + "page": "Page", + "shortTitle": "Signature Summary", + "signatureCountLabel": "{{count}} signatures", + "signaturesFound": "{{count}} signatures detected", + "signaturesValid": "{{count}} fully valid", + "title": "Signature Validation Report" + }, + "settings": { + "certHint": "Upload a trusted X.509 certificate to validate against a custom trust source.", + "title": "Validation Settings" + }, + "signatureDate": "Signature Date", + "totalSignatures": "Total Signatures" }, - "replaceColorPdf": { - "tags": "Zameni boju, Rad sa stranicama, Back end, server strana" + "replaceColor": { + "tags": "Replace Colour,Page operations,Back end,server side", + "labels": { + "settings": "Settings", + "colourOperation": "Colour operation" + }, + "options": { + "highContrast": "High contrast", + "invertAll": "Invert all colours", + "custom": "Custom", + "cmyk": "Convert to CMYK" + }, + "tooltip": { + "header": { + "title": "Replace & Invert Colour Settings Overview" + }, + "description": { + "title": "Description", + "text": "Transform PDF colours to improve readability and accessibility. Choose from high contrast presets, invert all colours, or create custom colour schemes." + }, + "highContrast": { + "title": "High Contrast", + "text": "Apply predefined high contrast colour combinations designed for better readability and accessibility compliance.", + "bullet1": "White text on black background - Classic dark mode", + "bullet2": "Black text on white background - Standard high contrast", + "bullet3": "Yellow text on black background - High visibility option", + "bullet4": "Green text on black background - Alternative high contrast" + }, + "invertAll": { + "title": "Invert All Colours", + "text": "Completely invert all colours in the PDF, creating a negative-like effect. Useful for creating dark mode versions of documents or reducing eye strain in low-light conditions." + }, + "custom": { + "title": "Custom Colours", + "text": "Define your own text and background colours using the colour pickers. Perfect for creating branded documents or specific accessibility requirements.", + "bullet1": "Text colour - Choose the colour for text elements", + "bullet2": "Background colour - Set the background colour for the document" + }, + "cmyk": { + "title": "Convert to CMYK", + "text": "Convert the PDF from RGB colour space to CMYK colour space, optimized for professional printing. This process converts colours to the Cyan, Magenta, Yellow, Black model used by printers." + } + }, + "error": { + "failed": "An error occurred while processing the colour replacement." + } }, "login": { "title": "Prijavite se", "header": "Prijavite se", "signin": "Prijavite se", + "signInWith": "Sign in with", + "signInAnonymously": "Sign Up as a Guest", "rememberme": "Zapamti me", "invalid": "Neispravno korisničko ime ili zaporka.", "locked": "VaÅĄ račun je zaključan.", @@ -1440,12 +3273,83 @@ "alreadyLoggedIn": "Već ste se prijavili na", "alreadyLoggedIn2": "ure. Odjavite se s ure i pokuÅĄajte ponovo.", "toManySessions": "Imate preko mreÅžne sesije aktivnih", - "logoutMessage": "You have been logged out." + "logoutMessage": "You have been logged out.", + "youAreLoggedIn": "You are logged in!", + "email": "Email", + "password": "Password", + "enterEmail": "Enter your email", + "enterPassword": "Enter your password", + "loggingIn": "Logging In...", + "username": "Username", + "enterUsername": "Enter username", + "useEmailInstead": "Login with email", + "forgotPassword": "Forgot your password?", + "logIn": "Log In", + "signingIn": "Signing in...", + "login": "Login", + "or": "Or", + "useMagicLink": "Use magic link instead", + "enterEmailForMagicLink": "Enter your email for magic link", + "sending": "Sendingâ€Ļ", + "sendMagicLink": "Send Magic Link", + "cancel": "Cancel", + "dontHaveAccount": "Don't have an account? Sign up", + "home": "Home", + "debug": "Debug", + "signOut": "Sign Out", + "pleaseEnterBoth": "Please enter both email and password", + "pleaseEnterEmail": "Please enter your email address", + "magicLinkSent": "Magic link sent to {{email}}! Check your email and click the link to sign in.", + "passwordResetSent": "Password reset link sent to {{email}}! Check your email and follow the instructions.", + "failedToSignIn": "Failed to sign in with {{provider}}: {{message}}", + "unexpectedError": "Unexpected error: {{message}}", + "accountCreatedSuccess": "Account created successfully! You can now sign in.", + "passwordChangedSuccess": "Password changed successfully! Please sign in with your new password.", + "credentialsUpdated": "Your credentials have been updated. Please sign in again." + }, + "signup": { + "title": "Create an account", + "subtitle": "Join Stirling PDF to get started", + "name": "Name", + "email": "Email", + "password": "Password", + "confirmPassword": "Confirm password", + "enterName": "Enter your name", + "enterEmail": "Enter your email", + "enterPassword": "Enter your password", + "confirmPasswordPlaceholder": "Confirm password", + "or": "or", + "creatingAccount": "Creating Account...", + "signUp": "Sign Up", + "alreadyHaveAccount": "Already have an account? Sign in", + "pleaseFillAllFields": "Please fill in all fields", + "passwordsDoNotMatch": "Passwords do not match", + "passwordTooShort": "Password must be at least 6 characters long", + "invalidEmail": "Please enter a valid email address", + "checkEmailConfirmation": "Check your email for a confirmation link to complete your registration.", + "accountCreatedSuccessfully": "Account created successfully! You can now sign in.", + "unexpectedError": "Unexpected error: {{message}}", + "useEmailInstead": "Use Email Instead", + "nameRequired": "Name is required", + "emailRequired": "Email is required", + "passwordRequired": "Password is required", + "confirmPasswordRequired": "Please confirm your password" }, "pdfToSinglePage": { "title": "PDF u Jednu Stranicu", "header": "PDF u Jednu Stranicu", - "submit": "Pretvori u Jednu Stranicu" + "submit": "Pretvori u Jednu Stranicu", + "description": "This tool will merge all pages of your PDF into one large single page. The width will remain the same as the original pages, but the height will be the sum of all page heights.", + "filenamePrefix": "single_page", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst converting to single page." + }, + "results": { + "title": "Single Page Results" + } }, "pageExtracter": { "title": "Izdvojiti stranice", @@ -1469,18 +3373,59 @@ "adjustContrast": { "title": "Podesite kontrast", "header": "Podesite kontrast", + "basic": "Basic Adjustments", "contrast": "Kontrast:", "brightness": "Osvjetljenje:", "saturation": "Zasićenje:", - "download": "Preuzmi" + "download": "Preuzmi", + "adjustColors": "Adjust Colors", + "blue": "Blue", + "confirm": "Confirm", + "error": { + "failed": "Failed to adjust colors/contrast" + }, + "green": "Green", + "noPreview": "Select a PDF to preview", + "red": "Red", + "results": { + "title": "Adjusted PDF" + } }, "compress": { "title": "Komprimirajte", + "desc": "Compress PDFs to reduce their file size.", "header": "Komprimirajte PDF", + "method": { + "title": "Compression Method", + "quality": "Quality", + "filesize": "Veličina datoteke" + }, "credit": "Ova usluga koristi qpdf za komprimiranje / optimizaciju PDF-a.", "grayscale": { "label": "Primijeni sivinu za kompresiju" }, + "tooltip": { + "header": { + "title": "Compress Settings Overview" + }, + "description": { + "title": "Description", + "text": "Compression is an easy way to reduce your file size. Pick File Size to enter a target size and have us adjust quality for you. Pick Quality to set compression strength manually." + }, + "qualityAdjustment": { + "title": "Quality Adjustment", + "text": "Drag the slider to adjust the compression strength. Lower values (1-3) preserve quality but result in larger files. Higher values (7-9) shrink the file more but reduce image clarity.", + "bullet1": "Lower values preserve quality", + "bullet2": "Higher values reduce file size" + }, + "grayscale": { + "title": "Grayscale", + "text": "Select this option to convert all images to black and white, which can significantly reduce file size especially for scanned PDFs or image-heavy documents." + } + }, + "error": { + "failed": "An error occurred while compressing the PDF." + }, "selectText": { "1": { "_value": "Compression Settings", @@ -1490,10 +3435,7 @@ "4": "Automatski način - Automatski prilagođava kvalitetu kako bi PDF dobio točnu veličinu", "5": "Očekivana veličina PDF-a (npr. 25 MB, 10,8 MB, 25 KB)" }, - "submit": "Kompresiraj", - "method": { - "filesize": "Veličina datoteke" - } + "submit": "Kompresiraj" }, "decrypt": { "passwordPrompt": "This file is password-protected. Please enter the password:", @@ -1594,7 +3536,13 @@ "title": "Ukloni sliku", "header": "Ukloni sliku", "removeImage": "Ukloni sliku", - "submit": "IzbriÅĄi sliku" + "submit": "IzbriÅĄi sliku", + "error": { + "failed": "Failed to remove images from the PDF." + }, + "results": { + "title": "Remove Images Results" + } }, "splitByChapters": { "title": "Podijeli PDF naoglazdene glave", @@ -1628,6 +3576,12 @@ }, "note": "Release notes are only available in English" }, + "swagger": { + "title": "API Documentation", + "header": "API Documentation", + "desc": "View and test the Stirling PDF API endpoints", + "tags": "api,documentation,swagger,endpoints,development" + }, "cookieBanner": { "popUp": { "title": "How we use Cookies", @@ -1663,45 +3617,943 @@ "title": "Analytics", "description": "These cookies help us understand how our tools are being used, so we can focus on building the features our community values most. Rest assured—Stirling PDF cannot and will never track the content of the documents you work with." } + }, + "services": { + "posthog": "PostHog Analytics", + "scarf": "Scarf Pixel" } }, - "download": "Preuzmi datoteku", - "convert": { - "title": "Pretvori", - "settings": "Postavke", - "color": "Boja", - "greyscale": "Sivi tonovi", - "fillPage": "Ispuni stranicu", - "pdfaDigitalSignatureWarning": "PDF sadrÅži digitalni potpis. U sledećem koraku će biti uklonjen.", - "grayscale": "Sivi tonovi" + "removeMetadata": { + "submit": "Remove Metadata" }, - "attachments": { - "tags": "embed,attach,file,attachment,attachments", - "title": "Add attachments", - "header": "Add attachments", - "submit": "Add attachments" + "sidebar": { + "toggle": "Toggle Sidebar" + }, + "theme": { + "toggle": "Toggle Theme" + }, + "view": { + "viewer": "Viewer", + "pageEditor": "Page Editor", + "fileManager": "File Manager" + }, + "pageEditor": { + "title": "Page Editor", + "save": "Save Changes", + "noPdfLoaded": "No PDF loaded. Please upload a PDF to edit.", + "rotatedLeft": "Rotated left:", + "rotatedRight": "Rotated right:", + "deleted": "Deleted:", + "movedLeft": "Moved left:", + "movedRight": "Moved right:", + "splitAt": "Split at:", + "insertedPageBreak": "Inserted page break at:", + "addFileNotImplemented": "Add file not implemented in demo", + "closePdf": "Close PDF", + "reset": "Reset Changes", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "fitToWidth": "Fit to Width", + "actualSize": "Actual Size" + }, + "viewer": { + "firstPage": "First Page", + "lastPage": "Last Page", + "previousPage": "Previous Page", + "nextPage": "Next Page", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "singlePageView": "Single Page View", + "dualPageView": "Dual Page View" + }, + "rightRail": { + "closeSelected": "Close Selected Files", + "selectAll": "Select All", + "deselectAll": "Deselect All", + "selectByNumber": "Select by Page Numbers", + "deleteSelected": "Delete Selected Pages", + "closePdf": "Close PDF", + "exportAll": "Export PDF", + "downloadSelected": "Download Selected Files", + "downloadAll": "Download All", + "toggleTheme": "Toggle Theme", + "language": "Language", + "search": "Search PDF", + "panMode": "Pan Mode", + "rotateLeft": "Rotate Left", + "rotateRight": "Rotate Right", + "toggleSidebar": "Toggle Sidebar", + "exportSelected": "Export Selected Pages", + "toggleAnnotations": "Toggle Annotations Visibility", + "annotationMode": "Toggle Annotation Mode", + "draw": "Draw", + "save": "Save" + }, + "search": { + "title": "Search PDF", + "placeholder": "Enter search term...", + "noResults": "No results found", + "searching": "Searching..." + }, + "guestBanner": { + "title": "You're using Stirling PDF as a guest!", + "message": "Create a free account to save your work, access more features, and support the project.", + "dismiss": "Dismiss banner", + "signUp": "Sign Up Free" + }, + "toolPicker": { + "searchPlaceholder": "Search tools...", + "noToolsFound": "No tools found", + "allTools": "ALL TOOLS", + "quickAccess": "QUICK ACCESS", + "categories": { + "standardTools": "Standard Tools", + "advancedTools": "Advanced Tools", + "recommendedTools": "Recommended Tools" + }, + "subcategories": { + "signing": "Signing", + "documentSecurity": "Document Security", + "verification": "Verification", + "documentReview": "Document Review", + "pageFormatting": "Page Formatting", + "extraction": "Extraction", + "removal": "Removal", + "automation": "Automation", + "general": "General", + "advancedFormatting": "Advanced Formatting", + "developerTools": "Developer Tools" + } }, "quickAccess": { - "sign": "Potpisati" + "read": "Read", + "sign": "Potpisati", + "automate": "Automate", + "files": "Files", + "activity": "Activity", + "help": "Help", + "account": "Account", + "config": "Config", + "adminSettings": "Admin Settings", + "allTools": "All Tools" + }, + "admin": { + "error": "Error", + "success": "Success", + "expand": "Expand", + "close": "Close", + "status": { + "active": "Active", + "inactive": "Inactive" + }, + "settings": { + "title": "Admin Settings", + "workspace": "Workspace", + "fetchError": "Failed to load settings", + "saveError": "Failed to save settings", + "saved": "Settings saved successfully", + "saveSuccess": "Settings saved successfully", + "save": "Save Changes", + "restartRequired": "Restart Required", + "restart": { + "title": "Restart Required", + "message": "Settings have been saved successfully. A server restart is required for the changes to take effect.", + "question": "Would you like to restart the server now or later?", + "now": "Restart Now", + "later": "Restart Later" + }, + "restarting": "Restarting Server", + "restartingMessage": "The server is restarting. Please wait a moment...", + "restartError": "Failed to restart server. Please restart manually.", + "general": { + "title": "System Settings", + "description": "Configure system-wide application settings including branding and default behaviour.", + "ui": "User Interface", + "system": "System", + "appName": { + "label": "Application Name", + "description": "The name displayed in the browser tab and home page" + }, + "appNameNavbar": { + "label": "Navbar Brand", + "description": "The name displayed in the navigation bar" + }, + "homeDescription": { + "label": "Home Description", + "description": "The description text shown on the home page" + }, + "defaultLocale": { + "label": "Default Locale", + "description": "The default language for new users (e.g., en_US, es_ES)" + }, + "fileUploadLimit": { + "label": "File Upload Limit", + "description": "Maximum file upload size (e.g., 100MB, 1GB)" + }, + "showUpdate": { + "label": "Show Update Notifications", + "description": "Display notifications when a new version is available" + }, + "showUpdateOnlyAdmin": { + "label": "Show Updates to Admins Only", + "description": "Restrict update notifications to admin users only" + }, + "customHTMLFiles": { + "label": "Custom HTML Files", + "description": "Allow serving custom HTML files from the customFiles directory" + }, + "languages": { + "label": "Available Languages", + "description": "Languages that users can select from (leave empty to enable all languages)" + }, + "customMetadata": { + "label": "Custom Metadata", + "autoUpdate": { + "label": "Auto Update Metadata", + "description": "Automatically update PDF metadata on all processed documents" + }, + "author": { + "label": "Default Author", + "description": "Default author for PDF metadata (e.g., username)" + }, + "creator": { + "label": "Default Creator", + "description": "Default creator for PDF metadata" + }, + "producer": { + "label": "Default Producer", + "description": "Default producer for PDF metadata" + } + }, + "customPaths": { + "label": "Custom Paths", + "description": "Configure custom file system paths for pipeline processing and external tools", + "pipeline": { + "label": "Pipeline Directories", + "watchedFoldersDir": { + "label": "Watched Folders Directory", + "description": "Directory where pipeline monitors for incoming PDFs (leave empty for default: /pipeline/watchedFolders)" + }, + "finishedFoldersDir": { + "label": "Finished Folders Directory", + "description": "Directory where processed PDFs are outputted (leave empty for default: /pipeline/finishedFolders)" + } + }, + "operations": { + "label": "External Tool Paths", + "weasyprint": { + "label": "WeasyPrint Executable", + "description": "Path to WeasyPrint executable for HTML to PDF conversion (leave empty for default: /opt/venv/bin/weasyprint)" + }, + "unoconvert": { + "label": "Unoconvert Executable", + "description": "Path to LibreOffice unoconvert for document conversions (leave empty for default: /opt/venv/bin/unoconvert)" + } + } + } + }, + "security": { + "title": "Security", + "description": "Configure authentication, login behaviour, and security policies.", + "ssoNotice": { + "title": "Looking for SSO/SAML settings?", + "message": "OAuth2 and SAML2 authentication providers have been moved to the Connections menu for easier management." + }, + "authentication": "Authentication", + "enableLogin": { + "label": "Enable Login", + "description": "Require users to log in before accessing the application" + }, + "loginMethod": { + "label": "Login Method", + "description": "The authentication method to use for user login", + "all": "All Methods", + "normal": "Username/Password Only", + "oauth2": "OAuth2 Only", + "saml2": "SAML2 Only" + }, + "loginAttemptCount": { + "label": "Login Attempt Limit", + "description": "Maximum number of failed login attempts before account lockout" + }, + "loginResetTimeMinutes": { + "label": "Login Reset Time (minutes)", + "description": "Time before failed login attempts are reset" + }, + "csrfDisabled": { + "label": "Disable CSRF Protection", + "description": "Disable Cross-Site Request Forgery protection (not recommended)" + }, + "initialLogin": { + "label": "Initial Login", + "username": { + "label": "Initial Username", + "description": "The username for the initial admin account" + }, + "password": { + "label": "Initial Password", + "description": "The password for the initial admin account" + } + }, + "jwt": { + "label": "JWT Configuration", + "secureCookie": { + "label": "Secure Cookie", + "description": "Require HTTPS for JWT cookies (recommended for production)" + }, + "keyRetentionDays": { + "label": "Key Retention Days", + "description": "Number of days to retain old JWT keys for verification" + }, + "persistence": { + "label": "Enable Key Persistence", + "description": "Store JWT keys persistently to survive server restarts" + }, + "enableKeyRotation": { + "label": "Enable Key Rotation", + "description": "Automatically rotate JWT signing keys periodically" + }, + "enableKeyCleanup": { + "label": "Enable Key Cleanup", + "description": "Automatically remove expired JWT keys" + } + }, + "audit": { + "label": "Audit Logging", + "enabled": { + "label": "Enable Audit Logging", + "description": "Track user actions and system events for compliance and security monitoring" + }, + "level": { + "label": "Audit Level", + "description": "0=OFF, 1=BASIC, 2=STANDARD, 3=VERBOSE" + }, + "retentionDays": { + "label": "Audit Retention (days)", + "description": "Number of days to retain audit logs" + } + }, + "htmlUrlSecurity": { + "label": "HTML URL Security", + "description": "Configure URL access restrictions for HTML processing to prevent SSRF attacks", + "enabled": { + "label": "Enable URL Security", + "description": "Enable URL security restrictions for HTML to PDF conversions" + }, + "level": { + "label": "Security Level", + "description": "MAX: whitelist only, MEDIUM: block internal networks, OFF: no restrictions", + "max": "Maximum (Whitelist Only)", + "medium": "Medium (Block Internal)", + "off": "Off (No Restrictions)" + }, + "advanced": "Advanced Settings", + "allowedDomains": { + "label": "Allowed Domains (Whitelist)", + "description": "One domain per line (e.g., cdn.example.com). Only these domains allowed when level is MAX" + }, + "blockedDomains": { + "label": "Blocked Domains (Blacklist)", + "description": "One domain per line (e.g., malicious.com). Additional domains to block" + }, + "internalTlds": { + "label": "Internal TLDs", + "description": "One TLD per line (e.g., .local, .internal). Block domains with these TLD patterns" + }, + "networkBlocking": "Network Blocking", + "blockPrivateNetworks": { + "label": "Block Private Networks", + "description": "Block RFC 1918 private networks (10.x.x.x, 192.168.x.x, 172.16-31.x.x)" + }, + "blockLocalhost": { + "label": "Block Localhost", + "description": "Block localhost and loopback addresses (127.x.x.x, ::1)" + }, + "blockLinkLocal": { + "label": "Block Link-Local Addresses", + "description": "Block link-local addresses (169.254.x.x, fe80::/10)" + }, + "blockCloudMetadata": { + "label": "Block Cloud Metadata Endpoints", + "description": "Block cloud provider metadata endpoints (169.254.169.254)" + } + } + }, + "connections": { + "title": "Connections", + "description": "Configure external authentication providers like OAuth2 and SAML.", + "linkedServices": "Linked Services", + "unlinkedServices": "Unlinked Services", + "connect": "Connect", + "disconnect": "Disconnect", + "disconnected": "Provider disconnected successfully", + "disconnectError": "Failed to disconnect provider", + "ssoAutoLogin": { + "label": "SSO Auto Login", + "enable": "Enable SSO Auto Login", + "description": "Automatically redirect to SSO login when authentication is required" + }, + "oauth2": { + "label": "OAuth2", + "enabled": { + "label": "Enable OAuth2", + "description": "Allow users to authenticate using OAuth2 providers" + }, + "provider": { + "label": "Provider", + "description": "The OAuth2 provider to use for authentication" + }, + "issuer": { + "label": "Issuer URL", + "description": "The OAuth2 provider issuer URL" + }, + "clientId": { + "label": "Client ID", + "description": "The OAuth2 client ID from your provider" + }, + "clientSecret": { + "label": "Client Secret", + "description": "The OAuth2 client secret from your provider" + }, + "useAsUsername": { + "label": "Use as Username", + "description": "The OAuth2 claim to use as the username (e.g., email, sub)" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first OAuth2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via OAuth2" + }, + "scopes": { + "label": "OAuth2 Scopes", + "description": "Comma-separated list of OAuth2 scopes to request (e.g., openid, profile, email)" + } + }, + "saml2": { + "label": "SAML2", + "enabled": { + "label": "Enable SAML2", + "description": "Allow users to authenticate using SAML2 providers" + }, + "provider": { + "label": "Provider", + "description": "The SAML2 provider name" + }, + "registrationId": { + "label": "Registration ID", + "description": "The SAML2 registration identifier" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first SAML2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via SAML2" + } + } + }, + "database": { + "title": "Database", + "description": "Configure custom database connection settings for enterprise deployments.", + "configuration": "Database Configuration", + "enableCustom": { + "label": "Enable Custom Database", + "description": "Use your own custom database configuration instead of the default embedded database" + }, + "customUrl": { + "label": "Custom Database URL", + "description": "Full JDBC connection string (e.g., jdbc:postgresql://localhost:5432/postgres). If provided, individual connection settings below are not used." + }, + "type": { + "label": "Database Type", + "description": "Type of database (not used if custom URL is provided)" + }, + "hostName": { + "label": "Host Name", + "description": "Database server hostname (not used if custom URL is provided)" + }, + "port": { + "label": "Port", + "description": "Database server port (not used if custom URL is provided)" + }, + "name": { + "label": "Database Name", + "description": "Name of the database (not used if custom URL is provided)" + }, + "username": { + "label": "Username", + "description": "Database authentication username" + }, + "password": { + "label": "Password", + "description": "Database authentication password" + } + }, + "privacy": { + "title": "Privacy", + "description": "Configure privacy and data collection settings.", + "analytics": "Analytics & Tracking", + "enableAnalytics": { + "label": "Enable Analytics", + "description": "Collect anonymous usage analytics to help improve the application" + }, + "metricsEnabled": { + "label": "Enable Metrics", + "description": "Enable collection of performance and usage metrics. Provides API endpoint for admins to access metrics data" + }, + "searchEngine": "Search Engine Visibility", + "googleVisibility": { + "label": "Google Visibility", + "description": "Allow search engines to index this application" + } + }, + "advanced": { + "title": "Advanced", + "description": "Configure advanced features and experimental functionality.", + "features": "Feature Flags", + "processing": "Processing", + "endpoints": { + "label": "Endpoints", + "manage": "Manage API Endpoints", + "description": "Endpoint management is configured via YAML. See documentation for details on enabling/disabling specific endpoints." + }, + "enableAlphaFunctionality": { + "label": "Enable Alpha Features", + "description": "Enable experimental and alpha-stage features (may be unstable)" + }, + "enableUrlToPDF": { + "label": "Enable URL to PDF", + "description": "Allow conversion of web pages to PDF documents" + }, + "maxDPI": { + "label": "Maximum DPI", + "description": "Maximum DPI for image processing (0 = unlimited)" + }, + "tessdataDir": { + "label": "Tessdata Directory", + "description": "Path to the tessdata directory for OCR language files" + }, + "disableSanitize": { + "label": "Disable HTML Sanitization", + "description": "WARNING: Security risk - disabling HTML sanitization can lead to XSS vulnerabilities" + }, + "tempFileManagement": { + "label": "Temp File Management", + "description": "Configure temporary file storage and cleanup behavior", + "baseTmpDir": { + "label": "Base Temp Directory", + "description": "Base directory for temporary files (leave empty for default: java.io.tmpdir/stirling-pdf)" + }, + "libreofficeDir": { + "label": "LibreOffice Temp Directory", + "description": "Directory for LibreOffice temp files (leave empty for default: baseTmpDir/libreoffice)" + }, + "systemTempDir": { + "label": "System Temp Directory", + "description": "System temp directory to clean (only used if cleanupSystemTemp is enabled)" + }, + "prefix": { + "label": "Temp File Prefix", + "description": "Prefix for temp file names" + }, + "maxAgeHours": { + "label": "Max Age (hours)", + "description": "Maximum age in hours before temp files are cleaned up" + }, + "cleanupIntervalMinutes": { + "label": "Cleanup Interval (minutes)", + "description": "How often to run cleanup (in minutes)" + }, + "startupCleanup": { + "label": "Startup Cleanup", + "description": "Clean up old temp files on application startup" + }, + "cleanupSystemTemp": { + "label": "Cleanup System Temp", + "description": "Whether to clean broader system temp directory (use with caution)" + } + }, + "processExecutor": { + "label": "Process Executor Limits", + "description": "Configure session limits and timeouts for each process executor", + "sessionLimit": { + "label": "Session Limit", + "description": "Maximum concurrent instances" + }, + "timeout": { + "label": "Timeout (minutes)", + "description": "Maximum execution time" + }, + "libreOffice": "LibreOffice", + "pdfToHtml": "PDF to HTML", + "qpdf": "QPDF", + "tesseract": "Tesseract OCR", + "pythonOpenCv": "Python OpenCV", + "weasyPrint": "WeasyPrint", + "installApp": "Install App", + "calibre": "Calibre", + "ghostscript": "Ghostscript", + "ocrMyPdf": "OCRmyPDF" + } + }, + "mail": { + "title": "Mail Server", + "description": "Configure SMTP settings for sending email notifications.", + "smtp": "SMTP Configuration", + "enabled": { + "label": "Enable Mail", + "description": "Enable email notifications and SMTP functionality" + }, + "host": { + "label": "SMTP Host", + "description": "The hostname or IP address of your SMTP server" + }, + "port": { + "label": "SMTP Port", + "description": "The port number for SMTP connection (typically 25, 465, or 587)" + }, + "username": { + "label": "SMTP Username", + "description": "Username for SMTP authentication" + }, + "password": { + "label": "SMTP Password", + "description": "Password for SMTP authentication" + }, + "from": { + "label": "From Address", + "description": "The email address to use as the sender" + }, + "enableInvites": { + "label": "Enable Email Invites", + "description": "Allow admins to invite users via email with auto-generated passwords" + }, + "frontendUrl": { + "label": "Frontend URL", + "description": "Base URL for frontend (e.g. https://pdf.example.com). Used for generating invite links in emails. Leave empty to use backend URL." + } + }, + "legal": { + "title": "Legal Documents", + "description": "Configure links to legal documents and policies.", + "disclaimer": { + "title": "Legal Responsibility Warning", + "message": "By customizing these legal documents, you assume full responsibility for ensuring compliance with all applicable laws and regulations, including but not limited to GDPR and other EU data protection requirements. Only modify these settings if: (1) you are operating a personal/private instance, (2) you are outside EU jurisdiction and understand your local legal obligations, or (3) you have obtained proper legal counsel and accept sole responsibility for all user data and legal compliance. Stirling-PDF and its developers assume no liability for your legal obligations." + }, + "termsAndConditions": { + "label": "Terms and Conditions", + "description": "URL or filename to terms and conditions" + }, + "privacyPolicy": { + "label": "Privacy Policy", + "description": "URL or filename to privacy policy" + }, + "accessibilityStatement": { + "label": "Accessibility Statement", + "description": "URL or filename to accessibility statement" + }, + "cookiePolicy": { + "label": "Cookie Policy", + "description": "URL or filename to cookie policy" + }, + "impressum": { + "label": "Impressum", + "description": "URL or filename to impressum (required in some jurisdictions)" + } + }, + "premium": { + "title": "Premium & Enterprise", + "description": "Configure your premium or enterprise license key.", + "license": "License Configuration", + "key": { + "label": "License Key", + "description": "Enter your premium or enterprise license key" + }, + "enabled": { + "label": "Enable Premium Features", + "description": "Enable license key checks for pro/enterprise features" + }, + "movedFeatures": { + "title": "Premium Features Distributed", + "message": "Premium and Enterprise features are now organized in their respective sections:" + } + }, + "features": { + "title": "Features", + "description": "Configure optional features and functionality.", + "serverCertificate": { + "label": "Server Certificate", + "description": "Configure server-side certificate generation for \"Sign with Stirling-PDF\" functionality", + "enabled": { + "label": "Enable Server Certificate", + "description": "Enable server-side certificate for \"Sign with Stirling-PDF\" option" + }, + "organizationName": { + "label": "Organization Name", + "description": "Organization name for generated certificates" + }, + "validity": { + "label": "Certificate Validity (days)", + "description": "Number of days the certificate will be valid" + }, + "regenerateOnStartup": { + "label": "Regenerate on Startup", + "description": "Generate new certificate on each application startup" + } + } + }, + "endpoints": { + "title": "API Endpoints", + "description": "Control which API endpoints and endpoint groups are available.", + "management": "Endpoint Management", + "toRemove": { + "label": "Disabled Endpoints", + "description": "Select individual endpoints to disable" + }, + "groupsToRemove": { + "label": "Disabled Endpoint Groups", + "description": "Select endpoint groups to disable" + }, + "note": "Note: Disabling endpoints restricts API access but does not remove UI components. Restart required for changes to take effect." + } + } }, "fileUpload": { - "loading": "Učitavanje..." + "selectFile": "Select a file", + "selectFiles": "Select files", + "selectPdfToView": "Select a PDF to view", + "selectPdfToEdit": "Select a PDF to edit", + "chooseFromStorage": "Choose a file from storage or upload a new PDF", + "chooseFromStorageMultiple": "Choose files from storage or upload new PDFs", + "loadFromStorage": "Load from Storage", + "filesAvailable": "files available", + "loading": "Učitavanje...", + "or": "or", + "dropFileHere": "Drop file here or click to upload", + "dropFilesHere": "Drop files here or click the upload button", + "pdfFilesOnly": "PDF files only", + "supportedFileTypes": "Supported file types", + "upload": "Upload", + "uploadFile": "Upload File", + "uploadFiles": "Upload Files", + "noFilesInStorage": "No files available in storage. Upload some files first.", + "selectFromStorage": "Select from Storage", + "backToTools": "Back to Tools", + "addFiles": "Add Files", + "dragFilesInOrClick": "Drag files in or click \"Add Files\" to browse" + }, + "fileEditor": { + "addFiles": "Add Files" }, "fileManager": { + "title": "Upload PDF Files", + "subtitle": "Add files to your storage for easy access across tools", + "filesSelected": "files selected", + "clearSelection": "Clear Selection", + "openInFileEditor": "Open in File Editor", + "uploadError": "Failed to upload some files.", + "failedToOpen": "Failed to open file. It may have been removed from storage.", + "failedToLoad": "Failed to load file to active set.", + "storageCleared": "Browser cleared storage. Files have been removed. Please re-upload.", + "clearAll": "Clear All", + "reloadFiles": "Reload Files", + "dragDrop": "Drag & Drop files here", + "clickToUpload": "Click to upload files", + "selectedFiles": "Selected Files", + "storage": "Storage", + "filesStored": "files stored", + "storageError": "Storage error occurred", + "storageLow": "Storage is running low. Consider removing old files.", + "supportMessage": "Powered by browser database storage for unlimited capacity", + "noFileSelected": "No files selected", + "showHistory": "Show History", + "hideHistory": "Hide History", + "fileHistory": "File History", + "loadingHistory": "Loading History...", + "lastModified": "Last Modified", + "toolChain": "Tools Applied", + "restore": "Restore", + "unzip": "Unzip", + "searchFiles": "Search files...", + "recent": "Recent", + "localFiles": "Local Files", + "googleDrive": "Google Drive", + "googleDriveShort": "Drive", + "myFiles": "My Files", + "noRecentFiles": "No recent files found", + "googleDriveNotAvailable": "Google Drive integration not available", + "openFiles": "Open Files", + "openFile": "Open File", + "details": "File Details", "fileName": "Ime", + "fileFormat": "Format", + "fileSize": "Size", "fileVersion": "Verzija", + "totalSelected": "Total Selected", + "dropFilesHere": "Drop files here", + "selectAll": "Select All", + "deselectAll": "Deselect All", + "deleteSelected": "Delete Selected", + "downloadSelected": "Download Selected", + "selectedCount": "{{count}} selected", "download": "Preuzmi datoteku", - "delete": "IzbriÅĄi" + "delete": "IzbriÅĄi", + "unsupported": "Unsupported", + "addToUpload": "Add to Upload", + "deleteAll": "Delete All", + "loadingFiles": "Loading files...", + "noFiles": "No files available", + "noFilesFound": "No files found matching your search", + "openInPageEditor": "Open in Page Editor", + "showAll": "Show All", + "sortByDate": "Sort by Date", + "sortByName": "Sort by Name", + "sortBySize": "Sort by Size" + }, + "storage": { + "temporaryNotice": "Files are stored temporarily in your browser and may be cleared automatically", + "storageLimit": "Storage limit", + "storageUsed": "Temporary Storage used", + "storageFull": "Storage is nearly full. Consider removing some files.", + "fileTooLarge": "File too large. Maximum size per file is", + "storageQuotaExceeded": "Storage quota exceeded. Please remove some files before uploading more.", + "approximateSize": "Approximate size" }, "sanitize": { + "title": "Sanitise", + "desc": "Remove potentially harmful elements from PDF files.", "submit": "Sanirajte PDF", + "completed": "Sanitisation completed successfully", + "error": { + "generic": "Sanitisation failed", + "failed": "An error occurred while sanitising the PDF." + }, + "filenamePrefix": "sanitised", + "sanitizationResults": "Sanitisation Results", "steps": { - "settings": "Postavke" + "files": "Files", + "settings": "Postavke", + "results": "Results" + }, + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "options": { + "title": "Sanitisation Options", + "note": "Select the elements you want to remove from the PDF. At least one option must be selected.", + "removeJavaScript": { + "label": "Remove JavaScript", + "desc": "Remove JavaScript actions and scripts from the PDF" + }, + "removeEmbeddedFiles": { + "label": "Remove Embedded Files", + "desc": "Remove any files embedded within the PDF" + }, + "removeXMPMetadata": { + "label": "Remove XMP Metadata", + "desc": "Remove XMP metadata from the PDF" + }, + "removeMetadata": { + "label": "Remove Document Metadata", + "desc": "Remove document information metadata (title, author, etc.)" + }, + "removeLinks": { + "label": "Remove Links", + "desc": "Remove external links and launch actions from the PDF" + }, + "removeFonts": { + "label": "Remove Fonts", + "desc": "Remove embedded fonts from the PDF" + } + } + }, + "addPassword": { + "title": "Dodajte zaporku", + "desc": "Encrypt your PDF document with a password.", + "completed": "Password protection applied", + "submit": "Å ifriraj", + "filenamePrefix": "encrypted", + "error": { + "failed": "An error occurred while encrypting the PDF." + }, + "passwords": { + "stepTitle": "Passwords & Encryption", + "completed": "Passwords configured", + "user": { + "label": "User Password", + "placeholder": "Enter user password" + }, + "owner": { + "label": "Owner Password", + "placeholder": "Enter owner password" + } + }, + "encryption": { + "keyLength": { + "label": "Encryption Key Length", + "40bit": "40-bit (Low)", + "128bit": "128-bit (Standard)", + "256bit": "256-bit (High)" + } + }, + "results": { + "title": "Encrypted PDFs" + }, + "tooltip": { + "header": { + "title": "Password Protection Overview" + }, + "passwords": { + "title": "Password Types", + "text": "User passwords restrict opening the document, while owner passwords control what can be done with the document once opened. You can set both or just one.", + "bullet1": "User Password: Required to open the PDF", + "bullet2": "Owner Password: Controls document permissions (not supported by all PDF viewers)" + }, + "encryption": { + "title": "Encryption Levels", + "text": "Higher encryption levels provide better security but may not be supported by older PDF viewers.", + "bullet1": "40-bit: Basic security, compatible with older viewers", + "bullet2": "128-bit: Standard security, widely supported", + "bullet3": "256-bit: Maximum security, requires modern viewers" + }, + "permissions": { + "title": "Promjena dopuÅĄtenja", + "text": "These permissions control what users can do with the PDF. Most effective when combined with an owner password." + } + }, + "tags": "sigurno, sigurnost", + "header": "Dodajte zaporku (kriptiraj)", + "selectText": { + "1": "Odaberite PDF za ÅĄifriranje", + "2": "Korisnička Zaporka", + "3": "DuÅžina ključa ÅĄifriranja", + "4": "ViÅĄe vrijednosti su jače, ali niÅže vrijednosti imaju bolju kompatibilnost.", + "5": "DopuÅĄtenja za postavljanje (preporučuje se koriÅĄtenje uz vlasničku lozinku)", + "6": "Spriječiti sastavljanje dokumenta", + "7": "Spriječite izdvajanje sadrÅžaja", + "8": "Spriječite izvlačenje radi pristupačnosti", + "9": "Spriječiti ispunjavanje obrasca", + "10": "Spriječiti izmjene", + "11": "Spriječi modificiranje napomena", + "12": "Spriječiti ispis", + "13": "Spriječite ispis različitih formata", + "14": "Zaporka vlasnika", + "15": "Ograničava ÅĄto se moÅže učiniti s dokumentom nakon ÅĄto se otvori (ne podrÅžavaju svi čitači)", + "16": "Ograničava otvaranje samog dokumenta" } }, "changePermissions": { "title": "Promjena dopuÅĄtenja", + "desc": "Change document restrictions and permissions.", + "completed": "Permissions changed", "submit": "Promjena dopuÅĄtenja", + "error": { + "failed": "An error occurred while changing PDF permissions." + }, "permissions": { "preventAssembly": { "label": "Spriječiti sastavljanje dokumenta" @@ -1728,10 +4580,784 @@ "label": "Spriječite ispis različitih formata" } }, + "results": { + "title": "Modified PDFs" + }, "tooltip": { "header": { "title": "Promjena dopuÅĄtenja" + }, + "description": { + "text": "Changes document permissions, allowing/disallowing access to different features in PDF readers." + }, + "warning": { + "text": "To make these permissions unchangeable, use the Add Password tool to set an owner password." } } + }, + "removePassword": { + "title": "Ukloni zaporku", + "desc": "Uklonite zaÅĄtitu lozinkom sa svog PDF dokumenta..", + "tags": "sigurno, deÅĄifriranje, sigurnost, poniÅĄti lozinku, izbriÅĄi lozinku", + "password": { + "stepTitle": "Ukloni lozinku", + "label": "Trenutna zaporka", + "placeholder": "Enter current password", + "completed": "Password configured" + }, + "filenamePrefix": "decrypted", + "error": { + "failed": "An error occurred while removing the password from the PDF." + }, + "tooltip": { + "description": "Removing password protection requires the password that was used to encrypt the PDF. This will decrypt the document, making it accessible without a password." + }, + "submit": "Ukloniti", + "results": { + "title": "Decrypted PDFs" + }, + "header": "Ukloni zaporku (dekriptiraj)", + "selectText": { + "1": "Odaberite PDF za dekriptiranje", + "2": "Zaporka" + } + }, + "automate": { + "title": "Automate", + "desc": "Build multi-step workflows by chaining together PDF actions. Ideal for recurring tasks.", + "invalidStep": "Invalid step", + "files": { + "placeholder": "Select files to process with this automation" + }, + "selection": { + "title": "Automation Selection", + "saved": { + "title": "Saved" + }, + "createNew": { + "title": "Create New Automation" + }, + "suggested": { + "title": "Suggested" + } + }, + "creation": { + "createTitle": "Create Automation", + "editTitle": "Edit Automation", + "intro": "Automations run tools sequentially. To get started, add tools in the order you want them to run.", + "name": { + "label": "Automation Name", + "placeholder": "My Automation" + }, + "description": { + "label": "Description (optional)", + "placeholder": "Describe what this automation does..." + }, + "tools": { + "selectTool": "Select a tool...", + "selected": "Selected Tools", + "remove": "Remove tool", + "configure": "Configure tool", + "notConfigured": "! Not Configured", + "addTool": "Add Tool", + "add": "Add a tool..." + }, + "save": "Save Automation", + "unsavedChanges": { + "title": "Unsaved Changes", + "message": "You have unsaved changes. Are you sure you want to go back? All changes will be lost.", + "cancel": "Cancel", + "confirm": "Go Back" + }, + "icon": { + "label": "Icon" + } + }, + "run": { + "title": "Run Automation" + }, + "sequence": { + "unnamed": "Unnamed Automation", + "steps": "{{count}} steps", + "running": "Running Automation...", + "run": "Run Automation", + "finish": "Finish" + }, + "reviewTitle": "Automation Results", + "config": { + "loading": "Loading tool configuration...", + "noSettings": "This tool does not have configurable settings.", + "title": "Configure {{toolName}}", + "description": "Configure the settings for this tool. These settings will be applied when the automation runs.", + "cancel": "Cancel", + "save": "Save Configuration" + }, + "copyToSaved": "Copy to Saved" + }, + "automation": { + "suggested": { + "securePdfIngestion": "Secure PDF Ingestion", + "securePdfIngestionDesc": "Comprehensive PDF processing workflow that sanitises documents, applies OCR with cleanup, converts to PDF/A format for long-term archival, and optimises file size.", + "emailPreparation": "Email Preparation", + "emailPreparationDesc": "Optimises PDFs for email distribution by compressing files, splitting large documents into 20MB chunks for email compatibility, and removing metadata for privacy.", + "secureWorkflow": "Security Workflow", + "secureWorkflowDesc": "Secures PDF documents by removing potentially malicious content like JavaScript and embedded files, then adds password protection to prevent unauthorised access. Password is set to 'password' by default.", + "processImages": "Process Images", + "processImagesDesc": "Converts multiple image files into a single PDF document, then applies OCR technology to extract searchable text from the images." + } + }, + "common": { + "copy": "Copy", + "copied": "Copied!", + "refresh": "Refresh", + "retry": "Retry", + "remaining": "remaining", + "used": "used", + "available": "available", + "cancel": "Cancel", + "preview": "Preview" + }, + "config": { + "overview": { + "title": "Application Configuration", + "description": "Current application settings and configuration details." + }, + "account": { + "overview": { + "title": "Account Settings", + "manageAccountPreferences": "Manage your account preferences", + "guestDescription": "You are signed in as a guest. Consider upgrading your account above." + }, + "upgrade": { + "title": "Upgrade Guest Account", + "description": "Link your account to preserve your history and access more features!", + "socialLogin": "Upgrade with Social Account", + "linkWith": "Link with", + "emailPassword": "or enter your email & password", + "email": "Email", + "emailPlaceholder": "Enter your email", + "password": "Password (optional)", + "passwordPlaceholder": "Set a password", + "passwordNote": "Leave empty to use email verification only", + "upgradeButton": "Upgrade Account" + } + }, + "apiKeys": { + "description": "Your API key for accessing Stirling's suite of PDF tools. Copy it to your project or refresh to generate a new one.", + "publicKeyAriaLabel": "Public API key", + "copyKeyAriaLabel": "Copy API key", + "refreshAriaLabel": "Refresh API key", + "includedCredits": "Included credits", + "purchasedCredits": "Purchased credits", + "totalCredits": "Total Credits", + "chartAriaLabel": "Credits usage: included {{includedUsed}} of {{includedTotal}}, purchased {{purchasedUsed}} of {{purchasedTotal}}", + "nextReset": "Next Reset", + "lastApiUse": "Last API Use", + "overlayMessage": "Generate a key to see credits and available credits", + "label": "API Key", + "guestInfo": "Guest users do not receive API keys. Create an account to get an API key you can use in your applications.", + "goToAccount": "Go to Account", + "refreshModal": { + "title": "Refresh API Keys", + "warning": "âš ī¸ Warning: This action will generate new API keys and make your previous keys invalid.", + "impact": "Any applications or services currently using these keys will stop working until you update them with the new keys.", + "confirmPrompt": "Are you sure you want to continue?", + "confirmCta": "Refresh Keys" + }, + "generateError": "We couldn't generate your API key." + } + }, + "AddAttachmentsRequest": { + "attachments": "Select Attachments", + "info": "Select files to attach to your PDF. These files will be embedded and accessible through the PDF's attachment panel.", + "selectFiles": "Select Files to Attach", + "placeholder": "Choose files...", + "addMoreFiles": "Add more files...", + "selectedFiles": "Selected Files", + "submit": "Add Attachments", + "results": { + "title": "Attachment Results" + }, + "error": { + "failed": "Add attachments operation failed" + } + }, + "termsAndConditions": "Terms & Conditions", + "logOut": "Log out", + "addAttachments": { + "error": { + "failed": "An error occurred while adding attachments to the PDF." + } + }, + "autoRename": { + "description": "This tool will automatically rename PDF files based on their content. It analyzes the document to find the most suitable title from the text." + }, + "customPosition": "Custom Position", + "details": "Details", + "downloadUnavailable": "Download unavailable for this item", + "invalidUndoData": "Cannot undo: invalid operation data", + "margin": { + "large": "Large", + "medium": "Medium", + "small": "Small", + "xLarge": "Extra Large" + }, + "noFilesToUndo": "Cannot undo: no files were processed in the last operation", + "noOperationToUndo": "No operation to undo", + "noValidFiles": "No valid files to process", + "operationCancelled": "Operation cancelled", + "pageEdit": { + "deselectAll": "Select None", + "selectAll": "Select All" + }, + "quickPosition": "Quick Position", + "reorganizePages": { + "error": { + "failed": "Failed to reorganize pages" + }, + "results": { + "title": "Pages Reorganized" + }, + "settings": { + "title": "Settings" + }, + "submit": "Reorganize Pages" + }, + "replace-color": { + "options": { + "fill": "Fill colour", + "gradient": "Gradient" + }, + "previewOverlayOpacity": "Preview overlay opacity", + "previewOverlayTransparency": "Preview overlay transparency", + "previewOverlayVisibility": "Show preview overlay", + "selectText": { + "1": "Optije za zamenu ili inverziranje boja", + "2": "Standardno (standarske visoko kontrastne boje)", + "3": "Napčno (prilagođene boje)", + "4": "Cijelo-inverzirajte (inverzirajte sve boje)", + "5": "Optije visoko kontrastne boje", + "6": "Crna tekst na bijelu pozadini", + "7": "Bijeli tekst na crvenoj pozadini", + "8": "ÅŊutni tekst na crnoj pozadini", + "9": "Zeleni tekst na crnoj pozadini", + "10": "Izaberite boju teksta", + "11": "Izaberite pozadinu boju", + "12": "Choose start colour", + "13": "Choose end colour" + }, + "submit": "Zamijeni", + "title": "Replace-Invert-Color", + "header": "Zameni-inverziranje boja u PDF-u" + }, + "size": "Size", + "submit": "Submit", + "success": "Success", + "tools": { + "noSearchResults": "No tools found", + "noTools": "No tools available" + }, + "undoDataMismatch": "Cannot undo: operation data is corrupted", + "undoFailed": "Failed to undo operation", + "undoQuotaError": "Cannot undo: insufficient storage space", + "undoStorageError": "Undo completed but some files could not be saved to storage", + "undoSuccess": "Operation undone successfully", + "unsupported": "Unsupported", + "onboarding": { + "welcomeModal": { + "title": "Welcome to Stirling PDF!", + "description": "Would you like to take a quick 1-minute tour to learn the key features and how to get started?", + "helpHint": "You can always access this tour later from the Help button in the bottom left.", + "startTour": "Start Tour", + "maybeLater": "Maybe Later", + "dontShowAgain": "Don't Show Again" + }, + "allTools": "This is the All Tools panel, where you can browse and select from all available PDF tools.", + "selectCropTool": "Let's select the Crop tool to demonstrate how to use one of the tools.", + "toolInterface": "This is the Crop tool interface. As you can see, there's not much there because we haven't added any PDF files to work with yet.", + "filesButton": "The Files button on the Quick Access bar allows you to upload PDFs to use the tools on.", + "fileSources": "You can upload new files or access recent files from here. For the tour, we'll just use a sample file.", + "workbench": "This is the Workbench - the main area where you view and edit your PDFs.", + "viewSwitcher": "Use these controls to select how you want to view your PDFs.", + "viewer": "The Viewer lets you read and annotate your PDFs.", + "pageEditor": "The Page Editor allows you to do various operations on the pages within your PDFs, such as reordering, rotating and deleting.", + "activeFiles": "The Active Files view shows all of the PDFs you have loaded into the tool, and allows you to select which ones to process.", + "fileCheckbox": "Clicking one of the files selects it for processing. You can select multiple files for batch operations.", + "selectControls": "The Right Rail contains buttons to quickly select/deselect all of your active PDFs, along with buttons to change the app's theme or language.", + "cropSettings": "Now that we've selected the file we want crop, we can configure the Crop tool to choose the area that we want to crop the PDF to.", + "runButton": "Once the tool has been configured, this button allows you to run the tool on all the selected PDFs.", + "results": "After the tool has finished running, the Review step will show a preview of the results in this panel, and allow you to undo the operation or download the file. ", + "fileReplacement": "The modified file will replace the original file in the Workbench automatically, allowing you to easily run it through more tools.", + "pinButton": "You can use the Pin button if you'd rather your files stay active after running tools on them.", + "wrapUp": "You're all set! You've learnt about the main areas of the app and how to use them. Click the Help button whenever you like to see this tour again.", + "previous": "Previous", + "next": "Next", + "finish": "Finish", + "startTour": "Start Tour", + "startTourDescription": "Take a guided tour of Stirling PDF's key features" + }, + "workspace": { + "title": "Workspace", + "people": { + "title": "People", + "description": "Manage workspace members and their permissions", + "loading": "Loading people...", + "searchMembers": "Search members...", + "addMembers": "Add Members", + "inviteMembers": { + "label": "Invite Members", + "subtitle": "Type or paste in emails below, separated by commas. Your workspace will be billed by members." + }, + "user": "User", + "role": "Role", + "team": "Team", + "status": "Status", + "actions": "Actions", + "noMembersFound": "No members found", + "active": "Active", + "disabled": "Disabled", + "activeSession": "Active session", + "member": "Member", + "admin": "Admin", + "roleDescriptions": { + "admin": "Can manage settings and invite members, with full administrative access.", + "member": "Can view and edit shared files, but cannot manage workspace settings or members." + }, + "editRole": "Edit Role", + "enable": "Enable", + "disable": "Disable", + "deleteUser": "Delete User", + "deleteUserSuccess": "User deleted successfully", + "deleteUserError": "Failed to delete user", + "confirmDelete": "Are you sure you want to delete this user? This action cannot be undone.", + "addMember": { + "title": "Add Member", + "username": "Username (Email)", + "usernamePlaceholder": "user@example.com", + "password": "Password", + "passwordPlaceholder": "Enter password", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "forcePasswordChange": "Force password change on first login", + "cancel": "Cancel", + "submit": "Add Member", + "usernameRequired": "Username and password are required", + "passwordTooShort": "Password must be at least 6 characters", + "success": "User created successfully", + "error": "Failed to create user" + }, + "editMember": { + "title": "Edit Member", + "editing": "Editing:", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "cancel": "Cancel", + "submit": "Update Member", + "success": "User updated successfully", + "error": "Failed to update user" + }, + "toggleEnabled": { + "success": "User status updated successfully", + "error": "Failed to update user status" + }, + "delete": { + "success": "User deleted successfully", + "error": "Failed to delete user" + }, + "emailInvite": { + "tab": "Email Invite", + "description": "Type or paste in emails below, separated by commas. Users will receive login credentials via email.", + "emails": "Email Addresses", + "emailsPlaceholder": "user1@example.com, user2@example.com", + "emailsRequired": "At least one email address is required", + "submit": "Send Invites", + "success": "user(s) invited successfully", + "partialSuccess": "Some invites failed", + "allFailed": "Failed to invite users", + "error": "Failed to send invites" + }, + "directInvite": { + "tab": "Direct Create" + }, + "inviteLinkTab": { + "tab": "Invite Link" + }, + "inviteLink": { + "description": "Generate a secure link that allows the user to set their own password", + "email": "Email Address", + "emailPlaceholder": "user@example.com (optional)", + "emailDescription": "Optional - leave blank for a general invite link that can be used by anyone", + "emailRequired": "Email address is required", + "emailOptional": "Optional - leave blank for a general invite link", + "emailRequiredForSend": "Email address is required to send email notification", + "expiryHours": "Expiry Hours", + "expiryDescription": "How many hours until the link expires", + "sendEmail": "Send invite link via email", + "sendEmailDescription": "If enabled, the invite link will be sent to the specified email address", + "smtpRequired": "SMTP not configured", + "generate": "Generate Link", + "generated": "Invite Link Generated", + "copied": "Link copied to clipboard", + "success": "Invite link generated successfully", + "successWithEmail": "Invite link generated and sent via email", + "emailFailed": "Invite link generated, but email failed", + "emailFailedDetails": "Error: {0}. Please share the invite link manually.", + "error": "Failed to generate invite link", + "submit": "Generate Invite Link" + }, + "inviteMode": { + "username": "Username", + "email": "Email", + "link": "Link", + "emailDisabled": "Email invites require SMTP configuration and mail.enableInvites=true in settings" + }, + "license": { + "users": "users", + "availableSlots": "Available Slots", + "grandfathered": "Grandfathered", + "grandfatheredShort": "{{count}} grandfathered", + "fromLicense": "from license", + "slotsAvailable": "{{count}} user slot(s) available", + "noSlotsAvailable": "No slots available", + "currentUsage": "Currently using {{current}} of {{max}} user licences" + } + }, + "teams": { + "title": "Teams", + "description": "Manage teams and organize workspace members", + "loading": "Loading teams...", + "loadingDetails": "Loading team details...", + "createNewTeam": "Create New Team", + "teamName": "Team Name", + "totalMembers": "Total Members", + "actions": "Actions", + "noTeamsFound": "No teams found", + "noMembers": "No members in this team", + "system": "System", + "addMember": "Add Member", + "viewTeam": "View Team", + "removeMember": "Remove from team", + "cannotRemoveFromSystemTeam": "Cannot remove from system team", + "renameTeamLabel": "Rename Team", + "deleteTeamLabel": "Delete Team", + "cannotDeleteInternal": "Cannot delete the Internal team", + "confirmDelete": "Are you sure you want to delete this team? This team must be empty to delete.", + "confirmRemove": "Remove user from this team?", + "cannotRenameInternal": "Cannot rename the Internal team", + "cannotAddToInternal": "Cannot add members to the Internal team", + "teamNotFound": "Team not found", + "backToTeams": "Back to Teams", + "memberCount": "{{count}} members", + "removeMemberSuccess": "User removed from team", + "removeMemberError": "Failed to remove user from team", + "createTeam": { + "title": "Create New Team", + "teamName": "Team Name", + "teamNamePlaceholder": "Enter team name", + "cancel": "Cancel", + "submit": "Create Team", + "nameRequired": "Team name is required", + "success": "Team created successfully", + "error": "Failed to create team" + }, + "renameTeam": { + "title": "Rename Team", + "renaming": "Renaming:", + "newTeamName": "New Team Name", + "newTeamNamePlaceholder": "Enter new team name", + "cancel": "Cancel", + "submit": "Rename Team", + "nameRequired": "Team name is required", + "success": "Team renamed successfully", + "error": "Failed to rename team" + }, + "deleteTeam": { + "success": "Team deleted successfully", + "error": "Failed to delete team. Make sure the team is empty.", + "teamMustBeEmpty": "Team must be empty before deletion" + }, + "addMemberToTeam": { + "title": "Add Member to Team", + "addingTo": "Adding to", + "selectUser": "Select User", + "selectUserPlaceholder": "Choose a user", + "selectUserRequired": "Please select a user", + "currentlyIn": "currently in", + "willBeMoved": "Note: This user will be moved from their current team to this team.", + "cancel": "Cancel", + "submit": "Add Member", + "userRequired": "Please select a user", + "success": "Member added to team successfully", + "error": "Failed to add member to team" + }, + "changeTeam": { + "label": "Change Team", + "title": "Change Team", + "changing": "Moving", + "selectTeam": "Select Team", + "selectTeamPlaceholder": "Choose a team", + "selectTeamRequired": "Please select a team", + "success": "Team changed successfully", + "error": "Failed to change team", + "submit": "Change Team" + } + } + }, + "plan": { + "currency": "Currency", + "popular": "Popular", + "current": "Current Plan", + "upgrade": "Upgrade", + "contact": "Contact Us", + "customPricing": "Custom", + "showComparison": "Compare All Features", + "hideComparison": "Hide Feature Comparison", + "featureComparison": "Feature Comparison", + "activePlan": { + "title": "Active Plan", + "subtitle": "Your current subscription details" + }, + "availablePlans": { + "title": "Available Plans", + "subtitle": "Choose the plan that fits your needs" + }, + "static": { + "title": "Billing Information", + "message": "Online billing is not currently configured. To upgrade your plan or manage subscriptions, please contact us directly.", + "contactSales": "Contact Sales", + "contactToUpgrade": "Contact us to upgrade or customize your plan", + "maxUsers": "Max Users", + "upTo": "Up to" + }, + "period": { + "month": "month" + }, + "free": { + "name": "Free", + "highlight1": "Limited Tool Usage Per week", + "highlight2": "Access to all tools", + "highlight3": "Community support" + }, + "pro": { + "name": "Pro", + "highlight1": "Unlimited Tool Usage", + "highlight2": "Advanced PDF tools", + "highlight3": "No watermarks" + }, + "enterprise": { + "name": "Enterprise", + "highlight1": "Custom pricing", + "highlight2": "Dedicated support", + "highlight3": "Latest features" + }, + "feature": { + "title": "Feature", + "pdfTools": "Basic PDF Tools", + "fileSize": "File Size Limit", + "automation": "Automate tool workflows", + "api": "API Access", + "priority": "Priority Support", + "customPricing": "Custom Pricing" + } + }, + "subscription": { + "status": { + "active": "Active", + "pastDue": "Past Due", + "canceled": "Canceled", + "incomplete": "Incomplete", + "trialing": "Trial", + "none": "No Subscription" + }, + "renewsOn": "Renews on {{date}}", + "cancelsOn": "Cancels on {{date}}" + }, + "billing": { + "manageBilling": "Manage Billing", + "portal": { + "error": "Failed to open billing portal" + } + }, + "payment": { + "preparing": "Preparing your checkout...", + "upgradeTitle": "Upgrade to {{planName}}", + "success": "Payment Successful!", + "successMessage": "Your subscription has been activated successfully. You will receive a confirmation email shortly.", + "autoClose": "This window will close automatically...", + "error": "Payment Error" + }, + "firstLogin": { + "title": "First Time Login", + "welcomeTitle": "Welcome!", + "welcomeMessage": "For security reasons, you must change your password on your first login.", + "loggedInAs": "Logged in as", + "error": "Error", + "currentPassword": "Current Password", + "enterCurrentPassword": "Enter your current password", + "newPassword": "New Password", + "enterNewPassword": "Enter new password (min 8 characters)", + "confirmPassword": "Confirm New Password", + "reEnterNewPassword": "Re-enter new password", + "changePassword": "Change Password", + "allFieldsRequired": "All fields are required", + "passwordsDoNotMatch": "New passwords do not match", + "passwordTooShort": "Password must be at least 8 characters", + "passwordMustBeDifferent": "New password must be different from current password", + "passwordChangedSuccess": "Password changed successfully! Please log in again.", + "passwordChangeFailed": "Failed to change password. Please check your current password." + }, + "invite": { + "welcome": "Welcome to Stirling PDF", + "invalidToken": "Invalid invitation link", + "validationError": "Failed to validate invitation link", + "passwordRequired": "Password is required", + "passwordTooShort": "Password must be at least 6 characters", + "passwordMismatch": "Passwords do not match", + "acceptError": "Failed to create account", + "validating": "Validating invitation...", + "invalidInvitation": "Invalid Invitation", + "goToLogin": "Go to Login", + "welcomeTitle": "You've been invited!", + "welcomeSubtitle": "Complete your account setup to get started", + "accountFor": "Creating account for", + "linkExpires": "Link expires", + "email": "Email address", + "emailPlaceholder": "Enter your email address", + "emailRequired": "Email address is required", + "invalidEmail": "Invalid email address", + "choosePassword": "Choose a password", + "passwordPlaceholder": "Enter your password", + "confirmPassword": "Confirm password", + "confirmPasswordPlaceholder": "Re-enter your password", + "createAccount": "Create Account", + "creating": "Creating Account...", + "alreadyHaveAccount": "Already have an account?", + "signIn": "Sign in" + }, + "audit": { + "error": { + "title": "Error loading audit system" + }, + "notAvailable": "Audit system not available", + "notAvailableMessage": "The audit system is not configured or not available.", + "disabled": "Audit logging is disabled", + "disabledMessage": "Enable audit logging in your application configuration to track system events.", + "systemStatus": { + "title": "System Status", + "status": "Audit Logging", + "enabled": "Enabled", + "disabled": "Disabled", + "level": "Audit Level", + "retention": "Retention Period", + "days": "days", + "totalEvents": "Total Events" + }, + "tabs": { + "dashboard": "Dashboard", + "events": "Audit Events", + "export": "Export" + }, + "charts": { + "title": "Audit Dashboard", + "error": "Error loading charts", + "day": "Day", + "week": "Week", + "month": "Month", + "byType": "Events by Type", + "byUser": "Events by User", + "overTime": "Events Over Time" + }, + "events": { + "title": "Audit Events", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "error": "Error loading events", + "noEvents": "No events found", + "timestamp": "Timestamp", + "type": "Type", + "user": "User", + "ipAddress": "IP Address", + "actions": "Actions", + "viewDetails": "View Details", + "eventDetails": "Event Details", + "details": "Details" + }, + "export": { + "title": "Export Audit Data", + "description": "Export audit events to CSV or JSON format. Use filters to limit the exported data.", + "format": "Export Format", + "filters": "Filters (Optional)", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "exportButton": "Export Data", + "error": "Failed to export data" + } + }, + "usage": { + "noData": "No data available", + "error": "Error loading usage statistics", + "noDataMessage": "No usage statistics are currently available.", + "controls": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All", + "refresh": "Refresh", + "dataTypeLabel": "Data Type:", + "dataType": { + "all": "All", + "api": "API", + "ui": "UI" + } + }, + "showing": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All" + }, + "stats": { + "totalEndpoints": "Total Endpoints", + "totalVisits": "Total Visits", + "showing": "Showing", + "selectedVisits": "Selected Visits" + }, + "chart": { + "title": "Endpoint Usage Chart" + }, + "table": { + "title": "Detailed Statistics", + "endpoint": "Endpoint", + "visits": "Visits", + "percentage": "Percentage", + "noData": "No data available" + } + }, + "backendHealth": { + "checking": "Checking backend status...", + "online": "Backend Online", + "offline": "Backend Offline" + }, + "autoRedact": { + "tags": "Cenzura,Sakrij,prekrivanje,crna,marker,skriveno", + "title": "Automatsko uređivanje", + "header": "Automatsko uređivanje", + "colorLabel": "Boja", + "textsToRedactLabel": "Tekst za uređivanje (razdvojen linijama)", + "textsToRedactPlaceholder": "npr. \\nPovjerljivo \\nStrogo čuvana tajna", + "useRegexLabel": "Koristi Regex", + "wholeWordSearchLabel": "PretraÅživanje cijelih riječi", + "customPaddingLabel": "Dodatni prazan prostor", + "convertPDFToImageLabel": "Pretvorite PDF u PDF-sliku (koristi se za uklanjanje teksta iza okvira)", + "submitButton": "Potvrdi" + }, + "replaceColorPdf": { + "tags": "Zameni boju, Rad sa stranicama, Back end, server strana" } -} \ No newline at end of file +} diff --git a/frontend/public/locales/hu-HU/translation.json b/frontend/public/locales/hu-HU/translation.json index f166a30a7..dc0b250fc 100644 --- a/frontend/public/locales/hu-HU/translation.json +++ b/frontend/public/locales/hu-HU/translation.json @@ -1,4 +1,40 @@ { + "toolPanel": { + "modePrompt": { + "title": "Choose how you browse tools", + "description": "Preview both layouts and decide how you want to explore Stirling PDF tools.", + "sidebarTitle": "Sidebar mode", + "sidebarDescription": "Keep tools alongside your workspace for quick switching.", + "recommended": "Recommended", + "chooseSidebar": "Use sidebar mode", + "fullscreenTitle": "Fullscreen mode - (legacy)", + "fullscreenDescription": "Browse every tool in a catalogue that covers the workspace until you pick one.", + "chooseFullscreen": "Use fullscreen mode", + "dismiss": "Maybe later" + }, + "fullscreen": { + "showDetails": "Show Details", + "comingSoon": "Coming soon:", + "favorite": "Add to favourites", + "favorites": "Favourites", + "heading": "All tools (fullscreen view)", + "noResults": "Try adjusting your search or toggle descriptions to find what you need.", + "recommended": "Recommended", + "unfavorite": "Remove from favourites" + }, + "placeholder": "Choose a tool to get started", + "toggle": { + "fullscreen": "Switch to fullscreen mode", + "sidebar": "Switch to sidebar mode" + } + }, + "unsavedChanges": "You have unsaved changes to your PDF.", + "areYouSure": "Are you sure you want to leave?", + "unsavedChangesTitle": "Unsaved Changes", + "keepWorking": "Keep Working", + "discardChanges": "Discard & Leave", + "applyAndContinue": "Save & Leave", + "exportAndContinue": "Export & Continue", "language": { "direction": "ltr" }, @@ -18,8 +54,26 @@ "customTextDesc": "Egyedi szÃļveg", "numberPagesDesc": "Mely oldalakat szÃĄmozzuk, alapÊrtelmezett 'mind', elfogad 1-5 vagy 2,5,9 formÃĄtumot is", "customNumberDesc": "AlapÊrtelmezett {n}, elfogad 'Oldal {n} / {total}', 'SzÃļveg-{n}', '{filename}-{n}' formÃĄtumot", - "submit": "OldalszÃĄmozÃĄs hozzÃĄadÃĄsa" + "submit": "OldalszÃĄmozÃĄs hozzÃĄadÃĄsa", + "configuration": "Configuration", + "customize": "Customize Appearance", + "pagesAndStarting": "Pages & Starting Number", + "positionAndPages": "Position & Pages", + "error": { + "failed": "Add page numbers operation failed" + }, + "results": { + "title": "Page Number Results" + }, + "preview": "Position Selection", + "previewDisclaimer": "Preview is approximate. Final output may vary due to PDF font metrics." }, + "pageSelectionPrompt": "Egyedi oldalvÃĄlasztÃĄs (Adja meg az oldalszÃĄmokat vesszővel elvÃĄlasztva, pl. 1,5,6 vagy hasznÃĄljon fÃŧggvÊnyeket, pl. 2n+1):", + "startingNumberTooltip": "The first number to display. Subsequent pages will increment from this number.", + "marginTooltip": "Distance between the page number and the edge of the page.", + "fontSizeTooltip": "Size of the page number text in points. Larger numbers create bigger text.", + "fontTypeTooltip": "Font family for the page numbers. Choose based on your document style.", + "customTextTooltip": "Optional custom format for page numbers. Use {n} as placeholder for the number. Example: \"Page {n}\" will show \"Page 1\", \"Page 2\", etc.", "pdfPrompt": "PDF-fÃĄjl kivÃĄlasztÃĄsa", "multiPdfPrompt": "PDF-fÃĄjlok kivÃĄlasztÃĄsa (2+)", "multiPdfDropPrompt": "VÃĄlassza ki (vagy hÃēzza ide) az Ãļsszes szÃŧksÊges PDF-fÃĄjlt", @@ -30,15 +84,41 @@ "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", "pageOrderPrompt": "Egyedi oldalsorrend (Adja meg az oldalszÃĄmokat vesszővel elvÃĄlasztva vagy hasznÃĄljon fÃŧggvÊnyeket, pl. 2n+1):", - "pageSelectionPrompt": "Egyedi oldalvÃĄlasztÃĄs (Adja meg az oldalszÃĄmokat vesszővel elvÃĄlasztva, pl. 1,5,6 vagy hasznÃĄljon fÃŧggvÊnyeket, pl. 2n+1):", "goToPage": "UgrÃĄs", "true": "Igen", "false": "Nem", "unknown": "Ismeretlen", + "app": { + "description": "The Free Adobe Acrobat alternative (10M+ Downloads)" + }, "save": "MentÊs", "saveToBrowser": "MentÊs bÃļngÊszőbe", + "download": "LetÃļltÊs", + "pin": "Pin File (keep active after tool run)", + "unpin": "Unpin File (replace after tool run)", + "undoOperationTooltip": "Click to undo the last operation and restore the original files", + "undo": "VisszavonÃĄs", + "moreOptions": "More Options", + "editYourNewFiles": "Edit your new file(s)", "close": "BezÃĄrÃĄs", + "openInViewer": "Open in Viewer", + "confirmClose": "Confirm Close", + "confirmCloseMessage": "Are you sure you want to close this file?", + "confirmCloseCancel": "Cancel", + "confirmCloseConfirm": "Close File", + "fileSelected": "Selected: {{filename}}", + "chooseFile": "Choose File", "filesSelected": "fÃĄjl kivÃĄlasztva", + "files": { + "title": "Files", + "upload": "Upload", + "uploadFiles": "Upload Files", + "addFiles": "Add files", + "selectFromWorkbench": "Select files from the workbench or ", + "selectMultipleFromWorkbench": "Select at least {{count}} files from the workbench or ", + "created": "Created", + "size": "File Size" + }, "noFavourites": "Nincsenek kedvencek", "downloadComplete": "LetÃļltÊs befejezve", "bored": "Unatkozik vÃĄrakozÃĄs kÃļzben?", @@ -56,7 +136,10 @@ }, "error": { "pdfPassword": "A PDF-dokumentum jelszÃŗval vÊdett, Ês vagy nem adott meg jelszÃŗt, vagy helytelen jelszÃŗt adott meg", + "encryptedPdfMustRemovePassword": "This PDF is encrypted or password-protected. Please unlock it before converting to PDF/A.", + "incorrectPasswordProvided": "The PDF password is incorrect or not provided.", "_value": "Hiba", + "dismissAllErrors": "Dismiss All Errors", "sorry": "SajnÃĄljuk a kellemetlensÊget!", "needHelp": "SegítsÊgre van szÃŧksÊge / HibÃĄt talÃĄlt?", "contactTip": "Ha tovÃĄbbra is problÊmÃĄkba ÃŧtkÃļzik, ne habozzon segítsÊget kÊrni. Bejelenthet hibÃĄt GitHub oldalunkon vagy felkereshet minket Discordon:", @@ -71,6 +154,10 @@ "githubSubmit": "GitHub - Hiba bejelentÊse", "discordSubmit": "Discord - TÃĄmogatÃĄsi poszt lÊtrehozÃĄsa" }, + "warning": { + "tooltipTitle": "Warning" + }, + "edit": "Edit", "delete": "TÃļrlÊs", "username": "FelhasznÃĄlÃŗnÊv", "password": "JelszÃŗ", @@ -82,6 +169,7 @@ "green": "ZÃļld", "blue": "KÊk", "custom": "EgyÊni...", + "comingSoon": "Coming soon", "WorkInProgess": "FejlesztÊs alatt ÃĄllÃŗ funkciÃŗ, hibÃĄk előfordulhatnak. KÊrjÃŧk, jelezze a problÊmÃĄkat!", "poweredBy": "Üzemelteti:", "yes": "Igen", @@ -115,12 +203,14 @@ "page": "Oldal", "pages": "Oldal", "loading": "BetÃļltÊs...", + "review": "Review", "addToDoc": "HozzÃĄadÃĄs a dokumentumhoz", "reset": "VisszaÃĄllítÃĄs", "apply": "Alkalmaz", "noFileSelected": "Nincs fÃĄjl kivÃĄlasztva. KÊrjÃŧk, tÃļltsÃļn fel egyet.", "legal": { "privacy": "AdatvÊdelmi irÃĄnyelvek", + "iAgreeToThe": "I agree to all of the", "terms": "FelhasznÃĄlÃĄsi feltÊtelek", "accessibility": "AkadÃĄlymentesítÊsi nyilatkozat", "cookie": "SÃŧti szabÃĄlyzat", @@ -160,6 +250,7 @@ "title": "Szeretne hozzÃĄjÃĄrulni a Stirling PDF fejlesztÊsÊhez?", "paragraph1": "A Stirling PDF opcionÃĄlis analitikai adatgyÅąjtÊst kínÃĄl a termÊk fejlesztÊsÊnek tÃĄmogatÃĄsÃĄhoz. Nem gyÅąjtÃŧnk szemÊlyes informÃĄciÃŗkat vagy fÃĄjltartalmakat.", "paragraph2": "KÊrjÃŧk, fontolja meg az analitika engedÊlyezÊsÊt, hogy segítse a Stirling-PDF nÃļvekedÊsÊt Ês jobban megÊrthessÃŧk felhasznÃĄlÃŗink igÊnyeit.", + "learnMore": "Learn more", "enable": "Analitika engedÊlyezÊse", "disable": "Analitika letiltÃĄsa", "settings": "Az analitikai beÃĄllítÃĄsokat a config/settings.yml fÃĄjlban mÃŗdosíthatja" @@ -203,6 +294,54 @@ "cacheInputs": { "name": "Űrlapmezők mentÊse", "help": "EngedÊlyezÊse esetÊn menti a korÃĄbban hasznÃĄlt ÊrtÊkeket a kÊsőbbi hasznÃĄlathoz" + }, + "general": { + "title": "General", + "description": "Configure general application preferences.", + "account": "Account", + "accountDescription": "Manage your account settings", + "user": "User", + "signedInAs": "Signed in as", + "logout": "Log out", + "enableFeatures": { + "title": "For System Administrators", + "intro": "Enable user authentication, team management, and workspace features for your organization.", + "action": "Configure", + "and": "and", + "benefit": "Enables user roles, team collaboration, admin controls, and enterprise features.", + "learnMore": "Learn more in documentation", + "dismiss": "Dismiss" + }, + "autoUnzip": "Auto-unzip API responses", + "autoUnzipDescription": "Automatically extract files from ZIP responses", + "autoUnzipTooltip": "Automatically extract ZIP files returned from API operations. Disable to keep ZIP files intact. This does not affect automation workflows.", + "autoUnzipFileLimit": "Auto-unzip file limit", + "autoUnzipFileLimitDescription": "Maximum number of files to extract from ZIP", + "autoUnzipFileLimitTooltip": "Only unzip if the ZIP contains this many files or fewer. Set higher to extract larger ZIPs.", + "defaultToolPickerMode": "Default tool picker mode", + "defaultToolPickerModeDescription": "Choose whether the tool picker opens in fullscreen or sidebar by default", + "mode": { + "fullscreen": "Fullscreen", + "sidebar": "Sidebar" + } + }, + "hotkeys": { + "title": "Keyboard Shortcuts", + "description": "Hover a tool to see its shortcut or customise it below. Click \"Change shortcut\" and press a new key combination. Press Esc to cancel.", + "errorModifier": { + "mac": "Include ⌘ (Command), âŒĨ (Option), or another modifier in your shortcut.", + "windows": "Include Ctrl, Alt, or another modifier in your shortcut." + }, + "errorConflict": "Shortcut already used by {{tool}}.", + "none": "Not assigned", + "customBadge": "Custom", + "defaultLabel": "Default: {{shortcut}}", + "capturing": "Press keysâ€Ļ (Esc to cancel)", + "change": "Change shortcut", + "reset": "Reset", + "shortcut": "Shortcut", + "noShortcut": "No shortcut set", + "searchPlaceholder": "Search tools..." } }, "changeCreds": { @@ -274,8 +413,10 @@ "top20": "Top 20", "all": "Összes", "refresh": "FrissítÊs", - "includeHomepage": "Tartalmazza a honlapot ('/')", - "includeLoginPage": "Tartalmazza a bejelentkezÊsi oldat ('/login')", + "dataTypeLabel": "Data Type:", + "dataTypeAll": "All", + "dataTypeApi": "API", + "dataTypeUi": "UI", "totalEndpoints": "Összes vÊgpont", "totalVisits": "Összes megtekintÊs", "showing": "MutatÃĄs", @@ -290,7 +431,9 @@ "top": "LegnÊpszerÅąbb", "numberOfVisits": "MegtekintÊsek szÃĄma", "visitsTooltip": "MegtekintÊsek: {0} ({1}% az Ãļsszes megtekintÊsből)", - "retry": "ÚjraprÃŗbÃĄlÃĄs" + "retry": "ÚjraprÃŗbÃĄlÃĄs", + "includeHomepage": "Tartalmazza a honlapot ('/')", + "includeLoginPage": "Tartalmazza a bejelentkezÊsi oldat ('/login')" }, "database": { "title": "AdatbÃĄzis importÃĄlÃĄs/exportÃĄlÃĄs", @@ -331,22 +474,310 @@ "alphabetical": "ABC sorrend", "globalPopularity": "Teljes nÊpszerÅąsÊg", "sortBy": "RendezÊs:", + "mobile": { + "brandAlt": "Stirling PDF logo", + "openFiles": "Open files", + "swipeHint": "Swipe left or right to switch views", + "tools": "Tools", + "toolsSlide": "Tool selection panel", + "viewSwitcher": "Switch workspace view", + "workbenchSlide": "Workspace panel", + "workspace": "Workspace" + }, "multiTool": { + "tags": "multiple,tools", "title": "PDF tÃļbbfunkciÃŗs eszkÃļz", "desc": "EgyesítÊs, forgatÃĄs, ÃĄtrendezÊs Ês oldalak eltÃĄvolítÃĄsa" }, "merge": { + "tags": "combine,join,unite", "title": "EgyesítÊs", "desc": "PDF-ek egyszerÅą egyesítÊse." }, "split": { + "tags": "divide,separate,break", "title": "FelosztÃĄs", "desc": "PDF-ek felosztÃĄsa tÃļbb dokumentumra" }, "rotate": { + "tags": "turn,flip,orient", "title": "ForgatÃĄs", "desc": "PDF-ek egyszerÅą forgatÃĄsa." }, + "convert": { + "tags": "transform,change", + "title": "KonvertÃĄlÃĄs", + "desc": "Convert files between different formats" + }, + "pdfOrganiser": { + "tags": "organize,rearrange,reorder", + "title": "RendszerezÊs", + "desc": "Oldalak eltÃĄvolítÃĄsa/ÃĄtrendezÊse tetszőleges sorrendben" + }, + "addImage": { + "tags": "insert,embed,place", + "title": "KÊp hozzÃĄadÃĄsa", + "desc": "KÊp hozzÃĄadÃĄsa a PDF megadott helyÊre" + }, + "addAttachments": { + "tags": "embed,attach,include", + "title": "Add Attachments", + "desc": "Add or remove embedded files (attachments) to/from a PDF" + }, + "watermark": { + "tags": "stamp,mark,overlay", + "title": "Vízjel hozzÃĄadÃĄsa", + "desc": "Egyedi vízjel hozzÃĄadÃĄsa PDF dokumentumhoz" + }, + "removePassword": { + "tags": "unlock", + "title": "JelszÃŗ eltÃĄvolítÃĄsa", + "desc": "Jelszavas vÊdelem eltÃĄvolítÃĄsa a PDF dokumentumbÃŗl" + }, + "compress": { + "tags": "shrink,reduce,optimize", + "title": "TÃļmÃļrítÊs", + "desc": "PDF-ek tÃļmÃļrítÊse a fÃĄjlmÊret csÃļkkentÊse ÊrdekÊben" + }, + "unlockPDFForms": { + "tags": "unlock,enable,edit", + "title": "PDF Åąrlapok feloldÃĄsa", + "desc": "PDF dokumentumban lÊvő Åąrlapmezők írÃĄsvÊdettsÊgÊnek eltÃĄvolítÃĄsa." + }, + "changeMetadata": { + "tags": "edit,modify,update", + "title": "Metaadatok mÃŗdosítÃĄsa", + "desc": "PDF dokumentum metaadatainak mÃŗdosítÃĄsa/tÃļrlÊse/hozzÃĄadÃĄsa" + }, + "ocr": { + "tags": "extract,scan", + "title": "OCR / Szkennelt dokumentumok tisztítÃĄsa", + "desc": "Szkennelt dokumentumok tisztítÃĄsa Ês szÃļvegfelismerÊs kÊpekből, majd visszaadÃĄsa szerkeszthető szÃļvegkÊnt" + }, + "extractImages": { + "tags": "pull,save,export", + "title": "KÊpek kinyerÊse", + "desc": "Minden kÊp kinyerÊse a PDF-ből Ês mentÊse ZIP fÃĄjlba" + }, + "scannerImageSplit": { + "tags": "detect,split,photos", + "title": "Detect & Split Scanned Photos", + "desc": "Detect and split scanned photos into separate pages" + }, + "sign": { + "tags": "signature,autograph", + "title": "AlÃĄÃ­rÃĄs", + "desc": "AlÃĄÃ­rÃĄs hozzÃĄadÃĄsa PDF-hez rajzolÃĄssal, szÃļveggel vagy kÊppel" + }, + "flatten": { + "tags": "simplify,remove,interactive", + "title": "LapítÃĄs", + "desc": "Minden interaktív elem Ês Åąrlap eltÃĄvolítÃĄsa a PDF-ből" + }, + "certSign": { + "tags": "authenticate,PEM,P12,official,encrypt,sign,certificate,PKCS12,JKS,server,manual,auto", + "title": "TanÃēsítvÃĄnnyal alÃĄÃ­rÃĄs", + "desc": "PDF alÃĄÃ­rÃĄsa tanÃēsítvÃĄnnyal/kulccsal (PEM/P12)" + }, + "repair": { + "tags": "fix,restore", + "title": "JavítÃĄs", + "desc": "SÊrÃŧlt/hibÃĄs PDF javítÃĄsa" + }, + "removeBlanks": { + "tags": "delete,clean,empty", + "title": "Üres oldalak eltÃĄvolítÃĄsa", + "desc": "Üres oldalak felismerÊse Ês eltÃĄvolítÃĄsa a dokumentumbÃŗl" + }, + "removeAnnotations": { + "tags": "delete,clean,strip", + "title": "MegjegyzÊsek eltÃĄvolítÃĄsa", + "desc": "Minden megjegyzÊs/annotÃĄciÃŗ eltÃĄvolítÃĄsa a PDF-ből" + }, + "compare": { + "tags": "difference", + "title": "ÖsszehasonlítÃĄs", + "desc": "KÊt PDF dokumentum ÃļsszehasonlítÃĄsa Ês kÃŧlÃļnbsÊgek megjelenítÊse" + }, + "removeCertSign": { + "tags": "remove,delete,unlock", + "title": "TanÃēsítvÃĄnyos alÃĄÃ­rÃĄs eltÃĄvolítÃĄsa", + "desc": "TanÃēsítvÃĄnyos alÃĄÃ­rÃĄs eltÃĄvolítÃĄsa PDF-ből" + }, + "pageLayout": { + "tags": "layout,arrange,combine", + "title": "TÃļbboldalas elrendezÊs", + "desc": "PDF dokumentum tÃļbb oldalÃĄnak egyesítÊse egyetlen oldalra" + }, + "bookletImposition": { + "tags": "booklet,print,binding", + "title": "Booklet Imposition", + "desc": "Create booklets with proper page ordering and multi-page layout for printing and binding" + }, + "scalePages": { + "tags": "resize,adjust,scale", + "title": "OldalmÊret/mÊretarÃĄny beÃĄllítÃĄsa", + "desc": "Oldal Ês/vagy tartalom mÊretÊnek/mÊretarÃĄnyÃĄnak mÃŗdosítÃĄsa" + }, + "addPageNumbers": { + "tags": "number,pagination,count", + "title": "OldalszÃĄmozÃĄs hozzÃĄadÃĄsa", + "desc": "OldalszÃĄmok hozzÃĄadÃĄsa a dokumentumhoz meghatÃĄrozott helyen" + }, + "autoRename": { + "tags": "auto-detect,header-based,organize,relabel", + "title": "Auto Rename PDF File", + "desc": "Auto renames a PDF file based on its detected header" + }, + "adjustContrast": { + "tags": "contrast,brightness,saturation", + "title": "Színek/kontraszt beÃĄllítÃĄsa", + "desc": "PDF kontraszt, telítettsÊg Ês fÊnyerő beÃĄllítÃĄsa" + }, + "crop": { + "tags": "trim,cut,resize", + "title": "PDF vÃĄgÃĄsa", + "desc": "PDF vÃĄgÃĄsa a mÊret csÃļkkentÊse ÊrdekÊben (a szÃļveg megmarad!)" + }, + "autoSplitPDF": { + "tags": "auto,split,QR", + "title": "Automatikus oldalfelosztÃĄs", + "desc": "Szkennelt PDF automatikus felosztÃĄsa QR-kÃŗd alapÃē oldalelvÃĄlasztÃŗval" + }, + "sanitize": { + "tags": "clean,purge,remove", + "title": "Sanitise", + "desc": "Remove potentially harmful elements from PDF files" + }, + "getPdfInfo": { + "tags": "info,metadata,details", + "title": "PDF Ãļsszes informÃĄciÃŗjÃĄnak lekÊrÊse", + "desc": "Minden elÊrhető informÃĄciÃŗ lekÊrÊse PDF-ekről" + }, + "pdfToSinglePage": { + "tags": "combine,merge,single", + "title": "Egyoldalas nagy PDF", + "desc": "Minden PDF oldal egyesítÊse egyetlen nagy oldalba" + }, + "showJS": { + "tags": "javascript,code,script", + "title": "JavaScript megjelenítÊse", + "desc": "PDF-be injektÃĄlt JavaScript kÃŗd keresÊse Ês megjelenítÊse" + }, + "redact": { + "tags": "censor,blackout,hide", + "title": "KÊzi kitakarÃĄs", + "desc": "PDF kitakarÃĄsa kivÃĄlasztott szÃļveg, rajzolt alakzatok Ês/vagy kivÃĄlasztott oldalak alapjÃĄn" + }, + "splitBySections": { + "tags": "split,sections,divide", + "title": "Split PDF by Sections", + "desc": "Divide each page of a PDF into smaller horizontal and vertical sections" + }, + "addStamp": { + "tags": "stamp,mark,seal", + "title": "Add Stamp to PDF", + "desc": "Add text or add image stamps at set locations" + }, + "removeImage": { + "tags": "remove,delete,clean", + "title": "KÊpek eltÃĄvolítÃĄsa", + "desc": "KÊpek eltÃĄvolítÃĄsa PDF-ből a fÃĄjlmÊret csÃļkkentÊse ÊrdekÊben" + }, + "splitByChapters": { + "tags": "split,chapters,structure", + "title": "PDF felosztÃĄsa fejezetek szerint", + "desc": "PDF felosztÃĄsa tÃļbb fÃĄjlra a fejezetstruktÃēra alapjÃĄn" + }, + "validateSignature": { + "tags": "validate,verify,certificate", + "title": "PDF alÃĄÃ­rÃĄs ellenőrzÊse", + "desc": "DigitÃĄlis alÃĄÃ­rÃĄsok Ês tanÃēsítvÃĄnyok ellenőrzÊse PDF dokumentumokban" + }, + "swagger": { + "tags": "API,documentation,test", + "title": "API Documentation", + "desc": "View API documentation and test endpoints" + }, + "scannerEffect": { + "tags": "scan,simulate,create", + "title": "Scanner Effect", + "desc": "Create a PDF that looks like it was scanned" + }, + "editTableOfContents": { + "tags": "bookmarks,contents,edit", + "title": "SzerkesztÊs vagy hozzÃĄadÃĄs a PDF tartalomjegyzÊkÊhez", + "desc": "PDF dokumentumokban kÃļnyvjelzők Ês tartalomjegyzÊk hozzÃĄadÃĄsa vagy szerkesztÊse" + }, + "manageCertificates": { + "tags": "certificates,import,export", + "title": "Manage Certificates", + "desc": "Import, export, or delete digital certificate files used for signing PDFs." + }, + "read": { + "tags": "view,open,display", + "title": "Read", + "desc": "View and annotate PDFs. Highlight text, draw, or insert comments for review and collaboration." + }, + "reorganizePages": { + "tags": "rearrange,reorder,organize", + "title": "Reorganize Pages", + "desc": "Rearrange, duplicate, or delete PDF pages with visual drag-and-drop control." + }, + "extractPages": { + "tags": "pull,select,copy", + "title": "Oldalak kinyerÊse", + "desc": "Extract specific pages from a PDF document" + }, + "removePages": { + "tags": "delete,extract,exclude", + "title": "EltÃĄvolítÃĄs", + "desc": "Felesleges oldalak tÃļrlÊse a PDF dokumentumbÃŗl." + }, + "autoSizeSplitPDF": { + "tags": "auto,split,size", + "title": "Automatikus felosztÃĄs mÊret/darabszÃĄm szerint", + "desc": "Egyetlen PDF felosztÃĄsa tÃļbb dokumentumra mÊret, oldalszÃĄm vagy dokumentumszÃĄm alapjÃĄn" + }, + "replaceColor": { + "title": "Replace & Invert Colour", + "desc": "Replace or invert colours in PDF documents" + }, + "devApi": { + "tags": "API,development,documentation", + "title": "API", + "desc": "Link to API documentation" + }, + "devFolderScanning": { + "tags": "automation,folder,scanning", + "title": "Automated Folder Scanning", + "desc": "Link to automated folder scanning guide" + }, + "devSsoGuide": { + "title": "SSO Guide", + "desc": "Link to SSO guide" + }, + "devAirgapped": { + "title": "Air-gapped Setup", + "desc": "Link to air-gapped setup guide" + }, + "addPassword": { + "title": "JelszÃŗ hozzÃĄadÃĄsa", + "desc": "PDF dokumentum jelszavas vÊdelme" + }, + "changePermissions": { + "title": "JogosultsÃĄgok mÃŗdosítÃĄsa", + "desc": "Change document restrictions and permissions" + }, + "automate": { + "tags": "workflow,sequence,automation", + "title": "Automate", + "desc": "Build multi-step workflows by chaining together PDF actions. Ideal for recurring tasks." + }, + "overlay-pdfs": { + "desc": "PDF-ek egymÃĄsra helyezÊse egy mÃĄsik PDF-en", + "title": "PDF-ek egymÃĄsra helyezÊse" + }, "imageToPDF": { "title": "KÊp PDF-be", "desc": "KÊp (PNG, JPEG, GIF) konvertÃĄlÃĄsa PDF-fÊ." @@ -355,18 +786,6 @@ "title": "PDF kÊppÊ", "desc": "PDF konvertÃĄlÃĄsa kÊppÊ (PNG, JPEG, GIF)." }, - "pdfOrganiser": { - "title": "RendszerezÊs", - "desc": "Oldalak eltÃĄvolítÃĄsa/ÃĄtrendezÊse tetszőleges sorrendben" - }, - "addImage": { - "title": "KÊp hozzÃĄadÃĄsa", - "desc": "KÊp hozzÃĄadÃĄsa a PDF megadott helyÊre" - }, - "watermark": { - "title": "Vízjel hozzÃĄadÃĄsa", - "desc": "Egyedi vízjel hozzÃĄadÃĄsa PDF dokumentumhoz" - }, "permissions": { "title": "JogosultsÃĄgok mÃŗdosítÃĄsa", "desc": "PDF dokumentum jogosultsÃĄgainak mÃŗdosítÃĄsa" @@ -375,38 +794,10 @@ "title": "EltÃĄvolítÃĄs", "desc": "Felesleges oldalak tÃļrlÊse a PDF dokumentumbÃŗl." }, - "addPassword": { - "title": "JelszÃŗ hozzÃĄadÃĄsa", - "desc": "PDF dokumentum jelszavas vÊdelme" - }, - "removePassword": { - "title": "JelszÃŗ eltÃĄvolítÃĄsa", - "desc": "Jelszavas vÊdelem eltÃĄvolítÃĄsa a PDF dokumentumbÃŗl" - }, - "compress": { - "title": "TÃļmÃļrítÊs", - "desc": "PDF-ek tÃļmÃļrítÊse a fÃĄjlmÊret csÃļkkentÊse ÊrdekÊben" - }, - "unlockPDFForms": { - "title": "PDF Åąrlapok feloldÃĄsa", - "desc": "PDF dokumentumban lÊvő Åąrlapmezők írÃĄsvÊdettsÊgÊnek eltÃĄvolítÃĄsa." - }, - "changeMetadata": { - "title": "Metaadatok mÃŗdosítÃĄsa", - "desc": "PDF dokumentum metaadatainak mÃŗdosítÃĄsa/tÃļrlÊse/hozzÃĄadÃĄsa" - }, "fileToPDF": { "title": "FÃĄjl konvertÃĄlÃĄsa PDF-be", "desc": "Szinte bÃĄrmilyen fÃĄjl konvertÃĄlÃĄsa PDF-be (DOCX, PNG, XLS, PPT, TXT Ês egyebek)" }, - "ocr": { - "title": "OCR / Szkennelt dokumentumok tisztítÃĄsa", - "desc": "Szkennelt dokumentumok tisztítÃĄsa Ês szÃļvegfelismerÊs kÊpekből, majd visszaadÃĄsa szerkeszthető szÃļvegkÊnt" - }, - "extractImages": { - "title": "KÊpek kinyerÊse", - "desc": "Minden kÊp kinyerÊse a PDF-ből Ês mentÊse ZIP fÃĄjlba" - }, "pdfToPDFA": { "title": "PDF konvertÃĄlÃĄsa PDF/A formÃĄtumba", "desc": "PDF konvertÃĄlÃĄsa PDF/A formÃĄtumba hosszÃē tÃĄvÃē tÃĄrolÃĄshoz" @@ -435,70 +826,14 @@ "title": "Szkennelt kÊpek felismerÊse/szÊtvÃĄlasztÃĄsa", "desc": "TÃļbb fotÃŗ szÊtvÃĄlasztÃĄsa egy kÊpből/PDF-ből" }, - "sign": { - "title": "AlÃĄÃ­rÃĄs", - "desc": "AlÃĄÃ­rÃĄs hozzÃĄadÃĄsa PDF-hez rajzolÃĄssal, szÃļveggel vagy kÊppel" - }, - "flatten": { - "title": "LapítÃĄs", - "desc": "Minden interaktív elem Ês Åąrlap eltÃĄvolítÃĄsa a PDF-ből" - }, - "repair": { - "title": "JavítÃĄs", - "desc": "SÊrÃŧlt/hibÃĄs PDF javítÃĄsa" - }, - "removeBlanks": { - "title": "Üres oldalak eltÃĄvolítÃĄsa", - "desc": "Üres oldalak felismerÊse Ês eltÃĄvolítÃĄsa a dokumentumbÃŗl" - }, - "removeAnnotations": { - "title": "MegjegyzÊsek eltÃĄvolítÃĄsa", - "desc": "Minden megjegyzÊs/annotÃĄciÃŗ eltÃĄvolítÃĄsa a PDF-ből" - }, - "compare": { - "title": "ÖsszehasonlítÃĄs", - "desc": "KÊt PDF dokumentum ÃļsszehasonlítÃĄsa Ês kÃŧlÃļnbsÊgek megjelenítÊse" - }, - "certSign": { - "title": "TanÃēsítvÃĄnnyal alÃĄÃ­rÃĄs", - "desc": "PDF alÃĄÃ­rÃĄsa tanÃēsítvÃĄnnyal/kulccsal (PEM/P12)" - }, - "removeCertSign": { - "title": "TanÃēsítvÃĄnyos alÃĄÃ­rÃĄs eltÃĄvolítÃĄsa", - "desc": "TanÃēsítvÃĄnyos alÃĄÃ­rÃĄs eltÃĄvolítÃĄsa PDF-ből" - }, - "pageLayout": { - "title": "TÃļbboldalas elrendezÊs", - "desc": "PDF dokumentum tÃļbb oldalÃĄnak egyesítÊse egyetlen oldalra" - }, - "scalePages": { - "title": "OldalmÊret/mÊretarÃĄny beÃĄllítÃĄsa", - "desc": "Oldal Ês/vagy tartalom mÊretÊnek/mÊretarÃĄnyÃĄnak mÃŗdosítÃĄsa" - }, "pipeline": { "title": "Pipeline", "desc": "TÃļbb mÅąvelet vÊgrehajtÃĄsa PDF-eken pipeline szkriptek definiÃĄlÃĄsÃĄval" }, - "addPageNumbers": { - "title": "OldalszÃĄmozÃĄs hozzÃĄadÃĄsa", - "desc": "OldalszÃĄmok hozzÃĄadÃĄsa a dokumentumhoz meghatÃĄrozott helyen" - }, "auto-rename": { "title": "PDF automatikus ÃĄtnevezÊse", "desc": "PDF fÃĄjl automatikus ÃĄtnevezÊse a felismert fejlÊc alapjÃĄn" }, - "adjustContrast": { - "title": "Színek/kontraszt beÃĄllítÃĄsa", - "desc": "PDF kontraszt, telítettsÊg Ês fÊnyerő beÃĄllítÃĄsa" - }, - "crop": { - "title": "PDF vÃĄgÃĄsa", - "desc": "PDF vÃĄgÃĄsa a mÊret csÃļkkentÊse ÊrdekÊben (a szÃļveg megmarad!)" - }, - "autoSplitPDF": { - "title": "Automatikus oldalfelosztÃĄs", - "desc": "Szkennelt PDF automatikus felosztÃĄsa QR-kÃŗd alapÃē oldalelvÃĄlasztÃŗval" - }, "sanitizePDF": { "title": "TisztítÃĄs", "desc": "Szkriptek Ês egyÊb elemek eltÃĄvolítÃĄsa PDF fÃĄjlokbÃŗl" @@ -519,30 +854,14 @@ "title": "PDF konvertÃĄlÃĄsa Markdown-ba", "desc": "AkÃĄrmilyen PDF konvertÃĄlÃĄsa Markdown-ba" }, - "getPdfInfo": { - "title": "PDF Ãļsszes informÃĄciÃŗjÃĄnak lekÊrÊse", - "desc": "Minden elÊrhető informÃĄciÃŗ lekÊrÊse PDF-ekről" - }, "pageExtracter": { "title": "Oldalak kinyerÊse", "desc": "KivÃĄlasztott oldalak kinyerÊse PDF-ből" }, - "pdfToSinglePage": { - "title": "Egyoldalas nagy PDF", - "desc": "Minden PDF oldal egyesítÊse egyetlen nagy oldalba" - }, - "showJS": { - "title": "JavaScript megjelenítÊse", - "desc": "PDF-be injektÃĄlt JavaScript kÃŗd keresÊse Ês megjelenítÊse" - }, "autoRedact": { "title": "Automatikus kitakarÃĄs", "desc": "SzÃļveg automatikus kitakarÃĄsa (feketÊvel) PDF-ben megadott szÃļveg alapjÃĄn" }, - "redact": { - "title": "KÊzi kitakarÃĄs", - "desc": "PDF kitakarÃĄsa kivÃĄlasztott szÃļveg, rajzolt alakzatok Ês/vagy kivÃĄlasztott oldalak alapjÃĄn" - }, "PDFToCSV": { "title": "PDF konvertÃĄlÃĄsa CSV-be", "desc": "TÃĄblÃĄzatok kinyerÊse PDF-ből Ês konvertÃĄlÃĄsa CSV formÃĄtumba" @@ -551,10 +870,6 @@ "title": "Automatikus felosztÃĄs mÊret/darabszÃĄm szerint", "desc": "Egyetlen PDF felosztÃĄsa tÃļbb dokumentumra mÊret, oldalszÃĄm vagy dokumentumszÃĄm alapjÃĄn" }, - "overlay-pdfs": { - "title": "PDF-ek egymÃĄsra helyezÊse", - "desc": "PDF-ek egymÃĄsra helyezÊse egy mÃĄsik PDF-en" - }, "split-by-sections": { "title": "PDF felosztÃĄsa szakaszokra", "desc": "PDF oldalainak felosztÃĄsa kisebb vízszintes Ês fÃŧggőleges szakaszokra" @@ -563,48 +878,18 @@ "title": "PecsÊt hozzÃĄadÃĄsa PDF-hez", "desc": "SzÃļveges vagy kÊpes pecsÊt hozzÃĄadÃĄsa megadott helyekre" }, - "removeImage": { - "title": "KÊpek eltÃĄvolítÃĄsa", - "desc": "KÊpek eltÃĄvolítÃĄsa PDF-ből a fÃĄjlmÊret csÃļkkentÊse ÊrdekÊben" - }, - "splitByChapters": { - "title": "PDF felosztÃĄsa fejezetek szerint", - "desc": "PDF felosztÃĄsa tÃļbb fÃĄjlra a fejezetstruktÃēra alapjÃĄn" - }, - "validateSignature": { - "title": "PDF alÃĄÃ­rÃĄs ellenőrzÊse", - "desc": "DigitÃĄlis alÃĄÃ­rÃĄsok Ês tanÃēsítvÃĄnyok ellenőrzÊse PDF dokumentumokban" - }, "replace-color": { "title": "Színek cserÊje Ês invertÃĄlÃĄsa", "desc": "PDF szÃļveg Ês hÃĄttÊrszíneinek cserÊje Ês teljes színinvertÃĄlÃĄs a fÃĄjlmÊret csÃļkkentÊse ÊrdekÊben" }, - "convert": { - "title": "KonvertÃĄlÃĄs" - }, "attachments": { "title": "CsatolmÃĄnyok hozzÃĄadÃĄsa a PDF-hez", "desc": "CsatolmÃĄnyok (beÃĄgyazott fÃĄjlok) hozzÃĄadÃĄsa vagy eltÃĄvolítÃĄsa a PDF-ből" }, - "editTableOfContents": { - "title": "SzerkesztÊs vagy hozzÃĄadÃĄs a PDF tartalomjegyzÊkÊhez", - "desc": "PDF dokumentumokban kÃļnyvjelzők Ês tartalomjegyzÊk hozzÃĄadÃĄsa vagy szerkesztÊse" - }, - "extractPages": { - "title": "Oldalak kinyerÊse" - }, - "removePages": { - "title": "EltÃĄvolítÃĄs", - "desc": "Felesleges oldalak tÃļrlÊse a PDF dokumentumbÃŗl." - }, "removeImagePdf": { "title": "KÊpek eltÃĄvolítÃĄsa", "desc": "KÊpek eltÃĄvolítÃĄsa PDF-ből a fÃĄjlmÊret csÃļkkentÊse ÊrdekÊben" }, - "autoSizeSplitPDF": { - "title": "Automatikus felosztÃĄs mÊret/darabszÃĄm szerint", - "desc": "Egyetlen PDF felosztÃĄsa tÃļbb dokumentumra mÊret, oldalszÃĄm vagy dokumentumszÃĄm alapjÃĄn" - }, "adjust-contrast": { "title": "Színek/kontraszt beÃĄllítÃĄsa", "desc": "PDF kontraszt, telítettsÊg Ês fÊnyerő beÃĄllítÃĄsa" @@ -612,11 +897,12 @@ "replaceColorPdf": { "title": "Színek cserÊje Ês invertÃĄlÃĄsa", "desc": "PDF szÃļveg Ês hÃĄttÊrszíneinek cserÊje Ês teljes színinvertÃĄlÃĄs a fÃĄjlmÊret csÃļkkentÊse ÊrdekÊben" - }, - "changePermissions": { - "title": "JogosultsÃĄgok mÃŗdosítÃĄsa" } }, + "landing": { + "addFiles": "Add Files", + "uploadFromComputer": "Upload from computer" + }, "viewPdf": { "tags": "megtekintÊs,olvasÃĄs,jegyzetelÊs,szÃļveg,kÊp", "title": "PDF megtekintÊse/szerkesztÊse", @@ -650,17 +936,39 @@ "merge": { "tags": "egyesítÊs,OldalmÅąveletek,Backend,szerver oldali", "title": "EgyesítÊs", + "removeDigitalSignature": { + "label": "Remove digital signature in the merged file?", + "tooltip": { + "title": "Remove Digital Signature", + "description": "Digital signatures will be invalidated when merging files. Check this to remove them from the final merged PDF." + } + }, + "generateTableOfContents": { + "label": "Generate table of contents in the merged file?", + "tooltip": { + "title": "Generate Table of Contents", + "description": "Automatically creates a clickable table of contents in the merged PDF based on the original file names and page numbers." + } + }, + "submit": "EgyesítÊs", + "sortBy": { + "description": "Files will be merged in the order they're selected. Drag to reorder or sort below.", + "label": "Sort By", + "filename": "FÃĄjlnÊv", + "dateModified": "Date Modified", + "ascending": "Ascending", + "descending": "Descending", + "sort": "Sort" + }, + "error": { + "failed": "An error occurred while merging the PDFs." + }, "header": "TÃļbb PDF egyesítÊse (2+)", "sortByName": "RendezÊs nÊv szerint", "sortByDate": "RendezÊs dÃĄtum szerint", - "removeCertSign": "DigitÃĄlis alÃĄÃ­rÃĄs eltÃĄvolítÃĄsa az egyesített fÃĄjlban?", - "submit": "EgyesítÊs", - "sortBy": { - "filename": "FÃĄjlnÊv" - } + "removeCertSign": "DigitÃĄlis alÃĄÃ­rÃĄs eltÃĄvolítÃĄsa az egyesített fÃĄjlban?" }, "split": { - "tags": "OldalmÅąveletek,felosztÃĄs,TÃļbb oldal,vÃĄgÃĄs,szerver oldali", "title": "PDF felosztÃĄsa", "header": "PDF felosztÃĄsa", "desc": { @@ -676,25 +984,249 @@ "splitPages": "Adja meg a felosztÃĄsi pontokat:", "submit": "FelosztÃĄs", "steps": { + "chooseMethod": "Choose Method", "settings": "BeÃĄllítÃĄsok" }, + "settings": { + "selectMethodFirst": "Please select a split method first" + }, + "error": { + "failed": "An error occurred while splitting the PDF." + }, + "method": { + "label": "Choose split method", + "placeholder": "Select how to split the PDF" + }, "methods": { + "prefix": { + "splitAt": "Split at", + "splitBy": "Split by" + }, + "byPages": { + "name": "Page Numbers", + "desc": "Extract specific pages (1,3,5-10)", + "tooltip": "Enter page numbers separated by commas or ranges with hyphens" + }, + "bySections": { + "name": "Sections", + "desc": "Divide pages into grid sections", + "tooltip": "Split each page into horizontal and vertical sections" + }, "bySize": { - "name": "FÃĄjlmÊret" + "name": "FÃĄjlmÊret", + "desc": "Limit maximum file size", + "tooltip": "Specify maximum file size (e.g. 10MB, 500KB)" + }, + "byPageCount": { + "name": "Page Count", + "desc": "Fixed pages per file", + "tooltip": "Enter the number of pages for each split file" + }, + "byDocCount": { + "name": "Document Count", + "desc": "Create specific number of files", + "tooltip": "Enter how many files you want to create" + }, + "byChapters": { + "name": "Chapters", + "desc": "Split at bookmark boundaries", + "tooltip": "Uses PDF bookmarks to determine split points" + }, + "byPageDivider": { + "name": "Page Divider", + "desc": "Auto-split with divider sheets", + "tooltip": "Use QR code divider sheets between documents when scanning" } }, "value": { "fileSize": { - "label": "FÃĄjlmÊret" + "label": "FÃĄjlmÊret", + "placeholder": "e.g. 10MB, 500KB" + }, + "pageCount": { + "label": "Pages per File", + "placeholder": "e.g. 5, 10" + }, + "docCount": { + "label": "Number of Files", + "placeholder": "e.g. 3, 5" } - } + }, + "tooltip": { + "header": { + "title": "Split Methods Overview" + }, + "byPages": { + "title": "Split at Page Numbers", + "text": "Split your PDF at specific page numbers. Using 'n' splits after page n. Using 'n-m' splits before page n and after page m.", + "bullet1": "Single split points: 3,7 (splits after pages 3 and 7)", + "bullet2": "Range split points: 3-8 (splits before page 3 and after page 8)", + "bullet3": "Mixed: 2,5-10,15 (splits after page 2, before page 5, after page 10, and after page 15)" + }, + "bySections": { + "title": "Split by Grid Sections", + "text": "Divide each page into a grid of sections. Useful for splitting documents with multiple columns or extracting specific areas.", + "bullet1": "Horizontal: Number of rows to create", + "bullet2": "Vertical: Number of columns to create", + "bullet3": "Merge: Combine all sections into one PDF" + }, + "bySize": { + "title": "Split by File Size", + "text": "Create multiple PDFs that don't exceed a specified file size. Ideal for file size limitations or email attachments.", + "bullet1": "Use MB for larger files (e.g., 10MB)", + "bullet2": "Use KB for smaller files (e.g., 500KB)", + "bullet3": "System will split at page boundaries" + }, + "byCount": { + "title": "Split by Count", + "text": "Create multiple PDFs with a specific number of pages or documents each.", + "bullet1": "Page Count: Fixed number of pages per file", + "bullet2": "Document Count: Fixed number of output files", + "bullet3": "Useful for batch processing workflows" + }, + "byChapters": { + "title": "Split by Chapters", + "text": "Use PDF bookmarks to automatically split at chapter boundaries. Requires PDFs with bookmark structure.", + "bullet1": "Bookmark Level: Which level to split on (1=top level)", + "bullet2": "Include Metadata: Preserve document properties", + "bullet3": "Allow Duplicates: Handle repeated bookmark names" + }, + "byDocCount": { + "bullet1": "Enter the number of output files you want", + "bullet2": "Pages are distributed as evenly as possible", + "bullet3": "Useful when you need a specific number of files", + "text": "Create a specific number of output files by evenly distributing pages across them.", + "title": "Split by Document Count" + }, + "byPageCount": { + "bullet1": "Enter the number of pages per output file", + "bullet2": "Last file may have fewer pages if not evenly divisible", + "bullet3": "Useful for batch processing workflows", + "text": "Create multiple PDFs with a specific number of pages each. Perfect for creating uniform document chunks.", + "title": "Split by Page Count" + }, + "byPageDivider": { + "bullet1": "Print divider sheets from the download link", + "bullet2": "Insert divider sheets between your documents", + "bullet3": "Scan all documents together as one PDF", + "bullet4": "Upload - divider pages are automatically detected and removed", + "bullet5": "Enable Duplex Mode if scanning both sides of divider sheets", + "text": "Automatically split scanned documents using physical divider sheets with QR codes. Perfect for processing multiple documents scanned together.", + "title": "Split by Page Divider" + } + }, + "methodSelection": { + "tooltip": { + "bullet1": "Click on a method card to select it", + "bullet2": "Hover over each card to see a quick description", + "bullet3": "The settings step will appear after you select a method", + "bullet4": "You can change methods at any time before processing", + "header": { + "text": "Choose how you want to split your PDF document. Each method is optimized for different use cases and document types.", + "title": "Split Method Selection" + }, + "title": "Choose Your Split Method" + } + }, + "selectMethod": "Select a split method", + "tags": "OldalmÅąveletek,felosztÃĄs,TÃļbb oldal,vÃĄgÃĄs,szerver oldali" }, "rotate": { - "tags": "szerver oldali", "title": "PDF forgatÃĄsa", + "submit": "ForgatÃĄs", + "selectRotation": "Select Rotation Angle (Clockwise)", + "error": { + "failed": "An error occurred while rotating the PDF." + }, + "preview": { + "title": "Rotation Preview" + }, + "rotateLeft": "Rotate Anticlockwise", + "rotateRight": "Rotate Clockwise", + "tooltip": { + "header": { + "title": "Rotate Settings Overview" + }, + "description": { + "text": "Rotate your PDF pages clockwise or anticlockwise in 90-degree increments. All pages in the PDF will be rotated. The preview shows how your document will look after rotation." + }, + "controls": { + "title": "Controls", + "text": "Use the rotation buttons to adjust orientation. Left button rotates anticlockwise, right button rotates clockwise. Each click rotates by 90 degrees." + } + }, + "tags": "szerver oldali", "header": "PDF forgatÃĄsa", - "selectAngle": "VÃĄlassza ki a forgatÃĄsi szÃļget (90 fok tÃļbbszÃļrÃļsei):", - "submit": "ForgatÃĄs" + "selectAngle": "VÃĄlassza ki a forgatÃĄsi szÃļget (90 fok tÃļbbszÃļrÃļsei):" + }, + "convert": { + "title": "KonvertÃĄlÃĄs", + "desc": "Convert files between different formats", + "files": "Files", + "selectFilesPlaceholder": "Select files in the main view to get started", + "settings": "BeÃĄllítÃĄsok", + "conversionCompleted": "Conversion completed", + "results": "Results", + "defaultFilename": "converted_file", + "conversionResults": "Conversion Results", + "convertFrom": "Convert from", + "convertTo": "Convert to", + "sourceFormatPlaceholder": "Source format", + "targetFormatPlaceholder": "Target format", + "selectSourceFormatFirst": "Select a source format first", + "outputOptions": "Output Options", + "pdfOptions": "PDF Options", + "imageOptions": "Image Options", + "colorType": "Colour Type", + "color": "Szín", + "greyscale": "SzÃŧrkeÃĄrnyalatos", + "blackwhite": "Black & White", + "dpi": "DPI", + "output": "Output", + "single": "Single", + "multiple": "Multiple", + "fitOption": "Fit Option", + "maintainAspectRatio": "Maintain Aspect Ratio", + "fitDocumentToPage": "Fit Document to Page", + "fillPage": "Oldal kitÃļltÊse", + "autoRotate": "Auto Rotate", + "autoRotateDescription": "Automatically rotate images to better fit the PDF page", + "combineImages": "Combine Images", + "combineImagesDescription": "Combine all images into one PDF, or create separate PDFs for each image", + "webOptions": "Web to PDF Options", + "zoomLevel": "Zoom Level", + "emailOptions": "Email to PDF Options", + "includeAttachments": "Include email attachments", + "maxAttachmentSize": "Maximum attachment size (MB)", + "includeAllRecipients": "Include CC and BCC recipients in header", + "downloadHtml": "Download HTML intermediate file instead of PDF", + "pdfaOptions": "PDF/A Options", + "outputFormat": "Output Format", + "pdfaNote": "PDF/A-1b is more compatible, PDF/A-2b supports more features.", + "pdfaDigitalSignatureWarning": "A PDF digitÃĄlis alÃĄÃ­rÃĄst tartalmaz. Ez a kÃļvetkező lÊpÊsben eltÃĄvolítÃĄsra kerÃŧl.", + "fileFormat": "File Format", + "wordDoc": "Word Document", + "wordDocExt": "Word Document (.docx)", + "odtExt": "OpenDocument Text (.odt)", + "pptExt": "PowerPoint (.pptx)", + "odpExt": "OpenDocument Presentation (.odp)", + "txtExt": "Plain Text (.txt)", + "rtfExt": "Rich Text Format (.rtf)", + "selectedFiles": "Selected files", + "noFileSelected": "No file selected. Use the file panel to add files.", + "convertFiles": "Convert Files", + "converting": "Converting...", + "downloadConverted": "Download Converted File", + "errorNoFiles": "Please select at least one file to convert.", + "errorNoFormat": "Please select both source and target formats.", + "errorNotSupported": "Conversion from {{from}} to {{to}} is not supported.", + "images": "Images", + "officeDocs": "Office Documents (Word, Excel, PowerPoint)", + "imagesExt": "Images (JPG, PNG, etc.)", + "markdown": "Markdown", + "textRtf": "Text/RTF", + "grayscale": "SzÃŧrkeÃĄrnyalatos", + "errorConversion": "An error occurred while converting the file." }, "imageToPdf": { "tags": "konverziÃŗ,kÊp,jpg,fotÃŗ,fÊnykÊp" @@ -732,7 +1264,33 @@ "8": "UtolsÃŗ oldal eltÃĄvolítÃĄsa", "9": "Első Ês utolsÃŗ oldal eltÃĄvolítÃĄsa", "10": "PÃĄros-pÃĄratlan egyesítÊs", - "11": "Minden oldal megkettőzÊse" + "11": "Minden oldal megkettőzÊse", + "desc": { + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, â€Ļ).", + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, â€Ļ).", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimized for binding on the side)." + } + }, + "desc": { + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, â€Ļ).", + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, â€Ļ).", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimised for binding on the side).", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document." }, "placeholder": "(pl. 1,3,2 vagy 4-8,2,10-12 vagy 2n-1)" }, @@ -744,9 +1302,198 @@ "upload": "KÊp hozzÃĄadÃĄsa", "submit": "KÊp hozzÃĄadÃĄsa" }, + "attachments": { + "tags": "beÃĄgyazÃĄs,csatolÃĄs,fÃĄjl,csatolmÃĄny,csatolmÃĄnyok", + "title": "MellÊkletek hozzÃĄadÃĄsa", + "header": "MellÊkletek hozzÃĄadÃĄsa", + "add": "Add Attachment", + "remove": "Remove Attachment", + "embed": "Embed Attachment", + "submit": "CsatolmÃĄnyok hozzÃĄadÃĄsa a PDF-hez" + }, "watermark": { - "tags": "SzÃļveg,ismÊtlődő,címke,egyedi,szerzői jog,vÊdjegy,kÊp,jpg,fotÃŗ,fÊnykÊp", "title": "Vízjel hozzÃĄadÃĄsa", + "desc": "Add text or image watermarks to PDF files", + "completed": "Watermark added", + "submit": "Vízjel hozzÃĄadÃĄsa", + "filenamePrefix": "watermarked", + "error": { + "failed": "An error occurred while adding watermark to the PDF." + }, + "watermarkType": { + "text": "SzÃļveg", + "image": "Image" + }, + "settings": { + "type": "Watermark Type", + "text": { + "label": "Watermark Text", + "placeholder": "Enter watermark text" + }, + "image": { + "label": "Watermark Image", + "choose": "Choose Image", + "selected": "Selected: {{filename}}" + }, + "fontSize": "BetÅąmÊret", + "size": "Size", + "alphabet": "Font/Language", + "color": "Watermark Colour", + "rotation": "Rotation (degrees)", + "opacity": "Opacity (%)", + "spacing": { + "horizontal": "Horizontal Spacing", + "vertical": "Vertical Spacing", + "height": "Height Spacing", + "width": "Width Spacing" + }, + "convertToImage": "Flatten PDF pages to images" + }, + "alphabet": { + "roman": "Roman/Latin", + "arabic": "Arabic", + "japanese": "Japanese", + "korean": "Korean", + "chinese": "Chinese", + "thai": "Thai" + }, + "steps": { + "type": "Watermark Type", + "wording": "Wording", + "textStyle": "Style", + "formatting": "Formatting", + "file": "Watermark File" + }, + "results": { + "title": "Watermark Results" + }, + "tooltip": { + "language": { + "title": "Language Support", + "text": "Choose the appropriate language setting to ensure proper font rendering for your text." + }, + "appearance": { + "title": "Appearance Settings", + "text": "Control how your watermark looks and blends with the document.", + "bullet1": "Rotation: -360° to 360° for angled watermarks", + "bullet2": "Opacity: 0-100% for transparency control", + "bullet3": "Lower opacity creates subtle watermarks" + }, + "spacing": { + "title": "Spacing Control", + "text": "Adjust the spacing between repeated watermarks across the page.", + "bullet1": "Width spacing: Horizontal distance between watermarks", + "bullet2": "Height spacing: Vertical distance between watermarks", + "bullet3": "Higher values create more spread out patterns" + }, + "type": { + "header": { + "title": "Watermark Type Selection" + }, + "description": { + "title": "Choose Your Watermark", + "text": "Select between text or image watermarks based on your needs." + }, + "text": { + "title": "Text Watermarks", + "text": "Perfect for adding copyright notices, company names, or confidentiality labels. Supports multiple languages and custom colours.", + "bullet1": "Customisable fonts and languages", + "bullet2": "Adjustable colours and transparency", + "bullet3": "Ideal for legal or branding text" + }, + "image": { + "title": "Image Watermarks", + "text": "Use logos, stamps, or any image as a watermark. Great for branding and visual identification.", + "bullet1": "Upload any image format", + "bullet2": "Maintains image quality", + "bullet3": "Perfect for logos and stamps" + } + }, + "wording": { + "header": { + "title": "Text Content" + }, + "text": { + "title": "Watermark Text", + "text": "Enter the text that will appear as your watermark across the document.", + "bullet1": "Keep it concise for better readability", + "bullet2": "Common examples: 'CONFIDENTIAL', 'DRAFT', company name", + "bullet3": "Emoji characters are not supported and will be filtered out" + } + }, + "textStyle": { + "header": { + "title": "Text Style" + }, + "color": { + "title": "Colour Selection", + "text": "Choose a colour that provides good contrast with your document content.", + "bullet1": "Light grey (#d3d3d3) for subtle watermarks", + "bullet2": "Black or dark colours for high contrast", + "bullet3": "Custom colours for branding purposes" + }, + "language": { + "title": "Language Support", + "text": "Choose the appropriate language setting to ensure proper font rendering." + } + }, + "file": { + "header": { + "title": "Image Upload" + }, + "upload": { + "title": "Image Selection", + "text": "Upload an image file to use as your watermark.", + "bullet1": "Supports common formats: PNG, JPG, GIF, BMP", + "bullet2": "PNG with transparency works best", + "bullet3": "Higher resolution images maintain quality better" + }, + "recommendations": { + "title": "Best Practices", + "text": "Tips for optimal image watermark results.", + "bullet1": "Use logos or stamps with transparent backgrounds", + "bullet2": "Simple designs work better than complex images", + "bullet3": "Consider the final document size when choosing resolution" + } + }, + "formatting": { + "header": { + "title": "Formatting & Layout" + }, + "size": { + "title": "Size Control", + "text": "Adjust the size of your watermark (text or image).", + "bullet1": "Larger sizes create more prominent watermarks" + }, + "appearance": { + "title": "Appearance Settings", + "text": "Control how your watermark looks and blends with the document.", + "bullet1": "Rotation: -360° to 360° for angled watermarks", + "bullet2": "Opacity: 0-100% for transparency control", + "bullet3": "Lower opacity creates subtle watermarks" + }, + "spacing": { + "title": "Spacing Control", + "text": "Adjust the spacing between repeated watermarks across the page.", + "bullet1": "Horizontal spacing: Distance between watermarks left to right", + "bullet2": "Vertical spacing: Distance between watermarks top to bottom", + "bullet3": "Higher values create more spread out patterns" + }, + "security": { + "title": "Security Option", + "text": "Convert the final PDF to an image-based format for enhanced security.", + "bullet1": "Prevents text selection and copying", + "bullet2": "Makes watermarks harder to remove", + "bullet3": "Results in larger file sizes", + "bullet4": "Best for sensitive or copyrighted content" + } + } + }, + "type": { + "1": "SzÃļveg", + "2": "KÊp" + }, + "tags": "SzÃļveg,ismÊtlődő,címke,egyedi,szerzői jog,vÊdjegy,kÊp,jpg,fotÃŗ,fÊnykÊp", "header": "Vízjel hozzÃĄadÃĄsa", "customColor": "Egyedi szÃļvegszín", "selectText": { @@ -760,17 +1507,6 @@ "8": "Vízjel típusa:", "9": "Vízjel kÊpe:", "10": "PDF konvertÃĄlÃĄsa PDF-kÊppÊ" - }, - "submit": "Vízjel hozzÃĄadÃĄsa", - "type": { - "1": "SzÃļveg", - "2": "KÊp" - }, - "watermarkType": { - "text": "SzÃļveg" - }, - "settings": { - "fontSize": "BetÅąmÊret" } }, "permissions": { @@ -795,50 +1531,201 @@ "removePages": { "tags": "Oldalak eltÃĄvolítÃĄsa,oldalak tÃļrlÊse", "title": "EltÃĄvolítÃĄs", + "pageNumbers": { + "label": "Pages to Remove", + "placeholder": "e.g., 1,3,5-8,10", + "error": "Invalid page number format. Use numbers, ranges (1-5), or mathematical expressions (2n+1)" + }, + "filenamePrefix": "pages_removed", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "settings": { + "title": "Settings" + }, + "tooltip": { + "header": { + "title": "Remove Pages Settings" + }, + "pageNumbers": { + "title": "Page Selection", + "text": "Specify which pages to remove from your PDF. You can select individual pages, ranges, or use mathematical expressions.", + "bullet1": "Individual pages: 1,3,5 (removes pages 1, 3, and 5)", + "bullet2": "Page ranges: 1-5,10-15 (removes pages 1-5 and 10-15)", + "bullet3": "Mathematical: 2n+1 (removes odd pages)", + "bullet4": "Open ranges: 5- (removes from page 5 to end)" + }, + "examples": { + "title": "Common Examples", + "text": "Here are some common page selection patterns:", + "bullet1": "Remove first page: 1", + "bullet2": "Remove last 3 pages: -3", + "bullet3": "Remove every other page: 2n", + "bullet4": "Remove specific scattered pages: 1,5,10,15" + }, + "safety": { + "title": "Safety Tips", + "text": "Important considerations when removing pages:", + "bullet1": "Always preview your selection before processing", + "bullet2": "Keep a backup of your original file", + "bullet3": "Page numbers start from 1, not 0", + "bullet4": "Invalid page numbers will be ignored" + } + }, + "error": { + "failed": "An error occurred whilst removing pages." + }, + "results": { + "title": "Page Removal Results" + }, "submit": "EltÃĄvolítÃĄs" }, - "addPassword": { - "tags": "biztonsÃĄg,vÊdelem", - "title": "JelszÃŗ hozzÃĄadÃĄsa", - "header": "JelszÃŗ hozzÃĄadÃĄsa (TitkosítÃĄs)", - "selectText": { - "1": "VÃĄlassza ki a titkosítandÃŗ PDF-et", - "2": "FelhasznÃĄlÃŗi jelszÃŗ", - "3": "TitkosítÃĄsi kulcs hossza", - "4": "A magasabb ÊrtÊkek erősebbek, de az alacsonyabb ÊrtÊkek jobb kompatibilitÃĄst biztosítanak.", - "5": "BeÃĄllítandÃŗ jogosultsÃĄgok (Tulajdonosi jelszÃŗval ajÃĄnlott hasznÃĄlni)", - "6": "Dokumentum egyesítÊsÊnek megakadÃĄlyozÃĄsa", - "7": "Tartalom kinyerÊsÊnek megakadÃĄlyozÃĄsa", - "8": "AkadÃĄlymentesítÊsi cÊlÃē kinyerÊs megakadÃĄlyozÃĄsa", - "9": "ŰrlapkitÃļltÊs megakadÃĄlyozÃĄsa", - "10": "MÃŗdosítÃĄs megakadÃĄlyozÃĄsa", - "11": "MegjegyzÊsek mÃŗdosítÃĄsÃĄnak megakadÃĄlyozÃĄsa", - "12": "NyomtatÃĄs megakadÃĄlyozÃĄsa", - "13": "KÃŧlÃļnbÃļző formÃĄtumÃē nyomtatÃĄs megakadÃĄlyozÃĄsa", - "14": "Tulajdonos jelszÃŗ", - "15": "KorlÃĄtozza, hogy mi vÊgezhető el a dokumentum megnyitÃĄsa utÃĄn (Nem minden olvasÃŗ tÃĄmogatja)", - "16": "KorlÃĄtozza a dokumentum megnyithatsÃĄgÃĄt" + "extractPages": { + "title": "Extract Pages", + "pageNumbers": { + "label": "Pages to Extract", + "placeholder": "e.g., 1,3,5-8 or odd & 1-10" + }, + "settings": { + "title": "Settings" }, - "submit": "TitkosítÃĄs", "tooltip": { - "permissions": { - "title": "JogosultsÃĄgok mÃŗdosítÃĄsa" + "description": "Extracts the selected pages into a new PDF, preserving order." + }, + "error": { + "failed": "Failed to extract pages" + }, + "results": { + "title": "Pages Extracted" + }, + "submit": "Extract Pages" + }, + "pageSelection": { + "tooltip": { + "header": { + "title": "Page Selection Guide" + }, + "basic": { + "title": "Basic Usage", + "text": "Select specific pages from your PDF document using simple syntax.", + "bullet1": "Individual pages: 1,3,5", + "bullet2": "Page ranges: 3-6 or 10-15", + "bullet3": "All pages: all" + }, + "advanced": { + "title": "Advanced Features" + }, + "tips": { + "title": "Tips", + "text": "Keep these guidelines in mind:", + "bullet1": "Page numbers start from 1 (not 0)", + "bullet2": "Spaces are automatically removed", + "bullet3": "Invalid expressions are ignored" + }, + "syntax": { + "title": "Syntax Basics", + "text": "Use numbers, ranges, keywords, and progressions (n starts at 0). Parentheses are supported.", + "bullets": { + "numbers": "Numbers/ranges: 5, 10-20", + "keywords": "Keywords: odd, even", + "progressions": "Progressions: 3n, 4n+1" + } + }, + "operators": { + "title": "Operators", + "text": "AND has higher precedence than comma. NOT applies within the document range.", + "and": "AND: & or \"and\" — require both conditions (e.g., 1-50 & even)", + "comma": "Comma: , or | — combine selections (e.g., 1-10, 20)", + "not": "NOT: ! or \"not\" — exclude pages (e.g., 3n & not 30)" + }, + "examples": { + "title": "Examples" + }, + "complex": { + "bullet1": "1,3-5,8,2n → pages 1, 3–5, 8, plus evens", + "bullet2": "10-,2n-1 → from page 10 to end + odd pages", + "description": "Mix different types.", + "title": "Complex Combinations" + }, + "description": "Choose which pages to use for the operation. Supports single pages, ranges, formulas, and the all keyword.", + "individual": { + "bullet1": "1,3,5 → selects pages 1, 3, 5", + "bullet2": "2,7,12 → selects pages 2, 7, 12", + "description": "Enter numbers separated by commas.", + "title": "Individual Pages" + }, + "mathematical": { + "bullet1": "2n → all even pages (2, 4, 6â€Ļ)", + "bullet2": "2n-1 → all odd pages (1, 3, 5â€Ļ)", + "bullet3": "3n → every 3rd page (3, 6, 9â€Ļ)", + "bullet4": "4n-1 → pages 3, 7, 11, 15â€Ļ", + "description": "Use n in formulas for patterns.", + "title": "Mathematical Functions" + }, + "ranges": { + "bullet1": "3-6 → selects pages 3–6", + "bullet2": "10-15 → selects pages 10–15", + "bullet3": "5- → selects pages 5 to end", + "description": "Use - for consecutive pages.", + "title": "Page Ranges" + }, + "special": { + "bullet1": "all → selects all pages", + "title": "Special Keywords" } } }, - "removePassword": { - "tags": "biztonsÃĄg,feloldÃĄs,vÊdelem,jelszÃŗ tÃļrlÊse", - "title": "JelszÃŗ eltÃĄvolítÃĄsa", - "header": "JelszÃŗ eltÃĄvolítÃĄsa (VisszafejtÊs)", - "selectText": { - "1": "VÃĄlassza ki a visszafejtendő PDF-et", - "2": "JelszÃŗ" + "bulkSelection": { + "syntaxError": "There is a syntax issue. See Page Selection tips for help.", + "header": { + "title": "Page Selection Guide" }, - "submit": "EltÃĄvolítÃĄs", - "desc": "Jelszavas vÊdelem eltÃĄvolítÃĄsa a PDF dokumentumbÃŗl", - "password": { - "stepTitle": "JelszÃŗ eltÃĄvolítÃĄsa", - "label": "Jelenlegi jelszÃŗ" + "syntax": { + "title": "Syntax Basics", + "text": "Use numbers, ranges, keywords, and progressions (n starts at 0). Parentheses are supported.", + "bullets": { + "numbers": "Numbers/ranges: 5, 10-20", + "keywords": "Keywords: odd, even", + "progressions": "Progressions: 3n, 4n+1" + } + }, + "operators": { + "title": "Operators", + "text": "AND has higher precedence than comma. NOT applies within the document range.", + "and": "AND: & or \"and\" — require both conditions (e.g., 1-50 & even)", + "comma": "Comma: , or | — combine selections (e.g., 1-10, 20)", + "not": "NOT: ! or \"not\" — exclude pages (e.g., 3n & not 30)" + }, + "examples": { + "title": "Examples", + "first50": "First 50", + "last50": "Last 50", + "every3rd": "Every 3rd", + "oddWithinExcluding": "Odd within 1-20 excluding 5-7", + "combineSets": "Combine sets" + }, + "firstNPages": { + "title": "First N Pages", + "placeholder": "Number of pages" + }, + "lastNPages": { + "title": "Last N Pages", + "placeholder": "Number of pages" + }, + "everyNthPage": { + "title": "Every Nth Page", + "placeholder": "Step size" + }, + "range": { + "title": "Range", + "fromPlaceholder": "From", + "toPlaceholder": "To" + }, + "keywords": { + "title": "Keywords" + }, + "advanced": { + "title": "Advanced" } }, "compressPdfs": { @@ -848,12 +1735,142 @@ "tags": "eltÃĄvolítÃĄs,tÃļrlÊs,Åąrlap,mező,írÃĄsvÊdett", "title": "ÍrÃĄsvÊdettsÊg eltÃĄvolítÃĄsa az Åąrlapmezőkről", "header": "PDF Åąrlapok feloldÃĄsa", - "submit": "EltÃĄvolítÃĄs" + "submit": "EltÃĄvolítÃĄs", + "description": "This tool will remove read-only restrictions from PDF form fields, making them editable and fillable.", + "filenamePrefix": "unlocked_forms", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst unlocking PDF forms." + }, + "results": { + "title": "Unlocked Forms Results" + } }, "changeMetadata": { - "tags": "Cím,szerző,dÃĄtum,lÊtrehozÃĄs,idő,kiadÃŗ,kÊszítő,statisztika", - "title": "Cím:", "header": "Metaadatok mÃŗdosítÃĄsa", + "submit": "MÃŗdosítÃĄs", + "filenamePrefix": "metadata", + "settings": { + "title": "Metadata Settings" + }, + "standardFields": { + "title": "Standard Fields" + }, + "deleteAll": { + "label": "Remove Existing Metadata", + "checkbox": "Delete all metadata" + }, + "title": { + "label": "Title", + "placeholder": "Document title" + }, + "author": { + "label": "Author", + "placeholder": "Document author" + }, + "subject": { + "label": "Subject", + "placeholder": "Document subject" + }, + "keywords": { + "label": "Keywords", + "placeholder": "Document keywords" + }, + "creator": { + "label": "Creator", + "placeholder": "Document creator" + }, + "producer": { + "label": "Producer", + "placeholder": "Document producer" + }, + "dates": { + "title": "Date Fields" + }, + "creationDate": { + "label": "Creation Date", + "placeholder": "Creation date" + }, + "modificationDate": { + "label": "Modification Date", + "placeholder": "Modification date" + }, + "trapped": { + "label": "Trapped Status", + "unknown": "Unknown", + "true": "True", + "false": "False" + }, + "advanced": { + "title": "Advanced Options" + }, + "customFields": { + "title": "Custom Metadata", + "description": "Add custom metadata fields to the document", + "add": "Add Field", + "key": "Key", + "keyPlaceholder": "Custom key", + "value": "Value", + "valuePlaceholder": "Custom value", + "remove": "Remove" + }, + "results": { + "title": "Updated PDFs" + }, + "error": { + "failed": "An error occurred while changing the PDF metadata." + }, + "tooltip": { + "header": { + "title": "PDF Metadata Overview" + }, + "standardFields": { + "title": "Standard Fields", + "text": "Common PDF metadata fields that describe the document.", + "bullet1": "Title: Document name or heading", + "bullet2": "Author: Person who created the document", + "bullet3": "Subject: Brief description of content", + "bullet4": "Keywords: Search terms for the document", + "bullet5": "Creator/Producer: Software used to create the PDF" + }, + "dates": { + "title": "Date Fields", + "text": "When the document was created and modified.", + "bullet1": "Creation Date: When original document was made", + "bullet2": "Modification Date: When last changed" + }, + "options": { + "title": "Additional Options", + "text": "Custom fields and privacy controls.", + "bullet1": "Custom Metadata: Add your own key-value pairs", + "bullet2": "Trapped Status: High-quality printing setting", + "bullet3": "Delete All: Remove all metadata for privacy" + }, + "deleteAll": { + "title": "Remove Existing Metadata", + "text": "Complete metadata deletion to ensure privacy." + }, + "customFields": { + "title": "Custom Metadata", + "text": "Add your own custom key-value metadata pairs.", + "bullet1": "Add any custom fields relevant to your document", + "bullet2": "Examples: Department, Project, Version, Status", + "bullet3": "Both key and value are required for each entry" + }, + "advanced": { + "title": "Advanced Options", + "trapped": { + "title": "Trapped Status", + "description": "Indicates if document is prepared for high-quality printing.", + "bullet1": "True: Document has been trapped for printing", + "bullet2": "False: Document has not been trapped", + "bullet3": "Unknown: Trapped status is not specified" + } + } + }, + "tags": "Cím,szerző,dÃĄtum,lÊtrehozÃĄs,idő,kiadÃŗ,kÊszítő,statisztika", "selectText": { "1": "MÃŗdosítsa a kívÃĄnt mezőket", "2": "Minden metaadat tÃļrlÊse", @@ -861,15 +1878,7 @@ "4": "EgyÊb metaadatok:", "5": "EgyÊni metaadat hozzÃĄadÃĄsa" }, - "author": "Szerző:", - "creationDate": "LÊtrehozÃĄs dÃĄtuma (yyyy/MM/dd HH:mm:ss):", - "creator": "LÊtrehozÃŗ:", - "keywords": "Kulcsszavak:", - "modDate": "MÃŗdosítÃĄs dÃĄtuma (yyyy/MM/dd HH:mm:ss):", - "producer": "KÊszítő:", - "subject": "TÃĄrgy:", - "trapped": "BeleÊrtve:", - "submit": "MÃŗdosítÃĄs" + "modDate": "MÃŗdosítÃĄs dÃĄtuma (yyyy/MM/dd HH:mm:ss):" }, "fileToPDF": { "tags": "ÃĄtalakítÃĄs,formÃĄtum,dokumentum,kÊp,prezentÃĄciÃŗ,szÃļveg,konvertÃĄlÃĄs,iroda,dokumentumok,word,excel,powerpoint", @@ -883,6 +1892,7 @@ "ocr": { "tags": "felismerÊs,szÃļveg,kÊp,szkennelÊs,olvasÃĄs,azonosítÃĄs,ÊszlelÊs,szerkeszthető", "title": "OCR / SzkennelÊs tisztítÃĄsa", + "desc": "Szkennelt dokumentumok tisztítÃĄsa Ês szÃļvegfelismerÊs kÊpekből, majd visszaadÃĄsa szerkeszthető szÃļvegkÊnt", "header": "SzkennelÊs tisztítÃĄsa / OCR (Optikai karakterfelismerÊs)", "selectText": { "1": "VÃĄlassza ki a PDF-ben felismerendő nyelveket (a felsoroltak jelenleg felismerhetők):", @@ -901,23 +1911,89 @@ "help": "KÊrjÃŧk, olvassa el ezt a dokumentÃĄciÃŗt mÃĄs nyelvek hasznÃĄlatÃĄrÃŗl Ês/vagy nem Docker kÃļrnyezetben valÃŗ hasznÃĄlatrÃŗl", "credit": "Ez a szolgÃĄltatÃĄs a qpdf Ês Tesseract OCR hasznÃĄlatÃĄval mÅąkÃļdik.", "submit": "PDF feldolgozÃĄsa OCR-rel", - "desc": "Szkennelt dokumentumok tisztítÃĄsa Ês szÃļvegfelismerÊs kÊpekből, majd visszaadÃĄsa szerkeszthető szÃļvegkÊnt", + "operation": { + "submit": "Process OCR and Review" + }, + "results": { + "title": "OCR Results" + }, + "languagePicker": { + "additionalLanguages": "Looking for additional languages?", + "viewSetupGuide": "View setup guide →" + }, "settings": { "title": "BeÃĄllítÃĄsok", "ocrMode": { - "label": "OCR mÃŗd" + "label": "OCR mÃŗd", + "auto": "Auto (skip text layers)", + "force": "Force (re-OCR all, replace text)", + "strict": "Strict (abort if text found)" }, "languages": { - "label": "Nyelvek" + "label": "Nyelvek", + "placeholder": "Select languages" + }, + "compatibilityMode": { + "label": "Compatibility Mode" + }, + "advancedOptions": { + "label": "Processing Options", + "sidecar": "Create a text file", + "deskew": "Deskew pages", + "clean": "Clean input file", + "cleanFinal": "Clean final output" } }, "tooltip": { + "header": { + "title": "OCR Settings Overview" + }, "mode": { - "title": "OCR mÃŗd" + "title": "OCR mÃŗd", + "text": "Optical Character Recognition (OCR) helps you turn scanned or screenshotted pages into text you can search, copy, or highlight.", + "bullet1": "Auto skips pages that already contain text layers.", + "bullet2": "Force re-OCRs every page and replaces all the text.", + "bullet3": "Strict halts if any selectable text is found." }, "languages": { - "title": "Nyelvek" + "title": "Nyelvek", + "text": "Improve OCR accuracy by specifying the expected languages. Choose one or more languages to guide detection." + }, + "output": { + "title": "Output", + "text": "Decide how you want the text output formatted:", + "bullet1": "Searchable PDF embeds text behind the original image.", + "bullet2": "HOCR XML returns a structured machine-readable file.", + "bullet3": "Plain-text sidecar creates a separate .txt file with raw content." + }, + "advanced": { + "header": { + "title": "Advanced OCR Processing" + }, + "compatibility": { + "title": "Compatibility Mode", + "text": "Uses OCR 'sandwich PDF' mode: results in larger files, but more reliable with certain languages and older PDF software. By default we use hOCR for smaller, modern PDFs." + }, + "sidecar": { + "title": "Create Text File", + "text": "Generates a separate .txt file alongside the PDF containing all extracted text content for easy access and processing." + }, + "deskew": { + "title": "Deskew Pages", + "text": "Automatically corrects skewed or tilted pages to improve OCR accuracy. Useful for scanned documents that weren't perfectly aligned." + }, + "clean": { + "title": "Clean Input File", + "text": "Preprocesses the input by removing noise, enhancing contrast, and optimising the image for better OCR recognition before processing." + }, + "cleanFinal": { + "title": "Clean Final Output", + "text": "Post-processes the final PDF by removing OCR artefacts and optimising the text layer for better readability and smaller file size." + } } + }, + "error": { + "failed": "OCR operation failed" } }, "extractImages": { @@ -926,7 +2002,13 @@ "header": "KÊpek kinyerÊse", "selectText": "VÃĄlassza ki a kinyert kÊpek konvertÃĄlÃĄsi formÃĄtumÃĄt", "allowDuplicates": "IsmÊtlődő kÊpek mentÊse", - "submit": "KinyerÊs" + "submit": "KinyerÊs", + "settings": { + "title": "Settings" + }, + "error": { + "failed": "An error occurred while extracting images from the PDF." + } }, "pdfToPDFA": { "tags": "archívum,hosszÃē tÃĄvÃē,szabvÃĄny,konvertÃĄlÃĄs,tÃĄrolÃĄs,megőrzÊs", @@ -998,17 +2080,53 @@ }, "info": "Python nincs telepítve. A futtatÃĄshoz szÃŧksÊges." }, + "scannerImageSplit": { + "title": "Extracted Images", + "submit": "Extract Image Scans", + "error": { + "failed": "An error occurred while extracting image scans." + }, + "tooltip": { + "title": "Photo Splitter", + "whatThisDoes": "What this does", + "whatThisDoesDesc": "Automatically finds and extracts each photo from a scanned page or composite image—no manual cropping.", + "whenToUse": "When to use", + "useCase1": "Scan whole album pages in one go", + "useCase2": "Split flatbed batches into separate files", + "useCase3": "Break collages into individual photos", + "useCase4": "Pull photos from documents", + "quickFixes": "Quick fixes", + "problem1": "Photos not detected → increase Tolerance to 30-50", + "problem2": "Too many false detections → increase Minimum Area to 15,000-20,000", + "problem3": "Crops are too tight → increase Border Size to 5-10", + "problem4": "Tilted photos not straightened → lower Angle Threshold to ~5°", + "problem5": "Dust/noise boxes → increase Minimum Contour Area to 1000-2000", + "setupTips": "Setup tips", + "tip1": "Use a plain, light background", + "tip2": "Leave a small gap (≈1 cm) between photos", + "tip3": "Scan at 300-600 DPI", + "tip4": "Clean the scanner glass", + "headsUp": "Heads-up", + "headsUpDesc": "Overlapping photos or backgrounds very close in colour to the photos can reduce accuracy-try a lighter or darker background and leave more space." + } + }, "sign": { - "tags": "hitelesítÊs,rÃļvidítÊs,rajzolt alÃĄÃ­rÃĄs,szÃļveges alÃĄÃ­rÃĄs,kÊpes alÃĄÃ­rÃĄs", "title": "AlÃĄÃ­rÃĄs", "header": "PDF-ek alÃĄÃ­rÃĄsa", "upload": "KÊp feltÃļltÊse", - "draw": "AlÃĄÃ­rÃĄs rajzolÃĄsa", - "text": "SzÃļveg bevitele", + "draw": { + "title": "Draw your signature", + "clear": "Clear" + }, + "text": { + "name": "Signer Name", + "placeholder": "Enter your full name" + }, "clear": "TÃļrlÊs", "add": "HozzÃĄadÃĄs", "saved": "Mentett alÃĄÃ­rÃĄsok", "save": "AlÃĄÃ­rÃĄs mentÊse", + "applySignatures": "Apply Signatures", "personalSigs": "SzemÊlyes alÃĄÃ­rÃĄsok", "sharedSigs": "Megosztott alÃĄÃ­rÃĄsok", "noSavedSigs": "Nincsenek mentett alÃĄÃ­rÃĄsok", @@ -1020,42 +2138,179 @@ "previous": "Előző oldal", "maintainRatio": "KÊparÃĄny fenntartÃĄsa vÃĄltÃĄsa", "undo": "VisszavonÃĄs", - "redo": "Újra" + "redo": "Újra", + "submit": "Sign Document", + "steps": { + "configure": "Configure Signature" + }, + "type": { + "title": "Signature Type", + "draw": "Draw", + "canvas": "Canvas", + "image": "Image", + "text": "Text" + }, + "image": { + "label": "Upload signature image", + "placeholder": "Select image file", + "hint": "Upload a PNG or JPG image of your signature" + }, + "instructions": { + "title": "How to add signature", + "canvas": "After drawing your signature in the canvas, close the modal then click anywhere on the PDF to place it.", + "image": "After uploading your signature image above, click anywhere on the PDF to place it.", + "text": "After entering your name above, click anywhere on the PDF to place your signature." + }, + "mode": { + "move": "Move Signature", + "place": "Place Signature" + }, + "updateAndPlace": "Update and Place", + "activate": "Activate Signature Placement", + "deactivate": "Stop Placing Signatures", + "results": { + "title": "Signature Results" + }, + "error": { + "failed": "An error occurred while signing the PDF." + }, + "tags": "hitelesítÊs,rÃļvidítÊs,rajzolt alÃĄÃ­rÃĄs,szÃļveges alÃĄÃ­rÃĄs,kÊpes alÃĄÃ­rÃĄs" }, "flatten": { - "tags": "statikus,deaktivÃĄlÃĄs,nem interaktív,egyszerÅąsítÊs", "title": "LapítÃĄs", "header": "PDF-ek lapítÃĄsa", "flattenOnlyForms": "Csak Åąrlapok lapítÃĄsa", "submit": "LapítÃĄs", + "filenamePrefix": "flattened", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, "steps": { "settings": "BeÃĄllítÃĄsok" }, "options": { - "flattenOnlyForms": "Csak Åąrlapok lapítÃĄsa" - } + "stepTitle": "Flatten Options", + "title": "Flatten Options", + "flattenOnlyForms": { + "label": "Csak Åąrlapok lapítÃĄsa", + "desc": "Only flatten form fields, leaving other interactive elements intact" + }, + "note": "Flattening removes interactive elements from the PDF, making them non-editable." + }, + "results": { + "title": "Flatten Results" + }, + "error": { + "failed": "An error occurred while flattening the PDF." + }, + "tooltip": { + "header": { + "title": "About Flattening PDFs" + }, + "description": { + "title": "What does flattening do?", + "text": "Flattening makes your PDF non-editable by turning fillable forms and buttons into regular text and images. The PDF will look exactly the same, but no one can change or fill in the forms anymore. Perfect for sharing completed forms, creating final documents for records, or ensuring the PDF looks the same everywhere.", + "bullet1": "Text boxes become regular text (can't be edited)", + "bullet2": "Checkboxes and buttons become pictures", + "bullet3": "Great for final versions you don't want changed", + "bullet4": "Ensures consistent appearance across all devices" + }, + "formsOnly": { + "title": "What does 'Flatten only forms' mean?", + "text": "This option only removes the ability to fill in forms, but keeps other features working like clicking links, viewing bookmarks, and reading comments.", + "bullet1": "Forms become non-editable", + "bullet2": "Links still work when clicked", + "bullet3": "Comments and notes remain visible", + "bullet4": "Bookmarks still help you navigate" + } + }, + "tags": "statikus,deaktivÃĄlÃĄs,nem interaktív,egyszerÅąsítÊs" }, "repair": { "tags": "javítÃĄs,helyreÃĄllítÃĄs,korrekciÃŗ,visszaÃĄllítÃĄs", "title": "JavítÃĄs", "header": "PDF-ek javítÃĄsa", - "submit": "JavítÃĄs" + "submit": "JavítÃĄs", + "description": "This tool will attempt to repair corrupted or damaged PDF files. No additional settings are required.", + "filenamePrefix": "repaired", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst repairing the PDF." + }, + "results": { + "title": "Repair Results" + } }, "removeBlanks": { - "tags": "tisztítÃĄs,egyszerÅąsítÊs,tartalommentes,rendszerezÊs", "title": "Üres oldalak eltÃĄvolítÃĄsa", "header": "Üres oldalak eltÃĄvolítÃĄsa", - "threshold": "Pixel fehÊrsÊg kÃŧszÃļbÊrtÊke:", + "settings": { + "title": "Settings" + }, + "threshold": { + "label": "Pixel Whiteness Threshold" + }, + "whitePercent": { + "label": "White Percentage Threshold", + "unit": "%" + }, + "includeBlankPages": { + "label": "Include detected blank pages" + }, + "tooltip": { + "header": { + "title": "Remove Blank Pages Settings" + }, + "threshold": { + "title": "Pixel Whiteness Threshold", + "text": "Controls how white a pixel must be to be considered 'white'. This helps determine what counts as a blank area on the page.", + "bullet1": "0 = Pure black (most restrictive)", + "bullet2": "128 = Medium grey", + "bullet3": "255 = Pure white (least restrictive)" + }, + "whitePercent": { + "title": "White Percentage Threshold", + "text": "Sets the minimum percentage of white pixels required for a page to be considered blank and removed.", + "bullet1": "Lower values (e.g., 80%) = More pages removed", + "bullet2": "Higher values (e.g., 95%) = Only very blank pages removed", + "bullet3": "Use higher values for documents with light backgrounds" + }, + "includeBlankPages": { + "title": "Include Detected Blank Pages", + "text": "When enabled, creates a separate PDF containing all the blank pages that were detected and removed from the original document.", + "bullet1": "Useful for reviewing what was removed", + "bullet2": "Helps verify the detection accuracy", + "bullet3": "Can be disabled to reduce output file size" + } + }, + "submit": "Üres oldalak eltÃĄvolítÃĄsa", + "error": { + "failed": "Failed to remove blank pages" + }, + "results": { + "title": "Removed Blank Pages" + }, + "tags": "tisztítÃĄs,egyszerÅąsítÊs,tartalommentes,rendszerezÊs", "thresholdDesc": "KÃŧszÃļbÊrtÊk annak meghatÃĄrozÃĄsÃĄhoz, hogy egy fehÊr pixel mennyire legyen fehÊr. 0 = fekete, 255 = tiszta fehÊr.", - "whitePercent": "FehÊr szÃĄzalÊk (%):", - "whitePercentDesc": "Az oldal hÃĄny szÃĄzalÊkÃĄnak kell 'fehÊr' pixelnek lennie az eltÃĄvolítÃĄshoz", - "submit": "Üres oldalak eltÃĄvolítÃĄsa" + "whitePercentDesc": "Az oldal hÃĄny szÃĄzalÊkÃĄnak kell 'fehÊr' pixelnek lennie az eltÃĄvolítÃĄshoz" }, "removeAnnotations": { "tags": "megjegyzÊsek,kiemelÊs,jegyzetek,jelÃļlÊsek,eltÃĄvolítÃĄs", "title": "MegjegyzÊsek eltÃĄvolítÃĄsa", "header": "MegjegyzÊsek eltÃĄvolítÃĄsa", - "submit": "EltÃĄvolítÃĄs" + "submit": "EltÃĄvolítÃĄs", + "settings": { + "title": "Settings" + }, + "info": { + "title": "About Remove Annotations", + "description": "This tool will remove all annotations (comments, highlights, notes, etc.) from your PDF documents." + }, + "error": { + "failed": "An error occurred while removing annotations from the PDF." + } }, "compare": { "tags": "kÃŧlÃļnbsÊg,kontraszt,vÃĄltozÃĄsok,elemzÊs", @@ -1087,6 +2342,142 @@ "certSign": { "tags": "hitelesítÊs,PEM,P12,hivatalos,titkosítÃĄs", "title": "TanÃēsítvÃĄnnyal alÃĄÃ­rÃĄs", + "filenamePrefix": "signed", + "signMode": { + "stepTitle": "Sign Mode", + "tooltip": { + "header": { + "title": "About PDF Signatures" + }, + "overview": { + "title": "How signatures work", + "text": "Both modes seal the document (any edits are flagged as tampering) and record who/when/how for auditing. Viewer trust depends on the certificate chain." + }, + "manual": { + "title": "Manual - Bring your certificate", + "text": "Use your own certificate files for brand-aligned identity. Can display Trusted when your CA/chain is recognised.", + "use": "Use for: customer-facing, legal, compliance." + }, + "auto": { + "title": "Auto - Zero-setup, instant system seal", + "text": "Signs with a server self-signed certificate. Same tamper-evident seal and audit trail; typically shows Unverified in viewers.", + "use": "Use when: you need speed and consistent internal identity across reviews and records." + }, + "rule": { + "title": "Rule of thumb", + "text": "Need recipient Trusted status? Manual. Need a fast, tamper-evident seal and audit trail with no setup? Auto." + } + } + }, + "certTypeStep": { + "stepTitle": "Certificate Format" + }, + "certFiles": { + "stepTitle": "Certificate Files" + }, + "appearance": { + "stepTitle": "Signature Appearance", + "tooltip": { + "header": { + "title": "About Signature Appearance" + }, + "invisible": { + "title": "Invisible Signatures", + "text": "The signature is added to the PDF for security but won't be visible when viewing the document. Perfect for legal requirements without changing the document's appearance.", + "bullet1": "Provides security without visual changes", + "bullet2": "Meets legal requirements for digital signing", + "bullet3": "Doesn't affect document layout or design" + }, + "visible": { + "title": "Visible Signatures", + "text": "Shows a signature block on the PDF with your name, date, and optional details. Useful when you want readers to clearly see the document is signed.", + "bullet1": "Shows signer name and date on the document", + "bullet2": "Can include reason and location for signing", + "bullet3": "Choose which page to place the signature", + "bullet4": "Optional logo can be included" + } + }, + "invisible": "Invisible", + "options": { + "title": "Signature Details" + }, + "visible": "Visible" + }, + "sign": { + "submit": "Sign PDF", + "results": "Signed PDF" + }, + "error": { + "failed": "An error occurred whilst processing signatures." + }, + "tooltip": { + "header": { + "title": "About Managing Signatures" + }, + "overview": { + "title": "What can this tool do?", + "text": "This tool lets you check if your PDFs are digitally signed and add new digital signatures. Digital signatures prove who created or approved a document and show if it has been changed since signing.", + "bullet1": "Check existing signatures and their validity", + "bullet2": "View detailed information about signers and certificates", + "bullet3": "Add new digital signatures to secure your documents", + "bullet4": "Multiple files supported with easy navigation" + }, + "validation": { + "title": "Checking Signatures", + "text": "When you check signatures, the tool tells you if they're valid, who signed the document, when it was signed, and whether the document has been changed since signing.", + "bullet1": "Shows if signatures are valid or invalid", + "bullet2": "Displays signer information and signing date", + "bullet3": "Checks if the document was modified after signing", + "bullet4": "Can use custom certificates for verification" + }, + "signing": { + "title": "Adding Signatures", + "text": "To sign a PDF, you need a digital certificate (like PEM, PKCS12, or JKS). You can choose to make the signature visible on the document or keep it invisible for security only.", + "bullet1": "Supports PEM, PKCS12, JKS, and server certificate formats", + "bullet2": "Option to show or hide signature on the PDF", + "bullet3": "Add reason, location, and signer name", + "bullet4": "Choose which page to place visible signatures", + "bullet5": "Use server certificate for simple 'Sign with Stirling-PDF' option" + } + }, + "certType": { + "tooltip": { + "header": { + "title": "About Certificate Types" + }, + "what": { + "title": "What's a certificate?", + "text": "It's a secure ID for your signature that proves you signed. Unless you're required to sign via certificate, we recommend using another secure method like Type, Draw, or Upload." + }, + "which": { + "title": "Which option should I use?", + "text": "Choose the format that matches your certificate file:", + "bullet1": "PKCS#12 (.p12 / .pfx) – one combined file (most common)", + "bullet2": "PFX (.pfx) – Microsoft's version of PKCS12", + "bullet3": "PEM – separate private-key and certificate .pem files", + "bullet4": "JKS – Java .jks keystore for dev / CI-CD workflows" + }, + "convert": { + "title": "Key not listed?", + "text": "Convert your file to a Java keystore (.jks) with keytool, then pick JKS." + } + } + }, + "chooseCertificate": "Choose Certificate File", + "chooseJksFile": "Choose JKS File", + "chooseP12File": "Choose PKCS12 File", + "choosePfxFile": "Choose PFX File", + "choosePrivateKey": "Choose Private Key File", + "location": "Hely", + "logoTitle": "Logo", + "name": "NÊv", + "noLogo": "No Logo", + "pageNumber": "Page Number", + "password": "Adja meg a kulcstÃĄr vagy privÃĄt kulcs jelszavÃĄt (ha van):", + "passwordOptional": "Leave empty if no password", + "reason": "Ok", + "serverCertMessage": "Using server certificate - no files or password required", + "showLogo": "LogÃŗ megjelenítÊse", "header": "PDF alÃĄÃ­rÃĄsa tanÃēsítvÃĄnnyal (fejlesztÊs alatt)", "selectPDF": "VÃĄlasszon alÃĄÃ­randÃŗ PDF fÃĄjlt:", "jksNote": "MegjegyzÊs: Ha a tanÃēsítvÃĄnytípusa nem szerepel a listÃĄban, konvertÃĄlja Java Keystore (.jks) formÃĄtumba a keytool parancssorral. EzutÃĄn vÃĄlassza a .jks fÃĄjl opciÃŗt.", @@ -1094,13 +2485,7 @@ "selectCert": "VÃĄlassza ki a tanÃēsítvÃĄny fÃĄjlt (X.509 formÃĄtum, .pem vagy .der):", "selectP12": "VÃĄlassza ki a PKCS#12 kulcstÃĄr fÃĄjlt (.p12 vagy .pfx) (OpcionÃĄlis, ha megadja, tartalmaznia kell a privÃĄt kulcsot Ês tanÃēsítvÃĄnyt):", "selectJKS": "VÃĄlassza ki a Java Keystore fÃĄjlt (.jks vagy .keystore):", - "certType": "TanÃēsítvÃĄny típusa", - "password": "Adja meg a kulcstÃĄr vagy privÃĄt kulcs jelszavÃĄt (ha van):", "showSig": "AlÃĄÃ­rÃĄs megjelenítÊse", - "reason": "Ok", - "location": "Hely", - "name": "NÊv", - "showLogo": "LogÃŗ megjelenítÊse", "submit": "PDF alÃĄÃ­rÃĄsa" }, "removeCertSign": { @@ -1108,7 +2493,18 @@ "title": "TanÃēsítvÃĄnyos alÃĄÃ­rÃĄs eltÃĄvolítÃĄsa", "header": "DigitÃĄlis tanÃēsítvÃĄny eltÃĄvolítÃĄsa a PDF-ből", "selectPDF": "PDF fÃĄjl kivÃĄlasztÃĄsa:", - "submit": "AlÃĄÃ­rÃĄs eltÃĄvolítÃĄsa" + "submit": "AlÃĄÃ­rÃĄs eltÃĄvolítÃĄsa", + "description": "This tool will remove digital certificate signatures from your PDF document.", + "filenamePrefix": "unsigned", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst removing certificate signatures." + }, + "results": { + "title": "Certificate Removal Results" + } }, "pageLayout": { "tags": "egyesítÊs,kompozit,egyoldalas nÊzet,rendszerezÊs", @@ -1116,16 +2512,157 @@ "header": "TÃļbboldalas elrendezÊs", "pagesPerSheet": "Oldalak laponkÊnt:", "addBorder": "Keret hozzÃĄadÃĄsa", - "submit": "KÃŧldÊs" + "submit": "KÃŧldÊs", + "desc": { + "2": "Place 2 pages side-by-side on a single sheet.", + "3": "Place 3 pages on a single sheet in a single row.", + "4": "Place 4 pages on a single sheet (2 × 2 grid).", + "9": "Place 9 pages on a single sheet (3 × 3 grid).", + "16": "Place 16 pages on a single sheet (4 × 4 grid)." + }, + "error": { + "failed": "An error occurred while creating the multi-page layout." + } + }, + "bookletImposition": { + "tags": "booklet,imposition,printing,binding,folding,signature", + "title": "Booklet Imposition", + "header": "Booklet Imposition", + "submit": "Create Booklet", + "spineLocation": { + "label": "Spine Location", + "left": "Left (Standard)", + "right": "Right (RTL)" + }, + "doubleSided": { + "label": "Double-sided printing", + "tooltip": "Creates both front and back sides for proper booklet printing" + }, + "manualDuplex": { + "title": "Manual Duplex Mode", + "instructions": "For printers without automatic duplex. You'll need to run this twice:" + }, + "duplexPass": { + "label": "Print Pass", + "first": "1st Pass", + "second": "2nd Pass", + "firstInstructions": "Prints front sides → stack face-down → run again with 2nd Pass", + "secondInstructions": "Load printed stack face-down → prints back sides" + }, + "rtlBinding": { + "label": "Right-to-left binding", + "tooltip": "For Arabic, Hebrew, or other right-to-left languages" + }, + "addBorder": { + "label": "Add borders around pages", + "tooltip": "Adds borders around each page section to help with cutting and alignment" + }, + "addGutter": { + "label": "Add gutter margin", + "tooltip": "Adds inner margin space for binding" + }, + "gutterSize": { + "label": "Gutter size (points)" + }, + "flipOnShortEdge": { + "label": "Flip on short edge (automatic duplex only)", + "tooltip": "Enable for short-edge duplex printing (automatic duplex only - ignored in manual mode)", + "manualNote": "Not needed in manual mode - you flip the stack yourself" + }, + "advanced": { + "toggle": "Advanced Options" + }, + "paperSizeNote": "Paper size is automatically derived from your first page.", + "tooltip": { + "header": { + "title": "Booklet Creation Guide" + }, + "description": { + "title": "What is Booklet Imposition?", + "text": "Creates professional booklets by arranging pages in the correct printing order. Your PDF pages are placed 2-up on landscape sheets so when folded and bound, they read in proper sequence like a real book." + }, + "example": { + "title": "Example: 8-Page Booklet", + "text": "Your 8-page document becomes 2 sheets:", + "bullet1": "Sheet 1 Front: Pages 8, 1 | Back: Pages 2, 7", + "bullet2": "Sheet 2 Front: Pages 6, 3 | Back: Pages 4, 5", + "bullet3": "When folded & stacked: Reads 1→2→3→4→5→6→7→8" + }, + "printing": { + "title": "How to Print & Assemble", + "text": "Follow these steps for perfect booklets:", + "bullet1": "Print double-sided with 'Flip on long edge'", + "bullet2": "Stack sheets in order, fold in half", + "bullet3": "Staple or bind along the folded spine", + "bullet4": "For short-edge printers: Enable 'Flip on short edge' option" + }, + "manualDuplex": { + "title": "Manual Duplex (Single-sided Printers)", + "text": "For printers without automatic duplex:", + "bullet1": "Turn OFF 'Double-sided printing'", + "bullet2": "Select '1st Pass' → Print → Stack face-down", + "bullet3": "Select '2nd Pass' → Load stack → Print backs", + "bullet4": "Fold and assemble as normal" + }, + "advanced": { + "title": "Advanced Options", + "text": "Fine-tune your booklet:", + "bullet1": "Right-to-Left Binding: For Arabic, Hebrew, or RTL languages", + "bullet2": "Borders: Shows cut lines for trimming", + "bullet3": "Gutter Margin: Adds space for binding/stapling", + "bullet4": "Short-edge Flip: Only for automatic duplex printers" + } + }, + "error": { + "failed": "An error occurred while creating the booklet imposition." + } }, "scalePages": { - "tags": "ÃĄtmÊretezÊs,mÃŗdosítÃĄs,dimenziÃŗ,igazítÃĄs", "title": "OldalmÊret beÃĄllítÃĄsa", "header": "OldalmÊret beÃĄllítÃĄsa", "pageSize": "A dokumentum oldalmÊrete.", "keepPageSize": "Eredeti mÊret", "scaleFactor": "Oldal nagyítÃĄsi szintje (vÃĄgÃĄs).", - "submit": "KÃŧldÊs" + "submit": "KÃŧldÊs", + "tags": "ÃĄtmÊretezÊs,mÃŗdosítÃĄs,dimenziÃŗ,igazítÃĄs" + }, + "adjustPageScale": { + "tags": "resize,modify,dimension,adapt", + "title": "Adjust Page Scale", + "header": "Adjust Page Scale", + "scaleFactor": { + "label": "Scale Factor" + }, + "pageSize": { + "label": "Target Page Size", + "keep": "Keep Original Size", + "letter": "Letter", + "legal": "Legal" + }, + "submit": "Adjust Page Scale", + "error": { + "failed": "An error occurred while adjusting the page scale." + }, + "tooltip": { + "header": { + "title": "Page Scale Settings Overview" + }, + "description": { + "title": "Description", + "text": "Adjust the size of PDF content and change the page dimensions." + }, + "scaleFactor": { + "title": "Scale Factor", + "text": "Controls how large or small the content appears on the page. Content is scaled and centred - if scaled content is larger than the page size, it may be cropped.", + "bullet1": "1.0 = Original size", + "bullet2": "0.5 = Half size (50% smaller)", + "bullet3": "2.0 = Double size (200% larger, may crop)" + }, + "pageSize": { + "title": "Target Page Size", + "text": "Sets the dimensions of the output PDF pages. 'Keep Original Size' maintains current dimensions, whilst other options resize to standard paper sizes." + } + } }, "add-page-numbers": { "tags": "szÃĄmozÃĄs,címke,rendszerezÊs,index" @@ -1134,16 +2671,83 @@ "tags": "automatikus felismerÊs,fejlÊc alapÃē,rendszerezÊs,ÃējracímkÊzÊs", "title": "Automatikus ÃĄtnevezÊs", "header": "PDF automatikus ÃĄtnevezÊse", - "submit": "Automatikus ÃĄtnevezÊs" + "description": "Automatically finds the title from your PDF content and uses it as the filename.", + "submit": "Automatikus ÃĄtnevezÊs", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst auto-renaming the PDF." + }, + "results": { + "title": "Auto-Rename Results" + }, + "tooltip": { + "header": { + "title": "How Auto-Rename Works" + }, + "howItWorks": { + "title": "Smart Renaming", + "text": "Automatically finds the title from your PDF content and uses it as the filename.", + "bullet1": "Looks for text that appears to be a title or heading", + "bullet2": "Creates a clean, valid filename from the detected title", + "bullet3": "Keeps the original name if no suitable title is found" + } + } }, "adjust-contrast": { "tags": "színkorrekciÃŗ,hangolÃĄs,mÃŗdosítÃĄs,javítÃĄs" }, "crop": { - "tags": "vÃĄgÃĄs,kicsinyítÊs,szerkesztÊs,forma", "title": "VÃĄgÃĄs", "header": "PDF vÃĄgÃĄsa", - "submit": "KÃŧldÊs" + "submit": "KÃŧldÊs", + "noFileSelected": "Select a PDF file to begin cropping", + "preview": { + "title": "Crop Area Selection" + }, + "reset": "Reset to full PDF", + "coordinates": { + "title": "Position and Size", + "x": { + "label": "X Position", + "desc": "Left edge (points)" + }, + "y": { + "label": "Y Position", + "desc": "Bottom edge (points)" + }, + "width": { + "label": "Width", + "desc": "Crop width (points)" + }, + "height": { + "label": "Height", + "desc": "Crop height (points)" + } + }, + "error": { + "invalidArea": "Crop area extends beyond PDF boundaries", + "failed": "Failed to crop PDF" + }, + "steps": { + "selectArea": "Select Crop Area" + }, + "tooltip": { + "title": "How to Crop PDFs", + "description": "Select the area to crop from your PDF by dragging and resizing the blue overlay on the thumbnail.", + "drag": "Drag the overlay to move the crop area", + "resize": "Drag the corner and edge handles to resize", + "precision": "Use coordinate inputs for precise positioning" + }, + "results": { + "title": "Crop Results" + }, + "automation": { + "info": "Enter crop coordinates in PDF points. Origin (0,0) is at bottom-left. These values will be applied to all PDFs processed in this automation.", + "reference": "Reference: A4 page is 595.28 × 841.89 points (210mm × 297mm). 1 inch = 72 points." + }, + "tags": "vÃĄgÃĄs,kicsinyítÊs,szerkesztÊs,forma" }, "autoSplitPDF": { "tags": "QR-alapÃē,szÊtvÃĄlasztÃĄs,szkennelt szekciÃŗ,rendszerezÊs", @@ -1226,24 +2830,124 @@ "downloadJS": "JavaScript letÃļltÊse", "submit": "MegjelenítÊs" }, - "autoRedact": { - "tags": "KitakarÃĄs,ElrejtÊs,fekete kitakarÃĄs,fekete,jelÃļlő,rejtett", - "title": "Automatikus kitakarÃĄs", - "header": "Automatikus kitakarÃĄs", - "colorLabel": "Szín", - "textsToRedactLabel": "KitakarandÃŗ szÃļvegek (soronkÊnt)", - "textsToRedactPlaceholder": "pÊldÃĄul \\nBizalmas \\nSzigorÃēan titkos", - "useRegexLabel": "RegulÃĄris kifejezÊs hasznÃĄlata", - "wholeWordSearchLabel": "Teljes szÃŗ keresÊse", - "customPaddingLabel": "Egyedi extra kitÃļltÊs", - "convertPDFToImageLabel": "PDF konvertÃĄlÃĄsa PDF-kÊppÊ (a doboz mÃļgÃļtti szÃļveg eltÃĄvolítÃĄsÃĄhoz)", - "submitButton": "KÃŧldÊs" - }, "redact": { "tags": "KitakarÃĄs,ElrejtÊs,fekete kitakarÃĄs,fekete,jelÃļlő,rejtett,kÊzi", "title": "KÊzi kitakarÃĄs", - "header": "KÊzi kitakarÃĄs", "submit": "KitakarÃĄs", + "error": { + "failed": "An error occurred while redacting the PDF." + }, + "modeSelector": { + "title": "Redaction Method", + "mode": "Mode", + "automatic": "Automatic", + "automaticDesc": "Redact text based on search terms", + "manual": "Manual", + "manualDesc": "Click and drag to redact specific areas", + "manualComingSoon": "Manual redaction coming soon" + }, + "auto": { + "header": "Auto Redact", + "settings": { + "title": "Redaction Settings", + "advancedTitle": "HaladÃŗ" + }, + "colorLabel": "Box Colour", + "wordsToRedact": { + "title": "Words to Redact", + "placeholder": "Enter a word", + "add": "HozzÃĄadÃĄs", + "examples": "Examples: Confidential, Top-Secret" + }, + "useRegexLabel": "Use Regex", + "wholeWordSearchLabel": "Whole Word Search", + "customPaddingLabel": "Custom Extra Padding", + "convertPDFToImageLabel": "Convert PDF to PDF-Image" + }, + "tooltip": { + "mode": { + "header": { + "title": "Redaction Method" + }, + "automatic": { + "title": "Automatic Redaction", + "text": "Automatically finds and redacts specified text throughout the document. Perfect for removing consistent sensitive information like names, addresses, or confidential markers." + }, + "manual": { + "title": "Manual Redaction", + "text": "Click and drag to manually select specific areas to redact. Gives you precise control over what gets redacted. (Coming soon)" + } + }, + "words": { + "header": { + "title": "Words to Redact" + }, + "description": { + "title": "Text Matching", + "text": "Enter words or phrases to find and redact in your document. Each word will be searched for separately." + }, + "bullet1": "Add one word at a time", + "bullet2": "Press Enter or click 'Add Another' to add", + "bullet3": "Click × to remove words", + "examples": { + "title": "Common Examples", + "text": "Typical words to redact include: bank details, email addresses, or specific names." + } + }, + "advanced": { + "header": { + "title": "Advanced Redaction Settings" + }, + "color": { + "title": "Box Colour & Padding", + "text": "Customise the appearance of redaction boxes. Black is standard, but you can choose any colour. Padding adds extra space around the found text." + }, + "regex": { + "title": "Use Regex", + "text": "Enable regular expressions for advanced pattern matching. Useful for finding phone numbers, emails, or complex patterns.", + "bullet1": "Example: \\d{4}-\\d{2}-\\d{2} to match any dates in YYYY-MM-DD format", + "bullet2": "Use with caution - test thoroughly" + }, + "wholeWord": { + "title": "Whole Word Search", + "text": "Only match complete words, not partial matches. 'John' won't match 'Johnson' when enabled." + }, + "convert": { + "title": "Convert to PDF-Image", + "text": "Converts the PDF to an image-based PDF after redaction. This ensures text behind redaction boxes is completely removed and unrecoverable." + } + } + }, + "manual": { + "header": "Manual Redaction", + "textBasedRedaction": "Text-based Redaction", + "pageBasedRedaction": "Page-based Redaction", + "convertPDFToImageLabel": "Convert PDF to PDF-Image (Used to remove text behind the box)", + "pageRedactionNumbers": { + "title": "Oldal", + "placeholder": "(pl. 1,2,8 vagy 4,7,12-16 vagy 2n-1)" + }, + "redactionColor": { + "title": "Redaction Colour" + }, + "export": "ExportÃĄlÃĄs", + "upload": "Upload", + "boxRedaction": "Box draw redaction", + "zoom": "Zoom", + "zoomIn": "Zoom in", + "zoomOut": "Zoom out", + "nextPage": "Next Page", + "previousPage": "Previous Page", + "toggleSidebar": "Toggle Sidebar", + "showThumbnails": "Show Thumbnails", + "showDocumentOutline": "Show Document Outline (double-click to expand/collapse all items)", + "showAttachments": "Show Attachments", + "showLayers": "Show Layers (double-click to reset all layers to the default state)", + "colourPicker": "Colour Picker", + "findCurrentOutlineItem": "Find current outline item", + "applyChanges": "Apply Changes" + }, + "header": "KÊzi kitakarÃĄs", "textBasedRedaction": "SzÃļveg alapÃē kitakarÃĄs", "pageBasedRedaction": "Oldal alapÃē kitakarÃĄs", "convertPDFToImageLabel": "PDF konvertÃĄlÃĄsa kÊppÊ (a doboz mÃļgÃļtti szÃļveg eltÃĄvolítÃĄsÃĄhoz)", @@ -1269,22 +2973,7 @@ "showLayers": "RÊtegek megjelenítÊse (dupla kattintÃĄs az Ãļsszes rÊteg alaphelyzetbe ÃĄllítÃĄsÃĄhoz)", "colourPicker": "SzínvÃĄlasztÃŗ", "findCurrentOutlineItem": "KeresÊs a jelenlegi vÃĄzlatban", - "applyChanges": "VÃĄltoztatÃĄsok mentÊse", - "auto": { - "settings": { - "advancedTitle": "HaladÃŗ" - }, - "wordsToRedact": { - "add": "HozzÃĄadÃĄs" - } - }, - "manual": { - "pageRedactionNumbers": { - "title": "Oldal", - "placeholder": "(pl. 1,2,8 vagy 4,7,12-16 vagy 2n-1)" - }, - "export": "ExportÃĄlÃĄs" - } + "applyChanges": "VÃĄltoztatÃĄsok mentÊse" }, "tableExtraxt": { "tags": "CSV,TÃĄblÃĄzat kinyerÊse,kinyerÊs,konvertÃĄlÃĄs" @@ -1295,11 +2984,15 @@ "overlay-pdfs": { "tags": "ÁtfedÊs", "header": "PDF-ek egymÃĄsra helyezÊse", + "title": "Overlay PDFs", + "desc": "Overlay one PDF on top of another", "baseFile": { "label": "VÃĄlassza ki az alap PDF fÃĄjlt" }, "overlayFiles": { - "label": "VÃĄlassza ki a rÃĄhelyezendő PDF fÃĄjlokat" + "label": "VÃĄlassza ki a rÃĄhelyezendő PDF fÃĄjlokat", + "placeholder": "Choose PDF(s)...", + "addMore": "Add more PDFs..." }, "mode": { "label": "VÃĄlassza ki az egymÃĄsra helyezÊs mÃŗdjÃĄt", @@ -1309,14 +3002,53 @@ }, "counts": { "label": "IsmÊtlÊsek szÃĄma (rÃļgzített ismÊtlődő mÃŗdhoz)", - "placeholder": "Adja meg a vesszővel elvÃĄlasztott szÃĄmokat (pl. 2,3,1)" + "placeholder": "Adja meg a vesszővel elvÃĄlasztott szÃĄmokat (pl. 2,3,1)", + "item": "Count for file", + "noFiles": "Add overlay files to configure counts" }, "position": { "label": "VÃĄlassza ki az egymÃĄsra helyezÊs pozíciÃŗjÃĄt", "foreground": "ElőtÊr", "background": "HÃĄttÊr" }, - "submit": "KÃŧldÊs" + "submit": "KÃŧldÊs", + "settings": { + "title": "Settings" + }, + "results": { + "title": "Overlay Results" + }, + "tooltip": { + "header": { + "title": "Overlay PDFs Overview" + }, + "description": { + "title": "Description", + "text": "Combine a base PDF with one or more overlay PDFs. Overlays can be applied page-by-page in different modes and placed in the foreground or background." + }, + "mode": { + "title": "Overlay Mode", + "text": "Choose how to distribute overlay pages across the base PDF pages.", + "sequential": "Sequential Overlay: Use pages from the first overlay PDF until it ends, then move to the next.", + "interleaved": "Interleaved Overlay: Take one page from each overlay in turn.", + "fixedRepeat": "Fixed Repeat Overlay: Take a set number of pages from each overlay before moving to the next. Use Counts to set the numbers." + }, + "position": { + "title": "Overlay Position", + "text": "Foreground places the overlay on top of the page. Background places it behind." + }, + "overlayFiles": { + "title": "Overlay Files", + "text": "Select one or more PDFs to overlay on the base. The order of these files affects how pages are applied in Sequential and Fixed Repeat modes." + }, + "counts": { + "title": "Counts (Fixed Repeat only)", + "text": "Provide a positive number for each overlay file showing how many pages to take before moving to the next. Required when mode is Fixed Repeat." + } + }, + "error": { + "failed": "An error occurred while overlaying PDFs." + } }, "split-by-sections": { "tags": "Szakaszos felosztÃĄs,FelosztÃĄs,TestreszabÃĄs", @@ -1337,6 +3069,7 @@ "tags": "PecsÊt,KÊp hozzÃĄadÃĄsa,kÃļzÊpre igazítÃĄs,Vízjel,PDF,BeÃĄgyazÃĄs,TestreszabÃĄs", "header": "PDF pecsÊtelÊse", "title": "PDF pecsÊtelÊse", + "stampSetup": "Stamp Setup", "stampType": "PecsÊt típusa", "stampText": "PecsÊt szÃļvege", "stampImage": "PecsÊt kÊpe", @@ -1349,7 +3082,19 @@ "overrideY": "Y koordinÃĄta felÃŧlírÃĄsa", "customMargin": "Egyedi margÃŗ", "customColor": "Egyedi szÃļvegszín", - "submit": "KÃŧldÊs" + "submit": "KÃŧldÊs", + "noStampSelected": "No stamp selected. Return to Step 1.", + "customPosition": "Drag the stamp to the desired location in the preview window.", + "error": { + "failed": "An error occurred while adding stamp to the PDF." + }, + "imageSize": "Image Size", + "margin": "Margin", + "positionAndFormatting": "Position & Formatting", + "quickPosition": "Select a position on the page to place the stamp.", + "results": { + "title": "Stamp Results" + } }, "removeImagePdf": { "tags": "KÊpek eltÃĄvolítÃĄsa,OldalmÅąveletek,Backend,szerver oldali" @@ -1367,7 +3112,8 @@ "status": { "_value": "Állapot", "valid": "ÉrvÊnyes", - "invalid": "ÉrvÊnytelen" + "invalid": "ÉrvÊnytelen", + "complete": "Validation complete" }, "signer": "AlÃĄÃ­rÃŗ", "date": "DÃĄtum", @@ -1394,40 +3140,122 @@ "version": "VerziÃŗ", "keyUsage": "KulcshasznÃĄlat", "selfSigned": "ÖnalÃĄÃ­rt", - "bits": "bit" + "bits": "bit", + "details": "Certificate Details" }, "signature": { "info": "AlÃĄÃ­rÃĄs informÃĄciÃŗ", "_value": "AlÃĄÃ­rÃĄs", "mathValid": "Az alÃĄÃ­rÃĄs matematikailag ÊrvÊnyes, DE:" }, - "selectCustomCert": "EgyÊni X.509 tanÃēsítvÃĄnyfÃĄjl (OpcionÃĄlis)" - }, - "replace-color": { - "title": "Színcsere-InvertÃĄlÃĄs", - "header": "PDF színek cserÊje-invertÃĄlÃĄsa", - "selectText": { - "1": "Színcsere vagy -invertÃĄlÃĄs beÃĄllítÃĄsai", - "2": "AlapÊrtelmezett (AlapÊrtelmezett kontrasztos színek)", - "3": "EgyÊni (EgyÊni színek)", - "4": "Teljes invertÃĄlÃĄs (Minden szín invertÃĄlÃĄsa)", - "5": "Magas kontrasztÃē színbeÃĄllítÃĄsok", - "6": "fehÊr szÃļveg fekete hÃĄttÊren", - "7": "fekete szÃļveg fehÊr hÃĄttÊren", - "8": "sÃĄrga szÃļveg fekete hÃĄttÊren", - "9": "zÃļld szÃļveg fekete hÃĄttÊren", - "10": "SzÃļvegszín kivÃĄlasztÃĄsa", - "11": "HÃĄttÊrszín kivÃĄlasztÃĄsa" + "selectCustomCert": "EgyÊni X.509 tanÃēsítvÃĄnyfÃĄjl (OpcionÃĄlis)", + "downloadCsv": "Download CSV", + "downloadJson": "Download JSON", + "downloadPdf": "Download PDF Report", + "downloadType": { + "csv": "CSV", + "json": "JSON", + "pdf": "PDF" }, - "submit": "Csere" + "error": { + "allFailed": "Unable to validate the selected files.", + "partial": "Some files could not be validated.", + "reportGeneration": "Could not generate the PDF report. JSON and CSV are available.", + "unexpected": "Unexpected error during validation." + }, + "finalizing": "Preparing downloads...", + "issue": { + "certExpired": "Certificate expired", + "certRevocationUnknown": "Certificate revocation status unknown", + "certRevoked": "Certificate revoked", + "chainInvalid": "Certificate chain invalid", + "signatureInvalid": "Signature cryptographic check failed", + "trustInvalid": "Certificate not trusted" + }, + "noResults": "Run the validation to generate a report.", + "noSignaturesShort": "No signatures", + "processing": "Validating signatures...", + "report": { + "continued": "Continued", + "downloads": "Downloads", + "entryLabel": "Signature Summary", + "fields": { + "created": "Created", + "fileSize": "File Size", + "signatureCount": "Total Signatures", + "signatureDate": "Signature Date" + }, + "filesEvaluated": "{{count}} files evaluated", + "footer": "Validated via Stirling PDF", + "generatedAt": "Generated", + "noPdf": "PDF report will be available after a successful validation.", + "page": "Page", + "shortTitle": "Signature Summary", + "signatureCountLabel": "{{count}} signatures", + "signaturesFound": "{{count}} signatures detected", + "signaturesValid": "{{count}} fully valid", + "title": "Signature Validation Report" + }, + "settings": { + "certHint": "Upload a trusted X.509 certificate to validate against a custom trust source.", + "title": "Validation Settings" + }, + "signatureDate": "Signature Date", + "totalSignatures": "Total Signatures" }, - "replaceColorPdf": { - "tags": "Színcsere,OldalmÅąveletek,Backend,szerver oldali" + "replaceColor": { + "tags": "Replace Colour,Page operations,Back end,server side", + "labels": { + "settings": "Settings", + "colourOperation": "Colour operation" + }, + "options": { + "highContrast": "High contrast", + "invertAll": "Invert all colours", + "custom": "Custom", + "cmyk": "Convert to CMYK" + }, + "tooltip": { + "header": { + "title": "Replace & Invert Colour Settings Overview" + }, + "description": { + "title": "Description", + "text": "Transform PDF colours to improve readability and accessibility. Choose from high contrast presets, invert all colours, or create custom colour schemes." + }, + "highContrast": { + "title": "High Contrast", + "text": "Apply predefined high contrast colour combinations designed for better readability and accessibility compliance.", + "bullet1": "White text on black background - Classic dark mode", + "bullet2": "Black text on white background - Standard high contrast", + "bullet3": "Yellow text on black background - High visibility option", + "bullet4": "Green text on black background - Alternative high contrast" + }, + "invertAll": { + "title": "Invert All Colours", + "text": "Completely invert all colours in the PDF, creating a negative-like effect. Useful for creating dark mode versions of documents or reducing eye strain in low-light conditions." + }, + "custom": { + "title": "Custom Colours", + "text": "Define your own text and background colours using the colour pickers. Perfect for creating branded documents or specific accessibility requirements.", + "bullet1": "Text colour - Choose the colour for text elements", + "bullet2": "Background colour - Set the background colour for the document" + }, + "cmyk": { + "title": "Convert to CMYK", + "text": "Convert the PDF from RGB colour space to CMYK colour space, optimized for professional printing. This process converts colours to the Cyan, Magenta, Yellow, Black model used by printers." + } + }, + "error": { + "failed": "An error occurred while processing the colour replacement." + } }, "login": { "title": "BejelentkezÊs", "header": "BejelentkezÊs", "signin": "BejelentkezÊs", + "signInWith": "Sign in with", + "signInAnonymously": "Sign Up as a Guest", "rememberme": "EmlÊkezzen rÃĄm", "invalid": "ÉrvÊnytelen felhasznÃĄlÃŗnÊv vagy jelszÃŗ.", "locked": "A fiÃŗkja zÃĄrolva van.", @@ -1446,12 +3274,83 @@ "alreadyLoggedIn": "MÃĄr be van jelentkezve", "alreadyLoggedIn2": "eszkÃļzÃļn. KÊrjÃŧk, jelentkezzen ki az eszkÃļzÃļkről Ês prÃŗbÃĄlja Ãējra.", "toManySessions": "TÃēl sok aktív munkamenet", - "logoutMessage": "Sikeresen kijelentkezett." + "logoutMessage": "Sikeresen kijelentkezett.", + "youAreLoggedIn": "You are logged in!", + "email": "Email", + "password": "Password", + "enterEmail": "Enter your email", + "enterPassword": "Enter your password", + "loggingIn": "Logging In...", + "username": "Username", + "enterUsername": "Enter username", + "useEmailInstead": "Login with email", + "forgotPassword": "Forgot your password?", + "logIn": "Log In", + "signingIn": "Signing in...", + "login": "Login", + "or": "Or", + "useMagicLink": "Use magic link instead", + "enterEmailForMagicLink": "Enter your email for magic link", + "sending": "Sendingâ€Ļ", + "sendMagicLink": "Send Magic Link", + "cancel": "Cancel", + "dontHaveAccount": "Don't have an account? Sign up", + "home": "Home", + "debug": "Debug", + "signOut": "Sign Out", + "pleaseEnterBoth": "Please enter both email and password", + "pleaseEnterEmail": "Please enter your email address", + "magicLinkSent": "Magic link sent to {{email}}! Check your email and click the link to sign in.", + "passwordResetSent": "Password reset link sent to {{email}}! Check your email and follow the instructions.", + "failedToSignIn": "Failed to sign in with {{provider}}: {{message}}", + "unexpectedError": "Unexpected error: {{message}}", + "accountCreatedSuccess": "Account created successfully! You can now sign in.", + "passwordChangedSuccess": "Password changed successfully! Please sign in with your new password.", + "credentialsUpdated": "Your credentials have been updated. Please sign in again." + }, + "signup": { + "title": "Create an account", + "subtitle": "Join Stirling PDF to get started", + "name": "Name", + "email": "Email", + "password": "Password", + "confirmPassword": "Confirm password", + "enterName": "Enter your name", + "enterEmail": "Enter your email", + "enterPassword": "Enter your password", + "confirmPasswordPlaceholder": "Confirm password", + "or": "or", + "creatingAccount": "Creating Account...", + "signUp": "Sign Up", + "alreadyHaveAccount": "Already have an account? Sign in", + "pleaseFillAllFields": "Please fill in all fields", + "passwordsDoNotMatch": "Passwords do not match", + "passwordTooShort": "Password must be at least 6 characters long", + "invalidEmail": "Please enter a valid email address", + "checkEmailConfirmation": "Check your email for a confirmation link to complete your registration.", + "accountCreatedSuccessfully": "Account created successfully! You can now sign in.", + "unexpectedError": "Unexpected error: {{message}}", + "useEmailInstead": "Use Email Instead", + "nameRequired": "Name is required", + "emailRequired": "Email is required", + "passwordRequired": "Password is required", + "confirmPasswordRequired": "Please confirm your password" }, "pdfToSinglePage": { "title": "PDF egyoldalassÃĄ alakítÃĄsa", "header": "PDF egyoldalassÃĄ alakítÃĄsa", - "submit": "KonvertÃĄlÃĄs egyoldalassÃĄ" + "submit": "KonvertÃĄlÃĄs egyoldalassÃĄ", + "description": "This tool will merge all pages of your PDF into one large single page. The width will remain the same as the original pages, but the height will be the sum of all page heights.", + "filenamePrefix": "single_page", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst converting to single page." + }, + "results": { + "title": "Single Page Results" + } }, "pageExtracter": { "title": "Oldalak kinyerÊse", @@ -1475,18 +3374,59 @@ "adjustContrast": { "title": "Kontraszt beÃĄllítÃĄsa", "header": "Kontraszt beÃĄllítÃĄsa", + "basic": "Basic Adjustments", "contrast": "Kontraszt:", "brightness": "FÊnyerő:", "saturation": "TelítettsÊg:", - "download": "LetÃļltÊs" + "download": "LetÃļltÊs", + "adjustColors": "Adjust Colors", + "blue": "Blue", + "confirm": "Confirm", + "error": { + "failed": "Failed to adjust colors/contrast" + }, + "green": "Green", + "noPreview": "Select a PDF to preview", + "red": "Red", + "results": { + "title": "Adjusted PDF" + } }, "compress": { "title": "TÃļmÃļrítÊs", + "desc": "Compress PDFs to reduce their file size.", "header": "PDF tÃļmÃļrítÊse", + "method": { + "title": "Compression Method", + "quality": "Quality", + "filesize": "FÃĄjlmÊret" + }, "credit": "Ez a szolgÃĄltatÃĄs a qpdf hasznÃĄlatÃĄval vÊgzi a PDF tÃļmÃļrítÊsÊt/optimalizÃĄlÃĄsÃĄt.", "grayscale": { "label": "SzÃŧrkeÃĄrnyalatok alkalmazÃĄsa tÃļmÃļrítÊshez" }, + "tooltip": { + "header": { + "title": "Compress Settings Overview" + }, + "description": { + "title": "Description", + "text": "Compression is an easy way to reduce your file size. Pick File Size to enter a target size and have us adjust quality for you. Pick Quality to set compression strength manually." + }, + "qualityAdjustment": { + "title": "Quality Adjustment", + "text": "Drag the slider to adjust the compression strength. Lower values (1-3) preserve quality but result in larger files. Higher values (7-9) shrink the file more but reduce image clarity.", + "bullet1": "Lower values preserve quality", + "bullet2": "Higher values reduce file size" + }, + "grayscale": { + "title": "Grayscale", + "text": "Select this option to convert all images to black and white, which can significantly reduce file size especially for scanned PDFs or image-heavy documents." + } + }, + "error": { + "failed": "An error occurred while compressing the PDF." + }, "selectText": { "1": { "_value": "TÃļmÃļrítÊsi beÃĄllítÃĄsok", @@ -1496,10 +3436,7 @@ "4": "Automatikus mÃŗd - Automatikusan ÃĄllítja a minősÊget a megadott PDF mÊret elÊrÊsÊhez", "5": "KívÃĄnt PDF mÊret (pl. 25MB, 10.8MB, 25KB)" }, - "submit": "TÃļmÃļrítÊs", - "method": { - "filesize": "FÃĄjlmÊret" - } + "submit": "TÃļmÃļrítÊs" }, "decrypt": { "passwordPrompt": "Ez a fÃĄjl jelszÃŗval vÊdett. KÊrjÃŧk, adja meg a jelszÃŗt:", @@ -1600,7 +3537,13 @@ "title": "KÊp eltÃĄvolítÃĄsa", "header": "KÊp eltÃĄvolítÃĄsa", "removeImage": "KÊp eltÃĄvolítÃĄsa", - "submit": "KÊp eltÃĄvolítÃĄsa" + "submit": "KÊp eltÃĄvolítÃĄsa", + "error": { + "failed": "Failed to remove images from the PDF." + }, + "results": { + "title": "Remove Images Results" + } }, "splitByChapters": { "title": "PDF felosztÃĄsa fejezetek szerint", @@ -1634,6 +3577,12 @@ }, "note": "A kiadÃĄsi jegyzetek csak angol nyelven Êrhetők el" }, + "swagger": { + "title": "API Documentation", + "header": "API Documentation", + "desc": "View and test the Stirling PDF API endpoints", + "tags": "api,documentation,swagger,endpoints,development" + }, "cookieBanner": { "popUp": { "title": "Hogy hasznÃĄljuk a sÃŧtiket", @@ -1669,54 +3618,943 @@ "title": "AdatelemzÊsek", "description": "Ezek a sÃŧtik segítenek megÊrteni, hogyan hasznÃĄljÃĄk eszkÃļzeinket, így a kÃļzÃļssÊgÃŧnk ÃĄltal leginkÃĄbb ÊrtÊkelt funkciÃŗkra Ãļsszpontosíthatunk. Nyugodt lehet-a Stirling PDF nem kÊpes Ês soha nem is fog nyomon kÃļvetni az Ön ÃĄltal hasznÃĄlt dokumentumok tartalmÃĄt." } + }, + "services": { + "posthog": "PostHog Analytics", + "scarf": "Scarf Pixel" } }, - "download": "LetÃļltÊs", - "undo": "VisszavonÃĄs", - "convert": { - "title": "KonvertÃĄlÃĄs", - "settings": "BeÃĄllítÃĄsok", - "color": "Szín", - "greyscale": "SzÃŧrkeÃĄrnyalatos", - "fillPage": "Oldal kitÃļltÊse", - "pdfaDigitalSignatureWarning": "A PDF digitÃĄlis alÃĄÃ­rÃĄst tartalmaz. Ez a kÃļvetkező lÊpÊsben eltÃĄvolítÃĄsra kerÃŧl.", - "grayscale": "SzÃŧrkeÃĄrnyalatos" + "removeMetadata": { + "submit": "Remove Metadata" }, - "attachments": { - "tags": "beÃĄgyazÃĄs,csatolÃĄs,fÃĄjl,csatolmÃĄny,csatolmÃĄnyok", - "title": "MellÊkletek hozzÃĄadÃĄsa", - "header": "MellÊkletek hozzÃĄadÃĄsa", - "submit": "CsatolmÃĄnyok hozzÃĄadÃĄsa a PDF-hez" + "sidebar": { + "toggle": "Toggle Sidebar" + }, + "theme": { + "toggle": "Toggle Theme" + }, + "view": { + "viewer": "Viewer", + "pageEditor": "Page Editor", + "fileManager": "File Manager" + }, + "pageEditor": { + "title": "Page Editor", + "save": "Save Changes", + "noPdfLoaded": "No PDF loaded. Please upload a PDF to edit.", + "rotatedLeft": "Rotated left:", + "rotatedRight": "Rotated right:", + "deleted": "Deleted:", + "movedLeft": "Moved left:", + "movedRight": "Moved right:", + "splitAt": "Split at:", + "insertedPageBreak": "Inserted page break at:", + "addFileNotImplemented": "Add file not implemented in demo", + "closePdf": "Close PDF", + "reset": "Reset Changes", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "fitToWidth": "Fit to Width", + "actualSize": "Actual Size" + }, + "viewer": { + "firstPage": "First Page", + "lastPage": "Last Page", + "previousPage": "Previous Page", + "nextPage": "Next Page", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "singlePageView": "Single Page View", + "dualPageView": "Dual Page View" }, "rightRail": { + "closeSelected": "Close Selected Files", "selectAll": "Összes kijelÃļlÊse", - "deselectAll": "KijelÃļlÊs megszÃŧntetÊse" + "deselectAll": "KijelÃļlÊs megszÃŧntetÊse", + "selectByNumber": "Select by Page Numbers", + "deleteSelected": "Delete Selected Pages", + "closePdf": "Close PDF", + "exportAll": "Export PDF", + "downloadSelected": "Download Selected Files", + "downloadAll": "Download All", + "toggleTheme": "Toggle Theme", + "language": "Language", + "search": "Search PDF", + "panMode": "Pan Mode", + "rotateLeft": "Rotate Left", + "rotateRight": "Rotate Right", + "toggleSidebar": "Toggle Sidebar", + "exportSelected": "Export Selected Pages", + "toggleAnnotations": "Toggle Annotations Visibility", + "annotationMode": "Toggle Annotation Mode", + "draw": "Draw", + "save": "Save" + }, + "search": { + "title": "Search PDF", + "placeholder": "Enter search term...", + "noResults": "No results found", + "searching": "Searching..." + }, + "guestBanner": { + "title": "You're using Stirling PDF as a guest!", + "message": "Create a free account to save your work, access more features, and support the project.", + "dismiss": "Dismiss banner", + "signUp": "Sign Up Free" + }, + "toolPicker": { + "searchPlaceholder": "Search tools...", + "noToolsFound": "No tools found", + "allTools": "ALL TOOLS", + "quickAccess": "QUICK ACCESS", + "categories": { + "standardTools": "Standard Tools", + "advancedTools": "Advanced Tools", + "recommendedTools": "Recommended Tools" + }, + "subcategories": { + "signing": "Signing", + "documentSecurity": "Document Security", + "verification": "Verification", + "documentReview": "Document Review", + "pageFormatting": "Page Formatting", + "extraction": "Extraction", + "removal": "Removal", + "automation": "Automation", + "general": "General", + "advancedFormatting": "Advanced Formatting", + "developerTools": "Developer Tools" + } }, "quickAccess": { - "sign": "AlÃĄÃ­rÃĄs" + "read": "Read", + "sign": "AlÃĄÃ­rÃĄs", + "automate": "Automate", + "files": "Files", + "activity": "Activity", + "help": "Help", + "account": "Account", + "config": "Config", + "adminSettings": "Admin Settings", + "allTools": "All Tools" + }, + "admin": { + "error": "Error", + "success": "Success", + "expand": "Expand", + "close": "Close", + "status": { + "active": "Active", + "inactive": "Inactive" + }, + "settings": { + "title": "Admin Settings", + "workspace": "Workspace", + "fetchError": "Failed to load settings", + "saveError": "Failed to save settings", + "saved": "Settings saved successfully", + "saveSuccess": "Settings saved successfully", + "save": "Save Changes", + "restartRequired": "Restart Required", + "restart": { + "title": "Restart Required", + "message": "Settings have been saved successfully. A server restart is required for the changes to take effect.", + "question": "Would you like to restart the server now or later?", + "now": "Restart Now", + "later": "Restart Later" + }, + "restarting": "Restarting Server", + "restartingMessage": "The server is restarting. Please wait a moment...", + "restartError": "Failed to restart server. Please restart manually.", + "general": { + "title": "System Settings", + "description": "Configure system-wide application settings including branding and default behaviour.", + "ui": "User Interface", + "system": "System", + "appName": { + "label": "Application Name", + "description": "The name displayed in the browser tab and home page" + }, + "appNameNavbar": { + "label": "Navbar Brand", + "description": "The name displayed in the navigation bar" + }, + "homeDescription": { + "label": "Home Description", + "description": "The description text shown on the home page" + }, + "defaultLocale": { + "label": "Default Locale", + "description": "The default language for new users (e.g., en_US, es_ES)" + }, + "fileUploadLimit": { + "label": "File Upload Limit", + "description": "Maximum file upload size (e.g., 100MB, 1GB)" + }, + "showUpdate": { + "label": "Show Update Notifications", + "description": "Display notifications when a new version is available" + }, + "showUpdateOnlyAdmin": { + "label": "Show Updates to Admins Only", + "description": "Restrict update notifications to admin users only" + }, + "customHTMLFiles": { + "label": "Custom HTML Files", + "description": "Allow serving custom HTML files from the customFiles directory" + }, + "languages": { + "label": "Available Languages", + "description": "Languages that users can select from (leave empty to enable all languages)" + }, + "customMetadata": { + "label": "Custom Metadata", + "autoUpdate": { + "label": "Auto Update Metadata", + "description": "Automatically update PDF metadata on all processed documents" + }, + "author": { + "label": "Default Author", + "description": "Default author for PDF metadata (e.g., username)" + }, + "creator": { + "label": "Default Creator", + "description": "Default creator for PDF metadata" + }, + "producer": { + "label": "Default Producer", + "description": "Default producer for PDF metadata" + } + }, + "customPaths": { + "label": "Custom Paths", + "description": "Configure custom file system paths for pipeline processing and external tools", + "pipeline": { + "label": "Pipeline Directories", + "watchedFoldersDir": { + "label": "Watched Folders Directory", + "description": "Directory where pipeline monitors for incoming PDFs (leave empty for default: /pipeline/watchedFolders)" + }, + "finishedFoldersDir": { + "label": "Finished Folders Directory", + "description": "Directory where processed PDFs are outputted (leave empty for default: /pipeline/finishedFolders)" + } + }, + "operations": { + "label": "External Tool Paths", + "weasyprint": { + "label": "WeasyPrint Executable", + "description": "Path to WeasyPrint executable for HTML to PDF conversion (leave empty for default: /opt/venv/bin/weasyprint)" + }, + "unoconvert": { + "label": "Unoconvert Executable", + "description": "Path to LibreOffice unoconvert for document conversions (leave empty for default: /opt/venv/bin/unoconvert)" + } + } + } + }, + "security": { + "title": "Security", + "description": "Configure authentication, login behaviour, and security policies.", + "ssoNotice": { + "title": "Looking for SSO/SAML settings?", + "message": "OAuth2 and SAML2 authentication providers have been moved to the Connections menu for easier management." + }, + "authentication": "Authentication", + "enableLogin": { + "label": "Enable Login", + "description": "Require users to log in before accessing the application" + }, + "loginMethod": { + "label": "Login Method", + "description": "The authentication method to use for user login", + "all": "All Methods", + "normal": "Username/Password Only", + "oauth2": "OAuth2 Only", + "saml2": "SAML2 Only" + }, + "loginAttemptCount": { + "label": "Login Attempt Limit", + "description": "Maximum number of failed login attempts before account lockout" + }, + "loginResetTimeMinutes": { + "label": "Login Reset Time (minutes)", + "description": "Time before failed login attempts are reset" + }, + "csrfDisabled": { + "label": "Disable CSRF Protection", + "description": "Disable Cross-Site Request Forgery protection (not recommended)" + }, + "initialLogin": { + "label": "Initial Login", + "username": { + "label": "Initial Username", + "description": "The username for the initial admin account" + }, + "password": { + "label": "Initial Password", + "description": "The password for the initial admin account" + } + }, + "jwt": { + "label": "JWT Configuration", + "secureCookie": { + "label": "Secure Cookie", + "description": "Require HTTPS for JWT cookies (recommended for production)" + }, + "keyRetentionDays": { + "label": "Key Retention Days", + "description": "Number of days to retain old JWT keys for verification" + }, + "persistence": { + "label": "Enable Key Persistence", + "description": "Store JWT keys persistently to survive server restarts" + }, + "enableKeyRotation": { + "label": "Enable Key Rotation", + "description": "Automatically rotate JWT signing keys periodically" + }, + "enableKeyCleanup": { + "label": "Enable Key Cleanup", + "description": "Automatically remove expired JWT keys" + } + }, + "audit": { + "label": "Audit Logging", + "enabled": { + "label": "Enable Audit Logging", + "description": "Track user actions and system events for compliance and security monitoring" + }, + "level": { + "label": "Audit Level", + "description": "0=OFF, 1=BASIC, 2=STANDARD, 3=VERBOSE" + }, + "retentionDays": { + "label": "Audit Retention (days)", + "description": "Number of days to retain audit logs" + } + }, + "htmlUrlSecurity": { + "label": "HTML URL Security", + "description": "Configure URL access restrictions for HTML processing to prevent SSRF attacks", + "enabled": { + "label": "Enable URL Security", + "description": "Enable URL security restrictions for HTML to PDF conversions" + }, + "level": { + "label": "Security Level", + "description": "MAX: whitelist only, MEDIUM: block internal networks, OFF: no restrictions", + "max": "Maximum (Whitelist Only)", + "medium": "Medium (Block Internal)", + "off": "Off (No Restrictions)" + }, + "advanced": "Advanced Settings", + "allowedDomains": { + "label": "Allowed Domains (Whitelist)", + "description": "One domain per line (e.g., cdn.example.com). Only these domains allowed when level is MAX" + }, + "blockedDomains": { + "label": "Blocked Domains (Blacklist)", + "description": "One domain per line (e.g., malicious.com). Additional domains to block" + }, + "internalTlds": { + "label": "Internal TLDs", + "description": "One TLD per line (e.g., .local, .internal). Block domains with these TLD patterns" + }, + "networkBlocking": "Network Blocking", + "blockPrivateNetworks": { + "label": "Block Private Networks", + "description": "Block RFC 1918 private networks (10.x.x.x, 192.168.x.x, 172.16-31.x.x)" + }, + "blockLocalhost": { + "label": "Block Localhost", + "description": "Block localhost and loopback addresses (127.x.x.x, ::1)" + }, + "blockLinkLocal": { + "label": "Block Link-Local Addresses", + "description": "Block link-local addresses (169.254.x.x, fe80::/10)" + }, + "blockCloudMetadata": { + "label": "Block Cloud Metadata Endpoints", + "description": "Block cloud provider metadata endpoints (169.254.169.254)" + } + } + }, + "connections": { + "title": "Connections", + "description": "Configure external authentication providers like OAuth2 and SAML.", + "linkedServices": "Linked Services", + "unlinkedServices": "Unlinked Services", + "connect": "Connect", + "disconnect": "Disconnect", + "disconnected": "Provider disconnected successfully", + "disconnectError": "Failed to disconnect provider", + "ssoAutoLogin": { + "label": "SSO Auto Login", + "enable": "Enable SSO Auto Login", + "description": "Automatically redirect to SSO login when authentication is required" + }, + "oauth2": { + "label": "OAuth2", + "enabled": { + "label": "Enable OAuth2", + "description": "Allow users to authenticate using OAuth2 providers" + }, + "provider": { + "label": "Provider", + "description": "The OAuth2 provider to use for authentication" + }, + "issuer": { + "label": "Issuer URL", + "description": "The OAuth2 provider issuer URL" + }, + "clientId": { + "label": "Client ID", + "description": "The OAuth2 client ID from your provider" + }, + "clientSecret": { + "label": "Client Secret", + "description": "The OAuth2 client secret from your provider" + }, + "useAsUsername": { + "label": "Use as Username", + "description": "The OAuth2 claim to use as the username (e.g., email, sub)" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first OAuth2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via OAuth2" + }, + "scopes": { + "label": "OAuth2 Scopes", + "description": "Comma-separated list of OAuth2 scopes to request (e.g., openid, profile, email)" + } + }, + "saml2": { + "label": "SAML2", + "enabled": { + "label": "Enable SAML2", + "description": "Allow users to authenticate using SAML2 providers" + }, + "provider": { + "label": "Provider", + "description": "The SAML2 provider name" + }, + "registrationId": { + "label": "Registration ID", + "description": "The SAML2 registration identifier" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first SAML2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via SAML2" + } + } + }, + "database": { + "title": "Database", + "description": "Configure custom database connection settings for enterprise deployments.", + "configuration": "Database Configuration", + "enableCustom": { + "label": "Enable Custom Database", + "description": "Use your own custom database configuration instead of the default embedded database" + }, + "customUrl": { + "label": "Custom Database URL", + "description": "Full JDBC connection string (e.g., jdbc:postgresql://localhost:5432/postgres). If provided, individual connection settings below are not used." + }, + "type": { + "label": "Database Type", + "description": "Type of database (not used if custom URL is provided)" + }, + "hostName": { + "label": "Host Name", + "description": "Database server hostname (not used if custom URL is provided)" + }, + "port": { + "label": "Port", + "description": "Database server port (not used if custom URL is provided)" + }, + "name": { + "label": "Database Name", + "description": "Name of the database (not used if custom URL is provided)" + }, + "username": { + "label": "Username", + "description": "Database authentication username" + }, + "password": { + "label": "Password", + "description": "Database authentication password" + } + }, + "privacy": { + "title": "Privacy", + "description": "Configure privacy and data collection settings.", + "analytics": "Analytics & Tracking", + "enableAnalytics": { + "label": "Enable Analytics", + "description": "Collect anonymous usage analytics to help improve the application" + }, + "metricsEnabled": { + "label": "Enable Metrics", + "description": "Enable collection of performance and usage metrics. Provides API endpoint for admins to access metrics data" + }, + "searchEngine": "Search Engine Visibility", + "googleVisibility": { + "label": "Google Visibility", + "description": "Allow search engines to index this application" + } + }, + "advanced": { + "title": "Advanced", + "description": "Configure advanced features and experimental functionality.", + "features": "Feature Flags", + "processing": "Processing", + "endpoints": { + "label": "Endpoints", + "manage": "Manage API Endpoints", + "description": "Endpoint management is configured via YAML. See documentation for details on enabling/disabling specific endpoints." + }, + "enableAlphaFunctionality": { + "label": "Enable Alpha Features", + "description": "Enable experimental and alpha-stage features (may be unstable)" + }, + "enableUrlToPDF": { + "label": "Enable URL to PDF", + "description": "Allow conversion of web pages to PDF documents" + }, + "maxDPI": { + "label": "Maximum DPI", + "description": "Maximum DPI for image processing (0 = unlimited)" + }, + "tessdataDir": { + "label": "Tessdata Directory", + "description": "Path to the tessdata directory for OCR language files" + }, + "disableSanitize": { + "label": "Disable HTML Sanitization", + "description": "WARNING: Security risk - disabling HTML sanitization can lead to XSS vulnerabilities" + }, + "tempFileManagement": { + "label": "Temp File Management", + "description": "Configure temporary file storage and cleanup behavior", + "baseTmpDir": { + "label": "Base Temp Directory", + "description": "Base directory for temporary files (leave empty for default: java.io.tmpdir/stirling-pdf)" + }, + "libreofficeDir": { + "label": "LibreOffice Temp Directory", + "description": "Directory for LibreOffice temp files (leave empty for default: baseTmpDir/libreoffice)" + }, + "systemTempDir": { + "label": "System Temp Directory", + "description": "System temp directory to clean (only used if cleanupSystemTemp is enabled)" + }, + "prefix": { + "label": "Temp File Prefix", + "description": "Prefix for temp file names" + }, + "maxAgeHours": { + "label": "Max Age (hours)", + "description": "Maximum age in hours before temp files are cleaned up" + }, + "cleanupIntervalMinutes": { + "label": "Cleanup Interval (minutes)", + "description": "How often to run cleanup (in minutes)" + }, + "startupCleanup": { + "label": "Startup Cleanup", + "description": "Clean up old temp files on application startup" + }, + "cleanupSystemTemp": { + "label": "Cleanup System Temp", + "description": "Whether to clean broader system temp directory (use with caution)" + } + }, + "processExecutor": { + "label": "Process Executor Limits", + "description": "Configure session limits and timeouts for each process executor", + "sessionLimit": { + "label": "Session Limit", + "description": "Maximum concurrent instances" + }, + "timeout": { + "label": "Timeout (minutes)", + "description": "Maximum execution time" + }, + "libreOffice": "LibreOffice", + "pdfToHtml": "PDF to HTML", + "qpdf": "QPDF", + "tesseract": "Tesseract OCR", + "pythonOpenCv": "Python OpenCV", + "weasyPrint": "WeasyPrint", + "installApp": "Install App", + "calibre": "Calibre", + "ghostscript": "Ghostscript", + "ocrMyPdf": "OCRmyPDF" + } + }, + "mail": { + "title": "Mail Server", + "description": "Configure SMTP settings for sending email notifications.", + "smtp": "SMTP Configuration", + "enabled": { + "label": "Enable Mail", + "description": "Enable email notifications and SMTP functionality" + }, + "host": { + "label": "SMTP Host", + "description": "The hostname or IP address of your SMTP server" + }, + "port": { + "label": "SMTP Port", + "description": "The port number for SMTP connection (typically 25, 465, or 587)" + }, + "username": { + "label": "SMTP Username", + "description": "Username for SMTP authentication" + }, + "password": { + "label": "SMTP Password", + "description": "Password for SMTP authentication" + }, + "from": { + "label": "From Address", + "description": "The email address to use as the sender" + }, + "enableInvites": { + "label": "Enable Email Invites", + "description": "Allow admins to invite users via email with auto-generated passwords" + }, + "frontendUrl": { + "label": "Frontend URL", + "description": "Base URL for frontend (e.g. https://pdf.example.com). Used for generating invite links in emails. Leave empty to use backend URL." + } + }, + "legal": { + "title": "Legal Documents", + "description": "Configure links to legal documents and policies.", + "disclaimer": { + "title": "Legal Responsibility Warning", + "message": "By customizing these legal documents, you assume full responsibility for ensuring compliance with all applicable laws and regulations, including but not limited to GDPR and other EU data protection requirements. Only modify these settings if: (1) you are operating a personal/private instance, (2) you are outside EU jurisdiction and understand your local legal obligations, or (3) you have obtained proper legal counsel and accept sole responsibility for all user data and legal compliance. Stirling-PDF and its developers assume no liability for your legal obligations." + }, + "termsAndConditions": { + "label": "Terms and Conditions", + "description": "URL or filename to terms and conditions" + }, + "privacyPolicy": { + "label": "Privacy Policy", + "description": "URL or filename to privacy policy" + }, + "accessibilityStatement": { + "label": "Accessibility Statement", + "description": "URL or filename to accessibility statement" + }, + "cookiePolicy": { + "label": "Cookie Policy", + "description": "URL or filename to cookie policy" + }, + "impressum": { + "label": "Impressum", + "description": "URL or filename to impressum (required in some jurisdictions)" + } + }, + "premium": { + "title": "Premium & Enterprise", + "description": "Configure your premium or enterprise license key.", + "license": "License Configuration", + "key": { + "label": "License Key", + "description": "Enter your premium or enterprise license key" + }, + "enabled": { + "label": "Enable Premium Features", + "description": "Enable license key checks for pro/enterprise features" + }, + "movedFeatures": { + "title": "Premium Features Distributed", + "message": "Premium and Enterprise features are now organized in their respective sections:" + } + }, + "features": { + "title": "Features", + "description": "Configure optional features and functionality.", + "serverCertificate": { + "label": "Server Certificate", + "description": "Configure server-side certificate generation for \"Sign with Stirling-PDF\" functionality", + "enabled": { + "label": "Enable Server Certificate", + "description": "Enable server-side certificate for \"Sign with Stirling-PDF\" option" + }, + "organizationName": { + "label": "Organization Name", + "description": "Organization name for generated certificates" + }, + "validity": { + "label": "Certificate Validity (days)", + "description": "Number of days the certificate will be valid" + }, + "regenerateOnStartup": { + "label": "Regenerate on Startup", + "description": "Generate new certificate on each application startup" + } + } + }, + "endpoints": { + "title": "API Endpoints", + "description": "Control which API endpoints and endpoint groups are available.", + "management": "Endpoint Management", + "toRemove": { + "label": "Disabled Endpoints", + "description": "Select individual endpoints to disable" + }, + "groupsToRemove": { + "label": "Disabled Endpoint Groups", + "description": "Select endpoint groups to disable" + }, + "note": "Note: Disabling endpoints restricts API access but does not remove UI components. Restart required for changes to take effect." + } + } }, "fileUpload": { + "selectFile": "Select a file", + "selectFiles": "Select files", + "selectPdfToView": "Select a PDF to view", + "selectPdfToEdit": "Select a PDF to edit", + "chooseFromStorage": "Choose a file from storage or upload a new PDF", + "chooseFromStorageMultiple": "Choose files from storage or upload new PDFs", + "loadFromStorage": "Load from Storage", + "filesAvailable": "files available", "loading": "BetÃļltÊs...", - "or": "vagy" + "or": "vagy", + "dropFileHere": "Drop file here or click to upload", + "dropFilesHere": "Drop files here or click the upload button", + "pdfFilesOnly": "PDF files only", + "supportedFileTypes": "Supported file types", + "upload": "Upload", + "uploadFile": "Upload File", + "uploadFiles": "Upload Files", + "noFilesInStorage": "No files available in storage. Upload some files first.", + "selectFromStorage": "Select from Storage", + "backToTools": "Back to Tools", + "addFiles": "Add Files", + "dragFilesInOrClick": "Drag files in or click \"Add Files\" to browse" + }, + "fileEditor": { + "addFiles": "Add Files" }, "fileManager": { + "title": "Upload PDF Files", + "subtitle": "Add files to your storage for easy access across tools", + "filesSelected": "files selected", + "clearSelection": "Clear Selection", + "openInFileEditor": "Open in File Editor", + "uploadError": "Failed to upload some files.", + "failedToOpen": "Failed to open file. It may have been removed from storage.", + "failedToLoad": "Failed to load file to active set.", + "storageCleared": "Browser cleared storage. Files have been removed. Please re-upload.", + "clearAll": "Clear All", + "reloadFiles": "Reload Files", + "dragDrop": "Drag & Drop files here", + "clickToUpload": "Click to upload files", + "selectedFiles": "Selected Files", + "storage": "Storage", + "filesStored": "files stored", + "storageError": "Storage error occurred", + "storageLow": "Storage is running low. Consider removing old files.", + "supportMessage": "Powered by browser database storage for unlimited capacity", + "noFileSelected": "No files selected", + "showHistory": "Show History", + "hideHistory": "Hide History", + "fileHistory": "File History", + "loadingHistory": "Loading History...", + "lastModified": "Last Modified", + "toolChain": "Tools Applied", + "restore": "Restore", + "unzip": "Unzip", + "searchFiles": "Search files...", + "recent": "Recent", + "localFiles": "Local Files", + "googleDrive": "Google Drive", + "googleDriveShort": "Drive", + "myFiles": "My Files", + "noRecentFiles": "No recent files found", + "googleDriveNotAvailable": "Google Drive integration not available", + "openFiles": "Open Files", + "openFile": "Open File", + "details": "File Details", "fileName": "NÊv", + "fileFormat": "Format", + "fileSize": "Size", "fileVersion": "VerziÃŗ", + "totalSelected": "Total Selected", + "dropFilesHere": "Drop files here", "selectAll": "Összes kijelÃļlÊse", "deselectAll": "KijelÃļlÊs megszÃŧntetÊse", "deleteSelected": "KijelÃļltek tÃļrlÊse", + "downloadSelected": "Download Selected", + "selectedCount": "{{count}} selected", "download": "LetÃļltÊs", - "delete": "TÃļrlÊs" + "delete": "TÃļrlÊs", + "unsupported": "Unsupported", + "addToUpload": "Add to Upload", + "deleteAll": "Delete All", + "loadingFiles": "Loading files...", + "noFiles": "No files available", + "noFilesFound": "No files found matching your search", + "openInPageEditor": "Open in Page Editor", + "showAll": "Show All", + "sortByDate": "Sort by Date", + "sortByName": "Sort by Name", + "sortBySize": "Sort by Size" + }, + "storage": { + "temporaryNotice": "Files are stored temporarily in your browser and may be cleared automatically", + "storageLimit": "Storage limit", + "storageUsed": "Temporary Storage used", + "storageFull": "Storage is nearly full. Consider removing some files.", + "fileTooLarge": "File too large. Maximum size per file is", + "storageQuotaExceeded": "Storage quota exceeded. Please remove some files before uploading more.", + "approximateSize": "Approximate size" }, "sanitize": { + "title": "Sanitise", + "desc": "Remove potentially harmful elements from PDF files.", "submit": "PDF tisztítÃĄsa", + "completed": "Sanitisation completed successfully", + "error": { + "generic": "Sanitisation failed", + "failed": "An error occurred while sanitising the PDF." + }, + "filenamePrefix": "sanitised", + "sanitizationResults": "Sanitisation Results", "steps": { - "settings": "BeÃĄllítÃĄsok" + "files": "Files", + "settings": "BeÃĄllítÃĄsok", + "results": "Results" + }, + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "options": { + "title": "Sanitisation Options", + "note": "Select the elements you want to remove from the PDF. At least one option must be selected.", + "removeJavaScript": { + "label": "Remove JavaScript", + "desc": "Remove JavaScript actions and scripts from the PDF" + }, + "removeEmbeddedFiles": { + "label": "Remove Embedded Files", + "desc": "Remove any files embedded within the PDF" + }, + "removeXMPMetadata": { + "label": "Remove XMP Metadata", + "desc": "Remove XMP metadata from the PDF" + }, + "removeMetadata": { + "label": "Remove Document Metadata", + "desc": "Remove document information metadata (title, author, etc.)" + }, + "removeLinks": { + "label": "Remove Links", + "desc": "Remove external links and launch actions from the PDF" + }, + "removeFonts": { + "label": "Remove Fonts", + "desc": "Remove embedded fonts from the PDF" + } + } + }, + "addPassword": { + "title": "JelszÃŗ hozzÃĄadÃĄsa", + "desc": "Encrypt your PDF document with a password.", + "completed": "Password protection applied", + "submit": "TitkosítÃĄs", + "filenamePrefix": "encrypted", + "error": { + "failed": "An error occurred while encrypting the PDF." + }, + "passwords": { + "stepTitle": "Passwords & Encryption", + "completed": "Passwords configured", + "user": { + "label": "User Password", + "placeholder": "Enter user password" + }, + "owner": { + "label": "Owner Password", + "placeholder": "Enter owner password" + } + }, + "encryption": { + "keyLength": { + "label": "Encryption Key Length", + "40bit": "40-bit (Low)", + "128bit": "128-bit (Standard)", + "256bit": "256-bit (High)" + } + }, + "results": { + "title": "Encrypted PDFs" + }, + "tooltip": { + "header": { + "title": "Password Protection Overview" + }, + "passwords": { + "title": "Password Types", + "text": "User passwords restrict opening the document, while owner passwords control what can be done with the document once opened. You can set both or just one.", + "bullet1": "User Password: Required to open the PDF", + "bullet2": "Owner Password: Controls document permissions (not supported by all PDF viewers)" + }, + "encryption": { + "title": "Encryption Levels", + "text": "Higher encryption levels provide better security but may not be supported by older PDF viewers.", + "bullet1": "40-bit: Basic security, compatible with older viewers", + "bullet2": "128-bit: Standard security, widely supported", + "bullet3": "256-bit: Maximum security, requires modern viewers" + }, + "permissions": { + "title": "JogosultsÃĄgok mÃŗdosítÃĄsa", + "text": "These permissions control what users can do with the PDF. Most effective when combined with an owner password." + } + }, + "tags": "biztonsÃĄg,vÊdelem", + "header": "JelszÃŗ hozzÃĄadÃĄsa (TitkosítÃĄs)", + "selectText": { + "1": "VÃĄlassza ki a titkosítandÃŗ PDF-et", + "2": "FelhasznÃĄlÃŗi jelszÃŗ", + "3": "TitkosítÃĄsi kulcs hossza", + "4": "A magasabb ÊrtÊkek erősebbek, de az alacsonyabb ÊrtÊkek jobb kompatibilitÃĄst biztosítanak.", + "5": "BeÃĄllítandÃŗ jogosultsÃĄgok (Tulajdonosi jelszÃŗval ajÃĄnlott hasznÃĄlni)", + "6": "Dokumentum egyesítÊsÊnek megakadÃĄlyozÃĄsa", + "7": "Tartalom kinyerÊsÊnek megakadÃĄlyozÃĄsa", + "8": "AkadÃĄlymentesítÊsi cÊlÃē kinyerÊs megakadÃĄlyozÃĄsa", + "9": "ŰrlapkitÃļltÊs megakadÃĄlyozÃĄsa", + "10": "MÃŗdosítÃĄs megakadÃĄlyozÃĄsa", + "11": "MegjegyzÊsek mÃŗdosítÃĄsÃĄnak megakadÃĄlyozÃĄsa", + "12": "NyomtatÃĄs megakadÃĄlyozÃĄsa", + "13": "KÃŧlÃļnbÃļző formÃĄtumÃē nyomtatÃĄs megakadÃĄlyozÃĄsa", + "14": "Tulajdonos jelszÃŗ", + "15": "KorlÃĄtozza, hogy mi vÊgezhető el a dokumentum megnyitÃĄsa utÃĄn (Nem minden olvasÃŗ tÃĄmogatja)", + "16": "KorlÃĄtozza a dokumentum megnyithatsÃĄgÃĄt" } }, "changePermissions": { "title": "JogosultsÃĄgok mÃŗdosítÃĄsa", + "desc": "Change document restrictions and permissions.", + "completed": "Permissions changed", "submit": "JogosultsÃĄgok mÃŗdosítÃĄsa", + "error": { + "failed": "An error occurred while changing PDF permissions." + }, "permissions": { "preventAssembly": { "label": "Dokumentum egyesítÊsÊnek megakadÃĄlyozÃĄsa" @@ -1743,10 +4581,784 @@ "label": "KÃŧlÃļnbÃļző formÃĄtumÃē nyomtatÃĄs megakadÃĄlyozÃĄsa" } }, + "results": { + "title": "Modified PDFs" + }, "tooltip": { "header": { "title": "JogosultsÃĄgok mÃŗdosítÃĄsa" + }, + "description": { + "text": "Changes document permissions, allowing/disallowing access to different features in PDF readers." + }, + "warning": { + "text": "To make these permissions unchangeable, use the Add Password tool to set an owner password." } } + }, + "removePassword": { + "title": "JelszÃŗ eltÃĄvolítÃĄsa", + "desc": "Jelszavas vÊdelem eltÃĄvolítÃĄsa a PDF dokumentumbÃŗl", + "tags": "biztonsÃĄg,feloldÃĄs,vÊdelem,jelszÃŗ tÃļrlÊse", + "password": { + "stepTitle": "JelszÃŗ eltÃĄvolítÃĄsa", + "label": "Jelenlegi jelszÃŗ", + "placeholder": "Enter current password", + "completed": "Password configured" + }, + "filenamePrefix": "decrypted", + "error": { + "failed": "An error occurred while removing the password from the PDF." + }, + "tooltip": { + "description": "Removing password protection requires the password that was used to encrypt the PDF. This will decrypt the document, making it accessible without a password." + }, + "submit": "EltÃĄvolítÃĄs", + "results": { + "title": "Decrypted PDFs" + }, + "header": "JelszÃŗ eltÃĄvolítÃĄsa (VisszafejtÊs)", + "selectText": { + "1": "VÃĄlassza ki a visszafejtendő PDF-et", + "2": "JelszÃŗ" + } + }, + "automate": { + "title": "Automate", + "desc": "Build multi-step workflows by chaining together PDF actions. Ideal for recurring tasks.", + "invalidStep": "Invalid step", + "files": { + "placeholder": "Select files to process with this automation" + }, + "selection": { + "title": "Automation Selection", + "saved": { + "title": "Saved" + }, + "createNew": { + "title": "Create New Automation" + }, + "suggested": { + "title": "Suggested" + } + }, + "creation": { + "createTitle": "Create Automation", + "editTitle": "Edit Automation", + "intro": "Automations run tools sequentially. To get started, add tools in the order you want them to run.", + "name": { + "label": "Automation Name", + "placeholder": "My Automation" + }, + "description": { + "label": "Description (optional)", + "placeholder": "Describe what this automation does..." + }, + "tools": { + "selectTool": "Select a tool...", + "selected": "Selected Tools", + "remove": "Remove tool", + "configure": "Configure tool", + "notConfigured": "! Not Configured", + "addTool": "Add Tool", + "add": "Add a tool..." + }, + "save": "Save Automation", + "unsavedChanges": { + "title": "Unsaved Changes", + "message": "You have unsaved changes. Are you sure you want to go back? All changes will be lost.", + "cancel": "Cancel", + "confirm": "Go Back" + }, + "icon": { + "label": "Icon" + } + }, + "run": { + "title": "Run Automation" + }, + "sequence": { + "unnamed": "Unnamed Automation", + "steps": "{{count}} steps", + "running": "Running Automation...", + "run": "Run Automation", + "finish": "Finish" + }, + "reviewTitle": "Automation Results", + "config": { + "loading": "Loading tool configuration...", + "noSettings": "This tool does not have configurable settings.", + "title": "Configure {{toolName}}", + "description": "Configure the settings for this tool. These settings will be applied when the automation runs.", + "cancel": "Cancel", + "save": "Save Configuration" + }, + "copyToSaved": "Copy to Saved" + }, + "automation": { + "suggested": { + "securePdfIngestion": "Secure PDF Ingestion", + "securePdfIngestionDesc": "Comprehensive PDF processing workflow that sanitises documents, applies OCR with cleanup, converts to PDF/A format for long-term archival, and optimises file size.", + "emailPreparation": "Email Preparation", + "emailPreparationDesc": "Optimises PDFs for email distribution by compressing files, splitting large documents into 20MB chunks for email compatibility, and removing metadata for privacy.", + "secureWorkflow": "Security Workflow", + "secureWorkflowDesc": "Secures PDF documents by removing potentially malicious content like JavaScript and embedded files, then adds password protection to prevent unauthorised access. Password is set to 'password' by default.", + "processImages": "Process Images", + "processImagesDesc": "Converts multiple image files into a single PDF document, then applies OCR technology to extract searchable text from the images." + } + }, + "common": { + "copy": "Copy", + "copied": "Copied!", + "refresh": "Refresh", + "retry": "Retry", + "remaining": "remaining", + "used": "used", + "available": "available", + "cancel": "Cancel", + "preview": "Preview" + }, + "config": { + "overview": { + "title": "Application Configuration", + "description": "Current application settings and configuration details." + }, + "account": { + "overview": { + "title": "Account Settings", + "manageAccountPreferences": "Manage your account preferences", + "guestDescription": "You are signed in as a guest. Consider upgrading your account above." + }, + "upgrade": { + "title": "Upgrade Guest Account", + "description": "Link your account to preserve your history and access more features!", + "socialLogin": "Upgrade with Social Account", + "linkWith": "Link with", + "emailPassword": "or enter your email & password", + "email": "Email", + "emailPlaceholder": "Enter your email", + "password": "Password (optional)", + "passwordPlaceholder": "Set a password", + "passwordNote": "Leave empty to use email verification only", + "upgradeButton": "Upgrade Account" + } + }, + "apiKeys": { + "description": "Your API key for accessing Stirling's suite of PDF tools. Copy it to your project or refresh to generate a new one.", + "publicKeyAriaLabel": "Public API key", + "copyKeyAriaLabel": "Copy API key", + "refreshAriaLabel": "Refresh API key", + "includedCredits": "Included credits", + "purchasedCredits": "Purchased credits", + "totalCredits": "Total Credits", + "chartAriaLabel": "Credits usage: included {{includedUsed}} of {{includedTotal}}, purchased {{purchasedUsed}} of {{purchasedTotal}}", + "nextReset": "Next Reset", + "lastApiUse": "Last API Use", + "overlayMessage": "Generate a key to see credits and available credits", + "label": "API Key", + "guestInfo": "Guest users do not receive API keys. Create an account to get an API key you can use in your applications.", + "goToAccount": "Go to Account", + "refreshModal": { + "title": "Refresh API Keys", + "warning": "âš ī¸ Warning: This action will generate new API keys and make your previous keys invalid.", + "impact": "Any applications or services currently using these keys will stop working until you update them with the new keys.", + "confirmPrompt": "Are you sure you want to continue?", + "confirmCta": "Refresh Keys" + }, + "generateError": "We couldn't generate your API key." + } + }, + "AddAttachmentsRequest": { + "attachments": "Select Attachments", + "info": "Select files to attach to your PDF. These files will be embedded and accessible through the PDF's attachment panel.", + "selectFiles": "Select Files to Attach", + "placeholder": "Choose files...", + "addMoreFiles": "Add more files...", + "selectedFiles": "Selected Files", + "submit": "Add Attachments", + "results": { + "title": "Attachment Results" + }, + "error": { + "failed": "Add attachments operation failed" + } + }, + "termsAndConditions": "Terms & Conditions", + "logOut": "Log out", + "addAttachments": { + "error": { + "failed": "An error occurred while adding attachments to the PDF." + } + }, + "autoRename": { + "description": "This tool will automatically rename PDF files based on their content. It analyzes the document to find the most suitable title from the text." + }, + "customPosition": "Custom Position", + "details": "Details", + "downloadUnavailable": "Download unavailable for this item", + "invalidUndoData": "Cannot undo: invalid operation data", + "margin": { + "large": "Large", + "medium": "Medium", + "small": "Small", + "xLarge": "Extra Large" + }, + "noFilesToUndo": "Cannot undo: no files were processed in the last operation", + "noOperationToUndo": "No operation to undo", + "noValidFiles": "No valid files to process", + "operationCancelled": "Operation cancelled", + "pageEdit": { + "deselectAll": "Select None", + "selectAll": "Select All" + }, + "quickPosition": "Quick Position", + "reorganizePages": { + "error": { + "failed": "Failed to reorganize pages" + }, + "results": { + "title": "Pages Reorganized" + }, + "settings": { + "title": "Settings" + }, + "submit": "Reorganize Pages" + }, + "replace-color": { + "options": { + "fill": "Fill colour", + "gradient": "Gradient" + }, + "previewOverlayOpacity": "Preview overlay opacity", + "previewOverlayTransparency": "Preview overlay transparency", + "previewOverlayVisibility": "Show preview overlay", + "selectText": { + "1": "Színcsere vagy -invertÃĄlÃĄs beÃĄllítÃĄsai", + "2": "AlapÊrtelmezett (AlapÊrtelmezett kontrasztos színek)", + "3": "EgyÊni (EgyÊni színek)", + "4": "Teljes invertÃĄlÃĄs (Minden szín invertÃĄlÃĄsa)", + "5": "Magas kontrasztÃē színbeÃĄllítÃĄsok", + "6": "fehÊr szÃļveg fekete hÃĄttÊren", + "7": "fekete szÃļveg fehÊr hÃĄttÊren", + "8": "sÃĄrga szÃļveg fekete hÃĄttÊren", + "9": "zÃļld szÃļveg fekete hÃĄttÊren", + "10": "SzÃļvegszín kivÃĄlasztÃĄsa", + "11": "HÃĄttÊrszín kivÃĄlasztÃĄsa", + "12": "Choose start colour", + "13": "Choose end colour" + }, + "submit": "Csere", + "title": "Színcsere-InvertÃĄlÃĄs", + "header": "PDF színek cserÊje-invertÃĄlÃĄsa" + }, + "size": "Size", + "submit": "Submit", + "success": "Success", + "tools": { + "noSearchResults": "No tools found", + "noTools": "No tools available" + }, + "undoDataMismatch": "Cannot undo: operation data is corrupted", + "undoFailed": "Failed to undo operation", + "undoQuotaError": "Cannot undo: insufficient storage space", + "undoStorageError": "Undo completed but some files could not be saved to storage", + "undoSuccess": "Operation undone successfully", + "unsupported": "Unsupported", + "onboarding": { + "welcomeModal": { + "title": "Welcome to Stirling PDF!", + "description": "Would you like to take a quick 1-minute tour to learn the key features and how to get started?", + "helpHint": "You can always access this tour later from the Help button in the bottom left.", + "startTour": "Start Tour", + "maybeLater": "Maybe Later", + "dontShowAgain": "Don't Show Again" + }, + "allTools": "This is the All Tools panel, where you can browse and select from all available PDF tools.", + "selectCropTool": "Let's select the Crop tool to demonstrate how to use one of the tools.", + "toolInterface": "This is the Crop tool interface. As you can see, there's not much there because we haven't added any PDF files to work with yet.", + "filesButton": "The Files button on the Quick Access bar allows you to upload PDFs to use the tools on.", + "fileSources": "You can upload new files or access recent files from here. For the tour, we'll just use a sample file.", + "workbench": "This is the Workbench - the main area where you view and edit your PDFs.", + "viewSwitcher": "Use these controls to select how you want to view your PDFs.", + "viewer": "The Viewer lets you read and annotate your PDFs.", + "pageEditor": "The Page Editor allows you to do various operations on the pages within your PDFs, such as reordering, rotating and deleting.", + "activeFiles": "The Active Files view shows all of the PDFs you have loaded into the tool, and allows you to select which ones to process.", + "fileCheckbox": "Clicking one of the files selects it for processing. You can select multiple files for batch operations.", + "selectControls": "The Right Rail contains buttons to quickly select/deselect all of your active PDFs, along with buttons to change the app's theme or language.", + "cropSettings": "Now that we've selected the file we want crop, we can configure the Crop tool to choose the area that we want to crop the PDF to.", + "runButton": "Once the tool has been configured, this button allows you to run the tool on all the selected PDFs.", + "results": "After the tool has finished running, the Review step will show a preview of the results in this panel, and allow you to undo the operation or download the file. ", + "fileReplacement": "The modified file will replace the original file in the Workbench automatically, allowing you to easily run it through more tools.", + "pinButton": "You can use the Pin button if you'd rather your files stay active after running tools on them.", + "wrapUp": "You're all set! You've learnt about the main areas of the app and how to use them. Click the Help button whenever you like to see this tour again.", + "previous": "Previous", + "next": "Next", + "finish": "Finish", + "startTour": "Start Tour", + "startTourDescription": "Take a guided tour of Stirling PDF's key features" + }, + "workspace": { + "title": "Workspace", + "people": { + "title": "People", + "description": "Manage workspace members and their permissions", + "loading": "Loading people...", + "searchMembers": "Search members...", + "addMembers": "Add Members", + "inviteMembers": { + "label": "Invite Members", + "subtitle": "Type or paste in emails below, separated by commas. Your workspace will be billed by members." + }, + "user": "User", + "role": "Role", + "team": "Team", + "status": "Status", + "actions": "Actions", + "noMembersFound": "No members found", + "active": "Active", + "disabled": "Disabled", + "activeSession": "Active session", + "member": "Member", + "admin": "Admin", + "roleDescriptions": { + "admin": "Can manage settings and invite members, with full administrative access.", + "member": "Can view and edit shared files, but cannot manage workspace settings or members." + }, + "editRole": "Edit Role", + "enable": "Enable", + "disable": "Disable", + "deleteUser": "Delete User", + "deleteUserSuccess": "User deleted successfully", + "deleteUserError": "Failed to delete user", + "confirmDelete": "Are you sure you want to delete this user? This action cannot be undone.", + "addMember": { + "title": "Add Member", + "username": "Username (Email)", + "usernamePlaceholder": "user@example.com", + "password": "Password", + "passwordPlaceholder": "Enter password", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "forcePasswordChange": "Force password change on first login", + "cancel": "Cancel", + "submit": "Add Member", + "usernameRequired": "Username and password are required", + "passwordTooShort": "Password must be at least 6 characters", + "success": "User created successfully", + "error": "Failed to create user" + }, + "editMember": { + "title": "Edit Member", + "editing": "Editing:", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "cancel": "Cancel", + "submit": "Update Member", + "success": "User updated successfully", + "error": "Failed to update user" + }, + "toggleEnabled": { + "success": "User status updated successfully", + "error": "Failed to update user status" + }, + "delete": { + "success": "User deleted successfully", + "error": "Failed to delete user" + }, + "emailInvite": { + "tab": "Email Invite", + "description": "Type or paste in emails below, separated by commas. Users will receive login credentials via email.", + "emails": "Email Addresses", + "emailsPlaceholder": "user1@example.com, user2@example.com", + "emailsRequired": "At least one email address is required", + "submit": "Send Invites", + "success": "user(s) invited successfully", + "partialSuccess": "Some invites failed", + "allFailed": "Failed to invite users", + "error": "Failed to send invites" + }, + "directInvite": { + "tab": "Direct Create" + }, + "inviteLinkTab": { + "tab": "Invite Link" + }, + "inviteLink": { + "description": "Generate a secure link that allows the user to set their own password", + "email": "Email Address", + "emailPlaceholder": "user@example.com (optional)", + "emailDescription": "Optional - leave blank for a general invite link that can be used by anyone", + "emailRequired": "Email address is required", + "emailOptional": "Optional - leave blank for a general invite link", + "emailRequiredForSend": "Email address is required to send email notification", + "expiryHours": "Expiry Hours", + "expiryDescription": "How many hours until the link expires", + "sendEmail": "Send invite link via email", + "sendEmailDescription": "If enabled, the invite link will be sent to the specified email address", + "smtpRequired": "SMTP not configured", + "generate": "Generate Link", + "generated": "Invite Link Generated", + "copied": "Link copied to clipboard", + "success": "Invite link generated successfully", + "successWithEmail": "Invite link generated and sent via email", + "emailFailed": "Invite link generated, but email failed", + "emailFailedDetails": "Error: {0}. Please share the invite link manually.", + "error": "Failed to generate invite link", + "submit": "Generate Invite Link" + }, + "inviteMode": { + "username": "Username", + "email": "Email", + "link": "Link", + "emailDisabled": "Email invites require SMTP configuration and mail.enableInvites=true in settings" + }, + "license": { + "users": "users", + "availableSlots": "Available Slots", + "grandfathered": "Grandfathered", + "grandfatheredShort": "{{count}} grandfathered", + "fromLicense": "from license", + "slotsAvailable": "{{count}} user slot(s) available", + "noSlotsAvailable": "No slots available", + "currentUsage": "Currently using {{current}} of {{max}} user licences" + } + }, + "teams": { + "title": "Teams", + "description": "Manage teams and organize workspace members", + "loading": "Loading teams...", + "loadingDetails": "Loading team details...", + "createNewTeam": "Create New Team", + "teamName": "Team Name", + "totalMembers": "Total Members", + "actions": "Actions", + "noTeamsFound": "No teams found", + "noMembers": "No members in this team", + "system": "System", + "addMember": "Add Member", + "viewTeam": "View Team", + "removeMember": "Remove from team", + "cannotRemoveFromSystemTeam": "Cannot remove from system team", + "renameTeamLabel": "Rename Team", + "deleteTeamLabel": "Delete Team", + "cannotDeleteInternal": "Cannot delete the Internal team", + "confirmDelete": "Are you sure you want to delete this team? This team must be empty to delete.", + "confirmRemove": "Remove user from this team?", + "cannotRenameInternal": "Cannot rename the Internal team", + "cannotAddToInternal": "Cannot add members to the Internal team", + "teamNotFound": "Team not found", + "backToTeams": "Back to Teams", + "memberCount": "{{count}} members", + "removeMemberSuccess": "User removed from team", + "removeMemberError": "Failed to remove user from team", + "createTeam": { + "title": "Create New Team", + "teamName": "Team Name", + "teamNamePlaceholder": "Enter team name", + "cancel": "Cancel", + "submit": "Create Team", + "nameRequired": "Team name is required", + "success": "Team created successfully", + "error": "Failed to create team" + }, + "renameTeam": { + "title": "Rename Team", + "renaming": "Renaming:", + "newTeamName": "New Team Name", + "newTeamNamePlaceholder": "Enter new team name", + "cancel": "Cancel", + "submit": "Rename Team", + "nameRequired": "Team name is required", + "success": "Team renamed successfully", + "error": "Failed to rename team" + }, + "deleteTeam": { + "success": "Team deleted successfully", + "error": "Failed to delete team. Make sure the team is empty.", + "teamMustBeEmpty": "Team must be empty before deletion" + }, + "addMemberToTeam": { + "title": "Add Member to Team", + "addingTo": "Adding to", + "selectUser": "Select User", + "selectUserPlaceholder": "Choose a user", + "selectUserRequired": "Please select a user", + "currentlyIn": "currently in", + "willBeMoved": "Note: This user will be moved from their current team to this team.", + "cancel": "Cancel", + "submit": "Add Member", + "userRequired": "Please select a user", + "success": "Member added to team successfully", + "error": "Failed to add member to team" + }, + "changeTeam": { + "label": "Change Team", + "title": "Change Team", + "changing": "Moving", + "selectTeam": "Select Team", + "selectTeamPlaceholder": "Choose a team", + "selectTeamRequired": "Please select a team", + "success": "Team changed successfully", + "error": "Failed to change team", + "submit": "Change Team" + } + } + }, + "plan": { + "currency": "Currency", + "popular": "Popular", + "current": "Current Plan", + "upgrade": "Upgrade", + "contact": "Contact Us", + "customPricing": "Custom", + "showComparison": "Compare All Features", + "hideComparison": "Hide Feature Comparison", + "featureComparison": "Feature Comparison", + "activePlan": { + "title": "Active Plan", + "subtitle": "Your current subscription details" + }, + "availablePlans": { + "title": "Available Plans", + "subtitle": "Choose the plan that fits your needs" + }, + "static": { + "title": "Billing Information", + "message": "Online billing is not currently configured. To upgrade your plan or manage subscriptions, please contact us directly.", + "contactSales": "Contact Sales", + "contactToUpgrade": "Contact us to upgrade or customize your plan", + "maxUsers": "Max Users", + "upTo": "Up to" + }, + "period": { + "month": "month" + }, + "free": { + "name": "Free", + "highlight1": "Limited Tool Usage Per week", + "highlight2": "Access to all tools", + "highlight3": "Community support" + }, + "pro": { + "name": "Pro", + "highlight1": "Unlimited Tool Usage", + "highlight2": "Advanced PDF tools", + "highlight3": "No watermarks" + }, + "enterprise": { + "name": "Enterprise", + "highlight1": "Custom pricing", + "highlight2": "Dedicated support", + "highlight3": "Latest features" + }, + "feature": { + "title": "Feature", + "pdfTools": "Basic PDF Tools", + "fileSize": "File Size Limit", + "automation": "Automate tool workflows", + "api": "API Access", + "priority": "Priority Support", + "customPricing": "Custom Pricing" + } + }, + "subscription": { + "status": { + "active": "Active", + "pastDue": "Past Due", + "canceled": "Canceled", + "incomplete": "Incomplete", + "trialing": "Trial", + "none": "No Subscription" + }, + "renewsOn": "Renews on {{date}}", + "cancelsOn": "Cancels on {{date}}" + }, + "billing": { + "manageBilling": "Manage Billing", + "portal": { + "error": "Failed to open billing portal" + } + }, + "payment": { + "preparing": "Preparing your checkout...", + "upgradeTitle": "Upgrade to {{planName}}", + "success": "Payment Successful!", + "successMessage": "Your subscription has been activated successfully. You will receive a confirmation email shortly.", + "autoClose": "This window will close automatically...", + "error": "Payment Error" + }, + "firstLogin": { + "title": "First Time Login", + "welcomeTitle": "Welcome!", + "welcomeMessage": "For security reasons, you must change your password on your first login.", + "loggedInAs": "Logged in as", + "error": "Error", + "currentPassword": "Current Password", + "enterCurrentPassword": "Enter your current password", + "newPassword": "New Password", + "enterNewPassword": "Enter new password (min 8 characters)", + "confirmPassword": "Confirm New Password", + "reEnterNewPassword": "Re-enter new password", + "changePassword": "Change Password", + "allFieldsRequired": "All fields are required", + "passwordsDoNotMatch": "New passwords do not match", + "passwordTooShort": "Password must be at least 8 characters", + "passwordMustBeDifferent": "New password must be different from current password", + "passwordChangedSuccess": "Password changed successfully! Please log in again.", + "passwordChangeFailed": "Failed to change password. Please check your current password." + }, + "invite": { + "welcome": "Welcome to Stirling PDF", + "invalidToken": "Invalid invitation link", + "validationError": "Failed to validate invitation link", + "passwordRequired": "Password is required", + "passwordTooShort": "Password must be at least 6 characters", + "passwordMismatch": "Passwords do not match", + "acceptError": "Failed to create account", + "validating": "Validating invitation...", + "invalidInvitation": "Invalid Invitation", + "goToLogin": "Go to Login", + "welcomeTitle": "You've been invited!", + "welcomeSubtitle": "Complete your account setup to get started", + "accountFor": "Creating account for", + "linkExpires": "Link expires", + "email": "Email address", + "emailPlaceholder": "Enter your email address", + "emailRequired": "Email address is required", + "invalidEmail": "Invalid email address", + "choosePassword": "Choose a password", + "passwordPlaceholder": "Enter your password", + "confirmPassword": "Confirm password", + "confirmPasswordPlaceholder": "Re-enter your password", + "createAccount": "Create Account", + "creating": "Creating Account...", + "alreadyHaveAccount": "Already have an account?", + "signIn": "Sign in" + }, + "audit": { + "error": { + "title": "Error loading audit system" + }, + "notAvailable": "Audit system not available", + "notAvailableMessage": "The audit system is not configured or not available.", + "disabled": "Audit logging is disabled", + "disabledMessage": "Enable audit logging in your application configuration to track system events.", + "systemStatus": { + "title": "System Status", + "status": "Audit Logging", + "enabled": "Enabled", + "disabled": "Disabled", + "level": "Audit Level", + "retention": "Retention Period", + "days": "days", + "totalEvents": "Total Events" + }, + "tabs": { + "dashboard": "Dashboard", + "events": "Audit Events", + "export": "Export" + }, + "charts": { + "title": "Audit Dashboard", + "error": "Error loading charts", + "day": "Day", + "week": "Week", + "month": "Month", + "byType": "Events by Type", + "byUser": "Events by User", + "overTime": "Events Over Time" + }, + "events": { + "title": "Audit Events", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "error": "Error loading events", + "noEvents": "No events found", + "timestamp": "Timestamp", + "type": "Type", + "user": "User", + "ipAddress": "IP Address", + "actions": "Actions", + "viewDetails": "View Details", + "eventDetails": "Event Details", + "details": "Details" + }, + "export": { + "title": "Export Audit Data", + "description": "Export audit events to CSV or JSON format. Use filters to limit the exported data.", + "format": "Export Format", + "filters": "Filters (Optional)", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "exportButton": "Export Data", + "error": "Failed to export data" + } + }, + "usage": { + "noData": "No data available", + "error": "Error loading usage statistics", + "noDataMessage": "No usage statistics are currently available.", + "controls": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All", + "refresh": "Refresh", + "dataTypeLabel": "Data Type:", + "dataType": { + "all": "All", + "api": "API", + "ui": "UI" + } + }, + "showing": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All" + }, + "stats": { + "totalEndpoints": "Total Endpoints", + "totalVisits": "Total Visits", + "showing": "Showing", + "selectedVisits": "Selected Visits" + }, + "chart": { + "title": "Endpoint Usage Chart" + }, + "table": { + "title": "Detailed Statistics", + "endpoint": "Endpoint", + "visits": "Visits", + "percentage": "Percentage", + "noData": "No data available" + } + }, + "backendHealth": { + "checking": "Checking backend status...", + "online": "Backend Online", + "offline": "Backend Offline" + }, + "autoRedact": { + "tags": "KitakarÃĄs,ElrejtÊs,fekete kitakarÃĄs,fekete,jelÃļlő,rejtett", + "title": "Automatikus kitakarÃĄs", + "header": "Automatikus kitakarÃĄs", + "colorLabel": "Szín", + "textsToRedactLabel": "KitakarandÃŗ szÃļvegek (soronkÊnt)", + "textsToRedactPlaceholder": "pÊldÃĄul \\nBizalmas \\nSzigorÃēan titkos", + "useRegexLabel": "RegulÃĄris kifejezÊs hasznÃĄlata", + "wholeWordSearchLabel": "Teljes szÃŗ keresÊse", + "customPaddingLabel": "Egyedi extra kitÃļltÊs", + "convertPDFToImageLabel": "PDF konvertÃĄlÃĄsa PDF-kÊppÊ (a doboz mÃļgÃļtti szÃļveg eltÃĄvolítÃĄsÃĄhoz)", + "submitButton": "KÃŧldÊs" + }, + "replaceColorPdf": { + "tags": "Színcsere,OldalmÅąveletek,Backend,szerver oldali" } -} \ No newline at end of file +} diff --git a/frontend/public/locales/id-ID/translation.json b/frontend/public/locales/id-ID/translation.json index 00b097277..6f96a8ad3 100644 --- a/frontend/public/locales/id-ID/translation.json +++ b/frontend/public/locales/id-ID/translation.json @@ -1,4 +1,40 @@ { + "toolPanel": { + "modePrompt": { + "title": "Choose how you browse tools", + "description": "Preview both layouts and decide how you want to explore Stirling PDF tools.", + "sidebarTitle": "Sidebar mode", + "sidebarDescription": "Keep tools alongside your workspace for quick switching.", + "recommended": "Recommended", + "chooseSidebar": "Use sidebar mode", + "fullscreenTitle": "Fullscreen mode - (legacy)", + "fullscreenDescription": "Browse every tool in a catalogue that covers the workspace until you pick one.", + "chooseFullscreen": "Use fullscreen mode", + "dismiss": "Maybe later" + }, + "fullscreen": { + "showDetails": "Show Details", + "comingSoon": "Coming soon:", + "favorite": "Add to favourites", + "favorites": "Favourites", + "heading": "All tools (fullscreen view)", + "noResults": "Try adjusting your search or toggle descriptions to find what you need.", + "recommended": "Recommended", + "unfavorite": "Remove from favourites" + }, + "placeholder": "Choose a tool to get started", + "toggle": { + "fullscreen": "Switch to fullscreen mode", + "sidebar": "Switch to sidebar mode" + } + }, + "unsavedChanges": "You have unsaved changes to your PDF.", + "areYouSure": "Are you sure you want to leave?", + "unsavedChangesTitle": "Unsaved Changes", + "keepWorking": "Keep Working", + "discardChanges": "Discard & Leave", + "applyAndContinue": "Save & Leave", + "exportAndContinue": "Export & Continue", "language": { "direction": "ltr" }, @@ -18,8 +54,26 @@ "customTextDesc": "Teks Khusus", "numberPagesDesc": "Halaman mana yang akan diberi nomor, default 'semua', juga menerima 1-5 atau 2,5,9, dll.", "customNumberDesc": "Default untuk {n}, juga menerima 'Halaman {n} dari {total}', 'Teks-{n}', '{nama berkas}-{n}'", - "submit": "Tambahkan Nomor Halaman" + "submit": "Tambahkan Nomor Halaman", + "configuration": "Configuration", + "customize": "Customize Appearance", + "pagesAndStarting": "Pages & Starting Number", + "positionAndPages": "Position & Pages", + "error": { + "failed": "Add page numbers operation failed" + }, + "results": { + "title": "Page Number Results" + }, + "preview": "Position Selection", + "previewDisclaimer": "Preview is approximate. Final output may vary due to PDF font metrics." }, + "pageSelectionPrompt": "Pemilihan Halaman Kustom (Masukkan daftar nomor halaman dipisahkan dengan koma 1,5,6 atau Fungsi seperti 2n+1) :", + "startingNumberTooltip": "The first number to display. Subsequent pages will increment from this number.", + "marginTooltip": "Distance between the page number and the edge of the page.", + "fontSizeTooltip": "Size of the page number text in points. Larger numbers create bigger text.", + "fontTypeTooltip": "Font family for the page numbers. Choose based on your document style.", + "customTextTooltip": "Optional custom format for page numbers. Use {n} as placeholder for the number. Example: \"Page {n}\" will show \"Page 1\", \"Page 2\", etc.", "pdfPrompt": "Pilih PDF", "multiPdfPrompt": "Pilih PDF (2+)", "multiPdfDropPrompt": "Pilih (atau seret & letakkan)) semua PDF yang Anda butuhkan", @@ -30,15 +84,41 @@ "uploadLimitExceededPlural": "are too large. Maximum allowed size is", "processTimeWarning": "Peringatan: Proses ini dapat memakan waktu hingga satu menit, tergantung pada ukuran berkas", "pageOrderPrompt": "Urutan Halaman Khusus (Masukkan daftar nomor halaman yang dipisahkan dengan koma atau Fungsi seperti 2n + 1) :", - "pageSelectionPrompt": "Pemilihan Halaman Kustom (Masukkan daftar nomor halaman dipisahkan dengan koma 1,5,6 atau Fungsi seperti 2n+1) :", "goToPage": "Ke", "true": "Benar", "false": "Salah", "unknown": "Tidak diketahui", + "app": { + "description": "The Free Adobe Acrobat alternative (10M+ Downloads)" + }, "save": "Simpan", "saveToBrowser": "Simpan ke Peramban", + "download": "Unduh", + "pin": "Pin File (keep active after tool run)", + "unpin": "Unpin File (replace after tool run)", + "undoOperationTooltip": "Click to undo the last operation and restore the original files", + "undo": "Undo", + "moreOptions": "More Options", + "editYourNewFiles": "Edit your new file(s)", "close": "Tutup", + "openInViewer": "Open in Viewer", + "confirmClose": "Confirm Close", + "confirmCloseMessage": "Are you sure you want to close this file?", + "confirmCloseCancel": "Cancel", + "confirmCloseConfirm": "Close File", + "fileSelected": "Selected: {{filename}}", + "chooseFile": "Choose File", "filesSelected": "berkas dipilih", + "files": { + "title": "Files", + "upload": "Upload", + "uploadFiles": "Upload Files", + "addFiles": "Add files", + "selectFromWorkbench": "Select files from the workbench or ", + "selectMultipleFromWorkbench": "Select at least {{count}} files from the workbench or ", + "created": "Created", + "size": "File Size" + }, "noFavourites": "Tidak ada favorit yang ditambahkan", "downloadComplete": "Unduhan Lengkap", "bored": "Bosan Menunggu?", @@ -56,7 +136,10 @@ }, "error": { "pdfPassword": "Dokumen PDF disandikan dan kata sandi tidak diberikan atau kata sandi salah", + "encryptedPdfMustRemovePassword": "This PDF is encrypted or password-protected. Please unlock it before converting to PDF/A.", + "incorrectPasswordProvided": "The PDF password is incorrect or not provided.", "_value": "Kesalahan", + "dismissAllErrors": "Dismiss All Errors", "sorry": "Maaf atas masalah ini!", "needHelp": "Butuh bantuan / Menemukan masalah?", "contactTip": "Jika Anda masih mengalami kesulitan, jangan ragu untuk menghubungi kami untuk bantuan. Anda dapat mengirim tiket di halaman GitHub kami atau menghubungi kami melalui Discord:", @@ -71,6 +154,10 @@ "githubSubmit": "GitHub - Kirim tiket", "discordSubmit": "Discord - Kirim pos dukungan" }, + "warning": { + "tooltipTitle": "Warning" + }, + "edit": "Edit", "delete": "Hapus", "username": "Nama pengguna", "password": "Kata sandi", @@ -82,6 +169,7 @@ "green": "Hijau", "blue": "Biru", "custom": "Kustom...", + "comingSoon": "Coming soon", "WorkInProgess": "Pekerjaan sedang diproses, Mungkin tidak berfungsi atau terdapat kutu, Silakan laporkan masalah apa pun!", "poweredBy": "Ditenagai oleh", "yes": "Ya", @@ -115,12 +203,14 @@ "page": "Halaman", "pages": "Halaman-halaman", "loading": "Mengambil data...", + "review": "Review", "addToDoc": "Tambahkan ke Dokumen", "reset": "Reset", "apply": "Apply", "noFileSelected": "No file selected. Please upload one.", "legal": { "privacy": "Kebijakan Privasi", + "iAgreeToThe": "I agree to all of the", "terms": "Syarat dan Ketentuan", "accessibility": "Aksesibilitas", "cookie": "Kebijakan Kuki", @@ -160,6 +250,7 @@ "title": "Apakah Anda ingin membuat Stirling PDF lebih baik?", "paragraph1": "Stirling PDF memiliki analitik yang dapat diaktifkan untuk membantu kami meningkatkan produk. Kami tidak melacak informasi pribadi atau konten berkas.", "paragraph2": "Silakan pertimbangkan untuk mengaktifkan analitik agar Stirling PDF dapat berkembang dan untuk memungkinkan kami memahami pengguna kami dengan lebih baik.", + "learnMore": "Learn more", "enable": "Aktifkan analitik", "disable": "Nonaktifkan analitik", "settings": "Anda dapat mengubah pengaturan untuk analitik di berkas config/settings.yml" @@ -203,6 +294,54 @@ "cacheInputs": { "name": "Simpan input formulir", "help": "Aktifkan untuk menyimpan input yang pernah digunakan untuk menjalankan di masa depan" + }, + "general": { + "title": "General", + "description": "Configure general application preferences.", + "account": "Account", + "accountDescription": "Manage your account settings", + "user": "User", + "signedInAs": "Signed in as", + "logout": "Log out", + "enableFeatures": { + "title": "For System Administrators", + "intro": "Enable user authentication, team management, and workspace features for your organization.", + "action": "Configure", + "and": "and", + "benefit": "Enables user roles, team collaboration, admin controls, and enterprise features.", + "learnMore": "Learn more in documentation", + "dismiss": "Dismiss" + }, + "autoUnzip": "Auto-unzip API responses", + "autoUnzipDescription": "Automatically extract files from ZIP responses", + "autoUnzipTooltip": "Automatically extract ZIP files returned from API operations. Disable to keep ZIP files intact. This does not affect automation workflows.", + "autoUnzipFileLimit": "Auto-unzip file limit", + "autoUnzipFileLimitDescription": "Maximum number of files to extract from ZIP", + "autoUnzipFileLimitTooltip": "Only unzip if the ZIP contains this many files or fewer. Set higher to extract larger ZIPs.", + "defaultToolPickerMode": "Default tool picker mode", + "defaultToolPickerModeDescription": "Choose whether the tool picker opens in fullscreen or sidebar by default", + "mode": { + "fullscreen": "Fullscreen", + "sidebar": "Sidebar" + } + }, + "hotkeys": { + "title": "Keyboard Shortcuts", + "description": "Hover a tool to see its shortcut or customise it below. Click \"Change shortcut\" and press a new key combination. Press Esc to cancel.", + "errorModifier": { + "mac": "Include ⌘ (Command), âŒĨ (Option), or another modifier in your shortcut.", + "windows": "Include Ctrl, Alt, or another modifier in your shortcut." + }, + "errorConflict": "Shortcut already used by {{tool}}.", + "none": "Not assigned", + "customBadge": "Custom", + "defaultLabel": "Default: {{shortcut}}", + "capturing": "Press keysâ€Ļ (Esc to cancel)", + "change": "Change shortcut", + "reset": "Reset", + "shortcut": "Shortcut", + "noShortcut": "No shortcut set", + "searchPlaceholder": "Search tools..." } }, "changeCreds": { @@ -274,8 +413,10 @@ "top20": "Top 20", "all": "All", "refresh": "Refresh", - "includeHomepage": "Include Homepage ('/')", - "includeLoginPage": "Include Login Page ('/login')", + "dataTypeLabel": "Data Type:", + "dataTypeAll": "All", + "dataTypeApi": "API", + "dataTypeUi": "UI", "totalEndpoints": "Total Endpoints", "totalVisits": "Total Visits", "showing": "Showing", @@ -290,7 +431,9 @@ "top": "Top", "numberOfVisits": "Number of Visits", "visitsTooltip": "Visits: {0} ({1}% of total)", - "retry": "Retry" + "retry": "Retry", + "includeHomepage": "Include Homepage ('/')", + "includeLoginPage": "Include Login Page ('/login')" }, "database": { "title": "Impor/Ekspor Database", @@ -331,22 +474,310 @@ "alphabetical": "Alphabetical", "globalPopularity": "Global Popularity", "sortBy": "Sort by:", + "mobile": { + "brandAlt": "Stirling PDF logo", + "openFiles": "Open files", + "swipeHint": "Swipe left or right to switch views", + "tools": "Tools", + "toolsSlide": "Tool selection panel", + "viewSwitcher": "Switch workspace view", + "workbenchSlide": "Workspace panel", + "workspace": "Workspace" + }, "multiTool": { + "tags": "multiple,tools", "title": "Alat Multi PDF", "desc": "Menggabungkan, Memutar, Mengatur Ulang, dan Menghapus halaman" }, "merge": { + "tags": "combine,join,unite", "title": "Menggabungkan", "desc": "Gabungkan beberapa PDF dengan mudah menjadi satu." }, "split": { + "tags": "divide,separate,break", "title": "Membagi", "desc": "Membagi PDF menjadi beberapa dokumen" }, "rotate": { + "tags": "turn,flip,orient", "title": "Putar", "desc": "Memutar PDF Anda dengan mudah." }, + "convert": { + "tags": "transform,change", + "title": "Konversi", + "desc": "Convert files between different formats" + }, + "pdfOrganiser": { + "tags": "organize,rearrange,reorder", + "title": "Mengatur", + "desc": "Menghapus/Mengatur ulang halaman dalam urutan apa pun" + }, + "addImage": { + "tags": "insert,embed,place", + "title": "Tambahkan gambar", + "desc": "Menambahkan gambar ke lokasi yang ditentukan pada PDF" + }, + "addAttachments": { + "tags": "embed,attach,include", + "title": "Add Attachments", + "desc": "Add or remove embedded files (attachments) to/from a PDF" + }, + "watermark": { + "tags": "stamp,mark,overlay", + "title": "Tambahkan watermark", + "desc": "Menambahkan watermark khusus ke dokumen PDF Anda." + }, + "removePassword": { + "tags": "unlock", + "title": "Hapus Kata Sandi", + "desc": "Menghapus perlindungan kata sandi dari dokumen PDF Anda." + }, + "compress": { + "tags": "shrink,reduce,optimize", + "title": "Kompres", + "desc": "Kompres PDF untuk mengurangi ukuran berkas." + }, + "unlockPDFForms": { + "tags": "unlock,enable,edit", + "title": "Unlock PDF Forms", + "desc": "Remove read-only property of form fields in a PDF document." + }, + "changeMetadata": { + "tags": "edit,modify,update", + "title": "Ubah Metadata", + "desc": "Mengubah/Menghapus/Menambahkan metadata dari dokumen PDF" + }, + "ocr": { + "tags": "extract,scan", + "title": "Pemindaian/Pembersihan OCR", + "desc": "Memindai dan mendeteksi teks dari gambar di dalam PDF dan menambahkannya kembali sebagai teks." + }, + "extractImages": { + "tags": "pull,save,export", + "title": "Ekstrak Gambar", + "desc": "Mengekstrak semua gambar dari PDF dan menyimpannya ke zip" + }, + "scannerImageSplit": { + "tags": "detect,split,photos", + "title": "Detect & Split Scanned Photos", + "desc": "Detect and split scanned photos into separate pages" + }, + "sign": { + "tags": "signature,autograph", + "title": "Tanda Tangan", + "desc": "Menambahkan tanda tangan ke PDF dengan gambar, teks, atau gambar" + }, + "flatten": { + "tags": "simplify,remove,interactive", + "title": "Meratakan", + "desc": "Menghapus semua elemen dan formulir interaktif dari PDF" + }, + "certSign": { + "tags": "authenticate,PEM,P12,official,encrypt,sign,certificate,PKCS12,JKS,server,manual,auto", + "title": "Tanda tangani dengan Sertifikat", + "desc": "Menandatangani PDF dengan Certificate/Key (PEM/P12)" + }, + "repair": { + "tags": "fix,restore", + "title": "Perbaikan", + "desc": "Melakukan perbaikan PDF yang rusak/rusak" + }, + "removeBlanks": { + "tags": "delete,clean,empty", + "title": "Menghapus halaman kosong", + "desc": "Mendeteksi dan menghapus halaman kosong dari dokumen" + }, + "removeAnnotations": { + "tags": "delete,clean,strip", + "title": "Menghapus Anotasi", + "desc": "Menghapus semua komentar/anotasi dari PDF" + }, + "compare": { + "tags": "difference", + "title": "Bandingkan", + "desc": "Membandingkan dan menunjukkan perbedaan antara 2 Dokumen PDF" + }, + "removeCertSign": { + "tags": "remove,delete,unlock", + "title": "Hapus Tanda Tangan Sertifikat", + "desc": "Hapus tanda tangan sertifikat dari PDF" + }, + "pageLayout": { + "tags": "layout,arrange,combine", + "title": "Tata Letak Multi-Halaman", + "desc": "Menggabungkan beberapa halaman dokumen PDF menjadi satu halaman" + }, + "bookletImposition": { + "tags": "booklet,print,binding", + "title": "Booklet Imposition", + "desc": "Create booklets with proper page ordering and multi-page layout for printing and binding" + }, + "scalePages": { + "tags": "resize,adjust,scale", + "title": "Menyesuaikan ukuran/skala halaman", + "desc": "Mengubah ukuran/skala halaman dan/atau isinya." + }, + "addPageNumbers": { + "tags": "number,pagination,count", + "title": "Tambahkan Nomor Halaman", + "desc": "Menambahkan nomor Halaman di seluruh dokumen di lokasi yang ditetapkan" + }, + "autoRename": { + "tags": "auto-detect,header-based,organize,relabel", + "title": "Auto Rename PDF File", + "desc": "Auto renames a PDF file based on its detected header" + }, + "adjustContrast": { + "tags": "contrast,brightness,saturation", + "title": "Menyesuaikan Warna/Kontras", + "desc": "Sesuaikan Kontras, Saturasi, dan Kecerahan PDF" + }, + "crop": { + "tags": "trim,cut,resize", + "title": "Pangkas PDF", + "desc": "Pangkas PDF untuk memperkecil ukurannya (mempertahankan teks!)" + }, + "autoSplitPDF": { + "tags": "auto,split,QR", + "title": "Membagi Halaman Secara Otomatis", + "desc": "Membagi PDF yang dipindai secara otomatis dengan Kode QR pembagi halaman yang dipindai secara fisik" + }, + "sanitize": { + "tags": "clean,purge,remove", + "title": "Sanitise", + "desc": "Remove potentially harmful elements from PDF files" + }, + "getPdfInfo": { + "tags": "info,metadata,details", + "title": "Dapatkan Semua Info tentang PDF", + "desc": "Mengambil setiap dan semua informasi yang mungkin ada pada PDF" + }, + "pdfToSinglePage": { + "tags": "combine,merge,single", + "title": "PDF ke Satu Halaman Besar", + "desc": "Menggabungkan semua halaman PDF menjadi satu halaman besar" + }, + "showJS": { + "tags": "javascript,code,script", + "title": "Tampilkan Javascript", + "desc": "Mencari dan menampilkan JS apa pun yang disuntikkan ke dalam PDF" + }, + "redact": { + "tags": "censor,blackout,hide", + "title": "Manual Redaction", + "desc": "Redacts a PDF based on selected text, drawn shapes and/or selected page(s)" + }, + "splitBySections": { + "tags": "split,sections,divide", + "title": "Split PDF by Sections", + "desc": "Divide each page of a PDF into smaller horizontal and vertical sections" + }, + "addStamp": { + "tags": "stamp,mark,seal", + "title": "Add Stamp to PDF", + "desc": "Add text or add image stamps at set locations" + }, + "removeImage": { + "tags": "remove,delete,clean", + "title": "Hapus Gambar", + "desc": "Hapus gambar dari PDF untuk mengurangi ukuran file" + }, + "splitByChapters": { + "tags": "split,chapters,structure", + "title": "Pisahkan PDF berdasarkan Bab", + "desc": "Memisahkan PDF menjadi beberapa file berdasarkan struktur babnya." + }, + "validateSignature": { + "tags": "validate,verify,certificate", + "title": "Validate PDF Signature", + "desc": "Verify digital signatures and certificates in PDF documents" + }, + "swagger": { + "tags": "API,documentation,test", + "title": "API Documentation", + "desc": "View API documentation and test endpoints" + }, + "scannerEffect": { + "tags": "scan,simulate,create", + "title": "Scanner Effect", + "desc": "Create a PDF that looks like it was scanned" + }, + "editTableOfContents": { + "tags": "bookmarks,contents,edit", + "title": "Edit Table of Contents", + "desc": "Add or edit bookmarks and table of contents in PDF documents" + }, + "manageCertificates": { + "tags": "certificates,import,export", + "title": "Manage Certificates", + "desc": "Import, export, or delete digital certificate files used for signing PDFs." + }, + "read": { + "tags": "view,open,display", + "title": "Read", + "desc": "View and annotate PDFs. Highlight text, draw, or insert comments for review and collaboration." + }, + "reorganizePages": { + "tags": "rearrange,reorder,organize", + "title": "Reorganize Pages", + "desc": "Rearrange, duplicate, or delete PDF pages with visual drag-and-drop control." + }, + "extractPages": { + "tags": "pull,select,copy", + "title": "Ekstrak Halaman", + "desc": "Extract specific pages from a PDF document" + }, + "removePages": { + "tags": "delete,extract,exclude", + "title": "Menghapus", + "desc": "Menghapus halaman yang tidak diinginkan dari dokumen PDF Anda." + }, + "autoSizeSplitPDF": { + "tags": "auto,split,size", + "title": "Pemisahan Otomatis berdasarkan Ukuran/Hitungan", + "desc": "Membagi satu PDF menjadi beberapa dokumen berdasarkan ukuran, jumlah halaman, atau jumlah dokumen" + }, + "replaceColor": { + "title": "Replace & Invert Colour", + "desc": "Replace or invert colours in PDF documents" + }, + "devApi": { + "tags": "API,development,documentation", + "title": "API", + "desc": "Link to API documentation" + }, + "devFolderScanning": { + "tags": "automation,folder,scanning", + "title": "Automated Folder Scanning", + "desc": "Link to automated folder scanning guide" + }, + "devSsoGuide": { + "title": "SSO Guide", + "desc": "Link to SSO guide" + }, + "devAirgapped": { + "title": "Air-gapped Setup", + "desc": "Link to air-gapped setup guide" + }, + "addPassword": { + "title": "Tambahkan Kata Sandi", + "desc": "Enkripsi dokumen PDF Anda dengan kata sandi." + }, + "changePermissions": { + "title": "Ganti Perizinan", + "desc": "Change document restrictions and permissions" + }, + "automate": { + "tags": "workflow,sequence,automation", + "title": "Automate", + "desc": "Build multi-step workflows by chaining together PDF actions. Ideal for recurring tasks." + }, + "overlay-pdfs": { + "desc": "Menumpuk PDF di atas PDF lain", + "title": "Tumpuk PDF" + }, "imageToPDF": { "title": "Gambar ke PDF", "desc": "Mengonversi gambar (PNG, JPEG, GIF) ke PDF." @@ -355,18 +786,6 @@ "title": "PDF ke Gambar", "desc": "Mengonversi PDF ke gambar. (PNG, JPEG, GIF)" }, - "pdfOrganiser": { - "title": "Mengatur", - "desc": "Menghapus/Mengatur ulang halaman dalam urutan apa pun" - }, - "addImage": { - "title": "Tambahkan gambar", - "desc": "Menambahkan gambar ke lokasi yang ditentukan pada PDF" - }, - "watermark": { - "title": "Tambahkan watermark", - "desc": "Menambahkan watermark khusus ke dokumen PDF Anda." - }, "permissions": { "title": "Izin Perubahan", "desc": "Mengubah izin dokumen PDF Anda" @@ -375,38 +794,10 @@ "title": "Menghapus", "desc": "Menghapus halaman yang tidak diinginkan dari dokumen PDF Anda." }, - "addPassword": { - "title": "Tambahkan Kata Sandi", - "desc": "Enkripsi dokumen PDF Anda dengan kata sandi." - }, - "removePassword": { - "title": "Hapus Kata Sandi", - "desc": "Menghapus perlindungan kata sandi dari dokumen PDF Anda." - }, - "compress": { - "title": "Kompres", - "desc": "Kompres PDF untuk mengurangi ukuran berkas." - }, - "unlockPDFForms": { - "title": "Unlock PDF Forms", - "desc": "Remove read-only property of form fields in a PDF document." - }, - "changeMetadata": { - "title": "Ubah Metadata", - "desc": "Mengubah/Menghapus/Menambahkan metadata dari dokumen PDF" - }, "fileToPDF": { "title": "Mengonversi berkas ke PDF", "desc": "Mengonversi hampir semua berkas ke PDF (DOCX, PNG, XLS, PPT, TXT dan lain-lain)" }, - "ocr": { - "title": "Pemindaian/Pembersihan OCR", - "desc": "Memindai dan mendeteksi teks dari gambar di dalam PDF dan menambahkannya kembali sebagai teks." - }, - "extractImages": { - "title": "Ekstrak Gambar", - "desc": "Mengekstrak semua gambar dari PDF dan menyimpannya ke zip" - }, "pdfToPDFA": { "title": "PDF ke PDF/A", "desc": "Konversi PDF ke PDF/A untuk penyimpanan jangka panjang" @@ -435,70 +826,14 @@ "title": "Mendeteksi/Memisahkan foto yang dipindai", "desc": "Memisahkan beberapa foto dari dalam sebuah foto/PDF" }, - "sign": { - "title": "Tanda Tangan", - "desc": "Menambahkan tanda tangan ke PDF dengan gambar, teks, atau gambar" - }, - "flatten": { - "title": "Meratakan", - "desc": "Menghapus semua elemen dan formulir interaktif dari PDF" - }, - "repair": { - "title": "Perbaikan", - "desc": "Melakukan perbaikan PDF yang rusak/rusak" - }, - "removeBlanks": { - "title": "Menghapus halaman kosong", - "desc": "Mendeteksi dan menghapus halaman kosong dari dokumen" - }, - "removeAnnotations": { - "title": "Menghapus Anotasi", - "desc": "Menghapus semua komentar/anotasi dari PDF" - }, - "compare": { - "title": "Bandingkan", - "desc": "Membandingkan dan menunjukkan perbedaan antara 2 Dokumen PDF" - }, - "certSign": { - "title": "Tanda tangani dengan Sertifikat", - "desc": "Menandatangani PDF dengan Certificate/Key (PEM/P12)" - }, - "removeCertSign": { - "title": "Hapus Tanda Tangan Sertifikat", - "desc": "Hapus tanda tangan sertifikat dari PDF" - }, - "pageLayout": { - "title": "Tata Letak Multi-Halaman", - "desc": "Menggabungkan beberapa halaman dokumen PDF menjadi satu halaman" - }, - "scalePages": { - "title": "Menyesuaikan ukuran/skala halaman", - "desc": "Mengubah ukuran/skala halaman dan/atau isinya." - }, "pipeline": { "title": "Pipeline", "desc": "Menjalankan beberapa tindakan pada PDF dengan mendefinisikan skrip pipeline" }, - "addPageNumbers": { - "title": "Tambahkan Nomor Halaman", - "desc": "Menambahkan nomor Halaman di seluruh dokumen di lokasi yang ditetapkan" - }, "auto-rename": { "title": "Ubah Nama Berkas PDF Secara Otomatis", "desc": "Mengganti nama berkas PDF secara otomatis berdasarkan tajuk yang terdeteksi" }, - "adjustContrast": { - "title": "Menyesuaikan Warna/Kontras", - "desc": "Sesuaikan Kontras, Saturasi, dan Kecerahan PDF" - }, - "crop": { - "title": "Pangkas PDF", - "desc": "Pangkas PDF untuk memperkecil ukurannya (mempertahankan teks!)" - }, - "autoSplitPDF": { - "title": "Membagi Halaman Secara Otomatis", - "desc": "Membagi PDF yang dipindai secara otomatis dengan Kode QR pembagi halaman yang dipindai secara fisik" - }, "sanitizePDF": { "title": "Sanitasi", "desc": "Menghapus skrip dan elemen lain dari file PDF" @@ -519,30 +854,14 @@ "title": "PDF to Markdown", "desc": "Converts any PDF to Markdown" }, - "getPdfInfo": { - "title": "Dapatkan Semua Info tentang PDF", - "desc": "Mengambil setiap dan semua informasi yang mungkin ada pada PDF" - }, "pageExtracter": { "title": "Ekstrak halaman", "desc": "Mengekstrak halaman tertentu dari PDF" }, - "pdfToSinglePage": { - "title": "PDF ke Satu Halaman Besar", - "desc": "Menggabungkan semua halaman PDF menjadi satu halaman besar" - }, - "showJS": { - "title": "Tampilkan Javascript", - "desc": "Mencari dan menampilkan JS apa pun yang disuntikkan ke dalam PDF" - }, "autoRedact": { "title": "Redaksional Otomatis", "desc": "Menyunting Otomatis (Menghitamkan) teks dalam PDF berdasarkan teks masukan" }, - "redact": { - "title": "Manual Redaction", - "desc": "Redacts a PDF based on selected text, drawn shapes and/or selected page(s)" - }, "PDFToCSV": { "title": "PDF ke CSV", "desc": "Mengekstrak Tabel dari PDF yang mengonversinya menjadi CSV" @@ -551,10 +870,6 @@ "title": "Pemisahan Otomatis berdasarkan Ukuran/Hitungan", "desc": "Membagi satu PDF menjadi beberapa dokumen berdasarkan ukuran, jumlah halaman, atau jumlah dokumen" }, - "overlay-pdfs": { - "title": "Tumpuk PDF", - "desc": "Menumpuk PDF di atas PDF lain" - }, "split-by-sections": { "title": "Membagi PDF berdasarkan Bagian", "desc": "Membagi setiap halaman PDF menjadi beberapa bagian horizontal dan vertikal yang lebih kecil" @@ -563,43 +878,17 @@ "title": "Tambahkan Tanda Tangan ke PDF", "desc": "Tambahkan teks atau gambar tanda tangan di lokasi yang ditentukan" }, - "removeImage": { - "title": "Hapus Gambar", - "desc": "Hapus gambar dari PDF untuk mengurangi ukuran file" - }, - "splitByChapters": { - "title": "Pisahkan PDF berdasarkan Bab", - "desc": "Memisahkan PDF menjadi beberapa file berdasarkan struktur babnya." - }, - "validateSignature": { - "title": "Validate PDF Signature", - "desc": "Verify digital signatures and certificates in PDF documents" - }, "replace-color": { "title": "Ganti dan Inversi Warna", "desc": "Ganti warna untuk teks dan latar belakang dalam PDF dan inversi seluruh warna PDF untuk mengurangi ukuran file" }, - "convert": { - "title": "Konversi" - }, "attachments": { "title": "Add attachments" }, - "extractPages": { - "title": "Ekstrak Halaman" - }, - "removePages": { - "title": "Menghapus", - "desc": "Menghapus halaman yang tidak diinginkan dari dokumen PDF Anda." - }, "removeImagePdf": { "title": "Hapus Gambar", "desc": "Hapus gambar dari PDF untuk mengurangi ukuran file" }, - "autoSizeSplitPDF": { - "title": "Pemisahan Otomatis berdasarkan Ukuran/Hitungan", - "desc": "Membagi satu PDF menjadi beberapa dokumen berdasarkan ukuran, jumlah halaman, atau jumlah dokumen" - }, "adjust-contrast": { "title": "Menyesuaikan Warna/Kontras", "desc": "Sesuaikan Kontras, Saturasi, dan Kecerahan PDF" @@ -607,11 +896,12 @@ "replaceColorPdf": { "title": "Ganti dan Inversi Warna", "desc": "Ganti warna untuk teks dan latar belakang dalam PDF dan inversi seluruh warna PDF untuk mengurangi ukuran file" - }, - "changePermissions": { - "title": "Ganti Perizinan" } }, + "landing": { + "addFiles": "Add Files", + "uploadFromComputer": "Upload from computer" + }, "viewPdf": { "tags": "melihat,membaca,membuat anotasi,teks,gambar", "title": "View/Edit PDF", @@ -645,17 +935,39 @@ "merge": { "tags": "menggabungkan,Pengoperasian halaman,Back end,sisi server", "title": "Gabungkan", + "removeDigitalSignature": { + "label": "Remove digital signature in the merged file?", + "tooltip": { + "title": "Remove Digital Signature", + "description": "Digital signatures will be invalidated when merging files. Check this to remove them from the final merged PDF." + } + }, + "generateTableOfContents": { + "label": "Generate table of contents in the merged file?", + "tooltip": { + "title": "Generate Table of Contents", + "description": "Automatically creates a clickable table of contents in the merged PDF based on the original file names and page numbers." + } + }, + "submit": "Gabungkan", + "sortBy": { + "description": "Files will be merged in the order they're selected. Drag to reorder or sort below.", + "label": "Sort By", + "filename": "Nama Berkas", + "dateModified": "Date Modified", + "ascending": "Ascending", + "descending": "Descending", + "sort": "Sort" + }, + "error": { + "failed": "An error occurred while merging the PDFs." + }, "header": "Gabungkan beberapa PDFs (2+)", "sortByName": "Sortir berdasarkan nama", "sortByDate": "Sortir berdasrkan tanggal", - "removeCertSign": "Hapus tanda tangan digital dalam file yang dicampur?", - "submit": "Gabungkan", - "sortBy": { - "filename": "Nama Berkas" - } + "removeCertSign": "Hapus tanda tangan digital dalam file yang dicampur?" }, "split": { - "tags": "Pengoperasian halaman,membagi,Multi Halaman,memotong,sisi server", "title": "Membagi PDF", "header": "Membagi PDF", "desc": { @@ -671,25 +983,249 @@ "splitPages": "Masukkan halaman yang akan dipisah:", "submit": "Pisahkan", "steps": { + "chooseMethod": "Choose Method", "settings": "Pengaturan" }, + "settings": { + "selectMethodFirst": "Please select a split method first" + }, + "error": { + "failed": "An error occurred while splitting the PDF." + }, + "method": { + "label": "Choose split method", + "placeholder": "Select how to split the PDF" + }, "methods": { + "prefix": { + "splitAt": "Split at", + "splitBy": "Split by" + }, + "byPages": { + "name": "Page Numbers", + "desc": "Extract specific pages (1,3,5-10)", + "tooltip": "Enter page numbers separated by commas or ranges with hyphens" + }, + "bySections": { + "name": "Sections", + "desc": "Divide pages into grid sections", + "tooltip": "Split each page into horizontal and vertical sections" + }, "bySize": { - "name": "Ukuran Berkas" + "name": "Ukuran Berkas", + "desc": "Limit maximum file size", + "tooltip": "Specify maximum file size (e.g. 10MB, 500KB)" + }, + "byPageCount": { + "name": "Page Count", + "desc": "Fixed pages per file", + "tooltip": "Enter the number of pages for each split file" + }, + "byDocCount": { + "name": "Document Count", + "desc": "Create specific number of files", + "tooltip": "Enter how many files you want to create" + }, + "byChapters": { + "name": "Chapters", + "desc": "Split at bookmark boundaries", + "tooltip": "Uses PDF bookmarks to determine split points" + }, + "byPageDivider": { + "name": "Page Divider", + "desc": "Auto-split with divider sheets", + "tooltip": "Use QR code divider sheets between documents when scanning" } }, "value": { "fileSize": { - "label": "Ukuran Berkas" + "label": "Ukuran Berkas", + "placeholder": "e.g. 10MB, 500KB" + }, + "pageCount": { + "label": "Pages per File", + "placeholder": "e.g. 5, 10" + }, + "docCount": { + "label": "Number of Files", + "placeholder": "e.g. 3, 5" } - } + }, + "tooltip": { + "header": { + "title": "Split Methods Overview" + }, + "byPages": { + "title": "Split at Page Numbers", + "text": "Split your PDF at specific page numbers. Using 'n' splits after page n. Using 'n-m' splits before page n and after page m.", + "bullet1": "Single split points: 3,7 (splits after pages 3 and 7)", + "bullet2": "Range split points: 3-8 (splits before page 3 and after page 8)", + "bullet3": "Mixed: 2,5-10,15 (splits after page 2, before page 5, after page 10, and after page 15)" + }, + "bySections": { + "title": "Split by Grid Sections", + "text": "Divide each page into a grid of sections. Useful for splitting documents with multiple columns or extracting specific areas.", + "bullet1": "Horizontal: Number of rows to create", + "bullet2": "Vertical: Number of columns to create", + "bullet3": "Merge: Combine all sections into one PDF" + }, + "bySize": { + "title": "Split by File Size", + "text": "Create multiple PDFs that don't exceed a specified file size. Ideal for file size limitations or email attachments.", + "bullet1": "Use MB for larger files (e.g., 10MB)", + "bullet2": "Use KB for smaller files (e.g., 500KB)", + "bullet3": "System will split at page boundaries" + }, + "byCount": { + "title": "Split by Count", + "text": "Create multiple PDFs with a specific number of pages or documents each.", + "bullet1": "Page Count: Fixed number of pages per file", + "bullet2": "Document Count: Fixed number of output files", + "bullet3": "Useful for batch processing workflows" + }, + "byChapters": { + "title": "Split by Chapters", + "text": "Use PDF bookmarks to automatically split at chapter boundaries. Requires PDFs with bookmark structure.", + "bullet1": "Bookmark Level: Which level to split on (1=top level)", + "bullet2": "Include Metadata: Preserve document properties", + "bullet3": "Allow Duplicates: Handle repeated bookmark names" + }, + "byDocCount": { + "bullet1": "Enter the number of output files you want", + "bullet2": "Pages are distributed as evenly as possible", + "bullet3": "Useful when you need a specific number of files", + "text": "Create a specific number of output files by evenly distributing pages across them.", + "title": "Split by Document Count" + }, + "byPageCount": { + "bullet1": "Enter the number of pages per output file", + "bullet2": "Last file may have fewer pages if not evenly divisible", + "bullet3": "Useful for batch processing workflows", + "text": "Create multiple PDFs with a specific number of pages each. Perfect for creating uniform document chunks.", + "title": "Split by Page Count" + }, + "byPageDivider": { + "bullet1": "Print divider sheets from the download link", + "bullet2": "Insert divider sheets between your documents", + "bullet3": "Scan all documents together as one PDF", + "bullet4": "Upload - divider pages are automatically detected and removed", + "bullet5": "Enable Duplex Mode if scanning both sides of divider sheets", + "text": "Automatically split scanned documents using physical divider sheets with QR codes. Perfect for processing multiple documents scanned together.", + "title": "Split by Page Divider" + } + }, + "methodSelection": { + "tooltip": { + "bullet1": "Click on a method card to select it", + "bullet2": "Hover over each card to see a quick description", + "bullet3": "The settings step will appear after you select a method", + "bullet4": "You can change methods at any time before processing", + "header": { + "text": "Choose how you want to split your PDF document. Each method is optimized for different use cases and document types.", + "title": "Split Method Selection" + }, + "title": "Choose Your Split Method" + } + }, + "selectMethod": "Select a split method", + "tags": "Pengoperasian halaman,membagi,Multi Halaman,memotong,sisi server" }, "rotate": { - "tags": "sisi server", "title": "Rotasi PDF", + "submit": "Rotasi", + "selectRotation": "Select Rotation Angle (Clockwise)", + "error": { + "failed": "An error occurred while rotating the PDF." + }, + "preview": { + "title": "Rotation Preview" + }, + "rotateLeft": "Rotate Anticlockwise", + "rotateRight": "Rotate Clockwise", + "tooltip": { + "header": { + "title": "Rotate Settings Overview" + }, + "description": { + "text": "Rotate your PDF pages clockwise or anticlockwise in 90-degree increments. All pages in the PDF will be rotated. The preview shows how your document will look after rotation." + }, + "controls": { + "title": "Controls", + "text": "Use the rotation buttons to adjust orientation. Left button rotates anticlockwise, right button rotates clockwise. Each click rotates by 90 degrees." + } + }, + "tags": "sisi server", "header": "Rotasi PDF", - "selectAngle": "Pilih sudut rotasi (dalam kelipatan 90 derajat):", - "submit": "Rotasi" + "selectAngle": "Pilih sudut rotasi (dalam kelipatan 90 derajat):" + }, + "convert": { + "title": "Konversi", + "desc": "Convert files between different formats", + "files": "Files", + "selectFilesPlaceholder": "Select files in the main view to get started", + "settings": "Pengaturan", + "conversionCompleted": "Conversion completed", + "results": "Results", + "defaultFilename": "converted_file", + "conversionResults": "Conversion Results", + "convertFrom": "Convert from", + "convertTo": "Convert to", + "sourceFormatPlaceholder": "Source format", + "targetFormatPlaceholder": "Target format", + "selectSourceFormatFirst": "Select a source format first", + "outputOptions": "Output Options", + "pdfOptions": "PDF Options", + "imageOptions": "Image Options", + "colorType": "Colour Type", + "color": "Warna", + "greyscale": "Skala abu-abu", + "blackwhite": "Black & White", + "dpi": "DPI", + "output": "Output", + "single": "Single", + "multiple": "Multiple", + "fitOption": "Fit Option", + "maintainAspectRatio": "Maintain Aspect Ratio", + "fitDocumentToPage": "Fit Document to Page", + "fillPage": "Isi Halaman", + "autoRotate": "Auto Rotate", + "autoRotateDescription": "Automatically rotate images to better fit the PDF page", + "combineImages": "Combine Images", + "combineImagesDescription": "Combine all images into one PDF, or create separate PDFs for each image", + "webOptions": "Web to PDF Options", + "zoomLevel": "Zoom Level", + "emailOptions": "Email to PDF Options", + "includeAttachments": "Include email attachments", + "maxAttachmentSize": "Maximum attachment size (MB)", + "includeAllRecipients": "Include CC and BCC recipients in header", + "downloadHtml": "Download HTML intermediate file instead of PDF", + "pdfaOptions": "PDF/A Options", + "outputFormat": "Output Format", + "pdfaNote": "PDF/A-1b is more compatible, PDF/A-2b supports more features.", + "pdfaDigitalSignatureWarning": "PDF ini mengandung tanda tangan digital. Ini akan dihapus pada langkah berikutnya.", + "fileFormat": "File Format", + "wordDoc": "Word Document", + "wordDocExt": "Word Document (.docx)", + "odtExt": "OpenDocument Text (.odt)", + "pptExt": "PowerPoint (.pptx)", + "odpExt": "OpenDocument Presentation (.odp)", + "txtExt": "Plain Text (.txt)", + "rtfExt": "Rich Text Format (.rtf)", + "selectedFiles": "Selected files", + "noFileSelected": "No file selected. Use the file panel to add files.", + "convertFiles": "Convert Files", + "converting": "Converting...", + "downloadConverted": "Download Converted File", + "errorNoFiles": "Please select at least one file to convert.", + "errorNoFormat": "Please select both source and target formats.", + "errorNotSupported": "Conversion from {{from}} to {{to}} is not supported.", + "images": "Images", + "officeDocs": "Office Documents (Word, Excel, PowerPoint)", + "imagesExt": "Images (JPG, PNG, etc.)", + "markdown": "Markdown", + "textRtf": "Text/RTF", + "grayscale": "Skala abu-abu", + "errorConversion": "An error occurred while converting the file." }, "imageToPdf": { "tags": "konversi,img,jpg,gambar,foto" @@ -727,7 +1263,33 @@ "8": "Hapus Terakhir", "9": "Hapus Pertama dan Terakhir", "10": "Penggabungan Genap-Ganjil", - "11": "Duplicate all pages" + "11": "Duplicate all pages", + "desc": { + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, â€Ļ).", + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, â€Ļ).", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimized for binding on the side)." + } + }, + "desc": { + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, â€Ļ).", + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, â€Ļ).", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimised for binding on the side).", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document." }, "placeholder": "(misalnya 1,3,2 atau 4-8,2,10-12 atau 2n-1)" }, @@ -739,9 +1301,198 @@ "upload": "Tambahkan Gambar", "submit": "Tambahkan Gambar" }, + "attachments": { + "tags": "embed,attach,file,attachment,attachments", + "title": "Add attachments", + "header": "Add attachments", + "add": "Add Attachment", + "remove": "Remove Attachment", + "embed": "Embed Attachment", + "submit": "Add attachments" + }, "watermark": { - "tags": "Teks,berulang,label,sendiri,hak cipta,watermark,img,jpg,picture,photo", "title": "Tambahkan Watermark", + "desc": "Add text or image watermarks to PDF files", + "completed": "Watermark added", + "submit": "Tambahkan Watermark", + "filenamePrefix": "watermarked", + "error": { + "failed": "An error occurred while adding watermark to the PDF." + }, + "watermarkType": { + "text": "Teks", + "image": "Image" + }, + "settings": { + "type": "Watermark Type", + "text": { + "label": "Watermark Text", + "placeholder": "Enter watermark text" + }, + "image": { + "label": "Watermark Image", + "choose": "Choose Image", + "selected": "Selected: {{filename}}" + }, + "fontSize": "Ukuran Fonta", + "size": "Size", + "alphabet": "Font/Language", + "color": "Watermark Colour", + "rotation": "Rotation (degrees)", + "opacity": "Opacity (%)", + "spacing": { + "horizontal": "Horizontal Spacing", + "vertical": "Vertical Spacing", + "height": "Height Spacing", + "width": "Width Spacing" + }, + "convertToImage": "Flatten PDF pages to images" + }, + "alphabet": { + "roman": "Roman/Latin", + "arabic": "Arabic", + "japanese": "Japanese", + "korean": "Korean", + "chinese": "Chinese", + "thai": "Thai" + }, + "steps": { + "type": "Watermark Type", + "wording": "Wording", + "textStyle": "Style", + "formatting": "Formatting", + "file": "Watermark File" + }, + "results": { + "title": "Watermark Results" + }, + "tooltip": { + "language": { + "title": "Language Support", + "text": "Choose the appropriate language setting to ensure proper font rendering for your text." + }, + "appearance": { + "title": "Appearance Settings", + "text": "Control how your watermark looks and blends with the document.", + "bullet1": "Rotation: -360° to 360° for angled watermarks", + "bullet2": "Opacity: 0-100% for transparency control", + "bullet3": "Lower opacity creates subtle watermarks" + }, + "spacing": { + "title": "Spacing Control", + "text": "Adjust the spacing between repeated watermarks across the page.", + "bullet1": "Width spacing: Horizontal distance between watermarks", + "bullet2": "Height spacing: Vertical distance between watermarks", + "bullet3": "Higher values create more spread out patterns" + }, + "type": { + "header": { + "title": "Watermark Type Selection" + }, + "description": { + "title": "Choose Your Watermark", + "text": "Select between text or image watermarks based on your needs." + }, + "text": { + "title": "Text Watermarks", + "text": "Perfect for adding copyright notices, company names, or confidentiality labels. Supports multiple languages and custom colours.", + "bullet1": "Customisable fonts and languages", + "bullet2": "Adjustable colours and transparency", + "bullet3": "Ideal for legal or branding text" + }, + "image": { + "title": "Image Watermarks", + "text": "Use logos, stamps, or any image as a watermark. Great for branding and visual identification.", + "bullet1": "Upload any image format", + "bullet2": "Maintains image quality", + "bullet3": "Perfect for logos and stamps" + } + }, + "wording": { + "header": { + "title": "Text Content" + }, + "text": { + "title": "Watermark Text", + "text": "Enter the text that will appear as your watermark across the document.", + "bullet1": "Keep it concise for better readability", + "bullet2": "Common examples: 'CONFIDENTIAL', 'DRAFT', company name", + "bullet3": "Emoji characters are not supported and will be filtered out" + } + }, + "textStyle": { + "header": { + "title": "Text Style" + }, + "color": { + "title": "Colour Selection", + "text": "Choose a colour that provides good contrast with your document content.", + "bullet1": "Light grey (#d3d3d3) for subtle watermarks", + "bullet2": "Black or dark colours for high contrast", + "bullet3": "Custom colours for branding purposes" + }, + "language": { + "title": "Language Support", + "text": "Choose the appropriate language setting to ensure proper font rendering." + } + }, + "file": { + "header": { + "title": "Image Upload" + }, + "upload": { + "title": "Image Selection", + "text": "Upload an image file to use as your watermark.", + "bullet1": "Supports common formats: PNG, JPG, GIF, BMP", + "bullet2": "PNG with transparency works best", + "bullet3": "Higher resolution images maintain quality better" + }, + "recommendations": { + "title": "Best Practices", + "text": "Tips for optimal image watermark results.", + "bullet1": "Use logos or stamps with transparent backgrounds", + "bullet2": "Simple designs work better than complex images", + "bullet3": "Consider the final document size when choosing resolution" + } + }, + "formatting": { + "header": { + "title": "Formatting & Layout" + }, + "size": { + "title": "Size Control", + "text": "Adjust the size of your watermark (text or image).", + "bullet1": "Larger sizes create more prominent watermarks" + }, + "appearance": { + "title": "Appearance Settings", + "text": "Control how your watermark looks and blends with the document.", + "bullet1": "Rotation: -360° to 360° for angled watermarks", + "bullet2": "Opacity: 0-100% for transparency control", + "bullet3": "Lower opacity creates subtle watermarks" + }, + "spacing": { + "title": "Spacing Control", + "text": "Adjust the spacing between repeated watermarks across the page.", + "bullet1": "Horizontal spacing: Distance between watermarks left to right", + "bullet2": "Vertical spacing: Distance between watermarks top to bottom", + "bullet3": "Higher values create more spread out patterns" + }, + "security": { + "title": "Security Option", + "text": "Convert the final PDF to an image-based format for enhanced security.", + "bullet1": "Prevents text selection and copying", + "bullet2": "Makes watermarks harder to remove", + "bullet3": "Results in larger file sizes", + "bullet4": "Best for sensitive or copyrighted content" + } + } + }, + "type": { + "1": "Teks", + "2": "Gambar" + }, + "tags": "Teks,berulang,label,sendiri,hak cipta,watermark,img,jpg,picture,photo", "header": "Tambahkan Watermark", "customColor": "Warna Teks Kustom", "selectText": { @@ -755,17 +1506,6 @@ "8": "Tipe Watermark:", "9": "Gambar Watermark:", "10": "Konversi PDF ke PDF-Image" - }, - "submit": "Tambahkan Watermark", - "type": { - "1": "Teks", - "2": "Gambar" - }, - "watermarkType": { - "text": "Teks" - }, - "settings": { - "fontSize": "Ukuran Fonta" } }, "permissions": { @@ -790,50 +1530,201 @@ "removePages": { "tags": "Menghapus halaman,menghapus halaman", "title": "Menghapus", + "pageNumbers": { + "label": "Pages to Remove", + "placeholder": "e.g., 1,3,5-8,10", + "error": "Invalid page number format. Use numbers, ranges (1-5), or mathematical expressions (2n+1)" + }, + "filenamePrefix": "pages_removed", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "settings": { + "title": "Settings" + }, + "tooltip": { + "header": { + "title": "Remove Pages Settings" + }, + "pageNumbers": { + "title": "Page Selection", + "text": "Specify which pages to remove from your PDF. You can select individual pages, ranges, or use mathematical expressions.", + "bullet1": "Individual pages: 1,3,5 (removes pages 1, 3, and 5)", + "bullet2": "Page ranges: 1-5,10-15 (removes pages 1-5 and 10-15)", + "bullet3": "Mathematical: 2n+1 (removes odd pages)", + "bullet4": "Open ranges: 5- (removes from page 5 to end)" + }, + "examples": { + "title": "Common Examples", + "text": "Here are some common page selection patterns:", + "bullet1": "Remove first page: 1", + "bullet2": "Remove last 3 pages: -3", + "bullet3": "Remove every other page: 2n", + "bullet4": "Remove specific scattered pages: 1,5,10,15" + }, + "safety": { + "title": "Safety Tips", + "text": "Important considerations when removing pages:", + "bullet1": "Always preview your selection before processing", + "bullet2": "Keep a backup of your original file", + "bullet3": "Page numbers start from 1, not 0", + "bullet4": "Invalid page numbers will be ignored" + } + }, + "error": { + "failed": "An error occurred whilst removing pages." + }, + "results": { + "title": "Page Removal Results" + }, "submit": "Menghapus" }, - "addPassword": { - "tags": "aman,Keamanan", - "title": "Tambahkan kata sandi", - "header": "Tambahkan kata sandi (Enkrip)", - "selectText": { - "1": "Pilih PDF untuk enkripsi", - "2": "Kata sandi Pengguna", - "3": "Panjang kunci enkripsi", - "4": "Nilai yang lebih tinggi lebih kuat, tetapi nilai yang lebih rendah memiliki kompatibilitas yang lebih baik.", - "5": "Perizinan untuk diubah (Disarankan untuk digunakan bersama dengan kata sandi Pemilik)", - "6": "Pencegahan untuk penyusunan dokumen", - "7": "Pencegahan untuk ekstraksi konten", - "8": "Pencegahan ekstraksi untuk aksesibilitas", - "9": "Pencegahan untuk mengisi formulir", - "10": "Pencegahan untuk pengubahan", - "11": "Pencegahan untuk perubahan anotasi", - "12": "Pencegahan untuk mencetak", - "13": "Pencegahan untuk mencetak format yang berbeda", - "14": "Kata sandi Pemilik", - "15": "Membatasi apa yang dapat dilakukan dengan dokumen setelah dibuka (Tidak didukung oleh semua pembaca)", - "16": "Membatasi pembukaan dokumen itu sendiri" + "extractPages": { + "title": "Extract Pages", + "pageNumbers": { + "label": "Pages to Extract", + "placeholder": "e.g., 1,3,5-8 or odd & 1-10" + }, + "settings": { + "title": "Settings" }, - "submit": "Enkripsi", "tooltip": { - "permissions": { - "title": "Ganti Perizinan" + "description": "Extracts the selected pages into a new PDF, preserving order." + }, + "error": { + "failed": "Failed to extract pages" + }, + "results": { + "title": "Pages Extracted" + }, + "submit": "Extract Pages" + }, + "pageSelection": { + "tooltip": { + "header": { + "title": "Page Selection Guide" + }, + "basic": { + "title": "Basic Usage", + "text": "Select specific pages from your PDF document using simple syntax.", + "bullet1": "Individual pages: 1,3,5", + "bullet2": "Page ranges: 3-6 or 10-15", + "bullet3": "All pages: all" + }, + "advanced": { + "title": "Advanced Features" + }, + "tips": { + "title": "Tips", + "text": "Keep these guidelines in mind:", + "bullet1": "Page numbers start from 1 (not 0)", + "bullet2": "Spaces are automatically removed", + "bullet3": "Invalid expressions are ignored" + }, + "syntax": { + "title": "Syntax Basics", + "text": "Use numbers, ranges, keywords, and progressions (n starts at 0). Parentheses are supported.", + "bullets": { + "numbers": "Numbers/ranges: 5, 10-20", + "keywords": "Keywords: odd, even", + "progressions": "Progressions: 3n, 4n+1" + } + }, + "operators": { + "title": "Operators", + "text": "AND has higher precedence than comma. NOT applies within the document range.", + "and": "AND: & or \"and\" — require both conditions (e.g., 1-50 & even)", + "comma": "Comma: , or | — combine selections (e.g., 1-10, 20)", + "not": "NOT: ! or \"not\" — exclude pages (e.g., 3n & not 30)" + }, + "examples": { + "title": "Examples" + }, + "complex": { + "bullet1": "1,3-5,8,2n → pages 1, 3–5, 8, plus evens", + "bullet2": "10-,2n-1 → from page 10 to end + odd pages", + "description": "Mix different types.", + "title": "Complex Combinations" + }, + "description": "Choose which pages to use for the operation. Supports single pages, ranges, formulas, and the all keyword.", + "individual": { + "bullet1": "1,3,5 → selects pages 1, 3, 5", + "bullet2": "2,7,12 → selects pages 2, 7, 12", + "description": "Enter numbers separated by commas.", + "title": "Individual Pages" + }, + "mathematical": { + "bullet1": "2n → all even pages (2, 4, 6â€Ļ)", + "bullet2": "2n-1 → all odd pages (1, 3, 5â€Ļ)", + "bullet3": "3n → every 3rd page (3, 6, 9â€Ļ)", + "bullet4": "4n-1 → pages 3, 7, 11, 15â€Ļ", + "description": "Use n in formulas for patterns.", + "title": "Mathematical Functions" + }, + "ranges": { + "bullet1": "3-6 → selects pages 3–6", + "bullet2": "10-15 → selects pages 10–15", + "bullet3": "5- → selects pages 5 to end", + "description": "Use - for consecutive pages.", + "title": "Page Ranges" + }, + "special": { + "bullet1": "all → selects all pages", + "title": "Special Keywords" } } }, - "removePassword": { - "tags": "aman,Dekripsi,keamanan,buka kata sandi,hapus kata sandi", - "title": "Hapus kata sandi", - "header": "Hapus kata sandi (Dekrip)", - "selectText": { - "1": "Pilih PDF yang akan di Dekrip", - "2": "Kata Sandi" + "bulkSelection": { + "syntaxError": "There is a syntax issue. See Page Selection tips for help.", + "header": { + "title": "Page Selection Guide" }, - "submit": "Hapus", - "desc": "Menghapus perlindungan kata sandi dari dokumen PDF Anda.", - "password": { - "stepTitle": "Hapus Kata Sandi", - "label": "Kata Sandi Saat Ini" + "syntax": { + "title": "Syntax Basics", + "text": "Use numbers, ranges, keywords, and progressions (n starts at 0). Parentheses are supported.", + "bullets": { + "numbers": "Numbers/ranges: 5, 10-20", + "keywords": "Keywords: odd, even", + "progressions": "Progressions: 3n, 4n+1" + } + }, + "operators": { + "title": "Operators", + "text": "AND has higher precedence than comma. NOT applies within the document range.", + "and": "AND: & or \"and\" — require both conditions (e.g., 1-50 & even)", + "comma": "Comma: , or | — combine selections (e.g., 1-10, 20)", + "not": "NOT: ! or \"not\" — exclude pages (e.g., 3n & not 30)" + }, + "examples": { + "title": "Examples", + "first50": "First 50", + "last50": "Last 50", + "every3rd": "Every 3rd", + "oddWithinExcluding": "Odd within 1-20 excluding 5-7", + "combineSets": "Combine sets" + }, + "firstNPages": { + "title": "First N Pages", + "placeholder": "Number of pages" + }, + "lastNPages": { + "title": "Last N Pages", + "placeholder": "Number of pages" + }, + "everyNthPage": { + "title": "Every Nth Page", + "placeholder": "Step size" + }, + "range": { + "title": "Range", + "fromPlaceholder": "From", + "toPlaceholder": "To" + }, + "keywords": { + "title": "Keywords" + }, + "advanced": { + "title": "Advanced" } }, "compressPdfs": { @@ -843,12 +1734,142 @@ "tags": "remove,delete,form,field,readonly", "title": "Remove Read-Only from Form Fields", "header": "Unlock PDF Forms", - "submit": "Remove" + "submit": "Remove", + "description": "This tool will remove read-only restrictions from PDF form fields, making them editable and fillable.", + "filenamePrefix": "unlocked_forms", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst unlocking PDF forms." + }, + "results": { + "title": "Unlocked Forms Results" + } }, "changeMetadata": { - "tags": "Judul,penulis,tanggal,pembuatan,waktu,penerbit,produser,statistik", - "title": "Judul:", "header": "Ganti Metadata", + "submit": "Ganti", + "filenamePrefix": "metadata", + "settings": { + "title": "Metadata Settings" + }, + "standardFields": { + "title": "Standard Fields" + }, + "deleteAll": { + "label": "Remove Existing Metadata", + "checkbox": "Delete all metadata" + }, + "title": { + "label": "Title", + "placeholder": "Document title" + }, + "author": { + "label": "Author", + "placeholder": "Document author" + }, + "subject": { + "label": "Subject", + "placeholder": "Document subject" + }, + "keywords": { + "label": "Keywords", + "placeholder": "Document keywords" + }, + "creator": { + "label": "Creator", + "placeholder": "Document creator" + }, + "producer": { + "label": "Producer", + "placeholder": "Document producer" + }, + "dates": { + "title": "Date Fields" + }, + "creationDate": { + "label": "Creation Date", + "placeholder": "Creation date" + }, + "modificationDate": { + "label": "Modification Date", + "placeholder": "Modification date" + }, + "trapped": { + "label": "Trapped Status", + "unknown": "Unknown", + "true": "True", + "false": "False" + }, + "advanced": { + "title": "Advanced Options" + }, + "customFields": { + "title": "Custom Metadata", + "description": "Add custom metadata fields to the document", + "add": "Add Field", + "key": "Key", + "keyPlaceholder": "Custom key", + "value": "Value", + "valuePlaceholder": "Custom value", + "remove": "Remove" + }, + "results": { + "title": "Updated PDFs" + }, + "error": { + "failed": "An error occurred while changing the PDF metadata." + }, + "tooltip": { + "header": { + "title": "PDF Metadata Overview" + }, + "standardFields": { + "title": "Standard Fields", + "text": "Common PDF metadata fields that describe the document.", + "bullet1": "Title: Document name or heading", + "bullet2": "Author: Person who created the document", + "bullet3": "Subject: Brief description of content", + "bullet4": "Keywords: Search terms for the document", + "bullet5": "Creator/Producer: Software used to create the PDF" + }, + "dates": { + "title": "Date Fields", + "text": "When the document was created and modified.", + "bullet1": "Creation Date: When original document was made", + "bullet2": "Modification Date: When last changed" + }, + "options": { + "title": "Additional Options", + "text": "Custom fields and privacy controls.", + "bullet1": "Custom Metadata: Add your own key-value pairs", + "bullet2": "Trapped Status: High-quality printing setting", + "bullet3": "Delete All: Remove all metadata for privacy" + }, + "deleteAll": { + "title": "Remove Existing Metadata", + "text": "Complete metadata deletion to ensure privacy." + }, + "customFields": { + "title": "Custom Metadata", + "text": "Add your own custom key-value metadata pairs.", + "bullet1": "Add any custom fields relevant to your document", + "bullet2": "Examples: Department, Project, Version, Status", + "bullet3": "Both key and value are required for each entry" + }, + "advanced": { + "title": "Advanced Options", + "trapped": { + "title": "Trapped Status", + "description": "Indicates if document is prepared for high-quality printing.", + "bullet1": "True: Document has been trapped for printing", + "bullet2": "False: Document has not been trapped", + "bullet3": "Unknown: Trapped status is not specified" + } + } + }, + "tags": "Judul,penulis,tanggal,pembuatan,waktu,penerbit,produser,statistik", "selectText": { "1": "Silakan edit variabel yang ingin Anda ubah", "2": "Hapus semua metadata", @@ -856,15 +1877,7 @@ "4": "Metadata Lain-lain:", "5": "Tambahkan Metadata Khusus" }, - "author": "Penulis:", - "creationDate": "Tanggal Dibuat (yyyy/MM/dd HH:mm:ss):", - "creator": "Pencipta:", - "keywords": "Kata kunci:", - "modDate": "Tangal Diperbarui (yyyy/MM/dd HH:mm:ss):", - "producer": "Produser:", - "subject": "Subjek:", - "trapped": "Terperangkap:", - "submit": "Ganti" + "modDate": "Tangal Diperbarui (yyyy/MM/dd HH:mm:ss):" }, "fileToPDF": { "tags": "transformasi,format,dokumen,gambar,slide,text,konversi,office,docs,word,excel,powerpoint", @@ -878,6 +1891,7 @@ "ocr": { "tags": "rekognisi,teks,gambar,pindai,baca,identifikasi,deteksi,dapat diedit", "title": "OCR / Pembersihan Pindaian", + "desc": "Memindai dan mendeteksi teks dari gambar di dalam PDF dan menambahkannya kembali sebagai teks.", "header": "Pemindaian Pembersihan / OCR (Pengenalan Karakter Optik)", "selectText": { "1": "Pilih bahasa yang akan dideteksi di dalam PDF (Bahasa yang terdaftar adalah bahasa yang saat ini terdeteksi):", @@ -896,23 +1910,89 @@ "help": "Silakan baca dokumentasi ini tentang cara menggunakan ini untuk bahasa lain dan/atau penggunaan yang tidak ada di docker", "credit": "Layanan ini menggunakan qpdf dan Tesseract untuk OCR.", "submit": "Memproses PDF dengan OCR", - "desc": "Memindai dan mendeteksi teks dari gambar di dalam PDF dan menambahkannya kembali sebagai teks.", + "operation": { + "submit": "Process OCR and Review" + }, + "results": { + "title": "OCR Results" + }, + "languagePicker": { + "additionalLanguages": "Looking for additional languages?", + "viewSetupGuide": "View setup guide →" + }, "settings": { "title": "Pengaturan", "ocrMode": { - "label": "Mode OCR" + "label": "Mode OCR", + "auto": "Auto (skip text layers)", + "force": "Force (re-OCR all, replace text)", + "strict": "Strict (abort if text found)" }, "languages": { - "label": "Bahasa" + "label": "Bahasa", + "placeholder": "Select languages" + }, + "compatibilityMode": { + "label": "Compatibility Mode" + }, + "advancedOptions": { + "label": "Processing Options", + "sidecar": "Create a text file", + "deskew": "Deskew pages", + "clean": "Clean input file", + "cleanFinal": "Clean final output" } }, "tooltip": { + "header": { + "title": "OCR Settings Overview" + }, "mode": { - "title": "Mode OCR" + "title": "Mode OCR", + "text": "Optical Character Recognition (OCR) helps you turn scanned or screenshotted pages into text you can search, copy, or highlight.", + "bullet1": "Auto skips pages that already contain text layers.", + "bullet2": "Force re-OCRs every page and replaces all the text.", + "bullet3": "Strict halts if any selectable text is found." }, "languages": { - "title": "Bahasa" + "title": "Bahasa", + "text": "Improve OCR accuracy by specifying the expected languages. Choose one or more languages to guide detection." + }, + "output": { + "title": "Output", + "text": "Decide how you want the text output formatted:", + "bullet1": "Searchable PDF embeds text behind the original image.", + "bullet2": "HOCR XML returns a structured machine-readable file.", + "bullet3": "Plain-text sidecar creates a separate .txt file with raw content." + }, + "advanced": { + "header": { + "title": "Advanced OCR Processing" + }, + "compatibility": { + "title": "Compatibility Mode", + "text": "Uses OCR 'sandwich PDF' mode: results in larger files, but more reliable with certain languages and older PDF software. By default we use hOCR for smaller, modern PDFs." + }, + "sidecar": { + "title": "Create Text File", + "text": "Generates a separate .txt file alongside the PDF containing all extracted text content for easy access and processing." + }, + "deskew": { + "title": "Deskew Pages", + "text": "Automatically corrects skewed or tilted pages to improve OCR accuracy. Useful for scanned documents that weren't perfectly aligned." + }, + "clean": { + "title": "Clean Input File", + "text": "Preprocesses the input by removing noise, enhancing contrast, and optimising the image for better OCR recognition before processing." + }, + "cleanFinal": { + "title": "Clean Final Output", + "text": "Post-processes the final PDF by removing OCR artefacts and optimising the text layer for better readability and smaller file size." + } } + }, + "error": { + "failed": "OCR operation failed" } }, "extractImages": { @@ -921,7 +2001,13 @@ "header": "Mengekstrak Gambar", "selectText": "Pilih format gambar yang akan dikonversi", "allowDuplicates": "Simpan Gambar Duplikat", - "submit": "Ekstrak" + "submit": "Ekstrak", + "settings": { + "title": "Settings" + }, + "error": { + "failed": "An error occurred while extracting images from the PDF." + } }, "pdfToPDFA": { "tags": "arsip, jangka panjang, standar, konversi, penyimpanan, pelestarian", @@ -993,17 +2079,53 @@ }, "info": "Python tidak terinstal. Ini diperlukan untuk menjalankan." }, + "scannerImageSplit": { + "title": "Extracted Images", + "submit": "Extract Image Scans", + "error": { + "failed": "An error occurred while extracting image scans." + }, + "tooltip": { + "title": "Photo Splitter", + "whatThisDoes": "What this does", + "whatThisDoesDesc": "Automatically finds and extracts each photo from a scanned page or composite image—no manual cropping.", + "whenToUse": "When to use", + "useCase1": "Scan whole album pages in one go", + "useCase2": "Split flatbed batches into separate files", + "useCase3": "Break collages into individual photos", + "useCase4": "Pull photos from documents", + "quickFixes": "Quick fixes", + "problem1": "Photos not detected → increase Tolerance to 30-50", + "problem2": "Too many false detections → increase Minimum Area to 15,000-20,000", + "problem3": "Crops are too tight → increase Border Size to 5-10", + "problem4": "Tilted photos not straightened → lower Angle Threshold to ~5°", + "problem5": "Dust/noise boxes → increase Minimum Contour Area to 1000-2000", + "setupTips": "Setup tips", + "tip1": "Use a plain, light background", + "tip2": "Leave a small gap (≈1 cm) between photos", + "tip3": "Scan at 300-600 DPI", + "tip4": "Clean the scanner glass", + "headsUp": "Heads-up", + "headsUpDesc": "Overlapping photos or backgrounds very close in colour to the photos can reduce accuracy-try a lighter or darker background and leave more space." + } + }, "sign": { - "tags": "mengesahkan, inisial, tanda tangan yang digambar, tanda tangan teks, tanda tangan gambar", "title": "Tanda", "header": "Tandatangani PDF", "upload": "Unggah Gambar", - "draw": "Gambar Tanda Tangan", - "text": "Masukan Teks", + "draw": { + "title": "Draw your signature", + "clear": "Clear" + }, + "text": { + "name": "Signer Name", + "placeholder": "Enter your full name" + }, "clear": "Hapus", "add": "Tambah", "saved": "Tanda Tangan Disimpan", "save": "Simpan Tanda Tangan", + "applySignatures": "Apply Signatures", "personalSigs": "Tanda Tangan Pribadi", "sharedSigs": "Tanda Tangan Berbagi", "noSavedSigs": "Tidak ditemukan tanda tangan yang disimpan", @@ -1015,42 +2137,179 @@ "previous": "Previous page", "maintainRatio": "Toggle maintain aspect ratio", "undo": "Undo", - "redo": "Redo" + "redo": "Redo", + "submit": "Sign Document", + "steps": { + "configure": "Configure Signature" + }, + "type": { + "title": "Signature Type", + "draw": "Draw", + "canvas": "Canvas", + "image": "Image", + "text": "Text" + }, + "image": { + "label": "Upload signature image", + "placeholder": "Select image file", + "hint": "Upload a PNG or JPG image of your signature" + }, + "instructions": { + "title": "How to add signature", + "canvas": "After drawing your signature in the canvas, close the modal then click anywhere on the PDF to place it.", + "image": "After uploading your signature image above, click anywhere on the PDF to place it.", + "text": "After entering your name above, click anywhere on the PDF to place your signature." + }, + "mode": { + "move": "Move Signature", + "place": "Place Signature" + }, + "updateAndPlace": "Update and Place", + "activate": "Activate Signature Placement", + "deactivate": "Stop Placing Signatures", + "results": { + "title": "Signature Results" + }, + "error": { + "failed": "An error occurred while signing the PDF." + }, + "tags": "mengesahkan, inisial, tanda tangan yang digambar, tanda tangan teks, tanda tangan gambar" }, "flatten": { - "tags": "statis, nonaktif, non-interaktif, ramping", "title": "Ratakan", "header": "Ratakan PDF", "flattenOnlyForms": "Ratakan hanya formulir", "submit": "Ratakan", + "filenamePrefix": "flattened", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, "steps": { "settings": "Pengaturan" }, "options": { - "flattenOnlyForms": "Ratakan hanya formulir" - } + "stepTitle": "Flatten Options", + "title": "Flatten Options", + "flattenOnlyForms": { + "label": "Ratakan hanya formulir", + "desc": "Only flatten form fields, leaving other interactive elements intact" + }, + "note": "Flattening removes interactive elements from the PDF, making them non-editable." + }, + "results": { + "title": "Flatten Results" + }, + "error": { + "failed": "An error occurred while flattening the PDF." + }, + "tooltip": { + "header": { + "title": "About Flattening PDFs" + }, + "description": { + "title": "What does flattening do?", + "text": "Flattening makes your PDF non-editable by turning fillable forms and buttons into regular text and images. The PDF will look exactly the same, but no one can change or fill in the forms anymore. Perfect for sharing completed forms, creating final documents for records, or ensuring the PDF looks the same everywhere.", + "bullet1": "Text boxes become regular text (can't be edited)", + "bullet2": "Checkboxes and buttons become pictures", + "bullet3": "Great for final versions you don't want changed", + "bullet4": "Ensures consistent appearance across all devices" + }, + "formsOnly": { + "title": "What does 'Flatten only forms' mean?", + "text": "This option only removes the ability to fill in forms, but keeps other features working like clicking links, viewing bookmarks, and reading comments.", + "bullet1": "Forms become non-editable", + "bullet2": "Links still work when clicked", + "bullet3": "Comments and notes remain visible", + "bullet4": "Bookmarks still help you navigate" + } + }, + "tags": "statis, nonaktif, non-interaktif, ramping" }, "repair": { "tags": "perbaiki, pulihkan, koreksi, pulihkan", "title": "Perbaiki", "header": "Perbaiki PDF", - "submit": "Perbaiki" + "submit": "Perbaiki", + "description": "This tool will attempt to repair corrupted or damaged PDF files. No additional settings are required.", + "filenamePrefix": "repaired", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst repairing the PDF." + }, + "results": { + "title": "Repair Results" + } }, "removeBlanks": { - "tags": "membersihkan, merampingkan, non-konten, mengatur", "title": "Hapus yang Kosong", "header": "Hapus Halaman Kosong", - "threshold": "Ambang Batas Keputihan Piksel:", + "settings": { + "title": "Settings" + }, + "threshold": { + "label": "Pixel Whiteness Threshold" + }, + "whitePercent": { + "label": "White Percentage Threshold", + "unit": "%" + }, + "includeBlankPages": { + "label": "Include detected blank pages" + }, + "tooltip": { + "header": { + "title": "Remove Blank Pages Settings" + }, + "threshold": { + "title": "Pixel Whiteness Threshold", + "text": "Controls how white a pixel must be to be considered 'white'. This helps determine what counts as a blank area on the page.", + "bullet1": "0 = Pure black (most restrictive)", + "bullet2": "128 = Medium grey", + "bullet3": "255 = Pure white (least restrictive)" + }, + "whitePercent": { + "title": "White Percentage Threshold", + "text": "Sets the minimum percentage of white pixels required for a page to be considered blank and removed.", + "bullet1": "Lower values (e.g., 80%) = More pages removed", + "bullet2": "Higher values (e.g., 95%) = Only very blank pages removed", + "bullet3": "Use higher values for documents with light backgrounds" + }, + "includeBlankPages": { + "title": "Include Detected Blank Pages", + "text": "When enabled, creates a separate PDF containing all the blank pages that were detected and removed from the original document.", + "bullet1": "Useful for reviewing what was removed", + "bullet2": "Helps verify the detection accuracy", + "bullet3": "Can be disabled to reduce output file size" + } + }, + "submit": "Hapus Kosong", + "error": { + "failed": "Failed to remove blank pages" + }, + "results": { + "title": "Removed Blank Pages" + }, + "tags": "membersihkan, merampingkan, non-konten, mengatur", "thresholdDesc": "Ambang batas untuk menentukan seberapa putih piksel putih yang harus diklasifikasikan sebagai 'Putih'. 0=Hitam, 255 putih murni.", - "whitePercent": "Persen Putih (%):", - "whitePercentDesc": "Persentase halaman yang harus berupa piksel 'putih' yang akan dihapus", - "submit": "Hapus Kosong" + "whitePercentDesc": "Persentase halaman yang harus berupa piksel 'putih' yang akan dihapus" }, "removeAnnotations": { "tags": "komentar, sorot, catatan, markup, hapus", "title": "Hapus Anotasi", "header": "Hapus Anotasi", - "submit": "Hapus" + "submit": "Hapus", + "settings": { + "title": "Settings" + }, + "info": { + "title": "About Remove Annotations", + "description": "This tool will remove all annotations (comments, highlights, notes, etc.) from your PDF documents." + }, + "error": { + "failed": "An error occurred while removing annotations from the PDF." + } }, "compare": { "tags": "membedakan, kontras, perubahan, analisis", @@ -1082,6 +2341,142 @@ "certSign": { "tags": "mengotentikasi, PEM, P12, resmi, mengenkripsi", "title": "Penandatanganan Sertifikat", + "filenamePrefix": "signed", + "signMode": { + "stepTitle": "Sign Mode", + "tooltip": { + "header": { + "title": "About PDF Signatures" + }, + "overview": { + "title": "How signatures work", + "text": "Both modes seal the document (any edits are flagged as tampering) and record who/when/how for auditing. Viewer trust depends on the certificate chain." + }, + "manual": { + "title": "Manual - Bring your certificate", + "text": "Use your own certificate files for brand-aligned identity. Can display Trusted when your CA/chain is recognised.", + "use": "Use for: customer-facing, legal, compliance." + }, + "auto": { + "title": "Auto - Zero-setup, instant system seal", + "text": "Signs with a server self-signed certificate. Same tamper-evident seal and audit trail; typically shows Unverified in viewers.", + "use": "Use when: you need speed and consistent internal identity across reviews and records." + }, + "rule": { + "title": "Rule of thumb", + "text": "Need recipient Trusted status? Manual. Need a fast, tamper-evident seal and audit trail with no setup? Auto." + } + } + }, + "certTypeStep": { + "stepTitle": "Certificate Format" + }, + "certFiles": { + "stepTitle": "Certificate Files" + }, + "appearance": { + "stepTitle": "Signature Appearance", + "tooltip": { + "header": { + "title": "About Signature Appearance" + }, + "invisible": { + "title": "Invisible Signatures", + "text": "The signature is added to the PDF for security but won't be visible when viewing the document. Perfect for legal requirements without changing the document's appearance.", + "bullet1": "Provides security without visual changes", + "bullet2": "Meets legal requirements for digital signing", + "bullet3": "Doesn't affect document layout or design" + }, + "visible": { + "title": "Visible Signatures", + "text": "Shows a signature block on the PDF with your name, date, and optional details. Useful when you want readers to clearly see the document is signed.", + "bullet1": "Shows signer name and date on the document", + "bullet2": "Can include reason and location for signing", + "bullet3": "Choose which page to place the signature", + "bullet4": "Optional logo can be included" + } + }, + "invisible": "Invisible", + "options": { + "title": "Signature Details" + }, + "visible": "Visible" + }, + "sign": { + "submit": "Sign PDF", + "results": "Signed PDF" + }, + "error": { + "failed": "An error occurred whilst processing signatures." + }, + "tooltip": { + "header": { + "title": "About Managing Signatures" + }, + "overview": { + "title": "What can this tool do?", + "text": "This tool lets you check if your PDFs are digitally signed and add new digital signatures. Digital signatures prove who created or approved a document and show if it has been changed since signing.", + "bullet1": "Check existing signatures and their validity", + "bullet2": "View detailed information about signers and certificates", + "bullet3": "Add new digital signatures to secure your documents", + "bullet4": "Multiple files supported with easy navigation" + }, + "validation": { + "title": "Checking Signatures", + "text": "When you check signatures, the tool tells you if they're valid, who signed the document, when it was signed, and whether the document has been changed since signing.", + "bullet1": "Shows if signatures are valid or invalid", + "bullet2": "Displays signer information and signing date", + "bullet3": "Checks if the document was modified after signing", + "bullet4": "Can use custom certificates for verification" + }, + "signing": { + "title": "Adding Signatures", + "text": "To sign a PDF, you need a digital certificate (like PEM, PKCS12, or JKS). You can choose to make the signature visible on the document or keep it invisible for security only.", + "bullet1": "Supports PEM, PKCS12, JKS, and server certificate formats", + "bullet2": "Option to show or hide signature on the PDF", + "bullet3": "Add reason, location, and signer name", + "bullet4": "Choose which page to place visible signatures", + "bullet5": "Use server certificate for simple 'Sign with Stirling-PDF' option" + } + }, + "certType": { + "tooltip": { + "header": { + "title": "About Certificate Types" + }, + "what": { + "title": "What's a certificate?", + "text": "It's a secure ID for your signature that proves you signed. Unless you're required to sign via certificate, we recommend using another secure method like Type, Draw, or Upload." + }, + "which": { + "title": "Which option should I use?", + "text": "Choose the format that matches your certificate file:", + "bullet1": "PKCS#12 (.p12 / .pfx) – one combined file (most common)", + "bullet2": "PFX (.pfx) – Microsoft's version of PKCS12", + "bullet3": "PEM – separate private-key and certificate .pem files", + "bullet4": "JKS – Java .jks keystore for dev / CI-CD workflows" + }, + "convert": { + "title": "Key not listed?", + "text": "Convert your file to a Java keystore (.jks) with keytool, then pick JKS." + } + } + }, + "chooseCertificate": "Choose Certificate File", + "chooseJksFile": "Choose JKS File", + "chooseP12File": "Choose PKCS12 File", + "choosePfxFile": "Choose PFX File", + "choosePrivateKey": "Choose Private Key File", + "location": "Lokasi", + "logoTitle": "Logo", + "name": "Nama", + "noLogo": "No Logo", + "pageNumber": "Page Number", + "password": "Masukkan Kata Sandi Kunci atau Kunci Pribadi Anda (Jika Ada):", + "passwordOptional": "Leave empty if no password", + "reason": "Alasan", + "serverCertMessage": "Using server certificate - no files or password required", + "showLogo": "Tampilkan Logo", "header": "Menandatangani PDF dengan sertifikat Anda (Sedang dalam proses)", "selectPDF": "Pilih Berkas PDF untuk Penandatanganan:", "jksNote": "Catatan: Jika tipe sertifikat Anda tidak terdaftar di bawah, silakan konversi ke file Java Keystore (.jks) menggunakan alat baris perintah keytool. Kemudian, pilih opsi file .jks di bawah.", @@ -1089,13 +2484,7 @@ "selectCert": "Pilih Berkas Sertifikat Anda (format X.509, bisa .pem atau .der):", "selectP12": "Pilih Berkas Keystore PKCS #12 Anda (.p12 atau .pfx) (Opsional, Jika disediakan, berkas tersebut harus berisi kunci pribadi dan sertifikat Anda):", "selectJKS": "Pilih Berkas Java Keystore File (.jks atau .keystore):", - "certType": "Jenis Sertifikat", - "password": "Masukkan Kata Sandi Kunci atau Kunci Pribadi Anda (Jika Ada):", "showSig": "Tampilkan Tanda Tangan", - "reason": "Alasan", - "location": "Lokasi", - "name": "Nama", - "showLogo": "Tampilkan Logo", "submit": "Tanda tangani PDF" }, "removeCertSign": { @@ -1103,7 +2492,18 @@ "title": "Hapus Tanda Tangan Sertifikat", "header": "Hapus sertifikat digital dari PDF", "selectPDF": "Pilih file PDF:", - "submit": "Hapus Tanda Tangan" + "submit": "Hapus Tanda Tangan", + "description": "This tool will remove digital certificate signatures from your PDF document.", + "filenamePrefix": "unsigned", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst removing certificate signatures." + }, + "results": { + "title": "Certificate Removal Results" + } }, "pageLayout": { "tags": "menggabungkan, komposit, tampilan tunggal, mengatur", @@ -1111,16 +2511,157 @@ "header": "Tata Letak Multi Halaman", "pagesPerSheet": "Halaman per lembar:", "addBorder": "Menambahkan Batas", - "submit": "Kirim" + "submit": "Kirim", + "desc": { + "2": "Place 2 pages side-by-side on a single sheet.", + "3": "Place 3 pages on a single sheet in a single row.", + "4": "Place 4 pages on a single sheet (2 × 2 grid).", + "9": "Place 9 pages on a single sheet (3 × 3 grid).", + "16": "Place 16 pages on a single sheet (4 × 4 grid)." + }, + "error": { + "failed": "An error occurred while creating the multi-page layout." + } + }, + "bookletImposition": { + "tags": "booklet,imposition,printing,binding,folding,signature", + "title": "Booklet Imposition", + "header": "Booklet Imposition", + "submit": "Create Booklet", + "spineLocation": { + "label": "Spine Location", + "left": "Left (Standard)", + "right": "Right (RTL)" + }, + "doubleSided": { + "label": "Double-sided printing", + "tooltip": "Creates both front and back sides for proper booklet printing" + }, + "manualDuplex": { + "title": "Manual Duplex Mode", + "instructions": "For printers without automatic duplex. You'll need to run this twice:" + }, + "duplexPass": { + "label": "Print Pass", + "first": "1st Pass", + "second": "2nd Pass", + "firstInstructions": "Prints front sides → stack face-down → run again with 2nd Pass", + "secondInstructions": "Load printed stack face-down → prints back sides" + }, + "rtlBinding": { + "label": "Right-to-left binding", + "tooltip": "For Arabic, Hebrew, or other right-to-left languages" + }, + "addBorder": { + "label": "Add borders around pages", + "tooltip": "Adds borders around each page section to help with cutting and alignment" + }, + "addGutter": { + "label": "Add gutter margin", + "tooltip": "Adds inner margin space for binding" + }, + "gutterSize": { + "label": "Gutter size (points)" + }, + "flipOnShortEdge": { + "label": "Flip on short edge (automatic duplex only)", + "tooltip": "Enable for short-edge duplex printing (automatic duplex only - ignored in manual mode)", + "manualNote": "Not needed in manual mode - you flip the stack yourself" + }, + "advanced": { + "toggle": "Advanced Options" + }, + "paperSizeNote": "Paper size is automatically derived from your first page.", + "tooltip": { + "header": { + "title": "Booklet Creation Guide" + }, + "description": { + "title": "What is Booklet Imposition?", + "text": "Creates professional booklets by arranging pages in the correct printing order. Your PDF pages are placed 2-up on landscape sheets so when folded and bound, they read in proper sequence like a real book." + }, + "example": { + "title": "Example: 8-Page Booklet", + "text": "Your 8-page document becomes 2 sheets:", + "bullet1": "Sheet 1 Front: Pages 8, 1 | Back: Pages 2, 7", + "bullet2": "Sheet 2 Front: Pages 6, 3 | Back: Pages 4, 5", + "bullet3": "When folded & stacked: Reads 1→2→3→4→5→6→7→8" + }, + "printing": { + "title": "How to Print & Assemble", + "text": "Follow these steps for perfect booklets:", + "bullet1": "Print double-sided with 'Flip on long edge'", + "bullet2": "Stack sheets in order, fold in half", + "bullet3": "Staple or bind along the folded spine", + "bullet4": "For short-edge printers: Enable 'Flip on short edge' option" + }, + "manualDuplex": { + "title": "Manual Duplex (Single-sided Printers)", + "text": "For printers without automatic duplex:", + "bullet1": "Turn OFF 'Double-sided printing'", + "bullet2": "Select '1st Pass' → Print → Stack face-down", + "bullet3": "Select '2nd Pass' → Load stack → Print backs", + "bullet4": "Fold and assemble as normal" + }, + "advanced": { + "title": "Advanced Options", + "text": "Fine-tune your booklet:", + "bullet1": "Right-to-Left Binding: For Arabic, Hebrew, or RTL languages", + "bullet2": "Borders: Shows cut lines for trimming", + "bullet3": "Gutter Margin: Adds space for binding/stapling", + "bullet4": "Short-edge Flip: Only for automatic duplex printers" + } + }, + "error": { + "failed": "An error occurred while creating the booklet imposition." + } }, "scalePages": { - "tags": "mengubah ukuran, memodifikasi, dimensi, mengadaptasi", "title": "Sesuaikan skala halaman", "header": "Sesuaikan skala halaman", "pageSize": "Ukuran halaman dokumen.", "keepPageSize": "Ukuran Asli", "scaleFactor": "Tingkat zoom (potong) halaman.", - "submit": "Kirim" + "submit": "Kirim", + "tags": "mengubah ukuran, memodifikasi, dimensi, mengadaptasi" + }, + "adjustPageScale": { + "tags": "resize,modify,dimension,adapt", + "title": "Adjust Page Scale", + "header": "Adjust Page Scale", + "scaleFactor": { + "label": "Scale Factor" + }, + "pageSize": { + "label": "Target Page Size", + "keep": "Keep Original Size", + "letter": "Letter", + "legal": "Legal" + }, + "submit": "Adjust Page Scale", + "error": { + "failed": "An error occurred while adjusting the page scale." + }, + "tooltip": { + "header": { + "title": "Page Scale Settings Overview" + }, + "description": { + "title": "Description", + "text": "Adjust the size of PDF content and change the page dimensions." + }, + "scaleFactor": { + "title": "Scale Factor", + "text": "Controls how large or small the content appears on the page. Content is scaled and centred - if scaled content is larger than the page size, it may be cropped.", + "bullet1": "1.0 = Original size", + "bullet2": "0.5 = Half size (50% smaller)", + "bullet3": "2.0 = Double size (200% larger, may crop)" + }, + "pageSize": { + "title": "Target Page Size", + "text": "Sets the dimensions of the output PDF pages. 'Keep Original Size' maintains current dimensions, whilst other options resize to standard paper sizes." + } + } }, "add-page-numbers": { "tags": "beri halaman, beri label, atur, indeks" @@ -1129,16 +2670,83 @@ "tags": "deteksi otomatis, berbasis tajuk, atur, beri label ulang", "title": "Ganti Nama Otomatis", "header": "Ganti Nama PDF Otomatis", - "submit": "Ganti Nama Otomatis" + "description": "Automatically finds the title from your PDF content and uses it as the filename.", + "submit": "Ganti Nama Otomatis", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst auto-renaming the PDF." + }, + "results": { + "title": "Auto-Rename Results" + }, + "tooltip": { + "header": { + "title": "How Auto-Rename Works" + }, + "howItWorks": { + "title": "Smart Renaming", + "text": "Automatically finds the title from your PDF content and uses it as the filename.", + "bullet1": "Looks for text that appears to be a title or heading", + "bullet2": "Creates a clean, valid filename from the detected title", + "bullet3": "Keeps the original name if no suitable title is found" + } + } }, "adjust-contrast": { "tags": "koreksi warna, menyetel, memodifikasi, meningkatkan" }, "crop": { - "tags": "memangkas, mengecilkan, mengedit, membentuk", "title": "Pangkas", "header": "Pangkas PDF", - "submit": "Kirim" + "submit": "Kirim", + "noFileSelected": "Select a PDF file to begin cropping", + "preview": { + "title": "Crop Area Selection" + }, + "reset": "Reset to full PDF", + "coordinates": { + "title": "Position and Size", + "x": { + "label": "X Position", + "desc": "Left edge (points)" + }, + "y": { + "label": "Y Position", + "desc": "Bottom edge (points)" + }, + "width": { + "label": "Width", + "desc": "Crop width (points)" + }, + "height": { + "label": "Height", + "desc": "Crop height (points)" + } + }, + "error": { + "invalidArea": "Crop area extends beyond PDF boundaries", + "failed": "Failed to crop PDF" + }, + "steps": { + "selectArea": "Select Crop Area" + }, + "tooltip": { + "title": "How to Crop PDFs", + "description": "Select the area to crop from your PDF by dragging and resizing the blue overlay on the thumbnail.", + "drag": "Drag the overlay to move the crop area", + "resize": "Drag the corner and edge handles to resize", + "precision": "Use coordinate inputs for precise positioning" + }, + "results": { + "title": "Crop Results" + }, + "automation": { + "info": "Enter crop coordinates in PDF points. Origin (0,0) is at bottom-left. These values will be applied to all PDFs processed in this automation.", + "reference": "Reference: A4 page is 595.28 × 841.89 points (210mm × 297mm). 1 inch = 72 points." + }, + "tags": "memangkas, mengecilkan, mengedit, membentuk" }, "autoSplitPDF": { "tags": "Berbasis QR, pisahkan, pindai segmen, atur", @@ -1221,24 +2829,124 @@ "downloadJS": "Unduh Javascript", "submit": "Tampilkan" }, - "autoRedact": { - "tags": "Hapus, Sembunyikan, padamkan, hitam, hitam, penanda, tersembunyi", - "title": "Redaksional Otomatis", - "header": "Redaksional Otomatis", - "colorLabel": "Warna", - "textsToRedactLabel": "Teks untuk Disunting (dipisahkan baris)", - "textsToRedactPlaceholder": "misalnya \\nRahasia \\nRahasia Tertinggi", - "useRegexLabel": "Gunakan Regex", - "wholeWordSearchLabel": "Pencarian Seluruh Kata", - "customPaddingLabel": "Padding Ekstra Kustom", - "convertPDFToImageLabel": "Konversi PDF ke PDF-Gambar (Digunakan untuk menghapus teks di belakang kotak)", - "submitButton": "Kirim" - }, "redact": { "tags": "Redact,Hide,black out,black,marker,hidden,manual", "title": "Manual Redaction", - "header": "Manual Redaction", "submit": "Manual Redaction", + "error": { + "failed": "An error occurred while redacting the PDF." + }, + "modeSelector": { + "title": "Redaction Method", + "mode": "Mode", + "automatic": "Automatic", + "automaticDesc": "Redact text based on search terms", + "manual": "Manual", + "manualDesc": "Click and drag to redact specific areas", + "manualComingSoon": "Manual redaction coming soon" + }, + "auto": { + "header": "Auto Redact", + "settings": { + "title": "Redaction Settings", + "advancedTitle": "Langkah Lanjut" + }, + "colorLabel": "Box Colour", + "wordsToRedact": { + "title": "Words to Redact", + "placeholder": "Enter a word", + "add": "Tambah", + "examples": "Examples: Confidential, Top-Secret" + }, + "useRegexLabel": "Use Regex", + "wholeWordSearchLabel": "Whole Word Search", + "customPaddingLabel": "Custom Extra Padding", + "convertPDFToImageLabel": "Convert PDF to PDF-Image" + }, + "tooltip": { + "mode": { + "header": { + "title": "Redaction Method" + }, + "automatic": { + "title": "Automatic Redaction", + "text": "Automatically finds and redacts specified text throughout the document. Perfect for removing consistent sensitive information like names, addresses, or confidential markers." + }, + "manual": { + "title": "Manual Redaction", + "text": "Click and drag to manually select specific areas to redact. Gives you precise control over what gets redacted. (Coming soon)" + } + }, + "words": { + "header": { + "title": "Words to Redact" + }, + "description": { + "title": "Text Matching", + "text": "Enter words or phrases to find and redact in your document. Each word will be searched for separately." + }, + "bullet1": "Add one word at a time", + "bullet2": "Press Enter or click 'Add Another' to add", + "bullet3": "Click × to remove words", + "examples": { + "title": "Common Examples", + "text": "Typical words to redact include: bank details, email addresses, or specific names." + } + }, + "advanced": { + "header": { + "title": "Advanced Redaction Settings" + }, + "color": { + "title": "Box Colour & Padding", + "text": "Customise the appearance of redaction boxes. Black is standard, but you can choose any colour. Padding adds extra space around the found text." + }, + "regex": { + "title": "Use Regex", + "text": "Enable regular expressions for advanced pattern matching. Useful for finding phone numbers, emails, or complex patterns.", + "bullet1": "Example: \\d{4}-\\d{2}-\\d{2} to match any dates in YYYY-MM-DD format", + "bullet2": "Use with caution - test thoroughly" + }, + "wholeWord": { + "title": "Whole Word Search", + "text": "Only match complete words, not partial matches. 'John' won't match 'Johnson' when enabled." + }, + "convert": { + "title": "Convert to PDF-Image", + "text": "Converts the PDF to an image-based PDF after redaction. This ensures text behind redaction boxes is completely removed and unrecoverable." + } + } + }, + "manual": { + "header": "Manual Redaction", + "textBasedRedaction": "Text-based Redaction", + "pageBasedRedaction": "Page-based Redaction", + "convertPDFToImageLabel": "Convert PDF to PDF-Image (Used to remove text behind the box)", + "pageRedactionNumbers": { + "title": "Halaman-halaman", + "placeholder": "(misalnya 1,2,8 atau 4,7,12-16 atau 2n-1)" + }, + "redactionColor": { + "title": "Redaction Colour" + }, + "export": "Export", + "upload": "Upload", + "boxRedaction": "Box draw redaction", + "zoom": "Zoom", + "zoomIn": "Zoom in", + "zoomOut": "Zoom out", + "nextPage": "Next Page", + "previousPage": "Previous Page", + "toggleSidebar": "Toggle Sidebar", + "showThumbnails": "Show Thumbnails", + "showDocumentOutline": "Show Document Outline (double-click to expand/collapse all items)", + "showAttachments": "Show Attachments", + "showLayers": "Show Layers (double-click to reset all layers to the default state)", + "colourPicker": "Colour Picker", + "findCurrentOutlineItem": "Find current outline item", + "applyChanges": "Apply Changes" + }, + "header": "Manual Redaction", "textBasedRedaction": "Text based Redaction", "pageBasedRedaction": "Page-based Redaction", "convertPDFToImageLabel": "Convert PDF to PDF-Image (Used to remove text behind the box)", @@ -1264,21 +2972,7 @@ "showLayers": "Show Layers (double-click to reset all layers to the default state)", "colourPicker": "Colour Picker", "findCurrentOutlineItem": "Find current outline item", - "applyChanges": "Apply Changes", - "auto": { - "settings": { - "advancedTitle": "Langkah Lanjut" - }, - "wordsToRedact": { - "add": "Tambah" - } - }, - "manual": { - "pageRedactionNumbers": { - "title": "Halaman-halaman", - "placeholder": "(misalnya 1,2,8 atau 4,7,12-16 atau 2n-1)" - } - } + "applyChanges": "Apply Changes" }, "tableExtraxt": { "tags": "CSV, Ekstraksi Tabel, ekstrak, konversi" @@ -1289,11 +2983,15 @@ "overlay-pdfs": { "tags": "Overlays", "header": "Hamparan berkas PDF", + "title": "Overlay PDFs", + "desc": "Overlay one PDF on top of another", "baseFile": { "label": "Pilih basis berkas PDF" }, "overlayFiles": { - "label": "Pilih hamparan berkas PDF" + "label": "Pilih hamparan berkas PDF", + "placeholder": "Choose PDF(s)...", + "addMore": "Add more PDFs..." }, "mode": { "label": "Pilih Mode Hamparan", @@ -1303,14 +3001,53 @@ }, "counts": { "label": "Jumlah Overlay (Untuk hamparan fixed repeat)", - "placeholder": "Masukkan hitungan yang dipisahkan oleh koma (e.g., 2,3,1)" + "placeholder": "Masukkan hitungan yang dipisahkan oleh koma (e.g., 2,3,1)", + "item": "Count for file", + "noFiles": "Add overlay files to configure counts" }, "position": { "label": "Pilih posisi hamparan", "foreground": "Latar depan", "background": "Latar belakang" }, - "submit": "Kirim" + "submit": "Kirim", + "settings": { + "title": "Settings" + }, + "results": { + "title": "Overlay Results" + }, + "tooltip": { + "header": { + "title": "Overlay PDFs Overview" + }, + "description": { + "title": "Description", + "text": "Combine a base PDF with one or more overlay PDFs. Overlays can be applied page-by-page in different modes and placed in the foreground or background." + }, + "mode": { + "title": "Overlay Mode", + "text": "Choose how to distribute overlay pages across the base PDF pages.", + "sequential": "Sequential Overlay: Use pages from the first overlay PDF until it ends, then move to the next.", + "interleaved": "Interleaved Overlay: Take one page from each overlay in turn.", + "fixedRepeat": "Fixed Repeat Overlay: Take a set number of pages from each overlay before moving to the next. Use Counts to set the numbers." + }, + "position": { + "title": "Overlay Position", + "text": "Foreground places the overlay on top of the page. Background places it behind." + }, + "overlayFiles": { + "title": "Overlay Files", + "text": "Select one or more PDFs to overlay on the base. The order of these files affects how pages are applied in Sequential and Fixed Repeat modes." + }, + "counts": { + "title": "Counts (Fixed Repeat only)", + "text": "Provide a positive number for each overlay file showing how many pages to take before moving to the next. Required when mode is Fixed Repeat." + } + }, + "error": { + "failed": "An error occurred while overlaying PDFs." + } }, "split-by-sections": { "tags": "Membagi Bagian, Membagi, Menyesuaikan", @@ -1331,6 +3068,7 @@ "tags": "Tanda tangan, tambahkan gambar, posisikan gambar di tengah, air tinta, PDF, embedding, customisasi", "header": "Stampel PDF", "title": "Stampel PDF", + "stampSetup": "Stamp Setup", "stampType": "Jenis Stampel", "stampText": "Teks Stampel", "stampImage": "Gambar Stampel", @@ -1343,7 +3081,19 @@ "overrideY": "Timpa Koordinat Y", "customMargin": "Margin Kustom", "customColor": "Warna Teks Kustom", - "submit": "Kirim" + "submit": "Kirim", + "noStampSelected": "No stamp selected. Return to Step 1.", + "customPosition": "Drag the stamp to the desired location in the preview window.", + "error": { + "failed": "An error occurred while adding stamp to the PDF." + }, + "imageSize": "Image Size", + "margin": "Margin", + "positionAndFormatting": "Position & Formatting", + "quickPosition": "Select a position on the page to place the stamp.", + "results": { + "title": "Stamp Results" + } }, "removeImagePdf": { "tags": "Hapus Gambar,Operasi Halaman,Backend,server side" @@ -1361,7 +3111,8 @@ "status": { "_value": "Status", "valid": "Valid", - "invalid": "Invalid" + "invalid": "Invalid", + "complete": "Validation complete" }, "signer": "Signer", "date": "Date", @@ -1388,40 +3139,122 @@ "version": "Versi", "keyUsage": "Key Usage", "selfSigned": "Self-Signed", - "bits": "bits" + "bits": "bits", + "details": "Certificate Details" }, "signature": { "info": "Signature Information", "_value": "Signature", "mathValid": "Signature is mathematically valid BUT:" }, - "selectCustomCert": "Custom Certificate File X.509 (Optional)" - }, - "replace-color": { - "title": "Ganti-Inversi-Warna", - "header": "Ganti-Inversi Warna PDF", - "selectText": { - "1": "Opsi Ganti atau Inversi warna", - "2": "Default(Warna kontras tinggi default)", - "3": "Kustom(Warna yang disesuaikan)", - "4": "Full-Inversi(Inversi semua warna)", - "5": "Opsi warna kontras tinggi", - "6": "teks putih di latar belakang hitam", - "7": "teks hitam di latar belakang putih", - "8": "teks kuning di latar belakang hitam", - "9": "teks hijau di latar belakang hitam", - "10": "Pilih warna teks", - "11": "Pilih warna latar belakang" + "selectCustomCert": "Custom Certificate File X.509 (Optional)", + "downloadCsv": "Download CSV", + "downloadJson": "Download JSON", + "downloadPdf": "Download PDF Report", + "downloadType": { + "csv": "CSV", + "json": "JSON", + "pdf": "PDF" }, - "submit": "Ganti" + "error": { + "allFailed": "Unable to validate the selected files.", + "partial": "Some files could not be validated.", + "reportGeneration": "Could not generate the PDF report. JSON and CSV are available.", + "unexpected": "Unexpected error during validation." + }, + "finalizing": "Preparing downloads...", + "issue": { + "certExpired": "Certificate expired", + "certRevocationUnknown": "Certificate revocation status unknown", + "certRevoked": "Certificate revoked", + "chainInvalid": "Certificate chain invalid", + "signatureInvalid": "Signature cryptographic check failed", + "trustInvalid": "Certificate not trusted" + }, + "noResults": "Run the validation to generate a report.", + "noSignaturesShort": "No signatures", + "processing": "Validating signatures...", + "report": { + "continued": "Continued", + "downloads": "Downloads", + "entryLabel": "Signature Summary", + "fields": { + "created": "Created", + "fileSize": "File Size", + "signatureCount": "Total Signatures", + "signatureDate": "Signature Date" + }, + "filesEvaluated": "{{count}} files evaluated", + "footer": "Validated via Stirling PDF", + "generatedAt": "Generated", + "noPdf": "PDF report will be available after a successful validation.", + "page": "Page", + "shortTitle": "Signature Summary", + "signatureCountLabel": "{{count}} signatures", + "signaturesFound": "{{count}} signatures detected", + "signaturesValid": "{{count}} fully valid", + "title": "Signature Validation Report" + }, + "settings": { + "certHint": "Upload a trusted X.509 certificate to validate against a custom trust source.", + "title": "Validation Settings" + }, + "signatureDate": "Signature Date", + "totalSignatures": "Total Signatures" }, - "replaceColorPdf": { - "tags": "Ganti Warna,Operasi Halaman,Backend,server side" + "replaceColor": { + "tags": "Replace Colour,Page operations,Back end,server side", + "labels": { + "settings": "Settings", + "colourOperation": "Colour operation" + }, + "options": { + "highContrast": "High contrast", + "invertAll": "Invert all colours", + "custom": "Custom", + "cmyk": "Convert to CMYK" + }, + "tooltip": { + "header": { + "title": "Replace & Invert Colour Settings Overview" + }, + "description": { + "title": "Description", + "text": "Transform PDF colours to improve readability and accessibility. Choose from high contrast presets, invert all colours, or create custom colour schemes." + }, + "highContrast": { + "title": "High Contrast", + "text": "Apply predefined high contrast colour combinations designed for better readability and accessibility compliance.", + "bullet1": "White text on black background - Classic dark mode", + "bullet2": "Black text on white background - Standard high contrast", + "bullet3": "Yellow text on black background - High visibility option", + "bullet4": "Green text on black background - Alternative high contrast" + }, + "invertAll": { + "title": "Invert All Colours", + "text": "Completely invert all colours in the PDF, creating a negative-like effect. Useful for creating dark mode versions of documents or reducing eye strain in low-light conditions." + }, + "custom": { + "title": "Custom Colours", + "text": "Define your own text and background colours using the colour pickers. Perfect for creating branded documents or specific accessibility requirements.", + "bullet1": "Text colour - Choose the colour for text elements", + "bullet2": "Background colour - Set the background colour for the document" + }, + "cmyk": { + "title": "Convert to CMYK", + "text": "Convert the PDF from RGB colour space to CMYK colour space, optimized for professional printing. This process converts colours to the Cyan, Magenta, Yellow, Black model used by printers." + } + }, + "error": { + "failed": "An error occurred while processing the colour replacement." + } }, "login": { "title": "Masuk", "header": "Masuk", "signin": "Masuk", + "signInWith": "Sign in with", + "signInAnonymously": "Sign Up as a Guest", "rememberme": "Ingat saya", "invalid": "Nama pengguna atau kata sandi tidak valid.", "locked": "Akun Anda telah dikunci.", @@ -1440,12 +3273,83 @@ "alreadyLoggedIn": "Anda sudah login ke", "alreadyLoggedIn2": "perangkat. Silakan keluar dari perangkat dan coba lagi.", "toManySessions": "Anda memiliki terlalu banyak sesi aktif", - "logoutMessage": "You have been logged out." + "logoutMessage": "You have been logged out.", + "youAreLoggedIn": "You are logged in!", + "email": "Email", + "password": "Password", + "enterEmail": "Enter your email", + "enterPassword": "Enter your password", + "loggingIn": "Logging In...", + "username": "Username", + "enterUsername": "Enter username", + "useEmailInstead": "Login with email", + "forgotPassword": "Forgot your password?", + "logIn": "Log In", + "signingIn": "Signing in...", + "login": "Login", + "or": "Or", + "useMagicLink": "Use magic link instead", + "enterEmailForMagicLink": "Enter your email for magic link", + "sending": "Sendingâ€Ļ", + "sendMagicLink": "Send Magic Link", + "cancel": "Cancel", + "dontHaveAccount": "Don't have an account? Sign up", + "home": "Home", + "debug": "Debug", + "signOut": "Sign Out", + "pleaseEnterBoth": "Please enter both email and password", + "pleaseEnterEmail": "Please enter your email address", + "magicLinkSent": "Magic link sent to {{email}}! Check your email and click the link to sign in.", + "passwordResetSent": "Password reset link sent to {{email}}! Check your email and follow the instructions.", + "failedToSignIn": "Failed to sign in with {{provider}}: {{message}}", + "unexpectedError": "Unexpected error: {{message}}", + "accountCreatedSuccess": "Account created successfully! You can now sign in.", + "passwordChangedSuccess": "Password changed successfully! Please sign in with your new password.", + "credentialsUpdated": "Your credentials have been updated. Please sign in again." + }, + "signup": { + "title": "Create an account", + "subtitle": "Join Stirling PDF to get started", + "name": "Name", + "email": "Email", + "password": "Password", + "confirmPassword": "Confirm password", + "enterName": "Enter your name", + "enterEmail": "Enter your email", + "enterPassword": "Enter your password", + "confirmPasswordPlaceholder": "Confirm password", + "or": "or", + "creatingAccount": "Creating Account...", + "signUp": "Sign Up", + "alreadyHaveAccount": "Already have an account? Sign in", + "pleaseFillAllFields": "Please fill in all fields", + "passwordsDoNotMatch": "Passwords do not match", + "passwordTooShort": "Password must be at least 6 characters long", + "invalidEmail": "Please enter a valid email address", + "checkEmailConfirmation": "Check your email for a confirmation link to complete your registration.", + "accountCreatedSuccessfully": "Account created successfully! You can now sign in.", + "unexpectedError": "Unexpected error: {{message}}", + "useEmailInstead": "Use Email Instead", + "nameRequired": "Name is required", + "emailRequired": "Email is required", + "passwordRequired": "Password is required", + "confirmPasswordRequired": "Please confirm your password" }, "pdfToSinglePage": { "title": "PDF Ke Halaman Tunggal", "header": "PDF Ke Halaman Tunggal", - "submit": "Konversi ke Halaman Tunggal" + "submit": "Konversi ke Halaman Tunggal", + "description": "This tool will merge all pages of your PDF into one large single page. The width will remain the same as the original pages, but the height will be the sum of all page heights.", + "filenamePrefix": "single_page", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst converting to single page." + }, + "results": { + "title": "Single Page Results" + } }, "pageExtracter": { "title": "Ekstrak Halaman", @@ -1469,18 +3373,59 @@ "adjustContrast": { "title": "Sesuaikan Kontras", "header": "Sesuaikan Kontras", + "basic": "Basic Adjustments", "contrast": "Kontras:", "brightness": "Kecerahan:", "saturation": "Saturasi:", - "download": "Unduh" + "download": "Unduh", + "adjustColors": "Adjust Colors", + "blue": "Blue", + "confirm": "Confirm", + "error": { + "failed": "Failed to adjust colors/contrast" + }, + "green": "Green", + "noPreview": "Select a PDF to preview", + "red": "Red", + "results": { + "title": "Adjusted PDF" + } }, "compress": { "title": "Kompres", + "desc": "Compress PDFs to reduce their file size.", "header": "Kompres PDF", + "method": { + "title": "Compression Method", + "quality": "Quality", + "filesize": "Ukuran Berkas" + }, "credit": "Layanan ini menggunakan qpdf untuk Kompresi/Optimalisasi PDF.", "grayscale": { "label": "Terapkan Skala Abu-Abu untuk Kompresi" }, + "tooltip": { + "header": { + "title": "Compress Settings Overview" + }, + "description": { + "title": "Description", + "text": "Compression is an easy way to reduce your file size. Pick File Size to enter a target size and have us adjust quality for you. Pick Quality to set compression strength manually." + }, + "qualityAdjustment": { + "title": "Quality Adjustment", + "text": "Drag the slider to adjust the compression strength. Lower values (1-3) preserve quality but result in larger files. Higher values (7-9) shrink the file more but reduce image clarity.", + "bullet1": "Lower values preserve quality", + "bullet2": "Higher values reduce file size" + }, + "grayscale": { + "title": "Grayscale", + "text": "Select this option to convert all images to black and white, which can significantly reduce file size especially for scanned PDFs or image-heavy documents." + } + }, + "error": { + "failed": "An error occurred while compressing the PDF." + }, "selectText": { "1": { "_value": "Compression Settings", @@ -1490,10 +3435,7 @@ "4": "Mode Otomatis - Menyesuaikan kualitas secara otomatis untuk mendapatkan PDF dengan ukuran yang tepat", "5": "Ukuran PDF yang diharapkan (mis. 25MB, 10,8MB, 25KB)" }, - "submit": "Kompres", - "method": { - "filesize": "Ukuran Berkas" - } + "submit": "Kompres" }, "decrypt": { "passwordPrompt": "This file is password-protected. Please enter the password:", @@ -1594,7 +3536,13 @@ "title": "Hapus gambar", "header": "Hapus gambar", "removeImage": "Hapus gambar", - "submit": "Hapus gambar" + "submit": "Hapus gambar", + "error": { + "failed": "Failed to remove images from the PDF." + }, + "results": { + "title": "Remove Images Results" + } }, "splitByChapters": { "title": "Pecah PDF berdasarkan Bab", @@ -1628,6 +3576,12 @@ }, "note": "Release notes are only available in English" }, + "swagger": { + "title": "API Documentation", + "header": "API Documentation", + "desc": "View and test the Stirling PDF API endpoints", + "tags": "api,documentation,swagger,endpoints,development" + }, "cookieBanner": { "popUp": { "title": "How we use Cookies", @@ -1663,45 +3617,943 @@ "title": "Analytics", "description": "These cookies help us understand how our tools are being used, so we can focus on building the features our community values most. Rest assured—Stirling PDF cannot and will never track the content of the documents you work with." } + }, + "services": { + "posthog": "PostHog Analytics", + "scarf": "Scarf Pixel" } }, - "download": "Unduh", - "convert": { - "title": "Konversi", - "settings": "Pengaturan", - "color": "Warna", - "greyscale": "Skala abu-abu", - "fillPage": "Isi Halaman", - "pdfaDigitalSignatureWarning": "PDF ini mengandung tanda tangan digital. Ini akan dihapus pada langkah berikutnya.", - "grayscale": "Skala abu-abu" + "removeMetadata": { + "submit": "Remove Metadata" }, - "attachments": { - "tags": "embed,attach,file,attachment,attachments", - "title": "Add attachments", - "header": "Add attachments", - "submit": "Add attachments" + "sidebar": { + "toggle": "Toggle Sidebar" + }, + "theme": { + "toggle": "Toggle Theme" + }, + "view": { + "viewer": "Viewer", + "pageEditor": "Page Editor", + "fileManager": "File Manager" + }, + "pageEditor": { + "title": "Page Editor", + "save": "Save Changes", + "noPdfLoaded": "No PDF loaded. Please upload a PDF to edit.", + "rotatedLeft": "Rotated left:", + "rotatedRight": "Rotated right:", + "deleted": "Deleted:", + "movedLeft": "Moved left:", + "movedRight": "Moved right:", + "splitAt": "Split at:", + "insertedPageBreak": "Inserted page break at:", + "addFileNotImplemented": "Add file not implemented in demo", + "closePdf": "Close PDF", + "reset": "Reset Changes", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "fitToWidth": "Fit to Width", + "actualSize": "Actual Size" + }, + "viewer": { + "firstPage": "First Page", + "lastPage": "Last Page", + "previousPage": "Previous Page", + "nextPage": "Next Page", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "singlePageView": "Single Page View", + "dualPageView": "Dual Page View" + }, + "rightRail": { + "closeSelected": "Close Selected Files", + "selectAll": "Select All", + "deselectAll": "Deselect All", + "selectByNumber": "Select by Page Numbers", + "deleteSelected": "Delete Selected Pages", + "closePdf": "Close PDF", + "exportAll": "Export PDF", + "downloadSelected": "Download Selected Files", + "downloadAll": "Download All", + "toggleTheme": "Toggle Theme", + "language": "Language", + "search": "Search PDF", + "panMode": "Pan Mode", + "rotateLeft": "Rotate Left", + "rotateRight": "Rotate Right", + "toggleSidebar": "Toggle Sidebar", + "exportSelected": "Export Selected Pages", + "toggleAnnotations": "Toggle Annotations Visibility", + "annotationMode": "Toggle Annotation Mode", + "draw": "Draw", + "save": "Save" + }, + "search": { + "title": "Search PDF", + "placeholder": "Enter search term...", + "noResults": "No results found", + "searching": "Searching..." + }, + "guestBanner": { + "title": "You're using Stirling PDF as a guest!", + "message": "Create a free account to save your work, access more features, and support the project.", + "dismiss": "Dismiss banner", + "signUp": "Sign Up Free" + }, + "toolPicker": { + "searchPlaceholder": "Search tools...", + "noToolsFound": "No tools found", + "allTools": "ALL TOOLS", + "quickAccess": "QUICK ACCESS", + "categories": { + "standardTools": "Standard Tools", + "advancedTools": "Advanced Tools", + "recommendedTools": "Recommended Tools" + }, + "subcategories": { + "signing": "Signing", + "documentSecurity": "Document Security", + "verification": "Verification", + "documentReview": "Document Review", + "pageFormatting": "Page Formatting", + "extraction": "Extraction", + "removal": "Removal", + "automation": "Automation", + "general": "General", + "advancedFormatting": "Advanced Formatting", + "developerTools": "Developer Tools" + } }, "quickAccess": { - "sign": "Tanda Tangan" + "read": "Read", + "sign": "Tanda Tangan", + "automate": "Automate", + "files": "Files", + "activity": "Activity", + "help": "Help", + "account": "Account", + "config": "Config", + "adminSettings": "Admin Settings", + "allTools": "All Tools" + }, + "admin": { + "error": "Error", + "success": "Success", + "expand": "Expand", + "close": "Close", + "status": { + "active": "Active", + "inactive": "Inactive" + }, + "settings": { + "title": "Admin Settings", + "workspace": "Workspace", + "fetchError": "Failed to load settings", + "saveError": "Failed to save settings", + "saved": "Settings saved successfully", + "saveSuccess": "Settings saved successfully", + "save": "Save Changes", + "restartRequired": "Restart Required", + "restart": { + "title": "Restart Required", + "message": "Settings have been saved successfully. A server restart is required for the changes to take effect.", + "question": "Would you like to restart the server now or later?", + "now": "Restart Now", + "later": "Restart Later" + }, + "restarting": "Restarting Server", + "restartingMessage": "The server is restarting. Please wait a moment...", + "restartError": "Failed to restart server. Please restart manually.", + "general": { + "title": "System Settings", + "description": "Configure system-wide application settings including branding and default behaviour.", + "ui": "User Interface", + "system": "System", + "appName": { + "label": "Application Name", + "description": "The name displayed in the browser tab and home page" + }, + "appNameNavbar": { + "label": "Navbar Brand", + "description": "The name displayed in the navigation bar" + }, + "homeDescription": { + "label": "Home Description", + "description": "The description text shown on the home page" + }, + "defaultLocale": { + "label": "Default Locale", + "description": "The default language for new users (e.g., en_US, es_ES)" + }, + "fileUploadLimit": { + "label": "File Upload Limit", + "description": "Maximum file upload size (e.g., 100MB, 1GB)" + }, + "showUpdate": { + "label": "Show Update Notifications", + "description": "Display notifications when a new version is available" + }, + "showUpdateOnlyAdmin": { + "label": "Show Updates to Admins Only", + "description": "Restrict update notifications to admin users only" + }, + "customHTMLFiles": { + "label": "Custom HTML Files", + "description": "Allow serving custom HTML files from the customFiles directory" + }, + "languages": { + "label": "Available Languages", + "description": "Languages that users can select from (leave empty to enable all languages)" + }, + "customMetadata": { + "label": "Custom Metadata", + "autoUpdate": { + "label": "Auto Update Metadata", + "description": "Automatically update PDF metadata on all processed documents" + }, + "author": { + "label": "Default Author", + "description": "Default author for PDF metadata (e.g., username)" + }, + "creator": { + "label": "Default Creator", + "description": "Default creator for PDF metadata" + }, + "producer": { + "label": "Default Producer", + "description": "Default producer for PDF metadata" + } + }, + "customPaths": { + "label": "Custom Paths", + "description": "Configure custom file system paths for pipeline processing and external tools", + "pipeline": { + "label": "Pipeline Directories", + "watchedFoldersDir": { + "label": "Watched Folders Directory", + "description": "Directory where pipeline monitors for incoming PDFs (leave empty for default: /pipeline/watchedFolders)" + }, + "finishedFoldersDir": { + "label": "Finished Folders Directory", + "description": "Directory where processed PDFs are outputted (leave empty for default: /pipeline/finishedFolders)" + } + }, + "operations": { + "label": "External Tool Paths", + "weasyprint": { + "label": "WeasyPrint Executable", + "description": "Path to WeasyPrint executable for HTML to PDF conversion (leave empty for default: /opt/venv/bin/weasyprint)" + }, + "unoconvert": { + "label": "Unoconvert Executable", + "description": "Path to LibreOffice unoconvert for document conversions (leave empty for default: /opt/venv/bin/unoconvert)" + } + } + } + }, + "security": { + "title": "Security", + "description": "Configure authentication, login behaviour, and security policies.", + "ssoNotice": { + "title": "Looking for SSO/SAML settings?", + "message": "OAuth2 and SAML2 authentication providers have been moved to the Connections menu for easier management." + }, + "authentication": "Authentication", + "enableLogin": { + "label": "Enable Login", + "description": "Require users to log in before accessing the application" + }, + "loginMethod": { + "label": "Login Method", + "description": "The authentication method to use for user login", + "all": "All Methods", + "normal": "Username/Password Only", + "oauth2": "OAuth2 Only", + "saml2": "SAML2 Only" + }, + "loginAttemptCount": { + "label": "Login Attempt Limit", + "description": "Maximum number of failed login attempts before account lockout" + }, + "loginResetTimeMinutes": { + "label": "Login Reset Time (minutes)", + "description": "Time before failed login attempts are reset" + }, + "csrfDisabled": { + "label": "Disable CSRF Protection", + "description": "Disable Cross-Site Request Forgery protection (not recommended)" + }, + "initialLogin": { + "label": "Initial Login", + "username": { + "label": "Initial Username", + "description": "The username for the initial admin account" + }, + "password": { + "label": "Initial Password", + "description": "The password for the initial admin account" + } + }, + "jwt": { + "label": "JWT Configuration", + "secureCookie": { + "label": "Secure Cookie", + "description": "Require HTTPS for JWT cookies (recommended for production)" + }, + "keyRetentionDays": { + "label": "Key Retention Days", + "description": "Number of days to retain old JWT keys for verification" + }, + "persistence": { + "label": "Enable Key Persistence", + "description": "Store JWT keys persistently to survive server restarts" + }, + "enableKeyRotation": { + "label": "Enable Key Rotation", + "description": "Automatically rotate JWT signing keys periodically" + }, + "enableKeyCleanup": { + "label": "Enable Key Cleanup", + "description": "Automatically remove expired JWT keys" + } + }, + "audit": { + "label": "Audit Logging", + "enabled": { + "label": "Enable Audit Logging", + "description": "Track user actions and system events for compliance and security monitoring" + }, + "level": { + "label": "Audit Level", + "description": "0=OFF, 1=BASIC, 2=STANDARD, 3=VERBOSE" + }, + "retentionDays": { + "label": "Audit Retention (days)", + "description": "Number of days to retain audit logs" + } + }, + "htmlUrlSecurity": { + "label": "HTML URL Security", + "description": "Configure URL access restrictions for HTML processing to prevent SSRF attacks", + "enabled": { + "label": "Enable URL Security", + "description": "Enable URL security restrictions for HTML to PDF conversions" + }, + "level": { + "label": "Security Level", + "description": "MAX: whitelist only, MEDIUM: block internal networks, OFF: no restrictions", + "max": "Maximum (Whitelist Only)", + "medium": "Medium (Block Internal)", + "off": "Off (No Restrictions)" + }, + "advanced": "Advanced Settings", + "allowedDomains": { + "label": "Allowed Domains (Whitelist)", + "description": "One domain per line (e.g., cdn.example.com). Only these domains allowed when level is MAX" + }, + "blockedDomains": { + "label": "Blocked Domains (Blacklist)", + "description": "One domain per line (e.g., malicious.com). Additional domains to block" + }, + "internalTlds": { + "label": "Internal TLDs", + "description": "One TLD per line (e.g., .local, .internal). Block domains with these TLD patterns" + }, + "networkBlocking": "Network Blocking", + "blockPrivateNetworks": { + "label": "Block Private Networks", + "description": "Block RFC 1918 private networks (10.x.x.x, 192.168.x.x, 172.16-31.x.x)" + }, + "blockLocalhost": { + "label": "Block Localhost", + "description": "Block localhost and loopback addresses (127.x.x.x, ::1)" + }, + "blockLinkLocal": { + "label": "Block Link-Local Addresses", + "description": "Block link-local addresses (169.254.x.x, fe80::/10)" + }, + "blockCloudMetadata": { + "label": "Block Cloud Metadata Endpoints", + "description": "Block cloud provider metadata endpoints (169.254.169.254)" + } + } + }, + "connections": { + "title": "Connections", + "description": "Configure external authentication providers like OAuth2 and SAML.", + "linkedServices": "Linked Services", + "unlinkedServices": "Unlinked Services", + "connect": "Connect", + "disconnect": "Disconnect", + "disconnected": "Provider disconnected successfully", + "disconnectError": "Failed to disconnect provider", + "ssoAutoLogin": { + "label": "SSO Auto Login", + "enable": "Enable SSO Auto Login", + "description": "Automatically redirect to SSO login when authentication is required" + }, + "oauth2": { + "label": "OAuth2", + "enabled": { + "label": "Enable OAuth2", + "description": "Allow users to authenticate using OAuth2 providers" + }, + "provider": { + "label": "Provider", + "description": "The OAuth2 provider to use for authentication" + }, + "issuer": { + "label": "Issuer URL", + "description": "The OAuth2 provider issuer URL" + }, + "clientId": { + "label": "Client ID", + "description": "The OAuth2 client ID from your provider" + }, + "clientSecret": { + "label": "Client Secret", + "description": "The OAuth2 client secret from your provider" + }, + "useAsUsername": { + "label": "Use as Username", + "description": "The OAuth2 claim to use as the username (e.g., email, sub)" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first OAuth2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via OAuth2" + }, + "scopes": { + "label": "OAuth2 Scopes", + "description": "Comma-separated list of OAuth2 scopes to request (e.g., openid, profile, email)" + } + }, + "saml2": { + "label": "SAML2", + "enabled": { + "label": "Enable SAML2", + "description": "Allow users to authenticate using SAML2 providers" + }, + "provider": { + "label": "Provider", + "description": "The SAML2 provider name" + }, + "registrationId": { + "label": "Registration ID", + "description": "The SAML2 registration identifier" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first SAML2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via SAML2" + } + } + }, + "database": { + "title": "Database", + "description": "Configure custom database connection settings for enterprise deployments.", + "configuration": "Database Configuration", + "enableCustom": { + "label": "Enable Custom Database", + "description": "Use your own custom database configuration instead of the default embedded database" + }, + "customUrl": { + "label": "Custom Database URL", + "description": "Full JDBC connection string (e.g., jdbc:postgresql://localhost:5432/postgres). If provided, individual connection settings below are not used." + }, + "type": { + "label": "Database Type", + "description": "Type of database (not used if custom URL is provided)" + }, + "hostName": { + "label": "Host Name", + "description": "Database server hostname (not used if custom URL is provided)" + }, + "port": { + "label": "Port", + "description": "Database server port (not used if custom URL is provided)" + }, + "name": { + "label": "Database Name", + "description": "Name of the database (not used if custom URL is provided)" + }, + "username": { + "label": "Username", + "description": "Database authentication username" + }, + "password": { + "label": "Password", + "description": "Database authentication password" + } + }, + "privacy": { + "title": "Privacy", + "description": "Configure privacy and data collection settings.", + "analytics": "Analytics & Tracking", + "enableAnalytics": { + "label": "Enable Analytics", + "description": "Collect anonymous usage analytics to help improve the application" + }, + "metricsEnabled": { + "label": "Enable Metrics", + "description": "Enable collection of performance and usage metrics. Provides API endpoint for admins to access metrics data" + }, + "searchEngine": "Search Engine Visibility", + "googleVisibility": { + "label": "Google Visibility", + "description": "Allow search engines to index this application" + } + }, + "advanced": { + "title": "Advanced", + "description": "Configure advanced features and experimental functionality.", + "features": "Feature Flags", + "processing": "Processing", + "endpoints": { + "label": "Endpoints", + "manage": "Manage API Endpoints", + "description": "Endpoint management is configured via YAML. See documentation for details on enabling/disabling specific endpoints." + }, + "enableAlphaFunctionality": { + "label": "Enable Alpha Features", + "description": "Enable experimental and alpha-stage features (may be unstable)" + }, + "enableUrlToPDF": { + "label": "Enable URL to PDF", + "description": "Allow conversion of web pages to PDF documents" + }, + "maxDPI": { + "label": "Maximum DPI", + "description": "Maximum DPI for image processing (0 = unlimited)" + }, + "tessdataDir": { + "label": "Tessdata Directory", + "description": "Path to the tessdata directory for OCR language files" + }, + "disableSanitize": { + "label": "Disable HTML Sanitization", + "description": "WARNING: Security risk - disabling HTML sanitization can lead to XSS vulnerabilities" + }, + "tempFileManagement": { + "label": "Temp File Management", + "description": "Configure temporary file storage and cleanup behavior", + "baseTmpDir": { + "label": "Base Temp Directory", + "description": "Base directory for temporary files (leave empty for default: java.io.tmpdir/stirling-pdf)" + }, + "libreofficeDir": { + "label": "LibreOffice Temp Directory", + "description": "Directory for LibreOffice temp files (leave empty for default: baseTmpDir/libreoffice)" + }, + "systemTempDir": { + "label": "System Temp Directory", + "description": "System temp directory to clean (only used if cleanupSystemTemp is enabled)" + }, + "prefix": { + "label": "Temp File Prefix", + "description": "Prefix for temp file names" + }, + "maxAgeHours": { + "label": "Max Age (hours)", + "description": "Maximum age in hours before temp files are cleaned up" + }, + "cleanupIntervalMinutes": { + "label": "Cleanup Interval (minutes)", + "description": "How often to run cleanup (in minutes)" + }, + "startupCleanup": { + "label": "Startup Cleanup", + "description": "Clean up old temp files on application startup" + }, + "cleanupSystemTemp": { + "label": "Cleanup System Temp", + "description": "Whether to clean broader system temp directory (use with caution)" + } + }, + "processExecutor": { + "label": "Process Executor Limits", + "description": "Configure session limits and timeouts for each process executor", + "sessionLimit": { + "label": "Session Limit", + "description": "Maximum concurrent instances" + }, + "timeout": { + "label": "Timeout (minutes)", + "description": "Maximum execution time" + }, + "libreOffice": "LibreOffice", + "pdfToHtml": "PDF to HTML", + "qpdf": "QPDF", + "tesseract": "Tesseract OCR", + "pythonOpenCv": "Python OpenCV", + "weasyPrint": "WeasyPrint", + "installApp": "Install App", + "calibre": "Calibre", + "ghostscript": "Ghostscript", + "ocrMyPdf": "OCRmyPDF" + } + }, + "mail": { + "title": "Mail Server", + "description": "Configure SMTP settings for sending email notifications.", + "smtp": "SMTP Configuration", + "enabled": { + "label": "Enable Mail", + "description": "Enable email notifications and SMTP functionality" + }, + "host": { + "label": "SMTP Host", + "description": "The hostname or IP address of your SMTP server" + }, + "port": { + "label": "SMTP Port", + "description": "The port number for SMTP connection (typically 25, 465, or 587)" + }, + "username": { + "label": "SMTP Username", + "description": "Username for SMTP authentication" + }, + "password": { + "label": "SMTP Password", + "description": "Password for SMTP authentication" + }, + "from": { + "label": "From Address", + "description": "The email address to use as the sender" + }, + "enableInvites": { + "label": "Enable Email Invites", + "description": "Allow admins to invite users via email with auto-generated passwords" + }, + "frontendUrl": { + "label": "Frontend URL", + "description": "Base URL for frontend (e.g. https://pdf.example.com). Used for generating invite links in emails. Leave empty to use backend URL." + } + }, + "legal": { + "title": "Legal Documents", + "description": "Configure links to legal documents and policies.", + "disclaimer": { + "title": "Legal Responsibility Warning", + "message": "By customizing these legal documents, you assume full responsibility for ensuring compliance with all applicable laws and regulations, including but not limited to GDPR and other EU data protection requirements. Only modify these settings if: (1) you are operating a personal/private instance, (2) you are outside EU jurisdiction and understand your local legal obligations, or (3) you have obtained proper legal counsel and accept sole responsibility for all user data and legal compliance. Stirling-PDF and its developers assume no liability for your legal obligations." + }, + "termsAndConditions": { + "label": "Terms and Conditions", + "description": "URL or filename to terms and conditions" + }, + "privacyPolicy": { + "label": "Privacy Policy", + "description": "URL or filename to privacy policy" + }, + "accessibilityStatement": { + "label": "Accessibility Statement", + "description": "URL or filename to accessibility statement" + }, + "cookiePolicy": { + "label": "Cookie Policy", + "description": "URL or filename to cookie policy" + }, + "impressum": { + "label": "Impressum", + "description": "URL or filename to impressum (required in some jurisdictions)" + } + }, + "premium": { + "title": "Premium & Enterprise", + "description": "Configure your premium or enterprise license key.", + "license": "License Configuration", + "key": { + "label": "License Key", + "description": "Enter your premium or enterprise license key" + }, + "enabled": { + "label": "Enable Premium Features", + "description": "Enable license key checks for pro/enterprise features" + }, + "movedFeatures": { + "title": "Premium Features Distributed", + "message": "Premium and Enterprise features are now organized in their respective sections:" + } + }, + "features": { + "title": "Features", + "description": "Configure optional features and functionality.", + "serverCertificate": { + "label": "Server Certificate", + "description": "Configure server-side certificate generation for \"Sign with Stirling-PDF\" functionality", + "enabled": { + "label": "Enable Server Certificate", + "description": "Enable server-side certificate for \"Sign with Stirling-PDF\" option" + }, + "organizationName": { + "label": "Organization Name", + "description": "Organization name for generated certificates" + }, + "validity": { + "label": "Certificate Validity (days)", + "description": "Number of days the certificate will be valid" + }, + "regenerateOnStartup": { + "label": "Regenerate on Startup", + "description": "Generate new certificate on each application startup" + } + } + }, + "endpoints": { + "title": "API Endpoints", + "description": "Control which API endpoints and endpoint groups are available.", + "management": "Endpoint Management", + "toRemove": { + "label": "Disabled Endpoints", + "description": "Select individual endpoints to disable" + }, + "groupsToRemove": { + "label": "Disabled Endpoint Groups", + "description": "Select endpoint groups to disable" + }, + "note": "Note: Disabling endpoints restricts API access but does not remove UI components. Restart required for changes to take effect." + } + } }, "fileUpload": { - "loading": "Mengambil data..." + "selectFile": "Select a file", + "selectFiles": "Select files", + "selectPdfToView": "Select a PDF to view", + "selectPdfToEdit": "Select a PDF to edit", + "chooseFromStorage": "Choose a file from storage or upload a new PDF", + "chooseFromStorageMultiple": "Choose files from storage or upload new PDFs", + "loadFromStorage": "Load from Storage", + "filesAvailable": "files available", + "loading": "Mengambil data...", + "or": "or", + "dropFileHere": "Drop file here or click to upload", + "dropFilesHere": "Drop files here or click the upload button", + "pdfFilesOnly": "PDF files only", + "supportedFileTypes": "Supported file types", + "upload": "Upload", + "uploadFile": "Upload File", + "uploadFiles": "Upload Files", + "noFilesInStorage": "No files available in storage. Upload some files first.", + "selectFromStorage": "Select from Storage", + "backToTools": "Back to Tools", + "addFiles": "Add Files", + "dragFilesInOrClick": "Drag files in or click \"Add Files\" to browse" + }, + "fileEditor": { + "addFiles": "Add Files" }, "fileManager": { + "title": "Upload PDF Files", + "subtitle": "Add files to your storage for easy access across tools", + "filesSelected": "files selected", + "clearSelection": "Clear Selection", + "openInFileEditor": "Open in File Editor", + "uploadError": "Failed to upload some files.", + "failedToOpen": "Failed to open file. It may have been removed from storage.", + "failedToLoad": "Failed to load file to active set.", + "storageCleared": "Browser cleared storage. Files have been removed. Please re-upload.", + "clearAll": "Clear All", + "reloadFiles": "Reload Files", + "dragDrop": "Drag & Drop files here", + "clickToUpload": "Click to upload files", + "selectedFiles": "Selected Files", + "storage": "Storage", + "filesStored": "files stored", + "storageError": "Storage error occurred", + "storageLow": "Storage is running low. Consider removing old files.", + "supportMessage": "Powered by browser database storage for unlimited capacity", + "noFileSelected": "No files selected", + "showHistory": "Show History", + "hideHistory": "Hide History", + "fileHistory": "File History", + "loadingHistory": "Loading History...", + "lastModified": "Last Modified", + "toolChain": "Tools Applied", + "restore": "Restore", + "unzip": "Unzip", + "searchFiles": "Search files...", + "recent": "Recent", + "localFiles": "Local Files", + "googleDrive": "Google Drive", + "googleDriveShort": "Drive", + "myFiles": "My Files", + "noRecentFiles": "No recent files found", + "googleDriveNotAvailable": "Google Drive integration not available", + "openFiles": "Open Files", + "openFile": "Open File", + "details": "File Details", "fileName": "Nama", + "fileFormat": "Format", + "fileSize": "Size", "fileVersion": "Versi", + "totalSelected": "Total Selected", + "dropFilesHere": "Drop files here", + "selectAll": "Select All", + "deselectAll": "Deselect All", + "deleteSelected": "Delete Selected", + "downloadSelected": "Download Selected", + "selectedCount": "{{count}} selected", "download": "Unduh", - "delete": "Hapus" + "delete": "Hapus", + "unsupported": "Unsupported", + "addToUpload": "Add to Upload", + "deleteAll": "Delete All", + "loadingFiles": "Loading files...", + "noFiles": "No files available", + "noFilesFound": "No files found matching your search", + "openInPageEditor": "Open in Page Editor", + "showAll": "Show All", + "sortByDate": "Sort by Date", + "sortByName": "Sort by Name", + "sortBySize": "Sort by Size" + }, + "storage": { + "temporaryNotice": "Files are stored temporarily in your browser and may be cleared automatically", + "storageLimit": "Storage limit", + "storageUsed": "Temporary Storage used", + "storageFull": "Storage is nearly full. Consider removing some files.", + "fileTooLarge": "File too large. Maximum size per file is", + "storageQuotaExceeded": "Storage quota exceeded. Please remove some files before uploading more.", + "approximateSize": "Approximate size" }, "sanitize": { + "title": "Sanitise", + "desc": "Remove potentially harmful elements from PDF files.", "submit": "Bersihkan PDF", + "completed": "Sanitisation completed successfully", + "error": { + "generic": "Sanitisation failed", + "failed": "An error occurred while sanitising the PDF." + }, + "filenamePrefix": "sanitised", + "sanitizationResults": "Sanitisation Results", "steps": { - "settings": "Pengaturan" + "files": "Files", + "settings": "Pengaturan", + "results": "Results" + }, + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "options": { + "title": "Sanitisation Options", + "note": "Select the elements you want to remove from the PDF. At least one option must be selected.", + "removeJavaScript": { + "label": "Remove JavaScript", + "desc": "Remove JavaScript actions and scripts from the PDF" + }, + "removeEmbeddedFiles": { + "label": "Remove Embedded Files", + "desc": "Remove any files embedded within the PDF" + }, + "removeXMPMetadata": { + "label": "Remove XMP Metadata", + "desc": "Remove XMP metadata from the PDF" + }, + "removeMetadata": { + "label": "Remove Document Metadata", + "desc": "Remove document information metadata (title, author, etc.)" + }, + "removeLinks": { + "label": "Remove Links", + "desc": "Remove external links and launch actions from the PDF" + }, + "removeFonts": { + "label": "Remove Fonts", + "desc": "Remove embedded fonts from the PDF" + } + } + }, + "addPassword": { + "title": "Tambahkan kata sandi", + "desc": "Encrypt your PDF document with a password.", + "completed": "Password protection applied", + "submit": "Enkripsi", + "filenamePrefix": "encrypted", + "error": { + "failed": "An error occurred while encrypting the PDF." + }, + "passwords": { + "stepTitle": "Passwords & Encryption", + "completed": "Passwords configured", + "user": { + "label": "User Password", + "placeholder": "Enter user password" + }, + "owner": { + "label": "Owner Password", + "placeholder": "Enter owner password" + } + }, + "encryption": { + "keyLength": { + "label": "Encryption Key Length", + "40bit": "40-bit (Low)", + "128bit": "128-bit (Standard)", + "256bit": "256-bit (High)" + } + }, + "results": { + "title": "Encrypted PDFs" + }, + "tooltip": { + "header": { + "title": "Password Protection Overview" + }, + "passwords": { + "title": "Password Types", + "text": "User passwords restrict opening the document, while owner passwords control what can be done with the document once opened. You can set both or just one.", + "bullet1": "User Password: Required to open the PDF", + "bullet2": "Owner Password: Controls document permissions (not supported by all PDF viewers)" + }, + "encryption": { + "title": "Encryption Levels", + "text": "Higher encryption levels provide better security but may not be supported by older PDF viewers.", + "bullet1": "40-bit: Basic security, compatible with older viewers", + "bullet2": "128-bit: Standard security, widely supported", + "bullet3": "256-bit: Maximum security, requires modern viewers" + }, + "permissions": { + "title": "Ganti Perizinan", + "text": "These permissions control what users can do with the PDF. Most effective when combined with an owner password." + } + }, + "tags": "aman,Keamanan", + "header": "Tambahkan kata sandi (Enkrip)", + "selectText": { + "1": "Pilih PDF untuk enkripsi", + "2": "Kata sandi Pengguna", + "3": "Panjang kunci enkripsi", + "4": "Nilai yang lebih tinggi lebih kuat, tetapi nilai yang lebih rendah memiliki kompatibilitas yang lebih baik.", + "5": "Perizinan untuk diubah (Disarankan untuk digunakan bersama dengan kata sandi Pemilik)", + "6": "Pencegahan untuk penyusunan dokumen", + "7": "Pencegahan untuk ekstraksi konten", + "8": "Pencegahan ekstraksi untuk aksesibilitas", + "9": "Pencegahan untuk mengisi formulir", + "10": "Pencegahan untuk pengubahan", + "11": "Pencegahan untuk perubahan anotasi", + "12": "Pencegahan untuk mencetak", + "13": "Pencegahan untuk mencetak format yang berbeda", + "14": "Kata sandi Pemilik", + "15": "Membatasi apa yang dapat dilakukan dengan dokumen setelah dibuka (Tidak didukung oleh semua pembaca)", + "16": "Membatasi pembukaan dokumen itu sendiri" } }, "changePermissions": { "title": "Ganti Perizinan", + "desc": "Change document restrictions and permissions.", + "completed": "Permissions changed", "submit": "Ganti Perizinan", + "error": { + "failed": "An error occurred while changing PDF permissions." + }, "permissions": { "preventAssembly": { "label": "Pencegahan untuk penyusunan dokumen" @@ -1728,10 +4580,784 @@ "label": "Pencegahan untuk mencetak format yang berbeda" } }, + "results": { + "title": "Modified PDFs" + }, "tooltip": { "header": { "title": "Ganti Perizinan" + }, + "description": { + "text": "Changes document permissions, allowing/disallowing access to different features in PDF readers." + }, + "warning": { + "text": "To make these permissions unchangeable, use the Add Password tool to set an owner password." } } + }, + "removePassword": { + "title": "Hapus kata sandi", + "desc": "Menghapus perlindungan kata sandi dari dokumen PDF Anda.", + "tags": "aman,Dekripsi,keamanan,buka kata sandi,hapus kata sandi", + "password": { + "stepTitle": "Hapus Kata Sandi", + "label": "Kata Sandi Saat Ini", + "placeholder": "Enter current password", + "completed": "Password configured" + }, + "filenamePrefix": "decrypted", + "error": { + "failed": "An error occurred while removing the password from the PDF." + }, + "tooltip": { + "description": "Removing password protection requires the password that was used to encrypt the PDF. This will decrypt the document, making it accessible without a password." + }, + "submit": "Hapus", + "results": { + "title": "Decrypted PDFs" + }, + "header": "Hapus kata sandi (Dekrip)", + "selectText": { + "1": "Pilih PDF yang akan di Dekrip", + "2": "Kata Sandi" + } + }, + "automate": { + "title": "Automate", + "desc": "Build multi-step workflows by chaining together PDF actions. Ideal for recurring tasks.", + "invalidStep": "Invalid step", + "files": { + "placeholder": "Select files to process with this automation" + }, + "selection": { + "title": "Automation Selection", + "saved": { + "title": "Saved" + }, + "createNew": { + "title": "Create New Automation" + }, + "suggested": { + "title": "Suggested" + } + }, + "creation": { + "createTitle": "Create Automation", + "editTitle": "Edit Automation", + "intro": "Automations run tools sequentially. To get started, add tools in the order you want them to run.", + "name": { + "label": "Automation Name", + "placeholder": "My Automation" + }, + "description": { + "label": "Description (optional)", + "placeholder": "Describe what this automation does..." + }, + "tools": { + "selectTool": "Select a tool...", + "selected": "Selected Tools", + "remove": "Remove tool", + "configure": "Configure tool", + "notConfigured": "! Not Configured", + "addTool": "Add Tool", + "add": "Add a tool..." + }, + "save": "Save Automation", + "unsavedChanges": { + "title": "Unsaved Changes", + "message": "You have unsaved changes. Are you sure you want to go back? All changes will be lost.", + "cancel": "Cancel", + "confirm": "Go Back" + }, + "icon": { + "label": "Icon" + } + }, + "run": { + "title": "Run Automation" + }, + "sequence": { + "unnamed": "Unnamed Automation", + "steps": "{{count}} steps", + "running": "Running Automation...", + "run": "Run Automation", + "finish": "Finish" + }, + "reviewTitle": "Automation Results", + "config": { + "loading": "Loading tool configuration...", + "noSettings": "This tool does not have configurable settings.", + "title": "Configure {{toolName}}", + "description": "Configure the settings for this tool. These settings will be applied when the automation runs.", + "cancel": "Cancel", + "save": "Save Configuration" + }, + "copyToSaved": "Copy to Saved" + }, + "automation": { + "suggested": { + "securePdfIngestion": "Secure PDF Ingestion", + "securePdfIngestionDesc": "Comprehensive PDF processing workflow that sanitises documents, applies OCR with cleanup, converts to PDF/A format for long-term archival, and optimises file size.", + "emailPreparation": "Email Preparation", + "emailPreparationDesc": "Optimises PDFs for email distribution by compressing files, splitting large documents into 20MB chunks for email compatibility, and removing metadata for privacy.", + "secureWorkflow": "Security Workflow", + "secureWorkflowDesc": "Secures PDF documents by removing potentially malicious content like JavaScript and embedded files, then adds password protection to prevent unauthorised access. Password is set to 'password' by default.", + "processImages": "Process Images", + "processImagesDesc": "Converts multiple image files into a single PDF document, then applies OCR technology to extract searchable text from the images." + } + }, + "common": { + "copy": "Copy", + "copied": "Copied!", + "refresh": "Refresh", + "retry": "Retry", + "remaining": "remaining", + "used": "used", + "available": "available", + "cancel": "Cancel", + "preview": "Preview" + }, + "config": { + "overview": { + "title": "Application Configuration", + "description": "Current application settings and configuration details." + }, + "account": { + "overview": { + "title": "Account Settings", + "manageAccountPreferences": "Manage your account preferences", + "guestDescription": "You are signed in as a guest. Consider upgrading your account above." + }, + "upgrade": { + "title": "Upgrade Guest Account", + "description": "Link your account to preserve your history and access more features!", + "socialLogin": "Upgrade with Social Account", + "linkWith": "Link with", + "emailPassword": "or enter your email & password", + "email": "Email", + "emailPlaceholder": "Enter your email", + "password": "Password (optional)", + "passwordPlaceholder": "Set a password", + "passwordNote": "Leave empty to use email verification only", + "upgradeButton": "Upgrade Account" + } + }, + "apiKeys": { + "description": "Your API key for accessing Stirling's suite of PDF tools. Copy it to your project or refresh to generate a new one.", + "publicKeyAriaLabel": "Public API key", + "copyKeyAriaLabel": "Copy API key", + "refreshAriaLabel": "Refresh API key", + "includedCredits": "Included credits", + "purchasedCredits": "Purchased credits", + "totalCredits": "Total Credits", + "chartAriaLabel": "Credits usage: included {{includedUsed}} of {{includedTotal}}, purchased {{purchasedUsed}} of {{purchasedTotal}}", + "nextReset": "Next Reset", + "lastApiUse": "Last API Use", + "overlayMessage": "Generate a key to see credits and available credits", + "label": "API Key", + "guestInfo": "Guest users do not receive API keys. Create an account to get an API key you can use in your applications.", + "goToAccount": "Go to Account", + "refreshModal": { + "title": "Refresh API Keys", + "warning": "âš ī¸ Warning: This action will generate new API keys and make your previous keys invalid.", + "impact": "Any applications or services currently using these keys will stop working until you update them with the new keys.", + "confirmPrompt": "Are you sure you want to continue?", + "confirmCta": "Refresh Keys" + }, + "generateError": "We couldn't generate your API key." + } + }, + "AddAttachmentsRequest": { + "attachments": "Select Attachments", + "info": "Select files to attach to your PDF. These files will be embedded and accessible through the PDF's attachment panel.", + "selectFiles": "Select Files to Attach", + "placeholder": "Choose files...", + "addMoreFiles": "Add more files...", + "selectedFiles": "Selected Files", + "submit": "Add Attachments", + "results": { + "title": "Attachment Results" + }, + "error": { + "failed": "Add attachments operation failed" + } + }, + "termsAndConditions": "Terms & Conditions", + "logOut": "Log out", + "addAttachments": { + "error": { + "failed": "An error occurred while adding attachments to the PDF." + } + }, + "autoRename": { + "description": "This tool will automatically rename PDF files based on their content. It analyzes the document to find the most suitable title from the text." + }, + "customPosition": "Custom Position", + "details": "Details", + "downloadUnavailable": "Download unavailable for this item", + "invalidUndoData": "Cannot undo: invalid operation data", + "margin": { + "large": "Large", + "medium": "Medium", + "small": "Small", + "xLarge": "Extra Large" + }, + "noFilesToUndo": "Cannot undo: no files were processed in the last operation", + "noOperationToUndo": "No operation to undo", + "noValidFiles": "No valid files to process", + "operationCancelled": "Operation cancelled", + "pageEdit": { + "deselectAll": "Select None", + "selectAll": "Select All" + }, + "quickPosition": "Quick Position", + "reorganizePages": { + "error": { + "failed": "Failed to reorganize pages" + }, + "results": { + "title": "Pages Reorganized" + }, + "settings": { + "title": "Settings" + }, + "submit": "Reorganize Pages" + }, + "replace-color": { + "options": { + "fill": "Fill colour", + "gradient": "Gradient" + }, + "previewOverlayOpacity": "Preview overlay opacity", + "previewOverlayTransparency": "Preview overlay transparency", + "previewOverlayVisibility": "Show preview overlay", + "selectText": { + "1": "Opsi Ganti atau Inversi warna", + "2": "Default(Warna kontras tinggi default)", + "3": "Kustom(Warna yang disesuaikan)", + "4": "Full-Inversi(Inversi semua warna)", + "5": "Opsi warna kontras tinggi", + "6": "teks putih di latar belakang hitam", + "7": "teks hitam di latar belakang putih", + "8": "teks kuning di latar belakang hitam", + "9": "teks hijau di latar belakang hitam", + "10": "Pilih warna teks", + "11": "Pilih warna latar belakang", + "12": "Choose start colour", + "13": "Choose end colour" + }, + "submit": "Ganti", + "title": "Ganti-Inversi-Warna", + "header": "Ganti-Inversi Warna PDF" + }, + "size": "Size", + "submit": "Submit", + "success": "Success", + "tools": { + "noSearchResults": "No tools found", + "noTools": "No tools available" + }, + "undoDataMismatch": "Cannot undo: operation data is corrupted", + "undoFailed": "Failed to undo operation", + "undoQuotaError": "Cannot undo: insufficient storage space", + "undoStorageError": "Undo completed but some files could not be saved to storage", + "undoSuccess": "Operation undone successfully", + "unsupported": "Unsupported", + "onboarding": { + "welcomeModal": { + "title": "Welcome to Stirling PDF!", + "description": "Would you like to take a quick 1-minute tour to learn the key features and how to get started?", + "helpHint": "You can always access this tour later from the Help button in the bottom left.", + "startTour": "Start Tour", + "maybeLater": "Maybe Later", + "dontShowAgain": "Don't Show Again" + }, + "allTools": "This is the All Tools panel, where you can browse and select from all available PDF tools.", + "selectCropTool": "Let's select the Crop tool to demonstrate how to use one of the tools.", + "toolInterface": "This is the Crop tool interface. As you can see, there's not much there because we haven't added any PDF files to work with yet.", + "filesButton": "The Files button on the Quick Access bar allows you to upload PDFs to use the tools on.", + "fileSources": "You can upload new files or access recent files from here. For the tour, we'll just use a sample file.", + "workbench": "This is the Workbench - the main area where you view and edit your PDFs.", + "viewSwitcher": "Use these controls to select how you want to view your PDFs.", + "viewer": "The Viewer lets you read and annotate your PDFs.", + "pageEditor": "The Page Editor allows you to do various operations on the pages within your PDFs, such as reordering, rotating and deleting.", + "activeFiles": "The Active Files view shows all of the PDFs you have loaded into the tool, and allows you to select which ones to process.", + "fileCheckbox": "Clicking one of the files selects it for processing. You can select multiple files for batch operations.", + "selectControls": "The Right Rail contains buttons to quickly select/deselect all of your active PDFs, along with buttons to change the app's theme or language.", + "cropSettings": "Now that we've selected the file we want crop, we can configure the Crop tool to choose the area that we want to crop the PDF to.", + "runButton": "Once the tool has been configured, this button allows you to run the tool on all the selected PDFs.", + "results": "After the tool has finished running, the Review step will show a preview of the results in this panel, and allow you to undo the operation or download the file. ", + "fileReplacement": "The modified file will replace the original file in the Workbench automatically, allowing you to easily run it through more tools.", + "pinButton": "You can use the Pin button if you'd rather your files stay active after running tools on them.", + "wrapUp": "You're all set! You've learnt about the main areas of the app and how to use them. Click the Help button whenever you like to see this tour again.", + "previous": "Previous", + "next": "Next", + "finish": "Finish", + "startTour": "Start Tour", + "startTourDescription": "Take a guided tour of Stirling PDF's key features" + }, + "workspace": { + "title": "Workspace", + "people": { + "title": "People", + "description": "Manage workspace members and their permissions", + "loading": "Loading people...", + "searchMembers": "Search members...", + "addMembers": "Add Members", + "inviteMembers": { + "label": "Invite Members", + "subtitle": "Type or paste in emails below, separated by commas. Your workspace will be billed by members." + }, + "user": "User", + "role": "Role", + "team": "Team", + "status": "Status", + "actions": "Actions", + "noMembersFound": "No members found", + "active": "Active", + "disabled": "Disabled", + "activeSession": "Active session", + "member": "Member", + "admin": "Admin", + "roleDescriptions": { + "admin": "Can manage settings and invite members, with full administrative access.", + "member": "Can view and edit shared files, but cannot manage workspace settings or members." + }, + "editRole": "Edit Role", + "enable": "Enable", + "disable": "Disable", + "deleteUser": "Delete User", + "deleteUserSuccess": "User deleted successfully", + "deleteUserError": "Failed to delete user", + "confirmDelete": "Are you sure you want to delete this user? This action cannot be undone.", + "addMember": { + "title": "Add Member", + "username": "Username (Email)", + "usernamePlaceholder": "user@example.com", + "password": "Password", + "passwordPlaceholder": "Enter password", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "forcePasswordChange": "Force password change on first login", + "cancel": "Cancel", + "submit": "Add Member", + "usernameRequired": "Username and password are required", + "passwordTooShort": "Password must be at least 6 characters", + "success": "User created successfully", + "error": "Failed to create user" + }, + "editMember": { + "title": "Edit Member", + "editing": "Editing:", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "cancel": "Cancel", + "submit": "Update Member", + "success": "User updated successfully", + "error": "Failed to update user" + }, + "toggleEnabled": { + "success": "User status updated successfully", + "error": "Failed to update user status" + }, + "delete": { + "success": "User deleted successfully", + "error": "Failed to delete user" + }, + "emailInvite": { + "tab": "Email Invite", + "description": "Type or paste in emails below, separated by commas. Users will receive login credentials via email.", + "emails": "Email Addresses", + "emailsPlaceholder": "user1@example.com, user2@example.com", + "emailsRequired": "At least one email address is required", + "submit": "Send Invites", + "success": "user(s) invited successfully", + "partialSuccess": "Some invites failed", + "allFailed": "Failed to invite users", + "error": "Failed to send invites" + }, + "directInvite": { + "tab": "Direct Create" + }, + "inviteLinkTab": { + "tab": "Invite Link" + }, + "inviteLink": { + "description": "Generate a secure link that allows the user to set their own password", + "email": "Email Address", + "emailPlaceholder": "user@example.com (optional)", + "emailDescription": "Optional - leave blank for a general invite link that can be used by anyone", + "emailRequired": "Email address is required", + "emailOptional": "Optional - leave blank for a general invite link", + "emailRequiredForSend": "Email address is required to send email notification", + "expiryHours": "Expiry Hours", + "expiryDescription": "How many hours until the link expires", + "sendEmail": "Send invite link via email", + "sendEmailDescription": "If enabled, the invite link will be sent to the specified email address", + "smtpRequired": "SMTP not configured", + "generate": "Generate Link", + "generated": "Invite Link Generated", + "copied": "Link copied to clipboard", + "success": "Invite link generated successfully", + "successWithEmail": "Invite link generated and sent via email", + "emailFailed": "Invite link generated, but email failed", + "emailFailedDetails": "Error: {0}. Please share the invite link manually.", + "error": "Failed to generate invite link", + "submit": "Generate Invite Link" + }, + "inviteMode": { + "username": "Username", + "email": "Email", + "link": "Link", + "emailDisabled": "Email invites require SMTP configuration and mail.enableInvites=true in settings" + }, + "license": { + "users": "users", + "availableSlots": "Available Slots", + "grandfathered": "Grandfathered", + "grandfatheredShort": "{{count}} grandfathered", + "fromLicense": "from license", + "slotsAvailable": "{{count}} user slot(s) available", + "noSlotsAvailable": "No slots available", + "currentUsage": "Currently using {{current}} of {{max}} user licences" + } + }, + "teams": { + "title": "Teams", + "description": "Manage teams and organize workspace members", + "loading": "Loading teams...", + "loadingDetails": "Loading team details...", + "createNewTeam": "Create New Team", + "teamName": "Team Name", + "totalMembers": "Total Members", + "actions": "Actions", + "noTeamsFound": "No teams found", + "noMembers": "No members in this team", + "system": "System", + "addMember": "Add Member", + "viewTeam": "View Team", + "removeMember": "Remove from team", + "cannotRemoveFromSystemTeam": "Cannot remove from system team", + "renameTeamLabel": "Rename Team", + "deleteTeamLabel": "Delete Team", + "cannotDeleteInternal": "Cannot delete the Internal team", + "confirmDelete": "Are you sure you want to delete this team? This team must be empty to delete.", + "confirmRemove": "Remove user from this team?", + "cannotRenameInternal": "Cannot rename the Internal team", + "cannotAddToInternal": "Cannot add members to the Internal team", + "teamNotFound": "Team not found", + "backToTeams": "Back to Teams", + "memberCount": "{{count}} members", + "removeMemberSuccess": "User removed from team", + "removeMemberError": "Failed to remove user from team", + "createTeam": { + "title": "Create New Team", + "teamName": "Team Name", + "teamNamePlaceholder": "Enter team name", + "cancel": "Cancel", + "submit": "Create Team", + "nameRequired": "Team name is required", + "success": "Team created successfully", + "error": "Failed to create team" + }, + "renameTeam": { + "title": "Rename Team", + "renaming": "Renaming:", + "newTeamName": "New Team Name", + "newTeamNamePlaceholder": "Enter new team name", + "cancel": "Cancel", + "submit": "Rename Team", + "nameRequired": "Team name is required", + "success": "Team renamed successfully", + "error": "Failed to rename team" + }, + "deleteTeam": { + "success": "Team deleted successfully", + "error": "Failed to delete team. Make sure the team is empty.", + "teamMustBeEmpty": "Team must be empty before deletion" + }, + "addMemberToTeam": { + "title": "Add Member to Team", + "addingTo": "Adding to", + "selectUser": "Select User", + "selectUserPlaceholder": "Choose a user", + "selectUserRequired": "Please select a user", + "currentlyIn": "currently in", + "willBeMoved": "Note: This user will be moved from their current team to this team.", + "cancel": "Cancel", + "submit": "Add Member", + "userRequired": "Please select a user", + "success": "Member added to team successfully", + "error": "Failed to add member to team" + }, + "changeTeam": { + "label": "Change Team", + "title": "Change Team", + "changing": "Moving", + "selectTeam": "Select Team", + "selectTeamPlaceholder": "Choose a team", + "selectTeamRequired": "Please select a team", + "success": "Team changed successfully", + "error": "Failed to change team", + "submit": "Change Team" + } + } + }, + "plan": { + "currency": "Currency", + "popular": "Popular", + "current": "Current Plan", + "upgrade": "Upgrade", + "contact": "Contact Us", + "customPricing": "Custom", + "showComparison": "Compare All Features", + "hideComparison": "Hide Feature Comparison", + "featureComparison": "Feature Comparison", + "activePlan": { + "title": "Active Plan", + "subtitle": "Your current subscription details" + }, + "availablePlans": { + "title": "Available Plans", + "subtitle": "Choose the plan that fits your needs" + }, + "static": { + "title": "Billing Information", + "message": "Online billing is not currently configured. To upgrade your plan or manage subscriptions, please contact us directly.", + "contactSales": "Contact Sales", + "contactToUpgrade": "Contact us to upgrade or customize your plan", + "maxUsers": "Max Users", + "upTo": "Up to" + }, + "period": { + "month": "month" + }, + "free": { + "name": "Free", + "highlight1": "Limited Tool Usage Per week", + "highlight2": "Access to all tools", + "highlight3": "Community support" + }, + "pro": { + "name": "Pro", + "highlight1": "Unlimited Tool Usage", + "highlight2": "Advanced PDF tools", + "highlight3": "No watermarks" + }, + "enterprise": { + "name": "Enterprise", + "highlight1": "Custom pricing", + "highlight2": "Dedicated support", + "highlight3": "Latest features" + }, + "feature": { + "title": "Feature", + "pdfTools": "Basic PDF Tools", + "fileSize": "File Size Limit", + "automation": "Automate tool workflows", + "api": "API Access", + "priority": "Priority Support", + "customPricing": "Custom Pricing" + } + }, + "subscription": { + "status": { + "active": "Active", + "pastDue": "Past Due", + "canceled": "Canceled", + "incomplete": "Incomplete", + "trialing": "Trial", + "none": "No Subscription" + }, + "renewsOn": "Renews on {{date}}", + "cancelsOn": "Cancels on {{date}}" + }, + "billing": { + "manageBilling": "Manage Billing", + "portal": { + "error": "Failed to open billing portal" + } + }, + "payment": { + "preparing": "Preparing your checkout...", + "upgradeTitle": "Upgrade to {{planName}}", + "success": "Payment Successful!", + "successMessage": "Your subscription has been activated successfully. You will receive a confirmation email shortly.", + "autoClose": "This window will close automatically...", + "error": "Payment Error" + }, + "firstLogin": { + "title": "First Time Login", + "welcomeTitle": "Welcome!", + "welcomeMessage": "For security reasons, you must change your password on your first login.", + "loggedInAs": "Logged in as", + "error": "Error", + "currentPassword": "Current Password", + "enterCurrentPassword": "Enter your current password", + "newPassword": "New Password", + "enterNewPassword": "Enter new password (min 8 characters)", + "confirmPassword": "Confirm New Password", + "reEnterNewPassword": "Re-enter new password", + "changePassword": "Change Password", + "allFieldsRequired": "All fields are required", + "passwordsDoNotMatch": "New passwords do not match", + "passwordTooShort": "Password must be at least 8 characters", + "passwordMustBeDifferent": "New password must be different from current password", + "passwordChangedSuccess": "Password changed successfully! Please log in again.", + "passwordChangeFailed": "Failed to change password. Please check your current password." + }, + "invite": { + "welcome": "Welcome to Stirling PDF", + "invalidToken": "Invalid invitation link", + "validationError": "Failed to validate invitation link", + "passwordRequired": "Password is required", + "passwordTooShort": "Password must be at least 6 characters", + "passwordMismatch": "Passwords do not match", + "acceptError": "Failed to create account", + "validating": "Validating invitation...", + "invalidInvitation": "Invalid Invitation", + "goToLogin": "Go to Login", + "welcomeTitle": "You've been invited!", + "welcomeSubtitle": "Complete your account setup to get started", + "accountFor": "Creating account for", + "linkExpires": "Link expires", + "email": "Email address", + "emailPlaceholder": "Enter your email address", + "emailRequired": "Email address is required", + "invalidEmail": "Invalid email address", + "choosePassword": "Choose a password", + "passwordPlaceholder": "Enter your password", + "confirmPassword": "Confirm password", + "confirmPasswordPlaceholder": "Re-enter your password", + "createAccount": "Create Account", + "creating": "Creating Account...", + "alreadyHaveAccount": "Already have an account?", + "signIn": "Sign in" + }, + "audit": { + "error": { + "title": "Error loading audit system" + }, + "notAvailable": "Audit system not available", + "notAvailableMessage": "The audit system is not configured or not available.", + "disabled": "Audit logging is disabled", + "disabledMessage": "Enable audit logging in your application configuration to track system events.", + "systemStatus": { + "title": "System Status", + "status": "Audit Logging", + "enabled": "Enabled", + "disabled": "Disabled", + "level": "Audit Level", + "retention": "Retention Period", + "days": "days", + "totalEvents": "Total Events" + }, + "tabs": { + "dashboard": "Dashboard", + "events": "Audit Events", + "export": "Export" + }, + "charts": { + "title": "Audit Dashboard", + "error": "Error loading charts", + "day": "Day", + "week": "Week", + "month": "Month", + "byType": "Events by Type", + "byUser": "Events by User", + "overTime": "Events Over Time" + }, + "events": { + "title": "Audit Events", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "error": "Error loading events", + "noEvents": "No events found", + "timestamp": "Timestamp", + "type": "Type", + "user": "User", + "ipAddress": "IP Address", + "actions": "Actions", + "viewDetails": "View Details", + "eventDetails": "Event Details", + "details": "Details" + }, + "export": { + "title": "Export Audit Data", + "description": "Export audit events to CSV or JSON format. Use filters to limit the exported data.", + "format": "Export Format", + "filters": "Filters (Optional)", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "exportButton": "Export Data", + "error": "Failed to export data" + } + }, + "usage": { + "noData": "No data available", + "error": "Error loading usage statistics", + "noDataMessage": "No usage statistics are currently available.", + "controls": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All", + "refresh": "Refresh", + "dataTypeLabel": "Data Type:", + "dataType": { + "all": "All", + "api": "API", + "ui": "UI" + } + }, + "showing": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All" + }, + "stats": { + "totalEndpoints": "Total Endpoints", + "totalVisits": "Total Visits", + "showing": "Showing", + "selectedVisits": "Selected Visits" + }, + "chart": { + "title": "Endpoint Usage Chart" + }, + "table": { + "title": "Detailed Statistics", + "endpoint": "Endpoint", + "visits": "Visits", + "percentage": "Percentage", + "noData": "No data available" + } + }, + "backendHealth": { + "checking": "Checking backend status...", + "online": "Backend Online", + "offline": "Backend Offline" + }, + "autoRedact": { + "tags": "Hapus, Sembunyikan, padamkan, hitam, hitam, penanda, tersembunyi", + "title": "Redaksional Otomatis", + "header": "Redaksional Otomatis", + "colorLabel": "Warna", + "textsToRedactLabel": "Teks untuk Disunting (dipisahkan baris)", + "textsToRedactPlaceholder": "misalnya \\nRahasia \\nRahasia Tertinggi", + "useRegexLabel": "Gunakan Regex", + "wholeWordSearchLabel": "Pencarian Seluruh Kata", + "customPaddingLabel": "Padding Ekstra Kustom", + "convertPDFToImageLabel": "Konversi PDF ke PDF-Gambar (Digunakan untuk menghapus teks di belakang kotak)", + "submitButton": "Kirim" + }, + "replaceColorPdf": { + "tags": "Ganti Warna,Operasi Halaman,Backend,server side" } -} \ No newline at end of file +} diff --git a/frontend/public/locales/it-IT/translation.json b/frontend/public/locales/it-IT/translation.json index 03aef76f2..66e3af028 100644 --- a/frontend/public/locales/it-IT/translation.json +++ b/frontend/public/locales/it-IT/translation.json @@ -1,4 +1,40 @@ { + "toolPanel": { + "modePrompt": { + "title": "Choose how you browse tools", + "description": "Preview both layouts and decide how you want to explore Stirling PDF tools.", + "sidebarTitle": "Sidebar mode", + "sidebarDescription": "Keep tools alongside your workspace for quick switching.", + "recommended": "Recommended", + "chooseSidebar": "Use sidebar mode", + "fullscreenTitle": "Fullscreen mode - (legacy)", + "fullscreenDescription": "Browse every tool in a catalogue that covers the workspace until you pick one.", + "chooseFullscreen": "Use fullscreen mode", + "dismiss": "Maybe later" + }, + "fullscreen": { + "showDetails": "Show Details", + "comingSoon": "Coming soon:", + "favorite": "Add to favourites", + "favorites": "Favourites", + "heading": "All tools (fullscreen view)", + "noResults": "Try adjusting your search or toggle descriptions to find what you need.", + "recommended": "Recommended", + "unfavorite": "Remove from favourites" + }, + "placeholder": "Choose a tool to get started", + "toggle": { + "fullscreen": "Switch to fullscreen mode", + "sidebar": "Switch to sidebar mode" + } + }, + "unsavedChanges": "Hai modifiche non salvate al tuo PDF. Cosa vuoi fare?", + "areYouSure": "Are you sure you want to leave?", + "unsavedChangesTitle": "Modifiche non salvate", + "keepWorking": "Continua a lavorare", + "discardChanges": "Scarta modifiche", + "applyAndContinue": "Applica e continua", + "exportAndContinue": "Esporta e continua", "language": { "direction": "ltr" }, @@ -18,8 +54,26 @@ "customTextDesc": "Testo personalizzato", "numberPagesDesc": "Quali pagine numerare, impostazione predefinita \"tutte\", accetta anche 1-5 o 2,5,9 ecc", "customNumberDesc": "Il valore predefinito è {n}, accetta anche 'Pagina {n} di {total}', 'Testo-{n}', '{filename}-{n}", - "submit": "Aggiungi numeri di pagina" + "submit": "Aggiungi numeri di pagina", + "configuration": "Configuration", + "customize": "Customize Appearance", + "pagesAndStarting": "Pages & Starting Number", + "positionAndPages": "Position & Pages", + "error": { + "failed": "Add page numbers operation failed" + }, + "results": { + "title": "Page Number Results" + }, + "preview": "Position Selection", + "previewDisclaimer": "Preview is approximate. Final output may vary due to PDF font metrics." }, + "pageSelectionPrompt": "Selezione pagina personalizzata (inserisci un elenco separato da virgole di numeri di pagina 1,5,6 o funzioni come 2n+1) :", + "startingNumberTooltip": "The first number to display. Subsequent pages will increment from this number.", + "marginTooltip": "Distance between the page number and the edge of the page.", + "fontSizeTooltip": "Size of the page number text in points. Larger numbers create bigger text.", + "fontTypeTooltip": "Font family for the page numbers. Choose based on your document style.", + "customTextTooltip": "Optional custom format for page numbers. Use {n} as placeholder for the number. Example: \"Page {n}\" will show \"Page 1\", \"Page 2\", etc.", "pdfPrompt": "Scegli PDF", "multiPdfPrompt": "Scegli 2 o piÚ PDF", "multiPdfDropPrompt": "Scegli (o trascina e rilascia) uno o piÚ PDF", @@ -30,7 +84,6 @@ "uploadLimitExceededPlural": "sono troppo grandi. La dimensione massima consentita è", "processTimeWarning": "Nota: Questo processo potrebbe richiedere fino a un minuto in base alla dimensione dei file", "pageOrderPrompt": "Ordine delle pagine (inserisci una lista di numeri separati da virgola):", - "pageSelectionPrompt": "Selezione pagina personalizzata (inserisci un elenco separato da virgole di numeri di pagina 1,5,6 o funzioni come 2n+1) :", "goToPage": "Vai", "true": "Vero", "false": "Falso", @@ -41,11 +94,18 @@ "save": "Salva", "saveToBrowser": "Salva nel browser", "download": "Salva", + "pin": "Pin File (keep active after tool run)", + "unpin": "Unpin File (replace after tool run)", "undoOperationTooltip": "Clicca per annullare l’ultima operazione e ripristinare i file originali", "undo": "Annulla", "moreOptions": "Altre opzioni", "editYourNewFiles": "Modifica il/i nuovo/i file", "close": "Chiudi", + "openInViewer": "Open in Viewer", + "confirmClose": "Confirm Close", + "confirmCloseMessage": "Are you sure you want to close this file?", + "confirmCloseCancel": "Cancel", + "confirmCloseConfirm": "Close File", "fileSelected": "Selezionato: {{filename}}", "chooseFile": "Scegli file", "filesSelected": "file selezionati", @@ -55,7 +115,9 @@ "uploadFiles": "Carica file", "addFiles": "Aggiungi file", "selectFromWorkbench": "Seleziona file dal banco di lavoro oppure ", - "selectMultipleFromWorkbench": "Seleziona almeno {{count}} file dal banco di lavoro oppure " + "selectMultipleFromWorkbench": "Seleziona almeno {{count}} file dal banco di lavoro oppure ", + "created": "Created", + "size": "File Size" }, "noFavourites": "Nessun preferito", "downloadComplete": "Download completo", @@ -74,7 +136,10 @@ }, "error": { "pdfPassword": "Il documento PDF è protetto da password e la password non è stata fornita oppure non era corretta", + "encryptedPdfMustRemovePassword": "Questo PDF è crittografato o protetto da password. Si prega di sbloccarlo prima di convertire in PDF/A.", + "incorrectPasswordProvided": "La password del PDF è errata o non è stata fornita.", "_value": "Errore", + "dismissAllErrors": "Chiudi tutti gli errori", "sorry": "Ci scusiamo per il problema!", "needHelp": "Hai bisogno di aiuto / trovato un problema?", "contactTip": "Se i problemi persistono, non esitare a contattarci per chiedere aiuto. Puoi aprire un ticket sulla nostra pagina GitHub o contattarci tramite Discord:", @@ -87,10 +152,7 @@ "showStack": "Mostra traccia dello stack", "copyStack": "Copia traccia dello stack", "githubSubmit": "GitHub: apri un ticket", - "discordSubmit": "Discord: invia post di supporto", - "dismissAllErrors": "Chiudi tutti gli errori", - "encryptedPdfMustRemovePassword": "Questo PDF è crittografato o protetto da password. Si prega di sbloccarlo prima di convertire in PDF/A.", - "incorrectPasswordProvided": "La password del PDF è errata o non è stata fornita." + "discordSubmit": "Discord: invia post di supporto" }, "warning": { "tooltipTitle": "Avviso" @@ -188,6 +250,7 @@ "title": "Vuoi migliorare Stirling PDF?", "paragraph1": "Stirling PDF ha opt-in analytics per aiutarci a migliorare il prodotto. Non tracciamo alcuna informazione personale o contenuto di file.", "paragraph2": "Si prega di prendere in considerazione l'attivazione dell'analytics per aiutare Stirling-PDF a crescere e consentirci di comprendere meglio i nostri utenti.", + "learnMore": "Learn more", "enable": "Abilita analytics", "disable": "Disabilita analytics", "settings": "È possibile modificare le impostazioni per analitycs nel file config/settings.yml" @@ -231,6 +294,54 @@ "cacheInputs": { "name": "Salva gli input del modulo", "help": "Abilitare per memorizzare gli input utilizzati in precedenza per esecuzioni future" + }, + "general": { + "title": "General", + "description": "Configure general application preferences.", + "account": "Account", + "accountDescription": "Manage your account settings", + "user": "User", + "signedInAs": "Signed in as", + "logout": "Log out", + "enableFeatures": { + "title": "For System Administrators", + "intro": "Enable user authentication, team management, and workspace features for your organization.", + "action": "Configure", + "and": "and", + "benefit": "Enables user roles, team collaboration, admin controls, and enterprise features.", + "learnMore": "Learn more in documentation", + "dismiss": "Dismiss" + }, + "autoUnzip": "Auto-unzip API responses", + "autoUnzipDescription": "Automatically extract files from ZIP responses", + "autoUnzipTooltip": "Automatically extract ZIP files returned from API operations. Disable to keep ZIP files intact. This does not affect automation workflows.", + "autoUnzipFileLimit": "Auto-unzip file limit", + "autoUnzipFileLimitDescription": "Maximum number of files to extract from ZIP", + "autoUnzipFileLimitTooltip": "Only unzip if the ZIP contains this many files or fewer. Set higher to extract larger ZIPs.", + "defaultToolPickerMode": "Default tool picker mode", + "defaultToolPickerModeDescription": "Choose whether the tool picker opens in fullscreen or sidebar by default", + "mode": { + "fullscreen": "Fullscreen", + "sidebar": "Sidebar" + } + }, + "hotkeys": { + "title": "Keyboard Shortcuts", + "description": "Hover a tool to see its shortcut or customise it below. Click \"Change shortcut\" and press a new key combination. Press Esc to cancel.", + "errorModifier": { + "mac": "Include ⌘ (Command), âŒĨ (Option), or another modifier in your shortcut.", + "windows": "Include Ctrl, Alt, or another modifier in your shortcut." + }, + "errorConflict": "Shortcut already used by {{tool}}.", + "none": "Not assigned", + "customBadge": "Custom", + "defaultLabel": "Default: {{shortcut}}", + "capturing": "Press keysâ€Ļ (Esc to cancel)", + "change": "Change shortcut", + "reset": "Reset", + "shortcut": "Shortcut", + "noShortcut": "No shortcut set", + "searchPlaceholder": "Search tools..." } }, "changeCreds": { @@ -302,8 +413,10 @@ "top20": "I migliori 20", "all": "Tutto", "refresh": "Aggiorna", - "includeHomepage": "Includi homepage ('/')", - "includeLoginPage": "Includi pagina di login ('/login')", + "dataTypeLabel": "Data Type:", + "dataTypeAll": "All", + "dataTypeApi": "API", + "dataTypeUi": "UI", "totalEndpoints": "Endpoint totali", "totalVisits": "Visite totali", "showing": "Mostrare", @@ -318,7 +431,9 @@ "top": "Migliore", "numberOfVisits": "Numero di visite", "visitsTooltip": "Visite: {0} ({1}% del totale)", - "retry": "Riprovare" + "retry": "Riprovare", + "includeHomepage": "Includi homepage ('/')", + "includeLoginPage": "Includi pagina di login ('/login')" }, "database": { "title": "Importazione/Esportazione database", @@ -359,278 +474,284 @@ "alphabetical": "Alfabetico", "globalPopularity": "Popolarità", "sortBy": "Ordinamento:", + "mobile": { + "brandAlt": "Stirling PDF logo", + "openFiles": "Open files", + "swipeHint": "Swipe left or right to switch views", + "tools": "Tools", + "toolsSlide": "Tool selection panel", + "viewSwitcher": "Switch workspace view", + "workbenchSlide": "Workspace panel", + "workspace": "Workspace" + }, "multiTool": { + "tags": "multipli,strumenti", "title": "Multifunzione PDF", - "desc": "Unisci, Ruota, Riordina, e Rimuovi pagine", - "tags": "multipli,strumenti" + "desc": "Unisci, Ruota, Riordina, e Rimuovi pagine" }, "merge": { + "tags": "combina,unisci,unifica", "title": "Unisci", - "desc": "Unisci facilmente piÚ PDF in uno.", - "tags": "combina,unisci,unifica" + "desc": "Unisci facilmente piÚ PDF in uno." }, "split": { + "tags": "dividi,separa,spezza", "title": "Dividi", - "desc": "Dividi un singolo PDF in piÚ documenti.", - "tags": "dividi,separa,spezza" + "desc": "Dividi un singolo PDF in piÚ documenti." }, "rotate": { + "tags": "ruota,capovolgi,orienta", "title": "Ruota", - "desc": "Ruota un PDF.", - "tags": "ruota,capovolgi,orienta" + "desc": "Ruota un PDF." }, "convert": { + "tags": "trasforma,cambia", "title": "Converti", - "desc": "Converti file tra diversi formati", - "tags": "trasforma,cambia" + "desc": "Converti file tra diversi formati" }, "pdfOrganiser": { + "tags": "organizza,riordina,riorganizza", "title": "Organizza", - "desc": "Rimuovi/Riordina le pagine in qualsiasi ordine.", - "tags": "organizza,riordina,riorganizza" + "desc": "Rimuovi/Riordina le pagine in qualsiasi ordine." }, "addImage": { + "tags": "inserisci,incorpora,posiziona", "title": "Aggiungi Immagine", - "desc": "Aggiungi un'immagine in un punto specifico del PDF (Lavori in corso)", - "tags": "inserisci,incorpora,posiziona" + "desc": "Aggiungi un'immagine in un punto specifico del PDF (Lavori in corso)" }, "addAttachments": { + "tags": "incorpora,allega,includi", "title": "Aggiungi allegati", - "desc": "Aggiungi o rimuovi file incorporati (allegati) da/verso un PDF", - "tags": "incorpora,allega,includi" + "desc": "Aggiungi o rimuovi file incorporati (allegati) da/verso un PDF" }, "watermark": { + "tags": "timbro,marca,sovrapponi", "title": "Aggiungi Filigrana", - "desc": "Aggiungi una filigrana al tuo PDF.", - "tags": "timbro,marca,sovrapponi" + "desc": "Aggiungi una filigrana al tuo PDF." }, "removePassword": { + "tags": "sblocca", "title": "Rimuovi Password", - "desc": "Rimuovi la password dal tuo PDF.", - "tags": "sblocca" + "desc": "Rimuovi la password dal tuo PDF." }, "compress": { + "tags": "riduci,comprimi,ottimizza", "title": "Comprimi", - "desc": "Comprimi PDF per ridurne le dimensioni.", - "tags": "riduci,comprimi,ottimizza" + "desc": "Comprimi PDF per ridurne le dimensioni." }, "unlockPDFForms": { + "tags": "sblocca,abilita,modifica", "title": "Sblocca moduli PDF", - "desc": "Rimuovi la proprietà di sola lettura dei campi del modulo in un documento PDF.", - "tags": "sblocca,abilita,modifica" + "desc": "Rimuovi la proprietà di sola lettura dei campi del modulo in un documento PDF." }, "changeMetadata": { + "tags": "modifica,cambia,aggiorna", "title": "Modifica Proprietà", - "desc": "Modifica/Aggiungi/Rimuovi le proprietà di un documento PDF.", - "tags": "modifica,cambia,aggiorna" + "desc": "Modifica/Aggiungi/Rimuovi le proprietà di un documento PDF." }, "ocr": { + "tags": "estrai,scansiona", "title": "OCR / Pulisci scansioni", - "desc": "Pulisci scansioni ed estrai testo da immagini, convertendo le immagini in testo puro.", - "tags": "estrai,scansiona" + "desc": "Pulisci scansioni ed estrai testo da immagini, convertendo le immagini in testo puro." }, "extractImages": { + "tags": "estrai,salva,esporta", "title": "Estrai immagini", - "desc": "Estrai tutte le immagini da un PDF e salvale come zip.", - "tags": "estrai,salva,esporta" + "desc": "Estrai tutte le immagini da un PDF e salvale come zip." }, "scannerImageSplit": { + "tags": "rileva,dividi,foto", "title": "Rileva/Dividi foto scansionate", - "desc": "Divide piÚ foto all’interno di una foto/PDF", - "tags": "rileva,dividi,foto" + "desc": "Divide piÚ foto all’interno di una foto/PDF" }, "sign": { + "tags": "firma,autografo", "title": "Firma", - "desc": "Aggiungi una firma al PDF da disegno, testo o immagine.", - "tags": "firma,autografo" + "desc": "Aggiungi una firma al PDF da disegno, testo o immagine." }, "flatten": { + "tags": "semplifica,rimuovi,interattivo", "title": "Appiattisci", - "desc": "Rimuovi tutti gli elementi interattivi e moduli da un PDF.", - "tags": "semplifica,rimuovi,interattivo" + "desc": "Rimuovi tutti gli elementi interattivi e moduli da un PDF." }, "certSign": { + "tags": "autentica,PEM,P12,ufficiale,cripta,firma,certificato,PKCS12,JKS,server,manuale,auto", "title": "Firma con certificato", - "desc": "Firma un PDF con un certificato/chiave (PEM/P12)", - "tags": "autentica,PEM,P12,ufficiale,cripta,firma,certificato,PKCS12,JKS,server,manuale,auto" + "desc": "Firma un PDF con un certificato/chiave (PEM/P12)" }, "repair": { + "tags": "ripara,ripristina", "title": "Ripara", - "desc": "Prova a riparare un PDF corrotto.", - "tags": "ripara,ripristina" + "desc": "Prova a riparare un PDF corrotto." }, "removeBlanks": { + "tags": "elimina,pulisci,vuote", "title": "Rimuovi pagine vuote", - "desc": "Trova e rimuovi pagine vuote da un PDF.", - "tags": "elimina,pulisci,vuote" + "desc": "Trova e rimuovi pagine vuote da un PDF." }, "removeAnnotations": { + "tags": "elimina,pulisci,rimuovi", "title": "Rimuovi annotazioni", - "desc": "Rimuove tutti i commenti/annotazioni da un PDF", - "tags": "elimina,pulisci,rimuovi" + "desc": "Rimuove tutti i commenti/annotazioni da un PDF" }, "compare": { + "tags": "differenza", "title": "Compara", - "desc": "Vedi e compara le differenze tra due PDF.", - "tags": "differenza" + "desc": "Vedi e compara le differenze tra due PDF." }, "removeCertSign": { + "tags": "rimuovi,elimina,sblocca", "title": "Rimuovere firma dal certificato", - "desc": "Rimuovi la firma del certificato dal PDF", - "tags": "rimuovi,elimina,sblocca" + "desc": "Rimuovi la firma del certificato dal PDF" }, "pageLayout": { + "tags": "layout,disponi,combina", "title": "Layout multipagina", - "desc": "Unisci piÚ pagine di un documento PDF in un'unica pagina", - "tags": "layout,disponi,combina" + "desc": "Unisci piÚ pagine di un documento PDF in un'unica pagina" }, "bookletImposition": { + "tags": "opuscolo,stampa,rilegatura", "title": "Imposizione a libretto", - "desc": "Crea libretti con corretto ordinamento pagine e layout multipagina per stampa e rilegatura", - "tags": "opuscolo,stampa,rilegatura" + "desc": "Crea libretti con corretto ordinamento pagine e layout multipagina per stampa e rilegatura" }, "scalePages": { + "tags": "ridimensiona,adatta,scala", "title": "Regola le dimensioni/scala della pagina", - "desc": "Modificare le dimensioni/scala della pagina e/o dei suoi contenuti.", - "tags": "ridimensiona,adatta,scala" + "desc": "Modificare le dimensioni/scala della pagina e/o dei suoi contenuti." }, "addPageNumbers": { + "tags": "numero,paginazione,conteggio", "title": "Aggiungi numeri di pagina", - "desc": "Aggiungi numeri di pagina in tutto un documento in una posizione prestabilita", - "tags": "numero,paginazione,conteggio" + "desc": "Aggiungi numeri di pagina in tutto un documento in una posizione prestabilita" }, "autoRename": { + "tags": "auto-rilevamento,basato su intestazione,organizza,rinomina", "title": "Rinomina automatica file PDF", - "desc": "Rinomina automaticamente un file PDF in base all’intestazione rilevata", - "tags": "auto-rilevamento,basato su intestazione,organizza,rinomina" + "desc": "Rinomina automaticamente un file PDF in base all’intestazione rilevata" }, "adjustContrast": { + "tags": "contrasto,luminosità,saturazione", "title": "Regola colori/contrasto", - "desc": "Regola contrasto, saturazione e luminosità di un PDF", - "tags": "contrasto,luminosità,saturazione" + "desc": "Regola contrasto, saturazione e luminosità di un PDF" }, "crop": { + "tags": "ritaglia,taglia,ridimensiona", "title": "Ritaglia PDF", - "desc": "Ritaglia un PDF per ridurne le dimensioni (mantiene il testo!)", - "tags": "ritaglia,taglia,ridimensiona" + "desc": "Ritaglia un PDF per ridurne le dimensioni (mantiene il testo!)" }, "autoSplitPDF": { + "tags": "auto,dividi,QR", "title": "Pagine divise automaticamente", - "desc": "Dividi automaticamente il PDF scansionato con il codice QR dello divisore di pagina fisico scansionato", - "tags": "auto,dividi,QR" + "desc": "Dividi automaticamente il PDF scansionato con il codice QR dello divisore di pagina fisico scansionato" }, "sanitize": { + "tags": "pulisci,elimina,rimuovi", "title": "Sanitizza", - "desc": "Rimuovi elementi potenzialmente dannosi dai PDF", - "tags": "pulisci,elimina,rimuovi" + "desc": "Rimuovi elementi potenzialmente dannosi dai PDF" }, "getPdfInfo": { + "tags": "info,metadati,dettagli", "title": "Ottieni TUTTE le informazioni in PDF", - "desc": "Raccogli tutte le informazioni possibili sui PDF", - "tags": "info,metadati,dettagli" + "desc": "Raccogli tutte le informazioni possibili sui PDF" }, "pdfToSinglePage": { + "tags": "combina,unisci,singola", "title": "PDF in un'unica pagina di grandi dimensioni", - "desc": "Unisce tutte le pagine PDF in un'unica grande pagina", - "tags": "combina,unisci,singola" + "desc": "Unisce tutte le pagine PDF in un'unica grande pagina" }, "showJS": { + "tags": "javascript,codice,script", "title": "Mostra Javascript", - "desc": "Cerca e visualizza qualsiasi JS inserito in un PDF", - "tags": "javascript,codice,script" + "desc": "Cerca e visualizza qualsiasi JS inserito in un PDF" }, "redact": { + "tags": "censura,oscura,nascondi", "title": "Redazione manuale", - "desc": "Redige un PDF in base al testo selezionato, alle forme disegnate e/o alle pagina selezionata(e)", - "tags": "censura,oscura,nascondi" - }, - "overlayPdfs": { - "title": "Sovrapponi PDF", - "desc": "Sovrapponi PDF sopra un altro PDF", - "tags": "sovrapponi,combina,impila" + "desc": "Redige un PDF in base al testo selezionato, alle forme disegnate e/o alle pagina selezionata(e)" }, "splitBySections": { + "tags": "dividi,sezioni,separa", "title": "Dividi PDF per sezioni", - "desc": "Divide ogni pagina di un PDF in sezioni orizzontali e verticali piÚ piccole", - "tags": "dividi,sezioni,separa" + "desc": "Divide ogni pagina di un PDF in sezioni orizzontali e verticali piÚ piccole" }, "addStamp": { + "tags": "timbro,marca,sigillo", "title": "Aggiungi timbro al PDF", - "desc": "Aggiungi timbri di testo o immagine in posizioni specifiche", - "tags": "timbro,marca,sigillo" + "desc": "Aggiungi timbri di testo o immagine in posizioni specifiche" }, "removeImage": { + "tags": "rimuovi,elimina,pulisci", "title": "Rimuovi immagine", - "desc": "Rimuovi le immagini dal PDF per ridurre la dimensione del file", - "tags": "rimuovi,elimina,pulisci" + "desc": "Rimuovi le immagini dal PDF per ridurre la dimensione del file" }, "splitByChapters": { + "tags": "dividi,capitoli,struttura", "title": "Dividi PDF per capitoli", - "desc": "Dividi un PDF in piÚ file in base alla struttura dei capitoli.", - "tags": "dividi,capitoli,struttura" + "desc": "Dividi un PDF in piÚ file in base alla struttura dei capitoli." }, "validateSignature": { + "tags": "convalida,verifica,certificato", "title": "Convalida la firma PDF", - "desc": "Verificare le firme digitali e i certificati nei documenti PDF", - "tags": "convalida,verifica,certificato" + "desc": "Verificare le firme digitali e i certificati nei documenti PDF" }, "swagger": { + "tags": "API,documentazione,test", "title": "Documentazione API", - "desc": "Visualizza documentazione API e testa gli endpoint", - "tags": "API,documentazione,test" + "desc": "Visualizza documentazione API e testa gli endpoint" }, - "fakeScan": { - "title": "Finta scansione", - "desc": "Crea un PDF che sembri scansionato" + "scannerEffect": { + "tags": "scansiona,simula,crea", + "title": "Effetto scanner", + "desc": "Crea un PDF che sembra essere stato scansionato" }, "editTableOfContents": { + "tags": "segnalibri,contenuti,modifica", "title": "Modifica indice", - "desc": "Aggiungi o modifica segnalibri e sommario nei documenti PDF", - "tags": "segnalibri,contenuti,modifica" + "desc": "Aggiungi o modifica segnalibri e sommario nei documenti PDF" }, "manageCertificates": { + "tags": "certificati,importa,esporta", "title": "Gestisci certificati", - "desc": "Importa, esporta o elimina i file certificato usati per firmare i PDF.", - "tags": "certificati,importa,esporta" + "desc": "Importa, esporta o elimina i file certificato usati per firmare i PDF." }, "read": { + "tags": "visualizza,apri,mostra", "title": "Leggi", - "desc": "Visualizza e annota PDF. Evidenzia testo, disegna o inserisci commenti per revisione e collaborazione.", - "tags": "visualizza,apri,mostra" + "desc": "Visualizza e annota PDF. Evidenzia testo, disegna o inserisci commenti per revisione e collaborazione." }, "reorganizePages": { + "tags": "riordina,riorganizza,organizza", "title": "Riorganizza pagine", - "desc": "Riorganizza, duplica o elimina pagine PDF con controllo visivo drag‑and‑drop.", - "tags": "riordina,riorganizza,organizza" + "desc": "Riorganizza, duplica o elimina pagine PDF con controllo visivo drag‑and‑drop." }, "extractPages": { + "tags": "estrai,seleziona,copia", "title": "Estrai pagine", - "desc": "Estrai pagine specifiche da un PDF", - "tags": "estrai,seleziona,copia" + "desc": "Estrai pagine specifiche da un PDF" }, "removePages": { + "tags": "elimina,estrai,escludi", "title": "Rimuovi", - "desc": "Elimina alcune pagine dal PDF.", - "tags": "elimina,estrai,escludi" + "desc": "Elimina alcune pagine dal PDF." }, "autoSizeSplitPDF": { + "tags": "auto,dividi,dimensione", "title": "Divisione automatica per dimensione/numero", - "desc": "Dividi un singolo PDF in piÚ documenti in base alle dimensioni, al numero di pagine o al numero di documenti", - "tags": "auto,dividi,dimensione" + "desc": "Dividi un singolo PDF in piÚ documenti in base alle dimensioni, al numero di pagine o al numero di documenti" }, - "replaceColorPdf": { - "title": "Sostituisci e inverti il colore", - "desc": "Sostituisci il colore del testo e dello sfondo nel PDF e inverti il ​​colore completo del PDF per ridurre le dimensioni del file" + "replaceColor": { + "title": "Sostituisci e inverti colore", + "desc": "Sostituisci o inverti i colori nei documenti PDF" }, "devApi": { + "tags": "API,sviluppo,documentazione", "title": "API", - "desc": "Link alla documentazione API", - "tags": "API,sviluppo,documentazione" + "desc": "Link alla documentazione API" }, "devFolderScanning": { + "tags": "automazione,cartella,scansione", "title": "Scansione cartelle automatizzata", - "desc": "Link alla guida per scansione cartelle automatizzata", - "tags": "automazione,cartella,scansione" + "desc": "Link alla guida per scansione cartelle automatizzata" }, "devSsoGuide": { "title": "Guida SSO", @@ -649,18 +770,26 @@ "desc": "Modifica restrizioni e permessi del documento" }, "automate": { + "tags": "flusso di lavoro,sequenza,automazione", "title": "Automatizza", - "desc": "Crea flussi multi‑step concatenando azioni PDF. Ideale per attività ricorrenti.", - "tags": "flusso di lavoro,sequenza,automazione" + "desc": "Crea flussi multi‑step concatenando azioni PDF. Ideale per attività ricorrenti." }, - "replaceColor": { - "desc": "Sostituisci o inverti i colori nei documenti PDF", - "title": "Sostituisci e inverti colore" + "overlay-pdfs": { + "desc": "Overlay one PDF on top of another", + "title": "Overlay PDFs" }, - "scannerEffect": { - "desc": "Crea un PDF che sembra essere stato scansionato", - "tags": "scansiona,simula,crea", - "title": "Effetto scanner" + "overlayPdfs": { + "title": "Sovrapponi PDF", + "desc": "Sovrapponi PDF sopra un altro PDF", + "tags": "sovrapponi,combina,impila" + }, + "fakeScan": { + "title": "Finta scansione", + "desc": "Crea un PDF che sembri scansionato" + }, + "replaceColorPdf": { + "title": "Sostituisci e inverti il colore", + "desc": "Sostituisci il colore del testo e dello sfondo nel PDF e inverti il ​​colore completo del PDF per ridurre le dimensioni del file" } }, "landing": { @@ -700,13 +829,19 @@ "merge": { "tags": "unione,operazioni sulla pagina,back-end,lato server", "title": "Unisci", - "removeDigitalSignature.tooltip": { - "title": "Rimuovi firma digitale", - "description": "Le firme digitali verranno invalidate durante l’unione dei file. Seleziona per rimuoverle dal PDF finale." + "removeDigitalSignature": { + "label": "Rimuovere la firma digitale nel file unito?", + "tooltip": { + "title": "Rimuovi firma digitale", + "description": "Le firme digitali verranno invalidate durante l’unione dei file. Seleziona per rimuoverle dal PDF finale." + } }, - "generateTableOfContents.tooltip": { - "title": "Genera indice", - "description": "Crea automaticamente un indice cliccabile nel PDF unito basato sui nomi dei file originali e sui numeri di pagina." + "generateTableOfContents": { + "label": "Generare l'indice nel file unito?", + "tooltip": { + "title": "Genera indice", + "description": "Crea automaticamente un indice cliccabile nel PDF unito basato sui nomi dei file originali e sui numeri di pagina." + } }, "submit": "Unisci", "sortBy": { @@ -720,12 +855,9 @@ }, "error": { "failed": "Si è verificato un errore durante l’unione dei PDF." - }, - "generateTableOfContents": "Generare l'indice nel file unito?", - "removeDigitalSignature": "Rimuovere la firma digitale nel file unito?" + } }, "split": { - "tags": "Operazioni sulla pagina,divisione,multi pagina,taglio,lato server", "title": "Dividi PDF", "header": "Dividi PDF", "desc": { @@ -847,13 +979,51 @@ "bullet1": "Livello segnalibro: livello su cui dividere (1=primo livello)", "bullet2": "Includi metadati: preserva le proprietà del documento", "bullet3": "Consenti duplicati: gestisce nomi segnalibro ripetuti" + }, + "byDocCount": { + "bullet1": "Enter the number of output files you want", + "bullet2": "Pages are distributed as evenly as possible", + "bullet3": "Useful when you need a specific number of files", + "text": "Create a specific number of output files by evenly distributing pages across them.", + "title": "Split by Document Count" + }, + "byPageCount": { + "bullet1": "Enter the number of pages per output file", + "bullet2": "Last file may have fewer pages if not evenly divisible", + "bullet3": "Useful for batch processing workflows", + "text": "Create multiple PDFs with a specific number of pages each. Perfect for creating uniform document chunks.", + "title": "Split by Page Count" + }, + "byPageDivider": { + "bullet1": "Print divider sheets from the download link", + "bullet2": "Insert divider sheets between your documents", + "bullet3": "Scan all documents together as one PDF", + "bullet4": "Upload - divider pages are automatically detected and removed", + "bullet5": "Enable Duplex Mode if scanning both sides of divider sheets", + "text": "Automatically split scanned documents using physical divider sheets with QR codes. Perfect for processing multiple documents scanned together.", + "title": "Split by Page Divider" } - } + }, + "methodSelection": { + "tooltip": { + "bullet1": "Click on a method card to select it", + "bullet2": "Hover over each card to see a quick description", + "bullet3": "The settings step will appear after you select a method", + "bullet4": "You can change methods at any time before processing", + "header": { + "text": "Choose how you want to split your PDF document. Each method is optimized for different use cases and document types.", + "title": "Split Method Selection" + }, + "title": "Choose Your Split Method" + } + }, + "selectMethod": "Select a split method", + "tags": "Operazioni sulla pagina,divisione,multi pagina,taglio,lato server" }, "rotate": { - "tags": "lato server", "title": "Ruota PDF", "submit": "Ruota", + "selectRotation": "Select Rotation Angle (Clockwise)", "error": { "failed": "Si è verificato un errore durante la rotazione del PDF." }, @@ -873,7 +1043,8 @@ "title": "Controlli", "text": "Usa i pulsanti di rotazione per regolare l’orientamento. Il pulsante sinistro ruota in senso antiorario, quello destro in senso orario. Ogni clic ruota di 90 gradi." } - } + }, + "tags": "lato server" }, "convert": { "title": "Converti", @@ -941,7 +1112,8 @@ "imagesExt": "Immagini (JPG, PNG, ecc.)", "markdown": "Markdown", "textRtf": "Testo/RTF", - "grayscale": "Scala di grigi" + "grayscale": "Scala di grigi", + "errorConversion": "An error occurred while converting the file." }, "imageToPdf": { "tags": "conversione,img,jpg,immagine,foto" @@ -979,22 +1151,35 @@ "8": "Rimuovi ultima", "9": "Rimuovi la prima e l'ultima", "10": "Unione pari-dispari", - "11": "Duplica tutte le pagine" + "11": "Duplica tutte le pagine", + "desc": { + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, â€Ļ).", + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, â€Ļ).", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimized for binding on the side)." + } }, - "placeholder": "(ad es. 1,3,2 o 4-8,2,10-12 o 2n-1)", "desc": { - "BOOKLET_SORT": "Disporre le pagine per la stampa a opuscolo (ultima, prima, seconda, penultima, â€Ļ).", "CUSTOM": "Utilizzare una sequenza personalizzata di numeri di pagina o espressioni per definire un nuovo ordine.", - "DUPLEX_SORT": "Alternare fronte e retro come se uno scanner duplex avesse scansionato tutti i fronti, poi tutti i retri (1, n, 2, n-1, â€Ļ).", - "DUPLICATE": "Duplicare ogni pagina secondo il conteggio dell'ordine personalizzato (ad es., 4 duplica ogni pagina 4×).", - "ODD_EVEN_MERGE": "Unire due PDF alternando le pagine: dispari dal primo, pari dal secondo.", - "ODD_EVEN_SPLIT": "Dividere il documento in due output: tutte le pagine dispari e tutte le pagine pari.", - "REMOVE_FIRST": "Rimuovere la prima pagina dal documento.", - "REMOVE_FIRST_AND_LAST": "Rimuovere sia la prima che l'ultima pagina dal documento.", - "REMOVE_LAST": "Rimuovere l'ultima pagina dal documento.", "REVERSE_ORDER": "Capovolgere il documento in modo che l'ultima pagina diventi la prima e cosÃŦ via.", - "SIDE_STITCH_BOOKLET_SORT": "Disporre le pagine per la stampa a opuscolo con cucitura laterale (ottimizzato per la rilegatura sul lato)." - } + "DUPLEX_SORT": "Alternare fronte e retro come se uno scanner duplex avesse scansionato tutti i fronti, poi tutti i retri (1, n, 2, n-1, â€Ļ).", + "BOOKLET_SORT": "Disporre le pagine per la stampa a opuscolo (ultima, prima, seconda, penultima, â€Ļ).", + "SIDE_STITCH_BOOKLET_SORT": "Disporre le pagine per la stampa a opuscolo con cucitura laterale (ottimizzato per la rilegatura sul lato).", + "ODD_EVEN_SPLIT": "Dividere il documento in due output: tutte le pagine dispari e tutte le pagine pari.", + "ODD_EVEN_MERGE": "Unire due PDF alternando le pagine: dispari dal primo, pari dal secondo.", + "DUPLICATE": "Duplicare ogni pagina secondo il conteggio dell'ordine personalizzato (ad es., 4 duplica ogni pagina 4×).", + "REMOVE_FIRST": "Rimuovere la prima pagina dal documento.", + "REMOVE_LAST": "Rimuovere l'ultima pagina dal documento.", + "REMOVE_FIRST_AND_LAST": "Rimuovere sia la prima che l'ultima pagina dal documento." + }, + "placeholder": "(ad es. 1,3,2 o 4-8,2,10-12 o 2n-1)" }, "addImage": { "tags": "img,jpg,immagine,foto", @@ -1045,7 +1230,9 @@ "opacity": "Opacità (%)", "spacing": { "horizontal": "Spaziatura orizzontale", - "vertical": "Spaziatura verticale" + "vertical": "Spaziatura verticale", + "height": "Height Spacing", + "width": "Width Spacing" }, "convertToImage": "Appiattisci pagine PDF in immagini" }, @@ -1188,6 +1375,10 @@ "bullet4": "Ideale per contenuti sensibili o protetti da copyright" } } + }, + "type": { + "1": "Text", + "2": "Image" } }, "permissions": { @@ -1261,6 +1452,26 @@ }, "submit": "Rimuovi" }, + "extractPages": { + "title": "Extract Pages", + "pageNumbers": { + "label": "Pages to Extract", + "placeholder": "e.g., 1,3,5-8 or odd & 1-10" + }, + "settings": { + "title": "Settings" + }, + "tooltip": { + "description": "Extracts the selected pages into a new PDF, preserving order." + }, + "error": { + "failed": "Failed to extract pages" + }, + "results": { + "title": "Pages Extracted" + }, + "submit": "Extract Pages" + }, "pageSelection": { "tooltip": { "header": { @@ -1301,10 +1512,43 @@ }, "examples": { "title": "Esempi" + }, + "complex": { + "bullet1": "1,3-5,8,2n → pages 1, 3–5, 8, plus evens", + "bullet2": "10-,2n-1 → from page 10 to end + odd pages", + "description": "Mix different types.", + "title": "Complex Combinations" + }, + "description": "Choose which pages to use for the operation. Supports single pages, ranges, formulas, and the all keyword.", + "individual": { + "bullet1": "1,3,5 → selects pages 1, 3, 5", + "bullet2": "2,7,12 → selects pages 2, 7, 12", + "description": "Enter numbers separated by commas.", + "title": "Individual Pages" + }, + "mathematical": { + "bullet1": "2n → all even pages (2, 4, 6â€Ļ)", + "bullet2": "2n-1 → all odd pages (1, 3, 5â€Ļ)", + "bullet3": "3n → every 3rd page (3, 6, 9â€Ļ)", + "bullet4": "4n-1 → pages 3, 7, 11, 15â€Ļ", + "description": "Use n in formulas for patterns.", + "title": "Mathematical Functions" + }, + "ranges": { + "bullet1": "3-6 → selects pages 3–6", + "bullet2": "10-15 → selects pages 10–15", + "bullet3": "5- → selects pages 5 to end", + "description": "Use - for consecutive pages.", + "title": "Page Ranges" + }, + "special": { + "bullet1": "all → selects all pages", + "title": "Special Keywords" } } }, "bulkSelection": { + "syntaxError": "There is a syntax issue. See Page Selection tips for help.", "header": { "title": "Guida Selezione Pagine" }, @@ -1377,7 +1621,6 @@ } }, "changeMetadata": { - "tags": "Titolo,autore,data,creazione,ora,editore,produttore,statistiche", "header": "Cambia Proprietà", "submit": "Cambia proprietà", "filenamePrefix": "metadati", @@ -1498,7 +1741,8 @@ "bullet3": "Unknown: Stato di trapping non specificato" } } - } + }, + "tags": "Titolo,autore,data,creazione,ora,editore,produttore,statistiche" }, "fileToPDF": { "tags": "trasformazione,formato,documento,immagine,diapositiva,testo,conversione,ufficio,documenti,parola,excel,powerpoint", @@ -1611,6 +1855,9 @@ "text": "Post‑elabora il PDF finale rimuovendo artefatti OCR e ottimizzando il layer di testo per migliore leggibilità e dimensioni minori." } } + }, + "error": { + "failed": "OCR operation failed" } }, "extractImages": { @@ -1620,11 +1867,11 @@ "selectText": "Seleziona il formato in cui salvare le immagini estratte", "allowDuplicates": "Salva le immagini duplicate", "submit": "Estrai", - "error": { - "failed": "Si è verificato un errore durante l'estrazione delle immagini dal PDF." - }, "settings": { "title": "Impostazioni" + }, + "error": { + "failed": "Si è verificato un errore durante l'estrazione delle immagini dal PDF." } }, "pdfToPDFA": { @@ -1697,14 +1944,43 @@ }, "info": "Python non è installato. È necessario per l'esecuzione." }, + "scannerImageSplit": { + "title": "Immagini estratte", + "submit": "Estrai scansioni di immagini", + "error": { + "failed": "Si è verificato un errore durante l'estrazione delle scansioni di immagini." + }, + "tooltip": { + "title": "Divisore di foto", + "whatThisDoes": "Cosa fa", + "whatThisDoesDesc": "Trova ed estrae automaticamente ogni foto da una pagina scansionata o da un'immagine composita - senza ritaglio manuale.", + "whenToUse": "Quando usare", + "useCase1": "Scansiona intere pagine di album in una volta", + "useCase2": "Dividi i lotti flatbed in file separati", + "useCase3": "Suddividi collage in singole foto", + "useCase4": "Estrai foto dai documenti", + "quickFixes": "Correzioni rapide", + "problem1": "Foto non rilevate → aumentare la tolleranza a 30-50", + "problem2": "Troppe rilevazioni errate → aumentare l'area minima a 15.000-20.000", + "problem3": "I ritagli sono troppo stretti → aumentare la dimensione del bordo a 5-10", + "problem4": "Foto inclinate non raddrizzate → abbassare la soglia angolare a ~5°", + "problem5": "Caselle di polvere/rumore → aumentare l'area minima del contorno a 1000-2000", + "setupTips": "Suggerimenti di configurazione", + "tip1": "Usa uno sfondo semplice e chiaro", + "tip2": "Lascia un piccolo spazio (≈1 cm) tra le foto", + "tip3": "Scansiona a 300-600 DPI", + "tip4": "Pulisci il vetro dello scanner", + "headsUp": "Attenzione", + "headsUpDesc": "Foto sovrapposte o sfondi molto simili nel colore alle foto possono ridurre la precisione - prova uno sfondo piÚ chiaro o piÚ scuro e lascia piÚ spazio." + } + }, "sign": { - "tags": "autorizza,iniziali,firma-tracciata,firma-testo,firma-immagine", "title": "Firma", "header": "Firma PDF", "upload": "Carica immagine", "draw": { - "clear": "Cancella", - "title": "Disegna la tua firma" + "title": "Disegna la tua firma", + "clear": "Cancella" }, "text": { "name": "Nome firmatario", @@ -1714,6 +1990,7 @@ "add": "Aggiungi", "saved": "Firme salvate", "save": "Firma salvata", + "applySignatures": "Applica firme", "personalSigs": "Firme personali", "sharedSigs": "Firme condivise", "noSavedSigs": "Nessuna firma salvata trovata", @@ -1726,37 +2003,44 @@ "maintainRatio": "Attiva il mantenimento delle proporzioni", "undo": "Annulla", "redo": "Rifare", - "activate": "Attiva posizionamento firma", - "applySignatures": "Applica firme", - "deactivate": "Interrompi posizionamento firme", - "error": { - "failed": "Si è verificato un errore durante la firma del PDF." - }, - "image": { - "hint": "Carica un'immagine PNG o JPG della tua firma", - "label": "Carica immagine firma", - "placeholder": "Seleziona file immagine" - }, - "instructions": { - "title": "Come aggiungere la firma" - }, - "results": { - "title": "Risultati firma" - }, + "submit": "Firma documento", "steps": { "configure": "Configura firma" }, - "submit": "Firma documento", "type": { - "canvas": "Canvas", + "title": "Tipo di firma", "draw": "Disegna", + "canvas": "Canvas", "image": "Immagine", - "text": "Testo", - "title": "Tipo di firma" - } + "text": "Testo" + }, + "image": { + "label": "Carica immagine firma", + "placeholder": "Seleziona file immagine", + "hint": "Carica un'immagine PNG o JPG della tua firma" + }, + "instructions": { + "title": "Come aggiungere la firma", + "canvas": "After drawing your signature in the canvas, close the modal then click anywhere on the PDF to place it.", + "image": "After uploading your signature image above, click anywhere on the PDF to place it.", + "text": "After entering your name above, click anywhere on the PDF to place your signature." + }, + "mode": { + "move": "Move Signature", + "place": "Place Signature" + }, + "updateAndPlace": "Update and Place", + "activate": "Attiva posizionamento firma", + "deactivate": "Interrompi posizionamento firme", + "results": { + "title": "Risultati firma" + }, + "error": { + "failed": "Si è verificato un errore durante la firma del PDF." + }, + "tags": "autorizza,iniziali,firma-tracciata,firma-testo,firma-immagine" }, "flatten": { - "tags": "statico,disattivato,non interattivo,ottimizzato", "title": "Appiattire", "header": "Appiattisci PDF", "flattenOnlyForms": "Appiattisci solo i moduli", @@ -1771,9 +2055,11 @@ "options": { "stepTitle": "Opzioni di flattening", "title": "Opzioni di flattening", - "flattenOnlyForms.desc": "Appiattisci solo i campi modulo, lasciando intatti gli altri elementi interattivi", - "note": "Il flattening rimuove gli elementi interattivi dal PDF, rendendoli non modificabili.", - "flattenOnlyForms": "Appiattisci solo i moduli" + "flattenOnlyForms": { + "label": "Appiattisci solo i moduli", + "desc": "Appiattisci solo i campi modulo, lasciando intatti gli altri elementi interattivi" + }, + "note": "Il flattening rimuove gli elementi interattivi dal PDF, rendendoli non modificabili." }, "results": { "title": "Risultati Flatten" @@ -1801,7 +2087,8 @@ "bullet3": "Commenti e note restano visibili", "bullet4": "I segnalibri aiutano ancora la navigazione" } - } + }, + "tags": "statico,disattivato,non interattivo,ottimizzato" }, "repair": { "tags": "aggiustare,ripristinare,correggere,recuperare", @@ -1821,7 +2108,6 @@ } }, "removeBlanks": { - "tags": "pulire,semplificare,non contenere contenuti,organizzare", "title": "Rimuovi spazi vuoti", "header": "Rimuovi pagine vuote", "settings": { @@ -1863,22 +2149,29 @@ "bullet3": "PuÃ˛ essere disabilitato per ridurre la dimensione del file di output" } }, - "submit": "Rimuovi" + "submit": "Rimuovi", + "error": { + "failed": "Failed to remove blank pages" + }, + "results": { + "title": "Removed Blank Pages" + }, + "tags": "pulire,semplificare,non contenere contenuti,organizzare" }, "removeAnnotations": { "tags": "commenti,evidenziazioni,note,markup,rimozione", "title": "Rimuovi Annotazioni", "header": "Rimuovi Annotazioni", "submit": "Rimuovi", - "error": { - "failed": "Si è verificato un errore durante la rimozione delle annotazioni dal PDF." - }, - "info": { - "description": "Questo strumento rimuoverà tutte le annotazioni (commenti, evidenziazioni, note, ecc.) dai tuoi documenti PDF.", - "title": "Informazioni su Rimuovi annotazioni" - }, "settings": { "title": "Impostazioni" + }, + "info": { + "title": "Informazioni su Rimuovi annotazioni", + "description": "Questo strumento rimuoverà tutte le annotazioni (commenti, evidenziazioni, note, ecc.) dai tuoi documenti PDF." + }, + "error": { + "failed": "Si è verificato un errore durante la rimozione delle annotazioni dal PDF." } }, "compare": { @@ -1965,7 +2258,12 @@ "bullet3": "Scegli in quale pagina posizionare la firma", "bullet4": "Logo opzionale includibile" } - } + }, + "invisible": "Invisible", + "options": { + "title": "Signature Details" + }, + "visible": "Visible" }, "sign": { "submit": "Firma PDF", @@ -2026,7 +2324,22 @@ "text": "Converti il tuo file in un keystore Java (.jks) con keytool, poi scegli JKS." } } - } + }, + "chooseCertificate": "Choose Certificate File", + "chooseJksFile": "Choose JKS File", + "chooseP12File": "Choose PKCS12 File", + "choosePfxFile": "Choose PFX File", + "choosePrivateKey": "Choose Private Key File", + "location": "Location", + "logoTitle": "Logo", + "name": "Name", + "noLogo": "No Logo", + "pageNumber": "Page Number", + "password": "Certificate Password", + "passwordOptional": "Leave empty if no password", + "reason": "Reason", + "serverCertMessage": "Using server certificate - no files or password required", + "showLogo": "Show Logo" }, "removeCertSign": { "tags": "autenticare,PEM,P12,ufficiale,decifrare", @@ -2052,7 +2365,17 @@ "header": "Layout multipagina", "pagesPerSheet": "Pagine per foglio:", "addBorder": "Aggiungi bordi", - "submit": "Invia" + "submit": "Invia", + "desc": { + "2": "Place 2 pages side-by-side on a single sheet.", + "3": "Place 3 pages on a single sheet in a single row.", + "4": "Place 4 pages on a single sheet (2 × 2 grid).", + "9": "Place 9 pages on a single sheet (3 × 3 grid).", + "16": "Place 16 pages on a single sheet (4 × 4 grid)." + }, + "error": { + "failed": "An error occurred while creating the multi-page layout." + } }, "bookletImposition": { "tags": "libretto,imposizione,stampa,rilegatura,piegatura,signatura", @@ -2228,7 +2551,6 @@ "tags": "correzione del colore,messa a punto,modifica,miglioramento" }, "crop": { - "tags": "tagliare,ridurre,modificare,modellare", "title": "Ritaglia", "header": "Ritaglia PDF", "submit": "Invia", @@ -2239,10 +2561,22 @@ "reset": "Reimposta all’intero PDF", "coordinates": { "title": "Posizione e dimensioni", - "x": "Posizione X", - "y": "Posizione Y", - "width": "Larghezza", - "height": "Altezza" + "x": { + "label": "X Position", + "desc": "Left edge (points)" + }, + "y": { + "label": "Y Position", + "desc": "Bottom edge (points)" + }, + "width": { + "label": "Width", + "desc": "Crop width (points)" + }, + "height": { + "label": "Height", + "desc": "Crop height (points)" + } }, "error": { "invalidArea": "L’area di ritaglio supera i limiti del PDF", @@ -2260,7 +2594,12 @@ }, "results": { "title": "Risultati ritaglio" - } + }, + "automation": { + "info": "Enter crop coordinates in PDF points. Origin (0,0) is at bottom-left. These values will be applied to all PDFs processed in this automation.", + "reference": "Reference: A4 page is 595.28 × 841.89 points (210mm × 297mm). 1 inch = 72 points." + }, + "tags": "tagliare,ridurre,modificare,modellare" }, "autoSplitPDF": { "tags": "Basato su QR,separato,scansiona segmenti,organizza", @@ -2470,11 +2809,15 @@ "overlay-pdfs": { "tags": "Sovrapponi", "header": "Invia file PDF in sovrapposizione", + "title": "Overlay PDFs", + "desc": "Overlay one PDF on top of another", "baseFile": { "label": "Seleziona File PDF di base" }, "overlayFiles": { - "label": "Seleziona sovrapposizione file PDF" + "label": "Seleziona sovrapposizione file PDF", + "placeholder": "Choose PDF(s)...", + "addMore": "Add more PDFs..." }, "mode": { "label": "Seleziona la modalità di sovrapposizione", @@ -2484,14 +2827,53 @@ }, "counts": { "label": "Numeri sovrapposti (per la modalità di ripetizione fissa)", - "placeholder": "Inserisci i numeri separati da virgole (ad esempio, 2,3,1)" + "placeholder": "Inserisci i numeri separati da virgole (ad esempio, 2,3,1)", + "item": "Count for file", + "noFiles": "Add overlay files to configure counts" }, "position": { "label": "Seleziona posizione di sovrapposizione", "foreground": "Primo piano", "background": "Sfondo" }, - "submit": "Sovrapponi" + "submit": "Sovrapponi", + "settings": { + "title": "Settings" + }, + "results": { + "title": "Overlay Results" + }, + "tooltip": { + "header": { + "title": "Overlay PDFs Overview" + }, + "description": { + "title": "Description", + "text": "Combine a base PDF with one or more overlay PDFs. Overlays can be applied page-by-page in different modes and placed in the foreground or background." + }, + "mode": { + "title": "Overlay Mode", + "text": "Choose how to distribute overlay pages across the base PDF pages.", + "sequential": "Sequential Overlay: Use pages from the first overlay PDF until it ends, then move to the next.", + "interleaved": "Interleaved Overlay: Take one page from each overlay in turn.", + "fixedRepeat": "Fixed Repeat Overlay: Take a set number of pages from each overlay before moving to the next. Use Counts to set the numbers." + }, + "position": { + "title": "Overlay Position", + "text": "Foreground places the overlay on top of the page. Background places it behind." + }, + "overlayFiles": { + "title": "Overlay Files", + "text": "Select one or more PDFs to overlay on the base. The order of these files affects how pages are applied in Sequential and Fixed Repeat modes." + }, + "counts": { + "title": "Counts (Fixed Repeat only)", + "text": "Provide a positive number for each overlay file showing how many pages to take before moving to the next. Required when mode is Fixed Repeat." + } + }, + "error": { + "failed": "An error occurred while overlaying PDFs." + } }, "split-by-sections": { "tags": "Dividi sezione,dividi,personalizza", @@ -2526,7 +2908,18 @@ "customMargin": "Margine personalizzato", "customColor": "Colore testo personalizzato", "submit": "Invia", - "noStampSelected": "Nessun timbro selezionato. Torna al Passo 1." + "noStampSelected": "Nessun timbro selezionato. Torna al Passo 1.", + "customPosition": "Drag the stamp to the desired location in the preview window.", + "error": { + "failed": "An error occurred while adding stamp to the PDF." + }, + "imageSize": "Image Size", + "margin": "Margin", + "positionAndFormatting": "Position & Formatting", + "quickPosition": "Select a position on the page to place the stamp.", + "results": { + "title": "Stamp Results" + } }, "removeImagePdf": { "tags": "Rimuovi immagine,operazioni sulla pagina,back-end,lato server" @@ -2544,7 +2937,8 @@ "status": { "_value": "Stato", "valid": "Valida", - "invalid": "Invalida" + "invalid": "Invalida", + "complete": "Validation complete" }, "signer": "Firmatario", "date": "Data", @@ -2571,35 +2965,115 @@ "version": "Versione", "keyUsage": "Utilizzo della chiave", "selfSigned": "Autofirmato", - "bits": "bit" + "bits": "bit", + "details": "Certificate Details" }, "signature": { "info": "Informazioni sulla firma", "_value": "Firma", "mathValid": "La firma è matematicamente valida MA:" }, - "selectCustomCert": "File di certificato personalizzato X.509 (opzionale)" - }, - "replace-color": { - "title": "Sostituisci-Inverti-Colore", - "header": "Sostituisci-Inverti colore PDF", - "selectText": { - "1": "Sostituisci o inverti le opzioni del colore", - "2": "Predefinito (colori ad alto contrasto predefiniti)", - "3": "Personalizzato (colori personalizzati)", - "4": "Inversione completa (inverte tutti i colori)", - "5": "Opzioni di colore ad alto contrasto", - "6": "testo bianco su sfondo nero", - "7": "Testo nero su sfondo bianco", - "8": "Testo giallo su sfondo nero", - "9": "Testo verde su sfondo nero", - "10": "Scegli il colore del testo", - "11": "Scegli il colore di sfondo" + "selectCustomCert": "File di certificato personalizzato X.509 (opzionale)", + "downloadCsv": "Download CSV", + "downloadJson": "Download JSON", + "downloadPdf": "Download PDF Report", + "downloadType": { + "csv": "CSV", + "json": "JSON", + "pdf": "PDF" }, - "submit": "Sostituisci" + "error": { + "allFailed": "Unable to validate the selected files.", + "partial": "Some files could not be validated.", + "reportGeneration": "Could not generate the PDF report. JSON and CSV are available.", + "unexpected": "Unexpected error during validation." + }, + "finalizing": "Preparing downloads...", + "issue": { + "certExpired": "Certificate expired", + "certRevocationUnknown": "Certificate revocation status unknown", + "certRevoked": "Certificate revoked", + "chainInvalid": "Certificate chain invalid", + "signatureInvalid": "Signature cryptographic check failed", + "trustInvalid": "Certificate not trusted" + }, + "noResults": "Run the validation to generate a report.", + "noSignaturesShort": "No signatures", + "processing": "Validating signatures...", + "report": { + "continued": "Continued", + "downloads": "Downloads", + "entryLabel": "Signature Summary", + "fields": { + "created": "Created", + "fileSize": "File Size", + "signatureCount": "Total Signatures", + "signatureDate": "Signature Date" + }, + "filesEvaluated": "{{count}} files evaluated", + "footer": "Validated via Stirling PDF", + "generatedAt": "Generated", + "noPdf": "PDF report will be available after a successful validation.", + "page": "Page", + "shortTitle": "Signature Summary", + "signatureCountLabel": "{{count}} signatures", + "signaturesFound": "{{count}} signatures detected", + "signaturesValid": "{{count}} fully valid", + "title": "Signature Validation Report" + }, + "settings": { + "certHint": "Upload a trusted X.509 certificate to validate against a custom trust source.", + "title": "Validation Settings" + }, + "signatureDate": "Signature Date", + "totalSignatures": "Total Signatures" }, - "replaceColorPdf": { - "tags": "Sostituisci colore, Operazioni di pagina, Back-end, lato server" + "replaceColor": { + "tags": "Sostituisci colore,Operazioni pagina,Back end,lato server", + "labels": { + "settings": "Settings", + "colourOperation": "Colour operation" + }, + "options": { + "highContrast": "High contrast", + "invertAll": "Invert all colours", + "custom": "Custom", + "cmyk": "Convert to CMYK" + }, + "tooltip": { + "header": { + "title": "Replace & Invert Colour Settings Overview" + }, + "description": { + "title": "Description", + "text": "Transform PDF colours to improve readability and accessibility. Choose from high contrast presets, invert all colours, or create custom colour schemes." + }, + "highContrast": { + "title": "High Contrast", + "text": "Apply predefined high contrast colour combinations designed for better readability and accessibility compliance.", + "bullet1": "White text on black background - Classic dark mode", + "bullet2": "Black text on white background - Standard high contrast", + "bullet3": "Yellow text on black background - High visibility option", + "bullet4": "Green text on black background - Alternative high contrast" + }, + "invertAll": { + "title": "Invert All Colours", + "text": "Completely invert all colours in the PDF, creating a negative-like effect. Useful for creating dark mode versions of documents or reducing eye strain in low-light conditions." + }, + "custom": { + "title": "Custom Colours", + "text": "Define your own text and background colours using the colour pickers. Perfect for creating branded documents or specific accessibility requirements.", + "bullet1": "Text colour - Choose the colour for text elements", + "bullet2": "Background colour - Set the background colour for the document" + }, + "cmyk": { + "title": "Convert to CMYK", + "text": "Convert the PDF from RGB colour space to CMYK colour space, optimized for professional printing. This process converts colours to the Cyan, Magenta, Yellow, Black model used by printers." + } + }, + "error": { + "failed": "An error occurred while processing the colour replacement." + } }, "login": { "title": "Accedi", @@ -2632,6 +3106,11 @@ "enterEmail": "Inserisci la tua email", "enterPassword": "Inserisci la tua password", "loggingIn": "Accesso in corso...", + "username": "Username", + "enterUsername": "Enter username", + "useEmailInstead": "Login with email", + "forgotPassword": "Forgot your password?", + "logIn": "Log In", "signingIn": "Accesso in corso...", "login": "Accedi", "or": "Oppure", @@ -2649,7 +3128,10 @@ "magicLinkSent": "Magic link inviato a {{email}}! Controlla la posta e clicca il link per accedere.", "passwordResetSent": "Link di reimpostazione password inviato a {{email}}! Segui le istruzioni nell’email.", "failedToSignIn": "Accesso con {{provider}} non riuscito: {{message}}", - "unexpectedError": "Errore imprevisto: {{message}}" + "unexpectedError": "Errore imprevisto: {{message}}", + "accountCreatedSuccess": "Account created successfully! You can now sign in.", + "passwordChangedSuccess": "Password changed successfully! Please sign in with your new password.", + "credentialsUpdated": "Your credentials have been updated. Please sign in again." }, "signup": { "title": "Crea un account", @@ -2672,7 +3154,12 @@ "invalidEmail": "Inserisci un indirizzo email valido", "checkEmailConfirmation": "Controlla la tua email per il link di conferma per completare la registrazione.", "accountCreatedSuccessfully": "Account creato con successo! Ora puoi accedere.", - "unexpectedError": "Errore imprevisto: {{message}}" + "unexpectedError": "Errore imprevisto: {{message}}", + "useEmailInstead": "Use Email Instead", + "nameRequired": "Name is required", + "emailRequired": "Email is required", + "passwordRequired": "Password is required", + "confirmPasswordRequired": "Please confirm your password" }, "pdfToSinglePage": { "title": "PDF a pagina singola", @@ -2712,10 +3199,23 @@ "adjustContrast": { "title": "Regola il contrasto", "header": "Regola il contrasto", + "basic": "Basic Adjustments", "contrast": "Contrasto:", "brightness": "Luminosità:", "saturation": "Saturazione:", - "download": "Salva" + "download": "Salva", + "adjustColors": "Adjust Colors", + "blue": "Blue", + "confirm": "Confirm", + "error": { + "failed": "Failed to adjust colors/contrast" + }, + "green": "Green", + "noPreview": "Select a PDF to preview", + "red": "Red", + "results": { + "title": "Adjusted PDF" + } }, "compress": { "title": "Comprimi", @@ -2862,7 +3362,13 @@ "title": "Rimuovere immagine", "header": "Rimuovi immagine", "removeImage": "Rimuovi immagine", - "submit": "Rimuovi immagine" + "submit": "Rimuovi immagine", + "error": { + "failed": "Failed to remove images from the PDF." + }, + "results": { + "title": "Remove Images Results" + } }, "splitByChapters": { "title": "Dividere PDF per capitoli", @@ -2937,6 +3443,10 @@ "title": "Analitiche", "description": "Questi cookie ci aiutano a capire come vengono utilizzati i nostri strumenti, cosÃŦ possiamo concentrarci sullo sviluppo delle funzionalità che la nostra community apprezza di piÚ. Non preoccuparti: Stirling PDF non puÃ˛ e non traccerà mai il contenuto dei documenti con cui lavori." } + }, + "services": { + "posthog": "PostHog Analytics", + "scarf": "Scarf Pixel" } }, "removeMetadata": { @@ -2998,11 +3508,18 @@ "panMode": "Modalità mano", "rotateLeft": "Ruota a sinistra", "rotateRight": "Ruota a destra", - "toggleSidebar": "Mostra/Nascondi barra laterale" + "toggleSidebar": "Mostra/Nascondi barra laterale", + "exportSelected": "Export Selected Pages", + "toggleAnnotations": "Toggle Annotations Visibility", + "annotationMode": "Toggle Annotation Mode", + "draw": "Draw", + "save": "Save" }, "search": { "title": "Cerca nel PDF", - "placeholder": "Inserisci termine di ricerca..." + "placeholder": "Inserisci termine di ricerca...", + "noResults": "No results found", + "searching": "Searching..." }, "guestBanner": { "title": "Stai usando Stirling PDF come ospite!", @@ -3040,9 +3557,597 @@ "automate": "Automatizza", "files": "File", "activity": "Attività", + "help": "Help", + "account": "Account", "config": "Config", + "adminSettings": "Admin Settings", "allTools": "Tutti gli strumenti" }, + "admin": { + "error": "Error", + "success": "Success", + "expand": "Expand", + "close": "Close", + "status": { + "active": "Active", + "inactive": "Inactive" + }, + "settings": { + "title": "Admin Settings", + "workspace": "Workspace", + "fetchError": "Failed to load settings", + "saveError": "Failed to save settings", + "saved": "Settings saved successfully", + "saveSuccess": "Settings saved successfully", + "save": "Save Changes", + "restartRequired": "Restart Required", + "restart": { + "title": "Restart Required", + "message": "Settings have been saved successfully. A server restart is required for the changes to take effect.", + "question": "Would you like to restart the server now or later?", + "now": "Restart Now", + "later": "Restart Later" + }, + "restarting": "Restarting Server", + "restartingMessage": "The server is restarting. Please wait a moment...", + "restartError": "Failed to restart server. Please restart manually.", + "general": { + "title": "System Settings", + "description": "Configure system-wide application settings including branding and default behaviour.", + "ui": "User Interface", + "system": "System", + "appName": { + "label": "Application Name", + "description": "The name displayed in the browser tab and home page" + }, + "appNameNavbar": { + "label": "Navbar Brand", + "description": "The name displayed in the navigation bar" + }, + "homeDescription": { + "label": "Home Description", + "description": "The description text shown on the home page" + }, + "defaultLocale": { + "label": "Default Locale", + "description": "The default language for new users (e.g., en_US, es_ES)" + }, + "fileUploadLimit": { + "label": "File Upload Limit", + "description": "Maximum file upload size (e.g., 100MB, 1GB)" + }, + "showUpdate": { + "label": "Show Update Notifications", + "description": "Display notifications when a new version is available" + }, + "showUpdateOnlyAdmin": { + "label": "Show Updates to Admins Only", + "description": "Restrict update notifications to admin users only" + }, + "customHTMLFiles": { + "label": "Custom HTML Files", + "description": "Allow serving custom HTML files from the customFiles directory" + }, + "languages": { + "label": "Available Languages", + "description": "Languages that users can select from (leave empty to enable all languages)" + }, + "customMetadata": { + "label": "Custom Metadata", + "autoUpdate": { + "label": "Auto Update Metadata", + "description": "Automatically update PDF metadata on all processed documents" + }, + "author": { + "label": "Default Author", + "description": "Default author for PDF metadata (e.g., username)" + }, + "creator": { + "label": "Default Creator", + "description": "Default creator for PDF metadata" + }, + "producer": { + "label": "Default Producer", + "description": "Default producer for PDF metadata" + } + }, + "customPaths": { + "label": "Custom Paths", + "description": "Configure custom file system paths for pipeline processing and external tools", + "pipeline": { + "label": "Pipeline Directories", + "watchedFoldersDir": { + "label": "Watched Folders Directory", + "description": "Directory where pipeline monitors for incoming PDFs (leave empty for default: /pipeline/watchedFolders)" + }, + "finishedFoldersDir": { + "label": "Finished Folders Directory", + "description": "Directory where processed PDFs are outputted (leave empty for default: /pipeline/finishedFolders)" + } + }, + "operations": { + "label": "External Tool Paths", + "weasyprint": { + "label": "WeasyPrint Executable", + "description": "Path to WeasyPrint executable for HTML to PDF conversion (leave empty for default: /opt/venv/bin/weasyprint)" + }, + "unoconvert": { + "label": "Unoconvert Executable", + "description": "Path to LibreOffice unoconvert for document conversions (leave empty for default: /opt/venv/bin/unoconvert)" + } + } + } + }, + "security": { + "title": "Security", + "description": "Configure authentication, login behaviour, and security policies.", + "ssoNotice": { + "title": "Looking for SSO/SAML settings?", + "message": "OAuth2 and SAML2 authentication providers have been moved to the Connections menu for easier management." + }, + "authentication": "Authentication", + "enableLogin": { + "label": "Enable Login", + "description": "Require users to log in before accessing the application" + }, + "loginMethod": { + "label": "Login Method", + "description": "The authentication method to use for user login", + "all": "All Methods", + "normal": "Username/Password Only", + "oauth2": "OAuth2 Only", + "saml2": "SAML2 Only" + }, + "loginAttemptCount": { + "label": "Login Attempt Limit", + "description": "Maximum number of failed login attempts before account lockout" + }, + "loginResetTimeMinutes": { + "label": "Login Reset Time (minutes)", + "description": "Time before failed login attempts are reset" + }, + "csrfDisabled": { + "label": "Disable CSRF Protection", + "description": "Disable Cross-Site Request Forgery protection (not recommended)" + }, + "initialLogin": { + "label": "Initial Login", + "username": { + "label": "Initial Username", + "description": "The username for the initial admin account" + }, + "password": { + "label": "Initial Password", + "description": "The password for the initial admin account" + } + }, + "jwt": { + "label": "JWT Configuration", + "secureCookie": { + "label": "Secure Cookie", + "description": "Require HTTPS for JWT cookies (recommended for production)" + }, + "keyRetentionDays": { + "label": "Key Retention Days", + "description": "Number of days to retain old JWT keys for verification" + }, + "persistence": { + "label": "Enable Key Persistence", + "description": "Store JWT keys persistently to survive server restarts" + }, + "enableKeyRotation": { + "label": "Enable Key Rotation", + "description": "Automatically rotate JWT signing keys periodically" + }, + "enableKeyCleanup": { + "label": "Enable Key Cleanup", + "description": "Automatically remove expired JWT keys" + } + }, + "audit": { + "label": "Audit Logging", + "enabled": { + "label": "Enable Audit Logging", + "description": "Track user actions and system events for compliance and security monitoring" + }, + "level": { + "label": "Audit Level", + "description": "0=OFF, 1=BASIC, 2=STANDARD, 3=VERBOSE" + }, + "retentionDays": { + "label": "Audit Retention (days)", + "description": "Number of days to retain audit logs" + } + }, + "htmlUrlSecurity": { + "label": "HTML URL Security", + "description": "Configure URL access restrictions for HTML processing to prevent SSRF attacks", + "enabled": { + "label": "Enable URL Security", + "description": "Enable URL security restrictions for HTML to PDF conversions" + }, + "level": { + "label": "Security Level", + "description": "MAX: whitelist only, MEDIUM: block internal networks, OFF: no restrictions", + "max": "Maximum (Whitelist Only)", + "medium": "Medium (Block Internal)", + "off": "Off (No Restrictions)" + }, + "advanced": "Advanced Settings", + "allowedDomains": { + "label": "Allowed Domains (Whitelist)", + "description": "One domain per line (e.g., cdn.example.com). Only these domains allowed when level is MAX" + }, + "blockedDomains": { + "label": "Blocked Domains (Blacklist)", + "description": "One domain per line (e.g., malicious.com). Additional domains to block" + }, + "internalTlds": { + "label": "Internal TLDs", + "description": "One TLD per line (e.g., .local, .internal). Block domains with these TLD patterns" + }, + "networkBlocking": "Network Blocking", + "blockPrivateNetworks": { + "label": "Block Private Networks", + "description": "Block RFC 1918 private networks (10.x.x.x, 192.168.x.x, 172.16-31.x.x)" + }, + "blockLocalhost": { + "label": "Block Localhost", + "description": "Block localhost and loopback addresses (127.x.x.x, ::1)" + }, + "blockLinkLocal": { + "label": "Block Link-Local Addresses", + "description": "Block link-local addresses (169.254.x.x, fe80::/10)" + }, + "blockCloudMetadata": { + "label": "Block Cloud Metadata Endpoints", + "description": "Block cloud provider metadata endpoints (169.254.169.254)" + } + } + }, + "connections": { + "title": "Connections", + "description": "Configure external authentication providers like OAuth2 and SAML.", + "linkedServices": "Linked Services", + "unlinkedServices": "Unlinked Services", + "connect": "Connect", + "disconnect": "Disconnect", + "disconnected": "Provider disconnected successfully", + "disconnectError": "Failed to disconnect provider", + "ssoAutoLogin": { + "label": "SSO Auto Login", + "enable": "Enable SSO Auto Login", + "description": "Automatically redirect to SSO login when authentication is required" + }, + "oauth2": { + "label": "OAuth2", + "enabled": { + "label": "Enable OAuth2", + "description": "Allow users to authenticate using OAuth2 providers" + }, + "provider": { + "label": "Provider", + "description": "The OAuth2 provider to use for authentication" + }, + "issuer": { + "label": "Issuer URL", + "description": "The OAuth2 provider issuer URL" + }, + "clientId": { + "label": "Client ID", + "description": "The OAuth2 client ID from your provider" + }, + "clientSecret": { + "label": "Client Secret", + "description": "The OAuth2 client secret from your provider" + }, + "useAsUsername": { + "label": "Use as Username", + "description": "The OAuth2 claim to use as the username (e.g., email, sub)" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first OAuth2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via OAuth2" + }, + "scopes": { + "label": "OAuth2 Scopes", + "description": "Comma-separated list of OAuth2 scopes to request (e.g., openid, profile, email)" + } + }, + "saml2": { + "label": "SAML2", + "enabled": { + "label": "Enable SAML2", + "description": "Allow users to authenticate using SAML2 providers" + }, + "provider": { + "label": "Provider", + "description": "The SAML2 provider name" + }, + "registrationId": { + "label": "Registration ID", + "description": "The SAML2 registration identifier" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first SAML2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via SAML2" + } + } + }, + "database": { + "title": "Database", + "description": "Configure custom database connection settings for enterprise deployments.", + "configuration": "Database Configuration", + "enableCustom": { + "label": "Enable Custom Database", + "description": "Use your own custom database configuration instead of the default embedded database" + }, + "customUrl": { + "label": "Custom Database URL", + "description": "Full JDBC connection string (e.g., jdbc:postgresql://localhost:5432/postgres). If provided, individual connection settings below are not used." + }, + "type": { + "label": "Database Type", + "description": "Type of database (not used if custom URL is provided)" + }, + "hostName": { + "label": "Host Name", + "description": "Database server hostname (not used if custom URL is provided)" + }, + "port": { + "label": "Port", + "description": "Database server port (not used if custom URL is provided)" + }, + "name": { + "label": "Database Name", + "description": "Name of the database (not used if custom URL is provided)" + }, + "username": { + "label": "Username", + "description": "Database authentication username" + }, + "password": { + "label": "Password", + "description": "Database authentication password" + } + }, + "privacy": { + "title": "Privacy", + "description": "Configure privacy and data collection settings.", + "analytics": "Analytics & Tracking", + "enableAnalytics": { + "label": "Enable Analytics", + "description": "Collect anonymous usage analytics to help improve the application" + }, + "metricsEnabled": { + "label": "Enable Metrics", + "description": "Enable collection of performance and usage metrics. Provides API endpoint for admins to access metrics data" + }, + "searchEngine": "Search Engine Visibility", + "googleVisibility": { + "label": "Google Visibility", + "description": "Allow search engines to index this application" + } + }, + "advanced": { + "title": "Advanced", + "description": "Configure advanced features and experimental functionality.", + "features": "Feature Flags", + "processing": "Processing", + "endpoints": { + "label": "Endpoints", + "manage": "Manage API Endpoints", + "description": "Endpoint management is configured via YAML. See documentation for details on enabling/disabling specific endpoints." + }, + "enableAlphaFunctionality": { + "label": "Enable Alpha Features", + "description": "Enable experimental and alpha-stage features (may be unstable)" + }, + "enableUrlToPDF": { + "label": "Enable URL to PDF", + "description": "Allow conversion of web pages to PDF documents" + }, + "maxDPI": { + "label": "Maximum DPI", + "description": "Maximum DPI for image processing (0 = unlimited)" + }, + "tessdataDir": { + "label": "Tessdata Directory", + "description": "Path to the tessdata directory for OCR language files" + }, + "disableSanitize": { + "label": "Disable HTML Sanitization", + "description": "WARNING: Security risk - disabling HTML sanitization can lead to XSS vulnerabilities" + }, + "tempFileManagement": { + "label": "Temp File Management", + "description": "Configure temporary file storage and cleanup behavior", + "baseTmpDir": { + "label": "Base Temp Directory", + "description": "Base directory for temporary files (leave empty for default: java.io.tmpdir/stirling-pdf)" + }, + "libreofficeDir": { + "label": "LibreOffice Temp Directory", + "description": "Directory for LibreOffice temp files (leave empty for default: baseTmpDir/libreoffice)" + }, + "systemTempDir": { + "label": "System Temp Directory", + "description": "System temp directory to clean (only used if cleanupSystemTemp is enabled)" + }, + "prefix": { + "label": "Temp File Prefix", + "description": "Prefix for temp file names" + }, + "maxAgeHours": { + "label": "Max Age (hours)", + "description": "Maximum age in hours before temp files are cleaned up" + }, + "cleanupIntervalMinutes": { + "label": "Cleanup Interval (minutes)", + "description": "How often to run cleanup (in minutes)" + }, + "startupCleanup": { + "label": "Startup Cleanup", + "description": "Clean up old temp files on application startup" + }, + "cleanupSystemTemp": { + "label": "Cleanup System Temp", + "description": "Whether to clean broader system temp directory (use with caution)" + } + }, + "processExecutor": { + "label": "Process Executor Limits", + "description": "Configure session limits and timeouts for each process executor", + "sessionLimit": { + "label": "Session Limit", + "description": "Maximum concurrent instances" + }, + "timeout": { + "label": "Timeout (minutes)", + "description": "Maximum execution time" + }, + "libreOffice": "LibreOffice", + "pdfToHtml": "PDF to HTML", + "qpdf": "QPDF", + "tesseract": "Tesseract OCR", + "pythonOpenCv": "Python OpenCV", + "weasyPrint": "WeasyPrint", + "installApp": "Install App", + "calibre": "Calibre", + "ghostscript": "Ghostscript", + "ocrMyPdf": "OCRmyPDF" + } + }, + "mail": { + "title": "Mail Server", + "description": "Configure SMTP settings for sending email notifications.", + "smtp": "SMTP Configuration", + "enabled": { + "label": "Enable Mail", + "description": "Enable email notifications and SMTP functionality" + }, + "host": { + "label": "SMTP Host", + "description": "The hostname or IP address of your SMTP server" + }, + "port": { + "label": "SMTP Port", + "description": "The port number for SMTP connection (typically 25, 465, or 587)" + }, + "username": { + "label": "SMTP Username", + "description": "Username for SMTP authentication" + }, + "password": { + "label": "SMTP Password", + "description": "Password for SMTP authentication" + }, + "from": { + "label": "From Address", + "description": "The email address to use as the sender" + }, + "enableInvites": { + "label": "Enable Email Invites", + "description": "Allow admins to invite users via email with auto-generated passwords" + }, + "frontendUrl": { + "label": "Frontend URL", + "description": "Base URL for frontend (e.g. https://pdf.example.com). Used for generating invite links in emails. Leave empty to use backend URL." + } + }, + "legal": { + "title": "Legal Documents", + "description": "Configure links to legal documents and policies.", + "disclaimer": { + "title": "Legal Responsibility Warning", + "message": "By customizing these legal documents, you assume full responsibility for ensuring compliance with all applicable laws and regulations, including but not limited to GDPR and other EU data protection requirements. Only modify these settings if: (1) you are operating a personal/private instance, (2) you are outside EU jurisdiction and understand your local legal obligations, or (3) you have obtained proper legal counsel and accept sole responsibility for all user data and legal compliance. Stirling-PDF and its developers assume no liability for your legal obligations." + }, + "termsAndConditions": { + "label": "Terms and Conditions", + "description": "URL or filename to terms and conditions" + }, + "privacyPolicy": { + "label": "Privacy Policy", + "description": "URL or filename to privacy policy" + }, + "accessibilityStatement": { + "label": "Accessibility Statement", + "description": "URL or filename to accessibility statement" + }, + "cookiePolicy": { + "label": "Cookie Policy", + "description": "URL or filename to cookie policy" + }, + "impressum": { + "label": "Impressum", + "description": "URL or filename to impressum (required in some jurisdictions)" + } + }, + "premium": { + "title": "Premium & Enterprise", + "description": "Configure your premium or enterprise license key.", + "license": "License Configuration", + "key": { + "label": "License Key", + "description": "Enter your premium or enterprise license key" + }, + "enabled": { + "label": "Enable Premium Features", + "description": "Enable license key checks for pro/enterprise features" + }, + "movedFeatures": { + "title": "Premium Features Distributed", + "message": "Premium and Enterprise features are now organized in their respective sections:" + } + }, + "features": { + "title": "Features", + "description": "Configure optional features and functionality.", + "serverCertificate": { + "label": "Server Certificate", + "description": "Configure server-side certificate generation for \"Sign with Stirling-PDF\" functionality", + "enabled": { + "label": "Enable Server Certificate", + "description": "Enable server-side certificate for \"Sign with Stirling-PDF\" option" + }, + "organizationName": { + "label": "Organization Name", + "description": "Organization name for generated certificates" + }, + "validity": { + "label": "Certificate Validity (days)", + "description": "Number of days the certificate will be valid" + }, + "regenerateOnStartup": { + "label": "Regenerate on Startup", + "description": "Generate new certificate on each application startup" + } + } + }, + "endpoints": { + "title": "API Endpoints", + "description": "Control which API endpoints and endpoint groups are available.", + "management": "Endpoint Management", + "toRemove": { + "label": "Disabled Endpoints", + "description": "Select individual endpoints to disable" + }, + "groupsToRemove": { + "label": "Disabled Endpoint Groups", + "description": "Select endpoint groups to disable" + }, + "note": "Note: Disabling endpoints restricts API access but does not remove UI components. Restart required for changes to take effect." + } + } + }, "fileUpload": { "selectFile": "Seleziona un file", "selectFiles": "Seleziona file", @@ -3067,6 +4172,9 @@ "addFiles": "Aggiungi file", "dragFilesInOrClick": "Trascina i file o clicca \"Aggiungi file\" per sfogliare" }, + "fileEditor": { + "addFiles": "Add Files" + }, "fileManager": { "title": "Carica file PDF", "subtitle": "Aggiungi file al tuo archivio per un accesso facile tra gli strumenti", @@ -3095,6 +4203,7 @@ "lastModified": "Ultima modifica", "toolChain": "Strumenti applicati", "restore": "Ripristina", + "unzip": "Unzip", "searchFiles": "Cerca file...", "recent": "Recenti", "localFiles": "File locali", @@ -3102,7 +4211,6 @@ "googleDriveShort": "Drive", "myFiles": "I miei file", "noRecentFiles": "Nessun file recente trovato", - "dropFilesHint": "Rilascia qui per caricare", "googleDriveNotAvailable": "Integrazione Google Drive non disponibile", "openFiles": "Apri file", "openFile": "Apri file", @@ -3120,7 +4228,18 @@ "selectedCount": "{{count}} selezionati", "download": "Salva", "delete": "Elimina", - "unsupported": "Non supportato" + "unsupported": "Non supportato", + "addToUpload": "Add to Upload", + "deleteAll": "Delete All", + "loadingFiles": "Loading files...", + "noFiles": "No files available", + "noFilesFound": "No files found matching your search", + "openInPageEditor": "Open in Page Editor", + "showAll": "Show All", + "sortByDate": "Sort by Date", + "sortByName": "Sort by Name", + "sortBySize": "Sort by Size", + "dropFilesHint": "Rilascia qui per caricare" }, "storage": { "temporaryNotice": "I file sono archiviati temporaneamente nel tuo browser e potrebbero essere eliminati automaticamente", @@ -3136,8 +4255,10 @@ "desc": "Rimuovi elementi potenzialmente dannosi dai PDF.", "submit": "Pulire PDF", "completed": "Sanitizzazione completata con successo", - "error.generic": "Sanitizzazione non riuscita", - "error.failed": "Si è verificato un errore durante la sanitizzazione del PDF.", + "error": { + "generic": "Sanitizzazione non riuscita", + "failed": "Si è verificato un errore durante la sanitizzazione del PDF." + }, "filenamePrefix": "sanitizzato", "sanitizationResults": "Risultati sanitizzazione", "steps": { @@ -3151,18 +4272,30 @@ "options": { "title": "Opzioni di sanitizzazione", "note": "Seleziona gli elementi che vuoi rimuovere dal PDF. È necessario selezionarne almeno uno.", - "removeJavaScript.desc": "Rimuovi azioni e script JavaScript dal PDF", - "removeEmbeddedFiles.desc": "Rimuovi eventuali file incorporati nel PDF", - "removeXMPMetadata.desc": "Rimuovi i metadati XMP dal PDF", - "removeMetadata.desc": "Rimuovi le informazioni (titolo, autore, ecc.)", - "removeLinks.desc": "Rimuovi link esterni e azioni di avvio dal PDF", - "removeFonts.desc": "Rimuovi i font incorporati dal PDF", - "removeEmbeddedFiles": "Rimuovi file incorporati", - "removeFonts": "Rimuovi caratteri", - "removeJavaScript": "Rimuovi JavaScript", - "removeLinks": "Rimuovi collegamenti", - "removeMetadata": "Rimuovi metadati documento", - "removeXMPMetadata": "Rimuovi metadati XMP" + "removeJavaScript": { + "label": "Rimuovi JavaScript", + "desc": "Rimuovi azioni e script JavaScript dal PDF" + }, + "removeEmbeddedFiles": { + "label": "Rimuovi file incorporati", + "desc": "Rimuovi eventuali file incorporati nel PDF" + }, + "removeXMPMetadata": { + "label": "Rimuovi metadati XMP", + "desc": "Rimuovi i metadati XMP dal PDF" + }, + "removeMetadata": { + "label": "Rimuovi metadati documento", + "desc": "Rimuovi le informazioni (titolo, autore, ecc.)" + }, + "removeLinks": { + "label": "Rimuovi collegamenti", + "desc": "Rimuovi link esterni e azioni di avvio dal PDF" + }, + "removeFonts": { + "label": "Rimuovi caratteri", + "desc": "Rimuovi i font incorporati dal PDF" + } } }, "addPassword": { @@ -3383,9 +4516,14 @@ "remaining": "rimanenti", "used": "usati", "available": "disponibili", - "cancel": "Annulla" + "cancel": "Annulla", + "preview": "Preview" }, "config": { + "overview": { + "title": "Application Configuration", + "description": "Current application settings and configuration details." + }, "account": { "overview": { "title": "Impostazioni account", @@ -3431,57 +4569,584 @@ "generateError": "Non siamo riusciti a generare la tua chiave API." } }, - "termsAndConditions": "Termini e condizioni", - "logOut": "Esci", "AddAttachmentsRequest": { - "addMoreFiles": "Aggiungi altri file...", "attachments": "Seleziona allegati", "info": "Seleziona i file da allegare al tuo PDF. Questi file saranno incorporati e accessibili tramite il pannello allegati del PDF.", + "selectFiles": "Seleziona file da allegare", "placeholder": "Scegli file...", + "addMoreFiles": "Aggiungi altri file...", + "selectedFiles": "File selezionati", + "submit": "Aggiungi allegati", "results": { "title": "Risultati allegati" }, - "selectFiles": "Seleziona file da allegare", - "selectedFiles": "File selezionati", - "submit": "Aggiungi allegati" - }, - "applyAndContinue": "Applica e continua", - "discardChanges": "Scarta modifiche", - "exportAndContinue": "Esporta e continua", - "keepWorking": "Continua a lavorare", - "replaceColor": { - "tags": "Sostituisci colore,Operazioni pagina,Back end,lato server" - }, - "scannerImageSplit": { "error": { - "failed": "Si è verificato un errore durante l'estrazione delle scansioni di immagini." - }, - "submit": "Estrai scansioni di immagini", - "title": "Immagini estratte", - "tooltip": { - "headsUp": "Attenzione", - "headsUpDesc": "Foto sovrapposte o sfondi molto simili nel colore alle foto possono ridurre la precisione - prova uno sfondo piÚ chiaro o piÚ scuro e lascia piÚ spazio.", - "problem1": "Foto non rilevate → aumentare la tolleranza a 30-50", - "problem2": "Troppe rilevazioni errate → aumentare l'area minima a 15.000-20.000", - "problem3": "I ritagli sono troppo stretti → aumentare la dimensione del bordo a 5-10", - "problem4": "Foto inclinate non raddrizzate → abbassare la soglia angolare a ~5°", - "problem5": "Caselle di polvere/rumore → aumentare l'area minima del contorno a 1000-2000", - "quickFixes": "Correzioni rapide", - "setupTips": "Suggerimenti di configurazione", - "tip1": "Usa uno sfondo semplice e chiaro", - "tip2": "Lascia un piccolo spazio (≈1 cm) tra le foto", - "tip3": "Scansiona a 300-600 DPI", - "tip4": "Pulisci il vetro dello scanner", - "title": "Divisore di foto", - "useCase1": "Scansiona intere pagine di album in una volta", - "useCase2": "Dividi i lotti flatbed in file separati", - "useCase3": "Suddividi collage in singole foto", - "useCase4": "Estrai foto dai documenti", - "whatThisDoes": "Cosa fa", - "whatThisDoesDesc": "Trova ed estrae automaticamente ogni foto da una pagina scansionata o da un'immagine composita - senza ritaglio manuale.", - "whenToUse": "Quando usare" + "failed": "Add attachments operation failed" } }, - "unsavedChanges": "Hai modifiche non salvate al tuo PDF. Cosa vuoi fare?", - "unsavedChangesTitle": "Modifiche non salvate" -} \ No newline at end of file + "termsAndConditions": "Termini e condizioni", + "logOut": "Esci", + "addAttachments": { + "error": { + "failed": "An error occurred while adding attachments to the PDF." + } + }, + "autoRename": { + "description": "This tool will automatically rename PDF files based on their content. It analyzes the document to find the most suitable title from the text." + }, + "customPosition": "Custom Position", + "details": "Details", + "downloadUnavailable": "Download unavailable for this item", + "invalidUndoData": "Cannot undo: invalid operation data", + "margin": { + "large": "Large", + "medium": "Medium", + "small": "Small", + "xLarge": "Extra Large" + }, + "noFilesToUndo": "Cannot undo: no files were processed in the last operation", + "noOperationToUndo": "No operation to undo", + "noValidFiles": "No valid files to process", + "operationCancelled": "Operation cancelled", + "pageEdit": { + "deselectAll": "Select None", + "selectAll": "Select All" + }, + "quickPosition": "Quick Position", + "reorganizePages": { + "error": { + "failed": "Failed to reorganize pages" + }, + "results": { + "title": "Pages Reorganized" + }, + "settings": { + "title": "Settings" + }, + "submit": "Reorganize Pages" + }, + "replace-color": { + "options": { + "fill": "Fill colour", + "gradient": "Gradient" + }, + "previewOverlayOpacity": "Preview overlay opacity", + "previewOverlayTransparency": "Preview overlay transparency", + "previewOverlayVisibility": "Show preview overlay", + "selectText": { + "1": "Sostituisci o inverti le opzioni del colore", + "2": "Predefinito (colori ad alto contrasto predefiniti)", + "3": "Personalizzato (colori personalizzati)", + "4": "Inversione completa (inverte tutti i colori)", + "5": "Opzioni di colore ad alto contrasto", + "6": "testo bianco su sfondo nero", + "7": "Testo nero su sfondo bianco", + "8": "Testo giallo su sfondo nero", + "9": "Testo verde su sfondo nero", + "10": "Scegli il colore del testo", + "11": "Scegli il colore di sfondo", + "12": "Choose start colour", + "13": "Choose end colour" + }, + "submit": "Sostituisci", + "title": "Sostituisci-Inverti-Colore", + "header": "Sostituisci-Inverti colore PDF" + }, + "size": "Size", + "submit": "Submit", + "success": "Success", + "tools": { + "noSearchResults": "No tools found", + "noTools": "No tools available" + }, + "undoDataMismatch": "Cannot undo: operation data is corrupted", + "undoFailed": "Failed to undo operation", + "undoQuotaError": "Cannot undo: insufficient storage space", + "undoStorageError": "Undo completed but some files could not be saved to storage", + "undoSuccess": "Operation undone successfully", + "unsupported": "Unsupported", + "onboarding": { + "welcomeModal": { + "title": "Welcome to Stirling PDF!", + "description": "Would you like to take a quick 1-minute tour to learn the key features and how to get started?", + "helpHint": "You can always access this tour later from the Help button in the bottom left.", + "startTour": "Start Tour", + "maybeLater": "Maybe Later", + "dontShowAgain": "Don't Show Again" + }, + "allTools": "This is the All Tools panel, where you can browse and select from all available PDF tools.", + "selectCropTool": "Let's select the Crop tool to demonstrate how to use one of the tools.", + "toolInterface": "This is the Crop tool interface. As you can see, there's not much there because we haven't added any PDF files to work with yet.", + "filesButton": "The Files button on the Quick Access bar allows you to upload PDFs to use the tools on.", + "fileSources": "You can upload new files or access recent files from here. For the tour, we'll just use a sample file.", + "workbench": "This is the Workbench - the main area where you view and edit your PDFs.", + "viewSwitcher": "Use these controls to select how you want to view your PDFs.", + "viewer": "The Viewer lets you read and annotate your PDFs.", + "pageEditor": "The Page Editor allows you to do various operations on the pages within your PDFs, such as reordering, rotating and deleting.", + "activeFiles": "The Active Files view shows all of the PDFs you have loaded into the tool, and allows you to select which ones to process.", + "fileCheckbox": "Clicking one of the files selects it for processing. You can select multiple files for batch operations.", + "selectControls": "The Right Rail contains buttons to quickly select/deselect all of your active PDFs, along with buttons to change the app's theme or language.", + "cropSettings": "Now that we've selected the file we want crop, we can configure the Crop tool to choose the area that we want to crop the PDF to.", + "runButton": "Once the tool has been configured, this button allows you to run the tool on all the selected PDFs.", + "results": "After the tool has finished running, the Review step will show a preview of the results in this panel, and allow you to undo the operation or download the file. ", + "fileReplacement": "The modified file will replace the original file in the Workbench automatically, allowing you to easily run it through more tools.", + "pinButton": "You can use the Pin button if you'd rather your files stay active after running tools on them.", + "wrapUp": "You're all set! You've learnt about the main areas of the app and how to use them. Click the Help button whenever you like to see this tour again.", + "previous": "Previous", + "next": "Next", + "finish": "Finish", + "startTour": "Start Tour", + "startTourDescription": "Take a guided tour of Stirling PDF's key features" + }, + "workspace": { + "title": "Workspace", + "people": { + "title": "People", + "description": "Manage workspace members and their permissions", + "loading": "Loading people...", + "searchMembers": "Search members...", + "addMembers": "Add Members", + "inviteMembers": { + "label": "Invite Members", + "subtitle": "Type or paste in emails below, separated by commas. Your workspace will be billed by members." + }, + "user": "User", + "role": "Role", + "team": "Team", + "status": "Status", + "actions": "Actions", + "noMembersFound": "No members found", + "active": "Active", + "disabled": "Disabled", + "activeSession": "Active session", + "member": "Member", + "admin": "Admin", + "roleDescriptions": { + "admin": "Can manage settings and invite members, with full administrative access.", + "member": "Can view and edit shared files, but cannot manage workspace settings or members." + }, + "editRole": "Edit Role", + "enable": "Enable", + "disable": "Disable", + "deleteUser": "Delete User", + "deleteUserSuccess": "User deleted successfully", + "deleteUserError": "Failed to delete user", + "confirmDelete": "Are you sure you want to delete this user? This action cannot be undone.", + "addMember": { + "title": "Add Member", + "username": "Username (Email)", + "usernamePlaceholder": "user@example.com", + "password": "Password", + "passwordPlaceholder": "Enter password", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "forcePasswordChange": "Force password change on first login", + "cancel": "Cancel", + "submit": "Add Member", + "usernameRequired": "Username and password are required", + "passwordTooShort": "Password must be at least 6 characters", + "success": "User created successfully", + "error": "Failed to create user" + }, + "editMember": { + "title": "Edit Member", + "editing": "Editing:", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "cancel": "Cancel", + "submit": "Update Member", + "success": "User updated successfully", + "error": "Failed to update user" + }, + "toggleEnabled": { + "success": "User status updated successfully", + "error": "Failed to update user status" + }, + "delete": { + "success": "User deleted successfully", + "error": "Failed to delete user" + }, + "emailInvite": { + "tab": "Email Invite", + "description": "Type or paste in emails below, separated by commas. Users will receive login credentials via email.", + "emails": "Email Addresses", + "emailsPlaceholder": "user1@example.com, user2@example.com", + "emailsRequired": "At least one email address is required", + "submit": "Send Invites", + "success": "user(s) invited successfully", + "partialSuccess": "Some invites failed", + "allFailed": "Failed to invite users", + "error": "Failed to send invites" + }, + "directInvite": { + "tab": "Direct Create" + }, + "inviteLinkTab": { + "tab": "Invite Link" + }, + "inviteLink": { + "description": "Generate a secure link that allows the user to set their own password", + "email": "Email Address", + "emailPlaceholder": "user@example.com (optional)", + "emailDescription": "Optional - leave blank for a general invite link that can be used by anyone", + "emailRequired": "Email address is required", + "emailOptional": "Optional - leave blank for a general invite link", + "emailRequiredForSend": "Email address is required to send email notification", + "expiryHours": "Expiry Hours", + "expiryDescription": "How many hours until the link expires", + "sendEmail": "Send invite link via email", + "sendEmailDescription": "If enabled, the invite link will be sent to the specified email address", + "smtpRequired": "SMTP not configured", + "generate": "Generate Link", + "generated": "Invite Link Generated", + "copied": "Link copied to clipboard", + "success": "Invite link generated successfully", + "successWithEmail": "Invite link generated and sent via email", + "emailFailed": "Invite link generated, but email failed", + "emailFailedDetails": "Error: {0}. Please share the invite link manually.", + "error": "Failed to generate invite link", + "submit": "Generate Invite Link" + }, + "inviteMode": { + "username": "Username", + "email": "Email", + "link": "Link", + "emailDisabled": "Email invites require SMTP configuration and mail.enableInvites=true in settings" + }, + "license": { + "users": "users", + "availableSlots": "Available Slots", + "grandfathered": "Grandfathered", + "grandfatheredShort": "{{count}} grandfathered", + "fromLicense": "from license", + "slotsAvailable": "{{count}} user slot(s) available", + "noSlotsAvailable": "No slots available", + "currentUsage": "Currently using {{current}} of {{max}} user licences" + } + }, + "teams": { + "title": "Teams", + "description": "Manage teams and organize workspace members", + "loading": "Loading teams...", + "loadingDetails": "Loading team details...", + "createNewTeam": "Create New Team", + "teamName": "Team Name", + "totalMembers": "Total Members", + "actions": "Actions", + "noTeamsFound": "No teams found", + "noMembers": "No members in this team", + "system": "System", + "addMember": "Add Member", + "viewTeam": "View Team", + "removeMember": "Remove from team", + "cannotRemoveFromSystemTeam": "Cannot remove from system team", + "renameTeamLabel": "Rename Team", + "deleteTeamLabel": "Delete Team", + "cannotDeleteInternal": "Cannot delete the Internal team", + "confirmDelete": "Are you sure you want to delete this team? This team must be empty to delete.", + "confirmRemove": "Remove user from this team?", + "cannotRenameInternal": "Cannot rename the Internal team", + "cannotAddToInternal": "Cannot add members to the Internal team", + "teamNotFound": "Team not found", + "backToTeams": "Back to Teams", + "memberCount": "{{count}} members", + "removeMemberSuccess": "User removed from team", + "removeMemberError": "Failed to remove user from team", + "createTeam": { + "title": "Create New Team", + "teamName": "Team Name", + "teamNamePlaceholder": "Enter team name", + "cancel": "Cancel", + "submit": "Create Team", + "nameRequired": "Team name is required", + "success": "Team created successfully", + "error": "Failed to create team" + }, + "renameTeam": { + "title": "Rename Team", + "renaming": "Renaming:", + "newTeamName": "New Team Name", + "newTeamNamePlaceholder": "Enter new team name", + "cancel": "Cancel", + "submit": "Rename Team", + "nameRequired": "Team name is required", + "success": "Team renamed successfully", + "error": "Failed to rename team" + }, + "deleteTeam": { + "success": "Team deleted successfully", + "error": "Failed to delete team. Make sure the team is empty.", + "teamMustBeEmpty": "Team must be empty before deletion" + }, + "addMemberToTeam": { + "title": "Add Member to Team", + "addingTo": "Adding to", + "selectUser": "Select User", + "selectUserPlaceholder": "Choose a user", + "selectUserRequired": "Please select a user", + "currentlyIn": "currently in", + "willBeMoved": "Note: This user will be moved from their current team to this team.", + "cancel": "Cancel", + "submit": "Add Member", + "userRequired": "Please select a user", + "success": "Member added to team successfully", + "error": "Failed to add member to team" + }, + "changeTeam": { + "label": "Change Team", + "title": "Change Team", + "changing": "Moving", + "selectTeam": "Select Team", + "selectTeamPlaceholder": "Choose a team", + "selectTeamRequired": "Please select a team", + "success": "Team changed successfully", + "error": "Failed to change team", + "submit": "Change Team" + } + } + }, + "plan": { + "currency": "Currency", + "popular": "Popular", + "current": "Current Plan", + "upgrade": "Upgrade", + "contact": "Contact Us", + "customPricing": "Custom", + "showComparison": "Compare All Features", + "hideComparison": "Hide Feature Comparison", + "featureComparison": "Feature Comparison", + "activePlan": { + "title": "Active Plan", + "subtitle": "Your current subscription details" + }, + "availablePlans": { + "title": "Available Plans", + "subtitle": "Choose the plan that fits your needs" + }, + "static": { + "title": "Billing Information", + "message": "Online billing is not currently configured. To upgrade your plan or manage subscriptions, please contact us directly.", + "contactSales": "Contact Sales", + "contactToUpgrade": "Contact us to upgrade or customize your plan", + "maxUsers": "Max Users", + "upTo": "Up to" + }, + "period": { + "month": "month" + }, + "free": { + "name": "Free", + "highlight1": "Limited Tool Usage Per week", + "highlight2": "Access to all tools", + "highlight3": "Community support" + }, + "pro": { + "name": "Pro", + "highlight1": "Unlimited Tool Usage", + "highlight2": "Advanced PDF tools", + "highlight3": "No watermarks" + }, + "enterprise": { + "name": "Enterprise", + "highlight1": "Custom pricing", + "highlight2": "Dedicated support", + "highlight3": "Latest features" + }, + "feature": { + "title": "Feature", + "pdfTools": "Basic PDF Tools", + "fileSize": "File Size Limit", + "automation": "Automate tool workflows", + "api": "API Access", + "priority": "Priority Support", + "customPricing": "Custom Pricing" + } + }, + "subscription": { + "status": { + "active": "Active", + "pastDue": "Past Due", + "canceled": "Canceled", + "incomplete": "Incomplete", + "trialing": "Trial", + "none": "No Subscription" + }, + "renewsOn": "Renews on {{date}}", + "cancelsOn": "Cancels on {{date}}" + }, + "billing": { + "manageBilling": "Manage Billing", + "portal": { + "error": "Failed to open billing portal" + } + }, + "payment": { + "preparing": "Preparing your checkout...", + "upgradeTitle": "Upgrade to {{planName}}", + "success": "Payment Successful!", + "successMessage": "Your subscription has been activated successfully. You will receive a confirmation email shortly.", + "autoClose": "This window will close automatically...", + "error": "Payment Error" + }, + "firstLogin": { + "title": "First Time Login", + "welcomeTitle": "Welcome!", + "welcomeMessage": "For security reasons, you must change your password on your first login.", + "loggedInAs": "Logged in as", + "error": "Error", + "currentPassword": "Current Password", + "enterCurrentPassword": "Enter your current password", + "newPassword": "New Password", + "enterNewPassword": "Enter new password (min 8 characters)", + "confirmPassword": "Confirm New Password", + "reEnterNewPassword": "Re-enter new password", + "changePassword": "Change Password", + "allFieldsRequired": "All fields are required", + "passwordsDoNotMatch": "New passwords do not match", + "passwordTooShort": "Password must be at least 8 characters", + "passwordMustBeDifferent": "New password must be different from current password", + "passwordChangedSuccess": "Password changed successfully! Please log in again.", + "passwordChangeFailed": "Failed to change password. Please check your current password." + }, + "invite": { + "welcome": "Welcome to Stirling PDF", + "invalidToken": "Invalid invitation link", + "validationError": "Failed to validate invitation link", + "passwordRequired": "Password is required", + "passwordTooShort": "Password must be at least 6 characters", + "passwordMismatch": "Passwords do not match", + "acceptError": "Failed to create account", + "validating": "Validating invitation...", + "invalidInvitation": "Invalid Invitation", + "goToLogin": "Go to Login", + "welcomeTitle": "You've been invited!", + "welcomeSubtitle": "Complete your account setup to get started", + "accountFor": "Creating account for", + "linkExpires": "Link expires", + "email": "Email address", + "emailPlaceholder": "Enter your email address", + "emailRequired": "Email address is required", + "invalidEmail": "Invalid email address", + "choosePassword": "Choose a password", + "passwordPlaceholder": "Enter your password", + "confirmPassword": "Confirm password", + "confirmPasswordPlaceholder": "Re-enter your password", + "createAccount": "Create Account", + "creating": "Creating Account...", + "alreadyHaveAccount": "Already have an account?", + "signIn": "Sign in" + }, + "audit": { + "error": { + "title": "Error loading audit system" + }, + "notAvailable": "Audit system not available", + "notAvailableMessage": "The audit system is not configured or not available.", + "disabled": "Audit logging is disabled", + "disabledMessage": "Enable audit logging in your application configuration to track system events.", + "systemStatus": { + "title": "System Status", + "status": "Audit Logging", + "enabled": "Enabled", + "disabled": "Disabled", + "level": "Audit Level", + "retention": "Retention Period", + "days": "days", + "totalEvents": "Total Events" + }, + "tabs": { + "dashboard": "Dashboard", + "events": "Audit Events", + "export": "Export" + }, + "charts": { + "title": "Audit Dashboard", + "error": "Error loading charts", + "day": "Day", + "week": "Week", + "month": "Month", + "byType": "Events by Type", + "byUser": "Events by User", + "overTime": "Events Over Time" + }, + "events": { + "title": "Audit Events", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "error": "Error loading events", + "noEvents": "No events found", + "timestamp": "Timestamp", + "type": "Type", + "user": "User", + "ipAddress": "IP Address", + "actions": "Actions", + "viewDetails": "View Details", + "eventDetails": "Event Details", + "details": "Details" + }, + "export": { + "title": "Export Audit Data", + "description": "Export audit events to CSV or JSON format. Use filters to limit the exported data.", + "format": "Export Format", + "filters": "Filters (Optional)", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "exportButton": "Export Data", + "error": "Failed to export data" + } + }, + "usage": { + "noData": "No data available", + "error": "Error loading usage statistics", + "noDataMessage": "No usage statistics are currently available.", + "controls": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All", + "refresh": "Refresh", + "dataTypeLabel": "Data Type:", + "dataType": { + "all": "All", + "api": "API", + "ui": "UI" + } + }, + "showing": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All" + }, + "stats": { + "totalEndpoints": "Total Endpoints", + "totalVisits": "Total Visits", + "showing": "Showing", + "selectedVisits": "Selected Visits" + }, + "chart": { + "title": "Endpoint Usage Chart" + }, + "table": { + "title": "Detailed Statistics", + "endpoint": "Endpoint", + "visits": "Visits", + "percentage": "Percentage", + "noData": "No data available" + } + }, + "backendHealth": { + "checking": "Checking backend status...", + "online": "Backend Online", + "offline": "Backend Offline" + }, + "replaceColorPdf": { + "tags": "Sostituisci colore, Operazioni di pagina, Back-end, lato server" + } +} diff --git a/frontend/public/locales/ja-JP/translation.json b/frontend/public/locales/ja-JP/translation.json index c68b843ba..022c762d9 100644 --- a/frontend/public/locales/ja-JP/translation.json +++ b/frontend/public/locales/ja-JP/translation.json @@ -1,4 +1,36 @@ { + "toolPanel": { + "modePrompt": { + "title": "Choose how you browse tools", + "description": "Preview both layouts and decide how you want to explore Stirling PDF tools.", + "sidebarTitle": "Sidebar mode", + "sidebarDescription": "Keep tools alongside your workspace for quick switching.", + "recommended": "Recommended", + "chooseSidebar": "Use sidebar mode", + "fullscreenTitle": "Fullscreen mode - (legacy)", + "fullscreenDescription": "Browse every tool in a catalogue that covers the workspace until you pick one.", + "chooseFullscreen": "Use fullscreen mode", + "dismiss": "Maybe later" + }, + "fullscreen": { + "showDetails": "Show Details", + "comingSoon": "Coming soon:", + "favorite": "Add to favourites", + "favorites": "Favourites", + "heading": "All tools (fullscreen view)", + "noResults": "Try adjusting your search or toggle descriptions to find what you need.", + "recommended": "Recommended", + "unfavorite": "Remove from favourites" + }, + "placeholder": "Choose a tool to get started", + "toggle": { + "fullscreen": "Switch to fullscreen mode", + "sidebar": "Switch to sidebar mode" + } + }, + "unsavedChanges": "You have unsaved changes to your PDF.", + "areYouSure": "Are you sure you want to leave?", + "unsavedChangesTitle": "Unsaved Changes", "keepWorking": "äŊœæĨ­ã‚’įļšã‘ã‚‹", "discardChanges": "å¤‰æ›´ã‚’į ´æŖ„", "applyAndContinue": "éŠį”¨ã—ãĻįļščĄŒ", @@ -22,8 +54,26 @@ "customTextDesc": "ã‚Ģ゚ã‚ŋムテキ゚ト", "numberPagesDesc": "į•Ēåˇã‚’ã¤ã‘ã‚‹ãƒšãƒŧジ、デフりãƒĢトは'all'、 1-5 や 2,5,9 ãĒお", "customNumberDesc": "デフりãƒĢトは{n}、'{n} īŧ {total} ペãƒŧジ'、'テキ゚ト-{n}'、'{filename}-{n}ãĒお'", - "submit": "ペãƒŧジį•ĒåˇãŽčŋŊ加" + "submit": "ペãƒŧジį•ĒåˇãŽčŋŊ加", + "configuration": "Configuration", + "customize": "Customize Appearance", + "pagesAndStarting": "Pages & Starting Number", + "positionAndPages": "Position & Pages", + "error": { + "failed": "Add page numbers operation failed" + }, + "results": { + "title": "Page Number Results" + }, + "preview": "Position Selection", + "previewDisclaimer": "Preview is approximate. Final output may vary due to PDF font metrics." }, + "pageSelectionPrompt": "ã‚Ģ゚ã‚ŋムペãƒŧジ選択(ペãƒŧジį•Ēåˇ1、5、6ぞたは2n + 1ãĒおぎé–ĸæ•°ãŽã‚ŗãƒŗãƒžåŒē切りãƒĒ゚トをå…Ĩ力しぞす):", + "startingNumberTooltip": "The first number to display. Subsequent pages will increment from this number.", + "marginTooltip": "Distance between the page number and the edge of the page.", + "fontSizeTooltip": "Size of the page number text in points. Larger numbers create bigger text.", + "fontTypeTooltip": "Font family for the page numbers. Choose based on your document style.", + "customTextTooltip": "Optional custom format for page numbers. Use {n} as placeholder for the number. Example: \"Page {n}\" will show \"Page 1\", \"Page 2\", etc.", "pdfPrompt": "PDFを選択", "multiPdfPrompt": "PDFを選択 (2つäģĨ上)", "multiPdfDropPrompt": "PDFを選択 (又はドナッグ&ドロップ)", @@ -34,7 +84,6 @@ "uploadLimitExceededPlural": "ぎã‚ĩイã‚ēãŒå¤§ãã™ãŽãžã™ã€‚č¨ąå¯ã•ã‚ŒãŸæœ€å¤§ã‚ĩイã‚ēは", "processTimeWarning": "č­Ļ告:こぎå‡Ļį†ã¯ãƒ•ã‚Ąã‚¤ãƒĢã‚ĩイã‚ēãĢã‚ˆãŖãĻ1åˆ†į¨‹åēĻかかることがありぞす", "pageOrderPrompt": "ペãƒŧジ順åē (ペãƒŧジį•Ēåˇã‚’ã‚ĢãƒŗãƒžåŒē切り又は2n+1ぎようãĒé–ĸ数でå…Ĩ力):", - "pageSelectionPrompt": "ã‚Ģ゚ã‚ŋムペãƒŧジ選択(ペãƒŧジį•Ēåˇ1、5、6ぞたは2n + 1ãĒおぎé–ĸæ•°ãŽã‚ŗãƒŗãƒžåŒē切りãƒĒ゚トをå…Ĩ力しぞす):", "goToPage": "į§ģ動", "true": "ᜟ", "false": "åŊ", @@ -45,10 +94,18 @@ "save": "äŋå­˜", "saveToBrowser": "ブナã‚Ļã‚ļへäŋå­˜", "download": "ダã‚Ļãƒŗãƒ­ãƒŧド", + "pin": "Pin File (keep active after tool run)", + "unpin": "Unpin File (replace after tool run)", + "undoOperationTooltip": "Click to undo the last operation and restore the original files", "undo": "元ãĢæˆģす", "moreOptions": "そぎäģ–ぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗ", "editYourNewFiles": "æ–°ã—ã„ãƒ•ã‚Ąã‚¤ãƒĢã‚’įˇ¨é›†", "close": "閉じる", + "openInViewer": "Open in Viewer", + "confirmClose": "Confirm Close", + "confirmCloseMessage": "Are you sure you want to close this file?", + "confirmCloseCancel": "Cancel", + "confirmCloseConfirm": "Close File", "fileSelected": "選択中īŧš{{filename}}", "chooseFile": "ãƒ•ã‚Ąã‚¤ãƒĢを選択", "filesSelected": "é¸æŠžã•ã‚ŒãŸãƒ•ã‚Ąã‚¤ãƒĢ", @@ -58,7 +115,9 @@ "uploadFiles": "ãƒ•ã‚Ąã‚¤ãƒĢをã‚ĸップロãƒŧド", "addFiles": "ãƒ•ã‚Ąã‚¤ãƒĢをčŋŊ加", "selectFromWorkbench": "ワãƒŧã‚¯ãƒ™ãƒŗãƒã‹ã‚‰ãƒ•ã‚Ąã‚¤ãƒĢを選択ぞたは ", - "selectMultipleFromWorkbench": "ワãƒŧã‚¯ãƒ™ãƒŗãƒã‹ã‚‰å°‘ãĒくとも {{count}} äģļ選択ぞたは " + "selectMultipleFromWorkbench": "ワãƒŧã‚¯ãƒ™ãƒŗãƒã‹ã‚‰å°‘ãĒくとも {{count}} äģļ選択ぞたは ", + "created": "Created", + "size": "File Size" }, "noFavourites": "お気ãĢå…Ĩりはありぞせん", "downloadComplete": "ダã‚Ļãƒŗãƒ­ãƒŧド厌äē†", @@ -95,6 +154,9 @@ "githubSubmit": "GitHub - ãƒã‚ąãƒƒãƒˆã‚’æå‡ē", "discordSubmit": "Discord - ã‚ĩポãƒŧト投į¨ŋを提å‡ē" }, + "warning": { + "tooltipTitle": "Warning" + }, "edit": "ᎍ集", "delete": "削除", "username": "ãƒĻãƒŧã‚ļãƒŧ名", @@ -141,6 +203,7 @@ "page": "ペãƒŧジ", "pages": "ペãƒŧジ", "loading": "čĒ­čžŧ中...", + "review": "Review", "addToDoc": "ドキãƒĨãƒĄãƒŗãƒˆãĢčŋŊ加", "reset": "ãƒĒã‚ģット", "apply": "éŠį”¨", @@ -187,6 +250,7 @@ "title": "Stirling PDFã‚’ã‚‚ãŖã¨č‰¯ãã—ãŸã„ã§ã™ã‹īŧŸ", "paragraph1": "Stirling PDFでは、čŖŊ品ぎ攚善ãĢåŊšįĢ‹ã¤åˆ†æžæŠŸčƒŊをã‚Ēãƒ—ãƒˆã‚¤ãƒŗã—ãĻいぞす。個äē翃…å ąã‚„ãƒ•ã‚Ąã‚¤ãƒĢぎ内厚をčŋŊčˇĄã™ã‚‹ã“ã¨ã¯ã‚ã‚Šãžã›ã‚“ã€‚", "paragraph2": "Stirling-PDFãŽæˆé•ˇã‚’æ”¯æ´ã—ãƒĻãƒŧã‚ļãƒŧã‚’ã‚ˆã‚Šæˇąãį†č§Ŗã§ãã‚‹ã‚ˆã†ãĢ分析を有劚ãĢã™ã‚‹ã“ã¨ã‚’æ¤œč¨Žã—ãĻください。", + "learnMore": "Learn more", "enable": "分析を有劚ãĢする", "disable": "åˆ†æžã‚’į„ĄåŠšãĢする", "settings": "config/settings.ymlãƒ•ã‚Ąã‚¤ãƒĢでã‚ĸナãƒĒãƒ†ã‚Ŗã‚¯ã‚šãŽč¨­åŽšã‚’å¤‰æ›´ã§ããžã™ã€‚" @@ -230,6 +294,54 @@ "cacheInputs": { "name": "フりãƒŧムぎå…Ĩ力をäŋå­˜ã™ã‚‹", "help": "äģĨ前äŊŋį”¨ã—ãŸå…Ĩ力をäŋå­˜ã—、æŦĄå›žã‹ã‚‰äŊŋį”¨ã§ãã‚‹ã‚ˆã†ãĢする。" + }, + "general": { + "title": "General", + "description": "Configure general application preferences.", + "account": "Account", + "accountDescription": "Manage your account settings", + "user": "User", + "signedInAs": "Signed in as", + "logout": "Log out", + "enableFeatures": { + "title": "For System Administrators", + "intro": "Enable user authentication, team management, and workspace features for your organization.", + "action": "Configure", + "and": "and", + "benefit": "Enables user roles, team collaboration, admin controls, and enterprise features.", + "learnMore": "Learn more in documentation", + "dismiss": "Dismiss" + }, + "autoUnzip": "Auto-unzip API responses", + "autoUnzipDescription": "Automatically extract files from ZIP responses", + "autoUnzipTooltip": "Automatically extract ZIP files returned from API operations. Disable to keep ZIP files intact. This does not affect automation workflows.", + "autoUnzipFileLimit": "Auto-unzip file limit", + "autoUnzipFileLimitDescription": "Maximum number of files to extract from ZIP", + "autoUnzipFileLimitTooltip": "Only unzip if the ZIP contains this many files or fewer. Set higher to extract larger ZIPs.", + "defaultToolPickerMode": "Default tool picker mode", + "defaultToolPickerModeDescription": "Choose whether the tool picker opens in fullscreen or sidebar by default", + "mode": { + "fullscreen": "Fullscreen", + "sidebar": "Sidebar" + } + }, + "hotkeys": { + "title": "Keyboard Shortcuts", + "description": "Hover a tool to see its shortcut or customise it below. Click \"Change shortcut\" and press a new key combination. Press Esc to cancel.", + "errorModifier": { + "mac": "Include ⌘ (Command), âŒĨ (Option), or another modifier in your shortcut.", + "windows": "Include Ctrl, Alt, or another modifier in your shortcut." + }, + "errorConflict": "Shortcut already used by {{tool}}.", + "none": "Not assigned", + "customBadge": "Custom", + "defaultLabel": "Default: {{shortcut}}", + "capturing": "Press keysâ€Ļ (Esc to cancel)", + "change": "Change shortcut", + "reset": "Reset", + "shortcut": "Shortcut", + "noShortcut": "No shortcut set", + "searchPlaceholder": "Search tools..." } }, "changeCreds": { @@ -301,8 +413,10 @@ "top20": "トップ20", "all": "すずãĻ", "refresh": "更新", - "includeHomepage": "ホãƒŧムペãƒŧジをåĢめる ('/')", - "includeLoginPage": "ãƒ­ã‚°ã‚¤ãƒŗãƒšãƒŧジをåĢめる ('/login')", + "dataTypeLabel": "Data Type:", + "dataTypeAll": "All", + "dataTypeApi": "API", + "dataTypeUi": "UI", "totalEndpoints": "ã‚¨ãƒŗãƒ‰ãƒã‚¤ãƒŗãƒˆåˆč¨ˆ", "totalVisits": "įˇč¨Ē問数", "showing": "襨į¤ē", @@ -317,7 +431,9 @@ "top": "トップ", "numberOfVisits": "č¨Ē問回数", "visitsTooltip": "č¨Ē問数: {0} (åˆč¨ˆãŽ{1}%)", - "retry": "再čŠĻ行" + "retry": "再čŠĻ行", + "includeHomepage": "ホãƒŧムペãƒŧジをåĢめる ('/')", + "includeLoginPage": "ãƒ­ã‚°ã‚¤ãƒŗãƒšãƒŧジをåĢめる ('/login')" }, "database": { "title": "デãƒŧã‚ŋベãƒŧã‚šãŽã‚¤ãƒŗãƒãƒŧト/エク゚ポãƒŧト", @@ -358,6 +474,16 @@ "alphabetical": "ã‚ĸãƒĢãƒ•ã‚Ąãƒ™ãƒƒãƒˆé †", "globalPopularity": "グロãƒŧバãƒĢäēēæ°—", "sortBy": "ã‚Ŋãƒŧト順:", + "mobile": { + "brandAlt": "Stirling PDF logo", + "openFiles": "Open files", + "swipeHint": "Swipe left or right to switch views", + "tools": "Tools", + "toolsSlide": "Tool selection panel", + "viewSwitcher": "Switch workspace view", + "workbenchSlide": "Workspace panel", + "workspace": "Workspace" + }, "multiTool": { "tags": "multiple,tools", "title": "PDFマãƒĢチツãƒŧãƒĢ", @@ -543,11 +669,6 @@ "title": "手動åĸ¨æļˆã—", "desc": "選択したテキ゚ト、描į”ģã—ãŸå›ŗåŊĸ、選択したペãƒŧジãĢåŸēãĨいãĻPDFをåĸ¨æļˆã—ぞす。" }, - "overlayPdfs": { - "tags": "overlay,combine,stack", - "title": "PDF をã‚ĒãƒŧバãƒŧãƒŦイ", - "desc": "PDF をåˆĨぎ PDF ãĢ重ね合わせぞす" - }, "splitBySections": { "tags": "split,sections,divide", "title": "ã‚ģã‚¯ã‚ˇãƒ§ãƒŗã§ PDF ã‚’åˆ†å‰˛", @@ -652,6 +773,15 @@ "tags": "workflow,sequence,automation", "title": "č‡Ē動化", "desc": "PDF ã‚ĸã‚¯ã‚ˇãƒ§ãƒŗã‚’é€Ŗįĩã—ãĻč¤‡æ•°ã‚šãƒ†ãƒƒãƒ—ãŽãƒ¯ãƒŧクフロãƒŧã‚’æ§‹į¯‰ã€‚įš°ã‚Ščŋ”しäŊœæĨ­ãĢ最遊です。" + }, + "overlay-pdfs": { + "desc": "Overlay one PDF on top of another", + "title": "Overlay PDFs" + }, + "overlayPdfs": { + "tags": "overlay,combine,stack", + "title": "PDF をã‚ĒãƒŧバãƒŧãƒŦイ", + "desc": "PDF をåˆĨぎ PDF ãĢ重ね合わせぞす" } }, "landing": { @@ -691,13 +821,19 @@ "merge": { "tags": "merge,Page operations,Back end,server side", "title": "įĩåˆ", - "removeDigitalSignature.tooltip": { - "title": "デジã‚ŋãƒĢįŊ˛åã‚’削除", - "description": "ãƒ•ã‚Ąã‚¤ãƒĢをįĩåˆã™ã‚‹ã¨ãƒ‡ã‚¸ã‚ŋãƒĢįŊ˛åã¯į„ĄåŠšãĢãĒりぞす。最įĩ‚įš„ãĒįĩåˆ PDF からįŊ˛åã‚’削除するãĢはチェックをå…ĨれãĻください。" + "removeDigitalSignature": { + "label": "Remove digital signature in the merged file?", + "tooltip": { + "title": "デジã‚ŋãƒĢįŊ˛åã‚’削除", + "description": "ãƒ•ã‚Ąã‚¤ãƒĢをįĩåˆã™ã‚‹ã¨ãƒ‡ã‚¸ã‚ŋãƒĢįŊ˛åã¯į„ĄåŠšãĢãĒりぞす。最įĩ‚įš„ãĒįĩåˆ PDF からįŊ˛åã‚’削除するãĢはチェックをå…ĨれãĻください。" + } }, - "generateTableOfContents.tooltip": { - "title": "į›ŽæŦĄã‚’į”Ÿæˆ", - "description": "å…ƒãŽãƒ•ã‚Ąã‚¤ãƒĢ名とペãƒŧジį•ĒåˇãĢåŸēãĨいãĻ、įĩåˆåžŒãŽ PDF ãĢクãƒĒック可čƒŊãĒį›ŽæŦĄã‚’č‡Ē動äŊœæˆã—ぞす。" + "generateTableOfContents": { + "label": "Generate table of contents in the merged file?", + "tooltip": { + "title": "į›ŽæŦĄã‚’į”Ÿæˆ", + "description": "å…ƒãŽãƒ•ã‚Ąã‚¤ãƒĢ名とペãƒŧジį•ĒåˇãĢåŸēãĨいãĻ、įĩåˆåžŒãŽ PDF ãĢクãƒĒック可čƒŊãĒį›ŽæŦĄã‚’č‡Ē動äŊœæˆã—ぞす。" + } }, "submit": "įĩåˆ", "sortBy": { @@ -729,22 +865,176 @@ "splitPages": "åˆ†å‰˛ã™ã‚‹ãƒšãƒŧジį•Ēåˇã‚’å…Ĩ力:", "submit": "åˆ†å‰˛", "steps": { + "chooseMethod": "Choose Method", "settings": "č¨­åŽš" }, + "settings": { + "selectMethodFirst": "Please select a split method first" + }, + "error": { + "failed": "An error occurred while splitting the PDF." + }, + "method": { + "label": "Choose split method", + "placeholder": "Select how to split the PDF" + }, "methods": { + "prefix": { + "splitAt": "Split at", + "splitBy": "Split by" + }, + "byPages": { + "name": "Page Numbers", + "desc": "Extract specific pages (1,3,5-10)", + "tooltip": "Enter page numbers separated by commas or ranges with hyphens" + }, + "bySections": { + "name": "Sections", + "desc": "Divide pages into grid sections", + "tooltip": "Split each page into horizontal and vertical sections" + }, "bySize": { - "name": "ãƒ•ã‚Ąã‚¤ãƒĢã‚ĩイã‚ē" + "name": "ãƒ•ã‚Ąã‚¤ãƒĢã‚ĩイã‚ē", + "desc": "Limit maximum file size", + "tooltip": "Specify maximum file size (e.g. 10MB, 500KB)" + }, + "byPageCount": { + "name": "Page Count", + "desc": "Fixed pages per file", + "tooltip": "Enter the number of pages for each split file" + }, + "byDocCount": { + "name": "Document Count", + "desc": "Create specific number of files", + "tooltip": "Enter how many files you want to create" + }, + "byChapters": { + "name": "Chapters", + "desc": "Split at bookmark boundaries", + "tooltip": "Uses PDF bookmarks to determine split points" + }, + "byPageDivider": { + "name": "Page Divider", + "desc": "Auto-split with divider sheets", + "tooltip": "Use QR code divider sheets between documents when scanning" } }, "value": { "fileSize": { - "label": "ãƒ•ã‚Ąã‚¤ãƒĢã‚ĩイã‚ē" + "label": "ãƒ•ã‚Ąã‚¤ãƒĢã‚ĩイã‚ē", + "placeholder": "e.g. 10MB, 500KB" + }, + "pageCount": { + "label": "Pages per File", + "placeholder": "e.g. 5, 10" + }, + "docCount": { + "label": "Number of Files", + "placeholder": "e.g. 3, 5" } - } + }, + "tooltip": { + "header": { + "title": "Split Methods Overview" + }, + "byPages": { + "title": "Split at Page Numbers", + "text": "Split your PDF at specific page numbers. Using 'n' splits after page n. Using 'n-m' splits before page n and after page m.", + "bullet1": "Single split points: 3,7 (splits after pages 3 and 7)", + "bullet2": "Range split points: 3-8 (splits before page 3 and after page 8)", + "bullet3": "Mixed: 2,5-10,15 (splits after page 2, before page 5, after page 10, and after page 15)" + }, + "bySections": { + "title": "Split by Grid Sections", + "text": "Divide each page into a grid of sections. Useful for splitting documents with multiple columns or extracting specific areas.", + "bullet1": "Horizontal: Number of rows to create", + "bullet2": "Vertical: Number of columns to create", + "bullet3": "Merge: Combine all sections into one PDF" + }, + "bySize": { + "title": "Split by File Size", + "text": "Create multiple PDFs that don't exceed a specified file size. Ideal for file size limitations or email attachments.", + "bullet1": "Use MB for larger files (e.g., 10MB)", + "bullet2": "Use KB for smaller files (e.g., 500KB)", + "bullet3": "System will split at page boundaries" + }, + "byCount": { + "title": "Split by Count", + "text": "Create multiple PDFs with a specific number of pages or documents each.", + "bullet1": "Page Count: Fixed number of pages per file", + "bullet2": "Document Count: Fixed number of output files", + "bullet3": "Useful for batch processing workflows" + }, + "byChapters": { + "title": "Split by Chapters", + "text": "Use PDF bookmarks to automatically split at chapter boundaries. Requires PDFs with bookmark structure.", + "bullet1": "Bookmark Level: Which level to split on (1=top level)", + "bullet2": "Include Metadata: Preserve document properties", + "bullet3": "Allow Duplicates: Handle repeated bookmark names" + }, + "byDocCount": { + "bullet1": "Enter the number of output files you want", + "bullet2": "Pages are distributed as evenly as possible", + "bullet3": "Useful when you need a specific number of files", + "text": "Create a specific number of output files by evenly distributing pages across them.", + "title": "Split by Document Count" + }, + "byPageCount": { + "bullet1": "Enter the number of pages per output file", + "bullet2": "Last file may have fewer pages if not evenly divisible", + "bullet3": "Useful for batch processing workflows", + "text": "Create multiple PDFs with a specific number of pages each. Perfect for creating uniform document chunks.", + "title": "Split by Page Count" + }, + "byPageDivider": { + "bullet1": "Print divider sheets from the download link", + "bullet2": "Insert divider sheets between your documents", + "bullet3": "Scan all documents together as one PDF", + "bullet4": "Upload - divider pages are automatically detected and removed", + "bullet5": "Enable Duplex Mode if scanning both sides of divider sheets", + "text": "Automatically split scanned documents using physical divider sheets with QR codes. Perfect for processing multiple documents scanned together.", + "title": "Split by Page Divider" + } + }, + "methodSelection": { + "tooltip": { + "bullet1": "Click on a method card to select it", + "bullet2": "Hover over each card to see a quick description", + "bullet3": "The settings step will appear after you select a method", + "bullet4": "You can change methods at any time before processing", + "header": { + "text": "Choose how you want to split your PDF document. Each method is optimized for different use cases and document types.", + "title": "Split Method Selection" + }, + "title": "Choose Your Split Method" + } + }, + "selectMethod": "Select a split method" }, "rotate": { "title": "PDFぎ回čģĸ", - "submit": "回čģĸ" + "submit": "回čģĸ", + "selectRotation": "Select Rotation Angle (Clockwise)", + "error": { + "failed": "An error occurred while rotating the PDF." + }, + "preview": { + "title": "Rotation Preview" + }, + "rotateLeft": "Rotate Anticlockwise", + "rotateRight": "Rotate Clockwise", + "tooltip": { + "header": { + "title": "Rotate Settings Overview" + }, + "description": { + "text": "Rotate your PDF pages clockwise or anticlockwise in 90-degree increments. All pages in the PDF will be rotated. The preview shows how your document will look after rotation." + }, + "controls": { + "title": "Controls", + "text": "Use the rotation buttons to adjust orientation. Left button rotates anticlockwise, right button rotates clockwise. Each click rotates by 90 degrees." + } + } }, "convert": { "title": "変換", @@ -812,7 +1102,8 @@ "imagesExt": "į”ģ像īŧˆJPG、PNG ãĒおīŧ‰", "markdown": "Markdown", "textRtf": "テキ゚ト/RTF", - "grayscale": "グãƒŦãƒŧã‚šã‚ąãƒŧãƒĢ" + "grayscale": "グãƒŦãƒŧã‚šã‚ąãƒŧãƒĢ", + "errorConversion": "An error occurred while converting the file." }, "imageToPdf": { "tags": "conversion,img,jpg,picture,photo,psd,photoshop" @@ -850,7 +1141,33 @@ "8": "最垌を削除", "9": "最初と最垌を削除", "10": "åĨ‡æ•°-åļ数ぎįĩåˆ", - "11": "すずãĻぎペãƒŧã‚¸ã‚’č¤‡čŖŊ" + "11": "すずãĻぎペãƒŧã‚¸ã‚’č¤‡čŖŊ", + "desc": { + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, â€Ļ).", + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, â€Ļ).", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimized for binding on the side)." + } + }, + "desc": { + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, â€Ļ).", + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, â€Ļ).", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimised for binding on the side).", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document." }, "placeholder": "(例:1,3,2ぞたは4-8,2,10-12ぞたは2n-1)" }, @@ -873,12 +1190,185 @@ }, "watermark": { "title": "透かしぎčŋŊ加", + "desc": "Add text or image watermarks to PDF files", + "completed": "Watermark added", "submit": "透かしをčŋŊ加", + "filenamePrefix": "watermarked", + "error": { + "failed": "An error occurred while adding watermark to the PDF." + }, "watermarkType": { - "text": "テキ゚ト" + "text": "テキ゚ト", + "image": "Image" }, "settings": { - "fontSize": "ãƒ•ã‚Šãƒŗãƒˆã‚ĩイã‚ē" + "type": "Watermark Type", + "text": { + "label": "Watermark Text", + "placeholder": "Enter watermark text" + }, + "image": { + "label": "Watermark Image", + "choose": "Choose Image", + "selected": "Selected: {{filename}}" + }, + "fontSize": "ãƒ•ã‚Šãƒŗãƒˆã‚ĩイã‚ē", + "size": "Size", + "alphabet": "Font/Language", + "color": "Watermark Colour", + "rotation": "Rotation (degrees)", + "opacity": "Opacity (%)", + "spacing": { + "horizontal": "Horizontal Spacing", + "vertical": "Vertical Spacing", + "height": "Height Spacing", + "width": "Width Spacing" + }, + "convertToImage": "Flatten PDF pages to images" + }, + "alphabet": { + "roman": "Roman/Latin", + "arabic": "Arabic", + "japanese": "Japanese", + "korean": "Korean", + "chinese": "Chinese", + "thai": "Thai" + }, + "steps": { + "type": "Watermark Type", + "wording": "Wording", + "textStyle": "Style", + "formatting": "Formatting", + "file": "Watermark File" + }, + "results": { + "title": "Watermark Results" + }, + "tooltip": { + "language": { + "title": "Language Support", + "text": "Choose the appropriate language setting to ensure proper font rendering for your text." + }, + "appearance": { + "title": "Appearance Settings", + "text": "Control how your watermark looks and blends with the document.", + "bullet1": "Rotation: -360° to 360° for angled watermarks", + "bullet2": "Opacity: 0-100% for transparency control", + "bullet3": "Lower opacity creates subtle watermarks" + }, + "spacing": { + "title": "Spacing Control", + "text": "Adjust the spacing between repeated watermarks across the page.", + "bullet1": "Width spacing: Horizontal distance between watermarks", + "bullet2": "Height spacing: Vertical distance between watermarks", + "bullet3": "Higher values create more spread out patterns" + }, + "type": { + "header": { + "title": "Watermark Type Selection" + }, + "description": { + "title": "Choose Your Watermark", + "text": "Select between text or image watermarks based on your needs." + }, + "text": { + "title": "Text Watermarks", + "text": "Perfect for adding copyright notices, company names, or confidentiality labels. Supports multiple languages and custom colours.", + "bullet1": "Customisable fonts and languages", + "bullet2": "Adjustable colours and transparency", + "bullet3": "Ideal for legal or branding text" + }, + "image": { + "title": "Image Watermarks", + "text": "Use logos, stamps, or any image as a watermark. Great for branding and visual identification.", + "bullet1": "Upload any image format", + "bullet2": "Maintains image quality", + "bullet3": "Perfect for logos and stamps" + } + }, + "wording": { + "header": { + "title": "Text Content" + }, + "text": { + "title": "Watermark Text", + "text": "Enter the text that will appear as your watermark across the document.", + "bullet1": "Keep it concise for better readability", + "bullet2": "Common examples: 'CONFIDENTIAL', 'DRAFT', company name", + "bullet3": "Emoji characters are not supported and will be filtered out" + } + }, + "textStyle": { + "header": { + "title": "Text Style" + }, + "color": { + "title": "Colour Selection", + "text": "Choose a colour that provides good contrast with your document content.", + "bullet1": "Light grey (#d3d3d3) for subtle watermarks", + "bullet2": "Black or dark colours for high contrast", + "bullet3": "Custom colours for branding purposes" + }, + "language": { + "title": "Language Support", + "text": "Choose the appropriate language setting to ensure proper font rendering." + } + }, + "file": { + "header": { + "title": "Image Upload" + }, + "upload": { + "title": "Image Selection", + "text": "Upload an image file to use as your watermark.", + "bullet1": "Supports common formats: PNG, JPG, GIF, BMP", + "bullet2": "PNG with transparency works best", + "bullet3": "Higher resolution images maintain quality better" + }, + "recommendations": { + "title": "Best Practices", + "text": "Tips for optimal image watermark results.", + "bullet1": "Use logos or stamps with transparent backgrounds", + "bullet2": "Simple designs work better than complex images", + "bullet3": "Consider the final document size when choosing resolution" + } + }, + "formatting": { + "header": { + "title": "Formatting & Layout" + }, + "size": { + "title": "Size Control", + "text": "Adjust the size of your watermark (text or image).", + "bullet1": "Larger sizes create more prominent watermarks" + }, + "appearance": { + "title": "Appearance Settings", + "text": "Control how your watermark looks and blends with the document.", + "bullet1": "Rotation: -360° to 360° for angled watermarks", + "bullet2": "Opacity: 0-100% for transparency control", + "bullet3": "Lower opacity creates subtle watermarks" + }, + "spacing": { + "title": "Spacing Control", + "text": "Adjust the spacing between repeated watermarks across the page.", + "bullet1": "Horizontal spacing: Distance between watermarks left to right", + "bullet2": "Vertical spacing: Distance between watermarks top to bottom", + "bullet3": "Higher values create more spread out patterns" + }, + "security": { + "title": "Security Option", + "text": "Convert the final PDF to an image-based format for enhanced security.", + "bullet1": "Prevents text selection and copying", + "bullet2": "Makes watermarks harder to remove", + "bullet3": "Results in larger file sizes", + "bullet4": "Best for sensitive or copyrighted content" + } + } + }, + "type": { + "1": "Text", + "2": "Image" } }, "permissions": { @@ -903,9 +1393,152 @@ "removePages": { "tags": "Remove pages,delete pages", "title": "削除", + "pageNumbers": { + "label": "Pages to Remove", + "placeholder": "e.g., 1,3,5-8,10", + "error": "Invalid page number format. Use numbers, ranges (1-5), or mathematical expressions (2n+1)" + }, + "filenamePrefix": "pages_removed", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "settings": { + "title": "Settings" + }, + "tooltip": { + "header": { + "title": "Remove Pages Settings" + }, + "pageNumbers": { + "title": "Page Selection", + "text": "Specify which pages to remove from your PDF. You can select individual pages, ranges, or use mathematical expressions.", + "bullet1": "Individual pages: 1,3,5 (removes pages 1, 3, and 5)", + "bullet2": "Page ranges: 1-5,10-15 (removes pages 1-5 and 10-15)", + "bullet3": "Mathematical: 2n+1 (removes odd pages)", + "bullet4": "Open ranges: 5- (removes from page 5 to end)" + }, + "examples": { + "title": "Common Examples", + "text": "Here are some common page selection patterns:", + "bullet1": "Remove first page: 1", + "bullet2": "Remove last 3 pages: -3", + "bullet3": "Remove every other page: 2n", + "bullet4": "Remove specific scattered pages: 1,5,10,15" + }, + "safety": { + "title": "Safety Tips", + "text": "Important considerations when removing pages:", + "bullet1": "Always preview your selection before processing", + "bullet2": "Keep a backup of your original file", + "bullet3": "Page numbers start from 1, not 0", + "bullet4": "Invalid page numbers will be ignored" + } + }, + "error": { + "failed": "An error occurred whilst removing pages." + }, + "results": { + "title": "Page Removal Results" + }, "submit": "削除" }, + "extractPages": { + "title": "Extract Pages", + "pageNumbers": { + "label": "Pages to Extract", + "placeholder": "e.g., 1,3,5-8 or odd & 1-10" + }, + "settings": { + "title": "Settings" + }, + "tooltip": { + "description": "Extracts the selected pages into a new PDF, preserving order." + }, + "error": { + "failed": "Failed to extract pages" + }, + "results": { + "title": "Pages Extracted" + }, + "submit": "Extract Pages" + }, + "pageSelection": { + "tooltip": { + "header": { + "title": "Page Selection Guide" + }, + "basic": { + "title": "Basic Usage", + "text": "Select specific pages from your PDF document using simple syntax.", + "bullet1": "Individual pages: 1,3,5", + "bullet2": "Page ranges: 3-6 or 10-15", + "bullet3": "All pages: all" + }, + "advanced": { + "title": "Advanced Features" + }, + "tips": { + "title": "Tips", + "text": "Keep these guidelines in mind:", + "bullet1": "Page numbers start from 1 (not 0)", + "bullet2": "Spaces are automatically removed", + "bullet3": "Invalid expressions are ignored" + }, + "syntax": { + "title": "Syntax Basics", + "text": "Use numbers, ranges, keywords, and progressions (n starts at 0). Parentheses are supported.", + "bullets": { + "numbers": "Numbers/ranges: 5, 10-20", + "keywords": "Keywords: odd, even", + "progressions": "Progressions: 3n, 4n+1" + } + }, + "operators": { + "title": "Operators", + "text": "AND has higher precedence than comma. NOT applies within the document range.", + "and": "AND: & or \"and\" — require both conditions (e.g., 1-50 & even)", + "comma": "Comma: , or | — combine selections (e.g., 1-10, 20)", + "not": "NOT: ! or \"not\" — exclude pages (e.g., 3n & not 30)" + }, + "examples": { + "title": "Examples" + }, + "complex": { + "bullet1": "1,3-5,8,2n → pages 1, 3–5, 8, plus evens", + "bullet2": "10-,2n-1 → from page 10 to end + odd pages", + "description": "Mix different types.", + "title": "Complex Combinations" + }, + "description": "Choose which pages to use for the operation. Supports single pages, ranges, formulas, and the all keyword.", + "individual": { + "bullet1": "1,3,5 → selects pages 1, 3, 5", + "bullet2": "2,7,12 → selects pages 2, 7, 12", + "description": "Enter numbers separated by commas.", + "title": "Individual Pages" + }, + "mathematical": { + "bullet1": "2n → all even pages (2, 4, 6â€Ļ)", + "bullet2": "2n-1 → all odd pages (1, 3, 5â€Ļ)", + "bullet3": "3n → every 3rd page (3, 6, 9â€Ļ)", + "bullet4": "4n-1 → pages 3, 7, 11, 15â€Ļ", + "description": "Use n in formulas for patterns.", + "title": "Mathematical Functions" + }, + "ranges": { + "bullet1": "3-6 → selects pages 3–6", + "bullet2": "10-15 → selects pages 10–15", + "bullet3": "5- → selects pages 5 to end", + "description": "Use - for consecutive pages.", + "title": "Page Ranges" + }, + "special": { + "bullet1": "all → selects all pages", + "title": "Special Keywords" + } + } + }, "bulkSelection": { + "syntaxError": "There is a syntax issue. See Page Selection tips for help.", "header": { "title": "ペãƒŧジ選択ã‚Ŧイド" }, @@ -964,7 +1597,18 @@ "tags": "remove,delete,form,field,readonly", "title": "フりãƒŧãƒ ãƒ•ã‚ŖãƒŧãƒĢドからčĒ­ãŋå–ã‚Šå°‚į”¨ã‚’å‰Šé™¤", "header": "PDFフりãƒŧãƒ ãŽãƒ­ãƒƒã‚¯ã‚’č§Ŗé™¤", - "submit": "Remove" + "submit": "Remove", + "description": "This tool will remove read-only restrictions from PDF form fields, making them editable and fillable.", + "filenamePrefix": "unlocked_forms", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst unlocking PDF forms." + }, + "results": { + "title": "Unlocked Forms Results" + } }, "changeMetadata": { "header": "ãƒĄã‚ŋデãƒŧã‚ŋぎ変更", @@ -1044,6 +1688,15 @@ "header": { "title": "PDF ãƒĄã‚ŋデãƒŧã‚ŋぎæĻ‚čρ" }, + "standardFields": { + "title": "Standard Fields", + "text": "Common PDF metadata fields that describe the document.", + "bullet1": "Title: Document name or heading", + "bullet2": "Author: Person who created the document", + "bullet3": "Subject: Brief description of content", + "bullet4": "Keywords: Search terms for the document", + "bullet5": "Creator/Producer: Software used to create the PDF" + }, "dates": { "title": "æ—Ĩäģ˜ãƒ•ã‚ŖãƒŧãƒĢド", "text": "文書ぎäŊœæˆæ—Ĩ時と最įĩ‚æ›´æ–°æ—Ĩ時です。", @@ -1191,6 +1844,9 @@ "text": "OCR ぎã‚ĸãƒŧãƒ†ã‚Ŗãƒ•ã‚Ąã‚¯ãƒˆã‚’é™¤åŽģし、テキ゚トãƒŦイヤãƒŧを最遊化しãĻ可čĒ­æ€§ãŽå‘ä¸Šã¨ãƒ•ã‚Ąã‚¤ãƒĢã‚ĩイã‚ēãŽį¸Žå°ã‚’å›ŗã‚Šãžã™ã€‚" } } + }, + "error": { + "failed": "OCR operation failed" } }, "extractImages": { @@ -1277,16 +1933,53 @@ }, "info": "PythonãŒã‚¤ãƒŗã‚šãƒˆãƒŧãƒĢされãĻã„ãžã›ã‚“ã€‚åŽŸčĄŒã™ã‚‹åŋ…čĻãŒã‚ã‚Šãžã™ã€‚" }, + "scannerImageSplit": { + "title": "Extracted Images", + "submit": "Extract Image Scans", + "error": { + "failed": "An error occurred while extracting image scans." + }, + "tooltip": { + "title": "Photo Splitter", + "whatThisDoes": "What this does", + "whatThisDoesDesc": "Automatically finds and extracts each photo from a scanned page or composite image—no manual cropping.", + "whenToUse": "When to use", + "useCase1": "Scan whole album pages in one go", + "useCase2": "Split flatbed batches into separate files", + "useCase3": "Break collages into individual photos", + "useCase4": "Pull photos from documents", + "quickFixes": "Quick fixes", + "problem1": "Photos not detected → increase Tolerance to 30-50", + "problem2": "Too many false detections → increase Minimum Area to 15,000-20,000", + "problem3": "Crops are too tight → increase Border Size to 5-10", + "problem4": "Tilted photos not straightened → lower Angle Threshold to ~5°", + "problem5": "Dust/noise boxes → increase Minimum Contour Area to 1000-2000", + "setupTips": "Setup tips", + "tip1": "Use a plain, light background", + "tip2": "Leave a small gap (≈1 cm) between photos", + "tip3": "Scan at 300-600 DPI", + "tip4": "Clean the scanner glass", + "headsUp": "Heads-up", + "headsUpDesc": "Overlapping photos or backgrounds very close in colour to the photos can reduce accuracy-try a lighter or darker background and leave more space." + } + }, "sign": { "title": "įŊ˛å", "header": "PDFãĢįŊ˛å", "upload": "į”ģ像をã‚ĸップロãƒŧド", - "draw": "įŊ˛åã‚’書く", - "text": "テキ゚トå…Ĩ力", + "draw": { + "title": "Draw your signature", + "clear": "Clear" + }, + "text": { + "name": "Signer Name", + "placeholder": "Enter your full name" + }, "clear": "クãƒĒã‚ĸ", "add": "čŋŊ加", "saved": "äŋå­˜ã•れたįŊ˛å", "save": "įŊ˛åã‚’äŋå­˜", + "applySignatures": "Apply Signatures", "personalSigs": "個äēēįŊ˛å", "sharedSigs": "å…ąæœ‰įŊ˛å", "noSavedSigs": "äŋå­˜ã•れたįŊ˛åãŒčĻ‹ã¤ã‹ã‚Šãžã›ã‚“", @@ -1298,7 +1991,42 @@ "previous": "前ぎペãƒŧジ", "maintainRatio": "ã‚ĸ゚ペクト比をįļ­æŒã‚’切æ›ŋえ", "undo": "元ãĢæˆģす", - "redo": "ã‚„ã‚Šį›´ã™" + "redo": "ã‚„ã‚Šį›´ã™", + "submit": "Sign Document", + "steps": { + "configure": "Configure Signature" + }, + "type": { + "title": "Signature Type", + "draw": "Draw", + "canvas": "Canvas", + "image": "Image", + "text": "Text" + }, + "image": { + "label": "Upload signature image", + "placeholder": "Select image file", + "hint": "Upload a PNG or JPG image of your signature" + }, + "instructions": { + "title": "How to add signature", + "canvas": "After drawing your signature in the canvas, close the modal then click anywhere on the PDF to place it.", + "image": "After uploading your signature image above, click anywhere on the PDF to place it.", + "text": "After entering your name above, click anywhere on the PDF to place your signature." + }, + "mode": { + "move": "Move Signature", + "place": "Place Signature" + }, + "updateAndPlace": "Update and Place", + "activate": "Activate Signature Placement", + "deactivate": "Stop Placing Signatures", + "results": { + "title": "Signature Results" + }, + "error": { + "failed": "An error occurred while signing the PDF." + } }, "flatten": { "title": "åšŗåĻ化", @@ -1315,7 +2043,10 @@ "options": { "stepTitle": "フナット化ã‚Ēãƒ—ã‚ˇãƒ§ãƒŗ", "title": "フナット化ã‚Ēãƒ—ã‚ˇãƒ§ãƒŗ", - "flattenOnlyForms.desc": "フりãƒŧãƒ ãƒ•ã‚ŖãƒŧãƒĢドぎãŋをフナット化し、そぎäģ–ãŽã‚¤ãƒŗã‚ŋãƒŠã‚¯ãƒ†ã‚Ŗãƒ–čĻį´ ã¯įļ­æŒã—ぞす", + "flattenOnlyForms": { + "label": "Flatten only forms", + "desc": "フりãƒŧãƒ ãƒ•ã‚ŖãƒŧãƒĢドぎãŋをフナット化し、そぎäģ–ãŽã‚¤ãƒŗã‚ŋãƒŠã‚¯ãƒ†ã‚Ŗãƒ–čĻį´ ã¯įļ­æŒã—ぞす" + }, "note": "フナット化すると PDF ã‹ã‚‰ã‚¤ãƒŗã‚ŋãƒŠã‚¯ãƒ†ã‚Ŗãƒ–čĻį´ ãŒå‰Šé™¤ã•ã‚Œã€įˇ¨é›†ã§ããĒくãĒりぞす。" }, "results": { @@ -1350,20 +2081,84 @@ "tags": "fix,restore,correction,recover", "title": "äŋŽåžŠ", "header": "PDFをäŋŽåžŠ", - "submit": "äŋŽåžŠ" + "submit": "äŋŽåžŠ", + "description": "This tool will attempt to repair corrupted or damaged PDF files. No additional settings are required.", + "filenamePrefix": "repaired", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst repairing the PDF." + }, + "results": { + "title": "Repair Results" + } }, "removeBlanks": { "title": "įŠēį™Ŋぎ削除", "header": "įŠēį™Ŋペãƒŧジぎ削除", - "threshold": "しきい値 :", - "whitePercent": "į™Ŋæ¯”įŽ‡", - "submit": "įŠēį™Ŋペãƒŧジぎ削除" + "settings": { + "title": "Settings" + }, + "threshold": { + "label": "Pixel Whiteness Threshold" + }, + "whitePercent": { + "label": "White Percentage Threshold", + "unit": "%" + }, + "includeBlankPages": { + "label": "Include detected blank pages" + }, + "tooltip": { + "header": { + "title": "Remove Blank Pages Settings" + }, + "threshold": { + "title": "Pixel Whiteness Threshold", + "text": "Controls how white a pixel must be to be considered 'white'. This helps determine what counts as a blank area on the page.", + "bullet1": "0 = Pure black (most restrictive)", + "bullet2": "128 = Medium grey", + "bullet3": "255 = Pure white (least restrictive)" + }, + "whitePercent": { + "title": "White Percentage Threshold", + "text": "Sets the minimum percentage of white pixels required for a page to be considered blank and removed.", + "bullet1": "Lower values (e.g., 80%) = More pages removed", + "bullet2": "Higher values (e.g., 95%) = Only very blank pages removed", + "bullet3": "Use higher values for documents with light backgrounds" + }, + "includeBlankPages": { + "title": "Include Detected Blank Pages", + "text": "When enabled, creates a separate PDF containing all the blank pages that were detected and removed from the original document.", + "bullet1": "Useful for reviewing what was removed", + "bullet2": "Helps verify the detection accuracy", + "bullet3": "Can be disabled to reduce output file size" + } + }, + "submit": "įŠēį™Ŋペãƒŧジぎ削除", + "error": { + "failed": "Failed to remove blank pages" + }, + "results": { + "title": "Removed Blank Pages" + } }, "removeAnnotations": { "tags": "comments,highlight,notes,markup,remove", "title": "æŗ¨é‡ˆãŽå‰Šé™¤", "header": "æŗ¨é‡ˆãŽå‰Šé™¤", - "submit": "削除" + "submit": "削除", + "settings": { + "title": "Settings" + }, + "info": { + "title": "About Remove Annotations", + "description": "This tool will remove all annotations (comments, highlights, notes, etc.) from your PDF documents." + }, + "error": { + "failed": "An error occurred while removing annotations from the PDF." + } }, "compare": { "tags": "åˇŽåˆ†,寞比,変更,分析", @@ -1449,7 +2244,12 @@ "bullet3": "įŊ˛åã‚’配įŊŽã™ã‚‹ãƒšãƒŧジを選択可čƒŊ", "bullet4": "äģģæ„ã§ãƒ­ã‚´ã‚’åĢめられぞす" } - } + }, + "invisible": "Invisible", + "options": { + "title": "Signature Details" + }, + "visible": "Visible" }, "sign": { "submit": "PDF ãĢįŊ˛å", @@ -1510,14 +2310,40 @@ "text": "keytool ã§ãƒ•ã‚Ąã‚¤ãƒĢを Java キãƒŧ゚トã‚ĸīŧˆ.jksīŧ‰ãĢ変換し、JKS を選択しãĻください。" } } - } + }, + "chooseCertificate": "Choose Certificate File", + "chooseJksFile": "Choose JKS File", + "chooseP12File": "Choose PKCS12 File", + "choosePfxFile": "Choose PFX File", + "choosePrivateKey": "Choose Private Key File", + "location": "Location", + "logoTitle": "Logo", + "name": "Name", + "noLogo": "No Logo", + "pageNumber": "Page Number", + "password": "Certificate Password", + "passwordOptional": "Leave empty if no password", + "reason": "Reason", + "serverCertMessage": "Using server certificate - no files or password required", + "showLogo": "Show Logo" }, "removeCertSign": { "tags": "authenticate,PEM,P12,official,decrypt", "title": "č¨ŧ明書įŊ˛åãŽå‰Šé™¤", "header": "PDFからé›ģ子č¨ŧ明書を削除する", "selectPDF": "PDFãƒ•ã‚Ąã‚¤ãƒĢぎ選択:", - "submit": "įŊ˛åãŽå‰Šé™¤" + "submit": "įŊ˛åãŽå‰Šé™¤", + "description": "This tool will remove digital certificate signatures from your PDF document.", + "filenamePrefix": "unsigned", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst removing certificate signatures." + }, + "results": { + "title": "Certificate Removal Results" + } }, "pageLayout": { "tags": "merge,composite,single-view,organize", @@ -1525,7 +2351,17 @@ "header": "マãƒĢチペãƒŧジãƒŦイã‚ĸã‚Ļト", "pagesPerSheet": "1枚あたりぎペãƒŧジ数:", "addBorder": "åĸƒį•Œįˇšã‚’čŋŊ加", - "submit": "送äŋĄ" + "submit": "送äŋĄ", + "desc": { + "2": "Place 2 pages side-by-side on a single sheet.", + "3": "Place 3 pages on a single sheet in a single row.", + "4": "Place 4 pages on a single sheet (2 × 2 grid).", + "9": "Place 9 pages on a single sheet (3 × 3 grid).", + "16": "Place 16 pages on a single sheet (4 × 4 grid)." + }, + "error": { + "failed": "An error occurred while creating the multi-page layout." + } }, "bookletImposition": { "tags": "小冊子,éĸäģ˜ã‘,å°åˆˇ,čŖŊæœŦ,折り,折丁", @@ -1711,10 +2547,22 @@ "reset": "PDF 全äŊ“ãĢãƒĒã‚ģット", "coordinates": { "title": "äŊįŊŽã¨ã‚ĩイã‚ē", - "x": "X äŊįŊŽ", - "y": "Y äŊįŊŽ", - "width": "åš…", - "height": "éĢ˜ã•" + "x": { + "label": "X Position", + "desc": "Left edge (points)" + }, + "y": { + "label": "Y Position", + "desc": "Bottom edge (points)" + }, + "width": { + "label": "Width", + "desc": "Crop width (points)" + }, + "height": { + "label": "Height", + "desc": "Crop height (points)" + } }, "error": { "invalidArea": "åˆ‡ã‚ŠæŠœãį¯„å›˛ãŒ PDF ぎåĸƒį•Œã‚’čļ…えãĻいぞす", @@ -1732,6 +2580,10 @@ }, "results": { "title": "切り抜きįĩæžœ" + }, + "automation": { + "info": "Enter crop coordinates in PDF points. Origin (0,0) is at bottom-left. These values will be applied to all PDFs processed in this automation.", + "reference": "Reference: A4 page is 595.28 × 841.89 points (210mm × 297mm). 1 inch = 72 points." } }, "autoSplitPDF": { @@ -1819,20 +2671,118 @@ "tags": "Redact,Hide,black out,black,marker,hidden,manual", "title": "手動åĸ¨æļˆã—", "submit": "ᎍ集", + "error": { + "failed": "An error occurred while redacting the PDF." + }, + "modeSelector": { + "title": "Redaction Method", + "mode": "Mode", + "automatic": "Automatic", + "automaticDesc": "Redact text based on search terms", + "manual": "Manual", + "manualDesc": "Click and drag to redact specific areas", + "manualComingSoon": "Manual redaction coming soon" + }, "auto": { + "header": "Auto Redact", "settings": { + "title": "Redaction Settings", "advancedTitle": "ã‚ĸãƒ‰ãƒãƒŗã‚šãƒ‰" }, + "colorLabel": "Box Colour", "wordsToRedact": { - "add": "čŋŊ加" + "title": "Words to Redact", + "placeholder": "Enter a word", + "add": "čŋŊ加", + "examples": "Examples: Confidential, Top-Secret" + }, + "useRegexLabel": "Use Regex", + "wholeWordSearchLabel": "Whole Word Search", + "customPaddingLabel": "Custom Extra Padding", + "convertPDFToImageLabel": "Convert PDF to PDF-Image" + }, + "tooltip": { + "mode": { + "header": { + "title": "Redaction Method" + }, + "automatic": { + "title": "Automatic Redaction", + "text": "Automatically finds and redacts specified text throughout the document. Perfect for removing consistent sensitive information like names, addresses, or confidential markers." + }, + "manual": { + "title": "Manual Redaction", + "text": "Click and drag to manually select specific areas to redact. Gives you precise control over what gets redacted. (Coming soon)" + } + }, + "words": { + "header": { + "title": "Words to Redact" + }, + "description": { + "title": "Text Matching", + "text": "Enter words or phrases to find and redact in your document. Each word will be searched for separately." + }, + "bullet1": "Add one word at a time", + "bullet2": "Press Enter or click 'Add Another' to add", + "bullet3": "Click × to remove words", + "examples": { + "title": "Common Examples", + "text": "Typical words to redact include: bank details, email addresses, or specific names." + } + }, + "advanced": { + "header": { + "title": "Advanced Redaction Settings" + }, + "color": { + "title": "Box Colour & Padding", + "text": "Customise the appearance of redaction boxes. Black is standard, but you can choose any colour. Padding adds extra space around the found text." + }, + "regex": { + "title": "Use Regex", + "text": "Enable regular expressions for advanced pattern matching. Useful for finding phone numbers, emails, or complex patterns.", + "bullet1": "Example: \\d{4}-\\d{2}-\\d{2} to match any dates in YYYY-MM-DD format", + "bullet2": "Use with caution - test thoroughly" + }, + "wholeWord": { + "title": "Whole Word Search", + "text": "Only match complete words, not partial matches. 'John' won't match 'Johnson' when enabled." + }, + "convert": { + "title": "Convert to PDF-Image", + "text": "Converts the PDF to an image-based PDF after redaction. This ensures text behind redaction boxes is completely removed and unrecoverable." + } } }, "manual": { + "header": "Manual Redaction", + "textBasedRedaction": "Text-based Redaction", + "pageBasedRedaction": "Page-based Redaction", + "convertPDFToImageLabel": "Convert PDF to PDF-Image (Used to remove text behind the box)", "pageRedactionNumbers": { "title": "ペãƒŧジ", "placeholder": "(例:1,2,8、4,7,12-16、2n-1)" }, - "export": "エク゚ポãƒŧト" + "redactionColor": { + "title": "Redaction Colour" + }, + "export": "エク゚ポãƒŧト", + "upload": "Upload", + "boxRedaction": "Box draw redaction", + "zoom": "Zoom", + "zoomIn": "Zoom in", + "zoomOut": "Zoom out", + "nextPage": "Next Page", + "previousPage": "Previous Page", + "toggleSidebar": "Toggle Sidebar", + "showThumbnails": "Show Thumbnails", + "showDocumentOutline": "Show Document Outline (double-click to expand/collapse all items)", + "showAttachments": "Show Attachments", + "showLayers": "Show Layers (double-click to reset all layers to the default state)", + "colourPicker": "Colour Picker", + "findCurrentOutlineItem": "Find current outline item", + "applyChanges": "Apply Changes" } }, "tableExtraxt": { @@ -1844,11 +2794,15 @@ "overlay-pdfs": { "tags": "Overlay", "header": "PDFぎã‚ĒãƒŧバãƒŧãƒŦイ", + "title": "Overlay PDFs", + "desc": "Overlay one PDF on top of another", "baseFile": { "label": "ベãƒŧ゚ぎPDFを選択" }, "overlayFiles": { - "label": "重ねるPDFを選択" + "label": "重ねるPDFを選択", + "placeholder": "Choose PDF(s)...", + "addMore": "Add more PDFs..." }, "mode": { "label": "ã‚ĒãƒŧバãƒŧãƒŦイãƒĸãƒŧドぎ選択", @@ -1858,14 +2812,53 @@ }, "counts": { "label": "ã‚ĒãƒŧバãƒŧãƒŦイ回数 (å›ē厚ãƒĒピãƒŧトãƒĸãƒŧãƒ‰į”¨)", - "placeholder": "ã‚ĢãƒŗãƒžåŒē切りでã‚Ģã‚Ļãƒŗãƒˆã‚’å…Ĩ力 (例:2,3,1)" + "placeholder": "ã‚ĢãƒŗãƒžåŒē切りでã‚Ģã‚Ļãƒŗãƒˆã‚’å…Ĩ力 (例:2,3,1)", + "item": "Count for file", + "noFiles": "Add overlay files to configure counts" }, "position": { "label": "重ねäŊįŊŽãŽé¸æŠž", "foreground": "前éĸ", "background": "背éĸ" }, - "submit": "重ねる" + "submit": "重ねる", + "settings": { + "title": "Settings" + }, + "results": { + "title": "Overlay Results" + }, + "tooltip": { + "header": { + "title": "Overlay PDFs Overview" + }, + "description": { + "title": "Description", + "text": "Combine a base PDF with one or more overlay PDFs. Overlays can be applied page-by-page in different modes and placed in the foreground or background." + }, + "mode": { + "title": "Overlay Mode", + "text": "Choose how to distribute overlay pages across the base PDF pages.", + "sequential": "Sequential Overlay: Use pages from the first overlay PDF until it ends, then move to the next.", + "interleaved": "Interleaved Overlay: Take one page from each overlay in turn.", + "fixedRepeat": "Fixed Repeat Overlay: Take a set number of pages from each overlay before moving to the next. Use Counts to set the numbers." + }, + "position": { + "title": "Overlay Position", + "text": "Foreground places the overlay on top of the page. Background places it behind." + }, + "overlayFiles": { + "title": "Overlay Files", + "text": "Select one or more PDFs to overlay on the base. The order of these files affects how pages are applied in Sequential and Fixed Repeat modes." + }, + "counts": { + "title": "Counts (Fixed Repeat only)", + "text": "Provide a positive number for each overlay file showing how many pages to take before moving to the next. Required when mode is Fixed Repeat." + } + }, + "error": { + "failed": "An error occurred while overlaying PDFs." + } }, "split-by-sections": { "tags": "Section Split, Divide, Customize,Customise", @@ -1900,7 +2893,18 @@ "customMargin": "äŊ™į™Ŋぎã‚Ģ゚ã‚ŋム", "customColor": "æ–‡å­—č‰˛ãŽã‚Ģ゚ã‚ŋム", "submit": "送äŋĄ", - "noStampSelected": "゚ã‚ŋãƒŗãƒ—ãŒé¸æŠžã•ã‚ŒãĻいぞせん。゚テップ1ãĢæˆģãŖãĻください。" + "noStampSelected": "゚ã‚ŋãƒŗãƒ—ãŒé¸æŠžã•ã‚ŒãĻいぞせん。゚テップ1ãĢæˆģãŖãĻください。", + "customPosition": "Drag the stamp to the desired location in the preview window.", + "error": { + "failed": "An error occurred while adding stamp to the PDF." + }, + "imageSize": "Image Size", + "margin": "Margin", + "positionAndFormatting": "Position & Formatting", + "quickPosition": "Select a position on the page to place the stamp.", + "results": { + "title": "Stamp Results" + } }, "removeImagePdf": { "tags": "Remove Image,Page operations,Back end,server side" @@ -1918,7 +2922,8 @@ "status": { "_value": "įŠļ態", "valid": "有劚", - "invalid": "į„ĄåŠš" + "invalid": "į„ĄåŠš", + "complete": "Validation complete" }, "signer": "įŊ˛åč€…", "date": "æ—Ĩäģ˜", @@ -1945,14 +2950,115 @@ "version": "バãƒŧã‚¸ãƒ§ãƒŗ", "keyUsage": "キãƒŧぎäŊŋį”¨æŗ•", "selfSigned": "č‡ĒåˇąįŊ˛å", - "bits": "ビット" + "bits": "ビット", + "details": "Certificate Details" }, "signature": { "info": "įŊ˛åæƒ…å ą", "_value": "įŊ˛å", "mathValid": "įŊ˛åã¯æ•°å­Ļįš„ãĢは有劚ですが:" }, - "selectCustomCert": "ã‚Ģ゚ã‚ŋムč¨ŧæ˜Žæ›¸ãƒ•ã‚Ąã‚¤ãƒĢ X.509 (ã‚Ēãƒ—ã‚ˇãƒ§ãƒŗ)" + "selectCustomCert": "ã‚Ģ゚ã‚ŋムč¨ŧæ˜Žæ›¸ãƒ•ã‚Ąã‚¤ãƒĢ X.509 (ã‚Ēãƒ—ã‚ˇãƒ§ãƒŗ)", + "downloadCsv": "Download CSV", + "downloadJson": "Download JSON", + "downloadPdf": "Download PDF Report", + "downloadType": { + "csv": "CSV", + "json": "JSON", + "pdf": "PDF" + }, + "error": { + "allFailed": "Unable to validate the selected files.", + "partial": "Some files could not be validated.", + "reportGeneration": "Could not generate the PDF report. JSON and CSV are available.", + "unexpected": "Unexpected error during validation." + }, + "finalizing": "Preparing downloads...", + "issue": { + "certExpired": "Certificate expired", + "certRevocationUnknown": "Certificate revocation status unknown", + "certRevoked": "Certificate revoked", + "chainInvalid": "Certificate chain invalid", + "signatureInvalid": "Signature cryptographic check failed", + "trustInvalid": "Certificate not trusted" + }, + "noResults": "Run the validation to generate a report.", + "noSignaturesShort": "No signatures", + "processing": "Validating signatures...", + "report": { + "continued": "Continued", + "downloads": "Downloads", + "entryLabel": "Signature Summary", + "fields": { + "created": "Created", + "fileSize": "File Size", + "signatureCount": "Total Signatures", + "signatureDate": "Signature Date" + }, + "filesEvaluated": "{{count}} files evaluated", + "footer": "Validated via Stirling PDF", + "generatedAt": "Generated", + "noPdf": "PDF report will be available after a successful validation.", + "page": "Page", + "shortTitle": "Signature Summary", + "signatureCountLabel": "{{count}} signatures", + "signaturesFound": "{{count}} signatures detected", + "signaturesValid": "{{count}} fully valid", + "title": "Signature Validation Report" + }, + "settings": { + "certHint": "Upload a trusted X.509 certificate to validate against a custom trust source.", + "title": "Validation Settings" + }, + "signatureDate": "Signature Date", + "totalSignatures": "Total Signatures" + }, + "replaceColor": { + "tags": "Replace Colour,Page operations,Back end,server side", + "labels": { + "settings": "Settings", + "colourOperation": "Colour operation" + }, + "options": { + "highContrast": "High contrast", + "invertAll": "Invert all colours", + "custom": "Custom", + "cmyk": "Convert to CMYK" + }, + "tooltip": { + "header": { + "title": "Replace & Invert Colour Settings Overview" + }, + "description": { + "title": "Description", + "text": "Transform PDF colours to improve readability and accessibility. Choose from high contrast presets, invert all colours, or create custom colour schemes." + }, + "highContrast": { + "title": "High Contrast", + "text": "Apply predefined high contrast colour combinations designed for better readability and accessibility compliance.", + "bullet1": "White text on black background - Classic dark mode", + "bullet2": "Black text on white background - Standard high contrast", + "bullet3": "Yellow text on black background - High visibility option", + "bullet4": "Green text on black background - Alternative high contrast" + }, + "invertAll": { + "title": "Invert All Colours", + "text": "Completely invert all colours in the PDF, creating a negative-like effect. Useful for creating dark mode versions of documents or reducing eye strain in low-light conditions." + }, + "custom": { + "title": "Custom Colours", + "text": "Define your own text and background colours using the colour pickers. Perfect for creating branded documents or specific accessibility requirements.", + "bullet1": "Text colour - Choose the colour for text elements", + "bullet2": "Background colour - Set the background colour for the document" + }, + "cmyk": { + "title": "Convert to CMYK", + "text": "Convert the PDF from RGB colour space to CMYK colour space, optimized for professional printing. This process converts colours to the Cyan, Magenta, Yellow, Black model used by printers." + } + }, + "error": { + "failed": "An error occurred while processing the colour replacement." + } }, "login": { "title": "ã‚ĩã‚¤ãƒŗã‚¤ãƒŗ", @@ -1985,6 +3091,11 @@ "enterEmail": "ãƒĄãƒŧãƒĢã‚ĸドãƒŦ゚をå…Ĩ力", "enterPassword": "パ゚ワãƒŧドをå…Ĩ力", "loggingIn": "ã‚ĩã‚¤ãƒŗã‚¤ãƒŗä¸­...", + "username": "Username", + "enterUsername": "Enter username", + "useEmailInstead": "Login with email", + "forgotPassword": "Forgot your password?", + "logIn": "Log In", "signingIn": "ã‚ĩã‚¤ãƒŗã‚¤ãƒŗä¸­...", "login": "ãƒ­ã‚°ã‚¤ãƒŗ", "or": "ぞたは", @@ -2002,12 +3113,54 @@ "magicLinkSent": "マジックãƒĒãƒŗã‚¯ã‚’ {{email}} ãĢ送äŋĄã—ぞしたīŧ ãƒĄãƒŧãƒĢをįĸēčĒã—ãĻãƒĒãƒŗã‚¯ã‚’ã‚¯ãƒĒックし、ã‚ĩã‚¤ãƒŗã‚¤ãƒŗã—ãĻください。", "passwordResetSent": "パ゚ワãƒŧãƒ‰å†č¨­åŽšãƒĒãƒŗã‚¯ã‚’ {{email}} ãĢ送äŋĄã—ぞしたīŧ ãƒĄãƒŧãƒĢぎ指į¤ēãĢåž“ãŖãĻください。", "failedToSignIn": "{{provider}} でぎã‚ĩã‚¤ãƒŗã‚¤ãƒŗãĢå¤ąæ•—ã—ãžã—ãŸīŧš{{message}}", - "unexpectedError": "ä爿œŸã—ãĒいエナãƒŧīŧš{{message}}" + "unexpectedError": "ä爿œŸã—ãĒいエナãƒŧīŧš{{message}}", + "accountCreatedSuccess": "Account created successfully! You can now sign in.", + "passwordChangedSuccess": "Password changed successfully! Please sign in with your new password.", + "credentialsUpdated": "Your credentials have been updated. Please sign in again." + }, + "signup": { + "title": "Create an account", + "subtitle": "Join Stirling PDF to get started", + "name": "Name", + "email": "Email", + "password": "Password", + "confirmPassword": "Confirm password", + "enterName": "Enter your name", + "enterEmail": "Enter your email", + "enterPassword": "Enter your password", + "confirmPasswordPlaceholder": "Confirm password", + "or": "or", + "creatingAccount": "Creating Account...", + "signUp": "Sign Up", + "alreadyHaveAccount": "Already have an account? Sign in", + "pleaseFillAllFields": "Please fill in all fields", + "passwordsDoNotMatch": "Passwords do not match", + "passwordTooShort": "Password must be at least 6 characters long", + "invalidEmail": "Please enter a valid email address", + "checkEmailConfirmation": "Check your email for a confirmation link to complete your registration.", + "accountCreatedSuccessfully": "Account created successfully! You can now sign in.", + "unexpectedError": "Unexpected error: {{message}}", + "useEmailInstead": "Use Email Instead", + "nameRequired": "Name is required", + "emailRequired": "Email is required", + "passwordRequired": "Password is required", + "confirmPasswordRequired": "Please confirm your password" }, "pdfToSinglePage": { "title": "PDFを単一ペãƒŧジãĢ変換", "header": "PDFを単一ペãƒŧジãĢ変換", - "submit": "単一ペãƒŧジãĢ変換" + "submit": "単一ペãƒŧジãĢ変換", + "description": "This tool will merge all pages of your PDF into one large single page. The width will remain the same as the original pages, but the height will be the sum of all page heights.", + "filenamePrefix": "single_page", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst converting to single page." + }, + "results": { + "title": "Single Page Results" + } }, "pageExtracter": { "title": "ペãƒŧジぎæŠŊå‡ē", @@ -2031,10 +3184,23 @@ "adjustContrast": { "title": "ã‚ŗãƒŗãƒˆãƒŠã‚šãƒˆãŽčĒŋ整", "header": "ã‚ŗãƒŗãƒˆãƒŠã‚šãƒˆãŽčĒŋ整", + "basic": "Basic Adjustments", "contrast": "ã‚ŗãƒŗãƒˆãƒŠã‚šãƒˆ:", "brightness": "明åēĻ:", "saturation": "åŊŠåēĻ:", - "download": "ダã‚Ļãƒŗãƒ­ãƒŧド" + "download": "ダã‚Ļãƒŗãƒ­ãƒŧド", + "adjustColors": "Adjust Colors", + "blue": "Blue", + "confirm": "Confirm", + "error": { + "failed": "Failed to adjust colors/contrast" + }, + "green": "Green", + "noPreview": "Select a PDF to preview", + "red": "Red", + "results": { + "title": "Adjusted PDF" + } }, "compress": { "title": "åœ§į¸Ž", @@ -2181,7 +3347,13 @@ "title": "į”ģ像ぎ削除", "header": "į”ģ像ぎ削除", "removeImage": "į”ģ像ぎ削除", - "submit": "į”ģ像を削除" + "submit": "į”ģ像を削除", + "error": { + "failed": "Failed to remove images from the PDF." + }, + "results": { + "title": "Remove Images Results" + } }, "splitByChapters": { "title": "PDFã‚’ãƒãƒŖãƒ—ã‚ŋãƒŧごとãĢåˆ†å‰˛", @@ -2215,6 +3387,12 @@ }, "note": "ãƒĒãƒĒãƒŧ゚ノãƒŧãƒˆã¯č‹ąčĒžã§ãŽãŋで提䞛されãĻいぞす" }, + "swagger": { + "title": "API Documentation", + "header": "API Documentation", + "desc": "View and test the Stirling PDF API endpoints", + "tags": "api,documentation,swagger,endpoints,development" + }, "cookieBanner": { "popUp": { "title": "クッキãƒŧぎäŊŋį”¨æ–šæŗ•", @@ -2250,8 +3428,26 @@ "title": "分析", "description": "これらぎCookieはツãƒŧãƒĢがおぎようãĢäŊŋį”¨ã•ã‚ŒãĻã„ã‚‹ã‹ã‚’æŠŠæĄã™ã‚‹ãŽãĢåŊšįĢ‹ãĄãžã™ã€‚ã“ã‚ŒãĢã‚ˆã‚Šã‚ŗãƒŸãƒĨãƒ‹ãƒ†ã‚ŖãŒæœ€ã‚‚é‡čĻ–ã™ã‚‹æŠŸčƒŊぎ開į™ēãĢ集中することができぞす。ご厉åŋƒãã ã•い。Stirling PDFはおåŽĸ様が操äŊœã™ã‚‹ãƒ‰ã‚­ãƒĨãƒĄãƒŗãƒˆãŽå†…åŽšã‚’čŋŊčˇĄã™ã‚‹ã“ã¨ã¯æąēしãĻありぞせん。" } + }, + "services": { + "posthog": "PostHog Analytics", + "scarf": "Scarf Pixel" } }, + "removeMetadata": { + "submit": "Remove Metadata" + }, + "sidebar": { + "toggle": "Toggle Sidebar" + }, + "theme": { + "toggle": "Toggle Theme" + }, + "view": { + "viewer": "Viewer", + "pageEditor": "Page Editor", + "fileManager": "File Manager" + }, "pageEditor": { "title": "ペãƒŧã‚¸ã‚¨ãƒ‡ã‚Ŗã‚ŋ", "save": "変更をäŋå­˜", @@ -2271,9 +3467,44 @@ "fitToWidth": "åš…ãĢ合わせる", "actualSize": "原寸" }, + "viewer": { + "firstPage": "First Page", + "lastPage": "Last Page", + "previousPage": "Previous Page", + "nextPage": "Next Page", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "singlePageView": "Single Page View", + "dualPageView": "Dual Page View" + }, "rightRail": { + "closeSelected": "Close Selected Files", "selectAll": "すずãĻ選択", - "deselectAll": "é¸æŠžã‚’č§Ŗé™¤" + "deselectAll": "é¸æŠžã‚’č§Ŗé™¤", + "selectByNumber": "Select by Page Numbers", + "deleteSelected": "Delete Selected Pages", + "closePdf": "Close PDF", + "exportAll": "Export PDF", + "downloadSelected": "Download Selected Files", + "downloadAll": "Download All", + "toggleTheme": "Toggle Theme", + "language": "Language", + "search": "Search PDF", + "panMode": "Pan Mode", + "rotateLeft": "Rotate Left", + "rotateRight": "Rotate Right", + "toggleSidebar": "Toggle Sidebar", + "exportSelected": "Export Selected Pages", + "toggleAnnotations": "Toggle Annotations Visibility", + "annotationMode": "Toggle Annotation Mode", + "draw": "Draw", + "save": "Save" + }, + "search": { + "title": "Search PDF", + "placeholder": "Enter search term...", + "noResults": "No results found", + "searching": "Searching..." }, "guestBanner": { "title": "ã‚˛ã‚šãƒˆã¨ã—ãĻ Stirling PDF ã‚’åˆŠį”¨ä¸­ã§ã™īŧ", @@ -2281,8 +3512,626 @@ "dismiss": "バナãƒŧを閉じる", "signUp": "į„Ąæ–™ã§į™ģ錞" }, + "toolPicker": { + "searchPlaceholder": "Search tools...", + "noToolsFound": "No tools found", + "allTools": "ALL TOOLS", + "quickAccess": "QUICK ACCESS", + "categories": { + "standardTools": "Standard Tools", + "advancedTools": "Advanced Tools", + "recommendedTools": "Recommended Tools" + }, + "subcategories": { + "signing": "Signing", + "documentSecurity": "Document Security", + "verification": "Verification", + "documentReview": "Document Review", + "pageFormatting": "Page Formatting", + "extraction": "Extraction", + "removal": "Removal", + "automation": "Automation", + "general": "General", + "advancedFormatting": "Advanced Formatting", + "developerTools": "Developer Tools" + } + }, "quickAccess": { - "sign": "įŊ˛å" + "read": "Read", + "sign": "įŊ˛å", + "automate": "Automate", + "files": "Files", + "activity": "Activity", + "help": "Help", + "account": "Account", + "config": "Config", + "adminSettings": "Admin Settings", + "allTools": "All Tools" + }, + "admin": { + "error": "Error", + "success": "Success", + "expand": "Expand", + "close": "Close", + "status": { + "active": "Active", + "inactive": "Inactive" + }, + "settings": { + "title": "Admin Settings", + "workspace": "Workspace", + "fetchError": "Failed to load settings", + "saveError": "Failed to save settings", + "saved": "Settings saved successfully", + "saveSuccess": "Settings saved successfully", + "save": "Save Changes", + "restartRequired": "Restart Required", + "restart": { + "title": "Restart Required", + "message": "Settings have been saved successfully. A server restart is required for the changes to take effect.", + "question": "Would you like to restart the server now or later?", + "now": "Restart Now", + "later": "Restart Later" + }, + "restarting": "Restarting Server", + "restartingMessage": "The server is restarting. Please wait a moment...", + "restartError": "Failed to restart server. Please restart manually.", + "general": { + "title": "System Settings", + "description": "Configure system-wide application settings including branding and default behaviour.", + "ui": "User Interface", + "system": "System", + "appName": { + "label": "Application Name", + "description": "The name displayed in the browser tab and home page" + }, + "appNameNavbar": { + "label": "Navbar Brand", + "description": "The name displayed in the navigation bar" + }, + "homeDescription": { + "label": "Home Description", + "description": "The description text shown on the home page" + }, + "defaultLocale": { + "label": "Default Locale", + "description": "The default language for new users (e.g., en_US, es_ES)" + }, + "fileUploadLimit": { + "label": "File Upload Limit", + "description": "Maximum file upload size (e.g., 100MB, 1GB)" + }, + "showUpdate": { + "label": "Show Update Notifications", + "description": "Display notifications when a new version is available" + }, + "showUpdateOnlyAdmin": { + "label": "Show Updates to Admins Only", + "description": "Restrict update notifications to admin users only" + }, + "customHTMLFiles": { + "label": "Custom HTML Files", + "description": "Allow serving custom HTML files from the customFiles directory" + }, + "languages": { + "label": "Available Languages", + "description": "Languages that users can select from (leave empty to enable all languages)" + }, + "customMetadata": { + "label": "Custom Metadata", + "autoUpdate": { + "label": "Auto Update Metadata", + "description": "Automatically update PDF metadata on all processed documents" + }, + "author": { + "label": "Default Author", + "description": "Default author for PDF metadata (e.g., username)" + }, + "creator": { + "label": "Default Creator", + "description": "Default creator for PDF metadata" + }, + "producer": { + "label": "Default Producer", + "description": "Default producer for PDF metadata" + } + }, + "customPaths": { + "label": "Custom Paths", + "description": "Configure custom file system paths for pipeline processing and external tools", + "pipeline": { + "label": "Pipeline Directories", + "watchedFoldersDir": { + "label": "Watched Folders Directory", + "description": "Directory where pipeline monitors for incoming PDFs (leave empty for default: /pipeline/watchedFolders)" + }, + "finishedFoldersDir": { + "label": "Finished Folders Directory", + "description": "Directory where processed PDFs are outputted (leave empty for default: /pipeline/finishedFolders)" + } + }, + "operations": { + "label": "External Tool Paths", + "weasyprint": { + "label": "WeasyPrint Executable", + "description": "Path to WeasyPrint executable for HTML to PDF conversion (leave empty for default: /opt/venv/bin/weasyprint)" + }, + "unoconvert": { + "label": "Unoconvert Executable", + "description": "Path to LibreOffice unoconvert for document conversions (leave empty for default: /opt/venv/bin/unoconvert)" + } + } + } + }, + "security": { + "title": "Security", + "description": "Configure authentication, login behaviour, and security policies.", + "ssoNotice": { + "title": "Looking for SSO/SAML settings?", + "message": "OAuth2 and SAML2 authentication providers have been moved to the Connections menu for easier management." + }, + "authentication": "Authentication", + "enableLogin": { + "label": "Enable Login", + "description": "Require users to log in before accessing the application" + }, + "loginMethod": { + "label": "Login Method", + "description": "The authentication method to use for user login", + "all": "All Methods", + "normal": "Username/Password Only", + "oauth2": "OAuth2 Only", + "saml2": "SAML2 Only" + }, + "loginAttemptCount": { + "label": "Login Attempt Limit", + "description": "Maximum number of failed login attempts before account lockout" + }, + "loginResetTimeMinutes": { + "label": "Login Reset Time (minutes)", + "description": "Time before failed login attempts are reset" + }, + "csrfDisabled": { + "label": "Disable CSRF Protection", + "description": "Disable Cross-Site Request Forgery protection (not recommended)" + }, + "initialLogin": { + "label": "Initial Login", + "username": { + "label": "Initial Username", + "description": "The username for the initial admin account" + }, + "password": { + "label": "Initial Password", + "description": "The password for the initial admin account" + } + }, + "jwt": { + "label": "JWT Configuration", + "secureCookie": { + "label": "Secure Cookie", + "description": "Require HTTPS for JWT cookies (recommended for production)" + }, + "keyRetentionDays": { + "label": "Key Retention Days", + "description": "Number of days to retain old JWT keys for verification" + }, + "persistence": { + "label": "Enable Key Persistence", + "description": "Store JWT keys persistently to survive server restarts" + }, + "enableKeyRotation": { + "label": "Enable Key Rotation", + "description": "Automatically rotate JWT signing keys periodically" + }, + "enableKeyCleanup": { + "label": "Enable Key Cleanup", + "description": "Automatically remove expired JWT keys" + } + }, + "audit": { + "label": "Audit Logging", + "enabled": { + "label": "Enable Audit Logging", + "description": "Track user actions and system events for compliance and security monitoring" + }, + "level": { + "label": "Audit Level", + "description": "0=OFF, 1=BASIC, 2=STANDARD, 3=VERBOSE" + }, + "retentionDays": { + "label": "Audit Retention (days)", + "description": "Number of days to retain audit logs" + } + }, + "htmlUrlSecurity": { + "label": "HTML URL Security", + "description": "Configure URL access restrictions for HTML processing to prevent SSRF attacks", + "enabled": { + "label": "Enable URL Security", + "description": "Enable URL security restrictions for HTML to PDF conversions" + }, + "level": { + "label": "Security Level", + "description": "MAX: whitelist only, MEDIUM: block internal networks, OFF: no restrictions", + "max": "Maximum (Whitelist Only)", + "medium": "Medium (Block Internal)", + "off": "Off (No Restrictions)" + }, + "advanced": "Advanced Settings", + "allowedDomains": { + "label": "Allowed Domains (Whitelist)", + "description": "One domain per line (e.g., cdn.example.com). Only these domains allowed when level is MAX" + }, + "blockedDomains": { + "label": "Blocked Domains (Blacklist)", + "description": "One domain per line (e.g., malicious.com). Additional domains to block" + }, + "internalTlds": { + "label": "Internal TLDs", + "description": "One TLD per line (e.g., .local, .internal). Block domains with these TLD patterns" + }, + "networkBlocking": "Network Blocking", + "blockPrivateNetworks": { + "label": "Block Private Networks", + "description": "Block RFC 1918 private networks (10.x.x.x, 192.168.x.x, 172.16-31.x.x)" + }, + "blockLocalhost": { + "label": "Block Localhost", + "description": "Block localhost and loopback addresses (127.x.x.x, ::1)" + }, + "blockLinkLocal": { + "label": "Block Link-Local Addresses", + "description": "Block link-local addresses (169.254.x.x, fe80::/10)" + }, + "blockCloudMetadata": { + "label": "Block Cloud Metadata Endpoints", + "description": "Block cloud provider metadata endpoints (169.254.169.254)" + } + } + }, + "connections": { + "title": "Connections", + "description": "Configure external authentication providers like OAuth2 and SAML.", + "linkedServices": "Linked Services", + "unlinkedServices": "Unlinked Services", + "connect": "Connect", + "disconnect": "Disconnect", + "disconnected": "Provider disconnected successfully", + "disconnectError": "Failed to disconnect provider", + "ssoAutoLogin": { + "label": "SSO Auto Login", + "enable": "Enable SSO Auto Login", + "description": "Automatically redirect to SSO login when authentication is required" + }, + "oauth2": { + "label": "OAuth2", + "enabled": { + "label": "Enable OAuth2", + "description": "Allow users to authenticate using OAuth2 providers" + }, + "provider": { + "label": "Provider", + "description": "The OAuth2 provider to use for authentication" + }, + "issuer": { + "label": "Issuer URL", + "description": "The OAuth2 provider issuer URL" + }, + "clientId": { + "label": "Client ID", + "description": "The OAuth2 client ID from your provider" + }, + "clientSecret": { + "label": "Client Secret", + "description": "The OAuth2 client secret from your provider" + }, + "useAsUsername": { + "label": "Use as Username", + "description": "The OAuth2 claim to use as the username (e.g., email, sub)" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first OAuth2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via OAuth2" + }, + "scopes": { + "label": "OAuth2 Scopes", + "description": "Comma-separated list of OAuth2 scopes to request (e.g., openid, profile, email)" + } + }, + "saml2": { + "label": "SAML2", + "enabled": { + "label": "Enable SAML2", + "description": "Allow users to authenticate using SAML2 providers" + }, + "provider": { + "label": "Provider", + "description": "The SAML2 provider name" + }, + "registrationId": { + "label": "Registration ID", + "description": "The SAML2 registration identifier" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first SAML2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via SAML2" + } + } + }, + "database": { + "title": "Database", + "description": "Configure custom database connection settings for enterprise deployments.", + "configuration": "Database Configuration", + "enableCustom": { + "label": "Enable Custom Database", + "description": "Use your own custom database configuration instead of the default embedded database" + }, + "customUrl": { + "label": "Custom Database URL", + "description": "Full JDBC connection string (e.g., jdbc:postgresql://localhost:5432/postgres). If provided, individual connection settings below are not used." + }, + "type": { + "label": "Database Type", + "description": "Type of database (not used if custom URL is provided)" + }, + "hostName": { + "label": "Host Name", + "description": "Database server hostname (not used if custom URL is provided)" + }, + "port": { + "label": "Port", + "description": "Database server port (not used if custom URL is provided)" + }, + "name": { + "label": "Database Name", + "description": "Name of the database (not used if custom URL is provided)" + }, + "username": { + "label": "Username", + "description": "Database authentication username" + }, + "password": { + "label": "Password", + "description": "Database authentication password" + } + }, + "privacy": { + "title": "Privacy", + "description": "Configure privacy and data collection settings.", + "analytics": "Analytics & Tracking", + "enableAnalytics": { + "label": "Enable Analytics", + "description": "Collect anonymous usage analytics to help improve the application" + }, + "metricsEnabled": { + "label": "Enable Metrics", + "description": "Enable collection of performance and usage metrics. Provides API endpoint for admins to access metrics data" + }, + "searchEngine": "Search Engine Visibility", + "googleVisibility": { + "label": "Google Visibility", + "description": "Allow search engines to index this application" + } + }, + "advanced": { + "title": "Advanced", + "description": "Configure advanced features and experimental functionality.", + "features": "Feature Flags", + "processing": "Processing", + "endpoints": { + "label": "Endpoints", + "manage": "Manage API Endpoints", + "description": "Endpoint management is configured via YAML. See documentation for details on enabling/disabling specific endpoints." + }, + "enableAlphaFunctionality": { + "label": "Enable Alpha Features", + "description": "Enable experimental and alpha-stage features (may be unstable)" + }, + "enableUrlToPDF": { + "label": "Enable URL to PDF", + "description": "Allow conversion of web pages to PDF documents" + }, + "maxDPI": { + "label": "Maximum DPI", + "description": "Maximum DPI for image processing (0 = unlimited)" + }, + "tessdataDir": { + "label": "Tessdata Directory", + "description": "Path to the tessdata directory for OCR language files" + }, + "disableSanitize": { + "label": "Disable HTML Sanitization", + "description": "WARNING: Security risk - disabling HTML sanitization can lead to XSS vulnerabilities" + }, + "tempFileManagement": { + "label": "Temp File Management", + "description": "Configure temporary file storage and cleanup behavior", + "baseTmpDir": { + "label": "Base Temp Directory", + "description": "Base directory for temporary files (leave empty for default: java.io.tmpdir/stirling-pdf)" + }, + "libreofficeDir": { + "label": "LibreOffice Temp Directory", + "description": "Directory for LibreOffice temp files (leave empty for default: baseTmpDir/libreoffice)" + }, + "systemTempDir": { + "label": "System Temp Directory", + "description": "System temp directory to clean (only used if cleanupSystemTemp is enabled)" + }, + "prefix": { + "label": "Temp File Prefix", + "description": "Prefix for temp file names" + }, + "maxAgeHours": { + "label": "Max Age (hours)", + "description": "Maximum age in hours before temp files are cleaned up" + }, + "cleanupIntervalMinutes": { + "label": "Cleanup Interval (minutes)", + "description": "How often to run cleanup (in minutes)" + }, + "startupCleanup": { + "label": "Startup Cleanup", + "description": "Clean up old temp files on application startup" + }, + "cleanupSystemTemp": { + "label": "Cleanup System Temp", + "description": "Whether to clean broader system temp directory (use with caution)" + } + }, + "processExecutor": { + "label": "Process Executor Limits", + "description": "Configure session limits and timeouts for each process executor", + "sessionLimit": { + "label": "Session Limit", + "description": "Maximum concurrent instances" + }, + "timeout": { + "label": "Timeout (minutes)", + "description": "Maximum execution time" + }, + "libreOffice": "LibreOffice", + "pdfToHtml": "PDF to HTML", + "qpdf": "QPDF", + "tesseract": "Tesseract OCR", + "pythonOpenCv": "Python OpenCV", + "weasyPrint": "WeasyPrint", + "installApp": "Install App", + "calibre": "Calibre", + "ghostscript": "Ghostscript", + "ocrMyPdf": "OCRmyPDF" + } + }, + "mail": { + "title": "Mail Server", + "description": "Configure SMTP settings for sending email notifications.", + "smtp": "SMTP Configuration", + "enabled": { + "label": "Enable Mail", + "description": "Enable email notifications and SMTP functionality" + }, + "host": { + "label": "SMTP Host", + "description": "The hostname or IP address of your SMTP server" + }, + "port": { + "label": "SMTP Port", + "description": "The port number for SMTP connection (typically 25, 465, or 587)" + }, + "username": { + "label": "SMTP Username", + "description": "Username for SMTP authentication" + }, + "password": { + "label": "SMTP Password", + "description": "Password for SMTP authentication" + }, + "from": { + "label": "From Address", + "description": "The email address to use as the sender" + }, + "enableInvites": { + "label": "Enable Email Invites", + "description": "Allow admins to invite users via email with auto-generated passwords" + }, + "frontendUrl": { + "label": "Frontend URL", + "description": "Base URL for frontend (e.g. https://pdf.example.com). Used for generating invite links in emails. Leave empty to use backend URL." + } + }, + "legal": { + "title": "Legal Documents", + "description": "Configure links to legal documents and policies.", + "disclaimer": { + "title": "Legal Responsibility Warning", + "message": "By customizing these legal documents, you assume full responsibility for ensuring compliance with all applicable laws and regulations, including but not limited to GDPR and other EU data protection requirements. Only modify these settings if: (1) you are operating a personal/private instance, (2) you are outside EU jurisdiction and understand your local legal obligations, or (3) you have obtained proper legal counsel and accept sole responsibility for all user data and legal compliance. Stirling-PDF and its developers assume no liability for your legal obligations." + }, + "termsAndConditions": { + "label": "Terms and Conditions", + "description": "URL or filename to terms and conditions" + }, + "privacyPolicy": { + "label": "Privacy Policy", + "description": "URL or filename to privacy policy" + }, + "accessibilityStatement": { + "label": "Accessibility Statement", + "description": "URL or filename to accessibility statement" + }, + "cookiePolicy": { + "label": "Cookie Policy", + "description": "URL or filename to cookie policy" + }, + "impressum": { + "label": "Impressum", + "description": "URL or filename to impressum (required in some jurisdictions)" + } + }, + "premium": { + "title": "Premium & Enterprise", + "description": "Configure your premium or enterprise license key.", + "license": "License Configuration", + "key": { + "label": "License Key", + "description": "Enter your premium or enterprise license key" + }, + "enabled": { + "label": "Enable Premium Features", + "description": "Enable license key checks for pro/enterprise features" + }, + "movedFeatures": { + "title": "Premium Features Distributed", + "message": "Premium and Enterprise features are now organized in their respective sections:" + } + }, + "features": { + "title": "Features", + "description": "Configure optional features and functionality.", + "serverCertificate": { + "label": "Server Certificate", + "description": "Configure server-side certificate generation for \"Sign with Stirling-PDF\" functionality", + "enabled": { + "label": "Enable Server Certificate", + "description": "Enable server-side certificate for \"Sign with Stirling-PDF\" option" + }, + "organizationName": { + "label": "Organization Name", + "description": "Organization name for generated certificates" + }, + "validity": { + "label": "Certificate Validity (days)", + "description": "Number of days the certificate will be valid" + }, + "regenerateOnStartup": { + "label": "Regenerate on Startup", + "description": "Generate new certificate on each application startup" + } + } + }, + "endpoints": { + "title": "API Endpoints", + "description": "Control which API endpoints and endpoint groups are available.", + "management": "Endpoint Management", + "toRemove": { + "label": "Disabled Endpoints", + "description": "Select individual endpoints to disable" + }, + "groupsToRemove": { + "label": "Disabled Endpoint Groups", + "description": "Select endpoint groups to disable" + }, + "note": "Note: Disabling endpoints restricts API access but does not remove UI components. Restart required for changes to take effect." + } + } }, "fileUpload": { "selectFile": "ãƒ•ã‚Ąã‚¤ãƒĢを選択", @@ -2308,6 +4157,9 @@ "addFiles": "ãƒ•ã‚Ąã‚¤ãƒĢをčŋŊ加", "dragFilesInOrClick": "ãƒ•ã‚Ąã‚¤ãƒĢã‚’ãƒ‰ãƒŠãƒƒã‚°ã™ã‚‹ã‹ã€Œãƒ•ã‚Ąã‚¤ãƒĢをčŋŊ加」をクãƒĒックしãĻå‚į…§" }, + "fileEditor": { + "addFiles": "Add Files" + }, "fileManager": { "title": "PDF ãƒ•ã‚Ąã‚¤ãƒĢをã‚ĸップロãƒŧド", "subtitle": "ツãƒŧãƒĢé–“ã§į°Ąå˜ãĢã‚ĸクã‚ģã‚šã§ãã‚‹ã‚ˆã†ã€ãƒ•ã‚Ąã‚¤ãƒĢを゚トãƒŦãƒŧジãĢčŋŊ加", @@ -2336,6 +4188,7 @@ "lastModified": "最įĩ‚æ›´æ–°", "toolChain": "éŠį”¨ãƒ„ãƒŧãƒĢ", "restore": "垊元", + "unzip": "Unzip", "searchFiles": "ãƒ•ã‚Ąã‚¤ãƒĢを検į´ĸ...", "recent": "最čŋ‘äŊŋᔍ", "localFiles": "ロãƒŧã‚ĢãƒĢãƒ•ã‚Ąã‚¤ãƒĢ", @@ -2343,7 +4196,6 @@ "googleDriveShort": "ドナイブ", "myFiles": "ãƒžã‚¤ãƒ•ã‚Ąã‚¤ãƒĢ", "noRecentFiles": "最čŋ‘ãŽãƒ•ã‚Ąã‚¤ãƒĢはčĻ‹ã¤ã‹ã‚Šãžã›ã‚“ã§ã—ãŸ", - "dropFilesHint": "ここãĢドロップしãĻã‚ĸップロãƒŧド", "googleDriveNotAvailable": "Google ãƒ‰ãƒŠã‚¤ãƒ–é€Ŗæēã¯åˆŠį”¨ã§ããžã›ã‚“", "openFiles": "č¤‡æ•°ãƒ•ã‚Ąã‚¤ãƒĢを開く", "openFile": "ãƒ•ã‚Ąã‚¤ãƒĢを開く", @@ -2361,12 +4213,74 @@ "selectedCount": "{{count}} äģļ選択", "download": "ダã‚Ļãƒŗãƒ­ãƒŧド", "delete": "削除", - "unsupported": "æœĒ寞åŋœ" + "unsupported": "æœĒ寞åŋœ", + "addToUpload": "Add to Upload", + "deleteAll": "Delete All", + "loadingFiles": "Loading files...", + "noFiles": "No files available", + "noFilesFound": "No files found matching your search", + "openInPageEditor": "Open in Page Editor", + "showAll": "Show All", + "sortByDate": "Sort by Date", + "sortByName": "Sort by Name", + "sortBySize": "Sort by Size", + "dropFilesHint": "ここãĢドロップしãĻã‚ĸップロãƒŧド" + }, + "storage": { + "temporaryNotice": "Files are stored temporarily in your browser and may be cleared automatically", + "storageLimit": "Storage limit", + "storageUsed": "Temporary Storage used", + "storageFull": "Storage is nearly full. Consider removing some files.", + "fileTooLarge": "File too large. Maximum size per file is", + "storageQuotaExceeded": "Storage quota exceeded. Please remove some files before uploading more.", + "approximateSize": "Approximate size" }, "sanitize": { + "title": "Sanitise", + "desc": "Remove potentially harmful elements from PDF files.", "submit": "PDFをã‚ĩニã‚ŋイã‚ē", + "completed": "Sanitisation completed successfully", + "error": { + "generic": "Sanitisation failed", + "failed": "An error occurred while sanitising the PDF." + }, + "filenamePrefix": "sanitised", + "sanitizationResults": "Sanitisation Results", "steps": { - "settings": "č¨­åŽš" + "files": "Files", + "settings": "č¨­åŽš", + "results": "Results" + }, + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "options": { + "title": "Sanitisation Options", + "note": "Select the elements you want to remove from the PDF. At least one option must be selected.", + "removeJavaScript": { + "label": "Remove JavaScript", + "desc": "Remove JavaScript actions and scripts from the PDF" + }, + "removeEmbeddedFiles": { + "label": "Remove Embedded Files", + "desc": "Remove any files embedded within the PDF" + }, + "removeXMPMetadata": { + "label": "Remove XMP Metadata", + "desc": "Remove XMP metadata from the PDF" + }, + "removeMetadata": { + "label": "Remove Document Metadata", + "desc": "Remove document information metadata (title, author, etc.)" + }, + "removeLinks": { + "label": "Remove Links", + "desc": "Remove external links and launch actions from the PDF" + }, + "removeFonts": { + "label": "Remove Fonts", + "desc": "Remove embedded fonts from the PDF" + } } }, "addPassword": { @@ -2479,9 +4393,21 @@ "tags": "secure,Decrypt,security,unpassword,delete password", "password": { "stepTitle": "パ゚ワãƒŧドぎ削除", - "label": "įžåœ¨ãŽãƒ‘ã‚šãƒ¯ãƒŧド" + "label": "įžåœ¨ãŽãƒ‘ã‚šãƒ¯ãƒŧド", + "placeholder": "Enter current password", + "completed": "Password configured" }, - "submit": "削除" + "filenamePrefix": "decrypted", + "error": { + "failed": "An error occurred while removing the password from the PDF." + }, + "tooltip": { + "description": "Removing password protection requires the password that was used to encrypt the PDF. This will decrypt the document, making it accessible without a password." + }, + "submit": "削除", + "results": { + "title": "Decrypted PDFs" + } }, "automate": { "title": "č‡Ē動化", @@ -2575,9 +4501,14 @@ "remaining": "掋り", "used": "äŊŋį”¨æ¸ˆãŋ", "available": "åˆŠį”¨å¯čƒŊ", - "cancel": "ã‚­ãƒŖãƒŗã‚ģãƒĢ" + "cancel": "ã‚­ãƒŖãƒŗã‚ģãƒĢ", + "preview": "Preview" }, "config": { + "overview": { + "title": "Application Configuration", + "description": "Current application settings and configuration details." + }, "account": { "overview": { "title": "ã‚ĸã‚Ģã‚Ļãƒŗãƒˆč¨­åŽš", @@ -2633,7 +4564,570 @@ "submit": "æˇģäģ˜ã‚’čŋŊ加", "results": { "title": "æˇģäģ˜įĩæžœ" + }, + "error": { + "failed": "Add attachments operation failed" } }, - "logOut": "ログã‚ĸã‚Ļト" -} \ No newline at end of file + "termsAndConditions": "Terms & Conditions", + "logOut": "ログã‚ĸã‚Ļト", + "addAttachments": { + "error": { + "failed": "An error occurred while adding attachments to the PDF." + } + }, + "autoRename": { + "description": "This tool will automatically rename PDF files based on their content. It analyzes the document to find the most suitable title from the text." + }, + "customPosition": "Custom Position", + "details": "Details", + "downloadUnavailable": "Download unavailable for this item", + "invalidUndoData": "Cannot undo: invalid operation data", + "margin": { + "large": "Large", + "medium": "Medium", + "small": "Small", + "xLarge": "Extra Large" + }, + "noFilesToUndo": "Cannot undo: no files were processed in the last operation", + "noOperationToUndo": "No operation to undo", + "noValidFiles": "No valid files to process", + "operationCancelled": "Operation cancelled", + "pageEdit": { + "deselectAll": "Select None", + "selectAll": "Select All" + }, + "quickPosition": "Quick Position", + "reorganizePages": { + "error": { + "failed": "Failed to reorganize pages" + }, + "results": { + "title": "Pages Reorganized" + }, + "settings": { + "title": "Settings" + }, + "submit": "Reorganize Pages" + }, + "replace-color": { + "options": { + "fill": "Fill colour", + "gradient": "Gradient" + }, + "previewOverlayOpacity": "Preview overlay opacity", + "previewOverlayTransparency": "Preview overlay transparency", + "previewOverlayVisibility": "Show preview overlay", + "selectText": { + "1": "Replace or invert colour options", + "2": "Default (preset high contrast colours)", + "3": "Custom (choose your own colours)", + "4": "Full invert (invert all colours)", + "5": "High contrast color options", + "6": "White text on black background", + "7": "Black text on white background", + "8": "Yellow text on black background", + "9": "Green text on black background", + "10": "Choose text Color", + "11": "Choose background Color", + "12": "Choose start colour", + "13": "Choose end colour" + }, + "submit": "Replace", + "title": "Replace-Invert-Color" + }, + "size": "Size", + "submit": "Submit", + "success": "Success", + "tools": { + "noSearchResults": "No tools found", + "noTools": "No tools available" + }, + "undoDataMismatch": "Cannot undo: operation data is corrupted", + "undoFailed": "Failed to undo operation", + "undoQuotaError": "Cannot undo: insufficient storage space", + "undoStorageError": "Undo completed but some files could not be saved to storage", + "undoSuccess": "Operation undone successfully", + "unsupported": "Unsupported", + "onboarding": { + "welcomeModal": { + "title": "Welcome to Stirling PDF!", + "description": "Would you like to take a quick 1-minute tour to learn the key features and how to get started?", + "helpHint": "You can always access this tour later from the Help button in the bottom left.", + "startTour": "Start Tour", + "maybeLater": "Maybe Later", + "dontShowAgain": "Don't Show Again" + }, + "allTools": "This is the All Tools panel, where you can browse and select from all available PDF tools.", + "selectCropTool": "Let's select the Crop tool to demonstrate how to use one of the tools.", + "toolInterface": "This is the Crop tool interface. As you can see, there's not much there because we haven't added any PDF files to work with yet.", + "filesButton": "The Files button on the Quick Access bar allows you to upload PDFs to use the tools on.", + "fileSources": "You can upload new files or access recent files from here. For the tour, we'll just use a sample file.", + "workbench": "This is the Workbench - the main area where you view and edit your PDFs.", + "viewSwitcher": "Use these controls to select how you want to view your PDFs.", + "viewer": "The Viewer lets you read and annotate your PDFs.", + "pageEditor": "The Page Editor allows you to do various operations on the pages within your PDFs, such as reordering, rotating and deleting.", + "activeFiles": "The Active Files view shows all of the PDFs you have loaded into the tool, and allows you to select which ones to process.", + "fileCheckbox": "Clicking one of the files selects it for processing. You can select multiple files for batch operations.", + "selectControls": "The Right Rail contains buttons to quickly select/deselect all of your active PDFs, along with buttons to change the app's theme or language.", + "cropSettings": "Now that we've selected the file we want crop, we can configure the Crop tool to choose the area that we want to crop the PDF to.", + "runButton": "Once the tool has been configured, this button allows you to run the tool on all the selected PDFs.", + "results": "After the tool has finished running, the Review step will show a preview of the results in this panel, and allow you to undo the operation or download the file. ", + "fileReplacement": "The modified file will replace the original file in the Workbench automatically, allowing you to easily run it through more tools.", + "pinButton": "You can use the Pin button if you'd rather your files stay active after running tools on them.", + "wrapUp": "You're all set! You've learnt about the main areas of the app and how to use them. Click the Help button whenever you like to see this tour again.", + "previous": "Previous", + "next": "Next", + "finish": "Finish", + "startTour": "Start Tour", + "startTourDescription": "Take a guided tour of Stirling PDF's key features" + }, + "workspace": { + "title": "Workspace", + "people": { + "title": "People", + "description": "Manage workspace members and their permissions", + "loading": "Loading people...", + "searchMembers": "Search members...", + "addMembers": "Add Members", + "inviteMembers": { + "label": "Invite Members", + "subtitle": "Type or paste in emails below, separated by commas. Your workspace will be billed by members." + }, + "user": "User", + "role": "Role", + "team": "Team", + "status": "Status", + "actions": "Actions", + "noMembersFound": "No members found", + "active": "Active", + "disabled": "Disabled", + "activeSession": "Active session", + "member": "Member", + "admin": "Admin", + "roleDescriptions": { + "admin": "Can manage settings and invite members, with full administrative access.", + "member": "Can view and edit shared files, but cannot manage workspace settings or members." + }, + "editRole": "Edit Role", + "enable": "Enable", + "disable": "Disable", + "deleteUser": "Delete User", + "deleteUserSuccess": "User deleted successfully", + "deleteUserError": "Failed to delete user", + "confirmDelete": "Are you sure you want to delete this user? This action cannot be undone.", + "addMember": { + "title": "Add Member", + "username": "Username (Email)", + "usernamePlaceholder": "user@example.com", + "password": "Password", + "passwordPlaceholder": "Enter password", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "forcePasswordChange": "Force password change on first login", + "cancel": "Cancel", + "submit": "Add Member", + "usernameRequired": "Username and password are required", + "passwordTooShort": "Password must be at least 6 characters", + "success": "User created successfully", + "error": "Failed to create user" + }, + "editMember": { + "title": "Edit Member", + "editing": "Editing:", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "cancel": "Cancel", + "submit": "Update Member", + "success": "User updated successfully", + "error": "Failed to update user" + }, + "toggleEnabled": { + "success": "User status updated successfully", + "error": "Failed to update user status" + }, + "delete": { + "success": "User deleted successfully", + "error": "Failed to delete user" + }, + "emailInvite": { + "tab": "Email Invite", + "description": "Type or paste in emails below, separated by commas. Users will receive login credentials via email.", + "emails": "Email Addresses", + "emailsPlaceholder": "user1@example.com, user2@example.com", + "emailsRequired": "At least one email address is required", + "submit": "Send Invites", + "success": "user(s) invited successfully", + "partialSuccess": "Some invites failed", + "allFailed": "Failed to invite users", + "error": "Failed to send invites" + }, + "directInvite": { + "tab": "Direct Create" + }, + "inviteLinkTab": { + "tab": "Invite Link" + }, + "inviteLink": { + "description": "Generate a secure link that allows the user to set their own password", + "email": "Email Address", + "emailPlaceholder": "user@example.com (optional)", + "emailDescription": "Optional - leave blank for a general invite link that can be used by anyone", + "emailRequired": "Email address is required", + "emailOptional": "Optional - leave blank for a general invite link", + "emailRequiredForSend": "Email address is required to send email notification", + "expiryHours": "Expiry Hours", + "expiryDescription": "How many hours until the link expires", + "sendEmail": "Send invite link via email", + "sendEmailDescription": "If enabled, the invite link will be sent to the specified email address", + "smtpRequired": "SMTP not configured", + "generate": "Generate Link", + "generated": "Invite Link Generated", + "copied": "Link copied to clipboard", + "success": "Invite link generated successfully", + "successWithEmail": "Invite link generated and sent via email", + "emailFailed": "Invite link generated, but email failed", + "emailFailedDetails": "Error: {0}. Please share the invite link manually.", + "error": "Failed to generate invite link", + "submit": "Generate Invite Link" + }, + "inviteMode": { + "username": "Username", + "email": "Email", + "link": "Link", + "emailDisabled": "Email invites require SMTP configuration and mail.enableInvites=true in settings" + }, + "license": { + "users": "users", + "availableSlots": "Available Slots", + "grandfathered": "Grandfathered", + "grandfatheredShort": "{{count}} grandfathered", + "fromLicense": "from license", + "slotsAvailable": "{{count}} user slot(s) available", + "noSlotsAvailable": "No slots available", + "currentUsage": "Currently using {{current}} of {{max}} user licences" + } + }, + "teams": { + "title": "Teams", + "description": "Manage teams and organize workspace members", + "loading": "Loading teams...", + "loadingDetails": "Loading team details...", + "createNewTeam": "Create New Team", + "teamName": "Team Name", + "totalMembers": "Total Members", + "actions": "Actions", + "noTeamsFound": "No teams found", + "noMembers": "No members in this team", + "system": "System", + "addMember": "Add Member", + "viewTeam": "View Team", + "removeMember": "Remove from team", + "cannotRemoveFromSystemTeam": "Cannot remove from system team", + "renameTeamLabel": "Rename Team", + "deleteTeamLabel": "Delete Team", + "cannotDeleteInternal": "Cannot delete the Internal team", + "confirmDelete": "Are you sure you want to delete this team? This team must be empty to delete.", + "confirmRemove": "Remove user from this team?", + "cannotRenameInternal": "Cannot rename the Internal team", + "cannotAddToInternal": "Cannot add members to the Internal team", + "teamNotFound": "Team not found", + "backToTeams": "Back to Teams", + "memberCount": "{{count}} members", + "removeMemberSuccess": "User removed from team", + "removeMemberError": "Failed to remove user from team", + "createTeam": { + "title": "Create New Team", + "teamName": "Team Name", + "teamNamePlaceholder": "Enter team name", + "cancel": "Cancel", + "submit": "Create Team", + "nameRequired": "Team name is required", + "success": "Team created successfully", + "error": "Failed to create team" + }, + "renameTeam": { + "title": "Rename Team", + "renaming": "Renaming:", + "newTeamName": "New Team Name", + "newTeamNamePlaceholder": "Enter new team name", + "cancel": "Cancel", + "submit": "Rename Team", + "nameRequired": "Team name is required", + "success": "Team renamed successfully", + "error": "Failed to rename team" + }, + "deleteTeam": { + "success": "Team deleted successfully", + "error": "Failed to delete team. Make sure the team is empty.", + "teamMustBeEmpty": "Team must be empty before deletion" + }, + "addMemberToTeam": { + "title": "Add Member to Team", + "addingTo": "Adding to", + "selectUser": "Select User", + "selectUserPlaceholder": "Choose a user", + "selectUserRequired": "Please select a user", + "currentlyIn": "currently in", + "willBeMoved": "Note: This user will be moved from their current team to this team.", + "cancel": "Cancel", + "submit": "Add Member", + "userRequired": "Please select a user", + "success": "Member added to team successfully", + "error": "Failed to add member to team" + }, + "changeTeam": { + "label": "Change Team", + "title": "Change Team", + "changing": "Moving", + "selectTeam": "Select Team", + "selectTeamPlaceholder": "Choose a team", + "selectTeamRequired": "Please select a team", + "success": "Team changed successfully", + "error": "Failed to change team", + "submit": "Change Team" + } + } + }, + "plan": { + "currency": "Currency", + "popular": "Popular", + "current": "Current Plan", + "upgrade": "Upgrade", + "contact": "Contact Us", + "customPricing": "Custom", + "showComparison": "Compare All Features", + "hideComparison": "Hide Feature Comparison", + "featureComparison": "Feature Comparison", + "activePlan": { + "title": "Active Plan", + "subtitle": "Your current subscription details" + }, + "availablePlans": { + "title": "Available Plans", + "subtitle": "Choose the plan that fits your needs" + }, + "static": { + "title": "Billing Information", + "message": "Online billing is not currently configured. To upgrade your plan or manage subscriptions, please contact us directly.", + "contactSales": "Contact Sales", + "contactToUpgrade": "Contact us to upgrade or customize your plan", + "maxUsers": "Max Users", + "upTo": "Up to" + }, + "period": { + "month": "month" + }, + "free": { + "name": "Free", + "highlight1": "Limited Tool Usage Per week", + "highlight2": "Access to all tools", + "highlight3": "Community support" + }, + "pro": { + "name": "Pro", + "highlight1": "Unlimited Tool Usage", + "highlight2": "Advanced PDF tools", + "highlight3": "No watermarks" + }, + "enterprise": { + "name": "Enterprise", + "highlight1": "Custom pricing", + "highlight2": "Dedicated support", + "highlight3": "Latest features" + }, + "feature": { + "title": "Feature", + "pdfTools": "Basic PDF Tools", + "fileSize": "File Size Limit", + "automation": "Automate tool workflows", + "api": "API Access", + "priority": "Priority Support", + "customPricing": "Custom Pricing" + } + }, + "subscription": { + "status": { + "active": "Active", + "pastDue": "Past Due", + "canceled": "Canceled", + "incomplete": "Incomplete", + "trialing": "Trial", + "none": "No Subscription" + }, + "renewsOn": "Renews on {{date}}", + "cancelsOn": "Cancels on {{date}}" + }, + "billing": { + "manageBilling": "Manage Billing", + "portal": { + "error": "Failed to open billing portal" + } + }, + "payment": { + "preparing": "Preparing your checkout...", + "upgradeTitle": "Upgrade to {{planName}}", + "success": "Payment Successful!", + "successMessage": "Your subscription has been activated successfully. You will receive a confirmation email shortly.", + "autoClose": "This window will close automatically...", + "error": "Payment Error" + }, + "firstLogin": { + "title": "First Time Login", + "welcomeTitle": "Welcome!", + "welcomeMessage": "For security reasons, you must change your password on your first login.", + "loggedInAs": "Logged in as", + "error": "Error", + "currentPassword": "Current Password", + "enterCurrentPassword": "Enter your current password", + "newPassword": "New Password", + "enterNewPassword": "Enter new password (min 8 characters)", + "confirmPassword": "Confirm New Password", + "reEnterNewPassword": "Re-enter new password", + "changePassword": "Change Password", + "allFieldsRequired": "All fields are required", + "passwordsDoNotMatch": "New passwords do not match", + "passwordTooShort": "Password must be at least 8 characters", + "passwordMustBeDifferent": "New password must be different from current password", + "passwordChangedSuccess": "Password changed successfully! Please log in again.", + "passwordChangeFailed": "Failed to change password. Please check your current password." + }, + "invite": { + "welcome": "Welcome to Stirling PDF", + "invalidToken": "Invalid invitation link", + "validationError": "Failed to validate invitation link", + "passwordRequired": "Password is required", + "passwordTooShort": "Password must be at least 6 characters", + "passwordMismatch": "Passwords do not match", + "acceptError": "Failed to create account", + "validating": "Validating invitation...", + "invalidInvitation": "Invalid Invitation", + "goToLogin": "Go to Login", + "welcomeTitle": "You've been invited!", + "welcomeSubtitle": "Complete your account setup to get started", + "accountFor": "Creating account for", + "linkExpires": "Link expires", + "email": "Email address", + "emailPlaceholder": "Enter your email address", + "emailRequired": "Email address is required", + "invalidEmail": "Invalid email address", + "choosePassword": "Choose a password", + "passwordPlaceholder": "Enter your password", + "confirmPassword": "Confirm password", + "confirmPasswordPlaceholder": "Re-enter your password", + "createAccount": "Create Account", + "creating": "Creating Account...", + "alreadyHaveAccount": "Already have an account?", + "signIn": "Sign in" + }, + "audit": { + "error": { + "title": "Error loading audit system" + }, + "notAvailable": "Audit system not available", + "notAvailableMessage": "The audit system is not configured or not available.", + "disabled": "Audit logging is disabled", + "disabledMessage": "Enable audit logging in your application configuration to track system events.", + "systemStatus": { + "title": "System Status", + "status": "Audit Logging", + "enabled": "Enabled", + "disabled": "Disabled", + "level": "Audit Level", + "retention": "Retention Period", + "days": "days", + "totalEvents": "Total Events" + }, + "tabs": { + "dashboard": "Dashboard", + "events": "Audit Events", + "export": "Export" + }, + "charts": { + "title": "Audit Dashboard", + "error": "Error loading charts", + "day": "Day", + "week": "Week", + "month": "Month", + "byType": "Events by Type", + "byUser": "Events by User", + "overTime": "Events Over Time" + }, + "events": { + "title": "Audit Events", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "error": "Error loading events", + "noEvents": "No events found", + "timestamp": "Timestamp", + "type": "Type", + "user": "User", + "ipAddress": "IP Address", + "actions": "Actions", + "viewDetails": "View Details", + "eventDetails": "Event Details", + "details": "Details" + }, + "export": { + "title": "Export Audit Data", + "description": "Export audit events to CSV or JSON format. Use filters to limit the exported data.", + "format": "Export Format", + "filters": "Filters (Optional)", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "exportButton": "Export Data", + "error": "Failed to export data" + } + }, + "usage": { + "noData": "No data available", + "error": "Error loading usage statistics", + "noDataMessage": "No usage statistics are currently available.", + "controls": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All", + "refresh": "Refresh", + "dataTypeLabel": "Data Type:", + "dataType": { + "all": "All", + "api": "API", + "ui": "UI" + } + }, + "showing": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All" + }, + "stats": { + "totalEndpoints": "Total Endpoints", + "totalVisits": "Total Visits", + "showing": "Showing", + "selectedVisits": "Selected Visits" + }, + "chart": { + "title": "Endpoint Usage Chart" + }, + "table": { + "title": "Detailed Statistics", + "endpoint": "Endpoint", + "visits": "Visits", + "percentage": "Percentage", + "noData": "No data available" + } + }, + "backendHealth": { + "checking": "Checking backend status...", + "online": "Backend Online", + "offline": "Backend Offline" + } +} diff --git a/frontend/public/locales/ko-KR/translation.json b/frontend/public/locales/ko-KR/translation.json index b2acda78b..1e5f7ad36 100644 --- a/frontend/public/locales/ko-KR/translation.json +++ b/frontend/public/locales/ko-KR/translation.json @@ -1,4 +1,40 @@ { + "toolPanel": { + "modePrompt": { + "title": "Choose how you browse tools", + "description": "Preview both layouts and decide how you want to explore Stirling PDF tools.", + "sidebarTitle": "Sidebar mode", + "sidebarDescription": "Keep tools alongside your workspace for quick switching.", + "recommended": "Recommended", + "chooseSidebar": "Use sidebar mode", + "fullscreenTitle": "Fullscreen mode - (legacy)", + "fullscreenDescription": "Browse every tool in a catalogue that covers the workspace until you pick one.", + "chooseFullscreen": "Use fullscreen mode", + "dismiss": "Maybe later" + }, + "fullscreen": { + "showDetails": "Show Details", + "comingSoon": "Coming soon:", + "favorite": "Add to favourites", + "favorites": "Favourites", + "heading": "All tools (fullscreen view)", + "noResults": "Try adjusting your search or toggle descriptions to find what you need.", + "recommended": "Recommended", + "unfavorite": "Remove from favourites" + }, + "placeholder": "Choose a tool to get started", + "toggle": { + "fullscreen": "Switch to fullscreen mode", + "sidebar": "Switch to sidebar mode" + } + }, + "unsavedChanges": "You have unsaved changes to your PDF.", + "areYouSure": "Are you sure you want to leave?", + "unsavedChangesTitle": "Unsaved Changes", + "keepWorking": "Keep Working", + "discardChanges": "Discard & Leave", + "applyAndContinue": "Save & Leave", + "exportAndContinue": "Export & Continue", "language": { "direction": "ltr" }, @@ -18,8 +54,26 @@ "customTextDesc": "ė‚ŦėšŠėž 맀렕 í…ėŠ¤íŠ¸", "numberPagesDesc": "번호ëĨŧ 매길 íŽ˜ė´ė§€, ę¸°ëŗ¸ę°’ 'all', 1-5 또는 2,5,9 등도 가ëŠĨ", "customNumberDesc": "ę¸°ëŗ¸ę°’ė€ {n}, 'íŽ˜ė´ė§€ {n} / {total}', 'í…ėŠ¤íŠ¸-{n}', '{filename}-{n}' 등도 가ëŠĨ", - "submit": "íŽ˜ė´ė§€ 번호 ėļ”ę°€" + "submit": "íŽ˜ė´ė§€ 번호 ėļ”ę°€", + "configuration": "Configuration", + "customize": "Customize Appearance", + "pagesAndStarting": "Pages & Starting Number", + "positionAndPages": "Position & Pages", + "error": { + "failed": "Add page numbers operation failed" + }, + "results": { + "title": "Page Number Results" + }, + "preview": "Position Selection", + "previewDisclaimer": "Preview is approximate. Final output may vary due to PDF font metrics." }, + "pageSelectionPrompt": "ė‚ŦėšŠėž 맀렕 íŽ˜ė´ė§€ ė„ íƒ (íŽ˜ė´ė§€ 번호 1,5,6 또는 2n+1ęŗŧ ę°™ė€ í•¨ėˆ˜ëĨŧ ė‰ŧ표로 ęĩŦëļ„하ė—Ŧ ëĒŠëĄ ėž…ë Ĩ):", + "startingNumberTooltip": "The first number to display. Subsequent pages will increment from this number.", + "marginTooltip": "Distance between the page number and the edge of the page.", + "fontSizeTooltip": "Size of the page number text in points. Larger numbers create bigger text.", + "fontTypeTooltip": "Font family for the page numbers. Choose based on your document style.", + "customTextTooltip": "Optional custom format for page numbers. Use {n} as placeholder for the number. Example: \"Page {n}\" will show \"Page 1\", \"Page 2\", etc.", "pdfPrompt": "PDF ė„ íƒ", "multiPdfPrompt": "PDF ė„ íƒ (2氜 ė´ėƒ)", "multiPdfDropPrompt": "í•„ėš”í•œ ëĒ¨ë“  PDFëĨŧ ė„ íƒ(또는 ëŒė–´ë‹¤ 놓기)í•˜ė„¸ėš”", @@ -30,15 +84,41 @@ "uploadLimitExceededPlural": "are too large. Maximum allowed size is", "processTimeWarning": "ę˛Ŋęŗ : ė´ ęŗŧė •ė€ 파ėŧ íŦ揰뗐 따ëŧ ėĩœëŒ€ 1ëļ„ė´ ė†Œėš”ë  눘 ėžˆėŠĩ니다", "pageOrderPrompt": "ė‚ŦėšŠėž 맀렕 íŽ˜ė´ė§€ ėˆœė„œ (ė‰ŧ표로 ęĩŦëļ„된 íŽ˜ė´ė§€ 번호 ëĒŠëĄ 또는 2n+1ęŗŧ ę°™ė€ í•¨ėˆ˜ ėž…ë Ĩ):", - "pageSelectionPrompt": "ė‚ŦėšŠėž 맀렕 íŽ˜ė´ė§€ ė„ íƒ (íŽ˜ė´ė§€ 번호 1,5,6 또는 2n+1ęŗŧ ę°™ė€ í•¨ėˆ˜ëĨŧ ė‰ŧ표로 ęĩŦëļ„하ė—Ŧ ëĒŠëĄ ėž…ë Ĩ):", "goToPage": "ė´ë™", "true": "ė°¸", "false": "ęą°ė§“", "unknown": "ė•Œ 눘 ė—†ėŒ", + "app": { + "description": "The Free Adobe Acrobat alternative (10M+ Downloads)" + }, "save": "ė €ėžĨ", "saveToBrowser": "브ëŧėš°ė €ė— ė €ėžĨ", + "download": "ë‹¤ėš´ëĄœë“œ", + "pin": "Pin File (keep active after tool run)", + "unpin": "Unpin File (replace after tool run)", + "undoOperationTooltip": "Click to undo the last operation and restore the original files", + "undo": "Undo", + "moreOptions": "More Options", + "editYourNewFiles": "Edit your new file(s)", "close": "ë‹Ģ기", + "openInViewer": "Open in Viewer", + "confirmClose": "Confirm Close", + "confirmCloseMessage": "Are you sure you want to close this file?", + "confirmCloseCancel": "Cancel", + "confirmCloseConfirm": "Close File", + "fileSelected": "Selected: {{filename}}", + "chooseFile": "Choose File", "filesSelected": "ę°œė˜ 파ėŧė´ ė„ íƒë¨", + "files": { + "title": "Files", + "upload": "Upload", + "uploadFiles": "Upload Files", + "addFiles": "Add files", + "selectFromWorkbench": "Select files from the workbench or ", + "selectMultipleFromWorkbench": "Select at least {{count}} files from the workbench or ", + "created": "Created", + "size": "File Size" + }, "noFavourites": "ėĻę˛¨ė°žę¸°ę°€ ėļ”ę°€ë˜ė§€ ė•Šė•˜ėŠĩ니다", "downloadComplete": "ë‹¤ėš´ëĄœë“œ ė™„ëŖŒ", "bored": "기다ëĻŦ는 ę˛ƒė´ ė§€ëŖ¨í•˜ė‹ ę°€ėš”?", @@ -56,7 +136,10 @@ }, "error": { "pdfPassword": "PDF ëŦ¸ė„œę°€ 비밀번호로 ëŗ´í˜¸ë˜ė–´ ėžˆėœŧ늰, 비밀번호가 렜ęŗĩë˜ė§€ ė•Šė•˜ęą°ë‚˜ ė˜Ŧ바ëĨ´ė§€ ė•ŠėŠĩ니다", + "encryptedPdfMustRemovePassword": "This PDF is encrypted or password-protected. Please unlock it before converting to PDF/A.", + "incorrectPasswordProvided": "The PDF password is incorrect or not provided.", "_value": "똤ëĨ˜", + "dismissAllErrors": "Dismiss All Errors", "sorry": "ëŦ¸ė œę°€ ë°œėƒí•´ ėŖ„ė†Ąí•Šë‹ˆë‹¤!", "needHelp": "ë„ė›€ė´ í•„ėš”í•˜ė‹ ę°€ėš” / ëŦ¸ė œëĨŧ 발ę˛Ŧí•˜ė…¨ë‚˜ėš”?", "contactTip": "ė—Ŧė „ížˆ ëŦ¸ė œę°€ ėžˆë‹¤ëŠ´ ėŖŧė €í•˜ė§€ ë§ˆė‹œęŗ  ë„ė›€ė„ ėš”ė˛­í•˜ė„¸ėš”. GitHub íŽ˜ė´ė§€ė—ė„œ 티ėŧ“ė„ 렜ėļœí•˜ęą°ë‚˜ DiscordëĨŧ í†ĩ해 ė—°ëŊí•˜ė‹¤ 눘 ėžˆėŠĩ니다:", @@ -71,6 +154,10 @@ "githubSubmit": "GitHub - 티ėŧ“ 렜ėļœ", "discordSubmit": "Discord - 맀뛐 ę˛Œė‹œëŦŧ ėž‘ė„ą" }, + "warning": { + "tooltipTitle": "Warning" + }, + "edit": "Edit", "delete": "ė‚­ė œ", "username": "ė‚ŦėšŠėž ė´ëĻ„", "password": "비밀번호", @@ -82,6 +169,7 @@ "green": "ė´ˆëĄ", "blue": "파랑", "custom": "ė‚ŦėšŠėž 맀렕...", + "comingSoon": "Coming soon", "WorkInProgess": "ėž‘ė—… ė§„í–‰ 뤑, ėž‘ë™í•˜ė§€ ė•Šęą°ë‚˜ 버그가 ėžˆė„ 눘 ėžˆėŠĩ니다. ëŦ¸ė œę°€ ėžˆėœŧ늴 ė‹ ęŗ í•´ ėŖŧė„¸ėš”!", "poweredBy": "렜ęŗĩ", "yes": "똈", @@ -115,12 +203,14 @@ "page": "íŽ˜ė´ė§€", "pages": "íŽ˜ė´ė§€", "loading": "로딩 뤑...", + "review": "Review", "addToDoc": "ëŦ¸ė„œė— ėļ”ę°€", "reset": "ė´ˆę¸°í™”", "apply": "ė ėšŠ", "noFileSelected": "No file selected. Please upload one.", "legal": { "privacy": "ę°œė¸ė •ëŗ´ 래ëĻŦë°Šėš¨", + "iAgreeToThe": "I agree to all of the", "terms": "ė´ėšŠė•Ŋ관", "accessibility": "ė ‘ęˇŧė„ą", "cookie": "ėŋ í‚¤ ė •ėą…", @@ -160,6 +250,7 @@ "title": "Stirling PDFëĨŧ 더 ėĸ‹ę˛Œ ë§Œë“¤ęŗ  ė‹ļėœŧė‹ ę°€ėš”?", "paragraph1": "Stirling PDF는 ė œí’ˆ ę°œė„ ė„ ėœ„í•œ ė„ íƒė  ëļ„ė„ 기ëŠĨė´ ėžˆėŠĩ니다. ę°œė¸ė •ëŗ´ë‚˜ 파ėŧ ë‚´ėšŠė€ ėļ”ė í•˜ė§€ ė•ŠėŠĩ니다.", "paragraph2": "Stirling-PDFė˜ ė„ąėžĨė„ ë•ęŗ  ė‚ŦėšŠėžëĨŧ 더 ėž˜ ė´í•´í•  눘 ėžˆë„ëĄ ëļ„ė„ 기ëŠĨ í™œė„ąí™”ëĨŧ ęŗ ë ¤í•´ėŖŧė„¸ėš”.", + "learnMore": "Learn more", "enable": "ëļ„ė„ í™œė„ąí™”", "disable": "ëļ„ė„ ëš„í™œė„ąí™”", "settings": "config/settings.yml 파ėŧė—ė„œ ëļ„ė„ ė„¤ė •ė„ ëŗ€ę˛Ŋ할 눘 ėžˆėŠĩ니다" @@ -203,6 +294,54 @@ "cacheInputs": { "name": "ėž…ë Ĩ ė–‘ė‹ ė €ėžĨ", "help": "ë‹¤ėŒ ė‹¤í–‰ė„ ėœ„í•´ ė´ė „ė— ė‚ŦėšŠí•œ ėž…ë Ĩė„ ė €ėžĨ하도록 í™œė„ąí™”" + }, + "general": { + "title": "General", + "description": "Configure general application preferences.", + "account": "Account", + "accountDescription": "Manage your account settings", + "user": "User", + "signedInAs": "Signed in as", + "logout": "Log out", + "enableFeatures": { + "title": "For System Administrators", + "intro": "Enable user authentication, team management, and workspace features for your organization.", + "action": "Configure", + "and": "and", + "benefit": "Enables user roles, team collaboration, admin controls, and enterprise features.", + "learnMore": "Learn more in documentation", + "dismiss": "Dismiss" + }, + "autoUnzip": "Auto-unzip API responses", + "autoUnzipDescription": "Automatically extract files from ZIP responses", + "autoUnzipTooltip": "Automatically extract ZIP files returned from API operations. Disable to keep ZIP files intact. This does not affect automation workflows.", + "autoUnzipFileLimit": "Auto-unzip file limit", + "autoUnzipFileLimitDescription": "Maximum number of files to extract from ZIP", + "autoUnzipFileLimitTooltip": "Only unzip if the ZIP contains this many files or fewer. Set higher to extract larger ZIPs.", + "defaultToolPickerMode": "Default tool picker mode", + "defaultToolPickerModeDescription": "Choose whether the tool picker opens in fullscreen or sidebar by default", + "mode": { + "fullscreen": "Fullscreen", + "sidebar": "Sidebar" + } + }, + "hotkeys": { + "title": "Keyboard Shortcuts", + "description": "Hover a tool to see its shortcut or customise it below. Click \"Change shortcut\" and press a new key combination. Press Esc to cancel.", + "errorModifier": { + "mac": "Include ⌘ (Command), âŒĨ (Option), or another modifier in your shortcut.", + "windows": "Include Ctrl, Alt, or another modifier in your shortcut." + }, + "errorConflict": "Shortcut already used by {{tool}}.", + "none": "Not assigned", + "customBadge": "Custom", + "defaultLabel": "Default: {{shortcut}}", + "capturing": "Press keysâ€Ļ (Esc to cancel)", + "change": "Change shortcut", + "reset": "Reset", + "shortcut": "Shortcut", + "noShortcut": "No shortcut set", + "searchPlaceholder": "Search tools..." } }, "changeCreds": { @@ -274,8 +413,10 @@ "top20": "Top 20", "all": "All", "refresh": "Refresh", - "includeHomepage": "Include Homepage ('/')", - "includeLoginPage": "Include Login Page ('/login')", + "dataTypeLabel": "Data Type:", + "dataTypeAll": "All", + "dataTypeApi": "API", + "dataTypeUi": "UI", "totalEndpoints": "Total Endpoints", "totalVisits": "Total Visits", "showing": "Showing", @@ -290,7 +431,9 @@ "top": "Top", "numberOfVisits": "Number of Visits", "visitsTooltip": "Visits: {0} ({1}% of total)", - "retry": "Retry" + "retry": "Retry", + "includeHomepage": "Include Homepage ('/')", + "includeLoginPage": "Include Login Page ('/login')" }, "database": { "title": "ë°ė´í„°ë˛ ė´ėŠ¤ ę°€ė ¸ė˜¤ę¸°/ë‚´ëŗ´ë‚´ę¸°", @@ -331,22 +474,310 @@ "alphabetical": "Alphabetical", "globalPopularity": "Global Popularity", "sortBy": "Sort by:", + "mobile": { + "brandAlt": "Stirling PDF logo", + "openFiles": "Open files", + "swipeHint": "Swipe left or right to switch views", + "tools": "Tools", + "toolsSlide": "Tool selection panel", + "viewSwitcher": "Switch workspace view", + "workbenchSlide": "Workspace panel", + "workspace": "Workspace" + }, "multiTool": { + "tags": "multiple,tools", "title": "PDF 멀티 도ęĩŦ", "desc": "ëŗ‘í•Š, íšŒė „, ėžŦë°°ėš˜, ëļ„í•  및 íŽ˜ė´ė§€ ė œęą°" }, "merge": { + "tags": "combine,join,unite", "title": "ëŗ‘í•Š", "desc": "ė—ŦëŸŦ PDFëĨŧ 하나로 ė‰Ŋ枌 ëŗ‘í•Ší•Šë‹ˆë‹¤." }, "split": { + "tags": "divide,separate,break", "title": "ëļ„í• ", "desc": "PDFëĨŧ ė—ŦëŸŦ ëŦ¸ė„œëĄœ ëļ„í• " }, "rotate": { + "tags": "turn,flip,orient", "title": "íšŒė „", "desc": "PDFëĨŧ ė‰Ŋ枌 íšŒė „í•Šë‹ˆë‹¤." }, + "convert": { + "tags": "transform,change", + "title": "ëŗ€í™˜", + "desc": "Convert files between different formats" + }, + "pdfOrganiser": { + "tags": "organize,rearrange,reorder", + "title": "ė •ëĻŦ", + "desc": "ė›í•˜ëŠ” ėˆœė„œëĄœ íŽ˜ė´ė§€ ė œęą°/ėžŦë°°ėš˜" + }, + "addImage": { + "tags": "insert,embed,place", + "title": "ė´ë¯¸ė§€ ėļ”ę°€", + "desc": "PDFė˜ ė§€ė •ëœ ėœ„ėš˜ė— ė´ë¯¸ė§€ ėļ”ę°€" + }, + "addAttachments": { + "tags": "embed,attach,include", + "title": "Add Attachments", + "desc": "Add or remove embedded files (attachments) to/from a PDF" + }, + "watermark": { + "tags": "stamp,mark,overlay", + "title": "ė›Œí„°ë§ˆíŦ ėļ”ę°€", + "desc": "PDF ëŦ¸ė„œė— ė‚ŦėšŠėž 맀렕 ė›Œí„°ë§ˆíŦëĨŧ ėļ”ę°€í•Šë‹ˆë‹¤." + }, + "removePassword": { + "tags": "unlock", + "title": "비밀번호 ė œęą°", + "desc": "PDF ëŦ¸ė„œė—ė„œ 비밀번호 ëŗ´í˜¸ëĨŧ ė œęą°í•Šë‹ˆë‹¤." + }, + "compress": { + "tags": "shrink,reduce,optimize", + "title": "ė••ėļ•", + "desc": "PDFëĨŧ ė••ėļ•하ė—Ŧ 파ėŧ íŦ기ëĨŧ ė¤„ėž…ë‹ˆë‹¤." + }, + "unlockPDFForms": { + "tags": "unlock,enable,edit", + "title": "Unlock PDF Forms", + "desc": "Remove read-only property of form fields in a PDF document." + }, + "changeMetadata": { + "tags": "edit,modify,update", + "title": "ëŠ”íƒ€ë°ė´í„° ëŗ€ę˛Ŋ", + "desc": "PDF ëŦ¸ė„œė—ė„œ ëŠ”íƒ€ë°ė´í„° ëŗ€ę˛Ŋ/ė œęą°/ėļ”ę°€" + }, + "ocr": { + "tags": "extract,scan", + "title": "OCR / 늤ėē” ė •ëĻŦ", + "desc": "늤ėē”ė„ ė •ëĻŦí•˜ęŗ  PDF 내 ė´ë¯¸ė§€ė—ė„œ í…ėŠ¤íŠ¸ëĨŧ ę°ė§€í•˜ė—Ŧ ë‹¤ė‹œ í…ėŠ¤íŠ¸ëĄœ ėļ”ę°€í•Šë‹ˆë‹¤." + }, + "extractImages": { + "tags": "pull,save,export", + "title": "ė´ë¯¸ė§€ ėļ”ėļœ", + "desc": "PDFė—ė„œ ëĒ¨ë“  ė´ë¯¸ė§€ëĨŧ ėļ”ėļœí•˜ė—Ŧ zipėœŧ로 ė €ėžĨ" + }, + "scannerImageSplit": { + "tags": "detect,split,photos", + "title": "Detect & Split Scanned Photos", + "desc": "Detect and split scanned photos into separate pages" + }, + "sign": { + "tags": "signature,autograph", + "title": "ė„œëĒ…", + "desc": "꡸ëĻŦ기, í…ėŠ¤íŠ¸ 또는 ė´ë¯¸ė§€ëĄœ PDF뗐 ė„œëĒ… ėļ”ę°€" + }, + "flatten": { + "tags": "simplify,remove,interactive", + "title": "평면화", + "desc": "PDFė—ė„œ ëĒ¨ë“  대화형 ėš”ė†Œė™€ ė–‘ė‹ ė œęą°" + }, + "certSign": { + "tags": "authenticate,PEM,P12,official,encrypt,sign,certificate,PKCS12,JKS,server,manual,auto", + "title": "ė¸ėĻė„œëĄœ ė„œëĒ…", + "desc": "ė¸ėĻė„œ/키(PEM/P12)로 PDF뗐 ė„œëĒ…" + }, + "repair": { + "tags": "fix,restore", + "title": "ëŗĩęĩŦ", + "desc": "ė†ėƒ/ęš¨ė§„ PDFëĨŧ ëŗĩęĩŦ ė‹œë„" + }, + "removeBlanks": { + "tags": "delete,clean,empty", + "title": "뚈 íŽ˜ė´ė§€ ė œęą°", + "desc": "ëŦ¸ė„œė—ė„œ 뚈 íŽ˜ė´ė§€ëĨŧ ę°ė§€í•˜ęŗ  ė œęą°í•Šë‹ˆë‹¤" + }, + "removeAnnotations": { + "tags": "delete,clean,strip", + "title": "ėŖŧė„ ė œęą°", + "desc": "PDFė—ė„œ ëĒ¨ë“  ėŖŧė„/메ëǍëĨŧ ė œęą°í•Šë‹ˆë‹¤" + }, + "compare": { + "tags": "difference", + "title": "비ęĩ", + "desc": "2ę°œė˜ PDF ëŦ¸ė„œëĨŧ 비ęĩí•˜ęŗ  ė°¨ė´ė ė„ ëŗ´ė—Ŧė¤ë‹ˆë‹¤" + }, + "removeCertSign": { + "tags": "remove,delete,unlock", + "title": "ė¸ėĻė„œ ė„œëĒ… ė œęą°", + "desc": "PDFė—ė„œ ė¸ėĻė„œ ė„œëĒ… ė œęą°" + }, + "pageLayout": { + "tags": "layout,arrange,combine", + "title": "ë‹¤ė¤‘ íŽ˜ė´ė§€ ë ˆė´ė•„ė›ƒ", + "desc": "PDF ëŦ¸ė„œė˜ ė—ŦëŸŦ íŽ˜ė´ė§€ëĨŧ í•˜ë‚˜ė˜ íŽ˜ė´ė§€ëĄœ ëŗ‘í•Š" + }, + "bookletImposition": { + "tags": "booklet,print,binding", + "title": "Booklet Imposition", + "desc": "Create booklets with proper page ordering and multi-page layout for printing and binding" + }, + "scalePages": { + "tags": "resize,adjust,scale", + "title": "íŽ˜ė´ė§€ íŦ기/ë°°ėœ¨ ėĄ°ė •", + "desc": "íŽ˜ė´ė§€ 및 ë‚´ėšŠė˜ íŦ기/ë°°ėœ¨ė„ ëŗ€ę˛Ŋ합니다." + }, + "addPageNumbers": { + "tags": "number,pagination,count", + "title": "íŽ˜ė´ė§€ 번호 ėļ”ę°€", + "desc": "ëŦ¸ė„œ 렄랴뗐 ė§€ė •ëœ ėœ„ėš˜ė— íŽ˜ė´ė§€ 번호 ėļ”ę°€" + }, + "autoRename": { + "tags": "auto-detect,header-based,organize,relabel", + "title": "Auto Rename PDF File", + "desc": "Auto renames a PDF file based on its detected header" + }, + "adjustContrast": { + "tags": "contrast,brightness,saturation", + "title": "ėƒ‰ėƒ/대비 ėĄ°ė •", + "desc": "PDFė˜ 대비, ėą„ë„ 및 밝기 ėĄ°ė •" + }, + "crop": { + "tags": "trim,cut,resize", + "title": "PDF ėžëĨ´ę¸°", + "desc": "PDFëĨŧ ėž˜ëŧė„œ íŦ기 ė¤„ė´ę¸°(í…ėŠ¤íŠ¸ ėœ ė§€!)" + }, + "autoSplitPDF": { + "tags": "auto,split,QR", + "title": "ėžë™ íŽ˜ė´ė§€ ëļ„í• ", + "desc": "ëŦŧëĻŦ렁 늤ėē” íŽ˜ė´ė§€ ëļ„할기 QR ėŊ”ë“œę°€ ėžˆëŠ” 늤ėē”된 PDF ėžë™ ëļ„í• " + }, + "sanitize": { + "tags": "clean,purge,remove", + "title": "Sanitise", + "desc": "Remove potentially harmful elements from PDF files" + }, + "getPdfInfo": { + "tags": "info,metadata,details", + "title": "PDF ëĒ¨ë“  ė •ëŗ´ ę°€ė ¸ė˜¤ę¸°", + "desc": "PDFė—ė„œ 가ëŠĨ한 ëĒ¨ë“  ė •ëŗ´ ę°€ė ¸ė˜¤ę¸°" + }, + "pdfToSinglePage": { + "tags": "combine,merge,single", + "title": "단ėŧ 큰 íŽ˜ė´ė§€", + "desc": "ëĒ¨ë“  PDF íŽ˜ė´ė§€ëĨŧ í•˜ë‚˜ė˜ 큰 단ėŧ íŽ˜ė´ė§€ëĄœ ëŗ‘í•Š" + }, + "showJS": { + "tags": "javascript,code,script", + "title": "JavaScript ëŗ´ę¸°", + "desc": "PDF뗐 ė‚Ŋėž…ëœ JavaScript ę˛€ėƒ‰ 및 í‘œė‹œ" + }, + "redact": { + "tags": "censor,blackout,hide", + "title": "ėˆ˜ë™ 枀뗴", + "desc": "ė„ íƒí•œ í…ėŠ¤íŠ¸, ꡸ëϰ 도형 및/또는 ė„ íƒí•œ íŽ˜ė´ė§€ëĨŧ 기반ėœŧ로 PDF 枀뗴" + }, + "splitBySections": { + "tags": "split,sections,divide", + "title": "Split PDF by Sections", + "desc": "Divide each page of a PDF into smaller horizontal and vertical sections" + }, + "addStamp": { + "tags": "stamp,mark,seal", + "title": "Add Stamp to PDF", + "desc": "Add text or add image stamps at set locations" + }, + "removeImage": { + "tags": "remove,delete,clean", + "title": "ė´ë¯¸ė§€ ė œęą°", + "desc": "파ėŧ íŦ기ëĨŧ ė¤„ė´ę¸° ėœ„í•´ PDFė—ė„œ ė´ë¯¸ė§€ ė œęą°" + }, + "splitByChapters": { + "tags": "split,chapters,structure", + "title": "ėą•í„°ëŗ„ PDF ëļ„í• ", + "desc": "PDFëĨŧ ėą•í„° ęĩŦėĄ°ė— 따ëŧ ė—ŦëŸŦ 파ėŧ로 ëļ„할핊니다." + }, + "validateSignature": { + "tags": "validate,verify,certificate", + "title": "PDF ė„œëĒ… 검ėĻ", + "desc": "PDF ëŦ¸ė„œė˜ ë””ė§€í„¸ ė„œëĒ…ęŗŧ ė¸ėĻė„œ 검ėĻ" + }, + "swagger": { + "tags": "API,documentation,test", + "title": "API Documentation", + "desc": "View API documentation and test endpoints" + }, + "scannerEffect": { + "tags": "scan,simulate,create", + "title": "Scanner Effect", + "desc": "Create a PDF that looks like it was scanned" + }, + "editTableOfContents": { + "tags": "bookmarks,contents,edit", + "title": "Edit Table of Contents", + "desc": "Add or edit bookmarks and table of contents in PDF documents" + }, + "manageCertificates": { + "tags": "certificates,import,export", + "title": "Manage Certificates", + "desc": "Import, export, or delete digital certificate files used for signing PDFs." + }, + "read": { + "tags": "view,open,display", + "title": "Read", + "desc": "View and annotate PDFs. Highlight text, draw, or insert comments for review and collaboration." + }, + "reorganizePages": { + "tags": "rearrange,reorder,organize", + "title": "Reorganize Pages", + "desc": "Rearrange, duplicate, or delete PDF pages with visual drag-and-drop control." + }, + "extractPages": { + "tags": "pull,select,copy", + "title": "íŽ˜ė´ė§€ ėļ”ėļœ", + "desc": "Extract specific pages from a PDF document" + }, + "removePages": { + "tags": "delete,extract,exclude", + "title": "ė œęą°", + "desc": "PDF ëŦ¸ė„œė—ė„œ ė›í•˜ė§€ ė•ŠëŠ” íŽ˜ė´ė§€ëĨŧ ė‚­ė œí•Šë‹ˆë‹¤." + }, + "autoSizeSplitPDF": { + "tags": "auto,split,size", + "title": "íŦ기/ę°œėˆ˜ëŗ„ ėžë™ ëļ„í• ", + "desc": "단ėŧ PDFëĨŧ íŦ기, íŽ˜ė´ė§€ 눘 또는 ëŦ¸ė„œ 눘ëĨŧ 揰뤀ėœŧ로 ė—ŦëŸŦ ëŦ¸ė„œëĄœ ëļ„í• " + }, + "replaceColor": { + "title": "Replace & Invert Colour", + "desc": "Replace or invert colours in PDF documents" + }, + "devApi": { + "tags": "API,development,documentation", + "title": "API", + "desc": "Link to API documentation" + }, + "devFolderScanning": { + "tags": "automation,folder,scanning", + "title": "Automated Folder Scanning", + "desc": "Link to automated folder scanning guide" + }, + "devSsoGuide": { + "title": "SSO Guide", + "desc": "Link to SSO guide" + }, + "devAirgapped": { + "title": "Air-gapped Setup", + "desc": "Link to air-gapped setup guide" + }, + "addPassword": { + "title": "비밀번호 ėļ”ę°€", + "desc": "PDF ëŦ¸ė„œëĨŧ 비밀번호로 ė•”í˜¸í™”í•Šë‹ˆë‹¤." + }, + "changePermissions": { + "title": "ęļŒí•œ ëŗ€ę˛Ŋ", + "desc": "Change document restrictions and permissions" + }, + "automate": { + "tags": "workflow,sequence,automation", + "title": "Automate", + "desc": "Build multi-step workflows by chaining together PDF actions. Ideal for recurring tasks." + }, + "overlay-pdfs": { + "desc": "PDFëĨŧ 다ëĨ¸ PDF ėœ„ė— ė˜¤ë˛„ë ˆė´", + "title": "PDF ė˜¤ë˛„ë ˆė´" + }, "imageToPDF": { "title": "ė´ë¯¸ė§€ëĨŧ PDF로", "desc": "ė´ë¯¸ė§€(PNG, JPEG, GIF)ëĨŧ PDF로 ëŗ€í™˜í•Šë‹ˆë‹¤." @@ -355,18 +786,6 @@ "title": "PDFëĨŧ ė´ë¯¸ė§€ëĄœ", "desc": "PDFëĨŧ ė´ë¯¸ė§€ëĄœ ëŗ€í™˜í•Šë‹ˆë‹¤. (PNG, JPEG, GIF)" }, - "pdfOrganiser": { - "title": "ė •ëĻŦ", - "desc": "ė›í•˜ëŠ” ėˆœė„œëĄœ íŽ˜ė´ė§€ ė œęą°/ėžŦë°°ėš˜" - }, - "addImage": { - "title": "ė´ë¯¸ė§€ ėļ”ę°€", - "desc": "PDFė˜ ė§€ė •ëœ ėœ„ėš˜ė— ė´ë¯¸ė§€ ėļ”ę°€" - }, - "watermark": { - "title": "ė›Œí„°ë§ˆíŦ ėļ”ę°€", - "desc": "PDF ëŦ¸ė„œė— ė‚ŦėšŠėž 맀렕 ė›Œí„°ë§ˆíŦëĨŧ ėļ”ę°€í•Šë‹ˆë‹¤." - }, "permissions": { "title": "ęļŒí•œ ëŗ€ę˛Ŋ", "desc": "PDF ëŦ¸ė„œė˜ ęļŒí•œė„ ëŗ€ę˛Ŋ합니다" @@ -375,38 +794,10 @@ "title": "ė œęą°", "desc": "PDF ëŦ¸ė„œė—ė„œ ė›í•˜ė§€ ė•ŠëŠ” íŽ˜ė´ė§€ëĨŧ ė‚­ė œí•Šë‹ˆë‹¤." }, - "addPassword": { - "title": "비밀번호 ėļ”ę°€", - "desc": "PDF ëŦ¸ė„œëĨŧ 비밀번호로 ė•”í˜¸í™”í•Šë‹ˆë‹¤." - }, - "removePassword": { - "title": "비밀번호 ė œęą°", - "desc": "PDF ëŦ¸ė„œė—ė„œ 비밀번호 ëŗ´í˜¸ëĨŧ ė œęą°í•Šë‹ˆë‹¤." - }, - "compress": { - "title": "ė••ėļ•", - "desc": "PDFëĨŧ ė••ėļ•하ė—Ŧ 파ėŧ íŦ기ëĨŧ ė¤„ėž…ë‹ˆë‹¤." - }, - "unlockPDFForms": { - "title": "Unlock PDF Forms", - "desc": "Remove read-only property of form fields in a PDF document." - }, - "changeMetadata": { - "title": "ëŠ”íƒ€ë°ė´í„° ëŗ€ę˛Ŋ", - "desc": "PDF ëŦ¸ė„œė—ė„œ ëŠ”íƒ€ë°ė´í„° ëŗ€ę˛Ŋ/ė œęą°/ėļ”ę°€" - }, "fileToPDF": { "title": "파ėŧė„ PDF로 ëŗ€í™˜", "desc": "ęą°ė˜ ëĒ¨ë“  파ėŧė„ PDF로 ëŗ€í™˜í•Šë‹ˆë‹¤(DOCX, PNG, XLS, PPT, TXT 등)" }, - "ocr": { - "title": "OCR / 늤ėē” ė •ëĻŦ", - "desc": "늤ėē”ė„ ė •ëĻŦí•˜ęŗ  PDF 내 ė´ë¯¸ė§€ė—ė„œ í…ėŠ¤íŠ¸ëĨŧ ę°ė§€í•˜ė—Ŧ ë‹¤ė‹œ í…ėŠ¤íŠ¸ëĄœ ėļ”ę°€í•Šë‹ˆë‹¤." - }, - "extractImages": { - "title": "ė´ë¯¸ė§€ ėļ”ėļœ", - "desc": "PDFė—ė„œ ëĒ¨ë“  ė´ë¯¸ė§€ëĨŧ ėļ”ėļœí•˜ė—Ŧ zipėœŧ로 ė €ėžĨ" - }, "pdfToPDFA": { "title": "PDFëĨŧ PDF/A로", "desc": "ėžĨ기 ëŗ´ę´€ė„ ėœ„í•´ PDFëĨŧ PDF/A로 ëŗ€í™˜" @@ -435,70 +826,14 @@ "title": "늤ėē”한 ė‚Ŧė§„ 氐맀/ëļ„í• ", "desc": "ė‚Ŧė§„/PDF ë‚´ė˜ ė—ŦëŸŦ ė‚Ŧė§„ė„ ëļ„할핊니다" }, - "sign": { - "title": "ė„œëĒ…", - "desc": "꡸ëĻŦ기, í…ėŠ¤íŠ¸ 또는 ė´ë¯¸ė§€ëĄœ PDF뗐 ė„œëĒ… ėļ”ę°€" - }, - "flatten": { - "title": "평면화", - "desc": "PDFė—ė„œ ëĒ¨ë“  대화형 ėš”ė†Œė™€ ė–‘ė‹ ė œęą°" - }, - "repair": { - "title": "ëŗĩęĩŦ", - "desc": "ė†ėƒ/ęš¨ė§„ PDFëĨŧ ëŗĩęĩŦ ė‹œë„" - }, - "removeBlanks": { - "title": "뚈 íŽ˜ė´ė§€ ė œęą°", - "desc": "ëŦ¸ė„œė—ė„œ 뚈 íŽ˜ė´ė§€ëĨŧ ę°ė§€í•˜ęŗ  ė œęą°í•Šë‹ˆë‹¤" - }, - "removeAnnotations": { - "title": "ėŖŧė„ ė œęą°", - "desc": "PDFė—ė„œ ëĒ¨ë“  ėŖŧė„/메ëǍëĨŧ ė œęą°í•Šë‹ˆë‹¤" - }, - "compare": { - "title": "비ęĩ", - "desc": "2ę°œė˜ PDF ëŦ¸ė„œëĨŧ 비ęĩí•˜ęŗ  ė°¨ė´ė ė„ ëŗ´ė—Ŧė¤ë‹ˆë‹¤" - }, - "certSign": { - "title": "ė¸ėĻė„œëĄœ ė„œëĒ…", - "desc": "ė¸ėĻė„œ/키(PEM/P12)로 PDF뗐 ė„œëĒ…" - }, - "removeCertSign": { - "title": "ė¸ėĻė„œ ė„œëĒ… ė œęą°", - "desc": "PDFė—ė„œ ė¸ėĻė„œ ė„œëĒ… ė œęą°" - }, - "pageLayout": { - "title": "ë‹¤ė¤‘ íŽ˜ė´ė§€ ë ˆė´ė•„ė›ƒ", - "desc": "PDF ëŦ¸ė„œė˜ ė—ŦëŸŦ íŽ˜ė´ė§€ëĨŧ í•˜ë‚˜ė˜ íŽ˜ė´ė§€ëĄœ ëŗ‘í•Š" - }, - "scalePages": { - "title": "íŽ˜ė´ė§€ íŦ기/ë°°ėœ¨ ėĄ°ė •", - "desc": "íŽ˜ė´ė§€ 및 ë‚´ėšŠė˜ íŦ기/ë°°ėœ¨ė„ ëŗ€ę˛Ŋ합니다." - }, "pipeline": { "title": "íŒŒė´í”„ëŧė¸", "desc": "íŒŒė´í”„ëŧė¸ 늤íŦëĻŊ트ëĨŧ ė •ė˜í•˜ė—Ŧ PDFė—ė„œ ė—ŦëŸŦ ėž‘ė—… ė‹¤í–‰" }, - "addPageNumbers": { - "title": "íŽ˜ė´ė§€ 번호 ėļ”ę°€", - "desc": "ëŦ¸ė„œ 렄랴뗐 ė§€ė •ëœ ėœ„ėš˜ė— íŽ˜ė´ė§€ 번호 ėļ”ę°€" - }, "auto-rename": { "title": "PDF 파ėŧ ėžë™ ė´ëĻ„ ëŗ€ę˛Ŋ", "desc": "ę°ė§€ëœ 헤더ëĨŧ 기반ėœŧ로 PDF 파ėŧ ė´ëĻ„ ėžë™ ëŗ€ę˛Ŋ" }, - "adjustContrast": { - "title": "ėƒ‰ėƒ/대비 ėĄ°ė •", - "desc": "PDFė˜ 대비, ėą„ë„ 및 밝기 ėĄ°ė •" - }, - "crop": { - "title": "PDF ėžëĨ´ę¸°", - "desc": "PDFëĨŧ ėž˜ëŧė„œ íŦ기 ė¤„ė´ę¸°(í…ėŠ¤íŠ¸ ėœ ė§€!)" - }, - "autoSplitPDF": { - "title": "ėžë™ íŽ˜ė´ė§€ ëļ„í• ", - "desc": "ëŦŧëĻŦ렁 늤ėē” íŽ˜ė´ė§€ ëļ„할기 QR ėŊ”ë“œę°€ ėžˆëŠ” 늤ėē”된 PDF ėžë™ ëļ„í• " - }, "sanitizePDF": { "title": "ė •ëĻŦ", "desc": "PDF 파ėŧė—ė„œ 늤íŦëĻŊ트 및 기타 ėš”ė†Œ ė œęą°" @@ -519,30 +854,14 @@ "title": "PDFëĨŧ Markdownėœŧ로", "desc": "PDFëĨŧ Markdownėœŧ로 ëŗ€í™˜" }, - "getPdfInfo": { - "title": "PDF ëĒ¨ë“  ė •ëŗ´ ę°€ė ¸ė˜¤ę¸°", - "desc": "PDFė—ė„œ 가ëŠĨ한 ëĒ¨ë“  ė •ëŗ´ ę°€ė ¸ė˜¤ę¸°" - }, "pageExtracter": { "title": "íŽ˜ė´ė§€ ėļ”ėļœ", "desc": "PDFė—ė„œ ė„ íƒí•œ íŽ˜ė´ė§€ ėļ”ėļœ" }, - "pdfToSinglePage": { - "title": "단ėŧ 큰 íŽ˜ė´ė§€", - "desc": "ëĒ¨ë“  PDF íŽ˜ė´ė§€ëĨŧ í•˜ë‚˜ė˜ 큰 단ėŧ íŽ˜ė´ė§€ëĄœ ëŗ‘í•Š" - }, - "showJS": { - "title": "JavaScript ëŗ´ę¸°", - "desc": "PDF뗐 ė‚Ŋėž…ëœ JavaScript ę˛€ėƒ‰ 및 í‘œė‹œ" - }, "autoRedact": { "title": "ėžë™ 枀뗴", "desc": "ėž…ë Ĩ í…ėŠ¤íŠ¸ëĨŧ 기반ėœŧ로 PDFė˜ í…ėŠ¤íŠ¸ ėžë™ 枀뗴(가ëĻŧ)" }, - "redact": { - "title": "ėˆ˜ë™ 枀뗴", - "desc": "ė„ íƒí•œ í…ėŠ¤íŠ¸, ꡸ëϰ 도형 및/또는 ė„ íƒí•œ íŽ˜ė´ė§€ëĨŧ 기반ėœŧ로 PDF 枀뗴" - }, "PDFToCSV": { "title": "PDFëĨŧ CSV로", "desc": "PDFė—ė„œ 표ëĨŧ ėļ”ėļœí•˜ė—Ŧ CSV로 ëŗ€í™˜" @@ -551,10 +870,6 @@ "title": "íŦ기/ę°œėˆ˜ëŗ„ ėžë™ ëļ„í• ", "desc": "단ėŧ PDFëĨŧ íŦ기, íŽ˜ė´ė§€ 눘 또는 ëŦ¸ė„œ 눘ëĨŧ 揰뤀ėœŧ로 ė—ŦëŸŦ ëŦ¸ė„œëĄœ ëļ„í• " }, - "overlay-pdfs": { - "title": "PDF ė˜¤ë˛„ë ˆė´", - "desc": "PDFëĨŧ 다ëĨ¸ PDF ėœ„ė— ė˜¤ë˛„ë ˆė´" - }, "split-by-sections": { "title": "ė„šė…˜ëŗ„ PDF ëļ„í• ", "desc": "PDFė˜ 각 íŽ˜ė´ė§€ëĨŧ 더 ėž‘ė€ 가로 및 ė„¸ëĄœ ė„šė…˜ėœŧ로 ëļ„í• " @@ -563,43 +878,17 @@ "title": "PDF뗐 늤íƒŦ프 ėļ”ę°€", "desc": "ė§€ė •ëœ ėœ„ėš˜ė— í…ėŠ¤íŠ¸ 또는 ė´ë¯¸ė§€ 늤íƒŦ프 ėļ”ę°€" }, - "removeImage": { - "title": "ė´ë¯¸ė§€ ė œęą°", - "desc": "파ėŧ íŦ기ëĨŧ ė¤„ė´ę¸° ėœ„í•´ PDFė—ė„œ ė´ë¯¸ė§€ ė œęą°" - }, - "splitByChapters": { - "title": "ėą•í„°ëŗ„ PDF ëļ„í• ", - "desc": "PDFëĨŧ ėą•í„° ęĩŦėĄ°ė— 따ëŧ ė—ŦëŸŦ 파ėŧ로 ëļ„할핊니다." - }, - "validateSignature": { - "title": "PDF ė„œëĒ… 검ėĻ", - "desc": "PDF ëŦ¸ė„œė˜ ë””ė§€í„¸ ė„œëĒ…ęŗŧ ė¸ėĻė„œ 검ėĻ" - }, "replace-color": { "title": "ėƒ‰ėƒ ęĩė˛´ 및 ë°˜ė „", "desc": "PDFė—ė„œ í…ėŠ¤íŠ¸ė™€ ë°°ę˛Ŋė˜ ėƒ‰ėƒė„ ęĩė˛´í•˜ęŗ  파ėŧ íŦ기ëĨŧ ė¤„ė´ę¸° ėœ„í•´ 렄랴 PDF ėƒ‰ėƒė„ ë°˜ė „" }, - "convert": { - "title": "ëŗ€í™˜" - }, "attachments": { "title": "Add attachments" }, - "extractPages": { - "title": "íŽ˜ė´ė§€ ėļ”ėļœ" - }, - "removePages": { - "title": "ė œęą°", - "desc": "PDF ëŦ¸ė„œė—ė„œ ė›í•˜ė§€ ė•ŠëŠ” íŽ˜ė´ė§€ëĨŧ ė‚­ė œí•Šë‹ˆë‹¤." - }, "removeImagePdf": { "title": "ė´ë¯¸ė§€ ė œęą°", "desc": "파ėŧ íŦ기ëĨŧ ė¤„ė´ę¸° ėœ„í•´ PDFė—ė„œ ė´ë¯¸ė§€ ė œęą°" }, - "autoSizeSplitPDF": { - "title": "íŦ기/ę°œėˆ˜ëŗ„ ėžë™ ëļ„í• ", - "desc": "단ėŧ PDFëĨŧ íŦ기, íŽ˜ė´ė§€ 눘 또는 ëŦ¸ė„œ 눘ëĨŧ 揰뤀ėœŧ로 ė—ŦëŸŦ ëŦ¸ė„œëĄœ ëļ„í• " - }, "adjust-contrast": { "title": "ėƒ‰ėƒ/대비 ėĄ°ė •", "desc": "PDFė˜ 대비, ėą„ë„ 및 밝기 ėĄ°ė •" @@ -607,11 +896,12 @@ "replaceColorPdf": { "title": "ėƒ‰ėƒ ęĩė˛´ 및 ë°˜ė „", "desc": "PDFė—ė„œ í…ėŠ¤íŠ¸ė™€ ë°°ę˛Ŋė˜ ėƒ‰ėƒė„ ęĩė˛´í•˜ęŗ  파ėŧ íŦ기ëĨŧ ė¤„ė´ę¸° ėœ„í•´ 렄랴 PDF ėƒ‰ėƒė„ ë°˜ė „" - }, - "changePermissions": { - "title": "ęļŒí•œ ëŗ€ę˛Ŋ" } }, + "landing": { + "addFiles": "Add Files", + "uploadFromComputer": "Upload from computer" + }, "viewPdf": { "tags": "ëŗ´ę¸°,ėŊ기,ėŖŧė„,í…ėŠ¤íŠ¸,ė´ë¯¸ė§€", "title": "View/Edit PDF", @@ -645,17 +935,39 @@ "merge": { "tags": "ëŗ‘í•Š,íŽ˜ė´ė§€ ėž‘ė—…,ë°ąė—”ë“œ,ė„œë˛„ ė‚Ŧė´ë“œ", "title": "ëŗ‘í•Š", + "removeDigitalSignature": { + "label": "Remove digital signature in the merged file?", + "tooltip": { + "title": "Remove Digital Signature", + "description": "Digital signatures will be invalidated when merging files. Check this to remove them from the final merged PDF." + } + }, + "generateTableOfContents": { + "label": "Generate table of contents in the merged file?", + "tooltip": { + "title": "Generate Table of Contents", + "description": "Automatically creates a clickable table of contents in the merged PDF based on the original file names and page numbers." + } + }, + "submit": "ëŗ‘í•Š", + "sortBy": { + "description": "Files will be merged in the order they're selected. Drag to reorder or sort below.", + "label": "Sort By", + "filename": "파ėŧ ė´ëĻ„", + "dateModified": "Date Modified", + "ascending": "Ascending", + "descending": "Descending", + "sort": "Sort" + }, + "error": { + "failed": "An error occurred while merging the PDFs." + }, "header": "ė—ŦëŸŦ PDF ëŗ‘í•Š (2氜 ė´ėƒ)", "sortByName": "ė´ëĻ„ėœŧ로 ė •ë Ŧ", "sortByDate": "ë‚ ė§œëĄœ ė •ë Ŧ", - "removeCertSign": "ëŗ‘í•Šëœ 파ėŧė—ė„œ ë””ė§€í„¸ ė„œëĒ…ė„ ė œęą°í•˜ė‹œę˛ ėŠĩ니까?", - "submit": "ëŗ‘í•Š", - "sortBy": { - "filename": "파ėŧ ė´ëĻ„" - } + "removeCertSign": "ëŗ‘í•Šëœ 파ėŧė—ė„œ ë””ė§€í„¸ ė„œëĒ…ė„ ė œęą°í•˜ė‹œę˛ ėŠĩ니까?" }, "split": { - "tags": "íŽ˜ė´ė§€ ėž‘ė—…,나누기,멀티 íŽ˜ė´ė§€,ėžëĨ´ę¸°,ė„œë˛„ ė‚Ŧė´ë“œ", "title": "PDF ëļ„í• ", "header": "PDF ëļ„í• ", "desc": { @@ -671,25 +983,249 @@ "splitPages": "ëļ„í• í•  íŽ˜ė´ė§€ ėž…ë Ĩ:", "submit": "ëļ„í• ", "steps": { + "chooseMethod": "Choose Method", "settings": "네렕" }, + "settings": { + "selectMethodFirst": "Please select a split method first" + }, + "error": { + "failed": "An error occurred while splitting the PDF." + }, + "method": { + "label": "Choose split method", + "placeholder": "Select how to split the PDF" + }, "methods": { + "prefix": { + "splitAt": "Split at", + "splitBy": "Split by" + }, + "byPages": { + "name": "Page Numbers", + "desc": "Extract specific pages (1,3,5-10)", + "tooltip": "Enter page numbers separated by commas or ranges with hyphens" + }, + "bySections": { + "name": "Sections", + "desc": "Divide pages into grid sections", + "tooltip": "Split each page into horizontal and vertical sections" + }, "bySize": { - "name": "파ėŧ íŦ기" + "name": "파ėŧ íŦ기", + "desc": "Limit maximum file size", + "tooltip": "Specify maximum file size (e.g. 10MB, 500KB)" + }, + "byPageCount": { + "name": "Page Count", + "desc": "Fixed pages per file", + "tooltip": "Enter the number of pages for each split file" + }, + "byDocCount": { + "name": "Document Count", + "desc": "Create specific number of files", + "tooltip": "Enter how many files you want to create" + }, + "byChapters": { + "name": "Chapters", + "desc": "Split at bookmark boundaries", + "tooltip": "Uses PDF bookmarks to determine split points" + }, + "byPageDivider": { + "name": "Page Divider", + "desc": "Auto-split with divider sheets", + "tooltip": "Use QR code divider sheets between documents when scanning" } }, "value": { "fileSize": { - "label": "파ėŧ íŦ기" + "label": "파ėŧ íŦ기", + "placeholder": "e.g. 10MB, 500KB" + }, + "pageCount": { + "label": "Pages per File", + "placeholder": "e.g. 5, 10" + }, + "docCount": { + "label": "Number of Files", + "placeholder": "e.g. 3, 5" } - } + }, + "tooltip": { + "header": { + "title": "Split Methods Overview" + }, + "byPages": { + "title": "Split at Page Numbers", + "text": "Split your PDF at specific page numbers. Using 'n' splits after page n. Using 'n-m' splits before page n and after page m.", + "bullet1": "Single split points: 3,7 (splits after pages 3 and 7)", + "bullet2": "Range split points: 3-8 (splits before page 3 and after page 8)", + "bullet3": "Mixed: 2,5-10,15 (splits after page 2, before page 5, after page 10, and after page 15)" + }, + "bySections": { + "title": "Split by Grid Sections", + "text": "Divide each page into a grid of sections. Useful for splitting documents with multiple columns or extracting specific areas.", + "bullet1": "Horizontal: Number of rows to create", + "bullet2": "Vertical: Number of columns to create", + "bullet3": "Merge: Combine all sections into one PDF" + }, + "bySize": { + "title": "Split by File Size", + "text": "Create multiple PDFs that don't exceed a specified file size. Ideal for file size limitations or email attachments.", + "bullet1": "Use MB for larger files (e.g., 10MB)", + "bullet2": "Use KB for smaller files (e.g., 500KB)", + "bullet3": "System will split at page boundaries" + }, + "byCount": { + "title": "Split by Count", + "text": "Create multiple PDFs with a specific number of pages or documents each.", + "bullet1": "Page Count: Fixed number of pages per file", + "bullet2": "Document Count: Fixed number of output files", + "bullet3": "Useful for batch processing workflows" + }, + "byChapters": { + "title": "Split by Chapters", + "text": "Use PDF bookmarks to automatically split at chapter boundaries. Requires PDFs with bookmark structure.", + "bullet1": "Bookmark Level: Which level to split on (1=top level)", + "bullet2": "Include Metadata: Preserve document properties", + "bullet3": "Allow Duplicates: Handle repeated bookmark names" + }, + "byDocCount": { + "bullet1": "Enter the number of output files you want", + "bullet2": "Pages are distributed as evenly as possible", + "bullet3": "Useful when you need a specific number of files", + "text": "Create a specific number of output files by evenly distributing pages across them.", + "title": "Split by Document Count" + }, + "byPageCount": { + "bullet1": "Enter the number of pages per output file", + "bullet2": "Last file may have fewer pages if not evenly divisible", + "bullet3": "Useful for batch processing workflows", + "text": "Create multiple PDFs with a specific number of pages each. Perfect for creating uniform document chunks.", + "title": "Split by Page Count" + }, + "byPageDivider": { + "bullet1": "Print divider sheets from the download link", + "bullet2": "Insert divider sheets between your documents", + "bullet3": "Scan all documents together as one PDF", + "bullet4": "Upload - divider pages are automatically detected and removed", + "bullet5": "Enable Duplex Mode if scanning both sides of divider sheets", + "text": "Automatically split scanned documents using physical divider sheets with QR codes. Perfect for processing multiple documents scanned together.", + "title": "Split by Page Divider" + } + }, + "methodSelection": { + "tooltip": { + "bullet1": "Click on a method card to select it", + "bullet2": "Hover over each card to see a quick description", + "bullet3": "The settings step will appear after you select a method", + "bullet4": "You can change methods at any time before processing", + "header": { + "text": "Choose how you want to split your PDF document. Each method is optimized for different use cases and document types.", + "title": "Split Method Selection" + }, + "title": "Choose Your Split Method" + } + }, + "selectMethod": "Select a split method", + "tags": "íŽ˜ė´ė§€ ėž‘ė—…,나누기,멀티 íŽ˜ė´ė§€,ėžëĨ´ę¸°,ė„œë˛„ ė‚Ŧė´ë“œ" }, "rotate": { - "tags": "ė„œë˛„ ė‚Ŧė´ë“œ", "title": "PDF íšŒė „", + "submit": "íšŒė „", + "selectRotation": "Select Rotation Angle (Clockwise)", + "error": { + "failed": "An error occurred while rotating the PDF." + }, + "preview": { + "title": "Rotation Preview" + }, + "rotateLeft": "Rotate Anticlockwise", + "rotateRight": "Rotate Clockwise", + "tooltip": { + "header": { + "title": "Rotate Settings Overview" + }, + "description": { + "text": "Rotate your PDF pages clockwise or anticlockwise in 90-degree increments. All pages in the PDF will be rotated. The preview shows how your document will look after rotation." + }, + "controls": { + "title": "Controls", + "text": "Use the rotation buttons to adjust orientation. Left button rotates anticlockwise, right button rotates clockwise. Each click rotates by 90 degrees." + } + }, + "tags": "ė„œë˛„ ė‚Ŧė´ë“œ", "header": "PDF íšŒė „", - "selectAngle": "íšŒė „ 각도 ė„ íƒ (90도 ë‹¨ėœ„):", - "submit": "íšŒė „" + "selectAngle": "íšŒė „ 각도 ė„ íƒ (90도 ë‹¨ėœ„):" + }, + "convert": { + "title": "ëŗ€í™˜", + "desc": "Convert files between different formats", + "files": "Files", + "selectFilesPlaceholder": "Select files in the main view to get started", + "settings": "네렕", + "conversionCompleted": "Conversion completed", + "results": "Results", + "defaultFilename": "converted_file", + "conversionResults": "Conversion Results", + "convertFrom": "Convert from", + "convertTo": "Convert to", + "sourceFormatPlaceholder": "Source format", + "targetFormatPlaceholder": "Target format", + "selectSourceFormatFirst": "Select a source format first", + "outputOptions": "Output Options", + "pdfOptions": "PDF Options", + "imageOptions": "Image Options", + "colorType": "Colour Type", + "color": "ėƒ‰ėƒ", + "greyscale": "ęˇ¸ë ˆė´ėŠ¤ėŧ€ėŧ", + "blackwhite": "Black & White", + "dpi": "DPI", + "output": "Output", + "single": "Single", + "multiple": "Multiple", + "fitOption": "Fit Option", + "maintainAspectRatio": "Maintain Aspect Ratio", + "fitDocumentToPage": "Fit Document to Page", + "fillPage": "íŽ˜ė´ė§€ ėą„ėš°ę¸°", + "autoRotate": "Auto Rotate", + "autoRotateDescription": "Automatically rotate images to better fit the PDF page", + "combineImages": "Combine Images", + "combineImagesDescription": "Combine all images into one PDF, or create separate PDFs for each image", + "webOptions": "Web to PDF Options", + "zoomLevel": "Zoom Level", + "emailOptions": "Email to PDF Options", + "includeAttachments": "Include email attachments", + "maxAttachmentSize": "Maximum attachment size (MB)", + "includeAllRecipients": "Include CC and BCC recipients in header", + "downloadHtml": "Download HTML intermediate file instead of PDF", + "pdfaOptions": "PDF/A Options", + "outputFormat": "Output Format", + "pdfaNote": "PDF/A-1b is more compatible, PDF/A-2b supports more features.", + "pdfaDigitalSignatureWarning": "PDF뗐 ë””ė§€í„¸ ė„œëĒ…ė´ íŦí•¨ë˜ė–´ ėžˆėŠĩ니다. ë‹¤ėŒ ë‹¨ęŗ„ė—ė„œ ė œęą°ëŠë‹ˆë‹¤.", + "fileFormat": "File Format", + "wordDoc": "Word Document", + "wordDocExt": "Word Document (.docx)", + "odtExt": "OpenDocument Text (.odt)", + "pptExt": "PowerPoint (.pptx)", + "odpExt": "OpenDocument Presentation (.odp)", + "txtExt": "Plain Text (.txt)", + "rtfExt": "Rich Text Format (.rtf)", + "selectedFiles": "Selected files", + "noFileSelected": "No file selected. Use the file panel to add files.", + "convertFiles": "Convert Files", + "converting": "Converting...", + "downloadConverted": "Download Converted File", + "errorNoFiles": "Please select at least one file to convert.", + "errorNoFormat": "Please select both source and target formats.", + "errorNotSupported": "Conversion from {{from}} to {{to}} is not supported.", + "images": "Images", + "officeDocs": "Office Documents (Word, Excel, PowerPoint)", + "imagesExt": "Images (JPG, PNG, etc.)", + "markdown": "Markdown", + "textRtf": "Text/RTF", + "grayscale": "ęˇ¸ë ˆė´ėŠ¤ėŧ€ėŧ", + "errorConversion": "An error occurred while converting the file." }, "imageToPdf": { "tags": "ëŗ€í™˜,ė´ë¯¸ė§€,jpg,ė‚Ŧė§„" @@ -727,7 +1263,33 @@ "8": "ë§ˆė§€ë§‰ íŽ˜ė´ė§€ ė œęą°", "9": "ė˛Ģ íŽ˜ė´ė§€ė™€ ë§ˆė§€ë§‰ íŽ˜ė´ė§€ ė œęą°", "10": "í™€ėˆ˜-ė§ėˆ˜ ëŗ‘í•Š", - "11": "Duplicate all pages" + "11": "Duplicate all pages", + "desc": { + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, â€Ļ).", + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, â€Ļ).", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimized for binding on the side)." + } + }, + "desc": { + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, â€Ļ).", + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, â€Ļ).", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimised for binding on the side).", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document." }, "placeholder": "(똈: 1,3,2 또는 4-8,2,10-12 또는 2n-1)" }, @@ -739,9 +1301,198 @@ "upload": "ė´ë¯¸ė§€ ėļ”ę°€", "submit": "ė´ë¯¸ė§€ ėļ”ę°€" }, + "attachments": { + "tags": "embed,attach,file,attachment,attachments", + "title": "Add attachments", + "header": "Add attachments", + "add": "Add Attachment", + "remove": "Remove Attachment", + "embed": "Embed Attachment", + "submit": "Add attachments" + }, "watermark": { - "tags": "í…ėŠ¤íŠ¸,반ëŗĩ,ë ˆė´ë¸”,ė†Œėœ ,ė €ėž‘ęļŒ,ėƒí‘œ,ė´ë¯¸ė§€,jpg,ė‚Ŧė§„", "title": "ė›Œí„°ë§ˆíŦ ėļ”ę°€", + "desc": "Add text or image watermarks to PDF files", + "completed": "Watermark added", + "submit": "ė›Œí„°ë§ˆíŦ ėļ”ę°€", + "filenamePrefix": "watermarked", + "error": { + "failed": "An error occurred while adding watermark to the PDF." + }, + "watermarkType": { + "text": "í…ėŠ¤íŠ¸", + "image": "Image" + }, + "settings": { + "type": "Watermark Type", + "text": { + "label": "Watermark Text", + "placeholder": "Enter watermark text" + }, + "image": { + "label": "Watermark Image", + "choose": "Choose Image", + "selected": "Selected: {{filename}}" + }, + "fontSize": "글ęŧ´ íŦ기", + "size": "Size", + "alphabet": "Font/Language", + "color": "Watermark Colour", + "rotation": "Rotation (degrees)", + "opacity": "Opacity (%)", + "spacing": { + "horizontal": "Horizontal Spacing", + "vertical": "Vertical Spacing", + "height": "Height Spacing", + "width": "Width Spacing" + }, + "convertToImage": "Flatten PDF pages to images" + }, + "alphabet": { + "roman": "Roman/Latin", + "arabic": "Arabic", + "japanese": "Japanese", + "korean": "Korean", + "chinese": "Chinese", + "thai": "Thai" + }, + "steps": { + "type": "Watermark Type", + "wording": "Wording", + "textStyle": "Style", + "formatting": "Formatting", + "file": "Watermark File" + }, + "results": { + "title": "Watermark Results" + }, + "tooltip": { + "language": { + "title": "Language Support", + "text": "Choose the appropriate language setting to ensure proper font rendering for your text." + }, + "appearance": { + "title": "Appearance Settings", + "text": "Control how your watermark looks and blends with the document.", + "bullet1": "Rotation: -360° to 360° for angled watermarks", + "bullet2": "Opacity: 0-100% for transparency control", + "bullet3": "Lower opacity creates subtle watermarks" + }, + "spacing": { + "title": "Spacing Control", + "text": "Adjust the spacing between repeated watermarks across the page.", + "bullet1": "Width spacing: Horizontal distance between watermarks", + "bullet2": "Height spacing: Vertical distance between watermarks", + "bullet3": "Higher values create more spread out patterns" + }, + "type": { + "header": { + "title": "Watermark Type Selection" + }, + "description": { + "title": "Choose Your Watermark", + "text": "Select between text or image watermarks based on your needs." + }, + "text": { + "title": "Text Watermarks", + "text": "Perfect for adding copyright notices, company names, or confidentiality labels. Supports multiple languages and custom colours.", + "bullet1": "Customisable fonts and languages", + "bullet2": "Adjustable colours and transparency", + "bullet3": "Ideal for legal or branding text" + }, + "image": { + "title": "Image Watermarks", + "text": "Use logos, stamps, or any image as a watermark. Great for branding and visual identification.", + "bullet1": "Upload any image format", + "bullet2": "Maintains image quality", + "bullet3": "Perfect for logos and stamps" + } + }, + "wording": { + "header": { + "title": "Text Content" + }, + "text": { + "title": "Watermark Text", + "text": "Enter the text that will appear as your watermark across the document.", + "bullet1": "Keep it concise for better readability", + "bullet2": "Common examples: 'CONFIDENTIAL', 'DRAFT', company name", + "bullet3": "Emoji characters are not supported and will be filtered out" + } + }, + "textStyle": { + "header": { + "title": "Text Style" + }, + "color": { + "title": "Colour Selection", + "text": "Choose a colour that provides good contrast with your document content.", + "bullet1": "Light grey (#d3d3d3) for subtle watermarks", + "bullet2": "Black or dark colours for high contrast", + "bullet3": "Custom colours for branding purposes" + }, + "language": { + "title": "Language Support", + "text": "Choose the appropriate language setting to ensure proper font rendering." + } + }, + "file": { + "header": { + "title": "Image Upload" + }, + "upload": { + "title": "Image Selection", + "text": "Upload an image file to use as your watermark.", + "bullet1": "Supports common formats: PNG, JPG, GIF, BMP", + "bullet2": "PNG with transparency works best", + "bullet3": "Higher resolution images maintain quality better" + }, + "recommendations": { + "title": "Best Practices", + "text": "Tips for optimal image watermark results.", + "bullet1": "Use logos or stamps with transparent backgrounds", + "bullet2": "Simple designs work better than complex images", + "bullet3": "Consider the final document size when choosing resolution" + } + }, + "formatting": { + "header": { + "title": "Formatting & Layout" + }, + "size": { + "title": "Size Control", + "text": "Adjust the size of your watermark (text or image).", + "bullet1": "Larger sizes create more prominent watermarks" + }, + "appearance": { + "title": "Appearance Settings", + "text": "Control how your watermark looks and blends with the document.", + "bullet1": "Rotation: -360° to 360° for angled watermarks", + "bullet2": "Opacity: 0-100% for transparency control", + "bullet3": "Lower opacity creates subtle watermarks" + }, + "spacing": { + "title": "Spacing Control", + "text": "Adjust the spacing between repeated watermarks across the page.", + "bullet1": "Horizontal spacing: Distance between watermarks left to right", + "bullet2": "Vertical spacing: Distance between watermarks top to bottom", + "bullet3": "Higher values create more spread out patterns" + }, + "security": { + "title": "Security Option", + "text": "Convert the final PDF to an image-based format for enhanced security.", + "bullet1": "Prevents text selection and copying", + "bullet2": "Makes watermarks harder to remove", + "bullet3": "Results in larger file sizes", + "bullet4": "Best for sensitive or copyrighted content" + } + } + }, + "type": { + "1": "í…ėŠ¤íŠ¸", + "2": "ė´ë¯¸ė§€" + }, + "tags": "í…ėŠ¤íŠ¸,반ëŗĩ,ë ˆė´ë¸”,ė†Œėœ ,ė €ėž‘ęļŒ,ėƒí‘œ,ė´ë¯¸ė§€,jpg,ė‚Ŧė§„", "header": "ė›Œí„°ë§ˆíŦ ėļ”ę°€", "customColor": "ė‚ŦėšŠėž 맀렕 í…ėŠ¤íŠ¸ ėƒ‰ėƒ", "selectText": { @@ -755,17 +1506,6 @@ "8": "ė›Œí„°ë§ˆíŦ ėœ í˜•:", "9": "ė›Œí„°ë§ˆíŦ ė´ë¯¸ė§€:", "10": "PDFëĨŧ PDF-ė´ë¯¸ė§€ëĄœ ëŗ€í™˜" - }, - "submit": "ė›Œí„°ë§ˆíŦ ėļ”ę°€", - "type": { - "1": "í…ėŠ¤íŠ¸", - "2": "ė´ë¯¸ė§€" - }, - "watermarkType": { - "text": "í…ėŠ¤íŠ¸" - }, - "settings": { - "fontSize": "글ęŧ´ íŦ기" } }, "permissions": { @@ -790,50 +1530,201 @@ "removePages": { "tags": "íŽ˜ė´ė§€ ė œęą°,íŽ˜ė´ė§€ ė‚­ė œ", "title": "ė œęą°", + "pageNumbers": { + "label": "Pages to Remove", + "placeholder": "e.g., 1,3,5-8,10", + "error": "Invalid page number format. Use numbers, ranges (1-5), or mathematical expressions (2n+1)" + }, + "filenamePrefix": "pages_removed", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "settings": { + "title": "Settings" + }, + "tooltip": { + "header": { + "title": "Remove Pages Settings" + }, + "pageNumbers": { + "title": "Page Selection", + "text": "Specify which pages to remove from your PDF. You can select individual pages, ranges, or use mathematical expressions.", + "bullet1": "Individual pages: 1,3,5 (removes pages 1, 3, and 5)", + "bullet2": "Page ranges: 1-5,10-15 (removes pages 1-5 and 10-15)", + "bullet3": "Mathematical: 2n+1 (removes odd pages)", + "bullet4": "Open ranges: 5- (removes from page 5 to end)" + }, + "examples": { + "title": "Common Examples", + "text": "Here are some common page selection patterns:", + "bullet1": "Remove first page: 1", + "bullet2": "Remove last 3 pages: -3", + "bullet3": "Remove every other page: 2n", + "bullet4": "Remove specific scattered pages: 1,5,10,15" + }, + "safety": { + "title": "Safety Tips", + "text": "Important considerations when removing pages:", + "bullet1": "Always preview your selection before processing", + "bullet2": "Keep a backup of your original file", + "bullet3": "Page numbers start from 1, not 0", + "bullet4": "Invalid page numbers will be ignored" + } + }, + "error": { + "failed": "An error occurred whilst removing pages." + }, + "results": { + "title": "Page Removal Results" + }, "submit": "ė œęą°" }, - "addPassword": { - "tags": "ëŗ´ė•ˆ,ëŗ´ė•ˆ", - "title": "비밀번호 ėļ”ę°€", - "header": "비밀번호 ėļ”ę°€ (ė•”í˜¸í™”)", - "selectText": { - "1": "ė•”í˜¸í™”í•  PDF ė„ íƒ", - "2": "ė‚ŦėšŠėž 비밀번호", - "3": "ė•”í˜¸í™” 키 ę¸¸ė´", - "4": "ë†’ė€ ę°’ė´ 더 강ë Ĩí•˜ė§€ë§Œ ë‚Žė€ ę°’ė´ 더 ë‚˜ė€ í˜¸í™˜ė„ąė„ 렜ęŗĩ합니다.", - "5": "ė„¤ė •í•  ęļŒí•œ (ė†Œėœ ėž ëš„ë°€ë˛ˆí˜¸ė™€ 함ęģ˜ ė‚ŦėšŠ ęļŒėžĨ)", - "6": "ëŦ¸ė„œ ėĄ°ëĻŊ ë°Šė§€", - "7": "ėŊ˜í…ė¸  ėļ”ėļœ ë°Šė§€", - "8": "ė ‘ęˇŧė„ąė„ ėœ„í•œ ėļ”ėļœ ë°Šė§€", - "9": "ė–‘ė‹ ėž‘ė„ą ë°Šė§€", - "10": "ėˆ˜ė • ë°Šė§€", - "11": "ėŖŧė„ ėˆ˜ė • ë°Šė§€", - "12": "ė¸ė‡„ ë°Šė§€", - "13": "다ëĨ¸ í˜•ė‹ėœŧ로 ė¸ė‡„ ë°Šė§€", - "14": "ė†Œėœ ėž 비밀번호", - "15": "ëŦ¸ė„œę°€ ė—´ëϰ 후 ėˆ˜í–‰í•  눘 ėžˆëŠ” ėž‘ė—… ė œí•œ (ëĒ¨ë“  ëĻŦë”ė—ė„œ ė§€ė›ë˜ė§€ ė•ŠėŒ)", - "16": "ëŦ¸ė„œ ėžė˛´ 뗴揰 ė œí•œ" + "extractPages": { + "title": "Extract Pages", + "pageNumbers": { + "label": "Pages to Extract", + "placeholder": "e.g., 1,3,5-8 or odd & 1-10" + }, + "settings": { + "title": "Settings" }, - "submit": "ė•”í˜¸í™”", "tooltip": { - "permissions": { - "title": "ęļŒí•œ ëŗ€ę˛Ŋ" + "description": "Extracts the selected pages into a new PDF, preserving order." + }, + "error": { + "failed": "Failed to extract pages" + }, + "results": { + "title": "Pages Extracted" + }, + "submit": "Extract Pages" + }, + "pageSelection": { + "tooltip": { + "header": { + "title": "Page Selection Guide" + }, + "basic": { + "title": "Basic Usage", + "text": "Select specific pages from your PDF document using simple syntax.", + "bullet1": "Individual pages: 1,3,5", + "bullet2": "Page ranges: 3-6 or 10-15", + "bullet3": "All pages: all" + }, + "advanced": { + "title": "Advanced Features" + }, + "tips": { + "title": "Tips", + "text": "Keep these guidelines in mind:", + "bullet1": "Page numbers start from 1 (not 0)", + "bullet2": "Spaces are automatically removed", + "bullet3": "Invalid expressions are ignored" + }, + "syntax": { + "title": "Syntax Basics", + "text": "Use numbers, ranges, keywords, and progressions (n starts at 0). Parentheses are supported.", + "bullets": { + "numbers": "Numbers/ranges: 5, 10-20", + "keywords": "Keywords: odd, even", + "progressions": "Progressions: 3n, 4n+1" + } + }, + "operators": { + "title": "Operators", + "text": "AND has higher precedence than comma. NOT applies within the document range.", + "and": "AND: & or \"and\" — require both conditions (e.g., 1-50 & even)", + "comma": "Comma: , or | — combine selections (e.g., 1-10, 20)", + "not": "NOT: ! or \"not\" — exclude pages (e.g., 3n & not 30)" + }, + "examples": { + "title": "Examples" + }, + "complex": { + "bullet1": "1,3-5,8,2n → pages 1, 3–5, 8, plus evens", + "bullet2": "10-,2n-1 → from page 10 to end + odd pages", + "description": "Mix different types.", + "title": "Complex Combinations" + }, + "description": "Choose which pages to use for the operation. Supports single pages, ranges, formulas, and the all keyword.", + "individual": { + "bullet1": "1,3,5 → selects pages 1, 3, 5", + "bullet2": "2,7,12 → selects pages 2, 7, 12", + "description": "Enter numbers separated by commas.", + "title": "Individual Pages" + }, + "mathematical": { + "bullet1": "2n → all even pages (2, 4, 6â€Ļ)", + "bullet2": "2n-1 → all odd pages (1, 3, 5â€Ļ)", + "bullet3": "3n → every 3rd page (3, 6, 9â€Ļ)", + "bullet4": "4n-1 → pages 3, 7, 11, 15â€Ļ", + "description": "Use n in formulas for patterns.", + "title": "Mathematical Functions" + }, + "ranges": { + "bullet1": "3-6 → selects pages 3–6", + "bullet2": "10-15 → selects pages 10–15", + "bullet3": "5- → selects pages 5 to end", + "description": "Use - for consecutive pages.", + "title": "Page Ranges" + }, + "special": { + "bullet1": "all → selects all pages", + "title": "Special Keywords" } } }, - "removePassword": { - "tags": "ëŗ´ė•ˆ,ė•”í˜¸ í•´ė œ,ëŗ´ė•ˆ,비밀번호 í•´ė œ,비밀번호 ė‚­ė œ", - "title": "비밀번호 ė œęą°", - "header": "비밀번호 ė œęą° (ëŗĩ호화)", - "selectText": { - "1": "ëŗĩ호화할 PDF ė„ íƒ", - "2": "비밀번호" + "bulkSelection": { + "syntaxError": "There is a syntax issue. See Page Selection tips for help.", + "header": { + "title": "Page Selection Guide" }, - "submit": "ė œęą°", - "desc": "PDF ëŦ¸ė„œė—ė„œ 비밀번호 ëŗ´í˜¸ëĨŧ ė œęą°í•Šë‹ˆë‹¤.", - "password": { - "stepTitle": "비밀번호 ė œęą°", - "label": "현ėžŦ 비밀번호" + "syntax": { + "title": "Syntax Basics", + "text": "Use numbers, ranges, keywords, and progressions (n starts at 0). Parentheses are supported.", + "bullets": { + "numbers": "Numbers/ranges: 5, 10-20", + "keywords": "Keywords: odd, even", + "progressions": "Progressions: 3n, 4n+1" + } + }, + "operators": { + "title": "Operators", + "text": "AND has higher precedence than comma. NOT applies within the document range.", + "and": "AND: & or \"and\" — require both conditions (e.g., 1-50 & even)", + "comma": "Comma: , or | — combine selections (e.g., 1-10, 20)", + "not": "NOT: ! or \"not\" — exclude pages (e.g., 3n & not 30)" + }, + "examples": { + "title": "Examples", + "first50": "First 50", + "last50": "Last 50", + "every3rd": "Every 3rd", + "oddWithinExcluding": "Odd within 1-20 excluding 5-7", + "combineSets": "Combine sets" + }, + "firstNPages": { + "title": "First N Pages", + "placeholder": "Number of pages" + }, + "lastNPages": { + "title": "Last N Pages", + "placeholder": "Number of pages" + }, + "everyNthPage": { + "title": "Every Nth Page", + "placeholder": "Step size" + }, + "range": { + "title": "Range", + "fromPlaceholder": "From", + "toPlaceholder": "To" + }, + "keywords": { + "title": "Keywords" + }, + "advanced": { + "title": "Advanced" } }, "compressPdfs": { @@ -843,12 +1734,142 @@ "tags": "remove,delete,form,field,readonly", "title": "Remove Read-Only from Form Fields", "header": "Unlock PDF Forms", - "submit": "Remove" + "submit": "Remove", + "description": "This tool will remove read-only restrictions from PDF form fields, making them editable and fillable.", + "filenamePrefix": "unlocked_forms", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst unlocking PDF forms." + }, + "results": { + "title": "Unlocked Forms Results" + } }, "changeMetadata": { - "tags": "렜ëĒŠ,ė €ėž,ë‚ ė§œ,ėƒė„ą,ė‹œę°„,ėļœíŒė‚Ŧ,ė œėž‘ėž,í†ĩęŗ„", - "title": "렜ëĒŠ:", "header": "ëŠ”íƒ€ë°ė´í„° ëŗ€ę˛Ŋ", + "submit": "ëŗ€ę˛Ŋ", + "filenamePrefix": "metadata", + "settings": { + "title": "Metadata Settings" + }, + "standardFields": { + "title": "Standard Fields" + }, + "deleteAll": { + "label": "Remove Existing Metadata", + "checkbox": "Delete all metadata" + }, + "title": { + "label": "Title", + "placeholder": "Document title" + }, + "author": { + "label": "Author", + "placeholder": "Document author" + }, + "subject": { + "label": "Subject", + "placeholder": "Document subject" + }, + "keywords": { + "label": "Keywords", + "placeholder": "Document keywords" + }, + "creator": { + "label": "Creator", + "placeholder": "Document creator" + }, + "producer": { + "label": "Producer", + "placeholder": "Document producer" + }, + "dates": { + "title": "Date Fields" + }, + "creationDate": { + "label": "Creation Date", + "placeholder": "Creation date" + }, + "modificationDate": { + "label": "Modification Date", + "placeholder": "Modification date" + }, + "trapped": { + "label": "Trapped Status", + "unknown": "Unknown", + "true": "True", + "false": "False" + }, + "advanced": { + "title": "Advanced Options" + }, + "customFields": { + "title": "Custom Metadata", + "description": "Add custom metadata fields to the document", + "add": "Add Field", + "key": "Key", + "keyPlaceholder": "Custom key", + "value": "Value", + "valuePlaceholder": "Custom value", + "remove": "Remove" + }, + "results": { + "title": "Updated PDFs" + }, + "error": { + "failed": "An error occurred while changing the PDF metadata." + }, + "tooltip": { + "header": { + "title": "PDF Metadata Overview" + }, + "standardFields": { + "title": "Standard Fields", + "text": "Common PDF metadata fields that describe the document.", + "bullet1": "Title: Document name or heading", + "bullet2": "Author: Person who created the document", + "bullet3": "Subject: Brief description of content", + "bullet4": "Keywords: Search terms for the document", + "bullet5": "Creator/Producer: Software used to create the PDF" + }, + "dates": { + "title": "Date Fields", + "text": "When the document was created and modified.", + "bullet1": "Creation Date: When original document was made", + "bullet2": "Modification Date: When last changed" + }, + "options": { + "title": "Additional Options", + "text": "Custom fields and privacy controls.", + "bullet1": "Custom Metadata: Add your own key-value pairs", + "bullet2": "Trapped Status: High-quality printing setting", + "bullet3": "Delete All: Remove all metadata for privacy" + }, + "deleteAll": { + "title": "Remove Existing Metadata", + "text": "Complete metadata deletion to ensure privacy." + }, + "customFields": { + "title": "Custom Metadata", + "text": "Add your own custom key-value metadata pairs.", + "bullet1": "Add any custom fields relevant to your document", + "bullet2": "Examples: Department, Project, Version, Status", + "bullet3": "Both key and value are required for each entry" + }, + "advanced": { + "title": "Advanced Options", + "trapped": { + "title": "Trapped Status", + "description": "Indicates if document is prepared for high-quality printing.", + "bullet1": "True: Document has been trapped for printing", + "bullet2": "False: Document has not been trapped", + "bullet3": "Unknown: Trapped status is not specified" + } + } + }, + "tags": "렜ëĒŠ,ė €ėž,ë‚ ė§œ,ėƒė„ą,ė‹œę°„,ėļœíŒė‚Ŧ,ė œėž‘ėž,í†ĩęŗ„", "selectText": { "1": "ëŗ€ę˛Ŋ하려는 ëŗ€ėˆ˜ëĨŧ íŽ¸ė§‘í•˜ė„¸ėš”", "2": "ëĒ¨ë“  ëŠ”íƒ€ë°ė´í„° ė‚­ė œ", @@ -856,15 +1877,7 @@ "4": "기타 ëŠ”íƒ€ë°ė´í„°:", "5": "ė‚ŦėšŠėž 맀렕 ëŠ”íƒ€ë°ė´í„° 항ëĒŠ ėļ”ę°€" }, - "author": "ė €ėž:", - "creationDate": "ėƒė„ą ë‚ ė§œ (yyyy/MM/dd HH:mm:ss):", - "creator": "ėž‘ė„ąėž:", - "keywords": "í‚¤ė›Œë“œ:", - "modDate": "ėˆ˜ė • ë‚ ė§œ (yyyy/MM/dd HH:mm:ss):", - "producer": "ė œėž‘ėž:", - "subject": "렜ëĒŠ:", - "trapped": "트랩:", - "submit": "ëŗ€ę˛Ŋ" + "modDate": "ėˆ˜ė • ë‚ ė§œ (yyyy/MM/dd HH:mm:ss):" }, "fileToPDF": { "tags": "ëŗ€í™˜,í˜•ė‹,ëŦ¸ė„œ,ė‚Ŧė§„,ėŠŦëŧė´ë“œ,í…ėŠ¤íŠ¸,ëŗ€í™˜,똤í”ŧ늤,ëŦ¸ė„œ,ė›Œë“œ,ė—‘ė…€,íŒŒė›ŒíŦė¸íŠ¸", @@ -878,6 +1891,7 @@ "ocr": { "tags": "ė¸ė‹,í…ėŠ¤íŠ¸,ė´ë¯¸ė§€,늤ėē”,ėŊ기,ė‹ëŗ„,氐맀,íŽ¸ė§‘ 가ëŠĨ", "title": "OCR / 늤ėē” ė •ëĻŦ", + "desc": "늤ėē”ė„ ė •ëĻŦí•˜ęŗ  PDF 내 ė´ë¯¸ė§€ė—ė„œ í…ėŠ¤íŠ¸ëĨŧ ę°ė§€í•˜ė—Ŧ ë‹¤ė‹œ í…ėŠ¤íŠ¸ëĄœ ėļ”ę°€í•Šë‹ˆë‹¤.", "header": "늤ėē” ė •ëĻŦ / OCR (광학 ëŦ¸ėž ė¸ė‹)", "selectText": { "1": "PDFė—ė„œ ę°ė§€í•  떏떴 ė„ íƒ (현ėžŦ ę°ė§€ëœ 떏떴氀 ë‚˜ė—´ë¨):", @@ -896,23 +1910,89 @@ "help": "다ëĨ¸ 떏떴 ė‚ŦėšŠ 방법 및/또는 Dockerė—ė„œ ė‚ŦėšŠí•˜ė§€ ė•ŠëŠ” ë°Šë˛•ė— 대한 ëŦ¸ė„œëĨŧ ėŊė–´ëŗ´ė„¸ėš”", "credit": "ė´ ė„œëš„ėŠ¤ëŠ” OCRė„ ėœ„í•´ qpdf뙀 TesseractëĨŧ ė‚ŦėšŠí•Šë‹ˆë‹¤.", "submit": "OCR로 PDF 래ëĻŦ", - "desc": "늤ėē”ė„ ė •ëĻŦí•˜ęŗ  PDF 내 ė´ë¯¸ė§€ė—ė„œ í…ėŠ¤íŠ¸ëĨŧ ę°ė§€í•˜ė—Ŧ ë‹¤ė‹œ í…ėŠ¤íŠ¸ëĄœ ėļ”ę°€í•Šë‹ˆë‹¤.", + "operation": { + "submit": "Process OCR and Review" + }, + "results": { + "title": "OCR Results" + }, + "languagePicker": { + "additionalLanguages": "Looking for additional languages?", + "viewSetupGuide": "View setup guide →" + }, "settings": { "title": "네렕", "ocrMode": { - "label": "OCR ëĒ¨ë“œ" + "label": "OCR ëĒ¨ë“œ", + "auto": "Auto (skip text layers)", + "force": "Force (re-OCR all, replace text)", + "strict": "Strict (abort if text found)" }, "languages": { - "label": "떏떴" + "label": "떏떴", + "placeholder": "Select languages" + }, + "compatibilityMode": { + "label": "Compatibility Mode" + }, + "advancedOptions": { + "label": "Processing Options", + "sidecar": "Create a text file", + "deskew": "Deskew pages", + "clean": "Clean input file", + "cleanFinal": "Clean final output" } }, "tooltip": { + "header": { + "title": "OCR Settings Overview" + }, "mode": { - "title": "OCR ëĒ¨ë“œ" + "title": "OCR ëĒ¨ë“œ", + "text": "Optical Character Recognition (OCR) helps you turn scanned or screenshotted pages into text you can search, copy, or highlight.", + "bullet1": "Auto skips pages that already contain text layers.", + "bullet2": "Force re-OCRs every page and replaces all the text.", + "bullet3": "Strict halts if any selectable text is found." }, "languages": { - "title": "떏떴" + "title": "떏떴", + "text": "Improve OCR accuracy by specifying the expected languages. Choose one or more languages to guide detection." + }, + "output": { + "title": "Output", + "text": "Decide how you want the text output formatted:", + "bullet1": "Searchable PDF embeds text behind the original image.", + "bullet2": "HOCR XML returns a structured machine-readable file.", + "bullet3": "Plain-text sidecar creates a separate .txt file with raw content." + }, + "advanced": { + "header": { + "title": "Advanced OCR Processing" + }, + "compatibility": { + "title": "Compatibility Mode", + "text": "Uses OCR 'sandwich PDF' mode: results in larger files, but more reliable with certain languages and older PDF software. By default we use hOCR for smaller, modern PDFs." + }, + "sidecar": { + "title": "Create Text File", + "text": "Generates a separate .txt file alongside the PDF containing all extracted text content for easy access and processing." + }, + "deskew": { + "title": "Deskew Pages", + "text": "Automatically corrects skewed or tilted pages to improve OCR accuracy. Useful for scanned documents that weren't perfectly aligned." + }, + "clean": { + "title": "Clean Input File", + "text": "Preprocesses the input by removing noise, enhancing contrast, and optimising the image for better OCR recognition before processing." + }, + "cleanFinal": { + "title": "Clean Final Output", + "text": "Post-processes the final PDF by removing OCR artefacts and optimising the text layer for better readability and smaller file size." + } } + }, + "error": { + "failed": "OCR operation failed" } }, "extractImages": { @@ -921,7 +2001,13 @@ "header": "ė´ë¯¸ė§€ ėļ”ėļœ", "selectText": "ėļ”ėļœëœ ė´ë¯¸ė§€ëĨŧ ëŗ€í™˜í•  ė´ë¯¸ė§€ í˜•ė‹ ė„ íƒ", "allowDuplicates": "뤑ëŗĩ ė´ë¯¸ė§€ ė €ėžĨ", - "submit": "ėļ”ėļœ" + "submit": "ėļ”ėļœ", + "settings": { + "title": "Settings" + }, + "error": { + "failed": "An error occurred while extracting images from the PDF." + } }, "pdfToPDFA": { "tags": "ė•„ėš´ė´ë¸Œ,ėžĨ기,í‘œė¤€,ëŗ€í™˜,ė €ėžĨ,ëŗ´ėĄ´", @@ -993,17 +2079,53 @@ }, "info": "Pythonė´ ė„¤ėš˜ë˜ė–´ ėžˆė§€ ė•ŠėŠĩ니다. ė‹¤í–‰í•˜ëŠ” 데 í•„ėš”í•Šë‹ˆë‹¤." }, + "scannerImageSplit": { + "title": "Extracted Images", + "submit": "Extract Image Scans", + "error": { + "failed": "An error occurred while extracting image scans." + }, + "tooltip": { + "title": "Photo Splitter", + "whatThisDoes": "What this does", + "whatThisDoesDesc": "Automatically finds and extracts each photo from a scanned page or composite image—no manual cropping.", + "whenToUse": "When to use", + "useCase1": "Scan whole album pages in one go", + "useCase2": "Split flatbed batches into separate files", + "useCase3": "Break collages into individual photos", + "useCase4": "Pull photos from documents", + "quickFixes": "Quick fixes", + "problem1": "Photos not detected → increase Tolerance to 30-50", + "problem2": "Too many false detections → increase Minimum Area to 15,000-20,000", + "problem3": "Crops are too tight → increase Border Size to 5-10", + "problem4": "Tilted photos not straightened → lower Angle Threshold to ~5°", + "problem5": "Dust/noise boxes → increase Minimum Contour Area to 1000-2000", + "setupTips": "Setup tips", + "tip1": "Use a plain, light background", + "tip2": "Leave a small gap (≈1 cm) between photos", + "tip3": "Scan at 300-600 DPI", + "tip4": "Clean the scanner glass", + "headsUp": "Heads-up", + "headsUpDesc": "Overlapping photos or backgrounds very close in colour to the photos can reduce accuracy-try a lighter or darker background and leave more space." + } + }, "sign": { - "tags": "ėŠšė¸,ė´ë‹ˆė…œ,꡸ëϰ-ė„œëĒ…,í…ėŠ¤íŠ¸-ė„œëĒ…,ė´ë¯¸ė§€-ė„œëĒ…", "title": "ė„œëĒ…", "header": "PDF ė„œëĒ…", "upload": "ė´ë¯¸ė§€ ė—…ëĄœë“œ", - "draw": "ė„œëĒ… ꡸ëĻŦ기", - "text": "í…ėŠ¤íŠ¸ ėž…ë Ĩ", + "draw": { + "title": "Draw your signature", + "clear": "Clear" + }, + "text": { + "name": "Signer Name", + "placeholder": "Enter your full name" + }, "clear": "ė§€ėš°ę¸°", "add": "ėļ”ę°€", "saved": "ė €ėžĨ된 ė„œëĒ…", "save": "ė„œëĒ… ė €ėžĨ", + "applySignatures": "Apply Signatures", "personalSigs": "ę°œė¸ ė„œëĒ…", "sharedSigs": "ęŗĩ뜠 ė„œëĒ…", "noSavedSigs": "ė €ėžĨ된 ė„œëĒ…ė´ ė—†ėŠĩ니다", @@ -1015,42 +2137,179 @@ "previous": "ė´ė „ íŽ˜ė´ė§€", "maintainRatio": "ėĸ…횥뚄 ėœ ė§€ 토글", "undo": "Undo", - "redo": "Redo" + "redo": "Redo", + "submit": "Sign Document", + "steps": { + "configure": "Configure Signature" + }, + "type": { + "title": "Signature Type", + "draw": "Draw", + "canvas": "Canvas", + "image": "Image", + "text": "Text" + }, + "image": { + "label": "Upload signature image", + "placeholder": "Select image file", + "hint": "Upload a PNG or JPG image of your signature" + }, + "instructions": { + "title": "How to add signature", + "canvas": "After drawing your signature in the canvas, close the modal then click anywhere on the PDF to place it.", + "image": "After uploading your signature image above, click anywhere on the PDF to place it.", + "text": "After entering your name above, click anywhere on the PDF to place your signature." + }, + "mode": { + "move": "Move Signature", + "place": "Place Signature" + }, + "updateAndPlace": "Update and Place", + "activate": "Activate Signature Placement", + "deactivate": "Stop Placing Signatures", + "results": { + "title": "Signature Results" + }, + "error": { + "failed": "An error occurred while signing the PDF." + }, + "tags": "ėŠšė¸,ė´ë‹ˆė…œ,꡸ëϰ-ė„œëĒ…,í…ėŠ¤íŠ¸-ė„œëĒ…,ė´ë¯¸ė§€-ė„œëĒ…" }, "flatten": { - "tags": "렕렁,ëš„í™œė„ąí™”,비대화형,ę°„ė†Œí™”", "title": "평면화", "header": "PDF 평면화", "flattenOnlyForms": "ė–‘ė‹ë§Œ 평면화", "submit": "평면화", + "filenamePrefix": "flattened", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, "steps": { "settings": "네렕" }, "options": { - "flattenOnlyForms": "ė–‘ė‹ë§Œ 평면화" - } + "stepTitle": "Flatten Options", + "title": "Flatten Options", + "flattenOnlyForms": { + "label": "ė–‘ė‹ë§Œ 평면화", + "desc": "Only flatten form fields, leaving other interactive elements intact" + }, + "note": "Flattening removes interactive elements from the PDF, making them non-editable." + }, + "results": { + "title": "Flatten Results" + }, + "error": { + "failed": "An error occurred while flattening the PDF." + }, + "tooltip": { + "header": { + "title": "About Flattening PDFs" + }, + "description": { + "title": "What does flattening do?", + "text": "Flattening makes your PDF non-editable by turning fillable forms and buttons into regular text and images. The PDF will look exactly the same, but no one can change or fill in the forms anymore. Perfect for sharing completed forms, creating final documents for records, or ensuring the PDF looks the same everywhere.", + "bullet1": "Text boxes become regular text (can't be edited)", + "bullet2": "Checkboxes and buttons become pictures", + "bullet3": "Great for final versions you don't want changed", + "bullet4": "Ensures consistent appearance across all devices" + }, + "formsOnly": { + "title": "What does 'Flatten only forms' mean?", + "text": "This option only removes the ability to fill in forms, but keeps other features working like clicking links, viewing bookmarks, and reading comments.", + "bullet1": "Forms become non-editable", + "bullet2": "Links still work when clicked", + "bullet3": "Comments and notes remain visible", + "bullet4": "Bookmarks still help you navigate" + } + }, + "tags": "렕렁,ëš„í™œė„ąí™”,비대화형,ę°„ė†Œí™”" }, "repair": { "tags": "ėˆ˜ė •,ëŗĩ뛐,ęĩė •,ëŗĩęĩŦ", "title": "ëŗĩęĩŦ", "header": "PDF ëŗĩęĩŦ", - "submit": "ëŗĩęĩŦ" + "submit": "ëŗĩęĩŦ", + "description": "This tool will attempt to repair corrupted or damaged PDF files. No additional settings are required.", + "filenamePrefix": "repaired", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst repairing the PDF." + }, + "results": { + "title": "Repair Results" + } }, "removeBlanks": { - "tags": "ė •ëĻŦ,ę°„ė†Œí™”,비ėŊ˜í…ė¸ ,ė •ëĻŦ", "title": "뚈 íŽ˜ė´ė§€ ė œęą°", "header": "뚈 íŽ˜ė´ė§€ ė œęą°", - "threshold": "í”Ŋė…€ í°ėƒ‰ë„ ėž„ęŗ„ę°’:", + "settings": { + "title": "Settings" + }, + "threshold": { + "label": "Pixel Whiteness Threshold" + }, + "whitePercent": { + "label": "White Percentage Threshold", + "unit": "%" + }, + "includeBlankPages": { + "label": "Include detected blank pages" + }, + "tooltip": { + "header": { + "title": "Remove Blank Pages Settings" + }, + "threshold": { + "title": "Pixel Whiteness Threshold", + "text": "Controls how white a pixel must be to be considered 'white'. This helps determine what counts as a blank area on the page.", + "bullet1": "0 = Pure black (most restrictive)", + "bullet2": "128 = Medium grey", + "bullet3": "255 = Pure white (least restrictive)" + }, + "whitePercent": { + "title": "White Percentage Threshold", + "text": "Sets the minimum percentage of white pixels required for a page to be considered blank and removed.", + "bullet1": "Lower values (e.g., 80%) = More pages removed", + "bullet2": "Higher values (e.g., 95%) = Only very blank pages removed", + "bullet3": "Use higher values for documents with light backgrounds" + }, + "includeBlankPages": { + "title": "Include Detected Blank Pages", + "text": "When enabled, creates a separate PDF containing all the blank pages that were detected and removed from the original document.", + "bullet1": "Useful for reviewing what was removed", + "bullet2": "Helps verify the detection accuracy", + "bullet3": "Can be disabled to reduce output file size" + } + }, + "submit": "뚈 íŽ˜ė´ė§€ ė œęą°", + "error": { + "failed": "Failed to remove blank pages" + }, + "results": { + "title": "Removed Blank Pages" + }, + "tags": "ė •ëĻŦ,ę°„ė†Œí™”,비ėŊ˜í…ė¸ ,ė •ëĻŦ", "thresholdDesc": "í°ėƒ‰ í”Ŋė…€ė´ ė–ŧ마나 í°ėƒ‰ė´ė–´ė•ŧ 'í°ėƒ‰'ėœŧ로 ëļ„ëĨ˜ë ė§€ ę˛°ė •í•˜ëŠ” ėž„ęŗ„ę°’. 0 = 枀렕, 255 눜눘 í°ėƒ‰.", - "whitePercent": "í°ėƒ‰ ëš„ėœ¨ (%):", - "whitePercentDesc": "ė œęą°ë˜ę¸° ėœ„í•´ í•„ėš”í•œ 'í°ėƒ‰' í”Ŋė…€ė˜ íŽ˜ė´ė§€ ëš„ėœ¨", - "submit": "뚈 íŽ˜ė´ė§€ ė œęą°" + "whitePercentDesc": "ė œęą°ë˜ę¸° ėœ„í•´ í•„ėš”í•œ 'í°ėƒ‰' í”Ŋė…€ė˜ íŽ˜ė´ė§€ ëš„ėœ¨" }, "removeAnnotations": { "tags": "댓글,í•˜ė´ëŧė´íŠ¸,노트,마íŦė—…,ė œęą°", "title": "ėŖŧė„ ė œęą°", "header": "ėŖŧė„ ė œęą°", - "submit": "ė œęą°" + "submit": "ė œęą°", + "settings": { + "title": "Settings" + }, + "info": { + "title": "About Remove Annotations", + "description": "This tool will remove all annotations (comments, highlights, notes, etc.) from your PDF documents." + }, + "error": { + "failed": "An error occurred while removing annotations from the PDF." + } }, "compare": { "tags": "ė°¨ė´,ëŒ€ėĄ°,ëŗ€ę˛Ŋ,ëļ„ė„", @@ -1082,6 +2341,142 @@ "certSign": { "tags": "ė¸ėĻ,PEM,P12,ęŗĩė‹,ė•”í˜¸í™”", "title": "ė¸ėĻė„œ ė„œëĒ…", + "filenamePrefix": "signed", + "signMode": { + "stepTitle": "Sign Mode", + "tooltip": { + "header": { + "title": "About PDF Signatures" + }, + "overview": { + "title": "How signatures work", + "text": "Both modes seal the document (any edits are flagged as tampering) and record who/when/how for auditing. Viewer trust depends on the certificate chain." + }, + "manual": { + "title": "Manual - Bring your certificate", + "text": "Use your own certificate files for brand-aligned identity. Can display Trusted when your CA/chain is recognised.", + "use": "Use for: customer-facing, legal, compliance." + }, + "auto": { + "title": "Auto - Zero-setup, instant system seal", + "text": "Signs with a server self-signed certificate. Same tamper-evident seal and audit trail; typically shows Unverified in viewers.", + "use": "Use when: you need speed and consistent internal identity across reviews and records." + }, + "rule": { + "title": "Rule of thumb", + "text": "Need recipient Trusted status? Manual. Need a fast, tamper-evident seal and audit trail with no setup? Auto." + } + } + }, + "certTypeStep": { + "stepTitle": "Certificate Format" + }, + "certFiles": { + "stepTitle": "Certificate Files" + }, + "appearance": { + "stepTitle": "Signature Appearance", + "tooltip": { + "header": { + "title": "About Signature Appearance" + }, + "invisible": { + "title": "Invisible Signatures", + "text": "The signature is added to the PDF for security but won't be visible when viewing the document. Perfect for legal requirements without changing the document's appearance.", + "bullet1": "Provides security without visual changes", + "bullet2": "Meets legal requirements for digital signing", + "bullet3": "Doesn't affect document layout or design" + }, + "visible": { + "title": "Visible Signatures", + "text": "Shows a signature block on the PDF with your name, date, and optional details. Useful when you want readers to clearly see the document is signed.", + "bullet1": "Shows signer name and date on the document", + "bullet2": "Can include reason and location for signing", + "bullet3": "Choose which page to place the signature", + "bullet4": "Optional logo can be included" + } + }, + "invisible": "Invisible", + "options": { + "title": "Signature Details" + }, + "visible": "Visible" + }, + "sign": { + "submit": "Sign PDF", + "results": "Signed PDF" + }, + "error": { + "failed": "An error occurred whilst processing signatures." + }, + "tooltip": { + "header": { + "title": "About Managing Signatures" + }, + "overview": { + "title": "What can this tool do?", + "text": "This tool lets you check if your PDFs are digitally signed and add new digital signatures. Digital signatures prove who created or approved a document and show if it has been changed since signing.", + "bullet1": "Check existing signatures and their validity", + "bullet2": "View detailed information about signers and certificates", + "bullet3": "Add new digital signatures to secure your documents", + "bullet4": "Multiple files supported with easy navigation" + }, + "validation": { + "title": "Checking Signatures", + "text": "When you check signatures, the tool tells you if they're valid, who signed the document, when it was signed, and whether the document has been changed since signing.", + "bullet1": "Shows if signatures are valid or invalid", + "bullet2": "Displays signer information and signing date", + "bullet3": "Checks if the document was modified after signing", + "bullet4": "Can use custom certificates for verification" + }, + "signing": { + "title": "Adding Signatures", + "text": "To sign a PDF, you need a digital certificate (like PEM, PKCS12, or JKS). You can choose to make the signature visible on the document or keep it invisible for security only.", + "bullet1": "Supports PEM, PKCS12, JKS, and server certificate formats", + "bullet2": "Option to show or hide signature on the PDF", + "bullet3": "Add reason, location, and signer name", + "bullet4": "Choose which page to place visible signatures", + "bullet5": "Use server certificate for simple 'Sign with Stirling-PDF' option" + } + }, + "certType": { + "tooltip": { + "header": { + "title": "About Certificate Types" + }, + "what": { + "title": "What's a certificate?", + "text": "It's a secure ID for your signature that proves you signed. Unless you're required to sign via certificate, we recommend using another secure method like Type, Draw, or Upload." + }, + "which": { + "title": "Which option should I use?", + "text": "Choose the format that matches your certificate file:", + "bullet1": "PKCS#12 (.p12 / .pfx) – one combined file (most common)", + "bullet2": "PFX (.pfx) – Microsoft's version of PKCS12", + "bullet3": "PEM – separate private-key and certificate .pem files", + "bullet4": "JKS – Java .jks keystore for dev / CI-CD workflows" + }, + "convert": { + "title": "Key not listed?", + "text": "Convert your file to a Java keystore (.jks) with keytool, then pick JKS." + } + } + }, + "chooseCertificate": "Choose Certificate File", + "chooseJksFile": "Choose JKS File", + "chooseP12File": "Choose PKCS12 File", + "choosePfxFile": "Choose PFX File", + "choosePrivateKey": "Choose Private Key File", + "location": "ėœ„ėš˜", + "logoTitle": "Logo", + "name": "ė´ëĻ„", + "noLogo": "No Logo", + "pageNumber": "Page Number", + "password": "í‚¤ėŠ¤í† ė–´ 또는 ę°œė¸ 키 비밀번호 ėž…ë Ĩ (ėžˆëŠ” ę˛Ŋ뚰):", + "passwordOptional": "Leave empty if no password", + "reason": "ė‚Ŧ뜠", + "serverCertMessage": "Using server certificate - no files or password required", + "showLogo": "ëĄœęŗ  í‘œė‹œ", "header": "ė¸ėĻė„œëĄœ PDF ė„œëĒ… (개발 뤑)", "selectPDF": "ė„œëĒ…í•  PDF 파ėŧ ė„ íƒ:", "jksNote": "및溠: ė¸ėĻė„œ ėœ í˜•ė´ ė•„ëž˜ė— ë‚˜ė—´ë˜ė§€ ė•Šė€ ę˛Ŋ뚰 keytool ëĒ…ë šė¤„ 도ęĩŦëĨŧ ė‚ŦėšŠí•˜ė—Ŧ Java í‚¤ėŠ¤í† ė–´(.jks) 파ėŧ로 ëŗ€í™˜í•œ ë‹¤ėŒ ė•„ëž˜ė˜ .jks 파ėŧ ė˜ĩė…˜ė„ ė„ íƒí•˜ė„¸ėš”.", @@ -1089,13 +2484,7 @@ "selectCert": "ė¸ėĻė„œ 파ėŧ ė„ íƒ (X.509 í˜•ė‹, .pem 또는 .der):", "selectP12": "PKCS#12 í‚¤ėŠ¤í† ė–´ 파ėŧ ė„ íƒ (.p12 또는 .pfx) (ė„ íƒ ė‚Ŧ항, 렜ęŗĩ하는 ę˛Ŋ뚰 ę°œė¸ í‚¤ė™€ ė¸ėĻė„œ íŦ함):", "selectJKS": "Java í‚¤ėŠ¤í† ė–´ 파ėŧ ė„ íƒ (.jks 또는 .keystore):", - "certType": "ė¸ėĻė„œ ėœ í˜•", - "password": "í‚¤ėŠ¤í† ė–´ 또는 ę°œė¸ 키 비밀번호 ėž…ë Ĩ (ėžˆëŠ” ę˛Ŋ뚰):", "showSig": "ė„œëĒ… í‘œė‹œ", - "reason": "ė‚Ŧ뜠", - "location": "ėœ„ėš˜", - "name": "ė´ëĻ„", - "showLogo": "ëĄœęŗ  í‘œė‹œ", "submit": "PDF ė„œëĒ…" }, "removeCertSign": { @@ -1103,7 +2492,18 @@ "title": "ė¸ėĻė„œ ė„œëĒ… ė œęą°", "header": "PDFė—ė„œ ë””ė§€í„¸ ė„œëĒ… ė œęą°", "selectPDF": "PDF 파ėŧ ė„ íƒ:", - "submit": "ė„œëĒ… ė œęą°" + "submit": "ė„œëĒ… ė œęą°", + "description": "This tool will remove digital certificate signatures from your PDF document.", + "filenamePrefix": "unsigned", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst removing certificate signatures." + }, + "results": { + "title": "Certificate Removal Results" + } }, "pageLayout": { "tags": "ëŗ‘í•Š,í•Šė„ą,단ėŧ-ëŗ´ę¸°,ė •ëĻŦ", @@ -1111,16 +2511,157 @@ "header": "ë‹¤ė¤‘ íŽ˜ė´ė§€ ë ˆė´ė•„ė›ƒ", "pagesPerSheet": "ė‹œíŠ¸ë‹š íŽ˜ė´ė§€ 눘:", "addBorder": "테두ëĻŦ ėļ”ę°€", - "submit": "렜ėļœ" + "submit": "렜ėļœ", + "desc": { + "2": "Place 2 pages side-by-side on a single sheet.", + "3": "Place 3 pages on a single sheet in a single row.", + "4": "Place 4 pages on a single sheet (2 × 2 grid).", + "9": "Place 9 pages on a single sheet (3 × 3 grid).", + "16": "Place 16 pages on a single sheet (4 × 4 grid)." + }, + "error": { + "failed": "An error occurred while creating the multi-page layout." + } + }, + "bookletImposition": { + "tags": "booklet,imposition,printing,binding,folding,signature", + "title": "Booklet Imposition", + "header": "Booklet Imposition", + "submit": "Create Booklet", + "spineLocation": { + "label": "Spine Location", + "left": "Left (Standard)", + "right": "Right (RTL)" + }, + "doubleSided": { + "label": "Double-sided printing", + "tooltip": "Creates both front and back sides for proper booklet printing" + }, + "manualDuplex": { + "title": "Manual Duplex Mode", + "instructions": "For printers without automatic duplex. You'll need to run this twice:" + }, + "duplexPass": { + "label": "Print Pass", + "first": "1st Pass", + "second": "2nd Pass", + "firstInstructions": "Prints front sides → stack face-down → run again with 2nd Pass", + "secondInstructions": "Load printed stack face-down → prints back sides" + }, + "rtlBinding": { + "label": "Right-to-left binding", + "tooltip": "For Arabic, Hebrew, or other right-to-left languages" + }, + "addBorder": { + "label": "Add borders around pages", + "tooltip": "Adds borders around each page section to help with cutting and alignment" + }, + "addGutter": { + "label": "Add gutter margin", + "tooltip": "Adds inner margin space for binding" + }, + "gutterSize": { + "label": "Gutter size (points)" + }, + "flipOnShortEdge": { + "label": "Flip on short edge (automatic duplex only)", + "tooltip": "Enable for short-edge duplex printing (automatic duplex only - ignored in manual mode)", + "manualNote": "Not needed in manual mode - you flip the stack yourself" + }, + "advanced": { + "toggle": "Advanced Options" + }, + "paperSizeNote": "Paper size is automatically derived from your first page.", + "tooltip": { + "header": { + "title": "Booklet Creation Guide" + }, + "description": { + "title": "What is Booklet Imposition?", + "text": "Creates professional booklets by arranging pages in the correct printing order. Your PDF pages are placed 2-up on landscape sheets so when folded and bound, they read in proper sequence like a real book." + }, + "example": { + "title": "Example: 8-Page Booklet", + "text": "Your 8-page document becomes 2 sheets:", + "bullet1": "Sheet 1 Front: Pages 8, 1 | Back: Pages 2, 7", + "bullet2": "Sheet 2 Front: Pages 6, 3 | Back: Pages 4, 5", + "bullet3": "When folded & stacked: Reads 1→2→3→4→5→6→7→8" + }, + "printing": { + "title": "How to Print & Assemble", + "text": "Follow these steps for perfect booklets:", + "bullet1": "Print double-sided with 'Flip on long edge'", + "bullet2": "Stack sheets in order, fold in half", + "bullet3": "Staple or bind along the folded spine", + "bullet4": "For short-edge printers: Enable 'Flip on short edge' option" + }, + "manualDuplex": { + "title": "Manual Duplex (Single-sided Printers)", + "text": "For printers without automatic duplex:", + "bullet1": "Turn OFF 'Double-sided printing'", + "bullet2": "Select '1st Pass' → Print → Stack face-down", + "bullet3": "Select '2nd Pass' → Load stack → Print backs", + "bullet4": "Fold and assemble as normal" + }, + "advanced": { + "title": "Advanced Options", + "text": "Fine-tune your booklet:", + "bullet1": "Right-to-Left Binding: For Arabic, Hebrew, or RTL languages", + "bullet2": "Borders: Shows cut lines for trimming", + "bullet3": "Gutter Margin: Adds space for binding/stapling", + "bullet4": "Short-edge Flip: Only for automatic duplex printers" + } + }, + "error": { + "failed": "An error occurred while creating the booklet imposition." + } }, "scalePages": { - "tags": "íŦę¸°ėĄ°ė •,ėˆ˜ė •,ėš˜ėˆ˜,ėĄ°ė •", "title": "íŽ˜ė´ė§€ íŦ기 ėĄ°ė •", "header": "íŽ˜ė´ė§€ íŦ기 ėĄ°ė •", "pageSize": "ëŦ¸ė„œ íŽ˜ė´ė§€ė˜ íŦę¸°ėž…ë‹ˆë‹¤.", "keepPageSize": "ė›ëŗ¸ íŦ기", "scaleFactor": "íŽ˜ė´ė§€ė˜ 확대/ėļ•ė†Œ 레벨(ėž˜ëŧ내기).", - "submit": "렜ėļœ" + "submit": "렜ėļœ", + "tags": "íŦę¸°ėĄ°ė •,ėˆ˜ė •,ėš˜ėˆ˜,ėĄ°ė •" + }, + "adjustPageScale": { + "tags": "resize,modify,dimension,adapt", + "title": "Adjust Page Scale", + "header": "Adjust Page Scale", + "scaleFactor": { + "label": "Scale Factor" + }, + "pageSize": { + "label": "Target Page Size", + "keep": "Keep Original Size", + "letter": "Letter", + "legal": "Legal" + }, + "submit": "Adjust Page Scale", + "error": { + "failed": "An error occurred while adjusting the page scale." + }, + "tooltip": { + "header": { + "title": "Page Scale Settings Overview" + }, + "description": { + "title": "Description", + "text": "Adjust the size of PDF content and change the page dimensions." + }, + "scaleFactor": { + "title": "Scale Factor", + "text": "Controls how large or small the content appears on the page. Content is scaled and centred - if scaled content is larger than the page size, it may be cropped.", + "bullet1": "1.0 = Original size", + "bullet2": "0.5 = Half size (50% smaller)", + "bullet3": "2.0 = Double size (200% larger, may crop)" + }, + "pageSize": { + "title": "Target Page Size", + "text": "Sets the dimensions of the output PDF pages. 'Keep Original Size' maintains current dimensions, whilst other options resize to standard paper sizes." + } + } }, "add-page-numbers": { "tags": "íŽ˜ė´ė§€ë§¤ęš€,ë ˆė´ë¸”,ė •ëĻŦ,ėƒ‰ė¸" @@ -1129,16 +2670,83 @@ "tags": "ėžë™-氐맀,헤더-기반,ė •ëĻŦ,ėžŦë ˆė´ë¸”ë§", "title": "ėžë™ ė´ëĻ„ ëŗ€ę˛Ŋ", "header": "PDF ėžë™ ė´ëĻ„ ëŗ€ę˛Ŋ", - "submit": "ėžë™ ė´ëĻ„ ëŗ€ę˛Ŋ" + "description": "Automatically finds the title from your PDF content and uses it as the filename.", + "submit": "ėžë™ ė´ëĻ„ ëŗ€ę˛Ŋ", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst auto-renaming the PDF." + }, + "results": { + "title": "Auto-Rename Results" + }, + "tooltip": { + "header": { + "title": "How Auto-Rename Works" + }, + "howItWorks": { + "title": "Smart Renaming", + "text": "Automatically finds the title from your PDF content and uses it as the filename.", + "bullet1": "Looks for text that appears to be a title or heading", + "bullet2": "Creates a clean, valid filename from the detected title", + "bullet3": "Keeps the original name if no suitable title is found" + } + } }, "adjust-contrast": { "tags": "ėƒ‰ėƒ-ëŗ´ė •,ėĄ°ė •,ėˆ˜ė •,í–Ĩ냁" }, "crop": { - "tags": "트ëĻŧ,ėļ•ė†Œ,íŽ¸ė§‘,ëǍ떑", "title": "ėžëĨ´ę¸°", "header": "PDF ėžëĨ´ę¸°", - "submit": "렜ėļœ" + "submit": "렜ėļœ", + "noFileSelected": "Select a PDF file to begin cropping", + "preview": { + "title": "Crop Area Selection" + }, + "reset": "Reset to full PDF", + "coordinates": { + "title": "Position and Size", + "x": { + "label": "X Position", + "desc": "Left edge (points)" + }, + "y": { + "label": "Y Position", + "desc": "Bottom edge (points)" + }, + "width": { + "label": "Width", + "desc": "Crop width (points)" + }, + "height": { + "label": "Height", + "desc": "Crop height (points)" + } + }, + "error": { + "invalidArea": "Crop area extends beyond PDF boundaries", + "failed": "Failed to crop PDF" + }, + "steps": { + "selectArea": "Select Crop Area" + }, + "tooltip": { + "title": "How to Crop PDFs", + "description": "Select the area to crop from your PDF by dragging and resizing the blue overlay on the thumbnail.", + "drag": "Drag the overlay to move the crop area", + "resize": "Drag the corner and edge handles to resize", + "precision": "Use coordinate inputs for precise positioning" + }, + "results": { + "title": "Crop Results" + }, + "automation": { + "info": "Enter crop coordinates in PDF points. Origin (0,0) is at bottom-left. These values will be applied to all PDFs processed in this automation.", + "reference": "Reference: A4 page is 595.28 × 841.89 points (210mm × 297mm). 1 inch = 72 points." + }, + "tags": "트ëĻŧ,ėļ•ė†Œ,íŽ¸ė§‘,ëǍ떑" }, "autoSplitPDF": { "tags": "QR-기반,ëļ„ëĻŦ,늤ėē”-넏掏ë¨ŧ트,ė •ëĻŦ", @@ -1221,24 +2829,124 @@ "downloadJS": "JavaScript ë‹¤ėš´ëĄœë“œ", "submit": "ëŗ´ę¸°" }, - "autoRedact": { - "tags": "枀뗴,ėˆ¨ęš€,검게-가ëĻŧ,ę˛€ė€ėƒ‰,마ėģ¤,ėˆ¨ęš€", - "title": "ėžë™ 枀뗴", - "header": "ėžë™ 枀뗴", - "colorLabel": "ėƒ‰ėƒ", - "textsToRedactLabel": "ę˛€ė—´í•  í…ėŠ¤íŠ¸ (뤄 ë‹¨ėœ„ëĄœ ęĩŦëļ„)", - "textsToRedactPlaceholder": "똈: \\n기밀 \\nėĩœęŗ  기밀", - "useRegexLabel": "ė •ęˇœė‹ ė‚ŦėšŠ", - "wholeWordSearchLabel": "렄랴 ë‹¨ė–´ ę˛€ėƒ‰", - "customPaddingLabel": "ė‚ŦėšŠėž 맀렕 ė—Ŧë°ą", - "convertPDFToImageLabel": "PDFëĨŧ PDF-Image로 ëŗ€í™˜ (ë°•ėŠ¤ ë’¤ė˜ í…ėŠ¤íŠ¸ ė œęą°ė— ė‚ŦėšŠ)", - "submitButton": "렜ėļœ" - }, "redact": { "tags": "枀뗴,ėˆ¨ęš€,검게-가ëĻŧ,ę˛€ė€ėƒ‰,마ėģ¤,ėˆ¨ęš€,ėˆ˜ë™", "title": "ėˆ˜ë™ 枀뗴", - "header": "ėˆ˜ë™ 枀뗴", "submit": "枀뗴", + "error": { + "failed": "An error occurred while redacting the PDF." + }, + "modeSelector": { + "title": "Redaction Method", + "mode": "Mode", + "automatic": "Automatic", + "automaticDesc": "Redact text based on search terms", + "manual": "Manual", + "manualDesc": "Click and drag to redact specific areas", + "manualComingSoon": "Manual redaction coming soon" + }, + "auto": { + "header": "Auto Redact", + "settings": { + "title": "Redaction Settings", + "advancedTitle": "溠揉" + }, + "colorLabel": "Box Colour", + "wordsToRedact": { + "title": "Words to Redact", + "placeholder": "Enter a word", + "add": "ėļ”ę°€", + "examples": "Examples: Confidential, Top-Secret" + }, + "useRegexLabel": "Use Regex", + "wholeWordSearchLabel": "Whole Word Search", + "customPaddingLabel": "Custom Extra Padding", + "convertPDFToImageLabel": "Convert PDF to PDF-Image" + }, + "tooltip": { + "mode": { + "header": { + "title": "Redaction Method" + }, + "automatic": { + "title": "Automatic Redaction", + "text": "Automatically finds and redacts specified text throughout the document. Perfect for removing consistent sensitive information like names, addresses, or confidential markers." + }, + "manual": { + "title": "Manual Redaction", + "text": "Click and drag to manually select specific areas to redact. Gives you precise control over what gets redacted. (Coming soon)" + } + }, + "words": { + "header": { + "title": "Words to Redact" + }, + "description": { + "title": "Text Matching", + "text": "Enter words or phrases to find and redact in your document. Each word will be searched for separately." + }, + "bullet1": "Add one word at a time", + "bullet2": "Press Enter or click 'Add Another' to add", + "bullet3": "Click × to remove words", + "examples": { + "title": "Common Examples", + "text": "Typical words to redact include: bank details, email addresses, or specific names." + } + }, + "advanced": { + "header": { + "title": "Advanced Redaction Settings" + }, + "color": { + "title": "Box Colour & Padding", + "text": "Customise the appearance of redaction boxes. Black is standard, but you can choose any colour. Padding adds extra space around the found text." + }, + "regex": { + "title": "Use Regex", + "text": "Enable regular expressions for advanced pattern matching. Useful for finding phone numbers, emails, or complex patterns.", + "bullet1": "Example: \\d{4}-\\d{2}-\\d{2} to match any dates in YYYY-MM-DD format", + "bullet2": "Use with caution - test thoroughly" + }, + "wholeWord": { + "title": "Whole Word Search", + "text": "Only match complete words, not partial matches. 'John' won't match 'Johnson' when enabled." + }, + "convert": { + "title": "Convert to PDF-Image", + "text": "Converts the PDF to an image-based PDF after redaction. This ensures text behind redaction boxes is completely removed and unrecoverable." + } + } + }, + "manual": { + "header": "Manual Redaction", + "textBasedRedaction": "Text-based Redaction", + "pageBasedRedaction": "Page-based Redaction", + "convertPDFToImageLabel": "Convert PDF to PDF-Image (Used to remove text behind the box)", + "pageRedactionNumbers": { + "title": "íŽ˜ė´ė§€", + "placeholder": "(똈: 1,2,8 또는 4,7,12-16 또는 2n-1)" + }, + "redactionColor": { + "title": "Redaction Colour" + }, + "export": "ë‚´ëŗ´ë‚´ę¸°", + "upload": "Upload", + "boxRedaction": "Box draw redaction", + "zoom": "Zoom", + "zoomIn": "Zoom in", + "zoomOut": "Zoom out", + "nextPage": "Next Page", + "previousPage": "Previous Page", + "toggleSidebar": "Toggle Sidebar", + "showThumbnails": "Show Thumbnails", + "showDocumentOutline": "Show Document Outline (double-click to expand/collapse all items)", + "showAttachments": "Show Attachments", + "showLayers": "Show Layers (double-click to reset all layers to the default state)", + "colourPicker": "Colour Picker", + "findCurrentOutlineItem": "Find current outline item", + "applyChanges": "Apply Changes" + }, + "header": "ėˆ˜ë™ 枀뗴", "textBasedRedaction": "í…ėŠ¤íŠ¸ 기반 枀뗴", "pageBasedRedaction": "íŽ˜ė´ė§€ 기반 枀뗴", "convertPDFToImageLabel": "PDFëĨŧ PDF-ė´ë¯¸ė§€ëĄœ ëŗ€í™˜ (ë°•ėŠ¤ ë’¤ė˜ í…ėŠ¤íŠ¸ ė œęą°ė— ė‚ŦėšŠ)", @@ -1264,22 +2972,7 @@ "showLayers": "ë ˆė´ė–´ ëŗ´ę¸° (더블클ëĻ­í•˜ė—Ŧ ëĒ¨ë“  ë ˆė´ė–´ëĨŧ ę¸°ëŗ¸ ėƒíƒœëĄœ ėžŦ네렕)", "colourPicker": "ėƒ‰ėƒ ė„ íƒę¸°", "findCurrentOutlineItem": "현ėžŦ ę°œėš” 항ëĒŠ ė°žę¸°", - "applyChanges": "Apply Changes", - "auto": { - "settings": { - "advancedTitle": "溠揉" - }, - "wordsToRedact": { - "add": "ėļ”ę°€" - } - }, - "manual": { - "pageRedactionNumbers": { - "title": "íŽ˜ė´ė§€", - "placeholder": "(똈: 1,2,8 또는 4,7,12-16 또는 2n-1)" - }, - "export": "ë‚´ëŗ´ë‚´ę¸°" - } + "applyChanges": "Apply Changes" }, "tableExtraxt": { "tags": "CSV,í…Œė´ë¸”-ėļ”ėļœ,ėļ”ėļœ,ëŗ€í™˜" @@ -1290,11 +2983,15 @@ "overlay-pdfs": { "tags": "ė˜¤ë˛„ë ˆė´", "header": "PDF 파ėŧ ė˜¤ë˛„ë ˆė´", + "title": "Overlay PDFs", + "desc": "Overlay one PDF on top of another", "baseFile": { "label": "ę¸°ëŗ¸ PDF 파ėŧ ė„ íƒ" }, "overlayFiles": { - "label": "ė˜¤ë˛„ë ˆė´ PDF 파ėŧ ė„ íƒ" + "label": "ė˜¤ë˛„ë ˆė´ PDF 파ėŧ ė„ íƒ", + "placeholder": "Choose PDF(s)...", + "addMore": "Add more PDFs..." }, "mode": { "label": "ė˜¤ë˛„ë ˆė´ ëĒ¨ë“œ ė„ íƒ", @@ -1304,14 +3001,53 @@ }, "counts": { "label": "ė˜¤ë˛„ë ˆė´ íšŸėˆ˜ (ęŗ ė • 반ëŗĩ ëĒ¨ë“œėšŠ)", - "placeholder": "ė‰ŧ표로 ęĩŦëļ„된 íšŸėˆ˜ ėž…ë Ĩ (똈: 2,3,1)" + "placeholder": "ė‰ŧ표로 ęĩŦëļ„된 íšŸėˆ˜ ėž…ë Ĩ (똈: 2,3,1)", + "item": "Count for file", + "noFiles": "Add overlay files to configure counts" }, "position": { "label": "ė˜¤ë˛„ë ˆė´ ėœ„ėš˜ ė„ íƒ", "foreground": "ė „ę˛Ŋ", "background": "ë°°ę˛Ŋ" }, - "submit": "렜ėļœ" + "submit": "렜ėļœ", + "settings": { + "title": "Settings" + }, + "results": { + "title": "Overlay Results" + }, + "tooltip": { + "header": { + "title": "Overlay PDFs Overview" + }, + "description": { + "title": "Description", + "text": "Combine a base PDF with one or more overlay PDFs. Overlays can be applied page-by-page in different modes and placed in the foreground or background." + }, + "mode": { + "title": "Overlay Mode", + "text": "Choose how to distribute overlay pages across the base PDF pages.", + "sequential": "Sequential Overlay: Use pages from the first overlay PDF until it ends, then move to the next.", + "interleaved": "Interleaved Overlay: Take one page from each overlay in turn.", + "fixedRepeat": "Fixed Repeat Overlay: Take a set number of pages from each overlay before moving to the next. Use Counts to set the numbers." + }, + "position": { + "title": "Overlay Position", + "text": "Foreground places the overlay on top of the page. Background places it behind." + }, + "overlayFiles": { + "title": "Overlay Files", + "text": "Select one or more PDFs to overlay on the base. The order of these files affects how pages are applied in Sequential and Fixed Repeat modes." + }, + "counts": { + "title": "Counts (Fixed Repeat only)", + "text": "Provide a positive number for each overlay file showing how many pages to take before moving to the next. Required when mode is Fixed Repeat." + } + }, + "error": { + "failed": "An error occurred while overlaying PDFs." + } }, "split-by-sections": { "tags": "ė„šė…˜ ëļ„í• ,나누기,ė‚ŦėšŠėž 맀렕", @@ -1332,6 +3068,7 @@ "tags": "늤íƒŦ프,ė´ë¯¸ė§€ ėļ”ę°€,뤑땙 ė´ë¯¸ė§€,ė›Œí„°ë§ˆíŦ,PDF,ė‚Ŋėž…,ė‚ŦėšŠėž 맀렕", "header": "PDF 늤íƒŦ프", "title": "PDF 늤íƒŦ프", + "stampSetup": "Stamp Setup", "stampType": "늤íƒŦ프 ėœ í˜•", "stampText": "늤íƒŦ프 í…ėŠ¤íŠ¸", "stampImage": "늤íƒŦ프 ė´ë¯¸ė§€", @@ -1344,7 +3081,19 @@ "overrideY": "Y ėĸŒí‘œ ėžŦė •ė˜", "customMargin": "ė‚ŦėšŠėž 맀렕 ė—Ŧë°ą", "customColor": "ė‚ŦėšŠėž 맀렕 í…ėŠ¤íŠ¸ ėƒ‰ėƒ", - "submit": "렜ėļœ" + "submit": "렜ėļœ", + "noStampSelected": "No stamp selected. Return to Step 1.", + "customPosition": "Drag the stamp to the desired location in the preview window.", + "error": { + "failed": "An error occurred while adding stamp to the PDF." + }, + "imageSize": "Image Size", + "margin": "Margin", + "positionAndFormatting": "Position & Formatting", + "quickPosition": "Select a position on the page to place the stamp.", + "results": { + "title": "Stamp Results" + } }, "removeImagePdf": { "tags": "ė´ë¯¸ė§€ ė œęą°,íŽ˜ė´ė§€ ėž‘ė—…,ë°ąė—”ë“œ,ė„œë˛„ ė‚Ŧė´ë“œ" @@ -1362,7 +3111,8 @@ "status": { "_value": "ėƒíƒœ", "valid": "ėœ íš¨í•¨", - "invalid": "ėœ íš¨í•˜ė§€ ė•ŠėŒ" + "invalid": "ėœ íš¨í•˜ė§€ ė•ŠėŒ", + "complete": "Validation complete" }, "signer": "ė„œëĒ…ėž", "date": "ë‚ ė§œ", @@ -1389,40 +3139,122 @@ "version": "ë˛„ė „", "keyUsage": "키 ėšŠë„", "selfSigned": "ėžė˛´ ė„œëĒ…", - "bits": "비트" + "bits": "비트", + "details": "Certificate Details" }, "signature": { "info": "ė„œëĒ… ė •ëŗ´", "_value": "ė„œëĒ…", "mathValid": "ė„œëĒ…ė´ ėˆ˜í•™ė ėœŧ로는 ėœ íš¨í•˜ė§€ë§Œ:" }, - "selectCustomCert": "ė‚ŦėšŠėž 맀렕 ė¸ėĻė„œ 파ėŧ X.509 (ė„ íƒė‚Ŧ항)" - }, - "replace-color": { - "title": "ėƒ‰ėƒ ęĩė˛´-ë°˜ė „", - "header": "PDF ėƒ‰ėƒ ęĩė˛´-ë°˜ė „", - "selectText": { - "1": "ėƒ‰ėƒ ęĩė˛´ 또는 ë°˜ė „ ė˜ĩė…˜", - "2": "ę¸°ëŗ¸ę°’(ę¸°ëŗ¸ ęŗ ëŒ€ëš„ ėƒ‰ėƒ)", - "3": "ė‚ŦėšŠėž 맀렕(ė‚ŦėšŠėž 맀렕 ėƒ‰ėƒ)", - "4": "렄랴 ë°˜ė „(ëĒ¨ë“  ėƒ‰ėƒ ë°˜ė „)", - "5": "ęŗ ëŒ€ëš„ ėƒ‰ėƒ ė˜ĩė…˜", - "6": "枀렕 ë°°ę˛Ŋ뗐 í°ėƒ‰ í…ėŠ¤íŠ¸", - "7": "í°ėƒ‰ ë°°ę˛Ŋ뗐 枀렕 í…ėŠ¤íŠ¸", - "8": "枀렕 ë°°ę˛Ŋ뗐 ë…¸ëž€ėƒ‰ í…ėŠ¤íŠ¸", - "9": "枀렕 ë°°ę˛Ŋ뗐 ė´ˆëĄėƒ‰ í…ėŠ¤íŠ¸", - "10": "í…ėŠ¤íŠ¸ ėƒ‰ėƒ ė„ íƒ", - "11": "ë°°ę˛Ŋ ėƒ‰ėƒ ė„ íƒ" + "selectCustomCert": "ė‚ŦėšŠėž 맀렕 ė¸ėĻė„œ 파ėŧ X.509 (ė„ íƒė‚Ŧ항)", + "downloadCsv": "Download CSV", + "downloadJson": "Download JSON", + "downloadPdf": "Download PDF Report", + "downloadType": { + "csv": "CSV", + "json": "JSON", + "pdf": "PDF" }, - "submit": "ęĩė˛´" + "error": { + "allFailed": "Unable to validate the selected files.", + "partial": "Some files could not be validated.", + "reportGeneration": "Could not generate the PDF report. JSON and CSV are available.", + "unexpected": "Unexpected error during validation." + }, + "finalizing": "Preparing downloads...", + "issue": { + "certExpired": "Certificate expired", + "certRevocationUnknown": "Certificate revocation status unknown", + "certRevoked": "Certificate revoked", + "chainInvalid": "Certificate chain invalid", + "signatureInvalid": "Signature cryptographic check failed", + "trustInvalid": "Certificate not trusted" + }, + "noResults": "Run the validation to generate a report.", + "noSignaturesShort": "No signatures", + "processing": "Validating signatures...", + "report": { + "continued": "Continued", + "downloads": "Downloads", + "entryLabel": "Signature Summary", + "fields": { + "created": "Created", + "fileSize": "File Size", + "signatureCount": "Total Signatures", + "signatureDate": "Signature Date" + }, + "filesEvaluated": "{{count}} files evaluated", + "footer": "Validated via Stirling PDF", + "generatedAt": "Generated", + "noPdf": "PDF report will be available after a successful validation.", + "page": "Page", + "shortTitle": "Signature Summary", + "signatureCountLabel": "{{count}} signatures", + "signaturesFound": "{{count}} signatures detected", + "signaturesValid": "{{count}} fully valid", + "title": "Signature Validation Report" + }, + "settings": { + "certHint": "Upload a trusted X.509 certificate to validate against a custom trust source.", + "title": "Validation Settings" + }, + "signatureDate": "Signature Date", + "totalSignatures": "Total Signatures" }, - "replaceColorPdf": { - "tags": "ėƒ‰ėƒ ęĩė˛´,íŽ˜ė´ė§€ ėž‘ė—…,ë°ąė—”ë“œ,ė„œë˛„ ė‚Ŧė´ë“œ" + "replaceColor": { + "tags": "Replace Colour,Page operations,Back end,server side", + "labels": { + "settings": "Settings", + "colourOperation": "Colour operation" + }, + "options": { + "highContrast": "High contrast", + "invertAll": "Invert all colours", + "custom": "Custom", + "cmyk": "Convert to CMYK" + }, + "tooltip": { + "header": { + "title": "Replace & Invert Colour Settings Overview" + }, + "description": { + "title": "Description", + "text": "Transform PDF colours to improve readability and accessibility. Choose from high contrast presets, invert all colours, or create custom colour schemes." + }, + "highContrast": { + "title": "High Contrast", + "text": "Apply predefined high contrast colour combinations designed for better readability and accessibility compliance.", + "bullet1": "White text on black background - Classic dark mode", + "bullet2": "Black text on white background - Standard high contrast", + "bullet3": "Yellow text on black background - High visibility option", + "bullet4": "Green text on black background - Alternative high contrast" + }, + "invertAll": { + "title": "Invert All Colours", + "text": "Completely invert all colours in the PDF, creating a negative-like effect. Useful for creating dark mode versions of documents or reducing eye strain in low-light conditions." + }, + "custom": { + "title": "Custom Colours", + "text": "Define your own text and background colours using the colour pickers. Perfect for creating branded documents or specific accessibility requirements.", + "bullet1": "Text colour - Choose the colour for text elements", + "bullet2": "Background colour - Set the background colour for the document" + }, + "cmyk": { + "title": "Convert to CMYK", + "text": "Convert the PDF from RGB colour space to CMYK colour space, optimized for professional printing. This process converts colours to the Cyan, Magenta, Yellow, Black model used by printers." + } + }, + "error": { + "failed": "An error occurred while processing the colour replacement." + } }, "login": { "title": "ëĄœęˇ¸ė¸", "header": "ëĄœęˇ¸ė¸", "signin": "ëĄœęˇ¸ė¸", + "signInWith": "Sign in with", + "signInAnonymously": "Sign Up as a Guest", "rememberme": "ëĄœęˇ¸ė¸ ėœ ė§€", "invalid": "ė‚ŦėšŠėž ė´ëĻ„ 또는 비밀번호가 ėž˜ëĒģë˜ė—ˆėŠĩ니다.", "locked": "ęŗ„ė •ė´ ėž ę˛ŧėŠĩ니다.", @@ -1441,12 +3273,83 @@ "alreadyLoggedIn": "ė´ë¯¸ ë‹¤ėŒė— ëĄœęˇ¸ė¸ë˜ė–´ ėžˆėŠĩ니다", "alreadyLoggedIn2": "ę°œė˜ 기기. 해당 ę¸°ę¸°ė—ė„œ ëĄœęˇ¸ė•„ė›ƒí•œ 후 ë‹¤ė‹œ ė‹œë„í•˜ė„¸ėš”.", "toManySessions": "í™œė„ą ė„¸ė…˜ė´ 너ëŦ´ 많ėŠĩ니다", - "logoutMessage": "You have been logged out." + "logoutMessage": "You have been logged out.", + "youAreLoggedIn": "You are logged in!", + "email": "Email", + "password": "Password", + "enterEmail": "Enter your email", + "enterPassword": "Enter your password", + "loggingIn": "Logging In...", + "username": "Username", + "enterUsername": "Enter username", + "useEmailInstead": "Login with email", + "forgotPassword": "Forgot your password?", + "logIn": "Log In", + "signingIn": "Signing in...", + "login": "Login", + "or": "Or", + "useMagicLink": "Use magic link instead", + "enterEmailForMagicLink": "Enter your email for magic link", + "sending": "Sendingâ€Ļ", + "sendMagicLink": "Send Magic Link", + "cancel": "Cancel", + "dontHaveAccount": "Don't have an account? Sign up", + "home": "Home", + "debug": "Debug", + "signOut": "Sign Out", + "pleaseEnterBoth": "Please enter both email and password", + "pleaseEnterEmail": "Please enter your email address", + "magicLinkSent": "Magic link sent to {{email}}! Check your email and click the link to sign in.", + "passwordResetSent": "Password reset link sent to {{email}}! Check your email and follow the instructions.", + "failedToSignIn": "Failed to sign in with {{provider}}: {{message}}", + "unexpectedError": "Unexpected error: {{message}}", + "accountCreatedSuccess": "Account created successfully! You can now sign in.", + "passwordChangedSuccess": "Password changed successfully! Please sign in with your new password.", + "credentialsUpdated": "Your credentials have been updated. Please sign in again." + }, + "signup": { + "title": "Create an account", + "subtitle": "Join Stirling PDF to get started", + "name": "Name", + "email": "Email", + "password": "Password", + "confirmPassword": "Confirm password", + "enterName": "Enter your name", + "enterEmail": "Enter your email", + "enterPassword": "Enter your password", + "confirmPasswordPlaceholder": "Confirm password", + "or": "or", + "creatingAccount": "Creating Account...", + "signUp": "Sign Up", + "alreadyHaveAccount": "Already have an account? Sign in", + "pleaseFillAllFields": "Please fill in all fields", + "passwordsDoNotMatch": "Passwords do not match", + "passwordTooShort": "Password must be at least 6 characters long", + "invalidEmail": "Please enter a valid email address", + "checkEmailConfirmation": "Check your email for a confirmation link to complete your registration.", + "accountCreatedSuccessfully": "Account created successfully! You can now sign in.", + "unexpectedError": "Unexpected error: {{message}}", + "useEmailInstead": "Use Email Instead", + "nameRequired": "Name is required", + "emailRequired": "Email is required", + "passwordRequired": "Password is required", + "confirmPasswordRequired": "Please confirm your password" }, "pdfToSinglePage": { "title": "단ėŧ íŽ˜ė´ė§€ëĄœ ëŗ€í™˜", "header": "단ėŧ íŽ˜ė´ė§€ëĄœ ëŗ€í™˜", - "submit": "단ėŧ íŽ˜ė´ė§€ëĄœ ëŗ€í™˜" + "submit": "단ėŧ íŽ˜ė´ė§€ëĄœ ëŗ€í™˜", + "description": "This tool will merge all pages of your PDF into one large single page. The width will remain the same as the original pages, but the height will be the sum of all page heights.", + "filenamePrefix": "single_page", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst converting to single page." + }, + "results": { + "title": "Single Page Results" + } }, "pageExtracter": { "title": "íŽ˜ė´ė§€ ėļ”ėļœ", @@ -1470,18 +3373,59 @@ "adjustContrast": { "title": "대비 ėĄ°ė •", "header": "대비 ėĄ°ė •", + "basic": "Basic Adjustments", "contrast": "대비:", "brightness": "밝기:", "saturation": "ėą„ë„:", - "download": "ë‹¤ėš´ëĄœë“œ" + "download": "ë‹¤ėš´ëĄœë“œ", + "adjustColors": "Adjust Colors", + "blue": "Blue", + "confirm": "Confirm", + "error": { + "failed": "Failed to adjust colors/contrast" + }, + "green": "Green", + "noPreview": "Select a PDF to preview", + "red": "Red", + "results": { + "title": "Adjusted PDF" + } }, "compress": { "title": "ė••ėļ•", + "desc": "Compress PDFs to reduce their file size.", "header": "PDF ė••ėļ•", + "method": { + "title": "Compression Method", + "quality": "Quality", + "filesize": "파ėŧ íŦ기" + }, "credit": "ė´ ė„œëš„ėŠ¤ëŠ” PDF ė••ėļ•/ėĩœė í™”ëĨŧ ėœ„í•´ qpdfëĨŧ ė‚ŦėšŠí•Šë‹ˆë‹¤.", "grayscale": { "label": "ė••ėļ•ė„ ėœ„í•´ ęˇ¸ë ˆė´ėŠ¤ėŧ€ėŧ ė ėšŠ" }, + "tooltip": { + "header": { + "title": "Compress Settings Overview" + }, + "description": { + "title": "Description", + "text": "Compression is an easy way to reduce your file size. Pick File Size to enter a target size and have us adjust quality for you. Pick Quality to set compression strength manually." + }, + "qualityAdjustment": { + "title": "Quality Adjustment", + "text": "Drag the slider to adjust the compression strength. Lower values (1-3) preserve quality but result in larger files. Higher values (7-9) shrink the file more but reduce image clarity.", + "bullet1": "Lower values preserve quality", + "bullet2": "Higher values reduce file size" + }, + "grayscale": { + "title": "Grayscale", + "text": "Select this option to convert all images to black and white, which can significantly reduce file size especially for scanned PDFs or image-heavy documents." + } + }, + "error": { + "failed": "An error occurred while compressing the PDF." + }, "selectText": { "1": { "_value": "Compression Settings", @@ -1491,10 +3435,7 @@ "4": "ėžë™ ëĒ¨ë“œ - PDFëĨŧ ė •í™•í•œ íŦ기로 만들기 ėœ„í•´ í’ˆė§ˆ ėžë™ ėĄ°ė •", "5": "똈냁 PDF íŦ기 (똈: 25MB, 10.8MB, 25KB)" }, - "submit": "ė••ėļ•", - "method": { - "filesize": "파ėŧ íŦ기" - } + "submit": "ė••ėļ•" }, "decrypt": { "passwordPrompt": "ė´ 파ėŧė€ 비밀번호로 ëŗ´í˜¸ë˜ė–´ ėžˆėŠĩ니다. 비밀번호ëĨŧ ėž…ë Ĩí•˜ė„¸ėš”:", @@ -1595,7 +3536,13 @@ "title": "ė´ë¯¸ė§€ ė œęą°", "header": "ė´ë¯¸ė§€ ė œęą°", "removeImage": "ė´ë¯¸ė§€ ė œęą°", - "submit": "ė´ë¯¸ė§€ ė œęą°" + "submit": "ė´ë¯¸ė§€ ė œęą°", + "error": { + "failed": "Failed to remove images from the PDF." + }, + "results": { + "title": "Remove Images Results" + } }, "splitByChapters": { "title": "ėą•í„°ëŗ„ PDF ëļ„í• ", @@ -1629,6 +3576,12 @@ }, "note": "ëĻ´ëĻŦ늤 노트는 ė˜ė–´ëĄœë§Œ 렜ęŗĩ됩니다" }, + "swagger": { + "title": "API Documentation", + "header": "API Documentation", + "desc": "View and test the Stirling PDF API endpoints", + "tags": "api,documentation,swagger,endpoints,development" + }, "cookieBanner": { "popUp": { "title": "How we use Cookies", @@ -1664,53 +3617,943 @@ "title": "Analytics", "description": "These cookies help us understand how our tools are being used, so we can focus on building the features our community values most. Rest assured—Stirling PDF cannot and will never track the content of the documents you work with." } + }, + "services": { + "posthog": "PostHog Analytics", + "scarf": "Scarf Pixel" } }, - "download": "ë‹¤ėš´ëĄœë“œ", - "convert": { - "title": "ëŗ€í™˜", - "settings": "네렕", - "color": "ėƒ‰ėƒ", - "greyscale": "ęˇ¸ë ˆė´ėŠ¤ėŧ€ėŧ", - "fillPage": "íŽ˜ė´ė§€ ėą„ėš°ę¸°", - "pdfaDigitalSignatureWarning": "PDF뗐 ë””ė§€í„¸ ė„œëĒ…ė´ íŦí•¨ë˜ė–´ ėžˆėŠĩ니다. ë‹¤ėŒ ë‹¨ęŗ„ė—ė„œ ė œęą°ëŠë‹ˆë‹¤.", - "grayscale": "ęˇ¸ë ˆė´ėŠ¤ėŧ€ėŧ" + "removeMetadata": { + "submit": "Remove Metadata" }, - "attachments": { - "tags": "embed,attach,file,attachment,attachments", - "title": "Add attachments", - "header": "Add attachments", - "submit": "Add attachments" + "sidebar": { + "toggle": "Toggle Sidebar" + }, + "theme": { + "toggle": "Toggle Theme" + }, + "view": { + "viewer": "Viewer", + "pageEditor": "Page Editor", + "fileManager": "File Manager" + }, + "pageEditor": { + "title": "Page Editor", + "save": "Save Changes", + "noPdfLoaded": "No PDF loaded. Please upload a PDF to edit.", + "rotatedLeft": "Rotated left:", + "rotatedRight": "Rotated right:", + "deleted": "Deleted:", + "movedLeft": "Moved left:", + "movedRight": "Moved right:", + "splitAt": "Split at:", + "insertedPageBreak": "Inserted page break at:", + "addFileNotImplemented": "Add file not implemented in demo", + "closePdf": "Close PDF", + "reset": "Reset Changes", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "fitToWidth": "Fit to Width", + "actualSize": "Actual Size" + }, + "viewer": { + "firstPage": "First Page", + "lastPage": "Last Page", + "previousPage": "Previous Page", + "nextPage": "Next Page", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "singlePageView": "Single Page View", + "dualPageView": "Dual Page View" }, "rightRail": { + "closeSelected": "Close Selected Files", "selectAll": "ëĒ¨ë‘ ė„ íƒ", - "deselectAll": "ëĒ¨ë‘ ė„ íƒ í•´ė œ" + "deselectAll": "ëĒ¨ë‘ ė„ íƒ í•´ė œ", + "selectByNumber": "Select by Page Numbers", + "deleteSelected": "Delete Selected Pages", + "closePdf": "Close PDF", + "exportAll": "Export PDF", + "downloadSelected": "Download Selected Files", + "downloadAll": "Download All", + "toggleTheme": "Toggle Theme", + "language": "Language", + "search": "Search PDF", + "panMode": "Pan Mode", + "rotateLeft": "Rotate Left", + "rotateRight": "Rotate Right", + "toggleSidebar": "Toggle Sidebar", + "exportSelected": "Export Selected Pages", + "toggleAnnotations": "Toggle Annotations Visibility", + "annotationMode": "Toggle Annotation Mode", + "draw": "Draw", + "save": "Save" + }, + "search": { + "title": "Search PDF", + "placeholder": "Enter search term...", + "noResults": "No results found", + "searching": "Searching..." + }, + "guestBanner": { + "title": "You're using Stirling PDF as a guest!", + "message": "Create a free account to save your work, access more features, and support the project.", + "dismiss": "Dismiss banner", + "signUp": "Sign Up Free" + }, + "toolPicker": { + "searchPlaceholder": "Search tools...", + "noToolsFound": "No tools found", + "allTools": "ALL TOOLS", + "quickAccess": "QUICK ACCESS", + "categories": { + "standardTools": "Standard Tools", + "advancedTools": "Advanced Tools", + "recommendedTools": "Recommended Tools" + }, + "subcategories": { + "signing": "Signing", + "documentSecurity": "Document Security", + "verification": "Verification", + "documentReview": "Document Review", + "pageFormatting": "Page Formatting", + "extraction": "Extraction", + "removal": "Removal", + "automation": "Automation", + "general": "General", + "advancedFormatting": "Advanced Formatting", + "developerTools": "Developer Tools" + } }, "quickAccess": { - "sign": "ė„œëĒ…" + "read": "Read", + "sign": "ė„œëĒ…", + "automate": "Automate", + "files": "Files", + "activity": "Activity", + "help": "Help", + "account": "Account", + "config": "Config", + "adminSettings": "Admin Settings", + "allTools": "All Tools" + }, + "admin": { + "error": "Error", + "success": "Success", + "expand": "Expand", + "close": "Close", + "status": { + "active": "Active", + "inactive": "Inactive" + }, + "settings": { + "title": "Admin Settings", + "workspace": "Workspace", + "fetchError": "Failed to load settings", + "saveError": "Failed to save settings", + "saved": "Settings saved successfully", + "saveSuccess": "Settings saved successfully", + "save": "Save Changes", + "restartRequired": "Restart Required", + "restart": { + "title": "Restart Required", + "message": "Settings have been saved successfully. A server restart is required for the changes to take effect.", + "question": "Would you like to restart the server now or later?", + "now": "Restart Now", + "later": "Restart Later" + }, + "restarting": "Restarting Server", + "restartingMessage": "The server is restarting. Please wait a moment...", + "restartError": "Failed to restart server. Please restart manually.", + "general": { + "title": "System Settings", + "description": "Configure system-wide application settings including branding and default behaviour.", + "ui": "User Interface", + "system": "System", + "appName": { + "label": "Application Name", + "description": "The name displayed in the browser tab and home page" + }, + "appNameNavbar": { + "label": "Navbar Brand", + "description": "The name displayed in the navigation bar" + }, + "homeDescription": { + "label": "Home Description", + "description": "The description text shown on the home page" + }, + "defaultLocale": { + "label": "Default Locale", + "description": "The default language for new users (e.g., en_US, es_ES)" + }, + "fileUploadLimit": { + "label": "File Upload Limit", + "description": "Maximum file upload size (e.g., 100MB, 1GB)" + }, + "showUpdate": { + "label": "Show Update Notifications", + "description": "Display notifications when a new version is available" + }, + "showUpdateOnlyAdmin": { + "label": "Show Updates to Admins Only", + "description": "Restrict update notifications to admin users only" + }, + "customHTMLFiles": { + "label": "Custom HTML Files", + "description": "Allow serving custom HTML files from the customFiles directory" + }, + "languages": { + "label": "Available Languages", + "description": "Languages that users can select from (leave empty to enable all languages)" + }, + "customMetadata": { + "label": "Custom Metadata", + "autoUpdate": { + "label": "Auto Update Metadata", + "description": "Automatically update PDF metadata on all processed documents" + }, + "author": { + "label": "Default Author", + "description": "Default author for PDF metadata (e.g., username)" + }, + "creator": { + "label": "Default Creator", + "description": "Default creator for PDF metadata" + }, + "producer": { + "label": "Default Producer", + "description": "Default producer for PDF metadata" + } + }, + "customPaths": { + "label": "Custom Paths", + "description": "Configure custom file system paths for pipeline processing and external tools", + "pipeline": { + "label": "Pipeline Directories", + "watchedFoldersDir": { + "label": "Watched Folders Directory", + "description": "Directory where pipeline monitors for incoming PDFs (leave empty for default: /pipeline/watchedFolders)" + }, + "finishedFoldersDir": { + "label": "Finished Folders Directory", + "description": "Directory where processed PDFs are outputted (leave empty for default: /pipeline/finishedFolders)" + } + }, + "operations": { + "label": "External Tool Paths", + "weasyprint": { + "label": "WeasyPrint Executable", + "description": "Path to WeasyPrint executable for HTML to PDF conversion (leave empty for default: /opt/venv/bin/weasyprint)" + }, + "unoconvert": { + "label": "Unoconvert Executable", + "description": "Path to LibreOffice unoconvert for document conversions (leave empty for default: /opt/venv/bin/unoconvert)" + } + } + } + }, + "security": { + "title": "Security", + "description": "Configure authentication, login behaviour, and security policies.", + "ssoNotice": { + "title": "Looking for SSO/SAML settings?", + "message": "OAuth2 and SAML2 authentication providers have been moved to the Connections menu for easier management." + }, + "authentication": "Authentication", + "enableLogin": { + "label": "Enable Login", + "description": "Require users to log in before accessing the application" + }, + "loginMethod": { + "label": "Login Method", + "description": "The authentication method to use for user login", + "all": "All Methods", + "normal": "Username/Password Only", + "oauth2": "OAuth2 Only", + "saml2": "SAML2 Only" + }, + "loginAttemptCount": { + "label": "Login Attempt Limit", + "description": "Maximum number of failed login attempts before account lockout" + }, + "loginResetTimeMinutes": { + "label": "Login Reset Time (minutes)", + "description": "Time before failed login attempts are reset" + }, + "csrfDisabled": { + "label": "Disable CSRF Protection", + "description": "Disable Cross-Site Request Forgery protection (not recommended)" + }, + "initialLogin": { + "label": "Initial Login", + "username": { + "label": "Initial Username", + "description": "The username for the initial admin account" + }, + "password": { + "label": "Initial Password", + "description": "The password for the initial admin account" + } + }, + "jwt": { + "label": "JWT Configuration", + "secureCookie": { + "label": "Secure Cookie", + "description": "Require HTTPS for JWT cookies (recommended for production)" + }, + "keyRetentionDays": { + "label": "Key Retention Days", + "description": "Number of days to retain old JWT keys for verification" + }, + "persistence": { + "label": "Enable Key Persistence", + "description": "Store JWT keys persistently to survive server restarts" + }, + "enableKeyRotation": { + "label": "Enable Key Rotation", + "description": "Automatically rotate JWT signing keys periodically" + }, + "enableKeyCleanup": { + "label": "Enable Key Cleanup", + "description": "Automatically remove expired JWT keys" + } + }, + "audit": { + "label": "Audit Logging", + "enabled": { + "label": "Enable Audit Logging", + "description": "Track user actions and system events for compliance and security monitoring" + }, + "level": { + "label": "Audit Level", + "description": "0=OFF, 1=BASIC, 2=STANDARD, 3=VERBOSE" + }, + "retentionDays": { + "label": "Audit Retention (days)", + "description": "Number of days to retain audit logs" + } + }, + "htmlUrlSecurity": { + "label": "HTML URL Security", + "description": "Configure URL access restrictions for HTML processing to prevent SSRF attacks", + "enabled": { + "label": "Enable URL Security", + "description": "Enable URL security restrictions for HTML to PDF conversions" + }, + "level": { + "label": "Security Level", + "description": "MAX: whitelist only, MEDIUM: block internal networks, OFF: no restrictions", + "max": "Maximum (Whitelist Only)", + "medium": "Medium (Block Internal)", + "off": "Off (No Restrictions)" + }, + "advanced": "Advanced Settings", + "allowedDomains": { + "label": "Allowed Domains (Whitelist)", + "description": "One domain per line (e.g., cdn.example.com). Only these domains allowed when level is MAX" + }, + "blockedDomains": { + "label": "Blocked Domains (Blacklist)", + "description": "One domain per line (e.g., malicious.com). Additional domains to block" + }, + "internalTlds": { + "label": "Internal TLDs", + "description": "One TLD per line (e.g., .local, .internal). Block domains with these TLD patterns" + }, + "networkBlocking": "Network Blocking", + "blockPrivateNetworks": { + "label": "Block Private Networks", + "description": "Block RFC 1918 private networks (10.x.x.x, 192.168.x.x, 172.16-31.x.x)" + }, + "blockLocalhost": { + "label": "Block Localhost", + "description": "Block localhost and loopback addresses (127.x.x.x, ::1)" + }, + "blockLinkLocal": { + "label": "Block Link-Local Addresses", + "description": "Block link-local addresses (169.254.x.x, fe80::/10)" + }, + "blockCloudMetadata": { + "label": "Block Cloud Metadata Endpoints", + "description": "Block cloud provider metadata endpoints (169.254.169.254)" + } + } + }, + "connections": { + "title": "Connections", + "description": "Configure external authentication providers like OAuth2 and SAML.", + "linkedServices": "Linked Services", + "unlinkedServices": "Unlinked Services", + "connect": "Connect", + "disconnect": "Disconnect", + "disconnected": "Provider disconnected successfully", + "disconnectError": "Failed to disconnect provider", + "ssoAutoLogin": { + "label": "SSO Auto Login", + "enable": "Enable SSO Auto Login", + "description": "Automatically redirect to SSO login when authentication is required" + }, + "oauth2": { + "label": "OAuth2", + "enabled": { + "label": "Enable OAuth2", + "description": "Allow users to authenticate using OAuth2 providers" + }, + "provider": { + "label": "Provider", + "description": "The OAuth2 provider to use for authentication" + }, + "issuer": { + "label": "Issuer URL", + "description": "The OAuth2 provider issuer URL" + }, + "clientId": { + "label": "Client ID", + "description": "The OAuth2 client ID from your provider" + }, + "clientSecret": { + "label": "Client Secret", + "description": "The OAuth2 client secret from your provider" + }, + "useAsUsername": { + "label": "Use as Username", + "description": "The OAuth2 claim to use as the username (e.g., email, sub)" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first OAuth2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via OAuth2" + }, + "scopes": { + "label": "OAuth2 Scopes", + "description": "Comma-separated list of OAuth2 scopes to request (e.g., openid, profile, email)" + } + }, + "saml2": { + "label": "SAML2", + "enabled": { + "label": "Enable SAML2", + "description": "Allow users to authenticate using SAML2 providers" + }, + "provider": { + "label": "Provider", + "description": "The SAML2 provider name" + }, + "registrationId": { + "label": "Registration ID", + "description": "The SAML2 registration identifier" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first SAML2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via SAML2" + } + } + }, + "database": { + "title": "Database", + "description": "Configure custom database connection settings for enterprise deployments.", + "configuration": "Database Configuration", + "enableCustom": { + "label": "Enable Custom Database", + "description": "Use your own custom database configuration instead of the default embedded database" + }, + "customUrl": { + "label": "Custom Database URL", + "description": "Full JDBC connection string (e.g., jdbc:postgresql://localhost:5432/postgres). If provided, individual connection settings below are not used." + }, + "type": { + "label": "Database Type", + "description": "Type of database (not used if custom URL is provided)" + }, + "hostName": { + "label": "Host Name", + "description": "Database server hostname (not used if custom URL is provided)" + }, + "port": { + "label": "Port", + "description": "Database server port (not used if custom URL is provided)" + }, + "name": { + "label": "Database Name", + "description": "Name of the database (not used if custom URL is provided)" + }, + "username": { + "label": "Username", + "description": "Database authentication username" + }, + "password": { + "label": "Password", + "description": "Database authentication password" + } + }, + "privacy": { + "title": "Privacy", + "description": "Configure privacy and data collection settings.", + "analytics": "Analytics & Tracking", + "enableAnalytics": { + "label": "Enable Analytics", + "description": "Collect anonymous usage analytics to help improve the application" + }, + "metricsEnabled": { + "label": "Enable Metrics", + "description": "Enable collection of performance and usage metrics. Provides API endpoint for admins to access metrics data" + }, + "searchEngine": "Search Engine Visibility", + "googleVisibility": { + "label": "Google Visibility", + "description": "Allow search engines to index this application" + } + }, + "advanced": { + "title": "Advanced", + "description": "Configure advanced features and experimental functionality.", + "features": "Feature Flags", + "processing": "Processing", + "endpoints": { + "label": "Endpoints", + "manage": "Manage API Endpoints", + "description": "Endpoint management is configured via YAML. See documentation for details on enabling/disabling specific endpoints." + }, + "enableAlphaFunctionality": { + "label": "Enable Alpha Features", + "description": "Enable experimental and alpha-stage features (may be unstable)" + }, + "enableUrlToPDF": { + "label": "Enable URL to PDF", + "description": "Allow conversion of web pages to PDF documents" + }, + "maxDPI": { + "label": "Maximum DPI", + "description": "Maximum DPI for image processing (0 = unlimited)" + }, + "tessdataDir": { + "label": "Tessdata Directory", + "description": "Path to the tessdata directory for OCR language files" + }, + "disableSanitize": { + "label": "Disable HTML Sanitization", + "description": "WARNING: Security risk - disabling HTML sanitization can lead to XSS vulnerabilities" + }, + "tempFileManagement": { + "label": "Temp File Management", + "description": "Configure temporary file storage and cleanup behavior", + "baseTmpDir": { + "label": "Base Temp Directory", + "description": "Base directory for temporary files (leave empty for default: java.io.tmpdir/stirling-pdf)" + }, + "libreofficeDir": { + "label": "LibreOffice Temp Directory", + "description": "Directory for LibreOffice temp files (leave empty for default: baseTmpDir/libreoffice)" + }, + "systemTempDir": { + "label": "System Temp Directory", + "description": "System temp directory to clean (only used if cleanupSystemTemp is enabled)" + }, + "prefix": { + "label": "Temp File Prefix", + "description": "Prefix for temp file names" + }, + "maxAgeHours": { + "label": "Max Age (hours)", + "description": "Maximum age in hours before temp files are cleaned up" + }, + "cleanupIntervalMinutes": { + "label": "Cleanup Interval (minutes)", + "description": "How often to run cleanup (in minutes)" + }, + "startupCleanup": { + "label": "Startup Cleanup", + "description": "Clean up old temp files on application startup" + }, + "cleanupSystemTemp": { + "label": "Cleanup System Temp", + "description": "Whether to clean broader system temp directory (use with caution)" + } + }, + "processExecutor": { + "label": "Process Executor Limits", + "description": "Configure session limits and timeouts for each process executor", + "sessionLimit": { + "label": "Session Limit", + "description": "Maximum concurrent instances" + }, + "timeout": { + "label": "Timeout (minutes)", + "description": "Maximum execution time" + }, + "libreOffice": "LibreOffice", + "pdfToHtml": "PDF to HTML", + "qpdf": "QPDF", + "tesseract": "Tesseract OCR", + "pythonOpenCv": "Python OpenCV", + "weasyPrint": "WeasyPrint", + "installApp": "Install App", + "calibre": "Calibre", + "ghostscript": "Ghostscript", + "ocrMyPdf": "OCRmyPDF" + } + }, + "mail": { + "title": "Mail Server", + "description": "Configure SMTP settings for sending email notifications.", + "smtp": "SMTP Configuration", + "enabled": { + "label": "Enable Mail", + "description": "Enable email notifications and SMTP functionality" + }, + "host": { + "label": "SMTP Host", + "description": "The hostname or IP address of your SMTP server" + }, + "port": { + "label": "SMTP Port", + "description": "The port number for SMTP connection (typically 25, 465, or 587)" + }, + "username": { + "label": "SMTP Username", + "description": "Username for SMTP authentication" + }, + "password": { + "label": "SMTP Password", + "description": "Password for SMTP authentication" + }, + "from": { + "label": "From Address", + "description": "The email address to use as the sender" + }, + "enableInvites": { + "label": "Enable Email Invites", + "description": "Allow admins to invite users via email with auto-generated passwords" + }, + "frontendUrl": { + "label": "Frontend URL", + "description": "Base URL for frontend (e.g. https://pdf.example.com). Used for generating invite links in emails. Leave empty to use backend URL." + } + }, + "legal": { + "title": "Legal Documents", + "description": "Configure links to legal documents and policies.", + "disclaimer": { + "title": "Legal Responsibility Warning", + "message": "By customizing these legal documents, you assume full responsibility for ensuring compliance with all applicable laws and regulations, including but not limited to GDPR and other EU data protection requirements. Only modify these settings if: (1) you are operating a personal/private instance, (2) you are outside EU jurisdiction and understand your local legal obligations, or (3) you have obtained proper legal counsel and accept sole responsibility for all user data and legal compliance. Stirling-PDF and its developers assume no liability for your legal obligations." + }, + "termsAndConditions": { + "label": "Terms and Conditions", + "description": "URL or filename to terms and conditions" + }, + "privacyPolicy": { + "label": "Privacy Policy", + "description": "URL or filename to privacy policy" + }, + "accessibilityStatement": { + "label": "Accessibility Statement", + "description": "URL or filename to accessibility statement" + }, + "cookiePolicy": { + "label": "Cookie Policy", + "description": "URL or filename to cookie policy" + }, + "impressum": { + "label": "Impressum", + "description": "URL or filename to impressum (required in some jurisdictions)" + } + }, + "premium": { + "title": "Premium & Enterprise", + "description": "Configure your premium or enterprise license key.", + "license": "License Configuration", + "key": { + "label": "License Key", + "description": "Enter your premium or enterprise license key" + }, + "enabled": { + "label": "Enable Premium Features", + "description": "Enable license key checks for pro/enterprise features" + }, + "movedFeatures": { + "title": "Premium Features Distributed", + "message": "Premium and Enterprise features are now organized in their respective sections:" + } + }, + "features": { + "title": "Features", + "description": "Configure optional features and functionality.", + "serverCertificate": { + "label": "Server Certificate", + "description": "Configure server-side certificate generation for \"Sign with Stirling-PDF\" functionality", + "enabled": { + "label": "Enable Server Certificate", + "description": "Enable server-side certificate for \"Sign with Stirling-PDF\" option" + }, + "organizationName": { + "label": "Organization Name", + "description": "Organization name for generated certificates" + }, + "validity": { + "label": "Certificate Validity (days)", + "description": "Number of days the certificate will be valid" + }, + "regenerateOnStartup": { + "label": "Regenerate on Startup", + "description": "Generate new certificate on each application startup" + } + } + }, + "endpoints": { + "title": "API Endpoints", + "description": "Control which API endpoints and endpoint groups are available.", + "management": "Endpoint Management", + "toRemove": { + "label": "Disabled Endpoints", + "description": "Select individual endpoints to disable" + }, + "groupsToRemove": { + "label": "Disabled Endpoint Groups", + "description": "Select endpoint groups to disable" + }, + "note": "Note: Disabling endpoints restricts API access but does not remove UI components. Restart required for changes to take effect." + } + } }, "fileUpload": { + "selectFile": "Select a file", + "selectFiles": "Select files", + "selectPdfToView": "Select a PDF to view", + "selectPdfToEdit": "Select a PDF to edit", + "chooseFromStorage": "Choose a file from storage or upload a new PDF", + "chooseFromStorageMultiple": "Choose files from storage or upload new PDFs", + "loadFromStorage": "Load from Storage", + "filesAvailable": "files available", "loading": "로딩 뤑...", - "or": "또는" + "or": "또는", + "dropFileHere": "Drop file here or click to upload", + "dropFilesHere": "Drop files here or click the upload button", + "pdfFilesOnly": "PDF files only", + "supportedFileTypes": "Supported file types", + "upload": "Upload", + "uploadFile": "Upload File", + "uploadFiles": "Upload Files", + "noFilesInStorage": "No files available in storage. Upload some files first.", + "selectFromStorage": "Select from Storage", + "backToTools": "Back to Tools", + "addFiles": "Add Files", + "dragFilesInOrClick": "Drag files in or click \"Add Files\" to browse" + }, + "fileEditor": { + "addFiles": "Add Files" }, "fileManager": { + "title": "Upload PDF Files", + "subtitle": "Add files to your storage for easy access across tools", + "filesSelected": "files selected", + "clearSelection": "Clear Selection", + "openInFileEditor": "Open in File Editor", + "uploadError": "Failed to upload some files.", + "failedToOpen": "Failed to open file. It may have been removed from storage.", + "failedToLoad": "Failed to load file to active set.", + "storageCleared": "Browser cleared storage. Files have been removed. Please re-upload.", + "clearAll": "Clear All", + "reloadFiles": "Reload Files", + "dragDrop": "Drag & Drop files here", + "clickToUpload": "Click to upload files", + "selectedFiles": "Selected Files", + "storage": "Storage", + "filesStored": "files stored", + "storageError": "Storage error occurred", + "storageLow": "Storage is running low. Consider removing old files.", + "supportMessage": "Powered by browser database storage for unlimited capacity", + "noFileSelected": "No files selected", + "showHistory": "Show History", + "hideHistory": "Hide History", + "fileHistory": "File History", + "loadingHistory": "Loading History...", + "lastModified": "Last Modified", + "toolChain": "Tools Applied", + "restore": "Restore", + "unzip": "Unzip", + "searchFiles": "Search files...", + "recent": "Recent", + "localFiles": "Local Files", + "googleDrive": "Google Drive", + "googleDriveShort": "Drive", + "myFiles": "My Files", + "noRecentFiles": "No recent files found", + "googleDriveNotAvailable": "Google Drive integration not available", + "openFiles": "Open Files", + "openFile": "Open File", + "details": "File Details", "fileName": "ė´ëĻ„", + "fileFormat": "Format", + "fileSize": "Size", "fileVersion": "ë˛„ė „", + "totalSelected": "Total Selected", + "dropFilesHere": "Drop files here", "selectAll": "ëĒ¨ë‘ ė„ íƒ", "deselectAll": "ëĒ¨ë‘ ė„ íƒ í•´ė œ", "deleteSelected": "ė„ íƒ 항ëĒŠ ė‚­ė œ", + "downloadSelected": "Download Selected", + "selectedCount": "{{count}} selected", "download": "ë‹¤ėš´ëĄœë“œ", - "delete": "ė‚­ė œ" + "delete": "ė‚­ė œ", + "unsupported": "Unsupported", + "addToUpload": "Add to Upload", + "deleteAll": "Delete All", + "loadingFiles": "Loading files...", + "noFiles": "No files available", + "noFilesFound": "No files found matching your search", + "openInPageEditor": "Open in Page Editor", + "showAll": "Show All", + "sortByDate": "Sort by Date", + "sortByName": "Sort by Name", + "sortBySize": "Sort by Size" + }, + "storage": { + "temporaryNotice": "Files are stored temporarily in your browser and may be cleared automatically", + "storageLimit": "Storage limit", + "storageUsed": "Temporary Storage used", + "storageFull": "Storage is nearly full. Consider removing some files.", + "fileTooLarge": "File too large. Maximum size per file is", + "storageQuotaExceeded": "Storage quota exceeded. Please remove some files before uploading more.", + "approximateSize": "Approximate size" }, "sanitize": { + "title": "Sanitise", + "desc": "Remove potentially harmful elements from PDF files.", "submit": "PDF ė •ëĻŦ", + "completed": "Sanitisation completed successfully", + "error": { + "generic": "Sanitisation failed", + "failed": "An error occurred while sanitising the PDF." + }, + "filenamePrefix": "sanitised", + "sanitizationResults": "Sanitisation Results", "steps": { - "settings": "네렕" + "files": "Files", + "settings": "네렕", + "results": "Results" + }, + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "options": { + "title": "Sanitisation Options", + "note": "Select the elements you want to remove from the PDF. At least one option must be selected.", + "removeJavaScript": { + "label": "Remove JavaScript", + "desc": "Remove JavaScript actions and scripts from the PDF" + }, + "removeEmbeddedFiles": { + "label": "Remove Embedded Files", + "desc": "Remove any files embedded within the PDF" + }, + "removeXMPMetadata": { + "label": "Remove XMP Metadata", + "desc": "Remove XMP metadata from the PDF" + }, + "removeMetadata": { + "label": "Remove Document Metadata", + "desc": "Remove document information metadata (title, author, etc.)" + }, + "removeLinks": { + "label": "Remove Links", + "desc": "Remove external links and launch actions from the PDF" + }, + "removeFonts": { + "label": "Remove Fonts", + "desc": "Remove embedded fonts from the PDF" + } + } + }, + "addPassword": { + "title": "비밀번호 ėļ”ę°€", + "desc": "Encrypt your PDF document with a password.", + "completed": "Password protection applied", + "submit": "ė•”í˜¸í™”", + "filenamePrefix": "encrypted", + "error": { + "failed": "An error occurred while encrypting the PDF." + }, + "passwords": { + "stepTitle": "Passwords & Encryption", + "completed": "Passwords configured", + "user": { + "label": "User Password", + "placeholder": "Enter user password" + }, + "owner": { + "label": "Owner Password", + "placeholder": "Enter owner password" + } + }, + "encryption": { + "keyLength": { + "label": "Encryption Key Length", + "40bit": "40-bit (Low)", + "128bit": "128-bit (Standard)", + "256bit": "256-bit (High)" + } + }, + "results": { + "title": "Encrypted PDFs" + }, + "tooltip": { + "header": { + "title": "Password Protection Overview" + }, + "passwords": { + "title": "Password Types", + "text": "User passwords restrict opening the document, while owner passwords control what can be done with the document once opened. You can set both or just one.", + "bullet1": "User Password: Required to open the PDF", + "bullet2": "Owner Password: Controls document permissions (not supported by all PDF viewers)" + }, + "encryption": { + "title": "Encryption Levels", + "text": "Higher encryption levels provide better security but may not be supported by older PDF viewers.", + "bullet1": "40-bit: Basic security, compatible with older viewers", + "bullet2": "128-bit: Standard security, widely supported", + "bullet3": "256-bit: Maximum security, requires modern viewers" + }, + "permissions": { + "title": "ęļŒí•œ ëŗ€ę˛Ŋ", + "text": "These permissions control what users can do with the PDF. Most effective when combined with an owner password." + } + }, + "tags": "ëŗ´ė•ˆ,ëŗ´ė•ˆ", + "header": "비밀번호 ėļ”ę°€ (ė•”í˜¸í™”)", + "selectText": { + "1": "ė•”í˜¸í™”í•  PDF ė„ íƒ", + "2": "ė‚ŦėšŠėž 비밀번호", + "3": "ė•”í˜¸í™” 키 ę¸¸ė´", + "4": "ë†’ė€ ę°’ė´ 더 강ë Ĩí•˜ė§€ë§Œ ë‚Žė€ ę°’ė´ 더 ë‚˜ė€ í˜¸í™˜ė„ąė„ 렜ęŗĩ합니다.", + "5": "ė„¤ė •í•  ęļŒí•œ (ė†Œėœ ėž ëš„ë°€ë˛ˆí˜¸ė™€ 함ęģ˜ ė‚ŦėšŠ ęļŒėžĨ)", + "6": "ëŦ¸ė„œ ėĄ°ëĻŊ ë°Šė§€", + "7": "ėŊ˜í…ė¸  ėļ”ėļœ ë°Šė§€", + "8": "ė ‘ęˇŧė„ąė„ ėœ„í•œ ėļ”ėļœ ë°Šė§€", + "9": "ė–‘ė‹ ėž‘ė„ą ë°Šė§€", + "10": "ėˆ˜ė • ë°Šė§€", + "11": "ėŖŧė„ ėˆ˜ė • ë°Šė§€", + "12": "ė¸ė‡„ ë°Šė§€", + "13": "다ëĨ¸ í˜•ė‹ėœŧ로 ė¸ė‡„ ë°Šė§€", + "14": "ė†Œėœ ėž 비밀번호", + "15": "ëŦ¸ė„œę°€ ė—´ëϰ 후 ėˆ˜í–‰í•  눘 ėžˆëŠ” ėž‘ė—… ė œí•œ (ëĒ¨ë“  ëĻŦë”ė—ė„œ ė§€ė›ë˜ė§€ ė•ŠėŒ)", + "16": "ëŦ¸ė„œ ėžė˛´ 뗴揰 ė œí•œ" } }, "changePermissions": { "title": "ęļŒí•œ ëŗ€ę˛Ŋ", + "desc": "Change document restrictions and permissions.", + "completed": "Permissions changed", "submit": "ęļŒí•œ ëŗ€ę˛Ŋ", + "error": { + "failed": "An error occurred while changing PDF permissions." + }, "permissions": { "preventAssembly": { "label": "ëŦ¸ė„œ ėĄ°ëĻŊ ë°Šė§€" @@ -1737,10 +4580,784 @@ "label": "다ëĨ¸ í˜•ė‹ėœŧ로 ė¸ė‡„ ë°Šė§€" } }, + "results": { + "title": "Modified PDFs" + }, "tooltip": { "header": { "title": "ęļŒí•œ ëŗ€ę˛Ŋ" + }, + "description": { + "text": "Changes document permissions, allowing/disallowing access to different features in PDF readers." + }, + "warning": { + "text": "To make these permissions unchangeable, use the Add Password tool to set an owner password." } } + }, + "removePassword": { + "title": "비밀번호 ė œęą°", + "desc": "PDF ëŦ¸ė„œė—ė„œ 비밀번호 ëŗ´í˜¸ëĨŧ ė œęą°í•Šë‹ˆë‹¤.", + "tags": "ëŗ´ė•ˆ,ė•”í˜¸ í•´ė œ,ëŗ´ė•ˆ,비밀번호 í•´ė œ,비밀번호 ė‚­ė œ", + "password": { + "stepTitle": "비밀번호 ė œęą°", + "label": "현ėžŦ 비밀번호", + "placeholder": "Enter current password", + "completed": "Password configured" + }, + "filenamePrefix": "decrypted", + "error": { + "failed": "An error occurred while removing the password from the PDF." + }, + "tooltip": { + "description": "Removing password protection requires the password that was used to encrypt the PDF. This will decrypt the document, making it accessible without a password." + }, + "submit": "ė œęą°", + "results": { + "title": "Decrypted PDFs" + }, + "header": "비밀번호 ė œęą° (ëŗĩ호화)", + "selectText": { + "1": "ëŗĩ호화할 PDF ė„ íƒ", + "2": "비밀번호" + } + }, + "automate": { + "title": "Automate", + "desc": "Build multi-step workflows by chaining together PDF actions. Ideal for recurring tasks.", + "invalidStep": "Invalid step", + "files": { + "placeholder": "Select files to process with this automation" + }, + "selection": { + "title": "Automation Selection", + "saved": { + "title": "Saved" + }, + "createNew": { + "title": "Create New Automation" + }, + "suggested": { + "title": "Suggested" + } + }, + "creation": { + "createTitle": "Create Automation", + "editTitle": "Edit Automation", + "intro": "Automations run tools sequentially. To get started, add tools in the order you want them to run.", + "name": { + "label": "Automation Name", + "placeholder": "My Automation" + }, + "description": { + "label": "Description (optional)", + "placeholder": "Describe what this automation does..." + }, + "tools": { + "selectTool": "Select a tool...", + "selected": "Selected Tools", + "remove": "Remove tool", + "configure": "Configure tool", + "notConfigured": "! Not Configured", + "addTool": "Add Tool", + "add": "Add a tool..." + }, + "save": "Save Automation", + "unsavedChanges": { + "title": "Unsaved Changes", + "message": "You have unsaved changes. Are you sure you want to go back? All changes will be lost.", + "cancel": "Cancel", + "confirm": "Go Back" + }, + "icon": { + "label": "Icon" + } + }, + "run": { + "title": "Run Automation" + }, + "sequence": { + "unnamed": "Unnamed Automation", + "steps": "{{count}} steps", + "running": "Running Automation...", + "run": "Run Automation", + "finish": "Finish" + }, + "reviewTitle": "Automation Results", + "config": { + "loading": "Loading tool configuration...", + "noSettings": "This tool does not have configurable settings.", + "title": "Configure {{toolName}}", + "description": "Configure the settings for this tool. These settings will be applied when the automation runs.", + "cancel": "Cancel", + "save": "Save Configuration" + }, + "copyToSaved": "Copy to Saved" + }, + "automation": { + "suggested": { + "securePdfIngestion": "Secure PDF Ingestion", + "securePdfIngestionDesc": "Comprehensive PDF processing workflow that sanitises documents, applies OCR with cleanup, converts to PDF/A format for long-term archival, and optimises file size.", + "emailPreparation": "Email Preparation", + "emailPreparationDesc": "Optimises PDFs for email distribution by compressing files, splitting large documents into 20MB chunks for email compatibility, and removing metadata for privacy.", + "secureWorkflow": "Security Workflow", + "secureWorkflowDesc": "Secures PDF documents by removing potentially malicious content like JavaScript and embedded files, then adds password protection to prevent unauthorised access. Password is set to 'password' by default.", + "processImages": "Process Images", + "processImagesDesc": "Converts multiple image files into a single PDF document, then applies OCR technology to extract searchable text from the images." + } + }, + "common": { + "copy": "Copy", + "copied": "Copied!", + "refresh": "Refresh", + "retry": "Retry", + "remaining": "remaining", + "used": "used", + "available": "available", + "cancel": "Cancel", + "preview": "Preview" + }, + "config": { + "overview": { + "title": "Application Configuration", + "description": "Current application settings and configuration details." + }, + "account": { + "overview": { + "title": "Account Settings", + "manageAccountPreferences": "Manage your account preferences", + "guestDescription": "You are signed in as a guest. Consider upgrading your account above." + }, + "upgrade": { + "title": "Upgrade Guest Account", + "description": "Link your account to preserve your history and access more features!", + "socialLogin": "Upgrade with Social Account", + "linkWith": "Link with", + "emailPassword": "or enter your email & password", + "email": "Email", + "emailPlaceholder": "Enter your email", + "password": "Password (optional)", + "passwordPlaceholder": "Set a password", + "passwordNote": "Leave empty to use email verification only", + "upgradeButton": "Upgrade Account" + } + }, + "apiKeys": { + "description": "Your API key for accessing Stirling's suite of PDF tools. Copy it to your project or refresh to generate a new one.", + "publicKeyAriaLabel": "Public API key", + "copyKeyAriaLabel": "Copy API key", + "refreshAriaLabel": "Refresh API key", + "includedCredits": "Included credits", + "purchasedCredits": "Purchased credits", + "totalCredits": "Total Credits", + "chartAriaLabel": "Credits usage: included {{includedUsed}} of {{includedTotal}}, purchased {{purchasedUsed}} of {{purchasedTotal}}", + "nextReset": "Next Reset", + "lastApiUse": "Last API Use", + "overlayMessage": "Generate a key to see credits and available credits", + "label": "API Key", + "guestInfo": "Guest users do not receive API keys. Create an account to get an API key you can use in your applications.", + "goToAccount": "Go to Account", + "refreshModal": { + "title": "Refresh API Keys", + "warning": "âš ī¸ Warning: This action will generate new API keys and make your previous keys invalid.", + "impact": "Any applications or services currently using these keys will stop working until you update them with the new keys.", + "confirmPrompt": "Are you sure you want to continue?", + "confirmCta": "Refresh Keys" + }, + "generateError": "We couldn't generate your API key." + } + }, + "AddAttachmentsRequest": { + "attachments": "Select Attachments", + "info": "Select files to attach to your PDF. These files will be embedded and accessible through the PDF's attachment panel.", + "selectFiles": "Select Files to Attach", + "placeholder": "Choose files...", + "addMoreFiles": "Add more files...", + "selectedFiles": "Selected Files", + "submit": "Add Attachments", + "results": { + "title": "Attachment Results" + }, + "error": { + "failed": "Add attachments operation failed" + } + }, + "termsAndConditions": "Terms & Conditions", + "logOut": "Log out", + "addAttachments": { + "error": { + "failed": "An error occurred while adding attachments to the PDF." + } + }, + "autoRename": { + "description": "This tool will automatically rename PDF files based on their content. It analyzes the document to find the most suitable title from the text." + }, + "customPosition": "Custom Position", + "details": "Details", + "downloadUnavailable": "Download unavailable for this item", + "invalidUndoData": "Cannot undo: invalid operation data", + "margin": { + "large": "Large", + "medium": "Medium", + "small": "Small", + "xLarge": "Extra Large" + }, + "noFilesToUndo": "Cannot undo: no files were processed in the last operation", + "noOperationToUndo": "No operation to undo", + "noValidFiles": "No valid files to process", + "operationCancelled": "Operation cancelled", + "pageEdit": { + "deselectAll": "Select None", + "selectAll": "Select All" + }, + "quickPosition": "Quick Position", + "reorganizePages": { + "error": { + "failed": "Failed to reorganize pages" + }, + "results": { + "title": "Pages Reorganized" + }, + "settings": { + "title": "Settings" + }, + "submit": "Reorganize Pages" + }, + "replace-color": { + "options": { + "fill": "Fill colour", + "gradient": "Gradient" + }, + "previewOverlayOpacity": "Preview overlay opacity", + "previewOverlayTransparency": "Preview overlay transparency", + "previewOverlayVisibility": "Show preview overlay", + "selectText": { + "1": "ėƒ‰ėƒ ęĩė˛´ 또는 ë°˜ė „ ė˜ĩė…˜", + "2": "ę¸°ëŗ¸ę°’(ę¸°ëŗ¸ ęŗ ëŒ€ëš„ ėƒ‰ėƒ)", + "3": "ė‚ŦėšŠėž 맀렕(ė‚ŦėšŠėž 맀렕 ėƒ‰ėƒ)", + "4": "렄랴 ë°˜ė „(ëĒ¨ë“  ėƒ‰ėƒ ë°˜ė „)", + "5": "ęŗ ëŒ€ëš„ ėƒ‰ėƒ ė˜ĩė…˜", + "6": "枀렕 ë°°ę˛Ŋ뗐 í°ėƒ‰ í…ėŠ¤íŠ¸", + "7": "í°ėƒ‰ ë°°ę˛Ŋ뗐 枀렕 í…ėŠ¤íŠ¸", + "8": "枀렕 ë°°ę˛Ŋ뗐 ë…¸ëž€ėƒ‰ í…ėŠ¤íŠ¸", + "9": "枀렕 ë°°ę˛Ŋ뗐 ė´ˆëĄėƒ‰ í…ėŠ¤íŠ¸", + "10": "í…ėŠ¤íŠ¸ ėƒ‰ėƒ ė„ íƒ", + "11": "ë°°ę˛Ŋ ėƒ‰ėƒ ė„ íƒ", + "12": "Choose start colour", + "13": "Choose end colour" + }, + "submit": "ęĩė˛´", + "title": "ėƒ‰ėƒ ęĩė˛´-ë°˜ė „", + "header": "PDF ėƒ‰ėƒ ęĩė˛´-ë°˜ė „" + }, + "size": "Size", + "submit": "Submit", + "success": "Success", + "tools": { + "noSearchResults": "No tools found", + "noTools": "No tools available" + }, + "undoDataMismatch": "Cannot undo: operation data is corrupted", + "undoFailed": "Failed to undo operation", + "undoQuotaError": "Cannot undo: insufficient storage space", + "undoStorageError": "Undo completed but some files could not be saved to storage", + "undoSuccess": "Operation undone successfully", + "unsupported": "Unsupported", + "onboarding": { + "welcomeModal": { + "title": "Welcome to Stirling PDF!", + "description": "Would you like to take a quick 1-minute tour to learn the key features and how to get started?", + "helpHint": "You can always access this tour later from the Help button in the bottom left.", + "startTour": "Start Tour", + "maybeLater": "Maybe Later", + "dontShowAgain": "Don't Show Again" + }, + "allTools": "This is the All Tools panel, where you can browse and select from all available PDF tools.", + "selectCropTool": "Let's select the Crop tool to demonstrate how to use one of the tools.", + "toolInterface": "This is the Crop tool interface. As you can see, there's not much there because we haven't added any PDF files to work with yet.", + "filesButton": "The Files button on the Quick Access bar allows you to upload PDFs to use the tools on.", + "fileSources": "You can upload new files or access recent files from here. For the tour, we'll just use a sample file.", + "workbench": "This is the Workbench - the main area where you view and edit your PDFs.", + "viewSwitcher": "Use these controls to select how you want to view your PDFs.", + "viewer": "The Viewer lets you read and annotate your PDFs.", + "pageEditor": "The Page Editor allows you to do various operations on the pages within your PDFs, such as reordering, rotating and deleting.", + "activeFiles": "The Active Files view shows all of the PDFs you have loaded into the tool, and allows you to select which ones to process.", + "fileCheckbox": "Clicking one of the files selects it for processing. You can select multiple files for batch operations.", + "selectControls": "The Right Rail contains buttons to quickly select/deselect all of your active PDFs, along with buttons to change the app's theme or language.", + "cropSettings": "Now that we've selected the file we want crop, we can configure the Crop tool to choose the area that we want to crop the PDF to.", + "runButton": "Once the tool has been configured, this button allows you to run the tool on all the selected PDFs.", + "results": "After the tool has finished running, the Review step will show a preview of the results in this panel, and allow you to undo the operation or download the file. ", + "fileReplacement": "The modified file will replace the original file in the Workbench automatically, allowing you to easily run it through more tools.", + "pinButton": "You can use the Pin button if you'd rather your files stay active after running tools on them.", + "wrapUp": "You're all set! You've learnt about the main areas of the app and how to use them. Click the Help button whenever you like to see this tour again.", + "previous": "Previous", + "next": "Next", + "finish": "Finish", + "startTour": "Start Tour", + "startTourDescription": "Take a guided tour of Stirling PDF's key features" + }, + "workspace": { + "title": "Workspace", + "people": { + "title": "People", + "description": "Manage workspace members and their permissions", + "loading": "Loading people...", + "searchMembers": "Search members...", + "addMembers": "Add Members", + "inviteMembers": { + "label": "Invite Members", + "subtitle": "Type or paste in emails below, separated by commas. Your workspace will be billed by members." + }, + "user": "User", + "role": "Role", + "team": "Team", + "status": "Status", + "actions": "Actions", + "noMembersFound": "No members found", + "active": "Active", + "disabled": "Disabled", + "activeSession": "Active session", + "member": "Member", + "admin": "Admin", + "roleDescriptions": { + "admin": "Can manage settings and invite members, with full administrative access.", + "member": "Can view and edit shared files, but cannot manage workspace settings or members." + }, + "editRole": "Edit Role", + "enable": "Enable", + "disable": "Disable", + "deleteUser": "Delete User", + "deleteUserSuccess": "User deleted successfully", + "deleteUserError": "Failed to delete user", + "confirmDelete": "Are you sure you want to delete this user? This action cannot be undone.", + "addMember": { + "title": "Add Member", + "username": "Username (Email)", + "usernamePlaceholder": "user@example.com", + "password": "Password", + "passwordPlaceholder": "Enter password", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "forcePasswordChange": "Force password change on first login", + "cancel": "Cancel", + "submit": "Add Member", + "usernameRequired": "Username and password are required", + "passwordTooShort": "Password must be at least 6 characters", + "success": "User created successfully", + "error": "Failed to create user" + }, + "editMember": { + "title": "Edit Member", + "editing": "Editing:", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "cancel": "Cancel", + "submit": "Update Member", + "success": "User updated successfully", + "error": "Failed to update user" + }, + "toggleEnabled": { + "success": "User status updated successfully", + "error": "Failed to update user status" + }, + "delete": { + "success": "User deleted successfully", + "error": "Failed to delete user" + }, + "emailInvite": { + "tab": "Email Invite", + "description": "Type or paste in emails below, separated by commas. Users will receive login credentials via email.", + "emails": "Email Addresses", + "emailsPlaceholder": "user1@example.com, user2@example.com", + "emailsRequired": "At least one email address is required", + "submit": "Send Invites", + "success": "user(s) invited successfully", + "partialSuccess": "Some invites failed", + "allFailed": "Failed to invite users", + "error": "Failed to send invites" + }, + "directInvite": { + "tab": "Direct Create" + }, + "inviteLinkTab": { + "tab": "Invite Link" + }, + "inviteLink": { + "description": "Generate a secure link that allows the user to set their own password", + "email": "Email Address", + "emailPlaceholder": "user@example.com (optional)", + "emailDescription": "Optional - leave blank for a general invite link that can be used by anyone", + "emailRequired": "Email address is required", + "emailOptional": "Optional - leave blank for a general invite link", + "emailRequiredForSend": "Email address is required to send email notification", + "expiryHours": "Expiry Hours", + "expiryDescription": "How many hours until the link expires", + "sendEmail": "Send invite link via email", + "sendEmailDescription": "If enabled, the invite link will be sent to the specified email address", + "smtpRequired": "SMTP not configured", + "generate": "Generate Link", + "generated": "Invite Link Generated", + "copied": "Link copied to clipboard", + "success": "Invite link generated successfully", + "successWithEmail": "Invite link generated and sent via email", + "emailFailed": "Invite link generated, but email failed", + "emailFailedDetails": "Error: {0}. Please share the invite link manually.", + "error": "Failed to generate invite link", + "submit": "Generate Invite Link" + }, + "inviteMode": { + "username": "Username", + "email": "Email", + "link": "Link", + "emailDisabled": "Email invites require SMTP configuration and mail.enableInvites=true in settings" + }, + "license": { + "users": "users", + "availableSlots": "Available Slots", + "grandfathered": "Grandfathered", + "grandfatheredShort": "{{count}} grandfathered", + "fromLicense": "from license", + "slotsAvailable": "{{count}} user slot(s) available", + "noSlotsAvailable": "No slots available", + "currentUsage": "Currently using {{current}} of {{max}} user licences" + } + }, + "teams": { + "title": "Teams", + "description": "Manage teams and organize workspace members", + "loading": "Loading teams...", + "loadingDetails": "Loading team details...", + "createNewTeam": "Create New Team", + "teamName": "Team Name", + "totalMembers": "Total Members", + "actions": "Actions", + "noTeamsFound": "No teams found", + "noMembers": "No members in this team", + "system": "System", + "addMember": "Add Member", + "viewTeam": "View Team", + "removeMember": "Remove from team", + "cannotRemoveFromSystemTeam": "Cannot remove from system team", + "renameTeamLabel": "Rename Team", + "deleteTeamLabel": "Delete Team", + "cannotDeleteInternal": "Cannot delete the Internal team", + "confirmDelete": "Are you sure you want to delete this team? This team must be empty to delete.", + "confirmRemove": "Remove user from this team?", + "cannotRenameInternal": "Cannot rename the Internal team", + "cannotAddToInternal": "Cannot add members to the Internal team", + "teamNotFound": "Team not found", + "backToTeams": "Back to Teams", + "memberCount": "{{count}} members", + "removeMemberSuccess": "User removed from team", + "removeMemberError": "Failed to remove user from team", + "createTeam": { + "title": "Create New Team", + "teamName": "Team Name", + "teamNamePlaceholder": "Enter team name", + "cancel": "Cancel", + "submit": "Create Team", + "nameRequired": "Team name is required", + "success": "Team created successfully", + "error": "Failed to create team" + }, + "renameTeam": { + "title": "Rename Team", + "renaming": "Renaming:", + "newTeamName": "New Team Name", + "newTeamNamePlaceholder": "Enter new team name", + "cancel": "Cancel", + "submit": "Rename Team", + "nameRequired": "Team name is required", + "success": "Team renamed successfully", + "error": "Failed to rename team" + }, + "deleteTeam": { + "success": "Team deleted successfully", + "error": "Failed to delete team. Make sure the team is empty.", + "teamMustBeEmpty": "Team must be empty before deletion" + }, + "addMemberToTeam": { + "title": "Add Member to Team", + "addingTo": "Adding to", + "selectUser": "Select User", + "selectUserPlaceholder": "Choose a user", + "selectUserRequired": "Please select a user", + "currentlyIn": "currently in", + "willBeMoved": "Note: This user will be moved from their current team to this team.", + "cancel": "Cancel", + "submit": "Add Member", + "userRequired": "Please select a user", + "success": "Member added to team successfully", + "error": "Failed to add member to team" + }, + "changeTeam": { + "label": "Change Team", + "title": "Change Team", + "changing": "Moving", + "selectTeam": "Select Team", + "selectTeamPlaceholder": "Choose a team", + "selectTeamRequired": "Please select a team", + "success": "Team changed successfully", + "error": "Failed to change team", + "submit": "Change Team" + } + } + }, + "plan": { + "currency": "Currency", + "popular": "Popular", + "current": "Current Plan", + "upgrade": "Upgrade", + "contact": "Contact Us", + "customPricing": "Custom", + "showComparison": "Compare All Features", + "hideComparison": "Hide Feature Comparison", + "featureComparison": "Feature Comparison", + "activePlan": { + "title": "Active Plan", + "subtitle": "Your current subscription details" + }, + "availablePlans": { + "title": "Available Plans", + "subtitle": "Choose the plan that fits your needs" + }, + "static": { + "title": "Billing Information", + "message": "Online billing is not currently configured. To upgrade your plan or manage subscriptions, please contact us directly.", + "contactSales": "Contact Sales", + "contactToUpgrade": "Contact us to upgrade or customize your plan", + "maxUsers": "Max Users", + "upTo": "Up to" + }, + "period": { + "month": "month" + }, + "free": { + "name": "Free", + "highlight1": "Limited Tool Usage Per week", + "highlight2": "Access to all tools", + "highlight3": "Community support" + }, + "pro": { + "name": "Pro", + "highlight1": "Unlimited Tool Usage", + "highlight2": "Advanced PDF tools", + "highlight3": "No watermarks" + }, + "enterprise": { + "name": "Enterprise", + "highlight1": "Custom pricing", + "highlight2": "Dedicated support", + "highlight3": "Latest features" + }, + "feature": { + "title": "Feature", + "pdfTools": "Basic PDF Tools", + "fileSize": "File Size Limit", + "automation": "Automate tool workflows", + "api": "API Access", + "priority": "Priority Support", + "customPricing": "Custom Pricing" + } + }, + "subscription": { + "status": { + "active": "Active", + "pastDue": "Past Due", + "canceled": "Canceled", + "incomplete": "Incomplete", + "trialing": "Trial", + "none": "No Subscription" + }, + "renewsOn": "Renews on {{date}}", + "cancelsOn": "Cancels on {{date}}" + }, + "billing": { + "manageBilling": "Manage Billing", + "portal": { + "error": "Failed to open billing portal" + } + }, + "payment": { + "preparing": "Preparing your checkout...", + "upgradeTitle": "Upgrade to {{planName}}", + "success": "Payment Successful!", + "successMessage": "Your subscription has been activated successfully. You will receive a confirmation email shortly.", + "autoClose": "This window will close automatically...", + "error": "Payment Error" + }, + "firstLogin": { + "title": "First Time Login", + "welcomeTitle": "Welcome!", + "welcomeMessage": "For security reasons, you must change your password on your first login.", + "loggedInAs": "Logged in as", + "error": "Error", + "currentPassword": "Current Password", + "enterCurrentPassword": "Enter your current password", + "newPassword": "New Password", + "enterNewPassword": "Enter new password (min 8 characters)", + "confirmPassword": "Confirm New Password", + "reEnterNewPassword": "Re-enter new password", + "changePassword": "Change Password", + "allFieldsRequired": "All fields are required", + "passwordsDoNotMatch": "New passwords do not match", + "passwordTooShort": "Password must be at least 8 characters", + "passwordMustBeDifferent": "New password must be different from current password", + "passwordChangedSuccess": "Password changed successfully! Please log in again.", + "passwordChangeFailed": "Failed to change password. Please check your current password." + }, + "invite": { + "welcome": "Welcome to Stirling PDF", + "invalidToken": "Invalid invitation link", + "validationError": "Failed to validate invitation link", + "passwordRequired": "Password is required", + "passwordTooShort": "Password must be at least 6 characters", + "passwordMismatch": "Passwords do not match", + "acceptError": "Failed to create account", + "validating": "Validating invitation...", + "invalidInvitation": "Invalid Invitation", + "goToLogin": "Go to Login", + "welcomeTitle": "You've been invited!", + "welcomeSubtitle": "Complete your account setup to get started", + "accountFor": "Creating account for", + "linkExpires": "Link expires", + "email": "Email address", + "emailPlaceholder": "Enter your email address", + "emailRequired": "Email address is required", + "invalidEmail": "Invalid email address", + "choosePassword": "Choose a password", + "passwordPlaceholder": "Enter your password", + "confirmPassword": "Confirm password", + "confirmPasswordPlaceholder": "Re-enter your password", + "createAccount": "Create Account", + "creating": "Creating Account...", + "alreadyHaveAccount": "Already have an account?", + "signIn": "Sign in" + }, + "audit": { + "error": { + "title": "Error loading audit system" + }, + "notAvailable": "Audit system not available", + "notAvailableMessage": "The audit system is not configured or not available.", + "disabled": "Audit logging is disabled", + "disabledMessage": "Enable audit logging in your application configuration to track system events.", + "systemStatus": { + "title": "System Status", + "status": "Audit Logging", + "enabled": "Enabled", + "disabled": "Disabled", + "level": "Audit Level", + "retention": "Retention Period", + "days": "days", + "totalEvents": "Total Events" + }, + "tabs": { + "dashboard": "Dashboard", + "events": "Audit Events", + "export": "Export" + }, + "charts": { + "title": "Audit Dashboard", + "error": "Error loading charts", + "day": "Day", + "week": "Week", + "month": "Month", + "byType": "Events by Type", + "byUser": "Events by User", + "overTime": "Events Over Time" + }, + "events": { + "title": "Audit Events", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "error": "Error loading events", + "noEvents": "No events found", + "timestamp": "Timestamp", + "type": "Type", + "user": "User", + "ipAddress": "IP Address", + "actions": "Actions", + "viewDetails": "View Details", + "eventDetails": "Event Details", + "details": "Details" + }, + "export": { + "title": "Export Audit Data", + "description": "Export audit events to CSV or JSON format. Use filters to limit the exported data.", + "format": "Export Format", + "filters": "Filters (Optional)", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "exportButton": "Export Data", + "error": "Failed to export data" + } + }, + "usage": { + "noData": "No data available", + "error": "Error loading usage statistics", + "noDataMessage": "No usage statistics are currently available.", + "controls": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All", + "refresh": "Refresh", + "dataTypeLabel": "Data Type:", + "dataType": { + "all": "All", + "api": "API", + "ui": "UI" + } + }, + "showing": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All" + }, + "stats": { + "totalEndpoints": "Total Endpoints", + "totalVisits": "Total Visits", + "showing": "Showing", + "selectedVisits": "Selected Visits" + }, + "chart": { + "title": "Endpoint Usage Chart" + }, + "table": { + "title": "Detailed Statistics", + "endpoint": "Endpoint", + "visits": "Visits", + "percentage": "Percentage", + "noData": "No data available" + } + }, + "backendHealth": { + "checking": "Checking backend status...", + "online": "Backend Online", + "offline": "Backend Offline" + }, + "autoRedact": { + "tags": "枀뗴,ėˆ¨ęš€,검게-가ëĻŧ,ę˛€ė€ėƒ‰,마ėģ¤,ėˆ¨ęš€", + "title": "ėžë™ 枀뗴", + "header": "ėžë™ 枀뗴", + "colorLabel": "ėƒ‰ėƒ", + "textsToRedactLabel": "ę˛€ė—´í•  í…ėŠ¤íŠ¸ (뤄 ë‹¨ėœ„ëĄœ ęĩŦëļ„)", + "textsToRedactPlaceholder": "똈: \\n기밀 \\nėĩœęŗ  기밀", + "useRegexLabel": "ė •ęˇœė‹ ė‚ŦėšŠ", + "wholeWordSearchLabel": "렄랴 ë‹¨ė–´ ę˛€ėƒ‰", + "customPaddingLabel": "ė‚ŦėšŠėž 맀렕 ė—Ŧë°ą", + "convertPDFToImageLabel": "PDFëĨŧ PDF-Image로 ëŗ€í™˜ (ë°•ėŠ¤ ë’¤ė˜ í…ėŠ¤íŠ¸ ė œęą°ė— ė‚ŦėšŠ)", + "submitButton": "렜ėļœ" + }, + "replaceColorPdf": { + "tags": "ėƒ‰ėƒ ęĩė˛´,íŽ˜ė´ė§€ ėž‘ė—…,ë°ąė—”ë“œ,ė„œë˛„ ė‚Ŧė´ë“œ" } -} \ No newline at end of file +} diff --git a/frontend/public/locales/ml-ML/translation.json b/frontend/public/locales/ml-ML/translation.json index b272c0ee2..1a8b5b7a8 100644 --- a/frontend/public/locales/ml-ML/translation.json +++ b/frontend/public/locales/ml-ML/translation.json @@ -1,4 +1,40 @@ { + "toolPanel": { + "modePrompt": { + "title": "Choose how you browse tools", + "description": "Preview both layouts and decide how you want to explore Stirling PDF tools.", + "sidebarTitle": "Sidebar mode", + "sidebarDescription": "Keep tools alongside your workspace for quick switching.", + "recommended": "Recommended", + "chooseSidebar": "Use sidebar mode", + "fullscreenTitle": "Fullscreen mode - (legacy)", + "fullscreenDescription": "Browse every tool in a catalogue that covers the workspace until you pick one.", + "chooseFullscreen": "Use fullscreen mode", + "dismiss": "Maybe later" + }, + "fullscreen": { + "showDetails": "Show Details", + "comingSoon": "Coming soon:", + "favorite": "Add to favourites", + "favorites": "Favourites", + "heading": "All tools (fullscreen view)", + "noResults": "Try adjusting your search or toggle descriptions to find what you need.", + "recommended": "Recommended", + "unfavorite": "Remove from favourites" + }, + "placeholder": "Choose a tool to get started", + "toggle": { + "fullscreen": "Switch to fullscreen mode", + "sidebar": "Switch to sidebar mode" + } + }, + "unsavedChanges": "You have unsaved changes to your PDF.", + "areYouSure": "Are you sure you want to leave?", + "unsavedChangesTitle": "Unsaved Changes", + "keepWorking": "Keep Working", + "discardChanges": "Discard & Leave", + "applyAndContinue": "Save & Leave", + "exportAndContinue": "Export & Continue", "language": { "direction": "ltr" }, @@ -18,8 +54,26 @@ "customTextDesc": "ⴇⴎāĩā´Ÿā´žā´¨āĩā´¸āĩƒā´¤ ⴟāĩ†ā´•āĩā´¸āĩā´ąāĩā´ąāĩ", "numberPagesDesc": "ā´ā´¤āĩ ā´Ēāĩ‡ā´œāĩā´•ā´ŗā´žā´Ŗāĩ ā´¨ā´Žāĩā´Ēāĩŧ ⴚāĩ†ā´¯āĩā´¯āĩ‡ā´Ŗāĩā´Ÿā´¤āĩ, ā´¸āĩā´Ĩā´ŋā´°ā´¸āĩā´Ĩā´ŋā´¤ā´ŋ 'ā´Žā´˛āĩā´˛ā´žā´‚', 1-5 ā´…ā´˛āĩā´˛āĩ†ā´™āĩā´•ā´ŋāĩŊ 2,5,9 ā´¤āĩā´Ÿā´™āĩā´™ā´ŋā´¯ā´ĩā´¯āĩā´‚ ā´¸āĩā´ĩāĩ€ā´•ā´°ā´ŋā´•āĩā´•āĩā´¨āĩā´¨āĩ", "customNumberDesc": "ā´¸āĩā´Ĩā´ŋā´°ā´¸āĩā´Ĩā´ŋā´¤ā´ŋā´¯ā´žā´¯ā´ŋ {n}, 'ā´Ēāĩ‡ā´œāĩ {n} / {total}', 'ⴟāĩ†ā´•āĩā´¸āĩā´ąāĩā´ąāĩ-{n}', '{filename}-{n}' ā´Žā´¨āĩā´¨ā´ŋā´ĩā´¯āĩā´‚ ā´¸āĩā´ĩāĩ€ā´•ā´°ā´ŋā´•āĩā´•āĩā´¨āĩā´¨āĩ", - "submit": "ā´Ēāĩ‡ā´œāĩ ā´¨ā´Žāĩā´Ēā´ąāĩā´•āĩž ⴚāĩ‡āĩŧā´•āĩā´•āĩā´•" + "submit": "ā´Ēāĩ‡ā´œāĩ ā´¨ā´Žāĩā´Ēā´ąāĩā´•āĩž ⴚāĩ‡āĩŧā´•āĩā´•āĩā´•", + "configuration": "Configuration", + "customize": "Customize Appearance", + "pagesAndStarting": "Pages & Starting Number", + "positionAndPages": "Position & Pages", + "error": { + "failed": "Add page numbers operation failed" + }, + "results": { + "title": "Page Number Results" + }, + "preview": "Position Selection", + "previewDisclaimer": "Preview is approximate. Final output may vary due to PDF font metrics." }, + "pageSelectionPrompt": "ⴇⴎāĩā´Ÿā´žā´¨āĩā´¸āĩƒā´¤ ā´Ēāĩ‡ā´œāĩ ā´¤ā´ŋā´°ā´žāĩā´žāĩ†ā´Ÿāĩā´•āĩā´•āĩŊ (ā´Ēāĩ‡ā´œāĩ ā´¨ā´Žāĩā´Ēā´ąāĩā´•ā´ŗāĩā´Ÿāĩ† ā´•āĩ‹ā´Žā´¯ā´žāĩŊ ā´ĩāĩ‡āĩŧā´¤ā´ŋā´°ā´ŋⴚāĩā´š ā´˛ā´ŋā´¸āĩā´ąāĩā´ąāĩ 1,5,6 ā´…ā´˛āĩā´˛āĩ†ā´™āĩā´•ā´ŋāĩŊ 2n+1 ā´Ēāĩ‹ā´˛āĩā´ŗāĩā´ŗ ā´Ģā´‚ā´—āĩā´ˇā´¨āĩā´•āĩž ā´¨āĩŊā´•āĩā´•) :", + "startingNumberTooltip": "The first number to display. Subsequent pages will increment from this number.", + "marginTooltip": "Distance between the page number and the edge of the page.", + "fontSizeTooltip": "Size of the page number text in points. Larger numbers create bigger text.", + "fontTypeTooltip": "Font family for the page numbers. Choose based on your document style.", + "customTextTooltip": "Optional custom format for page numbers. Use {n} as placeholder for the number. Example: \"Page {n}\" will show \"Page 1\", \"Page 2\", etc.", "pdfPrompt": "PDF(ā´•āĩž) ā´¤ā´ŋā´°ā´žāĩā´žāĩ†ā´Ÿāĩā´•āĩā´•āĩā´•", "multiPdfPrompt": "PDF-ā´•āĩž ā´¤ā´ŋā´°ā´žāĩā´žāĩ†ā´Ÿāĩā´•āĩā´•āĩā´• (2+)", "multiPdfDropPrompt": "ā´¨ā´ŋā´™āĩā´™āĩžā´•āĩā´•āĩ ā´†ā´ĩā´ļāĩā´¯ā´Žāĩā´ŗāĩā´ŗ ā´Žā´˛āĩā´˛ā´ž PDF-ā´•ā´ŗāĩā´‚ ā´¤ā´ŋā´°ā´žāĩā´žāĩ†ā´Ÿāĩā´•āĩā´•āĩā´• (ā´…ā´˛āĩā´˛āĩ†ā´™āĩā´•ā´ŋāĩŊ ā´ĩā´˛ā´ŋⴚāĩā´šā´ŋⴟāĩā´•)", @@ -30,15 +84,41 @@ "uploadLimitExceededPlural": "ā´ĩā´ŗā´°āĩ† ā´ĩā´˛āĩā´¤ā´žā´Ŗāĩ. ā´…ā´¨āĩā´ĩā´Ļā´¨āĩ€ā´¯ā´Žā´žā´¯ ā´Ēā´°ā´Žā´žā´ĩā´§ā´ŋ ā´ĩā´˛āĩā´Ēāĩā´Ēā´‚", "processTimeWarning": "ā´Žāĩā´¨āĩā´¨ā´ąā´ŋā´¯ā´ŋā´Ēāĩā´Ēāĩ: ā´Ģā´¯āĩŊ ā´ĩā´˛āĩā´Ēāĩā´Ēā´¤āĩā´¤ā´ŋⴍⴍāĩā´¸ā´°ā´ŋⴚāĩā´šāĩ ⴈ ā´Ēāĩā´°ā´•āĩā´°ā´ŋā´¯ ā´’ā´°āĩ ā´Žā´ŋā´¨ā´ŋā´ąāĩā´ąāĩ ā´ĩā´°āĩ† ā´Žā´Ÿāĩā´¤āĩā´¤āĩ‡ā´•āĩā´•ā´žā´‚", "pageOrderPrompt": "ⴇⴎāĩā´Ÿā´žā´¨āĩā´¸āĩƒā´¤ ā´Ēāĩ‡ā´œāĩ ā´•āĩā´°ā´Žā´‚ (ā´Ēāĩ‡ā´œāĩ ā´¨ā´Žāĩā´Ēā´ąāĩā´•ā´ŗāĩā´Ÿāĩ† ā´•āĩ‹ā´Žā´¯ā´žāĩŊ ā´ĩāĩ‡āĩŧā´¤ā´ŋā´°ā´ŋⴚāĩā´š ā´˛ā´ŋā´¸āĩā´ąāĩā´ąāĩ ā´…ā´˛āĩā´˛āĩ†ā´™āĩā´•ā´ŋāĩŊ 2n+1 ā´Ēāĩ‹ā´˛āĩā´ŗāĩā´ŗ ā´Ģā´‚ā´—āĩā´ˇā´¨āĩā´•āĩž ā´¨āĩŊā´•āĩā´•) :", - "pageSelectionPrompt": "ⴇⴎāĩā´Ÿā´žā´¨āĩā´¸āĩƒā´¤ ā´Ēāĩ‡ā´œāĩ ā´¤ā´ŋā´°ā´žāĩā´žāĩ†ā´Ÿāĩā´•āĩā´•āĩŊ (ā´Ēāĩ‡ā´œāĩ ā´¨ā´Žāĩā´Ēā´ąāĩā´•ā´ŗāĩā´Ÿāĩ† ā´•āĩ‹ā´Žā´¯ā´žāĩŊ ā´ĩāĩ‡āĩŧā´¤ā´ŋā´°ā´ŋⴚāĩā´š ā´˛ā´ŋā´¸āĩā´ąāĩā´ąāĩ 1,5,6 ā´…ā´˛āĩā´˛āĩ†ā´™āĩā´•ā´ŋāĩŊ 2n+1 ā´Ēāĩ‹ā´˛āĩā´ŗāĩā´ŗ ā´Ģā´‚ā´—āĩā´ˇā´¨āĩā´•āĩž ā´¨āĩŊā´•āĩā´•) :", "goToPage": "ā´Ēāĩ‹ā´•āĩā´•", "true": "ā´ļā´°ā´ŋ", "false": "ā´¤āĩ†ā´ąāĩā´ąāĩ", "unknown": "ā´…ā´œāĩā´žā´žā´¤ā´‚", + "app": { + "description": "The Free Adobe Acrobat alternative (10M+ Downloads)" + }, "save": "ā´¸āĩ‡ā´ĩāĩ ⴚāĩ†ā´¯āĩā´¯āĩā´•", "saveToBrowser": "ā´Ŧāĩā´°āĩ—ā´¸ā´ąā´ŋāĩŊ ā´¸āĩ‡ā´ĩāĩ ⴚāĩ†ā´¯āĩā´¯āĩā´•", + "download": "Download", + "pin": "Pin File (keep active after tool run)", + "unpin": "Unpin File (replace after tool run)", + "undoOperationTooltip": "Click to undo the last operation and restore the original files", + "undo": "Undo", + "moreOptions": "More Options", + "editYourNewFiles": "Edit your new file(s)", "close": "ā´…ā´Ÿā´¯āĩā´•āĩā´•āĩā´•", + "openInViewer": "Open in Viewer", + "confirmClose": "Confirm Close", + "confirmCloseMessage": "Are you sure you want to close this file?", + "confirmCloseCancel": "Cancel", + "confirmCloseConfirm": "Close File", + "fileSelected": "Selected: {{filename}}", + "chooseFile": "Choose File", "filesSelected": "ā´Ģⴝⴞāĩā´•āĩž ā´¤ā´ŋā´°ā´žāĩā´žāĩ†ā´Ÿāĩā´¤āĩā´¤āĩ", + "files": { + "title": "Files", + "upload": "Upload", + "uploadFiles": "Upload Files", + "addFiles": "Add files", + "selectFromWorkbench": "Select files from the workbench or ", + "selectMultipleFromWorkbench": "Select at least {{count}} files from the workbench or ", + "created": "Created", + "size": "File Size" + }, "noFavourites": "ā´Ēāĩā´°ā´ŋā´¯ā´Ēāĩā´Ēāĩ†ā´Ÿāĩā´Ÿā´ĩ ⴚāĩ‡āĩŧā´¤āĩā´¤ā´ŋⴟāĩā´Ÿā´ŋā´˛āĩā´˛", "downloadComplete": "ā´Ąāĩ—āĩēā´˛āĩ‹ā´Ąāĩ ā´Ēāĩ‚āĩŧā´¤āĩā´¤ā´ŋā´¯ā´žā´¯ā´ŋ", "bored": "ā´•ā´žā´¤āĩā´¤ā´ŋā´°āĩā´¨āĩā´¨āĩ ā´Žāĩā´ˇā´ŋā´žāĩā´žāĩ‹?", @@ -56,7 +136,10 @@ }, "error": { "pdfPassword": "PDF ā´Ąāĩ‹ā´•āĩā´¯āĩā´Žāĩ†ā´¨āĩā´ąāĩ ā´Ēā´žā´¸āĩâ€Œā´ĩāĩ‡ā´Ąāĩ ā´‰ā´Ēā´¯āĩ‹ā´—ā´ŋⴚāĩā´šāĩ ⴏⴂⴰⴕāĩā´ˇā´ŋⴚāĩā´šā´ŋā´°ā´ŋā´•āĩā´•āĩā´¨āĩā´¨āĩ, ā´Ēā´žā´¸āĩâ€Œā´ĩāĩ‡ā´Ąāĩ ā´¨āĩŊā´•ā´ŋā´¯ā´ŋⴟāĩā´Ÿā´ŋā´˛āĩā´˛ ā´…ā´˛āĩā´˛āĩ†ā´™āĩā´•ā´ŋāĩŊ ā´¤āĩ†ā´ąāĩā´ąā´žā´¯ā´ŋā´°āĩā´¨āĩā´¨āĩ", + "encryptedPdfMustRemovePassword": "This PDF is encrypted or password-protected. Please unlock it before converting to PDF/A.", + "incorrectPasswordProvided": "The PDF password is incorrect or not provided.", "_value": "ā´Ēā´ŋā´ļā´•āĩ", + "dismissAllErrors": "Dismiss All Errors", "sorry": "ā´Ēāĩā´°ā´ļāĩā´¨ā´¤āĩā´¤ā´ŋā´¨āĩ ā´•āĩā´ˇā´Žā´ŋā´•āĩā´•āĩā´•!", "needHelp": "ā´¸ā´šā´žā´¯ā´‚ ā´ĩāĩ‡ā´Ŗāĩ‹ / ā´’ā´°āĩ ā´Ēāĩā´°ā´ļāĩā´¨ā´‚ ā´•ā´Ŗāĩā´Ÿāĩ†ā´¤āĩā´¤ā´ŋā´¯āĩ‹?", "contactTip": "ā´¨ā´ŋā´™āĩā´™āĩžā´•āĩā´•āĩ ā´‡ā´Ēāĩā´Ēāĩ‹ā´´āĩā´‚ ā´Ēāĩā´°ā´ļāĩâ€Œā´¨ā´Žāĩā´Ŗāĩā´Ÿāĩ†ā´™āĩā´•ā´ŋāĩŊ, ā´¸ā´šā´žā´¯ā´¤āĩā´¤ā´ŋā´¨ā´žā´¯ā´ŋ ā´žā´™āĩā´™ā´ŗāĩ† ā´Ŧā´¨āĩā´§ā´Ēāĩā´Ēāĩ†ā´Ÿā´žāĩģ ā´Žā´Ÿā´ŋā´•āĩā´•ā´°āĩā´¤āĩ. ā´žā´™āĩā´™ā´ŗāĩā´Ÿāĩ† GitHub ā´Ēāĩ‡ā´œā´ŋāĩŊ ā´¨ā´ŋā´™āĩā´™āĩžā´•āĩā´•āĩ ā´’ā´°āĩ ⴟā´ŋā´•āĩā´•ā´ąāĩā´ąāĩ ā´¸ā´Žāĩŧā´Ēāĩā´Ēā´ŋā´•āĩā´•ā´žā´‚ ā´…ā´˛āĩā´˛āĩ†ā´™āĩā´•ā´ŋāĩŊ Discord ā´ĩā´´ā´ŋ ā´žā´™āĩā´™ā´ŗāĩ† ā´Ŧā´¨āĩā´§ā´Ēāĩā´Ēāĩ†ā´Ÿā´žā´‚:", @@ -71,6 +154,10 @@ "githubSubmit": "GitHub - ā´’ā´°āĩ ⴟā´ŋā´•āĩā´•ā´ąāĩā´ąāĩ ā´¸ā´Žāĩŧā´Ēāĩā´Ēā´ŋā´•āĩā´•āĩā´•", "discordSubmit": "Discord - ā´Ēā´ŋā´¨āĩā´¤āĩā´Ŗā´ž ā´Ēāĩ‹ā´¸āĩā´ąāĩā´ąāĩ ā´¸ā´Žāĩŧā´Ēāĩā´Ēā´ŋā´•āĩā´•āĩā´•" }, + "warning": { + "tooltipTitle": "Warning" + }, + "edit": "Edit", "delete": "ā´Žā´žā´¯āĩā´•āĩā´•āĩā´•", "username": "ā´‰ā´Ēā´¯āĩ‹ā´•āĩā´¤āĩƒā´¨ā´žā´Žā´‚", "password": "ā´Ēā´žā´¸āĩâ€Œā´ĩāĩ‡ā´Ąāĩ", @@ -82,6 +169,7 @@ "green": "ā´Ēⴚāĩā´š", "blue": "ā´¨āĩ€ā´˛", "custom": "ⴇⴎāĩā´Ÿā´žā´¨āĩā´¸āĩƒā´¤ā´‚...", + "comingSoon": "Coming soon", "WorkInProgess": "ā´¨ā´ŋāĩŧā´Žāĩā´Žā´žā´Ŗā´¤āĩā´¤ā´ŋā´˛ā´ŋā´°ā´ŋā´•āĩā´•āĩā´¨āĩā´¨āĩ, ā´ļā´°ā´ŋā´¯ā´žā´¯ā´ŋ ā´Ēāĩā´°ā´ĩāĩŧā´¤āĩā´¤ā´ŋⴚāĩā´šāĩ‡ā´•āĩā´•ā´ŋā´˛āĩā´˛ ā´…ā´˛āĩā´˛āĩ†ā´™āĩā´•ā´ŋāĩŊ ā´Ŧā´—āĩā´—āĩā´•āĩž ⴉ⴪āĩā´Ÿā´žā´•ā´žā´‚, ā´Ļā´¯ā´ĩā´žā´¯ā´ŋ ā´Ēāĩā´°ā´ļāĩā´¨ā´™āĩā´™āĩž ā´…ā´ąā´ŋā´¯ā´ŋā´•āĩā´•āĩā´•!", "poweredBy": "ā´¸ā´šā´žā´¯ā´¤āĩā´¤āĩ‹ā´Ÿāĩ†", "yes": "ā´…ā´¤āĩ†", @@ -115,12 +203,14 @@ "page": "ā´Ēāĩ‡ā´œāĩ", "pages": "ā´Ēāĩ‡ā´œāĩā´•āĩž", "loading": "ā´˛āĩ‹ā´Ąāĩ ⴚāĩ†ā´¯āĩā´¯āĩā´¨āĩā´¨āĩ...", + "review": "Review", "addToDoc": "ā´Ēāĩā´°ā´Žā´žā´Ŗā´¤āĩā´¤ā´ŋā´˛āĩ‡ā´•āĩā´•āĩ ⴚāĩ‡āĩŧā´•āĩā´•āĩā´•", "reset": "ā´Ēāĩā´¨ā´ƒā´¸ā´œāĩā´œā´Žā´žā´•āĩā´•āĩā´•", "apply": "ā´Ēāĩā´°ā´¯āĩ‹ā´—ā´ŋā´•āĩā´•āĩā´•", "noFileSelected": "ā´ĢⴝⴞāĩŠā´¨āĩā´¨āĩā´‚ ā´¤ā´ŋā´°ā´žāĩā´žāĩ†ā´Ÿāĩā´¤āĩā´¤ā´ŋⴟāĩā´Ÿā´ŋā´˛āĩā´˛. ā´Ļā´¯ā´ĩā´žā´¯ā´ŋ ā´’ā´°āĩ†ā´Ŗāĩā´Ŗā´‚ ā´…ā´Ēāĩâ€Œā´˛āĩ‹ā´Ąāĩ ⴚāĩ†ā´¯āĩā´¯āĩā´•.", "legal": { "privacy": "ā´¸āĩā´ĩā´•ā´žā´°āĩā´¯ā´¤ā´ž ⴍⴝⴂ", + "iAgreeToThe": "I agree to all of the", "terms": "ā´¨ā´ŋā´Ŧā´¨āĩā´§ā´¨ā´•ā´ŗāĩā´‚ ā´ĩāĩā´¯ā´ĩā´¸āĩā´Ĩā´•ā´ŗāĩā´‚", "accessibility": "ⴞⴭāĩā´¯ā´¤", "cookie": "ā´•āĩā´•āĩā´•ā´ŋ ⴍⴝⴂ", @@ -160,6 +250,7 @@ "title": "ā´¸āĩā´ąāĩā´ąāĩ†āĩŧā´˛ā´ŋā´‚ā´—āĩ PDF ā´Žā´ŋā´•ā´šāĩā´šā´¤ā´žā´•āĩā´•ā´žāĩģ ā´¨ā´ŋā´™āĩā´™āĩž ⴆⴗāĩā´°ā´šā´ŋā´•āĩā´•āĩā´¨āĩā´¨āĩā´Ŗāĩā´Ÿāĩ‹?", "paragraph1": "ā´‰āĩŊā´Ēāĩā´Ēā´¨āĩā´¨ā´‚ ā´Žāĩ†ā´šāĩā´šā´Ēāĩā´Ēāĩ†ā´Ÿāĩā´¤āĩā´¤ā´žāĩģ ā´žā´™āĩā´™ā´ŗāĩ† ā´¸ā´šā´žā´¯ā´ŋā´•āĩā´•āĩā´¨āĩā´¨ā´¤ā´ŋā´¨āĩ ā´¸āĩā´ąāĩā´ąāĩ†āĩŧā´˛ā´ŋā´‚ā´—āĩ PDF-āĩŊ ā´“ā´Ēāĩā´ąāĩā´ąāĩ-ā´‡āĩģ ⴅⴍⴞā´ŋā´ąāĩā´ąā´ŋā´•āĩā´¸āĩ ⴉ⴪āĩā´Ÿāĩ. ā´žā´™āĩā´™āĩž ā´ĩāĩā´¯ā´•āĩā´¤ā´ŋā´—ā´¤ ā´ĩā´ŋā´ĩā´°ā´™āĩā´™ā´ŗāĩ‹ ā´Ģā´¯āĩŊ ⴉⴺāĩā´ŗā´Ÿā´•āĩā´•ā´™āĩā´™ā´ŗāĩ‹ ⴟāĩā´°ā´žā´•āĩā´•āĩ ⴚāĩ†ā´¯āĩā´¯āĩā´¨āĩā´¨ā´ŋā´˛āĩā´˛.", "paragraph2": "ā´¸āĩā´ąāĩā´ąāĩ†āĩŧā´˛ā´ŋā´‚ā´—āĩ-PDF ā´ĩā´ŗā´°ā´žā´¨āĩā´‚ ā´žā´™āĩā´™ā´ŗāĩā´Ÿāĩ† ā´‰ā´Ēā´¯āĩ‹ā´•āĩā´¤ā´žā´•āĩā´•ā´ŗāĩ† ⴍⴍāĩā´¨ā´žā´¯ā´ŋ ā´Žā´¨ā´¸āĩā´¸ā´ŋā´˛ā´žā´•āĩā´•ā´žā´¨āĩā´‚ ⴅⴍⴞā´ŋā´ąāĩā´ąā´ŋā´•āĩā´¸āĩ ā´Ēāĩā´°ā´ĩāĩŧā´¤āĩā´¤ā´¨ā´•āĩā´ˇā´Žā´Žā´žā´•āĩā´•āĩā´¨āĩā´¨ā´¤āĩ ā´Ēā´°ā´ŋā´—ā´Ŗā´ŋā´•āĩā´•āĩā´•.", + "learnMore": "Learn more", "enable": "ⴅⴍⴞā´ŋā´ąāĩā´ąā´ŋā´•āĩā´¸āĩ ā´Ēāĩā´°ā´ĩāĩŧā´¤āĩā´¤ā´¨ā´•āĩā´ˇā´Žā´Žā´žā´•āĩā´•āĩā´•", "disable": "ⴅⴍⴞā´ŋā´ąāĩā´ąā´ŋā´•āĩā´¸āĩ ā´Ēāĩā´°ā´ĩāĩŧā´¤āĩā´¤ā´¨ā´°ā´šā´ŋā´¤ā´Žā´žā´•āĩā´•āĩā´•", "settings": "config/settings.yml ā´Ģⴝⴞā´ŋāĩŊ ā´¨ā´ŋā´™āĩā´™āĩžā´•āĩā´•āĩ ⴅⴍⴞā´ŋā´ąāĩā´ąā´ŋā´•āĩā´¸ā´ŋā´¨ā´žā´¯āĩā´ŗāĩā´ŗ ā´•āĩā´°ā´Žāĩ€ā´•ā´°ā´Ŗā´™āĩā´™āĩž ā´Žā´žā´ąāĩā´ąā´žāĩģ ā´•ā´´ā´ŋā´¯āĩā´‚" @@ -203,6 +294,54 @@ "cacheInputs": { "name": "ā´Ģāĩ‹ā´‚ ā´‡āĩģā´Ēāĩā´Ÿāĩā´Ÿāĩā´•āĩž ⴏⴂⴰⴕāĩā´ˇā´ŋā´•āĩā´•āĩā´•", "help": "ā´­ā´žā´ĩā´ŋā´¯ā´ŋā´˛āĩ† ā´‰ā´Ēā´¯āĩ‹ā´—ā´¤āĩā´¤ā´ŋā´¨ā´žā´¯ā´ŋ ā´Žāĩā´Žāĩā´Ēāĩ ā´‰ā´Ēā´¯āĩ‹ā´—ā´ŋⴚāĩā´š ā´‡āĩģā´Ēāĩā´Ÿāĩā´Ÿāĩā´•āĩž ⴏⴂⴭⴰā´ŋā´•āĩā´•ā´žāĩģ ā´Ēāĩā´°ā´ĩāĩŧā´¤āĩā´¤ā´¨ā´•āĩā´ˇā´Žā´Žā´žā´•āĩā´•āĩā´•" + }, + "general": { + "title": "General", + "description": "Configure general application preferences.", + "account": "Account", + "accountDescription": "Manage your account settings", + "user": "User", + "signedInAs": "Signed in as", + "logout": "Log out", + "enableFeatures": { + "title": "For System Administrators", + "intro": "Enable user authentication, team management, and workspace features for your organization.", + "action": "Configure", + "and": "and", + "benefit": "Enables user roles, team collaboration, admin controls, and enterprise features.", + "learnMore": "Learn more in documentation", + "dismiss": "Dismiss" + }, + "autoUnzip": "Auto-unzip API responses", + "autoUnzipDescription": "Automatically extract files from ZIP responses", + "autoUnzipTooltip": "Automatically extract ZIP files returned from API operations. Disable to keep ZIP files intact. This does not affect automation workflows.", + "autoUnzipFileLimit": "Auto-unzip file limit", + "autoUnzipFileLimitDescription": "Maximum number of files to extract from ZIP", + "autoUnzipFileLimitTooltip": "Only unzip if the ZIP contains this many files or fewer. Set higher to extract larger ZIPs.", + "defaultToolPickerMode": "Default tool picker mode", + "defaultToolPickerModeDescription": "Choose whether the tool picker opens in fullscreen or sidebar by default", + "mode": { + "fullscreen": "Fullscreen", + "sidebar": "Sidebar" + } + }, + "hotkeys": { + "title": "Keyboard Shortcuts", + "description": "Hover a tool to see its shortcut or customise it below. Click \"Change shortcut\" and press a new key combination. Press Esc to cancel.", + "errorModifier": { + "mac": "Include ⌘ (Command), âŒĨ (Option), or another modifier in your shortcut.", + "windows": "Include Ctrl, Alt, or another modifier in your shortcut." + }, + "errorConflict": "Shortcut already used by {{tool}}.", + "none": "Not assigned", + "customBadge": "Custom", + "defaultLabel": "Default: {{shortcut}}", + "capturing": "Press keysâ€Ļ (Esc to cancel)", + "change": "Change shortcut", + "reset": "Reset", + "shortcut": "Shortcut", + "noShortcut": "No shortcut set", + "searchPlaceholder": "Search tools..." } }, "changeCreds": { @@ -274,8 +413,10 @@ "top20": "ā´Žā´ŋā´•ā´šāĩā´š 20", "all": "ā´Žā´˛āĩā´˛ā´žā´‚", "refresh": "ā´Ēāĩā´¤āĩā´•āĩā´•āĩā´•", - "includeHomepage": "ā´šāĩ‹ā´‚ā´Ēāĩ‡ā´œāĩ ā´‰āĩžā´Ēāĩā´Ēāĩ†ā´Ÿāĩā´¤āĩā´¤āĩā´• ('/')", - "includeLoginPage": "ā´˛āĩ‹ā´—ā´ŋāĩģ ā´Ēāĩ‡ā´œāĩ ā´‰āĩžā´Ēāĩā´Ēāĩ†ā´Ÿāĩā´¤āĩā´¤āĩā´• ('/login')", + "dataTypeLabel": "Data Type:", + "dataTypeAll": "All", + "dataTypeApi": "API", + "dataTypeUi": "UI", "totalEndpoints": "ⴆⴕāĩ† ā´Žāĩģā´Ąāĩâ€Œā´Ēāĩ‹ā´¯ā´ŋā´¨āĩā´ąāĩā´•āĩž", "totalVisits": "ⴆⴕāĩ† ⴏⴍāĩā´Ļāĩŧā´ļⴍⴙāĩā´™āĩž", "showing": "ā´•ā´žā´Ŗā´ŋā´•āĩā´•āĩā´¨āĩā´¨āĩ", @@ -290,7 +431,9 @@ "top": "ā´Žā´ŋā´•ā´šāĩā´š", "numberOfVisits": "ⴏⴍāĩā´Ļāĩŧā´ļⴍⴙāĩā´™ā´ŗāĩā´Ÿāĩ† ā´Žā´Ŗāĩā´Ŗā´‚", "visitsTooltip": "ⴏⴍāĩā´Ļāĩŧā´ļⴍⴙāĩā´™āĩž: {0} (ⴆⴕāĩ†ā´¯āĩā´ŗāĩā´ŗā´¤ā´ŋā´¨āĩā´ąāĩ† {1}%)", - "retry": "ā´ĩāĩ€ā´Ŗāĩā´Ÿāĩā´‚ ā´ļāĩā´°ā´Žā´ŋā´•āĩā´•āĩā´•" + "retry": "ā´ĩāĩ€ā´Ŗāĩā´Ÿāĩā´‚ ā´ļāĩā´°ā´Žā´ŋā´•āĩā´•āĩā´•", + "includeHomepage": "ā´šāĩ‹ā´‚ā´Ēāĩ‡ā´œāĩ ā´‰āĩžā´Ēāĩā´Ēāĩ†ā´Ÿāĩā´¤āĩā´¤āĩā´• ('/')", + "includeLoginPage": "ā´˛āĩ‹ā´—ā´ŋāĩģ ā´Ēāĩ‡ā´œāĩ ā´‰āĩžā´Ēāĩā´Ēāĩ†ā´Ÿāĩā´¤āĩā´¤āĩā´• ('/login')" }, "database": { "title": "ā´Ąā´žā´ąāĩā´ąā´žā´Ŧāĩ‡ā´¸āĩ ā´‡ā´ąā´•āĩā´•āĩā´Žā´¤ā´ŋ/ā´•ā´¯ā´ąāĩā´ąāĩā´Žā´¤ā´ŋ", @@ -331,22 +474,310 @@ "alphabetical": "ā´…ā´•āĩā´ˇā´°ā´Žā´žā´˛ā´žā´•āĩā´°ā´Žā´¤āĩā´¤ā´ŋāĩŊ", "globalPopularity": "ⴆⴗāĩ‹ā´ŗ ⴜⴍā´Ēāĩā´°āĩ€ā´¤ā´ŋ", "sortBy": "ⴇⴤⴍāĩā´¸ā´°ā´ŋⴚāĩā´šāĩ ā´…ā´Ÿāĩā´•āĩā´•āĩā´•:", + "mobile": { + "brandAlt": "Stirling PDF logo", + "openFiles": "Open files", + "swipeHint": "Swipe left or right to switch views", + "tools": "Tools", + "toolsSlide": "Tool selection panel", + "viewSwitcher": "Switch workspace view", + "workbenchSlide": "Workspace panel", + "workspace": "Workspace" + }, "multiTool": { + "tags": "multiple,tools", "title": "PDF ā´Žāĩžā´Ÿāĩā´Ÿā´ŋ ⴟāĩ‚āĩž", "desc": "ā´Ēāĩ‡ā´œāĩā´•āĩž ⴞⴝā´ŋā´Ēāĩā´Ēā´ŋā´•āĩā´•āĩā´•, ā´¤ā´ŋā´°ā´ŋā´•āĩā´•āĩā´•, ā´Ēāĩā´¨ā´ƒā´•āĩā´°ā´Žāĩ€ā´•ā´°ā´ŋā´•āĩā´•āĩā´•, ā´ĩā´ŋⴭⴜā´ŋā´•āĩā´•āĩā´•, ā´¨āĩ€ā´•āĩā´•ā´‚ ⴚāĩ†ā´¯āĩā´¯āĩā´•" }, "merge": { + "tags": "combine,join,unite", "title": "ⴞⴝā´ŋā´Ēāĩā´Ēā´ŋā´•āĩā´•āĩā´•", "desc": "ā´’ā´¨āĩā´¨ā´ŋⴞⴧā´ŋā´•ā´‚ PDF-ā´•āĩž ā´Žā´ŗāĩā´Ēāĩā´Ēā´¤āĩā´¤ā´ŋāĩŊ ā´’ā´¨āĩā´¨ā´ŋā´˛āĩ‡ā´•āĩā´•āĩ ⴞⴝā´ŋā´Ēāĩā´Ēā´ŋā´•āĩā´•āĩā´•." }, "split": { + "tags": "divide,separate,break", "title": "ā´ĩā´ŋⴭⴜā´ŋā´•āĩā´•āĩā´•", "desc": "PDF-ā´•āĩž ā´’ā´¨āĩā´¨ā´ŋⴞⴧā´ŋā´•ā´‚ ā´Ēāĩā´°ā´Žā´žā´Ŗā´™āĩā´™ā´ŗā´žā´¯ā´ŋ ā´ĩā´ŋⴭⴜā´ŋā´•āĩā´•āĩā´•" }, "rotate": { + "tags": "turn,flip,orient", "title": "ā´¤ā´ŋā´°ā´ŋā´•āĩā´•āĩā´•", "desc": "ā´¨ā´ŋā´™āĩā´™ā´ŗāĩā´Ÿāĩ† PDF-ā´•āĩž ā´Žā´ŗāĩā´Ēāĩā´Ēā´¤āĩā´¤ā´ŋāĩŊ ā´¤ā´ŋā´°ā´ŋā´•āĩā´•āĩā´•." }, + "convert": { + "tags": "transform,change", + "title": "Convert", + "desc": "Convert files between different formats" + }, + "pdfOrganiser": { + "tags": "organize,rearrange,reorder", + "title": "ā´•āĩā´°ā´Žāĩ€ā´•ā´°ā´ŋā´•āĩā´•āĩā´•", + "desc": "ā´ā´¤āĩ ā´•āĩā´°ā´Žā´¤āĩā´¤ā´ŋā´˛āĩā´‚ ā´Ēāĩ‡ā´œāĩā´•āĩž ā´¨āĩ€ā´•āĩā´•ā´‚ ⴚāĩ†ā´¯āĩā´¯āĩā´•/ā´Ēāĩā´¨ā´ƒā´•āĩā´°ā´Žāĩ€ā´•ā´°ā´ŋā´•āĩā´•āĩā´•" + }, + "addImage": { + "tags": "insert,embed,place", + "title": "ⴚā´ŋā´¤āĩā´°ā´‚ ⴚāĩ‡āĩŧā´•āĩā´•āĩā´•", + "desc": "PDF-āĩŊ ā´’ā´°āĩ ā´¨ā´ŋā´ļāĩā´šā´ŋā´¤ ā´¸āĩā´Ĩā´žā´¨ā´¤āĩā´¤āĩ ā´’ā´°āĩ ⴚā´ŋā´¤āĩā´°ā´‚ ⴚāĩ‡āĩŧā´•āĩā´•āĩā´¨āĩā´¨āĩ" + }, + "addAttachments": { + "tags": "embed,attach,include", + "title": "Add Attachments", + "desc": "Add or remove embedded files (attachments) to/from a PDF" + }, + "watermark": { + "tags": "stamp,mark,overlay", + "title": "ā´ĩā´žā´Ÿāĩā´Ÿāĩŧā´Žā´žāĩŧā´•āĩā´•āĩ ⴚāĩ‡āĩŧā´•āĩā´•āĩā´•", + "desc": "ā´¨ā´ŋā´™āĩā´™ā´ŗāĩā´Ÿāĩ† PDF ā´Ēāĩā´°ā´Žā´žā´Ŗā´¤āĩā´¤ā´ŋā´˛āĩ‡ā´•āĩā´•āĩ ā´’ā´°āĩ ⴇⴎāĩā´Ÿā´žā´¨āĩā´¸āĩƒā´¤ ā´ĩā´žā´Ÿāĩā´Ÿāĩŧā´Žā´žāĩŧā´•āĩā´•āĩ ⴚāĩ‡āĩŧā´•āĩā´•āĩā´•." + }, + "removePassword": { + "tags": "unlock", + "title": "ā´Ēā´žā´¸āĩâ€Œā´ĩāĩ‡ā´Ąāĩ ā´¨āĩ€ā´•āĩā´•ā´‚ ⴚāĩ†ā´¯āĩā´¯āĩā´•", + "desc": "ā´¨ā´ŋā´™āĩā´™ā´ŗāĩā´Ÿāĩ† PDF ā´Ēāĩā´°ā´Žā´žā´Ŗā´¤āĩā´¤ā´ŋāĩŊ ā´¨ā´ŋā´¨āĩā´¨āĩ ā´Ēā´žā´¸āĩâ€Œā´ĩāĩ‡ā´Ąāĩ ⴏⴂⴰⴕāĩā´ˇā´Ŗā´‚ ā´¨āĩ€ā´•āĩā´•ā´‚ ⴚāĩ†ā´¯āĩā´¯āĩā´•." + }, + "compress": { + "tags": "shrink,reduce,optimize", + "title": "ā´•ā´‚ā´Ēāĩā´°ā´¸āĩ ⴚāĩ†ā´¯āĩā´¯āĩā´•", + "desc": "ā´Ģā´¯āĩŊ ā´ĩā´˛āĩā´Ēāĩā´Ēā´‚ ā´•āĩā´ąā´¯āĩā´•āĩā´•āĩā´¨āĩā´¨ā´¤ā´ŋā´¨āĩ PDF-ā´•āĩž ā´•ā´‚ā´Ēāĩā´°ā´¸āĩ ⴚāĩ†ā´¯āĩā´¯āĩā´•." + }, + "unlockPDFForms": { + "tags": "unlock,enable,edit", + "title": "PDF ā´Ģāĩ‹ā´Žāĩā´•āĩž ā´…āĩēā´˛āĩ‹ā´•āĩā´•āĩ ⴚāĩ†ā´¯āĩā´¯āĩā´•", + "desc": "ā´’ā´°āĩ PDF ā´Ēāĩā´°ā´Žā´žā´Ŗā´¤āĩā´¤ā´ŋā´˛āĩ† ā´Ģāĩ‹ā´‚ ā´Ģāĩ€āĩŊā´Ąāĩā´•ā´ŗāĩā´Ÿāĩ† ā´ąāĩ€ā´Ąāĩ-ā´’āĩēā´˛ā´ŋ ā´Ēāĩā´°āĩ‹ā´Ēāĩā´Ēāĩŧⴟāĩā´Ÿā´ŋ ā´¨āĩ€ā´•āĩā´•ā´‚ ⴚāĩ†ā´¯āĩā´¯āĩā´•." + }, + "changeMetadata": { + "tags": "edit,modify,update", + "title": "ā´Žāĩ†ā´ąāĩā´ąā´žā´Ąā´žā´ąāĩā´ą ā´Žā´žā´ąāĩā´ąāĩā´•", + "desc": "ā´’ā´°āĩ PDF ā´Ēāĩā´°ā´Žā´žā´Ŗā´¤āĩā´¤ā´ŋāĩŊ ā´¨ā´ŋā´¨āĩā´¨āĩ ā´Žāĩ†ā´ąāĩā´ąā´žā´Ąā´žā´ąāĩā´ą ā´Žā´žā´ąāĩā´ąāĩā´•/ā´¨āĩ€ā´•āĩā´•ā´‚ ⴚāĩ†ā´¯āĩā´¯āĩā´•/ⴚāĩ‡āĩŧā´•āĩā´•āĩā´•" + }, + "ocr": { + "tags": "extract,scan", + "title": "OCR / ā´¸āĩā´•ā´žā´¨āĩā´•āĩž ā´ĩāĩƒā´¤āĩā´¤ā´ŋā´¯ā´žā´•āĩā´•āĩā´•", + "desc": "ā´¸āĩā´•ā´žā´¨āĩā´•āĩž ā´ĩāĩƒā´¤āĩā´¤ā´ŋā´¯ā´žā´•āĩā´•āĩā´•ā´¯āĩā´‚ ā´’ā´°āĩ PDF-ā´¨āĩā´ŗāĩā´ŗā´ŋā´˛āĩ† ⴚā´ŋā´¤āĩā´°ā´™āĩā´™ā´ŗā´ŋāĩŊ ā´¨ā´ŋā´¨āĩā´¨āĩ ⴟāĩ†ā´•āĩā´¸āĩā´ąāĩā´ąāĩ ā´•ā´Ŗāĩā´Ÿāĩ†ā´¤āĩā´¤āĩā´•ā´¯āĩā´‚ ā´…ā´¤āĩ ⴟāĩ†ā´•āĩā´¸āĩā´ąāĩā´ąā´žā´¯ā´ŋ ā´ĩāĩ€ā´Ŗāĩā´Ÿāĩā´‚ ⴚāĩ‡āĩŧā´•āĩā´•āĩā´•ā´¯āĩā´‚ ⴚāĩ†ā´¯āĩā´¯āĩā´¨āĩā´¨āĩ." + }, + "extractImages": { + "tags": "pull,save,export", + "title": "ⴚā´ŋā´¤āĩā´°ā´™āĩā´™āĩž ā´ĩāĩ‡āĩŧā´¤ā´ŋā´°ā´ŋⴚāĩā´šāĩ†ā´Ÿāĩā´•āĩā´•āĩā´•", + "desc": "ā´’ā´°āĩ PDF-āĩŊ ā´¨ā´ŋā´¨āĩā´¨āĩ ā´Žā´˛āĩā´˛ā´ž ⴚā´ŋā´¤āĩā´°ā´™āĩā´™ā´ŗāĩā´‚ ā´ĩāĩ‡āĩŧā´¤ā´ŋā´°ā´ŋⴚāĩā´šāĩ†ā´Ÿāĩā´¤āĩā´¤āĩ ā´¸ā´ŋā´Ēāĩā´Ēā´ŋā´˛āĩ‡ā´•āĩā´•āĩ ⴏⴂⴰⴕāĩā´ˇā´ŋā´•āĩā´•āĩā´¨āĩā´¨āĩ" + }, + "scannerImageSplit": { + "tags": "detect,split,photos", + "title": "Detect & Split Scanned Photos", + "desc": "Detect and split scanned photos into separate pages" + }, + "sign": { + "tags": "signature,autograph", + "title": "ā´’ā´Ēāĩā´Ēā´ŋⴟāĩā´•", + "desc": "ā´ĩⴰⴚāĩā´šāĩ‹, ⴟāĩ†ā´•āĩā´¸āĩā´ąāĩā´ąāĩ ā´‰ā´Ēā´¯āĩ‹ā´—ā´ŋⴚāĩā´šāĩ‹, ⴚā´ŋā´¤āĩā´°ā´‚ ā´‰ā´Ēā´¯āĩ‹ā´—ā´ŋⴚāĩā´šāĩ‹ PDF-āĩŊ ā´’ā´Ēāĩā´Ēāĩ ⴚāĩ‡āĩŧā´•āĩā´•āĩā´¨āĩā´¨āĩ" + }, + "flatten": { + "tags": "simplify,remove,interactive", + "title": "ā´Ēā´°ā´¤āĩā´¤āĩā´•", + "desc": "ā´’ā´°āĩ PDF-āĩŊ ā´¨ā´ŋā´¨āĩā´¨āĩ ā´Žā´˛āĩā´˛ā´ž ⴇⴍāĩā´ąā´ąā´žā´•āĩā´Ÿāĩ€ā´ĩāĩ ā´˜ā´Ÿā´•ā´™āĩā´™ā´ŗāĩā´‚ ā´Ģāĩ‹ā´Žāĩā´•ā´ŗāĩā´‚ ā´¨āĩ€ā´•āĩā´•ā´‚ ⴚāĩ†ā´¯āĩā´¯āĩā´•" + }, + "certSign": { + "tags": "authenticate,PEM,P12,official,encrypt,sign,certificate,PKCS12,JKS,server,manual,auto", + "title": "ā´¸āĩŧⴟāĩā´Ÿā´ŋā´Ģā´ŋā´•āĩā´•ā´ąāĩā´ąāĩ ā´‰ā´Ēā´¯āĩ‹ā´—ā´ŋⴚāĩā´šāĩ ā´’ā´Ēāĩā´Ēā´ŋⴟāĩā´•", + "desc": "ā´’ā´°āĩ ā´¸āĩŧⴟāĩā´Ÿā´ŋā´Ģā´ŋā´•āĩā´•ā´ąāĩā´ąāĩ/ā´•āĩ€ (PEM/P12) ā´‰ā´Ēā´¯āĩ‹ā´—ā´ŋⴚāĩā´šāĩ ā´’ā´°āĩ PDF ā´’ā´Ēāĩā´Ēā´ŋⴟāĩā´¨āĩā´¨āĩ" + }, + "repair": { + "tags": "fix,restore", + "title": "ⴍⴍāĩā´¨ā´žā´•āĩā´•āĩā´•", + "desc": "ā´•āĩ‡ā´Ÿā´žā´¯/ⴤⴕāĩŧā´¨āĩā´¨ PDF ⴍⴍāĩā´¨ā´žā´•āĩā´•ā´žāĩģ ā´ļāĩā´°ā´Žā´ŋā´•āĩā´•āĩā´¨āĩā´¨āĩ" + }, + "removeBlanks": { + "tags": "delete,clean,empty", + "title": "ā´ļāĩ‚ā´¨āĩā´¯ā´Žā´žā´¯ ā´Ēāĩ‡ā´œāĩā´•āĩž ā´¨āĩ€ā´•āĩā´•ā´‚ ⴚāĩ†ā´¯āĩā´¯āĩā´•", + "desc": "ā´’ā´°āĩ ā´Ēāĩā´°ā´Žā´žā´Ŗā´¤āĩā´¤ā´ŋāĩŊ ā´¨ā´ŋā´¨āĩā´¨āĩ ā´ļāĩ‚ā´¨āĩā´¯ā´Žā´žā´¯ ā´Ēāĩ‡ā´œāĩā´•āĩž ā´•ā´Ŗāĩā´Ÿāĩ†ā´¤āĩā´¤āĩā´•ā´¯āĩā´‚ ā´¨āĩ€ā´•āĩā´•ā´‚ ⴚāĩ†ā´¯āĩā´¯āĩā´•ā´¯āĩā´‚ ⴚāĩ†ā´¯āĩā´¯āĩā´¨āĩā´¨āĩ" + }, + "removeAnnotations": { + "tags": "delete,clean,strip", + "title": "ā´ĩāĩā´¯ā´žā´–āĩā´¯ā´žā´¨ā´™āĩā´™āĩž ā´¨āĩ€ā´•āĩā´•ā´‚ ⴚāĩ†ā´¯āĩā´¯āĩā´•", + "desc": "ā´’ā´°āĩ PDF-āĩŊ ā´¨ā´ŋā´¨āĩā´¨āĩ ā´Žā´˛āĩā´˛ā´ž ā´…ā´­ā´ŋā´Ēāĩā´°ā´žā´¯ā´™āĩā´™ā´ŗāĩā´‚/ā´ĩāĩā´¯ā´žā´–āĩā´¯ā´žā´¨ā´™āĩā´™ā´ŗāĩā´‚ ā´¨āĩ€ā´•āĩā´•ā´‚ ⴚāĩ†ā´¯āĩā´¯āĩā´¨āĩā´¨āĩ" + }, + "compare": { + "tags": "difference", + "title": "ā´¤ā´žā´°ā´¤ā´Žāĩā´¯ā´‚ ⴚāĩ†ā´¯āĩā´¯āĩā´•", + "desc": "2 PDF ā´Ēāĩā´°ā´Žā´žā´Ŗā´™āĩā´™āĩž ā´¤ā´Žāĩā´Žā´ŋā´˛āĩā´ŗāĩā´ŗ ā´ĩāĩā´¯ā´¤āĩā´¯ā´žā´¸ā´™āĩā´™āĩž ā´¤ā´žā´°ā´¤ā´Žāĩā´¯ā´‚ ⴚāĩ†ā´¯āĩā´¯āĩā´•ā´¯āĩā´‚ ā´•ā´žā´Ŗā´ŋā´•āĩā´•āĩā´•ā´¯āĩā´‚ ⴚāĩ†ā´¯āĩā´¯āĩā´¨āĩā´¨āĩ" + }, + "removeCertSign": { + "tags": "remove,delete,unlock", + "title": "ā´¸āĩŧⴟāĩā´Ÿā´ŋā´Ģā´ŋā´•āĩā´•ā´ąāĩā´ąāĩ ā´’ā´Ēāĩā´Ēāĩ ā´¨āĩ€ā´•āĩā´•ā´‚ ⴚāĩ†ā´¯āĩā´¯āĩā´•", + "desc": "PDF-āĩŊ ā´¨ā´ŋā´¨āĩā´¨āĩ ā´¸āĩŧⴟāĩā´Ÿā´ŋā´Ģā´ŋā´•āĩā´•ā´ąāĩā´ąāĩ ā´’ā´Ēāĩā´Ēāĩ ā´¨āĩ€ā´•āĩā´•ā´‚ ⴚāĩ†ā´¯āĩā´¯āĩā´•" + }, + "pageLayout": { + "tags": "layout,arrange,combine", + "title": "ā´Žāĩžā´Ÿāĩā´Ÿā´ŋ-ā´Ēāĩ‡ā´œāĩ ā´˛āĩ‡ā´”ā´Ÿāĩā´Ÿāĩ", + "desc": "ā´’ā´°āĩ PDF ā´Ēāĩā´°ā´Žā´žā´Ŗā´¤āĩā´¤ā´ŋā´¨āĩā´ąāĩ† ā´’ā´¨āĩā´¨ā´ŋⴞⴧā´ŋā´•ā´‚ ā´Ēāĩ‡ā´œāĩā´•āĩž ā´’ā´°āĩŠā´ąāĩā´ą ā´Ēāĩ‡ā´œā´ŋā´˛āĩ‡ā´•āĩā´•āĩ ⴞⴝā´ŋā´Ēāĩā´Ēā´ŋā´•āĩā´•āĩā´•" + }, + "bookletImposition": { + "tags": "booklet,print,binding", + "title": "Booklet Imposition", + "desc": "Create booklets with proper page ordering and multi-page layout for printing and binding" + }, + "scalePages": { + "tags": "resize,adjust,scale", + "title": "ā´Ēāĩ‡ā´œāĩ ā´ĩā´˛āĩā´Ēāĩā´Ēā´‚/ā´¸āĩā´•āĩ†ā´¯ā´ŋāĩŊ ā´•āĩā´°ā´Žāĩ€ā´•ā´°ā´ŋā´•āĩā´•āĩā´•", + "desc": "ā´’ā´°āĩ ā´Ēāĩ‡ā´œā´ŋā´¨āĩā´ąāĩ†ā´¯āĩā´‚/ā´…ā´˛āĩā´˛āĩ†ā´™āĩā´•ā´ŋāĩŊ ā´…ā´¤ā´ŋā´¨āĩā´ąāĩ† ⴉⴺāĩā´ŗā´Ÿā´•āĩā´•ā´™āĩā´™ā´ŗāĩā´Ÿāĩ†ā´¯āĩā´‚ ā´ĩā´˛āĩā´Ēāĩā´Ēā´‚/ā´¸āĩā´•āĩ†ā´¯ā´ŋāĩŊ ā´Žā´žā´ąāĩā´ąāĩā´•." + }, + "addPageNumbers": { + "tags": "number,pagination,count", + "title": "ā´Ēāĩ‡ā´œāĩ ā´¨ā´Žāĩā´Ēā´ąāĩā´•āĩž ⴚāĩ‡āĩŧā´•āĩā´•āĩā´•", + "desc": "ā´’ā´°āĩ ā´Ēāĩā´°ā´Žā´žā´Ŗā´¤āĩā´¤ā´ŋā´˛āĩā´Ÿā´¨āĩ€ā´ŗā´‚ ā´’ā´°āĩ ā´¨ā´ŋā´ļāĩā´šā´ŋā´¤ ā´¸āĩā´Ĩā´žā´¨ā´¤āĩā´¤āĩ ā´Ēāĩ‡ā´œāĩ ā´¨ā´Žāĩā´Ēā´ąāĩā´•āĩž ⴚāĩ‡āĩŧā´•āĩā´•āĩā´•" + }, + "autoRename": { + "tags": "auto-detect,header-based,organize,relabel", + "title": "Auto Rename PDF File", + "desc": "Auto renames a PDF file based on its detected header" + }, + "adjustContrast": { + "tags": "contrast,brightness,saturation", + "title": "ā´¨ā´ŋā´ąā´™āĩā´™āĩž/ā´•āĩ‹āĩēⴟāĩā´°ā´žā´¸āĩā´ąāĩā´ąāĩ ā´•āĩā´°ā´Žāĩ€ā´•ā´°ā´ŋā´•āĩā´•āĩā´•", + "desc": "ā´’ā´°āĩ PDF-ā´¨āĩā´ąāĩ† ā´•āĩ‹āĩēⴟāĩā´°ā´žā´¸āĩā´ąāĩā´ąāĩ, ā´¸ā´žā´šāĩā´šāĩā´ąāĩ‡ā´ˇāĩģ, ā´¤āĩ†ā´ŗā´ŋⴚāĩā´šā´‚ ā´Žā´¨āĩā´¨ā´ŋā´ĩ ā´•āĩā´°ā´Žāĩ€ā´•ā´°ā´ŋā´•āĩā´•āĩā´•" + }, + "crop": { + "tags": "trim,cut,resize", + "title": "PDF ā´•āĩā´°āĩ‹ā´Ēāĩā´Ēāĩ ⴚāĩ†ā´¯āĩā´¯āĩā´•", + "desc": "ā´ĩā´˛āĩā´Ēāĩā´Ēā´‚ ā´•āĩā´ąā´¯āĩā´•āĩā´•ā´žāĩģ ā´’ā´°āĩ PDF ā´•āĩā´°āĩ‹ā´Ēāĩā´Ēāĩ ⴚāĩ†ā´¯āĩā´¯āĩā´• (ⴟāĩ†ā´•āĩā´¸āĩā´ąāĩā´ąāĩ ā´¨ā´ŋⴞⴍā´ŋāĩŧā´¤āĩā´¤āĩā´¨āĩā´¨āĩ!)" + }, + "autoSplitPDF": { + "tags": "auto,split,QR", + "title": "ā´Ēāĩ‡ā´œāĩā´•āĩž ā´¸āĩā´ĩⴝⴂ ā´ĩā´ŋⴭⴜā´ŋā´•āĩā´•āĩā´•", + "desc": "ā´­āĩ—ā´¤ā´ŋā´•ā´Žā´žā´¯ā´ŋ ā´¸āĩā´•ā´žāĩģ ⴚāĩ†ā´¯āĩā´¤ ā´Ēāĩ‡ā´œāĩ ā´¸āĩā´Ēāĩā´˛ā´ŋā´ąāĩā´ąāĩŧ QR ā´•āĩ‹ā´Ąāĩ ā´‰ā´Ēā´¯āĩ‹ā´—ā´ŋⴚāĩā´šāĩ ā´¸āĩā´•ā´žāĩģ ⴚāĩ†ā´¯āĩā´¤ PDF ā´¸āĩā´ĩⴝⴂ ā´ĩā´ŋⴭⴜā´ŋā´•āĩā´•āĩā´•" + }, + "sanitize": { + "tags": "clean,purge,remove", + "title": "Sanitise", + "desc": "Remove potentially harmful elements from PDF files" + }, + "getPdfInfo": { + "tags": "info,metadata,details", + "title": "PDF-ā´¨āĩ†ā´•āĩā´•āĩā´ąā´ŋⴚāĩā´šāĩā´ŗāĩā´ŗ ā´Žā´˛āĩā´˛ā´ž ā´ĩā´ŋā´ĩā´°ā´™āĩā´™ā´ŗāĩā´‚ ā´¨āĩ‡ā´Ÿāĩā´•", + "desc": "PDF-ā´•ā´ŗāĩ†ā´•āĩā´•āĩā´ąā´ŋⴚāĩā´šāĩā´ŗāĩā´ŗ ā´¸ā´žā´§āĩā´¯ā´Žā´žā´¯ ā´Žā´˛āĩā´˛ā´ž ā´ĩā´ŋā´ĩā´°ā´™āĩā´™ā´ŗāĩā´‚ ā´¨āĩ‡ā´Ÿāĩā´¨āĩā´¨āĩ" + }, + "pdfToSinglePage": { + "tags": "combine,merge,single", + "title": "ā´’ā´°āĩŠā´ąāĩā´ą ā´ĩā´˛ā´ŋā´¯ ā´Ēāĩ‡ā´œāĩ", + "desc": "ā´Žā´˛āĩā´˛ā´ž PDF ā´Ēāĩ‡ā´œāĩā´•ā´ŗāĩā´‚ ā´’ā´°āĩŠā´ąāĩā´ą ā´ĩā´˛ā´ŋā´¯ ā´Ēāĩ‡ā´œā´ŋā´˛āĩ‡ā´•āĩā´•āĩ ⴞⴝā´ŋā´Ēāĩā´Ēā´ŋā´•āĩā´•āĩā´¨āĩā´¨āĩ" + }, + "showJS": { + "tags": "javascript,code,script", + "title": "ā´œā´žā´ĩā´žā´¸āĩā´•āĩā´°ā´ŋā´Ēāĩā´ąāĩā´ąāĩ ā´•ā´žā´Ŗā´ŋā´•āĩā´•āĩā´•", + "desc": "ā´’ā´°āĩ PDF-āĩŊ ā´•āĩā´¤āĩā´¤ā´ŋā´ĩⴚāĩā´š ā´ā´¤āĩ†ā´™āĩā´•ā´ŋā´˛āĩā´‚ JS ā´¤ā´ŋā´°ā´¯āĩā´•ā´¯āĩā´‚ ā´Ēāĩā´°ā´Ļāĩŧā´ļā´ŋā´Ēāĩā´Ēā´ŋā´•āĩā´•āĩā´•ā´¯āĩā´‚ ⴚāĩ†ā´¯āĩā´¯āĩā´¨āĩā´¨āĩ" + }, + "redact": { + "tags": "censor,blackout,hide", + "title": "ā´¸āĩā´ĩⴝⴂ ā´ąāĩ†ā´Ąā´žā´•āĩā´ˇāĩģ", + "desc": "ā´¤ā´ŋā´°ā´žāĩā´žāĩ†ā´Ÿāĩā´¤āĩā´¤ ⴟāĩ†ā´•āĩā´¸āĩā´ąāĩā´ąāĩ, ā´ĩⴰⴚāĩā´š ā´°āĩ‚ā´Ēā´™āĩā´™āĩž ā´•āĩ‚ā´Ÿā´žā´¤āĩ†/ā´…ā´˛āĩā´˛āĩ†ā´™āĩā´•ā´ŋāĩŊ ā´¤ā´ŋā´°ā´žāĩā´žāĩ†ā´Ÿāĩā´¤āĩā´¤ ā´Ēāĩ‡ā´œāĩ(ā´•āĩž) ā´…ā´Ÿā´ŋā´¸āĩā´Ĩā´žā´¨ā´Žā´žā´•āĩā´•ā´ŋ ā´’ā´°āĩ PDF ā´ąāĩ†ā´Ąā´žā´•āĩā´ąāĩā´ąāĩ ⴚāĩ†ā´¯āĩā´¯āĩā´¨āĩā´¨āĩ" + }, + "splitBySections": { + "tags": "split,sections,divide", + "title": "Split PDF by Sections", + "desc": "Divide each page of a PDF into smaller horizontal and vertical sections" + }, + "addStamp": { + "tags": "stamp,mark,seal", + "title": "Add Stamp to PDF", + "desc": "Add text or add image stamps at set locations" + }, + "removeImage": { + "tags": "remove,delete,clean", + "title": "ⴚā´ŋā´¤āĩā´°ā´‚ ā´¨āĩ€ā´•āĩā´•ā´‚ ⴚāĩ†ā´¯āĩā´¯āĩā´•", + "desc": "ā´Ģā´¯āĩŊ ā´ĩā´˛āĩā´Ēāĩā´Ēā´‚ ā´•āĩā´ąā´¯āĩā´•āĩā´•ā´žāĩģ PDF-āĩŊ ā´¨ā´ŋā´¨āĩā´¨āĩ ⴚā´ŋā´¤āĩā´°ā´‚ ā´¨āĩ€ā´•āĩā´•ā´‚ ⴚāĩ†ā´¯āĩā´¯āĩā´•" + }, + "splitByChapters": { + "tags": "split,chapters,structure", + "title": "ā´…ā´§āĩā´¯ā´žā´¯ā´™āĩā´™āĩž ā´…ā´¨āĩā´¸ā´°ā´ŋⴚāĩā´šāĩ PDF ā´ĩā´ŋⴭⴜā´ŋā´•āĩā´•āĩā´•", + "desc": "ā´…ā´¤ā´ŋā´¨āĩā´ąāĩ† ā´…ā´§āĩā´¯ā´žā´¯ ⴘⴟⴍⴝāĩ† ā´…ā´Ÿā´ŋā´¸āĩā´Ĩā´žā´¨ā´Žā´žā´•āĩā´•ā´ŋ ā´’ā´°āĩ PDF ā´’ā´¨āĩā´¨ā´ŋⴞⴧā´ŋā´•ā´‚ ā´Ģⴝⴞāĩā´•ā´ŗā´žā´¯ā´ŋ ā´ĩā´ŋⴭⴜā´ŋā´•āĩā´•āĩā´•." + }, + "validateSignature": { + "tags": "validate,verify,certificate", + "title": "PDF ā´’ā´Ēāĩā´Ēāĩ ā´¸ā´žā´§āĩ‚ā´•ā´°ā´ŋā´•āĩā´•āĩā´•", + "desc": "PDF ā´Ēāĩā´°ā´Žā´žā´Ŗā´™āĩā´™ā´ŗā´ŋā´˛āĩ† ā´Ąā´ŋⴜā´ŋā´ąāĩā´ąāĩŊ ā´’ā´Ēāĩā´Ēāĩā´•ā´ŗāĩā´‚ ā´¸āĩŧⴟāĩā´Ÿā´ŋā´Ģā´ŋā´•āĩā´•ā´ąāĩā´ąāĩā´•ā´ŗāĩā´‚ ā´Ēā´°ā´ŋā´ļāĩ‹ā´§ā´ŋā´•āĩā´•āĩā´•" + }, + "swagger": { + "tags": "API,documentation,test", + "title": "API Documentation", + "desc": "View API documentation and test endpoints" + }, + "scannerEffect": { + "tags": "scan,simulate,create", + "title": "Scanner Effect", + "desc": "Create a PDF that looks like it was scanned" + }, + "editTableOfContents": { + "tags": "bookmarks,contents,edit", + "title": "Edit Table of Contents", + "desc": "Add or edit bookmarks and table of contents in PDF documents" + }, + "manageCertificates": { + "tags": "certificates,import,export", + "title": "Manage Certificates", + "desc": "Import, export, or delete digital certificate files used for signing PDFs." + }, + "read": { + "tags": "view,open,display", + "title": "Read", + "desc": "View and annotate PDFs. Highlight text, draw, or insert comments for review and collaboration." + }, + "reorganizePages": { + "tags": "rearrange,reorder,organize", + "title": "Reorganize Pages", + "desc": "Rearrange, duplicate, or delete PDF pages with visual drag-and-drop control." + }, + "extractPages": { + "tags": "pull,select,copy", + "title": "Extract Pages", + "desc": "Extract specific pages from a PDF document" + }, + "removePages": { + "tags": "delete,extract,exclude", + "title": "Remove Pages", + "desc": "Remove specific pages from a PDF document" + }, + "autoSizeSplitPDF": { + "tags": "auto,split,size", + "title": "Auto Split by Size/Count", + "desc": "Automatically split PDFs by file size or page count" + }, + "replaceColor": { + "title": "Replace & Invert Colour", + "desc": "Replace or invert colours in PDF documents" + }, + "devApi": { + "tags": "API,development,documentation", + "title": "API", + "desc": "Link to API documentation" + }, + "devFolderScanning": { + "tags": "automation,folder,scanning", + "title": "Automated Folder Scanning", + "desc": "Link to automated folder scanning guide" + }, + "devSsoGuide": { + "title": "SSO Guide", + "desc": "Link to SSO guide" + }, + "devAirgapped": { + "title": "Air-gapped Setup", + "desc": "Link to air-gapped setup guide" + }, + "addPassword": { + "title": "ā´Ēā´žā´¸āĩâ€Œā´ĩāĩ‡ā´Ąāĩ ⴚāĩ‡āĩŧā´•āĩā´•āĩā´•", + "desc": "ā´¨ā´ŋā´™āĩā´™ā´ŗāĩā´Ÿāĩ† PDF ā´Ēāĩā´°ā´Žā´žā´Ŗā´‚ ā´’ā´°āĩ ā´Ēā´žā´¸āĩâ€Œā´ĩāĩ‡ā´Ąāĩ ā´‰ā´Ēā´¯āĩ‹ā´—ā´ŋⴚāĩā´šāĩ ā´Žāĩģā´•āĩā´°ā´ŋā´Ēāĩā´ąāĩā´ąāĩ ⴚāĩ†ā´¯āĩā´¯āĩā´•." + }, + "changePermissions": { + "title": "Change Permissions", + "desc": "Change document restrictions and permissions" + }, + "automate": { + "tags": "workflow,sequence,automation", + "title": "Automate", + "desc": "Build multi-step workflows by chaining together PDF actions. Ideal for recurring tasks." + }, + "overlay-pdfs": { + "desc": "ā´Žā´ąāĩā´ąāĩŠā´°āĩ PDF-ā´¨āĩ ā´Žāĩā´•ā´ŗā´ŋāĩŊ PDF-ā´•āĩž ā´“ā´ĩāĩŧā´˛āĩ‡ ⴚāĩ†ā´¯āĩā´¯āĩā´¨āĩā´¨āĩ", + "title": "PDF-ā´•āĩž ā´“ā´ĩāĩŧā´˛āĩ‡ ⴚāĩ†ā´¯āĩā´¯āĩā´•" + }, "imageToPDF": { "title": "ⴚā´ŋā´¤āĩā´°ā´‚ PDF-ā´˛āĩ‡ā´•āĩā´•āĩ", "desc": "ā´’ā´°āĩ ⴚā´ŋā´¤āĩā´°ā´‚ (PNG, JPEG, GIF) PDF-ā´˛āĩ‡ā´•āĩā´•āĩ ā´Žā´žā´ąāĩā´ąāĩā´•." @@ -355,18 +786,6 @@ "title": "PDF ⴚā´ŋā´¤āĩā´°ā´¤āĩā´¤ā´ŋā´˛āĩ‡ā´•āĩā´•āĩ", "desc": "ā´’ā´°āĩ PDF ⴚā´ŋā´¤āĩā´°ā´¤āĩā´¤ā´ŋā´˛āĩ‡ā´•āĩā´•āĩ ā´Žā´žā´ąāĩā´ąāĩā´•. (PNG, JPEG, GIF)" }, - "pdfOrganiser": { - "title": "ā´•āĩā´°ā´Žāĩ€ā´•ā´°ā´ŋā´•āĩā´•āĩā´•", - "desc": "ā´ā´¤āĩ ā´•āĩā´°ā´Žā´¤āĩā´¤ā´ŋā´˛āĩā´‚ ā´Ēāĩ‡ā´œāĩā´•āĩž ā´¨āĩ€ā´•āĩā´•ā´‚ ⴚāĩ†ā´¯āĩā´¯āĩā´•/ā´Ēāĩā´¨ā´ƒā´•āĩā´°ā´Žāĩ€ā´•ā´°ā´ŋā´•āĩā´•āĩā´•" - }, - "addImage": { - "title": "ⴚā´ŋā´¤āĩā´°ā´‚ ⴚāĩ‡āĩŧā´•āĩā´•āĩā´•", - "desc": "PDF-āĩŊ ā´’ā´°āĩ ā´¨ā´ŋā´ļāĩā´šā´ŋā´¤ ā´¸āĩā´Ĩā´žā´¨ā´¤āĩā´¤āĩ ā´’ā´°āĩ ⴚā´ŋā´¤āĩā´°ā´‚ ⴚāĩ‡āĩŧā´•āĩā´•āĩā´¨āĩā´¨āĩ" - }, - "watermark": { - "title": "ā´ĩā´žā´Ÿāĩā´Ÿāĩŧā´Žā´žāĩŧā´•āĩā´•āĩ ⴚāĩ‡āĩŧā´•āĩā´•āĩā´•", - "desc": "ā´¨ā´ŋā´™āĩā´™ā´ŗāĩā´Ÿāĩ† PDF ā´Ēāĩā´°ā´Žā´žā´Ŗā´¤āĩā´¤ā´ŋā´˛āĩ‡ā´•āĩā´•āĩ ā´’ā´°āĩ ⴇⴎāĩā´Ÿā´žā´¨āĩā´¸āĩƒā´¤ ā´ĩā´žā´Ÿāĩā´Ÿāĩŧā´Žā´žāĩŧā´•āĩā´•āĩ ⴚāĩ‡āĩŧā´•āĩā´•āĩā´•." - }, "permissions": { "title": "ā´…ā´¨āĩā´Žā´¤ā´ŋā´•āĩž ā´Žā´žā´ąāĩā´ąāĩā´•", "desc": "ā´¨ā´ŋā´™āĩā´™ā´ŗāĩā´Ÿāĩ† PDF ā´Ēāĩā´°ā´Žā´žā´Ŗā´¤āĩā´¤ā´ŋā´¨āĩā´ąāĩ† ā´…ā´¨āĩā´Žā´¤ā´ŋā´•āĩž ā´Žā´žā´ąāĩā´ąāĩā´•" @@ -375,38 +794,10 @@ "title": "ā´¨āĩ€ā´•āĩā´•ā´‚ ⴚāĩ†ā´¯āĩā´¯āĩā´•", "desc": "ā´¨ā´ŋā´™āĩā´™ā´ŗāĩā´Ÿāĩ† PDF ā´Ēāĩā´°ā´Žā´žā´Ŗā´¤āĩā´¤ā´ŋāĩŊ ā´¨ā´ŋā´¨āĩā´¨āĩ ā´†ā´ĩā´ļāĩā´¯ā´Žā´ŋā´˛āĩā´˛ā´žā´¤āĩā´¤ ā´Ēāĩ‡ā´œāĩā´•āĩž ⴇⴞāĩā´˛ā´žā´¤ā´žā´•āĩā´•āĩā´•." }, - "addPassword": { - "title": "ā´Ēā´žā´¸āĩâ€Œā´ĩāĩ‡ā´Ąāĩ ⴚāĩ‡āĩŧā´•āĩā´•āĩā´•", - "desc": "ā´¨ā´ŋā´™āĩā´™ā´ŗāĩā´Ÿāĩ† PDF ā´Ēāĩā´°ā´Žā´žā´Ŗā´‚ ā´’ā´°āĩ ā´Ēā´žā´¸āĩâ€Œā´ĩāĩ‡ā´Ąāĩ ā´‰ā´Ēā´¯āĩ‹ā´—ā´ŋⴚāĩā´šāĩ ā´Žāĩģā´•āĩā´°ā´ŋā´Ēāĩā´ąāĩā´ąāĩ ⴚāĩ†ā´¯āĩā´¯āĩā´•." - }, - "removePassword": { - "title": "ā´Ēā´žā´¸āĩâ€Œā´ĩāĩ‡ā´Ąāĩ ā´¨āĩ€ā´•āĩā´•ā´‚ ⴚāĩ†ā´¯āĩā´¯āĩā´•", - "desc": "ā´¨ā´ŋā´™āĩā´™ā´ŗāĩā´Ÿāĩ† PDF ā´Ēāĩā´°ā´Žā´žā´Ŗā´¤āĩā´¤ā´ŋāĩŊ ā´¨ā´ŋā´¨āĩā´¨āĩ ā´Ēā´žā´¸āĩâ€Œā´ĩāĩ‡ā´Ąāĩ ⴏⴂⴰⴕāĩā´ˇā´Ŗā´‚ ā´¨āĩ€ā´•āĩā´•ā´‚ ⴚāĩ†ā´¯āĩā´¯āĩā´•." - }, - "compress": { - "title": "ā´•ā´‚ā´Ēāĩā´°ā´¸āĩ ⴚāĩ†ā´¯āĩā´¯āĩā´•", - "desc": "ā´Ģā´¯āĩŊ ā´ĩā´˛āĩā´Ēāĩā´Ēā´‚ ā´•āĩā´ąā´¯āĩā´•āĩā´•āĩā´¨āĩā´¨ā´¤ā´ŋā´¨āĩ PDF-ā´•āĩž ā´•ā´‚ā´Ēāĩā´°ā´¸āĩ ⴚāĩ†ā´¯āĩā´¯āĩā´•." - }, - "unlockPDFForms": { - "title": "PDF ā´Ģāĩ‹ā´Žāĩā´•āĩž ā´…āĩēā´˛āĩ‹ā´•āĩā´•āĩ ⴚāĩ†ā´¯āĩā´¯āĩā´•", - "desc": "ā´’ā´°āĩ PDF ā´Ēāĩā´°ā´Žā´žā´Ŗā´¤āĩā´¤ā´ŋā´˛āĩ† ā´Ģāĩ‹ā´‚ ā´Ģāĩ€āĩŊā´Ąāĩā´•ā´ŗāĩā´Ÿāĩ† ā´ąāĩ€ā´Ąāĩ-ā´’āĩēā´˛ā´ŋ ā´Ēāĩā´°āĩ‹ā´Ēāĩā´Ēāĩŧⴟāĩā´Ÿā´ŋ ā´¨āĩ€ā´•āĩā´•ā´‚ ⴚāĩ†ā´¯āĩā´¯āĩā´•." - }, - "changeMetadata": { - "title": "ā´Žāĩ†ā´ąāĩā´ąā´žā´Ąā´žā´ąāĩā´ą ā´Žā´žā´ąāĩā´ąāĩā´•", - "desc": "ā´’ā´°āĩ PDF ā´Ēāĩā´°ā´Žā´žā´Ŗā´¤āĩā´¤ā´ŋāĩŊ ā´¨ā´ŋā´¨āĩā´¨āĩ ā´Žāĩ†ā´ąāĩā´ąā´žā´Ąā´žā´ąāĩā´ą ā´Žā´žā´ąāĩā´ąāĩā´•/ā´¨āĩ€ā´•āĩā´•ā´‚ ⴚāĩ†ā´¯āĩā´¯āĩā´•/ⴚāĩ‡āĩŧā´•āĩā´•āĩā´•" - }, "fileToPDF": { "title": "ā´Ģā´¯āĩŊ PDF-ā´˛āĩ‡ā´•āĩā´•āĩ ā´Žā´žā´ąāĩā´ąāĩā´•", "desc": "ā´ā´•ā´Ļāĩ‡ā´ļā´‚ ā´ā´¤āĩ ā´Ģⴝⴞāĩā´‚ PDF-ā´˛āĩ‡ā´•āĩā´•āĩ ā´Žā´žā´ąāĩā´ąāĩā´• (DOCX, PNG, XLS, PPT, TXT ā´Žā´¨āĩā´¨ā´ŋā´ĩā´¯āĩā´‚ ā´…ā´¤ā´ŋāĩŊ ā´•āĩ‚ā´Ÿāĩā´¤ā´˛āĩā´‚)" }, - "ocr": { - "title": "OCR / ā´¸āĩā´•ā´žā´¨āĩā´•āĩž ā´ĩāĩƒā´¤āĩā´¤ā´ŋā´¯ā´žā´•āĩā´•āĩā´•", - "desc": "ā´¸āĩā´•ā´žā´¨āĩā´•āĩž ā´ĩāĩƒā´¤āĩā´¤ā´ŋā´¯ā´žā´•āĩā´•āĩā´•ā´¯āĩā´‚ ā´’ā´°āĩ PDF-ā´¨āĩā´ŗāĩā´ŗā´ŋā´˛āĩ† ⴚā´ŋā´¤āĩā´°ā´™āĩā´™ā´ŗā´ŋāĩŊ ā´¨ā´ŋā´¨āĩā´¨āĩ ⴟāĩ†ā´•āĩā´¸āĩā´ąāĩā´ąāĩ ā´•ā´Ŗāĩā´Ÿāĩ†ā´¤āĩā´¤āĩā´•ā´¯āĩā´‚ ā´…ā´¤āĩ ⴟāĩ†ā´•āĩā´¸āĩā´ąāĩā´ąā´žā´¯ā´ŋ ā´ĩāĩ€ā´Ŗāĩā´Ÿāĩā´‚ ⴚāĩ‡āĩŧā´•āĩā´•āĩā´•ā´¯āĩā´‚ ⴚāĩ†ā´¯āĩā´¯āĩā´¨āĩā´¨āĩ." - }, - "extractImages": { - "title": "ⴚā´ŋā´¤āĩā´°ā´™āĩā´™āĩž ā´ĩāĩ‡āĩŧā´¤ā´ŋā´°ā´ŋⴚāĩā´šāĩ†ā´Ÿāĩā´•āĩā´•āĩā´•", - "desc": "ā´’ā´°āĩ PDF-āĩŊ ā´¨ā´ŋā´¨āĩā´¨āĩ ā´Žā´˛āĩā´˛ā´ž ⴚā´ŋā´¤āĩā´°ā´™āĩā´™ā´ŗāĩā´‚ ā´ĩāĩ‡āĩŧā´¤ā´ŋā´°ā´ŋⴚāĩā´šāĩ†ā´Ÿāĩā´¤āĩā´¤āĩ ā´¸ā´ŋā´Ēāĩā´Ēā´ŋā´˛āĩ‡ā´•āĩā´•āĩ ⴏⴂⴰⴕāĩā´ˇā´ŋā´•āĩā´•āĩā´¨āĩā´¨āĩ" - }, "pdfToPDFA": { "title": "PDF PDF/A-ā´˛āĩ‡ā´•āĩā´•āĩ", "desc": "ā´Ļāĩ€āĩŧā´˜ā´•ā´žā´˛ ⴏⴂⴭⴰ⴪ⴤāĩā´¤ā´ŋā´¨ā´žā´¯ā´ŋ PDF PDF/A-ā´˛āĩ‡ā´•āĩā´•āĩ ā´Žā´žā´ąāĩā´ąāĩā´•" @@ -435,70 +826,14 @@ "title": "ā´¸āĩā´•ā´žāĩģ ⴚāĩ†ā´¯āĩā´¤ ā´Ģāĩ‹ā´Ÿāĩā´Ÿāĩ‹ā´•āĩž ā´•ā´Ŗāĩā´Ÿāĩ†ā´¤āĩā´¤āĩā´•/ā´ĩā´ŋⴭⴜā´ŋā´•āĩā´•āĩā´•", "desc": "ā´’ā´°āĩ ā´Ģāĩ‹ā´Ÿāĩā´Ÿāĩ‹/PDF-ā´¨āĩā´ŗāĩā´ŗā´ŋāĩŊ ā´¨ā´ŋā´¨āĩā´¨āĩ ā´’ā´¨āĩā´¨ā´ŋⴞⴧā´ŋā´•ā´‚ ā´Ģāĩ‹ā´Ÿāĩā´Ÿāĩ‹ā´•āĩž ā´ĩā´ŋⴭⴜā´ŋā´•āĩā´•āĩā´¨āĩā´¨āĩ" }, - "sign": { - "title": "ā´’ā´Ēāĩā´Ēā´ŋⴟāĩā´•", - "desc": "ā´ĩⴰⴚāĩā´šāĩ‹, ⴟāĩ†ā´•āĩā´¸āĩā´ąāĩā´ąāĩ ā´‰ā´Ēā´¯āĩ‹ā´—ā´ŋⴚāĩā´šāĩ‹, ⴚā´ŋā´¤āĩā´°ā´‚ ā´‰ā´Ēā´¯āĩ‹ā´—ā´ŋⴚāĩā´šāĩ‹ PDF-āĩŊ ā´’ā´Ēāĩā´Ēāĩ ⴚāĩ‡āĩŧā´•āĩā´•āĩā´¨āĩā´¨āĩ" - }, - "flatten": { - "title": "ā´Ēā´°ā´¤āĩā´¤āĩā´•", - "desc": "ā´’ā´°āĩ PDF-āĩŊ ā´¨ā´ŋā´¨āĩā´¨āĩ ā´Žā´˛āĩā´˛ā´ž ⴇⴍāĩā´ąā´ąā´žā´•āĩā´Ÿāĩ€ā´ĩāĩ ā´˜ā´Ÿā´•ā´™āĩā´™ā´ŗāĩā´‚ ā´Ģāĩ‹ā´Žāĩā´•ā´ŗāĩā´‚ ā´¨āĩ€ā´•āĩā´•ā´‚ ⴚāĩ†ā´¯āĩā´¯āĩā´•" - }, - "repair": { - "title": "ⴍⴍāĩā´¨ā´žā´•āĩā´•āĩā´•", - "desc": "ā´•āĩ‡ā´Ÿā´žā´¯/ⴤⴕāĩŧā´¨āĩā´¨ PDF ⴍⴍāĩā´¨ā´žā´•āĩā´•ā´žāĩģ ā´ļāĩā´°ā´Žā´ŋā´•āĩā´•āĩā´¨āĩā´¨āĩ" - }, - "removeBlanks": { - "title": "ā´ļāĩ‚ā´¨āĩā´¯ā´Žā´žā´¯ ā´Ēāĩ‡ā´œāĩā´•āĩž ā´¨āĩ€ā´•āĩā´•ā´‚ ⴚāĩ†ā´¯āĩā´¯āĩā´•", - "desc": "ā´’ā´°āĩ ā´Ēāĩā´°ā´Žā´žā´Ŗā´¤āĩā´¤ā´ŋāĩŊ ā´¨ā´ŋā´¨āĩā´¨āĩ ā´ļāĩ‚ā´¨āĩā´¯ā´Žā´žā´¯ ā´Ēāĩ‡ā´œāĩā´•āĩž ā´•ā´Ŗāĩā´Ÿāĩ†ā´¤āĩā´¤āĩā´•ā´¯āĩā´‚ ā´¨āĩ€ā´•āĩā´•ā´‚ ⴚāĩ†ā´¯āĩā´¯āĩā´•ā´¯āĩā´‚ ⴚāĩ†ā´¯āĩā´¯āĩā´¨āĩā´¨āĩ" - }, - "removeAnnotations": { - "title": "ā´ĩāĩā´¯ā´žā´–āĩā´¯ā´žā´¨ā´™āĩā´™āĩž ā´¨āĩ€ā´•āĩā´•ā´‚ ⴚāĩ†ā´¯āĩā´¯āĩā´•", - "desc": "ā´’ā´°āĩ PDF-āĩŊ ā´¨ā´ŋā´¨āĩā´¨āĩ ā´Žā´˛āĩā´˛ā´ž ā´…ā´­ā´ŋā´Ēāĩā´°ā´žā´¯ā´™āĩā´™ā´ŗāĩā´‚/ā´ĩāĩā´¯ā´žā´–āĩā´¯ā´žā´¨ā´™āĩā´™ā´ŗāĩā´‚ ā´¨āĩ€ā´•āĩā´•ā´‚ ⴚāĩ†ā´¯āĩā´¯āĩā´¨āĩā´¨āĩ" - }, - "compare": { - "title": "ā´¤ā´žā´°ā´¤ā´Žāĩā´¯ā´‚ ⴚāĩ†ā´¯āĩā´¯āĩā´•", - "desc": "2 PDF ā´Ēāĩā´°ā´Žā´žā´Ŗā´™āĩā´™āĩž ā´¤ā´Žāĩā´Žā´ŋā´˛āĩā´ŗāĩā´ŗ ā´ĩāĩā´¯ā´¤āĩā´¯ā´žā´¸ā´™āĩā´™āĩž ā´¤ā´žā´°ā´¤ā´Žāĩā´¯ā´‚ ⴚāĩ†ā´¯āĩā´¯āĩā´•ā´¯āĩā´‚ ā´•ā´žā´Ŗā´ŋā´•āĩā´•āĩā´•ā´¯āĩā´‚ ⴚāĩ†ā´¯āĩā´¯āĩā´¨āĩā´¨āĩ" - }, - "certSign": { - "title": "ā´¸āĩŧⴟāĩā´Ÿā´ŋā´Ģā´ŋā´•āĩā´•ā´ąāĩā´ąāĩ ā´‰ā´Ēā´¯āĩ‹ā´—ā´ŋⴚāĩā´šāĩ ā´’ā´Ēāĩā´Ēā´ŋⴟāĩā´•", - "desc": "ā´’ā´°āĩ ā´¸āĩŧⴟāĩā´Ÿā´ŋā´Ģā´ŋā´•āĩā´•ā´ąāĩā´ąāĩ/ā´•āĩ€ (PEM/P12) ā´‰ā´Ēā´¯āĩ‹ā´—ā´ŋⴚāĩā´šāĩ ā´’ā´°āĩ PDF ā´’ā´Ēāĩā´Ēā´ŋⴟāĩā´¨āĩā´¨āĩ" - }, - "removeCertSign": { - "title": "ā´¸āĩŧⴟāĩā´Ÿā´ŋā´Ģā´ŋā´•āĩā´•ā´ąāĩā´ąāĩ ā´’ā´Ēāĩā´Ēāĩ ā´¨āĩ€ā´•āĩā´•ā´‚ ⴚāĩ†ā´¯āĩā´¯āĩā´•", - "desc": "PDF-āĩŊ ā´¨ā´ŋā´¨āĩā´¨āĩ ā´¸āĩŧⴟāĩā´Ÿā´ŋā´Ģā´ŋā´•āĩā´•ā´ąāĩā´ąāĩ ā´’ā´Ēāĩā´Ēāĩ ā´¨āĩ€ā´•āĩā´•ā´‚ ⴚāĩ†ā´¯āĩā´¯āĩā´•" - }, - "pageLayout": { - "title": "ā´Žāĩžā´Ÿāĩā´Ÿā´ŋ-ā´Ēāĩ‡ā´œāĩ ā´˛āĩ‡ā´”ā´Ÿāĩā´Ÿāĩ", - "desc": "ā´’ā´°āĩ PDF ā´Ēāĩā´°ā´Žā´žā´Ŗā´¤āĩā´¤ā´ŋā´¨āĩā´ąāĩ† ā´’ā´¨āĩā´¨ā´ŋⴞⴧā´ŋā´•ā´‚ ā´Ēāĩ‡ā´œāĩā´•āĩž ā´’ā´°āĩŠā´ąāĩā´ą ā´Ēāĩ‡ā´œā´ŋā´˛āĩ‡ā´•āĩā´•āĩ ⴞⴝā´ŋā´Ēāĩā´Ēā´ŋā´•āĩā´•āĩā´•" - }, - "scalePages": { - "title": "ā´Ēāĩ‡ā´œāĩ ā´ĩā´˛āĩā´Ēāĩā´Ēā´‚/ā´¸āĩā´•āĩ†ā´¯ā´ŋāĩŊ ā´•āĩā´°ā´Žāĩ€ā´•ā´°ā´ŋā´•āĩā´•āĩā´•", - "desc": "ā´’ā´°āĩ ā´Ēāĩ‡ā´œā´ŋā´¨āĩā´ąāĩ†ā´¯āĩā´‚/ā´…ā´˛āĩā´˛āĩ†ā´™āĩā´•ā´ŋāĩŊ ā´…ā´¤ā´ŋā´¨āĩā´ąāĩ† ⴉⴺāĩā´ŗā´Ÿā´•āĩā´•ā´™āĩā´™ā´ŗāĩā´Ÿāĩ†ā´¯āĩā´‚ ā´ĩā´˛āĩā´Ēāĩā´Ēā´‚/ā´¸āĩā´•āĩ†ā´¯ā´ŋāĩŊ ā´Žā´žā´ąāĩā´ąāĩā´•." - }, "pipeline": { "title": "ā´Ēāĩˆā´Ēāĩā´Ēāĩā´˛āĩˆāĩģ", "desc": "ā´Ēāĩˆā´Ēāĩā´Ēāĩā´˛āĩˆāĩģ ā´¸āĩā´•āĩā´°ā´ŋā´Ēāĩā´ąāĩā´ąāĩā´•āĩž ā´¨ā´ŋāĩŧā´ĩⴚā´ŋⴚāĩā´šāĩā´•āĩŠā´Ŗāĩā´Ÿāĩ PDF-ā´•ā´ŗā´ŋāĩŊ ā´’ā´¨āĩā´¨ā´ŋⴞⴧā´ŋā´•ā´‚ ā´Ēāĩā´°ā´ĩāĩŧā´¤āĩā´¤ā´¨ā´™āĩā´™āĩž ⴍⴟⴤāĩā´¤āĩā´•" }, - "addPageNumbers": { - "title": "ā´Ēāĩ‡ā´œāĩ ā´¨ā´Žāĩā´Ēā´ąāĩā´•āĩž ⴚāĩ‡āĩŧā´•āĩā´•āĩā´•", - "desc": "ā´’ā´°āĩ ā´Ēāĩā´°ā´Žā´žā´Ŗā´¤āĩā´¤ā´ŋā´˛āĩā´Ÿā´¨āĩ€ā´ŗā´‚ ā´’ā´°āĩ ā´¨ā´ŋā´ļāĩā´šā´ŋā´¤ ā´¸āĩā´Ĩā´žā´¨ā´¤āĩā´¤āĩ ā´Ēāĩ‡ā´œāĩ ā´¨ā´Žāĩā´Ēā´ąāĩā´•āĩž ⴚāĩ‡āĩŧā´•āĩā´•āĩā´•" - }, "auto-rename": { "title": "PDF ā´Ģā´¯āĩŊ ā´¸āĩā´ĩⴝⴂ ā´Ēāĩā´¨āĩŧā´¨ā´žā´Žā´•ā´°ā´Ŗā´‚ ⴚāĩ†ā´¯āĩā´¯āĩā´•", "desc": "ā´•ā´Ŗāĩā´Ÿāĩ†ā´¤āĩā´¤ā´ŋā´¯ ⴤⴞⴕāĩā´•āĩ†ā´Ÿāĩā´Ÿā´ŋā´¨āĩ† ā´…ā´Ÿā´ŋā´¸āĩā´Ĩā´žā´¨ā´Žā´žā´•āĩā´•ā´ŋ ā´’ā´°āĩ PDF ā´Ģā´¯āĩŊ ā´¸āĩā´ĩⴝⴂ ā´Ēāĩā´¨āĩŧā´¨ā´žā´Žā´•ā´°ā´Ŗā´‚ ⴚāĩ†ā´¯āĩā´¯āĩā´¨āĩā´¨āĩ" }, - "adjustContrast": { - "title": "ā´¨ā´ŋā´ąā´™āĩā´™āĩž/ā´•āĩ‹āĩēⴟāĩā´°ā´žā´¸āĩā´ąāĩā´ąāĩ ā´•āĩā´°ā´Žāĩ€ā´•ā´°ā´ŋā´•āĩā´•āĩā´•", - "desc": "ā´’ā´°āĩ PDF-ā´¨āĩā´ąāĩ† ā´•āĩ‹āĩēⴟāĩā´°ā´žā´¸āĩā´ąāĩā´ąāĩ, ā´¸ā´žā´šāĩā´šāĩā´ąāĩ‡ā´ˇāĩģ, ā´¤āĩ†ā´ŗā´ŋⴚāĩā´šā´‚ ā´Žā´¨āĩā´¨ā´ŋā´ĩ ā´•āĩā´°ā´Žāĩ€ā´•ā´°ā´ŋā´•āĩā´•āĩā´•" - }, - "crop": { - "title": "PDF ā´•āĩā´°āĩ‹ā´Ēāĩā´Ēāĩ ⴚāĩ†ā´¯āĩā´¯āĩā´•", - "desc": "ā´ĩā´˛āĩā´Ēāĩā´Ēā´‚ ā´•āĩā´ąā´¯āĩā´•āĩā´•ā´žāĩģ ā´’ā´°āĩ PDF ā´•āĩā´°āĩ‹ā´Ēāĩā´Ēāĩ ⴚāĩ†ā´¯āĩā´¯āĩā´• (ⴟāĩ†ā´•āĩā´¸āĩā´ąāĩā´ąāĩ ā´¨ā´ŋⴞⴍā´ŋāĩŧā´¤āĩā´¤āĩā´¨āĩā´¨āĩ!)" - }, - "autoSplitPDF": { - "title": "ā´Ēāĩ‡ā´œāĩā´•āĩž ā´¸āĩā´ĩⴝⴂ ā´ĩā´ŋⴭⴜā´ŋā´•āĩā´•āĩā´•", - "desc": "ā´­āĩ—ā´¤ā´ŋā´•ā´Žā´žā´¯ā´ŋ ā´¸āĩā´•ā´žāĩģ ⴚāĩ†ā´¯āĩā´¤ ā´Ēāĩ‡ā´œāĩ ā´¸āĩā´Ēāĩā´˛ā´ŋā´ąāĩā´ąāĩŧ QR ā´•āĩ‹ā´Ąāĩ ā´‰ā´Ēā´¯āĩ‹ā´—ā´ŋⴚāĩā´šāĩ ā´¸āĩā´•ā´žāĩģ ⴚāĩ†ā´¯āĩā´¤ PDF ā´¸āĩā´ĩⴝⴂ ā´ĩā´ŋⴭⴜā´ŋā´•āĩā´•āĩā´•" - }, "sanitizePDF": { "title": "ā´ļāĩā´Ļāĩā´§āĩ€ā´•ā´°ā´ŋā´•āĩā´•āĩā´•", "desc": "PDF ā´Ģⴝⴞāĩā´•ā´ŗā´ŋāĩŊ ā´¨ā´ŋā´¨āĩā´¨āĩ ā´¸āĩā´•āĩā´°ā´ŋā´Ēāĩā´ąāĩā´ąāĩā´•ā´ŗāĩā´‚ ā´Žā´ąāĩā´ąāĩ ā´˜ā´Ÿā´•ā´™āĩā´™ā´ŗāĩā´‚ ā´¨āĩ€ā´•āĩā´•ā´‚ ⴚāĩ†ā´¯āĩā´¯āĩā´•" @@ -519,30 +854,14 @@ "title": "PDF ā´Žā´žāĩŧā´•āĩā´•āĩā´Ąāĩ—ā´Ŗā´ŋā´˛āĩ‡ā´•āĩā´•āĩ", "desc": "ā´ā´¤āĩ PDF-ā´¨āĩ†ā´¯āĩā´‚ ā´Žā´žāĩŧā´•āĩā´•āĩā´Ąāĩ—ā´Ŗā´ŋā´˛āĩ‡ā´•āĩā´•āĩ ā´Žā´žā´ąāĩā´ąāĩā´¨āĩā´¨āĩ" }, - "getPdfInfo": { - "title": "PDF-ā´¨āĩ†ā´•āĩā´•āĩā´ąā´ŋⴚāĩā´šāĩā´ŗāĩā´ŗ ā´Žā´˛āĩā´˛ā´ž ā´ĩā´ŋā´ĩā´°ā´™āĩā´™ā´ŗāĩā´‚ ā´¨āĩ‡ā´Ÿāĩā´•", - "desc": "PDF-ā´•ā´ŗāĩ†ā´•āĩā´•āĩā´ąā´ŋⴚāĩā´šāĩā´ŗāĩā´ŗ ā´¸ā´žā´§āĩā´¯ā´Žā´žā´¯ ā´Žā´˛āĩā´˛ā´ž ā´ĩā´ŋā´ĩā´°ā´™āĩā´™ā´ŗāĩā´‚ ā´¨āĩ‡ā´Ÿāĩā´¨āĩā´¨āĩ" - }, "pageExtracter": { "title": "ā´Ēāĩ‡ā´œāĩ(ā´•āĩž) ā´ĩāĩ‡āĩŧā´¤ā´ŋā´°ā´ŋⴚāĩā´šāĩ†ā´Ÿāĩā´•āĩā´•āĩā´•", "desc": "PDF-āĩŊ ā´¨ā´ŋā´¨āĩā´¨āĩ ā´¤ā´ŋā´°ā´žāĩā´žāĩ†ā´Ÿāĩā´¤āĩā´¤ ā´Ēāĩ‡ā´œāĩā´•āĩž ā´ĩāĩ‡āĩŧā´¤ā´ŋā´°ā´ŋⴚāĩā´šāĩ†ā´Ÿāĩā´•āĩā´•āĩā´¨āĩā´¨āĩ" }, - "pdfToSinglePage": { - "title": "ā´’ā´°āĩŠā´ąāĩā´ą ā´ĩā´˛ā´ŋā´¯ ā´Ēāĩ‡ā´œāĩ", - "desc": "ā´Žā´˛āĩā´˛ā´ž PDF ā´Ēāĩ‡ā´œāĩā´•ā´ŗāĩā´‚ ā´’ā´°āĩŠā´ąāĩā´ą ā´ĩā´˛ā´ŋā´¯ ā´Ēāĩ‡ā´œā´ŋā´˛āĩ‡ā´•āĩā´•āĩ ⴞⴝā´ŋā´Ēāĩā´Ēā´ŋā´•āĩā´•āĩā´¨āĩā´¨āĩ" - }, - "showJS": { - "title": "ā´œā´žā´ĩā´žā´¸āĩā´•āĩā´°ā´ŋā´Ēāĩā´ąāĩā´ąāĩ ā´•ā´žā´Ŗā´ŋā´•āĩā´•āĩā´•", - "desc": "ā´’ā´°āĩ PDF-āĩŊ ā´•āĩā´¤āĩā´¤ā´ŋā´ĩⴚāĩā´š ā´ā´¤āĩ†ā´™āĩā´•ā´ŋā´˛āĩā´‚ JS ā´¤ā´ŋā´°ā´¯āĩā´•ā´¯āĩā´‚ ā´Ēāĩā´°ā´Ļāĩŧā´ļā´ŋā´Ēāĩā´Ēā´ŋā´•āĩā´•āĩā´•ā´¯āĩā´‚ ⴚāĩ†ā´¯āĩā´¯āĩā´¨āĩā´¨āĩ" - }, "autoRedact": { "title": "ā´¸āĩā´ĩⴝⴂ ā´ąāĩ†ā´Ąā´žā´•āĩā´ąāĩā´ąāĩ ⴚāĩ†ā´¯āĩā´¯āĩā´•", "desc": "ā´‡āĩģā´Ēāĩā´Ÿāĩā´Ÿāĩ ⴟāĩ†ā´•āĩā´¸āĩā´ąāĩā´ąā´ŋā´¨āĩ† ā´…ā´Ÿā´ŋā´¸āĩā´Ĩā´žā´¨ā´Žā´žā´•āĩā´•ā´ŋ ā´’ā´°āĩ PDF-ā´˛āĩ† ⴟāĩ†ā´•āĩā´¸āĩā´ąāĩā´ąāĩ ā´¸āĩā´ĩⴝⴂ ā´ąāĩ†ā´Ąā´žā´•āĩā´ąāĩā´ąāĩ (ā´•ā´ąāĩā´Ēāĩā´Ēā´ŋā´•āĩā´•āĩā´¨āĩā´¨āĩ) ⴚāĩ†ā´¯āĩā´¯āĩā´¨āĩā´¨āĩ" }, - "redact": { - "title": "ā´¸āĩā´ĩⴝⴂ ā´ąāĩ†ā´Ąā´žā´•āĩā´ˇāĩģ", - "desc": "ā´¤ā´ŋā´°ā´žāĩā´žāĩ†ā´Ÿāĩā´¤āĩā´¤ ⴟāĩ†ā´•āĩā´¸āĩā´ąāĩā´ąāĩ, ā´ĩⴰⴚāĩā´š ā´°āĩ‚ā´Ēā´™āĩā´™āĩž ā´•āĩ‚ā´Ÿā´žā´¤āĩ†/ā´…ā´˛āĩā´˛āĩ†ā´™āĩā´•ā´ŋāĩŊ ā´¤ā´ŋā´°ā´žāĩā´žāĩ†ā´Ÿāĩā´¤āĩā´¤ ā´Ēāĩ‡ā´œāĩ(ā´•āĩž) ā´…ā´Ÿā´ŋā´¸āĩā´Ĩā´žā´¨ā´Žā´žā´•āĩā´•ā´ŋ ā´’ā´°āĩ PDF ā´ąāĩ†ā´Ąā´žā´•āĩā´ąāĩā´ąāĩ ⴚāĩ†ā´¯āĩā´¯āĩā´¨āĩā´¨āĩ" - }, "PDFToCSV": { "title": "PDF CSV-ā´˛āĩ‡ā´•āĩā´•āĩ", "desc": "ā´’ā´°āĩ PDF-āĩŊ ā´¨ā´ŋā´¨āĩā´¨āĩ ā´Ēⴟāĩā´Ÿā´ŋā´•ā´•āĩž ā´ĩāĩ‡āĩŧā´¤ā´ŋā´°ā´ŋⴚāĩā´šāĩ†ā´Ÿāĩā´¤āĩā´¤āĩ CSV-ā´˛āĩ‡ā´•āĩā´•āĩ ā´Žā´žā´ąāĩā´ąāĩā´¨āĩā´¨āĩ" @@ -551,10 +870,6 @@ "title": "ā´ĩā´˛āĩā´Ēāĩā´Ēā´‚/ā´Žā´Ŗāĩā´Ŗā´‚ ā´…ā´¨āĩā´¸ā´°ā´ŋⴚāĩā´šāĩ ā´¸āĩā´ĩⴝⴂ ā´ĩā´ŋⴭⴜā´ŋā´•āĩā´•āĩā´•", "desc": "ā´ĩā´˛āĩā´Ēāĩā´Ēā´‚, ā´Ēāĩ‡ā´œāĩ ā´Žā´Ŗāĩā´Ŗā´‚, ā´…ā´˛āĩā´˛āĩ†ā´™āĩā´•ā´ŋāĩŊ ā´Ēāĩā´°ā´Žā´žā´Ŗā´™āĩā´™ā´ŗāĩā´Ÿāĩ† ā´Žā´Ŗāĩā´Ŗā´‚ ā´Žā´¨āĩā´¨ā´ŋā´ĩ ā´…ā´Ÿā´ŋā´¸āĩā´Ĩā´žā´¨ā´Žā´žā´•āĩā´•ā´ŋ ā´’ā´°āĩŠā´ąāĩā´ą PDF ā´’ā´¨āĩā´¨ā´ŋⴞⴧā´ŋā´•ā´‚ ā´Ēāĩā´°ā´Žā´žā´Ŗā´™āĩā´™ā´ŗā´žā´¯ā´ŋ ā´ĩā´ŋⴭⴜā´ŋā´•āĩā´•āĩā´•" }, - "overlay-pdfs": { - "title": "PDF-ā´•āĩž ā´“ā´ĩāĩŧā´˛āĩ‡ ⴚāĩ†ā´¯āĩā´¯āĩā´•", - "desc": "ā´Žā´ąāĩā´ąāĩŠā´°āĩ PDF-ā´¨āĩ ā´Žāĩā´•ā´ŗā´ŋāĩŊ PDF-ā´•āĩž ā´“ā´ĩāĩŧā´˛āĩ‡ ⴚāĩ†ā´¯āĩā´¯āĩā´¨āĩā´¨āĩ" - }, "split-by-sections": { "title": "ā´ĩā´ŋā´­ā´žā´—ā´™āĩā´™āĩž ā´…ā´¨āĩā´¸ā´°ā´ŋⴚāĩā´šāĩ PDF ā´ĩā´ŋⴭⴜā´ŋā´•āĩā´•āĩā´•", "desc": "ā´’ā´°āĩ PDF-ā´¨āĩā´ąāĩ† ā´“ā´°āĩ‹ ā´Ēāĩ‡ā´œāĩā´‚ ⴚāĩ†ā´ąā´ŋā´¯ ā´¤ā´ŋā´°ā´ļāĩā´šāĩ€ā´¨ā´ĩāĩā´‚ ⴞⴂā´Ŧā´ĩāĩā´Žā´žā´¯ ā´ĩā´ŋā´­ā´žā´—ā´™āĩā´™ā´ŗā´žā´¯ā´ŋ ā´ĩā´ŋⴭⴜā´ŋā´•āĩā´•āĩā´•" @@ -563,23 +878,15 @@ "title": "PDF-āĩŊ ā´¸āĩā´ąāĩā´ąā´žā´Žāĩā´Ēāĩ ⴚāĩ‡āĩŧā´•āĩā´•āĩā´•", "desc": "ā´¨ā´ŋā´ļāĩā´šā´ŋā´¤ ā´¸āĩā´Ĩā´žā´¨ā´™āĩā´™ā´ŗā´ŋāĩŊ ⴟāĩ†ā´•āĩā´¸āĩā´ąāĩā´ąāĩ ā´…ā´˛āĩā´˛āĩ†ā´™āĩā´•ā´ŋāĩŊ ā´‡ā´Žāĩ‡ā´œāĩ ā´¸āĩā´ąāĩā´ąā´žā´Žāĩā´Ēāĩā´•āĩž ⴚāĩ‡āĩŧā´•āĩā´•āĩā´•" }, - "removeImage": { - "title": "ⴚā´ŋā´¤āĩā´°ā´‚ ā´¨āĩ€ā´•āĩā´•ā´‚ ⴚāĩ†ā´¯āĩā´¯āĩā´•", - "desc": "ā´Ģā´¯āĩŊ ā´ĩā´˛āĩā´Ēāĩā´Ēā´‚ ā´•āĩā´ąā´¯āĩā´•āĩā´•ā´žāĩģ PDF-āĩŊ ā´¨ā´ŋā´¨āĩā´¨āĩ ⴚā´ŋā´¤āĩā´°ā´‚ ā´¨āĩ€ā´•āĩā´•ā´‚ ⴚāĩ†ā´¯āĩā´¯āĩā´•" - }, - "splitByChapters": { - "title": "ā´…ā´§āĩā´¯ā´žā´¯ā´™āĩā´™āĩž ā´…ā´¨āĩā´¸ā´°ā´ŋⴚāĩā´šāĩ PDF ā´ĩā´ŋⴭⴜā´ŋā´•āĩā´•āĩā´•", - "desc": "ā´…ā´¤ā´ŋā´¨āĩā´ąāĩ† ā´…ā´§āĩā´¯ā´žā´¯ ⴘⴟⴍⴝāĩ† ā´…ā´Ÿā´ŋā´¸āĩā´Ĩā´žā´¨ā´Žā´žā´•āĩā´•ā´ŋ ā´’ā´°āĩ PDF ā´’ā´¨āĩā´¨ā´ŋⴞⴧā´ŋā´•ā´‚ ā´Ģⴝⴞāĩā´•ā´ŗā´žā´¯ā´ŋ ā´ĩā´ŋⴭⴜā´ŋā´•āĩā´•āĩā´•." - }, - "validateSignature": { - "title": "PDF ā´’ā´Ēāĩā´Ēāĩ ā´¸ā´žā´§āĩ‚ā´•ā´°ā´ŋā´•āĩā´•āĩā´•", - "desc": "PDF ā´Ēāĩā´°ā´Žā´žā´Ŗā´™āĩā´™ā´ŗā´ŋā´˛āĩ† ā´Ąā´ŋⴜā´ŋā´ąāĩā´ąāĩŊ ā´’ā´Ēāĩā´Ēāĩā´•ā´ŗāĩā´‚ ā´¸āĩŧⴟāĩā´Ÿā´ŋā´Ģā´ŋā´•āĩā´•ā´ąāĩā´ąāĩā´•ā´ŗāĩā´‚ ā´Ēā´°ā´ŋā´ļāĩ‹ā´§ā´ŋā´•āĩā´•āĩā´•" - }, "replace-color": { "title": "ā´¨ā´ŋā´ąā´‚ ā´Žā´žā´ąāĩā´ąāĩā´•ā´¯āĩā´‚ ā´ĩā´ŋā´Ēā´°āĩ€ā´¤ā´Žā´žā´•āĩā´•āĩā´•ā´¯āĩā´‚ ⴚāĩ†ā´¯āĩā´¯āĩā´•", "desc": "PDF-ā´˛āĩ† ⴟāĩ†ā´•āĩā´¸āĩā´ąāĩā´ąā´ŋā´¨āĩā´‚ ā´Ēā´ļāĩā´šā´žā´¤āĩā´¤ā´˛ā´¤āĩā´¤ā´ŋā´¨āĩā´‚ ā´¨ā´ŋā´ąā´‚ ā´Žā´žā´ąāĩā´ąāĩā´•ā´¯āĩā´‚ ā´Ģā´¯āĩŊ ā´ĩā´˛āĩā´Ēāĩā´Ēā´‚ ā´•āĩā´ąā´¯āĩā´•āĩā´•āĩā´¨āĩā´¨ā´¤ā´ŋā´¨āĩ PDF-ā´¨āĩā´ąāĩ† ā´Žāĩā´´āĩā´ĩāĩģ ā´¨ā´ŋā´ąā´ĩāĩā´‚ ā´ĩā´ŋā´Ēā´°āĩ€ā´¤ā´Žā´žā´•āĩā´•āĩā´•ā´¯āĩā´‚ ⴚāĩ†ā´¯āĩā´¯āĩā´•" } }, + "landing": { + "addFiles": "Add Files", + "uploadFromComputer": "Upload from computer" + }, "viewPdf": { "tags": "ā´•ā´žā´Ŗāĩā´•,ā´ĩā´žā´¯ā´ŋā´•āĩā´•āĩā´•,ā´ĩāĩā´¯ā´žā´–āĩā´¯ā´žā´¨ā´ŋā´•āĩā´•āĩā´•,ⴟāĩ†ā´•āĩā´¸āĩā´ąāĩā´ąāĩ,ⴚā´ŋā´¤āĩā´°ā´‚,ā´šāĩˆā´˛āĩˆā´ąāĩā´ąāĩ,ā´¤ā´ŋā´°āĩā´¤āĩā´¤āĩā´•", "title": "PDF ā´•ā´žā´Ŗāĩā´•/ā´¤ā´ŋā´°āĩā´¤āĩā´¤āĩā´•", @@ -613,14 +920,39 @@ "merge": { "tags": "ⴞⴝā´ŋā´Ēāĩā´Ēā´ŋā´•āĩā´•āĩā´•,ā´Ēāĩ‡ā´œāĩ ā´Ēāĩā´°ā´ĩāĩŧā´¤āĩā´¤ā´¨ā´™āĩā´™āĩž,ā´Ŧā´žā´•āĩā´•āĩ ā´Žāĩģā´Ąāĩ,ā´¸āĩ†āĩŧā´ĩāĩŧ ā´¸āĩˆā´Ąāĩ", "title": "ⴞⴝā´ŋā´Ēāĩā´Ēā´ŋā´•āĩā´•āĩā´•", + "removeDigitalSignature": { + "label": "Remove digital signature in the merged file?", + "tooltip": { + "title": "Remove Digital Signature", + "description": "Digital signatures will be invalidated when merging files. Check this to remove them from the final merged PDF." + } + }, + "generateTableOfContents": { + "label": "Generate table of contents in the merged file?", + "tooltip": { + "title": "Generate Table of Contents", + "description": "Automatically creates a clickable table of contents in the merged PDF based on the original file names and page numbers." + } + }, + "submit": "ⴞⴝā´ŋā´Ēāĩā´Ēā´ŋā´•āĩā´•āĩā´•", + "sortBy": { + "description": "Files will be merged in the order they're selected. Drag to reorder or sort below.", + "label": "Sort By", + "filename": "File Name", + "dateModified": "Date Modified", + "ascending": "Ascending", + "descending": "Descending", + "sort": "Sort" + }, + "error": { + "failed": "An error occurred while merging the PDFs." + }, "header": "ā´’ā´¨āĩā´¨ā´ŋⴞⴧā´ŋā´•ā´‚ PDF-ā´•āĩž ⴞⴝā´ŋā´Ēāĩā´Ēā´ŋā´•āĩā´•āĩā´• (2+)", "sortByName": "ā´Ēāĩ‡ā´°āĩ ā´…ā´¨āĩā´¸ā´°ā´ŋⴚāĩā´šāĩ ā´…ā´Ÿāĩā´•āĩā´•āĩā´•", "sortByDate": "ā´¤āĩ€ā´¯ā´¤ā´ŋ ā´…ā´¨āĩā´¸ā´°ā´ŋⴚāĩā´šāĩ ā´…ā´Ÿāĩā´•āĩā´•āĩā´•", - "removeCertSign": "ⴞⴝā´ŋā´Ēāĩā´Ēā´ŋⴚāĩā´š ā´Ģⴝⴞā´ŋā´˛āĩ† ā´Ąā´ŋⴜā´ŋā´ąāĩā´ąāĩŊ ā´’ā´Ēāĩā´Ēāĩ ā´¨āĩ€ā´•āĩā´•ā´‚ ⴚāĩ†ā´¯āĩā´¯ā´Ŗāĩ‹?", - "submit": "ⴞⴝā´ŋā´Ēāĩā´Ēā´ŋā´•āĩā´•āĩā´•" + "removeCertSign": "ⴞⴝā´ŋā´Ēāĩā´Ēā´ŋⴚāĩā´š ā´Ģⴝⴞā´ŋā´˛āĩ† ā´Ąā´ŋⴜā´ŋā´ąāĩā´ąāĩŊ ā´’ā´Ēāĩā´Ēāĩ ā´¨āĩ€ā´•āĩā´•ā´‚ ⴚāĩ†ā´¯āĩā´¯ā´Ŗāĩ‹?" }, "split": { - "tags": "ā´Ēāĩ‡ā´œāĩ ā´Ēāĩā´°ā´ĩāĩŧā´¤āĩā´¤ā´¨ā´™āĩā´™āĩž,ā´ĩā´ŋⴭⴜā´ŋā´•āĩā´•āĩā´•,ā´Žāĩžā´Ÿāĩā´Ÿā´ŋ ā´Ēāĩ‡ā´œāĩ,ā´Žāĩā´ąā´ŋā´•āĩā´•āĩā´•,ā´¸āĩ†āĩŧā´ĩāĩŧ ā´¸āĩˆā´Ąāĩ", "title": "PDF ā´ĩā´ŋⴭⴜā´ŋā´•āĩā´•āĩā´•", "header": "PDF ā´ĩā´ŋⴭⴜā´ŋā´•āĩā´•āĩā´•", "desc": { @@ -634,14 +966,251 @@ "8": "ā´Ēāĩā´°ā´Žā´žā´Ŗā´‚ #6: ā´Ēāĩ‡ā´œāĩ 10" }, "splitPages": "ā´ĩā´ŋⴭⴜā´ŋā´•āĩā´•āĩ‡ā´Ŗāĩā´Ÿ ā´Ēāĩ‡ā´œāĩā´•āĩž ā´¨āĩŊā´•āĩā´•:", - "submit": "ā´ĩā´ŋⴭⴜā´ŋā´•āĩā´•āĩā´•" + "submit": "ā´ĩā´ŋⴭⴜā´ŋā´•āĩā´•āĩā´•", + "steps": { + "chooseMethod": "Choose Method", + "settings": "Settings" + }, + "settings": { + "selectMethodFirst": "Please select a split method first" + }, + "error": { + "failed": "An error occurred while splitting the PDF." + }, + "method": { + "label": "Choose split method", + "placeholder": "Select how to split the PDF" + }, + "methods": { + "prefix": { + "splitAt": "Split at", + "splitBy": "Split by" + }, + "byPages": { + "name": "Page Numbers", + "desc": "Extract specific pages (1,3,5-10)", + "tooltip": "Enter page numbers separated by commas or ranges with hyphens" + }, + "bySections": { + "name": "Sections", + "desc": "Divide pages into grid sections", + "tooltip": "Split each page into horizontal and vertical sections" + }, + "bySize": { + "name": "File Size", + "desc": "Limit maximum file size", + "tooltip": "Specify maximum file size (e.g. 10MB, 500KB)" + }, + "byPageCount": { + "name": "Page Count", + "desc": "Fixed pages per file", + "tooltip": "Enter the number of pages for each split file" + }, + "byDocCount": { + "name": "Document Count", + "desc": "Create specific number of files", + "tooltip": "Enter how many files you want to create" + }, + "byChapters": { + "name": "Chapters", + "desc": "Split at bookmark boundaries", + "tooltip": "Uses PDF bookmarks to determine split points" + }, + "byPageDivider": { + "name": "Page Divider", + "desc": "Auto-split with divider sheets", + "tooltip": "Use QR code divider sheets between documents when scanning" + } + }, + "value": { + "fileSize": { + "label": "File Size", + "placeholder": "e.g. 10MB, 500KB" + }, + "pageCount": { + "label": "Pages per File", + "placeholder": "e.g. 5, 10" + }, + "docCount": { + "label": "Number of Files", + "placeholder": "e.g. 3, 5" + } + }, + "tooltip": { + "header": { + "title": "Split Methods Overview" + }, + "byPages": { + "title": "Split at Page Numbers", + "text": "Split your PDF at specific page numbers. Using 'n' splits after page n. Using 'n-m' splits before page n and after page m.", + "bullet1": "Single split points: 3,7 (splits after pages 3 and 7)", + "bullet2": "Range split points: 3-8 (splits before page 3 and after page 8)", + "bullet3": "Mixed: 2,5-10,15 (splits after page 2, before page 5, after page 10, and after page 15)" + }, + "bySections": { + "title": "Split by Grid Sections", + "text": "Divide each page into a grid of sections. Useful for splitting documents with multiple columns or extracting specific areas.", + "bullet1": "Horizontal: Number of rows to create", + "bullet2": "Vertical: Number of columns to create", + "bullet3": "Merge: Combine all sections into one PDF" + }, + "bySize": { + "title": "Split by File Size", + "text": "Create multiple PDFs that don't exceed a specified file size. Ideal for file size limitations or email attachments.", + "bullet1": "Use MB for larger files (e.g., 10MB)", + "bullet2": "Use KB for smaller files (e.g., 500KB)", + "bullet3": "System will split at page boundaries" + }, + "byCount": { + "title": "Split by Count", + "text": "Create multiple PDFs with a specific number of pages or documents each.", + "bullet1": "Page Count: Fixed number of pages per file", + "bullet2": "Document Count: Fixed number of output files", + "bullet3": "Useful for batch processing workflows" + }, + "byChapters": { + "title": "Split by Chapters", + "text": "Use PDF bookmarks to automatically split at chapter boundaries. Requires PDFs with bookmark structure.", + "bullet1": "Bookmark Level: Which level to split on (1=top level)", + "bullet2": "Include Metadata: Preserve document properties", + "bullet3": "Allow Duplicates: Handle repeated bookmark names" + }, + "byDocCount": { + "bullet1": "Enter the number of output files you want", + "bullet2": "Pages are distributed as evenly as possible", + "bullet3": "Useful when you need a specific number of files", + "text": "Create a specific number of output files by evenly distributing pages across them.", + "title": "Split by Document Count" + }, + "byPageCount": { + "bullet1": "Enter the number of pages per output file", + "bullet2": "Last file may have fewer pages if not evenly divisible", + "bullet3": "Useful for batch processing workflows", + "text": "Create multiple PDFs with a specific number of pages each. Perfect for creating uniform document chunks.", + "title": "Split by Page Count" + }, + "byPageDivider": { + "bullet1": "Print divider sheets from the download link", + "bullet2": "Insert divider sheets between your documents", + "bullet3": "Scan all documents together as one PDF", + "bullet4": "Upload - divider pages are automatically detected and removed", + "bullet5": "Enable Duplex Mode if scanning both sides of divider sheets", + "text": "Automatically split scanned documents using physical divider sheets with QR codes. Perfect for processing multiple documents scanned together.", + "title": "Split by Page Divider" + } + }, + "methodSelection": { + "tooltip": { + "bullet1": "Click on a method card to select it", + "bullet2": "Hover over each card to see a quick description", + "bullet3": "The settings step will appear after you select a method", + "bullet4": "You can change methods at any time before processing", + "header": { + "text": "Choose how you want to split your PDF document. Each method is optimized for different use cases and document types.", + "title": "Split Method Selection" + }, + "title": "Choose Your Split Method" + } + }, + "selectMethod": "Select a split method", + "tags": "ā´Ēāĩ‡ā´œāĩ ā´Ēāĩā´°ā´ĩāĩŧā´¤āĩā´¤ā´¨ā´™āĩā´™āĩž,ā´ĩā´ŋⴭⴜā´ŋā´•āĩā´•āĩā´•,ā´Žāĩžā´Ÿāĩā´Ÿā´ŋ ā´Ēāĩ‡ā´œāĩ,ā´Žāĩā´ąā´ŋā´•āĩā´•āĩā´•,ā´¸āĩ†āĩŧā´ĩāĩŧ ā´¸āĩˆā´Ąāĩ" }, "rotate": { - "tags": "ā´¸āĩ†āĩŧā´ĩāĩŧ ā´¸āĩˆā´Ąāĩ", "title": "PDF ā´¤ā´ŋā´°ā´ŋā´•āĩā´•āĩā´•", + "submit": "ā´¤ā´ŋā´°ā´ŋā´•āĩā´•āĩā´•", + "selectRotation": "Select Rotation Angle (Clockwise)", + "error": { + "failed": "An error occurred while rotating the PDF." + }, + "preview": { + "title": "Rotation Preview" + }, + "rotateLeft": "Rotate Anticlockwise", + "rotateRight": "Rotate Clockwise", + "tooltip": { + "header": { + "title": "Rotate Settings Overview" + }, + "description": { + "text": "Rotate your PDF pages clockwise or anticlockwise in 90-degree increments. All pages in the PDF will be rotated. The preview shows how your document will look after rotation." + }, + "controls": { + "title": "Controls", + "text": "Use the rotation buttons to adjust orientation. Left button rotates anticlockwise, right button rotates clockwise. Each click rotates by 90 degrees." + } + }, + "tags": "ā´¸āĩ†āĩŧā´ĩāĩŧ ā´¸āĩˆā´Ąāĩ", "header": "PDF ā´¤ā´ŋā´°ā´ŋā´•āĩā´•āĩā´•", - "selectAngle": "ā´¤ā´ŋā´°ā´ŋā´•āĩā´•āĩ‡ā´Ŗāĩā´Ÿ ā´•āĩ‹āĩē ā´¤ā´ŋā´°ā´žāĩā´žāĩ†ā´Ÿāĩā´•āĩā´•āĩā´• (90 ā´Ąā´ŋā´—āĩā´°ā´ŋā´¯āĩā´Ÿāĩ† ā´—āĩā´Ŗā´ŋⴤⴙāĩā´™ā´ŗā´ŋāĩŊ):", - "submit": "ā´¤ā´ŋā´°ā´ŋā´•āĩā´•āĩā´•" + "selectAngle": "ā´¤ā´ŋā´°ā´ŋā´•āĩā´•āĩ‡ā´Ŗāĩā´Ÿ ā´•āĩ‹āĩē ā´¤ā´ŋā´°ā´žāĩā´žāĩ†ā´Ÿāĩā´•āĩā´•āĩā´• (90 ā´Ąā´ŋā´—āĩā´°ā´ŋā´¯āĩā´Ÿāĩ† ā´—āĩā´Ŗā´ŋⴤⴙāĩā´™ā´ŗā´ŋāĩŊ):" + }, + "convert": { + "title": "Convert", + "desc": "Convert files between different formats", + "files": "Files", + "selectFilesPlaceholder": "Select files in the main view to get started", + "settings": "Settings", + "conversionCompleted": "Conversion completed", + "results": "Results", + "defaultFilename": "converted_file", + "conversionResults": "Conversion Results", + "convertFrom": "Convert from", + "convertTo": "Convert to", + "sourceFormatPlaceholder": "Source format", + "targetFormatPlaceholder": "Target format", + "selectSourceFormatFirst": "Select a source format first", + "outputOptions": "Output Options", + "pdfOptions": "PDF Options", + "imageOptions": "Image Options", + "colorType": "Colour Type", + "color": "Colour", + "greyscale": "Greyscale", + "blackwhite": "Black & White", + "dpi": "DPI", + "output": "Output", + "single": "Single", + "multiple": "Multiple", + "fitOption": "Fit Option", + "maintainAspectRatio": "Maintain Aspect Ratio", + "fitDocumentToPage": "Fit Document to Page", + "fillPage": "Fill Page", + "autoRotate": "Auto Rotate", + "autoRotateDescription": "Automatically rotate images to better fit the PDF page", + "combineImages": "Combine Images", + "combineImagesDescription": "Combine all images into one PDF, or create separate PDFs for each image", + "webOptions": "Web to PDF Options", + "zoomLevel": "Zoom Level", + "emailOptions": "Email to PDF Options", + "includeAttachments": "Include email attachments", + "maxAttachmentSize": "Maximum attachment size (MB)", + "includeAllRecipients": "Include CC and BCC recipients in header", + "downloadHtml": "Download HTML intermediate file instead of PDF", + "pdfaOptions": "PDF/A Options", + "outputFormat": "Output Format", + "pdfaNote": "PDF/A-1b is more compatible, PDF/A-2b supports more features.", + "pdfaDigitalSignatureWarning": "The PDF contains a digital signature. This will be removed in the next step.", + "fileFormat": "File Format", + "wordDoc": "Word Document", + "wordDocExt": "Word Document (.docx)", + "odtExt": "OpenDocument Text (.odt)", + "pptExt": "PowerPoint (.pptx)", + "odpExt": "OpenDocument Presentation (.odp)", + "txtExt": "Plain Text (.txt)", + "rtfExt": "Rich Text Format (.rtf)", + "selectedFiles": "Selected files", + "noFileSelected": "No file selected. Use the file panel to add files.", + "convertFiles": "Convert Files", + "converting": "Converting...", + "downloadConverted": "Download Converted File", + "errorNoFiles": "Please select at least one file to convert.", + "errorNoFormat": "Please select both source and target formats.", + "errorNotSupported": "Conversion from {{from}} to {{to}} is not supported.", + "images": "Images", + "officeDocs": "Office Documents (Word, Excel, PowerPoint)", + "imagesExt": "Images (JPG, PNG, etc.)", + "markdown": "Markdown", + "textRtf": "Text/RTF", + "grayscale": "Greyscale", + "errorConversion": "An error occurred while converting the file." }, "imageToPdf": { "tags": "ā´Ēā´°ā´ŋā´ĩāĩŧā´¤āĩā´¤ā´¨ā´‚,img,jpg,ⴚā´ŋā´¤āĩā´°ā´‚,ā´Ģāĩ‹ā´Ÿāĩā´Ÿāĩ‹" @@ -679,7 +1248,33 @@ "8": "ā´…ā´ĩā´¸ā´žā´¨ā´¤āĩā´¤āĩ‡ā´¤āĩ ā´¨āĩ€ā´•āĩā´•ā´‚ ⴚāĩ†ā´¯āĩā´¯āĩā´•", "9": "ā´†ā´Ļāĩā´¯ā´¤āĩā´¤āĩ‡ā´¤āĩā´‚ ā´…ā´ĩā´¸ā´žā´¨ā´¤āĩā´¤āĩ‡ā´¤āĩā´‚ ā´¨āĩ€ā´•āĩā´•ā´‚ ⴚāĩ†ā´¯āĩā´¯āĩā´•", "10": "ā´’ā´ąāĩā´ą-ā´‡ā´°ā´Ÿāĩā´Ÿ ⴞⴝⴍⴂ", - "11": "ā´Žā´˛āĩā´˛ā´ž ā´Ēāĩ‡ā´œāĩā´•ā´ŗāĩā´‚ ⴤⴍā´ŋā´Ēāĩā´Ēā´•āĩŧā´Ēāĩā´Ēā´žā´•āĩā´•āĩā´•" + "11": "ā´Žā´˛āĩā´˛ā´ž ā´Ēāĩ‡ā´œāĩā´•ā´ŗāĩā´‚ ⴤⴍā´ŋā´Ēāĩā´Ēā´•āĩŧā´Ēāĩā´Ēā´žā´•āĩā´•āĩā´•", + "desc": { + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, â€Ļ).", + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, â€Ļ).", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimized for binding on the side)." + } + }, + "desc": { + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, â€Ļ).", + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, â€Ļ).", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimised for binding on the side).", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document." }, "placeholder": "(ā´‰ā´Ļā´ž. 1,3,2 ā´…ā´˛āĩā´˛āĩ†ā´™āĩā´•ā´ŋāĩŊ 4-8,2,10-12 ā´…ā´˛āĩā´˛āĩ†ā´™āĩā´•ā´ŋāĩŊ 2n-1)" }, @@ -691,9 +1286,198 @@ "upload": "ⴚā´ŋā´¤āĩā´°ā´‚ ⴚāĩ‡āĩŧā´•āĩā´•āĩā´•", "submit": "ⴚā´ŋā´¤āĩā´°ā´‚ ⴚāĩ‡āĩŧā´•āĩā´•āĩā´•" }, + "attachments": { + "tags": "attachments,add,remove,embed,file", + "title": "Add Attachments", + "header": "Add Attachments", + "add": "Add Attachment", + "remove": "Remove Attachment", + "embed": "Embed Attachment", + "submit": "Add Attachments" + }, "watermark": { - "tags": "ⴟāĩ†ā´•āĩā´¸āĩā´ąāĩā´ąāĩ,ā´†ā´ĩāĩŧā´¤āĩā´¤ā´ŋā´•āĩā´•āĩā´¨āĩā´¨,ā´˛āĩ‡ā´ŦāĩŊ,ā´¸āĩā´ĩā´¨āĩā´¤ā´‚,ā´Ēā´•āĩŧā´Ēāĩā´Ēā´ĩā´•ā´žā´ļā´‚,ā´ĩāĩā´¯ā´žā´Ēā´žā´°ā´Žāĩā´Ļāĩā´°,img,jpg,ⴚā´ŋā´¤āĩā´°ā´‚,ā´Ģāĩ‹ā´Ÿāĩā´Ÿāĩ‹", "title": "ā´ĩā´žā´Ÿāĩā´Ÿāĩŧā´Žā´žāĩŧā´•āĩā´•āĩ ⴚāĩ‡āĩŧā´•āĩā´•āĩā´•", + "desc": "Add text or image watermarks to PDF files", + "completed": "Watermark added", + "submit": "ā´ĩā´žā´Ÿāĩā´Ÿāĩŧā´Žā´žāĩŧā´•āĩā´•āĩ ⴚāĩ‡āĩŧā´•āĩā´•āĩā´•", + "filenamePrefix": "watermarked", + "error": { + "failed": "An error occurred while adding watermark to the PDF." + }, + "watermarkType": { + "text": "Text", + "image": "Image" + }, + "settings": { + "type": "Watermark Type", + "text": { + "label": "Watermark Text", + "placeholder": "Enter watermark text" + }, + "image": { + "label": "Watermark Image", + "choose": "Choose Image", + "selected": "Selected: {{filename}}" + }, + "fontSize": "Font Size", + "size": "Size", + "alphabet": "Font/Language", + "color": "Watermark Colour", + "rotation": "Rotation (degrees)", + "opacity": "Opacity (%)", + "spacing": { + "horizontal": "Horizontal Spacing", + "vertical": "Vertical Spacing", + "height": "Height Spacing", + "width": "Width Spacing" + }, + "convertToImage": "Flatten PDF pages to images" + }, + "alphabet": { + "roman": "Roman/Latin", + "arabic": "Arabic", + "japanese": "Japanese", + "korean": "Korean", + "chinese": "Chinese", + "thai": "Thai" + }, + "steps": { + "type": "Watermark Type", + "wording": "Wording", + "textStyle": "Style", + "formatting": "Formatting", + "file": "Watermark File" + }, + "results": { + "title": "Watermark Results" + }, + "tooltip": { + "language": { + "title": "Language Support", + "text": "Choose the appropriate language setting to ensure proper font rendering for your text." + }, + "appearance": { + "title": "Appearance Settings", + "text": "Control how your watermark looks and blends with the document.", + "bullet1": "Rotation: -360° to 360° for angled watermarks", + "bullet2": "Opacity: 0-100% for transparency control", + "bullet3": "Lower opacity creates subtle watermarks" + }, + "spacing": { + "title": "Spacing Control", + "text": "Adjust the spacing between repeated watermarks across the page.", + "bullet1": "Width spacing: Horizontal distance between watermarks", + "bullet2": "Height spacing: Vertical distance between watermarks", + "bullet3": "Higher values create more spread out patterns" + }, + "type": { + "header": { + "title": "Watermark Type Selection" + }, + "description": { + "title": "Choose Your Watermark", + "text": "Select between text or image watermarks based on your needs." + }, + "text": { + "title": "Text Watermarks", + "text": "Perfect for adding copyright notices, company names, or confidentiality labels. Supports multiple languages and custom colours.", + "bullet1": "Customisable fonts and languages", + "bullet2": "Adjustable colours and transparency", + "bullet3": "Ideal for legal or branding text" + }, + "image": { + "title": "Image Watermarks", + "text": "Use logos, stamps, or any image as a watermark. Great for branding and visual identification.", + "bullet1": "Upload any image format", + "bullet2": "Maintains image quality", + "bullet3": "Perfect for logos and stamps" + } + }, + "wording": { + "header": { + "title": "Text Content" + }, + "text": { + "title": "Watermark Text", + "text": "Enter the text that will appear as your watermark across the document.", + "bullet1": "Keep it concise for better readability", + "bullet2": "Common examples: 'CONFIDENTIAL', 'DRAFT', company name", + "bullet3": "Emoji characters are not supported and will be filtered out" + } + }, + "textStyle": { + "header": { + "title": "Text Style" + }, + "color": { + "title": "Colour Selection", + "text": "Choose a colour that provides good contrast with your document content.", + "bullet1": "Light grey (#d3d3d3) for subtle watermarks", + "bullet2": "Black or dark colours for high contrast", + "bullet3": "Custom colours for branding purposes" + }, + "language": { + "title": "Language Support", + "text": "Choose the appropriate language setting to ensure proper font rendering." + } + }, + "file": { + "header": { + "title": "Image Upload" + }, + "upload": { + "title": "Image Selection", + "text": "Upload an image file to use as your watermark.", + "bullet1": "Supports common formats: PNG, JPG, GIF, BMP", + "bullet2": "PNG with transparency works best", + "bullet3": "Higher resolution images maintain quality better" + }, + "recommendations": { + "title": "Best Practices", + "text": "Tips for optimal image watermark results.", + "bullet1": "Use logos or stamps with transparent backgrounds", + "bullet2": "Simple designs work better than complex images", + "bullet3": "Consider the final document size when choosing resolution" + } + }, + "formatting": { + "header": { + "title": "Formatting & Layout" + }, + "size": { + "title": "Size Control", + "text": "Adjust the size of your watermark (text or image).", + "bullet1": "Larger sizes create more prominent watermarks" + }, + "appearance": { + "title": "Appearance Settings", + "text": "Control how your watermark looks and blends with the document.", + "bullet1": "Rotation: -360° to 360° for angled watermarks", + "bullet2": "Opacity: 0-100% for transparency control", + "bullet3": "Lower opacity creates subtle watermarks" + }, + "spacing": { + "title": "Spacing Control", + "text": "Adjust the spacing between repeated watermarks across the page.", + "bullet1": "Horizontal spacing: Distance between watermarks left to right", + "bullet2": "Vertical spacing: Distance between watermarks top to bottom", + "bullet3": "Higher values create more spread out patterns" + }, + "security": { + "title": "Security Option", + "text": "Convert the final PDF to an image-based format for enhanced security.", + "bullet1": "Prevents text selection and copying", + "bullet2": "Makes watermarks harder to remove", + "bullet3": "Results in larger file sizes", + "bullet4": "Best for sensitive or copyrighted content" + } + } + }, + "type": { + "1": "ⴟāĩ†ā´•āĩā´¸āĩā´ąāĩā´ąāĩ", + "2": "ⴚā´ŋā´¤āĩā´°ā´‚" + }, + "tags": "ⴟāĩ†ā´•āĩā´¸āĩā´ąāĩā´ąāĩ,ā´†ā´ĩāĩŧā´¤āĩā´¤ā´ŋā´•āĩā´•āĩā´¨āĩā´¨,ā´˛āĩ‡ā´ŦāĩŊ,ā´¸āĩā´ĩā´¨āĩā´¤ā´‚,ā´Ēā´•āĩŧā´Ēāĩā´Ēā´ĩā´•ā´žā´ļā´‚,ā´ĩāĩā´¯ā´žā´Ēā´žā´°ā´Žāĩā´Ļāĩā´°,img,jpg,ⴚā´ŋā´¤āĩā´°ā´‚,ā´Ģāĩ‹ā´Ÿāĩā´Ÿāĩ‹", "header": "ā´ĩā´žā´Ÿāĩā´Ÿāĩŧā´Žā´žāĩŧā´•āĩā´•āĩ ⴚāĩ‡āĩŧā´•āĩā´•āĩā´•", "customColor": "ⴇⴎāĩā´Ÿā´žā´¨āĩā´¸āĩƒā´¤ ⴟāĩ†ā´•āĩā´¸āĩā´ąāĩā´ąāĩ ā´¨ā´ŋā´ąā´‚", "selectText": { @@ -707,11 +1491,6 @@ "8": "ā´ĩā´žā´Ÿāĩā´Ÿāĩŧā´Žā´žāĩŧā´•āĩā´•āĩ ⴤⴰⴂ:", "9": "ā´ĩā´žā´Ÿāĩā´Ÿāĩŧā´Žā´žāĩŧā´•āĩā´•āĩ ⴚā´ŋā´¤āĩā´°ā´‚:", "10": "PDF-ā´¨āĩ† PDF-ⴚā´ŋā´¤āĩā´°ā´¤āĩā´¤ā´ŋā´˛āĩ‡ā´•āĩā´•āĩ ā´Žā´žā´ąāĩā´ąāĩā´•" - }, - "submit": "ā´ĩā´žā´Ÿāĩā´Ÿāĩŧā´Žā´žāĩŧā´•āĩā´•āĩ ⴚāĩ‡āĩŧā´•āĩā´•āĩā´•", - "type": { - "1": "ⴟāĩ†ā´•āĩā´¸āĩā´ąāĩā´ąāĩ", - "2": "ⴚā´ŋā´¤āĩā´°ā´‚" } }, "permissions": { @@ -734,41 +1513,204 @@ "submit": "ā´Žā´žā´ąāĩā´ąāĩā´•" }, "removePages": { - "tags": "ā´Ēāĩ‡ā´œāĩā´•āĩž ā´¨āĩ€ā´•āĩā´•ā´‚ ⴚāĩ†ā´¯āĩā´¯āĩā´•,ā´Ēāĩ‡ā´œāĩā´•āĩž ⴇⴞāĩā´˛ā´žā´¤ā´žā´•āĩā´•āĩā´•" - }, - "addPassword": { - "tags": "ā´¸āĩā´°ā´•āĩā´ˇā´ŋⴤⴂ,ā´¸āĩā´°ā´•āĩā´ˇ", - "title": "ā´Ēā´žā´¸āĩâ€Œā´ĩāĩ‡ā´Ąāĩ ⴚāĩ‡āĩŧā´•āĩā´•āĩā´•", - "header": "ā´Ēā´žā´¸āĩâ€Œā´ĩāĩ‡ā´Ąāĩ ⴚāĩ‡āĩŧā´•āĩā´•āĩā´• (ā´Žāĩģā´•āĩā´°ā´ŋā´Ēāĩā´ąāĩā´ąāĩ ⴚāĩ†ā´¯āĩā´¯āĩā´•)", - "selectText": { - "1": "ā´Žāĩģā´•āĩā´°ā´ŋā´Ēāĩā´ąāĩā´ąāĩ ⴚāĩ†ā´¯āĩā´¯āĩ‡ā´Ŗāĩā´Ÿ PDF ā´¤ā´ŋā´°ā´žāĩā´žāĩ†ā´Ÿāĩā´•āĩā´•āĩā´•", - "2": "ā´‰ā´Ēā´¯āĩ‹ā´•āĩā´¤āĩƒ ā´Ēā´žā´¸āĩâ€Œā´ĩāĩ‡ā´Ąāĩ", - "3": "ā´Žāĩģā´•āĩā´°ā´ŋā´Ēāĩā´ˇāĩģ ā´•āĩ€ ā´Ļāĩˆāĩŧⴘāĩā´¯ā´‚", - "4": "ⴉⴝāĩŧā´¨āĩā´¨ ā´Žāĩ‚ā´˛āĩā´¯ā´™āĩā´™āĩž ā´•āĩ‚ā´Ÿāĩā´¤āĩŊ ā´ļā´•āĩā´¤ā´Žā´žā´Ŗāĩ, ā´Žā´¨āĩā´¨ā´žāĩŊ ā´¤ā´žā´´āĩā´¨āĩā´¨ ā´Žāĩ‚ā´˛āĩā´¯ā´™āĩā´™āĩžā´•āĩā´•āĩ ā´Žā´ŋā´•ā´šāĩā´š ā´…ā´¨āĩā´¯āĩ‹ā´œāĩā´¯ā´¤ā´¯āĩā´Ŗāĩā´Ÿāĩ.", - "5": "ⴏⴜāĩā´œā´Žā´žā´•āĩā´•āĩ‡ā´Ŗāĩā´Ÿ ā´…ā´¨āĩā´Žā´¤ā´ŋā´•āĩž (ā´‰ā´Ÿā´Žā´¯āĩā´Ÿāĩ† ā´Ēā´žā´¸āĩâ€Œā´ĩāĩ‡ā´Ąā´ŋā´¨āĩŠā´Ēāĩā´Ēā´‚ ā´‰ā´Ēā´¯āĩ‹ā´—ā´ŋā´•āĩā´•ā´žāĩģ ā´ļāĩā´Ēā´žāĩŧā´ļ ⴚāĩ†ā´¯āĩā´¯āĩā´¨āĩā´¨āĩ)", - "6": "ā´Ēāĩā´°ā´Žā´žā´Ŗā´‚ ā´•āĩ‚ā´Ÿāĩā´Ÿā´ŋⴚāĩā´šāĩ‡āĩŧā´•āĩā´•āĩā´¨āĩā´¨ā´¤āĩ ⴤⴟⴝāĩā´•", - "7": "ⴉⴺāĩā´ŗā´Ÿā´•āĩā´•ā´‚ ā´ĩāĩ‡āĩŧā´¤ā´ŋā´°ā´ŋⴚāĩā´šāĩ†ā´Ÿāĩā´•āĩā´•āĩā´¨āĩā´¨ā´¤āĩ ⴤⴟⴝāĩā´•", - "8": "ⴞⴭāĩā´¯ā´¤ā´¯āĩā´•āĩā´•ā´žā´¯ā´ŋ ā´ĩāĩ‡āĩŧā´¤ā´ŋā´°ā´ŋⴚāĩā´šāĩ†ā´Ÿāĩā´•āĩā´•āĩā´¨āĩā´¨ā´¤āĩ ⴤⴟⴝāĩā´•", - "9": "ā´Ģāĩ‹ā´‚ ā´Ēāĩ‚ā´°ā´ŋā´Ēāĩā´Ēā´ŋā´•āĩā´•āĩā´¨āĩā´¨ā´¤āĩ ⴤⴟⴝāĩā´•", - "10": "ā´Ēā´°ā´ŋā´ˇāĩā´•āĩā´•ā´°ā´Ŗā´‚ ⴤⴟⴝāĩā´•", - "11": "ā´ĩāĩā´¯ā´žā´–āĩā´¯ā´žā´¨ ā´Ēā´°ā´ŋā´ˇāĩā´•āĩā´•ā´°ā´Ŗā´‚ ⴤⴟⴝāĩā´•", - "12": "ā´…ā´šāĩā´šā´Ÿā´ŋ ⴤⴟⴝāĩā´•", - "13": "ā´ĩāĩā´¯ā´¤āĩā´¯ā´¸āĩā´¤ ā´Ģāĩ‹āĩŧā´Žā´žā´ąāĩā´ąāĩā´•ā´ŗā´ŋāĩŊ ā´…ā´šāĩā´šā´Ÿā´ŋā´•āĩā´•āĩā´¨āĩā´¨ā´¤āĩ ⴤⴟⴝāĩā´•", - "14": "ā´‰ā´Ÿā´Žā´¯āĩā´Ÿāĩ† ā´Ēā´žā´¸āĩâ€Œā´ĩāĩ‡ā´Ąāĩ", - "15": "ā´Ēāĩā´°ā´Žā´žā´Ŗā´‚ ā´¤āĩā´ąā´¨āĩā´¨āĩā´•ā´´ā´ŋā´žāĩā´žā´žāĩŊ ā´Žā´¨āĩā´¤āĩā´šāĩ†ā´¯āĩā´¯ā´žāĩģ ā´•ā´´ā´ŋā´¯āĩā´Žāĩ†ā´¨āĩā´¨ā´¤āĩ ā´¨ā´ŋⴝⴍāĩā´¤āĩā´°ā´ŋā´•āĩā´•āĩā´¨āĩā´¨āĩ (ā´Žā´˛āĩā´˛ā´ž ā´ąāĩ€ā´Ąā´ąāĩā´•ā´ŗāĩā´‚ ā´Ēā´ŋā´¨āĩā´¤āĩā´Ŗā´¯āĩā´•āĩā´•āĩā´¨āĩā´¨ā´ŋā´˛āĩā´˛)", - "16": "ā´Ēāĩā´°ā´Žā´žā´Ŗā´‚ ⴤⴍāĩā´¨āĩ† ā´¤āĩā´ąā´•āĩā´•āĩā´¨āĩā´¨ā´¤āĩ ā´¨ā´ŋⴝⴍāĩā´¤āĩā´°ā´ŋā´•āĩā´•āĩā´¨āĩā´¨āĩ" + "tags": "ā´Ēāĩ‡ā´œāĩā´•āĩž ā´¨āĩ€ā´•āĩā´•ā´‚ ⴚāĩ†ā´¯āĩā´¯āĩā´•,ā´Ēāĩ‡ā´œāĩā´•āĩž ⴇⴞāĩā´˛ā´žā´¤ā´žā´•āĩā´•āĩā´•", + "title": "Remove Pages", + "pageNumbers": { + "label": "Pages to Remove", + "placeholder": "e.g., 1,3,5-8,10", + "error": "Invalid page number format. Use numbers, ranges (1-5), or mathematical expressions (2n+1)" }, - "submit": "ā´Žāĩģā´•āĩā´°ā´ŋā´Ēāĩā´ąāĩā´ąāĩ ⴚāĩ†ā´¯āĩā´¯āĩā´•" - }, - "removePassword": { - "tags": "ā´¸āĩā´°ā´•āĩā´ˇā´ŋⴤⴂ,ā´Ąāĩ€ā´•āĩā´°ā´ŋā´Ēāĩā´ąāĩā´ąāĩ,ā´¸āĩā´°ā´•āĩā´ˇ,ā´Ēā´žā´¸āĩâ€Œā´ĩāĩ‡ā´Ąāĩ ⴇⴞāĩā´˛ā´žā´¤ā´žā´•āĩā´•āĩā´•,ā´Ēā´žā´¸āĩâ€Œā´ĩāĩ‡ā´Ąāĩ ā´¨āĩ€ā´•āĩā´•ā´‚ ⴚāĩ†ā´¯āĩā´¯āĩā´•", - "title": "ā´Ēā´žā´¸āĩâ€Œā´ĩāĩ‡ā´Ąāĩ ā´¨āĩ€ā´•āĩā´•ā´‚ ⴚāĩ†ā´¯āĩā´¯āĩā´•", - "header": "ā´Ēā´žā´¸āĩâ€Œā´ĩāĩ‡ā´Ąāĩ ā´¨āĩ€ā´•āĩā´•ā´‚ ⴚāĩ†ā´¯āĩā´¯āĩā´• (ā´Ąāĩ€ā´•āĩā´°ā´ŋā´Ēāĩā´ąāĩā´ąāĩ ⴚāĩ†ā´¯āĩā´¯āĩā´•)", - "selectText": { - "1": "ā´Ąāĩ€ā´•āĩā´°ā´ŋā´Ēāĩā´ąāĩā´ąāĩ ⴚāĩ†ā´¯āĩā´¯āĩ‡ā´Ŗāĩā´Ÿ PDF ā´¤ā´ŋā´°ā´žāĩā´žāĩ†ā´Ÿāĩā´•āĩā´•āĩā´•", - "2": "ā´Ēā´žā´¸āĩâ€Œā´ĩāĩ‡ā´Ąāĩ" + "filenamePrefix": "pages_removed", + "files": { + "placeholder": "Select a PDF file in the main view to get started" }, - "submit": "ā´¨āĩ€ā´•āĩā´•ā´‚ ⴚāĩ†ā´¯āĩā´¯āĩā´•" + "settings": { + "title": "Settings" + }, + "tooltip": { + "header": { + "title": "Remove Pages Settings" + }, + "pageNumbers": { + "title": "Page Selection", + "text": "Specify which pages to remove from your PDF. You can select individual pages, ranges, or use mathematical expressions.", + "bullet1": "Individual pages: 1,3,5 (removes pages 1, 3, and 5)", + "bullet2": "Page ranges: 1-5,10-15 (removes pages 1-5 and 10-15)", + "bullet3": "Mathematical: 2n+1 (removes odd pages)", + "bullet4": "Open ranges: 5- (removes from page 5 to end)" + }, + "examples": { + "title": "Common Examples", + "text": "Here are some common page selection patterns:", + "bullet1": "Remove first page: 1", + "bullet2": "Remove last 3 pages: -3", + "bullet3": "Remove every other page: 2n", + "bullet4": "Remove specific scattered pages: 1,5,10,15" + }, + "safety": { + "title": "Safety Tips", + "text": "Important considerations when removing pages:", + "bullet1": "Always preview your selection before processing", + "bullet2": "Keep a backup of your original file", + "bullet3": "Page numbers start from 1, not 0", + "bullet4": "Invalid page numbers will be ignored" + } + }, + "error": { + "failed": "An error occurred whilst removing pages." + }, + "results": { + "title": "Page Removal Results" + }, + "submit": "Remove Pages" + }, + "extractPages": { + "title": "Extract Pages", + "pageNumbers": { + "label": "Pages to Extract", + "placeholder": "e.g., 1,3,5-8 or odd & 1-10" + }, + "settings": { + "title": "Settings" + }, + "tooltip": { + "description": "Extracts the selected pages into a new PDF, preserving order." + }, + "error": { + "failed": "Failed to extract pages" + }, + "results": { + "title": "Pages Extracted" + }, + "submit": "Extract Pages" + }, + "pageSelection": { + "tooltip": { + "header": { + "title": "Page Selection Guide" + }, + "basic": { + "title": "Basic Usage", + "text": "Select specific pages from your PDF document using simple syntax.", + "bullet1": "Individual pages: 1,3,5", + "bullet2": "Page ranges: 3-6 or 10-15", + "bullet3": "All pages: all" + }, + "advanced": { + "title": "Advanced Features" + }, + "tips": { + "title": "Tips", + "text": "Keep these guidelines in mind:", + "bullet1": "Page numbers start from 1 (not 0)", + "bullet2": "Spaces are automatically removed", + "bullet3": "Invalid expressions are ignored" + }, + "syntax": { + "title": "Syntax Basics", + "text": "Use numbers, ranges, keywords, and progressions (n starts at 0). Parentheses are supported.", + "bullets": { + "numbers": "Numbers/ranges: 5, 10-20", + "keywords": "Keywords: odd, even", + "progressions": "Progressions: 3n, 4n+1" + } + }, + "operators": { + "title": "Operators", + "text": "AND has higher precedence than comma. NOT applies within the document range.", + "and": "AND: & or \"and\" — require both conditions (e.g., 1-50 & even)", + "comma": "Comma: , or | — combine selections (e.g., 1-10, 20)", + "not": "NOT: ! or \"not\" — exclude pages (e.g., 3n & not 30)" + }, + "examples": { + "title": "Examples" + }, + "complex": { + "bullet1": "1,3-5,8,2n → pages 1, 3–5, 8, plus evens", + "bullet2": "10-,2n-1 → from page 10 to end + odd pages", + "description": "Mix different types.", + "title": "Complex Combinations" + }, + "description": "Choose which pages to use for the operation. Supports single pages, ranges, formulas, and the all keyword.", + "individual": { + "bullet1": "1,3,5 → selects pages 1, 3, 5", + "bullet2": "2,7,12 → selects pages 2, 7, 12", + "description": "Enter numbers separated by commas.", + "title": "Individual Pages" + }, + "mathematical": { + "bullet1": "2n → all even pages (2, 4, 6â€Ļ)", + "bullet2": "2n-1 → all odd pages (1, 3, 5â€Ļ)", + "bullet3": "3n → every 3rd page (3, 6, 9â€Ļ)", + "bullet4": "4n-1 → pages 3, 7, 11, 15â€Ļ", + "description": "Use n in formulas for patterns.", + "title": "Mathematical Functions" + }, + "ranges": { + "bullet1": "3-6 → selects pages 3–6", + "bullet2": "10-15 → selects pages 10–15", + "bullet3": "5- → selects pages 5 to end", + "description": "Use - for consecutive pages.", + "title": "Page Ranges" + }, + "special": { + "bullet1": "all → selects all pages", + "title": "Special Keywords" + } + } + }, + "bulkSelection": { + "syntaxError": "There is a syntax issue. See Page Selection tips for help.", + "header": { + "title": "Page Selection Guide" + }, + "syntax": { + "title": "Syntax Basics", + "text": "Use numbers, ranges, keywords, and progressions (n starts at 0). Parentheses are supported.", + "bullets": { + "numbers": "Numbers/ranges: 5, 10-20", + "keywords": "Keywords: odd, even", + "progressions": "Progressions: 3n, 4n+1" + } + }, + "operators": { + "title": "Operators", + "text": "AND has higher precedence than comma. NOT applies within the document range.", + "and": "AND: & or \"and\" — require both conditions (e.g., 1-50 & even)", + "comma": "Comma: , or | — combine selections (e.g., 1-10, 20)", + "not": "NOT: ! or \"not\" — exclude pages (e.g., 3n & not 30)" + }, + "examples": { + "title": "Examples", + "first50": "First 50", + "last50": "Last 50", + "every3rd": "Every 3rd", + "oddWithinExcluding": "Odd within 1-20 excluding 5-7", + "combineSets": "Combine sets" + }, + "firstNPages": { + "title": "First N Pages", + "placeholder": "Number of pages" + }, + "lastNPages": { + "title": "Last N Pages", + "placeholder": "Number of pages" + }, + "everyNthPage": { + "title": "Every Nth Page", + "placeholder": "Step size" + }, + "range": { + "title": "Range", + "fromPlaceholder": "From", + "toPlaceholder": "To" + }, + "keywords": { + "title": "Keywords" + }, + "advanced": { + "title": "Advanced" + } }, "compressPdfs": { "tags": "ⴚāĩā´°āĩā´•āĩā´•āĩā´•,ⴚāĩ†ā´ąāĩā´¤āĩ,ā´ĩā´ŗā´°āĩ† ⴚāĩ†ā´ąāĩā´¤āĩ" @@ -777,12 +1719,142 @@ "tags": "ā´¨āĩ€ā´•āĩā´•ā´‚ ⴚāĩ†ā´¯āĩā´¯āĩā´•,ⴇⴞāĩā´˛ā´žā´¤ā´žā´•āĩā´•āĩā´•,ā´Ģāĩ‹ā´‚,ā´Ģāĩ€āĩŊā´Ąāĩ,ā´ąāĩ€ā´Ąāĩ-ā´’āĩēā´˛ā´ŋ", "title": "ā´Ģāĩ‹ā´‚ ā´Ģāĩ€āĩŊā´Ąāĩā´•ā´ŗā´ŋāĩŊ ā´¨ā´ŋā´¨āĩā´¨āĩ ā´ąāĩ€ā´Ąāĩ-ā´’āĩēā´˛ā´ŋ ā´¨āĩ€ā´•āĩā´•ā´‚ ⴚāĩ†ā´¯āĩā´¯āĩā´•", "header": "PDF ā´Ģāĩ‹ā´Žāĩā´•āĩž ā´…āĩēā´˛āĩ‹ā´•āĩā´•āĩ ⴚāĩ†ā´¯āĩā´¯āĩā´•", - "submit": "ā´¨āĩ€ā´•āĩā´•ā´‚ ⴚāĩ†ā´¯āĩā´¯āĩā´•" + "submit": "ā´¨āĩ€ā´•āĩā´•ā´‚ ⴚāĩ†ā´¯āĩā´¯āĩā´•", + "description": "This tool will remove read-only restrictions from PDF form fields, making them editable and fillable.", + "filenamePrefix": "unlocked_forms", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst unlocking PDF forms." + }, + "results": { + "title": "Unlocked Forms Results" + } }, "changeMetadata": { - "tags": "ⴤⴞⴕāĩā´•āĩ†ā´Ÿāĩā´Ÿāĩ,ⴰⴚⴝā´ŋā´¤ā´žā´ĩāĩ,ā´¤āĩ€ā´¯ā´¤ā´ŋ,ā´¸āĩƒā´ˇāĩā´Ÿā´ŋ,ā´¸ā´Žā´¯ā´‚,ā´Ēāĩā´°ā´¸ā´žā´§ā´•āĩģ,ā´¨ā´ŋāĩŧā´Žāĩā´Žā´žā´¤ā´žā´ĩāĩ,ā´¸āĩā´Ĩā´ŋā´¤ā´ŋā´ĩā´ŋā´ĩā´°ā´•āĩā´•ā´Ŗā´•āĩā´•āĩā´•āĩž", - "title": "ⴤⴞⴕāĩā´•āĩ†ā´Ÿāĩā´Ÿāĩ:", "header": "ā´Žāĩ†ā´ąāĩā´ąā´žā´Ąā´žā´ąāĩā´ą ā´Žā´žā´ąāĩā´ąāĩā´•", + "submit": "ā´Žā´žā´ąāĩā´ąāĩā´•", + "filenamePrefix": "metadata", + "settings": { + "title": "Metadata Settings" + }, + "standardFields": { + "title": "Standard Fields" + }, + "deleteAll": { + "label": "Remove Existing Metadata", + "checkbox": "Delete all metadata" + }, + "title": { + "label": "Title", + "placeholder": "Document title" + }, + "author": { + "label": "Author", + "placeholder": "Document author" + }, + "subject": { + "label": "Subject", + "placeholder": "Document subject" + }, + "keywords": { + "label": "Keywords", + "placeholder": "Document keywords" + }, + "creator": { + "label": "Creator", + "placeholder": "Document creator" + }, + "producer": { + "label": "Producer", + "placeholder": "Document producer" + }, + "dates": { + "title": "Date Fields" + }, + "creationDate": { + "label": "Creation Date", + "placeholder": "Creation date" + }, + "modificationDate": { + "label": "Modification Date", + "placeholder": "Modification date" + }, + "trapped": { + "label": "Trapped Status", + "unknown": "Unknown", + "true": "True", + "false": "False" + }, + "advanced": { + "title": "Advanced Options" + }, + "customFields": { + "title": "Custom Metadata", + "description": "Add custom metadata fields to the document", + "add": "Add Field", + "key": "Key", + "keyPlaceholder": "Custom key", + "value": "Value", + "valuePlaceholder": "Custom value", + "remove": "Remove" + }, + "results": { + "title": "Updated PDFs" + }, + "error": { + "failed": "An error occurred while changing the PDF metadata." + }, + "tooltip": { + "header": { + "title": "PDF Metadata Overview" + }, + "standardFields": { + "title": "Standard Fields", + "text": "Common PDF metadata fields that describe the document.", + "bullet1": "Title: Document name or heading", + "bullet2": "Author: Person who created the document", + "bullet3": "Subject: Brief description of content", + "bullet4": "Keywords: Search terms for the document", + "bullet5": "Creator/Producer: Software used to create the PDF" + }, + "dates": { + "title": "Date Fields", + "text": "When the document was created and modified.", + "bullet1": "Creation Date: When original document was made", + "bullet2": "Modification Date: When last changed" + }, + "options": { + "title": "Additional Options", + "text": "Custom fields and privacy controls.", + "bullet1": "Custom Metadata: Add your own key-value pairs", + "bullet2": "Trapped Status: High-quality printing setting", + "bullet3": "Delete All: Remove all metadata for privacy" + }, + "deleteAll": { + "title": "Remove Existing Metadata", + "text": "Complete metadata deletion to ensure privacy." + }, + "customFields": { + "title": "Custom Metadata", + "text": "Add your own custom key-value metadata pairs.", + "bullet1": "Add any custom fields relevant to your document", + "bullet2": "Examples: Department, Project, Version, Status", + "bullet3": "Both key and value are required for each entry" + }, + "advanced": { + "title": "Advanced Options", + "trapped": { + "title": "Trapped Status", + "description": "Indicates if document is prepared for high-quality printing.", + "bullet1": "True: Document has been trapped for printing", + "bullet2": "False: Document has not been trapped", + "bullet3": "Unknown: Trapped status is not specified" + } + } + }, + "tags": "ⴤⴞⴕāĩā´•āĩ†ā´Ÿāĩā´Ÿāĩ,ⴰⴚⴝā´ŋā´¤ā´žā´ĩāĩ,ā´¤āĩ€ā´¯ā´¤ā´ŋ,ā´¸āĩƒā´ˇāĩā´Ÿā´ŋ,ā´¸ā´Žā´¯ā´‚,ā´Ēāĩā´°ā´¸ā´žā´§ā´•āĩģ,ā´¨ā´ŋāĩŧā´Žāĩā´Žā´žā´¤ā´žā´ĩāĩ,ā´¸āĩā´Ĩā´ŋā´¤ā´ŋā´ĩā´ŋā´ĩā´°ā´•āĩā´•ā´Ŗā´•āĩā´•āĩā´•āĩž", "selectText": { "1": "ā´Ļā´¯ā´ĩā´žā´¯ā´ŋ ā´¨ā´ŋā´™āĩā´™āĩž ā´Žā´žā´ąāĩā´ąā´žāĩģ ⴆⴗāĩā´°ā´šā´ŋā´•āĩā´•āĩā´¨āĩā´¨ ā´ĩāĩ‡ā´°ā´ŋā´¯ā´Ŧā´ŋā´ŗāĩā´•āĩž ā´¤ā´ŋā´°āĩā´¤āĩā´¤āĩā´•", "2": "ā´Žā´˛āĩā´˛ā´ž ā´Žāĩ†ā´ąāĩā´ąā´žā´Ąā´žā´ąāĩā´ąā´¯āĩā´‚ ⴇⴞāĩā´˛ā´žā´¤ā´žā´•āĩā´•āĩā´•", @@ -790,15 +1862,7 @@ "4": "ā´Žā´ąāĩā´ąāĩ ā´Žāĩ†ā´ąāĩā´ąā´žā´Ąā´žā´ąāĩā´ą:", "5": "ⴇⴎāĩā´Ÿā´žā´¨āĩā´¸āĩƒā´¤ ā´Žāĩ†ā´ąāĩā´ąā´žā´Ąā´žā´ąāĩā´ą ā´Žāĩģⴟāĩā´°ā´ŋ ⴚāĩ‡āĩŧā´•āĩā´•āĩā´•" }, - "author": "ⴰⴚⴝā´ŋā´¤ā´žā´ĩāĩ:", - "creationDate": "ā´¸āĩƒā´ˇāĩā´Ÿā´ŋⴚāĩā´š ā´¤āĩ€ā´¯ā´¤ā´ŋ (yyyy/MM/dd HH:mm:ss):", - "creator": "ā´¸āĩā´°ā´ˇāĩā´Ÿā´žā´ĩāĩ:", - "keywords": "ā´•āĩ€ā´ĩāĩ‡ā´Ąāĩā´•āĩž:", - "modDate": "ā´Ēā´°ā´ŋā´ˇāĩā´•āĩā´•ā´°ā´ŋⴚāĩā´š ā´¤āĩ€ā´¯ā´¤ā´ŋ (yyyy/MM/dd HH:mm:ss):", - "producer": "ā´¨ā´ŋāĩŧā´Žāĩā´Žā´žā´¤ā´žā´ĩāĩ:", - "subject": "ā´ĩā´ŋⴎⴝⴂ:", - "trapped": "ⴟāĩā´°ā´žā´Ēāĩā´Ēāĩā´Ąāĩ:", - "submit": "ā´Žā´žā´ąāĩā´ąāĩā´•" + "modDate": "ā´Ēā´°ā´ŋā´ˇāĩā´•āĩā´•ā´°ā´ŋⴚāĩā´š ā´¤āĩ€ā´¯ā´¤ā´ŋ (yyyy/MM/dd HH:mm:ss):" }, "fileToPDF": { "tags": "ā´°āĩ‚ā´Ēā´žā´¨āĩā´¤ā´°ā´‚,ā´Ģāĩ‹āĩŧā´Žā´žā´ąāĩā´ąāĩ,ā´Ēāĩā´°ā´Žā´žā´Ŗā´‚,ⴚā´ŋā´¤āĩā´°ā´‚,ā´¸āĩā´˛āĩˆā´Ąāĩ,ⴟāĩ†ā´•āĩā´¸āĩā´ąāĩā´ąāĩ,ā´Ēā´°ā´ŋā´ĩāĩŧā´¤āĩā´¤ā´¨ā´‚,ā´“ā´Ģāĩ€ā´¸āĩ,ā´Ąāĩ‹ā´•āĩā´¸āĩ,ā´ĩāĩ‡ā´Ąāĩ,ā´Žā´•āĩā´¸āĩŊ,ā´Ēā´ĩāĩŧā´Ēāĩ‹ā´¯ā´ŋā´¨āĩā´ąāĩ", @@ -812,6 +1876,7 @@ "ocr": { "tags": "ā´¤ā´ŋā´°ā´ŋⴚāĩā´šā´ąā´ŋā´¯āĩŊ,ⴟāĩ†ā´•āĩā´¸āĩā´ąāĩā´ąāĩ,ⴚā´ŋā´¤āĩā´°ā´‚,ā´¸āĩā´•ā´žāĩģ,ā´ĩā´žā´¯ā´ŋā´•āĩā´•āĩā´•,ā´¤ā´ŋā´°ā´ŋⴚāĩā´šā´ąā´ŋā´¯āĩā´•,ā´•ā´Ŗāĩā´Ÿāĩ†ā´¤āĩā´¤āĩŊ,ā´¤ā´ŋā´°āĩā´¤āĩā´¤ā´žā´ĩāĩā´¨āĩā´¨ā´¤āĩ", "title": "OCR / ā´¸āĩā´•ā´žāĩģ ā´ĩāĩƒā´¤āĩā´¤ā´ŋā´¯ā´žā´•āĩā´•āĩŊ", + "desc": "Cleanup scans and detects text from images within a PDF and re-adds it as text.", "header": "ā´¸āĩā´•ā´žā´¨āĩā´•āĩž ā´ĩāĩƒā´¤āĩā´¤ā´ŋā´¯ā´žā´•āĩā´•āĩā´• / OCR (ā´’ā´Ēāĩā´ąāĩā´ąā´ŋā´•āĩā´•āĩŊ ā´•āĩā´¯ā´žā´°ā´•āĩā´Ÿāĩŧ ā´ąāĩ†ā´•āĩā´•ā´—āĩā´¨ā´ŋā´ˇāĩģ)", "selectText": { "1": "PDF-ā´¨āĩā´ŗāĩā´ŗā´ŋāĩŊ ā´•ā´Ŗāĩā´Ÿāĩ†ā´¤āĩā´¤āĩ‡ā´Ŗāĩā´Ÿ ā´­ā´žā´ˇā´•āĩž ā´¤ā´ŋā´°ā´žāĩā´žāĩ†ā´Ÿāĩā´•āĩā´•āĩā´• (ā´˛ā´ŋā´¸āĩā´ąāĩā´ąāĩ ⴚāĩ†ā´¯āĩā´¤ā´ŋⴟāĩā´Ÿāĩā´ŗāĩā´ŗā´ĩ ā´¨ā´ŋā´˛ā´ĩā´ŋāĩŊ ā´•ā´Ŗāĩā´Ÿāĩ†ā´¤āĩā´¤ā´ŋā´¯ā´ĩā´¯ā´žā´Ŗāĩ):", @@ -829,7 +1894,91 @@ }, "help": "ā´Žā´ąāĩā´ąāĩ ā´­ā´žā´ˇā´•āĩžā´•āĩā´•ā´žā´¯ā´ŋ ⴇⴤāĩ ā´Žā´™āĩā´™ā´¨āĩ† ā´‰ā´Ēā´¯āĩ‹ā´—ā´ŋā´•āĩā´•ā´žā´Žāĩ†ā´¨āĩā´¨āĩā´‚ ā´•āĩ‚ā´Ÿā´žā´¤āĩ†/ā´…ā´˛āĩā´˛āĩ†ā´™āĩā´•ā´ŋāĩŊ ā´Ąāĩ‹ā´•āĩā´•ā´ąā´ŋāĩŊ ā´‰ā´Ēā´¯āĩ‹ā´—ā´ŋā´•āĩā´•ā´žā´¤ā´ŋā´°ā´ŋā´•āĩā´•āĩā´¨āĩā´¨ā´¤ā´ŋā´¨āĩ†ā´•āĩā´•āĩā´ąā´ŋⴚāĩā´šāĩā´‚ ⴈ ā´Ąāĩ‹ā´•āĩā´¯āĩā´Žāĩ†ā´¨āĩā´ąāĩ‡ā´ˇāĩģ ā´ĩā´žā´¯ā´ŋā´•āĩā´•āĩā´•", "credit": "ⴈ ā´¸āĩ‡ā´ĩⴍⴂ OCR-ā´¨ā´žā´¯ā´ŋ qpdf, Tesseract ā´Žā´¨āĩā´¨ā´ŋā´ĩ ā´‰ā´Ēā´¯āĩ‹ā´—ā´ŋā´•āĩā´•āĩā´¨āĩā´¨āĩ.", - "submit": "OCR ā´‰ā´Ēā´¯āĩ‹ā´—ā´ŋⴚāĩā´šāĩ PDF ā´Ēāĩā´°āĩ‹ā´¸ā´¸āĩā´¸āĩ ⴚāĩ†ā´¯āĩā´¯āĩā´•" + "submit": "OCR ā´‰ā´Ēā´¯āĩ‹ā´—ā´ŋⴚāĩā´šāĩ PDF ā´Ēāĩā´°āĩ‹ā´¸ā´¸āĩā´¸āĩ ⴚāĩ†ā´¯āĩā´¯āĩā´•", + "operation": { + "submit": "Process OCR and Review" + }, + "results": { + "title": "OCR Results" + }, + "languagePicker": { + "additionalLanguages": "Looking for additional languages?", + "viewSetupGuide": "View setup guide →" + }, + "settings": { + "title": "Settings", + "ocrMode": { + "label": "OCR Mode", + "auto": "Auto (skip text layers)", + "force": "Force (re-OCR all, replace text)", + "strict": "Strict (abort if text found)" + }, + "languages": { + "label": "Languages", + "placeholder": "Select languages" + }, + "compatibilityMode": { + "label": "Compatibility Mode" + }, + "advancedOptions": { + "label": "Processing Options", + "sidecar": "Create a text file", + "deskew": "Deskew pages", + "clean": "Clean input file", + "cleanFinal": "Clean final output" + } + }, + "tooltip": { + "header": { + "title": "OCR Settings Overview" + }, + "mode": { + "title": "OCR Mode", + "text": "Optical Character Recognition (OCR) helps you turn scanned or screenshotted pages into text you can search, copy, or highlight.", + "bullet1": "Auto skips pages that already contain text layers.", + "bullet2": "Force re-OCRs every page and replaces all the text.", + "bullet3": "Strict halts if any selectable text is found." + }, + "languages": { + "title": "Languages", + "text": "Improve OCR accuracy by specifying the expected languages. Choose one or more languages to guide detection." + }, + "output": { + "title": "Output", + "text": "Decide how you want the text output formatted:", + "bullet1": "Searchable PDF embeds text behind the original image.", + "bullet2": "HOCR XML returns a structured machine-readable file.", + "bullet3": "Plain-text sidecar creates a separate .txt file with raw content." + }, + "advanced": { + "header": { + "title": "Advanced OCR Processing" + }, + "compatibility": { + "title": "Compatibility Mode", + "text": "Uses OCR 'sandwich PDF' mode: results in larger files, but more reliable with certain languages and older PDF software. By default we use hOCR for smaller, modern PDFs." + }, + "sidecar": { + "title": "Create Text File", + "text": "Generates a separate .txt file alongside the PDF containing all extracted text content for easy access and processing." + }, + "deskew": { + "title": "Deskew Pages", + "text": "Automatically corrects skewed or tilted pages to improve OCR accuracy. Useful for scanned documents that weren't perfectly aligned." + }, + "clean": { + "title": "Clean Input File", + "text": "Preprocesses the input by removing noise, enhancing contrast, and optimising the image for better OCR recognition before processing." + }, + "cleanFinal": { + "title": "Clean Final Output", + "text": "Post-processes the final PDF by removing OCR artefacts and optimising the text layer for better readability and smaller file size." + } + } + }, + "error": { + "failed": "OCR operation failed" + } }, "extractImages": { "tags": "ⴚā´ŋā´¤āĩā´°ā´‚,ā´Ģāĩ‹ā´Ÿāĩā´Ÿāĩ‹,ⴏⴂⴰⴕāĩā´ˇā´ŋā´•āĩā´•āĩā´•,ā´†āĩŧā´•āĩā´•āĩˆā´ĩāĩ,ā´¸ā´ŋā´Ēāĩā´Ēāĩ,ā´Ēā´ŋⴟā´ŋⴚāĩā´šāĩ†ā´Ÿāĩā´•āĩā´•āĩā´•,ā´¨āĩ‡ā´Ÿāĩā´•", @@ -837,7 +1986,13 @@ "header": "ⴚā´ŋā´¤āĩā´°ā´™āĩā´™āĩž ā´ĩāĩ‡āĩŧā´¤ā´ŋā´°ā´ŋⴚāĩā´šāĩ†ā´Ÿāĩā´•āĩā´•āĩā´•", "selectText": "ā´ĩāĩ‡āĩŧā´¤ā´ŋā´°ā´ŋⴚāĩā´šāĩ†ā´Ÿāĩā´¤āĩā´¤ ⴚā´ŋā´¤āĩā´°ā´™āĩā´™āĩž ā´Ēā´°ā´ŋā´ĩāĩŧā´¤āĩā´¤ā´¨ā´‚ ⴚāĩ†ā´¯āĩā´¯āĩ‡ā´Ŗāĩā´Ÿ ā´‡ā´Žāĩ‡ā´œāĩ ā´Ģāĩ‹āĩŧā´Žā´žā´ąāĩā´ąāĩ ā´¤ā´ŋā´°ā´žāĩā´žāĩ†ā´Ÿāĩā´•āĩā´•āĩā´•", "allowDuplicates": "ⴤⴍā´ŋā´Ēāĩā´Ēā´•āĩŧā´Ēāĩā´Ēāĩ ⴚā´ŋā´¤āĩā´°ā´™āĩā´™āĩž ⴏⴂⴰⴕāĩā´ˇā´ŋā´•āĩā´•āĩā´•", - "submit": "ā´ĩāĩ‡āĩŧā´¤ā´ŋā´°ā´ŋⴚāĩā´šāĩ†ā´Ÿāĩā´•āĩā´•āĩā´•" + "submit": "ā´ĩāĩ‡āĩŧā´¤ā´ŋā´°ā´ŋⴚāĩā´šāĩ†ā´Ÿāĩā´•āĩā´•āĩā´•", + "settings": { + "title": "Settings" + }, + "error": { + "failed": "An error occurred while extracting images from the PDF." + } }, "pdfToPDFA": { "tags": "ā´†āĩŧā´•āĩā´•āĩˆā´ĩāĩ,ā´Ļāĩ€āĩŧā´˜ā´•ā´žā´˛,ā´Žā´žā´¨ā´Ļā´Ŗāĩā´Ąā´‚,ā´Ēā´°ā´ŋā´ĩāĩŧā´¤āĩā´¤ā´¨ā´‚,ⴏⴂⴭⴰ⴪ⴂ,ⴏⴂⴰⴕāĩā´ˇā´Ŗā´‚", @@ -909,17 +2064,53 @@ }, "info": "ā´Ēāĩˆā´¤āĩā´¤āĩē ā´‡āĩģā´¸āĩā´ąāĩā´ąā´žāĩž ⴚāĩ†ā´¯āĩā´¤ā´ŋⴟāĩā´Ÿā´ŋā´˛āĩā´˛. ⴇⴤāĩ ā´Ēāĩā´°ā´ĩāĩŧā´¤āĩā´¤ā´ŋā´Ēāĩā´Ēā´ŋā´•āĩā´•ā´žāĩģ ā´†ā´ĩā´ļāĩā´¯ā´Žā´žā´Ŗāĩ." }, + "scannerImageSplit": { + "title": "Extracted Images", + "submit": "Extract Image Scans", + "error": { + "failed": "An error occurred while extracting image scans." + }, + "tooltip": { + "title": "Photo Splitter", + "whatThisDoes": "What this does", + "whatThisDoesDesc": "Automatically finds and extracts each photo from a scanned page or composite image—no manual cropping.", + "whenToUse": "When to use", + "useCase1": "Scan whole album pages in one go", + "useCase2": "Split flatbed batches into separate files", + "useCase3": "Break collages into individual photos", + "useCase4": "Pull photos from documents", + "quickFixes": "Quick fixes", + "problem1": "Photos not detected → increase Tolerance to 30-50", + "problem2": "Too many false detections → increase Minimum Area to 15,000-20,000", + "problem3": "Crops are too tight → increase Border Size to 5-10", + "problem4": "Tilted photos not straightened → lower Angle Threshold to ~5°", + "problem5": "Dust/noise boxes → increase Minimum Contour Area to 1000-2000", + "setupTips": "Setup tips", + "tip1": "Use a plain, light background", + "tip2": "Leave a small gap (≈1 cm) between photos", + "tip3": "Scan at 300-600 DPI", + "tip4": "Clean the scanner glass", + "headsUp": "Heads-up", + "headsUpDesc": "Overlapping photos or backgrounds very close in colour to the photos can reduce accuracy-try a lighter or darker background and leave more space." + } + }, "sign": { - "tags": "ā´…ā´‚ā´—āĩ€ā´•ā´°ā´ŋā´•āĩā´•āĩā´•,ā´†ā´Ļāĩā´¯ā´žā´•āĩā´ˇā´°ā´™āĩā´™āĩž,ā´ĩⴰⴚāĩā´š-ā´’ā´Ēāĩā´Ēāĩ,ⴟāĩ†ā´•āĩā´¸āĩā´ąāĩā´ąāĩ-ā´’ā´Ēāĩā´Ēāĩ,ⴚā´ŋā´¤āĩā´°-ā´’ā´Ēāĩā´Ēāĩ", "title": "ā´’ā´Ēāĩā´Ēā´ŋⴟāĩā´•", "header": "PDF-ā´•āĩž ā´’ā´Ēāĩā´Ēā´ŋⴟāĩā´•", "upload": "ⴚā´ŋā´¤āĩā´°ā´‚ ā´…ā´Ēāĩâ€Œā´˛āĩ‹ā´Ąāĩ ⴚāĩ†ā´¯āĩā´¯āĩā´•", - "draw": "ā´’ā´Ēāĩā´Ēāĩ ā´ĩā´°ā´¯āĩā´•āĩā´•āĩā´•", - "text": "ⴟāĩ†ā´•āĩā´¸āĩā´ąāĩā´ąāĩ ā´‡āĩģā´Ēāĩā´Ÿāĩā´Ÿāĩ", + "draw": { + "title": "Draw your signature", + "clear": "Clear" + }, + "text": { + "name": "Signer Name", + "placeholder": "Enter your full name" + }, "clear": "ā´Žā´žā´¯āĩā´•āĩā´•āĩā´•", "add": "ⴚāĩ‡āĩŧā´•āĩā´•āĩā´•", "saved": "ⴏⴂⴰⴕāĩā´ˇā´ŋⴚāĩā´š ā´’ā´Ēāĩā´Ēāĩā´•āĩž", "save": "ā´’ā´Ēāĩā´Ēāĩ ⴏⴂⴰⴕāĩā´ˇā´ŋā´•āĩā´•āĩā´•", + "applySignatures": "Apply Signatures", "personalSigs": "ā´ĩāĩā´¯ā´•āĩā´¤ā´ŋā´—ā´¤ ā´’ā´Ēāĩā´Ēāĩā´•āĩž", "sharedSigs": "ā´Ēā´™āĩā´•ā´ŋⴟāĩā´Ÿ ā´’ā´Ēāĩā´Ēāĩā´•āĩž", "noSavedSigs": "ⴏⴂⴰⴕāĩā´ˇā´ŋⴚāĩā´š ā´’ā´Ēāĩā´Ēāĩā´•ā´ŗāĩŠā´¨āĩā´¨āĩā´‚ ā´•ā´Ŗāĩā´Ÿāĩ†ā´¤āĩā´¤ā´ŋā´¯ā´ŋā´˛āĩā´˛", @@ -931,36 +2122,179 @@ "previous": "ā´Žāĩā´Žāĩā´Ēā´¤āĩā´¤āĩ† ā´Ēāĩ‡ā´œāĩ", "maintainRatio": "ā´ĩāĩ€ā´•āĩā´ˇā´Ŗā´žā´¨āĩā´Ēā´žā´¤ā´‚ ā´¨ā´ŋⴞⴍā´ŋāĩŧā´¤āĩā´¤āĩā´• ⴟāĩ‹ā´—ā´ŋāĩž ⴚāĩ†ā´¯āĩā´¯āĩā´•", "undo": "ā´Ēā´´ā´¯ā´Ēⴟā´ŋ ⴆⴕāĩā´•āĩā´•", - "redo": "ā´ĩāĩ€ā´Ŗāĩā´Ÿāĩā´‚ ⴚāĩ†ā´¯āĩā´¯āĩā´•" + "redo": "ā´ĩāĩ€ā´Ŗāĩā´Ÿāĩā´‚ ⴚāĩ†ā´¯āĩā´¯āĩā´•", + "submit": "Sign Document", + "steps": { + "configure": "Configure Signature" + }, + "type": { + "title": "Signature Type", + "draw": "Draw", + "canvas": "Canvas", + "image": "Image", + "text": "Text" + }, + "image": { + "label": "Upload signature image", + "placeholder": "Select image file", + "hint": "Upload a PNG or JPG image of your signature" + }, + "instructions": { + "title": "How to add signature", + "canvas": "After drawing your signature in the canvas, close the modal then click anywhere on the PDF to place it.", + "image": "After uploading your signature image above, click anywhere on the PDF to place it.", + "text": "After entering your name above, click anywhere on the PDF to place your signature." + }, + "mode": { + "move": "Move Signature", + "place": "Place Signature" + }, + "updateAndPlace": "Update and Place", + "activate": "Activate Signature Placement", + "deactivate": "Stop Placing Signatures", + "results": { + "title": "Signature Results" + }, + "error": { + "failed": "An error occurred while signing the PDF." + }, + "tags": "ā´…ā´‚ā´—āĩ€ā´•ā´°ā´ŋā´•āĩā´•āĩā´•,ā´†ā´Ļāĩā´¯ā´žā´•āĩā´ˇā´°ā´™āĩā´™āĩž,ā´ĩⴰⴚāĩā´š-ā´’ā´Ēāĩā´Ēāĩ,ⴟāĩ†ā´•āĩā´¸āĩā´ąāĩā´ąāĩ-ā´’ā´Ēāĩā´Ēāĩ,ⴚā´ŋā´¤āĩā´°-ā´’ā´Ēāĩā´Ēāĩ" }, "flatten": { - "tags": "ā´¸āĩā´Ĩā´ŋā´°ā´‚,ā´Ēāĩā´°ā´ĩāĩŧā´¤āĩā´¤ā´¨ā´°ā´šā´ŋā´¤ā´Žā´žā´•āĩā´•āĩā´•,ā´¨āĩ‹āĩē-ⴇⴍāĩā´ąā´ąā´žā´•āĩā´Ÿāĩ€ā´ĩāĩ,ⴞⴘāĩ‚ā´•ā´°ā´ŋā´•āĩā´•āĩā´•", "title": "ā´Ēā´°ā´¤āĩā´¤āĩā´•", "header": "PDF-ā´•āĩž ā´Ēā´°ā´¤āĩā´¤āĩā´•", "flattenOnlyForms": "ā´Ģāĩ‹ā´Žāĩā´•āĩž ā´Žā´žā´¤āĩā´°ā´‚ ā´Ēā´°ā´¤āĩā´¤āĩā´•", - "submit": "ā´Ēā´°ā´¤āĩā´¤āĩā´•" + "submit": "ā´Ēā´°ā´¤āĩā´¤āĩā´•", + "filenamePrefix": "flattened", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "steps": { + "settings": "Settings" + }, + "options": { + "stepTitle": "Flatten Options", + "title": "Flatten Options", + "flattenOnlyForms": { + "label": "Flatten only forms", + "desc": "Only flatten form fields, leaving other interactive elements intact" + }, + "note": "Flattening removes interactive elements from the PDF, making them non-editable." + }, + "results": { + "title": "Flatten Results" + }, + "error": { + "failed": "An error occurred while flattening the PDF." + }, + "tooltip": { + "header": { + "title": "About Flattening PDFs" + }, + "description": { + "title": "What does flattening do?", + "text": "Flattening makes your PDF non-editable by turning fillable forms and buttons into regular text and images. The PDF will look exactly the same, but no one can change or fill in the forms anymore. Perfect for sharing completed forms, creating final documents for records, or ensuring the PDF looks the same everywhere.", + "bullet1": "Text boxes become regular text (can't be edited)", + "bullet2": "Checkboxes and buttons become pictures", + "bullet3": "Great for final versions you don't want changed", + "bullet4": "Ensures consistent appearance across all devices" + }, + "formsOnly": { + "title": "What does 'Flatten only forms' mean?", + "text": "This option only removes the ability to fill in forms, but keeps other features working like clicking links, viewing bookmarks, and reading comments.", + "bullet1": "Forms become non-editable", + "bullet2": "Links still work when clicked", + "bullet3": "Comments and notes remain visible", + "bullet4": "Bookmarks still help you navigate" + } + }, + "tags": "ā´¸āĩā´Ĩā´ŋā´°ā´‚,ā´Ēāĩā´°ā´ĩāĩŧā´¤āĩā´¤ā´¨ā´°ā´šā´ŋā´¤ā´Žā´žā´•āĩā´•āĩā´•,ā´¨āĩ‹āĩē-ⴇⴍāĩā´ąā´ąā´žā´•āĩā´Ÿāĩ€ā´ĩāĩ,ⴞⴘāĩ‚ā´•ā´°ā´ŋā´•āĩā´•āĩā´•" }, "repair": { "tags": "ā´Ēā´°ā´ŋā´šā´°ā´ŋā´•āĩā´•āĩā´•,ā´Ēāĩā´¨ā´ƒā´¸āĩā´Ĩā´žā´Ēā´ŋā´•āĩā´•āĩā´•,ā´¤ā´ŋā´°āĩā´¤āĩā´¤āĩŊ,ā´ĩāĩ€ā´Ŗāĩā´Ÿāĩ†ā´Ÿāĩā´•āĩā´•āĩā´•", "title": "ⴍⴍāĩā´¨ā´žā´•āĩā´•āĩā´•", "header": "PDF-ā´•āĩž ⴍⴍāĩā´¨ā´žā´•āĩā´•āĩā´•", - "submit": "ⴍⴍāĩā´¨ā´žā´•āĩā´•āĩā´•" + "submit": "ⴍⴍāĩā´¨ā´žā´•āĩā´•āĩā´•", + "description": "This tool will attempt to repair corrupted or damaged PDF files. No additional settings are required.", + "filenamePrefix": "repaired", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst repairing the PDF." + }, + "results": { + "title": "Repair Results" + } }, "removeBlanks": { - "tags": "ā´ĩāĩƒā´¤āĩā´¤ā´ŋā´¯ā´žā´•āĩā´•āĩŊ,ⴞⴘāĩ‚ā´•ā´°ā´ŋā´•āĩā´•āĩā´•,ⴉⴺāĩā´ŗā´Ÿā´•āĩā´•ā´Žā´ŋā´˛āĩā´˛ā´žā´¤āĩā´¤,ā´•āĩā´°ā´Žāĩ€ā´•ā´°ā´ŋā´•āĩā´•āĩā´•", "title": "ā´ļāĩ‚ā´¨āĩā´¯ā´Žā´žā´¯ā´ĩ ā´¨āĩ€ā´•āĩā´•ā´‚ ⴚāĩ†ā´¯āĩā´¯āĩā´•", "header": "ā´ļāĩ‚ā´¨āĩā´¯ā´Žā´žā´¯ ā´Ēāĩ‡ā´œāĩā´•āĩž ā´¨āĩ€ā´•āĩā´•ā´‚ ⴚāĩ†ā´¯āĩā´¯āĩā´•", - "threshold": "ā´Ēā´ŋā´•āĩā´¸āĩŊ ā´ĩāĩ†ā´ŗāĩā´Ēāĩā´Ēāĩ ā´Ēā´°ā´ŋā´§ā´ŋ:", + "settings": { + "title": "Settings" + }, + "threshold": { + "label": "Pixel Whiteness Threshold" + }, + "whitePercent": { + "label": "White Percentage Threshold", + "unit": "%" + }, + "includeBlankPages": { + "label": "Include detected blank pages" + }, + "tooltip": { + "header": { + "title": "Remove Blank Pages Settings" + }, + "threshold": { + "title": "Pixel Whiteness Threshold", + "text": "Controls how white a pixel must be to be considered 'white'. This helps determine what counts as a blank area on the page.", + "bullet1": "0 = Pure black (most restrictive)", + "bullet2": "128 = Medium grey", + "bullet3": "255 = Pure white (least restrictive)" + }, + "whitePercent": { + "title": "White Percentage Threshold", + "text": "Sets the minimum percentage of white pixels required for a page to be considered blank and removed.", + "bullet1": "Lower values (e.g., 80%) = More pages removed", + "bullet2": "Higher values (e.g., 95%) = Only very blank pages removed", + "bullet3": "Use higher values for documents with light backgrounds" + }, + "includeBlankPages": { + "title": "Include Detected Blank Pages", + "text": "When enabled, creates a separate PDF containing all the blank pages that were detected and removed from the original document.", + "bullet1": "Useful for reviewing what was removed", + "bullet2": "Helps verify the detection accuracy", + "bullet3": "Can be disabled to reduce output file size" + } + }, + "submit": "ā´ļāĩ‚ā´¨āĩā´¯ā´Žā´žā´¯ā´ĩ ā´¨āĩ€ā´•āĩā´•ā´‚ ⴚāĩ†ā´¯āĩā´¯āĩā´•", + "error": { + "failed": "Failed to remove blank pages" + }, + "results": { + "title": "Removed Blank Pages" + }, + "tags": "ā´ĩāĩƒā´¤āĩā´¤ā´ŋā´¯ā´žā´•āĩā´•āĩŊ,ⴞⴘāĩ‚ā´•ā´°ā´ŋā´•āĩā´•āĩā´•,ⴉⴺāĩā´ŗā´Ÿā´•āĩā´•ā´Žā´ŋā´˛āĩā´˛ā´žā´¤āĩā´¤,ā´•āĩā´°ā´Žāĩ€ā´•ā´°ā´ŋā´•āĩā´•āĩā´•", "thresholdDesc": "'ā´ĩāĩ†ā´ŗāĩā´ŗ' ā´Žā´¨āĩā´¨āĩ ⴤⴰⴂⴤā´ŋā´°ā´ŋā´•āĩā´•ā´žāĩģ ā´’ā´°āĩ ā´ĩāĩ†ā´ŗāĩā´¤āĩā´¤ ā´Ēā´ŋā´•āĩā´¸āĩŊ ā´Žā´¤āĩā´° ā´ĩāĩ†ā´ŗāĩā´¤āĩā´¤ā´¤ā´žā´¯ā´ŋā´°ā´ŋā´•āĩā´•ā´Ŗā´‚ ā´Žā´¨āĩā´¨āĩ ā´¨ā´ŋāĩŧā´Ŗāĩā´Ŗā´¯ā´ŋā´•āĩā´•āĩā´¨āĩā´¨ā´¤ā´ŋā´¨āĩā´ŗāĩā´ŗ ā´Ēā´°ā´ŋā´§ā´ŋ. 0 = ā´•ā´ąāĩā´Ēāĩā´Ēāĩ, 255 ā´ļāĩā´Ļāĩā´§ā´Žā´žā´¯ ā´ĩāĩ†ā´ŗāĩā´Ēāĩā´Ēāĩ.", - "whitePercent": "ā´ĩāĩ†ā´ŗāĩā´Ēāĩā´Ēāĩ ā´ļā´¤ā´Žā´žā´¨ā´‚ (%):", - "whitePercentDesc": "ā´¨āĩ€ā´•āĩā´•ā´‚ ⴚāĩ†ā´¯āĩā´¯āĩ‡ā´Ŗāĩā´Ÿ 'ā´ĩāĩ†ā´ŗāĩā´¤āĩā´¤' ā´Ēā´ŋā´•āĩā´¸ā´˛āĩā´•āĩž ā´…ā´Ÿā´™āĩā´™ā´ŋā´¯ ā´Ēāĩ‡ā´œā´ŋā´¨āĩā´ąāĩ† ā´ļā´¤ā´Žā´žā´¨ā´‚", - "submit": "ā´ļāĩ‚ā´¨āĩā´¯ā´Žā´žā´¯ā´ĩ ā´¨āĩ€ā´•āĩā´•ā´‚ ⴚāĩ†ā´¯āĩā´¯āĩā´•" + "whitePercentDesc": "ā´¨āĩ€ā´•āĩā´•ā´‚ ⴚāĩ†ā´¯āĩā´¯āĩ‡ā´Ŗāĩā´Ÿ 'ā´ĩāĩ†ā´ŗāĩā´¤āĩā´¤' ā´Ēā´ŋā´•āĩā´¸ā´˛āĩā´•āĩž ā´…ā´Ÿā´™āĩā´™ā´ŋā´¯ ā´Ēāĩ‡ā´œā´ŋā´¨āĩā´ąāĩ† ā´ļā´¤ā´Žā´žā´¨ā´‚" }, "removeAnnotations": { "tags": "ā´…ā´­ā´ŋā´Ēāĩā´°ā´žā´¯ā´™āĩā´™āĩž,ā´šāĩˆā´˛āĩˆā´ąāĩā´ąāĩ,ā´•āĩā´ąā´ŋā´Ēāĩā´Ēāĩā´•āĩž,ā´Žā´žāĩŧā´•āĩā´•āĩā´…ā´Ēāĩā´Ēāĩ,ā´¨āĩ€ā´•āĩā´•ā´‚ ⴚāĩ†ā´¯āĩā´¯āĩā´•", "title": "ā´ĩāĩā´¯ā´žā´–āĩā´¯ā´žā´¨ā´™āĩā´™āĩž ā´¨āĩ€ā´•āĩā´•ā´‚ ⴚāĩ†ā´¯āĩā´¯āĩā´•", "header": "ā´ĩāĩā´¯ā´žā´–āĩā´¯ā´žā´¨ā´™āĩā´™āĩž ā´¨āĩ€ā´•āĩā´•ā´‚ ⴚāĩ†ā´¯āĩā´¯āĩā´•", - "submit": "ā´¨āĩ€ā´•āĩā´•ā´‚ ⴚāĩ†ā´¯āĩā´¯āĩā´•" + "submit": "ā´¨āĩ€ā´•āĩā´•ā´‚ ⴚāĩ†ā´¯āĩā´¯āĩā´•", + "settings": { + "title": "Settings" + }, + "info": { + "title": "About Remove Annotations", + "description": "This tool will remove all annotations (comments, highlights, notes, etc.) from your PDF documents." + }, + "error": { + "failed": "An error occurred while removing annotations from the PDF." + } }, "compare": { "tags": "ā´ĩāĩ‡āĩŧā´¤ā´ŋā´°ā´ŋā´•āĩā´•āĩā´•,ā´ĩāĩā´¯ā´¤āĩā´¯ā´žā´¸ā´‚,ā´Žā´žā´ąāĩā´ąā´™āĩā´™āĩž,ā´ĩā´ŋā´ļⴕⴞⴍⴂ", @@ -992,6 +2326,142 @@ "certSign": { "tags": "ā´¸āĩā´Ĩā´ŋā´°āĩ€ā´•ā´°ā´ŋā´•āĩā´•āĩā´•,PEM,P12,ā´”ā´Ļāĩā´¯āĩ‹ā´—ā´ŋā´•ā´‚,ā´Žāĩģā´•āĩā´°ā´ŋā´Ēāĩā´ąāĩā´ąāĩ ⴚāĩ†ā´¯āĩā´¯āĩā´•", "title": "ā´¸āĩŧⴟāĩā´Ÿā´ŋā´Ģā´ŋā´•āĩā´•ā´ąāĩā´ąāĩ ā´’ā´Ēāĩā´Ēā´ŋⴟāĩŊ", + "filenamePrefix": "signed", + "signMode": { + "stepTitle": "Sign Mode", + "tooltip": { + "header": { + "title": "About PDF Signatures" + }, + "overview": { + "title": "How signatures work", + "text": "Both modes seal the document (any edits are flagged as tampering) and record who/when/how for auditing. Viewer trust depends on the certificate chain." + }, + "manual": { + "title": "Manual - Bring your certificate", + "text": "Use your own certificate files for brand-aligned identity. Can display Trusted when your CA/chain is recognised.", + "use": "Use for: customer-facing, legal, compliance." + }, + "auto": { + "title": "Auto - Zero-setup, instant system seal", + "text": "Signs with a server self-signed certificate. Same tamper-evident seal and audit trail; typically shows Unverified in viewers.", + "use": "Use when: you need speed and consistent internal identity across reviews and records." + }, + "rule": { + "title": "Rule of thumb", + "text": "Need recipient Trusted status? Manual. Need a fast, tamper-evident seal and audit trail with no setup? Auto." + } + } + }, + "certTypeStep": { + "stepTitle": "Certificate Format" + }, + "certFiles": { + "stepTitle": "Certificate Files" + }, + "appearance": { + "stepTitle": "Signature Appearance", + "tooltip": { + "header": { + "title": "About Signature Appearance" + }, + "invisible": { + "title": "Invisible Signatures", + "text": "The signature is added to the PDF for security but won't be visible when viewing the document. Perfect for legal requirements without changing the document's appearance.", + "bullet1": "Provides security without visual changes", + "bullet2": "Meets legal requirements for digital signing", + "bullet3": "Doesn't affect document layout or design" + }, + "visible": { + "title": "Visible Signatures", + "text": "Shows a signature block on the PDF with your name, date, and optional details. Useful when you want readers to clearly see the document is signed.", + "bullet1": "Shows signer name and date on the document", + "bullet2": "Can include reason and location for signing", + "bullet3": "Choose which page to place the signature", + "bullet4": "Optional logo can be included" + } + }, + "invisible": "Invisible", + "options": { + "title": "Signature Details" + }, + "visible": "Visible" + }, + "sign": { + "submit": "Sign PDF", + "results": "Signed PDF" + }, + "error": { + "failed": "An error occurred whilst processing signatures." + }, + "tooltip": { + "header": { + "title": "About Managing Signatures" + }, + "overview": { + "title": "What can this tool do?", + "text": "This tool lets you check if your PDFs are digitally signed and add new digital signatures. Digital signatures prove who created or approved a document and show if it has been changed since signing.", + "bullet1": "Check existing signatures and their validity", + "bullet2": "View detailed information about signers and certificates", + "bullet3": "Add new digital signatures to secure your documents", + "bullet4": "Multiple files supported with easy navigation" + }, + "validation": { + "title": "Checking Signatures", + "text": "When you check signatures, the tool tells you if they're valid, who signed the document, when it was signed, and whether the document has been changed since signing.", + "bullet1": "Shows if signatures are valid or invalid", + "bullet2": "Displays signer information and signing date", + "bullet3": "Checks if the document was modified after signing", + "bullet4": "Can use custom certificates for verification" + }, + "signing": { + "title": "Adding Signatures", + "text": "To sign a PDF, you need a digital certificate (like PEM, PKCS12, or JKS). You can choose to make the signature visible on the document or keep it invisible for security only.", + "bullet1": "Supports PEM, PKCS12, JKS, and server certificate formats", + "bullet2": "Option to show or hide signature on the PDF", + "bullet3": "Add reason, location, and signer name", + "bullet4": "Choose which page to place visible signatures", + "bullet5": "Use server certificate for simple 'Sign with Stirling-PDF' option" + } + }, + "certType": { + "tooltip": { + "header": { + "title": "About Certificate Types" + }, + "what": { + "title": "What's a certificate?", + "text": "It's a secure ID for your signature that proves you signed. Unless you're required to sign via certificate, we recommend using another secure method like Type, Draw, or Upload." + }, + "which": { + "title": "Which option should I use?", + "text": "Choose the format that matches your certificate file:", + "bullet1": "PKCS#12 (.p12 / .pfx) – one combined file (most common)", + "bullet2": "PFX (.pfx) – Microsoft's version of PKCS12", + "bullet3": "PEM – separate private-key and certificate .pem files", + "bullet4": "JKS – Java .jks keystore for dev / CI-CD workflows" + }, + "convert": { + "title": "Key not listed?", + "text": "Convert your file to a Java keystore (.jks) with keytool, then pick JKS." + } + } + }, + "chooseCertificate": "Choose Certificate File", + "chooseJksFile": "Choose JKS File", + "chooseP12File": "Choose PKCS12 File", + "choosePfxFile": "Choose PFX File", + "choosePrivateKey": "Choose Private Key File", + "location": "ā´¸āĩā´Ĩⴞⴂ", + "logoTitle": "Logo", + "name": "ā´Ēāĩ‡ā´°āĩ", + "noLogo": "No Logo", + "pageNumber": "Page Number", + "password": "ā´¨ā´ŋā´™āĩā´™ā´ŗāĩā´Ÿāĩ† ā´•āĩ€ā´¸āĩā´ąāĩā´ąāĩ‹āĩŧ ā´…ā´˛āĩā´˛āĩ†ā´™āĩā´•ā´ŋāĩŊ ā´¸āĩā´ĩā´•ā´žā´°āĩā´¯ ā´•āĩ€ ā´Ēā´žā´¸āĩâ€Œā´ĩāĩ‡ā´Ąāĩ ā´¨āĩŊā´•āĩā´• (ⴉ⴪āĩā´Ÿāĩ†ā´™āĩā´•ā´ŋāĩŊ):", + "passwordOptional": "Leave empty if no password", + "reason": "ā´•ā´žā´°ā´Ŗā´‚", + "serverCertMessage": "Using server certificate - no files or password required", + "showLogo": "ā´˛āĩ‹ā´—āĩ‹ ā´•ā´žā´Ŗā´ŋā´•āĩā´•āĩā´•", "header": "ā´¨ā´ŋā´™āĩā´™ā´ŗāĩā´Ÿāĩ† ā´¸āĩŧⴟāĩā´Ÿā´ŋā´Ģā´ŋā´•āĩā´•ā´ąāĩā´ąāĩ ā´‰ā´Ēā´¯āĩ‹ā´—ā´ŋⴚāĩā´šāĩ ā´’ā´°āĩ PDF ā´’ā´Ēāĩā´Ēā´ŋⴟāĩā´• (ā´¨ā´ŋāĩŧā´Žāĩā´Žā´žā´Ŗā´¤āĩā´¤ā´ŋā´˛ā´ŋā´°ā´ŋā´•āĩā´•āĩā´¨āĩā´¨āĩ)", "selectPDF": "ā´’ā´Ēāĩā´Ēā´ŋⴟāĩā´¨āĩā´¨ā´¤ā´ŋā´¨ā´žā´¯ā´ŋ ā´’ā´°āĩ PDF ā´Ģā´¯āĩŊ ā´¤ā´ŋā´°ā´žāĩā´žāĩ†ā´Ÿāĩā´•āĩā´•āĩā´•:", "jksNote": "ā´ļāĩā´°ā´Ļāĩā´§ā´ŋā´•āĩā´•āĩā´•: ā´¨ā´ŋā´™āĩā´™ā´ŗāĩā´Ÿāĩ† ā´¸āĩŧⴟāĩā´Ÿā´ŋā´Ģā´ŋā´•āĩā´•ā´ąāĩā´ąāĩ ⴤⴰⴂ ā´¤ā´žā´´āĩ† ā´˛ā´ŋā´¸āĩā´ąāĩā´ąāĩ ⴚāĩ†ā´¯āĩā´¤ā´ŋⴟāĩā´Ÿā´ŋā´˛āĩā´˛āĩ†ā´™āĩā´•ā´ŋāĩŊ, ā´Ļā´¯ā´ĩā´žā´¯ā´ŋ ā´•āĩ€ā´Ÿāĩ‚āĩž ā´•ā´Žā´žāĩģā´Ąāĩ ā´˛āĩˆāĩģ ⴟāĩ‚āĩž ā´‰ā´Ēā´¯āĩ‹ā´—ā´ŋⴚāĩā´šāĩ ā´…ā´¤ā´ŋā´¨āĩ† ā´’ā´°āĩ ā´œā´žā´ĩ ā´•āĩ€ā´¸āĩā´ąāĩā´ąāĩ‹āĩŧ (.jks) ā´Ģⴝⴞā´ŋā´˛āĩ‡ā´•āĩā´•āĩ ā´Žā´žā´ąāĩā´ąāĩā´•. ā´¤āĩā´Ÿāĩŧā´¨āĩā´¨āĩ, ā´¤ā´žā´´āĩ†ā´¯āĩā´ŗāĩā´ŗ .jks ā´Ģā´¯āĩŊ ā´“ā´Ēāĩā´ˇāĩģ ā´¤ā´ŋā´°ā´žāĩā´žāĩ†ā´Ÿāĩā´•āĩā´•āĩā´•.", @@ -999,13 +2469,7 @@ "selectCert": "ā´¨ā´ŋā´™āĩā´™ā´ŗāĩā´Ÿāĩ† ā´¸āĩŧⴟāĩā´Ÿā´ŋā´Ģā´ŋā´•āĩā´•ā´ąāĩā´ąāĩ ā´Ģā´¯āĩŊ ā´¤ā´ŋā´°ā´žāĩā´žāĩ†ā´Ÿāĩā´•āĩā´•āĩā´• (X.509 ā´Ģāĩ‹āĩŧā´Žā´žā´ąāĩā´ąāĩ, .pem ā´…ā´˛āĩā´˛āĩ†ā´™āĩā´•ā´ŋāĩŊ .der ā´†ā´•ā´žā´‚):", "selectP12": "ā´¨ā´ŋā´™āĩā´™ā´ŗāĩā´Ÿāĩ† PKCS#12 ā´•āĩ€ā´¸āĩā´ąāĩā´ąāĩ‹āĩŧ ā´Ģā´¯āĩŊ (.p12 ā´…ā´˛āĩā´˛āĩ†ā´™āĩā´•ā´ŋāĩŊ .pfx) ā´¤ā´ŋā´°ā´žāĩā´žāĩ†ā´Ÿāĩā´•āĩā´•āĩā´• (ā´“ā´Ēāĩā´ˇā´ŖāĩŊ, ā´¨āĩŊā´•ā´ŋā´¯ā´ŋⴟāĩā´Ÿāĩā´Ŗāĩā´Ÿāĩ†ā´™āĩā´•ā´ŋāĩŊ, ā´…ā´¤ā´ŋāĩŊ ā´¨ā´ŋā´™āĩā´™ā´ŗāĩā´Ÿāĩ† ā´¸āĩā´ĩā´•ā´žā´°āĩā´¯ ā´•āĩ€ā´¯āĩā´‚ ā´¸āĩŧⴟāĩā´Ÿā´ŋā´Ģā´ŋā´•āĩā´•ā´ąāĩā´ąāĩā´‚ ā´…ā´Ÿā´™āĩā´™ā´ŋā´¯ā´ŋā´°ā´ŋā´•āĩā´•ā´Ŗā´‚):", "selectJKS": "ā´¨ā´ŋā´™āĩā´™ā´ŗāĩā´Ÿāĩ† ā´œā´žā´ĩ ā´•āĩ€ā´¸āĩā´ąāĩā´ąāĩ‹āĩŧ ā´Ģā´¯āĩŊ (.jks ā´…ā´˛āĩā´˛āĩ†ā´™āĩā´•ā´ŋāĩŊ .keystore) ā´¤ā´ŋā´°ā´žāĩā´žāĩ†ā´Ÿāĩā´•āĩā´•āĩā´•:", - "certType": "ā´¸āĩŧⴟāĩā´Ÿā´ŋā´Ģā´ŋā´•āĩā´•ā´ąāĩā´ąāĩ ⴤⴰⴂ", - "password": "ā´¨ā´ŋā´™āĩā´™ā´ŗāĩā´Ÿāĩ† ā´•āĩ€ā´¸āĩā´ąāĩā´ąāĩ‹āĩŧ ā´…ā´˛āĩā´˛āĩ†ā´™āĩā´•ā´ŋāĩŊ ā´¸āĩā´ĩā´•ā´žā´°āĩā´¯ ā´•āĩ€ ā´Ēā´žā´¸āĩâ€Œā´ĩāĩ‡ā´Ąāĩ ā´¨āĩŊā´•āĩā´• (ⴉ⴪āĩā´Ÿāĩ†ā´™āĩā´•ā´ŋāĩŊ):", "showSig": "ā´’ā´Ēāĩā´Ēāĩ ā´•ā´žā´Ŗā´ŋā´•āĩā´•āĩā´•", - "reason": "ā´•ā´žā´°ā´Ŗā´‚", - "location": "ā´¸āĩā´Ĩⴞⴂ", - "name": "ā´Ēāĩ‡ā´°āĩ", - "showLogo": "ā´˛āĩ‹ā´—āĩ‹ ā´•ā´žā´Ŗā´ŋā´•āĩā´•āĩā´•", "submit": "PDF ā´’ā´Ēāĩā´Ēā´ŋⴟāĩā´•" }, "removeCertSign": { @@ -1013,7 +2477,18 @@ "title": "ā´¸āĩŧⴟāĩā´Ÿā´ŋā´Ģā´ŋā´•āĩā´•ā´ąāĩā´ąāĩ ā´’ā´Ēāĩā´Ēāĩ ā´¨āĩ€ā´•āĩā´•ā´‚ ⴚāĩ†ā´¯āĩā´¯āĩā´•", "header": "PDF-āĩŊ ā´¨ā´ŋā´¨āĩā´¨āĩ ā´Ąā´ŋⴜā´ŋā´ąāĩā´ąāĩŊ ā´¸āĩŧⴟāĩā´Ÿā´ŋā´Ģā´ŋā´•āĩā´•ā´ąāĩā´ąāĩ ā´¨āĩ€ā´•āĩā´•ā´‚ ⴚāĩ†ā´¯āĩā´¯āĩā´•", "selectPDF": "ā´’ā´°āĩ PDF ā´Ģā´¯āĩŊ ā´¤ā´ŋā´°ā´žāĩā´žāĩ†ā´Ÿāĩā´•āĩā´•āĩā´•:", - "submit": "ā´’ā´Ēāĩā´Ēāĩ ā´¨āĩ€ā´•āĩā´•ā´‚ ⴚāĩ†ā´¯āĩā´¯āĩā´•" + "submit": "ā´’ā´Ēāĩā´Ēāĩ ā´¨āĩ€ā´•āĩā´•ā´‚ ⴚāĩ†ā´¯āĩā´¯āĩā´•", + "description": "This tool will remove digital certificate signatures from your PDF document.", + "filenamePrefix": "unsigned", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst removing certificate signatures." + }, + "results": { + "title": "Certificate Removal Results" + } }, "pageLayout": { "tags": "ⴞⴝā´ŋā´Ēāĩā´Ēā´ŋā´•āĩā´•āĩā´•,ⴏⴂⴝāĩ‹ā´œā´ŋā´Ēāĩā´Ēā´ŋā´•āĩā´•āĩā´•,ā´’ā´ąāĩā´ą-ā´•ā´žā´´āĩā´š,ā´•āĩā´°ā´Žāĩ€ā´•ā´°ā´ŋā´•āĩā´•āĩā´•", @@ -1021,16 +2496,157 @@ "header": "ā´Žāĩžā´Ÿāĩā´Ÿā´ŋ ā´Ēāĩ‡ā´œāĩ ā´˛āĩ‡ā´”ā´Ÿāĩā´Ÿāĩ", "pagesPerSheet": "ā´“ā´°āĩ‹ ā´ˇāĩ€ā´ąāĩā´ąā´ŋā´˛āĩ†ā´¯āĩā´‚ ā´Ēāĩ‡ā´œāĩā´•āĩž:", "addBorder": "ā´…ā´¤ā´ŋā´°āĩā´•āĩž ⴚāĩ‡āĩŧā´•āĩā´•āĩā´•", - "submit": "ā´¸ā´Žāĩŧā´Ēāĩā´Ēā´ŋā´•āĩā´•āĩā´•" + "submit": "ā´¸ā´Žāĩŧā´Ēāĩā´Ēā´ŋā´•āĩā´•āĩā´•", + "desc": { + "2": "Place 2 pages side-by-side on a single sheet.", + "3": "Place 3 pages on a single sheet in a single row.", + "4": "Place 4 pages on a single sheet (2 × 2 grid).", + "9": "Place 9 pages on a single sheet (3 × 3 grid).", + "16": "Place 16 pages on a single sheet (4 × 4 grid)." + }, + "error": { + "failed": "An error occurred while creating the multi-page layout." + } + }, + "bookletImposition": { + "tags": "booklet,imposition,printing,binding,folding,signature", + "title": "Booklet Imposition", + "header": "Booklet Imposition", + "submit": "Create Booklet", + "spineLocation": { + "label": "Spine Location", + "left": "Left (Standard)", + "right": "Right (RTL)" + }, + "doubleSided": { + "label": "Double-sided printing", + "tooltip": "Creates both front and back sides for proper booklet printing" + }, + "manualDuplex": { + "title": "Manual Duplex Mode", + "instructions": "For printers without automatic duplex. You'll need to run this twice:" + }, + "duplexPass": { + "label": "Print Pass", + "first": "1st Pass", + "second": "2nd Pass", + "firstInstructions": "Prints front sides → stack face-down → run again with 2nd Pass", + "secondInstructions": "Load printed stack face-down → prints back sides" + }, + "rtlBinding": { + "label": "Right-to-left binding", + "tooltip": "For Arabic, Hebrew, or other right-to-left languages" + }, + "addBorder": { + "label": "Add borders around pages", + "tooltip": "Adds borders around each page section to help with cutting and alignment" + }, + "addGutter": { + "label": "Add gutter margin", + "tooltip": "Adds inner margin space for binding" + }, + "gutterSize": { + "label": "Gutter size (points)" + }, + "flipOnShortEdge": { + "label": "Flip on short edge (automatic duplex only)", + "tooltip": "Enable for short-edge duplex printing (automatic duplex only - ignored in manual mode)", + "manualNote": "Not needed in manual mode - you flip the stack yourself" + }, + "advanced": { + "toggle": "Advanced Options" + }, + "paperSizeNote": "Paper size is automatically derived from your first page.", + "tooltip": { + "header": { + "title": "Booklet Creation Guide" + }, + "description": { + "title": "What is Booklet Imposition?", + "text": "Creates professional booklets by arranging pages in the correct printing order. Your PDF pages are placed 2-up on landscape sheets so when folded and bound, they read in proper sequence like a real book." + }, + "example": { + "title": "Example: 8-Page Booklet", + "text": "Your 8-page document becomes 2 sheets:", + "bullet1": "Sheet 1 Front: Pages 8, 1 | Back: Pages 2, 7", + "bullet2": "Sheet 2 Front: Pages 6, 3 | Back: Pages 4, 5", + "bullet3": "When folded & stacked: Reads 1→2→3→4→5→6→7→8" + }, + "printing": { + "title": "How to Print & Assemble", + "text": "Follow these steps for perfect booklets:", + "bullet1": "Print double-sided with 'Flip on long edge'", + "bullet2": "Stack sheets in order, fold in half", + "bullet3": "Staple or bind along the folded spine", + "bullet4": "For short-edge printers: Enable 'Flip on short edge' option" + }, + "manualDuplex": { + "title": "Manual Duplex (Single-sided Printers)", + "text": "For printers without automatic duplex:", + "bullet1": "Turn OFF 'Double-sided printing'", + "bullet2": "Select '1st Pass' → Print → Stack face-down", + "bullet3": "Select '2nd Pass' → Load stack → Print backs", + "bullet4": "Fold and assemble as normal" + }, + "advanced": { + "title": "Advanced Options", + "text": "Fine-tune your booklet:", + "bullet1": "Right-to-Left Binding: For Arabic, Hebrew, or RTL languages", + "bullet2": "Borders: Shows cut lines for trimming", + "bullet3": "Gutter Margin: Adds space for binding/stapling", + "bullet4": "Short-edge Flip: Only for automatic duplex printers" + } + }, + "error": { + "failed": "An error occurred while creating the booklet imposition." + } }, "scalePages": { - "tags": "ā´ĩā´˛āĩā´Ēāĩā´Ēā´‚ ā´Žā´žā´ąāĩā´ąāĩā´•,ā´Ēā´°ā´ŋā´ˇāĩā´•āĩā´•ā´°ā´ŋā´•āĩā´•āĩā´•,ā´…ā´ŗā´ĩāĩ,ā´…ā´¨āĩā´¯āĩ‹ā´œāĩā´¯ā´Žā´žā´•āĩā´•āĩā´•", "title": "ā´Ēāĩ‡ā´œāĩ-ā´¸āĩā´•āĩ†ā´¯ā´ŋāĩŊ ā´•āĩā´°ā´Žāĩ€ā´•ā´°ā´ŋā´•āĩā´•āĩā´•", "header": "ā´Ēāĩ‡ā´œāĩ-ā´¸āĩā´•āĩ†ā´¯ā´ŋāĩŊ ā´•āĩā´°ā´Žāĩ€ā´•ā´°ā´ŋā´•āĩā´•āĩā´•", "pageSize": "ā´Ēāĩā´°ā´Žā´žā´Ŗā´¤āĩā´¤ā´ŋā´˛āĩ† ā´’ā´°āĩ ā´Ēāĩ‡ā´œā´ŋā´¨āĩā´ąāĩ† ā´ĩā´˛āĩā´Ēāĩā´Ēā´‚.", "keepPageSize": "ā´¯ā´Ĩā´žāĩŧā´¤āĩā´Ĩ ā´ĩā´˛āĩā´Ēāĩā´Ēā´‚", "scaleFactor": "ā´’ā´°āĩ ā´Ēāĩ‡ā´œā´ŋā´¨āĩā´ąāĩ† ā´¸āĩ‚ā´‚ ā´¨ā´ŋā´˛ (ā´•āĩā´°āĩ‹ā´Ēāĩā´Ēāĩ).", - "submit": "ā´¸ā´Žāĩŧā´Ēāĩā´Ēā´ŋā´•āĩā´•āĩā´•" + "submit": "ā´¸ā´Žāĩŧā´Ēāĩā´Ēā´ŋā´•āĩā´•āĩā´•", + "tags": "ā´ĩā´˛āĩā´Ēāĩā´Ēā´‚ ā´Žā´žā´ąāĩā´ąāĩā´•,ā´Ēā´°ā´ŋā´ˇāĩā´•āĩā´•ā´°ā´ŋā´•āĩā´•āĩā´•,ā´…ā´ŗā´ĩāĩ,ā´…ā´¨āĩā´¯āĩ‹ā´œāĩā´¯ā´Žā´žā´•āĩā´•āĩā´•" + }, + "adjustPageScale": { + "tags": "resize,modify,dimension,adapt", + "title": "Adjust Page Scale", + "header": "Adjust Page Scale", + "scaleFactor": { + "label": "Scale Factor" + }, + "pageSize": { + "label": "Target Page Size", + "keep": "Keep Original Size", + "letter": "Letter", + "legal": "Legal" + }, + "submit": "Adjust Page Scale", + "error": { + "failed": "An error occurred while adjusting the page scale." + }, + "tooltip": { + "header": { + "title": "Page Scale Settings Overview" + }, + "description": { + "title": "Description", + "text": "Adjust the size of PDF content and change the page dimensions." + }, + "scaleFactor": { + "title": "Scale Factor", + "text": "Controls how large or small the content appears on the page. Content is scaled and centred - if scaled content is larger than the page size, it may be cropped.", + "bullet1": "1.0 = Original size", + "bullet2": "0.5 = Half size (50% smaller)", + "bullet3": "2.0 = Double size (200% larger, may crop)" + }, + "pageSize": { + "title": "Target Page Size", + "text": "Sets the dimensions of the output PDF pages. 'Keep Original Size' maintains current dimensions, whilst other options resize to standard paper sizes." + } + } }, "add-page-numbers": { "tags": "ā´Ēāĩ‡ā´œāĩ ā´¨ā´Žāĩā´Ēāĩŧ ā´¨āĩŊā´•āĩā´•,ā´˛āĩ‡ā´ŦāĩŊ,ā´•āĩā´°ā´Žāĩ€ā´•ā´°ā´ŋā´•āĩā´•āĩā´•,ā´¸āĩ‚ā´šā´ŋā´•" @@ -1039,16 +2655,83 @@ "tags": "ā´¸āĩā´ĩⴝⴂ-ā´•ā´Ŗāĩā´Ÿāĩ†ā´¤āĩā´¤āĩā´•,ⴤⴞⴕāĩā´•āĩ†ā´Ÿāĩā´Ÿāĩ-ā´…ā´Ÿā´ŋā´¸āĩā´Ĩā´žā´¨ā´Žā´žā´•āĩā´•ā´ŋā´¯āĩā´ŗāĩā´ŗ,ā´•āĩā´°ā´Žāĩ€ā´•ā´°ā´ŋā´•āĩā´•āĩā´•,ā´Ēāĩā´¨āĩŧā´˛āĩ‡ā´ŦāĩŊ ⴚāĩ†ā´¯āĩā´¯āĩā´•", "title": "ā´¸āĩā´ĩⴝⴂ ā´Ēāĩā´¨āĩŧā´¨ā´žā´Žā´•ā´°ā´Ŗā´‚ ⴚāĩ†ā´¯āĩā´¯āĩā´•", "header": "PDF ā´¸āĩā´ĩⴝⴂ ā´Ēāĩā´¨āĩŧā´¨ā´žā´Žā´•ā´°ā´Ŗā´‚ ⴚāĩ†ā´¯āĩā´¯āĩā´•", - "submit": "ā´¸āĩā´ĩⴝⴂ ā´Ēāĩā´¨āĩŧā´¨ā´žā´Žā´•ā´°ā´Ŗā´‚ ⴚāĩ†ā´¯āĩā´¯āĩā´•" + "description": "Automatically finds the title from your PDF content and uses it as the filename.", + "submit": "ā´¸āĩā´ĩⴝⴂ ā´Ēāĩā´¨āĩŧā´¨ā´žā´Žā´•ā´°ā´Ŗā´‚ ⴚāĩ†ā´¯āĩā´¯āĩā´•", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst auto-renaming the PDF." + }, + "results": { + "title": "Auto-Rename Results" + }, + "tooltip": { + "header": { + "title": "How Auto-Rename Works" + }, + "howItWorks": { + "title": "Smart Renaming", + "text": "Automatically finds the title from your PDF content and uses it as the filename.", + "bullet1": "Looks for text that appears to be a title or heading", + "bullet2": "Creates a clean, valid filename from the detected title", + "bullet3": "Keeps the original name if no suitable title is found" + } + } }, "adjust-contrast": { "tags": "ā´¨ā´ŋā´ąā´‚-ā´¤ā´ŋā´°āĩā´¤āĩā´¤āĩŊ,ⴟāĩā´¯āĩ‚āĩē ⴚāĩ†ā´¯āĩā´¯āĩā´•,ā´Ēā´°ā´ŋā´ˇāĩā´•āĩā´•ā´°ā´ŋā´•āĩā´•āĩā´•,ā´Žāĩ†ā´šāĩā´šā´Ēāĩā´Ēāĩ†ā´Ÿāĩā´¤āĩā´¤āĩā´•" }, "crop": { - "tags": "ā´Žāĩā´ąā´ŋā´•āĩā´•āĩā´•,ⴚāĩā´°āĩā´•āĩā´•āĩā´•,ā´¤ā´ŋā´°āĩā´¤āĩā´¤āĩā´•,ā´°āĩ‚ā´Ēā´‚", "title": "ā´•āĩā´°āĩ‹ā´Ēāĩā´Ēāĩ ⴚāĩ†ā´¯āĩā´¯āĩā´•", "header": "PDF ā´•āĩā´°āĩ‹ā´Ēāĩā´Ēāĩ ⴚāĩ†ā´¯āĩā´¯āĩā´•", - "submit": "ā´¸ā´Žāĩŧā´Ēāĩā´Ēā´ŋā´•āĩā´•āĩā´•" + "submit": "ā´¸ā´Žāĩŧā´Ēāĩā´Ēā´ŋā´•āĩā´•āĩā´•", + "noFileSelected": "Select a PDF file to begin cropping", + "preview": { + "title": "Crop Area Selection" + }, + "reset": "Reset to full PDF", + "coordinates": { + "title": "Position and Size", + "x": { + "label": "X Position", + "desc": "Left edge (points)" + }, + "y": { + "label": "Y Position", + "desc": "Bottom edge (points)" + }, + "width": { + "label": "Width", + "desc": "Crop width (points)" + }, + "height": { + "label": "Height", + "desc": "Crop height (points)" + } + }, + "error": { + "invalidArea": "Crop area extends beyond PDF boundaries", + "failed": "Failed to crop PDF" + }, + "steps": { + "selectArea": "Select Crop Area" + }, + "tooltip": { + "title": "How to Crop PDFs", + "description": "Select the area to crop from your PDF by dragging and resizing the blue overlay on the thumbnail.", + "drag": "Drag the overlay to move the crop area", + "resize": "Drag the corner and edge handles to resize", + "precision": "Use coordinate inputs for precise positioning" + }, + "results": { + "title": "Crop Results" + }, + "automation": { + "info": "Enter crop coordinates in PDF points. Origin (0,0) is at bottom-left. These values will be applied to all PDFs processed in this automation.", + "reference": "Reference: A4 page is 595.28 × 841.89 points (210mm × 297mm). 1 inch = 72 points." + }, + "tags": "ā´Žāĩā´ąā´ŋā´•āĩā´•āĩā´•,ⴚāĩā´°āĩā´•āĩā´•āĩā´•,ā´¤ā´ŋā´°āĩā´¤āĩā´¤āĩā´•,ā´°āĩ‚ā´Ēā´‚" }, "autoSplitPDF": { "tags": "QR-ā´…ā´Ÿā´ŋā´¸āĩā´Ĩā´žā´¨ā´Žā´žā´•āĩā´•ā´ŋā´¯āĩā´ŗāĩā´ŗ,ā´ĩāĩ‡āĩŧā´¤ā´ŋā´°ā´ŋā´•āĩā´•āĩā´•,ā´¸āĩā´•ā´žāĩģ-ā´¸āĩ†ā´—āĩā´Žāĩ†ā´¨āĩā´ąāĩ,ā´•āĩā´°ā´Žāĩ€ā´•ā´°ā´ŋā´•āĩā´•āĩā´•", @@ -1131,24 +2814,124 @@ "downloadJS": "ā´œā´žā´ĩā´žā´¸āĩā´•āĩā´°ā´ŋā´Ēāĩā´ąāĩā´ąāĩ ā´Ąāĩ—āĩēā´˛āĩ‹ā´Ąāĩ ⴚāĩ†ā´¯āĩā´¯āĩā´•", "submit": "ā´•ā´žā´Ŗā´ŋā´•āĩā´•āĩā´•" }, - "autoRedact": { - "tags": "ā´ąāĩ†ā´Ąā´žā´•āĩā´ąāĩā´ąāĩ,ā´Žā´ąā´¯āĩā´•āĩā´•āĩā´•,ā´•ā´ąāĩā´Ēāĩā´Ēā´ŋā´•āĩā´•āĩā´•,ā´•ā´ąāĩā´Ēāĩā´Ēāĩ,ā´Žā´žāĩŧā´•āĩā´•āĩŧ,ā´Žā´ąā´žāĩā´žā´ŋā´°ā´ŋā´•āĩā´•āĩā´¨āĩā´¨", - "title": "ā´¸āĩā´ĩⴝⴂ ā´ąāĩ†ā´Ąā´žā´•āĩā´ąāĩā´ąāĩ ⴚāĩ†ā´¯āĩā´¯āĩā´•", - "header": "ā´¸āĩā´ĩⴝⴂ ā´ąāĩ†ā´Ąā´žā´•āĩā´ąāĩā´ąāĩ ⴚāĩ†ā´¯āĩā´¯āĩā´•", - "colorLabel": "ā´¨ā´ŋā´ąā´‚", - "textsToRedactLabel": "ā´ąāĩ†ā´Ąā´žā´•āĩā´ąāĩā´ąāĩ ⴚāĩ†ā´¯āĩā´¯āĩ‡ā´Ŗāĩā´Ÿ ⴟāĩ†ā´•āĩā´¸āĩā´ąāĩā´ąāĩ (ā´ĩā´°ā´ŋā´•ā´ŗā´žāĩŊ ā´ĩāĩ‡āĩŧā´¤ā´ŋā´°ā´ŋⴚāĩā´šā´¤āĩ)", - "textsToRedactPlaceholder": "ā´‰ā´Ļā´ž. \\nā´°ā´šā´¸āĩā´¯ā´‚ \\nā´…ā´¤āĩ€ā´ĩ-ā´°ā´šā´¸āĩā´¯ā´‚", - "useRegexLabel": "ā´ąāĩ†ā´—āĩā´˛āĩŧ ā´Žā´•āĩā´¸āĩā´Ēāĩā´°ā´ˇāĩģ ā´‰ā´Ēā´¯āĩ‹ā´—ā´ŋā´•āĩā´•āĩā´•", - "wholeWordSearchLabel": "ā´Žāĩā´´āĩā´ĩāĩģ ā´ĩā´žā´•āĩā´•āĩ ā´¤ā´ŋā´°ā´¯āĩŊ", - "customPaddingLabel": "ⴇⴎāĩā´Ÿā´žā´¨āĩā´¸āĩƒā´¤ ā´…ā´§ā´ŋā´• ā´Ēā´žā´Ąā´ŋā´‚ā´—āĩ", - "convertPDFToImageLabel": "PDF-ā´¨āĩ† PDF-ⴚā´ŋā´¤āĩā´°ā´¤āĩā´¤ā´ŋā´˛āĩ‡ā´•āĩā´•āĩ ā´Žā´žā´ąāĩā´ąāĩā´• (ā´Ŧāĩ‹ā´•āĩā´¸ā´ŋā´¨āĩ ā´Ēā´ŋā´¨āĩā´¨ā´ŋā´˛āĩ† ⴟāĩ†ā´•āĩā´¸āĩā´ąāĩā´ąāĩ ā´¨āĩ€ā´•āĩā´•ā´‚ ⴚāĩ†ā´¯āĩā´¯ā´žāĩģ ā´‰ā´Ēā´¯āĩ‹ā´—ā´ŋā´•āĩā´•āĩā´¨āĩā´¨āĩ)", - "submitButton": "ā´¸ā´Žāĩŧā´Ēāĩā´Ēā´ŋā´•āĩā´•āĩā´•" - }, "redact": { "tags": "ā´ąāĩ†ā´Ąā´žā´•āĩā´ąāĩā´ąāĩ,ā´Žā´ąā´¯āĩā´•āĩā´•āĩā´•,ā´•ā´ąāĩā´Ēāĩā´Ēā´ŋā´•āĩā´•āĩā´•,ā´•ā´ąāĩā´Ēāĩā´Ēāĩ,ā´Žā´žāĩŧā´•āĩā´•āĩŧ,ā´Žā´ąā´žāĩā´žā´ŋā´°ā´ŋā´•āĩā´•āĩā´¨āĩā´¨,ā´¸āĩā´ĩⴝⴂ", "title": "ā´¸āĩā´ĩⴝⴂ ā´ąāĩ†ā´Ąā´žā´•āĩā´ˇāĩģ", - "header": "ā´¸āĩā´ĩⴝⴂ ā´ąāĩ†ā´Ąā´žā´•āĩā´ˇāĩģ", "submit": "ā´ąāĩ†ā´Ąā´žā´•āĩā´ąāĩā´ąāĩ ⴚāĩ†ā´¯āĩā´¯āĩā´•", + "error": { + "failed": "An error occurred while redacting the PDF." + }, + "modeSelector": { + "title": "Redaction Method", + "mode": "Mode", + "automatic": "Automatic", + "automaticDesc": "Redact text based on search terms", + "manual": "Manual", + "manualDesc": "Click and drag to redact specific areas", + "manualComingSoon": "Manual redaction coming soon" + }, + "auto": { + "header": "Auto Redact", + "settings": { + "title": "Redaction Settings", + "advancedTitle": "Advanced" + }, + "colorLabel": "Box Colour", + "wordsToRedact": { + "title": "Words to Redact", + "placeholder": "Enter a word", + "add": "Add", + "examples": "Examples: Confidential, Top-Secret" + }, + "useRegexLabel": "Use Regex", + "wholeWordSearchLabel": "Whole Word Search", + "customPaddingLabel": "Custom Extra Padding", + "convertPDFToImageLabel": "Convert PDF to PDF-Image" + }, + "tooltip": { + "mode": { + "header": { + "title": "Redaction Method" + }, + "automatic": { + "title": "Automatic Redaction", + "text": "Automatically finds and redacts specified text throughout the document. Perfect for removing consistent sensitive information like names, addresses, or confidential markers." + }, + "manual": { + "title": "Manual Redaction", + "text": "Click and drag to manually select specific areas to redact. Gives you precise control over what gets redacted. (Coming soon)" + } + }, + "words": { + "header": { + "title": "Words to Redact" + }, + "description": { + "title": "Text Matching", + "text": "Enter words or phrases to find and redact in your document. Each word will be searched for separately." + }, + "bullet1": "Add one word at a time", + "bullet2": "Press Enter or click 'Add Another' to add", + "bullet3": "Click × to remove words", + "examples": { + "title": "Common Examples", + "text": "Typical words to redact include: bank details, email addresses, or specific names." + } + }, + "advanced": { + "header": { + "title": "Advanced Redaction Settings" + }, + "color": { + "title": "Box Colour & Padding", + "text": "Customise the appearance of redaction boxes. Black is standard, but you can choose any colour. Padding adds extra space around the found text." + }, + "regex": { + "title": "Use Regex", + "text": "Enable regular expressions for advanced pattern matching. Useful for finding phone numbers, emails, or complex patterns.", + "bullet1": "Example: \\d{4}-\\d{2}-\\d{2} to match any dates in YYYY-MM-DD format", + "bullet2": "Use with caution - test thoroughly" + }, + "wholeWord": { + "title": "Whole Word Search", + "text": "Only match complete words, not partial matches. 'John' won't match 'Johnson' when enabled." + }, + "convert": { + "title": "Convert to PDF-Image", + "text": "Converts the PDF to an image-based PDF after redaction. This ensures text behind redaction boxes is completely removed and unrecoverable." + } + } + }, + "manual": { + "header": "Manual Redaction", + "textBasedRedaction": "Text-based Redaction", + "pageBasedRedaction": "Page-based Redaction", + "convertPDFToImageLabel": "Convert PDF to PDF-Image (Used to remove text behind the box)", + "pageRedactionNumbers": { + "title": "Pages", + "placeholder": "(e.g. 1,2,8 or 4,7,12-16 or 2n-1)" + }, + "redactionColor": { + "title": "Redaction Colour" + }, + "export": "Export", + "upload": "Upload", + "boxRedaction": "Box draw redaction", + "zoom": "Zoom", + "zoomIn": "Zoom in", + "zoomOut": "Zoom out", + "nextPage": "Next Page", + "previousPage": "Previous Page", + "toggleSidebar": "Toggle Sidebar", + "showThumbnails": "Show Thumbnails", + "showDocumentOutline": "Show Document Outline (double-click to expand/collapse all items)", + "showAttachments": "Show Attachments", + "showLayers": "Show Layers (double-click to reset all layers to the default state)", + "colourPicker": "Colour Picker", + "findCurrentOutlineItem": "Find current outline item", + "applyChanges": "Apply Changes" + }, + "header": "ā´¸āĩā´ĩⴝⴂ ā´ąāĩ†ā´Ąā´žā´•āĩā´ˇāĩģ", "textBasedRedaction": "ⴟāĩ†ā´•āĩā´¸āĩā´ąāĩā´ąāĩ ā´…ā´Ÿā´ŋā´¸āĩā´Ĩā´žā´¨ā´Žā´žā´•āĩā´•ā´ŋā´¯āĩā´ŗāĩā´ŗ ā´ąāĩ†ā´Ąā´žā´•āĩā´ˇāĩģ", "pageBasedRedaction": "ā´Ēāĩ‡ā´œāĩ ā´…ā´Ÿā´ŋā´¸āĩā´Ĩā´žā´¨ā´Žā´žā´•āĩā´•ā´ŋā´¯āĩā´ŗāĩā´ŗ ā´ąāĩ†ā´Ąā´žā´•āĩā´ˇāĩģ", "convertPDFToImageLabel": "PDF-ā´¨āĩ† PDF-ⴚā´ŋā´¤āĩā´°ā´¤āĩā´¤ā´ŋā´˛āĩ‡ā´•āĩā´•āĩ ā´Žā´žā´ąāĩā´ąāĩā´• (ā´Ŧāĩ‹ā´•āĩā´¸ā´ŋā´¨āĩ ā´Ēā´ŋā´¨āĩā´¨ā´ŋā´˛āĩ† ⴟāĩ†ā´•āĩā´¸āĩā´ąāĩā´ąāĩ ā´¨āĩ€ā´•āĩā´•ā´‚ ⴚāĩ†ā´¯āĩā´¯ā´žāĩģ ā´‰ā´Ēā´¯āĩ‹ā´—ā´ŋā´•āĩā´•āĩā´¨āĩā´¨āĩ)", @@ -1185,11 +2968,15 @@ "overlay-pdfs": { "tags": "ā´“ā´ĩāĩŧā´˛āĩ‡", "header": "PDF ā´Ģⴝⴞāĩā´•āĩž ā´“ā´ĩāĩŧā´˛āĩ‡ ⴚāĩ†ā´¯āĩā´¯āĩā´•", + "title": "Overlay PDFs", + "desc": "Overlay one PDF on top of another", "baseFile": { "label": "ā´…ā´Ÿā´ŋā´¸āĩā´Ĩā´žā´¨ PDF ā´Ģā´¯āĩŊ ā´¤ā´ŋā´°ā´žāĩā´žāĩ†ā´Ÿāĩā´•āĩā´•āĩā´•" }, "overlayFiles": { - "label": "ā´“ā´ĩāĩŧā´˛āĩ‡ PDF ā´Ģⴝⴞāĩā´•āĩž ā´¤ā´ŋā´°ā´žāĩā´žāĩ†ā´Ÿāĩā´•āĩā´•āĩā´•" + "label": "ā´“ā´ĩāĩŧā´˛āĩ‡ PDF ā´Ģⴝⴞāĩā´•āĩž ā´¤ā´ŋā´°ā´žāĩā´žāĩ†ā´Ÿāĩā´•āĩā´•āĩā´•", + "placeholder": "Choose PDF(s)...", + "addMore": "Add more PDFs..." }, "mode": { "label": "ā´“ā´ĩāĩŧā´˛āĩ‡ ā´Žāĩ‹ā´Ąāĩ ā´¤ā´ŋā´°ā´žāĩā´žāĩ†ā´Ÿāĩā´•āĩā´•āĩā´•", @@ -1199,14 +2986,53 @@ }, "counts": { "label": "ā´“ā´ĩāĩŧā´˛āĩ‡ ā´Žā´Ŗāĩā´Ŗā´‚ (ā´¨ā´ŋā´ļāĩā´šā´ŋā´¤ ā´†ā´ĩāĩŧā´¤āĩā´¤ā´¨ ā´Žāĩ‹ā´Ąā´ŋā´¨ā´žā´¯ā´ŋ)", - "placeholder": "ā´•āĩ‹ā´Žā´¯ā´žāĩŊ ā´ĩāĩ‡āĩŧā´¤ā´ŋā´°ā´ŋⴚāĩā´š ā´Žā´Ŗāĩā´Ŗā´‚ ā´¨āĩŊā´•āĩā´• (ā´‰ā´Ļā´ž., 2,3,1)" + "placeholder": "ā´•āĩ‹ā´Žā´¯ā´žāĩŊ ā´ĩāĩ‡āĩŧā´¤ā´ŋā´°ā´ŋⴚāĩā´š ā´Žā´Ŗāĩā´Ŗā´‚ ā´¨āĩŊā´•āĩā´• (ā´‰ā´Ļā´ž., 2,3,1)", + "item": "Count for file", + "noFiles": "Add overlay files to configure counts" }, "position": { "label": "ā´“ā´ĩāĩŧā´˛āĩ‡ ā´¸āĩā´Ĩā´žā´¨ā´‚ ā´¤ā´ŋā´°ā´žāĩā´žāĩ†ā´Ÿāĩā´•āĩā´•āĩā´•", "foreground": "ā´Žāĩāĩģā´­ā´žā´—ā´‚", "background": "ā´Ēā´ļāĩā´šā´žā´¤āĩā´¤ā´˛ā´‚" }, - "submit": "ā´¸ā´Žāĩŧā´Ēāĩā´Ēā´ŋā´•āĩā´•āĩā´•" + "submit": "ā´¸ā´Žāĩŧā´Ēāĩā´Ēā´ŋā´•āĩā´•āĩā´•", + "settings": { + "title": "Settings" + }, + "results": { + "title": "Overlay Results" + }, + "tooltip": { + "header": { + "title": "Overlay PDFs Overview" + }, + "description": { + "title": "Description", + "text": "Combine a base PDF with one or more overlay PDFs. Overlays can be applied page-by-page in different modes and placed in the foreground or background." + }, + "mode": { + "title": "Overlay Mode", + "text": "Choose how to distribute overlay pages across the base PDF pages.", + "sequential": "Sequential Overlay: Use pages from the first overlay PDF until it ends, then move to the next.", + "interleaved": "Interleaved Overlay: Take one page from each overlay in turn.", + "fixedRepeat": "Fixed Repeat Overlay: Take a set number of pages from each overlay before moving to the next. Use Counts to set the numbers." + }, + "position": { + "title": "Overlay Position", + "text": "Foreground places the overlay on top of the page. Background places it behind." + }, + "overlayFiles": { + "title": "Overlay Files", + "text": "Select one or more PDFs to overlay on the base. The order of these files affects how pages are applied in Sequential and Fixed Repeat modes." + }, + "counts": { + "title": "Counts (Fixed Repeat only)", + "text": "Provide a positive number for each overlay file showing how many pages to take before moving to the next. Required when mode is Fixed Repeat." + } + }, + "error": { + "failed": "An error occurred while overlaying PDFs." + } }, "split-by-sections": { "tags": "ā´ĩā´ŋā´­ā´žā´—ā´‚ ā´ĩā´ŋā´­ā´œā´¨ā´‚, ā´ĩā´ŋⴭⴜā´ŋā´•āĩā´•āĩā´•, ⴇⴎāĩā´Ÿā´žā´¨āĩā´¸āĩƒā´¤ā´Žā´žā´•āĩā´•āĩā´•", @@ -1227,6 +3053,7 @@ "tags": "ā´¸āĩā´ąāĩā´ąā´žā´Žāĩā´Ēāĩ, ⴚā´ŋā´¤āĩā´°ā´‚ ⴚāĩ‡āĩŧā´•āĩā´•āĩā´•, ⴚā´ŋā´¤āĩā´°ā´‚ ā´Žā´§āĩā´¯ā´¤āĩā´¤ā´ŋā´˛ā´žā´•āĩā´•āĩā´•, ā´ĩā´žā´Ÿāĩā´Ÿāĩŧā´Žā´žāĩŧā´•āĩā´•āĩ, PDF, ā´‰āĩžā´Ēāĩā´Ēāĩ†ā´Ÿāĩā´¤āĩā´¤āĩā´•, ⴇⴎāĩā´Ÿā´žā´¨āĩā´¸āĩƒā´¤ā´Žā´žā´•āĩā´•āĩā´•", "header": "PDF ā´¸āĩā´ąāĩā´ąā´žā´Žāĩā´Ēāĩ ⴚāĩ†ā´¯āĩā´¯āĩā´•", "title": "PDF ā´¸āĩā´ąāĩā´ąā´žā´Žāĩā´Ēāĩ ⴚāĩ†ā´¯āĩā´¯āĩā´•", + "stampSetup": "Stamp Setup", "stampType": "ā´¸āĩā´ąāĩā´ąā´žā´Žāĩā´Ēāĩ ⴤⴰⴂ", "stampText": "ā´¸āĩā´ąāĩā´ąā´žā´Žāĩā´Ēāĩ ⴟāĩ†ā´•āĩā´¸āĩā´ąāĩā´ąāĩ", "stampImage": "ā´¸āĩā´ąāĩā´ąā´žā´Žāĩā´Ēāĩ ⴚā´ŋā´¤āĩā´°ā´‚", @@ -1239,7 +3066,19 @@ "overrideY": "Y ā´•āĩ‹āĩŧā´Ąā´ŋā´¨āĩ‡ā´ąāĩā´ąāĩ ā´Žā´žā´ąāĩā´ąā´ŋā´¯āĩ†ā´´āĩā´¤āĩā´•", "customMargin": "ⴇⴎāĩā´Ÿā´žā´¨āĩā´¸āĩƒā´¤ ā´Žā´žāĩŧⴜā´ŋāĩģ", "customColor": "ⴇⴎāĩā´Ÿā´žā´¨āĩā´¸āĩƒā´¤ ⴟāĩ†ā´•āĩā´¸āĩā´ąāĩā´ąāĩ ā´¨ā´ŋā´ąā´‚", - "submit": "ā´¸ā´Žāĩŧā´Ēāĩā´Ēā´ŋā´•āĩā´•āĩā´•" + "submit": "ā´¸ā´Žāĩŧā´Ēāĩā´Ēā´ŋā´•āĩā´•āĩā´•", + "noStampSelected": "No stamp selected. Return to Step 1.", + "customPosition": "Drag the stamp to the desired location in the preview window.", + "error": { + "failed": "An error occurred while adding stamp to the PDF." + }, + "imageSize": "Image Size", + "margin": "Margin", + "positionAndFormatting": "Position & Formatting", + "quickPosition": "Select a position on the page to place the stamp.", + "results": { + "title": "Stamp Results" + } }, "removeImagePdf": { "tags": "ⴚā´ŋā´¤āĩā´°ā´‚ ā´¨āĩ€ā´•āĩā´•ā´‚ ⴚāĩ†ā´¯āĩā´¯āĩā´•,ā´Ēāĩ‡ā´œāĩ ā´Ēāĩā´°ā´ĩāĩŧā´¤āĩā´¤ā´¨ā´™āĩā´™āĩž,ā´Ŧā´žā´•āĩā´•āĩ ā´Žāĩģā´Ąāĩ,ā´¸āĩ†āĩŧā´ĩāĩŧ ā´¸āĩˆā´Ąāĩ" @@ -1257,7 +3096,8 @@ "status": { "_value": "ā´¸āĩā´Ĩā´ŋā´¤ā´ŋ", "valid": "ā´¸ā´žā´§āĩā´ĩā´žā´Ŗāĩ", - "invalid": "ā´…ā´¸ā´žā´§āĩā´ĩā´žā´Ŗāĩ" + "invalid": "ā´…ā´¸ā´žā´§āĩā´ĩā´žā´Ŗāĩ", + "complete": "Validation complete" }, "signer": "ā´’ā´Ēāĩā´Ēā´ŋⴟāĩā´Ÿā´¯ā´žāĩž", "date": "ā´¤āĩ€ā´¯ā´¤ā´ŋ", @@ -1284,40 +3124,122 @@ "version": "ā´Ēā´¤ā´ŋā´Ēāĩā´Ēāĩ", "keyUsage": "ā´•āĩ€ ā´‰ā´Ēā´¯āĩ‹ā´—ā´‚", "selfSigned": "ā´¸āĩā´ĩⴝⴂ ā´’ā´Ēāĩā´Ēā´ŋⴟāĩā´Ÿā´¤āĩ", - "bits": "ā´Ŧā´ŋā´ąāĩā´ąāĩā´•āĩž" + "bits": "ā´Ŧā´ŋā´ąāĩā´ąāĩā´•āĩž", + "details": "Certificate Details" }, "signature": { "info": "ā´’ā´Ēāĩā´Ēāĩ ā´ĩā´ŋā´ĩā´°ā´™āĩā´™āĩž", "_value": "ā´’ā´Ēāĩā´Ēāĩ", "mathValid": "ā´’ā´Ēāĩā´Ēāĩ ā´—ā´Ŗā´ŋā´¤ā´ļā´žā´¸āĩā´¤āĩā´°ā´Ēā´°ā´Žā´žā´¯ā´ŋ ā´¸ā´žā´§āĩā´ĩā´žā´Ŗāĩ ā´Ēā´•āĩā´ˇāĩ‡:" }, - "selectCustomCert": "ⴇⴎāĩā´Ÿā´žā´¨āĩā´¸āĩƒā´¤ ā´¸āĩŧⴟāĩā´Ÿā´ŋā´Ģā´ŋā´•āĩā´•ā´ąāĩā´ąāĩ ā´Ģā´¯āĩŊ X.509 (ā´“ā´Ēāĩā´ˇā´ŖāĩŊ)" - }, - "replace-color": { - "title": "ā´¨ā´ŋā´ąā´‚-ā´Žā´žā´ąāĩā´ąāĩā´•-ā´ĩā´ŋā´Ēā´°āĩ€ā´¤ā´Žā´žā´•āĩā´•āĩā´•", - "header": "PDF-ā´˛āĩ† ā´¨ā´ŋā´ąā´‚ ā´Žā´žā´ąāĩā´ąāĩā´•-ā´ĩā´ŋā´Ēā´°āĩ€ā´¤ā´Žā´žā´•āĩā´•āĩā´•", - "selectText": { - "1": "ā´¨ā´ŋā´ąā´‚ ā´Žā´žā´ąāĩā´ąāĩā´¨āĩā´¨ā´¤ā´ŋā´¨āĩ‹ ā´ĩā´ŋā´Ēā´°āĩ€ā´¤ā´Žā´žā´•āĩā´•āĩā´¨āĩā´¨ā´¤ā´ŋā´¨āĩ‹ ⴉⴺāĩā´ŗ ā´“ā´Ēāĩā´ˇā´¨āĩā´•āĩž", - "2": "ā´¸āĩā´Ĩā´ŋā´°ā´¸āĩā´Ĩā´ŋā´¤ā´ŋ (ā´¸āĩā´Ĩā´ŋā´°ā´¸āĩā´Ĩā´ŋā´¤ā´ŋ ⴉⴝāĩŧā´¨āĩā´¨ ā´•āĩ‹āĩēⴟāĩā´°ā´žā´¸āĩā´ąāĩā´ąāĩ ā´¨ā´ŋā´ąā´™āĩā´™āĩž)", - "3": "ⴇⴎāĩā´Ÿā´žā´¨āĩā´¸āĩƒā´¤ā´‚ (ⴇⴎāĩā´Ÿā´žā´¨āĩā´¸āĩƒā´¤ā´Žā´žā´•āĩā´•ā´ŋā´¯ ā´¨ā´ŋā´ąā´™āĩā´™āĩž)", - "4": "ā´Ēāĩ‚āĩŧā´Ŗāĩā´Ŗ-ā´ĩā´ŋā´Ēā´°āĩ€ā´¤ā´‚ (ā´Žā´˛āĩā´˛ā´ž ā´¨ā´ŋā´ąā´™āĩā´™ā´ŗāĩā´‚ ā´ĩā´ŋā´Ēā´°āĩ€ā´¤ā´Žā´žā´•āĩā´•āĩā´•)", - "5": "ⴉⴝāĩŧā´¨āĩā´¨ ā´•āĩ‹āĩēⴟāĩā´°ā´žā´¸āĩā´ąāĩā´ąāĩ ā´ĩāĩŧā´Ŗāĩā´Ŗ ā´“ā´Ēāĩā´ˇā´¨āĩā´•āĩž", - "6": "ā´•ā´ąāĩā´¤āĩā´¤ ā´Ēā´ļāĩā´šā´žā´¤āĩā´¤ā´˛ā´¤āĩā´¤ā´ŋāĩŊ ā´ĩāĩ†ā´ŗāĩā´¤āĩā´¤ ⴟāĩ†ā´•āĩā´¸āĩā´ąāĩā´ąāĩ", - "7": "ā´ĩāĩ†ā´ŗāĩā´¤āĩā´¤ ā´Ēā´ļāĩā´šā´žā´¤āĩā´¤ā´˛ā´¤āĩā´¤ā´ŋāĩŊ ā´•ā´ąāĩā´¤āĩā´¤ ⴟāĩ†ā´•āĩā´¸āĩā´ąāĩā´ąāĩ", - "8": "ā´•ā´ąāĩā´¤āĩā´¤ ā´Ēā´ļāĩā´šā´žā´¤āĩā´¤ā´˛ā´¤āĩā´¤ā´ŋāĩŊ ā´Žā´žāĩā´ž ⴟāĩ†ā´•āĩā´¸āĩā´ąāĩā´ąāĩ", - "9": "ā´•ā´ąāĩā´¤āĩā´¤ ā´Ēā´ļāĩā´šā´žā´¤āĩā´¤ā´˛ā´¤āĩā´¤ā´ŋāĩŊ ā´Ēⴚāĩā´š ⴟāĩ†ā´•āĩā´¸āĩā´ąāĩā´ąāĩ", - "10": "ⴟāĩ†ā´•āĩā´¸āĩā´ąāĩā´ąāĩ ā´¨ā´ŋā´ąā´‚ ā´¤ā´ŋā´°ā´žāĩā´žāĩ†ā´Ÿāĩā´•āĩā´•āĩā´•", - "11": "ā´Ēā´ļāĩā´šā´žā´¤āĩā´¤ā´˛ ā´¨ā´ŋā´ąā´‚ ā´¤ā´ŋā´°ā´žāĩā´žāĩ†ā´Ÿāĩā´•āĩā´•āĩā´•" + "selectCustomCert": "ⴇⴎāĩā´Ÿā´žā´¨āĩā´¸āĩƒā´¤ ā´¸āĩŧⴟāĩā´Ÿā´ŋā´Ģā´ŋā´•āĩā´•ā´ąāĩā´ąāĩ ā´Ģā´¯āĩŊ X.509 (ā´“ā´Ēāĩā´ˇā´ŖāĩŊ)", + "downloadCsv": "Download CSV", + "downloadJson": "Download JSON", + "downloadPdf": "Download PDF Report", + "downloadType": { + "csv": "CSV", + "json": "JSON", + "pdf": "PDF" }, - "submit": "ā´Žā´žā´ąāĩā´ąāĩā´•" + "error": { + "allFailed": "Unable to validate the selected files.", + "partial": "Some files could not be validated.", + "reportGeneration": "Could not generate the PDF report. JSON and CSV are available.", + "unexpected": "Unexpected error during validation." + }, + "finalizing": "Preparing downloads...", + "issue": { + "certExpired": "Certificate expired", + "certRevocationUnknown": "Certificate revocation status unknown", + "certRevoked": "Certificate revoked", + "chainInvalid": "Certificate chain invalid", + "signatureInvalid": "Signature cryptographic check failed", + "trustInvalid": "Certificate not trusted" + }, + "noResults": "Run the validation to generate a report.", + "noSignaturesShort": "No signatures", + "processing": "Validating signatures...", + "report": { + "continued": "Continued", + "downloads": "Downloads", + "entryLabel": "Signature Summary", + "fields": { + "created": "Created", + "fileSize": "File Size", + "signatureCount": "Total Signatures", + "signatureDate": "Signature Date" + }, + "filesEvaluated": "{{count}} files evaluated", + "footer": "Validated via Stirling PDF", + "generatedAt": "Generated", + "noPdf": "PDF report will be available after a successful validation.", + "page": "Page", + "shortTitle": "Signature Summary", + "signatureCountLabel": "{{count}} signatures", + "signaturesFound": "{{count}} signatures detected", + "signaturesValid": "{{count}} fully valid", + "title": "Signature Validation Report" + }, + "settings": { + "certHint": "Upload a trusted X.509 certificate to validate against a custom trust source.", + "title": "Validation Settings" + }, + "signatureDate": "Signature Date", + "totalSignatures": "Total Signatures" }, - "replaceColorPdf": { - "tags": "ā´¨ā´ŋā´ąā´‚ ā´Žā´žā´ąāĩā´ąāĩā´•,ā´Ēāĩ‡ā´œāĩ ā´Ēāĩā´°ā´ĩāĩŧā´¤āĩā´¤ā´¨ā´™āĩā´™āĩž,ā´Ŧā´žā´•āĩā´•āĩ ā´Žāĩģā´Ąāĩ,ā´¸āĩ†āĩŧā´ĩāĩŧ ā´¸āĩˆā´Ąāĩ" + "replaceColor": { + "tags": "Replace Colour,Page operations,Back end,server side", + "labels": { + "settings": "Settings", + "colourOperation": "Colour operation" + }, + "options": { + "highContrast": "High contrast", + "invertAll": "Invert all colours", + "custom": "Custom", + "cmyk": "Convert to CMYK" + }, + "tooltip": { + "header": { + "title": "Replace & Invert Colour Settings Overview" + }, + "description": { + "title": "Description", + "text": "Transform PDF colours to improve readability and accessibility. Choose from high contrast presets, invert all colours, or create custom colour schemes." + }, + "highContrast": { + "title": "High Contrast", + "text": "Apply predefined high contrast colour combinations designed for better readability and accessibility compliance.", + "bullet1": "White text on black background - Classic dark mode", + "bullet2": "Black text on white background - Standard high contrast", + "bullet3": "Yellow text on black background - High visibility option", + "bullet4": "Green text on black background - Alternative high contrast" + }, + "invertAll": { + "title": "Invert All Colours", + "text": "Completely invert all colours in the PDF, creating a negative-like effect. Useful for creating dark mode versions of documents or reducing eye strain in low-light conditions." + }, + "custom": { + "title": "Custom Colours", + "text": "Define your own text and background colours using the colour pickers. Perfect for creating branded documents or specific accessibility requirements.", + "bullet1": "Text colour - Choose the colour for text elements", + "bullet2": "Background colour - Set the background colour for the document" + }, + "cmyk": { + "title": "Convert to CMYK", + "text": "Convert the PDF from RGB colour space to CMYK colour space, optimized for professional printing. This process converts colours to the Cyan, Magenta, Yellow, Black model used by printers." + } + }, + "error": { + "failed": "An error occurred while processing the colour replacement." + } }, "login": { "title": "ā´¸āĩˆāĩģ ā´‡āĩģ ⴚāĩ†ā´¯āĩā´¯āĩā´•", "header": "ā´¸āĩˆāĩģ ā´‡āĩģ ⴚāĩ†ā´¯āĩā´¯āĩā´•", "signin": "ā´¸āĩˆāĩģ ā´‡āĩģ ⴚāĩ†ā´¯āĩā´¯āĩā´•", + "signInWith": "Sign in with", + "signInAnonymously": "Sign Up as a Guest", "rememberme": "ā´Žā´¨āĩā´¨āĩ† ā´“āĩŧā´•āĩā´•āĩā´•", "invalid": "ā´…ā´¸ā´žā´§āĩā´ĩā´žā´¯ ā´‰ā´Ēā´¯āĩ‹ā´•āĩā´¤āĩƒā´¨ā´žā´Žā´‚ ā´…ā´˛āĩā´˛āĩ†ā´™āĩā´•ā´ŋāĩŊ ā´Ēā´žā´¸āĩâ€Œā´ĩāĩ‡ā´Ąāĩ.", "locked": "ā´¨ā´ŋā´™āĩā´™ā´ŗāĩā´Ÿāĩ† ā´…ā´•āĩā´•āĩ—ā´Ŗāĩā´Ÿāĩ ā´˛āĩ‹ā´•āĩā´•āĩ ⴚāĩ†ā´¯āĩā´¤ā´ŋā´°ā´ŋā´•āĩā´•āĩā´¨āĩā´¨āĩ.", @@ -1336,12 +3258,83 @@ "alreadyLoggedIn": "ā´¨ā´ŋā´™āĩā´™āĩž ⴇⴤā´ŋⴍⴕⴂ ā´˛āĩ‹ā´—ā´ŋāĩģ ⴚāĩ†ā´¯āĩā´¤ā´ŋⴟāĩā´Ÿāĩā´Ŗāĩā´Ÿāĩ", "alreadyLoggedIn2": "ā´‰ā´Ēā´•ā´°ā´Ŗā´™āĩā´™ā´ŗā´ŋāĩŊ. ā´Ļā´¯ā´ĩā´žā´¯ā´ŋ ā´‰ā´Ēā´•ā´°ā´Ŗā´™āĩā´™ā´ŗā´ŋāĩŊ ā´¨ā´ŋā´¨āĩā´¨āĩ ā´˛āĩ‹ā´—āĩ ā´”ā´Ÿāĩā´Ÿāĩ ⴚāĩ†ā´¯āĩā´¤āĩ ā´ĩāĩ€ā´Ŗāĩā´Ÿāĩā´‚ ā´ļāĩā´°ā´Žā´ŋā´•āĩā´•āĩā´•.", "toManySessions": "ā´¨ā´ŋā´™āĩā´™āĩžā´•āĩā´•āĩ ā´ĩā´ŗā´°āĩ†ā´¯ā´§ā´ŋā´•ā´‚ ⴏⴜāĩ€ā´ĩ ā´¸āĩ†ā´ˇā´¨āĩā´•āĩž ⴉ⴪āĩā´Ÿāĩ", - "logoutMessage": "ā´¨ā´ŋā´™āĩā´™āĩž ā´˛āĩ‹ā´—āĩ ā´”ā´Ÿāĩā´Ÿāĩ ⴚāĩ†ā´¯āĩā´¤āĩ." + "logoutMessage": "ā´¨ā´ŋā´™āĩā´™āĩž ā´˛āĩ‹ā´—āĩ ā´”ā´Ÿāĩā´Ÿāĩ ⴚāĩ†ā´¯āĩā´¤āĩ.", + "youAreLoggedIn": "You are logged in!", + "email": "Email", + "password": "Password", + "enterEmail": "Enter your email", + "enterPassword": "Enter your password", + "loggingIn": "Logging In...", + "username": "Username", + "enterUsername": "Enter username", + "useEmailInstead": "Login with email", + "forgotPassword": "Forgot your password?", + "logIn": "Log In", + "signingIn": "Signing in...", + "login": "Login", + "or": "Or", + "useMagicLink": "Use magic link instead", + "enterEmailForMagicLink": "Enter your email for magic link", + "sending": "Sendingâ€Ļ", + "sendMagicLink": "Send Magic Link", + "cancel": "Cancel", + "dontHaveAccount": "Don't have an account? Sign up", + "home": "Home", + "debug": "Debug", + "signOut": "Sign Out", + "pleaseEnterBoth": "Please enter both email and password", + "pleaseEnterEmail": "Please enter your email address", + "magicLinkSent": "Magic link sent to {{email}}! Check your email and click the link to sign in.", + "passwordResetSent": "Password reset link sent to {{email}}! Check your email and follow the instructions.", + "failedToSignIn": "Failed to sign in with {{provider}}: {{message}}", + "unexpectedError": "Unexpected error: {{message}}", + "accountCreatedSuccess": "Account created successfully! You can now sign in.", + "passwordChangedSuccess": "Password changed successfully! Please sign in with your new password.", + "credentialsUpdated": "Your credentials have been updated. Please sign in again." + }, + "signup": { + "title": "Create an account", + "subtitle": "Join Stirling PDF to get started", + "name": "Name", + "email": "Email", + "password": "Password", + "confirmPassword": "Confirm password", + "enterName": "Enter your name", + "enterEmail": "Enter your email", + "enterPassword": "Enter your password", + "confirmPasswordPlaceholder": "Confirm password", + "or": "or", + "creatingAccount": "Creating Account...", + "signUp": "Sign Up", + "alreadyHaveAccount": "Already have an account? Sign in", + "pleaseFillAllFields": "Please fill in all fields", + "passwordsDoNotMatch": "Passwords do not match", + "passwordTooShort": "Password must be at least 6 characters long", + "invalidEmail": "Please enter a valid email address", + "checkEmailConfirmation": "Check your email for a confirmation link to complete your registration.", + "accountCreatedSuccessfully": "Account created successfully! You can now sign in.", + "unexpectedError": "Unexpected error: {{message}}", + "useEmailInstead": "Use Email Instead", + "nameRequired": "Name is required", + "emailRequired": "Email is required", + "passwordRequired": "Password is required", + "confirmPasswordRequired": "Please confirm your password" }, "pdfToSinglePage": { "title": "PDF ā´’ā´°āĩŠā´ąāĩā´ą ā´Ēāĩ‡ā´œā´ŋā´˛āĩ‡ā´•āĩā´•āĩ", "header": "PDF ā´’ā´°āĩŠā´ąāĩā´ą ā´Ēāĩ‡ā´œā´ŋā´˛āĩ‡ā´•āĩā´•āĩ", - "submit": "ā´’ā´°āĩŠā´ąāĩā´ą ā´Ēāĩ‡ā´œā´ŋā´˛āĩ‡ā´•āĩā´•āĩ ā´Žā´žā´ąāĩā´ąāĩā´•" + "submit": "ā´’ā´°āĩŠā´ąāĩā´ą ā´Ēāĩ‡ā´œā´ŋā´˛āĩ‡ā´•āĩā´•āĩ ā´Žā´žā´ąāĩā´ąāĩā´•", + "description": "This tool will merge all pages of your PDF into one large single page. The width will remain the same as the original pages, but the height will be the sum of all page heights.", + "filenamePrefix": "single_page", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst converting to single page." + }, + "results": { + "title": "Single Page Results" + } }, "pageExtracter": { "title": "ā´Ēāĩ‡ā´œāĩā´•āĩž ā´ĩāĩ‡āĩŧā´¤ā´ŋā´°ā´ŋⴚāĩā´šāĩ†ā´Ÿāĩā´•āĩā´•āĩā´•", @@ -1365,18 +3358,59 @@ "adjustContrast": { "title": "ā´•āĩ‹āĩēⴟāĩā´°ā´žā´¸āĩā´ąāĩā´ąāĩ ā´•āĩā´°ā´Žāĩ€ā´•ā´°ā´ŋā´•āĩā´•āĩā´•", "header": "ā´•āĩ‹āĩēⴟāĩā´°ā´žā´¸āĩā´ąāĩā´ąāĩ ā´•āĩā´°ā´Žāĩ€ā´•ā´°ā´ŋā´•āĩā´•āĩā´•", + "basic": "Basic Adjustments", "contrast": "ā´•āĩ‹āĩēⴟāĩā´°ā´žā´¸āĩā´ąāĩā´ąāĩ:", "brightness": "ā´¤āĩ†ā´ŗā´ŋⴚāĩā´šā´‚:", "saturation": "ā´¸ā´žā´šāĩā´šāĩā´ąāĩ‡ā´ˇāĩģ:", - "download": "ā´Ąāĩ—āĩēā´˛āĩ‹ā´Ąāĩ ⴚāĩ†ā´¯āĩā´¯āĩā´•" + "download": "ā´Ąāĩ—āĩēā´˛āĩ‹ā´Ąāĩ ⴚāĩ†ā´¯āĩā´¯āĩā´•", + "adjustColors": "Adjust Colors", + "blue": "Blue", + "confirm": "Confirm", + "error": { + "failed": "Failed to adjust colors/contrast" + }, + "green": "Green", + "noPreview": "Select a PDF to preview", + "red": "Red", + "results": { + "title": "Adjusted PDF" + } }, "compress": { "title": "ā´•ā´‚ā´Ēāĩā´°ā´¸āĩ ⴚāĩ†ā´¯āĩā´¯āĩā´•", + "desc": "Compress PDFs to reduce their file size.", "header": "PDF ā´•ā´‚ā´Ēāĩā´°ā´¸āĩ ⴚāĩ†ā´¯āĩā´¯āĩā´•", + "method": { + "title": "Compression Method", + "quality": "Quality", + "filesize": "File Size" + }, "credit": "ⴈ ā´¸āĩ‡ā´ĩⴍⴂ PDF ā´•ā´‚ā´Ēāĩā´°ā´¸āĩ/ā´’ā´Ēāĩā´ąāĩā´ąā´ŋā´Žāĩˆā´¸āĩ‡ā´ˇā´¨ā´žā´¯ā´ŋ qpdf ā´‰ā´Ēā´¯āĩ‹ā´—ā´ŋā´•āĩā´•āĩā´¨āĩā´¨āĩ.", "grayscale": { "label": "ā´•ā´‚ā´Ēāĩā´°ā´ˇā´¨ā´žā´¯ā´ŋ ā´—āĩā´°āĩ‡ā´¸āĩâ€Œā´•āĩ†ā´¯ā´ŋāĩŊ ā´Ēāĩā´°ā´¯āĩ‹ā´—ā´ŋā´•āĩā´•āĩā´•" }, + "tooltip": { + "header": { + "title": "Compress Settings Overview" + }, + "description": { + "title": "Description", + "text": "Compression is an easy way to reduce your file size. Pick File Size to enter a target size and have us adjust quality for you. Pick Quality to set compression strength manually." + }, + "qualityAdjustment": { + "title": "Quality Adjustment", + "text": "Drag the slider to adjust the compression strength. Lower values (1-3) preserve quality but result in larger files. Higher values (7-9) shrink the file more but reduce image clarity.", + "bullet1": "Lower values preserve quality", + "bullet2": "Higher values reduce file size" + }, + "grayscale": { + "title": "Grayscale", + "text": "Select this option to convert all images to black and white, which can significantly reduce file size especially for scanned PDFs or image-heavy documents." + } + }, + "error": { + "failed": "An error occurred while compressing the PDF." + }, "selectText": { "1": { "_value": "ā´•ā´‚ā´Ēāĩā´°ā´ˇāĩģ ā´•āĩā´°ā´Žāĩ€ā´•ā´°ā´Ŗā´™āĩā´™āĩž", @@ -1487,7 +3521,13 @@ "title": "ⴚā´ŋā´¤āĩā´°ā´‚ ā´¨āĩ€ā´•āĩā´•ā´‚ ⴚāĩ†ā´¯āĩā´¯āĩā´•", "header": "ⴚā´ŋā´¤āĩā´°ā´‚ ā´¨āĩ€ā´•āĩā´•ā´‚ ⴚāĩ†ā´¯āĩā´¯āĩā´•", "removeImage": "ⴚā´ŋā´¤āĩā´°ā´‚ ā´¨āĩ€ā´•āĩā´•ā´‚ ⴚāĩ†ā´¯āĩā´¯āĩā´•", - "submit": "ⴚā´ŋā´¤āĩā´°ā´‚ ā´¨āĩ€ā´•āĩā´•ā´‚ ⴚāĩ†ā´¯āĩā´¯āĩā´•" + "submit": "ⴚā´ŋā´¤āĩā´°ā´‚ ā´¨āĩ€ā´•āĩā´•ā´‚ ⴚāĩ†ā´¯āĩā´¯āĩā´•", + "error": { + "failed": "Failed to remove images from the PDF." + }, + "results": { + "title": "Remove Images Results" + } }, "splitByChapters": { "title": "ā´…ā´§āĩā´¯ā´žā´¯ā´™āĩā´™āĩž ā´…ā´¨āĩā´¸ā´°ā´ŋⴚāĩā´šāĩ PDF ā´ĩā´ŋⴭⴜā´ŋā´•āĩā´•āĩā´•", @@ -1521,6 +3561,12 @@ }, "note": "ā´ąā´ŋā´˛āĩ€ā´¸āĩ ā´•āĩā´ąā´ŋā´Ēāĩā´Ēāĩā´•āĩž ⴇⴂⴗāĩā´˛āĩ€ā´ˇā´ŋāĩŊ ā´Žā´žā´¤āĩā´°ā´Žāĩ‡ ⴞⴭāĩā´¯ā´Žā´žā´•āĩ‚" }, + "swagger": { + "title": "API Documentation", + "header": "API Documentation", + "desc": "View and test the Stirling PDF API endpoints", + "tags": "api,documentation,swagger,endpoints,development" + }, "cookieBanner": { "popUp": { "title": "ā´žā´™āĩā´™āĩž ā´•āĩā´•āĩā´•ā´ŋā´•āĩž ā´Žā´™āĩā´™ā´¨āĩ† ā´‰ā´Ēā´¯āĩ‹ā´—ā´ŋā´•āĩā´•āĩā´¨āĩā´¨āĩ", @@ -1556,6 +3602,1747 @@ "title": "ⴅⴍⴞā´ŋā´ąāĩā´ąā´ŋā´•āĩā´¸āĩ", "description": "ā´žā´™āĩā´™ā´ŗāĩā´Ÿāĩ† ⴟāĩ‚ā´ŗāĩā´•āĩž ā´Žā´™āĩā´™ā´¨āĩ† ā´‰ā´Ēā´¯āĩ‹ā´—ā´ŋā´•āĩā´•āĩā´¨āĩā´¨āĩā´ĩāĩ†ā´¨āĩā´¨āĩ ā´Žā´¨ā´¸āĩā´¸ā´ŋā´˛ā´žā´•āĩā´•ā´žāĩģ ⴈ ā´•āĩā´•āĩā´•ā´ŋā´•āĩž ā´žā´™āĩā´™ā´ŗāĩ† ā´¸ā´šā´žā´¯ā´ŋā´•āĩā´•āĩā´¨āĩā´¨āĩ, ā´…ā´¤ā´ŋā´¨ā´žāĩŊ ā´žā´™āĩā´™ā´ŗāĩā´Ÿāĩ† ā´•ā´Žāĩā´Žāĩā´¯āĩ‚ā´Ŗā´ŋā´ąāĩā´ąā´ŋ ā´ā´ąāĩā´ąā´ĩāĩā´‚ ā´•āĩ‚ā´Ÿāĩā´¤āĩŊ ā´ĩā´ŋā´˛ā´Žā´¤ā´ŋā´•āĩā´•āĩā´¨āĩā´¨ ā´Ģāĩ€ā´šāĩā´šā´ąāĩā´•āĩž ā´¨ā´ŋāĩŧā´Žāĩā´Žā´ŋā´•āĩā´•āĩā´¨āĩā´¨ā´¤ā´ŋāĩŊ ā´žā´™āĩā´™āĩžā´•āĩā´•āĩ ā´ļāĩā´°ā´Ļāĩā´§ ā´•āĩ‡ā´¨āĩā´Ļāĩā´°āĩ€ā´•ā´°ā´ŋā´•āĩā´•ā´žāĩģ ā´•ā´´ā´ŋā´¯āĩā´‚. ā´‰ā´ąā´Ēāĩā´Ēā´žā´•āĩā´•āĩā´•â€”ā´¸āĩā´ąāĩā´ąāĩ†āĩŧā´˛ā´ŋā´‚ā´—āĩ PDF-ā´¨āĩ ā´¨ā´ŋā´™āĩā´™āĩž ā´Ēāĩā´°ā´ĩāĩŧā´¤āĩā´¤ā´ŋā´•āĩā´•āĩā´¨āĩā´¨ ā´Ēāĩā´°ā´Žā´žā´Ŗā´™āĩā´™ā´ŗāĩā´Ÿāĩ† ⴉⴺāĩā´ŗā´Ÿā´•āĩā´•ā´‚ ⴟāĩā´°ā´žā´•āĩā´•āĩ ⴚāĩ†ā´¯āĩā´¯ā´žāĩģ ā´•ā´´ā´ŋā´¯ā´ŋā´˛āĩā´˛, ā´’ā´°ā´ŋā´•āĩā´•ā´˛āĩā´‚ ā´•ā´´ā´ŋā´¯ā´ŋā´˛āĩā´˛." } + }, + "services": { + "posthog": "PostHog Analytics", + "scarf": "Scarf Pixel" } + }, + "removeMetadata": { + "submit": "Remove Metadata" + }, + "sidebar": { + "toggle": "Toggle Sidebar" + }, + "theme": { + "toggle": "Toggle Theme" + }, + "view": { + "viewer": "Viewer", + "pageEditor": "Page Editor", + "fileManager": "File Manager" + }, + "pageEditor": { + "title": "Page Editor", + "save": "Save Changes", + "noPdfLoaded": "No PDF loaded. Please upload a PDF to edit.", + "rotatedLeft": "Rotated left:", + "rotatedRight": "Rotated right:", + "deleted": "Deleted:", + "movedLeft": "Moved left:", + "movedRight": "Moved right:", + "splitAt": "Split at:", + "insertedPageBreak": "Inserted page break at:", + "addFileNotImplemented": "Add file not implemented in demo", + "closePdf": "Close PDF", + "reset": "Reset Changes", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "fitToWidth": "Fit to Width", + "actualSize": "Actual Size" + }, + "viewer": { + "firstPage": "First Page", + "lastPage": "Last Page", + "previousPage": "Previous Page", + "nextPage": "Next Page", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "singlePageView": "Single Page View", + "dualPageView": "Dual Page View" + }, + "rightRail": { + "closeSelected": "Close Selected Files", + "selectAll": "Select All", + "deselectAll": "Deselect All", + "selectByNumber": "Select by Page Numbers", + "deleteSelected": "Delete Selected Pages", + "closePdf": "Close PDF", + "exportAll": "Export PDF", + "downloadSelected": "Download Selected Files", + "downloadAll": "Download All", + "toggleTheme": "Toggle Theme", + "language": "Language", + "search": "Search PDF", + "panMode": "Pan Mode", + "rotateLeft": "Rotate Left", + "rotateRight": "Rotate Right", + "toggleSidebar": "Toggle Sidebar", + "exportSelected": "Export Selected Pages", + "toggleAnnotations": "Toggle Annotations Visibility", + "annotationMode": "Toggle Annotation Mode", + "draw": "Draw", + "save": "Save" + }, + "search": { + "title": "Search PDF", + "placeholder": "Enter search term...", + "noResults": "No results found", + "searching": "Searching..." + }, + "guestBanner": { + "title": "You're using Stirling PDF as a guest!", + "message": "Create a free account to save your work, access more features, and support the project.", + "dismiss": "Dismiss banner", + "signUp": "Sign Up Free" + }, + "toolPicker": { + "searchPlaceholder": "Search tools...", + "noToolsFound": "No tools found", + "allTools": "ALL TOOLS", + "quickAccess": "QUICK ACCESS", + "categories": { + "standardTools": "Standard Tools", + "advancedTools": "Advanced Tools", + "recommendedTools": "Recommended Tools" + }, + "subcategories": { + "signing": "Signing", + "documentSecurity": "Document Security", + "verification": "Verification", + "documentReview": "Document Review", + "pageFormatting": "Page Formatting", + "extraction": "Extraction", + "removal": "Removal", + "automation": "Automation", + "general": "General", + "advancedFormatting": "Advanced Formatting", + "developerTools": "Developer Tools" + } + }, + "quickAccess": { + "read": "Read", + "sign": "Sign", + "automate": "Automate", + "files": "Files", + "activity": "Activity", + "help": "Help", + "account": "Account", + "config": "Config", + "adminSettings": "Admin Settings", + "allTools": "All Tools" + }, + "admin": { + "error": "Error", + "success": "Success", + "expand": "Expand", + "close": "Close", + "status": { + "active": "Active", + "inactive": "Inactive" + }, + "settings": { + "title": "Admin Settings", + "workspace": "Workspace", + "fetchError": "Failed to load settings", + "saveError": "Failed to save settings", + "saved": "Settings saved successfully", + "saveSuccess": "Settings saved successfully", + "save": "Save Changes", + "restartRequired": "Restart Required", + "restart": { + "title": "Restart Required", + "message": "Settings have been saved successfully. A server restart is required for the changes to take effect.", + "question": "Would you like to restart the server now or later?", + "now": "Restart Now", + "later": "Restart Later" + }, + "restarting": "Restarting Server", + "restartingMessage": "The server is restarting. Please wait a moment...", + "restartError": "Failed to restart server. Please restart manually.", + "general": { + "title": "System Settings", + "description": "Configure system-wide application settings including branding and default behaviour.", + "ui": "User Interface", + "system": "System", + "appName": { + "label": "Application Name", + "description": "The name displayed in the browser tab and home page" + }, + "appNameNavbar": { + "label": "Navbar Brand", + "description": "The name displayed in the navigation bar" + }, + "homeDescription": { + "label": "Home Description", + "description": "The description text shown on the home page" + }, + "defaultLocale": { + "label": "Default Locale", + "description": "The default language for new users (e.g., en_US, es_ES)" + }, + "fileUploadLimit": { + "label": "File Upload Limit", + "description": "Maximum file upload size (e.g., 100MB, 1GB)" + }, + "showUpdate": { + "label": "Show Update Notifications", + "description": "Display notifications when a new version is available" + }, + "showUpdateOnlyAdmin": { + "label": "Show Updates to Admins Only", + "description": "Restrict update notifications to admin users only" + }, + "customHTMLFiles": { + "label": "Custom HTML Files", + "description": "Allow serving custom HTML files from the customFiles directory" + }, + "languages": { + "label": "Available Languages", + "description": "Languages that users can select from (leave empty to enable all languages)" + }, + "customMetadata": { + "label": "Custom Metadata", + "autoUpdate": { + "label": "Auto Update Metadata", + "description": "Automatically update PDF metadata on all processed documents" + }, + "author": { + "label": "Default Author", + "description": "Default author for PDF metadata (e.g., username)" + }, + "creator": { + "label": "Default Creator", + "description": "Default creator for PDF metadata" + }, + "producer": { + "label": "Default Producer", + "description": "Default producer for PDF metadata" + } + }, + "customPaths": { + "label": "Custom Paths", + "description": "Configure custom file system paths for pipeline processing and external tools", + "pipeline": { + "label": "Pipeline Directories", + "watchedFoldersDir": { + "label": "Watched Folders Directory", + "description": "Directory where pipeline monitors for incoming PDFs (leave empty for default: /pipeline/watchedFolders)" + }, + "finishedFoldersDir": { + "label": "Finished Folders Directory", + "description": "Directory where processed PDFs are outputted (leave empty for default: /pipeline/finishedFolders)" + } + }, + "operations": { + "label": "External Tool Paths", + "weasyprint": { + "label": "WeasyPrint Executable", + "description": "Path to WeasyPrint executable for HTML to PDF conversion (leave empty for default: /opt/venv/bin/weasyprint)" + }, + "unoconvert": { + "label": "Unoconvert Executable", + "description": "Path to LibreOffice unoconvert for document conversions (leave empty for default: /opt/venv/bin/unoconvert)" + } + } + } + }, + "security": { + "title": "Security", + "description": "Configure authentication, login behaviour, and security policies.", + "ssoNotice": { + "title": "Looking for SSO/SAML settings?", + "message": "OAuth2 and SAML2 authentication providers have been moved to the Connections menu for easier management." + }, + "authentication": "Authentication", + "enableLogin": { + "label": "Enable Login", + "description": "Require users to log in before accessing the application" + }, + "loginMethod": { + "label": "Login Method", + "description": "The authentication method to use for user login", + "all": "All Methods", + "normal": "Username/Password Only", + "oauth2": "OAuth2 Only", + "saml2": "SAML2 Only" + }, + "loginAttemptCount": { + "label": "Login Attempt Limit", + "description": "Maximum number of failed login attempts before account lockout" + }, + "loginResetTimeMinutes": { + "label": "Login Reset Time (minutes)", + "description": "Time before failed login attempts are reset" + }, + "csrfDisabled": { + "label": "Disable CSRF Protection", + "description": "Disable Cross-Site Request Forgery protection (not recommended)" + }, + "initialLogin": { + "label": "Initial Login", + "username": { + "label": "Initial Username", + "description": "The username for the initial admin account" + }, + "password": { + "label": "Initial Password", + "description": "The password for the initial admin account" + } + }, + "jwt": { + "label": "JWT Configuration", + "secureCookie": { + "label": "Secure Cookie", + "description": "Require HTTPS for JWT cookies (recommended for production)" + }, + "keyRetentionDays": { + "label": "Key Retention Days", + "description": "Number of days to retain old JWT keys for verification" + }, + "persistence": { + "label": "Enable Key Persistence", + "description": "Store JWT keys persistently to survive server restarts" + }, + "enableKeyRotation": { + "label": "Enable Key Rotation", + "description": "Automatically rotate JWT signing keys periodically" + }, + "enableKeyCleanup": { + "label": "Enable Key Cleanup", + "description": "Automatically remove expired JWT keys" + } + }, + "audit": { + "label": "Audit Logging", + "enabled": { + "label": "Enable Audit Logging", + "description": "Track user actions and system events for compliance and security monitoring" + }, + "level": { + "label": "Audit Level", + "description": "0=OFF, 1=BASIC, 2=STANDARD, 3=VERBOSE" + }, + "retentionDays": { + "label": "Audit Retention (days)", + "description": "Number of days to retain audit logs" + } + }, + "htmlUrlSecurity": { + "label": "HTML URL Security", + "description": "Configure URL access restrictions for HTML processing to prevent SSRF attacks", + "enabled": { + "label": "Enable URL Security", + "description": "Enable URL security restrictions for HTML to PDF conversions" + }, + "level": { + "label": "Security Level", + "description": "MAX: whitelist only, MEDIUM: block internal networks, OFF: no restrictions", + "max": "Maximum (Whitelist Only)", + "medium": "Medium (Block Internal)", + "off": "Off (No Restrictions)" + }, + "advanced": "Advanced Settings", + "allowedDomains": { + "label": "Allowed Domains (Whitelist)", + "description": "One domain per line (e.g., cdn.example.com). Only these domains allowed when level is MAX" + }, + "blockedDomains": { + "label": "Blocked Domains (Blacklist)", + "description": "One domain per line (e.g., malicious.com). Additional domains to block" + }, + "internalTlds": { + "label": "Internal TLDs", + "description": "One TLD per line (e.g., .local, .internal). Block domains with these TLD patterns" + }, + "networkBlocking": "Network Blocking", + "blockPrivateNetworks": { + "label": "Block Private Networks", + "description": "Block RFC 1918 private networks (10.x.x.x, 192.168.x.x, 172.16-31.x.x)" + }, + "blockLocalhost": { + "label": "Block Localhost", + "description": "Block localhost and loopback addresses (127.x.x.x, ::1)" + }, + "blockLinkLocal": { + "label": "Block Link-Local Addresses", + "description": "Block link-local addresses (169.254.x.x, fe80::/10)" + }, + "blockCloudMetadata": { + "label": "Block Cloud Metadata Endpoints", + "description": "Block cloud provider metadata endpoints (169.254.169.254)" + } + } + }, + "connections": { + "title": "Connections", + "description": "Configure external authentication providers like OAuth2 and SAML.", + "linkedServices": "Linked Services", + "unlinkedServices": "Unlinked Services", + "connect": "Connect", + "disconnect": "Disconnect", + "disconnected": "Provider disconnected successfully", + "disconnectError": "Failed to disconnect provider", + "ssoAutoLogin": { + "label": "SSO Auto Login", + "enable": "Enable SSO Auto Login", + "description": "Automatically redirect to SSO login when authentication is required" + }, + "oauth2": { + "label": "OAuth2", + "enabled": { + "label": "Enable OAuth2", + "description": "Allow users to authenticate using OAuth2 providers" + }, + "provider": { + "label": "Provider", + "description": "The OAuth2 provider to use for authentication" + }, + "issuer": { + "label": "Issuer URL", + "description": "The OAuth2 provider issuer URL" + }, + "clientId": { + "label": "Client ID", + "description": "The OAuth2 client ID from your provider" + }, + "clientSecret": { + "label": "Client Secret", + "description": "The OAuth2 client secret from your provider" + }, + "useAsUsername": { + "label": "Use as Username", + "description": "The OAuth2 claim to use as the username (e.g., email, sub)" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first OAuth2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via OAuth2" + }, + "scopes": { + "label": "OAuth2 Scopes", + "description": "Comma-separated list of OAuth2 scopes to request (e.g., openid, profile, email)" + } + }, + "saml2": { + "label": "SAML2", + "enabled": { + "label": "Enable SAML2", + "description": "Allow users to authenticate using SAML2 providers" + }, + "provider": { + "label": "Provider", + "description": "The SAML2 provider name" + }, + "registrationId": { + "label": "Registration ID", + "description": "The SAML2 registration identifier" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first SAML2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via SAML2" + } + } + }, + "database": { + "title": "Database", + "description": "Configure custom database connection settings for enterprise deployments.", + "configuration": "Database Configuration", + "enableCustom": { + "label": "Enable Custom Database", + "description": "Use your own custom database configuration instead of the default embedded database" + }, + "customUrl": { + "label": "Custom Database URL", + "description": "Full JDBC connection string (e.g., jdbc:postgresql://localhost:5432/postgres). If provided, individual connection settings below are not used." + }, + "type": { + "label": "Database Type", + "description": "Type of database (not used if custom URL is provided)" + }, + "hostName": { + "label": "Host Name", + "description": "Database server hostname (not used if custom URL is provided)" + }, + "port": { + "label": "Port", + "description": "Database server port (not used if custom URL is provided)" + }, + "name": { + "label": "Database Name", + "description": "Name of the database (not used if custom URL is provided)" + }, + "username": { + "label": "Username", + "description": "Database authentication username" + }, + "password": { + "label": "Password", + "description": "Database authentication password" + } + }, + "privacy": { + "title": "Privacy", + "description": "Configure privacy and data collection settings.", + "analytics": "Analytics & Tracking", + "enableAnalytics": { + "label": "Enable Analytics", + "description": "Collect anonymous usage analytics to help improve the application" + }, + "metricsEnabled": { + "label": "Enable Metrics", + "description": "Enable collection of performance and usage metrics. Provides API endpoint for admins to access metrics data" + }, + "searchEngine": "Search Engine Visibility", + "googleVisibility": { + "label": "Google Visibility", + "description": "Allow search engines to index this application" + } + }, + "advanced": { + "title": "Advanced", + "description": "Configure advanced features and experimental functionality.", + "features": "Feature Flags", + "processing": "Processing", + "endpoints": { + "label": "Endpoints", + "manage": "Manage API Endpoints", + "description": "Endpoint management is configured via YAML. See documentation for details on enabling/disabling specific endpoints." + }, + "enableAlphaFunctionality": { + "label": "Enable Alpha Features", + "description": "Enable experimental and alpha-stage features (may be unstable)" + }, + "enableUrlToPDF": { + "label": "Enable URL to PDF", + "description": "Allow conversion of web pages to PDF documents" + }, + "maxDPI": { + "label": "Maximum DPI", + "description": "Maximum DPI for image processing (0 = unlimited)" + }, + "tessdataDir": { + "label": "Tessdata Directory", + "description": "Path to the tessdata directory for OCR language files" + }, + "disableSanitize": { + "label": "Disable HTML Sanitization", + "description": "WARNING: Security risk - disabling HTML sanitization can lead to XSS vulnerabilities" + }, + "tempFileManagement": { + "label": "Temp File Management", + "description": "Configure temporary file storage and cleanup behavior", + "baseTmpDir": { + "label": "Base Temp Directory", + "description": "Base directory for temporary files (leave empty for default: java.io.tmpdir/stirling-pdf)" + }, + "libreofficeDir": { + "label": "LibreOffice Temp Directory", + "description": "Directory for LibreOffice temp files (leave empty for default: baseTmpDir/libreoffice)" + }, + "systemTempDir": { + "label": "System Temp Directory", + "description": "System temp directory to clean (only used if cleanupSystemTemp is enabled)" + }, + "prefix": { + "label": "Temp File Prefix", + "description": "Prefix for temp file names" + }, + "maxAgeHours": { + "label": "Max Age (hours)", + "description": "Maximum age in hours before temp files are cleaned up" + }, + "cleanupIntervalMinutes": { + "label": "Cleanup Interval (minutes)", + "description": "How often to run cleanup (in minutes)" + }, + "startupCleanup": { + "label": "Startup Cleanup", + "description": "Clean up old temp files on application startup" + }, + "cleanupSystemTemp": { + "label": "Cleanup System Temp", + "description": "Whether to clean broader system temp directory (use with caution)" + } + }, + "processExecutor": { + "label": "Process Executor Limits", + "description": "Configure session limits and timeouts for each process executor", + "sessionLimit": { + "label": "Session Limit", + "description": "Maximum concurrent instances" + }, + "timeout": { + "label": "Timeout (minutes)", + "description": "Maximum execution time" + }, + "libreOffice": "LibreOffice", + "pdfToHtml": "PDF to HTML", + "qpdf": "QPDF", + "tesseract": "Tesseract OCR", + "pythonOpenCv": "Python OpenCV", + "weasyPrint": "WeasyPrint", + "installApp": "Install App", + "calibre": "Calibre", + "ghostscript": "Ghostscript", + "ocrMyPdf": "OCRmyPDF" + } + }, + "mail": { + "title": "Mail Server", + "description": "Configure SMTP settings for sending email notifications.", + "smtp": "SMTP Configuration", + "enabled": { + "label": "Enable Mail", + "description": "Enable email notifications and SMTP functionality" + }, + "host": { + "label": "SMTP Host", + "description": "The hostname or IP address of your SMTP server" + }, + "port": { + "label": "SMTP Port", + "description": "The port number for SMTP connection (typically 25, 465, or 587)" + }, + "username": { + "label": "SMTP Username", + "description": "Username for SMTP authentication" + }, + "password": { + "label": "SMTP Password", + "description": "Password for SMTP authentication" + }, + "from": { + "label": "From Address", + "description": "The email address to use as the sender" + }, + "enableInvites": { + "label": "Enable Email Invites", + "description": "Allow admins to invite users via email with auto-generated passwords" + }, + "frontendUrl": { + "label": "Frontend URL", + "description": "Base URL for frontend (e.g. https://pdf.example.com). Used for generating invite links in emails. Leave empty to use backend URL." + } + }, + "legal": { + "title": "Legal Documents", + "description": "Configure links to legal documents and policies.", + "disclaimer": { + "title": "Legal Responsibility Warning", + "message": "By customizing these legal documents, you assume full responsibility for ensuring compliance with all applicable laws and regulations, including but not limited to GDPR and other EU data protection requirements. Only modify these settings if: (1) you are operating a personal/private instance, (2) you are outside EU jurisdiction and understand your local legal obligations, or (3) you have obtained proper legal counsel and accept sole responsibility for all user data and legal compliance. Stirling-PDF and its developers assume no liability for your legal obligations." + }, + "termsAndConditions": { + "label": "Terms and Conditions", + "description": "URL or filename to terms and conditions" + }, + "privacyPolicy": { + "label": "Privacy Policy", + "description": "URL or filename to privacy policy" + }, + "accessibilityStatement": { + "label": "Accessibility Statement", + "description": "URL or filename to accessibility statement" + }, + "cookiePolicy": { + "label": "Cookie Policy", + "description": "URL or filename to cookie policy" + }, + "impressum": { + "label": "Impressum", + "description": "URL or filename to impressum (required in some jurisdictions)" + } + }, + "premium": { + "title": "Premium & Enterprise", + "description": "Configure your premium or enterprise license key.", + "license": "License Configuration", + "key": { + "label": "License Key", + "description": "Enter your premium or enterprise license key" + }, + "enabled": { + "label": "Enable Premium Features", + "description": "Enable license key checks for pro/enterprise features" + }, + "movedFeatures": { + "title": "Premium Features Distributed", + "message": "Premium and Enterprise features are now organized in their respective sections:" + } + }, + "features": { + "title": "Features", + "description": "Configure optional features and functionality.", + "serverCertificate": { + "label": "Server Certificate", + "description": "Configure server-side certificate generation for \"Sign with Stirling-PDF\" functionality", + "enabled": { + "label": "Enable Server Certificate", + "description": "Enable server-side certificate for \"Sign with Stirling-PDF\" option" + }, + "organizationName": { + "label": "Organization Name", + "description": "Organization name for generated certificates" + }, + "validity": { + "label": "Certificate Validity (days)", + "description": "Number of days the certificate will be valid" + }, + "regenerateOnStartup": { + "label": "Regenerate on Startup", + "description": "Generate new certificate on each application startup" + } + } + }, + "endpoints": { + "title": "API Endpoints", + "description": "Control which API endpoints and endpoint groups are available.", + "management": "Endpoint Management", + "toRemove": { + "label": "Disabled Endpoints", + "description": "Select individual endpoints to disable" + }, + "groupsToRemove": { + "label": "Disabled Endpoint Groups", + "description": "Select endpoint groups to disable" + }, + "note": "Note: Disabling endpoints restricts API access but does not remove UI components. Restart required for changes to take effect." + } + } + }, + "fileUpload": { + "selectFile": "Select a file", + "selectFiles": "Select files", + "selectPdfToView": "Select a PDF to view", + "selectPdfToEdit": "Select a PDF to edit", + "chooseFromStorage": "Choose a file from storage or upload a new PDF", + "chooseFromStorageMultiple": "Choose files from storage or upload new PDFs", + "loadFromStorage": "Load from Storage", + "filesAvailable": "files available", + "loading": "Loading...", + "or": "or", + "dropFileHere": "Drop file here or click to upload", + "dropFilesHere": "Drop files here or click the upload button", + "pdfFilesOnly": "PDF files only", + "supportedFileTypes": "Supported file types", + "upload": "Upload", + "uploadFile": "Upload File", + "uploadFiles": "Upload Files", + "noFilesInStorage": "No files available in storage. Upload some files first.", + "selectFromStorage": "Select from Storage", + "backToTools": "Back to Tools", + "addFiles": "Add Files", + "dragFilesInOrClick": "Drag files in or click \"Add Files\" to browse" + }, + "fileEditor": { + "addFiles": "Add Files" + }, + "fileManager": { + "title": "Upload PDF Files", + "subtitle": "Add files to your storage for easy access across tools", + "filesSelected": "files selected", + "clearSelection": "Clear Selection", + "openInFileEditor": "Open in File Editor", + "uploadError": "Failed to upload some files.", + "failedToOpen": "Failed to open file. It may have been removed from storage.", + "failedToLoad": "Failed to load file to active set.", + "storageCleared": "Browser cleared storage. Files have been removed. Please re-upload.", + "clearAll": "Clear All", + "reloadFiles": "Reload Files", + "dragDrop": "Drag & Drop files here", + "clickToUpload": "Click to upload files", + "selectedFiles": "Selected Files", + "storage": "Storage", + "filesStored": "files stored", + "storageError": "Storage error occurred", + "storageLow": "Storage is running low. Consider removing old files.", + "supportMessage": "Powered by browser database storage for unlimited capacity", + "noFileSelected": "No files selected", + "showHistory": "Show History", + "hideHistory": "Hide History", + "fileHistory": "File History", + "loadingHistory": "Loading History...", + "lastModified": "Last Modified", + "toolChain": "Tools Applied", + "restore": "Restore", + "unzip": "Unzip", + "searchFiles": "Search files...", + "recent": "Recent", + "localFiles": "Local Files", + "googleDrive": "Google Drive", + "googleDriveShort": "Drive", + "myFiles": "My Files", + "noRecentFiles": "No recent files found", + "googleDriveNotAvailable": "Google Drive integration not available", + "openFiles": "Open Files", + "openFile": "Open File", + "details": "File Details", + "fileName": "Name", + "fileFormat": "Format", + "fileSize": "Size", + "fileVersion": "Version", + "totalSelected": "Total Selected", + "dropFilesHere": "Drop files here", + "selectAll": "Select All", + "deselectAll": "Deselect All", + "deleteSelected": "Delete Selected", + "downloadSelected": "Download Selected", + "selectedCount": "{{count}} selected", + "download": "Download", + "delete": "Delete", + "unsupported": "Unsupported", + "addToUpload": "Add to Upload", + "deleteAll": "Delete All", + "loadingFiles": "Loading files...", + "noFiles": "No files available", + "noFilesFound": "No files found matching your search", + "openInPageEditor": "Open in Page Editor", + "showAll": "Show All", + "sortByDate": "Sort by Date", + "sortByName": "Sort by Name", + "sortBySize": "Sort by Size" + }, + "storage": { + "temporaryNotice": "Files are stored temporarily in your browser and may be cleared automatically", + "storageLimit": "Storage limit", + "storageUsed": "Temporary Storage used", + "storageFull": "Storage is nearly full. Consider removing some files.", + "fileTooLarge": "File too large. Maximum size per file is", + "storageQuotaExceeded": "Storage quota exceeded. Please remove some files before uploading more.", + "approximateSize": "Approximate size" + }, + "sanitize": { + "title": "Sanitise", + "desc": "Remove potentially harmful elements from PDF files.", + "submit": "Sanitise PDF", + "completed": "Sanitisation completed successfully", + "error": { + "generic": "Sanitisation failed", + "failed": "An error occurred while sanitising the PDF." + }, + "filenamePrefix": "sanitised", + "sanitizationResults": "Sanitisation Results", + "steps": { + "files": "Files", + "settings": "Settings", + "results": "Results" + }, + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "options": { + "title": "Sanitisation Options", + "note": "Select the elements you want to remove from the PDF. At least one option must be selected.", + "removeJavaScript": { + "label": "Remove JavaScript", + "desc": "Remove JavaScript actions and scripts from the PDF" + }, + "removeEmbeddedFiles": { + "label": "Remove Embedded Files", + "desc": "Remove any files embedded within the PDF" + }, + "removeXMPMetadata": { + "label": "Remove XMP Metadata", + "desc": "Remove XMP metadata from the PDF" + }, + "removeMetadata": { + "label": "Remove Document Metadata", + "desc": "Remove document information metadata (title, author, etc.)" + }, + "removeLinks": { + "label": "Remove Links", + "desc": "Remove external links and launch actions from the PDF" + }, + "removeFonts": { + "label": "Remove Fonts", + "desc": "Remove embedded fonts from the PDF" + } + } + }, + "addPassword": { + "title": "ā´Ēā´žā´¸āĩâ€Œā´ĩāĩ‡ā´Ąāĩ ⴚāĩ‡āĩŧā´•āĩā´•āĩā´•", + "desc": "Encrypt your PDF document with a password.", + "completed": "Password protection applied", + "submit": "ā´Žāĩģā´•āĩā´°ā´ŋā´Ēāĩā´ąāĩā´ąāĩ ⴚāĩ†ā´¯āĩā´¯āĩā´•", + "filenamePrefix": "encrypted", + "error": { + "failed": "An error occurred while encrypting the PDF." + }, + "passwords": { + "stepTitle": "Passwords & Encryption", + "completed": "Passwords configured", + "user": { + "label": "User Password", + "placeholder": "Enter user password" + }, + "owner": { + "label": "Owner Password", + "placeholder": "Enter owner password" + } + }, + "encryption": { + "keyLength": { + "label": "Encryption Key Length", + "40bit": "40-bit (Low)", + "128bit": "128-bit (Standard)", + "256bit": "256-bit (High)" + } + }, + "results": { + "title": "Encrypted PDFs" + }, + "tooltip": { + "header": { + "title": "Password Protection Overview" + }, + "passwords": { + "title": "Password Types", + "text": "User passwords restrict opening the document, while owner passwords control what can be done with the document once opened. You can set both or just one.", + "bullet1": "User Password: Required to open the PDF", + "bullet2": "Owner Password: Controls document permissions (not supported by all PDF viewers)" + }, + "encryption": { + "title": "Encryption Levels", + "text": "Higher encryption levels provide better security but may not be supported by older PDF viewers.", + "bullet1": "40-bit: Basic security, compatible with older viewers", + "bullet2": "128-bit: Standard security, widely supported", + "bullet3": "256-bit: Maximum security, requires modern viewers" + }, + "permissions": { + "title": "Change Permissions", + "text": "These permissions control what users can do with the PDF. Most effective when combined with an owner password." + } + }, + "tags": "ā´¸āĩā´°ā´•āĩā´ˇā´ŋⴤⴂ,ā´¸āĩā´°ā´•āĩā´ˇ", + "header": "ā´Ēā´žā´¸āĩâ€Œā´ĩāĩ‡ā´Ąāĩ ⴚāĩ‡āĩŧā´•āĩā´•āĩā´• (ā´Žāĩģā´•āĩā´°ā´ŋā´Ēāĩā´ąāĩā´ąāĩ ⴚāĩ†ā´¯āĩā´¯āĩā´•)", + "selectText": { + "1": "ā´Žāĩģā´•āĩā´°ā´ŋā´Ēāĩā´ąāĩā´ąāĩ ⴚāĩ†ā´¯āĩā´¯āĩ‡ā´Ŗāĩā´Ÿ PDF ā´¤ā´ŋā´°ā´žāĩā´žāĩ†ā´Ÿāĩā´•āĩā´•āĩā´•", + "2": "ā´‰ā´Ēā´¯āĩ‹ā´•āĩā´¤āĩƒ ā´Ēā´žā´¸āĩâ€Œā´ĩāĩ‡ā´Ąāĩ", + "3": "ā´Žāĩģā´•āĩā´°ā´ŋā´Ēāĩā´ˇāĩģ ā´•āĩ€ ā´Ļāĩˆāĩŧⴘāĩā´¯ā´‚", + "4": "ⴉⴝāĩŧā´¨āĩā´¨ ā´Žāĩ‚ā´˛āĩā´¯ā´™āĩā´™āĩž ā´•āĩ‚ā´Ÿāĩā´¤āĩŊ ā´ļā´•āĩā´¤ā´Žā´žā´Ŗāĩ, ā´Žā´¨āĩā´¨ā´žāĩŊ ā´¤ā´žā´´āĩā´¨āĩā´¨ ā´Žāĩ‚ā´˛āĩā´¯ā´™āĩā´™āĩžā´•āĩā´•āĩ ā´Žā´ŋā´•ā´šāĩā´š ā´…ā´¨āĩā´¯āĩ‹ā´œāĩā´¯ā´¤ā´¯āĩā´Ŗāĩā´Ÿāĩ.", + "5": "ⴏⴜāĩā´œā´Žā´žā´•āĩā´•āĩ‡ā´Ŗāĩā´Ÿ ā´…ā´¨āĩā´Žā´¤ā´ŋā´•āĩž (ā´‰ā´Ÿā´Žā´¯āĩā´Ÿāĩ† ā´Ēā´žā´¸āĩâ€Œā´ĩāĩ‡ā´Ąā´ŋā´¨āĩŠā´Ēāĩā´Ēā´‚ ā´‰ā´Ēā´¯āĩ‹ā´—ā´ŋā´•āĩā´•ā´žāĩģ ā´ļāĩā´Ēā´žāĩŧā´ļ ⴚāĩ†ā´¯āĩā´¯āĩā´¨āĩā´¨āĩ)", + "6": "ā´Ēāĩā´°ā´Žā´žā´Ŗā´‚ ā´•āĩ‚ā´Ÿāĩā´Ÿā´ŋⴚāĩā´šāĩ‡āĩŧā´•āĩā´•āĩā´¨āĩā´¨ā´¤āĩ ⴤⴟⴝāĩā´•", + "7": "ⴉⴺāĩā´ŗā´Ÿā´•āĩā´•ā´‚ ā´ĩāĩ‡āĩŧā´¤ā´ŋā´°ā´ŋⴚāĩā´šāĩ†ā´Ÿāĩā´•āĩā´•āĩā´¨āĩā´¨ā´¤āĩ ⴤⴟⴝāĩā´•", + "8": "ⴞⴭāĩā´¯ā´¤ā´¯āĩā´•āĩā´•ā´žā´¯ā´ŋ ā´ĩāĩ‡āĩŧā´¤ā´ŋā´°ā´ŋⴚāĩā´šāĩ†ā´Ÿāĩā´•āĩā´•āĩā´¨āĩā´¨ā´¤āĩ ⴤⴟⴝāĩā´•", + "9": "ā´Ģāĩ‹ā´‚ ā´Ēāĩ‚ā´°ā´ŋā´Ēāĩā´Ēā´ŋā´•āĩā´•āĩā´¨āĩā´¨ā´¤āĩ ⴤⴟⴝāĩā´•", + "10": "ā´Ēā´°ā´ŋā´ˇāĩā´•āĩā´•ā´°ā´Ŗā´‚ ⴤⴟⴝāĩā´•", + "11": "ā´ĩāĩā´¯ā´žā´–āĩā´¯ā´žā´¨ ā´Ēā´°ā´ŋā´ˇāĩā´•āĩā´•ā´°ā´Ŗā´‚ ⴤⴟⴝāĩā´•", + "12": "ā´…ā´šāĩā´šā´Ÿā´ŋ ⴤⴟⴝāĩā´•", + "13": "ā´ĩāĩā´¯ā´¤āĩā´¯ā´¸āĩā´¤ ā´Ģāĩ‹āĩŧā´Žā´žā´ąāĩā´ąāĩā´•ā´ŗā´ŋāĩŊ ā´…ā´šāĩā´šā´Ÿā´ŋā´•āĩā´•āĩā´¨āĩā´¨ā´¤āĩ ⴤⴟⴝāĩā´•", + "14": "ā´‰ā´Ÿā´Žā´¯āĩā´Ÿāĩ† ā´Ēā´žā´¸āĩâ€Œā´ĩāĩ‡ā´Ąāĩ", + "15": "ā´Ēāĩā´°ā´Žā´žā´Ŗā´‚ ā´¤āĩā´ąā´¨āĩā´¨āĩā´•ā´´ā´ŋā´žāĩā´žā´žāĩŊ ā´Žā´¨āĩā´¤āĩā´šāĩ†ā´¯āĩā´¯ā´žāĩģ ā´•ā´´ā´ŋā´¯āĩā´Žāĩ†ā´¨āĩā´¨ā´¤āĩ ā´¨ā´ŋⴝⴍāĩā´¤āĩā´°ā´ŋā´•āĩā´•āĩā´¨āĩā´¨āĩ (ā´Žā´˛āĩā´˛ā´ž ā´ąāĩ€ā´Ąā´ąāĩā´•ā´ŗāĩā´‚ ā´Ēā´ŋā´¨āĩā´¤āĩā´Ŗā´¯āĩā´•āĩā´•āĩā´¨āĩā´¨ā´ŋā´˛āĩā´˛)", + "16": "ā´Ēāĩā´°ā´Žā´žā´Ŗā´‚ ⴤⴍāĩā´¨āĩ† ā´¤āĩā´ąā´•āĩā´•āĩā´¨āĩā´¨ā´¤āĩ ā´¨ā´ŋⴝⴍāĩā´¤āĩā´°ā´ŋā´•āĩā´•āĩā´¨āĩā´¨āĩ" + } + }, + "changePermissions": { + "title": "Change Permissions", + "desc": "Change document restrictions and permissions.", + "completed": "Permissions changed", + "submit": "Change Permissions", + "error": { + "failed": "An error occurred while changing PDF permissions." + }, + "permissions": { + "preventAssembly": { + "label": "Prevent assembly of document" + }, + "preventExtractContent": { + "label": "Prevent content extraction" + }, + "preventExtractForAccessibility": { + "label": "Prevent extraction for accessibility" + }, + "preventFillInForm": { + "label": "Prevent filling in form" + }, + "preventModify": { + "label": "Prevent modification" + }, + "preventModifyAnnotations": { + "label": "Prevent annotation modification" + }, + "preventPrinting": { + "label": "Prevent printing" + }, + "preventPrintingFaithful": { + "label": "Prevent printing different formats" + } + }, + "results": { + "title": "Modified PDFs" + }, + "tooltip": { + "header": { + "title": "Change Permissions" + }, + "description": { + "text": "Changes document permissions, allowing/disallowing access to different features in PDF readers." + }, + "warning": { + "text": "To make these permissions unchangeable, use the Add Password tool to set an owner password." + } + } + }, + "removePassword": { + "title": "ā´Ēā´žā´¸āĩâ€Œā´ĩāĩ‡ā´Ąāĩ ā´¨āĩ€ā´•āĩā´•ā´‚ ⴚāĩ†ā´¯āĩā´¯āĩā´•", + "desc": "Remove password protection from your PDF document.", + "tags": "ā´¸āĩā´°ā´•āĩā´ˇā´ŋⴤⴂ,ā´Ąāĩ€ā´•āĩā´°ā´ŋā´Ēāĩā´ąāĩā´ąāĩ,ā´¸āĩā´°ā´•āĩā´ˇ,ā´Ēā´žā´¸āĩâ€Œā´ĩāĩ‡ā´Ąāĩ ⴇⴞāĩā´˛ā´žā´¤ā´žā´•āĩā´•āĩā´•,ā´Ēā´žā´¸āĩâ€Œā´ĩāĩ‡ā´Ąāĩ ā´¨āĩ€ā´•āĩā´•ā´‚ ⴚāĩ†ā´¯āĩā´¯āĩā´•", + "password": { + "stepTitle": "Remove Password", + "label": "Current Password", + "placeholder": "Enter current password", + "completed": "Password configured" + }, + "filenamePrefix": "decrypted", + "error": { + "failed": "An error occurred while removing the password from the PDF." + }, + "tooltip": { + "description": "Removing password protection requires the password that was used to encrypt the PDF. This will decrypt the document, making it accessible without a password." + }, + "submit": "ā´¨āĩ€ā´•āĩā´•ā´‚ ⴚāĩ†ā´¯āĩā´¯āĩā´•", + "results": { + "title": "Decrypted PDFs" + }, + "header": "ā´Ēā´žā´¸āĩâ€Œā´ĩāĩ‡ā´Ąāĩ ā´¨āĩ€ā´•āĩā´•ā´‚ ⴚāĩ†ā´¯āĩā´¯āĩā´• (ā´Ąāĩ€ā´•āĩā´°ā´ŋā´Ēāĩā´ąāĩā´ąāĩ ⴚāĩ†ā´¯āĩā´¯āĩā´•)", + "selectText": { + "1": "ā´Ąāĩ€ā´•āĩā´°ā´ŋā´Ēāĩā´ąāĩā´ąāĩ ⴚāĩ†ā´¯āĩā´¯āĩ‡ā´Ŗāĩā´Ÿ PDF ā´¤ā´ŋā´°ā´žāĩā´žāĩ†ā´Ÿāĩā´•āĩā´•āĩā´•", + "2": "ā´Ēā´žā´¸āĩâ€Œā´ĩāĩ‡ā´Ąāĩ" + } + }, + "automate": { + "title": "Automate", + "desc": "Build multi-step workflows by chaining together PDF actions. Ideal for recurring tasks.", + "invalidStep": "Invalid step", + "files": { + "placeholder": "Select files to process with this automation" + }, + "selection": { + "title": "Automation Selection", + "saved": { + "title": "Saved" + }, + "createNew": { + "title": "Create New Automation" + }, + "suggested": { + "title": "Suggested" + } + }, + "creation": { + "createTitle": "Create Automation", + "editTitle": "Edit Automation", + "intro": "Automations run tools sequentially. To get started, add tools in the order you want them to run.", + "name": { + "label": "Automation Name", + "placeholder": "My Automation" + }, + "description": { + "label": "Description (optional)", + "placeholder": "Describe what this automation does..." + }, + "tools": { + "selectTool": "Select a tool...", + "selected": "Selected Tools", + "remove": "Remove tool", + "configure": "Configure tool", + "notConfigured": "! Not Configured", + "addTool": "Add Tool", + "add": "Add a tool..." + }, + "save": "Save Automation", + "unsavedChanges": { + "title": "Unsaved Changes", + "message": "You have unsaved changes. Are you sure you want to go back? All changes will be lost.", + "cancel": "Cancel", + "confirm": "Go Back" + }, + "icon": { + "label": "Icon" + } + }, + "run": { + "title": "Run Automation" + }, + "sequence": { + "unnamed": "Unnamed Automation", + "steps": "{{count}} steps", + "running": "Running Automation...", + "run": "Run Automation", + "finish": "Finish" + }, + "reviewTitle": "Automation Results", + "config": { + "loading": "Loading tool configuration...", + "noSettings": "This tool does not have configurable settings.", + "title": "Configure {{toolName}}", + "description": "Configure the settings for this tool. These settings will be applied when the automation runs.", + "cancel": "Cancel", + "save": "Save Configuration" + }, + "copyToSaved": "Copy to Saved" + }, + "automation": { + "suggested": { + "securePdfIngestion": "Secure PDF Ingestion", + "securePdfIngestionDesc": "Comprehensive PDF processing workflow that sanitises documents, applies OCR with cleanup, converts to PDF/A format for long-term archival, and optimises file size.", + "emailPreparation": "Email Preparation", + "emailPreparationDesc": "Optimises PDFs for email distribution by compressing files, splitting large documents into 20MB chunks for email compatibility, and removing metadata for privacy.", + "secureWorkflow": "Security Workflow", + "secureWorkflowDesc": "Secures PDF documents by removing potentially malicious content like JavaScript and embedded files, then adds password protection to prevent unauthorised access. Password is set to 'password' by default.", + "processImages": "Process Images", + "processImagesDesc": "Converts multiple image files into a single PDF document, then applies OCR technology to extract searchable text from the images." + } + }, + "common": { + "copy": "Copy", + "copied": "Copied!", + "refresh": "Refresh", + "retry": "Retry", + "remaining": "remaining", + "used": "used", + "available": "available", + "cancel": "Cancel", + "preview": "Preview" + }, + "config": { + "overview": { + "title": "Application Configuration", + "description": "Current application settings and configuration details." + }, + "account": { + "overview": { + "title": "Account Settings", + "manageAccountPreferences": "Manage your account preferences", + "guestDescription": "You are signed in as a guest. Consider upgrading your account above." + }, + "upgrade": { + "title": "Upgrade Guest Account", + "description": "Link your account to preserve your history and access more features!", + "socialLogin": "Upgrade with Social Account", + "linkWith": "Link with", + "emailPassword": "or enter your email & password", + "email": "Email", + "emailPlaceholder": "Enter your email", + "password": "Password (optional)", + "passwordPlaceholder": "Set a password", + "passwordNote": "Leave empty to use email verification only", + "upgradeButton": "Upgrade Account" + } + }, + "apiKeys": { + "description": "Your API key for accessing Stirling's suite of PDF tools. Copy it to your project or refresh to generate a new one.", + "publicKeyAriaLabel": "Public API key", + "copyKeyAriaLabel": "Copy API key", + "refreshAriaLabel": "Refresh API key", + "includedCredits": "Included credits", + "purchasedCredits": "Purchased credits", + "totalCredits": "Total Credits", + "chartAriaLabel": "Credits usage: included {{includedUsed}} of {{includedTotal}}, purchased {{purchasedUsed}} of {{purchasedTotal}}", + "nextReset": "Next Reset", + "lastApiUse": "Last API Use", + "overlayMessage": "Generate a key to see credits and available credits", + "label": "API Key", + "guestInfo": "Guest users do not receive API keys. Create an account to get an API key you can use in your applications.", + "goToAccount": "Go to Account", + "refreshModal": { + "title": "Refresh API Keys", + "warning": "âš ī¸ Warning: This action will generate new API keys and make your previous keys invalid.", + "impact": "Any applications or services currently using these keys will stop working until you update them with the new keys.", + "confirmPrompt": "Are you sure you want to continue?", + "confirmCta": "Refresh Keys" + }, + "generateError": "We couldn't generate your API key." + } + }, + "AddAttachmentsRequest": { + "attachments": "Select Attachments", + "info": "Select files to attach to your PDF. These files will be embedded and accessible through the PDF's attachment panel.", + "selectFiles": "Select Files to Attach", + "placeholder": "Choose files...", + "addMoreFiles": "Add more files...", + "selectedFiles": "Selected Files", + "submit": "Add Attachments", + "results": { + "title": "Attachment Results" + }, + "error": { + "failed": "Add attachments operation failed" + } + }, + "termsAndConditions": "Terms & Conditions", + "logOut": "Log out", + "addAttachments": { + "error": { + "failed": "An error occurred while adding attachments to the PDF." + } + }, + "autoRename": { + "description": "This tool will automatically rename PDF files based on their content. It analyzes the document to find the most suitable title from the text." + }, + "customPosition": "Custom Position", + "details": "Details", + "downloadUnavailable": "Download unavailable for this item", + "invalidUndoData": "Cannot undo: invalid operation data", + "margin": { + "large": "Large", + "medium": "Medium", + "small": "Small", + "xLarge": "Extra Large" + }, + "noFilesToUndo": "Cannot undo: no files were processed in the last operation", + "noOperationToUndo": "No operation to undo", + "noValidFiles": "No valid files to process", + "operationCancelled": "Operation cancelled", + "pageEdit": { + "deselectAll": "Select None", + "selectAll": "Select All" + }, + "quickPosition": "Quick Position", + "reorganizePages": { + "error": { + "failed": "Failed to reorganize pages" + }, + "results": { + "title": "Pages Reorganized" + }, + "settings": { + "title": "Settings" + }, + "submit": "Reorganize Pages" + }, + "replace-color": { + "options": { + "fill": "Fill colour", + "gradient": "Gradient" + }, + "previewOverlayOpacity": "Preview overlay opacity", + "previewOverlayTransparency": "Preview overlay transparency", + "previewOverlayVisibility": "Show preview overlay", + "selectText": { + "1": "ā´¨ā´ŋā´ąā´‚ ā´Žā´žā´ąāĩā´ąāĩā´¨āĩā´¨ā´¤ā´ŋā´¨āĩ‹ ā´ĩā´ŋā´Ēā´°āĩ€ā´¤ā´Žā´žā´•āĩā´•āĩā´¨āĩā´¨ā´¤ā´ŋā´¨āĩ‹ ⴉⴺāĩā´ŗ ā´“ā´Ēāĩā´ˇā´¨āĩā´•āĩž", + "2": "ā´¸āĩā´Ĩā´ŋā´°ā´¸āĩā´Ĩā´ŋā´¤ā´ŋ (ā´¸āĩā´Ĩā´ŋā´°ā´¸āĩā´Ĩā´ŋā´¤ā´ŋ ⴉⴝāĩŧā´¨āĩā´¨ ā´•āĩ‹āĩēⴟāĩā´°ā´žā´¸āĩā´ąāĩā´ąāĩ ā´¨ā´ŋā´ąā´™āĩā´™āĩž)", + "3": "ⴇⴎāĩā´Ÿā´žā´¨āĩā´¸āĩƒā´¤ā´‚ (ⴇⴎāĩā´Ÿā´žā´¨āĩā´¸āĩƒā´¤ā´Žā´žā´•āĩā´•ā´ŋā´¯ ā´¨ā´ŋā´ąā´™āĩā´™āĩž)", + "4": "ā´Ēāĩ‚āĩŧā´Ŗāĩā´Ŗ-ā´ĩā´ŋā´Ēā´°āĩ€ā´¤ā´‚ (ā´Žā´˛āĩā´˛ā´ž ā´¨ā´ŋā´ąā´™āĩā´™ā´ŗāĩā´‚ ā´ĩā´ŋā´Ēā´°āĩ€ā´¤ā´Žā´žā´•āĩā´•āĩā´•)", + "5": "ⴉⴝāĩŧā´¨āĩā´¨ ā´•āĩ‹āĩēⴟāĩā´°ā´žā´¸āĩā´ąāĩā´ąāĩ ā´ĩāĩŧā´Ŗāĩā´Ŗ ā´“ā´Ēāĩā´ˇā´¨āĩā´•āĩž", + "6": "ā´•ā´ąāĩā´¤āĩā´¤ ā´Ēā´ļāĩā´šā´žā´¤āĩā´¤ā´˛ā´¤āĩā´¤ā´ŋāĩŊ ā´ĩāĩ†ā´ŗāĩā´¤āĩā´¤ ⴟāĩ†ā´•āĩā´¸āĩā´ąāĩā´ąāĩ", + "7": "ā´ĩāĩ†ā´ŗāĩā´¤āĩā´¤ ā´Ēā´ļāĩā´šā´žā´¤āĩā´¤ā´˛ā´¤āĩā´¤ā´ŋāĩŊ ā´•ā´ąāĩā´¤āĩā´¤ ⴟāĩ†ā´•āĩā´¸āĩā´ąāĩā´ąāĩ", + "8": "ā´•ā´ąāĩā´¤āĩā´¤ ā´Ēā´ļāĩā´šā´žā´¤āĩā´¤ā´˛ā´¤āĩā´¤ā´ŋāĩŊ ā´Žā´žāĩā´ž ⴟāĩ†ā´•āĩā´¸āĩā´ąāĩā´ąāĩ", + "9": "ā´•ā´ąāĩā´¤āĩā´¤ ā´Ēā´ļāĩā´šā´žā´¤āĩā´¤ā´˛ā´¤āĩā´¤ā´ŋāĩŊ ā´Ēⴚāĩā´š ⴟāĩ†ā´•āĩā´¸āĩā´ąāĩā´ąāĩ", + "10": "ⴟāĩ†ā´•āĩā´¸āĩā´ąāĩā´ąāĩ ā´¨ā´ŋā´ąā´‚ ā´¤ā´ŋā´°ā´žāĩā´žāĩ†ā´Ÿāĩā´•āĩā´•āĩā´•", + "11": "ā´Ēā´ļāĩā´šā´žā´¤āĩā´¤ā´˛ ā´¨ā´ŋā´ąā´‚ ā´¤ā´ŋā´°ā´žāĩā´žāĩ†ā´Ÿāĩā´•āĩā´•āĩā´•", + "12": "Choose start colour", + "13": "Choose end colour" + }, + "submit": "ā´Žā´žā´ąāĩā´ąāĩā´•", + "title": "ā´¨ā´ŋā´ąā´‚-ā´Žā´žā´ąāĩā´ąāĩā´•-ā´ĩā´ŋā´Ēā´°āĩ€ā´¤ā´Žā´žā´•āĩā´•āĩā´•", + "header": "PDF-ā´˛āĩ† ā´¨ā´ŋā´ąā´‚ ā´Žā´žā´ąāĩā´ąāĩā´•-ā´ĩā´ŋā´Ēā´°āĩ€ā´¤ā´Žā´žā´•āĩā´•āĩā´•" + }, + "size": "Size", + "submit": "Submit", + "success": "Success", + "tools": { + "noSearchResults": "No tools found", + "noTools": "No tools available" + }, + "undoDataMismatch": "Cannot undo: operation data is corrupted", + "undoFailed": "Failed to undo operation", + "undoQuotaError": "Cannot undo: insufficient storage space", + "undoStorageError": "Undo completed but some files could not be saved to storage", + "undoSuccess": "Operation undone successfully", + "unsupported": "Unsupported", + "onboarding": { + "welcomeModal": { + "title": "Welcome to Stirling PDF!", + "description": "Would you like to take a quick 1-minute tour to learn the key features and how to get started?", + "helpHint": "You can always access this tour later from the Help button in the bottom left.", + "startTour": "Start Tour", + "maybeLater": "Maybe Later", + "dontShowAgain": "Don't Show Again" + }, + "allTools": "This is the All Tools panel, where you can browse and select from all available PDF tools.", + "selectCropTool": "Let's select the Crop tool to demonstrate how to use one of the tools.", + "toolInterface": "This is the Crop tool interface. As you can see, there's not much there because we haven't added any PDF files to work with yet.", + "filesButton": "The Files button on the Quick Access bar allows you to upload PDFs to use the tools on.", + "fileSources": "You can upload new files or access recent files from here. For the tour, we'll just use a sample file.", + "workbench": "This is the Workbench - the main area where you view and edit your PDFs.", + "viewSwitcher": "Use these controls to select how you want to view your PDFs.", + "viewer": "The Viewer lets you read and annotate your PDFs.", + "pageEditor": "The Page Editor allows you to do various operations on the pages within your PDFs, such as reordering, rotating and deleting.", + "activeFiles": "The Active Files view shows all of the PDFs you have loaded into the tool, and allows you to select which ones to process.", + "fileCheckbox": "Clicking one of the files selects it for processing. You can select multiple files for batch operations.", + "selectControls": "The Right Rail contains buttons to quickly select/deselect all of your active PDFs, along with buttons to change the app's theme or language.", + "cropSettings": "Now that we've selected the file we want crop, we can configure the Crop tool to choose the area that we want to crop the PDF to.", + "runButton": "Once the tool has been configured, this button allows you to run the tool on all the selected PDFs.", + "results": "After the tool has finished running, the Review step will show a preview of the results in this panel, and allow you to undo the operation or download the file. ", + "fileReplacement": "The modified file will replace the original file in the Workbench automatically, allowing you to easily run it through more tools.", + "pinButton": "You can use the Pin button if you'd rather your files stay active after running tools on them.", + "wrapUp": "You're all set! You've learnt about the main areas of the app and how to use them. Click the Help button whenever you like to see this tour again.", + "previous": "Previous", + "next": "Next", + "finish": "Finish", + "startTour": "Start Tour", + "startTourDescription": "Take a guided tour of Stirling PDF's key features" + }, + "workspace": { + "title": "Workspace", + "people": { + "title": "People", + "description": "Manage workspace members and their permissions", + "loading": "Loading people...", + "searchMembers": "Search members...", + "addMembers": "Add Members", + "inviteMembers": { + "label": "Invite Members", + "subtitle": "Type or paste in emails below, separated by commas. Your workspace will be billed by members." + }, + "user": "User", + "role": "Role", + "team": "Team", + "status": "Status", + "actions": "Actions", + "noMembersFound": "No members found", + "active": "Active", + "disabled": "Disabled", + "activeSession": "Active session", + "member": "Member", + "admin": "Admin", + "roleDescriptions": { + "admin": "Can manage settings and invite members, with full administrative access.", + "member": "Can view and edit shared files, but cannot manage workspace settings or members." + }, + "editRole": "Edit Role", + "enable": "Enable", + "disable": "Disable", + "deleteUser": "Delete User", + "deleteUserSuccess": "User deleted successfully", + "deleteUserError": "Failed to delete user", + "confirmDelete": "Are you sure you want to delete this user? This action cannot be undone.", + "addMember": { + "title": "Add Member", + "username": "Username (Email)", + "usernamePlaceholder": "user@example.com", + "password": "Password", + "passwordPlaceholder": "Enter password", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "forcePasswordChange": "Force password change on first login", + "cancel": "Cancel", + "submit": "Add Member", + "usernameRequired": "Username and password are required", + "passwordTooShort": "Password must be at least 6 characters", + "success": "User created successfully", + "error": "Failed to create user" + }, + "editMember": { + "title": "Edit Member", + "editing": "Editing:", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "cancel": "Cancel", + "submit": "Update Member", + "success": "User updated successfully", + "error": "Failed to update user" + }, + "toggleEnabled": { + "success": "User status updated successfully", + "error": "Failed to update user status" + }, + "delete": { + "success": "User deleted successfully", + "error": "Failed to delete user" + }, + "emailInvite": { + "tab": "Email Invite", + "description": "Type or paste in emails below, separated by commas. Users will receive login credentials via email.", + "emails": "Email Addresses", + "emailsPlaceholder": "user1@example.com, user2@example.com", + "emailsRequired": "At least one email address is required", + "submit": "Send Invites", + "success": "user(s) invited successfully", + "partialSuccess": "Some invites failed", + "allFailed": "Failed to invite users", + "error": "Failed to send invites" + }, + "directInvite": { + "tab": "Direct Create" + }, + "inviteLinkTab": { + "tab": "Invite Link" + }, + "inviteLink": { + "description": "Generate a secure link that allows the user to set their own password", + "email": "Email Address", + "emailPlaceholder": "user@example.com (optional)", + "emailDescription": "Optional - leave blank for a general invite link that can be used by anyone", + "emailRequired": "Email address is required", + "emailOptional": "Optional - leave blank for a general invite link", + "emailRequiredForSend": "Email address is required to send email notification", + "expiryHours": "Expiry Hours", + "expiryDescription": "How many hours until the link expires", + "sendEmail": "Send invite link via email", + "sendEmailDescription": "If enabled, the invite link will be sent to the specified email address", + "smtpRequired": "SMTP not configured", + "generate": "Generate Link", + "generated": "Invite Link Generated", + "copied": "Link copied to clipboard", + "success": "Invite link generated successfully", + "successWithEmail": "Invite link generated and sent via email", + "emailFailed": "Invite link generated, but email failed", + "emailFailedDetails": "Error: {0}. Please share the invite link manually.", + "error": "Failed to generate invite link", + "submit": "Generate Invite Link" + }, + "inviteMode": { + "username": "Username", + "email": "Email", + "link": "Link", + "emailDisabled": "Email invites require SMTP configuration and mail.enableInvites=true in settings" + }, + "license": { + "users": "users", + "availableSlots": "Available Slots", + "grandfathered": "Grandfathered", + "grandfatheredShort": "{{count}} grandfathered", + "fromLicense": "from license", + "slotsAvailable": "{{count}} user slot(s) available", + "noSlotsAvailable": "No slots available", + "currentUsage": "Currently using {{current}} of {{max}} user licences" + } + }, + "teams": { + "title": "Teams", + "description": "Manage teams and organize workspace members", + "loading": "Loading teams...", + "loadingDetails": "Loading team details...", + "createNewTeam": "Create New Team", + "teamName": "Team Name", + "totalMembers": "Total Members", + "actions": "Actions", + "noTeamsFound": "No teams found", + "noMembers": "No members in this team", + "system": "System", + "addMember": "Add Member", + "viewTeam": "View Team", + "removeMember": "Remove from team", + "cannotRemoveFromSystemTeam": "Cannot remove from system team", + "renameTeamLabel": "Rename Team", + "deleteTeamLabel": "Delete Team", + "cannotDeleteInternal": "Cannot delete the Internal team", + "confirmDelete": "Are you sure you want to delete this team? This team must be empty to delete.", + "confirmRemove": "Remove user from this team?", + "cannotRenameInternal": "Cannot rename the Internal team", + "cannotAddToInternal": "Cannot add members to the Internal team", + "teamNotFound": "Team not found", + "backToTeams": "Back to Teams", + "memberCount": "{{count}} members", + "removeMemberSuccess": "User removed from team", + "removeMemberError": "Failed to remove user from team", + "createTeam": { + "title": "Create New Team", + "teamName": "Team Name", + "teamNamePlaceholder": "Enter team name", + "cancel": "Cancel", + "submit": "Create Team", + "nameRequired": "Team name is required", + "success": "Team created successfully", + "error": "Failed to create team" + }, + "renameTeam": { + "title": "Rename Team", + "renaming": "Renaming:", + "newTeamName": "New Team Name", + "newTeamNamePlaceholder": "Enter new team name", + "cancel": "Cancel", + "submit": "Rename Team", + "nameRequired": "Team name is required", + "success": "Team renamed successfully", + "error": "Failed to rename team" + }, + "deleteTeam": { + "success": "Team deleted successfully", + "error": "Failed to delete team. Make sure the team is empty.", + "teamMustBeEmpty": "Team must be empty before deletion" + }, + "addMemberToTeam": { + "title": "Add Member to Team", + "addingTo": "Adding to", + "selectUser": "Select User", + "selectUserPlaceholder": "Choose a user", + "selectUserRequired": "Please select a user", + "currentlyIn": "currently in", + "willBeMoved": "Note: This user will be moved from their current team to this team.", + "cancel": "Cancel", + "submit": "Add Member", + "userRequired": "Please select a user", + "success": "Member added to team successfully", + "error": "Failed to add member to team" + }, + "changeTeam": { + "label": "Change Team", + "title": "Change Team", + "changing": "Moving", + "selectTeam": "Select Team", + "selectTeamPlaceholder": "Choose a team", + "selectTeamRequired": "Please select a team", + "success": "Team changed successfully", + "error": "Failed to change team", + "submit": "Change Team" + } + } + }, + "plan": { + "currency": "Currency", + "popular": "Popular", + "current": "Current Plan", + "upgrade": "Upgrade", + "contact": "Contact Us", + "customPricing": "Custom", + "showComparison": "Compare All Features", + "hideComparison": "Hide Feature Comparison", + "featureComparison": "Feature Comparison", + "activePlan": { + "title": "Active Plan", + "subtitle": "Your current subscription details" + }, + "availablePlans": { + "title": "Available Plans", + "subtitle": "Choose the plan that fits your needs" + }, + "static": { + "title": "Billing Information", + "message": "Online billing is not currently configured. To upgrade your plan or manage subscriptions, please contact us directly.", + "contactSales": "Contact Sales", + "contactToUpgrade": "Contact us to upgrade or customize your plan", + "maxUsers": "Max Users", + "upTo": "Up to" + }, + "period": { + "month": "month" + }, + "free": { + "name": "Free", + "highlight1": "Limited Tool Usage Per week", + "highlight2": "Access to all tools", + "highlight3": "Community support" + }, + "pro": { + "name": "Pro", + "highlight1": "Unlimited Tool Usage", + "highlight2": "Advanced PDF tools", + "highlight3": "No watermarks" + }, + "enterprise": { + "name": "Enterprise", + "highlight1": "Custom pricing", + "highlight2": "Dedicated support", + "highlight3": "Latest features" + }, + "feature": { + "title": "Feature", + "pdfTools": "Basic PDF Tools", + "fileSize": "File Size Limit", + "automation": "Automate tool workflows", + "api": "API Access", + "priority": "Priority Support", + "customPricing": "Custom Pricing" + } + }, + "subscription": { + "status": { + "active": "Active", + "pastDue": "Past Due", + "canceled": "Canceled", + "incomplete": "Incomplete", + "trialing": "Trial", + "none": "No Subscription" + }, + "renewsOn": "Renews on {{date}}", + "cancelsOn": "Cancels on {{date}}" + }, + "billing": { + "manageBilling": "Manage Billing", + "portal": { + "error": "Failed to open billing portal" + } + }, + "payment": { + "preparing": "Preparing your checkout...", + "upgradeTitle": "Upgrade to {{planName}}", + "success": "Payment Successful!", + "successMessage": "Your subscription has been activated successfully. You will receive a confirmation email shortly.", + "autoClose": "This window will close automatically...", + "error": "Payment Error" + }, + "firstLogin": { + "title": "First Time Login", + "welcomeTitle": "Welcome!", + "welcomeMessage": "For security reasons, you must change your password on your first login.", + "loggedInAs": "Logged in as", + "error": "Error", + "currentPassword": "Current Password", + "enterCurrentPassword": "Enter your current password", + "newPassword": "New Password", + "enterNewPassword": "Enter new password (min 8 characters)", + "confirmPassword": "Confirm New Password", + "reEnterNewPassword": "Re-enter new password", + "changePassword": "Change Password", + "allFieldsRequired": "All fields are required", + "passwordsDoNotMatch": "New passwords do not match", + "passwordTooShort": "Password must be at least 8 characters", + "passwordMustBeDifferent": "New password must be different from current password", + "passwordChangedSuccess": "Password changed successfully! Please log in again.", + "passwordChangeFailed": "Failed to change password. Please check your current password." + }, + "invite": { + "welcome": "Welcome to Stirling PDF", + "invalidToken": "Invalid invitation link", + "validationError": "Failed to validate invitation link", + "passwordRequired": "Password is required", + "passwordTooShort": "Password must be at least 6 characters", + "passwordMismatch": "Passwords do not match", + "acceptError": "Failed to create account", + "validating": "Validating invitation...", + "invalidInvitation": "Invalid Invitation", + "goToLogin": "Go to Login", + "welcomeTitle": "You've been invited!", + "welcomeSubtitle": "Complete your account setup to get started", + "accountFor": "Creating account for", + "linkExpires": "Link expires", + "email": "Email address", + "emailPlaceholder": "Enter your email address", + "emailRequired": "Email address is required", + "invalidEmail": "Invalid email address", + "choosePassword": "Choose a password", + "passwordPlaceholder": "Enter your password", + "confirmPassword": "Confirm password", + "confirmPasswordPlaceholder": "Re-enter your password", + "createAccount": "Create Account", + "creating": "Creating Account...", + "alreadyHaveAccount": "Already have an account?", + "signIn": "Sign in" + }, + "audit": { + "error": { + "title": "Error loading audit system" + }, + "notAvailable": "Audit system not available", + "notAvailableMessage": "The audit system is not configured or not available.", + "disabled": "Audit logging is disabled", + "disabledMessage": "Enable audit logging in your application configuration to track system events.", + "systemStatus": { + "title": "System Status", + "status": "Audit Logging", + "enabled": "Enabled", + "disabled": "Disabled", + "level": "Audit Level", + "retention": "Retention Period", + "days": "days", + "totalEvents": "Total Events" + }, + "tabs": { + "dashboard": "Dashboard", + "events": "Audit Events", + "export": "Export" + }, + "charts": { + "title": "Audit Dashboard", + "error": "Error loading charts", + "day": "Day", + "week": "Week", + "month": "Month", + "byType": "Events by Type", + "byUser": "Events by User", + "overTime": "Events Over Time" + }, + "events": { + "title": "Audit Events", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "error": "Error loading events", + "noEvents": "No events found", + "timestamp": "Timestamp", + "type": "Type", + "user": "User", + "ipAddress": "IP Address", + "actions": "Actions", + "viewDetails": "View Details", + "eventDetails": "Event Details", + "details": "Details" + }, + "export": { + "title": "Export Audit Data", + "description": "Export audit events to CSV or JSON format. Use filters to limit the exported data.", + "format": "Export Format", + "filters": "Filters (Optional)", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "exportButton": "Export Data", + "error": "Failed to export data" + } + }, + "usage": { + "noData": "No data available", + "error": "Error loading usage statistics", + "noDataMessage": "No usage statistics are currently available.", + "controls": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All", + "refresh": "Refresh", + "dataTypeLabel": "Data Type:", + "dataType": { + "all": "All", + "api": "API", + "ui": "UI" + } + }, + "showing": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All" + }, + "stats": { + "totalEndpoints": "Total Endpoints", + "totalVisits": "Total Visits", + "showing": "Showing", + "selectedVisits": "Selected Visits" + }, + "chart": { + "title": "Endpoint Usage Chart" + }, + "table": { + "title": "Detailed Statistics", + "endpoint": "Endpoint", + "visits": "Visits", + "percentage": "Percentage", + "noData": "No data available" + } + }, + "backendHealth": { + "checking": "Checking backend status...", + "online": "Backend Online", + "offline": "Backend Offline" + }, + "autoRedact": { + "tags": "ā´ąāĩ†ā´Ąā´žā´•āĩā´ąāĩā´ąāĩ,ā´Žā´ąā´¯āĩā´•āĩā´•āĩā´•,ā´•ā´ąāĩā´Ēāĩā´Ēā´ŋā´•āĩā´•āĩā´•,ā´•ā´ąāĩā´Ēāĩā´Ēāĩ,ā´Žā´žāĩŧā´•āĩā´•āĩŧ,ā´Žā´ąā´žāĩā´žā´ŋā´°ā´ŋā´•āĩā´•āĩā´¨āĩā´¨", + "title": "ā´¸āĩā´ĩⴝⴂ ā´ąāĩ†ā´Ąā´žā´•āĩā´ąāĩā´ąāĩ ⴚāĩ†ā´¯āĩā´¯āĩā´•", + "header": "ā´¸āĩā´ĩⴝⴂ ā´ąāĩ†ā´Ąā´žā´•āĩā´ąāĩā´ąāĩ ⴚāĩ†ā´¯āĩā´¯āĩā´•", + "colorLabel": "ā´¨ā´ŋā´ąā´‚", + "textsToRedactLabel": "ā´ąāĩ†ā´Ąā´žā´•āĩā´ąāĩā´ąāĩ ⴚāĩ†ā´¯āĩā´¯āĩ‡ā´Ŗāĩā´Ÿ ⴟāĩ†ā´•āĩā´¸āĩā´ąāĩā´ąāĩ (ā´ĩā´°ā´ŋā´•ā´ŗā´žāĩŊ ā´ĩāĩ‡āĩŧā´¤ā´ŋā´°ā´ŋⴚāĩā´šā´¤āĩ)", + "textsToRedactPlaceholder": "ā´‰ā´Ļā´ž. \\nā´°ā´šā´¸āĩā´¯ā´‚ \\nā´…ā´¤āĩ€ā´ĩ-ā´°ā´šā´¸āĩā´¯ā´‚", + "useRegexLabel": "ā´ąāĩ†ā´—āĩā´˛āĩŧ ā´Žā´•āĩā´¸āĩā´Ēāĩā´°ā´ˇāĩģ ā´‰ā´Ēā´¯āĩ‹ā´—ā´ŋā´•āĩā´•āĩā´•", + "wholeWordSearchLabel": "ā´Žāĩā´´āĩā´ĩāĩģ ā´ĩā´žā´•āĩā´•āĩ ā´¤ā´ŋā´°ā´¯āĩŊ", + "customPaddingLabel": "ⴇⴎāĩā´Ÿā´žā´¨āĩā´¸āĩƒā´¤ ā´…ā´§ā´ŋā´• ā´Ēā´žā´Ąā´ŋā´‚ā´—āĩ", + "convertPDFToImageLabel": "PDF-ā´¨āĩ† PDF-ⴚā´ŋā´¤āĩā´°ā´¤āĩā´¤ā´ŋā´˛āĩ‡ā´•āĩā´•āĩ ā´Žā´žā´ąāĩā´ąāĩā´• (ā´Ŧāĩ‹ā´•āĩā´¸ā´ŋā´¨āĩ ā´Ēā´ŋā´¨āĩā´¨ā´ŋā´˛āĩ† ⴟāĩ†ā´•āĩā´¸āĩā´ąāĩā´ąāĩ ā´¨āĩ€ā´•āĩā´•ā´‚ ⴚāĩ†ā´¯āĩā´¯ā´žāĩģ ā´‰ā´Ēā´¯āĩ‹ā´—ā´ŋā´•āĩā´•āĩā´¨āĩā´¨āĩ)", + "submitButton": "ā´¸ā´Žāĩŧā´Ēāĩā´Ēā´ŋā´•āĩā´•āĩā´•" + }, + "replaceColorPdf": { + "tags": "ā´¨ā´ŋā´ąā´‚ ā´Žā´žā´ąāĩā´ąāĩā´•,ā´Ēāĩ‡ā´œāĩ ā´Ēāĩā´°ā´ĩāĩŧā´¤āĩā´¤ā´¨ā´™āĩā´™āĩž,ā´Ŧā´žā´•āĩā´•āĩ ā´Žāĩģā´Ąāĩ,ā´¸āĩ†āĩŧā´ĩāĩŧ ā´¸āĩˆā´Ąāĩ" } } diff --git a/frontend/public/locales/nl-NL/translation.json b/frontend/public/locales/nl-NL/translation.json index 6b3ad5eb8..1b7be68fb 100644 --- a/frontend/public/locales/nl-NL/translation.json +++ b/frontend/public/locales/nl-NL/translation.json @@ -1,4 +1,40 @@ { + "toolPanel": { + "modePrompt": { + "title": "Choose how you browse tools", + "description": "Preview both layouts and decide how you want to explore Stirling PDF tools.", + "sidebarTitle": "Sidebar mode", + "sidebarDescription": "Keep tools alongside your workspace for quick switching.", + "recommended": "Recommended", + "chooseSidebar": "Use sidebar mode", + "fullscreenTitle": "Fullscreen mode - (legacy)", + "fullscreenDescription": "Browse every tool in a catalogue that covers the workspace until you pick one.", + "chooseFullscreen": "Use fullscreen mode", + "dismiss": "Maybe later" + }, + "fullscreen": { + "showDetails": "Show Details", + "comingSoon": "Coming soon:", + "favorite": "Add to favourites", + "favorites": "Favourites", + "heading": "All tools (fullscreen view)", + "noResults": "Try adjusting your search or toggle descriptions to find what you need.", + "recommended": "Recommended", + "unfavorite": "Remove from favourites" + }, + "placeholder": "Choose a tool to get started", + "toggle": { + "fullscreen": "Switch to fullscreen mode", + "sidebar": "Switch to sidebar mode" + } + }, + "unsavedChanges": "You have unsaved changes to your PDF.", + "areYouSure": "Are you sure you want to leave?", + "unsavedChangesTitle": "Unsaved Changes", + "keepWorking": "Keep Working", + "discardChanges": "Discard & Leave", + "applyAndContinue": "Save & Leave", + "exportAndContinue": "Export & Continue", "language": { "direction": "ltr" }, @@ -18,8 +54,26 @@ "customTextDesc": "Aangepaste tekst", "numberPagesDesc": "Welke pagina's genummerd moeten worden, standaard 'all', accepteert ook 1-5 of 2,5,9 etc", "customNumberDesc": "Standaard {n}, accepteert ook 'Pagina {n} van {total}', 'Tekst-{n}', '{filename}-{n}", - "submit": "Paginanummers toevoegen" + "submit": "Paginanummers toevoegen", + "configuration": "Configuration", + "customize": "Customize Appearance", + "pagesAndStarting": "Pages & Starting Number", + "positionAndPages": "Position & Pages", + "error": { + "failed": "Add page numbers operation failed" + }, + "results": { + "title": "Page Number Results" + }, + "preview": "Position Selection", + "previewDisclaimer": "Preview is approximate. Final output may vary due to PDF font metrics." }, + "pageSelectionPrompt": "Aangepaste pagina selectie (Voer een komma-gescheiden lijst van paginanummer 1,5,6 of functies zoals 2n+1 in) :", + "startingNumberTooltip": "The first number to display. Subsequent pages will increment from this number.", + "marginTooltip": "Distance between the page number and the edge of the page.", + "fontSizeTooltip": "Size of the page number text in points. Larger numbers create bigger text.", + "fontTypeTooltip": "Font family for the page numbers. Choose based on your document style.", + "customTextTooltip": "Optional custom format for page numbers. Use {n} as placeholder for the number. Example: \"Page {n}\" will show \"Page 1\", \"Page 2\", etc.", "pdfPrompt": "Selecteer PDF('s)", "multiPdfPrompt": "Selecteer PDF's (2+)", "multiPdfDropPrompt": "Selecteer (of sleep & zet neer) alle PDF's die je nodig hebt", @@ -30,15 +84,41 @@ "uploadLimitExceededPlural": "are too large. Maximum allowed size is", "processTimeWarning": "Waarschuwing: Dit proces kan tot een minuut duren afhankelijk van de bestandsgrootte", "pageOrderPrompt": "Aangepaste pagina volgorde (Voer een komma-gescheiden lijst van paginanummers of functies in, zoals 2n+1) :", - "pageSelectionPrompt": "Aangepaste pagina selectie (Voer een komma-gescheiden lijst van paginanummer 1,5,6 of functies zoals 2n+1 in) :", "goToPage": "Ga", "true": "Waar", "false": "Onwaar", "unknown": "Onbekend", + "app": { + "description": "The Free Adobe Acrobat alternative (10M+ Downloads)" + }, "save": "Opslaan", "saveToBrowser": "Opslaan in browser", + "download": "Downloaden", + "pin": "Pin File (keep active after tool run)", + "unpin": "Unpin File (replace after tool run)", + "undoOperationTooltip": "Click to undo the last operation and restore the original files", + "undo": "Undo", + "moreOptions": "More Options", + "editYourNewFiles": "Edit your new file(s)", "close": "Sluiten", + "openInViewer": "Open in Viewer", + "confirmClose": "Confirm Close", + "confirmCloseMessage": "Are you sure you want to close this file?", + "confirmCloseCancel": "Cancel", + "confirmCloseConfirm": "Close File", + "fileSelected": "Selected: {{filename}}", + "chooseFile": "Choose File", "filesSelected": "Bestanden geselecteerd", + "files": { + "title": "Files", + "upload": "Upload", + "uploadFiles": "Upload Files", + "addFiles": "Add files", + "selectFromWorkbench": "Select files from the workbench or ", + "selectMultipleFromWorkbench": "Select at least {{count}} files from the workbench or ", + "created": "Created", + "size": "File Size" + }, "noFavourites": "Geen favorieten toegevoegd", "downloadComplete": "Download klaar", "bored": "Verveeld met wachten?", @@ -56,7 +136,10 @@ }, "error": { "pdfPassword": "Het PDF document is beveiligd met een wachtwoord en het wachtwoord is niet ingevoerd of is onjuist", + "encryptedPdfMustRemovePassword": "This PDF is encrypted or password-protected. Please unlock it before converting to PDF/A.", + "incorrectPasswordProvided": "The PDF password is incorrect or not provided.", "_value": "Fout", + "dismissAllErrors": "Dismiss All Errors", "sorry": "Excuses voor het probleem!", "needHelp": "Hulp nodig / probleem gevonden?", "contactTip": "Als je nog steeds problemen hebt, schroom niet om contact met ons op te nemen voor hulp. Je kan een ticket op onze Github pagina indienen of ons via Discord bereiken:", @@ -71,6 +154,10 @@ "githubSubmit": "GitHub - Dien een ticket in", "discordSubmit": "Discord - Maak een support post" }, + "warning": { + "tooltipTitle": "Warning" + }, + "edit": "Edit", "delete": "Verwijderen", "username": "Gebruikersnaam", "password": "Wachtwoord", @@ -82,6 +169,7 @@ "green": "Groen", "blue": "Blauw", "custom": "Aangepast...", + "comingSoon": "Coming soon", "WorkInProgess": "Werk in uitvoering. Werkt mogelijk niet of bevat fouten. Meld eventuele problemen!", "poweredBy": "Mogelijk gemaakt door", "yes": "Ja", @@ -115,12 +203,14 @@ "page": "Pagina", "pages": "Pagen", "loading": "Laden...", + "review": "Review", "addToDoc": "Toevoegen aan document", "reset": "Reset", "apply": "Apply", "noFileSelected": "No file selected. Please upload one.", "legal": { "privacy": "Privacybeleid", + "iAgreeToThe": "I agree to all of the", "terms": "Voorwaarden van gebruik", "accessibility": "Toegankelijkheid", "cookie": "Cookiesbeleid", @@ -160,6 +250,7 @@ "title": "Do you want make Stirling PDF better?", "paragraph1": "Stirling PDF has opt in analytics to help us improve the product. We do not track any personal information or file contents.", "paragraph2": "Please consider enabling analytics to help Stirling-PDF grow and to allow us to understand our users better.", + "learnMore": "Learn more", "enable": "Enable analytics", "disable": "Disable analytics", "settings": "You can change the settings for analytics in the config/settings.yml file" @@ -203,6 +294,54 @@ "cacheInputs": { "name": "Sla invoer in formulieren op", "help": "Schakel in om eerdere invoeren op te slaan voor toekomstige uitvoeren" + }, + "general": { + "title": "General", + "description": "Configure general application preferences.", + "account": "Account", + "accountDescription": "Manage your account settings", + "user": "User", + "signedInAs": "Signed in as", + "logout": "Log out", + "enableFeatures": { + "title": "For System Administrators", + "intro": "Enable user authentication, team management, and workspace features for your organization.", + "action": "Configure", + "and": "and", + "benefit": "Enables user roles, team collaboration, admin controls, and enterprise features.", + "learnMore": "Learn more in documentation", + "dismiss": "Dismiss" + }, + "autoUnzip": "Auto-unzip API responses", + "autoUnzipDescription": "Automatically extract files from ZIP responses", + "autoUnzipTooltip": "Automatically extract ZIP files returned from API operations. Disable to keep ZIP files intact. This does not affect automation workflows.", + "autoUnzipFileLimit": "Auto-unzip file limit", + "autoUnzipFileLimitDescription": "Maximum number of files to extract from ZIP", + "autoUnzipFileLimitTooltip": "Only unzip if the ZIP contains this many files or fewer. Set higher to extract larger ZIPs.", + "defaultToolPickerMode": "Default tool picker mode", + "defaultToolPickerModeDescription": "Choose whether the tool picker opens in fullscreen or sidebar by default", + "mode": { + "fullscreen": "Fullscreen", + "sidebar": "Sidebar" + } + }, + "hotkeys": { + "title": "Keyboard Shortcuts", + "description": "Hover a tool to see its shortcut or customise it below. Click \"Change shortcut\" and press a new key combination. Press Esc to cancel.", + "errorModifier": { + "mac": "Include ⌘ (Command), âŒĨ (Option), or another modifier in your shortcut.", + "windows": "Include Ctrl, Alt, or another modifier in your shortcut." + }, + "errorConflict": "Shortcut already used by {{tool}}.", + "none": "Not assigned", + "customBadge": "Custom", + "defaultLabel": "Default: {{shortcut}}", + "capturing": "Press keysâ€Ļ (Esc to cancel)", + "change": "Change shortcut", + "reset": "Reset", + "shortcut": "Shortcut", + "noShortcut": "No shortcut set", + "searchPlaceholder": "Search tools..." } }, "changeCreds": { @@ -274,8 +413,10 @@ "top20": "Top 20", "all": "All", "refresh": "Refresh", - "includeHomepage": "Include Homepage ('/')", - "includeLoginPage": "Include Login Page ('/login')", + "dataTypeLabel": "Data Type:", + "dataTypeAll": "All", + "dataTypeApi": "API", + "dataTypeUi": "UI", "totalEndpoints": "Total Endpoints", "totalVisits": "Total Visits", "showing": "Showing", @@ -290,7 +431,9 @@ "top": "Top", "numberOfVisits": "Number of Visits", "visitsTooltip": "Visits: {0} ({1}% of total)", - "retry": "Retry" + "retry": "Retry", + "includeHomepage": "Include Homepage ('/')", + "includeLoginPage": "Include Login Page ('/login')" }, "database": { "title": "Database Importeer/Exporteer", @@ -331,22 +474,310 @@ "alphabetical": "Alphabetical", "globalPopularity": "Global Popularity", "sortBy": "Sort by:", + "mobile": { + "brandAlt": "Stirling PDF logo", + "openFiles": "Open files", + "swipeHint": "Swipe left or right to switch views", + "tools": "Tools", + "toolsSlide": "Tool selection panel", + "viewSwitcher": "Switch workspace view", + "workbenchSlide": "Workspace panel", + "workspace": "Workspace" + }, "multiTool": { + "tags": "multiple,tools", "title": "PDF multitool", "desc": "Pagina's samenvoegen, draaien, herschikken en verwijderen" }, "merge": { + "tags": "combine,join,unite", "title": "Samenvoegen", "desc": "Voeg eenvoudig meerdere PDF's samen tot ÊÊn." }, "split": { + "tags": "divide,separate,break", "title": "Splitsen", "desc": "Splits PDF's in meerdere documenten" }, "rotate": { + "tags": "turn,flip,orient", "title": "Roteren", "desc": "Roteer eenvoudig je PDF's." }, + "convert": { + "tags": "transform,change", + "title": "Omzetten", + "desc": "Convert files between different formats" + }, + "pdfOrganiser": { + "tags": "organize,rearrange,reorder", + "title": "Organiseren", + "desc": "Verwijder/herschik pagina's in een volgorde naar keus" + }, + "addImage": { + "tags": "insert,embed,place", + "title": "Afbeelding toevoegen", + "desc": "Voegt een afbeelding toe op een specifieke locatie in de PDF" + }, + "addAttachments": { + "tags": "embed,attach,include", + "title": "Add Attachments", + "desc": "Add or remove embedded files (attachments) to/from a PDF" + }, + "watermark": { + "tags": "stamp,mark,overlay", + "title": "Watermerk toevoegen", + "desc": "Voeg een aangepast watermerk toe aan je PDF-document." + }, + "removePassword": { + "tags": "unlock", + "title": "Wachtwoord verwijderen", + "desc": "Verwijder wachtwoordbeveiliging van je PDF-document." + }, + "compress": { + "tags": "shrink,reduce,optimize", + "title": "Comprimeren", + "desc": "Comprimeer PDF's om hun bestandsgrootte te verkleinen." + }, + "unlockPDFForms": { + "tags": "unlock,enable,edit", + "title": "Unlock PDF Forms", + "desc": "Remove read-only property of form fields in a PDF document." + }, + "changeMetadata": { + "tags": "edit,modify,update", + "title": "Metadata wijzigen", + "desc": "Wijzig/verwijder/voeg metadata toe van een PDF-document" + }, + "ocr": { + "tags": "extract,scan", + "title": "OCR / Scans opruimen", + "desc": "Ruim scans op, detecteert tekst van afbeeldingen in een PDF en voegt deze opnieuw toe als tekst." + }, + "extractImages": { + "tags": "pull,save,export", + "title": "Afbeeldingen extraheren", + "desc": "Extraheert alle afbeeldingen uit een PDF en slaat ze op in een zip" + }, + "scannerImageSplit": { + "tags": "detect,split,photos", + "title": "Detect & Split Scanned Photos", + "desc": "Detect and split scanned photos into separate pages" + }, + "sign": { + "tags": "signature,autograph", + "title": "Ondertekenen", + "desc": "Voegt handtekening toe aan PDF via tekenen, tekst of afbeelding" + }, + "flatten": { + "tags": "simplify,remove,interactive", + "title": "Platdrukken", + "desc": "Verwijder alle interactieve elementen en formulieren uit een PDF" + }, + "certSign": { + "tags": "authenticate,PEM,P12,official,encrypt,sign,certificate,PKCS12,JKS,server,manual,auto", + "title": "Ondertekenen met certificaat", + "desc": "Ondertekent een PDF met een certificaat/sleutel (PEM/P12)" + }, + "repair": { + "tags": "fix,restore", + "title": "Repareren", + "desc": "Probeert een corrupt/beschadigd PDF te herstellen" + }, + "removeBlanks": { + "tags": "delete,clean,empty", + "title": "Verwijder lege pagina's", + "desc": "Detecteert en verwijdert lege pagina's uit een document" + }, + "removeAnnotations": { + "tags": "delete,clean,strip", + "title": "Annotaties verwijderen", + "desc": "Verwijdert alle opmerkingen/annotaties uit een PDF" + }, + "compare": { + "tags": "difference", + "title": "Vergelijken", + "desc": "Vergelijkt en toont de verschillen tussen twee PDF-documenten" + }, + "removeCertSign": { + "tags": "remove,delete,unlock", + "title": "Verwijder certificaat", + "desc": "Verwijder certificaat van PDF" + }, + "pageLayout": { + "tags": "layout,arrange,combine", + "title": "Multi-pagina indeling", + "desc": "Voeg meerdere pagina's van een PDF-document samen op ÊÊn pagina" + }, + "bookletImposition": { + "tags": "booklet,print,binding", + "title": "Booklet Imposition", + "desc": "Create booklets with proper page ordering and multi-page layout for printing and binding" + }, + "scalePages": { + "tags": "resize,adjust,scale", + "title": "Aanpassen paginaformaat/schaal", + "desc": "Wijzig de grootte/schaal van een pagina en/of de inhoud ervan." + }, + "addPageNumbers": { + "tags": "number,pagination,count", + "title": "Paginanummers toevoegen", + "desc": "Voeg paginanummers toe binnen het volledige document op een vastgestelde locatie" + }, + "autoRename": { + "tags": "auto-detect,header-based,organize,relabel", + "title": "Auto Rename PDF File", + "desc": "Auto renames a PDF file based on its detected header" + }, + "adjustContrast": { + "tags": "contrast,brightness,saturation", + "title": "Kleuren/contrast aanpassen", + "desc": "Pas contrast, verzadiging en helderheid van een PDF aan" + }, + "crop": { + "tags": "trim,cut,resize", + "title": "PDF bijsnijden", + "desc": "Snijd een PDF bij om de grootte te verkleinen (behoudt tekst!)" + }, + "autoSplitPDF": { + "tags": "auto,split,QR", + "title": "Automatisch splitsen pagina's", + "desc": "Automatisch splitsen van gescande PDF met fysieke gescande paginasplitter QR-code" + }, + "sanitize": { + "tags": "clean,purge,remove", + "title": "Sanitise", + "desc": "Remove potentially harmful elements from PDF files" + }, + "getPdfInfo": { + "tags": "info,metadata,details", + "title": "Haal ALLE informatie op over PDF", + "desc": "Haalt alle mogelijke informatie op van PDF's" + }, + "pdfToSinglePage": { + "tags": "combine,merge,single", + "title": "PDF naar ÊÊn grote pagina", + "desc": "Voegt alle PDF-pagina's samen tot ÊÊn grote pagina" + }, + "showJS": { + "tags": "javascript,code,script", + "title": "Toon Javascript", + "desc": "Zoekt en toont ieder script dat in een PDF is geïnjecteerd" + }, + "redact": { + "tags": "censor,blackout,hide", + "title": "Manual Redaction", + "desc": "Redacts a PDF based on selected text, drawn shapes and/or selected page(s)" + }, + "splitBySections": { + "tags": "split,sections,divide", + "title": "Split PDF by Sections", + "desc": "Divide each page of a PDF into smaller horizontal and vertical sections" + }, + "addStamp": { + "tags": "stamp,mark,seal", + "title": "Add Stamp to PDF", + "desc": "Add text or add image stamps at set locations" + }, + "removeImage": { + "tags": "remove,delete,clean", + "title": "Afbeelding verwijderen", + "desc": "Afbeeldingen uit PDF verwijderen om het bestandsgrootte te verminderen" + }, + "splitByChapters": { + "tags": "split,chapters,structure", + "title": "PDF op hoofdstukken splitsen", + "desc": "Splits een PDF op basis van zijn hoofdstukstructuur in meerdere bestanden." + }, + "validateSignature": { + "tags": "validate,verify,certificate", + "title": "Validate PDF Signature", + "desc": "Verify digital signatures and certificates in PDF documents" + }, + "swagger": { + "tags": "API,documentation,test", + "title": "API Documentation", + "desc": "View API documentation and test endpoints" + }, + "scannerEffect": { + "tags": "scan,simulate,create", + "title": "Scanner Effect", + "desc": "Create a PDF that looks like it was scanned" + }, + "editTableOfContents": { + "tags": "bookmarks,contents,edit", + "title": "Edit Table of Contents", + "desc": "Add or edit bookmarks and table of contents in PDF documents" + }, + "manageCertificates": { + "tags": "certificates,import,export", + "title": "Manage Certificates", + "desc": "Import, export, or delete digital certificate files used for signing PDFs." + }, + "read": { + "tags": "view,open,display", + "title": "Read", + "desc": "View and annotate PDFs. Highlight text, draw, or insert comments for review and collaboration." + }, + "reorganizePages": { + "tags": "rearrange,reorder,organize", + "title": "Reorganize Pages", + "desc": "Rearrange, duplicate, or delete PDF pages with visual drag-and-drop control." + }, + "extractPages": { + "tags": "pull,select,copy", + "title": "Pagina's extraheren", + "desc": "Extract specific pages from a PDF document" + }, + "removePages": { + "tags": "delete,extract,exclude", + "title": "Verwijderen", + "desc": "Verwijder ongewenste pagina's uit je PDF-document." + }, + "autoSizeSplitPDF": { + "tags": "auto,split,size", + "title": "Automatisch splitsen op grootte/aantal", + "desc": "Splits een enkele PDF in meerdere documenten op basis van grootte, aantal pagina's of aantal documenten" + }, + "replaceColor": { + "title": "Replace & Invert Colour", + "desc": "Replace or invert colours in PDF documents" + }, + "devApi": { + "tags": "API,development,documentation", + "title": "API", + "desc": "Link to API documentation" + }, + "devFolderScanning": { + "tags": "automation,folder,scanning", + "title": "Automated Folder Scanning", + "desc": "Link to automated folder scanning guide" + }, + "devSsoGuide": { + "title": "SSO Guide", + "desc": "Link to SSO guide" + }, + "devAirgapped": { + "title": "Air-gapped Setup", + "desc": "Link to air-gapped setup guide" + }, + "addPassword": { + "title": "Wachtwoord toevoegen", + "desc": "Versleutel je PDF-document met een wachtwoord." + }, + "changePermissions": { + "title": "Rechten wijzigen", + "desc": "Change document restrictions and permissions" + }, + "automate": { + "tags": "workflow,sequence,automation", + "title": "Automate", + "desc": "Build multi-step workflows by chaining together PDF actions. Ideal for recurring tasks." + }, + "overlay-pdfs": { + "desc": "Plaatst PDF's over een andere PDF heen", + "title": "PDF's overlappen" + }, "imageToPDF": { "title": "Afbeelding naar PDF", "desc": "Converteer een afbeelding (PNG, JPEG, GIF) naar PDF." @@ -355,18 +786,6 @@ "title": "PDF naar Afbeelding", "desc": "Converteer een PDF naar een afbeelding. (PNG, JPEG, GIF)" }, - "pdfOrganiser": { - "title": "Organiseren", - "desc": "Verwijder/herschik pagina's in een volgorde naar keus" - }, - "addImage": { - "title": "Afbeelding toevoegen", - "desc": "Voegt een afbeelding toe op een specifieke locatie in de PDF" - }, - "watermark": { - "title": "Watermerk toevoegen", - "desc": "Voeg een aangepast watermerk toe aan je PDF-document." - }, "permissions": { "title": "Permissies wijzigen", "desc": "Wijzig de permissies van je PDF-document" @@ -375,38 +794,10 @@ "title": "Verwijderen", "desc": "Verwijder ongewenste pagina's uit je PDF-document." }, - "addPassword": { - "title": "Wachtwoord toevoegen", - "desc": "Versleutel je PDF-document met een wachtwoord." - }, - "removePassword": { - "title": "Wachtwoord verwijderen", - "desc": "Verwijder wachtwoordbeveiliging van je PDF-document." - }, - "compress": { - "title": "Comprimeren", - "desc": "Comprimeer PDF's om hun bestandsgrootte te verkleinen." - }, - "unlockPDFForms": { - "title": "Unlock PDF Forms", - "desc": "Remove read-only property of form fields in a PDF document." - }, - "changeMetadata": { - "title": "Metadata wijzigen", - "desc": "Wijzig/verwijder/voeg metadata toe van een PDF-document" - }, "fileToPDF": { "title": "Bestand naar PDF converteren", "desc": "Converteer bijna ieder bestand naar PDF (DOCX, PNG, XLS, PPT, TXT en meer)" }, - "ocr": { - "title": "OCR / Scans opruimen", - "desc": "Ruim scans op, detecteert tekst van afbeeldingen in een PDF en voegt deze opnieuw toe als tekst." - }, - "extractImages": { - "title": "Afbeeldingen extraheren", - "desc": "Extraheert alle afbeeldingen uit een PDF en slaat ze op in een zip" - }, "pdfToPDFA": { "title": "PDF naar PDF/A", "desc": "Converteer PDF naar PDF/A voor langdurige opslag" @@ -435,70 +826,14 @@ "title": "Detecteer/Split gescande foto's", "desc": "Splits meerdere foto's van binnen een foto/PDF" }, - "sign": { - "title": "Ondertekenen", - "desc": "Voegt handtekening toe aan PDF via tekenen, tekst of afbeelding" - }, - "flatten": { - "title": "Platdrukken", - "desc": "Verwijder alle interactieve elementen en formulieren uit een PDF" - }, - "repair": { - "title": "Repareren", - "desc": "Probeert een corrupt/beschadigd PDF te herstellen" - }, - "removeBlanks": { - "title": "Verwijder lege pagina's", - "desc": "Detecteert en verwijdert lege pagina's uit een document" - }, - "removeAnnotations": { - "title": "Annotaties verwijderen", - "desc": "Verwijdert alle opmerkingen/annotaties uit een PDF" - }, - "compare": { - "title": "Vergelijken", - "desc": "Vergelijkt en toont de verschillen tussen twee PDF-documenten" - }, - "certSign": { - "title": "Ondertekenen met certificaat", - "desc": "Ondertekent een PDF met een certificaat/sleutel (PEM/P12)" - }, - "removeCertSign": { - "title": "Verwijder certificaat", - "desc": "Verwijder certificaat van PDF" - }, - "pageLayout": { - "title": "Multi-pagina indeling", - "desc": "Voeg meerdere pagina's van een PDF-document samen op ÊÊn pagina" - }, - "scalePages": { - "title": "Aanpassen paginaformaat/schaal", - "desc": "Wijzig de grootte/schaal van een pagina en/of de inhoud ervan." - }, "pipeline": { "title": "Pijplijn", "desc": "Voer meerdere acties uit op PDF's door pipelinescripts te definiÃĢren" }, - "addPageNumbers": { - "title": "Paginanummers toevoegen", - "desc": "Voeg paginanummers toe binnen het volledige document op een vastgestelde locatie" - }, "auto-rename": { "title": "Automatisch hernoemen PDF-bestand", "desc": "Hernoemt automatisch een PDF-bestand op basis van de gedetecteerde header" }, - "adjustContrast": { - "title": "Kleuren/contrast aanpassen", - "desc": "Pas contrast, verzadiging en helderheid van een PDF aan" - }, - "crop": { - "title": "PDF bijsnijden", - "desc": "Snijd een PDF bij om de grootte te verkleinen (behoudt tekst!)" - }, - "autoSplitPDF": { - "title": "Automatisch splitsen pagina's", - "desc": "Automatisch splitsen van gescande PDF met fysieke gescande paginasplitter QR-code" - }, "sanitizePDF": { "title": "Opschonen", "desc": "Verwijder scripts en andere elementen uit PDF-bestanden" @@ -519,30 +854,14 @@ "title": "PDF to Markdown", "desc": "Converts any PDF to Markdown" }, - "getPdfInfo": { - "title": "Haal ALLE informatie op over PDF", - "desc": "Haalt alle mogelijke informatie op van PDF's" - }, "pageExtracter": { "title": "Pagina('s) extraheren", "desc": "Extraheert geselecteerde pagina's uit PDF" }, - "pdfToSinglePage": { - "title": "PDF naar ÊÊn grote pagina", - "desc": "Voegt alle PDF-pagina's samen tot ÊÊn grote pagina" - }, - "showJS": { - "title": "Toon Javascript", - "desc": "Zoekt en toont ieder script dat in een PDF is geïnjecteerd" - }, "autoRedact": { "title": "Automatisch censureren", "desc": "Automatisch censureren (onherkenbaar maken) van tekst in een PDF op basis van ingevoerde tekst" }, - "redact": { - "title": "Manual Redaction", - "desc": "Redacts a PDF based on selected text, drawn shapes and/or selected page(s)" - }, "PDFToCSV": { "title": "PDF naar CSV", "desc": "Haalt tabellen uit een PDF en converteert ze naar CSV" @@ -551,10 +870,6 @@ "title": "Automatisch splitsen op grootte/aantal", "desc": "Splits een enkele PDF in meerdere documenten op basis van grootte, aantal pagina's of aantal documenten" }, - "overlay-pdfs": { - "title": "PDF's overlappen", - "desc": "Plaatst PDF's over een andere PDF heen" - }, "split-by-sections": { "title": "PDF in secties splitsen", "desc": "Verdeel elke pagina van een PDF in kleinere horizontale en verticale secties" @@ -563,43 +878,17 @@ "title": "Stempel toevoegen aan PDF", "desc": "Voeg tekst of afbeeldingsstempels toe op vaste locaties" }, - "removeImage": { - "title": "Afbeelding verwijderen", - "desc": "Afbeeldingen uit PDF verwijderen om het bestandsgrootte te verminderen" - }, - "splitByChapters": { - "title": "PDF op hoofdstukken splitsen", - "desc": "Splits een PDF op basis van zijn hoofdstukstructuur in meerdere bestanden." - }, - "validateSignature": { - "title": "Validate PDF Signature", - "desc": "Verify digital signatures and certificates in PDF documents" - }, "replace-color": { "title": "Replace and Invert Color", "desc": "Vervang de kleur van tekst en achtergrond in een PDF en omverkeer de volledige kleur van het document om bestandsgrootte te verkleinen." }, - "convert": { - "title": "Omzetten" - }, "attachments": { "title": "Add attachments" }, - "extractPages": { - "title": "Pagina's extraheren" - }, - "removePages": { - "title": "Verwijderen", - "desc": "Verwijder ongewenste pagina's uit je PDF-document." - }, "removeImagePdf": { "title": "Afbeelding verwijderen", "desc": "Afbeeldingen uit PDF verwijderen om het bestandsgrootte te verminderen" }, - "autoSizeSplitPDF": { - "title": "Automatisch splitsen op grootte/aantal", - "desc": "Splits een enkele PDF in meerdere documenten op basis van grootte, aantal pagina's of aantal documenten" - }, "adjust-contrast": { "title": "Kleuren/contrast aanpassen", "desc": "Pas contrast, verzadiging en helderheid van een PDF aan" @@ -607,11 +896,12 @@ "replaceColorPdf": { "title": "Replace and Invert Color", "desc": "Vervang de kleur van tekst en achtergrond in een PDF en omverkeer de volledige kleur van het document om bestandsgrootte te verkleinen." - }, - "changePermissions": { - "title": "Rechten wijzigen" } }, + "landing": { + "addFiles": "Add Files", + "uploadFromComputer": "Upload from computer" + }, "viewPdf": { "tags": "bekijken,lezen,annoteren,tekst,afbeelding", "title": "View/Edit PDF", @@ -645,17 +935,39 @@ "merge": { "tags": "samenvoegen,pagina bewerkingen,serverzijde", "title": "Samenvoegen", + "removeDigitalSignature": { + "label": "Remove digital signature in the merged file?", + "tooltip": { + "title": "Remove Digital Signature", + "description": "Digital signatures will be invalidated when merging files. Check this to remove them from the final merged PDF." + } + }, + "generateTableOfContents": { + "label": "Generate table of contents in the merged file?", + "tooltip": { + "title": "Generate Table of Contents", + "description": "Automatically creates a clickable table of contents in the merged PDF based on the original file names and page numbers." + } + }, + "submit": "Samenvoegen", + "sortBy": { + "description": "Files will be merged in the order they're selected. Drag to reorder or sort below.", + "label": "Sort By", + "filename": "Bestandsnaam", + "dateModified": "Date Modified", + "ascending": "Ascending", + "descending": "Descending", + "sort": "Sort" + }, + "error": { + "failed": "An error occurred while merging the PDFs." + }, "header": "Meerdere PDF's samenvoegen (2+)", "sortByName": "Sorteer op naam", "sortByDate": "Sorteer op datum", - "removeCertSign": "Verwijder digitale handtekening in het samengevoegde bestand?", - "submit": "Samenvoegen", - "sortBy": { - "filename": "Bestandsnaam" - } + "removeCertSign": "Verwijder digitale handtekening in het samengevoegde bestand?" }, "split": { - "tags": "Pagina bewerkingen,verdelen,meerdere pagina's,knippen,serverzijde", "title": "PDF splitsen", "header": "PDF splitsen", "desc": { @@ -671,25 +983,249 @@ "splitPages": "Voer pagina's in om op te splitsen:", "submit": "Splitsen", "steps": { + "chooseMethod": "Choose Method", "settings": "Instellingen" }, + "settings": { + "selectMethodFirst": "Please select a split method first" + }, + "error": { + "failed": "An error occurred while splitting the PDF." + }, + "method": { + "label": "Choose split method", + "placeholder": "Select how to split the PDF" + }, "methods": { + "prefix": { + "splitAt": "Split at", + "splitBy": "Split by" + }, + "byPages": { + "name": "Page Numbers", + "desc": "Extract specific pages (1,3,5-10)", + "tooltip": "Enter page numbers separated by commas or ranges with hyphens" + }, + "bySections": { + "name": "Sections", + "desc": "Divide pages into grid sections", + "tooltip": "Split each page into horizontal and vertical sections" + }, "bySize": { - "name": "Bestandsgrootte" + "name": "Bestandsgrootte", + "desc": "Limit maximum file size", + "tooltip": "Specify maximum file size (e.g. 10MB, 500KB)" + }, + "byPageCount": { + "name": "Page Count", + "desc": "Fixed pages per file", + "tooltip": "Enter the number of pages for each split file" + }, + "byDocCount": { + "name": "Document Count", + "desc": "Create specific number of files", + "tooltip": "Enter how many files you want to create" + }, + "byChapters": { + "name": "Chapters", + "desc": "Split at bookmark boundaries", + "tooltip": "Uses PDF bookmarks to determine split points" + }, + "byPageDivider": { + "name": "Page Divider", + "desc": "Auto-split with divider sheets", + "tooltip": "Use QR code divider sheets between documents when scanning" } }, "value": { "fileSize": { - "label": "Bestandsgrootte" + "label": "Bestandsgrootte", + "placeholder": "e.g. 10MB, 500KB" + }, + "pageCount": { + "label": "Pages per File", + "placeholder": "e.g. 5, 10" + }, + "docCount": { + "label": "Number of Files", + "placeholder": "e.g. 3, 5" } - } + }, + "tooltip": { + "header": { + "title": "Split Methods Overview" + }, + "byPages": { + "title": "Split at Page Numbers", + "text": "Split your PDF at specific page numbers. Using 'n' splits after page n. Using 'n-m' splits before page n and after page m.", + "bullet1": "Single split points: 3,7 (splits after pages 3 and 7)", + "bullet2": "Range split points: 3-8 (splits before page 3 and after page 8)", + "bullet3": "Mixed: 2,5-10,15 (splits after page 2, before page 5, after page 10, and after page 15)" + }, + "bySections": { + "title": "Split by Grid Sections", + "text": "Divide each page into a grid of sections. Useful for splitting documents with multiple columns or extracting specific areas.", + "bullet1": "Horizontal: Number of rows to create", + "bullet2": "Vertical: Number of columns to create", + "bullet3": "Merge: Combine all sections into one PDF" + }, + "bySize": { + "title": "Split by File Size", + "text": "Create multiple PDFs that don't exceed a specified file size. Ideal for file size limitations or email attachments.", + "bullet1": "Use MB for larger files (e.g., 10MB)", + "bullet2": "Use KB for smaller files (e.g., 500KB)", + "bullet3": "System will split at page boundaries" + }, + "byCount": { + "title": "Split by Count", + "text": "Create multiple PDFs with a specific number of pages or documents each.", + "bullet1": "Page Count: Fixed number of pages per file", + "bullet2": "Document Count: Fixed number of output files", + "bullet3": "Useful for batch processing workflows" + }, + "byChapters": { + "title": "Split by Chapters", + "text": "Use PDF bookmarks to automatically split at chapter boundaries. Requires PDFs with bookmark structure.", + "bullet1": "Bookmark Level: Which level to split on (1=top level)", + "bullet2": "Include Metadata: Preserve document properties", + "bullet3": "Allow Duplicates: Handle repeated bookmark names" + }, + "byDocCount": { + "bullet1": "Enter the number of output files you want", + "bullet2": "Pages are distributed as evenly as possible", + "bullet3": "Useful when you need a specific number of files", + "text": "Create a specific number of output files by evenly distributing pages across them.", + "title": "Split by Document Count" + }, + "byPageCount": { + "bullet1": "Enter the number of pages per output file", + "bullet2": "Last file may have fewer pages if not evenly divisible", + "bullet3": "Useful for batch processing workflows", + "text": "Create multiple PDFs with a specific number of pages each. Perfect for creating uniform document chunks.", + "title": "Split by Page Count" + }, + "byPageDivider": { + "bullet1": "Print divider sheets from the download link", + "bullet2": "Insert divider sheets between your documents", + "bullet3": "Scan all documents together as one PDF", + "bullet4": "Upload - divider pages are automatically detected and removed", + "bullet5": "Enable Duplex Mode if scanning both sides of divider sheets", + "text": "Automatically split scanned documents using physical divider sheets with QR codes. Perfect for processing multiple documents scanned together.", + "title": "Split by Page Divider" + } + }, + "methodSelection": { + "tooltip": { + "bullet1": "Click on a method card to select it", + "bullet2": "Hover over each card to see a quick description", + "bullet3": "The settings step will appear after you select a method", + "bullet4": "You can change methods at any time before processing", + "header": { + "text": "Choose how you want to split your PDF document. Each method is optimized for different use cases and document types.", + "title": "Split Method Selection" + }, + "title": "Choose Your Split Method" + } + }, + "selectMethod": "Select a split method", + "tags": "Pagina bewerkingen,verdelen,meerdere pagina's,knippen,serverzijde" }, "rotate": { - "tags": "serverzijde", "title": "PDF roteren", + "submit": "Roteren", + "selectRotation": "Select Rotation Angle (Clockwise)", + "error": { + "failed": "An error occurred while rotating the PDF." + }, + "preview": { + "title": "Rotation Preview" + }, + "rotateLeft": "Rotate Anticlockwise", + "rotateRight": "Rotate Clockwise", + "tooltip": { + "header": { + "title": "Rotate Settings Overview" + }, + "description": { + "text": "Rotate your PDF pages clockwise or anticlockwise in 90-degree increments. All pages in the PDF will be rotated. The preview shows how your document will look after rotation." + }, + "controls": { + "title": "Controls", + "text": "Use the rotation buttons to adjust orientation. Left button rotates anticlockwise, right button rotates clockwise. Each click rotates by 90 degrees." + } + }, + "tags": "serverzijde", "header": "PDF roteren", - "selectAngle": "Selecteer rotatiehoek (in veelvouden van 90 graden):", - "submit": "Roteren" + "selectAngle": "Selecteer rotatiehoek (in veelvouden van 90 graden):" + }, + "convert": { + "title": "Omzetten", + "desc": "Convert files between different formats", + "files": "Files", + "selectFilesPlaceholder": "Select files in the main view to get started", + "settings": "Instellingen", + "conversionCompleted": "Conversion completed", + "results": "Results", + "defaultFilename": "converted_file", + "conversionResults": "Conversion Results", + "convertFrom": "Convert from", + "convertTo": "Convert to", + "sourceFormatPlaceholder": "Source format", + "targetFormatPlaceholder": "Target format", + "selectSourceFormatFirst": "Select a source format first", + "outputOptions": "Output Options", + "pdfOptions": "PDF Options", + "imageOptions": "Image Options", + "colorType": "Colour Type", + "color": "Kleur", + "greyscale": "Grijstinten", + "blackwhite": "Black & White", + "dpi": "DPI", + "output": "Output", + "single": "Single", + "multiple": "Multiple", + "fitOption": "Fit Option", + "maintainAspectRatio": "Maintain Aspect Ratio", + "fitDocumentToPage": "Fit Document to Page", + "fillPage": "Pagina vullen", + "autoRotate": "Auto Rotate", + "autoRotateDescription": "Automatically rotate images to better fit the PDF page", + "combineImages": "Combine Images", + "combineImagesDescription": "Combine all images into one PDF, or create separate PDFs for each image", + "webOptions": "Web to PDF Options", + "zoomLevel": "Zoom Level", + "emailOptions": "Email to PDF Options", + "includeAttachments": "Include email attachments", + "maxAttachmentSize": "Maximum attachment size (MB)", + "includeAllRecipients": "Include CC and BCC recipients in header", + "downloadHtml": "Download HTML intermediate file instead of PDF", + "pdfaOptions": "PDF/A Options", + "outputFormat": "Output Format", + "pdfaNote": "PDF/A-1b is more compatible, PDF/A-2b supports more features.", + "pdfaDigitalSignatureWarning": "Dit PDF bestand bevat een digitale handtekening. Deze wordt in de volgende stap verwijderd.", + "fileFormat": "File Format", + "wordDoc": "Word Document", + "wordDocExt": "Word Document (.docx)", + "odtExt": "OpenDocument Text (.odt)", + "pptExt": "PowerPoint (.pptx)", + "odpExt": "OpenDocument Presentation (.odp)", + "txtExt": "Plain Text (.txt)", + "rtfExt": "Rich Text Format (.rtf)", + "selectedFiles": "Selected files", + "noFileSelected": "No file selected. Use the file panel to add files.", + "convertFiles": "Convert Files", + "converting": "Converting...", + "downloadConverted": "Download Converted File", + "errorNoFiles": "Please select at least one file to convert.", + "errorNoFormat": "Please select both source and target formats.", + "errorNotSupported": "Conversion from {{from}} to {{to}} is not supported.", + "images": "Images", + "officeDocs": "Office Documents (Word, Excel, PowerPoint)", + "imagesExt": "Images (JPG, PNG, etc.)", + "markdown": "Markdown", + "textRtf": "Text/RTF", + "grayscale": "Grijstinten", + "errorConversion": "An error occurred while converting the file." }, "imageToPdf": { "tags": "conversie,img,jpg,foto" @@ -727,7 +1263,33 @@ "8": "Laatste verwijderen", "9": "Eerste en laaste verwijderen", "10": "Oneven-even samenvoeken", - "11": "Duplicate all pages" + "11": "Duplicate all pages", + "desc": { + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, â€Ļ).", + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, â€Ļ).", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimized for binding on the side)." + } + }, + "desc": { + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, â€Ļ).", + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, â€Ļ).", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimised for binding on the side).", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document." }, "placeholder": "(bijv. 1,3,2 of 4-8,2,10-12 of 2n-1)" }, @@ -739,9 +1301,198 @@ "upload": "Afbeelding toevoegen", "submit": "Afbeelding toevoegen" }, + "attachments": { + "tags": "embed,attach,file,attachment,attachments", + "title": "Add attachments", + "header": "Add attachments", + "add": "Add Attachment", + "remove": "Remove Attachment", + "embed": "Embed Attachment", + "submit": "Add attachments" + }, "watermark": { - "tags": "Tekst,herhalend,label,eigen,copyright,handelsmerk,img,jpg,foto", "title": "Watermerk toevoegen", + "desc": "Add text or image watermarks to PDF files", + "completed": "Watermark added", + "submit": "Watermerk toevoegen", + "filenamePrefix": "watermarked", + "error": { + "failed": "An error occurred while adding watermark to the PDF." + }, + "watermarkType": { + "text": "Tekst", + "image": "Image" + }, + "settings": { + "type": "Watermark Type", + "text": { + "label": "Watermark Text", + "placeholder": "Enter watermark text" + }, + "image": { + "label": "Watermark Image", + "choose": "Choose Image", + "selected": "Selected: {{filename}}" + }, + "fontSize": "Lettertypegrootte", + "size": "Size", + "alphabet": "Font/Language", + "color": "Watermark Colour", + "rotation": "Rotation (degrees)", + "opacity": "Opacity (%)", + "spacing": { + "horizontal": "Horizontal Spacing", + "vertical": "Vertical Spacing", + "height": "Height Spacing", + "width": "Width Spacing" + }, + "convertToImage": "Flatten PDF pages to images" + }, + "alphabet": { + "roman": "Roman/Latin", + "arabic": "Arabic", + "japanese": "Japanese", + "korean": "Korean", + "chinese": "Chinese", + "thai": "Thai" + }, + "steps": { + "type": "Watermark Type", + "wording": "Wording", + "textStyle": "Style", + "formatting": "Formatting", + "file": "Watermark File" + }, + "results": { + "title": "Watermark Results" + }, + "tooltip": { + "language": { + "title": "Language Support", + "text": "Choose the appropriate language setting to ensure proper font rendering for your text." + }, + "appearance": { + "title": "Appearance Settings", + "text": "Control how your watermark looks and blends with the document.", + "bullet1": "Rotation: -360° to 360° for angled watermarks", + "bullet2": "Opacity: 0-100% for transparency control", + "bullet3": "Lower opacity creates subtle watermarks" + }, + "spacing": { + "title": "Spacing Control", + "text": "Adjust the spacing between repeated watermarks across the page.", + "bullet1": "Width spacing: Horizontal distance between watermarks", + "bullet2": "Height spacing: Vertical distance between watermarks", + "bullet3": "Higher values create more spread out patterns" + }, + "type": { + "header": { + "title": "Watermark Type Selection" + }, + "description": { + "title": "Choose Your Watermark", + "text": "Select between text or image watermarks based on your needs." + }, + "text": { + "title": "Text Watermarks", + "text": "Perfect for adding copyright notices, company names, or confidentiality labels. Supports multiple languages and custom colours.", + "bullet1": "Customisable fonts and languages", + "bullet2": "Adjustable colours and transparency", + "bullet3": "Ideal for legal or branding text" + }, + "image": { + "title": "Image Watermarks", + "text": "Use logos, stamps, or any image as a watermark. Great for branding and visual identification.", + "bullet1": "Upload any image format", + "bullet2": "Maintains image quality", + "bullet3": "Perfect for logos and stamps" + } + }, + "wording": { + "header": { + "title": "Text Content" + }, + "text": { + "title": "Watermark Text", + "text": "Enter the text that will appear as your watermark across the document.", + "bullet1": "Keep it concise for better readability", + "bullet2": "Common examples: 'CONFIDENTIAL', 'DRAFT', company name", + "bullet3": "Emoji characters are not supported and will be filtered out" + } + }, + "textStyle": { + "header": { + "title": "Text Style" + }, + "color": { + "title": "Colour Selection", + "text": "Choose a colour that provides good contrast with your document content.", + "bullet1": "Light grey (#d3d3d3) for subtle watermarks", + "bullet2": "Black or dark colours for high contrast", + "bullet3": "Custom colours for branding purposes" + }, + "language": { + "title": "Language Support", + "text": "Choose the appropriate language setting to ensure proper font rendering." + } + }, + "file": { + "header": { + "title": "Image Upload" + }, + "upload": { + "title": "Image Selection", + "text": "Upload an image file to use as your watermark.", + "bullet1": "Supports common formats: PNG, JPG, GIF, BMP", + "bullet2": "PNG with transparency works best", + "bullet3": "Higher resolution images maintain quality better" + }, + "recommendations": { + "title": "Best Practices", + "text": "Tips for optimal image watermark results.", + "bullet1": "Use logos or stamps with transparent backgrounds", + "bullet2": "Simple designs work better than complex images", + "bullet3": "Consider the final document size when choosing resolution" + } + }, + "formatting": { + "header": { + "title": "Formatting & Layout" + }, + "size": { + "title": "Size Control", + "text": "Adjust the size of your watermark (text or image).", + "bullet1": "Larger sizes create more prominent watermarks" + }, + "appearance": { + "title": "Appearance Settings", + "text": "Control how your watermark looks and blends with the document.", + "bullet1": "Rotation: -360° to 360° for angled watermarks", + "bullet2": "Opacity: 0-100% for transparency control", + "bullet3": "Lower opacity creates subtle watermarks" + }, + "spacing": { + "title": "Spacing Control", + "text": "Adjust the spacing between repeated watermarks across the page.", + "bullet1": "Horizontal spacing: Distance between watermarks left to right", + "bullet2": "Vertical spacing: Distance between watermarks top to bottom", + "bullet3": "Higher values create more spread out patterns" + }, + "security": { + "title": "Security Option", + "text": "Convert the final PDF to an image-based format for enhanced security.", + "bullet1": "Prevents text selection and copying", + "bullet2": "Makes watermarks harder to remove", + "bullet3": "Results in larger file sizes", + "bullet4": "Best for sensitive or copyrighted content" + } + } + }, + "type": { + "1": "Tekst", + "2": "Afbeelding" + }, + "tags": "Tekst,herhalend,label,eigen,copyright,handelsmerk,img,jpg,foto", "header": "Watermerk toevoegen", "customColor": "Aangepaste tekstkleur", "selectText": { @@ -755,17 +1506,6 @@ "8": "Type watermerk:", "9": "Watermerk afbeelding:", "10": "PDF omzetten naar PDF-Afbeelding" - }, - "submit": "Watermerk toevoegen", - "type": { - "1": "Tekst", - "2": "Afbeelding" - }, - "watermarkType": { - "text": "Tekst" - }, - "settings": { - "fontSize": "Lettertypegrootte" } }, "permissions": { @@ -790,50 +1530,201 @@ "removePages": { "tags": "Pagina's verwijderen", "title": "Verwijderen", + "pageNumbers": { + "label": "Pages to Remove", + "placeholder": "e.g., 1,3,5-8,10", + "error": "Invalid page number format. Use numbers, ranges (1-5), or mathematical expressions (2n+1)" + }, + "filenamePrefix": "pages_removed", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "settings": { + "title": "Settings" + }, + "tooltip": { + "header": { + "title": "Remove Pages Settings" + }, + "pageNumbers": { + "title": "Page Selection", + "text": "Specify which pages to remove from your PDF. You can select individual pages, ranges, or use mathematical expressions.", + "bullet1": "Individual pages: 1,3,5 (removes pages 1, 3, and 5)", + "bullet2": "Page ranges: 1-5,10-15 (removes pages 1-5 and 10-15)", + "bullet3": "Mathematical: 2n+1 (removes odd pages)", + "bullet4": "Open ranges: 5- (removes from page 5 to end)" + }, + "examples": { + "title": "Common Examples", + "text": "Here are some common page selection patterns:", + "bullet1": "Remove first page: 1", + "bullet2": "Remove last 3 pages: -3", + "bullet3": "Remove every other page: 2n", + "bullet4": "Remove specific scattered pages: 1,5,10,15" + }, + "safety": { + "title": "Safety Tips", + "text": "Important considerations when removing pages:", + "bullet1": "Always preview your selection before processing", + "bullet2": "Keep a backup of your original file", + "bullet3": "Page numbers start from 1, not 0", + "bullet4": "Invalid page numbers will be ignored" + } + }, + "error": { + "failed": "An error occurred whilst removing pages." + }, + "results": { + "title": "Page Removal Results" + }, "submit": "Verwijderen" }, - "addPassword": { - "tags": "veilig,beveiliging", - "title": "Wachtwoord toevoegen", - "header": "Wachtwoord toevoegen (Versleutelen)", - "selectText": { - "1": "Selecteer PDF om te versleutelen", - "2": "Gebruikerswachtwoord", - "3": "Versleutelingssleutellengte", - "4": "Hogere waarden zijn sterker, maar lagere waarden hebben een betere compatibiliteit.", - "5": "In te stellen rechten (Aanbevolen om te gebruiken samen met eigenaarswachtwoord)", - "6": "Voorkomen van documentassemblage", - "7": "Voorkomen van inhoudsextractie", - "8": "Voorkomen van extractie voor toegankelijkheid", - "9": "Voorkomen van invullen van formulier", - "10": "Voorkomen van wijziging", - "11": "Voorkomen van annotatiewijziging", - "12": "Voorkomen van afdrukken", - "13": "Voorkomen van afdrukken in verschillende formaten", - "14": "Eigenaarswachtwoord", - "15": "Beperkt wat gedaan kan worden met het document nadat het is geopend (Niet ondersteund door alle lezers)", - "16": "Beperkt het openen van het document zelf" + "extractPages": { + "title": "Extract Pages", + "pageNumbers": { + "label": "Pages to Extract", + "placeholder": "e.g., 1,3,5-8 or odd & 1-10" + }, + "settings": { + "title": "Settings" }, - "submit": "Versleutelen", "tooltip": { - "permissions": { - "title": "Rechten wijzigen" + "description": "Extracts the selected pages into a new PDF, preserving order." + }, + "error": { + "failed": "Failed to extract pages" + }, + "results": { + "title": "Pages Extracted" + }, + "submit": "Extract Pages" + }, + "pageSelection": { + "tooltip": { + "header": { + "title": "Page Selection Guide" + }, + "basic": { + "title": "Basic Usage", + "text": "Select specific pages from your PDF document using simple syntax.", + "bullet1": "Individual pages: 1,3,5", + "bullet2": "Page ranges: 3-6 or 10-15", + "bullet3": "All pages: all" + }, + "advanced": { + "title": "Advanced Features" + }, + "tips": { + "title": "Tips", + "text": "Keep these guidelines in mind:", + "bullet1": "Page numbers start from 1 (not 0)", + "bullet2": "Spaces are automatically removed", + "bullet3": "Invalid expressions are ignored" + }, + "syntax": { + "title": "Syntax Basics", + "text": "Use numbers, ranges, keywords, and progressions (n starts at 0). Parentheses are supported.", + "bullets": { + "numbers": "Numbers/ranges: 5, 10-20", + "keywords": "Keywords: odd, even", + "progressions": "Progressions: 3n, 4n+1" + } + }, + "operators": { + "title": "Operators", + "text": "AND has higher precedence than comma. NOT applies within the document range.", + "and": "AND: & or \"and\" — require both conditions (e.g., 1-50 & even)", + "comma": "Comma: , or | — combine selections (e.g., 1-10, 20)", + "not": "NOT: ! or \"not\" — exclude pages (e.g., 3n & not 30)" + }, + "examples": { + "title": "Examples" + }, + "complex": { + "bullet1": "1,3-5,8,2n → pages 1, 3–5, 8, plus evens", + "bullet2": "10-,2n-1 → from page 10 to end + odd pages", + "description": "Mix different types.", + "title": "Complex Combinations" + }, + "description": "Choose which pages to use for the operation. Supports single pages, ranges, formulas, and the all keyword.", + "individual": { + "bullet1": "1,3,5 → selects pages 1, 3, 5", + "bullet2": "2,7,12 → selects pages 2, 7, 12", + "description": "Enter numbers separated by commas.", + "title": "Individual Pages" + }, + "mathematical": { + "bullet1": "2n → all even pages (2, 4, 6â€Ļ)", + "bullet2": "2n-1 → all odd pages (1, 3, 5â€Ļ)", + "bullet3": "3n → every 3rd page (3, 6, 9â€Ļ)", + "bullet4": "4n-1 → pages 3, 7, 11, 15â€Ļ", + "description": "Use n in formulas for patterns.", + "title": "Mathematical Functions" + }, + "ranges": { + "bullet1": "3-6 → selects pages 3–6", + "bullet2": "10-15 → selects pages 10–15", + "bullet3": "5- → selects pages 5 to end", + "description": "Use - for consecutive pages.", + "title": "Page Ranges" + }, + "special": { + "bullet1": "all → selects all pages", + "title": "Special Keywords" } } }, - "removePassword": { - "tags": "veilig,ontsleutelen,beveiliging,wachtwoord verwijderen", - "title": "Wachtwoord verwijderen", - "header": "Wachtwoord verwijderen (Decrypteren)", - "selectText": { - "1": "Selecteer PDF om te decrypteren", - "2": "Wachtwoord" + "bulkSelection": { + "syntaxError": "There is a syntax issue. See Page Selection tips for help.", + "header": { + "title": "Page Selection Guide" }, - "submit": "Verwijderen", - "desc": "Verwijder wachtwoordbeveiliging van je PDF-document.", - "password": { - "stepTitle": "Wachtwoord verwijderen", - "label": "Huidige wachtwoord" + "syntax": { + "title": "Syntax Basics", + "text": "Use numbers, ranges, keywords, and progressions (n starts at 0). Parentheses are supported.", + "bullets": { + "numbers": "Numbers/ranges: 5, 10-20", + "keywords": "Keywords: odd, even", + "progressions": "Progressions: 3n, 4n+1" + } + }, + "operators": { + "title": "Operators", + "text": "AND has higher precedence than comma. NOT applies within the document range.", + "and": "AND: & or \"and\" — require both conditions (e.g., 1-50 & even)", + "comma": "Comma: , or | — combine selections (e.g., 1-10, 20)", + "not": "NOT: ! or \"not\" — exclude pages (e.g., 3n & not 30)" + }, + "examples": { + "title": "Examples", + "first50": "First 50", + "last50": "Last 50", + "every3rd": "Every 3rd", + "oddWithinExcluding": "Odd within 1-20 excluding 5-7", + "combineSets": "Combine sets" + }, + "firstNPages": { + "title": "First N Pages", + "placeholder": "Number of pages" + }, + "lastNPages": { + "title": "Last N Pages", + "placeholder": "Number of pages" + }, + "everyNthPage": { + "title": "Every Nth Page", + "placeholder": "Step size" + }, + "range": { + "title": "Range", + "fromPlaceholder": "From", + "toPlaceholder": "To" + }, + "keywords": { + "title": "Keywords" + }, + "advanced": { + "title": "Advanced" } }, "compressPdfs": { @@ -843,12 +1734,142 @@ "tags": "remove,delete,form,field,readonly", "title": "Remove Read-Only from Form Fields", "header": "Unlock PDF Forms", - "submit": "Remove" + "submit": "Remove", + "description": "This tool will remove read-only restrictions from PDF form fields, making them editable and fillable.", + "filenamePrefix": "unlocked_forms", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst unlocking PDF forms." + }, + "results": { + "title": "Unlocked Forms Results" + } }, "changeMetadata": { - "tags": "Titel,auteur,datum,creatie,tijd,uitgever,producent,statistieken", - "title": "Titel:", "header": "Metadata wijzigen", + "submit": "Wijzigen", + "filenamePrefix": "metadata", + "settings": { + "title": "Metadata Settings" + }, + "standardFields": { + "title": "Standard Fields" + }, + "deleteAll": { + "label": "Remove Existing Metadata", + "checkbox": "Delete all metadata" + }, + "title": { + "label": "Title", + "placeholder": "Document title" + }, + "author": { + "label": "Author", + "placeholder": "Document author" + }, + "subject": { + "label": "Subject", + "placeholder": "Document subject" + }, + "keywords": { + "label": "Keywords", + "placeholder": "Document keywords" + }, + "creator": { + "label": "Creator", + "placeholder": "Document creator" + }, + "producer": { + "label": "Producer", + "placeholder": "Document producer" + }, + "dates": { + "title": "Date Fields" + }, + "creationDate": { + "label": "Creation Date", + "placeholder": "Creation date" + }, + "modificationDate": { + "label": "Modification Date", + "placeholder": "Modification date" + }, + "trapped": { + "label": "Trapped Status", + "unknown": "Unknown", + "true": "True", + "false": "False" + }, + "advanced": { + "title": "Advanced Options" + }, + "customFields": { + "title": "Custom Metadata", + "description": "Add custom metadata fields to the document", + "add": "Add Field", + "key": "Key", + "keyPlaceholder": "Custom key", + "value": "Value", + "valuePlaceholder": "Custom value", + "remove": "Remove" + }, + "results": { + "title": "Updated PDFs" + }, + "error": { + "failed": "An error occurred while changing the PDF metadata." + }, + "tooltip": { + "header": { + "title": "PDF Metadata Overview" + }, + "standardFields": { + "title": "Standard Fields", + "text": "Common PDF metadata fields that describe the document.", + "bullet1": "Title: Document name or heading", + "bullet2": "Author: Person who created the document", + "bullet3": "Subject: Brief description of content", + "bullet4": "Keywords: Search terms for the document", + "bullet5": "Creator/Producer: Software used to create the PDF" + }, + "dates": { + "title": "Date Fields", + "text": "When the document was created and modified.", + "bullet1": "Creation Date: When original document was made", + "bullet2": "Modification Date: When last changed" + }, + "options": { + "title": "Additional Options", + "text": "Custom fields and privacy controls.", + "bullet1": "Custom Metadata: Add your own key-value pairs", + "bullet2": "Trapped Status: High-quality printing setting", + "bullet3": "Delete All: Remove all metadata for privacy" + }, + "deleteAll": { + "title": "Remove Existing Metadata", + "text": "Complete metadata deletion to ensure privacy." + }, + "customFields": { + "title": "Custom Metadata", + "text": "Add your own custom key-value metadata pairs.", + "bullet1": "Add any custom fields relevant to your document", + "bullet2": "Examples: Department, Project, Version, Status", + "bullet3": "Both key and value are required for each entry" + }, + "advanced": { + "title": "Advanced Options", + "trapped": { + "title": "Trapped Status", + "description": "Indicates if document is prepared for high-quality printing.", + "bullet1": "True: Document has been trapped for printing", + "bullet2": "False: Document has not been trapped", + "bullet3": "Unknown: Trapped status is not specified" + } + } + }, + "tags": "Titel,auteur,datum,creatie,tijd,uitgever,producent,statistieken", "selectText": { "1": "Pas de variabelen aan die je wilt wijzigen", "2": "Verwijder alle metadata", @@ -856,15 +1877,7 @@ "4": "Overige metadata:", "5": "Voeg aangepaste metadata-invoer toe" }, - "author": "Auteur:", - "creationDate": "Aanmaakdatum (yyyy/MM/dd HH:mm:ss):", - "creator": "Maker:", - "keywords": "Trefwoorden:", - "modDate": "Wijzigingsdatum (yyyy/MM/dd HH:mm:ss):", - "producer": "Producent:", - "subject": "Onderwerp:", - "trapped": "Vastgezet:", - "submit": "Wijzigen" + "modDate": "Wijzigingsdatum (yyyy/MM/dd HH:mm:ss):" }, "fileToPDF": { "tags": "transformatie,formaat,document,foto,slide,tekst,conversie,kantoor,docs,word,excel,powerpoint", @@ -878,6 +1891,7 @@ "ocr": { "tags": "herkenning,tekst,afbeelding,scan,lezen,identificeren,detectie,bewerkbaar", "title": "OCR / Scan opruimen", + "desc": "Ruim scans op, detecteert tekst van afbeeldingen in een PDF en voegt deze opnieuw toe als tekst.", "header": "Scans opruimen / OCR (Optical Character Recognition)", "selectText": { "1": "Selecteer talen die binnen de PDF gedetecteerd moeten worden (De vermelde zijn de momenteel gedetecteerde):", @@ -896,23 +1910,89 @@ "help": "Lees deze documentatie over hoe dit te gebruiken voor andere talen en/of gebruik buiten docker", "credit": "Deze dienst maakt gebruik van qpdf en Tesseract voor OCR.", "submit": "Verwerk PDF met OCR", - "desc": "Ruim scans op, detecteert tekst van afbeeldingen in een PDF en voegt deze opnieuw toe als tekst.", + "operation": { + "submit": "Process OCR and Review" + }, + "results": { + "title": "OCR Results" + }, + "languagePicker": { + "additionalLanguages": "Looking for additional languages?", + "viewSetupGuide": "View setup guide →" + }, "settings": { "title": "Instellingen", "ocrMode": { - "label": "OCR-modus" + "label": "OCR-modus", + "auto": "Auto (skip text layers)", + "force": "Force (re-OCR all, replace text)", + "strict": "Strict (abort if text found)" }, "languages": { - "label": "Talen" + "label": "Talen", + "placeholder": "Select languages" + }, + "compatibilityMode": { + "label": "Compatibility Mode" + }, + "advancedOptions": { + "label": "Processing Options", + "sidecar": "Create a text file", + "deskew": "Deskew pages", + "clean": "Clean input file", + "cleanFinal": "Clean final output" } }, "tooltip": { + "header": { + "title": "OCR Settings Overview" + }, "mode": { - "title": "OCR-modus" + "title": "OCR-modus", + "text": "Optical Character Recognition (OCR) helps you turn scanned or screenshotted pages into text you can search, copy, or highlight.", + "bullet1": "Auto skips pages that already contain text layers.", + "bullet2": "Force re-OCRs every page and replaces all the text.", + "bullet3": "Strict halts if any selectable text is found." }, "languages": { - "title": "Talen" + "title": "Talen", + "text": "Improve OCR accuracy by specifying the expected languages. Choose one or more languages to guide detection." + }, + "output": { + "title": "Output", + "text": "Decide how you want the text output formatted:", + "bullet1": "Searchable PDF embeds text behind the original image.", + "bullet2": "HOCR XML returns a structured machine-readable file.", + "bullet3": "Plain-text sidecar creates a separate .txt file with raw content." + }, + "advanced": { + "header": { + "title": "Advanced OCR Processing" + }, + "compatibility": { + "title": "Compatibility Mode", + "text": "Uses OCR 'sandwich PDF' mode: results in larger files, but more reliable with certain languages and older PDF software. By default we use hOCR for smaller, modern PDFs." + }, + "sidecar": { + "title": "Create Text File", + "text": "Generates a separate .txt file alongside the PDF containing all extracted text content for easy access and processing." + }, + "deskew": { + "title": "Deskew Pages", + "text": "Automatically corrects skewed or tilted pages to improve OCR accuracy. Useful for scanned documents that weren't perfectly aligned." + }, + "clean": { + "title": "Clean Input File", + "text": "Preprocesses the input by removing noise, enhancing contrast, and optimising the image for better OCR recognition before processing." + }, + "cleanFinal": { + "title": "Clean Final Output", + "text": "Post-processes the final PDF by removing OCR artefacts and optimising the text layer for better readability and smaller file size." + } } + }, + "error": { + "failed": "OCR operation failed" } }, "extractImages": { @@ -921,7 +2001,13 @@ "header": "Afbeeldingen extraheren", "selectText": "Selecteer het beeldformaat voor geÃĢxtraheerde afbeeldingen", "allowDuplicates": "Dubbele afbeeldingen opslaan", - "submit": "Extraheer" + "submit": "Extraheer", + "settings": { + "title": "Settings" + }, + "error": { + "failed": "An error occurred while extracting images from the PDF." + } }, "pdfToPDFA": { "tags": "archief,langdurig,standaard,conversie,opslag,bewaring", @@ -993,17 +2079,53 @@ }, "info": "Python is niet geïnstalleerd. Het wordt vereist om te worden uitgevoerd." }, + "scannerImageSplit": { + "title": "Extracted Images", + "submit": "Extract Image Scans", + "error": { + "failed": "An error occurred while extracting image scans." + }, + "tooltip": { + "title": "Photo Splitter", + "whatThisDoes": "What this does", + "whatThisDoesDesc": "Automatically finds and extracts each photo from a scanned page or composite image—no manual cropping.", + "whenToUse": "When to use", + "useCase1": "Scan whole album pages in one go", + "useCase2": "Split flatbed batches into separate files", + "useCase3": "Break collages into individual photos", + "useCase4": "Pull photos from documents", + "quickFixes": "Quick fixes", + "problem1": "Photos not detected → increase Tolerance to 30-50", + "problem2": "Too many false detections → increase Minimum Area to 15,000-20,000", + "problem3": "Crops are too tight → increase Border Size to 5-10", + "problem4": "Tilted photos not straightened → lower Angle Threshold to ~5°", + "problem5": "Dust/noise boxes → increase Minimum Contour Area to 1000-2000", + "setupTips": "Setup tips", + "tip1": "Use a plain, light background", + "tip2": "Leave a small gap (≈1 cm) between photos", + "tip3": "Scan at 300-600 DPI", + "tip4": "Clean the scanner glass", + "headsUp": "Heads-up", + "headsUpDesc": "Overlapping photos or backgrounds very close in colour to the photos can reduce accuracy-try a lighter or darker background and leave more space." + } + }, "sign": { - "tags": "autoriseren,initialen,getekende-handtekening,tekst-handtekening,afbeelding-handtekening", "title": "Ondertekenen", "header": "PDF's ondertekenen", "upload": "Upload afbeelding", - "draw": "Handtekening tekenen", - "text": "Tekstinvoer", + "draw": { + "title": "Draw your signature", + "clear": "Clear" + }, + "text": { + "name": "Signer Name", + "placeholder": "Enter your full name" + }, "clear": "Wissen", "add": "Toevoegen", "saved": "Gesleutelde handtekeningen opgeslagen", "save": "Opslaan Signatuur", + "applySignatures": "Apply Signatures", "personalSigs": "Persoonlijke Signatuuren", "sharedSigs": "Gedeelde Signatuuren", "noSavedSigs": "Geen opgeslagen signatuuren gevonden", @@ -1015,42 +2137,179 @@ "previous": "Previous page", "maintainRatio": "Toggle maintain aspect ratio", "undo": "Undo", - "redo": "Redo" + "redo": "Redo", + "submit": "Sign Document", + "steps": { + "configure": "Configure Signature" + }, + "type": { + "title": "Signature Type", + "draw": "Draw", + "canvas": "Canvas", + "image": "Image", + "text": "Text" + }, + "image": { + "label": "Upload signature image", + "placeholder": "Select image file", + "hint": "Upload a PNG or JPG image of your signature" + }, + "instructions": { + "title": "How to add signature", + "canvas": "After drawing your signature in the canvas, close the modal then click anywhere on the PDF to place it.", + "image": "After uploading your signature image above, click anywhere on the PDF to place it.", + "text": "After entering your name above, click anywhere on the PDF to place your signature." + }, + "mode": { + "move": "Move Signature", + "place": "Place Signature" + }, + "updateAndPlace": "Update and Place", + "activate": "Activate Signature Placement", + "deactivate": "Stop Placing Signatures", + "results": { + "title": "Signature Results" + }, + "error": { + "failed": "An error occurred while signing the PDF." + }, + "tags": "autoriseren,initialen,getekende-handtekening,tekst-handtekening,afbeelding-handtekening" }, "flatten": { - "tags": "statisch,deactiveren,niet-interactief,stroomlijnen", "title": "Afvlakken", "header": "PDF's afvlakken", "flattenOnlyForms": "Alleen formulieren afvlakken", "submit": "Afvlakken", + "filenamePrefix": "flattened", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, "steps": { "settings": "Instellingen" }, "options": { - "flattenOnlyForms": "Alleen formulieren afvlakken" - } + "stepTitle": "Flatten Options", + "title": "Flatten Options", + "flattenOnlyForms": { + "label": "Alleen formulieren afvlakken", + "desc": "Only flatten form fields, leaving other interactive elements intact" + }, + "note": "Flattening removes interactive elements from the PDF, making them non-editable." + }, + "results": { + "title": "Flatten Results" + }, + "error": { + "failed": "An error occurred while flattening the PDF." + }, + "tooltip": { + "header": { + "title": "About Flattening PDFs" + }, + "description": { + "title": "What does flattening do?", + "text": "Flattening makes your PDF non-editable by turning fillable forms and buttons into regular text and images. The PDF will look exactly the same, but no one can change or fill in the forms anymore. Perfect for sharing completed forms, creating final documents for records, or ensuring the PDF looks the same everywhere.", + "bullet1": "Text boxes become regular text (can't be edited)", + "bullet2": "Checkboxes and buttons become pictures", + "bullet3": "Great for final versions you don't want changed", + "bullet4": "Ensures consistent appearance across all devices" + }, + "formsOnly": { + "title": "What does 'Flatten only forms' mean?", + "text": "This option only removes the ability to fill in forms, but keeps other features working like clicking links, viewing bookmarks, and reading comments.", + "bullet1": "Forms become non-editable", + "bullet2": "Links still work when clicked", + "bullet3": "Comments and notes remain visible", + "bullet4": "Bookmarks still help you navigate" + } + }, + "tags": "statisch,deactiveren,niet-interactief,stroomlijnen" }, "repair": { "tags": "repareren,herstellen,correctie,terughalen", "title": "Repareren", "header": "PDF's repareren", - "submit": "Repareren" + "submit": "Repareren", + "description": "This tool will attempt to repair corrupted or damaged PDF files. No additional settings are required.", + "filenamePrefix": "repaired", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst repairing the PDF." + }, + "results": { + "title": "Repair Results" + } }, "removeBlanks": { - "tags": "opruimen,stroomlijnen,geen-inhoud,organiseren", "title": "Verwijder blanco's", "header": "Verwijder lege pagina's", - "threshold": "Pixel witheid drempel:", + "settings": { + "title": "Settings" + }, + "threshold": { + "label": "Pixel Whiteness Threshold" + }, + "whitePercent": { + "label": "White Percentage Threshold", + "unit": "%" + }, + "includeBlankPages": { + "label": "Include detected blank pages" + }, + "tooltip": { + "header": { + "title": "Remove Blank Pages Settings" + }, + "threshold": { + "title": "Pixel Whiteness Threshold", + "text": "Controls how white a pixel must be to be considered 'white'. This helps determine what counts as a blank area on the page.", + "bullet1": "0 = Pure black (most restrictive)", + "bullet2": "128 = Medium grey", + "bullet3": "255 = Pure white (least restrictive)" + }, + "whitePercent": { + "title": "White Percentage Threshold", + "text": "Sets the minimum percentage of white pixels required for a page to be considered blank and removed.", + "bullet1": "Lower values (e.g., 80%) = More pages removed", + "bullet2": "Higher values (e.g., 95%) = Only very blank pages removed", + "bullet3": "Use higher values for documents with light backgrounds" + }, + "includeBlankPages": { + "title": "Include Detected Blank Pages", + "text": "When enabled, creates a separate PDF containing all the blank pages that were detected and removed from the original document.", + "bullet1": "Useful for reviewing what was removed", + "bullet2": "Helps verify the detection accuracy", + "bullet3": "Can be disabled to reduce output file size" + } + }, + "submit": "Blanco's verwijderen", + "error": { + "failed": "Failed to remove blank pages" + }, + "results": { + "title": "Removed Blank Pages" + }, + "tags": "opruimen,stroomlijnen,geen-inhoud,organiseren", "thresholdDesc": "Drempel voor het bepalen hoe wit een witte pixel moet zijn om als 'Wit' te worden geclassificeerd. 0 = Zwart, 255 zuiver wit.", - "whitePercent": "Wit percentage (%):", - "whitePercentDesc": "Percentage van de pagina dat 'witte' pixels moet zijn om verwijderd te worden", - "submit": "Blanco's verwijderen" + "whitePercentDesc": "Percentage van de pagina dat 'witte' pixels moet zijn om verwijderd te worden" }, "removeAnnotations": { "tags": "opmerkingen,highlight,notities,opmaak,verwijderen", "title": "Verwijder annotaties", "header": "Verwijder annotaties", - "submit": "Verwijderen" + "submit": "Verwijderen", + "settings": { + "title": "Settings" + }, + "info": { + "title": "About Remove Annotations", + "description": "This tool will remove all annotations (comments, highlights, notes, etc.) from your PDF documents." + }, + "error": { + "failed": "An error occurred while removing annotations from the PDF." + } }, "compare": { "tags": "onderscheiden,contrasteren,veranderingen,analyse", @@ -1082,6 +2341,142 @@ "certSign": { "tags": "authenticeren,PEM,P12,officieel,versleutelen", "title": "Certificaat ondertekening", + "filenamePrefix": "signed", + "signMode": { + "stepTitle": "Sign Mode", + "tooltip": { + "header": { + "title": "About PDF Signatures" + }, + "overview": { + "title": "How signatures work", + "text": "Both modes seal the document (any edits are flagged as tampering) and record who/when/how for auditing. Viewer trust depends on the certificate chain." + }, + "manual": { + "title": "Manual - Bring your certificate", + "text": "Use your own certificate files for brand-aligned identity. Can display Trusted when your CA/chain is recognised.", + "use": "Use for: customer-facing, legal, compliance." + }, + "auto": { + "title": "Auto - Zero-setup, instant system seal", + "text": "Signs with a server self-signed certificate. Same tamper-evident seal and audit trail; typically shows Unverified in viewers.", + "use": "Use when: you need speed and consistent internal identity across reviews and records." + }, + "rule": { + "title": "Rule of thumb", + "text": "Need recipient Trusted status? Manual. Need a fast, tamper-evident seal and audit trail with no setup? Auto." + } + } + }, + "certTypeStep": { + "stepTitle": "Certificate Format" + }, + "certFiles": { + "stepTitle": "Certificate Files" + }, + "appearance": { + "stepTitle": "Signature Appearance", + "tooltip": { + "header": { + "title": "About Signature Appearance" + }, + "invisible": { + "title": "Invisible Signatures", + "text": "The signature is added to the PDF for security but won't be visible when viewing the document. Perfect for legal requirements without changing the document's appearance.", + "bullet1": "Provides security without visual changes", + "bullet2": "Meets legal requirements for digital signing", + "bullet3": "Doesn't affect document layout or design" + }, + "visible": { + "title": "Visible Signatures", + "text": "Shows a signature block on the PDF with your name, date, and optional details. Useful when you want readers to clearly see the document is signed.", + "bullet1": "Shows signer name and date on the document", + "bullet2": "Can include reason and location for signing", + "bullet3": "Choose which page to place the signature", + "bullet4": "Optional logo can be included" + } + }, + "invisible": "Invisible", + "options": { + "title": "Signature Details" + }, + "visible": "Visible" + }, + "sign": { + "submit": "Sign PDF", + "results": "Signed PDF" + }, + "error": { + "failed": "An error occurred whilst processing signatures." + }, + "tooltip": { + "header": { + "title": "About Managing Signatures" + }, + "overview": { + "title": "What can this tool do?", + "text": "This tool lets you check if your PDFs are digitally signed and add new digital signatures. Digital signatures prove who created or approved a document and show if it has been changed since signing.", + "bullet1": "Check existing signatures and their validity", + "bullet2": "View detailed information about signers and certificates", + "bullet3": "Add new digital signatures to secure your documents", + "bullet4": "Multiple files supported with easy navigation" + }, + "validation": { + "title": "Checking Signatures", + "text": "When you check signatures, the tool tells you if they're valid, who signed the document, when it was signed, and whether the document has been changed since signing.", + "bullet1": "Shows if signatures are valid or invalid", + "bullet2": "Displays signer information and signing date", + "bullet3": "Checks if the document was modified after signing", + "bullet4": "Can use custom certificates for verification" + }, + "signing": { + "title": "Adding Signatures", + "text": "To sign a PDF, you need a digital certificate (like PEM, PKCS12, or JKS). You can choose to make the signature visible on the document or keep it invisible for security only.", + "bullet1": "Supports PEM, PKCS12, JKS, and server certificate formats", + "bullet2": "Option to show or hide signature on the PDF", + "bullet3": "Add reason, location, and signer name", + "bullet4": "Choose which page to place visible signatures", + "bullet5": "Use server certificate for simple 'Sign with Stirling-PDF' option" + } + }, + "certType": { + "tooltip": { + "header": { + "title": "About Certificate Types" + }, + "what": { + "title": "What's a certificate?", + "text": "It's a secure ID for your signature that proves you signed. Unless you're required to sign via certificate, we recommend using another secure method like Type, Draw, or Upload." + }, + "which": { + "title": "Which option should I use?", + "text": "Choose the format that matches your certificate file:", + "bullet1": "PKCS#12 (.p12 / .pfx) – one combined file (most common)", + "bullet2": "PFX (.pfx) – Microsoft's version of PKCS12", + "bullet3": "PEM – separate private-key and certificate .pem files", + "bullet4": "JKS – Java .jks keystore for dev / CI-CD workflows" + }, + "convert": { + "title": "Key not listed?", + "text": "Convert your file to a Java keystore (.jks) with keytool, then pick JKS." + } + } + }, + "chooseCertificate": "Choose Certificate File", + "chooseJksFile": "Choose JKS File", + "chooseP12File": "Choose PKCS12 File", + "choosePfxFile": "Choose PFX File", + "choosePrivateKey": "Choose Private Key File", + "location": "Locatie", + "logoTitle": "Logo", + "name": "Naam", + "noLogo": "No Logo", + "pageNumber": "Page Number", + "password": "Voer je sleutelopslag of privÊsleutel wachtwoord in (indien van toepassing):", + "passwordOptional": "Leave empty if no password", + "reason": "Reden", + "serverCertMessage": "Using server certificate - no files or password required", + "showLogo": "Logotype tonen", "header": "Onderteken een PDF met je certificaat (in ontwikkeling)", "selectPDF": "Selecteer een PDF-bestand voor ondertekening:", "jksNote": "Let op: als het certificaattype hieronder niet staat, converteer het dan naar een Java Keystore (.jks) bestand met de keytool command line tool. Kies vervolgens de .jks bestandsoptie.", @@ -1089,13 +2484,7 @@ "selectCert": "Selecteer je certificaatbestand (X.509 formaat, kan .pem of .der zijn):", "selectP12": "Selecteer je PKCS#12 Sleutelopslagbestand (.p12 of .pfx) (Optioneel, indien verstrekt, moet het je privÊsleutel en certificaat bevatten):", "selectJKS": "Selecteer je Java Keystore bestand (.jks of .keystore):", - "certType": "Certificaattype", - "password": "Voer je sleutelopslag of privÊsleutel wachtwoord in (indien van toepassing):", "showSig": "Toon handtekening", - "reason": "Reden", - "location": "Locatie", - "name": "Naam", - "showLogo": "Logotype tonen", "submit": "PDF ondertekenen" }, "removeCertSign": { @@ -1103,7 +2492,18 @@ "title": "Verwijder certificaat", "header": "Verwijder het digitale certificaat van de PDF", "selectPDF": "Selecteer een PDF bestand:", - "submit": "Verwijder certificaat" + "submit": "Verwijder certificaat", + "description": "This tool will remove digital certificate signatures from your PDF document.", + "filenamePrefix": "unsigned", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst removing certificate signatures." + }, + "results": { + "title": "Certificate Removal Results" + } }, "pageLayout": { "tags": "samenvoegen,composiet,enkel-zicht,organiseren", @@ -1111,16 +2511,157 @@ "header": "Meerdere pagina indeling", "pagesPerSheet": "Pagina's per vel:", "addBorder": "Randen toevoegen", - "submit": "Indienen" + "submit": "Indienen", + "desc": { + "2": "Place 2 pages side-by-side on a single sheet.", + "3": "Place 3 pages on a single sheet in a single row.", + "4": "Place 4 pages on a single sheet (2 × 2 grid).", + "9": "Place 9 pages on a single sheet (3 × 3 grid).", + "16": "Place 16 pages on a single sheet (4 × 4 grid)." + }, + "error": { + "failed": "An error occurred while creating the multi-page layout." + } + }, + "bookletImposition": { + "tags": "booklet,imposition,printing,binding,folding,signature", + "title": "Booklet Imposition", + "header": "Booklet Imposition", + "submit": "Create Booklet", + "spineLocation": { + "label": "Spine Location", + "left": "Left (Standard)", + "right": "Right (RTL)" + }, + "doubleSided": { + "label": "Double-sided printing", + "tooltip": "Creates both front and back sides for proper booklet printing" + }, + "manualDuplex": { + "title": "Manual Duplex Mode", + "instructions": "For printers without automatic duplex. You'll need to run this twice:" + }, + "duplexPass": { + "label": "Print Pass", + "first": "1st Pass", + "second": "2nd Pass", + "firstInstructions": "Prints front sides → stack face-down → run again with 2nd Pass", + "secondInstructions": "Load printed stack face-down → prints back sides" + }, + "rtlBinding": { + "label": "Right-to-left binding", + "tooltip": "For Arabic, Hebrew, or other right-to-left languages" + }, + "addBorder": { + "label": "Add borders around pages", + "tooltip": "Adds borders around each page section to help with cutting and alignment" + }, + "addGutter": { + "label": "Add gutter margin", + "tooltip": "Adds inner margin space for binding" + }, + "gutterSize": { + "label": "Gutter size (points)" + }, + "flipOnShortEdge": { + "label": "Flip on short edge (automatic duplex only)", + "tooltip": "Enable for short-edge duplex printing (automatic duplex only - ignored in manual mode)", + "manualNote": "Not needed in manual mode - you flip the stack yourself" + }, + "advanced": { + "toggle": "Advanced Options" + }, + "paperSizeNote": "Paper size is automatically derived from your first page.", + "tooltip": { + "header": { + "title": "Booklet Creation Guide" + }, + "description": { + "title": "What is Booklet Imposition?", + "text": "Creates professional booklets by arranging pages in the correct printing order. Your PDF pages are placed 2-up on landscape sheets so when folded and bound, they read in proper sequence like a real book." + }, + "example": { + "title": "Example: 8-Page Booklet", + "text": "Your 8-page document becomes 2 sheets:", + "bullet1": "Sheet 1 Front: Pages 8, 1 | Back: Pages 2, 7", + "bullet2": "Sheet 2 Front: Pages 6, 3 | Back: Pages 4, 5", + "bullet3": "When folded & stacked: Reads 1→2→3→4→5→6→7→8" + }, + "printing": { + "title": "How to Print & Assemble", + "text": "Follow these steps for perfect booklets:", + "bullet1": "Print double-sided with 'Flip on long edge'", + "bullet2": "Stack sheets in order, fold in half", + "bullet3": "Staple or bind along the folded spine", + "bullet4": "For short-edge printers: Enable 'Flip on short edge' option" + }, + "manualDuplex": { + "title": "Manual Duplex (Single-sided Printers)", + "text": "For printers without automatic duplex:", + "bullet1": "Turn OFF 'Double-sided printing'", + "bullet2": "Select '1st Pass' → Print → Stack face-down", + "bullet3": "Select '2nd Pass' → Load stack → Print backs", + "bullet4": "Fold and assemble as normal" + }, + "advanced": { + "title": "Advanced Options", + "text": "Fine-tune your booklet:", + "bullet1": "Right-to-Left Binding: For Arabic, Hebrew, or RTL languages", + "bullet2": "Borders: Shows cut lines for trimming", + "bullet3": "Gutter Margin: Adds space for binding/stapling", + "bullet4": "Short-edge Flip: Only for automatic duplex printers" + } + }, + "error": { + "failed": "An error occurred while creating the booklet imposition." + } }, "scalePages": { - "tags": "resize,aanpassen,dimensie,aanpassen", "title": "Pagina-schaal aanpassen", "header": "Pagina-schaal aanpassen", "pageSize": "Grootte van een pagina van het document.", "keepPageSize": "Oorspronkelijke grootte behouden", "scaleFactor": "Zoomniveau (uitsnede) van een pagina.", - "submit": "Indienen" + "submit": "Indienen", + "tags": "resize,aanpassen,dimensie,aanpassen" + }, + "adjustPageScale": { + "tags": "resize,modify,dimension,adapt", + "title": "Adjust Page Scale", + "header": "Adjust Page Scale", + "scaleFactor": { + "label": "Scale Factor" + }, + "pageSize": { + "label": "Target Page Size", + "keep": "Keep Original Size", + "letter": "Letter", + "legal": "Legal" + }, + "submit": "Adjust Page Scale", + "error": { + "failed": "An error occurred while adjusting the page scale." + }, + "tooltip": { + "header": { + "title": "Page Scale Settings Overview" + }, + "description": { + "title": "Description", + "text": "Adjust the size of PDF content and change the page dimensions." + }, + "scaleFactor": { + "title": "Scale Factor", + "text": "Controls how large or small the content appears on the page. Content is scaled and centred - if scaled content is larger than the page size, it may be cropped.", + "bullet1": "1.0 = Original size", + "bullet2": "0.5 = Half size (50% smaller)", + "bullet3": "2.0 = Double size (200% larger, may crop)" + }, + "pageSize": { + "title": "Target Page Size", + "text": "Sets the dimensions of the output PDF pages. 'Keep Original Size' maintains current dimensions, whilst other options resize to standard paper sizes." + } + } }, "add-page-numbers": { "tags": "pagineren,labelen,organiseren,indexeren" @@ -1129,16 +2670,83 @@ "tags": "auto-detecteren,op-header-gebaseerd,organiseren,herlabelen", "title": "Automatisch hernoemen", "header": "PDF automatisch hernoemen", - "submit": "Automatisch hernoemen" + "description": "Automatically finds the title from your PDF content and uses it as the filename.", + "submit": "Automatisch hernoemen", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst auto-renaming the PDF." + }, + "results": { + "title": "Auto-Rename Results" + }, + "tooltip": { + "header": { + "title": "How Auto-Rename Works" + }, + "howItWorks": { + "title": "Smart Renaming", + "text": "Automatically finds the title from your PDF content and uses it as the filename.", + "bullet1": "Looks for text that appears to be a title or heading", + "bullet2": "Creates a clean, valid filename from the detected title", + "bullet3": "Keeps the original name if no suitable title is found" + } + } }, "adjust-contrast": { "tags": "kleur-correctie,afstemmen,aanpassen,verbeteren" }, "crop": { - "tags": "trimmen,verkleinen,bewerken,vorm", "title": "Bijwerken", "header": "PDF bijsnijden", - "submit": "Indienen" + "submit": "Indienen", + "noFileSelected": "Select a PDF file to begin cropping", + "preview": { + "title": "Crop Area Selection" + }, + "reset": "Reset to full PDF", + "coordinates": { + "title": "Position and Size", + "x": { + "label": "X Position", + "desc": "Left edge (points)" + }, + "y": { + "label": "Y Position", + "desc": "Bottom edge (points)" + }, + "width": { + "label": "Width", + "desc": "Crop width (points)" + }, + "height": { + "label": "Height", + "desc": "Crop height (points)" + } + }, + "error": { + "invalidArea": "Crop area extends beyond PDF boundaries", + "failed": "Failed to crop PDF" + }, + "steps": { + "selectArea": "Select Crop Area" + }, + "tooltip": { + "title": "How to Crop PDFs", + "description": "Select the area to crop from your PDF by dragging and resizing the blue overlay on the thumbnail.", + "drag": "Drag the overlay to move the crop area", + "resize": "Drag the corner and edge handles to resize", + "precision": "Use coordinate inputs for precise positioning" + }, + "results": { + "title": "Crop Results" + }, + "automation": { + "info": "Enter crop coordinates in PDF points. Origin (0,0) is at bottom-left. These values will be applied to all PDFs processed in this automation.", + "reference": "Reference: A4 page is 595.28 × 841.89 points (210mm × 297mm). 1 inch = 72 points." + }, + "tags": "trimmen,verkleinen,bewerken,vorm" }, "autoSplitPDF": { "tags": "QR-gebaseerd,scheiden,scan-segment,organiseren", @@ -1221,24 +2829,124 @@ "downloadJS": "Javascript downloaden", "submit": "Toon" }, - "autoRedact": { - "tags": "Verzwakken, Verbergen, Uitroepen, Gekleurd, Verborgen", - "title": "Automatisch censureren", - "header": "Automatisch censureren", - "colorLabel": "Kleur", - "textsToRedactLabel": "Tekst om te censureren (gescheiden door regels)", - "textsToRedactPlaceholder": "bijv.\\Vertrouwelijk \\nTopgeheim", - "useRegexLabel": "Gebruik regex", - "wholeWordSearchLabel": "Zoeken op hele woorden", - "customPaddingLabel": "Aangepaste extra ruimtevulling", - "convertPDFToImageLabel": "Converteer PDF naar PDF-afbeelding (wordt gebruikt om tekst achter het vak te verwijderen)", - "submitButton": "Indienen" - }, "redact": { "tags": "Redact,Hide,black out,black,marker,hidden,manual", "title": "Manual Redaction", - "header": "Manual Redaction", "submit": "Manual Redaction", + "error": { + "failed": "An error occurred while redacting the PDF." + }, + "modeSelector": { + "title": "Redaction Method", + "mode": "Mode", + "automatic": "Automatic", + "automaticDesc": "Redact text based on search terms", + "manual": "Manual", + "manualDesc": "Click and drag to redact specific areas", + "manualComingSoon": "Manual redaction coming soon" + }, + "auto": { + "header": "Auto Redact", + "settings": { + "title": "Redaction Settings", + "advancedTitle": "Geavanceerd" + }, + "colorLabel": "Box Colour", + "wordsToRedact": { + "title": "Words to Redact", + "placeholder": "Enter a word", + "add": "Toevoegen", + "examples": "Examples: Confidential, Top-Secret" + }, + "useRegexLabel": "Use Regex", + "wholeWordSearchLabel": "Whole Word Search", + "customPaddingLabel": "Custom Extra Padding", + "convertPDFToImageLabel": "Convert PDF to PDF-Image" + }, + "tooltip": { + "mode": { + "header": { + "title": "Redaction Method" + }, + "automatic": { + "title": "Automatic Redaction", + "text": "Automatically finds and redacts specified text throughout the document. Perfect for removing consistent sensitive information like names, addresses, or confidential markers." + }, + "manual": { + "title": "Manual Redaction", + "text": "Click and drag to manually select specific areas to redact. Gives you precise control over what gets redacted. (Coming soon)" + } + }, + "words": { + "header": { + "title": "Words to Redact" + }, + "description": { + "title": "Text Matching", + "text": "Enter words or phrases to find and redact in your document. Each word will be searched for separately." + }, + "bullet1": "Add one word at a time", + "bullet2": "Press Enter or click 'Add Another' to add", + "bullet3": "Click × to remove words", + "examples": { + "title": "Common Examples", + "text": "Typical words to redact include: bank details, email addresses, or specific names." + } + }, + "advanced": { + "header": { + "title": "Advanced Redaction Settings" + }, + "color": { + "title": "Box Colour & Padding", + "text": "Customise the appearance of redaction boxes. Black is standard, but you can choose any colour. Padding adds extra space around the found text." + }, + "regex": { + "title": "Use Regex", + "text": "Enable regular expressions for advanced pattern matching. Useful for finding phone numbers, emails, or complex patterns.", + "bullet1": "Example: \\d{4}-\\d{2}-\\d{2} to match any dates in YYYY-MM-DD format", + "bullet2": "Use with caution - test thoroughly" + }, + "wholeWord": { + "title": "Whole Word Search", + "text": "Only match complete words, not partial matches. 'John' won't match 'Johnson' when enabled." + }, + "convert": { + "title": "Convert to PDF-Image", + "text": "Converts the PDF to an image-based PDF after redaction. This ensures text behind redaction boxes is completely removed and unrecoverable." + } + } + }, + "manual": { + "header": "Manual Redaction", + "textBasedRedaction": "Text-based Redaction", + "pageBasedRedaction": "Page-based Redaction", + "convertPDFToImageLabel": "Convert PDF to PDF-Image (Used to remove text behind the box)", + "pageRedactionNumbers": { + "title": "Pagen", + "placeholder": "(bijv. 1,2,8 of 4,7,12-16 of 2n-1)" + }, + "redactionColor": { + "title": "Redaction Colour" + }, + "export": "Export", + "upload": "Upload", + "boxRedaction": "Box draw redaction", + "zoom": "Zoom", + "zoomIn": "Zoom in", + "zoomOut": "Zoom out", + "nextPage": "Next Page", + "previousPage": "Previous Page", + "toggleSidebar": "Toggle Sidebar", + "showThumbnails": "Show Thumbnails", + "showDocumentOutline": "Show Document Outline (double-click to expand/collapse all items)", + "showAttachments": "Show Attachments", + "showLayers": "Show Layers (double-click to reset all layers to the default state)", + "colourPicker": "Colour Picker", + "findCurrentOutlineItem": "Find current outline item", + "applyChanges": "Apply Changes" + }, + "header": "Manual Redaction", "textBasedRedaction": "Text based Redaction", "pageBasedRedaction": "Page-based Redaction", "convertPDFToImageLabel": "Convert PDF to PDF-Image (Used to remove text behind the box)", @@ -1264,21 +2972,7 @@ "showLayers": "Show Layers (double-click to reset all layers to the default state)", "colourPicker": "Colour Picker", "findCurrentOutlineItem": "Find current outline item", - "applyChanges": "Apply Changes", - "auto": { - "settings": { - "advancedTitle": "Geavanceerd" - }, - "wordsToRedact": { - "add": "Toevoegen" - } - }, - "manual": { - "pageRedactionNumbers": { - "title": "Pagen", - "placeholder": "(bijv. 1,2,8 of 4,7,12-16 of 2n-1)" - } - } + "applyChanges": "Apply Changes" }, "tableExtraxt": { "tags": "CSV,tabel extractie,extractie,converteren" @@ -1289,11 +2983,15 @@ "overlay-pdfs": { "tags": "Overlappen", "header": "PDF bestanden overlappen", + "title": "Overlay PDFs", + "desc": "Overlay one PDF on top of another", "baseFile": { "label": "Selecteer basis PDF-bestand" }, "overlayFiles": { - "label": "Selecteer overlappende PDF-bestanden" + "label": "Selecteer overlappende PDF-bestanden", + "placeholder": "Choose PDF(s)...", + "addMore": "Add more PDFs..." }, "mode": { "label": "Selecteer overlappingsmodus", @@ -1303,14 +3001,53 @@ }, "counts": { "label": "Aantal keren overlappen (voor vaste herhalings modus)", - "placeholder": "Voer door komma's gescheiden aantallen in (bijv., 2,3,1)" + "placeholder": "Voer door komma's gescheiden aantallen in (bijv., 2,3,1)", + "item": "Count for file", + "noFiles": "Add overlay files to configure counts" }, "position": { "label": "Selecteer overlappingspositie", "foreground": "Voorgrond", "background": "Achtergrond" }, - "submit": "Indienen" + "submit": "Indienen", + "settings": { + "title": "Settings" + }, + "results": { + "title": "Overlay Results" + }, + "tooltip": { + "header": { + "title": "Overlay PDFs Overview" + }, + "description": { + "title": "Description", + "text": "Combine a base PDF with one or more overlay PDFs. Overlays can be applied page-by-page in different modes and placed in the foreground or background." + }, + "mode": { + "title": "Overlay Mode", + "text": "Choose how to distribute overlay pages across the base PDF pages.", + "sequential": "Sequential Overlay: Use pages from the first overlay PDF until it ends, then move to the next.", + "interleaved": "Interleaved Overlay: Take one page from each overlay in turn.", + "fixedRepeat": "Fixed Repeat Overlay: Take a set number of pages from each overlay before moving to the next. Use Counts to set the numbers." + }, + "position": { + "title": "Overlay Position", + "text": "Foreground places the overlay on top of the page. Background places it behind." + }, + "overlayFiles": { + "title": "Overlay Files", + "text": "Select one or more PDFs to overlay on the base. The order of these files affects how pages are applied in Sequential and Fixed Repeat modes." + }, + "counts": { + "title": "Counts (Fixed Repeat only)", + "text": "Provide a positive number for each overlay file showing how many pages to take before moving to the next. Required when mode is Fixed Repeat." + } + }, + "error": { + "failed": "An error occurred while overlaying PDFs." + } }, "split-by-sections": { "tags": "Sectie splitsen, Verdelen, Aanpassen", @@ -1331,6 +3068,7 @@ "tags": "Stempel, Afbeelding toevoegen, afbeelding centreren, watermerk, PDF, Insluiten, Aanpassen", "header": "Stempel PDF", "title": "Stempel PDF", + "stampSetup": "Stamp Setup", "stampType": "Soort stempel", "stampText": "Stempel tekst", "stampImage": "Stempel afbeelding", @@ -1343,7 +3081,19 @@ "overrideY": "Y coÃļrdinaat overschrijven", "customMargin": "Aangepaste marge", "customColor": "Aangepaste tekstkleur", - "submit": "Indienen" + "submit": "Indienen", + "noStampSelected": "No stamp selected. Return to Step 1.", + "customPosition": "Drag the stamp to the desired location in the preview window.", + "error": { + "failed": "An error occurred while adding stamp to the PDF." + }, + "imageSize": "Image Size", + "margin": "Margin", + "positionAndFormatting": "Position & Formatting", + "quickPosition": "Select a position on the page to place the stamp.", + "results": { + "title": "Stamp Results" + } }, "removeImagePdf": { "tags": "Afbeelding verwijderen, Paginabewerkingen, Achterkant, Serverkant" @@ -1361,7 +3111,8 @@ "status": { "_value": "Status", "valid": "Valid", - "invalid": "Invalid" + "invalid": "Invalid", + "complete": "Validation complete" }, "signer": "Signer", "date": "Date", @@ -1388,40 +3139,122 @@ "version": "Versie", "keyUsage": "Key Usage", "selfSigned": "Self-Signed", - "bits": "bits" + "bits": "bits", + "details": "Certificate Details" }, "signature": { "info": "Signature Information", "_value": "Signature", "mathValid": "Signature is mathematically valid BUT:" }, - "selectCustomCert": "Custom Certificate File X.509 (Optional)" - }, - "replace-color": { - "title": "Replace-Invert-Color", - "header": "Kleur-instellingen voor PDF's", - "selectText": { - "1": "Vervang of invertere kleure opties", - "2": "Standaard (hoog contrast kleuren)", - "3": "Aangepast (aangepaste kleuren)", - "4": "Volledig inverteren (alle kleuren omverkeren)", - "5": "Opties voor hoog contrast", - "6": "wit tekst op een zwart grondvlak", - "7": "zwarte tekst op wit grondvlak", - "8": "gele tekst op een zwart grondvlak", - "9": "groene tekst op een zwart grondvlak", - "10": "Kies de tekstkleur", - "11": "Kies het achtergrondkleur" + "selectCustomCert": "Custom Certificate File X.509 (Optional)", + "downloadCsv": "Download CSV", + "downloadJson": "Download JSON", + "downloadPdf": "Download PDF Report", + "downloadType": { + "csv": "CSV", + "json": "JSON", + "pdf": "PDF" }, - "submit": "Vervang" + "error": { + "allFailed": "Unable to validate the selected files.", + "partial": "Some files could not be validated.", + "reportGeneration": "Could not generate the PDF report. JSON and CSV are available.", + "unexpected": "Unexpected error during validation." + }, + "finalizing": "Preparing downloads...", + "issue": { + "certExpired": "Certificate expired", + "certRevocationUnknown": "Certificate revocation status unknown", + "certRevoked": "Certificate revoked", + "chainInvalid": "Certificate chain invalid", + "signatureInvalid": "Signature cryptographic check failed", + "trustInvalid": "Certificate not trusted" + }, + "noResults": "Run the validation to generate a report.", + "noSignaturesShort": "No signatures", + "processing": "Validating signatures...", + "report": { + "continued": "Continued", + "downloads": "Downloads", + "entryLabel": "Signature Summary", + "fields": { + "created": "Created", + "fileSize": "File Size", + "signatureCount": "Total Signatures", + "signatureDate": "Signature Date" + }, + "filesEvaluated": "{{count}} files evaluated", + "footer": "Validated via Stirling PDF", + "generatedAt": "Generated", + "noPdf": "PDF report will be available after a successful validation.", + "page": "Page", + "shortTitle": "Signature Summary", + "signatureCountLabel": "{{count}} signatures", + "signaturesFound": "{{count}} signatures detected", + "signaturesValid": "{{count}} fully valid", + "title": "Signature Validation Report" + }, + "settings": { + "certHint": "Upload a trusted X.509 certificate to validate against a custom trust source.", + "title": "Validation Settings" + }, + "signatureDate": "Signature Date", + "totalSignatures": "Total Signatures" }, - "replaceColorPdf": { - "tags": "Kleur vervangen, pagina-acties, achterkant, serverzijde" + "replaceColor": { + "tags": "Replace Colour,Page operations,Back end,server side", + "labels": { + "settings": "Settings", + "colourOperation": "Colour operation" + }, + "options": { + "highContrast": "High contrast", + "invertAll": "Invert all colours", + "custom": "Custom", + "cmyk": "Convert to CMYK" + }, + "tooltip": { + "header": { + "title": "Replace & Invert Colour Settings Overview" + }, + "description": { + "title": "Description", + "text": "Transform PDF colours to improve readability and accessibility. Choose from high contrast presets, invert all colours, or create custom colour schemes." + }, + "highContrast": { + "title": "High Contrast", + "text": "Apply predefined high contrast colour combinations designed for better readability and accessibility compliance.", + "bullet1": "White text on black background - Classic dark mode", + "bullet2": "Black text on white background - Standard high contrast", + "bullet3": "Yellow text on black background - High visibility option", + "bullet4": "Green text on black background - Alternative high contrast" + }, + "invertAll": { + "title": "Invert All Colours", + "text": "Completely invert all colours in the PDF, creating a negative-like effect. Useful for creating dark mode versions of documents or reducing eye strain in low-light conditions." + }, + "custom": { + "title": "Custom Colours", + "text": "Define your own text and background colours using the colour pickers. Perfect for creating branded documents or specific accessibility requirements.", + "bullet1": "Text colour - Choose the colour for text elements", + "bullet2": "Background colour - Set the background colour for the document" + }, + "cmyk": { + "title": "Convert to CMYK", + "text": "Convert the PDF from RGB colour space to CMYK colour space, optimized for professional printing. This process converts colours to the Cyan, Magenta, Yellow, Black model used by printers." + } + }, + "error": { + "failed": "An error occurred while processing the colour replacement." + } }, "login": { "title": "Inloggen", "header": "Inloggen", "signin": "Inloggen", + "signInWith": "Sign in with", + "signInAnonymously": "Sign Up as a Guest", "rememberme": "Onthoud mij", "invalid": "Ongeldige gebruikersnaam of wachtwoord.", "locked": "Je account is geblokkeerd.", @@ -1440,12 +3273,83 @@ "alreadyLoggedIn": "U zit reeds ingelogd bij", "alreadyLoggedIn2": "apparaten. U moet u a.u.b. uitloggen van de apparaten en opnieuw proberen.", "toManySessions": "U heeft te veel actieve sessies", - "logoutMessage": "You have been logged out." + "logoutMessage": "You have been logged out.", + "youAreLoggedIn": "You are logged in!", + "email": "Email", + "password": "Password", + "enterEmail": "Enter your email", + "enterPassword": "Enter your password", + "loggingIn": "Logging In...", + "username": "Username", + "enterUsername": "Enter username", + "useEmailInstead": "Login with email", + "forgotPassword": "Forgot your password?", + "logIn": "Log In", + "signingIn": "Signing in...", + "login": "Login", + "or": "Or", + "useMagicLink": "Use magic link instead", + "enterEmailForMagicLink": "Enter your email for magic link", + "sending": "Sendingâ€Ļ", + "sendMagicLink": "Send Magic Link", + "cancel": "Cancel", + "dontHaveAccount": "Don't have an account? Sign up", + "home": "Home", + "debug": "Debug", + "signOut": "Sign Out", + "pleaseEnterBoth": "Please enter both email and password", + "pleaseEnterEmail": "Please enter your email address", + "magicLinkSent": "Magic link sent to {{email}}! Check your email and click the link to sign in.", + "passwordResetSent": "Password reset link sent to {{email}}! Check your email and follow the instructions.", + "failedToSignIn": "Failed to sign in with {{provider}}: {{message}}", + "unexpectedError": "Unexpected error: {{message}}", + "accountCreatedSuccess": "Account created successfully! You can now sign in.", + "passwordChangedSuccess": "Password changed successfully! Please sign in with your new password.", + "credentialsUpdated": "Your credentials have been updated. Please sign in again." + }, + "signup": { + "title": "Create an account", + "subtitle": "Join Stirling PDF to get started", + "name": "Name", + "email": "Email", + "password": "Password", + "confirmPassword": "Confirm password", + "enterName": "Enter your name", + "enterEmail": "Enter your email", + "enterPassword": "Enter your password", + "confirmPasswordPlaceholder": "Confirm password", + "or": "or", + "creatingAccount": "Creating Account...", + "signUp": "Sign Up", + "alreadyHaveAccount": "Already have an account? Sign in", + "pleaseFillAllFields": "Please fill in all fields", + "passwordsDoNotMatch": "Passwords do not match", + "passwordTooShort": "Password must be at least 6 characters long", + "invalidEmail": "Please enter a valid email address", + "checkEmailConfirmation": "Check your email for a confirmation link to complete your registration.", + "accountCreatedSuccessfully": "Account created successfully! You can now sign in.", + "unexpectedError": "Unexpected error: {{message}}", + "useEmailInstead": "Use Email Instead", + "nameRequired": "Name is required", + "emailRequired": "Email is required", + "passwordRequired": "Password is required", + "confirmPasswordRequired": "Please confirm your password" }, "pdfToSinglePage": { "title": "PDF naar enkele pagina", "header": "PDF naar enkele pagina", - "submit": "Converteren naar enkele pagina" + "submit": "Converteren naar enkele pagina", + "description": "This tool will merge all pages of your PDF into one large single page. The width will remain the same as the original pages, but the height will be the sum of all page heights.", + "filenamePrefix": "single_page", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst converting to single page." + }, + "results": { + "title": "Single Page Results" + } }, "pageExtracter": { "title": "Pagina's extraheren", @@ -1469,18 +3373,59 @@ "adjustContrast": { "title": "Contrast aanpassen", "header": "Contrast aanpassen", + "basic": "Basic Adjustments", "contrast": "Kehrbrechting:", "brightness": "Helderheid:", "saturation": "Verzadiging:", - "download": "Downloaden" + "download": "Downloaden", + "adjustColors": "Adjust Colors", + "blue": "Blue", + "confirm": "Confirm", + "error": { + "failed": "Failed to adjust colors/contrast" + }, + "green": "Green", + "noPreview": "Select a PDF to preview", + "red": "Red", + "results": { + "title": "Adjusted PDF" + } }, "compress": { "title": "Comprimeren", + "desc": "Compress PDFs to reduce their file size.", "header": "PDF comprimeren", + "method": { + "title": "Compression Method", + "quality": "Quality", + "filesize": "Bestandsgrootte" + }, "credit": "Deze functie gebruikt qpdf voor PDF Compressie/Optimalisatie.", "grayscale": { "label": "Grijsschaal toepassen voor compressie" }, + "tooltip": { + "header": { + "title": "Compress Settings Overview" + }, + "description": { + "title": "Description", + "text": "Compression is an easy way to reduce your file size. Pick File Size to enter a target size and have us adjust quality for you. Pick Quality to set compression strength manually." + }, + "qualityAdjustment": { + "title": "Quality Adjustment", + "text": "Drag the slider to adjust the compression strength. Lower values (1-3) preserve quality but result in larger files. Higher values (7-9) shrink the file more but reduce image clarity.", + "bullet1": "Lower values preserve quality", + "bullet2": "Higher values reduce file size" + }, + "grayscale": { + "title": "Grayscale", + "text": "Select this option to convert all images to black and white, which can significantly reduce file size especially for scanned PDFs or image-heavy documents." + } + }, + "error": { + "failed": "An error occurred while compressing the PDF." + }, "selectText": { "1": { "_value": "Compression Settings", @@ -1490,10 +3435,7 @@ "4": "Automatische modus - Past kwaliteit automatisch aan om PDF naar exacte grootte te krijgen", "5": "Verwachte PDF-grootte (bijv. 25MB, 10.8MB, 25KB)" }, - "submit": "Comprimeren", - "method": { - "filesize": "Bestandsgrootte" - } + "submit": "Comprimeren" }, "decrypt": { "passwordPrompt": "This file is password-protected. Please enter the password:", @@ -1594,7 +3536,13 @@ "title": "Afbeelding verwijderen", "header": "Afbeelding verwijderen", "removeImage": "Afbeelding verwijderen", - "submit": "Verwijder afbeelding" + "submit": "Verwijder afbeelding", + "error": { + "failed": "Failed to remove images from the PDF." + }, + "results": { + "title": "Remove Images Results" + } }, "splitByChapters": { "title": "PDF splits op hoofdstukken", @@ -1628,6 +3576,12 @@ }, "note": "Release notes are only available in English" }, + "swagger": { + "title": "API Documentation", + "header": "API Documentation", + "desc": "View and test the Stirling PDF API endpoints", + "tags": "api,documentation,swagger,endpoints,development" + }, "cookieBanner": { "popUp": { "title": "How we use Cookies", @@ -1663,45 +3617,943 @@ "title": "Analytics", "description": "These cookies help us understand how our tools are being used, so we can focus on building the features our community values most. Rest assured—Stirling PDF cannot and will never track the content of the documents you work with." } + }, + "services": { + "posthog": "PostHog Analytics", + "scarf": "Scarf Pixel" } }, - "download": "Downloaden", - "convert": { - "title": "Omzetten", - "settings": "Instellingen", - "color": "Kleur", - "greyscale": "Grijstinten", - "fillPage": "Pagina vullen", - "pdfaDigitalSignatureWarning": "Dit PDF bestand bevat een digitale handtekening. Deze wordt in de volgende stap verwijderd.", - "grayscale": "Grijstinten" + "removeMetadata": { + "submit": "Remove Metadata" }, - "attachments": { - "tags": "embed,attach,file,attachment,attachments", - "title": "Add attachments", - "header": "Add attachments", - "submit": "Add attachments" + "sidebar": { + "toggle": "Toggle Sidebar" + }, + "theme": { + "toggle": "Toggle Theme" + }, + "view": { + "viewer": "Viewer", + "pageEditor": "Page Editor", + "fileManager": "File Manager" + }, + "pageEditor": { + "title": "Page Editor", + "save": "Save Changes", + "noPdfLoaded": "No PDF loaded. Please upload a PDF to edit.", + "rotatedLeft": "Rotated left:", + "rotatedRight": "Rotated right:", + "deleted": "Deleted:", + "movedLeft": "Moved left:", + "movedRight": "Moved right:", + "splitAt": "Split at:", + "insertedPageBreak": "Inserted page break at:", + "addFileNotImplemented": "Add file not implemented in demo", + "closePdf": "Close PDF", + "reset": "Reset Changes", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "fitToWidth": "Fit to Width", + "actualSize": "Actual Size" + }, + "viewer": { + "firstPage": "First Page", + "lastPage": "Last Page", + "previousPage": "Previous Page", + "nextPage": "Next Page", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "singlePageView": "Single Page View", + "dualPageView": "Dual Page View" + }, + "rightRail": { + "closeSelected": "Close Selected Files", + "selectAll": "Select All", + "deselectAll": "Deselect All", + "selectByNumber": "Select by Page Numbers", + "deleteSelected": "Delete Selected Pages", + "closePdf": "Close PDF", + "exportAll": "Export PDF", + "downloadSelected": "Download Selected Files", + "downloadAll": "Download All", + "toggleTheme": "Toggle Theme", + "language": "Language", + "search": "Search PDF", + "panMode": "Pan Mode", + "rotateLeft": "Rotate Left", + "rotateRight": "Rotate Right", + "toggleSidebar": "Toggle Sidebar", + "exportSelected": "Export Selected Pages", + "toggleAnnotations": "Toggle Annotations Visibility", + "annotationMode": "Toggle Annotation Mode", + "draw": "Draw", + "save": "Save" + }, + "search": { + "title": "Search PDF", + "placeholder": "Enter search term...", + "noResults": "No results found", + "searching": "Searching..." + }, + "guestBanner": { + "title": "You're using Stirling PDF as a guest!", + "message": "Create a free account to save your work, access more features, and support the project.", + "dismiss": "Dismiss banner", + "signUp": "Sign Up Free" + }, + "toolPicker": { + "searchPlaceholder": "Search tools...", + "noToolsFound": "No tools found", + "allTools": "ALL TOOLS", + "quickAccess": "QUICK ACCESS", + "categories": { + "standardTools": "Standard Tools", + "advancedTools": "Advanced Tools", + "recommendedTools": "Recommended Tools" + }, + "subcategories": { + "signing": "Signing", + "documentSecurity": "Document Security", + "verification": "Verification", + "documentReview": "Document Review", + "pageFormatting": "Page Formatting", + "extraction": "Extraction", + "removal": "Removal", + "automation": "Automation", + "general": "General", + "advancedFormatting": "Advanced Formatting", + "developerTools": "Developer Tools" + } }, "quickAccess": { - "sign": "Ondertekenen" + "read": "Read", + "sign": "Ondertekenen", + "automate": "Automate", + "files": "Files", + "activity": "Activity", + "help": "Help", + "account": "Account", + "config": "Config", + "adminSettings": "Admin Settings", + "allTools": "All Tools" + }, + "admin": { + "error": "Error", + "success": "Success", + "expand": "Expand", + "close": "Close", + "status": { + "active": "Active", + "inactive": "Inactive" + }, + "settings": { + "title": "Admin Settings", + "workspace": "Workspace", + "fetchError": "Failed to load settings", + "saveError": "Failed to save settings", + "saved": "Settings saved successfully", + "saveSuccess": "Settings saved successfully", + "save": "Save Changes", + "restartRequired": "Restart Required", + "restart": { + "title": "Restart Required", + "message": "Settings have been saved successfully. A server restart is required for the changes to take effect.", + "question": "Would you like to restart the server now or later?", + "now": "Restart Now", + "later": "Restart Later" + }, + "restarting": "Restarting Server", + "restartingMessage": "The server is restarting. Please wait a moment...", + "restartError": "Failed to restart server. Please restart manually.", + "general": { + "title": "System Settings", + "description": "Configure system-wide application settings including branding and default behaviour.", + "ui": "User Interface", + "system": "System", + "appName": { + "label": "Application Name", + "description": "The name displayed in the browser tab and home page" + }, + "appNameNavbar": { + "label": "Navbar Brand", + "description": "The name displayed in the navigation bar" + }, + "homeDescription": { + "label": "Home Description", + "description": "The description text shown on the home page" + }, + "defaultLocale": { + "label": "Default Locale", + "description": "The default language for new users (e.g., en_US, es_ES)" + }, + "fileUploadLimit": { + "label": "File Upload Limit", + "description": "Maximum file upload size (e.g., 100MB, 1GB)" + }, + "showUpdate": { + "label": "Show Update Notifications", + "description": "Display notifications when a new version is available" + }, + "showUpdateOnlyAdmin": { + "label": "Show Updates to Admins Only", + "description": "Restrict update notifications to admin users only" + }, + "customHTMLFiles": { + "label": "Custom HTML Files", + "description": "Allow serving custom HTML files from the customFiles directory" + }, + "languages": { + "label": "Available Languages", + "description": "Languages that users can select from (leave empty to enable all languages)" + }, + "customMetadata": { + "label": "Custom Metadata", + "autoUpdate": { + "label": "Auto Update Metadata", + "description": "Automatically update PDF metadata on all processed documents" + }, + "author": { + "label": "Default Author", + "description": "Default author for PDF metadata (e.g., username)" + }, + "creator": { + "label": "Default Creator", + "description": "Default creator for PDF metadata" + }, + "producer": { + "label": "Default Producer", + "description": "Default producer for PDF metadata" + } + }, + "customPaths": { + "label": "Custom Paths", + "description": "Configure custom file system paths for pipeline processing and external tools", + "pipeline": { + "label": "Pipeline Directories", + "watchedFoldersDir": { + "label": "Watched Folders Directory", + "description": "Directory where pipeline monitors for incoming PDFs (leave empty for default: /pipeline/watchedFolders)" + }, + "finishedFoldersDir": { + "label": "Finished Folders Directory", + "description": "Directory where processed PDFs are outputted (leave empty for default: /pipeline/finishedFolders)" + } + }, + "operations": { + "label": "External Tool Paths", + "weasyprint": { + "label": "WeasyPrint Executable", + "description": "Path to WeasyPrint executable for HTML to PDF conversion (leave empty for default: /opt/venv/bin/weasyprint)" + }, + "unoconvert": { + "label": "Unoconvert Executable", + "description": "Path to LibreOffice unoconvert for document conversions (leave empty for default: /opt/venv/bin/unoconvert)" + } + } + } + }, + "security": { + "title": "Security", + "description": "Configure authentication, login behaviour, and security policies.", + "ssoNotice": { + "title": "Looking for SSO/SAML settings?", + "message": "OAuth2 and SAML2 authentication providers have been moved to the Connections menu for easier management." + }, + "authentication": "Authentication", + "enableLogin": { + "label": "Enable Login", + "description": "Require users to log in before accessing the application" + }, + "loginMethod": { + "label": "Login Method", + "description": "The authentication method to use for user login", + "all": "All Methods", + "normal": "Username/Password Only", + "oauth2": "OAuth2 Only", + "saml2": "SAML2 Only" + }, + "loginAttemptCount": { + "label": "Login Attempt Limit", + "description": "Maximum number of failed login attempts before account lockout" + }, + "loginResetTimeMinutes": { + "label": "Login Reset Time (minutes)", + "description": "Time before failed login attempts are reset" + }, + "csrfDisabled": { + "label": "Disable CSRF Protection", + "description": "Disable Cross-Site Request Forgery protection (not recommended)" + }, + "initialLogin": { + "label": "Initial Login", + "username": { + "label": "Initial Username", + "description": "The username for the initial admin account" + }, + "password": { + "label": "Initial Password", + "description": "The password for the initial admin account" + } + }, + "jwt": { + "label": "JWT Configuration", + "secureCookie": { + "label": "Secure Cookie", + "description": "Require HTTPS for JWT cookies (recommended for production)" + }, + "keyRetentionDays": { + "label": "Key Retention Days", + "description": "Number of days to retain old JWT keys for verification" + }, + "persistence": { + "label": "Enable Key Persistence", + "description": "Store JWT keys persistently to survive server restarts" + }, + "enableKeyRotation": { + "label": "Enable Key Rotation", + "description": "Automatically rotate JWT signing keys periodically" + }, + "enableKeyCleanup": { + "label": "Enable Key Cleanup", + "description": "Automatically remove expired JWT keys" + } + }, + "audit": { + "label": "Audit Logging", + "enabled": { + "label": "Enable Audit Logging", + "description": "Track user actions and system events for compliance and security monitoring" + }, + "level": { + "label": "Audit Level", + "description": "0=OFF, 1=BASIC, 2=STANDARD, 3=VERBOSE" + }, + "retentionDays": { + "label": "Audit Retention (days)", + "description": "Number of days to retain audit logs" + } + }, + "htmlUrlSecurity": { + "label": "HTML URL Security", + "description": "Configure URL access restrictions for HTML processing to prevent SSRF attacks", + "enabled": { + "label": "Enable URL Security", + "description": "Enable URL security restrictions for HTML to PDF conversions" + }, + "level": { + "label": "Security Level", + "description": "MAX: whitelist only, MEDIUM: block internal networks, OFF: no restrictions", + "max": "Maximum (Whitelist Only)", + "medium": "Medium (Block Internal)", + "off": "Off (No Restrictions)" + }, + "advanced": "Advanced Settings", + "allowedDomains": { + "label": "Allowed Domains (Whitelist)", + "description": "One domain per line (e.g., cdn.example.com). Only these domains allowed when level is MAX" + }, + "blockedDomains": { + "label": "Blocked Domains (Blacklist)", + "description": "One domain per line (e.g., malicious.com). Additional domains to block" + }, + "internalTlds": { + "label": "Internal TLDs", + "description": "One TLD per line (e.g., .local, .internal). Block domains with these TLD patterns" + }, + "networkBlocking": "Network Blocking", + "blockPrivateNetworks": { + "label": "Block Private Networks", + "description": "Block RFC 1918 private networks (10.x.x.x, 192.168.x.x, 172.16-31.x.x)" + }, + "blockLocalhost": { + "label": "Block Localhost", + "description": "Block localhost and loopback addresses (127.x.x.x, ::1)" + }, + "blockLinkLocal": { + "label": "Block Link-Local Addresses", + "description": "Block link-local addresses (169.254.x.x, fe80::/10)" + }, + "blockCloudMetadata": { + "label": "Block Cloud Metadata Endpoints", + "description": "Block cloud provider metadata endpoints (169.254.169.254)" + } + } + }, + "connections": { + "title": "Connections", + "description": "Configure external authentication providers like OAuth2 and SAML.", + "linkedServices": "Linked Services", + "unlinkedServices": "Unlinked Services", + "connect": "Connect", + "disconnect": "Disconnect", + "disconnected": "Provider disconnected successfully", + "disconnectError": "Failed to disconnect provider", + "ssoAutoLogin": { + "label": "SSO Auto Login", + "enable": "Enable SSO Auto Login", + "description": "Automatically redirect to SSO login when authentication is required" + }, + "oauth2": { + "label": "OAuth2", + "enabled": { + "label": "Enable OAuth2", + "description": "Allow users to authenticate using OAuth2 providers" + }, + "provider": { + "label": "Provider", + "description": "The OAuth2 provider to use for authentication" + }, + "issuer": { + "label": "Issuer URL", + "description": "The OAuth2 provider issuer URL" + }, + "clientId": { + "label": "Client ID", + "description": "The OAuth2 client ID from your provider" + }, + "clientSecret": { + "label": "Client Secret", + "description": "The OAuth2 client secret from your provider" + }, + "useAsUsername": { + "label": "Use as Username", + "description": "The OAuth2 claim to use as the username (e.g., email, sub)" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first OAuth2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via OAuth2" + }, + "scopes": { + "label": "OAuth2 Scopes", + "description": "Comma-separated list of OAuth2 scopes to request (e.g., openid, profile, email)" + } + }, + "saml2": { + "label": "SAML2", + "enabled": { + "label": "Enable SAML2", + "description": "Allow users to authenticate using SAML2 providers" + }, + "provider": { + "label": "Provider", + "description": "The SAML2 provider name" + }, + "registrationId": { + "label": "Registration ID", + "description": "The SAML2 registration identifier" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first SAML2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via SAML2" + } + } + }, + "database": { + "title": "Database", + "description": "Configure custom database connection settings for enterprise deployments.", + "configuration": "Database Configuration", + "enableCustom": { + "label": "Enable Custom Database", + "description": "Use your own custom database configuration instead of the default embedded database" + }, + "customUrl": { + "label": "Custom Database URL", + "description": "Full JDBC connection string (e.g., jdbc:postgresql://localhost:5432/postgres). If provided, individual connection settings below are not used." + }, + "type": { + "label": "Database Type", + "description": "Type of database (not used if custom URL is provided)" + }, + "hostName": { + "label": "Host Name", + "description": "Database server hostname (not used if custom URL is provided)" + }, + "port": { + "label": "Port", + "description": "Database server port (not used if custom URL is provided)" + }, + "name": { + "label": "Database Name", + "description": "Name of the database (not used if custom URL is provided)" + }, + "username": { + "label": "Username", + "description": "Database authentication username" + }, + "password": { + "label": "Password", + "description": "Database authentication password" + } + }, + "privacy": { + "title": "Privacy", + "description": "Configure privacy and data collection settings.", + "analytics": "Analytics & Tracking", + "enableAnalytics": { + "label": "Enable Analytics", + "description": "Collect anonymous usage analytics to help improve the application" + }, + "metricsEnabled": { + "label": "Enable Metrics", + "description": "Enable collection of performance and usage metrics. Provides API endpoint for admins to access metrics data" + }, + "searchEngine": "Search Engine Visibility", + "googleVisibility": { + "label": "Google Visibility", + "description": "Allow search engines to index this application" + } + }, + "advanced": { + "title": "Advanced", + "description": "Configure advanced features and experimental functionality.", + "features": "Feature Flags", + "processing": "Processing", + "endpoints": { + "label": "Endpoints", + "manage": "Manage API Endpoints", + "description": "Endpoint management is configured via YAML. See documentation for details on enabling/disabling specific endpoints." + }, + "enableAlphaFunctionality": { + "label": "Enable Alpha Features", + "description": "Enable experimental and alpha-stage features (may be unstable)" + }, + "enableUrlToPDF": { + "label": "Enable URL to PDF", + "description": "Allow conversion of web pages to PDF documents" + }, + "maxDPI": { + "label": "Maximum DPI", + "description": "Maximum DPI for image processing (0 = unlimited)" + }, + "tessdataDir": { + "label": "Tessdata Directory", + "description": "Path to the tessdata directory for OCR language files" + }, + "disableSanitize": { + "label": "Disable HTML Sanitization", + "description": "WARNING: Security risk - disabling HTML sanitization can lead to XSS vulnerabilities" + }, + "tempFileManagement": { + "label": "Temp File Management", + "description": "Configure temporary file storage and cleanup behavior", + "baseTmpDir": { + "label": "Base Temp Directory", + "description": "Base directory for temporary files (leave empty for default: java.io.tmpdir/stirling-pdf)" + }, + "libreofficeDir": { + "label": "LibreOffice Temp Directory", + "description": "Directory for LibreOffice temp files (leave empty for default: baseTmpDir/libreoffice)" + }, + "systemTempDir": { + "label": "System Temp Directory", + "description": "System temp directory to clean (only used if cleanupSystemTemp is enabled)" + }, + "prefix": { + "label": "Temp File Prefix", + "description": "Prefix for temp file names" + }, + "maxAgeHours": { + "label": "Max Age (hours)", + "description": "Maximum age in hours before temp files are cleaned up" + }, + "cleanupIntervalMinutes": { + "label": "Cleanup Interval (minutes)", + "description": "How often to run cleanup (in minutes)" + }, + "startupCleanup": { + "label": "Startup Cleanup", + "description": "Clean up old temp files on application startup" + }, + "cleanupSystemTemp": { + "label": "Cleanup System Temp", + "description": "Whether to clean broader system temp directory (use with caution)" + } + }, + "processExecutor": { + "label": "Process Executor Limits", + "description": "Configure session limits and timeouts for each process executor", + "sessionLimit": { + "label": "Session Limit", + "description": "Maximum concurrent instances" + }, + "timeout": { + "label": "Timeout (minutes)", + "description": "Maximum execution time" + }, + "libreOffice": "LibreOffice", + "pdfToHtml": "PDF to HTML", + "qpdf": "QPDF", + "tesseract": "Tesseract OCR", + "pythonOpenCv": "Python OpenCV", + "weasyPrint": "WeasyPrint", + "installApp": "Install App", + "calibre": "Calibre", + "ghostscript": "Ghostscript", + "ocrMyPdf": "OCRmyPDF" + } + }, + "mail": { + "title": "Mail Server", + "description": "Configure SMTP settings for sending email notifications.", + "smtp": "SMTP Configuration", + "enabled": { + "label": "Enable Mail", + "description": "Enable email notifications and SMTP functionality" + }, + "host": { + "label": "SMTP Host", + "description": "The hostname or IP address of your SMTP server" + }, + "port": { + "label": "SMTP Port", + "description": "The port number for SMTP connection (typically 25, 465, or 587)" + }, + "username": { + "label": "SMTP Username", + "description": "Username for SMTP authentication" + }, + "password": { + "label": "SMTP Password", + "description": "Password for SMTP authentication" + }, + "from": { + "label": "From Address", + "description": "The email address to use as the sender" + }, + "enableInvites": { + "label": "Enable Email Invites", + "description": "Allow admins to invite users via email with auto-generated passwords" + }, + "frontendUrl": { + "label": "Frontend URL", + "description": "Base URL for frontend (e.g. https://pdf.example.com). Used for generating invite links in emails. Leave empty to use backend URL." + } + }, + "legal": { + "title": "Legal Documents", + "description": "Configure links to legal documents and policies.", + "disclaimer": { + "title": "Legal Responsibility Warning", + "message": "By customizing these legal documents, you assume full responsibility for ensuring compliance with all applicable laws and regulations, including but not limited to GDPR and other EU data protection requirements. Only modify these settings if: (1) you are operating a personal/private instance, (2) you are outside EU jurisdiction and understand your local legal obligations, or (3) you have obtained proper legal counsel and accept sole responsibility for all user data and legal compliance. Stirling-PDF and its developers assume no liability for your legal obligations." + }, + "termsAndConditions": { + "label": "Terms and Conditions", + "description": "URL or filename to terms and conditions" + }, + "privacyPolicy": { + "label": "Privacy Policy", + "description": "URL or filename to privacy policy" + }, + "accessibilityStatement": { + "label": "Accessibility Statement", + "description": "URL or filename to accessibility statement" + }, + "cookiePolicy": { + "label": "Cookie Policy", + "description": "URL or filename to cookie policy" + }, + "impressum": { + "label": "Impressum", + "description": "URL or filename to impressum (required in some jurisdictions)" + } + }, + "premium": { + "title": "Premium & Enterprise", + "description": "Configure your premium or enterprise license key.", + "license": "License Configuration", + "key": { + "label": "License Key", + "description": "Enter your premium or enterprise license key" + }, + "enabled": { + "label": "Enable Premium Features", + "description": "Enable license key checks for pro/enterprise features" + }, + "movedFeatures": { + "title": "Premium Features Distributed", + "message": "Premium and Enterprise features are now organized in their respective sections:" + } + }, + "features": { + "title": "Features", + "description": "Configure optional features and functionality.", + "serverCertificate": { + "label": "Server Certificate", + "description": "Configure server-side certificate generation for \"Sign with Stirling-PDF\" functionality", + "enabled": { + "label": "Enable Server Certificate", + "description": "Enable server-side certificate for \"Sign with Stirling-PDF\" option" + }, + "organizationName": { + "label": "Organization Name", + "description": "Organization name for generated certificates" + }, + "validity": { + "label": "Certificate Validity (days)", + "description": "Number of days the certificate will be valid" + }, + "regenerateOnStartup": { + "label": "Regenerate on Startup", + "description": "Generate new certificate on each application startup" + } + } + }, + "endpoints": { + "title": "API Endpoints", + "description": "Control which API endpoints and endpoint groups are available.", + "management": "Endpoint Management", + "toRemove": { + "label": "Disabled Endpoints", + "description": "Select individual endpoints to disable" + }, + "groupsToRemove": { + "label": "Disabled Endpoint Groups", + "description": "Select endpoint groups to disable" + }, + "note": "Note: Disabling endpoints restricts API access but does not remove UI components. Restart required for changes to take effect." + } + } }, "fileUpload": { - "loading": "Laden..." + "selectFile": "Select a file", + "selectFiles": "Select files", + "selectPdfToView": "Select a PDF to view", + "selectPdfToEdit": "Select a PDF to edit", + "chooseFromStorage": "Choose a file from storage or upload a new PDF", + "chooseFromStorageMultiple": "Choose files from storage or upload new PDFs", + "loadFromStorage": "Load from Storage", + "filesAvailable": "files available", + "loading": "Laden...", + "or": "or", + "dropFileHere": "Drop file here or click to upload", + "dropFilesHere": "Drop files here or click the upload button", + "pdfFilesOnly": "PDF files only", + "supportedFileTypes": "Supported file types", + "upload": "Upload", + "uploadFile": "Upload File", + "uploadFiles": "Upload Files", + "noFilesInStorage": "No files available in storage. Upload some files first.", + "selectFromStorage": "Select from Storage", + "backToTools": "Back to Tools", + "addFiles": "Add Files", + "dragFilesInOrClick": "Drag files in or click \"Add Files\" to browse" + }, + "fileEditor": { + "addFiles": "Add Files" }, "fileManager": { + "title": "Upload PDF Files", + "subtitle": "Add files to your storage for easy access across tools", + "filesSelected": "files selected", + "clearSelection": "Clear Selection", + "openInFileEditor": "Open in File Editor", + "uploadError": "Failed to upload some files.", + "failedToOpen": "Failed to open file. It may have been removed from storage.", + "failedToLoad": "Failed to load file to active set.", + "storageCleared": "Browser cleared storage. Files have been removed. Please re-upload.", + "clearAll": "Clear All", + "reloadFiles": "Reload Files", + "dragDrop": "Drag & Drop files here", + "clickToUpload": "Click to upload files", + "selectedFiles": "Selected Files", + "storage": "Storage", + "filesStored": "files stored", + "storageError": "Storage error occurred", + "storageLow": "Storage is running low. Consider removing old files.", + "supportMessage": "Powered by browser database storage for unlimited capacity", + "noFileSelected": "No files selected", + "showHistory": "Show History", + "hideHistory": "Hide History", + "fileHistory": "File History", + "loadingHistory": "Loading History...", + "lastModified": "Last Modified", + "toolChain": "Tools Applied", + "restore": "Restore", + "unzip": "Unzip", + "searchFiles": "Search files...", + "recent": "Recent", + "localFiles": "Local Files", + "googleDrive": "Google Drive", + "googleDriveShort": "Drive", + "myFiles": "My Files", + "noRecentFiles": "No recent files found", + "googleDriveNotAvailable": "Google Drive integration not available", + "openFiles": "Open Files", + "openFile": "Open File", + "details": "File Details", "fileName": "Naam", + "fileFormat": "Format", + "fileSize": "Size", "fileVersion": "Versie", + "totalSelected": "Total Selected", + "dropFilesHere": "Drop files here", + "selectAll": "Select All", + "deselectAll": "Deselect All", + "deleteSelected": "Delete Selected", + "downloadSelected": "Download Selected", + "selectedCount": "{{count}} selected", "download": "Downloaden", - "delete": "Verwijderen" + "delete": "Verwijderen", + "unsupported": "Unsupported", + "addToUpload": "Add to Upload", + "deleteAll": "Delete All", + "loadingFiles": "Loading files...", + "noFiles": "No files available", + "noFilesFound": "No files found matching your search", + "openInPageEditor": "Open in Page Editor", + "showAll": "Show All", + "sortByDate": "Sort by Date", + "sortByName": "Sort by Name", + "sortBySize": "Sort by Size" + }, + "storage": { + "temporaryNotice": "Files are stored temporarily in your browser and may be cleared automatically", + "storageLimit": "Storage limit", + "storageUsed": "Temporary Storage used", + "storageFull": "Storage is nearly full. Consider removing some files.", + "fileTooLarge": "File too large. Maximum size per file is", + "storageQuotaExceeded": "Storage quota exceeded. Please remove some files before uploading more.", + "approximateSize": "Approximate size" }, "sanitize": { + "title": "Sanitise", + "desc": "Remove potentially harmful elements from PDF files.", "submit": "PDF opschonen", + "completed": "Sanitisation completed successfully", + "error": { + "generic": "Sanitisation failed", + "failed": "An error occurred while sanitising the PDF." + }, + "filenamePrefix": "sanitised", + "sanitizationResults": "Sanitisation Results", "steps": { - "settings": "Instellingen" + "files": "Files", + "settings": "Instellingen", + "results": "Results" + }, + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "options": { + "title": "Sanitisation Options", + "note": "Select the elements you want to remove from the PDF. At least one option must be selected.", + "removeJavaScript": { + "label": "Remove JavaScript", + "desc": "Remove JavaScript actions and scripts from the PDF" + }, + "removeEmbeddedFiles": { + "label": "Remove Embedded Files", + "desc": "Remove any files embedded within the PDF" + }, + "removeXMPMetadata": { + "label": "Remove XMP Metadata", + "desc": "Remove XMP metadata from the PDF" + }, + "removeMetadata": { + "label": "Remove Document Metadata", + "desc": "Remove document information metadata (title, author, etc.)" + }, + "removeLinks": { + "label": "Remove Links", + "desc": "Remove external links and launch actions from the PDF" + }, + "removeFonts": { + "label": "Remove Fonts", + "desc": "Remove embedded fonts from the PDF" + } + } + }, + "addPassword": { + "title": "Wachtwoord toevoegen", + "desc": "Encrypt your PDF document with a password.", + "completed": "Password protection applied", + "submit": "Versleutelen", + "filenamePrefix": "encrypted", + "error": { + "failed": "An error occurred while encrypting the PDF." + }, + "passwords": { + "stepTitle": "Passwords & Encryption", + "completed": "Passwords configured", + "user": { + "label": "User Password", + "placeholder": "Enter user password" + }, + "owner": { + "label": "Owner Password", + "placeholder": "Enter owner password" + } + }, + "encryption": { + "keyLength": { + "label": "Encryption Key Length", + "40bit": "40-bit (Low)", + "128bit": "128-bit (Standard)", + "256bit": "256-bit (High)" + } + }, + "results": { + "title": "Encrypted PDFs" + }, + "tooltip": { + "header": { + "title": "Password Protection Overview" + }, + "passwords": { + "title": "Password Types", + "text": "User passwords restrict opening the document, while owner passwords control what can be done with the document once opened. You can set both or just one.", + "bullet1": "User Password: Required to open the PDF", + "bullet2": "Owner Password: Controls document permissions (not supported by all PDF viewers)" + }, + "encryption": { + "title": "Encryption Levels", + "text": "Higher encryption levels provide better security but may not be supported by older PDF viewers.", + "bullet1": "40-bit: Basic security, compatible with older viewers", + "bullet2": "128-bit: Standard security, widely supported", + "bullet3": "256-bit: Maximum security, requires modern viewers" + }, + "permissions": { + "title": "Rechten wijzigen", + "text": "These permissions control what users can do with the PDF. Most effective when combined with an owner password." + } + }, + "tags": "veilig,beveiliging", + "header": "Wachtwoord toevoegen (Versleutelen)", + "selectText": { + "1": "Selecteer PDF om te versleutelen", + "2": "Gebruikerswachtwoord", + "3": "Versleutelingssleutellengte", + "4": "Hogere waarden zijn sterker, maar lagere waarden hebben een betere compatibiliteit.", + "5": "In te stellen rechten (Aanbevolen om te gebruiken samen met eigenaarswachtwoord)", + "6": "Voorkomen van documentassemblage", + "7": "Voorkomen van inhoudsextractie", + "8": "Voorkomen van extractie voor toegankelijkheid", + "9": "Voorkomen van invullen van formulier", + "10": "Voorkomen van wijziging", + "11": "Voorkomen van annotatiewijziging", + "12": "Voorkomen van afdrukken", + "13": "Voorkomen van afdrukken in verschillende formaten", + "14": "Eigenaarswachtwoord", + "15": "Beperkt wat gedaan kan worden met het document nadat het is geopend (Niet ondersteund door alle lezers)", + "16": "Beperkt het openen van het document zelf" } }, "changePermissions": { "title": "Rechten wijzigen", + "desc": "Change document restrictions and permissions.", + "completed": "Permissions changed", "submit": "Rechten wijzigen", + "error": { + "failed": "An error occurred while changing PDF permissions." + }, "permissions": { "preventAssembly": { "label": "Voorkom samenvoegen van document" @@ -1728,10 +4580,784 @@ "label": "Voorkom afdrukken in verschillende formaten" } }, + "results": { + "title": "Modified PDFs" + }, "tooltip": { "header": { "title": "Rechten wijzigen" + }, + "description": { + "text": "Changes document permissions, allowing/disallowing access to different features in PDF readers." + }, + "warning": { + "text": "To make these permissions unchangeable, use the Add Password tool to set an owner password." } } + }, + "removePassword": { + "title": "Wachtwoord verwijderen", + "desc": "Verwijder wachtwoordbeveiliging van je PDF-document.", + "tags": "veilig,ontsleutelen,beveiliging,wachtwoord verwijderen", + "password": { + "stepTitle": "Wachtwoord verwijderen", + "label": "Huidige wachtwoord", + "placeholder": "Enter current password", + "completed": "Password configured" + }, + "filenamePrefix": "decrypted", + "error": { + "failed": "An error occurred while removing the password from the PDF." + }, + "tooltip": { + "description": "Removing password protection requires the password that was used to encrypt the PDF. This will decrypt the document, making it accessible without a password." + }, + "submit": "Verwijderen", + "results": { + "title": "Decrypted PDFs" + }, + "header": "Wachtwoord verwijderen (Decrypteren)", + "selectText": { + "1": "Selecteer PDF om te decrypteren", + "2": "Wachtwoord" + } + }, + "automate": { + "title": "Automate", + "desc": "Build multi-step workflows by chaining together PDF actions. Ideal for recurring tasks.", + "invalidStep": "Invalid step", + "files": { + "placeholder": "Select files to process with this automation" + }, + "selection": { + "title": "Automation Selection", + "saved": { + "title": "Saved" + }, + "createNew": { + "title": "Create New Automation" + }, + "suggested": { + "title": "Suggested" + } + }, + "creation": { + "createTitle": "Create Automation", + "editTitle": "Edit Automation", + "intro": "Automations run tools sequentially. To get started, add tools in the order you want them to run.", + "name": { + "label": "Automation Name", + "placeholder": "My Automation" + }, + "description": { + "label": "Description (optional)", + "placeholder": "Describe what this automation does..." + }, + "tools": { + "selectTool": "Select a tool...", + "selected": "Selected Tools", + "remove": "Remove tool", + "configure": "Configure tool", + "notConfigured": "! Not Configured", + "addTool": "Add Tool", + "add": "Add a tool..." + }, + "save": "Save Automation", + "unsavedChanges": { + "title": "Unsaved Changes", + "message": "You have unsaved changes. Are you sure you want to go back? All changes will be lost.", + "cancel": "Cancel", + "confirm": "Go Back" + }, + "icon": { + "label": "Icon" + } + }, + "run": { + "title": "Run Automation" + }, + "sequence": { + "unnamed": "Unnamed Automation", + "steps": "{{count}} steps", + "running": "Running Automation...", + "run": "Run Automation", + "finish": "Finish" + }, + "reviewTitle": "Automation Results", + "config": { + "loading": "Loading tool configuration...", + "noSettings": "This tool does not have configurable settings.", + "title": "Configure {{toolName}}", + "description": "Configure the settings for this tool. These settings will be applied when the automation runs.", + "cancel": "Cancel", + "save": "Save Configuration" + }, + "copyToSaved": "Copy to Saved" + }, + "automation": { + "suggested": { + "securePdfIngestion": "Secure PDF Ingestion", + "securePdfIngestionDesc": "Comprehensive PDF processing workflow that sanitises documents, applies OCR with cleanup, converts to PDF/A format for long-term archival, and optimises file size.", + "emailPreparation": "Email Preparation", + "emailPreparationDesc": "Optimises PDFs for email distribution by compressing files, splitting large documents into 20MB chunks for email compatibility, and removing metadata for privacy.", + "secureWorkflow": "Security Workflow", + "secureWorkflowDesc": "Secures PDF documents by removing potentially malicious content like JavaScript and embedded files, then adds password protection to prevent unauthorised access. Password is set to 'password' by default.", + "processImages": "Process Images", + "processImagesDesc": "Converts multiple image files into a single PDF document, then applies OCR technology to extract searchable text from the images." + } + }, + "common": { + "copy": "Copy", + "copied": "Copied!", + "refresh": "Refresh", + "retry": "Retry", + "remaining": "remaining", + "used": "used", + "available": "available", + "cancel": "Cancel", + "preview": "Preview" + }, + "config": { + "overview": { + "title": "Application Configuration", + "description": "Current application settings and configuration details." + }, + "account": { + "overview": { + "title": "Account Settings", + "manageAccountPreferences": "Manage your account preferences", + "guestDescription": "You are signed in as a guest. Consider upgrading your account above." + }, + "upgrade": { + "title": "Upgrade Guest Account", + "description": "Link your account to preserve your history and access more features!", + "socialLogin": "Upgrade with Social Account", + "linkWith": "Link with", + "emailPassword": "or enter your email & password", + "email": "Email", + "emailPlaceholder": "Enter your email", + "password": "Password (optional)", + "passwordPlaceholder": "Set a password", + "passwordNote": "Leave empty to use email verification only", + "upgradeButton": "Upgrade Account" + } + }, + "apiKeys": { + "description": "Your API key for accessing Stirling's suite of PDF tools. Copy it to your project or refresh to generate a new one.", + "publicKeyAriaLabel": "Public API key", + "copyKeyAriaLabel": "Copy API key", + "refreshAriaLabel": "Refresh API key", + "includedCredits": "Included credits", + "purchasedCredits": "Purchased credits", + "totalCredits": "Total Credits", + "chartAriaLabel": "Credits usage: included {{includedUsed}} of {{includedTotal}}, purchased {{purchasedUsed}} of {{purchasedTotal}}", + "nextReset": "Next Reset", + "lastApiUse": "Last API Use", + "overlayMessage": "Generate a key to see credits and available credits", + "label": "API Key", + "guestInfo": "Guest users do not receive API keys. Create an account to get an API key you can use in your applications.", + "goToAccount": "Go to Account", + "refreshModal": { + "title": "Refresh API Keys", + "warning": "âš ī¸ Warning: This action will generate new API keys and make your previous keys invalid.", + "impact": "Any applications or services currently using these keys will stop working until you update them with the new keys.", + "confirmPrompt": "Are you sure you want to continue?", + "confirmCta": "Refresh Keys" + }, + "generateError": "We couldn't generate your API key." + } + }, + "AddAttachmentsRequest": { + "attachments": "Select Attachments", + "info": "Select files to attach to your PDF. These files will be embedded and accessible through the PDF's attachment panel.", + "selectFiles": "Select Files to Attach", + "placeholder": "Choose files...", + "addMoreFiles": "Add more files...", + "selectedFiles": "Selected Files", + "submit": "Add Attachments", + "results": { + "title": "Attachment Results" + }, + "error": { + "failed": "Add attachments operation failed" + } + }, + "termsAndConditions": "Terms & Conditions", + "logOut": "Log out", + "addAttachments": { + "error": { + "failed": "An error occurred while adding attachments to the PDF." + } + }, + "autoRename": { + "description": "This tool will automatically rename PDF files based on their content. It analyzes the document to find the most suitable title from the text." + }, + "customPosition": "Custom Position", + "details": "Details", + "downloadUnavailable": "Download unavailable for this item", + "invalidUndoData": "Cannot undo: invalid operation data", + "margin": { + "large": "Large", + "medium": "Medium", + "small": "Small", + "xLarge": "Extra Large" + }, + "noFilesToUndo": "Cannot undo: no files were processed in the last operation", + "noOperationToUndo": "No operation to undo", + "noValidFiles": "No valid files to process", + "operationCancelled": "Operation cancelled", + "pageEdit": { + "deselectAll": "Select None", + "selectAll": "Select All" + }, + "quickPosition": "Quick Position", + "reorganizePages": { + "error": { + "failed": "Failed to reorganize pages" + }, + "results": { + "title": "Pages Reorganized" + }, + "settings": { + "title": "Settings" + }, + "submit": "Reorganize Pages" + }, + "replace-color": { + "options": { + "fill": "Fill colour", + "gradient": "Gradient" + }, + "previewOverlayOpacity": "Preview overlay opacity", + "previewOverlayTransparency": "Preview overlay transparency", + "previewOverlayVisibility": "Show preview overlay", + "selectText": { + "1": "Vervang of invertere kleure opties", + "2": "Standaard (hoog contrast kleuren)", + "3": "Aangepast (aangepaste kleuren)", + "4": "Volledig inverteren (alle kleuren omverkeren)", + "5": "Opties voor hoog contrast", + "6": "wit tekst op een zwart grondvlak", + "7": "zwarte tekst op wit grondvlak", + "8": "gele tekst op een zwart grondvlak", + "9": "groene tekst op een zwart grondvlak", + "10": "Kies de tekstkleur", + "11": "Kies het achtergrondkleur", + "12": "Choose start colour", + "13": "Choose end colour" + }, + "submit": "Vervang", + "title": "Replace-Invert-Color", + "header": "Kleur-instellingen voor PDF's" + }, + "size": "Size", + "submit": "Submit", + "success": "Success", + "tools": { + "noSearchResults": "No tools found", + "noTools": "No tools available" + }, + "undoDataMismatch": "Cannot undo: operation data is corrupted", + "undoFailed": "Failed to undo operation", + "undoQuotaError": "Cannot undo: insufficient storage space", + "undoStorageError": "Undo completed but some files could not be saved to storage", + "undoSuccess": "Operation undone successfully", + "unsupported": "Unsupported", + "onboarding": { + "welcomeModal": { + "title": "Welcome to Stirling PDF!", + "description": "Would you like to take a quick 1-minute tour to learn the key features and how to get started?", + "helpHint": "You can always access this tour later from the Help button in the bottom left.", + "startTour": "Start Tour", + "maybeLater": "Maybe Later", + "dontShowAgain": "Don't Show Again" + }, + "allTools": "This is the All Tools panel, where you can browse and select from all available PDF tools.", + "selectCropTool": "Let's select the Crop tool to demonstrate how to use one of the tools.", + "toolInterface": "This is the Crop tool interface. As you can see, there's not much there because we haven't added any PDF files to work with yet.", + "filesButton": "The Files button on the Quick Access bar allows you to upload PDFs to use the tools on.", + "fileSources": "You can upload new files or access recent files from here. For the tour, we'll just use a sample file.", + "workbench": "This is the Workbench - the main area where you view and edit your PDFs.", + "viewSwitcher": "Use these controls to select how you want to view your PDFs.", + "viewer": "The Viewer lets you read and annotate your PDFs.", + "pageEditor": "The Page Editor allows you to do various operations on the pages within your PDFs, such as reordering, rotating and deleting.", + "activeFiles": "The Active Files view shows all of the PDFs you have loaded into the tool, and allows you to select which ones to process.", + "fileCheckbox": "Clicking one of the files selects it for processing. You can select multiple files for batch operations.", + "selectControls": "The Right Rail contains buttons to quickly select/deselect all of your active PDFs, along with buttons to change the app's theme or language.", + "cropSettings": "Now that we've selected the file we want crop, we can configure the Crop tool to choose the area that we want to crop the PDF to.", + "runButton": "Once the tool has been configured, this button allows you to run the tool on all the selected PDFs.", + "results": "After the tool has finished running, the Review step will show a preview of the results in this panel, and allow you to undo the operation or download the file. ", + "fileReplacement": "The modified file will replace the original file in the Workbench automatically, allowing you to easily run it through more tools.", + "pinButton": "You can use the Pin button if you'd rather your files stay active after running tools on them.", + "wrapUp": "You're all set! You've learnt about the main areas of the app and how to use them. Click the Help button whenever you like to see this tour again.", + "previous": "Previous", + "next": "Next", + "finish": "Finish", + "startTour": "Start Tour", + "startTourDescription": "Take a guided tour of Stirling PDF's key features" + }, + "workspace": { + "title": "Workspace", + "people": { + "title": "People", + "description": "Manage workspace members and their permissions", + "loading": "Loading people...", + "searchMembers": "Search members...", + "addMembers": "Add Members", + "inviteMembers": { + "label": "Invite Members", + "subtitle": "Type or paste in emails below, separated by commas. Your workspace will be billed by members." + }, + "user": "User", + "role": "Role", + "team": "Team", + "status": "Status", + "actions": "Actions", + "noMembersFound": "No members found", + "active": "Active", + "disabled": "Disabled", + "activeSession": "Active session", + "member": "Member", + "admin": "Admin", + "roleDescriptions": { + "admin": "Can manage settings and invite members, with full administrative access.", + "member": "Can view and edit shared files, but cannot manage workspace settings or members." + }, + "editRole": "Edit Role", + "enable": "Enable", + "disable": "Disable", + "deleteUser": "Delete User", + "deleteUserSuccess": "User deleted successfully", + "deleteUserError": "Failed to delete user", + "confirmDelete": "Are you sure you want to delete this user? This action cannot be undone.", + "addMember": { + "title": "Add Member", + "username": "Username (Email)", + "usernamePlaceholder": "user@example.com", + "password": "Password", + "passwordPlaceholder": "Enter password", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "forcePasswordChange": "Force password change on first login", + "cancel": "Cancel", + "submit": "Add Member", + "usernameRequired": "Username and password are required", + "passwordTooShort": "Password must be at least 6 characters", + "success": "User created successfully", + "error": "Failed to create user" + }, + "editMember": { + "title": "Edit Member", + "editing": "Editing:", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "cancel": "Cancel", + "submit": "Update Member", + "success": "User updated successfully", + "error": "Failed to update user" + }, + "toggleEnabled": { + "success": "User status updated successfully", + "error": "Failed to update user status" + }, + "delete": { + "success": "User deleted successfully", + "error": "Failed to delete user" + }, + "emailInvite": { + "tab": "Email Invite", + "description": "Type or paste in emails below, separated by commas. Users will receive login credentials via email.", + "emails": "Email Addresses", + "emailsPlaceholder": "user1@example.com, user2@example.com", + "emailsRequired": "At least one email address is required", + "submit": "Send Invites", + "success": "user(s) invited successfully", + "partialSuccess": "Some invites failed", + "allFailed": "Failed to invite users", + "error": "Failed to send invites" + }, + "directInvite": { + "tab": "Direct Create" + }, + "inviteLinkTab": { + "tab": "Invite Link" + }, + "inviteLink": { + "description": "Generate a secure link that allows the user to set their own password", + "email": "Email Address", + "emailPlaceholder": "user@example.com (optional)", + "emailDescription": "Optional - leave blank for a general invite link that can be used by anyone", + "emailRequired": "Email address is required", + "emailOptional": "Optional - leave blank for a general invite link", + "emailRequiredForSend": "Email address is required to send email notification", + "expiryHours": "Expiry Hours", + "expiryDescription": "How many hours until the link expires", + "sendEmail": "Send invite link via email", + "sendEmailDescription": "If enabled, the invite link will be sent to the specified email address", + "smtpRequired": "SMTP not configured", + "generate": "Generate Link", + "generated": "Invite Link Generated", + "copied": "Link copied to clipboard", + "success": "Invite link generated successfully", + "successWithEmail": "Invite link generated and sent via email", + "emailFailed": "Invite link generated, but email failed", + "emailFailedDetails": "Error: {0}. Please share the invite link manually.", + "error": "Failed to generate invite link", + "submit": "Generate Invite Link" + }, + "inviteMode": { + "username": "Username", + "email": "Email", + "link": "Link", + "emailDisabled": "Email invites require SMTP configuration and mail.enableInvites=true in settings" + }, + "license": { + "users": "users", + "availableSlots": "Available Slots", + "grandfathered": "Grandfathered", + "grandfatheredShort": "{{count}} grandfathered", + "fromLicense": "from license", + "slotsAvailable": "{{count}} user slot(s) available", + "noSlotsAvailable": "No slots available", + "currentUsage": "Currently using {{current}} of {{max}} user licences" + } + }, + "teams": { + "title": "Teams", + "description": "Manage teams and organize workspace members", + "loading": "Loading teams...", + "loadingDetails": "Loading team details...", + "createNewTeam": "Create New Team", + "teamName": "Team Name", + "totalMembers": "Total Members", + "actions": "Actions", + "noTeamsFound": "No teams found", + "noMembers": "No members in this team", + "system": "System", + "addMember": "Add Member", + "viewTeam": "View Team", + "removeMember": "Remove from team", + "cannotRemoveFromSystemTeam": "Cannot remove from system team", + "renameTeamLabel": "Rename Team", + "deleteTeamLabel": "Delete Team", + "cannotDeleteInternal": "Cannot delete the Internal team", + "confirmDelete": "Are you sure you want to delete this team? This team must be empty to delete.", + "confirmRemove": "Remove user from this team?", + "cannotRenameInternal": "Cannot rename the Internal team", + "cannotAddToInternal": "Cannot add members to the Internal team", + "teamNotFound": "Team not found", + "backToTeams": "Back to Teams", + "memberCount": "{{count}} members", + "removeMemberSuccess": "User removed from team", + "removeMemberError": "Failed to remove user from team", + "createTeam": { + "title": "Create New Team", + "teamName": "Team Name", + "teamNamePlaceholder": "Enter team name", + "cancel": "Cancel", + "submit": "Create Team", + "nameRequired": "Team name is required", + "success": "Team created successfully", + "error": "Failed to create team" + }, + "renameTeam": { + "title": "Rename Team", + "renaming": "Renaming:", + "newTeamName": "New Team Name", + "newTeamNamePlaceholder": "Enter new team name", + "cancel": "Cancel", + "submit": "Rename Team", + "nameRequired": "Team name is required", + "success": "Team renamed successfully", + "error": "Failed to rename team" + }, + "deleteTeam": { + "success": "Team deleted successfully", + "error": "Failed to delete team. Make sure the team is empty.", + "teamMustBeEmpty": "Team must be empty before deletion" + }, + "addMemberToTeam": { + "title": "Add Member to Team", + "addingTo": "Adding to", + "selectUser": "Select User", + "selectUserPlaceholder": "Choose a user", + "selectUserRequired": "Please select a user", + "currentlyIn": "currently in", + "willBeMoved": "Note: This user will be moved from their current team to this team.", + "cancel": "Cancel", + "submit": "Add Member", + "userRequired": "Please select a user", + "success": "Member added to team successfully", + "error": "Failed to add member to team" + }, + "changeTeam": { + "label": "Change Team", + "title": "Change Team", + "changing": "Moving", + "selectTeam": "Select Team", + "selectTeamPlaceholder": "Choose a team", + "selectTeamRequired": "Please select a team", + "success": "Team changed successfully", + "error": "Failed to change team", + "submit": "Change Team" + } + } + }, + "plan": { + "currency": "Currency", + "popular": "Popular", + "current": "Current Plan", + "upgrade": "Upgrade", + "contact": "Contact Us", + "customPricing": "Custom", + "showComparison": "Compare All Features", + "hideComparison": "Hide Feature Comparison", + "featureComparison": "Feature Comparison", + "activePlan": { + "title": "Active Plan", + "subtitle": "Your current subscription details" + }, + "availablePlans": { + "title": "Available Plans", + "subtitle": "Choose the plan that fits your needs" + }, + "static": { + "title": "Billing Information", + "message": "Online billing is not currently configured. To upgrade your plan or manage subscriptions, please contact us directly.", + "contactSales": "Contact Sales", + "contactToUpgrade": "Contact us to upgrade or customize your plan", + "maxUsers": "Max Users", + "upTo": "Up to" + }, + "period": { + "month": "month" + }, + "free": { + "name": "Free", + "highlight1": "Limited Tool Usage Per week", + "highlight2": "Access to all tools", + "highlight3": "Community support" + }, + "pro": { + "name": "Pro", + "highlight1": "Unlimited Tool Usage", + "highlight2": "Advanced PDF tools", + "highlight3": "No watermarks" + }, + "enterprise": { + "name": "Enterprise", + "highlight1": "Custom pricing", + "highlight2": "Dedicated support", + "highlight3": "Latest features" + }, + "feature": { + "title": "Feature", + "pdfTools": "Basic PDF Tools", + "fileSize": "File Size Limit", + "automation": "Automate tool workflows", + "api": "API Access", + "priority": "Priority Support", + "customPricing": "Custom Pricing" + } + }, + "subscription": { + "status": { + "active": "Active", + "pastDue": "Past Due", + "canceled": "Canceled", + "incomplete": "Incomplete", + "trialing": "Trial", + "none": "No Subscription" + }, + "renewsOn": "Renews on {{date}}", + "cancelsOn": "Cancels on {{date}}" + }, + "billing": { + "manageBilling": "Manage Billing", + "portal": { + "error": "Failed to open billing portal" + } + }, + "payment": { + "preparing": "Preparing your checkout...", + "upgradeTitle": "Upgrade to {{planName}}", + "success": "Payment Successful!", + "successMessage": "Your subscription has been activated successfully. You will receive a confirmation email shortly.", + "autoClose": "This window will close automatically...", + "error": "Payment Error" + }, + "firstLogin": { + "title": "First Time Login", + "welcomeTitle": "Welcome!", + "welcomeMessage": "For security reasons, you must change your password on your first login.", + "loggedInAs": "Logged in as", + "error": "Error", + "currentPassword": "Current Password", + "enterCurrentPassword": "Enter your current password", + "newPassword": "New Password", + "enterNewPassword": "Enter new password (min 8 characters)", + "confirmPassword": "Confirm New Password", + "reEnterNewPassword": "Re-enter new password", + "changePassword": "Change Password", + "allFieldsRequired": "All fields are required", + "passwordsDoNotMatch": "New passwords do not match", + "passwordTooShort": "Password must be at least 8 characters", + "passwordMustBeDifferent": "New password must be different from current password", + "passwordChangedSuccess": "Password changed successfully! Please log in again.", + "passwordChangeFailed": "Failed to change password. Please check your current password." + }, + "invite": { + "welcome": "Welcome to Stirling PDF", + "invalidToken": "Invalid invitation link", + "validationError": "Failed to validate invitation link", + "passwordRequired": "Password is required", + "passwordTooShort": "Password must be at least 6 characters", + "passwordMismatch": "Passwords do not match", + "acceptError": "Failed to create account", + "validating": "Validating invitation...", + "invalidInvitation": "Invalid Invitation", + "goToLogin": "Go to Login", + "welcomeTitle": "You've been invited!", + "welcomeSubtitle": "Complete your account setup to get started", + "accountFor": "Creating account for", + "linkExpires": "Link expires", + "email": "Email address", + "emailPlaceholder": "Enter your email address", + "emailRequired": "Email address is required", + "invalidEmail": "Invalid email address", + "choosePassword": "Choose a password", + "passwordPlaceholder": "Enter your password", + "confirmPassword": "Confirm password", + "confirmPasswordPlaceholder": "Re-enter your password", + "createAccount": "Create Account", + "creating": "Creating Account...", + "alreadyHaveAccount": "Already have an account?", + "signIn": "Sign in" + }, + "audit": { + "error": { + "title": "Error loading audit system" + }, + "notAvailable": "Audit system not available", + "notAvailableMessage": "The audit system is not configured or not available.", + "disabled": "Audit logging is disabled", + "disabledMessage": "Enable audit logging in your application configuration to track system events.", + "systemStatus": { + "title": "System Status", + "status": "Audit Logging", + "enabled": "Enabled", + "disabled": "Disabled", + "level": "Audit Level", + "retention": "Retention Period", + "days": "days", + "totalEvents": "Total Events" + }, + "tabs": { + "dashboard": "Dashboard", + "events": "Audit Events", + "export": "Export" + }, + "charts": { + "title": "Audit Dashboard", + "error": "Error loading charts", + "day": "Day", + "week": "Week", + "month": "Month", + "byType": "Events by Type", + "byUser": "Events by User", + "overTime": "Events Over Time" + }, + "events": { + "title": "Audit Events", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "error": "Error loading events", + "noEvents": "No events found", + "timestamp": "Timestamp", + "type": "Type", + "user": "User", + "ipAddress": "IP Address", + "actions": "Actions", + "viewDetails": "View Details", + "eventDetails": "Event Details", + "details": "Details" + }, + "export": { + "title": "Export Audit Data", + "description": "Export audit events to CSV or JSON format. Use filters to limit the exported data.", + "format": "Export Format", + "filters": "Filters (Optional)", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "exportButton": "Export Data", + "error": "Failed to export data" + } + }, + "usage": { + "noData": "No data available", + "error": "Error loading usage statistics", + "noDataMessage": "No usage statistics are currently available.", + "controls": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All", + "refresh": "Refresh", + "dataTypeLabel": "Data Type:", + "dataType": { + "all": "All", + "api": "API", + "ui": "UI" + } + }, + "showing": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All" + }, + "stats": { + "totalEndpoints": "Total Endpoints", + "totalVisits": "Total Visits", + "showing": "Showing", + "selectedVisits": "Selected Visits" + }, + "chart": { + "title": "Endpoint Usage Chart" + }, + "table": { + "title": "Detailed Statistics", + "endpoint": "Endpoint", + "visits": "Visits", + "percentage": "Percentage", + "noData": "No data available" + } + }, + "backendHealth": { + "checking": "Checking backend status...", + "online": "Backend Online", + "offline": "Backend Offline" + }, + "autoRedact": { + "tags": "Verzwakken, Verbergen, Uitroepen, Gekleurd, Verborgen", + "title": "Automatisch censureren", + "header": "Automatisch censureren", + "colorLabel": "Kleur", + "textsToRedactLabel": "Tekst om te censureren (gescheiden door regels)", + "textsToRedactPlaceholder": "bijv.\\Vertrouwelijk \\nTopgeheim", + "useRegexLabel": "Gebruik regex", + "wholeWordSearchLabel": "Zoeken op hele woorden", + "customPaddingLabel": "Aangepaste extra ruimtevulling", + "convertPDFToImageLabel": "Converteer PDF naar PDF-afbeelding (wordt gebruikt om tekst achter het vak te verwijderen)", + "submitButton": "Indienen" + }, + "replaceColorPdf": { + "tags": "Kleur vervangen, pagina-acties, achterkant, serverzijde" } -} \ No newline at end of file +} diff --git a/frontend/public/locales/no-NB/translation.json b/frontend/public/locales/no-NB/translation.json index 65a297b87..354e13720 100644 --- a/frontend/public/locales/no-NB/translation.json +++ b/frontend/public/locales/no-NB/translation.json @@ -1,4 +1,40 @@ { + "toolPanel": { + "modePrompt": { + "title": "Choose how you browse tools", + "description": "Preview both layouts and decide how you want to explore Stirling PDF tools.", + "sidebarTitle": "Sidebar mode", + "sidebarDescription": "Keep tools alongside your workspace for quick switching.", + "recommended": "Recommended", + "chooseSidebar": "Use sidebar mode", + "fullscreenTitle": "Fullscreen mode - (legacy)", + "fullscreenDescription": "Browse every tool in a catalogue that covers the workspace until you pick one.", + "chooseFullscreen": "Use fullscreen mode", + "dismiss": "Maybe later" + }, + "fullscreen": { + "showDetails": "Show Details", + "comingSoon": "Coming soon:", + "favorite": "Add to favourites", + "favorites": "Favourites", + "heading": "All tools (fullscreen view)", + "noResults": "Try adjusting your search or toggle descriptions to find what you need.", + "recommended": "Recommended", + "unfavorite": "Remove from favourites" + }, + "placeholder": "Choose a tool to get started", + "toggle": { + "fullscreen": "Switch to fullscreen mode", + "sidebar": "Switch to sidebar mode" + } + }, + "unsavedChanges": "You have unsaved changes to your PDF.", + "areYouSure": "Are you sure you want to leave?", + "unsavedChangesTitle": "Unsaved Changes", + "keepWorking": "Keep Working", + "discardChanges": "Discard & Leave", + "applyAndContinue": "Save & Leave", + "exportAndContinue": "Export & Continue", "language": { "direction": "ltr" }, @@ -18,8 +54,26 @@ "customTextDesc": "Tilpasset Tekst", "numberPagesDesc": "Hvilke sider som skal nummereres, standard 'alle', aksepterer ogsÃĨ 1-5 eller 2,5,9 osv.", "customNumberDesc": "Standard til {n}, aksepterer ogsÃĨ 'Side {n} av {total}', 'Tekst-{n}', '{filnavn}-{n}", - "submit": "Legg til Sidetall" + "submit": "Legg til Sidetall", + "configuration": "Configuration", + "customize": "Customize Appearance", + "pagesAndStarting": "Pages & Starting Number", + "positionAndPages": "Position & Pages", + "error": { + "failed": "Add page numbers operation failed" + }, + "results": { + "title": "Page Number Results" + }, + "preview": "Position Selection", + "previewDisclaimer": "Preview is approximate. Final output may vary due to PDF font metrics." }, + "pageSelectionPrompt": "Tilpasset Sidevalg (Skriv inn en kommaseparert liste over sidetall 1,5,6 eller Funksjoner som 2n+1):", + "startingNumberTooltip": "The first number to display. Subsequent pages will increment from this number.", + "marginTooltip": "Distance between the page number and the edge of the page.", + "fontSizeTooltip": "Size of the page number text in points. Larger numbers create bigger text.", + "fontTypeTooltip": "Font family for the page numbers. Choose based on your document style.", + "customTextTooltip": "Optional custom format for page numbers. Use {n} as placeholder for the number. Example: \"Page {n}\" will show \"Page 1\", \"Page 2\", etc.", "pdfPrompt": "Velg PDF(er)", "multiPdfPrompt": "Velg PDF-filer (2+)", "multiPdfDropPrompt": "Velg (eller dra og slipp) alle PDF-ene du trenger", @@ -30,15 +84,41 @@ "uploadLimitExceededPlural": "are too large. Maximum allowed size is", "processTimeWarning": "Denne prosessen kan ta opptil ett minutt avhengig av filstørrelse", "pageOrderPrompt": "Tilpasset side rekkefølge (Skriv inn en kommaseparert liste over sidetall eller funksjoner som 2n+1):", - "pageSelectionPrompt": "Tilpasset Sidevalg (Skriv inn en kommaseparert liste over sidetall 1,5,6 eller Funksjoner som 2n+1):", "goToPage": "GÃĨ", "true": "Sann", "false": "Usann", "unknown": "Ukjent", + "app": { + "description": "The Free Adobe Acrobat alternative (10M+ Downloads)" + }, "save": "Lagre", "saveToBrowser": "Lagre til Nettleser", + "download": "Last ned", + "pin": "Pin File (keep active after tool run)", + "unpin": "Unpin File (replace after tool run)", + "undoOperationTooltip": "Click to undo the last operation and restore the original files", + "undo": "Angre", + "moreOptions": "More Options", + "editYourNewFiles": "Edit your new file(s)", "close": "Lukk", + "openInViewer": "Open in Viewer", + "confirmClose": "Confirm Close", + "confirmCloseMessage": "Are you sure you want to close this file?", + "confirmCloseCancel": "Cancel", + "confirmCloseConfirm": "Close File", + "fileSelected": "Selected: {{filename}}", + "chooseFile": "Choose File", "filesSelected": "filer valgt", + "files": { + "title": "Files", + "upload": "Upload", + "uploadFiles": "Upload Files", + "addFiles": "Add files", + "selectFromWorkbench": "Select files from the workbench or ", + "selectMultipleFromWorkbench": "Select at least {{count}} files from the workbench or ", + "created": "Created", + "size": "File Size" + }, "noFavourites": "Ingen favoritter lagt til", "downloadComplete": "Nedlasting Fullført", "bored": "Lei av ÃĨ vente?", @@ -56,7 +136,10 @@ }, "error": { "pdfPassword": "PDF-dokumentet er passordbeskyttet og enten ble passordet ikke oppgitt eller var feil", + "encryptedPdfMustRemovePassword": "This PDF is encrypted or password-protected. Please unlock it before converting to PDF/A.", + "incorrectPasswordProvided": "The PDF password is incorrect or not provided.", "_value": "Feil", + "dismissAllErrors": "Dismiss All Errors", "sorry": "Beklager for problemet!", "needHelp": "Trenger du hjelp / Har du funnet et problem?", "contactTip": "Hvis du fortsatt har problemer, ikke nøl med ÃĨ kontakte oss for hjelp. Du kan sende inn en billett pÃĨ vÃĨr GitHub-side eller kontakte oss via Discord:", @@ -71,6 +154,10 @@ "githubSubmit": "GitHub - Send inn en billett", "discordSubmit": "Discord - Send inn støtteinnlegg" }, + "warning": { + "tooltipTitle": "Warning" + }, + "edit": "Edit", "delete": "Slett", "username": "Brukernavn", "password": "Passord", @@ -82,6 +169,7 @@ "green": "Grønn", "blue": "BlÃĨ", "custom": "Tilpasset...", + "comingSoon": "Coming soon", "WorkInProgess": "Arbeid pÃĨgÃĨr, Kan vÃĻre feil eller buggy, Vennligst rapporter eventuelle problemer!", "poweredBy": "Drevet av", "yes": "Ja", @@ -115,12 +203,14 @@ "page": "Side", "pages": "Sider", "loading": "Laster...", + "review": "Review", "addToDoc": "Legg til i dokument", "reset": "Reset", "apply": "Apply", "noFileSelected": "No file selected. Please upload one.", "legal": { "privacy": "PersonvernerklÃĻring", + "iAgreeToThe": "I agree to all of the", "terms": "VilkÃĨr og betingelser", "accessibility": "Tilgjengelighet", "cookie": "Informasjonskapsler", @@ -160,6 +250,7 @@ "title": "Vill du gjøre Stirling PDF bedre?", "paragraph1": "Stirling PDF har valgfri analyse for ÃĨ hjelpe oss med ÃĨ forbedre produktet. Vi sporer ikke personlig informasjon eller filinnhold.", "paragraph2": "Vennligst vurder ÃĨ aktivere analyse for ÃĨ hjelpe Stirling-PDF ÃĨ vokse og for ÃĨ la oss forstÃĨ brukerne vÃĨre bedre.", + "learnMore": "Learn more", "enable": "Aktiver analyse", "disable": "Deaktiver analyse", "settings": "Du kan endre innstillingene for analyse i config/settings.yml filen" @@ -203,6 +294,54 @@ "cacheInputs": { "name": "Lagre skjemainput", "help": "Aktiver for ÃĨ lagre tidligere brukte input for fremtidige kjøringer" + }, + "general": { + "title": "General", + "description": "Configure general application preferences.", + "account": "Account", + "accountDescription": "Manage your account settings", + "user": "User", + "signedInAs": "Signed in as", + "logout": "Log out", + "enableFeatures": { + "title": "For System Administrators", + "intro": "Enable user authentication, team management, and workspace features for your organization.", + "action": "Configure", + "and": "and", + "benefit": "Enables user roles, team collaboration, admin controls, and enterprise features.", + "learnMore": "Learn more in documentation", + "dismiss": "Dismiss" + }, + "autoUnzip": "Auto-unzip API responses", + "autoUnzipDescription": "Automatically extract files from ZIP responses", + "autoUnzipTooltip": "Automatically extract ZIP files returned from API operations. Disable to keep ZIP files intact. This does not affect automation workflows.", + "autoUnzipFileLimit": "Auto-unzip file limit", + "autoUnzipFileLimitDescription": "Maximum number of files to extract from ZIP", + "autoUnzipFileLimitTooltip": "Only unzip if the ZIP contains this many files or fewer. Set higher to extract larger ZIPs.", + "defaultToolPickerMode": "Default tool picker mode", + "defaultToolPickerModeDescription": "Choose whether the tool picker opens in fullscreen or sidebar by default", + "mode": { + "fullscreen": "Fullscreen", + "sidebar": "Sidebar" + } + }, + "hotkeys": { + "title": "Keyboard Shortcuts", + "description": "Hover a tool to see its shortcut or customise it below. Click \"Change shortcut\" and press a new key combination. Press Esc to cancel.", + "errorModifier": { + "mac": "Include ⌘ (Command), âŒĨ (Option), or another modifier in your shortcut.", + "windows": "Include Ctrl, Alt, or another modifier in your shortcut." + }, + "errorConflict": "Shortcut already used by {{tool}}.", + "none": "Not assigned", + "customBadge": "Custom", + "defaultLabel": "Default: {{shortcut}}", + "capturing": "Press keysâ€Ļ (Esc to cancel)", + "change": "Change shortcut", + "reset": "Reset", + "shortcut": "Shortcut", + "noShortcut": "No shortcut set", + "searchPlaceholder": "Search tools..." } }, "changeCreds": { @@ -274,8 +413,10 @@ "top20": "Top 20", "all": "All", "refresh": "Refresh", - "includeHomepage": "Include Homepage ('/')", - "includeLoginPage": "Include Login Page ('/login')", + "dataTypeLabel": "Data Type:", + "dataTypeAll": "All", + "dataTypeApi": "API", + "dataTypeUi": "UI", "totalEndpoints": "Total Endpoints", "totalVisits": "Total Visits", "showing": "Showing", @@ -290,7 +431,9 @@ "top": "Top", "numberOfVisits": "Number of Visits", "visitsTooltip": "Visits: {0} ({1}% of total)", - "retry": "Retry" + "retry": "Retry", + "includeHomepage": "Include Homepage ('/')", + "includeLoginPage": "Include Login Page ('/login')" }, "database": { "title": "Database Import/Eksport", @@ -331,22 +474,310 @@ "alphabetical": "Alfabetisk", "globalPopularity": "Global Popularitet", "sortBy": "Sorter etter:", + "mobile": { + "brandAlt": "Stirling PDF logo", + "openFiles": "Open files", + "swipeHint": "Swipe left or right to switch views", + "tools": "Tools", + "toolsSlide": "Tool selection panel", + "viewSwitcher": "Switch workspace view", + "workbenchSlide": "Workspace panel", + "workspace": "Workspace" + }, "multiTool": { + "tags": "multiple,tools", "title": "PDF Multi Verktøy", "desc": "SlÃĨ sammen, roter, omorganiser og fjern sider" }, "merge": { + "tags": "combine,join,unite", "title": "SlÃĨ sammen", "desc": "SlÃĨ enkelt sammen flere PDF-er til Ên." }, "split": { + "tags": "divide,separate,break", "title": "Del opp", "desc": "Del PDF-er i flere dokumenter" }, "rotate": { + "tags": "turn,flip,orient", "title": "Roter", "desc": "Roter enkelt dine PDF-er." }, + "convert": { + "tags": "transform,change", + "title": "Konverter", + "desc": "Convert files between different formats" + }, + "pdfOrganiser": { + "tags": "organize,rearrange,reorder", + "title": "Organiser", + "desc": "Fjern/omorganiser sider i hvilken som helst rekkefølge" + }, + "addImage": { + "tags": "insert,embed,place", + "title": "Legg til bilde", + "desc": "Legger til et bilde pÃĨ en angitt plassering i PDF-en" + }, + "addAttachments": { + "tags": "embed,attach,include", + "title": "Add Attachments", + "desc": "Add or remove embedded files (attachments) to/from a PDF" + }, + "watermark": { + "tags": "stamp,mark,overlay", + "title": "Legg til Vannmerke", + "desc": "Legg til et tilpasset vannmerke i din PDF-dokument." + }, + "removePassword": { + "tags": "unlock", + "title": "Fjern Passord", + "desc": "Fjern passordbeskyttelse fra din PDF-dokument." + }, + "compress": { + "tags": "shrink,reduce,optimize", + "title": "Komprimer", + "desc": "Komprimer PDF-er for ÃĨ redusere filstørrelsen." + }, + "unlockPDFForms": { + "tags": "unlock,enable,edit", + "title": "Unlock PDF Forms", + "desc": "Remove read-only property of form fields in a PDF document." + }, + "changeMetadata": { + "tags": "edit,modify,update", + "title": "Endre Metadata", + "desc": "Endre/fjern/legg til metadata fra en PDF-dokument" + }, + "ocr": { + "tags": "extract,scan", + "title": "OCR / Rydd opp skanninger", + "desc": "Rydd opp skanninger og oppdag tekst fra bilder i en PDF og legg den til som tekst." + }, + "extractImages": { + "tags": "pull,save,export", + "title": "Ekstraher Bilder", + "desc": "Ekstraherer alle bilder fra en PDF og lagrer dem som zip" + }, + "scannerImageSplit": { + "tags": "detect,split,photos", + "title": "Detect & Split Scanned Photos", + "desc": "Detect and split scanned photos into separate pages" + }, + "sign": { + "tags": "signature,autograph", + "title": "Signer", + "desc": "Legger til signatur i PDF ved tegning, tekst eller bilde" + }, + "flatten": { + "tags": "simplify,remove,interactive", + "title": "Gjøre flat", + "desc": "Fjern alle interaktive elementer og skjemaer fra en PDF" + }, + "certSign": { + "tags": "authenticate,PEM,P12,official,encrypt,sign,certificate,PKCS12,JKS,server,manual,auto", + "title": "Signer med Sertifikat", + "desc": "Signer en PDF med et sertifikat/nøkkel (PEM/P12)" + }, + "repair": { + "tags": "fix,restore", + "title": "Reparer", + "desc": "Forsøker ÃĨ reparere en korrupt/ødelagt PDF" + }, + "removeBlanks": { + "tags": "delete,clean,empty", + "title": "Fjern Tomme sider", + "desc": "Oppdager og fjerner tomme sider fra et dokument" + }, + "removeAnnotations": { + "tags": "delete,clean,strip", + "title": "Fjern Anmerkninger", + "desc": "Fjerner alle kommentarer/anmerkninger fra en PDF" + }, + "compare": { + "tags": "difference", + "title": "Sammenlign", + "desc": "Sammenligner og viser forskjellene mellom to PDF-dokumenter" + }, + "removeCertSign": { + "tags": "remove,delete,unlock", + "title": "Fjern Sertifikatsignering", + "desc": "Fjern sertifikatsignatur fra PDF" + }, + "pageLayout": { + "tags": "layout,arrange,combine", + "title": "Flersidig Layout", + "desc": "SlÃĨ sammen flere sider av en PDF-dokument til en enkelt side" + }, + "bookletImposition": { + "tags": "booklet,print,binding", + "title": "Booklet Imposition", + "desc": "Create booklets with proper page ordering and multi-page layout for printing and binding" + }, + "scalePages": { + "tags": "resize,adjust,scale", + "title": "Juster sidestørrelse/skala", + "desc": "Endre størrelsen/skalaen til en side og/eller dens innhold." + }, + "addPageNumbers": { + "tags": "number,pagination,count", + "title": "Legg til Sidetall", + "desc": "Legg til sidetall gjennom et dokument pÃĨ en angitt plassering" + }, + "autoRename": { + "tags": "auto-detect,header-based,organize,relabel", + "title": "Auto Rename PDF File", + "desc": "Auto renames a PDF file based on its detected header" + }, + "adjustContrast": { + "tags": "contrast,brightness,saturation", + "title": "Juster Farger/Kontrast", + "desc": "Juster kontrast, metning og lysstyrke i en PDF" + }, + "crop": { + "tags": "trim,cut,resize", + "title": "BeskjÃĻre PDF", + "desc": "BeskjÃĻre en PDF for ÃĨ redusere størrelsen (beholder tekst!)" + }, + "autoSplitPDF": { + "tags": "auto,split,QR", + "title": "Auto Del Sider", + "desc": "Auto Del Skannet PDF med fysisk skannet sidesplitter QR-kode" + }, + "sanitize": { + "tags": "clean,purge,remove", + "title": "Sanitise", + "desc": "Remove potentially harmful elements from PDF files" + }, + "getPdfInfo": { + "tags": "info,metadata,details", + "title": "FÃĨ ALL informasjon om PDF", + "desc": "Fanger opp all tilgjengelig informasjon om PDF-er" + }, + "pdfToSinglePage": { + "tags": "combine,merge,single", + "title": "PDF til Enkelt Stor Side", + "desc": "SlÃĨr sammen alle PDF-sider til en stor enkeltside" + }, + "showJS": { + "tags": "javascript,code,script", + "title": "Vis Javascript", + "desc": "Søker og viser eventuelle JS injisert i en PDF" + }, + "redact": { + "tags": "censor,blackout,hide", + "title": "Manuell Sensurering", + "desc": "Sensurerer en PDF basert pÃĨ valgt tekst, tegnede former og/eller valgte side(r)" + }, + "splitBySections": { + "tags": "split,sections,divide", + "title": "Split PDF by Sections", + "desc": "Divide each page of a PDF into smaller horizontal and vertical sections" + }, + "addStamp": { + "tags": "stamp,mark,seal", + "title": "Add Stamp to PDF", + "desc": "Add text or add image stamps at set locations" + }, + "removeImage": { + "tags": "remove,delete,clean", + "title": "Fjern bilde", + "desc": "Fjern bilde fra PDF for ÃĨ redusere filstørrelsen" + }, + "splitByChapters": { + "tags": "split,chapters,structure", + "title": "Split PDF by Chapters", + "desc": "Split a PDF into multiple files based on its chapter structure." + }, + "validateSignature": { + "tags": "validate,verify,certificate", + "title": "Valider PDF-signatur", + "desc": "Verifiser digitale signaturer og sertifikater i PDF-dokumenter" + }, + "swagger": { + "tags": "API,documentation,test", + "title": "API Documentation", + "desc": "View API documentation and test endpoints" + }, + "scannerEffect": { + "tags": "scan,simulate,create", + "title": "Scanner Effect", + "desc": "Create a PDF that looks like it was scanned" + }, + "editTableOfContents": { + "tags": "bookmarks,contents,edit", + "title": "Edit Table of Contents", + "desc": "Add or edit bookmarks and table of contents in PDF documents" + }, + "manageCertificates": { + "tags": "certificates,import,export", + "title": "Manage Certificates", + "desc": "Import, export, or delete digital certificate files used for signing PDFs." + }, + "read": { + "tags": "view,open,display", + "title": "Read", + "desc": "View and annotate PDFs. Highlight text, draw, or insert comments for review and collaboration." + }, + "reorganizePages": { + "tags": "rearrange,reorder,organize", + "title": "Reorganize Pages", + "desc": "Rearrange, duplicate, or delete PDF pages with visual drag-and-drop control." + }, + "extractPages": { + "tags": "pull,select,copy", + "title": "Trekk ut Sider", + "desc": "Extract specific pages from a PDF document" + }, + "removePages": { + "tags": "delete,extract,exclude", + "title": "Fjern", + "desc": "Slett uønskede sider fra din PDF-dokument." + }, + "autoSizeSplitPDF": { + "tags": "auto,split,size", + "title": "Auto Del etter Størrelse/Antall", + "desc": "Del en enkelt PDF i flere dokumenter basert pÃĨ størrelse, antall sider eller dokumenter" + }, + "replaceColor": { + "title": "Replace & Invert Colour", + "desc": "Replace or invert colours in PDF documents" + }, + "devApi": { + "tags": "API,development,documentation", + "title": "API", + "desc": "Link to API documentation" + }, + "devFolderScanning": { + "tags": "automation,folder,scanning", + "title": "Automated Folder Scanning", + "desc": "Link to automated folder scanning guide" + }, + "devSsoGuide": { + "title": "SSO Guide", + "desc": "Link to SSO guide" + }, + "devAirgapped": { + "title": "Air-gapped Setup", + "desc": "Link to air-gapped setup guide" + }, + "addPassword": { + "title": "Legg til Passord", + "desc": "Krypter din PDF-dokument med et passord." + }, + "changePermissions": { + "title": "Endre tillatelser", + "desc": "Change document restrictions and permissions" + }, + "automate": { + "tags": "workflow,sequence,automation", + "title": "Automate", + "desc": "Build multi-step workflows by chaining together PDF actions. Ideal for recurring tasks." + }, + "overlay-pdfs": { + "desc": "Legger PDF-er over hverandre", + "title": "Overlay PDF-er" + }, "imageToPDF": { "title": "Bilde til PDF", "desc": "Konverter et bilde (PNG, JPEG, GIF) til PDF." @@ -355,18 +786,6 @@ "title": "PDF til Bilde", "desc": "Konverter en PDF til et bilde. (PNG, JPEG, GIF)" }, - "pdfOrganiser": { - "title": "Organiser", - "desc": "Fjern/omorganiser sider i hvilken som helst rekkefølge" - }, - "addImage": { - "title": "Legg til bilde", - "desc": "Legger til et bilde pÃĨ en angitt plassering i PDF-en" - }, - "watermark": { - "title": "Legg til Vannmerke", - "desc": "Legg til et tilpasset vannmerke i din PDF-dokument." - }, "permissions": { "title": "Endre Tillatelser", "desc": "Endre tillatelsene til din PDF-dokument" @@ -375,38 +794,10 @@ "title": "Fjern", "desc": "Slett uønskede sider fra din PDF-dokument." }, - "addPassword": { - "title": "Legg til Passord", - "desc": "Krypter din PDF-dokument med et passord." - }, - "removePassword": { - "title": "Fjern Passord", - "desc": "Fjern passordbeskyttelse fra din PDF-dokument." - }, - "compress": { - "title": "Komprimer", - "desc": "Komprimer PDF-er for ÃĨ redusere filstørrelsen." - }, - "unlockPDFForms": { - "title": "Unlock PDF Forms", - "desc": "Remove read-only property of form fields in a PDF document." - }, - "changeMetadata": { - "title": "Endre Metadata", - "desc": "Endre/fjern/legg til metadata fra en PDF-dokument" - }, "fileToPDF": { "title": "Konverter fil til PDF", "desc": "Konverter nesten hvilken som helst fil til PDF (DOCX, PNG, XLS, PPT, TXT og mer)" }, - "ocr": { - "title": "OCR / Rydd opp skanninger", - "desc": "Rydd opp skanninger og oppdag tekst fra bilder i en PDF og legg den til som tekst." - }, - "extractImages": { - "title": "Ekstraher Bilder", - "desc": "Ekstraherer alle bilder fra en PDF og lagrer dem som zip" - }, "pdfToPDFA": { "title": "PDF til PDF/A", "desc": "Konverter PDF til PDF/A for langtidslagring" @@ -435,70 +826,14 @@ "title": "Oppdag/Del Skannede bilder", "desc": "Deler flere bilder fra et bilde/PDF" }, - "sign": { - "title": "Signer", - "desc": "Legger til signatur i PDF ved tegning, tekst eller bilde" - }, - "flatten": { - "title": "Gjøre flat", - "desc": "Fjern alle interaktive elementer og skjemaer fra en PDF" - }, - "repair": { - "title": "Reparer", - "desc": "Forsøker ÃĨ reparere en korrupt/ødelagt PDF" - }, - "removeBlanks": { - "title": "Fjern Tomme sider", - "desc": "Oppdager og fjerner tomme sider fra et dokument" - }, - "removeAnnotations": { - "title": "Fjern Anmerkninger", - "desc": "Fjerner alle kommentarer/anmerkninger fra en PDF" - }, - "compare": { - "title": "Sammenlign", - "desc": "Sammenligner og viser forskjellene mellom to PDF-dokumenter" - }, - "certSign": { - "title": "Signer med Sertifikat", - "desc": "Signer en PDF med et sertifikat/nøkkel (PEM/P12)" - }, - "removeCertSign": { - "title": "Fjern Sertifikatsignering", - "desc": "Fjern sertifikatsignatur fra PDF" - }, - "pageLayout": { - "title": "Flersidig Layout", - "desc": "SlÃĨ sammen flere sider av en PDF-dokument til en enkelt side" - }, - "scalePages": { - "title": "Juster sidestørrelse/skala", - "desc": "Endre størrelsen/skalaen til en side og/eller dens innhold." - }, "pipeline": { "title": "Pipeline (Avansert)", "desc": "Utfør flere handlinger pÃĨ PDF-er ved ÃĨ definere pipelineskripter" }, - "addPageNumbers": { - "title": "Legg til Sidetall", - "desc": "Legg til sidetall gjennom et dokument pÃĨ en angitt plassering" - }, "auto-rename": { "title": "Auto Omdøp PDF Fil", "desc": "Omdøper automatisk en PDF-fil basert pÃĨ dens oppdagede overskrift" }, - "adjustContrast": { - "title": "Juster Farger/Kontrast", - "desc": "Juster kontrast, metning og lysstyrke i en PDF" - }, - "crop": { - "title": "BeskjÃĻre PDF", - "desc": "BeskjÃĻre en PDF for ÃĨ redusere størrelsen (beholder tekst!)" - }, - "autoSplitPDF": { - "title": "Auto Del Sider", - "desc": "Auto Del Skannet PDF med fysisk skannet sidesplitter QR-kode" - }, "sanitizePDF": { "title": "Sanitiser", "desc": "Fjern skript og andre elementer fra PDF-filer" @@ -519,30 +854,14 @@ "title": "PDF to Markdown", "desc": "Converts any PDF to Markdown" }, - "getPdfInfo": { - "title": "FÃĨ ALL informasjon om PDF", - "desc": "Fanger opp all tilgjengelig informasjon om PDF-er" - }, "pageExtracter": { "title": "Ekstraher side(r)", "desc": "Ekstraher valgte sider fra PDF" }, - "pdfToSinglePage": { - "title": "PDF til Enkelt Stor Side", - "desc": "SlÃĨr sammen alle PDF-sider til en stor enkeltside" - }, - "showJS": { - "title": "Vis Javascript", - "desc": "Søker og viser eventuelle JS injisert i en PDF" - }, "autoRedact": { "title": "Automatisk Sensurering", "desc": "Automatisk sensurering (sverter ut) tekst i en PDF basert pÃĨ inntastet tekst" }, - "redact": { - "title": "Manuell Sensurering", - "desc": "Sensurerer en PDF basert pÃĨ valgt tekst, tegnede former og/eller valgte side(r)" - }, "PDFToCSV": { "title": "PDF til CSV", "desc": "Ekstraherer tabeller fra en PDF og konverterer dem til CSV" @@ -551,10 +870,6 @@ "title": "Auto Del etter Størrelse/Antall", "desc": "Del en enkelt PDF i flere dokumenter basert pÃĨ størrelse, antall sider eller dokumenter" }, - "overlay-pdfs": { - "title": "Overlay PDF-er", - "desc": "Legger PDF-er over hverandre" - }, "split-by-sections": { "title": "Del PDF etter Seksjoner", "desc": "Del hver side av en PDF i mindre horisontale og vertikale seksjoner" @@ -563,43 +878,17 @@ "title": "Legg til Stempel i PDF", "desc": "Legg til tekst eller bilde stempler pÃĨ angitte steder" }, - "removeImage": { - "title": "Fjern bilde", - "desc": "Fjern bilde fra PDF for ÃĨ redusere filstørrelsen" - }, - "splitByChapters": { - "title": "Split PDF by Chapters", - "desc": "Split a PDF into multiple files based on its chapter structure." - }, - "validateSignature": { - "title": "Valider PDF-signatur", - "desc": "Verifiser digitale signaturer og sertifikater i PDF-dokumenter" - }, "replace-color": { "title": "Erstatt og Inverter Farge", "desc": "Erstatt farge for tekst og bakgrunn i PDF og inverter full farge av pdf for ÃĨ redusere filstørrelsen" }, - "convert": { - "title": "Konverter" - }, "attachments": { "title": "Add attachments" }, - "extractPages": { - "title": "Trekk ut Sider" - }, - "removePages": { - "title": "Fjern", - "desc": "Slett uønskede sider fra din PDF-dokument." - }, "removeImagePdf": { "title": "Fjern bilde", "desc": "Fjern bilde fra PDF for ÃĨ redusere filstørrelsen" }, - "autoSizeSplitPDF": { - "title": "Auto Del etter Størrelse/Antall", - "desc": "Del en enkelt PDF i flere dokumenter basert pÃĨ størrelse, antall sider eller dokumenter" - }, "adjust-contrast": { "title": "Juster Farger/Kontrast", "desc": "Juster kontrast, metning og lysstyrke i en PDF" @@ -607,11 +896,12 @@ "replaceColorPdf": { "title": "Erstatt og Inverter Farge", "desc": "Erstatt farge for tekst og bakgrunn i PDF og inverter full farge av pdf for ÃĨ redusere filstørrelsen" - }, - "changePermissions": { - "title": "Endre tillatelser" } }, + "landing": { + "addFiles": "Add Files", + "uploadFromComputer": "Upload from computer" + }, "viewPdf": { "tags": "vis,les,annoter,tekst,bilde", "title": "View/Edit PDF", @@ -645,17 +935,39 @@ "merge": { "tags": "sammenslÃĨing,sideoperasjoner,backend,serverside", "title": "SlÃĨ sammen", + "removeDigitalSignature": { + "label": "Remove digital signature in the merged file?", + "tooltip": { + "title": "Remove Digital Signature", + "description": "Digital signatures will be invalidated when merging files. Check this to remove them from the final merged PDF." + } + }, + "generateTableOfContents": { + "label": "Generate table of contents in the merged file?", + "tooltip": { + "title": "Generate Table of Contents", + "description": "Automatically creates a clickable table of contents in the merged PDF based on the original file names and page numbers." + } + }, + "submit": "SlÃĨ sammen", + "sortBy": { + "description": "Files will be merged in the order they're selected. Drag to reorder or sort below.", + "label": "Sort By", + "filename": "Fil navn", + "dateModified": "Date Modified", + "ascending": "Ascending", + "descending": "Descending", + "sort": "Sort" + }, + "error": { + "failed": "An error occurred while merging the PDFs." + }, "header": "SlÃĨ sammen flere PDF-er (2+)", "sortByName": "Sorter etter navn", "sortByDate": "Sorter etter dato", - "removeCertSign": "Fjern digital signatur i den sammenslÃĨtte filen?", - "submit": "SlÃĨ sammen", - "sortBy": { - "filename": "Fil navn" - } + "removeCertSign": "Fjern digital signatur i den sammenslÃĨtte filen?" }, "split": { - "tags": "sideoperasjoner,del,flersidig,kutt,serverside", "title": "Del PDF", "header": "Del PDF", "desc": { @@ -671,25 +983,249 @@ "splitPages": "Skriv inn sidene som skal deles pÃĨ:", "submit": "Del", "steps": { + "chooseMethod": "Choose Method", "settings": "Innstillinger" }, + "settings": { + "selectMethodFirst": "Please select a split method first" + }, + "error": { + "failed": "An error occurred while splitting the PDF." + }, + "method": { + "label": "Choose split method", + "placeholder": "Select how to split the PDF" + }, "methods": { + "prefix": { + "splitAt": "Split at", + "splitBy": "Split by" + }, + "byPages": { + "name": "Page Numbers", + "desc": "Extract specific pages (1,3,5-10)", + "tooltip": "Enter page numbers separated by commas or ranges with hyphens" + }, + "bySections": { + "name": "Sections", + "desc": "Divide pages into grid sections", + "tooltip": "Split each page into horizontal and vertical sections" + }, "bySize": { - "name": "Filstørrelse" + "name": "Filstørrelse", + "desc": "Limit maximum file size", + "tooltip": "Specify maximum file size (e.g. 10MB, 500KB)" + }, + "byPageCount": { + "name": "Page Count", + "desc": "Fixed pages per file", + "tooltip": "Enter the number of pages for each split file" + }, + "byDocCount": { + "name": "Document Count", + "desc": "Create specific number of files", + "tooltip": "Enter how many files you want to create" + }, + "byChapters": { + "name": "Chapters", + "desc": "Split at bookmark boundaries", + "tooltip": "Uses PDF bookmarks to determine split points" + }, + "byPageDivider": { + "name": "Page Divider", + "desc": "Auto-split with divider sheets", + "tooltip": "Use QR code divider sheets between documents when scanning" } }, "value": { "fileSize": { - "label": "Filstørrelse" + "label": "Filstørrelse", + "placeholder": "e.g. 10MB, 500KB" + }, + "pageCount": { + "label": "Pages per File", + "placeholder": "e.g. 5, 10" + }, + "docCount": { + "label": "Number of Files", + "placeholder": "e.g. 3, 5" } - } + }, + "tooltip": { + "header": { + "title": "Split Methods Overview" + }, + "byPages": { + "title": "Split at Page Numbers", + "text": "Split your PDF at specific page numbers. Using 'n' splits after page n. Using 'n-m' splits before page n and after page m.", + "bullet1": "Single split points: 3,7 (splits after pages 3 and 7)", + "bullet2": "Range split points: 3-8 (splits before page 3 and after page 8)", + "bullet3": "Mixed: 2,5-10,15 (splits after page 2, before page 5, after page 10, and after page 15)" + }, + "bySections": { + "title": "Split by Grid Sections", + "text": "Divide each page into a grid of sections. Useful for splitting documents with multiple columns or extracting specific areas.", + "bullet1": "Horizontal: Number of rows to create", + "bullet2": "Vertical: Number of columns to create", + "bullet3": "Merge: Combine all sections into one PDF" + }, + "bySize": { + "title": "Split by File Size", + "text": "Create multiple PDFs that don't exceed a specified file size. Ideal for file size limitations or email attachments.", + "bullet1": "Use MB for larger files (e.g., 10MB)", + "bullet2": "Use KB for smaller files (e.g., 500KB)", + "bullet3": "System will split at page boundaries" + }, + "byCount": { + "title": "Split by Count", + "text": "Create multiple PDFs with a specific number of pages or documents each.", + "bullet1": "Page Count: Fixed number of pages per file", + "bullet2": "Document Count: Fixed number of output files", + "bullet3": "Useful for batch processing workflows" + }, + "byChapters": { + "title": "Split by Chapters", + "text": "Use PDF bookmarks to automatically split at chapter boundaries. Requires PDFs with bookmark structure.", + "bullet1": "Bookmark Level: Which level to split on (1=top level)", + "bullet2": "Include Metadata: Preserve document properties", + "bullet3": "Allow Duplicates: Handle repeated bookmark names" + }, + "byDocCount": { + "bullet1": "Enter the number of output files you want", + "bullet2": "Pages are distributed as evenly as possible", + "bullet3": "Useful when you need a specific number of files", + "text": "Create a specific number of output files by evenly distributing pages across them.", + "title": "Split by Document Count" + }, + "byPageCount": { + "bullet1": "Enter the number of pages per output file", + "bullet2": "Last file may have fewer pages if not evenly divisible", + "bullet3": "Useful for batch processing workflows", + "text": "Create multiple PDFs with a specific number of pages each. Perfect for creating uniform document chunks.", + "title": "Split by Page Count" + }, + "byPageDivider": { + "bullet1": "Print divider sheets from the download link", + "bullet2": "Insert divider sheets between your documents", + "bullet3": "Scan all documents together as one PDF", + "bullet4": "Upload - divider pages are automatically detected and removed", + "bullet5": "Enable Duplex Mode if scanning both sides of divider sheets", + "text": "Automatically split scanned documents using physical divider sheets with QR codes. Perfect for processing multiple documents scanned together.", + "title": "Split by Page Divider" + } + }, + "methodSelection": { + "tooltip": { + "bullet1": "Click on a method card to select it", + "bullet2": "Hover over each card to see a quick description", + "bullet3": "The settings step will appear after you select a method", + "bullet4": "You can change methods at any time before processing", + "header": { + "text": "Choose how you want to split your PDF document. Each method is optimized for different use cases and document types.", + "title": "Split Method Selection" + }, + "title": "Choose Your Split Method" + } + }, + "selectMethod": "Select a split method", + "tags": "sideoperasjoner,del,flersidig,kutt,serverside" }, "rotate": { - "tags": "serverside", "title": "Roter PDF", + "submit": "Roter", + "selectRotation": "Select Rotation Angle (Clockwise)", + "error": { + "failed": "An error occurred while rotating the PDF." + }, + "preview": { + "title": "Rotation Preview" + }, + "rotateLeft": "Rotate Anticlockwise", + "rotateRight": "Rotate Clockwise", + "tooltip": { + "header": { + "title": "Rotate Settings Overview" + }, + "description": { + "text": "Rotate your PDF pages clockwise or anticlockwise in 90-degree increments. All pages in the PDF will be rotated. The preview shows how your document will look after rotation." + }, + "controls": { + "title": "Controls", + "text": "Use the rotation buttons to adjust orientation. Left button rotates anticlockwise, right button rotates clockwise. Each click rotates by 90 degrees." + } + }, + "tags": "serverside", "header": "Roter PDF", - "selectAngle": "Velg rotasjonsvinkel (i multipler av 90 grader):", - "submit": "Roter" + "selectAngle": "Velg rotasjonsvinkel (i multipler av 90 grader):" + }, + "convert": { + "title": "Konverter", + "desc": "Convert files between different formats", + "files": "Files", + "selectFilesPlaceholder": "Select files in the main view to get started", + "settings": "Innstillinger", + "conversionCompleted": "Conversion completed", + "results": "Results", + "defaultFilename": "converted_file", + "conversionResults": "Conversion Results", + "convertFrom": "Convert from", + "convertTo": "Convert to", + "sourceFormatPlaceholder": "Source format", + "targetFormatPlaceholder": "Target format", + "selectSourceFormatFirst": "Select a source format first", + "outputOptions": "Output Options", + "pdfOptions": "PDF Options", + "imageOptions": "Image Options", + "colorType": "Colour Type", + "color": "Farge", + "greyscale": "GrÃĨtone", + "blackwhite": "Black & White", + "dpi": "DPI", + "output": "Output", + "single": "Single", + "multiple": "Multiple", + "fitOption": "Fit Option", + "maintainAspectRatio": "Maintain Aspect Ratio", + "fitDocumentToPage": "Fit Document to Page", + "fillPage": "Fyll side", + "autoRotate": "Auto Rotate", + "autoRotateDescription": "Automatically rotate images to better fit the PDF page", + "combineImages": "Combine Images", + "combineImagesDescription": "Combine all images into one PDF, or create separate PDFs for each image", + "webOptions": "Web to PDF Options", + "zoomLevel": "Zoom Level", + "emailOptions": "Email to PDF Options", + "includeAttachments": "Include email attachments", + "maxAttachmentSize": "Maximum attachment size (MB)", + "includeAllRecipients": "Include CC and BCC recipients in header", + "downloadHtml": "Download HTML intermediate file instead of PDF", + "pdfaOptions": "PDF/A Options", + "outputFormat": "Output Format", + "pdfaNote": "PDF/A-1b is more compatible, PDF/A-2b supports more features.", + "pdfaDigitalSignatureWarning": "PDFen inneholder en digital signatur. Denne vil bli fjernet i neste steg.", + "fileFormat": "File Format", + "wordDoc": "Word Document", + "wordDocExt": "Word Document (.docx)", + "odtExt": "OpenDocument Text (.odt)", + "pptExt": "PowerPoint (.pptx)", + "odpExt": "OpenDocument Presentation (.odp)", + "txtExt": "Plain Text (.txt)", + "rtfExt": "Rich Text Format (.rtf)", + "selectedFiles": "Selected files", + "noFileSelected": "No file selected. Use the file panel to add files.", + "convertFiles": "Convert Files", + "converting": "Converting...", + "downloadConverted": "Download Converted File", + "errorNoFiles": "Please select at least one file to convert.", + "errorNoFormat": "Please select both source and target formats.", + "errorNotSupported": "Conversion from {{from}} to {{to}} is not supported.", + "images": "Images", + "officeDocs": "Office Documents (Word, Excel, PowerPoint)", + "imagesExt": "Images (JPG, PNG, etc.)", + "markdown": "Markdown", + "textRtf": "Text/RTF", + "grayscale": "GrÃĨtone", + "errorConversion": "An error occurred while converting the file." }, "imageToPdf": { "tags": "konvertering,bilde,jpg,foto" @@ -727,7 +1263,33 @@ "8": "Fjern sist", "9": "Fjern først og sist", "10": "Partall-Oddetall SammenslÃĨing", - "11": "Duplicate all pages" + "11": "Duplicate all pages", + "desc": { + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, â€Ļ).", + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, â€Ļ).", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimized for binding on the side)." + } + }, + "desc": { + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, â€Ļ).", + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, â€Ļ).", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimised for binding on the side).", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document." }, "placeholder": "(f.eks. 1,3,2 eller 4-8,2,10-12 eller 2n-1)" }, @@ -739,9 +1301,198 @@ "upload": "Legg til bilde", "submit": "Legg til bilde" }, + "attachments": { + "tags": "embed,attach,file,attachment,attachments", + "title": "Add attachments", + "header": "Add attachments", + "add": "Add Attachment", + "remove": "Remove Attachment", + "embed": "Embed Attachment", + "submit": "Add attachments" + }, "watermark": { - "tags": "tekst,gjentakende,etikett,egen,opphavsrett,varemerke,bilde,jpg,foto", "title": "Legg til vannmerke", + "desc": "Add text or image watermarks to PDF files", + "completed": "Watermark added", + "submit": "Legg til vannmerke", + "filenamePrefix": "watermarked", + "error": { + "failed": "An error occurred while adding watermark to the PDF." + }, + "watermarkType": { + "text": "Tekst", + "image": "Image" + }, + "settings": { + "type": "Watermark Type", + "text": { + "label": "Watermark Text", + "placeholder": "Enter watermark text" + }, + "image": { + "label": "Watermark Image", + "choose": "Choose Image", + "selected": "Selected: {{filename}}" + }, + "fontSize": "Skriftstørrelse", + "size": "Size", + "alphabet": "Font/Language", + "color": "Watermark Colour", + "rotation": "Rotation (degrees)", + "opacity": "Opacity (%)", + "spacing": { + "horizontal": "Horizontal Spacing", + "vertical": "Vertical Spacing", + "height": "Height Spacing", + "width": "Width Spacing" + }, + "convertToImage": "Flatten PDF pages to images" + }, + "alphabet": { + "roman": "Roman/Latin", + "arabic": "Arabic", + "japanese": "Japanese", + "korean": "Korean", + "chinese": "Chinese", + "thai": "Thai" + }, + "steps": { + "type": "Watermark Type", + "wording": "Wording", + "textStyle": "Style", + "formatting": "Formatting", + "file": "Watermark File" + }, + "results": { + "title": "Watermark Results" + }, + "tooltip": { + "language": { + "title": "Language Support", + "text": "Choose the appropriate language setting to ensure proper font rendering for your text." + }, + "appearance": { + "title": "Appearance Settings", + "text": "Control how your watermark looks and blends with the document.", + "bullet1": "Rotation: -360° to 360° for angled watermarks", + "bullet2": "Opacity: 0-100% for transparency control", + "bullet3": "Lower opacity creates subtle watermarks" + }, + "spacing": { + "title": "Spacing Control", + "text": "Adjust the spacing between repeated watermarks across the page.", + "bullet1": "Width spacing: Horizontal distance between watermarks", + "bullet2": "Height spacing: Vertical distance between watermarks", + "bullet3": "Higher values create more spread out patterns" + }, + "type": { + "header": { + "title": "Watermark Type Selection" + }, + "description": { + "title": "Choose Your Watermark", + "text": "Select between text or image watermarks based on your needs." + }, + "text": { + "title": "Text Watermarks", + "text": "Perfect for adding copyright notices, company names, or confidentiality labels. Supports multiple languages and custom colours.", + "bullet1": "Customisable fonts and languages", + "bullet2": "Adjustable colours and transparency", + "bullet3": "Ideal for legal or branding text" + }, + "image": { + "title": "Image Watermarks", + "text": "Use logos, stamps, or any image as a watermark. Great for branding and visual identification.", + "bullet1": "Upload any image format", + "bullet2": "Maintains image quality", + "bullet3": "Perfect for logos and stamps" + } + }, + "wording": { + "header": { + "title": "Text Content" + }, + "text": { + "title": "Watermark Text", + "text": "Enter the text that will appear as your watermark across the document.", + "bullet1": "Keep it concise for better readability", + "bullet2": "Common examples: 'CONFIDENTIAL', 'DRAFT', company name", + "bullet3": "Emoji characters are not supported and will be filtered out" + } + }, + "textStyle": { + "header": { + "title": "Text Style" + }, + "color": { + "title": "Colour Selection", + "text": "Choose a colour that provides good contrast with your document content.", + "bullet1": "Light grey (#d3d3d3) for subtle watermarks", + "bullet2": "Black or dark colours for high contrast", + "bullet3": "Custom colours for branding purposes" + }, + "language": { + "title": "Language Support", + "text": "Choose the appropriate language setting to ensure proper font rendering." + } + }, + "file": { + "header": { + "title": "Image Upload" + }, + "upload": { + "title": "Image Selection", + "text": "Upload an image file to use as your watermark.", + "bullet1": "Supports common formats: PNG, JPG, GIF, BMP", + "bullet2": "PNG with transparency works best", + "bullet3": "Higher resolution images maintain quality better" + }, + "recommendations": { + "title": "Best Practices", + "text": "Tips for optimal image watermark results.", + "bullet1": "Use logos or stamps with transparent backgrounds", + "bullet2": "Simple designs work better than complex images", + "bullet3": "Consider the final document size when choosing resolution" + } + }, + "formatting": { + "header": { + "title": "Formatting & Layout" + }, + "size": { + "title": "Size Control", + "text": "Adjust the size of your watermark (text or image).", + "bullet1": "Larger sizes create more prominent watermarks" + }, + "appearance": { + "title": "Appearance Settings", + "text": "Control how your watermark looks and blends with the document.", + "bullet1": "Rotation: -360° to 360° for angled watermarks", + "bullet2": "Opacity: 0-100% for transparency control", + "bullet3": "Lower opacity creates subtle watermarks" + }, + "spacing": { + "title": "Spacing Control", + "text": "Adjust the spacing between repeated watermarks across the page.", + "bullet1": "Horizontal spacing: Distance between watermarks left to right", + "bullet2": "Vertical spacing: Distance between watermarks top to bottom", + "bullet3": "Higher values create more spread out patterns" + }, + "security": { + "title": "Security Option", + "text": "Convert the final PDF to an image-based format for enhanced security.", + "bullet1": "Prevents text selection and copying", + "bullet2": "Makes watermarks harder to remove", + "bullet3": "Results in larger file sizes", + "bullet4": "Best for sensitive or copyrighted content" + } + } + }, + "type": { + "1": "Tekst", + "2": "Bilde" + }, + "tags": "tekst,gjentakende,etikett,egen,opphavsrett,varemerke,bilde,jpg,foto", "header": "Legg til vannmerke", "customColor": "Tilpasset Tekstfarge", "selectText": { @@ -755,17 +1506,6 @@ "8": "Vannmerketype:", "9": "Vannmerkebilde:", "10": "Konverter PDF til PDF-Bilde" - }, - "submit": "Legg til vannmerke", - "type": { - "1": "Tekst", - "2": "Bilde" - }, - "watermarkType": { - "text": "Tekst" - }, - "settings": { - "fontSize": "Skriftstørrelse" } }, "permissions": { @@ -790,50 +1530,201 @@ "removePages": { "tags": "fjern sider,slett sider", "title": "Fjern", + "pageNumbers": { + "label": "Pages to Remove", + "placeholder": "e.g., 1,3,5-8,10", + "error": "Invalid page number format. Use numbers, ranges (1-5), or mathematical expressions (2n+1)" + }, + "filenamePrefix": "pages_removed", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "settings": { + "title": "Settings" + }, + "tooltip": { + "header": { + "title": "Remove Pages Settings" + }, + "pageNumbers": { + "title": "Page Selection", + "text": "Specify which pages to remove from your PDF. You can select individual pages, ranges, or use mathematical expressions.", + "bullet1": "Individual pages: 1,3,5 (removes pages 1, 3, and 5)", + "bullet2": "Page ranges: 1-5,10-15 (removes pages 1-5 and 10-15)", + "bullet3": "Mathematical: 2n+1 (removes odd pages)", + "bullet4": "Open ranges: 5- (removes from page 5 to end)" + }, + "examples": { + "title": "Common Examples", + "text": "Here are some common page selection patterns:", + "bullet1": "Remove first page: 1", + "bullet2": "Remove last 3 pages: -3", + "bullet3": "Remove every other page: 2n", + "bullet4": "Remove specific scattered pages: 1,5,10,15" + }, + "safety": { + "title": "Safety Tips", + "text": "Important considerations when removing pages:", + "bullet1": "Always preview your selection before processing", + "bullet2": "Keep a backup of your original file", + "bullet3": "Page numbers start from 1, not 0", + "bullet4": "Invalid page numbers will be ignored" + } + }, + "error": { + "failed": "An error occurred whilst removing pages." + }, + "results": { + "title": "Page Removal Results" + }, "submit": "Fjern" }, - "addPassword": { - "tags": "sikker,trygghet", - "title": "Legg til passord", - "header": "Legg til passord (Krypter)", - "selectText": { - "1": "Velg PDF-fil for kryptering", - "2": "Brukerpassord", - "3": "Krypteringsnøkkellengde", - "4": "Høyere verdier er sterkere, men lavere verdier har bedre kompatibilitet.", - "5": "Tillatelser ÃĨ sette (Anbefales ÃĨ brukes sammen med eierpassord)", - "6": "Forhindre sammenstilling av dokumentet", - "7": "Forhindre innholdsekstraksjon", - "8": "Forhindre ekstraksjon for tilgjengelighet", - "9": "Forhindre utfylling av skjema", - "10": "Forhindre modifisering", - "11": "Forhindre annotasjonsmodifisering", - "12": "Forhindre utskrift", - "13": "Forhindre utskrift i ulike formater", - "14": "Eierpassord", - "15": "Begrenser hva som kan gjøres med dokumentet nÃĨr det er ÃĨpnet (Støttes ikke av alle leserprogrammer)", - "16": "Begrenser ÃĨpningen av dokumentet selv" + "extractPages": { + "title": "Extract Pages", + "pageNumbers": { + "label": "Pages to Extract", + "placeholder": "e.g., 1,3,5-8 or odd & 1-10" + }, + "settings": { + "title": "Settings" }, - "submit": "Krypter", "tooltip": { - "permissions": { - "title": "Endre tillatelser" + "description": "Extracts the selected pages into a new PDF, preserving order." + }, + "error": { + "failed": "Failed to extract pages" + }, + "results": { + "title": "Pages Extracted" + }, + "submit": "Extract Pages" + }, + "pageSelection": { + "tooltip": { + "header": { + "title": "Page Selection Guide" + }, + "basic": { + "title": "Basic Usage", + "text": "Select specific pages from your PDF document using simple syntax.", + "bullet1": "Individual pages: 1,3,5", + "bullet2": "Page ranges: 3-6 or 10-15", + "bullet3": "All pages: all" + }, + "advanced": { + "title": "Advanced Features" + }, + "tips": { + "title": "Tips", + "text": "Keep these guidelines in mind:", + "bullet1": "Page numbers start from 1 (not 0)", + "bullet2": "Spaces are automatically removed", + "bullet3": "Invalid expressions are ignored" + }, + "syntax": { + "title": "Syntax Basics", + "text": "Use numbers, ranges, keywords, and progressions (n starts at 0). Parentheses are supported.", + "bullets": { + "numbers": "Numbers/ranges: 5, 10-20", + "keywords": "Keywords: odd, even", + "progressions": "Progressions: 3n, 4n+1" + } + }, + "operators": { + "title": "Operators", + "text": "AND has higher precedence than comma. NOT applies within the document range.", + "and": "AND: & or \"and\" — require both conditions (e.g., 1-50 & even)", + "comma": "Comma: , or | — combine selections (e.g., 1-10, 20)", + "not": "NOT: ! or \"not\" — exclude pages (e.g., 3n & not 30)" + }, + "examples": { + "title": "Examples" + }, + "complex": { + "bullet1": "1,3-5,8,2n → pages 1, 3–5, 8, plus evens", + "bullet2": "10-,2n-1 → from page 10 to end + odd pages", + "description": "Mix different types.", + "title": "Complex Combinations" + }, + "description": "Choose which pages to use for the operation. Supports single pages, ranges, formulas, and the all keyword.", + "individual": { + "bullet1": "1,3,5 → selects pages 1, 3, 5", + "bullet2": "2,7,12 → selects pages 2, 7, 12", + "description": "Enter numbers separated by commas.", + "title": "Individual Pages" + }, + "mathematical": { + "bullet1": "2n → all even pages (2, 4, 6â€Ļ)", + "bullet2": "2n-1 → all odd pages (1, 3, 5â€Ļ)", + "bullet3": "3n → every 3rd page (3, 6, 9â€Ļ)", + "bullet4": "4n-1 → pages 3, 7, 11, 15â€Ļ", + "description": "Use n in formulas for patterns.", + "title": "Mathematical Functions" + }, + "ranges": { + "bullet1": "3-6 → selects pages 3–6", + "bullet2": "10-15 → selects pages 10–15", + "bullet3": "5- → selects pages 5 to end", + "description": "Use - for consecutive pages.", + "title": "Page Ranges" + }, + "special": { + "bullet1": "all → selects all pages", + "title": "Special Keywords" } } }, - "removePassword": { - "tags": "sikker,dekrypter,trygghet,upassord,slett passord", - "title": "Fjern passord", - "header": "Fjern passord (Dekrypter)", - "selectText": { - "1": "Velg PDF for ÃĨ dekryptere", - "2": "Passord" + "bulkSelection": { + "syntaxError": "There is a syntax issue. See Page Selection tips for help.", + "header": { + "title": "Page Selection Guide" }, - "submit": "Fjern", - "desc": "Fjern passordbeskyttelse fra din PDF-dokument.", - "password": { - "stepTitle": "Fjern Passord", - "label": "NÃĨvÃĻrende Passord" + "syntax": { + "title": "Syntax Basics", + "text": "Use numbers, ranges, keywords, and progressions (n starts at 0). Parentheses are supported.", + "bullets": { + "numbers": "Numbers/ranges: 5, 10-20", + "keywords": "Keywords: odd, even", + "progressions": "Progressions: 3n, 4n+1" + } + }, + "operators": { + "title": "Operators", + "text": "AND has higher precedence than comma. NOT applies within the document range.", + "and": "AND: & or \"and\" — require both conditions (e.g., 1-50 & even)", + "comma": "Comma: , or | — combine selections (e.g., 1-10, 20)", + "not": "NOT: ! or \"not\" — exclude pages (e.g., 3n & not 30)" + }, + "examples": { + "title": "Examples", + "first50": "First 50", + "last50": "Last 50", + "every3rd": "Every 3rd", + "oddWithinExcluding": "Odd within 1-20 excluding 5-7", + "combineSets": "Combine sets" + }, + "firstNPages": { + "title": "First N Pages", + "placeholder": "Number of pages" + }, + "lastNPages": { + "title": "Last N Pages", + "placeholder": "Number of pages" + }, + "everyNthPage": { + "title": "Every Nth Page", + "placeholder": "Step size" + }, + "range": { + "title": "Range", + "fromPlaceholder": "From", + "toPlaceholder": "To" + }, + "keywords": { + "title": "Keywords" + }, + "advanced": { + "title": "Advanced" } }, "compressPdfs": { @@ -843,12 +1734,142 @@ "tags": "remove,delete,form,field,readonly", "title": "Remove Read-Only from Form Fields", "header": "Unlock PDF Forms", - "submit": "Remove" + "submit": "Remove", + "description": "This tool will remove read-only restrictions from PDF form fields, making them editable and fillable.", + "filenamePrefix": "unlocked_forms", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst unlocking PDF forms." + }, + "results": { + "title": "Unlocked Forms Results" + } }, "changeMetadata": { - "tags": "title,forfatter,dato,opprettelse,tidsstempel,utgiver,produsent,statistikk", - "title": "Endre metadata", "header": "Endre metadata", + "submit": "Endre", + "filenamePrefix": "metadata", + "settings": { + "title": "Metadata Settings" + }, + "standardFields": { + "title": "Standard Fields" + }, + "deleteAll": { + "label": "Remove Existing Metadata", + "checkbox": "Delete all metadata" + }, + "title": { + "label": "Title", + "placeholder": "Document title" + }, + "author": { + "label": "Author", + "placeholder": "Document author" + }, + "subject": { + "label": "Subject", + "placeholder": "Document subject" + }, + "keywords": { + "label": "Keywords", + "placeholder": "Document keywords" + }, + "creator": { + "label": "Creator", + "placeholder": "Document creator" + }, + "producer": { + "label": "Producer", + "placeholder": "Document producer" + }, + "dates": { + "title": "Date Fields" + }, + "creationDate": { + "label": "Creation Date", + "placeholder": "Creation date" + }, + "modificationDate": { + "label": "Modification Date", + "placeholder": "Modification date" + }, + "trapped": { + "label": "Trapped Status", + "unknown": "Unknown", + "true": "True", + "false": "False" + }, + "advanced": { + "title": "Advanced Options" + }, + "customFields": { + "title": "Custom Metadata", + "description": "Add custom metadata fields to the document", + "add": "Add Field", + "key": "Key", + "keyPlaceholder": "Custom key", + "value": "Value", + "valuePlaceholder": "Custom value", + "remove": "Remove" + }, + "results": { + "title": "Updated PDFs" + }, + "error": { + "failed": "An error occurred while changing the PDF metadata." + }, + "tooltip": { + "header": { + "title": "PDF Metadata Overview" + }, + "standardFields": { + "title": "Standard Fields", + "text": "Common PDF metadata fields that describe the document.", + "bullet1": "Title: Document name or heading", + "bullet2": "Author: Person who created the document", + "bullet3": "Subject: Brief description of content", + "bullet4": "Keywords: Search terms for the document", + "bullet5": "Creator/Producer: Software used to create the PDF" + }, + "dates": { + "title": "Date Fields", + "text": "When the document was created and modified.", + "bullet1": "Creation Date: When original document was made", + "bullet2": "Modification Date: When last changed" + }, + "options": { + "title": "Additional Options", + "text": "Custom fields and privacy controls.", + "bullet1": "Custom Metadata: Add your own key-value pairs", + "bullet2": "Trapped Status: High-quality printing setting", + "bullet3": "Delete All: Remove all metadata for privacy" + }, + "deleteAll": { + "title": "Remove Existing Metadata", + "text": "Complete metadata deletion to ensure privacy." + }, + "customFields": { + "title": "Custom Metadata", + "text": "Add your own custom key-value metadata pairs.", + "bullet1": "Add any custom fields relevant to your document", + "bullet2": "Examples: Department, Project, Version, Status", + "bullet3": "Both key and value are required for each entry" + }, + "advanced": { + "title": "Advanced Options", + "trapped": { + "title": "Trapped Status", + "description": "Indicates if document is prepared for high-quality printing.", + "bullet1": "True: Document has been trapped for printing", + "bullet2": "False: Document has not been trapped", + "bullet3": "Unknown: Trapped status is not specified" + } + } + }, + "tags": "title,forfatter,dato,opprettelse,tidsstempel,utgiver,produsent,statistikk", "selectText": { "1": "Vennligst rediger variablene du ønsker ÃĨ endre", "2": "Slett all metadata", @@ -856,15 +1877,7 @@ "4": "Annen metadata:", "5": "Legg til tilpasset metadataoppføring" }, - "author": "Forfatter:", - "creationDate": "Opprettelsesdato (ÃĨÃĨÃĨÃĨ/MM/dd HH:mm:ss):", - "creator": "Oppretter:", - "keywords": "Nøkkelord:", - "modDate": "Endringsdato (ÃĨÃĨÃĨÃĨ/MM/dd HH:mm:ss):", - "producer": "Produsent:", - "subject": "Emne:", - "trapped": "Fanget:", - "submit": "Endre" + "modDate": "Endringsdato (ÃĨÃĨÃĨÃĨ/MM/dd HH:mm:ss):" }, "fileToPDF": { "tags": "transformasjon,format,dokument,bilde,slide,tekst,konvertering,office,dokumenter,word,excel,powerpoint", @@ -878,6 +1891,7 @@ "ocr": { "tags": "gjenkjenning,tekst,bilde,skann,les,identifisere,deteksjon,redigerbar", "title": "OCR / Rens av skanning", + "desc": "Rydd opp skanninger og oppdag tekst fra bilder i en PDF og legg den til som tekst.", "header": "Rens av skanning / OCR (Optisk tegngjenkjenning)", "selectText": { "1": "Velg sprÃĨk som skal oppdages innenfor PDF-en (De oppførte er de som for øyeblikket er oppdaget):", @@ -896,23 +1910,89 @@ "help": "Vennligst les denne dokumentasjonen for hvordan du bruker dette for andre sprÃĨk og/eller bruk utenfor Docker.", "credit": "Denne tjenesten bruker qpdf og Tesseract for OCR.", "submit": "Behandle PDF med OCR", - "desc": "Rydd opp skanninger og oppdag tekst fra bilder i en PDF og legg den til som tekst.", + "operation": { + "submit": "Process OCR and Review" + }, + "results": { + "title": "OCR Results" + }, + "languagePicker": { + "additionalLanguages": "Looking for additional languages?", + "viewSetupGuide": "View setup guide →" + }, "settings": { "title": "Innstillinger", "ocrMode": { - "label": "OCR-modus" + "label": "OCR-modus", + "auto": "Auto (skip text layers)", + "force": "Force (re-OCR all, replace text)", + "strict": "Strict (abort if text found)" }, "languages": { - "label": "SprÃĨk" + "label": "SprÃĨk", + "placeholder": "Select languages" + }, + "compatibilityMode": { + "label": "Compatibility Mode" + }, + "advancedOptions": { + "label": "Processing Options", + "sidecar": "Create a text file", + "deskew": "Deskew pages", + "clean": "Clean input file", + "cleanFinal": "Clean final output" } }, "tooltip": { + "header": { + "title": "OCR Settings Overview" + }, "mode": { - "title": "OCR-modus" + "title": "OCR-modus", + "text": "Optical Character Recognition (OCR) helps you turn scanned or screenshotted pages into text you can search, copy, or highlight.", + "bullet1": "Auto skips pages that already contain text layers.", + "bullet2": "Force re-OCRs every page and replaces all the text.", + "bullet3": "Strict halts if any selectable text is found." }, "languages": { - "title": "SprÃĨk" + "title": "SprÃĨk", + "text": "Improve OCR accuracy by specifying the expected languages. Choose one or more languages to guide detection." + }, + "output": { + "title": "Output", + "text": "Decide how you want the text output formatted:", + "bullet1": "Searchable PDF embeds text behind the original image.", + "bullet2": "HOCR XML returns a structured machine-readable file.", + "bullet3": "Plain-text sidecar creates a separate .txt file with raw content." + }, + "advanced": { + "header": { + "title": "Advanced OCR Processing" + }, + "compatibility": { + "title": "Compatibility Mode", + "text": "Uses OCR 'sandwich PDF' mode: results in larger files, but more reliable with certain languages and older PDF software. By default we use hOCR for smaller, modern PDFs." + }, + "sidecar": { + "title": "Create Text File", + "text": "Generates a separate .txt file alongside the PDF containing all extracted text content for easy access and processing." + }, + "deskew": { + "title": "Deskew Pages", + "text": "Automatically corrects skewed or tilted pages to improve OCR accuracy. Useful for scanned documents that weren't perfectly aligned." + }, + "clean": { + "title": "Clean Input File", + "text": "Preprocesses the input by removing noise, enhancing contrast, and optimising the image for better OCR recognition before processing." + }, + "cleanFinal": { + "title": "Clean Final Output", + "text": "Post-processes the final PDF by removing OCR artefacts and optimising the text layer for better readability and smaller file size." + } } + }, + "error": { + "failed": "OCR operation failed" } }, "extractImages": { @@ -921,7 +2001,13 @@ "header": "Hent ut bilder", "selectText": "Velg bildeformat for ÃĨ konvertere de hentede bildene til", "allowDuplicates": "Save duplicate images", - "submit": "Hent ut" + "submit": "Hent ut", + "settings": { + "title": "Settings" + }, + "error": { + "failed": "An error occurred while extracting images from the PDF." + } }, "pdfToPDFA": { "tags": "arkiv,langtidslagring,standard,konvertering,lagring,bevaring", @@ -993,17 +2079,53 @@ }, "info": "Python er ikke installert. Det er pÃĨkrevd for ÃĨ kjøre." }, + "scannerImageSplit": { + "title": "Extracted Images", + "submit": "Extract Image Scans", + "error": { + "failed": "An error occurred while extracting image scans." + }, + "tooltip": { + "title": "Photo Splitter", + "whatThisDoes": "What this does", + "whatThisDoesDesc": "Automatically finds and extracts each photo from a scanned page or composite image—no manual cropping.", + "whenToUse": "When to use", + "useCase1": "Scan whole album pages in one go", + "useCase2": "Split flatbed batches into separate files", + "useCase3": "Break collages into individual photos", + "useCase4": "Pull photos from documents", + "quickFixes": "Quick fixes", + "problem1": "Photos not detected → increase Tolerance to 30-50", + "problem2": "Too many false detections → increase Minimum Area to 15,000-20,000", + "problem3": "Crops are too tight → increase Border Size to 5-10", + "problem4": "Tilted photos not straightened → lower Angle Threshold to ~5°", + "problem5": "Dust/noise boxes → increase Minimum Contour Area to 1000-2000", + "setupTips": "Setup tips", + "tip1": "Use a plain, light background", + "tip2": "Leave a small gap (≈1 cm) between photos", + "tip3": "Scan at 300-600 DPI", + "tip4": "Clean the scanner glass", + "headsUp": "Heads-up", + "headsUpDesc": "Overlapping photos or backgrounds very close in colour to the photos can reduce accuracy-try a lighter or darker background and leave more space." + } + }, "sign": { - "tags": "autorisere,initialer,tegnet signatur,tekst signatur,bildesignatur", "title": "Signer", "header": "Signer PDF-er", "upload": "Last opp bilde", - "draw": "Tegn signatur", - "text": "Tekstinput", + "draw": { + "title": "Draw your signature", + "clear": "Clear" + }, + "text": { + "name": "Signer Name", + "placeholder": "Enter your full name" + }, "clear": "Slett", "add": "Legg til", "saved": "Lagrede signaturer", "save": "Lagre signatur", + "applySignatures": "Apply Signatures", "personalSigs": "Personlige signaturer", "sharedSigs": "Delte signaturer", "noSavedSigs": "Ingen lagrede signaturer funnet", @@ -1015,42 +2137,179 @@ "previous": "Forrige side", "maintainRatio": "Bytt behold sideforhold", "undo": "Angre", - "redo": "Gjør om" + "redo": "Gjør om", + "submit": "Sign Document", + "steps": { + "configure": "Configure Signature" + }, + "type": { + "title": "Signature Type", + "draw": "Draw", + "canvas": "Canvas", + "image": "Image", + "text": "Text" + }, + "image": { + "label": "Upload signature image", + "placeholder": "Select image file", + "hint": "Upload a PNG or JPG image of your signature" + }, + "instructions": { + "title": "How to add signature", + "canvas": "After drawing your signature in the canvas, close the modal then click anywhere on the PDF to place it.", + "image": "After uploading your signature image above, click anywhere on the PDF to place it.", + "text": "After entering your name above, click anywhere on the PDF to place your signature." + }, + "mode": { + "move": "Move Signature", + "place": "Place Signature" + }, + "updateAndPlace": "Update and Place", + "activate": "Activate Signature Placement", + "deactivate": "Stop Placing Signatures", + "results": { + "title": "Signature Results" + }, + "error": { + "failed": "An error occurred while signing the PDF." + }, + "tags": "autorisere,initialer,tegnet signatur,tekst signatur,bildesignatur" }, "flatten": { - "tags": "statisk,deaktiver,ikke-interaktiv,strømlinjeformet", "title": "Utjevning", "header": "Utjevning av PDf", "flattenOnlyForms": "Utjevning av kun skjemaer", "submit": "Utjevn", + "filenamePrefix": "flattened", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, "steps": { "settings": "Innstillinger" }, "options": { - "flattenOnlyForms": "Utjevning av kun skjemaer" - } + "stepTitle": "Flatten Options", + "title": "Flatten Options", + "flattenOnlyForms": { + "label": "Utjevning av kun skjemaer", + "desc": "Only flatten form fields, leaving other interactive elements intact" + }, + "note": "Flattening removes interactive elements from the PDF, making them non-editable." + }, + "results": { + "title": "Flatten Results" + }, + "error": { + "failed": "An error occurred while flattening the PDF." + }, + "tooltip": { + "header": { + "title": "About Flattening PDFs" + }, + "description": { + "title": "What does flattening do?", + "text": "Flattening makes your PDF non-editable by turning fillable forms and buttons into regular text and images. The PDF will look exactly the same, but no one can change or fill in the forms anymore. Perfect for sharing completed forms, creating final documents for records, or ensuring the PDF looks the same everywhere.", + "bullet1": "Text boxes become regular text (can't be edited)", + "bullet2": "Checkboxes and buttons become pictures", + "bullet3": "Great for final versions you don't want changed", + "bullet4": "Ensures consistent appearance across all devices" + }, + "formsOnly": { + "title": "What does 'Flatten only forms' mean?", + "text": "This option only removes the ability to fill in forms, but keeps other features working like clicking links, viewing bookmarks, and reading comments.", + "bullet1": "Forms become non-editable", + "bullet2": "Links still work when clicked", + "bullet3": "Comments and notes remain visible", + "bullet4": "Bookmarks still help you navigate" + } + }, + "tags": "statisk,deaktiver,ikke-interaktiv,strømlinjeformet" }, "repair": { "tags": "fiks,gjenopprett,korreksjon,gjenoppretting", "title": "Reparer", "header": "Reparer PDF-er", - "submit": "Reparer" + "submit": "Reparer", + "description": "This tool will attempt to repair corrupted or damaged PDF files. No additional settings are required.", + "filenamePrefix": "repaired", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst repairing the PDF." + }, + "results": { + "title": "Repair Results" + } }, "removeBlanks": { - "tags": "rydde opp,strømlinjeformet,ingen-innhold,organisere", "title": "Fjern Blank Sider", "header": "Fjern Blank Sider", - "threshold": "Pixel Hvithetsgrense:", + "settings": { + "title": "Settings" + }, + "threshold": { + "label": "Pixel Whiteness Threshold" + }, + "whitePercent": { + "label": "White Percentage Threshold", + "unit": "%" + }, + "includeBlankPages": { + "label": "Include detected blank pages" + }, + "tooltip": { + "header": { + "title": "Remove Blank Pages Settings" + }, + "threshold": { + "title": "Pixel Whiteness Threshold", + "text": "Controls how white a pixel must be to be considered 'white'. This helps determine what counts as a blank area on the page.", + "bullet1": "0 = Pure black (most restrictive)", + "bullet2": "128 = Medium grey", + "bullet3": "255 = Pure white (least restrictive)" + }, + "whitePercent": { + "title": "White Percentage Threshold", + "text": "Sets the minimum percentage of white pixels required for a page to be considered blank and removed.", + "bullet1": "Lower values (e.g., 80%) = More pages removed", + "bullet2": "Higher values (e.g., 95%) = Only very blank pages removed", + "bullet3": "Use higher values for documents with light backgrounds" + }, + "includeBlankPages": { + "title": "Include Detected Blank Pages", + "text": "When enabled, creates a separate PDF containing all the blank pages that were detected and removed from the original document.", + "bullet1": "Useful for reviewing what was removed", + "bullet2": "Helps verify the detection accuracy", + "bullet3": "Can be disabled to reduce output file size" + } + }, + "submit": "Fjern Blank Sider", + "error": { + "failed": "Failed to remove blank pages" + }, + "results": { + "title": "Removed Blank Pages" + }, + "tags": "rydde opp,strømlinjeformet,ingen-innhold,organisere", "thresholdDesc": "Grense for ÃĨ bestemme hvor hvit en hvit piksel mÃĨ vÃĻre for ÃĨ klassifiseres som 'Hvit'. 0 = Svart, 255 = Ren hvit.", - "whitePercent": "Hvit Prosent (%):", - "whitePercentDesc": "Prosent av siden som mÃĨ vÃĻre 'hvite' piksler for ÃĨ fjernes", - "submit": "Fjern Blank Sider" + "whitePercentDesc": "Prosent av siden som mÃĨ vÃĻre 'hvite' piksler for ÃĨ fjernes" }, "removeAnnotations": { "tags": "kommentarer,utheving,notater,markering,fjern", "title": "Fjern Anmerkninger", "header": "Fjern Anmerkninger", - "submit": "Fjern" + "submit": "Fjern", + "settings": { + "title": "Settings" + }, + "info": { + "title": "About Remove Annotations", + "description": "This tool will remove all annotations (comments, highlights, notes, etc.) from your PDF documents." + }, + "error": { + "failed": "An error occurred while removing annotations from the PDF." + } }, "compare": { "tags": "differensiere,kontrast,endringer,analyse", @@ -1082,6 +2341,142 @@ "certSign": { "tags": "autentisere,PEM,P12,offisiell,krypter", "title": "Sertifikatsignering", + "filenamePrefix": "signed", + "signMode": { + "stepTitle": "Sign Mode", + "tooltip": { + "header": { + "title": "About PDF Signatures" + }, + "overview": { + "title": "How signatures work", + "text": "Both modes seal the document (any edits are flagged as tampering) and record who/when/how for auditing. Viewer trust depends on the certificate chain." + }, + "manual": { + "title": "Manual - Bring your certificate", + "text": "Use your own certificate files for brand-aligned identity. Can display Trusted when your CA/chain is recognised.", + "use": "Use for: customer-facing, legal, compliance." + }, + "auto": { + "title": "Auto - Zero-setup, instant system seal", + "text": "Signs with a server self-signed certificate. Same tamper-evident seal and audit trail; typically shows Unverified in viewers.", + "use": "Use when: you need speed and consistent internal identity across reviews and records." + }, + "rule": { + "title": "Rule of thumb", + "text": "Need recipient Trusted status? Manual. Need a fast, tamper-evident seal and audit trail with no setup? Auto." + } + } + }, + "certTypeStep": { + "stepTitle": "Certificate Format" + }, + "certFiles": { + "stepTitle": "Certificate Files" + }, + "appearance": { + "stepTitle": "Signature Appearance", + "tooltip": { + "header": { + "title": "About Signature Appearance" + }, + "invisible": { + "title": "Invisible Signatures", + "text": "The signature is added to the PDF for security but won't be visible when viewing the document. Perfect for legal requirements without changing the document's appearance.", + "bullet1": "Provides security without visual changes", + "bullet2": "Meets legal requirements for digital signing", + "bullet3": "Doesn't affect document layout or design" + }, + "visible": { + "title": "Visible Signatures", + "text": "Shows a signature block on the PDF with your name, date, and optional details. Useful when you want readers to clearly see the document is signed.", + "bullet1": "Shows signer name and date on the document", + "bullet2": "Can include reason and location for signing", + "bullet3": "Choose which page to place the signature", + "bullet4": "Optional logo can be included" + } + }, + "invisible": "Invisible", + "options": { + "title": "Signature Details" + }, + "visible": "Visible" + }, + "sign": { + "submit": "Sign PDF", + "results": "Signed PDF" + }, + "error": { + "failed": "An error occurred whilst processing signatures." + }, + "tooltip": { + "header": { + "title": "About Managing Signatures" + }, + "overview": { + "title": "What can this tool do?", + "text": "This tool lets you check if your PDFs are digitally signed and add new digital signatures. Digital signatures prove who created or approved a document and show if it has been changed since signing.", + "bullet1": "Check existing signatures and their validity", + "bullet2": "View detailed information about signers and certificates", + "bullet3": "Add new digital signatures to secure your documents", + "bullet4": "Multiple files supported with easy navigation" + }, + "validation": { + "title": "Checking Signatures", + "text": "When you check signatures, the tool tells you if they're valid, who signed the document, when it was signed, and whether the document has been changed since signing.", + "bullet1": "Shows if signatures are valid or invalid", + "bullet2": "Displays signer information and signing date", + "bullet3": "Checks if the document was modified after signing", + "bullet4": "Can use custom certificates for verification" + }, + "signing": { + "title": "Adding Signatures", + "text": "To sign a PDF, you need a digital certificate (like PEM, PKCS12, or JKS). You can choose to make the signature visible on the document or keep it invisible for security only.", + "bullet1": "Supports PEM, PKCS12, JKS, and server certificate formats", + "bullet2": "Option to show or hide signature on the PDF", + "bullet3": "Add reason, location, and signer name", + "bullet4": "Choose which page to place visible signatures", + "bullet5": "Use server certificate for simple 'Sign with Stirling-PDF' option" + } + }, + "certType": { + "tooltip": { + "header": { + "title": "About Certificate Types" + }, + "what": { + "title": "What's a certificate?", + "text": "It's a secure ID for your signature that proves you signed. Unless you're required to sign via certificate, we recommend using another secure method like Type, Draw, or Upload." + }, + "which": { + "title": "Which option should I use?", + "text": "Choose the format that matches your certificate file:", + "bullet1": "PKCS#12 (.p12 / .pfx) – one combined file (most common)", + "bullet2": "PFX (.pfx) – Microsoft's version of PKCS12", + "bullet3": "PEM – separate private-key and certificate .pem files", + "bullet4": "JKS – Java .jks keystore for dev / CI-CD workflows" + }, + "convert": { + "title": "Key not listed?", + "text": "Convert your file to a Java keystore (.jks) with keytool, then pick JKS." + } + } + }, + "chooseCertificate": "Choose Certificate File", + "chooseJksFile": "Choose JKS File", + "chooseP12File": "Choose PKCS12 File", + "choosePfxFile": "Choose PFX File", + "choosePrivateKey": "Choose Private Key File", + "location": "Sted", + "logoTitle": "Logo", + "name": "Navn", + "noLogo": "No Logo", + "pageNumber": "Page Number", + "password": "Skriv inn passordet for keystore eller privat nøkkel (hvis noen):", + "passwordOptional": "Leave empty if no password", + "reason": "Årsak", + "serverCertMessage": "Using server certificate - no files or password required", + "showLogo": "Show Logo", "header": "Signer en PDF med sertifikatet ditt (Arbeid pÃĨgÃĨr)", "selectPDF": "Velg en PDF-fil for signering:", "jksNote": "Merk: Hvis sertifikattypen din ikke er oppført nedenfor, vennligst konverter den til en Java-keystore (.jks) fil ved ÃĨ bruke kommandolinjeverktøyet keytool. Deretter velger du .jks-fil-alternativet nedenfor.", @@ -1089,13 +2484,7 @@ "selectCert": "Velg din sertifikatfil (X.509-format, kan vÃĻre .pem eller .der):", "selectP12": "Velg din PKCS#12-keystore-fil (.p12 eller .pfx) (Valgfritt, hvis angitt, bør den inneholde din private nøkkel og sertifikat):", "selectJKS": "Velg din Java-keystore-fil (.jks eller .keystore):", - "certType": "Sertifikattype", - "password": "Skriv inn passordet for keystore eller privat nøkkel (hvis noen):", "showSig": "Vis signatur", - "reason": "Årsak", - "location": "Sted", - "name": "Navn", - "showLogo": "Show Logo", "submit": "Signer PDF" }, "removeCertSign": { @@ -1103,7 +2492,18 @@ "title": "Fjern Sertifikatsignatur", "header": "Fjern det digitale sertifikatet fra PDF-en", "selectPDF": "Velg en PDF-fil:", - "submit": "Fjern Signatur" + "submit": "Fjern Signatur", + "description": "This tool will remove digital certificate signatures from your PDF document.", + "filenamePrefix": "unsigned", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst removing certificate signatures." + }, + "results": { + "title": "Certificate Removal Results" + } }, "pageLayout": { "tags": "slÃĨ sammen,kompositt,enkel-visning,organisere", @@ -1111,16 +2511,157 @@ "header": "Flersideoppsett", "pagesPerSheet": "Sider per ark:", "addBorder": "Legg til rammer", - "submit": "Send inn" + "submit": "Send inn", + "desc": { + "2": "Place 2 pages side-by-side on a single sheet.", + "3": "Place 3 pages on a single sheet in a single row.", + "4": "Place 4 pages on a single sheet (2 × 2 grid).", + "9": "Place 9 pages on a single sheet (3 × 3 grid).", + "16": "Place 16 pages on a single sheet (4 × 4 grid)." + }, + "error": { + "failed": "An error occurred while creating the multi-page layout." + } + }, + "bookletImposition": { + "tags": "booklet,imposition,printing,binding,folding,signature", + "title": "Booklet Imposition", + "header": "Booklet Imposition", + "submit": "Create Booklet", + "spineLocation": { + "label": "Spine Location", + "left": "Left (Standard)", + "right": "Right (RTL)" + }, + "doubleSided": { + "label": "Double-sided printing", + "tooltip": "Creates both front and back sides for proper booklet printing" + }, + "manualDuplex": { + "title": "Manual Duplex Mode", + "instructions": "For printers without automatic duplex. You'll need to run this twice:" + }, + "duplexPass": { + "label": "Print Pass", + "first": "1st Pass", + "second": "2nd Pass", + "firstInstructions": "Prints front sides → stack face-down → run again with 2nd Pass", + "secondInstructions": "Load printed stack face-down → prints back sides" + }, + "rtlBinding": { + "label": "Right-to-left binding", + "tooltip": "For Arabic, Hebrew, or other right-to-left languages" + }, + "addBorder": { + "label": "Add borders around pages", + "tooltip": "Adds borders around each page section to help with cutting and alignment" + }, + "addGutter": { + "label": "Add gutter margin", + "tooltip": "Adds inner margin space for binding" + }, + "gutterSize": { + "label": "Gutter size (points)" + }, + "flipOnShortEdge": { + "label": "Flip on short edge (automatic duplex only)", + "tooltip": "Enable for short-edge duplex printing (automatic duplex only - ignored in manual mode)", + "manualNote": "Not needed in manual mode - you flip the stack yourself" + }, + "advanced": { + "toggle": "Advanced Options" + }, + "paperSizeNote": "Paper size is automatically derived from your first page.", + "tooltip": { + "header": { + "title": "Booklet Creation Guide" + }, + "description": { + "title": "What is Booklet Imposition?", + "text": "Creates professional booklets by arranging pages in the correct printing order. Your PDF pages are placed 2-up on landscape sheets so when folded and bound, they read in proper sequence like a real book." + }, + "example": { + "title": "Example: 8-Page Booklet", + "text": "Your 8-page document becomes 2 sheets:", + "bullet1": "Sheet 1 Front: Pages 8, 1 | Back: Pages 2, 7", + "bullet2": "Sheet 2 Front: Pages 6, 3 | Back: Pages 4, 5", + "bullet3": "When folded & stacked: Reads 1→2→3→4→5→6→7→8" + }, + "printing": { + "title": "How to Print & Assemble", + "text": "Follow these steps for perfect booklets:", + "bullet1": "Print double-sided with 'Flip on long edge'", + "bullet2": "Stack sheets in order, fold in half", + "bullet3": "Staple or bind along the folded spine", + "bullet4": "For short-edge printers: Enable 'Flip on short edge' option" + }, + "manualDuplex": { + "title": "Manual Duplex (Single-sided Printers)", + "text": "For printers without automatic duplex:", + "bullet1": "Turn OFF 'Double-sided printing'", + "bullet2": "Select '1st Pass' → Print → Stack face-down", + "bullet3": "Select '2nd Pass' → Load stack → Print backs", + "bullet4": "Fold and assemble as normal" + }, + "advanced": { + "title": "Advanced Options", + "text": "Fine-tune your booklet:", + "bullet1": "Right-to-Left Binding: For Arabic, Hebrew, or RTL languages", + "bullet2": "Borders: Shows cut lines for trimming", + "bullet3": "Gutter Margin: Adds space for binding/stapling", + "bullet4": "Short-edge Flip: Only for automatic duplex printers" + } + }, + "error": { + "failed": "An error occurred while creating the booklet imposition." + } }, "scalePages": { - "tags": "endre størrelse,modifisere,dimensjon,tilpasse", "title": "Juster side-skala", "header": "Juster side-skala", "pageSize": "Størrelse pÃĨ et ark i dokumentet.", "keepPageSize": "Original Size", "scaleFactor": "Zoom-nivÃĨ (beskjÃĻr) for en side.", - "submit": "Send inn" + "submit": "Send inn", + "tags": "endre størrelse,modifisere,dimensjon,tilpasse" + }, + "adjustPageScale": { + "tags": "resize,modify,dimension,adapt", + "title": "Adjust Page Scale", + "header": "Adjust Page Scale", + "scaleFactor": { + "label": "Scale Factor" + }, + "pageSize": { + "label": "Target Page Size", + "keep": "Keep Original Size", + "letter": "Letter", + "legal": "Legal" + }, + "submit": "Adjust Page Scale", + "error": { + "failed": "An error occurred while adjusting the page scale." + }, + "tooltip": { + "header": { + "title": "Page Scale Settings Overview" + }, + "description": { + "title": "Description", + "text": "Adjust the size of PDF content and change the page dimensions." + }, + "scaleFactor": { + "title": "Scale Factor", + "text": "Controls how large or small the content appears on the page. Content is scaled and centred - if scaled content is larger than the page size, it may be cropped.", + "bullet1": "1.0 = Original size", + "bullet2": "0.5 = Half size (50% smaller)", + "bullet3": "2.0 = Double size (200% larger, may crop)" + }, + "pageSize": { + "title": "Target Page Size", + "text": "Sets the dimensions of the output PDF pages. 'Keep Original Size' maintains current dimensions, whilst other options resize to standard paper sizes." + } + } }, "add-page-numbers": { "tags": "paginere,etikett,organisere,indeks" @@ -1129,16 +2670,83 @@ "tags": "auto-oppdag,overskrift-basert,organisere,omdøp", "title": "Auto Navngi", "header": "Auto Navngi PDF", - "submit": "Auto Navngi" + "description": "Automatically finds the title from your PDF content and uses it as the filename.", + "submit": "Auto Navngi", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst auto-renaming the PDF." + }, + "results": { + "title": "Auto-Rename Results" + }, + "tooltip": { + "header": { + "title": "How Auto-Rename Works" + }, + "howItWorks": { + "title": "Smart Renaming", + "text": "Automatically finds the title from your PDF content and uses it as the filename.", + "bullet1": "Looks for text that appears to be a title or heading", + "bullet2": "Creates a clean, valid filename from the detected title", + "bullet3": "Keeps the original name if no suitable title is found" + } + } }, "adjust-contrast": { "tags": "fargekorrigering,tilpasse,modifisere,forbedre" }, "crop": { - "tags": "trim,redusere,redigere,form", "title": "BeskjÃĻr", "header": "BeskjÃĻr PDF", - "submit": "Send inn" + "submit": "Send inn", + "noFileSelected": "Select a PDF file to begin cropping", + "preview": { + "title": "Crop Area Selection" + }, + "reset": "Reset to full PDF", + "coordinates": { + "title": "Position and Size", + "x": { + "label": "X Position", + "desc": "Left edge (points)" + }, + "y": { + "label": "Y Position", + "desc": "Bottom edge (points)" + }, + "width": { + "label": "Width", + "desc": "Crop width (points)" + }, + "height": { + "label": "Height", + "desc": "Crop height (points)" + } + }, + "error": { + "invalidArea": "Crop area extends beyond PDF boundaries", + "failed": "Failed to crop PDF" + }, + "steps": { + "selectArea": "Select Crop Area" + }, + "tooltip": { + "title": "How to Crop PDFs", + "description": "Select the area to crop from your PDF by dragging and resizing the blue overlay on the thumbnail.", + "drag": "Drag the overlay to move the crop area", + "resize": "Drag the corner and edge handles to resize", + "precision": "Use coordinate inputs for precise positioning" + }, + "results": { + "title": "Crop Results" + }, + "automation": { + "info": "Enter crop coordinates in PDF points. Origin (0,0) is at bottom-left. These values will be applied to all PDFs processed in this automation.", + "reference": "Reference: A4 page is 595.28 × 841.89 points (210mm × 297mm). 1 inch = 72 points." + }, + "tags": "trim,redusere,redigere,form" }, "autoSplitPDF": { "tags": "QR-basert,separere,skann-segment,organisere", @@ -1221,24 +2829,124 @@ "downloadJS": "Last ned Javascript", "submit": "Vis" }, - "autoRedact": { - "tags": "Sensurere,Skjule,sverte ut,svart,markør,skjult", - "title": "Automatisk Sensurering", - "header": "Automatisk Sensurering", - "colorLabel": "Farge", - "textsToRedactLabel": "Tekst som skal sensureres (linje-separert)", - "textsToRedactPlaceholder": "f.eks. \\nKonfidensiell \\nTopp-hemmelig", - "useRegexLabel": "Bruk Regex", - "wholeWordSearchLabel": "Hele ordsøk", - "customPaddingLabel": "Tilpasset ekstra polstring", - "convertPDFToImageLabel": "Konverter PDF til PDF-bilde (Brukes for ÃĨ fjerne tekst bak boksen)", - "submitButton": "Send inn" - }, "redact": { "tags": "Sensurere,Skjule,sverte ut,svart,markør,skjult,manuell", "title": "Manuell Sensurering", - "header": "Manuell Sensurering", "submit": "Sensurer", + "error": { + "failed": "An error occurred while redacting the PDF." + }, + "modeSelector": { + "title": "Redaction Method", + "mode": "Mode", + "automatic": "Automatic", + "automaticDesc": "Redact text based on search terms", + "manual": "Manual", + "manualDesc": "Click and drag to redact specific areas", + "manualComingSoon": "Manual redaction coming soon" + }, + "auto": { + "header": "Auto Redact", + "settings": { + "title": "Redaction Settings", + "advancedTitle": "Avansert" + }, + "colorLabel": "Box Colour", + "wordsToRedact": { + "title": "Words to Redact", + "placeholder": "Enter a word", + "add": "Legg til", + "examples": "Examples: Confidential, Top-Secret" + }, + "useRegexLabel": "Use Regex", + "wholeWordSearchLabel": "Whole Word Search", + "customPaddingLabel": "Custom Extra Padding", + "convertPDFToImageLabel": "Convert PDF to PDF-Image" + }, + "tooltip": { + "mode": { + "header": { + "title": "Redaction Method" + }, + "automatic": { + "title": "Automatic Redaction", + "text": "Automatically finds and redacts specified text throughout the document. Perfect for removing consistent sensitive information like names, addresses, or confidential markers." + }, + "manual": { + "title": "Manual Redaction", + "text": "Click and drag to manually select specific areas to redact. Gives you precise control over what gets redacted. (Coming soon)" + } + }, + "words": { + "header": { + "title": "Words to Redact" + }, + "description": { + "title": "Text Matching", + "text": "Enter words or phrases to find and redact in your document. Each word will be searched for separately." + }, + "bullet1": "Add one word at a time", + "bullet2": "Press Enter or click 'Add Another' to add", + "bullet3": "Click × to remove words", + "examples": { + "title": "Common Examples", + "text": "Typical words to redact include: bank details, email addresses, or specific names." + } + }, + "advanced": { + "header": { + "title": "Advanced Redaction Settings" + }, + "color": { + "title": "Box Colour & Padding", + "text": "Customise the appearance of redaction boxes. Black is standard, but you can choose any colour. Padding adds extra space around the found text." + }, + "regex": { + "title": "Use Regex", + "text": "Enable regular expressions for advanced pattern matching. Useful for finding phone numbers, emails, or complex patterns.", + "bullet1": "Example: \\d{4}-\\d{2}-\\d{2} to match any dates in YYYY-MM-DD format", + "bullet2": "Use with caution - test thoroughly" + }, + "wholeWord": { + "title": "Whole Word Search", + "text": "Only match complete words, not partial matches. 'John' won't match 'Johnson' when enabled." + }, + "convert": { + "title": "Convert to PDF-Image", + "text": "Converts the PDF to an image-based PDF after redaction. This ensures text behind redaction boxes is completely removed and unrecoverable." + } + } + }, + "manual": { + "header": "Manual Redaction", + "textBasedRedaction": "Text-based Redaction", + "pageBasedRedaction": "Page-based Redaction", + "convertPDFToImageLabel": "Convert PDF to PDF-Image (Used to remove text behind the box)", + "pageRedactionNumbers": { + "title": "Sider", + "placeholder": "(f.eks. 1,2,8 eller 4,7,12-16 eller 2n-1)" + }, + "redactionColor": { + "title": "Redaction Colour" + }, + "export": "Export", + "upload": "Upload", + "boxRedaction": "Box draw redaction", + "zoom": "Zoom", + "zoomIn": "Zoom in", + "zoomOut": "Zoom out", + "nextPage": "Next Page", + "previousPage": "Previous Page", + "toggleSidebar": "Toggle Sidebar", + "showThumbnails": "Show Thumbnails", + "showDocumentOutline": "Show Document Outline (double-click to expand/collapse all items)", + "showAttachments": "Show Attachments", + "showLayers": "Show Layers (double-click to reset all layers to the default state)", + "colourPicker": "Colour Picker", + "findCurrentOutlineItem": "Find current outline item", + "applyChanges": "Apply Changes" + }, + "header": "Manuell Sensurering", "textBasedRedaction": "Tekstbasert sensurering", "pageBasedRedaction": "Sidebasert sensurering", "convertPDFToImageLabel": "Konverter PDF til PDF-bilde (Brukes for ÃĨ fjerne tekst bak boksen)", @@ -1264,21 +2972,7 @@ "showLayers": "Vis lag (dobbeltklikk for ÃĨ tilbakestille alle lag til standardtilstand)", "colourPicker": "Fargevelger", "findCurrentOutlineItem": "Finn gjeldende punkt i strukturen", - "applyChanges": "Bruk endringer", - "auto": { - "settings": { - "advancedTitle": "Avansert" - }, - "wordsToRedact": { - "add": "Legg til" - } - }, - "manual": { - "pageRedactionNumbers": { - "title": "Sider", - "placeholder": "(f.eks. 1,2,8 eller 4,7,12-16 eller 2n-1)" - } - } + "applyChanges": "Bruk endringer" }, "tableExtraxt": { "tags": "CSV,tabelluttrekk,ekstrahere,konvertere" @@ -1289,11 +2983,15 @@ "overlay-pdfs": { "tags": "overlay", "header": "Overlegg PDF-filer", + "title": "Overlay PDFs", + "desc": "Overlay one PDF on top of another", "baseFile": { "label": "Velg grunnleggende PDF-fil" }, "overlayFiles": { - "label": "Velg overlegg PDF-filer" + "label": "Velg overlegg PDF-filer", + "placeholder": "Choose PDF(s)...", + "addMore": "Add more PDFs..." }, "mode": { "label": "Velg overleggmodus", @@ -1303,14 +3001,53 @@ }, "counts": { "label": "Antall overlegg (for fast gjentakende modus)", - "placeholder": "Skriv inn komma-separerte tellinger (f.eks. 2,3,1)" + "placeholder": "Skriv inn komma-separerte tellinger (f.eks. 2,3,1)", + "item": "Count for file", + "noFiles": "Add overlay files to configure counts" }, "position": { "label": "Velg overleggposisjon", "foreground": "Forgrunn", "background": "Bakgrunn" }, - "submit": "Send inn" + "submit": "Send inn", + "settings": { + "title": "Settings" + }, + "results": { + "title": "Overlay Results" + }, + "tooltip": { + "header": { + "title": "Overlay PDFs Overview" + }, + "description": { + "title": "Description", + "text": "Combine a base PDF with one or more overlay PDFs. Overlays can be applied page-by-page in different modes and placed in the foreground or background." + }, + "mode": { + "title": "Overlay Mode", + "text": "Choose how to distribute overlay pages across the base PDF pages.", + "sequential": "Sequential Overlay: Use pages from the first overlay PDF until it ends, then move to the next.", + "interleaved": "Interleaved Overlay: Take one page from each overlay in turn.", + "fixedRepeat": "Fixed Repeat Overlay: Take a set number of pages from each overlay before moving to the next. Use Counts to set the numbers." + }, + "position": { + "title": "Overlay Position", + "text": "Foreground places the overlay on top of the page. Background places it behind." + }, + "overlayFiles": { + "title": "Overlay Files", + "text": "Select one or more PDFs to overlay on the base. The order of these files affects how pages are applied in Sequential and Fixed Repeat modes." + }, + "counts": { + "title": "Counts (Fixed Repeat only)", + "text": "Provide a positive number for each overlay file showing how many pages to take before moving to the next. Required when mode is Fixed Repeat." + } + }, + "error": { + "failed": "An error occurred while overlaying PDFs." + } }, "split-by-sections": { "tags": "seksjonsdeling,del,tilpass", @@ -1331,6 +3068,7 @@ "tags": "stempel,legg til bilde,senter bilde,vannmerke,PDF,embed,tilpass", "header": "Stemple PDF", "title": "Stemple PDF", + "stampSetup": "Stamp Setup", "stampType": "Stempeltype", "stampText": "Stempele tekst", "stampImage": "Stemplebilde", @@ -1343,7 +3081,19 @@ "overrideY": "Overskriv Y-koordinat", "customMargin": "Tilpasset Margin", "customColor": "Tilpasset Tekstfarge", - "submit": "Send inn" + "submit": "Send inn", + "noStampSelected": "No stamp selected. Return to Step 1.", + "customPosition": "Drag the stamp to the desired location in the preview window.", + "error": { + "failed": "An error occurred while adding stamp to the PDF." + }, + "imageSize": "Image Size", + "margin": "Margin", + "positionAndFormatting": "Position & Formatting", + "quickPosition": "Select a position on the page to place the stamp.", + "results": { + "title": "Stamp Results" + } }, "removeImagePdf": { "tags": "Fjern Bilde,Sideoperasjoner,Backend,serverside" @@ -1361,7 +3111,8 @@ "status": { "_value": "Status", "valid": "Gyldig", - "invalid": "Ugyldig" + "invalid": "Ugyldig", + "complete": "Validation complete" }, "signer": "Signatar", "date": "Dato", @@ -1388,40 +3139,122 @@ "version": "Versjon", "keyUsage": "Nøkkelbruk", "selfSigned": "Selv-signert", - "bits": "bits" + "bits": "bits", + "details": "Certificate Details" }, "signature": { "info": "Signaturinformasjon", "_value": "Signatur", "mathValid": "Signaturen er matematisk gyldig MEN:" }, - "selectCustomCert": "Tilpasset Sertifikatfil X.509 (Valgfritt)" - }, - "replace-color": { - "title": "Erstatt-Inverter-Farge", - "header": "Erstatt-Inverter Farge PDF", - "selectText": { - "1": "Erstatt eller Inverter farge alternativer", - "2": "Standard(Standard høy kontrast farger)", - "3": "Tilpasset(Tilpassede farger)", - "4": "Full-Invertering(Inverter alle farger)", - "5": "Høy kontrast fargealternativer", - "6": "hvit tekst pÃĨ svart bakgrunn", - "7": "Svart tekst pÃĨ hvit bakgrunn", - "8": "Gul tekst pÃĨ svart bakgrunn", - "9": "Grønn tekst pÃĨ svart bakgrunn", - "10": "Velg tekstfarge", - "11": "Velg bakgrunnsfarge" + "selectCustomCert": "Tilpasset Sertifikatfil X.509 (Valgfritt)", + "downloadCsv": "Download CSV", + "downloadJson": "Download JSON", + "downloadPdf": "Download PDF Report", + "downloadType": { + "csv": "CSV", + "json": "JSON", + "pdf": "PDF" }, - "submit": "Erstatt" + "error": { + "allFailed": "Unable to validate the selected files.", + "partial": "Some files could not be validated.", + "reportGeneration": "Could not generate the PDF report. JSON and CSV are available.", + "unexpected": "Unexpected error during validation." + }, + "finalizing": "Preparing downloads...", + "issue": { + "certExpired": "Certificate expired", + "certRevocationUnknown": "Certificate revocation status unknown", + "certRevoked": "Certificate revoked", + "chainInvalid": "Certificate chain invalid", + "signatureInvalid": "Signature cryptographic check failed", + "trustInvalid": "Certificate not trusted" + }, + "noResults": "Run the validation to generate a report.", + "noSignaturesShort": "No signatures", + "processing": "Validating signatures...", + "report": { + "continued": "Continued", + "downloads": "Downloads", + "entryLabel": "Signature Summary", + "fields": { + "created": "Created", + "fileSize": "File Size", + "signatureCount": "Total Signatures", + "signatureDate": "Signature Date" + }, + "filesEvaluated": "{{count}} files evaluated", + "footer": "Validated via Stirling PDF", + "generatedAt": "Generated", + "noPdf": "PDF report will be available after a successful validation.", + "page": "Page", + "shortTitle": "Signature Summary", + "signatureCountLabel": "{{count}} signatures", + "signaturesFound": "{{count}} signatures detected", + "signaturesValid": "{{count}} fully valid", + "title": "Signature Validation Report" + }, + "settings": { + "certHint": "Upload a trusted X.509 certificate to validate against a custom trust source.", + "title": "Validation Settings" + }, + "signatureDate": "Signature Date", + "totalSignatures": "Total Signatures" }, - "replaceColorPdf": { - "tags": "Erstatt Farge,Sideoperasjoner,Backend,serverside" + "replaceColor": { + "tags": "Replace Colour,Page operations,Back end,server side", + "labels": { + "settings": "Settings", + "colourOperation": "Colour operation" + }, + "options": { + "highContrast": "High contrast", + "invertAll": "Invert all colours", + "custom": "Custom", + "cmyk": "Convert to CMYK" + }, + "tooltip": { + "header": { + "title": "Replace & Invert Colour Settings Overview" + }, + "description": { + "title": "Description", + "text": "Transform PDF colours to improve readability and accessibility. Choose from high contrast presets, invert all colours, or create custom colour schemes." + }, + "highContrast": { + "title": "High Contrast", + "text": "Apply predefined high contrast colour combinations designed for better readability and accessibility compliance.", + "bullet1": "White text on black background - Classic dark mode", + "bullet2": "Black text on white background - Standard high contrast", + "bullet3": "Yellow text on black background - High visibility option", + "bullet4": "Green text on black background - Alternative high contrast" + }, + "invertAll": { + "title": "Invert All Colours", + "text": "Completely invert all colours in the PDF, creating a negative-like effect. Useful for creating dark mode versions of documents or reducing eye strain in low-light conditions." + }, + "custom": { + "title": "Custom Colours", + "text": "Define your own text and background colours using the colour pickers. Perfect for creating branded documents or specific accessibility requirements.", + "bullet1": "Text colour - Choose the colour for text elements", + "bullet2": "Background colour - Set the background colour for the document" + }, + "cmyk": { + "title": "Convert to CMYK", + "text": "Convert the PDF from RGB colour space to CMYK colour space, optimized for professional printing. This process converts colours to the Cyan, Magenta, Yellow, Black model used by printers." + } + }, + "error": { + "failed": "An error occurred while processing the colour replacement." + } }, "login": { "title": "Logg inn", "header": "Logg inn", "signin": "Logg inn", + "signInWith": "Sign in with", + "signInAnonymously": "Sign Up as a Guest", "rememberme": "Husk meg", "invalid": "Ugyldig brukernavn eller passord.", "locked": "Kontoen din har blitt lÃĨst.", @@ -1440,12 +3273,83 @@ "alreadyLoggedIn": "Du er allerede innlogget pÃĨ", "alreadyLoggedIn2": "enheter. Logg ut og forsøk igjen", "toManySessions": "Du har for mange aktive økter", - "logoutMessage": "You have been logged out." + "logoutMessage": "You have been logged out.", + "youAreLoggedIn": "You are logged in!", + "email": "Email", + "password": "Password", + "enterEmail": "Enter your email", + "enterPassword": "Enter your password", + "loggingIn": "Logging In...", + "username": "Username", + "enterUsername": "Enter username", + "useEmailInstead": "Login with email", + "forgotPassword": "Forgot your password?", + "logIn": "Log In", + "signingIn": "Signing in...", + "login": "Login", + "or": "Or", + "useMagicLink": "Use magic link instead", + "enterEmailForMagicLink": "Enter your email for magic link", + "sending": "Sendingâ€Ļ", + "sendMagicLink": "Send Magic Link", + "cancel": "Cancel", + "dontHaveAccount": "Don't have an account? Sign up", + "home": "Home", + "debug": "Debug", + "signOut": "Sign Out", + "pleaseEnterBoth": "Please enter both email and password", + "pleaseEnterEmail": "Please enter your email address", + "magicLinkSent": "Magic link sent to {{email}}! Check your email and click the link to sign in.", + "passwordResetSent": "Password reset link sent to {{email}}! Check your email and follow the instructions.", + "failedToSignIn": "Failed to sign in with {{provider}}: {{message}}", + "unexpectedError": "Unexpected error: {{message}}", + "accountCreatedSuccess": "Account created successfully! You can now sign in.", + "passwordChangedSuccess": "Password changed successfully! Please sign in with your new password.", + "credentialsUpdated": "Your credentials have been updated. Please sign in again." + }, + "signup": { + "title": "Create an account", + "subtitle": "Join Stirling PDF to get started", + "name": "Name", + "email": "Email", + "password": "Password", + "confirmPassword": "Confirm password", + "enterName": "Enter your name", + "enterEmail": "Enter your email", + "enterPassword": "Enter your password", + "confirmPasswordPlaceholder": "Confirm password", + "or": "or", + "creatingAccount": "Creating Account...", + "signUp": "Sign Up", + "alreadyHaveAccount": "Already have an account? Sign in", + "pleaseFillAllFields": "Please fill in all fields", + "passwordsDoNotMatch": "Passwords do not match", + "passwordTooShort": "Password must be at least 6 characters long", + "invalidEmail": "Please enter a valid email address", + "checkEmailConfirmation": "Check your email for a confirmation link to complete your registration.", + "accountCreatedSuccessfully": "Account created successfully! You can now sign in.", + "unexpectedError": "Unexpected error: {{message}}", + "useEmailInstead": "Use Email Instead", + "nameRequired": "Name is required", + "emailRequired": "Email is required", + "passwordRequired": "Password is required", + "confirmPasswordRequired": "Please confirm your password" }, "pdfToSinglePage": { "title": "PDF Til Enkelt Side", "header": "PDF Til Enkelt Side", - "submit": "Konverter til Enkelt Side" + "submit": "Konverter til Enkelt Side", + "description": "This tool will merge all pages of your PDF into one large single page. The width will remain the same as the original pages, but the height will be the sum of all page heights.", + "filenamePrefix": "single_page", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst converting to single page." + }, + "results": { + "title": "Single Page Results" + } }, "pageExtracter": { "title": "Trekk ut Sider", @@ -1469,18 +3373,59 @@ "adjustContrast": { "title": "Juster Kontrast", "header": "Juster Kontrast", + "basic": "Basic Adjustments", "contrast": "Kontrast:", "brightness": "Lysstyrke:", "saturation": "Metning:", - "download": "Last ned" + "download": "Last ned", + "adjustColors": "Adjust Colors", + "blue": "Blue", + "confirm": "Confirm", + "error": { + "failed": "Failed to adjust colors/contrast" + }, + "green": "Green", + "noPreview": "Select a PDF to preview", + "red": "Red", + "results": { + "title": "Adjusted PDF" + } }, "compress": { "title": "Komprimer", + "desc": "Compress PDFs to reduce their file size.", "header": "Komprimer PDF", + "method": { + "title": "Compression Method", + "quality": "Quality", + "filesize": "Filstørrelse" + }, "credit": "Denne tjenesten bruker qpdf for PDF-komprimering/optimisering.", "grayscale": { "label": "Bruk grÃĨskala for komprimering" }, + "tooltip": { + "header": { + "title": "Compress Settings Overview" + }, + "description": { + "title": "Description", + "text": "Compression is an easy way to reduce your file size. Pick File Size to enter a target size and have us adjust quality for you. Pick Quality to set compression strength manually." + }, + "qualityAdjustment": { + "title": "Quality Adjustment", + "text": "Drag the slider to adjust the compression strength. Lower values (1-3) preserve quality but result in larger files. Higher values (7-9) shrink the file more but reduce image clarity.", + "bullet1": "Lower values preserve quality", + "bullet2": "Higher values reduce file size" + }, + "grayscale": { + "title": "Grayscale", + "text": "Select this option to convert all images to black and white, which can significantly reduce file size especially for scanned PDFs or image-heavy documents." + } + }, + "error": { + "failed": "An error occurred while compressing the PDF." + }, "selectText": { "1": { "_value": "Compression Settings", @@ -1490,10 +3435,7 @@ "4": "Automatisk modus - Justerer automatisk kvaliteten for ÃĨ fÃĨ PDF til nøyaktig størrelse", "5": "Forventet PDF-størrelse (f.eks. 25MB, 10.8MB, 25KB)" }, - "submit": "Komprimer", - "method": { - "filesize": "Filstørrelse" - } + "submit": "Komprimer" }, "decrypt": { "passwordPrompt": "This file is password-protected. Please enter the password:", @@ -1594,7 +3536,13 @@ "title": "Remove image", "header": "Remove image", "removeImage": "Remove image", - "submit": "Remove image" + "submit": "Remove image", + "error": { + "failed": "Failed to remove images from the PDF." + }, + "results": { + "title": "Remove Images Results" + } }, "splitByChapters": { "title": "Split PDF by Chapters", @@ -1628,6 +3576,12 @@ }, "note": "Versjonsnotater er kun tilgjengelige pÃĨ engelsk" }, + "swagger": { + "title": "API Documentation", + "header": "API Documentation", + "desc": "View and test the Stirling PDF API endpoints", + "tags": "api,documentation,swagger,endpoints,development" + }, "cookieBanner": { "popUp": { "title": "How we use Cookies", @@ -1663,46 +3617,943 @@ "title": "Analytics", "description": "These cookies help us understand how our tools are being used, so we can focus on building the features our community values most. Rest assured—Stirling PDF cannot and will never track the content of the documents you work with." } + }, + "services": { + "posthog": "PostHog Analytics", + "scarf": "Scarf Pixel" } }, - "download": "Last ned", - "undo": "Angre", - "convert": { - "title": "Konverter", - "settings": "Innstillinger", - "color": "Farge", - "greyscale": "GrÃĨtone", - "fillPage": "Fyll side", - "pdfaDigitalSignatureWarning": "PDFen inneholder en digital signatur. Denne vil bli fjernet i neste steg.", - "grayscale": "GrÃĨtone" + "removeMetadata": { + "submit": "Remove Metadata" }, - "attachments": { - "tags": "embed,attach,file,attachment,attachments", - "title": "Add attachments", - "header": "Add attachments", - "submit": "Add attachments" + "sidebar": { + "toggle": "Toggle Sidebar" + }, + "theme": { + "toggle": "Toggle Theme" + }, + "view": { + "viewer": "Viewer", + "pageEditor": "Page Editor", + "fileManager": "File Manager" + }, + "pageEditor": { + "title": "Page Editor", + "save": "Save Changes", + "noPdfLoaded": "No PDF loaded. Please upload a PDF to edit.", + "rotatedLeft": "Rotated left:", + "rotatedRight": "Rotated right:", + "deleted": "Deleted:", + "movedLeft": "Moved left:", + "movedRight": "Moved right:", + "splitAt": "Split at:", + "insertedPageBreak": "Inserted page break at:", + "addFileNotImplemented": "Add file not implemented in demo", + "closePdf": "Close PDF", + "reset": "Reset Changes", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "fitToWidth": "Fit to Width", + "actualSize": "Actual Size" + }, + "viewer": { + "firstPage": "First Page", + "lastPage": "Last Page", + "previousPage": "Previous Page", + "nextPage": "Next Page", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "singlePageView": "Single Page View", + "dualPageView": "Dual Page View" + }, + "rightRail": { + "closeSelected": "Close Selected Files", + "selectAll": "Select All", + "deselectAll": "Deselect All", + "selectByNumber": "Select by Page Numbers", + "deleteSelected": "Delete Selected Pages", + "closePdf": "Close PDF", + "exportAll": "Export PDF", + "downloadSelected": "Download Selected Files", + "downloadAll": "Download All", + "toggleTheme": "Toggle Theme", + "language": "Language", + "search": "Search PDF", + "panMode": "Pan Mode", + "rotateLeft": "Rotate Left", + "rotateRight": "Rotate Right", + "toggleSidebar": "Toggle Sidebar", + "exportSelected": "Export Selected Pages", + "toggleAnnotations": "Toggle Annotations Visibility", + "annotationMode": "Toggle Annotation Mode", + "draw": "Draw", + "save": "Save" + }, + "search": { + "title": "Search PDF", + "placeholder": "Enter search term...", + "noResults": "No results found", + "searching": "Searching..." + }, + "guestBanner": { + "title": "You're using Stirling PDF as a guest!", + "message": "Create a free account to save your work, access more features, and support the project.", + "dismiss": "Dismiss banner", + "signUp": "Sign Up Free" + }, + "toolPicker": { + "searchPlaceholder": "Search tools...", + "noToolsFound": "No tools found", + "allTools": "ALL TOOLS", + "quickAccess": "QUICK ACCESS", + "categories": { + "standardTools": "Standard Tools", + "advancedTools": "Advanced Tools", + "recommendedTools": "Recommended Tools" + }, + "subcategories": { + "signing": "Signing", + "documentSecurity": "Document Security", + "verification": "Verification", + "documentReview": "Document Review", + "pageFormatting": "Page Formatting", + "extraction": "Extraction", + "removal": "Removal", + "automation": "Automation", + "general": "General", + "advancedFormatting": "Advanced Formatting", + "developerTools": "Developer Tools" + } }, "quickAccess": { - "sign": "Signer" + "read": "Read", + "sign": "Signer", + "automate": "Automate", + "files": "Files", + "activity": "Activity", + "help": "Help", + "account": "Account", + "config": "Config", + "adminSettings": "Admin Settings", + "allTools": "All Tools" + }, + "admin": { + "error": "Error", + "success": "Success", + "expand": "Expand", + "close": "Close", + "status": { + "active": "Active", + "inactive": "Inactive" + }, + "settings": { + "title": "Admin Settings", + "workspace": "Workspace", + "fetchError": "Failed to load settings", + "saveError": "Failed to save settings", + "saved": "Settings saved successfully", + "saveSuccess": "Settings saved successfully", + "save": "Save Changes", + "restartRequired": "Restart Required", + "restart": { + "title": "Restart Required", + "message": "Settings have been saved successfully. A server restart is required for the changes to take effect.", + "question": "Would you like to restart the server now or later?", + "now": "Restart Now", + "later": "Restart Later" + }, + "restarting": "Restarting Server", + "restartingMessage": "The server is restarting. Please wait a moment...", + "restartError": "Failed to restart server. Please restart manually.", + "general": { + "title": "System Settings", + "description": "Configure system-wide application settings including branding and default behaviour.", + "ui": "User Interface", + "system": "System", + "appName": { + "label": "Application Name", + "description": "The name displayed in the browser tab and home page" + }, + "appNameNavbar": { + "label": "Navbar Brand", + "description": "The name displayed in the navigation bar" + }, + "homeDescription": { + "label": "Home Description", + "description": "The description text shown on the home page" + }, + "defaultLocale": { + "label": "Default Locale", + "description": "The default language for new users (e.g., en_US, es_ES)" + }, + "fileUploadLimit": { + "label": "File Upload Limit", + "description": "Maximum file upload size (e.g., 100MB, 1GB)" + }, + "showUpdate": { + "label": "Show Update Notifications", + "description": "Display notifications when a new version is available" + }, + "showUpdateOnlyAdmin": { + "label": "Show Updates to Admins Only", + "description": "Restrict update notifications to admin users only" + }, + "customHTMLFiles": { + "label": "Custom HTML Files", + "description": "Allow serving custom HTML files from the customFiles directory" + }, + "languages": { + "label": "Available Languages", + "description": "Languages that users can select from (leave empty to enable all languages)" + }, + "customMetadata": { + "label": "Custom Metadata", + "autoUpdate": { + "label": "Auto Update Metadata", + "description": "Automatically update PDF metadata on all processed documents" + }, + "author": { + "label": "Default Author", + "description": "Default author for PDF metadata (e.g., username)" + }, + "creator": { + "label": "Default Creator", + "description": "Default creator for PDF metadata" + }, + "producer": { + "label": "Default Producer", + "description": "Default producer for PDF metadata" + } + }, + "customPaths": { + "label": "Custom Paths", + "description": "Configure custom file system paths for pipeline processing and external tools", + "pipeline": { + "label": "Pipeline Directories", + "watchedFoldersDir": { + "label": "Watched Folders Directory", + "description": "Directory where pipeline monitors for incoming PDFs (leave empty for default: /pipeline/watchedFolders)" + }, + "finishedFoldersDir": { + "label": "Finished Folders Directory", + "description": "Directory where processed PDFs are outputted (leave empty for default: /pipeline/finishedFolders)" + } + }, + "operations": { + "label": "External Tool Paths", + "weasyprint": { + "label": "WeasyPrint Executable", + "description": "Path to WeasyPrint executable for HTML to PDF conversion (leave empty for default: /opt/venv/bin/weasyprint)" + }, + "unoconvert": { + "label": "Unoconvert Executable", + "description": "Path to LibreOffice unoconvert for document conversions (leave empty for default: /opt/venv/bin/unoconvert)" + } + } + } + }, + "security": { + "title": "Security", + "description": "Configure authentication, login behaviour, and security policies.", + "ssoNotice": { + "title": "Looking for SSO/SAML settings?", + "message": "OAuth2 and SAML2 authentication providers have been moved to the Connections menu for easier management." + }, + "authentication": "Authentication", + "enableLogin": { + "label": "Enable Login", + "description": "Require users to log in before accessing the application" + }, + "loginMethod": { + "label": "Login Method", + "description": "The authentication method to use for user login", + "all": "All Methods", + "normal": "Username/Password Only", + "oauth2": "OAuth2 Only", + "saml2": "SAML2 Only" + }, + "loginAttemptCount": { + "label": "Login Attempt Limit", + "description": "Maximum number of failed login attempts before account lockout" + }, + "loginResetTimeMinutes": { + "label": "Login Reset Time (minutes)", + "description": "Time before failed login attempts are reset" + }, + "csrfDisabled": { + "label": "Disable CSRF Protection", + "description": "Disable Cross-Site Request Forgery protection (not recommended)" + }, + "initialLogin": { + "label": "Initial Login", + "username": { + "label": "Initial Username", + "description": "The username for the initial admin account" + }, + "password": { + "label": "Initial Password", + "description": "The password for the initial admin account" + } + }, + "jwt": { + "label": "JWT Configuration", + "secureCookie": { + "label": "Secure Cookie", + "description": "Require HTTPS for JWT cookies (recommended for production)" + }, + "keyRetentionDays": { + "label": "Key Retention Days", + "description": "Number of days to retain old JWT keys for verification" + }, + "persistence": { + "label": "Enable Key Persistence", + "description": "Store JWT keys persistently to survive server restarts" + }, + "enableKeyRotation": { + "label": "Enable Key Rotation", + "description": "Automatically rotate JWT signing keys periodically" + }, + "enableKeyCleanup": { + "label": "Enable Key Cleanup", + "description": "Automatically remove expired JWT keys" + } + }, + "audit": { + "label": "Audit Logging", + "enabled": { + "label": "Enable Audit Logging", + "description": "Track user actions and system events for compliance and security monitoring" + }, + "level": { + "label": "Audit Level", + "description": "0=OFF, 1=BASIC, 2=STANDARD, 3=VERBOSE" + }, + "retentionDays": { + "label": "Audit Retention (days)", + "description": "Number of days to retain audit logs" + } + }, + "htmlUrlSecurity": { + "label": "HTML URL Security", + "description": "Configure URL access restrictions for HTML processing to prevent SSRF attacks", + "enabled": { + "label": "Enable URL Security", + "description": "Enable URL security restrictions for HTML to PDF conversions" + }, + "level": { + "label": "Security Level", + "description": "MAX: whitelist only, MEDIUM: block internal networks, OFF: no restrictions", + "max": "Maximum (Whitelist Only)", + "medium": "Medium (Block Internal)", + "off": "Off (No Restrictions)" + }, + "advanced": "Advanced Settings", + "allowedDomains": { + "label": "Allowed Domains (Whitelist)", + "description": "One domain per line (e.g., cdn.example.com). Only these domains allowed when level is MAX" + }, + "blockedDomains": { + "label": "Blocked Domains (Blacklist)", + "description": "One domain per line (e.g., malicious.com). Additional domains to block" + }, + "internalTlds": { + "label": "Internal TLDs", + "description": "One TLD per line (e.g., .local, .internal). Block domains with these TLD patterns" + }, + "networkBlocking": "Network Blocking", + "blockPrivateNetworks": { + "label": "Block Private Networks", + "description": "Block RFC 1918 private networks (10.x.x.x, 192.168.x.x, 172.16-31.x.x)" + }, + "blockLocalhost": { + "label": "Block Localhost", + "description": "Block localhost and loopback addresses (127.x.x.x, ::1)" + }, + "blockLinkLocal": { + "label": "Block Link-Local Addresses", + "description": "Block link-local addresses (169.254.x.x, fe80::/10)" + }, + "blockCloudMetadata": { + "label": "Block Cloud Metadata Endpoints", + "description": "Block cloud provider metadata endpoints (169.254.169.254)" + } + } + }, + "connections": { + "title": "Connections", + "description": "Configure external authentication providers like OAuth2 and SAML.", + "linkedServices": "Linked Services", + "unlinkedServices": "Unlinked Services", + "connect": "Connect", + "disconnect": "Disconnect", + "disconnected": "Provider disconnected successfully", + "disconnectError": "Failed to disconnect provider", + "ssoAutoLogin": { + "label": "SSO Auto Login", + "enable": "Enable SSO Auto Login", + "description": "Automatically redirect to SSO login when authentication is required" + }, + "oauth2": { + "label": "OAuth2", + "enabled": { + "label": "Enable OAuth2", + "description": "Allow users to authenticate using OAuth2 providers" + }, + "provider": { + "label": "Provider", + "description": "The OAuth2 provider to use for authentication" + }, + "issuer": { + "label": "Issuer URL", + "description": "The OAuth2 provider issuer URL" + }, + "clientId": { + "label": "Client ID", + "description": "The OAuth2 client ID from your provider" + }, + "clientSecret": { + "label": "Client Secret", + "description": "The OAuth2 client secret from your provider" + }, + "useAsUsername": { + "label": "Use as Username", + "description": "The OAuth2 claim to use as the username (e.g., email, sub)" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first OAuth2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via OAuth2" + }, + "scopes": { + "label": "OAuth2 Scopes", + "description": "Comma-separated list of OAuth2 scopes to request (e.g., openid, profile, email)" + } + }, + "saml2": { + "label": "SAML2", + "enabled": { + "label": "Enable SAML2", + "description": "Allow users to authenticate using SAML2 providers" + }, + "provider": { + "label": "Provider", + "description": "The SAML2 provider name" + }, + "registrationId": { + "label": "Registration ID", + "description": "The SAML2 registration identifier" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first SAML2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via SAML2" + } + } + }, + "database": { + "title": "Database", + "description": "Configure custom database connection settings for enterprise deployments.", + "configuration": "Database Configuration", + "enableCustom": { + "label": "Enable Custom Database", + "description": "Use your own custom database configuration instead of the default embedded database" + }, + "customUrl": { + "label": "Custom Database URL", + "description": "Full JDBC connection string (e.g., jdbc:postgresql://localhost:5432/postgres). If provided, individual connection settings below are not used." + }, + "type": { + "label": "Database Type", + "description": "Type of database (not used if custom URL is provided)" + }, + "hostName": { + "label": "Host Name", + "description": "Database server hostname (not used if custom URL is provided)" + }, + "port": { + "label": "Port", + "description": "Database server port (not used if custom URL is provided)" + }, + "name": { + "label": "Database Name", + "description": "Name of the database (not used if custom URL is provided)" + }, + "username": { + "label": "Username", + "description": "Database authentication username" + }, + "password": { + "label": "Password", + "description": "Database authentication password" + } + }, + "privacy": { + "title": "Privacy", + "description": "Configure privacy and data collection settings.", + "analytics": "Analytics & Tracking", + "enableAnalytics": { + "label": "Enable Analytics", + "description": "Collect anonymous usage analytics to help improve the application" + }, + "metricsEnabled": { + "label": "Enable Metrics", + "description": "Enable collection of performance and usage metrics. Provides API endpoint for admins to access metrics data" + }, + "searchEngine": "Search Engine Visibility", + "googleVisibility": { + "label": "Google Visibility", + "description": "Allow search engines to index this application" + } + }, + "advanced": { + "title": "Advanced", + "description": "Configure advanced features and experimental functionality.", + "features": "Feature Flags", + "processing": "Processing", + "endpoints": { + "label": "Endpoints", + "manage": "Manage API Endpoints", + "description": "Endpoint management is configured via YAML. See documentation for details on enabling/disabling specific endpoints." + }, + "enableAlphaFunctionality": { + "label": "Enable Alpha Features", + "description": "Enable experimental and alpha-stage features (may be unstable)" + }, + "enableUrlToPDF": { + "label": "Enable URL to PDF", + "description": "Allow conversion of web pages to PDF documents" + }, + "maxDPI": { + "label": "Maximum DPI", + "description": "Maximum DPI for image processing (0 = unlimited)" + }, + "tessdataDir": { + "label": "Tessdata Directory", + "description": "Path to the tessdata directory for OCR language files" + }, + "disableSanitize": { + "label": "Disable HTML Sanitization", + "description": "WARNING: Security risk - disabling HTML sanitization can lead to XSS vulnerabilities" + }, + "tempFileManagement": { + "label": "Temp File Management", + "description": "Configure temporary file storage and cleanup behavior", + "baseTmpDir": { + "label": "Base Temp Directory", + "description": "Base directory for temporary files (leave empty for default: java.io.tmpdir/stirling-pdf)" + }, + "libreofficeDir": { + "label": "LibreOffice Temp Directory", + "description": "Directory for LibreOffice temp files (leave empty for default: baseTmpDir/libreoffice)" + }, + "systemTempDir": { + "label": "System Temp Directory", + "description": "System temp directory to clean (only used if cleanupSystemTemp is enabled)" + }, + "prefix": { + "label": "Temp File Prefix", + "description": "Prefix for temp file names" + }, + "maxAgeHours": { + "label": "Max Age (hours)", + "description": "Maximum age in hours before temp files are cleaned up" + }, + "cleanupIntervalMinutes": { + "label": "Cleanup Interval (minutes)", + "description": "How often to run cleanup (in minutes)" + }, + "startupCleanup": { + "label": "Startup Cleanup", + "description": "Clean up old temp files on application startup" + }, + "cleanupSystemTemp": { + "label": "Cleanup System Temp", + "description": "Whether to clean broader system temp directory (use with caution)" + } + }, + "processExecutor": { + "label": "Process Executor Limits", + "description": "Configure session limits and timeouts for each process executor", + "sessionLimit": { + "label": "Session Limit", + "description": "Maximum concurrent instances" + }, + "timeout": { + "label": "Timeout (minutes)", + "description": "Maximum execution time" + }, + "libreOffice": "LibreOffice", + "pdfToHtml": "PDF to HTML", + "qpdf": "QPDF", + "tesseract": "Tesseract OCR", + "pythonOpenCv": "Python OpenCV", + "weasyPrint": "WeasyPrint", + "installApp": "Install App", + "calibre": "Calibre", + "ghostscript": "Ghostscript", + "ocrMyPdf": "OCRmyPDF" + } + }, + "mail": { + "title": "Mail Server", + "description": "Configure SMTP settings for sending email notifications.", + "smtp": "SMTP Configuration", + "enabled": { + "label": "Enable Mail", + "description": "Enable email notifications and SMTP functionality" + }, + "host": { + "label": "SMTP Host", + "description": "The hostname or IP address of your SMTP server" + }, + "port": { + "label": "SMTP Port", + "description": "The port number for SMTP connection (typically 25, 465, or 587)" + }, + "username": { + "label": "SMTP Username", + "description": "Username for SMTP authentication" + }, + "password": { + "label": "SMTP Password", + "description": "Password for SMTP authentication" + }, + "from": { + "label": "From Address", + "description": "The email address to use as the sender" + }, + "enableInvites": { + "label": "Enable Email Invites", + "description": "Allow admins to invite users via email with auto-generated passwords" + }, + "frontendUrl": { + "label": "Frontend URL", + "description": "Base URL for frontend (e.g. https://pdf.example.com). Used for generating invite links in emails. Leave empty to use backend URL." + } + }, + "legal": { + "title": "Legal Documents", + "description": "Configure links to legal documents and policies.", + "disclaimer": { + "title": "Legal Responsibility Warning", + "message": "By customizing these legal documents, you assume full responsibility for ensuring compliance with all applicable laws and regulations, including but not limited to GDPR and other EU data protection requirements. Only modify these settings if: (1) you are operating a personal/private instance, (2) you are outside EU jurisdiction and understand your local legal obligations, or (3) you have obtained proper legal counsel and accept sole responsibility for all user data and legal compliance. Stirling-PDF and its developers assume no liability for your legal obligations." + }, + "termsAndConditions": { + "label": "Terms and Conditions", + "description": "URL or filename to terms and conditions" + }, + "privacyPolicy": { + "label": "Privacy Policy", + "description": "URL or filename to privacy policy" + }, + "accessibilityStatement": { + "label": "Accessibility Statement", + "description": "URL or filename to accessibility statement" + }, + "cookiePolicy": { + "label": "Cookie Policy", + "description": "URL or filename to cookie policy" + }, + "impressum": { + "label": "Impressum", + "description": "URL or filename to impressum (required in some jurisdictions)" + } + }, + "premium": { + "title": "Premium & Enterprise", + "description": "Configure your premium or enterprise license key.", + "license": "License Configuration", + "key": { + "label": "License Key", + "description": "Enter your premium or enterprise license key" + }, + "enabled": { + "label": "Enable Premium Features", + "description": "Enable license key checks for pro/enterprise features" + }, + "movedFeatures": { + "title": "Premium Features Distributed", + "message": "Premium and Enterprise features are now organized in their respective sections:" + } + }, + "features": { + "title": "Features", + "description": "Configure optional features and functionality.", + "serverCertificate": { + "label": "Server Certificate", + "description": "Configure server-side certificate generation for \"Sign with Stirling-PDF\" functionality", + "enabled": { + "label": "Enable Server Certificate", + "description": "Enable server-side certificate for \"Sign with Stirling-PDF\" option" + }, + "organizationName": { + "label": "Organization Name", + "description": "Organization name for generated certificates" + }, + "validity": { + "label": "Certificate Validity (days)", + "description": "Number of days the certificate will be valid" + }, + "regenerateOnStartup": { + "label": "Regenerate on Startup", + "description": "Generate new certificate on each application startup" + } + } + }, + "endpoints": { + "title": "API Endpoints", + "description": "Control which API endpoints and endpoint groups are available.", + "management": "Endpoint Management", + "toRemove": { + "label": "Disabled Endpoints", + "description": "Select individual endpoints to disable" + }, + "groupsToRemove": { + "label": "Disabled Endpoint Groups", + "description": "Select endpoint groups to disable" + }, + "note": "Note: Disabling endpoints restricts API access but does not remove UI components. Restart required for changes to take effect." + } + } }, "fileUpload": { - "loading": "Laster..." + "selectFile": "Select a file", + "selectFiles": "Select files", + "selectPdfToView": "Select a PDF to view", + "selectPdfToEdit": "Select a PDF to edit", + "chooseFromStorage": "Choose a file from storage or upload a new PDF", + "chooseFromStorageMultiple": "Choose files from storage or upload new PDFs", + "loadFromStorage": "Load from Storage", + "filesAvailable": "files available", + "loading": "Laster...", + "or": "or", + "dropFileHere": "Drop file here or click to upload", + "dropFilesHere": "Drop files here or click the upload button", + "pdfFilesOnly": "PDF files only", + "supportedFileTypes": "Supported file types", + "upload": "Upload", + "uploadFile": "Upload File", + "uploadFiles": "Upload Files", + "noFilesInStorage": "No files available in storage. Upload some files first.", + "selectFromStorage": "Select from Storage", + "backToTools": "Back to Tools", + "addFiles": "Add Files", + "dragFilesInOrClick": "Drag files in or click \"Add Files\" to browse" + }, + "fileEditor": { + "addFiles": "Add Files" }, "fileManager": { + "title": "Upload PDF Files", + "subtitle": "Add files to your storage for easy access across tools", + "filesSelected": "files selected", + "clearSelection": "Clear Selection", + "openInFileEditor": "Open in File Editor", + "uploadError": "Failed to upload some files.", + "failedToOpen": "Failed to open file. It may have been removed from storage.", + "failedToLoad": "Failed to load file to active set.", + "storageCleared": "Browser cleared storage. Files have been removed. Please re-upload.", + "clearAll": "Clear All", + "reloadFiles": "Reload Files", + "dragDrop": "Drag & Drop files here", + "clickToUpload": "Click to upload files", + "selectedFiles": "Selected Files", + "storage": "Storage", + "filesStored": "files stored", + "storageError": "Storage error occurred", + "storageLow": "Storage is running low. Consider removing old files.", + "supportMessage": "Powered by browser database storage for unlimited capacity", + "noFileSelected": "No files selected", + "showHistory": "Show History", + "hideHistory": "Hide History", + "fileHistory": "File History", + "loadingHistory": "Loading History...", + "lastModified": "Last Modified", + "toolChain": "Tools Applied", + "restore": "Restore", + "unzip": "Unzip", + "searchFiles": "Search files...", + "recent": "Recent", + "localFiles": "Local Files", + "googleDrive": "Google Drive", + "googleDriveShort": "Drive", + "myFiles": "My Files", + "noRecentFiles": "No recent files found", + "googleDriveNotAvailable": "Google Drive integration not available", + "openFiles": "Open Files", + "openFile": "Open File", + "details": "File Details", "fileName": "Navn", + "fileFormat": "Format", + "fileSize": "Size", "fileVersion": "Versjon", + "totalSelected": "Total Selected", + "dropFilesHere": "Drop files here", + "selectAll": "Select All", + "deselectAll": "Deselect All", + "deleteSelected": "Delete Selected", + "downloadSelected": "Download Selected", + "selectedCount": "{{count}} selected", "download": "Last ned", - "delete": "Slett" + "delete": "Slett", + "unsupported": "Unsupported", + "addToUpload": "Add to Upload", + "deleteAll": "Delete All", + "loadingFiles": "Loading files...", + "noFiles": "No files available", + "noFilesFound": "No files found matching your search", + "openInPageEditor": "Open in Page Editor", + "showAll": "Show All", + "sortByDate": "Sort by Date", + "sortByName": "Sort by Name", + "sortBySize": "Sort by Size" + }, + "storage": { + "temporaryNotice": "Files are stored temporarily in your browser and may be cleared automatically", + "storageLimit": "Storage limit", + "storageUsed": "Temporary Storage used", + "storageFull": "Storage is nearly full. Consider removing some files.", + "fileTooLarge": "File too large. Maximum size per file is", + "storageQuotaExceeded": "Storage quota exceeded. Please remove some files before uploading more.", + "approximateSize": "Approximate size" }, "sanitize": { + "title": "Sanitise", + "desc": "Remove potentially harmful elements from PDF files.", "submit": "Rensker PDF", + "completed": "Sanitisation completed successfully", + "error": { + "generic": "Sanitisation failed", + "failed": "An error occurred while sanitising the PDF." + }, + "filenamePrefix": "sanitised", + "sanitizationResults": "Sanitisation Results", "steps": { - "settings": "Innstillinger" + "files": "Files", + "settings": "Innstillinger", + "results": "Results" + }, + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "options": { + "title": "Sanitisation Options", + "note": "Select the elements you want to remove from the PDF. At least one option must be selected.", + "removeJavaScript": { + "label": "Remove JavaScript", + "desc": "Remove JavaScript actions and scripts from the PDF" + }, + "removeEmbeddedFiles": { + "label": "Remove Embedded Files", + "desc": "Remove any files embedded within the PDF" + }, + "removeXMPMetadata": { + "label": "Remove XMP Metadata", + "desc": "Remove XMP metadata from the PDF" + }, + "removeMetadata": { + "label": "Remove Document Metadata", + "desc": "Remove document information metadata (title, author, etc.)" + }, + "removeLinks": { + "label": "Remove Links", + "desc": "Remove external links and launch actions from the PDF" + }, + "removeFonts": { + "label": "Remove Fonts", + "desc": "Remove embedded fonts from the PDF" + } + } + }, + "addPassword": { + "title": "Legg til passord", + "desc": "Encrypt your PDF document with a password.", + "completed": "Password protection applied", + "submit": "Krypter", + "filenamePrefix": "encrypted", + "error": { + "failed": "An error occurred while encrypting the PDF." + }, + "passwords": { + "stepTitle": "Passwords & Encryption", + "completed": "Passwords configured", + "user": { + "label": "User Password", + "placeholder": "Enter user password" + }, + "owner": { + "label": "Owner Password", + "placeholder": "Enter owner password" + } + }, + "encryption": { + "keyLength": { + "label": "Encryption Key Length", + "40bit": "40-bit (Low)", + "128bit": "128-bit (Standard)", + "256bit": "256-bit (High)" + } + }, + "results": { + "title": "Encrypted PDFs" + }, + "tooltip": { + "header": { + "title": "Password Protection Overview" + }, + "passwords": { + "title": "Password Types", + "text": "User passwords restrict opening the document, while owner passwords control what can be done with the document once opened. You can set both or just one.", + "bullet1": "User Password: Required to open the PDF", + "bullet2": "Owner Password: Controls document permissions (not supported by all PDF viewers)" + }, + "encryption": { + "title": "Encryption Levels", + "text": "Higher encryption levels provide better security but may not be supported by older PDF viewers.", + "bullet1": "40-bit: Basic security, compatible with older viewers", + "bullet2": "128-bit: Standard security, widely supported", + "bullet3": "256-bit: Maximum security, requires modern viewers" + }, + "permissions": { + "title": "Endre tillatelser", + "text": "These permissions control what users can do with the PDF. Most effective when combined with an owner password." + } + }, + "tags": "sikker,trygghet", + "header": "Legg til passord (Krypter)", + "selectText": { + "1": "Velg PDF-fil for kryptering", + "2": "Brukerpassord", + "3": "Krypteringsnøkkellengde", + "4": "Høyere verdier er sterkere, men lavere verdier har bedre kompatibilitet.", + "5": "Tillatelser ÃĨ sette (Anbefales ÃĨ brukes sammen med eierpassord)", + "6": "Forhindre sammenstilling av dokumentet", + "7": "Forhindre innholdsekstraksjon", + "8": "Forhindre ekstraksjon for tilgjengelighet", + "9": "Forhindre utfylling av skjema", + "10": "Forhindre modifisering", + "11": "Forhindre annotasjonsmodifisering", + "12": "Forhindre utskrift", + "13": "Forhindre utskrift i ulike formater", + "14": "Eierpassord", + "15": "Begrenser hva som kan gjøres med dokumentet nÃĨr det er ÃĨpnet (Støttes ikke av alle leserprogrammer)", + "16": "Begrenser ÃĨpningen av dokumentet selv" } }, "changePermissions": { "title": "Endre tillatelser", + "desc": "Change document restrictions and permissions.", + "completed": "Permissions changed", "submit": "Endre tillatelser", + "error": { + "failed": "An error occurred while changing PDF permissions." + }, "permissions": { "preventAssembly": { "label": "Forhindre sammenstilling av dokumentet" @@ -1729,10 +4580,784 @@ "label": "Forhindre utskrift i ulike formater" } }, + "results": { + "title": "Modified PDFs" + }, "tooltip": { "header": { "title": "Endre tillatelser" + }, + "description": { + "text": "Changes document permissions, allowing/disallowing access to different features in PDF readers." + }, + "warning": { + "text": "To make these permissions unchangeable, use the Add Password tool to set an owner password." } } + }, + "removePassword": { + "title": "Fjern passord", + "desc": "Fjern passordbeskyttelse fra din PDF-dokument.", + "tags": "sikker,dekrypter,trygghet,upassord,slett passord", + "password": { + "stepTitle": "Fjern Passord", + "label": "NÃĨvÃĻrende Passord", + "placeholder": "Enter current password", + "completed": "Password configured" + }, + "filenamePrefix": "decrypted", + "error": { + "failed": "An error occurred while removing the password from the PDF." + }, + "tooltip": { + "description": "Removing password protection requires the password that was used to encrypt the PDF. This will decrypt the document, making it accessible without a password." + }, + "submit": "Fjern", + "results": { + "title": "Decrypted PDFs" + }, + "header": "Fjern passord (Dekrypter)", + "selectText": { + "1": "Velg PDF for ÃĨ dekryptere", + "2": "Passord" + } + }, + "automate": { + "title": "Automate", + "desc": "Build multi-step workflows by chaining together PDF actions. Ideal for recurring tasks.", + "invalidStep": "Invalid step", + "files": { + "placeholder": "Select files to process with this automation" + }, + "selection": { + "title": "Automation Selection", + "saved": { + "title": "Saved" + }, + "createNew": { + "title": "Create New Automation" + }, + "suggested": { + "title": "Suggested" + } + }, + "creation": { + "createTitle": "Create Automation", + "editTitle": "Edit Automation", + "intro": "Automations run tools sequentially. To get started, add tools in the order you want them to run.", + "name": { + "label": "Automation Name", + "placeholder": "My Automation" + }, + "description": { + "label": "Description (optional)", + "placeholder": "Describe what this automation does..." + }, + "tools": { + "selectTool": "Select a tool...", + "selected": "Selected Tools", + "remove": "Remove tool", + "configure": "Configure tool", + "notConfigured": "! Not Configured", + "addTool": "Add Tool", + "add": "Add a tool..." + }, + "save": "Save Automation", + "unsavedChanges": { + "title": "Unsaved Changes", + "message": "You have unsaved changes. Are you sure you want to go back? All changes will be lost.", + "cancel": "Cancel", + "confirm": "Go Back" + }, + "icon": { + "label": "Icon" + } + }, + "run": { + "title": "Run Automation" + }, + "sequence": { + "unnamed": "Unnamed Automation", + "steps": "{{count}} steps", + "running": "Running Automation...", + "run": "Run Automation", + "finish": "Finish" + }, + "reviewTitle": "Automation Results", + "config": { + "loading": "Loading tool configuration...", + "noSettings": "This tool does not have configurable settings.", + "title": "Configure {{toolName}}", + "description": "Configure the settings for this tool. These settings will be applied when the automation runs.", + "cancel": "Cancel", + "save": "Save Configuration" + }, + "copyToSaved": "Copy to Saved" + }, + "automation": { + "suggested": { + "securePdfIngestion": "Secure PDF Ingestion", + "securePdfIngestionDesc": "Comprehensive PDF processing workflow that sanitises documents, applies OCR with cleanup, converts to PDF/A format for long-term archival, and optimises file size.", + "emailPreparation": "Email Preparation", + "emailPreparationDesc": "Optimises PDFs for email distribution by compressing files, splitting large documents into 20MB chunks for email compatibility, and removing metadata for privacy.", + "secureWorkflow": "Security Workflow", + "secureWorkflowDesc": "Secures PDF documents by removing potentially malicious content like JavaScript and embedded files, then adds password protection to prevent unauthorised access. Password is set to 'password' by default.", + "processImages": "Process Images", + "processImagesDesc": "Converts multiple image files into a single PDF document, then applies OCR technology to extract searchable text from the images." + } + }, + "common": { + "copy": "Copy", + "copied": "Copied!", + "refresh": "Refresh", + "retry": "Retry", + "remaining": "remaining", + "used": "used", + "available": "available", + "cancel": "Cancel", + "preview": "Preview" + }, + "config": { + "overview": { + "title": "Application Configuration", + "description": "Current application settings and configuration details." + }, + "account": { + "overview": { + "title": "Account Settings", + "manageAccountPreferences": "Manage your account preferences", + "guestDescription": "You are signed in as a guest. Consider upgrading your account above." + }, + "upgrade": { + "title": "Upgrade Guest Account", + "description": "Link your account to preserve your history and access more features!", + "socialLogin": "Upgrade with Social Account", + "linkWith": "Link with", + "emailPassword": "or enter your email & password", + "email": "Email", + "emailPlaceholder": "Enter your email", + "password": "Password (optional)", + "passwordPlaceholder": "Set a password", + "passwordNote": "Leave empty to use email verification only", + "upgradeButton": "Upgrade Account" + } + }, + "apiKeys": { + "description": "Your API key for accessing Stirling's suite of PDF tools. Copy it to your project or refresh to generate a new one.", + "publicKeyAriaLabel": "Public API key", + "copyKeyAriaLabel": "Copy API key", + "refreshAriaLabel": "Refresh API key", + "includedCredits": "Included credits", + "purchasedCredits": "Purchased credits", + "totalCredits": "Total Credits", + "chartAriaLabel": "Credits usage: included {{includedUsed}} of {{includedTotal}}, purchased {{purchasedUsed}} of {{purchasedTotal}}", + "nextReset": "Next Reset", + "lastApiUse": "Last API Use", + "overlayMessage": "Generate a key to see credits and available credits", + "label": "API Key", + "guestInfo": "Guest users do not receive API keys. Create an account to get an API key you can use in your applications.", + "goToAccount": "Go to Account", + "refreshModal": { + "title": "Refresh API Keys", + "warning": "âš ī¸ Warning: This action will generate new API keys and make your previous keys invalid.", + "impact": "Any applications or services currently using these keys will stop working until you update them with the new keys.", + "confirmPrompt": "Are you sure you want to continue?", + "confirmCta": "Refresh Keys" + }, + "generateError": "We couldn't generate your API key." + } + }, + "AddAttachmentsRequest": { + "attachments": "Select Attachments", + "info": "Select files to attach to your PDF. These files will be embedded and accessible through the PDF's attachment panel.", + "selectFiles": "Select Files to Attach", + "placeholder": "Choose files...", + "addMoreFiles": "Add more files...", + "selectedFiles": "Selected Files", + "submit": "Add Attachments", + "results": { + "title": "Attachment Results" + }, + "error": { + "failed": "Add attachments operation failed" + } + }, + "termsAndConditions": "Terms & Conditions", + "logOut": "Log out", + "addAttachments": { + "error": { + "failed": "An error occurred while adding attachments to the PDF." + } + }, + "autoRename": { + "description": "This tool will automatically rename PDF files based on their content. It analyzes the document to find the most suitable title from the text." + }, + "customPosition": "Custom Position", + "details": "Details", + "downloadUnavailable": "Download unavailable for this item", + "invalidUndoData": "Cannot undo: invalid operation data", + "margin": { + "large": "Large", + "medium": "Medium", + "small": "Small", + "xLarge": "Extra Large" + }, + "noFilesToUndo": "Cannot undo: no files were processed in the last operation", + "noOperationToUndo": "No operation to undo", + "noValidFiles": "No valid files to process", + "operationCancelled": "Operation cancelled", + "pageEdit": { + "deselectAll": "Select None", + "selectAll": "Select All" + }, + "quickPosition": "Quick Position", + "reorganizePages": { + "error": { + "failed": "Failed to reorganize pages" + }, + "results": { + "title": "Pages Reorganized" + }, + "settings": { + "title": "Settings" + }, + "submit": "Reorganize Pages" + }, + "replace-color": { + "options": { + "fill": "Fill colour", + "gradient": "Gradient" + }, + "previewOverlayOpacity": "Preview overlay opacity", + "previewOverlayTransparency": "Preview overlay transparency", + "previewOverlayVisibility": "Show preview overlay", + "selectText": { + "1": "Erstatt eller Inverter farge alternativer", + "2": "Standard(Standard høy kontrast farger)", + "3": "Tilpasset(Tilpassede farger)", + "4": "Full-Invertering(Inverter alle farger)", + "5": "Høy kontrast fargealternativer", + "6": "hvit tekst pÃĨ svart bakgrunn", + "7": "Svart tekst pÃĨ hvit bakgrunn", + "8": "Gul tekst pÃĨ svart bakgrunn", + "9": "Grønn tekst pÃĨ svart bakgrunn", + "10": "Velg tekstfarge", + "11": "Velg bakgrunnsfarge", + "12": "Choose start colour", + "13": "Choose end colour" + }, + "submit": "Erstatt", + "title": "Erstatt-Inverter-Farge", + "header": "Erstatt-Inverter Farge PDF" + }, + "size": "Size", + "submit": "Submit", + "success": "Success", + "tools": { + "noSearchResults": "No tools found", + "noTools": "No tools available" + }, + "undoDataMismatch": "Cannot undo: operation data is corrupted", + "undoFailed": "Failed to undo operation", + "undoQuotaError": "Cannot undo: insufficient storage space", + "undoStorageError": "Undo completed but some files could not be saved to storage", + "undoSuccess": "Operation undone successfully", + "unsupported": "Unsupported", + "onboarding": { + "welcomeModal": { + "title": "Welcome to Stirling PDF!", + "description": "Would you like to take a quick 1-minute tour to learn the key features and how to get started?", + "helpHint": "You can always access this tour later from the Help button in the bottom left.", + "startTour": "Start Tour", + "maybeLater": "Maybe Later", + "dontShowAgain": "Don't Show Again" + }, + "allTools": "This is the All Tools panel, where you can browse and select from all available PDF tools.", + "selectCropTool": "Let's select the Crop tool to demonstrate how to use one of the tools.", + "toolInterface": "This is the Crop tool interface. As you can see, there's not much there because we haven't added any PDF files to work with yet.", + "filesButton": "The Files button on the Quick Access bar allows you to upload PDFs to use the tools on.", + "fileSources": "You can upload new files or access recent files from here. For the tour, we'll just use a sample file.", + "workbench": "This is the Workbench - the main area where you view and edit your PDFs.", + "viewSwitcher": "Use these controls to select how you want to view your PDFs.", + "viewer": "The Viewer lets you read and annotate your PDFs.", + "pageEditor": "The Page Editor allows you to do various operations on the pages within your PDFs, such as reordering, rotating and deleting.", + "activeFiles": "The Active Files view shows all of the PDFs you have loaded into the tool, and allows you to select which ones to process.", + "fileCheckbox": "Clicking one of the files selects it for processing. You can select multiple files for batch operations.", + "selectControls": "The Right Rail contains buttons to quickly select/deselect all of your active PDFs, along with buttons to change the app's theme or language.", + "cropSettings": "Now that we've selected the file we want crop, we can configure the Crop tool to choose the area that we want to crop the PDF to.", + "runButton": "Once the tool has been configured, this button allows you to run the tool on all the selected PDFs.", + "results": "After the tool has finished running, the Review step will show a preview of the results in this panel, and allow you to undo the operation or download the file. ", + "fileReplacement": "The modified file will replace the original file in the Workbench automatically, allowing you to easily run it through more tools.", + "pinButton": "You can use the Pin button if you'd rather your files stay active after running tools on them.", + "wrapUp": "You're all set! You've learnt about the main areas of the app and how to use them. Click the Help button whenever you like to see this tour again.", + "previous": "Previous", + "next": "Next", + "finish": "Finish", + "startTour": "Start Tour", + "startTourDescription": "Take a guided tour of Stirling PDF's key features" + }, + "workspace": { + "title": "Workspace", + "people": { + "title": "People", + "description": "Manage workspace members and their permissions", + "loading": "Loading people...", + "searchMembers": "Search members...", + "addMembers": "Add Members", + "inviteMembers": { + "label": "Invite Members", + "subtitle": "Type or paste in emails below, separated by commas. Your workspace will be billed by members." + }, + "user": "User", + "role": "Role", + "team": "Team", + "status": "Status", + "actions": "Actions", + "noMembersFound": "No members found", + "active": "Active", + "disabled": "Disabled", + "activeSession": "Active session", + "member": "Member", + "admin": "Admin", + "roleDescriptions": { + "admin": "Can manage settings and invite members, with full administrative access.", + "member": "Can view and edit shared files, but cannot manage workspace settings or members." + }, + "editRole": "Edit Role", + "enable": "Enable", + "disable": "Disable", + "deleteUser": "Delete User", + "deleteUserSuccess": "User deleted successfully", + "deleteUserError": "Failed to delete user", + "confirmDelete": "Are you sure you want to delete this user? This action cannot be undone.", + "addMember": { + "title": "Add Member", + "username": "Username (Email)", + "usernamePlaceholder": "user@example.com", + "password": "Password", + "passwordPlaceholder": "Enter password", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "forcePasswordChange": "Force password change on first login", + "cancel": "Cancel", + "submit": "Add Member", + "usernameRequired": "Username and password are required", + "passwordTooShort": "Password must be at least 6 characters", + "success": "User created successfully", + "error": "Failed to create user" + }, + "editMember": { + "title": "Edit Member", + "editing": "Editing:", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "cancel": "Cancel", + "submit": "Update Member", + "success": "User updated successfully", + "error": "Failed to update user" + }, + "toggleEnabled": { + "success": "User status updated successfully", + "error": "Failed to update user status" + }, + "delete": { + "success": "User deleted successfully", + "error": "Failed to delete user" + }, + "emailInvite": { + "tab": "Email Invite", + "description": "Type or paste in emails below, separated by commas. Users will receive login credentials via email.", + "emails": "Email Addresses", + "emailsPlaceholder": "user1@example.com, user2@example.com", + "emailsRequired": "At least one email address is required", + "submit": "Send Invites", + "success": "user(s) invited successfully", + "partialSuccess": "Some invites failed", + "allFailed": "Failed to invite users", + "error": "Failed to send invites" + }, + "directInvite": { + "tab": "Direct Create" + }, + "inviteLinkTab": { + "tab": "Invite Link" + }, + "inviteLink": { + "description": "Generate a secure link that allows the user to set their own password", + "email": "Email Address", + "emailPlaceholder": "user@example.com (optional)", + "emailDescription": "Optional - leave blank for a general invite link that can be used by anyone", + "emailRequired": "Email address is required", + "emailOptional": "Optional - leave blank for a general invite link", + "emailRequiredForSend": "Email address is required to send email notification", + "expiryHours": "Expiry Hours", + "expiryDescription": "How many hours until the link expires", + "sendEmail": "Send invite link via email", + "sendEmailDescription": "If enabled, the invite link will be sent to the specified email address", + "smtpRequired": "SMTP not configured", + "generate": "Generate Link", + "generated": "Invite Link Generated", + "copied": "Link copied to clipboard", + "success": "Invite link generated successfully", + "successWithEmail": "Invite link generated and sent via email", + "emailFailed": "Invite link generated, but email failed", + "emailFailedDetails": "Error: {0}. Please share the invite link manually.", + "error": "Failed to generate invite link", + "submit": "Generate Invite Link" + }, + "inviteMode": { + "username": "Username", + "email": "Email", + "link": "Link", + "emailDisabled": "Email invites require SMTP configuration and mail.enableInvites=true in settings" + }, + "license": { + "users": "users", + "availableSlots": "Available Slots", + "grandfathered": "Grandfathered", + "grandfatheredShort": "{{count}} grandfathered", + "fromLicense": "from license", + "slotsAvailable": "{{count}} user slot(s) available", + "noSlotsAvailable": "No slots available", + "currentUsage": "Currently using {{current}} of {{max}} user licences" + } + }, + "teams": { + "title": "Teams", + "description": "Manage teams and organize workspace members", + "loading": "Loading teams...", + "loadingDetails": "Loading team details...", + "createNewTeam": "Create New Team", + "teamName": "Team Name", + "totalMembers": "Total Members", + "actions": "Actions", + "noTeamsFound": "No teams found", + "noMembers": "No members in this team", + "system": "System", + "addMember": "Add Member", + "viewTeam": "View Team", + "removeMember": "Remove from team", + "cannotRemoveFromSystemTeam": "Cannot remove from system team", + "renameTeamLabel": "Rename Team", + "deleteTeamLabel": "Delete Team", + "cannotDeleteInternal": "Cannot delete the Internal team", + "confirmDelete": "Are you sure you want to delete this team? This team must be empty to delete.", + "confirmRemove": "Remove user from this team?", + "cannotRenameInternal": "Cannot rename the Internal team", + "cannotAddToInternal": "Cannot add members to the Internal team", + "teamNotFound": "Team not found", + "backToTeams": "Back to Teams", + "memberCount": "{{count}} members", + "removeMemberSuccess": "User removed from team", + "removeMemberError": "Failed to remove user from team", + "createTeam": { + "title": "Create New Team", + "teamName": "Team Name", + "teamNamePlaceholder": "Enter team name", + "cancel": "Cancel", + "submit": "Create Team", + "nameRequired": "Team name is required", + "success": "Team created successfully", + "error": "Failed to create team" + }, + "renameTeam": { + "title": "Rename Team", + "renaming": "Renaming:", + "newTeamName": "New Team Name", + "newTeamNamePlaceholder": "Enter new team name", + "cancel": "Cancel", + "submit": "Rename Team", + "nameRequired": "Team name is required", + "success": "Team renamed successfully", + "error": "Failed to rename team" + }, + "deleteTeam": { + "success": "Team deleted successfully", + "error": "Failed to delete team. Make sure the team is empty.", + "teamMustBeEmpty": "Team must be empty before deletion" + }, + "addMemberToTeam": { + "title": "Add Member to Team", + "addingTo": "Adding to", + "selectUser": "Select User", + "selectUserPlaceholder": "Choose a user", + "selectUserRequired": "Please select a user", + "currentlyIn": "currently in", + "willBeMoved": "Note: This user will be moved from their current team to this team.", + "cancel": "Cancel", + "submit": "Add Member", + "userRequired": "Please select a user", + "success": "Member added to team successfully", + "error": "Failed to add member to team" + }, + "changeTeam": { + "label": "Change Team", + "title": "Change Team", + "changing": "Moving", + "selectTeam": "Select Team", + "selectTeamPlaceholder": "Choose a team", + "selectTeamRequired": "Please select a team", + "success": "Team changed successfully", + "error": "Failed to change team", + "submit": "Change Team" + } + } + }, + "plan": { + "currency": "Currency", + "popular": "Popular", + "current": "Current Plan", + "upgrade": "Upgrade", + "contact": "Contact Us", + "customPricing": "Custom", + "showComparison": "Compare All Features", + "hideComparison": "Hide Feature Comparison", + "featureComparison": "Feature Comparison", + "activePlan": { + "title": "Active Plan", + "subtitle": "Your current subscription details" + }, + "availablePlans": { + "title": "Available Plans", + "subtitle": "Choose the plan that fits your needs" + }, + "static": { + "title": "Billing Information", + "message": "Online billing is not currently configured. To upgrade your plan or manage subscriptions, please contact us directly.", + "contactSales": "Contact Sales", + "contactToUpgrade": "Contact us to upgrade or customize your plan", + "maxUsers": "Max Users", + "upTo": "Up to" + }, + "period": { + "month": "month" + }, + "free": { + "name": "Free", + "highlight1": "Limited Tool Usage Per week", + "highlight2": "Access to all tools", + "highlight3": "Community support" + }, + "pro": { + "name": "Pro", + "highlight1": "Unlimited Tool Usage", + "highlight2": "Advanced PDF tools", + "highlight3": "No watermarks" + }, + "enterprise": { + "name": "Enterprise", + "highlight1": "Custom pricing", + "highlight2": "Dedicated support", + "highlight3": "Latest features" + }, + "feature": { + "title": "Feature", + "pdfTools": "Basic PDF Tools", + "fileSize": "File Size Limit", + "automation": "Automate tool workflows", + "api": "API Access", + "priority": "Priority Support", + "customPricing": "Custom Pricing" + } + }, + "subscription": { + "status": { + "active": "Active", + "pastDue": "Past Due", + "canceled": "Canceled", + "incomplete": "Incomplete", + "trialing": "Trial", + "none": "No Subscription" + }, + "renewsOn": "Renews on {{date}}", + "cancelsOn": "Cancels on {{date}}" + }, + "billing": { + "manageBilling": "Manage Billing", + "portal": { + "error": "Failed to open billing portal" + } + }, + "payment": { + "preparing": "Preparing your checkout...", + "upgradeTitle": "Upgrade to {{planName}}", + "success": "Payment Successful!", + "successMessage": "Your subscription has been activated successfully. You will receive a confirmation email shortly.", + "autoClose": "This window will close automatically...", + "error": "Payment Error" + }, + "firstLogin": { + "title": "First Time Login", + "welcomeTitle": "Welcome!", + "welcomeMessage": "For security reasons, you must change your password on your first login.", + "loggedInAs": "Logged in as", + "error": "Error", + "currentPassword": "Current Password", + "enterCurrentPassword": "Enter your current password", + "newPassword": "New Password", + "enterNewPassword": "Enter new password (min 8 characters)", + "confirmPassword": "Confirm New Password", + "reEnterNewPassword": "Re-enter new password", + "changePassword": "Change Password", + "allFieldsRequired": "All fields are required", + "passwordsDoNotMatch": "New passwords do not match", + "passwordTooShort": "Password must be at least 8 characters", + "passwordMustBeDifferent": "New password must be different from current password", + "passwordChangedSuccess": "Password changed successfully! Please log in again.", + "passwordChangeFailed": "Failed to change password. Please check your current password." + }, + "invite": { + "welcome": "Welcome to Stirling PDF", + "invalidToken": "Invalid invitation link", + "validationError": "Failed to validate invitation link", + "passwordRequired": "Password is required", + "passwordTooShort": "Password must be at least 6 characters", + "passwordMismatch": "Passwords do not match", + "acceptError": "Failed to create account", + "validating": "Validating invitation...", + "invalidInvitation": "Invalid Invitation", + "goToLogin": "Go to Login", + "welcomeTitle": "You've been invited!", + "welcomeSubtitle": "Complete your account setup to get started", + "accountFor": "Creating account for", + "linkExpires": "Link expires", + "email": "Email address", + "emailPlaceholder": "Enter your email address", + "emailRequired": "Email address is required", + "invalidEmail": "Invalid email address", + "choosePassword": "Choose a password", + "passwordPlaceholder": "Enter your password", + "confirmPassword": "Confirm password", + "confirmPasswordPlaceholder": "Re-enter your password", + "createAccount": "Create Account", + "creating": "Creating Account...", + "alreadyHaveAccount": "Already have an account?", + "signIn": "Sign in" + }, + "audit": { + "error": { + "title": "Error loading audit system" + }, + "notAvailable": "Audit system not available", + "notAvailableMessage": "The audit system is not configured or not available.", + "disabled": "Audit logging is disabled", + "disabledMessage": "Enable audit logging in your application configuration to track system events.", + "systemStatus": { + "title": "System Status", + "status": "Audit Logging", + "enabled": "Enabled", + "disabled": "Disabled", + "level": "Audit Level", + "retention": "Retention Period", + "days": "days", + "totalEvents": "Total Events" + }, + "tabs": { + "dashboard": "Dashboard", + "events": "Audit Events", + "export": "Export" + }, + "charts": { + "title": "Audit Dashboard", + "error": "Error loading charts", + "day": "Day", + "week": "Week", + "month": "Month", + "byType": "Events by Type", + "byUser": "Events by User", + "overTime": "Events Over Time" + }, + "events": { + "title": "Audit Events", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "error": "Error loading events", + "noEvents": "No events found", + "timestamp": "Timestamp", + "type": "Type", + "user": "User", + "ipAddress": "IP Address", + "actions": "Actions", + "viewDetails": "View Details", + "eventDetails": "Event Details", + "details": "Details" + }, + "export": { + "title": "Export Audit Data", + "description": "Export audit events to CSV or JSON format. Use filters to limit the exported data.", + "format": "Export Format", + "filters": "Filters (Optional)", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "exportButton": "Export Data", + "error": "Failed to export data" + } + }, + "usage": { + "noData": "No data available", + "error": "Error loading usage statistics", + "noDataMessage": "No usage statistics are currently available.", + "controls": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All", + "refresh": "Refresh", + "dataTypeLabel": "Data Type:", + "dataType": { + "all": "All", + "api": "API", + "ui": "UI" + } + }, + "showing": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All" + }, + "stats": { + "totalEndpoints": "Total Endpoints", + "totalVisits": "Total Visits", + "showing": "Showing", + "selectedVisits": "Selected Visits" + }, + "chart": { + "title": "Endpoint Usage Chart" + }, + "table": { + "title": "Detailed Statistics", + "endpoint": "Endpoint", + "visits": "Visits", + "percentage": "Percentage", + "noData": "No data available" + } + }, + "backendHealth": { + "checking": "Checking backend status...", + "online": "Backend Online", + "offline": "Backend Offline" + }, + "autoRedact": { + "tags": "Sensurere,Skjule,sverte ut,svart,markør,skjult", + "title": "Automatisk Sensurering", + "header": "Automatisk Sensurering", + "colorLabel": "Farge", + "textsToRedactLabel": "Tekst som skal sensureres (linje-separert)", + "textsToRedactPlaceholder": "f.eks. \\nKonfidensiell \\nTopp-hemmelig", + "useRegexLabel": "Bruk Regex", + "wholeWordSearchLabel": "Hele ordsøk", + "customPaddingLabel": "Tilpasset ekstra polstring", + "convertPDFToImageLabel": "Konverter PDF til PDF-bilde (Brukes for ÃĨ fjerne tekst bak boksen)", + "submitButton": "Send inn" + }, + "replaceColorPdf": { + "tags": "Erstatt Farge,Sideoperasjoner,Backend,serverside" } -} \ No newline at end of file +} diff --git a/frontend/public/locales/pl-PL/translation.json b/frontend/public/locales/pl-PL/translation.json index cda6625d6..ac047a468 100644 --- a/frontend/public/locales/pl-PL/translation.json +++ b/frontend/public/locales/pl-PL/translation.json @@ -1,4 +1,40 @@ { + "toolPanel": { + "modePrompt": { + "title": "Choose how you browse tools", + "description": "Preview both layouts and decide how you want to explore Stirling PDF tools.", + "sidebarTitle": "Sidebar mode", + "sidebarDescription": "Keep tools alongside your workspace for quick switching.", + "recommended": "Recommended", + "chooseSidebar": "Use sidebar mode", + "fullscreenTitle": "Fullscreen mode - (legacy)", + "fullscreenDescription": "Browse every tool in a catalogue that covers the workspace until you pick one.", + "chooseFullscreen": "Use fullscreen mode", + "dismiss": "Maybe later" + }, + "fullscreen": { + "showDetails": "Show Details", + "comingSoon": "Coming soon:", + "favorite": "Add to favourites", + "favorites": "Favourites", + "heading": "All tools (fullscreen view)", + "noResults": "Try adjusting your search or toggle descriptions to find what you need.", + "recommended": "Recommended", + "unfavorite": "Remove from favourites" + }, + "placeholder": "Choose a tool to get started", + "toggle": { + "fullscreen": "Switch to fullscreen mode", + "sidebar": "Switch to sidebar mode" + } + }, + "unsavedChanges": "You have unsaved changes to your PDF.", + "areYouSure": "Are you sure you want to leave?", + "unsavedChangesTitle": "Unsaved Changes", + "keepWorking": "Keep Working", + "discardChanges": "Discard & Leave", + "applyAndContinue": "Save & Leave", + "exportAndContinue": "Export & Continue", "language": { "direction": "ltr" }, @@ -18,8 +54,26 @@ "customTextDesc": "Tekst własny", "numberPagesDesc": "Strony do numeracji, wszystkie (all), 1-5, 2, 5, 9", "customNumberDesc": "Domyślnie do {n}, rÃŗwnieÅŧ akceptuje 'Strona {n} z {total},Teskt-{n},'{filename}-{n}", - "submit": "Dodaj numerację stron" + "submit": "Dodaj numerację stron", + "configuration": "Configuration", + "customize": "Customize Appearance", + "pagesAndStarting": "Pages & Starting Number", + "positionAndPages": "Position & Pages", + "error": { + "failed": "Add page numbers operation failed" + }, + "results": { + "title": "Page Number Results" + }, + "preview": "Position Selection", + "previewDisclaimer": "Preview is approximate. Final output may vary due to PDF font metrics." }, + "pageSelectionPrompt": "Niestandardowy wybÃŗr strony (Enter a comma-separated list of page numbers 1,5,6 or Functions like 2n+1) :", + "startingNumberTooltip": "The first number to display. Subsequent pages will increment from this number.", + "marginTooltip": "Distance between the page number and the edge of the page.", + "fontSizeTooltip": "Size of the page number text in points. Larger numbers create bigger text.", + "fontTypeTooltip": "Font family for the page numbers. Choose based on your document style.", + "customTextTooltip": "Optional custom format for page numbers. Use {n} as placeholder for the number. Example: \"Page {n}\" will show \"Page 1\", \"Page 2\", etc.", "pdfPrompt": "Wybierz PDF", "multiPdfPrompt": "Wybierz PDF (2+)", "multiPdfDropPrompt": "Wybierz (lub przeciągnij i puść) wszystkie dokumenty PDF", @@ -30,15 +84,41 @@ "uploadLimitExceededPlural": "are too large. Maximum allowed size is", "processTimeWarning": "OstrzeÅŧenie: Ten proces moÅŧe potrwać do minuty, w zaleÅŧności od rozmiaru pliku", "pageOrderPrompt": "Kolejność stron (wprowadÅē listę numerÃŗw stron oddzielonych przecinkami) :", - "pageSelectionPrompt": "Niestandardowy wybÃŗr strony (Enter a comma-separated list of page numbers 1,5,6 or Functions like 2n+1) :", "goToPage": "IdÅē", "true": "Tak", "false": "Nie", "unknown": "Nieznany", + "app": { + "description": "The Free Adobe Acrobat alternative (10M+ Downloads)" + }, "save": "Zapisz", "saveToBrowser": "Zapisz w przeglądarce", + "download": "Pobierz", + "pin": "Pin File (keep active after tool run)", + "unpin": "Unpin File (replace after tool run)", + "undoOperationTooltip": "Click to undo the last operation and restore the original files", + "undo": "Cofnij", + "moreOptions": "More Options", + "editYourNewFiles": "Edit your new file(s)", "close": "Zamknij", + "openInViewer": "Open in Viewer", + "confirmClose": "Confirm Close", + "confirmCloseMessage": "Are you sure you want to close this file?", + "confirmCloseCancel": "Cancel", + "confirmCloseConfirm": "Close File", + "fileSelected": "Selected: {{filename}}", + "chooseFile": "Choose File", "filesSelected": "wybrane pliki", + "files": { + "title": "Files", + "upload": "Upload", + "uploadFiles": "Upload Files", + "addFiles": "Add files", + "selectFromWorkbench": "Select files from the workbench or ", + "selectMultipleFromWorkbench": "Select at least {{count}} files from the workbench or ", + "created": "Created", + "size": "File Size" + }, "noFavourites": "Nie dodano ulubionych", "downloadComplete": "Pobieranie zakończone", "bored": "Znudzony czekaniem?", @@ -56,7 +136,10 @@ }, "error": { "pdfPassword": "Dokument PDF jest zabezpieczony hasłem, musisz podać prawidłowe hasło.", + "encryptedPdfMustRemovePassword": "This PDF is encrypted or password-protected. Please unlock it before converting to PDF/A.", + "incorrectPasswordProvided": "The PDF password is incorrect or not provided.", "_value": "błąd", + "dismissAllErrors": "Dismiss All Errors", "sorry": "Przykro nam z powodu problemu!", "needHelp": "Potrzebujesz pomocy/znalazłem usterkę?", "contactTip": "Jeśli ciągle masz problem, skontakuj się z nami. Wyślij zgłoszenia na naszej stronie GitHub albo za pomocą Discorda:", @@ -71,6 +154,10 @@ "githubSubmit": "GitHub - wyślij zgłoszenie", "discordSubmit": "Discord - wyślij posta z prośbą o pomoc" }, + "warning": { + "tooltipTitle": "Warning" + }, + "edit": "Edit", "delete": "usuń", "username": "nazwa uÅŧytkownika", "password": "hasło", @@ -82,6 +169,7 @@ "green": "zielony", "blue": "niebieski", "custom": "Własny...", + "comingSoon": "Coming soon", "WorkInProgess": "Praca w toku, proszę zgłaszać błędy!", "poweredBy": "Zasilany", "yes": "tak", @@ -115,12 +203,14 @@ "page": "Strona", "pages": "Strony", "loading": "Ładowanie...", + "review": "Review", "addToDoc": "Dodaj do dokumentu", "reset": "Resetuj", "apply": "Zastosuj", "noFileSelected": "No file selected. Please upload one.", "legal": { "privacy": "Polityka Prywatności", + "iAgreeToThe": "I agree to all of the", "terms": "Zasady i Postanowienia", "accessibility": "Dostępność", "cookie": "Polityka plikÃŗw cookie", @@ -160,6 +250,7 @@ "title": "Czy chcesz ulepszyć Stirling PDF?", "paragraph1": "Stirling PDF ma opcję analizy, ktÃŗra pomaga nam udoskonalać produkt. Nie śledzimy Åŧadnych danych osobowych ani zawartości plikÃŗw.", "paragraph2": "RozwaÅŧ włączenie funkcji analitycznych, ktÃŗre pomogą w rozwoju Stirling-PDF i pozwolą nam lepiej zrozumieć naszych uÅŧytkownikÃŗw.", + "learnMore": "Learn more", "enable": "Włącz analitykę", "disable": "Wyłącz analitykę", "settings": "MoÅŧesz zmienić ustawienia analityki w pliku config/settings.yml" @@ -203,6 +294,54 @@ "cacheInputs": { "name": "Zapisz dane formularzy", "help": "Włącz aby zapisać dane dla przyszłych automatyzacji" + }, + "general": { + "title": "General", + "description": "Configure general application preferences.", + "account": "Account", + "accountDescription": "Manage your account settings", + "user": "User", + "signedInAs": "Signed in as", + "logout": "Log out", + "enableFeatures": { + "title": "For System Administrators", + "intro": "Enable user authentication, team management, and workspace features for your organization.", + "action": "Configure", + "and": "and", + "benefit": "Enables user roles, team collaboration, admin controls, and enterprise features.", + "learnMore": "Learn more in documentation", + "dismiss": "Dismiss" + }, + "autoUnzip": "Auto-unzip API responses", + "autoUnzipDescription": "Automatically extract files from ZIP responses", + "autoUnzipTooltip": "Automatically extract ZIP files returned from API operations. Disable to keep ZIP files intact. This does not affect automation workflows.", + "autoUnzipFileLimit": "Auto-unzip file limit", + "autoUnzipFileLimitDescription": "Maximum number of files to extract from ZIP", + "autoUnzipFileLimitTooltip": "Only unzip if the ZIP contains this many files or fewer. Set higher to extract larger ZIPs.", + "defaultToolPickerMode": "Default tool picker mode", + "defaultToolPickerModeDescription": "Choose whether the tool picker opens in fullscreen or sidebar by default", + "mode": { + "fullscreen": "Fullscreen", + "sidebar": "Sidebar" + } + }, + "hotkeys": { + "title": "Keyboard Shortcuts", + "description": "Hover a tool to see its shortcut or customise it below. Click \"Change shortcut\" and press a new key combination. Press Esc to cancel.", + "errorModifier": { + "mac": "Include ⌘ (Command), âŒĨ (Option), or another modifier in your shortcut.", + "windows": "Include Ctrl, Alt, or another modifier in your shortcut." + }, + "errorConflict": "Shortcut already used by {{tool}}.", + "none": "Not assigned", + "customBadge": "Custom", + "defaultLabel": "Default: {{shortcut}}", + "capturing": "Press keysâ€Ļ (Esc to cancel)", + "change": "Change shortcut", + "reset": "Reset", + "shortcut": "Shortcut", + "noShortcut": "No shortcut set", + "searchPlaceholder": "Search tools..." } }, "changeCreds": { @@ -274,8 +413,10 @@ "top20": "Top 20", "all": "Wszystkie", "refresh": "OdświeÅŧ", - "includeHomepage": "Uwzględnij stronę gÅ‚Ãŗwną ('/')", - "includeLoginPage": "Uwzględnij stronę logowania ('/login')", + "dataTypeLabel": "Data Type:", + "dataTypeAll": "All", + "dataTypeApi": "API", + "dataTypeUi": "UI", "totalEndpoints": "Łączna liczba punktÃŗw końcowych", "totalVisits": "Łączna liczba wizyt", "showing": "Pokazuje", @@ -290,7 +431,9 @@ "top": "Top", "numberOfVisits": "Liczba wizyt", "visitsTooltip": "Wizyty: {0} ({1}% całości)", - "retry": "SprÃŗbuj ponownie" + "retry": "SprÃŗbuj ponownie", + "includeHomepage": "Uwzględnij stronę gÅ‚Ãŗwną ('/')", + "includeLoginPage": "Uwzględnij stronę logowania ('/login')" }, "database": { "title": "Import/Eksport bazy danych", @@ -331,22 +474,310 @@ "alphabetical": "Alfabetycznie", "globalPopularity": "Globalna popularność", "sortBy": "Sortuj według:", + "mobile": { + "brandAlt": "Stirling PDF logo", + "openFiles": "Open files", + "swipeHint": "Swipe left or right to switch views", + "tools": "Tools", + "toolsSlide": "Tool selection panel", + "viewSwitcher": "Switch workspace view", + "workbenchSlide": "Workspace panel", + "workspace": "Workspace" + }, "multiTool": { + "tags": "multiple,tools", "title": "Wielofunkcyjne Narzędzie PDF", "desc": "Łącz, dziel, obracaj, zmieniaj kolejność i usuwaj strony" }, "merge": { + "tags": "combine,join,unite", "title": "Połącz", "desc": "Łatwe łączenie wielu dokumentÃŗw PDF w jeden." }, "split": { + "tags": "divide,separate,break", "title": "Podziel", "desc": "Podziel dokument PDF na wiele dokumentÃŗw" }, "rotate": { + "tags": "turn,flip,orient", "title": "ObrÃŗÄ‡", "desc": "Łatwo obracaj dokumenty PDF." }, + "convert": { + "tags": "transform,change", + "title": "Konwertuj", + "desc": "Convert files between different formats" + }, + "pdfOrganiser": { + "tags": "organize,rearrange,reorder", + "title": "Uporządkuj", + "desc": "Usuń/Zmień kolejność stron w dowolnej kolejności" + }, + "addImage": { + "tags": "insert,embed,place", + "title": "Dodaj obraz", + "desc": "Dodaje obraz w wybranym miejscu w dokumencie PDF" + }, + "addAttachments": { + "tags": "embed,attach,include", + "title": "Add Attachments", + "desc": "Add or remove embedded files (attachments) to/from a PDF" + }, + "watermark": { + "tags": "stamp,mark,overlay", + "title": "Dodaj znak wodny", + "desc": "Dodaj niestandardowy znak wodny do dokumentu PDF." + }, + "removePassword": { + "tags": "unlock", + "title": "Usuń hasło", + "desc": "Usuń ochronę hasłem z dokumentu PDF." + }, + "compress": { + "tags": "shrink,reduce,optimize", + "title": "Kompresuj", + "desc": "Kompresuj dokumenty PDF, aby zmniejszyć ich rozmiar." + }, + "unlockPDFForms": { + "tags": "unlock,enable,edit", + "title": "Unlock PDF Forms", + "desc": "Remove read-only property of form fields in a PDF document." + }, + "changeMetadata": { + "tags": "edit,modify,update", + "title": "Zmień metadane", + "desc": "Zmień/Usuń/Dodaj metadane w dokumencie PDF" + }, + "ocr": { + "tags": "extract,scan", + "title": "OCR / Zamiana na tekst", + "desc": "OCR skanuje i wykrywa tekst z obrazÃŗw w dokumencie PDF i zamienia go na tekst." + }, + "extractImages": { + "tags": "pull,save,export", + "title": "Wyodrębnij obrazy", + "desc": "Wyodrębnia wszystkie obrazy z dokumentu PDF i zapisuje je w wybranym formacie" + }, + "scannerImageSplit": { + "tags": "detect,split,photos", + "title": "Detect & Split Scanned Photos", + "desc": "Detect and split scanned photos into separate pages" + }, + "sign": { + "tags": "signature,autograph", + "title": "Podpis", + "desc": "Dodaje podpis do dokumentu PDF za pomocą rysunku, tekstu lub obrazu" + }, + "flatten": { + "tags": "simplify,remove,interactive", + "title": "Spłaszcz", + "desc": "Usuń wszystkie interaktywne elementy i formularze z dokumentu PDF" + }, + "certSign": { + "tags": "authenticate,PEM,P12,official,encrypt,sign,certificate,PKCS12,JKS,server,manual,auto", + "title": "Podpisz certyfikatem", + "desc": "Podpisz dokument PDF za pomocą certyfikatu/klucza prywatnego (PEM/P12)" + }, + "repair": { + "tags": "fix,restore", + "title": "Napraw", + "desc": "SprÃŗbuj naprawić uszkodzony dokument PDF" + }, + "removeBlanks": { + "tags": "delete,clean,empty", + "title": "Usuń puste strony", + "desc": "Wykrywa i usuwa puste strony z dokumentu PDF" + }, + "removeAnnotations": { + "tags": "delete,clean,strip", + "title": "Usuń notatki/przypisy", + "desc": "Usuwa wszystkie notatki i przypisy z dokumentu PDF" + }, + "compare": { + "tags": "difference", + "title": "PorÃŗwnaj", + "desc": "PorÃŗwnuje i pokazuje rÃŗÅŧnice między dwoma dokumentami PDF" + }, + "removeCertSign": { + "tags": "remove,delete,unlock", + "title": "Usuń podpis certyfikatem", + "desc": "Usuń podpis certyfikatem z dokumentu PDF" + }, + "pageLayout": { + "tags": "layout,arrange,combine", + "title": "Układ wielu stron", + "desc": "Scal wiele stron dokumentu PDF w jedną stronę" + }, + "bookletImposition": { + "tags": "booklet,print,binding", + "title": "Booklet Imposition", + "desc": "Create booklets with proper page ordering and multi-page layout for printing and binding" + }, + "scalePages": { + "tags": "resize,adjust,scale", + "title": "Dopasuj rozmiar stron", + "desc": "Dopasuj rozmiar stron wybranego dokumentu PDF" + }, + "addPageNumbers": { + "tags": "number,pagination,count", + "title": "Dodaj numery stron", + "desc": "Dodaj numery strony w dokumencie PDF w podanej lokalizacji" + }, + "autoRename": { + "tags": "auto-detect,header-based,organize,relabel", + "title": "Auto Rename PDF File", + "desc": "Auto renames a PDF file based on its detected header" + }, + "adjustContrast": { + "tags": "contrast,brightness,saturation", + "title": "Zmień kolor/nasycenie/jasność", + "desc": "Zmień kolor/nasycenie/jasność w dokumencie PDF" + }, + "crop": { + "tags": "trim,cut,resize", + "title": "Przytnij PDF", + "desc": "Przytnij dokument PDF w celu zmniejszenia rozmiaru" + }, + "autoSplitPDF": { + "tags": "auto,split,QR", + "title": "Automatycznie podziel strony", + "desc": "Automatycznie podziel dokument na strony" + }, + "sanitize": { + "tags": "clean,purge,remove", + "title": "Sanitise", + "desc": "Remove potentially harmful elements from PDF files" + }, + "getPdfInfo": { + "tags": "info,metadata,details", + "title": "Pobierz informacje o pliku PDF", + "desc": "Pobiera wszelkie informacje o pliku PDF" + }, + "pdfToSinglePage": { + "tags": "combine,merge,single", + "title": "PDF do jednej strony", + "desc": "Łączy wszystkie strony PDFa w jedną wielką stronę PDF" + }, + "showJS": { + "tags": "javascript,code,script", + "title": "PokaÅŧ kod JavaScript", + "desc": "Znajduje i pokazuje załączony kod JS w dokumencie PDF" + }, + "redact": { + "tags": "censor,blackout,hide", + "title": "Manual Redaction", + "desc": "Redacts a PDF based on selected text, drawn shapes and/or selected page(s)" + }, + "splitBySections": { + "tags": "split,sections,divide", + "title": "Split PDF by Sections", + "desc": "Divide each page of a PDF into smaller horizontal and vertical sections" + }, + "addStamp": { + "tags": "stamp,mark,seal", + "title": "Add Stamp to PDF", + "desc": "Add text or add image stamps at set locations" + }, + "removeImage": { + "tags": "remove,delete,clean", + "title": "Usuń obraz", + "desc": "Usuń obraz z pliku PDF, aby zmniejszyć rozmiar pliku" + }, + "splitByChapters": { + "tags": "split,chapters,structure", + "title": "Podziel PDF według rozdziaÅ‚Ãŗw", + "desc": "Podział pliku PDF na wiele plikÃŗw na podstawie struktury rozdziaÅ‚Ãŗw." + }, + "validateSignature": { + "tags": "validate,verify,certificate", + "title": "SprawdÅē poprawność podpisu PDF", + "desc": "Weryfikuj podpisy cyfrowe i certyfikaty w dokumentach PDF" + }, + "swagger": { + "tags": "API,documentation,test", + "title": "API Documentation", + "desc": "View API documentation and test endpoints" + }, + "scannerEffect": { + "tags": "scan,simulate,create", + "title": "Scanner Effect", + "desc": "Create a PDF that looks like it was scanned" + }, + "editTableOfContents": { + "tags": "bookmarks,contents,edit", + "title": "Edit Table of Contents", + "desc": "Add or edit bookmarks and table of contents in PDF documents" + }, + "manageCertificates": { + "tags": "certificates,import,export", + "title": "Manage Certificates", + "desc": "Import, export, or delete digital certificate files used for signing PDFs." + }, + "read": { + "tags": "view,open,display", + "title": "Read", + "desc": "View and annotate PDFs. Highlight text, draw, or insert comments for review and collaboration." + }, + "reorganizePages": { + "tags": "rearrange,reorder,organize", + "title": "Reorganize Pages", + "desc": "Rearrange, duplicate, or delete PDF pages with visual drag-and-drop control." + }, + "extractPages": { + "tags": "pull,select,copy", + "title": "Wyciągnij stronę", + "desc": "Extract specific pages from a PDF document" + }, + "removePages": { + "tags": "delete,extract,exclude", + "title": "Usuń", + "desc": "Usuń niechciane strony z dokumentu PDF." + }, + "autoSizeSplitPDF": { + "tags": "auto,split,size", + "title": "Podziel (Rozmiar/Ilość stron)", + "desc": "Rozdziela dokument PDF na wiele dokumentÃŗw bazując na podanym rozmiarze, ilości stron bądÅē ilości dokumentÃŗw" + }, + "replaceColor": { + "title": "Replace & Invert Colour", + "desc": "Replace or invert colours in PDF documents" + }, + "devApi": { + "tags": "API,development,documentation", + "title": "API", + "desc": "Link to API documentation" + }, + "devFolderScanning": { + "tags": "automation,folder,scanning", + "title": "Automated Folder Scanning", + "desc": "Link to automated folder scanning guide" + }, + "devSsoGuide": { + "title": "SSO Guide", + "desc": "Link to SSO guide" + }, + "devAirgapped": { + "title": "Air-gapped Setup", + "desc": "Link to air-gapped setup guide" + }, + "addPassword": { + "title": "Dodaj hasło", + "desc": "Zaszyfruj dokument PDF za pomocą hasła." + }, + "changePermissions": { + "title": "Zmień uprawnienia", + "desc": "Change document restrictions and permissions" + }, + "automate": { + "tags": "workflow,sequence,automation", + "title": "Automate", + "desc": "Build multi-step workflows by chaining together PDF actions. Ideal for recurring tasks." + }, + "overlay-pdfs": { + "desc": "Nakłada dokumenty PDF na siebie", + "title": "NaÅ‚ÃŗÅŧ PDFa" + }, "imageToPDF": { "title": "Obraz na PDF", "desc": "Konwertuj obraz (PNG, JPEG, GIF) do dokumentu PDF." @@ -355,18 +786,6 @@ "title": "PDF na Obraz", "desc": "Konwertuj plik PDF na obraz (PNG, JPEG, GIF)." }, - "pdfOrganiser": { - "title": "Uporządkuj", - "desc": "Usuń/Zmień kolejność stron w dowolnej kolejności" - }, - "addImage": { - "title": "Dodaj obraz", - "desc": "Dodaje obraz w wybranym miejscu w dokumencie PDF" - }, - "watermark": { - "title": "Dodaj znak wodny", - "desc": "Dodaj niestandardowy znak wodny do dokumentu PDF." - }, "permissions": { "title": "Zmień uprawnienia", "desc": "Zmień uprawnienia dokumentu PDF" @@ -375,38 +794,10 @@ "title": "Usuń", "desc": "Usuń niechciane strony z dokumentu PDF." }, - "addPassword": { - "title": "Dodaj hasło", - "desc": "Zaszyfruj dokument PDF za pomocą hasła." - }, - "removePassword": { - "title": "Usuń hasło", - "desc": "Usuń ochronę hasłem z dokumentu PDF." - }, - "compress": { - "title": "Kompresuj", - "desc": "Kompresuj dokumenty PDF, aby zmniejszyć ich rozmiar." - }, - "unlockPDFForms": { - "title": "Unlock PDF Forms", - "desc": "Remove read-only property of form fields in a PDF document." - }, - "changeMetadata": { - "title": "Zmień metadane", - "desc": "Zmień/Usuń/Dodaj metadane w dokumencie PDF" - }, "fileToPDF": { "title": "Konwertuj plik do PDF", "desc": "Konwertuj dowolny plik do dokumentu PDF (DOCX, PNG, XLS, PPT, TXT i więcej)" }, - "ocr": { - "title": "OCR / Zamiana na tekst", - "desc": "OCR skanuje i wykrywa tekst z obrazÃŗw w dokumencie PDF i zamienia go na tekst." - }, - "extractImages": { - "title": "Wyodrębnij obrazy", - "desc": "Wyodrębnia wszystkie obrazy z dokumentu PDF i zapisuje je w wybranym formacie" - }, "pdfToPDFA": { "title": "PDF na PDF/A", "desc": "Konwertuj dokument PDF na PDF/A w celu długoterminowego przechowywania" @@ -435,70 +826,14 @@ "title": "Wykryj/Podziel zeskanowane zdjęcia", "desc": "Podziel na wiele zdjęć z jednego zdjęcia/PDF" }, - "sign": { - "title": "Podpis", - "desc": "Dodaje podpis do dokumentu PDF za pomocą rysunku, tekstu lub obrazu" - }, - "flatten": { - "title": "Spłaszcz", - "desc": "Usuń wszystkie interaktywne elementy i formularze z dokumentu PDF" - }, - "repair": { - "title": "Napraw", - "desc": "SprÃŗbuj naprawić uszkodzony dokument PDF" - }, - "removeBlanks": { - "title": "Usuń puste strony", - "desc": "Wykrywa i usuwa puste strony z dokumentu PDF" - }, - "removeAnnotations": { - "title": "Usuń notatki/przypisy", - "desc": "Usuwa wszystkie notatki i przypisy z dokumentu PDF" - }, - "compare": { - "title": "PorÃŗwnaj", - "desc": "PorÃŗwnuje i pokazuje rÃŗÅŧnice między dwoma dokumentami PDF" - }, - "certSign": { - "title": "Podpisz certyfikatem", - "desc": "Podpisz dokument PDF za pomocą certyfikatu/klucza prywatnego (PEM/P12)" - }, - "removeCertSign": { - "title": "Usuń podpis certyfikatem", - "desc": "Usuń podpis certyfikatem z dokumentu PDF" - }, - "pageLayout": { - "title": "Układ wielu stron", - "desc": "Scal wiele stron dokumentu PDF w jedną stronę" - }, - "scalePages": { - "title": "Dopasuj rozmiar stron", - "desc": "Dopasuj rozmiar stron wybranego dokumentu PDF" - }, "pipeline": { "title": "Automatyzacja", "desc": "Wykonaj wiele akcji na dokumentach PDF, tworząc automatyzację" }, - "addPageNumbers": { - "title": "Dodaj numery stron", - "desc": "Dodaj numery strony w dokumencie PDF w podanej lokalizacji" - }, "auto-rename": { "title": "Automatycznie zmień nazwę PDF", "desc": "Automatycznie zmień nazwę PDF bazując na nagÅ‚Ãŗwku" }, - "adjustContrast": { - "title": "Zmień kolor/nasycenie/jasność", - "desc": "Zmień kolor/nasycenie/jasność w dokumencie PDF" - }, - "crop": { - "title": "Przytnij PDF", - "desc": "Przytnij dokument PDF w celu zmniejszenia rozmiaru" - }, - "autoSplitPDF": { - "title": "Automatycznie podziel strony", - "desc": "Automatycznie podziel dokument na strony" - }, "sanitizePDF": { "title": "Dezynfekcja", "desc": "Usuń skrypt i inne elementy z dokumentu PDF" @@ -519,30 +854,14 @@ "title": "PDF do Markdown", "desc": "Konwertuje dowolny plik PDF na Markdown" }, - "getPdfInfo": { - "title": "Pobierz informacje o pliku PDF", - "desc": "Pobiera wszelkie informacje o pliku PDF" - }, "pageExtracter": { "title": "Wyciągnij stronę z PDF", "desc": "Wyciąga stronę z dokumentu PDF" }, - "pdfToSinglePage": { - "title": "PDF do jednej strony", - "desc": "Łączy wszystkie strony PDFa w jedną wielką stronę PDF" - }, - "showJS": { - "title": "PokaÅŧ kod JavaScript", - "desc": "Znajduje i pokazuje załączony kod JS w dokumencie PDF" - }, "autoRedact": { "title": "Zaciemnij", "desc": "Zaciemnia dokument PDF bazując na podanej wartości" }, - "redact": { - "title": "Manual Redaction", - "desc": "Redacts a PDF based on selected text, drawn shapes and/or selected page(s)" - }, "PDFToCSV": { "title": "PDF do CSV", "desc": "Konwertuje tabele z PDF do pliku CSV" @@ -551,10 +870,6 @@ "title": "Podziel (Rozmiar/Ilość stron)", "desc": "Rozdziela dokument PDF na wiele dokumentÃŗw bazując na podanym rozmiarze, ilości stron bądÅē ilości dokumentÃŗw" }, - "overlay-pdfs": { - "title": "NaÅ‚ÃŗÅŧ PDFa", - "desc": "Nakłada dokumenty PDF na siebie" - }, "split-by-sections": { "title": "Podziel PDF na sekcje", "desc": "Podziel strony PDF w mniejsze sekcje" @@ -563,43 +878,17 @@ "title": "Dodaj pieczęć", "desc": "Dodaj pieczęć tekstową/obrazową w wyznaczonej lokalizacji dokumentu" }, - "removeImage": { - "title": "Usuń obraz", - "desc": "Usuń obraz z pliku PDF, aby zmniejszyć rozmiar pliku" - }, - "splitByChapters": { - "title": "Podziel PDF według rozdziaÅ‚Ãŗw", - "desc": "Podział pliku PDF na wiele plikÃŗw na podstawie struktury rozdziaÅ‚Ãŗw." - }, - "validateSignature": { - "title": "SprawdÅē poprawność podpisu PDF", - "desc": "Weryfikuj podpisy cyfrowe i certyfikaty w dokumentach PDF" - }, "replace-color": { "title": "Zastąp i OdwrÃŗÄ‡ Kolor", "desc": "Zastąp kolor tekstu i tła w pliku PDF i odwrÃŗÄ‡ pełen kolor pliku PDF, aby zmniejszyć rozmiar pliku" }, - "convert": { - "title": "Konwertuj" - }, "attachments": { "title": "Add attachments" }, - "extractPages": { - "title": "Wyciągnij stronę" - }, - "removePages": { - "title": "Usuń", - "desc": "Usuń niechciane strony z dokumentu PDF." - }, "removeImagePdf": { "title": "Usuń obraz", "desc": "Usuń obraz z pliku PDF, aby zmniejszyć rozmiar pliku" }, - "autoSizeSplitPDF": { - "title": "Podziel (Rozmiar/Ilość stron)", - "desc": "Rozdziela dokument PDF na wiele dokumentÃŗw bazując na podanym rozmiarze, ilości stron bądÅē ilości dokumentÃŗw" - }, "adjust-contrast": { "title": "Zmień kolor/nasycenie/jasność", "desc": "Zmień kolor/nasycenie/jasność w dokumencie PDF" @@ -607,11 +896,12 @@ "replaceColorPdf": { "title": "Zastąp i OdwrÃŗÄ‡ Kolor", "desc": "Zastąp kolor tekstu i tła w pliku PDF i odwrÃŗÄ‡ pełen kolor pliku PDF, aby zmniejszyć rozmiar pliku" - }, - "changePermissions": { - "title": "Zmień uprawnienia" } }, + "landing": { + "addFiles": "Add Files", + "uploadFromComputer": "Upload from computer" + }, "viewPdf": { "tags": "wyświetl,czytaj,adnotuj,tekst,obraz", "title": "Przeglądaj/Edytuj PDF", @@ -645,17 +935,39 @@ "merge": { "tags": "scalanie, operacje na stronach, back-end, po stronie serwera", "title": "Połącz", + "removeDigitalSignature": { + "label": "Remove digital signature in the merged file?", + "tooltip": { + "title": "Remove Digital Signature", + "description": "Digital signatures will be invalidated when merging files. Check this to remove them from the final merged PDF." + } + }, + "generateTableOfContents": { + "label": "Generate table of contents in the merged file?", + "tooltip": { + "title": "Generate Table of Contents", + "description": "Automatically creates a clickable table of contents in the merged PDF based on the original file names and page numbers." + } + }, + "submit": "Połącz", + "sortBy": { + "description": "Files will be merged in the order they're selected. Drag to reorder or sort below.", + "label": "Sort By", + "filename": "Nazwa pliku", + "dateModified": "Date Modified", + "ascending": "Ascending", + "descending": "Descending", + "sort": "Sort" + }, + "error": { + "failed": "An error occurred while merging the PDFs." + }, "header": "Połącz wiele dokumentÃŗw PDF (2+)", "sortByName": "Sortuj po nazwie", "sortByDate": "Sortuj po dacie", - "removeCertSign": "Usuń podpis cyfrowy w scalonym pliku?", - "submit": "Połącz", - "sortBy": { - "filename": "Nazwa pliku" - } + "removeCertSign": "Usuń podpis cyfrowy w scalonym pliku?" }, "split": { - "tags": "Operacje na stronach, dzielenie, wiele stron, cięcie, po stronie serwera", "title": "Podziel dokument PDF", "header": "Podziel dokument PDF", "desc": { @@ -671,25 +983,249 @@ "splitPages": "WprowadÅē strony do podziału na:", "submit": "Podziel", "steps": { + "chooseMethod": "Choose Method", "settings": "Ustawienia" }, + "settings": { + "selectMethodFirst": "Please select a split method first" + }, + "error": { + "failed": "An error occurred while splitting the PDF." + }, + "method": { + "label": "Choose split method", + "placeholder": "Select how to split the PDF" + }, "methods": { + "prefix": { + "splitAt": "Split at", + "splitBy": "Split by" + }, + "byPages": { + "name": "Page Numbers", + "desc": "Extract specific pages (1,3,5-10)", + "tooltip": "Enter page numbers separated by commas or ranges with hyphens" + }, + "bySections": { + "name": "Sections", + "desc": "Divide pages into grid sections", + "tooltip": "Split each page into horizontal and vertical sections" + }, "bySize": { - "name": "Rozmiar pliku" + "name": "Rozmiar pliku", + "desc": "Limit maximum file size", + "tooltip": "Specify maximum file size (e.g. 10MB, 500KB)" + }, + "byPageCount": { + "name": "Page Count", + "desc": "Fixed pages per file", + "tooltip": "Enter the number of pages for each split file" + }, + "byDocCount": { + "name": "Document Count", + "desc": "Create specific number of files", + "tooltip": "Enter how many files you want to create" + }, + "byChapters": { + "name": "Chapters", + "desc": "Split at bookmark boundaries", + "tooltip": "Uses PDF bookmarks to determine split points" + }, + "byPageDivider": { + "name": "Page Divider", + "desc": "Auto-split with divider sheets", + "tooltip": "Use QR code divider sheets between documents when scanning" } }, "value": { "fileSize": { - "label": "Rozmiar pliku" + "label": "Rozmiar pliku", + "placeholder": "e.g. 10MB, 500KB" + }, + "pageCount": { + "label": "Pages per File", + "placeholder": "e.g. 5, 10" + }, + "docCount": { + "label": "Number of Files", + "placeholder": "e.g. 3, 5" } - } + }, + "tooltip": { + "header": { + "title": "Split Methods Overview" + }, + "byPages": { + "title": "Split at Page Numbers", + "text": "Split your PDF at specific page numbers. Using 'n' splits after page n. Using 'n-m' splits before page n and after page m.", + "bullet1": "Single split points: 3,7 (splits after pages 3 and 7)", + "bullet2": "Range split points: 3-8 (splits before page 3 and after page 8)", + "bullet3": "Mixed: 2,5-10,15 (splits after page 2, before page 5, after page 10, and after page 15)" + }, + "bySections": { + "title": "Split by Grid Sections", + "text": "Divide each page into a grid of sections. Useful for splitting documents with multiple columns or extracting specific areas.", + "bullet1": "Horizontal: Number of rows to create", + "bullet2": "Vertical: Number of columns to create", + "bullet3": "Merge: Combine all sections into one PDF" + }, + "bySize": { + "title": "Split by File Size", + "text": "Create multiple PDFs that don't exceed a specified file size. Ideal for file size limitations or email attachments.", + "bullet1": "Use MB for larger files (e.g., 10MB)", + "bullet2": "Use KB for smaller files (e.g., 500KB)", + "bullet3": "System will split at page boundaries" + }, + "byCount": { + "title": "Split by Count", + "text": "Create multiple PDFs with a specific number of pages or documents each.", + "bullet1": "Page Count: Fixed number of pages per file", + "bullet2": "Document Count: Fixed number of output files", + "bullet3": "Useful for batch processing workflows" + }, + "byChapters": { + "title": "Split by Chapters", + "text": "Use PDF bookmarks to automatically split at chapter boundaries. Requires PDFs with bookmark structure.", + "bullet1": "Bookmark Level: Which level to split on (1=top level)", + "bullet2": "Include Metadata: Preserve document properties", + "bullet3": "Allow Duplicates: Handle repeated bookmark names" + }, + "byDocCount": { + "bullet1": "Enter the number of output files you want", + "bullet2": "Pages are distributed as evenly as possible", + "bullet3": "Useful when you need a specific number of files", + "text": "Create a specific number of output files by evenly distributing pages across them.", + "title": "Split by Document Count" + }, + "byPageCount": { + "bullet1": "Enter the number of pages per output file", + "bullet2": "Last file may have fewer pages if not evenly divisible", + "bullet3": "Useful for batch processing workflows", + "text": "Create multiple PDFs with a specific number of pages each. Perfect for creating uniform document chunks.", + "title": "Split by Page Count" + }, + "byPageDivider": { + "bullet1": "Print divider sheets from the download link", + "bullet2": "Insert divider sheets between your documents", + "bullet3": "Scan all documents together as one PDF", + "bullet4": "Upload - divider pages are automatically detected and removed", + "bullet5": "Enable Duplex Mode if scanning both sides of divider sheets", + "text": "Automatically split scanned documents using physical divider sheets with QR codes. Perfect for processing multiple documents scanned together.", + "title": "Split by Page Divider" + } + }, + "methodSelection": { + "tooltip": { + "bullet1": "Click on a method card to select it", + "bullet2": "Hover over each card to see a quick description", + "bullet3": "The settings step will appear after you select a method", + "bullet4": "You can change methods at any time before processing", + "header": { + "text": "Choose how you want to split your PDF document. Each method is optimized for different use cases and document types.", + "title": "Split Method Selection" + }, + "title": "Choose Your Split Method" + } + }, + "selectMethod": "Select a split method", + "tags": "Operacje na stronach, dzielenie, wiele stron, cięcie, po stronie serwera" }, "rotate": { - "tags": "strona serwera", "title": "ObrÃŗÄ‡ dokument PDF", + "submit": "ObrÃŗÄ‡", + "selectRotation": "Select Rotation Angle (Clockwise)", + "error": { + "failed": "An error occurred while rotating the PDF." + }, + "preview": { + "title": "Rotation Preview" + }, + "rotateLeft": "Rotate Anticlockwise", + "rotateRight": "Rotate Clockwise", + "tooltip": { + "header": { + "title": "Rotate Settings Overview" + }, + "description": { + "text": "Rotate your PDF pages clockwise or anticlockwise in 90-degree increments. All pages in the PDF will be rotated. The preview shows how your document will look after rotation." + }, + "controls": { + "title": "Controls", + "text": "Use the rotation buttons to adjust orientation. Left button rotates anticlockwise, right button rotates clockwise. Each click rotates by 90 degrees." + } + }, + "tags": "strona serwera", "header": "ObrÃŗÄ‡ dokument PDF", - "selectAngle": "Wybierz kąt obrotu (domyślnie 90 stopni):", - "submit": "ObrÃŗÄ‡" + "selectAngle": "Wybierz kąt obrotu (domyślnie 90 stopni):" + }, + "convert": { + "title": "Konwertuj", + "desc": "Convert files between different formats", + "files": "Files", + "selectFilesPlaceholder": "Select files in the main view to get started", + "settings": "Ustawienia", + "conversionCompleted": "Conversion completed", + "results": "Results", + "defaultFilename": "converted_file", + "conversionResults": "Conversion Results", + "convertFrom": "Convert from", + "convertTo": "Convert to", + "sourceFormatPlaceholder": "Source format", + "targetFormatPlaceholder": "Target format", + "selectSourceFormatFirst": "Select a source format first", + "outputOptions": "Output Options", + "pdfOptions": "PDF Options", + "imageOptions": "Image Options", + "colorType": "Colour Type", + "color": "kolor", + "greyscale": "Odcień szarości", + "blackwhite": "Black & White", + "dpi": "DPI", + "output": "Output", + "single": "Single", + "multiple": "Multiple", + "fitOption": "Fit Option", + "maintainAspectRatio": "Maintain Aspect Ratio", + "fitDocumentToPage": "Fit Document to Page", + "fillPage": "Wypełnij stronę", + "autoRotate": "Auto Rotate", + "autoRotateDescription": "Automatically rotate images to better fit the PDF page", + "combineImages": "Combine Images", + "combineImagesDescription": "Combine all images into one PDF, or create separate PDFs for each image", + "webOptions": "Web to PDF Options", + "zoomLevel": "Zoom Level", + "emailOptions": "Email to PDF Options", + "includeAttachments": "Include email attachments", + "maxAttachmentSize": "Maximum attachment size (MB)", + "includeAllRecipients": "Include CC and BCC recipients in header", + "downloadHtml": "Download HTML intermediate file instead of PDF", + "pdfaOptions": "PDF/A Options", + "outputFormat": "Output Format", + "pdfaNote": "PDF/A-1b is more compatible, PDF/A-2b supports more features.", + "pdfaDigitalSignatureWarning": "Dokument zawiera podpis cyfrowy, nie zostanie on wczytany.", + "fileFormat": "File Format", + "wordDoc": "Word Document", + "wordDocExt": "Word Document (.docx)", + "odtExt": "OpenDocument Text (.odt)", + "pptExt": "PowerPoint (.pptx)", + "odpExt": "OpenDocument Presentation (.odp)", + "txtExt": "Plain Text (.txt)", + "rtfExt": "Rich Text Format (.rtf)", + "selectedFiles": "Selected files", + "noFileSelected": "No file selected. Use the file panel to add files.", + "convertFiles": "Convert Files", + "converting": "Converting...", + "downloadConverted": "Download Converted File", + "errorNoFiles": "Please select at least one file to convert.", + "errorNoFormat": "Please select both source and target formats.", + "errorNotSupported": "Conversion from {{from}} to {{to}} is not supported.", + "images": "Images", + "officeDocs": "Office Documents (Word, Excel, PowerPoint)", + "imagesExt": "Images (JPG, PNG, etc.)", + "markdown": "Markdown", + "textRtf": "Text/RTF", + "grayscale": "Odcień szarości", + "errorConversion": "An error occurred while converting the file." }, "imageToPdf": { "tags": "konwersja,img,jpg,obraz,zdjęcie" @@ -727,7 +1263,33 @@ "8": "Usuń ostatnią", "9": "Usuń pierwszą i ostatnią", "10": "Połącz parzyste i nieparzyste", - "11": "Zduplikuj wszystkie strony" + "11": "Zduplikuj wszystkie strony", + "desc": { + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, â€Ļ).", + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, â€Ļ).", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimized for binding on the side)." + } + }, + "desc": { + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, â€Ļ).", + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, â€Ļ).", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimised for binding on the side).", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document." }, "placeholder": "(przykład 1,3,2 lub 4-8,2,10-12 lub 2n-1)" }, @@ -739,9 +1301,198 @@ "upload": "Dodaj obraz", "submit": "Dodaj obraz" }, + "attachments": { + "tags": "embed,attach,file,attachment,attachments", + "title": "Add attachments", + "header": "Add attachments", + "add": "Add Attachment", + "remove": "Remove Attachment", + "embed": "Embed Attachment", + "submit": "Add attachments" + }, "watermark": { - "tags": "Tekst,powtarzanie,etykieta,własne,prawa autorskie,znak wodny,img,jpg,obraz,zdjęcie", "title": "Dodaj znak wodny", + "desc": "Add text or image watermarks to PDF files", + "completed": "Watermark added", + "submit": "Dodaj znak wodny", + "filenamePrefix": "watermarked", + "error": { + "failed": "An error occurred while adding watermark to the PDF." + }, + "watermarkType": { + "text": "Tekst", + "image": "Image" + }, + "settings": { + "type": "Watermark Type", + "text": { + "label": "Watermark Text", + "placeholder": "Enter watermark text" + }, + "image": { + "label": "Watermark Image", + "choose": "Choose Image", + "selected": "Selected: {{filename}}" + }, + "fontSize": "Rozmiar Czcionki", + "size": "Size", + "alphabet": "Font/Language", + "color": "Watermark Colour", + "rotation": "Rotation (degrees)", + "opacity": "Opacity (%)", + "spacing": { + "horizontal": "Horizontal Spacing", + "vertical": "Vertical Spacing", + "height": "Height Spacing", + "width": "Width Spacing" + }, + "convertToImage": "Flatten PDF pages to images" + }, + "alphabet": { + "roman": "Roman/Latin", + "arabic": "Arabic", + "japanese": "Japanese", + "korean": "Korean", + "chinese": "Chinese", + "thai": "Thai" + }, + "steps": { + "type": "Watermark Type", + "wording": "Wording", + "textStyle": "Style", + "formatting": "Formatting", + "file": "Watermark File" + }, + "results": { + "title": "Watermark Results" + }, + "tooltip": { + "language": { + "title": "Language Support", + "text": "Choose the appropriate language setting to ensure proper font rendering for your text." + }, + "appearance": { + "title": "Appearance Settings", + "text": "Control how your watermark looks and blends with the document.", + "bullet1": "Rotation: -360° to 360° for angled watermarks", + "bullet2": "Opacity: 0-100% for transparency control", + "bullet3": "Lower opacity creates subtle watermarks" + }, + "spacing": { + "title": "Spacing Control", + "text": "Adjust the spacing between repeated watermarks across the page.", + "bullet1": "Width spacing: Horizontal distance between watermarks", + "bullet2": "Height spacing: Vertical distance between watermarks", + "bullet3": "Higher values create more spread out patterns" + }, + "type": { + "header": { + "title": "Watermark Type Selection" + }, + "description": { + "title": "Choose Your Watermark", + "text": "Select between text or image watermarks based on your needs." + }, + "text": { + "title": "Text Watermarks", + "text": "Perfect for adding copyright notices, company names, or confidentiality labels. Supports multiple languages and custom colours.", + "bullet1": "Customisable fonts and languages", + "bullet2": "Adjustable colours and transparency", + "bullet3": "Ideal for legal or branding text" + }, + "image": { + "title": "Image Watermarks", + "text": "Use logos, stamps, or any image as a watermark. Great for branding and visual identification.", + "bullet1": "Upload any image format", + "bullet2": "Maintains image quality", + "bullet3": "Perfect for logos and stamps" + } + }, + "wording": { + "header": { + "title": "Text Content" + }, + "text": { + "title": "Watermark Text", + "text": "Enter the text that will appear as your watermark across the document.", + "bullet1": "Keep it concise for better readability", + "bullet2": "Common examples: 'CONFIDENTIAL', 'DRAFT', company name", + "bullet3": "Emoji characters are not supported and will be filtered out" + } + }, + "textStyle": { + "header": { + "title": "Text Style" + }, + "color": { + "title": "Colour Selection", + "text": "Choose a colour that provides good contrast with your document content.", + "bullet1": "Light grey (#d3d3d3) for subtle watermarks", + "bullet2": "Black or dark colours for high contrast", + "bullet3": "Custom colours for branding purposes" + }, + "language": { + "title": "Language Support", + "text": "Choose the appropriate language setting to ensure proper font rendering." + } + }, + "file": { + "header": { + "title": "Image Upload" + }, + "upload": { + "title": "Image Selection", + "text": "Upload an image file to use as your watermark.", + "bullet1": "Supports common formats: PNG, JPG, GIF, BMP", + "bullet2": "PNG with transparency works best", + "bullet3": "Higher resolution images maintain quality better" + }, + "recommendations": { + "title": "Best Practices", + "text": "Tips for optimal image watermark results.", + "bullet1": "Use logos or stamps with transparent backgrounds", + "bullet2": "Simple designs work better than complex images", + "bullet3": "Consider the final document size when choosing resolution" + } + }, + "formatting": { + "header": { + "title": "Formatting & Layout" + }, + "size": { + "title": "Size Control", + "text": "Adjust the size of your watermark (text or image).", + "bullet1": "Larger sizes create more prominent watermarks" + }, + "appearance": { + "title": "Appearance Settings", + "text": "Control how your watermark looks and blends with the document.", + "bullet1": "Rotation: -360° to 360° for angled watermarks", + "bullet2": "Opacity: 0-100% for transparency control", + "bullet3": "Lower opacity creates subtle watermarks" + }, + "spacing": { + "title": "Spacing Control", + "text": "Adjust the spacing between repeated watermarks across the page.", + "bullet1": "Horizontal spacing: Distance between watermarks left to right", + "bullet2": "Vertical spacing: Distance between watermarks top to bottom", + "bullet3": "Higher values create more spread out patterns" + }, + "security": { + "title": "Security Option", + "text": "Convert the final PDF to an image-based format for enhanced security.", + "bullet1": "Prevents text selection and copying", + "bullet2": "Makes watermarks harder to remove", + "bullet3": "Results in larger file sizes", + "bullet4": "Best for sensitive or copyrighted content" + } + } + }, + "type": { + "1": "Tekst", + "2": "Obraz" + }, + "tags": "Tekst,powtarzanie,etykieta,własne,prawa autorskie,znak wodny,img,jpg,obraz,zdjęcie", "header": "Dodaj znak wodny", "customColor": "Własny kolor tekstu", "selectText": { @@ -755,17 +1506,6 @@ "8": "Typ znaku wodnego:", "9": "Obraz znaku wodnego:", "10": "Konwertuj PDF do PDF-Image" - }, - "submit": "Dodaj znak wodny", - "type": { - "1": "Tekst", - "2": "Obraz" - }, - "watermarkType": { - "text": "Tekst" - }, - "settings": { - "fontSize": "Rozmiar Czcionki" } }, "permissions": { @@ -790,50 +1530,201 @@ "removePages": { "tags": "Usuń strony,usuwaj strony", "title": "Usuń", + "pageNumbers": { + "label": "Pages to Remove", + "placeholder": "e.g., 1,3,5-8,10", + "error": "Invalid page number format. Use numbers, ranges (1-5), or mathematical expressions (2n+1)" + }, + "filenamePrefix": "pages_removed", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "settings": { + "title": "Settings" + }, + "tooltip": { + "header": { + "title": "Remove Pages Settings" + }, + "pageNumbers": { + "title": "Page Selection", + "text": "Specify which pages to remove from your PDF. You can select individual pages, ranges, or use mathematical expressions.", + "bullet1": "Individual pages: 1,3,5 (removes pages 1, 3, and 5)", + "bullet2": "Page ranges: 1-5,10-15 (removes pages 1-5 and 10-15)", + "bullet3": "Mathematical: 2n+1 (removes odd pages)", + "bullet4": "Open ranges: 5- (removes from page 5 to end)" + }, + "examples": { + "title": "Common Examples", + "text": "Here are some common page selection patterns:", + "bullet1": "Remove first page: 1", + "bullet2": "Remove last 3 pages: -3", + "bullet3": "Remove every other page: 2n", + "bullet4": "Remove specific scattered pages: 1,5,10,15" + }, + "safety": { + "title": "Safety Tips", + "text": "Important considerations when removing pages:", + "bullet1": "Always preview your selection before processing", + "bullet2": "Keep a backup of your original file", + "bullet3": "Page numbers start from 1, not 0", + "bullet4": "Invalid page numbers will be ignored" + } + }, + "error": { + "failed": "An error occurred whilst removing pages." + }, + "results": { + "title": "Page Removal Results" + }, "submit": "Usuń" }, - "addPassword": { - "tags": "bezpieczeństwo,ochrona", - "title": "Dodaj hasło", - "header": "Dodaj hasło (zaszyfruj)", - "selectText": { - "1": "Wybierz plik PDF do zaszyfrowania", - "2": "Hasło", - "3": "Długość klucza szyfrowania", - "4": "WyÅŧsze wartości są silniejsze, ale niÅŧsze wartości zapewniają lepszą kompatybilność.", - "5": "Uprawnienia do zmian", - "6": "Zablokuj zmiany w dokumencie", - "7": "Zablokuj zmiany w treści", - "8": "Zablokuj zmiany w celu ułatwienia dostępu", - "9": "Zablokuj wypełnianie formularzy", - "10": "Zablokuj modyfikacje", - "11": "Zablokuj modyfikacje adnotacji", - "12": "Zablokuj drukowanie", - "13": "Zablokuj drukowanie rÃŗÅŧnych formatÃŗw", - "14": "Hasło właściciela", - "15": "Ogranicza akcje, ktÃŗre moÅŧna wykonać na dokumencie, kiedy jest otwarty (nie wspierany przez wszystkie przeglądarki)", - "16": "Ogranicza otwarcie dokumentu" + "extractPages": { + "title": "Extract Pages", + "pageNumbers": { + "label": "Pages to Extract", + "placeholder": "e.g., 1,3,5-8 or odd & 1-10" + }, + "settings": { + "title": "Settings" }, - "submit": "Zablokuj", "tooltip": { - "permissions": { - "title": "Zmień uprawnienia" + "description": "Extracts the selected pages into a new PDF, preserving order." + }, + "error": { + "failed": "Failed to extract pages" + }, + "results": { + "title": "Pages Extracted" + }, + "submit": "Extract Pages" + }, + "pageSelection": { + "tooltip": { + "header": { + "title": "Page Selection Guide" + }, + "basic": { + "title": "Basic Usage", + "text": "Select specific pages from your PDF document using simple syntax.", + "bullet1": "Individual pages: 1,3,5", + "bullet2": "Page ranges: 3-6 or 10-15", + "bullet3": "All pages: all" + }, + "advanced": { + "title": "Advanced Features" + }, + "tips": { + "title": "Tips", + "text": "Keep these guidelines in mind:", + "bullet1": "Page numbers start from 1 (not 0)", + "bullet2": "Spaces are automatically removed", + "bullet3": "Invalid expressions are ignored" + }, + "syntax": { + "title": "Syntax Basics", + "text": "Use numbers, ranges, keywords, and progressions (n starts at 0). Parentheses are supported.", + "bullets": { + "numbers": "Numbers/ranges: 5, 10-20", + "keywords": "Keywords: odd, even", + "progressions": "Progressions: 3n, 4n+1" + } + }, + "operators": { + "title": "Operators", + "text": "AND has higher precedence than comma. NOT applies within the document range.", + "and": "AND: & or \"and\" — require both conditions (e.g., 1-50 & even)", + "comma": "Comma: , or | — combine selections (e.g., 1-10, 20)", + "not": "NOT: ! or \"not\" — exclude pages (e.g., 3n & not 30)" + }, + "examples": { + "title": "Examples" + }, + "complex": { + "bullet1": "1,3-5,8,2n → pages 1, 3–5, 8, plus evens", + "bullet2": "10-,2n-1 → from page 10 to end + odd pages", + "description": "Mix different types.", + "title": "Complex Combinations" + }, + "description": "Choose which pages to use for the operation. Supports single pages, ranges, formulas, and the all keyword.", + "individual": { + "bullet1": "1,3,5 → selects pages 1, 3, 5", + "bullet2": "2,7,12 → selects pages 2, 7, 12", + "description": "Enter numbers separated by commas.", + "title": "Individual Pages" + }, + "mathematical": { + "bullet1": "2n → all even pages (2, 4, 6â€Ļ)", + "bullet2": "2n-1 → all odd pages (1, 3, 5â€Ļ)", + "bullet3": "3n → every 3rd page (3, 6, 9â€Ļ)", + "bullet4": "4n-1 → pages 3, 7, 11, 15â€Ļ", + "description": "Use n in formulas for patterns.", + "title": "Mathematical Functions" + }, + "ranges": { + "bullet1": "3-6 → selects pages 3–6", + "bullet2": "10-15 → selects pages 10–15", + "bullet3": "5- → selects pages 5 to end", + "description": "Use - for consecutive pages.", + "title": "Page Ranges" + }, + "special": { + "bullet1": "all → selects all pages", + "title": "Special Keywords" } } }, - "removePassword": { - "tags": "zabezpieczenie,odszyfrowanie,bezpieczeństwo,odhasłowanie,usunięcie hasła", - "title": "Usuń hasło", - "header": "Usuń hasło (odszyfruj)", - "selectText": { - "1": "Wybierz dokument PDF do odszyfrowania", - "2": "Hasło" + "bulkSelection": { + "syntaxError": "There is a syntax issue. See Page Selection tips for help.", + "header": { + "title": "Page Selection Guide" }, - "submit": "Usuń", - "desc": "Usuń ochronę hasłem z dokumentu PDF.", - "password": { - "stepTitle": "Usuń hasło", - "label": "Obecne hasło" + "syntax": { + "title": "Syntax Basics", + "text": "Use numbers, ranges, keywords, and progressions (n starts at 0). Parentheses are supported.", + "bullets": { + "numbers": "Numbers/ranges: 5, 10-20", + "keywords": "Keywords: odd, even", + "progressions": "Progressions: 3n, 4n+1" + } + }, + "operators": { + "title": "Operators", + "text": "AND has higher precedence than comma. NOT applies within the document range.", + "and": "AND: & or \"and\" — require both conditions (e.g., 1-50 & even)", + "comma": "Comma: , or | — combine selections (e.g., 1-10, 20)", + "not": "NOT: ! or \"not\" — exclude pages (e.g., 3n & not 30)" + }, + "examples": { + "title": "Examples", + "first50": "First 50", + "last50": "Last 50", + "every3rd": "Every 3rd", + "oddWithinExcluding": "Odd within 1-20 excluding 5-7", + "combineSets": "Combine sets" + }, + "firstNPages": { + "title": "First N Pages", + "placeholder": "Number of pages" + }, + "lastNPages": { + "title": "Last N Pages", + "placeholder": "Number of pages" + }, + "everyNthPage": { + "title": "Every Nth Page", + "placeholder": "Step size" + }, + "range": { + "title": "Range", + "fromPlaceholder": "From", + "toPlaceholder": "To" + }, + "keywords": { + "title": "Keywords" + }, + "advanced": { + "title": "Advanced" } }, "compressPdfs": { @@ -843,12 +1734,142 @@ "tags": "remove,delete,form,field,readonly", "title": "Remove Read-Only from Form Fields", "header": "Unlock PDF Forms", - "submit": "Remove" + "submit": "Remove", + "description": "This tool will remove read-only restrictions from PDF form fields, making them editable and fillable.", + "filenamePrefix": "unlocked_forms", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst unlocking PDF forms." + }, + "results": { + "title": "Unlocked Forms Results" + } }, "changeMetadata": { - "tags": "Tytuł,autor,data,utworzenie,czas,wydawca,producent,statystyki", - "title": "Tytuł:", "header": "Zmień metadane", + "submit": "Zmień", + "filenamePrefix": "metadata", + "settings": { + "title": "Metadata Settings" + }, + "standardFields": { + "title": "Standard Fields" + }, + "deleteAll": { + "label": "Remove Existing Metadata", + "checkbox": "Delete all metadata" + }, + "title": { + "label": "Title", + "placeholder": "Document title" + }, + "author": { + "label": "Author", + "placeholder": "Document author" + }, + "subject": { + "label": "Subject", + "placeholder": "Document subject" + }, + "keywords": { + "label": "Keywords", + "placeholder": "Document keywords" + }, + "creator": { + "label": "Creator", + "placeholder": "Document creator" + }, + "producer": { + "label": "Producer", + "placeholder": "Document producer" + }, + "dates": { + "title": "Date Fields" + }, + "creationDate": { + "label": "Creation Date", + "placeholder": "Creation date" + }, + "modificationDate": { + "label": "Modification Date", + "placeholder": "Modification date" + }, + "trapped": { + "label": "Trapped Status", + "unknown": "Unknown", + "true": "True", + "false": "False" + }, + "advanced": { + "title": "Advanced Options" + }, + "customFields": { + "title": "Custom Metadata", + "description": "Add custom metadata fields to the document", + "add": "Add Field", + "key": "Key", + "keyPlaceholder": "Custom key", + "value": "Value", + "valuePlaceholder": "Custom value", + "remove": "Remove" + }, + "results": { + "title": "Updated PDFs" + }, + "error": { + "failed": "An error occurred while changing the PDF metadata." + }, + "tooltip": { + "header": { + "title": "PDF Metadata Overview" + }, + "standardFields": { + "title": "Standard Fields", + "text": "Common PDF metadata fields that describe the document.", + "bullet1": "Title: Document name or heading", + "bullet2": "Author: Person who created the document", + "bullet3": "Subject: Brief description of content", + "bullet4": "Keywords: Search terms for the document", + "bullet5": "Creator/Producer: Software used to create the PDF" + }, + "dates": { + "title": "Date Fields", + "text": "When the document was created and modified.", + "bullet1": "Creation Date: When original document was made", + "bullet2": "Modification Date: When last changed" + }, + "options": { + "title": "Additional Options", + "text": "Custom fields and privacy controls.", + "bullet1": "Custom Metadata: Add your own key-value pairs", + "bullet2": "Trapped Status: High-quality printing setting", + "bullet3": "Delete All: Remove all metadata for privacy" + }, + "deleteAll": { + "title": "Remove Existing Metadata", + "text": "Complete metadata deletion to ensure privacy." + }, + "customFields": { + "title": "Custom Metadata", + "text": "Add your own custom key-value metadata pairs.", + "bullet1": "Add any custom fields relevant to your document", + "bullet2": "Examples: Department, Project, Version, Status", + "bullet3": "Both key and value are required for each entry" + }, + "advanced": { + "title": "Advanced Options", + "trapped": { + "title": "Trapped Status", + "description": "Indicates if document is prepared for high-quality printing.", + "bullet1": "True: Document has been trapped for printing", + "bullet2": "False: Document has not been trapped", + "bullet3": "Unknown: Trapped status is not specified" + } + } + }, + "tags": "Tytuł,autor,data,utworzenie,czas,wydawca,producent,statystyki", "selectText": { "1": "Edytuj zmienne, ktÃŗre chcesz zmienić", "2": "Usuń wszystkie metadane", @@ -856,15 +1877,7 @@ "4": "Inne metadane:", "5": "Dodaj niestandardowy wpis w metadanych" }, - "author": "Autor:", - "creationDate": "Data utworzenia (yyyy/MM/dd HH:mm:ss):", - "creator": "TwÃŗrca:", - "keywords": "Słowa kluczowe:", - "modDate": "Data modyfikacji (yyyy/MM/dd HH:mm:ss):", - "producer": "Producent:", - "subject": "Temat:", - "trapped": "Zablokowany:", - "submit": "Zmień" + "modDate": "Data modyfikacji (yyyy/MM/dd HH:mm:ss):" }, "fileToPDF": { "tags": "transformacja,format,dokument,obraz,slajd,tekst,konwersja,office,dokumenty,word,excel,powerpoint", @@ -878,6 +1891,7 @@ "ocr": { "tags": "rozpoznawanie, tekst, obraz, skanowanie, odczyt, identyfikacja, wykrywanie, edytowalność", "title": "OCR / Zamiana na tekst", + "desc": "OCR skanuje i wykrywa tekst z obrazÃŗw w dokumencie PDF i zamienia go na tekst.", "header": "OCR / Zamiana na tekst (optyczne rozpoznawanie znakÃŗw)", "selectText": { "1": "Wybierz języki, ktÃŗre mają zostać wykryte w dokumencie PDF (te z listy to języki, ktÃŗre są obecnie wykrywane):", @@ -896,23 +1910,89 @@ "help": "Przeczytaj tę dokumentację, aby dowiedzieć się, jak uÅŧywać tego w innych językach i/lub nie uÅŧywać docker", "credit": "Ta usługa uÅŧywa qpdf i Tesseract do OCR.", "submit": "Przetwarzaj PDF za pomocą OCR", - "desc": "OCR skanuje i wykrywa tekst z obrazÃŗw w dokumencie PDF i zamienia go na tekst.", + "operation": { + "submit": "Process OCR and Review" + }, + "results": { + "title": "OCR Results" + }, + "languagePicker": { + "additionalLanguages": "Looking for additional languages?", + "viewSetupGuide": "View setup guide →" + }, "settings": { "title": "Ustawienia", "ocrMode": { - "label": "Tryb OCR" + "label": "Tryb OCR", + "auto": "Auto (skip text layers)", + "force": "Force (re-OCR all, replace text)", + "strict": "Strict (abort if text found)" }, "languages": { - "label": "Języki" + "label": "Języki", + "placeholder": "Select languages" + }, + "compatibilityMode": { + "label": "Compatibility Mode" + }, + "advancedOptions": { + "label": "Processing Options", + "sidecar": "Create a text file", + "deskew": "Deskew pages", + "clean": "Clean input file", + "cleanFinal": "Clean final output" } }, "tooltip": { + "header": { + "title": "OCR Settings Overview" + }, "mode": { - "title": "Tryb OCR" + "title": "Tryb OCR", + "text": "Optical Character Recognition (OCR) helps you turn scanned or screenshotted pages into text you can search, copy, or highlight.", + "bullet1": "Auto skips pages that already contain text layers.", + "bullet2": "Force re-OCRs every page and replaces all the text.", + "bullet3": "Strict halts if any selectable text is found." }, "languages": { - "title": "Języki" + "title": "Języki", + "text": "Improve OCR accuracy by specifying the expected languages. Choose one or more languages to guide detection." + }, + "output": { + "title": "Output", + "text": "Decide how you want the text output formatted:", + "bullet1": "Searchable PDF embeds text behind the original image.", + "bullet2": "HOCR XML returns a structured machine-readable file.", + "bullet3": "Plain-text sidecar creates a separate .txt file with raw content." + }, + "advanced": { + "header": { + "title": "Advanced OCR Processing" + }, + "compatibility": { + "title": "Compatibility Mode", + "text": "Uses OCR 'sandwich PDF' mode: results in larger files, but more reliable with certain languages and older PDF software. By default we use hOCR for smaller, modern PDFs." + }, + "sidecar": { + "title": "Create Text File", + "text": "Generates a separate .txt file alongside the PDF containing all extracted text content for easy access and processing." + }, + "deskew": { + "title": "Deskew Pages", + "text": "Automatically corrects skewed or tilted pages to improve OCR accuracy. Useful for scanned documents that weren't perfectly aligned." + }, + "clean": { + "title": "Clean Input File", + "text": "Preprocesses the input by removing noise, enhancing contrast, and optimising the image for better OCR recognition before processing." + }, + "cleanFinal": { + "title": "Clean Final Output", + "text": "Post-processes the final PDF by removing OCR artefacts and optimising the text layer for better readability and smaller file size." + } } + }, + "error": { + "failed": "OCR operation failed" } }, "extractImages": { @@ -921,7 +2001,13 @@ "header": "Wyodrębnij obrazy", "selectText": "Wybierz format obrazu, na ktÃŗry chcesz przekonwertować wyodrębniony obraz.", "allowDuplicates": "Zapisz zduplikowane obrazy", - "submit": "Wyodrębnij" + "submit": "Wyodrębnij", + "settings": { + "title": "Settings" + }, + "error": { + "failed": "An error occurred while extracting images from the PDF." + } }, "pdfToPDFA": { "tags": "archiwum, długoterminowe, standardowe, konwersja, przechowywanie, konserwacja", @@ -993,17 +2079,53 @@ }, "info": "Python nie został zainstalowany. Jest on wymagany do uruchomienia." }, + "scannerImageSplit": { + "title": "Extracted Images", + "submit": "Extract Image Scans", + "error": { + "failed": "An error occurred while extracting image scans." + }, + "tooltip": { + "title": "Photo Splitter", + "whatThisDoes": "What this does", + "whatThisDoesDesc": "Automatically finds and extracts each photo from a scanned page or composite image—no manual cropping.", + "whenToUse": "When to use", + "useCase1": "Scan whole album pages in one go", + "useCase2": "Split flatbed batches into separate files", + "useCase3": "Break collages into individual photos", + "useCase4": "Pull photos from documents", + "quickFixes": "Quick fixes", + "problem1": "Photos not detected → increase Tolerance to 30-50", + "problem2": "Too many false detections → increase Minimum Area to 15,000-20,000", + "problem3": "Crops are too tight → increase Border Size to 5-10", + "problem4": "Tilted photos not straightened → lower Angle Threshold to ~5°", + "problem5": "Dust/noise boxes → increase Minimum Contour Area to 1000-2000", + "setupTips": "Setup tips", + "tip1": "Use a plain, light background", + "tip2": "Leave a small gap (≈1 cm) between photos", + "tip3": "Scan at 300-600 DPI", + "tip4": "Clean the scanner glass", + "headsUp": "Heads-up", + "headsUpDesc": "Overlapping photos or backgrounds very close in colour to the photos can reduce accuracy-try a lighter or darker background and leave more space." + } + }, "sign": { - "tags": "autoryzacja, inicjały, podpis odręczny, podpis tekstowy, podpis graficzny", "title": "Podpis", "header": "Dodaj podpis do dokumentu PDF", "upload": "Wczytaj opbraz", - "draw": "Narysuj podpis", - "text": "WprowadÅē tekst", + "draw": { + "title": "Draw your signature", + "clear": "Clear" + }, + "text": { + "name": "Signer Name", + "placeholder": "Enter your full name" + }, "clear": "Wyczyść", "add": "Dodaj", "saved": "Zapisane podpisy", "save": "Zapisany podpis", + "applySignatures": "Apply Signatures", "personalSigs": "Podpisy osobiste", "sharedSigs": "Podpisy wspÃŗÅ‚dzielone", "noSavedSigs": "Nie znaleziono zapisanych podpisÃŗw", @@ -1015,42 +2137,179 @@ "previous": "Poprzednia strona", "maintainRatio": "Przełącz zachowanie proporcji", "undo": "Cofnij", - "redo": "PonÃŗw" + "redo": "PonÃŗw", + "submit": "Sign Document", + "steps": { + "configure": "Configure Signature" + }, + "type": { + "title": "Signature Type", + "draw": "Draw", + "canvas": "Canvas", + "image": "Image", + "text": "Text" + }, + "image": { + "label": "Upload signature image", + "placeholder": "Select image file", + "hint": "Upload a PNG or JPG image of your signature" + }, + "instructions": { + "title": "How to add signature", + "canvas": "After drawing your signature in the canvas, close the modal then click anywhere on the PDF to place it.", + "image": "After uploading your signature image above, click anywhere on the PDF to place it.", + "text": "After entering your name above, click anywhere on the PDF to place your signature." + }, + "mode": { + "move": "Move Signature", + "place": "Place Signature" + }, + "updateAndPlace": "Update and Place", + "activate": "Activate Signature Placement", + "deactivate": "Stop Placing Signatures", + "results": { + "title": "Signature Results" + }, + "error": { + "failed": "An error occurred while signing the PDF." + }, + "tags": "autoryzacja, inicjały, podpis odręczny, podpis tekstowy, podpis graficzny" }, "flatten": { - "tags": "statyczny, dezaktywacja, nieinteraktywny, opływowy, streamline", "title": "Spłaszcz", "header": "Spłaszcz dokument(y) PDF", "flattenOnlyForms": "Spłaszcz tylko formularze", "submit": "Spłaszcz", + "filenamePrefix": "flattened", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, "steps": { "settings": "Ustawienia" }, "options": { - "flattenOnlyForms": "Spłaszcz tylko formularze" - } + "stepTitle": "Flatten Options", + "title": "Flatten Options", + "flattenOnlyForms": { + "label": "Spłaszcz tylko formularze", + "desc": "Only flatten form fields, leaving other interactive elements intact" + }, + "note": "Flattening removes interactive elements from the PDF, making them non-editable." + }, + "results": { + "title": "Flatten Results" + }, + "error": { + "failed": "An error occurred while flattening the PDF." + }, + "tooltip": { + "header": { + "title": "About Flattening PDFs" + }, + "description": { + "title": "What does flattening do?", + "text": "Flattening makes your PDF non-editable by turning fillable forms and buttons into regular text and images. The PDF will look exactly the same, but no one can change or fill in the forms anymore. Perfect for sharing completed forms, creating final documents for records, or ensuring the PDF looks the same everywhere.", + "bullet1": "Text boxes become regular text (can't be edited)", + "bullet2": "Checkboxes and buttons become pictures", + "bullet3": "Great for final versions you don't want changed", + "bullet4": "Ensures consistent appearance across all devices" + }, + "formsOnly": { + "title": "What does 'Flatten only forms' mean?", + "text": "This option only removes the ability to fill in forms, but keeps other features working like clicking links, viewing bookmarks, and reading comments.", + "bullet1": "Forms become non-editable", + "bullet2": "Links still work when clicked", + "bullet3": "Comments and notes remain visible", + "bullet4": "Bookmarks still help you navigate" + } + }, + "tags": "statyczny, dezaktywacja, nieinteraktywny, opływowy, streamline" }, "repair": { "tags": "naprawianie, naprawa, przywracanie, poprawianie, odzyskiwanie", "title": "Napraw", "header": "Napraw dokument(y) PDF", - "submit": "Napraw" + "submit": "Napraw", + "description": "This tool will attempt to repair corrupted or damaged PDF files. No additional settings are required.", + "filenamePrefix": "repaired", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst repairing the PDF." + }, + "results": { + "title": "Repair Results" + } }, "removeBlanks": { - "tags": "czyszczenie, usprawnianie, brak treści, organizowanie", "title": "Usuń puste", "header": "Usuń puste strony", - "threshold": "PrÃŗg:", + "settings": { + "title": "Settings" + }, + "threshold": { + "label": "Pixel Whiteness Threshold" + }, + "whitePercent": { + "label": "White Percentage Threshold", + "unit": "%" + }, + "includeBlankPages": { + "label": "Include detected blank pages" + }, + "tooltip": { + "header": { + "title": "Remove Blank Pages Settings" + }, + "threshold": { + "title": "Pixel Whiteness Threshold", + "text": "Controls how white a pixel must be to be considered 'white'. This helps determine what counts as a blank area on the page.", + "bullet1": "0 = Pure black (most restrictive)", + "bullet2": "128 = Medium grey", + "bullet3": "255 = Pure white (least restrictive)" + }, + "whitePercent": { + "title": "White Percentage Threshold", + "text": "Sets the minimum percentage of white pixels required for a page to be considered blank and removed.", + "bullet1": "Lower values (e.g., 80%) = More pages removed", + "bullet2": "Higher values (e.g., 95%) = Only very blank pages removed", + "bullet3": "Use higher values for documents with light backgrounds" + }, + "includeBlankPages": { + "title": "Include Detected Blank Pages", + "text": "When enabled, creates a separate PDF containing all the blank pages that were detected and removed from the original document.", + "bullet1": "Useful for reviewing what was removed", + "bullet2": "Helps verify the detection accuracy", + "bullet3": "Can be disabled to reduce output file size" + } + }, + "submit": "Usuń puste", + "error": { + "failed": "Failed to remove blank pages" + }, + "results": { + "title": "Removed Blank Pages" + }, + "tags": "czyszczenie, usprawnianie, brak treści, organizowanie", "thresholdDesc": "PrÃŗg określający, jak biały musi być biały piksel", - "whitePercent": "Procent białego (%):", - "whitePercentDesc": "Procent strony, ktÃŗra musi być biała, aby została usunięta", - "submit": "Usuń puste" + "whitePercentDesc": "Procent strony, ktÃŗra musi być biała, aby została usunięta" }, "removeAnnotations": { "tags": "komentarze, podświetlanie, notatki, znaczniki, usuwanie", "title": "Usuń notatki", "header": "Usuń notatki", - "submit": "Usuń" + "submit": "Usuń", + "settings": { + "title": "Settings" + }, + "info": { + "title": "About Remove Annotations", + "description": "This tool will remove all annotations (comments, highlights, notes, etc.) from your PDF documents." + }, + "error": { + "failed": "An error occurred while removing annotations from the PDF." + } }, "compare": { "tags": "rozrÃŗÅŧnienie, kontrast, zmiany, analiza", @@ -1082,6 +2341,142 @@ "certSign": { "tags": "uwierzytelnianie, PEM, P12, oficjalny, szyfrowanie", "title": "Podpisywanie certyfikatem", + "filenamePrefix": "signed", + "signMode": { + "stepTitle": "Sign Mode", + "tooltip": { + "header": { + "title": "About PDF Signatures" + }, + "overview": { + "title": "How signatures work", + "text": "Both modes seal the document (any edits are flagged as tampering) and record who/when/how for auditing. Viewer trust depends on the certificate chain." + }, + "manual": { + "title": "Manual - Bring your certificate", + "text": "Use your own certificate files for brand-aligned identity. Can display Trusted when your CA/chain is recognised.", + "use": "Use for: customer-facing, legal, compliance." + }, + "auto": { + "title": "Auto - Zero-setup, instant system seal", + "text": "Signs with a server self-signed certificate. Same tamper-evident seal and audit trail; typically shows Unverified in viewers.", + "use": "Use when: you need speed and consistent internal identity across reviews and records." + }, + "rule": { + "title": "Rule of thumb", + "text": "Need recipient Trusted status? Manual. Need a fast, tamper-evident seal and audit trail with no setup? Auto." + } + } + }, + "certTypeStep": { + "stepTitle": "Certificate Format" + }, + "certFiles": { + "stepTitle": "Certificate Files" + }, + "appearance": { + "stepTitle": "Signature Appearance", + "tooltip": { + "header": { + "title": "About Signature Appearance" + }, + "invisible": { + "title": "Invisible Signatures", + "text": "The signature is added to the PDF for security but won't be visible when viewing the document. Perfect for legal requirements without changing the document's appearance.", + "bullet1": "Provides security without visual changes", + "bullet2": "Meets legal requirements for digital signing", + "bullet3": "Doesn't affect document layout or design" + }, + "visible": { + "title": "Visible Signatures", + "text": "Shows a signature block on the PDF with your name, date, and optional details. Useful when you want readers to clearly see the document is signed.", + "bullet1": "Shows signer name and date on the document", + "bullet2": "Can include reason and location for signing", + "bullet3": "Choose which page to place the signature", + "bullet4": "Optional logo can be included" + } + }, + "invisible": "Invisible", + "options": { + "title": "Signature Details" + }, + "visible": "Visible" + }, + "sign": { + "submit": "Sign PDF", + "results": "Signed PDF" + }, + "error": { + "failed": "An error occurred whilst processing signatures." + }, + "tooltip": { + "header": { + "title": "About Managing Signatures" + }, + "overview": { + "title": "What can this tool do?", + "text": "This tool lets you check if your PDFs are digitally signed and add new digital signatures. Digital signatures prove who created or approved a document and show if it has been changed since signing.", + "bullet1": "Check existing signatures and their validity", + "bullet2": "View detailed information about signers and certificates", + "bullet3": "Add new digital signatures to secure your documents", + "bullet4": "Multiple files supported with easy navigation" + }, + "validation": { + "title": "Checking Signatures", + "text": "When you check signatures, the tool tells you if they're valid, who signed the document, when it was signed, and whether the document has been changed since signing.", + "bullet1": "Shows if signatures are valid or invalid", + "bullet2": "Displays signer information and signing date", + "bullet3": "Checks if the document was modified after signing", + "bullet4": "Can use custom certificates for verification" + }, + "signing": { + "title": "Adding Signatures", + "text": "To sign a PDF, you need a digital certificate (like PEM, PKCS12, or JKS). You can choose to make the signature visible on the document or keep it invisible for security only.", + "bullet1": "Supports PEM, PKCS12, JKS, and server certificate formats", + "bullet2": "Option to show or hide signature on the PDF", + "bullet3": "Add reason, location, and signer name", + "bullet4": "Choose which page to place visible signatures", + "bullet5": "Use server certificate for simple 'Sign with Stirling-PDF' option" + } + }, + "certType": { + "tooltip": { + "header": { + "title": "About Certificate Types" + }, + "what": { + "title": "What's a certificate?", + "text": "It's a secure ID for your signature that proves you signed. Unless you're required to sign via certificate, we recommend using another secure method like Type, Draw, or Upload." + }, + "which": { + "title": "Which option should I use?", + "text": "Choose the format that matches your certificate file:", + "bullet1": "PKCS#12 (.p12 / .pfx) – one combined file (most common)", + "bullet2": "PFX (.pfx) – Microsoft's version of PKCS12", + "bullet3": "PEM – separate private-key and certificate .pem files", + "bullet4": "JKS – Java .jks keystore for dev / CI-CD workflows" + }, + "convert": { + "title": "Key not listed?", + "text": "Convert your file to a Java keystore (.jks) with keytool, then pick JKS." + } + } + }, + "chooseCertificate": "Choose Certificate File", + "chooseJksFile": "Choose JKS File", + "chooseP12File": "Choose PKCS12 File", + "choosePfxFile": "Choose PFX File", + "choosePrivateKey": "Choose Private Key File", + "location": "Lokalizacja", + "logoTitle": "Logo", + "name": "Nazwa", + "noLogo": "No Logo", + "pageNumber": "Page Number", + "password": "WprowadÅē hasło do magazynu kluczy lub klucza prywatnego (jeśli istnieje):", + "passwordOptional": "Leave empty if no password", + "reason": "Organizacja", + "serverCertMessage": "Using server certificate - no files or password required", + "showLogo": "Show Logo", "header": "Podpisz dokument PDF certyfikatem prywatnym (moduł w budowie)", "selectPDF": "Wybierz dokument PDF do podpisania:", "jksNote": "Notka: jeśli twÃŗj typ certyfikatu nie jest widoczny na liście, skonwertuj go do formatu Java Keystore (.jks) uÅŧywając polecenia keytool. Następnie wybierz plik .JKS poniÅŧej z listy.", @@ -1089,13 +2484,7 @@ "selectCert": "Wybierz plik certyfikatu (format X.509, moÅŧe to być .pem lub .der):", "selectP12": "Wybierz plik magazynu kluczy PKCS#12 (.p12 lub .pfx) (opcjonalnie, jeśli jest podany, powinien zawierać klucz prywatny i certyfikat):", "selectJKS": "Wybierz plik Java Keystore (.jks lub .keystore):", - "certType": "Typ certyfikatu", - "password": "WprowadÅē hasło do magazynu kluczy lub klucza prywatnego (jeśli istnieje):", "showSig": "Wyświetl podpis", - "reason": "Organizacja", - "location": "Lokalizacja", - "name": "Nazwa", - "showLogo": "Show Logo", "submit": "Podpisz PDF" }, "removeCertSign": { @@ -1103,7 +2492,18 @@ "title": "Usuń podpis cyfrowy", "header": "Usuń podpis cyfrowy z dokumentu PDF", "selectPDF": "WskaÅŧ plik PDF:", - "submit": "Usuń podpis cyfrowy" + "submit": "Usuń podpis cyfrowy", + "description": "This tool will remove digital certificate signatures from your PDF document.", + "filenamePrefix": "unsigned", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst removing certificate signatures." + }, + "results": { + "title": "Certificate Removal Results" + } }, "pageLayout": { "tags": "scalanie, kompozycja, pojedynczy widok, organizowanie, porządkowanie", @@ -1111,16 +2511,157 @@ "header": "Układ wielu stron", "pagesPerSheet": "Stron na jednym arkuszu:", "addBorder": "Dodaj granicę", - "submit": "Wykonaj" + "submit": "Wykonaj", + "desc": { + "2": "Place 2 pages side-by-side on a single sheet.", + "3": "Place 3 pages on a single sheet in a single row.", + "4": "Place 4 pages on a single sheet (2 × 2 grid).", + "9": "Place 9 pages on a single sheet (3 × 3 grid).", + "16": "Place 16 pages on a single sheet (4 × 4 grid)." + }, + "error": { + "failed": "An error occurred while creating the multi-page layout." + } + }, + "bookletImposition": { + "tags": "booklet,imposition,printing,binding,folding,signature", + "title": "Booklet Imposition", + "header": "Booklet Imposition", + "submit": "Create Booklet", + "spineLocation": { + "label": "Spine Location", + "left": "Left (Standard)", + "right": "Right (RTL)" + }, + "doubleSided": { + "label": "Double-sided printing", + "tooltip": "Creates both front and back sides for proper booklet printing" + }, + "manualDuplex": { + "title": "Manual Duplex Mode", + "instructions": "For printers without automatic duplex. You'll need to run this twice:" + }, + "duplexPass": { + "label": "Print Pass", + "first": "1st Pass", + "second": "2nd Pass", + "firstInstructions": "Prints front sides → stack face-down → run again with 2nd Pass", + "secondInstructions": "Load printed stack face-down → prints back sides" + }, + "rtlBinding": { + "label": "Right-to-left binding", + "tooltip": "For Arabic, Hebrew, or other right-to-left languages" + }, + "addBorder": { + "label": "Add borders around pages", + "tooltip": "Adds borders around each page section to help with cutting and alignment" + }, + "addGutter": { + "label": "Add gutter margin", + "tooltip": "Adds inner margin space for binding" + }, + "gutterSize": { + "label": "Gutter size (points)" + }, + "flipOnShortEdge": { + "label": "Flip on short edge (automatic duplex only)", + "tooltip": "Enable for short-edge duplex printing (automatic duplex only - ignored in manual mode)", + "manualNote": "Not needed in manual mode - you flip the stack yourself" + }, + "advanced": { + "toggle": "Advanced Options" + }, + "paperSizeNote": "Paper size is automatically derived from your first page.", + "tooltip": { + "header": { + "title": "Booklet Creation Guide" + }, + "description": { + "title": "What is Booklet Imposition?", + "text": "Creates professional booklets by arranging pages in the correct printing order. Your PDF pages are placed 2-up on landscape sheets so when folded and bound, they read in proper sequence like a real book." + }, + "example": { + "title": "Example: 8-Page Booklet", + "text": "Your 8-page document becomes 2 sheets:", + "bullet1": "Sheet 1 Front: Pages 8, 1 | Back: Pages 2, 7", + "bullet2": "Sheet 2 Front: Pages 6, 3 | Back: Pages 4, 5", + "bullet3": "When folded & stacked: Reads 1→2→3→4→5→6→7→8" + }, + "printing": { + "title": "How to Print & Assemble", + "text": "Follow these steps for perfect booklets:", + "bullet1": "Print double-sided with 'Flip on long edge'", + "bullet2": "Stack sheets in order, fold in half", + "bullet3": "Staple or bind along the folded spine", + "bullet4": "For short-edge printers: Enable 'Flip on short edge' option" + }, + "manualDuplex": { + "title": "Manual Duplex (Single-sided Printers)", + "text": "For printers without automatic duplex:", + "bullet1": "Turn OFF 'Double-sided printing'", + "bullet2": "Select '1st Pass' → Print → Stack face-down", + "bullet3": "Select '2nd Pass' → Load stack → Print backs", + "bullet4": "Fold and assemble as normal" + }, + "advanced": { + "title": "Advanced Options", + "text": "Fine-tune your booklet:", + "bullet1": "Right-to-Left Binding: For Arabic, Hebrew, or RTL languages", + "bullet2": "Borders: Shows cut lines for trimming", + "bullet3": "Gutter Margin: Adds space for binding/stapling", + "bullet4": "Short-edge Flip: Only for automatic duplex printers" + } + }, + "error": { + "failed": "An error occurred while creating the booklet imposition." + } }, "scalePages": { - "tags": "zmiana rozmiaru, modyfikacja, rozmiar, dostosowanie", "title": "Dopasuj rozmiar stron", "header": "Dopasuj rozmiar stron", "pageSize": "Rozmiar stron dokumentu:", "keepPageSize": "Original Size", "scaleFactor": "Poziom powiększenia (przycięcia) stron:", - "submit": "Wykonaj" + "submit": "Wykonaj", + "tags": "zmiana rozmiaru, modyfikacja, rozmiar, dostosowanie" + }, + "adjustPageScale": { + "tags": "resize,modify,dimension,adapt", + "title": "Adjust Page Scale", + "header": "Adjust Page Scale", + "scaleFactor": { + "label": "Scale Factor" + }, + "pageSize": { + "label": "Target Page Size", + "keep": "Keep Original Size", + "letter": "Letter", + "legal": "Legal" + }, + "submit": "Adjust Page Scale", + "error": { + "failed": "An error occurred while adjusting the page scale." + }, + "tooltip": { + "header": { + "title": "Page Scale Settings Overview" + }, + "description": { + "title": "Description", + "text": "Adjust the size of PDF content and change the page dimensions." + }, + "scaleFactor": { + "title": "Scale Factor", + "text": "Controls how large or small the content appears on the page. Content is scaled and centred - if scaled content is larger than the page size, it may be cropped.", + "bullet1": "1.0 = Original size", + "bullet2": "0.5 = Half size (50% smaller)", + "bullet3": "2.0 = Double size (200% larger, may crop)" + }, + "pageSize": { + "title": "Target Page Size", + "text": "Sets the dimensions of the output PDF pages. 'Keep Original Size' maintains current dimensions, whilst other options resize to standard paper sizes." + } + } }, "add-page-numbers": { "tags": "stronicowanie, etykieta, organizowanie, indeks, index" @@ -1129,16 +2670,83 @@ "tags": "automatyczne wykrywanie, oparte na nagÅ‚Ãŗwkach, organizowanie, ponowne etykietowanie", "title": "Automatyczna zmiana nazwy", "header": "Automatyczna zmiana nazwy dokumentu PDF", - "submit": "Automatyczna zmiana nazwy" + "description": "Automatically finds the title from your PDF content and uses it as the filename.", + "submit": "Automatyczna zmiana nazwy", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst auto-renaming the PDF." + }, + "results": { + "title": "Auto-Rename Results" + }, + "tooltip": { + "header": { + "title": "How Auto-Rename Works" + }, + "howItWorks": { + "title": "Smart Renaming", + "text": "Automatically finds the title from your PDF content and uses it as the filename.", + "bullet1": "Looks for text that appears to be a title or heading", + "bullet2": "Creates a clean, valid filename from the detected title", + "bullet3": "Keeps the original name if no suitable title is found" + } + } }, "adjust-contrast": { "tags": "Korekcja kolorÃŗw, dostrajanie, modyfikacja, ulepszanie" }, "crop": { - "tags": "przycinanie, zmniejszanie, edycja, kształtowanie", "title": "Przytnij", "header": "Przytnij dokument PDF", - "submit": "Wyślij" + "submit": "Wyślij", + "noFileSelected": "Select a PDF file to begin cropping", + "preview": { + "title": "Crop Area Selection" + }, + "reset": "Reset to full PDF", + "coordinates": { + "title": "Position and Size", + "x": { + "label": "X Position", + "desc": "Left edge (points)" + }, + "y": { + "label": "Y Position", + "desc": "Bottom edge (points)" + }, + "width": { + "label": "Width", + "desc": "Crop width (points)" + }, + "height": { + "label": "Height", + "desc": "Crop height (points)" + } + }, + "error": { + "invalidArea": "Crop area extends beyond PDF boundaries", + "failed": "Failed to crop PDF" + }, + "steps": { + "selectArea": "Select Crop Area" + }, + "tooltip": { + "title": "How to Crop PDFs", + "description": "Select the area to crop from your PDF by dragging and resizing the blue overlay on the thumbnail.", + "drag": "Drag the overlay to move the crop area", + "resize": "Drag the corner and edge handles to resize", + "precision": "Use coordinate inputs for precise positioning" + }, + "results": { + "title": "Crop Results" + }, + "automation": { + "info": "Enter crop coordinates in PDF points. Origin (0,0) is at bottom-left. These values will be applied to all PDFs processed in this automation.", + "reference": "Reference: A4 page is 595.28 × 841.89 points (210mm × 297mm). 1 inch = 72 points." + }, + "tags": "przycinanie, zmniejszanie, edycja, kształtowanie" }, "autoSplitPDF": { "tags": "Oparty na QR, rozdzielanie, skanowanie, organizowanie", @@ -1221,24 +2829,124 @@ "downloadJS": "Pobierz Javascript", "submit": "PokaÅŧ" }, - "autoRedact": { - "tags": "Redagowanie, ukrywanie, zaciemnianie, zaczernianie, zaznaczanie, ukrywanie", - "title": "Automatyczne zaciemnienie", - "header": "Automatyczne zaciemnienie", - "colorLabel": "Kolor", - "textsToRedactLabel": "Tekst do zaciemnienia (podzielony liniami)", - "textsToRedactPlaceholder": "przykład \\n Poufne \\n Ściśle tajne", - "useRegexLabel": "UÅŧyj RegExp", - "wholeWordSearchLabel": "Szukaj całego słowa", - "customPaddingLabel": "Dodatkowe wypełnienie", - "convertPDFToImageLabel": "PrzerÃŗb PDF na PDF-obrazowy (usuwa tekst w tle)", - "submitButton": "Wyślij" - }, "redact": { "tags": "Redact,Hide,black out,black,marker,hidden,manual", "title": "Redakcja ręczna", - "header": "Redakcja ręczna", "submit": "Redaguj", + "error": { + "failed": "An error occurred while redacting the PDF." + }, + "modeSelector": { + "title": "Redaction Method", + "mode": "Mode", + "automatic": "Automatic", + "automaticDesc": "Redact text based on search terms", + "manual": "Manual", + "manualDesc": "Click and drag to redact specific areas", + "manualComingSoon": "Manual redaction coming soon" + }, + "auto": { + "header": "Auto Redact", + "settings": { + "title": "Redaction Settings", + "advancedTitle": "Zaawansowane" + }, + "colorLabel": "Box Colour", + "wordsToRedact": { + "title": "Words to Redact", + "placeholder": "Enter a word", + "add": "Dodaj", + "examples": "Examples: Confidential, Top-Secret" + }, + "useRegexLabel": "Use Regex", + "wholeWordSearchLabel": "Whole Word Search", + "customPaddingLabel": "Custom Extra Padding", + "convertPDFToImageLabel": "Convert PDF to PDF-Image" + }, + "tooltip": { + "mode": { + "header": { + "title": "Redaction Method" + }, + "automatic": { + "title": "Automatic Redaction", + "text": "Automatically finds and redacts specified text throughout the document. Perfect for removing consistent sensitive information like names, addresses, or confidential markers." + }, + "manual": { + "title": "Manual Redaction", + "text": "Click and drag to manually select specific areas to redact. Gives you precise control over what gets redacted. (Coming soon)" + } + }, + "words": { + "header": { + "title": "Words to Redact" + }, + "description": { + "title": "Text Matching", + "text": "Enter words or phrases to find and redact in your document. Each word will be searched for separately." + }, + "bullet1": "Add one word at a time", + "bullet2": "Press Enter or click 'Add Another' to add", + "bullet3": "Click × to remove words", + "examples": { + "title": "Common Examples", + "text": "Typical words to redact include: bank details, email addresses, or specific names." + } + }, + "advanced": { + "header": { + "title": "Advanced Redaction Settings" + }, + "color": { + "title": "Box Colour & Padding", + "text": "Customise the appearance of redaction boxes. Black is standard, but you can choose any colour. Padding adds extra space around the found text." + }, + "regex": { + "title": "Use Regex", + "text": "Enable regular expressions for advanced pattern matching. Useful for finding phone numbers, emails, or complex patterns.", + "bullet1": "Example: \\d{4}-\\d{2}-\\d{2} to match any dates in YYYY-MM-DD format", + "bullet2": "Use with caution - test thoroughly" + }, + "wholeWord": { + "title": "Whole Word Search", + "text": "Only match complete words, not partial matches. 'John' won't match 'Johnson' when enabled." + }, + "convert": { + "title": "Convert to PDF-Image", + "text": "Converts the PDF to an image-based PDF after redaction. This ensures text behind redaction boxes is completely removed and unrecoverable." + } + } + }, + "manual": { + "header": "Manual Redaction", + "textBasedRedaction": "Text-based Redaction", + "pageBasedRedaction": "Page-based Redaction", + "convertPDFToImageLabel": "Convert PDF to PDF-Image (Used to remove text behind the box)", + "pageRedactionNumbers": { + "title": "Strony", + "placeholder": "(przykład 1,2,8 lub 2n-1)" + }, + "redactionColor": { + "title": "Redaction Colour" + }, + "export": "Eksportuj", + "upload": "Upload", + "boxRedaction": "Box draw redaction", + "zoom": "Zoom", + "zoomIn": "Zoom in", + "zoomOut": "Zoom out", + "nextPage": "Next Page", + "previousPage": "Previous Page", + "toggleSidebar": "Toggle Sidebar", + "showThumbnails": "Show Thumbnails", + "showDocumentOutline": "Show Document Outline (double-click to expand/collapse all items)", + "showAttachments": "Show Attachments", + "showLayers": "Show Layers (double-click to reset all layers to the default state)", + "colourPicker": "Colour Picker", + "findCurrentOutlineItem": "Find current outline item", + "applyChanges": "Apply Changes" + }, + "header": "Redakcja ręczna", "textBasedRedaction": "Redakcja oparta na tekście", "pageBasedRedaction": "Redakcja oparta na stronach", "convertPDFToImageLabel": "Konwertuj PDF do PDF-Image (słuÅŧy do usuwania tekstu za polem)", @@ -1264,22 +2972,7 @@ "showLayers": "PokaÅŧ warstwy (kliknij dwukrotnie, aby przywrÃŗcić domyślny stan warstw)", "colourPicker": "Selektor kolorÃŗw", "findCurrentOutlineItem": "ZnajdÅē bieÅŧący element zarysu", - "applyChanges": "Zastosuj zmiany", - "auto": { - "settings": { - "advancedTitle": "Zaawansowane" - }, - "wordsToRedact": { - "add": "Dodaj" - } - }, - "manual": { - "pageRedactionNumbers": { - "title": "Strony", - "placeholder": "(przykład 1,2,8 lub 2n-1)" - }, - "export": "Eksportuj" - } + "applyChanges": "Zastosuj zmiany" }, "tableExtraxt": { "tags": "CSV, ekstrakcja tabeli, ekstrakcja, konwersja, wydobywanie" @@ -1290,11 +2983,15 @@ "overlay-pdfs": { "tags": "Nakładka", "header": "NaÅ‚ÃŗÅŧ pliki PDF", + "title": "Overlay PDFs", + "desc": "Overlay one PDF on top of another", "baseFile": { "label": "Wybierz bazowy plik PDF" }, "overlayFiles": { - "label": "Wybierz plik(i) nakładane PDF" + "label": "Wybierz plik(i) nakładane PDF", + "placeholder": "Choose PDF(s)...", + "addMore": "Add more PDFs..." }, "mode": { "label": "Wybierz tryb nakładania", @@ -1304,14 +3001,53 @@ }, "counts": { "label": "Ile potwÃŗrzeń", - "placeholder": "WprowadÅē numerację rozdzieloną przecinkami (2,3,1)" + "placeholder": "WprowadÅē numerację rozdzieloną przecinkami (2,3,1)", + "item": "Count for file", + "noFiles": "Add overlay files to configure counts" }, "position": { "label": "Wybierz miejsce nakładania", "foreground": "PrzÃŗd", "background": "Tło" }, - "submit": "Wyślij" + "submit": "Wyślij", + "settings": { + "title": "Settings" + }, + "results": { + "title": "Overlay Results" + }, + "tooltip": { + "header": { + "title": "Overlay PDFs Overview" + }, + "description": { + "title": "Description", + "text": "Combine a base PDF with one or more overlay PDFs. Overlays can be applied page-by-page in different modes and placed in the foreground or background." + }, + "mode": { + "title": "Overlay Mode", + "text": "Choose how to distribute overlay pages across the base PDF pages.", + "sequential": "Sequential Overlay: Use pages from the first overlay PDF until it ends, then move to the next.", + "interleaved": "Interleaved Overlay: Take one page from each overlay in turn.", + "fixedRepeat": "Fixed Repeat Overlay: Take a set number of pages from each overlay before moving to the next. Use Counts to set the numbers." + }, + "position": { + "title": "Overlay Position", + "text": "Foreground places the overlay on top of the page. Background places it behind." + }, + "overlayFiles": { + "title": "Overlay Files", + "text": "Select one or more PDFs to overlay on the base. The order of these files affects how pages are applied in Sequential and Fixed Repeat modes." + }, + "counts": { + "title": "Counts (Fixed Repeat only)", + "text": "Provide a positive number for each overlay file showing how many pages to take before moving to the next. Required when mode is Fixed Repeat." + } + }, + "error": { + "failed": "An error occurred while overlaying PDFs." + } }, "split-by-sections": { "tags": "Podział sekcji, dzielenie, dostosowywanie", @@ -1332,6 +3068,7 @@ "tags": "Stempel, dodawanie obrazu, wyśrodkowanie obrazu, znak wodny, PDF, osadzanie, dostosowywanie", "header": "Pieczęć PDF", "title": "Pieczęć PDF", + "stampSetup": "Stamp Setup", "stampType": "Typ pieczęci", "stampText": "Tekst w pieczęci", "stampImage": "Obraz w pieczęci", @@ -1344,7 +3081,19 @@ "overrideY": "Nadpisz koordynatę Y", "customMargin": "Własny margines", "customColor": "Własny kolor tekstu", - "submit": "Wyślij" + "submit": "Wyślij", + "noStampSelected": "No stamp selected. Return to Step 1.", + "customPosition": "Drag the stamp to the desired location in the preview window.", + "error": { + "failed": "An error occurred while adding stamp to the PDF." + }, + "imageSize": "Image Size", + "margin": "Margin", + "positionAndFormatting": "Position & Formatting", + "quickPosition": "Select a position on the page to place the stamp.", + "results": { + "title": "Stamp Results" + } }, "removeImagePdf": { "tags": "Usuń obraz, operacje na stronie, back-end, strona serwera" @@ -1362,7 +3111,8 @@ "status": { "_value": "Status", "valid": "Poprawny", - "invalid": "Niepoprawny" + "invalid": "Niepoprawny", + "complete": "Validation complete" }, "signer": "Podpisujący", "date": "Data", @@ -1389,40 +3139,122 @@ "version": "Wersja", "keyUsage": "Zastosowanie klucza", "selfSigned": "Samopodpisany", - "bits": "bity" + "bits": "bity", + "details": "Certificate Details" }, "signature": { "info": "Informacje o podpisie", "_value": "Podpis", "mathValid": "Podpis jest matematycznie poprawny, ALE:" }, - "selectCustomCert": "Niestandardowy plik certyfikatu X.509 (Opcjonalne)" - }, - "replace-color": { - "title": "Zamień-OdwrÃŗÄ‡-Kolor", - "header": "Zamień-OdwrÃŗÄ‡ kolor PDF", - "selectText": { - "1": "Zastąp lub OdwrÃŗÄ‡ opcje kolorÃŗw", - "2": "Domyślnie (domyślne kolory o wysokim kontraście)", - "3": "Niestandardowe (kolory niestandardowe)", - "4": "Całkowita-Odwrotność (OdwrÃŗcenie wszystkich kolorÃŗw)", - "5": "Wysoki kontrast opcji kolorystycznych", - "6": "biały tekst na czarnym tle", - "7": "Czarny tekst na białym tle", - "8": "ÅģÃŗÅ‚ty tekst na czarnym tle", - "9": "Zielony tekst na czarnym tle", - "10": "Wybierz Kolor tekstu", - "11": "Wybierz Kolor tła" + "selectCustomCert": "Niestandardowy plik certyfikatu X.509 (Opcjonalne)", + "downloadCsv": "Download CSV", + "downloadJson": "Download JSON", + "downloadPdf": "Download PDF Report", + "downloadType": { + "csv": "CSV", + "json": "JSON", + "pdf": "PDF" }, - "submit": "Zamień" + "error": { + "allFailed": "Unable to validate the selected files.", + "partial": "Some files could not be validated.", + "reportGeneration": "Could not generate the PDF report. JSON and CSV are available.", + "unexpected": "Unexpected error during validation." + }, + "finalizing": "Preparing downloads...", + "issue": { + "certExpired": "Certificate expired", + "certRevocationUnknown": "Certificate revocation status unknown", + "certRevoked": "Certificate revoked", + "chainInvalid": "Certificate chain invalid", + "signatureInvalid": "Signature cryptographic check failed", + "trustInvalid": "Certificate not trusted" + }, + "noResults": "Run the validation to generate a report.", + "noSignaturesShort": "No signatures", + "processing": "Validating signatures...", + "report": { + "continued": "Continued", + "downloads": "Downloads", + "entryLabel": "Signature Summary", + "fields": { + "created": "Created", + "fileSize": "File Size", + "signatureCount": "Total Signatures", + "signatureDate": "Signature Date" + }, + "filesEvaluated": "{{count}} files evaluated", + "footer": "Validated via Stirling PDF", + "generatedAt": "Generated", + "noPdf": "PDF report will be available after a successful validation.", + "page": "Page", + "shortTitle": "Signature Summary", + "signatureCountLabel": "{{count}} signatures", + "signaturesFound": "{{count}} signatures detected", + "signaturesValid": "{{count}} fully valid", + "title": "Signature Validation Report" + }, + "settings": { + "certHint": "Upload a trusted X.509 certificate to validate against a custom trust source.", + "title": "Validation Settings" + }, + "signatureDate": "Signature Date", + "totalSignatures": "Total Signatures" }, - "replaceColorPdf": { - "tags": "Zastąp kolor, operacje na stronach, back-end, strona serwera" + "replaceColor": { + "tags": "Replace Colour,Page operations,Back end,server side", + "labels": { + "settings": "Settings", + "colourOperation": "Colour operation" + }, + "options": { + "highContrast": "High contrast", + "invertAll": "Invert all colours", + "custom": "Custom", + "cmyk": "Convert to CMYK" + }, + "tooltip": { + "header": { + "title": "Replace & Invert Colour Settings Overview" + }, + "description": { + "title": "Description", + "text": "Transform PDF colours to improve readability and accessibility. Choose from high contrast presets, invert all colours, or create custom colour schemes." + }, + "highContrast": { + "title": "High Contrast", + "text": "Apply predefined high contrast colour combinations designed for better readability and accessibility compliance.", + "bullet1": "White text on black background - Classic dark mode", + "bullet2": "Black text on white background - Standard high contrast", + "bullet3": "Yellow text on black background - High visibility option", + "bullet4": "Green text on black background - Alternative high contrast" + }, + "invertAll": { + "title": "Invert All Colours", + "text": "Completely invert all colours in the PDF, creating a negative-like effect. Useful for creating dark mode versions of documents or reducing eye strain in low-light conditions." + }, + "custom": { + "title": "Custom Colours", + "text": "Define your own text and background colours using the colour pickers. Perfect for creating branded documents or specific accessibility requirements.", + "bullet1": "Text colour - Choose the colour for text elements", + "bullet2": "Background colour - Set the background colour for the document" + }, + "cmyk": { + "title": "Convert to CMYK", + "text": "Convert the PDF from RGB colour space to CMYK colour space, optimized for professional printing. This process converts colours to the Cyan, Magenta, Yellow, Black model used by printers." + } + }, + "error": { + "failed": "An error occurred while processing the colour replacement." + } }, "login": { "title": "Logowanie", "header": "Logowanie", "signin": "Logowanie", + "signInWith": "Sign in with", + "signInAnonymously": "Sign Up as a Guest", "rememberme": "Zapamiętaj", "invalid": "Nieprawidłowe dane logowania", "locked": "Konto jest zablokowane", @@ -1441,12 +3273,83 @@ "alreadyLoggedIn": "Jesteś juÅŧ zalogowany na", "alreadyLoggedIn2": "urządzeniach. Wyloguj się z tych urządzeń i sprÃŗbuj ponownie.", "toManySessions": "Masz zbyt wiele aktywnych sesji", - "logoutMessage": "You have been logged out." + "logoutMessage": "You have been logged out.", + "youAreLoggedIn": "You are logged in!", + "email": "Email", + "password": "Password", + "enterEmail": "Enter your email", + "enterPassword": "Enter your password", + "loggingIn": "Logging In...", + "username": "Username", + "enterUsername": "Enter username", + "useEmailInstead": "Login with email", + "forgotPassword": "Forgot your password?", + "logIn": "Log In", + "signingIn": "Signing in...", + "login": "Login", + "or": "Or", + "useMagicLink": "Use magic link instead", + "enterEmailForMagicLink": "Enter your email for magic link", + "sending": "Sendingâ€Ļ", + "sendMagicLink": "Send Magic Link", + "cancel": "Cancel", + "dontHaveAccount": "Don't have an account? Sign up", + "home": "Home", + "debug": "Debug", + "signOut": "Sign Out", + "pleaseEnterBoth": "Please enter both email and password", + "pleaseEnterEmail": "Please enter your email address", + "magicLinkSent": "Magic link sent to {{email}}! Check your email and click the link to sign in.", + "passwordResetSent": "Password reset link sent to {{email}}! Check your email and follow the instructions.", + "failedToSignIn": "Failed to sign in with {{provider}}: {{message}}", + "unexpectedError": "Unexpected error: {{message}}", + "accountCreatedSuccess": "Account created successfully! You can now sign in.", + "passwordChangedSuccess": "Password changed successfully! Please sign in with your new password.", + "credentialsUpdated": "Your credentials have been updated. Please sign in again." + }, + "signup": { + "title": "Create an account", + "subtitle": "Join Stirling PDF to get started", + "name": "Name", + "email": "Email", + "password": "Password", + "confirmPassword": "Confirm password", + "enterName": "Enter your name", + "enterEmail": "Enter your email", + "enterPassword": "Enter your password", + "confirmPasswordPlaceholder": "Confirm password", + "or": "or", + "creatingAccount": "Creating Account...", + "signUp": "Sign Up", + "alreadyHaveAccount": "Already have an account? Sign in", + "pleaseFillAllFields": "Please fill in all fields", + "passwordsDoNotMatch": "Passwords do not match", + "passwordTooShort": "Password must be at least 6 characters long", + "invalidEmail": "Please enter a valid email address", + "checkEmailConfirmation": "Check your email for a confirmation link to complete your registration.", + "accountCreatedSuccessfully": "Account created successfully! You can now sign in.", + "unexpectedError": "Unexpected error: {{message}}", + "useEmailInstead": "Use Email Instead", + "nameRequired": "Name is required", + "emailRequired": "Email is required", + "passwordRequired": "Password is required", + "confirmPasswordRequired": "Please confirm your password" }, "pdfToSinglePage": { "title": "PDF do pojedyńczej strony", "header": "PDF do pojedyńczej strony", - "submit": "Zapisz dokument jako PDF z jedną stroną" + "submit": "Zapisz dokument jako PDF z jedną stroną", + "description": "This tool will merge all pages of your PDF into one large single page. The width will remain the same as the original pages, but the height will be the sum of all page heights.", + "filenamePrefix": "single_page", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst converting to single page." + }, + "results": { + "title": "Single Page Results" + } }, "pageExtracter": { "title": "Wyciągnij stronę", @@ -1470,18 +3373,59 @@ "adjustContrast": { "title": "Dopasuj kontrast", "header": "Dopasuj kontrast", + "basic": "Basic Adjustments", "contrast": "Kontrast:", "brightness": "Jasność:", "saturation": "Nasycenie:", - "download": "Pobierz" + "download": "Pobierz", + "adjustColors": "Adjust Colors", + "blue": "Blue", + "confirm": "Confirm", + "error": { + "failed": "Failed to adjust colors/contrast" + }, + "green": "Green", + "noPreview": "Select a PDF to preview", + "red": "Red", + "results": { + "title": "Adjusted PDF" + } }, "compress": { "title": "Kompresuj", + "desc": "Compress PDFs to reduce their file size.", "header": "Kompresuj PDF", + "method": { + "title": "Compression Method", + "quality": "Quality", + "filesize": "Rozmiar pliku" + }, "credit": "Ta usługa uÅŧywa qpdf do kompresji/optymalizacji PDF.", "grayscale": { "label": "Zastosuj skalę szarości do kompresji" }, + "tooltip": { + "header": { + "title": "Compress Settings Overview" + }, + "description": { + "title": "Description", + "text": "Compression is an easy way to reduce your file size. Pick File Size to enter a target size and have us adjust quality for you. Pick Quality to set compression strength manually." + }, + "qualityAdjustment": { + "title": "Quality Adjustment", + "text": "Drag the slider to adjust the compression strength. Lower values (1-3) preserve quality but result in larger files. Higher values (7-9) shrink the file more but reduce image clarity.", + "bullet1": "Lower values preserve quality", + "bullet2": "Higher values reduce file size" + }, + "grayscale": { + "title": "Grayscale", + "text": "Select this option to convert all images to black and white, which can significantly reduce file size especially for scanned PDFs or image-heavy documents." + } + }, + "error": { + "failed": "An error occurred while compressing the PDF." + }, "selectText": { "1": { "_value": "Ustawienia kompresji", @@ -1491,10 +3435,7 @@ "4": "Tryb automatyczny - Automatycznie dostosowuje jakość, aby uzyskać dokładny rozmiar pliku PDF", "5": "Oczekiwany rozmiar pliku PDF (np. 25 MB, 10,8 MB, 25 KB)" }, - "submit": "Kompresuj", - "method": { - "filesize": "Rozmiar pliku" - } + "submit": "Kompresuj" }, "decrypt": { "passwordPrompt": "Ten plik jest chroniony hasłem. WprowadÅē hasło:", @@ -1595,7 +3536,13 @@ "title": "Usuń obraz", "header": "Usuń obraz", "removeImage": "Usuń obraz", - "submit": "Usuń obraz" + "submit": "Usuń obraz", + "error": { + "failed": "Failed to remove images from the PDF." + }, + "results": { + "title": "Remove Images Results" + } }, "splitByChapters": { "title": "Podziel PDF według RozdziaÅ‚Ãŗw", @@ -1629,6 +3576,12 @@ }, "note": "Informacje o wydaniu są dostępne tylko w języku angielskim" }, + "swagger": { + "title": "API Documentation", + "header": "API Documentation", + "desc": "View and test the Stirling PDF API endpoints", + "tags": "api,documentation,swagger,endpoints,development" + }, "cookieBanner": { "popUp": { "title": "How we use Cookies", @@ -1664,54 +3617,943 @@ "title": "Analytics", "description": "These cookies help us understand how our tools are being used, so we can focus on building the features our community values most. Rest assured—Stirling PDF cannot and will never track the content of the documents you work with." } + }, + "services": { + "posthog": "PostHog Analytics", + "scarf": "Scarf Pixel" } }, - "download": "Pobierz", - "undo": "Cofnij", - "convert": { - "title": "Konwertuj", - "settings": "Ustawienia", - "color": "kolor", - "greyscale": "Odcień szarości", - "fillPage": "Wypełnij stronę", - "pdfaDigitalSignatureWarning": "Dokument zawiera podpis cyfrowy, nie zostanie on wczytany.", - "grayscale": "Odcień szarości" + "removeMetadata": { + "submit": "Remove Metadata" }, - "attachments": { - "tags": "embed,attach,file,attachment,attachments", - "title": "Add attachments", - "header": "Add attachments", - "submit": "Add attachments" + "sidebar": { + "toggle": "Toggle Sidebar" + }, + "theme": { + "toggle": "Toggle Theme" + }, + "view": { + "viewer": "Viewer", + "pageEditor": "Page Editor", + "fileManager": "File Manager" + }, + "pageEditor": { + "title": "Page Editor", + "save": "Save Changes", + "noPdfLoaded": "No PDF loaded. Please upload a PDF to edit.", + "rotatedLeft": "Rotated left:", + "rotatedRight": "Rotated right:", + "deleted": "Deleted:", + "movedLeft": "Moved left:", + "movedRight": "Moved right:", + "splitAt": "Split at:", + "insertedPageBreak": "Inserted page break at:", + "addFileNotImplemented": "Add file not implemented in demo", + "closePdf": "Close PDF", + "reset": "Reset Changes", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "fitToWidth": "Fit to Width", + "actualSize": "Actual Size" + }, + "viewer": { + "firstPage": "First Page", + "lastPage": "Last Page", + "previousPage": "Previous Page", + "nextPage": "Next Page", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "singlePageView": "Single Page View", + "dualPageView": "Dual Page View" }, "rightRail": { + "closeSelected": "Close Selected Files", "selectAll": "Zaznacz wszystko", - "deselectAll": "Odznacz wszystko" + "deselectAll": "Odznacz wszystko", + "selectByNumber": "Select by Page Numbers", + "deleteSelected": "Delete Selected Pages", + "closePdf": "Close PDF", + "exportAll": "Export PDF", + "downloadSelected": "Download Selected Files", + "downloadAll": "Download All", + "toggleTheme": "Toggle Theme", + "language": "Language", + "search": "Search PDF", + "panMode": "Pan Mode", + "rotateLeft": "Rotate Left", + "rotateRight": "Rotate Right", + "toggleSidebar": "Toggle Sidebar", + "exportSelected": "Export Selected Pages", + "toggleAnnotations": "Toggle Annotations Visibility", + "annotationMode": "Toggle Annotation Mode", + "draw": "Draw", + "save": "Save" + }, + "search": { + "title": "Search PDF", + "placeholder": "Enter search term...", + "noResults": "No results found", + "searching": "Searching..." + }, + "guestBanner": { + "title": "You're using Stirling PDF as a guest!", + "message": "Create a free account to save your work, access more features, and support the project.", + "dismiss": "Dismiss banner", + "signUp": "Sign Up Free" + }, + "toolPicker": { + "searchPlaceholder": "Search tools...", + "noToolsFound": "No tools found", + "allTools": "ALL TOOLS", + "quickAccess": "QUICK ACCESS", + "categories": { + "standardTools": "Standard Tools", + "advancedTools": "Advanced Tools", + "recommendedTools": "Recommended Tools" + }, + "subcategories": { + "signing": "Signing", + "documentSecurity": "Document Security", + "verification": "Verification", + "documentReview": "Document Review", + "pageFormatting": "Page Formatting", + "extraction": "Extraction", + "removal": "Removal", + "automation": "Automation", + "general": "General", + "advancedFormatting": "Advanced Formatting", + "developerTools": "Developer Tools" + } }, "quickAccess": { - "sign": "Podpis" + "read": "Read", + "sign": "Podpis", + "automate": "Automate", + "files": "Files", + "activity": "Activity", + "help": "Help", + "account": "Account", + "config": "Config", + "adminSettings": "Admin Settings", + "allTools": "All Tools" + }, + "admin": { + "error": "Error", + "success": "Success", + "expand": "Expand", + "close": "Close", + "status": { + "active": "Active", + "inactive": "Inactive" + }, + "settings": { + "title": "Admin Settings", + "workspace": "Workspace", + "fetchError": "Failed to load settings", + "saveError": "Failed to save settings", + "saved": "Settings saved successfully", + "saveSuccess": "Settings saved successfully", + "save": "Save Changes", + "restartRequired": "Restart Required", + "restart": { + "title": "Restart Required", + "message": "Settings have been saved successfully. A server restart is required for the changes to take effect.", + "question": "Would you like to restart the server now or later?", + "now": "Restart Now", + "later": "Restart Later" + }, + "restarting": "Restarting Server", + "restartingMessage": "The server is restarting. Please wait a moment...", + "restartError": "Failed to restart server. Please restart manually.", + "general": { + "title": "System Settings", + "description": "Configure system-wide application settings including branding and default behaviour.", + "ui": "User Interface", + "system": "System", + "appName": { + "label": "Application Name", + "description": "The name displayed in the browser tab and home page" + }, + "appNameNavbar": { + "label": "Navbar Brand", + "description": "The name displayed in the navigation bar" + }, + "homeDescription": { + "label": "Home Description", + "description": "The description text shown on the home page" + }, + "defaultLocale": { + "label": "Default Locale", + "description": "The default language for new users (e.g., en_US, es_ES)" + }, + "fileUploadLimit": { + "label": "File Upload Limit", + "description": "Maximum file upload size (e.g., 100MB, 1GB)" + }, + "showUpdate": { + "label": "Show Update Notifications", + "description": "Display notifications when a new version is available" + }, + "showUpdateOnlyAdmin": { + "label": "Show Updates to Admins Only", + "description": "Restrict update notifications to admin users only" + }, + "customHTMLFiles": { + "label": "Custom HTML Files", + "description": "Allow serving custom HTML files from the customFiles directory" + }, + "languages": { + "label": "Available Languages", + "description": "Languages that users can select from (leave empty to enable all languages)" + }, + "customMetadata": { + "label": "Custom Metadata", + "autoUpdate": { + "label": "Auto Update Metadata", + "description": "Automatically update PDF metadata on all processed documents" + }, + "author": { + "label": "Default Author", + "description": "Default author for PDF metadata (e.g., username)" + }, + "creator": { + "label": "Default Creator", + "description": "Default creator for PDF metadata" + }, + "producer": { + "label": "Default Producer", + "description": "Default producer for PDF metadata" + } + }, + "customPaths": { + "label": "Custom Paths", + "description": "Configure custom file system paths for pipeline processing and external tools", + "pipeline": { + "label": "Pipeline Directories", + "watchedFoldersDir": { + "label": "Watched Folders Directory", + "description": "Directory where pipeline monitors for incoming PDFs (leave empty for default: /pipeline/watchedFolders)" + }, + "finishedFoldersDir": { + "label": "Finished Folders Directory", + "description": "Directory where processed PDFs are outputted (leave empty for default: /pipeline/finishedFolders)" + } + }, + "operations": { + "label": "External Tool Paths", + "weasyprint": { + "label": "WeasyPrint Executable", + "description": "Path to WeasyPrint executable for HTML to PDF conversion (leave empty for default: /opt/venv/bin/weasyprint)" + }, + "unoconvert": { + "label": "Unoconvert Executable", + "description": "Path to LibreOffice unoconvert for document conversions (leave empty for default: /opt/venv/bin/unoconvert)" + } + } + } + }, + "security": { + "title": "Security", + "description": "Configure authentication, login behaviour, and security policies.", + "ssoNotice": { + "title": "Looking for SSO/SAML settings?", + "message": "OAuth2 and SAML2 authentication providers have been moved to the Connections menu for easier management." + }, + "authentication": "Authentication", + "enableLogin": { + "label": "Enable Login", + "description": "Require users to log in before accessing the application" + }, + "loginMethod": { + "label": "Login Method", + "description": "The authentication method to use for user login", + "all": "All Methods", + "normal": "Username/Password Only", + "oauth2": "OAuth2 Only", + "saml2": "SAML2 Only" + }, + "loginAttemptCount": { + "label": "Login Attempt Limit", + "description": "Maximum number of failed login attempts before account lockout" + }, + "loginResetTimeMinutes": { + "label": "Login Reset Time (minutes)", + "description": "Time before failed login attempts are reset" + }, + "csrfDisabled": { + "label": "Disable CSRF Protection", + "description": "Disable Cross-Site Request Forgery protection (not recommended)" + }, + "initialLogin": { + "label": "Initial Login", + "username": { + "label": "Initial Username", + "description": "The username for the initial admin account" + }, + "password": { + "label": "Initial Password", + "description": "The password for the initial admin account" + } + }, + "jwt": { + "label": "JWT Configuration", + "secureCookie": { + "label": "Secure Cookie", + "description": "Require HTTPS for JWT cookies (recommended for production)" + }, + "keyRetentionDays": { + "label": "Key Retention Days", + "description": "Number of days to retain old JWT keys for verification" + }, + "persistence": { + "label": "Enable Key Persistence", + "description": "Store JWT keys persistently to survive server restarts" + }, + "enableKeyRotation": { + "label": "Enable Key Rotation", + "description": "Automatically rotate JWT signing keys periodically" + }, + "enableKeyCleanup": { + "label": "Enable Key Cleanup", + "description": "Automatically remove expired JWT keys" + } + }, + "audit": { + "label": "Audit Logging", + "enabled": { + "label": "Enable Audit Logging", + "description": "Track user actions and system events for compliance and security monitoring" + }, + "level": { + "label": "Audit Level", + "description": "0=OFF, 1=BASIC, 2=STANDARD, 3=VERBOSE" + }, + "retentionDays": { + "label": "Audit Retention (days)", + "description": "Number of days to retain audit logs" + } + }, + "htmlUrlSecurity": { + "label": "HTML URL Security", + "description": "Configure URL access restrictions for HTML processing to prevent SSRF attacks", + "enabled": { + "label": "Enable URL Security", + "description": "Enable URL security restrictions for HTML to PDF conversions" + }, + "level": { + "label": "Security Level", + "description": "MAX: whitelist only, MEDIUM: block internal networks, OFF: no restrictions", + "max": "Maximum (Whitelist Only)", + "medium": "Medium (Block Internal)", + "off": "Off (No Restrictions)" + }, + "advanced": "Advanced Settings", + "allowedDomains": { + "label": "Allowed Domains (Whitelist)", + "description": "One domain per line (e.g., cdn.example.com). Only these domains allowed when level is MAX" + }, + "blockedDomains": { + "label": "Blocked Domains (Blacklist)", + "description": "One domain per line (e.g., malicious.com). Additional domains to block" + }, + "internalTlds": { + "label": "Internal TLDs", + "description": "One TLD per line (e.g., .local, .internal). Block domains with these TLD patterns" + }, + "networkBlocking": "Network Blocking", + "blockPrivateNetworks": { + "label": "Block Private Networks", + "description": "Block RFC 1918 private networks (10.x.x.x, 192.168.x.x, 172.16-31.x.x)" + }, + "blockLocalhost": { + "label": "Block Localhost", + "description": "Block localhost and loopback addresses (127.x.x.x, ::1)" + }, + "blockLinkLocal": { + "label": "Block Link-Local Addresses", + "description": "Block link-local addresses (169.254.x.x, fe80::/10)" + }, + "blockCloudMetadata": { + "label": "Block Cloud Metadata Endpoints", + "description": "Block cloud provider metadata endpoints (169.254.169.254)" + } + } + }, + "connections": { + "title": "Connections", + "description": "Configure external authentication providers like OAuth2 and SAML.", + "linkedServices": "Linked Services", + "unlinkedServices": "Unlinked Services", + "connect": "Connect", + "disconnect": "Disconnect", + "disconnected": "Provider disconnected successfully", + "disconnectError": "Failed to disconnect provider", + "ssoAutoLogin": { + "label": "SSO Auto Login", + "enable": "Enable SSO Auto Login", + "description": "Automatically redirect to SSO login when authentication is required" + }, + "oauth2": { + "label": "OAuth2", + "enabled": { + "label": "Enable OAuth2", + "description": "Allow users to authenticate using OAuth2 providers" + }, + "provider": { + "label": "Provider", + "description": "The OAuth2 provider to use for authentication" + }, + "issuer": { + "label": "Issuer URL", + "description": "The OAuth2 provider issuer URL" + }, + "clientId": { + "label": "Client ID", + "description": "The OAuth2 client ID from your provider" + }, + "clientSecret": { + "label": "Client Secret", + "description": "The OAuth2 client secret from your provider" + }, + "useAsUsername": { + "label": "Use as Username", + "description": "The OAuth2 claim to use as the username (e.g., email, sub)" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first OAuth2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via OAuth2" + }, + "scopes": { + "label": "OAuth2 Scopes", + "description": "Comma-separated list of OAuth2 scopes to request (e.g., openid, profile, email)" + } + }, + "saml2": { + "label": "SAML2", + "enabled": { + "label": "Enable SAML2", + "description": "Allow users to authenticate using SAML2 providers" + }, + "provider": { + "label": "Provider", + "description": "The SAML2 provider name" + }, + "registrationId": { + "label": "Registration ID", + "description": "The SAML2 registration identifier" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first SAML2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via SAML2" + } + } + }, + "database": { + "title": "Database", + "description": "Configure custom database connection settings for enterprise deployments.", + "configuration": "Database Configuration", + "enableCustom": { + "label": "Enable Custom Database", + "description": "Use your own custom database configuration instead of the default embedded database" + }, + "customUrl": { + "label": "Custom Database URL", + "description": "Full JDBC connection string (e.g., jdbc:postgresql://localhost:5432/postgres). If provided, individual connection settings below are not used." + }, + "type": { + "label": "Database Type", + "description": "Type of database (not used if custom URL is provided)" + }, + "hostName": { + "label": "Host Name", + "description": "Database server hostname (not used if custom URL is provided)" + }, + "port": { + "label": "Port", + "description": "Database server port (not used if custom URL is provided)" + }, + "name": { + "label": "Database Name", + "description": "Name of the database (not used if custom URL is provided)" + }, + "username": { + "label": "Username", + "description": "Database authentication username" + }, + "password": { + "label": "Password", + "description": "Database authentication password" + } + }, + "privacy": { + "title": "Privacy", + "description": "Configure privacy and data collection settings.", + "analytics": "Analytics & Tracking", + "enableAnalytics": { + "label": "Enable Analytics", + "description": "Collect anonymous usage analytics to help improve the application" + }, + "metricsEnabled": { + "label": "Enable Metrics", + "description": "Enable collection of performance and usage metrics. Provides API endpoint for admins to access metrics data" + }, + "searchEngine": "Search Engine Visibility", + "googleVisibility": { + "label": "Google Visibility", + "description": "Allow search engines to index this application" + } + }, + "advanced": { + "title": "Advanced", + "description": "Configure advanced features and experimental functionality.", + "features": "Feature Flags", + "processing": "Processing", + "endpoints": { + "label": "Endpoints", + "manage": "Manage API Endpoints", + "description": "Endpoint management is configured via YAML. See documentation for details on enabling/disabling specific endpoints." + }, + "enableAlphaFunctionality": { + "label": "Enable Alpha Features", + "description": "Enable experimental and alpha-stage features (may be unstable)" + }, + "enableUrlToPDF": { + "label": "Enable URL to PDF", + "description": "Allow conversion of web pages to PDF documents" + }, + "maxDPI": { + "label": "Maximum DPI", + "description": "Maximum DPI for image processing (0 = unlimited)" + }, + "tessdataDir": { + "label": "Tessdata Directory", + "description": "Path to the tessdata directory for OCR language files" + }, + "disableSanitize": { + "label": "Disable HTML Sanitization", + "description": "WARNING: Security risk - disabling HTML sanitization can lead to XSS vulnerabilities" + }, + "tempFileManagement": { + "label": "Temp File Management", + "description": "Configure temporary file storage and cleanup behavior", + "baseTmpDir": { + "label": "Base Temp Directory", + "description": "Base directory for temporary files (leave empty for default: java.io.tmpdir/stirling-pdf)" + }, + "libreofficeDir": { + "label": "LibreOffice Temp Directory", + "description": "Directory for LibreOffice temp files (leave empty for default: baseTmpDir/libreoffice)" + }, + "systemTempDir": { + "label": "System Temp Directory", + "description": "System temp directory to clean (only used if cleanupSystemTemp is enabled)" + }, + "prefix": { + "label": "Temp File Prefix", + "description": "Prefix for temp file names" + }, + "maxAgeHours": { + "label": "Max Age (hours)", + "description": "Maximum age in hours before temp files are cleaned up" + }, + "cleanupIntervalMinutes": { + "label": "Cleanup Interval (minutes)", + "description": "How often to run cleanup (in minutes)" + }, + "startupCleanup": { + "label": "Startup Cleanup", + "description": "Clean up old temp files on application startup" + }, + "cleanupSystemTemp": { + "label": "Cleanup System Temp", + "description": "Whether to clean broader system temp directory (use with caution)" + } + }, + "processExecutor": { + "label": "Process Executor Limits", + "description": "Configure session limits and timeouts for each process executor", + "sessionLimit": { + "label": "Session Limit", + "description": "Maximum concurrent instances" + }, + "timeout": { + "label": "Timeout (minutes)", + "description": "Maximum execution time" + }, + "libreOffice": "LibreOffice", + "pdfToHtml": "PDF to HTML", + "qpdf": "QPDF", + "tesseract": "Tesseract OCR", + "pythonOpenCv": "Python OpenCV", + "weasyPrint": "WeasyPrint", + "installApp": "Install App", + "calibre": "Calibre", + "ghostscript": "Ghostscript", + "ocrMyPdf": "OCRmyPDF" + } + }, + "mail": { + "title": "Mail Server", + "description": "Configure SMTP settings for sending email notifications.", + "smtp": "SMTP Configuration", + "enabled": { + "label": "Enable Mail", + "description": "Enable email notifications and SMTP functionality" + }, + "host": { + "label": "SMTP Host", + "description": "The hostname or IP address of your SMTP server" + }, + "port": { + "label": "SMTP Port", + "description": "The port number for SMTP connection (typically 25, 465, or 587)" + }, + "username": { + "label": "SMTP Username", + "description": "Username for SMTP authentication" + }, + "password": { + "label": "SMTP Password", + "description": "Password for SMTP authentication" + }, + "from": { + "label": "From Address", + "description": "The email address to use as the sender" + }, + "enableInvites": { + "label": "Enable Email Invites", + "description": "Allow admins to invite users via email with auto-generated passwords" + }, + "frontendUrl": { + "label": "Frontend URL", + "description": "Base URL for frontend (e.g. https://pdf.example.com). Used for generating invite links in emails. Leave empty to use backend URL." + } + }, + "legal": { + "title": "Legal Documents", + "description": "Configure links to legal documents and policies.", + "disclaimer": { + "title": "Legal Responsibility Warning", + "message": "By customizing these legal documents, you assume full responsibility for ensuring compliance with all applicable laws and regulations, including but not limited to GDPR and other EU data protection requirements. Only modify these settings if: (1) you are operating a personal/private instance, (2) you are outside EU jurisdiction and understand your local legal obligations, or (3) you have obtained proper legal counsel and accept sole responsibility for all user data and legal compliance. Stirling-PDF and its developers assume no liability for your legal obligations." + }, + "termsAndConditions": { + "label": "Terms and Conditions", + "description": "URL or filename to terms and conditions" + }, + "privacyPolicy": { + "label": "Privacy Policy", + "description": "URL or filename to privacy policy" + }, + "accessibilityStatement": { + "label": "Accessibility Statement", + "description": "URL or filename to accessibility statement" + }, + "cookiePolicy": { + "label": "Cookie Policy", + "description": "URL or filename to cookie policy" + }, + "impressum": { + "label": "Impressum", + "description": "URL or filename to impressum (required in some jurisdictions)" + } + }, + "premium": { + "title": "Premium & Enterprise", + "description": "Configure your premium or enterprise license key.", + "license": "License Configuration", + "key": { + "label": "License Key", + "description": "Enter your premium or enterprise license key" + }, + "enabled": { + "label": "Enable Premium Features", + "description": "Enable license key checks for pro/enterprise features" + }, + "movedFeatures": { + "title": "Premium Features Distributed", + "message": "Premium and Enterprise features are now organized in their respective sections:" + } + }, + "features": { + "title": "Features", + "description": "Configure optional features and functionality.", + "serverCertificate": { + "label": "Server Certificate", + "description": "Configure server-side certificate generation for \"Sign with Stirling-PDF\" functionality", + "enabled": { + "label": "Enable Server Certificate", + "description": "Enable server-side certificate for \"Sign with Stirling-PDF\" option" + }, + "organizationName": { + "label": "Organization Name", + "description": "Organization name for generated certificates" + }, + "validity": { + "label": "Certificate Validity (days)", + "description": "Number of days the certificate will be valid" + }, + "regenerateOnStartup": { + "label": "Regenerate on Startup", + "description": "Generate new certificate on each application startup" + } + } + }, + "endpoints": { + "title": "API Endpoints", + "description": "Control which API endpoints and endpoint groups are available.", + "management": "Endpoint Management", + "toRemove": { + "label": "Disabled Endpoints", + "description": "Select individual endpoints to disable" + }, + "groupsToRemove": { + "label": "Disabled Endpoint Groups", + "description": "Select endpoint groups to disable" + }, + "note": "Note: Disabling endpoints restricts API access but does not remove UI components. Restart required for changes to take effect." + } + } }, "fileUpload": { + "selectFile": "Select a file", + "selectFiles": "Select files", + "selectPdfToView": "Select a PDF to view", + "selectPdfToEdit": "Select a PDF to edit", + "chooseFromStorage": "Choose a file from storage or upload a new PDF", + "chooseFromStorageMultiple": "Choose files from storage or upload new PDFs", + "loadFromStorage": "Load from Storage", + "filesAvailable": "files available", "loading": "Ładowanie...", - "or": "lub" + "or": "lub", + "dropFileHere": "Drop file here or click to upload", + "dropFilesHere": "Drop files here or click the upload button", + "pdfFilesOnly": "PDF files only", + "supportedFileTypes": "Supported file types", + "upload": "Upload", + "uploadFile": "Upload File", + "uploadFiles": "Upload Files", + "noFilesInStorage": "No files available in storage. Upload some files first.", + "selectFromStorage": "Select from Storage", + "backToTools": "Back to Tools", + "addFiles": "Add Files", + "dragFilesInOrClick": "Drag files in or click \"Add Files\" to browse" + }, + "fileEditor": { + "addFiles": "Add Files" }, "fileManager": { + "title": "Upload PDF Files", + "subtitle": "Add files to your storage for easy access across tools", + "filesSelected": "files selected", + "clearSelection": "Clear Selection", + "openInFileEditor": "Open in File Editor", + "uploadError": "Failed to upload some files.", + "failedToOpen": "Failed to open file. It may have been removed from storage.", + "failedToLoad": "Failed to load file to active set.", + "storageCleared": "Browser cleared storage. Files have been removed. Please re-upload.", + "clearAll": "Clear All", + "reloadFiles": "Reload Files", + "dragDrop": "Drag & Drop files here", + "clickToUpload": "Click to upload files", + "selectedFiles": "Selected Files", + "storage": "Storage", + "filesStored": "files stored", + "storageError": "Storage error occurred", + "storageLow": "Storage is running low. Consider removing old files.", + "supportMessage": "Powered by browser database storage for unlimited capacity", + "noFileSelected": "No files selected", + "showHistory": "Show History", + "hideHistory": "Hide History", + "fileHistory": "File History", + "loadingHistory": "Loading History...", + "lastModified": "Last Modified", + "toolChain": "Tools Applied", + "restore": "Restore", + "unzip": "Unzip", + "searchFiles": "Search files...", + "recent": "Recent", + "localFiles": "Local Files", + "googleDrive": "Google Drive", + "googleDriveShort": "Drive", + "myFiles": "My Files", + "noRecentFiles": "No recent files found", + "googleDriveNotAvailable": "Google Drive integration not available", + "openFiles": "Open Files", + "openFile": "Open File", + "details": "File Details", "fileName": "Nazwa", + "fileFormat": "Format", + "fileSize": "Size", "fileVersion": "Wersja", + "totalSelected": "Total Selected", + "dropFilesHere": "Drop files here", "selectAll": "Zaznacz wszystko", "deselectAll": "Odznacz wszystko", "deleteSelected": "Usuń zaznaczone", + "downloadSelected": "Download Selected", + "selectedCount": "{{count}} selected", "download": "Pobierz", - "delete": "usuń" + "delete": "usuń", + "unsupported": "Unsupported", + "addToUpload": "Add to Upload", + "deleteAll": "Delete All", + "loadingFiles": "Loading files...", + "noFiles": "No files available", + "noFilesFound": "No files found matching your search", + "openInPageEditor": "Open in Page Editor", + "showAll": "Show All", + "sortByDate": "Sort by Date", + "sortByName": "Sort by Name", + "sortBySize": "Sort by Size" + }, + "storage": { + "temporaryNotice": "Files are stored temporarily in your browser and may be cleared automatically", + "storageLimit": "Storage limit", + "storageUsed": "Temporary Storage used", + "storageFull": "Storage is nearly full. Consider removing some files.", + "fileTooLarge": "File too large. Maximum size per file is", + "storageQuotaExceeded": "Storage quota exceeded. Please remove some files before uploading more.", + "approximateSize": "Approximate size" }, "sanitize": { + "title": "Sanitise", + "desc": "Remove potentially harmful elements from PDF files.", "submit": "Dezynfekuj PDF", + "completed": "Sanitisation completed successfully", + "error": { + "generic": "Sanitisation failed", + "failed": "An error occurred while sanitising the PDF." + }, + "filenamePrefix": "sanitised", + "sanitizationResults": "Sanitisation Results", "steps": { - "settings": "Ustawienia" + "files": "Files", + "settings": "Ustawienia", + "results": "Results" + }, + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "options": { + "title": "Sanitisation Options", + "note": "Select the elements you want to remove from the PDF. At least one option must be selected.", + "removeJavaScript": { + "label": "Remove JavaScript", + "desc": "Remove JavaScript actions and scripts from the PDF" + }, + "removeEmbeddedFiles": { + "label": "Remove Embedded Files", + "desc": "Remove any files embedded within the PDF" + }, + "removeXMPMetadata": { + "label": "Remove XMP Metadata", + "desc": "Remove XMP metadata from the PDF" + }, + "removeMetadata": { + "label": "Remove Document Metadata", + "desc": "Remove document information metadata (title, author, etc.)" + }, + "removeLinks": { + "label": "Remove Links", + "desc": "Remove external links and launch actions from the PDF" + }, + "removeFonts": { + "label": "Remove Fonts", + "desc": "Remove embedded fonts from the PDF" + } + } + }, + "addPassword": { + "title": "Dodaj hasło", + "desc": "Encrypt your PDF document with a password.", + "completed": "Password protection applied", + "submit": "Zablokuj", + "filenamePrefix": "encrypted", + "error": { + "failed": "An error occurred while encrypting the PDF." + }, + "passwords": { + "stepTitle": "Passwords & Encryption", + "completed": "Passwords configured", + "user": { + "label": "User Password", + "placeholder": "Enter user password" + }, + "owner": { + "label": "Owner Password", + "placeholder": "Enter owner password" + } + }, + "encryption": { + "keyLength": { + "label": "Encryption Key Length", + "40bit": "40-bit (Low)", + "128bit": "128-bit (Standard)", + "256bit": "256-bit (High)" + } + }, + "results": { + "title": "Encrypted PDFs" + }, + "tooltip": { + "header": { + "title": "Password Protection Overview" + }, + "passwords": { + "title": "Password Types", + "text": "User passwords restrict opening the document, while owner passwords control what can be done with the document once opened. You can set both or just one.", + "bullet1": "User Password: Required to open the PDF", + "bullet2": "Owner Password: Controls document permissions (not supported by all PDF viewers)" + }, + "encryption": { + "title": "Encryption Levels", + "text": "Higher encryption levels provide better security but may not be supported by older PDF viewers.", + "bullet1": "40-bit: Basic security, compatible with older viewers", + "bullet2": "128-bit: Standard security, widely supported", + "bullet3": "256-bit: Maximum security, requires modern viewers" + }, + "permissions": { + "title": "Zmień uprawnienia", + "text": "These permissions control what users can do with the PDF. Most effective when combined with an owner password." + } + }, + "tags": "bezpieczeństwo,ochrona", + "header": "Dodaj hasło (zaszyfruj)", + "selectText": { + "1": "Wybierz plik PDF do zaszyfrowania", + "2": "Hasło", + "3": "Długość klucza szyfrowania", + "4": "WyÅŧsze wartości są silniejsze, ale niÅŧsze wartości zapewniają lepszą kompatybilność.", + "5": "Uprawnienia do zmian", + "6": "Zablokuj zmiany w dokumencie", + "7": "Zablokuj zmiany w treści", + "8": "Zablokuj zmiany w celu ułatwienia dostępu", + "9": "Zablokuj wypełnianie formularzy", + "10": "Zablokuj modyfikacje", + "11": "Zablokuj modyfikacje adnotacji", + "12": "Zablokuj drukowanie", + "13": "Zablokuj drukowanie rÃŗÅŧnych formatÃŗw", + "14": "Hasło właściciela", + "15": "Ogranicza akcje, ktÃŗre moÅŧna wykonać na dokumencie, kiedy jest otwarty (nie wspierany przez wszystkie przeglądarki)", + "16": "Ogranicza otwarcie dokumentu" } }, "changePermissions": { "title": "Zmień uprawnienia", + "desc": "Change document restrictions and permissions.", + "completed": "Permissions changed", "submit": "Zmień uprawnienia", + "error": { + "failed": "An error occurred while changing PDF permissions." + }, "permissions": { "preventAssembly": { "label": "Zablokuj zmiany w dokumencie" @@ -1738,10 +4580,784 @@ "label": "Zablokuj drukowanie rÃŗÅŧnych formatÃŗw" } }, + "results": { + "title": "Modified PDFs" + }, "tooltip": { "header": { "title": "Zmień uprawnienia" + }, + "description": { + "text": "Changes document permissions, allowing/disallowing access to different features in PDF readers." + }, + "warning": { + "text": "To make these permissions unchangeable, use the Add Password tool to set an owner password." } } + }, + "removePassword": { + "title": "Usuń hasło", + "desc": "Usuń ochronę hasłem z dokumentu PDF.", + "tags": "zabezpieczenie,odszyfrowanie,bezpieczeństwo,odhasłowanie,usunięcie hasła", + "password": { + "stepTitle": "Usuń hasło", + "label": "Obecne hasło", + "placeholder": "Enter current password", + "completed": "Password configured" + }, + "filenamePrefix": "decrypted", + "error": { + "failed": "An error occurred while removing the password from the PDF." + }, + "tooltip": { + "description": "Removing password protection requires the password that was used to encrypt the PDF. This will decrypt the document, making it accessible without a password." + }, + "submit": "Usuń", + "results": { + "title": "Decrypted PDFs" + }, + "header": "Usuń hasło (odszyfruj)", + "selectText": { + "1": "Wybierz dokument PDF do odszyfrowania", + "2": "Hasło" + } + }, + "automate": { + "title": "Automate", + "desc": "Build multi-step workflows by chaining together PDF actions. Ideal for recurring tasks.", + "invalidStep": "Invalid step", + "files": { + "placeholder": "Select files to process with this automation" + }, + "selection": { + "title": "Automation Selection", + "saved": { + "title": "Saved" + }, + "createNew": { + "title": "Create New Automation" + }, + "suggested": { + "title": "Suggested" + } + }, + "creation": { + "createTitle": "Create Automation", + "editTitle": "Edit Automation", + "intro": "Automations run tools sequentially. To get started, add tools in the order you want them to run.", + "name": { + "label": "Automation Name", + "placeholder": "My Automation" + }, + "description": { + "label": "Description (optional)", + "placeholder": "Describe what this automation does..." + }, + "tools": { + "selectTool": "Select a tool...", + "selected": "Selected Tools", + "remove": "Remove tool", + "configure": "Configure tool", + "notConfigured": "! Not Configured", + "addTool": "Add Tool", + "add": "Add a tool..." + }, + "save": "Save Automation", + "unsavedChanges": { + "title": "Unsaved Changes", + "message": "You have unsaved changes. Are you sure you want to go back? All changes will be lost.", + "cancel": "Cancel", + "confirm": "Go Back" + }, + "icon": { + "label": "Icon" + } + }, + "run": { + "title": "Run Automation" + }, + "sequence": { + "unnamed": "Unnamed Automation", + "steps": "{{count}} steps", + "running": "Running Automation...", + "run": "Run Automation", + "finish": "Finish" + }, + "reviewTitle": "Automation Results", + "config": { + "loading": "Loading tool configuration...", + "noSettings": "This tool does not have configurable settings.", + "title": "Configure {{toolName}}", + "description": "Configure the settings for this tool. These settings will be applied when the automation runs.", + "cancel": "Cancel", + "save": "Save Configuration" + }, + "copyToSaved": "Copy to Saved" + }, + "automation": { + "suggested": { + "securePdfIngestion": "Secure PDF Ingestion", + "securePdfIngestionDesc": "Comprehensive PDF processing workflow that sanitises documents, applies OCR with cleanup, converts to PDF/A format for long-term archival, and optimises file size.", + "emailPreparation": "Email Preparation", + "emailPreparationDesc": "Optimises PDFs for email distribution by compressing files, splitting large documents into 20MB chunks for email compatibility, and removing metadata for privacy.", + "secureWorkflow": "Security Workflow", + "secureWorkflowDesc": "Secures PDF documents by removing potentially malicious content like JavaScript and embedded files, then adds password protection to prevent unauthorised access. Password is set to 'password' by default.", + "processImages": "Process Images", + "processImagesDesc": "Converts multiple image files into a single PDF document, then applies OCR technology to extract searchable text from the images." + } + }, + "common": { + "copy": "Copy", + "copied": "Copied!", + "refresh": "Refresh", + "retry": "Retry", + "remaining": "remaining", + "used": "used", + "available": "available", + "cancel": "Cancel", + "preview": "Preview" + }, + "config": { + "overview": { + "title": "Application Configuration", + "description": "Current application settings and configuration details." + }, + "account": { + "overview": { + "title": "Account Settings", + "manageAccountPreferences": "Manage your account preferences", + "guestDescription": "You are signed in as a guest. Consider upgrading your account above." + }, + "upgrade": { + "title": "Upgrade Guest Account", + "description": "Link your account to preserve your history and access more features!", + "socialLogin": "Upgrade with Social Account", + "linkWith": "Link with", + "emailPassword": "or enter your email & password", + "email": "Email", + "emailPlaceholder": "Enter your email", + "password": "Password (optional)", + "passwordPlaceholder": "Set a password", + "passwordNote": "Leave empty to use email verification only", + "upgradeButton": "Upgrade Account" + } + }, + "apiKeys": { + "description": "Your API key for accessing Stirling's suite of PDF tools. Copy it to your project or refresh to generate a new one.", + "publicKeyAriaLabel": "Public API key", + "copyKeyAriaLabel": "Copy API key", + "refreshAriaLabel": "Refresh API key", + "includedCredits": "Included credits", + "purchasedCredits": "Purchased credits", + "totalCredits": "Total Credits", + "chartAriaLabel": "Credits usage: included {{includedUsed}} of {{includedTotal}}, purchased {{purchasedUsed}} of {{purchasedTotal}}", + "nextReset": "Next Reset", + "lastApiUse": "Last API Use", + "overlayMessage": "Generate a key to see credits and available credits", + "label": "API Key", + "guestInfo": "Guest users do not receive API keys. Create an account to get an API key you can use in your applications.", + "goToAccount": "Go to Account", + "refreshModal": { + "title": "Refresh API Keys", + "warning": "âš ī¸ Warning: This action will generate new API keys and make your previous keys invalid.", + "impact": "Any applications or services currently using these keys will stop working until you update them with the new keys.", + "confirmPrompt": "Are you sure you want to continue?", + "confirmCta": "Refresh Keys" + }, + "generateError": "We couldn't generate your API key." + } + }, + "AddAttachmentsRequest": { + "attachments": "Select Attachments", + "info": "Select files to attach to your PDF. These files will be embedded and accessible through the PDF's attachment panel.", + "selectFiles": "Select Files to Attach", + "placeholder": "Choose files...", + "addMoreFiles": "Add more files...", + "selectedFiles": "Selected Files", + "submit": "Add Attachments", + "results": { + "title": "Attachment Results" + }, + "error": { + "failed": "Add attachments operation failed" + } + }, + "termsAndConditions": "Terms & Conditions", + "logOut": "Log out", + "addAttachments": { + "error": { + "failed": "An error occurred while adding attachments to the PDF." + } + }, + "autoRename": { + "description": "This tool will automatically rename PDF files based on their content. It analyzes the document to find the most suitable title from the text." + }, + "customPosition": "Custom Position", + "details": "Details", + "downloadUnavailable": "Download unavailable for this item", + "invalidUndoData": "Cannot undo: invalid operation data", + "margin": { + "large": "Large", + "medium": "Medium", + "small": "Small", + "xLarge": "Extra Large" + }, + "noFilesToUndo": "Cannot undo: no files were processed in the last operation", + "noOperationToUndo": "No operation to undo", + "noValidFiles": "No valid files to process", + "operationCancelled": "Operation cancelled", + "pageEdit": { + "deselectAll": "Select None", + "selectAll": "Select All" + }, + "quickPosition": "Quick Position", + "reorganizePages": { + "error": { + "failed": "Failed to reorganize pages" + }, + "results": { + "title": "Pages Reorganized" + }, + "settings": { + "title": "Settings" + }, + "submit": "Reorganize Pages" + }, + "replace-color": { + "options": { + "fill": "Fill colour", + "gradient": "Gradient" + }, + "previewOverlayOpacity": "Preview overlay opacity", + "previewOverlayTransparency": "Preview overlay transparency", + "previewOverlayVisibility": "Show preview overlay", + "selectText": { + "1": "Zastąp lub OdwrÃŗÄ‡ opcje kolorÃŗw", + "2": "Domyślnie (domyślne kolory o wysokim kontraście)", + "3": "Niestandardowe (kolory niestandardowe)", + "4": "Całkowita-Odwrotność (OdwrÃŗcenie wszystkich kolorÃŗw)", + "5": "Wysoki kontrast opcji kolorystycznych", + "6": "biały tekst na czarnym tle", + "7": "Czarny tekst na białym tle", + "8": "ÅģÃŗÅ‚ty tekst na czarnym tle", + "9": "Zielony tekst na czarnym tle", + "10": "Wybierz Kolor tekstu", + "11": "Wybierz Kolor tła", + "12": "Choose start colour", + "13": "Choose end colour" + }, + "submit": "Zamień", + "title": "Zamień-OdwrÃŗÄ‡-Kolor", + "header": "Zamień-OdwrÃŗÄ‡ kolor PDF" + }, + "size": "Size", + "submit": "Submit", + "success": "Success", + "tools": { + "noSearchResults": "No tools found", + "noTools": "No tools available" + }, + "undoDataMismatch": "Cannot undo: operation data is corrupted", + "undoFailed": "Failed to undo operation", + "undoQuotaError": "Cannot undo: insufficient storage space", + "undoStorageError": "Undo completed but some files could not be saved to storage", + "undoSuccess": "Operation undone successfully", + "unsupported": "Unsupported", + "onboarding": { + "welcomeModal": { + "title": "Welcome to Stirling PDF!", + "description": "Would you like to take a quick 1-minute tour to learn the key features and how to get started?", + "helpHint": "You can always access this tour later from the Help button in the bottom left.", + "startTour": "Start Tour", + "maybeLater": "Maybe Later", + "dontShowAgain": "Don't Show Again" + }, + "allTools": "This is the All Tools panel, where you can browse and select from all available PDF tools.", + "selectCropTool": "Let's select the Crop tool to demonstrate how to use one of the tools.", + "toolInterface": "This is the Crop tool interface. As you can see, there's not much there because we haven't added any PDF files to work with yet.", + "filesButton": "The Files button on the Quick Access bar allows you to upload PDFs to use the tools on.", + "fileSources": "You can upload new files or access recent files from here. For the tour, we'll just use a sample file.", + "workbench": "This is the Workbench - the main area where you view and edit your PDFs.", + "viewSwitcher": "Use these controls to select how you want to view your PDFs.", + "viewer": "The Viewer lets you read and annotate your PDFs.", + "pageEditor": "The Page Editor allows you to do various operations on the pages within your PDFs, such as reordering, rotating and deleting.", + "activeFiles": "The Active Files view shows all of the PDFs you have loaded into the tool, and allows you to select which ones to process.", + "fileCheckbox": "Clicking one of the files selects it for processing. You can select multiple files for batch operations.", + "selectControls": "The Right Rail contains buttons to quickly select/deselect all of your active PDFs, along with buttons to change the app's theme or language.", + "cropSettings": "Now that we've selected the file we want crop, we can configure the Crop tool to choose the area that we want to crop the PDF to.", + "runButton": "Once the tool has been configured, this button allows you to run the tool on all the selected PDFs.", + "results": "After the tool has finished running, the Review step will show a preview of the results in this panel, and allow you to undo the operation or download the file. ", + "fileReplacement": "The modified file will replace the original file in the Workbench automatically, allowing you to easily run it through more tools.", + "pinButton": "You can use the Pin button if you'd rather your files stay active after running tools on them.", + "wrapUp": "You're all set! You've learnt about the main areas of the app and how to use them. Click the Help button whenever you like to see this tour again.", + "previous": "Previous", + "next": "Next", + "finish": "Finish", + "startTour": "Start Tour", + "startTourDescription": "Take a guided tour of Stirling PDF's key features" + }, + "workspace": { + "title": "Workspace", + "people": { + "title": "People", + "description": "Manage workspace members and their permissions", + "loading": "Loading people...", + "searchMembers": "Search members...", + "addMembers": "Add Members", + "inviteMembers": { + "label": "Invite Members", + "subtitle": "Type or paste in emails below, separated by commas. Your workspace will be billed by members." + }, + "user": "User", + "role": "Role", + "team": "Team", + "status": "Status", + "actions": "Actions", + "noMembersFound": "No members found", + "active": "Active", + "disabled": "Disabled", + "activeSession": "Active session", + "member": "Member", + "admin": "Admin", + "roleDescriptions": { + "admin": "Can manage settings and invite members, with full administrative access.", + "member": "Can view and edit shared files, but cannot manage workspace settings or members." + }, + "editRole": "Edit Role", + "enable": "Enable", + "disable": "Disable", + "deleteUser": "Delete User", + "deleteUserSuccess": "User deleted successfully", + "deleteUserError": "Failed to delete user", + "confirmDelete": "Are you sure you want to delete this user? This action cannot be undone.", + "addMember": { + "title": "Add Member", + "username": "Username (Email)", + "usernamePlaceholder": "user@example.com", + "password": "Password", + "passwordPlaceholder": "Enter password", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "forcePasswordChange": "Force password change on first login", + "cancel": "Cancel", + "submit": "Add Member", + "usernameRequired": "Username and password are required", + "passwordTooShort": "Password must be at least 6 characters", + "success": "User created successfully", + "error": "Failed to create user" + }, + "editMember": { + "title": "Edit Member", + "editing": "Editing:", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "cancel": "Cancel", + "submit": "Update Member", + "success": "User updated successfully", + "error": "Failed to update user" + }, + "toggleEnabled": { + "success": "User status updated successfully", + "error": "Failed to update user status" + }, + "delete": { + "success": "User deleted successfully", + "error": "Failed to delete user" + }, + "emailInvite": { + "tab": "Email Invite", + "description": "Type or paste in emails below, separated by commas. Users will receive login credentials via email.", + "emails": "Email Addresses", + "emailsPlaceholder": "user1@example.com, user2@example.com", + "emailsRequired": "At least one email address is required", + "submit": "Send Invites", + "success": "user(s) invited successfully", + "partialSuccess": "Some invites failed", + "allFailed": "Failed to invite users", + "error": "Failed to send invites" + }, + "directInvite": { + "tab": "Direct Create" + }, + "inviteLinkTab": { + "tab": "Invite Link" + }, + "inviteLink": { + "description": "Generate a secure link that allows the user to set their own password", + "email": "Email Address", + "emailPlaceholder": "user@example.com (optional)", + "emailDescription": "Optional - leave blank for a general invite link that can be used by anyone", + "emailRequired": "Email address is required", + "emailOptional": "Optional - leave blank for a general invite link", + "emailRequiredForSend": "Email address is required to send email notification", + "expiryHours": "Expiry Hours", + "expiryDescription": "How many hours until the link expires", + "sendEmail": "Send invite link via email", + "sendEmailDescription": "If enabled, the invite link will be sent to the specified email address", + "smtpRequired": "SMTP not configured", + "generate": "Generate Link", + "generated": "Invite Link Generated", + "copied": "Link copied to clipboard", + "success": "Invite link generated successfully", + "successWithEmail": "Invite link generated and sent via email", + "emailFailed": "Invite link generated, but email failed", + "emailFailedDetails": "Error: {0}. Please share the invite link manually.", + "error": "Failed to generate invite link", + "submit": "Generate Invite Link" + }, + "inviteMode": { + "username": "Username", + "email": "Email", + "link": "Link", + "emailDisabled": "Email invites require SMTP configuration and mail.enableInvites=true in settings" + }, + "license": { + "users": "users", + "availableSlots": "Available Slots", + "grandfathered": "Grandfathered", + "grandfatheredShort": "{{count}} grandfathered", + "fromLicense": "from license", + "slotsAvailable": "{{count}} user slot(s) available", + "noSlotsAvailable": "No slots available", + "currentUsage": "Currently using {{current}} of {{max}} user licences" + } + }, + "teams": { + "title": "Teams", + "description": "Manage teams and organize workspace members", + "loading": "Loading teams...", + "loadingDetails": "Loading team details...", + "createNewTeam": "Create New Team", + "teamName": "Team Name", + "totalMembers": "Total Members", + "actions": "Actions", + "noTeamsFound": "No teams found", + "noMembers": "No members in this team", + "system": "System", + "addMember": "Add Member", + "viewTeam": "View Team", + "removeMember": "Remove from team", + "cannotRemoveFromSystemTeam": "Cannot remove from system team", + "renameTeamLabel": "Rename Team", + "deleteTeamLabel": "Delete Team", + "cannotDeleteInternal": "Cannot delete the Internal team", + "confirmDelete": "Are you sure you want to delete this team? This team must be empty to delete.", + "confirmRemove": "Remove user from this team?", + "cannotRenameInternal": "Cannot rename the Internal team", + "cannotAddToInternal": "Cannot add members to the Internal team", + "teamNotFound": "Team not found", + "backToTeams": "Back to Teams", + "memberCount": "{{count}} members", + "removeMemberSuccess": "User removed from team", + "removeMemberError": "Failed to remove user from team", + "createTeam": { + "title": "Create New Team", + "teamName": "Team Name", + "teamNamePlaceholder": "Enter team name", + "cancel": "Cancel", + "submit": "Create Team", + "nameRequired": "Team name is required", + "success": "Team created successfully", + "error": "Failed to create team" + }, + "renameTeam": { + "title": "Rename Team", + "renaming": "Renaming:", + "newTeamName": "New Team Name", + "newTeamNamePlaceholder": "Enter new team name", + "cancel": "Cancel", + "submit": "Rename Team", + "nameRequired": "Team name is required", + "success": "Team renamed successfully", + "error": "Failed to rename team" + }, + "deleteTeam": { + "success": "Team deleted successfully", + "error": "Failed to delete team. Make sure the team is empty.", + "teamMustBeEmpty": "Team must be empty before deletion" + }, + "addMemberToTeam": { + "title": "Add Member to Team", + "addingTo": "Adding to", + "selectUser": "Select User", + "selectUserPlaceholder": "Choose a user", + "selectUserRequired": "Please select a user", + "currentlyIn": "currently in", + "willBeMoved": "Note: This user will be moved from their current team to this team.", + "cancel": "Cancel", + "submit": "Add Member", + "userRequired": "Please select a user", + "success": "Member added to team successfully", + "error": "Failed to add member to team" + }, + "changeTeam": { + "label": "Change Team", + "title": "Change Team", + "changing": "Moving", + "selectTeam": "Select Team", + "selectTeamPlaceholder": "Choose a team", + "selectTeamRequired": "Please select a team", + "success": "Team changed successfully", + "error": "Failed to change team", + "submit": "Change Team" + } + } + }, + "plan": { + "currency": "Currency", + "popular": "Popular", + "current": "Current Plan", + "upgrade": "Upgrade", + "contact": "Contact Us", + "customPricing": "Custom", + "showComparison": "Compare All Features", + "hideComparison": "Hide Feature Comparison", + "featureComparison": "Feature Comparison", + "activePlan": { + "title": "Active Plan", + "subtitle": "Your current subscription details" + }, + "availablePlans": { + "title": "Available Plans", + "subtitle": "Choose the plan that fits your needs" + }, + "static": { + "title": "Billing Information", + "message": "Online billing is not currently configured. To upgrade your plan or manage subscriptions, please contact us directly.", + "contactSales": "Contact Sales", + "contactToUpgrade": "Contact us to upgrade or customize your plan", + "maxUsers": "Max Users", + "upTo": "Up to" + }, + "period": { + "month": "month" + }, + "free": { + "name": "Free", + "highlight1": "Limited Tool Usage Per week", + "highlight2": "Access to all tools", + "highlight3": "Community support" + }, + "pro": { + "name": "Pro", + "highlight1": "Unlimited Tool Usage", + "highlight2": "Advanced PDF tools", + "highlight3": "No watermarks" + }, + "enterprise": { + "name": "Enterprise", + "highlight1": "Custom pricing", + "highlight2": "Dedicated support", + "highlight3": "Latest features" + }, + "feature": { + "title": "Feature", + "pdfTools": "Basic PDF Tools", + "fileSize": "File Size Limit", + "automation": "Automate tool workflows", + "api": "API Access", + "priority": "Priority Support", + "customPricing": "Custom Pricing" + } + }, + "subscription": { + "status": { + "active": "Active", + "pastDue": "Past Due", + "canceled": "Canceled", + "incomplete": "Incomplete", + "trialing": "Trial", + "none": "No Subscription" + }, + "renewsOn": "Renews on {{date}}", + "cancelsOn": "Cancels on {{date}}" + }, + "billing": { + "manageBilling": "Manage Billing", + "portal": { + "error": "Failed to open billing portal" + } + }, + "payment": { + "preparing": "Preparing your checkout...", + "upgradeTitle": "Upgrade to {{planName}}", + "success": "Payment Successful!", + "successMessage": "Your subscription has been activated successfully. You will receive a confirmation email shortly.", + "autoClose": "This window will close automatically...", + "error": "Payment Error" + }, + "firstLogin": { + "title": "First Time Login", + "welcomeTitle": "Welcome!", + "welcomeMessage": "For security reasons, you must change your password on your first login.", + "loggedInAs": "Logged in as", + "error": "Error", + "currentPassword": "Current Password", + "enterCurrentPassword": "Enter your current password", + "newPassword": "New Password", + "enterNewPassword": "Enter new password (min 8 characters)", + "confirmPassword": "Confirm New Password", + "reEnterNewPassword": "Re-enter new password", + "changePassword": "Change Password", + "allFieldsRequired": "All fields are required", + "passwordsDoNotMatch": "New passwords do not match", + "passwordTooShort": "Password must be at least 8 characters", + "passwordMustBeDifferent": "New password must be different from current password", + "passwordChangedSuccess": "Password changed successfully! Please log in again.", + "passwordChangeFailed": "Failed to change password. Please check your current password." + }, + "invite": { + "welcome": "Welcome to Stirling PDF", + "invalidToken": "Invalid invitation link", + "validationError": "Failed to validate invitation link", + "passwordRequired": "Password is required", + "passwordTooShort": "Password must be at least 6 characters", + "passwordMismatch": "Passwords do not match", + "acceptError": "Failed to create account", + "validating": "Validating invitation...", + "invalidInvitation": "Invalid Invitation", + "goToLogin": "Go to Login", + "welcomeTitle": "You've been invited!", + "welcomeSubtitle": "Complete your account setup to get started", + "accountFor": "Creating account for", + "linkExpires": "Link expires", + "email": "Email address", + "emailPlaceholder": "Enter your email address", + "emailRequired": "Email address is required", + "invalidEmail": "Invalid email address", + "choosePassword": "Choose a password", + "passwordPlaceholder": "Enter your password", + "confirmPassword": "Confirm password", + "confirmPasswordPlaceholder": "Re-enter your password", + "createAccount": "Create Account", + "creating": "Creating Account...", + "alreadyHaveAccount": "Already have an account?", + "signIn": "Sign in" + }, + "audit": { + "error": { + "title": "Error loading audit system" + }, + "notAvailable": "Audit system not available", + "notAvailableMessage": "The audit system is not configured or not available.", + "disabled": "Audit logging is disabled", + "disabledMessage": "Enable audit logging in your application configuration to track system events.", + "systemStatus": { + "title": "System Status", + "status": "Audit Logging", + "enabled": "Enabled", + "disabled": "Disabled", + "level": "Audit Level", + "retention": "Retention Period", + "days": "days", + "totalEvents": "Total Events" + }, + "tabs": { + "dashboard": "Dashboard", + "events": "Audit Events", + "export": "Export" + }, + "charts": { + "title": "Audit Dashboard", + "error": "Error loading charts", + "day": "Day", + "week": "Week", + "month": "Month", + "byType": "Events by Type", + "byUser": "Events by User", + "overTime": "Events Over Time" + }, + "events": { + "title": "Audit Events", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "error": "Error loading events", + "noEvents": "No events found", + "timestamp": "Timestamp", + "type": "Type", + "user": "User", + "ipAddress": "IP Address", + "actions": "Actions", + "viewDetails": "View Details", + "eventDetails": "Event Details", + "details": "Details" + }, + "export": { + "title": "Export Audit Data", + "description": "Export audit events to CSV or JSON format. Use filters to limit the exported data.", + "format": "Export Format", + "filters": "Filters (Optional)", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "exportButton": "Export Data", + "error": "Failed to export data" + } + }, + "usage": { + "noData": "No data available", + "error": "Error loading usage statistics", + "noDataMessage": "No usage statistics are currently available.", + "controls": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All", + "refresh": "Refresh", + "dataTypeLabel": "Data Type:", + "dataType": { + "all": "All", + "api": "API", + "ui": "UI" + } + }, + "showing": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All" + }, + "stats": { + "totalEndpoints": "Total Endpoints", + "totalVisits": "Total Visits", + "showing": "Showing", + "selectedVisits": "Selected Visits" + }, + "chart": { + "title": "Endpoint Usage Chart" + }, + "table": { + "title": "Detailed Statistics", + "endpoint": "Endpoint", + "visits": "Visits", + "percentage": "Percentage", + "noData": "No data available" + } + }, + "backendHealth": { + "checking": "Checking backend status...", + "online": "Backend Online", + "offline": "Backend Offline" + }, + "autoRedact": { + "tags": "Redagowanie, ukrywanie, zaciemnianie, zaczernianie, zaznaczanie, ukrywanie", + "title": "Automatyczne zaciemnienie", + "header": "Automatyczne zaciemnienie", + "colorLabel": "Kolor", + "textsToRedactLabel": "Tekst do zaciemnienia (podzielony liniami)", + "textsToRedactPlaceholder": "przykład \\n Poufne \\n Ściśle tajne", + "useRegexLabel": "UÅŧyj RegExp", + "wholeWordSearchLabel": "Szukaj całego słowa", + "customPaddingLabel": "Dodatkowe wypełnienie", + "convertPDFToImageLabel": "PrzerÃŗb PDF na PDF-obrazowy (usuwa tekst w tle)", + "submitButton": "Wyślij" + }, + "replaceColorPdf": { + "tags": "Zastąp kolor, operacje na stronach, back-end, strona serwera" } -} \ No newline at end of file +} diff --git a/frontend/public/locales/pt-BR/translation.json b/frontend/public/locales/pt-BR/translation.json index 803f38772..d38d3583b 100644 --- a/frontend/public/locales/pt-BR/translation.json +++ b/frontend/public/locales/pt-BR/translation.json @@ -1,5 +1,35 @@ { + "toolPanel": { + "modePrompt": { + "title": "Choose how you browse tools", + "description": "Preview both layouts and decide how you want to explore Stirling PDF tools.", + "sidebarTitle": "Sidebar mode", + "sidebarDescription": "Keep tools alongside your workspace for quick switching.", + "recommended": "Recommended", + "chooseSidebar": "Use sidebar mode", + "fullscreenTitle": "Fullscreen mode - (legacy)", + "fullscreenDescription": "Browse every tool in a catalogue that covers the workspace until you pick one.", + "chooseFullscreen": "Use fullscreen mode", + "dismiss": "Maybe later" + }, + "fullscreen": { + "showDetails": "Show Details", + "comingSoon": "Coming soon:", + "favorite": "Add to favourites", + "favorites": "Favourites", + "heading": "All tools (fullscreen view)", + "noResults": "Try adjusting your search or toggle descriptions to find what you need.", + "recommended": "Recommended", + "unfavorite": "Remove from favourites" + }, + "placeholder": "Choose a tool to get started", + "toggle": { + "fullscreen": "Switch to fullscreen mode", + "sidebar": "Switch to sidebar mode" + } + }, "unsavedChanges": "VocÃĒ tem alteraçÃĩes nÃŖo salvas no seu PDF. O que vocÃĒ gostaria de fazer?", + "areYouSure": "Are you sure you want to leave?", "unsavedChangesTitle": "AlteraçÃĩes nÃŖo salvas", "keepWorking": "Continuar trabalhando", "discardChanges": "Descartar alteraçÃĩes", @@ -24,8 +54,26 @@ "customTextDesc": "Texto personalizado:", "numberPagesDesc": "Quais pÃĄginas numerar, padrÃŖo 'todas', tambÊm aceita 1-5 ou 2,5,9,etc.", "customNumberDesc": "O padrÃŖo Ê {n}, tambÊm aceita 'PÃĄgina {n} de {total}', 'Texto-{n}', '{nome do arquivo}-{n}'", - "submit": "Adicionar NÃēmeros de PÃĄgina" + "submit": "Adicionar NÃēmeros de PÃĄgina", + "configuration": "Configuration", + "customize": "Customize Appearance", + "pagesAndStarting": "Pages & Starting Number", + "positionAndPages": "Position & Pages", + "error": { + "failed": "Add page numbers operation failed" + }, + "results": { + "title": "Page Number Results" + }, + "preview": "Position Selection", + "previewDisclaimer": "Preview is approximate. Final output may vary due to PDF font metrics." }, + "pageSelectionPrompt": "SeleÃ§ÃŖo de PÃĄgina Personalizada (Digite uma lista de nÃēmeros de pÃĄginas, separadas por vírgula como 1,5,6 ou funçÃĩes como 2n+1):", + "startingNumberTooltip": "The first number to display. Subsequent pages will increment from this number.", + "marginTooltip": "Distance between the page number and the edge of the page.", + "fontSizeTooltip": "Size of the page number text in points. Larger numbers create bigger text.", + "fontTypeTooltip": "Font family for the page numbers. Choose based on your document style.", + "customTextTooltip": "Optional custom format for page numbers. Use {n} as placeholder for the number. Example: \"Page {n}\" will show \"Page 1\", \"Page 2\", etc.", "pdfPrompt": "Selecione o(s) PDF(s)", "multiPdfPrompt": "Selecione os PDFs (2+)", "multiPdfDropPrompt": "Selecione (ou arraste e solte) todos os PDFs desejados:", @@ -36,7 +84,6 @@ "uploadLimitExceededPlural": "estÃŖo acima do limite. Tamanho mÃĄximo permitido Ê", "processTimeWarning": "Aviso: Este processo pode levar atÊ um minuto, dependendo do tamanho do arquivo", "pageOrderPrompt": "Ordem de PÃĄgina Personalizada (Digite uma lista de nÃēmeros de pÃĄginas, separadas por vírgula ou funçÃĩes como 2n+1):", - "pageSelectionPrompt": "SeleÃ§ÃŖo de PÃĄgina Personalizada (Digite uma lista de nÃēmeros de pÃĄginas, separadas por vírgula como 1,5,6 ou funçÃĩes como 2n+1):", "goToPage": "Ir", "true": "Verdadeiro", "false": "Falso", @@ -47,11 +94,18 @@ "save": "Salvar", "saveToBrowser": "Salvar no Navegador", "download": "Baixar (JSON)", + "pin": "Pin File (keep active after tool run)", + "unpin": "Unpin File (replace after tool run)", "undoOperationTooltip": "Clique para desfazer a Ãēltima operaÃ§ÃŖo e restaurar os arquivos originais", "undo": "Desfazer", "moreOptions": "Mais opçÃĩes", "editYourNewFiles": "Edite seu(s) novo(s) arquivo(s)", "close": "Fechar", + "openInViewer": "Open in Viewer", + "confirmClose": "Confirm Close", + "confirmCloseMessage": "Are you sure you want to close this file?", + "confirmCloseCancel": "Cancel", + "confirmCloseConfirm": "Close File", "fileSelected": "Selecionado: {{filename}}", "chooseFile": "Escolher arquivo", "filesSelected": "Arquivos Selecionados", @@ -61,7 +115,9 @@ "uploadFiles": "Fazer upload de arquivos", "addFiles": "Adicionar arquivos", "selectFromWorkbench": "Selecione arquivos da bancada de trabalho ou ", - "selectMultipleFromWorkbench": "Selecione pelo menos {{count}} arquivos da bancada de trabalho ou " + "selectMultipleFromWorkbench": "Selecione pelo menos {{count}} arquivos da bancada de trabalho ou ", + "created": "Created", + "size": "File Size" }, "noFavourites": "Nenhum Favorito Adicionado", "downloadComplete": "Download Completo", @@ -194,6 +250,7 @@ "title": "VocÃĒ quer melhorar o Stirling PDF?", "paragraph1": "Stirling PDF possui coleta de dados opcional para ajudar a melhorar o produto. NÃŗs nÃŖo rastreamos nenhuma informaÃ§ÃŖo pessoal ou conteÃēdo dos arquivos.", "paragraph2": "Por favor considere habilitar a coleta de dados para ajudar Stirling PDF a crescer e nos ajudar a entender melhor nossos usuÃĄrios.", + "learnMore": "Learn more", "enable": "Habilitar coleta de dados", "disable": "Desabilitar coleta de dados", "settings": "VocÃĒ pode alterar as configuraçÃĩes de coleta de dados no arquivo config/settings.yml" @@ -237,6 +294,54 @@ "cacheInputs": { "name": "Salvar entradas do formulÃĄrio.", "help": "Habilitar para armazenar entradas usadas anteriormente para execuçÃĩes futuras" + }, + "general": { + "title": "General", + "description": "Configure general application preferences.", + "account": "Account", + "accountDescription": "Manage your account settings", + "user": "User", + "signedInAs": "Signed in as", + "logout": "Log out", + "enableFeatures": { + "title": "For System Administrators", + "intro": "Enable user authentication, team management, and workspace features for your organization.", + "action": "Configure", + "and": "and", + "benefit": "Enables user roles, team collaboration, admin controls, and enterprise features.", + "learnMore": "Learn more in documentation", + "dismiss": "Dismiss" + }, + "autoUnzip": "Auto-unzip API responses", + "autoUnzipDescription": "Automatically extract files from ZIP responses", + "autoUnzipTooltip": "Automatically extract ZIP files returned from API operations. Disable to keep ZIP files intact. This does not affect automation workflows.", + "autoUnzipFileLimit": "Auto-unzip file limit", + "autoUnzipFileLimitDescription": "Maximum number of files to extract from ZIP", + "autoUnzipFileLimitTooltip": "Only unzip if the ZIP contains this many files or fewer. Set higher to extract larger ZIPs.", + "defaultToolPickerMode": "Default tool picker mode", + "defaultToolPickerModeDescription": "Choose whether the tool picker opens in fullscreen or sidebar by default", + "mode": { + "fullscreen": "Fullscreen", + "sidebar": "Sidebar" + } + }, + "hotkeys": { + "title": "Keyboard Shortcuts", + "description": "Hover a tool to see its shortcut or customise it below. Click \"Change shortcut\" and press a new key combination. Press Esc to cancel.", + "errorModifier": { + "mac": "Include ⌘ (Command), âŒĨ (Option), or another modifier in your shortcut.", + "windows": "Include Ctrl, Alt, or another modifier in your shortcut." + }, + "errorConflict": "Shortcut already used by {{tool}}.", + "none": "Not assigned", + "customBadge": "Custom", + "defaultLabel": "Default: {{shortcut}}", + "capturing": "Press keysâ€Ļ (Esc to cancel)", + "change": "Change shortcut", + "reset": "Reset", + "shortcut": "Shortcut", + "noShortcut": "No shortcut set", + "searchPlaceholder": "Search tools..." } }, "changeCreds": { @@ -308,8 +413,10 @@ "top20": "Top 20", "all": "Todos", "refresh": "Atualizar", - "includeHomepage": "Incluir PÃĄgina Inicial ('/')", - "includeLoginPage": "Incluir PÃĄgina de Login ('/login')", + "dataTypeLabel": "Data Type:", + "dataTypeAll": "All", + "dataTypeApi": "API", + "dataTypeUi": "UI", "totalEndpoints": "Total de Endpoints", "totalVisits": "Total de Visitas", "showing": "Mostrando", @@ -324,7 +431,9 @@ "top": "Top", "numberOfVisits": "NÃēmero de Visitas", "visitsTooltip": "Visitas: {0} ({1}% do total)", - "retry": "Tentar novamente" + "retry": "Tentar novamente", + "includeHomepage": "Incluir PÃĄgina Inicial ('/')", + "includeLoginPage": "Incluir PÃĄgina de Login ('/login')" }, "database": { "title": "Importar/Exportar banco de dados", @@ -365,6 +474,16 @@ "alphabetical": "AlfabÊtica", "globalPopularity": "Popularidade Global", "sortBy": "Ordenar por:", + "mobile": { + "brandAlt": "Stirling PDF logo", + "openFiles": "Open files", + "swipeHint": "Swipe left or right to switch views", + "tools": "Tools", + "toolsSlide": "Tool selection panel", + "viewSwitcher": "Switch workspace view", + "workbenchSlide": "Workspace panel", + "workspace": "Workspace" + }, "multiTool": { "tags": "mÃēltiplas,ferramentas", "title": "Multiferramentas de PDF", @@ -550,11 +669,6 @@ "title": "OcultaÃ§ÃŖo de Texto Manual", "desc": "OcultaÃ§ÃŖo de texto manual baseada em um texto selecionado, desenho de formas ou/e pÃĄginas selecionadas." }, - "overlayPdfs": { - "tags": "sobrepor,combinar,empilhar", - "title": "Sobrepor PDFs", - "desc": "SobrepÃĩe PDFs sobre outro PDF" - }, "splitBySections": { "tags": "dividir,seçÃĩes,particionar", "title": "Dividir PDF por seçÃĩes", @@ -659,6 +773,15 @@ "tags": "fluxo de trabalho,sequÃĒncia,automaÃ§ÃŖo", "title": "Automatizar", "desc": "Crie fluxos de trabalho de vÃĄrias etapas encadeando açÃĩes de PDF. Ideal para tarefas recorrentes." + }, + "overlay-pdfs": { + "desc": "Overlay one PDF on top of another", + "title": "Overlay PDFs" + }, + "overlayPdfs": { + "tags": "sobrepor,combinar,empilhar", + "title": "Sobrepor PDFs", + "desc": "SobrepÃĩe PDFs sobre outro PDF" } }, "landing": { @@ -698,13 +821,19 @@ "merge": { "tags": "mesclar,OperaçÃĩes de PÃĄgina,Back-end,lado do servidor", "title": "Mesclar", - "removeDigitalSignature.tooltip": { - "title": "Remover assinatura digital", - "description": "Assinaturas digitais serÃŖo invalidadas ao mesclar arquivos. Marque isto para removÃĒ-las do PDF final." + "removeDigitalSignature": { + "label": "Remove digital signature in the merged file?", + "tooltip": { + "title": "Remover assinatura digital", + "description": "Assinaturas digitais serÃŖo invalidadas ao mesclar arquivos. Marque isto para removÃĒ-las do PDF final." + } }, - "generateTableOfContents.tooltip": { - "title": "Gerar sumÃĄrio", - "description": "Cria automaticamente um sumÃĄrio clicÃĄvel no PDF mesclado com base nos nomes originais dos arquivos e nos nÃēmeros de pÃĄgina." + "generateTableOfContents": { + "label": "Generate table of contents in the merged file?", + "tooltip": { + "title": "Gerar sumÃĄrio", + "description": "Cria automaticamente um sumÃĄrio clicÃĄvel no PDF mesclado com base nos nomes originais dos arquivos e nos nÃēmeros de pÃĄgina." + } }, "submit": "Mesclar", "sortBy": { @@ -842,12 +971,50 @@ "bullet1": "Nível de marcador: em qual nível dividir (1=nível superior)", "bullet2": "Incluir metadados: preservar propriedades do documento", "bullet3": "Permitir duplicados: lidar com nomes de marcador repetidos" + }, + "byDocCount": { + "bullet1": "Enter the number of output files you want", + "bullet2": "Pages are distributed as evenly as possible", + "bullet3": "Useful when you need a specific number of files", + "text": "Create a specific number of output files by evenly distributing pages across them.", + "title": "Split by Document Count" + }, + "byPageCount": { + "bullet1": "Enter the number of pages per output file", + "bullet2": "Last file may have fewer pages if not evenly divisible", + "bullet3": "Useful for batch processing workflows", + "text": "Create multiple PDFs with a specific number of pages each. Perfect for creating uniform document chunks.", + "title": "Split by Page Count" + }, + "byPageDivider": { + "bullet1": "Print divider sheets from the download link", + "bullet2": "Insert divider sheets between your documents", + "bullet3": "Scan all documents together as one PDF", + "bullet4": "Upload - divider pages are automatically detected and removed", + "bullet5": "Enable Duplex Mode if scanning both sides of divider sheets", + "text": "Automatically split scanned documents using physical divider sheets with QR codes. Perfect for processing multiple documents scanned together.", + "title": "Split by Page Divider" } - } + }, + "methodSelection": { + "tooltip": { + "bullet1": "Click on a method card to select it", + "bullet2": "Hover over each card to see a quick description", + "bullet3": "The settings step will appear after you select a method", + "bullet4": "You can change methods at any time before processing", + "header": { + "text": "Choose how you want to split your PDF document. Each method is optimized for different use cases and document types.", + "title": "Split Method Selection" + }, + "title": "Choose Your Split Method" + } + }, + "selectMethod": "Select a split method" }, "rotate": { "title": "Girar", "submit": "Girar", + "selectRotation": "Select Rotation Angle (Clockwise)", "error": { "failed": "Ocorreu um erro ao girar o PDF." }, @@ -935,7 +1102,8 @@ "imagesExt": "Imagens (JPG, PNG, etc.)", "markdown": "Markdown", "textRtf": "Texto/RTF", - "grayscale": "Escala de Cinza" + "grayscale": "Escala de Cinza", + "errorConversion": "An error occurred while converting the file." }, "imageToPdf": { "tags": "conversÃŖo,img,jpg,imagem,foto" @@ -973,7 +1141,20 @@ "8": "Remover Ãēltimo", "9": "Remover o primeiro e o Ãēltimo", "10": "Mesclagem ímpar-par", - "11": "Duplicar todas as pÃĄginas" + "11": "Duplicar todas as pÃĄginas", + "desc": { + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, â€Ļ).", + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, â€Ļ).", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimized for binding on the side)." + } }, "desc": { "CUSTOM": "Use uma sequÃĒncia personalizada de nÃēmeros de pÃĄgina ou expressÃĩes para definir uma nova ordem.", @@ -1039,7 +1220,9 @@ "opacity": "Opacidade (%)", "spacing": { "horizontal": "Espaçamento horizontal", - "vertical": "Espaçamento vertical" + "vertical": "Espaçamento vertical", + "height": "Height Spacing", + "width": "Width Spacing" }, "convertToImage": "Achatar pÃĄginas do PDF em imagens" }, @@ -1182,6 +1365,10 @@ "bullet4": "Melhor para conteÃēdo sensível ou com direitos autorais" } } + }, + "type": { + "1": "Text", + "2": "Image" } }, "permissions": { @@ -1255,6 +1442,26 @@ }, "submit": "Remover PÃĄginas" }, + "extractPages": { + "title": "Extract Pages", + "pageNumbers": { + "label": "Pages to Extract", + "placeholder": "e.g., 1,3,5-8 or odd & 1-10" + }, + "settings": { + "title": "Settings" + }, + "tooltip": { + "description": "Extracts the selected pages into a new PDF, preserving order." + }, + "error": { + "failed": "Failed to extract pages" + }, + "results": { + "title": "Pages Extracted" + }, + "submit": "Extract Pages" + }, "pageSelection": { "tooltip": { "header": { @@ -1295,10 +1502,43 @@ }, "examples": { "title": "Exemplos" + }, + "complex": { + "bullet1": "1,3-5,8,2n → pages 1, 3–5, 8, plus evens", + "bullet2": "10-,2n-1 → from page 10 to end + odd pages", + "description": "Mix different types.", + "title": "Complex Combinations" + }, + "description": "Choose which pages to use for the operation. Supports single pages, ranges, formulas, and the all keyword.", + "individual": { + "bullet1": "1,3,5 → selects pages 1, 3, 5", + "bullet2": "2,7,12 → selects pages 2, 7, 12", + "description": "Enter numbers separated by commas.", + "title": "Individual Pages" + }, + "mathematical": { + "bullet1": "2n → all even pages (2, 4, 6â€Ļ)", + "bullet2": "2n-1 → all odd pages (1, 3, 5â€Ļ)", + "bullet3": "3n → every 3rd page (3, 6, 9â€Ļ)", + "bullet4": "4n-1 → pages 3, 7, 11, 15â€Ļ", + "description": "Use n in formulas for patterns.", + "title": "Mathematical Functions" + }, + "ranges": { + "bullet1": "3-6 → selects pages 3–6", + "bullet2": "10-15 → selects pages 10–15", + "bullet3": "5- → selects pages 5 to end", + "description": "Use - for consecutive pages.", + "title": "Page Ranges" + }, + "special": { + "bullet1": "all → selects all pages", + "title": "Special Keywords" } } }, "bulkSelection": { + "syntaxError": "There is a syntax issue. See Page Selection tips for help.", "header": { "title": "Guia de seleÃ§ÃŖo de pÃĄginas" }, @@ -1604,6 +1844,9 @@ "text": "PÃŗs-processa o PDF final removendo artefatos de OCR e otimizando a camada de texto para melhor legibilidade e tamanho menor." } } + }, + "error": { + "failed": "OCR operation failed" } }, "extractImages": { @@ -1766,8 +2009,16 @@ "hint": "Envie uma imagem PNG ou JPG da sua assinatura" }, "instructions": { - "title": "Como adicionar assinatura" + "title": "Como adicionar assinatura", + "canvas": "After drawing your signature in the canvas, close the modal then click anywhere on the PDF to place it.", + "image": "After uploading your signature image above, click anywhere on the PDF to place it.", + "text": "After entering your name above, click anywhere on the PDF to place your signature." }, + "mode": { + "move": "Move Signature", + "place": "Place Signature" + }, + "updateAndPlace": "Update and Place", "activate": "Ativar posicionamento de assinatura", "deactivate": "Parar de posicionar assinaturas", "results": { @@ -1792,7 +2043,10 @@ "options": { "stepTitle": "OpçÃĩes de achatamento", "title": "OpçÃĩes de achatamento", - "flattenOnlyForms.desc": "Achatar apenas campos de formulÃĄrio, mantendo outros elementos interativos", + "flattenOnlyForms": { + "label": "Flatten only forms", + "desc": "Achatar apenas campos de formulÃĄrio, mantendo outros elementos interativos" + }, "note": "Achatar remove elementos interativos do PDF, tornando-os nÃŖo editÃĄveis." }, "results": { @@ -1882,7 +2136,13 @@ "bullet3": "Pode ser desativado para reduzir o tamanho do arquivo de saída" } }, - "submit": "Remover PÃĄginas em Branco" + "submit": "Remover PÃĄginas em Branco", + "error": { + "failed": "Failed to remove blank pages" + }, + "results": { + "title": "Removed Blank Pages" + } }, "removeAnnotations": { "tags": "comentÃĄrios,destaque,notas,marcaÃ§ÃŖo,remover", @@ -1984,7 +2244,12 @@ "bullet3": "Escolha em qual pÃĄgina posicionar a assinatura", "bullet4": "Logo opcional pode ser incluído" } - } + }, + "invisible": "Invisible", + "options": { + "title": "Signature Details" + }, + "visible": "Visible" }, "sign": { "submit": "Assinar PDF", @@ -2045,7 +2310,22 @@ "text": "Converta seu arquivo para um keystore Java (.jks) com o keytool e, em seguida, escolha JKS." } } - } + }, + "chooseCertificate": "Choose Certificate File", + "chooseJksFile": "Choose JKS File", + "chooseP12File": "Choose PKCS12 File", + "choosePfxFile": "Choose PFX File", + "choosePrivateKey": "Choose Private Key File", + "location": "Location", + "logoTitle": "Logo", + "name": "Name", + "noLogo": "No Logo", + "pageNumber": "Page Number", + "password": "Certificate Password", + "passwordOptional": "Leave empty if no password", + "reason": "Reason", + "serverCertMessage": "Using server certificate - no files or password required", + "showLogo": "Show Logo" }, "removeCertSign": { "tags": "autenticar,PEM,P12,oficial,descriptografar", @@ -2071,7 +2351,17 @@ "header": "Layout de MÃēltiplas PÃĄginas", "pagesPerSheet": "PÃĄginas por folha:", "addBorder": "Adicionar bordas.", - "submit": "Enviar" + "submit": "Enviar", + "desc": { + "2": "Place 2 pages side-by-side on a single sheet.", + "3": "Place 3 pages on a single sheet in a single row.", + "4": "Place 4 pages on a single sheet (2 × 2 grid).", + "9": "Place 9 pages on a single sheet (3 × 3 grid).", + "16": "Place 16 pages on a single sheet (4 × 4 grid)." + }, + "error": { + "failed": "An error occurred while creating the multi-page layout." + } }, "bookletImposition": { "tags": "livreto,imposiÃ§ÃŖo,impressÃŖo,encadernaÃ§ÃŖo,dobra,assinatura", @@ -2257,10 +2547,22 @@ "reset": "Redefinir para o PDF completo", "coordinates": { "title": "PosiÃ§ÃŖo e tamanho", - "x": "PosiÃ§ÃŖo X", - "y": "PosiÃ§ÃŖo Y", - "width": "Largura", - "height": "Altura" + "x": { + "label": "X Position", + "desc": "Left edge (points)" + }, + "y": { + "label": "Y Position", + "desc": "Bottom edge (points)" + }, + "width": { + "label": "Width", + "desc": "Crop width (points)" + }, + "height": { + "label": "Height", + "desc": "Crop height (points)" + } }, "error": { "invalidArea": "A ÃĄrea de corte se estende alÊm dos limites do PDF", @@ -2278,6 +2580,10 @@ }, "results": { "title": "Resultados do corte" + }, + "automation": { + "info": "Enter crop coordinates in PDF points. Origin (0,0) is at bottom-left. These values will be applied to all PDFs processed in this automation.", + "reference": "Reference: A4 page is 595.28 × 841.89 points (210mm × 297mm). 1 inch = 72 points." } }, "autoSplitPDF": { @@ -2488,11 +2794,15 @@ "overlay-pdfs": { "tags": "SobreposiÃ§ÃŖo", "header": "Sobrepor PDFs", + "title": "Overlay PDFs", + "desc": "Overlay one PDF on top of another", "baseFile": { "label": "Selecione o arquivo PDF base:" }, "overlayFiles": { - "label": "Selecione os arquivos PDF para sobreposiÃ§ÃŖo:" + "label": "Selecione os arquivos PDF para sobreposiÃ§ÃŖo:", + "placeholder": "Choose PDF(s)...", + "addMore": "Add more PDFs..." }, "mode": { "label": "Selecione o modo de sobreposiÃ§ÃŖo:", @@ -2502,14 +2812,53 @@ }, "counts": { "label": "Contagens de sobreposiÃ§ÃŖo (para modo de repetiÃ§ÃŖo fixa)", - "placeholder": "Insira contagens separadas por vírgula (por exemplo, 2,3,1)" + "placeholder": "Insira contagens separadas por vírgula (por exemplo, 2,3,1)", + "item": "Count for file", + "noFiles": "Add overlay files to configure counts" }, "position": { "label": "Selecione a posiÃ§ÃŖo de sobreposiÃ§ÃŖo", "foreground": "Primeiro plano", "background": "Plano de fundo" }, - "submit": "Enviar" + "submit": "Enviar", + "settings": { + "title": "Settings" + }, + "results": { + "title": "Overlay Results" + }, + "tooltip": { + "header": { + "title": "Overlay PDFs Overview" + }, + "description": { + "title": "Description", + "text": "Combine a base PDF with one or more overlay PDFs. Overlays can be applied page-by-page in different modes and placed in the foreground or background." + }, + "mode": { + "title": "Overlay Mode", + "text": "Choose how to distribute overlay pages across the base PDF pages.", + "sequential": "Sequential Overlay: Use pages from the first overlay PDF until it ends, then move to the next.", + "interleaved": "Interleaved Overlay: Take one page from each overlay in turn.", + "fixedRepeat": "Fixed Repeat Overlay: Take a set number of pages from each overlay before moving to the next. Use Counts to set the numbers." + }, + "position": { + "title": "Overlay Position", + "text": "Foreground places the overlay on top of the page. Background places it behind." + }, + "overlayFiles": { + "title": "Overlay Files", + "text": "Select one or more PDFs to overlay on the base. The order of these files affects how pages are applied in Sequential and Fixed Repeat modes." + }, + "counts": { + "title": "Counts (Fixed Repeat only)", + "text": "Provide a positive number for each overlay file showing how many pages to take before moving to the next. Required when mode is Fixed Repeat." + } + }, + "error": { + "failed": "An error occurred while overlaying PDFs." + } }, "split-by-sections": { "tags": "SeÃ§ÃŖo Dividir, Dividir, Personalizar", @@ -2544,7 +2893,18 @@ "customMargin": "Margem personalizada:", "customColor": "Cor de texto personalizada:", "submit": "Enviar", - "noStampSelected": "Nenhum carimbo selecionado. Volte para a Etapa 1." + "noStampSelected": "Nenhum carimbo selecionado. Volte para a Etapa 1.", + "customPosition": "Drag the stamp to the desired location in the preview window.", + "error": { + "failed": "An error occurred while adding stamp to the PDF." + }, + "imageSize": "Image Size", + "margin": "Margin", + "positionAndFormatting": "Position & Formatting", + "quickPosition": "Select a position on the page to place the stamp.", + "results": { + "title": "Stamp Results" + } }, "removeImagePdf": { "tags": "Remover imagem,operaçÃĩes de pÃĄgina,back-end,lado do servidor" @@ -2562,7 +2922,8 @@ "status": { "_value": "SituaÃ§ÃŖo", "valid": "Valido", - "invalid": "InvÃĄlido" + "invalid": "InvÃĄlido", + "complete": "Validation complete" }, "signer": "SignatÃĄrio", "date": "Data", @@ -2589,17 +2950,115 @@ "version": "VersÃŖo", "keyUsage": "Uso da chave", "selfSigned": "Autoassinados", - "bits": "bits" + "bits": "bits", + "details": "Certificate Details" }, "signature": { "info": "InformaçÃĩes da assinatura", "_value": "Assinatura", "mathValid": "Assinatura Ê matematicamente valida PORÉM:" }, - "selectCustomCert": "Arquivo customizado de certificado X.509 (Opcional)" + "selectCustomCert": "Arquivo customizado de certificado X.509 (Opcional)", + "downloadCsv": "Download CSV", + "downloadJson": "Download JSON", + "downloadPdf": "Download PDF Report", + "downloadType": { + "csv": "CSV", + "json": "JSON", + "pdf": "PDF" + }, + "error": { + "allFailed": "Unable to validate the selected files.", + "partial": "Some files could not be validated.", + "reportGeneration": "Could not generate the PDF report. JSON and CSV are available.", + "unexpected": "Unexpected error during validation." + }, + "finalizing": "Preparing downloads...", + "issue": { + "certExpired": "Certificate expired", + "certRevocationUnknown": "Certificate revocation status unknown", + "certRevoked": "Certificate revoked", + "chainInvalid": "Certificate chain invalid", + "signatureInvalid": "Signature cryptographic check failed", + "trustInvalid": "Certificate not trusted" + }, + "noResults": "Run the validation to generate a report.", + "noSignaturesShort": "No signatures", + "processing": "Validating signatures...", + "report": { + "continued": "Continued", + "downloads": "Downloads", + "entryLabel": "Signature Summary", + "fields": { + "created": "Created", + "fileSize": "File Size", + "signatureCount": "Total Signatures", + "signatureDate": "Signature Date" + }, + "filesEvaluated": "{{count}} files evaluated", + "footer": "Validated via Stirling PDF", + "generatedAt": "Generated", + "noPdf": "PDF report will be available after a successful validation.", + "page": "Page", + "shortTitle": "Signature Summary", + "signatureCountLabel": "{{count}} signatures", + "signaturesFound": "{{count}} signatures detected", + "signaturesValid": "{{count}} fully valid", + "title": "Signature Validation Report" + }, + "settings": { + "certHint": "Upload a trusted X.509 certificate to validate against a custom trust source.", + "title": "Validation Settings" + }, + "signatureDate": "Signature Date", + "totalSignatures": "Total Signatures" }, "replaceColor": { - "tags": "Substituir cor,OperaçÃĩes de pÃĄgina,Back end,server side" + "tags": "Substituir cor,OperaçÃĩes de pÃĄgina,Back end,server side", + "labels": { + "settings": "Settings", + "colourOperation": "Colour operation" + }, + "options": { + "highContrast": "High contrast", + "invertAll": "Invert all colours", + "custom": "Custom", + "cmyk": "Convert to CMYK" + }, + "tooltip": { + "header": { + "title": "Replace & Invert Colour Settings Overview" + }, + "description": { + "title": "Description", + "text": "Transform PDF colours to improve readability and accessibility. Choose from high contrast presets, invert all colours, or create custom colour schemes." + }, + "highContrast": { + "title": "High Contrast", + "text": "Apply predefined high contrast colour combinations designed for better readability and accessibility compliance.", + "bullet1": "White text on black background - Classic dark mode", + "bullet2": "Black text on white background - Standard high contrast", + "bullet3": "Yellow text on black background - High visibility option", + "bullet4": "Green text on black background - Alternative high contrast" + }, + "invertAll": { + "title": "Invert All Colours", + "text": "Completely invert all colours in the PDF, creating a negative-like effect. Useful for creating dark mode versions of documents or reducing eye strain in low-light conditions." + }, + "custom": { + "title": "Custom Colours", + "text": "Define your own text and background colours using the colour pickers. Perfect for creating branded documents or specific accessibility requirements.", + "bullet1": "Text colour - Choose the colour for text elements", + "bullet2": "Background colour - Set the background colour for the document" + }, + "cmyk": { + "title": "Convert to CMYK", + "text": "Convert the PDF from RGB colour space to CMYK colour space, optimized for professional printing. This process converts colours to the Cyan, Magenta, Yellow, Black model used by printers." + } + }, + "error": { + "failed": "An error occurred while processing the colour replacement." + } }, "login": { "title": "Iniciar sessÃŖo", @@ -2632,6 +3091,11 @@ "enterEmail": "Insira seu e-mail", "enterPassword": "Insira sua senha", "loggingIn": "Entrando...", + "username": "Username", + "enterUsername": "Enter username", + "useEmailInstead": "Login with email", + "forgotPassword": "Forgot your password?", + "logIn": "Log In", "signingIn": "Fazendo login...", "login": "Login", "or": "Ou", @@ -2649,7 +3113,10 @@ "magicLinkSent": "Link mÃĄgico enviado para {{email}}! Verifique seu e-mail e clique no link para entrar.", "passwordResetSent": "Link de redefiniÃ§ÃŖo de senha enviado para {{email}}! Verifique seu e-mail e siga as instruçÃĩes.", "failedToSignIn": "Falha ao entrar com {{provider}}: {{message}}", - "unexpectedError": "Erro inesperado: {{message}}" + "unexpectedError": "Erro inesperado: {{message}}", + "accountCreatedSuccess": "Account created successfully! You can now sign in.", + "passwordChangedSuccess": "Password changed successfully! Please sign in with your new password.", + "credentialsUpdated": "Your credentials have been updated. Please sign in again." }, "signup": { "title": "Criar uma conta", @@ -2672,7 +3139,12 @@ "invalidEmail": "Insira um endereço de e-mail vÃĄlido", "checkEmailConfirmation": "Verifique seu e-mail para um link de confirmaÃ§ÃŖo e conclua seu cadastro.", "accountCreatedSuccessfully": "Conta criada com sucesso! Agora vocÃĒ pode entrar.", - "unexpectedError": "Erro inesperado: {{message}}" + "unexpectedError": "Erro inesperado: {{message}}", + "useEmailInstead": "Use Email Instead", + "nameRequired": "Name is required", + "emailRequired": "Email is required", + "passwordRequired": "Password is required", + "confirmPasswordRequired": "Please confirm your password" }, "pdfToSinglePage": { "title": "PDF para PÃĄgina Única", @@ -2712,10 +3184,23 @@ "adjustContrast": { "title": "Ajuste Visual do PDF", "header": "Ajuste Visual do PDF", + "basic": "Basic Adjustments", "contrast": "Contraste:", "brightness": "Brilho:", "saturation": "SaturaÃ§ÃŖo:", - "download": "Baixar" + "download": "Baixar", + "adjustColors": "Adjust Colors", + "blue": "Blue", + "confirm": "Confirm", + "error": { + "failed": "Failed to adjust colors/contrast" + }, + "green": "Green", + "noPreview": "Select a PDF to preview", + "red": "Red", + "results": { + "title": "Adjusted PDF" + } }, "compress": { "title": "Comprimir", @@ -2862,7 +3347,13 @@ "title": "Remover Imagem", "header": "Remover Imagem", "removeImage": "Remover Imagem", - "submit": "Remover Imagem" + "submit": "Remover Imagem", + "error": { + "failed": "Failed to remove images from the PDF." + }, + "results": { + "title": "Remove Images Results" + } }, "splitByChapters": { "title": "Divide PDF por Capítulos", @@ -2937,6 +3428,10 @@ "title": "Cookies Analíticos", "description": "Estes cookies nos ajudam a entender como nossas ferramentas estÃŖo sendo utilizadas, para que possamos nos concentrar na construÃ§ÃŖo dos recursos que nossa comunidade mais valoriza. Fique tranquilo: o Stirling PDF nÃŖo pode e nunca rastrearÃĄ o conteÃēdo dos documentos com os quais vocÃĒ manipula." } + }, + "services": { + "posthog": "PostHog Analytics", + "scarf": "Scarf Pixel" } }, "removeMetadata": { @@ -2998,11 +3493,18 @@ "panMode": "Modo de panorÃĸmica", "rotateLeft": "Girar à esquerda", "rotateRight": "Girar à direita", - "toggleSidebar": "Alternar barra lateral" + "toggleSidebar": "Alternar barra lateral", + "exportSelected": "Export Selected Pages", + "toggleAnnotations": "Toggle Annotations Visibility", + "annotationMode": "Toggle Annotation Mode", + "draw": "Draw", + "save": "Save" }, "search": { "title": "Pesquisar PDF", - "placeholder": "Digite o termo de busca..." + "placeholder": "Digite o termo de busca...", + "noResults": "No results found", + "searching": "Searching..." }, "guestBanner": { "title": "VocÃĒ estÃĄ usando o Stirling PDF como convidado!", @@ -3040,9 +3542,597 @@ "automate": "Automatizar", "files": "Arquivos", "activity": "Atividade", + "help": "Help", + "account": "Account", "config": "Config", + "adminSettings": "Admin Settings", "allTools": "Todas as ferramentas" }, + "admin": { + "error": "Error", + "success": "Success", + "expand": "Expand", + "close": "Close", + "status": { + "active": "Active", + "inactive": "Inactive" + }, + "settings": { + "title": "Admin Settings", + "workspace": "Workspace", + "fetchError": "Failed to load settings", + "saveError": "Failed to save settings", + "saved": "Settings saved successfully", + "saveSuccess": "Settings saved successfully", + "save": "Save Changes", + "restartRequired": "Restart Required", + "restart": { + "title": "Restart Required", + "message": "Settings have been saved successfully. A server restart is required for the changes to take effect.", + "question": "Would you like to restart the server now or later?", + "now": "Restart Now", + "later": "Restart Later" + }, + "restarting": "Restarting Server", + "restartingMessage": "The server is restarting. Please wait a moment...", + "restartError": "Failed to restart server. Please restart manually.", + "general": { + "title": "System Settings", + "description": "Configure system-wide application settings including branding and default behaviour.", + "ui": "User Interface", + "system": "System", + "appName": { + "label": "Application Name", + "description": "The name displayed in the browser tab and home page" + }, + "appNameNavbar": { + "label": "Navbar Brand", + "description": "The name displayed in the navigation bar" + }, + "homeDescription": { + "label": "Home Description", + "description": "The description text shown on the home page" + }, + "defaultLocale": { + "label": "Default Locale", + "description": "The default language for new users (e.g., en_US, es_ES)" + }, + "fileUploadLimit": { + "label": "File Upload Limit", + "description": "Maximum file upload size (e.g., 100MB, 1GB)" + }, + "showUpdate": { + "label": "Show Update Notifications", + "description": "Display notifications when a new version is available" + }, + "showUpdateOnlyAdmin": { + "label": "Show Updates to Admins Only", + "description": "Restrict update notifications to admin users only" + }, + "customHTMLFiles": { + "label": "Custom HTML Files", + "description": "Allow serving custom HTML files from the customFiles directory" + }, + "languages": { + "label": "Available Languages", + "description": "Languages that users can select from (leave empty to enable all languages)" + }, + "customMetadata": { + "label": "Custom Metadata", + "autoUpdate": { + "label": "Auto Update Metadata", + "description": "Automatically update PDF metadata on all processed documents" + }, + "author": { + "label": "Default Author", + "description": "Default author for PDF metadata (e.g., username)" + }, + "creator": { + "label": "Default Creator", + "description": "Default creator for PDF metadata" + }, + "producer": { + "label": "Default Producer", + "description": "Default producer for PDF metadata" + } + }, + "customPaths": { + "label": "Custom Paths", + "description": "Configure custom file system paths for pipeline processing and external tools", + "pipeline": { + "label": "Pipeline Directories", + "watchedFoldersDir": { + "label": "Watched Folders Directory", + "description": "Directory where pipeline monitors for incoming PDFs (leave empty for default: /pipeline/watchedFolders)" + }, + "finishedFoldersDir": { + "label": "Finished Folders Directory", + "description": "Directory where processed PDFs are outputted (leave empty for default: /pipeline/finishedFolders)" + } + }, + "operations": { + "label": "External Tool Paths", + "weasyprint": { + "label": "WeasyPrint Executable", + "description": "Path to WeasyPrint executable for HTML to PDF conversion (leave empty for default: /opt/venv/bin/weasyprint)" + }, + "unoconvert": { + "label": "Unoconvert Executable", + "description": "Path to LibreOffice unoconvert for document conversions (leave empty for default: /opt/venv/bin/unoconvert)" + } + } + } + }, + "security": { + "title": "Security", + "description": "Configure authentication, login behaviour, and security policies.", + "ssoNotice": { + "title": "Looking for SSO/SAML settings?", + "message": "OAuth2 and SAML2 authentication providers have been moved to the Connections menu for easier management." + }, + "authentication": "Authentication", + "enableLogin": { + "label": "Enable Login", + "description": "Require users to log in before accessing the application" + }, + "loginMethod": { + "label": "Login Method", + "description": "The authentication method to use for user login", + "all": "All Methods", + "normal": "Username/Password Only", + "oauth2": "OAuth2 Only", + "saml2": "SAML2 Only" + }, + "loginAttemptCount": { + "label": "Login Attempt Limit", + "description": "Maximum number of failed login attempts before account lockout" + }, + "loginResetTimeMinutes": { + "label": "Login Reset Time (minutes)", + "description": "Time before failed login attempts are reset" + }, + "csrfDisabled": { + "label": "Disable CSRF Protection", + "description": "Disable Cross-Site Request Forgery protection (not recommended)" + }, + "initialLogin": { + "label": "Initial Login", + "username": { + "label": "Initial Username", + "description": "The username for the initial admin account" + }, + "password": { + "label": "Initial Password", + "description": "The password for the initial admin account" + } + }, + "jwt": { + "label": "JWT Configuration", + "secureCookie": { + "label": "Secure Cookie", + "description": "Require HTTPS for JWT cookies (recommended for production)" + }, + "keyRetentionDays": { + "label": "Key Retention Days", + "description": "Number of days to retain old JWT keys for verification" + }, + "persistence": { + "label": "Enable Key Persistence", + "description": "Store JWT keys persistently to survive server restarts" + }, + "enableKeyRotation": { + "label": "Enable Key Rotation", + "description": "Automatically rotate JWT signing keys periodically" + }, + "enableKeyCleanup": { + "label": "Enable Key Cleanup", + "description": "Automatically remove expired JWT keys" + } + }, + "audit": { + "label": "Audit Logging", + "enabled": { + "label": "Enable Audit Logging", + "description": "Track user actions and system events for compliance and security monitoring" + }, + "level": { + "label": "Audit Level", + "description": "0=OFF, 1=BASIC, 2=STANDARD, 3=VERBOSE" + }, + "retentionDays": { + "label": "Audit Retention (days)", + "description": "Number of days to retain audit logs" + } + }, + "htmlUrlSecurity": { + "label": "HTML URL Security", + "description": "Configure URL access restrictions for HTML processing to prevent SSRF attacks", + "enabled": { + "label": "Enable URL Security", + "description": "Enable URL security restrictions for HTML to PDF conversions" + }, + "level": { + "label": "Security Level", + "description": "MAX: whitelist only, MEDIUM: block internal networks, OFF: no restrictions", + "max": "Maximum (Whitelist Only)", + "medium": "Medium (Block Internal)", + "off": "Off (No Restrictions)" + }, + "advanced": "Advanced Settings", + "allowedDomains": { + "label": "Allowed Domains (Whitelist)", + "description": "One domain per line (e.g., cdn.example.com). Only these domains allowed when level is MAX" + }, + "blockedDomains": { + "label": "Blocked Domains (Blacklist)", + "description": "One domain per line (e.g., malicious.com). Additional domains to block" + }, + "internalTlds": { + "label": "Internal TLDs", + "description": "One TLD per line (e.g., .local, .internal). Block domains with these TLD patterns" + }, + "networkBlocking": "Network Blocking", + "blockPrivateNetworks": { + "label": "Block Private Networks", + "description": "Block RFC 1918 private networks (10.x.x.x, 192.168.x.x, 172.16-31.x.x)" + }, + "blockLocalhost": { + "label": "Block Localhost", + "description": "Block localhost and loopback addresses (127.x.x.x, ::1)" + }, + "blockLinkLocal": { + "label": "Block Link-Local Addresses", + "description": "Block link-local addresses (169.254.x.x, fe80::/10)" + }, + "blockCloudMetadata": { + "label": "Block Cloud Metadata Endpoints", + "description": "Block cloud provider metadata endpoints (169.254.169.254)" + } + } + }, + "connections": { + "title": "Connections", + "description": "Configure external authentication providers like OAuth2 and SAML.", + "linkedServices": "Linked Services", + "unlinkedServices": "Unlinked Services", + "connect": "Connect", + "disconnect": "Disconnect", + "disconnected": "Provider disconnected successfully", + "disconnectError": "Failed to disconnect provider", + "ssoAutoLogin": { + "label": "SSO Auto Login", + "enable": "Enable SSO Auto Login", + "description": "Automatically redirect to SSO login when authentication is required" + }, + "oauth2": { + "label": "OAuth2", + "enabled": { + "label": "Enable OAuth2", + "description": "Allow users to authenticate using OAuth2 providers" + }, + "provider": { + "label": "Provider", + "description": "The OAuth2 provider to use for authentication" + }, + "issuer": { + "label": "Issuer URL", + "description": "The OAuth2 provider issuer URL" + }, + "clientId": { + "label": "Client ID", + "description": "The OAuth2 client ID from your provider" + }, + "clientSecret": { + "label": "Client Secret", + "description": "The OAuth2 client secret from your provider" + }, + "useAsUsername": { + "label": "Use as Username", + "description": "The OAuth2 claim to use as the username (e.g., email, sub)" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first OAuth2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via OAuth2" + }, + "scopes": { + "label": "OAuth2 Scopes", + "description": "Comma-separated list of OAuth2 scopes to request (e.g., openid, profile, email)" + } + }, + "saml2": { + "label": "SAML2", + "enabled": { + "label": "Enable SAML2", + "description": "Allow users to authenticate using SAML2 providers" + }, + "provider": { + "label": "Provider", + "description": "The SAML2 provider name" + }, + "registrationId": { + "label": "Registration ID", + "description": "The SAML2 registration identifier" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first SAML2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via SAML2" + } + } + }, + "database": { + "title": "Database", + "description": "Configure custom database connection settings for enterprise deployments.", + "configuration": "Database Configuration", + "enableCustom": { + "label": "Enable Custom Database", + "description": "Use your own custom database configuration instead of the default embedded database" + }, + "customUrl": { + "label": "Custom Database URL", + "description": "Full JDBC connection string (e.g., jdbc:postgresql://localhost:5432/postgres). If provided, individual connection settings below are not used." + }, + "type": { + "label": "Database Type", + "description": "Type of database (not used if custom URL is provided)" + }, + "hostName": { + "label": "Host Name", + "description": "Database server hostname (not used if custom URL is provided)" + }, + "port": { + "label": "Port", + "description": "Database server port (not used if custom URL is provided)" + }, + "name": { + "label": "Database Name", + "description": "Name of the database (not used if custom URL is provided)" + }, + "username": { + "label": "Username", + "description": "Database authentication username" + }, + "password": { + "label": "Password", + "description": "Database authentication password" + } + }, + "privacy": { + "title": "Privacy", + "description": "Configure privacy and data collection settings.", + "analytics": "Analytics & Tracking", + "enableAnalytics": { + "label": "Enable Analytics", + "description": "Collect anonymous usage analytics to help improve the application" + }, + "metricsEnabled": { + "label": "Enable Metrics", + "description": "Enable collection of performance and usage metrics. Provides API endpoint for admins to access metrics data" + }, + "searchEngine": "Search Engine Visibility", + "googleVisibility": { + "label": "Google Visibility", + "description": "Allow search engines to index this application" + } + }, + "advanced": { + "title": "Advanced", + "description": "Configure advanced features and experimental functionality.", + "features": "Feature Flags", + "processing": "Processing", + "endpoints": { + "label": "Endpoints", + "manage": "Manage API Endpoints", + "description": "Endpoint management is configured via YAML. See documentation for details on enabling/disabling specific endpoints." + }, + "enableAlphaFunctionality": { + "label": "Enable Alpha Features", + "description": "Enable experimental and alpha-stage features (may be unstable)" + }, + "enableUrlToPDF": { + "label": "Enable URL to PDF", + "description": "Allow conversion of web pages to PDF documents" + }, + "maxDPI": { + "label": "Maximum DPI", + "description": "Maximum DPI for image processing (0 = unlimited)" + }, + "tessdataDir": { + "label": "Tessdata Directory", + "description": "Path to the tessdata directory for OCR language files" + }, + "disableSanitize": { + "label": "Disable HTML Sanitization", + "description": "WARNING: Security risk - disabling HTML sanitization can lead to XSS vulnerabilities" + }, + "tempFileManagement": { + "label": "Temp File Management", + "description": "Configure temporary file storage and cleanup behavior", + "baseTmpDir": { + "label": "Base Temp Directory", + "description": "Base directory for temporary files (leave empty for default: java.io.tmpdir/stirling-pdf)" + }, + "libreofficeDir": { + "label": "LibreOffice Temp Directory", + "description": "Directory for LibreOffice temp files (leave empty for default: baseTmpDir/libreoffice)" + }, + "systemTempDir": { + "label": "System Temp Directory", + "description": "System temp directory to clean (only used if cleanupSystemTemp is enabled)" + }, + "prefix": { + "label": "Temp File Prefix", + "description": "Prefix for temp file names" + }, + "maxAgeHours": { + "label": "Max Age (hours)", + "description": "Maximum age in hours before temp files are cleaned up" + }, + "cleanupIntervalMinutes": { + "label": "Cleanup Interval (minutes)", + "description": "How often to run cleanup (in minutes)" + }, + "startupCleanup": { + "label": "Startup Cleanup", + "description": "Clean up old temp files on application startup" + }, + "cleanupSystemTemp": { + "label": "Cleanup System Temp", + "description": "Whether to clean broader system temp directory (use with caution)" + } + }, + "processExecutor": { + "label": "Process Executor Limits", + "description": "Configure session limits and timeouts for each process executor", + "sessionLimit": { + "label": "Session Limit", + "description": "Maximum concurrent instances" + }, + "timeout": { + "label": "Timeout (minutes)", + "description": "Maximum execution time" + }, + "libreOffice": "LibreOffice", + "pdfToHtml": "PDF to HTML", + "qpdf": "QPDF", + "tesseract": "Tesseract OCR", + "pythonOpenCv": "Python OpenCV", + "weasyPrint": "WeasyPrint", + "installApp": "Install App", + "calibre": "Calibre", + "ghostscript": "Ghostscript", + "ocrMyPdf": "OCRmyPDF" + } + }, + "mail": { + "title": "Mail Server", + "description": "Configure SMTP settings for sending email notifications.", + "smtp": "SMTP Configuration", + "enabled": { + "label": "Enable Mail", + "description": "Enable email notifications and SMTP functionality" + }, + "host": { + "label": "SMTP Host", + "description": "The hostname or IP address of your SMTP server" + }, + "port": { + "label": "SMTP Port", + "description": "The port number for SMTP connection (typically 25, 465, or 587)" + }, + "username": { + "label": "SMTP Username", + "description": "Username for SMTP authentication" + }, + "password": { + "label": "SMTP Password", + "description": "Password for SMTP authentication" + }, + "from": { + "label": "From Address", + "description": "The email address to use as the sender" + }, + "enableInvites": { + "label": "Enable Email Invites", + "description": "Allow admins to invite users via email with auto-generated passwords" + }, + "frontendUrl": { + "label": "Frontend URL", + "description": "Base URL for frontend (e.g. https://pdf.example.com). Used for generating invite links in emails. Leave empty to use backend URL." + } + }, + "legal": { + "title": "Legal Documents", + "description": "Configure links to legal documents and policies.", + "disclaimer": { + "title": "Legal Responsibility Warning", + "message": "By customizing these legal documents, you assume full responsibility for ensuring compliance with all applicable laws and regulations, including but not limited to GDPR and other EU data protection requirements. Only modify these settings if: (1) you are operating a personal/private instance, (2) you are outside EU jurisdiction and understand your local legal obligations, or (3) you have obtained proper legal counsel and accept sole responsibility for all user data and legal compliance. Stirling-PDF and its developers assume no liability for your legal obligations." + }, + "termsAndConditions": { + "label": "Terms and Conditions", + "description": "URL or filename to terms and conditions" + }, + "privacyPolicy": { + "label": "Privacy Policy", + "description": "URL or filename to privacy policy" + }, + "accessibilityStatement": { + "label": "Accessibility Statement", + "description": "URL or filename to accessibility statement" + }, + "cookiePolicy": { + "label": "Cookie Policy", + "description": "URL or filename to cookie policy" + }, + "impressum": { + "label": "Impressum", + "description": "URL or filename to impressum (required in some jurisdictions)" + } + }, + "premium": { + "title": "Premium & Enterprise", + "description": "Configure your premium or enterprise license key.", + "license": "License Configuration", + "key": { + "label": "License Key", + "description": "Enter your premium or enterprise license key" + }, + "enabled": { + "label": "Enable Premium Features", + "description": "Enable license key checks for pro/enterprise features" + }, + "movedFeatures": { + "title": "Premium Features Distributed", + "message": "Premium and Enterprise features are now organized in their respective sections:" + } + }, + "features": { + "title": "Features", + "description": "Configure optional features and functionality.", + "serverCertificate": { + "label": "Server Certificate", + "description": "Configure server-side certificate generation for \"Sign with Stirling-PDF\" functionality", + "enabled": { + "label": "Enable Server Certificate", + "description": "Enable server-side certificate for \"Sign with Stirling-PDF\" option" + }, + "organizationName": { + "label": "Organization Name", + "description": "Organization name for generated certificates" + }, + "validity": { + "label": "Certificate Validity (days)", + "description": "Number of days the certificate will be valid" + }, + "regenerateOnStartup": { + "label": "Regenerate on Startup", + "description": "Generate new certificate on each application startup" + } + } + }, + "endpoints": { + "title": "API Endpoints", + "description": "Control which API endpoints and endpoint groups are available.", + "management": "Endpoint Management", + "toRemove": { + "label": "Disabled Endpoints", + "description": "Select individual endpoints to disable" + }, + "groupsToRemove": { + "label": "Disabled Endpoint Groups", + "description": "Select endpoint groups to disable" + }, + "note": "Note: Disabling endpoints restricts API access but does not remove UI components. Restart required for changes to take effect." + } + } + }, "fileUpload": { "selectFile": "Selecionar um arquivo", "selectFiles": "Selecionar arquivos", @@ -3067,6 +4157,9 @@ "addFiles": "Adicionar arquivos", "dragFilesInOrClick": "Arraste arquivos ou clique em \"Adicionar arquivos\" para procurar" }, + "fileEditor": { + "addFiles": "Add Files" + }, "fileManager": { "title": "Fazer upload de arquivos PDF", "subtitle": "Adicione arquivos ao seu armazenamento para fÃĄcil acesso entre as ferramentas", @@ -3086,6 +4179,7 @@ "filesStored": "arquivos armazenados", "storageError": "Ocorreu um erro de armazenamento", "storageLow": "O armazenamento estÃĄ acabando. Considere remover arquivos antigos.", + "supportMessage": "Powered by browser database storage for unlimited capacity", "noFileSelected": "Nenhum arquivo selecionado", "showHistory": "Mostrar histÃŗrico", "hideHistory": "Ocultar histÃŗrico", @@ -3094,6 +4188,7 @@ "lastModified": "Última modificaÃ§ÃŖo", "toolChain": "Ferramentas aplicadas", "restore": "Restaurar", + "unzip": "Unzip", "searchFiles": "Pesquisar arquivos...", "recent": "Recentes", "localFiles": "Arquivos locais", @@ -3101,7 +4196,6 @@ "googleDriveShort": "Drive", "myFiles": "Meus arquivos", "noRecentFiles": "Nenhum arquivo recente encontrado", - "dropFilesHint": "Solte os arquivos aqui para fazer upload", "googleDriveNotAvailable": "IntegraÃ§ÃŖo com Google Drive indisponível", "openFiles": "Abrir arquivos", "openFile": "Abrir arquivo", @@ -3119,7 +4213,18 @@ "selectedCount": "{{count}} selecionado(s)", "download": "Baixar (JSON)", "delete": "Apagar", - "unsupported": "NÃŖo suportado" + "unsupported": "NÃŖo suportado", + "addToUpload": "Add to Upload", + "deleteAll": "Delete All", + "loadingFiles": "Loading files...", + "noFiles": "No files available", + "noFilesFound": "No files found matching your search", + "openInPageEditor": "Open in Page Editor", + "showAll": "Show All", + "sortByDate": "Sort by Date", + "sortByName": "Sort by Name", + "sortBySize": "Sort by Size", + "dropFilesHint": "Solte os arquivos aqui para fazer upload" }, "storage": { "temporaryNotice": "Os arquivos sÃŖo armazenados temporariamente no seu navegador e podem ser limpos automaticamente", @@ -3135,8 +4240,10 @@ "desc": "Remova elementos potencialmente nocivos de arquivos PDF.", "submit": "Higienizar", "completed": "SanitizaÃ§ÃŖo concluída com sucesso", - "error.generic": "Falha na sanitizaÃ§ÃŖo", - "error.failed": "Ocorreu um erro ao sanitizar o PDF.", + "error": { + "generic": "Falha na sanitizaÃ§ÃŖo", + "failed": "Ocorreu um erro ao sanitizar o PDF." + }, "filenamePrefix": "sanitizado", "sanitizationResults": "Resultados da sanitizaÃ§ÃŖo", "steps": { @@ -3150,12 +4257,30 @@ "options": { "title": "OpçÃĩes de sanitizaÃ§ÃŖo", "note": "Selecione os elementos que deseja remover do PDF. Pelo menos uma opÃ§ÃŖo deve ser selecionada.", - "removeJavaScript.desc": "Remover açÃĩes e scripts JavaScript do PDF", - "removeEmbeddedFiles.desc": "Remover quaisquer arquivos incorporados no PDF", - "removeXMPMetadata.desc": "Remover metadados XMP do PDF", - "removeMetadata.desc": "Remover metadados de informaçÃĩes do documento (título, autor etc.)", - "removeLinks.desc": "Remover links externos e açÃĩes de lançamento do PDF", - "removeFonts.desc": "Remover fontes incorporadas do PDF" + "removeJavaScript": { + "label": "Remove JavaScript", + "desc": "Remover açÃĩes e scripts JavaScript do PDF" + }, + "removeEmbeddedFiles": { + "label": "Remove Embedded Files", + "desc": "Remover quaisquer arquivos incorporados no PDF" + }, + "removeXMPMetadata": { + "label": "Remove XMP Metadata", + "desc": "Remover metadados XMP do PDF" + }, + "removeMetadata": { + "label": "Remove Document Metadata", + "desc": "Remover metadados de informaçÃĩes do documento (título, autor etc.)" + }, + "removeLinks": { + "label": "Remove Links", + "desc": "Remover links externos e açÃĩes de lançamento do PDF" + }, + "removeFonts": { + "label": "Remove Fonts", + "desc": "Remover fontes incorporadas do PDF" + } } }, "addPassword": { @@ -3376,9 +4501,14 @@ "remaining": "restante", "used": "usado", "available": "disponível", - "cancel": "Cancelar" + "cancel": "Cancelar", + "preview": "Preview" }, "config": { + "overview": { + "title": "Application Configuration", + "description": "Current application settings and configuration details." + }, "account": { "overview": { "title": "ConfiguraçÃĩes da conta", @@ -3434,8 +4564,570 @@ "submit": "Adicionar anexos", "results": { "title": "Resultados dos anexos" + }, + "error": { + "failed": "Add attachments operation failed" } }, "termsAndConditions": "Termos e CondiçÃĩes", - "logOut": "Sair" -} \ No newline at end of file + "logOut": "Sair", + "addAttachments": { + "error": { + "failed": "An error occurred while adding attachments to the PDF." + } + }, + "autoRename": { + "description": "This tool will automatically rename PDF files based on their content. It analyzes the document to find the most suitable title from the text." + }, + "customPosition": "Custom Position", + "details": "Details", + "downloadUnavailable": "Download unavailable for this item", + "invalidUndoData": "Cannot undo: invalid operation data", + "margin": { + "large": "Large", + "medium": "Medium", + "small": "Small", + "xLarge": "Extra Large" + }, + "noFilesToUndo": "Cannot undo: no files were processed in the last operation", + "noOperationToUndo": "No operation to undo", + "noValidFiles": "No valid files to process", + "operationCancelled": "Operation cancelled", + "pageEdit": { + "deselectAll": "Select None", + "selectAll": "Select All" + }, + "quickPosition": "Quick Position", + "reorganizePages": { + "error": { + "failed": "Failed to reorganize pages" + }, + "results": { + "title": "Pages Reorganized" + }, + "settings": { + "title": "Settings" + }, + "submit": "Reorganize Pages" + }, + "replace-color": { + "options": { + "fill": "Fill colour", + "gradient": "Gradient" + }, + "previewOverlayOpacity": "Preview overlay opacity", + "previewOverlayTransparency": "Preview overlay transparency", + "previewOverlayVisibility": "Show preview overlay", + "selectText": { + "1": "Replace or invert colour options", + "2": "Default (preset high contrast colours)", + "3": "Custom (choose your own colours)", + "4": "Full invert (invert all colours)", + "5": "High contrast color options", + "6": "White text on black background", + "7": "Black text on white background", + "8": "Yellow text on black background", + "9": "Green text on black background", + "10": "Choose text Color", + "11": "Choose background Color", + "12": "Choose start colour", + "13": "Choose end colour" + }, + "submit": "Replace", + "title": "Replace-Invert-Color" + }, + "size": "Size", + "submit": "Submit", + "success": "Success", + "tools": { + "noSearchResults": "No tools found", + "noTools": "No tools available" + }, + "undoDataMismatch": "Cannot undo: operation data is corrupted", + "undoFailed": "Failed to undo operation", + "undoQuotaError": "Cannot undo: insufficient storage space", + "undoStorageError": "Undo completed but some files could not be saved to storage", + "undoSuccess": "Operation undone successfully", + "unsupported": "Unsupported", + "onboarding": { + "welcomeModal": { + "title": "Welcome to Stirling PDF!", + "description": "Would you like to take a quick 1-minute tour to learn the key features and how to get started?", + "helpHint": "You can always access this tour later from the Help button in the bottom left.", + "startTour": "Start Tour", + "maybeLater": "Maybe Later", + "dontShowAgain": "Don't Show Again" + }, + "allTools": "This is the All Tools panel, where you can browse and select from all available PDF tools.", + "selectCropTool": "Let's select the Crop tool to demonstrate how to use one of the tools.", + "toolInterface": "This is the Crop tool interface. As you can see, there's not much there because we haven't added any PDF files to work with yet.", + "filesButton": "The Files button on the Quick Access bar allows you to upload PDFs to use the tools on.", + "fileSources": "You can upload new files or access recent files from here. For the tour, we'll just use a sample file.", + "workbench": "This is the Workbench - the main area where you view and edit your PDFs.", + "viewSwitcher": "Use these controls to select how you want to view your PDFs.", + "viewer": "The Viewer lets you read and annotate your PDFs.", + "pageEditor": "The Page Editor allows you to do various operations on the pages within your PDFs, such as reordering, rotating and deleting.", + "activeFiles": "The Active Files view shows all of the PDFs you have loaded into the tool, and allows you to select which ones to process.", + "fileCheckbox": "Clicking one of the files selects it for processing. You can select multiple files for batch operations.", + "selectControls": "The Right Rail contains buttons to quickly select/deselect all of your active PDFs, along with buttons to change the app's theme or language.", + "cropSettings": "Now that we've selected the file we want crop, we can configure the Crop tool to choose the area that we want to crop the PDF to.", + "runButton": "Once the tool has been configured, this button allows you to run the tool on all the selected PDFs.", + "results": "After the tool has finished running, the Review step will show a preview of the results in this panel, and allow you to undo the operation or download the file. ", + "fileReplacement": "The modified file will replace the original file in the Workbench automatically, allowing you to easily run it through more tools.", + "pinButton": "You can use the Pin button if you'd rather your files stay active after running tools on them.", + "wrapUp": "You're all set! You've learnt about the main areas of the app and how to use them. Click the Help button whenever you like to see this tour again.", + "previous": "Previous", + "next": "Next", + "finish": "Finish", + "startTour": "Start Tour", + "startTourDescription": "Take a guided tour of Stirling PDF's key features" + }, + "workspace": { + "title": "Workspace", + "people": { + "title": "People", + "description": "Manage workspace members and their permissions", + "loading": "Loading people...", + "searchMembers": "Search members...", + "addMembers": "Add Members", + "inviteMembers": { + "label": "Invite Members", + "subtitle": "Type or paste in emails below, separated by commas. Your workspace will be billed by members." + }, + "user": "User", + "role": "Role", + "team": "Team", + "status": "Status", + "actions": "Actions", + "noMembersFound": "No members found", + "active": "Active", + "disabled": "Disabled", + "activeSession": "Active session", + "member": "Member", + "admin": "Admin", + "roleDescriptions": { + "admin": "Can manage settings and invite members, with full administrative access.", + "member": "Can view and edit shared files, but cannot manage workspace settings or members." + }, + "editRole": "Edit Role", + "enable": "Enable", + "disable": "Disable", + "deleteUser": "Delete User", + "deleteUserSuccess": "User deleted successfully", + "deleteUserError": "Failed to delete user", + "confirmDelete": "Are you sure you want to delete this user? This action cannot be undone.", + "addMember": { + "title": "Add Member", + "username": "Username (Email)", + "usernamePlaceholder": "user@example.com", + "password": "Password", + "passwordPlaceholder": "Enter password", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "forcePasswordChange": "Force password change on first login", + "cancel": "Cancel", + "submit": "Add Member", + "usernameRequired": "Username and password are required", + "passwordTooShort": "Password must be at least 6 characters", + "success": "User created successfully", + "error": "Failed to create user" + }, + "editMember": { + "title": "Edit Member", + "editing": "Editing:", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "cancel": "Cancel", + "submit": "Update Member", + "success": "User updated successfully", + "error": "Failed to update user" + }, + "toggleEnabled": { + "success": "User status updated successfully", + "error": "Failed to update user status" + }, + "delete": { + "success": "User deleted successfully", + "error": "Failed to delete user" + }, + "emailInvite": { + "tab": "Email Invite", + "description": "Type or paste in emails below, separated by commas. Users will receive login credentials via email.", + "emails": "Email Addresses", + "emailsPlaceholder": "user1@example.com, user2@example.com", + "emailsRequired": "At least one email address is required", + "submit": "Send Invites", + "success": "user(s) invited successfully", + "partialSuccess": "Some invites failed", + "allFailed": "Failed to invite users", + "error": "Failed to send invites" + }, + "directInvite": { + "tab": "Direct Create" + }, + "inviteLinkTab": { + "tab": "Invite Link" + }, + "inviteLink": { + "description": "Generate a secure link that allows the user to set their own password", + "email": "Email Address", + "emailPlaceholder": "user@example.com (optional)", + "emailDescription": "Optional - leave blank for a general invite link that can be used by anyone", + "emailRequired": "Email address is required", + "emailOptional": "Optional - leave blank for a general invite link", + "emailRequiredForSend": "Email address is required to send email notification", + "expiryHours": "Expiry Hours", + "expiryDescription": "How many hours until the link expires", + "sendEmail": "Send invite link via email", + "sendEmailDescription": "If enabled, the invite link will be sent to the specified email address", + "smtpRequired": "SMTP not configured", + "generate": "Generate Link", + "generated": "Invite Link Generated", + "copied": "Link copied to clipboard", + "success": "Invite link generated successfully", + "successWithEmail": "Invite link generated and sent via email", + "emailFailed": "Invite link generated, but email failed", + "emailFailedDetails": "Error: {0}. Please share the invite link manually.", + "error": "Failed to generate invite link", + "submit": "Generate Invite Link" + }, + "inviteMode": { + "username": "Username", + "email": "Email", + "link": "Link", + "emailDisabled": "Email invites require SMTP configuration and mail.enableInvites=true in settings" + }, + "license": { + "users": "users", + "availableSlots": "Available Slots", + "grandfathered": "Grandfathered", + "grandfatheredShort": "{{count}} grandfathered", + "fromLicense": "from license", + "slotsAvailable": "{{count}} user slot(s) available", + "noSlotsAvailable": "No slots available", + "currentUsage": "Currently using {{current}} of {{max}} user licences" + } + }, + "teams": { + "title": "Teams", + "description": "Manage teams and organize workspace members", + "loading": "Loading teams...", + "loadingDetails": "Loading team details...", + "createNewTeam": "Create New Team", + "teamName": "Team Name", + "totalMembers": "Total Members", + "actions": "Actions", + "noTeamsFound": "No teams found", + "noMembers": "No members in this team", + "system": "System", + "addMember": "Add Member", + "viewTeam": "View Team", + "removeMember": "Remove from team", + "cannotRemoveFromSystemTeam": "Cannot remove from system team", + "renameTeamLabel": "Rename Team", + "deleteTeamLabel": "Delete Team", + "cannotDeleteInternal": "Cannot delete the Internal team", + "confirmDelete": "Are you sure you want to delete this team? This team must be empty to delete.", + "confirmRemove": "Remove user from this team?", + "cannotRenameInternal": "Cannot rename the Internal team", + "cannotAddToInternal": "Cannot add members to the Internal team", + "teamNotFound": "Team not found", + "backToTeams": "Back to Teams", + "memberCount": "{{count}} members", + "removeMemberSuccess": "User removed from team", + "removeMemberError": "Failed to remove user from team", + "createTeam": { + "title": "Create New Team", + "teamName": "Team Name", + "teamNamePlaceholder": "Enter team name", + "cancel": "Cancel", + "submit": "Create Team", + "nameRequired": "Team name is required", + "success": "Team created successfully", + "error": "Failed to create team" + }, + "renameTeam": { + "title": "Rename Team", + "renaming": "Renaming:", + "newTeamName": "New Team Name", + "newTeamNamePlaceholder": "Enter new team name", + "cancel": "Cancel", + "submit": "Rename Team", + "nameRequired": "Team name is required", + "success": "Team renamed successfully", + "error": "Failed to rename team" + }, + "deleteTeam": { + "success": "Team deleted successfully", + "error": "Failed to delete team. Make sure the team is empty.", + "teamMustBeEmpty": "Team must be empty before deletion" + }, + "addMemberToTeam": { + "title": "Add Member to Team", + "addingTo": "Adding to", + "selectUser": "Select User", + "selectUserPlaceholder": "Choose a user", + "selectUserRequired": "Please select a user", + "currentlyIn": "currently in", + "willBeMoved": "Note: This user will be moved from their current team to this team.", + "cancel": "Cancel", + "submit": "Add Member", + "userRequired": "Please select a user", + "success": "Member added to team successfully", + "error": "Failed to add member to team" + }, + "changeTeam": { + "label": "Change Team", + "title": "Change Team", + "changing": "Moving", + "selectTeam": "Select Team", + "selectTeamPlaceholder": "Choose a team", + "selectTeamRequired": "Please select a team", + "success": "Team changed successfully", + "error": "Failed to change team", + "submit": "Change Team" + } + } + }, + "plan": { + "currency": "Currency", + "popular": "Popular", + "current": "Current Plan", + "upgrade": "Upgrade", + "contact": "Contact Us", + "customPricing": "Custom", + "showComparison": "Compare All Features", + "hideComparison": "Hide Feature Comparison", + "featureComparison": "Feature Comparison", + "activePlan": { + "title": "Active Plan", + "subtitle": "Your current subscription details" + }, + "availablePlans": { + "title": "Available Plans", + "subtitle": "Choose the plan that fits your needs" + }, + "static": { + "title": "Billing Information", + "message": "Online billing is not currently configured. To upgrade your plan or manage subscriptions, please contact us directly.", + "contactSales": "Contact Sales", + "contactToUpgrade": "Contact us to upgrade or customize your plan", + "maxUsers": "Max Users", + "upTo": "Up to" + }, + "period": { + "month": "month" + }, + "free": { + "name": "Free", + "highlight1": "Limited Tool Usage Per week", + "highlight2": "Access to all tools", + "highlight3": "Community support" + }, + "pro": { + "name": "Pro", + "highlight1": "Unlimited Tool Usage", + "highlight2": "Advanced PDF tools", + "highlight3": "No watermarks" + }, + "enterprise": { + "name": "Enterprise", + "highlight1": "Custom pricing", + "highlight2": "Dedicated support", + "highlight3": "Latest features" + }, + "feature": { + "title": "Feature", + "pdfTools": "Basic PDF Tools", + "fileSize": "File Size Limit", + "automation": "Automate tool workflows", + "api": "API Access", + "priority": "Priority Support", + "customPricing": "Custom Pricing" + } + }, + "subscription": { + "status": { + "active": "Active", + "pastDue": "Past Due", + "canceled": "Canceled", + "incomplete": "Incomplete", + "trialing": "Trial", + "none": "No Subscription" + }, + "renewsOn": "Renews on {{date}}", + "cancelsOn": "Cancels on {{date}}" + }, + "billing": { + "manageBilling": "Manage Billing", + "portal": { + "error": "Failed to open billing portal" + } + }, + "payment": { + "preparing": "Preparing your checkout...", + "upgradeTitle": "Upgrade to {{planName}}", + "success": "Payment Successful!", + "successMessage": "Your subscription has been activated successfully. You will receive a confirmation email shortly.", + "autoClose": "This window will close automatically...", + "error": "Payment Error" + }, + "firstLogin": { + "title": "First Time Login", + "welcomeTitle": "Welcome!", + "welcomeMessage": "For security reasons, you must change your password on your first login.", + "loggedInAs": "Logged in as", + "error": "Error", + "currentPassword": "Current Password", + "enterCurrentPassword": "Enter your current password", + "newPassword": "New Password", + "enterNewPassword": "Enter new password (min 8 characters)", + "confirmPassword": "Confirm New Password", + "reEnterNewPassword": "Re-enter new password", + "changePassword": "Change Password", + "allFieldsRequired": "All fields are required", + "passwordsDoNotMatch": "New passwords do not match", + "passwordTooShort": "Password must be at least 8 characters", + "passwordMustBeDifferent": "New password must be different from current password", + "passwordChangedSuccess": "Password changed successfully! Please log in again.", + "passwordChangeFailed": "Failed to change password. Please check your current password." + }, + "invite": { + "welcome": "Welcome to Stirling PDF", + "invalidToken": "Invalid invitation link", + "validationError": "Failed to validate invitation link", + "passwordRequired": "Password is required", + "passwordTooShort": "Password must be at least 6 characters", + "passwordMismatch": "Passwords do not match", + "acceptError": "Failed to create account", + "validating": "Validating invitation...", + "invalidInvitation": "Invalid Invitation", + "goToLogin": "Go to Login", + "welcomeTitle": "You've been invited!", + "welcomeSubtitle": "Complete your account setup to get started", + "accountFor": "Creating account for", + "linkExpires": "Link expires", + "email": "Email address", + "emailPlaceholder": "Enter your email address", + "emailRequired": "Email address is required", + "invalidEmail": "Invalid email address", + "choosePassword": "Choose a password", + "passwordPlaceholder": "Enter your password", + "confirmPassword": "Confirm password", + "confirmPasswordPlaceholder": "Re-enter your password", + "createAccount": "Create Account", + "creating": "Creating Account...", + "alreadyHaveAccount": "Already have an account?", + "signIn": "Sign in" + }, + "audit": { + "error": { + "title": "Error loading audit system" + }, + "notAvailable": "Audit system not available", + "notAvailableMessage": "The audit system is not configured or not available.", + "disabled": "Audit logging is disabled", + "disabledMessage": "Enable audit logging in your application configuration to track system events.", + "systemStatus": { + "title": "System Status", + "status": "Audit Logging", + "enabled": "Enabled", + "disabled": "Disabled", + "level": "Audit Level", + "retention": "Retention Period", + "days": "days", + "totalEvents": "Total Events" + }, + "tabs": { + "dashboard": "Dashboard", + "events": "Audit Events", + "export": "Export" + }, + "charts": { + "title": "Audit Dashboard", + "error": "Error loading charts", + "day": "Day", + "week": "Week", + "month": "Month", + "byType": "Events by Type", + "byUser": "Events by User", + "overTime": "Events Over Time" + }, + "events": { + "title": "Audit Events", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "error": "Error loading events", + "noEvents": "No events found", + "timestamp": "Timestamp", + "type": "Type", + "user": "User", + "ipAddress": "IP Address", + "actions": "Actions", + "viewDetails": "View Details", + "eventDetails": "Event Details", + "details": "Details" + }, + "export": { + "title": "Export Audit Data", + "description": "Export audit events to CSV or JSON format. Use filters to limit the exported data.", + "format": "Export Format", + "filters": "Filters (Optional)", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "exportButton": "Export Data", + "error": "Failed to export data" + } + }, + "usage": { + "noData": "No data available", + "error": "Error loading usage statistics", + "noDataMessage": "No usage statistics are currently available.", + "controls": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All", + "refresh": "Refresh", + "dataTypeLabel": "Data Type:", + "dataType": { + "all": "All", + "api": "API", + "ui": "UI" + } + }, + "showing": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All" + }, + "stats": { + "totalEndpoints": "Total Endpoints", + "totalVisits": "Total Visits", + "showing": "Showing", + "selectedVisits": "Selected Visits" + }, + "chart": { + "title": "Endpoint Usage Chart" + }, + "table": { + "title": "Detailed Statistics", + "endpoint": "Endpoint", + "visits": "Visits", + "percentage": "Percentage", + "noData": "No data available" + } + }, + "backendHealth": { + "checking": "Checking backend status...", + "online": "Backend Online", + "offline": "Backend Offline" + } +} diff --git a/frontend/public/locales/pt-PT/translation.json b/frontend/public/locales/pt-PT/translation.json index 1b9518e07..0026bb8a7 100644 --- a/frontend/public/locales/pt-PT/translation.json +++ b/frontend/public/locales/pt-PT/translation.json @@ -1,4 +1,40 @@ { + "toolPanel": { + "modePrompt": { + "title": "Choose how you browse tools", + "description": "Preview both layouts and decide how you want to explore Stirling PDF tools.", + "sidebarTitle": "Sidebar mode", + "sidebarDescription": "Keep tools alongside your workspace for quick switching.", + "recommended": "Recommended", + "chooseSidebar": "Use sidebar mode", + "fullscreenTitle": "Fullscreen mode - (legacy)", + "fullscreenDescription": "Browse every tool in a catalogue that covers the workspace until you pick one.", + "chooseFullscreen": "Use fullscreen mode", + "dismiss": "Maybe later" + }, + "fullscreen": { + "showDetails": "Show Details", + "comingSoon": "Coming soon:", + "favorite": "Add to favourites", + "favorites": "Favourites", + "heading": "All tools (fullscreen view)", + "noResults": "Try adjusting your search or toggle descriptions to find what you need.", + "recommended": "Recommended", + "unfavorite": "Remove from favourites" + }, + "placeholder": "Choose a tool to get started", + "toggle": { + "fullscreen": "Switch to fullscreen mode", + "sidebar": "Switch to sidebar mode" + } + }, + "unsavedChanges": "You have unsaved changes to your PDF.", + "areYouSure": "Are you sure you want to leave?", + "unsavedChangesTitle": "Unsaved Changes", + "keepWorking": "Keep Working", + "discardChanges": "Discard & Leave", + "applyAndContinue": "Save & Leave", + "exportAndContinue": "Export & Continue", "language": { "direction": "ltr" }, @@ -18,8 +54,26 @@ "customTextDesc": "Texto Personalizado", "numberPagesDesc": "Quais pÃĄginas a numerar, predefiniÃ§ÃŖo 'todas', tambÊm aceita 1-5 ou 2,5,9 etc", "customNumberDesc": "PredefiniÃ§ÃŖo {n}, tambÊm aceita 'PÃĄgina {n} de {total}', 'Texto-{n}', '{filename}-{n}", - "submit": "Adicionar NÃēmeros de PÃĄgina" + "submit": "Adicionar NÃēmeros de PÃĄgina", + "configuration": "Configuration", + "customize": "Customize Appearance", + "pagesAndStarting": "Pages & Starting Number", + "positionAndPages": "Position & Pages", + "error": { + "failed": "Add page numbers operation failed" + }, + "results": { + "title": "Page Number Results" + }, + "preview": "Position Selection", + "previewDisclaimer": "Preview is approximate. Final output may vary due to PDF font metrics." }, + "pageSelectionPrompt": "SeleÃ§ÃŖo Personalizada de PÃĄginas (Insira uma lista de nÃēmeros de pÃĄgina separados por vírgulas 1,5,6 ou FunçÃĩes como 2n+1):", + "startingNumberTooltip": "The first number to display. Subsequent pages will increment from this number.", + "marginTooltip": "Distance between the page number and the edge of the page.", + "fontSizeTooltip": "Size of the page number text in points. Larger numbers create bigger text.", + "fontTypeTooltip": "Font family for the page numbers. Choose based on your document style.", + "customTextTooltip": "Optional custom format for page numbers. Use {n} as placeholder for the number. Example: \"Page {n}\" will show \"Page 1\", \"Page 2\", etc.", "pdfPrompt": "Selecione PDF(s)", "multiPdfPrompt": "Selecione PDFs (2+)", "multiPdfDropPrompt": "Selecione (ou arraste e solte) todos os PDFs necessÃĄrios", @@ -30,15 +84,41 @@ "uploadLimitExceededPlural": "sÃŖo muito grandes. O tamanho mÃĄximo permitido Ê", "processTimeWarning": "Aviso: Este processo pode demorar atÊ um minuto dependendo do tamanho do ficheiro", "pageOrderPrompt": "Ordem Personalizada de PÃĄginas (Insira uma lista de nÃēmeros de pÃĄgina separados por vírgulas ou FunçÃĩes como 2n+1):", - "pageSelectionPrompt": "SeleÃ§ÃŖo Personalizada de PÃĄginas (Insira uma lista de nÃēmeros de pÃĄgina separados por vírgulas 1,5,6 ou FunçÃĩes como 2n+1):", "goToPage": "Ir", "true": "Verdadeiro", "false": "Falso", "unknown": "Desconhecido", + "app": { + "description": "The Free Adobe Acrobat alternative (10M+ Downloads)" + }, "save": "Guardar", "saveToBrowser": "Guardar no Navegador", + "download": "Transferir", + "pin": "Pin File (keep active after tool run)", + "unpin": "Unpin File (replace after tool run)", + "undoOperationTooltip": "Click to undo the last operation and restore the original files", + "undo": "Undo", + "moreOptions": "More Options", + "editYourNewFiles": "Edit your new file(s)", "close": "Fechar", + "openInViewer": "Open in Viewer", + "confirmClose": "Confirm Close", + "confirmCloseMessage": "Are you sure you want to close this file?", + "confirmCloseCancel": "Cancel", + "confirmCloseConfirm": "Close File", + "fileSelected": "Selected: {{filename}}", + "chooseFile": "Choose File", "filesSelected": "ficheiros selecionados", + "files": { + "title": "Files", + "upload": "Upload", + "uploadFiles": "Upload Files", + "addFiles": "Add files", + "selectFromWorkbench": "Select files from the workbench or ", + "selectMultipleFromWorkbench": "Select at least {{count}} files from the workbench or ", + "created": "Created", + "size": "File Size" + }, "noFavourites": "Nenhum favorito adicionado", "downloadComplete": "Download Concluído", "bored": "Entediado à espera?", @@ -56,7 +136,10 @@ }, "error": { "pdfPassword": "O documento PDF estÃĄ protegido por palavra-passe e ou nÃŖo foi fornecida ou estÃĄ incorreta", + "encryptedPdfMustRemovePassword": "This PDF is encrypted or password-protected. Please unlock it before converting to PDF/A.", + "incorrectPasswordProvided": "The PDF password is incorrect or not provided.", "_value": "Erro", + "dismissAllErrors": "Dismiss All Errors", "sorry": "Pedimos desculpa pelo inconveniente!", "needHelp": "Precisa de ajuda / Encontrou um problema?", "contactTip": "Se ainda estiver com problemas, nÃŖo hesite em contactar-nos para obter ajuda. Pode submeter um ticket na nossa pÃĄgina GitHub ou contactar-nos atravÊs do Discord:", @@ -71,6 +154,10 @@ "githubSubmit": "GitHub - Submeter um ticket", "discordSubmit": "Discord - Submeter PublicaÃ§ÃŖo de Suporte" }, + "warning": { + "tooltipTitle": "Warning" + }, + "edit": "Edit", "delete": "Eliminar", "username": "Nome de utilizador", "password": "Palavra-passe", @@ -82,6 +169,7 @@ "green": "Verde", "blue": "Azul", "custom": "Personalizar...", + "comingSoon": "Coming soon", "WorkInProgess": "Trabalho em progresso, pode nÃŖo funcionar ou ter erros, Por favor reporte quaisquer problemas!", "poweredBy": "Desenvolvido por", "yes": "Sim", @@ -115,12 +203,14 @@ "page": "PÃĄgina", "pages": "PÃĄginas", "loading": "A carregar...", + "review": "Review", "addToDoc": "Adicionar ao Documento", "reset": "Repor", "apply": "Aplicar", "noFileSelected": "No file selected. Please upload one.", "legal": { "privacy": "Política de Privacidade", + "iAgreeToThe": "I agree to all of the", "terms": "Termos e CondiçÃĩes", "accessibility": "Acessibilidade", "cookie": "Política de Cookies", @@ -160,6 +250,7 @@ "title": "Quer tornar o Stirling PDF melhor?", "paragraph1": "O Stirling PDF tem anÃĄlises opcionais para nos ajudar a melhorar o produto. NÃŖo rastreamos qualquer informaÃ§ÃŖo pessoal ou conteÃēdo de ficheiros.", "paragraph2": "Por favor considere ativar as anÃĄlises para ajudar o Stirling-PDF a crescer e permitir-nos compreender melhor os nossos utilizadores.", + "learnMore": "Learn more", "enable": "Ativar anÃĄlises", "disable": "Desativar anÃĄlises", "settings": "Pode alterar as definiçÃĩes para anÃĄlises no ficheiro config/settings.yml" @@ -203,6 +294,54 @@ "cacheInputs": { "name": "Guardar inputs do formulÃĄrio", "help": "Ativar para guardar inputs previamente usados para futuras utilizaçÃĩes" + }, + "general": { + "title": "General", + "description": "Configure general application preferences.", + "account": "Account", + "accountDescription": "Manage your account settings", + "user": "User", + "signedInAs": "Signed in as", + "logout": "Log out", + "enableFeatures": { + "title": "For System Administrators", + "intro": "Enable user authentication, team management, and workspace features for your organization.", + "action": "Configure", + "and": "and", + "benefit": "Enables user roles, team collaboration, admin controls, and enterprise features.", + "learnMore": "Learn more in documentation", + "dismiss": "Dismiss" + }, + "autoUnzip": "Auto-unzip API responses", + "autoUnzipDescription": "Automatically extract files from ZIP responses", + "autoUnzipTooltip": "Automatically extract ZIP files returned from API operations. Disable to keep ZIP files intact. This does not affect automation workflows.", + "autoUnzipFileLimit": "Auto-unzip file limit", + "autoUnzipFileLimitDescription": "Maximum number of files to extract from ZIP", + "autoUnzipFileLimitTooltip": "Only unzip if the ZIP contains this many files or fewer. Set higher to extract larger ZIPs.", + "defaultToolPickerMode": "Default tool picker mode", + "defaultToolPickerModeDescription": "Choose whether the tool picker opens in fullscreen or sidebar by default", + "mode": { + "fullscreen": "Fullscreen", + "sidebar": "Sidebar" + } + }, + "hotkeys": { + "title": "Keyboard Shortcuts", + "description": "Hover a tool to see its shortcut or customise it below. Click \"Change shortcut\" and press a new key combination. Press Esc to cancel.", + "errorModifier": { + "mac": "Include ⌘ (Command), âŒĨ (Option), or another modifier in your shortcut.", + "windows": "Include Ctrl, Alt, or another modifier in your shortcut." + }, + "errorConflict": "Shortcut already used by {{tool}}.", + "none": "Not assigned", + "customBadge": "Custom", + "defaultLabel": "Default: {{shortcut}}", + "capturing": "Press keysâ€Ļ (Esc to cancel)", + "change": "Change shortcut", + "reset": "Reset", + "shortcut": "Shortcut", + "noShortcut": "No shortcut set", + "searchPlaceholder": "Search tools..." } }, "changeCreds": { @@ -274,8 +413,10 @@ "top20": "Top 20", "all": "All", "refresh": "Refresh", - "includeHomepage": "Include Homepage ('/')", - "includeLoginPage": "Include Login Page ('/login')", + "dataTypeLabel": "Data Type:", + "dataTypeAll": "All", + "dataTypeApi": "API", + "dataTypeUi": "UI", "totalEndpoints": "Total Endpoints", "totalVisits": "Total Visits", "showing": "Showing", @@ -290,7 +431,9 @@ "top": "Top", "numberOfVisits": "Number of Visits", "visitsTooltip": "Visits: {0} ({1}% of total)", - "retry": "Retry" + "retry": "Retry", + "includeHomepage": "Include Homepage ('/')", + "includeLoginPage": "Include Login Page ('/login')" }, "database": { "title": "Importar/Exportar Base de Dados", @@ -331,22 +474,310 @@ "alphabetical": "Alphabetical", "globalPopularity": "Global Popularity", "sortBy": "Sort by:", + "mobile": { + "brandAlt": "Stirling PDF logo", + "openFiles": "Open files", + "swipeHint": "Swipe left or right to switch views", + "tools": "Tools", + "toolsSlide": "Tool selection panel", + "viewSwitcher": "Switch workspace view", + "workbenchSlide": "Workspace panel", + "workspace": "Workspace" + }, "multiTool": { + "tags": "multiple,tools", "title": "Multi Ferramenta PDF", "desc": "Juntar, Rodar, Reorganizar, Dividir e Remover pÃĄginas" }, "merge": { + "tags": "combine,join,unite", "title": "Juntar", "desc": "Junte facilmente vÃĄrios PDFs num sÃŗ." }, "split": { + "tags": "divide,separate,break", "title": "Dividir", "desc": "Dividir PDFs em vÃĄrios documentos" }, "rotate": { + "tags": "turn,flip,orient", "title": "Rodar", "desc": "Rode facilmente os seus PDFs." }, + "convert": { + "tags": "transform,change", + "title": "Converter", + "desc": "Convert files between different formats" + }, + "pdfOrganiser": { + "tags": "organize,rearrange,reorder", + "title": "Organizar", + "desc": "Remover/Reorganizar pÃĄginas em qualquer ordem" + }, + "addImage": { + "tags": "insert,embed,place", + "title": "Adicionar imagem", + "desc": "Adiciona uma imagem numa localizaÃ§ÃŖo definida no PDF" + }, + "addAttachments": { + "tags": "embed,attach,include", + "title": "Add Attachments", + "desc": "Add or remove embedded files (attachments) to/from a PDF" + }, + "watermark": { + "tags": "stamp,mark,overlay", + "title": "Adicionar Marca de Água", + "desc": "Adicionar uma marca de ÃĄgua personalizada ao seu documento PDF." + }, + "removePassword": { + "tags": "unlock", + "title": "Remover Palavra-passe", + "desc": "Remover proteÃ§ÃŖo por palavra-passe do seu documento PDF." + }, + "compress": { + "tags": "shrink,reduce,optimize", + "title": "Comprimir", + "desc": "Comprimir PDFs para reduzir o seu tamanho." + }, + "unlockPDFForms": { + "tags": "unlock,enable,edit", + "title": "Desbloquear FormulÃĄrios do PDF", + "desc": "Remover propriedades de apenas leitura dos formulÃĄrios de um PDF" + }, + "changeMetadata": { + "tags": "edit,modify,update", + "title": "Alterar Metadados", + "desc": "Alterar/Remover/Adicionar metadados de um documento PDF" + }, + "ocr": { + "tags": "extract,scan", + "title": "OCR / Limpeza de digitalizaçÃĩes", + "desc": "Limpa digitalizaçÃĩes e deteta texto de imagens dentro de um PDF e readiciona-o como texto." + }, + "extractImages": { + "tags": "pull,save,export", + "title": "Extrair Imagens", + "desc": "Extrai todas as imagens de um PDF e guarda-as num zip" + }, + "scannerImageSplit": { + "tags": "detect,split,photos", + "title": "Detect & Split Scanned Photos", + "desc": "Detect and split scanned photos into separate pages" + }, + "sign": { + "tags": "signature,autograph", + "title": "Assinar", + "desc": "Adiciona assinatura ao PDF por desenho, texto ou imagem" + }, + "flatten": { + "tags": "simplify,remove,interactive", + "title": "Achatar", + "desc": "Remover todos os elementos interativos e formulÃĄrios de um PDF" + }, + "certSign": { + "tags": "authenticate,PEM,P12,official,encrypt,sign,certificate,PKCS12,JKS,server,manual,auto", + "title": "Assinar com Certificado", + "desc": "Assina um PDF com um Certificado/Chave (PEM/P12)" + }, + "repair": { + "tags": "fix,restore", + "title": "Reparar", + "desc": "Tenta reparar um PDF corrompido/danificado" + }, + "removeBlanks": { + "tags": "delete,clean,empty", + "title": "Remover PÃĄginas em Branco", + "desc": "Deteta e remove pÃĄginas em branco de um documento" + }, + "removeAnnotations": { + "tags": "delete,clean,strip", + "title": "Remover AnotaçÃĩes", + "desc": "Remove todos os comentÃĄrios/anotaçÃĩes de um PDF" + }, + "compare": { + "tags": "difference", + "title": "Comparar", + "desc": "Compara e mostra as diferenças entre 2 Documentos PDF" + }, + "removeCertSign": { + "tags": "remove,delete,unlock", + "title": "Remover Assinatura de Certificado", + "desc": "Remove assinatura de certificado do PDF" + }, + "pageLayout": { + "tags": "layout,arrange,combine", + "title": "Layout Multi-PÃĄgina", + "desc": "Juntar mÃēltiplas pÃĄginas de um documento PDF numa Ãēnica pÃĄgina" + }, + "bookletImposition": { + "tags": "booklet,print,binding", + "title": "Booklet Imposition", + "desc": "Create booklets with proper page ordering and multi-page layout for printing and binding" + }, + "scalePages": { + "tags": "resize,adjust,scale", + "title": "Ajustar tamanho/escala de pÃĄgina", + "desc": "Alterar o tamanho/escala de uma pÃĄgina e/ou os seus conteÃēdos." + }, + "addPageNumbers": { + "tags": "number,pagination,count", + "title": "Adicionar NÃēmeros de PÃĄgina", + "desc": "Adicionar nÃēmeros de pÃĄgina ao longo de um documento numa localizaÃ§ÃŖo definida" + }, + "autoRename": { + "tags": "auto-detect,header-based,organize,relabel", + "title": "Auto Rename PDF File", + "desc": "Auto renames a PDF file based on its detected header" + }, + "adjustContrast": { + "tags": "contrast,brightness,saturation", + "title": "Ajustar Cores/Contraste", + "desc": "Ajustar Contraste, SaturaÃ§ÃŖo e Brilho de um PDF" + }, + "crop": { + "tags": "trim,cut,resize", + "title": "Recortar PDF", + "desc": "Recortar um PDF para reduzir o seu tamanho (mantÊm o texto!)" + }, + "autoSplitPDF": { + "tags": "auto,split,QR", + "title": "DivisÃŖo AutomÃĄtica de PÃĄginas", + "desc": "Dividir automaticamente PDF digitalizado com separador de pÃĄginas físico com CÃŗdigo QR" + }, + "sanitize": { + "tags": "clean,purge,remove", + "title": "Sanitise", + "desc": "Remove potentially harmful elements from PDF files" + }, + "getPdfInfo": { + "tags": "info,metadata,details", + "title": "Obter TODA InformaÃ§ÃŖo sobre PDF", + "desc": "ObtÊm qualquer e toda informaÃ§ÃŖo possível sobre PDFs" + }, + "pdfToSinglePage": { + "tags": "combine,merge,single", + "title": "PÃĄgina Única Grande", + "desc": "Junta todas as pÃĄginas do PDF numa Ãēnica pÃĄgina grande" + }, + "showJS": { + "tags": "javascript,code,script", + "title": "Mostrar Javascript", + "desc": "Procura e mostra qualquer JS injetado num PDF" + }, + "redact": { + "tags": "censor,blackout,hide", + "title": "RedaÃ§ÃŖo Manual", + "desc": "Redacta um PDF baseado em texto selecionado, formas desenhadas e/ou pÃĄgina(s) selecionada(s)" + }, + "splitBySections": { + "tags": "split,sections,divide", + "title": "Split PDF by Sections", + "desc": "Divide each page of a PDF into smaller horizontal and vertical sections" + }, + "addStamp": { + "tags": "stamp,mark,seal", + "title": "Add Stamp to PDF", + "desc": "Add text or add image stamps at set locations" + }, + "removeImage": { + "tags": "remove,delete,clean", + "title": "Remover imagem", + "desc": "Remover imagem do PDF para reduzir tamanho do ficheiro" + }, + "splitByChapters": { + "tags": "split,chapters,structure", + "title": "Dividir PDF por Capítulos", + "desc": "Dividir um PDF em mÃēltiplos ficheiros baseado na sua estrutura de capítulos." + }, + "validateSignature": { + "tags": "validate,verify,certificate", + "title": "Validar Assinatura PDF", + "desc": "Verificar assinaturas digitais e certificados em documentos PDF" + }, + "swagger": { + "tags": "API,documentation,test", + "title": "API Documentation", + "desc": "View API documentation and test endpoints" + }, + "scannerEffect": { + "tags": "scan,simulate,create", + "title": "Scanner Effect", + "desc": "Create a PDF that looks like it was scanned" + }, + "editTableOfContents": { + "tags": "bookmarks,contents,edit", + "title": "Edit Table of Contents", + "desc": "Add or edit bookmarks and table of contents in PDF documents" + }, + "manageCertificates": { + "tags": "certificates,import,export", + "title": "Manage Certificates", + "desc": "Import, export, or delete digital certificate files used for signing PDFs." + }, + "read": { + "tags": "view,open,display", + "title": "Read", + "desc": "View and annotate PDFs. Highlight text, draw, or insert comments for review and collaboration." + }, + "reorganizePages": { + "tags": "rearrange,reorder,organize", + "title": "Reorganize Pages", + "desc": "Rearrange, duplicate, or delete PDF pages with visual drag-and-drop control." + }, + "extractPages": { + "tags": "pull,select,copy", + "title": "Extrair PÃĄginas", + "desc": "Extract specific pages from a PDF document" + }, + "removePages": { + "tags": "delete,extract,exclude", + "title": "Remover", + "desc": "Eliminar pÃĄginas indesejadas do seu documento PDF." + }, + "autoSizeSplitPDF": { + "tags": "auto,split,size", + "title": "DivisÃŖo AutomÃĄtica por Tamanho/Contagem", + "desc": "Dividir um Ãēnico PDF em mÃēltiplos documentos baseado em tamanho, contagem de pÃĄginas, ou contagem de documentos" + }, + "replaceColor": { + "title": "Replace & Invert Colour", + "desc": "Replace or invert colours in PDF documents" + }, + "devApi": { + "tags": "API,development,documentation", + "title": "API", + "desc": "Link to API documentation" + }, + "devFolderScanning": { + "tags": "automation,folder,scanning", + "title": "Automated Folder Scanning", + "desc": "Link to automated folder scanning guide" + }, + "devSsoGuide": { + "title": "SSO Guide", + "desc": "Link to SSO guide" + }, + "devAirgapped": { + "title": "Air-gapped Setup", + "desc": "Link to air-gapped setup guide" + }, + "addPassword": { + "title": "Adicionar Palavra-passe", + "desc": "Encriptar o seu documento PDF com uma palavra-passe." + }, + "changePermissions": { + "title": "Alterar PermissÃĩes", + "desc": "Change document restrictions and permissions" + }, + "automate": { + "tags": "workflow,sequence,automation", + "title": "Automate", + "desc": "Build multi-step workflows by chaining together PDF actions. Ideal for recurring tasks." + }, + "overlay-pdfs": { + "desc": "SobrepÃĩe PDFs em cima de outro PDF", + "title": "Sobrepor PDFs" + }, "imageToPDF": { "title": "Imagem para PDF", "desc": "Converter uma imagem (PNG, JPEG, GIF) para PDF." @@ -355,18 +786,6 @@ "title": "PDF para Imagem", "desc": "Converter um PDF para uma imagem. (PNG, JPEG, GIF)" }, - "pdfOrganiser": { - "title": "Organizar", - "desc": "Remover/Reorganizar pÃĄginas em qualquer ordem" - }, - "addImage": { - "title": "Adicionar imagem", - "desc": "Adiciona uma imagem numa localizaÃ§ÃŖo definida no PDF" - }, - "watermark": { - "title": "Adicionar Marca de Água", - "desc": "Adicionar uma marca de ÃĄgua personalizada ao seu documento PDF." - }, "permissions": { "title": "Alterar PermissÃĩes", "desc": "Alterar as permissÃĩes do seu documento PDF" @@ -375,38 +794,10 @@ "title": "Remover", "desc": "Eliminar pÃĄginas indesejadas do seu documento PDF." }, - "addPassword": { - "title": "Adicionar Palavra-passe", - "desc": "Encriptar o seu documento PDF com uma palavra-passe." - }, - "removePassword": { - "title": "Remover Palavra-passe", - "desc": "Remover proteÃ§ÃŖo por palavra-passe do seu documento PDF." - }, - "compress": { - "title": "Comprimir", - "desc": "Comprimir PDFs para reduzir o seu tamanho." - }, - "unlockPDFForms": { - "title": "Desbloquear FormulÃĄrios do PDF", - "desc": "Remover propriedades de apenas leitura dos formulÃĄrios de um PDF" - }, - "changeMetadata": { - "title": "Alterar Metadados", - "desc": "Alterar/Remover/Adicionar metadados de um documento PDF" - }, "fileToPDF": { "title": "Converter ficheiro para PDF", "desc": "Converter quase qualquer ficheiro para PDF (DOCX, PNG, XLS, PPT, TXT e mais)" }, - "ocr": { - "title": "OCR / Limpeza de digitalizaçÃĩes", - "desc": "Limpa digitalizaçÃĩes e deteta texto de imagens dentro de um PDF e readiciona-o como texto." - }, - "extractImages": { - "title": "Extrair Imagens", - "desc": "Extrai todas as imagens de um PDF e guarda-as num zip" - }, "pdfToPDFA": { "title": "PDF para PDF/A", "desc": "Converter PDF para PDF/A para armazenamento a longo prazo" @@ -435,70 +826,14 @@ "title": "Detetar/Dividir fotos digitalizadas", "desc": "Divide mÃēltiplas fotos de dentro de uma foto/PDF" }, - "sign": { - "title": "Assinar", - "desc": "Adiciona assinatura ao PDF por desenho, texto ou imagem" - }, - "flatten": { - "title": "Achatar", - "desc": "Remover todos os elementos interativos e formulÃĄrios de um PDF" - }, - "repair": { - "title": "Reparar", - "desc": "Tenta reparar um PDF corrompido/danificado" - }, - "removeBlanks": { - "title": "Remover PÃĄginas em Branco", - "desc": "Deteta e remove pÃĄginas em branco de um documento" - }, - "removeAnnotations": { - "title": "Remover AnotaçÃĩes", - "desc": "Remove todos os comentÃĄrios/anotaçÃĩes de um PDF" - }, - "compare": { - "title": "Comparar", - "desc": "Compara e mostra as diferenças entre 2 Documentos PDF" - }, - "certSign": { - "title": "Assinar com Certificado", - "desc": "Assina um PDF com um Certificado/Chave (PEM/P12)" - }, - "removeCertSign": { - "title": "Remover Assinatura de Certificado", - "desc": "Remove assinatura de certificado do PDF" - }, - "pageLayout": { - "title": "Layout Multi-PÃĄgina", - "desc": "Juntar mÃēltiplas pÃĄginas de um documento PDF numa Ãēnica pÃĄgina" - }, - "scalePages": { - "title": "Ajustar tamanho/escala de pÃĄgina", - "desc": "Alterar o tamanho/escala de uma pÃĄgina e/ou os seus conteÃēdos." - }, "pipeline": { "title": "Pipeline", "desc": "Executar mÃēltiplas açÃĩes em PDFs definindo scripts pipeline" }, - "addPageNumbers": { - "title": "Adicionar NÃēmeros de PÃĄgina", - "desc": "Adicionar nÃēmeros de pÃĄgina ao longo de um documento numa localizaÃ§ÃŖo definida" - }, "auto-rename": { "title": "Renomear Automaticamente Ficheiro PDF", "desc": "Renomeia automaticamente um ficheiro PDF baseado no cabeçalho detetado" }, - "adjustContrast": { - "title": "Ajustar Cores/Contraste", - "desc": "Ajustar Contraste, SaturaÃ§ÃŖo e Brilho de um PDF" - }, - "crop": { - "title": "Recortar PDF", - "desc": "Recortar um PDF para reduzir o seu tamanho (mantÊm o texto!)" - }, - "autoSplitPDF": { - "title": "DivisÃŖo AutomÃĄtica de PÃĄginas", - "desc": "Dividir automaticamente PDF digitalizado com separador de pÃĄginas físico com CÃŗdigo QR" - }, "sanitizePDF": { "title": "Sanitizar", "desc": "Remover scripts e outros elementos de ficheiros PDF" @@ -519,30 +854,14 @@ "title": "PDF to Markdown", "desc": "Converts any PDF to Markdown" }, - "getPdfInfo": { - "title": "Obter TODA InformaÃ§ÃŖo sobre PDF", - "desc": "ObtÊm qualquer e toda informaÃ§ÃŖo possível sobre PDFs" - }, "pageExtracter": { "title": "Extrair pÃĄgina(s)", "desc": "Extrai pÃĄginas selecionadas do PDF" }, - "pdfToSinglePage": { - "title": "PÃĄgina Única Grande", - "desc": "Junta todas as pÃĄginas do PDF numa Ãēnica pÃĄgina grande" - }, - "showJS": { - "title": "Mostrar Javascript", - "desc": "Procura e mostra qualquer JS injetado num PDF" - }, "autoRedact": { "title": "RedaÃ§ÃŖo AutomÃĄtica", "desc": "RedaÃ§ÃŖo AutomÃĄtica (Oculta) texto num PDF baseado em texto de entrada" }, - "redact": { - "title": "RedaÃ§ÃŖo Manual", - "desc": "Redacta um PDF baseado em texto selecionado, formas desenhadas e/ou pÃĄgina(s) selecionada(s)" - }, "PDFToCSV": { "title": "PDF para CSV", "desc": "Extrai Tabelas de um PDF convertendo para CSV" @@ -551,10 +870,6 @@ "title": "DivisÃŖo AutomÃĄtica por Tamanho/Contagem", "desc": "Dividir um Ãēnico PDF em mÃēltiplos documentos baseado em tamanho, contagem de pÃĄginas, ou contagem de documentos" }, - "overlay-pdfs": { - "title": "Sobrepor PDFs", - "desc": "SobrepÃĩe PDFs em cima de outro PDF" - }, "split-by-sections": { "title": "Dividir PDF por SecçÃĩes", "desc": "Divide cada pÃĄgina de um PDF em secçÃĩes horizontais e verticais mais pequenas" @@ -563,43 +878,17 @@ "title": "Adicionar Carimbo a PDF", "desc": "Adicionar carimbos de texto ou adicionar carimbos de imagem em localizaçÃĩes definidas" }, - "removeImage": { - "title": "Remover imagem", - "desc": "Remover imagem do PDF para reduzir tamanho do ficheiro" - }, - "splitByChapters": { - "title": "Dividir PDF por Capítulos", - "desc": "Dividir um PDF em mÃēltiplos ficheiros baseado na sua estrutura de capítulos." - }, - "validateSignature": { - "title": "Validar Assinatura PDF", - "desc": "Verificar assinaturas digitais e certificados em documentos PDF" - }, "replace-color": { "title": "Substituir e Inverter Cor", "desc": "Substituir cor para texto e fundo em PDF e inverter cor completa do pdf para reduzir tamanho do ficheiro" }, - "convert": { - "title": "Converter" - }, "attachments": { "title": "Add attachments" }, - "extractPages": { - "title": "Extrair PÃĄginas" - }, - "removePages": { - "title": "Remover", - "desc": "Eliminar pÃĄginas indesejadas do seu documento PDF." - }, "removeImagePdf": { "title": "Remover imagem", "desc": "Remover imagem do PDF para reduzir tamanho do ficheiro" }, - "autoSizeSplitPDF": { - "title": "DivisÃŖo AutomÃĄtica por Tamanho/Contagem", - "desc": "Dividir um Ãēnico PDF em mÃēltiplos documentos baseado em tamanho, contagem de pÃĄginas, ou contagem de documentos" - }, "adjust-contrast": { "title": "Ajustar Cores/Contraste", "desc": "Ajustar Contraste, SaturaÃ§ÃŖo e Brilho de um PDF" @@ -607,11 +896,12 @@ "replaceColorPdf": { "title": "Substituir e Inverter Cor", "desc": "Substituir cor para texto e fundo em PDF e inverter cor completa do pdf para reduzir tamanho do ficheiro" - }, - "changePermissions": { - "title": "Alterar PermissÃĩes" } }, + "landing": { + "addFiles": "Add Files", + "uploadFromComputer": "Upload from computer" + }, "viewPdf": { "tags": "ver,ler,anotar,texto,imagem", "title": "View/Edit PDF", @@ -645,17 +935,39 @@ "merge": { "tags": "juntar,OperaçÃĩes de pÃĄgina,Back end,lado servidor", "title": "Juntar", + "removeDigitalSignature": { + "label": "Remove digital signature in the merged file?", + "tooltip": { + "title": "Remove Digital Signature", + "description": "Digital signatures will be invalidated when merging files. Check this to remove them from the final merged PDF." + } + }, + "generateTableOfContents": { + "label": "Generate table of contents in the merged file?", + "tooltip": { + "title": "Generate Table of Contents", + "description": "Automatically creates a clickable table of contents in the merged PDF based on the original file names and page numbers." + } + }, + "submit": "Juntar", + "sortBy": { + "description": "Files will be merged in the order they're selected. Drag to reorder or sort below.", + "label": "Sort By", + "filename": "Nome do Ficheiro", + "dateModified": "Date Modified", + "ascending": "Ascending", + "descending": "Descending", + "sort": "Sort" + }, + "error": { + "failed": "An error occurred while merging the PDFs." + }, "header": "Juntar mÃēltiplos PDFs (2+)", "sortByName": "Ordenar por nome", "sortByDate": "Ordenar por data", - "removeCertSign": "Remover assinatura digital no ficheiro junto?", - "submit": "Juntar", - "sortBy": { - "filename": "Nome do Ficheiro" - } + "removeCertSign": "Remover assinatura digital no ficheiro junto?" }, "split": { - "tags": "OperaçÃĩes de pÃĄgina,dividir,Multi PÃĄgina,cortar,lado servidor", "title": "Dividir PDF", "header": "Dividir PDF", "desc": { @@ -671,25 +983,249 @@ "splitPages": "Introduza pÃĄginas para dividir:", "submit": "Dividir", "steps": { + "chooseMethod": "Choose Method", "settings": "DefiniçÃĩes" }, + "settings": { + "selectMethodFirst": "Please select a split method first" + }, + "error": { + "failed": "An error occurred while splitting the PDF." + }, + "method": { + "label": "Choose split method", + "placeholder": "Select how to split the PDF" + }, "methods": { + "prefix": { + "splitAt": "Split at", + "splitBy": "Split by" + }, + "byPages": { + "name": "Page Numbers", + "desc": "Extract specific pages (1,3,5-10)", + "tooltip": "Enter page numbers separated by commas or ranges with hyphens" + }, + "bySections": { + "name": "Sections", + "desc": "Divide pages into grid sections", + "tooltip": "Split each page into horizontal and vertical sections" + }, "bySize": { - "name": "Tamanho do Ficheiro" + "name": "Tamanho do Ficheiro", + "desc": "Limit maximum file size", + "tooltip": "Specify maximum file size (e.g. 10MB, 500KB)" + }, + "byPageCount": { + "name": "Page Count", + "desc": "Fixed pages per file", + "tooltip": "Enter the number of pages for each split file" + }, + "byDocCount": { + "name": "Document Count", + "desc": "Create specific number of files", + "tooltip": "Enter how many files you want to create" + }, + "byChapters": { + "name": "Chapters", + "desc": "Split at bookmark boundaries", + "tooltip": "Uses PDF bookmarks to determine split points" + }, + "byPageDivider": { + "name": "Page Divider", + "desc": "Auto-split with divider sheets", + "tooltip": "Use QR code divider sheets between documents when scanning" } }, "value": { "fileSize": { - "label": "Tamanho do Ficheiro" + "label": "Tamanho do Ficheiro", + "placeholder": "e.g. 10MB, 500KB" + }, + "pageCount": { + "label": "Pages per File", + "placeholder": "e.g. 5, 10" + }, + "docCount": { + "label": "Number of Files", + "placeholder": "e.g. 3, 5" } - } + }, + "tooltip": { + "header": { + "title": "Split Methods Overview" + }, + "byPages": { + "title": "Split at Page Numbers", + "text": "Split your PDF at specific page numbers. Using 'n' splits after page n. Using 'n-m' splits before page n and after page m.", + "bullet1": "Single split points: 3,7 (splits after pages 3 and 7)", + "bullet2": "Range split points: 3-8 (splits before page 3 and after page 8)", + "bullet3": "Mixed: 2,5-10,15 (splits after page 2, before page 5, after page 10, and after page 15)" + }, + "bySections": { + "title": "Split by Grid Sections", + "text": "Divide each page into a grid of sections. Useful for splitting documents with multiple columns or extracting specific areas.", + "bullet1": "Horizontal: Number of rows to create", + "bullet2": "Vertical: Number of columns to create", + "bullet3": "Merge: Combine all sections into one PDF" + }, + "bySize": { + "title": "Split by File Size", + "text": "Create multiple PDFs that don't exceed a specified file size. Ideal for file size limitations or email attachments.", + "bullet1": "Use MB for larger files (e.g., 10MB)", + "bullet2": "Use KB for smaller files (e.g., 500KB)", + "bullet3": "System will split at page boundaries" + }, + "byCount": { + "title": "Split by Count", + "text": "Create multiple PDFs with a specific number of pages or documents each.", + "bullet1": "Page Count: Fixed number of pages per file", + "bullet2": "Document Count: Fixed number of output files", + "bullet3": "Useful for batch processing workflows" + }, + "byChapters": { + "title": "Split by Chapters", + "text": "Use PDF bookmarks to automatically split at chapter boundaries. Requires PDFs with bookmark structure.", + "bullet1": "Bookmark Level: Which level to split on (1=top level)", + "bullet2": "Include Metadata: Preserve document properties", + "bullet3": "Allow Duplicates: Handle repeated bookmark names" + }, + "byDocCount": { + "bullet1": "Enter the number of output files you want", + "bullet2": "Pages are distributed as evenly as possible", + "bullet3": "Useful when you need a specific number of files", + "text": "Create a specific number of output files by evenly distributing pages across them.", + "title": "Split by Document Count" + }, + "byPageCount": { + "bullet1": "Enter the number of pages per output file", + "bullet2": "Last file may have fewer pages if not evenly divisible", + "bullet3": "Useful for batch processing workflows", + "text": "Create multiple PDFs with a specific number of pages each. Perfect for creating uniform document chunks.", + "title": "Split by Page Count" + }, + "byPageDivider": { + "bullet1": "Print divider sheets from the download link", + "bullet2": "Insert divider sheets between your documents", + "bullet3": "Scan all documents together as one PDF", + "bullet4": "Upload - divider pages are automatically detected and removed", + "bullet5": "Enable Duplex Mode if scanning both sides of divider sheets", + "text": "Automatically split scanned documents using physical divider sheets with QR codes. Perfect for processing multiple documents scanned together.", + "title": "Split by Page Divider" + } + }, + "methodSelection": { + "tooltip": { + "bullet1": "Click on a method card to select it", + "bullet2": "Hover over each card to see a quick description", + "bullet3": "The settings step will appear after you select a method", + "bullet4": "You can change methods at any time before processing", + "header": { + "text": "Choose how you want to split your PDF document. Each method is optimized for different use cases and document types.", + "title": "Split Method Selection" + }, + "title": "Choose Your Split Method" + } + }, + "selectMethod": "Select a split method", + "tags": "OperaçÃĩes de pÃĄgina,dividir,Multi PÃĄgina,cortar,lado servidor" }, "rotate": { - "tags": "lado servidor", "title": "Rodar PDF", + "submit": "Rodar", + "selectRotation": "Select Rotation Angle (Clockwise)", + "error": { + "failed": "An error occurred while rotating the PDF." + }, + "preview": { + "title": "Rotation Preview" + }, + "rotateLeft": "Rotate Anticlockwise", + "rotateRight": "Rotate Clockwise", + "tooltip": { + "header": { + "title": "Rotate Settings Overview" + }, + "description": { + "text": "Rotate your PDF pages clockwise or anticlockwise in 90-degree increments. All pages in the PDF will be rotated. The preview shows how your document will look after rotation." + }, + "controls": { + "title": "Controls", + "text": "Use the rotation buttons to adjust orientation. Left button rotates anticlockwise, right button rotates clockwise. Each click rotates by 90 degrees." + } + }, + "tags": "lado servidor", "header": "Rodar PDF", - "selectAngle": "Selecione Ãĸngulo de rotaÃ§ÃŖo (em mÃēltiplos de 90 graus):", - "submit": "Rodar" + "selectAngle": "Selecione Ãĸngulo de rotaÃ§ÃŖo (em mÃēltiplos de 90 graus):" + }, + "convert": { + "title": "Converter", + "desc": "Convert files between different formats", + "files": "Files", + "selectFilesPlaceholder": "Select files in the main view to get started", + "settings": "DefiniçÃĩes", + "conversionCompleted": "Conversion completed", + "results": "Results", + "defaultFilename": "converted_file", + "conversionResults": "Conversion Results", + "convertFrom": "Convert from", + "convertTo": "Convert to", + "sourceFormatPlaceholder": "Source format", + "targetFormatPlaceholder": "Target format", + "selectSourceFormatFirst": "Select a source format first", + "outputOptions": "Output Options", + "pdfOptions": "PDF Options", + "imageOptions": "Image Options", + "colorType": "Colour Type", + "color": "Cor", + "greyscale": "Escala de Cinza", + "blackwhite": "Black & White", + "dpi": "DPI", + "output": "Output", + "single": "Single", + "multiple": "Multiple", + "fitOption": "Fit Option", + "maintainAspectRatio": "Maintain Aspect Ratio", + "fitDocumentToPage": "Fit Document to Page", + "fillPage": "Preencher PÃĄgina", + "autoRotate": "Auto Rotate", + "autoRotateDescription": "Automatically rotate images to better fit the PDF page", + "combineImages": "Combine Images", + "combineImagesDescription": "Combine all images into one PDF, or create separate PDFs for each image", + "webOptions": "Web to PDF Options", + "zoomLevel": "Zoom Level", + "emailOptions": "Email to PDF Options", + "includeAttachments": "Include email attachments", + "maxAttachmentSize": "Maximum attachment size (MB)", + "includeAllRecipients": "Include CC and BCC recipients in header", + "downloadHtml": "Download HTML intermediate file instead of PDF", + "pdfaOptions": "PDF/A Options", + "outputFormat": "Output Format", + "pdfaNote": "PDF/A-1b is more compatible, PDF/A-2b supports more features.", + "pdfaDigitalSignatureWarning": "O PDF contÊm uma assinatura digital. Esta serÃĄ removida no prÃŗximo passo.", + "fileFormat": "File Format", + "wordDoc": "Word Document", + "wordDocExt": "Word Document (.docx)", + "odtExt": "OpenDocument Text (.odt)", + "pptExt": "PowerPoint (.pptx)", + "odpExt": "OpenDocument Presentation (.odp)", + "txtExt": "Plain Text (.txt)", + "rtfExt": "Rich Text Format (.rtf)", + "selectedFiles": "Selected files", + "noFileSelected": "No file selected. Use the file panel to add files.", + "convertFiles": "Convert Files", + "converting": "Converting...", + "downloadConverted": "Download Converted File", + "errorNoFiles": "Please select at least one file to convert.", + "errorNoFormat": "Please select both source and target formats.", + "errorNotSupported": "Conversion from {{from}} to {{to}} is not supported.", + "images": "Images", + "officeDocs": "Office Documents (Word, Excel, PowerPoint)", + "imagesExt": "Images (JPG, PNG, etc.)", + "markdown": "Markdown", + "textRtf": "Text/RTF", + "grayscale": "Escala de Cinza", + "errorConversion": "An error occurred while converting the file." }, "imageToPdf": { "tags": "conversÃŖo,img,jpg,imagem,foto" @@ -727,7 +1263,33 @@ "8": "Remover Última", "9": "Remover Primeira e Última", "10": "JunÃ§ÃŖo Par-Ímpar", - "11": "Duplicate all pages" + "11": "Duplicate all pages", + "desc": { + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, â€Ļ).", + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, â€Ļ).", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimized for binding on the side)." + } + }, + "desc": { + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, â€Ļ).", + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, â€Ļ).", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimised for binding on the side).", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document." }, "placeholder": "(ex. 1,3,2 ou 4-8,2,10-12 ou 2n-1)" }, @@ -739,9 +1301,198 @@ "upload": "Adicionar imagem", "submit": "Adicionar imagem" }, + "attachments": { + "tags": "embed,attach,file,attachment,attachments", + "title": "Add attachments", + "header": "Add attachments", + "add": "Add Attachment", + "remove": "Remove Attachment", + "embed": "Embed Attachment", + "submit": "Add attachments" + }, "watermark": { - "tags": "Texto,repetindo,etiqueta,prÃŗprio,copyright,marca registada,img,jpg,imagem,foto", "title": "Adicionar Marca de Água", + "desc": "Add text or image watermarks to PDF files", + "completed": "Watermark added", + "submit": "Adicionar Marca de Água", + "filenamePrefix": "watermarked", + "error": { + "failed": "An error occurred while adding watermark to the PDF." + }, + "watermarkType": { + "text": "Texto", + "image": "Image" + }, + "settings": { + "type": "Watermark Type", + "text": { + "label": "Watermark Text", + "placeholder": "Enter watermark text" + }, + "image": { + "label": "Watermark Image", + "choose": "Choose Image", + "selected": "Selected: {{filename}}" + }, + "fontSize": "Tamanho da Fonte", + "size": "Size", + "alphabet": "Font/Language", + "color": "Watermark Colour", + "rotation": "Rotation (degrees)", + "opacity": "Opacity (%)", + "spacing": { + "horizontal": "Horizontal Spacing", + "vertical": "Vertical Spacing", + "height": "Height Spacing", + "width": "Width Spacing" + }, + "convertToImage": "Flatten PDF pages to images" + }, + "alphabet": { + "roman": "Roman/Latin", + "arabic": "Arabic", + "japanese": "Japanese", + "korean": "Korean", + "chinese": "Chinese", + "thai": "Thai" + }, + "steps": { + "type": "Watermark Type", + "wording": "Wording", + "textStyle": "Style", + "formatting": "Formatting", + "file": "Watermark File" + }, + "results": { + "title": "Watermark Results" + }, + "tooltip": { + "language": { + "title": "Language Support", + "text": "Choose the appropriate language setting to ensure proper font rendering for your text." + }, + "appearance": { + "title": "Appearance Settings", + "text": "Control how your watermark looks and blends with the document.", + "bullet1": "Rotation: -360° to 360° for angled watermarks", + "bullet2": "Opacity: 0-100% for transparency control", + "bullet3": "Lower opacity creates subtle watermarks" + }, + "spacing": { + "title": "Spacing Control", + "text": "Adjust the spacing between repeated watermarks across the page.", + "bullet1": "Width spacing: Horizontal distance between watermarks", + "bullet2": "Height spacing: Vertical distance between watermarks", + "bullet3": "Higher values create more spread out patterns" + }, + "type": { + "header": { + "title": "Watermark Type Selection" + }, + "description": { + "title": "Choose Your Watermark", + "text": "Select between text or image watermarks based on your needs." + }, + "text": { + "title": "Text Watermarks", + "text": "Perfect for adding copyright notices, company names, or confidentiality labels. Supports multiple languages and custom colours.", + "bullet1": "Customisable fonts and languages", + "bullet2": "Adjustable colours and transparency", + "bullet3": "Ideal for legal or branding text" + }, + "image": { + "title": "Image Watermarks", + "text": "Use logos, stamps, or any image as a watermark. Great for branding and visual identification.", + "bullet1": "Upload any image format", + "bullet2": "Maintains image quality", + "bullet3": "Perfect for logos and stamps" + } + }, + "wording": { + "header": { + "title": "Text Content" + }, + "text": { + "title": "Watermark Text", + "text": "Enter the text that will appear as your watermark across the document.", + "bullet1": "Keep it concise for better readability", + "bullet2": "Common examples: 'CONFIDENTIAL', 'DRAFT', company name", + "bullet3": "Emoji characters are not supported and will be filtered out" + } + }, + "textStyle": { + "header": { + "title": "Text Style" + }, + "color": { + "title": "Colour Selection", + "text": "Choose a colour that provides good contrast with your document content.", + "bullet1": "Light grey (#d3d3d3) for subtle watermarks", + "bullet2": "Black or dark colours for high contrast", + "bullet3": "Custom colours for branding purposes" + }, + "language": { + "title": "Language Support", + "text": "Choose the appropriate language setting to ensure proper font rendering." + } + }, + "file": { + "header": { + "title": "Image Upload" + }, + "upload": { + "title": "Image Selection", + "text": "Upload an image file to use as your watermark.", + "bullet1": "Supports common formats: PNG, JPG, GIF, BMP", + "bullet2": "PNG with transparency works best", + "bullet3": "Higher resolution images maintain quality better" + }, + "recommendations": { + "title": "Best Practices", + "text": "Tips for optimal image watermark results.", + "bullet1": "Use logos or stamps with transparent backgrounds", + "bullet2": "Simple designs work better than complex images", + "bullet3": "Consider the final document size when choosing resolution" + } + }, + "formatting": { + "header": { + "title": "Formatting & Layout" + }, + "size": { + "title": "Size Control", + "text": "Adjust the size of your watermark (text or image).", + "bullet1": "Larger sizes create more prominent watermarks" + }, + "appearance": { + "title": "Appearance Settings", + "text": "Control how your watermark looks and blends with the document.", + "bullet1": "Rotation: -360° to 360° for angled watermarks", + "bullet2": "Opacity: 0-100% for transparency control", + "bullet3": "Lower opacity creates subtle watermarks" + }, + "spacing": { + "title": "Spacing Control", + "text": "Adjust the spacing between repeated watermarks across the page.", + "bullet1": "Horizontal spacing: Distance between watermarks left to right", + "bullet2": "Vertical spacing: Distance between watermarks top to bottom", + "bullet3": "Higher values create more spread out patterns" + }, + "security": { + "title": "Security Option", + "text": "Convert the final PDF to an image-based format for enhanced security.", + "bullet1": "Prevents text selection and copying", + "bullet2": "Makes watermarks harder to remove", + "bullet3": "Results in larger file sizes", + "bullet4": "Best for sensitive or copyrighted content" + } + } + }, + "type": { + "1": "Texto", + "2": "Imagem" + }, + "tags": "Texto,repetindo,etiqueta,prÃŗprio,copyright,marca registada,img,jpg,imagem,foto", "header": "Adicionar Marca de Água", "customColor": "Cor de Texto Personalizada", "selectText": { @@ -755,17 +1506,6 @@ "8": "Tipo de Marca de Água:", "9": "Imagem da Marca de Água:", "10": "Converter PDF para PDF-Imagem" - }, - "submit": "Adicionar Marca de Água", - "type": { - "1": "Texto", - "2": "Imagem" - }, - "watermarkType": { - "text": "Texto" - }, - "settings": { - "fontSize": "Tamanho da Fonte" } }, "permissions": { @@ -790,50 +1530,201 @@ "removePages": { "tags": "Remover pÃĄginas,eliminar pÃĄginas", "title": "Remover", + "pageNumbers": { + "label": "Pages to Remove", + "placeholder": "e.g., 1,3,5-8,10", + "error": "Invalid page number format. Use numbers, ranges (1-5), or mathematical expressions (2n+1)" + }, + "filenamePrefix": "pages_removed", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "settings": { + "title": "Settings" + }, + "tooltip": { + "header": { + "title": "Remove Pages Settings" + }, + "pageNumbers": { + "title": "Page Selection", + "text": "Specify which pages to remove from your PDF. You can select individual pages, ranges, or use mathematical expressions.", + "bullet1": "Individual pages: 1,3,5 (removes pages 1, 3, and 5)", + "bullet2": "Page ranges: 1-5,10-15 (removes pages 1-5 and 10-15)", + "bullet3": "Mathematical: 2n+1 (removes odd pages)", + "bullet4": "Open ranges: 5- (removes from page 5 to end)" + }, + "examples": { + "title": "Common Examples", + "text": "Here are some common page selection patterns:", + "bullet1": "Remove first page: 1", + "bullet2": "Remove last 3 pages: -3", + "bullet3": "Remove every other page: 2n", + "bullet4": "Remove specific scattered pages: 1,5,10,15" + }, + "safety": { + "title": "Safety Tips", + "text": "Important considerations when removing pages:", + "bullet1": "Always preview your selection before processing", + "bullet2": "Keep a backup of your original file", + "bullet3": "Page numbers start from 1, not 0", + "bullet4": "Invalid page numbers will be ignored" + } + }, + "error": { + "failed": "An error occurred whilst removing pages." + }, + "results": { + "title": "Page Removal Results" + }, "submit": "Remover" }, - "addPassword": { - "tags": "seguro,segurança", - "title": "Adicionar Palavra-passe", - "header": "Adicionar palavra-passe (Encriptar)", - "selectText": { - "1": "Selecione PDF para encriptar", - "2": "Palavra-passe de Utilizador", - "3": "Comprimento da Chave de EncriptaÃ§ÃŖo", - "4": "Valores mais altos sÃŖo mais fortes, mas valores mais baixos tÃĒm melhor compatibilidade.", - "5": "PermissÃĩes a definir (Recomendado usar junto com palavra-passe de ProprietÃĄrio)", - "6": "Impedir montagem do documento", - "7": "Impedir extraÃ§ÃŖo de conteÃēdo", - "8": "Impedir extraÃ§ÃŖo para acessibilidade", - "9": "Impedir preenchimento de formulÃĄrio", - "10": "Impedir modificaÃ§ÃŖo", - "11": "Impedir modificaÃ§ÃŖo de anotaÃ§ÃŖo", - "12": "Impedir impressÃŖo", - "13": "Impedir impressÃŖo em diferentes formatos", - "14": "Palavra-passe de ProprietÃĄrio", - "15": "Restringe o que pode ser feito com o documento uma vez aberto (NÃŖo suportado por todos os leitores)", - "16": "Restringe a abertura do prÃŗprio documento" + "extractPages": { + "title": "Extract Pages", + "pageNumbers": { + "label": "Pages to Extract", + "placeholder": "e.g., 1,3,5-8 or odd & 1-10" + }, + "settings": { + "title": "Settings" }, - "submit": "Encriptar", "tooltip": { - "permissions": { - "title": "Alterar PermissÃĩes" + "description": "Extracts the selected pages into a new PDF, preserving order." + }, + "error": { + "failed": "Failed to extract pages" + }, + "results": { + "title": "Pages Extracted" + }, + "submit": "Extract Pages" + }, + "pageSelection": { + "tooltip": { + "header": { + "title": "Page Selection Guide" + }, + "basic": { + "title": "Basic Usage", + "text": "Select specific pages from your PDF document using simple syntax.", + "bullet1": "Individual pages: 1,3,5", + "bullet2": "Page ranges: 3-6 or 10-15", + "bullet3": "All pages: all" + }, + "advanced": { + "title": "Advanced Features" + }, + "tips": { + "title": "Tips", + "text": "Keep these guidelines in mind:", + "bullet1": "Page numbers start from 1 (not 0)", + "bullet2": "Spaces are automatically removed", + "bullet3": "Invalid expressions are ignored" + }, + "syntax": { + "title": "Syntax Basics", + "text": "Use numbers, ranges, keywords, and progressions (n starts at 0). Parentheses are supported.", + "bullets": { + "numbers": "Numbers/ranges: 5, 10-20", + "keywords": "Keywords: odd, even", + "progressions": "Progressions: 3n, 4n+1" + } + }, + "operators": { + "title": "Operators", + "text": "AND has higher precedence than comma. NOT applies within the document range.", + "and": "AND: & or \"and\" — require both conditions (e.g., 1-50 & even)", + "comma": "Comma: , or | — combine selections (e.g., 1-10, 20)", + "not": "NOT: ! or \"not\" — exclude pages (e.g., 3n & not 30)" + }, + "examples": { + "title": "Examples" + }, + "complex": { + "bullet1": "1,3-5,8,2n → pages 1, 3–5, 8, plus evens", + "bullet2": "10-,2n-1 → from page 10 to end + odd pages", + "description": "Mix different types.", + "title": "Complex Combinations" + }, + "description": "Choose which pages to use for the operation. Supports single pages, ranges, formulas, and the all keyword.", + "individual": { + "bullet1": "1,3,5 → selects pages 1, 3, 5", + "bullet2": "2,7,12 → selects pages 2, 7, 12", + "description": "Enter numbers separated by commas.", + "title": "Individual Pages" + }, + "mathematical": { + "bullet1": "2n → all even pages (2, 4, 6â€Ļ)", + "bullet2": "2n-1 → all odd pages (1, 3, 5â€Ļ)", + "bullet3": "3n → every 3rd page (3, 6, 9â€Ļ)", + "bullet4": "4n-1 → pages 3, 7, 11, 15â€Ļ", + "description": "Use n in formulas for patterns.", + "title": "Mathematical Functions" + }, + "ranges": { + "bullet1": "3-6 → selects pages 3–6", + "bullet2": "10-15 → selects pages 10–15", + "bullet3": "5- → selects pages 5 to end", + "description": "Use - for consecutive pages.", + "title": "Page Ranges" + }, + "special": { + "bullet1": "all → selects all pages", + "title": "Special Keywords" } } }, - "removePassword": { - "tags": "seguro,Desencriptar,segurança,sem palavra-passe,eliminar palavra-passe", - "title": "Remover palavra-passe", - "header": "Remover palavra-passe (Desencriptar)", - "selectText": { - "1": "Selecione PDF para Desencriptar", - "2": "Palavra-passe" + "bulkSelection": { + "syntaxError": "There is a syntax issue. See Page Selection tips for help.", + "header": { + "title": "Page Selection Guide" }, - "submit": "Remover", - "desc": "Remover proteÃ§ÃŖo por palavra-passe do seu documento PDF.", - "password": { - "stepTitle": "Remover Palavra-passe", - "label": "Palavra-passe Atual" + "syntax": { + "title": "Syntax Basics", + "text": "Use numbers, ranges, keywords, and progressions (n starts at 0). Parentheses are supported.", + "bullets": { + "numbers": "Numbers/ranges: 5, 10-20", + "keywords": "Keywords: odd, even", + "progressions": "Progressions: 3n, 4n+1" + } + }, + "operators": { + "title": "Operators", + "text": "AND has higher precedence than comma. NOT applies within the document range.", + "and": "AND: & or \"and\" — require both conditions (e.g., 1-50 & even)", + "comma": "Comma: , or | — combine selections (e.g., 1-10, 20)", + "not": "NOT: ! or \"not\" — exclude pages (e.g., 3n & not 30)" + }, + "examples": { + "title": "Examples", + "first50": "First 50", + "last50": "Last 50", + "every3rd": "Every 3rd", + "oddWithinExcluding": "Odd within 1-20 excluding 5-7", + "combineSets": "Combine sets" + }, + "firstNPages": { + "title": "First N Pages", + "placeholder": "Number of pages" + }, + "lastNPages": { + "title": "Last N Pages", + "placeholder": "Number of pages" + }, + "everyNthPage": { + "title": "Every Nth Page", + "placeholder": "Step size" + }, + "range": { + "title": "Range", + "fromPlaceholder": "From", + "toPlaceholder": "To" + }, + "keywords": { + "title": "Keywords" + }, + "advanced": { + "title": "Advanced" } }, "compressPdfs": { @@ -843,12 +1734,142 @@ "tags": "remover,apagar,formulÃĄrio,campo,apenas leitura", "title": "Desbloquear FormulÃĄrios do PDF", "header": "Desbloquear FormulÃĄrios do PDF", - "submit": "Remover" + "submit": "Remover", + "description": "This tool will remove read-only restrictions from PDF form fields, making them editable and fillable.", + "filenamePrefix": "unlocked_forms", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst unlocking PDF forms." + }, + "results": { + "title": "Unlocked Forms Results" + } }, "changeMetadata": { - "tags": "Título,autor,data,criaÃ§ÃŖo,tempo,editor,produtor,estatísticas", - "title": "Título:", "header": "Alterar Metadados", + "submit": "Alterar", + "filenamePrefix": "metadata", + "settings": { + "title": "Metadata Settings" + }, + "standardFields": { + "title": "Standard Fields" + }, + "deleteAll": { + "label": "Remove Existing Metadata", + "checkbox": "Delete all metadata" + }, + "title": { + "label": "Title", + "placeholder": "Document title" + }, + "author": { + "label": "Author", + "placeholder": "Document author" + }, + "subject": { + "label": "Subject", + "placeholder": "Document subject" + }, + "keywords": { + "label": "Keywords", + "placeholder": "Document keywords" + }, + "creator": { + "label": "Creator", + "placeholder": "Document creator" + }, + "producer": { + "label": "Producer", + "placeholder": "Document producer" + }, + "dates": { + "title": "Date Fields" + }, + "creationDate": { + "label": "Creation Date", + "placeholder": "Creation date" + }, + "modificationDate": { + "label": "Modification Date", + "placeholder": "Modification date" + }, + "trapped": { + "label": "Trapped Status", + "unknown": "Unknown", + "true": "True", + "false": "False" + }, + "advanced": { + "title": "Advanced Options" + }, + "customFields": { + "title": "Custom Metadata", + "description": "Add custom metadata fields to the document", + "add": "Add Field", + "key": "Key", + "keyPlaceholder": "Custom key", + "value": "Value", + "valuePlaceholder": "Custom value", + "remove": "Remove" + }, + "results": { + "title": "Updated PDFs" + }, + "error": { + "failed": "An error occurred while changing the PDF metadata." + }, + "tooltip": { + "header": { + "title": "PDF Metadata Overview" + }, + "standardFields": { + "title": "Standard Fields", + "text": "Common PDF metadata fields that describe the document.", + "bullet1": "Title: Document name or heading", + "bullet2": "Author: Person who created the document", + "bullet3": "Subject: Brief description of content", + "bullet4": "Keywords: Search terms for the document", + "bullet5": "Creator/Producer: Software used to create the PDF" + }, + "dates": { + "title": "Date Fields", + "text": "When the document was created and modified.", + "bullet1": "Creation Date: When original document was made", + "bullet2": "Modification Date: When last changed" + }, + "options": { + "title": "Additional Options", + "text": "Custom fields and privacy controls.", + "bullet1": "Custom Metadata: Add your own key-value pairs", + "bullet2": "Trapped Status: High-quality printing setting", + "bullet3": "Delete All: Remove all metadata for privacy" + }, + "deleteAll": { + "title": "Remove Existing Metadata", + "text": "Complete metadata deletion to ensure privacy." + }, + "customFields": { + "title": "Custom Metadata", + "text": "Add your own custom key-value metadata pairs.", + "bullet1": "Add any custom fields relevant to your document", + "bullet2": "Examples: Department, Project, Version, Status", + "bullet3": "Both key and value are required for each entry" + }, + "advanced": { + "title": "Advanced Options", + "trapped": { + "title": "Trapped Status", + "description": "Indicates if document is prepared for high-quality printing.", + "bullet1": "True: Document has been trapped for printing", + "bullet2": "False: Document has not been trapped", + "bullet3": "Unknown: Trapped status is not specified" + } + } + }, + "tags": "Título,autor,data,criaÃ§ÃŖo,tempo,editor,produtor,estatísticas", "selectText": { "1": "Por favor edite as variÃĄveis que deseja alterar", "2": "Eliminar todos os metadados", @@ -856,15 +1877,7 @@ "4": "Outros Metadados:", "5": "Adicionar Entrada de Metadados Personalizada" }, - "author": "Autor:", - "creationDate": "Data de CriaÃ§ÃŖo (aaaa/MM/dd HH:mm:ss):", - "creator": "Criador:", - "keywords": "Palavras-chave:", - "modDate": "Data de ModificaÃ§ÃŖo (aaaa/MM/dd HH:mm:ss):", - "producer": "Produtor:", - "subject": "Assunto:", - "trapped": "Capturado:", - "submit": "Alterar" + "modDate": "Data de ModificaÃ§ÃŖo (aaaa/MM/dd HH:mm:ss):" }, "fileToPDF": { "tags": "transformaÃ§ÃŖo,formato,documento,imagem,slide,texto,conversÃŖo,escritÃŗrio,docs,word,excel,powerpoint", @@ -878,6 +1891,7 @@ "ocr": { "tags": "reconhecimento,texto,imagem,digitalizaÃ§ÃŖo,ler,identificar,deteÃ§ÃŖo,editÃĄvel", "title": "OCR / Limpeza de digitalizaçÃĩes", + "desc": "Limpa digitalizaçÃĩes e deteta texto de imagens dentro de um PDF e readiciona-o como texto.", "header": "Limpeza de DigitalizaçÃĩes / OCR (Reconhecimento Ótico de Caracteres)", "selectText": { "1": "Selecione idiomas que devem ser detetados dentro do PDF (Os listados sÃŖo os atualmente detetados):", @@ -896,23 +1910,89 @@ "help": "Por favor leia esta documentaÃ§ÃŖo sobre como usar isto para outros idiomas e/ou usar fora do docker", "credit": "Este serviço usa qpdf e Tesseract para OCR.", "submit": "Processar PDF com OCR", - "desc": "Limpa digitalizaçÃĩes e deteta texto de imagens dentro de um PDF e readiciona-o como texto.", + "operation": { + "submit": "Process OCR and Review" + }, + "results": { + "title": "OCR Results" + }, + "languagePicker": { + "additionalLanguages": "Looking for additional languages?", + "viewSetupGuide": "View setup guide →" + }, "settings": { "title": "DefiniçÃĩes", "ocrMode": { - "label": "Modo OCR" + "label": "Modo OCR", + "auto": "Auto (skip text layers)", + "force": "Force (re-OCR all, replace text)", + "strict": "Strict (abort if text found)" }, "languages": { - "label": "Idiomas" + "label": "Idiomas", + "placeholder": "Select languages" + }, + "compatibilityMode": { + "label": "Compatibility Mode" + }, + "advancedOptions": { + "label": "Processing Options", + "sidecar": "Create a text file", + "deskew": "Deskew pages", + "clean": "Clean input file", + "cleanFinal": "Clean final output" } }, "tooltip": { + "header": { + "title": "OCR Settings Overview" + }, "mode": { - "title": "Modo OCR" + "title": "Modo OCR", + "text": "Optical Character Recognition (OCR) helps you turn scanned or screenshotted pages into text you can search, copy, or highlight.", + "bullet1": "Auto skips pages that already contain text layers.", + "bullet2": "Force re-OCRs every page and replaces all the text.", + "bullet3": "Strict halts if any selectable text is found." }, "languages": { - "title": "Idiomas" + "title": "Idiomas", + "text": "Improve OCR accuracy by specifying the expected languages. Choose one or more languages to guide detection." + }, + "output": { + "title": "Output", + "text": "Decide how you want the text output formatted:", + "bullet1": "Searchable PDF embeds text behind the original image.", + "bullet2": "HOCR XML returns a structured machine-readable file.", + "bullet3": "Plain-text sidecar creates a separate .txt file with raw content." + }, + "advanced": { + "header": { + "title": "Advanced OCR Processing" + }, + "compatibility": { + "title": "Compatibility Mode", + "text": "Uses OCR 'sandwich PDF' mode: results in larger files, but more reliable with certain languages and older PDF software. By default we use hOCR for smaller, modern PDFs." + }, + "sidecar": { + "title": "Create Text File", + "text": "Generates a separate .txt file alongside the PDF containing all extracted text content for easy access and processing." + }, + "deskew": { + "title": "Deskew Pages", + "text": "Automatically corrects skewed or tilted pages to improve OCR accuracy. Useful for scanned documents that weren't perfectly aligned." + }, + "clean": { + "title": "Clean Input File", + "text": "Preprocesses the input by removing noise, enhancing contrast, and optimising the image for better OCR recognition before processing." + }, + "cleanFinal": { + "title": "Clean Final Output", + "text": "Post-processes the final PDF by removing OCR artefacts and optimising the text layer for better readability and smaller file size." + } } + }, + "error": { + "failed": "OCR operation failed" } }, "extractImages": { @@ -921,7 +2001,13 @@ "header": "Extrair Imagens", "selectText": "Selecione formato de imagem para converter imagens extraídas", "allowDuplicates": "Guardar imagens duplicadas", - "submit": "Extrair" + "submit": "Extrair", + "settings": { + "title": "Settings" + }, + "error": { + "failed": "An error occurred while extracting images from the PDF." + } }, "pdfToPDFA": { "tags": "arquivo,longo prazo,padrÃŖo,conversÃŖo,armazenamento,preservaÃ§ÃŖo", @@ -993,17 +2079,53 @@ }, "info": "Python nÃŖo estÃĄ instalado. É necessÃĄrio para executar." }, + "scannerImageSplit": { + "title": "Extracted Images", + "submit": "Extract Image Scans", + "error": { + "failed": "An error occurred while extracting image scans." + }, + "tooltip": { + "title": "Photo Splitter", + "whatThisDoes": "What this does", + "whatThisDoesDesc": "Automatically finds and extracts each photo from a scanned page or composite image—no manual cropping.", + "whenToUse": "When to use", + "useCase1": "Scan whole album pages in one go", + "useCase2": "Split flatbed batches into separate files", + "useCase3": "Break collages into individual photos", + "useCase4": "Pull photos from documents", + "quickFixes": "Quick fixes", + "problem1": "Photos not detected → increase Tolerance to 30-50", + "problem2": "Too many false detections → increase Minimum Area to 15,000-20,000", + "problem3": "Crops are too tight → increase Border Size to 5-10", + "problem4": "Tilted photos not straightened → lower Angle Threshold to ~5°", + "problem5": "Dust/noise boxes → increase Minimum Contour Area to 1000-2000", + "setupTips": "Setup tips", + "tip1": "Use a plain, light background", + "tip2": "Leave a small gap (≈1 cm) between photos", + "tip3": "Scan at 300-600 DPI", + "tip4": "Clean the scanner glass", + "headsUp": "Heads-up", + "headsUpDesc": "Overlapping photos or backgrounds very close in colour to the photos can reduce accuracy-try a lighter or darker background and leave more space." + } + }, "sign": { - "tags": "autorizar,iniciais,assinatura-desenhada,assinatura-texto,assinatura-imagem", "title": "Assinar", "header": "Assinar PDFs", "upload": "Carregar Imagem", - "draw": "Desenhar Assinatura", - "text": "Entrada de Texto", + "draw": { + "title": "Draw your signature", + "clear": "Clear" + }, + "text": { + "name": "Signer Name", + "placeholder": "Enter your full name" + }, "clear": "Limpar", "add": "Adicionar", "saved": "Assinaturas Guardadas", "save": "Guardar Assinatura", + "applySignatures": "Apply Signatures", "personalSigs": "Assinaturas Pessoais", "sharedSigs": "Assinaturas Partilhadas", "noSavedSigs": "Nenhuma assinatura guardada encontrada", @@ -1015,42 +2137,179 @@ "previous": "PÃĄgina anterior", "maintainRatio": "Alternar manter proporÃ§ÃŖo", "undo": "Undo", - "redo": "Redo" + "redo": "Redo", + "submit": "Sign Document", + "steps": { + "configure": "Configure Signature" + }, + "type": { + "title": "Signature Type", + "draw": "Draw", + "canvas": "Canvas", + "image": "Image", + "text": "Text" + }, + "image": { + "label": "Upload signature image", + "placeholder": "Select image file", + "hint": "Upload a PNG or JPG image of your signature" + }, + "instructions": { + "title": "How to add signature", + "canvas": "After drawing your signature in the canvas, close the modal then click anywhere on the PDF to place it.", + "image": "After uploading your signature image above, click anywhere on the PDF to place it.", + "text": "After entering your name above, click anywhere on the PDF to place your signature." + }, + "mode": { + "move": "Move Signature", + "place": "Place Signature" + }, + "updateAndPlace": "Update and Place", + "activate": "Activate Signature Placement", + "deactivate": "Stop Placing Signatures", + "results": { + "title": "Signature Results" + }, + "error": { + "failed": "An error occurred while signing the PDF." + }, + "tags": "autorizar,iniciais,assinatura-desenhada,assinatura-texto,assinatura-imagem" }, "flatten": { - "tags": "estÃĄtico,desativar,nÃŖo-interativo,otimizar", "title": "Achatar", "header": "Achatar PDFs", "flattenOnlyForms": "Achatar apenas formulÃĄrios", "submit": "Achatar", + "filenamePrefix": "flattened", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, "steps": { "settings": "DefiniçÃĩes" }, "options": { - "flattenOnlyForms": "Achatar apenas formulÃĄrios" - } + "stepTitle": "Flatten Options", + "title": "Flatten Options", + "flattenOnlyForms": { + "label": "Achatar apenas formulÃĄrios", + "desc": "Only flatten form fields, leaving other interactive elements intact" + }, + "note": "Flattening removes interactive elements from the PDF, making them non-editable." + }, + "results": { + "title": "Flatten Results" + }, + "error": { + "failed": "An error occurred while flattening the PDF." + }, + "tooltip": { + "header": { + "title": "About Flattening PDFs" + }, + "description": { + "title": "What does flattening do?", + "text": "Flattening makes your PDF non-editable by turning fillable forms and buttons into regular text and images. The PDF will look exactly the same, but no one can change or fill in the forms anymore. Perfect for sharing completed forms, creating final documents for records, or ensuring the PDF looks the same everywhere.", + "bullet1": "Text boxes become regular text (can't be edited)", + "bullet2": "Checkboxes and buttons become pictures", + "bullet3": "Great for final versions you don't want changed", + "bullet4": "Ensures consistent appearance across all devices" + }, + "formsOnly": { + "title": "What does 'Flatten only forms' mean?", + "text": "This option only removes the ability to fill in forms, but keeps other features working like clicking links, viewing bookmarks, and reading comments.", + "bullet1": "Forms become non-editable", + "bullet2": "Links still work when clicked", + "bullet3": "Comments and notes remain visible", + "bullet4": "Bookmarks still help you navigate" + } + }, + "tags": "estÃĄtico,desativar,nÃŖo-interativo,otimizar" }, "repair": { "tags": "corrigir,restaurar,correÃ§ÃŖo,recuperar", "title": "Reparar", "header": "Reparar PDFs", - "submit": "Reparar" + "submit": "Reparar", + "description": "This tool will attempt to repair corrupted or damaged PDF files. No additional settings are required.", + "filenamePrefix": "repaired", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst repairing the PDF." + }, + "results": { + "title": "Repair Results" + } }, "removeBlanks": { - "tags": "limpeza,otimizar,sem-conteÃēdo,organizar", "title": "Remover PÃĄginas em Branco", "header": "Remover PÃĄginas em Branco", - "threshold": "Limiar de Brancura de Pixel:", + "settings": { + "title": "Settings" + }, + "threshold": { + "label": "Pixel Whiteness Threshold" + }, + "whitePercent": { + "label": "White Percentage Threshold", + "unit": "%" + }, + "includeBlankPages": { + "label": "Include detected blank pages" + }, + "tooltip": { + "header": { + "title": "Remove Blank Pages Settings" + }, + "threshold": { + "title": "Pixel Whiteness Threshold", + "text": "Controls how white a pixel must be to be considered 'white'. This helps determine what counts as a blank area on the page.", + "bullet1": "0 = Pure black (most restrictive)", + "bullet2": "128 = Medium grey", + "bullet3": "255 = Pure white (least restrictive)" + }, + "whitePercent": { + "title": "White Percentage Threshold", + "text": "Sets the minimum percentage of white pixels required for a page to be considered blank and removed.", + "bullet1": "Lower values (e.g., 80%) = More pages removed", + "bullet2": "Higher values (e.g., 95%) = Only very blank pages removed", + "bullet3": "Use higher values for documents with light backgrounds" + }, + "includeBlankPages": { + "title": "Include Detected Blank Pages", + "text": "When enabled, creates a separate PDF containing all the blank pages that were detected and removed from the original document.", + "bullet1": "Useful for reviewing what was removed", + "bullet2": "Helps verify the detection accuracy", + "bullet3": "Can be disabled to reduce output file size" + } + }, + "submit": "Remover PÃĄginas em Branco", + "error": { + "failed": "Failed to remove blank pages" + }, + "results": { + "title": "Removed Blank Pages" + }, + "tags": "limpeza,otimizar,sem-conteÃēdo,organizar", "thresholdDesc": "Limiar para determinar quÃŖo branco um pixel branco deve ser para ser classificado como 'Branco'. 0 = Preto, 255 branco puro.", - "whitePercent": "Percentagem de Branco (%):", - "whitePercentDesc": "Percentagem da pÃĄgina que deve ser pixels 'brancos' para ser removida", - "submit": "Remover PÃĄginas em Branco" + "whitePercentDesc": "Percentagem da pÃĄgina que deve ser pixels 'brancos' para ser removida" }, "removeAnnotations": { "tags": "comentÃĄrios,destaque,notas,marcaÃ§ÃŖo,remover", "title": "Remover AnotaçÃĩes", "header": "Remover AnotaçÃĩes", - "submit": "Remover" + "submit": "Remover", + "settings": { + "title": "Settings" + }, + "info": { + "title": "About Remove Annotations", + "description": "This tool will remove all annotations (comments, highlights, notes, etc.) from your PDF documents." + }, + "error": { + "failed": "An error occurred while removing annotations from the PDF." + } }, "compare": { "tags": "diferenciar,contrastar,alteraçÃĩes,anÃĄlise", @@ -1082,6 +2341,142 @@ "certSign": { "tags": "autenticar,PEM,P12,oficial,encriptar", "title": "Assinatura de Certificado", + "filenamePrefix": "signed", + "signMode": { + "stepTitle": "Sign Mode", + "tooltip": { + "header": { + "title": "About PDF Signatures" + }, + "overview": { + "title": "How signatures work", + "text": "Both modes seal the document (any edits are flagged as tampering) and record who/when/how for auditing. Viewer trust depends on the certificate chain." + }, + "manual": { + "title": "Manual - Bring your certificate", + "text": "Use your own certificate files for brand-aligned identity. Can display Trusted when your CA/chain is recognised.", + "use": "Use for: customer-facing, legal, compliance." + }, + "auto": { + "title": "Auto - Zero-setup, instant system seal", + "text": "Signs with a server self-signed certificate. Same tamper-evident seal and audit trail; typically shows Unverified in viewers.", + "use": "Use when: you need speed and consistent internal identity across reviews and records." + }, + "rule": { + "title": "Rule of thumb", + "text": "Need recipient Trusted status? Manual. Need a fast, tamper-evident seal and audit trail with no setup? Auto." + } + } + }, + "certTypeStep": { + "stepTitle": "Certificate Format" + }, + "certFiles": { + "stepTitle": "Certificate Files" + }, + "appearance": { + "stepTitle": "Signature Appearance", + "tooltip": { + "header": { + "title": "About Signature Appearance" + }, + "invisible": { + "title": "Invisible Signatures", + "text": "The signature is added to the PDF for security but won't be visible when viewing the document. Perfect for legal requirements without changing the document's appearance.", + "bullet1": "Provides security without visual changes", + "bullet2": "Meets legal requirements for digital signing", + "bullet3": "Doesn't affect document layout or design" + }, + "visible": { + "title": "Visible Signatures", + "text": "Shows a signature block on the PDF with your name, date, and optional details. Useful when you want readers to clearly see the document is signed.", + "bullet1": "Shows signer name and date on the document", + "bullet2": "Can include reason and location for signing", + "bullet3": "Choose which page to place the signature", + "bullet4": "Optional logo can be included" + } + }, + "invisible": "Invisible", + "options": { + "title": "Signature Details" + }, + "visible": "Visible" + }, + "sign": { + "submit": "Sign PDF", + "results": "Signed PDF" + }, + "error": { + "failed": "An error occurred whilst processing signatures." + }, + "tooltip": { + "header": { + "title": "About Managing Signatures" + }, + "overview": { + "title": "What can this tool do?", + "text": "This tool lets you check if your PDFs are digitally signed and add new digital signatures. Digital signatures prove who created or approved a document and show if it has been changed since signing.", + "bullet1": "Check existing signatures and their validity", + "bullet2": "View detailed information about signers and certificates", + "bullet3": "Add new digital signatures to secure your documents", + "bullet4": "Multiple files supported with easy navigation" + }, + "validation": { + "title": "Checking Signatures", + "text": "When you check signatures, the tool tells you if they're valid, who signed the document, when it was signed, and whether the document has been changed since signing.", + "bullet1": "Shows if signatures are valid or invalid", + "bullet2": "Displays signer information and signing date", + "bullet3": "Checks if the document was modified after signing", + "bullet4": "Can use custom certificates for verification" + }, + "signing": { + "title": "Adding Signatures", + "text": "To sign a PDF, you need a digital certificate (like PEM, PKCS12, or JKS). You can choose to make the signature visible on the document or keep it invisible for security only.", + "bullet1": "Supports PEM, PKCS12, JKS, and server certificate formats", + "bullet2": "Option to show or hide signature on the PDF", + "bullet3": "Add reason, location, and signer name", + "bullet4": "Choose which page to place visible signatures", + "bullet5": "Use server certificate for simple 'Sign with Stirling-PDF' option" + } + }, + "certType": { + "tooltip": { + "header": { + "title": "About Certificate Types" + }, + "what": { + "title": "What's a certificate?", + "text": "It's a secure ID for your signature that proves you signed. Unless you're required to sign via certificate, we recommend using another secure method like Type, Draw, or Upload." + }, + "which": { + "title": "Which option should I use?", + "text": "Choose the format that matches your certificate file:", + "bullet1": "PKCS#12 (.p12 / .pfx) – one combined file (most common)", + "bullet2": "PFX (.pfx) – Microsoft's version of PKCS12", + "bullet3": "PEM – separate private-key and certificate .pem files", + "bullet4": "JKS – Java .jks keystore for dev / CI-CD workflows" + }, + "convert": { + "title": "Key not listed?", + "text": "Convert your file to a Java keystore (.jks) with keytool, then pick JKS." + } + } + }, + "chooseCertificate": "Choose Certificate File", + "chooseJksFile": "Choose JKS File", + "chooseP12File": "Choose PKCS12 File", + "choosePfxFile": "Choose PFX File", + "choosePrivateKey": "Choose Private Key File", + "location": "LocalizaÃ§ÃŖo", + "logoTitle": "Logo", + "name": "Nome", + "noLogo": "No Logo", + "pageNumber": "Page Number", + "password": "Introduza a Sua Palavra-passe de Keystore ou Chave Privada (Se Existir):", + "passwordOptional": "Leave empty if no password", + "reason": "RazÃŖo", + "serverCertMessage": "Using server certificate - no files or password required", + "showLogo": "Mostrar Logo", "header": "Assinar um PDF com o seu certificado (Trabalho em progresso)", "selectPDF": "Selecione um Ficheiro PDF para Assinar:", "jksNote": "Nota: Se o seu tipo de certificado nÃŖo estiver listado abaixo, por favor converta-o para um ficheiro Java Keystore (.jks) usando a ferramenta de linha de comando keytool. Depois, escolha a opÃ§ÃŖo de ficheiro .jks abaixo.", @@ -1089,13 +2484,7 @@ "selectCert": "Selecione o Seu Ficheiro de Certificado (formato X.509, pode ser .pem ou .der):", "selectP12": "Selecione o Seu Ficheiro Keystore PKCS#12 (.p12 ou .pfx) (Opcional, Se fornecido, deve conter a sua chave privada e certificado):", "selectJKS": "Selecione o Seu Ficheiro Java Keystore (.jks ou .keystore):", - "certType": "Tipo de Certificado", - "password": "Introduza a Sua Palavra-passe de Keystore ou Chave Privada (Se Existir):", "showSig": "Mostrar Assinatura", - "reason": "RazÃŖo", - "location": "LocalizaÃ§ÃŖo", - "name": "Nome", - "showLogo": "Mostrar Logo", "submit": "Assinar PDF" }, "removeCertSign": { @@ -1103,7 +2492,18 @@ "title": "Remover Assinatura de Certificado", "header": "Remover o certificado digital do PDF", "selectPDF": "Selecione um ficheiro PDF:", - "submit": "Remover Assinatura" + "submit": "Remover Assinatura", + "description": "This tool will remove digital certificate signatures from your PDF document.", + "filenamePrefix": "unsigned", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst removing certificate signatures." + }, + "results": { + "title": "Certificate Removal Results" + } }, "pageLayout": { "tags": "juntar,composto,vista-Ãēnica,organizar", @@ -1111,16 +2511,157 @@ "header": "Layout Multi-PÃĄgina", "pagesPerSheet": "PÃĄginas por folha:", "addBorder": "Adicionar Bordas", - "submit": "Submeter" + "submit": "Submeter", + "desc": { + "2": "Place 2 pages side-by-side on a single sheet.", + "3": "Place 3 pages on a single sheet in a single row.", + "4": "Place 4 pages on a single sheet (2 × 2 grid).", + "9": "Place 9 pages on a single sheet (3 × 3 grid).", + "16": "Place 16 pages on a single sheet (4 × 4 grid)." + }, + "error": { + "failed": "An error occurred while creating the multi-page layout." + } + }, + "bookletImposition": { + "tags": "booklet,imposition,printing,binding,folding,signature", + "title": "Booklet Imposition", + "header": "Booklet Imposition", + "submit": "Create Booklet", + "spineLocation": { + "label": "Spine Location", + "left": "Left (Standard)", + "right": "Right (RTL)" + }, + "doubleSided": { + "label": "Double-sided printing", + "tooltip": "Creates both front and back sides for proper booklet printing" + }, + "manualDuplex": { + "title": "Manual Duplex Mode", + "instructions": "For printers without automatic duplex. You'll need to run this twice:" + }, + "duplexPass": { + "label": "Print Pass", + "first": "1st Pass", + "second": "2nd Pass", + "firstInstructions": "Prints front sides → stack face-down → run again with 2nd Pass", + "secondInstructions": "Load printed stack face-down → prints back sides" + }, + "rtlBinding": { + "label": "Right-to-left binding", + "tooltip": "For Arabic, Hebrew, or other right-to-left languages" + }, + "addBorder": { + "label": "Add borders around pages", + "tooltip": "Adds borders around each page section to help with cutting and alignment" + }, + "addGutter": { + "label": "Add gutter margin", + "tooltip": "Adds inner margin space for binding" + }, + "gutterSize": { + "label": "Gutter size (points)" + }, + "flipOnShortEdge": { + "label": "Flip on short edge (automatic duplex only)", + "tooltip": "Enable for short-edge duplex printing (automatic duplex only - ignored in manual mode)", + "manualNote": "Not needed in manual mode - you flip the stack yourself" + }, + "advanced": { + "toggle": "Advanced Options" + }, + "paperSizeNote": "Paper size is automatically derived from your first page.", + "tooltip": { + "header": { + "title": "Booklet Creation Guide" + }, + "description": { + "title": "What is Booklet Imposition?", + "text": "Creates professional booklets by arranging pages in the correct printing order. Your PDF pages are placed 2-up on landscape sheets so when folded and bound, they read in proper sequence like a real book." + }, + "example": { + "title": "Example: 8-Page Booklet", + "text": "Your 8-page document becomes 2 sheets:", + "bullet1": "Sheet 1 Front: Pages 8, 1 | Back: Pages 2, 7", + "bullet2": "Sheet 2 Front: Pages 6, 3 | Back: Pages 4, 5", + "bullet3": "When folded & stacked: Reads 1→2→3→4→5→6→7→8" + }, + "printing": { + "title": "How to Print & Assemble", + "text": "Follow these steps for perfect booklets:", + "bullet1": "Print double-sided with 'Flip on long edge'", + "bullet2": "Stack sheets in order, fold in half", + "bullet3": "Staple or bind along the folded spine", + "bullet4": "For short-edge printers: Enable 'Flip on short edge' option" + }, + "manualDuplex": { + "title": "Manual Duplex (Single-sided Printers)", + "text": "For printers without automatic duplex:", + "bullet1": "Turn OFF 'Double-sided printing'", + "bullet2": "Select '1st Pass' → Print → Stack face-down", + "bullet3": "Select '2nd Pass' → Load stack → Print backs", + "bullet4": "Fold and assemble as normal" + }, + "advanced": { + "title": "Advanced Options", + "text": "Fine-tune your booklet:", + "bullet1": "Right-to-Left Binding: For Arabic, Hebrew, or RTL languages", + "bullet2": "Borders: Shows cut lines for trimming", + "bullet3": "Gutter Margin: Adds space for binding/stapling", + "bullet4": "Short-edge Flip: Only for automatic duplex printers" + } + }, + "error": { + "failed": "An error occurred while creating the booklet imposition." + } }, "scalePages": { - "tags": "redimensionar,modificar,dimensÃŖo,adaptar", "title": "Ajustar escala de pÃĄgina", "header": "Ajustar escala de pÃĄgina", "pageSize": "Tamanho de uma pÃĄgina do documento.", "keepPageSize": "Tamanho Original", "scaleFactor": "Nível de zoom (recorte) de uma pÃĄgina.", - "submit": "Submeter" + "submit": "Submeter", + "tags": "redimensionar,modificar,dimensÃŖo,adaptar" + }, + "adjustPageScale": { + "tags": "resize,modify,dimension,adapt", + "title": "Adjust Page Scale", + "header": "Adjust Page Scale", + "scaleFactor": { + "label": "Scale Factor" + }, + "pageSize": { + "label": "Target Page Size", + "keep": "Keep Original Size", + "letter": "Letter", + "legal": "Legal" + }, + "submit": "Adjust Page Scale", + "error": { + "failed": "An error occurred while adjusting the page scale." + }, + "tooltip": { + "header": { + "title": "Page Scale Settings Overview" + }, + "description": { + "title": "Description", + "text": "Adjust the size of PDF content and change the page dimensions." + }, + "scaleFactor": { + "title": "Scale Factor", + "text": "Controls how large or small the content appears on the page. Content is scaled and centred - if scaled content is larger than the page size, it may be cropped.", + "bullet1": "1.0 = Original size", + "bullet2": "0.5 = Half size (50% smaller)", + "bullet3": "2.0 = Double size (200% larger, may crop)" + }, + "pageSize": { + "title": "Target Page Size", + "text": "Sets the dimensions of the output PDF pages. 'Keep Original Size' maintains current dimensions, whilst other options resize to standard paper sizes." + } + } }, "add-page-numbers": { "tags": "paginar,etiqueta,organizar,índice" @@ -1129,16 +2670,83 @@ "tags": "auto-deteÃ§ÃŖo,baseado-cabeçalho,organizar,reetiquetar", "title": "Renomear AutomÃĄtico", "header": "Renomear PDF Automaticamente", - "submit": "Renomear AutomÃĄtico" + "description": "Automatically finds the title from your PDF content and uses it as the filename.", + "submit": "Renomear AutomÃĄtico", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst auto-renaming the PDF." + }, + "results": { + "title": "Auto-Rename Results" + }, + "tooltip": { + "header": { + "title": "How Auto-Rename Works" + }, + "howItWorks": { + "title": "Smart Renaming", + "text": "Automatically finds the title from your PDF content and uses it as the filename.", + "bullet1": "Looks for text that appears to be a title or heading", + "bullet2": "Creates a clean, valid filename from the detected title", + "bullet3": "Keeps the original name if no suitable title is found" + } + } }, "adjust-contrast": { "tags": "correÃ§ÃŖo-cor,afinar,modificar,melhorar" }, "crop": { - "tags": "aparar,encolher,editar,forma", "title": "Recortar", "header": "Recortar PDF", - "submit": "Submeter" + "submit": "Submeter", + "noFileSelected": "Select a PDF file to begin cropping", + "preview": { + "title": "Crop Area Selection" + }, + "reset": "Reset to full PDF", + "coordinates": { + "title": "Position and Size", + "x": { + "label": "X Position", + "desc": "Left edge (points)" + }, + "y": { + "label": "Y Position", + "desc": "Bottom edge (points)" + }, + "width": { + "label": "Width", + "desc": "Crop width (points)" + }, + "height": { + "label": "Height", + "desc": "Crop height (points)" + } + }, + "error": { + "invalidArea": "Crop area extends beyond PDF boundaries", + "failed": "Failed to crop PDF" + }, + "steps": { + "selectArea": "Select Crop Area" + }, + "tooltip": { + "title": "How to Crop PDFs", + "description": "Select the area to crop from your PDF by dragging and resizing the blue overlay on the thumbnail.", + "drag": "Drag the overlay to move the crop area", + "resize": "Drag the corner and edge handles to resize", + "precision": "Use coordinate inputs for precise positioning" + }, + "results": { + "title": "Crop Results" + }, + "automation": { + "info": "Enter crop coordinates in PDF points. Origin (0,0) is at bottom-left. These values will be applied to all PDFs processed in this automation.", + "reference": "Reference: A4 page is 595.28 × 841.89 points (210mm × 297mm). 1 inch = 72 points." + }, + "tags": "aparar,encolher,editar,forma" }, "autoSplitPDF": { "tags": "baseado-QR,separar,segmento-digitalizaÃ§ÃŖo,organizar", @@ -1221,24 +2829,124 @@ "downloadJS": "Transferir Javascript", "submit": "Mostrar" }, - "autoRedact": { - "tags": "RedaÃ§ÃŖo,Ocultar,ocultar,preto,marcador,oculto", - "title": "RedaÃ§ÃŖo AutomÃĄtica", - "header": "RedaÃ§ÃŖo AutomÃĄtica", - "colorLabel": "Cor", - "textsToRedactLabel": "Texto a redactar (separado por linhas)", - "textsToRedactPlaceholder": "ex. \\nConfidencial \\nTop-Secret", - "useRegexLabel": "Usar Regex", - "wholeWordSearchLabel": "Pesquisa de Palavra Completa", - "customPaddingLabel": "Preenchimento Extra Personalizado", - "convertPDFToImageLabel": "Converter PDF para PDF-Imagem (Usado para remover texto por trÃĄs da caixa)", - "submitButton": "Submeter" - }, "redact": { "tags": "RedaÃ§ÃŖo,Ocultar,ocultar,preto,marcador,oculto,manual", "title": "RedaÃ§ÃŖo Manual", - "header": "RedaÃ§ÃŖo Manual", "submit": "Redactar", + "error": { + "failed": "An error occurred while redacting the PDF." + }, + "modeSelector": { + "title": "Redaction Method", + "mode": "Mode", + "automatic": "Automatic", + "automaticDesc": "Redact text based on search terms", + "manual": "Manual", + "manualDesc": "Click and drag to redact specific areas", + "manualComingSoon": "Manual redaction coming soon" + }, + "auto": { + "header": "Auto Redact", + "settings": { + "title": "Redaction Settings", + "advancedTitle": "Avançado" + }, + "colorLabel": "Box Colour", + "wordsToRedact": { + "title": "Words to Redact", + "placeholder": "Enter a word", + "add": "Adicionar", + "examples": "Examples: Confidential, Top-Secret" + }, + "useRegexLabel": "Use Regex", + "wholeWordSearchLabel": "Whole Word Search", + "customPaddingLabel": "Custom Extra Padding", + "convertPDFToImageLabel": "Convert PDF to PDF-Image" + }, + "tooltip": { + "mode": { + "header": { + "title": "Redaction Method" + }, + "automatic": { + "title": "Automatic Redaction", + "text": "Automatically finds and redacts specified text throughout the document. Perfect for removing consistent sensitive information like names, addresses, or confidential markers." + }, + "manual": { + "title": "Manual Redaction", + "text": "Click and drag to manually select specific areas to redact. Gives you precise control over what gets redacted. (Coming soon)" + } + }, + "words": { + "header": { + "title": "Words to Redact" + }, + "description": { + "title": "Text Matching", + "text": "Enter words or phrases to find and redact in your document. Each word will be searched for separately." + }, + "bullet1": "Add one word at a time", + "bullet2": "Press Enter or click 'Add Another' to add", + "bullet3": "Click × to remove words", + "examples": { + "title": "Common Examples", + "text": "Typical words to redact include: bank details, email addresses, or specific names." + } + }, + "advanced": { + "header": { + "title": "Advanced Redaction Settings" + }, + "color": { + "title": "Box Colour & Padding", + "text": "Customise the appearance of redaction boxes. Black is standard, but you can choose any colour. Padding adds extra space around the found text." + }, + "regex": { + "title": "Use Regex", + "text": "Enable regular expressions for advanced pattern matching. Useful for finding phone numbers, emails, or complex patterns.", + "bullet1": "Example: \\d{4}-\\d{2}-\\d{2} to match any dates in YYYY-MM-DD format", + "bullet2": "Use with caution - test thoroughly" + }, + "wholeWord": { + "title": "Whole Word Search", + "text": "Only match complete words, not partial matches. 'John' won't match 'Johnson' when enabled." + }, + "convert": { + "title": "Convert to PDF-Image", + "text": "Converts the PDF to an image-based PDF after redaction. This ensures text behind redaction boxes is completely removed and unrecoverable." + } + } + }, + "manual": { + "header": "Manual Redaction", + "textBasedRedaction": "Text-based Redaction", + "pageBasedRedaction": "Page-based Redaction", + "convertPDFToImageLabel": "Convert PDF to PDF-Image (Used to remove text behind the box)", + "pageRedactionNumbers": { + "title": "PÃĄginas", + "placeholder": "(ex. 1,2,8 ou 4,7,12-16 ou 2n-1)" + }, + "redactionColor": { + "title": "Redaction Colour" + }, + "export": "Exportar", + "upload": "Upload", + "boxRedaction": "Box draw redaction", + "zoom": "Zoom", + "zoomIn": "Zoom in", + "zoomOut": "Zoom out", + "nextPage": "Next Page", + "previousPage": "Previous Page", + "toggleSidebar": "Toggle Sidebar", + "showThumbnails": "Show Thumbnails", + "showDocumentOutline": "Show Document Outline (double-click to expand/collapse all items)", + "showAttachments": "Show Attachments", + "showLayers": "Show Layers (double-click to reset all layers to the default state)", + "colourPicker": "Colour Picker", + "findCurrentOutlineItem": "Find current outline item", + "applyChanges": "Apply Changes" + }, + "header": "RedaÃ§ÃŖo Manual", "textBasedRedaction": "RedaÃ§ÃŖo baseada em Texto", "pageBasedRedaction": "RedaÃ§ÃŖo baseada em PÃĄgina", "convertPDFToImageLabel": "Converter PDF para PDF-Imagem (Usado para remover texto por trÃĄs da caixa)", @@ -1264,22 +2972,7 @@ "showLayers": "Mostrar Camadas (duplo clique para repor todas as camadas para o estado predefinido)", "colourPicker": "Seletor de Cor", "findCurrentOutlineItem": "Encontrar item atual do esquema", - "applyChanges": "Apply Changes", - "auto": { - "settings": { - "advancedTitle": "Avançado" - }, - "wordsToRedact": { - "add": "Adicionar" - } - }, - "manual": { - "pageRedactionNumbers": { - "title": "PÃĄginas", - "placeholder": "(ex. 1,2,8 ou 4,7,12-16 ou 2n-1)" - }, - "export": "Exportar" - } + "applyChanges": "Apply Changes" }, "tableExtraxt": { "tags": "CSV,ExtraÃ§ÃŖo de Tabela,extrair,converter" @@ -1290,11 +2983,15 @@ "overlay-pdfs": { "tags": "Sobrepor", "header": "Sobrepor Ficheiros PDF", + "title": "Overlay PDFs", + "desc": "Overlay one PDF on top of another", "baseFile": { "label": "Selecione Ficheiro PDF Base" }, "overlayFiles": { - "label": "Selecione Ficheiros PDF de SobreposiÃ§ÃŖo" + "label": "Selecione Ficheiros PDF de SobreposiÃ§ÃŖo", + "placeholder": "Choose PDF(s)...", + "addMore": "Add more PDFs..." }, "mode": { "label": "Selecione Modo de SobreposiÃ§ÃŖo", @@ -1304,14 +3001,53 @@ }, "counts": { "label": "Contagens de SobreposiÃ§ÃŖo (para Modo de RepetiÃ§ÃŖo Fixa)", - "placeholder": "Introduza contagens separadas por vírgulas (ex., 2,3,1)" + "placeholder": "Introduza contagens separadas por vírgulas (ex., 2,3,1)", + "item": "Count for file", + "noFiles": "Add overlay files to configure counts" }, "position": { "label": "Selecione PosiÃ§ÃŖo de SobreposiÃ§ÃŖo", "foreground": "Primeiro Plano", "background": "Plano de Fundo" }, - "submit": "Submeter" + "submit": "Submeter", + "settings": { + "title": "Settings" + }, + "results": { + "title": "Overlay Results" + }, + "tooltip": { + "header": { + "title": "Overlay PDFs Overview" + }, + "description": { + "title": "Description", + "text": "Combine a base PDF with one or more overlay PDFs. Overlays can be applied page-by-page in different modes and placed in the foreground or background." + }, + "mode": { + "title": "Overlay Mode", + "text": "Choose how to distribute overlay pages across the base PDF pages.", + "sequential": "Sequential Overlay: Use pages from the first overlay PDF until it ends, then move to the next.", + "interleaved": "Interleaved Overlay: Take one page from each overlay in turn.", + "fixedRepeat": "Fixed Repeat Overlay: Take a set number of pages from each overlay before moving to the next. Use Counts to set the numbers." + }, + "position": { + "title": "Overlay Position", + "text": "Foreground places the overlay on top of the page. Background places it behind." + }, + "overlayFiles": { + "title": "Overlay Files", + "text": "Select one or more PDFs to overlay on the base. The order of these files affects how pages are applied in Sequential and Fixed Repeat modes." + }, + "counts": { + "title": "Counts (Fixed Repeat only)", + "text": "Provide a positive number for each overlay file showing how many pages to take before moving to the next. Required when mode is Fixed Repeat." + } + }, + "error": { + "failed": "An error occurred while overlaying PDFs." + } }, "split-by-sections": { "tags": "Dividir SecÃ§ÃŖo, Dividir, Personalizar", @@ -1332,6 +3068,7 @@ "tags": "Carimbo, Adicionar imagem, imagem central, Marca de ÃĄgua, PDF, Incorporar, Personalizar", "header": "Carimbar PDF", "title": "Carimbar PDF", + "stampSetup": "Stamp Setup", "stampType": "Tipo de Carimbo", "stampText": "Texto do Carimbo", "stampImage": "Imagem do Carimbo", @@ -1344,7 +3081,19 @@ "overrideY": "Sobrepor Coordenada Y", "customMargin": "Margem Personalizada", "customColor": "Cor de Texto Personalizada", - "submit": "Submeter" + "submit": "Submeter", + "noStampSelected": "No stamp selected. Return to Step 1.", + "customPosition": "Drag the stamp to the desired location in the preview window.", + "error": { + "failed": "An error occurred while adding stamp to the PDF." + }, + "imageSize": "Image Size", + "margin": "Margin", + "positionAndFormatting": "Position & Formatting", + "quickPosition": "Select a position on the page to place the stamp.", + "results": { + "title": "Stamp Results" + } }, "removeImagePdf": { "tags": "Remover Imagem,operaçÃĩes de pÃĄgina,lado servidor" @@ -1362,7 +3111,8 @@ "status": { "_value": "Estado", "valid": "VÃĄlida", - "invalid": "InvÃĄlida" + "invalid": "InvÃĄlida", + "complete": "Validation complete" }, "signer": "Assinante", "date": "Data", @@ -1389,40 +3139,122 @@ "version": "VersÃŖo", "keyUsage": "UtilizaÃ§ÃŖo da Chave", "selfSigned": "Auto-Assinado", - "bits": "bits" + "bits": "bits", + "details": "Certificate Details" }, "signature": { "info": "InformaÃ§ÃŖo da Assinatura", "_value": "Assinatura", "mathValid": "A assinatura Ê matematicamente vÃĄlida MAS:" }, - "selectCustomCert": "Ficheiro de Certificado Personalizado X.509 (Opcional)" - }, - "replace-color": { - "title": "Substituir-Inverter-Cor", - "header": "Substituir-Inverter Cor PDF", - "selectText": { - "1": "OpçÃĩes de Substituir ou Inverter cor", - "2": "PredefiniÃ§ÃŖo(Cores de alto contraste predefinidas)", - "3": "Personalizado(Cores personalizadas)", - "4": "InversÃŖo Total(Inverter todas as cores)", - "5": "OpçÃĩes de cor de alto contraste", - "6": "texto branco em fundo preto", - "7": "Texto preto em fundo branco", - "8": "Texto amarelo em fundo preto", - "9": "Texto verde em fundo preto", - "10": "Escolher cor do texto", - "11": "Escolher cor do fundo" + "selectCustomCert": "Ficheiro de Certificado Personalizado X.509 (Opcional)", + "downloadCsv": "Download CSV", + "downloadJson": "Download JSON", + "downloadPdf": "Download PDF Report", + "downloadType": { + "csv": "CSV", + "json": "JSON", + "pdf": "PDF" }, - "submit": "Substituir" + "error": { + "allFailed": "Unable to validate the selected files.", + "partial": "Some files could not be validated.", + "reportGeneration": "Could not generate the PDF report. JSON and CSV are available.", + "unexpected": "Unexpected error during validation." + }, + "finalizing": "Preparing downloads...", + "issue": { + "certExpired": "Certificate expired", + "certRevocationUnknown": "Certificate revocation status unknown", + "certRevoked": "Certificate revoked", + "chainInvalid": "Certificate chain invalid", + "signatureInvalid": "Signature cryptographic check failed", + "trustInvalid": "Certificate not trusted" + }, + "noResults": "Run the validation to generate a report.", + "noSignaturesShort": "No signatures", + "processing": "Validating signatures...", + "report": { + "continued": "Continued", + "downloads": "Downloads", + "entryLabel": "Signature Summary", + "fields": { + "created": "Created", + "fileSize": "File Size", + "signatureCount": "Total Signatures", + "signatureDate": "Signature Date" + }, + "filesEvaluated": "{{count}} files evaluated", + "footer": "Validated via Stirling PDF", + "generatedAt": "Generated", + "noPdf": "PDF report will be available after a successful validation.", + "page": "Page", + "shortTitle": "Signature Summary", + "signatureCountLabel": "{{count}} signatures", + "signaturesFound": "{{count}} signatures detected", + "signaturesValid": "{{count}} fully valid", + "title": "Signature Validation Report" + }, + "settings": { + "certHint": "Upload a trusted X.509 certificate to validate against a custom trust source.", + "title": "Validation Settings" + }, + "signatureDate": "Signature Date", + "totalSignatures": "Total Signatures" }, - "replaceColorPdf": { - "tags": "Substituir Cor,operaçÃĩes de pÃĄgina,Back end,lado servidor" + "replaceColor": { + "tags": "Replace Colour,Page operations,Back end,server side", + "labels": { + "settings": "Settings", + "colourOperation": "Colour operation" + }, + "options": { + "highContrast": "High contrast", + "invertAll": "Invert all colours", + "custom": "Custom", + "cmyk": "Convert to CMYK" + }, + "tooltip": { + "header": { + "title": "Replace & Invert Colour Settings Overview" + }, + "description": { + "title": "Description", + "text": "Transform PDF colours to improve readability and accessibility. Choose from high contrast presets, invert all colours, or create custom colour schemes." + }, + "highContrast": { + "title": "High Contrast", + "text": "Apply predefined high contrast colour combinations designed for better readability and accessibility compliance.", + "bullet1": "White text on black background - Classic dark mode", + "bullet2": "Black text on white background - Standard high contrast", + "bullet3": "Yellow text on black background - High visibility option", + "bullet4": "Green text on black background - Alternative high contrast" + }, + "invertAll": { + "title": "Invert All Colours", + "text": "Completely invert all colours in the PDF, creating a negative-like effect. Useful for creating dark mode versions of documents or reducing eye strain in low-light conditions." + }, + "custom": { + "title": "Custom Colours", + "text": "Define your own text and background colours using the colour pickers. Perfect for creating branded documents or specific accessibility requirements.", + "bullet1": "Text colour - Choose the colour for text elements", + "bullet2": "Background colour - Set the background colour for the document" + }, + "cmyk": { + "title": "Convert to CMYK", + "text": "Convert the PDF from RGB colour space to CMYK colour space, optimized for professional printing. This process converts colours to the Cyan, Magenta, Yellow, Black model used by printers." + } + }, + "error": { + "failed": "An error occurred while processing the colour replacement." + } }, "login": { "title": "Iniciar sessÃŖo", "header": "Iniciar sessÃŖo", "signin": "Iniciar sessÃŖo", + "signInWith": "Sign in with", + "signInAnonymously": "Sign Up as a Guest", "rememberme": "Lembrar-me", "invalid": "Nome de utilizador ou palavra-passe invÃĄlidos.", "locked": "A sua conta foi bloqueada.", @@ -1441,12 +3273,83 @@ "alreadyLoggedIn": "JÃĄ tem sessÃŖo iniciada em", "alreadyLoggedIn2": "dispositivos. Por favor termine sessÃŖo nesses dispositivos e tente novamente.", "toManySessions": "Tem demasiadas sessÃĩes ativas", - "logoutMessage": "You have been logged out." + "logoutMessage": "You have been logged out.", + "youAreLoggedIn": "You are logged in!", + "email": "Email", + "password": "Password", + "enterEmail": "Enter your email", + "enterPassword": "Enter your password", + "loggingIn": "Logging In...", + "username": "Username", + "enterUsername": "Enter username", + "useEmailInstead": "Login with email", + "forgotPassword": "Forgot your password?", + "logIn": "Log In", + "signingIn": "Signing in...", + "login": "Login", + "or": "Or", + "useMagicLink": "Use magic link instead", + "enterEmailForMagicLink": "Enter your email for magic link", + "sending": "Sendingâ€Ļ", + "sendMagicLink": "Send Magic Link", + "cancel": "Cancel", + "dontHaveAccount": "Don't have an account? Sign up", + "home": "Home", + "debug": "Debug", + "signOut": "Sign Out", + "pleaseEnterBoth": "Please enter both email and password", + "pleaseEnterEmail": "Please enter your email address", + "magicLinkSent": "Magic link sent to {{email}}! Check your email and click the link to sign in.", + "passwordResetSent": "Password reset link sent to {{email}}! Check your email and follow the instructions.", + "failedToSignIn": "Failed to sign in with {{provider}}: {{message}}", + "unexpectedError": "Unexpected error: {{message}}", + "accountCreatedSuccess": "Account created successfully! You can now sign in.", + "passwordChangedSuccess": "Password changed successfully! Please sign in with your new password.", + "credentialsUpdated": "Your credentials have been updated. Please sign in again." + }, + "signup": { + "title": "Create an account", + "subtitle": "Join Stirling PDF to get started", + "name": "Name", + "email": "Email", + "password": "Password", + "confirmPassword": "Confirm password", + "enterName": "Enter your name", + "enterEmail": "Enter your email", + "enterPassword": "Enter your password", + "confirmPasswordPlaceholder": "Confirm password", + "or": "or", + "creatingAccount": "Creating Account...", + "signUp": "Sign Up", + "alreadyHaveAccount": "Already have an account? Sign in", + "pleaseFillAllFields": "Please fill in all fields", + "passwordsDoNotMatch": "Passwords do not match", + "passwordTooShort": "Password must be at least 6 characters long", + "invalidEmail": "Please enter a valid email address", + "checkEmailConfirmation": "Check your email for a confirmation link to complete your registration.", + "accountCreatedSuccessfully": "Account created successfully! You can now sign in.", + "unexpectedError": "Unexpected error: {{message}}", + "useEmailInstead": "Use Email Instead", + "nameRequired": "Name is required", + "emailRequired": "Email is required", + "passwordRequired": "Password is required", + "confirmPasswordRequired": "Please confirm your password" }, "pdfToSinglePage": { "title": "PDF Para PÃĄgina Única", "header": "PDF Para PÃĄgina Única", - "submit": "Converter Para PÃĄgina Única" + "submit": "Converter Para PÃĄgina Única", + "description": "This tool will merge all pages of your PDF into one large single page. The width will remain the same as the original pages, but the height will be the sum of all page heights.", + "filenamePrefix": "single_page", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst converting to single page." + }, + "results": { + "title": "Single Page Results" + } }, "pageExtracter": { "title": "Extrair PÃĄginas", @@ -1470,18 +3373,59 @@ "adjustContrast": { "title": "Ajustar Contraste", "header": "Ajustar Contraste", + "basic": "Basic Adjustments", "contrast": "Contraste:", "brightness": "Brilho:", "saturation": "SaturaÃ§ÃŖo:", - "download": "Transferir" + "download": "Transferir", + "adjustColors": "Adjust Colors", + "blue": "Blue", + "confirm": "Confirm", + "error": { + "failed": "Failed to adjust colors/contrast" + }, + "green": "Green", + "noPreview": "Select a PDF to preview", + "red": "Red", + "results": { + "title": "Adjusted PDF" + } }, "compress": { "title": "Comprimir", + "desc": "Compress PDFs to reduce their file size.", "header": "Comprimir PDF", + "method": { + "title": "Compression Method", + "quality": "Quality", + "filesize": "Tamanho do Ficheiro" + }, "credit": "Este serviço usa qpdf para CompressÃŖo/OtimizaÃ§ÃŖo de PDF.", "grayscale": { "label": "Aplicar escala de cinzentos para compressÃŖo" }, + "tooltip": { + "header": { + "title": "Compress Settings Overview" + }, + "description": { + "title": "Description", + "text": "Compression is an easy way to reduce your file size. Pick File Size to enter a target size and have us adjust quality for you. Pick Quality to set compression strength manually." + }, + "qualityAdjustment": { + "title": "Quality Adjustment", + "text": "Drag the slider to adjust the compression strength. Lower values (1-3) preserve quality but result in larger files. Higher values (7-9) shrink the file more but reduce image clarity.", + "bullet1": "Lower values preserve quality", + "bullet2": "Higher values reduce file size" + }, + "grayscale": { + "title": "Grayscale", + "text": "Select this option to convert all images to black and white, which can significantly reduce file size especially for scanned PDFs or image-heavy documents." + } + }, + "error": { + "failed": "An error occurred while compressing the PDF." + }, "selectText": { "1": { "_value": "Compression Settings", @@ -1491,10 +3435,7 @@ "4": "Modo automÃĄtico - Ajusta automaticamente a qualidade para obter o PDF com o tamanho exato", "5": "Tamanho esperado do PDF (ex. 25MB, 10.8MB, 25KB)" }, - "submit": "Comprimir", - "method": { - "filesize": "Tamanho do Ficheiro" - } + "submit": "Comprimir" }, "decrypt": { "passwordPrompt": "Este ficheiro estÃĄ protegido por palavra-passe. Por favor introduza a palavra-passe:", @@ -1595,7 +3536,13 @@ "title": "Remover imagem", "header": "Remover imagem", "removeImage": "Remover imagem", - "submit": "Remover imagem" + "submit": "Remover imagem", + "error": { + "failed": "Failed to remove images from the PDF." + }, + "results": { + "title": "Remove Images Results" + } }, "splitByChapters": { "title": "Dividir PDF por Capítulos", @@ -1629,6 +3576,12 @@ }, "note": "Notas de lançamento apenas disponíveis em InglÃĒs" }, + "swagger": { + "title": "API Documentation", + "header": "API Documentation", + "desc": "View and test the Stirling PDF API endpoints", + "tags": "api,documentation,swagger,endpoints,development" + }, "cookieBanner": { "popUp": { "title": "How we use Cookies", @@ -1664,53 +3617,943 @@ "title": "Analytics", "description": "These cookies help us understand how our tools are being used, so we can focus on building the features our community values most. Rest assured—Stirling PDF cannot and will never track the content of the documents you work with." } + }, + "services": { + "posthog": "PostHog Analytics", + "scarf": "Scarf Pixel" } }, - "download": "Transferir", - "convert": { - "title": "Converter", - "settings": "DefiniçÃĩes", - "color": "Cor", - "greyscale": "Escala de Cinza", - "fillPage": "Preencher PÃĄgina", - "pdfaDigitalSignatureWarning": "O PDF contÊm uma assinatura digital. Esta serÃĄ removida no prÃŗximo passo.", - "grayscale": "Escala de Cinza" + "removeMetadata": { + "submit": "Remove Metadata" }, - "attachments": { - "tags": "embed,attach,file,attachment,attachments", - "title": "Add attachments", - "header": "Add attachments", - "submit": "Add attachments" + "sidebar": { + "toggle": "Toggle Sidebar" + }, + "theme": { + "toggle": "Toggle Theme" + }, + "view": { + "viewer": "Viewer", + "pageEditor": "Page Editor", + "fileManager": "File Manager" + }, + "pageEditor": { + "title": "Page Editor", + "save": "Save Changes", + "noPdfLoaded": "No PDF loaded. Please upload a PDF to edit.", + "rotatedLeft": "Rotated left:", + "rotatedRight": "Rotated right:", + "deleted": "Deleted:", + "movedLeft": "Moved left:", + "movedRight": "Moved right:", + "splitAt": "Split at:", + "insertedPageBreak": "Inserted page break at:", + "addFileNotImplemented": "Add file not implemented in demo", + "closePdf": "Close PDF", + "reset": "Reset Changes", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "fitToWidth": "Fit to Width", + "actualSize": "Actual Size" + }, + "viewer": { + "firstPage": "First Page", + "lastPage": "Last Page", + "previousPage": "Previous Page", + "nextPage": "Next Page", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "singlePageView": "Single Page View", + "dualPageView": "Dual Page View" }, "rightRail": { + "closeSelected": "Close Selected Files", "selectAll": "Selecionar Tudo", - "deselectAll": "Desselecionar Tudo" + "deselectAll": "Desselecionar Tudo", + "selectByNumber": "Select by Page Numbers", + "deleteSelected": "Delete Selected Pages", + "closePdf": "Close PDF", + "exportAll": "Export PDF", + "downloadSelected": "Download Selected Files", + "downloadAll": "Download All", + "toggleTheme": "Toggle Theme", + "language": "Language", + "search": "Search PDF", + "panMode": "Pan Mode", + "rotateLeft": "Rotate Left", + "rotateRight": "Rotate Right", + "toggleSidebar": "Toggle Sidebar", + "exportSelected": "Export Selected Pages", + "toggleAnnotations": "Toggle Annotations Visibility", + "annotationMode": "Toggle Annotation Mode", + "draw": "Draw", + "save": "Save" + }, + "search": { + "title": "Search PDF", + "placeholder": "Enter search term...", + "noResults": "No results found", + "searching": "Searching..." + }, + "guestBanner": { + "title": "You're using Stirling PDF as a guest!", + "message": "Create a free account to save your work, access more features, and support the project.", + "dismiss": "Dismiss banner", + "signUp": "Sign Up Free" + }, + "toolPicker": { + "searchPlaceholder": "Search tools...", + "noToolsFound": "No tools found", + "allTools": "ALL TOOLS", + "quickAccess": "QUICK ACCESS", + "categories": { + "standardTools": "Standard Tools", + "advancedTools": "Advanced Tools", + "recommendedTools": "Recommended Tools" + }, + "subcategories": { + "signing": "Signing", + "documentSecurity": "Document Security", + "verification": "Verification", + "documentReview": "Document Review", + "pageFormatting": "Page Formatting", + "extraction": "Extraction", + "removal": "Removal", + "automation": "Automation", + "general": "General", + "advancedFormatting": "Advanced Formatting", + "developerTools": "Developer Tools" + } }, "quickAccess": { - "sign": "Assinar" + "read": "Read", + "sign": "Assinar", + "automate": "Automate", + "files": "Files", + "activity": "Activity", + "help": "Help", + "account": "Account", + "config": "Config", + "adminSettings": "Admin Settings", + "allTools": "All Tools" + }, + "admin": { + "error": "Error", + "success": "Success", + "expand": "Expand", + "close": "Close", + "status": { + "active": "Active", + "inactive": "Inactive" + }, + "settings": { + "title": "Admin Settings", + "workspace": "Workspace", + "fetchError": "Failed to load settings", + "saveError": "Failed to save settings", + "saved": "Settings saved successfully", + "saveSuccess": "Settings saved successfully", + "save": "Save Changes", + "restartRequired": "Restart Required", + "restart": { + "title": "Restart Required", + "message": "Settings have been saved successfully. A server restart is required for the changes to take effect.", + "question": "Would you like to restart the server now or later?", + "now": "Restart Now", + "later": "Restart Later" + }, + "restarting": "Restarting Server", + "restartingMessage": "The server is restarting. Please wait a moment...", + "restartError": "Failed to restart server. Please restart manually.", + "general": { + "title": "System Settings", + "description": "Configure system-wide application settings including branding and default behaviour.", + "ui": "User Interface", + "system": "System", + "appName": { + "label": "Application Name", + "description": "The name displayed in the browser tab and home page" + }, + "appNameNavbar": { + "label": "Navbar Brand", + "description": "The name displayed in the navigation bar" + }, + "homeDescription": { + "label": "Home Description", + "description": "The description text shown on the home page" + }, + "defaultLocale": { + "label": "Default Locale", + "description": "The default language for new users (e.g., en_US, es_ES)" + }, + "fileUploadLimit": { + "label": "File Upload Limit", + "description": "Maximum file upload size (e.g., 100MB, 1GB)" + }, + "showUpdate": { + "label": "Show Update Notifications", + "description": "Display notifications when a new version is available" + }, + "showUpdateOnlyAdmin": { + "label": "Show Updates to Admins Only", + "description": "Restrict update notifications to admin users only" + }, + "customHTMLFiles": { + "label": "Custom HTML Files", + "description": "Allow serving custom HTML files from the customFiles directory" + }, + "languages": { + "label": "Available Languages", + "description": "Languages that users can select from (leave empty to enable all languages)" + }, + "customMetadata": { + "label": "Custom Metadata", + "autoUpdate": { + "label": "Auto Update Metadata", + "description": "Automatically update PDF metadata on all processed documents" + }, + "author": { + "label": "Default Author", + "description": "Default author for PDF metadata (e.g., username)" + }, + "creator": { + "label": "Default Creator", + "description": "Default creator for PDF metadata" + }, + "producer": { + "label": "Default Producer", + "description": "Default producer for PDF metadata" + } + }, + "customPaths": { + "label": "Custom Paths", + "description": "Configure custom file system paths for pipeline processing and external tools", + "pipeline": { + "label": "Pipeline Directories", + "watchedFoldersDir": { + "label": "Watched Folders Directory", + "description": "Directory where pipeline monitors for incoming PDFs (leave empty for default: /pipeline/watchedFolders)" + }, + "finishedFoldersDir": { + "label": "Finished Folders Directory", + "description": "Directory where processed PDFs are outputted (leave empty for default: /pipeline/finishedFolders)" + } + }, + "operations": { + "label": "External Tool Paths", + "weasyprint": { + "label": "WeasyPrint Executable", + "description": "Path to WeasyPrint executable for HTML to PDF conversion (leave empty for default: /opt/venv/bin/weasyprint)" + }, + "unoconvert": { + "label": "Unoconvert Executable", + "description": "Path to LibreOffice unoconvert for document conversions (leave empty for default: /opt/venv/bin/unoconvert)" + } + } + } + }, + "security": { + "title": "Security", + "description": "Configure authentication, login behaviour, and security policies.", + "ssoNotice": { + "title": "Looking for SSO/SAML settings?", + "message": "OAuth2 and SAML2 authentication providers have been moved to the Connections menu for easier management." + }, + "authentication": "Authentication", + "enableLogin": { + "label": "Enable Login", + "description": "Require users to log in before accessing the application" + }, + "loginMethod": { + "label": "Login Method", + "description": "The authentication method to use for user login", + "all": "All Methods", + "normal": "Username/Password Only", + "oauth2": "OAuth2 Only", + "saml2": "SAML2 Only" + }, + "loginAttemptCount": { + "label": "Login Attempt Limit", + "description": "Maximum number of failed login attempts before account lockout" + }, + "loginResetTimeMinutes": { + "label": "Login Reset Time (minutes)", + "description": "Time before failed login attempts are reset" + }, + "csrfDisabled": { + "label": "Disable CSRF Protection", + "description": "Disable Cross-Site Request Forgery protection (not recommended)" + }, + "initialLogin": { + "label": "Initial Login", + "username": { + "label": "Initial Username", + "description": "The username for the initial admin account" + }, + "password": { + "label": "Initial Password", + "description": "The password for the initial admin account" + } + }, + "jwt": { + "label": "JWT Configuration", + "secureCookie": { + "label": "Secure Cookie", + "description": "Require HTTPS for JWT cookies (recommended for production)" + }, + "keyRetentionDays": { + "label": "Key Retention Days", + "description": "Number of days to retain old JWT keys for verification" + }, + "persistence": { + "label": "Enable Key Persistence", + "description": "Store JWT keys persistently to survive server restarts" + }, + "enableKeyRotation": { + "label": "Enable Key Rotation", + "description": "Automatically rotate JWT signing keys periodically" + }, + "enableKeyCleanup": { + "label": "Enable Key Cleanup", + "description": "Automatically remove expired JWT keys" + } + }, + "audit": { + "label": "Audit Logging", + "enabled": { + "label": "Enable Audit Logging", + "description": "Track user actions and system events for compliance and security monitoring" + }, + "level": { + "label": "Audit Level", + "description": "0=OFF, 1=BASIC, 2=STANDARD, 3=VERBOSE" + }, + "retentionDays": { + "label": "Audit Retention (days)", + "description": "Number of days to retain audit logs" + } + }, + "htmlUrlSecurity": { + "label": "HTML URL Security", + "description": "Configure URL access restrictions for HTML processing to prevent SSRF attacks", + "enabled": { + "label": "Enable URL Security", + "description": "Enable URL security restrictions for HTML to PDF conversions" + }, + "level": { + "label": "Security Level", + "description": "MAX: whitelist only, MEDIUM: block internal networks, OFF: no restrictions", + "max": "Maximum (Whitelist Only)", + "medium": "Medium (Block Internal)", + "off": "Off (No Restrictions)" + }, + "advanced": "Advanced Settings", + "allowedDomains": { + "label": "Allowed Domains (Whitelist)", + "description": "One domain per line (e.g., cdn.example.com). Only these domains allowed when level is MAX" + }, + "blockedDomains": { + "label": "Blocked Domains (Blacklist)", + "description": "One domain per line (e.g., malicious.com). Additional domains to block" + }, + "internalTlds": { + "label": "Internal TLDs", + "description": "One TLD per line (e.g., .local, .internal). Block domains with these TLD patterns" + }, + "networkBlocking": "Network Blocking", + "blockPrivateNetworks": { + "label": "Block Private Networks", + "description": "Block RFC 1918 private networks (10.x.x.x, 192.168.x.x, 172.16-31.x.x)" + }, + "blockLocalhost": { + "label": "Block Localhost", + "description": "Block localhost and loopback addresses (127.x.x.x, ::1)" + }, + "blockLinkLocal": { + "label": "Block Link-Local Addresses", + "description": "Block link-local addresses (169.254.x.x, fe80::/10)" + }, + "blockCloudMetadata": { + "label": "Block Cloud Metadata Endpoints", + "description": "Block cloud provider metadata endpoints (169.254.169.254)" + } + } + }, + "connections": { + "title": "Connections", + "description": "Configure external authentication providers like OAuth2 and SAML.", + "linkedServices": "Linked Services", + "unlinkedServices": "Unlinked Services", + "connect": "Connect", + "disconnect": "Disconnect", + "disconnected": "Provider disconnected successfully", + "disconnectError": "Failed to disconnect provider", + "ssoAutoLogin": { + "label": "SSO Auto Login", + "enable": "Enable SSO Auto Login", + "description": "Automatically redirect to SSO login when authentication is required" + }, + "oauth2": { + "label": "OAuth2", + "enabled": { + "label": "Enable OAuth2", + "description": "Allow users to authenticate using OAuth2 providers" + }, + "provider": { + "label": "Provider", + "description": "The OAuth2 provider to use for authentication" + }, + "issuer": { + "label": "Issuer URL", + "description": "The OAuth2 provider issuer URL" + }, + "clientId": { + "label": "Client ID", + "description": "The OAuth2 client ID from your provider" + }, + "clientSecret": { + "label": "Client Secret", + "description": "The OAuth2 client secret from your provider" + }, + "useAsUsername": { + "label": "Use as Username", + "description": "The OAuth2 claim to use as the username (e.g., email, sub)" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first OAuth2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via OAuth2" + }, + "scopes": { + "label": "OAuth2 Scopes", + "description": "Comma-separated list of OAuth2 scopes to request (e.g., openid, profile, email)" + } + }, + "saml2": { + "label": "SAML2", + "enabled": { + "label": "Enable SAML2", + "description": "Allow users to authenticate using SAML2 providers" + }, + "provider": { + "label": "Provider", + "description": "The SAML2 provider name" + }, + "registrationId": { + "label": "Registration ID", + "description": "The SAML2 registration identifier" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first SAML2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via SAML2" + } + } + }, + "database": { + "title": "Database", + "description": "Configure custom database connection settings for enterprise deployments.", + "configuration": "Database Configuration", + "enableCustom": { + "label": "Enable Custom Database", + "description": "Use your own custom database configuration instead of the default embedded database" + }, + "customUrl": { + "label": "Custom Database URL", + "description": "Full JDBC connection string (e.g., jdbc:postgresql://localhost:5432/postgres). If provided, individual connection settings below are not used." + }, + "type": { + "label": "Database Type", + "description": "Type of database (not used if custom URL is provided)" + }, + "hostName": { + "label": "Host Name", + "description": "Database server hostname (not used if custom URL is provided)" + }, + "port": { + "label": "Port", + "description": "Database server port (not used if custom URL is provided)" + }, + "name": { + "label": "Database Name", + "description": "Name of the database (not used if custom URL is provided)" + }, + "username": { + "label": "Username", + "description": "Database authentication username" + }, + "password": { + "label": "Password", + "description": "Database authentication password" + } + }, + "privacy": { + "title": "Privacy", + "description": "Configure privacy and data collection settings.", + "analytics": "Analytics & Tracking", + "enableAnalytics": { + "label": "Enable Analytics", + "description": "Collect anonymous usage analytics to help improve the application" + }, + "metricsEnabled": { + "label": "Enable Metrics", + "description": "Enable collection of performance and usage metrics. Provides API endpoint for admins to access metrics data" + }, + "searchEngine": "Search Engine Visibility", + "googleVisibility": { + "label": "Google Visibility", + "description": "Allow search engines to index this application" + } + }, + "advanced": { + "title": "Advanced", + "description": "Configure advanced features and experimental functionality.", + "features": "Feature Flags", + "processing": "Processing", + "endpoints": { + "label": "Endpoints", + "manage": "Manage API Endpoints", + "description": "Endpoint management is configured via YAML. See documentation for details on enabling/disabling specific endpoints." + }, + "enableAlphaFunctionality": { + "label": "Enable Alpha Features", + "description": "Enable experimental and alpha-stage features (may be unstable)" + }, + "enableUrlToPDF": { + "label": "Enable URL to PDF", + "description": "Allow conversion of web pages to PDF documents" + }, + "maxDPI": { + "label": "Maximum DPI", + "description": "Maximum DPI for image processing (0 = unlimited)" + }, + "tessdataDir": { + "label": "Tessdata Directory", + "description": "Path to the tessdata directory for OCR language files" + }, + "disableSanitize": { + "label": "Disable HTML Sanitization", + "description": "WARNING: Security risk - disabling HTML sanitization can lead to XSS vulnerabilities" + }, + "tempFileManagement": { + "label": "Temp File Management", + "description": "Configure temporary file storage and cleanup behavior", + "baseTmpDir": { + "label": "Base Temp Directory", + "description": "Base directory for temporary files (leave empty for default: java.io.tmpdir/stirling-pdf)" + }, + "libreofficeDir": { + "label": "LibreOffice Temp Directory", + "description": "Directory for LibreOffice temp files (leave empty for default: baseTmpDir/libreoffice)" + }, + "systemTempDir": { + "label": "System Temp Directory", + "description": "System temp directory to clean (only used if cleanupSystemTemp is enabled)" + }, + "prefix": { + "label": "Temp File Prefix", + "description": "Prefix for temp file names" + }, + "maxAgeHours": { + "label": "Max Age (hours)", + "description": "Maximum age in hours before temp files are cleaned up" + }, + "cleanupIntervalMinutes": { + "label": "Cleanup Interval (minutes)", + "description": "How often to run cleanup (in minutes)" + }, + "startupCleanup": { + "label": "Startup Cleanup", + "description": "Clean up old temp files on application startup" + }, + "cleanupSystemTemp": { + "label": "Cleanup System Temp", + "description": "Whether to clean broader system temp directory (use with caution)" + } + }, + "processExecutor": { + "label": "Process Executor Limits", + "description": "Configure session limits and timeouts for each process executor", + "sessionLimit": { + "label": "Session Limit", + "description": "Maximum concurrent instances" + }, + "timeout": { + "label": "Timeout (minutes)", + "description": "Maximum execution time" + }, + "libreOffice": "LibreOffice", + "pdfToHtml": "PDF to HTML", + "qpdf": "QPDF", + "tesseract": "Tesseract OCR", + "pythonOpenCv": "Python OpenCV", + "weasyPrint": "WeasyPrint", + "installApp": "Install App", + "calibre": "Calibre", + "ghostscript": "Ghostscript", + "ocrMyPdf": "OCRmyPDF" + } + }, + "mail": { + "title": "Mail Server", + "description": "Configure SMTP settings for sending email notifications.", + "smtp": "SMTP Configuration", + "enabled": { + "label": "Enable Mail", + "description": "Enable email notifications and SMTP functionality" + }, + "host": { + "label": "SMTP Host", + "description": "The hostname or IP address of your SMTP server" + }, + "port": { + "label": "SMTP Port", + "description": "The port number for SMTP connection (typically 25, 465, or 587)" + }, + "username": { + "label": "SMTP Username", + "description": "Username for SMTP authentication" + }, + "password": { + "label": "SMTP Password", + "description": "Password for SMTP authentication" + }, + "from": { + "label": "From Address", + "description": "The email address to use as the sender" + }, + "enableInvites": { + "label": "Enable Email Invites", + "description": "Allow admins to invite users via email with auto-generated passwords" + }, + "frontendUrl": { + "label": "Frontend URL", + "description": "Base URL for frontend (e.g. https://pdf.example.com). Used for generating invite links in emails. Leave empty to use backend URL." + } + }, + "legal": { + "title": "Legal Documents", + "description": "Configure links to legal documents and policies.", + "disclaimer": { + "title": "Legal Responsibility Warning", + "message": "By customizing these legal documents, you assume full responsibility for ensuring compliance with all applicable laws and regulations, including but not limited to GDPR and other EU data protection requirements. Only modify these settings if: (1) you are operating a personal/private instance, (2) you are outside EU jurisdiction and understand your local legal obligations, or (3) you have obtained proper legal counsel and accept sole responsibility for all user data and legal compliance. Stirling-PDF and its developers assume no liability for your legal obligations." + }, + "termsAndConditions": { + "label": "Terms and Conditions", + "description": "URL or filename to terms and conditions" + }, + "privacyPolicy": { + "label": "Privacy Policy", + "description": "URL or filename to privacy policy" + }, + "accessibilityStatement": { + "label": "Accessibility Statement", + "description": "URL or filename to accessibility statement" + }, + "cookiePolicy": { + "label": "Cookie Policy", + "description": "URL or filename to cookie policy" + }, + "impressum": { + "label": "Impressum", + "description": "URL or filename to impressum (required in some jurisdictions)" + } + }, + "premium": { + "title": "Premium & Enterprise", + "description": "Configure your premium or enterprise license key.", + "license": "License Configuration", + "key": { + "label": "License Key", + "description": "Enter your premium or enterprise license key" + }, + "enabled": { + "label": "Enable Premium Features", + "description": "Enable license key checks for pro/enterprise features" + }, + "movedFeatures": { + "title": "Premium Features Distributed", + "message": "Premium and Enterprise features are now organized in their respective sections:" + } + }, + "features": { + "title": "Features", + "description": "Configure optional features and functionality.", + "serverCertificate": { + "label": "Server Certificate", + "description": "Configure server-side certificate generation for \"Sign with Stirling-PDF\" functionality", + "enabled": { + "label": "Enable Server Certificate", + "description": "Enable server-side certificate for \"Sign with Stirling-PDF\" option" + }, + "organizationName": { + "label": "Organization Name", + "description": "Organization name for generated certificates" + }, + "validity": { + "label": "Certificate Validity (days)", + "description": "Number of days the certificate will be valid" + }, + "regenerateOnStartup": { + "label": "Regenerate on Startup", + "description": "Generate new certificate on each application startup" + } + } + }, + "endpoints": { + "title": "API Endpoints", + "description": "Control which API endpoints and endpoint groups are available.", + "management": "Endpoint Management", + "toRemove": { + "label": "Disabled Endpoints", + "description": "Select individual endpoints to disable" + }, + "groupsToRemove": { + "label": "Disabled Endpoint Groups", + "description": "Select endpoint groups to disable" + }, + "note": "Note: Disabling endpoints restricts API access but does not remove UI components. Restart required for changes to take effect." + } + } }, "fileUpload": { + "selectFile": "Select a file", + "selectFiles": "Select files", + "selectPdfToView": "Select a PDF to view", + "selectPdfToEdit": "Select a PDF to edit", + "chooseFromStorage": "Choose a file from storage or upload a new PDF", + "chooseFromStorageMultiple": "Choose files from storage or upload new PDFs", + "loadFromStorage": "Load from Storage", + "filesAvailable": "files available", "loading": "A carregar...", - "or": "ou" + "or": "ou", + "dropFileHere": "Drop file here or click to upload", + "dropFilesHere": "Drop files here or click the upload button", + "pdfFilesOnly": "PDF files only", + "supportedFileTypes": "Supported file types", + "upload": "Upload", + "uploadFile": "Upload File", + "uploadFiles": "Upload Files", + "noFilesInStorage": "No files available in storage. Upload some files first.", + "selectFromStorage": "Select from Storage", + "backToTools": "Back to Tools", + "addFiles": "Add Files", + "dragFilesInOrClick": "Drag files in or click \"Add Files\" to browse" + }, + "fileEditor": { + "addFiles": "Add Files" }, "fileManager": { + "title": "Upload PDF Files", + "subtitle": "Add files to your storage for easy access across tools", + "filesSelected": "files selected", + "clearSelection": "Clear Selection", + "openInFileEditor": "Open in File Editor", + "uploadError": "Failed to upload some files.", + "failedToOpen": "Failed to open file. It may have been removed from storage.", + "failedToLoad": "Failed to load file to active set.", + "storageCleared": "Browser cleared storage. Files have been removed. Please re-upload.", + "clearAll": "Clear All", + "reloadFiles": "Reload Files", + "dragDrop": "Drag & Drop files here", + "clickToUpload": "Click to upload files", + "selectedFiles": "Selected Files", + "storage": "Storage", + "filesStored": "files stored", + "storageError": "Storage error occurred", + "storageLow": "Storage is running low. Consider removing old files.", + "supportMessage": "Powered by browser database storage for unlimited capacity", + "noFileSelected": "No files selected", + "showHistory": "Show History", + "hideHistory": "Hide History", + "fileHistory": "File History", + "loadingHistory": "Loading History...", + "lastModified": "Last Modified", + "toolChain": "Tools Applied", + "restore": "Restore", + "unzip": "Unzip", + "searchFiles": "Search files...", + "recent": "Recent", + "localFiles": "Local Files", + "googleDrive": "Google Drive", + "googleDriveShort": "Drive", + "myFiles": "My Files", + "noRecentFiles": "No recent files found", + "googleDriveNotAvailable": "Google Drive integration not available", + "openFiles": "Open Files", + "openFile": "Open File", + "details": "File Details", "fileName": "Nome", + "fileFormat": "Format", + "fileSize": "Size", "fileVersion": "VersÃŖo", + "totalSelected": "Total Selected", + "dropFilesHere": "Drop files here", "selectAll": "Selecionar Tudo", "deselectAll": "Desselecionar Tudo", "deleteSelected": "Eliminar Selecionadas", + "downloadSelected": "Download Selected", + "selectedCount": "{{count}} selected", "download": "Transferir", - "delete": "Eliminar" + "delete": "Eliminar", + "unsupported": "Unsupported", + "addToUpload": "Add to Upload", + "deleteAll": "Delete All", + "loadingFiles": "Loading files...", + "noFiles": "No files available", + "noFilesFound": "No files found matching your search", + "openInPageEditor": "Open in Page Editor", + "showAll": "Show All", + "sortByDate": "Sort by Date", + "sortByName": "Sort by Name", + "sortBySize": "Sort by Size" + }, + "storage": { + "temporaryNotice": "Files are stored temporarily in your browser and may be cleared automatically", + "storageLimit": "Storage limit", + "storageUsed": "Temporary Storage used", + "storageFull": "Storage is nearly full. Consider removing some files.", + "fileTooLarge": "File too large. Maximum size per file is", + "storageQuotaExceeded": "Storage quota exceeded. Please remove some files before uploading more.", + "approximateSize": "Approximate size" }, "sanitize": { + "title": "Sanitise", + "desc": "Remove potentially harmful elements from PDF files.", "submit": "Sanitizar PDF", + "completed": "Sanitisation completed successfully", + "error": { + "generic": "Sanitisation failed", + "failed": "An error occurred while sanitising the PDF." + }, + "filenamePrefix": "sanitised", + "sanitizationResults": "Sanitisation Results", "steps": { - "settings": "DefiniçÃĩes" + "files": "Files", + "settings": "DefiniçÃĩes", + "results": "Results" + }, + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "options": { + "title": "Sanitisation Options", + "note": "Select the elements you want to remove from the PDF. At least one option must be selected.", + "removeJavaScript": { + "label": "Remove JavaScript", + "desc": "Remove JavaScript actions and scripts from the PDF" + }, + "removeEmbeddedFiles": { + "label": "Remove Embedded Files", + "desc": "Remove any files embedded within the PDF" + }, + "removeXMPMetadata": { + "label": "Remove XMP Metadata", + "desc": "Remove XMP metadata from the PDF" + }, + "removeMetadata": { + "label": "Remove Document Metadata", + "desc": "Remove document information metadata (title, author, etc.)" + }, + "removeLinks": { + "label": "Remove Links", + "desc": "Remove external links and launch actions from the PDF" + }, + "removeFonts": { + "label": "Remove Fonts", + "desc": "Remove embedded fonts from the PDF" + } + } + }, + "addPassword": { + "title": "Adicionar Palavra-passe", + "desc": "Encrypt your PDF document with a password.", + "completed": "Password protection applied", + "submit": "Encriptar", + "filenamePrefix": "encrypted", + "error": { + "failed": "An error occurred while encrypting the PDF." + }, + "passwords": { + "stepTitle": "Passwords & Encryption", + "completed": "Passwords configured", + "user": { + "label": "User Password", + "placeholder": "Enter user password" + }, + "owner": { + "label": "Owner Password", + "placeholder": "Enter owner password" + } + }, + "encryption": { + "keyLength": { + "label": "Encryption Key Length", + "40bit": "40-bit (Low)", + "128bit": "128-bit (Standard)", + "256bit": "256-bit (High)" + } + }, + "results": { + "title": "Encrypted PDFs" + }, + "tooltip": { + "header": { + "title": "Password Protection Overview" + }, + "passwords": { + "title": "Password Types", + "text": "User passwords restrict opening the document, while owner passwords control what can be done with the document once opened. You can set both or just one.", + "bullet1": "User Password: Required to open the PDF", + "bullet2": "Owner Password: Controls document permissions (not supported by all PDF viewers)" + }, + "encryption": { + "title": "Encryption Levels", + "text": "Higher encryption levels provide better security but may not be supported by older PDF viewers.", + "bullet1": "40-bit: Basic security, compatible with older viewers", + "bullet2": "128-bit: Standard security, widely supported", + "bullet3": "256-bit: Maximum security, requires modern viewers" + }, + "permissions": { + "title": "Alterar PermissÃĩes", + "text": "These permissions control what users can do with the PDF. Most effective when combined with an owner password." + } + }, + "tags": "seguro,segurança", + "header": "Adicionar palavra-passe (Encriptar)", + "selectText": { + "1": "Selecione PDF para encriptar", + "2": "Palavra-passe de Utilizador", + "3": "Comprimento da Chave de EncriptaÃ§ÃŖo", + "4": "Valores mais altos sÃŖo mais fortes, mas valores mais baixos tÃĒm melhor compatibilidade.", + "5": "PermissÃĩes a definir (Recomendado usar junto com palavra-passe de ProprietÃĄrio)", + "6": "Impedir montagem do documento", + "7": "Impedir extraÃ§ÃŖo de conteÃēdo", + "8": "Impedir extraÃ§ÃŖo para acessibilidade", + "9": "Impedir preenchimento de formulÃĄrio", + "10": "Impedir modificaÃ§ÃŖo", + "11": "Impedir modificaÃ§ÃŖo de anotaÃ§ÃŖo", + "12": "Impedir impressÃŖo", + "13": "Impedir impressÃŖo em diferentes formatos", + "14": "Palavra-passe de ProprietÃĄrio", + "15": "Restringe o que pode ser feito com o documento uma vez aberto (NÃŖo suportado por todos os leitores)", + "16": "Restringe a abertura do prÃŗprio documento" } }, "changePermissions": { "title": "Alterar PermissÃĩes", + "desc": "Change document restrictions and permissions.", + "completed": "Permissions changed", "submit": "Alterar PermissÃĩes", + "error": { + "failed": "An error occurred while changing PDF permissions." + }, "permissions": { "preventAssembly": { "label": "Impedir montagem do documento" @@ -1737,10 +4580,784 @@ "label": "Impedir impressÃŖo em diferentes formatos" } }, + "results": { + "title": "Modified PDFs" + }, "tooltip": { "header": { "title": "Alterar PermissÃĩes" + }, + "description": { + "text": "Changes document permissions, allowing/disallowing access to different features in PDF readers." + }, + "warning": { + "text": "To make these permissions unchangeable, use the Add Password tool to set an owner password." } } + }, + "removePassword": { + "title": "Remover palavra-passe", + "desc": "Remover proteÃ§ÃŖo por palavra-passe do seu documento PDF.", + "tags": "seguro,Desencriptar,segurança,sem palavra-passe,eliminar palavra-passe", + "password": { + "stepTitle": "Remover Palavra-passe", + "label": "Palavra-passe Atual", + "placeholder": "Enter current password", + "completed": "Password configured" + }, + "filenamePrefix": "decrypted", + "error": { + "failed": "An error occurred while removing the password from the PDF." + }, + "tooltip": { + "description": "Removing password protection requires the password that was used to encrypt the PDF. This will decrypt the document, making it accessible without a password." + }, + "submit": "Remover", + "results": { + "title": "Decrypted PDFs" + }, + "header": "Remover palavra-passe (Desencriptar)", + "selectText": { + "1": "Selecione PDF para Desencriptar", + "2": "Palavra-passe" + } + }, + "automate": { + "title": "Automate", + "desc": "Build multi-step workflows by chaining together PDF actions. Ideal for recurring tasks.", + "invalidStep": "Invalid step", + "files": { + "placeholder": "Select files to process with this automation" + }, + "selection": { + "title": "Automation Selection", + "saved": { + "title": "Saved" + }, + "createNew": { + "title": "Create New Automation" + }, + "suggested": { + "title": "Suggested" + } + }, + "creation": { + "createTitle": "Create Automation", + "editTitle": "Edit Automation", + "intro": "Automations run tools sequentially. To get started, add tools in the order you want them to run.", + "name": { + "label": "Automation Name", + "placeholder": "My Automation" + }, + "description": { + "label": "Description (optional)", + "placeholder": "Describe what this automation does..." + }, + "tools": { + "selectTool": "Select a tool...", + "selected": "Selected Tools", + "remove": "Remove tool", + "configure": "Configure tool", + "notConfigured": "! Not Configured", + "addTool": "Add Tool", + "add": "Add a tool..." + }, + "save": "Save Automation", + "unsavedChanges": { + "title": "Unsaved Changes", + "message": "You have unsaved changes. Are you sure you want to go back? All changes will be lost.", + "cancel": "Cancel", + "confirm": "Go Back" + }, + "icon": { + "label": "Icon" + } + }, + "run": { + "title": "Run Automation" + }, + "sequence": { + "unnamed": "Unnamed Automation", + "steps": "{{count}} steps", + "running": "Running Automation...", + "run": "Run Automation", + "finish": "Finish" + }, + "reviewTitle": "Automation Results", + "config": { + "loading": "Loading tool configuration...", + "noSettings": "This tool does not have configurable settings.", + "title": "Configure {{toolName}}", + "description": "Configure the settings for this tool. These settings will be applied when the automation runs.", + "cancel": "Cancel", + "save": "Save Configuration" + }, + "copyToSaved": "Copy to Saved" + }, + "automation": { + "suggested": { + "securePdfIngestion": "Secure PDF Ingestion", + "securePdfIngestionDesc": "Comprehensive PDF processing workflow that sanitises documents, applies OCR with cleanup, converts to PDF/A format for long-term archival, and optimises file size.", + "emailPreparation": "Email Preparation", + "emailPreparationDesc": "Optimises PDFs for email distribution by compressing files, splitting large documents into 20MB chunks for email compatibility, and removing metadata for privacy.", + "secureWorkflow": "Security Workflow", + "secureWorkflowDesc": "Secures PDF documents by removing potentially malicious content like JavaScript and embedded files, then adds password protection to prevent unauthorised access. Password is set to 'password' by default.", + "processImages": "Process Images", + "processImagesDesc": "Converts multiple image files into a single PDF document, then applies OCR technology to extract searchable text from the images." + } + }, + "common": { + "copy": "Copy", + "copied": "Copied!", + "refresh": "Refresh", + "retry": "Retry", + "remaining": "remaining", + "used": "used", + "available": "available", + "cancel": "Cancel", + "preview": "Preview" + }, + "config": { + "overview": { + "title": "Application Configuration", + "description": "Current application settings and configuration details." + }, + "account": { + "overview": { + "title": "Account Settings", + "manageAccountPreferences": "Manage your account preferences", + "guestDescription": "You are signed in as a guest. Consider upgrading your account above." + }, + "upgrade": { + "title": "Upgrade Guest Account", + "description": "Link your account to preserve your history and access more features!", + "socialLogin": "Upgrade with Social Account", + "linkWith": "Link with", + "emailPassword": "or enter your email & password", + "email": "Email", + "emailPlaceholder": "Enter your email", + "password": "Password (optional)", + "passwordPlaceholder": "Set a password", + "passwordNote": "Leave empty to use email verification only", + "upgradeButton": "Upgrade Account" + } + }, + "apiKeys": { + "description": "Your API key for accessing Stirling's suite of PDF tools. Copy it to your project or refresh to generate a new one.", + "publicKeyAriaLabel": "Public API key", + "copyKeyAriaLabel": "Copy API key", + "refreshAriaLabel": "Refresh API key", + "includedCredits": "Included credits", + "purchasedCredits": "Purchased credits", + "totalCredits": "Total Credits", + "chartAriaLabel": "Credits usage: included {{includedUsed}} of {{includedTotal}}, purchased {{purchasedUsed}} of {{purchasedTotal}}", + "nextReset": "Next Reset", + "lastApiUse": "Last API Use", + "overlayMessage": "Generate a key to see credits and available credits", + "label": "API Key", + "guestInfo": "Guest users do not receive API keys. Create an account to get an API key you can use in your applications.", + "goToAccount": "Go to Account", + "refreshModal": { + "title": "Refresh API Keys", + "warning": "âš ī¸ Warning: This action will generate new API keys and make your previous keys invalid.", + "impact": "Any applications or services currently using these keys will stop working until you update them with the new keys.", + "confirmPrompt": "Are you sure you want to continue?", + "confirmCta": "Refresh Keys" + }, + "generateError": "We couldn't generate your API key." + } + }, + "AddAttachmentsRequest": { + "attachments": "Select Attachments", + "info": "Select files to attach to your PDF. These files will be embedded and accessible through the PDF's attachment panel.", + "selectFiles": "Select Files to Attach", + "placeholder": "Choose files...", + "addMoreFiles": "Add more files...", + "selectedFiles": "Selected Files", + "submit": "Add Attachments", + "results": { + "title": "Attachment Results" + }, + "error": { + "failed": "Add attachments operation failed" + } + }, + "termsAndConditions": "Terms & Conditions", + "logOut": "Log out", + "addAttachments": { + "error": { + "failed": "An error occurred while adding attachments to the PDF." + } + }, + "autoRename": { + "description": "This tool will automatically rename PDF files based on their content. It analyzes the document to find the most suitable title from the text." + }, + "customPosition": "Custom Position", + "details": "Details", + "downloadUnavailable": "Download unavailable for this item", + "invalidUndoData": "Cannot undo: invalid operation data", + "margin": { + "large": "Large", + "medium": "Medium", + "small": "Small", + "xLarge": "Extra Large" + }, + "noFilesToUndo": "Cannot undo: no files were processed in the last operation", + "noOperationToUndo": "No operation to undo", + "noValidFiles": "No valid files to process", + "operationCancelled": "Operation cancelled", + "pageEdit": { + "deselectAll": "Select None", + "selectAll": "Select All" + }, + "quickPosition": "Quick Position", + "reorganizePages": { + "error": { + "failed": "Failed to reorganize pages" + }, + "results": { + "title": "Pages Reorganized" + }, + "settings": { + "title": "Settings" + }, + "submit": "Reorganize Pages" + }, + "replace-color": { + "options": { + "fill": "Fill colour", + "gradient": "Gradient" + }, + "previewOverlayOpacity": "Preview overlay opacity", + "previewOverlayTransparency": "Preview overlay transparency", + "previewOverlayVisibility": "Show preview overlay", + "selectText": { + "1": "OpçÃĩes de Substituir ou Inverter cor", + "2": "PredefiniÃ§ÃŖo(Cores de alto contraste predefinidas)", + "3": "Personalizado(Cores personalizadas)", + "4": "InversÃŖo Total(Inverter todas as cores)", + "5": "OpçÃĩes de cor de alto contraste", + "6": "texto branco em fundo preto", + "7": "Texto preto em fundo branco", + "8": "Texto amarelo em fundo preto", + "9": "Texto verde em fundo preto", + "10": "Escolher cor do texto", + "11": "Escolher cor do fundo", + "12": "Choose start colour", + "13": "Choose end colour" + }, + "submit": "Substituir", + "title": "Substituir-Inverter-Cor", + "header": "Substituir-Inverter Cor PDF" + }, + "size": "Size", + "submit": "Submit", + "success": "Success", + "tools": { + "noSearchResults": "No tools found", + "noTools": "No tools available" + }, + "undoDataMismatch": "Cannot undo: operation data is corrupted", + "undoFailed": "Failed to undo operation", + "undoQuotaError": "Cannot undo: insufficient storage space", + "undoStorageError": "Undo completed but some files could not be saved to storage", + "undoSuccess": "Operation undone successfully", + "unsupported": "Unsupported", + "onboarding": { + "welcomeModal": { + "title": "Welcome to Stirling PDF!", + "description": "Would you like to take a quick 1-minute tour to learn the key features and how to get started?", + "helpHint": "You can always access this tour later from the Help button in the bottom left.", + "startTour": "Start Tour", + "maybeLater": "Maybe Later", + "dontShowAgain": "Don't Show Again" + }, + "allTools": "This is the All Tools panel, where you can browse and select from all available PDF tools.", + "selectCropTool": "Let's select the Crop tool to demonstrate how to use one of the tools.", + "toolInterface": "This is the Crop tool interface. As you can see, there's not much there because we haven't added any PDF files to work with yet.", + "filesButton": "The Files button on the Quick Access bar allows you to upload PDFs to use the tools on.", + "fileSources": "You can upload new files or access recent files from here. For the tour, we'll just use a sample file.", + "workbench": "This is the Workbench - the main area where you view and edit your PDFs.", + "viewSwitcher": "Use these controls to select how you want to view your PDFs.", + "viewer": "The Viewer lets you read and annotate your PDFs.", + "pageEditor": "The Page Editor allows you to do various operations on the pages within your PDFs, such as reordering, rotating and deleting.", + "activeFiles": "The Active Files view shows all of the PDFs you have loaded into the tool, and allows you to select which ones to process.", + "fileCheckbox": "Clicking one of the files selects it for processing. You can select multiple files for batch operations.", + "selectControls": "The Right Rail contains buttons to quickly select/deselect all of your active PDFs, along with buttons to change the app's theme or language.", + "cropSettings": "Now that we've selected the file we want crop, we can configure the Crop tool to choose the area that we want to crop the PDF to.", + "runButton": "Once the tool has been configured, this button allows you to run the tool on all the selected PDFs.", + "results": "After the tool has finished running, the Review step will show a preview of the results in this panel, and allow you to undo the operation or download the file. ", + "fileReplacement": "The modified file will replace the original file in the Workbench automatically, allowing you to easily run it through more tools.", + "pinButton": "You can use the Pin button if you'd rather your files stay active after running tools on them.", + "wrapUp": "You're all set! You've learnt about the main areas of the app and how to use them. Click the Help button whenever you like to see this tour again.", + "previous": "Previous", + "next": "Next", + "finish": "Finish", + "startTour": "Start Tour", + "startTourDescription": "Take a guided tour of Stirling PDF's key features" + }, + "workspace": { + "title": "Workspace", + "people": { + "title": "People", + "description": "Manage workspace members and their permissions", + "loading": "Loading people...", + "searchMembers": "Search members...", + "addMembers": "Add Members", + "inviteMembers": { + "label": "Invite Members", + "subtitle": "Type or paste in emails below, separated by commas. Your workspace will be billed by members." + }, + "user": "User", + "role": "Role", + "team": "Team", + "status": "Status", + "actions": "Actions", + "noMembersFound": "No members found", + "active": "Active", + "disabled": "Disabled", + "activeSession": "Active session", + "member": "Member", + "admin": "Admin", + "roleDescriptions": { + "admin": "Can manage settings and invite members, with full administrative access.", + "member": "Can view and edit shared files, but cannot manage workspace settings or members." + }, + "editRole": "Edit Role", + "enable": "Enable", + "disable": "Disable", + "deleteUser": "Delete User", + "deleteUserSuccess": "User deleted successfully", + "deleteUserError": "Failed to delete user", + "confirmDelete": "Are you sure you want to delete this user? This action cannot be undone.", + "addMember": { + "title": "Add Member", + "username": "Username (Email)", + "usernamePlaceholder": "user@example.com", + "password": "Password", + "passwordPlaceholder": "Enter password", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "forcePasswordChange": "Force password change on first login", + "cancel": "Cancel", + "submit": "Add Member", + "usernameRequired": "Username and password are required", + "passwordTooShort": "Password must be at least 6 characters", + "success": "User created successfully", + "error": "Failed to create user" + }, + "editMember": { + "title": "Edit Member", + "editing": "Editing:", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "cancel": "Cancel", + "submit": "Update Member", + "success": "User updated successfully", + "error": "Failed to update user" + }, + "toggleEnabled": { + "success": "User status updated successfully", + "error": "Failed to update user status" + }, + "delete": { + "success": "User deleted successfully", + "error": "Failed to delete user" + }, + "emailInvite": { + "tab": "Email Invite", + "description": "Type or paste in emails below, separated by commas. Users will receive login credentials via email.", + "emails": "Email Addresses", + "emailsPlaceholder": "user1@example.com, user2@example.com", + "emailsRequired": "At least one email address is required", + "submit": "Send Invites", + "success": "user(s) invited successfully", + "partialSuccess": "Some invites failed", + "allFailed": "Failed to invite users", + "error": "Failed to send invites" + }, + "directInvite": { + "tab": "Direct Create" + }, + "inviteLinkTab": { + "tab": "Invite Link" + }, + "inviteLink": { + "description": "Generate a secure link that allows the user to set their own password", + "email": "Email Address", + "emailPlaceholder": "user@example.com (optional)", + "emailDescription": "Optional - leave blank for a general invite link that can be used by anyone", + "emailRequired": "Email address is required", + "emailOptional": "Optional - leave blank for a general invite link", + "emailRequiredForSend": "Email address is required to send email notification", + "expiryHours": "Expiry Hours", + "expiryDescription": "How many hours until the link expires", + "sendEmail": "Send invite link via email", + "sendEmailDescription": "If enabled, the invite link will be sent to the specified email address", + "smtpRequired": "SMTP not configured", + "generate": "Generate Link", + "generated": "Invite Link Generated", + "copied": "Link copied to clipboard", + "success": "Invite link generated successfully", + "successWithEmail": "Invite link generated and sent via email", + "emailFailed": "Invite link generated, but email failed", + "emailFailedDetails": "Error: {0}. Please share the invite link manually.", + "error": "Failed to generate invite link", + "submit": "Generate Invite Link" + }, + "inviteMode": { + "username": "Username", + "email": "Email", + "link": "Link", + "emailDisabled": "Email invites require SMTP configuration and mail.enableInvites=true in settings" + }, + "license": { + "users": "users", + "availableSlots": "Available Slots", + "grandfathered": "Grandfathered", + "grandfatheredShort": "{{count}} grandfathered", + "fromLicense": "from license", + "slotsAvailable": "{{count}} user slot(s) available", + "noSlotsAvailable": "No slots available", + "currentUsage": "Currently using {{current}} of {{max}} user licences" + } + }, + "teams": { + "title": "Teams", + "description": "Manage teams and organize workspace members", + "loading": "Loading teams...", + "loadingDetails": "Loading team details...", + "createNewTeam": "Create New Team", + "teamName": "Team Name", + "totalMembers": "Total Members", + "actions": "Actions", + "noTeamsFound": "No teams found", + "noMembers": "No members in this team", + "system": "System", + "addMember": "Add Member", + "viewTeam": "View Team", + "removeMember": "Remove from team", + "cannotRemoveFromSystemTeam": "Cannot remove from system team", + "renameTeamLabel": "Rename Team", + "deleteTeamLabel": "Delete Team", + "cannotDeleteInternal": "Cannot delete the Internal team", + "confirmDelete": "Are you sure you want to delete this team? This team must be empty to delete.", + "confirmRemove": "Remove user from this team?", + "cannotRenameInternal": "Cannot rename the Internal team", + "cannotAddToInternal": "Cannot add members to the Internal team", + "teamNotFound": "Team not found", + "backToTeams": "Back to Teams", + "memberCount": "{{count}} members", + "removeMemberSuccess": "User removed from team", + "removeMemberError": "Failed to remove user from team", + "createTeam": { + "title": "Create New Team", + "teamName": "Team Name", + "teamNamePlaceholder": "Enter team name", + "cancel": "Cancel", + "submit": "Create Team", + "nameRequired": "Team name is required", + "success": "Team created successfully", + "error": "Failed to create team" + }, + "renameTeam": { + "title": "Rename Team", + "renaming": "Renaming:", + "newTeamName": "New Team Name", + "newTeamNamePlaceholder": "Enter new team name", + "cancel": "Cancel", + "submit": "Rename Team", + "nameRequired": "Team name is required", + "success": "Team renamed successfully", + "error": "Failed to rename team" + }, + "deleteTeam": { + "success": "Team deleted successfully", + "error": "Failed to delete team. Make sure the team is empty.", + "teamMustBeEmpty": "Team must be empty before deletion" + }, + "addMemberToTeam": { + "title": "Add Member to Team", + "addingTo": "Adding to", + "selectUser": "Select User", + "selectUserPlaceholder": "Choose a user", + "selectUserRequired": "Please select a user", + "currentlyIn": "currently in", + "willBeMoved": "Note: This user will be moved from their current team to this team.", + "cancel": "Cancel", + "submit": "Add Member", + "userRequired": "Please select a user", + "success": "Member added to team successfully", + "error": "Failed to add member to team" + }, + "changeTeam": { + "label": "Change Team", + "title": "Change Team", + "changing": "Moving", + "selectTeam": "Select Team", + "selectTeamPlaceholder": "Choose a team", + "selectTeamRequired": "Please select a team", + "success": "Team changed successfully", + "error": "Failed to change team", + "submit": "Change Team" + } + } + }, + "plan": { + "currency": "Currency", + "popular": "Popular", + "current": "Current Plan", + "upgrade": "Upgrade", + "contact": "Contact Us", + "customPricing": "Custom", + "showComparison": "Compare All Features", + "hideComparison": "Hide Feature Comparison", + "featureComparison": "Feature Comparison", + "activePlan": { + "title": "Active Plan", + "subtitle": "Your current subscription details" + }, + "availablePlans": { + "title": "Available Plans", + "subtitle": "Choose the plan that fits your needs" + }, + "static": { + "title": "Billing Information", + "message": "Online billing is not currently configured. To upgrade your plan or manage subscriptions, please contact us directly.", + "contactSales": "Contact Sales", + "contactToUpgrade": "Contact us to upgrade or customize your plan", + "maxUsers": "Max Users", + "upTo": "Up to" + }, + "period": { + "month": "month" + }, + "free": { + "name": "Free", + "highlight1": "Limited Tool Usage Per week", + "highlight2": "Access to all tools", + "highlight3": "Community support" + }, + "pro": { + "name": "Pro", + "highlight1": "Unlimited Tool Usage", + "highlight2": "Advanced PDF tools", + "highlight3": "No watermarks" + }, + "enterprise": { + "name": "Enterprise", + "highlight1": "Custom pricing", + "highlight2": "Dedicated support", + "highlight3": "Latest features" + }, + "feature": { + "title": "Feature", + "pdfTools": "Basic PDF Tools", + "fileSize": "File Size Limit", + "automation": "Automate tool workflows", + "api": "API Access", + "priority": "Priority Support", + "customPricing": "Custom Pricing" + } + }, + "subscription": { + "status": { + "active": "Active", + "pastDue": "Past Due", + "canceled": "Canceled", + "incomplete": "Incomplete", + "trialing": "Trial", + "none": "No Subscription" + }, + "renewsOn": "Renews on {{date}}", + "cancelsOn": "Cancels on {{date}}" + }, + "billing": { + "manageBilling": "Manage Billing", + "portal": { + "error": "Failed to open billing portal" + } + }, + "payment": { + "preparing": "Preparing your checkout...", + "upgradeTitle": "Upgrade to {{planName}}", + "success": "Payment Successful!", + "successMessage": "Your subscription has been activated successfully. You will receive a confirmation email shortly.", + "autoClose": "This window will close automatically...", + "error": "Payment Error" + }, + "firstLogin": { + "title": "First Time Login", + "welcomeTitle": "Welcome!", + "welcomeMessage": "For security reasons, you must change your password on your first login.", + "loggedInAs": "Logged in as", + "error": "Error", + "currentPassword": "Current Password", + "enterCurrentPassword": "Enter your current password", + "newPassword": "New Password", + "enterNewPassword": "Enter new password (min 8 characters)", + "confirmPassword": "Confirm New Password", + "reEnterNewPassword": "Re-enter new password", + "changePassword": "Change Password", + "allFieldsRequired": "All fields are required", + "passwordsDoNotMatch": "New passwords do not match", + "passwordTooShort": "Password must be at least 8 characters", + "passwordMustBeDifferent": "New password must be different from current password", + "passwordChangedSuccess": "Password changed successfully! Please log in again.", + "passwordChangeFailed": "Failed to change password. Please check your current password." + }, + "invite": { + "welcome": "Welcome to Stirling PDF", + "invalidToken": "Invalid invitation link", + "validationError": "Failed to validate invitation link", + "passwordRequired": "Password is required", + "passwordTooShort": "Password must be at least 6 characters", + "passwordMismatch": "Passwords do not match", + "acceptError": "Failed to create account", + "validating": "Validating invitation...", + "invalidInvitation": "Invalid Invitation", + "goToLogin": "Go to Login", + "welcomeTitle": "You've been invited!", + "welcomeSubtitle": "Complete your account setup to get started", + "accountFor": "Creating account for", + "linkExpires": "Link expires", + "email": "Email address", + "emailPlaceholder": "Enter your email address", + "emailRequired": "Email address is required", + "invalidEmail": "Invalid email address", + "choosePassword": "Choose a password", + "passwordPlaceholder": "Enter your password", + "confirmPassword": "Confirm password", + "confirmPasswordPlaceholder": "Re-enter your password", + "createAccount": "Create Account", + "creating": "Creating Account...", + "alreadyHaveAccount": "Already have an account?", + "signIn": "Sign in" + }, + "audit": { + "error": { + "title": "Error loading audit system" + }, + "notAvailable": "Audit system not available", + "notAvailableMessage": "The audit system is not configured or not available.", + "disabled": "Audit logging is disabled", + "disabledMessage": "Enable audit logging in your application configuration to track system events.", + "systemStatus": { + "title": "System Status", + "status": "Audit Logging", + "enabled": "Enabled", + "disabled": "Disabled", + "level": "Audit Level", + "retention": "Retention Period", + "days": "days", + "totalEvents": "Total Events" + }, + "tabs": { + "dashboard": "Dashboard", + "events": "Audit Events", + "export": "Export" + }, + "charts": { + "title": "Audit Dashboard", + "error": "Error loading charts", + "day": "Day", + "week": "Week", + "month": "Month", + "byType": "Events by Type", + "byUser": "Events by User", + "overTime": "Events Over Time" + }, + "events": { + "title": "Audit Events", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "error": "Error loading events", + "noEvents": "No events found", + "timestamp": "Timestamp", + "type": "Type", + "user": "User", + "ipAddress": "IP Address", + "actions": "Actions", + "viewDetails": "View Details", + "eventDetails": "Event Details", + "details": "Details" + }, + "export": { + "title": "Export Audit Data", + "description": "Export audit events to CSV or JSON format. Use filters to limit the exported data.", + "format": "Export Format", + "filters": "Filters (Optional)", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "exportButton": "Export Data", + "error": "Failed to export data" + } + }, + "usage": { + "noData": "No data available", + "error": "Error loading usage statistics", + "noDataMessage": "No usage statistics are currently available.", + "controls": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All", + "refresh": "Refresh", + "dataTypeLabel": "Data Type:", + "dataType": { + "all": "All", + "api": "API", + "ui": "UI" + } + }, + "showing": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All" + }, + "stats": { + "totalEndpoints": "Total Endpoints", + "totalVisits": "Total Visits", + "showing": "Showing", + "selectedVisits": "Selected Visits" + }, + "chart": { + "title": "Endpoint Usage Chart" + }, + "table": { + "title": "Detailed Statistics", + "endpoint": "Endpoint", + "visits": "Visits", + "percentage": "Percentage", + "noData": "No data available" + } + }, + "backendHealth": { + "checking": "Checking backend status...", + "online": "Backend Online", + "offline": "Backend Offline" + }, + "autoRedact": { + "tags": "RedaÃ§ÃŖo,Ocultar,ocultar,preto,marcador,oculto", + "title": "RedaÃ§ÃŖo AutomÃĄtica", + "header": "RedaÃ§ÃŖo AutomÃĄtica", + "colorLabel": "Cor", + "textsToRedactLabel": "Texto a redactar (separado por linhas)", + "textsToRedactPlaceholder": "ex. \\nConfidencial \\nTop-Secret", + "useRegexLabel": "Usar Regex", + "wholeWordSearchLabel": "Pesquisa de Palavra Completa", + "customPaddingLabel": "Preenchimento Extra Personalizado", + "convertPDFToImageLabel": "Converter PDF para PDF-Imagem (Usado para remover texto por trÃĄs da caixa)", + "submitButton": "Submeter" + }, + "replaceColorPdf": { + "tags": "Substituir Cor,operaçÃĩes de pÃĄgina,Back end,lado servidor" } -} \ No newline at end of file +} diff --git a/frontend/public/locales/ro-RO/translation.json b/frontend/public/locales/ro-RO/translation.json index d2668c18d..8949a7be1 100644 --- a/frontend/public/locales/ro-RO/translation.json +++ b/frontend/public/locales/ro-RO/translation.json @@ -1,4 +1,40 @@ { + "toolPanel": { + "modePrompt": { + "title": "Choose how you browse tools", + "description": "Preview both layouts and decide how you want to explore Stirling PDF tools.", + "sidebarTitle": "Sidebar mode", + "sidebarDescription": "Keep tools alongside your workspace for quick switching.", + "recommended": "Recommended", + "chooseSidebar": "Use sidebar mode", + "fullscreenTitle": "Fullscreen mode - (legacy)", + "fullscreenDescription": "Browse every tool in a catalogue that covers the workspace until you pick one.", + "chooseFullscreen": "Use fullscreen mode", + "dismiss": "Maybe later" + }, + "fullscreen": { + "showDetails": "Show Details", + "comingSoon": "Coming soon:", + "favorite": "Add to favourites", + "favorites": "Favourites", + "heading": "All tools (fullscreen view)", + "noResults": "Try adjusting your search or toggle descriptions to find what you need.", + "recommended": "Recommended", + "unfavorite": "Remove from favourites" + }, + "placeholder": "Choose a tool to get started", + "toggle": { + "fullscreen": "Switch to fullscreen mode", + "sidebar": "Switch to sidebar mode" + } + }, + "unsavedChanges": "You have unsaved changes to your PDF.", + "areYouSure": "Are you sure you want to leave?", + "unsavedChangesTitle": "Unsaved Changes", + "keepWorking": "Keep Working", + "discardChanges": "Discard & Leave", + "applyAndContinue": "Save & Leave", + "exportAndContinue": "Export & Continue", "language": { "direction": "ltr" }, @@ -18,8 +54,26 @@ "customTextDesc": "Text Personalizat", "numberPagesDesc": "Ce pagini să numeroteze, implicit 'toate', acceptă și 1-5 sau 2,5,9 etc", "customNumberDesc": "Implicit la {n}, acceptă și 'Pagina {n} din {total}', 'Text-{n}', '{nume_fisier}-{n}", - "submit": "Adaugă Numere de Pagină" + "submit": "Adaugă Numere de Pagină", + "configuration": "Configuration", + "customize": "Customize Appearance", + "pagesAndStarting": "Pages & Starting Number", + "positionAndPages": "Position & Pages", + "error": { + "failed": "Add page numbers operation failed" + }, + "results": { + "title": "Page Number Results" + }, + "preview": "Position Selection", + "previewDisclaimer": "Preview is approximate. Final output may vary due to PDF font metrics." }, + "pageSelectionPrompt": "Selecție Personalizată de Pagini (Introduceți o listă separată prin virgule a numerelor de pagini 1,5,6 sau funcții precum 2n+1) :", + "startingNumberTooltip": "The first number to display. Subsequent pages will increment from this number.", + "marginTooltip": "Distance between the page number and the edge of the page.", + "fontSizeTooltip": "Size of the page number text in points. Larger numbers create bigger text.", + "fontTypeTooltip": "Font family for the page numbers. Choose based on your document style.", + "customTextTooltip": "Optional custom format for page numbers. Use {n} as placeholder for the number. Example: \"Page {n}\" will show \"Page 1\", \"Page 2\", etc.", "pdfPrompt": "Selectează fișiere PDF", "multiPdfPrompt": "Selectează mai multe fișiere PDF (2+)", "multiPdfDropPrompt": "Selectează (sau trage și plasează) toate fișierele PDF de care ai nevoie", @@ -30,15 +84,41 @@ "uploadLimitExceededPlural": "are too large. Maximum allowed size is", "processTimeWarning": "Avertisment: Acest proces poate dura pÃĸnă la un minut ÃŽn funcție de dimensiunea fișierului", "pageOrderPrompt": "Ordinea paginilor (Introdu o listă separată prin virgulă de numere de pagină):", - "pageSelectionPrompt": "Selecție Personalizată de Pagini (Introduceți o listă separată prin virgule a numerelor de pagini 1,5,6 sau funcții precum 2n+1) :", "goToPage": "Mergi la pagină", "true": "Adevărat", "false": "Fals", "unknown": "Necunoscut", + "app": { + "description": "The Free Adobe Acrobat alternative (10M+ Downloads)" + }, "save": "Salvează", "saveToBrowser": "Salvează ÃŽn Browser", + "download": "Descarcă", + "pin": "Pin File (keep active after tool run)", + "unpin": "Unpin File (replace after tool run)", + "undoOperationTooltip": "Click to undo the last operation and restore the original files", + "undo": "Undo", + "moreOptions": "More Options", + "editYourNewFiles": "Edit your new file(s)", "close": "Închide", + "openInViewer": "Open in Viewer", + "confirmClose": "Confirm Close", + "confirmCloseMessage": "Are you sure you want to close this file?", + "confirmCloseCancel": "Cancel", + "confirmCloseConfirm": "Close File", + "fileSelected": "Selected: {{filename}}", + "chooseFile": "Choose File", "filesSelected": "fișiere selectate", + "files": { + "title": "Files", + "upload": "Upload", + "uploadFiles": "Upload Files", + "addFiles": "Add files", + "selectFromWorkbench": "Select files from the workbench or ", + "selectMultipleFromWorkbench": "Select at least {{count}} files from the workbench or ", + "created": "Created", + "size": "File Size" + }, "noFavourites": "Niciun favorit adăugat", "downloadComplete": "Descărcare Completă", "bored": "Plictisit așteptÃĸnd?", @@ -56,7 +136,10 @@ }, "error": { "pdfPassword": "Documentul PDF este protejat cu parolă și fie parola nu a fost furnizată, fie a fost incorectă", + "encryptedPdfMustRemovePassword": "This PDF is encrypted or password-protected. Please unlock it before converting to PDF/A.", + "incorrectPasswordProvided": "The PDF password is incorrect or not provided.", "_value": "Eroare", + "dismissAllErrors": "Dismiss All Errors", "sorry": "Ne pare rău pentru problemă!", "needHelp": "Ai nevoie de ajutor / Ai găsit o problemă?", "contactTip": "Dacă ÃŽntÃĸmpini ÃŽn continuare dificultăți, nu ezita să ne contactezi pentru ajutor. Poți deschide un tichet pe pagina noastră GitHub sau ne poți contacta prin Discord:", @@ -71,6 +154,10 @@ "githubSubmit": "GitHub - Deschide un tichet", "discordSubmit": "Discord - Trimite o postare de Suport" }, + "warning": { + "tooltipTitle": "Warning" + }, + "edit": "Edit", "delete": "Șterge", "username": "Nume de utilizator", "password": "Parolă", @@ -82,6 +169,7 @@ "green": "Verde", "blue": "Albastru", "custom": "Personalizat...", + "comingSoon": "Coming soon", "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", @@ -115,12 +203,14 @@ "page": "Page", "pages": "Pages", "loading": "Loading...", + "review": "Review", "addToDoc": "Add to Document", "reset": "Reset", "apply": "Apply", "noFileSelected": "No file selected. Please upload one.", "legal": { "privacy": "Privacy Policy", + "iAgreeToThe": "I agree to all of the", "terms": "Terms and Conditions", "accessibility": "Accessibility", "cookie": "Cookie Policy", @@ -160,6 +250,7 @@ "title": "Do you want make Stirling PDF better?", "paragraph1": "Stirling PDF has opt in analytics to help us improve the product. We do not track any personal information or file contents.", "paragraph2": "Please consider enabling analytics to help Stirling-PDF grow and to allow us to understand our users better.", + "learnMore": "Learn more", "enable": "Enable analytics", "disable": "Disable analytics", "settings": "You can change the settings for analytics in the config/settings.yml file" @@ -203,6 +294,54 @@ "cacheInputs": { "name": "Salvează intrările formularului", "help": "Activează pentru a stoca intrările utilizate anterior pentru rulări viitoare" + }, + "general": { + "title": "General", + "description": "Configure general application preferences.", + "account": "Account", + "accountDescription": "Manage your account settings", + "user": "User", + "signedInAs": "Signed in as", + "logout": "Log out", + "enableFeatures": { + "title": "For System Administrators", + "intro": "Enable user authentication, team management, and workspace features for your organization.", + "action": "Configure", + "and": "and", + "benefit": "Enables user roles, team collaboration, admin controls, and enterprise features.", + "learnMore": "Learn more in documentation", + "dismiss": "Dismiss" + }, + "autoUnzip": "Auto-unzip API responses", + "autoUnzipDescription": "Automatically extract files from ZIP responses", + "autoUnzipTooltip": "Automatically extract ZIP files returned from API operations. Disable to keep ZIP files intact. This does not affect automation workflows.", + "autoUnzipFileLimit": "Auto-unzip file limit", + "autoUnzipFileLimitDescription": "Maximum number of files to extract from ZIP", + "autoUnzipFileLimitTooltip": "Only unzip if the ZIP contains this many files or fewer. Set higher to extract larger ZIPs.", + "defaultToolPickerMode": "Default tool picker mode", + "defaultToolPickerModeDescription": "Choose whether the tool picker opens in fullscreen or sidebar by default", + "mode": { + "fullscreen": "Fullscreen", + "sidebar": "Sidebar" + } + }, + "hotkeys": { + "title": "Keyboard Shortcuts", + "description": "Hover a tool to see its shortcut or customise it below. Click \"Change shortcut\" and press a new key combination. Press Esc to cancel.", + "errorModifier": { + "mac": "Include ⌘ (Command), âŒĨ (Option), or another modifier in your shortcut.", + "windows": "Include Ctrl, Alt, or another modifier in your shortcut." + }, + "errorConflict": "Shortcut already used by {{tool}}.", + "none": "Not assigned", + "customBadge": "Custom", + "defaultLabel": "Default: {{shortcut}}", + "capturing": "Press keysâ€Ļ (Esc to cancel)", + "change": "Change shortcut", + "reset": "Reset", + "shortcut": "Shortcut", + "noShortcut": "No shortcut set", + "searchPlaceholder": "Search tools..." } }, "changeCreds": { @@ -274,8 +413,10 @@ "top20": "Top 20", "all": "All", "refresh": "Refresh", - "includeHomepage": "Include Homepage ('/')", - "includeLoginPage": "Include Login Page ('/login')", + "dataTypeLabel": "Data Type:", + "dataTypeAll": "All", + "dataTypeApi": "API", + "dataTypeUi": "UI", "totalEndpoints": "Total Endpoints", "totalVisits": "Total Visits", "showing": "Showing", @@ -290,7 +431,9 @@ "top": "Top", "numberOfVisits": "Number of Visits", "visitsTooltip": "Visits: {0} ({1}% of total)", - "retry": "Retry" + "retry": "Retry", + "includeHomepage": "Include Homepage ('/')", + "includeLoginPage": "Include Login Page ('/login')" }, "database": { "title": "Import/Export Bază de Date", @@ -331,22 +474,310 @@ "alphabetical": "Alphabetical", "globalPopularity": "Global Popularity", "sortBy": "Sort by:", + "mobile": { + "brandAlt": "Stirling PDF logo", + "openFiles": "Open files", + "swipeHint": "Swipe left or right to switch views", + "tools": "Tools", + "toolsSlide": "Tool selection panel", + "viewSwitcher": "Switch workspace view", + "workbenchSlide": "Workspace panel", + "workspace": "Workspace" + }, "multiTool": { + "tags": "multiple,tools", "title": "Instrument multiplu PDF", "desc": "Unifică, rotește, rearanjează și elimină pagini" }, "merge": { + "tags": "combine,join,unite", "title": "Unifică", "desc": "Unifică cu ușurință mai multe fișiere PDF ÃŽntr-unul singur." }, "split": { + "tags": "divide,separate,break", "title": "Desparte", "desc": "Desparte fișierele PDF ÃŽn mai multe documente." }, "rotate": { + "tags": "turn,flip,orient", "title": "Rotește", "desc": "Rotește cu ușurință fișierele PDF." }, + "convert": { + "tags": "transform,change", + "title": "Convertește", + "desc": "Convert files between different formats" + }, + "pdfOrganiser": { + "tags": "organize,rearrange,reorder", + "title": "Organizează", + "desc": "Elimină/rearanjează pagini ÃŽn orice ordine" + }, + "addImage": { + "tags": "insert,embed,place", + "title": "Adaugă imagine", + "desc": "Adaugă o imagine ÃŽntr-o locație specifică pe PDF (ÃŽn curs de dezvoltare)" + }, + "addAttachments": { + "tags": "embed,attach,include", + "title": "Add Attachments", + "desc": "Add or remove embedded files (attachments) to/from a PDF" + }, + "watermark": { + "tags": "stamp,mark,overlay", + "title": "Adaugă Filigran", + "desc": "Adaugă un filigran personalizat la documentul PDF." + }, + "removePassword": { + "tags": "unlock", + "title": "Elimină Parola", + "desc": "Elimină protecția cu parolă din documentul PDF." + }, + "compress": { + "tags": "shrink,reduce,optimize", + "title": "Comprimă", + "desc": "Comprimă fișierele PDF pentru a reduce dimensiunea lor." + }, + "unlockPDFForms": { + "tags": "unlock,enable,edit", + "title": "Unlock PDF Forms", + "desc": "Remove read-only property of form fields in a PDF document." + }, + "changeMetadata": { + "tags": "edit,modify,update", + "title": "Schimbă Metadatele", + "desc": "Schimbă/Elimină/Adaugă metadate ÃŽntr-un document PDF." + }, + "ocr": { + "tags": "extract,scan", + "title": "OCR / Curățare scanări", + "desc": "Curăță scanările și detectează textul din imaginile dintr-un PDF și ÃŽl adaugă ca text." + }, + "extractImages": { + "tags": "pull,save,export", + "title": "Extrage Imagini", + "desc": "Extrage toate imaginile dintr-un PDF și le salvează ÃŽntr-un fișier zip." + }, + "scannerImageSplit": { + "tags": "detect,split,photos", + "title": "Detect & Split Scanned Photos", + "desc": "Detect and split scanned photos into separate pages" + }, + "sign": { + "tags": "signature,autograph", + "title": "Semnează", + "desc": "Adaugă o semnătură la documentul PDF prin desenare, text sau imagine." + }, + "flatten": { + "tags": "simplify,remove,interactive", + "title": "Nivelare", + "desc": "Elimină toate elementele interactive și formularele dintr-un PDF." + }, + "certSign": { + "tags": "authenticate,PEM,P12,official,encrypt,sign,certificate,PKCS12,JKS,server,manual,auto", + "title": "Semnare cu certificat", + "desc": "Semnează un PDF cu un certificat/cheie (PEM/P12)" + }, + "repair": { + "tags": "fix,restore", + "title": "Repară", + "desc": "Încearcă să repare un document PDF corupt/defect." + }, + "removeBlanks": { + "tags": "delete,clean,empty", + "title": "Elimină pagini goale", + "desc": "Detectează și elimină paginile goale dintr-un document." + }, + "removeAnnotations": { + "tags": "delete,clean,strip", + "title": "Elimină Adnotările", + "desc": "Elimină toate comentariile/adnotările dintr-un PDF" + }, + "compare": { + "tags": "difference", + "title": "Compară", + "desc": "Compară și arată diferențele dintre 2 documente PDF." + }, + "removeCertSign": { + "tags": "remove,delete,unlock", + "title": "Elimină Semnătura cu Certificat", + "desc": "Elimină semnătura cu certificat din PDF" + }, + "pageLayout": { + "tags": "layout,arrange,combine", + "title": "Aspect Multi-Pagină", + "desc": "Îmbină mai multe pagini ale unui document PDF ÃŽntr-o singură pagină" + }, + "bookletImposition": { + "tags": "booklet,print,binding", + "title": "Booklet Imposition", + "desc": "Create booklets with proper page ordering and multi-page layout for printing and binding" + }, + "scalePages": { + "tags": "resize,adjust,scale", + "title": "Ajustează dimensiunea/scala paginii", + "desc": "Modifică dimensiunea/scala paginii și/sau a conținutului său." + }, + "addPageNumbers": { + "tags": "number,pagination,count", + "title": "Adaugă Numere de Pagină", + "desc": "Adaugă numere de pagină ÃŽn tot documentul ÃŽntr-o locație setată" + }, + "autoRename": { + "tags": "auto-detect,header-based,organize,relabel", + "title": "Auto Rename PDF File", + "desc": "Auto renames a PDF file based on its detected header" + }, + "adjustContrast": { + "tags": "contrast,brightness,saturation", + "title": "Ajustează Culorile/Contrastul", + "desc": "Ajustează Contrastul, Saturația și Luminozitatea unui PDF" + }, + "crop": { + "tags": "trim,cut,resize", + "title": "Decupează PDF", + "desc": "Decupează un PDF pentru a-i reduce dimensiunea (menține textul!)" + }, + "autoSplitPDF": { + "tags": "auto,split,QR", + "title": "Desparte Automat Paginile", + "desc": "Desparte Automat PDF-ul Scanat cu separator fizic de pagini scanate cu Cod QR" + }, + "sanitize": { + "tags": "clean,purge,remove", + "title": "Sanitise", + "desc": "Remove potentially harmful elements from PDF files" + }, + "getPdfInfo": { + "tags": "info,metadata,details", + "title": "Obține TOATE Informațiile despre PDF", + "desc": "Extrage orice și toate informațiile posibile despre PDF-uri" + }, + "pdfToSinglePage": { + "tags": "combine,merge,single", + "title": "PDF ÃŽntr-o Singură Pagină Mare", + "desc": "Îmbină toate paginile PDF ÃŽntr-o singură pagină mare" + }, + "showJS": { + "tags": "javascript,code,script", + "title": "Arată Javascript", + "desc": "Caută și afișează orice JS injectat ÃŽntr-un PDF" + }, + "redact": { + "tags": "censor,blackout,hide", + "title": "Manual Redaction", + "desc": "Redacts a PDF based on selected text, drawn shapes and/or selected page(s)" + }, + "splitBySections": { + "tags": "split,sections,divide", + "title": "Split PDF by Sections", + "desc": "Divide each page of a PDF into smaller horizontal and vertical sections" + }, + "addStamp": { + "tags": "stamp,mark,seal", + "title": "Add Stamp to PDF", + "desc": "Add text or add image stamps at set locations" + }, + "removeImage": { + "tags": "remove,delete,clean", + "title": "Elimină imagine", + "desc": "Elimină imaginea din PDF pentru a reduce dimensiunea fișierului" + }, + "splitByChapters": { + "tags": "split,chapters,structure", + "title": "Split PDF by Chapters", + "desc": "Split a PDF into multiple files based on its chapter structure." + }, + "validateSignature": { + "tags": "validate,verify,certificate", + "title": "Validate PDF Signature", + "desc": "Verify digital signatures and certificates in PDF documents" + }, + "swagger": { + "tags": "API,documentation,test", + "title": "API Documentation", + "desc": "View API documentation and test endpoints" + }, + "scannerEffect": { + "tags": "scan,simulate,create", + "title": "Scanner Effect", + "desc": "Create a PDF that looks like it was scanned" + }, + "editTableOfContents": { + "tags": "bookmarks,contents,edit", + "title": "Edit Table of Contents", + "desc": "Add or edit bookmarks and table of contents in PDF documents" + }, + "manageCertificates": { + "tags": "certificates,import,export", + "title": "Manage Certificates", + "desc": "Import, export, or delete digital certificate files used for signing PDFs." + }, + "read": { + "tags": "view,open,display", + "title": "Read", + "desc": "View and annotate PDFs. Highlight text, draw, or insert comments for review and collaboration." + }, + "reorganizePages": { + "tags": "rearrange,reorder,organize", + "title": "Reorganize Pages", + "desc": "Rearrange, duplicate, or delete PDF pages with visual drag-and-drop control." + }, + "extractPages": { + "tags": "pull,select,copy", + "title": "Extrage Pagini", + "desc": "Extract specific pages from a PDF document" + }, + "removePages": { + "tags": "delete,extract,exclude", + "title": "Elimină", + "desc": "Șterge paginile nedorite din documentul PDF." + }, + "autoSizeSplitPDF": { + "tags": "auto,split,size", + "title": "Despărțire Automată după Dimensiune/Număr", + "desc": "Împarte un singur PDF ÃŽn mai multe documente bazat pe dimensiune, număr de pagini sau număr de documente" + }, + "replaceColor": { + "title": "Replace & Invert Colour", + "desc": "Replace or invert colours in PDF documents" + }, + "devApi": { + "tags": "API,development,documentation", + "title": "API", + "desc": "Link to API documentation" + }, + "devFolderScanning": { + "tags": "automation,folder,scanning", + "title": "Automated Folder Scanning", + "desc": "Link to automated folder scanning guide" + }, + "devSsoGuide": { + "title": "SSO Guide", + "desc": "Link to SSO guide" + }, + "devAirgapped": { + "title": "Air-gapped Setup", + "desc": "Link to air-gapped setup guide" + }, + "addPassword": { + "title": "Adaugă Parolă", + "desc": "Criptează documentul PDF cu o parolă." + }, + "changePermissions": { + "title": "Schimbă Permisiunile", + "desc": "Change document restrictions and permissions" + }, + "automate": { + "tags": "workflow,sequence,automation", + "title": "Automate", + "desc": "Build multi-step workflows by chaining together PDF actions. Ideal for recurring tasks." + }, + "overlay-pdfs": { + "desc": "Suprapune PDF-uri peste alt PDF", + "title": "Suprapune PDF-uri" + }, "imageToPDF": { "title": "Imagine ÃŽn PDF", "desc": "Convertește o imagine (PNG, JPEG, GIF) ÃŽn PDF." @@ -355,18 +786,6 @@ "title": "PDF ÃŽn Imagine", "desc": "Convertește un fișier PDF ÃŽn imagine (PNG, JPEG, GIF)." }, - "pdfOrganiser": { - "title": "Organizează", - "desc": "Elimină/rearanjează pagini ÃŽn orice ordine" - }, - "addImage": { - "title": "Adaugă imagine", - "desc": "Adaugă o imagine ÃŽntr-o locație specifică pe PDF (ÃŽn curs de dezvoltare)" - }, - "watermark": { - "title": "Adaugă Filigran", - "desc": "Adaugă un filigran personalizat la documentul PDF." - }, "permissions": { "title": "Schimbă permisiuni", "desc": "Schimbă permisiunile documentului PDF" @@ -375,38 +794,10 @@ "title": "Elimină", "desc": "Șterge paginile nedorite din documentul PDF." }, - "addPassword": { - "title": "Adaugă Parolă", - "desc": "Criptează documentul PDF cu o parolă." - }, - "removePassword": { - "title": "Elimină Parola", - "desc": "Elimină protecția cu parolă din documentul PDF." - }, - "compress": { - "title": "Comprimă", - "desc": "Comprimă fișierele PDF pentru a reduce dimensiunea lor." - }, - "unlockPDFForms": { - "title": "Unlock PDF Forms", - "desc": "Remove read-only property of form fields in a PDF document." - }, - "changeMetadata": { - "title": "Schimbă Metadatele", - "desc": "Schimbă/Elimină/Adaugă metadate ÃŽntr-un document PDF." - }, "fileToPDF": { "title": "Convertește fișierul ÃŽn PDF", "desc": "Convertește aproape orice fișier ÃŽn format PDF (DOCX, PNG, XLS, PPT, TXT și altele)." }, - "ocr": { - "title": "OCR / Curățare scanări", - "desc": "Curăță scanările și detectează textul din imaginile dintr-un PDF și ÃŽl adaugă ca text." - }, - "extractImages": { - "title": "Extrage Imagini", - "desc": "Extrage toate imaginile dintr-un PDF și le salvează ÃŽntr-un fișier zip." - }, "pdfToPDFA": { "title": "PDF ÃŽn PDF/A", "desc": "Convertește un document PDF ÃŽn format PDF/A pentru stocare pe termen lung." @@ -435,70 +826,14 @@ "title": "Detectează/Împarte poze scanate", "desc": "Împarte mai multe poze dintr-o poză/PDF." }, - "sign": { - "title": "Semnează", - "desc": "Adaugă o semnătură la documentul PDF prin desenare, text sau imagine." - }, - "flatten": { - "title": "Nivelare", - "desc": "Elimină toate elementele interactive și formularele dintr-un PDF." - }, - "repair": { - "title": "Repară", - "desc": "Încearcă să repare un document PDF corupt/defect." - }, - "removeBlanks": { - "title": "Elimină pagini goale", - "desc": "Detectează și elimină paginile goale dintr-un document." - }, - "removeAnnotations": { - "title": "Elimină Adnotările", - "desc": "Elimină toate comentariile/adnotările dintr-un PDF" - }, - "compare": { - "title": "Compară", - "desc": "Compară și arată diferențele dintre 2 documente PDF." - }, - "certSign": { - "title": "Semnare cu certificat", - "desc": "Semnează un PDF cu un certificat/cheie (PEM/P12)" - }, - "removeCertSign": { - "title": "Elimină Semnătura cu Certificat", - "desc": "Elimină semnătura cu certificat din PDF" - }, - "pageLayout": { - "title": "Aspect Multi-Pagină", - "desc": "Îmbină mai multe pagini ale unui document PDF ÃŽntr-o singură pagină" - }, - "scalePages": { - "title": "Ajustează dimensiunea/scala paginii", - "desc": "Modifică dimensiunea/scala paginii și/sau a conținutului său." - }, "pipeline": { "title": "Pipeline (Avansat)", "desc": "Rulează multiple acțiuni pe PDF-uri definind scripturi pipeline" }, - "addPageNumbers": { - "title": "Adaugă Numere de Pagină", - "desc": "Adaugă numere de pagină ÃŽn tot documentul ÃŽntr-o locație setată" - }, "auto-rename": { "title": "Redenumire Automată Fișier PDF", "desc": "Redenumește automat un fișier PDF bazat pe antetul detectat" }, - "adjustContrast": { - "title": "Ajustează Culorile/Contrastul", - "desc": "Ajustează Contrastul, Saturația și Luminozitatea unui PDF" - }, - "crop": { - "title": "Decupează PDF", - "desc": "Decupează un PDF pentru a-i reduce dimensiunea (menține textul!)" - }, - "autoSplitPDF": { - "title": "Desparte Automat Paginile", - "desc": "Desparte Automat PDF-ul Scanat cu separator fizic de pagini scanate cu Cod QR" - }, "sanitizePDF": { "title": "Igienizează", "desc": "Elimină scripturile și alte elemente din fișierele PDF" @@ -519,30 +854,14 @@ "title": "PDF to Markdown", "desc": "Converts any PDF to Markdown" }, - "getPdfInfo": { - "title": "Obține TOATE Informațiile despre PDF", - "desc": "Extrage orice și toate informațiile posibile despre PDF-uri" - }, "pageExtracter": { "title": "Extrage pagină(i)", "desc": "Extrage paginile selectate din PDF" }, - "pdfToSinglePage": { - "title": "PDF ÃŽntr-o Singură Pagină Mare", - "desc": "Îmbină toate paginile PDF ÃŽntr-o singură pagină mare" - }, - "showJS": { - "title": "Arată Javascript", - "desc": "Caută și afișează orice JS injectat ÃŽntr-un PDF" - }, "autoRedact": { "title": "Redactare Automată", "desc": "Redactează automat (ÃŽnnegrește) text ÃŽntr-un PDF bazat pe textul de intrare" }, - "redact": { - "title": "Manual Redaction", - "desc": "Redacts a PDF based on selected text, drawn shapes and/or selected page(s)" - }, "PDFToCSV": { "title": "PDF ÃŽn CSV", "desc": "Extrage Tabelele dintr-un PDF convertindu-l ÃŽn CSV" @@ -551,10 +870,6 @@ "title": "Despărțire Automată după Dimensiune/Număr", "desc": "Împarte un singur PDF ÃŽn mai multe documente bazat pe dimensiune, număr de pagini sau număr de documente" }, - "overlay-pdfs": { - "title": "Suprapune PDF-uri", - "desc": "Suprapune PDF-uri peste alt PDF" - }, "split-by-sections": { "title": "Împarte PDF pe Secțiuni", "desc": "Împarte fiecare pagină a unui PDF ÃŽn secțiuni mai mici orizontale și verticale" @@ -563,43 +878,17 @@ "title": "Adaugă Ștampilă la PDF", "desc": "Adaugă text sau adaugă ștampile imagine ÃŽn locații setate" }, - "removeImage": { - "title": "Elimină imagine", - "desc": "Elimină imaginea din PDF pentru a reduce dimensiunea fișierului" - }, - "splitByChapters": { - "title": "Split PDF by Chapters", - "desc": "Split a PDF into multiple files based on its chapter structure." - }, - "validateSignature": { - "title": "Validate PDF Signature", - "desc": "Verify digital signatures and certificates in PDF documents" - }, "replace-color": { "title": "Replace and Invert Color", "desc": "Replace color for text and background in PDF and invert full color of pdf to reduce file size" }, - "convert": { - "title": "Convertește" - }, "attachments": { "title": "Add attachments" }, - "extractPages": { - "title": "Extrage Pagini" - }, - "removePages": { - "title": "Elimină", - "desc": "Șterge paginile nedorite din documentul PDF." - }, "removeImagePdf": { "title": "Elimină imagine", "desc": "Elimină imaginea din PDF pentru a reduce dimensiunea fișierului" }, - "autoSizeSplitPDF": { - "title": "Despărțire Automată după Dimensiune/Număr", - "desc": "Împarte un singur PDF ÃŽn mai multe documente bazat pe dimensiune, număr de pagini sau număr de documente" - }, "adjust-contrast": { "title": "Ajustează Culorile/Contrastul", "desc": "Ajustează Contrastul, Saturația și Luminozitatea unui PDF" @@ -607,11 +896,12 @@ "replaceColorPdf": { "title": "Replace and Invert Color", "desc": "Replace color for text and background in PDF and invert full color of pdf to reduce file size" - }, - "changePermissions": { - "title": "Schimbă Permisiunile" } }, + "landing": { + "addFiles": "Add Files", + "uploadFromComputer": "Upload from computer" + }, "viewPdf": { "tags": "vizualizare,citește,adnotează,text,imagine", "title": "View/Edit PDF", @@ -645,17 +935,39 @@ "merge": { "tags": "unificare,Operații pagină,Back end,server side", "title": "Unire", + "removeDigitalSignature": { + "label": "Remove digital signature in the merged file?", + "tooltip": { + "title": "Remove Digital Signature", + "description": "Digital signatures will be invalidated when merging files. Check this to remove them from the final merged PDF." + } + }, + "generateTableOfContents": { + "label": "Generate table of contents in the merged file?", + "tooltip": { + "title": "Generate Table of Contents", + "description": "Automatically creates a clickable table of contents in the merged PDF based on the original file names and page numbers." + } + }, + "submit": "Unire", + "sortBy": { + "description": "Files will be merged in the order they're selected. Drag to reorder or sort below.", + "label": "Sort By", + "filename": "Nume Fișier", + "dateModified": "Date Modified", + "ascending": "Ascending", + "descending": "Descending", + "sort": "Sort" + }, + "error": { + "failed": "An error occurred while merging the PDFs." + }, "header": "Unirea mai multor PDF-uri (2+)", "sortByName": "Sortează după nume", "sortByDate": "Sortează după dată", - "removeCertSign": "Elimină semnătura digitală ÃŽn fișierul unificat?", - "submit": "Unire", - "sortBy": { - "filename": "Nume Fișier" - } + "removeCertSign": "Elimină semnătura digitală ÃŽn fișierul unificat?" }, "split": { - "tags": "Operații pagină,divizare,Pagină Multiplă,tăiere,server side", "title": "Împarte PDF", "header": "Împarte PDF", "desc": { @@ -671,25 +983,249 @@ "splitPages": "Introduceți paginile pe care să le ÃŽmpărțiți:", "submit": "Împarte", "steps": { + "chooseMethod": "Choose Method", "settings": "Setări" }, + "settings": { + "selectMethodFirst": "Please select a split method first" + }, + "error": { + "failed": "An error occurred while splitting the PDF." + }, + "method": { + "label": "Choose split method", + "placeholder": "Select how to split the PDF" + }, "methods": { + "prefix": { + "splitAt": "Split at", + "splitBy": "Split by" + }, + "byPages": { + "name": "Page Numbers", + "desc": "Extract specific pages (1,3,5-10)", + "tooltip": "Enter page numbers separated by commas or ranges with hyphens" + }, + "bySections": { + "name": "Sections", + "desc": "Divide pages into grid sections", + "tooltip": "Split each page into horizontal and vertical sections" + }, "bySize": { - "name": "Dimensiune Fișier" + "name": "Dimensiune Fișier", + "desc": "Limit maximum file size", + "tooltip": "Specify maximum file size (e.g. 10MB, 500KB)" + }, + "byPageCount": { + "name": "Page Count", + "desc": "Fixed pages per file", + "tooltip": "Enter the number of pages for each split file" + }, + "byDocCount": { + "name": "Document Count", + "desc": "Create specific number of files", + "tooltip": "Enter how many files you want to create" + }, + "byChapters": { + "name": "Chapters", + "desc": "Split at bookmark boundaries", + "tooltip": "Uses PDF bookmarks to determine split points" + }, + "byPageDivider": { + "name": "Page Divider", + "desc": "Auto-split with divider sheets", + "tooltip": "Use QR code divider sheets between documents when scanning" } }, "value": { "fileSize": { - "label": "Dimensiune Fișier" + "label": "Dimensiune Fișier", + "placeholder": "e.g. 10MB, 500KB" + }, + "pageCount": { + "label": "Pages per File", + "placeholder": "e.g. 5, 10" + }, + "docCount": { + "label": "Number of Files", + "placeholder": "e.g. 3, 5" } - } + }, + "tooltip": { + "header": { + "title": "Split Methods Overview" + }, + "byPages": { + "title": "Split at Page Numbers", + "text": "Split your PDF at specific page numbers. Using 'n' splits after page n. Using 'n-m' splits before page n and after page m.", + "bullet1": "Single split points: 3,7 (splits after pages 3 and 7)", + "bullet2": "Range split points: 3-8 (splits before page 3 and after page 8)", + "bullet3": "Mixed: 2,5-10,15 (splits after page 2, before page 5, after page 10, and after page 15)" + }, + "bySections": { + "title": "Split by Grid Sections", + "text": "Divide each page into a grid of sections. Useful for splitting documents with multiple columns or extracting specific areas.", + "bullet1": "Horizontal: Number of rows to create", + "bullet2": "Vertical: Number of columns to create", + "bullet3": "Merge: Combine all sections into one PDF" + }, + "bySize": { + "title": "Split by File Size", + "text": "Create multiple PDFs that don't exceed a specified file size. Ideal for file size limitations or email attachments.", + "bullet1": "Use MB for larger files (e.g., 10MB)", + "bullet2": "Use KB for smaller files (e.g., 500KB)", + "bullet3": "System will split at page boundaries" + }, + "byCount": { + "title": "Split by Count", + "text": "Create multiple PDFs with a specific number of pages or documents each.", + "bullet1": "Page Count: Fixed number of pages per file", + "bullet2": "Document Count: Fixed number of output files", + "bullet3": "Useful for batch processing workflows" + }, + "byChapters": { + "title": "Split by Chapters", + "text": "Use PDF bookmarks to automatically split at chapter boundaries. Requires PDFs with bookmark structure.", + "bullet1": "Bookmark Level: Which level to split on (1=top level)", + "bullet2": "Include Metadata: Preserve document properties", + "bullet3": "Allow Duplicates: Handle repeated bookmark names" + }, + "byDocCount": { + "bullet1": "Enter the number of output files you want", + "bullet2": "Pages are distributed as evenly as possible", + "bullet3": "Useful when you need a specific number of files", + "text": "Create a specific number of output files by evenly distributing pages across them.", + "title": "Split by Document Count" + }, + "byPageCount": { + "bullet1": "Enter the number of pages per output file", + "bullet2": "Last file may have fewer pages if not evenly divisible", + "bullet3": "Useful for batch processing workflows", + "text": "Create multiple PDFs with a specific number of pages each. Perfect for creating uniform document chunks.", + "title": "Split by Page Count" + }, + "byPageDivider": { + "bullet1": "Print divider sheets from the download link", + "bullet2": "Insert divider sheets between your documents", + "bullet3": "Scan all documents together as one PDF", + "bullet4": "Upload - divider pages are automatically detected and removed", + "bullet5": "Enable Duplex Mode if scanning both sides of divider sheets", + "text": "Automatically split scanned documents using physical divider sheets with QR codes. Perfect for processing multiple documents scanned together.", + "title": "Split by Page Divider" + } + }, + "methodSelection": { + "tooltip": { + "bullet1": "Click on a method card to select it", + "bullet2": "Hover over each card to see a quick description", + "bullet3": "The settings step will appear after you select a method", + "bullet4": "You can change methods at any time before processing", + "header": { + "text": "Choose how you want to split your PDF document. Each method is optimized for different use cases and document types.", + "title": "Split Method Selection" + }, + "title": "Choose Your Split Method" + } + }, + "selectMethod": "Select a split method", + "tags": "Operații pagină,divizare,Pagină Multiplă,tăiere,server side" }, "rotate": { - "tags": "server side", "title": "Rotește PDF", + "submit": "Rotește", + "selectRotation": "Select Rotation Angle (Clockwise)", + "error": { + "failed": "An error occurred while rotating the PDF." + }, + "preview": { + "title": "Rotation Preview" + }, + "rotateLeft": "Rotate Anticlockwise", + "rotateRight": "Rotate Clockwise", + "tooltip": { + "header": { + "title": "Rotate Settings Overview" + }, + "description": { + "text": "Rotate your PDF pages clockwise or anticlockwise in 90-degree increments. All pages in the PDF will be rotated. The preview shows how your document will look after rotation." + }, + "controls": { + "title": "Controls", + "text": "Use the rotation buttons to adjust orientation. Left button rotates anticlockwise, right button rotates clockwise. Each click rotates by 90 degrees." + } + }, + "tags": "server side", "header": "Rotește PDF", - "selectAngle": "Selectați un unghi de rotație (ÃŽn multiplicate de 90 de grade):", - "submit": "Rotește" + "selectAngle": "Selectați un unghi de rotație (ÃŽn multiplicate de 90 de grade):" + }, + "convert": { + "title": "Convertește", + "desc": "Convert files between different formats", + "files": "Files", + "selectFilesPlaceholder": "Select files in the main view to get started", + "settings": "Setări", + "conversionCompleted": "Conversion completed", + "results": "Results", + "defaultFilename": "converted_file", + "conversionResults": "Conversion Results", + "convertFrom": "Convert from", + "convertTo": "Convert to", + "sourceFormatPlaceholder": "Source format", + "targetFormatPlaceholder": "Target format", + "selectSourceFormatFirst": "Select a source format first", + "outputOptions": "Output Options", + "pdfOptions": "PDF Options", + "imageOptions": "Image Options", + "colorType": "Colour Type", + "color": "Culoare", + "greyscale": "Scală de gri", + "blackwhite": "Black & White", + "dpi": "DPI", + "output": "Output", + "single": "Single", + "multiple": "Multiple", + "fitOption": "Fit Option", + "maintainAspectRatio": "Maintain Aspect Ratio", + "fitDocumentToPage": "Fit Document to Page", + "fillPage": "Umple Pagina", + "autoRotate": "Auto Rotate", + "autoRotateDescription": "Automatically rotate images to better fit the PDF page", + "combineImages": "Combine Images", + "combineImagesDescription": "Combine all images into one PDF, or create separate PDFs for each image", + "webOptions": "Web to PDF Options", + "zoomLevel": "Zoom Level", + "emailOptions": "Email to PDF Options", + "includeAttachments": "Include email attachments", + "maxAttachmentSize": "Maximum attachment size (MB)", + "includeAllRecipients": "Include CC and BCC recipients in header", + "downloadHtml": "Download HTML intermediate file instead of PDF", + "pdfaOptions": "PDF/A Options", + "outputFormat": "Output Format", + "pdfaNote": "PDF/A-1b is more compatible, PDF/A-2b supports more features.", + "pdfaDigitalSignatureWarning": "PDF-ul conține o semnătură digitală. Aceasta va fi eliminată ÃŽn pasul următor.", + "fileFormat": "File Format", + "wordDoc": "Word Document", + "wordDocExt": "Word Document (.docx)", + "odtExt": "OpenDocument Text (.odt)", + "pptExt": "PowerPoint (.pptx)", + "odpExt": "OpenDocument Presentation (.odp)", + "txtExt": "Plain Text (.txt)", + "rtfExt": "Rich Text Format (.rtf)", + "selectedFiles": "Selected files", + "noFileSelected": "No file selected. Use the file panel to add files.", + "convertFiles": "Convert Files", + "converting": "Converting...", + "downloadConverted": "Download Converted File", + "errorNoFiles": "Please select at least one file to convert.", + "errorNoFormat": "Please select both source and target formats.", + "errorNotSupported": "Conversion from {{from}} to {{to}} is not supported.", + "images": "Images", + "officeDocs": "Office Documents (Word, Excel, PowerPoint)", + "imagesExt": "Images (JPG, PNG, etc.)", + "markdown": "Markdown", + "textRtf": "Text/RTF", + "grayscale": "Scală de gri", + "errorConversion": "An error occurred while converting the file." }, "imageToPdf": { "tags": "conversie,img,jpg,poză,fotografie" @@ -727,7 +1263,33 @@ "8": "Elimină Ultima", "9": "Elimină Prima și Ultima", "10": "Îmbinare Impar-Par", - "11": "Duplicate all pages" + "11": "Duplicate all pages", + "desc": { + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, â€Ļ).", + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, â€Ļ).", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimized for binding on the side)." + } + }, + "desc": { + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, â€Ļ).", + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, â€Ļ).", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimised for binding on the side).", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document." }, "placeholder": "(ex. 1,3,2 sau 4-8,2,10-12 sau 2n-1)" }, @@ -739,9 +1301,198 @@ "upload": "Adăugare imagine", "submit": "Adăugare imagine" }, + "attachments": { + "tags": "embed,attach,file,attachment,attachments", + "title": "Add attachments", + "header": "Add attachments", + "add": "Add Attachment", + "remove": "Remove Attachment", + "embed": "Embed Attachment", + "submit": "Add attachments" + }, "watermark": { - "tags": "Text,repetitiv,etichetă,propriu,drepturi de autor,marcă comercială,img,jpg,poză,fotografie", "title": "Adaugă Filigran", + "desc": "Add text or image watermarks to PDF files", + "completed": "Watermark added", + "submit": "Adaugă Filigran", + "filenamePrefix": "watermarked", + "error": { + "failed": "An error occurred while adding watermark to the PDF." + }, + "watermarkType": { + "text": "Text", + "image": "Image" + }, + "settings": { + "type": "Watermark Type", + "text": { + "label": "Watermark Text", + "placeholder": "Enter watermark text" + }, + "image": { + "label": "Watermark Image", + "choose": "Choose Image", + "selected": "Selected: {{filename}}" + }, + "fontSize": "Dimensiune Font", + "size": "Size", + "alphabet": "Font/Language", + "color": "Watermark Colour", + "rotation": "Rotation (degrees)", + "opacity": "Opacity (%)", + "spacing": { + "horizontal": "Horizontal Spacing", + "vertical": "Vertical Spacing", + "height": "Height Spacing", + "width": "Width Spacing" + }, + "convertToImage": "Flatten PDF pages to images" + }, + "alphabet": { + "roman": "Roman/Latin", + "arabic": "Arabic", + "japanese": "Japanese", + "korean": "Korean", + "chinese": "Chinese", + "thai": "Thai" + }, + "steps": { + "type": "Watermark Type", + "wording": "Wording", + "textStyle": "Style", + "formatting": "Formatting", + "file": "Watermark File" + }, + "results": { + "title": "Watermark Results" + }, + "tooltip": { + "language": { + "title": "Language Support", + "text": "Choose the appropriate language setting to ensure proper font rendering for your text." + }, + "appearance": { + "title": "Appearance Settings", + "text": "Control how your watermark looks and blends with the document.", + "bullet1": "Rotation: -360° to 360° for angled watermarks", + "bullet2": "Opacity: 0-100% for transparency control", + "bullet3": "Lower opacity creates subtle watermarks" + }, + "spacing": { + "title": "Spacing Control", + "text": "Adjust the spacing between repeated watermarks across the page.", + "bullet1": "Width spacing: Horizontal distance between watermarks", + "bullet2": "Height spacing: Vertical distance between watermarks", + "bullet3": "Higher values create more spread out patterns" + }, + "type": { + "header": { + "title": "Watermark Type Selection" + }, + "description": { + "title": "Choose Your Watermark", + "text": "Select between text or image watermarks based on your needs." + }, + "text": { + "title": "Text Watermarks", + "text": "Perfect for adding copyright notices, company names, or confidentiality labels. Supports multiple languages and custom colours.", + "bullet1": "Customisable fonts and languages", + "bullet2": "Adjustable colours and transparency", + "bullet3": "Ideal for legal or branding text" + }, + "image": { + "title": "Image Watermarks", + "text": "Use logos, stamps, or any image as a watermark. Great for branding and visual identification.", + "bullet1": "Upload any image format", + "bullet2": "Maintains image quality", + "bullet3": "Perfect for logos and stamps" + } + }, + "wording": { + "header": { + "title": "Text Content" + }, + "text": { + "title": "Watermark Text", + "text": "Enter the text that will appear as your watermark across the document.", + "bullet1": "Keep it concise for better readability", + "bullet2": "Common examples: 'CONFIDENTIAL', 'DRAFT', company name", + "bullet3": "Emoji characters are not supported and will be filtered out" + } + }, + "textStyle": { + "header": { + "title": "Text Style" + }, + "color": { + "title": "Colour Selection", + "text": "Choose a colour that provides good contrast with your document content.", + "bullet1": "Light grey (#d3d3d3) for subtle watermarks", + "bullet2": "Black or dark colours for high contrast", + "bullet3": "Custom colours for branding purposes" + }, + "language": { + "title": "Language Support", + "text": "Choose the appropriate language setting to ensure proper font rendering." + } + }, + "file": { + "header": { + "title": "Image Upload" + }, + "upload": { + "title": "Image Selection", + "text": "Upload an image file to use as your watermark.", + "bullet1": "Supports common formats: PNG, JPG, GIF, BMP", + "bullet2": "PNG with transparency works best", + "bullet3": "Higher resolution images maintain quality better" + }, + "recommendations": { + "title": "Best Practices", + "text": "Tips for optimal image watermark results.", + "bullet1": "Use logos or stamps with transparent backgrounds", + "bullet2": "Simple designs work better than complex images", + "bullet3": "Consider the final document size when choosing resolution" + } + }, + "formatting": { + "header": { + "title": "Formatting & Layout" + }, + "size": { + "title": "Size Control", + "text": "Adjust the size of your watermark (text or image).", + "bullet1": "Larger sizes create more prominent watermarks" + }, + "appearance": { + "title": "Appearance Settings", + "text": "Control how your watermark looks and blends with the document.", + "bullet1": "Rotation: -360° to 360° for angled watermarks", + "bullet2": "Opacity: 0-100% for transparency control", + "bullet3": "Lower opacity creates subtle watermarks" + }, + "spacing": { + "title": "Spacing Control", + "text": "Adjust the spacing between repeated watermarks across the page.", + "bullet1": "Horizontal spacing: Distance between watermarks left to right", + "bullet2": "Vertical spacing: Distance between watermarks top to bottom", + "bullet3": "Higher values create more spread out patterns" + }, + "security": { + "title": "Security Option", + "text": "Convert the final PDF to an image-based format for enhanced security.", + "bullet1": "Prevents text selection and copying", + "bullet2": "Makes watermarks harder to remove", + "bullet3": "Results in larger file sizes", + "bullet4": "Best for sensitive or copyrighted content" + } + } + }, + "type": { + "1": "Text", + "2": "Imagine" + }, + "tags": "Text,repetitiv,etichetă,propriu,drepturi de autor,marcă comercială,img,jpg,poză,fotografie", "header": "Adaugă Filigran", "customColor": "Culoare Text Personalizată", "selectText": { @@ -755,14 +1506,6 @@ "8": "Tip Filigran:", "9": "Imagine Filigran:", "10": "Convertește PDF ÃŽn PDF-Imagine" - }, - "submit": "Adaugă Filigran", - "type": { - "1": "Text", - "2": "Imagine" - }, - "settings": { - "fontSize": "Dimensiune Font" } }, "permissions": { @@ -787,50 +1530,201 @@ "removePages": { "tags": "Elimină pagini,șterge pagini", "title": "Elimină", + "pageNumbers": { + "label": "Pages to Remove", + "placeholder": "e.g., 1,3,5-8,10", + "error": "Invalid page number format. Use numbers, ranges (1-5), or mathematical expressions (2n+1)" + }, + "filenamePrefix": "pages_removed", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "settings": { + "title": "Settings" + }, + "tooltip": { + "header": { + "title": "Remove Pages Settings" + }, + "pageNumbers": { + "title": "Page Selection", + "text": "Specify which pages to remove from your PDF. You can select individual pages, ranges, or use mathematical expressions.", + "bullet1": "Individual pages: 1,3,5 (removes pages 1, 3, and 5)", + "bullet2": "Page ranges: 1-5,10-15 (removes pages 1-5 and 10-15)", + "bullet3": "Mathematical: 2n+1 (removes odd pages)", + "bullet4": "Open ranges: 5- (removes from page 5 to end)" + }, + "examples": { + "title": "Common Examples", + "text": "Here are some common page selection patterns:", + "bullet1": "Remove first page: 1", + "bullet2": "Remove last 3 pages: -3", + "bullet3": "Remove every other page: 2n", + "bullet4": "Remove specific scattered pages: 1,5,10,15" + }, + "safety": { + "title": "Safety Tips", + "text": "Important considerations when removing pages:", + "bullet1": "Always preview your selection before processing", + "bullet2": "Keep a backup of your original file", + "bullet3": "Page numbers start from 1, not 0", + "bullet4": "Invalid page numbers will be ignored" + } + }, + "error": { + "failed": "An error occurred whilst removing pages." + }, + "results": { + "title": "Page Removal Results" + }, "submit": "Elimină" }, - "addPassword": { - "tags": "securizează,securitate", - "title": "Adaugă parolă", - "header": "Adaugă o parolă (Criptare)", - "selectText": { - "1": "Selectează PDF-ul pentru criptare", - "2": "Parolă", - "3": "Lungime cheie de criptare", - "4": "Valori mai mari sunt mai puternice, dar valorile mai mici au o compatibilitate mai bună.", - "5": "Permisiuni de setare", - "6": "Previne asamblarea documentului", - "7": "Previne extragerea conținutului", - "8": "Previne extragerea pentru accesibilitate", - "9": "Previne completarea formularului", - "10": "Previne modificarea", - "11": "Previne modificarea adnotărilor", - "12": "Previne tipărirea", - "13": "Previne tipărirea ÃŽn formate diferite", - "14": "Parolă Proprietar", - "15": "Restricționează ce se poate face cu documentul odată ce este deschis (Nu este suportat de toate programele de citire)", - "16": "Restricționează deschiderea documentului ÃŽn sine" + "extractPages": { + "title": "Extract Pages", + "pageNumbers": { + "label": "Pages to Extract", + "placeholder": "e.g., 1,3,5-8 or odd & 1-10" + }, + "settings": { + "title": "Settings" }, - "submit": "Criptează", "tooltip": { - "permissions": { - "title": "Schimbă Permisiunile" + "description": "Extracts the selected pages into a new PDF, preserving order." + }, + "error": { + "failed": "Failed to extract pages" + }, + "results": { + "title": "Pages Extracted" + }, + "submit": "Extract Pages" + }, + "pageSelection": { + "tooltip": { + "header": { + "title": "Page Selection Guide" + }, + "basic": { + "title": "Basic Usage", + "text": "Select specific pages from your PDF document using simple syntax.", + "bullet1": "Individual pages: 1,3,5", + "bullet2": "Page ranges: 3-6 or 10-15", + "bullet3": "All pages: all" + }, + "advanced": { + "title": "Advanced Features" + }, + "tips": { + "title": "Tips", + "text": "Keep these guidelines in mind:", + "bullet1": "Page numbers start from 1 (not 0)", + "bullet2": "Spaces are automatically removed", + "bullet3": "Invalid expressions are ignored" + }, + "syntax": { + "title": "Syntax Basics", + "text": "Use numbers, ranges, keywords, and progressions (n starts at 0). Parentheses are supported.", + "bullets": { + "numbers": "Numbers/ranges: 5, 10-20", + "keywords": "Keywords: odd, even", + "progressions": "Progressions: 3n, 4n+1" + } + }, + "operators": { + "title": "Operators", + "text": "AND has higher precedence than comma. NOT applies within the document range.", + "and": "AND: & or \"and\" — require both conditions (e.g., 1-50 & even)", + "comma": "Comma: , or | — combine selections (e.g., 1-10, 20)", + "not": "NOT: ! or \"not\" — exclude pages (e.g., 3n & not 30)" + }, + "examples": { + "title": "Examples" + }, + "complex": { + "bullet1": "1,3-5,8,2n → pages 1, 3–5, 8, plus evens", + "bullet2": "10-,2n-1 → from page 10 to end + odd pages", + "description": "Mix different types.", + "title": "Complex Combinations" + }, + "description": "Choose which pages to use for the operation. Supports single pages, ranges, formulas, and the all keyword.", + "individual": { + "bullet1": "1,3,5 → selects pages 1, 3, 5", + "bullet2": "2,7,12 → selects pages 2, 7, 12", + "description": "Enter numbers separated by commas.", + "title": "Individual Pages" + }, + "mathematical": { + "bullet1": "2n → all even pages (2, 4, 6â€Ļ)", + "bullet2": "2n-1 → all odd pages (1, 3, 5â€Ļ)", + "bullet3": "3n → every 3rd page (3, 6, 9â€Ļ)", + "bullet4": "4n-1 → pages 3, 7, 11, 15â€Ļ", + "description": "Use n in formulas for patterns.", + "title": "Mathematical Functions" + }, + "ranges": { + "bullet1": "3-6 → selects pages 3–6", + "bullet2": "10-15 → selects pages 10–15", + "bullet3": "5- → selects pages 5 to end", + "description": "Use - for consecutive pages.", + "title": "Page Ranges" + }, + "special": { + "bullet1": "all → selects all pages", + "title": "Special Keywords" } } }, - "removePassword": { - "tags": "securizează,Decriptează,securitate,elimină parola,șterge parola", - "title": "Elimină parola", - "header": "Elimină parola (Decodifică)", - "selectText": { - "1": "Selectează PDF-ul pentru decodificare", - "2": "Parolă" + "bulkSelection": { + "syntaxError": "There is a syntax issue. See Page Selection tips for help.", + "header": { + "title": "Page Selection Guide" }, - "submit": "Elimină", - "desc": "Elimină protecția cu parolă din documentul PDF.", - "password": { - "stepTitle": "Elimină Parola", - "label": "Parola Curentă" + "syntax": { + "title": "Syntax Basics", + "text": "Use numbers, ranges, keywords, and progressions (n starts at 0). Parentheses are supported.", + "bullets": { + "numbers": "Numbers/ranges: 5, 10-20", + "keywords": "Keywords: odd, even", + "progressions": "Progressions: 3n, 4n+1" + } + }, + "operators": { + "title": "Operators", + "text": "AND has higher precedence than comma. NOT applies within the document range.", + "and": "AND: & or \"and\" — require both conditions (e.g., 1-50 & even)", + "comma": "Comma: , or | — combine selections (e.g., 1-10, 20)", + "not": "NOT: ! or \"not\" — exclude pages (e.g., 3n & not 30)" + }, + "examples": { + "title": "Examples", + "first50": "First 50", + "last50": "Last 50", + "every3rd": "Every 3rd", + "oddWithinExcluding": "Odd within 1-20 excluding 5-7", + "combineSets": "Combine sets" + }, + "firstNPages": { + "title": "First N Pages", + "placeholder": "Number of pages" + }, + "lastNPages": { + "title": "Last N Pages", + "placeholder": "Number of pages" + }, + "everyNthPage": { + "title": "Every Nth Page", + "placeholder": "Step size" + }, + "range": { + "title": "Range", + "fromPlaceholder": "From", + "toPlaceholder": "To" + }, + "keywords": { + "title": "Keywords" + }, + "advanced": { + "title": "Advanced" } }, "compressPdfs": { @@ -840,12 +1734,142 @@ "tags": "remove,delete,form,field,readonly", "title": "Remove Read-Only from Form Fields", "header": "Unlock PDF Forms", - "submit": "Remove" + "submit": "Remove", + "description": "This tool will remove read-only restrictions from PDF form fields, making them editable and fillable.", + "filenamePrefix": "unlocked_forms", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst unlocking PDF forms." + }, + "results": { + "title": "Unlocked Forms Results" + } }, "changeMetadata": { - "tags": "Titlu,autor,dată,creare,timp,editor", - "title": "Titlu:", "header": "Schimbă Metadatele", + "submit": "Schimbă", + "filenamePrefix": "metadata", + "settings": { + "title": "Metadata Settings" + }, + "standardFields": { + "title": "Standard Fields" + }, + "deleteAll": { + "label": "Remove Existing Metadata", + "checkbox": "Delete all metadata" + }, + "title": { + "label": "Title", + "placeholder": "Document title" + }, + "author": { + "label": "Author", + "placeholder": "Document author" + }, + "subject": { + "label": "Subject", + "placeholder": "Document subject" + }, + "keywords": { + "label": "Keywords", + "placeholder": "Document keywords" + }, + "creator": { + "label": "Creator", + "placeholder": "Document creator" + }, + "producer": { + "label": "Producer", + "placeholder": "Document producer" + }, + "dates": { + "title": "Date Fields" + }, + "creationDate": { + "label": "Creation Date", + "placeholder": "Creation date" + }, + "modificationDate": { + "label": "Modification Date", + "placeholder": "Modification date" + }, + "trapped": { + "label": "Trapped Status", + "unknown": "Unknown", + "true": "True", + "false": "False" + }, + "advanced": { + "title": "Advanced Options" + }, + "customFields": { + "title": "Custom Metadata", + "description": "Add custom metadata fields to the document", + "add": "Add Field", + "key": "Key", + "keyPlaceholder": "Custom key", + "value": "Value", + "valuePlaceholder": "Custom value", + "remove": "Remove" + }, + "results": { + "title": "Updated PDFs" + }, + "error": { + "failed": "An error occurred while changing the PDF metadata." + }, + "tooltip": { + "header": { + "title": "PDF Metadata Overview" + }, + "standardFields": { + "title": "Standard Fields", + "text": "Common PDF metadata fields that describe the document.", + "bullet1": "Title: Document name or heading", + "bullet2": "Author: Person who created the document", + "bullet3": "Subject: Brief description of content", + "bullet4": "Keywords: Search terms for the document", + "bullet5": "Creator/Producer: Software used to create the PDF" + }, + "dates": { + "title": "Date Fields", + "text": "When the document was created and modified.", + "bullet1": "Creation Date: When original document was made", + "bullet2": "Modification Date: When last changed" + }, + "options": { + "title": "Additional Options", + "text": "Custom fields and privacy controls.", + "bullet1": "Custom Metadata: Add your own key-value pairs", + "bullet2": "Trapped Status: High-quality printing setting", + "bullet3": "Delete All: Remove all metadata for privacy" + }, + "deleteAll": { + "title": "Remove Existing Metadata", + "text": "Complete metadata deletion to ensure privacy." + }, + "customFields": { + "title": "Custom Metadata", + "text": "Add your own custom key-value metadata pairs.", + "bullet1": "Add any custom fields relevant to your document", + "bullet2": "Examples: Department, Project, Version, Status", + "bullet3": "Both key and value are required for each entry" + }, + "advanced": { + "title": "Advanced Options", + "trapped": { + "title": "Trapped Status", + "description": "Indicates if document is prepared for high-quality printing.", + "bullet1": "True: Document has been trapped for printing", + "bullet2": "False: Document has not been trapped", + "bullet3": "Unknown: Trapped status is not specified" + } + } + }, + "tags": "Titlu,autor,dată,creare,timp,editor", "selectText": { "1": "Te rugăm să editezi variabilele pe care dorești să le schimbi", "2": "Șterge toate metadatele", @@ -853,15 +1877,7 @@ "4": "Alte Metadate:", "5": "Adaugă Intrare Metadate Personalizate" }, - "author": "Autor:", - "creationDate": "Data creării (aaaa/LL/zz OO:mm:ss):", - "creator": "Creator:", - "keywords": "Cuvinte cheie:", - "modDate": "Data modificării (aaaa/LL/zz OO:mm:ss):", - "producer": "Producător:", - "subject": "Subiect:", - "trapped": "Blocat:", - "submit": "Schimbă" + "modDate": "Data modificării (aaaa/LL/zz OO:mm:ss):" }, "fileToPDF": { "tags": "transformare,format,document,poză,diapozitiv,text,conversie,office,docs,word,excel,powerpoint", @@ -875,6 +1891,7 @@ "ocr": { "tags": "recunoaștere,text,imagine,scanare,citește,identifică,detectare,editabil", "title": "OCR / Curățare scanare", + "desc": "Curăță scanările și detectează textul din imaginile dintr-un PDF și ÃŽl adaugă ca text.", "header": "Curățare scanări / OCR (Recunoaștere optică a caracterelor)", "selectText": { "1": "Selectați limbile care trebuie detectate ÃŽn PDF (Cele listate sunt cele detectate ÃŽn prezent):", @@ -893,23 +1910,89 @@ "help": "Citiți documentația pentru a afla cum să utilizați acest serviciu pentru alte limbi și/sau ÃŽn afara mediului Docker", "credit": "Acest serviciu utilizează qpdf și Tesseract pentru OCR.", "submit": "Procesează PDF-ul cu OCR", - "desc": "Curăță scanările și detectează textul din imaginile dintr-un PDF și ÃŽl adaugă ca text.", + "operation": { + "submit": "Process OCR and Review" + }, + "results": { + "title": "OCR Results" + }, + "languagePicker": { + "additionalLanguages": "Looking for additional languages?", + "viewSetupGuide": "View setup guide →" + }, "settings": { "title": "Setări", "ocrMode": { - "label": "Mod OCR" + "label": "Mod OCR", + "auto": "Auto (skip text layers)", + "force": "Force (re-OCR all, replace text)", + "strict": "Strict (abort if text found)" }, "languages": { - "label": "Limbi" + "label": "Limbi", + "placeholder": "Select languages" + }, + "compatibilityMode": { + "label": "Compatibility Mode" + }, + "advancedOptions": { + "label": "Processing Options", + "sidecar": "Create a text file", + "deskew": "Deskew pages", + "clean": "Clean input file", + "cleanFinal": "Clean final output" } }, "tooltip": { + "header": { + "title": "OCR Settings Overview" + }, "mode": { - "title": "Mod OCR" + "title": "Mod OCR", + "text": "Optical Character Recognition (OCR) helps you turn scanned or screenshotted pages into text you can search, copy, or highlight.", + "bullet1": "Auto skips pages that already contain text layers.", + "bullet2": "Force re-OCRs every page and replaces all the text.", + "bullet3": "Strict halts if any selectable text is found." }, "languages": { - "title": "Limbi" + "title": "Limbi", + "text": "Improve OCR accuracy by specifying the expected languages. Choose one or more languages to guide detection." + }, + "output": { + "title": "Output", + "text": "Decide how you want the text output formatted:", + "bullet1": "Searchable PDF embeds text behind the original image.", + "bullet2": "HOCR XML returns a structured machine-readable file.", + "bullet3": "Plain-text sidecar creates a separate .txt file with raw content." + }, + "advanced": { + "header": { + "title": "Advanced OCR Processing" + }, + "compatibility": { + "title": "Compatibility Mode", + "text": "Uses OCR 'sandwich PDF' mode: results in larger files, but more reliable with certain languages and older PDF software. By default we use hOCR for smaller, modern PDFs." + }, + "sidecar": { + "title": "Create Text File", + "text": "Generates a separate .txt file alongside the PDF containing all extracted text content for easy access and processing." + }, + "deskew": { + "title": "Deskew Pages", + "text": "Automatically corrects skewed or tilted pages to improve OCR accuracy. Useful for scanned documents that weren't perfectly aligned." + }, + "clean": { + "title": "Clean Input File", + "text": "Preprocesses the input by removing noise, enhancing contrast, and optimising the image for better OCR recognition before processing." + }, + "cleanFinal": { + "title": "Clean Final Output", + "text": "Post-processes the final PDF by removing OCR artefacts and optimising the text layer for better readability and smaller file size." + } } + }, + "error": { + "failed": "OCR operation failed" } }, "extractImages": { @@ -918,7 +2001,13 @@ "header": "Extrage Imagini", "selectText": "Selectați formatul imaginii ÃŽn care să se convertească imaginile extrase", "allowDuplicates": "Salvează imaginile duplicate", - "submit": "Extrage" + "submit": "Extrage", + "settings": { + "title": "Settings" + }, + "error": { + "failed": "An error occurred while extracting images from the PDF." + } }, "pdfToPDFA": { "tags": "arhivă,termen-lung,standard,conversie,stocare,conservare", @@ -990,17 +2079,53 @@ }, "info": "Python nu este instalat. Este necesar pentru a rula." }, + "scannerImageSplit": { + "title": "Extracted Images", + "submit": "Extract Image Scans", + "error": { + "failed": "An error occurred while extracting image scans." + }, + "tooltip": { + "title": "Photo Splitter", + "whatThisDoes": "What this does", + "whatThisDoesDesc": "Automatically finds and extracts each photo from a scanned page or composite image—no manual cropping.", + "whenToUse": "When to use", + "useCase1": "Scan whole album pages in one go", + "useCase2": "Split flatbed batches into separate files", + "useCase3": "Break collages into individual photos", + "useCase4": "Pull photos from documents", + "quickFixes": "Quick fixes", + "problem1": "Photos not detected → increase Tolerance to 30-50", + "problem2": "Too many false detections → increase Minimum Area to 15,000-20,000", + "problem3": "Crops are too tight → increase Border Size to 5-10", + "problem4": "Tilted photos not straightened → lower Angle Threshold to ~5°", + "problem5": "Dust/noise boxes → increase Minimum Contour Area to 1000-2000", + "setupTips": "Setup tips", + "tip1": "Use a plain, light background", + "tip2": "Leave a small gap (≈1 cm) between photos", + "tip3": "Scan at 300-600 DPI", + "tip4": "Clean the scanner glass", + "headsUp": "Heads-up", + "headsUpDesc": "Overlapping photos or backgrounds very close in colour to the photos can reduce accuracy-try a lighter or darker background and leave more space." + } + }, "sign": { - "tags": "autorizează,inițiale,semnătură-desenată,semnătură-text,semnătură-imagine", "title": "Semnează", "header": "Semnează documente PDF", "upload": "Încarcă Imaginea", - "draw": "Desenează Semnătura", - "text": "Introdu Textul", + "draw": { + "title": "Draw your signature", + "clear": "Clear" + }, + "text": { + "name": "Signer Name", + "placeholder": "Enter your full name" + }, "clear": "Curăță", "add": "Adaugă", "saved": "Saved Signatures", "save": "Save Signature", + "applySignatures": "Apply Signatures", "personalSigs": "Personal Signatures", "sharedSigs": "Shared Signatures", "noSavedSigs": "No saved signatures found", @@ -1012,42 +2137,179 @@ "previous": "Previous page", "maintainRatio": "Toggle maintain aspect ratio", "undo": "Undo", - "redo": "Redo" + "redo": "Redo", + "submit": "Sign Document", + "steps": { + "configure": "Configure Signature" + }, + "type": { + "title": "Signature Type", + "draw": "Draw", + "canvas": "Canvas", + "image": "Image", + "text": "Text" + }, + "image": { + "label": "Upload signature image", + "placeholder": "Select image file", + "hint": "Upload a PNG or JPG image of your signature" + }, + "instructions": { + "title": "How to add signature", + "canvas": "After drawing your signature in the canvas, close the modal then click anywhere on the PDF to place it.", + "image": "After uploading your signature image above, click anywhere on the PDF to place it.", + "text": "After entering your name above, click anywhere on the PDF to place your signature." + }, + "mode": { + "move": "Move Signature", + "place": "Place Signature" + }, + "updateAndPlace": "Update and Place", + "activate": "Activate Signature Placement", + "deactivate": "Stop Placing Signatures", + "results": { + "title": "Signature Results" + }, + "error": { + "failed": "An error occurred while signing the PDF." + }, + "tags": "autorizează,inițiale,semnătură-desenată,semnătură-text,semnătură-imagine" }, "flatten": { - "tags": "static,dezactivează,non-interactiv,simplifică", "title": "Nivelare", "header": "Nivelează documente PDF", "flattenOnlyForms": "Nivelează doar formularele", "submit": "Nivelează", + "filenamePrefix": "flattened", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, "steps": { "settings": "Setări" }, "options": { - "flattenOnlyForms": "Nivelează doar formularele" - } + "stepTitle": "Flatten Options", + "title": "Flatten Options", + "flattenOnlyForms": { + "label": "Nivelează doar formularele", + "desc": "Only flatten form fields, leaving other interactive elements intact" + }, + "note": "Flattening removes interactive elements from the PDF, making them non-editable." + }, + "results": { + "title": "Flatten Results" + }, + "error": { + "failed": "An error occurred while flattening the PDF." + }, + "tooltip": { + "header": { + "title": "About Flattening PDFs" + }, + "description": { + "title": "What does flattening do?", + "text": "Flattening makes your PDF non-editable by turning fillable forms and buttons into regular text and images. The PDF will look exactly the same, but no one can change or fill in the forms anymore. Perfect for sharing completed forms, creating final documents for records, or ensuring the PDF looks the same everywhere.", + "bullet1": "Text boxes become regular text (can't be edited)", + "bullet2": "Checkboxes and buttons become pictures", + "bullet3": "Great for final versions you don't want changed", + "bullet4": "Ensures consistent appearance across all devices" + }, + "formsOnly": { + "title": "What does 'Flatten only forms' mean?", + "text": "This option only removes the ability to fill in forms, but keeps other features working like clicking links, viewing bookmarks, and reading comments.", + "bullet1": "Forms become non-editable", + "bullet2": "Links still work when clicked", + "bullet3": "Comments and notes remain visible", + "bullet4": "Bookmarks still help you navigate" + } + }, + "tags": "static,dezactivează,non-interactiv,simplifică" }, "repair": { "tags": "repară,restaurează,corectare,recuperează", "title": "Repară", "header": "Repară documente PDF", - "submit": "Repară" + "submit": "Repară", + "description": "This tool will attempt to repair corrupted or damaged PDF files. No additional settings are required.", + "filenamePrefix": "repaired", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst repairing the PDF." + }, + "results": { + "title": "Repair Results" + } }, "removeBlanks": { - "tags": "curățare,simplificare,fără-conținut,organizează", "title": "Elimină pagini goale", "header": "Elimină pagini goale", - "threshold": "Prag:", + "settings": { + "title": "Settings" + }, + "threshold": { + "label": "Pixel Whiteness Threshold" + }, + "whitePercent": { + "label": "White Percentage Threshold", + "unit": "%" + }, + "includeBlankPages": { + "label": "Include detected blank pages" + }, + "tooltip": { + "header": { + "title": "Remove Blank Pages Settings" + }, + "threshold": { + "title": "Pixel Whiteness Threshold", + "text": "Controls how white a pixel must be to be considered 'white'. This helps determine what counts as a blank area on the page.", + "bullet1": "0 = Pure black (most restrictive)", + "bullet2": "128 = Medium grey", + "bullet3": "255 = Pure white (least restrictive)" + }, + "whitePercent": { + "title": "White Percentage Threshold", + "text": "Sets the minimum percentage of white pixels required for a page to be considered blank and removed.", + "bullet1": "Lower values (e.g., 80%) = More pages removed", + "bullet2": "Higher values (e.g., 95%) = Only very blank pages removed", + "bullet3": "Use higher values for documents with light backgrounds" + }, + "includeBlankPages": { + "title": "Include Detected Blank Pages", + "text": "When enabled, creates a separate PDF containing all the blank pages that were detected and removed from the original document.", + "bullet1": "Useful for reviewing what was removed", + "bullet2": "Helps verify the detection accuracy", + "bullet3": "Can be disabled to reduce output file size" + } + }, + "submit": "Elimină pagini goale", + "error": { + "failed": "Failed to remove blank pages" + }, + "results": { + "title": "Removed Blank Pages" + }, + "tags": "curățare,simplificare,fără-conținut,organizează", "thresholdDesc": "Prag pentru determinarea cÃĸt de alb trebuie să fie un pixel alb", - "whitePercent": "Procent alb (%):", - "whitePercentDesc": "Procentul paginii care trebuie să fie alb pentru a fi eliminată", - "submit": "Elimină pagini goale" + "whitePercentDesc": "Procentul paginii care trebuie să fie alb pentru a fi eliminată" }, "removeAnnotations": { "tags": "comentarii,evidențiere,note,marcaje,elimină", "title": "Elimină Adnotările", "header": "Elimină Adnotările", - "submit": "Elimină" + "submit": "Elimină", + "settings": { + "title": "Settings" + }, + "info": { + "title": "About Remove Annotations", + "description": "This tool will remove all annotations (comments, highlights, notes, etc.) from your PDF documents." + }, + "error": { + "failed": "An error occurred while removing annotations from the PDF." + } }, "compare": { "tags": "diferențiază,contrastează,modificări,analiză", @@ -1079,6 +2341,142 @@ "certSign": { "tags": "autentifică,PEM,P12,oficial,criptează", "title": "Semnare certificat", + "filenamePrefix": "signed", + "signMode": { + "stepTitle": "Sign Mode", + "tooltip": { + "header": { + "title": "About PDF Signatures" + }, + "overview": { + "title": "How signatures work", + "text": "Both modes seal the document (any edits are flagged as tampering) and record who/when/how for auditing. Viewer trust depends on the certificate chain." + }, + "manual": { + "title": "Manual - Bring your certificate", + "text": "Use your own certificate files for brand-aligned identity. Can display Trusted when your CA/chain is recognised.", + "use": "Use for: customer-facing, legal, compliance." + }, + "auto": { + "title": "Auto - Zero-setup, instant system seal", + "text": "Signs with a server self-signed certificate. Same tamper-evident seal and audit trail; typically shows Unverified in viewers.", + "use": "Use when: you need speed and consistent internal identity across reviews and records." + }, + "rule": { + "title": "Rule of thumb", + "text": "Need recipient Trusted status? Manual. Need a fast, tamper-evident seal and audit trail with no setup? Auto." + } + } + }, + "certTypeStep": { + "stepTitle": "Certificate Format" + }, + "certFiles": { + "stepTitle": "Certificate Files" + }, + "appearance": { + "stepTitle": "Signature Appearance", + "tooltip": { + "header": { + "title": "About Signature Appearance" + }, + "invisible": { + "title": "Invisible Signatures", + "text": "The signature is added to the PDF for security but won't be visible when viewing the document. Perfect for legal requirements without changing the document's appearance.", + "bullet1": "Provides security without visual changes", + "bullet2": "Meets legal requirements for digital signing", + "bullet3": "Doesn't affect document layout or design" + }, + "visible": { + "title": "Visible Signatures", + "text": "Shows a signature block on the PDF with your name, date, and optional details. Useful when you want readers to clearly see the document is signed.", + "bullet1": "Shows signer name and date on the document", + "bullet2": "Can include reason and location for signing", + "bullet3": "Choose which page to place the signature", + "bullet4": "Optional logo can be included" + } + }, + "invisible": "Invisible", + "options": { + "title": "Signature Details" + }, + "visible": "Visible" + }, + "sign": { + "submit": "Sign PDF", + "results": "Signed PDF" + }, + "error": { + "failed": "An error occurred whilst processing signatures." + }, + "tooltip": { + "header": { + "title": "About Managing Signatures" + }, + "overview": { + "title": "What can this tool do?", + "text": "This tool lets you check if your PDFs are digitally signed and add new digital signatures. Digital signatures prove who created or approved a document and show if it has been changed since signing.", + "bullet1": "Check existing signatures and their validity", + "bullet2": "View detailed information about signers and certificates", + "bullet3": "Add new digital signatures to secure your documents", + "bullet4": "Multiple files supported with easy navigation" + }, + "validation": { + "title": "Checking Signatures", + "text": "When you check signatures, the tool tells you if they're valid, who signed the document, when it was signed, and whether the document has been changed since signing.", + "bullet1": "Shows if signatures are valid or invalid", + "bullet2": "Displays signer information and signing date", + "bullet3": "Checks if the document was modified after signing", + "bullet4": "Can use custom certificates for verification" + }, + "signing": { + "title": "Adding Signatures", + "text": "To sign a PDF, you need a digital certificate (like PEM, PKCS12, or JKS). You can choose to make the signature visible on the document or keep it invisible for security only.", + "bullet1": "Supports PEM, PKCS12, JKS, and server certificate formats", + "bullet2": "Option to show or hide signature on the PDF", + "bullet3": "Add reason, location, and signer name", + "bullet4": "Choose which page to place visible signatures", + "bullet5": "Use server certificate for simple 'Sign with Stirling-PDF' option" + } + }, + "certType": { + "tooltip": { + "header": { + "title": "About Certificate Types" + }, + "what": { + "title": "What's a certificate?", + "text": "It's a secure ID for your signature that proves you signed. Unless you're required to sign via certificate, we recommend using another secure method like Type, Draw, or Upload." + }, + "which": { + "title": "Which option should I use?", + "text": "Choose the format that matches your certificate file:", + "bullet1": "PKCS#12 (.p12 / .pfx) – one combined file (most common)", + "bullet2": "PFX (.pfx) – Microsoft's version of PKCS12", + "bullet3": "PEM – separate private-key and certificate .pem files", + "bullet4": "JKS – Java .jks keystore for dev / CI-CD workflows" + }, + "convert": { + "title": "Key not listed?", + "text": "Convert your file to a Java keystore (.jks) with keytool, then pick JKS." + } + } + }, + "chooseCertificate": "Choose Certificate File", + "chooseJksFile": "Choose JKS File", + "chooseP12File": "Choose PKCS12 File", + "choosePfxFile": "Choose PFX File", + "choosePrivateKey": "Choose Private Key File", + "location": "Locația", + "logoTitle": "Logo", + "name": "Numele", + "noLogo": "No Logo", + "pageNumber": "Page Number", + "password": "Introdu parola pentru stocarea cheie sau cheia privată (dacă există):", + "passwordOptional": "Leave empty if no password", + "reason": "Motivul", + "serverCertMessage": "Using server certificate - no files or password required", + "showLogo": "Show Logo", "header": "Semnează un fișier PDF cu certificatul tău (În curs de desfășurare)", "selectPDF": "Selectează un fișier PDF pentru semnare:", "jksNote": "Notă: Dacă tipul certificatului tău nu este listat mai jos, te rugăm să-l convertești ÃŽntr-un fișier Java Keystore (.jks) folosind instrumentul de linie de comandă keytool. Apoi, alege opțiunea fișier .jks de mai jos.", @@ -1086,13 +2484,7 @@ "selectCert": "Selectează fișierul de certificat (format X.509, poate fi .pem sau .der):", "selectP12": "Selectează fișierul de stocare cheie PKCS#12 (.p12 sau .pfx) (Opțional, dacă este furnizat, ar trebui să conțină cheia privată și certificatul tău):", "selectJKS": "Selectează Fișierul Java Keystore (.jks sau .keystore):", - "certType": "Tipul certificatului", - "password": "Introdu parola pentru stocarea cheie sau cheia privată (dacă există):", "showSig": "Afișează semnătura", - "reason": "Motivul", - "location": "Locația", - "name": "Numele", - "showLogo": "Show Logo", "submit": "Semnează PDF" }, "removeCertSign": { @@ -1100,7 +2492,18 @@ "title": "Elimină Semnătura cu Certificat", "header": "Elimină certificatul digital din PDF", "selectPDF": "Selectează un fișier PDF:", - "submit": "Elimină Semnătura" + "submit": "Elimină Semnătura", + "description": "This tool will remove digital certificate signatures from your PDF document.", + "filenamePrefix": "unsigned", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst removing certificate signatures." + }, + "results": { + "title": "Certificate Removal Results" + } }, "pageLayout": { "tags": "ÃŽmbină,compozit,vizualizare-unică,organizează", @@ -1108,16 +2511,157 @@ "header": "Aspect Multi-Pagină", "pagesPerSheet": "Pagini per foaie:", "addBorder": "Adaugă Borduri", - "submit": "Trimite" + "submit": "Trimite", + "desc": { + "2": "Place 2 pages side-by-side on a single sheet.", + "3": "Place 3 pages on a single sheet in a single row.", + "4": "Place 4 pages on a single sheet (2 × 2 grid).", + "9": "Place 9 pages on a single sheet (3 × 3 grid).", + "16": "Place 16 pages on a single sheet (4 × 4 grid)." + }, + "error": { + "failed": "An error occurred while creating the multi-page layout." + } + }, + "bookletImposition": { + "tags": "booklet,imposition,printing,binding,folding,signature", + "title": "Booklet Imposition", + "header": "Booklet Imposition", + "submit": "Create Booklet", + "spineLocation": { + "label": "Spine Location", + "left": "Left (Standard)", + "right": "Right (RTL)" + }, + "doubleSided": { + "label": "Double-sided printing", + "tooltip": "Creates both front and back sides for proper booklet printing" + }, + "manualDuplex": { + "title": "Manual Duplex Mode", + "instructions": "For printers without automatic duplex. You'll need to run this twice:" + }, + "duplexPass": { + "label": "Print Pass", + "first": "1st Pass", + "second": "2nd Pass", + "firstInstructions": "Prints front sides → stack face-down → run again with 2nd Pass", + "secondInstructions": "Load printed stack face-down → prints back sides" + }, + "rtlBinding": { + "label": "Right-to-left binding", + "tooltip": "For Arabic, Hebrew, or other right-to-left languages" + }, + "addBorder": { + "label": "Add borders around pages", + "tooltip": "Adds borders around each page section to help with cutting and alignment" + }, + "addGutter": { + "label": "Add gutter margin", + "tooltip": "Adds inner margin space for binding" + }, + "gutterSize": { + "label": "Gutter size (points)" + }, + "flipOnShortEdge": { + "label": "Flip on short edge (automatic duplex only)", + "tooltip": "Enable for short-edge duplex printing (automatic duplex only - ignored in manual mode)", + "manualNote": "Not needed in manual mode - you flip the stack yourself" + }, + "advanced": { + "toggle": "Advanced Options" + }, + "paperSizeNote": "Paper size is automatically derived from your first page.", + "tooltip": { + "header": { + "title": "Booklet Creation Guide" + }, + "description": { + "title": "What is Booklet Imposition?", + "text": "Creates professional booklets by arranging pages in the correct printing order. Your PDF pages are placed 2-up on landscape sheets so when folded and bound, they read in proper sequence like a real book." + }, + "example": { + "title": "Example: 8-Page Booklet", + "text": "Your 8-page document becomes 2 sheets:", + "bullet1": "Sheet 1 Front: Pages 8, 1 | Back: Pages 2, 7", + "bullet2": "Sheet 2 Front: Pages 6, 3 | Back: Pages 4, 5", + "bullet3": "When folded & stacked: Reads 1→2→3→4→5→6→7→8" + }, + "printing": { + "title": "How to Print & Assemble", + "text": "Follow these steps for perfect booklets:", + "bullet1": "Print double-sided with 'Flip on long edge'", + "bullet2": "Stack sheets in order, fold in half", + "bullet3": "Staple or bind along the folded spine", + "bullet4": "For short-edge printers: Enable 'Flip on short edge' option" + }, + "manualDuplex": { + "title": "Manual Duplex (Single-sided Printers)", + "text": "For printers without automatic duplex:", + "bullet1": "Turn OFF 'Double-sided printing'", + "bullet2": "Select '1st Pass' → Print → Stack face-down", + "bullet3": "Select '2nd Pass' → Load stack → Print backs", + "bullet4": "Fold and assemble as normal" + }, + "advanced": { + "title": "Advanced Options", + "text": "Fine-tune your booklet:", + "bullet1": "Right-to-Left Binding: For Arabic, Hebrew, or RTL languages", + "bullet2": "Borders: Shows cut lines for trimming", + "bullet3": "Gutter Margin: Adds space for binding/stapling", + "bullet4": "Short-edge Flip: Only for automatic duplex printers" + } + }, + "error": { + "failed": "An error occurred while creating the booklet imposition." + } }, "scalePages": { - "tags": "redimensionează,modifică,dimensiune,adaptează", "title": "Ajustează scala paginii", "header": "Ajustează scala paginii", "pageSize": "Dimensiunea unei pagini a documentului.", "keepPageSize": "Original Size", "scaleFactor": "Nivel de zoom (decupare) al unei pagini.", - "submit": "Trimite" + "submit": "Trimite", + "tags": "redimensionează,modifică,dimensiune,adaptează" + }, + "adjustPageScale": { + "tags": "resize,modify,dimension,adapt", + "title": "Adjust Page Scale", + "header": "Adjust Page Scale", + "scaleFactor": { + "label": "Scale Factor" + }, + "pageSize": { + "label": "Target Page Size", + "keep": "Keep Original Size", + "letter": "Letter", + "legal": "Legal" + }, + "submit": "Adjust Page Scale", + "error": { + "failed": "An error occurred while adjusting the page scale." + }, + "tooltip": { + "header": { + "title": "Page Scale Settings Overview" + }, + "description": { + "title": "Description", + "text": "Adjust the size of PDF content and change the page dimensions." + }, + "scaleFactor": { + "title": "Scale Factor", + "text": "Controls how large or small the content appears on the page. Content is scaled and centred - if scaled content is larger than the page size, it may be cropped.", + "bullet1": "1.0 = Original size", + "bullet2": "0.5 = Half size (50% smaller)", + "bullet3": "2.0 = Double size (200% larger, may crop)" + }, + "pageSize": { + "title": "Target Page Size", + "text": "Sets the dimensions of the output PDF pages. 'Keep Original Size' maintains current dimensions, whilst other options resize to standard paper sizes." + } + } }, "add-page-numbers": { "tags": "paginează,etichetează,organizează,indexează" @@ -1126,16 +2670,83 @@ "tags": "auto-detectare,bazat-pe-antet,organizează,reetichetează", "title": "Redenumire Automată", "header": "Redenumire Automată PDF", - "submit": "Redenumire Automată" + "description": "Automatically finds the title from your PDF content and uses it as the filename.", + "submit": "Redenumire Automată", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst auto-renaming the PDF." + }, + "results": { + "title": "Auto-Rename Results" + }, + "tooltip": { + "header": { + "title": "How Auto-Rename Works" + }, + "howItWorks": { + "title": "Smart Renaming", + "text": "Automatically finds the title from your PDF content and uses it as the filename.", + "bullet1": "Looks for text that appears to be a title or heading", + "bullet2": "Creates a clean, valid filename from the detected title", + "bullet3": "Keeps the original name if no suitable title is found" + } + } }, "adjust-contrast": { "tags": "corectare-culoare,reglează,modifică,ÃŽmbunătățește" }, "crop": { - "tags": "taie,micșorează,editează,formă", "title": "Decupează", "header": "Decupează PDF", - "submit": "Trimite" + "submit": "Trimite", + "noFileSelected": "Select a PDF file to begin cropping", + "preview": { + "title": "Crop Area Selection" + }, + "reset": "Reset to full PDF", + "coordinates": { + "title": "Position and Size", + "x": { + "label": "X Position", + "desc": "Left edge (points)" + }, + "y": { + "label": "Y Position", + "desc": "Bottom edge (points)" + }, + "width": { + "label": "Width", + "desc": "Crop width (points)" + }, + "height": { + "label": "Height", + "desc": "Crop height (points)" + } + }, + "error": { + "invalidArea": "Crop area extends beyond PDF boundaries", + "failed": "Failed to crop PDF" + }, + "steps": { + "selectArea": "Select Crop Area" + }, + "tooltip": { + "title": "How to Crop PDFs", + "description": "Select the area to crop from your PDF by dragging and resizing the blue overlay on the thumbnail.", + "drag": "Drag the overlay to move the crop area", + "resize": "Drag the corner and edge handles to resize", + "precision": "Use coordinate inputs for precise positioning" + }, + "results": { + "title": "Crop Results" + }, + "automation": { + "info": "Enter crop coordinates in PDF points. Origin (0,0) is at bottom-left. These values will be applied to all PDFs processed in this automation.", + "reference": "Reference: A4 page is 595.28 × 841.89 points (210mm × 297mm). 1 inch = 72 points." + }, + "tags": "taie,micșorează,editează,formă" }, "autoSplitPDF": { "tags": "bazat-pe-QR,separă,segment-scanat,organizează", @@ -1218,24 +2829,124 @@ "downloadJS": "Descarcă Javascript", "submit": "Arată" }, - "autoRedact": { - "tags": "Redactează,Ascunde,ÃŽnnegrește,negru,marker,ascuns", - "title": "Redactare Automată", - "header": "Redactare Automată", - "colorLabel": "Culoare", - "textsToRedactLabel": "Text de Redactat (separat pe linii)", - "textsToRedactPlaceholder": "ex. \\nConfidențial \\nSecret de Serviciu", - "useRegexLabel": "Folosește Regex", - "wholeWordSearchLabel": "Căutare CuvÃĸnt Întreg", - "customPaddingLabel": "Spațiere Suplimentară Personalizată", - "convertPDFToImageLabel": "Convertește PDF ÃŽn PDF-Imagine (Folosit pentru a elimina textul din spatele casetei)", - "submitButton": "Trimite" - }, "redact": { "tags": "Redact,Hide,black out,black,marker,hidden,manual", "title": "Manual Redaction", - "header": "Manual Redaction", "submit": "Manual Redaction", + "error": { + "failed": "An error occurred while redacting the PDF." + }, + "modeSelector": { + "title": "Redaction Method", + "mode": "Mode", + "automatic": "Automatic", + "automaticDesc": "Redact text based on search terms", + "manual": "Manual", + "manualDesc": "Click and drag to redact specific areas", + "manualComingSoon": "Manual redaction coming soon" + }, + "auto": { + "header": "Auto Redact", + "settings": { + "title": "Redaction Settings", + "advancedTitle": "Avansat" + }, + "colorLabel": "Box Colour", + "wordsToRedact": { + "title": "Words to Redact", + "placeholder": "Enter a word", + "add": "Adaugă", + "examples": "Examples: Confidential, Top-Secret" + }, + "useRegexLabel": "Use Regex", + "wholeWordSearchLabel": "Whole Word Search", + "customPaddingLabel": "Custom Extra Padding", + "convertPDFToImageLabel": "Convert PDF to PDF-Image" + }, + "tooltip": { + "mode": { + "header": { + "title": "Redaction Method" + }, + "automatic": { + "title": "Automatic Redaction", + "text": "Automatically finds and redacts specified text throughout the document. Perfect for removing consistent sensitive information like names, addresses, or confidential markers." + }, + "manual": { + "title": "Manual Redaction", + "text": "Click and drag to manually select specific areas to redact. Gives you precise control over what gets redacted. (Coming soon)" + } + }, + "words": { + "header": { + "title": "Words to Redact" + }, + "description": { + "title": "Text Matching", + "text": "Enter words or phrases to find and redact in your document. Each word will be searched for separately." + }, + "bullet1": "Add one word at a time", + "bullet2": "Press Enter or click 'Add Another' to add", + "bullet3": "Click × to remove words", + "examples": { + "title": "Common Examples", + "text": "Typical words to redact include: bank details, email addresses, or specific names." + } + }, + "advanced": { + "header": { + "title": "Advanced Redaction Settings" + }, + "color": { + "title": "Box Colour & Padding", + "text": "Customise the appearance of redaction boxes. Black is standard, but you can choose any colour. Padding adds extra space around the found text." + }, + "regex": { + "title": "Use Regex", + "text": "Enable regular expressions for advanced pattern matching. Useful for finding phone numbers, emails, or complex patterns.", + "bullet1": "Example: \\d{4}-\\d{2}-\\d{2} to match any dates in YYYY-MM-DD format", + "bullet2": "Use with caution - test thoroughly" + }, + "wholeWord": { + "title": "Whole Word Search", + "text": "Only match complete words, not partial matches. 'John' won't match 'Johnson' when enabled." + }, + "convert": { + "title": "Convert to PDF-Image", + "text": "Converts the PDF to an image-based PDF after redaction. This ensures text behind redaction boxes is completely removed and unrecoverable." + } + } + }, + "manual": { + "header": "Manual Redaction", + "textBasedRedaction": "Text-based Redaction", + "pageBasedRedaction": "Page-based Redaction", + "convertPDFToImageLabel": "Convert PDF to PDF-Image (Used to remove text behind the box)", + "pageRedactionNumbers": { + "title": "Pages", + "placeholder": "(ex. 1,2,8 sau 4,7,12-16 sau 2n-1)" + }, + "redactionColor": { + "title": "Redaction Colour" + }, + "export": "Export", + "upload": "Upload", + "boxRedaction": "Box draw redaction", + "zoom": "Zoom", + "zoomIn": "Zoom in", + "zoomOut": "Zoom out", + "nextPage": "Next Page", + "previousPage": "Previous Page", + "toggleSidebar": "Toggle Sidebar", + "showThumbnails": "Show Thumbnails", + "showDocumentOutline": "Show Document Outline (double-click to expand/collapse all items)", + "showAttachments": "Show Attachments", + "showLayers": "Show Layers (double-click to reset all layers to the default state)", + "colourPicker": "Colour Picker", + "findCurrentOutlineItem": "Find current outline item", + "applyChanges": "Apply Changes" + }, + "header": "Manual Redaction", "textBasedRedaction": "Text based Redaction", "pageBasedRedaction": "Page-based Redaction", "convertPDFToImageLabel": "Convert PDF to PDF-Image (Used to remove text behind the box)", @@ -1261,20 +2972,7 @@ "showLayers": "Show Layers (double-click to reset all layers to the default state)", "colourPicker": "Colour Picker", "findCurrentOutlineItem": "Find current outline item", - "applyChanges": "Apply Changes", - "auto": { - "settings": { - "advancedTitle": "Avansat" - }, - "wordsToRedact": { - "add": "Adaugă" - } - }, - "manual": { - "pageRedactionNumbers": { - "placeholder": "(ex. 1,2,8 sau 4,7,12-16 sau 2n-1)" - } - } + "applyChanges": "Apply Changes" }, "tableExtraxt": { "tags": "CSV,Extragere Tabel,extrage,convertește" @@ -1285,11 +2983,15 @@ "overlay-pdfs": { "tags": "Suprapune", "header": "Suprapune Fișiere PDF", + "title": "Overlay PDFs", + "desc": "Overlay one PDF on top of another", "baseFile": { "label": "Selectează Fișierul PDF de Bază" }, "overlayFiles": { - "label": "Selectează Fișierele PDF de Suprapus" + "label": "Selectează Fișierele PDF de Suprapus", + "placeholder": "Choose PDF(s)...", + "addMore": "Add more PDFs..." }, "mode": { "label": "Selectează Modul de Suprapunere", @@ -1299,14 +3001,53 @@ }, "counts": { "label": "Numere de Suprapunere (pentru Modul de Repetare Fixă)", - "placeholder": "Introdu numere separate prin virgulă (ex. 2,3,1)" + "placeholder": "Introdu numere separate prin virgulă (ex. 2,3,1)", + "item": "Count for file", + "noFiles": "Add overlay files to configure counts" }, "position": { "label": "Selectează Poziția de Suprapunere", "foreground": "Prim-plan", "background": "Fundal" }, - "submit": "Trimite" + "submit": "Trimite", + "settings": { + "title": "Settings" + }, + "results": { + "title": "Overlay Results" + }, + "tooltip": { + "header": { + "title": "Overlay PDFs Overview" + }, + "description": { + "title": "Description", + "text": "Combine a base PDF with one or more overlay PDFs. Overlays can be applied page-by-page in different modes and placed in the foreground or background." + }, + "mode": { + "title": "Overlay Mode", + "text": "Choose how to distribute overlay pages across the base PDF pages.", + "sequential": "Sequential Overlay: Use pages from the first overlay PDF until it ends, then move to the next.", + "interleaved": "Interleaved Overlay: Take one page from each overlay in turn.", + "fixedRepeat": "Fixed Repeat Overlay: Take a set number of pages from each overlay before moving to the next. Use Counts to set the numbers." + }, + "position": { + "title": "Overlay Position", + "text": "Foreground places the overlay on top of the page. Background places it behind." + }, + "overlayFiles": { + "title": "Overlay Files", + "text": "Select one or more PDFs to overlay on the base. The order of these files affects how pages are applied in Sequential and Fixed Repeat modes." + }, + "counts": { + "title": "Counts (Fixed Repeat only)", + "text": "Provide a positive number for each overlay file showing how many pages to take before moving to the next. Required when mode is Fixed Repeat." + } + }, + "error": { + "failed": "An error occurred while overlaying PDFs." + } }, "split-by-sections": { "tags": "Împărțire pe Secțiuni, Divizează, Personalizează", @@ -1327,6 +3068,7 @@ "tags": "Ștampilă, Adaugă imagine, centrează imagine, Filigran, PDF, Încorporează, Personalizează", "header": "Ștampilează PDF", "title": "Ștampilează PDF", + "stampSetup": "Stamp Setup", "stampType": "Tip Ștampilă", "stampText": "Text Ștampilă", "stampImage": "Imagine Ștampilă", @@ -1339,7 +3081,19 @@ "overrideY": "Suprascrie Coordonata Y", "customMargin": "Margine Personalizată", "customColor": "Culoare Text Personalizată", - "submit": "Trimite" + "submit": "Trimite", + "noStampSelected": "No stamp selected. Return to Step 1.", + "customPosition": "Drag the stamp to the desired location in the preview window.", + "error": { + "failed": "An error occurred while adding stamp to the PDF." + }, + "imageSize": "Image Size", + "margin": "Margin", + "positionAndFormatting": "Position & Formatting", + "quickPosition": "Select a position on the page to place the stamp.", + "results": { + "title": "Stamp Results" + } }, "removeImagePdf": { "tags": "Elimină Imagine,Operații pagină,Back end,server side" @@ -1357,7 +3111,8 @@ "status": { "_value": "Status", "valid": "Valid", - "invalid": "Invalid" + "invalid": "Invalid", + "complete": "Validation complete" }, "signer": "Signer", "date": "Date", @@ -1384,40 +3139,122 @@ "version": "Versiune", "keyUsage": "Key Usage", "selfSigned": "Self-Signed", - "bits": "bits" + "bits": "bits", + "details": "Certificate Details" }, "signature": { "info": "Signature Information", "_value": "Signature", "mathValid": "Signature is mathematically valid BUT:" }, - "selectCustomCert": "Custom Certificate File X.509 (Optional)" - }, - "replace-color": { - "title": "Replace-Invert-Color", - "header": "Replace-Invert Color PDF", - "selectText": { - "1": "Replace or Invert color Options", - "2": "Default(Default high contrast colors)", - "3": "Custom(Customized colors)", - "4": "Full-Invert(Invert all colors)", - "5": "High contrast color options", - "6": "white text on black background", - "7": "Black text on white background", - "8": "Yellow text on black background", - "9": "Green text on black background", - "10": "Choose text Color", - "11": "Choose background Color" + "selectCustomCert": "Custom Certificate File X.509 (Optional)", + "downloadCsv": "Download CSV", + "downloadJson": "Download JSON", + "downloadPdf": "Download PDF Report", + "downloadType": { + "csv": "CSV", + "json": "JSON", + "pdf": "PDF" }, - "submit": "Replace" + "error": { + "allFailed": "Unable to validate the selected files.", + "partial": "Some files could not be validated.", + "reportGeneration": "Could not generate the PDF report. JSON and CSV are available.", + "unexpected": "Unexpected error during validation." + }, + "finalizing": "Preparing downloads...", + "issue": { + "certExpired": "Certificate expired", + "certRevocationUnknown": "Certificate revocation status unknown", + "certRevoked": "Certificate revoked", + "chainInvalid": "Certificate chain invalid", + "signatureInvalid": "Signature cryptographic check failed", + "trustInvalid": "Certificate not trusted" + }, + "noResults": "Run the validation to generate a report.", + "noSignaturesShort": "No signatures", + "processing": "Validating signatures...", + "report": { + "continued": "Continued", + "downloads": "Downloads", + "entryLabel": "Signature Summary", + "fields": { + "created": "Created", + "fileSize": "File Size", + "signatureCount": "Total Signatures", + "signatureDate": "Signature Date" + }, + "filesEvaluated": "{{count}} files evaluated", + "footer": "Validated via Stirling PDF", + "generatedAt": "Generated", + "noPdf": "PDF report will be available after a successful validation.", + "page": "Page", + "shortTitle": "Signature Summary", + "signatureCountLabel": "{{count}} signatures", + "signaturesFound": "{{count}} signatures detected", + "signaturesValid": "{{count}} fully valid", + "title": "Signature Validation Report" + }, + "settings": { + "certHint": "Upload a trusted X.509 certificate to validate against a custom trust source.", + "title": "Validation Settings" + }, + "signatureDate": "Signature Date", + "totalSignatures": "Total Signatures" }, - "replaceColorPdf": { - "tags": "Replace Color,Page operations,Back end,server side" + "replaceColor": { + "tags": "Replace Colour,Page operations,Back end,server side", + "labels": { + "settings": "Settings", + "colourOperation": "Colour operation" + }, + "options": { + "highContrast": "High contrast", + "invertAll": "Invert all colours", + "custom": "Custom", + "cmyk": "Convert to CMYK" + }, + "tooltip": { + "header": { + "title": "Replace & Invert Colour Settings Overview" + }, + "description": { + "title": "Description", + "text": "Transform PDF colours to improve readability and accessibility. Choose from high contrast presets, invert all colours, or create custom colour schemes." + }, + "highContrast": { + "title": "High Contrast", + "text": "Apply predefined high contrast colour combinations designed for better readability and accessibility compliance.", + "bullet1": "White text on black background - Classic dark mode", + "bullet2": "Black text on white background - Standard high contrast", + "bullet3": "Yellow text on black background - High visibility option", + "bullet4": "Green text on black background - Alternative high contrast" + }, + "invertAll": { + "title": "Invert All Colours", + "text": "Completely invert all colours in the PDF, creating a negative-like effect. Useful for creating dark mode versions of documents or reducing eye strain in low-light conditions." + }, + "custom": { + "title": "Custom Colours", + "text": "Define your own text and background colours using the colour pickers. Perfect for creating branded documents or specific accessibility requirements.", + "bullet1": "Text colour - Choose the colour for text elements", + "bullet2": "Background colour - Set the background colour for the document" + }, + "cmyk": { + "title": "Convert to CMYK", + "text": "Convert the PDF from RGB colour space to CMYK colour space, optimized for professional printing. This process converts colours to the Cyan, Magenta, Yellow, Black model used by printers." + } + }, + "error": { + "failed": "An error occurred while processing the colour replacement." + } }, "login": { "title": "Autentificare", "header": "Autentificare", "signin": "Autentificare", + "signInWith": "Sign in with", + "signInAnonymously": "Sign Up as a Guest", "rememberme": "Ține-mă minte", "invalid": "Nume de utilizator sau parolă invalidă.", "locked": "Contul tău a fost blocat.", @@ -1436,12 +3273,83 @@ "alreadyLoggedIn": "You are already logged in to", "alreadyLoggedIn2": "devices. Please log out of the devices and try again.", "toManySessions": "You have too many active sessions", - "logoutMessage": "You have been logged out." + "logoutMessage": "You have been logged out.", + "youAreLoggedIn": "You are logged in!", + "email": "Email", + "password": "Password", + "enterEmail": "Enter your email", + "enterPassword": "Enter your password", + "loggingIn": "Logging In...", + "username": "Username", + "enterUsername": "Enter username", + "useEmailInstead": "Login with email", + "forgotPassword": "Forgot your password?", + "logIn": "Log In", + "signingIn": "Signing in...", + "login": "Login", + "or": "Or", + "useMagicLink": "Use magic link instead", + "enterEmailForMagicLink": "Enter your email for magic link", + "sending": "Sendingâ€Ļ", + "sendMagicLink": "Send Magic Link", + "cancel": "Cancel", + "dontHaveAccount": "Don't have an account? Sign up", + "home": "Home", + "debug": "Debug", + "signOut": "Sign Out", + "pleaseEnterBoth": "Please enter both email and password", + "pleaseEnterEmail": "Please enter your email address", + "magicLinkSent": "Magic link sent to {{email}}! Check your email and click the link to sign in.", + "passwordResetSent": "Password reset link sent to {{email}}! Check your email and follow the instructions.", + "failedToSignIn": "Failed to sign in with {{provider}}: {{message}}", + "unexpectedError": "Unexpected error: {{message}}", + "accountCreatedSuccess": "Account created successfully! You can now sign in.", + "passwordChangedSuccess": "Password changed successfully! Please sign in with your new password.", + "credentialsUpdated": "Your credentials have been updated. Please sign in again." + }, + "signup": { + "title": "Create an account", + "subtitle": "Join Stirling PDF to get started", + "name": "Name", + "email": "Email", + "password": "Password", + "confirmPassword": "Confirm password", + "enterName": "Enter your name", + "enterEmail": "Enter your email", + "enterPassword": "Enter your password", + "confirmPasswordPlaceholder": "Confirm password", + "or": "or", + "creatingAccount": "Creating Account...", + "signUp": "Sign Up", + "alreadyHaveAccount": "Already have an account? Sign in", + "pleaseFillAllFields": "Please fill in all fields", + "passwordsDoNotMatch": "Passwords do not match", + "passwordTooShort": "Password must be at least 6 characters long", + "invalidEmail": "Please enter a valid email address", + "checkEmailConfirmation": "Check your email for a confirmation link to complete your registration.", + "accountCreatedSuccessfully": "Account created successfully! You can now sign in.", + "unexpectedError": "Unexpected error: {{message}}", + "useEmailInstead": "Use Email Instead", + "nameRequired": "Name is required", + "emailRequired": "Email is required", + "passwordRequired": "Password is required", + "confirmPasswordRequired": "Please confirm your password" }, "pdfToSinglePage": { "title": "PDF ÃŽntr-o Singură Pagină", "header": "PDF ÃŽntr-o Singură Pagină", - "submit": "Convertește ÃŽntr-o Singură Pagină" + "submit": "Convertește ÃŽntr-o Singură Pagină", + "description": "This tool will merge all pages of your PDF into one large single page. The width will remain the same as the original pages, but the height will be the sum of all page heights.", + "filenamePrefix": "single_page", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst converting to single page." + }, + "results": { + "title": "Single Page Results" + } }, "pageExtracter": { "title": "Extrage Pagini", @@ -1465,18 +3373,59 @@ "adjustContrast": { "title": "Ajustează Contrastul", "header": "Ajustează Contrastul", + "basic": "Basic Adjustments", "contrast": "Contrast:", "brightness": "Luminozitate:", "saturation": "Saturație:", - "download": "Descarcă" + "download": "Descarcă", + "adjustColors": "Adjust Colors", + "blue": "Blue", + "confirm": "Confirm", + "error": { + "failed": "Failed to adjust colors/contrast" + }, + "green": "Green", + "noPreview": "Select a PDF to preview", + "red": "Red", + "results": { + "title": "Adjusted PDF" + } }, "compress": { "title": "Comprimare", + "desc": "Compress PDFs to reduce their file size.", "header": "Comprimare PDF", + "method": { + "title": "Compression Method", + "quality": "Quality", + "filesize": "Dimensiune Fișier" + }, "credit": "Acest serviciu utilizează qpdf pentru comprimarea/optimizarea PDF-urilor.", "grayscale": { "label": "Aplicare scală de gri pentru compresie" }, + "tooltip": { + "header": { + "title": "Compress Settings Overview" + }, + "description": { + "title": "Description", + "text": "Compression is an easy way to reduce your file size. Pick File Size to enter a target size and have us adjust quality for you. Pick Quality to set compression strength manually." + }, + "qualityAdjustment": { + "title": "Quality Adjustment", + "text": "Drag the slider to adjust the compression strength. Lower values (1-3) preserve quality but result in larger files. Higher values (7-9) shrink the file more but reduce image clarity.", + "bullet1": "Lower values preserve quality", + "bullet2": "Higher values reduce file size" + }, + "grayscale": { + "title": "Grayscale", + "text": "Select this option to convert all images to black and white, which can significantly reduce file size especially for scanned PDFs or image-heavy documents." + } + }, + "error": { + "failed": "An error occurred while compressing the PDF." + }, "selectText": { "1": { "_value": "Compression Settings", @@ -1486,10 +3435,7 @@ "4": "Mod automat - ajustează automat calitatea pentru a aduce PDF-ul la dimensiunea exactă", "5": "Dimensiunea PDF așteptată (de ex. 25MB, 10.8MB, 25KB)" }, - "submit": "Comprimare", - "method": { - "filesize": "Dimensiune Fișier" - } + "submit": "Comprimare" }, "decrypt": { "passwordPrompt": "This file is password-protected. Please enter the password:", @@ -1590,7 +3536,13 @@ "title": "Elimină imagine", "header": "Elimină imagine", "removeImage": "Elimină imagine", - "submit": "Elimină imagine" + "submit": "Elimină imagine", + "error": { + "failed": "Failed to remove images from the PDF." + }, + "results": { + "title": "Remove Images Results" + } }, "splitByChapters": { "title": "Split PDF by Chapters", @@ -1624,6 +3576,12 @@ }, "note": "Release notes are only available in English" }, + "swagger": { + "title": "API Documentation", + "header": "API Documentation", + "desc": "View and test the Stirling PDF API endpoints", + "tags": "api,documentation,swagger,endpoints,development" + }, "cookieBanner": { "popUp": { "title": "How we use Cookies", @@ -1659,42 +3617,943 @@ "title": "Analytics", "description": "These cookies help us understand how our tools are being used, so we can focus on building the features our community values most. Rest assured—Stirling PDF cannot and will never track the content of the documents you work with." } + }, + "services": { + "posthog": "PostHog Analytics", + "scarf": "Scarf Pixel" } }, - "download": "Descarcă", - "convert": { - "title": "Convertește", - "settings": "Setări", - "color": "Culoare", - "greyscale": "Scală de gri", - "fillPage": "Umple Pagina", - "pdfaDigitalSignatureWarning": "PDF-ul conține o semnătură digitală. Aceasta va fi eliminată ÃŽn pasul următor.", - "grayscale": "Scală de gri" + "removeMetadata": { + "submit": "Remove Metadata" }, - "attachments": { - "tags": "embed,attach,file,attachment,attachments", - "title": "Add attachments", - "header": "Add attachments", - "submit": "Add attachments" + "sidebar": { + "toggle": "Toggle Sidebar" + }, + "theme": { + "toggle": "Toggle Theme" + }, + "view": { + "viewer": "Viewer", + "pageEditor": "Page Editor", + "fileManager": "File Manager" + }, + "pageEditor": { + "title": "Page Editor", + "save": "Save Changes", + "noPdfLoaded": "No PDF loaded. Please upload a PDF to edit.", + "rotatedLeft": "Rotated left:", + "rotatedRight": "Rotated right:", + "deleted": "Deleted:", + "movedLeft": "Moved left:", + "movedRight": "Moved right:", + "splitAt": "Split at:", + "insertedPageBreak": "Inserted page break at:", + "addFileNotImplemented": "Add file not implemented in demo", + "closePdf": "Close PDF", + "reset": "Reset Changes", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "fitToWidth": "Fit to Width", + "actualSize": "Actual Size" + }, + "viewer": { + "firstPage": "First Page", + "lastPage": "Last Page", + "previousPage": "Previous Page", + "nextPage": "Next Page", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "singlePageView": "Single Page View", + "dualPageView": "Dual Page View" + }, + "rightRail": { + "closeSelected": "Close Selected Files", + "selectAll": "Select All", + "deselectAll": "Deselect All", + "selectByNumber": "Select by Page Numbers", + "deleteSelected": "Delete Selected Pages", + "closePdf": "Close PDF", + "exportAll": "Export PDF", + "downloadSelected": "Download Selected Files", + "downloadAll": "Download All", + "toggleTheme": "Toggle Theme", + "language": "Language", + "search": "Search PDF", + "panMode": "Pan Mode", + "rotateLeft": "Rotate Left", + "rotateRight": "Rotate Right", + "toggleSidebar": "Toggle Sidebar", + "exportSelected": "Export Selected Pages", + "toggleAnnotations": "Toggle Annotations Visibility", + "annotationMode": "Toggle Annotation Mode", + "draw": "Draw", + "save": "Save" + }, + "search": { + "title": "Search PDF", + "placeholder": "Enter search term...", + "noResults": "No results found", + "searching": "Searching..." + }, + "guestBanner": { + "title": "You're using Stirling PDF as a guest!", + "message": "Create a free account to save your work, access more features, and support the project.", + "dismiss": "Dismiss banner", + "signUp": "Sign Up Free" + }, + "toolPicker": { + "searchPlaceholder": "Search tools...", + "noToolsFound": "No tools found", + "allTools": "ALL TOOLS", + "quickAccess": "QUICK ACCESS", + "categories": { + "standardTools": "Standard Tools", + "advancedTools": "Advanced Tools", + "recommendedTools": "Recommended Tools" + }, + "subcategories": { + "signing": "Signing", + "documentSecurity": "Document Security", + "verification": "Verification", + "documentReview": "Document Review", + "pageFormatting": "Page Formatting", + "extraction": "Extraction", + "removal": "Removal", + "automation": "Automation", + "general": "General", + "advancedFormatting": "Advanced Formatting", + "developerTools": "Developer Tools" + } }, "quickAccess": { - "sign": "Semnează" + "read": "Read", + "sign": "Semnează", + "automate": "Automate", + "files": "Files", + "activity": "Activity", + "help": "Help", + "account": "Account", + "config": "Config", + "adminSettings": "Admin Settings", + "allTools": "All Tools" + }, + "admin": { + "error": "Error", + "success": "Success", + "expand": "Expand", + "close": "Close", + "status": { + "active": "Active", + "inactive": "Inactive" + }, + "settings": { + "title": "Admin Settings", + "workspace": "Workspace", + "fetchError": "Failed to load settings", + "saveError": "Failed to save settings", + "saved": "Settings saved successfully", + "saveSuccess": "Settings saved successfully", + "save": "Save Changes", + "restartRequired": "Restart Required", + "restart": { + "title": "Restart Required", + "message": "Settings have been saved successfully. A server restart is required for the changes to take effect.", + "question": "Would you like to restart the server now or later?", + "now": "Restart Now", + "later": "Restart Later" + }, + "restarting": "Restarting Server", + "restartingMessage": "The server is restarting. Please wait a moment...", + "restartError": "Failed to restart server. Please restart manually.", + "general": { + "title": "System Settings", + "description": "Configure system-wide application settings including branding and default behaviour.", + "ui": "User Interface", + "system": "System", + "appName": { + "label": "Application Name", + "description": "The name displayed in the browser tab and home page" + }, + "appNameNavbar": { + "label": "Navbar Brand", + "description": "The name displayed in the navigation bar" + }, + "homeDescription": { + "label": "Home Description", + "description": "The description text shown on the home page" + }, + "defaultLocale": { + "label": "Default Locale", + "description": "The default language for new users (e.g., en_US, es_ES)" + }, + "fileUploadLimit": { + "label": "File Upload Limit", + "description": "Maximum file upload size (e.g., 100MB, 1GB)" + }, + "showUpdate": { + "label": "Show Update Notifications", + "description": "Display notifications when a new version is available" + }, + "showUpdateOnlyAdmin": { + "label": "Show Updates to Admins Only", + "description": "Restrict update notifications to admin users only" + }, + "customHTMLFiles": { + "label": "Custom HTML Files", + "description": "Allow serving custom HTML files from the customFiles directory" + }, + "languages": { + "label": "Available Languages", + "description": "Languages that users can select from (leave empty to enable all languages)" + }, + "customMetadata": { + "label": "Custom Metadata", + "autoUpdate": { + "label": "Auto Update Metadata", + "description": "Automatically update PDF metadata on all processed documents" + }, + "author": { + "label": "Default Author", + "description": "Default author for PDF metadata (e.g., username)" + }, + "creator": { + "label": "Default Creator", + "description": "Default creator for PDF metadata" + }, + "producer": { + "label": "Default Producer", + "description": "Default producer for PDF metadata" + } + }, + "customPaths": { + "label": "Custom Paths", + "description": "Configure custom file system paths for pipeline processing and external tools", + "pipeline": { + "label": "Pipeline Directories", + "watchedFoldersDir": { + "label": "Watched Folders Directory", + "description": "Directory where pipeline monitors for incoming PDFs (leave empty for default: /pipeline/watchedFolders)" + }, + "finishedFoldersDir": { + "label": "Finished Folders Directory", + "description": "Directory where processed PDFs are outputted (leave empty for default: /pipeline/finishedFolders)" + } + }, + "operations": { + "label": "External Tool Paths", + "weasyprint": { + "label": "WeasyPrint Executable", + "description": "Path to WeasyPrint executable for HTML to PDF conversion (leave empty for default: /opt/venv/bin/weasyprint)" + }, + "unoconvert": { + "label": "Unoconvert Executable", + "description": "Path to LibreOffice unoconvert for document conversions (leave empty for default: /opt/venv/bin/unoconvert)" + } + } + } + }, + "security": { + "title": "Security", + "description": "Configure authentication, login behaviour, and security policies.", + "ssoNotice": { + "title": "Looking for SSO/SAML settings?", + "message": "OAuth2 and SAML2 authentication providers have been moved to the Connections menu for easier management." + }, + "authentication": "Authentication", + "enableLogin": { + "label": "Enable Login", + "description": "Require users to log in before accessing the application" + }, + "loginMethod": { + "label": "Login Method", + "description": "The authentication method to use for user login", + "all": "All Methods", + "normal": "Username/Password Only", + "oauth2": "OAuth2 Only", + "saml2": "SAML2 Only" + }, + "loginAttemptCount": { + "label": "Login Attempt Limit", + "description": "Maximum number of failed login attempts before account lockout" + }, + "loginResetTimeMinutes": { + "label": "Login Reset Time (minutes)", + "description": "Time before failed login attempts are reset" + }, + "csrfDisabled": { + "label": "Disable CSRF Protection", + "description": "Disable Cross-Site Request Forgery protection (not recommended)" + }, + "initialLogin": { + "label": "Initial Login", + "username": { + "label": "Initial Username", + "description": "The username for the initial admin account" + }, + "password": { + "label": "Initial Password", + "description": "The password for the initial admin account" + } + }, + "jwt": { + "label": "JWT Configuration", + "secureCookie": { + "label": "Secure Cookie", + "description": "Require HTTPS for JWT cookies (recommended for production)" + }, + "keyRetentionDays": { + "label": "Key Retention Days", + "description": "Number of days to retain old JWT keys for verification" + }, + "persistence": { + "label": "Enable Key Persistence", + "description": "Store JWT keys persistently to survive server restarts" + }, + "enableKeyRotation": { + "label": "Enable Key Rotation", + "description": "Automatically rotate JWT signing keys periodically" + }, + "enableKeyCleanup": { + "label": "Enable Key Cleanup", + "description": "Automatically remove expired JWT keys" + } + }, + "audit": { + "label": "Audit Logging", + "enabled": { + "label": "Enable Audit Logging", + "description": "Track user actions and system events for compliance and security monitoring" + }, + "level": { + "label": "Audit Level", + "description": "0=OFF, 1=BASIC, 2=STANDARD, 3=VERBOSE" + }, + "retentionDays": { + "label": "Audit Retention (days)", + "description": "Number of days to retain audit logs" + } + }, + "htmlUrlSecurity": { + "label": "HTML URL Security", + "description": "Configure URL access restrictions for HTML processing to prevent SSRF attacks", + "enabled": { + "label": "Enable URL Security", + "description": "Enable URL security restrictions for HTML to PDF conversions" + }, + "level": { + "label": "Security Level", + "description": "MAX: whitelist only, MEDIUM: block internal networks, OFF: no restrictions", + "max": "Maximum (Whitelist Only)", + "medium": "Medium (Block Internal)", + "off": "Off (No Restrictions)" + }, + "advanced": "Advanced Settings", + "allowedDomains": { + "label": "Allowed Domains (Whitelist)", + "description": "One domain per line (e.g., cdn.example.com). Only these domains allowed when level is MAX" + }, + "blockedDomains": { + "label": "Blocked Domains (Blacklist)", + "description": "One domain per line (e.g., malicious.com). Additional domains to block" + }, + "internalTlds": { + "label": "Internal TLDs", + "description": "One TLD per line (e.g., .local, .internal). Block domains with these TLD patterns" + }, + "networkBlocking": "Network Blocking", + "blockPrivateNetworks": { + "label": "Block Private Networks", + "description": "Block RFC 1918 private networks (10.x.x.x, 192.168.x.x, 172.16-31.x.x)" + }, + "blockLocalhost": { + "label": "Block Localhost", + "description": "Block localhost and loopback addresses (127.x.x.x, ::1)" + }, + "blockLinkLocal": { + "label": "Block Link-Local Addresses", + "description": "Block link-local addresses (169.254.x.x, fe80::/10)" + }, + "blockCloudMetadata": { + "label": "Block Cloud Metadata Endpoints", + "description": "Block cloud provider metadata endpoints (169.254.169.254)" + } + } + }, + "connections": { + "title": "Connections", + "description": "Configure external authentication providers like OAuth2 and SAML.", + "linkedServices": "Linked Services", + "unlinkedServices": "Unlinked Services", + "connect": "Connect", + "disconnect": "Disconnect", + "disconnected": "Provider disconnected successfully", + "disconnectError": "Failed to disconnect provider", + "ssoAutoLogin": { + "label": "SSO Auto Login", + "enable": "Enable SSO Auto Login", + "description": "Automatically redirect to SSO login when authentication is required" + }, + "oauth2": { + "label": "OAuth2", + "enabled": { + "label": "Enable OAuth2", + "description": "Allow users to authenticate using OAuth2 providers" + }, + "provider": { + "label": "Provider", + "description": "The OAuth2 provider to use for authentication" + }, + "issuer": { + "label": "Issuer URL", + "description": "The OAuth2 provider issuer URL" + }, + "clientId": { + "label": "Client ID", + "description": "The OAuth2 client ID from your provider" + }, + "clientSecret": { + "label": "Client Secret", + "description": "The OAuth2 client secret from your provider" + }, + "useAsUsername": { + "label": "Use as Username", + "description": "The OAuth2 claim to use as the username (e.g., email, sub)" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first OAuth2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via OAuth2" + }, + "scopes": { + "label": "OAuth2 Scopes", + "description": "Comma-separated list of OAuth2 scopes to request (e.g., openid, profile, email)" + } + }, + "saml2": { + "label": "SAML2", + "enabled": { + "label": "Enable SAML2", + "description": "Allow users to authenticate using SAML2 providers" + }, + "provider": { + "label": "Provider", + "description": "The SAML2 provider name" + }, + "registrationId": { + "label": "Registration ID", + "description": "The SAML2 registration identifier" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first SAML2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via SAML2" + } + } + }, + "database": { + "title": "Database", + "description": "Configure custom database connection settings for enterprise deployments.", + "configuration": "Database Configuration", + "enableCustom": { + "label": "Enable Custom Database", + "description": "Use your own custom database configuration instead of the default embedded database" + }, + "customUrl": { + "label": "Custom Database URL", + "description": "Full JDBC connection string (e.g., jdbc:postgresql://localhost:5432/postgres). If provided, individual connection settings below are not used." + }, + "type": { + "label": "Database Type", + "description": "Type of database (not used if custom URL is provided)" + }, + "hostName": { + "label": "Host Name", + "description": "Database server hostname (not used if custom URL is provided)" + }, + "port": { + "label": "Port", + "description": "Database server port (not used if custom URL is provided)" + }, + "name": { + "label": "Database Name", + "description": "Name of the database (not used if custom URL is provided)" + }, + "username": { + "label": "Username", + "description": "Database authentication username" + }, + "password": { + "label": "Password", + "description": "Database authentication password" + } + }, + "privacy": { + "title": "Privacy", + "description": "Configure privacy and data collection settings.", + "analytics": "Analytics & Tracking", + "enableAnalytics": { + "label": "Enable Analytics", + "description": "Collect anonymous usage analytics to help improve the application" + }, + "metricsEnabled": { + "label": "Enable Metrics", + "description": "Enable collection of performance and usage metrics. Provides API endpoint for admins to access metrics data" + }, + "searchEngine": "Search Engine Visibility", + "googleVisibility": { + "label": "Google Visibility", + "description": "Allow search engines to index this application" + } + }, + "advanced": { + "title": "Advanced", + "description": "Configure advanced features and experimental functionality.", + "features": "Feature Flags", + "processing": "Processing", + "endpoints": { + "label": "Endpoints", + "manage": "Manage API Endpoints", + "description": "Endpoint management is configured via YAML. See documentation for details on enabling/disabling specific endpoints." + }, + "enableAlphaFunctionality": { + "label": "Enable Alpha Features", + "description": "Enable experimental and alpha-stage features (may be unstable)" + }, + "enableUrlToPDF": { + "label": "Enable URL to PDF", + "description": "Allow conversion of web pages to PDF documents" + }, + "maxDPI": { + "label": "Maximum DPI", + "description": "Maximum DPI for image processing (0 = unlimited)" + }, + "tessdataDir": { + "label": "Tessdata Directory", + "description": "Path to the tessdata directory for OCR language files" + }, + "disableSanitize": { + "label": "Disable HTML Sanitization", + "description": "WARNING: Security risk - disabling HTML sanitization can lead to XSS vulnerabilities" + }, + "tempFileManagement": { + "label": "Temp File Management", + "description": "Configure temporary file storage and cleanup behavior", + "baseTmpDir": { + "label": "Base Temp Directory", + "description": "Base directory for temporary files (leave empty for default: java.io.tmpdir/stirling-pdf)" + }, + "libreofficeDir": { + "label": "LibreOffice Temp Directory", + "description": "Directory for LibreOffice temp files (leave empty for default: baseTmpDir/libreoffice)" + }, + "systemTempDir": { + "label": "System Temp Directory", + "description": "System temp directory to clean (only used if cleanupSystemTemp is enabled)" + }, + "prefix": { + "label": "Temp File Prefix", + "description": "Prefix for temp file names" + }, + "maxAgeHours": { + "label": "Max Age (hours)", + "description": "Maximum age in hours before temp files are cleaned up" + }, + "cleanupIntervalMinutes": { + "label": "Cleanup Interval (minutes)", + "description": "How often to run cleanup (in minutes)" + }, + "startupCleanup": { + "label": "Startup Cleanup", + "description": "Clean up old temp files on application startup" + }, + "cleanupSystemTemp": { + "label": "Cleanup System Temp", + "description": "Whether to clean broader system temp directory (use with caution)" + } + }, + "processExecutor": { + "label": "Process Executor Limits", + "description": "Configure session limits and timeouts for each process executor", + "sessionLimit": { + "label": "Session Limit", + "description": "Maximum concurrent instances" + }, + "timeout": { + "label": "Timeout (minutes)", + "description": "Maximum execution time" + }, + "libreOffice": "LibreOffice", + "pdfToHtml": "PDF to HTML", + "qpdf": "QPDF", + "tesseract": "Tesseract OCR", + "pythonOpenCv": "Python OpenCV", + "weasyPrint": "WeasyPrint", + "installApp": "Install App", + "calibre": "Calibre", + "ghostscript": "Ghostscript", + "ocrMyPdf": "OCRmyPDF" + } + }, + "mail": { + "title": "Mail Server", + "description": "Configure SMTP settings for sending email notifications.", + "smtp": "SMTP Configuration", + "enabled": { + "label": "Enable Mail", + "description": "Enable email notifications and SMTP functionality" + }, + "host": { + "label": "SMTP Host", + "description": "The hostname or IP address of your SMTP server" + }, + "port": { + "label": "SMTP Port", + "description": "The port number for SMTP connection (typically 25, 465, or 587)" + }, + "username": { + "label": "SMTP Username", + "description": "Username for SMTP authentication" + }, + "password": { + "label": "SMTP Password", + "description": "Password for SMTP authentication" + }, + "from": { + "label": "From Address", + "description": "The email address to use as the sender" + }, + "enableInvites": { + "label": "Enable Email Invites", + "description": "Allow admins to invite users via email with auto-generated passwords" + }, + "frontendUrl": { + "label": "Frontend URL", + "description": "Base URL for frontend (e.g. https://pdf.example.com). Used for generating invite links in emails. Leave empty to use backend URL." + } + }, + "legal": { + "title": "Legal Documents", + "description": "Configure links to legal documents and policies.", + "disclaimer": { + "title": "Legal Responsibility Warning", + "message": "By customizing these legal documents, you assume full responsibility for ensuring compliance with all applicable laws and regulations, including but not limited to GDPR and other EU data protection requirements. Only modify these settings if: (1) you are operating a personal/private instance, (2) you are outside EU jurisdiction and understand your local legal obligations, or (3) you have obtained proper legal counsel and accept sole responsibility for all user data and legal compliance. Stirling-PDF and its developers assume no liability for your legal obligations." + }, + "termsAndConditions": { + "label": "Terms and Conditions", + "description": "URL or filename to terms and conditions" + }, + "privacyPolicy": { + "label": "Privacy Policy", + "description": "URL or filename to privacy policy" + }, + "accessibilityStatement": { + "label": "Accessibility Statement", + "description": "URL or filename to accessibility statement" + }, + "cookiePolicy": { + "label": "Cookie Policy", + "description": "URL or filename to cookie policy" + }, + "impressum": { + "label": "Impressum", + "description": "URL or filename to impressum (required in some jurisdictions)" + } + }, + "premium": { + "title": "Premium & Enterprise", + "description": "Configure your premium or enterprise license key.", + "license": "License Configuration", + "key": { + "label": "License Key", + "description": "Enter your premium or enterprise license key" + }, + "enabled": { + "label": "Enable Premium Features", + "description": "Enable license key checks for pro/enterprise features" + }, + "movedFeatures": { + "title": "Premium Features Distributed", + "message": "Premium and Enterprise features are now organized in their respective sections:" + } + }, + "features": { + "title": "Features", + "description": "Configure optional features and functionality.", + "serverCertificate": { + "label": "Server Certificate", + "description": "Configure server-side certificate generation for \"Sign with Stirling-PDF\" functionality", + "enabled": { + "label": "Enable Server Certificate", + "description": "Enable server-side certificate for \"Sign with Stirling-PDF\" option" + }, + "organizationName": { + "label": "Organization Name", + "description": "Organization name for generated certificates" + }, + "validity": { + "label": "Certificate Validity (days)", + "description": "Number of days the certificate will be valid" + }, + "regenerateOnStartup": { + "label": "Regenerate on Startup", + "description": "Generate new certificate on each application startup" + } + } + }, + "endpoints": { + "title": "API Endpoints", + "description": "Control which API endpoints and endpoint groups are available.", + "management": "Endpoint Management", + "toRemove": { + "label": "Disabled Endpoints", + "description": "Select individual endpoints to disable" + }, + "groupsToRemove": { + "label": "Disabled Endpoint Groups", + "description": "Select endpoint groups to disable" + }, + "note": "Note: Disabling endpoints restricts API access but does not remove UI components. Restart required for changes to take effect." + } + } + }, + "fileUpload": { + "selectFile": "Select a file", + "selectFiles": "Select files", + "selectPdfToView": "Select a PDF to view", + "selectPdfToEdit": "Select a PDF to edit", + "chooseFromStorage": "Choose a file from storage or upload a new PDF", + "chooseFromStorageMultiple": "Choose files from storage or upload new PDFs", + "loadFromStorage": "Load from Storage", + "filesAvailable": "files available", + "loading": "Loading...", + "or": "or", + "dropFileHere": "Drop file here or click to upload", + "dropFilesHere": "Drop files here or click the upload button", + "pdfFilesOnly": "PDF files only", + "supportedFileTypes": "Supported file types", + "upload": "Upload", + "uploadFile": "Upload File", + "uploadFiles": "Upload Files", + "noFilesInStorage": "No files available in storage. Upload some files first.", + "selectFromStorage": "Select from Storage", + "backToTools": "Back to Tools", + "addFiles": "Add Files", + "dragFilesInOrClick": "Drag files in or click \"Add Files\" to browse" + }, + "fileEditor": { + "addFiles": "Add Files" }, "fileManager": { + "title": "Upload PDF Files", + "subtitle": "Add files to your storage for easy access across tools", + "filesSelected": "files selected", + "clearSelection": "Clear Selection", + "openInFileEditor": "Open in File Editor", + "uploadError": "Failed to upload some files.", + "failedToOpen": "Failed to open file. It may have been removed from storage.", + "failedToLoad": "Failed to load file to active set.", + "storageCleared": "Browser cleared storage. Files have been removed. Please re-upload.", + "clearAll": "Clear All", + "reloadFiles": "Reload Files", + "dragDrop": "Drag & Drop files here", + "clickToUpload": "Click to upload files", + "selectedFiles": "Selected Files", + "storage": "Storage", + "filesStored": "files stored", + "storageError": "Storage error occurred", + "storageLow": "Storage is running low. Consider removing old files.", + "supportMessage": "Powered by browser database storage for unlimited capacity", + "noFileSelected": "No files selected", + "showHistory": "Show History", + "hideHistory": "Hide History", + "fileHistory": "File History", + "loadingHistory": "Loading History...", + "lastModified": "Last Modified", + "toolChain": "Tools Applied", + "restore": "Restore", + "unzip": "Unzip", + "searchFiles": "Search files...", + "recent": "Recent", + "localFiles": "Local Files", + "googleDrive": "Google Drive", + "googleDriveShort": "Drive", + "myFiles": "My Files", + "noRecentFiles": "No recent files found", + "googleDriveNotAvailable": "Google Drive integration not available", + "openFiles": "Open Files", + "openFile": "Open File", + "details": "File Details", "fileName": "Numele", + "fileFormat": "Format", + "fileSize": "Size", "fileVersion": "Versiune", + "totalSelected": "Total Selected", + "dropFilesHere": "Drop files here", + "selectAll": "Select All", + "deselectAll": "Deselect All", + "deleteSelected": "Delete Selected", + "downloadSelected": "Download Selected", + "selectedCount": "{{count}} selected", "download": "Descarcă", - "delete": "Șterge" + "delete": "Șterge", + "unsupported": "Unsupported", + "addToUpload": "Add to Upload", + "deleteAll": "Delete All", + "loadingFiles": "Loading files...", + "noFiles": "No files available", + "noFilesFound": "No files found matching your search", + "openInPageEditor": "Open in Page Editor", + "showAll": "Show All", + "sortByDate": "Sort by Date", + "sortByName": "Sort by Name", + "sortBySize": "Sort by Size" + }, + "storage": { + "temporaryNotice": "Files are stored temporarily in your browser and may be cleared automatically", + "storageLimit": "Storage limit", + "storageUsed": "Temporary Storage used", + "storageFull": "Storage is nearly full. Consider removing some files.", + "fileTooLarge": "File too large. Maximum size per file is", + "storageQuotaExceeded": "Storage quota exceeded. Please remove some files before uploading more.", + "approximateSize": "Approximate size" }, "sanitize": { + "title": "Sanitise", + "desc": "Remove potentially harmful elements from PDF files.", "submit": "Igienizează PDF", + "completed": "Sanitisation completed successfully", + "error": { + "generic": "Sanitisation failed", + "failed": "An error occurred while sanitising the PDF." + }, + "filenamePrefix": "sanitised", + "sanitizationResults": "Sanitisation Results", "steps": { - "settings": "Setări" + "files": "Files", + "settings": "Setări", + "results": "Results" + }, + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "options": { + "title": "Sanitisation Options", + "note": "Select the elements you want to remove from the PDF. At least one option must be selected.", + "removeJavaScript": { + "label": "Remove JavaScript", + "desc": "Remove JavaScript actions and scripts from the PDF" + }, + "removeEmbeddedFiles": { + "label": "Remove Embedded Files", + "desc": "Remove any files embedded within the PDF" + }, + "removeXMPMetadata": { + "label": "Remove XMP Metadata", + "desc": "Remove XMP metadata from the PDF" + }, + "removeMetadata": { + "label": "Remove Document Metadata", + "desc": "Remove document information metadata (title, author, etc.)" + }, + "removeLinks": { + "label": "Remove Links", + "desc": "Remove external links and launch actions from the PDF" + }, + "removeFonts": { + "label": "Remove Fonts", + "desc": "Remove embedded fonts from the PDF" + } + } + }, + "addPassword": { + "title": "Adaugă parolă", + "desc": "Encrypt your PDF document with a password.", + "completed": "Password protection applied", + "submit": "Criptează", + "filenamePrefix": "encrypted", + "error": { + "failed": "An error occurred while encrypting the PDF." + }, + "passwords": { + "stepTitle": "Passwords & Encryption", + "completed": "Passwords configured", + "user": { + "label": "User Password", + "placeholder": "Enter user password" + }, + "owner": { + "label": "Owner Password", + "placeholder": "Enter owner password" + } + }, + "encryption": { + "keyLength": { + "label": "Encryption Key Length", + "40bit": "40-bit (Low)", + "128bit": "128-bit (Standard)", + "256bit": "256-bit (High)" + } + }, + "results": { + "title": "Encrypted PDFs" + }, + "tooltip": { + "header": { + "title": "Password Protection Overview" + }, + "passwords": { + "title": "Password Types", + "text": "User passwords restrict opening the document, while owner passwords control what can be done with the document once opened. You can set both or just one.", + "bullet1": "User Password: Required to open the PDF", + "bullet2": "Owner Password: Controls document permissions (not supported by all PDF viewers)" + }, + "encryption": { + "title": "Encryption Levels", + "text": "Higher encryption levels provide better security but may not be supported by older PDF viewers.", + "bullet1": "40-bit: Basic security, compatible with older viewers", + "bullet2": "128-bit: Standard security, widely supported", + "bullet3": "256-bit: Maximum security, requires modern viewers" + }, + "permissions": { + "title": "Schimbă Permisiunile", + "text": "These permissions control what users can do with the PDF. Most effective when combined with an owner password." + } + }, + "tags": "securizează,securitate", + "header": "Adaugă o parolă (Criptare)", + "selectText": { + "1": "Selectează PDF-ul pentru criptare", + "2": "Parolă", + "3": "Lungime cheie de criptare", + "4": "Valori mai mari sunt mai puternice, dar valorile mai mici au o compatibilitate mai bună.", + "5": "Permisiuni de setare", + "6": "Previne asamblarea documentului", + "7": "Previne extragerea conținutului", + "8": "Previne extragerea pentru accesibilitate", + "9": "Previne completarea formularului", + "10": "Previne modificarea", + "11": "Previne modificarea adnotărilor", + "12": "Previne tipărirea", + "13": "Previne tipărirea ÃŽn formate diferite", + "14": "Parolă Proprietar", + "15": "Restricționează ce se poate face cu documentul odată ce este deschis (Nu este suportat de toate programele de citire)", + "16": "Restricționează deschiderea documentului ÃŽn sine" } }, "changePermissions": { "title": "Schimbă Permisiunile", + "desc": "Change document restrictions and permissions.", + "completed": "Permissions changed", "submit": "Schimbă Permisiunile", + "error": { + "failed": "An error occurred while changing PDF permissions." + }, "permissions": { "preventAssembly": { "label": "Previne asamblarea documentului" @@ -1721,10 +4580,784 @@ "label": "Previne tipărirea ÃŽn formate diferite" } }, + "results": { + "title": "Modified PDFs" + }, "tooltip": { "header": { "title": "Schimbă Permisiunile" + }, + "description": { + "text": "Changes document permissions, allowing/disallowing access to different features in PDF readers." + }, + "warning": { + "text": "To make these permissions unchangeable, use the Add Password tool to set an owner password." } } + }, + "removePassword": { + "title": "Elimină parola", + "desc": "Elimină protecția cu parolă din documentul PDF.", + "tags": "securizează,Decriptează,securitate,elimină parola,șterge parola", + "password": { + "stepTitle": "Elimină Parola", + "label": "Parola Curentă", + "placeholder": "Enter current password", + "completed": "Password configured" + }, + "filenamePrefix": "decrypted", + "error": { + "failed": "An error occurred while removing the password from the PDF." + }, + "tooltip": { + "description": "Removing password protection requires the password that was used to encrypt the PDF. This will decrypt the document, making it accessible without a password." + }, + "submit": "Elimină", + "results": { + "title": "Decrypted PDFs" + }, + "header": "Elimină parola (Decodifică)", + "selectText": { + "1": "Selectează PDF-ul pentru decodificare", + "2": "Parolă" + } + }, + "automate": { + "title": "Automate", + "desc": "Build multi-step workflows by chaining together PDF actions. Ideal for recurring tasks.", + "invalidStep": "Invalid step", + "files": { + "placeholder": "Select files to process with this automation" + }, + "selection": { + "title": "Automation Selection", + "saved": { + "title": "Saved" + }, + "createNew": { + "title": "Create New Automation" + }, + "suggested": { + "title": "Suggested" + } + }, + "creation": { + "createTitle": "Create Automation", + "editTitle": "Edit Automation", + "intro": "Automations run tools sequentially. To get started, add tools in the order you want them to run.", + "name": { + "label": "Automation Name", + "placeholder": "My Automation" + }, + "description": { + "label": "Description (optional)", + "placeholder": "Describe what this automation does..." + }, + "tools": { + "selectTool": "Select a tool...", + "selected": "Selected Tools", + "remove": "Remove tool", + "configure": "Configure tool", + "notConfigured": "! Not Configured", + "addTool": "Add Tool", + "add": "Add a tool..." + }, + "save": "Save Automation", + "unsavedChanges": { + "title": "Unsaved Changes", + "message": "You have unsaved changes. Are you sure you want to go back? All changes will be lost.", + "cancel": "Cancel", + "confirm": "Go Back" + }, + "icon": { + "label": "Icon" + } + }, + "run": { + "title": "Run Automation" + }, + "sequence": { + "unnamed": "Unnamed Automation", + "steps": "{{count}} steps", + "running": "Running Automation...", + "run": "Run Automation", + "finish": "Finish" + }, + "reviewTitle": "Automation Results", + "config": { + "loading": "Loading tool configuration...", + "noSettings": "This tool does not have configurable settings.", + "title": "Configure {{toolName}}", + "description": "Configure the settings for this tool. These settings will be applied when the automation runs.", + "cancel": "Cancel", + "save": "Save Configuration" + }, + "copyToSaved": "Copy to Saved" + }, + "automation": { + "suggested": { + "securePdfIngestion": "Secure PDF Ingestion", + "securePdfIngestionDesc": "Comprehensive PDF processing workflow that sanitises documents, applies OCR with cleanup, converts to PDF/A format for long-term archival, and optimises file size.", + "emailPreparation": "Email Preparation", + "emailPreparationDesc": "Optimises PDFs for email distribution by compressing files, splitting large documents into 20MB chunks for email compatibility, and removing metadata for privacy.", + "secureWorkflow": "Security Workflow", + "secureWorkflowDesc": "Secures PDF documents by removing potentially malicious content like JavaScript and embedded files, then adds password protection to prevent unauthorised access. Password is set to 'password' by default.", + "processImages": "Process Images", + "processImagesDesc": "Converts multiple image files into a single PDF document, then applies OCR technology to extract searchable text from the images." + } + }, + "common": { + "copy": "Copy", + "copied": "Copied!", + "refresh": "Refresh", + "retry": "Retry", + "remaining": "remaining", + "used": "used", + "available": "available", + "cancel": "Cancel", + "preview": "Preview" + }, + "config": { + "overview": { + "title": "Application Configuration", + "description": "Current application settings and configuration details." + }, + "account": { + "overview": { + "title": "Account Settings", + "manageAccountPreferences": "Manage your account preferences", + "guestDescription": "You are signed in as a guest. Consider upgrading your account above." + }, + "upgrade": { + "title": "Upgrade Guest Account", + "description": "Link your account to preserve your history and access more features!", + "socialLogin": "Upgrade with Social Account", + "linkWith": "Link with", + "emailPassword": "or enter your email & password", + "email": "Email", + "emailPlaceholder": "Enter your email", + "password": "Password (optional)", + "passwordPlaceholder": "Set a password", + "passwordNote": "Leave empty to use email verification only", + "upgradeButton": "Upgrade Account" + } + }, + "apiKeys": { + "description": "Your API key for accessing Stirling's suite of PDF tools. Copy it to your project or refresh to generate a new one.", + "publicKeyAriaLabel": "Public API key", + "copyKeyAriaLabel": "Copy API key", + "refreshAriaLabel": "Refresh API key", + "includedCredits": "Included credits", + "purchasedCredits": "Purchased credits", + "totalCredits": "Total Credits", + "chartAriaLabel": "Credits usage: included {{includedUsed}} of {{includedTotal}}, purchased {{purchasedUsed}} of {{purchasedTotal}}", + "nextReset": "Next Reset", + "lastApiUse": "Last API Use", + "overlayMessage": "Generate a key to see credits and available credits", + "label": "API Key", + "guestInfo": "Guest users do not receive API keys. Create an account to get an API key you can use in your applications.", + "goToAccount": "Go to Account", + "refreshModal": { + "title": "Refresh API Keys", + "warning": "âš ī¸ Warning: This action will generate new API keys and make your previous keys invalid.", + "impact": "Any applications or services currently using these keys will stop working until you update them with the new keys.", + "confirmPrompt": "Are you sure you want to continue?", + "confirmCta": "Refresh Keys" + }, + "generateError": "We couldn't generate your API key." + } + }, + "AddAttachmentsRequest": { + "attachments": "Select Attachments", + "info": "Select files to attach to your PDF. These files will be embedded and accessible through the PDF's attachment panel.", + "selectFiles": "Select Files to Attach", + "placeholder": "Choose files...", + "addMoreFiles": "Add more files...", + "selectedFiles": "Selected Files", + "submit": "Add Attachments", + "results": { + "title": "Attachment Results" + }, + "error": { + "failed": "Add attachments operation failed" + } + }, + "termsAndConditions": "Terms & Conditions", + "logOut": "Log out", + "addAttachments": { + "error": { + "failed": "An error occurred while adding attachments to the PDF." + } + }, + "autoRename": { + "description": "This tool will automatically rename PDF files based on their content. It analyzes the document to find the most suitable title from the text." + }, + "customPosition": "Custom Position", + "details": "Details", + "downloadUnavailable": "Download unavailable for this item", + "invalidUndoData": "Cannot undo: invalid operation data", + "margin": { + "large": "Large", + "medium": "Medium", + "small": "Small", + "xLarge": "Extra Large" + }, + "noFilesToUndo": "Cannot undo: no files were processed in the last operation", + "noOperationToUndo": "No operation to undo", + "noValidFiles": "No valid files to process", + "operationCancelled": "Operation cancelled", + "pageEdit": { + "deselectAll": "Select None", + "selectAll": "Select All" + }, + "quickPosition": "Quick Position", + "reorganizePages": { + "error": { + "failed": "Failed to reorganize pages" + }, + "results": { + "title": "Pages Reorganized" + }, + "settings": { + "title": "Settings" + }, + "submit": "Reorganize Pages" + }, + "replace-color": { + "options": { + "fill": "Fill colour", + "gradient": "Gradient" + }, + "previewOverlayOpacity": "Preview overlay opacity", + "previewOverlayTransparency": "Preview overlay transparency", + "previewOverlayVisibility": "Show preview overlay", + "selectText": { + "1": "Replace or Invert color Options", + "2": "Default(Default high contrast colors)", + "3": "Custom(Customized colors)", + "4": "Full-Invert(Invert all colors)", + "5": "High contrast color options", + "6": "white text on black background", + "7": "Black text on white background", + "8": "Yellow text on black background", + "9": "Green text on black background", + "10": "Choose text Color", + "11": "Choose background Color", + "12": "Choose start colour", + "13": "Choose end colour" + }, + "submit": "Replace", + "title": "Replace-Invert-Color", + "header": "Replace-Invert Color PDF" + }, + "size": "Size", + "submit": "Submit", + "success": "Success", + "tools": { + "noSearchResults": "No tools found", + "noTools": "No tools available" + }, + "undoDataMismatch": "Cannot undo: operation data is corrupted", + "undoFailed": "Failed to undo operation", + "undoQuotaError": "Cannot undo: insufficient storage space", + "undoStorageError": "Undo completed but some files could not be saved to storage", + "undoSuccess": "Operation undone successfully", + "unsupported": "Unsupported", + "onboarding": { + "welcomeModal": { + "title": "Welcome to Stirling PDF!", + "description": "Would you like to take a quick 1-minute tour to learn the key features and how to get started?", + "helpHint": "You can always access this tour later from the Help button in the bottom left.", + "startTour": "Start Tour", + "maybeLater": "Maybe Later", + "dontShowAgain": "Don't Show Again" + }, + "allTools": "This is the All Tools panel, where you can browse and select from all available PDF tools.", + "selectCropTool": "Let's select the Crop tool to demonstrate how to use one of the tools.", + "toolInterface": "This is the Crop tool interface. As you can see, there's not much there because we haven't added any PDF files to work with yet.", + "filesButton": "The Files button on the Quick Access bar allows you to upload PDFs to use the tools on.", + "fileSources": "You can upload new files or access recent files from here. For the tour, we'll just use a sample file.", + "workbench": "This is the Workbench - the main area where you view and edit your PDFs.", + "viewSwitcher": "Use these controls to select how you want to view your PDFs.", + "viewer": "The Viewer lets you read and annotate your PDFs.", + "pageEditor": "The Page Editor allows you to do various operations on the pages within your PDFs, such as reordering, rotating and deleting.", + "activeFiles": "The Active Files view shows all of the PDFs you have loaded into the tool, and allows you to select which ones to process.", + "fileCheckbox": "Clicking one of the files selects it for processing. You can select multiple files for batch operations.", + "selectControls": "The Right Rail contains buttons to quickly select/deselect all of your active PDFs, along with buttons to change the app's theme or language.", + "cropSettings": "Now that we've selected the file we want crop, we can configure the Crop tool to choose the area that we want to crop the PDF to.", + "runButton": "Once the tool has been configured, this button allows you to run the tool on all the selected PDFs.", + "results": "After the tool has finished running, the Review step will show a preview of the results in this panel, and allow you to undo the operation or download the file. ", + "fileReplacement": "The modified file will replace the original file in the Workbench automatically, allowing you to easily run it through more tools.", + "pinButton": "You can use the Pin button if you'd rather your files stay active after running tools on them.", + "wrapUp": "You're all set! You've learnt about the main areas of the app and how to use them. Click the Help button whenever you like to see this tour again.", + "previous": "Previous", + "next": "Next", + "finish": "Finish", + "startTour": "Start Tour", + "startTourDescription": "Take a guided tour of Stirling PDF's key features" + }, + "workspace": { + "title": "Workspace", + "people": { + "title": "People", + "description": "Manage workspace members and their permissions", + "loading": "Loading people...", + "searchMembers": "Search members...", + "addMembers": "Add Members", + "inviteMembers": { + "label": "Invite Members", + "subtitle": "Type or paste in emails below, separated by commas. Your workspace will be billed by members." + }, + "user": "User", + "role": "Role", + "team": "Team", + "status": "Status", + "actions": "Actions", + "noMembersFound": "No members found", + "active": "Active", + "disabled": "Disabled", + "activeSession": "Active session", + "member": "Member", + "admin": "Admin", + "roleDescriptions": { + "admin": "Can manage settings and invite members, with full administrative access.", + "member": "Can view and edit shared files, but cannot manage workspace settings or members." + }, + "editRole": "Edit Role", + "enable": "Enable", + "disable": "Disable", + "deleteUser": "Delete User", + "deleteUserSuccess": "User deleted successfully", + "deleteUserError": "Failed to delete user", + "confirmDelete": "Are you sure you want to delete this user? This action cannot be undone.", + "addMember": { + "title": "Add Member", + "username": "Username (Email)", + "usernamePlaceholder": "user@example.com", + "password": "Password", + "passwordPlaceholder": "Enter password", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "forcePasswordChange": "Force password change on first login", + "cancel": "Cancel", + "submit": "Add Member", + "usernameRequired": "Username and password are required", + "passwordTooShort": "Password must be at least 6 characters", + "success": "User created successfully", + "error": "Failed to create user" + }, + "editMember": { + "title": "Edit Member", + "editing": "Editing:", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "cancel": "Cancel", + "submit": "Update Member", + "success": "User updated successfully", + "error": "Failed to update user" + }, + "toggleEnabled": { + "success": "User status updated successfully", + "error": "Failed to update user status" + }, + "delete": { + "success": "User deleted successfully", + "error": "Failed to delete user" + }, + "emailInvite": { + "tab": "Email Invite", + "description": "Type or paste in emails below, separated by commas. Users will receive login credentials via email.", + "emails": "Email Addresses", + "emailsPlaceholder": "user1@example.com, user2@example.com", + "emailsRequired": "At least one email address is required", + "submit": "Send Invites", + "success": "user(s) invited successfully", + "partialSuccess": "Some invites failed", + "allFailed": "Failed to invite users", + "error": "Failed to send invites" + }, + "directInvite": { + "tab": "Direct Create" + }, + "inviteLinkTab": { + "tab": "Invite Link" + }, + "inviteLink": { + "description": "Generate a secure link that allows the user to set their own password", + "email": "Email Address", + "emailPlaceholder": "user@example.com (optional)", + "emailDescription": "Optional - leave blank for a general invite link that can be used by anyone", + "emailRequired": "Email address is required", + "emailOptional": "Optional - leave blank for a general invite link", + "emailRequiredForSend": "Email address is required to send email notification", + "expiryHours": "Expiry Hours", + "expiryDescription": "How many hours until the link expires", + "sendEmail": "Send invite link via email", + "sendEmailDescription": "If enabled, the invite link will be sent to the specified email address", + "smtpRequired": "SMTP not configured", + "generate": "Generate Link", + "generated": "Invite Link Generated", + "copied": "Link copied to clipboard", + "success": "Invite link generated successfully", + "successWithEmail": "Invite link generated and sent via email", + "emailFailed": "Invite link generated, but email failed", + "emailFailedDetails": "Error: {0}. Please share the invite link manually.", + "error": "Failed to generate invite link", + "submit": "Generate Invite Link" + }, + "inviteMode": { + "username": "Username", + "email": "Email", + "link": "Link", + "emailDisabled": "Email invites require SMTP configuration and mail.enableInvites=true in settings" + }, + "license": { + "users": "users", + "availableSlots": "Available Slots", + "grandfathered": "Grandfathered", + "grandfatheredShort": "{{count}} grandfathered", + "fromLicense": "from license", + "slotsAvailable": "{{count}} user slot(s) available", + "noSlotsAvailable": "No slots available", + "currentUsage": "Currently using {{current}} of {{max}} user licences" + } + }, + "teams": { + "title": "Teams", + "description": "Manage teams and organize workspace members", + "loading": "Loading teams...", + "loadingDetails": "Loading team details...", + "createNewTeam": "Create New Team", + "teamName": "Team Name", + "totalMembers": "Total Members", + "actions": "Actions", + "noTeamsFound": "No teams found", + "noMembers": "No members in this team", + "system": "System", + "addMember": "Add Member", + "viewTeam": "View Team", + "removeMember": "Remove from team", + "cannotRemoveFromSystemTeam": "Cannot remove from system team", + "renameTeamLabel": "Rename Team", + "deleteTeamLabel": "Delete Team", + "cannotDeleteInternal": "Cannot delete the Internal team", + "confirmDelete": "Are you sure you want to delete this team? This team must be empty to delete.", + "confirmRemove": "Remove user from this team?", + "cannotRenameInternal": "Cannot rename the Internal team", + "cannotAddToInternal": "Cannot add members to the Internal team", + "teamNotFound": "Team not found", + "backToTeams": "Back to Teams", + "memberCount": "{{count}} members", + "removeMemberSuccess": "User removed from team", + "removeMemberError": "Failed to remove user from team", + "createTeam": { + "title": "Create New Team", + "teamName": "Team Name", + "teamNamePlaceholder": "Enter team name", + "cancel": "Cancel", + "submit": "Create Team", + "nameRequired": "Team name is required", + "success": "Team created successfully", + "error": "Failed to create team" + }, + "renameTeam": { + "title": "Rename Team", + "renaming": "Renaming:", + "newTeamName": "New Team Name", + "newTeamNamePlaceholder": "Enter new team name", + "cancel": "Cancel", + "submit": "Rename Team", + "nameRequired": "Team name is required", + "success": "Team renamed successfully", + "error": "Failed to rename team" + }, + "deleteTeam": { + "success": "Team deleted successfully", + "error": "Failed to delete team. Make sure the team is empty.", + "teamMustBeEmpty": "Team must be empty before deletion" + }, + "addMemberToTeam": { + "title": "Add Member to Team", + "addingTo": "Adding to", + "selectUser": "Select User", + "selectUserPlaceholder": "Choose a user", + "selectUserRequired": "Please select a user", + "currentlyIn": "currently in", + "willBeMoved": "Note: This user will be moved from their current team to this team.", + "cancel": "Cancel", + "submit": "Add Member", + "userRequired": "Please select a user", + "success": "Member added to team successfully", + "error": "Failed to add member to team" + }, + "changeTeam": { + "label": "Change Team", + "title": "Change Team", + "changing": "Moving", + "selectTeam": "Select Team", + "selectTeamPlaceholder": "Choose a team", + "selectTeamRequired": "Please select a team", + "success": "Team changed successfully", + "error": "Failed to change team", + "submit": "Change Team" + } + } + }, + "plan": { + "currency": "Currency", + "popular": "Popular", + "current": "Current Plan", + "upgrade": "Upgrade", + "contact": "Contact Us", + "customPricing": "Custom", + "showComparison": "Compare All Features", + "hideComparison": "Hide Feature Comparison", + "featureComparison": "Feature Comparison", + "activePlan": { + "title": "Active Plan", + "subtitle": "Your current subscription details" + }, + "availablePlans": { + "title": "Available Plans", + "subtitle": "Choose the plan that fits your needs" + }, + "static": { + "title": "Billing Information", + "message": "Online billing is not currently configured. To upgrade your plan or manage subscriptions, please contact us directly.", + "contactSales": "Contact Sales", + "contactToUpgrade": "Contact us to upgrade or customize your plan", + "maxUsers": "Max Users", + "upTo": "Up to" + }, + "period": { + "month": "month" + }, + "free": { + "name": "Free", + "highlight1": "Limited Tool Usage Per week", + "highlight2": "Access to all tools", + "highlight3": "Community support" + }, + "pro": { + "name": "Pro", + "highlight1": "Unlimited Tool Usage", + "highlight2": "Advanced PDF tools", + "highlight3": "No watermarks" + }, + "enterprise": { + "name": "Enterprise", + "highlight1": "Custom pricing", + "highlight2": "Dedicated support", + "highlight3": "Latest features" + }, + "feature": { + "title": "Feature", + "pdfTools": "Basic PDF Tools", + "fileSize": "File Size Limit", + "automation": "Automate tool workflows", + "api": "API Access", + "priority": "Priority Support", + "customPricing": "Custom Pricing" + } + }, + "subscription": { + "status": { + "active": "Active", + "pastDue": "Past Due", + "canceled": "Canceled", + "incomplete": "Incomplete", + "trialing": "Trial", + "none": "No Subscription" + }, + "renewsOn": "Renews on {{date}}", + "cancelsOn": "Cancels on {{date}}" + }, + "billing": { + "manageBilling": "Manage Billing", + "portal": { + "error": "Failed to open billing portal" + } + }, + "payment": { + "preparing": "Preparing your checkout...", + "upgradeTitle": "Upgrade to {{planName}}", + "success": "Payment Successful!", + "successMessage": "Your subscription has been activated successfully. You will receive a confirmation email shortly.", + "autoClose": "This window will close automatically...", + "error": "Payment Error" + }, + "firstLogin": { + "title": "First Time Login", + "welcomeTitle": "Welcome!", + "welcomeMessage": "For security reasons, you must change your password on your first login.", + "loggedInAs": "Logged in as", + "error": "Error", + "currentPassword": "Current Password", + "enterCurrentPassword": "Enter your current password", + "newPassword": "New Password", + "enterNewPassword": "Enter new password (min 8 characters)", + "confirmPassword": "Confirm New Password", + "reEnterNewPassword": "Re-enter new password", + "changePassword": "Change Password", + "allFieldsRequired": "All fields are required", + "passwordsDoNotMatch": "New passwords do not match", + "passwordTooShort": "Password must be at least 8 characters", + "passwordMustBeDifferent": "New password must be different from current password", + "passwordChangedSuccess": "Password changed successfully! Please log in again.", + "passwordChangeFailed": "Failed to change password. Please check your current password." + }, + "invite": { + "welcome": "Welcome to Stirling PDF", + "invalidToken": "Invalid invitation link", + "validationError": "Failed to validate invitation link", + "passwordRequired": "Password is required", + "passwordTooShort": "Password must be at least 6 characters", + "passwordMismatch": "Passwords do not match", + "acceptError": "Failed to create account", + "validating": "Validating invitation...", + "invalidInvitation": "Invalid Invitation", + "goToLogin": "Go to Login", + "welcomeTitle": "You've been invited!", + "welcomeSubtitle": "Complete your account setup to get started", + "accountFor": "Creating account for", + "linkExpires": "Link expires", + "email": "Email address", + "emailPlaceholder": "Enter your email address", + "emailRequired": "Email address is required", + "invalidEmail": "Invalid email address", + "choosePassword": "Choose a password", + "passwordPlaceholder": "Enter your password", + "confirmPassword": "Confirm password", + "confirmPasswordPlaceholder": "Re-enter your password", + "createAccount": "Create Account", + "creating": "Creating Account...", + "alreadyHaveAccount": "Already have an account?", + "signIn": "Sign in" + }, + "audit": { + "error": { + "title": "Error loading audit system" + }, + "notAvailable": "Audit system not available", + "notAvailableMessage": "The audit system is not configured or not available.", + "disabled": "Audit logging is disabled", + "disabledMessage": "Enable audit logging in your application configuration to track system events.", + "systemStatus": { + "title": "System Status", + "status": "Audit Logging", + "enabled": "Enabled", + "disabled": "Disabled", + "level": "Audit Level", + "retention": "Retention Period", + "days": "days", + "totalEvents": "Total Events" + }, + "tabs": { + "dashboard": "Dashboard", + "events": "Audit Events", + "export": "Export" + }, + "charts": { + "title": "Audit Dashboard", + "error": "Error loading charts", + "day": "Day", + "week": "Week", + "month": "Month", + "byType": "Events by Type", + "byUser": "Events by User", + "overTime": "Events Over Time" + }, + "events": { + "title": "Audit Events", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "error": "Error loading events", + "noEvents": "No events found", + "timestamp": "Timestamp", + "type": "Type", + "user": "User", + "ipAddress": "IP Address", + "actions": "Actions", + "viewDetails": "View Details", + "eventDetails": "Event Details", + "details": "Details" + }, + "export": { + "title": "Export Audit Data", + "description": "Export audit events to CSV or JSON format. Use filters to limit the exported data.", + "format": "Export Format", + "filters": "Filters (Optional)", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "exportButton": "Export Data", + "error": "Failed to export data" + } + }, + "usage": { + "noData": "No data available", + "error": "Error loading usage statistics", + "noDataMessage": "No usage statistics are currently available.", + "controls": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All", + "refresh": "Refresh", + "dataTypeLabel": "Data Type:", + "dataType": { + "all": "All", + "api": "API", + "ui": "UI" + } + }, + "showing": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All" + }, + "stats": { + "totalEndpoints": "Total Endpoints", + "totalVisits": "Total Visits", + "showing": "Showing", + "selectedVisits": "Selected Visits" + }, + "chart": { + "title": "Endpoint Usage Chart" + }, + "table": { + "title": "Detailed Statistics", + "endpoint": "Endpoint", + "visits": "Visits", + "percentage": "Percentage", + "noData": "No data available" + } + }, + "backendHealth": { + "checking": "Checking backend status...", + "online": "Backend Online", + "offline": "Backend Offline" + }, + "autoRedact": { + "tags": "Redactează,Ascunde,ÃŽnnegrește,negru,marker,ascuns", + "title": "Redactare Automată", + "header": "Redactare Automată", + "colorLabel": "Culoare", + "textsToRedactLabel": "Text de Redactat (separat pe linii)", + "textsToRedactPlaceholder": "ex. \\nConfidențial \\nSecret de Serviciu", + "useRegexLabel": "Folosește Regex", + "wholeWordSearchLabel": "Căutare CuvÃĸnt Întreg", + "customPaddingLabel": "Spațiere Suplimentară Personalizată", + "convertPDFToImageLabel": "Convertește PDF ÃŽn PDF-Imagine (Folosit pentru a elimina textul din spatele casetei)", + "submitButton": "Trimite" + }, + "replaceColorPdf": { + "tags": "Replace Color,Page operations,Back end,server side" } -} \ No newline at end of file +} diff --git a/frontend/public/locales/ru-RU/translation.json b/frontend/public/locales/ru-RU/translation.json index bf27a8a05..e54b8df30 100644 --- a/frontend/public/locales/ru-RU/translation.json +++ b/frontend/public/locales/ru-RU/translation.json @@ -1,5 +1,35 @@ { + "toolPanel": { + "modePrompt": { + "title": "Choose how you browse tools", + "description": "Preview both layouts and decide how you want to explore Stirling PDF tools.", + "sidebarTitle": "Sidebar mode", + "sidebarDescription": "Keep tools alongside your workspace for quick switching.", + "recommended": "Recommended", + "chooseSidebar": "Use sidebar mode", + "fullscreenTitle": "Fullscreen mode - (legacy)", + "fullscreenDescription": "Browse every tool in a catalogue that covers the workspace until you pick one.", + "chooseFullscreen": "Use fullscreen mode", + "dismiss": "Maybe later" + }, + "fullscreen": { + "showDetails": "Show Details", + "comingSoon": "Coming soon:", + "favorite": "Add to favourites", + "favorites": "Favourites", + "heading": "All tools (fullscreen view)", + "noResults": "Try adjusting your search or toggle descriptions to find what you need.", + "recommended": "Recommended", + "unfavorite": "Remove from favourites" + }, + "placeholder": "Choose a tool to get started", + "toggle": { + "fullscreen": "Switch to fullscreen mode", + "sidebar": "Switch to sidebar mode" + } + }, "unsavedChanges": "ĐŖ Đ˛Đ°Ņ ĐĩŅŅ‚ŅŒ ĐŊĐĩŅĐžŅ…Ņ€Đ°ĐŊŅ‘ĐŊĐŊŅ‹Đĩ иСĐŧĐĩĐŊĐĩĐŊĐ¸Ņ в Đ˛Đ°ŅˆĐĩĐŧ PDF. Đ§Ņ‚Đž Đ˛Ņ‹ Ņ…ĐžŅ‚Đ¸Ņ‚Đĩ ŅĐ´ĐĩĐģĐ°Ņ‚ŅŒ?", + "areYouSure": "Are you sure you want to leave?", "unsavedChangesTitle": "НĐĩŅĐžŅ…Ņ€Đ°ĐŊŅ‘ĐŊĐŊŅ‹Đĩ иСĐŧĐĩĐŊĐĩĐŊĐ¸Ņ", "keepWorking": "ĐŸŅ€ĐžĐ´ĐžĐģĐļĐ¸Ņ‚ŅŒ Ņ€Đ°ĐąĐžŅ‚Ņƒ", "discardChanges": "ĐžŅ‚ĐŧĐĩĐŊĐ¸Ņ‚ŅŒ иСĐŧĐĩĐŊĐĩĐŊĐ¸Ņ", @@ -24,8 +54,26 @@ "customTextDesc": "ПоĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģҌҁĐēиК Ņ‚ĐĩĐēҁ҂", "numberPagesDesc": "КаĐēиĐĩ ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Ņ‹ ĐŊ҃ĐŧĐĩŅ€ĐžĐ˛Đ°Ņ‚ŅŒ, ĐŋĐž ҃ĐŧĐžĐģŅ‡Đ°ĐŊĐ¸ŅŽ 'Đ˛ŅĐĩ', Ņ‚Đ°ĐēĐļĐĩ ĐŋŅ€Đ¸ĐŊиĐŧаĐĩŅ‚ 1-5 иĐģи 2,5,9 и Ņ‚.Đ´.", "customNumberDesc": "По ҃ĐŧĐžĐģŅ‡Đ°ĐŊĐ¸ŅŽ {n}, Ņ‚Đ°ĐēĐļĐĩ ĐŋŅ€Đ¸ĐŊиĐŧаĐĩŅ‚ 'ĐĄŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ° {n} иС {total}', 'ĐĸĐĩĐēҁ҂-{n}', '{filename}-{n}'", - "submit": "Đ”ĐžĐąĐ°Đ˛Đ¸Ņ‚ŅŒ ĐŊĐžĐŧĐĩŅ€Đ° ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†" + "submit": "Đ”ĐžĐąĐ°Đ˛Đ¸Ņ‚ŅŒ ĐŊĐžĐŧĐĩŅ€Đ° ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†", + "configuration": "Configuration", + "customize": "Customize Appearance", + "pagesAndStarting": "Pages & Starting Number", + "positionAndPages": "Position & Pages", + "error": { + "failed": "Add page numbers operation failed" + }, + "results": { + "title": "Page Number Results" + }, + "preview": "Position Selection", + "previewDisclaimer": "Preview is approximate. Final output may vary due to PDF font metrics." }, + "pageSelectionPrompt": "Đ’Ņ‹ĐąĐžŅ€ ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ† (ВвĐĩĐ´Đ¸Ņ‚Đĩ ҁĐŋĐ¸ŅĐžĐē ĐŊĐžĐŧĐĩŅ€ĐžĐ˛ ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ† ҇ĐĩŅ€ĐĩС СаĐŋŅŅ‚ŅƒŅŽ 1,5,6 иĐģи Ņ„ŅƒĐŊĐēŅ†Đ¸Đ¸ Ņ‚Đ¸Đŋа 2n+1):", + "startingNumberTooltip": "The first number to display. Subsequent pages will increment from this number.", + "marginTooltip": "Distance between the page number and the edge of the page.", + "fontSizeTooltip": "Size of the page number text in points. Larger numbers create bigger text.", + "fontTypeTooltip": "Font family for the page numbers. Choose based on your document style.", + "customTextTooltip": "Optional custom format for page numbers. Use {n} as placeholder for the number. Example: \"Page {n}\" will show \"Page 1\", \"Page 2\", etc.", "pdfPrompt": "Đ’Ņ‹ĐąĐĩŅ€Đ¸Ņ‚Đĩ PDF-Ņ„Đ°ĐšĐģ(Ņ‹)", "multiPdfPrompt": "Đ’Ņ‹ĐąĐĩŅ€Đ¸Ņ‚Đĩ PDF-Ņ„Đ°ĐšĐģŅ‹ (2+)", "multiPdfDropPrompt": "Đ’Ņ‹ĐąĐĩŅ€Đ¸Ņ‚Đĩ (иĐģи ĐŋĐĩŅ€ĐĩŅ‚Đ°Ņ‰Đ¸Ņ‚Đĩ) Đ˛ŅĐĩ ĐŊĐĩĐžĐąŅ…ĐžĐ´Đ¸ĐŧŅ‹Đĩ PDF-Ņ„Đ°ĐšĐģŅ‹", @@ -36,7 +84,6 @@ "uploadLimitExceededPlural": "ҁĐģĐ¸ŅˆĐēĐžĐŧ йОĐģŅŒŅˆĐžĐš. МаĐēŅĐ¸ĐŧаĐģҌĐŊĐž Đ´ĐžĐŋŅƒŅŅ‚Đ¸ĐŧŅ‹Đš Ņ€Đ°ĐˇĐŧĐĩŅ€", "processTimeWarning": "ВĐŊиĐŧаĐŊиĐĩ: ДаĐŊĐŊŅ‹Đš ĐŋŅ€ĐžŅ†Đĩҁҁ ĐŧĐžĐļĐĩŅ‚ СаĐŊŅŅ‚ŅŒ Đ´Đž ĐŧиĐŊŅƒŅ‚Ņ‹ в ĐˇĐ°Đ˛Đ¸ŅĐ¸ĐŧĐžŅŅ‚Đ¸ ĐžŅ‚ Ņ€Đ°ĐˇĐŧĐĩŅ€Đ° Ņ„Đ°ĐšĐģа", "pageOrderPrompt": "ПоĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģҌҁĐēиК ĐŋĐžŅ€ŅĐ´ĐžĐē ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ† (ВвĐĩĐ´Đ¸Ņ‚Đĩ ҁĐŋĐ¸ŅĐžĐē ĐŊĐžĐŧĐĩŅ€ĐžĐ˛ ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ† ҇ĐĩŅ€ĐĩС СаĐŋŅŅ‚ŅƒŅŽ иĐģи Ņ„ŅƒĐŊĐēŅ†Đ¸Đ¸ Ņ‚Đ¸Đŋа 2n+1):", - "pageSelectionPrompt": "Đ’Ņ‹ĐąĐžŅ€ ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ† (ВвĐĩĐ´Đ¸Ņ‚Đĩ ҁĐŋĐ¸ŅĐžĐē ĐŊĐžĐŧĐĩŅ€ĐžĐ˛ ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ† ҇ĐĩŅ€ĐĩС СаĐŋŅŅ‚ŅƒŅŽ 1,5,6 иĐģи Ņ„ŅƒĐŊĐēŅ†Đ¸Đ¸ Ņ‚Đ¸Đŋа 2n+1):", "goToPage": "ПĐĩŅ€ĐĩĐšŅ‚Đ¸", "true": "Да", "false": "НĐĩŅ‚", @@ -47,11 +94,18 @@ "save": "ĐĄĐžŅ…Ņ€Đ°ĐŊĐ¸Ņ‚ŅŒ", "saveToBrowser": "ĐĄĐžŅ…Ņ€Đ°ĐŊĐ¸Ņ‚ŅŒ в ĐąŅ€Đ°ŅƒĐˇĐĩŅ€Đĩ", "download": "ĐĄĐēĐ°Ņ‡Đ°Ņ‚ŅŒ", + "pin": "Pin File (keep active after tool run)", + "unpin": "Unpin File (replace after tool run)", "undoOperationTooltip": "НаĐļĐŧĐ¸Ņ‚Đĩ, Ņ‡Ņ‚ĐžĐąŅ‹ ĐžŅ‚ĐŧĐĩĐŊĐ¸Ņ‚ŅŒ ĐŋĐžŅĐģĐĩĐ´ĐŊŅŽŅŽ ĐžĐŋĐĩŅ€Đ°Ņ†Đ¸ŅŽ и Đ˛ĐžŅŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚ŅŒ Đ¸ŅŅ…ĐžĐ´ĐŊŅ‹Đĩ Ņ„Đ°ĐšĐģŅ‹", "undo": "ĐžŅ‚ĐŧĐĩĐŊĐ¸Ņ‚ŅŒ", "moreOptions": "БоĐģҌ҈Đĩ ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€ĐžĐ˛", "editYourNewFiles": "ĐžŅ‚Ņ€ĐĩдаĐēŅ‚Đ¸Ņ€ŅƒĐšŅ‚Đĩ Đ˛Đ°ŅˆĐ¸ ĐŊĐžĐ˛Ņ‹Đĩ Ņ„Đ°ĐšĐģŅ‹", "close": "ЗаĐēŅ€Ņ‹Ņ‚ŅŒ", + "openInViewer": "Open in Viewer", + "confirmClose": "Confirm Close", + "confirmCloseMessage": "Are you sure you want to close this file?", + "confirmCloseCancel": "Cancel", + "confirmCloseConfirm": "Close File", "fileSelected": "Đ’Ņ‹ĐąŅ€Đ°ĐŊĐž: {{filename}}", "chooseFile": "Đ’Ņ‹ĐąŅ€Đ°Ņ‚ŅŒ Ņ„Đ°ĐšĐģ", "filesSelected": "Ņ„Đ°ĐšĐģОв Đ˛Ņ‹ĐąŅ€Đ°ĐŊĐž", @@ -61,7 +115,9 @@ "uploadFiles": "Đ—Đ°ĐŗŅ€ŅƒĐˇĐ¸Ņ‚ŅŒ Ņ„Đ°ĐšĐģŅ‹", "addFiles": "Đ”ĐžĐąĐ°Đ˛Đ¸Ņ‚ŅŒ Ņ„Đ°ĐšĐģŅ‹", "selectFromWorkbench": "Đ’Ņ‹ĐąĐĩŅ€Đ¸Ņ‚Đĩ Ņ„Đ°ĐšĐģŅ‹ иС Ņ€Đ°ĐąĐžŅ‡ĐĩĐš ОйĐģĐ°ŅŅ‚Đ¸ иĐģи ", - "selectMultipleFromWorkbench": "Đ’Ņ‹ĐąĐĩŅ€Đ¸Ņ‚Đĩ ĐŊĐĩ ĐŧĐĩĐŊĐĩĐĩ {{count}} Ņ„Đ°ĐšĐģОв иС Ņ€Đ°ĐąĐžŅ‡ĐĩĐš ОйĐģĐ°ŅŅ‚Đ¸ иĐģи " + "selectMultipleFromWorkbench": "Đ’Ņ‹ĐąĐĩŅ€Đ¸Ņ‚Đĩ ĐŊĐĩ ĐŧĐĩĐŊĐĩĐĩ {{count}} Ņ„Đ°ĐšĐģОв иС Ņ€Đ°ĐąĐžŅ‡ĐĩĐš ОйĐģĐ°ŅŅ‚Đ¸ иĐģи ", + "created": "Created", + "size": "File Size" }, "noFavourites": "НĐĩŅ‚ Đ¸ĐˇĐąŅ€Đ°ĐŊĐŊĐžĐŗĐž", "downloadComplete": "Đ—Đ°ĐŗŅ€ŅƒĐˇĐēа СавĐĩŅ€ŅˆĐĩĐŊа", @@ -194,6 +250,7 @@ "title": "ĐĨĐžŅ‚Đ¸Ņ‚Đĩ ҃ĐģŅƒŅ‡ŅˆĐ¸Ņ‚ŅŒ Stirling PDF?", "paragraph1": "В Stirling PDF ĐĩŅŅ‚ŅŒ ĐžĐŋŅ†Đ¸ĐžĐŊаĐģҌĐŊĐ°Ņ аĐŊаĐģĐ¸Ņ‚Đ¸Đēа Đ´ĐģŅ ҃ĐģŅƒŅ‡ŅˆĐĩĐŊĐ¸Ņ ĐŋŅ€ĐžĐ´ŅƒĐēŅ‚Đ°. ĐœŅ‹ ĐŊĐĩ ĐžŅ‚ŅĐģĐĩĐļиваĐĩĐŧ ĐģĐ¸Ņ‡ĐŊŅƒŅŽ иĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸ŅŽ иĐģи ŅĐžĐ´ĐĩŅ€ĐļиĐŧĐžĐĩ Ņ„Đ°ĐšĐģОв.", "paragraph2": "ПоĐļаĐģŅƒĐšŅŅ‚Đ°, Ņ€Đ°ŅŅĐŧĐžŅ‚Ņ€Đ¸Ņ‚Đĩ вОСĐŧĐžĐļĐŊĐžŅŅ‚ŅŒ вĐēĐģŅŽŅ‡ĐĩĐŊĐ¸Ņ аĐŊаĐģĐ¸Ņ‚Đ¸Đēи, Ņ‡Ņ‚ĐžĐąŅ‹ ĐŋĐžĐŧĐžŅ‡ŅŒ Ņ€Đ°ĐˇĐ˛Đ¸Ņ‚Đ¸ŅŽ Stirling-PDF и ĐŋОСвОĐģĐ¸Ņ‚ŅŒ ĐŊаĐŧ ĐģŅƒŅ‡ŅˆĐĩ ĐŋĐžĐŊиĐŧĐ°Ņ‚ŅŒ ĐŊĐ°ŅˆĐ¸Ņ… ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģĐĩĐš.", + "learnMore": "Learn more", "enable": "ВĐēĐģŅŽŅ‡Đ¸Ņ‚ŅŒ аĐŊаĐģĐ¸Ņ‚Đ¸Đē҃", "disable": "ĐžŅ‚ĐēĐģŅŽŅ‡Đ¸Ņ‚ŅŒ аĐŊаĐģĐ¸Ņ‚Đ¸Đē҃", "settings": "Đ’Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ иСĐŧĐĩĐŊĐ¸Ņ‚ŅŒ ĐŊĐ°ŅŅ‚Ņ€ĐžĐšĐēи аĐŊаĐģĐ¸Ņ‚Đ¸Đēи в Ņ„Đ°ĐšĐģĐĩ config/settings.yml" @@ -237,6 +294,54 @@ "cacheInputs": { "name": "ĐĄĐžŅ…Ņ€Đ°ĐŊŅŅ‚ŅŒ даĐŊĐŊŅ‹Đĩ Ņ„ĐžŅ€Đŧ", "help": "ВĐēĐģŅŽŅ‡Đ¸Ņ‚Đĩ Đ´ĐģŅ ŅĐžŅ…Ņ€Đ°ĐŊĐĩĐŊĐ¸Ņ Ņ€Đ°ĐŊĐĩĐĩ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°ĐŊĐŊҋ҅ даĐŊĐŊҋ҅ Đ´ĐģŅ ĐąŅƒĐ´ŅƒŅ‰Đ¸Ņ… СаĐŋ҃ҁĐēОв" + }, + "general": { + "title": "General", + "description": "Configure general application preferences.", + "account": "Account", + "accountDescription": "Manage your account settings", + "user": "User", + "signedInAs": "Signed in as", + "logout": "Log out", + "enableFeatures": { + "title": "For System Administrators", + "intro": "Enable user authentication, team management, and workspace features for your organization.", + "action": "Configure", + "and": "and", + "benefit": "Enables user roles, team collaboration, admin controls, and enterprise features.", + "learnMore": "Learn more in documentation", + "dismiss": "Dismiss" + }, + "autoUnzip": "Auto-unzip API responses", + "autoUnzipDescription": "Automatically extract files from ZIP responses", + "autoUnzipTooltip": "Automatically extract ZIP files returned from API operations. Disable to keep ZIP files intact. This does not affect automation workflows.", + "autoUnzipFileLimit": "Auto-unzip file limit", + "autoUnzipFileLimitDescription": "Maximum number of files to extract from ZIP", + "autoUnzipFileLimitTooltip": "Only unzip if the ZIP contains this many files or fewer. Set higher to extract larger ZIPs.", + "defaultToolPickerMode": "Default tool picker mode", + "defaultToolPickerModeDescription": "Choose whether the tool picker opens in fullscreen or sidebar by default", + "mode": { + "fullscreen": "Fullscreen", + "sidebar": "Sidebar" + } + }, + "hotkeys": { + "title": "Keyboard Shortcuts", + "description": "Hover a tool to see its shortcut or customise it below. Click \"Change shortcut\" and press a new key combination. Press Esc to cancel.", + "errorModifier": { + "mac": "Include ⌘ (Command), âŒĨ (Option), or another modifier in your shortcut.", + "windows": "Include Ctrl, Alt, or another modifier in your shortcut." + }, + "errorConflict": "Shortcut already used by {{tool}}.", + "none": "Not assigned", + "customBadge": "Custom", + "defaultLabel": "Default: {{shortcut}}", + "capturing": "Press keysâ€Ļ (Esc to cancel)", + "change": "Change shortcut", + "reset": "Reset", + "shortcut": "Shortcut", + "noShortcut": "No shortcut set", + "searchPlaceholder": "Search tools..." } }, "changeCreds": { @@ -308,8 +413,10 @@ "top20": "ĐĸĐžĐŋ 20", "all": "Đ’ŅĐĩ", "refresh": "ОбĐŊĐžĐ˛Đ¸Ņ‚ŅŒ", - "includeHomepage": "ВĐēĐģŅŽŅ‡Đ¸Ņ‚ŅŒ ĐŗĐģавĐŊŅƒŅŽ ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Ņƒ ('/')", - "includeLoginPage": "ВĐēĐģŅŽŅ‡Đ¸Ņ‚ŅŒ ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Ņƒ Đ˛Ņ…ĐžĐ´Đ° ('/login')", + "dataTypeLabel": "Data Type:", + "dataTypeAll": "All", + "dataTypeApi": "API", + "dataTypeUi": "UI", "totalEndpoints": "Đ’ŅĐĩĐŗĐž ĐēĐžĐŊĐĩ҇ĐŊҋ҅ Ņ‚ĐžŅ‡ĐĩĐē", "totalVisits": "Đ’ŅĐĩĐŗĐž ĐŋĐžŅĐĩ҉ĐĩĐŊиК", "showing": "ПоĐēаСаĐŊĐž", @@ -324,7 +431,9 @@ "top": "ĐĸĐžĐŋ", "numberOfVisits": "КоĐģĐ¸Ņ‡ĐĩŅŅ‚Đ˛Đž ĐŋĐžŅĐĩ҉ĐĩĐŊиК", "visitsTooltip": "ĐŸĐžŅĐĩ҉ĐĩĐŊĐ¸Ņ: {0} ({1}% ĐžŅ‚ ĐžĐąŅ‰ĐĩĐŗĐž Ņ‡Đ¸ŅĐģа)", - "retry": "ĐŸĐžĐ˛Ņ‚ĐžŅ€Đ¸Ņ‚ŅŒ" + "retry": "ĐŸĐžĐ˛Ņ‚ĐžŅ€Đ¸Ņ‚ŅŒ", + "includeHomepage": "ВĐēĐģŅŽŅ‡Đ¸Ņ‚ŅŒ ĐŗĐģавĐŊŅƒŅŽ ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Ņƒ ('/')", + "includeLoginPage": "ВĐēĐģŅŽŅ‡Đ¸Ņ‚ŅŒ ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Ņƒ Đ˛Ņ…ĐžĐ´Đ° ('/login')" }, "database": { "title": "ИĐŧĐŋĐžŅ€Ņ‚/ŅĐēҁĐŋĐžŅ€Ņ‚ ĐąĐ°ĐˇŅ‹ даĐŊĐŊҋ҅", @@ -365,6 +474,16 @@ "alphabetical": "АĐģŅ„Đ°Đ˛Đ¸Ņ‚Ņƒ", "globalPopularity": "ПоĐŋ҃ĐģŅŅ€ĐŊĐžŅŅ‚Đ¸", "sortBy": "ĐĄĐžŅ€Ņ‚Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ ĐŋĐž:", + "mobile": { + "brandAlt": "Stirling PDF logo", + "openFiles": "Open files", + "swipeHint": "Swipe left or right to switch views", + "tools": "Tools", + "toolsSlide": "Tool selection panel", + "viewSwitcher": "Switch workspace view", + "workbenchSlide": "Workspace panel", + "workspace": "Workspace" + }, "multiTool": { "tags": "ĐŊĐĩҁĐēĐžĐģҌĐēĐž,иĐŊŅŅ‚Ņ€ŅƒĐŧĐĩĐŊ҂ҋ", "title": "ĐœŅƒĐģŅŒŅ‚Đ¸Đ¸ĐŊŅŅ‚Ņ€ŅƒĐŧĐĩĐŊŅ‚ PDF", @@ -550,11 +669,6 @@ "title": "Đ ŅƒŅ‡ĐŊĐžĐĩ Ņ€ĐĩдаĐēŅ‚Đ¸Ņ€ĐžĐ˛Đ°ĐŊиĐĩ", "desc": "Đ ĐĩдаĐēŅ‚Đ¸Ņ€ŅƒĐĩŅ‚ PDF ĐŊа ĐžŅĐŊОвĐĩ Đ˛Ņ‹ĐąŅ€Đ°ĐŊĐŊĐžĐŗĐž Ņ‚ĐĩĐēŅŅ‚Đ°, ĐŊĐ°Ņ€Đ¸ŅĐžĐ˛Đ°ĐŊĐŊҋ҅ Ņ„ĐžŅ€Đŧ и/иĐģи Đ˛Ņ‹ĐąŅ€Đ°ĐŊĐŊҋ҅ ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†" }, - "overlayPdfs": { - "tags": "ОвĐĩŅ€ĐģĐĩĐš,ĐžĐąŅŠĐĩдиĐŊĐ¸Ņ‚ŅŒ,ҁĐģĐžĐļĐ¸Ņ‚ŅŒ", - "title": "НаĐģĐžĐļĐ¸Ņ‚ŅŒ PDF", - "desc": "НаĐģĐžĐļĐĩĐŊиĐĩ ОдĐŊĐžĐŗĐž PDF ĐŋОвĐĩҀ҅ Đ´Ņ€ŅƒĐŗĐžĐŗĐž" - }, "splitBySections": { "tags": "Ņ€Đ°ĐˇĐ´ĐĩĐģĐ¸Ņ‚ŅŒ,ҁĐĩĐēŅ†Đ¸Đ¸,Đ´ĐĩĐģĐ¸Ņ‚ŅŒ", "title": "РаСдĐĩĐģĐ¸Ņ‚ŅŒ PDF ĐŋĐž ҁĐĩĐēŅ†Đ¸ŅĐŧ", @@ -659,6 +773,15 @@ "tags": "Ņ€Đ°ĐąĐžŅ‡Đ¸Đš ĐŋŅ€ĐžŅ†Đĩҁҁ,ĐŋĐžŅĐģĐĩĐ´ĐžĐ˛Đ°Ņ‚ĐĩĐģҌĐŊĐžŅŅ‚ŅŒ,Đ°Đ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸ĐˇĐ°Ņ†Đ¸Ņ", "title": "ĐĐ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸ĐˇĐ°Ņ†Đ¸Ņ", "desc": "ĐĄĐžĐˇĐ´Đ°Đ˛Đ°ĐšŅ‚Đĩ ĐŧĐŊĐžĐŗĐžŅˆĐ°ĐŗĐžĐ˛Ņ‹Đĩ ĐŋŅ€ĐžŅ†Đĩҁҁҋ, ŅĐ˛ŅĐˇŅ‹Đ˛Đ°Ņ PDF-Đ´ĐĩĐšŅŅ‚Đ˛Đ¸Ņ. ИдĐĩаĐģҌĐŊĐž Đ´ĐģŅ ĐŋĐžĐ˛Ņ‚ĐžŅ€ŅŅŽŅ‰Đ¸Ņ…ŅŅ ĐˇĐ°Đ´Đ°Ņ‡." + }, + "overlay-pdfs": { + "desc": "Overlay one PDF on top of another", + "title": "Overlay PDFs" + }, + "overlayPdfs": { + "tags": "ОвĐĩŅ€ĐģĐĩĐš,ĐžĐąŅŠĐĩдиĐŊĐ¸Ņ‚ŅŒ,ҁĐģĐžĐļĐ¸Ņ‚ŅŒ", + "title": "НаĐģĐžĐļĐ¸Ņ‚ŅŒ PDF", + "desc": "НаĐģĐžĐļĐĩĐŊиĐĩ ОдĐŊĐžĐŗĐž PDF ĐŋОвĐĩҀ҅ Đ´Ņ€ŅƒĐŗĐžĐŗĐž" } }, "landing": { @@ -698,13 +821,19 @@ "merge": { "tags": "ĐžĐąŅŠĐĩдиĐŊĐĩĐŊиĐĩ,ĐžĐŋĐĩŅ€Đ°Ņ†Đ¸Đ¸ ŅĐž ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ°Đŧи,ҁĐĩŅ€Đ˛ĐĩŅ€ĐŊĐ°Ņ Ņ‡Đ°ŅŅ‚ŅŒ", "title": "ĐžĐąŅŠĐĩдиĐŊĐ¸Ņ‚ŅŒ", - "removeDigitalSignature.tooltip": { - "title": "ĐŖĐ´Đ°ĐģĐ¸Ņ‚ŅŒ Ņ†Đ¸Ņ„Ņ€ĐžĐ˛ŅƒŅŽ ĐŋОдĐŋĐ¸ŅŅŒ", - "description": "ĐĻĐ¸Ņ„Ņ€ĐžĐ˛Ņ‹Đĩ ĐŋОдĐŋĐ¸ŅĐ¸ ŅŅ‚Đ°ĐŊĐžĐ˛ŅŅ‚ŅŅ ĐŊĐĩĐ´ĐĩĐšŅŅ‚Đ˛Đ¸Ņ‚ĐĩĐģҌĐŊŅ‹Đŧи ĐŋŅ€Đ¸ ĐžĐąŅŠĐĩдиĐŊĐĩĐŊии. ĐžŅ‚ĐŧĐĩŅ‚ŅŒŅ‚Đĩ, Ņ‡Ņ‚ĐžĐąŅ‹ ŅƒĐ´Đ°ĐģĐ¸Ņ‚ŅŒ Đ¸Ņ… иС Đ¸Ņ‚ĐžĐŗĐžĐ˛ĐžĐŗĐž PDF." + "removeDigitalSignature": { + "label": "Remove digital signature in the merged file?", + "tooltip": { + "title": "ĐŖĐ´Đ°ĐģĐ¸Ņ‚ŅŒ Ņ†Đ¸Ņ„Ņ€ĐžĐ˛ŅƒŅŽ ĐŋОдĐŋĐ¸ŅŅŒ", + "description": "ĐĻĐ¸Ņ„Ņ€ĐžĐ˛Ņ‹Đĩ ĐŋОдĐŋĐ¸ŅĐ¸ ŅŅ‚Đ°ĐŊĐžĐ˛ŅŅ‚ŅŅ ĐŊĐĩĐ´ĐĩĐšŅŅ‚Đ˛Đ¸Ņ‚ĐĩĐģҌĐŊŅ‹Đŧи ĐŋŅ€Đ¸ ĐžĐąŅŠĐĩдиĐŊĐĩĐŊии. ĐžŅ‚ĐŧĐĩŅ‚ŅŒŅ‚Đĩ, Ņ‡Ņ‚ĐžĐąŅ‹ ŅƒĐ´Đ°ĐģĐ¸Ņ‚ŅŒ Đ¸Ņ… иС Đ¸Ņ‚ĐžĐŗĐžĐ˛ĐžĐŗĐž PDF." + } }, - "generateTableOfContents.tooltip": { - "title": "ĐĄĐŗĐĩĐŊĐĩŅ€Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ ĐžĐŗĐģавĐģĐĩĐŊиĐĩ", - "description": "ĐĐ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐĩҁĐēи ŅĐžĐˇĐ´Đ°Ņ‘Ņ‚ ĐēĐģиĐēайĐĩĐģҌĐŊĐžĐĩ ĐžĐŗĐģавĐģĐĩĐŊиĐĩ в ĐžĐąŅŠĐĩдиĐŊŅ‘ĐŊĐŊĐžĐŧ PDF ĐŊа ĐžŅĐŊОвĐĩ Đ¸ŅŅ…ĐžĐ´ĐŊҋ҅ иĐŧŅ‘ĐŊ Ņ„Đ°ĐšĐģОв и ĐŊĐžĐŧĐĩŅ€ĐžĐ˛ ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†." + "generateTableOfContents": { + "label": "Generate table of contents in the merged file?", + "tooltip": { + "title": "ĐĄĐŗĐĩĐŊĐĩŅ€Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ ĐžĐŗĐģавĐģĐĩĐŊиĐĩ", + "description": "ĐĐ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐĩҁĐēи ŅĐžĐˇĐ´Đ°Ņ‘Ņ‚ ĐēĐģиĐēайĐĩĐģҌĐŊĐžĐĩ ĐžĐŗĐģавĐģĐĩĐŊиĐĩ в ĐžĐąŅŠĐĩдиĐŊŅ‘ĐŊĐŊĐžĐŧ PDF ĐŊа ĐžŅĐŊОвĐĩ Đ¸ŅŅ…ĐžĐ´ĐŊҋ҅ иĐŧŅ‘ĐŊ Ņ„Đ°ĐšĐģОв и ĐŊĐžĐŧĐĩŅ€ĐžĐ˛ ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†." + } }, "submit": "ĐžĐąŅŠĐĩдиĐŊĐ¸Ņ‚ŅŒ", "sortBy": { @@ -842,12 +971,50 @@ "bullet1": "ĐŖŅ€ĐžĐ˛ĐĩĐŊҌ СаĐēĐģадОĐē: ĐŋĐž ĐēаĐēĐžĐŧ҃ ŅƒŅ€ĐžĐ˛ĐŊŅŽ Đ´ĐĩĐģĐ¸Ņ‚ŅŒ (1 = вĐĩҀ҅ĐŊиК)", "bullet2": "ВĐēĐģŅŽŅ‡Đ¸Ņ‚ŅŒ ĐŧĐĩŅ‚Đ°Đ´Đ°ĐŊĐŊŅ‹Đĩ: ŅĐžŅ…Ņ€Đ°ĐŊŅŅ‚ŅŒ ŅĐ˛ĐžĐšŅŅ‚Đ˛Đ° Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ°", "bullet3": "Đ Đ°ĐˇŅ€ĐĩŅˆĐ¸Ņ‚ŅŒ Đ´ŅƒĐąĐģиĐēĐ°Ņ‚Ņ‹: ĐžĐąŅ€Đ°ĐąĐ°Ņ‚Ņ‹Đ˛Đ°Ņ‚ŅŒ ĐŋĐžĐ˛Ņ‚ĐžŅ€ŅŅŽŅ‰Đ¸ĐĩŅŅ ĐŊаСваĐŊĐ¸Ņ СаĐēĐģадОĐē" + }, + "byDocCount": { + "bullet1": "Enter the number of output files you want", + "bullet2": "Pages are distributed as evenly as possible", + "bullet3": "Useful when you need a specific number of files", + "text": "Create a specific number of output files by evenly distributing pages across them.", + "title": "Split by Document Count" + }, + "byPageCount": { + "bullet1": "Enter the number of pages per output file", + "bullet2": "Last file may have fewer pages if not evenly divisible", + "bullet3": "Useful for batch processing workflows", + "text": "Create multiple PDFs with a specific number of pages each. Perfect for creating uniform document chunks.", + "title": "Split by Page Count" + }, + "byPageDivider": { + "bullet1": "Print divider sheets from the download link", + "bullet2": "Insert divider sheets between your documents", + "bullet3": "Scan all documents together as one PDF", + "bullet4": "Upload - divider pages are automatically detected and removed", + "bullet5": "Enable Duplex Mode if scanning both sides of divider sheets", + "text": "Automatically split scanned documents using physical divider sheets with QR codes. Perfect for processing multiple documents scanned together.", + "title": "Split by Page Divider" } - } + }, + "methodSelection": { + "tooltip": { + "bullet1": "Click on a method card to select it", + "bullet2": "Hover over each card to see a quick description", + "bullet3": "The settings step will appear after you select a method", + "bullet4": "You can change methods at any time before processing", + "header": { + "text": "Choose how you want to split your PDF document. Each method is optimized for different use cases and document types.", + "title": "Split Method Selection" + }, + "title": "Choose Your Split Method" + } + }, + "selectMethod": "Select a split method" }, "rotate": { "title": "ПовĐĩŅ€ĐŊŅƒŅ‚ŅŒ PDF", "submit": "ПовĐĩŅ€ĐŊŅƒŅ‚ŅŒ", + "selectRotation": "Select Rotation Angle (Clockwise)", "error": { "failed": "ĐŸŅ€ĐžĐ¸ĐˇĐžŅˆĐģа ĐžŅˆĐ¸ĐąĐēа ĐŋŅ€Đ¸ ĐŋĐžĐ˛ĐžŅ€ĐžŅ‚Đĩ PDF." }, @@ -935,7 +1102,8 @@ "imagesExt": "Đ˜ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊĐ¸Ņ (JPG, PNG и Ņ‚. Đ´.)", "markdown": "Markdown", "textRtf": "ĐĸĐĩĐēҁ҂/RTF", - "grayscale": "ĐžŅ‚Ņ‚ĐĩĐŊĐēи ҁĐĩŅ€ĐžĐŗĐž" + "grayscale": "ĐžŅ‚Ņ‚ĐĩĐŊĐēи ҁĐĩŅ€ĐžĐŗĐž", + "errorConversion": "An error occurred while converting the file." }, "imageToPdf": { "tags": "ĐēĐžĐŊвĐĩŅ€Ņ‚Đ°Ņ†Đ¸Ņ,Đ¸ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊиĐĩ,jpg,ĐēĐ°Ņ€Ņ‚Đ¸ĐŊĐēа,Ņ„ĐžŅ‚Đž" @@ -973,7 +1141,20 @@ "8": "ĐŖĐ´Đ°ĐģĐ¸Ņ‚ŅŒ ĐŋĐžŅĐģĐĩĐ´ĐŊŅŽŅŽ", "9": "ĐŖĐ´Đ°ĐģĐ¸Ņ‚ŅŒ ĐŋĐĩŅ€Đ˛ŅƒŅŽ и ĐŋĐžŅĐģĐĩĐ´ĐŊŅŽŅŽ", "10": "ĐžĐąŅŠĐĩдиĐŊĐĩĐŊиĐĩ ҇ĐĩŅ‚ĐŊҋ҅-ĐŊĐĩ҇ĐĩŅ‚ĐŊҋ҅", - "11": "Đ”ŅƒĐąĐģĐ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ Đ˛ŅĐĩ ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Ņ‹" + "11": "Đ”ŅƒĐąĐģĐ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ Đ˛ŅĐĩ ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Ņ‹", + "desc": { + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, â€Ļ).", + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, â€Ļ).", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimized for binding on the side)." + } }, "desc": { "CUSTOM": "Đ˜ŅĐŋĐžĐģŅŒĐˇŅƒĐšŅ‚Đĩ ŅĐžĐąŅŅ‚Đ˛ĐĩĐŊĐŊŅƒŅŽ ĐŋĐžŅĐģĐĩĐ´ĐžĐ˛Đ°Ņ‚ĐĩĐģҌĐŊĐžŅŅ‚ŅŒ ĐŊĐžĐŧĐĩŅ€ĐžĐ˛ ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ† иĐģи Đ˛Ņ‹Ņ€Đ°ĐļĐĩĐŊĐ¸Ņ Đ´ĐģŅ СадаĐŊĐ¸Ņ ĐŊĐžĐ˛ĐžĐŗĐž ĐŋĐžŅ€ŅĐ´Đēа.", @@ -1039,7 +1220,9 @@ "opacity": "НĐĩĐŋŅ€ĐžĐˇŅ€Đ°Ņ‡ĐŊĐžŅŅ‚ŅŒ (%)", "spacing": { "horizontal": "Đ“ĐžŅ€Đ¸ĐˇĐžĐŊŅ‚Đ°ĐģҌĐŊŅ‹Đš иĐŊŅ‚ĐĩŅ€Đ˛Đ°Đģ", - "vertical": "ВĐĩŅ€Ņ‚Đ¸ĐēаĐģҌĐŊŅ‹Đš иĐŊŅ‚ĐĩŅ€Đ˛Đ°Đģ" + "vertical": "ВĐĩŅ€Ņ‚Đ¸ĐēаĐģҌĐŊŅ‹Đš иĐŊŅ‚ĐĩŅ€Đ˛Đ°Đģ", + "height": "Height Spacing", + "width": "Width Spacing" }, "convertToImage": "ĐŸŅ€ĐĩĐ˛Ņ€Đ°Ņ‚Đ¸Ņ‚ŅŒ ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Ņ‹ PDF в Đ¸ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊĐ¸Ņ" }, @@ -1182,6 +1365,10 @@ "bullet4": "Đ›ŅƒŅ‡ŅˆĐĩ Đ´ĐģŅ Ņ‡ŅƒĐ˛ŅŅ‚Đ˛Đ¸Ņ‚ĐĩĐģҌĐŊĐžĐŗĐž иĐģи ĐˇĐ°Ņ‰Đ¸Ņ‰Ņ‘ĐŊĐŊĐžĐŗĐž Đ°Đ˛Ņ‚ĐžŅ€ŅĐēиĐŧ ĐŋŅ€Đ°Đ˛ĐžĐŧ ĐēĐžĐŊŅ‚ĐĩĐŊŅ‚Đ°" } } + }, + "type": { + "1": "Text", + "2": "Image" } }, "permissions": { @@ -1255,6 +1442,26 @@ }, "submit": "ĐŖĐ´Đ°ĐģĐ¸Ņ‚ŅŒ" }, + "extractPages": { + "title": "Extract Pages", + "pageNumbers": { + "label": "Pages to Extract", + "placeholder": "e.g., 1,3,5-8 or odd & 1-10" + }, + "settings": { + "title": "Settings" + }, + "tooltip": { + "description": "Extracts the selected pages into a new PDF, preserving order." + }, + "error": { + "failed": "Failed to extract pages" + }, + "results": { + "title": "Pages Extracted" + }, + "submit": "Extract Pages" + }, "pageSelection": { "tooltip": { "header": { @@ -1295,10 +1502,43 @@ }, "examples": { "title": "ĐŸŅ€Đ¸ĐŧĐĩҀҋ" + }, + "complex": { + "bullet1": "1,3-5,8,2n → pages 1, 3–5, 8, plus evens", + "bullet2": "10-,2n-1 → from page 10 to end + odd pages", + "description": "Mix different types.", + "title": "Complex Combinations" + }, + "description": "Choose which pages to use for the operation. Supports single pages, ranges, formulas, and the all keyword.", + "individual": { + "bullet1": "1,3,5 → selects pages 1, 3, 5", + "bullet2": "2,7,12 → selects pages 2, 7, 12", + "description": "Enter numbers separated by commas.", + "title": "Individual Pages" + }, + "mathematical": { + "bullet1": "2n → all even pages (2, 4, 6â€Ļ)", + "bullet2": "2n-1 → all odd pages (1, 3, 5â€Ļ)", + "bullet3": "3n → every 3rd page (3, 6, 9â€Ļ)", + "bullet4": "4n-1 → pages 3, 7, 11, 15â€Ļ", + "description": "Use n in formulas for patterns.", + "title": "Mathematical Functions" + }, + "ranges": { + "bullet1": "3-6 → selects pages 3–6", + "bullet2": "10-15 → selects pages 10–15", + "bullet3": "5- → selects pages 5 to end", + "description": "Use - for consecutive pages.", + "title": "Page Ranges" + }, + "special": { + "bullet1": "all → selects all pages", + "title": "Special Keywords" } } }, "bulkSelection": { + "syntaxError": "There is a syntax issue. See Page Selection tips for help.", "header": { "title": "ПаĐŧŅŅ‚Đēа ĐŋĐž Đ˛Ņ‹ĐąĐžŅ€Ņƒ ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†" }, @@ -1604,6 +1844,9 @@ "text": "ĐŸĐžŅŅ‚ĐžĐąŅ€Đ°ĐąĐžŅ‚Đēа Đ¸Ņ‚ĐžĐŗĐžĐ˛ĐžĐŗĐž PDF: ŅƒĐ´Đ°ĐģĐĩĐŊиĐĩ Đ°Ņ€Ņ‚ĐĩŅ„Đ°ĐēŅ‚ĐžĐ˛ OCR и ĐžĐŋŅ‚Đ¸ĐŧĐ¸ĐˇĐ°Ņ†Đ¸Ņ Ņ‚ĐĩĐēŅŅ‚ĐžĐ˛ĐžĐŗĐž ҁĐģĐžŅ Đ´ĐģŅ ĐģŅƒŅ‡ŅˆĐĩĐš Ņ‡Đ¸Ņ‚Đ°ĐĩĐŧĐžŅŅ‚Đ¸ и ĐŧĐĩĐŊҌ҈ĐĩĐŗĐž Ņ€Đ°ĐˇĐŧĐĩŅ€Đ°." } } + }, + "error": { + "failed": "OCR operation failed" } }, "extractImages": { @@ -1766,8 +2009,16 @@ "hint": "Đ—Đ°ĐŗŅ€ŅƒĐˇĐ¸Ņ‚Đĩ PNG иĐģи JPG ҁ Đ˛Đ°ŅˆĐĩĐš ĐŋОдĐŋĐ¸ŅŅŒŅŽ" }, "instructions": { - "title": "КаĐē Đ´ĐžĐąĐ°Đ˛Đ¸Ņ‚ŅŒ ĐŋОдĐŋĐ¸ŅŅŒ" + "title": "КаĐē Đ´ĐžĐąĐ°Đ˛Đ¸Ņ‚ŅŒ ĐŋОдĐŋĐ¸ŅŅŒ", + "canvas": "After drawing your signature in the canvas, close the modal then click anywhere on the PDF to place it.", + "image": "After uploading your signature image above, click anywhere on the PDF to place it.", + "text": "After entering your name above, click anywhere on the PDF to place your signature." }, + "mode": { + "move": "Move Signature", + "place": "Place Signature" + }, + "updateAndPlace": "Update and Place", "activate": "АĐēŅ‚Đ¸Đ˛Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ Ņ€Đ°ĐˇĐŧĐĩ҉ĐĩĐŊиĐĩ ĐŋОдĐŋĐ¸ŅĐ¸", "deactivate": "ĐžŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚ŅŒ Ņ€Đ°ĐˇĐŧĐĩ҉ĐĩĐŊиĐĩ ĐŋОдĐŋĐ¸ŅĐĩĐš", "results": { @@ -1792,7 +2043,10 @@ "options": { "stepTitle": "ĐŸĐ°Ņ€Đ°ĐŧĐĩ҂Ҁҋ ҃ĐŋĐģĐžŅ‰ĐĩĐŊĐ¸Ņ", "title": "ĐŸĐ°Ņ€Đ°ĐŧĐĩ҂Ҁҋ ҃ĐŋĐģĐžŅ‰ĐĩĐŊĐ¸Ņ", - "flattenOnlyForms.desc": "ĐŖĐŋĐģĐžŅ‰Đ°Ņ‚ŅŒ Ņ‚ĐžĐģҌĐēĐž ĐŋĐžĐģŅ Ņ„ĐžŅ€Đŧ, ĐžŅŅ‚Đ°Đ˛ĐģŅŅ ĐŋŅ€ĐžŅ‡Đ¸Đĩ иĐŊŅ‚ĐĩŅ€Đ°ĐēŅ‚Đ¸Đ˛ĐŊŅ‹Đĩ ŅĐģĐĩĐŧĐĩĐŊ҂ҋ", + "flattenOnlyForms": { + "label": "Flatten only forms", + "desc": "ĐŖĐŋĐģĐžŅ‰Đ°Ņ‚ŅŒ Ņ‚ĐžĐģҌĐēĐž ĐŋĐžĐģŅ Ņ„ĐžŅ€Đŧ, ĐžŅŅ‚Đ°Đ˛ĐģŅŅ ĐŋŅ€ĐžŅ‡Đ¸Đĩ иĐŊŅ‚ĐĩŅ€Đ°ĐēŅ‚Đ¸Đ˛ĐŊŅ‹Đĩ ŅĐģĐĩĐŧĐĩĐŊ҂ҋ" + }, "note": "ĐŖĐŋĐģĐžŅ‰ĐĩĐŊиĐĩ ŅƒĐ´Đ°ĐģŅĐĩŅ‚ иĐŊŅ‚ĐĩŅ€Đ°ĐēŅ‚Đ¸Đ˛ĐŊŅ‹Đĩ ŅĐģĐĩĐŧĐĩĐŊ҂ҋ иС PDF, Đ´ĐĩĐģĐ°Ņ Đ¸Ņ… ĐŊĐĩŅ€ĐĩдаĐēŅ‚Đ¸Ņ€ŅƒĐĩĐŧŅ‹Đŧи." }, "results": { @@ -1882,7 +2136,13 @@ "bullet3": "МоĐļĐŊĐž ĐžŅ‚ĐēĐģŅŽŅ‡Đ¸Ņ‚ŅŒ Đ´ĐģŅ ҃ĐŧĐĩĐŊҌ҈ĐĩĐŊĐ¸Ņ Ņ€Đ°ĐˇĐŧĐĩŅ€Đ° Ņ„Đ°ĐšĐģа" } }, - "submit": "ĐŖĐ´Đ°ĐģĐ¸Ņ‚ŅŒ ĐŋŅƒŅŅ‚Ņ‹Đĩ" + "submit": "ĐŖĐ´Đ°ĐģĐ¸Ņ‚ŅŒ ĐŋŅƒŅŅ‚Ņ‹Đĩ", + "error": { + "failed": "Failed to remove blank pages" + }, + "results": { + "title": "Removed Blank Pages" + } }, "removeAnnotations": { "tags": "ĐēĐžĐŧĐŧĐĩĐŊŅ‚Đ°Ņ€Đ¸Đ¸,Đ˛Ņ‹Đ´ĐĩĐģĐĩĐŊиĐĩ,СаĐŧĐĩŅ‚Đēи,Ņ€Đ°ĐˇĐŧĐĩŅ‚Đēа,ŅƒĐ´Đ°ĐģĐĩĐŊиĐĩ", @@ -1984,7 +2244,12 @@ "bullet3": "Đ’Ņ‹ĐąĐĩŅ€Đ¸Ņ‚Đĩ ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Ņƒ Đ´ĐģŅ Ņ€Đ°ĐˇĐŧĐĩ҉ĐĩĐŊĐ¸Ņ ĐŋОдĐŋĐ¸ŅĐ¸", "bullet4": "МоĐļĐŊĐž Đ´ĐžĐąĐ°Đ˛Đ¸Ņ‚ŅŒ ĐģĐžĐŗĐžŅ‚Đ¸Đŋ" } - } + }, + "invisible": "Invisible", + "options": { + "title": "Signature Details" + }, + "visible": "Visible" }, "sign": { "submit": "ПодĐŋĐ¸ŅĐ°Ņ‚ŅŒ PDF", @@ -2045,7 +2310,22 @@ "text": "ĐŸŅ€ĐĩĐžĐąŅ€Đ°ĐˇŅƒĐšŅ‚Đĩ Ņ„Đ°ĐšĐģ в Java-Ņ…Ņ€Đ°ĐŊиĐģĐ¸Ņ‰Đĩ ĐēĐģŅŽŅ‡ĐĩĐš (.jks) ҁ ĐŋĐžĐŧĐžŅ‰ŅŒŅŽ keytool, ĐˇĐ°Ņ‚ĐĩĐŧ Đ˛Ņ‹ĐąĐĩŅ€Đ¸Ņ‚Đĩ JKS." } } - } + }, + "chooseCertificate": "Choose Certificate File", + "chooseJksFile": "Choose JKS File", + "chooseP12File": "Choose PKCS12 File", + "choosePfxFile": "Choose PFX File", + "choosePrivateKey": "Choose Private Key File", + "location": "Location", + "logoTitle": "Logo", + "name": "Name", + "noLogo": "No Logo", + "pageNumber": "Page Number", + "password": "Certificate Password", + "passwordOptional": "Leave empty if no password", + "reason": "Reason", + "serverCertMessage": "Using server certificate - no files or password required", + "showLogo": "Show Logo" }, "removeCertSign": { "tags": "Đ°ŅƒŅ‚ĐĩĐŊŅ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ†Đ¸Ņ,PEM,P12,ĐžŅ„Đ¸Ņ†Đ¸Đ°ĐģҌĐŊŅ‹Đš,Ņ€Đ°ŅŅˆĐ¸Ņ„Ņ€ĐžĐ˛Đēа", @@ -2071,7 +2351,17 @@ "header": "МĐŊĐžĐŗĐžŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ‡ĐŊĐ°Ņ ĐēĐžĐŧĐŋĐžĐŊОвĐēа", "pagesPerSheet": "ĐĄŅ‚Ņ€Đ°ĐŊĐ¸Ņ† ĐŊа ĐģĐ¸ŅŅ‚:", "addBorder": "Đ”ĐžĐąĐ°Đ˛Đ¸Ņ‚ŅŒ ĐŗŅ€Đ°ĐŊĐ¸Ņ†Ņ‹", - "submit": "ĐžŅ‚ĐŋŅ€Đ°Đ˛Đ¸Ņ‚ŅŒ" + "submit": "ĐžŅ‚ĐŋŅ€Đ°Đ˛Đ¸Ņ‚ŅŒ", + "desc": { + "2": "Place 2 pages side-by-side on a single sheet.", + "3": "Place 3 pages on a single sheet in a single row.", + "4": "Place 4 pages on a single sheet (2 × 2 grid).", + "9": "Place 9 pages on a single sheet (3 × 3 grid).", + "16": "Place 16 pages on a single sheet (4 × 4 grid)." + }, + "error": { + "failed": "An error occurred while creating the multi-page layout." + } }, "bookletImposition": { "tags": "ĐąŅƒĐēĐģĐĩŅ‚,иĐŧĐŋĐžĐˇĐ¸Ņ†Đ¸Ņ,ĐŋĐĩŅ‡Đ°Ņ‚ŅŒ,ĐŋĐĩŅ€ĐĩĐŋĐģґ҂,ŅĐŗĐ¸Đą,ŅĐ¸ĐŗĐŊĐ°Ņ‚ŅƒŅ€Đ°", @@ -2257,10 +2547,22 @@ "reset": "ĐĄĐąŅ€ĐžŅĐ¸Ņ‚ŅŒ Đē ĐŋĐžĐģĐŊĐžĐŧ҃ PDF", "coordinates": { "title": "ПоĐģĐžĐļĐĩĐŊиĐĩ и Ņ€Đ°ĐˇĐŧĐĩŅ€", - "x": "ПоĐģĐžĐļĐĩĐŊиĐĩ X", - "y": "ПоĐģĐžĐļĐĩĐŊиĐĩ Y", - "width": "Đ¨Đ¸Ņ€Đ¸ĐŊа", - "height": "Đ’Ņ‹ŅĐžŅ‚Đ°" + "x": { + "label": "X Position", + "desc": "Left edge (points)" + }, + "y": { + "label": "Y Position", + "desc": "Bottom edge (points)" + }, + "width": { + "label": "Width", + "desc": "Crop width (points)" + }, + "height": { + "label": "Height", + "desc": "Crop height (points)" + } }, "error": { "invalidArea": "ОбĐģĐ°ŅŅ‚ŅŒ ĐžĐąŅ€ĐĩСĐēи Đ˛Ņ‹Ņ…ĐžĐ´Đ¸Ņ‚ Са ĐŗŅ€Đ°ĐŊĐ¸Ņ†Ņ‹ PDF", @@ -2278,6 +2580,10 @@ }, "results": { "title": "Đ ĐĩĐˇŅƒĐģŅŒŅ‚Đ°Ņ‚Ņ‹ ĐžĐąŅ€ĐĩСĐēи" + }, + "automation": { + "info": "Enter crop coordinates in PDF points. Origin (0,0) is at bottom-left. These values will be applied to all PDFs processed in this automation.", + "reference": "Reference: A4 page is 595.28 × 841.89 points (210mm × 297mm). 1 inch = 72 points." } }, "autoSplitPDF": { @@ -2488,11 +2794,15 @@ "overlay-pdfs": { "tags": "НаĐģĐžĐļĐĩĐŊиĐĩ", "header": "НаĐģĐžĐļĐĩĐŊиĐĩ PDF-Ņ„Đ°ĐšĐģОв", + "title": "Overlay PDFs", + "desc": "Overlay one PDF on top of another", "baseFile": { "label": "Đ’Ņ‹ĐąĐĩŅ€Đ¸Ņ‚Đĩ ĐąĐ°ĐˇĐžĐ˛Ņ‹Đš PDF-Ņ„Đ°ĐšĐģ" }, "overlayFiles": { - "label": "Đ’Ņ‹ĐąĐĩŅ€Đ¸Ņ‚Đĩ ĐŊаĐēĐģĐ°Đ´Ņ‹Đ˛Đ°ĐĩĐŧŅ‹Đĩ PDF-Ņ„Đ°ĐšĐģŅ‹" + "label": "Đ’Ņ‹ĐąĐĩŅ€Đ¸Ņ‚Đĩ ĐŊаĐēĐģĐ°Đ´Ņ‹Đ˛Đ°ĐĩĐŧŅ‹Đĩ PDF-Ņ„Đ°ĐšĐģŅ‹", + "placeholder": "Choose PDF(s)...", + "addMore": "Add more PDFs..." }, "mode": { "label": "Đ’Ņ‹ĐąĐĩŅ€Đ¸Ņ‚Đĩ Ņ€ĐĩĐļиĐŧ ĐŊаĐģĐžĐļĐĩĐŊĐ¸Ņ", @@ -2502,14 +2812,53 @@ }, "counts": { "label": "КоĐģĐ¸Ņ‡ĐĩŅŅ‚Đ˛Đž ĐŊаĐģĐžĐļĐĩĐŊиК (Đ´ĐģŅ Ņ€ĐĩĐļиĐŧа Ņ„Đ¸ĐēŅĐ¸Ņ€ĐžĐ˛Đ°ĐŊĐŊĐžĐŗĐž ĐŋĐžĐ˛Ņ‚ĐžŅ€ĐĩĐŊĐ¸Ņ)", - "placeholder": "ВвĐĩĐ´Đ¸Ņ‚Đĩ ĐēĐžĐģĐ¸Ņ‡ĐĩŅŅ‚Đ˛Đž ҇ĐĩŅ€ĐĩС СаĐŋŅŅ‚ŅƒŅŽ (ĐŊаĐŋŅ€Đ¸ĐŧĐĩŅ€, 2,3,1)" + "placeholder": "ВвĐĩĐ´Đ¸Ņ‚Đĩ ĐēĐžĐģĐ¸Ņ‡ĐĩŅŅ‚Đ˛Đž ҇ĐĩŅ€ĐĩС СаĐŋŅŅ‚ŅƒŅŽ (ĐŊаĐŋŅ€Đ¸ĐŧĐĩŅ€, 2,3,1)", + "item": "Count for file", + "noFiles": "Add overlay files to configure counts" }, "position": { "label": "Đ’Ņ‹ĐąĐĩŅ€Đ¸Ņ‚Đĩ ĐŋĐžĐˇĐ¸Ņ†Đ¸ŅŽ ĐŊаĐģĐžĐļĐĩĐŊĐ¸Ņ", "foreground": "На ĐŋĐĩŅ€ĐĩĐ´ĐŊĐĩĐŧ ĐŋĐģаĐŊĐĩ", "background": "На СадĐŊĐĩĐŧ ĐŋĐģаĐŊĐĩ" }, - "submit": "ĐžŅ‚ĐŋŅ€Đ°Đ˛Đ¸Ņ‚ŅŒ" + "submit": "ĐžŅ‚ĐŋŅ€Đ°Đ˛Đ¸Ņ‚ŅŒ", + "settings": { + "title": "Settings" + }, + "results": { + "title": "Overlay Results" + }, + "tooltip": { + "header": { + "title": "Overlay PDFs Overview" + }, + "description": { + "title": "Description", + "text": "Combine a base PDF with one or more overlay PDFs. Overlays can be applied page-by-page in different modes and placed in the foreground or background." + }, + "mode": { + "title": "Overlay Mode", + "text": "Choose how to distribute overlay pages across the base PDF pages.", + "sequential": "Sequential Overlay: Use pages from the first overlay PDF until it ends, then move to the next.", + "interleaved": "Interleaved Overlay: Take one page from each overlay in turn.", + "fixedRepeat": "Fixed Repeat Overlay: Take a set number of pages from each overlay before moving to the next. Use Counts to set the numbers." + }, + "position": { + "title": "Overlay Position", + "text": "Foreground places the overlay on top of the page. Background places it behind." + }, + "overlayFiles": { + "title": "Overlay Files", + "text": "Select one or more PDFs to overlay on the base. The order of these files affects how pages are applied in Sequential and Fixed Repeat modes." + }, + "counts": { + "title": "Counts (Fixed Repeat only)", + "text": "Provide a positive number for each overlay file showing how many pages to take before moving to the next. Required when mode is Fixed Repeat." + } + }, + "error": { + "failed": "An error occurred while overlaying PDFs." + } }, "split-by-sections": { "tags": "РаСдĐĩĐģĐĩĐŊиĐĩ ĐŋĐž ҁĐĩĐēŅ†Đ¸ŅĐŧ,РаСдĐĩĐģĐ¸Ņ‚ŅŒ,ĐĐ°ŅŅ‚Ņ€ĐžĐ¸Ņ‚ŅŒ", @@ -2544,7 +2893,18 @@ "customMargin": "ПоĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģҌҁĐēиĐĩ ĐŋĐžĐģŅ", "customColor": "ПоĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģҌҁĐēиК Ņ†Đ˛ĐĩŅ‚ Ņ‚ĐĩĐēŅŅ‚Đ°", "submit": "ĐžŅ‚ĐŋŅ€Đ°Đ˛Đ¸Ņ‚ŅŒ", - "noStampSelected": "Đ¨Ņ‚Đ°ĐŧĐŋ ĐŊĐĩ Đ˛Ņ‹ĐąŅ€Đ°ĐŊ. ВĐĩŅ€ĐŊĐ¸Ņ‚ĐĩҁҌ Đē Đ¨Đ°ĐŗŅƒ 1." + "noStampSelected": "Đ¨Ņ‚Đ°ĐŧĐŋ ĐŊĐĩ Đ˛Ņ‹ĐąŅ€Đ°ĐŊ. ВĐĩŅ€ĐŊĐ¸Ņ‚ĐĩҁҌ Đē Đ¨Đ°ĐŗŅƒ 1.", + "customPosition": "Drag the stamp to the desired location in the preview window.", + "error": { + "failed": "An error occurred while adding stamp to the PDF." + }, + "imageSize": "Image Size", + "margin": "Margin", + "positionAndFormatting": "Position & Formatting", + "quickPosition": "Select a position on the page to place the stamp.", + "results": { + "title": "Stamp Results" + } }, "removeImagePdf": { "tags": "ĐŖĐ´Đ°ĐģĐĩĐŊиĐĩ Đ¸ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊĐ¸Ņ,ĐžĐŋĐĩŅ€Đ°Ņ†Đ¸Đ¸ ŅĐž ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ°Đŧи,ĐĄĐĩŅ€Đ˛ĐĩŅ€ĐŊĐ°Ņ Ņ‡Đ°ŅŅ‚ŅŒ" @@ -2562,7 +2922,8 @@ "status": { "_value": "ĐĄŅ‚Đ°Ņ‚ŅƒŅ", "valid": "ДĐĩĐšŅŅ‚Đ˛Đ¸Ņ‚ĐĩĐģҌĐŊа", - "invalid": "НĐĩĐ´ĐĩĐšŅŅ‚Đ˛Đ¸Ņ‚ĐĩĐģҌĐŊа" + "invalid": "НĐĩĐ´ĐĩĐšŅŅ‚Đ˛Đ¸Ņ‚ĐĩĐģҌĐŊа", + "complete": "Validation complete" }, "signer": "ПодĐŋĐ¸ŅĐ°ĐŊŅ‚", "date": "Đ”Đ°Ņ‚Đ°", @@ -2589,17 +2950,115 @@ "version": "ВĐĩŅ€ŅĐ¸Ņ", "keyUsage": "Đ˜ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°ĐŊиĐĩ ĐēĐģŅŽŅ‡Đ°", "selfSigned": "ХаĐŧĐžĐŋОдĐŋĐ¸ŅĐ°ĐŊĐŊŅ‹Đš", - "bits": "ĐąĐ¸Ņ‚" + "bits": "ĐąĐ¸Ņ‚", + "details": "Certificate Details" }, "signature": { "info": "ИĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸Ņ Đž ĐŋОдĐŋĐ¸ŅĐ¸", "_value": "ПодĐŋĐ¸ŅŅŒ", "mathValid": "ПодĐŋĐ¸ŅŅŒ ĐŧĐ°Ņ‚ĐĩĐŧĐ°Ņ‚Đ¸Ņ‡ĐĩҁĐēи ĐēĐžŅ€Ņ€ĐĩĐēŅ‚ĐŊа, НО:" }, - "selectCustomCert": "ПоĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģҌҁĐēиК Ņ„Đ°ĐšĐģ ҁĐĩŅ€Ņ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ‚Đ° X.509 (НĐĩĐžĐąŅĐˇĐ°Ņ‚ĐĩĐģҌĐŊĐž)" + "selectCustomCert": "ПоĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģҌҁĐēиК Ņ„Đ°ĐšĐģ ҁĐĩŅ€Ņ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ‚Đ° X.509 (НĐĩĐžĐąŅĐˇĐ°Ņ‚ĐĩĐģҌĐŊĐž)", + "downloadCsv": "Download CSV", + "downloadJson": "Download JSON", + "downloadPdf": "Download PDF Report", + "downloadType": { + "csv": "CSV", + "json": "JSON", + "pdf": "PDF" + }, + "error": { + "allFailed": "Unable to validate the selected files.", + "partial": "Some files could not be validated.", + "reportGeneration": "Could not generate the PDF report. JSON and CSV are available.", + "unexpected": "Unexpected error during validation." + }, + "finalizing": "Preparing downloads...", + "issue": { + "certExpired": "Certificate expired", + "certRevocationUnknown": "Certificate revocation status unknown", + "certRevoked": "Certificate revoked", + "chainInvalid": "Certificate chain invalid", + "signatureInvalid": "Signature cryptographic check failed", + "trustInvalid": "Certificate not trusted" + }, + "noResults": "Run the validation to generate a report.", + "noSignaturesShort": "No signatures", + "processing": "Validating signatures...", + "report": { + "continued": "Continued", + "downloads": "Downloads", + "entryLabel": "Signature Summary", + "fields": { + "created": "Created", + "fileSize": "File Size", + "signatureCount": "Total Signatures", + "signatureDate": "Signature Date" + }, + "filesEvaluated": "{{count}} files evaluated", + "footer": "Validated via Stirling PDF", + "generatedAt": "Generated", + "noPdf": "PDF report will be available after a successful validation.", + "page": "Page", + "shortTitle": "Signature Summary", + "signatureCountLabel": "{{count}} signatures", + "signaturesFound": "{{count}} signatures detected", + "signaturesValid": "{{count}} fully valid", + "title": "Signature Validation Report" + }, + "settings": { + "certHint": "Upload a trusted X.509 certificate to validate against a custom trust source.", + "title": "Validation Settings" + }, + "signatureDate": "Signature Date", + "totalSignatures": "Total Signatures" }, "replaceColor": { - "tags": "ЗаĐŧĐĩĐŊа Ņ†Đ˛ĐĩŅ‚Đ°,ОĐŋĐĩŅ€Đ°Ņ†Đ¸Đ¸ ŅĐž ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ°Đŧи,Back end,ĐŊа ŅŅ‚ĐžŅ€ĐžĐŊĐĩ ҁĐĩŅ€Đ˛ĐĩŅ€Đ°" + "tags": "ЗаĐŧĐĩĐŊа Ņ†Đ˛ĐĩŅ‚Đ°,ОĐŋĐĩŅ€Đ°Ņ†Đ¸Đ¸ ŅĐž ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Đ°Đŧи,Back end,ĐŊа ŅŅ‚ĐžŅ€ĐžĐŊĐĩ ҁĐĩŅ€Đ˛ĐĩŅ€Đ°", + "labels": { + "settings": "Settings", + "colourOperation": "Colour operation" + }, + "options": { + "highContrast": "High contrast", + "invertAll": "Invert all colours", + "custom": "Custom", + "cmyk": "Convert to CMYK" + }, + "tooltip": { + "header": { + "title": "Replace & Invert Colour Settings Overview" + }, + "description": { + "title": "Description", + "text": "Transform PDF colours to improve readability and accessibility. Choose from high contrast presets, invert all colours, or create custom colour schemes." + }, + "highContrast": { + "title": "High Contrast", + "text": "Apply predefined high contrast colour combinations designed for better readability and accessibility compliance.", + "bullet1": "White text on black background - Classic dark mode", + "bullet2": "Black text on white background - Standard high contrast", + "bullet3": "Yellow text on black background - High visibility option", + "bullet4": "Green text on black background - Alternative high contrast" + }, + "invertAll": { + "title": "Invert All Colours", + "text": "Completely invert all colours in the PDF, creating a negative-like effect. Useful for creating dark mode versions of documents or reducing eye strain in low-light conditions." + }, + "custom": { + "title": "Custom Colours", + "text": "Define your own text and background colours using the colour pickers. Perfect for creating branded documents or specific accessibility requirements.", + "bullet1": "Text colour - Choose the colour for text elements", + "bullet2": "Background colour - Set the background colour for the document" + }, + "cmyk": { + "title": "Convert to CMYK", + "text": "Convert the PDF from RGB colour space to CMYK colour space, optimized for professional printing. This process converts colours to the Cyan, Magenta, Yellow, Black model used by printers." + } + }, + "error": { + "failed": "An error occurred while processing the colour replacement." + } }, "login": { "title": "Đ’Ņ…ĐžĐ´", @@ -2632,6 +3091,11 @@ "enterEmail": "ВвĐĩĐ´Đ¸Ņ‚Đĩ Đ˛Đ°Ņˆ email", "enterPassword": "ВвĐĩĐ´Đ¸Ņ‚Đĩ Đ˛Đ°Ņˆ ĐŋĐ°Ņ€ĐžĐģҌ", "loggingIn": "Đ’Ņ…ĐžĐ´...", + "username": "Username", + "enterUsername": "Enter username", + "useEmailInstead": "Login with email", + "forgotPassword": "Forgot your password?", + "logIn": "Log In", "signingIn": "Đ’Ņ…ĐžĐ´Đ¸Đŧ...", "login": "Đ’ĐžĐšŅ‚Đ¸", "or": "ИĐģи", @@ -2649,7 +3113,10 @@ "magicLinkSent": "ĐœĐ°ĐŗĐ¸Ņ‡ĐĩҁĐēĐ°Ņ ҁҁҋĐģĐēа ĐžŅ‚ĐŋŅ€Đ°Đ˛ĐģĐĩĐŊа ĐŊа {{email}}! ĐŸŅ€ĐžĐ˛ĐĩŅ€ŅŒŅ‚Đĩ ĐŋĐžŅ‡Ņ‚Ņƒ и ĐŋĐĩŅ€ĐĩĐšĐ´Đ¸Ņ‚Đĩ ĐŋĐž ҁҁҋĐģĐēĐĩ Đ´ĐģŅ Đ˛Ņ…ĐžĐ´Đ°.", "passwordResetSent": "ĐĄŅŅ‹ĐģĐēа Đ´ĐģŅ ŅĐąŅ€ĐžŅĐ° ĐŋĐ°Ņ€ĐžĐģŅ ĐžŅ‚ĐŋŅ€Đ°Đ˛ĐģĐĩĐŊа ĐŊа {{email}}! ĐŸŅ€ĐžĐ˛ĐĩŅ€ŅŒŅ‚Đĩ ĐŋĐžŅ‡Ņ‚Ņƒ и ҁĐģĐĩĐ´ŅƒĐšŅ‚Đĩ иĐŊŅŅ‚Ņ€ŅƒĐēŅ†Đ¸ŅĐŧ.", "failedToSignIn": "НĐĩ ŅƒĐ´Đ°ĐģĐžŅŅŒ Đ˛ĐžĐšŅ‚Đ¸ ҇ĐĩŅ€ĐĩС {{provider}}: {{message}}", - "unexpectedError": "НĐĩĐŋŅ€ĐĩдвидĐĩĐŊĐŊĐ°Ņ ĐžŅˆĐ¸ĐąĐēа: {{message}}" + "unexpectedError": "НĐĩĐŋŅ€ĐĩдвидĐĩĐŊĐŊĐ°Ņ ĐžŅˆĐ¸ĐąĐēа: {{message}}", + "accountCreatedSuccess": "Account created successfully! You can now sign in.", + "passwordChangedSuccess": "Password changed successfully! Please sign in with your new password.", + "credentialsUpdated": "Your credentials have been updated. Please sign in again." }, "signup": { "title": "ĐĄĐžĐˇĐ´Đ°Ņ‚ŅŒ аĐēĐēĐ°ŅƒĐŊŅ‚", @@ -2672,7 +3139,12 @@ "invalidEmail": "ПоĐļаĐģŅƒĐšŅŅ‚Đ°, ввĐĩĐ´Đ¸Ņ‚Đĩ ĐēĐžŅ€Ņ€ĐĩĐēŅ‚ĐŊŅ‹Đš Đ°Đ´Ņ€Đĩҁ email", "checkEmailConfirmation": "ĐŸŅ€ĐžĐ˛ĐĩŅ€ŅŒŅ‚Đĩ ĐŋĐžŅ‡Ņ‚Ņƒ и ĐŋĐĩŅ€ĐĩĐšĐ´Đ¸Ņ‚Đĩ ĐŋĐž ҁҁҋĐģĐēĐĩ Đ´ĐģŅ СавĐĩŅ€ŅˆĐĩĐŊĐ¸Ņ Ņ€ĐĩĐŗĐ¸ŅŅ‚Ņ€Đ°Ņ†Đ¸Đ¸.", "accountCreatedSuccessfully": "АĐēĐēĐ°ŅƒĐŊŅ‚ ҃ҁĐŋĐĩ҈ĐŊĐž ŅĐžĐˇĐ´Đ°ĐŊ! ĐĸĐĩĐŋĐĩŅ€ŅŒ Đ˛Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ Đ˛ĐžĐšŅ‚Đ¸.", - "unexpectedError": "НĐĩĐŋŅ€ĐĩдвидĐĩĐŊĐŊĐ°Ņ ĐžŅˆĐ¸ĐąĐēа: {{message}}" + "unexpectedError": "НĐĩĐŋŅ€ĐĩдвидĐĩĐŊĐŊĐ°Ņ ĐžŅˆĐ¸ĐąĐēа: {{message}}", + "useEmailInstead": "Use Email Instead", + "nameRequired": "Name is required", + "emailRequired": "Email is required", + "passwordRequired": "Password is required", + "confirmPasswordRequired": "Please confirm your password" }, "pdfToSinglePage": { "title": "PDF в ОдĐŊ҃ ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Ņƒ", @@ -2712,10 +3184,23 @@ "adjustContrast": { "title": "ĐĐ°ŅŅ‚Ņ€ĐžĐšĐēа ĐēĐžĐŊŅ‚Ņ€Đ°ŅŅ‚Đ°", "header": "ĐĐ°ŅŅ‚Ņ€ĐžĐšĐēа ĐēĐžĐŊŅ‚Ņ€Đ°ŅŅ‚Đ°", + "basic": "Basic Adjustments", "contrast": "КоĐŊŅ‚Ņ€Đ°ŅŅ‚:", "brightness": "Đ¯Ņ€ĐēĐžŅŅ‚ŅŒ:", "saturation": "ĐĐ°ŅŅ‹Ņ‰ĐĩĐŊĐŊĐžŅŅ‚ŅŒ:", - "download": "ĐĄĐēĐ°Ņ‡Đ°Ņ‚ŅŒ" + "download": "ĐĄĐēĐ°Ņ‡Đ°Ņ‚ŅŒ", + "adjustColors": "Adjust Colors", + "blue": "Blue", + "confirm": "Confirm", + "error": { + "failed": "Failed to adjust colors/contrast" + }, + "green": "Green", + "noPreview": "Select a PDF to preview", + "red": "Red", + "results": { + "title": "Adjusted PDF" + } }, "compress": { "title": "ĐĄĐļĐ°Ņ‚ŅŒ", @@ -2862,7 +3347,13 @@ "title": "ĐŖĐ´Đ°ĐģĐ¸Ņ‚ŅŒ Đ¸ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊиĐĩ", "header": "ĐŖĐ´Đ°ĐģĐ¸Ņ‚ŅŒ Đ¸ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊиĐĩ", "removeImage": "ĐŖĐ´Đ°ĐģĐ¸Ņ‚ŅŒ Đ¸ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊиĐĩ", - "submit": "ĐŖĐ´Đ°ĐģĐ¸Ņ‚ŅŒ Đ¸ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊиĐĩ" + "submit": "ĐŖĐ´Đ°ĐģĐ¸Ņ‚ŅŒ Đ¸ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊиĐĩ", + "error": { + "failed": "Failed to remove images from the PDF." + }, + "results": { + "title": "Remove Images Results" + } }, "splitByChapters": { "title": "РаСдĐĩĐģĐ¸Ņ‚ŅŒ PDF ĐŋĐž ĐŗĐģаваĐŧ", @@ -2937,6 +3428,10 @@ "title": "АĐŊаĐģĐ¸Ņ‚Đ¸Đēа", "description": "Đ­Ņ‚Đ¸ Ņ„Đ°ĐšĐģŅ‹ cookie ĐŋĐžĐŧĐžĐŗĐ°ŅŽŅ‚ ĐŊаĐŧ ĐŋĐžĐŊŅŅ‚ŅŒ, ĐēаĐē Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒŅŽŅ‚ŅŅ ĐŊĐ°ŅˆĐ¸ иĐŊŅŅ‚Ņ€ŅƒĐŧĐĩĐŊ҂ҋ, Ņ‡Ņ‚ĐžĐąŅ‹ ĐŧŅ‹ ĐŧĐžĐŗĐģи ŅĐžŅŅ€ĐĩĐ´ĐžŅ‚ĐžŅ‡Đ¸Ņ‚ŅŒŅŅ ĐŊа ŅĐžĐˇĐ´Đ°ĐŊии Ņ„ŅƒĐŊĐēŅ†Đ¸Đš, ĐēĐžŅ‚ĐžŅ€Ņ‹Đĩ йОĐģҌ҈Đĩ Đ˛ŅĐĩĐŗĐž ҆ĐĩĐŊŅŅ‚ŅŅ ĐŊĐ°ŅˆĐ¸Đŧ ŅĐžĐžĐąŅ‰ĐĩŅŅ‚Đ˛ĐžĐŧ. Đ‘ŅƒĐ´ŅŒŅ‚Đĩ ŅƒĐ˛ĐĩŅ€ĐĩĐŊŅ‹ — Stirling PDF ĐŊĐĩ ĐŧĐžĐļĐĩŅ‚ и ĐŊиĐēĐžĐŗĐ´Đ° ĐŊĐĩ ĐąŅƒĐ´ĐĩŅ‚ ĐžŅ‚ŅĐģĐĩĐļĐ¸Đ˛Đ°Ņ‚ŅŒ ŅĐžĐ´ĐĩŅ€ĐļаĐŊиĐĩ Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚ĐžĐ˛, ҁ ĐēĐžŅ‚ĐžŅ€Ņ‹Đŧи Đ˛Ņ‹ Ņ€Đ°ĐąĐžŅ‚Đ°ĐĩŅ‚Đĩ." } + }, + "services": { + "posthog": "PostHog Analytics", + "scarf": "Scarf Pixel" } }, "removeMetadata": { @@ -2998,11 +3493,18 @@ "panMode": "Đ ĐĩĐļиĐŧ ĐŋаĐŊĐžŅ€Đ°ĐŧĐ¸Ņ€ĐžĐ˛Đ°ĐŊĐ¸Ņ", "rotateLeft": "ПовĐĩŅ€ĐŊŅƒŅ‚ŅŒ вĐģĐĩвО", "rotateRight": "ПовĐĩŅ€ĐŊŅƒŅ‚ŅŒ вĐŋŅ€Đ°Đ˛Đž", - "toggleSidebar": "ПоĐēĐ°ĐˇĐ°Ņ‚ŅŒ/ҁĐēŅ€Ņ‹Ņ‚ŅŒ йОĐēĐžĐ˛ŅƒŅŽ ĐŋаĐŊĐĩĐģҌ" + "toggleSidebar": "ПоĐēĐ°ĐˇĐ°Ņ‚ŅŒ/ҁĐēŅ€Ņ‹Ņ‚ŅŒ йОĐēĐžĐ˛ŅƒŅŽ ĐŋаĐŊĐĩĐģҌ", + "exportSelected": "Export Selected Pages", + "toggleAnnotations": "Toggle Annotations Visibility", + "annotationMode": "Toggle Annotation Mode", + "draw": "Draw", + "save": "Save" }, "search": { "title": "ĐŸĐžĐ¸ŅĐē ĐŋĐž PDF", - "placeholder": "ВвĐĩĐ´Đ¸Ņ‚Đĩ ĐŋĐžĐ¸ŅĐēĐžĐ˛Ņ‹Đš СаĐŋŅ€ĐžŅ..." + "placeholder": "ВвĐĩĐ´Đ¸Ņ‚Đĩ ĐŋĐžĐ¸ŅĐēĐžĐ˛Ņ‹Đš СаĐŋŅ€ĐžŅ...", + "noResults": "No results found", + "searching": "Searching..." }, "guestBanner": { "title": "Đ’Ņ‹ Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐĩŅ‚Đĩ Stirling PDF ĐēаĐē ĐŗĐžŅŅ‚ŅŒ!", @@ -3040,9 +3542,597 @@ "automate": "ĐĐ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸ĐˇĐ°Ņ†Đ¸Ņ", "files": "ФаКĐģŅ‹", "activity": "АĐēŅ‚Đ¸Đ˛ĐŊĐžŅŅ‚ŅŒ", + "help": "Help", + "account": "Account", "config": "КоĐŊŅ„Đ¸ĐŗŅƒŅ€Đ°Ņ†Đ¸Ņ", + "adminSettings": "Admin Settings", "allTools": "Đ’ŅĐĩ иĐŊŅŅ‚Ņ€ŅƒĐŧĐĩĐŊ҂ҋ" }, + "admin": { + "error": "Error", + "success": "Success", + "expand": "Expand", + "close": "Close", + "status": { + "active": "Active", + "inactive": "Inactive" + }, + "settings": { + "title": "Admin Settings", + "workspace": "Workspace", + "fetchError": "Failed to load settings", + "saveError": "Failed to save settings", + "saved": "Settings saved successfully", + "saveSuccess": "Settings saved successfully", + "save": "Save Changes", + "restartRequired": "Restart Required", + "restart": { + "title": "Restart Required", + "message": "Settings have been saved successfully. A server restart is required for the changes to take effect.", + "question": "Would you like to restart the server now or later?", + "now": "Restart Now", + "later": "Restart Later" + }, + "restarting": "Restarting Server", + "restartingMessage": "The server is restarting. Please wait a moment...", + "restartError": "Failed to restart server. Please restart manually.", + "general": { + "title": "System Settings", + "description": "Configure system-wide application settings including branding and default behaviour.", + "ui": "User Interface", + "system": "System", + "appName": { + "label": "Application Name", + "description": "The name displayed in the browser tab and home page" + }, + "appNameNavbar": { + "label": "Navbar Brand", + "description": "The name displayed in the navigation bar" + }, + "homeDescription": { + "label": "Home Description", + "description": "The description text shown on the home page" + }, + "defaultLocale": { + "label": "Default Locale", + "description": "The default language for new users (e.g., en_US, es_ES)" + }, + "fileUploadLimit": { + "label": "File Upload Limit", + "description": "Maximum file upload size (e.g., 100MB, 1GB)" + }, + "showUpdate": { + "label": "Show Update Notifications", + "description": "Display notifications when a new version is available" + }, + "showUpdateOnlyAdmin": { + "label": "Show Updates to Admins Only", + "description": "Restrict update notifications to admin users only" + }, + "customHTMLFiles": { + "label": "Custom HTML Files", + "description": "Allow serving custom HTML files from the customFiles directory" + }, + "languages": { + "label": "Available Languages", + "description": "Languages that users can select from (leave empty to enable all languages)" + }, + "customMetadata": { + "label": "Custom Metadata", + "autoUpdate": { + "label": "Auto Update Metadata", + "description": "Automatically update PDF metadata on all processed documents" + }, + "author": { + "label": "Default Author", + "description": "Default author for PDF metadata (e.g., username)" + }, + "creator": { + "label": "Default Creator", + "description": "Default creator for PDF metadata" + }, + "producer": { + "label": "Default Producer", + "description": "Default producer for PDF metadata" + } + }, + "customPaths": { + "label": "Custom Paths", + "description": "Configure custom file system paths for pipeline processing and external tools", + "pipeline": { + "label": "Pipeline Directories", + "watchedFoldersDir": { + "label": "Watched Folders Directory", + "description": "Directory where pipeline monitors for incoming PDFs (leave empty for default: /pipeline/watchedFolders)" + }, + "finishedFoldersDir": { + "label": "Finished Folders Directory", + "description": "Directory where processed PDFs are outputted (leave empty for default: /pipeline/finishedFolders)" + } + }, + "operations": { + "label": "External Tool Paths", + "weasyprint": { + "label": "WeasyPrint Executable", + "description": "Path to WeasyPrint executable for HTML to PDF conversion (leave empty for default: /opt/venv/bin/weasyprint)" + }, + "unoconvert": { + "label": "Unoconvert Executable", + "description": "Path to LibreOffice unoconvert for document conversions (leave empty for default: /opt/venv/bin/unoconvert)" + } + } + } + }, + "security": { + "title": "Security", + "description": "Configure authentication, login behaviour, and security policies.", + "ssoNotice": { + "title": "Looking for SSO/SAML settings?", + "message": "OAuth2 and SAML2 authentication providers have been moved to the Connections menu for easier management." + }, + "authentication": "Authentication", + "enableLogin": { + "label": "Enable Login", + "description": "Require users to log in before accessing the application" + }, + "loginMethod": { + "label": "Login Method", + "description": "The authentication method to use for user login", + "all": "All Methods", + "normal": "Username/Password Only", + "oauth2": "OAuth2 Only", + "saml2": "SAML2 Only" + }, + "loginAttemptCount": { + "label": "Login Attempt Limit", + "description": "Maximum number of failed login attempts before account lockout" + }, + "loginResetTimeMinutes": { + "label": "Login Reset Time (minutes)", + "description": "Time before failed login attempts are reset" + }, + "csrfDisabled": { + "label": "Disable CSRF Protection", + "description": "Disable Cross-Site Request Forgery protection (not recommended)" + }, + "initialLogin": { + "label": "Initial Login", + "username": { + "label": "Initial Username", + "description": "The username for the initial admin account" + }, + "password": { + "label": "Initial Password", + "description": "The password for the initial admin account" + } + }, + "jwt": { + "label": "JWT Configuration", + "secureCookie": { + "label": "Secure Cookie", + "description": "Require HTTPS for JWT cookies (recommended for production)" + }, + "keyRetentionDays": { + "label": "Key Retention Days", + "description": "Number of days to retain old JWT keys for verification" + }, + "persistence": { + "label": "Enable Key Persistence", + "description": "Store JWT keys persistently to survive server restarts" + }, + "enableKeyRotation": { + "label": "Enable Key Rotation", + "description": "Automatically rotate JWT signing keys periodically" + }, + "enableKeyCleanup": { + "label": "Enable Key Cleanup", + "description": "Automatically remove expired JWT keys" + } + }, + "audit": { + "label": "Audit Logging", + "enabled": { + "label": "Enable Audit Logging", + "description": "Track user actions and system events for compliance and security monitoring" + }, + "level": { + "label": "Audit Level", + "description": "0=OFF, 1=BASIC, 2=STANDARD, 3=VERBOSE" + }, + "retentionDays": { + "label": "Audit Retention (days)", + "description": "Number of days to retain audit logs" + } + }, + "htmlUrlSecurity": { + "label": "HTML URL Security", + "description": "Configure URL access restrictions for HTML processing to prevent SSRF attacks", + "enabled": { + "label": "Enable URL Security", + "description": "Enable URL security restrictions for HTML to PDF conversions" + }, + "level": { + "label": "Security Level", + "description": "MAX: whitelist only, MEDIUM: block internal networks, OFF: no restrictions", + "max": "Maximum (Whitelist Only)", + "medium": "Medium (Block Internal)", + "off": "Off (No Restrictions)" + }, + "advanced": "Advanced Settings", + "allowedDomains": { + "label": "Allowed Domains (Whitelist)", + "description": "One domain per line (e.g., cdn.example.com). Only these domains allowed when level is MAX" + }, + "blockedDomains": { + "label": "Blocked Domains (Blacklist)", + "description": "One domain per line (e.g., malicious.com). Additional domains to block" + }, + "internalTlds": { + "label": "Internal TLDs", + "description": "One TLD per line (e.g., .local, .internal). Block domains with these TLD patterns" + }, + "networkBlocking": "Network Blocking", + "blockPrivateNetworks": { + "label": "Block Private Networks", + "description": "Block RFC 1918 private networks (10.x.x.x, 192.168.x.x, 172.16-31.x.x)" + }, + "blockLocalhost": { + "label": "Block Localhost", + "description": "Block localhost and loopback addresses (127.x.x.x, ::1)" + }, + "blockLinkLocal": { + "label": "Block Link-Local Addresses", + "description": "Block link-local addresses (169.254.x.x, fe80::/10)" + }, + "blockCloudMetadata": { + "label": "Block Cloud Metadata Endpoints", + "description": "Block cloud provider metadata endpoints (169.254.169.254)" + } + } + }, + "connections": { + "title": "Connections", + "description": "Configure external authentication providers like OAuth2 and SAML.", + "linkedServices": "Linked Services", + "unlinkedServices": "Unlinked Services", + "connect": "Connect", + "disconnect": "Disconnect", + "disconnected": "Provider disconnected successfully", + "disconnectError": "Failed to disconnect provider", + "ssoAutoLogin": { + "label": "SSO Auto Login", + "enable": "Enable SSO Auto Login", + "description": "Automatically redirect to SSO login when authentication is required" + }, + "oauth2": { + "label": "OAuth2", + "enabled": { + "label": "Enable OAuth2", + "description": "Allow users to authenticate using OAuth2 providers" + }, + "provider": { + "label": "Provider", + "description": "The OAuth2 provider to use for authentication" + }, + "issuer": { + "label": "Issuer URL", + "description": "The OAuth2 provider issuer URL" + }, + "clientId": { + "label": "Client ID", + "description": "The OAuth2 client ID from your provider" + }, + "clientSecret": { + "label": "Client Secret", + "description": "The OAuth2 client secret from your provider" + }, + "useAsUsername": { + "label": "Use as Username", + "description": "The OAuth2 claim to use as the username (e.g., email, sub)" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first OAuth2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via OAuth2" + }, + "scopes": { + "label": "OAuth2 Scopes", + "description": "Comma-separated list of OAuth2 scopes to request (e.g., openid, profile, email)" + } + }, + "saml2": { + "label": "SAML2", + "enabled": { + "label": "Enable SAML2", + "description": "Allow users to authenticate using SAML2 providers" + }, + "provider": { + "label": "Provider", + "description": "The SAML2 provider name" + }, + "registrationId": { + "label": "Registration ID", + "description": "The SAML2 registration identifier" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first SAML2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via SAML2" + } + } + }, + "database": { + "title": "Database", + "description": "Configure custom database connection settings for enterprise deployments.", + "configuration": "Database Configuration", + "enableCustom": { + "label": "Enable Custom Database", + "description": "Use your own custom database configuration instead of the default embedded database" + }, + "customUrl": { + "label": "Custom Database URL", + "description": "Full JDBC connection string (e.g., jdbc:postgresql://localhost:5432/postgres). If provided, individual connection settings below are not used." + }, + "type": { + "label": "Database Type", + "description": "Type of database (not used if custom URL is provided)" + }, + "hostName": { + "label": "Host Name", + "description": "Database server hostname (not used if custom URL is provided)" + }, + "port": { + "label": "Port", + "description": "Database server port (not used if custom URL is provided)" + }, + "name": { + "label": "Database Name", + "description": "Name of the database (not used if custom URL is provided)" + }, + "username": { + "label": "Username", + "description": "Database authentication username" + }, + "password": { + "label": "Password", + "description": "Database authentication password" + } + }, + "privacy": { + "title": "Privacy", + "description": "Configure privacy and data collection settings.", + "analytics": "Analytics & Tracking", + "enableAnalytics": { + "label": "Enable Analytics", + "description": "Collect anonymous usage analytics to help improve the application" + }, + "metricsEnabled": { + "label": "Enable Metrics", + "description": "Enable collection of performance and usage metrics. Provides API endpoint for admins to access metrics data" + }, + "searchEngine": "Search Engine Visibility", + "googleVisibility": { + "label": "Google Visibility", + "description": "Allow search engines to index this application" + } + }, + "advanced": { + "title": "Advanced", + "description": "Configure advanced features and experimental functionality.", + "features": "Feature Flags", + "processing": "Processing", + "endpoints": { + "label": "Endpoints", + "manage": "Manage API Endpoints", + "description": "Endpoint management is configured via YAML. See documentation for details on enabling/disabling specific endpoints." + }, + "enableAlphaFunctionality": { + "label": "Enable Alpha Features", + "description": "Enable experimental and alpha-stage features (may be unstable)" + }, + "enableUrlToPDF": { + "label": "Enable URL to PDF", + "description": "Allow conversion of web pages to PDF documents" + }, + "maxDPI": { + "label": "Maximum DPI", + "description": "Maximum DPI for image processing (0 = unlimited)" + }, + "tessdataDir": { + "label": "Tessdata Directory", + "description": "Path to the tessdata directory for OCR language files" + }, + "disableSanitize": { + "label": "Disable HTML Sanitization", + "description": "WARNING: Security risk - disabling HTML sanitization can lead to XSS vulnerabilities" + }, + "tempFileManagement": { + "label": "Temp File Management", + "description": "Configure temporary file storage and cleanup behavior", + "baseTmpDir": { + "label": "Base Temp Directory", + "description": "Base directory for temporary files (leave empty for default: java.io.tmpdir/stirling-pdf)" + }, + "libreofficeDir": { + "label": "LibreOffice Temp Directory", + "description": "Directory for LibreOffice temp files (leave empty for default: baseTmpDir/libreoffice)" + }, + "systemTempDir": { + "label": "System Temp Directory", + "description": "System temp directory to clean (only used if cleanupSystemTemp is enabled)" + }, + "prefix": { + "label": "Temp File Prefix", + "description": "Prefix for temp file names" + }, + "maxAgeHours": { + "label": "Max Age (hours)", + "description": "Maximum age in hours before temp files are cleaned up" + }, + "cleanupIntervalMinutes": { + "label": "Cleanup Interval (minutes)", + "description": "How often to run cleanup (in minutes)" + }, + "startupCleanup": { + "label": "Startup Cleanup", + "description": "Clean up old temp files on application startup" + }, + "cleanupSystemTemp": { + "label": "Cleanup System Temp", + "description": "Whether to clean broader system temp directory (use with caution)" + } + }, + "processExecutor": { + "label": "Process Executor Limits", + "description": "Configure session limits and timeouts for each process executor", + "sessionLimit": { + "label": "Session Limit", + "description": "Maximum concurrent instances" + }, + "timeout": { + "label": "Timeout (minutes)", + "description": "Maximum execution time" + }, + "libreOffice": "LibreOffice", + "pdfToHtml": "PDF to HTML", + "qpdf": "QPDF", + "tesseract": "Tesseract OCR", + "pythonOpenCv": "Python OpenCV", + "weasyPrint": "WeasyPrint", + "installApp": "Install App", + "calibre": "Calibre", + "ghostscript": "Ghostscript", + "ocrMyPdf": "OCRmyPDF" + } + }, + "mail": { + "title": "Mail Server", + "description": "Configure SMTP settings for sending email notifications.", + "smtp": "SMTP Configuration", + "enabled": { + "label": "Enable Mail", + "description": "Enable email notifications and SMTP functionality" + }, + "host": { + "label": "SMTP Host", + "description": "The hostname or IP address of your SMTP server" + }, + "port": { + "label": "SMTP Port", + "description": "The port number for SMTP connection (typically 25, 465, or 587)" + }, + "username": { + "label": "SMTP Username", + "description": "Username for SMTP authentication" + }, + "password": { + "label": "SMTP Password", + "description": "Password for SMTP authentication" + }, + "from": { + "label": "From Address", + "description": "The email address to use as the sender" + }, + "enableInvites": { + "label": "Enable Email Invites", + "description": "Allow admins to invite users via email with auto-generated passwords" + }, + "frontendUrl": { + "label": "Frontend URL", + "description": "Base URL for frontend (e.g. https://pdf.example.com). Used for generating invite links in emails. Leave empty to use backend URL." + } + }, + "legal": { + "title": "Legal Documents", + "description": "Configure links to legal documents and policies.", + "disclaimer": { + "title": "Legal Responsibility Warning", + "message": "By customizing these legal documents, you assume full responsibility for ensuring compliance with all applicable laws and regulations, including but not limited to GDPR and other EU data protection requirements. Only modify these settings if: (1) you are operating a personal/private instance, (2) you are outside EU jurisdiction and understand your local legal obligations, or (3) you have obtained proper legal counsel and accept sole responsibility for all user data and legal compliance. Stirling-PDF and its developers assume no liability for your legal obligations." + }, + "termsAndConditions": { + "label": "Terms and Conditions", + "description": "URL or filename to terms and conditions" + }, + "privacyPolicy": { + "label": "Privacy Policy", + "description": "URL or filename to privacy policy" + }, + "accessibilityStatement": { + "label": "Accessibility Statement", + "description": "URL or filename to accessibility statement" + }, + "cookiePolicy": { + "label": "Cookie Policy", + "description": "URL or filename to cookie policy" + }, + "impressum": { + "label": "Impressum", + "description": "URL or filename to impressum (required in some jurisdictions)" + } + }, + "premium": { + "title": "Premium & Enterprise", + "description": "Configure your premium or enterprise license key.", + "license": "License Configuration", + "key": { + "label": "License Key", + "description": "Enter your premium or enterprise license key" + }, + "enabled": { + "label": "Enable Premium Features", + "description": "Enable license key checks for pro/enterprise features" + }, + "movedFeatures": { + "title": "Premium Features Distributed", + "message": "Premium and Enterprise features are now organized in their respective sections:" + } + }, + "features": { + "title": "Features", + "description": "Configure optional features and functionality.", + "serverCertificate": { + "label": "Server Certificate", + "description": "Configure server-side certificate generation for \"Sign with Stirling-PDF\" functionality", + "enabled": { + "label": "Enable Server Certificate", + "description": "Enable server-side certificate for \"Sign with Stirling-PDF\" option" + }, + "organizationName": { + "label": "Organization Name", + "description": "Organization name for generated certificates" + }, + "validity": { + "label": "Certificate Validity (days)", + "description": "Number of days the certificate will be valid" + }, + "regenerateOnStartup": { + "label": "Regenerate on Startup", + "description": "Generate new certificate on each application startup" + } + } + }, + "endpoints": { + "title": "API Endpoints", + "description": "Control which API endpoints and endpoint groups are available.", + "management": "Endpoint Management", + "toRemove": { + "label": "Disabled Endpoints", + "description": "Select individual endpoints to disable" + }, + "groupsToRemove": { + "label": "Disabled Endpoint Groups", + "description": "Select endpoint groups to disable" + }, + "note": "Note: Disabling endpoints restricts API access but does not remove UI components. Restart required for changes to take effect." + } + } + }, "fileUpload": { "selectFile": "Đ’Ņ‹ĐąĐĩŅ€Đ¸Ņ‚Đĩ Ņ„Đ°ĐšĐģ", "selectFiles": "Đ’Ņ‹ĐąĐĩŅ€Đ¸Ņ‚Đĩ Ņ„Đ°ĐšĐģŅ‹", @@ -3067,6 +4157,9 @@ "addFiles": "Đ”ĐžĐąĐ°Đ˛Đ¸Ņ‚ŅŒ Ņ„Đ°ĐšĐģŅ‹", "dragFilesInOrClick": "ПĐĩŅ€ĐĩŅ‚Đ°Ņ‰Đ¸Ņ‚Đĩ Ņ„Đ°ĐšĐģŅ‹ иĐģи ĐŊаĐļĐŧĐ¸Ņ‚Đĩ ÂĢĐ”ĐžĐąĐ°Đ˛Đ¸Ņ‚ŅŒ Ņ„Đ°ĐšĐģŅ‹Âģ, Ņ‡Ņ‚ĐžĐąŅ‹ Đ˛Ņ‹ĐąŅ€Đ°Ņ‚ŅŒ" }, + "fileEditor": { + "addFiles": "Add Files" + }, "fileManager": { "title": "Đ—Đ°ĐŗŅ€ŅƒĐˇĐ¸Ņ‚ŅŒ PDF-Ņ„Đ°ĐšĐģŅ‹", "subtitle": "ДобавĐģŅĐšŅ‚Đĩ Ņ„Đ°ĐšĐģŅ‹ в Ņ…Ņ€Đ°ĐŊиĐģĐ¸Ņ‰Đĩ Đ´ĐģŅ ŅƒĐ´ĐžĐąĐŊĐžĐŗĐž Đ´ĐžŅŅ‚ŅƒĐŋа вО Đ˛ŅĐĩŅ… иĐŊŅŅ‚Ņ€ŅƒĐŧĐĩĐŊŅ‚Đ°Ņ…", @@ -3095,6 +4188,7 @@ "lastModified": "Đ”Đ°Ņ‚Đ° иСĐŧĐĩĐŊĐĩĐŊĐ¸Ņ", "toolChain": "ĐŸŅ€Đ¸ĐŧĐĩĐŊŅ‘ĐŊĐŊŅ‹Đĩ иĐŊŅŅ‚Ņ€ŅƒĐŧĐĩĐŊ҂ҋ", "restore": "Đ’ĐžŅŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚ŅŒ", + "unzip": "Unzip", "searchFiles": "ĐŸĐžĐ¸ŅĐē Ņ„Đ°ĐšĐģОв...", "recent": "НĐĩдавĐŊиĐĩ", "localFiles": "ЛоĐēаĐģҌĐŊŅ‹Đĩ Ņ„Đ°ĐšĐģŅ‹", @@ -3102,7 +4196,6 @@ "googleDriveShort": "Drive", "myFiles": "Мои Ņ„Đ°ĐšĐģŅ‹", "noRecentFiles": "НĐĩдавĐŊиĐĩ Ņ„Đ°ĐšĐģŅ‹ ĐŊĐĩ ĐŊаКдĐĩĐŊŅ‹", - "dropFilesHint": "ПĐĩŅ€ĐĩŅ‚Đ°Ņ‰Đ¸Ņ‚Đĩ Ņ„Đ°ĐšĐģŅ‹ ŅŅŽĐ´Đ°, Ņ‡Ņ‚ĐžĐąŅ‹ ĐˇĐ°ĐŗŅ€ŅƒĐˇĐ¸Ņ‚ŅŒ", "googleDriveNotAvailable": "ИĐŊŅ‚ĐĩĐŗŅ€Đ°Ņ†Đ¸Ņ ҁ Google Drive ĐŊĐĩĐ´ĐžŅŅ‚ŅƒĐŋĐŊа", "openFiles": "ĐžŅ‚ĐēŅ€Ņ‹Ņ‚ŅŒ Ņ„Đ°ĐšĐģŅ‹", "openFile": "ĐžŅ‚ĐēŅ€Ņ‹Ņ‚ŅŒ Ņ„Đ°ĐšĐģ", @@ -3120,7 +4213,18 @@ "selectedCount": "{{count}} Đ˛Ņ‹ĐąŅ€Đ°ĐŊĐž", "download": "ĐĄĐēĐ°Ņ‡Đ°Ņ‚ŅŒ", "delete": "ĐŖĐ´Đ°ĐģĐ¸Ņ‚ŅŒ", - "unsupported": "НĐĩ ĐŋОддĐĩŅ€ĐļиваĐĩŅ‚ŅŅ" + "unsupported": "НĐĩ ĐŋОддĐĩŅ€ĐļиваĐĩŅ‚ŅŅ", + "addToUpload": "Add to Upload", + "deleteAll": "Delete All", + "loadingFiles": "Loading files...", + "noFiles": "No files available", + "noFilesFound": "No files found matching your search", + "openInPageEditor": "Open in Page Editor", + "showAll": "Show All", + "sortByDate": "Sort by Date", + "sortByName": "Sort by Name", + "sortBySize": "Sort by Size", + "dropFilesHint": "ПĐĩŅ€ĐĩŅ‚Đ°Ņ‰Đ¸Ņ‚Đĩ Ņ„Đ°ĐšĐģŅ‹ ŅŅŽĐ´Đ°, Ņ‡Ņ‚ĐžĐąŅ‹ ĐˇĐ°ĐŗŅ€ŅƒĐˇĐ¸Ņ‚ŅŒ" }, "storage": { "temporaryNotice": "ФаКĐģŅ‹ Đ˛Ņ€ĐĩĐŧĐĩĐŊĐŊĐž ŅĐžŅ…Ņ€Đ°ĐŊŅŅŽŅ‚ŅŅ в Đ˛Đ°ŅˆĐĩĐŧ ĐąŅ€Đ°ŅƒĐˇĐĩŅ€Đĩ и ĐŧĐžĐŗŅƒŅ‚ ĐąŅ‹Ņ‚ŅŒ Đ°Đ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐĩҁĐēи ŅƒĐ´Đ°ĐģĐĩĐŊŅ‹", @@ -3136,8 +4240,10 @@ "desc": "ĐŖĐ´Đ°ĐģĐĩĐŊиĐĩ ĐŋĐžŅ‚ĐĩĐŊŅ†Đ¸Đ°ĐģҌĐŊĐž Đ˛Ņ€ĐĩĐ´ĐŊҋ҅ ŅĐģĐĩĐŧĐĩĐŊŅ‚ĐžĐ˛ иС PDF-Ņ„Đ°ĐšĐģОв.", "submit": "ĐžŅ‡Đ¸ŅŅ‚Đ¸Ņ‚ŅŒ PDF", "completed": "ХаĐŊĐ¸Ņ‚Đ¸ĐˇĐ°Ņ†Đ¸Ņ ҃ҁĐŋĐĩ҈ĐŊĐž СавĐĩŅ€ŅˆĐĩĐŊа", - "error.generic": "ХйОК ŅĐ°ĐŊĐ¸Ņ‚Đ¸ĐˇĐ°Ņ†Đ¸Đ¸", - "error.failed": "ĐŸŅ€ĐžĐ¸ĐˇĐžŅˆĐģа ĐžŅˆĐ¸ĐąĐēа ĐŋŅ€Đ¸ ŅĐ°ĐŊĐ¸Ņ‚Đ¸ĐˇĐ°Ņ†Đ¸Đ¸ PDF.", + "error": { + "generic": "ХйОК ŅĐ°ĐŊĐ¸Ņ‚Đ¸ĐˇĐ°Ņ†Đ¸Đ¸", + "failed": "ĐŸŅ€ĐžĐ¸ĐˇĐžŅˆĐģа ĐžŅˆĐ¸ĐąĐēа ĐŋŅ€Đ¸ ŅĐ°ĐŊĐ¸Ņ‚Đ¸ĐˇĐ°Ņ†Đ¸Đ¸ PDF." + }, "filenamePrefix": "sanitised", "sanitizationResults": "Đ ĐĩĐˇŅƒĐģŅŒŅ‚Đ°Ņ‚Ņ‹ ŅĐ°ĐŊĐ¸Ņ‚Đ¸ĐˇĐ°Ņ†Đ¸Đ¸", "steps": { @@ -3151,12 +4257,30 @@ "options": { "title": "ĐŸĐ°Ņ€Đ°ĐŧĐĩ҂Ҁҋ ŅĐ°ĐŊĐ¸Ņ‚Đ¸ĐˇĐ°Ņ†Đ¸Đ¸", "note": "Đ’Ņ‹ĐąĐĩŅ€Đ¸Ņ‚Đĩ ŅĐģĐĩĐŧĐĩĐŊ҂ҋ, ĐēĐžŅ‚ĐžŅ€Ņ‹Đĩ Ņ…ĐžŅ‚Đ¸Ņ‚Đĩ ŅƒĐ´Đ°ĐģĐ¸Ņ‚ŅŒ иС PDF. ДоĐģĐļĐĩĐŊ ĐąŅ‹Ņ‚ŅŒ Đ˛Ņ‹ĐąŅ€Đ°ĐŊ Ņ…ĐžŅ‚Ņ ĐąŅ‹ ОдиĐŊ Đ˛Đ°Ņ€Đ¸Đ°ĐŊŅ‚.", - "removeJavaScript.desc": "ĐŖĐ´Đ°ĐģĐ¸Ņ‚ŅŒ Đ´ĐĩĐšŅŅ‚Đ˛Đ¸Ņ и ҁĐēŅ€Đ¸Đŋ҂ҋ JavaScript иС PDF", - "removeEmbeddedFiles.desc": "ĐŖĐ´Đ°ĐģĐ¸Ņ‚ŅŒ ĐģŅŽĐąŅ‹Đĩ Ņ„Đ°ĐšĐģŅ‹, Đ˛ŅŅ‚Ņ€ĐžĐĩĐŊĐŊŅ‹Đĩ в PDF", - "removeXMPMetadata.desc": "ĐŖĐ´Đ°ĐģĐ¸Ņ‚ŅŒ XMP-ĐŧĐĩŅ‚Đ°Đ´Đ°ĐŊĐŊŅ‹Đĩ иС PDF", - "removeMetadata.desc": "ĐŖĐ´Đ°ĐģĐ¸Ņ‚ŅŒ иĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸ŅŽ Đž Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đĩ (ĐŊаСваĐŊиĐĩ, Đ°Đ˛Ņ‚ĐžŅ€ и Ņ‚. Đ´.)", - "removeLinks.desc": "ĐŖĐ´Đ°ĐģĐ¸Ņ‚ŅŒ вĐŊĐĩ҈ĐŊиĐĩ ҁҁҋĐģĐēи и Đ´ĐĩĐšŅŅ‚Đ˛Đ¸Ņ СаĐŋ҃ҁĐēа иС PDF", - "removeFonts.desc": "ĐŖĐ´Đ°ĐģĐ¸Ņ‚ŅŒ Đ˛ŅŅ‚Ņ€ĐžĐĩĐŊĐŊŅ‹Đĩ ŅˆŅ€Đ¸Ņ„Ņ‚Ņ‹ иС PDF" + "removeJavaScript": { + "label": "Remove JavaScript", + "desc": "ĐŖĐ´Đ°ĐģĐ¸Ņ‚ŅŒ Đ´ĐĩĐšŅŅ‚Đ˛Đ¸Ņ и ҁĐēŅ€Đ¸Đŋ҂ҋ JavaScript иС PDF" + }, + "removeEmbeddedFiles": { + "label": "Remove Embedded Files", + "desc": "ĐŖĐ´Đ°ĐģĐ¸Ņ‚ŅŒ ĐģŅŽĐąŅ‹Đĩ Ņ„Đ°ĐšĐģŅ‹, Đ˛ŅŅ‚Ņ€ĐžĐĩĐŊĐŊŅ‹Đĩ в PDF" + }, + "removeXMPMetadata": { + "label": "Remove XMP Metadata", + "desc": "ĐŖĐ´Đ°ĐģĐ¸Ņ‚ŅŒ XMP-ĐŧĐĩŅ‚Đ°Đ´Đ°ĐŊĐŊŅ‹Đĩ иС PDF" + }, + "removeMetadata": { + "label": "Remove Document Metadata", + "desc": "ĐŖĐ´Đ°ĐģĐ¸Ņ‚ŅŒ иĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸ŅŽ Đž Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đĩ (ĐŊаСваĐŊиĐĩ, Đ°Đ˛Ņ‚ĐžŅ€ и Ņ‚. Đ´.)" + }, + "removeLinks": { + "label": "Remove Links", + "desc": "ĐŖĐ´Đ°ĐģĐ¸Ņ‚ŅŒ вĐŊĐĩ҈ĐŊиĐĩ ҁҁҋĐģĐēи и Đ´ĐĩĐšŅŅ‚Đ˛Đ¸Ņ СаĐŋ҃ҁĐēа иС PDF" + }, + "removeFonts": { + "label": "Remove Fonts", + "desc": "ĐŖĐ´Đ°ĐģĐ¸Ņ‚ŅŒ Đ˛ŅŅ‚Ņ€ĐžĐĩĐŊĐŊŅ‹Đĩ ŅˆŅ€Đ¸Ņ„Ņ‚Ņ‹ иС PDF" + } } }, "addPassword": { @@ -3377,9 +4501,14 @@ "remaining": "ĐžŅŅ‚Đ°ĐģĐžŅŅŒ", "used": "Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°ĐŊĐž", "available": "Đ´ĐžŅŅ‚ŅƒĐŋĐŊĐž", - "cancel": "ĐžŅ‚ĐŧĐĩĐŊа" + "cancel": "ĐžŅ‚ĐŧĐĩĐŊа", + "preview": "Preview" }, "config": { + "overview": { + "title": "Application Configuration", + "description": "Current application settings and configuration details." + }, "account": { "overview": { "title": "ĐĐ°ŅŅ‚Ņ€ĐžĐšĐēи аĐēĐēĐ°ŅƒĐŊŅ‚Đ°", @@ -3435,8 +4564,570 @@ "submit": "Đ”ĐžĐąĐ°Đ˛Đ¸Ņ‚ŅŒ вĐģĐžĐļĐĩĐŊĐ¸Ņ", "results": { "title": "Đ ĐĩĐˇŅƒĐģŅŒŅ‚Đ°Ņ‚Ņ‹ вĐģĐžĐļĐĩĐŊиК" + }, + "error": { + "failed": "Add attachments operation failed" } }, "termsAndConditions": "ĐŖŅĐģĐžĐ˛Đ¸Ņ и ĐŋĐžĐģĐžĐļĐĩĐŊĐ¸Ņ", - "logOut": "Đ’Ņ‹ĐšŅ‚Đ¸" -} \ No newline at end of file + "logOut": "Đ’Ņ‹ĐšŅ‚Đ¸", + "addAttachments": { + "error": { + "failed": "An error occurred while adding attachments to the PDF." + } + }, + "autoRename": { + "description": "This tool will automatically rename PDF files based on their content. It analyzes the document to find the most suitable title from the text." + }, + "customPosition": "Custom Position", + "details": "Details", + "downloadUnavailable": "Download unavailable for this item", + "invalidUndoData": "Cannot undo: invalid operation data", + "margin": { + "large": "Large", + "medium": "Medium", + "small": "Small", + "xLarge": "Extra Large" + }, + "noFilesToUndo": "Cannot undo: no files were processed in the last operation", + "noOperationToUndo": "No operation to undo", + "noValidFiles": "No valid files to process", + "operationCancelled": "Operation cancelled", + "pageEdit": { + "deselectAll": "Select None", + "selectAll": "Select All" + }, + "quickPosition": "Quick Position", + "reorganizePages": { + "error": { + "failed": "Failed to reorganize pages" + }, + "results": { + "title": "Pages Reorganized" + }, + "settings": { + "title": "Settings" + }, + "submit": "Reorganize Pages" + }, + "replace-color": { + "options": { + "fill": "Fill colour", + "gradient": "Gradient" + }, + "previewOverlayOpacity": "Preview overlay opacity", + "previewOverlayTransparency": "Preview overlay transparency", + "previewOverlayVisibility": "Show preview overlay", + "selectText": { + "1": "Replace or invert colour options", + "2": "Default (preset high contrast colours)", + "3": "Custom (choose your own colours)", + "4": "Full invert (invert all colours)", + "5": "High contrast color options", + "6": "White text on black background", + "7": "Black text on white background", + "8": "Yellow text on black background", + "9": "Green text on black background", + "10": "Choose text Color", + "11": "Choose background Color", + "12": "Choose start colour", + "13": "Choose end colour" + }, + "submit": "Replace", + "title": "Replace-Invert-Color" + }, + "size": "Size", + "submit": "Submit", + "success": "Success", + "tools": { + "noSearchResults": "No tools found", + "noTools": "No tools available" + }, + "undoDataMismatch": "Cannot undo: operation data is corrupted", + "undoFailed": "Failed to undo operation", + "undoQuotaError": "Cannot undo: insufficient storage space", + "undoStorageError": "Undo completed but some files could not be saved to storage", + "undoSuccess": "Operation undone successfully", + "unsupported": "Unsupported", + "onboarding": { + "welcomeModal": { + "title": "Welcome to Stirling PDF!", + "description": "Would you like to take a quick 1-minute tour to learn the key features and how to get started?", + "helpHint": "You can always access this tour later from the Help button in the bottom left.", + "startTour": "Start Tour", + "maybeLater": "Maybe Later", + "dontShowAgain": "Don't Show Again" + }, + "allTools": "This is the All Tools panel, where you can browse and select from all available PDF tools.", + "selectCropTool": "Let's select the Crop tool to demonstrate how to use one of the tools.", + "toolInterface": "This is the Crop tool interface. As you can see, there's not much there because we haven't added any PDF files to work with yet.", + "filesButton": "The Files button on the Quick Access bar allows you to upload PDFs to use the tools on.", + "fileSources": "You can upload new files or access recent files from here. For the tour, we'll just use a sample file.", + "workbench": "This is the Workbench - the main area where you view and edit your PDFs.", + "viewSwitcher": "Use these controls to select how you want to view your PDFs.", + "viewer": "The Viewer lets you read and annotate your PDFs.", + "pageEditor": "The Page Editor allows you to do various operations on the pages within your PDFs, such as reordering, rotating and deleting.", + "activeFiles": "The Active Files view shows all of the PDFs you have loaded into the tool, and allows you to select which ones to process.", + "fileCheckbox": "Clicking one of the files selects it for processing. You can select multiple files for batch operations.", + "selectControls": "The Right Rail contains buttons to quickly select/deselect all of your active PDFs, along with buttons to change the app's theme or language.", + "cropSettings": "Now that we've selected the file we want crop, we can configure the Crop tool to choose the area that we want to crop the PDF to.", + "runButton": "Once the tool has been configured, this button allows you to run the tool on all the selected PDFs.", + "results": "After the tool has finished running, the Review step will show a preview of the results in this panel, and allow you to undo the operation or download the file. ", + "fileReplacement": "The modified file will replace the original file in the Workbench automatically, allowing you to easily run it through more tools.", + "pinButton": "You can use the Pin button if you'd rather your files stay active after running tools on them.", + "wrapUp": "You're all set! You've learnt about the main areas of the app and how to use them. Click the Help button whenever you like to see this tour again.", + "previous": "Previous", + "next": "Next", + "finish": "Finish", + "startTour": "Start Tour", + "startTourDescription": "Take a guided tour of Stirling PDF's key features" + }, + "workspace": { + "title": "Workspace", + "people": { + "title": "People", + "description": "Manage workspace members and their permissions", + "loading": "Loading people...", + "searchMembers": "Search members...", + "addMembers": "Add Members", + "inviteMembers": { + "label": "Invite Members", + "subtitle": "Type or paste in emails below, separated by commas. Your workspace will be billed by members." + }, + "user": "User", + "role": "Role", + "team": "Team", + "status": "Status", + "actions": "Actions", + "noMembersFound": "No members found", + "active": "Active", + "disabled": "Disabled", + "activeSession": "Active session", + "member": "Member", + "admin": "Admin", + "roleDescriptions": { + "admin": "Can manage settings and invite members, with full administrative access.", + "member": "Can view and edit shared files, but cannot manage workspace settings or members." + }, + "editRole": "Edit Role", + "enable": "Enable", + "disable": "Disable", + "deleteUser": "Delete User", + "deleteUserSuccess": "User deleted successfully", + "deleteUserError": "Failed to delete user", + "confirmDelete": "Are you sure you want to delete this user? This action cannot be undone.", + "addMember": { + "title": "Add Member", + "username": "Username (Email)", + "usernamePlaceholder": "user@example.com", + "password": "Password", + "passwordPlaceholder": "Enter password", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "forcePasswordChange": "Force password change on first login", + "cancel": "Cancel", + "submit": "Add Member", + "usernameRequired": "Username and password are required", + "passwordTooShort": "Password must be at least 6 characters", + "success": "User created successfully", + "error": "Failed to create user" + }, + "editMember": { + "title": "Edit Member", + "editing": "Editing:", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "cancel": "Cancel", + "submit": "Update Member", + "success": "User updated successfully", + "error": "Failed to update user" + }, + "toggleEnabled": { + "success": "User status updated successfully", + "error": "Failed to update user status" + }, + "delete": { + "success": "User deleted successfully", + "error": "Failed to delete user" + }, + "emailInvite": { + "tab": "Email Invite", + "description": "Type or paste in emails below, separated by commas. Users will receive login credentials via email.", + "emails": "Email Addresses", + "emailsPlaceholder": "user1@example.com, user2@example.com", + "emailsRequired": "At least one email address is required", + "submit": "Send Invites", + "success": "user(s) invited successfully", + "partialSuccess": "Some invites failed", + "allFailed": "Failed to invite users", + "error": "Failed to send invites" + }, + "directInvite": { + "tab": "Direct Create" + }, + "inviteLinkTab": { + "tab": "Invite Link" + }, + "inviteLink": { + "description": "Generate a secure link that allows the user to set their own password", + "email": "Email Address", + "emailPlaceholder": "user@example.com (optional)", + "emailDescription": "Optional - leave blank for a general invite link that can be used by anyone", + "emailRequired": "Email address is required", + "emailOptional": "Optional - leave blank for a general invite link", + "emailRequiredForSend": "Email address is required to send email notification", + "expiryHours": "Expiry Hours", + "expiryDescription": "How many hours until the link expires", + "sendEmail": "Send invite link via email", + "sendEmailDescription": "If enabled, the invite link will be sent to the specified email address", + "smtpRequired": "SMTP not configured", + "generate": "Generate Link", + "generated": "Invite Link Generated", + "copied": "Link copied to clipboard", + "success": "Invite link generated successfully", + "successWithEmail": "Invite link generated and sent via email", + "emailFailed": "Invite link generated, but email failed", + "emailFailedDetails": "Error: {0}. Please share the invite link manually.", + "error": "Failed to generate invite link", + "submit": "Generate Invite Link" + }, + "inviteMode": { + "username": "Username", + "email": "Email", + "link": "Link", + "emailDisabled": "Email invites require SMTP configuration and mail.enableInvites=true in settings" + }, + "license": { + "users": "users", + "availableSlots": "Available Slots", + "grandfathered": "Grandfathered", + "grandfatheredShort": "{{count}} grandfathered", + "fromLicense": "from license", + "slotsAvailable": "{{count}} user slot(s) available", + "noSlotsAvailable": "No slots available", + "currentUsage": "Currently using {{current}} of {{max}} user licences" + } + }, + "teams": { + "title": "Teams", + "description": "Manage teams and organize workspace members", + "loading": "Loading teams...", + "loadingDetails": "Loading team details...", + "createNewTeam": "Create New Team", + "teamName": "Team Name", + "totalMembers": "Total Members", + "actions": "Actions", + "noTeamsFound": "No teams found", + "noMembers": "No members in this team", + "system": "System", + "addMember": "Add Member", + "viewTeam": "View Team", + "removeMember": "Remove from team", + "cannotRemoveFromSystemTeam": "Cannot remove from system team", + "renameTeamLabel": "Rename Team", + "deleteTeamLabel": "Delete Team", + "cannotDeleteInternal": "Cannot delete the Internal team", + "confirmDelete": "Are you sure you want to delete this team? This team must be empty to delete.", + "confirmRemove": "Remove user from this team?", + "cannotRenameInternal": "Cannot rename the Internal team", + "cannotAddToInternal": "Cannot add members to the Internal team", + "teamNotFound": "Team not found", + "backToTeams": "Back to Teams", + "memberCount": "{{count}} members", + "removeMemberSuccess": "User removed from team", + "removeMemberError": "Failed to remove user from team", + "createTeam": { + "title": "Create New Team", + "teamName": "Team Name", + "teamNamePlaceholder": "Enter team name", + "cancel": "Cancel", + "submit": "Create Team", + "nameRequired": "Team name is required", + "success": "Team created successfully", + "error": "Failed to create team" + }, + "renameTeam": { + "title": "Rename Team", + "renaming": "Renaming:", + "newTeamName": "New Team Name", + "newTeamNamePlaceholder": "Enter new team name", + "cancel": "Cancel", + "submit": "Rename Team", + "nameRequired": "Team name is required", + "success": "Team renamed successfully", + "error": "Failed to rename team" + }, + "deleteTeam": { + "success": "Team deleted successfully", + "error": "Failed to delete team. Make sure the team is empty.", + "teamMustBeEmpty": "Team must be empty before deletion" + }, + "addMemberToTeam": { + "title": "Add Member to Team", + "addingTo": "Adding to", + "selectUser": "Select User", + "selectUserPlaceholder": "Choose a user", + "selectUserRequired": "Please select a user", + "currentlyIn": "currently in", + "willBeMoved": "Note: This user will be moved from their current team to this team.", + "cancel": "Cancel", + "submit": "Add Member", + "userRequired": "Please select a user", + "success": "Member added to team successfully", + "error": "Failed to add member to team" + }, + "changeTeam": { + "label": "Change Team", + "title": "Change Team", + "changing": "Moving", + "selectTeam": "Select Team", + "selectTeamPlaceholder": "Choose a team", + "selectTeamRequired": "Please select a team", + "success": "Team changed successfully", + "error": "Failed to change team", + "submit": "Change Team" + } + } + }, + "plan": { + "currency": "Currency", + "popular": "Popular", + "current": "Current Plan", + "upgrade": "Upgrade", + "contact": "Contact Us", + "customPricing": "Custom", + "showComparison": "Compare All Features", + "hideComparison": "Hide Feature Comparison", + "featureComparison": "Feature Comparison", + "activePlan": { + "title": "Active Plan", + "subtitle": "Your current subscription details" + }, + "availablePlans": { + "title": "Available Plans", + "subtitle": "Choose the plan that fits your needs" + }, + "static": { + "title": "Billing Information", + "message": "Online billing is not currently configured. To upgrade your plan or manage subscriptions, please contact us directly.", + "contactSales": "Contact Sales", + "contactToUpgrade": "Contact us to upgrade or customize your plan", + "maxUsers": "Max Users", + "upTo": "Up to" + }, + "period": { + "month": "month" + }, + "free": { + "name": "Free", + "highlight1": "Limited Tool Usage Per week", + "highlight2": "Access to all tools", + "highlight3": "Community support" + }, + "pro": { + "name": "Pro", + "highlight1": "Unlimited Tool Usage", + "highlight2": "Advanced PDF tools", + "highlight3": "No watermarks" + }, + "enterprise": { + "name": "Enterprise", + "highlight1": "Custom pricing", + "highlight2": "Dedicated support", + "highlight3": "Latest features" + }, + "feature": { + "title": "Feature", + "pdfTools": "Basic PDF Tools", + "fileSize": "File Size Limit", + "automation": "Automate tool workflows", + "api": "API Access", + "priority": "Priority Support", + "customPricing": "Custom Pricing" + } + }, + "subscription": { + "status": { + "active": "Active", + "pastDue": "Past Due", + "canceled": "Canceled", + "incomplete": "Incomplete", + "trialing": "Trial", + "none": "No Subscription" + }, + "renewsOn": "Renews on {{date}}", + "cancelsOn": "Cancels on {{date}}" + }, + "billing": { + "manageBilling": "Manage Billing", + "portal": { + "error": "Failed to open billing portal" + } + }, + "payment": { + "preparing": "Preparing your checkout...", + "upgradeTitle": "Upgrade to {{planName}}", + "success": "Payment Successful!", + "successMessage": "Your subscription has been activated successfully. You will receive a confirmation email shortly.", + "autoClose": "This window will close automatically...", + "error": "Payment Error" + }, + "firstLogin": { + "title": "First Time Login", + "welcomeTitle": "Welcome!", + "welcomeMessage": "For security reasons, you must change your password on your first login.", + "loggedInAs": "Logged in as", + "error": "Error", + "currentPassword": "Current Password", + "enterCurrentPassword": "Enter your current password", + "newPassword": "New Password", + "enterNewPassword": "Enter new password (min 8 characters)", + "confirmPassword": "Confirm New Password", + "reEnterNewPassword": "Re-enter new password", + "changePassword": "Change Password", + "allFieldsRequired": "All fields are required", + "passwordsDoNotMatch": "New passwords do not match", + "passwordTooShort": "Password must be at least 8 characters", + "passwordMustBeDifferent": "New password must be different from current password", + "passwordChangedSuccess": "Password changed successfully! Please log in again.", + "passwordChangeFailed": "Failed to change password. Please check your current password." + }, + "invite": { + "welcome": "Welcome to Stirling PDF", + "invalidToken": "Invalid invitation link", + "validationError": "Failed to validate invitation link", + "passwordRequired": "Password is required", + "passwordTooShort": "Password must be at least 6 characters", + "passwordMismatch": "Passwords do not match", + "acceptError": "Failed to create account", + "validating": "Validating invitation...", + "invalidInvitation": "Invalid Invitation", + "goToLogin": "Go to Login", + "welcomeTitle": "You've been invited!", + "welcomeSubtitle": "Complete your account setup to get started", + "accountFor": "Creating account for", + "linkExpires": "Link expires", + "email": "Email address", + "emailPlaceholder": "Enter your email address", + "emailRequired": "Email address is required", + "invalidEmail": "Invalid email address", + "choosePassword": "Choose a password", + "passwordPlaceholder": "Enter your password", + "confirmPassword": "Confirm password", + "confirmPasswordPlaceholder": "Re-enter your password", + "createAccount": "Create Account", + "creating": "Creating Account...", + "alreadyHaveAccount": "Already have an account?", + "signIn": "Sign in" + }, + "audit": { + "error": { + "title": "Error loading audit system" + }, + "notAvailable": "Audit system not available", + "notAvailableMessage": "The audit system is not configured or not available.", + "disabled": "Audit logging is disabled", + "disabledMessage": "Enable audit logging in your application configuration to track system events.", + "systemStatus": { + "title": "System Status", + "status": "Audit Logging", + "enabled": "Enabled", + "disabled": "Disabled", + "level": "Audit Level", + "retention": "Retention Period", + "days": "days", + "totalEvents": "Total Events" + }, + "tabs": { + "dashboard": "Dashboard", + "events": "Audit Events", + "export": "Export" + }, + "charts": { + "title": "Audit Dashboard", + "error": "Error loading charts", + "day": "Day", + "week": "Week", + "month": "Month", + "byType": "Events by Type", + "byUser": "Events by User", + "overTime": "Events Over Time" + }, + "events": { + "title": "Audit Events", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "error": "Error loading events", + "noEvents": "No events found", + "timestamp": "Timestamp", + "type": "Type", + "user": "User", + "ipAddress": "IP Address", + "actions": "Actions", + "viewDetails": "View Details", + "eventDetails": "Event Details", + "details": "Details" + }, + "export": { + "title": "Export Audit Data", + "description": "Export audit events to CSV or JSON format. Use filters to limit the exported data.", + "format": "Export Format", + "filters": "Filters (Optional)", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "exportButton": "Export Data", + "error": "Failed to export data" + } + }, + "usage": { + "noData": "No data available", + "error": "Error loading usage statistics", + "noDataMessage": "No usage statistics are currently available.", + "controls": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All", + "refresh": "Refresh", + "dataTypeLabel": "Data Type:", + "dataType": { + "all": "All", + "api": "API", + "ui": "UI" + } + }, + "showing": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All" + }, + "stats": { + "totalEndpoints": "Total Endpoints", + "totalVisits": "Total Visits", + "showing": "Showing", + "selectedVisits": "Selected Visits" + }, + "chart": { + "title": "Endpoint Usage Chart" + }, + "table": { + "title": "Detailed Statistics", + "endpoint": "Endpoint", + "visits": "Visits", + "percentage": "Percentage", + "noData": "No data available" + } + }, + "backendHealth": { + "checking": "Checking backend status...", + "online": "Backend Online", + "offline": "Backend Offline" + } +} diff --git a/frontend/public/locales/sk-SK/translation.json b/frontend/public/locales/sk-SK/translation.json index d8a117cd8..318c2b71b 100644 --- a/frontend/public/locales/sk-SK/translation.json +++ b/frontend/public/locales/sk-SK/translation.json @@ -1,4 +1,40 @@ { + "toolPanel": { + "modePrompt": { + "title": "Choose how you browse tools", + "description": "Preview both layouts and decide how you want to explore Stirling PDF tools.", + "sidebarTitle": "Sidebar mode", + "sidebarDescription": "Keep tools alongside your workspace for quick switching.", + "recommended": "Recommended", + "chooseSidebar": "Use sidebar mode", + "fullscreenTitle": "Fullscreen mode - (legacy)", + "fullscreenDescription": "Browse every tool in a catalogue that covers the workspace until you pick one.", + "chooseFullscreen": "Use fullscreen mode", + "dismiss": "Maybe later" + }, + "fullscreen": { + "showDetails": "Show Details", + "comingSoon": "Coming soon:", + "favorite": "Add to favourites", + "favorites": "Favourites", + "heading": "All tools (fullscreen view)", + "noResults": "Try adjusting your search or toggle descriptions to find what you need.", + "recommended": "Recommended", + "unfavorite": "Remove from favourites" + }, + "placeholder": "Choose a tool to get started", + "toggle": { + "fullscreen": "Switch to fullscreen mode", + "sidebar": "Switch to sidebar mode" + } + }, + "unsavedChanges": "You have unsaved changes to your PDF.", + "areYouSure": "Are you sure you want to leave?", + "unsavedChangesTitle": "Unsaved Changes", + "keepWorking": "Keep Working", + "discardChanges": "Discard & Leave", + "applyAndContinue": "Save & Leave", + "exportAndContinue": "Export & Continue", "language": { "direction": "ltr" }, @@ -18,8 +54,26 @@ "customTextDesc": "VlastnÃŊ text", "numberPagesDesc": "KtorÊ strÃĄnky číslovaÅĨ, predvolenÊ 'vÅĄetky', tieÅž akceptuje 1-5 alebo 2,5,9 atď.", "customNumberDesc": "PredvolenÊ {n}, tieÅž akceptuje 'Strana {n} z {total}', 'Text-{n}', '{filename}-{n}", - "submit": "PridaÅĨ čísla strÃĄnok" + "submit": "PridaÅĨ čísla strÃĄnok", + "configuration": "Configuration", + "customize": "Customize Appearance", + "pagesAndStarting": "Pages & Starting Number", + "positionAndPages": "Position & Pages", + "error": { + "failed": "Add page numbers operation failed" + }, + "results": { + "title": "Page Number Results" + }, + "preview": "Position Selection", + "previewDisclaimer": "Preview is approximate. Final output may vary due to PDF font metrics." }, + "pageSelectionPrompt": "VlastnÃŊ vÃŊber strÃĄnok (Zadajte zoznam čísel strÃĄnok oddelenÃŊch čiarkou 1,5,6 alebo funkcie ako 2n+1):", + "startingNumberTooltip": "The first number to display. Subsequent pages will increment from this number.", + "marginTooltip": "Distance between the page number and the edge of the page.", + "fontSizeTooltip": "Size of the page number text in points. Larger numbers create bigger text.", + "fontTypeTooltip": "Font family for the page numbers. Choose based on your document style.", + "customTextTooltip": "Optional custom format for page numbers. Use {n} as placeholder for the number. Example: \"Page {n}\" will show \"Page 1\", \"Page 2\", etc.", "pdfPrompt": "Vyberte PDF sÃēbor(y)", "multiPdfPrompt": "Vyberte PDF sÃēbory (2+)", "multiPdfDropPrompt": "Vyberte (alebo pretiahnite) vÅĄetky poÅžadovanÊ PDF sÃēbory", @@ -30,15 +84,41 @@ "uploadLimitExceededPlural": "are too large. Maximum allowed size is", "processTimeWarning": "Varovanie: Tento proces môŞe trvaÅĨ aÅž minÃētu v zÃĄvislosti od veÄžkosti sÃēboru", "pageOrderPrompt": "VlastnÊ poradie strÃĄnok (Zadajte zoznam čísel strÃĄnok oddelenÃŊch čiarkou alebo funkcie ako 2n+1):", - "pageSelectionPrompt": "VlastnÃŊ vÃŊber strÃĄnok (Zadajte zoznam čísel strÃĄnok oddelenÃŊch čiarkou 1,5,6 alebo funkcie ako 2n+1):", "goToPage": "Choď", "true": "Áno", "false": "Nie", "unknown": "NeznÃĄme", + "app": { + "description": "The Free Adobe Acrobat alternative (10M+ Downloads)" + }, "save": "UloÅžiÅĨ", "saveToBrowser": "UloÅžiÅĨ do prehliadača", + "download": "StiahnuÅĨ", + "pin": "Pin File (keep active after tool run)", + "unpin": "Unpin File (replace after tool run)", + "undoOperationTooltip": "Click to undo the last operation and restore the original files", + "undo": "Undo", + "moreOptions": "More Options", + "editYourNewFiles": "Edit your new file(s)", "close": "ZatvoriÅĨ", + "openInViewer": "Open in Viewer", + "confirmClose": "Confirm Close", + "confirmCloseMessage": "Are you sure you want to close this file?", + "confirmCloseCancel": "Cancel", + "confirmCloseConfirm": "Close File", + "fileSelected": "Selected: {{filename}}", + "chooseFile": "Choose File", "filesSelected": "vybranÊ sÃēbory", + "files": { + "title": "Files", + "upload": "Upload", + "uploadFiles": "Upload Files", + "addFiles": "Add files", + "selectFromWorkbench": "Select files from the workbench or ", + "selectMultipleFromWorkbench": "Select at least {{count}} files from the workbench or ", + "created": "Created", + "size": "File Size" + }, "noFavourites": "ÅŊiadne obÄžÃēbenÊ poloÅžky", "downloadComplete": "Stiahnutie dokončenÊ", "bored": "Nudíte sa pri čakaní?", @@ -56,7 +136,10 @@ }, "error": { "pdfPassword": "PDF dokument je chrÃĄnenÃŊ heslom a buď heslo nebolo zadanÊ, alebo bolo nesprÃĄvne", + "encryptedPdfMustRemovePassword": "This PDF is encrypted or password-protected. Please unlock it before converting to PDF/A.", + "incorrectPasswordProvided": "The PDF password is incorrect or not provided.", "_value": "Chyba", + "dismissAllErrors": "Dismiss All Errors", "sorry": "Ospravedlňujeme sa za problÊm!", "needHelp": "Potrebujete pomoc / NaÅĄli ste problÊm?", "contactTip": "Ak mÃĄte stÃĄle problÊmy, nevÃĄhajte nÃĄs kontaktovaÅĨ pre pomoc. MôŞete podaÅĨ tiket na naÅĄej strÃĄnke GitHub alebo nÃĄs kontaktovaÅĨ cez Discord:", @@ -71,6 +154,10 @@ "githubSubmit": "GitHub - Podajte tiket", "discordSubmit": "Discord - Podajte príspevok na podporu" }, + "warning": { + "tooltipTitle": "Warning" + }, + "edit": "Edit", "delete": "VymazaÅĨ", "username": "PouŞívateÄžskÊ meno", "password": "Heslo", @@ -82,6 +169,7 @@ "green": "ZelenÃĄ", "blue": "ModrÃĄ", "custom": "VlastnÊ...", + "comingSoon": "Coming soon", "WorkInProgess": "PrÃĄca prebieha, nemusí fungovaÅĨ alebo môŞe byÅĨ chybovÃĄ, prosím nahlÃĄste akÊkoÄžvek problÊmy!", "poweredBy": "PoskytovanÊ", "yes": "Áno", @@ -115,12 +203,14 @@ "page": "Page", "pages": "Pages", "loading": "Loading...", + "review": "Review", "addToDoc": "Add to Document", "reset": "Reset", "apply": "Apply", "noFileSelected": "No file selected. Please upload one.", "legal": { "privacy": "Privacy Policy", + "iAgreeToThe": "I agree to all of the", "terms": "Terms and Conditions", "accessibility": "Accessibility", "cookie": "Cookie Policy", @@ -160,6 +250,7 @@ "title": "Do you want make Stirling PDF better?", "paragraph1": "Stirling PDF has opt in analytics to help us improve the product. We do not track any personal information or file contents.", "paragraph2": "Please consider enabling analytics to help Stirling-PDF grow and to allow us to understand our users better.", + "learnMore": "Learn more", "enable": "Enable analytics", "disable": "Disable analytics", "settings": "You can change the settings for analytics in the config/settings.yml file" @@ -203,6 +294,54 @@ "cacheInputs": { "name": "UloÅžiÅĨ vstupy formulÃĄra", "help": "UmoŞňuje uloÅžiÅĨ predtÃŊm pouÅžitÊ vstupy na budÃēce pouÅžitie" + }, + "general": { + "title": "General", + "description": "Configure general application preferences.", + "account": "Account", + "accountDescription": "Manage your account settings", + "user": "User", + "signedInAs": "Signed in as", + "logout": "Log out", + "enableFeatures": { + "title": "For System Administrators", + "intro": "Enable user authentication, team management, and workspace features for your organization.", + "action": "Configure", + "and": "and", + "benefit": "Enables user roles, team collaboration, admin controls, and enterprise features.", + "learnMore": "Learn more in documentation", + "dismiss": "Dismiss" + }, + "autoUnzip": "Auto-unzip API responses", + "autoUnzipDescription": "Automatically extract files from ZIP responses", + "autoUnzipTooltip": "Automatically extract ZIP files returned from API operations. Disable to keep ZIP files intact. This does not affect automation workflows.", + "autoUnzipFileLimit": "Auto-unzip file limit", + "autoUnzipFileLimitDescription": "Maximum number of files to extract from ZIP", + "autoUnzipFileLimitTooltip": "Only unzip if the ZIP contains this many files or fewer. Set higher to extract larger ZIPs.", + "defaultToolPickerMode": "Default tool picker mode", + "defaultToolPickerModeDescription": "Choose whether the tool picker opens in fullscreen or sidebar by default", + "mode": { + "fullscreen": "Fullscreen", + "sidebar": "Sidebar" + } + }, + "hotkeys": { + "title": "Keyboard Shortcuts", + "description": "Hover a tool to see its shortcut or customise it below. Click \"Change shortcut\" and press a new key combination. Press Esc to cancel.", + "errorModifier": { + "mac": "Include ⌘ (Command), âŒĨ (Option), or another modifier in your shortcut.", + "windows": "Include Ctrl, Alt, or another modifier in your shortcut." + }, + "errorConflict": "Shortcut already used by {{tool}}.", + "none": "Not assigned", + "customBadge": "Custom", + "defaultLabel": "Default: {{shortcut}}", + "capturing": "Press keysâ€Ļ (Esc to cancel)", + "change": "Change shortcut", + "reset": "Reset", + "shortcut": "Shortcut", + "noShortcut": "No shortcut set", + "searchPlaceholder": "Search tools..." } }, "changeCreds": { @@ -274,8 +413,10 @@ "top20": "Top 20", "all": "All", "refresh": "Refresh", - "includeHomepage": "Include Homepage ('/')", - "includeLoginPage": "Include Login Page ('/login')", + "dataTypeLabel": "Data Type:", + "dataTypeAll": "All", + "dataTypeApi": "API", + "dataTypeUi": "UI", "totalEndpoints": "Total Endpoints", "totalVisits": "Total Visits", "showing": "Showing", @@ -290,7 +431,9 @@ "top": "Top", "numberOfVisits": "Number of Visits", "visitsTooltip": "Visits: {0} ({1}% of total)", - "retry": "Retry" + "retry": "Retry", + "includeHomepage": "Include Homepage ('/')", + "includeLoginPage": "Include Login Page ('/login')" }, "database": { "title": "Database Import/Export", @@ -331,22 +474,310 @@ "alphabetical": "Alphabetical", "globalPopularity": "Global Popularity", "sortBy": "Sort by:", + "mobile": { + "brandAlt": "Stirling PDF logo", + "openFiles": "Open files", + "swipeHint": "Swipe left or right to switch views", + "tools": "Tools", + "toolsSlide": "Tool selection panel", + "viewSwitcher": "Switch workspace view", + "workbenchSlide": "Workspace panel", + "workspace": "Workspace" + }, "multiTool": { + "tags": "multiple,tools", "title": "PDF Multi NÃĄstroj", "desc": "ZlÃēčiÅĨ, otočiÅĨ, preusporiadaÅĨ a odstrÃĄniÅĨ strÃĄnky" }, "merge": { + "tags": "combine,join,unite", "title": "ZlÃēčiÅĨ", "desc": "Jednoducho zlÃēčte viacero PDF sÃēborov do jednÊho." }, "split": { + "tags": "divide,separate,break", "title": "RozdeliÅĨ", "desc": "RozdeÄžte PDF sÃēbory na viacero dokumentov" }, "rotate": { + "tags": "turn,flip,orient", "title": "OtočiÅĨ", "desc": "Jednoducho otÃĄÄajte svoje PDF sÃēbory." }, + "convert": { + "tags": "transform,change", + "title": "KonvertovaÅĨ", + "desc": "Convert files between different formats" + }, + "pdfOrganiser": { + "tags": "organize,rearrange,reorder", + "title": "OrganizovaÅĨ", + "desc": "OdstrÃĄÅˆte/preusporiadajte strÃĄnky v ÄžubovoÄžnom poradí" + }, + "addImage": { + "tags": "insert,embed,place", + "title": "PridaÅĨ obrÃĄzok", + "desc": "PridaÅĨ obrÃĄzok na zadanÊ miesto v PDF" + }, + "addAttachments": { + "tags": "embed,attach,include", + "title": "Add Attachments", + "desc": "Add or remove embedded files (attachments) to/from a PDF" + }, + "watermark": { + "tags": "stamp,mark,overlay", + "title": "PridaÅĨ vodotlač", + "desc": "PridaÅĨ vlastnÃē vodotlač do vÃĄÅĄho PDF dokumentu." + }, + "removePassword": { + "tags": "unlock", + "title": "OdstrÃĄniÅĨ heslo", + "desc": "OdstrÃĄniÅĨ ochranu heslom z vÃĄÅĄho PDF dokumentu." + }, + "compress": { + "tags": "shrink,reduce,optimize", + "title": "KomprimovaÅĨ", + "desc": "Komprimujte PDF na zmenÅĄenie jeho veÄžkosti." + }, + "unlockPDFForms": { + "tags": "unlock,enable,edit", + "title": "Unlock PDF Forms", + "desc": "Remove read-only property of form fields in a PDF document." + }, + "changeMetadata": { + "tags": "edit,modify,update", + "title": "ZmeniÅĨ metadÃĄta", + "desc": "Zmena/OdstrÃĄnenie/Pridanie metadÃĄt z PDF dokumentu" + }, + "ocr": { + "tags": "extract,scan", + "title": "OCR / Čistenie skenov", + "desc": "Čistenie skenov a rozpoznanie textu z obrÃĄzkov v PDF a opätovnÊ pridanie ako text." + }, + "extractImages": { + "tags": "pull,save,export", + "title": "ExtrahovaÅĨ obrÃĄzky", + "desc": "Extrahuje vÅĄetky obrÃĄzky z PDF a uloŞí ich do zipu" + }, + "scannerImageSplit": { + "tags": "detect,split,photos", + "title": "Detect & Split Scanned Photos", + "desc": "Detect and split scanned photos into separate pages" + }, + "sign": { + "tags": "signature,autograph", + "title": "PodpísaÅĨ", + "desc": "PridÃĄva podpis do PDF kreslením, textom alebo obrÃĄzkom" + }, + "flatten": { + "tags": "simplify,remove,interactive", + "title": "ZploÅĄtiÅĨ", + "desc": "OdstrÃĄniÅĨ vÅĄetky interaktívne prvky a formulÃĄre z PDF" + }, + "certSign": { + "tags": "authenticate,PEM,P12,official,encrypt,sign,certificate,PKCS12,JKS,server,manual,auto", + "title": "PodpísaÅĨ s certifikÃĄtom", + "desc": "PodpísaÅĨ PDF s certifikÃĄtom/kÄžÃēčom (PEM/P12)" + }, + "repair": { + "tags": "fix,restore", + "title": "OpraviÅĨ", + "desc": "SkÃēÅĄa opraviÅĨ poÅĄkodenÊ/rozbitÊ PDF" + }, + "removeBlanks": { + "tags": "delete,clean,empty", + "title": "OdstrÃĄniÅĨ prÃĄzdne strÃĄnky", + "desc": "Detekuje a odstraňuje prÃĄzdne strÃĄnky z dokumentu" + }, + "removeAnnotations": { + "tags": "delete,clean,strip", + "title": "OdstrÃĄniÅĨ anotÃĄcie", + "desc": "Odstraňuje vÅĄetky komentÃĄre/anotÃĄcie z PDF" + }, + "compare": { + "tags": "difference", + "title": "PorovnaÅĨ", + "desc": "PorovnÃĄva a zobrazuje rozdiely medzi 2 PDF dokumentmi" + }, + "removeCertSign": { + "tags": "remove,delete,unlock", + "title": "Remove Certificate Sign", + "desc": "Remove certificate signature from PDF" + }, + "pageLayout": { + "tags": "layout,arrange,combine", + "title": "ViacstranovÊ usporiadanie", + "desc": "ZlÃēčte viacero strÃĄnok PDF dokumentu do jednej strÃĄnky" + }, + "bookletImposition": { + "tags": "booklet,print,binding", + "title": "Booklet Imposition", + "desc": "Create booklets with proper page ordering and multi-page layout for printing and binding" + }, + "scalePages": { + "tags": "resize,adjust,scale", + "title": "PrispôsobiÅĨ veÄžkosÅĨ/ÅĄkÃĄlovanie strÃĄnok", + "desc": "ZmeniÅĨ veÄžkosÅĨ/ÅĄkÃĄlovanie strÃĄnky a/alebo jej obsahu." + }, + "addPageNumbers": { + "tags": "number,pagination,count", + "title": "PridaÅĨ čísla strÃĄnok", + "desc": "PridaÅĨ čísla strÃĄnok po celom dokumente na určenom mieste" + }, + "autoRename": { + "tags": "auto-detect,header-based,organize,relabel", + "title": "Auto Rename PDF File", + "desc": "Auto renames a PDF file based on its detected header" + }, + "adjustContrast": { + "tags": "contrast,brightness,saturation", + "title": "UpraviÅĨ farby/kontrast", + "desc": "Upravte kontrast, sÃŊtosÅĨ a jas PDF" + }, + "crop": { + "tags": "trim,cut,resize", + "title": "OrezaÅĨ PDF", + "desc": "OrezaÅĨ PDF na zmenÅĄenie jeho veÄžkosti (zachovÃĄva text!)" + }, + "autoSplitPDF": { + "tags": "auto,split,QR", + "title": "AutomatickÊ rozdelenie strÃĄnok", + "desc": "AutomatickÊ rozdelenie skenovanÊho PDF pomocou fyzickÊho skenovanÊho rozdeÄžovača strÃĄnok QR kÃŗdom" + }, + "sanitize": { + "tags": "clean,purge,remove", + "title": "Sanitise", + "desc": "Remove potentially harmful elements from PDF files" + }, + "getPdfInfo": { + "tags": "info,metadata,details", + "title": "ZískaÅĨ vÅĄetky informÃĄcie o PDF", + "desc": "Získava vÅĄetky dostupnÊ informÃĄcie o PDF" + }, + "pdfToSinglePage": { + "tags": "combine,merge,single", + "title": "PDF na jednu veÄžkÃē strÃĄnku", + "desc": "ZlÃēči vÅĄetky strÃĄnky PDF do jednej veÄžkej strÃĄnky" + }, + "showJS": { + "tags": "javascript,code,script", + "title": "ZobraziÅĨ JavaScript", + "desc": "VyhÄžadÃĄ a zobrazuje akÃŊkoÄžvek JS vloÅženÃŊ do PDF" + }, + "redact": { + "tags": "censor,blackout,hide", + "title": "Manual Redaction", + "desc": "Redacts a PDF based on selected text, drawn shapes and/or selected page(s)" + }, + "splitBySections": { + "tags": "split,sections,divide", + "title": "Split PDF by Sections", + "desc": "Divide each page of a PDF into smaller horizontal and vertical sections" + }, + "addStamp": { + "tags": "stamp,mark,seal", + "title": "Add Stamp to PDF", + "desc": "Add text or add image stamps at set locations" + }, + "removeImage": { + "tags": "remove,delete,clean", + "title": "Remove image", + "desc": "Remove image from PDF to reduce file size" + }, + "splitByChapters": { + "tags": "split,chapters,structure", + "title": "Split PDF by Chapters", + "desc": "Split a PDF into multiple files based on its chapter structure." + }, + "validateSignature": { + "tags": "validate,verify,certificate", + "title": "Validate PDF Signature", + "desc": "Verify digital signatures and certificates in PDF documents" + }, + "swagger": { + "tags": "API,documentation,test", + "title": "API Documentation", + "desc": "View API documentation and test endpoints" + }, + "scannerEffect": { + "tags": "scan,simulate,create", + "title": "Scanner Effect", + "desc": "Create a PDF that looks like it was scanned" + }, + "editTableOfContents": { + "tags": "bookmarks,contents,edit", + "title": "Edit Table of Contents", + "desc": "Add or edit bookmarks and table of contents in PDF documents" + }, + "manageCertificates": { + "tags": "certificates,import,export", + "title": "Manage Certificates", + "desc": "Import, export, or delete digital certificate files used for signing PDFs." + }, + "read": { + "tags": "view,open,display", + "title": "Read", + "desc": "View and annotate PDFs. Highlight text, draw, or insert comments for review and collaboration." + }, + "reorganizePages": { + "tags": "rearrange,reorder,organize", + "title": "Reorganize Pages", + "desc": "Rearrange, duplicate, or delete PDF pages with visual drag-and-drop control." + }, + "extractPages": { + "tags": "pull,select,copy", + "title": "ExtrahovaÅĨ strÃĄnky", + "desc": "Extract specific pages from a PDF document" + }, + "removePages": { + "tags": "delete,extract,exclude", + "title": "OdstrÃĄniÅĨ", + "desc": "OdstrÃĄniÅĨ nechcenÊ strÃĄnky z vÃĄÅĄho PDF dokumentu." + }, + "autoSizeSplitPDF": { + "tags": "auto,split,size", + "title": "AutomatickÊ rozdelenie podÄža veÄžkosti/počtu", + "desc": "Rozdelí jeden PDF na viacero dokumentov na zÃĄklade veÄžkosti, počtu strÃĄnok alebo počtu dokumentov" + }, + "replaceColor": { + "title": "Replace & Invert Colour", + "desc": "Replace or invert colours in PDF documents" + }, + "devApi": { + "tags": "API,development,documentation", + "title": "API", + "desc": "Link to API documentation" + }, + "devFolderScanning": { + "tags": "automation,folder,scanning", + "title": "Automated Folder Scanning", + "desc": "Link to automated folder scanning guide" + }, + "devSsoGuide": { + "title": "SSO Guide", + "desc": "Link to SSO guide" + }, + "devAirgapped": { + "title": "Air-gapped Setup", + "desc": "Link to air-gapped setup guide" + }, + "addPassword": { + "title": "PridaÅĨ heslo", + "desc": "Å ifrovaÅĨ vÃĄÅĄ PDF dokument heslom." + }, + "changePermissions": { + "title": "ZmeniÅĨ povolenia", + "desc": "Change document restrictions and permissions" + }, + "automate": { + "tags": "workflow,sequence,automation", + "title": "Automate", + "desc": "Build multi-step workflows by chaining together PDF actions. Ideal for recurring tasks." + }, + "overlay-pdfs": { + "desc": "PrekrÃŊva PDF sÃēbory na inÃŊ PDF", + "title": "PrekrÃŊvanie PDF" + }, "imageToPDF": { "title": "ObrÃĄzok na PDF", "desc": "Konvertujte obrÃĄzok (PNG, JPEG, GIF) na PDF." @@ -355,18 +786,6 @@ "title": "PDF na obrÃĄzok", "desc": "Konvertujte PDF na obrÃĄzok. (PNG, JPEG, GIF)" }, - "pdfOrganiser": { - "title": "OrganizovaÅĨ", - "desc": "OdstrÃĄÅˆte/preusporiadajte strÃĄnky v ÄžubovoÄžnom poradí" - }, - "addImage": { - "title": "PridaÅĨ obrÃĄzok", - "desc": "PridaÅĨ obrÃĄzok na zadanÊ miesto v PDF" - }, - "watermark": { - "title": "PridaÅĨ vodotlač", - "desc": "PridaÅĨ vlastnÃē vodotlač do vÃĄÅĄho PDF dokumentu." - }, "permissions": { "title": "ZmeniÅĨ povolenia", "desc": "Zmena povolení vÃĄÅĄho PDF dokumentu" @@ -375,38 +794,10 @@ "title": "OdstrÃĄniÅĨ", "desc": "OdstrÃĄniÅĨ nechcenÊ strÃĄnky z vÃĄÅĄho PDF dokumentu." }, - "addPassword": { - "title": "PridaÅĨ heslo", - "desc": "Å ifrovaÅĨ vÃĄÅĄ PDF dokument heslom." - }, - "removePassword": { - "title": "OdstrÃĄniÅĨ heslo", - "desc": "OdstrÃĄniÅĨ ochranu heslom z vÃĄÅĄho PDF dokumentu." - }, - "compress": { - "title": "KomprimovaÅĨ", - "desc": "Komprimujte PDF na zmenÅĄenie jeho veÄžkosti." - }, - "unlockPDFForms": { - "title": "Unlock PDF Forms", - "desc": "Remove read-only property of form fields in a PDF document." - }, - "changeMetadata": { - "title": "ZmeniÅĨ metadÃĄta", - "desc": "Zmena/OdstrÃĄnenie/Pridanie metadÃĄt z PDF dokumentu" - }, "fileToPDF": { "title": "KonvertovaÅĨ sÃēbor na PDF", "desc": "Konvertujte takmer akÃŊkoÄžvek sÃēbor na PDF (DOCX, PNG, XLS, PPT, TXT a ďalÅĄie)" }, - "ocr": { - "title": "OCR / Čistenie skenov", - "desc": "Čistenie skenov a rozpoznanie textu z obrÃĄzkov v PDF a opätovnÊ pridanie ako text." - }, - "extractImages": { - "title": "ExtrahovaÅĨ obrÃĄzky", - "desc": "Extrahuje vÅĄetky obrÃĄzky z PDF a uloŞí ich do zipu" - }, "pdfToPDFA": { "title": "PDF na PDF/A", "desc": "Konvertujte PDF na PDF/A pre dlhodobÊ uchovÃĄvanie" @@ -435,70 +826,14 @@ "title": "Detekcia/Rozdelenie skenovanÃŊch fotografií", "desc": "Rozdelí viacero fotografií v rÃĄmci fotografie/PDF" }, - "sign": { - "title": "PodpísaÅĨ", - "desc": "PridÃĄva podpis do PDF kreslením, textom alebo obrÃĄzkom" - }, - "flatten": { - "title": "ZploÅĄtiÅĨ", - "desc": "OdstrÃĄniÅĨ vÅĄetky interaktívne prvky a formulÃĄre z PDF" - }, - "repair": { - "title": "OpraviÅĨ", - "desc": "SkÃēÅĄa opraviÅĨ poÅĄkodenÊ/rozbitÊ PDF" - }, - "removeBlanks": { - "title": "OdstrÃĄniÅĨ prÃĄzdne strÃĄnky", - "desc": "Detekuje a odstraňuje prÃĄzdne strÃĄnky z dokumentu" - }, - "removeAnnotations": { - "title": "OdstrÃĄniÅĨ anotÃĄcie", - "desc": "Odstraňuje vÅĄetky komentÃĄre/anotÃĄcie z PDF" - }, - "compare": { - "title": "PorovnaÅĨ", - "desc": "PorovnÃĄva a zobrazuje rozdiely medzi 2 PDF dokumentmi" - }, - "certSign": { - "title": "PodpísaÅĨ s certifikÃĄtom", - "desc": "PodpísaÅĨ PDF s certifikÃĄtom/kÄžÃēčom (PEM/P12)" - }, - "removeCertSign": { - "title": "Remove Certificate Sign", - "desc": "Remove certificate signature from PDF" - }, - "pageLayout": { - "title": "ViacstranovÊ usporiadanie", - "desc": "ZlÃēčte viacero strÃĄnok PDF dokumentu do jednej strÃĄnky" - }, - "scalePages": { - "title": "PrispôsobiÅĨ veÄžkosÅĨ/ÅĄkÃĄlovanie strÃĄnok", - "desc": "ZmeniÅĨ veÄžkosÅĨ/ÅĄkÃĄlovanie strÃĄnky a/alebo jej obsahu." - }, "pipeline": { "title": "Pipeline", "desc": "SpustiÅĨ viacero akcií na PDF definovaním pipeline skriptov" }, - "addPageNumbers": { - "title": "PridaÅĨ čísla strÃĄnok", - "desc": "PridaÅĨ čísla strÃĄnok po celom dokumente na určenom mieste" - }, "auto-rename": { "title": "AutomatickÊ premenovanie PDF sÃēboru", "desc": "Automaticky premenuje PDF sÃēbor na zÃĄklade zistenÊho zÃĄhlavia" }, - "adjustContrast": { - "title": "UpraviÅĨ farby/kontrast", - "desc": "Upravte kontrast, sÃŊtosÅĨ a jas PDF" - }, - "crop": { - "title": "OrezaÅĨ PDF", - "desc": "OrezaÅĨ PDF na zmenÅĄenie jeho veÄžkosti (zachovÃĄva text!)" - }, - "autoSplitPDF": { - "title": "AutomatickÊ rozdelenie strÃĄnok", - "desc": "AutomatickÊ rozdelenie skenovanÊho PDF pomocou fyzickÊho skenovanÊho rozdeÄžovača strÃĄnok QR kÃŗdom" - }, "sanitizePDF": { "title": "VyčistiÅĨ", "desc": "OdstrÃĄniÅĨ skripty a ďalÅĄie prvky z PDF sÃēborov" @@ -519,30 +854,14 @@ "title": "PDF to Markdown", "desc": "Converts any PDF to Markdown" }, - "getPdfInfo": { - "title": "ZískaÅĨ vÅĄetky informÃĄcie o PDF", - "desc": "Získava vÅĄetky dostupnÊ informÃĄcie o PDF" - }, "pageExtracter": { "title": "ExtrahovaÅĨ strÃĄnku(y)", "desc": "Extrahuje vybranÊ strÃĄnky z PDF" }, - "pdfToSinglePage": { - "title": "PDF na jednu veÄžkÃē strÃĄnku", - "desc": "ZlÃēči vÅĄetky strÃĄnky PDF do jednej veÄžkej strÃĄnky" - }, - "showJS": { - "title": "ZobraziÅĨ JavaScript", - "desc": "VyhÄžadÃĄ a zobrazuje akÃŊkoÄžvek JS vloÅženÃŊ do PDF" - }, "autoRedact": { "title": "AutomatickÊ redigovanie", "desc": "Automaticky rediguje (zatieni) text v PDF na zÃĄklade zadanÊho textu" }, - "redact": { - "title": "Manual Redaction", - "desc": "Redacts a PDF based on selected text, drawn shapes and/or selected page(s)" - }, "PDFToCSV": { "title": "PDF do CSV", "desc": "Extrahuje tabuÄžky z PDF a konvertuje ich do CSV" @@ -551,10 +870,6 @@ "title": "AutomatickÊ rozdelenie podÄža veÄžkosti/počtu", "desc": "Rozdelí jeden PDF na viacero dokumentov na zÃĄklade veÄžkosti, počtu strÃĄnok alebo počtu dokumentov" }, - "overlay-pdfs": { - "title": "PrekrÃŊvanie PDF", - "desc": "PrekrÃŊva PDF sÃēbory na inÃŊ PDF" - }, "split-by-sections": { "title": "Rozdelenie PDF podÄža sekcií", "desc": "Rozdelí kaÅždÃē strÃĄnku PDF na menÅĄie horizontÃĄlne a vertikÃĄlne sekcie" @@ -563,43 +878,17 @@ "title": "PridaÅĨ pečiatku do PDF", "desc": "PridaÅĨ text alebo obrÃĄzkovÊ pečiatky na určenÊ miesta" }, - "removeImage": { - "title": "Remove image", - "desc": "Remove image from PDF to reduce file size" - }, - "splitByChapters": { - "title": "Split PDF by Chapters", - "desc": "Split a PDF into multiple files based on its chapter structure." - }, - "validateSignature": { - "title": "Validate PDF Signature", - "desc": "Verify digital signatures and certificates in PDF documents" - }, "replace-color": { "title": "Replace and Invert Color", "desc": "Replace color for text and background in PDF and invert full color of pdf to reduce file size" }, - "convert": { - "title": "KonvertovaÅĨ" - }, "attachments": { "title": "Add attachments" }, - "extractPages": { - "title": "ExtrahovaÅĨ strÃĄnky" - }, - "removePages": { - "title": "OdstrÃĄniÅĨ", - "desc": "OdstrÃĄniÅĨ nechcenÊ strÃĄnky z vÃĄÅĄho PDF dokumentu." - }, "removeImagePdf": { "title": "Remove image", "desc": "Remove image from PDF to reduce file size" }, - "autoSizeSplitPDF": { - "title": "AutomatickÊ rozdelenie podÄža veÄžkosti/počtu", - "desc": "Rozdelí jeden PDF na viacero dokumentov na zÃĄklade veÄžkosti, počtu strÃĄnok alebo počtu dokumentov" - }, "adjust-contrast": { "title": "UpraviÅĨ farby/kontrast", "desc": "Upravte kontrast, sÃŊtosÅĨ a jas PDF" @@ -607,11 +896,12 @@ "replaceColorPdf": { "title": "Replace and Invert Color", "desc": "Replace color for text and background in PDF and invert full color of pdf to reduce file size" - }, - "changePermissions": { - "title": "ZmeniÅĨ povolenia" } }, + "landing": { + "addFiles": "Add Files", + "uploadFromComputer": "Upload from computer" + }, "viewPdf": { "tags": "zobraziÅĨ,čítaÅĨ,anotovaÅĨ,text,obrÃĄzok", "title": "View/Edit PDF", @@ -645,14 +935,39 @@ "merge": { "tags": "zlÃēčenie,operÃĄcie so strÃĄnkami,back end,beŞí na serveri", "title": "ZlÃēčiÅĨ", + "removeDigitalSignature": { + "label": "Remove digital signature in the merged file?", + "tooltip": { + "title": "Remove Digital Signature", + "description": "Digital signatures will be invalidated when merging files. Check this to remove them from the final merged PDF." + } + }, + "generateTableOfContents": { + "label": "Generate table of contents in the merged file?", + "tooltip": { + "title": "Generate Table of Contents", + "description": "Automatically creates a clickable table of contents in the merged PDF based on the original file names and page numbers." + } + }, + "submit": "ZlÃēčiÅĨ", + "sortBy": { + "description": "Files will be merged in the order they're selected. Drag to reorder or sort below.", + "label": "Sort By", + "filename": "File Name", + "dateModified": "Date Modified", + "ascending": "Ascending", + "descending": "Descending", + "sort": "Sort" + }, + "error": { + "failed": "An error occurred while merging the PDFs." + }, "header": "ZlÃēčiÅĨ viacero PDF (2+)", "sortByName": "ZoradiÅĨ podÄža nÃĄzvu", "sortByDate": "ZoradiÅĨ podÄža dÃĄtumu", - "removeCertSign": "Remove digital signature in the merged file?", - "submit": "ZlÃēčiÅĨ" + "removeCertSign": "Remove digital signature in the merged file?" }, "split": { - "tags": "operÃĄcie so strÃĄnkami,rozdelenie,viacstranovÊ,rozrezaÅĨ,beŞí na serveri", "title": "RozdeliÅĨ PDF", "header": "RozdeliÅĨ PDF", "desc": { @@ -668,15 +983,249 @@ "splitPages": "Zadajte strÃĄnky na rozdelenie:", "submit": "RozdeliÅĨ", "steps": { + "chooseMethod": "Choose Method", "settings": "Nastavenia" - } + }, + "settings": { + "selectMethodFirst": "Please select a split method first" + }, + "error": { + "failed": "An error occurred while splitting the PDF." + }, + "method": { + "label": "Choose split method", + "placeholder": "Select how to split the PDF" + }, + "methods": { + "prefix": { + "splitAt": "Split at", + "splitBy": "Split by" + }, + "byPages": { + "name": "Page Numbers", + "desc": "Extract specific pages (1,3,5-10)", + "tooltip": "Enter page numbers separated by commas or ranges with hyphens" + }, + "bySections": { + "name": "Sections", + "desc": "Divide pages into grid sections", + "tooltip": "Split each page into horizontal and vertical sections" + }, + "bySize": { + "name": "File Size", + "desc": "Limit maximum file size", + "tooltip": "Specify maximum file size (e.g. 10MB, 500KB)" + }, + "byPageCount": { + "name": "Page Count", + "desc": "Fixed pages per file", + "tooltip": "Enter the number of pages for each split file" + }, + "byDocCount": { + "name": "Document Count", + "desc": "Create specific number of files", + "tooltip": "Enter how many files you want to create" + }, + "byChapters": { + "name": "Chapters", + "desc": "Split at bookmark boundaries", + "tooltip": "Uses PDF bookmarks to determine split points" + }, + "byPageDivider": { + "name": "Page Divider", + "desc": "Auto-split with divider sheets", + "tooltip": "Use QR code divider sheets between documents when scanning" + } + }, + "value": { + "fileSize": { + "label": "File Size", + "placeholder": "e.g. 10MB, 500KB" + }, + "pageCount": { + "label": "Pages per File", + "placeholder": "e.g. 5, 10" + }, + "docCount": { + "label": "Number of Files", + "placeholder": "e.g. 3, 5" + } + }, + "tooltip": { + "header": { + "title": "Split Methods Overview" + }, + "byPages": { + "title": "Split at Page Numbers", + "text": "Split your PDF at specific page numbers. Using 'n' splits after page n. Using 'n-m' splits before page n and after page m.", + "bullet1": "Single split points: 3,7 (splits after pages 3 and 7)", + "bullet2": "Range split points: 3-8 (splits before page 3 and after page 8)", + "bullet3": "Mixed: 2,5-10,15 (splits after page 2, before page 5, after page 10, and after page 15)" + }, + "bySections": { + "title": "Split by Grid Sections", + "text": "Divide each page into a grid of sections. Useful for splitting documents with multiple columns or extracting specific areas.", + "bullet1": "Horizontal: Number of rows to create", + "bullet2": "Vertical: Number of columns to create", + "bullet3": "Merge: Combine all sections into one PDF" + }, + "bySize": { + "title": "Split by File Size", + "text": "Create multiple PDFs that don't exceed a specified file size. Ideal for file size limitations or email attachments.", + "bullet1": "Use MB for larger files (e.g., 10MB)", + "bullet2": "Use KB for smaller files (e.g., 500KB)", + "bullet3": "System will split at page boundaries" + }, + "byCount": { + "title": "Split by Count", + "text": "Create multiple PDFs with a specific number of pages or documents each.", + "bullet1": "Page Count: Fixed number of pages per file", + "bullet2": "Document Count: Fixed number of output files", + "bullet3": "Useful for batch processing workflows" + }, + "byChapters": { + "title": "Split by Chapters", + "text": "Use PDF bookmarks to automatically split at chapter boundaries. Requires PDFs with bookmark structure.", + "bullet1": "Bookmark Level: Which level to split on (1=top level)", + "bullet2": "Include Metadata: Preserve document properties", + "bullet3": "Allow Duplicates: Handle repeated bookmark names" + }, + "byDocCount": { + "bullet1": "Enter the number of output files you want", + "bullet2": "Pages are distributed as evenly as possible", + "bullet3": "Useful when you need a specific number of files", + "text": "Create a specific number of output files by evenly distributing pages across them.", + "title": "Split by Document Count" + }, + "byPageCount": { + "bullet1": "Enter the number of pages per output file", + "bullet2": "Last file may have fewer pages if not evenly divisible", + "bullet3": "Useful for batch processing workflows", + "text": "Create multiple PDFs with a specific number of pages each. Perfect for creating uniform document chunks.", + "title": "Split by Page Count" + }, + "byPageDivider": { + "bullet1": "Print divider sheets from the download link", + "bullet2": "Insert divider sheets between your documents", + "bullet3": "Scan all documents together as one PDF", + "bullet4": "Upload - divider pages are automatically detected and removed", + "bullet5": "Enable Duplex Mode if scanning both sides of divider sheets", + "text": "Automatically split scanned documents using physical divider sheets with QR codes. Perfect for processing multiple documents scanned together.", + "title": "Split by Page Divider" + } + }, + "methodSelection": { + "tooltip": { + "bullet1": "Click on a method card to select it", + "bullet2": "Hover over each card to see a quick description", + "bullet3": "The settings step will appear after you select a method", + "bullet4": "You can change methods at any time before processing", + "header": { + "text": "Choose how you want to split your PDF document. Each method is optimized for different use cases and document types.", + "title": "Split Method Selection" + }, + "title": "Choose Your Split Method" + } + }, + "selectMethod": "Select a split method", + "tags": "operÃĄcie so strÃĄnkami,rozdelenie,viacstranovÊ,rozrezaÅĨ,beŞí na serveri" }, "rotate": { - "tags": "beŞí na serveri", "title": "OtočiÅĨ PDF", + "submit": "OtočiÅĨ", + "selectRotation": "Select Rotation Angle (Clockwise)", + "error": { + "failed": "An error occurred while rotating the PDF." + }, + "preview": { + "title": "Rotation Preview" + }, + "rotateLeft": "Rotate Anticlockwise", + "rotateRight": "Rotate Clockwise", + "tooltip": { + "header": { + "title": "Rotate Settings Overview" + }, + "description": { + "text": "Rotate your PDF pages clockwise or anticlockwise in 90-degree increments. All pages in the PDF will be rotated. The preview shows how your document will look after rotation." + }, + "controls": { + "title": "Controls", + "text": "Use the rotation buttons to adjust orientation. Left button rotates anticlockwise, right button rotates clockwise. Each click rotates by 90 degrees." + } + }, + "tags": "beŞí na serveri", "header": "OtočiÅĨ PDF", - "selectAngle": "Vyberte uhol otočenia (v nÃĄsobkoch 90 stupňov):", - "submit": "OtočiÅĨ" + "selectAngle": "Vyberte uhol otočenia (v nÃĄsobkoch 90 stupňov):" + }, + "convert": { + "title": "KonvertovaÅĨ", + "desc": "Convert files between different formats", + "files": "Files", + "selectFilesPlaceholder": "Select files in the main view to get started", + "settings": "Nastavenia", + "conversionCompleted": "Conversion completed", + "results": "Results", + "defaultFilename": "converted_file", + "conversionResults": "Conversion Results", + "convertFrom": "Convert from", + "convertTo": "Convert to", + "sourceFormatPlaceholder": "Source format", + "targetFormatPlaceholder": "Target format", + "selectSourceFormatFirst": "Select a source format first", + "outputOptions": "Output Options", + "pdfOptions": "PDF Options", + "imageOptions": "Image Options", + "colorType": "Colour Type", + "color": "Farba", + "greyscale": "Odtiene ÅĄedej", + "blackwhite": "Black & White", + "dpi": "DPI", + "output": "Output", + "single": "Single", + "multiple": "Multiple", + "fitOption": "Fit Option", + "maintainAspectRatio": "Maintain Aspect Ratio", + "fitDocumentToPage": "Fit Document to Page", + "fillPage": "VyplniÅĨ strÃĄnku", + "autoRotate": "Auto Rotate", + "autoRotateDescription": "Automatically rotate images to better fit the PDF page", + "combineImages": "Combine Images", + "combineImagesDescription": "Combine all images into one PDF, or create separate PDFs for each image", + "webOptions": "Web to PDF Options", + "zoomLevel": "Zoom Level", + "emailOptions": "Email to PDF Options", + "includeAttachments": "Include email attachments", + "maxAttachmentSize": "Maximum attachment size (MB)", + "includeAllRecipients": "Include CC and BCC recipients in header", + "downloadHtml": "Download HTML intermediate file instead of PDF", + "pdfaOptions": "PDF/A Options", + "outputFormat": "Output Format", + "pdfaNote": "PDF/A-1b is more compatible, PDF/A-2b supports more features.", + "pdfaDigitalSignatureWarning": "The PDF contains a digital signature. This will be removed in the next step.", + "fileFormat": "File Format", + "wordDoc": "Word Document", + "wordDocExt": "Word Document (.docx)", + "odtExt": "OpenDocument Text (.odt)", + "pptExt": "PowerPoint (.pptx)", + "odpExt": "OpenDocument Presentation (.odp)", + "txtExt": "Plain Text (.txt)", + "rtfExt": "Rich Text Format (.rtf)", + "selectedFiles": "Selected files", + "noFileSelected": "No file selected. Use the file panel to add files.", + "convertFiles": "Convert Files", + "converting": "Converting...", + "downloadConverted": "Download Converted File", + "errorNoFiles": "Please select at least one file to convert.", + "errorNoFormat": "Please select both source and target formats.", + "errorNotSupported": "Conversion from {{from}} to {{to}} is not supported.", + "images": "Images", + "officeDocs": "Office Documents (Word, Excel, PowerPoint)", + "imagesExt": "Images (JPG, PNG, etc.)", + "markdown": "Markdown", + "textRtf": "Text/RTF", + "grayscale": "Odtiene ÅĄedej", + "errorConversion": "An error occurred while converting the file." }, "imageToPdf": { "tags": "konverzia,img,jpg,obrÃĄzok,fotografia" @@ -714,7 +1263,33 @@ "8": "OdstrÃĄniÅĨ poslednÃē", "9": "OdstrÃĄniÅĨ prvÃē aj poslednÃē", "10": "Odd-Even Merge", - "11": "Duplicate all pages" + "11": "Duplicate all pages", + "desc": { + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, â€Ļ).", + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, â€Ļ).", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimized for binding on the side)." + } + }, + "desc": { + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, â€Ļ).", + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, â€Ļ).", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimised for binding on the side).", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document." }, "placeholder": "(napr. 1,3,2 alebo 4-8,2,10-12 alebo 2n-1)" }, @@ -726,9 +1301,198 @@ "upload": "PridaÅĨ obrÃĄzok", "submit": "PridaÅĨ obrÃĄzok" }, + "attachments": { + "tags": "embed,attach,file,attachment,attachments", + "title": "Add attachments", + "header": "Add attachments", + "add": "Add Attachment", + "remove": "Remove Attachment", + "embed": "Embed Attachment", + "submit": "Add attachments" + }, "watermark": { - "tags": "Text,opakujÃēci sa,označenie,vlastnÊ,autorskÊ prÃĄva,ochrannÃĄ znÃĄmka,img,jpg,obrÃĄzok,fotografia", "title": "PridaÅĨ vodotlač", + "desc": "Add text or image watermarks to PDF files", + "completed": "Watermark added", + "submit": "PridaÅĨ vodotlač", + "filenamePrefix": "watermarked", + "error": { + "failed": "An error occurred while adding watermark to the PDF." + }, + "watermarkType": { + "text": "Text", + "image": "Image" + }, + "settings": { + "type": "Watermark Type", + "text": { + "label": "Watermark Text", + "placeholder": "Enter watermark text" + }, + "image": { + "label": "Watermark Image", + "choose": "Choose Image", + "selected": "Selected: {{filename}}" + }, + "fontSize": "Font Size", + "size": "Size", + "alphabet": "Font/Language", + "color": "Watermark Colour", + "rotation": "Rotation (degrees)", + "opacity": "Opacity (%)", + "spacing": { + "horizontal": "Horizontal Spacing", + "vertical": "Vertical Spacing", + "height": "Height Spacing", + "width": "Width Spacing" + }, + "convertToImage": "Flatten PDF pages to images" + }, + "alphabet": { + "roman": "Roman/Latin", + "arabic": "Arabic", + "japanese": "Japanese", + "korean": "Korean", + "chinese": "Chinese", + "thai": "Thai" + }, + "steps": { + "type": "Watermark Type", + "wording": "Wording", + "textStyle": "Style", + "formatting": "Formatting", + "file": "Watermark File" + }, + "results": { + "title": "Watermark Results" + }, + "tooltip": { + "language": { + "title": "Language Support", + "text": "Choose the appropriate language setting to ensure proper font rendering for your text." + }, + "appearance": { + "title": "Appearance Settings", + "text": "Control how your watermark looks and blends with the document.", + "bullet1": "Rotation: -360° to 360° for angled watermarks", + "bullet2": "Opacity: 0-100% for transparency control", + "bullet3": "Lower opacity creates subtle watermarks" + }, + "spacing": { + "title": "Spacing Control", + "text": "Adjust the spacing between repeated watermarks across the page.", + "bullet1": "Width spacing: Horizontal distance between watermarks", + "bullet2": "Height spacing: Vertical distance between watermarks", + "bullet3": "Higher values create more spread out patterns" + }, + "type": { + "header": { + "title": "Watermark Type Selection" + }, + "description": { + "title": "Choose Your Watermark", + "text": "Select between text or image watermarks based on your needs." + }, + "text": { + "title": "Text Watermarks", + "text": "Perfect for adding copyright notices, company names, or confidentiality labels. Supports multiple languages and custom colours.", + "bullet1": "Customisable fonts and languages", + "bullet2": "Adjustable colours and transparency", + "bullet3": "Ideal for legal or branding text" + }, + "image": { + "title": "Image Watermarks", + "text": "Use logos, stamps, or any image as a watermark. Great for branding and visual identification.", + "bullet1": "Upload any image format", + "bullet2": "Maintains image quality", + "bullet3": "Perfect for logos and stamps" + } + }, + "wording": { + "header": { + "title": "Text Content" + }, + "text": { + "title": "Watermark Text", + "text": "Enter the text that will appear as your watermark across the document.", + "bullet1": "Keep it concise for better readability", + "bullet2": "Common examples: 'CONFIDENTIAL', 'DRAFT', company name", + "bullet3": "Emoji characters are not supported and will be filtered out" + } + }, + "textStyle": { + "header": { + "title": "Text Style" + }, + "color": { + "title": "Colour Selection", + "text": "Choose a colour that provides good contrast with your document content.", + "bullet1": "Light grey (#d3d3d3) for subtle watermarks", + "bullet2": "Black or dark colours for high contrast", + "bullet3": "Custom colours for branding purposes" + }, + "language": { + "title": "Language Support", + "text": "Choose the appropriate language setting to ensure proper font rendering." + } + }, + "file": { + "header": { + "title": "Image Upload" + }, + "upload": { + "title": "Image Selection", + "text": "Upload an image file to use as your watermark.", + "bullet1": "Supports common formats: PNG, JPG, GIF, BMP", + "bullet2": "PNG with transparency works best", + "bullet3": "Higher resolution images maintain quality better" + }, + "recommendations": { + "title": "Best Practices", + "text": "Tips for optimal image watermark results.", + "bullet1": "Use logos or stamps with transparent backgrounds", + "bullet2": "Simple designs work better than complex images", + "bullet3": "Consider the final document size when choosing resolution" + } + }, + "formatting": { + "header": { + "title": "Formatting & Layout" + }, + "size": { + "title": "Size Control", + "text": "Adjust the size of your watermark (text or image).", + "bullet1": "Larger sizes create more prominent watermarks" + }, + "appearance": { + "title": "Appearance Settings", + "text": "Control how your watermark looks and blends with the document.", + "bullet1": "Rotation: -360° to 360° for angled watermarks", + "bullet2": "Opacity: 0-100% for transparency control", + "bullet3": "Lower opacity creates subtle watermarks" + }, + "spacing": { + "title": "Spacing Control", + "text": "Adjust the spacing between repeated watermarks across the page.", + "bullet1": "Horizontal spacing: Distance between watermarks left to right", + "bullet2": "Vertical spacing: Distance between watermarks top to bottom", + "bullet3": "Higher values create more spread out patterns" + }, + "security": { + "title": "Security Option", + "text": "Convert the final PDF to an image-based format for enhanced security.", + "bullet1": "Prevents text selection and copying", + "bullet2": "Makes watermarks harder to remove", + "bullet3": "Results in larger file sizes", + "bullet4": "Best for sensitive or copyrighted content" + } + } + }, + "type": { + "1": "Text", + "2": "ObrÃĄzok" + }, + "tags": "Text,opakujÃēci sa,označenie,vlastnÊ,autorskÊ prÃĄva,ochrannÃĄ znÃĄmka,img,jpg,obrÃĄzok,fotografia", "header": "PridaÅĨ vodotlač", "customColor": "VlastnÃĄ farba textu", "selectText": { @@ -742,11 +1506,6 @@ "8": "Typ vodotlače:", "9": "ObrÃĄzok vodotlače:", "10": "Convert PDF to PDF-Image" - }, - "submit": "PridaÅĨ vodotlač", - "type": { - "1": "Text", - "2": "ObrÃĄzok" } }, "permissions": { @@ -771,50 +1530,201 @@ "removePages": { "tags": "OdstrÃĄniÅĨ strÃĄnky,vymazaÅĨ strÃĄnky", "title": "OdstrÃĄniÅĨ", + "pageNumbers": { + "label": "Pages to Remove", + "placeholder": "e.g., 1,3,5-8,10", + "error": "Invalid page number format. Use numbers, ranges (1-5), or mathematical expressions (2n+1)" + }, + "filenamePrefix": "pages_removed", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "settings": { + "title": "Settings" + }, + "tooltip": { + "header": { + "title": "Remove Pages Settings" + }, + "pageNumbers": { + "title": "Page Selection", + "text": "Specify which pages to remove from your PDF. You can select individual pages, ranges, or use mathematical expressions.", + "bullet1": "Individual pages: 1,3,5 (removes pages 1, 3, and 5)", + "bullet2": "Page ranges: 1-5,10-15 (removes pages 1-5 and 10-15)", + "bullet3": "Mathematical: 2n+1 (removes odd pages)", + "bullet4": "Open ranges: 5- (removes from page 5 to end)" + }, + "examples": { + "title": "Common Examples", + "text": "Here are some common page selection patterns:", + "bullet1": "Remove first page: 1", + "bullet2": "Remove last 3 pages: -3", + "bullet3": "Remove every other page: 2n", + "bullet4": "Remove specific scattered pages: 1,5,10,15" + }, + "safety": { + "title": "Safety Tips", + "text": "Important considerations when removing pages:", + "bullet1": "Always preview your selection before processing", + "bullet2": "Keep a backup of your original file", + "bullet3": "Page numbers start from 1, not 0", + "bullet4": "Invalid page numbers will be ignored" + } + }, + "error": { + "failed": "An error occurred whilst removing pages." + }, + "results": { + "title": "Page Removal Results" + }, "submit": "OdstrÃĄniÅĨ" }, - "addPassword": { - "tags": "zaistiÅĨ,bezpečnosÅĨ", - "title": "PridaÅĨ heslo", - "header": "PridaÅĨ heslo (ZaÅĄifrovaÅĨ)", - "selectText": { - "1": "Vyberte PDF na zaÅĄifrovanie", - "2": "PouŞívateÄžskÊ heslo", - "3": "DÄēÅžka ÅĄifrovacieho kÄžÃēča", - "4": "VyÅĄÅĄie hodnoty sÃē silnejÅĄie, ale niÅžÅĄie hodnoty majÃē lepÅĄiu kompatibilitu.", - "5": "Nastavenia povolení (OdporÃēča sa pouŞívaÅĨ spolu s heslom vlastníka)", - "6": "ZakÃĄzaÅĨ zostavovanie dokumentu", - "7": "ZakÃĄzaÅĨ extrakciu obsahu", - "8": "ZakÃĄzaÅĨ extrakciu pre prístupnosÅĨ", - "9": "ZakÃĄzaÅĨ vypÄēňanie formulÃĄrov", - "10": "ZakÃĄzaÅĨ Ãēpravy", - "11": "ZakÃĄzaÅĨ Ãēpravu anotÃĄcií", - "12": "ZakÃĄzaÅĨ tlač", - "13": "ZakÃĄzaÅĨ tlač rôznych formÃĄtov", - "14": "Heslo vlastníka", - "15": "Obmedzuje, čo môŞe byÅĨ vykonanÊ s dokumentom po jeho otvorení (NepodporovanÊ vÅĄetkÃŊmi čítačmi)", - "16": "Obmedzuje samotnÊ otvorenie dokumentu" + "extractPages": { + "title": "Extract Pages", + "pageNumbers": { + "label": "Pages to Extract", + "placeholder": "e.g., 1,3,5-8 or odd & 1-10" + }, + "settings": { + "title": "Settings" }, - "submit": "ZaÅĄifrovaÅĨ", "tooltip": { - "permissions": { - "title": "ZmeniÅĨ povolenia" + "description": "Extracts the selected pages into a new PDF, preserving order." + }, + "error": { + "failed": "Failed to extract pages" + }, + "results": { + "title": "Pages Extracted" + }, + "submit": "Extract Pages" + }, + "pageSelection": { + "tooltip": { + "header": { + "title": "Page Selection Guide" + }, + "basic": { + "title": "Basic Usage", + "text": "Select specific pages from your PDF document using simple syntax.", + "bullet1": "Individual pages: 1,3,5", + "bullet2": "Page ranges: 3-6 or 10-15", + "bullet3": "All pages: all" + }, + "advanced": { + "title": "Advanced Features" + }, + "tips": { + "title": "Tips", + "text": "Keep these guidelines in mind:", + "bullet1": "Page numbers start from 1 (not 0)", + "bullet2": "Spaces are automatically removed", + "bullet3": "Invalid expressions are ignored" + }, + "syntax": { + "title": "Syntax Basics", + "text": "Use numbers, ranges, keywords, and progressions (n starts at 0). Parentheses are supported.", + "bullets": { + "numbers": "Numbers/ranges: 5, 10-20", + "keywords": "Keywords: odd, even", + "progressions": "Progressions: 3n, 4n+1" + } + }, + "operators": { + "title": "Operators", + "text": "AND has higher precedence than comma. NOT applies within the document range.", + "and": "AND: & or \"and\" — require both conditions (e.g., 1-50 & even)", + "comma": "Comma: , or | — combine selections (e.g., 1-10, 20)", + "not": "NOT: ! or \"not\" — exclude pages (e.g., 3n & not 30)" + }, + "examples": { + "title": "Examples" + }, + "complex": { + "bullet1": "1,3-5,8,2n → pages 1, 3–5, 8, plus evens", + "bullet2": "10-,2n-1 → from page 10 to end + odd pages", + "description": "Mix different types.", + "title": "Complex Combinations" + }, + "description": "Choose which pages to use for the operation. Supports single pages, ranges, formulas, and the all keyword.", + "individual": { + "bullet1": "1,3,5 → selects pages 1, 3, 5", + "bullet2": "2,7,12 → selects pages 2, 7, 12", + "description": "Enter numbers separated by commas.", + "title": "Individual Pages" + }, + "mathematical": { + "bullet1": "2n → all even pages (2, 4, 6â€Ļ)", + "bullet2": "2n-1 → all odd pages (1, 3, 5â€Ļ)", + "bullet3": "3n → every 3rd page (3, 6, 9â€Ļ)", + "bullet4": "4n-1 → pages 3, 7, 11, 15â€Ļ", + "description": "Use n in formulas for patterns.", + "title": "Mathematical Functions" + }, + "ranges": { + "bullet1": "3-6 → selects pages 3–6", + "bullet2": "10-15 → selects pages 10–15", + "bullet3": "5- → selects pages 5 to end", + "description": "Use - for consecutive pages.", + "title": "Page Ranges" + }, + "special": { + "bullet1": "all → selects all pages", + "title": "Special Keywords" } } }, - "removePassword": { - "tags": "zaistiÅĨ,DeÅĄifrovaÅĨ,bezpečnosÅĨ,odheslovaÅĨ,vymazaÅĨ heslo", - "title": "OdstrÃĄniÅĨ heslo", - "header": "OdstrÃĄniÅĨ heslo (DeÅĄifrovaÅĨ)", - "selectText": { - "1": "Vyberte PDF na deÅĄifrovanie", - "2": "Heslo" + "bulkSelection": { + "syntaxError": "There is a syntax issue. See Page Selection tips for help.", + "header": { + "title": "Page Selection Guide" }, - "submit": "OdstrÃĄniÅĨ", - "desc": "OdstrÃĄniÅĨ ochranu heslom z vÃĄÅĄho PDF dokumentu.", - "password": { - "stepTitle": "OdstrÃĄniÅĨ heslo", - "label": "AktuÃĄlne heslo" + "syntax": { + "title": "Syntax Basics", + "text": "Use numbers, ranges, keywords, and progressions (n starts at 0). Parentheses are supported.", + "bullets": { + "numbers": "Numbers/ranges: 5, 10-20", + "keywords": "Keywords: odd, even", + "progressions": "Progressions: 3n, 4n+1" + } + }, + "operators": { + "title": "Operators", + "text": "AND has higher precedence than comma. NOT applies within the document range.", + "and": "AND: & or \"and\" — require both conditions (e.g., 1-50 & even)", + "comma": "Comma: , or | — combine selections (e.g., 1-10, 20)", + "not": "NOT: ! or \"not\" — exclude pages (e.g., 3n & not 30)" + }, + "examples": { + "title": "Examples", + "first50": "First 50", + "last50": "Last 50", + "every3rd": "Every 3rd", + "oddWithinExcluding": "Odd within 1-20 excluding 5-7", + "combineSets": "Combine sets" + }, + "firstNPages": { + "title": "First N Pages", + "placeholder": "Number of pages" + }, + "lastNPages": { + "title": "Last N Pages", + "placeholder": "Number of pages" + }, + "everyNthPage": { + "title": "Every Nth Page", + "placeholder": "Step size" + }, + "range": { + "title": "Range", + "fromPlaceholder": "From", + "toPlaceholder": "To" + }, + "keywords": { + "title": "Keywords" + }, + "advanced": { + "title": "Advanced" } }, "compressPdfs": { @@ -824,12 +1734,142 @@ "tags": "remove,delete,form,field,readonly", "title": "Remove Read-Only from Form Fields", "header": "Unlock PDF Forms", - "submit": "Remove" + "submit": "Remove", + "description": "This tool will remove read-only restrictions from PDF form fields, making them editable and fillable.", + "filenamePrefix": "unlocked_forms", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst unlocking PDF forms." + }, + "results": { + "title": "Unlocked Forms Results" + } }, "changeMetadata": { - "tags": "NÃĄzov,autor,dÃĄtum,vytvorenie,čas,vydavateÄž,producent,ÅĄtatistiky", - "title": "ZmeniÅĨ metadÃĄta", "header": "ZmeniÅĨ metadÃĄta", + "submit": "ZmeniÅĨ", + "filenamePrefix": "metadata", + "settings": { + "title": "Metadata Settings" + }, + "standardFields": { + "title": "Standard Fields" + }, + "deleteAll": { + "label": "Remove Existing Metadata", + "checkbox": "Delete all metadata" + }, + "title": { + "label": "Title", + "placeholder": "Document title" + }, + "author": { + "label": "Author", + "placeholder": "Document author" + }, + "subject": { + "label": "Subject", + "placeholder": "Document subject" + }, + "keywords": { + "label": "Keywords", + "placeholder": "Document keywords" + }, + "creator": { + "label": "Creator", + "placeholder": "Document creator" + }, + "producer": { + "label": "Producer", + "placeholder": "Document producer" + }, + "dates": { + "title": "Date Fields" + }, + "creationDate": { + "label": "Creation Date", + "placeholder": "Creation date" + }, + "modificationDate": { + "label": "Modification Date", + "placeholder": "Modification date" + }, + "trapped": { + "label": "Trapped Status", + "unknown": "Unknown", + "true": "True", + "false": "False" + }, + "advanced": { + "title": "Advanced Options" + }, + "customFields": { + "title": "Custom Metadata", + "description": "Add custom metadata fields to the document", + "add": "Add Field", + "key": "Key", + "keyPlaceholder": "Custom key", + "value": "Value", + "valuePlaceholder": "Custom value", + "remove": "Remove" + }, + "results": { + "title": "Updated PDFs" + }, + "error": { + "failed": "An error occurred while changing the PDF metadata." + }, + "tooltip": { + "header": { + "title": "PDF Metadata Overview" + }, + "standardFields": { + "title": "Standard Fields", + "text": "Common PDF metadata fields that describe the document.", + "bullet1": "Title: Document name or heading", + "bullet2": "Author: Person who created the document", + "bullet3": "Subject: Brief description of content", + "bullet4": "Keywords: Search terms for the document", + "bullet5": "Creator/Producer: Software used to create the PDF" + }, + "dates": { + "title": "Date Fields", + "text": "When the document was created and modified.", + "bullet1": "Creation Date: When original document was made", + "bullet2": "Modification Date: When last changed" + }, + "options": { + "title": "Additional Options", + "text": "Custom fields and privacy controls.", + "bullet1": "Custom Metadata: Add your own key-value pairs", + "bullet2": "Trapped Status: High-quality printing setting", + "bullet3": "Delete All: Remove all metadata for privacy" + }, + "deleteAll": { + "title": "Remove Existing Metadata", + "text": "Complete metadata deletion to ensure privacy." + }, + "customFields": { + "title": "Custom Metadata", + "text": "Add your own custom key-value metadata pairs.", + "bullet1": "Add any custom fields relevant to your document", + "bullet2": "Examples: Department, Project, Version, Status", + "bullet3": "Both key and value are required for each entry" + }, + "advanced": { + "title": "Advanced Options", + "trapped": { + "title": "Trapped Status", + "description": "Indicates if document is prepared for high-quality printing.", + "bullet1": "True: Document has been trapped for printing", + "bullet2": "False: Document has not been trapped", + "bullet3": "Unknown: Trapped status is not specified" + } + } + }, + "tags": "NÃĄzov,autor,dÃĄtum,vytvorenie,čas,vydavateÄž,producent,ÅĄtatistiky", "selectText": { "1": "Prosím, upravte premennÊ, ktorÊ chcete zmeniÅĨ", "2": "VymazaÅĨ vÅĄetky metadÃĄta", @@ -837,15 +1877,7 @@ "4": "InÊ metadÃĄta:", "5": "PridaÅĨ vlastnÃŊ zÃĄznam metadÃĄt" }, - "author": "Autor:", - "creationDate": "DÃĄtum vytvorenia (yyyy/MM/dd HH:mm:ss):", - "creator": "Tvorca:", - "keywords": "KÄžÃēčovÊ slovÃĄ:", - "modDate": "DÃĄtum Ãēpravy (yyyy/MM/dd HH:mm:ss):", - "producer": "Producent:", - "subject": "Predmet:", - "trapped": "ZachytenÊ:", - "submit": "ZmeniÅĨ" + "modDate": "DÃĄtum Ãēpravy (yyyy/MM/dd HH:mm:ss):" }, "fileToPDF": { "tags": "transformÃĄcia,formÃĄt,dokument,obrÃĄzok,prezentÃĄcia,text,konverzia,kancelÃĄria,dokumenty,word,excel,powerpoint", @@ -859,6 +1891,7 @@ "ocr": { "tags": "rozpoznanie,text,obrÃĄzok,scan,čítaÅĨ,identifikovaÅĨ,detekcia,upraviteÄžnÊ", "title": "OCR / Čistenie skenov", + "desc": "Čistenie skenov a rozpoznanie textu z obrÃĄzkov v PDF a opätovnÊ pridanie ako text.", "header": "Čistenie skenov / OCR (OptickÊ rozpoznÃĄvanie znakov)", "selectText": { "1": "Vyberte jazyky, ktorÊ majÃē byÅĨ detekovanÊ v PDF (UvedenÊ sÃē tie, ktorÊ sÃē aktuÃĄlne detekovanÊ):", @@ -877,17 +1910,89 @@ "help": "Prosím, prečítajte si tÃēto dokumentÃĄciu o tom, ako pouŞívaÅĨ OCR pre inÊ jazyky a/alebo pouÅžitie mimo docker", "credit": "TÃĄto sluÅžba pouŞíva qpdf a Tesseract pre OCR.", "submit": "SpracovaÅĨ PDF s OCR", - "desc": "Čistenie skenov a rozpoznanie textu z obrÃĄzkov v PDF a opätovnÊ pridanie ako text.", + "operation": { + "submit": "Process OCR and Review" + }, + "results": { + "title": "OCR Results" + }, + "languagePicker": { + "additionalLanguages": "Looking for additional languages?", + "viewSetupGuide": "View setup guide →" + }, "settings": { "title": "Nastavenia", "ocrMode": { - "label": "OCR reÅžim" + "label": "OCR reÅžim", + "auto": "Auto (skip text layers)", + "force": "Force (re-OCR all, replace text)", + "strict": "Strict (abort if text found)" + }, + "languages": { + "label": "Languages", + "placeholder": "Select languages" + }, + "compatibilityMode": { + "label": "Compatibility Mode" + }, + "advancedOptions": { + "label": "Processing Options", + "sidecar": "Create a text file", + "deskew": "Deskew pages", + "clean": "Clean input file", + "cleanFinal": "Clean final output" } }, "tooltip": { + "header": { + "title": "OCR Settings Overview" + }, "mode": { - "title": "OCR reÅžim" + "title": "OCR reÅžim", + "text": "Optical Character Recognition (OCR) helps you turn scanned or screenshotted pages into text you can search, copy, or highlight.", + "bullet1": "Auto skips pages that already contain text layers.", + "bullet2": "Force re-OCRs every page and replaces all the text.", + "bullet3": "Strict halts if any selectable text is found." + }, + "languages": { + "title": "Languages", + "text": "Improve OCR accuracy by specifying the expected languages. Choose one or more languages to guide detection." + }, + "output": { + "title": "Output", + "text": "Decide how you want the text output formatted:", + "bullet1": "Searchable PDF embeds text behind the original image.", + "bullet2": "HOCR XML returns a structured machine-readable file.", + "bullet3": "Plain-text sidecar creates a separate .txt file with raw content." + }, + "advanced": { + "header": { + "title": "Advanced OCR Processing" + }, + "compatibility": { + "title": "Compatibility Mode", + "text": "Uses OCR 'sandwich PDF' mode: results in larger files, but more reliable with certain languages and older PDF software. By default we use hOCR for smaller, modern PDFs." + }, + "sidecar": { + "title": "Create Text File", + "text": "Generates a separate .txt file alongside the PDF containing all extracted text content for easy access and processing." + }, + "deskew": { + "title": "Deskew Pages", + "text": "Automatically corrects skewed or tilted pages to improve OCR accuracy. Useful for scanned documents that weren't perfectly aligned." + }, + "clean": { + "title": "Clean Input File", + "text": "Preprocesses the input by removing noise, enhancing contrast, and optimising the image for better OCR recognition before processing." + }, + "cleanFinal": { + "title": "Clean Final Output", + "text": "Post-processes the final PDF by removing OCR artefacts and optimising the text layer for better readability and smaller file size." + } } + }, + "error": { + "failed": "OCR operation failed" } }, "extractImages": { @@ -896,7 +2001,13 @@ "header": "ExtrahovaÅĨ obrÃĄzky", "selectText": "Vyberte formÃĄt obrÃĄzka na konverziu extrahovanÃŊch obrÃĄzkov", "allowDuplicates": "Save duplicate images", - "submit": "ExtrahovaÅĨ" + "submit": "ExtrahovaÅĨ", + "settings": { + "title": "Settings" + }, + "error": { + "failed": "An error occurred while extracting images from the PDF." + } }, "pdfToPDFA": { "tags": "archív,dÄēhodobÊ,ÅĄtandard,konverzia,uchovanie", @@ -968,17 +2079,53 @@ }, "info": "Python is not installed. It is required to run." }, + "scannerImageSplit": { + "title": "Extracted Images", + "submit": "Extract Image Scans", + "error": { + "failed": "An error occurred while extracting image scans." + }, + "tooltip": { + "title": "Photo Splitter", + "whatThisDoes": "What this does", + "whatThisDoesDesc": "Automatically finds and extracts each photo from a scanned page or composite image—no manual cropping.", + "whenToUse": "When to use", + "useCase1": "Scan whole album pages in one go", + "useCase2": "Split flatbed batches into separate files", + "useCase3": "Break collages into individual photos", + "useCase4": "Pull photos from documents", + "quickFixes": "Quick fixes", + "problem1": "Photos not detected → increase Tolerance to 30-50", + "problem2": "Too many false detections → increase Minimum Area to 15,000-20,000", + "problem3": "Crops are too tight → increase Border Size to 5-10", + "problem4": "Tilted photos not straightened → lower Angle Threshold to ~5°", + "problem5": "Dust/noise boxes → increase Minimum Contour Area to 1000-2000", + "setupTips": "Setup tips", + "tip1": "Use a plain, light background", + "tip2": "Leave a small gap (≈1 cm) between photos", + "tip3": "Scan at 300-600 DPI", + "tip4": "Clean the scanner glass", + "headsUp": "Heads-up", + "headsUpDesc": "Overlapping photos or backgrounds very close in colour to the photos can reduce accuracy-try a lighter or darker background and leave more space." + } + }, "sign": { - "tags": "autorizovaÅĨ,iniciÃĄly,kreslenÃŊ podpis,textovÃŊ podpis,obrÃĄzkovÃŊ podpis", "title": "PodpísaÅĨ", "header": "PodpísaÅĨ PDF", "upload": "NahraÅĨ obrÃĄzok", - "draw": "KresliÅĨ podpis", - "text": "TextovÃŊ vstup", + "draw": { + "title": "Draw your signature", + "clear": "Clear" + }, + "text": { + "name": "Signer Name", + "placeholder": "Enter your full name" + }, "clear": "VymazaÅĨ", "add": "PridaÅĨ", "saved": "Saved Signatures", "save": "Save Signature", + "applySignatures": "Apply Signatures", "personalSigs": "Personal Signatures", "sharedSigs": "Shared Signatures", "noSavedSigs": "No saved signatures found", @@ -990,42 +2137,179 @@ "previous": "Previous page", "maintainRatio": "Toggle maintain aspect ratio", "undo": "Undo", - "redo": "Redo" + "redo": "Redo", + "submit": "Sign Document", + "steps": { + "configure": "Configure Signature" + }, + "type": { + "title": "Signature Type", + "draw": "Draw", + "canvas": "Canvas", + "image": "Image", + "text": "Text" + }, + "image": { + "label": "Upload signature image", + "placeholder": "Select image file", + "hint": "Upload a PNG or JPG image of your signature" + }, + "instructions": { + "title": "How to add signature", + "canvas": "After drawing your signature in the canvas, close the modal then click anywhere on the PDF to place it.", + "image": "After uploading your signature image above, click anywhere on the PDF to place it.", + "text": "After entering your name above, click anywhere on the PDF to place your signature." + }, + "mode": { + "move": "Move Signature", + "place": "Place Signature" + }, + "updateAndPlace": "Update and Place", + "activate": "Activate Signature Placement", + "deactivate": "Stop Placing Signatures", + "results": { + "title": "Signature Results" + }, + "error": { + "failed": "An error occurred while signing the PDF." + }, + "tags": "autorizovaÅĨ,iniciÃĄly,kreslenÃŊ podpis,textovÃŊ podpis,obrÃĄzkovÃŊ podpis" }, "flatten": { - "tags": "statickÊ,deaktivovaÅĨ,neinteraktívne,zjednoduÅĄiÅĨ", "title": "ZploÅĄtiÅĨ", "header": "ZploÅĄtiÅĨ PDF", "flattenOnlyForms": "ZploÅĄtiÅĨ iba formulÃĄre", "submit": "ZploÅĄtiÅĨ", + "filenamePrefix": "flattened", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, "steps": { "settings": "Nastavenia" }, "options": { - "flattenOnlyForms": "ZploÅĄtiÅĨ iba formulÃĄre" - } + "stepTitle": "Flatten Options", + "title": "Flatten Options", + "flattenOnlyForms": { + "label": "ZploÅĄtiÅĨ iba formulÃĄre", + "desc": "Only flatten form fields, leaving other interactive elements intact" + }, + "note": "Flattening removes interactive elements from the PDF, making them non-editable." + }, + "results": { + "title": "Flatten Results" + }, + "error": { + "failed": "An error occurred while flattening the PDF." + }, + "tooltip": { + "header": { + "title": "About Flattening PDFs" + }, + "description": { + "title": "What does flattening do?", + "text": "Flattening makes your PDF non-editable by turning fillable forms and buttons into regular text and images. The PDF will look exactly the same, but no one can change or fill in the forms anymore. Perfect for sharing completed forms, creating final documents for records, or ensuring the PDF looks the same everywhere.", + "bullet1": "Text boxes become regular text (can't be edited)", + "bullet2": "Checkboxes and buttons become pictures", + "bullet3": "Great for final versions you don't want changed", + "bullet4": "Ensures consistent appearance across all devices" + }, + "formsOnly": { + "title": "What does 'Flatten only forms' mean?", + "text": "This option only removes the ability to fill in forms, but keeps other features working like clicking links, viewing bookmarks, and reading comments.", + "bullet1": "Forms become non-editable", + "bullet2": "Links still work when clicked", + "bullet3": "Comments and notes remain visible", + "bullet4": "Bookmarks still help you navigate" + } + }, + "tags": "statickÊ,deaktivovaÅĨ,neinteraktívne,zjednoduÅĄiÅĨ" }, "repair": { "tags": "opraviÅĨ,obnoviÅĨ,oprava,obnovenie", "title": "OpraviÅĨ", "header": "OpraviÅĨ PDF", - "submit": "OpraviÅĨ" + "submit": "OpraviÅĨ", + "description": "This tool will attempt to repair corrupted or damaged PDF files. No additional settings are required.", + "filenamePrefix": "repaired", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst repairing the PDF." + }, + "results": { + "title": "Repair Results" + } }, "removeBlanks": { - "tags": "čistenie,zjednoduÅĄiÅĨ,neobsah,organizovaÅĨ", "title": "OdstrÃĄniÅĨ prÃĄzdne strÃĄnky", "header": "OdstrÃĄniÅĨ prÃĄzdne strÃĄnky", - "threshold": "PrahovÃĄ hodnota bielych pixelov:", + "settings": { + "title": "Settings" + }, + "threshold": { + "label": "Pixel Whiteness Threshold" + }, + "whitePercent": { + "label": "White Percentage Threshold", + "unit": "%" + }, + "includeBlankPages": { + "label": "Include detected blank pages" + }, + "tooltip": { + "header": { + "title": "Remove Blank Pages Settings" + }, + "threshold": { + "title": "Pixel Whiteness Threshold", + "text": "Controls how white a pixel must be to be considered 'white'. This helps determine what counts as a blank area on the page.", + "bullet1": "0 = Pure black (most restrictive)", + "bullet2": "128 = Medium grey", + "bullet3": "255 = Pure white (least restrictive)" + }, + "whitePercent": { + "title": "White Percentage Threshold", + "text": "Sets the minimum percentage of white pixels required for a page to be considered blank and removed.", + "bullet1": "Lower values (e.g., 80%) = More pages removed", + "bullet2": "Higher values (e.g., 95%) = Only very blank pages removed", + "bullet3": "Use higher values for documents with light backgrounds" + }, + "includeBlankPages": { + "title": "Include Detected Blank Pages", + "text": "When enabled, creates a separate PDF containing all the blank pages that were detected and removed from the original document.", + "bullet1": "Useful for reviewing what was removed", + "bullet2": "Helps verify the detection accuracy", + "bullet3": "Can be disabled to reduce output file size" + } + }, + "submit": "OdstrÃĄniÅĨ prÃĄzdne strÃĄnky", + "error": { + "failed": "Failed to remove blank pages" + }, + "results": { + "title": "Removed Blank Pages" + }, + "tags": "čistenie,zjednoduÅĄiÅĨ,neobsah,organizovaÅĨ", "thresholdDesc": "PrahovÃĄ hodnota pre určenie, ako biely musí byÅĨ biely pixel, aby bol klasifikovanÃŊ ako 'biely'. 0 = čierny, 255 = čistÃĄ biela.", - "whitePercent": "Percento bielych pixelov (%):", - "whitePercentDesc": "Percento strÃĄnky, ktorÊ musí byÅĨ 'biele' pixely, aby bola odstrÃĄnenÃĄ", - "submit": "OdstrÃĄniÅĨ prÃĄzdne strÃĄnky" + "whitePercentDesc": "Percento strÃĄnky, ktorÊ musí byÅĨ 'biele' pixely, aby bola odstrÃĄnenÃĄ" }, "removeAnnotations": { "tags": "komentÃĄre,zdôraznenie,poznÃĄmky,označenie,odstrÃĄniÅĨ", "title": "OdstrÃĄniÅĨ anotÃĄcie", "header": "OdstrÃĄniÅĨ anotÃĄcie", - "submit": "OdstrÃĄniÅĨ" + "submit": "OdstrÃĄniÅĨ", + "settings": { + "title": "Settings" + }, + "info": { + "title": "About Remove Annotations", + "description": "This tool will remove all annotations (comments, highlights, notes, etc.) from your PDF documents." + }, + "error": { + "failed": "An error occurred while removing annotations from the PDF." + } }, "compare": { "tags": "odliÅĄovaÅĨ,kontrast,zmeny,analÃŊza", @@ -1057,6 +2341,142 @@ "certSign": { "tags": "autentifikovaÅĨ,PEM,P12,oficiÃĄlne,ÅĄifrovaÅĨ", "title": "Podpis certifikÃĄtom", + "filenamePrefix": "signed", + "signMode": { + "stepTitle": "Sign Mode", + "tooltip": { + "header": { + "title": "About PDF Signatures" + }, + "overview": { + "title": "How signatures work", + "text": "Both modes seal the document (any edits are flagged as tampering) and record who/when/how for auditing. Viewer trust depends on the certificate chain." + }, + "manual": { + "title": "Manual - Bring your certificate", + "text": "Use your own certificate files for brand-aligned identity. Can display Trusted when your CA/chain is recognised.", + "use": "Use for: customer-facing, legal, compliance." + }, + "auto": { + "title": "Auto - Zero-setup, instant system seal", + "text": "Signs with a server self-signed certificate. Same tamper-evident seal and audit trail; typically shows Unverified in viewers.", + "use": "Use when: you need speed and consistent internal identity across reviews and records." + }, + "rule": { + "title": "Rule of thumb", + "text": "Need recipient Trusted status? Manual. Need a fast, tamper-evident seal and audit trail with no setup? Auto." + } + } + }, + "certTypeStep": { + "stepTitle": "Certificate Format" + }, + "certFiles": { + "stepTitle": "Certificate Files" + }, + "appearance": { + "stepTitle": "Signature Appearance", + "tooltip": { + "header": { + "title": "About Signature Appearance" + }, + "invisible": { + "title": "Invisible Signatures", + "text": "The signature is added to the PDF for security but won't be visible when viewing the document. Perfect for legal requirements without changing the document's appearance.", + "bullet1": "Provides security without visual changes", + "bullet2": "Meets legal requirements for digital signing", + "bullet3": "Doesn't affect document layout or design" + }, + "visible": { + "title": "Visible Signatures", + "text": "Shows a signature block on the PDF with your name, date, and optional details. Useful when you want readers to clearly see the document is signed.", + "bullet1": "Shows signer name and date on the document", + "bullet2": "Can include reason and location for signing", + "bullet3": "Choose which page to place the signature", + "bullet4": "Optional logo can be included" + } + }, + "invisible": "Invisible", + "options": { + "title": "Signature Details" + }, + "visible": "Visible" + }, + "sign": { + "submit": "Sign PDF", + "results": "Signed PDF" + }, + "error": { + "failed": "An error occurred whilst processing signatures." + }, + "tooltip": { + "header": { + "title": "About Managing Signatures" + }, + "overview": { + "title": "What can this tool do?", + "text": "This tool lets you check if your PDFs are digitally signed and add new digital signatures. Digital signatures prove who created or approved a document and show if it has been changed since signing.", + "bullet1": "Check existing signatures and their validity", + "bullet2": "View detailed information about signers and certificates", + "bullet3": "Add new digital signatures to secure your documents", + "bullet4": "Multiple files supported with easy navigation" + }, + "validation": { + "title": "Checking Signatures", + "text": "When you check signatures, the tool tells you if they're valid, who signed the document, when it was signed, and whether the document has been changed since signing.", + "bullet1": "Shows if signatures are valid or invalid", + "bullet2": "Displays signer information and signing date", + "bullet3": "Checks if the document was modified after signing", + "bullet4": "Can use custom certificates for verification" + }, + "signing": { + "title": "Adding Signatures", + "text": "To sign a PDF, you need a digital certificate (like PEM, PKCS12, or JKS). You can choose to make the signature visible on the document or keep it invisible for security only.", + "bullet1": "Supports PEM, PKCS12, JKS, and server certificate formats", + "bullet2": "Option to show or hide signature on the PDF", + "bullet3": "Add reason, location, and signer name", + "bullet4": "Choose which page to place visible signatures", + "bullet5": "Use server certificate for simple 'Sign with Stirling-PDF' option" + } + }, + "certType": { + "tooltip": { + "header": { + "title": "About Certificate Types" + }, + "what": { + "title": "What's a certificate?", + "text": "It's a secure ID for your signature that proves you signed. Unless you're required to sign via certificate, we recommend using another secure method like Type, Draw, or Upload." + }, + "which": { + "title": "Which option should I use?", + "text": "Choose the format that matches your certificate file:", + "bullet1": "PKCS#12 (.p12 / .pfx) – one combined file (most common)", + "bullet2": "PFX (.pfx) – Microsoft's version of PKCS12", + "bullet3": "PEM – separate private-key and certificate .pem files", + "bullet4": "JKS – Java .jks keystore for dev / CI-CD workflows" + }, + "convert": { + "title": "Key not listed?", + "text": "Convert your file to a Java keystore (.jks) with keytool, then pick JKS." + } + } + }, + "chooseCertificate": "Choose Certificate File", + "chooseJksFile": "Choose JKS File", + "chooseP12File": "Choose PKCS12 File", + "choosePfxFile": "Choose PFX File", + "choosePrivateKey": "Choose Private Key File", + "location": "Miesto", + "logoTitle": "Logo", + "name": "Meno", + "noLogo": "No Logo", + "pageNumber": "Page Number", + "password": "Zadajte heslo pre Keystore alebo sÃēkromnÃŊ kÄžÃēč (ak existuje):", + "passwordOptional": "Leave empty if no password", + "reason": "Dôvod", + "serverCertMessage": "Using server certificate - no files or password required", + "showLogo": "Show Logo", "header": "PodpísaÅĨ PDF certifikÃĄtom (PrÃĄca prebieha)", "selectPDF": "Vyberte PDF sÃēbor na podpis:", "jksNote": "PoznÃĄmka: Ak vÃĄÅĄ typ certifikÃĄtu nie je uvedenÃŊ niÅžÅĄie, prosím, konvertujte ho na Java Keystore (.jks) sÃēbor pomocou nÃĄstroja keytool. Potom vyberte moÅžnosÅĨ .jks sÃēbor niÅžÅĄie.", @@ -1064,13 +2484,7 @@ "selectCert": "Vyberte vÃĄÅĄ certifikÃĄtovÃŊ sÃēbor (formÃĄt X.509, môŞe byÅĨ .pem alebo .der):", "selectP12": "Vyberte vÃĄÅĄ PKCS#12 Keystore sÃēbor (.p12 alebo .pfx) (VoliteÄžnÊ, ak je poskytnutÊ, malo by obsahovaÅĨ vÃĄÅĄ sÃēkromnÃŊ kÄžÃēč a certifikÃĄt):", "selectJKS": "Vyberte vÃĄÅĄ Java Keystore sÃēbor (.jks alebo .keystore):", - "certType": "Typ certifikÃĄtu", - "password": "Zadajte heslo pre Keystore alebo sÃēkromnÃŊ kÄžÃēč (ak existuje):", "showSig": "ZobraziÅĨ podpis", - "reason": "Dôvod", - "location": "Miesto", - "name": "Meno", - "showLogo": "Show Logo", "submit": "PodpísaÅĨ PDF" }, "removeCertSign": { @@ -1078,7 +2492,18 @@ "title": "Remove Certificate Signature", "header": "Remove the digital certificate from the PDF", "selectPDF": "Select a PDF file:", - "submit": "Remove Signature" + "submit": "Remove Signature", + "description": "This tool will remove digital certificate signatures from your PDF document.", + "filenamePrefix": "unsigned", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst removing certificate signatures." + }, + "results": { + "title": "Certificate Removal Results" + } }, "pageLayout": { "tags": "zlÃēčiÅĨ,zjednotiÅĨ,jednostranovÃŊ pohÄžad,organizovaÅĨ", @@ -1086,16 +2511,157 @@ "header": "ViacstranovÊ usporiadanie", "pagesPerSheet": "StrÃĄnky na list:", "addBorder": "PridaÅĨ okraje", - "submit": "OdoslaÅĨ" + "submit": "OdoslaÅĨ", + "desc": { + "2": "Place 2 pages side-by-side on a single sheet.", + "3": "Place 3 pages on a single sheet in a single row.", + "4": "Place 4 pages on a single sheet (2 × 2 grid).", + "9": "Place 9 pages on a single sheet (3 × 3 grid).", + "16": "Place 16 pages on a single sheet (4 × 4 grid)." + }, + "error": { + "failed": "An error occurred while creating the multi-page layout." + } + }, + "bookletImposition": { + "tags": "booklet,imposition,printing,binding,folding,signature", + "title": "Booklet Imposition", + "header": "Booklet Imposition", + "submit": "Create Booklet", + "spineLocation": { + "label": "Spine Location", + "left": "Left (Standard)", + "right": "Right (RTL)" + }, + "doubleSided": { + "label": "Double-sided printing", + "tooltip": "Creates both front and back sides for proper booklet printing" + }, + "manualDuplex": { + "title": "Manual Duplex Mode", + "instructions": "For printers without automatic duplex. You'll need to run this twice:" + }, + "duplexPass": { + "label": "Print Pass", + "first": "1st Pass", + "second": "2nd Pass", + "firstInstructions": "Prints front sides → stack face-down → run again with 2nd Pass", + "secondInstructions": "Load printed stack face-down → prints back sides" + }, + "rtlBinding": { + "label": "Right-to-left binding", + "tooltip": "For Arabic, Hebrew, or other right-to-left languages" + }, + "addBorder": { + "label": "Add borders around pages", + "tooltip": "Adds borders around each page section to help with cutting and alignment" + }, + "addGutter": { + "label": "Add gutter margin", + "tooltip": "Adds inner margin space for binding" + }, + "gutterSize": { + "label": "Gutter size (points)" + }, + "flipOnShortEdge": { + "label": "Flip on short edge (automatic duplex only)", + "tooltip": "Enable for short-edge duplex printing (automatic duplex only - ignored in manual mode)", + "manualNote": "Not needed in manual mode - you flip the stack yourself" + }, + "advanced": { + "toggle": "Advanced Options" + }, + "paperSizeNote": "Paper size is automatically derived from your first page.", + "tooltip": { + "header": { + "title": "Booklet Creation Guide" + }, + "description": { + "title": "What is Booklet Imposition?", + "text": "Creates professional booklets by arranging pages in the correct printing order. Your PDF pages are placed 2-up on landscape sheets so when folded and bound, they read in proper sequence like a real book." + }, + "example": { + "title": "Example: 8-Page Booklet", + "text": "Your 8-page document becomes 2 sheets:", + "bullet1": "Sheet 1 Front: Pages 8, 1 | Back: Pages 2, 7", + "bullet2": "Sheet 2 Front: Pages 6, 3 | Back: Pages 4, 5", + "bullet3": "When folded & stacked: Reads 1→2→3→4→5→6→7→8" + }, + "printing": { + "title": "How to Print & Assemble", + "text": "Follow these steps for perfect booklets:", + "bullet1": "Print double-sided with 'Flip on long edge'", + "bullet2": "Stack sheets in order, fold in half", + "bullet3": "Staple or bind along the folded spine", + "bullet4": "For short-edge printers: Enable 'Flip on short edge' option" + }, + "manualDuplex": { + "title": "Manual Duplex (Single-sided Printers)", + "text": "For printers without automatic duplex:", + "bullet1": "Turn OFF 'Double-sided printing'", + "bullet2": "Select '1st Pass' → Print → Stack face-down", + "bullet3": "Select '2nd Pass' → Load stack → Print backs", + "bullet4": "Fold and assemble as normal" + }, + "advanced": { + "title": "Advanced Options", + "text": "Fine-tune your booklet:", + "bullet1": "Right-to-Left Binding: For Arabic, Hebrew, or RTL languages", + "bullet2": "Borders: Shows cut lines for trimming", + "bullet3": "Gutter Margin: Adds space for binding/stapling", + "bullet4": "Short-edge Flip: Only for automatic duplex printers" + } + }, + "error": { + "failed": "An error occurred while creating the booklet imposition." + } }, "scalePages": { - "tags": "veÄžkosÅĨ,modifikovaÅĨ,rozmery,prispôsobiÅĨ", "title": "UpraviÅĨ mierku strÃĄnky", "header": "UpraviÅĨ mierku strÃĄnky", "pageSize": "VeÄžkosÅĨ strÃĄnky dokumentu.", "keepPageSize": "Original Size", "scaleFactor": "Úroveň priblíŞenia (orezania) strÃĄnky.", - "submit": "OdoslaÅĨ" + "submit": "OdoslaÅĨ", + "tags": "veÄžkosÅĨ,modifikovaÅĨ,rozmery,prispôsobiÅĨ" + }, + "adjustPageScale": { + "tags": "resize,modify,dimension,adapt", + "title": "Adjust Page Scale", + "header": "Adjust Page Scale", + "scaleFactor": { + "label": "Scale Factor" + }, + "pageSize": { + "label": "Target Page Size", + "keep": "Keep Original Size", + "letter": "Letter", + "legal": "Legal" + }, + "submit": "Adjust Page Scale", + "error": { + "failed": "An error occurred while adjusting the page scale." + }, + "tooltip": { + "header": { + "title": "Page Scale Settings Overview" + }, + "description": { + "title": "Description", + "text": "Adjust the size of PDF content and change the page dimensions." + }, + "scaleFactor": { + "title": "Scale Factor", + "text": "Controls how large or small the content appears on the page. Content is scaled and centred - if scaled content is larger than the page size, it may be cropped.", + "bullet1": "1.0 = Original size", + "bullet2": "0.5 = Half size (50% smaller)", + "bullet3": "2.0 = Double size (200% larger, may crop)" + }, + "pageSize": { + "title": "Target Page Size", + "text": "Sets the dimensions of the output PDF pages. 'Keep Original Size' maintains current dimensions, whilst other options resize to standard paper sizes." + } + } }, "add-page-numbers": { "tags": "číslovaÅĨ,označiÅĨ,organizovaÅĨ,indexovaÅĨ" @@ -1104,16 +2670,83 @@ "tags": "auto-detekcia, zaloÅženÊ na zÃĄhlaví, organizovaÅĨ, premenovaÅĨ", "title": "AutomatickÊ premenovanie", "header": "AutomatickÊ premenovanie PDF", - "submit": "Automaticky premenovaÅĨ" + "description": "Automatically finds the title from your PDF content and uses it as the filename.", + "submit": "Automaticky premenovaÅĨ", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst auto-renaming the PDF." + }, + "results": { + "title": "Auto-Rename Results" + }, + "tooltip": { + "header": { + "title": "How Auto-Rename Works" + }, + "howItWorks": { + "title": "Smart Renaming", + "text": "Automatically finds the title from your PDF content and uses it as the filename.", + "bullet1": "Looks for text that appears to be a title or heading", + "bullet2": "Creates a clean, valid filename from the detected title", + "bullet3": "Keeps the original name if no suitable title is found" + } + } }, "adjust-contrast": { "tags": "farbovÃĄ korekcia, doladenie, upraviÅĨ, zlepÅĄiÅĨ" }, "crop": { - "tags": "orezaÅĨ, zmenÅĄiÅĨ, upraviÅĨ, tvarovaÅĨ", "title": "OrezaÅĨ", "header": "OrezaÅĨ PDF", - "submit": "OdoslaÅĨ" + "submit": "OdoslaÅĨ", + "noFileSelected": "Select a PDF file to begin cropping", + "preview": { + "title": "Crop Area Selection" + }, + "reset": "Reset to full PDF", + "coordinates": { + "title": "Position and Size", + "x": { + "label": "X Position", + "desc": "Left edge (points)" + }, + "y": { + "label": "Y Position", + "desc": "Bottom edge (points)" + }, + "width": { + "label": "Width", + "desc": "Crop width (points)" + }, + "height": { + "label": "Height", + "desc": "Crop height (points)" + } + }, + "error": { + "invalidArea": "Crop area extends beyond PDF boundaries", + "failed": "Failed to crop PDF" + }, + "steps": { + "selectArea": "Select Crop Area" + }, + "tooltip": { + "title": "How to Crop PDFs", + "description": "Select the area to crop from your PDF by dragging and resizing the blue overlay on the thumbnail.", + "drag": "Drag the overlay to move the crop area", + "resize": "Drag the corner and edge handles to resize", + "precision": "Use coordinate inputs for precise positioning" + }, + "results": { + "title": "Crop Results" + }, + "automation": { + "info": "Enter crop coordinates in PDF points. Origin (0,0) is at bottom-left. These values will be applied to all PDFs processed in this automation.", + "reference": "Reference: A4 page is 595.28 × 841.89 points (210mm × 297mm). 1 inch = 72 points." + }, + "tags": "orezaÅĨ, zmenÅĄiÅĨ, upraviÅĨ, tvarovaÅĨ" }, "autoSplitPDF": { "tags": "QR-zaloÅženÊ, rozdeÄž, skenovanie-segment, organizovaÅĨ", @@ -1196,24 +2829,124 @@ "downloadJS": "StiahnuÅĨ JavaScript", "submit": "ZobraziÅĨ" }, - "autoRedact": { - "tags": "redigovaÅĨ, skryÅĨ, zatieniÅĨ, čierne, marker, skrytÊ", - "title": "AutomatickÊ redigovanie", - "header": "AutomatickÊ redigovanie", - "colorLabel": "Farba", - "textsToRedactLabel": "Text na redigovanie (oddelenÃŊ riadkami)", - "textsToRedactPlaceholder": "napr. \\nDôvernÊ \\nPrísne tajnÊ", - "useRegexLabel": "PouÅžiÅĨ Regex", - "wholeWordSearchLabel": "VyhÄžadÃĄvanie celÃŊch slov", - "customPaddingLabel": "VlastnÊ odsadenie", - "convertPDFToImageLabel": "KonvertovaÅĨ PDF na PDF-ObrÃĄzok (PouŞíva sa na odstrÃĄnenie textu za boxom)", - "submitButton": "OdoslaÅĨ" - }, "redact": { "tags": "Redact,Hide,black out,black,marker,hidden,manual", "title": "Manual Redaction", - "header": "Manual Redaction", "submit": "Manual Redaction", + "error": { + "failed": "An error occurred while redacting the PDF." + }, + "modeSelector": { + "title": "Redaction Method", + "mode": "Mode", + "automatic": "Automatic", + "automaticDesc": "Redact text based on search terms", + "manual": "Manual", + "manualDesc": "Click and drag to redact specific areas", + "manualComingSoon": "Manual redaction coming soon" + }, + "auto": { + "header": "Auto Redact", + "settings": { + "title": "Redaction Settings", + "advancedTitle": "Advanced" + }, + "colorLabel": "Box Colour", + "wordsToRedact": { + "title": "Words to Redact", + "placeholder": "Enter a word", + "add": "PridaÅĨ", + "examples": "Examples: Confidential, Top-Secret" + }, + "useRegexLabel": "Use Regex", + "wholeWordSearchLabel": "Whole Word Search", + "customPaddingLabel": "Custom Extra Padding", + "convertPDFToImageLabel": "Convert PDF to PDF-Image" + }, + "tooltip": { + "mode": { + "header": { + "title": "Redaction Method" + }, + "automatic": { + "title": "Automatic Redaction", + "text": "Automatically finds and redacts specified text throughout the document. Perfect for removing consistent sensitive information like names, addresses, or confidential markers." + }, + "manual": { + "title": "Manual Redaction", + "text": "Click and drag to manually select specific areas to redact. Gives you precise control over what gets redacted. (Coming soon)" + } + }, + "words": { + "header": { + "title": "Words to Redact" + }, + "description": { + "title": "Text Matching", + "text": "Enter words or phrases to find and redact in your document. Each word will be searched for separately." + }, + "bullet1": "Add one word at a time", + "bullet2": "Press Enter or click 'Add Another' to add", + "bullet3": "Click × to remove words", + "examples": { + "title": "Common Examples", + "text": "Typical words to redact include: bank details, email addresses, or specific names." + } + }, + "advanced": { + "header": { + "title": "Advanced Redaction Settings" + }, + "color": { + "title": "Box Colour & Padding", + "text": "Customise the appearance of redaction boxes. Black is standard, but you can choose any colour. Padding adds extra space around the found text." + }, + "regex": { + "title": "Use Regex", + "text": "Enable regular expressions for advanced pattern matching. Useful for finding phone numbers, emails, or complex patterns.", + "bullet1": "Example: \\d{4}-\\d{2}-\\d{2} to match any dates in YYYY-MM-DD format", + "bullet2": "Use with caution - test thoroughly" + }, + "wholeWord": { + "title": "Whole Word Search", + "text": "Only match complete words, not partial matches. 'John' won't match 'Johnson' when enabled." + }, + "convert": { + "title": "Convert to PDF-Image", + "text": "Converts the PDF to an image-based PDF after redaction. This ensures text behind redaction boxes is completely removed and unrecoverable." + } + } + }, + "manual": { + "header": "Manual Redaction", + "textBasedRedaction": "Text-based Redaction", + "pageBasedRedaction": "Page-based Redaction", + "convertPDFToImageLabel": "Convert PDF to PDF-Image (Used to remove text behind the box)", + "pageRedactionNumbers": { + "title": "Pages", + "placeholder": "(napr. 1,2,8 alebo 4,7,12-16 alebo 2n-1)" + }, + "redactionColor": { + "title": "Redaction Colour" + }, + "export": "Export", + "upload": "Upload", + "boxRedaction": "Box draw redaction", + "zoom": "Zoom", + "zoomIn": "Zoom in", + "zoomOut": "Zoom out", + "nextPage": "Next Page", + "previousPage": "Previous Page", + "toggleSidebar": "Toggle Sidebar", + "showThumbnails": "Show Thumbnails", + "showDocumentOutline": "Show Document Outline (double-click to expand/collapse all items)", + "showAttachments": "Show Attachments", + "showLayers": "Show Layers (double-click to reset all layers to the default state)", + "colourPicker": "Colour Picker", + "findCurrentOutlineItem": "Find current outline item", + "applyChanges": "Apply Changes" + }, + "header": "Manual Redaction", "textBasedRedaction": "Text based Redaction", "pageBasedRedaction": "Page-based Redaction", "convertPDFToImageLabel": "Convert PDF to PDF-Image (Used to remove text behind the box)", @@ -1239,17 +2972,7 @@ "showLayers": "Show Layers (double-click to reset all layers to the default state)", "colourPicker": "Colour Picker", "findCurrentOutlineItem": "Find current outline item", - "applyChanges": "Apply Changes", - "auto": { - "wordsToRedact": { - "add": "PridaÅĨ" - } - }, - "manual": { - "pageRedactionNumbers": { - "placeholder": "(napr. 1,2,8 alebo 4,7,12-16 alebo 2n-1)" - } - } + "applyChanges": "Apply Changes" }, "tableExtraxt": { "tags": "CSV, extrakcia tabuliek, extrahovaÅĨ, konvertovaÅĨ" @@ -1260,11 +2983,15 @@ "overlay-pdfs": { "tags": "prekrÃŊvanie", "header": "Prekrytie PDF sÃēborov", + "title": "Overlay PDFs", + "desc": "Overlay one PDF on top of another", "baseFile": { "label": "Vyberte zÃĄkladnÃŊ PDF sÃēbor" }, "overlayFiles": { - "label": "Vyberte prekryvnÊ PDF sÃēbory" + "label": "Vyberte prekryvnÊ PDF sÃēbory", + "placeholder": "Choose PDF(s)...", + "addMore": "Add more PDFs..." }, "mode": { "label": "Vyberte reÅžim prekrytia", @@ -1274,14 +3001,53 @@ }, "counts": { "label": "Počty prekrytí (pre reÅžim pevnÊho opakovania)", - "placeholder": "Zadajte počty oddelenÊ čiarkami (napr. 2,3,1)" + "placeholder": "Zadajte počty oddelenÊ čiarkami (napr. 2,3,1)", + "item": "Count for file", + "noFiles": "Add overlay files to configure counts" }, "position": { "label": "Vyberte pozíciu prekrytia", "foreground": "Popredie", "background": "Pozadie" }, - "submit": "OdoslaÅĨ" + "submit": "OdoslaÅĨ", + "settings": { + "title": "Settings" + }, + "results": { + "title": "Overlay Results" + }, + "tooltip": { + "header": { + "title": "Overlay PDFs Overview" + }, + "description": { + "title": "Description", + "text": "Combine a base PDF with one or more overlay PDFs. Overlays can be applied page-by-page in different modes and placed in the foreground or background." + }, + "mode": { + "title": "Overlay Mode", + "text": "Choose how to distribute overlay pages across the base PDF pages.", + "sequential": "Sequential Overlay: Use pages from the first overlay PDF until it ends, then move to the next.", + "interleaved": "Interleaved Overlay: Take one page from each overlay in turn.", + "fixedRepeat": "Fixed Repeat Overlay: Take a set number of pages from each overlay before moving to the next. Use Counts to set the numbers." + }, + "position": { + "title": "Overlay Position", + "text": "Foreground places the overlay on top of the page. Background places it behind." + }, + "overlayFiles": { + "title": "Overlay Files", + "text": "Select one or more PDFs to overlay on the base. The order of these files affects how pages are applied in Sequential and Fixed Repeat modes." + }, + "counts": { + "title": "Counts (Fixed Repeat only)", + "text": "Provide a positive number for each overlay file showing how many pages to take before moving to the next. Required when mode is Fixed Repeat." + } + }, + "error": { + "failed": "An error occurred while overlaying PDFs." + } }, "split-by-sections": { "tags": "rozdelenie sekcií, rozdeliÅĨ, prispôsobiÅĨ", @@ -1302,6 +3068,7 @@ "tags": "pečiatka, pridaÅĨ obrÃĄzok, stred obrÃĄzka, vodotlač, PDF, vloÅžiÅĨ, prispôsobiÅĨ", "header": "Pečiatka PDF", "title": "Pečiatka PDF", + "stampSetup": "Stamp Setup", "stampType": "Typ pečiatky", "stampText": "Text pečiatky", "stampImage": "ObrÃĄzok pečiatky", @@ -1314,7 +3081,19 @@ "overrideY": "NahradiÅĨ sÃēradnicu Y", "customMargin": "VlastnÃŊ okraj", "customColor": "VlastnÃĄ farba textu", - "submit": "OdoslaÅĨ" + "submit": "OdoslaÅĨ", + "noStampSelected": "No stamp selected. Return to Step 1.", + "customPosition": "Drag the stamp to the desired location in the preview window.", + "error": { + "failed": "An error occurred while adding stamp to the PDF." + }, + "imageSize": "Image Size", + "margin": "Margin", + "positionAndFormatting": "Position & Formatting", + "quickPosition": "Select a position on the page to place the stamp.", + "results": { + "title": "Stamp Results" + } }, "removeImagePdf": { "tags": "Remove Image,Page operations,Back end,server side" @@ -1332,7 +3111,8 @@ "status": { "_value": "Status", "valid": "Valid", - "invalid": "Invalid" + "invalid": "Invalid", + "complete": "Validation complete" }, "signer": "Signer", "date": "Date", @@ -1359,40 +3139,122 @@ "version": "Verzia", "keyUsage": "Key Usage", "selfSigned": "Self-Signed", - "bits": "bits" + "bits": "bits", + "details": "Certificate Details" }, "signature": { "info": "Signature Information", "_value": "Signature", "mathValid": "Signature is mathematically valid BUT:" }, - "selectCustomCert": "Custom Certificate File X.509 (Optional)" - }, - "replace-color": { - "title": "Replace-Invert-Color", - "header": "Replace-Invert Color PDF", - "selectText": { - "1": "Replace or Invert color Options", - "2": "Default(Default high contrast colors)", - "3": "Custom(Customized colors)", - "4": "Full-Invert(Invert all colors)", - "5": "High contrast color options", - "6": "white text on black background", - "7": "Black text on white background", - "8": "Yellow text on black background", - "9": "Green text on black background", - "10": "Choose text Color", - "11": "Choose background Color" + "selectCustomCert": "Custom Certificate File X.509 (Optional)", + "downloadCsv": "Download CSV", + "downloadJson": "Download JSON", + "downloadPdf": "Download PDF Report", + "downloadType": { + "csv": "CSV", + "json": "JSON", + "pdf": "PDF" }, - "submit": "Replace" + "error": { + "allFailed": "Unable to validate the selected files.", + "partial": "Some files could not be validated.", + "reportGeneration": "Could not generate the PDF report. JSON and CSV are available.", + "unexpected": "Unexpected error during validation." + }, + "finalizing": "Preparing downloads...", + "issue": { + "certExpired": "Certificate expired", + "certRevocationUnknown": "Certificate revocation status unknown", + "certRevoked": "Certificate revoked", + "chainInvalid": "Certificate chain invalid", + "signatureInvalid": "Signature cryptographic check failed", + "trustInvalid": "Certificate not trusted" + }, + "noResults": "Run the validation to generate a report.", + "noSignaturesShort": "No signatures", + "processing": "Validating signatures...", + "report": { + "continued": "Continued", + "downloads": "Downloads", + "entryLabel": "Signature Summary", + "fields": { + "created": "Created", + "fileSize": "File Size", + "signatureCount": "Total Signatures", + "signatureDate": "Signature Date" + }, + "filesEvaluated": "{{count}} files evaluated", + "footer": "Validated via Stirling PDF", + "generatedAt": "Generated", + "noPdf": "PDF report will be available after a successful validation.", + "page": "Page", + "shortTitle": "Signature Summary", + "signatureCountLabel": "{{count}} signatures", + "signaturesFound": "{{count}} signatures detected", + "signaturesValid": "{{count}} fully valid", + "title": "Signature Validation Report" + }, + "settings": { + "certHint": "Upload a trusted X.509 certificate to validate against a custom trust source.", + "title": "Validation Settings" + }, + "signatureDate": "Signature Date", + "totalSignatures": "Total Signatures" }, - "replaceColorPdf": { - "tags": "Replace Color,Page operations,Back end,server side" + "replaceColor": { + "tags": "Replace Colour,Page operations,Back end,server side", + "labels": { + "settings": "Settings", + "colourOperation": "Colour operation" + }, + "options": { + "highContrast": "High contrast", + "invertAll": "Invert all colours", + "custom": "Custom", + "cmyk": "Convert to CMYK" + }, + "tooltip": { + "header": { + "title": "Replace & Invert Colour Settings Overview" + }, + "description": { + "title": "Description", + "text": "Transform PDF colours to improve readability and accessibility. Choose from high contrast presets, invert all colours, or create custom colour schemes." + }, + "highContrast": { + "title": "High Contrast", + "text": "Apply predefined high contrast colour combinations designed for better readability and accessibility compliance.", + "bullet1": "White text on black background - Classic dark mode", + "bullet2": "Black text on white background - Standard high contrast", + "bullet3": "Yellow text on black background - High visibility option", + "bullet4": "Green text on black background - Alternative high contrast" + }, + "invertAll": { + "title": "Invert All Colours", + "text": "Completely invert all colours in the PDF, creating a negative-like effect. Useful for creating dark mode versions of documents or reducing eye strain in low-light conditions." + }, + "custom": { + "title": "Custom Colours", + "text": "Define your own text and background colours using the colour pickers. Perfect for creating branded documents or specific accessibility requirements.", + "bullet1": "Text colour - Choose the colour for text elements", + "bullet2": "Background colour - Set the background colour for the document" + }, + "cmyk": { + "title": "Convert to CMYK", + "text": "Convert the PDF from RGB colour space to CMYK colour space, optimized for professional printing. This process converts colours to the Cyan, Magenta, Yellow, Black model used by printers." + } + }, + "error": { + "failed": "An error occurred while processing the colour replacement." + } }, "login": { "title": "PrihlÃĄsenie", "header": "PrihlÃĄsenie", "signin": "PrihlÃĄsiÅĨ sa", + "signInWith": "Sign in with", + "signInAnonymously": "Sign Up as a Guest", "rememberme": "ZapamätaÅĨ si ma", "invalid": "NeplatnÊ pouŞívateÄžskÊ meno alebo heslo.", "locked": "VÃĄÅĄ Ãēčet bol uzamknutÃŊ.", @@ -1411,12 +3273,83 @@ "alreadyLoggedIn": "You are already logged in to", "alreadyLoggedIn2": "devices. Please log out of the devices and try again.", "toManySessions": "You have too many active sessions", - "logoutMessage": "You have been logged out." + "logoutMessage": "You have been logged out.", + "youAreLoggedIn": "You are logged in!", + "email": "Email", + "password": "Password", + "enterEmail": "Enter your email", + "enterPassword": "Enter your password", + "loggingIn": "Logging In...", + "username": "Username", + "enterUsername": "Enter username", + "useEmailInstead": "Login with email", + "forgotPassword": "Forgot your password?", + "logIn": "Log In", + "signingIn": "Signing in...", + "login": "Login", + "or": "Or", + "useMagicLink": "Use magic link instead", + "enterEmailForMagicLink": "Enter your email for magic link", + "sending": "Sendingâ€Ļ", + "sendMagicLink": "Send Magic Link", + "cancel": "Cancel", + "dontHaveAccount": "Don't have an account? Sign up", + "home": "Home", + "debug": "Debug", + "signOut": "Sign Out", + "pleaseEnterBoth": "Please enter both email and password", + "pleaseEnterEmail": "Please enter your email address", + "magicLinkSent": "Magic link sent to {{email}}! Check your email and click the link to sign in.", + "passwordResetSent": "Password reset link sent to {{email}}! Check your email and follow the instructions.", + "failedToSignIn": "Failed to sign in with {{provider}}: {{message}}", + "unexpectedError": "Unexpected error: {{message}}", + "accountCreatedSuccess": "Account created successfully! You can now sign in.", + "passwordChangedSuccess": "Password changed successfully! Please sign in with your new password.", + "credentialsUpdated": "Your credentials have been updated. Please sign in again." + }, + "signup": { + "title": "Create an account", + "subtitle": "Join Stirling PDF to get started", + "name": "Name", + "email": "Email", + "password": "Password", + "confirmPassword": "Confirm password", + "enterName": "Enter your name", + "enterEmail": "Enter your email", + "enterPassword": "Enter your password", + "confirmPasswordPlaceholder": "Confirm password", + "or": "or", + "creatingAccount": "Creating Account...", + "signUp": "Sign Up", + "alreadyHaveAccount": "Already have an account? Sign in", + "pleaseFillAllFields": "Please fill in all fields", + "passwordsDoNotMatch": "Passwords do not match", + "passwordTooShort": "Password must be at least 6 characters long", + "invalidEmail": "Please enter a valid email address", + "checkEmailConfirmation": "Check your email for a confirmation link to complete your registration.", + "accountCreatedSuccessfully": "Account created successfully! You can now sign in.", + "unexpectedError": "Unexpected error: {{message}}", + "useEmailInstead": "Use Email Instead", + "nameRequired": "Name is required", + "emailRequired": "Email is required", + "passwordRequired": "Password is required", + "confirmPasswordRequired": "Please confirm your password" }, "pdfToSinglePage": { "title": "PDF na jednu strÃĄnku", "header": "PDF na jednu strÃĄnku", - "submit": "KonvertovaÅĨ na jednu strÃĄnku" + "submit": "KonvertovaÅĨ na jednu strÃĄnku", + "description": "This tool will merge all pages of your PDF into one large single page. The width will remain the same as the original pages, but the height will be the sum of all page heights.", + "filenamePrefix": "single_page", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst converting to single page." + }, + "results": { + "title": "Single Page Results" + } }, "pageExtracter": { "title": "ExtrahovaÅĨ strÃĄnky", @@ -1440,18 +3373,59 @@ "adjustContrast": { "title": "UpraviÅĨ kontrast", "header": "UpraviÅĨ kontrast", + "basic": "Basic Adjustments", "contrast": "Kontrast:", "brightness": "Jas:", "saturation": "SÃŊtosÅĨ:", - "download": "StiahnuÅĨ" + "download": "StiahnuÅĨ", + "adjustColors": "Adjust Colors", + "blue": "Blue", + "confirm": "Confirm", + "error": { + "failed": "Failed to adjust colors/contrast" + }, + "green": "Green", + "noPreview": "Select a PDF to preview", + "red": "Red", + "results": { + "title": "Adjusted PDF" + } }, "compress": { "title": "KomprimovaÅĨ", + "desc": "Compress PDFs to reduce their file size.", "header": "KomprimovaÅĨ PDF", + "method": { + "title": "Compression Method", + "quality": "Quality", + "filesize": "File Size" + }, "credit": "TÃĄto sluÅžba pouŞíva qpdf pre kompresiu/optimalizÃĄciu PDF.", "grayscale": { "label": "PouÅžiÅĨ odtiene ÅĄedej na kompresiu" }, + "tooltip": { + "header": { + "title": "Compress Settings Overview" + }, + "description": { + "title": "Description", + "text": "Compression is an easy way to reduce your file size. Pick File Size to enter a target size and have us adjust quality for you. Pick Quality to set compression strength manually." + }, + "qualityAdjustment": { + "title": "Quality Adjustment", + "text": "Drag the slider to adjust the compression strength. Lower values (1-3) preserve quality but result in larger files. Higher values (7-9) shrink the file more but reduce image clarity.", + "bullet1": "Lower values preserve quality", + "bullet2": "Higher values reduce file size" + }, + "grayscale": { + "title": "Grayscale", + "text": "Select this option to convert all images to black and white, which can significantly reduce file size especially for scanned PDFs or image-heavy documents." + } + }, + "error": { + "failed": "An error occurred while compressing the PDF." + }, "selectText": { "1": { "_value": "Compression Settings", @@ -1562,7 +3536,13 @@ "title": "Remove image", "header": "Remove image", "removeImage": "Remove image", - "submit": "Remove image" + "submit": "Remove image", + "error": { + "failed": "Failed to remove images from the PDF." + }, + "results": { + "title": "Remove Images Results" + } }, "splitByChapters": { "title": "Split PDF by Chapters", @@ -1596,6 +3576,12 @@ }, "note": "Release notes are only available in English" }, + "swagger": { + "title": "API Documentation", + "header": "API Documentation", + "desc": "View and test the Stirling PDF API endpoints", + "tags": "api,documentation,swagger,endpoints,development" + }, "cookieBanner": { "popUp": { "title": "How we use Cookies", @@ -1631,41 +3617,943 @@ "title": "Analytics", "description": "These cookies help us understand how our tools are being used, so we can focus on building the features our community values most. Rest assured—Stirling PDF cannot and will never track the content of the documents you work with." } + }, + "services": { + "posthog": "PostHog Analytics", + "scarf": "Scarf Pixel" } }, - "download": "StiahnuÅĨ", - "convert": { - "title": "KonvertovaÅĨ", - "settings": "Nastavenia", - "color": "Farba", - "greyscale": "Odtiene ÅĄedej", - "fillPage": "VyplniÅĨ strÃĄnku", - "grayscale": "Odtiene ÅĄedej" + "removeMetadata": { + "submit": "Remove Metadata" }, - "attachments": { - "tags": "embed,attach,file,attachment,attachments", - "title": "Add attachments", - "header": "Add attachments", - "submit": "Add attachments" + "sidebar": { + "toggle": "Toggle Sidebar" + }, + "theme": { + "toggle": "Toggle Theme" + }, + "view": { + "viewer": "Viewer", + "pageEditor": "Page Editor", + "fileManager": "File Manager" + }, + "pageEditor": { + "title": "Page Editor", + "save": "Save Changes", + "noPdfLoaded": "No PDF loaded. Please upload a PDF to edit.", + "rotatedLeft": "Rotated left:", + "rotatedRight": "Rotated right:", + "deleted": "Deleted:", + "movedLeft": "Moved left:", + "movedRight": "Moved right:", + "splitAt": "Split at:", + "insertedPageBreak": "Inserted page break at:", + "addFileNotImplemented": "Add file not implemented in demo", + "closePdf": "Close PDF", + "reset": "Reset Changes", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "fitToWidth": "Fit to Width", + "actualSize": "Actual Size" + }, + "viewer": { + "firstPage": "First Page", + "lastPage": "Last Page", + "previousPage": "Previous Page", + "nextPage": "Next Page", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "singlePageView": "Single Page View", + "dualPageView": "Dual Page View" + }, + "rightRail": { + "closeSelected": "Close Selected Files", + "selectAll": "Select All", + "deselectAll": "Deselect All", + "selectByNumber": "Select by Page Numbers", + "deleteSelected": "Delete Selected Pages", + "closePdf": "Close PDF", + "exportAll": "Export PDF", + "downloadSelected": "Download Selected Files", + "downloadAll": "Download All", + "toggleTheme": "Toggle Theme", + "language": "Language", + "search": "Search PDF", + "panMode": "Pan Mode", + "rotateLeft": "Rotate Left", + "rotateRight": "Rotate Right", + "toggleSidebar": "Toggle Sidebar", + "exportSelected": "Export Selected Pages", + "toggleAnnotations": "Toggle Annotations Visibility", + "annotationMode": "Toggle Annotation Mode", + "draw": "Draw", + "save": "Save" + }, + "search": { + "title": "Search PDF", + "placeholder": "Enter search term...", + "noResults": "No results found", + "searching": "Searching..." + }, + "guestBanner": { + "title": "You're using Stirling PDF as a guest!", + "message": "Create a free account to save your work, access more features, and support the project.", + "dismiss": "Dismiss banner", + "signUp": "Sign Up Free" + }, + "toolPicker": { + "searchPlaceholder": "Search tools...", + "noToolsFound": "No tools found", + "allTools": "ALL TOOLS", + "quickAccess": "QUICK ACCESS", + "categories": { + "standardTools": "Standard Tools", + "advancedTools": "Advanced Tools", + "recommendedTools": "Recommended Tools" + }, + "subcategories": { + "signing": "Signing", + "documentSecurity": "Document Security", + "verification": "Verification", + "documentReview": "Document Review", + "pageFormatting": "Page Formatting", + "extraction": "Extraction", + "removal": "Removal", + "automation": "Automation", + "general": "General", + "advancedFormatting": "Advanced Formatting", + "developerTools": "Developer Tools" + } }, "quickAccess": { - "sign": "PodpísaÅĨ" + "read": "Read", + "sign": "PodpísaÅĨ", + "automate": "Automate", + "files": "Files", + "activity": "Activity", + "help": "Help", + "account": "Account", + "config": "Config", + "adminSettings": "Admin Settings", + "allTools": "All Tools" + }, + "admin": { + "error": "Error", + "success": "Success", + "expand": "Expand", + "close": "Close", + "status": { + "active": "Active", + "inactive": "Inactive" + }, + "settings": { + "title": "Admin Settings", + "workspace": "Workspace", + "fetchError": "Failed to load settings", + "saveError": "Failed to save settings", + "saved": "Settings saved successfully", + "saveSuccess": "Settings saved successfully", + "save": "Save Changes", + "restartRequired": "Restart Required", + "restart": { + "title": "Restart Required", + "message": "Settings have been saved successfully. A server restart is required for the changes to take effect.", + "question": "Would you like to restart the server now or later?", + "now": "Restart Now", + "later": "Restart Later" + }, + "restarting": "Restarting Server", + "restartingMessage": "The server is restarting. Please wait a moment...", + "restartError": "Failed to restart server. Please restart manually.", + "general": { + "title": "System Settings", + "description": "Configure system-wide application settings including branding and default behaviour.", + "ui": "User Interface", + "system": "System", + "appName": { + "label": "Application Name", + "description": "The name displayed in the browser tab and home page" + }, + "appNameNavbar": { + "label": "Navbar Brand", + "description": "The name displayed in the navigation bar" + }, + "homeDescription": { + "label": "Home Description", + "description": "The description text shown on the home page" + }, + "defaultLocale": { + "label": "Default Locale", + "description": "The default language for new users (e.g., en_US, es_ES)" + }, + "fileUploadLimit": { + "label": "File Upload Limit", + "description": "Maximum file upload size (e.g., 100MB, 1GB)" + }, + "showUpdate": { + "label": "Show Update Notifications", + "description": "Display notifications when a new version is available" + }, + "showUpdateOnlyAdmin": { + "label": "Show Updates to Admins Only", + "description": "Restrict update notifications to admin users only" + }, + "customHTMLFiles": { + "label": "Custom HTML Files", + "description": "Allow serving custom HTML files from the customFiles directory" + }, + "languages": { + "label": "Available Languages", + "description": "Languages that users can select from (leave empty to enable all languages)" + }, + "customMetadata": { + "label": "Custom Metadata", + "autoUpdate": { + "label": "Auto Update Metadata", + "description": "Automatically update PDF metadata on all processed documents" + }, + "author": { + "label": "Default Author", + "description": "Default author for PDF metadata (e.g., username)" + }, + "creator": { + "label": "Default Creator", + "description": "Default creator for PDF metadata" + }, + "producer": { + "label": "Default Producer", + "description": "Default producer for PDF metadata" + } + }, + "customPaths": { + "label": "Custom Paths", + "description": "Configure custom file system paths for pipeline processing and external tools", + "pipeline": { + "label": "Pipeline Directories", + "watchedFoldersDir": { + "label": "Watched Folders Directory", + "description": "Directory where pipeline monitors for incoming PDFs (leave empty for default: /pipeline/watchedFolders)" + }, + "finishedFoldersDir": { + "label": "Finished Folders Directory", + "description": "Directory where processed PDFs are outputted (leave empty for default: /pipeline/finishedFolders)" + } + }, + "operations": { + "label": "External Tool Paths", + "weasyprint": { + "label": "WeasyPrint Executable", + "description": "Path to WeasyPrint executable for HTML to PDF conversion (leave empty for default: /opt/venv/bin/weasyprint)" + }, + "unoconvert": { + "label": "Unoconvert Executable", + "description": "Path to LibreOffice unoconvert for document conversions (leave empty for default: /opt/venv/bin/unoconvert)" + } + } + } + }, + "security": { + "title": "Security", + "description": "Configure authentication, login behaviour, and security policies.", + "ssoNotice": { + "title": "Looking for SSO/SAML settings?", + "message": "OAuth2 and SAML2 authentication providers have been moved to the Connections menu for easier management." + }, + "authentication": "Authentication", + "enableLogin": { + "label": "Enable Login", + "description": "Require users to log in before accessing the application" + }, + "loginMethod": { + "label": "Login Method", + "description": "The authentication method to use for user login", + "all": "All Methods", + "normal": "Username/Password Only", + "oauth2": "OAuth2 Only", + "saml2": "SAML2 Only" + }, + "loginAttemptCount": { + "label": "Login Attempt Limit", + "description": "Maximum number of failed login attempts before account lockout" + }, + "loginResetTimeMinutes": { + "label": "Login Reset Time (minutes)", + "description": "Time before failed login attempts are reset" + }, + "csrfDisabled": { + "label": "Disable CSRF Protection", + "description": "Disable Cross-Site Request Forgery protection (not recommended)" + }, + "initialLogin": { + "label": "Initial Login", + "username": { + "label": "Initial Username", + "description": "The username for the initial admin account" + }, + "password": { + "label": "Initial Password", + "description": "The password for the initial admin account" + } + }, + "jwt": { + "label": "JWT Configuration", + "secureCookie": { + "label": "Secure Cookie", + "description": "Require HTTPS for JWT cookies (recommended for production)" + }, + "keyRetentionDays": { + "label": "Key Retention Days", + "description": "Number of days to retain old JWT keys for verification" + }, + "persistence": { + "label": "Enable Key Persistence", + "description": "Store JWT keys persistently to survive server restarts" + }, + "enableKeyRotation": { + "label": "Enable Key Rotation", + "description": "Automatically rotate JWT signing keys periodically" + }, + "enableKeyCleanup": { + "label": "Enable Key Cleanup", + "description": "Automatically remove expired JWT keys" + } + }, + "audit": { + "label": "Audit Logging", + "enabled": { + "label": "Enable Audit Logging", + "description": "Track user actions and system events for compliance and security monitoring" + }, + "level": { + "label": "Audit Level", + "description": "0=OFF, 1=BASIC, 2=STANDARD, 3=VERBOSE" + }, + "retentionDays": { + "label": "Audit Retention (days)", + "description": "Number of days to retain audit logs" + } + }, + "htmlUrlSecurity": { + "label": "HTML URL Security", + "description": "Configure URL access restrictions for HTML processing to prevent SSRF attacks", + "enabled": { + "label": "Enable URL Security", + "description": "Enable URL security restrictions for HTML to PDF conversions" + }, + "level": { + "label": "Security Level", + "description": "MAX: whitelist only, MEDIUM: block internal networks, OFF: no restrictions", + "max": "Maximum (Whitelist Only)", + "medium": "Medium (Block Internal)", + "off": "Off (No Restrictions)" + }, + "advanced": "Advanced Settings", + "allowedDomains": { + "label": "Allowed Domains (Whitelist)", + "description": "One domain per line (e.g., cdn.example.com). Only these domains allowed when level is MAX" + }, + "blockedDomains": { + "label": "Blocked Domains (Blacklist)", + "description": "One domain per line (e.g., malicious.com). Additional domains to block" + }, + "internalTlds": { + "label": "Internal TLDs", + "description": "One TLD per line (e.g., .local, .internal). Block domains with these TLD patterns" + }, + "networkBlocking": "Network Blocking", + "blockPrivateNetworks": { + "label": "Block Private Networks", + "description": "Block RFC 1918 private networks (10.x.x.x, 192.168.x.x, 172.16-31.x.x)" + }, + "blockLocalhost": { + "label": "Block Localhost", + "description": "Block localhost and loopback addresses (127.x.x.x, ::1)" + }, + "blockLinkLocal": { + "label": "Block Link-Local Addresses", + "description": "Block link-local addresses (169.254.x.x, fe80::/10)" + }, + "blockCloudMetadata": { + "label": "Block Cloud Metadata Endpoints", + "description": "Block cloud provider metadata endpoints (169.254.169.254)" + } + } + }, + "connections": { + "title": "Connections", + "description": "Configure external authentication providers like OAuth2 and SAML.", + "linkedServices": "Linked Services", + "unlinkedServices": "Unlinked Services", + "connect": "Connect", + "disconnect": "Disconnect", + "disconnected": "Provider disconnected successfully", + "disconnectError": "Failed to disconnect provider", + "ssoAutoLogin": { + "label": "SSO Auto Login", + "enable": "Enable SSO Auto Login", + "description": "Automatically redirect to SSO login when authentication is required" + }, + "oauth2": { + "label": "OAuth2", + "enabled": { + "label": "Enable OAuth2", + "description": "Allow users to authenticate using OAuth2 providers" + }, + "provider": { + "label": "Provider", + "description": "The OAuth2 provider to use for authentication" + }, + "issuer": { + "label": "Issuer URL", + "description": "The OAuth2 provider issuer URL" + }, + "clientId": { + "label": "Client ID", + "description": "The OAuth2 client ID from your provider" + }, + "clientSecret": { + "label": "Client Secret", + "description": "The OAuth2 client secret from your provider" + }, + "useAsUsername": { + "label": "Use as Username", + "description": "The OAuth2 claim to use as the username (e.g., email, sub)" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first OAuth2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via OAuth2" + }, + "scopes": { + "label": "OAuth2 Scopes", + "description": "Comma-separated list of OAuth2 scopes to request (e.g., openid, profile, email)" + } + }, + "saml2": { + "label": "SAML2", + "enabled": { + "label": "Enable SAML2", + "description": "Allow users to authenticate using SAML2 providers" + }, + "provider": { + "label": "Provider", + "description": "The SAML2 provider name" + }, + "registrationId": { + "label": "Registration ID", + "description": "The SAML2 registration identifier" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first SAML2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via SAML2" + } + } + }, + "database": { + "title": "Database", + "description": "Configure custom database connection settings for enterprise deployments.", + "configuration": "Database Configuration", + "enableCustom": { + "label": "Enable Custom Database", + "description": "Use your own custom database configuration instead of the default embedded database" + }, + "customUrl": { + "label": "Custom Database URL", + "description": "Full JDBC connection string (e.g., jdbc:postgresql://localhost:5432/postgres). If provided, individual connection settings below are not used." + }, + "type": { + "label": "Database Type", + "description": "Type of database (not used if custom URL is provided)" + }, + "hostName": { + "label": "Host Name", + "description": "Database server hostname (not used if custom URL is provided)" + }, + "port": { + "label": "Port", + "description": "Database server port (not used if custom URL is provided)" + }, + "name": { + "label": "Database Name", + "description": "Name of the database (not used if custom URL is provided)" + }, + "username": { + "label": "Username", + "description": "Database authentication username" + }, + "password": { + "label": "Password", + "description": "Database authentication password" + } + }, + "privacy": { + "title": "Privacy", + "description": "Configure privacy and data collection settings.", + "analytics": "Analytics & Tracking", + "enableAnalytics": { + "label": "Enable Analytics", + "description": "Collect anonymous usage analytics to help improve the application" + }, + "metricsEnabled": { + "label": "Enable Metrics", + "description": "Enable collection of performance and usage metrics. Provides API endpoint for admins to access metrics data" + }, + "searchEngine": "Search Engine Visibility", + "googleVisibility": { + "label": "Google Visibility", + "description": "Allow search engines to index this application" + } + }, + "advanced": { + "title": "Advanced", + "description": "Configure advanced features and experimental functionality.", + "features": "Feature Flags", + "processing": "Processing", + "endpoints": { + "label": "Endpoints", + "manage": "Manage API Endpoints", + "description": "Endpoint management is configured via YAML. See documentation for details on enabling/disabling specific endpoints." + }, + "enableAlphaFunctionality": { + "label": "Enable Alpha Features", + "description": "Enable experimental and alpha-stage features (may be unstable)" + }, + "enableUrlToPDF": { + "label": "Enable URL to PDF", + "description": "Allow conversion of web pages to PDF documents" + }, + "maxDPI": { + "label": "Maximum DPI", + "description": "Maximum DPI for image processing (0 = unlimited)" + }, + "tessdataDir": { + "label": "Tessdata Directory", + "description": "Path to the tessdata directory for OCR language files" + }, + "disableSanitize": { + "label": "Disable HTML Sanitization", + "description": "WARNING: Security risk - disabling HTML sanitization can lead to XSS vulnerabilities" + }, + "tempFileManagement": { + "label": "Temp File Management", + "description": "Configure temporary file storage and cleanup behavior", + "baseTmpDir": { + "label": "Base Temp Directory", + "description": "Base directory for temporary files (leave empty for default: java.io.tmpdir/stirling-pdf)" + }, + "libreofficeDir": { + "label": "LibreOffice Temp Directory", + "description": "Directory for LibreOffice temp files (leave empty for default: baseTmpDir/libreoffice)" + }, + "systemTempDir": { + "label": "System Temp Directory", + "description": "System temp directory to clean (only used if cleanupSystemTemp is enabled)" + }, + "prefix": { + "label": "Temp File Prefix", + "description": "Prefix for temp file names" + }, + "maxAgeHours": { + "label": "Max Age (hours)", + "description": "Maximum age in hours before temp files are cleaned up" + }, + "cleanupIntervalMinutes": { + "label": "Cleanup Interval (minutes)", + "description": "How often to run cleanup (in minutes)" + }, + "startupCleanup": { + "label": "Startup Cleanup", + "description": "Clean up old temp files on application startup" + }, + "cleanupSystemTemp": { + "label": "Cleanup System Temp", + "description": "Whether to clean broader system temp directory (use with caution)" + } + }, + "processExecutor": { + "label": "Process Executor Limits", + "description": "Configure session limits and timeouts for each process executor", + "sessionLimit": { + "label": "Session Limit", + "description": "Maximum concurrent instances" + }, + "timeout": { + "label": "Timeout (minutes)", + "description": "Maximum execution time" + }, + "libreOffice": "LibreOffice", + "pdfToHtml": "PDF to HTML", + "qpdf": "QPDF", + "tesseract": "Tesseract OCR", + "pythonOpenCv": "Python OpenCV", + "weasyPrint": "WeasyPrint", + "installApp": "Install App", + "calibre": "Calibre", + "ghostscript": "Ghostscript", + "ocrMyPdf": "OCRmyPDF" + } + }, + "mail": { + "title": "Mail Server", + "description": "Configure SMTP settings for sending email notifications.", + "smtp": "SMTP Configuration", + "enabled": { + "label": "Enable Mail", + "description": "Enable email notifications and SMTP functionality" + }, + "host": { + "label": "SMTP Host", + "description": "The hostname or IP address of your SMTP server" + }, + "port": { + "label": "SMTP Port", + "description": "The port number for SMTP connection (typically 25, 465, or 587)" + }, + "username": { + "label": "SMTP Username", + "description": "Username for SMTP authentication" + }, + "password": { + "label": "SMTP Password", + "description": "Password for SMTP authentication" + }, + "from": { + "label": "From Address", + "description": "The email address to use as the sender" + }, + "enableInvites": { + "label": "Enable Email Invites", + "description": "Allow admins to invite users via email with auto-generated passwords" + }, + "frontendUrl": { + "label": "Frontend URL", + "description": "Base URL for frontend (e.g. https://pdf.example.com). Used for generating invite links in emails. Leave empty to use backend URL." + } + }, + "legal": { + "title": "Legal Documents", + "description": "Configure links to legal documents and policies.", + "disclaimer": { + "title": "Legal Responsibility Warning", + "message": "By customizing these legal documents, you assume full responsibility for ensuring compliance with all applicable laws and regulations, including but not limited to GDPR and other EU data protection requirements. Only modify these settings if: (1) you are operating a personal/private instance, (2) you are outside EU jurisdiction and understand your local legal obligations, or (3) you have obtained proper legal counsel and accept sole responsibility for all user data and legal compliance. Stirling-PDF and its developers assume no liability for your legal obligations." + }, + "termsAndConditions": { + "label": "Terms and Conditions", + "description": "URL or filename to terms and conditions" + }, + "privacyPolicy": { + "label": "Privacy Policy", + "description": "URL or filename to privacy policy" + }, + "accessibilityStatement": { + "label": "Accessibility Statement", + "description": "URL or filename to accessibility statement" + }, + "cookiePolicy": { + "label": "Cookie Policy", + "description": "URL or filename to cookie policy" + }, + "impressum": { + "label": "Impressum", + "description": "URL or filename to impressum (required in some jurisdictions)" + } + }, + "premium": { + "title": "Premium & Enterprise", + "description": "Configure your premium or enterprise license key.", + "license": "License Configuration", + "key": { + "label": "License Key", + "description": "Enter your premium or enterprise license key" + }, + "enabled": { + "label": "Enable Premium Features", + "description": "Enable license key checks for pro/enterprise features" + }, + "movedFeatures": { + "title": "Premium Features Distributed", + "message": "Premium and Enterprise features are now organized in their respective sections:" + } + }, + "features": { + "title": "Features", + "description": "Configure optional features and functionality.", + "serverCertificate": { + "label": "Server Certificate", + "description": "Configure server-side certificate generation for \"Sign with Stirling-PDF\" functionality", + "enabled": { + "label": "Enable Server Certificate", + "description": "Enable server-side certificate for \"Sign with Stirling-PDF\" option" + }, + "organizationName": { + "label": "Organization Name", + "description": "Organization name for generated certificates" + }, + "validity": { + "label": "Certificate Validity (days)", + "description": "Number of days the certificate will be valid" + }, + "regenerateOnStartup": { + "label": "Regenerate on Startup", + "description": "Generate new certificate on each application startup" + } + } + }, + "endpoints": { + "title": "API Endpoints", + "description": "Control which API endpoints and endpoint groups are available.", + "management": "Endpoint Management", + "toRemove": { + "label": "Disabled Endpoints", + "description": "Select individual endpoints to disable" + }, + "groupsToRemove": { + "label": "Disabled Endpoint Groups", + "description": "Select endpoint groups to disable" + }, + "note": "Note: Disabling endpoints restricts API access but does not remove UI components. Restart required for changes to take effect." + } + } + }, + "fileUpload": { + "selectFile": "Select a file", + "selectFiles": "Select files", + "selectPdfToView": "Select a PDF to view", + "selectPdfToEdit": "Select a PDF to edit", + "chooseFromStorage": "Choose a file from storage or upload a new PDF", + "chooseFromStorageMultiple": "Choose files from storage or upload new PDFs", + "loadFromStorage": "Load from Storage", + "filesAvailable": "files available", + "loading": "Loading...", + "or": "or", + "dropFileHere": "Drop file here or click to upload", + "dropFilesHere": "Drop files here or click the upload button", + "pdfFilesOnly": "PDF files only", + "supportedFileTypes": "Supported file types", + "upload": "Upload", + "uploadFile": "Upload File", + "uploadFiles": "Upload Files", + "noFilesInStorage": "No files available in storage. Upload some files first.", + "selectFromStorage": "Select from Storage", + "backToTools": "Back to Tools", + "addFiles": "Add Files", + "dragFilesInOrClick": "Drag files in or click \"Add Files\" to browse" + }, + "fileEditor": { + "addFiles": "Add Files" }, "fileManager": { + "title": "Upload PDF Files", + "subtitle": "Add files to your storage for easy access across tools", + "filesSelected": "files selected", + "clearSelection": "Clear Selection", + "openInFileEditor": "Open in File Editor", + "uploadError": "Failed to upload some files.", + "failedToOpen": "Failed to open file. It may have been removed from storage.", + "failedToLoad": "Failed to load file to active set.", + "storageCleared": "Browser cleared storage. Files have been removed. Please re-upload.", + "clearAll": "Clear All", + "reloadFiles": "Reload Files", + "dragDrop": "Drag & Drop files here", + "clickToUpload": "Click to upload files", + "selectedFiles": "Selected Files", + "storage": "Storage", + "filesStored": "files stored", + "storageError": "Storage error occurred", + "storageLow": "Storage is running low. Consider removing old files.", + "supportMessage": "Powered by browser database storage for unlimited capacity", + "noFileSelected": "No files selected", + "showHistory": "Show History", + "hideHistory": "Hide History", + "fileHistory": "File History", + "loadingHistory": "Loading History...", + "lastModified": "Last Modified", + "toolChain": "Tools Applied", + "restore": "Restore", + "unzip": "Unzip", + "searchFiles": "Search files...", + "recent": "Recent", + "localFiles": "Local Files", + "googleDrive": "Google Drive", + "googleDriveShort": "Drive", + "myFiles": "My Files", + "noRecentFiles": "No recent files found", + "googleDriveNotAvailable": "Google Drive integration not available", + "openFiles": "Open Files", + "openFile": "Open File", + "details": "File Details", "fileName": "Meno", + "fileFormat": "Format", + "fileSize": "Size", "fileVersion": "Verzia", + "totalSelected": "Total Selected", + "dropFilesHere": "Drop files here", + "selectAll": "Select All", + "deselectAll": "Deselect All", + "deleteSelected": "Delete Selected", + "downloadSelected": "Download Selected", + "selectedCount": "{{count}} selected", "download": "StiahnuÅĨ", - "delete": "VymazaÅĨ" + "delete": "VymazaÅĨ", + "unsupported": "Unsupported", + "addToUpload": "Add to Upload", + "deleteAll": "Delete All", + "loadingFiles": "Loading files...", + "noFiles": "No files available", + "noFilesFound": "No files found matching your search", + "openInPageEditor": "Open in Page Editor", + "showAll": "Show All", + "sortByDate": "Sort by Date", + "sortByName": "Sort by Name", + "sortBySize": "Sort by Size" + }, + "storage": { + "temporaryNotice": "Files are stored temporarily in your browser and may be cleared automatically", + "storageLimit": "Storage limit", + "storageUsed": "Temporary Storage used", + "storageFull": "Storage is nearly full. Consider removing some files.", + "fileTooLarge": "File too large. Maximum size per file is", + "storageQuotaExceeded": "Storage quota exceeded. Please remove some files before uploading more.", + "approximateSize": "Approximate size" }, "sanitize": { + "title": "Sanitise", + "desc": "Remove potentially harmful elements from PDF files.", "submit": "VyčistiÅĨ PDF", + "completed": "Sanitisation completed successfully", + "error": { + "generic": "Sanitisation failed", + "failed": "An error occurred while sanitising the PDF." + }, + "filenamePrefix": "sanitised", + "sanitizationResults": "Sanitisation Results", "steps": { - "settings": "Nastavenia" + "files": "Files", + "settings": "Nastavenia", + "results": "Results" + }, + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "options": { + "title": "Sanitisation Options", + "note": "Select the elements you want to remove from the PDF. At least one option must be selected.", + "removeJavaScript": { + "label": "Remove JavaScript", + "desc": "Remove JavaScript actions and scripts from the PDF" + }, + "removeEmbeddedFiles": { + "label": "Remove Embedded Files", + "desc": "Remove any files embedded within the PDF" + }, + "removeXMPMetadata": { + "label": "Remove XMP Metadata", + "desc": "Remove XMP metadata from the PDF" + }, + "removeMetadata": { + "label": "Remove Document Metadata", + "desc": "Remove document information metadata (title, author, etc.)" + }, + "removeLinks": { + "label": "Remove Links", + "desc": "Remove external links and launch actions from the PDF" + }, + "removeFonts": { + "label": "Remove Fonts", + "desc": "Remove embedded fonts from the PDF" + } + } + }, + "addPassword": { + "title": "PridaÅĨ heslo", + "desc": "Encrypt your PDF document with a password.", + "completed": "Password protection applied", + "submit": "ZaÅĄifrovaÅĨ", + "filenamePrefix": "encrypted", + "error": { + "failed": "An error occurred while encrypting the PDF." + }, + "passwords": { + "stepTitle": "Passwords & Encryption", + "completed": "Passwords configured", + "user": { + "label": "User Password", + "placeholder": "Enter user password" + }, + "owner": { + "label": "Owner Password", + "placeholder": "Enter owner password" + } + }, + "encryption": { + "keyLength": { + "label": "Encryption Key Length", + "40bit": "40-bit (Low)", + "128bit": "128-bit (Standard)", + "256bit": "256-bit (High)" + } + }, + "results": { + "title": "Encrypted PDFs" + }, + "tooltip": { + "header": { + "title": "Password Protection Overview" + }, + "passwords": { + "title": "Password Types", + "text": "User passwords restrict opening the document, while owner passwords control what can be done with the document once opened. You can set both or just one.", + "bullet1": "User Password: Required to open the PDF", + "bullet2": "Owner Password: Controls document permissions (not supported by all PDF viewers)" + }, + "encryption": { + "title": "Encryption Levels", + "text": "Higher encryption levels provide better security but may not be supported by older PDF viewers.", + "bullet1": "40-bit: Basic security, compatible with older viewers", + "bullet2": "128-bit: Standard security, widely supported", + "bullet3": "256-bit: Maximum security, requires modern viewers" + }, + "permissions": { + "title": "ZmeniÅĨ povolenia", + "text": "These permissions control what users can do with the PDF. Most effective when combined with an owner password." + } + }, + "tags": "zaistiÅĨ,bezpečnosÅĨ", + "header": "PridaÅĨ heslo (ZaÅĄifrovaÅĨ)", + "selectText": { + "1": "Vyberte PDF na zaÅĄifrovanie", + "2": "PouŞívateÄžskÊ heslo", + "3": "DÄēÅžka ÅĄifrovacieho kÄžÃēča", + "4": "VyÅĄÅĄie hodnoty sÃē silnejÅĄie, ale niÅžÅĄie hodnoty majÃē lepÅĄiu kompatibilitu.", + "5": "Nastavenia povolení (OdporÃēča sa pouŞívaÅĨ spolu s heslom vlastníka)", + "6": "ZakÃĄzaÅĨ zostavovanie dokumentu", + "7": "ZakÃĄzaÅĨ extrakciu obsahu", + "8": "ZakÃĄzaÅĨ extrakciu pre prístupnosÅĨ", + "9": "ZakÃĄzaÅĨ vypÄēňanie formulÃĄrov", + "10": "ZakÃĄzaÅĨ Ãēpravy", + "11": "ZakÃĄzaÅĨ Ãēpravu anotÃĄcií", + "12": "ZakÃĄzaÅĨ tlač", + "13": "ZakÃĄzaÅĨ tlač rôznych formÃĄtov", + "14": "Heslo vlastníka", + "15": "Obmedzuje, čo môŞe byÅĨ vykonanÊ s dokumentom po jeho otvorení (NepodporovanÊ vÅĄetkÃŊmi čítačmi)", + "16": "Obmedzuje samotnÊ otvorenie dokumentu" } }, "changePermissions": { "title": "ZmeniÅĨ povolenia", + "desc": "Change document restrictions and permissions.", + "completed": "Permissions changed", "submit": "ZmeniÅĨ povolenia", + "error": { + "failed": "An error occurred while changing PDF permissions." + }, "permissions": { "preventAssembly": { "label": "ZakÃĄzaÅĨ zostavovanie dokumentu" @@ -1692,10 +4580,784 @@ "label": "ZakÃĄzaÅĨ tlač rôznych formÃĄtov" } }, + "results": { + "title": "Modified PDFs" + }, "tooltip": { "header": { "title": "ZmeniÅĨ povolenia" + }, + "description": { + "text": "Changes document permissions, allowing/disallowing access to different features in PDF readers." + }, + "warning": { + "text": "To make these permissions unchangeable, use the Add Password tool to set an owner password." } } + }, + "removePassword": { + "title": "OdstrÃĄniÅĨ heslo", + "desc": "OdstrÃĄniÅĨ ochranu heslom z vÃĄÅĄho PDF dokumentu.", + "tags": "zaistiÅĨ,DeÅĄifrovaÅĨ,bezpečnosÅĨ,odheslovaÅĨ,vymazaÅĨ heslo", + "password": { + "stepTitle": "OdstrÃĄniÅĨ heslo", + "label": "AktuÃĄlne heslo", + "placeholder": "Enter current password", + "completed": "Password configured" + }, + "filenamePrefix": "decrypted", + "error": { + "failed": "An error occurred while removing the password from the PDF." + }, + "tooltip": { + "description": "Removing password protection requires the password that was used to encrypt the PDF. This will decrypt the document, making it accessible without a password." + }, + "submit": "OdstrÃĄniÅĨ", + "results": { + "title": "Decrypted PDFs" + }, + "header": "OdstrÃĄniÅĨ heslo (DeÅĄifrovaÅĨ)", + "selectText": { + "1": "Vyberte PDF na deÅĄifrovanie", + "2": "Heslo" + } + }, + "automate": { + "title": "Automate", + "desc": "Build multi-step workflows by chaining together PDF actions. Ideal for recurring tasks.", + "invalidStep": "Invalid step", + "files": { + "placeholder": "Select files to process with this automation" + }, + "selection": { + "title": "Automation Selection", + "saved": { + "title": "Saved" + }, + "createNew": { + "title": "Create New Automation" + }, + "suggested": { + "title": "Suggested" + } + }, + "creation": { + "createTitle": "Create Automation", + "editTitle": "Edit Automation", + "intro": "Automations run tools sequentially. To get started, add tools in the order you want them to run.", + "name": { + "label": "Automation Name", + "placeholder": "My Automation" + }, + "description": { + "label": "Description (optional)", + "placeholder": "Describe what this automation does..." + }, + "tools": { + "selectTool": "Select a tool...", + "selected": "Selected Tools", + "remove": "Remove tool", + "configure": "Configure tool", + "notConfigured": "! Not Configured", + "addTool": "Add Tool", + "add": "Add a tool..." + }, + "save": "Save Automation", + "unsavedChanges": { + "title": "Unsaved Changes", + "message": "You have unsaved changes. Are you sure you want to go back? All changes will be lost.", + "cancel": "Cancel", + "confirm": "Go Back" + }, + "icon": { + "label": "Icon" + } + }, + "run": { + "title": "Run Automation" + }, + "sequence": { + "unnamed": "Unnamed Automation", + "steps": "{{count}} steps", + "running": "Running Automation...", + "run": "Run Automation", + "finish": "Finish" + }, + "reviewTitle": "Automation Results", + "config": { + "loading": "Loading tool configuration...", + "noSettings": "This tool does not have configurable settings.", + "title": "Configure {{toolName}}", + "description": "Configure the settings for this tool. These settings will be applied when the automation runs.", + "cancel": "Cancel", + "save": "Save Configuration" + }, + "copyToSaved": "Copy to Saved" + }, + "automation": { + "suggested": { + "securePdfIngestion": "Secure PDF Ingestion", + "securePdfIngestionDesc": "Comprehensive PDF processing workflow that sanitises documents, applies OCR with cleanup, converts to PDF/A format for long-term archival, and optimises file size.", + "emailPreparation": "Email Preparation", + "emailPreparationDesc": "Optimises PDFs for email distribution by compressing files, splitting large documents into 20MB chunks for email compatibility, and removing metadata for privacy.", + "secureWorkflow": "Security Workflow", + "secureWorkflowDesc": "Secures PDF documents by removing potentially malicious content like JavaScript and embedded files, then adds password protection to prevent unauthorised access. Password is set to 'password' by default.", + "processImages": "Process Images", + "processImagesDesc": "Converts multiple image files into a single PDF document, then applies OCR technology to extract searchable text from the images." + } + }, + "common": { + "copy": "Copy", + "copied": "Copied!", + "refresh": "Refresh", + "retry": "Retry", + "remaining": "remaining", + "used": "used", + "available": "available", + "cancel": "Cancel", + "preview": "Preview" + }, + "config": { + "overview": { + "title": "Application Configuration", + "description": "Current application settings and configuration details." + }, + "account": { + "overview": { + "title": "Account Settings", + "manageAccountPreferences": "Manage your account preferences", + "guestDescription": "You are signed in as a guest. Consider upgrading your account above." + }, + "upgrade": { + "title": "Upgrade Guest Account", + "description": "Link your account to preserve your history and access more features!", + "socialLogin": "Upgrade with Social Account", + "linkWith": "Link with", + "emailPassword": "or enter your email & password", + "email": "Email", + "emailPlaceholder": "Enter your email", + "password": "Password (optional)", + "passwordPlaceholder": "Set a password", + "passwordNote": "Leave empty to use email verification only", + "upgradeButton": "Upgrade Account" + } + }, + "apiKeys": { + "description": "Your API key for accessing Stirling's suite of PDF tools. Copy it to your project or refresh to generate a new one.", + "publicKeyAriaLabel": "Public API key", + "copyKeyAriaLabel": "Copy API key", + "refreshAriaLabel": "Refresh API key", + "includedCredits": "Included credits", + "purchasedCredits": "Purchased credits", + "totalCredits": "Total Credits", + "chartAriaLabel": "Credits usage: included {{includedUsed}} of {{includedTotal}}, purchased {{purchasedUsed}} of {{purchasedTotal}}", + "nextReset": "Next Reset", + "lastApiUse": "Last API Use", + "overlayMessage": "Generate a key to see credits and available credits", + "label": "API Key", + "guestInfo": "Guest users do not receive API keys. Create an account to get an API key you can use in your applications.", + "goToAccount": "Go to Account", + "refreshModal": { + "title": "Refresh API Keys", + "warning": "âš ī¸ Warning: This action will generate new API keys and make your previous keys invalid.", + "impact": "Any applications or services currently using these keys will stop working until you update them with the new keys.", + "confirmPrompt": "Are you sure you want to continue?", + "confirmCta": "Refresh Keys" + }, + "generateError": "We couldn't generate your API key." + } + }, + "AddAttachmentsRequest": { + "attachments": "Select Attachments", + "info": "Select files to attach to your PDF. These files will be embedded and accessible through the PDF's attachment panel.", + "selectFiles": "Select Files to Attach", + "placeholder": "Choose files...", + "addMoreFiles": "Add more files...", + "selectedFiles": "Selected Files", + "submit": "Add Attachments", + "results": { + "title": "Attachment Results" + }, + "error": { + "failed": "Add attachments operation failed" + } + }, + "termsAndConditions": "Terms & Conditions", + "logOut": "Log out", + "addAttachments": { + "error": { + "failed": "An error occurred while adding attachments to the PDF." + } + }, + "autoRename": { + "description": "This tool will automatically rename PDF files based on their content. It analyzes the document to find the most suitable title from the text." + }, + "customPosition": "Custom Position", + "details": "Details", + "downloadUnavailable": "Download unavailable for this item", + "invalidUndoData": "Cannot undo: invalid operation data", + "margin": { + "large": "Large", + "medium": "Medium", + "small": "Small", + "xLarge": "Extra Large" + }, + "noFilesToUndo": "Cannot undo: no files were processed in the last operation", + "noOperationToUndo": "No operation to undo", + "noValidFiles": "No valid files to process", + "operationCancelled": "Operation cancelled", + "pageEdit": { + "deselectAll": "Select None", + "selectAll": "Select All" + }, + "quickPosition": "Quick Position", + "reorganizePages": { + "error": { + "failed": "Failed to reorganize pages" + }, + "results": { + "title": "Pages Reorganized" + }, + "settings": { + "title": "Settings" + }, + "submit": "Reorganize Pages" + }, + "replace-color": { + "options": { + "fill": "Fill colour", + "gradient": "Gradient" + }, + "previewOverlayOpacity": "Preview overlay opacity", + "previewOverlayTransparency": "Preview overlay transparency", + "previewOverlayVisibility": "Show preview overlay", + "selectText": { + "1": "Replace or Invert color Options", + "2": "Default(Default high contrast colors)", + "3": "Custom(Customized colors)", + "4": "Full-Invert(Invert all colors)", + "5": "High contrast color options", + "6": "white text on black background", + "7": "Black text on white background", + "8": "Yellow text on black background", + "9": "Green text on black background", + "10": "Choose text Color", + "11": "Choose background Color", + "12": "Choose start colour", + "13": "Choose end colour" + }, + "submit": "Replace", + "title": "Replace-Invert-Color", + "header": "Replace-Invert Color PDF" + }, + "size": "Size", + "submit": "Submit", + "success": "Success", + "tools": { + "noSearchResults": "No tools found", + "noTools": "No tools available" + }, + "undoDataMismatch": "Cannot undo: operation data is corrupted", + "undoFailed": "Failed to undo operation", + "undoQuotaError": "Cannot undo: insufficient storage space", + "undoStorageError": "Undo completed but some files could not be saved to storage", + "undoSuccess": "Operation undone successfully", + "unsupported": "Unsupported", + "onboarding": { + "welcomeModal": { + "title": "Welcome to Stirling PDF!", + "description": "Would you like to take a quick 1-minute tour to learn the key features and how to get started?", + "helpHint": "You can always access this tour later from the Help button in the bottom left.", + "startTour": "Start Tour", + "maybeLater": "Maybe Later", + "dontShowAgain": "Don't Show Again" + }, + "allTools": "This is the All Tools panel, where you can browse and select from all available PDF tools.", + "selectCropTool": "Let's select the Crop tool to demonstrate how to use one of the tools.", + "toolInterface": "This is the Crop tool interface. As you can see, there's not much there because we haven't added any PDF files to work with yet.", + "filesButton": "The Files button on the Quick Access bar allows you to upload PDFs to use the tools on.", + "fileSources": "You can upload new files or access recent files from here. For the tour, we'll just use a sample file.", + "workbench": "This is the Workbench - the main area where you view and edit your PDFs.", + "viewSwitcher": "Use these controls to select how you want to view your PDFs.", + "viewer": "The Viewer lets you read and annotate your PDFs.", + "pageEditor": "The Page Editor allows you to do various operations on the pages within your PDFs, such as reordering, rotating and deleting.", + "activeFiles": "The Active Files view shows all of the PDFs you have loaded into the tool, and allows you to select which ones to process.", + "fileCheckbox": "Clicking one of the files selects it for processing. You can select multiple files for batch operations.", + "selectControls": "The Right Rail contains buttons to quickly select/deselect all of your active PDFs, along with buttons to change the app's theme or language.", + "cropSettings": "Now that we've selected the file we want crop, we can configure the Crop tool to choose the area that we want to crop the PDF to.", + "runButton": "Once the tool has been configured, this button allows you to run the tool on all the selected PDFs.", + "results": "After the tool has finished running, the Review step will show a preview of the results in this panel, and allow you to undo the operation or download the file. ", + "fileReplacement": "The modified file will replace the original file in the Workbench automatically, allowing you to easily run it through more tools.", + "pinButton": "You can use the Pin button if you'd rather your files stay active after running tools on them.", + "wrapUp": "You're all set! You've learnt about the main areas of the app and how to use them. Click the Help button whenever you like to see this tour again.", + "previous": "Previous", + "next": "Next", + "finish": "Finish", + "startTour": "Start Tour", + "startTourDescription": "Take a guided tour of Stirling PDF's key features" + }, + "workspace": { + "title": "Workspace", + "people": { + "title": "People", + "description": "Manage workspace members and their permissions", + "loading": "Loading people...", + "searchMembers": "Search members...", + "addMembers": "Add Members", + "inviteMembers": { + "label": "Invite Members", + "subtitle": "Type or paste in emails below, separated by commas. Your workspace will be billed by members." + }, + "user": "User", + "role": "Role", + "team": "Team", + "status": "Status", + "actions": "Actions", + "noMembersFound": "No members found", + "active": "Active", + "disabled": "Disabled", + "activeSession": "Active session", + "member": "Member", + "admin": "Admin", + "roleDescriptions": { + "admin": "Can manage settings and invite members, with full administrative access.", + "member": "Can view and edit shared files, but cannot manage workspace settings or members." + }, + "editRole": "Edit Role", + "enable": "Enable", + "disable": "Disable", + "deleteUser": "Delete User", + "deleteUserSuccess": "User deleted successfully", + "deleteUserError": "Failed to delete user", + "confirmDelete": "Are you sure you want to delete this user? This action cannot be undone.", + "addMember": { + "title": "Add Member", + "username": "Username (Email)", + "usernamePlaceholder": "user@example.com", + "password": "Password", + "passwordPlaceholder": "Enter password", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "forcePasswordChange": "Force password change on first login", + "cancel": "Cancel", + "submit": "Add Member", + "usernameRequired": "Username and password are required", + "passwordTooShort": "Password must be at least 6 characters", + "success": "User created successfully", + "error": "Failed to create user" + }, + "editMember": { + "title": "Edit Member", + "editing": "Editing:", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "cancel": "Cancel", + "submit": "Update Member", + "success": "User updated successfully", + "error": "Failed to update user" + }, + "toggleEnabled": { + "success": "User status updated successfully", + "error": "Failed to update user status" + }, + "delete": { + "success": "User deleted successfully", + "error": "Failed to delete user" + }, + "emailInvite": { + "tab": "Email Invite", + "description": "Type or paste in emails below, separated by commas. Users will receive login credentials via email.", + "emails": "Email Addresses", + "emailsPlaceholder": "user1@example.com, user2@example.com", + "emailsRequired": "At least one email address is required", + "submit": "Send Invites", + "success": "user(s) invited successfully", + "partialSuccess": "Some invites failed", + "allFailed": "Failed to invite users", + "error": "Failed to send invites" + }, + "directInvite": { + "tab": "Direct Create" + }, + "inviteLinkTab": { + "tab": "Invite Link" + }, + "inviteLink": { + "description": "Generate a secure link that allows the user to set their own password", + "email": "Email Address", + "emailPlaceholder": "user@example.com (optional)", + "emailDescription": "Optional - leave blank for a general invite link that can be used by anyone", + "emailRequired": "Email address is required", + "emailOptional": "Optional - leave blank for a general invite link", + "emailRequiredForSend": "Email address is required to send email notification", + "expiryHours": "Expiry Hours", + "expiryDescription": "How many hours until the link expires", + "sendEmail": "Send invite link via email", + "sendEmailDescription": "If enabled, the invite link will be sent to the specified email address", + "smtpRequired": "SMTP not configured", + "generate": "Generate Link", + "generated": "Invite Link Generated", + "copied": "Link copied to clipboard", + "success": "Invite link generated successfully", + "successWithEmail": "Invite link generated and sent via email", + "emailFailed": "Invite link generated, but email failed", + "emailFailedDetails": "Error: {0}. Please share the invite link manually.", + "error": "Failed to generate invite link", + "submit": "Generate Invite Link" + }, + "inviteMode": { + "username": "Username", + "email": "Email", + "link": "Link", + "emailDisabled": "Email invites require SMTP configuration and mail.enableInvites=true in settings" + }, + "license": { + "users": "users", + "availableSlots": "Available Slots", + "grandfathered": "Grandfathered", + "grandfatheredShort": "{{count}} grandfathered", + "fromLicense": "from license", + "slotsAvailable": "{{count}} user slot(s) available", + "noSlotsAvailable": "No slots available", + "currentUsage": "Currently using {{current}} of {{max}} user licences" + } + }, + "teams": { + "title": "Teams", + "description": "Manage teams and organize workspace members", + "loading": "Loading teams...", + "loadingDetails": "Loading team details...", + "createNewTeam": "Create New Team", + "teamName": "Team Name", + "totalMembers": "Total Members", + "actions": "Actions", + "noTeamsFound": "No teams found", + "noMembers": "No members in this team", + "system": "System", + "addMember": "Add Member", + "viewTeam": "View Team", + "removeMember": "Remove from team", + "cannotRemoveFromSystemTeam": "Cannot remove from system team", + "renameTeamLabel": "Rename Team", + "deleteTeamLabel": "Delete Team", + "cannotDeleteInternal": "Cannot delete the Internal team", + "confirmDelete": "Are you sure you want to delete this team? This team must be empty to delete.", + "confirmRemove": "Remove user from this team?", + "cannotRenameInternal": "Cannot rename the Internal team", + "cannotAddToInternal": "Cannot add members to the Internal team", + "teamNotFound": "Team not found", + "backToTeams": "Back to Teams", + "memberCount": "{{count}} members", + "removeMemberSuccess": "User removed from team", + "removeMemberError": "Failed to remove user from team", + "createTeam": { + "title": "Create New Team", + "teamName": "Team Name", + "teamNamePlaceholder": "Enter team name", + "cancel": "Cancel", + "submit": "Create Team", + "nameRequired": "Team name is required", + "success": "Team created successfully", + "error": "Failed to create team" + }, + "renameTeam": { + "title": "Rename Team", + "renaming": "Renaming:", + "newTeamName": "New Team Name", + "newTeamNamePlaceholder": "Enter new team name", + "cancel": "Cancel", + "submit": "Rename Team", + "nameRequired": "Team name is required", + "success": "Team renamed successfully", + "error": "Failed to rename team" + }, + "deleteTeam": { + "success": "Team deleted successfully", + "error": "Failed to delete team. Make sure the team is empty.", + "teamMustBeEmpty": "Team must be empty before deletion" + }, + "addMemberToTeam": { + "title": "Add Member to Team", + "addingTo": "Adding to", + "selectUser": "Select User", + "selectUserPlaceholder": "Choose a user", + "selectUserRequired": "Please select a user", + "currentlyIn": "currently in", + "willBeMoved": "Note: This user will be moved from their current team to this team.", + "cancel": "Cancel", + "submit": "Add Member", + "userRequired": "Please select a user", + "success": "Member added to team successfully", + "error": "Failed to add member to team" + }, + "changeTeam": { + "label": "Change Team", + "title": "Change Team", + "changing": "Moving", + "selectTeam": "Select Team", + "selectTeamPlaceholder": "Choose a team", + "selectTeamRequired": "Please select a team", + "success": "Team changed successfully", + "error": "Failed to change team", + "submit": "Change Team" + } + } + }, + "plan": { + "currency": "Currency", + "popular": "Popular", + "current": "Current Plan", + "upgrade": "Upgrade", + "contact": "Contact Us", + "customPricing": "Custom", + "showComparison": "Compare All Features", + "hideComparison": "Hide Feature Comparison", + "featureComparison": "Feature Comparison", + "activePlan": { + "title": "Active Plan", + "subtitle": "Your current subscription details" + }, + "availablePlans": { + "title": "Available Plans", + "subtitle": "Choose the plan that fits your needs" + }, + "static": { + "title": "Billing Information", + "message": "Online billing is not currently configured. To upgrade your plan or manage subscriptions, please contact us directly.", + "contactSales": "Contact Sales", + "contactToUpgrade": "Contact us to upgrade or customize your plan", + "maxUsers": "Max Users", + "upTo": "Up to" + }, + "period": { + "month": "month" + }, + "free": { + "name": "Free", + "highlight1": "Limited Tool Usage Per week", + "highlight2": "Access to all tools", + "highlight3": "Community support" + }, + "pro": { + "name": "Pro", + "highlight1": "Unlimited Tool Usage", + "highlight2": "Advanced PDF tools", + "highlight3": "No watermarks" + }, + "enterprise": { + "name": "Enterprise", + "highlight1": "Custom pricing", + "highlight2": "Dedicated support", + "highlight3": "Latest features" + }, + "feature": { + "title": "Feature", + "pdfTools": "Basic PDF Tools", + "fileSize": "File Size Limit", + "automation": "Automate tool workflows", + "api": "API Access", + "priority": "Priority Support", + "customPricing": "Custom Pricing" + } + }, + "subscription": { + "status": { + "active": "Active", + "pastDue": "Past Due", + "canceled": "Canceled", + "incomplete": "Incomplete", + "trialing": "Trial", + "none": "No Subscription" + }, + "renewsOn": "Renews on {{date}}", + "cancelsOn": "Cancels on {{date}}" + }, + "billing": { + "manageBilling": "Manage Billing", + "portal": { + "error": "Failed to open billing portal" + } + }, + "payment": { + "preparing": "Preparing your checkout...", + "upgradeTitle": "Upgrade to {{planName}}", + "success": "Payment Successful!", + "successMessage": "Your subscription has been activated successfully. You will receive a confirmation email shortly.", + "autoClose": "This window will close automatically...", + "error": "Payment Error" + }, + "firstLogin": { + "title": "First Time Login", + "welcomeTitle": "Welcome!", + "welcomeMessage": "For security reasons, you must change your password on your first login.", + "loggedInAs": "Logged in as", + "error": "Error", + "currentPassword": "Current Password", + "enterCurrentPassword": "Enter your current password", + "newPassword": "New Password", + "enterNewPassword": "Enter new password (min 8 characters)", + "confirmPassword": "Confirm New Password", + "reEnterNewPassword": "Re-enter new password", + "changePassword": "Change Password", + "allFieldsRequired": "All fields are required", + "passwordsDoNotMatch": "New passwords do not match", + "passwordTooShort": "Password must be at least 8 characters", + "passwordMustBeDifferent": "New password must be different from current password", + "passwordChangedSuccess": "Password changed successfully! Please log in again.", + "passwordChangeFailed": "Failed to change password. Please check your current password." + }, + "invite": { + "welcome": "Welcome to Stirling PDF", + "invalidToken": "Invalid invitation link", + "validationError": "Failed to validate invitation link", + "passwordRequired": "Password is required", + "passwordTooShort": "Password must be at least 6 characters", + "passwordMismatch": "Passwords do not match", + "acceptError": "Failed to create account", + "validating": "Validating invitation...", + "invalidInvitation": "Invalid Invitation", + "goToLogin": "Go to Login", + "welcomeTitle": "You've been invited!", + "welcomeSubtitle": "Complete your account setup to get started", + "accountFor": "Creating account for", + "linkExpires": "Link expires", + "email": "Email address", + "emailPlaceholder": "Enter your email address", + "emailRequired": "Email address is required", + "invalidEmail": "Invalid email address", + "choosePassword": "Choose a password", + "passwordPlaceholder": "Enter your password", + "confirmPassword": "Confirm password", + "confirmPasswordPlaceholder": "Re-enter your password", + "createAccount": "Create Account", + "creating": "Creating Account...", + "alreadyHaveAccount": "Already have an account?", + "signIn": "Sign in" + }, + "audit": { + "error": { + "title": "Error loading audit system" + }, + "notAvailable": "Audit system not available", + "notAvailableMessage": "The audit system is not configured or not available.", + "disabled": "Audit logging is disabled", + "disabledMessage": "Enable audit logging in your application configuration to track system events.", + "systemStatus": { + "title": "System Status", + "status": "Audit Logging", + "enabled": "Enabled", + "disabled": "Disabled", + "level": "Audit Level", + "retention": "Retention Period", + "days": "days", + "totalEvents": "Total Events" + }, + "tabs": { + "dashboard": "Dashboard", + "events": "Audit Events", + "export": "Export" + }, + "charts": { + "title": "Audit Dashboard", + "error": "Error loading charts", + "day": "Day", + "week": "Week", + "month": "Month", + "byType": "Events by Type", + "byUser": "Events by User", + "overTime": "Events Over Time" + }, + "events": { + "title": "Audit Events", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "error": "Error loading events", + "noEvents": "No events found", + "timestamp": "Timestamp", + "type": "Type", + "user": "User", + "ipAddress": "IP Address", + "actions": "Actions", + "viewDetails": "View Details", + "eventDetails": "Event Details", + "details": "Details" + }, + "export": { + "title": "Export Audit Data", + "description": "Export audit events to CSV or JSON format. Use filters to limit the exported data.", + "format": "Export Format", + "filters": "Filters (Optional)", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "exportButton": "Export Data", + "error": "Failed to export data" + } + }, + "usage": { + "noData": "No data available", + "error": "Error loading usage statistics", + "noDataMessage": "No usage statistics are currently available.", + "controls": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All", + "refresh": "Refresh", + "dataTypeLabel": "Data Type:", + "dataType": { + "all": "All", + "api": "API", + "ui": "UI" + } + }, + "showing": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All" + }, + "stats": { + "totalEndpoints": "Total Endpoints", + "totalVisits": "Total Visits", + "showing": "Showing", + "selectedVisits": "Selected Visits" + }, + "chart": { + "title": "Endpoint Usage Chart" + }, + "table": { + "title": "Detailed Statistics", + "endpoint": "Endpoint", + "visits": "Visits", + "percentage": "Percentage", + "noData": "No data available" + } + }, + "backendHealth": { + "checking": "Checking backend status...", + "online": "Backend Online", + "offline": "Backend Offline" + }, + "autoRedact": { + "tags": "redigovaÅĨ, skryÅĨ, zatieniÅĨ, čierne, marker, skrytÊ", + "title": "AutomatickÊ redigovanie", + "header": "AutomatickÊ redigovanie", + "colorLabel": "Farba", + "textsToRedactLabel": "Text na redigovanie (oddelenÃŊ riadkami)", + "textsToRedactPlaceholder": "napr. \\nDôvernÊ \\nPrísne tajnÊ", + "useRegexLabel": "PouÅžiÅĨ Regex", + "wholeWordSearchLabel": "VyhÄžadÃĄvanie celÃŊch slov", + "customPaddingLabel": "VlastnÊ odsadenie", + "convertPDFToImageLabel": "KonvertovaÅĨ PDF na PDF-ObrÃĄzok (PouŞíva sa na odstrÃĄnenie textu za boxom)", + "submitButton": "OdoslaÅĨ" + }, + "replaceColorPdf": { + "tags": "Replace Color,Page operations,Back end,server side" } -} \ No newline at end of file +} diff --git a/frontend/public/locales/sl-SI/translation.json b/frontend/public/locales/sl-SI/translation.json index 6eab0f7b6..b9ada4f0b 100644 --- a/frontend/public/locales/sl-SI/translation.json +++ b/frontend/public/locales/sl-SI/translation.json @@ -1,4 +1,40 @@ { + "toolPanel": { + "modePrompt": { + "title": "Choose how you browse tools", + "description": "Preview both layouts and decide how you want to explore Stirling PDF tools.", + "sidebarTitle": "Sidebar mode", + "sidebarDescription": "Keep tools alongside your workspace for quick switching.", + "recommended": "Recommended", + "chooseSidebar": "Use sidebar mode", + "fullscreenTitle": "Fullscreen mode - (legacy)", + "fullscreenDescription": "Browse every tool in a catalogue that covers the workspace until you pick one.", + "chooseFullscreen": "Use fullscreen mode", + "dismiss": "Maybe later" + }, + "fullscreen": { + "showDetails": "Show Details", + "comingSoon": "Coming soon:", + "favorite": "Add to favourites", + "favorites": "Favourites", + "heading": "All tools (fullscreen view)", + "noResults": "Try adjusting your search or toggle descriptions to find what you need.", + "recommended": "Recommended", + "unfavorite": "Remove from favourites" + }, + "placeholder": "Choose a tool to get started", + "toggle": { + "fullscreen": "Switch to fullscreen mode", + "sidebar": "Switch to sidebar mode" + } + }, + "unsavedChanges": "You have unsaved changes to your PDF.", + "areYouSure": "Are you sure you want to leave?", + "unsavedChangesTitle": "Unsaved Changes", + "keepWorking": "Keep Working", + "discardChanges": "Discard & Leave", + "applyAndContinue": "Save & Leave", + "exportAndContinue": "Export & Continue", "language": { "direction": "ltr" }, @@ -18,8 +54,26 @@ "customTextDesc": "Besedilo po meri", "numberPagesDesc": "Katere strani oÅĄtevilčiti, privzeto 'vse', sprejema tudi 1-5 ali 2,5,9 itd.", "customNumberDesc": "Privzeto na {n}, sprejema tudi 'Stran {n} od {total}', 'Besedilo-{n}', '{filename}-{n}", - "submit": "Dodaj ÅĄtevilke strani" + "submit": "Dodaj ÅĄtevilke strani", + "configuration": "Configuration", + "customize": "Customize Appearance", + "pagesAndStarting": "Pages & Starting Number", + "positionAndPages": "Position & Pages", + "error": { + "failed": "Add page numbers operation failed" + }, + "results": { + "title": "Page Number Results" + }, + "preview": "Position Selection", + "previewDisclaimer": "Preview is approximate. Final output may vary due to PDF font metrics." }, + "pageSelectionPrompt": "Izbira strani po meri (Vnesite z vejicami ločen seznam ÅĄtevilk strani 1,5,6 ali funkcije, kot je 2n+1) :", + "startingNumberTooltip": "The first number to display. Subsequent pages will increment from this number.", + "marginTooltip": "Distance between the page number and the edge of the page.", + "fontSizeTooltip": "Size of the page number text in points. Larger numbers create bigger text.", + "fontTypeTooltip": "Font family for the page numbers. Choose based on your document style.", + "customTextTooltip": "Optional custom format for page numbers. Use {n} as placeholder for the number. Example: \"Page {n}\" will show \"Page 1\", \"Page 2\", etc.", "pdfPrompt": "Izberi PDF(e)", "multiPdfPrompt": "Izberi PDF (2+)", "multiPdfDropPrompt": "Izberite (ali povlecite in spustite) vse datoteke PDF, ki jih potrebujete", @@ -30,15 +84,41 @@ "uploadLimitExceededPlural": "are too large. Maximum allowed size is", "processTimeWarning": "Opozorilo: ta postopek lahko traja do minute, odvisno od velikosti datoteke", "pageOrderPrompt": "Vrstni red strani po meri (Vnesite z vejicami ločen seznam ÅĄtevilk strani ali funkcij, kot je 2n+1) :", - "pageSelectionPrompt": "Izbira strani po meri (Vnesite z vejicami ločen seznam ÅĄtevilk strani 1,5,6 ali funkcije, kot je 2n+1) :", "goToPage": "Pojdi", "true": "Res", "false": "Napačno", "unknown": "Neznano", + "app": { + "description": "The Free Adobe Acrobat alternative (10M+ Downloads)" + }, "save": "Shrani", "saveToBrowser": "Shrani v brskalnik", + "download": "Prenos", + "pin": "Pin File (keep active after tool run)", + "unpin": "Unpin File (replace after tool run)", + "undoOperationTooltip": "Click to undo the last operation and restore the original files", + "undo": "Razveljavi", + "moreOptions": "More Options", + "editYourNewFiles": "Edit your new file(s)", "close": "Zapri", + "openInViewer": "Open in Viewer", + "confirmClose": "Confirm Close", + "confirmCloseMessage": "Are you sure you want to close this file?", + "confirmCloseCancel": "Cancel", + "confirmCloseConfirm": "Close File", + "fileSelected": "Selected: {{filename}}", + "chooseFile": "Choose File", "filesSelected": "izbrane datoteke", + "files": { + "title": "Files", + "upload": "Upload", + "uploadFiles": "Upload Files", + "addFiles": "Add files", + "selectFromWorkbench": "Select files from the workbench or ", + "selectMultipleFromWorkbench": "Select at least {{count}} files from the workbench or ", + "created": "Created", + "size": "File Size" + }, "noFavourites": "Ni dodanih priljubljenih", "downloadComplete": "Prenos končan", "bored": "dolgočaseno čakanje?", @@ -56,7 +136,10 @@ }, "error": { "pdfPassword": "Dokument PDF je zaÅĄÄiten z geslom in geslo ni bilo vneseno ali pa je bilo napačno", + "encryptedPdfMustRemovePassword": "This PDF is encrypted or password-protected. Please unlock it before converting to PDF/A.", + "incorrectPasswordProvided": "The PDF password is incorrect or not provided.", "_value": "Napaka", + "dismissAllErrors": "Dismiss All Errors", "sorry": "Oprostite za teÅžavo!", "needHelp": "Potrebujete pomoč / Ste naÅĄli teÅžavo?", "contactTip": "Če imate ÅĄe vedno teÅžave, ne oklevajte in se obrnite na nas za pomoč. Vstopnico lahko oddate na naÅĄi strani GitHub ali nas kontaktirate prek Discorda:", @@ -71,6 +154,10 @@ "githubSubmit": "GitHub - PredloÅži vstopnico", "discordSubmit": "Discord - PoÅĄlji objavo podpori" }, + "warning": { + "tooltipTitle": "Warning" + }, + "edit": "Edit", "delete": "IzbriÅĄi", "username": "UporabniÅĄko ime", "password": "Geslo", @@ -82,6 +169,7 @@ "green": "zelena", "blue": "modra", "custom": "Po meri...", + "comingSoon": "Coming soon", "WorkInProgess": "Delo je v teku, morda ne bo delovalo ali bo hroÅĄÄalo, prosimo, prijavite morebitne teÅžave!", "poweredBy": "Poganja", "yes": "Da", @@ -115,12 +203,14 @@ "page": "Stran", "pages": "Strani", "loading": "Nalaganje...", + "review": "Review", "addToDoc": "Dodaj v dokument", "reset": "Ponastavi", "apply": "Uporabi", "noFileSelected": "No file selected. Please upload one.", "legal": { "privacy": "Politika zasebnosti", + "iAgreeToThe": "I agree to all of the", "terms": "Določila in pogoji", "accessibility": "Dostopnost", "cookie": "Pravilnik o piÅĄkotkih", @@ -160,6 +250,7 @@ "title": "Ali Åželite izboljÅĄati Stirling PDF?", "paragraph1": "Stirling PDF se je odločil za analitiko, ki nam pomaga izboljÅĄati izdelek. Ne sledimo nobenim osebnim podatkom ali vsebini datotek.", "paragraph2": "Prosimo, razmislite o omogočanju analitike, ki bo pomagala rasti Stirling-PDF in nam bo omogočila boljÅĄe razumevanje naÅĄih uporabnikov.", + "learnMore": "Learn more", "enable": "Omogoči analitiko", "disable": "Onemogoči analitiko", "settings": "Nastavitve za analitiko lahko spremenite v datoteki config/settings.yml" @@ -203,6 +294,54 @@ "cacheInputs": { "name": "Shrani vnose obrazca", "help": "Omogoči shranjevanje predhodno uporabljenih vnosov za prihodnje zagone" + }, + "general": { + "title": "General", + "description": "Configure general application preferences.", + "account": "Account", + "accountDescription": "Manage your account settings", + "user": "User", + "signedInAs": "Signed in as", + "logout": "Log out", + "enableFeatures": { + "title": "For System Administrators", + "intro": "Enable user authentication, team management, and workspace features for your organization.", + "action": "Configure", + "and": "and", + "benefit": "Enables user roles, team collaboration, admin controls, and enterprise features.", + "learnMore": "Learn more in documentation", + "dismiss": "Dismiss" + }, + "autoUnzip": "Auto-unzip API responses", + "autoUnzipDescription": "Automatically extract files from ZIP responses", + "autoUnzipTooltip": "Automatically extract ZIP files returned from API operations. Disable to keep ZIP files intact. This does not affect automation workflows.", + "autoUnzipFileLimit": "Auto-unzip file limit", + "autoUnzipFileLimitDescription": "Maximum number of files to extract from ZIP", + "autoUnzipFileLimitTooltip": "Only unzip if the ZIP contains this many files or fewer. Set higher to extract larger ZIPs.", + "defaultToolPickerMode": "Default tool picker mode", + "defaultToolPickerModeDescription": "Choose whether the tool picker opens in fullscreen or sidebar by default", + "mode": { + "fullscreen": "Fullscreen", + "sidebar": "Sidebar" + } + }, + "hotkeys": { + "title": "Keyboard Shortcuts", + "description": "Hover a tool to see its shortcut or customise it below. Click \"Change shortcut\" and press a new key combination. Press Esc to cancel.", + "errorModifier": { + "mac": "Include ⌘ (Command), âŒĨ (Option), or another modifier in your shortcut.", + "windows": "Include Ctrl, Alt, or another modifier in your shortcut." + }, + "errorConflict": "Shortcut already used by {{tool}}.", + "none": "Not assigned", + "customBadge": "Custom", + "defaultLabel": "Default: {{shortcut}}", + "capturing": "Press keysâ€Ļ (Esc to cancel)", + "change": "Change shortcut", + "reset": "Reset", + "shortcut": "Shortcut", + "noShortcut": "No shortcut set", + "searchPlaceholder": "Search tools..." } }, "changeCreds": { @@ -274,8 +413,10 @@ "top20": "20 najboljÅĄih", "all": "Vse", "refresh": "OsveÅži", - "includeHomepage": "Vključi domačo stran ('/')", - "includeLoginPage": "Vključi prijavno stran ('/login')", + "dataTypeLabel": "Data Type:", + "dataTypeAll": "All", + "dataTypeApi": "API", + "dataTypeUi": "UI", "totalEndpoints": "Skupno končnih točk", "totalVisits": "Skupno ÅĄtevilo obiskov", "showing": "Prikaz", @@ -290,7 +431,9 @@ "top": "Na vrh", "numberOfVisits": "Å tevilo obiskov", "visitsTooltip": "Obiski: {0} ({1}% vseh)", - "retry": "Poskusi znova" + "retry": "Poskusi znova", + "includeHomepage": "Vključi domačo stran ('/')", + "includeLoginPage": "Vključi prijavno stran ('/login')" }, "database": { "title": "Uvoz/izvoz baze podatkov", @@ -331,22 +474,310 @@ "alphabetical": "Abecedno", "globalPopularity": "Globalna priljubljenost", "sortBy": "Razvrsti po:", + "mobile": { + "brandAlt": "Stirling PDF logo", + "openFiles": "Open files", + "swipeHint": "Swipe left or right to switch views", + "tools": "Tools", + "toolsSlide": "Tool selection panel", + "viewSwitcher": "Switch workspace view", + "workbenchSlide": "Workspace panel", + "workspace": "Workspace" + }, "multiTool": { + "tags": "multiple,tools", "title": "PDF večnamensko orodje", "desc": "Spoji, zavrti, prerazporedi, razdeli in odstrani strani" }, "merge": { + "tags": "combine,join,unite", "title": "ZdruÅži", "desc": "Enostavno zdruÅžite več PDF-jev v enega." }, "split": { + "tags": "divide,separate,break", "title": "Razdeli se", "desc": "Razdeli PDF-je v več dokumentov" }, "rotate": { + "tags": "turn,flip,orient", "title": "Zavrti", "desc": "Preprosto zavrtite svoje PDF-je." }, + "convert": { + "tags": "transform,change", + "title": "Pretvori", + "desc": "Convert files between different formats" + }, + "pdfOrganiser": { + "tags": "organize,rearrange,reorder", + "title": "Organiziraj", + "desc": "Odstrani/Prerazporedi strani v poljubnem vrstnem redu" + }, + "addImage": { + "tags": "insert,embed,place", + "title": "Dodaj sliko", + "desc": "Doda sliko na določeno mesto v PDF-ju" + }, + "addAttachments": { + "tags": "embed,attach,include", + "title": "Add Attachments", + "desc": "Add or remove embedded files (attachments) to/from a PDF" + }, + "watermark": { + "tags": "stamp,mark,overlay", + "title": "Dodaj vodni Åžig", + "desc": "V dokument PDF dodajte vodni Åžig po meri." + }, + "removePassword": { + "tags": "unlock", + "title": "Odstrani geslo", + "desc": "Odstranite zaÅĄÄito z geslom iz vaÅĄega dokumenta PDF." + }, + "compress": { + "tags": "shrink,reduce,optimize", + "title": "Stisni", + "desc": "Stisnite PDF-je, da zmanjÅĄate njihovo velikost." + }, + "unlockPDFForms": { + "tags": "unlock,enable,edit", + "title": "Unlock PDF Forms", + "desc": "Remove read-only property of form fields in a PDF document." + }, + "changeMetadata": { + "tags": "edit,modify,update", + "title": "Spremeni metapodatke", + "desc": "Spremeni/Odstrani/Dodaj metapodatke iz dokumenta PDF" + }, + "ocr": { + "tags": "extract,scan", + "title": "OCR / Čistilni pregledi", + "desc": "Cleanup skenira in zazna besedilo iz slik znotraj PDF-ja in ga ponovno doda kot besedilo." + }, + "extractImages": { + "tags": "pull,save,export", + "title": "Izvleči slike", + "desc": "Izvleče vse slike iz PDF-ja in jih shrani v zip" + }, + "scannerImageSplit": { + "tags": "detect,split,photos", + "title": "Detect & Split Scanned Photos", + "desc": "Detect and split scanned photos into separate pages" + }, + "sign": { + "tags": "signature,autograph", + "title": "PodpiÅĄi", + "desc": "Doda podpis v PDF z risbo, besedilom ali sliko" + }, + "flatten": { + "tags": "simplify,remove,interactive", + "title": "Zravnaj", + "desc": "Odstrani vse interaktivne elemente in obrazce iz PDF-ja" + }, + "certSign": { + "tags": "authenticate,PEM,P12,official,encrypt,sign,certificate,PKCS12,JKS,server,manual,auto", + "title": "PodpiÅĄi s potrdilom", + "desc": "PodpiÅĄe PDF s potrdilom/ključem (PEM/P12)" + }, + "repair": { + "tags": "fix,restore", + "title": "Popravilo", + "desc": "PoskuÅĄa popraviti poÅĄkodovan/pokvarjen PDF" + }, + "removeBlanks": { + "tags": "delete,clean,empty", + "title": "Odstrani prazne strani", + "desc": "Zazna in odstrani prazne strani iz dokumenta" + }, + "removeAnnotations": { + "tags": "delete,clean,strip", + "title": "Odstrani opombe", + "desc": "Odstrani vse komentarje/opombe iz PDF-ja" + }, + "compare": { + "tags": "difference", + "title": "Primerjaj", + "desc": "Primerja in prikazuje razlike med 2 dokumentoma PDF" + }, + "removeCertSign": { + "tags": "remove,delete,unlock", + "title": "Odstrani znak potrdila", + "desc": "Odstrani podpis potrdila iz PDF-ja" + }, + "pageLayout": { + "tags": "layout,arrange,combine", + "title": "Večstranska postavitev", + "desc": "ZdruÅži več strani dokumenta PDF v eno stran" + }, + "bookletImposition": { + "tags": "booklet,print,binding", + "title": "Booklet Imposition", + "desc": "Create booklets with proper page ordering and multi-page layout for printing and binding" + }, + "scalePages": { + "tags": "resize,adjust,scale", + "title": "Prilagodi velikost/merilo strani", + "desc": "Spremenite velikost/merilo strani in/ali njeno vsebino." + }, + "addPageNumbers": { + "tags": "number,pagination,count", + "title": "Dodaj ÅĄtevilke strani", + "desc": "Dodaj ÅĄtevilke strani skozi dokument na določeno mesto" + }, + "autoRename": { + "tags": "auto-detect,header-based,organize,relabel", + "title": "Auto Rename PDF File", + "desc": "Auto renames a PDF file based on its detected header" + }, + "adjustContrast": { + "tags": "contrast,brightness,saturation", + "title": "Prilagodi barve/kontrast", + "desc": "Prilagodi kontrast, nasičenost in svetlost PDF-ja" + }, + "crop": { + "tags": "trim,cut,resize", + "title": "ObreÅži PDF", + "desc": "ObreÅžite PDF, da zmanjÅĄate njegovo velikost (ohranja besedilo!)" + }, + "autoSplitPDF": { + "tags": "auto,split,QR", + "title": "Samodejno razdeli strani", + "desc": "Samodejno razdeli optično prebrane PDF-je s fizično QR kodo razdelilnika optično prebranih strani" + }, + "sanitize": { + "tags": "clean,purge,remove", + "title": "Sanitise", + "desc": "Remove potentially harmful elements from PDF files" + }, + "getPdfInfo": { + "tags": "info,metadata,details", + "title": "Pridobite VSE informacije o PDF-ju", + "desc": "Zgrabi vse moÅžne informacije o PDF-jih" + }, + "pdfToSinglePage": { + "tags": "combine,merge,single", + "title": "PDF na eno veliko stran", + "desc": "ZdruÅži vse strani PDF v eno samo veliko stran" + }, + "showJS": { + "tags": "javascript,code,script", + "title": "PrikaÅži Javascript", + "desc": "IÅĄÄe in prikaÅže vse JS, vstavljene v PDF" + }, + "redact": { + "tags": "censor,blackout,hide", + "title": "Ročna redakcija", + "desc": "Preredi PDF na podlagi izbranega besedila, narisanih oblik in/ali izbranih strani(-e)" + }, + "splitBySections": { + "tags": "split,sections,divide", + "title": "Split PDF by Sections", + "desc": "Divide each page of a PDF into smaller horizontal and vertical sections" + }, + "addStamp": { + "tags": "stamp,mark,seal", + "title": "Add Stamp to PDF", + "desc": "Add text or add image stamps at set locations" + }, + "removeImage": { + "tags": "remove,delete,clean", + "title": "Odstrani sliko", + "desc": "Odstranite sliko iz PDF-ja, da zmanjÅĄate velikost datoteke" + }, + "splitByChapters": { + "tags": "split,chapters,structure", + "title": "Razdeli PDF po poglavjih", + "desc": "Razdeli PDF na več datotek glede na strukturo poglavij." + }, + "validateSignature": { + "tags": "validate,verify,certificate", + "title": "Preveri podpis PDF", + "desc": "Preveri digitalne podpise in potrdila v dokumentih PDF" + }, + "swagger": { + "tags": "API,documentation,test", + "title": "API Documentation", + "desc": "View API documentation and test endpoints" + }, + "scannerEffect": { + "tags": "scan,simulate,create", + "title": "Scanner Effect", + "desc": "Create a PDF that looks like it was scanned" + }, + "editTableOfContents": { + "tags": "bookmarks,contents,edit", + "title": "Edit Table of Contents", + "desc": "Add or edit bookmarks and table of contents in PDF documents" + }, + "manageCertificates": { + "tags": "certificates,import,export", + "title": "Manage Certificates", + "desc": "Import, export, or delete digital certificate files used for signing PDFs." + }, + "read": { + "tags": "view,open,display", + "title": "Read", + "desc": "View and annotate PDFs. Highlight text, draw, or insert comments for review and collaboration." + }, + "reorganizePages": { + "tags": "rearrange,reorder,organize", + "title": "Reorganize Pages", + "desc": "Rearrange, duplicate, or delete PDF pages with visual drag-and-drop control." + }, + "extractPages": { + "tags": "pull,select,copy", + "title": "Izvleči strani", + "desc": "Extract specific pages from a PDF document" + }, + "removePages": { + "tags": "delete,extract,exclude", + "title": "Odstrani", + "desc": "IzbriÅĄite neÅželene strani iz dokumenta PDF." + }, + "autoSizeSplitPDF": { + "tags": "auto,split,size", + "title": "Samodejna razdelitev po velikosti/ÅĄtevilu", + "desc": "Razdeli en PDF na več dokumentov glede na velikost, ÅĄtevilo strani ali ÅĄtevilo dokumentov" + }, + "replaceColor": { + "title": "Replace & Invert Colour", + "desc": "Replace or invert colours in PDF documents" + }, + "devApi": { + "tags": "API,development,documentation", + "title": "API", + "desc": "Link to API documentation" + }, + "devFolderScanning": { + "tags": "automation,folder,scanning", + "title": "Automated Folder Scanning", + "desc": "Link to automated folder scanning guide" + }, + "devSsoGuide": { + "title": "SSO Guide", + "desc": "Link to SSO guide" + }, + "devAirgapped": { + "title": "Air-gapped Setup", + "desc": "Link to air-gapped setup guide" + }, + "addPassword": { + "title": "Dodaj geslo", + "desc": "Å ifrirajte svoj dokument PDF z geslom." + }, + "changePermissions": { + "title": "Spremeni dovoljenja", + "desc": "Change document restrictions and permissions" + }, + "automate": { + "tags": "workflow,sequence,automation", + "title": "Automate", + "desc": "Build multi-step workflows by chaining together PDF actions. Ideal for recurring tasks." + }, + "overlay-pdfs": { + "desc": "Prekriva PDF-je na vrhu drugega PDF-ja", + "title": "Prekrivanje PDF-jev" + }, "imageToPDF": { "title": "Slika v PDF", "desc": "Pretvori sliko (PNG, JPEG, GIF) v PDF." @@ -355,18 +786,6 @@ "title": "PDF v sliko", "desc": "Pretvori PDF v sliko. (PNG, JPEG, GIF)" }, - "pdfOrganiser": { - "title": "Organiziraj", - "desc": "Odstrani/Prerazporedi strani v poljubnem vrstnem redu" - }, - "addImage": { - "title": "Dodaj sliko", - "desc": "Doda sliko na določeno mesto v PDF-ju" - }, - "watermark": { - "title": "Dodaj vodni Åžig", - "desc": "V dokument PDF dodajte vodni Åžig po meri." - }, "permissions": { "title": "Spremeni dovoljenja", "desc": "Spremenite dovoljenja vaÅĄega dokumenta PDF" @@ -375,38 +794,10 @@ "title": "Odstrani", "desc": "IzbriÅĄite neÅželene strani iz dokumenta PDF." }, - "addPassword": { - "title": "Dodaj geslo", - "desc": "Å ifrirajte svoj dokument PDF z geslom." - }, - "removePassword": { - "title": "Odstrani geslo", - "desc": "Odstranite zaÅĄÄito z geslom iz vaÅĄega dokumenta PDF." - }, - "compress": { - "title": "Stisni", - "desc": "Stisnite PDF-je, da zmanjÅĄate njihovo velikost." - }, - "unlockPDFForms": { - "title": "Unlock PDF Forms", - "desc": "Remove read-only property of form fields in a PDF document." - }, - "changeMetadata": { - "title": "Spremeni metapodatke", - "desc": "Spremeni/Odstrani/Dodaj metapodatke iz dokumenta PDF" - }, "fileToPDF": { "title": "Pretvori datoteko v PDF", "desc": "Pretvori skoraj vsako datoteko v PDF (DOCX, PNG, XLS, PPT, TXT in več)" }, - "ocr": { - "title": "OCR / Čistilni pregledi", - "desc": "Cleanup skenira in zazna besedilo iz slik znotraj PDF-ja in ga ponovno doda kot besedilo." - }, - "extractImages": { - "title": "Izvleči slike", - "desc": "Izvleče vse slike iz PDF-ja in jih shrani v zip" - }, "pdfToPDFA": { "title": "PDF v PDF/A", "desc": "Pretvori PDF v PDF/A za dolgoročno shranjevanje" @@ -435,70 +826,14 @@ "title": "Zaznaj/razdeli skenirane fotografije", "desc": "Razdeli več fotografij iz fotografije/PDF" }, - "sign": { - "title": "PodpiÅĄi", - "desc": "Doda podpis v PDF z risbo, besedilom ali sliko" - }, - "flatten": { - "title": "Zravnaj", - "desc": "Odstrani vse interaktivne elemente in obrazce iz PDF-ja" - }, - "repair": { - "title": "Popravilo", - "desc": "PoskuÅĄa popraviti poÅĄkodovan/pokvarjen PDF" - }, - "removeBlanks": { - "title": "Odstrani prazne strani", - "desc": "Zazna in odstrani prazne strani iz dokumenta" - }, - "removeAnnotations": { - "title": "Odstrani opombe", - "desc": "Odstrani vse komentarje/opombe iz PDF-ja" - }, - "compare": { - "title": "Primerjaj", - "desc": "Primerja in prikazuje razlike med 2 dokumentoma PDF" - }, - "certSign": { - "title": "PodpiÅĄi s potrdilom", - "desc": "PodpiÅĄe PDF s potrdilom/ključem (PEM/P12)" - }, - "removeCertSign": { - "title": "Odstrani znak potrdila", - "desc": "Odstrani podpis potrdila iz PDF-ja" - }, - "pageLayout": { - "title": "Večstranska postavitev", - "desc": "ZdruÅži več strani dokumenta PDF v eno stran" - }, - "scalePages": { - "title": "Prilagodi velikost/merilo strani", - "desc": "Spremenite velikost/merilo strani in/ali njeno vsebino." - }, "pipeline": { "title": "Cevovod", "desc": "ZaÅženi več dejanj na PDF-jih z definiranjem cevovodnih skriptov" }, - "addPageNumbers": { - "title": "Dodaj ÅĄtevilke strani", - "desc": "Dodaj ÅĄtevilke strani skozi dokument na določeno mesto" - }, "auto-rename": { "title": "Samodejno preimenuj datoteko PDF", "desc": "Samodejno preimenuje datoteko PDF glede na zaznano glavo" }, - "adjustContrast": { - "title": "Prilagodi barve/kontrast", - "desc": "Prilagodi kontrast, nasičenost in svetlost PDF-ja" - }, - "crop": { - "title": "ObreÅži PDF", - "desc": "ObreÅžite PDF, da zmanjÅĄate njegovo velikost (ohranja besedilo!)" - }, - "autoSplitPDF": { - "title": "Samodejno razdeli strani", - "desc": "Samodejno razdeli optično prebrane PDF-je s fizično QR kodo razdelilnika optično prebranih strani" - }, "sanitizePDF": { "title": "RazkuÅži", "desc": "Odstrani skripte in druge elemente iz datotek PDF" @@ -519,30 +854,14 @@ "title": "PDF v Markdown", "desc": "Pretvori poljuben PDF v Markdown" }, - "getPdfInfo": { - "title": "Pridobite VSE informacije o PDF-ju", - "desc": "Zgrabi vse moÅžne informacije o PDF-jih" - }, "pageExtracter": { "title": "Izvleček strani(e)", "desc": "Izvleče izbrane strani iz PDF-ja" }, - "pdfToSinglePage": { - "title": "PDF na eno veliko stran", - "desc": "ZdruÅži vse strani PDF v eno samo veliko stran" - }, - "showJS": { - "title": "PrikaÅži Javascript", - "desc": "IÅĄÄe in prikaÅže vse JS, vstavljene v PDF" - }, "autoRedact": { "title": "Samodejno popravi", "desc": "Samodejno popravi (začrni) besedilo v PDF-ju na podlagi vnesenega besedila" }, - "redact": { - "title": "Ročna redakcija", - "desc": "Preredi PDF na podlagi izbranega besedila, narisanih oblik in/ali izbranih strani(-e)" - }, "PDFToCSV": { "title": "PDF v CSV", "desc": "Izvleče tabele iz PDF in jih pretvori v CSV" @@ -551,10 +870,6 @@ "title": "Samodejna razdelitev po velikosti/ÅĄtevilu", "desc": "Razdeli en PDF na več dokumentov glede na velikost, ÅĄtevilo strani ali ÅĄtevilo dokumentov" }, - "overlay-pdfs": { - "title": "Prekrivanje PDF-jev", - "desc": "Prekriva PDF-je na vrhu drugega PDF-ja" - }, "split-by-sections": { "title": "Razdeli PDF po razdelkih", "desc": "Vsako stran PDF-ja razdelite na manjÅĄe vodoravne in navpične dele" @@ -563,43 +878,17 @@ "title": "Dodaj Åžig v PDF", "desc": "Dodaj besedilo ali slikovne Åžige na nastavljenih lokacijah" }, - "removeImage": { - "title": "Odstrani sliko", - "desc": "Odstranite sliko iz PDF-ja, da zmanjÅĄate velikost datoteke" - }, - "splitByChapters": { - "title": "Razdeli PDF po poglavjih", - "desc": "Razdeli PDF na več datotek glede na strukturo poglavij." - }, - "validateSignature": { - "title": "Preveri podpis PDF", - "desc": "Preveri digitalne podpise in potrdila v dokumentih PDF" - }, "replace-color": { "title": "Napredne barvne moÅžnosti", "desc": "Zamenjaj barvo besedila in ozadja v PDF-ju in obrni celotno barvo PDF-ja, da zmanjÅĄaÅĄ velikost datoteke" }, - "convert": { - "title": "Pretvori" - }, "attachments": { "title": "Add attachments" }, - "extractPages": { - "title": "Izvleči strani" - }, - "removePages": { - "title": "Odstrani", - "desc": "IzbriÅĄite neÅželene strani iz dokumenta PDF." - }, "removeImagePdf": { "title": "Odstrani sliko", "desc": "Odstranite sliko iz PDF-ja, da zmanjÅĄate velikost datoteke" }, - "autoSizeSplitPDF": { - "title": "Samodejna razdelitev po velikosti/ÅĄtevilu", - "desc": "Razdeli en PDF na več dokumentov glede na velikost, ÅĄtevilo strani ali ÅĄtevilo dokumentov" - }, "adjust-contrast": { "title": "Prilagodi barve/kontrast", "desc": "Prilagodi kontrast, nasičenost in svetlost PDF-ja" @@ -607,11 +896,12 @@ "replaceColorPdf": { "title": "Napredne barvne moÅžnosti", "desc": "Zamenjaj barvo besedila in ozadja v PDF-ju in obrni celotno barvo PDF-ja, da zmanjÅĄaÅĄ velikost datoteke" - }, - "changePermissions": { - "title": "Spremeni dovoljenja" } }, + "landing": { + "addFiles": "Add Files", + "uploadFromComputer": "Upload from computer" + }, "viewPdf": { "tags": "ogled, branje, opomba, besedilo, slika", "title": "View/Edit PDF", @@ -645,17 +935,39 @@ "merge": { "tags": "spoj,operacije strani,zadnja stran,streÅžniÅĄka stran", "title": "ZdruÅži", + "removeDigitalSignature": { + "label": "Remove digital signature in the merged file?", + "tooltip": { + "title": "Remove Digital Signature", + "description": "Digital signatures will be invalidated when merging files. Check this to remove them from the final merged PDF." + } + }, + "generateTableOfContents": { + "label": "Generate table of contents in the merged file?", + "tooltip": { + "title": "Generate Table of Contents", + "description": "Automatically creates a clickable table of contents in the merged PDF based on the original file names and page numbers." + } + }, + "submit": "ZdruÅži", + "sortBy": { + "description": "Files will be merged in the order they're selected. Drag to reorder or sort below.", + "label": "Sort By", + "filename": "Ime datoteke", + "dateModified": "Date Modified", + "ascending": "Ascending", + "descending": "Descending", + "sort": "Sort" + }, + "error": { + "failed": "An error occurred while merging the PDFs." + }, "header": "ZdruÅži več PDF-jev (2+)", "sortByName": "Razvrsti po imenu", "sortByDate": "Razvrsti po datumu", - "removeCertSign": "Odstraniti digitalni podpis v zdruÅženi datoteki?", - "submit": "ZdruÅži", - "sortBy": { - "filename": "Ime datoteke" - } + "removeCertSign": "Odstraniti digitalni podpis v zdruÅženi datoteki?" }, "split": { - "tags": "Operacije strani,deli,Multi Page,cut,streÅžniÅĄka stran", "title": "Razdeli PDF", "header": "Razdeli PDF", "desc": { @@ -671,25 +983,249 @@ "splitPages": "Vnesite strani za razdelitev:", "submit": "Razdeli", "steps": { + "chooseMethod": "Choose Method", "settings": "Nastavitve" }, + "settings": { + "selectMethodFirst": "Please select a split method first" + }, + "error": { + "failed": "An error occurred while splitting the PDF." + }, + "method": { + "label": "Choose split method", + "placeholder": "Select how to split the PDF" + }, "methods": { + "prefix": { + "splitAt": "Split at", + "splitBy": "Split by" + }, + "byPages": { + "name": "Page Numbers", + "desc": "Extract specific pages (1,3,5-10)", + "tooltip": "Enter page numbers separated by commas or ranges with hyphens" + }, + "bySections": { + "name": "Sections", + "desc": "Divide pages into grid sections", + "tooltip": "Split each page into horizontal and vertical sections" + }, "bySize": { - "name": "Velikost datoteke" + "name": "Velikost datoteke", + "desc": "Limit maximum file size", + "tooltip": "Specify maximum file size (e.g. 10MB, 500KB)" + }, + "byPageCount": { + "name": "Page Count", + "desc": "Fixed pages per file", + "tooltip": "Enter the number of pages for each split file" + }, + "byDocCount": { + "name": "Document Count", + "desc": "Create specific number of files", + "tooltip": "Enter how many files you want to create" + }, + "byChapters": { + "name": "Chapters", + "desc": "Split at bookmark boundaries", + "tooltip": "Uses PDF bookmarks to determine split points" + }, + "byPageDivider": { + "name": "Page Divider", + "desc": "Auto-split with divider sheets", + "tooltip": "Use QR code divider sheets between documents when scanning" } }, "value": { "fileSize": { - "label": "Velikost datoteke" + "label": "Velikost datoteke", + "placeholder": "e.g. 10MB, 500KB" + }, + "pageCount": { + "label": "Pages per File", + "placeholder": "e.g. 5, 10" + }, + "docCount": { + "label": "Number of Files", + "placeholder": "e.g. 3, 5" } - } + }, + "tooltip": { + "header": { + "title": "Split Methods Overview" + }, + "byPages": { + "title": "Split at Page Numbers", + "text": "Split your PDF at specific page numbers. Using 'n' splits after page n. Using 'n-m' splits before page n and after page m.", + "bullet1": "Single split points: 3,7 (splits after pages 3 and 7)", + "bullet2": "Range split points: 3-8 (splits before page 3 and after page 8)", + "bullet3": "Mixed: 2,5-10,15 (splits after page 2, before page 5, after page 10, and after page 15)" + }, + "bySections": { + "title": "Split by Grid Sections", + "text": "Divide each page into a grid of sections. Useful for splitting documents with multiple columns or extracting specific areas.", + "bullet1": "Horizontal: Number of rows to create", + "bullet2": "Vertical: Number of columns to create", + "bullet3": "Merge: Combine all sections into one PDF" + }, + "bySize": { + "title": "Split by File Size", + "text": "Create multiple PDFs that don't exceed a specified file size. Ideal for file size limitations or email attachments.", + "bullet1": "Use MB for larger files (e.g., 10MB)", + "bullet2": "Use KB for smaller files (e.g., 500KB)", + "bullet3": "System will split at page boundaries" + }, + "byCount": { + "title": "Split by Count", + "text": "Create multiple PDFs with a specific number of pages or documents each.", + "bullet1": "Page Count: Fixed number of pages per file", + "bullet2": "Document Count: Fixed number of output files", + "bullet3": "Useful for batch processing workflows" + }, + "byChapters": { + "title": "Split by Chapters", + "text": "Use PDF bookmarks to automatically split at chapter boundaries. Requires PDFs with bookmark structure.", + "bullet1": "Bookmark Level: Which level to split on (1=top level)", + "bullet2": "Include Metadata: Preserve document properties", + "bullet3": "Allow Duplicates: Handle repeated bookmark names" + }, + "byDocCount": { + "bullet1": "Enter the number of output files you want", + "bullet2": "Pages are distributed as evenly as possible", + "bullet3": "Useful when you need a specific number of files", + "text": "Create a specific number of output files by evenly distributing pages across them.", + "title": "Split by Document Count" + }, + "byPageCount": { + "bullet1": "Enter the number of pages per output file", + "bullet2": "Last file may have fewer pages if not evenly divisible", + "bullet3": "Useful for batch processing workflows", + "text": "Create multiple PDFs with a specific number of pages each. Perfect for creating uniform document chunks.", + "title": "Split by Page Count" + }, + "byPageDivider": { + "bullet1": "Print divider sheets from the download link", + "bullet2": "Insert divider sheets between your documents", + "bullet3": "Scan all documents together as one PDF", + "bullet4": "Upload - divider pages are automatically detected and removed", + "bullet5": "Enable Duplex Mode if scanning both sides of divider sheets", + "text": "Automatically split scanned documents using physical divider sheets with QR codes. Perfect for processing multiple documents scanned together.", + "title": "Split by Page Divider" + } + }, + "methodSelection": { + "tooltip": { + "bullet1": "Click on a method card to select it", + "bullet2": "Hover over each card to see a quick description", + "bullet3": "The settings step will appear after you select a method", + "bullet4": "You can change methods at any time before processing", + "header": { + "text": "Choose how you want to split your PDF document. Each method is optimized for different use cases and document types.", + "title": "Split Method Selection" + }, + "title": "Choose Your Split Method" + } + }, + "selectMethod": "Select a split method", + "tags": "Operacije strani,deli,Multi Page,cut,streÅžniÅĄka stran" }, "rotate": { - "tags": "streÅžniÅĄka stran", "title": "Zasukaj PDF", + "submit": "Zavrti", + "selectRotation": "Select Rotation Angle (Clockwise)", + "error": { + "failed": "An error occurred while rotating the PDF." + }, + "preview": { + "title": "Rotation Preview" + }, + "rotateLeft": "Rotate Anticlockwise", + "rotateRight": "Rotate Clockwise", + "tooltip": { + "header": { + "title": "Rotate Settings Overview" + }, + "description": { + "text": "Rotate your PDF pages clockwise or anticlockwise in 90-degree increments. All pages in the PDF will be rotated. The preview shows how your document will look after rotation." + }, + "controls": { + "title": "Controls", + "text": "Use the rotation buttons to adjust orientation. Left button rotates anticlockwise, right button rotates clockwise. Each click rotates by 90 degrees." + } + }, + "tags": "streÅžniÅĄka stran", "header": "Zasukaj PDF", - "selectAngle": "Izberite kot vrtenja (v večkratnikih 90 stopinj):", - "submit": "Zavrti" + "selectAngle": "Izberite kot vrtenja (v večkratnikih 90 stopinj):" + }, + "convert": { + "title": "Pretvori", + "desc": "Convert files between different formats", + "files": "Files", + "selectFilesPlaceholder": "Select files in the main view to get started", + "settings": "Nastavitve", + "conversionCompleted": "Conversion completed", + "results": "Results", + "defaultFilename": "converted_file", + "conversionResults": "Conversion Results", + "convertFrom": "Convert from", + "convertTo": "Convert to", + "sourceFormatPlaceholder": "Source format", + "targetFormatPlaceholder": "Target format", + "selectSourceFormatFirst": "Select a source format first", + "outputOptions": "Output Options", + "pdfOptions": "PDF Options", + "imageOptions": "Image Options", + "colorType": "Colour Type", + "color": "Barva", + "greyscale": "Sivine", + "blackwhite": "Black & White", + "dpi": "DPI", + "output": "Output", + "single": "Single", + "multiple": "Multiple", + "fitOption": "Fit Option", + "maintainAspectRatio": "Maintain Aspect Ratio", + "fitDocumentToPage": "Fit Document to Page", + "fillPage": "Izpolni stran", + "autoRotate": "Auto Rotate", + "autoRotateDescription": "Automatically rotate images to better fit the PDF page", + "combineImages": "Combine Images", + "combineImagesDescription": "Combine all images into one PDF, or create separate PDFs for each image", + "webOptions": "Web to PDF Options", + "zoomLevel": "Zoom Level", + "emailOptions": "Email to PDF Options", + "includeAttachments": "Include email attachments", + "maxAttachmentSize": "Maximum attachment size (MB)", + "includeAllRecipients": "Include CC and BCC recipients in header", + "downloadHtml": "Download HTML intermediate file instead of PDF", + "pdfaOptions": "PDF/A Options", + "outputFormat": "Output Format", + "pdfaNote": "PDF/A-1b is more compatible, PDF/A-2b supports more features.", + "pdfaDigitalSignatureWarning": "PDF vsebuje digitalni podpis. To bo odstranjeno v naslednjem koraku.", + "fileFormat": "File Format", + "wordDoc": "Word Document", + "wordDocExt": "Word Document (.docx)", + "odtExt": "OpenDocument Text (.odt)", + "pptExt": "PowerPoint (.pptx)", + "odpExt": "OpenDocument Presentation (.odp)", + "txtExt": "Plain Text (.txt)", + "rtfExt": "Rich Text Format (.rtf)", + "selectedFiles": "Selected files", + "noFileSelected": "No file selected. Use the file panel to add files.", + "convertFiles": "Convert Files", + "converting": "Converting...", + "downloadConverted": "Download Converted File", + "errorNoFiles": "Please select at least one file to convert.", + "errorNoFormat": "Please select both source and target formats.", + "errorNotSupported": "Conversion from {{from}} to {{to}} is not supported.", + "images": "Images", + "officeDocs": "Office Documents (Word, Excel, PowerPoint)", + "imagesExt": "Images (JPG, PNG, etc.)", + "markdown": "Markdown", + "textRtf": "Text/RTF", + "grayscale": "Sivine", + "errorConversion": "An error occurred while converting the file." }, "imageToPdf": { "tags": "pretvorba,img,jpg,slika,fotografija" @@ -727,7 +1263,33 @@ "8": "Odstrani zadnjega", "9": "Odstrani prvega in zadnjega", "10": "Sodo-liho spajanje", - "11": "Duplicate all pages" + "11": "Duplicate all pages", + "desc": { + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, â€Ļ).", + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, â€Ļ).", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimized for binding on the side)." + } + }, + "desc": { + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, â€Ļ).", + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, â€Ļ).", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimised for binding on the side).", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document." }, "placeholder": "(npr. 1,3,2 ali 4-8,2,10-12 ali 2n-1)" }, @@ -739,9 +1301,198 @@ "upload": "Dodaj sliko", "submit": "Dodaj sliko" }, + "attachments": { + "tags": "embed,attach,file,attachment,attachments", + "title": "Add attachments", + "header": "Add attachments", + "add": "Add Attachment", + "remove": "Remove Attachment", + "embed": "Embed Attachment", + "submit": "Add attachments" + }, "watermark": { - "tags": "Besedilo, ponavljajoče se, oznaka, lastno, avtorske pravice, blagovna znamka, img, jpg, slika, fotografija", "title": "Dodaj vodni Åžig", + "desc": "Add text or image watermarks to PDF files", + "completed": "Watermark added", + "submit": "Dodaj vodni Åžig", + "filenamePrefix": "watermarked", + "error": { + "failed": "An error occurred while adding watermark to the PDF." + }, + "watermarkType": { + "text": "Besedilo", + "image": "Image" + }, + "settings": { + "type": "Watermark Type", + "text": { + "label": "Watermark Text", + "placeholder": "Enter watermark text" + }, + "image": { + "label": "Watermark Image", + "choose": "Choose Image", + "selected": "Selected: {{filename}}" + }, + "fontSize": "Velikost pisave", + "size": "Size", + "alphabet": "Font/Language", + "color": "Watermark Colour", + "rotation": "Rotation (degrees)", + "opacity": "Opacity (%)", + "spacing": { + "horizontal": "Horizontal Spacing", + "vertical": "Vertical Spacing", + "height": "Height Spacing", + "width": "Width Spacing" + }, + "convertToImage": "Flatten PDF pages to images" + }, + "alphabet": { + "roman": "Roman/Latin", + "arabic": "Arabic", + "japanese": "Japanese", + "korean": "Korean", + "chinese": "Chinese", + "thai": "Thai" + }, + "steps": { + "type": "Watermark Type", + "wording": "Wording", + "textStyle": "Style", + "formatting": "Formatting", + "file": "Watermark File" + }, + "results": { + "title": "Watermark Results" + }, + "tooltip": { + "language": { + "title": "Language Support", + "text": "Choose the appropriate language setting to ensure proper font rendering for your text." + }, + "appearance": { + "title": "Appearance Settings", + "text": "Control how your watermark looks and blends with the document.", + "bullet1": "Rotation: -360° to 360° for angled watermarks", + "bullet2": "Opacity: 0-100% for transparency control", + "bullet3": "Lower opacity creates subtle watermarks" + }, + "spacing": { + "title": "Spacing Control", + "text": "Adjust the spacing between repeated watermarks across the page.", + "bullet1": "Width spacing: Horizontal distance between watermarks", + "bullet2": "Height spacing: Vertical distance between watermarks", + "bullet3": "Higher values create more spread out patterns" + }, + "type": { + "header": { + "title": "Watermark Type Selection" + }, + "description": { + "title": "Choose Your Watermark", + "text": "Select between text or image watermarks based on your needs." + }, + "text": { + "title": "Text Watermarks", + "text": "Perfect for adding copyright notices, company names, or confidentiality labels. Supports multiple languages and custom colours.", + "bullet1": "Customisable fonts and languages", + "bullet2": "Adjustable colours and transparency", + "bullet3": "Ideal for legal or branding text" + }, + "image": { + "title": "Image Watermarks", + "text": "Use logos, stamps, or any image as a watermark. Great for branding and visual identification.", + "bullet1": "Upload any image format", + "bullet2": "Maintains image quality", + "bullet3": "Perfect for logos and stamps" + } + }, + "wording": { + "header": { + "title": "Text Content" + }, + "text": { + "title": "Watermark Text", + "text": "Enter the text that will appear as your watermark across the document.", + "bullet1": "Keep it concise for better readability", + "bullet2": "Common examples: 'CONFIDENTIAL', 'DRAFT', company name", + "bullet3": "Emoji characters are not supported and will be filtered out" + } + }, + "textStyle": { + "header": { + "title": "Text Style" + }, + "color": { + "title": "Colour Selection", + "text": "Choose a colour that provides good contrast with your document content.", + "bullet1": "Light grey (#d3d3d3) for subtle watermarks", + "bullet2": "Black or dark colours for high contrast", + "bullet3": "Custom colours for branding purposes" + }, + "language": { + "title": "Language Support", + "text": "Choose the appropriate language setting to ensure proper font rendering." + } + }, + "file": { + "header": { + "title": "Image Upload" + }, + "upload": { + "title": "Image Selection", + "text": "Upload an image file to use as your watermark.", + "bullet1": "Supports common formats: PNG, JPG, GIF, BMP", + "bullet2": "PNG with transparency works best", + "bullet3": "Higher resolution images maintain quality better" + }, + "recommendations": { + "title": "Best Practices", + "text": "Tips for optimal image watermark results.", + "bullet1": "Use logos or stamps with transparent backgrounds", + "bullet2": "Simple designs work better than complex images", + "bullet3": "Consider the final document size when choosing resolution" + } + }, + "formatting": { + "header": { + "title": "Formatting & Layout" + }, + "size": { + "title": "Size Control", + "text": "Adjust the size of your watermark (text or image).", + "bullet1": "Larger sizes create more prominent watermarks" + }, + "appearance": { + "title": "Appearance Settings", + "text": "Control how your watermark looks and blends with the document.", + "bullet1": "Rotation: -360° to 360° for angled watermarks", + "bullet2": "Opacity: 0-100% for transparency control", + "bullet3": "Lower opacity creates subtle watermarks" + }, + "spacing": { + "title": "Spacing Control", + "text": "Adjust the spacing between repeated watermarks across the page.", + "bullet1": "Horizontal spacing: Distance between watermarks left to right", + "bullet2": "Vertical spacing: Distance between watermarks top to bottom", + "bullet3": "Higher values create more spread out patterns" + }, + "security": { + "title": "Security Option", + "text": "Convert the final PDF to an image-based format for enhanced security.", + "bullet1": "Prevents text selection and copying", + "bullet2": "Makes watermarks harder to remove", + "bullet3": "Results in larger file sizes", + "bullet4": "Best for sensitive or copyrighted content" + } + } + }, + "type": { + "1": "Besedilo", + "2": "Slika" + }, + "tags": "Besedilo, ponavljajoče se, oznaka, lastno, avtorske pravice, blagovna znamka, img, jpg, slika, fotografija", "header": "Dodaj vodni Åžig", "customColor": "Barva besedila po meri", "selectText": { @@ -755,17 +1506,6 @@ "8": "Vrsta vodnega Åžiga:", "9": "Slika vodnega Åžiga:", "10": "Pretvori PDF v PDF-sliko" - }, - "submit": "Dodaj vodni Åžig", - "type": { - "1": "Besedilo", - "2": "Slika" - }, - "watermarkType": { - "text": "Besedilo" - }, - "settings": { - "fontSize": "Velikost pisave" } }, "permissions": { @@ -790,50 +1530,201 @@ "removePages": { "tags": "Odstrani strani, izbriÅĄi strani", "title": "Odstrani", + "pageNumbers": { + "label": "Pages to Remove", + "placeholder": "e.g., 1,3,5-8,10", + "error": "Invalid page number format. Use numbers, ranges (1-5), or mathematical expressions (2n+1)" + }, + "filenamePrefix": "pages_removed", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "settings": { + "title": "Settings" + }, + "tooltip": { + "header": { + "title": "Remove Pages Settings" + }, + "pageNumbers": { + "title": "Page Selection", + "text": "Specify which pages to remove from your PDF. You can select individual pages, ranges, or use mathematical expressions.", + "bullet1": "Individual pages: 1,3,5 (removes pages 1, 3, and 5)", + "bullet2": "Page ranges: 1-5,10-15 (removes pages 1-5 and 10-15)", + "bullet3": "Mathematical: 2n+1 (removes odd pages)", + "bullet4": "Open ranges: 5- (removes from page 5 to end)" + }, + "examples": { + "title": "Common Examples", + "text": "Here are some common page selection patterns:", + "bullet1": "Remove first page: 1", + "bullet2": "Remove last 3 pages: -3", + "bullet3": "Remove every other page: 2n", + "bullet4": "Remove specific scattered pages: 1,5,10,15" + }, + "safety": { + "title": "Safety Tips", + "text": "Important considerations when removing pages:", + "bullet1": "Always preview your selection before processing", + "bullet2": "Keep a backup of your original file", + "bullet3": "Page numbers start from 1, not 0", + "bullet4": "Invalid page numbers will be ignored" + } + }, + "error": { + "failed": "An error occurred whilst removing pages." + }, + "results": { + "title": "Page Removal Results" + }, "submit": "Odstrani" }, - "addPassword": { - "tags": "varno,varnost", - "title": "Dodaj geslo", - "header": "Dodaj geslo (Å ifriraj)", - "selectText": { - "1": "Izberite PDF za ÅĄifriranje", - "2": "UporabniÅĄko geslo", - "3": "DolÅžina ÅĄifrirnega ključa", - "4": "ViÅĄje vrednosti so močnejÅĄe, niÅžje vrednosti pa imajo boljÅĄo zdruÅžljivost.", - "5": "Dovoljenja za nastavitev (priporočeno za uporabo skupaj z geslom lastnika)", - "6": "Prepreči sestavljanje dokumenta", - "7": "Prepreči ekstrakcijo vsebine", - "8": "Prepreči ekstrakcijo za dostopnost", - "9": "Prepreči izpolnjevanje obrazca", - "10": "Prepreči spreminjanje", - "11": "Prepreči spreminjanje pripisov", - "12": "Prepreči tiskanje", - "13": "Prepreči tiskanje različnih formatov", - "14": "LastniÅĄko geslo", - "15": "Omejuje, kaj je mogoče storiti z dokumentom, ko je odprt (ni podprt za vse bralnike)", - "16": "Omeji odpiranje samega dokumenta" + "extractPages": { + "title": "Extract Pages", + "pageNumbers": { + "label": "Pages to Extract", + "placeholder": "e.g., 1,3,5-8 or odd & 1-10" + }, + "settings": { + "title": "Settings" }, - "submit": "Å ifriraj", "tooltip": { - "permissions": { - "title": "Spremeni dovoljenja" + "description": "Extracts the selected pages into a new PDF, preserving order." + }, + "error": { + "failed": "Failed to extract pages" + }, + "results": { + "title": "Pages Extracted" + }, + "submit": "Extract Pages" + }, + "pageSelection": { + "tooltip": { + "header": { + "title": "Page Selection Guide" + }, + "basic": { + "title": "Basic Usage", + "text": "Select specific pages from your PDF document using simple syntax.", + "bullet1": "Individual pages: 1,3,5", + "bullet2": "Page ranges: 3-6 or 10-15", + "bullet3": "All pages: all" + }, + "advanced": { + "title": "Advanced Features" + }, + "tips": { + "title": "Tips", + "text": "Keep these guidelines in mind:", + "bullet1": "Page numbers start from 1 (not 0)", + "bullet2": "Spaces are automatically removed", + "bullet3": "Invalid expressions are ignored" + }, + "syntax": { + "title": "Syntax Basics", + "text": "Use numbers, ranges, keywords, and progressions (n starts at 0). Parentheses are supported.", + "bullets": { + "numbers": "Numbers/ranges: 5, 10-20", + "keywords": "Keywords: odd, even", + "progressions": "Progressions: 3n, 4n+1" + } + }, + "operators": { + "title": "Operators", + "text": "AND has higher precedence than comma. NOT applies within the document range.", + "and": "AND: & or \"and\" — require both conditions (e.g., 1-50 & even)", + "comma": "Comma: , or | — combine selections (e.g., 1-10, 20)", + "not": "NOT: ! or \"not\" — exclude pages (e.g., 3n & not 30)" + }, + "examples": { + "title": "Examples" + }, + "complex": { + "bullet1": "1,3-5,8,2n → pages 1, 3–5, 8, plus evens", + "bullet2": "10-,2n-1 → from page 10 to end + odd pages", + "description": "Mix different types.", + "title": "Complex Combinations" + }, + "description": "Choose which pages to use for the operation. Supports single pages, ranges, formulas, and the all keyword.", + "individual": { + "bullet1": "1,3,5 → selects pages 1, 3, 5", + "bullet2": "2,7,12 → selects pages 2, 7, 12", + "description": "Enter numbers separated by commas.", + "title": "Individual Pages" + }, + "mathematical": { + "bullet1": "2n → all even pages (2, 4, 6â€Ļ)", + "bullet2": "2n-1 → all odd pages (1, 3, 5â€Ļ)", + "bullet3": "3n → every 3rd page (3, 6, 9â€Ļ)", + "bullet4": "4n-1 → pages 3, 7, 11, 15â€Ļ", + "description": "Use n in formulas for patterns.", + "title": "Mathematical Functions" + }, + "ranges": { + "bullet1": "3-6 → selects pages 3–6", + "bullet2": "10-15 → selects pages 10–15", + "bullet3": "5- → selects pages 5 to end", + "description": "Use - for consecutive pages.", + "title": "Page Ranges" + }, + "special": { + "bullet1": "all → selects all pages", + "title": "Special Keywords" } } }, - "removePassword": { - "tags": "varno,deÅĄifriranje,varnost,odstranitev gesla,brisanje gesla", - "title": "Odstrani geslo", - "header": "Odstrani geslo (deÅĄifriraj)", - "selectText": { - "1": "Izberite PDF za deÅĄifriranje", - "2": "Geslo" + "bulkSelection": { + "syntaxError": "There is a syntax issue. See Page Selection tips for help.", + "header": { + "title": "Page Selection Guide" }, - "submit": "Odstrani", - "desc": "Odstranite zaÅĄÄito z geslom iz vaÅĄega dokumenta PDF.", - "password": { - "stepTitle": "Odstrani geslo", - "label": "Trenutno geslo" + "syntax": { + "title": "Syntax Basics", + "text": "Use numbers, ranges, keywords, and progressions (n starts at 0). Parentheses are supported.", + "bullets": { + "numbers": "Numbers/ranges: 5, 10-20", + "keywords": "Keywords: odd, even", + "progressions": "Progressions: 3n, 4n+1" + } + }, + "operators": { + "title": "Operators", + "text": "AND has higher precedence than comma. NOT applies within the document range.", + "and": "AND: & or \"and\" — require both conditions (e.g., 1-50 & even)", + "comma": "Comma: , or | — combine selections (e.g., 1-10, 20)", + "not": "NOT: ! or \"not\" — exclude pages (e.g., 3n & not 30)" + }, + "examples": { + "title": "Examples", + "first50": "First 50", + "last50": "Last 50", + "every3rd": "Every 3rd", + "oddWithinExcluding": "Odd within 1-20 excluding 5-7", + "combineSets": "Combine sets" + }, + "firstNPages": { + "title": "First N Pages", + "placeholder": "Number of pages" + }, + "lastNPages": { + "title": "Last N Pages", + "placeholder": "Number of pages" + }, + "everyNthPage": { + "title": "Every Nth Page", + "placeholder": "Step size" + }, + "range": { + "title": "Range", + "fromPlaceholder": "From", + "toPlaceholder": "To" + }, + "keywords": { + "title": "Keywords" + }, + "advanced": { + "title": "Advanced" } }, "compressPdfs": { @@ -843,12 +1734,142 @@ "tags": "remove,delete,form,field,readonly", "title": "Remove Read-Only from Form Fields", "header": "Unlock PDF Forms", - "submit": "Remove" + "submit": "Remove", + "description": "This tool will remove read-only restrictions from PDF form fields, making them editable and fillable.", + "filenamePrefix": "unlocked_forms", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst unlocking PDF forms." + }, + "results": { + "title": "Unlocked Forms Results" + } }, "changeMetadata": { - "tags": "Naslov,avtor,datum,kreacija,čas,zaloÅžnik,producent,statistika", - "title": "Spremeni metapodatke", "header": "Spremeni metapodatke", + "submit": "Spremeni", + "filenamePrefix": "metadata", + "settings": { + "title": "Metadata Settings" + }, + "standardFields": { + "title": "Standard Fields" + }, + "deleteAll": { + "label": "Remove Existing Metadata", + "checkbox": "Delete all metadata" + }, + "title": { + "label": "Title", + "placeholder": "Document title" + }, + "author": { + "label": "Author", + "placeholder": "Document author" + }, + "subject": { + "label": "Subject", + "placeholder": "Document subject" + }, + "keywords": { + "label": "Keywords", + "placeholder": "Document keywords" + }, + "creator": { + "label": "Creator", + "placeholder": "Document creator" + }, + "producer": { + "label": "Producer", + "placeholder": "Document producer" + }, + "dates": { + "title": "Date Fields" + }, + "creationDate": { + "label": "Creation Date", + "placeholder": "Creation date" + }, + "modificationDate": { + "label": "Modification Date", + "placeholder": "Modification date" + }, + "trapped": { + "label": "Trapped Status", + "unknown": "Unknown", + "true": "True", + "false": "False" + }, + "advanced": { + "title": "Advanced Options" + }, + "customFields": { + "title": "Custom Metadata", + "description": "Add custom metadata fields to the document", + "add": "Add Field", + "key": "Key", + "keyPlaceholder": "Custom key", + "value": "Value", + "valuePlaceholder": "Custom value", + "remove": "Remove" + }, + "results": { + "title": "Updated PDFs" + }, + "error": { + "failed": "An error occurred while changing the PDF metadata." + }, + "tooltip": { + "header": { + "title": "PDF Metadata Overview" + }, + "standardFields": { + "title": "Standard Fields", + "text": "Common PDF metadata fields that describe the document.", + "bullet1": "Title: Document name or heading", + "bullet2": "Author: Person who created the document", + "bullet3": "Subject: Brief description of content", + "bullet4": "Keywords: Search terms for the document", + "bullet5": "Creator/Producer: Software used to create the PDF" + }, + "dates": { + "title": "Date Fields", + "text": "When the document was created and modified.", + "bullet1": "Creation Date: When original document was made", + "bullet2": "Modification Date: When last changed" + }, + "options": { + "title": "Additional Options", + "text": "Custom fields and privacy controls.", + "bullet1": "Custom Metadata: Add your own key-value pairs", + "bullet2": "Trapped Status: High-quality printing setting", + "bullet3": "Delete All: Remove all metadata for privacy" + }, + "deleteAll": { + "title": "Remove Existing Metadata", + "text": "Complete metadata deletion to ensure privacy." + }, + "customFields": { + "title": "Custom Metadata", + "text": "Add your own custom key-value metadata pairs.", + "bullet1": "Add any custom fields relevant to your document", + "bullet2": "Examples: Department, Project, Version, Status", + "bullet3": "Both key and value are required for each entry" + }, + "advanced": { + "title": "Advanced Options", + "trapped": { + "title": "Trapped Status", + "description": "Indicates if document is prepared for high-quality printing.", + "bullet1": "True: Document has been trapped for printing", + "bullet2": "False: Document has not been trapped", + "bullet3": "Unknown: Trapped status is not specified" + } + } + }, + "tags": "Naslov,avtor,datum,kreacija,čas,zaloÅžnik,producent,statistika", "selectText": { "1": "Prosimo, uredite spremenljivke, ki jih Åželite spremeniti", "2": "IzbriÅĄi vse metapodatke", @@ -856,15 +1877,7 @@ "4": "Drugi metapodatki:", "5": "Dodaj vnos metapodatkov po meri" }, - "author": "Avtor:", - "creationDate": "Datum ustvarjanja (llll/MM/dd HH:mm:ss):", - "creator": "Ustvarjalec:", - "keywords": "Ključne besede:", - "modDate": "Datum spremembe (llll/MM/dd HH:mm:ss):", - "producer": "Proizvajalec:", - "subject": "Zadeva:", - "trapped": "Ujet:", - "submit": "Spremeni" + "modDate": "Datum spremembe (llll/MM/dd HH:mm:ss):" }, "fileToPDF": { "tags": "transformacija,format,dokument,slika,diapozitiv,besedilo,konverzija,office,docs,word,excel,powerpoint", @@ -878,6 +1891,7 @@ "ocr": { "tags": "prepoznavanje,besedilo,slika,skeniranje,branje,prepoznavanje,zaznavanje,urejanje", "title": "OCR / ČiÅĄÄenje skeniranja", + "desc": "Cleanup skenira in zazna besedilo iz slik znotraj PDF-ja in ga ponovno doda kot besedilo.", "header": "Čistilni pregledi / OCR (optično prepoznavanje znakov)", "selectText": { "1": "Izberite jezike, ki jih Åželite zaznati v PDF-ju (navedeni so tisti, ki so trenutno zaznani):", @@ -896,23 +1910,89 @@ "help": "Prosimo, preberite to dokumentacijo o uporabi tega za druge jezike in/ali uporabi ne v dockerju", "credit": "Ta storitev uporablja qpdf in Tesseract za OCR.", "submit": "Obdelaj PDF z OCR", - "desc": "Cleanup skenira in zazna besedilo iz slik znotraj PDF-ja in ga ponovno doda kot besedilo.", + "operation": { + "submit": "Process OCR and Review" + }, + "results": { + "title": "OCR Results" + }, + "languagePicker": { + "additionalLanguages": "Looking for additional languages?", + "viewSetupGuide": "View setup guide →" + }, "settings": { "title": "Nastavitve", "ocrMode": { - "label": "Način OCR" + "label": "Način OCR", + "auto": "Auto (skip text layers)", + "force": "Force (re-OCR all, replace text)", + "strict": "Strict (abort if text found)" }, "languages": { - "label": "Jeziki" + "label": "Jeziki", + "placeholder": "Select languages" + }, + "compatibilityMode": { + "label": "Compatibility Mode" + }, + "advancedOptions": { + "label": "Processing Options", + "sidecar": "Create a text file", + "deskew": "Deskew pages", + "clean": "Clean input file", + "cleanFinal": "Clean final output" } }, "tooltip": { + "header": { + "title": "OCR Settings Overview" + }, "mode": { - "title": "Način OCR" + "title": "Način OCR", + "text": "Optical Character Recognition (OCR) helps you turn scanned or screenshotted pages into text you can search, copy, or highlight.", + "bullet1": "Auto skips pages that already contain text layers.", + "bullet2": "Force re-OCRs every page and replaces all the text.", + "bullet3": "Strict halts if any selectable text is found." }, "languages": { - "title": "Jeziki" + "title": "Jeziki", + "text": "Improve OCR accuracy by specifying the expected languages. Choose one or more languages to guide detection." + }, + "output": { + "title": "Output", + "text": "Decide how you want the text output formatted:", + "bullet1": "Searchable PDF embeds text behind the original image.", + "bullet2": "HOCR XML returns a structured machine-readable file.", + "bullet3": "Plain-text sidecar creates a separate .txt file with raw content." + }, + "advanced": { + "header": { + "title": "Advanced OCR Processing" + }, + "compatibility": { + "title": "Compatibility Mode", + "text": "Uses OCR 'sandwich PDF' mode: results in larger files, but more reliable with certain languages and older PDF software. By default we use hOCR for smaller, modern PDFs." + }, + "sidecar": { + "title": "Create Text File", + "text": "Generates a separate .txt file alongside the PDF containing all extracted text content for easy access and processing." + }, + "deskew": { + "title": "Deskew Pages", + "text": "Automatically corrects skewed or tilted pages to improve OCR accuracy. Useful for scanned documents that weren't perfectly aligned." + }, + "clean": { + "title": "Clean Input File", + "text": "Preprocesses the input by removing noise, enhancing contrast, and optimising the image for better OCR recognition before processing." + }, + "cleanFinal": { + "title": "Clean Final Output", + "text": "Post-processes the final PDF by removing OCR artefacts and optimising the text layer for better readability and smaller file size." + } } + }, + "error": { + "failed": "OCR operation failed" } }, "extractImages": { @@ -921,7 +2001,13 @@ "header": "Izvleci slike", "selectText": "Izberite format slike za pretvorbo ekstrahiranih slik", "allowDuplicates": "Shrani podvojene slike", - "submit": "Izvleček" + "submit": "Izvleček", + "settings": { + "title": "Settings" + }, + "error": { + "failed": "An error occurred while extracting images from the PDF." + } }, "pdfToPDFA": { "tags": "archive,long-term,standard,conversion,storage,preservation", @@ -993,17 +2079,53 @@ }, "info": "Python ni nameÅĄÄen. Za tek je potrebno." }, + "scannerImageSplit": { + "title": "Extracted Images", + "submit": "Extract Image Scans", + "error": { + "failed": "An error occurred while extracting image scans." + }, + "tooltip": { + "title": "Photo Splitter", + "whatThisDoes": "What this does", + "whatThisDoesDesc": "Automatically finds and extracts each photo from a scanned page or composite image—no manual cropping.", + "whenToUse": "When to use", + "useCase1": "Scan whole album pages in one go", + "useCase2": "Split flatbed batches into separate files", + "useCase3": "Break collages into individual photos", + "useCase4": "Pull photos from documents", + "quickFixes": "Quick fixes", + "problem1": "Photos not detected → increase Tolerance to 30-50", + "problem2": "Too many false detections → increase Minimum Area to 15,000-20,000", + "problem3": "Crops are too tight → increase Border Size to 5-10", + "problem4": "Tilted photos not straightened → lower Angle Threshold to ~5°", + "problem5": "Dust/noise boxes → increase Minimum Contour Area to 1000-2000", + "setupTips": "Setup tips", + "tip1": "Use a plain, light background", + "tip2": "Leave a small gap (≈1 cm) between photos", + "tip3": "Scan at 300-600 DPI", + "tip4": "Clean the scanner glass", + "headsUp": "Heads-up", + "headsUpDesc": "Overlapping photos or backgrounds very close in colour to the photos can reduce accuracy-try a lighter or darker background and leave more space." + } + }, "sign": { - "tags": "avtoriziraj,začetnice,narisan-podpis,besedilni-znak,podpis-slike", "title": "PodpiÅĄi", "header": "PodpiÅĄi PDF-je", "upload": "NaloÅži sliko", - "draw": "NariÅĄi podpis", - "text": "Vnos besedila", + "draw": { + "title": "Draw your signature", + "clear": "Clear" + }, + "text": { + "name": "Signer Name", + "placeholder": "Enter your full name" + }, "clear": "Počisti", "add": "Dodaj", "saved": "Shranjeni podpisi", "save": "Shrani podpis", + "applySignatures": "Apply Signatures", "personalSigs": "Osebni podpisi", "sharedSigs": "Skupni podpisi", "noSavedSigs": "Ni shranjenih podpisov", @@ -1015,42 +2137,179 @@ "previous": "PrejÅĄnja stran", "maintainRatio": "Preklopi ohranjanje razmerja stranic", "undo": "Razveljavi", - "redo": "Ponovi" + "redo": "Ponovi", + "submit": "Sign Document", + "steps": { + "configure": "Configure Signature" + }, + "type": { + "title": "Signature Type", + "draw": "Draw", + "canvas": "Canvas", + "image": "Image", + "text": "Text" + }, + "image": { + "label": "Upload signature image", + "placeholder": "Select image file", + "hint": "Upload a PNG or JPG image of your signature" + }, + "instructions": { + "title": "How to add signature", + "canvas": "After drawing your signature in the canvas, close the modal then click anywhere on the PDF to place it.", + "image": "After uploading your signature image above, click anywhere on the PDF to place it.", + "text": "After entering your name above, click anywhere on the PDF to place your signature." + }, + "mode": { + "move": "Move Signature", + "place": "Place Signature" + }, + "updateAndPlace": "Update and Place", + "activate": "Activate Signature Placement", + "deactivate": "Stop Placing Signatures", + "results": { + "title": "Signature Results" + }, + "error": { + "failed": "An error occurred while signing the PDF." + }, + "tags": "avtoriziraj,začetnice,narisan-podpis,besedilni-znak,podpis-slike" }, "flatten": { - "tags": "static,deactivate,non-interactive,streamline", "title": "Zravnaj", "header": "Zravnaj PDF", "flattenOnlyForms": "SploÅĄÄi samo obrazce", "submit": "Zravnaj", + "filenamePrefix": "flattened", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, "steps": { "settings": "Nastavitve" }, "options": { - "flattenOnlyForms": "SploÅĄÄi samo obrazce" - } + "stepTitle": "Flatten Options", + "title": "Flatten Options", + "flattenOnlyForms": { + "label": "SploÅĄÄi samo obrazce", + "desc": "Only flatten form fields, leaving other interactive elements intact" + }, + "note": "Flattening removes interactive elements from the PDF, making them non-editable." + }, + "results": { + "title": "Flatten Results" + }, + "error": { + "failed": "An error occurred while flattening the PDF." + }, + "tooltip": { + "header": { + "title": "About Flattening PDFs" + }, + "description": { + "title": "What does flattening do?", + "text": "Flattening makes your PDF non-editable by turning fillable forms and buttons into regular text and images. The PDF will look exactly the same, but no one can change or fill in the forms anymore. Perfect for sharing completed forms, creating final documents for records, or ensuring the PDF looks the same everywhere.", + "bullet1": "Text boxes become regular text (can't be edited)", + "bullet2": "Checkboxes and buttons become pictures", + "bullet3": "Great for final versions you don't want changed", + "bullet4": "Ensures consistent appearance across all devices" + }, + "formsOnly": { + "title": "What does 'Flatten only forms' mean?", + "text": "This option only removes the ability to fill in forms, but keeps other features working like clicking links, viewing bookmarks, and reading comments.", + "bullet1": "Forms become non-editable", + "bullet2": "Links still work when clicked", + "bullet3": "Comments and notes remain visible", + "bullet4": "Bookmarks still help you navigate" + } + }, + "tags": "static,deactivate,non-interactive,streamline" }, "repair": { "tags": "popravi,obnovi,popravi,obnovi", "title": "Popravilo", "header": "Popravi datoteke PDF", - "submit": "Popravilo" + "submit": "Popravilo", + "description": "This tool will attempt to repair corrupted or damaged PDF files. No additional settings are required.", + "filenamePrefix": "repaired", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst repairing the PDF." + }, + "results": { + "title": "Repair Results" + } }, "removeBlanks": { - "tags": "cleanup,streamline,non-content,organize", "title": "Odstrani praznine", "header": "Odstrani prazne strani", - "threshold": "Prag beline slikovnih pik:", + "settings": { + "title": "Settings" + }, + "threshold": { + "label": "Pixel Whiteness Threshold" + }, + "whitePercent": { + "label": "White Percentage Threshold", + "unit": "%" + }, + "includeBlankPages": { + "label": "Include detected blank pages" + }, + "tooltip": { + "header": { + "title": "Remove Blank Pages Settings" + }, + "threshold": { + "title": "Pixel Whiteness Threshold", + "text": "Controls how white a pixel must be to be considered 'white'. This helps determine what counts as a blank area on the page.", + "bullet1": "0 = Pure black (most restrictive)", + "bullet2": "128 = Medium grey", + "bullet3": "255 = Pure white (least restrictive)" + }, + "whitePercent": { + "title": "White Percentage Threshold", + "text": "Sets the minimum percentage of white pixels required for a page to be considered blank and removed.", + "bullet1": "Lower values (e.g., 80%) = More pages removed", + "bullet2": "Higher values (e.g., 95%) = Only very blank pages removed", + "bullet3": "Use higher values for documents with light backgrounds" + }, + "includeBlankPages": { + "title": "Include Detected Blank Pages", + "text": "When enabled, creates a separate PDF containing all the blank pages that were detected and removed from the original document.", + "bullet1": "Useful for reviewing what was removed", + "bullet2": "Helps verify the detection accuracy", + "bullet3": "Can be disabled to reduce output file size" + } + }, + "submit": "Odstrani praznine", + "error": { + "failed": "Failed to remove blank pages" + }, + "results": { + "title": "Removed Blank Pages" + }, + "tags": "cleanup,streamline,non-content,organize", "thresholdDesc": "Prag za določanje, kako bel mora biti bel piksel, da je označen kot 'bel'. 0 = črna, 255 čisto bela.", - "whitePercent": "Odstotek beline (%):", - "whitePercentDesc": "Odstotek strani, ki mora imeti 'bele' slikovne pike za odstranitev", - "submit": "Odstrani praznine" + "whitePercentDesc": "Odstotek strani, ki mora imeti 'bele' slikovne pike za odstranitev" }, "removeAnnotations": { "tags": "comments,highlight,notes,markup,remove", "title": "Odstrani opombe", "header": "Odstrani opombe", - "submit": "Odstrani" + "submit": "Odstrani", + "settings": { + "title": "Settings" + }, + "info": { + "title": "About Remove Annotations", + "description": "This tool will remove all annotations (comments, highlights, notes, etc.) from your PDF documents." + }, + "error": { + "failed": "An error occurred while removing annotations from the PDF." + } }, "compare": { "tags": "diferenciiraj,kontrast,spremembe,analiza", @@ -1082,6 +2341,142 @@ "certSign": { "tags": "avtentikacija,PEM,P12,uradno,ÅĄifriranje", "title": "Podpisovanje potrdila", + "filenamePrefix": "signed", + "signMode": { + "stepTitle": "Sign Mode", + "tooltip": { + "header": { + "title": "About PDF Signatures" + }, + "overview": { + "title": "How signatures work", + "text": "Both modes seal the document (any edits are flagged as tampering) and record who/when/how for auditing. Viewer trust depends on the certificate chain." + }, + "manual": { + "title": "Manual - Bring your certificate", + "text": "Use your own certificate files for brand-aligned identity. Can display Trusted when your CA/chain is recognised.", + "use": "Use for: customer-facing, legal, compliance." + }, + "auto": { + "title": "Auto - Zero-setup, instant system seal", + "text": "Signs with a server self-signed certificate. Same tamper-evident seal and audit trail; typically shows Unverified in viewers.", + "use": "Use when: you need speed and consistent internal identity across reviews and records." + }, + "rule": { + "title": "Rule of thumb", + "text": "Need recipient Trusted status? Manual. Need a fast, tamper-evident seal and audit trail with no setup? Auto." + } + } + }, + "certTypeStep": { + "stepTitle": "Certificate Format" + }, + "certFiles": { + "stepTitle": "Certificate Files" + }, + "appearance": { + "stepTitle": "Signature Appearance", + "tooltip": { + "header": { + "title": "About Signature Appearance" + }, + "invisible": { + "title": "Invisible Signatures", + "text": "The signature is added to the PDF for security but won't be visible when viewing the document. Perfect for legal requirements without changing the document's appearance.", + "bullet1": "Provides security without visual changes", + "bullet2": "Meets legal requirements for digital signing", + "bullet3": "Doesn't affect document layout or design" + }, + "visible": { + "title": "Visible Signatures", + "text": "Shows a signature block on the PDF with your name, date, and optional details. Useful when you want readers to clearly see the document is signed.", + "bullet1": "Shows signer name and date on the document", + "bullet2": "Can include reason and location for signing", + "bullet3": "Choose which page to place the signature", + "bullet4": "Optional logo can be included" + } + }, + "invisible": "Invisible", + "options": { + "title": "Signature Details" + }, + "visible": "Visible" + }, + "sign": { + "submit": "Sign PDF", + "results": "Signed PDF" + }, + "error": { + "failed": "An error occurred whilst processing signatures." + }, + "tooltip": { + "header": { + "title": "About Managing Signatures" + }, + "overview": { + "title": "What can this tool do?", + "text": "This tool lets you check if your PDFs are digitally signed and add new digital signatures. Digital signatures prove who created or approved a document and show if it has been changed since signing.", + "bullet1": "Check existing signatures and their validity", + "bullet2": "View detailed information about signers and certificates", + "bullet3": "Add new digital signatures to secure your documents", + "bullet4": "Multiple files supported with easy navigation" + }, + "validation": { + "title": "Checking Signatures", + "text": "When you check signatures, the tool tells you if they're valid, who signed the document, when it was signed, and whether the document has been changed since signing.", + "bullet1": "Shows if signatures are valid or invalid", + "bullet2": "Displays signer information and signing date", + "bullet3": "Checks if the document was modified after signing", + "bullet4": "Can use custom certificates for verification" + }, + "signing": { + "title": "Adding Signatures", + "text": "To sign a PDF, you need a digital certificate (like PEM, PKCS12, or JKS). You can choose to make the signature visible on the document or keep it invisible for security only.", + "bullet1": "Supports PEM, PKCS12, JKS, and server certificate formats", + "bullet2": "Option to show or hide signature on the PDF", + "bullet3": "Add reason, location, and signer name", + "bullet4": "Choose which page to place visible signatures", + "bullet5": "Use server certificate for simple 'Sign with Stirling-PDF' option" + } + }, + "certType": { + "tooltip": { + "header": { + "title": "About Certificate Types" + }, + "what": { + "title": "What's a certificate?", + "text": "It's a secure ID for your signature that proves you signed. Unless you're required to sign via certificate, we recommend using another secure method like Type, Draw, or Upload." + }, + "which": { + "title": "Which option should I use?", + "text": "Choose the format that matches your certificate file:", + "bullet1": "PKCS#12 (.p12 / .pfx) – one combined file (most common)", + "bullet2": "PFX (.pfx) – Microsoft's version of PKCS12", + "bullet3": "PEM – separate private-key and certificate .pem files", + "bullet4": "JKS – Java .jks keystore for dev / CI-CD workflows" + }, + "convert": { + "title": "Key not listed?", + "text": "Convert your file to a Java keystore (.jks) with keytool, then pick JKS." + } + } + }, + "chooseCertificate": "Choose Certificate File", + "chooseJksFile": "Choose JKS File", + "chooseP12File": "Choose PKCS12 File", + "choosePfxFile": "Choose PFX File", + "choosePrivateKey": "Choose Private Key File", + "location": "Lokacija", + "logoTitle": "Logo", + "name": "Ime", + "noLogo": "No Logo", + "pageNumber": "Page Number", + "password": "Vnesite geslo shrambe ključev ali zasebnega ključa (če obstaja):", + "passwordOptional": "Leave empty if no password", + "reason": "Razlog", + "serverCertMessage": "Using server certificate - no files or password required", + "showLogo": "PrikaÅži logotip", "header": "PodpiÅĄite PDF s svojim potrdilom (Delo v teku)", "selectPDF": "Izberite datoteko PDF za podpis:", "jksNote": "Opomba: Če vaÅĄa vrsta potrdila ni navedena spodaj, jo pretvorite v datoteko Java Keystore (.jks) z orodjem ukazne vrstice keytool. Nato spodaj izberite moÅžnost datoteke .jks.", @@ -1089,13 +2484,7 @@ "selectCert": "Izberite svojo datoteko potrdila (format X.509, lahko je .pem ali .der):", "selectP12": "Izberite datoteko shrambe ključev PKCS#12 (.p12 ali .pfx) (izbirno, če je na voljo, mora vsebovati vaÅĄ zasebni ključ in potrdilo):", "selectJKS": "Izberite datoteko shrambe ključev Java (.jks ali .keystore):", - "certType": "Vrsta potrdila", - "password": "Vnesite geslo shrambe ključev ali zasebnega ključa (če obstaja):", "showSig": "PrikaÅži podpis", - "reason": "Razlog", - "location": "Lokacija", - "name": "Ime", - "showLogo": "PrikaÅži logotip", "submit": "PodpiÅĄi PDF" }, "removeCertSign": { @@ -1103,7 +2492,18 @@ "title": "Odstrani podpis potrdila", "header": "Odstranite digitalno potrdilo iz PDF-ja", "selectPDF": "Izberite datoteko PDF:", - "submit": "Odstrani podpis" + "submit": "Odstrani podpis", + "description": "This tool will remove digital certificate signatures from your PDF document.", + "filenamePrefix": "unsigned", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst removing certificate signatures." + }, + "results": { + "title": "Certificate Removal Results" + } }, "pageLayout": { "tags": "spoji,sestavi,enojni pogled,organiziraj", @@ -1111,16 +2511,157 @@ "header": "Postavitev več strani", "pagesPerSheet": "Strani na list:", "addBorder": "Dodaj obrobe", - "submit": "PoÅĄlji" + "submit": "PoÅĄlji", + "desc": { + "2": "Place 2 pages side-by-side on a single sheet.", + "3": "Place 3 pages on a single sheet in a single row.", + "4": "Place 4 pages on a single sheet (2 × 2 grid).", + "9": "Place 9 pages on a single sheet (3 × 3 grid).", + "16": "Place 16 pages on a single sheet (4 × 4 grid)." + }, + "error": { + "failed": "An error occurred while creating the multi-page layout." + } + }, + "bookletImposition": { + "tags": "booklet,imposition,printing,binding,folding,signature", + "title": "Booklet Imposition", + "header": "Booklet Imposition", + "submit": "Create Booklet", + "spineLocation": { + "label": "Spine Location", + "left": "Left (Standard)", + "right": "Right (RTL)" + }, + "doubleSided": { + "label": "Double-sided printing", + "tooltip": "Creates both front and back sides for proper booklet printing" + }, + "manualDuplex": { + "title": "Manual Duplex Mode", + "instructions": "For printers without automatic duplex. You'll need to run this twice:" + }, + "duplexPass": { + "label": "Print Pass", + "first": "1st Pass", + "second": "2nd Pass", + "firstInstructions": "Prints front sides → stack face-down → run again with 2nd Pass", + "secondInstructions": "Load printed stack face-down → prints back sides" + }, + "rtlBinding": { + "label": "Right-to-left binding", + "tooltip": "For Arabic, Hebrew, or other right-to-left languages" + }, + "addBorder": { + "label": "Add borders around pages", + "tooltip": "Adds borders around each page section to help with cutting and alignment" + }, + "addGutter": { + "label": "Add gutter margin", + "tooltip": "Adds inner margin space for binding" + }, + "gutterSize": { + "label": "Gutter size (points)" + }, + "flipOnShortEdge": { + "label": "Flip on short edge (automatic duplex only)", + "tooltip": "Enable for short-edge duplex printing (automatic duplex only - ignored in manual mode)", + "manualNote": "Not needed in manual mode - you flip the stack yourself" + }, + "advanced": { + "toggle": "Advanced Options" + }, + "paperSizeNote": "Paper size is automatically derived from your first page.", + "tooltip": { + "header": { + "title": "Booklet Creation Guide" + }, + "description": { + "title": "What is Booklet Imposition?", + "text": "Creates professional booklets by arranging pages in the correct printing order. Your PDF pages are placed 2-up on landscape sheets so when folded and bound, they read in proper sequence like a real book." + }, + "example": { + "title": "Example: 8-Page Booklet", + "text": "Your 8-page document becomes 2 sheets:", + "bullet1": "Sheet 1 Front: Pages 8, 1 | Back: Pages 2, 7", + "bullet2": "Sheet 2 Front: Pages 6, 3 | Back: Pages 4, 5", + "bullet3": "When folded & stacked: Reads 1→2→3→4→5→6→7→8" + }, + "printing": { + "title": "How to Print & Assemble", + "text": "Follow these steps for perfect booklets:", + "bullet1": "Print double-sided with 'Flip on long edge'", + "bullet2": "Stack sheets in order, fold in half", + "bullet3": "Staple or bind along the folded spine", + "bullet4": "For short-edge printers: Enable 'Flip on short edge' option" + }, + "manualDuplex": { + "title": "Manual Duplex (Single-sided Printers)", + "text": "For printers without automatic duplex:", + "bullet1": "Turn OFF 'Double-sided printing'", + "bullet2": "Select '1st Pass' → Print → Stack face-down", + "bullet3": "Select '2nd Pass' → Load stack → Print backs", + "bullet4": "Fold and assemble as normal" + }, + "advanced": { + "title": "Advanced Options", + "text": "Fine-tune your booklet:", + "bullet1": "Right-to-Left Binding: For Arabic, Hebrew, or RTL languages", + "bullet2": "Borders: Shows cut lines for trimming", + "bullet3": "Gutter Margin: Adds space for binding/stapling", + "bullet4": "Short-edge Flip: Only for automatic duplex printers" + } + }, + "error": { + "failed": "An error occurred while creating the booklet imposition." + } }, "scalePages": { - "tags": "resize,modify,dimension,adapt", "title": "Prilagodi velikost strani", "header": "Prilagodi velikost strani", "pageSize": "Velikost strani dokumenta.", "keepPageSize": "Izvirna velikost", "scaleFactor": "Raven povečave (obrezovanje) strani.", - "submit": "PoÅĄlji" + "submit": "PoÅĄlji", + "tags": "resize,modify,dimension,adapt" + }, + "adjustPageScale": { + "tags": "resize,modify,dimension,adapt", + "title": "Adjust Page Scale", + "header": "Adjust Page Scale", + "scaleFactor": { + "label": "Scale Factor" + }, + "pageSize": { + "label": "Target Page Size", + "keep": "Keep Original Size", + "letter": "Letter", + "legal": "Legal" + }, + "submit": "Adjust Page Scale", + "error": { + "failed": "An error occurred while adjusting the page scale." + }, + "tooltip": { + "header": { + "title": "Page Scale Settings Overview" + }, + "description": { + "title": "Description", + "text": "Adjust the size of PDF content and change the page dimensions." + }, + "scaleFactor": { + "title": "Scale Factor", + "text": "Controls how large or small the content appears on the page. Content is scaled and centred - if scaled content is larger than the page size, it may be cropped.", + "bullet1": "1.0 = Original size", + "bullet2": "0.5 = Half size (50% smaller)", + "bullet3": "2.0 = Double size (200% larger, may crop)" + }, + "pageSize": { + "title": "Target Page Size", + "text": "Sets the dimensions of the output PDF pages. 'Keep Original Size' maintains current dimensions, whilst other options resize to standard paper sizes." + } + } }, "add-page-numbers": { "tags": "paginate,label,organize,index" @@ -1129,16 +2670,83 @@ "tags": "samodejno zaznaj,na podlagi glave,organiziraj,preoznači", "title": "Samodejno preimenuj", "header": "Samodejno preimenuj PDF", - "submit": "Samodejno preimenuj" + "description": "Automatically finds the title from your PDF content and uses it as the filename.", + "submit": "Samodejno preimenuj", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst auto-renaming the PDF." + }, + "results": { + "title": "Auto-Rename Results" + }, + "tooltip": { + "header": { + "title": "How Auto-Rename Works" + }, + "howItWorks": { + "title": "Smart Renaming", + "text": "Automatically finds the title from your PDF content and uses it as the filename.", + "bullet1": "Looks for text that appears to be a title or heading", + "bullet2": "Creates a clean, valid filename from the detected title", + "bullet3": "Keeps the original name if no suitable title is found" + } + } }, "adjust-contrast": { "tags": "color-correction,tune,modify,enhance,colour-correction" }, "crop": { - "tags": "obreÅži, skrči, uredi, oblikuj", "title": "Obrezovanje", "header": "ObreÅži PDF", - "submit": "PoÅĄlji" + "submit": "PoÅĄlji", + "noFileSelected": "Select a PDF file to begin cropping", + "preview": { + "title": "Crop Area Selection" + }, + "reset": "Reset to full PDF", + "coordinates": { + "title": "Position and Size", + "x": { + "label": "X Position", + "desc": "Left edge (points)" + }, + "y": { + "label": "Y Position", + "desc": "Bottom edge (points)" + }, + "width": { + "label": "Width", + "desc": "Crop width (points)" + }, + "height": { + "label": "Height", + "desc": "Crop height (points)" + } + }, + "error": { + "invalidArea": "Crop area extends beyond PDF boundaries", + "failed": "Failed to crop PDF" + }, + "steps": { + "selectArea": "Select Crop Area" + }, + "tooltip": { + "title": "How to Crop PDFs", + "description": "Select the area to crop from your PDF by dragging and resizing the blue overlay on the thumbnail.", + "drag": "Drag the overlay to move the crop area", + "resize": "Drag the corner and edge handles to resize", + "precision": "Use coordinate inputs for precise positioning" + }, + "results": { + "title": "Crop Results" + }, + "automation": { + "info": "Enter crop coordinates in PDF points. Origin (0,0) is at bottom-left. These values will be applied to all PDFs processed in this automation.", + "reference": "Reference: A4 page is 595.28 × 841.89 points (210mm × 297mm). 1 inch = 72 points." + }, + "tags": "obreÅži, skrči, uredi, oblikuj" }, "autoSplitPDF": { "tags": "Na osnovi QR,ločeno,skeniranje-segment,organiziranje", @@ -1221,24 +2829,124 @@ "downloadJS": "Prenesi Javascript", "submit": "PokaÅži" }, - "autoRedact": { - "tags": "Uredi,Skrij,zatemni,črno,marker,skrito", - "title": "Samodejno redigiraj", - "header": "Samodejno redigiraj", - "colorLabel": "Barva", - "textsToRedactLabel": "Besedilo za redigiranje (ločeno z vrsticami)", - "textsToRedactPlaceholder": "npr. \\nZaupno \\nStrogo zaupno", - "useRegexLabel": "Uporabi regularni izraz", - "wholeWordSearchLabel": "Iskanje po celi besedi", - "customPaddingLabel": "Dodatno oblazinjenje po meri", - "convertPDFToImageLabel": "Pretvori PDF v PDF-sliko (Uporablja se za odstranitev besedila za poljem)", - "submitButton": "PoÅĄlji" - }, "redact": { "tags": "Uredi,Skrij,zatemni,črno,marker,skrito,ročno", "title": "Ročna redakcija", - "header": "Ročna redakcija", "submit": "Uredi", + "error": { + "failed": "An error occurred while redacting the PDF." + }, + "modeSelector": { + "title": "Redaction Method", + "mode": "Mode", + "automatic": "Automatic", + "automaticDesc": "Redact text based on search terms", + "manual": "Manual", + "manualDesc": "Click and drag to redact specific areas", + "manualComingSoon": "Manual redaction coming soon" + }, + "auto": { + "header": "Auto Redact", + "settings": { + "title": "Redaction Settings", + "advancedTitle": "Napredno" + }, + "colorLabel": "Box Colour", + "wordsToRedact": { + "title": "Words to Redact", + "placeholder": "Enter a word", + "add": "Dodaj", + "examples": "Examples: Confidential, Top-Secret" + }, + "useRegexLabel": "Use Regex", + "wholeWordSearchLabel": "Whole Word Search", + "customPaddingLabel": "Custom Extra Padding", + "convertPDFToImageLabel": "Convert PDF to PDF-Image" + }, + "tooltip": { + "mode": { + "header": { + "title": "Redaction Method" + }, + "automatic": { + "title": "Automatic Redaction", + "text": "Automatically finds and redacts specified text throughout the document. Perfect for removing consistent sensitive information like names, addresses, or confidential markers." + }, + "manual": { + "title": "Manual Redaction", + "text": "Click and drag to manually select specific areas to redact. Gives you precise control over what gets redacted. (Coming soon)" + } + }, + "words": { + "header": { + "title": "Words to Redact" + }, + "description": { + "title": "Text Matching", + "text": "Enter words or phrases to find and redact in your document. Each word will be searched for separately." + }, + "bullet1": "Add one word at a time", + "bullet2": "Press Enter or click 'Add Another' to add", + "bullet3": "Click × to remove words", + "examples": { + "title": "Common Examples", + "text": "Typical words to redact include: bank details, email addresses, or specific names." + } + }, + "advanced": { + "header": { + "title": "Advanced Redaction Settings" + }, + "color": { + "title": "Box Colour & Padding", + "text": "Customise the appearance of redaction boxes. Black is standard, but you can choose any colour. Padding adds extra space around the found text." + }, + "regex": { + "title": "Use Regex", + "text": "Enable regular expressions for advanced pattern matching. Useful for finding phone numbers, emails, or complex patterns.", + "bullet1": "Example: \\d{4}-\\d{2}-\\d{2} to match any dates in YYYY-MM-DD format", + "bullet2": "Use with caution - test thoroughly" + }, + "wholeWord": { + "title": "Whole Word Search", + "text": "Only match complete words, not partial matches. 'John' won't match 'Johnson' when enabled." + }, + "convert": { + "title": "Convert to PDF-Image", + "text": "Converts the PDF to an image-based PDF after redaction. This ensures text behind redaction boxes is completely removed and unrecoverable." + } + } + }, + "manual": { + "header": "Manual Redaction", + "textBasedRedaction": "Text-based Redaction", + "pageBasedRedaction": "Page-based Redaction", + "convertPDFToImageLabel": "Convert PDF to PDF-Image (Used to remove text behind the box)", + "pageRedactionNumbers": { + "title": "Strani", + "placeholder": "(npr. 1,2,8 ali 4,7,12-16 ali 2n-1)" + }, + "redactionColor": { + "title": "Redaction Colour" + }, + "export": "Izvozi", + "upload": "Upload", + "boxRedaction": "Box draw redaction", + "zoom": "Zoom", + "zoomIn": "Zoom in", + "zoomOut": "Zoom out", + "nextPage": "Next Page", + "previousPage": "Previous Page", + "toggleSidebar": "Toggle Sidebar", + "showThumbnails": "Show Thumbnails", + "showDocumentOutline": "Show Document Outline (double-click to expand/collapse all items)", + "showAttachments": "Show Attachments", + "showLayers": "Show Layers (double-click to reset all layers to the default state)", + "colourPicker": "Colour Picker", + "findCurrentOutlineItem": "Find current outline item", + "applyChanges": "Apply Changes" + }, + "header": "Ročna redakcija", "textBasedRedaction": "Redakcija na podlagi besedila", "pageBasedRedaction": "Redakcija na podlagi strani", "convertPDFToImageLabel": "Pretvori PDF v PDF-sliko (Uporablja se za odstranjevanje besedila za poljem)", @@ -1264,22 +2972,7 @@ "showLayers": "PrikaÅži plasti (dvokliknite za ponastavitev vseh plasti na privzeto stanje)", "colourPicker": "Izbirnik barv", "findCurrentOutlineItem": "PoiÅĄÄi trenutno postavko orisa", - "applyChanges": "Uporabi spremembe", - "auto": { - "settings": { - "advancedTitle": "Napredno" - }, - "wordsToRedact": { - "add": "Dodaj" - } - }, - "manual": { - "pageRedactionNumbers": { - "title": "Strani", - "placeholder": "(npr. 1,2,8 ali 4,7,12-16 ali 2n-1)" - }, - "export": "Izvozi" - } + "applyChanges": "Uporabi spremembe" }, "tableExtraxt": { "tags": "CSV, ekstrakcija tabele, ekstrah, pretvorba" @@ -1290,11 +2983,15 @@ "overlay-pdfs": { "tags": "Prekrivanje", "header": "Prekrivne datoteke PDF", + "title": "Overlay PDFs", + "desc": "Overlay one PDF on top of another", "baseFile": { "label": "Izberite osnovno datoteko PDF" }, "overlayFiles": { - "label": "Izberite Prekrivne datoteke PDF" + "label": "Izberite Prekrivne datoteke PDF", + "placeholder": "Choose PDF(s)...", + "addMore": "Add more PDFs..." }, "mode": { "label": "Izberi način prekrivanja", @@ -1304,14 +3001,53 @@ }, "counts": { "label": "Å tevilo prekrivanj (za fiksni način ponavljanja)", - "placeholder": "Vnesite ÅĄtevilo, ločeno z vejico (npr. 2,3,1)" + "placeholder": "Vnesite ÅĄtevilo, ločeno z vejico (npr. 2,3,1)", + "item": "Count for file", + "noFiles": "Add overlay files to configure counts" }, "position": { "label": "Izberi poloÅžaj prekrivanja", "foreground": "Ospredje", "background": "Ozadje" }, - "submit": "PoÅĄlji" + "submit": "PoÅĄlji", + "settings": { + "title": "Settings" + }, + "results": { + "title": "Overlay Results" + }, + "tooltip": { + "header": { + "title": "Overlay PDFs Overview" + }, + "description": { + "title": "Description", + "text": "Combine a base PDF with one or more overlay PDFs. Overlays can be applied page-by-page in different modes and placed in the foreground or background." + }, + "mode": { + "title": "Overlay Mode", + "text": "Choose how to distribute overlay pages across the base PDF pages.", + "sequential": "Sequential Overlay: Use pages from the first overlay PDF until it ends, then move to the next.", + "interleaved": "Interleaved Overlay: Take one page from each overlay in turn.", + "fixedRepeat": "Fixed Repeat Overlay: Take a set number of pages from each overlay before moving to the next. Use Counts to set the numbers." + }, + "position": { + "title": "Overlay Position", + "text": "Foreground places the overlay on top of the page. Background places it behind." + }, + "overlayFiles": { + "title": "Overlay Files", + "text": "Select one or more PDFs to overlay on the base. The order of these files affects how pages are applied in Sequential and Fixed Repeat modes." + }, + "counts": { + "title": "Counts (Fixed Repeat only)", + "text": "Provide a positive number for each overlay file showing how many pages to take before moving to the next. Required when mode is Fixed Repeat." + } + }, + "error": { + "failed": "An error occurred while overlaying PDFs." + } }, "split-by-sections": { "tags": "Oddelek Razdeli, razdeli, prilagodi, prilagodi", @@ -1332,6 +3068,7 @@ "tags": "ÅŊig, Dodaj sliko, sredinska slika, Vodni Åžig, PDF, Vdelaj, Prilagodi, Prilagodi", "header": "OÅžigosajte PDF", "title": "OÅžigosajte PDF", + "stampSetup": "Stamp Setup", "stampType": "Vrsta Åžiga", "stampText": "Označi besedilo", "stampImage": "Označi sliko", @@ -1344,7 +3081,19 @@ "overrideY": "Preglasi Y koordinato", "customMargin": "Margina po meri", "customColor": "Barva besedila po meri", - "submit": "PoÅĄlji" + "submit": "PoÅĄlji", + "noStampSelected": "No stamp selected. Return to Step 1.", + "customPosition": "Drag the stamp to the desired location in the preview window.", + "error": { + "failed": "An error occurred while adding stamp to the PDF." + }, + "imageSize": "Image Size", + "margin": "Margin", + "positionAndFormatting": "Position & Formatting", + "quickPosition": "Select a position on the page to place the stamp.", + "results": { + "title": "Stamp Results" + } }, "removeImagePdf": { "tags": "Odstrani sliko,operacije strani,zadnja stran,streÅžniÅĄka stran" @@ -1362,7 +3111,8 @@ "status": { "_value": "Stanje", "valid": "Veljaven", - "invalid": "Neveljavno" + "invalid": "Neveljavno", + "complete": "Validation complete" }, "signer": "Podpisnik", "date": "Datum", @@ -1389,40 +3139,122 @@ "version": "Različica", "keyUsage": "Uporaba ključa", "selfSigned": "Samopodpisano", - "bits": "bits" + "bits": "bits", + "details": "Certificate Details" }, "signature": { "info": "Informacije o podpisu", "_value": "Podpis", "mathValid": "Podpis je matematično veljaven AMPAK:" }, - "selectCustomCert": "Datoteka potrdila po meri X.509 (izbirno)" - }, - "replace-color": { - "title": "Napredne barvne moÅžnosti", - "header": "Zamenjaj-Obrni barvni PDF", - "selectText": { - "1": "Zamenjaj ali obrni barvne moÅžnosti", - "2": "Privzeto (privzete barve z visokim kontrastom)", - "3": "Po meri (barve po meri)", - "4": "Full-Invert(Invert vse barve)", - "5": "MoÅžnosti barv z visokim kontrastom", - "6": "belo besedilo na črnem ozadju", - "7": "Črno besedilo na belem ozadju", - "8": "Rumeno besedilo na črnem ozadju", - "9": "Zeleno besedilo na črnem ozadju", - "10": "Izberi barvo besedila", - "11": "Izberi barvo ozadja" + "selectCustomCert": "Datoteka potrdila po meri X.509 (izbirno)", + "downloadCsv": "Download CSV", + "downloadJson": "Download JSON", + "downloadPdf": "Download PDF Report", + "downloadType": { + "csv": "CSV", + "json": "JSON", + "pdf": "PDF" }, - "submit": "Zamenjaj" + "error": { + "allFailed": "Unable to validate the selected files.", + "partial": "Some files could not be validated.", + "reportGeneration": "Could not generate the PDF report. JSON and CSV are available.", + "unexpected": "Unexpected error during validation." + }, + "finalizing": "Preparing downloads...", + "issue": { + "certExpired": "Certificate expired", + "certRevocationUnknown": "Certificate revocation status unknown", + "certRevoked": "Certificate revoked", + "chainInvalid": "Certificate chain invalid", + "signatureInvalid": "Signature cryptographic check failed", + "trustInvalid": "Certificate not trusted" + }, + "noResults": "Run the validation to generate a report.", + "noSignaturesShort": "No signatures", + "processing": "Validating signatures...", + "report": { + "continued": "Continued", + "downloads": "Downloads", + "entryLabel": "Signature Summary", + "fields": { + "created": "Created", + "fileSize": "File Size", + "signatureCount": "Total Signatures", + "signatureDate": "Signature Date" + }, + "filesEvaluated": "{{count}} files evaluated", + "footer": "Validated via Stirling PDF", + "generatedAt": "Generated", + "noPdf": "PDF report will be available after a successful validation.", + "page": "Page", + "shortTitle": "Signature Summary", + "signatureCountLabel": "{{count}} signatures", + "signaturesFound": "{{count}} signatures detected", + "signaturesValid": "{{count}} fully valid", + "title": "Signature Validation Report" + }, + "settings": { + "certHint": "Upload a trusted X.509 certificate to validate against a custom trust source.", + "title": "Validation Settings" + }, + "signatureDate": "Signature Date", + "totalSignatures": "Total Signatures" }, - "replaceColorPdf": { - "tags": "Zamenjaj barvo,operacije strani,zadnja stran,streÅžniÅĄka stran" + "replaceColor": { + "tags": "Replace Colour,Page operations,Back end,server side", + "labels": { + "settings": "Settings", + "colourOperation": "Colour operation" + }, + "options": { + "highContrast": "High contrast", + "invertAll": "Invert all colours", + "custom": "Custom", + "cmyk": "Convert to CMYK" + }, + "tooltip": { + "header": { + "title": "Replace & Invert Colour Settings Overview" + }, + "description": { + "title": "Description", + "text": "Transform PDF colours to improve readability and accessibility. Choose from high contrast presets, invert all colours, or create custom colour schemes." + }, + "highContrast": { + "title": "High Contrast", + "text": "Apply predefined high contrast colour combinations designed for better readability and accessibility compliance.", + "bullet1": "White text on black background - Classic dark mode", + "bullet2": "Black text on white background - Standard high contrast", + "bullet3": "Yellow text on black background - High visibility option", + "bullet4": "Green text on black background - Alternative high contrast" + }, + "invertAll": { + "title": "Invert All Colours", + "text": "Completely invert all colours in the PDF, creating a negative-like effect. Useful for creating dark mode versions of documents or reducing eye strain in low-light conditions." + }, + "custom": { + "title": "Custom Colours", + "text": "Define your own text and background colours using the colour pickers. Perfect for creating branded documents or specific accessibility requirements.", + "bullet1": "Text colour - Choose the colour for text elements", + "bullet2": "Background colour - Set the background colour for the document" + }, + "cmyk": { + "title": "Convert to CMYK", + "text": "Convert the PDF from RGB colour space to CMYK colour space, optimized for professional printing. This process converts colours to the Cyan, Magenta, Yellow, Black model used by printers." + } + }, + "error": { + "failed": "An error occurred while processing the colour replacement." + } }, "login": { "title": "Prijava", "header": "Prijava", "signin": "Prijava", + "signInWith": "Sign in with", + "signInAnonymously": "Sign Up as a Guest", "rememberme": "Zapomni si me", "invalid": "Neveljavno uporabniÅĄko ime ali geslo.", "locked": "VaÅĄ račun je bil zaklenjen.", @@ -1441,12 +3273,83 @@ "alreadyLoggedIn": "Prijavljeni ste Åže v", "alreadyLoggedIn2": "naprave. Odjavite se iz naprav in poskusite znova.", "toManySessions": "Imate preveč aktivnih sej", - "logoutMessage": "You have been logged out." + "logoutMessage": "You have been logged out.", + "youAreLoggedIn": "You are logged in!", + "email": "Email", + "password": "Password", + "enterEmail": "Enter your email", + "enterPassword": "Enter your password", + "loggingIn": "Logging In...", + "username": "Username", + "enterUsername": "Enter username", + "useEmailInstead": "Login with email", + "forgotPassword": "Forgot your password?", + "logIn": "Log In", + "signingIn": "Signing in...", + "login": "Login", + "or": "Or", + "useMagicLink": "Use magic link instead", + "enterEmailForMagicLink": "Enter your email for magic link", + "sending": "Sendingâ€Ļ", + "sendMagicLink": "Send Magic Link", + "cancel": "Cancel", + "dontHaveAccount": "Don't have an account? Sign up", + "home": "Home", + "debug": "Debug", + "signOut": "Sign Out", + "pleaseEnterBoth": "Please enter both email and password", + "pleaseEnterEmail": "Please enter your email address", + "magicLinkSent": "Magic link sent to {{email}}! Check your email and click the link to sign in.", + "passwordResetSent": "Password reset link sent to {{email}}! Check your email and follow the instructions.", + "failedToSignIn": "Failed to sign in with {{provider}}: {{message}}", + "unexpectedError": "Unexpected error: {{message}}", + "accountCreatedSuccess": "Account created successfully! You can now sign in.", + "passwordChangedSuccess": "Password changed successfully! Please sign in with your new password.", + "credentialsUpdated": "Your credentials have been updated. Please sign in again." + }, + "signup": { + "title": "Create an account", + "subtitle": "Join Stirling PDF to get started", + "name": "Name", + "email": "Email", + "password": "Password", + "confirmPassword": "Confirm password", + "enterName": "Enter your name", + "enterEmail": "Enter your email", + "enterPassword": "Enter your password", + "confirmPasswordPlaceholder": "Confirm password", + "or": "or", + "creatingAccount": "Creating Account...", + "signUp": "Sign Up", + "alreadyHaveAccount": "Already have an account? Sign in", + "pleaseFillAllFields": "Please fill in all fields", + "passwordsDoNotMatch": "Passwords do not match", + "passwordTooShort": "Password must be at least 6 characters long", + "invalidEmail": "Please enter a valid email address", + "checkEmailConfirmation": "Check your email for a confirmation link to complete your registration.", + "accountCreatedSuccessfully": "Account created successfully! You can now sign in.", + "unexpectedError": "Unexpected error: {{message}}", + "useEmailInstead": "Use Email Instead", + "nameRequired": "Name is required", + "emailRequired": "Email is required", + "passwordRequired": "Password is required", + "confirmPasswordRequired": "Please confirm your password" }, "pdfToSinglePage": { "title": "PDF na eno stran", "header": "PDF na eno stran", - "submit": "Pretvori v eno stran" + "submit": "Pretvori v eno stran", + "description": "This tool will merge all pages of your PDF into one large single page. The width will remain the same as the original pages, but the height will be the sum of all page heights.", + "filenamePrefix": "single_page", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst converting to single page." + }, + "results": { + "title": "Single Page Results" + } }, "pageExtracter": { "title": "Izvleči strani", @@ -1470,18 +3373,59 @@ "adjustContrast": { "title": "Prilagodi kontrast", "header": "Prilagodi kontrast", + "basic": "Basic Adjustments", "contrast": "Kontrast:", "brightness": "Svetlost:", "saturation": "Nasičenost:", - "download": "Prenos" + "download": "Prenos", + "adjustColors": "Adjust Colors", + "blue": "Blue", + "confirm": "Confirm", + "error": { + "failed": "Failed to adjust colors/contrast" + }, + "green": "Green", + "noPreview": "Select a PDF to preview", + "red": "Red", + "results": { + "title": "Adjusted PDF" + } }, "compress": { "title": "Stisnite", + "desc": "Compress PDFs to reduce their file size.", "header": "Stisnite PDF", + "method": { + "title": "Compression Method", + "quality": "Quality", + "filesize": "Velikost datoteke" + }, "credit": "Ta storitev uporablja qpdf za stiskanje/optimizacijo PDF.", "grayscale": { "label": "Uporabi sivinsko lestvico za stiskanje" }, + "tooltip": { + "header": { + "title": "Compress Settings Overview" + }, + "description": { + "title": "Description", + "text": "Compression is an easy way to reduce your file size. Pick File Size to enter a target size and have us adjust quality for you. Pick Quality to set compression strength manually." + }, + "qualityAdjustment": { + "title": "Quality Adjustment", + "text": "Drag the slider to adjust the compression strength. Lower values (1-3) preserve quality but result in larger files. Higher values (7-9) shrink the file more but reduce image clarity.", + "bullet1": "Lower values preserve quality", + "bullet2": "Higher values reduce file size" + }, + "grayscale": { + "title": "Grayscale", + "text": "Select this option to convert all images to black and white, which can significantly reduce file size especially for scanned PDFs or image-heavy documents." + } + }, + "error": { + "failed": "An error occurred while compressing the PDF." + }, "selectText": { "1": { "_value": "Nastavitve stiskanja", @@ -1491,10 +3435,7 @@ "4": "Samodejni način - Samodejno prilagodi kakovost, da dobi PDF na natančno velikost", "5": "Pričakovana velikost PDF (npr. 25 MB, 10,8 MB, 25 KB)" }, - "submit": "Stisnite", - "method": { - "filesize": "Velikost datoteke" - } + "submit": "Stisnite" }, "decrypt": { "passwordPrompt": "Ta datoteka je zaÅĄÄitena z geslom. Prosim vnesite geslo:", @@ -1595,7 +3536,13 @@ "title": "Odstrani sliko", "header": "Odstrani sliko", "removeImage": "Odstrani sliko", - "submit": "Odstrani sliko" + "submit": "Odstrani sliko", + "error": { + "failed": "Failed to remove images from the PDF." + }, + "results": { + "title": "Remove Images Results" + } }, "splitByChapters": { "title": "Razdeli PDF po poglavjih", @@ -1629,6 +3576,12 @@ }, "note": "Opombe ob izdaji so na voljo samo v angleÅĄÄini" }, + "swagger": { + "title": "API Documentation", + "header": "API Documentation", + "desc": "View and test the Stirling PDF API endpoints", + "tags": "api,documentation,swagger,endpoints,development" + }, "cookieBanner": { "popUp": { "title": "How we use Cookies", @@ -1664,54 +3617,943 @@ "title": "Analytics", "description": "These cookies help us understand how our tools are being used, so we can focus on building the features our community values most. Rest assured—Stirling PDF cannot and will never track the content of the documents you work with." } + }, + "services": { + "posthog": "PostHog Analytics", + "scarf": "Scarf Pixel" } }, - "download": "Prenos", - "undo": "Razveljavi", - "convert": { - "title": "Pretvori", - "settings": "Nastavitve", - "color": "Barva", - "greyscale": "Sivine", - "fillPage": "Izpolni stran", - "pdfaDigitalSignatureWarning": "PDF vsebuje digitalni podpis. To bo odstranjeno v naslednjem koraku.", - "grayscale": "Sivine" + "removeMetadata": { + "submit": "Remove Metadata" }, - "attachments": { - "tags": "embed,attach,file,attachment,attachments", - "title": "Add attachments", - "header": "Add attachments", - "submit": "Add attachments" + "sidebar": { + "toggle": "Toggle Sidebar" + }, + "theme": { + "toggle": "Toggle Theme" + }, + "view": { + "viewer": "Viewer", + "pageEditor": "Page Editor", + "fileManager": "File Manager" + }, + "pageEditor": { + "title": "Page Editor", + "save": "Save Changes", + "noPdfLoaded": "No PDF loaded. Please upload a PDF to edit.", + "rotatedLeft": "Rotated left:", + "rotatedRight": "Rotated right:", + "deleted": "Deleted:", + "movedLeft": "Moved left:", + "movedRight": "Moved right:", + "splitAt": "Split at:", + "insertedPageBreak": "Inserted page break at:", + "addFileNotImplemented": "Add file not implemented in demo", + "closePdf": "Close PDF", + "reset": "Reset Changes", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "fitToWidth": "Fit to Width", + "actualSize": "Actual Size" + }, + "viewer": { + "firstPage": "First Page", + "lastPage": "Last Page", + "previousPage": "Previous Page", + "nextPage": "Next Page", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "singlePageView": "Single Page View", + "dualPageView": "Dual Page View" }, "rightRail": { + "closeSelected": "Close Selected Files", "selectAll": "Izberi vse", - "deselectAll": "Prekliči izbor vseh" + "deselectAll": "Prekliči izbor vseh", + "selectByNumber": "Select by Page Numbers", + "deleteSelected": "Delete Selected Pages", + "closePdf": "Close PDF", + "exportAll": "Export PDF", + "downloadSelected": "Download Selected Files", + "downloadAll": "Download All", + "toggleTheme": "Toggle Theme", + "language": "Language", + "search": "Search PDF", + "panMode": "Pan Mode", + "rotateLeft": "Rotate Left", + "rotateRight": "Rotate Right", + "toggleSidebar": "Toggle Sidebar", + "exportSelected": "Export Selected Pages", + "toggleAnnotations": "Toggle Annotations Visibility", + "annotationMode": "Toggle Annotation Mode", + "draw": "Draw", + "save": "Save" + }, + "search": { + "title": "Search PDF", + "placeholder": "Enter search term...", + "noResults": "No results found", + "searching": "Searching..." + }, + "guestBanner": { + "title": "You're using Stirling PDF as a guest!", + "message": "Create a free account to save your work, access more features, and support the project.", + "dismiss": "Dismiss banner", + "signUp": "Sign Up Free" + }, + "toolPicker": { + "searchPlaceholder": "Search tools...", + "noToolsFound": "No tools found", + "allTools": "ALL TOOLS", + "quickAccess": "QUICK ACCESS", + "categories": { + "standardTools": "Standard Tools", + "advancedTools": "Advanced Tools", + "recommendedTools": "Recommended Tools" + }, + "subcategories": { + "signing": "Signing", + "documentSecurity": "Document Security", + "verification": "Verification", + "documentReview": "Document Review", + "pageFormatting": "Page Formatting", + "extraction": "Extraction", + "removal": "Removal", + "automation": "Automation", + "general": "General", + "advancedFormatting": "Advanced Formatting", + "developerTools": "Developer Tools" + } }, "quickAccess": { - "sign": "PodpiÅĄi" + "read": "Read", + "sign": "PodpiÅĄi", + "automate": "Automate", + "files": "Files", + "activity": "Activity", + "help": "Help", + "account": "Account", + "config": "Config", + "adminSettings": "Admin Settings", + "allTools": "All Tools" + }, + "admin": { + "error": "Error", + "success": "Success", + "expand": "Expand", + "close": "Close", + "status": { + "active": "Active", + "inactive": "Inactive" + }, + "settings": { + "title": "Admin Settings", + "workspace": "Workspace", + "fetchError": "Failed to load settings", + "saveError": "Failed to save settings", + "saved": "Settings saved successfully", + "saveSuccess": "Settings saved successfully", + "save": "Save Changes", + "restartRequired": "Restart Required", + "restart": { + "title": "Restart Required", + "message": "Settings have been saved successfully. A server restart is required for the changes to take effect.", + "question": "Would you like to restart the server now or later?", + "now": "Restart Now", + "later": "Restart Later" + }, + "restarting": "Restarting Server", + "restartingMessage": "The server is restarting. Please wait a moment...", + "restartError": "Failed to restart server. Please restart manually.", + "general": { + "title": "System Settings", + "description": "Configure system-wide application settings including branding and default behaviour.", + "ui": "User Interface", + "system": "System", + "appName": { + "label": "Application Name", + "description": "The name displayed in the browser tab and home page" + }, + "appNameNavbar": { + "label": "Navbar Brand", + "description": "The name displayed in the navigation bar" + }, + "homeDescription": { + "label": "Home Description", + "description": "The description text shown on the home page" + }, + "defaultLocale": { + "label": "Default Locale", + "description": "The default language for new users (e.g., en_US, es_ES)" + }, + "fileUploadLimit": { + "label": "File Upload Limit", + "description": "Maximum file upload size (e.g., 100MB, 1GB)" + }, + "showUpdate": { + "label": "Show Update Notifications", + "description": "Display notifications when a new version is available" + }, + "showUpdateOnlyAdmin": { + "label": "Show Updates to Admins Only", + "description": "Restrict update notifications to admin users only" + }, + "customHTMLFiles": { + "label": "Custom HTML Files", + "description": "Allow serving custom HTML files from the customFiles directory" + }, + "languages": { + "label": "Available Languages", + "description": "Languages that users can select from (leave empty to enable all languages)" + }, + "customMetadata": { + "label": "Custom Metadata", + "autoUpdate": { + "label": "Auto Update Metadata", + "description": "Automatically update PDF metadata on all processed documents" + }, + "author": { + "label": "Default Author", + "description": "Default author for PDF metadata (e.g., username)" + }, + "creator": { + "label": "Default Creator", + "description": "Default creator for PDF metadata" + }, + "producer": { + "label": "Default Producer", + "description": "Default producer for PDF metadata" + } + }, + "customPaths": { + "label": "Custom Paths", + "description": "Configure custom file system paths for pipeline processing and external tools", + "pipeline": { + "label": "Pipeline Directories", + "watchedFoldersDir": { + "label": "Watched Folders Directory", + "description": "Directory where pipeline monitors for incoming PDFs (leave empty for default: /pipeline/watchedFolders)" + }, + "finishedFoldersDir": { + "label": "Finished Folders Directory", + "description": "Directory where processed PDFs are outputted (leave empty for default: /pipeline/finishedFolders)" + } + }, + "operations": { + "label": "External Tool Paths", + "weasyprint": { + "label": "WeasyPrint Executable", + "description": "Path to WeasyPrint executable for HTML to PDF conversion (leave empty for default: /opt/venv/bin/weasyprint)" + }, + "unoconvert": { + "label": "Unoconvert Executable", + "description": "Path to LibreOffice unoconvert for document conversions (leave empty for default: /opt/venv/bin/unoconvert)" + } + } + } + }, + "security": { + "title": "Security", + "description": "Configure authentication, login behaviour, and security policies.", + "ssoNotice": { + "title": "Looking for SSO/SAML settings?", + "message": "OAuth2 and SAML2 authentication providers have been moved to the Connections menu for easier management." + }, + "authentication": "Authentication", + "enableLogin": { + "label": "Enable Login", + "description": "Require users to log in before accessing the application" + }, + "loginMethod": { + "label": "Login Method", + "description": "The authentication method to use for user login", + "all": "All Methods", + "normal": "Username/Password Only", + "oauth2": "OAuth2 Only", + "saml2": "SAML2 Only" + }, + "loginAttemptCount": { + "label": "Login Attempt Limit", + "description": "Maximum number of failed login attempts before account lockout" + }, + "loginResetTimeMinutes": { + "label": "Login Reset Time (minutes)", + "description": "Time before failed login attempts are reset" + }, + "csrfDisabled": { + "label": "Disable CSRF Protection", + "description": "Disable Cross-Site Request Forgery protection (not recommended)" + }, + "initialLogin": { + "label": "Initial Login", + "username": { + "label": "Initial Username", + "description": "The username for the initial admin account" + }, + "password": { + "label": "Initial Password", + "description": "The password for the initial admin account" + } + }, + "jwt": { + "label": "JWT Configuration", + "secureCookie": { + "label": "Secure Cookie", + "description": "Require HTTPS for JWT cookies (recommended for production)" + }, + "keyRetentionDays": { + "label": "Key Retention Days", + "description": "Number of days to retain old JWT keys for verification" + }, + "persistence": { + "label": "Enable Key Persistence", + "description": "Store JWT keys persistently to survive server restarts" + }, + "enableKeyRotation": { + "label": "Enable Key Rotation", + "description": "Automatically rotate JWT signing keys periodically" + }, + "enableKeyCleanup": { + "label": "Enable Key Cleanup", + "description": "Automatically remove expired JWT keys" + } + }, + "audit": { + "label": "Audit Logging", + "enabled": { + "label": "Enable Audit Logging", + "description": "Track user actions and system events for compliance and security monitoring" + }, + "level": { + "label": "Audit Level", + "description": "0=OFF, 1=BASIC, 2=STANDARD, 3=VERBOSE" + }, + "retentionDays": { + "label": "Audit Retention (days)", + "description": "Number of days to retain audit logs" + } + }, + "htmlUrlSecurity": { + "label": "HTML URL Security", + "description": "Configure URL access restrictions for HTML processing to prevent SSRF attacks", + "enabled": { + "label": "Enable URL Security", + "description": "Enable URL security restrictions for HTML to PDF conversions" + }, + "level": { + "label": "Security Level", + "description": "MAX: whitelist only, MEDIUM: block internal networks, OFF: no restrictions", + "max": "Maximum (Whitelist Only)", + "medium": "Medium (Block Internal)", + "off": "Off (No Restrictions)" + }, + "advanced": "Advanced Settings", + "allowedDomains": { + "label": "Allowed Domains (Whitelist)", + "description": "One domain per line (e.g., cdn.example.com). Only these domains allowed when level is MAX" + }, + "blockedDomains": { + "label": "Blocked Domains (Blacklist)", + "description": "One domain per line (e.g., malicious.com). Additional domains to block" + }, + "internalTlds": { + "label": "Internal TLDs", + "description": "One TLD per line (e.g., .local, .internal). Block domains with these TLD patterns" + }, + "networkBlocking": "Network Blocking", + "blockPrivateNetworks": { + "label": "Block Private Networks", + "description": "Block RFC 1918 private networks (10.x.x.x, 192.168.x.x, 172.16-31.x.x)" + }, + "blockLocalhost": { + "label": "Block Localhost", + "description": "Block localhost and loopback addresses (127.x.x.x, ::1)" + }, + "blockLinkLocal": { + "label": "Block Link-Local Addresses", + "description": "Block link-local addresses (169.254.x.x, fe80::/10)" + }, + "blockCloudMetadata": { + "label": "Block Cloud Metadata Endpoints", + "description": "Block cloud provider metadata endpoints (169.254.169.254)" + } + } + }, + "connections": { + "title": "Connections", + "description": "Configure external authentication providers like OAuth2 and SAML.", + "linkedServices": "Linked Services", + "unlinkedServices": "Unlinked Services", + "connect": "Connect", + "disconnect": "Disconnect", + "disconnected": "Provider disconnected successfully", + "disconnectError": "Failed to disconnect provider", + "ssoAutoLogin": { + "label": "SSO Auto Login", + "enable": "Enable SSO Auto Login", + "description": "Automatically redirect to SSO login when authentication is required" + }, + "oauth2": { + "label": "OAuth2", + "enabled": { + "label": "Enable OAuth2", + "description": "Allow users to authenticate using OAuth2 providers" + }, + "provider": { + "label": "Provider", + "description": "The OAuth2 provider to use for authentication" + }, + "issuer": { + "label": "Issuer URL", + "description": "The OAuth2 provider issuer URL" + }, + "clientId": { + "label": "Client ID", + "description": "The OAuth2 client ID from your provider" + }, + "clientSecret": { + "label": "Client Secret", + "description": "The OAuth2 client secret from your provider" + }, + "useAsUsername": { + "label": "Use as Username", + "description": "The OAuth2 claim to use as the username (e.g., email, sub)" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first OAuth2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via OAuth2" + }, + "scopes": { + "label": "OAuth2 Scopes", + "description": "Comma-separated list of OAuth2 scopes to request (e.g., openid, profile, email)" + } + }, + "saml2": { + "label": "SAML2", + "enabled": { + "label": "Enable SAML2", + "description": "Allow users to authenticate using SAML2 providers" + }, + "provider": { + "label": "Provider", + "description": "The SAML2 provider name" + }, + "registrationId": { + "label": "Registration ID", + "description": "The SAML2 registration identifier" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first SAML2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via SAML2" + } + } + }, + "database": { + "title": "Database", + "description": "Configure custom database connection settings for enterprise deployments.", + "configuration": "Database Configuration", + "enableCustom": { + "label": "Enable Custom Database", + "description": "Use your own custom database configuration instead of the default embedded database" + }, + "customUrl": { + "label": "Custom Database URL", + "description": "Full JDBC connection string (e.g., jdbc:postgresql://localhost:5432/postgres). If provided, individual connection settings below are not used." + }, + "type": { + "label": "Database Type", + "description": "Type of database (not used if custom URL is provided)" + }, + "hostName": { + "label": "Host Name", + "description": "Database server hostname (not used if custom URL is provided)" + }, + "port": { + "label": "Port", + "description": "Database server port (not used if custom URL is provided)" + }, + "name": { + "label": "Database Name", + "description": "Name of the database (not used if custom URL is provided)" + }, + "username": { + "label": "Username", + "description": "Database authentication username" + }, + "password": { + "label": "Password", + "description": "Database authentication password" + } + }, + "privacy": { + "title": "Privacy", + "description": "Configure privacy and data collection settings.", + "analytics": "Analytics & Tracking", + "enableAnalytics": { + "label": "Enable Analytics", + "description": "Collect anonymous usage analytics to help improve the application" + }, + "metricsEnabled": { + "label": "Enable Metrics", + "description": "Enable collection of performance and usage metrics. Provides API endpoint for admins to access metrics data" + }, + "searchEngine": "Search Engine Visibility", + "googleVisibility": { + "label": "Google Visibility", + "description": "Allow search engines to index this application" + } + }, + "advanced": { + "title": "Advanced", + "description": "Configure advanced features and experimental functionality.", + "features": "Feature Flags", + "processing": "Processing", + "endpoints": { + "label": "Endpoints", + "manage": "Manage API Endpoints", + "description": "Endpoint management is configured via YAML. See documentation for details on enabling/disabling specific endpoints." + }, + "enableAlphaFunctionality": { + "label": "Enable Alpha Features", + "description": "Enable experimental and alpha-stage features (may be unstable)" + }, + "enableUrlToPDF": { + "label": "Enable URL to PDF", + "description": "Allow conversion of web pages to PDF documents" + }, + "maxDPI": { + "label": "Maximum DPI", + "description": "Maximum DPI for image processing (0 = unlimited)" + }, + "tessdataDir": { + "label": "Tessdata Directory", + "description": "Path to the tessdata directory for OCR language files" + }, + "disableSanitize": { + "label": "Disable HTML Sanitization", + "description": "WARNING: Security risk - disabling HTML sanitization can lead to XSS vulnerabilities" + }, + "tempFileManagement": { + "label": "Temp File Management", + "description": "Configure temporary file storage and cleanup behavior", + "baseTmpDir": { + "label": "Base Temp Directory", + "description": "Base directory for temporary files (leave empty for default: java.io.tmpdir/stirling-pdf)" + }, + "libreofficeDir": { + "label": "LibreOffice Temp Directory", + "description": "Directory for LibreOffice temp files (leave empty for default: baseTmpDir/libreoffice)" + }, + "systemTempDir": { + "label": "System Temp Directory", + "description": "System temp directory to clean (only used if cleanupSystemTemp is enabled)" + }, + "prefix": { + "label": "Temp File Prefix", + "description": "Prefix for temp file names" + }, + "maxAgeHours": { + "label": "Max Age (hours)", + "description": "Maximum age in hours before temp files are cleaned up" + }, + "cleanupIntervalMinutes": { + "label": "Cleanup Interval (minutes)", + "description": "How often to run cleanup (in minutes)" + }, + "startupCleanup": { + "label": "Startup Cleanup", + "description": "Clean up old temp files on application startup" + }, + "cleanupSystemTemp": { + "label": "Cleanup System Temp", + "description": "Whether to clean broader system temp directory (use with caution)" + } + }, + "processExecutor": { + "label": "Process Executor Limits", + "description": "Configure session limits and timeouts for each process executor", + "sessionLimit": { + "label": "Session Limit", + "description": "Maximum concurrent instances" + }, + "timeout": { + "label": "Timeout (minutes)", + "description": "Maximum execution time" + }, + "libreOffice": "LibreOffice", + "pdfToHtml": "PDF to HTML", + "qpdf": "QPDF", + "tesseract": "Tesseract OCR", + "pythonOpenCv": "Python OpenCV", + "weasyPrint": "WeasyPrint", + "installApp": "Install App", + "calibre": "Calibre", + "ghostscript": "Ghostscript", + "ocrMyPdf": "OCRmyPDF" + } + }, + "mail": { + "title": "Mail Server", + "description": "Configure SMTP settings for sending email notifications.", + "smtp": "SMTP Configuration", + "enabled": { + "label": "Enable Mail", + "description": "Enable email notifications and SMTP functionality" + }, + "host": { + "label": "SMTP Host", + "description": "The hostname or IP address of your SMTP server" + }, + "port": { + "label": "SMTP Port", + "description": "The port number for SMTP connection (typically 25, 465, or 587)" + }, + "username": { + "label": "SMTP Username", + "description": "Username for SMTP authentication" + }, + "password": { + "label": "SMTP Password", + "description": "Password for SMTP authentication" + }, + "from": { + "label": "From Address", + "description": "The email address to use as the sender" + }, + "enableInvites": { + "label": "Enable Email Invites", + "description": "Allow admins to invite users via email with auto-generated passwords" + }, + "frontendUrl": { + "label": "Frontend URL", + "description": "Base URL for frontend (e.g. https://pdf.example.com). Used for generating invite links in emails. Leave empty to use backend URL." + } + }, + "legal": { + "title": "Legal Documents", + "description": "Configure links to legal documents and policies.", + "disclaimer": { + "title": "Legal Responsibility Warning", + "message": "By customizing these legal documents, you assume full responsibility for ensuring compliance with all applicable laws and regulations, including but not limited to GDPR and other EU data protection requirements. Only modify these settings if: (1) you are operating a personal/private instance, (2) you are outside EU jurisdiction and understand your local legal obligations, or (3) you have obtained proper legal counsel and accept sole responsibility for all user data and legal compliance. Stirling-PDF and its developers assume no liability for your legal obligations." + }, + "termsAndConditions": { + "label": "Terms and Conditions", + "description": "URL or filename to terms and conditions" + }, + "privacyPolicy": { + "label": "Privacy Policy", + "description": "URL or filename to privacy policy" + }, + "accessibilityStatement": { + "label": "Accessibility Statement", + "description": "URL or filename to accessibility statement" + }, + "cookiePolicy": { + "label": "Cookie Policy", + "description": "URL or filename to cookie policy" + }, + "impressum": { + "label": "Impressum", + "description": "URL or filename to impressum (required in some jurisdictions)" + } + }, + "premium": { + "title": "Premium & Enterprise", + "description": "Configure your premium or enterprise license key.", + "license": "License Configuration", + "key": { + "label": "License Key", + "description": "Enter your premium or enterprise license key" + }, + "enabled": { + "label": "Enable Premium Features", + "description": "Enable license key checks for pro/enterprise features" + }, + "movedFeatures": { + "title": "Premium Features Distributed", + "message": "Premium and Enterprise features are now organized in their respective sections:" + } + }, + "features": { + "title": "Features", + "description": "Configure optional features and functionality.", + "serverCertificate": { + "label": "Server Certificate", + "description": "Configure server-side certificate generation for \"Sign with Stirling-PDF\" functionality", + "enabled": { + "label": "Enable Server Certificate", + "description": "Enable server-side certificate for \"Sign with Stirling-PDF\" option" + }, + "organizationName": { + "label": "Organization Name", + "description": "Organization name for generated certificates" + }, + "validity": { + "label": "Certificate Validity (days)", + "description": "Number of days the certificate will be valid" + }, + "regenerateOnStartup": { + "label": "Regenerate on Startup", + "description": "Generate new certificate on each application startup" + } + } + }, + "endpoints": { + "title": "API Endpoints", + "description": "Control which API endpoints and endpoint groups are available.", + "management": "Endpoint Management", + "toRemove": { + "label": "Disabled Endpoints", + "description": "Select individual endpoints to disable" + }, + "groupsToRemove": { + "label": "Disabled Endpoint Groups", + "description": "Select endpoint groups to disable" + }, + "note": "Note: Disabling endpoints restricts API access but does not remove UI components. Restart required for changes to take effect." + } + } }, "fileUpload": { + "selectFile": "Select a file", + "selectFiles": "Select files", + "selectPdfToView": "Select a PDF to view", + "selectPdfToEdit": "Select a PDF to edit", + "chooseFromStorage": "Choose a file from storage or upload a new PDF", + "chooseFromStorageMultiple": "Choose files from storage or upload new PDFs", + "loadFromStorage": "Load from Storage", + "filesAvailable": "files available", "loading": "Nalaganje...", - "or": "ali" + "or": "ali", + "dropFileHere": "Drop file here or click to upload", + "dropFilesHere": "Drop files here or click the upload button", + "pdfFilesOnly": "PDF files only", + "supportedFileTypes": "Supported file types", + "upload": "Upload", + "uploadFile": "Upload File", + "uploadFiles": "Upload Files", + "noFilesInStorage": "No files available in storage. Upload some files first.", + "selectFromStorage": "Select from Storage", + "backToTools": "Back to Tools", + "addFiles": "Add Files", + "dragFilesInOrClick": "Drag files in or click \"Add Files\" to browse" + }, + "fileEditor": { + "addFiles": "Add Files" }, "fileManager": { + "title": "Upload PDF Files", + "subtitle": "Add files to your storage for easy access across tools", + "filesSelected": "files selected", + "clearSelection": "Clear Selection", + "openInFileEditor": "Open in File Editor", + "uploadError": "Failed to upload some files.", + "failedToOpen": "Failed to open file. It may have been removed from storage.", + "failedToLoad": "Failed to load file to active set.", + "storageCleared": "Browser cleared storage. Files have been removed. Please re-upload.", + "clearAll": "Clear All", + "reloadFiles": "Reload Files", + "dragDrop": "Drag & Drop files here", + "clickToUpload": "Click to upload files", + "selectedFiles": "Selected Files", + "storage": "Storage", + "filesStored": "files stored", + "storageError": "Storage error occurred", + "storageLow": "Storage is running low. Consider removing old files.", + "supportMessage": "Powered by browser database storage for unlimited capacity", + "noFileSelected": "No files selected", + "showHistory": "Show History", + "hideHistory": "Hide History", + "fileHistory": "File History", + "loadingHistory": "Loading History...", + "lastModified": "Last Modified", + "toolChain": "Tools Applied", + "restore": "Restore", + "unzip": "Unzip", + "searchFiles": "Search files...", + "recent": "Recent", + "localFiles": "Local Files", + "googleDrive": "Google Drive", + "googleDriveShort": "Drive", + "myFiles": "My Files", + "noRecentFiles": "No recent files found", + "googleDriveNotAvailable": "Google Drive integration not available", + "openFiles": "Open Files", + "openFile": "Open File", + "details": "File Details", "fileName": "Ime", + "fileFormat": "Format", + "fileSize": "Size", "fileVersion": "Različica", + "totalSelected": "Total Selected", + "dropFilesHere": "Drop files here", "selectAll": "Izberi vse", "deselectAll": "Prekliči izbor vseh", "deleteSelected": "IzbriÅĄi izbrano", + "downloadSelected": "Download Selected", + "selectedCount": "{{count}} selected", "download": "Prenos", - "delete": "IzbriÅĄi" + "delete": "IzbriÅĄi", + "unsupported": "Unsupported", + "addToUpload": "Add to Upload", + "deleteAll": "Delete All", + "loadingFiles": "Loading files...", + "noFiles": "No files available", + "noFilesFound": "No files found matching your search", + "openInPageEditor": "Open in Page Editor", + "showAll": "Show All", + "sortByDate": "Sort by Date", + "sortByName": "Sort by Name", + "sortBySize": "Sort by Size" + }, + "storage": { + "temporaryNotice": "Files are stored temporarily in your browser and may be cleared automatically", + "storageLimit": "Storage limit", + "storageUsed": "Temporary Storage used", + "storageFull": "Storage is nearly full. Consider removing some files.", + "fileTooLarge": "File too large. Maximum size per file is", + "storageQuotaExceeded": "Storage quota exceeded. Please remove some files before uploading more.", + "approximateSize": "Approximate size" }, "sanitize": { + "title": "Sanitise", + "desc": "Remove potentially harmful elements from PDF files.", "submit": "Prečisti PDF", + "completed": "Sanitisation completed successfully", + "error": { + "generic": "Sanitisation failed", + "failed": "An error occurred while sanitising the PDF." + }, + "filenamePrefix": "sanitised", + "sanitizationResults": "Sanitisation Results", "steps": { - "settings": "Nastavitve" + "files": "Files", + "settings": "Nastavitve", + "results": "Results" + }, + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "options": { + "title": "Sanitisation Options", + "note": "Select the elements you want to remove from the PDF. At least one option must be selected.", + "removeJavaScript": { + "label": "Remove JavaScript", + "desc": "Remove JavaScript actions and scripts from the PDF" + }, + "removeEmbeddedFiles": { + "label": "Remove Embedded Files", + "desc": "Remove any files embedded within the PDF" + }, + "removeXMPMetadata": { + "label": "Remove XMP Metadata", + "desc": "Remove XMP metadata from the PDF" + }, + "removeMetadata": { + "label": "Remove Document Metadata", + "desc": "Remove document information metadata (title, author, etc.)" + }, + "removeLinks": { + "label": "Remove Links", + "desc": "Remove external links and launch actions from the PDF" + }, + "removeFonts": { + "label": "Remove Fonts", + "desc": "Remove embedded fonts from the PDF" + } + } + }, + "addPassword": { + "title": "Dodaj geslo", + "desc": "Encrypt your PDF document with a password.", + "completed": "Password protection applied", + "submit": "Å ifriraj", + "filenamePrefix": "encrypted", + "error": { + "failed": "An error occurred while encrypting the PDF." + }, + "passwords": { + "stepTitle": "Passwords & Encryption", + "completed": "Passwords configured", + "user": { + "label": "User Password", + "placeholder": "Enter user password" + }, + "owner": { + "label": "Owner Password", + "placeholder": "Enter owner password" + } + }, + "encryption": { + "keyLength": { + "label": "Encryption Key Length", + "40bit": "40-bit (Low)", + "128bit": "128-bit (Standard)", + "256bit": "256-bit (High)" + } + }, + "results": { + "title": "Encrypted PDFs" + }, + "tooltip": { + "header": { + "title": "Password Protection Overview" + }, + "passwords": { + "title": "Password Types", + "text": "User passwords restrict opening the document, while owner passwords control what can be done with the document once opened. You can set both or just one.", + "bullet1": "User Password: Required to open the PDF", + "bullet2": "Owner Password: Controls document permissions (not supported by all PDF viewers)" + }, + "encryption": { + "title": "Encryption Levels", + "text": "Higher encryption levels provide better security but may not be supported by older PDF viewers.", + "bullet1": "40-bit: Basic security, compatible with older viewers", + "bullet2": "128-bit: Standard security, widely supported", + "bullet3": "256-bit: Maximum security, requires modern viewers" + }, + "permissions": { + "title": "Spremeni dovoljenja", + "text": "These permissions control what users can do with the PDF. Most effective when combined with an owner password." + } + }, + "tags": "varno,varnost", + "header": "Dodaj geslo (Å ifriraj)", + "selectText": { + "1": "Izberite PDF za ÅĄifriranje", + "2": "UporabniÅĄko geslo", + "3": "DolÅžina ÅĄifrirnega ključa", + "4": "ViÅĄje vrednosti so močnejÅĄe, niÅžje vrednosti pa imajo boljÅĄo zdruÅžljivost.", + "5": "Dovoljenja za nastavitev (priporočeno za uporabo skupaj z geslom lastnika)", + "6": "Prepreči sestavljanje dokumenta", + "7": "Prepreči ekstrakcijo vsebine", + "8": "Prepreči ekstrakcijo za dostopnost", + "9": "Prepreči izpolnjevanje obrazca", + "10": "Prepreči spreminjanje", + "11": "Prepreči spreminjanje pripisov", + "12": "Prepreči tiskanje", + "13": "Prepreči tiskanje različnih formatov", + "14": "LastniÅĄko geslo", + "15": "Omejuje, kaj je mogoče storiti z dokumentom, ko je odprt (ni podprt za vse bralnike)", + "16": "Omeji odpiranje samega dokumenta" } }, "changePermissions": { "title": "Spremeni dovoljenja", + "desc": "Change document restrictions and permissions.", + "completed": "Permissions changed", "submit": "Spremeni dovoljenja", + "error": { + "failed": "An error occurred while changing PDF permissions." + }, "permissions": { "preventAssembly": { "label": "Prepreči sestavljanje dokumenta" @@ -1738,10 +4580,784 @@ "label": "Prepreči tiskanje različnih formatov" } }, + "results": { + "title": "Modified PDFs" + }, "tooltip": { "header": { "title": "Spremeni dovoljenja" + }, + "description": { + "text": "Changes document permissions, allowing/disallowing access to different features in PDF readers." + }, + "warning": { + "text": "To make these permissions unchangeable, use the Add Password tool to set an owner password." } } + }, + "removePassword": { + "title": "Odstrani geslo", + "desc": "Odstranite zaÅĄÄito z geslom iz vaÅĄega dokumenta PDF.", + "tags": "varno,deÅĄifriranje,varnost,odstranitev gesla,brisanje gesla", + "password": { + "stepTitle": "Odstrani geslo", + "label": "Trenutno geslo", + "placeholder": "Enter current password", + "completed": "Password configured" + }, + "filenamePrefix": "decrypted", + "error": { + "failed": "An error occurred while removing the password from the PDF." + }, + "tooltip": { + "description": "Removing password protection requires the password that was used to encrypt the PDF. This will decrypt the document, making it accessible without a password." + }, + "submit": "Odstrani", + "results": { + "title": "Decrypted PDFs" + }, + "header": "Odstrani geslo (deÅĄifriraj)", + "selectText": { + "1": "Izberite PDF za deÅĄifriranje", + "2": "Geslo" + } + }, + "automate": { + "title": "Automate", + "desc": "Build multi-step workflows by chaining together PDF actions. Ideal for recurring tasks.", + "invalidStep": "Invalid step", + "files": { + "placeholder": "Select files to process with this automation" + }, + "selection": { + "title": "Automation Selection", + "saved": { + "title": "Saved" + }, + "createNew": { + "title": "Create New Automation" + }, + "suggested": { + "title": "Suggested" + } + }, + "creation": { + "createTitle": "Create Automation", + "editTitle": "Edit Automation", + "intro": "Automations run tools sequentially. To get started, add tools in the order you want them to run.", + "name": { + "label": "Automation Name", + "placeholder": "My Automation" + }, + "description": { + "label": "Description (optional)", + "placeholder": "Describe what this automation does..." + }, + "tools": { + "selectTool": "Select a tool...", + "selected": "Selected Tools", + "remove": "Remove tool", + "configure": "Configure tool", + "notConfigured": "! Not Configured", + "addTool": "Add Tool", + "add": "Add a tool..." + }, + "save": "Save Automation", + "unsavedChanges": { + "title": "Unsaved Changes", + "message": "You have unsaved changes. Are you sure you want to go back? All changes will be lost.", + "cancel": "Cancel", + "confirm": "Go Back" + }, + "icon": { + "label": "Icon" + } + }, + "run": { + "title": "Run Automation" + }, + "sequence": { + "unnamed": "Unnamed Automation", + "steps": "{{count}} steps", + "running": "Running Automation...", + "run": "Run Automation", + "finish": "Finish" + }, + "reviewTitle": "Automation Results", + "config": { + "loading": "Loading tool configuration...", + "noSettings": "This tool does not have configurable settings.", + "title": "Configure {{toolName}}", + "description": "Configure the settings for this tool. These settings will be applied when the automation runs.", + "cancel": "Cancel", + "save": "Save Configuration" + }, + "copyToSaved": "Copy to Saved" + }, + "automation": { + "suggested": { + "securePdfIngestion": "Secure PDF Ingestion", + "securePdfIngestionDesc": "Comprehensive PDF processing workflow that sanitises documents, applies OCR with cleanup, converts to PDF/A format for long-term archival, and optimises file size.", + "emailPreparation": "Email Preparation", + "emailPreparationDesc": "Optimises PDFs for email distribution by compressing files, splitting large documents into 20MB chunks for email compatibility, and removing metadata for privacy.", + "secureWorkflow": "Security Workflow", + "secureWorkflowDesc": "Secures PDF documents by removing potentially malicious content like JavaScript and embedded files, then adds password protection to prevent unauthorised access. Password is set to 'password' by default.", + "processImages": "Process Images", + "processImagesDesc": "Converts multiple image files into a single PDF document, then applies OCR technology to extract searchable text from the images." + } + }, + "common": { + "copy": "Copy", + "copied": "Copied!", + "refresh": "Refresh", + "retry": "Retry", + "remaining": "remaining", + "used": "used", + "available": "available", + "cancel": "Cancel", + "preview": "Preview" + }, + "config": { + "overview": { + "title": "Application Configuration", + "description": "Current application settings and configuration details." + }, + "account": { + "overview": { + "title": "Account Settings", + "manageAccountPreferences": "Manage your account preferences", + "guestDescription": "You are signed in as a guest. Consider upgrading your account above." + }, + "upgrade": { + "title": "Upgrade Guest Account", + "description": "Link your account to preserve your history and access more features!", + "socialLogin": "Upgrade with Social Account", + "linkWith": "Link with", + "emailPassword": "or enter your email & password", + "email": "Email", + "emailPlaceholder": "Enter your email", + "password": "Password (optional)", + "passwordPlaceholder": "Set a password", + "passwordNote": "Leave empty to use email verification only", + "upgradeButton": "Upgrade Account" + } + }, + "apiKeys": { + "description": "Your API key for accessing Stirling's suite of PDF tools. Copy it to your project or refresh to generate a new one.", + "publicKeyAriaLabel": "Public API key", + "copyKeyAriaLabel": "Copy API key", + "refreshAriaLabel": "Refresh API key", + "includedCredits": "Included credits", + "purchasedCredits": "Purchased credits", + "totalCredits": "Total Credits", + "chartAriaLabel": "Credits usage: included {{includedUsed}} of {{includedTotal}}, purchased {{purchasedUsed}} of {{purchasedTotal}}", + "nextReset": "Next Reset", + "lastApiUse": "Last API Use", + "overlayMessage": "Generate a key to see credits and available credits", + "label": "API Key", + "guestInfo": "Guest users do not receive API keys. Create an account to get an API key you can use in your applications.", + "goToAccount": "Go to Account", + "refreshModal": { + "title": "Refresh API Keys", + "warning": "âš ī¸ Warning: This action will generate new API keys and make your previous keys invalid.", + "impact": "Any applications or services currently using these keys will stop working until you update them with the new keys.", + "confirmPrompt": "Are you sure you want to continue?", + "confirmCta": "Refresh Keys" + }, + "generateError": "We couldn't generate your API key." + } + }, + "AddAttachmentsRequest": { + "attachments": "Select Attachments", + "info": "Select files to attach to your PDF. These files will be embedded and accessible through the PDF's attachment panel.", + "selectFiles": "Select Files to Attach", + "placeholder": "Choose files...", + "addMoreFiles": "Add more files...", + "selectedFiles": "Selected Files", + "submit": "Add Attachments", + "results": { + "title": "Attachment Results" + }, + "error": { + "failed": "Add attachments operation failed" + } + }, + "termsAndConditions": "Terms & Conditions", + "logOut": "Log out", + "addAttachments": { + "error": { + "failed": "An error occurred while adding attachments to the PDF." + } + }, + "autoRename": { + "description": "This tool will automatically rename PDF files based on their content. It analyzes the document to find the most suitable title from the text." + }, + "customPosition": "Custom Position", + "details": "Details", + "downloadUnavailable": "Download unavailable for this item", + "invalidUndoData": "Cannot undo: invalid operation data", + "margin": { + "large": "Large", + "medium": "Medium", + "small": "Small", + "xLarge": "Extra Large" + }, + "noFilesToUndo": "Cannot undo: no files were processed in the last operation", + "noOperationToUndo": "No operation to undo", + "noValidFiles": "No valid files to process", + "operationCancelled": "Operation cancelled", + "pageEdit": { + "deselectAll": "Select None", + "selectAll": "Select All" + }, + "quickPosition": "Quick Position", + "reorganizePages": { + "error": { + "failed": "Failed to reorganize pages" + }, + "results": { + "title": "Pages Reorganized" + }, + "settings": { + "title": "Settings" + }, + "submit": "Reorganize Pages" + }, + "replace-color": { + "options": { + "fill": "Fill colour", + "gradient": "Gradient" + }, + "previewOverlayOpacity": "Preview overlay opacity", + "previewOverlayTransparency": "Preview overlay transparency", + "previewOverlayVisibility": "Show preview overlay", + "selectText": { + "1": "Zamenjaj ali obrni barvne moÅžnosti", + "2": "Privzeto (privzete barve z visokim kontrastom)", + "3": "Po meri (barve po meri)", + "4": "Full-Invert(Invert vse barve)", + "5": "MoÅžnosti barv z visokim kontrastom", + "6": "belo besedilo na črnem ozadju", + "7": "Črno besedilo na belem ozadju", + "8": "Rumeno besedilo na črnem ozadju", + "9": "Zeleno besedilo na črnem ozadju", + "10": "Izberi barvo besedila", + "11": "Izberi barvo ozadja", + "12": "Choose start colour", + "13": "Choose end colour" + }, + "submit": "Zamenjaj", + "title": "Napredne barvne moÅžnosti", + "header": "Zamenjaj-Obrni barvni PDF" + }, + "size": "Size", + "submit": "Submit", + "success": "Success", + "tools": { + "noSearchResults": "No tools found", + "noTools": "No tools available" + }, + "undoDataMismatch": "Cannot undo: operation data is corrupted", + "undoFailed": "Failed to undo operation", + "undoQuotaError": "Cannot undo: insufficient storage space", + "undoStorageError": "Undo completed but some files could not be saved to storage", + "undoSuccess": "Operation undone successfully", + "unsupported": "Unsupported", + "onboarding": { + "welcomeModal": { + "title": "Welcome to Stirling PDF!", + "description": "Would you like to take a quick 1-minute tour to learn the key features and how to get started?", + "helpHint": "You can always access this tour later from the Help button in the bottom left.", + "startTour": "Start Tour", + "maybeLater": "Maybe Later", + "dontShowAgain": "Don't Show Again" + }, + "allTools": "This is the All Tools panel, where you can browse and select from all available PDF tools.", + "selectCropTool": "Let's select the Crop tool to demonstrate how to use one of the tools.", + "toolInterface": "This is the Crop tool interface. As you can see, there's not much there because we haven't added any PDF files to work with yet.", + "filesButton": "The Files button on the Quick Access bar allows you to upload PDFs to use the tools on.", + "fileSources": "You can upload new files or access recent files from here. For the tour, we'll just use a sample file.", + "workbench": "This is the Workbench - the main area where you view and edit your PDFs.", + "viewSwitcher": "Use these controls to select how you want to view your PDFs.", + "viewer": "The Viewer lets you read and annotate your PDFs.", + "pageEditor": "The Page Editor allows you to do various operations on the pages within your PDFs, such as reordering, rotating and deleting.", + "activeFiles": "The Active Files view shows all of the PDFs you have loaded into the tool, and allows you to select which ones to process.", + "fileCheckbox": "Clicking one of the files selects it for processing. You can select multiple files for batch operations.", + "selectControls": "The Right Rail contains buttons to quickly select/deselect all of your active PDFs, along with buttons to change the app's theme or language.", + "cropSettings": "Now that we've selected the file we want crop, we can configure the Crop tool to choose the area that we want to crop the PDF to.", + "runButton": "Once the tool has been configured, this button allows you to run the tool on all the selected PDFs.", + "results": "After the tool has finished running, the Review step will show a preview of the results in this panel, and allow you to undo the operation or download the file. ", + "fileReplacement": "The modified file will replace the original file in the Workbench automatically, allowing you to easily run it through more tools.", + "pinButton": "You can use the Pin button if you'd rather your files stay active after running tools on them.", + "wrapUp": "You're all set! You've learnt about the main areas of the app and how to use them. Click the Help button whenever you like to see this tour again.", + "previous": "Previous", + "next": "Next", + "finish": "Finish", + "startTour": "Start Tour", + "startTourDescription": "Take a guided tour of Stirling PDF's key features" + }, + "workspace": { + "title": "Workspace", + "people": { + "title": "People", + "description": "Manage workspace members and their permissions", + "loading": "Loading people...", + "searchMembers": "Search members...", + "addMembers": "Add Members", + "inviteMembers": { + "label": "Invite Members", + "subtitle": "Type or paste in emails below, separated by commas. Your workspace will be billed by members." + }, + "user": "User", + "role": "Role", + "team": "Team", + "status": "Status", + "actions": "Actions", + "noMembersFound": "No members found", + "active": "Active", + "disabled": "Disabled", + "activeSession": "Active session", + "member": "Member", + "admin": "Admin", + "roleDescriptions": { + "admin": "Can manage settings and invite members, with full administrative access.", + "member": "Can view and edit shared files, but cannot manage workspace settings or members." + }, + "editRole": "Edit Role", + "enable": "Enable", + "disable": "Disable", + "deleteUser": "Delete User", + "deleteUserSuccess": "User deleted successfully", + "deleteUserError": "Failed to delete user", + "confirmDelete": "Are you sure you want to delete this user? This action cannot be undone.", + "addMember": { + "title": "Add Member", + "username": "Username (Email)", + "usernamePlaceholder": "user@example.com", + "password": "Password", + "passwordPlaceholder": "Enter password", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "forcePasswordChange": "Force password change on first login", + "cancel": "Cancel", + "submit": "Add Member", + "usernameRequired": "Username and password are required", + "passwordTooShort": "Password must be at least 6 characters", + "success": "User created successfully", + "error": "Failed to create user" + }, + "editMember": { + "title": "Edit Member", + "editing": "Editing:", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "cancel": "Cancel", + "submit": "Update Member", + "success": "User updated successfully", + "error": "Failed to update user" + }, + "toggleEnabled": { + "success": "User status updated successfully", + "error": "Failed to update user status" + }, + "delete": { + "success": "User deleted successfully", + "error": "Failed to delete user" + }, + "emailInvite": { + "tab": "Email Invite", + "description": "Type or paste in emails below, separated by commas. Users will receive login credentials via email.", + "emails": "Email Addresses", + "emailsPlaceholder": "user1@example.com, user2@example.com", + "emailsRequired": "At least one email address is required", + "submit": "Send Invites", + "success": "user(s) invited successfully", + "partialSuccess": "Some invites failed", + "allFailed": "Failed to invite users", + "error": "Failed to send invites" + }, + "directInvite": { + "tab": "Direct Create" + }, + "inviteLinkTab": { + "tab": "Invite Link" + }, + "inviteLink": { + "description": "Generate a secure link that allows the user to set their own password", + "email": "Email Address", + "emailPlaceholder": "user@example.com (optional)", + "emailDescription": "Optional - leave blank for a general invite link that can be used by anyone", + "emailRequired": "Email address is required", + "emailOptional": "Optional - leave blank for a general invite link", + "emailRequiredForSend": "Email address is required to send email notification", + "expiryHours": "Expiry Hours", + "expiryDescription": "How many hours until the link expires", + "sendEmail": "Send invite link via email", + "sendEmailDescription": "If enabled, the invite link will be sent to the specified email address", + "smtpRequired": "SMTP not configured", + "generate": "Generate Link", + "generated": "Invite Link Generated", + "copied": "Link copied to clipboard", + "success": "Invite link generated successfully", + "successWithEmail": "Invite link generated and sent via email", + "emailFailed": "Invite link generated, but email failed", + "emailFailedDetails": "Error: {0}. Please share the invite link manually.", + "error": "Failed to generate invite link", + "submit": "Generate Invite Link" + }, + "inviteMode": { + "username": "Username", + "email": "Email", + "link": "Link", + "emailDisabled": "Email invites require SMTP configuration and mail.enableInvites=true in settings" + }, + "license": { + "users": "users", + "availableSlots": "Available Slots", + "grandfathered": "Grandfathered", + "grandfatheredShort": "{{count}} grandfathered", + "fromLicense": "from license", + "slotsAvailable": "{{count}} user slot(s) available", + "noSlotsAvailable": "No slots available", + "currentUsage": "Currently using {{current}} of {{max}} user licences" + } + }, + "teams": { + "title": "Teams", + "description": "Manage teams and organize workspace members", + "loading": "Loading teams...", + "loadingDetails": "Loading team details...", + "createNewTeam": "Create New Team", + "teamName": "Team Name", + "totalMembers": "Total Members", + "actions": "Actions", + "noTeamsFound": "No teams found", + "noMembers": "No members in this team", + "system": "System", + "addMember": "Add Member", + "viewTeam": "View Team", + "removeMember": "Remove from team", + "cannotRemoveFromSystemTeam": "Cannot remove from system team", + "renameTeamLabel": "Rename Team", + "deleteTeamLabel": "Delete Team", + "cannotDeleteInternal": "Cannot delete the Internal team", + "confirmDelete": "Are you sure you want to delete this team? This team must be empty to delete.", + "confirmRemove": "Remove user from this team?", + "cannotRenameInternal": "Cannot rename the Internal team", + "cannotAddToInternal": "Cannot add members to the Internal team", + "teamNotFound": "Team not found", + "backToTeams": "Back to Teams", + "memberCount": "{{count}} members", + "removeMemberSuccess": "User removed from team", + "removeMemberError": "Failed to remove user from team", + "createTeam": { + "title": "Create New Team", + "teamName": "Team Name", + "teamNamePlaceholder": "Enter team name", + "cancel": "Cancel", + "submit": "Create Team", + "nameRequired": "Team name is required", + "success": "Team created successfully", + "error": "Failed to create team" + }, + "renameTeam": { + "title": "Rename Team", + "renaming": "Renaming:", + "newTeamName": "New Team Name", + "newTeamNamePlaceholder": "Enter new team name", + "cancel": "Cancel", + "submit": "Rename Team", + "nameRequired": "Team name is required", + "success": "Team renamed successfully", + "error": "Failed to rename team" + }, + "deleteTeam": { + "success": "Team deleted successfully", + "error": "Failed to delete team. Make sure the team is empty.", + "teamMustBeEmpty": "Team must be empty before deletion" + }, + "addMemberToTeam": { + "title": "Add Member to Team", + "addingTo": "Adding to", + "selectUser": "Select User", + "selectUserPlaceholder": "Choose a user", + "selectUserRequired": "Please select a user", + "currentlyIn": "currently in", + "willBeMoved": "Note: This user will be moved from their current team to this team.", + "cancel": "Cancel", + "submit": "Add Member", + "userRequired": "Please select a user", + "success": "Member added to team successfully", + "error": "Failed to add member to team" + }, + "changeTeam": { + "label": "Change Team", + "title": "Change Team", + "changing": "Moving", + "selectTeam": "Select Team", + "selectTeamPlaceholder": "Choose a team", + "selectTeamRequired": "Please select a team", + "success": "Team changed successfully", + "error": "Failed to change team", + "submit": "Change Team" + } + } + }, + "plan": { + "currency": "Currency", + "popular": "Popular", + "current": "Current Plan", + "upgrade": "Upgrade", + "contact": "Contact Us", + "customPricing": "Custom", + "showComparison": "Compare All Features", + "hideComparison": "Hide Feature Comparison", + "featureComparison": "Feature Comparison", + "activePlan": { + "title": "Active Plan", + "subtitle": "Your current subscription details" + }, + "availablePlans": { + "title": "Available Plans", + "subtitle": "Choose the plan that fits your needs" + }, + "static": { + "title": "Billing Information", + "message": "Online billing is not currently configured. To upgrade your plan or manage subscriptions, please contact us directly.", + "contactSales": "Contact Sales", + "contactToUpgrade": "Contact us to upgrade or customize your plan", + "maxUsers": "Max Users", + "upTo": "Up to" + }, + "period": { + "month": "month" + }, + "free": { + "name": "Free", + "highlight1": "Limited Tool Usage Per week", + "highlight2": "Access to all tools", + "highlight3": "Community support" + }, + "pro": { + "name": "Pro", + "highlight1": "Unlimited Tool Usage", + "highlight2": "Advanced PDF tools", + "highlight3": "No watermarks" + }, + "enterprise": { + "name": "Enterprise", + "highlight1": "Custom pricing", + "highlight2": "Dedicated support", + "highlight3": "Latest features" + }, + "feature": { + "title": "Feature", + "pdfTools": "Basic PDF Tools", + "fileSize": "File Size Limit", + "automation": "Automate tool workflows", + "api": "API Access", + "priority": "Priority Support", + "customPricing": "Custom Pricing" + } + }, + "subscription": { + "status": { + "active": "Active", + "pastDue": "Past Due", + "canceled": "Canceled", + "incomplete": "Incomplete", + "trialing": "Trial", + "none": "No Subscription" + }, + "renewsOn": "Renews on {{date}}", + "cancelsOn": "Cancels on {{date}}" + }, + "billing": { + "manageBilling": "Manage Billing", + "portal": { + "error": "Failed to open billing portal" + } + }, + "payment": { + "preparing": "Preparing your checkout...", + "upgradeTitle": "Upgrade to {{planName}}", + "success": "Payment Successful!", + "successMessage": "Your subscription has been activated successfully. You will receive a confirmation email shortly.", + "autoClose": "This window will close automatically...", + "error": "Payment Error" + }, + "firstLogin": { + "title": "First Time Login", + "welcomeTitle": "Welcome!", + "welcomeMessage": "For security reasons, you must change your password on your first login.", + "loggedInAs": "Logged in as", + "error": "Error", + "currentPassword": "Current Password", + "enterCurrentPassword": "Enter your current password", + "newPassword": "New Password", + "enterNewPassword": "Enter new password (min 8 characters)", + "confirmPassword": "Confirm New Password", + "reEnterNewPassword": "Re-enter new password", + "changePassword": "Change Password", + "allFieldsRequired": "All fields are required", + "passwordsDoNotMatch": "New passwords do not match", + "passwordTooShort": "Password must be at least 8 characters", + "passwordMustBeDifferent": "New password must be different from current password", + "passwordChangedSuccess": "Password changed successfully! Please log in again.", + "passwordChangeFailed": "Failed to change password. Please check your current password." + }, + "invite": { + "welcome": "Welcome to Stirling PDF", + "invalidToken": "Invalid invitation link", + "validationError": "Failed to validate invitation link", + "passwordRequired": "Password is required", + "passwordTooShort": "Password must be at least 6 characters", + "passwordMismatch": "Passwords do not match", + "acceptError": "Failed to create account", + "validating": "Validating invitation...", + "invalidInvitation": "Invalid Invitation", + "goToLogin": "Go to Login", + "welcomeTitle": "You've been invited!", + "welcomeSubtitle": "Complete your account setup to get started", + "accountFor": "Creating account for", + "linkExpires": "Link expires", + "email": "Email address", + "emailPlaceholder": "Enter your email address", + "emailRequired": "Email address is required", + "invalidEmail": "Invalid email address", + "choosePassword": "Choose a password", + "passwordPlaceholder": "Enter your password", + "confirmPassword": "Confirm password", + "confirmPasswordPlaceholder": "Re-enter your password", + "createAccount": "Create Account", + "creating": "Creating Account...", + "alreadyHaveAccount": "Already have an account?", + "signIn": "Sign in" + }, + "audit": { + "error": { + "title": "Error loading audit system" + }, + "notAvailable": "Audit system not available", + "notAvailableMessage": "The audit system is not configured or not available.", + "disabled": "Audit logging is disabled", + "disabledMessage": "Enable audit logging in your application configuration to track system events.", + "systemStatus": { + "title": "System Status", + "status": "Audit Logging", + "enabled": "Enabled", + "disabled": "Disabled", + "level": "Audit Level", + "retention": "Retention Period", + "days": "days", + "totalEvents": "Total Events" + }, + "tabs": { + "dashboard": "Dashboard", + "events": "Audit Events", + "export": "Export" + }, + "charts": { + "title": "Audit Dashboard", + "error": "Error loading charts", + "day": "Day", + "week": "Week", + "month": "Month", + "byType": "Events by Type", + "byUser": "Events by User", + "overTime": "Events Over Time" + }, + "events": { + "title": "Audit Events", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "error": "Error loading events", + "noEvents": "No events found", + "timestamp": "Timestamp", + "type": "Type", + "user": "User", + "ipAddress": "IP Address", + "actions": "Actions", + "viewDetails": "View Details", + "eventDetails": "Event Details", + "details": "Details" + }, + "export": { + "title": "Export Audit Data", + "description": "Export audit events to CSV or JSON format. Use filters to limit the exported data.", + "format": "Export Format", + "filters": "Filters (Optional)", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "exportButton": "Export Data", + "error": "Failed to export data" + } + }, + "usage": { + "noData": "No data available", + "error": "Error loading usage statistics", + "noDataMessage": "No usage statistics are currently available.", + "controls": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All", + "refresh": "Refresh", + "dataTypeLabel": "Data Type:", + "dataType": { + "all": "All", + "api": "API", + "ui": "UI" + } + }, + "showing": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All" + }, + "stats": { + "totalEndpoints": "Total Endpoints", + "totalVisits": "Total Visits", + "showing": "Showing", + "selectedVisits": "Selected Visits" + }, + "chart": { + "title": "Endpoint Usage Chart" + }, + "table": { + "title": "Detailed Statistics", + "endpoint": "Endpoint", + "visits": "Visits", + "percentage": "Percentage", + "noData": "No data available" + } + }, + "backendHealth": { + "checking": "Checking backend status...", + "online": "Backend Online", + "offline": "Backend Offline" + }, + "autoRedact": { + "tags": "Uredi,Skrij,zatemni,črno,marker,skrito", + "title": "Samodejno redigiraj", + "header": "Samodejno redigiraj", + "colorLabel": "Barva", + "textsToRedactLabel": "Besedilo za redigiranje (ločeno z vrsticami)", + "textsToRedactPlaceholder": "npr. \\nZaupno \\nStrogo zaupno", + "useRegexLabel": "Uporabi regularni izraz", + "wholeWordSearchLabel": "Iskanje po celi besedi", + "customPaddingLabel": "Dodatno oblazinjenje po meri", + "convertPDFToImageLabel": "Pretvori PDF v PDF-sliko (Uporablja se za odstranitev besedila za poljem)", + "submitButton": "PoÅĄlji" + }, + "replaceColorPdf": { + "tags": "Zamenjaj barvo,operacije strani,zadnja stran,streÅžniÅĄka stran" } -} \ No newline at end of file +} diff --git a/frontend/public/locales/sr-LATN-RS/translation.json b/frontend/public/locales/sr-LATN-RS/translation.json index 2503eba23..1b802d4df 100644 --- a/frontend/public/locales/sr-LATN-RS/translation.json +++ b/frontend/public/locales/sr-LATN-RS/translation.json @@ -1,4 +1,40 @@ { + "toolPanel": { + "modePrompt": { + "title": "Choose how you browse tools", + "description": "Preview both layouts and decide how you want to explore Stirling PDF tools.", + "sidebarTitle": "Sidebar mode", + "sidebarDescription": "Keep tools alongside your workspace for quick switching.", + "recommended": "Recommended", + "chooseSidebar": "Use sidebar mode", + "fullscreenTitle": "Fullscreen mode - (legacy)", + "fullscreenDescription": "Browse every tool in a catalogue that covers the workspace until you pick one.", + "chooseFullscreen": "Use fullscreen mode", + "dismiss": "Maybe later" + }, + "fullscreen": { + "showDetails": "Show Details", + "comingSoon": "Coming soon:", + "favorite": "Add to favourites", + "favorites": "Favourites", + "heading": "All tools (fullscreen view)", + "noResults": "Try adjusting your search or toggle descriptions to find what you need.", + "recommended": "Recommended", + "unfavorite": "Remove from favourites" + }, + "placeholder": "Choose a tool to get started", + "toggle": { + "fullscreen": "Switch to fullscreen mode", + "sidebar": "Switch to sidebar mode" + } + }, + "unsavedChanges": "You have unsaved changes to your PDF.", + "areYouSure": "Are you sure you want to leave?", + "unsavedChangesTitle": "Unsaved Changes", + "keepWorking": "Keep Working", + "discardChanges": "Discard & Leave", + "applyAndContinue": "Save & Leave", + "exportAndContinue": "Export & Continue", "language": { "direction": "ltr" }, @@ -18,8 +54,26 @@ "customTextDesc": "Prilagođeni tekst", "numberPagesDesc": "Koje stranice brojati, podrazumevano 'sve', takođe prihvata 1-5 ili 2,5,9 itd.", "customNumberDesc": "Podrazumevano je {n}, takođe prihvata 'Stranica {n} od {ukupno}', 'Tekst-{n}', '{ime_fajla}-{n}'", - "submit": "Dodaj brojeve stranica" + "submit": "Dodaj brojeve stranica", + "configuration": "Configuration", + "customize": "Customize Appearance", + "pagesAndStarting": "Pages & Starting Number", + "positionAndPages": "Position & Pages", + "error": { + "failed": "Add page numbers operation failed" + }, + "results": { + "title": "Page Number Results" + }, + "preview": "Position Selection", + "previewDisclaimer": "Preview is approximate. Final output may vary due to PDF font metrics." }, + "pageSelectionPrompt": "Prilagođeni redosled stranica (unesi listu brojeva stranica 1,5,6 ili funkcija, kao ÅĄto je 2n+1, razdvojenih zarezima) :", + "startingNumberTooltip": "The first number to display. Subsequent pages will increment from this number.", + "marginTooltip": "Distance between the page number and the edge of the page.", + "fontSizeTooltip": "Size of the page number text in points. Larger numbers create bigger text.", + "fontTypeTooltip": "Font family for the page numbers. Choose based on your document style.", + "customTextTooltip": "Optional custom format for page numbers. Use {n} as placeholder for the number. Example: \"Page {n}\" will show \"Page 1\", \"Page 2\", etc.", "pdfPrompt": "Odaberi PDF(ove)", "multiPdfPrompt": "Odaberi PDF-ove (2+)", "multiPdfDropPrompt": "Odaberi (prevuci i pusti ) sve PDF-ove koji su vam potrebni", @@ -30,15 +84,41 @@ "uploadLimitExceededPlural": "su preveliki. Maksimalna dozvoljena veličina je", "processTimeWarning": "Warning:Upozorenje: Ovaj proces moÅže trajati i do minut, u zavisnosti od veličine dokumenta", "pageOrderPrompt": "Prilagođeni redosled stranica (unesi listu brojeva stranica ili funkcija, kao ÅĄto su 2n+1, razdvojene zarezima) :", - "pageSelectionPrompt": "Prilagođeni redosled stranica (unesi listu brojeva stranica 1,5,6 ili funkcija, kao ÅĄto je 2n+1, razdvojenih zarezima) :", "goToPage": "Idi", "true": "Tačno", "false": "Netačno", "unknown": "Nepoznato", + "app": { + "description": "The Free Adobe Acrobat alternative (10M+ Downloads)" + }, "save": "Sačuvaj", "saveToBrowser": "Sačuvaj u pregledaču", + "download": "Preuzmi", + "pin": "Pin File (keep active after tool run)", + "unpin": "Unpin File (replace after tool run)", + "undoOperationTooltip": "Click to undo the last operation and restore the original files", + "undo": "PoniÅĄti", + "moreOptions": "More Options", + "editYourNewFiles": "Edit your new file(s)", "close": "Zatvori", + "openInViewer": "Open in Viewer", + "confirmClose": "Confirm Close", + "confirmCloseMessage": "Are you sure you want to close this file?", + "confirmCloseCancel": "Cancel", + "confirmCloseConfirm": "Close File", + "fileSelected": "Selected: {{filename}}", + "chooseFile": "Choose File", "filesSelected": "odabrani fajlovi", + "files": { + "title": "Files", + "upload": "Upload", + "uploadFiles": "Upload Files", + "addFiles": "Add files", + "selectFromWorkbench": "Select files from the workbench or ", + "selectMultipleFromWorkbench": "Select at least {{count}} files from the workbench or ", + "created": "Created", + "size": "File Size" + }, "noFavourites": "Nema dodatih favorita", "downloadComplete": "Preuzimanje zavrÅĄeno", "bored": "Da li ti je dosadno dok čekaÅĄ?", @@ -56,7 +136,10 @@ }, "error": { "pdfPassword": "PDF dokument je ÅĄifrovan i lozinka nije data ili je netačna", + "encryptedPdfMustRemovePassword": "This PDF is encrypted or password-protected. Please unlock it before converting to PDF/A.", + "incorrectPasswordProvided": "The PDF password is incorrect or not provided.", "_value": "Error", + "dismissAllErrors": "Dismiss All Errors", "sorry": "Izvinjavamo se zbog problema!", "needHelp": "Potrebna pomoć / NaiÅĄli ste na problem?", "contactTip": "Ako i dalje imaÅĄ problema, ne oklevaj da nas kontaktiraÅĄ za pomoć. MoÅžeÅĄ poslati prijavu na naÅĄoj GitHub stranici ili nas kontaktirati putem Discord-a:", @@ -71,6 +154,10 @@ "githubSubmit": "GitHub - poÅĄalji prijavu", "discordSubmit": "Discord - poÅĄalji poruku za podrÅĄku" }, + "warning": { + "tooltipTitle": "Warning" + }, + "edit": "Edit", "delete": "ObriÅĄi", "username": "Korisničko ime", "password": "Å ifra", @@ -82,6 +169,7 @@ "green": "Zeleno", "blue": "Plavo", "custom": "Prilagođeno...", + "comingSoon": "Coming soon", "WorkInProgess": "Radovi u toku, moÅžda neće raditi ili će biti greÅĄaka, molimo prijavite sve probleme !", "poweredBy": "Omogućeno od strane", "yes": "Da", @@ -115,12 +203,14 @@ "page": "Strana", "pages": "Strane", "loading": "Učitavam...", + "review": "Review", "addToDoc": "Dodaj u dokument", "reset": "Resetuj", "apply": "Primeni", "noFileSelected": "Datoteka nije izabrana. Otpremi jednu.", "legal": { "privacy": "Politika privatnosti", + "iAgreeToThe": "I agree to all of the", "terms": "Uslovi i odredbe", "accessibility": "Pristupačnost", "cookie": "Politika kolačića", @@ -160,6 +250,7 @@ "title": "ÅŊeliÅĄ li da učiniÅĄ Stirling PDF boljim?", "paragraph1": "Stirling PDF ima opcioni sistem analitike koji nam pomaÅže da unapredimo proizvod. Ne pratimo nikakve lične podatke niti sadrÅžaj fajlova.", "paragraph2": "Molimo te da razmotriÅĄ uključivanje analitike kako bi pomogao Stirling PDF-u da raste i omogućio nam bolje razumevanje naÅĄih korisnika.", + "learnMore": "Learn more", "enable": "Omogući analitiku", "disable": "Onemogući analitiku", "settings": "MoÅžeÅĄ da promeniÅĄ podeÅĄavanja za analitiku u config/settings.yml datoteci" @@ -203,6 +294,54 @@ "cacheInputs": { "name": "Sačuvaj unete podatke", "help": "Omogući prethodno unete podatke za buduće koriÅĄÄ‡enje" + }, + "general": { + "title": "General", + "description": "Configure general application preferences.", + "account": "Account", + "accountDescription": "Manage your account settings", + "user": "User", + "signedInAs": "Signed in as", + "logout": "Log out", + "enableFeatures": { + "title": "For System Administrators", + "intro": "Enable user authentication, team management, and workspace features for your organization.", + "action": "Configure", + "and": "and", + "benefit": "Enables user roles, team collaboration, admin controls, and enterprise features.", + "learnMore": "Learn more in documentation", + "dismiss": "Dismiss" + }, + "autoUnzip": "Auto-unzip API responses", + "autoUnzipDescription": "Automatically extract files from ZIP responses", + "autoUnzipTooltip": "Automatically extract ZIP files returned from API operations. Disable to keep ZIP files intact. This does not affect automation workflows.", + "autoUnzipFileLimit": "Auto-unzip file limit", + "autoUnzipFileLimitDescription": "Maximum number of files to extract from ZIP", + "autoUnzipFileLimitTooltip": "Only unzip if the ZIP contains this many files or fewer. Set higher to extract larger ZIPs.", + "defaultToolPickerMode": "Default tool picker mode", + "defaultToolPickerModeDescription": "Choose whether the tool picker opens in fullscreen or sidebar by default", + "mode": { + "fullscreen": "Fullscreen", + "sidebar": "Sidebar" + } + }, + "hotkeys": { + "title": "Keyboard Shortcuts", + "description": "Hover a tool to see its shortcut or customise it below. Click \"Change shortcut\" and press a new key combination. Press Esc to cancel.", + "errorModifier": { + "mac": "Include ⌘ (Command), âŒĨ (Option), or another modifier in your shortcut.", + "windows": "Include Ctrl, Alt, or another modifier in your shortcut." + }, + "errorConflict": "Shortcut already used by {{tool}}.", + "none": "Not assigned", + "customBadge": "Custom", + "defaultLabel": "Default: {{shortcut}}", + "capturing": "Press keysâ€Ļ (Esc to cancel)", + "change": "Change shortcut", + "reset": "Reset", + "shortcut": "Shortcut", + "noShortcut": "No shortcut set", + "searchPlaceholder": "Search tools..." } }, "changeCreds": { @@ -274,8 +413,10 @@ "top20": "Top 20", "all": "Svi", "refresh": "OsveÅži", - "includeHomepage": "Uključi početnu stranu ('/')", - "includeLoginPage": "Uključi stranu za prijavu ('/login')", + "dataTypeLabel": "Data Type:", + "dataTypeAll": "All", + "dataTypeApi": "API", + "dataTypeUi": "UI", "totalEndpoints": "Ukupno krajnjih tačaka", "totalVisits": "Ukupno poseta", "showing": "Prikaz", @@ -290,7 +431,9 @@ "top": "Top", "numberOfVisits": "Broj poseta", "visitsTooltip": "Poseta: {0} ({1}% od ukupno)", - "retry": "PokuÅĄaj ponovo" + "retry": "PokuÅĄaj ponovo", + "includeHomepage": "Uključi početnu stranu ('/')", + "includeLoginPage": "Uključi stranu za prijavu ('/login')" }, "database": { "title": "Uvoz/izvoz baze", @@ -331,22 +474,310 @@ "alphabetical": "Abecedno", "globalPopularity": "Globalna popularnost", "sortBy": "Sortiranje:", + "mobile": { + "brandAlt": "Stirling PDF logo", + "openFiles": "Open files", + "swipeHint": "Swipe left or right to switch views", + "tools": "Tools", + "toolsSlide": "Tool selection panel", + "viewSwitcher": "Switch workspace view", + "workbenchSlide": "Workspace panel", + "workspace": "Workspace" + }, "multiTool": { + "tags": "multiple,tools", "title": "PDF Multi Alat", "desc": "Spajanje, rotacija, premeÅĄtanje i uklanjanje stranica" }, "merge": { + "tags": "combine,join,unite", "title": "Spajanje", "desc": "Lako spojite viÅĄe PDF-ova u jedan." }, "split": { + "tags": "divide,separate,break", "title": "Razdvajanje", "desc": "Razdvojite PDF-ove u viÅĄe dokumenata" }, "rotate": { + "tags": "turn,flip,orient", "title": "Rotacija", "desc": "Lako rotirajte vaÅĄe PDF-ove." }, + "convert": { + "tags": "transform,change", + "title": "Konvertuj", + "desc": "Convert files between different formats" + }, + "pdfOrganiser": { + "tags": "organize,rearrange,reorder", + "title": "Organizacija", + "desc": "Uklonite/PremeÅĄtajte stranice u bilo kom redosledu" + }, + "addImage": { + "tags": "insert,embed,place", + "title": "Dodaj sliku", + "desc": "Dodaje sliku na određeno mesto u PDF-u" + }, + "addAttachments": { + "tags": "embed,attach,include", + "title": "Add Attachments", + "desc": "Add or remove embedded files (attachments) to/from a PDF" + }, + "watermark": { + "tags": "stamp,mark,overlay", + "title": "Dodaj vodeni Åžig", + "desc": "Dodajte prilagođeni vodeni Åžig na vaÅĄ PDF dokument." + }, + "removePassword": { + "tags": "unlock", + "title": "Ukloni lozinku", + "desc": "Uklonite zaÅĄtitu lozinkom sa vaÅĄeg PDF dokumenta." + }, + "compress": { + "tags": "shrink,reduce,optimize", + "title": "Kompresuj", + "desc": "Kompresujte PDF-ove kako bi smanjili veličinu fajla." + }, + "unlockPDFForms": { + "tags": "unlock,enable,edit", + "title": "Otključaj PDF obrazac", + "desc": "Uklanjanje oznake samo-za-čitanje sa svih polja PDF obrasca" + }, + "changeMetadata": { + "tags": "edit,modify,update", + "title": "Promena metapodataka", + "desc": "Promenite/Uklonite/Dodajte metapodatke u PDF dokumentu" + }, + "ocr": { + "tags": "extract,scan", + "title": "OCR / ČiÅĄÄ‡enje skenova", + "desc": "ČiÅĄÄ‡enje skenova i detektovanje teksta sa slika unutar PDF-a i ponovno dodavanje kao teksta." + }, + "extractImages": { + "tags": "pull,save,export", + "title": "Izvuci slike", + "desc": "Izvlači sve slike iz PDF-a i čuva ih u zip formatu" + }, + "scannerImageSplit": { + "tags": "detect,split,photos", + "title": "Detect & Split Scanned Photos", + "desc": "Detect and split scanned photos into separate pages" + }, + "sign": { + "tags": "signature,autograph", + "title": "Potpis", + "desc": "Dodaje potpis u PDF crteÅžom, tekstom ili slikom" + }, + "flatten": { + "tags": "simplify,remove,interactive", + "title": "Ravnanje", + "desc": "Uklanja sve interaktivne elemente i forme iz PDF-a" + }, + "certSign": { + "tags": "authenticate,PEM,P12,official,encrypt,sign,certificate,PKCS12,JKS,server,manual,auto", + "title": "Potpis sa sertifikatom", + "desc": "Potpisuje PDF sa sertifikatom/ključem (PEM/P12)" + }, + "repair": { + "tags": "fix,restore", + "title": "Popravi", + "desc": "PokuÅĄava popraviti oÅĄtećeni/izgubljeni PDF" + }, + "removeBlanks": { + "tags": "delete,clean,empty", + "title": "Ukloni prazne stranice", + "desc": "Detektuje i uklanja prazne stranice iz dokumenta" + }, + "removeAnnotations": { + "tags": "delete,clean,strip", + "title": "Ukloni Anotacije", + "desc": "Uklanja sve komentare/anotacije iz PDF-a" + }, + "compare": { + "tags": "difference", + "title": "Uporedi", + "desc": "Upoređuje i prikazuje razlike između 2 PDF dokumenata" + }, + "removeCertSign": { + "tags": "remove,delete,unlock", + "title": "Uklanjanje digitalnog potpisa", + "desc": "Uklanjanje digitalnog potpisa sa sertifikatom iz PDF-a" + }, + "pageLayout": { + "tags": "layout,arrange,combine", + "title": "ViÅĄestruki prikaz stranica", + "desc": "Spaja viÅĄe stranica PDF dokumenta u jednu stranicu" + }, + "bookletImposition": { + "tags": "booklet,print,binding", + "title": "Booklet Imposition", + "desc": "Create booklets with proper page ordering and multi-page layout for printing and binding" + }, + "scalePages": { + "tags": "resize,adjust,scale", + "title": "Podesi veličinu/skalu stranice", + "desc": "Podesi veličinu/skalu stranice i/ili njenog sadrÅžaja." + }, + "addPageNumbers": { + "tags": "number,pagination,count", + "title": "Dodaj brojeve stranica", + "desc": "Dodaje brojeve stranica u dokumentu na određeno mesto" + }, + "autoRename": { + "tags": "auto-detect,header-based,organize,relabel", + "title": "Auto Rename PDF File", + "desc": "Auto renames a PDF file based on its detected header" + }, + "adjustContrast": { + "tags": "contrast,brightness,saturation", + "title": "Podesi boje/kontrast", + "desc": "Podesi kontrast, zasićenost i osvetljenost PDF-a" + }, + "crop": { + "tags": "trim,cut,resize", + "title": "Skraćivanje PDF-a", + "desc": "Skraćuje PDF radi smanjenja veličine (zadrÅžava tekst!)" + }, + "autoSplitPDF": { + "tags": "auto,split,QR", + "title": "Automatsko razdvajanje stranica", + "desc": "Automatski deli skenirane PDF-ove pomoću fizičkog skenera QR koda" + }, + "sanitize": { + "tags": "clean,purge,remove", + "title": "Sanitise", + "desc": "Remove potentially harmful elements from PDF files" + }, + "getPdfInfo": { + "tags": "info,metadata,details", + "title": "Dohvati SVE informacije o PDF-u", + "desc": "Dobavlja sve moguće informacije o PDF-ovima" + }, + "pdfToSinglePage": { + "tags": "combine,merge,single", + "title": "PDF u Jednu Veliku Stranicu", + "desc": "Spaja sve stranice PDF-a u jednu veliku stranicu" + }, + "showJS": { + "tags": "javascript,code,script", + "title": "PrikaÅži JavaScript", + "desc": "PretraÅžuje i prikazuje bilo koji JavaScript ubačen u PDF" + }, + "redact": { + "tags": "censor,blackout,hide", + "title": "Manual Redaction", + "desc": "Redacts a PDF based on selected text, drawn shapes and/or selected page(s)" + }, + "splitBySections": { + "tags": "split,sections,divide", + "title": "Split PDF by Sections", + "desc": "Divide each page of a PDF into smaller horizontal and vertical sections" + }, + "addStamp": { + "tags": "stamp,mark,seal", + "title": "Add Stamp to PDF", + "desc": "Add text or add image stamps at set locations" + }, + "removeImage": { + "tags": "remove,delete,clean", + "title": "Ukloni sliku", + "desc": "Remove image from PDF to reduce file size" + }, + "splitByChapters": { + "tags": "split,chapters,structure", + "title": "Podeli PDF po poglavljima", + "desc": "Split a PDF into multiple files based on its chapter structure." + }, + "validateSignature": { + "tags": "validate,verify,certificate", + "title": "Proveri PDF potpis", + "desc": "Verifikacija digitalnog potpisa i sertifikata u PDF dokumentu" + }, + "swagger": { + "tags": "API,documentation,test", + "title": "API Documentation", + "desc": "View API documentation and test endpoints" + }, + "scannerEffect": { + "tags": "scan,simulate,create", + "title": "Scanner Effect", + "desc": "Create a PDF that looks like it was scanned" + }, + "editTableOfContents": { + "tags": "bookmarks,contents,edit", + "title": "Izmeni sadrÅžaj", + "desc": "Dodaj ili izmeni obeleÅživače i sadrÅžaj u PDF dokumentima" + }, + "manageCertificates": { + "tags": "certificates,import,export", + "title": "Manage Certificates", + "desc": "Import, export, or delete digital certificate files used for signing PDFs." + }, + "read": { + "tags": "view,open,display", + "title": "Read", + "desc": "View and annotate PDFs. Highlight text, draw, or insert comments for review and collaboration." + }, + "reorganizePages": { + "tags": "rearrange,reorder,organize", + "title": "Reorganize Pages", + "desc": "Rearrange, duplicate, or delete PDF pages with visual drag-and-drop control." + }, + "extractPages": { + "tags": "pull,select,copy", + "title": "Izdvajanje stranica", + "desc": "Extract specific pages from a PDF document" + }, + "removePages": { + "tags": "delete,extract,exclude", + "title": "Ukloni", + "desc": "Brisanje nepotrebnih stranice iz PDF dokumenta" + }, + "autoSizeSplitPDF": { + "tags": "auto,split,size", + "title": "Automatsko deljenje po veličini/broju", + "desc": "Deljenje jednog PDF-a na viÅĄe na osnovu veličine, broja stranica ili broja dokumenata" + }, + "replaceColor": { + "title": "Replace & Invert Colour", + "desc": "Replace or invert colours in PDF documents" + }, + "devApi": { + "tags": "API,development,documentation", + "title": "API", + "desc": "Link to API documentation" + }, + "devFolderScanning": { + "tags": "automation,folder,scanning", + "title": "Automated Folder Scanning", + "desc": "Link to automated folder scanning guide" + }, + "devSsoGuide": { + "title": "SSO Guide", + "desc": "Link to SSO guide" + }, + "devAirgapped": { + "title": "Air-gapped Setup", + "desc": "Link to air-gapped setup guide" + }, + "addPassword": { + "title": "Dodaj lozinku", + "desc": "Enkriptujte vaÅĄ PDF dokument lozinkom." + }, + "changePermissions": { + "title": "Promeni dozvole", + "desc": "Change document restrictions and permissions" + }, + "automate": { + "tags": "workflow,sequence,automation", + "title": "Automate", + "desc": "Build multi-step workflows by chaining together PDF actions. Ideal for recurring tasks." + }, + "overlay-pdfs": { + "desc": "Preklapa PDF-ove jedan preko drugog", + "title": "Preklapanje PDF-ova" + }, "imageToPDF": { "title": "Slika u PDF", "desc": "Konvertujte sliku (PNG, JPEG, GIF) u PDF." @@ -355,18 +786,6 @@ "title": "PDF u Sliku", "desc": "Konvertujte PDF u sliku. (PNG, JPEG, GIF)" }, - "pdfOrganiser": { - "title": "Organizacija", - "desc": "Uklonite/PremeÅĄtajte stranice u bilo kom redosledu" - }, - "addImage": { - "title": "Dodaj sliku", - "desc": "Dodaje sliku na određeno mesto u PDF-u" - }, - "watermark": { - "title": "Dodaj vodeni Åžig", - "desc": "Dodajte prilagođeni vodeni Åžig na vaÅĄ PDF dokument." - }, "permissions": { "title": "Promeni dozvole", "desc": "Promenite dozvole vaÅĄeg PDF dokumenta" @@ -375,38 +794,10 @@ "title": "Ukloni", "desc": "ObriÅĄite nepotrebne stranice iz vaÅĄeg PDF dokumenta." }, - "addPassword": { - "title": "Dodaj lozinku", - "desc": "Enkriptujte vaÅĄ PDF dokument lozinkom." - }, - "removePassword": { - "title": "Ukloni lozinku", - "desc": "Uklonite zaÅĄtitu lozinkom sa vaÅĄeg PDF dokumenta." - }, - "compress": { - "title": "Kompresuj", - "desc": "Kompresujte PDF-ove kako bi smanjili veličinu fajla." - }, - "unlockPDFForms": { - "title": "Otključaj PDF obrazac", - "desc": "Uklanjanje oznake samo-za-čitanje sa svih polja PDF obrasca" - }, - "changeMetadata": { - "title": "Promena metapodataka", - "desc": "Promenite/Uklonite/Dodajte metapodatke u PDF dokumentu" - }, "fileToPDF": { "title": "Konvertuj fajl u PDF", "desc": "Konvertujte gotovo bilo koji fajl u PDF (DOCX, PNG, XLS, PPT, TXT i viÅĄe)" }, - "ocr": { - "title": "OCR / ČiÅĄÄ‡enje skenova", - "desc": "ČiÅĄÄ‡enje skenova i detektovanje teksta sa slika unutar PDF-a i ponovno dodavanje kao teksta." - }, - "extractImages": { - "title": "Izvuci slike", - "desc": "Izvlači sve slike iz PDF-a i čuva ih u zip formatu" - }, "pdfToPDFA": { "title": "PDF u PDF/A", "desc": "Konvertujte PDF u PDF/A za dugoročno čuvanje" @@ -435,70 +826,14 @@ "title": "Detekcija/Razdvajanje skeniranih fotografija", "desc": "Razdvaja viÅĄe fotografija unutar slike/PDF-a" }, - "sign": { - "title": "Potpis", - "desc": "Dodaje potpis u PDF crteÅžom, tekstom ili slikom" - }, - "flatten": { - "title": "Ravnanje", - "desc": "Uklanja sve interaktivne elemente i forme iz PDF-a" - }, - "repair": { - "title": "Popravi", - "desc": "PokuÅĄava popraviti oÅĄtećeni/izgubljeni PDF" - }, - "removeBlanks": { - "title": "Ukloni prazne stranice", - "desc": "Detektuje i uklanja prazne stranice iz dokumenta" - }, - "removeAnnotations": { - "title": "Ukloni Anotacije", - "desc": "Uklanja sve komentare/anotacije iz PDF-a" - }, - "compare": { - "title": "Uporedi", - "desc": "Upoređuje i prikazuje razlike između 2 PDF dokumenata" - }, - "certSign": { - "title": "Potpis sa sertifikatom", - "desc": "Potpisuje PDF sa sertifikatom/ključem (PEM/P12)" - }, - "removeCertSign": { - "title": "Uklanjanje digitalnog potpisa", - "desc": "Uklanjanje digitalnog potpisa sa sertifikatom iz PDF-a" - }, - "pageLayout": { - "title": "ViÅĄestruki prikaz stranica", - "desc": "Spaja viÅĄe stranica PDF dokumenta u jednu stranicu" - }, - "scalePages": { - "title": "Podesi veličinu/skalu stranice", - "desc": "Podesi veličinu/skalu stranice i/ili njenog sadrÅžaja." - }, "pipeline": { "title": "Pipeline (Napredno)", "desc": "Pokreće viÅĄe akcija na PDF-ovima definisanjem skripti u pipelinu" }, - "addPageNumbers": { - "title": "Dodaj brojeve stranica", - "desc": "Dodaje brojeve stranica u dokumentu na određeno mesto" - }, "auto-rename": { "title": "Automatsko preimenovanje PDF fajla", "desc": "Automatski menja ime PDF fajla na osnovu detektovanog zaglavlja" }, - "adjustContrast": { - "title": "Podesi boje/kontrast", - "desc": "Podesi kontrast, zasićenost i osvetljenost PDF-a" - }, - "crop": { - "title": "Skraćivanje PDF-a", - "desc": "Skraćuje PDF radi smanjenja veličine (zadrÅžava tekst!)" - }, - "autoSplitPDF": { - "title": "Automatsko razdvajanje stranica", - "desc": "Automatski deli skenirane PDF-ove pomoću fizičkog skenera QR koda" - }, "sanitizePDF": { "title": "Sanitizacija", "desc": "Uklanja skripte i druge elemente iz PDF fajlova" @@ -519,30 +854,14 @@ "title": "PDF to Markdown", "desc": "Converts any PDF to Markdown" }, - "getPdfInfo": { - "title": "Dohvati SVE informacije o PDF-u", - "desc": "Dobavlja sve moguće informacije o PDF-ovima" - }, "pageExtracter": { "title": "Izdvajanje stranica", "desc": "Izdvaja odabrane stranice iz PDF-a" }, - "pdfToSinglePage": { - "title": "PDF u Jednu Veliku Stranicu", - "desc": "Spaja sve stranice PDF-a u jednu veliku stranicu" - }, - "showJS": { - "title": "PrikaÅži JavaScript", - "desc": "PretraÅžuje i prikazuje bilo koji JavaScript ubačen u PDF" - }, "autoRedact": { "title": "Automatsko Cenzurisanje", "desc": "Automatsko cenzurisanje teksta u PDF-u na osnovu unetog teksta" }, - "redact": { - "title": "Manual Redaction", - "desc": "Redacts a PDF based on selected text, drawn shapes and/or selected page(s)" - }, "PDFToCSV": { "title": "PDF u CSV", "desc": "Izdvaja tabele iz PDF-a pretvarajući ih u CSV" @@ -551,10 +870,6 @@ "title": "Automatsko Deljenje po Veličini/Broju", "desc": "Deljenje jednog PDF-a na viÅĄe dokumenata na osnovu veličine, broja stranica ili broja dokumenata" }, - "overlay-pdfs": { - "title": "Preklapanje PDF-ova", - "desc": "Preklapa PDF-ove jedan preko drugog" - }, "split-by-sections": { "title": "Deljenje PDF-a po Odeljcima", "desc": "Deljenje svake stranice PDF-a na manje horizontalne i vertikalne odeljke" @@ -563,48 +878,18 @@ "title": "Dodaj pečat u PDF", "desc": "Dodavanje teksta ili slike pečeta na Åželjenim lokacijama" }, - "removeImage": { - "title": "Ukloni sliku", - "desc": "Remove image from PDF to reduce file size" - }, - "splitByChapters": { - "title": "Podeli PDF po poglavljima", - "desc": "Split a PDF into multiple files based on its chapter structure." - }, - "validateSignature": { - "title": "Proveri PDF potpis", - "desc": "Verifikacija digitalnog potpisa i sertifikata u PDF dokumentu" - }, "replace-color": { "title": "Replace and Invert Color", "desc": "Replace color for text and background in PDF and invert full color of pdf to reduce file size" }, - "convert": { - "title": "Konvertuj" - }, "attachments": { "title": "Dodaj priloge", "desc": "Dodavanje ili uklanjanje uključenih datoteka (priloga) u/iz PDF-a" }, - "editTableOfContents": { - "title": "Izmeni sadrÅžaj", - "desc": "Dodaj ili izmeni obeleÅživače i sadrÅžaj u PDF dokumentima" - }, - "extractPages": { - "title": "Izdvajanje stranica" - }, - "removePages": { - "title": "Ukloni", - "desc": "Brisanje nepotrebnih stranice iz PDF dokumenta" - }, "removeImagePdf": { "title": "Ukloni sliku", "desc": "Uklanjanje slike iz PDF-a u cilju smanjenja veličine datoteke" }, - "autoSizeSplitPDF": { - "title": "Automatsko deljenje po veličini/broju", - "desc": "Deljenje jednog PDF-a na viÅĄe na osnovu veličine, broja stranica ili broja dokumenata" - }, "adjust-contrast": { "title": "Podesi boje/kontrast", "desc": "PodeÅĄavanje kontrasta, zasićenosti i osvetljenost PDF-a" @@ -612,11 +897,12 @@ "replaceColorPdf": { "title": "Napredna podeÅĄavanja boja", "desc": "Zameni boju teksta i pozadine u PDF i invertuj celokupnu boju PDF-a u cilju smanjenja veličine datoteke" - }, - "changePermissions": { - "title": "Promeni dozvole" } }, + "landing": { + "addFiles": "Add Files", + "uploadFromComputer": "Upload from computer" + }, "viewPdf": { "tags": "pregled,čitanje,anotiranje,tekst,slika", "title": "Pogledaj/Izmeni PDF", @@ -650,17 +936,39 @@ "merge": { "tags": "spajanje,Operacije sa stranicama,Backend,server strana", "title": "Spajanje", + "removeDigitalSignature": { + "label": "Remove digital signature in the merged file?", + "tooltip": { + "title": "Remove Digital Signature", + "description": "Digital signatures will be invalidated when merging files. Check this to remove them from the final merged PDF." + } + }, + "generateTableOfContents": { + "label": "Generate table of contents in the merged file?", + "tooltip": { + "title": "Generate Table of Contents", + "description": "Automatically creates a clickable table of contents in the merged PDF based on the original file names and page numbers." + } + }, + "submit": "Spajanje", + "sortBy": { + "description": "Files will be merged in the order they're selected. Drag to reorder or sort below.", + "label": "Sort By", + "filename": "Ime datoteke", + "dateModified": "Date Modified", + "ascending": "Ascending", + "descending": "Descending", + "sort": "Sort" + }, + "error": { + "failed": "An error occurred while merging the PDFs." + }, "header": "Spajanje viÅĄe PDF fajlova (2+)", "sortByName": "Sortiraj po imenu", "sortByDate": "Sortiraj po datumu", - "removeCertSign": "Remove digital signature in the merged file?", - "submit": "Spajanje", - "sortBy": { - "filename": "Ime datoteke" - } + "removeCertSign": "Remove digital signature in the merged file?" }, "split": { - "tags": "Operacije sa stranicama,podela,ViÅĄestruke stranice,sečenje,server strana", "title": "Razdvajanje PDF-a", "header": "Razdvajanje PDF-a", "desc": { @@ -676,25 +984,249 @@ "splitPages": "Unesite stranice za razdvajanje:", "submit": "Razdvoji", "steps": { + "chooseMethod": "Choose Method", "settings": "PodeÅĄavanja" }, + "settings": { + "selectMethodFirst": "Please select a split method first" + }, + "error": { + "failed": "An error occurred while splitting the PDF." + }, + "method": { + "label": "Choose split method", + "placeholder": "Select how to split the PDF" + }, "methods": { + "prefix": { + "splitAt": "Split at", + "splitBy": "Split by" + }, + "byPages": { + "name": "Page Numbers", + "desc": "Extract specific pages (1,3,5-10)", + "tooltip": "Enter page numbers separated by commas or ranges with hyphens" + }, + "bySections": { + "name": "Sections", + "desc": "Divide pages into grid sections", + "tooltip": "Split each page into horizontal and vertical sections" + }, "bySize": { - "name": "Veličina datoteke" + "name": "Veličina datoteke", + "desc": "Limit maximum file size", + "tooltip": "Specify maximum file size (e.g. 10MB, 500KB)" + }, + "byPageCount": { + "name": "Page Count", + "desc": "Fixed pages per file", + "tooltip": "Enter the number of pages for each split file" + }, + "byDocCount": { + "name": "Document Count", + "desc": "Create specific number of files", + "tooltip": "Enter how many files you want to create" + }, + "byChapters": { + "name": "Chapters", + "desc": "Split at bookmark boundaries", + "tooltip": "Uses PDF bookmarks to determine split points" + }, + "byPageDivider": { + "name": "Page Divider", + "desc": "Auto-split with divider sheets", + "tooltip": "Use QR code divider sheets between documents when scanning" } }, "value": { "fileSize": { - "label": "Veličina datoteke" + "label": "Veličina datoteke", + "placeholder": "e.g. 10MB, 500KB" + }, + "pageCount": { + "label": "Pages per File", + "placeholder": "e.g. 5, 10" + }, + "docCount": { + "label": "Number of Files", + "placeholder": "e.g. 3, 5" } - } + }, + "tooltip": { + "header": { + "title": "Split Methods Overview" + }, + "byPages": { + "title": "Split at Page Numbers", + "text": "Split your PDF at specific page numbers. Using 'n' splits after page n. Using 'n-m' splits before page n and after page m.", + "bullet1": "Single split points: 3,7 (splits after pages 3 and 7)", + "bullet2": "Range split points: 3-8 (splits before page 3 and after page 8)", + "bullet3": "Mixed: 2,5-10,15 (splits after page 2, before page 5, after page 10, and after page 15)" + }, + "bySections": { + "title": "Split by Grid Sections", + "text": "Divide each page into a grid of sections. Useful for splitting documents with multiple columns or extracting specific areas.", + "bullet1": "Horizontal: Number of rows to create", + "bullet2": "Vertical: Number of columns to create", + "bullet3": "Merge: Combine all sections into one PDF" + }, + "bySize": { + "title": "Split by File Size", + "text": "Create multiple PDFs that don't exceed a specified file size. Ideal for file size limitations or email attachments.", + "bullet1": "Use MB for larger files (e.g., 10MB)", + "bullet2": "Use KB for smaller files (e.g., 500KB)", + "bullet3": "System will split at page boundaries" + }, + "byCount": { + "title": "Split by Count", + "text": "Create multiple PDFs with a specific number of pages or documents each.", + "bullet1": "Page Count: Fixed number of pages per file", + "bullet2": "Document Count: Fixed number of output files", + "bullet3": "Useful for batch processing workflows" + }, + "byChapters": { + "title": "Split by Chapters", + "text": "Use PDF bookmarks to automatically split at chapter boundaries. Requires PDFs with bookmark structure.", + "bullet1": "Bookmark Level: Which level to split on (1=top level)", + "bullet2": "Include Metadata: Preserve document properties", + "bullet3": "Allow Duplicates: Handle repeated bookmark names" + }, + "byDocCount": { + "bullet1": "Enter the number of output files you want", + "bullet2": "Pages are distributed as evenly as possible", + "bullet3": "Useful when you need a specific number of files", + "text": "Create a specific number of output files by evenly distributing pages across them.", + "title": "Split by Document Count" + }, + "byPageCount": { + "bullet1": "Enter the number of pages per output file", + "bullet2": "Last file may have fewer pages if not evenly divisible", + "bullet3": "Useful for batch processing workflows", + "text": "Create multiple PDFs with a specific number of pages each. Perfect for creating uniform document chunks.", + "title": "Split by Page Count" + }, + "byPageDivider": { + "bullet1": "Print divider sheets from the download link", + "bullet2": "Insert divider sheets between your documents", + "bullet3": "Scan all documents together as one PDF", + "bullet4": "Upload - divider pages are automatically detected and removed", + "bullet5": "Enable Duplex Mode if scanning both sides of divider sheets", + "text": "Automatically split scanned documents using physical divider sheets with QR codes. Perfect for processing multiple documents scanned together.", + "title": "Split by Page Divider" + } + }, + "methodSelection": { + "tooltip": { + "bullet1": "Click on a method card to select it", + "bullet2": "Hover over each card to see a quick description", + "bullet3": "The settings step will appear after you select a method", + "bullet4": "You can change methods at any time before processing", + "header": { + "text": "Choose how you want to split your PDF document. Each method is optimized for different use cases and document types.", + "title": "Split Method Selection" + }, + "title": "Choose Your Split Method" + } + }, + "selectMethod": "Select a split method", + "tags": "Operacije sa stranicama,podela,ViÅĄestruke stranice,sečenje,server strana" }, "rotate": { - "tags": "server strana", "title": "Rotiranje PDF-a", + "submit": "Rotiraj", + "selectRotation": "Select Rotation Angle (Clockwise)", + "error": { + "failed": "An error occurred while rotating the PDF." + }, + "preview": { + "title": "Rotation Preview" + }, + "rotateLeft": "Rotate Anticlockwise", + "rotateRight": "Rotate Clockwise", + "tooltip": { + "header": { + "title": "Rotate Settings Overview" + }, + "description": { + "text": "Rotate your PDF pages clockwise or anticlockwise in 90-degree increments. All pages in the PDF will be rotated. The preview shows how your document will look after rotation." + }, + "controls": { + "title": "Controls", + "text": "Use the rotation buttons to adjust orientation. Left button rotates anticlockwise, right button rotates clockwise. Each click rotates by 90 degrees." + } + }, + "tags": "server strana", "header": "Rotiranje PDF-a", - "selectAngle": "Izaberite ugao rotacije (u viÅĄestrukim od 90 stepeni):", - "submit": "Rotiraj" + "selectAngle": "Izaberite ugao rotacije (u viÅĄestrukim od 90 stepeni):" + }, + "convert": { + "title": "Konvertuj", + "desc": "Convert files between different formats", + "files": "Files", + "selectFilesPlaceholder": "Select files in the main view to get started", + "settings": "PodeÅĄavanja", + "conversionCompleted": "Conversion completed", + "results": "Results", + "defaultFilename": "converted_file", + "conversionResults": "Conversion Results", + "convertFrom": "Convert from", + "convertTo": "Convert to", + "sourceFormatPlaceholder": "Source format", + "targetFormatPlaceholder": "Target format", + "selectSourceFormatFirst": "Select a source format first", + "outputOptions": "Output Options", + "pdfOptions": "PDF Options", + "imageOptions": "Image Options", + "colorType": "Colour Type", + "color": "Boja", + "greyscale": "Monohromatski", + "blackwhite": "Black & White", + "dpi": "DPI", + "output": "Output", + "single": "Single", + "multiple": "Multiple", + "fitOption": "Fit Option", + "maintainAspectRatio": "Maintain Aspect Ratio", + "fitDocumentToPage": "Fit Document to Page", + "fillPage": "Popuni stranicu", + "autoRotate": "Auto Rotate", + "autoRotateDescription": "Automatically rotate images to better fit the PDF page", + "combineImages": "Combine Images", + "combineImagesDescription": "Combine all images into one PDF, or create separate PDFs for each image", + "webOptions": "Web to PDF Options", + "zoomLevel": "Zoom Level", + "emailOptions": "Email to PDF Options", + "includeAttachments": "Include email attachments", + "maxAttachmentSize": "Maximum attachment size (MB)", + "includeAllRecipients": "Include CC and BCC recipients in header", + "downloadHtml": "Download HTML intermediate file instead of PDF", + "pdfaOptions": "PDF/A Options", + "outputFormat": "Output Format", + "pdfaNote": "PDF/A-1b is more compatible, PDF/A-2b supports more features.", + "pdfaDigitalSignatureWarning": "PDF sadrÅži digitalni potpis. Biće uklonjen u sledećem koraku.", + "fileFormat": "File Format", + "wordDoc": "Word Document", + "wordDocExt": "Word Document (.docx)", + "odtExt": "OpenDocument Text (.odt)", + "pptExt": "PowerPoint (.pptx)", + "odpExt": "OpenDocument Presentation (.odp)", + "txtExt": "Plain Text (.txt)", + "rtfExt": "Rich Text Format (.rtf)", + "selectedFiles": "Selected files", + "noFileSelected": "No file selected. Use the file panel to add files.", + "convertFiles": "Convert Files", + "converting": "Converting...", + "downloadConverted": "Download Converted File", + "errorNoFiles": "Please select at least one file to convert.", + "errorNoFormat": "Please select both source and target formats.", + "errorNotSupported": "Conversion from {{from}} to {{to}} is not supported.", + "images": "Images", + "officeDocs": "Office Documents (Word, Excel, PowerPoint)", + "imagesExt": "Images (JPG, PNG, etc.)", + "markdown": "Markdown", + "textRtf": "Text/RTF", + "grayscale": "Monohromatski", + "errorConversion": "An error occurred while converting the file." }, "imageToPdf": { "tags": "konverzija,img,jpg,slika,foto" @@ -732,7 +1264,33 @@ "8": "Ukloni poslednju", "9": "Ukloni prvu i poslednju", "10": "Spoji neparne i parne stranice", - "11": "Dupliraj sve stranice" + "11": "Dupliraj sve stranice", + "desc": { + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, â€Ļ).", + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, â€Ļ).", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimized for binding on the side)." + } + }, + "desc": { + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, â€Ļ).", + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, â€Ļ).", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimised for binding on the side).", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document." }, "placeholder": "(npr. 1,3,2 ili 4-8,2,10-12 ili 2n-1)" }, @@ -744,9 +1302,198 @@ "upload": "Dodaj sliku", "submit": "Dodaj sliku" }, + "attachments": { + "tags": "uključi,dodaj,datoteka,prilog,prilozi", + "title": "Dodaj priloge", + "header": "Dodaj priloge", + "add": "Add Attachment", + "remove": "Remove Attachment", + "embed": "Embed Attachment", + "submit": "Dodaj priloge" + }, "watermark": { - "tags": "Tekst,ponavljanje,etiketa,vlastiti,autorsko pravo,zaÅĄtita, img,jpg,slika,foto", "title": "Dodaj vodeni Åžig", + "desc": "Add text or image watermarks to PDF files", + "completed": "Watermark added", + "submit": "Dodaj vodeni Åžig", + "filenamePrefix": "watermarked", + "error": { + "failed": "An error occurred while adding watermark to the PDF." + }, + "watermarkType": { + "text": "Tekst", + "image": "Image" + }, + "settings": { + "type": "Watermark Type", + "text": { + "label": "Watermark Text", + "placeholder": "Enter watermark text" + }, + "image": { + "label": "Watermark Image", + "choose": "Choose Image", + "selected": "Selected: {{filename}}" + }, + "fontSize": "Veličina fonta", + "size": "Size", + "alphabet": "Font/Language", + "color": "Watermark Colour", + "rotation": "Rotation (degrees)", + "opacity": "Opacity (%)", + "spacing": { + "horizontal": "Horizontal Spacing", + "vertical": "Vertical Spacing", + "height": "Height Spacing", + "width": "Width Spacing" + }, + "convertToImage": "Flatten PDF pages to images" + }, + "alphabet": { + "roman": "Roman/Latin", + "arabic": "Arabic", + "japanese": "Japanese", + "korean": "Korean", + "chinese": "Chinese", + "thai": "Thai" + }, + "steps": { + "type": "Watermark Type", + "wording": "Wording", + "textStyle": "Style", + "formatting": "Formatting", + "file": "Watermark File" + }, + "results": { + "title": "Watermark Results" + }, + "tooltip": { + "language": { + "title": "Language Support", + "text": "Choose the appropriate language setting to ensure proper font rendering for your text." + }, + "appearance": { + "title": "Appearance Settings", + "text": "Control how your watermark looks and blends with the document.", + "bullet1": "Rotation: -360° to 360° for angled watermarks", + "bullet2": "Opacity: 0-100% for transparency control", + "bullet3": "Lower opacity creates subtle watermarks" + }, + "spacing": { + "title": "Spacing Control", + "text": "Adjust the spacing between repeated watermarks across the page.", + "bullet1": "Width spacing: Horizontal distance between watermarks", + "bullet2": "Height spacing: Vertical distance between watermarks", + "bullet3": "Higher values create more spread out patterns" + }, + "type": { + "header": { + "title": "Watermark Type Selection" + }, + "description": { + "title": "Choose Your Watermark", + "text": "Select between text or image watermarks based on your needs." + }, + "text": { + "title": "Text Watermarks", + "text": "Perfect for adding copyright notices, company names, or confidentiality labels. Supports multiple languages and custom colours.", + "bullet1": "Customisable fonts and languages", + "bullet2": "Adjustable colours and transparency", + "bullet3": "Ideal for legal or branding text" + }, + "image": { + "title": "Image Watermarks", + "text": "Use logos, stamps, or any image as a watermark. Great for branding and visual identification.", + "bullet1": "Upload any image format", + "bullet2": "Maintains image quality", + "bullet3": "Perfect for logos and stamps" + } + }, + "wording": { + "header": { + "title": "Text Content" + }, + "text": { + "title": "Watermark Text", + "text": "Enter the text that will appear as your watermark across the document.", + "bullet1": "Keep it concise for better readability", + "bullet2": "Common examples: 'CONFIDENTIAL', 'DRAFT', company name", + "bullet3": "Emoji characters are not supported and will be filtered out" + } + }, + "textStyle": { + "header": { + "title": "Text Style" + }, + "color": { + "title": "Colour Selection", + "text": "Choose a colour that provides good contrast with your document content.", + "bullet1": "Light grey (#d3d3d3) for subtle watermarks", + "bullet2": "Black or dark colours for high contrast", + "bullet3": "Custom colours for branding purposes" + }, + "language": { + "title": "Language Support", + "text": "Choose the appropriate language setting to ensure proper font rendering." + } + }, + "file": { + "header": { + "title": "Image Upload" + }, + "upload": { + "title": "Image Selection", + "text": "Upload an image file to use as your watermark.", + "bullet1": "Supports common formats: PNG, JPG, GIF, BMP", + "bullet2": "PNG with transparency works best", + "bullet3": "Higher resolution images maintain quality better" + }, + "recommendations": { + "title": "Best Practices", + "text": "Tips for optimal image watermark results.", + "bullet1": "Use logos or stamps with transparent backgrounds", + "bullet2": "Simple designs work better than complex images", + "bullet3": "Consider the final document size when choosing resolution" + } + }, + "formatting": { + "header": { + "title": "Formatting & Layout" + }, + "size": { + "title": "Size Control", + "text": "Adjust the size of your watermark (text or image).", + "bullet1": "Larger sizes create more prominent watermarks" + }, + "appearance": { + "title": "Appearance Settings", + "text": "Control how your watermark looks and blends with the document.", + "bullet1": "Rotation: -360° to 360° for angled watermarks", + "bullet2": "Opacity: 0-100% for transparency control", + "bullet3": "Lower opacity creates subtle watermarks" + }, + "spacing": { + "title": "Spacing Control", + "text": "Adjust the spacing between repeated watermarks across the page.", + "bullet1": "Horizontal spacing: Distance between watermarks left to right", + "bullet2": "Vertical spacing: Distance between watermarks top to bottom", + "bullet3": "Higher values create more spread out patterns" + }, + "security": { + "title": "Security Option", + "text": "Convert the final PDF to an image-based format for enhanced security.", + "bullet1": "Prevents text selection and copying", + "bullet2": "Makes watermarks harder to remove", + "bullet3": "Results in larger file sizes", + "bullet4": "Best for sensitive or copyrighted content" + } + } + }, + "type": { + "1": "Text", + "2": "Image" + }, + "tags": "Tekst,ponavljanje,etiketa,vlastiti,autorsko pravo,zaÅĄtita, img,jpg,slika,foto", "header": "Dodaj vodeni Åžig", "customColor": "Custom Text Color", "selectText": { @@ -760,17 +1507,6 @@ "8": "Tip vodenog Åžiga:", "9": "Slika vodenog Åžiga:", "10": "Convert PDF to PDF-Image" - }, - "submit": "Dodaj vodeni Åžig", - "type": { - "1": "Text", - "2": "Image" - }, - "watermarkType": { - "text": "Tekst" - }, - "settings": { - "fontSize": "Veličina fonta" } }, "permissions": { @@ -795,50 +1531,201 @@ "removePages": { "tags": "Ukloni stranice,obriÅĄi stranice", "title": "Ukloni", + "pageNumbers": { + "label": "Pages to Remove", + "placeholder": "e.g., 1,3,5-8,10", + "error": "Invalid page number format. Use numbers, ranges (1-5), or mathematical expressions (2n+1)" + }, + "filenamePrefix": "pages_removed", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "settings": { + "title": "Settings" + }, + "tooltip": { + "header": { + "title": "Remove Pages Settings" + }, + "pageNumbers": { + "title": "Page Selection", + "text": "Specify which pages to remove from your PDF. You can select individual pages, ranges, or use mathematical expressions.", + "bullet1": "Individual pages: 1,3,5 (removes pages 1, 3, and 5)", + "bullet2": "Page ranges: 1-5,10-15 (removes pages 1-5 and 10-15)", + "bullet3": "Mathematical: 2n+1 (removes odd pages)", + "bullet4": "Open ranges: 5- (removes from page 5 to end)" + }, + "examples": { + "title": "Common Examples", + "text": "Here are some common page selection patterns:", + "bullet1": "Remove first page: 1", + "bullet2": "Remove last 3 pages: -3", + "bullet3": "Remove every other page: 2n", + "bullet4": "Remove specific scattered pages: 1,5,10,15" + }, + "safety": { + "title": "Safety Tips", + "text": "Important considerations when removing pages:", + "bullet1": "Always preview your selection before processing", + "bullet2": "Keep a backup of your original file", + "bullet3": "Page numbers start from 1, not 0", + "bullet4": "Invalid page numbers will be ignored" + } + }, + "error": { + "failed": "An error occurred whilst removing pages." + }, + "results": { + "title": "Page Removal Results" + }, "submit": "Ukloni" }, - "addPassword": { - "tags": "bezbedno,zaÅĄtita", - "title": "Dodaj ÅĄifru", - "header": "Dodaj ÅĄifru (Enkripcija)", - "selectText": { - "1": "Izaberite PDF za enkripciju", - "2": "Korisnička ÅĄifra", - "3": "DuÅžina enkripcijskog ključa", - "4": "Veće vrednosti su jače, ali manje vrednosti imaju bolju kompatibilnost.", - "5": "Postavke dozvola (Preporučuje se koriÅĄÄ‡enje sa ÅĄifrom vlasnika)", - "6": "Onemogući sastavljanje dokumenta", - "7": "Onemogući ekstrakciju sadrÅžaja", - "8": "Onemogući ekstrakciju za pristupačnost", - "9": "Onemogući popunjavanje formulara", - "10": "Onemogući modifikaciju", - "11": "Onemogući modifikaciju anotacija", - "12": "Onemogući ÅĄtampanje", - "13": "Onemogući ÅĄtampanje u različitim formatima", - "14": "Å ifra vlasnika", - "15": "Ograničava ÅĄta se moÅže raditi sa dokumentom nakon otvaranja (Nije podrÅžano od svih čitača)", - "16": "Ograničava otvaranje samog dokumenta" + "extractPages": { + "title": "Extract Pages", + "pageNumbers": { + "label": "Pages to Extract", + "placeholder": "e.g., 1,3,5-8 or odd & 1-10" + }, + "settings": { + "title": "Settings" }, - "submit": "Enkriptuj", "tooltip": { - "permissions": { - "title": "Promeni dozvole" + "description": "Extracts the selected pages into a new PDF, preserving order." + }, + "error": { + "failed": "Failed to extract pages" + }, + "results": { + "title": "Pages Extracted" + }, + "submit": "Extract Pages" + }, + "pageSelection": { + "tooltip": { + "header": { + "title": "Page Selection Guide" + }, + "basic": { + "title": "Basic Usage", + "text": "Select specific pages from your PDF document using simple syntax.", + "bullet1": "Individual pages: 1,3,5", + "bullet2": "Page ranges: 3-6 or 10-15", + "bullet3": "All pages: all" + }, + "advanced": { + "title": "Advanced Features" + }, + "tips": { + "title": "Tips", + "text": "Keep these guidelines in mind:", + "bullet1": "Page numbers start from 1 (not 0)", + "bullet2": "Spaces are automatically removed", + "bullet3": "Invalid expressions are ignored" + }, + "syntax": { + "title": "Syntax Basics", + "text": "Use numbers, ranges, keywords, and progressions (n starts at 0). Parentheses are supported.", + "bullets": { + "numbers": "Numbers/ranges: 5, 10-20", + "keywords": "Keywords: odd, even", + "progressions": "Progressions: 3n, 4n+1" + } + }, + "operators": { + "title": "Operators", + "text": "AND has higher precedence than comma. NOT applies within the document range.", + "and": "AND: & or \"and\" — require both conditions (e.g., 1-50 & even)", + "comma": "Comma: , or | — combine selections (e.g., 1-10, 20)", + "not": "NOT: ! or \"not\" — exclude pages (e.g., 3n & not 30)" + }, + "examples": { + "title": "Examples" + }, + "complex": { + "bullet1": "1,3-5,8,2n → pages 1, 3–5, 8, plus evens", + "bullet2": "10-,2n-1 → from page 10 to end + odd pages", + "description": "Mix different types.", + "title": "Complex Combinations" + }, + "description": "Choose which pages to use for the operation. Supports single pages, ranges, formulas, and the all keyword.", + "individual": { + "bullet1": "1,3,5 → selects pages 1, 3, 5", + "bullet2": "2,7,12 → selects pages 2, 7, 12", + "description": "Enter numbers separated by commas.", + "title": "Individual Pages" + }, + "mathematical": { + "bullet1": "2n → all even pages (2, 4, 6â€Ļ)", + "bullet2": "2n-1 → all odd pages (1, 3, 5â€Ļ)", + "bullet3": "3n → every 3rd page (3, 6, 9â€Ļ)", + "bullet4": "4n-1 → pages 3, 7, 11, 15â€Ļ", + "description": "Use n in formulas for patterns.", + "title": "Mathematical Functions" + }, + "ranges": { + "bullet1": "3-6 → selects pages 3–6", + "bullet2": "10-15 → selects pages 10–15", + "bullet3": "5- → selects pages 5 to end", + "description": "Use - for consecutive pages.", + "title": "Page Ranges" + }, + "special": { + "bullet1": "all → selects all pages", + "title": "Special Keywords" } } }, - "removePassword": { - "tags": "bezbedno,DeÅĄifruj,zaÅĄtita,ukloni lozinku", - "title": "Ukloni ÅĄifru", - "header": "Ukloni ÅĄifru (Dekripcija)", - "selectText": { - "1": "Izaberite PDF za dekripciju", - "2": "Å ifra" + "bulkSelection": { + "syntaxError": "There is a syntax issue. See Page Selection tips for help.", + "header": { + "title": "Page Selection Guide" }, - "submit": "Ukloni", - "desc": "Uklanjanje lozinke iz PDF dokumenta", - "password": { - "stepTitle": "Ukloni lozinku", - "label": "Trenutna lozinka" + "syntax": { + "title": "Syntax Basics", + "text": "Use numbers, ranges, keywords, and progressions (n starts at 0). Parentheses are supported.", + "bullets": { + "numbers": "Numbers/ranges: 5, 10-20", + "keywords": "Keywords: odd, even", + "progressions": "Progressions: 3n, 4n+1" + } + }, + "operators": { + "title": "Operators", + "text": "AND has higher precedence than comma. NOT applies within the document range.", + "and": "AND: & or \"and\" — require both conditions (e.g., 1-50 & even)", + "comma": "Comma: , or | — combine selections (e.g., 1-10, 20)", + "not": "NOT: ! or \"not\" — exclude pages (e.g., 3n & not 30)" + }, + "examples": { + "title": "Examples", + "first50": "First 50", + "last50": "Last 50", + "every3rd": "Every 3rd", + "oddWithinExcluding": "Odd within 1-20 excluding 5-7", + "combineSets": "Combine sets" + }, + "firstNPages": { + "title": "First N Pages", + "placeholder": "Number of pages" + }, + "lastNPages": { + "title": "Last N Pages", + "placeholder": "Number of pages" + }, + "everyNthPage": { + "title": "Every Nth Page", + "placeholder": "Step size" + }, + "range": { + "title": "Range", + "fromPlaceholder": "From", + "toPlaceholder": "To" + }, + "keywords": { + "title": "Keywords" + }, + "advanced": { + "title": "Advanced" } }, "compressPdfs": { @@ -848,12 +1735,142 @@ "tags": "ukloni,obriÅĄi,obrazac,polje,samo za čitanje", "title": "Ukloni reÅžim samo-za-čitanje sa polja obrasca", "header": "Otključaj PDF obrazac", - "submit": "Remove" + "submit": "Remove", + "description": "This tool will remove read-only restrictions from PDF form fields, making them editable and fillable.", + "filenamePrefix": "unlocked_forms", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst unlocking PDF forms." + }, + "results": { + "title": "Unlocked Forms Results" + } }, "changeMetadata": { - "tags": "Naslov,autor,datum,kreacije,vreme,izdavač,proizvođač,statistike", - "title": "Naslov:", "header": "Promeni metapodatke", + "submit": "Promeni", + "filenamePrefix": "metadata", + "settings": { + "title": "Metadata Settings" + }, + "standardFields": { + "title": "Standard Fields" + }, + "deleteAll": { + "label": "Remove Existing Metadata", + "checkbox": "Delete all metadata" + }, + "title": { + "label": "Title", + "placeholder": "Document title" + }, + "author": { + "label": "Author", + "placeholder": "Document author" + }, + "subject": { + "label": "Subject", + "placeholder": "Document subject" + }, + "keywords": { + "label": "Keywords", + "placeholder": "Document keywords" + }, + "creator": { + "label": "Creator", + "placeholder": "Document creator" + }, + "producer": { + "label": "Producer", + "placeholder": "Document producer" + }, + "dates": { + "title": "Date Fields" + }, + "creationDate": { + "label": "Creation Date", + "placeholder": "Creation date" + }, + "modificationDate": { + "label": "Modification Date", + "placeholder": "Modification date" + }, + "trapped": { + "label": "Trapped Status", + "unknown": "Unknown", + "true": "True", + "false": "False" + }, + "advanced": { + "title": "Advanced Options" + }, + "customFields": { + "title": "Custom Metadata", + "description": "Add custom metadata fields to the document", + "add": "Add Field", + "key": "Key", + "keyPlaceholder": "Custom key", + "value": "Value", + "valuePlaceholder": "Custom value", + "remove": "Remove" + }, + "results": { + "title": "Updated PDFs" + }, + "error": { + "failed": "An error occurred while changing the PDF metadata." + }, + "tooltip": { + "header": { + "title": "PDF Metadata Overview" + }, + "standardFields": { + "title": "Standard Fields", + "text": "Common PDF metadata fields that describe the document.", + "bullet1": "Title: Document name or heading", + "bullet2": "Author: Person who created the document", + "bullet3": "Subject: Brief description of content", + "bullet4": "Keywords: Search terms for the document", + "bullet5": "Creator/Producer: Software used to create the PDF" + }, + "dates": { + "title": "Date Fields", + "text": "When the document was created and modified.", + "bullet1": "Creation Date: When original document was made", + "bullet2": "Modification Date: When last changed" + }, + "options": { + "title": "Additional Options", + "text": "Custom fields and privacy controls.", + "bullet1": "Custom Metadata: Add your own key-value pairs", + "bullet2": "Trapped Status: High-quality printing setting", + "bullet3": "Delete All: Remove all metadata for privacy" + }, + "deleteAll": { + "title": "Remove Existing Metadata", + "text": "Complete metadata deletion to ensure privacy." + }, + "customFields": { + "title": "Custom Metadata", + "text": "Add your own custom key-value metadata pairs.", + "bullet1": "Add any custom fields relevant to your document", + "bullet2": "Examples: Department, Project, Version, Status", + "bullet3": "Both key and value are required for each entry" + }, + "advanced": { + "title": "Advanced Options", + "trapped": { + "title": "Trapped Status", + "description": "Indicates if document is prepared for high-quality printing.", + "bullet1": "True: Document has been trapped for printing", + "bullet2": "False: Document has not been trapped", + "bullet3": "Unknown: Trapped status is not specified" + } + } + }, + "tags": "Naslov,autor,datum,kreacije,vreme,izdavač,proizvođač,statistike", "selectText": { "1": "Izmenite promenljive koje Åželite promeniti", "2": "ObriÅĄi sve metapodatke", @@ -861,15 +1878,7 @@ "4": "Drugi metapodaci:", "5": "Dodaj prilagođeni unos metapodataka" }, - "author": "Autor:", - "creationDate": "Datum kreiranja (gggg/MM/dd HH:mm:ss):", - "creator": "Kreator:", - "keywords": "Ključne reči:", - "modDate": "Datum izmene (gggg/MM/dd HH:mm:ss):", - "producer": "Proizvođač:", - "subject": "Tema:", - "trapped": "Zaglavljeno:", - "submit": "Promeni" + "modDate": "Datum izmene (gggg/MM/dd HH:mm:ss):" }, "fileToPDF": { "tags": "transformacija,format,dokument,slika,slajd,tekst,konverzija,office,docs,word,excel,powerpoint", @@ -883,6 +1892,7 @@ "ocr": { "tags": "prepoznavanje,tekst,slika,sken,čitanje,identifikacija,detekcija,uređivanje", "title": "OCR / ČiÅĄÄ‡enje skeniranja", + "desc": "ČiÅĄÄ‡enje skenova i detektovanje teksta na slikama unutar PDF-a i ponovno dodavanje kao teksta", "header": "ČiÅĄÄ‡enje skeniranja / OCR (Optičko prepoznavanje znakova)", "selectText": { "1": "Odaberite jezike koji će biti detektovani unutar PDF-a (Navedeni su trenutno detektovani):", @@ -901,23 +1911,89 @@ "help": "Molimo vas da pročitate ovu dokumentaciju o tome kako koristiti ovo za druge jezike i/ili koriÅĄÄ‡enje van docker-a", "credit": "Ova usluga koristi qpdf i Tesseract za OCR.", "submit": "Obradi PDF sa OCR-om", - "desc": "ČiÅĄÄ‡enje skenova i detektovanje teksta na slikama unutar PDF-a i ponovno dodavanje kao teksta", + "operation": { + "submit": "Process OCR and Review" + }, + "results": { + "title": "OCR Results" + }, + "languagePicker": { + "additionalLanguages": "Looking for additional languages?", + "viewSetupGuide": "View setup guide →" + }, "settings": { "title": "PodeÅĄavanja", "ocrMode": { - "label": "ReÅžim OCR-a:" + "label": "ReÅžim OCR-a:", + "auto": "Auto (skip text layers)", + "force": "Force (re-OCR all, replace text)", + "strict": "Strict (abort if text found)" }, "languages": { - "label": "Jezici" + "label": "Jezici", + "placeholder": "Select languages" + }, + "compatibilityMode": { + "label": "Compatibility Mode" + }, + "advancedOptions": { + "label": "Processing Options", + "sidecar": "Create a text file", + "deskew": "Deskew pages", + "clean": "Clean input file", + "cleanFinal": "Clean final output" } }, "tooltip": { + "header": { + "title": "OCR Settings Overview" + }, "mode": { - "title": "ReÅžim OCR-a:" + "title": "ReÅžim OCR-a:", + "text": "Optical Character Recognition (OCR) helps you turn scanned or screenshotted pages into text you can search, copy, or highlight.", + "bullet1": "Auto skips pages that already contain text layers.", + "bullet2": "Force re-OCRs every page and replaces all the text.", + "bullet3": "Strict halts if any selectable text is found." }, "languages": { - "title": "Jezici" + "title": "Jezici", + "text": "Improve OCR accuracy by specifying the expected languages. Choose one or more languages to guide detection." + }, + "output": { + "title": "Output", + "text": "Decide how you want the text output formatted:", + "bullet1": "Searchable PDF embeds text behind the original image.", + "bullet2": "HOCR XML returns a structured machine-readable file.", + "bullet3": "Plain-text sidecar creates a separate .txt file with raw content." + }, + "advanced": { + "header": { + "title": "Advanced OCR Processing" + }, + "compatibility": { + "title": "Compatibility Mode", + "text": "Uses OCR 'sandwich PDF' mode: results in larger files, but more reliable with certain languages and older PDF software. By default we use hOCR for smaller, modern PDFs." + }, + "sidecar": { + "title": "Create Text File", + "text": "Generates a separate .txt file alongside the PDF containing all extracted text content for easy access and processing." + }, + "deskew": { + "title": "Deskew Pages", + "text": "Automatically corrects skewed or tilted pages to improve OCR accuracy. Useful for scanned documents that weren't perfectly aligned." + }, + "clean": { + "title": "Clean Input File", + "text": "Preprocesses the input by removing noise, enhancing contrast, and optimising the image for better OCR recognition before processing." + }, + "cleanFinal": { + "title": "Clean Final Output", + "text": "Post-processes the final PDF by removing OCR artefacts and optimising the text layer for better readability and smaller file size." + } } + }, + "error": { + "failed": "OCR operation failed" } }, "extractImages": { @@ -926,7 +2002,13 @@ "header": "Izdvajanje slika", "selectText": "Odaberite format slike za konvertovanje izdvojenih slika", "allowDuplicates": "Sačuvaj duplirane slike", - "submit": "Izdvajanje" + "submit": "Izdvajanje", + "settings": { + "title": "Settings" + }, + "error": { + "failed": "An error occurred while extracting images from the PDF." + } }, "pdfToPDFA": { "tags": "arhiva,dugoročno,standard,konverzija,čuvanje,čuvanje", @@ -998,17 +2080,53 @@ }, "info": "Python nije instaliran. Neophodan je za rad." }, + "scannerImageSplit": { + "title": "Extracted Images", + "submit": "Extract Image Scans", + "error": { + "failed": "An error occurred while extracting image scans." + }, + "tooltip": { + "title": "Photo Splitter", + "whatThisDoes": "What this does", + "whatThisDoesDesc": "Automatically finds and extracts each photo from a scanned page or composite image—no manual cropping.", + "whenToUse": "When to use", + "useCase1": "Scan whole album pages in one go", + "useCase2": "Split flatbed batches into separate files", + "useCase3": "Break collages into individual photos", + "useCase4": "Pull photos from documents", + "quickFixes": "Quick fixes", + "problem1": "Photos not detected → increase Tolerance to 30-50", + "problem2": "Too many false detections → increase Minimum Area to 15,000-20,000", + "problem3": "Crops are too tight → increase Border Size to 5-10", + "problem4": "Tilted photos not straightened → lower Angle Threshold to ~5°", + "problem5": "Dust/noise boxes → increase Minimum Contour Area to 1000-2000", + "setupTips": "Setup tips", + "tip1": "Use a plain, light background", + "tip2": "Leave a small gap (≈1 cm) between photos", + "tip3": "Scan at 300-600 DPI", + "tip4": "Clean the scanner glass", + "headsUp": "Heads-up", + "headsUpDesc": "Overlapping photos or backgrounds very close in colour to the photos can reduce accuracy-try a lighter or darker background and leave more space." + } + }, "sign": { - "tags": "autorizacija,inicijali,crtani-potpis,tekstualni-potpis,slikovni-potpis", "title": "PotpiÅĄi", "header": "PotpiÅĄi PDF fajlove", "upload": "Učitaj sliku", - "draw": "Nacrtaj potpis", - "text": "Tekstualni unos", + "draw": { + "title": "Draw your signature", + "clear": "Clear" + }, + "text": { + "name": "Signer Name", + "placeholder": "Enter your full name" + }, "clear": "ObriÅĄi", "add": "Dodaj", "saved": "Snimljeni potpisi", "save": "Snimi potpis", + "applySignatures": "Apply Signatures", "personalSigs": "Lični potpisi", "sharedSigs": "Deljeni potpisi", "noSavedSigs": "Nema snimljenih potpisa", @@ -1020,42 +2138,179 @@ "previous": "Prethodna strana", "maintainRatio": "Uključi/isključi zadrÅžavanje proporcija", "undo": "PoniÅĄti", - "redo": "Ponovi" + "redo": "Ponovi", + "submit": "Sign Document", + "steps": { + "configure": "Configure Signature" + }, + "type": { + "title": "Signature Type", + "draw": "Draw", + "canvas": "Canvas", + "image": "Image", + "text": "Text" + }, + "image": { + "label": "Upload signature image", + "placeholder": "Select image file", + "hint": "Upload a PNG or JPG image of your signature" + }, + "instructions": { + "title": "How to add signature", + "canvas": "After drawing your signature in the canvas, close the modal then click anywhere on the PDF to place it.", + "image": "After uploading your signature image above, click anywhere on the PDF to place it.", + "text": "After entering your name above, click anywhere on the PDF to place your signature." + }, + "mode": { + "move": "Move Signature", + "place": "Place Signature" + }, + "updateAndPlace": "Update and Place", + "activate": "Activate Signature Placement", + "deactivate": "Stop Placing Signatures", + "results": { + "title": "Signature Results" + }, + "error": { + "failed": "An error occurred while signing the PDF." + }, + "tags": "autorizacija,inicijali,crtani-potpis,tekstualni-potpis,slikovni-potpis" }, "flatten": { - "tags": "statično,deaktivirati,neinteraktivno,usmeriti", "title": "Ravnanje", "header": "Ravnanje PDF fajlova", "flattenOnlyForms": "Izravnaj samo forme", "submit": "Ravnanje", + "filenamePrefix": "flattened", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, "steps": { "settings": "PodeÅĄavanja" }, "options": { - "flattenOnlyForms": "Izravnaj samo forme" - } + "stepTitle": "Flatten Options", + "title": "Flatten Options", + "flattenOnlyForms": { + "label": "Izravnaj samo forme", + "desc": "Only flatten form fields, leaving other interactive elements intact" + }, + "note": "Flattening removes interactive elements from the PDF, making them non-editable." + }, + "results": { + "title": "Flatten Results" + }, + "error": { + "failed": "An error occurred while flattening the PDF." + }, + "tooltip": { + "header": { + "title": "About Flattening PDFs" + }, + "description": { + "title": "What does flattening do?", + "text": "Flattening makes your PDF non-editable by turning fillable forms and buttons into regular text and images. The PDF will look exactly the same, but no one can change or fill in the forms anymore. Perfect for sharing completed forms, creating final documents for records, or ensuring the PDF looks the same everywhere.", + "bullet1": "Text boxes become regular text (can't be edited)", + "bullet2": "Checkboxes and buttons become pictures", + "bullet3": "Great for final versions you don't want changed", + "bullet4": "Ensures consistent appearance across all devices" + }, + "formsOnly": { + "title": "What does 'Flatten only forms' mean?", + "text": "This option only removes the ability to fill in forms, but keeps other features working like clicking links, viewing bookmarks, and reading comments.", + "bullet1": "Forms become non-editable", + "bullet2": "Links still work when clicked", + "bullet3": "Comments and notes remain visible", + "bullet4": "Bookmarks still help you navigate" + } + }, + "tags": "statično,deaktivirati,neinteraktivno,usmeriti" }, "repair": { "tags": "popravi,vrati,korekcija,obnovi", "title": "Popravi", "header": "Popravi PDF fajlove", - "submit": "Popravi" + "submit": "Popravi", + "description": "This tool will attempt to repair corrupted or damaged PDF files. No additional settings are required.", + "filenamePrefix": "repaired", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst repairing the PDF." + }, + "results": { + "title": "Repair Results" + } }, "removeBlanks": { - "tags": "čiÅĄÄ‡enje,usmeriti,ne-sadrÅžaj,organizacija", "title": "Ukloni prazne stranice", "header": "Ukloni prazne stranice", - "threshold": "Prag beline piksela:", + "settings": { + "title": "Settings" + }, + "threshold": { + "label": "Pixel Whiteness Threshold" + }, + "whitePercent": { + "label": "White Percentage Threshold", + "unit": "%" + }, + "includeBlankPages": { + "label": "Include detected blank pages" + }, + "tooltip": { + "header": { + "title": "Remove Blank Pages Settings" + }, + "threshold": { + "title": "Pixel Whiteness Threshold", + "text": "Controls how white a pixel must be to be considered 'white'. This helps determine what counts as a blank area on the page.", + "bullet1": "0 = Pure black (most restrictive)", + "bullet2": "128 = Medium grey", + "bullet3": "255 = Pure white (least restrictive)" + }, + "whitePercent": { + "title": "White Percentage Threshold", + "text": "Sets the minimum percentage of white pixels required for a page to be considered blank and removed.", + "bullet1": "Lower values (e.g., 80%) = More pages removed", + "bullet2": "Higher values (e.g., 95%) = Only very blank pages removed", + "bullet3": "Use higher values for documents with light backgrounds" + }, + "includeBlankPages": { + "title": "Include Detected Blank Pages", + "text": "When enabled, creates a separate PDF containing all the blank pages that were detected and removed from the original document.", + "bullet1": "Useful for reviewing what was removed", + "bullet2": "Helps verify the detection accuracy", + "bullet3": "Can be disabled to reduce output file size" + } + }, + "submit": "Ukloni prazne", + "error": { + "failed": "Failed to remove blank pages" + }, + "results": { + "title": "Removed Blank Pages" + }, + "tags": "čiÅĄÄ‡enje,usmeriti,ne-sadrÅžaj,organizacija", "thresholdDesc": "Prag za određivanje koliko beli piksel mora biti 'beli'. 0 = Crno, 255 čisto belo.", - "whitePercent": "Procenat bele boje (%):", - "whitePercentDesc": "Procenat stranice koji mora biti 'beli' pikseli da bi se uklonili", - "submit": "Ukloni prazne" + "whitePercentDesc": "Procenat stranice koji mora biti 'beli' pikseli da bi se uklonili" }, "removeAnnotations": { "tags": "komentari,isticanje,beleÅĄke,oznake,ukloni", "title": "Ukloni Anotacije", "header": "Ukloni Anotacije", - "submit": "Ukloni" + "submit": "Ukloni", + "settings": { + "title": "Settings" + }, + "info": { + "title": "About Remove Annotations", + "description": "This tool will remove all annotations (comments, highlights, notes, etc.) from your PDF documents." + }, + "error": { + "failed": "An error occurred while removing annotations from the PDF." + } }, "compare": { "tags": "razlikovati,kontrast,izmene,analiza", @@ -1087,6 +2342,142 @@ "certSign": { "tags": "autentifikacija,PEM,P12,zvanično,ÅĄifrovanje", "title": "Potpisivanje Sertifikatom", + "filenamePrefix": "signed", + "signMode": { + "stepTitle": "Sign Mode", + "tooltip": { + "header": { + "title": "About PDF Signatures" + }, + "overview": { + "title": "How signatures work", + "text": "Both modes seal the document (any edits are flagged as tampering) and record who/when/how for auditing. Viewer trust depends on the certificate chain." + }, + "manual": { + "title": "Manual - Bring your certificate", + "text": "Use your own certificate files for brand-aligned identity. Can display Trusted when your CA/chain is recognised.", + "use": "Use for: customer-facing, legal, compliance." + }, + "auto": { + "title": "Auto - Zero-setup, instant system seal", + "text": "Signs with a server self-signed certificate. Same tamper-evident seal and audit trail; typically shows Unverified in viewers.", + "use": "Use when: you need speed and consistent internal identity across reviews and records." + }, + "rule": { + "title": "Rule of thumb", + "text": "Need recipient Trusted status? Manual. Need a fast, tamper-evident seal and audit trail with no setup? Auto." + } + } + }, + "certTypeStep": { + "stepTitle": "Certificate Format" + }, + "certFiles": { + "stepTitle": "Certificate Files" + }, + "appearance": { + "stepTitle": "Signature Appearance", + "tooltip": { + "header": { + "title": "About Signature Appearance" + }, + "invisible": { + "title": "Invisible Signatures", + "text": "The signature is added to the PDF for security but won't be visible when viewing the document. Perfect for legal requirements without changing the document's appearance.", + "bullet1": "Provides security without visual changes", + "bullet2": "Meets legal requirements for digital signing", + "bullet3": "Doesn't affect document layout or design" + }, + "visible": { + "title": "Visible Signatures", + "text": "Shows a signature block on the PDF with your name, date, and optional details. Useful when you want readers to clearly see the document is signed.", + "bullet1": "Shows signer name and date on the document", + "bullet2": "Can include reason and location for signing", + "bullet3": "Choose which page to place the signature", + "bullet4": "Optional logo can be included" + } + }, + "invisible": "Invisible", + "options": { + "title": "Signature Details" + }, + "visible": "Visible" + }, + "sign": { + "submit": "Sign PDF", + "results": "Signed PDF" + }, + "error": { + "failed": "An error occurred whilst processing signatures." + }, + "tooltip": { + "header": { + "title": "About Managing Signatures" + }, + "overview": { + "title": "What can this tool do?", + "text": "This tool lets you check if your PDFs are digitally signed and add new digital signatures. Digital signatures prove who created or approved a document and show if it has been changed since signing.", + "bullet1": "Check existing signatures and their validity", + "bullet2": "View detailed information about signers and certificates", + "bullet3": "Add new digital signatures to secure your documents", + "bullet4": "Multiple files supported with easy navigation" + }, + "validation": { + "title": "Checking Signatures", + "text": "When you check signatures, the tool tells you if they're valid, who signed the document, when it was signed, and whether the document has been changed since signing.", + "bullet1": "Shows if signatures are valid or invalid", + "bullet2": "Displays signer information and signing date", + "bullet3": "Checks if the document was modified after signing", + "bullet4": "Can use custom certificates for verification" + }, + "signing": { + "title": "Adding Signatures", + "text": "To sign a PDF, you need a digital certificate (like PEM, PKCS12, or JKS). You can choose to make the signature visible on the document or keep it invisible for security only.", + "bullet1": "Supports PEM, PKCS12, JKS, and server certificate formats", + "bullet2": "Option to show or hide signature on the PDF", + "bullet3": "Add reason, location, and signer name", + "bullet4": "Choose which page to place visible signatures", + "bullet5": "Use server certificate for simple 'Sign with Stirling-PDF' option" + } + }, + "certType": { + "tooltip": { + "header": { + "title": "About Certificate Types" + }, + "what": { + "title": "What's a certificate?", + "text": "It's a secure ID for your signature that proves you signed. Unless you're required to sign via certificate, we recommend using another secure method like Type, Draw, or Upload." + }, + "which": { + "title": "Which option should I use?", + "text": "Choose the format that matches your certificate file:", + "bullet1": "PKCS#12 (.p12 / .pfx) – one combined file (most common)", + "bullet2": "PFX (.pfx) – Microsoft's version of PKCS12", + "bullet3": "PEM – separate private-key and certificate .pem files", + "bullet4": "JKS – Java .jks keystore for dev / CI-CD workflows" + }, + "convert": { + "title": "Key not listed?", + "text": "Convert your file to a Java keystore (.jks) with keytool, then pick JKS." + } + } + }, + "chooseCertificate": "Choose Certificate File", + "chooseJksFile": "Choose JKS File", + "chooseP12File": "Choose PKCS12 File", + "choosePfxFile": "Choose PFX File", + "choosePrivateKey": "Choose Private Key File", + "location": "Lokacija", + "logoTitle": "Logo", + "name": "Ime", + "noLogo": "No Logo", + "pageNumber": "Page Number", + "password": "Unesite lozinku vaÅĄeg keystore-a ili privatnog ključa (ako je ima):", + "passwordOptional": "Leave empty if no password", + "reason": "Razlog", + "serverCertMessage": "Using server certificate - no files or password required", + "showLogo": "PrikaÅži logo", "header": "PotpiÅĄi PDF sa svojim sertifikatom (Rad u toku)", "selectPDF": "Izaberite PDF fajl za potpisivanje:", "jksNote": "Napomena: Ako tvoj tip sertifikata nije naveden ispod, konvertuj ga u Java Keystore (.jks) format koristeći komandni alat keytool. Zatim izaberi opciju .jks ispod.", @@ -1094,13 +2485,7 @@ "selectCert": "Izaberite svoj sertifikat (X.509 format, moÅže biti .pem ili .der):", "selectP12": "Izaberite svoj PKCS#12 keystore fajl (.p12 ili .pfx) (Opciono, ako je dostupan, trebalo bi da sadrÅži vaÅĄ privatni ključ i sertifikat):", "selectJKS": "Izaberi svoju Java keystore datoteku (.jks or .keystore):", - "certType": "Tip sertifikata", - "password": "Unesite lozinku vaÅĄeg keystore-a ili privatnog ključa (ako je ima):", "showSig": "PrikaÅži potpis", - "reason": "Razlog", - "location": "Lokacija", - "name": "Ime", - "showLogo": "PrikaÅži logo", "submit": "PotpiÅĄi PDF" }, "removeCertSign": { @@ -1108,7 +2493,18 @@ "title": "Ukloni potpis sertifikata", "header": "Ukloni digitalni sertifikat iz PDF-a", "selectPDF": "Izaberi PDF dokument:", - "submit": "Ukloni potpis" + "submit": "Ukloni potpis", + "description": "This tool will remove digital certificate signatures from your PDF document.", + "filenamePrefix": "unsigned", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst removing certificate signatures." + }, + "results": { + "title": "Certificate Removal Results" + } }, "pageLayout": { "tags": "spajanje,kompozit,pojedinačan-prikaz,organizacija", @@ -1116,16 +2512,157 @@ "header": "ViÅĄestruki Raspored Stranica", "pagesPerSheet": "Stranica po listu:", "addBorder": "Dodaj ivice", - "submit": "Potvrdi" + "submit": "Potvrdi", + "desc": { + "2": "Place 2 pages side-by-side on a single sheet.", + "3": "Place 3 pages on a single sheet in a single row.", + "4": "Place 4 pages on a single sheet (2 × 2 grid).", + "9": "Place 9 pages on a single sheet (3 × 3 grid).", + "16": "Place 16 pages on a single sheet (4 × 4 grid)." + }, + "error": { + "failed": "An error occurred while creating the multi-page layout." + } + }, + "bookletImposition": { + "tags": "booklet,imposition,printing,binding,folding,signature", + "title": "Booklet Imposition", + "header": "Booklet Imposition", + "submit": "Create Booklet", + "spineLocation": { + "label": "Spine Location", + "left": "Left (Standard)", + "right": "Right (RTL)" + }, + "doubleSided": { + "label": "Double-sided printing", + "tooltip": "Creates both front and back sides for proper booklet printing" + }, + "manualDuplex": { + "title": "Manual Duplex Mode", + "instructions": "For printers without automatic duplex. You'll need to run this twice:" + }, + "duplexPass": { + "label": "Print Pass", + "first": "1st Pass", + "second": "2nd Pass", + "firstInstructions": "Prints front sides → stack face-down → run again with 2nd Pass", + "secondInstructions": "Load printed stack face-down → prints back sides" + }, + "rtlBinding": { + "label": "Right-to-left binding", + "tooltip": "For Arabic, Hebrew, or other right-to-left languages" + }, + "addBorder": { + "label": "Add borders around pages", + "tooltip": "Adds borders around each page section to help with cutting and alignment" + }, + "addGutter": { + "label": "Add gutter margin", + "tooltip": "Adds inner margin space for binding" + }, + "gutterSize": { + "label": "Gutter size (points)" + }, + "flipOnShortEdge": { + "label": "Flip on short edge (automatic duplex only)", + "tooltip": "Enable for short-edge duplex printing (automatic duplex only - ignored in manual mode)", + "manualNote": "Not needed in manual mode - you flip the stack yourself" + }, + "advanced": { + "toggle": "Advanced Options" + }, + "paperSizeNote": "Paper size is automatically derived from your first page.", + "tooltip": { + "header": { + "title": "Booklet Creation Guide" + }, + "description": { + "title": "What is Booklet Imposition?", + "text": "Creates professional booklets by arranging pages in the correct printing order. Your PDF pages are placed 2-up on landscape sheets so when folded and bound, they read in proper sequence like a real book." + }, + "example": { + "title": "Example: 8-Page Booklet", + "text": "Your 8-page document becomes 2 sheets:", + "bullet1": "Sheet 1 Front: Pages 8, 1 | Back: Pages 2, 7", + "bullet2": "Sheet 2 Front: Pages 6, 3 | Back: Pages 4, 5", + "bullet3": "When folded & stacked: Reads 1→2→3→4→5→6→7→8" + }, + "printing": { + "title": "How to Print & Assemble", + "text": "Follow these steps for perfect booklets:", + "bullet1": "Print double-sided with 'Flip on long edge'", + "bullet2": "Stack sheets in order, fold in half", + "bullet3": "Staple or bind along the folded spine", + "bullet4": "For short-edge printers: Enable 'Flip on short edge' option" + }, + "manualDuplex": { + "title": "Manual Duplex (Single-sided Printers)", + "text": "For printers without automatic duplex:", + "bullet1": "Turn OFF 'Double-sided printing'", + "bullet2": "Select '1st Pass' → Print → Stack face-down", + "bullet3": "Select '2nd Pass' → Load stack → Print backs", + "bullet4": "Fold and assemble as normal" + }, + "advanced": { + "title": "Advanced Options", + "text": "Fine-tune your booklet:", + "bullet1": "Right-to-Left Binding: For Arabic, Hebrew, or RTL languages", + "bullet2": "Borders: Shows cut lines for trimming", + "bullet3": "Gutter Margin: Adds space for binding/stapling", + "bullet4": "Short-edge Flip: Only for automatic duplex printers" + } + }, + "error": { + "failed": "An error occurred while creating the booklet imposition." + } }, "scalePages": { - "tags": "izmena,modifikacija,dimenzija,adaptacija", "title": "Podesi razmeru stranica", "header": "Podesi razmeru stranica", "pageSize": "Veličina stranice dokumenta.", "keepPageSize": "Originalna veličina", "scaleFactor": "Nivo zumiranja (rezanje) stranice.", - "submit": "Potvrdi" + "submit": "Potvrdi", + "tags": "izmena,modifikacija,dimenzija,adaptacija" + }, + "adjustPageScale": { + "tags": "resize,modify,dimension,adapt", + "title": "Adjust Page Scale", + "header": "Adjust Page Scale", + "scaleFactor": { + "label": "Scale Factor" + }, + "pageSize": { + "label": "Target Page Size", + "keep": "Keep Original Size", + "letter": "Letter", + "legal": "Legal" + }, + "submit": "Adjust Page Scale", + "error": { + "failed": "An error occurred while adjusting the page scale." + }, + "tooltip": { + "header": { + "title": "Page Scale Settings Overview" + }, + "description": { + "title": "Description", + "text": "Adjust the size of PDF content and change the page dimensions." + }, + "scaleFactor": { + "title": "Scale Factor", + "text": "Controls how large or small the content appears on the page. Content is scaled and centred - if scaled content is larger than the page size, it may be cropped.", + "bullet1": "1.0 = Original size", + "bullet2": "0.5 = Half size (50% smaller)", + "bullet3": "2.0 = Double size (200% larger, may crop)" + }, + "pageSize": { + "title": "Target Page Size", + "text": "Sets the dimensions of the output PDF pages. 'Keep Original Size' maintains current dimensions, whilst other options resize to standard paper sizes." + } + } }, "add-page-numbers": { "tags": "paginacija,oznaka,organizacija,indeks" @@ -1134,16 +2671,83 @@ "tags": "auto-detekcija,zaglavlje-bazirano,organizacija,preimenovanje", "title": "Automatsko preimenovanje", "header": "Automatsko preimenovanje PDF-a", - "submit": "Automatsko preimenovanje" + "description": "Automatically finds the title from your PDF content and uses it as the filename.", + "submit": "Automatsko preimenovanje", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst auto-renaming the PDF." + }, + "results": { + "title": "Auto-Rename Results" + }, + "tooltip": { + "header": { + "title": "How Auto-Rename Works" + }, + "howItWorks": { + "title": "Smart Renaming", + "text": "Automatically finds the title from your PDF content and uses it as the filename.", + "bullet1": "Looks for text that appears to be a title or heading", + "bullet2": "Creates a clean, valid filename from the detected title", + "bullet3": "Keeps the original name if no suitable title is found" + } + } }, "adjust-contrast": { "tags": "korekcija-boja,podeÅĄavanje,modifikacija,unapredi" }, "crop": { - "tags": "trimovanje,skupljanje,uređivanje,oblikovanje", "title": "Iseci", "header": "Skraćivanje PDF-a", - "submit": "Potvrdi" + "submit": "Potvrdi", + "noFileSelected": "Select a PDF file to begin cropping", + "preview": { + "title": "Crop Area Selection" + }, + "reset": "Reset to full PDF", + "coordinates": { + "title": "Position and Size", + "x": { + "label": "X Position", + "desc": "Left edge (points)" + }, + "y": { + "label": "Y Position", + "desc": "Bottom edge (points)" + }, + "width": { + "label": "Width", + "desc": "Crop width (points)" + }, + "height": { + "label": "Height", + "desc": "Crop height (points)" + } + }, + "error": { + "invalidArea": "Crop area extends beyond PDF boundaries", + "failed": "Failed to crop PDF" + }, + "steps": { + "selectArea": "Select Crop Area" + }, + "tooltip": { + "title": "How to Crop PDFs", + "description": "Select the area to crop from your PDF by dragging and resizing the blue overlay on the thumbnail.", + "drag": "Drag the overlay to move the crop area", + "resize": "Drag the corner and edge handles to resize", + "precision": "Use coordinate inputs for precise positioning" + }, + "results": { + "title": "Crop Results" + }, + "automation": { + "info": "Enter crop coordinates in PDF points. Origin (0,0) is at bottom-left. These values will be applied to all PDFs processed in this automation.", + "reference": "Reference: A4 page is 595.28 × 841.89 points (210mm × 297mm). 1 inch = 72 points." + }, + "tags": "trimovanje,skupljanje,uređivanje,oblikovanje" }, "autoSplitPDF": { "tags": "QR-bazirano,razdvoji,segment-skeniranja,organizacija", @@ -1226,24 +2830,124 @@ "downloadJS": "Preuzmi Javascript", "submit": "PrikaÅži" }, - "autoRedact": { - "tags": "Cenzura,Sakrij,prekrivanje,crna,marker,skriveno", - "title": "Auto Cenzura", - "header": "Auto Cenzura", - "colorLabel": "Boja", - "textsToRedactLabel": "Tekst za cenzurisanje (razdvojeni linijama)", - "textsToRedactPlaceholder": "npr. \\nPoverljivo \\nVrhunski Tajno", - "useRegexLabel": "Koristi Regex", - "wholeWordSearchLabel": "Pretraga celih reči", - "customPaddingLabel": "Dodatni prazan prostor", - "convertPDFToImageLabel": "Konvertuj PDF u PDF-Image (koristi se za uklanjanje teksta iza okvira)", - "submitButton": "Potvrdi" - }, "redact": { "tags": "Redact,Hide,black out,black,marker,hidden,manual", "title": "Manual Redaction", - "header": "Manual Redaction", "submit": "Redaktuj", + "error": { + "failed": "An error occurred while redacting the PDF." + }, + "modeSelector": { + "title": "Redaction Method", + "mode": "Mode", + "automatic": "Automatic", + "automaticDesc": "Redact text based on search terms", + "manual": "Manual", + "manualDesc": "Click and drag to redact specific areas", + "manualComingSoon": "Manual redaction coming soon" + }, + "auto": { + "header": "Auto Redact", + "settings": { + "title": "Redaction Settings", + "advancedTitle": "Napredno" + }, + "colorLabel": "Box Colour", + "wordsToRedact": { + "title": "Words to Redact", + "placeholder": "Enter a word", + "add": "Dodaj", + "examples": "Examples: Confidential, Top-Secret" + }, + "useRegexLabel": "Use Regex", + "wholeWordSearchLabel": "Whole Word Search", + "customPaddingLabel": "Custom Extra Padding", + "convertPDFToImageLabel": "Convert PDF to PDF-Image" + }, + "tooltip": { + "mode": { + "header": { + "title": "Redaction Method" + }, + "automatic": { + "title": "Automatic Redaction", + "text": "Automatically finds and redacts specified text throughout the document. Perfect for removing consistent sensitive information like names, addresses, or confidential markers." + }, + "manual": { + "title": "Manual Redaction", + "text": "Click and drag to manually select specific areas to redact. Gives you precise control over what gets redacted. (Coming soon)" + } + }, + "words": { + "header": { + "title": "Words to Redact" + }, + "description": { + "title": "Text Matching", + "text": "Enter words or phrases to find and redact in your document. Each word will be searched for separately." + }, + "bullet1": "Add one word at a time", + "bullet2": "Press Enter or click 'Add Another' to add", + "bullet3": "Click × to remove words", + "examples": { + "title": "Common Examples", + "text": "Typical words to redact include: bank details, email addresses, or specific names." + } + }, + "advanced": { + "header": { + "title": "Advanced Redaction Settings" + }, + "color": { + "title": "Box Colour & Padding", + "text": "Customise the appearance of redaction boxes. Black is standard, but you can choose any colour. Padding adds extra space around the found text." + }, + "regex": { + "title": "Use Regex", + "text": "Enable regular expressions for advanced pattern matching. Useful for finding phone numbers, emails, or complex patterns.", + "bullet1": "Example: \\d{4}-\\d{2}-\\d{2} to match any dates in YYYY-MM-DD format", + "bullet2": "Use with caution - test thoroughly" + }, + "wholeWord": { + "title": "Whole Word Search", + "text": "Only match complete words, not partial matches. 'John' won't match 'Johnson' when enabled." + }, + "convert": { + "title": "Convert to PDF-Image", + "text": "Converts the PDF to an image-based PDF after redaction. This ensures text behind redaction boxes is completely removed and unrecoverable." + } + } + }, + "manual": { + "header": "Manual Redaction", + "textBasedRedaction": "Text-based Redaction", + "pageBasedRedaction": "Page-based Redaction", + "convertPDFToImageLabel": "Convert PDF to PDF-Image (Used to remove text behind the box)", + "pageRedactionNumbers": { + "title": "Strane", + "placeholder": "(npr. 1,2,8 ili 4,7,12-16 ili 2n-1)" + }, + "redactionColor": { + "title": "Redaction Colour" + }, + "export": "Izvoz", + "upload": "Upload", + "boxRedaction": "Box draw redaction", + "zoom": "Zoom", + "zoomIn": "Zoom in", + "zoomOut": "Zoom out", + "nextPage": "Next Page", + "previousPage": "Previous Page", + "toggleSidebar": "Toggle Sidebar", + "showThumbnails": "Show Thumbnails", + "showDocumentOutline": "Show Document Outline (double-click to expand/collapse all items)", + "showAttachments": "Show Attachments", + "showLayers": "Show Layers (double-click to reset all layers to the default state)", + "colourPicker": "Colour Picker", + "findCurrentOutlineItem": "Find current outline item", + "applyChanges": "Apply Changes" + }, + "header": "Manual Redaction", "textBasedRedaction": "Text based Redaction", "pageBasedRedaction": "Page-based Redaction", "convertPDFToImageLabel": "Convert PDF to PDF-Image (Used to remove text behind the box)", @@ -1269,22 +2973,7 @@ "showLayers": "Show Layers (double-click to reset all layers to the default state)", "colourPicker": "Colour Picker", "findCurrentOutlineItem": "Find current outline item", - "applyChanges": "Apply Changes", - "auto": { - "settings": { - "advancedTitle": "Napredno" - }, - "wordsToRedact": { - "add": "Dodaj" - } - }, - "manual": { - "pageRedactionNumbers": { - "title": "Strane", - "placeholder": "(npr. 1,2,8 ili 4,7,12-16 ili 2n-1)" - }, - "export": "Izvoz" - } + "applyChanges": "Apply Changes" }, "tableExtraxt": { "tags": "CSV,Izdvajanje tabela,izdvajanje,konvertovanje" @@ -1295,11 +2984,15 @@ "overlay-pdfs": { "tags": "Preklapanje", "header": "Preklapanje PDF fajlova", + "title": "Overlay PDFs", + "desc": "Overlay one PDF on top of another", "baseFile": { "label": "Izaberite osnovni PDF fajl" }, "overlayFiles": { - "label": "Izaberite PDF fajlove za preklapanje" + "label": "Izaberite PDF fajlove za preklapanje", + "placeholder": "Choose PDF(s)...", + "addMore": "Add more PDFs..." }, "mode": { "label": "Izaberite reÅžim preklapanja", @@ -1309,14 +3002,53 @@ }, "counts": { "label": "Broj preklapanja (za reÅžim Fixed Repeat)", - "placeholder": "Unesite brojeve odvojene zarezom (npr. 2,3,1)" + "placeholder": "Unesite brojeve odvojene zarezom (npr. 2,3,1)", + "item": "Count for file", + "noFiles": "Add overlay files to configure counts" }, "position": { "label": "Izaberite poziciju preklapanja", "foreground": "Prethodni plan", "background": "Pozadina" }, - "submit": "Potvrdi" + "submit": "Potvrdi", + "settings": { + "title": "Settings" + }, + "results": { + "title": "Overlay Results" + }, + "tooltip": { + "header": { + "title": "Overlay PDFs Overview" + }, + "description": { + "title": "Description", + "text": "Combine a base PDF with one or more overlay PDFs. Overlays can be applied page-by-page in different modes and placed in the foreground or background." + }, + "mode": { + "title": "Overlay Mode", + "text": "Choose how to distribute overlay pages across the base PDF pages.", + "sequential": "Sequential Overlay: Use pages from the first overlay PDF until it ends, then move to the next.", + "interleaved": "Interleaved Overlay: Take one page from each overlay in turn.", + "fixedRepeat": "Fixed Repeat Overlay: Take a set number of pages from each overlay before moving to the next. Use Counts to set the numbers." + }, + "position": { + "title": "Overlay Position", + "text": "Foreground places the overlay on top of the page. Background places it behind." + }, + "overlayFiles": { + "title": "Overlay Files", + "text": "Select one or more PDFs to overlay on the base. The order of these files affects how pages are applied in Sequential and Fixed Repeat modes." + }, + "counts": { + "title": "Counts (Fixed Repeat only)", + "text": "Provide a positive number for each overlay file showing how many pages to take before moving to the next. Required when mode is Fixed Repeat." + } + }, + "error": { + "failed": "An error occurred while overlaying PDFs." + } }, "split-by-sections": { "tags": "Deljenje odeljaka,Deljenje,PodeÅĄavanje", @@ -1337,6 +3069,7 @@ "tags": "Stamp, Add image, center image, Watermark, PDF, Embed, Customize", "header": "Pečatiraj PDF", "title": "Dodavanje pečata u PDF", + "stampSetup": "Stamp Setup", "stampType": "Tip pečeta:", "stampText": "Tekst pečata:", "stampImage": "Slika pečeta:", @@ -1349,7 +3082,19 @@ "overrideY": "Zameni Y koordinatu:", "customMargin": "PodeÅĄavanje margina:", "customColor": "Custom Text Color", - "submit": "PoÅĄalji" + "submit": "PoÅĄalji", + "noStampSelected": "No stamp selected. Return to Step 1.", + "customPosition": "Drag the stamp to the desired location in the preview window.", + "error": { + "failed": "An error occurred while adding stamp to the PDF." + }, + "imageSize": "Image Size", + "margin": "Margin", + "positionAndFormatting": "Position & Formatting", + "quickPosition": "Select a position on the page to place the stamp.", + "results": { + "title": "Stamp Results" + } }, "removeImagePdf": { "tags": "Ukloni sliku, Zahvati na stranici, Bekend,serverska strana" @@ -1367,7 +3112,8 @@ "status": { "_value": "Status", "valid": "Validan", - "invalid": "Invalidan" + "invalid": "Invalidan", + "complete": "Validation complete" }, "signer": "Potpisnik", "date": "Datum", @@ -1394,40 +3140,122 @@ "version": "Verzija", "keyUsage": "Namena ključa", "selfSigned": "Samopotpisan", - "bits": "bitova" + "bits": "bitova", + "details": "Certificate Details" }, "signature": { "info": "Informacije o potpisu", "_value": "Signature", "mathValid": "Potpis je matematički validan ALI:" }, - "selectCustomCert": "Prilagođena X.509 datoteka sertifikata (opciono)" - }, - "replace-color": { - "title": "Replace-Invert-Color", - "header": "Replace-Invert Color PDF", - "selectText": { - "1": "Replace or Invert color Options", - "2": "Default(Default high contrast colors)", - "3": "Custom(Customized colors)", - "4": "Full-Invert(Invert all colors)", - "5": "High contrast color options", - "6": "Beli tekst na crnoj pozadini", - "7": "Crni tekst na beloj pozadini", - "8": "ÅŊuti tekst na crnoj pozadini", - "9": "Zeleni tekst na crnoj pozadini", - "10": "Choose text Color", - "11": "Choose background Color" + "selectCustomCert": "Prilagođena X.509 datoteka sertifikata (opciono)", + "downloadCsv": "Download CSV", + "downloadJson": "Download JSON", + "downloadPdf": "Download PDF Report", + "downloadType": { + "csv": "CSV", + "json": "JSON", + "pdf": "PDF" }, - "submit": "Zameni" + "error": { + "allFailed": "Unable to validate the selected files.", + "partial": "Some files could not be validated.", + "reportGeneration": "Could not generate the PDF report. JSON and CSV are available.", + "unexpected": "Unexpected error during validation." + }, + "finalizing": "Preparing downloads...", + "issue": { + "certExpired": "Certificate expired", + "certRevocationUnknown": "Certificate revocation status unknown", + "certRevoked": "Certificate revoked", + "chainInvalid": "Certificate chain invalid", + "signatureInvalid": "Signature cryptographic check failed", + "trustInvalid": "Certificate not trusted" + }, + "noResults": "Run the validation to generate a report.", + "noSignaturesShort": "No signatures", + "processing": "Validating signatures...", + "report": { + "continued": "Continued", + "downloads": "Downloads", + "entryLabel": "Signature Summary", + "fields": { + "created": "Created", + "fileSize": "File Size", + "signatureCount": "Total Signatures", + "signatureDate": "Signature Date" + }, + "filesEvaluated": "{{count}} files evaluated", + "footer": "Validated via Stirling PDF", + "generatedAt": "Generated", + "noPdf": "PDF report will be available after a successful validation.", + "page": "Page", + "shortTitle": "Signature Summary", + "signatureCountLabel": "{{count}} signatures", + "signaturesFound": "{{count}} signatures detected", + "signaturesValid": "{{count}} fully valid", + "title": "Signature Validation Report" + }, + "settings": { + "certHint": "Upload a trusted X.509 certificate to validate against a custom trust source.", + "title": "Validation Settings" + }, + "signatureDate": "Signature Date", + "totalSignatures": "Total Signatures" }, - "replaceColorPdf": { - "tags": "Replace Color,Page operations,Back end,server side" + "replaceColor": { + "tags": "Replace Colour,Page operations,Back end,server side", + "labels": { + "settings": "Settings", + "colourOperation": "Colour operation" + }, + "options": { + "highContrast": "High contrast", + "invertAll": "Invert all colours", + "custom": "Custom", + "cmyk": "Convert to CMYK" + }, + "tooltip": { + "header": { + "title": "Replace & Invert Colour Settings Overview" + }, + "description": { + "title": "Description", + "text": "Transform PDF colours to improve readability and accessibility. Choose from high contrast presets, invert all colours, or create custom colour schemes." + }, + "highContrast": { + "title": "High Contrast", + "text": "Apply predefined high contrast colour combinations designed for better readability and accessibility compliance.", + "bullet1": "White text on black background - Classic dark mode", + "bullet2": "Black text on white background - Standard high contrast", + "bullet3": "Yellow text on black background - High visibility option", + "bullet4": "Green text on black background - Alternative high contrast" + }, + "invertAll": { + "title": "Invert All Colours", + "text": "Completely invert all colours in the PDF, creating a negative-like effect. Useful for creating dark mode versions of documents or reducing eye strain in low-light conditions." + }, + "custom": { + "title": "Custom Colours", + "text": "Define your own text and background colours using the colour pickers. Perfect for creating branded documents or specific accessibility requirements.", + "bullet1": "Text colour - Choose the colour for text elements", + "bullet2": "Background colour - Set the background colour for the document" + }, + "cmyk": { + "title": "Convert to CMYK", + "text": "Convert the PDF from RGB colour space to CMYK colour space, optimized for professional printing. This process converts colours to the Cyan, Magenta, Yellow, Black model used by printers." + } + }, + "error": { + "failed": "An error occurred while processing the colour replacement." + } }, "login": { "title": "Prijavite se", "header": "Prijavite se", "signin": "Prijavite se", + "signInWith": "Sign in with", + "signInAnonymously": "Sign Up as a Guest", "rememberme": "Zapamti me", "invalid": "Neispravno korisničko ime ili lozinka.", "locked": "VaÅĄ nalog je zaključan.", @@ -1446,12 +3274,83 @@ "alreadyLoggedIn": "Već si prijavljen na", "alreadyLoggedIn2": "uređaja. Odjavi se sa uređaja i pokuÅĄaj ponovo.", "toManySessions": "ImaÅĄ previÅĄe aktivnih sesija", - "logoutMessage": "Odjavljen si." + "logoutMessage": "Odjavljen si.", + "youAreLoggedIn": "You are logged in!", + "email": "Email", + "password": "Password", + "enterEmail": "Enter your email", + "enterPassword": "Enter your password", + "loggingIn": "Logging In...", + "username": "Username", + "enterUsername": "Enter username", + "useEmailInstead": "Login with email", + "forgotPassword": "Forgot your password?", + "logIn": "Log In", + "signingIn": "Signing in...", + "login": "Login", + "or": "Or", + "useMagicLink": "Use magic link instead", + "enterEmailForMagicLink": "Enter your email for magic link", + "sending": "Sendingâ€Ļ", + "sendMagicLink": "Send Magic Link", + "cancel": "Cancel", + "dontHaveAccount": "Don't have an account? Sign up", + "home": "Home", + "debug": "Debug", + "signOut": "Sign Out", + "pleaseEnterBoth": "Please enter both email and password", + "pleaseEnterEmail": "Please enter your email address", + "magicLinkSent": "Magic link sent to {{email}}! Check your email and click the link to sign in.", + "passwordResetSent": "Password reset link sent to {{email}}! Check your email and follow the instructions.", + "failedToSignIn": "Failed to sign in with {{provider}}: {{message}}", + "unexpectedError": "Unexpected error: {{message}}", + "accountCreatedSuccess": "Account created successfully! You can now sign in.", + "passwordChangedSuccess": "Password changed successfully! Please sign in with your new password.", + "credentialsUpdated": "Your credentials have been updated. Please sign in again." + }, + "signup": { + "title": "Create an account", + "subtitle": "Join Stirling PDF to get started", + "name": "Name", + "email": "Email", + "password": "Password", + "confirmPassword": "Confirm password", + "enterName": "Enter your name", + "enterEmail": "Enter your email", + "enterPassword": "Enter your password", + "confirmPasswordPlaceholder": "Confirm password", + "or": "or", + "creatingAccount": "Creating Account...", + "signUp": "Sign Up", + "alreadyHaveAccount": "Already have an account? Sign in", + "pleaseFillAllFields": "Please fill in all fields", + "passwordsDoNotMatch": "Passwords do not match", + "passwordTooShort": "Password must be at least 6 characters long", + "invalidEmail": "Please enter a valid email address", + "checkEmailConfirmation": "Check your email for a confirmation link to complete your registration.", + "accountCreatedSuccessfully": "Account created successfully! You can now sign in.", + "unexpectedError": "Unexpected error: {{message}}", + "useEmailInstead": "Use Email Instead", + "nameRequired": "Name is required", + "emailRequired": "Email is required", + "passwordRequired": "Password is required", + "confirmPasswordRequired": "Please confirm your password" }, "pdfToSinglePage": { "title": "PDF u Jednu Stranicu", "header": "PDF u Jednu Stranicu", - "submit": "Konvertuj u Jednu Stranicu" + "submit": "Konvertuj u Jednu Stranicu", + "description": "This tool will merge all pages of your PDF into one large single page. The width will remain the same as the original pages, but the height will be the sum of all page heights.", + "filenamePrefix": "single_page", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst converting to single page." + }, + "results": { + "title": "Single Page Results" + } }, "pageExtracter": { "title": "Izdvajanje stranica", @@ -1475,18 +3374,59 @@ "adjustContrast": { "title": "Podesi Kontrast", "header": "Podesi Kontrast", + "basic": "Basic Adjustments", "contrast": "Kontrast:", "brightness": "Osvetljenje:", "saturation": "Zasićenje:", - "download": "Preuzmi" + "download": "Preuzmi", + "adjustColors": "Adjust Colors", + "blue": "Blue", + "confirm": "Confirm", + "error": { + "failed": "Failed to adjust colors/contrast" + }, + "green": "Green", + "noPreview": "Select a PDF to preview", + "red": "Red", + "results": { + "title": "Adjusted PDF" + } }, "compress": { "title": "Kompresija", + "desc": "Compress PDFs to reduce their file size.", "header": "Kompresuj PDF", + "method": { + "title": "Compression Method", + "quality": "Quality", + "filesize": "Veličina datoteke" + }, "credit": "Ova usluga koristi qpdf za kompresiju / optimizaciju PDF-a.", "grayscale": { "label": "Primeni sivinu za kompresiju" }, + "tooltip": { + "header": { + "title": "Compress Settings Overview" + }, + "description": { + "title": "Description", + "text": "Compression is an easy way to reduce your file size. Pick File Size to enter a target size and have us adjust quality for you. Pick Quality to set compression strength manually." + }, + "qualityAdjustment": { + "title": "Quality Adjustment", + "text": "Drag the slider to adjust the compression strength. Lower values (1-3) preserve quality but result in larger files. Higher values (7-9) shrink the file more but reduce image clarity.", + "bullet1": "Lower values preserve quality", + "bullet2": "Higher values reduce file size" + }, + "grayscale": { + "title": "Grayscale", + "text": "Select this option to convert all images to black and white, which can significantly reduce file size especially for scanned PDFs or image-heavy documents." + } + }, + "error": { + "failed": "An error occurred while compressing the PDF." + }, "selectText": { "1": { "_value": "Compression Settings", @@ -1496,10 +3436,7 @@ "4": "Automatski reÅžim - Automatski prilagođava kvalitet kako bi PDF bio tačne veličine", "5": "Očekivana veličina PDF-a (npr. 25MB, 10.8MB, 25KB)" }, - "submit": "Kompresuj", - "method": { - "filesize": "Veličina datoteke" - } + "submit": "Kompresuj" }, "decrypt": { "passwordPrompt": "Ova datoteka je zaÅĄtićena lozinkom. Unesi lozinku:", @@ -1600,7 +3537,13 @@ "title": "Ukloni sliku", "header": "Ukloni sliku", "removeImage": "Ukloni sliku", - "submit": "Ukloni sliku" + "submit": "Ukloni sliku", + "error": { + "failed": "Failed to remove images from the PDF." + }, + "results": { + "title": "Remove Images Results" + } }, "splitByChapters": { "title": "Podeli PDF po poglavljima", @@ -1634,6 +3577,12 @@ }, "note": "BeleÅĄke o izdanju su dostupne samo na engleskom jeziku" }, + "swagger": { + "title": "API Documentation", + "header": "API Documentation", + "desc": "View and test the Stirling PDF API endpoints", + "tags": "api,documentation,swagger,endpoints,development" + }, "cookieBanner": { "popUp": { "title": "Kako koristimo kolačiće", @@ -1669,54 +3618,943 @@ "title": "Analitika", "description": "Ovi kolačići nam pomaÅžu da razumemo kako se naÅĄi alati koriste, kako bismo mogli da se fokusiramo na razvoj funkcija koje naÅĄa zajednica najviÅĄe ceni. Budite sigurni — Stirling PDF ne moÅže i nikada neće pratiti sadrÅžaj dokumenata sa kojima radite." } + }, + "services": { + "posthog": "PostHog Analytics", + "scarf": "Scarf Pixel" } }, - "download": "Preuzmi", - "undo": "PoniÅĄti", - "convert": { - "title": "Konvertuj", - "settings": "PodeÅĄavanja", - "color": "Boja", - "greyscale": "Monohromatski", - "fillPage": "Popuni stranicu", - "pdfaDigitalSignatureWarning": "PDF sadrÅži digitalni potpis. Biće uklonjen u sledećem koraku.", - "grayscale": "Monohromatski" + "removeMetadata": { + "submit": "Remove Metadata" }, - "attachments": { - "tags": "uključi,dodaj,datoteka,prilog,prilozi", - "title": "Dodaj priloge", - "header": "Dodaj priloge", - "submit": "Dodaj priloge" + "sidebar": { + "toggle": "Toggle Sidebar" + }, + "theme": { + "toggle": "Toggle Theme" + }, + "view": { + "viewer": "Viewer", + "pageEditor": "Page Editor", + "fileManager": "File Manager" + }, + "pageEditor": { + "title": "Page Editor", + "save": "Save Changes", + "noPdfLoaded": "No PDF loaded. Please upload a PDF to edit.", + "rotatedLeft": "Rotated left:", + "rotatedRight": "Rotated right:", + "deleted": "Deleted:", + "movedLeft": "Moved left:", + "movedRight": "Moved right:", + "splitAt": "Split at:", + "insertedPageBreak": "Inserted page break at:", + "addFileNotImplemented": "Add file not implemented in demo", + "closePdf": "Close PDF", + "reset": "Reset Changes", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "fitToWidth": "Fit to Width", + "actualSize": "Actual Size" + }, + "viewer": { + "firstPage": "First Page", + "lastPage": "Last Page", + "previousPage": "Previous Page", + "nextPage": "Next Page", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "singlePageView": "Single Page View", + "dualPageView": "Dual Page View" }, "rightRail": { + "closeSelected": "Close Selected Files", "selectAll": "Izaberi sve", - "deselectAll": "PoniÅĄti sve" + "deselectAll": "PoniÅĄti sve", + "selectByNumber": "Select by Page Numbers", + "deleteSelected": "Delete Selected Pages", + "closePdf": "Close PDF", + "exportAll": "Export PDF", + "downloadSelected": "Download Selected Files", + "downloadAll": "Download All", + "toggleTheme": "Toggle Theme", + "language": "Language", + "search": "Search PDF", + "panMode": "Pan Mode", + "rotateLeft": "Rotate Left", + "rotateRight": "Rotate Right", + "toggleSidebar": "Toggle Sidebar", + "exportSelected": "Export Selected Pages", + "toggleAnnotations": "Toggle Annotations Visibility", + "annotationMode": "Toggle Annotation Mode", + "draw": "Draw", + "save": "Save" + }, + "search": { + "title": "Search PDF", + "placeholder": "Enter search term...", + "noResults": "No results found", + "searching": "Searching..." + }, + "guestBanner": { + "title": "You're using Stirling PDF as a guest!", + "message": "Create a free account to save your work, access more features, and support the project.", + "dismiss": "Dismiss banner", + "signUp": "Sign Up Free" + }, + "toolPicker": { + "searchPlaceholder": "Search tools...", + "noToolsFound": "No tools found", + "allTools": "ALL TOOLS", + "quickAccess": "QUICK ACCESS", + "categories": { + "standardTools": "Standard Tools", + "advancedTools": "Advanced Tools", + "recommendedTools": "Recommended Tools" + }, + "subcategories": { + "signing": "Signing", + "documentSecurity": "Document Security", + "verification": "Verification", + "documentReview": "Document Review", + "pageFormatting": "Page Formatting", + "extraction": "Extraction", + "removal": "Removal", + "automation": "Automation", + "general": "General", + "advancedFormatting": "Advanced Formatting", + "developerTools": "Developer Tools" + } }, "quickAccess": { - "sign": "Potpis" + "read": "Read", + "sign": "Potpis", + "automate": "Automate", + "files": "Files", + "activity": "Activity", + "help": "Help", + "account": "Account", + "config": "Config", + "adminSettings": "Admin Settings", + "allTools": "All Tools" + }, + "admin": { + "error": "Error", + "success": "Success", + "expand": "Expand", + "close": "Close", + "status": { + "active": "Active", + "inactive": "Inactive" + }, + "settings": { + "title": "Admin Settings", + "workspace": "Workspace", + "fetchError": "Failed to load settings", + "saveError": "Failed to save settings", + "saved": "Settings saved successfully", + "saveSuccess": "Settings saved successfully", + "save": "Save Changes", + "restartRequired": "Restart Required", + "restart": { + "title": "Restart Required", + "message": "Settings have been saved successfully. A server restart is required for the changes to take effect.", + "question": "Would you like to restart the server now or later?", + "now": "Restart Now", + "later": "Restart Later" + }, + "restarting": "Restarting Server", + "restartingMessage": "The server is restarting. Please wait a moment...", + "restartError": "Failed to restart server. Please restart manually.", + "general": { + "title": "System Settings", + "description": "Configure system-wide application settings including branding and default behaviour.", + "ui": "User Interface", + "system": "System", + "appName": { + "label": "Application Name", + "description": "The name displayed in the browser tab and home page" + }, + "appNameNavbar": { + "label": "Navbar Brand", + "description": "The name displayed in the navigation bar" + }, + "homeDescription": { + "label": "Home Description", + "description": "The description text shown on the home page" + }, + "defaultLocale": { + "label": "Default Locale", + "description": "The default language for new users (e.g., en_US, es_ES)" + }, + "fileUploadLimit": { + "label": "File Upload Limit", + "description": "Maximum file upload size (e.g., 100MB, 1GB)" + }, + "showUpdate": { + "label": "Show Update Notifications", + "description": "Display notifications when a new version is available" + }, + "showUpdateOnlyAdmin": { + "label": "Show Updates to Admins Only", + "description": "Restrict update notifications to admin users only" + }, + "customHTMLFiles": { + "label": "Custom HTML Files", + "description": "Allow serving custom HTML files from the customFiles directory" + }, + "languages": { + "label": "Available Languages", + "description": "Languages that users can select from (leave empty to enable all languages)" + }, + "customMetadata": { + "label": "Custom Metadata", + "autoUpdate": { + "label": "Auto Update Metadata", + "description": "Automatically update PDF metadata on all processed documents" + }, + "author": { + "label": "Default Author", + "description": "Default author for PDF metadata (e.g., username)" + }, + "creator": { + "label": "Default Creator", + "description": "Default creator for PDF metadata" + }, + "producer": { + "label": "Default Producer", + "description": "Default producer for PDF metadata" + } + }, + "customPaths": { + "label": "Custom Paths", + "description": "Configure custom file system paths for pipeline processing and external tools", + "pipeline": { + "label": "Pipeline Directories", + "watchedFoldersDir": { + "label": "Watched Folders Directory", + "description": "Directory where pipeline monitors for incoming PDFs (leave empty for default: /pipeline/watchedFolders)" + }, + "finishedFoldersDir": { + "label": "Finished Folders Directory", + "description": "Directory where processed PDFs are outputted (leave empty for default: /pipeline/finishedFolders)" + } + }, + "operations": { + "label": "External Tool Paths", + "weasyprint": { + "label": "WeasyPrint Executable", + "description": "Path to WeasyPrint executable for HTML to PDF conversion (leave empty for default: /opt/venv/bin/weasyprint)" + }, + "unoconvert": { + "label": "Unoconvert Executable", + "description": "Path to LibreOffice unoconvert for document conversions (leave empty for default: /opt/venv/bin/unoconvert)" + } + } + } + }, + "security": { + "title": "Security", + "description": "Configure authentication, login behaviour, and security policies.", + "ssoNotice": { + "title": "Looking for SSO/SAML settings?", + "message": "OAuth2 and SAML2 authentication providers have been moved to the Connections menu for easier management." + }, + "authentication": "Authentication", + "enableLogin": { + "label": "Enable Login", + "description": "Require users to log in before accessing the application" + }, + "loginMethod": { + "label": "Login Method", + "description": "The authentication method to use for user login", + "all": "All Methods", + "normal": "Username/Password Only", + "oauth2": "OAuth2 Only", + "saml2": "SAML2 Only" + }, + "loginAttemptCount": { + "label": "Login Attempt Limit", + "description": "Maximum number of failed login attempts before account lockout" + }, + "loginResetTimeMinutes": { + "label": "Login Reset Time (minutes)", + "description": "Time before failed login attempts are reset" + }, + "csrfDisabled": { + "label": "Disable CSRF Protection", + "description": "Disable Cross-Site Request Forgery protection (not recommended)" + }, + "initialLogin": { + "label": "Initial Login", + "username": { + "label": "Initial Username", + "description": "The username for the initial admin account" + }, + "password": { + "label": "Initial Password", + "description": "The password for the initial admin account" + } + }, + "jwt": { + "label": "JWT Configuration", + "secureCookie": { + "label": "Secure Cookie", + "description": "Require HTTPS for JWT cookies (recommended for production)" + }, + "keyRetentionDays": { + "label": "Key Retention Days", + "description": "Number of days to retain old JWT keys for verification" + }, + "persistence": { + "label": "Enable Key Persistence", + "description": "Store JWT keys persistently to survive server restarts" + }, + "enableKeyRotation": { + "label": "Enable Key Rotation", + "description": "Automatically rotate JWT signing keys periodically" + }, + "enableKeyCleanup": { + "label": "Enable Key Cleanup", + "description": "Automatically remove expired JWT keys" + } + }, + "audit": { + "label": "Audit Logging", + "enabled": { + "label": "Enable Audit Logging", + "description": "Track user actions and system events for compliance and security monitoring" + }, + "level": { + "label": "Audit Level", + "description": "0=OFF, 1=BASIC, 2=STANDARD, 3=VERBOSE" + }, + "retentionDays": { + "label": "Audit Retention (days)", + "description": "Number of days to retain audit logs" + } + }, + "htmlUrlSecurity": { + "label": "HTML URL Security", + "description": "Configure URL access restrictions for HTML processing to prevent SSRF attacks", + "enabled": { + "label": "Enable URL Security", + "description": "Enable URL security restrictions for HTML to PDF conversions" + }, + "level": { + "label": "Security Level", + "description": "MAX: whitelist only, MEDIUM: block internal networks, OFF: no restrictions", + "max": "Maximum (Whitelist Only)", + "medium": "Medium (Block Internal)", + "off": "Off (No Restrictions)" + }, + "advanced": "Advanced Settings", + "allowedDomains": { + "label": "Allowed Domains (Whitelist)", + "description": "One domain per line (e.g., cdn.example.com). Only these domains allowed when level is MAX" + }, + "blockedDomains": { + "label": "Blocked Domains (Blacklist)", + "description": "One domain per line (e.g., malicious.com). Additional domains to block" + }, + "internalTlds": { + "label": "Internal TLDs", + "description": "One TLD per line (e.g., .local, .internal). Block domains with these TLD patterns" + }, + "networkBlocking": "Network Blocking", + "blockPrivateNetworks": { + "label": "Block Private Networks", + "description": "Block RFC 1918 private networks (10.x.x.x, 192.168.x.x, 172.16-31.x.x)" + }, + "blockLocalhost": { + "label": "Block Localhost", + "description": "Block localhost and loopback addresses (127.x.x.x, ::1)" + }, + "blockLinkLocal": { + "label": "Block Link-Local Addresses", + "description": "Block link-local addresses (169.254.x.x, fe80::/10)" + }, + "blockCloudMetadata": { + "label": "Block Cloud Metadata Endpoints", + "description": "Block cloud provider metadata endpoints (169.254.169.254)" + } + } + }, + "connections": { + "title": "Connections", + "description": "Configure external authentication providers like OAuth2 and SAML.", + "linkedServices": "Linked Services", + "unlinkedServices": "Unlinked Services", + "connect": "Connect", + "disconnect": "Disconnect", + "disconnected": "Provider disconnected successfully", + "disconnectError": "Failed to disconnect provider", + "ssoAutoLogin": { + "label": "SSO Auto Login", + "enable": "Enable SSO Auto Login", + "description": "Automatically redirect to SSO login when authentication is required" + }, + "oauth2": { + "label": "OAuth2", + "enabled": { + "label": "Enable OAuth2", + "description": "Allow users to authenticate using OAuth2 providers" + }, + "provider": { + "label": "Provider", + "description": "The OAuth2 provider to use for authentication" + }, + "issuer": { + "label": "Issuer URL", + "description": "The OAuth2 provider issuer URL" + }, + "clientId": { + "label": "Client ID", + "description": "The OAuth2 client ID from your provider" + }, + "clientSecret": { + "label": "Client Secret", + "description": "The OAuth2 client secret from your provider" + }, + "useAsUsername": { + "label": "Use as Username", + "description": "The OAuth2 claim to use as the username (e.g., email, sub)" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first OAuth2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via OAuth2" + }, + "scopes": { + "label": "OAuth2 Scopes", + "description": "Comma-separated list of OAuth2 scopes to request (e.g., openid, profile, email)" + } + }, + "saml2": { + "label": "SAML2", + "enabled": { + "label": "Enable SAML2", + "description": "Allow users to authenticate using SAML2 providers" + }, + "provider": { + "label": "Provider", + "description": "The SAML2 provider name" + }, + "registrationId": { + "label": "Registration ID", + "description": "The SAML2 registration identifier" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first SAML2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via SAML2" + } + } + }, + "database": { + "title": "Database", + "description": "Configure custom database connection settings for enterprise deployments.", + "configuration": "Database Configuration", + "enableCustom": { + "label": "Enable Custom Database", + "description": "Use your own custom database configuration instead of the default embedded database" + }, + "customUrl": { + "label": "Custom Database URL", + "description": "Full JDBC connection string (e.g., jdbc:postgresql://localhost:5432/postgres). If provided, individual connection settings below are not used." + }, + "type": { + "label": "Database Type", + "description": "Type of database (not used if custom URL is provided)" + }, + "hostName": { + "label": "Host Name", + "description": "Database server hostname (not used if custom URL is provided)" + }, + "port": { + "label": "Port", + "description": "Database server port (not used if custom URL is provided)" + }, + "name": { + "label": "Database Name", + "description": "Name of the database (not used if custom URL is provided)" + }, + "username": { + "label": "Username", + "description": "Database authentication username" + }, + "password": { + "label": "Password", + "description": "Database authentication password" + } + }, + "privacy": { + "title": "Privacy", + "description": "Configure privacy and data collection settings.", + "analytics": "Analytics & Tracking", + "enableAnalytics": { + "label": "Enable Analytics", + "description": "Collect anonymous usage analytics to help improve the application" + }, + "metricsEnabled": { + "label": "Enable Metrics", + "description": "Enable collection of performance and usage metrics. Provides API endpoint for admins to access metrics data" + }, + "searchEngine": "Search Engine Visibility", + "googleVisibility": { + "label": "Google Visibility", + "description": "Allow search engines to index this application" + } + }, + "advanced": { + "title": "Advanced", + "description": "Configure advanced features and experimental functionality.", + "features": "Feature Flags", + "processing": "Processing", + "endpoints": { + "label": "Endpoints", + "manage": "Manage API Endpoints", + "description": "Endpoint management is configured via YAML. See documentation for details on enabling/disabling specific endpoints." + }, + "enableAlphaFunctionality": { + "label": "Enable Alpha Features", + "description": "Enable experimental and alpha-stage features (may be unstable)" + }, + "enableUrlToPDF": { + "label": "Enable URL to PDF", + "description": "Allow conversion of web pages to PDF documents" + }, + "maxDPI": { + "label": "Maximum DPI", + "description": "Maximum DPI for image processing (0 = unlimited)" + }, + "tessdataDir": { + "label": "Tessdata Directory", + "description": "Path to the tessdata directory for OCR language files" + }, + "disableSanitize": { + "label": "Disable HTML Sanitization", + "description": "WARNING: Security risk - disabling HTML sanitization can lead to XSS vulnerabilities" + }, + "tempFileManagement": { + "label": "Temp File Management", + "description": "Configure temporary file storage and cleanup behavior", + "baseTmpDir": { + "label": "Base Temp Directory", + "description": "Base directory for temporary files (leave empty for default: java.io.tmpdir/stirling-pdf)" + }, + "libreofficeDir": { + "label": "LibreOffice Temp Directory", + "description": "Directory for LibreOffice temp files (leave empty for default: baseTmpDir/libreoffice)" + }, + "systemTempDir": { + "label": "System Temp Directory", + "description": "System temp directory to clean (only used if cleanupSystemTemp is enabled)" + }, + "prefix": { + "label": "Temp File Prefix", + "description": "Prefix for temp file names" + }, + "maxAgeHours": { + "label": "Max Age (hours)", + "description": "Maximum age in hours before temp files are cleaned up" + }, + "cleanupIntervalMinutes": { + "label": "Cleanup Interval (minutes)", + "description": "How often to run cleanup (in minutes)" + }, + "startupCleanup": { + "label": "Startup Cleanup", + "description": "Clean up old temp files on application startup" + }, + "cleanupSystemTemp": { + "label": "Cleanup System Temp", + "description": "Whether to clean broader system temp directory (use with caution)" + } + }, + "processExecutor": { + "label": "Process Executor Limits", + "description": "Configure session limits and timeouts for each process executor", + "sessionLimit": { + "label": "Session Limit", + "description": "Maximum concurrent instances" + }, + "timeout": { + "label": "Timeout (minutes)", + "description": "Maximum execution time" + }, + "libreOffice": "LibreOffice", + "pdfToHtml": "PDF to HTML", + "qpdf": "QPDF", + "tesseract": "Tesseract OCR", + "pythonOpenCv": "Python OpenCV", + "weasyPrint": "WeasyPrint", + "installApp": "Install App", + "calibre": "Calibre", + "ghostscript": "Ghostscript", + "ocrMyPdf": "OCRmyPDF" + } + }, + "mail": { + "title": "Mail Server", + "description": "Configure SMTP settings for sending email notifications.", + "smtp": "SMTP Configuration", + "enabled": { + "label": "Enable Mail", + "description": "Enable email notifications and SMTP functionality" + }, + "host": { + "label": "SMTP Host", + "description": "The hostname or IP address of your SMTP server" + }, + "port": { + "label": "SMTP Port", + "description": "The port number for SMTP connection (typically 25, 465, or 587)" + }, + "username": { + "label": "SMTP Username", + "description": "Username for SMTP authentication" + }, + "password": { + "label": "SMTP Password", + "description": "Password for SMTP authentication" + }, + "from": { + "label": "From Address", + "description": "The email address to use as the sender" + }, + "enableInvites": { + "label": "Enable Email Invites", + "description": "Allow admins to invite users via email with auto-generated passwords" + }, + "frontendUrl": { + "label": "Frontend URL", + "description": "Base URL for frontend (e.g. https://pdf.example.com). Used for generating invite links in emails. Leave empty to use backend URL." + } + }, + "legal": { + "title": "Legal Documents", + "description": "Configure links to legal documents and policies.", + "disclaimer": { + "title": "Legal Responsibility Warning", + "message": "By customizing these legal documents, you assume full responsibility for ensuring compliance with all applicable laws and regulations, including but not limited to GDPR and other EU data protection requirements. Only modify these settings if: (1) you are operating a personal/private instance, (2) you are outside EU jurisdiction and understand your local legal obligations, or (3) you have obtained proper legal counsel and accept sole responsibility for all user data and legal compliance. Stirling-PDF and its developers assume no liability for your legal obligations." + }, + "termsAndConditions": { + "label": "Terms and Conditions", + "description": "URL or filename to terms and conditions" + }, + "privacyPolicy": { + "label": "Privacy Policy", + "description": "URL or filename to privacy policy" + }, + "accessibilityStatement": { + "label": "Accessibility Statement", + "description": "URL or filename to accessibility statement" + }, + "cookiePolicy": { + "label": "Cookie Policy", + "description": "URL or filename to cookie policy" + }, + "impressum": { + "label": "Impressum", + "description": "URL or filename to impressum (required in some jurisdictions)" + } + }, + "premium": { + "title": "Premium & Enterprise", + "description": "Configure your premium or enterprise license key.", + "license": "License Configuration", + "key": { + "label": "License Key", + "description": "Enter your premium or enterprise license key" + }, + "enabled": { + "label": "Enable Premium Features", + "description": "Enable license key checks for pro/enterprise features" + }, + "movedFeatures": { + "title": "Premium Features Distributed", + "message": "Premium and Enterprise features are now organized in their respective sections:" + } + }, + "features": { + "title": "Features", + "description": "Configure optional features and functionality.", + "serverCertificate": { + "label": "Server Certificate", + "description": "Configure server-side certificate generation for \"Sign with Stirling-PDF\" functionality", + "enabled": { + "label": "Enable Server Certificate", + "description": "Enable server-side certificate for \"Sign with Stirling-PDF\" option" + }, + "organizationName": { + "label": "Organization Name", + "description": "Organization name for generated certificates" + }, + "validity": { + "label": "Certificate Validity (days)", + "description": "Number of days the certificate will be valid" + }, + "regenerateOnStartup": { + "label": "Regenerate on Startup", + "description": "Generate new certificate on each application startup" + } + } + }, + "endpoints": { + "title": "API Endpoints", + "description": "Control which API endpoints and endpoint groups are available.", + "management": "Endpoint Management", + "toRemove": { + "label": "Disabled Endpoints", + "description": "Select individual endpoints to disable" + }, + "groupsToRemove": { + "label": "Disabled Endpoint Groups", + "description": "Select endpoint groups to disable" + }, + "note": "Note: Disabling endpoints restricts API access but does not remove UI components. Restart required for changes to take effect." + } + } }, "fileUpload": { + "selectFile": "Select a file", + "selectFiles": "Select files", + "selectPdfToView": "Select a PDF to view", + "selectPdfToEdit": "Select a PDF to edit", + "chooseFromStorage": "Choose a file from storage or upload a new PDF", + "chooseFromStorageMultiple": "Choose files from storage or upload new PDFs", + "loadFromStorage": "Load from Storage", + "filesAvailable": "files available", "loading": "Učitavam...", - "or": "ili" + "or": "ili", + "dropFileHere": "Drop file here or click to upload", + "dropFilesHere": "Drop files here or click the upload button", + "pdfFilesOnly": "PDF files only", + "supportedFileTypes": "Supported file types", + "upload": "Upload", + "uploadFile": "Upload File", + "uploadFiles": "Upload Files", + "noFilesInStorage": "No files available in storage. Upload some files first.", + "selectFromStorage": "Select from Storage", + "backToTools": "Back to Tools", + "addFiles": "Add Files", + "dragFilesInOrClick": "Drag files in or click \"Add Files\" to browse" + }, + "fileEditor": { + "addFiles": "Add Files" }, "fileManager": { + "title": "Upload PDF Files", + "subtitle": "Add files to your storage for easy access across tools", + "filesSelected": "files selected", + "clearSelection": "Clear Selection", + "openInFileEditor": "Open in File Editor", + "uploadError": "Failed to upload some files.", + "failedToOpen": "Failed to open file. It may have been removed from storage.", + "failedToLoad": "Failed to load file to active set.", + "storageCleared": "Browser cleared storage. Files have been removed. Please re-upload.", + "clearAll": "Clear All", + "reloadFiles": "Reload Files", + "dragDrop": "Drag & Drop files here", + "clickToUpload": "Click to upload files", + "selectedFiles": "Selected Files", + "storage": "Storage", + "filesStored": "files stored", + "storageError": "Storage error occurred", + "storageLow": "Storage is running low. Consider removing old files.", + "supportMessage": "Powered by browser database storage for unlimited capacity", + "noFileSelected": "No files selected", + "showHistory": "Show History", + "hideHistory": "Hide History", + "fileHistory": "File History", + "loadingHistory": "Loading History...", + "lastModified": "Last Modified", + "toolChain": "Tools Applied", + "restore": "Restore", + "unzip": "Unzip", + "searchFiles": "Search files...", + "recent": "Recent", + "localFiles": "Local Files", + "googleDrive": "Google Drive", + "googleDriveShort": "Drive", + "myFiles": "My Files", + "noRecentFiles": "No recent files found", + "googleDriveNotAvailable": "Google Drive integration not available", + "openFiles": "Open Files", + "openFile": "Open File", + "details": "File Details", "fileName": "Ime", + "fileFormat": "Format", + "fileSize": "Size", "fileVersion": "Verzija", + "totalSelected": "Total Selected", + "dropFilesHere": "Drop files here", "selectAll": "Izaberi sve", "deselectAll": "PoniÅĄti sve", "deleteSelected": "Izaberi izabrano", + "downloadSelected": "Download Selected", + "selectedCount": "{{count}} selected", "download": "Preuzmi", - "delete": "ObriÅĄi" + "delete": "ObriÅĄi", + "unsupported": "Unsupported", + "addToUpload": "Add to Upload", + "deleteAll": "Delete All", + "loadingFiles": "Loading files...", + "noFiles": "No files available", + "noFilesFound": "No files found matching your search", + "openInPageEditor": "Open in Page Editor", + "showAll": "Show All", + "sortByDate": "Sort by Date", + "sortByName": "Sort by Name", + "sortBySize": "Sort by Size" + }, + "storage": { + "temporaryNotice": "Files are stored temporarily in your browser and may be cleared automatically", + "storageLimit": "Storage limit", + "storageUsed": "Temporary Storage used", + "storageFull": "Storage is nearly full. Consider removing some files.", + "fileTooLarge": "File too large. Maximum size per file is", + "storageQuotaExceeded": "Storage quota exceeded. Please remove some files before uploading more.", + "approximateSize": "Approximate size" }, "sanitize": { + "title": "Sanitise", + "desc": "Remove potentially harmful elements from PDF files.", "submit": "Sanitizacija PDF-a", + "completed": "Sanitisation completed successfully", + "error": { + "generic": "Sanitisation failed", + "failed": "An error occurred while sanitising the PDF." + }, + "filenamePrefix": "sanitised", + "sanitizationResults": "Sanitisation Results", "steps": { - "settings": "PodeÅĄavanja" + "files": "Files", + "settings": "PodeÅĄavanja", + "results": "Results" + }, + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "options": { + "title": "Sanitisation Options", + "note": "Select the elements you want to remove from the PDF. At least one option must be selected.", + "removeJavaScript": { + "label": "Remove JavaScript", + "desc": "Remove JavaScript actions and scripts from the PDF" + }, + "removeEmbeddedFiles": { + "label": "Remove Embedded Files", + "desc": "Remove any files embedded within the PDF" + }, + "removeXMPMetadata": { + "label": "Remove XMP Metadata", + "desc": "Remove XMP metadata from the PDF" + }, + "removeMetadata": { + "label": "Remove Document Metadata", + "desc": "Remove document information metadata (title, author, etc.)" + }, + "removeLinks": { + "label": "Remove Links", + "desc": "Remove external links and launch actions from the PDF" + }, + "removeFonts": { + "label": "Remove Fonts", + "desc": "Remove embedded fonts from the PDF" + } + } + }, + "addPassword": { + "title": "Dodaj ÅĄifru", + "desc": "Encrypt your PDF document with a password.", + "completed": "Password protection applied", + "submit": "Enkriptuj", + "filenamePrefix": "encrypted", + "error": { + "failed": "An error occurred while encrypting the PDF." + }, + "passwords": { + "stepTitle": "Passwords & Encryption", + "completed": "Passwords configured", + "user": { + "label": "User Password", + "placeholder": "Enter user password" + }, + "owner": { + "label": "Owner Password", + "placeholder": "Enter owner password" + } + }, + "encryption": { + "keyLength": { + "label": "Encryption Key Length", + "40bit": "40-bit (Low)", + "128bit": "128-bit (Standard)", + "256bit": "256-bit (High)" + } + }, + "results": { + "title": "Encrypted PDFs" + }, + "tooltip": { + "header": { + "title": "Password Protection Overview" + }, + "passwords": { + "title": "Password Types", + "text": "User passwords restrict opening the document, while owner passwords control what can be done with the document once opened. You can set both or just one.", + "bullet1": "User Password: Required to open the PDF", + "bullet2": "Owner Password: Controls document permissions (not supported by all PDF viewers)" + }, + "encryption": { + "title": "Encryption Levels", + "text": "Higher encryption levels provide better security but may not be supported by older PDF viewers.", + "bullet1": "40-bit: Basic security, compatible with older viewers", + "bullet2": "128-bit: Standard security, widely supported", + "bullet3": "256-bit: Maximum security, requires modern viewers" + }, + "permissions": { + "title": "Promeni dozvole", + "text": "These permissions control what users can do with the PDF. Most effective when combined with an owner password." + } + }, + "tags": "bezbedno,zaÅĄtita", + "header": "Dodaj ÅĄifru (Enkripcija)", + "selectText": { + "1": "Izaberite PDF za enkripciju", + "2": "Korisnička ÅĄifra", + "3": "DuÅžina enkripcijskog ključa", + "4": "Veće vrednosti su jače, ali manje vrednosti imaju bolju kompatibilnost.", + "5": "Postavke dozvola (Preporučuje se koriÅĄÄ‡enje sa ÅĄifrom vlasnika)", + "6": "Onemogući sastavljanje dokumenta", + "7": "Onemogući ekstrakciju sadrÅžaja", + "8": "Onemogući ekstrakciju za pristupačnost", + "9": "Onemogući popunjavanje formulara", + "10": "Onemogući modifikaciju", + "11": "Onemogući modifikaciju anotacija", + "12": "Onemogući ÅĄtampanje", + "13": "Onemogući ÅĄtampanje u različitim formatima", + "14": "Å ifra vlasnika", + "15": "Ograničava ÅĄta se moÅže raditi sa dokumentom nakon otvaranja (Nije podrÅžano od svih čitača)", + "16": "Ograničava otvaranje samog dokumenta" } }, "changePermissions": { "title": "Promeni dozvole", + "desc": "Change document restrictions and permissions.", + "completed": "Permissions changed", "submit": "Promeni dozvole", + "error": { + "failed": "An error occurred while changing PDF permissions." + }, "permissions": { "preventAssembly": { "label": "Onemogući sastavljanje dokumenta" @@ -1743,10 +4581,784 @@ "label": "Onemogući ÅĄtampanje u različitim formatima" } }, + "results": { + "title": "Modified PDFs" + }, "tooltip": { "header": { "title": "Promeni dozvole" + }, + "description": { + "text": "Changes document permissions, allowing/disallowing access to different features in PDF readers." + }, + "warning": { + "text": "To make these permissions unchangeable, use the Add Password tool to set an owner password." } } + }, + "removePassword": { + "title": "Ukloni ÅĄifru", + "desc": "Uklanjanje lozinke iz PDF dokumenta", + "tags": "bezbedno,DeÅĄifruj,zaÅĄtita,ukloni lozinku", + "password": { + "stepTitle": "Ukloni lozinku", + "label": "Trenutna lozinka", + "placeholder": "Enter current password", + "completed": "Password configured" + }, + "filenamePrefix": "decrypted", + "error": { + "failed": "An error occurred while removing the password from the PDF." + }, + "tooltip": { + "description": "Removing password protection requires the password that was used to encrypt the PDF. This will decrypt the document, making it accessible without a password." + }, + "submit": "Ukloni", + "results": { + "title": "Decrypted PDFs" + }, + "header": "Ukloni ÅĄifru (Dekripcija)", + "selectText": { + "1": "Izaberite PDF za dekripciju", + "2": "Å ifra" + } + }, + "automate": { + "title": "Automate", + "desc": "Build multi-step workflows by chaining together PDF actions. Ideal for recurring tasks.", + "invalidStep": "Invalid step", + "files": { + "placeholder": "Select files to process with this automation" + }, + "selection": { + "title": "Automation Selection", + "saved": { + "title": "Saved" + }, + "createNew": { + "title": "Create New Automation" + }, + "suggested": { + "title": "Suggested" + } + }, + "creation": { + "createTitle": "Create Automation", + "editTitle": "Edit Automation", + "intro": "Automations run tools sequentially. To get started, add tools in the order you want them to run.", + "name": { + "label": "Automation Name", + "placeholder": "My Automation" + }, + "description": { + "label": "Description (optional)", + "placeholder": "Describe what this automation does..." + }, + "tools": { + "selectTool": "Select a tool...", + "selected": "Selected Tools", + "remove": "Remove tool", + "configure": "Configure tool", + "notConfigured": "! Not Configured", + "addTool": "Add Tool", + "add": "Add a tool..." + }, + "save": "Save Automation", + "unsavedChanges": { + "title": "Unsaved Changes", + "message": "You have unsaved changes. Are you sure you want to go back? All changes will be lost.", + "cancel": "Cancel", + "confirm": "Go Back" + }, + "icon": { + "label": "Icon" + } + }, + "run": { + "title": "Run Automation" + }, + "sequence": { + "unnamed": "Unnamed Automation", + "steps": "{{count}} steps", + "running": "Running Automation...", + "run": "Run Automation", + "finish": "Finish" + }, + "reviewTitle": "Automation Results", + "config": { + "loading": "Loading tool configuration...", + "noSettings": "This tool does not have configurable settings.", + "title": "Configure {{toolName}}", + "description": "Configure the settings for this tool. These settings will be applied when the automation runs.", + "cancel": "Cancel", + "save": "Save Configuration" + }, + "copyToSaved": "Copy to Saved" + }, + "automation": { + "suggested": { + "securePdfIngestion": "Secure PDF Ingestion", + "securePdfIngestionDesc": "Comprehensive PDF processing workflow that sanitises documents, applies OCR with cleanup, converts to PDF/A format for long-term archival, and optimises file size.", + "emailPreparation": "Email Preparation", + "emailPreparationDesc": "Optimises PDFs for email distribution by compressing files, splitting large documents into 20MB chunks for email compatibility, and removing metadata for privacy.", + "secureWorkflow": "Security Workflow", + "secureWorkflowDesc": "Secures PDF documents by removing potentially malicious content like JavaScript and embedded files, then adds password protection to prevent unauthorised access. Password is set to 'password' by default.", + "processImages": "Process Images", + "processImagesDesc": "Converts multiple image files into a single PDF document, then applies OCR technology to extract searchable text from the images." + } + }, + "common": { + "copy": "Copy", + "copied": "Copied!", + "refresh": "Refresh", + "retry": "Retry", + "remaining": "remaining", + "used": "used", + "available": "available", + "cancel": "Cancel", + "preview": "Preview" + }, + "config": { + "overview": { + "title": "Application Configuration", + "description": "Current application settings and configuration details." + }, + "account": { + "overview": { + "title": "Account Settings", + "manageAccountPreferences": "Manage your account preferences", + "guestDescription": "You are signed in as a guest. Consider upgrading your account above." + }, + "upgrade": { + "title": "Upgrade Guest Account", + "description": "Link your account to preserve your history and access more features!", + "socialLogin": "Upgrade with Social Account", + "linkWith": "Link with", + "emailPassword": "or enter your email & password", + "email": "Email", + "emailPlaceholder": "Enter your email", + "password": "Password (optional)", + "passwordPlaceholder": "Set a password", + "passwordNote": "Leave empty to use email verification only", + "upgradeButton": "Upgrade Account" + } + }, + "apiKeys": { + "description": "Your API key for accessing Stirling's suite of PDF tools. Copy it to your project or refresh to generate a new one.", + "publicKeyAriaLabel": "Public API key", + "copyKeyAriaLabel": "Copy API key", + "refreshAriaLabel": "Refresh API key", + "includedCredits": "Included credits", + "purchasedCredits": "Purchased credits", + "totalCredits": "Total Credits", + "chartAriaLabel": "Credits usage: included {{includedUsed}} of {{includedTotal}}, purchased {{purchasedUsed}} of {{purchasedTotal}}", + "nextReset": "Next Reset", + "lastApiUse": "Last API Use", + "overlayMessage": "Generate a key to see credits and available credits", + "label": "API Key", + "guestInfo": "Guest users do not receive API keys. Create an account to get an API key you can use in your applications.", + "goToAccount": "Go to Account", + "refreshModal": { + "title": "Refresh API Keys", + "warning": "âš ī¸ Warning: This action will generate new API keys and make your previous keys invalid.", + "impact": "Any applications or services currently using these keys will stop working until you update them with the new keys.", + "confirmPrompt": "Are you sure you want to continue?", + "confirmCta": "Refresh Keys" + }, + "generateError": "We couldn't generate your API key." + } + }, + "AddAttachmentsRequest": { + "attachments": "Select Attachments", + "info": "Select files to attach to your PDF. These files will be embedded and accessible through the PDF's attachment panel.", + "selectFiles": "Select Files to Attach", + "placeholder": "Choose files...", + "addMoreFiles": "Add more files...", + "selectedFiles": "Selected Files", + "submit": "Add Attachments", + "results": { + "title": "Attachment Results" + }, + "error": { + "failed": "Add attachments operation failed" + } + }, + "termsAndConditions": "Terms & Conditions", + "logOut": "Log out", + "addAttachments": { + "error": { + "failed": "An error occurred while adding attachments to the PDF." + } + }, + "autoRename": { + "description": "This tool will automatically rename PDF files based on their content. It analyzes the document to find the most suitable title from the text." + }, + "customPosition": "Custom Position", + "details": "Details", + "downloadUnavailable": "Download unavailable for this item", + "invalidUndoData": "Cannot undo: invalid operation data", + "margin": { + "large": "Large", + "medium": "Medium", + "small": "Small", + "xLarge": "Extra Large" + }, + "noFilesToUndo": "Cannot undo: no files were processed in the last operation", + "noOperationToUndo": "No operation to undo", + "noValidFiles": "No valid files to process", + "operationCancelled": "Operation cancelled", + "pageEdit": { + "deselectAll": "Select None", + "selectAll": "Select All" + }, + "quickPosition": "Quick Position", + "reorganizePages": { + "error": { + "failed": "Failed to reorganize pages" + }, + "results": { + "title": "Pages Reorganized" + }, + "settings": { + "title": "Settings" + }, + "submit": "Reorganize Pages" + }, + "replace-color": { + "options": { + "fill": "Fill colour", + "gradient": "Gradient" + }, + "previewOverlayOpacity": "Preview overlay opacity", + "previewOverlayTransparency": "Preview overlay transparency", + "previewOverlayVisibility": "Show preview overlay", + "selectText": { + "1": "Replace or Invert color Options", + "2": "Default(Default high contrast colors)", + "3": "Custom(Customized colors)", + "4": "Full-Invert(Invert all colors)", + "5": "High contrast color options", + "6": "Beli tekst na crnoj pozadini", + "7": "Crni tekst na beloj pozadini", + "8": "ÅŊuti tekst na crnoj pozadini", + "9": "Zeleni tekst na crnoj pozadini", + "10": "Choose text Color", + "11": "Choose background Color", + "12": "Choose start colour", + "13": "Choose end colour" + }, + "submit": "Zameni", + "title": "Replace-Invert-Color", + "header": "Replace-Invert Color PDF" + }, + "size": "Size", + "submit": "Submit", + "success": "Success", + "tools": { + "noSearchResults": "No tools found", + "noTools": "No tools available" + }, + "undoDataMismatch": "Cannot undo: operation data is corrupted", + "undoFailed": "Failed to undo operation", + "undoQuotaError": "Cannot undo: insufficient storage space", + "undoStorageError": "Undo completed but some files could not be saved to storage", + "undoSuccess": "Operation undone successfully", + "unsupported": "Unsupported", + "onboarding": { + "welcomeModal": { + "title": "Welcome to Stirling PDF!", + "description": "Would you like to take a quick 1-minute tour to learn the key features and how to get started?", + "helpHint": "You can always access this tour later from the Help button in the bottom left.", + "startTour": "Start Tour", + "maybeLater": "Maybe Later", + "dontShowAgain": "Don't Show Again" + }, + "allTools": "This is the All Tools panel, where you can browse and select from all available PDF tools.", + "selectCropTool": "Let's select the Crop tool to demonstrate how to use one of the tools.", + "toolInterface": "This is the Crop tool interface. As you can see, there's not much there because we haven't added any PDF files to work with yet.", + "filesButton": "The Files button on the Quick Access bar allows you to upload PDFs to use the tools on.", + "fileSources": "You can upload new files or access recent files from here. For the tour, we'll just use a sample file.", + "workbench": "This is the Workbench - the main area where you view and edit your PDFs.", + "viewSwitcher": "Use these controls to select how you want to view your PDFs.", + "viewer": "The Viewer lets you read and annotate your PDFs.", + "pageEditor": "The Page Editor allows you to do various operations on the pages within your PDFs, such as reordering, rotating and deleting.", + "activeFiles": "The Active Files view shows all of the PDFs you have loaded into the tool, and allows you to select which ones to process.", + "fileCheckbox": "Clicking one of the files selects it for processing. You can select multiple files for batch operations.", + "selectControls": "The Right Rail contains buttons to quickly select/deselect all of your active PDFs, along with buttons to change the app's theme or language.", + "cropSettings": "Now that we've selected the file we want crop, we can configure the Crop tool to choose the area that we want to crop the PDF to.", + "runButton": "Once the tool has been configured, this button allows you to run the tool on all the selected PDFs.", + "results": "After the tool has finished running, the Review step will show a preview of the results in this panel, and allow you to undo the operation or download the file. ", + "fileReplacement": "The modified file will replace the original file in the Workbench automatically, allowing you to easily run it through more tools.", + "pinButton": "You can use the Pin button if you'd rather your files stay active after running tools on them.", + "wrapUp": "You're all set! You've learnt about the main areas of the app and how to use them. Click the Help button whenever you like to see this tour again.", + "previous": "Previous", + "next": "Next", + "finish": "Finish", + "startTour": "Start Tour", + "startTourDescription": "Take a guided tour of Stirling PDF's key features" + }, + "workspace": { + "title": "Workspace", + "people": { + "title": "People", + "description": "Manage workspace members and their permissions", + "loading": "Loading people...", + "searchMembers": "Search members...", + "addMembers": "Add Members", + "inviteMembers": { + "label": "Invite Members", + "subtitle": "Type or paste in emails below, separated by commas. Your workspace will be billed by members." + }, + "user": "User", + "role": "Role", + "team": "Team", + "status": "Status", + "actions": "Actions", + "noMembersFound": "No members found", + "active": "Active", + "disabled": "Disabled", + "activeSession": "Active session", + "member": "Member", + "admin": "Admin", + "roleDescriptions": { + "admin": "Can manage settings and invite members, with full administrative access.", + "member": "Can view and edit shared files, but cannot manage workspace settings or members." + }, + "editRole": "Edit Role", + "enable": "Enable", + "disable": "Disable", + "deleteUser": "Delete User", + "deleteUserSuccess": "User deleted successfully", + "deleteUserError": "Failed to delete user", + "confirmDelete": "Are you sure you want to delete this user? This action cannot be undone.", + "addMember": { + "title": "Add Member", + "username": "Username (Email)", + "usernamePlaceholder": "user@example.com", + "password": "Password", + "passwordPlaceholder": "Enter password", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "forcePasswordChange": "Force password change on first login", + "cancel": "Cancel", + "submit": "Add Member", + "usernameRequired": "Username and password are required", + "passwordTooShort": "Password must be at least 6 characters", + "success": "User created successfully", + "error": "Failed to create user" + }, + "editMember": { + "title": "Edit Member", + "editing": "Editing:", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "cancel": "Cancel", + "submit": "Update Member", + "success": "User updated successfully", + "error": "Failed to update user" + }, + "toggleEnabled": { + "success": "User status updated successfully", + "error": "Failed to update user status" + }, + "delete": { + "success": "User deleted successfully", + "error": "Failed to delete user" + }, + "emailInvite": { + "tab": "Email Invite", + "description": "Type or paste in emails below, separated by commas. Users will receive login credentials via email.", + "emails": "Email Addresses", + "emailsPlaceholder": "user1@example.com, user2@example.com", + "emailsRequired": "At least one email address is required", + "submit": "Send Invites", + "success": "user(s) invited successfully", + "partialSuccess": "Some invites failed", + "allFailed": "Failed to invite users", + "error": "Failed to send invites" + }, + "directInvite": { + "tab": "Direct Create" + }, + "inviteLinkTab": { + "tab": "Invite Link" + }, + "inviteLink": { + "description": "Generate a secure link that allows the user to set their own password", + "email": "Email Address", + "emailPlaceholder": "user@example.com (optional)", + "emailDescription": "Optional - leave blank for a general invite link that can be used by anyone", + "emailRequired": "Email address is required", + "emailOptional": "Optional - leave blank for a general invite link", + "emailRequiredForSend": "Email address is required to send email notification", + "expiryHours": "Expiry Hours", + "expiryDescription": "How many hours until the link expires", + "sendEmail": "Send invite link via email", + "sendEmailDescription": "If enabled, the invite link will be sent to the specified email address", + "smtpRequired": "SMTP not configured", + "generate": "Generate Link", + "generated": "Invite Link Generated", + "copied": "Link copied to clipboard", + "success": "Invite link generated successfully", + "successWithEmail": "Invite link generated and sent via email", + "emailFailed": "Invite link generated, but email failed", + "emailFailedDetails": "Error: {0}. Please share the invite link manually.", + "error": "Failed to generate invite link", + "submit": "Generate Invite Link" + }, + "inviteMode": { + "username": "Username", + "email": "Email", + "link": "Link", + "emailDisabled": "Email invites require SMTP configuration and mail.enableInvites=true in settings" + }, + "license": { + "users": "users", + "availableSlots": "Available Slots", + "grandfathered": "Grandfathered", + "grandfatheredShort": "{{count}} grandfathered", + "fromLicense": "from license", + "slotsAvailable": "{{count}} user slot(s) available", + "noSlotsAvailable": "No slots available", + "currentUsage": "Currently using {{current}} of {{max}} user licences" + } + }, + "teams": { + "title": "Teams", + "description": "Manage teams and organize workspace members", + "loading": "Loading teams...", + "loadingDetails": "Loading team details...", + "createNewTeam": "Create New Team", + "teamName": "Team Name", + "totalMembers": "Total Members", + "actions": "Actions", + "noTeamsFound": "No teams found", + "noMembers": "No members in this team", + "system": "System", + "addMember": "Add Member", + "viewTeam": "View Team", + "removeMember": "Remove from team", + "cannotRemoveFromSystemTeam": "Cannot remove from system team", + "renameTeamLabel": "Rename Team", + "deleteTeamLabel": "Delete Team", + "cannotDeleteInternal": "Cannot delete the Internal team", + "confirmDelete": "Are you sure you want to delete this team? This team must be empty to delete.", + "confirmRemove": "Remove user from this team?", + "cannotRenameInternal": "Cannot rename the Internal team", + "cannotAddToInternal": "Cannot add members to the Internal team", + "teamNotFound": "Team not found", + "backToTeams": "Back to Teams", + "memberCount": "{{count}} members", + "removeMemberSuccess": "User removed from team", + "removeMemberError": "Failed to remove user from team", + "createTeam": { + "title": "Create New Team", + "teamName": "Team Name", + "teamNamePlaceholder": "Enter team name", + "cancel": "Cancel", + "submit": "Create Team", + "nameRequired": "Team name is required", + "success": "Team created successfully", + "error": "Failed to create team" + }, + "renameTeam": { + "title": "Rename Team", + "renaming": "Renaming:", + "newTeamName": "New Team Name", + "newTeamNamePlaceholder": "Enter new team name", + "cancel": "Cancel", + "submit": "Rename Team", + "nameRequired": "Team name is required", + "success": "Team renamed successfully", + "error": "Failed to rename team" + }, + "deleteTeam": { + "success": "Team deleted successfully", + "error": "Failed to delete team. Make sure the team is empty.", + "teamMustBeEmpty": "Team must be empty before deletion" + }, + "addMemberToTeam": { + "title": "Add Member to Team", + "addingTo": "Adding to", + "selectUser": "Select User", + "selectUserPlaceholder": "Choose a user", + "selectUserRequired": "Please select a user", + "currentlyIn": "currently in", + "willBeMoved": "Note: This user will be moved from their current team to this team.", + "cancel": "Cancel", + "submit": "Add Member", + "userRequired": "Please select a user", + "success": "Member added to team successfully", + "error": "Failed to add member to team" + }, + "changeTeam": { + "label": "Change Team", + "title": "Change Team", + "changing": "Moving", + "selectTeam": "Select Team", + "selectTeamPlaceholder": "Choose a team", + "selectTeamRequired": "Please select a team", + "success": "Team changed successfully", + "error": "Failed to change team", + "submit": "Change Team" + } + } + }, + "plan": { + "currency": "Currency", + "popular": "Popular", + "current": "Current Plan", + "upgrade": "Upgrade", + "contact": "Contact Us", + "customPricing": "Custom", + "showComparison": "Compare All Features", + "hideComparison": "Hide Feature Comparison", + "featureComparison": "Feature Comparison", + "activePlan": { + "title": "Active Plan", + "subtitle": "Your current subscription details" + }, + "availablePlans": { + "title": "Available Plans", + "subtitle": "Choose the plan that fits your needs" + }, + "static": { + "title": "Billing Information", + "message": "Online billing is not currently configured. To upgrade your plan or manage subscriptions, please contact us directly.", + "contactSales": "Contact Sales", + "contactToUpgrade": "Contact us to upgrade or customize your plan", + "maxUsers": "Max Users", + "upTo": "Up to" + }, + "period": { + "month": "month" + }, + "free": { + "name": "Free", + "highlight1": "Limited Tool Usage Per week", + "highlight2": "Access to all tools", + "highlight3": "Community support" + }, + "pro": { + "name": "Pro", + "highlight1": "Unlimited Tool Usage", + "highlight2": "Advanced PDF tools", + "highlight3": "No watermarks" + }, + "enterprise": { + "name": "Enterprise", + "highlight1": "Custom pricing", + "highlight2": "Dedicated support", + "highlight3": "Latest features" + }, + "feature": { + "title": "Feature", + "pdfTools": "Basic PDF Tools", + "fileSize": "File Size Limit", + "automation": "Automate tool workflows", + "api": "API Access", + "priority": "Priority Support", + "customPricing": "Custom Pricing" + } + }, + "subscription": { + "status": { + "active": "Active", + "pastDue": "Past Due", + "canceled": "Canceled", + "incomplete": "Incomplete", + "trialing": "Trial", + "none": "No Subscription" + }, + "renewsOn": "Renews on {{date}}", + "cancelsOn": "Cancels on {{date}}" + }, + "billing": { + "manageBilling": "Manage Billing", + "portal": { + "error": "Failed to open billing portal" + } + }, + "payment": { + "preparing": "Preparing your checkout...", + "upgradeTitle": "Upgrade to {{planName}}", + "success": "Payment Successful!", + "successMessage": "Your subscription has been activated successfully. You will receive a confirmation email shortly.", + "autoClose": "This window will close automatically...", + "error": "Payment Error" + }, + "firstLogin": { + "title": "First Time Login", + "welcomeTitle": "Welcome!", + "welcomeMessage": "For security reasons, you must change your password on your first login.", + "loggedInAs": "Logged in as", + "error": "Error", + "currentPassword": "Current Password", + "enterCurrentPassword": "Enter your current password", + "newPassword": "New Password", + "enterNewPassword": "Enter new password (min 8 characters)", + "confirmPassword": "Confirm New Password", + "reEnterNewPassword": "Re-enter new password", + "changePassword": "Change Password", + "allFieldsRequired": "All fields are required", + "passwordsDoNotMatch": "New passwords do not match", + "passwordTooShort": "Password must be at least 8 characters", + "passwordMustBeDifferent": "New password must be different from current password", + "passwordChangedSuccess": "Password changed successfully! Please log in again.", + "passwordChangeFailed": "Failed to change password. Please check your current password." + }, + "invite": { + "welcome": "Welcome to Stirling PDF", + "invalidToken": "Invalid invitation link", + "validationError": "Failed to validate invitation link", + "passwordRequired": "Password is required", + "passwordTooShort": "Password must be at least 6 characters", + "passwordMismatch": "Passwords do not match", + "acceptError": "Failed to create account", + "validating": "Validating invitation...", + "invalidInvitation": "Invalid Invitation", + "goToLogin": "Go to Login", + "welcomeTitle": "You've been invited!", + "welcomeSubtitle": "Complete your account setup to get started", + "accountFor": "Creating account for", + "linkExpires": "Link expires", + "email": "Email address", + "emailPlaceholder": "Enter your email address", + "emailRequired": "Email address is required", + "invalidEmail": "Invalid email address", + "choosePassword": "Choose a password", + "passwordPlaceholder": "Enter your password", + "confirmPassword": "Confirm password", + "confirmPasswordPlaceholder": "Re-enter your password", + "createAccount": "Create Account", + "creating": "Creating Account...", + "alreadyHaveAccount": "Already have an account?", + "signIn": "Sign in" + }, + "audit": { + "error": { + "title": "Error loading audit system" + }, + "notAvailable": "Audit system not available", + "notAvailableMessage": "The audit system is not configured or not available.", + "disabled": "Audit logging is disabled", + "disabledMessage": "Enable audit logging in your application configuration to track system events.", + "systemStatus": { + "title": "System Status", + "status": "Audit Logging", + "enabled": "Enabled", + "disabled": "Disabled", + "level": "Audit Level", + "retention": "Retention Period", + "days": "days", + "totalEvents": "Total Events" + }, + "tabs": { + "dashboard": "Dashboard", + "events": "Audit Events", + "export": "Export" + }, + "charts": { + "title": "Audit Dashboard", + "error": "Error loading charts", + "day": "Day", + "week": "Week", + "month": "Month", + "byType": "Events by Type", + "byUser": "Events by User", + "overTime": "Events Over Time" + }, + "events": { + "title": "Audit Events", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "error": "Error loading events", + "noEvents": "No events found", + "timestamp": "Timestamp", + "type": "Type", + "user": "User", + "ipAddress": "IP Address", + "actions": "Actions", + "viewDetails": "View Details", + "eventDetails": "Event Details", + "details": "Details" + }, + "export": { + "title": "Export Audit Data", + "description": "Export audit events to CSV or JSON format. Use filters to limit the exported data.", + "format": "Export Format", + "filters": "Filters (Optional)", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "exportButton": "Export Data", + "error": "Failed to export data" + } + }, + "usage": { + "noData": "No data available", + "error": "Error loading usage statistics", + "noDataMessage": "No usage statistics are currently available.", + "controls": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All", + "refresh": "Refresh", + "dataTypeLabel": "Data Type:", + "dataType": { + "all": "All", + "api": "API", + "ui": "UI" + } + }, + "showing": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All" + }, + "stats": { + "totalEndpoints": "Total Endpoints", + "totalVisits": "Total Visits", + "showing": "Showing", + "selectedVisits": "Selected Visits" + }, + "chart": { + "title": "Endpoint Usage Chart" + }, + "table": { + "title": "Detailed Statistics", + "endpoint": "Endpoint", + "visits": "Visits", + "percentage": "Percentage", + "noData": "No data available" + } + }, + "backendHealth": { + "checking": "Checking backend status...", + "online": "Backend Online", + "offline": "Backend Offline" + }, + "autoRedact": { + "tags": "Cenzura,Sakrij,prekrivanje,crna,marker,skriveno", + "title": "Auto Cenzura", + "header": "Auto Cenzura", + "colorLabel": "Boja", + "textsToRedactLabel": "Tekst za cenzurisanje (razdvojeni linijama)", + "textsToRedactPlaceholder": "npr. \\nPoverljivo \\nVrhunski Tajno", + "useRegexLabel": "Koristi Regex", + "wholeWordSearchLabel": "Pretraga celih reči", + "customPaddingLabel": "Dodatni prazan prostor", + "convertPDFToImageLabel": "Konvertuj PDF u PDF-Image (koristi se za uklanjanje teksta iza okvira)", + "submitButton": "Potvrdi" + }, + "replaceColorPdf": { + "tags": "Replace Color,Page operations,Back end,server side" } -} \ No newline at end of file +} diff --git a/frontend/public/locales/sv-SE/translation.json b/frontend/public/locales/sv-SE/translation.json index 86e9fa982..970a73bf7 100644 --- a/frontend/public/locales/sv-SE/translation.json +++ b/frontend/public/locales/sv-SE/translation.json @@ -1,4 +1,40 @@ { + "toolPanel": { + "modePrompt": { + "title": "Choose how you browse tools", + "description": "Preview both layouts and decide how you want to explore Stirling PDF tools.", + "sidebarTitle": "Sidebar mode", + "sidebarDescription": "Keep tools alongside your workspace for quick switching.", + "recommended": "Recommended", + "chooseSidebar": "Use sidebar mode", + "fullscreenTitle": "Fullscreen mode - (legacy)", + "fullscreenDescription": "Browse every tool in a catalogue that covers the workspace until you pick one.", + "chooseFullscreen": "Use fullscreen mode", + "dismiss": "Maybe later" + }, + "fullscreen": { + "showDetails": "Show Details", + "comingSoon": "Coming soon:", + "favorite": "Add to favourites", + "favorites": "Favourites", + "heading": "All tools (fullscreen view)", + "noResults": "Try adjusting your search or toggle descriptions to find what you need.", + "recommended": "Recommended", + "unfavorite": "Remove from favourites" + }, + "placeholder": "Choose a tool to get started", + "toggle": { + "fullscreen": "Switch to fullscreen mode", + "sidebar": "Switch to sidebar mode" + } + }, + "unsavedChanges": "You have unsaved changes to your PDF.", + "areYouSure": "Are you sure you want to leave?", + "unsavedChangesTitle": "Unsaved Changes", + "keepWorking": "Keep Working", + "discardChanges": "Discard & Leave", + "applyAndContinue": "Save & Leave", + "exportAndContinue": "Export & Continue", "language": { "direction": "ltr" }, @@ -18,8 +54,26 @@ "customTextDesc": "Anpassad text", "numberPagesDesc": "Vilka sidor som ska numreras, standard 'all', accepterar även 1-5 eller 2,5,9 etc", "customNumberDesc": "Standard är {n}, accepterar även 'Sida {n} av {total}', 'Text-{n}', '{filnamn}-{n}", - "submit": "Lägg till sidnummer" + "submit": "Lägg till sidnummer", + "configuration": "Configuration", + "customize": "Customize Appearance", + "pagesAndStarting": "Pages & Starting Number", + "positionAndPages": "Position & Pages", + "error": { + "failed": "Add page numbers operation failed" + }, + "results": { + "title": "Page Number Results" + }, + "preview": "Position Selection", + "previewDisclaimer": "Preview is approximate. Final output may vary due to PDF font metrics." }, + "pageSelectionPrompt": "Anpassat sidval (Ange en kommaseparerad lista med sidnummer 1,5,6 eller funktioner som 2n+1) :", + "startingNumberTooltip": "The first number to display. Subsequent pages will increment from this number.", + "marginTooltip": "Distance between the page number and the edge of the page.", + "fontSizeTooltip": "Size of the page number text in points. Larger numbers create bigger text.", + "fontTypeTooltip": "Font family for the page numbers. Choose based on your document style.", + "customTextTooltip": "Optional custom format for page numbers. Use {n} as placeholder for the number. Example: \"Page {n}\" will show \"Page 1\", \"Page 2\", etc.", "pdfPrompt": "Välj PDF(er)", "multiPdfPrompt": "Välj PDF-filer (2+)", "multiPdfDropPrompt": "Välj (eller dra och släpp) alla PDF-filer du behÃļver", @@ -30,15 +84,41 @@ "uploadLimitExceededPlural": "are too large. Maximum allowed size is", "processTimeWarning": "Varning: Denna process kan ta upp till en minut beroende pÃĨ filstorlek", "pageOrderPrompt": "Sidordning (Ange en kommaseparerad lista med sidnummer) :", - "pageSelectionPrompt": "Anpassat sidval (Ange en kommaseparerad lista med sidnummer 1,5,6 eller funktioner som 2n+1) :", "goToPage": "GÃĨ till", "true": "Sant", "false": "Falskt", "unknown": "Okänt", + "app": { + "description": "The Free Adobe Acrobat alternative (10M+ Downloads)" + }, "save": "Spara", "saveToBrowser": "Spara till webbläsare", + "download": "Ladda ner", + "pin": "Pin File (keep active after tool run)", + "unpin": "Unpin File (replace after tool run)", + "undoOperationTooltip": "Click to undo the last operation and restore the original files", + "undo": "Undo", + "moreOptions": "More Options", + "editYourNewFiles": "Edit your new file(s)", "close": "Stäng", + "openInViewer": "Open in Viewer", + "confirmClose": "Confirm Close", + "confirmCloseMessage": "Are you sure you want to close this file?", + "confirmCloseCancel": "Cancel", + "confirmCloseConfirm": "Close File", + "fileSelected": "Selected: {{filename}}", + "chooseFile": "Choose File", "filesSelected": "filer valda", + "files": { + "title": "Files", + "upload": "Upload", + "uploadFiles": "Upload Files", + "addFiles": "Add files", + "selectFromWorkbench": "Select files from the workbench or ", + "selectMultipleFromWorkbench": "Select at least {{count}} files from the workbench or ", + "created": "Created", + "size": "File Size" + }, "noFavourites": "Inga favoriter har lagts till", "downloadComplete": "Nedladdning klar", "bored": "TrÃļtt pÃĨ att vänta?", @@ -56,7 +136,10 @@ }, "error": { "pdfPassword": "PDF-dokumentet är lÃļsenordsskyddat och antingen har lÃļsenordet inte angetts eller är felaktigt", + "encryptedPdfMustRemovePassword": "This PDF is encrypted or password-protected. Please unlock it before converting to PDF/A.", + "incorrectPasswordProvided": "The PDF password is incorrect or not provided.", "_value": "Fel", + "dismissAllErrors": "Dismiss All Errors", "sorry": "Vi beklagar problemet!", "needHelp": "BehÃļver du hjälp / Har du hittat ett problem?", "contactTip": "Om du fortfarande har problem, tveka inte att kontakta oss fÃļr hjälp. Du kan skicka in en frÃĨga pÃĨ vÃĨr GitHub-sida eller kontakta oss via Discord:", @@ -71,6 +154,10 @@ "githubSubmit": "GitHub - Skicka in en frÃĨga", "discordSubmit": "Discord - Skicka in ett supportinlägg" }, + "warning": { + "tooltipTitle": "Warning" + }, + "edit": "Edit", "delete": "Radera", "username": "Användarnamn", "password": "LÃļsenord", @@ -82,6 +169,7 @@ "green": "GrÃļn", "blue": "BlÃĨ", "custom": "Anpassad...", + "comingSoon": "Coming soon", "WorkInProgess": "PÃĨgÃĨende arbete, kan vara icke fungerande eller buggigt. Rapportera eventuella problem!", "poweredBy": "Drivs av", "yes": "Ja", @@ -115,12 +203,14 @@ "page": "Sidan", "pages": "Sidor", "loading": "Laddar...", + "review": "Review", "addToDoc": "Lägg till i dokument", "reset": "Reset", "apply": "Apply", "noFileSelected": "No file selected. Please upload one.", "legal": { "privacy": "Dataprotektionspolicy", + "iAgreeToThe": "I agree to all of the", "terms": "Villkor och betingelser", "accessibility": "GängeshÃĨllbarhet", "cookie": "Cockiropfer", @@ -160,6 +250,7 @@ "title": "Vill du gÃļra Stirling PDF bättre?", "paragraph1": "Stirling PDF har inaktiverad analys fÃļr att hjälpa oss fÃļrbättra produkten. Vi spÃĨrar ingen personlig information eller filinnehÃĨll.", "paragraph2": "Var god aktivera analyser fÃļr att hjälpa Stirling-PDF att växa och tillÃĨta oss att fÃļrstÃĨ vÃĨra användare bättre.", + "learnMore": "Learn more", "enable": "Aktivera analys", "disable": "Avaktivera analys", "settings": "Du kan ändra analysinställningarna i config/settings.yml-filen" @@ -203,6 +294,54 @@ "cacheInputs": { "name": "Spara formulärinmatningar", "help": "Aktivera fÃļr att lagra tidigare använda inmatningar fÃļr framtida kÃļrningar" + }, + "general": { + "title": "General", + "description": "Configure general application preferences.", + "account": "Account", + "accountDescription": "Manage your account settings", + "user": "User", + "signedInAs": "Signed in as", + "logout": "Log out", + "enableFeatures": { + "title": "For System Administrators", + "intro": "Enable user authentication, team management, and workspace features for your organization.", + "action": "Configure", + "and": "and", + "benefit": "Enables user roles, team collaboration, admin controls, and enterprise features.", + "learnMore": "Learn more in documentation", + "dismiss": "Dismiss" + }, + "autoUnzip": "Auto-unzip API responses", + "autoUnzipDescription": "Automatically extract files from ZIP responses", + "autoUnzipTooltip": "Automatically extract ZIP files returned from API operations. Disable to keep ZIP files intact. This does not affect automation workflows.", + "autoUnzipFileLimit": "Auto-unzip file limit", + "autoUnzipFileLimitDescription": "Maximum number of files to extract from ZIP", + "autoUnzipFileLimitTooltip": "Only unzip if the ZIP contains this many files or fewer. Set higher to extract larger ZIPs.", + "defaultToolPickerMode": "Default tool picker mode", + "defaultToolPickerModeDescription": "Choose whether the tool picker opens in fullscreen or sidebar by default", + "mode": { + "fullscreen": "Fullscreen", + "sidebar": "Sidebar" + } + }, + "hotkeys": { + "title": "Keyboard Shortcuts", + "description": "Hover a tool to see its shortcut or customise it below. Click \"Change shortcut\" and press a new key combination. Press Esc to cancel.", + "errorModifier": { + "mac": "Include ⌘ (Command), âŒĨ (Option), or another modifier in your shortcut.", + "windows": "Include Ctrl, Alt, or another modifier in your shortcut." + }, + "errorConflict": "Shortcut already used by {{tool}}.", + "none": "Not assigned", + "customBadge": "Custom", + "defaultLabel": "Default: {{shortcut}}", + "capturing": "Press keysâ€Ļ (Esc to cancel)", + "change": "Change shortcut", + "reset": "Reset", + "shortcut": "Shortcut", + "noShortcut": "No shortcut set", + "searchPlaceholder": "Search tools..." } }, "changeCreds": { @@ -274,8 +413,10 @@ "top20": "Top 20", "all": "All", "refresh": "Refresh", - "includeHomepage": "Include Homepage ('/')", - "includeLoginPage": "Include Login Page ('/login')", + "dataTypeLabel": "Data Type:", + "dataTypeAll": "All", + "dataTypeApi": "API", + "dataTypeUi": "UI", "totalEndpoints": "Total Endpoints", "totalVisits": "Total Visits", "showing": "Showing", @@ -290,7 +431,9 @@ "top": "Top", "numberOfVisits": "Number of Visits", "visitsTooltip": "Visits: {0} ({1}% of total)", - "retry": "Retry" + "retry": "Retry", + "includeHomepage": "Include Homepage ('/')", + "includeLoginPage": "Include Login Page ('/login')" }, "database": { "title": "Databasimport/export", @@ -331,22 +474,310 @@ "alphabetical": "Alfabetisk", "globalPopularity": "Global Popularity", "sortBy": "Sortera efter:", + "mobile": { + "brandAlt": "Stirling PDF logo", + "openFiles": "Open files", + "swipeHint": "Swipe left or right to switch views", + "tools": "Tools", + "toolsSlide": "Tool selection panel", + "viewSwitcher": "Switch workspace view", + "workbenchSlide": "Workspace panel", + "workspace": "Workspace" + }, "multiTool": { + "tags": "multiple,tools", "title": "PDF Multi-verktyg", "desc": "Sammanfoga, rotera, ordna om och ta bort sidor" }, "merge": { + "tags": "combine,join,unite", "title": "Sammanfoga", "desc": "Sammanfoga enkelt flera PDF-filer till en." }, "split": { + "tags": "divide,separate,break", "title": "Dela", "desc": "Dela upp PDF-filer i flera dokument" }, "rotate": { + "tags": "turn,flip,orient", "title": "Rotera", "desc": "Rotera enkelt dina PDF-filer." }, + "convert": { + "tags": "transform,change", + "title": "Konvertera", + "desc": "Convert files between different formats" + }, + "pdfOrganiser": { + "tags": "organize,rearrange,reorder", + "title": "Ordna", + "desc": "Ta bort/ordna om sidor i valfri ordning" + }, + "addImage": { + "tags": "insert,embed,place", + "title": "Lägg till bild", + "desc": "Lägger till en bild pÃĨ en angiven plats i PDF:en (pÃĨgÃĨr arbete)" + }, + "addAttachments": { + "tags": "embed,attach,include", + "title": "Add Attachments", + "desc": "Add or remove embedded files (attachments) to/from a PDF" + }, + "watermark": { + "tags": "stamp,mark,overlay", + "title": "Lägg till vattenstämpel", + "desc": "Lägg till en anpassad vattenstämpel till ditt PDF-dokument." + }, + "removePassword": { + "tags": "unlock", + "title": "Ta bort lÃļsenord", + "desc": "Ta bort lÃļsenordsskydd frÃĨn ditt PDF-dokument." + }, + "compress": { + "tags": "shrink,reduce,optimize", + "title": "Komprimera", + "desc": "Komprimera PDF-filer fÃļr att minska deras filstorlek." + }, + "unlockPDFForms": { + "tags": "unlock,enable,edit", + "title": "Unlock PDF Forms", + "desc": "Remove read-only property of form fields in a PDF document." + }, + "changeMetadata": { + "tags": "edit,modify,update", + "title": "Ändra metadata", + "desc": "Ändra/ta bort/lägg till metadata frÃĨn ett PDF-dokument" + }, + "ocr": { + "tags": "extract,scan", + "title": "OCR / Rensningsskanningar", + "desc": "RengÃļr skanningar och upptäcker text frÃĨn bilder i en PDF och lägger till den igen som text." + }, + "extractImages": { + "tags": "pull,save,export", + "title": "Extrahera bilder", + "desc": "Extraherar alla bilder frÃĨn en PDF och sparar dem till zip" + }, + "scannerImageSplit": { + "tags": "detect,split,photos", + "title": "Detect & Split Scanned Photos", + "desc": "Detect and split scanned photos into separate pages" + }, + "sign": { + "tags": "signature,autograph", + "title": "Signera", + "desc": "Lägger till signatur till PDF genom ritning, text eller bild" + }, + "flatten": { + "tags": "simplify,remove,interactive", + "title": "Platta till", + "desc": "Ta bort alla interaktiva element och formulär frÃĨn en PDF" + }, + "certSign": { + "tags": "authenticate,PEM,P12,official,encrypt,sign,certificate,PKCS12,JKS,server,manual,auto", + "title": "Signera med certifikat", + "desc": "Signerar en PDF med ett certifikat/nyckel (PEM/P12)" + }, + "repair": { + "tags": "fix,restore", + "title": "Reparera", + "desc": "FÃļrsÃļker reparera en korrupt/trasig PDF" + }, + "removeBlanks": { + "tags": "delete,clean,empty", + "title": "Ta bort tomma sidor", + "desc": "Känner av och tar bort tomma sidor frÃĨn ett dokument" + }, + "removeAnnotations": { + "tags": "delete,clean,strip", + "title": "Ta bort anteckningar", + "desc": "Tar bort alla kommentarer/anteckningar frÃĨn en PDF" + }, + "compare": { + "tags": "difference", + "title": "JämfÃļr", + "desc": "JämfÃļr och visar skillnaderna mellan 2 PDF-dokument" + }, + "removeCertSign": { + "tags": "remove,delete,unlock", + "title": "Ta bort certifikatsignatur", + "desc": "Ta bort certifikatsignatur frÃĨn PDF" + }, + "pageLayout": { + "tags": "layout,arrange,combine", + "title": "Flersidigt layout", + "desc": "SlÃĨ samman flera sidor av ett PDF-dokument till en enda sida" + }, + "bookletImposition": { + "tags": "booklet,print,binding", + "title": "Booklet Imposition", + "desc": "Create booklets with proper page ordering and multi-page layout for printing and binding" + }, + "scalePages": { + "tags": "resize,adjust,scale", + "title": "Justera sidstorlek/skala", + "desc": "Ändra storleken/skalan pÃĨ sidan och/eller dess innehÃĨll." + }, + "addPageNumbers": { + "tags": "number,pagination,count", + "title": "Lägg till sidnummer", + "desc": "Lägg till sidnummer genom hela dokumentet pÃĨ en angiven plats" + }, + "autoRename": { + "tags": "auto-detect,header-based,organize,relabel", + "title": "Auto Rename PDF File", + "desc": "Auto renames a PDF file based on its detected header" + }, + "adjustContrast": { + "tags": "contrast,brightness,saturation", + "title": "Justera färger/kontrast", + "desc": "Justera kontrast, mättnad och ljusstyrka i en PDF" + }, + "crop": { + "tags": "trim,cut,resize", + "title": "Beskär PDF", + "desc": "Beskär en PDF fÃļr att minska dess storlek (behÃĨller text!)" + }, + "autoSplitPDF": { + "tags": "auto,split,QR", + "title": "Auto-dela sidor", + "desc": "Auto-dela skannad PDF med fysisk skannad sidseparator QR-kod" + }, + "sanitize": { + "tags": "clean,purge,remove", + "title": "Sanitise", + "desc": "Remove potentially harmful elements from PDF files" + }, + "getPdfInfo": { + "tags": "info,metadata,details", + "title": "Hämta ALL information om PDF", + "desc": "Hämtar all mÃļjlig information om PDF:er" + }, + "pdfToSinglePage": { + "tags": "combine,merge,single", + "title": "PDF till en enda stor sida", + "desc": "SlÃĨr samman alla PDF-sidor till en enda stor sida" + }, + "showJS": { + "tags": "javascript,code,script", + "title": "Visa Javascript", + "desc": "SÃļker och visar eventuell JS som injicerats i en PDF" + }, + "redact": { + "tags": "censor,blackout,hide", + "title": "Manual Redaction", + "desc": "Redacts a PDF based on selected text, drawn shapes and/or selected page(s)" + }, + "splitBySections": { + "tags": "split,sections,divide", + "title": "Split PDF by Sections", + "desc": "Divide each page of a PDF into smaller horizontal and vertical sections" + }, + "addStamp": { + "tags": "stamp,mark,seal", + "title": "Add Stamp to PDF", + "desc": "Add text or add image stamps at set locations" + }, + "removeImage": { + "tags": "remove,delete,clean", + "title": "Ta bort bild", + "desc": "Ta bort bild frÃĨn PDF fÃļr att minska filstorlek" + }, + "splitByChapters": { + "tags": "split,chapters,structure", + "title": "Dela upp PDF efter kapitel", + "desc": "Dela upp en PDF till flera filer baserat pÃĨ dess kapitelstruktur." + }, + "validateSignature": { + "tags": "validate,verify,certificate", + "title": "Validera PDF signature", + "desc": "Verifiera digitala signaturer och certifiakt i PDF dokument" + }, + "swagger": { + "tags": "API,documentation,test", + "title": "API Documentation", + "desc": "View API documentation and test endpoints" + }, + "scannerEffect": { + "tags": "scan,simulate,create", + "title": "Scanner Effect", + "desc": "Create a PDF that looks like it was scanned" + }, + "editTableOfContents": { + "tags": "bookmarks,contents,edit", + "title": "Edit Table of Contents", + "desc": "Add or edit bookmarks and table of contents in PDF documents" + }, + "manageCertificates": { + "tags": "certificates,import,export", + "title": "Manage Certificates", + "desc": "Import, export, or delete digital certificate files used for signing PDFs." + }, + "read": { + "tags": "view,open,display", + "title": "Read", + "desc": "View and annotate PDFs. Highlight text, draw, or insert comments for review and collaboration." + }, + "reorganizePages": { + "tags": "rearrange,reorder,organize", + "title": "Reorganize Pages", + "desc": "Rearrange, duplicate, or delete PDF pages with visual drag-and-drop control." + }, + "extractPages": { + "tags": "pull,select,copy", + "title": "Extrahera sidor", + "desc": "Extract specific pages from a PDF document" + }, + "removePages": { + "tags": "delete,extract,exclude", + "title": "Ta bort", + "desc": "Ta bort oÃļnskade sidor frÃĨn ditt PDF-dokument." + }, + "autoSizeSplitPDF": { + "tags": "auto,split,size", + "title": "Auto-dela efter storlek/antal", + "desc": "Dela en enda PDF till flera dokument baserat pÃĨ storlek, sidantal eller dokumentantal" + }, + "replaceColor": { + "title": "Replace & Invert Colour", + "desc": "Replace or invert colours in PDF documents" + }, + "devApi": { + "tags": "API,development,documentation", + "title": "API", + "desc": "Link to API documentation" + }, + "devFolderScanning": { + "tags": "automation,folder,scanning", + "title": "Automated Folder Scanning", + "desc": "Link to automated folder scanning guide" + }, + "devSsoGuide": { + "title": "SSO Guide", + "desc": "Link to SSO guide" + }, + "devAirgapped": { + "title": "Air-gapped Setup", + "desc": "Link to air-gapped setup guide" + }, + "addPassword": { + "title": "Lägg till lÃļsenord", + "desc": "Kryptera ditt PDF-dokument med ett lÃļsenord." + }, + "changePermissions": { + "title": "Ändra behÃļrigheter", + "desc": "Change document restrictions and permissions" + }, + "automate": { + "tags": "workflow,sequence,automation", + "title": "Automate", + "desc": "Build multi-step workflows by chaining together PDF actions. Ideal for recurring tasks." + }, + "overlay-pdfs": { + "desc": "Överlagrar PDF:er ovanpÃĨ en annan PDF", + "title": "Överlagra PDF:er" + }, "imageToPDF": { "title": "Bild till PDF", "desc": "Konvertera en bild (PNG, JPEG, GIF) till PDF." @@ -355,18 +786,6 @@ "title": "PDF till bild", "desc": "Konvertera en PDF till en bild. (PNG, JPEG, GIF)" }, - "pdfOrganiser": { - "title": "Ordna", - "desc": "Ta bort/ordna om sidor i valfri ordning" - }, - "addImage": { - "title": "Lägg till bild", - "desc": "Lägger till en bild pÃĨ en angiven plats i PDF:en (pÃĨgÃĨr arbete)" - }, - "watermark": { - "title": "Lägg till vattenstämpel", - "desc": "Lägg till en anpassad vattenstämpel till ditt PDF-dokument." - }, "permissions": { "title": "Ändra behÃļrigheter", "desc": "Ändra behÃļrigheterna fÃļr ditt PDF-dokument" @@ -375,38 +794,10 @@ "title": "Ta bort", "desc": "Ta bort oÃļnskade sidor frÃĨn ditt PDF-dokument." }, - "addPassword": { - "title": "Lägg till lÃļsenord", - "desc": "Kryptera ditt PDF-dokument med ett lÃļsenord." - }, - "removePassword": { - "title": "Ta bort lÃļsenord", - "desc": "Ta bort lÃļsenordsskydd frÃĨn ditt PDF-dokument." - }, - "compress": { - "title": "Komprimera", - "desc": "Komprimera PDF-filer fÃļr att minska deras filstorlek." - }, - "unlockPDFForms": { - "title": "Unlock PDF Forms", - "desc": "Remove read-only property of form fields in a PDF document." - }, - "changeMetadata": { - "title": "Ändra metadata", - "desc": "Ändra/ta bort/lägg till metadata frÃĨn ett PDF-dokument" - }, "fileToPDF": { "title": "Konvertera fil till PDF", "desc": "Konvertera nästan vilken fil som helst till PDF (DOCX, PNG, XLS, PPT, TXT och mer)" }, - "ocr": { - "title": "OCR / Rensningsskanningar", - "desc": "RengÃļr skanningar och upptäcker text frÃĨn bilder i en PDF och lägger till den igen som text." - }, - "extractImages": { - "title": "Extrahera bilder", - "desc": "Extraherar alla bilder frÃĨn en PDF och sparar dem till zip" - }, "pdfToPDFA": { "title": "PDF till PDF/A", "desc": "Konvertera PDF till PDF/A fÃļr lÃĨngtidslagring" @@ -435,70 +826,14 @@ "title": "Detektera/Dela skannade foton", "desc": "Delar flera foton frÃĨn ett foto/PDF" }, - "sign": { - "title": "Signera", - "desc": "Lägger till signatur till PDF genom ritning, text eller bild" - }, - "flatten": { - "title": "Platta till", - "desc": "Ta bort alla interaktiva element och formulär frÃĨn en PDF" - }, - "repair": { - "title": "Reparera", - "desc": "FÃļrsÃļker reparera en korrupt/trasig PDF" - }, - "removeBlanks": { - "title": "Ta bort tomma sidor", - "desc": "Känner av och tar bort tomma sidor frÃĨn ett dokument" - }, - "removeAnnotations": { - "title": "Ta bort anteckningar", - "desc": "Tar bort alla kommentarer/anteckningar frÃĨn en PDF" - }, - "compare": { - "title": "JämfÃļr", - "desc": "JämfÃļr och visar skillnaderna mellan 2 PDF-dokument" - }, - "certSign": { - "title": "Signera med certifikat", - "desc": "Signerar en PDF med ett certifikat/nyckel (PEM/P12)" - }, - "removeCertSign": { - "title": "Ta bort certifikatsignatur", - "desc": "Ta bort certifikatsignatur frÃĨn PDF" - }, - "pageLayout": { - "title": "Flersidigt layout", - "desc": "SlÃĨ samman flera sidor av ett PDF-dokument till en enda sida" - }, - "scalePages": { - "title": "Justera sidstorlek/skala", - "desc": "Ändra storleken/skalan pÃĨ sidan och/eller dess innehÃĨll." - }, "pipeline": { "title": "Pipeline (Avancerat)", "desc": "KÃļr flera ÃĨtgärder pÃĨ PDF:er genom att definiera pipeline-skript" }, - "addPageNumbers": { - "title": "Lägg till sidnummer", - "desc": "Lägg till sidnummer genom hela dokumentet pÃĨ en angiven plats" - }, "auto-rename": { "title": "Automatiskt byt namn pÃĨ PDF-fil", "desc": "Byter automatiskt namn pÃĨ en PDF-fil baserat pÃĨ dess detekterade rubrik" }, - "adjustContrast": { - "title": "Justera färger/kontrast", - "desc": "Justera kontrast, mättnad och ljusstyrka i en PDF" - }, - "crop": { - "title": "Beskär PDF", - "desc": "Beskär en PDF fÃļr att minska dess storlek (behÃĨller text!)" - }, - "autoSplitPDF": { - "title": "Auto-dela sidor", - "desc": "Auto-dela skannad PDF med fysisk skannad sidseparator QR-kod" - }, "sanitizePDF": { "title": "Sanera", "desc": "Ta bort skript och andra element frÃĨn PDF-filer" @@ -519,30 +854,14 @@ "title": "PDF till Markdown", "desc": "Konvertera PDF till Markdown" }, - "getPdfInfo": { - "title": "Hämta ALL information om PDF", - "desc": "Hämtar all mÃļjlig information om PDF:er" - }, "pageExtracter": { "title": "Extrahera sida(or)", "desc": "Extraherar valda sidor frÃĨn PDF" }, - "pdfToSinglePage": { - "title": "PDF till en enda stor sida", - "desc": "SlÃĨr samman alla PDF-sidor till en enda stor sida" - }, - "showJS": { - "title": "Visa Javascript", - "desc": "SÃļker och visar eventuell JS som injicerats i en PDF" - }, "autoRedact": { "title": "Auto-redigera", "desc": "Auto-redigerar (svärtar) text i en PDF baserat pÃĨ inmatad text" }, - "redact": { - "title": "Manual Redaction", - "desc": "Redacts a PDF based on selected text, drawn shapes and/or selected page(s)" - }, "PDFToCSV": { "title": "PDF till CSV", "desc": "Extraherar tabeller frÃĨn en PDF och konverterar dem till CSV" @@ -551,10 +870,6 @@ "title": "Auto-dela efter storlek/antal", "desc": "Dela en enda PDF till flera dokument baserat pÃĨ storlek, sidantal eller dokumentantal" }, - "overlay-pdfs": { - "title": "Överlagra PDF:er", - "desc": "Överlagrar PDF:er ovanpÃĨ en annan PDF" - }, "split-by-sections": { "title": "Dela PDF efter sektioner", "desc": "Dela varje sida av en PDF i mindre horisontella och vertikala sektioner" @@ -563,43 +878,17 @@ "title": "Lägg till stämpel pÃĨ PDF", "desc": "Lägg till text eller bildstämplar pÃĨ angivna platser" }, - "removeImage": { - "title": "Ta bort bild", - "desc": "Ta bort bild frÃĨn PDF fÃļr att minska filstorlek" - }, - "splitByChapters": { - "title": "Dela upp PDF efter kapitel", - "desc": "Dela upp en PDF till flera filer baserat pÃĨ dess kapitelstruktur." - }, - "validateSignature": { - "title": "Validera PDF signature", - "desc": "Verifiera digitala signaturer och certifiakt i PDF dokument" - }, "replace-color": { "title": "Ersätt och Invertera färg", "desc": "Ersätt färg fÃļr text och bakgrund i PDF och invertera hela färgen pÃĨ PDF fÃļr att minska filstorlek" }, - "convert": { - "title": "Konvertera" - }, "attachments": { "title": "Add attachments" }, - "extractPages": { - "title": "Extrahera sidor" - }, - "removePages": { - "title": "Ta bort", - "desc": "Ta bort oÃļnskade sidor frÃĨn ditt PDF-dokument." - }, "removeImagePdf": { "title": "Ta bort bild", "desc": "Ta bort bild frÃĨn PDF fÃļr att minska filstorlek" }, - "autoSizeSplitPDF": { - "title": "Auto-dela efter storlek/antal", - "desc": "Dela en enda PDF till flera dokument baserat pÃĨ storlek, sidantal eller dokumentantal" - }, "adjust-contrast": { "title": "Justera färger/kontrast", "desc": "Justera kontrast, mättnad och ljusstyrka i en PDF" @@ -607,11 +896,12 @@ "replaceColorPdf": { "title": "Ersätt och Invertera färg", "desc": "Ersätt färg fÃļr text och bakgrund i PDF och invertera hela färgen pÃĨ PDF fÃļr att minska filstorlek" - }, - "changePermissions": { - "title": "Ändra behÃļrigheter" } }, + "landing": { + "addFiles": "Add Files", + "uploadFromComputer": "Upload from computer" + }, "viewPdf": { "tags": "visa,läs,kommentera,text,bild", "title": "View/Edit PDF", @@ -645,17 +935,39 @@ "merge": { "tags": "sammanfoga,Sidoperationer,Backend,serversida", "title": "Sammanfoga", + "removeDigitalSignature": { + "label": "Remove digital signature in the merged file?", + "tooltip": { + "title": "Remove Digital Signature", + "description": "Digital signatures will be invalidated when merging files. Check this to remove them from the final merged PDF." + } + }, + "generateTableOfContents": { + "label": "Generate table of contents in the merged file?", + "tooltip": { + "title": "Generate Table of Contents", + "description": "Automatically creates a clickable table of contents in the merged PDF based on the original file names and page numbers." + } + }, + "submit": "SlÃĨ samman", + "sortBy": { + "description": "Files will be merged in the order they're selected. Drag to reorder or sort below.", + "label": "Sort By", + "filename": "Filnamn", + "dateModified": "Date Modified", + "ascending": "Ascending", + "descending": "Descending", + "sort": "Sort" + }, + "error": { + "failed": "An error occurred while merging the PDFs." + }, "header": "SlÃĨ samman flera PDF-filer (2+)", "sortByName": "Sortera efter namn", "sortByDate": "Sortera efter datum", - "removeCertSign": "Ta bort digital signatur i den sammanslagna filen?", - "submit": "SlÃĨ samman", - "sortBy": { - "filename": "Filnamn" - } + "removeCertSign": "Ta bort digital signatur i den sammanslagna filen?" }, "split": { - "tags": "Sidoperationer,dela,Multisida,klippa,serversida", "title": "Dela upp PDF", "header": "Dela upp PDF", "desc": { @@ -671,25 +983,249 @@ "splitPages": "Ange sidor att dela pÃĨ:", "submit": "Dela", "steps": { + "chooseMethod": "Choose Method", "settings": "Inställningar" }, + "settings": { + "selectMethodFirst": "Please select a split method first" + }, + "error": { + "failed": "An error occurred while splitting the PDF." + }, + "method": { + "label": "Choose split method", + "placeholder": "Select how to split the PDF" + }, "methods": { + "prefix": { + "splitAt": "Split at", + "splitBy": "Split by" + }, + "byPages": { + "name": "Page Numbers", + "desc": "Extract specific pages (1,3,5-10)", + "tooltip": "Enter page numbers separated by commas or ranges with hyphens" + }, + "bySections": { + "name": "Sections", + "desc": "Divide pages into grid sections", + "tooltip": "Split each page into horizontal and vertical sections" + }, "bySize": { - "name": "Filstorlek" + "name": "Filstorlek", + "desc": "Limit maximum file size", + "tooltip": "Specify maximum file size (e.g. 10MB, 500KB)" + }, + "byPageCount": { + "name": "Page Count", + "desc": "Fixed pages per file", + "tooltip": "Enter the number of pages for each split file" + }, + "byDocCount": { + "name": "Document Count", + "desc": "Create specific number of files", + "tooltip": "Enter how many files you want to create" + }, + "byChapters": { + "name": "Chapters", + "desc": "Split at bookmark boundaries", + "tooltip": "Uses PDF bookmarks to determine split points" + }, + "byPageDivider": { + "name": "Page Divider", + "desc": "Auto-split with divider sheets", + "tooltip": "Use QR code divider sheets between documents when scanning" } }, "value": { "fileSize": { - "label": "Filstorlek" + "label": "Filstorlek", + "placeholder": "e.g. 10MB, 500KB" + }, + "pageCount": { + "label": "Pages per File", + "placeholder": "e.g. 5, 10" + }, + "docCount": { + "label": "Number of Files", + "placeholder": "e.g. 3, 5" } - } + }, + "tooltip": { + "header": { + "title": "Split Methods Overview" + }, + "byPages": { + "title": "Split at Page Numbers", + "text": "Split your PDF at specific page numbers. Using 'n' splits after page n. Using 'n-m' splits before page n and after page m.", + "bullet1": "Single split points: 3,7 (splits after pages 3 and 7)", + "bullet2": "Range split points: 3-8 (splits before page 3 and after page 8)", + "bullet3": "Mixed: 2,5-10,15 (splits after page 2, before page 5, after page 10, and after page 15)" + }, + "bySections": { + "title": "Split by Grid Sections", + "text": "Divide each page into a grid of sections. Useful for splitting documents with multiple columns or extracting specific areas.", + "bullet1": "Horizontal: Number of rows to create", + "bullet2": "Vertical: Number of columns to create", + "bullet3": "Merge: Combine all sections into one PDF" + }, + "bySize": { + "title": "Split by File Size", + "text": "Create multiple PDFs that don't exceed a specified file size. Ideal for file size limitations or email attachments.", + "bullet1": "Use MB for larger files (e.g., 10MB)", + "bullet2": "Use KB for smaller files (e.g., 500KB)", + "bullet3": "System will split at page boundaries" + }, + "byCount": { + "title": "Split by Count", + "text": "Create multiple PDFs with a specific number of pages or documents each.", + "bullet1": "Page Count: Fixed number of pages per file", + "bullet2": "Document Count: Fixed number of output files", + "bullet3": "Useful for batch processing workflows" + }, + "byChapters": { + "title": "Split by Chapters", + "text": "Use PDF bookmarks to automatically split at chapter boundaries. Requires PDFs with bookmark structure.", + "bullet1": "Bookmark Level: Which level to split on (1=top level)", + "bullet2": "Include Metadata: Preserve document properties", + "bullet3": "Allow Duplicates: Handle repeated bookmark names" + }, + "byDocCount": { + "bullet1": "Enter the number of output files you want", + "bullet2": "Pages are distributed as evenly as possible", + "bullet3": "Useful when you need a specific number of files", + "text": "Create a specific number of output files by evenly distributing pages across them.", + "title": "Split by Document Count" + }, + "byPageCount": { + "bullet1": "Enter the number of pages per output file", + "bullet2": "Last file may have fewer pages if not evenly divisible", + "bullet3": "Useful for batch processing workflows", + "text": "Create multiple PDFs with a specific number of pages each. Perfect for creating uniform document chunks.", + "title": "Split by Page Count" + }, + "byPageDivider": { + "bullet1": "Print divider sheets from the download link", + "bullet2": "Insert divider sheets between your documents", + "bullet3": "Scan all documents together as one PDF", + "bullet4": "Upload - divider pages are automatically detected and removed", + "bullet5": "Enable Duplex Mode if scanning both sides of divider sheets", + "text": "Automatically split scanned documents using physical divider sheets with QR codes. Perfect for processing multiple documents scanned together.", + "title": "Split by Page Divider" + } + }, + "methodSelection": { + "tooltip": { + "bullet1": "Click on a method card to select it", + "bullet2": "Hover over each card to see a quick description", + "bullet3": "The settings step will appear after you select a method", + "bullet4": "You can change methods at any time before processing", + "header": { + "text": "Choose how you want to split your PDF document. Each method is optimized for different use cases and document types.", + "title": "Split Method Selection" + }, + "title": "Choose Your Split Method" + } + }, + "selectMethod": "Select a split method", + "tags": "Sidoperationer,dela,Multisida,klippa,serversida" }, "rotate": { - "tags": "serversida", "title": "Rotera PDF", + "submit": "Rotera", + "selectRotation": "Select Rotation Angle (Clockwise)", + "error": { + "failed": "An error occurred while rotating the PDF." + }, + "preview": { + "title": "Rotation Preview" + }, + "rotateLeft": "Rotate Anticlockwise", + "rotateRight": "Rotate Clockwise", + "tooltip": { + "header": { + "title": "Rotate Settings Overview" + }, + "description": { + "text": "Rotate your PDF pages clockwise or anticlockwise in 90-degree increments. All pages in the PDF will be rotated. The preview shows how your document will look after rotation." + }, + "controls": { + "title": "Controls", + "text": "Use the rotation buttons to adjust orientation. Left button rotates anticlockwise, right button rotates clockwise. Each click rotates by 90 degrees." + } + }, + "tags": "serversida", "header": "Rotera PDF", - "selectAngle": "Välj rotationsvinkel (i multipler av 90 grader):", - "submit": "Rotera" + "selectAngle": "Välj rotationsvinkel (i multipler av 90 grader):" + }, + "convert": { + "title": "Konvertera", + "desc": "Convert files between different formats", + "files": "Files", + "selectFilesPlaceholder": "Select files in the main view to get started", + "settings": "Inställningar", + "conversionCompleted": "Conversion completed", + "results": "Results", + "defaultFilename": "converted_file", + "conversionResults": "Conversion Results", + "convertFrom": "Convert from", + "convertTo": "Convert to", + "sourceFormatPlaceholder": "Source format", + "targetFormatPlaceholder": "Target format", + "selectSourceFormatFirst": "Select a source format first", + "outputOptions": "Output Options", + "pdfOptions": "PDF Options", + "imageOptions": "Image Options", + "colorType": "Colour Type", + "color": "Färg", + "greyscale": "GrÃĨskala", + "blackwhite": "Black & White", + "dpi": "DPI", + "output": "Output", + "single": "Single", + "multiple": "Multiple", + "fitOption": "Fit Option", + "maintainAspectRatio": "Maintain Aspect Ratio", + "fitDocumentToPage": "Fit Document to Page", + "fillPage": "Fyll sida", + "autoRotate": "Auto Rotate", + "autoRotateDescription": "Automatically rotate images to better fit the PDF page", + "combineImages": "Combine Images", + "combineImagesDescription": "Combine all images into one PDF, or create separate PDFs for each image", + "webOptions": "Web to PDF Options", + "zoomLevel": "Zoom Level", + "emailOptions": "Email to PDF Options", + "includeAttachments": "Include email attachments", + "maxAttachmentSize": "Maximum attachment size (MB)", + "includeAllRecipients": "Include CC and BCC recipients in header", + "downloadHtml": "Download HTML intermediate file instead of PDF", + "pdfaOptions": "PDF/A Options", + "outputFormat": "Output Format", + "pdfaNote": "PDF/A-1b is more compatible, PDF/A-2b supports more features.", + "pdfaDigitalSignatureWarning": "PDF:en innehÃĨller en digital signatur. Denna kommer att tas bort i nästa steg.", + "fileFormat": "File Format", + "wordDoc": "Word Document", + "wordDocExt": "Word Document (.docx)", + "odtExt": "OpenDocument Text (.odt)", + "pptExt": "PowerPoint (.pptx)", + "odpExt": "OpenDocument Presentation (.odp)", + "txtExt": "Plain Text (.txt)", + "rtfExt": "Rich Text Format (.rtf)", + "selectedFiles": "Selected files", + "noFileSelected": "No file selected. Use the file panel to add files.", + "convertFiles": "Convert Files", + "converting": "Converting...", + "downloadConverted": "Download Converted File", + "errorNoFiles": "Please select at least one file to convert.", + "errorNoFormat": "Please select both source and target formats.", + "errorNotSupported": "Conversion from {{from}} to {{to}} is not supported.", + "images": "Images", + "officeDocs": "Office Documents (Word, Excel, PowerPoint)", + "imagesExt": "Images (JPG, PNG, etc.)", + "markdown": "Markdown", + "textRtf": "Text/RTF", + "grayscale": "GrÃĨskala", + "errorConversion": "An error occurred while converting the file." }, "imageToPdf": { "tags": "konvertering,img,jpg,bild,foto" @@ -727,7 +1263,33 @@ "8": "Ta bort sista", "9": "Ta bort fÃļrsta och sista", "10": "Udda-jämn sammanslagning", - "11": "Duplicate all pages" + "11": "Duplicate all pages", + "desc": { + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, â€Ļ).", + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, â€Ļ).", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimized for binding on the side)." + } + }, + "desc": { + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, â€Ļ).", + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, â€Ļ).", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimised for binding on the side).", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document." }, "placeholder": "(t.ex. 1,3,2 eller 4-8,2,10-12 eller 2n-1)" }, @@ -739,9 +1301,198 @@ "upload": "Lägg till bild", "submit": "Lägg till bild" }, + "attachments": { + "tags": "embed,attach,file,attachment,attachments", + "title": "Add attachments", + "header": "Add attachments", + "add": "Add Attachment", + "remove": "Remove Attachment", + "embed": "Embed Attachment", + "submit": "Add attachments" + }, "watermark": { - "tags": "Text,upprepande,etikett,egen,upphovsrätt,varumärke,img,jpg,bild,foto", "title": "Lägg till vattenstämpel", + "desc": "Add text or image watermarks to PDF files", + "completed": "Watermark added", + "submit": "Lägg till vattenstämpel", + "filenamePrefix": "watermarked", + "error": { + "failed": "An error occurred while adding watermark to the PDF." + }, + "watermarkType": { + "text": "Text", + "image": "Image" + }, + "settings": { + "type": "Watermark Type", + "text": { + "label": "Watermark Text", + "placeholder": "Enter watermark text" + }, + "image": { + "label": "Watermark Image", + "choose": "Choose Image", + "selected": "Selected: {{filename}}" + }, + "fontSize": "Teckenstorlek", + "size": "Size", + "alphabet": "Font/Language", + "color": "Watermark Colour", + "rotation": "Rotation (degrees)", + "opacity": "Opacity (%)", + "spacing": { + "horizontal": "Horizontal Spacing", + "vertical": "Vertical Spacing", + "height": "Height Spacing", + "width": "Width Spacing" + }, + "convertToImage": "Flatten PDF pages to images" + }, + "alphabet": { + "roman": "Roman/Latin", + "arabic": "Arabic", + "japanese": "Japanese", + "korean": "Korean", + "chinese": "Chinese", + "thai": "Thai" + }, + "steps": { + "type": "Watermark Type", + "wording": "Wording", + "textStyle": "Style", + "formatting": "Formatting", + "file": "Watermark File" + }, + "results": { + "title": "Watermark Results" + }, + "tooltip": { + "language": { + "title": "Language Support", + "text": "Choose the appropriate language setting to ensure proper font rendering for your text." + }, + "appearance": { + "title": "Appearance Settings", + "text": "Control how your watermark looks and blends with the document.", + "bullet1": "Rotation: -360° to 360° for angled watermarks", + "bullet2": "Opacity: 0-100% for transparency control", + "bullet3": "Lower opacity creates subtle watermarks" + }, + "spacing": { + "title": "Spacing Control", + "text": "Adjust the spacing between repeated watermarks across the page.", + "bullet1": "Width spacing: Horizontal distance between watermarks", + "bullet2": "Height spacing: Vertical distance between watermarks", + "bullet3": "Higher values create more spread out patterns" + }, + "type": { + "header": { + "title": "Watermark Type Selection" + }, + "description": { + "title": "Choose Your Watermark", + "text": "Select between text or image watermarks based on your needs." + }, + "text": { + "title": "Text Watermarks", + "text": "Perfect for adding copyright notices, company names, or confidentiality labels. Supports multiple languages and custom colours.", + "bullet1": "Customisable fonts and languages", + "bullet2": "Adjustable colours and transparency", + "bullet3": "Ideal for legal or branding text" + }, + "image": { + "title": "Image Watermarks", + "text": "Use logos, stamps, or any image as a watermark. Great for branding and visual identification.", + "bullet1": "Upload any image format", + "bullet2": "Maintains image quality", + "bullet3": "Perfect for logos and stamps" + } + }, + "wording": { + "header": { + "title": "Text Content" + }, + "text": { + "title": "Watermark Text", + "text": "Enter the text that will appear as your watermark across the document.", + "bullet1": "Keep it concise for better readability", + "bullet2": "Common examples: 'CONFIDENTIAL', 'DRAFT', company name", + "bullet3": "Emoji characters are not supported and will be filtered out" + } + }, + "textStyle": { + "header": { + "title": "Text Style" + }, + "color": { + "title": "Colour Selection", + "text": "Choose a colour that provides good contrast with your document content.", + "bullet1": "Light grey (#d3d3d3) for subtle watermarks", + "bullet2": "Black or dark colours for high contrast", + "bullet3": "Custom colours for branding purposes" + }, + "language": { + "title": "Language Support", + "text": "Choose the appropriate language setting to ensure proper font rendering." + } + }, + "file": { + "header": { + "title": "Image Upload" + }, + "upload": { + "title": "Image Selection", + "text": "Upload an image file to use as your watermark.", + "bullet1": "Supports common formats: PNG, JPG, GIF, BMP", + "bullet2": "PNG with transparency works best", + "bullet3": "Higher resolution images maintain quality better" + }, + "recommendations": { + "title": "Best Practices", + "text": "Tips for optimal image watermark results.", + "bullet1": "Use logos or stamps with transparent backgrounds", + "bullet2": "Simple designs work better than complex images", + "bullet3": "Consider the final document size when choosing resolution" + } + }, + "formatting": { + "header": { + "title": "Formatting & Layout" + }, + "size": { + "title": "Size Control", + "text": "Adjust the size of your watermark (text or image).", + "bullet1": "Larger sizes create more prominent watermarks" + }, + "appearance": { + "title": "Appearance Settings", + "text": "Control how your watermark looks and blends with the document.", + "bullet1": "Rotation: -360° to 360° for angled watermarks", + "bullet2": "Opacity: 0-100% for transparency control", + "bullet3": "Lower opacity creates subtle watermarks" + }, + "spacing": { + "title": "Spacing Control", + "text": "Adjust the spacing between repeated watermarks across the page.", + "bullet1": "Horizontal spacing: Distance between watermarks left to right", + "bullet2": "Vertical spacing: Distance between watermarks top to bottom", + "bullet3": "Higher values create more spread out patterns" + }, + "security": { + "title": "Security Option", + "text": "Convert the final PDF to an image-based format for enhanced security.", + "bullet1": "Prevents text selection and copying", + "bullet2": "Makes watermarks harder to remove", + "bullet3": "Results in larger file sizes", + "bullet4": "Best for sensitive or copyrighted content" + } + } + }, + "type": { + "1": "Text", + "2": "Bild" + }, + "tags": "Text,upprepande,etikett,egen,upphovsrätt,varumärke,img,jpg,bild,foto", "header": "Lägg till vattenstämpel", "customColor": "Anpassad textfärg", "selectText": { @@ -755,14 +1506,6 @@ "8": "Vattenstämpeltyp:", "9": "Vattenstämpelbild:", "10": "Konvertera PDF till PDF-bild" - }, - "submit": "Lägg till vattenstämpel", - "type": { - "1": "Text", - "2": "Bild" - }, - "settings": { - "fontSize": "Teckenstorlek" } }, "permissions": { @@ -787,50 +1530,201 @@ "removePages": { "tags": "Ta bort sidor,radera sidor", "title": "Ta bort", + "pageNumbers": { + "label": "Pages to Remove", + "placeholder": "e.g., 1,3,5-8,10", + "error": "Invalid page number format. Use numbers, ranges (1-5), or mathematical expressions (2n+1)" + }, + "filenamePrefix": "pages_removed", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "settings": { + "title": "Settings" + }, + "tooltip": { + "header": { + "title": "Remove Pages Settings" + }, + "pageNumbers": { + "title": "Page Selection", + "text": "Specify which pages to remove from your PDF. You can select individual pages, ranges, or use mathematical expressions.", + "bullet1": "Individual pages: 1,3,5 (removes pages 1, 3, and 5)", + "bullet2": "Page ranges: 1-5,10-15 (removes pages 1-5 and 10-15)", + "bullet3": "Mathematical: 2n+1 (removes odd pages)", + "bullet4": "Open ranges: 5- (removes from page 5 to end)" + }, + "examples": { + "title": "Common Examples", + "text": "Here are some common page selection patterns:", + "bullet1": "Remove first page: 1", + "bullet2": "Remove last 3 pages: -3", + "bullet3": "Remove every other page: 2n", + "bullet4": "Remove specific scattered pages: 1,5,10,15" + }, + "safety": { + "title": "Safety Tips", + "text": "Important considerations when removing pages:", + "bullet1": "Always preview your selection before processing", + "bullet2": "Keep a backup of your original file", + "bullet3": "Page numbers start from 1, not 0", + "bullet4": "Invalid page numbers will be ignored" + } + }, + "error": { + "failed": "An error occurred whilst removing pages." + }, + "results": { + "title": "Page Removal Results" + }, "submit": "Ta bort" }, - "addPassword": { - "tags": "säkra,säkerhet", - "title": "Lägg till lÃļsenord", - "header": "Lägg till lÃļsenord (kryptera)", - "selectText": { - "1": "Välj PDF att kryptera", - "2": "LÃļsenord", - "3": "Längd pÃĨ krypteringsnyckeln", - "4": "HÃļgre värden är starkare, men lägre värden har bättre kompatibilitet.", - "5": "BehÃļrigheter att ställa in", - "6": "FÃļrhindra sammansättning av dokument", - "7": "FÃļrhindra innehÃĨllsextraktion", - "8": "FÃļrhindra extraktion fÃļr tillgänglighet", - "9": "FÃļrhindra att fylla i formulär", - "10": "FÃļrhindra modifiering", - "11": "FÃļrhindra anteckningsändring", - "12": "FÃļrhindra utskrift", - "13": "FÃļrhindra utskrift av olika format", - "14": "ÄgarlÃļsenord", - "15": "Begränsar vad som kan gÃļras med dokumentet när det väl är Ãļppnat (StÃļds inte av alla läsare)", - "16": "Begränsar Ãļppnandet av själva dokumentet" + "extractPages": { + "title": "Extract Pages", + "pageNumbers": { + "label": "Pages to Extract", + "placeholder": "e.g., 1,3,5-8 or odd & 1-10" + }, + "settings": { + "title": "Settings" }, - "submit": "Kryptera", "tooltip": { - "permissions": { - "title": "Ändra behÃļrigheter" + "description": "Extracts the selected pages into a new PDF, preserving order." + }, + "error": { + "failed": "Failed to extract pages" + }, + "results": { + "title": "Pages Extracted" + }, + "submit": "Extract Pages" + }, + "pageSelection": { + "tooltip": { + "header": { + "title": "Page Selection Guide" + }, + "basic": { + "title": "Basic Usage", + "text": "Select specific pages from your PDF document using simple syntax.", + "bullet1": "Individual pages: 1,3,5", + "bullet2": "Page ranges: 3-6 or 10-15", + "bullet3": "All pages: all" + }, + "advanced": { + "title": "Advanced Features" + }, + "tips": { + "title": "Tips", + "text": "Keep these guidelines in mind:", + "bullet1": "Page numbers start from 1 (not 0)", + "bullet2": "Spaces are automatically removed", + "bullet3": "Invalid expressions are ignored" + }, + "syntax": { + "title": "Syntax Basics", + "text": "Use numbers, ranges, keywords, and progressions (n starts at 0). Parentheses are supported.", + "bullets": { + "numbers": "Numbers/ranges: 5, 10-20", + "keywords": "Keywords: odd, even", + "progressions": "Progressions: 3n, 4n+1" + } + }, + "operators": { + "title": "Operators", + "text": "AND has higher precedence than comma. NOT applies within the document range.", + "and": "AND: & or \"and\" — require both conditions (e.g., 1-50 & even)", + "comma": "Comma: , or | — combine selections (e.g., 1-10, 20)", + "not": "NOT: ! or \"not\" — exclude pages (e.g., 3n & not 30)" + }, + "examples": { + "title": "Examples" + }, + "complex": { + "bullet1": "1,3-5,8,2n → pages 1, 3–5, 8, plus evens", + "bullet2": "10-,2n-1 → from page 10 to end + odd pages", + "description": "Mix different types.", + "title": "Complex Combinations" + }, + "description": "Choose which pages to use for the operation. Supports single pages, ranges, formulas, and the all keyword.", + "individual": { + "bullet1": "1,3,5 → selects pages 1, 3, 5", + "bullet2": "2,7,12 → selects pages 2, 7, 12", + "description": "Enter numbers separated by commas.", + "title": "Individual Pages" + }, + "mathematical": { + "bullet1": "2n → all even pages (2, 4, 6â€Ļ)", + "bullet2": "2n-1 → all odd pages (1, 3, 5â€Ļ)", + "bullet3": "3n → every 3rd page (3, 6, 9â€Ļ)", + "bullet4": "4n-1 → pages 3, 7, 11, 15â€Ļ", + "description": "Use n in formulas for patterns.", + "title": "Mathematical Functions" + }, + "ranges": { + "bullet1": "3-6 → selects pages 3–6", + "bullet2": "10-15 → selects pages 10–15", + "bullet3": "5- → selects pages 5 to end", + "description": "Use - for consecutive pages.", + "title": "Page Ranges" + }, + "special": { + "bullet1": "all → selects all pages", + "title": "Special Keywords" } } }, - "removePassword": { - "tags": "säkra,Dekryptera,säkerhet,ta bort lÃļsenord,radera lÃļsenord", - "title": "Ta bort lÃļsenord", - "header": "Ta bort lÃļsenord (Dekryptera)", - "selectText": { - "1": "Välj PDF att dekryptera", - "2": "LÃļsenord" + "bulkSelection": { + "syntaxError": "There is a syntax issue. See Page Selection tips for help.", + "header": { + "title": "Page Selection Guide" }, - "submit": "Ta bort", - "desc": "Ta bort lÃļsenordsskydd frÃĨn ditt PDF-dokument.", - "password": { - "stepTitle": "Ta bort lÃļsenord", - "label": "Nuvarande lÃļsenord" + "syntax": { + "title": "Syntax Basics", + "text": "Use numbers, ranges, keywords, and progressions (n starts at 0). Parentheses are supported.", + "bullets": { + "numbers": "Numbers/ranges: 5, 10-20", + "keywords": "Keywords: odd, even", + "progressions": "Progressions: 3n, 4n+1" + } + }, + "operators": { + "title": "Operators", + "text": "AND has higher precedence than comma. NOT applies within the document range.", + "and": "AND: & or \"and\" — require both conditions (e.g., 1-50 & even)", + "comma": "Comma: , or | — combine selections (e.g., 1-10, 20)", + "not": "NOT: ! or \"not\" — exclude pages (e.g., 3n & not 30)" + }, + "examples": { + "title": "Examples", + "first50": "First 50", + "last50": "Last 50", + "every3rd": "Every 3rd", + "oddWithinExcluding": "Odd within 1-20 excluding 5-7", + "combineSets": "Combine sets" + }, + "firstNPages": { + "title": "First N Pages", + "placeholder": "Number of pages" + }, + "lastNPages": { + "title": "Last N Pages", + "placeholder": "Number of pages" + }, + "everyNthPage": { + "title": "Every Nth Page", + "placeholder": "Step size" + }, + "range": { + "title": "Range", + "fromPlaceholder": "From", + "toPlaceholder": "To" + }, + "keywords": { + "title": "Keywords" + }, + "advanced": { + "title": "Advanced" } }, "compressPdfs": { @@ -840,12 +1734,142 @@ "tags": "remove,delete,form,field,readonly", "title": "Remove Read-Only from Form Fields", "header": "Unlock PDF Forms", - "submit": "Remove" + "submit": "Remove", + "description": "This tool will remove read-only restrictions from PDF form fields, making them editable and fillable.", + "filenamePrefix": "unlocked_forms", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst unlocking PDF forms." + }, + "results": { + "title": "Unlocked Forms Results" + } }, "changeMetadata": { - "tags": "Titel,fÃļrfattare,datum,skapelse,tid,utgivare,producent,statistik", - "title": "Titel:", "header": "Ändra metadata", + "submit": "Ändra", + "filenamePrefix": "metadata", + "settings": { + "title": "Metadata Settings" + }, + "standardFields": { + "title": "Standard Fields" + }, + "deleteAll": { + "label": "Remove Existing Metadata", + "checkbox": "Delete all metadata" + }, + "title": { + "label": "Title", + "placeholder": "Document title" + }, + "author": { + "label": "Author", + "placeholder": "Document author" + }, + "subject": { + "label": "Subject", + "placeholder": "Document subject" + }, + "keywords": { + "label": "Keywords", + "placeholder": "Document keywords" + }, + "creator": { + "label": "Creator", + "placeholder": "Document creator" + }, + "producer": { + "label": "Producer", + "placeholder": "Document producer" + }, + "dates": { + "title": "Date Fields" + }, + "creationDate": { + "label": "Creation Date", + "placeholder": "Creation date" + }, + "modificationDate": { + "label": "Modification Date", + "placeholder": "Modification date" + }, + "trapped": { + "label": "Trapped Status", + "unknown": "Unknown", + "true": "True", + "false": "False" + }, + "advanced": { + "title": "Advanced Options" + }, + "customFields": { + "title": "Custom Metadata", + "description": "Add custom metadata fields to the document", + "add": "Add Field", + "key": "Key", + "keyPlaceholder": "Custom key", + "value": "Value", + "valuePlaceholder": "Custom value", + "remove": "Remove" + }, + "results": { + "title": "Updated PDFs" + }, + "error": { + "failed": "An error occurred while changing the PDF metadata." + }, + "tooltip": { + "header": { + "title": "PDF Metadata Overview" + }, + "standardFields": { + "title": "Standard Fields", + "text": "Common PDF metadata fields that describe the document.", + "bullet1": "Title: Document name or heading", + "bullet2": "Author: Person who created the document", + "bullet3": "Subject: Brief description of content", + "bullet4": "Keywords: Search terms for the document", + "bullet5": "Creator/Producer: Software used to create the PDF" + }, + "dates": { + "title": "Date Fields", + "text": "When the document was created and modified.", + "bullet1": "Creation Date: When original document was made", + "bullet2": "Modification Date: When last changed" + }, + "options": { + "title": "Additional Options", + "text": "Custom fields and privacy controls.", + "bullet1": "Custom Metadata: Add your own key-value pairs", + "bullet2": "Trapped Status: High-quality printing setting", + "bullet3": "Delete All: Remove all metadata for privacy" + }, + "deleteAll": { + "title": "Remove Existing Metadata", + "text": "Complete metadata deletion to ensure privacy." + }, + "customFields": { + "title": "Custom Metadata", + "text": "Add your own custom key-value metadata pairs.", + "bullet1": "Add any custom fields relevant to your document", + "bullet2": "Examples: Department, Project, Version, Status", + "bullet3": "Both key and value are required for each entry" + }, + "advanced": { + "title": "Advanced Options", + "trapped": { + "title": "Trapped Status", + "description": "Indicates if document is prepared for high-quality printing.", + "bullet1": "True: Document has been trapped for printing", + "bullet2": "False: Document has not been trapped", + "bullet3": "Unknown: Trapped status is not specified" + } + } + }, + "tags": "Titel,fÃļrfattare,datum,skapelse,tid,utgivare,producent,statistik", "selectText": { "1": "Redigera de variabler du vill ändra", "2": "Ta bort all metadata", @@ -853,15 +1877,7 @@ "4": "Andra metadata:", "5": "Lägg till anpassad metadatapost" }, - "author": "FÃļrfattare:", - "creationDate": "Skapningsdatum (ÃĨÃĨÃĨÃĨ/MM/dd HH:mm:ss):", - "creator": "Skapare:", - "keywords": "SÃļkord:", - "modDate": "Ändringsdatum (ÃĨÃĨÃĨÃĨ/MM/dd HH:mm:ss):", - "producer": "Producent:", - "subject": "Ämne:", - "trapped": "FÃĨngad:", - "submit": "Ändra" + "modDate": "Ändringsdatum (ÃĨÃĨÃĨÃĨ/MM/dd HH:mm:ss):" }, "fileToPDF": { "tags": "transformation,format,dokument,bild,presentation,text,konvertering,kontor,dokument,word,excel,powerpoint", @@ -875,6 +1891,7 @@ "ocr": { "tags": "igenkänning,text,bild,skanna,läsa,identifiera,detektering,redigerbar", "title": "OCR / RengÃļring av skanningar", + "desc": "RengÃļr skanningar och upptäcker text frÃĨn bilder i en PDF och lägger till den igen som text.", "header": "RengÃļring av skanningar / OCR (Optisk teckenigenkänning)", "selectText": { "1": "Välj sprÃĨk som ska upptäckas i PDF:en (de listade är de som fÃļr närvarande identifieras):", @@ -893,23 +1910,89 @@ "help": "Vänligen läs denna dokumentation om hur du använder detta fÃļr andra sprÃĨk och/eller använder inte i docker", "credit": "Denna tjänst använder qpdf och Tesseract fÃļr OCR.", "submit": "Bearbeta PDF med OCR", - "desc": "RengÃļr skanningar och upptäcker text frÃĨn bilder i en PDF och lägger till den igen som text.", + "operation": { + "submit": "Process OCR and Review" + }, + "results": { + "title": "OCR Results" + }, + "languagePicker": { + "additionalLanguages": "Looking for additional languages?", + "viewSetupGuide": "View setup guide →" + }, "settings": { "title": "Inställningar", "ocrMode": { - "label": "OCR-läge" + "label": "OCR-läge", + "auto": "Auto (skip text layers)", + "force": "Force (re-OCR all, replace text)", + "strict": "Strict (abort if text found)" }, "languages": { - "label": "SprÃĨk" + "label": "SprÃĨk", + "placeholder": "Select languages" + }, + "compatibilityMode": { + "label": "Compatibility Mode" + }, + "advancedOptions": { + "label": "Processing Options", + "sidecar": "Create a text file", + "deskew": "Deskew pages", + "clean": "Clean input file", + "cleanFinal": "Clean final output" } }, "tooltip": { + "header": { + "title": "OCR Settings Overview" + }, "mode": { - "title": "OCR-läge" + "title": "OCR-läge", + "text": "Optical Character Recognition (OCR) helps you turn scanned or screenshotted pages into text you can search, copy, or highlight.", + "bullet1": "Auto skips pages that already contain text layers.", + "bullet2": "Force re-OCRs every page and replaces all the text.", + "bullet3": "Strict halts if any selectable text is found." }, "languages": { - "title": "SprÃĨk" + "title": "SprÃĨk", + "text": "Improve OCR accuracy by specifying the expected languages. Choose one or more languages to guide detection." + }, + "output": { + "title": "Output", + "text": "Decide how you want the text output formatted:", + "bullet1": "Searchable PDF embeds text behind the original image.", + "bullet2": "HOCR XML returns a structured machine-readable file.", + "bullet3": "Plain-text sidecar creates a separate .txt file with raw content." + }, + "advanced": { + "header": { + "title": "Advanced OCR Processing" + }, + "compatibility": { + "title": "Compatibility Mode", + "text": "Uses OCR 'sandwich PDF' mode: results in larger files, but more reliable with certain languages and older PDF software. By default we use hOCR for smaller, modern PDFs." + }, + "sidecar": { + "title": "Create Text File", + "text": "Generates a separate .txt file alongside the PDF containing all extracted text content for easy access and processing." + }, + "deskew": { + "title": "Deskew Pages", + "text": "Automatically corrects skewed or tilted pages to improve OCR accuracy. Useful for scanned documents that weren't perfectly aligned." + }, + "clean": { + "title": "Clean Input File", + "text": "Preprocesses the input by removing noise, enhancing contrast, and optimising the image for better OCR recognition before processing." + }, + "cleanFinal": { + "title": "Clean Final Output", + "text": "Post-processes the final PDF by removing OCR artefacts and optimising the text layer for better readability and smaller file size." + } } + }, + "error": { + "failed": "OCR operation failed" } }, "extractImages": { @@ -918,7 +2001,13 @@ "header": "Extrahera bilder", "selectText": "Välj bildformat att konvertera extraherade bilder till", "allowDuplicates": "Spara dubblettbilder", - "submit": "Extrahera" + "submit": "Extrahera", + "settings": { + "title": "Settings" + }, + "error": { + "failed": "An error occurred while extracting images from the PDF." + } }, "pdfToPDFA": { "tags": "arkiv,lÃĨngtids,standard,konvertering,lagring,bevarande", @@ -990,17 +2079,53 @@ }, "info": "Python är inte installerat. Det krävs fÃļr att kÃļra." }, + "scannerImageSplit": { + "title": "Extracted Images", + "submit": "Extract Image Scans", + "error": { + "failed": "An error occurred while extracting image scans." + }, + "tooltip": { + "title": "Photo Splitter", + "whatThisDoes": "What this does", + "whatThisDoesDesc": "Automatically finds and extracts each photo from a scanned page or composite image—no manual cropping.", + "whenToUse": "When to use", + "useCase1": "Scan whole album pages in one go", + "useCase2": "Split flatbed batches into separate files", + "useCase3": "Break collages into individual photos", + "useCase4": "Pull photos from documents", + "quickFixes": "Quick fixes", + "problem1": "Photos not detected → increase Tolerance to 30-50", + "problem2": "Too many false detections → increase Minimum Area to 15,000-20,000", + "problem3": "Crops are too tight → increase Border Size to 5-10", + "problem4": "Tilted photos not straightened → lower Angle Threshold to ~5°", + "problem5": "Dust/noise boxes → increase Minimum Contour Area to 1000-2000", + "setupTips": "Setup tips", + "tip1": "Use a plain, light background", + "tip2": "Leave a small gap (≈1 cm) between photos", + "tip3": "Scan at 300-600 DPI", + "tip4": "Clean the scanner glass", + "headsUp": "Heads-up", + "headsUpDesc": "Overlapping photos or backgrounds very close in colour to the photos can reduce accuracy-try a lighter or darker background and leave more space." + } + }, "sign": { - "tags": "auktorisera,initialer,ritad-signatur,text-signatur,bild-signatur", "title": "Signera", "header": "Signera PDF-filer", "upload": "Ladda upp bild", - "draw": "Rita signatur", - "text": "Textinmatning", + "draw": { + "title": "Draw your signature", + "clear": "Clear" + }, + "text": { + "name": "Signer Name", + "placeholder": "Enter your full name" + }, "clear": "Rensa", "add": "Lägg till", "saved": "Sparade signaturer", "save": "Spara signatur", + "applySignatures": "Apply Signatures", "personalSigs": "Personliga signaturer", "sharedSigs": "Delade signaturer", "noSavedSigs": "Inga sparade signaturer hittades", @@ -1012,42 +2137,179 @@ "previous": "FÃļregÃĨende sida", "maintainRatio": "Toggle maintain aspect ratio", "undo": "Undo", - "redo": "Redo" + "redo": "Redo", + "submit": "Sign Document", + "steps": { + "configure": "Configure Signature" + }, + "type": { + "title": "Signature Type", + "draw": "Draw", + "canvas": "Canvas", + "image": "Image", + "text": "Text" + }, + "image": { + "label": "Upload signature image", + "placeholder": "Select image file", + "hint": "Upload a PNG or JPG image of your signature" + }, + "instructions": { + "title": "How to add signature", + "canvas": "After drawing your signature in the canvas, close the modal then click anywhere on the PDF to place it.", + "image": "After uploading your signature image above, click anywhere on the PDF to place it.", + "text": "After entering your name above, click anywhere on the PDF to place your signature." + }, + "mode": { + "move": "Move Signature", + "place": "Place Signature" + }, + "updateAndPlace": "Update and Place", + "activate": "Activate Signature Placement", + "deactivate": "Stop Placing Signatures", + "results": { + "title": "Signature Results" + }, + "error": { + "failed": "An error occurred while signing the PDF." + }, + "tags": "auktorisera,initialer,ritad-signatur,text-signatur,bild-signatur" }, "flatten": { - "tags": "statisk,avaktivera,icke-interaktiv,effektivisera", "title": "Platta till", "header": "Platta till PDF-filer", "flattenOnlyForms": "Platta till endast formulär", "submit": "Platta till", + "filenamePrefix": "flattened", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, "steps": { "settings": "Inställningar" }, "options": { - "flattenOnlyForms": "Platta till endast formulär" - } + "stepTitle": "Flatten Options", + "title": "Flatten Options", + "flattenOnlyForms": { + "label": "Platta till endast formulär", + "desc": "Only flatten form fields, leaving other interactive elements intact" + }, + "note": "Flattening removes interactive elements from the PDF, making them non-editable." + }, + "results": { + "title": "Flatten Results" + }, + "error": { + "failed": "An error occurred while flattening the PDF." + }, + "tooltip": { + "header": { + "title": "About Flattening PDFs" + }, + "description": { + "title": "What does flattening do?", + "text": "Flattening makes your PDF non-editable by turning fillable forms and buttons into regular text and images. The PDF will look exactly the same, but no one can change or fill in the forms anymore. Perfect for sharing completed forms, creating final documents for records, or ensuring the PDF looks the same everywhere.", + "bullet1": "Text boxes become regular text (can't be edited)", + "bullet2": "Checkboxes and buttons become pictures", + "bullet3": "Great for final versions you don't want changed", + "bullet4": "Ensures consistent appearance across all devices" + }, + "formsOnly": { + "title": "What does 'Flatten only forms' mean?", + "text": "This option only removes the ability to fill in forms, but keeps other features working like clicking links, viewing bookmarks, and reading comments.", + "bullet1": "Forms become non-editable", + "bullet2": "Links still work when clicked", + "bullet3": "Comments and notes remain visible", + "bullet4": "Bookmarks still help you navigate" + } + }, + "tags": "statisk,avaktivera,icke-interaktiv,effektivisera" }, "repair": { "tags": "fixa,ÃĨterställa,korrigering,ÃĨterhämta", "title": "Reparera", "header": "Reparera PDF-filer", - "submit": "Reparera" + "submit": "Reparera", + "description": "This tool will attempt to repair corrupted or damaged PDF files. No additional settings are required.", + "filenamePrefix": "repaired", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst repairing the PDF." + }, + "results": { + "title": "Repair Results" + } }, "removeBlanks": { - "tags": "städa upp,effektivisera,icke-innehÃĨll,organisera", "title": "Ta bort tomrum", "header": "Ta bort tomma sidor", - "threshold": "TrÃļskelvärde:", + "settings": { + "title": "Settings" + }, + "threshold": { + "label": "Pixel Whiteness Threshold" + }, + "whitePercent": { + "label": "White Percentage Threshold", + "unit": "%" + }, + "includeBlankPages": { + "label": "Include detected blank pages" + }, + "tooltip": { + "header": { + "title": "Remove Blank Pages Settings" + }, + "threshold": { + "title": "Pixel Whiteness Threshold", + "text": "Controls how white a pixel must be to be considered 'white'. This helps determine what counts as a blank area on the page.", + "bullet1": "0 = Pure black (most restrictive)", + "bullet2": "128 = Medium grey", + "bullet3": "255 = Pure white (least restrictive)" + }, + "whitePercent": { + "title": "White Percentage Threshold", + "text": "Sets the minimum percentage of white pixels required for a page to be considered blank and removed.", + "bullet1": "Lower values (e.g., 80%) = More pages removed", + "bullet2": "Higher values (e.g., 95%) = Only very blank pages removed", + "bullet3": "Use higher values for documents with light backgrounds" + }, + "includeBlankPages": { + "title": "Include Detected Blank Pages", + "text": "When enabled, creates a separate PDF containing all the blank pages that were detected and removed from the original document.", + "bullet1": "Useful for reviewing what was removed", + "bullet2": "Helps verify the detection accuracy", + "bullet3": "Can be disabled to reduce output file size" + } + }, + "submit": "Ta bort tomrum", + "error": { + "failed": "Failed to remove blank pages" + }, + "results": { + "title": "Removed Blank Pages" + }, + "tags": "städa upp,effektivisera,icke-innehÃĨll,organisera", "thresholdDesc": "TrÃļskelvärde fÃļr att bestämma hur vit en vit pixel mÃĨste vara", - "whitePercent": "Vit procent (%):", - "whitePercentDesc": "Procentandel av sidan som mÃĨste vara vit fÃļr att kunna tas bort", - "submit": "Ta bort tomrum" + "whitePercentDesc": "Procentandel av sidan som mÃĨste vara vit fÃļr att kunna tas bort" }, "removeAnnotations": { "tags": "kommentarer,markera,anteckningar,markup,ta bort", "title": "Ta bort anteckningar", "header": "Ta bort anteckningar", - "submit": "Ta bort" + "submit": "Ta bort", + "settings": { + "title": "Settings" + }, + "info": { + "title": "About Remove Annotations", + "description": "This tool will remove all annotations (comments, highlights, notes, etc.) from your PDF documents." + }, + "error": { + "failed": "An error occurred while removing annotations from the PDF." + } }, "compare": { "tags": "särskilja,kontrastera,ändringar,analys", @@ -1079,6 +2341,142 @@ "certSign": { "tags": "autentisera,PEM,P12,officiell,kryptera", "title": "Certifikatsignering", + "filenamePrefix": "signed", + "signMode": { + "stepTitle": "Sign Mode", + "tooltip": { + "header": { + "title": "About PDF Signatures" + }, + "overview": { + "title": "How signatures work", + "text": "Both modes seal the document (any edits are flagged as tampering) and record who/when/how for auditing. Viewer trust depends on the certificate chain." + }, + "manual": { + "title": "Manual - Bring your certificate", + "text": "Use your own certificate files for brand-aligned identity. Can display Trusted when your CA/chain is recognised.", + "use": "Use for: customer-facing, legal, compliance." + }, + "auto": { + "title": "Auto - Zero-setup, instant system seal", + "text": "Signs with a server self-signed certificate. Same tamper-evident seal and audit trail; typically shows Unverified in viewers.", + "use": "Use when: you need speed and consistent internal identity across reviews and records." + }, + "rule": { + "title": "Rule of thumb", + "text": "Need recipient Trusted status? Manual. Need a fast, tamper-evident seal and audit trail with no setup? Auto." + } + } + }, + "certTypeStep": { + "stepTitle": "Certificate Format" + }, + "certFiles": { + "stepTitle": "Certificate Files" + }, + "appearance": { + "stepTitle": "Signature Appearance", + "tooltip": { + "header": { + "title": "About Signature Appearance" + }, + "invisible": { + "title": "Invisible Signatures", + "text": "The signature is added to the PDF for security but won't be visible when viewing the document. Perfect for legal requirements without changing the document's appearance.", + "bullet1": "Provides security without visual changes", + "bullet2": "Meets legal requirements for digital signing", + "bullet3": "Doesn't affect document layout or design" + }, + "visible": { + "title": "Visible Signatures", + "text": "Shows a signature block on the PDF with your name, date, and optional details. Useful when you want readers to clearly see the document is signed.", + "bullet1": "Shows signer name and date on the document", + "bullet2": "Can include reason and location for signing", + "bullet3": "Choose which page to place the signature", + "bullet4": "Optional logo can be included" + } + }, + "invisible": "Invisible", + "options": { + "title": "Signature Details" + }, + "visible": "Visible" + }, + "sign": { + "submit": "Sign PDF", + "results": "Signed PDF" + }, + "error": { + "failed": "An error occurred whilst processing signatures." + }, + "tooltip": { + "header": { + "title": "About Managing Signatures" + }, + "overview": { + "title": "What can this tool do?", + "text": "This tool lets you check if your PDFs are digitally signed and add new digital signatures. Digital signatures prove who created or approved a document and show if it has been changed since signing.", + "bullet1": "Check existing signatures and their validity", + "bullet2": "View detailed information about signers and certificates", + "bullet3": "Add new digital signatures to secure your documents", + "bullet4": "Multiple files supported with easy navigation" + }, + "validation": { + "title": "Checking Signatures", + "text": "When you check signatures, the tool tells you if they're valid, who signed the document, when it was signed, and whether the document has been changed since signing.", + "bullet1": "Shows if signatures are valid or invalid", + "bullet2": "Displays signer information and signing date", + "bullet3": "Checks if the document was modified after signing", + "bullet4": "Can use custom certificates for verification" + }, + "signing": { + "title": "Adding Signatures", + "text": "To sign a PDF, you need a digital certificate (like PEM, PKCS12, or JKS). You can choose to make the signature visible on the document or keep it invisible for security only.", + "bullet1": "Supports PEM, PKCS12, JKS, and server certificate formats", + "bullet2": "Option to show or hide signature on the PDF", + "bullet3": "Add reason, location, and signer name", + "bullet4": "Choose which page to place visible signatures", + "bullet5": "Use server certificate for simple 'Sign with Stirling-PDF' option" + } + }, + "certType": { + "tooltip": { + "header": { + "title": "About Certificate Types" + }, + "what": { + "title": "What's a certificate?", + "text": "It's a secure ID for your signature that proves you signed. Unless you're required to sign via certificate, we recommend using another secure method like Type, Draw, or Upload." + }, + "which": { + "title": "Which option should I use?", + "text": "Choose the format that matches your certificate file:", + "bullet1": "PKCS#12 (.p12 / .pfx) – one combined file (most common)", + "bullet2": "PFX (.pfx) – Microsoft's version of PKCS12", + "bullet3": "PEM – separate private-key and certificate .pem files", + "bullet4": "JKS – Java .jks keystore for dev / CI-CD workflows" + }, + "convert": { + "title": "Key not listed?", + "text": "Convert your file to a Java keystore (.jks) with keytool, then pick JKS." + } + } + }, + "chooseCertificate": "Choose Certificate File", + "chooseJksFile": "Choose JKS File", + "chooseP12File": "Choose PKCS12 File", + "choosePfxFile": "Choose PFX File", + "choosePrivateKey": "Choose Private Key File", + "location": "Plats", + "logoTitle": "Logo", + "name": "Namn", + "noLogo": "No Logo", + "pageNumber": "Page Number", + "password": "Ange ditt nyckellagerlÃļsenord eller privata nyckellÃļsenord (om tillämpligt):", + "passwordOptional": "Leave empty if no password", + "reason": "Anledning", + "serverCertMessage": "Using server certificate - no files or password required", + "showLogo": "Visa logo", "header": "Signera en PDF med ditt certifikat (PÃĨgÃĨende arbete)", "selectPDF": "Välj en PDF-fil fÃļr signering:", "jksNote": "Obs: Om din certifikattyp inte finns listad nedan, vänligen konvertera den till en Java Keystore (.jks) fil med hjälp av keytool-kommandoradsverktyget. Välj sedan .jks-filalternativet nedan.", @@ -1086,13 +2484,7 @@ "selectCert": "Välj din certifikatfil (X.509-format, kan vara .pem eller .der):", "selectP12": "Välj din PKCS#12-nyckellagringsfil (.p12 eller .pfx) (Valfritt, om det tillhandahÃĨlls bÃļr det innehÃĨlla din privata nyckel och certifikat):", "selectJKS": "Välj din Java Keystore-fil (.jks eller .keystore):", - "certType": "Certifikattyp", - "password": "Ange ditt nyckellagerlÃļsenord eller privata nyckellÃļsenord (om tillämpligt):", "showSig": "Visa signatur", - "reason": "Anledning", - "location": "Plats", - "name": "Namn", - "showLogo": "Visa logo", "submit": "Signera PDF" }, "removeCertSign": { @@ -1100,7 +2492,18 @@ "title": "Ta bort certifikatsignatur", "header": "Ta bort den digitala certifikatsignaturen frÃĨn PDF:en", "selectPDF": "Välj en PDF-fil:", - "submit": "Ta bort signatur" + "submit": "Ta bort signatur", + "description": "This tool will remove digital certificate signatures from your PDF document.", + "filenamePrefix": "unsigned", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst removing certificate signatures." + }, + "results": { + "title": "Certificate Removal Results" + } }, "pageLayout": { "tags": "slÃĨ samman,sammansatt,enkel-vy,organisera", @@ -1108,16 +2511,157 @@ "header": "Flersidigt layout", "pagesPerSheet": "Sidor per ark:", "addBorder": "Lägg till kanter", - "submit": "Skicka" + "submit": "Skicka", + "desc": { + "2": "Place 2 pages side-by-side on a single sheet.", + "3": "Place 3 pages on a single sheet in a single row.", + "4": "Place 4 pages on a single sheet (2 × 2 grid).", + "9": "Place 9 pages on a single sheet (3 × 3 grid).", + "16": "Place 16 pages on a single sheet (4 × 4 grid)." + }, + "error": { + "failed": "An error occurred while creating the multi-page layout." + } + }, + "bookletImposition": { + "tags": "booklet,imposition,printing,binding,folding,signature", + "title": "Booklet Imposition", + "header": "Booklet Imposition", + "submit": "Create Booklet", + "spineLocation": { + "label": "Spine Location", + "left": "Left (Standard)", + "right": "Right (RTL)" + }, + "doubleSided": { + "label": "Double-sided printing", + "tooltip": "Creates both front and back sides for proper booklet printing" + }, + "manualDuplex": { + "title": "Manual Duplex Mode", + "instructions": "For printers without automatic duplex. You'll need to run this twice:" + }, + "duplexPass": { + "label": "Print Pass", + "first": "1st Pass", + "second": "2nd Pass", + "firstInstructions": "Prints front sides → stack face-down → run again with 2nd Pass", + "secondInstructions": "Load printed stack face-down → prints back sides" + }, + "rtlBinding": { + "label": "Right-to-left binding", + "tooltip": "For Arabic, Hebrew, or other right-to-left languages" + }, + "addBorder": { + "label": "Add borders around pages", + "tooltip": "Adds borders around each page section to help with cutting and alignment" + }, + "addGutter": { + "label": "Add gutter margin", + "tooltip": "Adds inner margin space for binding" + }, + "gutterSize": { + "label": "Gutter size (points)" + }, + "flipOnShortEdge": { + "label": "Flip on short edge (automatic duplex only)", + "tooltip": "Enable for short-edge duplex printing (automatic duplex only - ignored in manual mode)", + "manualNote": "Not needed in manual mode - you flip the stack yourself" + }, + "advanced": { + "toggle": "Advanced Options" + }, + "paperSizeNote": "Paper size is automatically derived from your first page.", + "tooltip": { + "header": { + "title": "Booklet Creation Guide" + }, + "description": { + "title": "What is Booklet Imposition?", + "text": "Creates professional booklets by arranging pages in the correct printing order. Your PDF pages are placed 2-up on landscape sheets so when folded and bound, they read in proper sequence like a real book." + }, + "example": { + "title": "Example: 8-Page Booklet", + "text": "Your 8-page document becomes 2 sheets:", + "bullet1": "Sheet 1 Front: Pages 8, 1 | Back: Pages 2, 7", + "bullet2": "Sheet 2 Front: Pages 6, 3 | Back: Pages 4, 5", + "bullet3": "When folded & stacked: Reads 1→2→3→4→5→6→7→8" + }, + "printing": { + "title": "How to Print & Assemble", + "text": "Follow these steps for perfect booklets:", + "bullet1": "Print double-sided with 'Flip on long edge'", + "bullet2": "Stack sheets in order, fold in half", + "bullet3": "Staple or bind along the folded spine", + "bullet4": "For short-edge printers: Enable 'Flip on short edge' option" + }, + "manualDuplex": { + "title": "Manual Duplex (Single-sided Printers)", + "text": "For printers without automatic duplex:", + "bullet1": "Turn OFF 'Double-sided printing'", + "bullet2": "Select '1st Pass' → Print → Stack face-down", + "bullet3": "Select '2nd Pass' → Load stack → Print backs", + "bullet4": "Fold and assemble as normal" + }, + "advanced": { + "title": "Advanced Options", + "text": "Fine-tune your booklet:", + "bullet1": "Right-to-Left Binding: For Arabic, Hebrew, or RTL languages", + "bullet2": "Borders: Shows cut lines for trimming", + "bullet3": "Gutter Margin: Adds space for binding/stapling", + "bullet4": "Short-edge Flip: Only for automatic duplex printers" + } + }, + "error": { + "failed": "An error occurred while creating the booklet imposition." + } }, "scalePages": { - "tags": "ändra storlek,modifiera,dimension,anpassa", "title": "Justera sidskala", "header": "Justera sidskala", "pageSize": "Storlek pÃĨ en sida i dokumentet.", "keepPageSize": "Originalstorlek", "scaleFactor": "ZoomnivÃĨ (beskärning) fÃļr en sida.", - "submit": "Skicka" + "submit": "Skicka", + "tags": "ändra storlek,modifiera,dimension,anpassa" + }, + "adjustPageScale": { + "tags": "resize,modify,dimension,adapt", + "title": "Adjust Page Scale", + "header": "Adjust Page Scale", + "scaleFactor": { + "label": "Scale Factor" + }, + "pageSize": { + "label": "Target Page Size", + "keep": "Keep Original Size", + "letter": "Letter", + "legal": "Legal" + }, + "submit": "Adjust Page Scale", + "error": { + "failed": "An error occurred while adjusting the page scale." + }, + "tooltip": { + "header": { + "title": "Page Scale Settings Overview" + }, + "description": { + "title": "Description", + "text": "Adjust the size of PDF content and change the page dimensions." + }, + "scaleFactor": { + "title": "Scale Factor", + "text": "Controls how large or small the content appears on the page. Content is scaled and centred - if scaled content is larger than the page size, it may be cropped.", + "bullet1": "1.0 = Original size", + "bullet2": "0.5 = Half size (50% smaller)", + "bullet3": "2.0 = Double size (200% larger, may crop)" + }, + "pageSize": { + "title": "Target Page Size", + "text": "Sets the dimensions of the output PDF pages. 'Keep Original Size' maintains current dimensions, whilst other options resize to standard paper sizes." + } + } }, "add-page-numbers": { "tags": "paginera,etikett,organisera,indexera" @@ -1126,16 +2670,83 @@ "tags": "auto-detektera,rubrikbaserad,organisera,märka om", "title": "Auto-byt namn", "header": "Auto-byt namn pÃĨ PDF", - "submit": "Auto-byt namn" + "description": "Automatically finds the title from your PDF content and uses it as the filename.", + "submit": "Auto-byt namn", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst auto-renaming the PDF." + }, + "results": { + "title": "Auto-Rename Results" + }, + "tooltip": { + "header": { + "title": "How Auto-Rename Works" + }, + "howItWorks": { + "title": "Smart Renaming", + "text": "Automatically finds the title from your PDF content and uses it as the filename.", + "bullet1": "Looks for text that appears to be a title or heading", + "bullet2": "Creates a clean, valid filename from the detected title", + "bullet3": "Keeps the original name if no suitable title is found" + } + } }, "adjust-contrast": { "tags": "färgkorrigering,finjustera,modifiera,fÃļrbättra" }, "crop": { - "tags": "trimma,krympa,redigera,forma", "title": "Beskär", "header": "Beskär PDF", - "submit": "Skicka" + "submit": "Skicka", + "noFileSelected": "Select a PDF file to begin cropping", + "preview": { + "title": "Crop Area Selection" + }, + "reset": "Reset to full PDF", + "coordinates": { + "title": "Position and Size", + "x": { + "label": "X Position", + "desc": "Left edge (points)" + }, + "y": { + "label": "Y Position", + "desc": "Bottom edge (points)" + }, + "width": { + "label": "Width", + "desc": "Crop width (points)" + }, + "height": { + "label": "Height", + "desc": "Crop height (points)" + } + }, + "error": { + "invalidArea": "Crop area extends beyond PDF boundaries", + "failed": "Failed to crop PDF" + }, + "steps": { + "selectArea": "Select Crop Area" + }, + "tooltip": { + "title": "How to Crop PDFs", + "description": "Select the area to crop from your PDF by dragging and resizing the blue overlay on the thumbnail.", + "drag": "Drag the overlay to move the crop area", + "resize": "Drag the corner and edge handles to resize", + "precision": "Use coordinate inputs for precise positioning" + }, + "results": { + "title": "Crop Results" + }, + "automation": { + "info": "Enter crop coordinates in PDF points. Origin (0,0) is at bottom-left. These values will be applied to all PDFs processed in this automation.", + "reference": "Reference: A4 page is 595.28 × 841.89 points (210mm × 297mm). 1 inch = 72 points." + }, + "tags": "trimma,krympa,redigera,forma" }, "autoSplitPDF": { "tags": "QR-baserad,separera,skanna-segment,organisera", @@ -1218,24 +2829,124 @@ "downloadJS": "Ladda ner Javascript", "submit": "Visa" }, - "autoRedact": { - "tags": "Redigera,DÃļlja,svärta,svart,markÃļr,dold", - "title": "Auto-redigera", - "header": "Auto-redigera", - "colorLabel": "Färg", - "textsToRedactLabel": "Text att redigera (radavgränsad)", - "textsToRedactPlaceholder": "t.ex. \\nKonfidentiellt \\nHemligt", - "useRegexLabel": "Använd Regex", - "wholeWordSearchLabel": "Hel ord-sÃļkning", - "customPaddingLabel": "Anpassad extra utfyllnad", - "convertPDFToImageLabel": "Konvertera PDF till PDF-bild (Används fÃļr att ta bort text bakom rutan)", - "submitButton": "Skicka" - }, "redact": { "tags": "Redact,Hide,black out,black,marker,hidden,manual", "title": "Manual Redaction", - "header": "Manual Redaction", "submit": "Manual Redaction", + "error": { + "failed": "An error occurred while redacting the PDF." + }, + "modeSelector": { + "title": "Redaction Method", + "mode": "Mode", + "automatic": "Automatic", + "automaticDesc": "Redact text based on search terms", + "manual": "Manual", + "manualDesc": "Click and drag to redact specific areas", + "manualComingSoon": "Manual redaction coming soon" + }, + "auto": { + "header": "Auto Redact", + "settings": { + "title": "Redaction Settings", + "advancedTitle": "Avancerat" + }, + "colorLabel": "Box Colour", + "wordsToRedact": { + "title": "Words to Redact", + "placeholder": "Enter a word", + "add": "Lägg till", + "examples": "Examples: Confidential, Top-Secret" + }, + "useRegexLabel": "Use Regex", + "wholeWordSearchLabel": "Whole Word Search", + "customPaddingLabel": "Custom Extra Padding", + "convertPDFToImageLabel": "Convert PDF to PDF-Image" + }, + "tooltip": { + "mode": { + "header": { + "title": "Redaction Method" + }, + "automatic": { + "title": "Automatic Redaction", + "text": "Automatically finds and redacts specified text throughout the document. Perfect for removing consistent sensitive information like names, addresses, or confidential markers." + }, + "manual": { + "title": "Manual Redaction", + "text": "Click and drag to manually select specific areas to redact. Gives you precise control over what gets redacted. (Coming soon)" + } + }, + "words": { + "header": { + "title": "Words to Redact" + }, + "description": { + "title": "Text Matching", + "text": "Enter words or phrases to find and redact in your document. Each word will be searched for separately." + }, + "bullet1": "Add one word at a time", + "bullet2": "Press Enter or click 'Add Another' to add", + "bullet3": "Click × to remove words", + "examples": { + "title": "Common Examples", + "text": "Typical words to redact include: bank details, email addresses, or specific names." + } + }, + "advanced": { + "header": { + "title": "Advanced Redaction Settings" + }, + "color": { + "title": "Box Colour & Padding", + "text": "Customise the appearance of redaction boxes. Black is standard, but you can choose any colour. Padding adds extra space around the found text." + }, + "regex": { + "title": "Use Regex", + "text": "Enable regular expressions for advanced pattern matching. Useful for finding phone numbers, emails, or complex patterns.", + "bullet1": "Example: \\d{4}-\\d{2}-\\d{2} to match any dates in YYYY-MM-DD format", + "bullet2": "Use with caution - test thoroughly" + }, + "wholeWord": { + "title": "Whole Word Search", + "text": "Only match complete words, not partial matches. 'John' won't match 'Johnson' when enabled." + }, + "convert": { + "title": "Convert to PDF-Image", + "text": "Converts the PDF to an image-based PDF after redaction. This ensures text behind redaction boxes is completely removed and unrecoverable." + } + } + }, + "manual": { + "header": "Manual Redaction", + "textBasedRedaction": "Text-based Redaction", + "pageBasedRedaction": "Page-based Redaction", + "convertPDFToImageLabel": "Convert PDF to PDF-Image (Used to remove text behind the box)", + "pageRedactionNumbers": { + "title": "Sidor", + "placeholder": "(t.ex. 1,2,8 eller 4,7,12-16 eller 2n-1)" + }, + "redactionColor": { + "title": "Redaction Colour" + }, + "export": "Exportera", + "upload": "Upload", + "boxRedaction": "Box draw redaction", + "zoom": "Zoom", + "zoomIn": "Zoom in", + "zoomOut": "Zoom out", + "nextPage": "Next Page", + "previousPage": "Previous Page", + "toggleSidebar": "Toggle Sidebar", + "showThumbnails": "Show Thumbnails", + "showDocumentOutline": "Show Document Outline (double-click to expand/collapse all items)", + "showAttachments": "Show Attachments", + "showLayers": "Show Layers (double-click to reset all layers to the default state)", + "colourPicker": "Colour Picker", + "findCurrentOutlineItem": "Find current outline item", + "applyChanges": "Apply Changes" + }, + "header": "Manual Redaction", "textBasedRedaction": "Text based Redaction", "pageBasedRedaction": "Page-based Redaction", "convertPDFToImageLabel": "Convert PDF to PDF-Image (Used to remove text behind the box)", @@ -1261,22 +2972,7 @@ "showLayers": "Show Layers (double-click to reset all layers to the default state)", "colourPicker": "Colour Picker", "findCurrentOutlineItem": "Find current outline item", - "applyChanges": "Apply Changes", - "auto": { - "settings": { - "advancedTitle": "Avancerat" - }, - "wordsToRedact": { - "add": "Lägg till" - } - }, - "manual": { - "pageRedactionNumbers": { - "title": "Sidor", - "placeholder": "(t.ex. 1,2,8 eller 4,7,12-16 eller 2n-1)" - }, - "export": "Exportera" - } + "applyChanges": "Apply Changes" }, "tableExtraxt": { "tags": "CSV,Tabellextraktion,extrahera,konvertera" @@ -1287,11 +2983,15 @@ "overlay-pdfs": { "tags": "Överlagra", "header": "Överlagra PDF-filer", + "title": "Overlay PDFs", + "desc": "Overlay one PDF on top of another", "baseFile": { "label": "Välj bas-PDF-fil" }, "overlayFiles": { - "label": "Välj Ãļverlagrings-PDF-filer" + "label": "Välj Ãļverlagrings-PDF-filer", + "placeholder": "Choose PDF(s)...", + "addMore": "Add more PDFs..." }, "mode": { "label": "Välj Ãļverlagringsläge", @@ -1301,14 +3001,53 @@ }, "counts": { "label": "Överlagringsantal (fÃļr fast upprepningsläge)", - "placeholder": "Ange kommaseparerade antal (t.ex. 2,3,1)" + "placeholder": "Ange kommaseparerade antal (t.ex. 2,3,1)", + "item": "Count for file", + "noFiles": "Add overlay files to configure counts" }, "position": { "label": "Välj Ãļverlagringsposition", "foreground": "FÃļrgrund", "background": "Bakgrund" }, - "submit": "Skicka" + "submit": "Skicka", + "settings": { + "title": "Settings" + }, + "results": { + "title": "Overlay Results" + }, + "tooltip": { + "header": { + "title": "Overlay PDFs Overview" + }, + "description": { + "title": "Description", + "text": "Combine a base PDF with one or more overlay PDFs. Overlays can be applied page-by-page in different modes and placed in the foreground or background." + }, + "mode": { + "title": "Overlay Mode", + "text": "Choose how to distribute overlay pages across the base PDF pages.", + "sequential": "Sequential Overlay: Use pages from the first overlay PDF until it ends, then move to the next.", + "interleaved": "Interleaved Overlay: Take one page from each overlay in turn.", + "fixedRepeat": "Fixed Repeat Overlay: Take a set number of pages from each overlay before moving to the next. Use Counts to set the numbers." + }, + "position": { + "title": "Overlay Position", + "text": "Foreground places the overlay on top of the page. Background places it behind." + }, + "overlayFiles": { + "title": "Overlay Files", + "text": "Select one or more PDFs to overlay on the base. The order of these files affects how pages are applied in Sequential and Fixed Repeat modes." + }, + "counts": { + "title": "Counts (Fixed Repeat only)", + "text": "Provide a positive number for each overlay file showing how many pages to take before moving to the next. Required when mode is Fixed Repeat." + } + }, + "error": { + "failed": "An error occurred while overlaying PDFs." + } }, "split-by-sections": { "tags": "Sektionsdelning,Dela,Anpassa", @@ -1329,6 +3068,7 @@ "tags": "Stämpel,Lägg till bild,centrera bild,Vattenstämpel,PDF,Bädda in,Anpassa", "header": "Stämpla PDF", "title": "Stämpla PDF", + "stampSetup": "Stamp Setup", "stampType": "Stämpeltyp", "stampText": "Stämpeltext", "stampImage": "Stämpelbild", @@ -1341,7 +3081,19 @@ "overrideY": "Åsidosätt Y-koordinat", "customMargin": "Anpassad marginal", "customColor": "Anpassad textfärg", - "submit": "Skicka" + "submit": "Skicka", + "noStampSelected": "No stamp selected. Return to Step 1.", + "customPosition": "Drag the stamp to the desired location in the preview window.", + "error": { + "failed": "An error occurred while adding stamp to the PDF." + }, + "imageSize": "Image Size", + "margin": "Margin", + "positionAndFormatting": "Position & Formatting", + "quickPosition": "Select a position on the page to place the stamp.", + "results": { + "title": "Stamp Results" + } }, "removeImagePdf": { "tags": "Ta bort bild,Sidoperationer,Backend,serversida" @@ -1359,7 +3111,8 @@ "status": { "_value": "Status", "valid": "Giltig", - "invalid": "Ogiltig" + "invalid": "Ogiltig", + "complete": "Validation complete" }, "signer": "Signer", "date": "Datum", @@ -1386,40 +3139,122 @@ "version": "Version", "keyUsage": "Key Usage", "selfSigned": "Self-Signed", - "bits": "bits" + "bits": "bits", + "details": "Certificate Details" }, "signature": { "info": "Signature Information", "_value": "Signature", "mathValid": "Signature is mathematically valid BUT:" }, - "selectCustomCert": "Custom Certificate File X.509 (Optional)" - }, - "replace-color": { - "title": "Ersätt-Invertera-Färg", - "header": "Ersätt-Invertera färg pÃĨ PDF", - "selectText": { - "1": "Ersätt eller Invertera färgalternativ", - "2": "Standard (standard hÃļghastighetsfärg)", - "3": "Anpassad (anpassade färger)", - "4": "Full-Invertera (invertera alla färger)", - "5": "HÃļghastighetsfärgalternativ", - "6": "Vit text pÃĨ svart bakgrund", - "7": "Svart text pÃĨ vit bakgrund", - "8": "Gul text pÃĨ svart bakgrund", - "9": "GrÃļn text pÃĨ svart bakgrund", - "10": "Välj textfärg", - "11": "Välj bakgrundsfärg" + "selectCustomCert": "Custom Certificate File X.509 (Optional)", + "downloadCsv": "Download CSV", + "downloadJson": "Download JSON", + "downloadPdf": "Download PDF Report", + "downloadType": { + "csv": "CSV", + "json": "JSON", + "pdf": "PDF" }, - "submit": "Ersätt" + "error": { + "allFailed": "Unable to validate the selected files.", + "partial": "Some files could not be validated.", + "reportGeneration": "Could not generate the PDF report. JSON and CSV are available.", + "unexpected": "Unexpected error during validation." + }, + "finalizing": "Preparing downloads...", + "issue": { + "certExpired": "Certificate expired", + "certRevocationUnknown": "Certificate revocation status unknown", + "certRevoked": "Certificate revoked", + "chainInvalid": "Certificate chain invalid", + "signatureInvalid": "Signature cryptographic check failed", + "trustInvalid": "Certificate not trusted" + }, + "noResults": "Run the validation to generate a report.", + "noSignaturesShort": "No signatures", + "processing": "Validating signatures...", + "report": { + "continued": "Continued", + "downloads": "Downloads", + "entryLabel": "Signature Summary", + "fields": { + "created": "Created", + "fileSize": "File Size", + "signatureCount": "Total Signatures", + "signatureDate": "Signature Date" + }, + "filesEvaluated": "{{count}} files evaluated", + "footer": "Validated via Stirling PDF", + "generatedAt": "Generated", + "noPdf": "PDF report will be available after a successful validation.", + "page": "Page", + "shortTitle": "Signature Summary", + "signatureCountLabel": "{{count}} signatures", + "signaturesFound": "{{count}} signatures detected", + "signaturesValid": "{{count}} fully valid", + "title": "Signature Validation Report" + }, + "settings": { + "certHint": "Upload a trusted X.509 certificate to validate against a custom trust source.", + "title": "Validation Settings" + }, + "signatureDate": "Signature Date", + "totalSignatures": "Total Signatures" }, - "replaceColorPdf": { - "tags": "Ersätt Färg, SidÃĨtgärder, Bakomliggande, Serversid" + "replaceColor": { + "tags": "Replace Colour,Page operations,Back end,server side", + "labels": { + "settings": "Settings", + "colourOperation": "Colour operation" + }, + "options": { + "highContrast": "High contrast", + "invertAll": "Invert all colours", + "custom": "Custom", + "cmyk": "Convert to CMYK" + }, + "tooltip": { + "header": { + "title": "Replace & Invert Colour Settings Overview" + }, + "description": { + "title": "Description", + "text": "Transform PDF colours to improve readability and accessibility. Choose from high contrast presets, invert all colours, or create custom colour schemes." + }, + "highContrast": { + "title": "High Contrast", + "text": "Apply predefined high contrast colour combinations designed for better readability and accessibility compliance.", + "bullet1": "White text on black background - Classic dark mode", + "bullet2": "Black text on white background - Standard high contrast", + "bullet3": "Yellow text on black background - High visibility option", + "bullet4": "Green text on black background - Alternative high contrast" + }, + "invertAll": { + "title": "Invert All Colours", + "text": "Completely invert all colours in the PDF, creating a negative-like effect. Useful for creating dark mode versions of documents or reducing eye strain in low-light conditions." + }, + "custom": { + "title": "Custom Colours", + "text": "Define your own text and background colours using the colour pickers. Perfect for creating branded documents or specific accessibility requirements.", + "bullet1": "Text colour - Choose the colour for text elements", + "bullet2": "Background colour - Set the background colour for the document" + }, + "cmyk": { + "title": "Convert to CMYK", + "text": "Convert the PDF from RGB colour space to CMYK colour space, optimized for professional printing. This process converts colours to the Cyan, Magenta, Yellow, Black model used by printers." + } + }, + "error": { + "failed": "An error occurred while processing the colour replacement." + } }, "login": { "title": "Logga in", "header": "Logga in", "signin": "Logga in", + "signInWith": "Sign in with", + "signInAnonymously": "Sign Up as a Guest", "rememberme": "Kom ihÃĨg mig", "invalid": "Ogiltigt användarnamn eller lÃļsenord.", "locked": "Ditt konto har lÃĨsts.", @@ -1438,12 +3273,83 @@ "alreadyLoggedIn": "Du är redan inloggad pÃĨ", "alreadyLoggedIn2": "enheter. Logga ut frÃĨn enheterna och fÃļrsÃļk igen.", "toManySessions": "Du har fÃļr mÃĨnga aktiva sessioner", - "logoutMessage": "You have been logged out." + "logoutMessage": "You have been logged out.", + "youAreLoggedIn": "You are logged in!", + "email": "Email", + "password": "Password", + "enterEmail": "Enter your email", + "enterPassword": "Enter your password", + "loggingIn": "Logging In...", + "username": "Username", + "enterUsername": "Enter username", + "useEmailInstead": "Login with email", + "forgotPassword": "Forgot your password?", + "logIn": "Log In", + "signingIn": "Signing in...", + "login": "Login", + "or": "Or", + "useMagicLink": "Use magic link instead", + "enterEmailForMagicLink": "Enter your email for magic link", + "sending": "Sendingâ€Ļ", + "sendMagicLink": "Send Magic Link", + "cancel": "Cancel", + "dontHaveAccount": "Don't have an account? Sign up", + "home": "Home", + "debug": "Debug", + "signOut": "Sign Out", + "pleaseEnterBoth": "Please enter both email and password", + "pleaseEnterEmail": "Please enter your email address", + "magicLinkSent": "Magic link sent to {{email}}! Check your email and click the link to sign in.", + "passwordResetSent": "Password reset link sent to {{email}}! Check your email and follow the instructions.", + "failedToSignIn": "Failed to sign in with {{provider}}: {{message}}", + "unexpectedError": "Unexpected error: {{message}}", + "accountCreatedSuccess": "Account created successfully! You can now sign in.", + "passwordChangedSuccess": "Password changed successfully! Please sign in with your new password.", + "credentialsUpdated": "Your credentials have been updated. Please sign in again." + }, + "signup": { + "title": "Create an account", + "subtitle": "Join Stirling PDF to get started", + "name": "Name", + "email": "Email", + "password": "Password", + "confirmPassword": "Confirm password", + "enterName": "Enter your name", + "enterEmail": "Enter your email", + "enterPassword": "Enter your password", + "confirmPasswordPlaceholder": "Confirm password", + "or": "or", + "creatingAccount": "Creating Account...", + "signUp": "Sign Up", + "alreadyHaveAccount": "Already have an account? Sign in", + "pleaseFillAllFields": "Please fill in all fields", + "passwordsDoNotMatch": "Passwords do not match", + "passwordTooShort": "Password must be at least 6 characters long", + "invalidEmail": "Please enter a valid email address", + "checkEmailConfirmation": "Check your email for a confirmation link to complete your registration.", + "accountCreatedSuccessfully": "Account created successfully! You can now sign in.", + "unexpectedError": "Unexpected error: {{message}}", + "useEmailInstead": "Use Email Instead", + "nameRequired": "Name is required", + "emailRequired": "Email is required", + "passwordRequired": "Password is required", + "confirmPasswordRequired": "Please confirm your password" }, "pdfToSinglePage": { "title": "PDF till en sida", "header": "PDF till en sida", - "submit": "Konvertera till en sida" + "submit": "Konvertera till en sida", + "description": "This tool will merge all pages of your PDF into one large single page. The width will remain the same as the original pages, but the height will be the sum of all page heights.", + "filenamePrefix": "single_page", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst converting to single page." + }, + "results": { + "title": "Single Page Results" + } }, "pageExtracter": { "title": "Extrahera sidor", @@ -1467,18 +3373,59 @@ "adjustContrast": { "title": "Justera kontrast", "header": "Justera kontrast", + "basic": "Basic Adjustments", "contrast": "Kontrast:", "brightness": "Ljusstyrka:", "saturation": "Mättnad:", - "download": "Ladda ner" + "download": "Ladda ner", + "adjustColors": "Adjust Colors", + "blue": "Blue", + "confirm": "Confirm", + "error": { + "failed": "Failed to adjust colors/contrast" + }, + "green": "Green", + "noPreview": "Select a PDF to preview", + "red": "Red", + "results": { + "title": "Adjusted PDF" + } }, "compress": { "title": "Komprimera", + "desc": "Compress PDFs to reduce their file size.", "header": "Komprimera PDF", + "method": { + "title": "Compression Method", + "quality": "Quality", + "filesize": "Filstorlek" + }, "credit": "Denna tjänst använder qpdf fÃļr PDF-komprimering/optimering.", "grayscale": { "label": "Tillämpa grÃĨskala fÃļr komprimering" }, + "tooltip": { + "header": { + "title": "Compress Settings Overview" + }, + "description": { + "title": "Description", + "text": "Compression is an easy way to reduce your file size. Pick File Size to enter a target size and have us adjust quality for you. Pick Quality to set compression strength manually." + }, + "qualityAdjustment": { + "title": "Quality Adjustment", + "text": "Drag the slider to adjust the compression strength. Lower values (1-3) preserve quality but result in larger files. Higher values (7-9) shrink the file more but reduce image clarity.", + "bullet1": "Lower values preserve quality", + "bullet2": "Higher values reduce file size" + }, + "grayscale": { + "title": "Grayscale", + "text": "Select this option to convert all images to black and white, which can significantly reduce file size especially for scanned PDFs or image-heavy documents." + } + }, + "error": { + "failed": "An error occurred while compressing the PDF." + }, "selectText": { "1": { "_value": "Compression Settings", @@ -1488,10 +3435,7 @@ "4": "Autoläge - Autojusterar kvaliteten fÃļr att fÃĨ PDF till exakt storlek", "5": "FÃļrväntad PDF-storlek (t.ex. 25MB, 10,8MB, 25KB)" }, - "submit": "Komprimera", - "method": { - "filesize": "Filstorlek" - } + "submit": "Komprimera" }, "decrypt": { "passwordPrompt": "Denna fil är lÃļsenordsskyddad. Fyll i lÃļsenord:", @@ -1592,7 +3536,13 @@ "title": "Ta bort bild", "header": "Ta bort bild", "removeImage": "Ta bort bild", - "submit": "Ta bort bild" + "submit": "Ta bort bild", + "error": { + "failed": "Failed to remove images from the PDF." + }, + "results": { + "title": "Remove Images Results" + } }, "splitByChapters": { "title": "Dela upp PDF efter kapitel", @@ -1626,6 +3576,12 @@ }, "note": "Release notes are only available in English" }, + "swagger": { + "title": "API Documentation", + "header": "API Documentation", + "desc": "View and test the Stirling PDF API endpoints", + "tags": "api,documentation,swagger,endpoints,development" + }, "cookieBanner": { "popUp": { "title": "How we use Cookies", @@ -1661,50 +3617,943 @@ "title": "Analytics", "description": "These cookies help us understand how our tools are being used, so we can focus on building the features our community values most. Rest assured—Stirling PDF cannot and will never track the content of the documents you work with." } + }, + "services": { + "posthog": "PostHog Analytics", + "scarf": "Scarf Pixel" } }, - "download": "Ladda ner", - "convert": { - "title": "Konvertera", - "settings": "Inställningar", - "color": "Färg", - "greyscale": "GrÃĨskala", - "fillPage": "Fyll sida", - "pdfaDigitalSignatureWarning": "PDF:en innehÃĨller en digital signatur. Denna kommer att tas bort i nästa steg.", - "grayscale": "GrÃĨskala" + "removeMetadata": { + "submit": "Remove Metadata" }, - "attachments": { - "tags": "embed,attach,file,attachment,attachments", - "title": "Add attachments", - "header": "Add attachments", - "submit": "Add attachments" + "sidebar": { + "toggle": "Toggle Sidebar" + }, + "theme": { + "toggle": "Toggle Theme" + }, + "view": { + "viewer": "Viewer", + "pageEditor": "Page Editor", + "fileManager": "File Manager" + }, + "pageEditor": { + "title": "Page Editor", + "save": "Save Changes", + "noPdfLoaded": "No PDF loaded. Please upload a PDF to edit.", + "rotatedLeft": "Rotated left:", + "rotatedRight": "Rotated right:", + "deleted": "Deleted:", + "movedLeft": "Moved left:", + "movedRight": "Moved right:", + "splitAt": "Split at:", + "insertedPageBreak": "Inserted page break at:", + "addFileNotImplemented": "Add file not implemented in demo", + "closePdf": "Close PDF", + "reset": "Reset Changes", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "fitToWidth": "Fit to Width", + "actualSize": "Actual Size" + }, + "viewer": { + "firstPage": "First Page", + "lastPage": "Last Page", + "previousPage": "Previous Page", + "nextPage": "Next Page", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "singlePageView": "Single Page View", + "dualPageView": "Dual Page View" }, "rightRail": { - "selectAll": "Välj allt" + "closeSelected": "Close Selected Files", + "selectAll": "Välj allt", + "deselectAll": "Deselect All", + "selectByNumber": "Select by Page Numbers", + "deleteSelected": "Delete Selected Pages", + "closePdf": "Close PDF", + "exportAll": "Export PDF", + "downloadSelected": "Download Selected Files", + "downloadAll": "Download All", + "toggleTheme": "Toggle Theme", + "language": "Language", + "search": "Search PDF", + "panMode": "Pan Mode", + "rotateLeft": "Rotate Left", + "rotateRight": "Rotate Right", + "toggleSidebar": "Toggle Sidebar", + "exportSelected": "Export Selected Pages", + "toggleAnnotations": "Toggle Annotations Visibility", + "annotationMode": "Toggle Annotation Mode", + "draw": "Draw", + "save": "Save" + }, + "search": { + "title": "Search PDF", + "placeholder": "Enter search term...", + "noResults": "No results found", + "searching": "Searching..." + }, + "guestBanner": { + "title": "You're using Stirling PDF as a guest!", + "message": "Create a free account to save your work, access more features, and support the project.", + "dismiss": "Dismiss banner", + "signUp": "Sign Up Free" + }, + "toolPicker": { + "searchPlaceholder": "Search tools...", + "noToolsFound": "No tools found", + "allTools": "ALL TOOLS", + "quickAccess": "QUICK ACCESS", + "categories": { + "standardTools": "Standard Tools", + "advancedTools": "Advanced Tools", + "recommendedTools": "Recommended Tools" + }, + "subcategories": { + "signing": "Signing", + "documentSecurity": "Document Security", + "verification": "Verification", + "documentReview": "Document Review", + "pageFormatting": "Page Formatting", + "extraction": "Extraction", + "removal": "Removal", + "automation": "Automation", + "general": "General", + "advancedFormatting": "Advanced Formatting", + "developerTools": "Developer Tools" + } }, "quickAccess": { - "sign": "Signera" + "read": "Read", + "sign": "Signera", + "automate": "Automate", + "files": "Files", + "activity": "Activity", + "help": "Help", + "account": "Account", + "config": "Config", + "adminSettings": "Admin Settings", + "allTools": "All Tools" + }, + "admin": { + "error": "Error", + "success": "Success", + "expand": "Expand", + "close": "Close", + "status": { + "active": "Active", + "inactive": "Inactive" + }, + "settings": { + "title": "Admin Settings", + "workspace": "Workspace", + "fetchError": "Failed to load settings", + "saveError": "Failed to save settings", + "saved": "Settings saved successfully", + "saveSuccess": "Settings saved successfully", + "save": "Save Changes", + "restartRequired": "Restart Required", + "restart": { + "title": "Restart Required", + "message": "Settings have been saved successfully. A server restart is required for the changes to take effect.", + "question": "Would you like to restart the server now or later?", + "now": "Restart Now", + "later": "Restart Later" + }, + "restarting": "Restarting Server", + "restartingMessage": "The server is restarting. Please wait a moment...", + "restartError": "Failed to restart server. Please restart manually.", + "general": { + "title": "System Settings", + "description": "Configure system-wide application settings including branding and default behaviour.", + "ui": "User Interface", + "system": "System", + "appName": { + "label": "Application Name", + "description": "The name displayed in the browser tab and home page" + }, + "appNameNavbar": { + "label": "Navbar Brand", + "description": "The name displayed in the navigation bar" + }, + "homeDescription": { + "label": "Home Description", + "description": "The description text shown on the home page" + }, + "defaultLocale": { + "label": "Default Locale", + "description": "The default language for new users (e.g., en_US, es_ES)" + }, + "fileUploadLimit": { + "label": "File Upload Limit", + "description": "Maximum file upload size (e.g., 100MB, 1GB)" + }, + "showUpdate": { + "label": "Show Update Notifications", + "description": "Display notifications when a new version is available" + }, + "showUpdateOnlyAdmin": { + "label": "Show Updates to Admins Only", + "description": "Restrict update notifications to admin users only" + }, + "customHTMLFiles": { + "label": "Custom HTML Files", + "description": "Allow serving custom HTML files from the customFiles directory" + }, + "languages": { + "label": "Available Languages", + "description": "Languages that users can select from (leave empty to enable all languages)" + }, + "customMetadata": { + "label": "Custom Metadata", + "autoUpdate": { + "label": "Auto Update Metadata", + "description": "Automatically update PDF metadata on all processed documents" + }, + "author": { + "label": "Default Author", + "description": "Default author for PDF metadata (e.g., username)" + }, + "creator": { + "label": "Default Creator", + "description": "Default creator for PDF metadata" + }, + "producer": { + "label": "Default Producer", + "description": "Default producer for PDF metadata" + } + }, + "customPaths": { + "label": "Custom Paths", + "description": "Configure custom file system paths for pipeline processing and external tools", + "pipeline": { + "label": "Pipeline Directories", + "watchedFoldersDir": { + "label": "Watched Folders Directory", + "description": "Directory where pipeline monitors for incoming PDFs (leave empty for default: /pipeline/watchedFolders)" + }, + "finishedFoldersDir": { + "label": "Finished Folders Directory", + "description": "Directory where processed PDFs are outputted (leave empty for default: /pipeline/finishedFolders)" + } + }, + "operations": { + "label": "External Tool Paths", + "weasyprint": { + "label": "WeasyPrint Executable", + "description": "Path to WeasyPrint executable for HTML to PDF conversion (leave empty for default: /opt/venv/bin/weasyprint)" + }, + "unoconvert": { + "label": "Unoconvert Executable", + "description": "Path to LibreOffice unoconvert for document conversions (leave empty for default: /opt/venv/bin/unoconvert)" + } + } + } + }, + "security": { + "title": "Security", + "description": "Configure authentication, login behaviour, and security policies.", + "ssoNotice": { + "title": "Looking for SSO/SAML settings?", + "message": "OAuth2 and SAML2 authentication providers have been moved to the Connections menu for easier management." + }, + "authentication": "Authentication", + "enableLogin": { + "label": "Enable Login", + "description": "Require users to log in before accessing the application" + }, + "loginMethod": { + "label": "Login Method", + "description": "The authentication method to use for user login", + "all": "All Methods", + "normal": "Username/Password Only", + "oauth2": "OAuth2 Only", + "saml2": "SAML2 Only" + }, + "loginAttemptCount": { + "label": "Login Attempt Limit", + "description": "Maximum number of failed login attempts before account lockout" + }, + "loginResetTimeMinutes": { + "label": "Login Reset Time (minutes)", + "description": "Time before failed login attempts are reset" + }, + "csrfDisabled": { + "label": "Disable CSRF Protection", + "description": "Disable Cross-Site Request Forgery protection (not recommended)" + }, + "initialLogin": { + "label": "Initial Login", + "username": { + "label": "Initial Username", + "description": "The username for the initial admin account" + }, + "password": { + "label": "Initial Password", + "description": "The password for the initial admin account" + } + }, + "jwt": { + "label": "JWT Configuration", + "secureCookie": { + "label": "Secure Cookie", + "description": "Require HTTPS for JWT cookies (recommended for production)" + }, + "keyRetentionDays": { + "label": "Key Retention Days", + "description": "Number of days to retain old JWT keys for verification" + }, + "persistence": { + "label": "Enable Key Persistence", + "description": "Store JWT keys persistently to survive server restarts" + }, + "enableKeyRotation": { + "label": "Enable Key Rotation", + "description": "Automatically rotate JWT signing keys periodically" + }, + "enableKeyCleanup": { + "label": "Enable Key Cleanup", + "description": "Automatically remove expired JWT keys" + } + }, + "audit": { + "label": "Audit Logging", + "enabled": { + "label": "Enable Audit Logging", + "description": "Track user actions and system events for compliance and security monitoring" + }, + "level": { + "label": "Audit Level", + "description": "0=OFF, 1=BASIC, 2=STANDARD, 3=VERBOSE" + }, + "retentionDays": { + "label": "Audit Retention (days)", + "description": "Number of days to retain audit logs" + } + }, + "htmlUrlSecurity": { + "label": "HTML URL Security", + "description": "Configure URL access restrictions for HTML processing to prevent SSRF attacks", + "enabled": { + "label": "Enable URL Security", + "description": "Enable URL security restrictions for HTML to PDF conversions" + }, + "level": { + "label": "Security Level", + "description": "MAX: whitelist only, MEDIUM: block internal networks, OFF: no restrictions", + "max": "Maximum (Whitelist Only)", + "medium": "Medium (Block Internal)", + "off": "Off (No Restrictions)" + }, + "advanced": "Advanced Settings", + "allowedDomains": { + "label": "Allowed Domains (Whitelist)", + "description": "One domain per line (e.g., cdn.example.com). Only these domains allowed when level is MAX" + }, + "blockedDomains": { + "label": "Blocked Domains (Blacklist)", + "description": "One domain per line (e.g., malicious.com). Additional domains to block" + }, + "internalTlds": { + "label": "Internal TLDs", + "description": "One TLD per line (e.g., .local, .internal). Block domains with these TLD patterns" + }, + "networkBlocking": "Network Blocking", + "blockPrivateNetworks": { + "label": "Block Private Networks", + "description": "Block RFC 1918 private networks (10.x.x.x, 192.168.x.x, 172.16-31.x.x)" + }, + "blockLocalhost": { + "label": "Block Localhost", + "description": "Block localhost and loopback addresses (127.x.x.x, ::1)" + }, + "blockLinkLocal": { + "label": "Block Link-Local Addresses", + "description": "Block link-local addresses (169.254.x.x, fe80::/10)" + }, + "blockCloudMetadata": { + "label": "Block Cloud Metadata Endpoints", + "description": "Block cloud provider metadata endpoints (169.254.169.254)" + } + } + }, + "connections": { + "title": "Connections", + "description": "Configure external authentication providers like OAuth2 and SAML.", + "linkedServices": "Linked Services", + "unlinkedServices": "Unlinked Services", + "connect": "Connect", + "disconnect": "Disconnect", + "disconnected": "Provider disconnected successfully", + "disconnectError": "Failed to disconnect provider", + "ssoAutoLogin": { + "label": "SSO Auto Login", + "enable": "Enable SSO Auto Login", + "description": "Automatically redirect to SSO login when authentication is required" + }, + "oauth2": { + "label": "OAuth2", + "enabled": { + "label": "Enable OAuth2", + "description": "Allow users to authenticate using OAuth2 providers" + }, + "provider": { + "label": "Provider", + "description": "The OAuth2 provider to use for authentication" + }, + "issuer": { + "label": "Issuer URL", + "description": "The OAuth2 provider issuer URL" + }, + "clientId": { + "label": "Client ID", + "description": "The OAuth2 client ID from your provider" + }, + "clientSecret": { + "label": "Client Secret", + "description": "The OAuth2 client secret from your provider" + }, + "useAsUsername": { + "label": "Use as Username", + "description": "The OAuth2 claim to use as the username (e.g., email, sub)" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first OAuth2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via OAuth2" + }, + "scopes": { + "label": "OAuth2 Scopes", + "description": "Comma-separated list of OAuth2 scopes to request (e.g., openid, profile, email)" + } + }, + "saml2": { + "label": "SAML2", + "enabled": { + "label": "Enable SAML2", + "description": "Allow users to authenticate using SAML2 providers" + }, + "provider": { + "label": "Provider", + "description": "The SAML2 provider name" + }, + "registrationId": { + "label": "Registration ID", + "description": "The SAML2 registration identifier" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first SAML2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via SAML2" + } + } + }, + "database": { + "title": "Database", + "description": "Configure custom database connection settings for enterprise deployments.", + "configuration": "Database Configuration", + "enableCustom": { + "label": "Enable Custom Database", + "description": "Use your own custom database configuration instead of the default embedded database" + }, + "customUrl": { + "label": "Custom Database URL", + "description": "Full JDBC connection string (e.g., jdbc:postgresql://localhost:5432/postgres). If provided, individual connection settings below are not used." + }, + "type": { + "label": "Database Type", + "description": "Type of database (not used if custom URL is provided)" + }, + "hostName": { + "label": "Host Name", + "description": "Database server hostname (not used if custom URL is provided)" + }, + "port": { + "label": "Port", + "description": "Database server port (not used if custom URL is provided)" + }, + "name": { + "label": "Database Name", + "description": "Name of the database (not used if custom URL is provided)" + }, + "username": { + "label": "Username", + "description": "Database authentication username" + }, + "password": { + "label": "Password", + "description": "Database authentication password" + } + }, + "privacy": { + "title": "Privacy", + "description": "Configure privacy and data collection settings.", + "analytics": "Analytics & Tracking", + "enableAnalytics": { + "label": "Enable Analytics", + "description": "Collect anonymous usage analytics to help improve the application" + }, + "metricsEnabled": { + "label": "Enable Metrics", + "description": "Enable collection of performance and usage metrics. Provides API endpoint for admins to access metrics data" + }, + "searchEngine": "Search Engine Visibility", + "googleVisibility": { + "label": "Google Visibility", + "description": "Allow search engines to index this application" + } + }, + "advanced": { + "title": "Advanced", + "description": "Configure advanced features and experimental functionality.", + "features": "Feature Flags", + "processing": "Processing", + "endpoints": { + "label": "Endpoints", + "manage": "Manage API Endpoints", + "description": "Endpoint management is configured via YAML. See documentation for details on enabling/disabling specific endpoints." + }, + "enableAlphaFunctionality": { + "label": "Enable Alpha Features", + "description": "Enable experimental and alpha-stage features (may be unstable)" + }, + "enableUrlToPDF": { + "label": "Enable URL to PDF", + "description": "Allow conversion of web pages to PDF documents" + }, + "maxDPI": { + "label": "Maximum DPI", + "description": "Maximum DPI for image processing (0 = unlimited)" + }, + "tessdataDir": { + "label": "Tessdata Directory", + "description": "Path to the tessdata directory for OCR language files" + }, + "disableSanitize": { + "label": "Disable HTML Sanitization", + "description": "WARNING: Security risk - disabling HTML sanitization can lead to XSS vulnerabilities" + }, + "tempFileManagement": { + "label": "Temp File Management", + "description": "Configure temporary file storage and cleanup behavior", + "baseTmpDir": { + "label": "Base Temp Directory", + "description": "Base directory for temporary files (leave empty for default: java.io.tmpdir/stirling-pdf)" + }, + "libreofficeDir": { + "label": "LibreOffice Temp Directory", + "description": "Directory for LibreOffice temp files (leave empty for default: baseTmpDir/libreoffice)" + }, + "systemTempDir": { + "label": "System Temp Directory", + "description": "System temp directory to clean (only used if cleanupSystemTemp is enabled)" + }, + "prefix": { + "label": "Temp File Prefix", + "description": "Prefix for temp file names" + }, + "maxAgeHours": { + "label": "Max Age (hours)", + "description": "Maximum age in hours before temp files are cleaned up" + }, + "cleanupIntervalMinutes": { + "label": "Cleanup Interval (minutes)", + "description": "How often to run cleanup (in minutes)" + }, + "startupCleanup": { + "label": "Startup Cleanup", + "description": "Clean up old temp files on application startup" + }, + "cleanupSystemTemp": { + "label": "Cleanup System Temp", + "description": "Whether to clean broader system temp directory (use with caution)" + } + }, + "processExecutor": { + "label": "Process Executor Limits", + "description": "Configure session limits and timeouts for each process executor", + "sessionLimit": { + "label": "Session Limit", + "description": "Maximum concurrent instances" + }, + "timeout": { + "label": "Timeout (minutes)", + "description": "Maximum execution time" + }, + "libreOffice": "LibreOffice", + "pdfToHtml": "PDF to HTML", + "qpdf": "QPDF", + "tesseract": "Tesseract OCR", + "pythonOpenCv": "Python OpenCV", + "weasyPrint": "WeasyPrint", + "installApp": "Install App", + "calibre": "Calibre", + "ghostscript": "Ghostscript", + "ocrMyPdf": "OCRmyPDF" + } + }, + "mail": { + "title": "Mail Server", + "description": "Configure SMTP settings for sending email notifications.", + "smtp": "SMTP Configuration", + "enabled": { + "label": "Enable Mail", + "description": "Enable email notifications and SMTP functionality" + }, + "host": { + "label": "SMTP Host", + "description": "The hostname or IP address of your SMTP server" + }, + "port": { + "label": "SMTP Port", + "description": "The port number for SMTP connection (typically 25, 465, or 587)" + }, + "username": { + "label": "SMTP Username", + "description": "Username for SMTP authentication" + }, + "password": { + "label": "SMTP Password", + "description": "Password for SMTP authentication" + }, + "from": { + "label": "From Address", + "description": "The email address to use as the sender" + }, + "enableInvites": { + "label": "Enable Email Invites", + "description": "Allow admins to invite users via email with auto-generated passwords" + }, + "frontendUrl": { + "label": "Frontend URL", + "description": "Base URL for frontend (e.g. https://pdf.example.com). Used for generating invite links in emails. Leave empty to use backend URL." + } + }, + "legal": { + "title": "Legal Documents", + "description": "Configure links to legal documents and policies.", + "disclaimer": { + "title": "Legal Responsibility Warning", + "message": "By customizing these legal documents, you assume full responsibility for ensuring compliance with all applicable laws and regulations, including but not limited to GDPR and other EU data protection requirements. Only modify these settings if: (1) you are operating a personal/private instance, (2) you are outside EU jurisdiction and understand your local legal obligations, or (3) you have obtained proper legal counsel and accept sole responsibility for all user data and legal compliance. Stirling-PDF and its developers assume no liability for your legal obligations." + }, + "termsAndConditions": { + "label": "Terms and Conditions", + "description": "URL or filename to terms and conditions" + }, + "privacyPolicy": { + "label": "Privacy Policy", + "description": "URL or filename to privacy policy" + }, + "accessibilityStatement": { + "label": "Accessibility Statement", + "description": "URL or filename to accessibility statement" + }, + "cookiePolicy": { + "label": "Cookie Policy", + "description": "URL or filename to cookie policy" + }, + "impressum": { + "label": "Impressum", + "description": "URL or filename to impressum (required in some jurisdictions)" + } + }, + "premium": { + "title": "Premium & Enterprise", + "description": "Configure your premium or enterprise license key.", + "license": "License Configuration", + "key": { + "label": "License Key", + "description": "Enter your premium or enterprise license key" + }, + "enabled": { + "label": "Enable Premium Features", + "description": "Enable license key checks for pro/enterprise features" + }, + "movedFeatures": { + "title": "Premium Features Distributed", + "message": "Premium and Enterprise features are now organized in their respective sections:" + } + }, + "features": { + "title": "Features", + "description": "Configure optional features and functionality.", + "serverCertificate": { + "label": "Server Certificate", + "description": "Configure server-side certificate generation for \"Sign with Stirling-PDF\" functionality", + "enabled": { + "label": "Enable Server Certificate", + "description": "Enable server-side certificate for \"Sign with Stirling-PDF\" option" + }, + "organizationName": { + "label": "Organization Name", + "description": "Organization name for generated certificates" + }, + "validity": { + "label": "Certificate Validity (days)", + "description": "Number of days the certificate will be valid" + }, + "regenerateOnStartup": { + "label": "Regenerate on Startup", + "description": "Generate new certificate on each application startup" + } + } + }, + "endpoints": { + "title": "API Endpoints", + "description": "Control which API endpoints and endpoint groups are available.", + "management": "Endpoint Management", + "toRemove": { + "label": "Disabled Endpoints", + "description": "Select individual endpoints to disable" + }, + "groupsToRemove": { + "label": "Disabled Endpoint Groups", + "description": "Select endpoint groups to disable" + }, + "note": "Note: Disabling endpoints restricts API access but does not remove UI components. Restart required for changes to take effect." + } + } }, "fileUpload": { + "selectFile": "Select a file", + "selectFiles": "Select files", + "selectPdfToView": "Select a PDF to view", + "selectPdfToEdit": "Select a PDF to edit", + "chooseFromStorage": "Choose a file from storage or upload a new PDF", + "chooseFromStorageMultiple": "Choose files from storage or upload new PDFs", + "loadFromStorage": "Load from Storage", + "filesAvailable": "files available", "loading": "Laddar...", - "or": "eller" + "or": "eller", + "dropFileHere": "Drop file here or click to upload", + "dropFilesHere": "Drop files here or click the upload button", + "pdfFilesOnly": "PDF files only", + "supportedFileTypes": "Supported file types", + "upload": "Upload", + "uploadFile": "Upload File", + "uploadFiles": "Upload Files", + "noFilesInStorage": "No files available in storage. Upload some files first.", + "selectFromStorage": "Select from Storage", + "backToTools": "Back to Tools", + "addFiles": "Add Files", + "dragFilesInOrClick": "Drag files in or click \"Add Files\" to browse" + }, + "fileEditor": { + "addFiles": "Add Files" }, "fileManager": { + "title": "Upload PDF Files", + "subtitle": "Add files to your storage for easy access across tools", + "filesSelected": "files selected", + "clearSelection": "Clear Selection", + "openInFileEditor": "Open in File Editor", + "uploadError": "Failed to upload some files.", + "failedToOpen": "Failed to open file. It may have been removed from storage.", + "failedToLoad": "Failed to load file to active set.", + "storageCleared": "Browser cleared storage. Files have been removed. Please re-upload.", + "clearAll": "Clear All", + "reloadFiles": "Reload Files", + "dragDrop": "Drag & Drop files here", + "clickToUpload": "Click to upload files", + "selectedFiles": "Selected Files", + "storage": "Storage", + "filesStored": "files stored", + "storageError": "Storage error occurred", + "storageLow": "Storage is running low. Consider removing old files.", + "supportMessage": "Powered by browser database storage for unlimited capacity", + "noFileSelected": "No files selected", + "showHistory": "Show History", + "hideHistory": "Hide History", + "fileHistory": "File History", + "loadingHistory": "Loading History...", + "lastModified": "Last Modified", + "toolChain": "Tools Applied", + "restore": "Restore", + "unzip": "Unzip", + "searchFiles": "Search files...", + "recent": "Recent", + "localFiles": "Local Files", + "googleDrive": "Google Drive", + "googleDriveShort": "Drive", + "myFiles": "My Files", + "noRecentFiles": "No recent files found", + "googleDriveNotAvailable": "Google Drive integration not available", + "openFiles": "Open Files", + "openFile": "Open File", + "details": "File Details", "fileName": "Namn", + "fileFormat": "Format", + "fileSize": "Size", + "fileVersion": "Version", + "totalSelected": "Total Selected", + "dropFilesHere": "Drop files here", "selectAll": "Välj allt", + "deselectAll": "Deselect All", "deleteSelected": "Ta bort valda", + "downloadSelected": "Download Selected", + "selectedCount": "{{count}} selected", "download": "Ladda ner", - "delete": "Radera" + "delete": "Radera", + "unsupported": "Unsupported", + "addToUpload": "Add to Upload", + "deleteAll": "Delete All", + "loadingFiles": "Loading files...", + "noFiles": "No files available", + "noFilesFound": "No files found matching your search", + "openInPageEditor": "Open in Page Editor", + "showAll": "Show All", + "sortByDate": "Sort by Date", + "sortByName": "Sort by Name", + "sortBySize": "Sort by Size" + }, + "storage": { + "temporaryNotice": "Files are stored temporarily in your browser and may be cleared automatically", + "storageLimit": "Storage limit", + "storageUsed": "Temporary Storage used", + "storageFull": "Storage is nearly full. Consider removing some files.", + "fileTooLarge": "File too large. Maximum size per file is", + "storageQuotaExceeded": "Storage quota exceeded. Please remove some files before uploading more.", + "approximateSize": "Approximate size" }, "sanitize": { + "title": "Sanitise", + "desc": "Remove potentially harmful elements from PDF files.", "submit": "Sanera PDF", + "completed": "Sanitisation completed successfully", + "error": { + "generic": "Sanitisation failed", + "failed": "An error occurred while sanitising the PDF." + }, + "filenamePrefix": "sanitised", + "sanitizationResults": "Sanitisation Results", "steps": { - "settings": "Inställningar" + "files": "Files", + "settings": "Inställningar", + "results": "Results" + }, + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "options": { + "title": "Sanitisation Options", + "note": "Select the elements you want to remove from the PDF. At least one option must be selected.", + "removeJavaScript": { + "label": "Remove JavaScript", + "desc": "Remove JavaScript actions and scripts from the PDF" + }, + "removeEmbeddedFiles": { + "label": "Remove Embedded Files", + "desc": "Remove any files embedded within the PDF" + }, + "removeXMPMetadata": { + "label": "Remove XMP Metadata", + "desc": "Remove XMP metadata from the PDF" + }, + "removeMetadata": { + "label": "Remove Document Metadata", + "desc": "Remove document information metadata (title, author, etc.)" + }, + "removeLinks": { + "label": "Remove Links", + "desc": "Remove external links and launch actions from the PDF" + }, + "removeFonts": { + "label": "Remove Fonts", + "desc": "Remove embedded fonts from the PDF" + } + } + }, + "addPassword": { + "title": "Lägg till lÃļsenord", + "desc": "Encrypt your PDF document with a password.", + "completed": "Password protection applied", + "submit": "Kryptera", + "filenamePrefix": "encrypted", + "error": { + "failed": "An error occurred while encrypting the PDF." + }, + "passwords": { + "stepTitle": "Passwords & Encryption", + "completed": "Passwords configured", + "user": { + "label": "User Password", + "placeholder": "Enter user password" + }, + "owner": { + "label": "Owner Password", + "placeholder": "Enter owner password" + } + }, + "encryption": { + "keyLength": { + "label": "Encryption Key Length", + "40bit": "40-bit (Low)", + "128bit": "128-bit (Standard)", + "256bit": "256-bit (High)" + } + }, + "results": { + "title": "Encrypted PDFs" + }, + "tooltip": { + "header": { + "title": "Password Protection Overview" + }, + "passwords": { + "title": "Password Types", + "text": "User passwords restrict opening the document, while owner passwords control what can be done with the document once opened. You can set both or just one.", + "bullet1": "User Password: Required to open the PDF", + "bullet2": "Owner Password: Controls document permissions (not supported by all PDF viewers)" + }, + "encryption": { + "title": "Encryption Levels", + "text": "Higher encryption levels provide better security but may not be supported by older PDF viewers.", + "bullet1": "40-bit: Basic security, compatible with older viewers", + "bullet2": "128-bit: Standard security, widely supported", + "bullet3": "256-bit: Maximum security, requires modern viewers" + }, + "permissions": { + "title": "Ändra behÃļrigheter", + "text": "These permissions control what users can do with the PDF. Most effective when combined with an owner password." + } + }, + "tags": "säkra,säkerhet", + "header": "Lägg till lÃļsenord (kryptera)", + "selectText": { + "1": "Välj PDF att kryptera", + "2": "LÃļsenord", + "3": "Längd pÃĨ krypteringsnyckeln", + "4": "HÃļgre värden är starkare, men lägre värden har bättre kompatibilitet.", + "5": "BehÃļrigheter att ställa in", + "6": "FÃļrhindra sammansättning av dokument", + "7": "FÃļrhindra innehÃĨllsextraktion", + "8": "FÃļrhindra extraktion fÃļr tillgänglighet", + "9": "FÃļrhindra att fylla i formulär", + "10": "FÃļrhindra modifiering", + "11": "FÃļrhindra anteckningsändring", + "12": "FÃļrhindra utskrift", + "13": "FÃļrhindra utskrift av olika format", + "14": "ÄgarlÃļsenord", + "15": "Begränsar vad som kan gÃļras med dokumentet när det väl är Ãļppnat (StÃļds inte av alla läsare)", + "16": "Begränsar Ãļppnandet av själva dokumentet" } }, "changePermissions": { "title": "Ändra behÃļrigheter", + "desc": "Change document restrictions and permissions.", + "completed": "Permissions changed", "submit": "Ändra behÃļrigheter", + "error": { + "failed": "An error occurred while changing PDF permissions." + }, "permissions": { "preventAssembly": { "label": "FÃļrhindra sammansättning av dokument" @@ -1731,10 +4580,784 @@ "label": "FÃļrhindra utskrift av olika format" } }, + "results": { + "title": "Modified PDFs" + }, "tooltip": { "header": { "title": "Ändra behÃļrigheter" + }, + "description": { + "text": "Changes document permissions, allowing/disallowing access to different features in PDF readers." + }, + "warning": { + "text": "To make these permissions unchangeable, use the Add Password tool to set an owner password." } } + }, + "removePassword": { + "title": "Ta bort lÃļsenord", + "desc": "Ta bort lÃļsenordsskydd frÃĨn ditt PDF-dokument.", + "tags": "säkra,Dekryptera,säkerhet,ta bort lÃļsenord,radera lÃļsenord", + "password": { + "stepTitle": "Ta bort lÃļsenord", + "label": "Nuvarande lÃļsenord", + "placeholder": "Enter current password", + "completed": "Password configured" + }, + "filenamePrefix": "decrypted", + "error": { + "failed": "An error occurred while removing the password from the PDF." + }, + "tooltip": { + "description": "Removing password protection requires the password that was used to encrypt the PDF. This will decrypt the document, making it accessible without a password." + }, + "submit": "Ta bort", + "results": { + "title": "Decrypted PDFs" + }, + "header": "Ta bort lÃļsenord (Dekryptera)", + "selectText": { + "1": "Välj PDF att dekryptera", + "2": "LÃļsenord" + } + }, + "automate": { + "title": "Automate", + "desc": "Build multi-step workflows by chaining together PDF actions. Ideal for recurring tasks.", + "invalidStep": "Invalid step", + "files": { + "placeholder": "Select files to process with this automation" + }, + "selection": { + "title": "Automation Selection", + "saved": { + "title": "Saved" + }, + "createNew": { + "title": "Create New Automation" + }, + "suggested": { + "title": "Suggested" + } + }, + "creation": { + "createTitle": "Create Automation", + "editTitle": "Edit Automation", + "intro": "Automations run tools sequentially. To get started, add tools in the order you want them to run.", + "name": { + "label": "Automation Name", + "placeholder": "My Automation" + }, + "description": { + "label": "Description (optional)", + "placeholder": "Describe what this automation does..." + }, + "tools": { + "selectTool": "Select a tool...", + "selected": "Selected Tools", + "remove": "Remove tool", + "configure": "Configure tool", + "notConfigured": "! Not Configured", + "addTool": "Add Tool", + "add": "Add a tool..." + }, + "save": "Save Automation", + "unsavedChanges": { + "title": "Unsaved Changes", + "message": "You have unsaved changes. Are you sure you want to go back? All changes will be lost.", + "cancel": "Cancel", + "confirm": "Go Back" + }, + "icon": { + "label": "Icon" + } + }, + "run": { + "title": "Run Automation" + }, + "sequence": { + "unnamed": "Unnamed Automation", + "steps": "{{count}} steps", + "running": "Running Automation...", + "run": "Run Automation", + "finish": "Finish" + }, + "reviewTitle": "Automation Results", + "config": { + "loading": "Loading tool configuration...", + "noSettings": "This tool does not have configurable settings.", + "title": "Configure {{toolName}}", + "description": "Configure the settings for this tool. These settings will be applied when the automation runs.", + "cancel": "Cancel", + "save": "Save Configuration" + }, + "copyToSaved": "Copy to Saved" + }, + "automation": { + "suggested": { + "securePdfIngestion": "Secure PDF Ingestion", + "securePdfIngestionDesc": "Comprehensive PDF processing workflow that sanitises documents, applies OCR with cleanup, converts to PDF/A format for long-term archival, and optimises file size.", + "emailPreparation": "Email Preparation", + "emailPreparationDesc": "Optimises PDFs for email distribution by compressing files, splitting large documents into 20MB chunks for email compatibility, and removing metadata for privacy.", + "secureWorkflow": "Security Workflow", + "secureWorkflowDesc": "Secures PDF documents by removing potentially malicious content like JavaScript and embedded files, then adds password protection to prevent unauthorised access. Password is set to 'password' by default.", + "processImages": "Process Images", + "processImagesDesc": "Converts multiple image files into a single PDF document, then applies OCR technology to extract searchable text from the images." + } + }, + "common": { + "copy": "Copy", + "copied": "Copied!", + "refresh": "Refresh", + "retry": "Retry", + "remaining": "remaining", + "used": "used", + "available": "available", + "cancel": "Cancel", + "preview": "Preview" + }, + "config": { + "overview": { + "title": "Application Configuration", + "description": "Current application settings and configuration details." + }, + "account": { + "overview": { + "title": "Account Settings", + "manageAccountPreferences": "Manage your account preferences", + "guestDescription": "You are signed in as a guest. Consider upgrading your account above." + }, + "upgrade": { + "title": "Upgrade Guest Account", + "description": "Link your account to preserve your history and access more features!", + "socialLogin": "Upgrade with Social Account", + "linkWith": "Link with", + "emailPassword": "or enter your email & password", + "email": "Email", + "emailPlaceholder": "Enter your email", + "password": "Password (optional)", + "passwordPlaceholder": "Set a password", + "passwordNote": "Leave empty to use email verification only", + "upgradeButton": "Upgrade Account" + } + }, + "apiKeys": { + "description": "Your API key for accessing Stirling's suite of PDF tools. Copy it to your project or refresh to generate a new one.", + "publicKeyAriaLabel": "Public API key", + "copyKeyAriaLabel": "Copy API key", + "refreshAriaLabel": "Refresh API key", + "includedCredits": "Included credits", + "purchasedCredits": "Purchased credits", + "totalCredits": "Total Credits", + "chartAriaLabel": "Credits usage: included {{includedUsed}} of {{includedTotal}}, purchased {{purchasedUsed}} of {{purchasedTotal}}", + "nextReset": "Next Reset", + "lastApiUse": "Last API Use", + "overlayMessage": "Generate a key to see credits and available credits", + "label": "API Key", + "guestInfo": "Guest users do not receive API keys. Create an account to get an API key you can use in your applications.", + "goToAccount": "Go to Account", + "refreshModal": { + "title": "Refresh API Keys", + "warning": "âš ī¸ Warning: This action will generate new API keys and make your previous keys invalid.", + "impact": "Any applications or services currently using these keys will stop working until you update them with the new keys.", + "confirmPrompt": "Are you sure you want to continue?", + "confirmCta": "Refresh Keys" + }, + "generateError": "We couldn't generate your API key." + } + }, + "AddAttachmentsRequest": { + "attachments": "Select Attachments", + "info": "Select files to attach to your PDF. These files will be embedded and accessible through the PDF's attachment panel.", + "selectFiles": "Select Files to Attach", + "placeholder": "Choose files...", + "addMoreFiles": "Add more files...", + "selectedFiles": "Selected Files", + "submit": "Add Attachments", + "results": { + "title": "Attachment Results" + }, + "error": { + "failed": "Add attachments operation failed" + } + }, + "termsAndConditions": "Terms & Conditions", + "logOut": "Log out", + "addAttachments": { + "error": { + "failed": "An error occurred while adding attachments to the PDF." + } + }, + "autoRename": { + "description": "This tool will automatically rename PDF files based on their content. It analyzes the document to find the most suitable title from the text." + }, + "customPosition": "Custom Position", + "details": "Details", + "downloadUnavailable": "Download unavailable for this item", + "invalidUndoData": "Cannot undo: invalid operation data", + "margin": { + "large": "Large", + "medium": "Medium", + "small": "Small", + "xLarge": "Extra Large" + }, + "noFilesToUndo": "Cannot undo: no files were processed in the last operation", + "noOperationToUndo": "No operation to undo", + "noValidFiles": "No valid files to process", + "operationCancelled": "Operation cancelled", + "pageEdit": { + "deselectAll": "Select None", + "selectAll": "Select All" + }, + "quickPosition": "Quick Position", + "reorganizePages": { + "error": { + "failed": "Failed to reorganize pages" + }, + "results": { + "title": "Pages Reorganized" + }, + "settings": { + "title": "Settings" + }, + "submit": "Reorganize Pages" + }, + "replace-color": { + "options": { + "fill": "Fill colour", + "gradient": "Gradient" + }, + "previewOverlayOpacity": "Preview overlay opacity", + "previewOverlayTransparency": "Preview overlay transparency", + "previewOverlayVisibility": "Show preview overlay", + "selectText": { + "1": "Ersätt eller Invertera färgalternativ", + "2": "Standard (standard hÃļghastighetsfärg)", + "3": "Anpassad (anpassade färger)", + "4": "Full-Invertera (invertera alla färger)", + "5": "HÃļghastighetsfärgalternativ", + "6": "Vit text pÃĨ svart bakgrund", + "7": "Svart text pÃĨ vit bakgrund", + "8": "Gul text pÃĨ svart bakgrund", + "9": "GrÃļn text pÃĨ svart bakgrund", + "10": "Välj textfärg", + "11": "Välj bakgrundsfärg", + "12": "Choose start colour", + "13": "Choose end colour" + }, + "submit": "Ersätt", + "title": "Ersätt-Invertera-Färg", + "header": "Ersätt-Invertera färg pÃĨ PDF" + }, + "size": "Size", + "submit": "Submit", + "success": "Success", + "tools": { + "noSearchResults": "No tools found", + "noTools": "No tools available" + }, + "undoDataMismatch": "Cannot undo: operation data is corrupted", + "undoFailed": "Failed to undo operation", + "undoQuotaError": "Cannot undo: insufficient storage space", + "undoStorageError": "Undo completed but some files could not be saved to storage", + "undoSuccess": "Operation undone successfully", + "unsupported": "Unsupported", + "onboarding": { + "welcomeModal": { + "title": "Welcome to Stirling PDF!", + "description": "Would you like to take a quick 1-minute tour to learn the key features and how to get started?", + "helpHint": "You can always access this tour later from the Help button in the bottom left.", + "startTour": "Start Tour", + "maybeLater": "Maybe Later", + "dontShowAgain": "Don't Show Again" + }, + "allTools": "This is the All Tools panel, where you can browse and select from all available PDF tools.", + "selectCropTool": "Let's select the Crop tool to demonstrate how to use one of the tools.", + "toolInterface": "This is the Crop tool interface. As you can see, there's not much there because we haven't added any PDF files to work with yet.", + "filesButton": "The Files button on the Quick Access bar allows you to upload PDFs to use the tools on.", + "fileSources": "You can upload new files or access recent files from here. For the tour, we'll just use a sample file.", + "workbench": "This is the Workbench - the main area where you view and edit your PDFs.", + "viewSwitcher": "Use these controls to select how you want to view your PDFs.", + "viewer": "The Viewer lets you read and annotate your PDFs.", + "pageEditor": "The Page Editor allows you to do various operations on the pages within your PDFs, such as reordering, rotating and deleting.", + "activeFiles": "The Active Files view shows all of the PDFs you have loaded into the tool, and allows you to select which ones to process.", + "fileCheckbox": "Clicking one of the files selects it for processing. You can select multiple files for batch operations.", + "selectControls": "The Right Rail contains buttons to quickly select/deselect all of your active PDFs, along with buttons to change the app's theme or language.", + "cropSettings": "Now that we've selected the file we want crop, we can configure the Crop tool to choose the area that we want to crop the PDF to.", + "runButton": "Once the tool has been configured, this button allows you to run the tool on all the selected PDFs.", + "results": "After the tool has finished running, the Review step will show a preview of the results in this panel, and allow you to undo the operation or download the file. ", + "fileReplacement": "The modified file will replace the original file in the Workbench automatically, allowing you to easily run it through more tools.", + "pinButton": "You can use the Pin button if you'd rather your files stay active after running tools on them.", + "wrapUp": "You're all set! You've learnt about the main areas of the app and how to use them. Click the Help button whenever you like to see this tour again.", + "previous": "Previous", + "next": "Next", + "finish": "Finish", + "startTour": "Start Tour", + "startTourDescription": "Take a guided tour of Stirling PDF's key features" + }, + "workspace": { + "title": "Workspace", + "people": { + "title": "People", + "description": "Manage workspace members and their permissions", + "loading": "Loading people...", + "searchMembers": "Search members...", + "addMembers": "Add Members", + "inviteMembers": { + "label": "Invite Members", + "subtitle": "Type or paste in emails below, separated by commas. Your workspace will be billed by members." + }, + "user": "User", + "role": "Role", + "team": "Team", + "status": "Status", + "actions": "Actions", + "noMembersFound": "No members found", + "active": "Active", + "disabled": "Disabled", + "activeSession": "Active session", + "member": "Member", + "admin": "Admin", + "roleDescriptions": { + "admin": "Can manage settings and invite members, with full administrative access.", + "member": "Can view and edit shared files, but cannot manage workspace settings or members." + }, + "editRole": "Edit Role", + "enable": "Enable", + "disable": "Disable", + "deleteUser": "Delete User", + "deleteUserSuccess": "User deleted successfully", + "deleteUserError": "Failed to delete user", + "confirmDelete": "Are you sure you want to delete this user? This action cannot be undone.", + "addMember": { + "title": "Add Member", + "username": "Username (Email)", + "usernamePlaceholder": "user@example.com", + "password": "Password", + "passwordPlaceholder": "Enter password", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "forcePasswordChange": "Force password change on first login", + "cancel": "Cancel", + "submit": "Add Member", + "usernameRequired": "Username and password are required", + "passwordTooShort": "Password must be at least 6 characters", + "success": "User created successfully", + "error": "Failed to create user" + }, + "editMember": { + "title": "Edit Member", + "editing": "Editing:", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "cancel": "Cancel", + "submit": "Update Member", + "success": "User updated successfully", + "error": "Failed to update user" + }, + "toggleEnabled": { + "success": "User status updated successfully", + "error": "Failed to update user status" + }, + "delete": { + "success": "User deleted successfully", + "error": "Failed to delete user" + }, + "emailInvite": { + "tab": "Email Invite", + "description": "Type or paste in emails below, separated by commas. Users will receive login credentials via email.", + "emails": "Email Addresses", + "emailsPlaceholder": "user1@example.com, user2@example.com", + "emailsRequired": "At least one email address is required", + "submit": "Send Invites", + "success": "user(s) invited successfully", + "partialSuccess": "Some invites failed", + "allFailed": "Failed to invite users", + "error": "Failed to send invites" + }, + "directInvite": { + "tab": "Direct Create" + }, + "inviteLinkTab": { + "tab": "Invite Link" + }, + "inviteLink": { + "description": "Generate a secure link that allows the user to set their own password", + "email": "Email Address", + "emailPlaceholder": "user@example.com (optional)", + "emailDescription": "Optional - leave blank for a general invite link that can be used by anyone", + "emailRequired": "Email address is required", + "emailOptional": "Optional - leave blank for a general invite link", + "emailRequiredForSend": "Email address is required to send email notification", + "expiryHours": "Expiry Hours", + "expiryDescription": "How many hours until the link expires", + "sendEmail": "Send invite link via email", + "sendEmailDescription": "If enabled, the invite link will be sent to the specified email address", + "smtpRequired": "SMTP not configured", + "generate": "Generate Link", + "generated": "Invite Link Generated", + "copied": "Link copied to clipboard", + "success": "Invite link generated successfully", + "successWithEmail": "Invite link generated and sent via email", + "emailFailed": "Invite link generated, but email failed", + "emailFailedDetails": "Error: {0}. Please share the invite link manually.", + "error": "Failed to generate invite link", + "submit": "Generate Invite Link" + }, + "inviteMode": { + "username": "Username", + "email": "Email", + "link": "Link", + "emailDisabled": "Email invites require SMTP configuration and mail.enableInvites=true in settings" + }, + "license": { + "users": "users", + "availableSlots": "Available Slots", + "grandfathered": "Grandfathered", + "grandfatheredShort": "{{count}} grandfathered", + "fromLicense": "from license", + "slotsAvailable": "{{count}} user slot(s) available", + "noSlotsAvailable": "No slots available", + "currentUsage": "Currently using {{current}} of {{max}} user licences" + } + }, + "teams": { + "title": "Teams", + "description": "Manage teams and organize workspace members", + "loading": "Loading teams...", + "loadingDetails": "Loading team details...", + "createNewTeam": "Create New Team", + "teamName": "Team Name", + "totalMembers": "Total Members", + "actions": "Actions", + "noTeamsFound": "No teams found", + "noMembers": "No members in this team", + "system": "System", + "addMember": "Add Member", + "viewTeam": "View Team", + "removeMember": "Remove from team", + "cannotRemoveFromSystemTeam": "Cannot remove from system team", + "renameTeamLabel": "Rename Team", + "deleteTeamLabel": "Delete Team", + "cannotDeleteInternal": "Cannot delete the Internal team", + "confirmDelete": "Are you sure you want to delete this team? This team must be empty to delete.", + "confirmRemove": "Remove user from this team?", + "cannotRenameInternal": "Cannot rename the Internal team", + "cannotAddToInternal": "Cannot add members to the Internal team", + "teamNotFound": "Team not found", + "backToTeams": "Back to Teams", + "memberCount": "{{count}} members", + "removeMemberSuccess": "User removed from team", + "removeMemberError": "Failed to remove user from team", + "createTeam": { + "title": "Create New Team", + "teamName": "Team Name", + "teamNamePlaceholder": "Enter team name", + "cancel": "Cancel", + "submit": "Create Team", + "nameRequired": "Team name is required", + "success": "Team created successfully", + "error": "Failed to create team" + }, + "renameTeam": { + "title": "Rename Team", + "renaming": "Renaming:", + "newTeamName": "New Team Name", + "newTeamNamePlaceholder": "Enter new team name", + "cancel": "Cancel", + "submit": "Rename Team", + "nameRequired": "Team name is required", + "success": "Team renamed successfully", + "error": "Failed to rename team" + }, + "deleteTeam": { + "success": "Team deleted successfully", + "error": "Failed to delete team. Make sure the team is empty.", + "teamMustBeEmpty": "Team must be empty before deletion" + }, + "addMemberToTeam": { + "title": "Add Member to Team", + "addingTo": "Adding to", + "selectUser": "Select User", + "selectUserPlaceholder": "Choose a user", + "selectUserRequired": "Please select a user", + "currentlyIn": "currently in", + "willBeMoved": "Note: This user will be moved from their current team to this team.", + "cancel": "Cancel", + "submit": "Add Member", + "userRequired": "Please select a user", + "success": "Member added to team successfully", + "error": "Failed to add member to team" + }, + "changeTeam": { + "label": "Change Team", + "title": "Change Team", + "changing": "Moving", + "selectTeam": "Select Team", + "selectTeamPlaceholder": "Choose a team", + "selectTeamRequired": "Please select a team", + "success": "Team changed successfully", + "error": "Failed to change team", + "submit": "Change Team" + } + } + }, + "plan": { + "currency": "Currency", + "popular": "Popular", + "current": "Current Plan", + "upgrade": "Upgrade", + "contact": "Contact Us", + "customPricing": "Custom", + "showComparison": "Compare All Features", + "hideComparison": "Hide Feature Comparison", + "featureComparison": "Feature Comparison", + "activePlan": { + "title": "Active Plan", + "subtitle": "Your current subscription details" + }, + "availablePlans": { + "title": "Available Plans", + "subtitle": "Choose the plan that fits your needs" + }, + "static": { + "title": "Billing Information", + "message": "Online billing is not currently configured. To upgrade your plan or manage subscriptions, please contact us directly.", + "contactSales": "Contact Sales", + "contactToUpgrade": "Contact us to upgrade or customize your plan", + "maxUsers": "Max Users", + "upTo": "Up to" + }, + "period": { + "month": "month" + }, + "free": { + "name": "Free", + "highlight1": "Limited Tool Usage Per week", + "highlight2": "Access to all tools", + "highlight3": "Community support" + }, + "pro": { + "name": "Pro", + "highlight1": "Unlimited Tool Usage", + "highlight2": "Advanced PDF tools", + "highlight3": "No watermarks" + }, + "enterprise": { + "name": "Enterprise", + "highlight1": "Custom pricing", + "highlight2": "Dedicated support", + "highlight3": "Latest features" + }, + "feature": { + "title": "Feature", + "pdfTools": "Basic PDF Tools", + "fileSize": "File Size Limit", + "automation": "Automate tool workflows", + "api": "API Access", + "priority": "Priority Support", + "customPricing": "Custom Pricing" + } + }, + "subscription": { + "status": { + "active": "Active", + "pastDue": "Past Due", + "canceled": "Canceled", + "incomplete": "Incomplete", + "trialing": "Trial", + "none": "No Subscription" + }, + "renewsOn": "Renews on {{date}}", + "cancelsOn": "Cancels on {{date}}" + }, + "billing": { + "manageBilling": "Manage Billing", + "portal": { + "error": "Failed to open billing portal" + } + }, + "payment": { + "preparing": "Preparing your checkout...", + "upgradeTitle": "Upgrade to {{planName}}", + "success": "Payment Successful!", + "successMessage": "Your subscription has been activated successfully. You will receive a confirmation email shortly.", + "autoClose": "This window will close automatically...", + "error": "Payment Error" + }, + "firstLogin": { + "title": "First Time Login", + "welcomeTitle": "Welcome!", + "welcomeMessage": "For security reasons, you must change your password on your first login.", + "loggedInAs": "Logged in as", + "error": "Error", + "currentPassword": "Current Password", + "enterCurrentPassword": "Enter your current password", + "newPassword": "New Password", + "enterNewPassword": "Enter new password (min 8 characters)", + "confirmPassword": "Confirm New Password", + "reEnterNewPassword": "Re-enter new password", + "changePassword": "Change Password", + "allFieldsRequired": "All fields are required", + "passwordsDoNotMatch": "New passwords do not match", + "passwordTooShort": "Password must be at least 8 characters", + "passwordMustBeDifferent": "New password must be different from current password", + "passwordChangedSuccess": "Password changed successfully! Please log in again.", + "passwordChangeFailed": "Failed to change password. Please check your current password." + }, + "invite": { + "welcome": "Welcome to Stirling PDF", + "invalidToken": "Invalid invitation link", + "validationError": "Failed to validate invitation link", + "passwordRequired": "Password is required", + "passwordTooShort": "Password must be at least 6 characters", + "passwordMismatch": "Passwords do not match", + "acceptError": "Failed to create account", + "validating": "Validating invitation...", + "invalidInvitation": "Invalid Invitation", + "goToLogin": "Go to Login", + "welcomeTitle": "You've been invited!", + "welcomeSubtitle": "Complete your account setup to get started", + "accountFor": "Creating account for", + "linkExpires": "Link expires", + "email": "Email address", + "emailPlaceholder": "Enter your email address", + "emailRequired": "Email address is required", + "invalidEmail": "Invalid email address", + "choosePassword": "Choose a password", + "passwordPlaceholder": "Enter your password", + "confirmPassword": "Confirm password", + "confirmPasswordPlaceholder": "Re-enter your password", + "createAccount": "Create Account", + "creating": "Creating Account...", + "alreadyHaveAccount": "Already have an account?", + "signIn": "Sign in" + }, + "audit": { + "error": { + "title": "Error loading audit system" + }, + "notAvailable": "Audit system not available", + "notAvailableMessage": "The audit system is not configured or not available.", + "disabled": "Audit logging is disabled", + "disabledMessage": "Enable audit logging in your application configuration to track system events.", + "systemStatus": { + "title": "System Status", + "status": "Audit Logging", + "enabled": "Enabled", + "disabled": "Disabled", + "level": "Audit Level", + "retention": "Retention Period", + "days": "days", + "totalEvents": "Total Events" + }, + "tabs": { + "dashboard": "Dashboard", + "events": "Audit Events", + "export": "Export" + }, + "charts": { + "title": "Audit Dashboard", + "error": "Error loading charts", + "day": "Day", + "week": "Week", + "month": "Month", + "byType": "Events by Type", + "byUser": "Events by User", + "overTime": "Events Over Time" + }, + "events": { + "title": "Audit Events", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "error": "Error loading events", + "noEvents": "No events found", + "timestamp": "Timestamp", + "type": "Type", + "user": "User", + "ipAddress": "IP Address", + "actions": "Actions", + "viewDetails": "View Details", + "eventDetails": "Event Details", + "details": "Details" + }, + "export": { + "title": "Export Audit Data", + "description": "Export audit events to CSV or JSON format. Use filters to limit the exported data.", + "format": "Export Format", + "filters": "Filters (Optional)", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "exportButton": "Export Data", + "error": "Failed to export data" + } + }, + "usage": { + "noData": "No data available", + "error": "Error loading usage statistics", + "noDataMessage": "No usage statistics are currently available.", + "controls": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All", + "refresh": "Refresh", + "dataTypeLabel": "Data Type:", + "dataType": { + "all": "All", + "api": "API", + "ui": "UI" + } + }, + "showing": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All" + }, + "stats": { + "totalEndpoints": "Total Endpoints", + "totalVisits": "Total Visits", + "showing": "Showing", + "selectedVisits": "Selected Visits" + }, + "chart": { + "title": "Endpoint Usage Chart" + }, + "table": { + "title": "Detailed Statistics", + "endpoint": "Endpoint", + "visits": "Visits", + "percentage": "Percentage", + "noData": "No data available" + } + }, + "backendHealth": { + "checking": "Checking backend status...", + "online": "Backend Online", + "offline": "Backend Offline" + }, + "autoRedact": { + "tags": "Redigera,DÃļlja,svärta,svart,markÃļr,dold", + "title": "Auto-redigera", + "header": "Auto-redigera", + "colorLabel": "Färg", + "textsToRedactLabel": "Text att redigera (radavgränsad)", + "textsToRedactPlaceholder": "t.ex. \\nKonfidentiellt \\nHemligt", + "useRegexLabel": "Använd Regex", + "wholeWordSearchLabel": "Hel ord-sÃļkning", + "customPaddingLabel": "Anpassad extra utfyllnad", + "convertPDFToImageLabel": "Konvertera PDF till PDF-bild (Används fÃļr att ta bort text bakom rutan)", + "submitButton": "Skicka" + }, + "replaceColorPdf": { + "tags": "Ersätt Färg, SidÃĨtgärder, Bakomliggande, Serversid" } -} \ No newline at end of file +} diff --git a/frontend/public/locales/th-TH/translation.json b/frontend/public/locales/th-TH/translation.json index ea56cde7b..e2571aa09 100644 --- a/frontend/public/locales/th-TH/translation.json +++ b/frontend/public/locales/th-TH/translation.json @@ -1,4 +1,40 @@ { + "toolPanel": { + "modePrompt": { + "title": "Choose how you browse tools", + "description": "Preview both layouts and decide how you want to explore Stirling PDF tools.", + "sidebarTitle": "Sidebar mode", + "sidebarDescription": "Keep tools alongside your workspace for quick switching.", + "recommended": "Recommended", + "chooseSidebar": "Use sidebar mode", + "fullscreenTitle": "Fullscreen mode - (legacy)", + "fullscreenDescription": "Browse every tool in a catalogue that covers the workspace until you pick one.", + "chooseFullscreen": "Use fullscreen mode", + "dismiss": "Maybe later" + }, + "fullscreen": { + "showDetails": "Show Details", + "comingSoon": "Coming soon:", + "favorite": "Add to favourites", + "favorites": "Favourites", + "heading": "All tools (fullscreen view)", + "noResults": "Try adjusting your search or toggle descriptions to find what you need.", + "recommended": "Recommended", + "unfavorite": "Remove from favourites" + }, + "placeholder": "Choose a tool to get started", + "toggle": { + "fullscreen": "Switch to fullscreen mode", + "sidebar": "Switch to sidebar mode" + } + }, + "unsavedChanges": "You have unsaved changes to your PDF.", + "areYouSure": "Are you sure you want to leave?", + "unsavedChangesTitle": "Unsaved Changes", + "keepWorking": "Keep Working", + "discardChanges": "Discard & Leave", + "applyAndContinue": "Save & Leave", + "exportAndContinue": "Export & Continue", "language": { "direction": "ltr" }, @@ -18,8 +54,26 @@ "customTextDesc": "ā¸‚āš‰ā¸­ā¸„ā¸§ā¸˛ā¸Ąā¸—ā¸ĩāšˆā¸ā¸ŗā¸Ģā¸™ā¸”āš€ā¸­ā¸‡", "numberPagesDesc": "ā¸Ģā¸Ąā¸˛ā¸ĸāš€ā¸Ĩ⏂ā¸Ģā¸™āš‰ā¸˛ā¸—ā¸ĩāšˆā¸ˆā¸°ā¸ā¸ŗā¸Ģ⏙⏔ ā¸Ģā¸Ąā¸˛ā¸ĸāš€ā¸Ĩā¸‚āš€ā¸Ŗā¸´āšˆā¸Ąā¸•āš‰ā¸™ 'ā¸—ā¸ąāš‰ā¸‡ā¸Ģā¸Ąā¸”', ā¸ĸā¸ąā¸‡ā¸ĸā¸­ā¸Ąā¸Ŗā¸ąā¸š 1-5 ā¸Ģ⏪⏎⏭ 2,5,9 āš€ā¸›āš‡ā¸™ā¸•āš‰ā¸™", "customNumberDesc": "ā¸„āšˆā¸˛āš€ā¸Ŗā¸´āšˆā¸Ąā¸•āš‰ā¸™ {n}, ā¸ĸā¸ąā¸‡ā¸ĸā¸­ā¸Ąā¸Ŗā¸ąā¸š 'ā¸Ģā¸™āš‰ā¸˛ {n} ⏂⏭⏇ {total}', 'ā¸‚āš‰ā¸­ā¸„ā¸§ā¸˛ā¸Ą-{n}', '{filename}-{n}'", - "submit": "āš€ā¸žā¸´āšˆā¸Ąā¸Ģā¸Ąā¸˛ā¸ĸāš€ā¸Ĩ⏂ā¸Ģā¸™āš‰ā¸˛" + "submit": "āš€ā¸žā¸´āšˆā¸Ąā¸Ģā¸Ąā¸˛ā¸ĸāš€ā¸Ĩ⏂ā¸Ģā¸™āš‰ā¸˛", + "configuration": "Configuration", + "customize": "Customize Appearance", + "pagesAndStarting": "Pages & Starting Number", + "positionAndPages": "Position & Pages", + "error": { + "failed": "Add page numbers operation failed" + }, + "results": { + "title": "Page Number Results" + }, + "preview": "Position Selection", + "previewDisclaimer": "Preview is approximate. Final output may vary due to PDF font metrics." }, + "pageSelectionPrompt": "āš€ā¸Ĩ⏎⏭⏁ā¸Ģā¸™āš‰ā¸˛ā¸•ā¸˛ā¸Ąā¸„ā¸§ā¸˛ā¸Ąā¸•āš‰ā¸­ā¸‡ā¸ā¸˛ā¸Ŗ (ā¸›āš‰ā¸­ā¸™ā¸Ģā¸Ąā¸˛ā¸ĸāš€ā¸Ĩ⏂ā¸Ģā¸™āš‰ā¸˛āšā¸ĸā¸ā¸”āš‰ā¸§ā¸ĸāš€ā¸„ā¸Ŗā¸ˇāšˆā¸­ā¸‡ā¸Ģā¸Ąā¸˛ā¸ĸ⏈⏏ā¸Ĩ⏠⏞⏄ āš€ā¸Šāšˆā¸™ 1,5,6 ā¸Ģā¸Ŗā¸ˇā¸­ā¸Ÿā¸ąā¸‡ā¸āšŒā¸Šā¸ąā¸™ āš€ā¸Šāšˆā¸™ 2n+1) :", + "startingNumberTooltip": "The first number to display. Subsequent pages will increment from this number.", + "marginTooltip": "Distance between the page number and the edge of the page.", + "fontSizeTooltip": "Size of the page number text in points. Larger numbers create bigger text.", + "fontTypeTooltip": "Font family for the page numbers. Choose based on your document style.", + "customTextTooltip": "Optional custom format for page numbers. Use {n} as placeholder for the number. Example: \"Page {n}\" will show \"Page 1\", \"Page 2\", etc.", "pdfPrompt": "āš€ā¸Ĩ⏎⏭⏁ PDF", "multiPdfPrompt": "āš€ā¸Ĩ⏎⏭⏁ PDF ā¸Ģā¸Ĩ⏞ā¸ĸāš„ā¸Ÿā¸ĨāšŒ (2 ⏂ā¸ļāš‰ā¸™āš„ā¸›)", "multiPdfDropPrompt": "āš€ā¸Ĩ⏎⏭⏁ (ā¸Ģ⏪⏎⏭ā¸Ĩā¸˛ā¸āšā¸Ĩ⏰⏧⏞⏇) PDF ā¸—ā¸ąāš‰ā¸‡ā¸Ģā¸Ąā¸”ā¸—ā¸ĩāšˆā¸„ā¸¸ā¸“ā¸•āš‰ā¸­ā¸‡ā¸ā¸˛ā¸Ŗ", @@ -30,15 +84,41 @@ "uploadLimitExceededPlural": "are too large. Maximum allowed size is", "processTimeWarning": "ā¸„ā¸ŗāš€ā¸•ā¸ˇā¸­ā¸™: ā¸ā¸Ŗā¸°ā¸šā¸§ā¸™ā¸ā¸˛ā¸Ŗā¸™ā¸ĩāš‰ā¸­ā¸˛ā¸ˆāšƒā¸Šāš‰āš€ā¸§ā¸Ĩ⏞ā¸Ēā¸šā¸‡ā¸Ē⏏⏔ā¸Ģ⏙ā¸ļāšˆā¸‡ā¸™ā¸˛ā¸—ā¸ĩ⏂ā¸ļāš‰ā¸™ā¸­ā¸ĸā¸šāšˆā¸ā¸ąā¸šā¸‚ā¸™ā¸˛ā¸”āš„ā¸Ÿā¸ĨāšŒ", "pageOrderPrompt": "āš€ā¸Ŗā¸ĩā¸ĸ⏇ā¸Ĩā¸ŗā¸”ā¸ąā¸šā¸Ģā¸™āš‰ā¸˛ā¸•ā¸˛ā¸Ąā¸„ā¸§ā¸˛ā¸Ąā¸•āš‰ā¸­ā¸‡ā¸ā¸˛ā¸Ŗ (ā¸›āš‰ā¸­ā¸™ā¸Ģā¸Ąā¸˛ā¸ĸāš€ā¸Ĩ⏂ā¸Ģā¸™āš‰ā¸˛āšā¸ĸā¸ā¸”āš‰ā¸§ā¸ĸāš€ā¸„ā¸Ŗā¸ˇāšˆā¸­ā¸‡ā¸Ģā¸Ąā¸˛ā¸ĸ⏈⏏ā¸Ĩ⏠⏞⏄ā¸Ģā¸Ŗā¸ˇā¸­ā¸Ÿā¸ąā¸‡ā¸āšŒā¸Šā¸ąā¸™ āš€ā¸Šāšˆā¸™ 2n+1) :", - "pageSelectionPrompt": "āš€ā¸Ĩ⏎⏭⏁ā¸Ģā¸™āš‰ā¸˛ā¸•ā¸˛ā¸Ąā¸„ā¸§ā¸˛ā¸Ąā¸•āš‰ā¸­ā¸‡ā¸ā¸˛ā¸Ŗ (ā¸›āš‰ā¸­ā¸™ā¸Ģā¸Ąā¸˛ā¸ĸāš€ā¸Ĩ⏂ā¸Ģā¸™āš‰ā¸˛āšā¸ĸā¸ā¸”āš‰ā¸§ā¸ĸāš€ā¸„ā¸Ŗā¸ˇāšˆā¸­ā¸‡ā¸Ģā¸Ąā¸˛ā¸ĸ⏈⏏ā¸Ĩ⏠⏞⏄ āš€ā¸Šāšˆā¸™ 1,5,6 ā¸Ģā¸Ŗā¸ˇā¸­ā¸Ÿā¸ąā¸‡ā¸āšŒā¸Šā¸ąā¸™ āš€ā¸Šāšˆā¸™ 2n+1) :", "goToPage": "āš„ā¸›ā¸—ā¸ĩāšˆā¸Ģā¸™āš‰ā¸˛", "true": "ā¸ˆā¸Ŗā¸´ā¸‡", "false": "āš€ā¸—āš‡ā¸ˆ", "unknown": "āš„ā¸Ąāšˆā¸—ā¸Ŗā¸˛ā¸š", + "app": { + "description": "The Free Adobe Acrobat alternative (10M+ Downloads)" + }, "save": "ā¸šā¸ąā¸™ā¸—ā¸ļ⏁", "saveToBrowser": "ā¸šā¸ąā¸™ā¸—ā¸ļā¸āšƒā¸™āš€ā¸šā¸Ŗā¸˛ā¸§āšŒāš€ā¸‹ā¸­ā¸ŖāšŒ", + "download": "ā¸”ā¸˛ā¸§ā¸™āšŒāš‚ā¸Ģā¸Ĩ⏔", + "pin": "Pin File (keep active after tool run)", + "unpin": "Unpin File (replace after tool run)", + "undoOperationTooltip": "Click to undo the last operation and restore the original files", + "undo": "Undo", + "moreOptions": "More Options", + "editYourNewFiles": "Edit your new file(s)", "close": "⏛⏴⏔", + "openInViewer": "Open in Viewer", + "confirmClose": "Confirm Close", + "confirmCloseMessage": "Are you sure you want to close this file?", + "confirmCloseCancel": "Cancel", + "confirmCloseConfirm": "Close File", + "fileSelected": "Selected: {{filename}}", + "chooseFile": "Choose File", "filesSelected": "āš„ā¸Ÿā¸ĨāšŒā¸—ā¸ĩāšˆāš€ā¸Ĩ⏎⏭⏁", + "files": { + "title": "Files", + "upload": "Upload", + "uploadFiles": "Upload Files", + "addFiles": "Add files", + "selectFromWorkbench": "Select files from the workbench or ", + "selectMultipleFromWorkbench": "Select at least {{count}} files from the workbench or ", + "created": "Created", + "size": "File Size" + }, "noFavourites": "āš„ā¸Ąāšˆā¸Ąā¸ĩ⏪⏞ā¸ĸā¸ā¸˛ā¸Ŗāš‚ā¸›ā¸Ŗā¸”ā¸—ā¸ĩāšˆāš€ā¸žā¸´āšˆā¸Ą", "downloadComplete": "ā¸ā¸˛ā¸Ŗā¸”ā¸˛ā¸§ā¸™āšŒāš‚ā¸Ģā¸Ĩā¸”āš€ā¸Ēā¸Ŗāš‡ā¸ˆā¸Ēā¸Ąā¸šā¸šā¸Ŗā¸“āšŒ", "bored": "āš€ā¸šā¸ˇāšˆā¸­ā¸Ŗā¸­ā¸Ģ⏪⏎⏭ā¸ĸā¸ąā¸‡?", @@ -56,7 +136,10 @@ }, "error": { "pdfPassword": "āš€ā¸­ā¸ā¸Ē⏞⏪ PDF ā¸Ąā¸ĩ⏪ā¸Ģā¸ąā¸Ēā¸œāšˆā¸˛ā¸™ āšā¸Ĩā¸°āš„ā¸Ąāšˆāš„ā¸”āš‰ā¸Ŗā¸°ā¸šā¸¸ā¸Ŗā¸Ģā¸ąā¸Ēā¸œāšˆā¸˛ā¸™ā¸Ģ⏪⏎⏭⏪ā¸Ģā¸ąā¸Ēā¸œāšˆā¸˛ā¸™āš„ā¸Ąāšˆā¸–ā¸šā¸ā¸•āš‰ā¸­ā¸‡", + "encryptedPdfMustRemovePassword": "This PDF is encrypted or password-protected. Please unlock it before converting to PDF/A.", + "incorrectPasswordProvided": "The PDF password is incorrect or not provided.", "_value": "ā¸‚āš‰ā¸­ā¸œā¸´ā¸”ā¸žā¸Ĩ⏞⏔", + "dismissAllErrors": "Dismiss All Errors", "sorry": "ā¸‚ā¸­ā¸­ā¸ ā¸ąā¸ĸāšƒā¸™ā¸›ā¸ąā¸ā¸Ģ⏞!", "needHelp": "ā¸•āš‰ā¸­ā¸‡ā¸ā¸˛ā¸Ŗā¸„ā¸§ā¸˛ā¸Ąā¸Šāšˆā¸§ā¸ĸāš€ā¸Ģā¸Ĩ⏎⏭ / ā¸žā¸šā¸›ā¸ąā¸ā¸Ģ⏞?", "contactTip": "ā¸Ģ⏞⏁⏄⏏⏓ā¸ĸā¸ąā¸‡ā¸Ąā¸ĩā¸›ā¸ąā¸ā¸Ģ⏞ ⏭ā¸ĸāšˆā¸˛ā¸Ĩā¸ąā¸‡āš€ā¸Ĩ⏗ā¸ĩāšˆā¸ˆā¸°ā¸•ā¸´ā¸”ā¸•āšˆā¸­āš€ā¸Ŗā¸˛āš€ā¸žā¸ˇāšˆā¸­ā¸‚ā¸­ā¸„ā¸§ā¸˛ā¸Ąā¸Šāšˆā¸§ā¸ĸāš€ā¸Ģā¸Ĩ⏎⏭ ⏄⏏⏓ā¸Ēā¸˛ā¸Ąā¸˛ā¸Ŗā¸–ā¸Ēāšˆā¸‡ā¸•ā¸ąāš‹ā¸§ā¸šā¸™ā¸Ģā¸™āš‰ā¸˛ā¸‚ā¸­ā¸‡āš€ā¸Ŗā¸˛āšƒā¸™ GitHub ā¸Ģ⏪⏎⏭ ā¸•ā¸´ā¸”ā¸•āšˆā¸­āš€ā¸Ŗā¸˛ā¸œāšˆā¸˛ā¸™ Discord:", @@ -71,6 +154,10 @@ "githubSubmit": "GitHub - ā¸Ēāšˆā¸‡ā¸•ā¸ąāš‹ā¸§", "discordSubmit": "Discord - ā¸Ēāšˆā¸‡āš‚ā¸žā¸Ēā¸•āšŒā¸ā¸˛ā¸Ŗā¸Ēā¸™ā¸ąā¸šā¸Ē⏙⏏⏙" }, + "warning": { + "tooltipTitle": "Warning" + }, + "edit": "Edit", "delete": "ā¸Ĩ⏚", "username": "ā¸Šā¸ˇāšˆā¸­ā¸œā¸šāš‰āšƒā¸Šāš‰", "password": "⏪ā¸Ģā¸ąā¸Ēā¸œāšˆā¸˛ā¸™", @@ -82,6 +169,7 @@ "green": "āš€ā¸‚ā¸ĩā¸ĸ⏧", "blue": "ā¸™āš‰ā¸ŗāš€ā¸‡ā¸´ā¸™", "custom": "ā¸›ā¸Ŗā¸ąā¸šāšā¸•āšˆā¸‡...", + "comingSoon": "Coming soon", "WorkInProgess": "⏁⏺ā¸Ĩā¸ąā¸‡ā¸”ā¸ŗāš€ā¸™ā¸´ā¸™ā¸ā¸˛ā¸Ŗ ā¸­ā¸˛ā¸ˆāš„ā¸Ąāšˆā¸—ā¸ŗā¸‡ā¸˛ā¸™ā¸Ģā¸Ŗā¸ˇā¸­ā¸Ąā¸ĩā¸šā¸ąāšŠā¸ āš‚ā¸›ā¸Ŗā¸”ā¸Ŗā¸˛ā¸ĸā¸‡ā¸˛ā¸™ā¸›ā¸ąā¸ā¸Ģā¸˛āšƒā¸” āš†!", "poweredBy": "ā¸‚ā¸ąā¸šāš€ā¸„ā¸Ĩā¸ˇāšˆā¸­ā¸™āš‚ā¸”ā¸ĸ", "yes": "āšƒā¸Šāšˆ", @@ -115,12 +203,14 @@ "page": "ā¸Ģā¸™āš‰ā¸˛", "pages": "ā¸Ģā¸™āš‰ā¸˛", "loading": "⏁⏺ā¸Ĩā¸ąā¸‡āš‚ā¸Ģā¸Ĩ⏔...", + "review": "Review", "addToDoc": "āš€ā¸žā¸´āšˆā¸Ąāš€ā¸‚āš‰ā¸˛ā¸Ēā¸šāšˆāš€ā¸­ā¸ā¸Ē⏞⏪", "reset": "Reset", "apply": "Apply", "noFileSelected": "No file selected. Please upload one.", "legal": { "privacy": "ā¸™āš‚ā¸ĸ⏚⏞ā¸ĸā¸„ā¸§ā¸˛ā¸Ąāš€ā¸›āš‡ā¸™ā¸Ēāšˆā¸§ā¸™ā¸•ā¸ąā¸§", + "iAgreeToThe": "I agree to all of the", "terms": "ā¸‚āš‰ā¸­ā¸ā¸ŗā¸Ģā¸™ā¸”ā¸ā¸˛ā¸Ŗāšƒā¸Šāš‰ā¸‡ā¸˛ā¸™", "accessibility": "ā¸„ā¸§ā¸˛ā¸Ąāš€ā¸‚āš‰ā¸˛ā¸–ā¸ļ⏇", "cookie": "ā¸™āš‚ā¸ĸ⏚⏞ā¸ĸ⏄⏏⏁⏁ā¸ĩāš‰", @@ -160,6 +250,7 @@ "title": "ā¸„ā¸¸ā¸“ā¸•āš‰ā¸­ā¸‡ā¸ā¸˛ā¸Ŗā¸—ā¸ĩāšˆā¸ˆā¸°ā¸—ā¸ŗāšƒā¸Ģāš‰ Stirling PDF ⏔ā¸ĩā¸ĸā¸´āšˆā¸‡ā¸‚ā¸ļāš‰ā¸™āš„ā¸Ģā¸Ą?", "paragraph1": "Stirling PDF ā¸Ąā¸ĩā¸ā¸˛ā¸Ŗā¸§ā¸´āš€ā¸„ā¸Ŗā¸˛ā¸°ā¸ĢāšŒāšā¸šā¸šā¸Ēā¸Ąā¸ąā¸„ā¸Ŗāšƒā¸ˆāš€ā¸žā¸ˇāšˆā¸­ā¸Šāšˆā¸§ā¸ĸāš€ā¸Ŗā¸˛ā¸›ā¸Ŗā¸ąā¸šā¸›ā¸Ŗā¸¸ā¸‡ā¸œā¸Ĩā¸´ā¸•ā¸ ā¸ąā¸“ā¸‘āšŒ āš€ā¸Ŗā¸˛āš„ā¸Ąāšˆā¸™ā¸ŗā¸—ā¸˛ā¸‡ā¸„ā¸§ā¸˛ā¸Ąāš€ā¸›āš‡ā¸™ā¸Ēāšˆā¸§ā¸™ā¸•ā¸ąā¸§ā¸Ģā¸Ŗā¸ˇā¸­āš€ā¸™ā¸ˇāš‰ā¸­ā¸Ģā¸˛ā¸‚ā¸­ā¸‡āš„ā¸Ÿā¸ĨāšŒāš„ā¸›āš€ā¸āš‡ā¸šā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩāšƒā¸” āš†", "paragraph2": "āš‚ā¸›ā¸Ŗā¸”ā¸žā¸´ā¸ˆā¸˛ā¸Ŗā¸“ā¸˛ā¸ā¸˛ā¸Ŗāš€ā¸›ā¸´ā¸”āšƒā¸Šāš‰ā¸‡ā¸˛ā¸™ā¸ā¸˛ā¸Ŗā¸§ā¸´āš€ā¸„ā¸Ŗā¸˛ā¸°ā¸ĢāšŒāš€ā¸žā¸ˇāšˆā¸­ā¸Šāšˆā¸§ā¸ĸāšƒā¸Ģāš‰ Stirling-PDF āš€ā¸ˆā¸Ŗā¸´ā¸āš€ā¸•ā¸´ā¸šāš‚ā¸•āšā¸Ĩā¸°ā¸—ā¸ŗāšƒā¸Ģāš‰āš€ā¸Ŗā¸˛āš€ā¸‚āš‰ā¸˛āšƒā¸ˆā¸œā¸šāš‰āšƒā¸Šāš‰ā¸‡ā¸˛ā¸™ā¸Ąā¸˛ā¸ā¸‚ā¸ļāš‰ā¸™", + "learnMore": "Learn more", "enable": "āš€ā¸›ā¸´ā¸”ā¸ā¸˛ā¸Ŗā¸§ā¸´āš€ā¸„ā¸Ŗā¸˛ā¸°ā¸ĢāšŒ", "disable": "ā¸›ā¸´ā¸”ā¸ā¸˛ā¸Ŗā¸§ā¸´āš€ā¸„ā¸Ŗā¸˛ā¸°ā¸ĢāšŒ", "settings": "⏄⏏⏓ā¸Ēā¸˛ā¸Ąā¸˛ā¸Ŗā¸–āš€ā¸›ā¸Ĩā¸ĩāšˆā¸ĸā¸™āšā¸›ā¸Ĩā¸‡ā¸ā¸˛ā¸Ŗā¸•ā¸ąāš‰ā¸‡ā¸„āšˆā¸˛ā¸ā¸˛ā¸Ŗā¸§ā¸´āš€ā¸„ā¸Ŗā¸˛ā¸°ā¸ĢāšŒāšƒā¸™āš„ā¸Ÿā¸ĨāšŒ config/settings.yml" @@ -203,6 +294,54 @@ "cacheInputs": { "name": "ā¸šā¸ąā¸™ā¸—ā¸ļā¸ā¸ā¸˛ā¸Ŗā¸›āš‰ā¸­ā¸™ā¸Ÿā¸­ā¸ŖāšŒā¸Ą", "help": "āš€ā¸›ā¸´ā¸”āšƒā¸Šāš‰ā¸‡ā¸˛ā¸™āš€ā¸žā¸ˇāšˆā¸­ā¸šā¸ąā¸™ā¸—ā¸ļā¸ā¸ā¸˛ā¸Ŗā¸›āš‰ā¸­ā¸™ā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩ⏗ā¸ĩāšˆāšƒā¸Šāš‰ā¸āšˆā¸­ā¸™ā¸Ģā¸™āš‰ā¸˛ā¸™ā¸ĩāš‰ā¸Ē⏺ā¸Ģā¸Ŗā¸ąā¸šā¸ā¸˛ā¸Ŗā¸Ŗā¸ąā¸™āšƒā¸™ā¸­ā¸™ā¸˛ā¸„ā¸•" + }, + "general": { + "title": "General", + "description": "Configure general application preferences.", + "account": "Account", + "accountDescription": "Manage your account settings", + "user": "User", + "signedInAs": "Signed in as", + "logout": "Log out", + "enableFeatures": { + "title": "For System Administrators", + "intro": "Enable user authentication, team management, and workspace features for your organization.", + "action": "Configure", + "and": "and", + "benefit": "Enables user roles, team collaboration, admin controls, and enterprise features.", + "learnMore": "Learn more in documentation", + "dismiss": "Dismiss" + }, + "autoUnzip": "Auto-unzip API responses", + "autoUnzipDescription": "Automatically extract files from ZIP responses", + "autoUnzipTooltip": "Automatically extract ZIP files returned from API operations. Disable to keep ZIP files intact. This does not affect automation workflows.", + "autoUnzipFileLimit": "Auto-unzip file limit", + "autoUnzipFileLimitDescription": "Maximum number of files to extract from ZIP", + "autoUnzipFileLimitTooltip": "Only unzip if the ZIP contains this many files or fewer. Set higher to extract larger ZIPs.", + "defaultToolPickerMode": "Default tool picker mode", + "defaultToolPickerModeDescription": "Choose whether the tool picker opens in fullscreen or sidebar by default", + "mode": { + "fullscreen": "Fullscreen", + "sidebar": "Sidebar" + } + }, + "hotkeys": { + "title": "Keyboard Shortcuts", + "description": "Hover a tool to see its shortcut or customise it below. Click \"Change shortcut\" and press a new key combination. Press Esc to cancel.", + "errorModifier": { + "mac": "Include ⌘ (Command), âŒĨ (Option), or another modifier in your shortcut.", + "windows": "Include Ctrl, Alt, or another modifier in your shortcut." + }, + "errorConflict": "Shortcut already used by {{tool}}.", + "none": "Not assigned", + "customBadge": "Custom", + "defaultLabel": "Default: {{shortcut}}", + "capturing": "Press keysâ€Ļ (Esc to cancel)", + "change": "Change shortcut", + "reset": "Reset", + "shortcut": "Shortcut", + "noShortcut": "No shortcut set", + "searchPlaceholder": "Search tools..." } }, "changeCreds": { @@ -274,8 +413,10 @@ "top20": "Top 20", "all": "All", "refresh": "Refresh", - "includeHomepage": "Include Homepage ('/')", - "includeLoginPage": "Include Login Page ('/login')", + "dataTypeLabel": "Data Type:", + "dataTypeAll": "All", + "dataTypeApi": "API", + "dataTypeUi": "UI", "totalEndpoints": "Total Endpoints", "totalVisits": "Total Visits", "showing": "Showing", @@ -290,7 +431,9 @@ "top": "Top", "numberOfVisits": "Number of Visits", "visitsTooltip": "Visits: {0} ({1}% of total)", - "retry": "Retry" + "retry": "Retry", + "includeHomepage": "Include Homepage ('/')", + "includeLoginPage": "Include Login Page ('/login')" }, "database": { "title": "ā¸ā¸˛ā¸Ŗā¸™ā¸ŗāš€ā¸‚āš‰ā¸˛/ā¸Ēāšˆā¸‡ā¸­ā¸­ā¸ā¸ā¸˛ā¸™ā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩ", @@ -331,22 +474,310 @@ "alphabetical": "Alphabetical", "globalPopularity": "Global Popularity", "sortBy": "Sort by:", + "mobile": { + "brandAlt": "Stirling PDF logo", + "openFiles": "Open files", + "swipeHint": "Swipe left or right to switch views", + "tools": "Tools", + "toolsSlide": "Tool selection panel", + "viewSwitcher": "Switch workspace view", + "workbenchSlide": "Workspace panel", + "workspace": "Workspace" + }, "multiTool": { + "tags": "multiple,tools", "title": "āš€ā¸„ā¸Ŗā¸ˇāšˆā¸­ā¸‡ā¸Ąā¸ˇā¸­ PDF ā¸Ģā¸Ĩ⏞ā¸ĸā¸•ā¸ąā¸§", "desc": "ā¸Ŗā¸§ā¸Ą ā¸Ģā¸Ąā¸¸ā¸™ ā¸ˆā¸ąā¸”āš€ā¸Ŗā¸ĩā¸ĸ⏇ āšā¸Ĩ⏰ā¸Ĩ⏚ā¸Ģā¸™āš‰ā¸˛ā¸•āšˆā¸˛ā¸‡āš†" }, "merge": { + "tags": "combine,join,unite", "title": "ā¸Ŗā¸§ā¸Ąāš„ā¸Ÿā¸ĨāšŒ PDF", "desc": "ā¸Ŗā¸§ā¸Ą PDF ā¸Ģā¸Ĩ⏞ā¸ĸāš„ā¸Ÿā¸ĨāšŒāš€ā¸›āš‡ā¸™ā¸Ģ⏙ā¸ļāšˆā¸‡āš€ā¸”ā¸ĩā¸ĸā¸§āš„ā¸”āš‰ā¸­ā¸ĸāšˆā¸˛ā¸‡ā¸‡āšˆā¸˛ā¸ĸ⏔⏞ā¸ĸ" }, "split": { + "tags": "divide,separate,break", "title": "āšā¸ĸā¸āš„ā¸Ÿā¸ĨāšŒ PDF", "desc": "āšā¸ĸ⏁ PDF āš€ā¸›āš‡ā¸™ā¸Ģā¸Ĩ⏞ā¸ĸāš€ā¸­ā¸ā¸Ē⏞⏪" }, "rotate": { + "tags": "turn,flip,orient", "title": "ā¸Ģā¸Ąā¸¸ā¸™", "desc": "ā¸Ģā¸Ąā¸¸ā¸™ PDF ā¸‚ā¸­ā¸‡ā¸„ā¸¸ā¸“āš„ā¸”āš‰ā¸­ā¸ĸāšˆā¸˛ā¸‡ā¸‡āšˆā¸˛ā¸ĸ⏔⏞ā¸ĸ" }, + "convert": { + "tags": "transform,change", + "title": "āšā¸›ā¸Ĩ⏇", + "desc": "Convert files between different formats" + }, + "pdfOrganiser": { + "tags": "organize,rearrange,reorder", + "title": "ā¸ˆā¸ąā¸”ā¸Ŗā¸°āš€ā¸šā¸ĩā¸ĸ⏚", + "desc": "ā¸Ĩ⏚/ā¸ˆā¸ąā¸”āš€ā¸Ŗā¸ĩā¸ĸ⏇ā¸Ģā¸™āš‰ā¸˛ā¸•āšˆā¸˛ā¸‡āš† āšƒā¸™ā¸Ĩā¸ŗā¸”ā¸ąā¸šā¸—ā¸ĩāšˆā¸•āš‰ā¸­ā¸‡ā¸ā¸˛ā¸Ŗ" + }, + "addImage": { + "tags": "insert,embed,place", + "title": "āš€ā¸žā¸´āšˆā¸Ąā¸Ŗā¸šā¸›ā¸ ā¸˛ā¸ž", + "desc": "āš€ā¸žā¸´āšˆā¸Ąā¸Ŗā¸šā¸›ā¸ ā¸˛ā¸žāš„ā¸›ā¸ĸā¸ąā¸‡ā¸•ā¸ŗāšā¸Ģā¸™āšˆā¸‡ā¸—ā¸ĩāšˆā¸ā¸ŗā¸Ģā¸™ā¸”āšƒā¸™ PDF" + }, + "addAttachments": { + "tags": "embed,attach,include", + "title": "Add Attachments", + "desc": "Add or remove embedded files (attachments) to/from a PDF" + }, + "watermark": { + "tags": "stamp,mark,overlay", + "title": "āš€ā¸žā¸´āšˆā¸Ąā¸Ĩ⏞ā¸ĸā¸™āš‰ā¸ŗ", + "desc": "āš€ā¸žā¸´āšˆā¸Ąā¸Ĩ⏞ā¸ĸā¸™āš‰ā¸ŗā¸—ā¸ĩāšˆā¸ā¸ŗā¸Ģā¸™ā¸”āš€ā¸­ā¸‡ā¸Ĩā¸‡āšƒā¸™āš€ā¸­ā¸ā¸Ē⏞⏪ PDF ⏂⏭⏇⏄⏏⏓" + }, + "removePassword": { + "tags": "unlock", + "title": "ā¸Ĩ⏚⏪ā¸Ģā¸ąā¸Ēā¸œāšˆā¸˛ā¸™", + "desc": "ā¸Ĩ⏚⏪ā¸Ģā¸ąā¸Ēā¸œāšˆā¸˛ā¸™ā¸ˆā¸˛ā¸ā¸ā¸˛ā¸Ŗā¸›āš‰ā¸­ā¸‡ā¸ā¸ąā¸™āš€ā¸­ā¸ā¸Ē⏞⏪ PDF ⏂⏭⏇⏄⏏⏓" + }, + "compress": { + "tags": "shrink,reduce,optimize", + "title": "⏚ā¸ĩā¸šā¸­ā¸ąā¸”", + "desc": "⏚ā¸ĩā¸šā¸­ā¸ąā¸” PDF āš€ā¸žā¸ˇāšˆā¸­ā¸Ĩā¸”ā¸‚ā¸™ā¸˛ā¸”āš„ā¸Ÿā¸ĨāšŒ" + }, + "unlockPDFForms": { + "tags": "unlock,enable,edit", + "title": "Unlock PDF Forms", + "desc": "Remove read-only property of form fields in a PDF document." + }, + "changeMetadata": { + "tags": "edit,modify,update", + "title": "āš€ā¸›ā¸Ĩā¸ĩāšˆā¸ĸā¸™ā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩāš€ā¸Ąā¸•ā¸˛", + "desc": "āš€ā¸›ā¸Ĩā¸ĩāšˆā¸ĸ⏙/ā¸Ĩ⏚/āš€ā¸žā¸´āšˆā¸Ąā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩāš€ā¸Ąā¸•ā¸˛ā¸ˆā¸˛ā¸āš€ā¸­ā¸ā¸Ē⏞⏪ PDF" + }, + "ocr": { + "tags": "extract,scan", + "title": "OCR / ā¸—ā¸ŗā¸„ā¸§ā¸˛ā¸Ąā¸Ē⏰⏭⏞⏔⏁⏞⏪ā¸Ēāšā¸ā¸™", + "desc": "ā¸—ā¸ŗā¸„ā¸§ā¸˛ā¸Ąā¸Ē⏰⏭⏞⏔⏁⏞⏪ā¸Ēāšā¸ā¸™āšā¸Ĩā¸°ā¸•ā¸Ŗā¸§ā¸ˆā¸ˆā¸ąā¸šā¸‚āš‰ā¸­ā¸„ā¸§ā¸˛ā¸Ąā¸ˆā¸˛ā¸ā¸ ā¸˛ā¸žā¸ ā¸˛ā¸ĸāšƒā¸™ PDF āšā¸Ĩā¸°āš€ā¸žā¸´āšˆā¸Ąāš€ā¸›āš‡ā¸™ā¸‚āš‰ā¸­ā¸„ā¸§ā¸˛ā¸Ąā¸­ā¸ĩā¸ā¸„ā¸Ŗā¸ąāš‰ā¸‡" + }, + "extractImages": { + "tags": "pull,save,export", + "title": "āšā¸ĸā¸ā¸Ŗā¸šā¸›ā¸ ā¸˛ā¸ž", + "desc": "āšā¸ĸā¸ā¸Ŗā¸šā¸›ā¸ ā¸˛ā¸žā¸—ā¸ąāš‰ā¸‡ā¸Ģā¸Ąā¸”ā¸ˆā¸˛ā¸ PDF āšā¸Ĩā¸°ā¸šā¸ąā¸™ā¸—ā¸ļā¸āšƒā¸™ā¸Ŗā¸šā¸›āšā¸šā¸š zip" + }, + "scannerImageSplit": { + "tags": "detect,split,photos", + "title": "Detect & Split Scanned Photos", + "desc": "Detect and split scanned photos into separate pages" + }, + "sign": { + "tags": "signature,autograph", + "title": "āš€ā¸‹āš‡ā¸™ā¸Šā¸ˇāšˆā¸­", + "desc": "āš€ā¸žā¸´āšˆā¸Ąā¸Ĩ⏞ā¸ĸāš€ā¸‹āš‡ā¸™ā¸Ĩā¸‡āšƒā¸™ PDF ā¸”āš‰ā¸§ā¸ĸ⏁⏞⏪⏧⏞⏔ ā¸‚āš‰ā¸­ā¸„ā¸§ā¸˛ā¸Ą ā¸Ģā¸Ŗā¸ˇā¸­ā¸Ŗā¸šā¸›ā¸ ā¸˛ā¸ž" + }, + "flatten": { + "tags": "simplify,remove,interactive", + "title": "āšā¸šā¸™", + "desc": "ā¸Ĩā¸šā¸­ā¸‡ā¸„āšŒā¸›ā¸Ŗā¸°ā¸ā¸­ā¸šāšā¸šā¸šā¸­ā¸´ā¸™āš€ā¸•ā¸­ā¸ŖāšŒāšā¸­ā¸„ā¸—ā¸ĩā¸Ÿāšā¸Ĩā¸°ā¸Ÿā¸­ā¸ŖāšŒā¸Ąā¸—ā¸ąāš‰ā¸‡ā¸Ģā¸Ąā¸”ā¸ˆā¸˛ā¸ PDF" + }, + "certSign": { + "tags": "authenticate,PEM,P12,official,encrypt,sign,certificate,PKCS12,JKS,server,manual,auto", + "title": "āš€ā¸‹āš‡ā¸™ā¸Šā¸ˇāšˆā¸­ā¸”āš‰ā¸§ā¸ĸāšƒā¸šā¸Ŗā¸ąā¸šā¸Ŗā¸­ā¸‡", + "desc": "āš€ā¸‹āš‡ā¸™ā¸Šā¸ˇāšˆā¸­ PDF ā¸”āš‰ā¸§ā¸ĸāšƒā¸šā¸Ŗā¸ąā¸šā¸Ŗā¸­ā¸‡/⏄ā¸ĩā¸ĸāšŒ (PEM/P12)" + }, + "repair": { + "tags": "fix,restore", + "title": "ā¸‹āšˆā¸­ā¸Ąāšā¸‹ā¸Ą", + "desc": "ā¸žā¸ĸ⏞ā¸ĸā¸˛ā¸Ąā¸‹āšˆā¸­ā¸Ąāšā¸‹ā¸Ą PDF ⏗ā¸ĩāšˆāš€ā¸Ēā¸ĩā¸ĸā¸Ģ⏞ā¸ĸ/āšā¸•ā¸" + }, + "removeBlanks": { + "tags": "delete,clean,empty", + "title": "ā¸Ĩ⏚ā¸Ģā¸™āš‰ā¸˛ā¸§āšˆā¸˛ā¸‡", + "desc": "ā¸•ā¸Ŗā¸§ā¸ˆā¸ˆā¸ąā¸šāšā¸Ĩ⏰ā¸Ĩ⏚ā¸Ģā¸™āš‰ā¸˛ā¸§āšˆā¸˛ā¸‡ā¸ˆā¸˛ā¸āš€ā¸­ā¸ā¸Ē⏞⏪" + }, + "removeAnnotations": { + "tags": "delete,clean,strip", + "title": "ā¸Ĩā¸šā¸„ā¸ŗā¸­ā¸˜ā¸´ā¸šā¸˛ā¸ĸā¸›ā¸Ŗā¸°ā¸ā¸­ā¸š", + "desc": "ā¸Ĩā¸šā¸„ā¸§ā¸˛ā¸Ąā¸„ā¸´ā¸”āš€ā¸Ģāš‡ā¸™/ā¸„ā¸ŗā¸­ā¸˜ā¸´ā¸šā¸˛ā¸ĸā¸›ā¸Ŗā¸°ā¸ā¸­ā¸šā¸—ā¸ąāš‰ā¸‡ā¸Ģā¸Ąā¸”ā¸ˆā¸˛ā¸ PDF" + }, + "compare": { + "tags": "difference", + "title": "āš€ā¸›ā¸Ŗā¸ĩā¸ĸā¸šāš€ā¸—ā¸ĩā¸ĸ⏚", + "desc": "āš€ā¸›ā¸Ŗā¸ĩā¸ĸā¸šāš€ā¸—ā¸ĩā¸ĸā¸šāšā¸Ĩā¸°āšā¸Ēā¸”ā¸‡ā¸„ā¸§ā¸˛ā¸Ąāšā¸•ā¸ā¸•āšˆā¸˛ā¸‡ā¸Ŗā¸°ā¸Ģā¸§āšˆā¸˛ā¸‡āš€ā¸­ā¸ā¸Ē⏞⏪ PDF ā¸Ēā¸­ā¸‡ā¸‰ā¸šā¸ąā¸š" + }, + "removeCertSign": { + "tags": "remove,delete,unlock", + "title": "ā¸Ĩ⏚ā¸Ĩ⏞ā¸ĸāš€ā¸‹āš‡ā¸™āšƒā¸šā¸Ŗā¸ąā¸šā¸Ŗā¸­ā¸‡", + "desc": "ā¸Ĩ⏚ā¸Ĩ⏞ā¸ĸāš€ā¸‹āš‡ā¸™āšƒā¸šā¸Ŗā¸ąā¸šā¸Ŗā¸­ā¸‡ā¸ˆā¸˛ā¸ PDF" + }, + "pageLayout": { + "tags": "layout,arrange,combine", + "title": "āš€ā¸Ĩā¸ĸāšŒāš€ā¸­ā¸˛ā¸•āšŒā¸Ģā¸Ĩ⏞ā¸ĸā¸Ģā¸™āš‰ā¸˛", + "desc": "ā¸Ŗā¸§ā¸Ąā¸Ģā¸™āš‰ā¸˛ā¸Ģā¸Ĩ⏞ā¸ĸā¸Ģā¸™āš‰ā¸˛ā¸‚ā¸­ā¸‡āš€ā¸­ā¸ā¸Ē⏞⏪ PDF āš€ā¸‚āš‰ā¸˛ā¸”āš‰ā¸§ā¸ĸā¸ā¸ąā¸™āšƒā¸™ā¸Ģā¸™āš‰ā¸˛āš€ā¸”ā¸ĩā¸ĸ⏧" + }, + "bookletImposition": { + "tags": "booklet,print,binding", + "title": "Booklet Imposition", + "desc": "Create booklets with proper page ordering and multi-page layout for printing and binding" + }, + "scalePages": { + "tags": "resize,adjust,scale", + "title": "ā¸›ā¸Ŗā¸ąā¸šā¸‚ā¸™ā¸˛ā¸”/ā¸Ēāš€ā¸ā¸Ĩā¸Ģā¸™āš‰ā¸˛", + "desc": "āš€ā¸›ā¸Ĩā¸ĩāšˆā¸ĸ⏙⏂⏙⏞⏔/ā¸Ēāš€ā¸ā¸Ĩ⏂⏭⏇ā¸Ģā¸™āš‰ā¸˛āšā¸Ĩ⏰/ā¸Ģā¸Ŗā¸ˇā¸­āš€ā¸™ā¸ˇāš‰ā¸­ā¸Ģā¸˛ā¸‚ā¸­ā¸‡ā¸Ąā¸ąā¸™" + }, + "addPageNumbers": { + "tags": "number,pagination,count", + "title": "āš€ā¸žā¸´āšˆā¸Ąā¸Ģā¸Ąā¸˛ā¸ĸāš€ā¸Ĩ⏂ā¸Ģā¸™āš‰ā¸˛", + "desc": "āš€ā¸žā¸´āšˆā¸Ąā¸Ģā¸Ąā¸˛ā¸ĸāš€ā¸Ĩ⏂ā¸Ģā¸™āš‰ā¸˛ā¸•ā¸Ĩā¸­ā¸”ā¸—ā¸ąāš‰ā¸‡āš€ā¸­ā¸ā¸Ēā¸˛ā¸Ŗāšƒā¸™ā¸•ā¸ŗāšā¸Ģā¸™āšˆā¸‡ā¸—ā¸ĩāšˆā¸ā¸ŗā¸Ģ⏙⏔" + }, + "autoRename": { + "tags": "auto-detect,header-based,organize,relabel", + "title": "Auto Rename PDF File", + "desc": "Auto renames a PDF file based on its detected header" + }, + "adjustContrast": { + "tags": "contrast,brightness,saturation", + "title": "ā¸›ā¸Ŗā¸ąā¸šā¸Ēā¸ĩ/⏄⏭⏙⏗⏪⏞ā¸Ēā¸•āšŒ", + "desc": "ā¸›ā¸Ŗā¸ąā¸šā¸„ā¸­ā¸™ā¸—ā¸Ŗā¸˛ā¸Ēā¸•āšŒ ā¸„ā¸§ā¸˛ā¸Ąā¸­ā¸´āšˆā¸Ąā¸•ā¸ąā¸§ āšā¸Ĩā¸°ā¸„ā¸§ā¸˛ā¸Ąā¸Ēā¸§āšˆā¸˛ā¸‡ā¸‚ā¸­ā¸‡ PDF" + }, + "crop": { + "tags": "trim,cut,resize", + "title": "ā¸„ā¸Ŗā¸­ā¸šā¸•ā¸ąā¸” PDF", + "desc": "ā¸„ā¸Ŗā¸­ā¸šā¸•ā¸ąā¸” PDF āš€ā¸žā¸ˇāšˆā¸­ā¸Ĩ⏔⏂⏙⏞⏔ (ā¸Ŗā¸ąā¸ā¸Šā¸˛ā¸‚āš‰ā¸­ā¸„ā¸§ā¸˛ā¸Ą!)" + }, + "autoSplitPDF": { + "tags": "auto,split,QR", + "title": "āšā¸ĸ⏁ā¸Ģā¸™āš‰ā¸˛ā¸­ā¸ąā¸•āš‚ā¸™ā¸Ąā¸ąā¸•ā¸´", + "desc": "āšā¸ĸ⏁ PDF ⏗ā¸ĩāšˆā¸Ēāšā¸ā¸™āš‚ā¸”ā¸ĸāšƒā¸Šāš‰ QR Code āšā¸ĸ⏁ā¸Ģā¸™āš‰ā¸˛" + }, + "sanitize": { + "tags": "clean,purge,remove", + "title": "Sanitise", + "desc": "Remove potentially harmful elements from PDF files" + }, + "getPdfInfo": { + "tags": "info,metadata,details", + "title": "ā¸Ŗā¸ąā¸šā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩā¸—ā¸ąāš‰ā¸‡ā¸Ģā¸Ąā¸”āš€ā¸ā¸ĩāšˆā¸ĸā¸§ā¸ā¸ąā¸š PDF", + "desc": "ā¸Ŗā¸ąā¸šā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩ⏗ā¸ĩāšˆāš€ā¸›āš‡ā¸™āš„ā¸›āš„ā¸”āš‰ā¸—ā¸ąāš‰ā¸‡ā¸Ģā¸Ąā¸”āš€ā¸ā¸ĩāšˆā¸ĸā¸§ā¸ā¸ąā¸š PDF" + }, + "pdfToSinglePage": { + "tags": "combine,merge,single", + "title": "ā¸Ģā¸™āš‰ā¸˛ā¸‚ā¸™ā¸˛ā¸”āšƒā¸Ģā¸āšˆāš€ā¸žā¸ĩā¸ĸ⏇ā¸Ģā¸™āš‰ā¸˛āš€ā¸”ā¸ĩā¸ĸ⏧", + "desc": "ā¸Ŗā¸§ā¸Ąā¸Ģā¸™āš‰ā¸˛ā¸—ā¸ąāš‰ā¸‡ā¸Ģā¸Ąā¸”ā¸‚ā¸­ā¸‡ PDF āš€ā¸›āš‡ā¸™ā¸Ģā¸™āš‰ā¸˛āš€ā¸”ā¸ĩā¸ĸā¸§ā¸‚ā¸™ā¸˛ā¸”āšƒā¸Ģā¸āšˆ" + }, + "showJS": { + "tags": "javascript,code,script", + "title": "āšā¸Ē⏔⏇ Javascript", + "desc": "ā¸„āš‰ā¸™ā¸Ģā¸˛āšā¸Ĩā¸°āšā¸Ē⏔⏇ Javascript ⏗ā¸ĩāšˆā¸ā¸ąā¸‡āšƒā¸™ PDF" + }, + "redact": { + "tags": "censor,blackout,hide", + "title": "Manual Redaction", + "desc": "Redacts a PDF based on selected text, drawn shapes and/or selected page(s)" + }, + "splitBySections": { + "tags": "split,sections,divide", + "title": "Split PDF by Sections", + "desc": "Divide each page of a PDF into smaller horizontal and vertical sections" + }, + "addStamp": { + "tags": "stamp,mark,seal", + "title": "Add Stamp to PDF", + "desc": "Add text or add image stamps at set locations" + }, + "removeImage": { + "tags": "remove,delete,clean", + "title": "ā¸Ĩā¸šā¸ ā¸˛ā¸žā¸­ā¸­ā¸ā¸ˆā¸˛ā¸ PDF", + "desc": "ā¸Ĩā¸šā¸ ā¸˛ā¸žā¸­ā¸­ā¸ā¸ˆā¸˛ā¸ PDF āš€ā¸žā¸ˇāšˆā¸­ā¸Ĩā¸”ā¸‚ā¸™ā¸˛ā¸”āš„ā¸Ÿā¸ĨāšŒ" + }, + "splitByChapters": { + "tags": "split,chapters,structure", + "title": "āšā¸šāšˆā¸‡āš„ā¸Ÿā¸ĨāšŒ PDF ā¸•ā¸˛ā¸Ąā¸Ģā¸Ąā¸§ā¸”ā¸Ģā¸Ąā¸šāšˆ", + "desc": "Split a PDF into multiple files based on its chapter structure." + }, + "validateSignature": { + "tags": "validate,verify,certificate", + "title": "Validate PDF Signature", + "desc": "Verify digital signatures and certificates in PDF documents" + }, + "swagger": { + "tags": "API,documentation,test", + "title": "API Documentation", + "desc": "View API documentation and test endpoints" + }, + "scannerEffect": { + "tags": "scan,simulate,create", + "title": "Scanner Effect", + "desc": "Create a PDF that looks like it was scanned" + }, + "editTableOfContents": { + "tags": "bookmarks,contents,edit", + "title": "Edit Table of Contents", + "desc": "Add or edit bookmarks and table of contents in PDF documents" + }, + "manageCertificates": { + "tags": "certificates,import,export", + "title": "Manage Certificates", + "desc": "Import, export, or delete digital certificate files used for signing PDFs." + }, + "read": { + "tags": "view,open,display", + "title": "Read", + "desc": "View and annotate PDFs. Highlight text, draw, or insert comments for review and collaboration." + }, + "reorganizePages": { + "tags": "rearrange,reorder,organize", + "title": "Reorganize Pages", + "desc": "Rearrange, duplicate, or delete PDF pages with visual drag-and-drop control." + }, + "extractPages": { + "tags": "pull,select,copy", + "title": "āšā¸ĸ⏁ā¸Ģā¸™āš‰ā¸˛", + "desc": "Extract specific pages from a PDF document" + }, + "removePages": { + "tags": "delete,extract,exclude", + "title": "ā¸Ĩ⏚", + "desc": "ā¸Ĩ⏚ā¸Ģā¸™āš‰ā¸˛ā¸—ā¸ĩāšˆāš„ā¸Ąāšˆā¸•āš‰ā¸­ā¸‡ā¸ā¸˛ā¸Ŗā¸ˆā¸˛ā¸āš€ā¸­ā¸ā¸Ē⏞⏪ PDF ⏂⏭⏇⏄⏏⏓" + }, + "autoSizeSplitPDF": { + "tags": "auto,split,size", + "title": "āšā¸ĸā¸ā¸•ā¸˛ā¸Ąā¸‚ā¸™ā¸˛ā¸”/ā¸ˆā¸ŗā¸™ā¸§ā¸™", + "desc": "āšā¸ĸ⏁ PDF āš€ā¸›āš‡ā¸™āš€ā¸­ā¸ā¸Ē⏞⏪ā¸Ģā¸Ĩ⏞ā¸ĸā¸‰ā¸šā¸ąā¸šā¸•ā¸˛ā¸Ąā¸‚ā¸™ā¸˛ā¸” ā¸ˆā¸ŗā¸™ā¸§ā¸™ā¸Ģā¸™āš‰ā¸˛ ā¸Ģā¸Ŗā¸ˇā¸­ā¸ˆā¸ŗā¸™ā¸§ā¸™āš€ā¸­ā¸ā¸Ē⏞⏪" + }, + "replaceColor": { + "title": "Replace & Invert Colour", + "desc": "Replace or invert colours in PDF documents" + }, + "devApi": { + "tags": "API,development,documentation", + "title": "API", + "desc": "Link to API documentation" + }, + "devFolderScanning": { + "tags": "automation,folder,scanning", + "title": "Automated Folder Scanning", + "desc": "Link to automated folder scanning guide" + }, + "devSsoGuide": { + "title": "SSO Guide", + "desc": "Link to SSO guide" + }, + "devAirgapped": { + "title": "Air-gapped Setup", + "desc": "Link to air-gapped setup guide" + }, + "addPassword": { + "title": "āš€ā¸žā¸´āšˆā¸Ąā¸Ŗā¸Ģā¸ąā¸Ēā¸œāšˆā¸˛ā¸™", + "desc": "āš€ā¸‚āš‰ā¸˛ā¸Ŗā¸Ģā¸ąā¸Ēāš€ā¸­ā¸ā¸Ē⏞⏪ PDF ā¸‚ā¸­ā¸‡ā¸„ā¸¸ā¸“ā¸”āš‰ā¸§ā¸ĸ⏪ā¸Ģā¸ąā¸Ēā¸œāšˆā¸˛ā¸™" + }, + "changePermissions": { + "title": "āš€ā¸›ā¸Ĩā¸ĩāšˆā¸ĸ⏙ā¸Ēā¸´ā¸—ā¸˜ā¸´āšŒ", + "desc": "Change document restrictions and permissions" + }, + "automate": { + "tags": "workflow,sequence,automation", + "title": "Automate", + "desc": "Build multi-step workflows by chaining together PDF actions. Ideal for recurring tasks." + }, + "overlay-pdfs": { + "desc": "ā¸‹āš‰ā¸­ā¸™ā¸—ā¸ąā¸š PDF ā¸šā¸™ PDF ⏭ā¸ĩā¸āš„ā¸Ÿā¸ĨāšŒā¸Ģ⏙ā¸ļāšˆā¸‡", + "title": "ā¸‹āš‰ā¸­ā¸™ā¸—ā¸ąā¸š PDF" + }, "imageToPDF": { "title": "ā¸Ŗā¸šā¸›ā¸ ā¸˛ā¸žāš€ā¸›āš‡ā¸™ PDF", "desc": "āšā¸›ā¸Ĩā¸‡ā¸Ŗā¸šā¸›ā¸ ā¸˛ā¸ž (PNG, JPEG, GIF) āš€ā¸›āš‡ā¸™ PDF" @@ -355,18 +786,6 @@ "title": "PDF āš€ā¸›āš‡ā¸™ā¸Ŗā¸šā¸›ā¸ ā¸˛ā¸ž", "desc": "āšā¸›ā¸Ĩ⏇ PDF āš€ā¸›āš‡ā¸™ā¸Ŗā¸šā¸›ā¸ ā¸˛ā¸ž (PNG, JPEG, GIF)" }, - "pdfOrganiser": { - "title": "ā¸ˆā¸ąā¸”ā¸Ŗā¸°āš€ā¸šā¸ĩā¸ĸ⏚", - "desc": "ā¸Ĩ⏚/ā¸ˆā¸ąā¸”āš€ā¸Ŗā¸ĩā¸ĸ⏇ā¸Ģā¸™āš‰ā¸˛ā¸•āšˆā¸˛ā¸‡āš† āšƒā¸™ā¸Ĩā¸ŗā¸”ā¸ąā¸šā¸—ā¸ĩāšˆā¸•āš‰ā¸­ā¸‡ā¸ā¸˛ā¸Ŗ" - }, - "addImage": { - "title": "āš€ā¸žā¸´āšˆā¸Ąā¸Ŗā¸šā¸›ā¸ ā¸˛ā¸ž", - "desc": "āš€ā¸žā¸´āšˆā¸Ąā¸Ŗā¸šā¸›ā¸ ā¸˛ā¸žāš„ā¸›ā¸ĸā¸ąā¸‡ā¸•ā¸ŗāšā¸Ģā¸™āšˆā¸‡ā¸—ā¸ĩāšˆā¸ā¸ŗā¸Ģā¸™ā¸”āšƒā¸™ PDF" - }, - "watermark": { - "title": "āš€ā¸žā¸´āšˆā¸Ąā¸Ĩ⏞ā¸ĸā¸™āš‰ā¸ŗ", - "desc": "āš€ā¸žā¸´āšˆā¸Ąā¸Ĩ⏞ā¸ĸā¸™āš‰ā¸ŗā¸—ā¸ĩāšˆā¸ā¸ŗā¸Ģā¸™ā¸”āš€ā¸­ā¸‡ā¸Ĩā¸‡āšƒā¸™āš€ā¸­ā¸ā¸Ē⏞⏪ PDF ⏂⏭⏇⏄⏏⏓" - }, "permissions": { "title": "āš€ā¸›ā¸Ĩā¸ĩāšˆā¸ĸ⏙ā¸Ēā¸´ā¸—ā¸˜ā¸´āšŒ", "desc": "āš€ā¸›ā¸Ĩā¸ĩāšˆā¸ĸ⏙ā¸Ēā¸´ā¸—ā¸˜ā¸´āšŒā¸‚ā¸­ā¸‡āš€ā¸­ā¸ā¸Ē⏞⏪ PDF ⏂⏭⏇⏄⏏⏓" @@ -375,38 +794,10 @@ "title": "ā¸Ĩ⏚", "desc": "ā¸Ĩ⏚ā¸Ģā¸™āš‰ā¸˛ā¸—ā¸ĩāšˆāš„ā¸Ąāšˆā¸•āš‰ā¸­ā¸‡ā¸ā¸˛ā¸Ŗā¸ˆā¸˛ā¸āš€ā¸­ā¸ā¸Ē⏞⏪ PDF ⏂⏭⏇⏄⏏⏓" }, - "addPassword": { - "title": "āš€ā¸žā¸´āšˆā¸Ąā¸Ŗā¸Ģā¸ąā¸Ēā¸œāšˆā¸˛ā¸™", - "desc": "āš€ā¸‚āš‰ā¸˛ā¸Ŗā¸Ģā¸ąā¸Ēāš€ā¸­ā¸ā¸Ē⏞⏪ PDF ā¸‚ā¸­ā¸‡ā¸„ā¸¸ā¸“ā¸”āš‰ā¸§ā¸ĸ⏪ā¸Ģā¸ąā¸Ēā¸œāšˆā¸˛ā¸™" - }, - "removePassword": { - "title": "ā¸Ĩ⏚⏪ā¸Ģā¸ąā¸Ēā¸œāšˆā¸˛ā¸™", - "desc": "ā¸Ĩ⏚⏪ā¸Ģā¸ąā¸Ēā¸œāšˆā¸˛ā¸™ā¸ˆā¸˛ā¸ā¸ā¸˛ā¸Ŗā¸›āš‰ā¸­ā¸‡ā¸ā¸ąā¸™āš€ā¸­ā¸ā¸Ē⏞⏪ PDF ⏂⏭⏇⏄⏏⏓" - }, - "compress": { - "title": "⏚ā¸ĩā¸šā¸­ā¸ąā¸”", - "desc": "⏚ā¸ĩā¸šā¸­ā¸ąā¸” PDF āš€ā¸žā¸ˇāšˆā¸­ā¸Ĩā¸”ā¸‚ā¸™ā¸˛ā¸”āš„ā¸Ÿā¸ĨāšŒ" - }, - "unlockPDFForms": { - "title": "Unlock PDF Forms", - "desc": "Remove read-only property of form fields in a PDF document." - }, - "changeMetadata": { - "title": "āš€ā¸›ā¸Ĩā¸ĩāšˆā¸ĸā¸™ā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩāš€ā¸Ąā¸•ā¸˛", - "desc": "āš€ā¸›ā¸Ĩā¸ĩāšˆā¸ĸ⏙/ā¸Ĩ⏚/āš€ā¸žā¸´āšˆā¸Ąā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩāš€ā¸Ąā¸•ā¸˛ā¸ˆā¸˛ā¸āš€ā¸­ā¸ā¸Ē⏞⏪ PDF" - }, "fileToPDF": { "title": "āšā¸›ā¸Ĩā¸‡āš„ā¸Ÿā¸ĨāšŒāš€ā¸›āš‡ā¸™ PDF", "desc": "āšā¸›ā¸Ĩā¸‡āš„ā¸Ÿā¸ĨāšŒāš€ā¸ā¸ˇā¸­ā¸šā¸—ā¸¸ā¸ā¸›ā¸Ŗā¸°āš€ā¸ ā¸—āš€ā¸›āš‡ā¸™ PDF (DOCX, PNG, XLS, PPT, TXT āšā¸Ĩā¸°ā¸­ā¸ˇāšˆā¸™ āš†)" }, - "ocr": { - "title": "OCR / ā¸—ā¸ŗā¸„ā¸§ā¸˛ā¸Ąā¸Ē⏰⏭⏞⏔⏁⏞⏪ā¸Ēāšā¸ā¸™", - "desc": "ā¸—ā¸ŗā¸„ā¸§ā¸˛ā¸Ąā¸Ē⏰⏭⏞⏔⏁⏞⏪ā¸Ēāšā¸ā¸™āšā¸Ĩā¸°ā¸•ā¸Ŗā¸§ā¸ˆā¸ˆā¸ąā¸šā¸‚āš‰ā¸­ā¸„ā¸§ā¸˛ā¸Ąā¸ˆā¸˛ā¸ā¸ ā¸˛ā¸žā¸ ā¸˛ā¸ĸāšƒā¸™ PDF āšā¸Ĩā¸°āš€ā¸žā¸´āšˆā¸Ąāš€ā¸›āš‡ā¸™ā¸‚āš‰ā¸­ā¸„ā¸§ā¸˛ā¸Ąā¸­ā¸ĩā¸ā¸„ā¸Ŗā¸ąāš‰ā¸‡" - }, - "extractImages": { - "title": "āšā¸ĸā¸ā¸Ŗā¸šā¸›ā¸ ā¸˛ā¸ž", - "desc": "āšā¸ĸā¸ā¸Ŗā¸šā¸›ā¸ ā¸˛ā¸žā¸—ā¸ąāš‰ā¸‡ā¸Ģā¸Ąā¸”ā¸ˆā¸˛ā¸ PDF āšā¸Ĩā¸°ā¸šā¸ąā¸™ā¸—ā¸ļā¸āšƒā¸™ā¸Ŗā¸šā¸›āšā¸šā¸š zip" - }, "pdfToPDFA": { "title": "PDF āš€ā¸›āš‡ā¸™ PDF/A", "desc": "āšā¸›ā¸Ĩ⏇ PDF āš€ā¸›āš‡ā¸™ PDF/A ā¸Ē⏺ā¸Ģā¸Ŗā¸ąā¸šā¸ā¸˛ā¸Ŗā¸ˆā¸ąā¸”āš€ā¸āš‡ā¸šā¸Ŗā¸°ā¸ĸ⏰ā¸ĸ⏞⏧" @@ -435,70 +826,14 @@ "title": "ā¸•ā¸Ŗā¸§ā¸ˆā¸ˆā¸ąā¸š/āšā¸ĸā¸ā¸Ŗā¸šā¸›ā¸ ā¸˛ā¸žā¸Ēāšā¸ā¸™", "desc": "āšā¸ĸā¸ā¸Ŗā¸šā¸›ā¸ ā¸˛ā¸žā¸Ģā¸Ĩ⏞ā¸ĸā¸Ŗā¸šā¸›ā¸ˆā¸˛ā¸ā¸ ā¸˛ā¸ž/ PDF" }, - "sign": { - "title": "āš€ā¸‹āš‡ā¸™ā¸Šā¸ˇāšˆā¸­", - "desc": "āš€ā¸žā¸´āšˆā¸Ąā¸Ĩ⏞ā¸ĸāš€ā¸‹āš‡ā¸™ā¸Ĩā¸‡āšƒā¸™ PDF ā¸”āš‰ā¸§ā¸ĸ⏁⏞⏪⏧⏞⏔ ā¸‚āš‰ā¸­ā¸„ā¸§ā¸˛ā¸Ą ā¸Ģā¸Ŗā¸ˇā¸­ā¸Ŗā¸šā¸›ā¸ ā¸˛ā¸ž" - }, - "flatten": { - "title": "āšā¸šā¸™", - "desc": "ā¸Ĩā¸šā¸­ā¸‡ā¸„āšŒā¸›ā¸Ŗā¸°ā¸ā¸­ā¸šāšā¸šā¸šā¸­ā¸´ā¸™āš€ā¸•ā¸­ā¸ŖāšŒāšā¸­ā¸„ā¸—ā¸ĩā¸Ÿāšā¸Ĩā¸°ā¸Ÿā¸­ā¸ŖāšŒā¸Ąā¸—ā¸ąāš‰ā¸‡ā¸Ģā¸Ąā¸”ā¸ˆā¸˛ā¸ PDF" - }, - "repair": { - "title": "ā¸‹āšˆā¸­ā¸Ąāšā¸‹ā¸Ą", - "desc": "ā¸žā¸ĸ⏞ā¸ĸā¸˛ā¸Ąā¸‹āšˆā¸­ā¸Ąāšā¸‹ā¸Ą PDF ⏗ā¸ĩāšˆāš€ā¸Ēā¸ĩā¸ĸā¸Ģ⏞ā¸ĸ/āšā¸•ā¸" - }, - "removeBlanks": { - "title": "ā¸Ĩ⏚ā¸Ģā¸™āš‰ā¸˛ā¸§āšˆā¸˛ā¸‡", - "desc": "ā¸•ā¸Ŗā¸§ā¸ˆā¸ˆā¸ąā¸šāšā¸Ĩ⏰ā¸Ĩ⏚ā¸Ģā¸™āš‰ā¸˛ā¸§āšˆā¸˛ā¸‡ā¸ˆā¸˛ā¸āš€ā¸­ā¸ā¸Ē⏞⏪" - }, - "removeAnnotations": { - "title": "ā¸Ĩā¸šā¸„ā¸ŗā¸­ā¸˜ā¸´ā¸šā¸˛ā¸ĸā¸›ā¸Ŗā¸°ā¸ā¸­ā¸š", - "desc": "ā¸Ĩā¸šā¸„ā¸§ā¸˛ā¸Ąā¸„ā¸´ā¸”āš€ā¸Ģāš‡ā¸™/ā¸„ā¸ŗā¸­ā¸˜ā¸´ā¸šā¸˛ā¸ĸā¸›ā¸Ŗā¸°ā¸ā¸­ā¸šā¸—ā¸ąāš‰ā¸‡ā¸Ģā¸Ąā¸”ā¸ˆā¸˛ā¸ PDF" - }, - "compare": { - "title": "āš€ā¸›ā¸Ŗā¸ĩā¸ĸā¸šāš€ā¸—ā¸ĩā¸ĸ⏚", - "desc": "āš€ā¸›ā¸Ŗā¸ĩā¸ĸā¸šāš€ā¸—ā¸ĩā¸ĸā¸šāšā¸Ĩā¸°āšā¸Ēā¸”ā¸‡ā¸„ā¸§ā¸˛ā¸Ąāšā¸•ā¸ā¸•āšˆā¸˛ā¸‡ā¸Ŗā¸°ā¸Ģā¸§āšˆā¸˛ā¸‡āš€ā¸­ā¸ā¸Ē⏞⏪ PDF ā¸Ēā¸­ā¸‡ā¸‰ā¸šā¸ąā¸š" - }, - "certSign": { - "title": "āš€ā¸‹āš‡ā¸™ā¸Šā¸ˇāšˆā¸­ā¸”āš‰ā¸§ā¸ĸāšƒā¸šā¸Ŗā¸ąā¸šā¸Ŗā¸­ā¸‡", - "desc": "āš€ā¸‹āš‡ā¸™ā¸Šā¸ˇāšˆā¸­ PDF ā¸”āš‰ā¸§ā¸ĸāšƒā¸šā¸Ŗā¸ąā¸šā¸Ŗā¸­ā¸‡/⏄ā¸ĩā¸ĸāšŒ (PEM/P12)" - }, - "removeCertSign": { - "title": "ā¸Ĩ⏚ā¸Ĩ⏞ā¸ĸāš€ā¸‹āš‡ā¸™āšƒā¸šā¸Ŗā¸ąā¸šā¸Ŗā¸­ā¸‡", - "desc": "ā¸Ĩ⏚ā¸Ĩ⏞ā¸ĸāš€ā¸‹āš‡ā¸™āšƒā¸šā¸Ŗā¸ąā¸šā¸Ŗā¸­ā¸‡ā¸ˆā¸˛ā¸ PDF" - }, - "pageLayout": { - "title": "āš€ā¸Ĩā¸ĸāšŒāš€ā¸­ā¸˛ā¸•āšŒā¸Ģā¸Ĩ⏞ā¸ĸā¸Ģā¸™āš‰ā¸˛", - "desc": "ā¸Ŗā¸§ā¸Ąā¸Ģā¸™āš‰ā¸˛ā¸Ģā¸Ĩ⏞ā¸ĸā¸Ģā¸™āš‰ā¸˛ā¸‚ā¸­ā¸‡āš€ā¸­ā¸ā¸Ē⏞⏪ PDF āš€ā¸‚āš‰ā¸˛ā¸”āš‰ā¸§ā¸ĸā¸ā¸ąā¸™āšƒā¸™ā¸Ģā¸™āš‰ā¸˛āš€ā¸”ā¸ĩā¸ĸ⏧" - }, - "scalePages": { - "title": "ā¸›ā¸Ŗā¸ąā¸šā¸‚ā¸™ā¸˛ā¸”/ā¸Ēāš€ā¸ā¸Ĩā¸Ģā¸™āš‰ā¸˛", - "desc": "āš€ā¸›ā¸Ĩā¸ĩāšˆā¸ĸ⏙⏂⏙⏞⏔/ā¸Ēāš€ā¸ā¸Ĩ⏂⏭⏇ā¸Ģā¸™āš‰ā¸˛āšā¸Ĩ⏰/ā¸Ģā¸Ŗā¸ˇā¸­āš€ā¸™ā¸ˇāš‰ā¸­ā¸Ģā¸˛ā¸‚ā¸­ā¸‡ā¸Ąā¸ąā¸™" - }, "pipeline": { "title": "⏗⏴⏍⏗⏞⏇⏇⏞⏙", "desc": "āš€ā¸Ŗā¸ĩā¸ĸā¸āšƒā¸Šāš‰ā¸‡ā¸˛ā¸™ā¸Ģā¸Ĩ⏞ā¸ĸā¸ā¸˛ā¸Ŗā¸ā¸Ŗā¸°ā¸—ā¸ŗāšƒā¸™ PDF āš‚ā¸”ā¸ĸ⏁⏺ā¸Ģ⏙⏔ā¸Ēā¸„ā¸Ŗā¸´ā¸›ā¸•āšŒ pipeline" }, - "addPageNumbers": { - "title": "āš€ā¸žā¸´āšˆā¸Ąā¸Ģā¸Ąā¸˛ā¸ĸāš€ā¸Ĩ⏂ā¸Ģā¸™āš‰ā¸˛", - "desc": "āš€ā¸žā¸´āšˆā¸Ąā¸Ģā¸Ąā¸˛ā¸ĸāš€ā¸Ĩ⏂ā¸Ģā¸™āš‰ā¸˛ā¸•ā¸Ĩā¸­ā¸”ā¸—ā¸ąāš‰ā¸‡āš€ā¸­ā¸ā¸Ēā¸˛ā¸Ŗāšƒā¸™ā¸•ā¸ŗāšā¸Ģā¸™āšˆā¸‡ā¸—ā¸ĩāšˆā¸ā¸ŗā¸Ģ⏙⏔" - }, "auto-rename": { "title": "āš€ā¸›ā¸Ĩā¸ĩāšˆā¸ĸā¸™ā¸Šā¸ˇāšˆā¸­ PDF ā¸­ā¸ąā¸•āš‚ā¸™ā¸Ąā¸ąā¸•ā¸´", "desc": "āš€ā¸›ā¸Ĩā¸ĩāšˆā¸ĸā¸™ā¸Šā¸ˇāšˆā¸­āš„ā¸Ÿā¸ĨāšŒ PDF āš‚ā¸”ā¸ĸā¸­ā¸ąā¸•āš‚ā¸™ā¸Ąā¸ąā¸•ā¸´ā¸•ā¸˛ā¸Ąā¸Ģā¸ąā¸§ā¸‚āš‰ā¸­ā¸—ā¸ĩāšˆā¸•ā¸Ŗā¸§ā¸ˆā¸ˆā¸ąā¸šāš„ā¸”āš‰" }, - "adjustContrast": { - "title": "ā¸›ā¸Ŗā¸ąā¸šā¸Ēā¸ĩ/⏄⏭⏙⏗⏪⏞ā¸Ēā¸•āšŒ", - "desc": "ā¸›ā¸Ŗā¸ąā¸šā¸„ā¸­ā¸™ā¸—ā¸Ŗā¸˛ā¸Ēā¸•āšŒ ā¸„ā¸§ā¸˛ā¸Ąā¸­ā¸´āšˆā¸Ąā¸•ā¸ąā¸§ āšā¸Ĩā¸°ā¸„ā¸§ā¸˛ā¸Ąā¸Ēā¸§āšˆā¸˛ā¸‡ā¸‚ā¸­ā¸‡ PDF" - }, - "crop": { - "title": "ā¸„ā¸Ŗā¸­ā¸šā¸•ā¸ąā¸” PDF", - "desc": "ā¸„ā¸Ŗā¸­ā¸šā¸•ā¸ąā¸” PDF āš€ā¸žā¸ˇāšˆā¸­ā¸Ĩ⏔⏂⏙⏞⏔ (ā¸Ŗā¸ąā¸ā¸Šā¸˛ā¸‚āš‰ā¸­ā¸„ā¸§ā¸˛ā¸Ą!)" - }, - "autoSplitPDF": { - "title": "āšā¸ĸ⏁ā¸Ģā¸™āš‰ā¸˛ā¸­ā¸ąā¸•āš‚ā¸™ā¸Ąā¸ąā¸•ā¸´", - "desc": "āšā¸ĸ⏁ PDF ⏗ā¸ĩāšˆā¸Ēāšā¸ā¸™āš‚ā¸”ā¸ĸāšƒā¸Šāš‰ QR Code āšā¸ĸ⏁ā¸Ģā¸™āš‰ā¸˛" - }, "sanitizePDF": { "title": "ā¸—ā¸ŗā¸„ā¸§ā¸˛ā¸Ąā¸Ē⏰⏭⏞⏔", "desc": "ā¸Ĩ⏚ā¸Ēā¸„ā¸Ŗā¸´ā¸›ā¸•āšŒāšā¸Ĩā¸°ā¸­ā¸‡ā¸„āšŒā¸›ā¸Ŗā¸°ā¸ā¸­ā¸šā¸­ā¸ˇāšˆā¸™āš† ā¸ˆā¸˛ā¸āš„ā¸Ÿā¸ĨāšŒ PDF" @@ -519,30 +854,14 @@ "title": "PDF to Markdown", "desc": "Converts any PDF to Markdown" }, - "getPdfInfo": { - "title": "ā¸Ŗā¸ąā¸šā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩā¸—ā¸ąāš‰ā¸‡ā¸Ģā¸Ąā¸”āš€ā¸ā¸ĩāšˆā¸ĸā¸§ā¸ā¸ąā¸š PDF", - "desc": "ā¸Ŗā¸ąā¸šā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩ⏗ā¸ĩāšˆāš€ā¸›āš‡ā¸™āš„ā¸›āš„ā¸”āš‰ā¸—ā¸ąāš‰ā¸‡ā¸Ģā¸Ąā¸”āš€ā¸ā¸ĩāšˆā¸ĸā¸§ā¸ā¸ąā¸š PDF" - }, "pageExtracter": { "title": "āšā¸ĸ⏁ā¸Ģā¸™āš‰ā¸˛", "desc": "āšā¸ĸ⏁ā¸Ģā¸™āš‰ā¸˛ā¸—ā¸ĩāšˆāš€ā¸Ĩ⏎⏭⏁⏈⏞⏁ PDF" }, - "pdfToSinglePage": { - "title": "ā¸Ģā¸™āš‰ā¸˛ā¸‚ā¸™ā¸˛ā¸”āšƒā¸Ģā¸āšˆāš€ā¸žā¸ĩā¸ĸ⏇ā¸Ģā¸™āš‰ā¸˛āš€ā¸”ā¸ĩā¸ĸ⏧", - "desc": "ā¸Ŗā¸§ā¸Ąā¸Ģā¸™āš‰ā¸˛ā¸—ā¸ąāš‰ā¸‡ā¸Ģā¸Ąā¸”ā¸‚ā¸­ā¸‡ PDF āš€ā¸›āš‡ā¸™ā¸Ģā¸™āš‰ā¸˛āš€ā¸”ā¸ĩā¸ĸā¸§ā¸‚ā¸™ā¸˛ā¸”āšƒā¸Ģā¸āšˆ" - }, - "showJS": { - "title": "āšā¸Ē⏔⏇ Javascript", - "desc": "ā¸„āš‰ā¸™ā¸Ģā¸˛āšā¸Ĩā¸°āšā¸Ē⏔⏇ Javascript ⏗ā¸ĩāšˆā¸ā¸ąā¸‡āšƒā¸™ PDF" - }, "autoRedact": { "title": "ā¸‹āšˆā¸­ā¸™ā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩā¸­ā¸ąā¸•āš‚ā¸™ā¸Ąā¸ąā¸•ā¸´", "desc": "ā¸‹āšˆā¸­ā¸™ā¸‚āš‰ā¸­ā¸„ā¸§ā¸˛ā¸Ąāšƒā¸™ PDF āš‚ā¸”ā¸ĸā¸­ā¸ąā¸•āš‚ā¸™ā¸Ąā¸ąā¸•ā¸´ā¸•ā¸˛ā¸Ąā¸‚āš‰ā¸­ā¸„ā¸§ā¸˛ā¸Ąā¸—ā¸ĩāšˆā¸›āš‰ā¸­ā¸™" }, - "redact": { - "title": "Manual Redaction", - "desc": "Redacts a PDF based on selected text, drawn shapes and/or selected page(s)" - }, "PDFToCSV": { "title": "PDF āš€ā¸›āš‡ā¸™ CSV", "desc": "āšā¸ĸā¸ā¸•ā¸˛ā¸Ŗā¸˛ā¸‡ā¸ˆā¸˛ā¸ PDF āšā¸›ā¸Ĩā¸‡āš€ā¸›āš‡ā¸™ CSV" @@ -551,10 +870,6 @@ "title": "āšā¸ĸā¸ā¸•ā¸˛ā¸Ąā¸‚ā¸™ā¸˛ā¸”/ā¸ˆā¸ŗā¸™ā¸§ā¸™", "desc": "āšā¸ĸ⏁ PDF āš€ā¸›āš‡ā¸™āš€ā¸­ā¸ā¸Ē⏞⏪ā¸Ģā¸Ĩ⏞ā¸ĸā¸‰ā¸šā¸ąā¸šā¸•ā¸˛ā¸Ąā¸‚ā¸™ā¸˛ā¸” ā¸ˆā¸ŗā¸™ā¸§ā¸™ā¸Ģā¸™āš‰ā¸˛ ā¸Ģā¸Ŗā¸ˇā¸­ā¸ˆā¸ŗā¸™ā¸§ā¸™āš€ā¸­ā¸ā¸Ē⏞⏪" }, - "overlay-pdfs": { - "title": "ā¸‹āš‰ā¸­ā¸™ā¸—ā¸ąā¸š PDF", - "desc": "ā¸‹āš‰ā¸­ā¸™ā¸—ā¸ąā¸š PDF ā¸šā¸™ PDF ⏭ā¸ĩā¸āš„ā¸Ÿā¸ĨāšŒā¸Ģ⏙ā¸ļāšˆā¸‡" - }, "split-by-sections": { "title": "āšā¸ĸ⏁ PDF āš€ā¸›āš‡ā¸™ā¸Ēāšˆā¸§ā¸™", "desc": "āšā¸šāšˆā¸‡āšā¸•āšˆā¸Ĩ⏰ā¸Ģā¸™āš‰ā¸˛ā¸‚ā¸­ā¸‡ PDF āš€ā¸›āš‡ā¸™ā¸Ēāšˆā¸§ā¸™ā¸ĸāšˆā¸­ā¸ĸāšā¸™ā¸§ā¸™ā¸­ā¸™āšā¸Ĩā¸°āšā¸™ā¸§ā¸•ā¸ąāš‰ā¸‡" @@ -563,43 +878,17 @@ "title": "āš€ā¸žā¸´āšˆā¸Ąā¸•ā¸Ŗā¸˛ā¸›ā¸Ŗā¸°ā¸—ā¸ąā¸šā¸Ĩā¸‡āšƒā¸™ PDF", "desc": "āš€ā¸žā¸´āšˆā¸Ąā¸‚āš‰ā¸­ā¸„ā¸§ā¸˛ā¸Ąā¸Ģā¸Ŗā¸ˇā¸­ā¸•ā¸Ŗā¸˛ā¸›ā¸Ŗā¸°ā¸—ā¸ąā¸šā¸Ŗā¸šā¸›ā¸ ā¸˛ā¸žāšƒā¸™ā¸•ā¸ŗāšā¸Ģā¸™āšˆā¸‡ā¸—ā¸ĩāšˆā¸ā¸ŗā¸Ģ⏙⏔" }, - "removeImage": { - "title": "ā¸Ĩā¸šā¸ ā¸˛ā¸žā¸­ā¸­ā¸ā¸ˆā¸˛ā¸ PDF", - "desc": "ā¸Ĩā¸šā¸ ā¸˛ā¸žā¸­ā¸­ā¸ā¸ˆā¸˛ā¸ PDF āš€ā¸žā¸ˇāšˆā¸­ā¸Ĩā¸”ā¸‚ā¸™ā¸˛ā¸”āš„ā¸Ÿā¸ĨāšŒ" - }, - "splitByChapters": { - "title": "āšā¸šāšˆā¸‡āš„ā¸Ÿā¸ĨāšŒ PDF ā¸•ā¸˛ā¸Ąā¸Ģā¸Ąā¸§ā¸”ā¸Ģā¸Ąā¸šāšˆ", - "desc": "Split a PDF into multiple files based on its chapter structure." - }, - "validateSignature": { - "title": "Validate PDF Signature", - "desc": "Verify digital signatures and certificates in PDF documents" - }, "replace-color": { "title": "Replace and Invert Color", "desc": "Replace color for text and background in PDF and invert full color of pdf to reduce file size" }, - "convert": { - "title": "āšā¸›ā¸Ĩ⏇" - }, "attachments": { "title": "Add attachments" }, - "extractPages": { - "title": "āšā¸ĸ⏁ā¸Ģā¸™āš‰ā¸˛" - }, - "removePages": { - "title": "ā¸Ĩ⏚", - "desc": "ā¸Ĩ⏚ā¸Ģā¸™āš‰ā¸˛ā¸—ā¸ĩāšˆāš„ā¸Ąāšˆā¸•āš‰ā¸­ā¸‡ā¸ā¸˛ā¸Ŗā¸ˆā¸˛ā¸āš€ā¸­ā¸ā¸Ē⏞⏪ PDF ⏂⏭⏇⏄⏏⏓" - }, "removeImagePdf": { "title": "ā¸Ĩā¸šā¸ ā¸˛ā¸žā¸­ā¸­ā¸ā¸ˆā¸˛ā¸ PDF", "desc": "ā¸Ĩā¸šā¸ ā¸˛ā¸žā¸­ā¸­ā¸ā¸ˆā¸˛ā¸ PDF āš€ā¸žā¸ˇāšˆā¸­ā¸Ĩā¸”ā¸‚ā¸™ā¸˛ā¸”āš„ā¸Ÿā¸ĨāšŒ" }, - "autoSizeSplitPDF": { - "title": "āšā¸ĸā¸ā¸•ā¸˛ā¸Ąā¸‚ā¸™ā¸˛ā¸”/ā¸ˆā¸ŗā¸™ā¸§ā¸™", - "desc": "āšā¸ĸ⏁ PDF āš€ā¸›āš‡ā¸™āš€ā¸­ā¸ā¸Ē⏞⏪ā¸Ģā¸Ĩ⏞ā¸ĸā¸‰ā¸šā¸ąā¸šā¸•ā¸˛ā¸Ąā¸‚ā¸™ā¸˛ā¸” ā¸ˆā¸ŗā¸™ā¸§ā¸™ā¸Ģā¸™āš‰ā¸˛ ā¸Ģā¸Ŗā¸ˇā¸­ā¸ˆā¸ŗā¸™ā¸§ā¸™āš€ā¸­ā¸ā¸Ē⏞⏪" - }, "adjust-contrast": { "title": "ā¸›ā¸Ŗā¸ąā¸šā¸Ēā¸ĩ/⏄⏭⏙⏗⏪⏞ā¸Ēā¸•āšŒ", "desc": "ā¸›ā¸Ŗā¸ąā¸šā¸„ā¸­ā¸™ā¸—ā¸Ŗā¸˛ā¸Ēā¸•āšŒ ā¸„ā¸§ā¸˛ā¸Ąā¸­ā¸´āšˆā¸Ąā¸•ā¸ąā¸§ āšā¸Ĩā¸°ā¸„ā¸§ā¸˛ā¸Ąā¸Ēā¸§āšˆā¸˛ā¸‡ā¸‚ā¸­ā¸‡ PDF" @@ -607,11 +896,12 @@ "replaceColorPdf": { "title": "Replace and Invert Color", "desc": "Replace color for text and background in PDF and invert full color of pdf to reduce file size" - }, - "changePermissions": { - "title": "āš€ā¸›ā¸Ĩā¸ĩāšˆā¸ĸ⏙ā¸Ēā¸´ā¸—ā¸˜ā¸´āšŒ" } }, + "landing": { + "addFiles": "Add Files", + "uploadFromComputer": "Upload from computer" + }, "viewPdf": { "tags": "ā¸”ā¸š, ā¸­āšˆā¸˛ā¸™, āš€ā¸žā¸´āšˆā¸Ąā¸„ā¸ŗā¸­ā¸˜ā¸´ā¸šā¸˛ā¸ĸ, ā¸‚āš‰ā¸­ā¸„ā¸§ā¸˛ā¸Ą, ā¸Ŗā¸šā¸›ā¸ ā¸˛ā¸ž", "title": "View/Edit PDF", @@ -645,17 +935,39 @@ "merge": { "tags": "ā¸Ŗā¸§ā¸Ą, ā¸ā¸˛ā¸Ŗā¸”ā¸ŗāš€ā¸™ā¸´ā¸™ā¸ā¸˛ā¸Ŗā¸Ģā¸™āš‰ā¸˛, ā¸ā¸ąāšˆā¸‡āš€ā¸‹ā¸´ā¸ŖāšŒā¸Ÿāš€ā¸§ā¸­ā¸ŖāšŒ", "title": "ā¸Ŗā¸§ā¸Ą", + "removeDigitalSignature": { + "label": "Remove digital signature in the merged file?", + "tooltip": { + "title": "Remove Digital Signature", + "description": "Digital signatures will be invalidated when merging files. Check this to remove them from the final merged PDF." + } + }, + "generateTableOfContents": { + "label": "Generate table of contents in the merged file?", + "tooltip": { + "title": "Generate Table of Contents", + "description": "Automatically creates a clickable table of contents in the merged PDF based on the original file names and page numbers." + } + }, + "submit": "ā¸Ŗā¸§ā¸Ą", + "sortBy": { + "description": "Files will be merged in the order they're selected. Drag to reorder or sort below.", + "label": "Sort By", + "filename": "ā¸Šā¸ˇāšˆā¸­āš„ā¸Ÿā¸ĨāšŒ", + "dateModified": "Date Modified", + "ascending": "Ascending", + "descending": "Descending", + "sort": "Sort" + }, + "error": { + "failed": "An error occurred while merging the PDFs." + }, "header": "ā¸Ŗā¸§ā¸Ą PDF ā¸Ģā¸Ĩ⏞ā¸ĸāš„ā¸Ÿā¸ĨāšŒ (2 ⏂ā¸ļāš‰ā¸™āš„ā¸›)", "sortByName": "ā¸ˆā¸ąā¸”āš€ā¸Ŗā¸ĩā¸ĸā¸‡ā¸•ā¸˛ā¸Ąā¸Šā¸ˇāšˆā¸­", "sortByDate": "ā¸ˆā¸ąā¸”āš€ā¸Ŗā¸ĩā¸ĸā¸‡ā¸•ā¸˛ā¸Ąā¸§ā¸ąā¸™ā¸—ā¸ĩāšˆ", - "removeCertSign": "ā¸Ĩ⏚ā¸Ĩ⏞ā¸ĸāš€ā¸‹āš‡ā¸™ā¸”ā¸´ā¸ˆā¸´ā¸—ā¸ąā¸Ĩāšƒā¸™āš„ā¸Ÿā¸ĨāšŒā¸—ā¸ĩāšˆā¸Ŗā¸§ā¸Ą?", - "submit": "ā¸Ŗā¸§ā¸Ą", - "sortBy": { - "filename": "ā¸Šā¸ˇāšˆā¸­āš„ā¸Ÿā¸ĨāšŒ" - } + "removeCertSign": "ā¸Ĩ⏚ā¸Ĩ⏞ā¸ĸāš€ā¸‹āš‡ā¸™ā¸”ā¸´ā¸ˆā¸´ā¸—ā¸ąā¸Ĩāšƒā¸™āš„ā¸Ÿā¸ĨāšŒā¸—ā¸ĩāšˆā¸Ŗā¸§ā¸Ą?" }, "split": { - "tags": "ā¸ā¸˛ā¸Ŗā¸”ā¸ŗāš€ā¸™ā¸´ā¸™ā¸ā¸˛ā¸Ŗā¸Ģā¸™āš‰ā¸˛, āšā¸šāšˆā¸‡, ā¸Ģā¸Ĩ⏞ā¸ĸā¸Ģā¸™āš‰ā¸˛, ā¸•ā¸ąā¸”, ā¸ā¸ąāšˆā¸‡āš€ā¸‹ā¸´ā¸ŖāšŒā¸Ÿāš€ā¸§ā¸­ā¸ŖāšŒ", "title": "āšā¸ĸ⏁ PDF", "header": "āšā¸ĸ⏁ PDF", "desc": { @@ -671,25 +983,249 @@ "splitPages": "ā¸›āš‰ā¸­ā¸™ā¸Ģā¸™āš‰ā¸˛ā¸—ā¸ĩāšˆā¸•āš‰ā¸­ā¸‡ā¸ā¸˛ā¸Ŗāšā¸ĸ⏁:", "submit": "āšā¸ĸ⏁", "steps": { + "chooseMethod": "Choose Method", "settings": "ā¸ā¸˛ā¸Ŗā¸•ā¸ąāš‰ā¸‡ā¸„āšˆā¸˛" }, + "settings": { + "selectMethodFirst": "Please select a split method first" + }, + "error": { + "failed": "An error occurred while splitting the PDF." + }, + "method": { + "label": "Choose split method", + "placeholder": "Select how to split the PDF" + }, "methods": { + "prefix": { + "splitAt": "Split at", + "splitBy": "Split by" + }, + "byPages": { + "name": "Page Numbers", + "desc": "Extract specific pages (1,3,5-10)", + "tooltip": "Enter page numbers separated by commas or ranges with hyphens" + }, + "bySections": { + "name": "Sections", + "desc": "Divide pages into grid sections", + "tooltip": "Split each page into horizontal and vertical sections" + }, "bySize": { - "name": "ā¸‚ā¸™ā¸˛ā¸”āš„ā¸Ÿā¸ĨāšŒ" + "name": "ā¸‚ā¸™ā¸˛ā¸”āš„ā¸Ÿā¸ĨāšŒ", + "desc": "Limit maximum file size", + "tooltip": "Specify maximum file size (e.g. 10MB, 500KB)" + }, + "byPageCount": { + "name": "Page Count", + "desc": "Fixed pages per file", + "tooltip": "Enter the number of pages for each split file" + }, + "byDocCount": { + "name": "Document Count", + "desc": "Create specific number of files", + "tooltip": "Enter how many files you want to create" + }, + "byChapters": { + "name": "Chapters", + "desc": "Split at bookmark boundaries", + "tooltip": "Uses PDF bookmarks to determine split points" + }, + "byPageDivider": { + "name": "Page Divider", + "desc": "Auto-split with divider sheets", + "tooltip": "Use QR code divider sheets between documents when scanning" } }, "value": { "fileSize": { - "label": "ā¸‚ā¸™ā¸˛ā¸”āš„ā¸Ÿā¸ĨāšŒ" + "label": "ā¸‚ā¸™ā¸˛ā¸”āš„ā¸Ÿā¸ĨāšŒ", + "placeholder": "e.g. 10MB, 500KB" + }, + "pageCount": { + "label": "Pages per File", + "placeholder": "e.g. 5, 10" + }, + "docCount": { + "label": "Number of Files", + "placeholder": "e.g. 3, 5" } - } + }, + "tooltip": { + "header": { + "title": "Split Methods Overview" + }, + "byPages": { + "title": "Split at Page Numbers", + "text": "Split your PDF at specific page numbers. Using 'n' splits after page n. Using 'n-m' splits before page n and after page m.", + "bullet1": "Single split points: 3,7 (splits after pages 3 and 7)", + "bullet2": "Range split points: 3-8 (splits before page 3 and after page 8)", + "bullet3": "Mixed: 2,5-10,15 (splits after page 2, before page 5, after page 10, and after page 15)" + }, + "bySections": { + "title": "Split by Grid Sections", + "text": "Divide each page into a grid of sections. Useful for splitting documents with multiple columns or extracting specific areas.", + "bullet1": "Horizontal: Number of rows to create", + "bullet2": "Vertical: Number of columns to create", + "bullet3": "Merge: Combine all sections into one PDF" + }, + "bySize": { + "title": "Split by File Size", + "text": "Create multiple PDFs that don't exceed a specified file size. Ideal for file size limitations or email attachments.", + "bullet1": "Use MB for larger files (e.g., 10MB)", + "bullet2": "Use KB for smaller files (e.g., 500KB)", + "bullet3": "System will split at page boundaries" + }, + "byCount": { + "title": "Split by Count", + "text": "Create multiple PDFs with a specific number of pages or documents each.", + "bullet1": "Page Count: Fixed number of pages per file", + "bullet2": "Document Count: Fixed number of output files", + "bullet3": "Useful for batch processing workflows" + }, + "byChapters": { + "title": "Split by Chapters", + "text": "Use PDF bookmarks to automatically split at chapter boundaries. Requires PDFs with bookmark structure.", + "bullet1": "Bookmark Level: Which level to split on (1=top level)", + "bullet2": "Include Metadata: Preserve document properties", + "bullet3": "Allow Duplicates: Handle repeated bookmark names" + }, + "byDocCount": { + "bullet1": "Enter the number of output files you want", + "bullet2": "Pages are distributed as evenly as possible", + "bullet3": "Useful when you need a specific number of files", + "text": "Create a specific number of output files by evenly distributing pages across them.", + "title": "Split by Document Count" + }, + "byPageCount": { + "bullet1": "Enter the number of pages per output file", + "bullet2": "Last file may have fewer pages if not evenly divisible", + "bullet3": "Useful for batch processing workflows", + "text": "Create multiple PDFs with a specific number of pages each. Perfect for creating uniform document chunks.", + "title": "Split by Page Count" + }, + "byPageDivider": { + "bullet1": "Print divider sheets from the download link", + "bullet2": "Insert divider sheets between your documents", + "bullet3": "Scan all documents together as one PDF", + "bullet4": "Upload - divider pages are automatically detected and removed", + "bullet5": "Enable Duplex Mode if scanning both sides of divider sheets", + "text": "Automatically split scanned documents using physical divider sheets with QR codes. Perfect for processing multiple documents scanned together.", + "title": "Split by Page Divider" + } + }, + "methodSelection": { + "tooltip": { + "bullet1": "Click on a method card to select it", + "bullet2": "Hover over each card to see a quick description", + "bullet3": "The settings step will appear after you select a method", + "bullet4": "You can change methods at any time before processing", + "header": { + "text": "Choose how you want to split your PDF document. Each method is optimized for different use cases and document types.", + "title": "Split Method Selection" + }, + "title": "Choose Your Split Method" + } + }, + "selectMethod": "Select a split method", + "tags": "ā¸ā¸˛ā¸Ŗā¸”ā¸ŗāš€ā¸™ā¸´ā¸™ā¸ā¸˛ā¸Ŗā¸Ģā¸™āš‰ā¸˛, āšā¸šāšˆā¸‡, ā¸Ģā¸Ĩ⏞ā¸ĸā¸Ģā¸™āš‰ā¸˛, ā¸•ā¸ąā¸”, ā¸ā¸ąāšˆā¸‡āš€ā¸‹ā¸´ā¸ŖāšŒā¸Ÿāš€ā¸§ā¸­ā¸ŖāšŒ" }, "rotate": { - "tags": "ā¸ā¸ąāšˆā¸‡āš€ā¸‹ā¸´ā¸ŖāšŒā¸Ÿāš€ā¸§ā¸­ā¸ŖāšŒ", "title": "ā¸Ģā¸Ąā¸¸ā¸™ PDF", + "submit": "ā¸Ģā¸Ąā¸¸ā¸™", + "selectRotation": "Select Rotation Angle (Clockwise)", + "error": { + "failed": "An error occurred while rotating the PDF." + }, + "preview": { + "title": "Rotation Preview" + }, + "rotateLeft": "Rotate Anticlockwise", + "rotateRight": "Rotate Clockwise", + "tooltip": { + "header": { + "title": "Rotate Settings Overview" + }, + "description": { + "text": "Rotate your PDF pages clockwise or anticlockwise in 90-degree increments. All pages in the PDF will be rotated. The preview shows how your document will look after rotation." + }, + "controls": { + "title": "Controls", + "text": "Use the rotation buttons to adjust orientation. Left button rotates anticlockwise, right button rotates clockwise. Each click rotates by 90 degrees." + } + }, + "tags": "ā¸ā¸ąāšˆā¸‡āš€ā¸‹ā¸´ā¸ŖāšŒā¸Ÿāš€ā¸§ā¸­ā¸ŖāšŒ", "header": "ā¸Ģā¸Ąā¸¸ā¸™ PDF", - "selectAngle": "āš€ā¸Ĩā¸ˇā¸­ā¸ā¸Ąā¸¸ā¸Ąā¸ā¸˛ā¸Ŗā¸Ģā¸Ąā¸¸ā¸™ (āš€ā¸›āš‡ā¸™ā¸Ģā¸Ĩ⏞ā¸ĸāš€ā¸—āšˆā¸˛ā¸‚ā¸­ā¸‡ 90 ⏭⏇⏍⏞):", - "submit": "ā¸Ģā¸Ąā¸¸ā¸™" + "selectAngle": "āš€ā¸Ĩā¸ˇā¸­ā¸ā¸Ąā¸¸ā¸Ąā¸ā¸˛ā¸Ŗā¸Ģā¸Ąā¸¸ā¸™ (āš€ā¸›āš‡ā¸™ā¸Ģā¸Ĩ⏞ā¸ĸāš€ā¸—āšˆā¸˛ā¸‚ā¸­ā¸‡ 90 ⏭⏇⏍⏞):" + }, + "convert": { + "title": "āšā¸›ā¸Ĩ⏇", + "desc": "Convert files between different formats", + "files": "Files", + "selectFilesPlaceholder": "Select files in the main view to get started", + "settings": "ā¸ā¸˛ā¸Ŗā¸•ā¸ąāš‰ā¸‡ā¸„āšˆā¸˛", + "conversionCompleted": "Conversion completed", + "results": "Results", + "defaultFilename": "converted_file", + "conversionResults": "Conversion Results", + "convertFrom": "Convert from", + "convertTo": "Convert to", + "sourceFormatPlaceholder": "Source format", + "targetFormatPlaceholder": "Target format", + "selectSourceFormatFirst": "Select a source format first", + "outputOptions": "Output Options", + "pdfOptions": "PDF Options", + "imageOptions": "Image Options", + "colorType": "Colour Type", + "color": "ā¸Ēā¸ĩ", + "greyscale": "ā¸Ŗā¸°ā¸”ā¸ąā¸šā¸Ēā¸ĩāš€ā¸—ā¸˛", + "blackwhite": "Black & White", + "dpi": "DPI", + "output": "Output", + "single": "Single", + "multiple": "Multiple", + "fitOption": "Fit Option", + "maintainAspectRatio": "Maintain Aspect Ratio", + "fitDocumentToPage": "Fit Document to Page", + "fillPage": "āš€ā¸•ā¸´ā¸Ąā¸Ģā¸™āš‰ā¸˛", + "autoRotate": "Auto Rotate", + "autoRotateDescription": "Automatically rotate images to better fit the PDF page", + "combineImages": "Combine Images", + "combineImagesDescription": "Combine all images into one PDF, or create separate PDFs for each image", + "webOptions": "Web to PDF Options", + "zoomLevel": "Zoom Level", + "emailOptions": "Email to PDF Options", + "includeAttachments": "Include email attachments", + "maxAttachmentSize": "Maximum attachment size (MB)", + "includeAllRecipients": "Include CC and BCC recipients in header", + "downloadHtml": "Download HTML intermediate file instead of PDF", + "pdfaOptions": "PDF/A Options", + "outputFormat": "Output Format", + "pdfaNote": "PDF/A-1b is more compatible, PDF/A-2b supports more features.", + "pdfaDigitalSignatureWarning": "PDF ā¸Ąā¸ĩā¸Ĩ⏞ā¸ĸāš€ā¸‹āš‡ā¸™ā¸”ā¸´ā¸ˆā¸´ā¸—ā¸ąā¸Ĩ ⏋ā¸ļāšˆā¸‡ā¸ˆā¸°ā¸–ā¸šā¸ā¸Ĩā¸šāšƒā¸™ā¸‚ā¸ąāš‰ā¸™ā¸•ā¸­ā¸™ā¸–ā¸ąā¸”āš„ā¸›", + "fileFormat": "File Format", + "wordDoc": "Word Document", + "wordDocExt": "Word Document (.docx)", + "odtExt": "OpenDocument Text (.odt)", + "pptExt": "PowerPoint (.pptx)", + "odpExt": "OpenDocument Presentation (.odp)", + "txtExt": "Plain Text (.txt)", + "rtfExt": "Rich Text Format (.rtf)", + "selectedFiles": "Selected files", + "noFileSelected": "No file selected. Use the file panel to add files.", + "convertFiles": "Convert Files", + "converting": "Converting...", + "downloadConverted": "Download Converted File", + "errorNoFiles": "Please select at least one file to convert.", + "errorNoFormat": "Please select both source and target formats.", + "errorNotSupported": "Conversion from {{from}} to {{to}} is not supported.", + "images": "Images", + "officeDocs": "Office Documents (Word, Excel, PowerPoint)", + "imagesExt": "Images (JPG, PNG, etc.)", + "markdown": "Markdown", + "textRtf": "Text/RTF", + "grayscale": "ā¸Ŗā¸°ā¸”ā¸ąā¸šā¸Ēā¸ĩāš€ā¸—ā¸˛", + "errorConversion": "An error occurred while converting the file." }, "imageToPdf": { "tags": "ā¸ā¸˛ā¸Ŗāšā¸›ā¸Ĩ⏇, ā¸Ŗā¸šā¸›ā¸ ā¸˛ā¸ž, JPG, ā¸ ā¸˛ā¸ž, ā¸Ŗā¸šā¸›ā¸–āšˆā¸˛ā¸ĸ" @@ -727,7 +1263,33 @@ "8": "ā¸Ĩ⏚ā¸Ģā¸™āš‰ā¸˛ā¸Ģā¸Ąā¸˛ā¸ĸāš€ā¸Ĩ⏂ā¸Ēā¸¸ā¸”ā¸—āš‰ā¸˛ā¸ĸ", "9": "ā¸Ĩ⏚ā¸Ģā¸™āš‰ā¸˛ā¸Ģā¸Ąā¸˛ā¸ĸāš€ā¸Ĩā¸‚āšā¸Ŗā¸āšā¸Ĩ⏰ā¸Ēā¸¸ā¸”ā¸—āš‰ā¸˛ā¸ĸ", "10": "ā¸Ŗā¸§ā¸Ąā¸Ģā¸™āš‰ā¸˛āšā¸šā¸šā¸„ā¸ĩāšˆ-ā¸„ā¸šāšˆ", - "11": "Duplicate all pages" + "11": "Duplicate all pages", + "desc": { + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, â€Ļ).", + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, â€Ļ).", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimized for binding on the side)." + } + }, + "desc": { + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, â€Ļ).", + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, â€Ļ).", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimised for binding on the side).", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document." }, "placeholder": "(āš€ā¸Šāšˆā¸™ 1,3,2 ā¸Ģ⏪⏎⏭ 4-8,2,10-12 ā¸Ģ⏪⏎⏭ 2n-1)" }, @@ -739,9 +1301,198 @@ "upload": "āš€ā¸žā¸´āšˆā¸Ąā¸Ŗā¸šā¸›ā¸ ā¸˛ā¸ž", "submit": "āš€ā¸žā¸´āšˆā¸Ąā¸Ŗā¸šā¸›ā¸ ā¸˛ā¸ž" }, + "attachments": { + "tags": "embed,attach,file,attachment,attachments", + "title": "Add attachments", + "header": "Add attachments", + "add": "Add Attachment", + "remove": "Remove Attachment", + "embed": "Embed Attachment", + "submit": "Add attachments" + }, "watermark": { - "tags": "ā¸‚āš‰ā¸­ā¸„ā¸§ā¸˛ā¸Ą, ā¸‹āš‰ā¸ŗ, ā¸›āš‰ā¸˛ā¸ĸ, ā¸‚ā¸­ā¸‡ā¸„ā¸¸ā¸“āš€ā¸­ā¸‡, ā¸Ĩ⏴⏂ā¸Ēā¸´ā¸—ā¸˜ā¸´āšŒ, āš€ā¸„ā¸Ŗā¸ˇāšˆā¸­ā¸‡ā¸Ģā¸Ąā¸˛ā¸ĸā¸ā¸˛ā¸Ŗā¸„āš‰ā¸˛, ā¸Ŗā¸šā¸›ā¸ ā¸˛ā¸ž, JPG, ā¸ ā¸˛ā¸ž, ā¸Ŗā¸šā¸›ā¸–āšˆā¸˛ā¸ĸ", "title": "āš€ā¸žā¸´āšˆā¸Ąā¸Ĩ⏞ā¸ĸā¸™āš‰ā¸ŗ", + "desc": "Add text or image watermarks to PDF files", + "completed": "Watermark added", + "submit": "āš€ā¸žā¸´āšˆā¸Ąā¸Ĩ⏞ā¸ĸā¸™āš‰ā¸ŗ", + "filenamePrefix": "watermarked", + "error": { + "failed": "An error occurred while adding watermark to the PDF." + }, + "watermarkType": { + "text": "ā¸‚āš‰ā¸­ā¸„ā¸§ā¸˛ā¸Ą", + "image": "Image" + }, + "settings": { + "type": "Watermark Type", + "text": { + "label": "Watermark Text", + "placeholder": "Enter watermark text" + }, + "image": { + "label": "Watermark Image", + "choose": "Choose Image", + "selected": "Selected: {{filename}}" + }, + "fontSize": "ā¸‚ā¸™ā¸˛ā¸”ā¸•ā¸ąā¸§ā¸­ā¸ąā¸ā¸Šā¸Ŗ", + "size": "Size", + "alphabet": "Font/Language", + "color": "Watermark Colour", + "rotation": "Rotation (degrees)", + "opacity": "Opacity (%)", + "spacing": { + "horizontal": "Horizontal Spacing", + "vertical": "Vertical Spacing", + "height": "Height Spacing", + "width": "Width Spacing" + }, + "convertToImage": "Flatten PDF pages to images" + }, + "alphabet": { + "roman": "Roman/Latin", + "arabic": "Arabic", + "japanese": "Japanese", + "korean": "Korean", + "chinese": "Chinese", + "thai": "Thai" + }, + "steps": { + "type": "Watermark Type", + "wording": "Wording", + "textStyle": "Style", + "formatting": "Formatting", + "file": "Watermark File" + }, + "results": { + "title": "Watermark Results" + }, + "tooltip": { + "language": { + "title": "Language Support", + "text": "Choose the appropriate language setting to ensure proper font rendering for your text." + }, + "appearance": { + "title": "Appearance Settings", + "text": "Control how your watermark looks and blends with the document.", + "bullet1": "Rotation: -360° to 360° for angled watermarks", + "bullet2": "Opacity: 0-100% for transparency control", + "bullet3": "Lower opacity creates subtle watermarks" + }, + "spacing": { + "title": "Spacing Control", + "text": "Adjust the spacing between repeated watermarks across the page.", + "bullet1": "Width spacing: Horizontal distance between watermarks", + "bullet2": "Height spacing: Vertical distance between watermarks", + "bullet3": "Higher values create more spread out patterns" + }, + "type": { + "header": { + "title": "Watermark Type Selection" + }, + "description": { + "title": "Choose Your Watermark", + "text": "Select between text or image watermarks based on your needs." + }, + "text": { + "title": "Text Watermarks", + "text": "Perfect for adding copyright notices, company names, or confidentiality labels. Supports multiple languages and custom colours.", + "bullet1": "Customisable fonts and languages", + "bullet2": "Adjustable colours and transparency", + "bullet3": "Ideal for legal or branding text" + }, + "image": { + "title": "Image Watermarks", + "text": "Use logos, stamps, or any image as a watermark. Great for branding and visual identification.", + "bullet1": "Upload any image format", + "bullet2": "Maintains image quality", + "bullet3": "Perfect for logos and stamps" + } + }, + "wording": { + "header": { + "title": "Text Content" + }, + "text": { + "title": "Watermark Text", + "text": "Enter the text that will appear as your watermark across the document.", + "bullet1": "Keep it concise for better readability", + "bullet2": "Common examples: 'CONFIDENTIAL', 'DRAFT', company name", + "bullet3": "Emoji characters are not supported and will be filtered out" + } + }, + "textStyle": { + "header": { + "title": "Text Style" + }, + "color": { + "title": "Colour Selection", + "text": "Choose a colour that provides good contrast with your document content.", + "bullet1": "Light grey (#d3d3d3) for subtle watermarks", + "bullet2": "Black or dark colours for high contrast", + "bullet3": "Custom colours for branding purposes" + }, + "language": { + "title": "Language Support", + "text": "Choose the appropriate language setting to ensure proper font rendering." + } + }, + "file": { + "header": { + "title": "Image Upload" + }, + "upload": { + "title": "Image Selection", + "text": "Upload an image file to use as your watermark.", + "bullet1": "Supports common formats: PNG, JPG, GIF, BMP", + "bullet2": "PNG with transparency works best", + "bullet3": "Higher resolution images maintain quality better" + }, + "recommendations": { + "title": "Best Practices", + "text": "Tips for optimal image watermark results.", + "bullet1": "Use logos or stamps with transparent backgrounds", + "bullet2": "Simple designs work better than complex images", + "bullet3": "Consider the final document size when choosing resolution" + } + }, + "formatting": { + "header": { + "title": "Formatting & Layout" + }, + "size": { + "title": "Size Control", + "text": "Adjust the size of your watermark (text or image).", + "bullet1": "Larger sizes create more prominent watermarks" + }, + "appearance": { + "title": "Appearance Settings", + "text": "Control how your watermark looks and blends with the document.", + "bullet1": "Rotation: -360° to 360° for angled watermarks", + "bullet2": "Opacity: 0-100% for transparency control", + "bullet3": "Lower opacity creates subtle watermarks" + }, + "spacing": { + "title": "Spacing Control", + "text": "Adjust the spacing between repeated watermarks across the page.", + "bullet1": "Horizontal spacing: Distance between watermarks left to right", + "bullet2": "Vertical spacing: Distance between watermarks top to bottom", + "bullet3": "Higher values create more spread out patterns" + }, + "security": { + "title": "Security Option", + "text": "Convert the final PDF to an image-based format for enhanced security.", + "bullet1": "Prevents text selection and copying", + "bullet2": "Makes watermarks harder to remove", + "bullet3": "Results in larger file sizes", + "bullet4": "Best for sensitive or copyrighted content" + } + } + }, + "type": { + "1": "ā¸‚āš‰ā¸­ā¸„ā¸§ā¸˛ā¸Ą", + "2": "ā¸ ā¸˛ā¸ž" + }, + "tags": "ā¸‚āš‰ā¸­ā¸„ā¸§ā¸˛ā¸Ą, ā¸‹āš‰ā¸ŗ, ā¸›āš‰ā¸˛ā¸ĸ, ā¸‚ā¸­ā¸‡ā¸„ā¸¸ā¸“āš€ā¸­ā¸‡, ā¸Ĩ⏴⏂ā¸Ēā¸´ā¸—ā¸˜ā¸´āšŒ, āš€ā¸„ā¸Ŗā¸ˇāšˆā¸­ā¸‡ā¸Ģā¸Ąā¸˛ā¸ĸā¸ā¸˛ā¸Ŗā¸„āš‰ā¸˛, ā¸Ŗā¸šā¸›ā¸ ā¸˛ā¸ž, JPG, ā¸ ā¸˛ā¸ž, ā¸Ŗā¸šā¸›ā¸–āšˆā¸˛ā¸ĸ", "header": "āš€ā¸žā¸´āšˆā¸Ąā¸Ĩ⏞ā¸ĸā¸™āš‰ā¸ŗ", "customColor": "ā¸Ēā¸ĩā¸‚āš‰ā¸­ā¸„ā¸§ā¸˛ā¸Ąā¸—ā¸ĩāšˆā¸ā¸ŗā¸Ģā¸™ā¸”āš€ā¸­ā¸‡", "selectText": { @@ -755,17 +1506,6 @@ "8": "ā¸›ā¸Ŗā¸°āš€ā¸ ā¸—ā¸Ĩ⏞ā¸ĸā¸™āš‰ā¸ŗ:", "9": "ā¸ ā¸˛ā¸žā¸Ĩ⏞ā¸ĸā¸™āš‰ā¸ŗ:", "10": "Convert PDF to PDF-Image" - }, - "submit": "āš€ā¸žā¸´āšˆā¸Ąā¸Ĩ⏞ā¸ĸā¸™āš‰ā¸ŗ", - "type": { - "1": "ā¸‚āš‰ā¸­ā¸„ā¸§ā¸˛ā¸Ą", - "2": "ā¸ ā¸˛ā¸ž" - }, - "watermarkType": { - "text": "ā¸‚āš‰ā¸­ā¸„ā¸§ā¸˛ā¸Ą" - }, - "settings": { - "fontSize": "ā¸‚ā¸™ā¸˛ā¸”ā¸•ā¸ąā¸§ā¸­ā¸ąā¸ā¸Šā¸Ŗ" } }, "permissions": { @@ -790,50 +1530,201 @@ "removePages": { "tags": "ā¸Ĩ⏚ā¸Ģā¸™āš‰ā¸˛, ā¸Ĩ⏚ā¸Ģā¸™āš‰ā¸˛", "title": "ā¸Ĩ⏚", + "pageNumbers": { + "label": "Pages to Remove", + "placeholder": "e.g., 1,3,5-8,10", + "error": "Invalid page number format. Use numbers, ranges (1-5), or mathematical expressions (2n+1)" + }, + "filenamePrefix": "pages_removed", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "settings": { + "title": "Settings" + }, + "tooltip": { + "header": { + "title": "Remove Pages Settings" + }, + "pageNumbers": { + "title": "Page Selection", + "text": "Specify which pages to remove from your PDF. You can select individual pages, ranges, or use mathematical expressions.", + "bullet1": "Individual pages: 1,3,5 (removes pages 1, 3, and 5)", + "bullet2": "Page ranges: 1-5,10-15 (removes pages 1-5 and 10-15)", + "bullet3": "Mathematical: 2n+1 (removes odd pages)", + "bullet4": "Open ranges: 5- (removes from page 5 to end)" + }, + "examples": { + "title": "Common Examples", + "text": "Here are some common page selection patterns:", + "bullet1": "Remove first page: 1", + "bullet2": "Remove last 3 pages: -3", + "bullet3": "Remove every other page: 2n", + "bullet4": "Remove specific scattered pages: 1,5,10,15" + }, + "safety": { + "title": "Safety Tips", + "text": "Important considerations when removing pages:", + "bullet1": "Always preview your selection before processing", + "bullet2": "Keep a backup of your original file", + "bullet3": "Page numbers start from 1, not 0", + "bullet4": "Invalid page numbers will be ignored" + } + }, + "error": { + "failed": "An error occurred whilst removing pages." + }, + "results": { + "title": "Page Removal Results" + }, "submit": "ā¸Ĩ⏚" }, - "addPassword": { - "tags": "⏛ā¸Ĩā¸­ā¸”ā¸ ā¸ąā¸ĸ, ā¸„ā¸§ā¸˛ā¸Ąā¸›ā¸Ĩā¸­ā¸”ā¸ ā¸ąā¸ĸ", - "title": "āš€ā¸žā¸´āšˆā¸Ąā¸Ŗā¸Ģā¸ąā¸Ēā¸œāšˆā¸˛ā¸™", - "header": "āš€ā¸žā¸´āšˆā¸Ąā¸Ŗā¸Ģā¸ąā¸Ēā¸œāšˆā¸˛ā¸™ (āš€ā¸‚āš‰ā¸˛ā¸Ŗā¸Ģā¸ąā¸Ē)", - "selectText": { - "1": "āš€ā¸Ĩ⏎⏭⏁ PDF āš€ā¸žā¸ˇāšˆā¸­āš€ā¸‚āš‰ā¸˛ā¸Ŗā¸Ģā¸ąā¸Ē", - "2": "⏪ā¸Ģā¸ąā¸Ēā¸œāšˆā¸˛ā¸™ā¸œā¸šāš‰āšƒā¸Šāš‰", - "3": "ā¸„ā¸§ā¸˛ā¸Ąā¸ĸ⏞⏧⏄ā¸ĩā¸ĸāšŒā¸ā¸˛ā¸Ŗāš€ā¸‚āš‰ā¸˛ā¸Ŗā¸Ģā¸ąā¸Ē", - "4": "ā¸„āšˆā¸˛ā¸Ēā¸šā¸‡ā¸ā¸§āšˆā¸˛ā¸Ąā¸ĩā¸„ā¸§ā¸˛ā¸Ąāšā¸‚āš‡ā¸‡āšā¸ā¸Ŗāšˆā¸‡ā¸ā¸§āšˆā¸˛ āšā¸•āšˆā¸„āšˆā¸˛ā¸•āšˆā¸ŗā¸ā¸§āšˆā¸˛āš€ā¸‚āš‰ā¸˛ā¸ā¸ąā¸™āš„ā¸”āš‰ā¸”ā¸ĩā¸ā¸§āšˆā¸˛", - "5": "ā¸Ēā¸´ā¸—ā¸˜ā¸´āšŒā¸—ā¸ĩāšˆā¸•ā¸ąāš‰ā¸‡ā¸„āšˆā¸˛ (āšā¸™ā¸°ā¸™ā¸ŗāšƒā¸Ģāš‰āšƒā¸Šāš‰ā¸žā¸Ŗāš‰ā¸­ā¸Ąā¸Ŗā¸Ģā¸ąā¸Ēā¸œāšˆā¸˛ā¸™ā¸œā¸šāš‰ā¸”ā¸šāšā¸Ĩ)", - "6": "ā¸›āš‰ā¸­ā¸‡ā¸ā¸ąā¸™ā¸ā¸˛ā¸Ŗā¸›ā¸Ŗā¸°ā¸ā¸­ā¸šāš€ā¸­ā¸ā¸Ē⏞⏪", - "7": "ā¸›āš‰ā¸­ā¸‡ā¸ā¸ąā¸™ā¸ā¸˛ā¸Ŗā¸Ēā¸ā¸ąā¸”āš€ā¸™ā¸ˇāš‰ā¸­ā¸Ģ⏞", - "8": "ā¸›āš‰ā¸­ā¸‡ā¸ā¸ąā¸™ā¸ā¸˛ā¸Ŗā¸Ēā¸ā¸ąā¸”āš€ā¸žā¸ˇāšˆā¸­ā¸ā¸˛ā¸Ŗāš€ā¸‚āš‰ā¸˛ā¸–ā¸ļ⏇", - "9": "ā¸›āš‰ā¸­ā¸‡ā¸ā¸ąā¸™ā¸ā¸˛ā¸Ŗā¸ā¸Ŗā¸­ā¸āšā¸šā¸šā¸Ÿā¸­ā¸ŖāšŒā¸Ą", - "10": "ā¸›āš‰ā¸­ā¸‡ā¸ā¸ąā¸™ā¸ā¸˛ā¸Ŗāšā¸āš‰āš„ā¸‚", - "11": "ā¸›āš‰ā¸­ā¸‡ā¸ā¸ąā¸™ā¸ā¸˛ā¸Ŗāšā¸āš‰āš„ā¸‚ā¸„ā¸ŗā¸­ā¸˜ā¸´ā¸šā¸˛ā¸ĸā¸›ā¸Ŗā¸°ā¸ā¸­ā¸š", - "12": "ā¸›āš‰ā¸­ā¸‡ā¸ā¸ąā¸™ā¸ā¸˛ā¸Ŗā¸žā¸´ā¸Ąā¸žāšŒ", - "13": "ā¸›āš‰ā¸­ā¸‡ā¸ā¸ąā¸™ā¸ā¸˛ā¸Ŗā¸žā¸´ā¸Ąā¸žāšŒā¸Ŗā¸šā¸›āšā¸šā¸šā¸•āšˆā¸˛ā¸‡āš†", - "14": "⏪ā¸Ģā¸ąā¸Ēā¸œāšˆā¸˛ā¸™ā¸œā¸šāš‰ā¸”ā¸šāšā¸Ĩ", - "15": "ā¸ˆā¸ŗā¸ā¸ąā¸”ā¸Ēā¸´āšˆā¸‡ā¸—ā¸ĩāšˆā¸Ēā¸˛ā¸Ąā¸˛ā¸Ŗā¸–ā¸—ā¸ŗāš„ā¸”āš‰ā¸ā¸ąā¸šāš€ā¸­ā¸ā¸Ēā¸˛ā¸Ŗāš€ā¸Ąā¸ˇāšˆā¸­āš€ā¸›ā¸´ā¸” (āš„ā¸Ąāšˆā¸Ŗā¸­ā¸‡ā¸Ŗā¸ąā¸šāš‚ā¸”ā¸ĸā¸œā¸šāš‰ā¸­āšˆā¸˛ā¸™ā¸—ā¸ąāš‰ā¸‡ā¸Ģā¸Ąā¸”)", - "16": "ā¸ˆā¸ŗā¸ā¸ąā¸”ā¸ā¸˛ā¸Ŗāš€ā¸›ā¸´ā¸”āš€ā¸­ā¸ā¸Ē⏞⏪" + "extractPages": { + "title": "Extract Pages", + "pageNumbers": { + "label": "Pages to Extract", + "placeholder": "e.g., 1,3,5-8 or odd & 1-10" + }, + "settings": { + "title": "Settings" }, - "submit": "āš€ā¸‚āš‰ā¸˛ā¸Ŗā¸Ģā¸ąā¸Ē", "tooltip": { - "permissions": { - "title": "āš€ā¸›ā¸Ĩā¸ĩāšˆā¸ĸ⏙ā¸Ēā¸´ā¸—ā¸˜ā¸´āšŒ" + "description": "Extracts the selected pages into a new PDF, preserving order." + }, + "error": { + "failed": "Failed to extract pages" + }, + "results": { + "title": "Pages Extracted" + }, + "submit": "Extract Pages" + }, + "pageSelection": { + "tooltip": { + "header": { + "title": "Page Selection Guide" + }, + "basic": { + "title": "Basic Usage", + "text": "Select specific pages from your PDF document using simple syntax.", + "bullet1": "Individual pages: 1,3,5", + "bullet2": "Page ranges: 3-6 or 10-15", + "bullet3": "All pages: all" + }, + "advanced": { + "title": "Advanced Features" + }, + "tips": { + "title": "Tips", + "text": "Keep these guidelines in mind:", + "bullet1": "Page numbers start from 1 (not 0)", + "bullet2": "Spaces are automatically removed", + "bullet3": "Invalid expressions are ignored" + }, + "syntax": { + "title": "Syntax Basics", + "text": "Use numbers, ranges, keywords, and progressions (n starts at 0). Parentheses are supported.", + "bullets": { + "numbers": "Numbers/ranges: 5, 10-20", + "keywords": "Keywords: odd, even", + "progressions": "Progressions: 3n, 4n+1" + } + }, + "operators": { + "title": "Operators", + "text": "AND has higher precedence than comma. NOT applies within the document range.", + "and": "AND: & or \"and\" — require both conditions (e.g., 1-50 & even)", + "comma": "Comma: , or | — combine selections (e.g., 1-10, 20)", + "not": "NOT: ! or \"not\" — exclude pages (e.g., 3n & not 30)" + }, + "examples": { + "title": "Examples" + }, + "complex": { + "bullet1": "1,3-5,8,2n → pages 1, 3–5, 8, plus evens", + "bullet2": "10-,2n-1 → from page 10 to end + odd pages", + "description": "Mix different types.", + "title": "Complex Combinations" + }, + "description": "Choose which pages to use for the operation. Supports single pages, ranges, formulas, and the all keyword.", + "individual": { + "bullet1": "1,3,5 → selects pages 1, 3, 5", + "bullet2": "2,7,12 → selects pages 2, 7, 12", + "description": "Enter numbers separated by commas.", + "title": "Individual Pages" + }, + "mathematical": { + "bullet1": "2n → all even pages (2, 4, 6â€Ļ)", + "bullet2": "2n-1 → all odd pages (1, 3, 5â€Ļ)", + "bullet3": "3n → every 3rd page (3, 6, 9â€Ļ)", + "bullet4": "4n-1 → pages 3, 7, 11, 15â€Ļ", + "description": "Use n in formulas for patterns.", + "title": "Mathematical Functions" + }, + "ranges": { + "bullet1": "3-6 → selects pages 3–6", + "bullet2": "10-15 → selects pages 10–15", + "bullet3": "5- → selects pages 5 to end", + "description": "Use - for consecutive pages.", + "title": "Page Ranges" + }, + "special": { + "bullet1": "all → selects all pages", + "title": "Special Keywords" } } }, - "removePassword": { - "tags": "⏛ā¸Ĩā¸­ā¸”ā¸ ā¸ąā¸ĸ, ⏖⏭⏔⏪ā¸Ģā¸ąā¸Ē, ā¸„ā¸§ā¸˛ā¸Ąā¸›ā¸Ĩā¸­ā¸”ā¸ ā¸ąā¸ĸ, ā¸Ĩ⏚⏪ā¸Ģā¸ąā¸Ēā¸œāšˆā¸˛ā¸™", - "title": "ā¸Ĩ⏚⏪ā¸Ģā¸ąā¸Ēā¸œāšˆā¸˛ā¸™", - "header": "ā¸Ĩ⏚⏪ā¸Ģā¸ąā¸Ēā¸œāšˆā¸˛ā¸™ (⏖⏭⏔⏪ā¸Ģā¸ąā¸Ē)", - "selectText": { - "1": "āš€ā¸Ĩ⏎⏭⏁ PDF ⏗ā¸ĩāšˆā¸•āš‰ā¸­ā¸‡ā¸ā¸˛ā¸Ŗā¸–ā¸­ā¸”ā¸Ŗā¸Ģā¸ąā¸Ē", - "2": "⏪ā¸Ģā¸ąā¸Ēā¸œāšˆā¸˛ā¸™" + "bulkSelection": { + "syntaxError": "There is a syntax issue. See Page Selection tips for help.", + "header": { + "title": "Page Selection Guide" }, - "submit": "ā¸Ĩ⏚", - "desc": "ā¸Ĩ⏚⏪ā¸Ģā¸ąā¸Ēā¸œāšˆā¸˛ā¸™ā¸ˆā¸˛ā¸ā¸ā¸˛ā¸Ŗā¸›āš‰ā¸­ā¸‡ā¸ā¸ąā¸™āš€ā¸­ā¸ā¸Ē⏞⏪ PDF ⏂⏭⏇⏄⏏⏓", - "password": { - "stepTitle": "ā¸Ĩ⏚⏪ā¸Ģā¸ąā¸Ēā¸œāšˆā¸˛ā¸™", - "label": "⏪ā¸Ģā¸ąā¸Ēā¸œāšˆā¸˛ā¸™ā¸›ā¸ąā¸ˆā¸ˆā¸¸ā¸šā¸ąā¸™" + "syntax": { + "title": "Syntax Basics", + "text": "Use numbers, ranges, keywords, and progressions (n starts at 0). Parentheses are supported.", + "bullets": { + "numbers": "Numbers/ranges: 5, 10-20", + "keywords": "Keywords: odd, even", + "progressions": "Progressions: 3n, 4n+1" + } + }, + "operators": { + "title": "Operators", + "text": "AND has higher precedence than comma. NOT applies within the document range.", + "and": "AND: & or \"and\" — require both conditions (e.g., 1-50 & even)", + "comma": "Comma: , or | — combine selections (e.g., 1-10, 20)", + "not": "NOT: ! or \"not\" — exclude pages (e.g., 3n & not 30)" + }, + "examples": { + "title": "Examples", + "first50": "First 50", + "last50": "Last 50", + "every3rd": "Every 3rd", + "oddWithinExcluding": "Odd within 1-20 excluding 5-7", + "combineSets": "Combine sets" + }, + "firstNPages": { + "title": "First N Pages", + "placeholder": "Number of pages" + }, + "lastNPages": { + "title": "Last N Pages", + "placeholder": "Number of pages" + }, + "everyNthPage": { + "title": "Every Nth Page", + "placeholder": "Step size" + }, + "range": { + "title": "Range", + "fromPlaceholder": "From", + "toPlaceholder": "To" + }, + "keywords": { + "title": "Keywords" + }, + "advanced": { + "title": "Advanced" } }, "compressPdfs": { @@ -843,12 +1734,142 @@ "tags": "remove,delete,form,field,readonly", "title": "Remove Read-Only from Form Fields", "header": "Unlock PDF Forms", - "submit": "Remove" + "submit": "Remove", + "description": "This tool will remove read-only restrictions from PDF form fields, making them editable and fillable.", + "filenamePrefix": "unlocked_forms", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst unlocking PDF forms." + }, + "results": { + "title": "Unlocked Forms Results" + } }, "changeMetadata": { - "tags": "ā¸Šā¸ˇāšˆā¸­, ā¸œā¸šāš‰āšā¸•āšˆā¸‡, ā¸§ā¸ąā¸™ā¸—ā¸ĩāšˆ, ā¸Ēā¸Ŗāš‰ā¸˛ā¸‡, āš€ā¸§ā¸Ĩ⏞, ā¸œā¸šāš‰āš€ā¸œā¸ĸāšā¸žā¸Ŗāšˆ, ā¸œā¸šāš‰ā¸œā¸Ĩ⏴⏕, ā¸Ē⏖⏴⏕⏴", - "title": "āš€ā¸›ā¸Ĩā¸ĩāšˆā¸ĸā¸™ā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩāš€ā¸Ąā¸•ā¸˛", "header": "āš€ā¸›ā¸Ĩā¸ĩāšˆā¸ĸā¸™ā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩāš€ā¸Ąā¸•ā¸˛", + "submit": "āš€ā¸›ā¸Ĩā¸ĩāšˆā¸ĸ⏙", + "filenamePrefix": "metadata", + "settings": { + "title": "Metadata Settings" + }, + "standardFields": { + "title": "Standard Fields" + }, + "deleteAll": { + "label": "Remove Existing Metadata", + "checkbox": "Delete all metadata" + }, + "title": { + "label": "Title", + "placeholder": "Document title" + }, + "author": { + "label": "Author", + "placeholder": "Document author" + }, + "subject": { + "label": "Subject", + "placeholder": "Document subject" + }, + "keywords": { + "label": "Keywords", + "placeholder": "Document keywords" + }, + "creator": { + "label": "Creator", + "placeholder": "Document creator" + }, + "producer": { + "label": "Producer", + "placeholder": "Document producer" + }, + "dates": { + "title": "Date Fields" + }, + "creationDate": { + "label": "Creation Date", + "placeholder": "Creation date" + }, + "modificationDate": { + "label": "Modification Date", + "placeholder": "Modification date" + }, + "trapped": { + "label": "Trapped Status", + "unknown": "Unknown", + "true": "True", + "false": "False" + }, + "advanced": { + "title": "Advanced Options" + }, + "customFields": { + "title": "Custom Metadata", + "description": "Add custom metadata fields to the document", + "add": "Add Field", + "key": "Key", + "keyPlaceholder": "Custom key", + "value": "Value", + "valuePlaceholder": "Custom value", + "remove": "Remove" + }, + "results": { + "title": "Updated PDFs" + }, + "error": { + "failed": "An error occurred while changing the PDF metadata." + }, + "tooltip": { + "header": { + "title": "PDF Metadata Overview" + }, + "standardFields": { + "title": "Standard Fields", + "text": "Common PDF metadata fields that describe the document.", + "bullet1": "Title: Document name or heading", + "bullet2": "Author: Person who created the document", + "bullet3": "Subject: Brief description of content", + "bullet4": "Keywords: Search terms for the document", + "bullet5": "Creator/Producer: Software used to create the PDF" + }, + "dates": { + "title": "Date Fields", + "text": "When the document was created and modified.", + "bullet1": "Creation Date: When original document was made", + "bullet2": "Modification Date: When last changed" + }, + "options": { + "title": "Additional Options", + "text": "Custom fields and privacy controls.", + "bullet1": "Custom Metadata: Add your own key-value pairs", + "bullet2": "Trapped Status: High-quality printing setting", + "bullet3": "Delete All: Remove all metadata for privacy" + }, + "deleteAll": { + "title": "Remove Existing Metadata", + "text": "Complete metadata deletion to ensure privacy." + }, + "customFields": { + "title": "Custom Metadata", + "text": "Add your own custom key-value metadata pairs.", + "bullet1": "Add any custom fields relevant to your document", + "bullet2": "Examples: Department, Project, Version, Status", + "bullet3": "Both key and value are required for each entry" + }, + "advanced": { + "title": "Advanced Options", + "trapped": { + "title": "Trapped Status", + "description": "Indicates if document is prepared for high-quality printing.", + "bullet1": "True: Document has been trapped for printing", + "bullet2": "False: Document has not been trapped", + "bullet3": "Unknown: Trapped status is not specified" + } + } + }, + "tags": "ā¸Šā¸ˇāšˆā¸­, ā¸œā¸šāš‰āšā¸•āšˆā¸‡, ā¸§ā¸ąā¸™ā¸—ā¸ĩāšˆ, ā¸Ēā¸Ŗāš‰ā¸˛ā¸‡, āš€ā¸§ā¸Ĩ⏞, ā¸œā¸šāš‰āš€ā¸œā¸ĸāšā¸žā¸Ŗāšˆ, ā¸œā¸šāš‰ā¸œā¸Ĩ⏴⏕, ā¸Ē⏖⏴⏕⏴", "selectText": { "1": "āš‚ā¸›ā¸Ŗā¸”āšā¸āš‰āš„ā¸‚ā¸•ā¸ąā¸§āšā¸›ā¸Ŗā¸—ā¸ĩāšˆā¸„ā¸¸ā¸“ā¸•āš‰ā¸­ā¸‡ā¸ā¸˛ā¸Ŗāš€ā¸›ā¸Ĩā¸ĩāšˆā¸ĸ⏙", "2": "ā¸Ĩā¸šā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩāš€ā¸Ąā¸•ā¸˛ā¸—ā¸ąāš‰ā¸‡ā¸Ģā¸Ąā¸”", @@ -856,15 +1877,7 @@ "4": "ā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩāš€ā¸Ąā¸•ā¸˛ā¸­ā¸ˇāšˆā¸™ āš†:", "5": "āš€ā¸žā¸´āšˆā¸Ąā¸Ŗā¸˛ā¸ĸā¸ā¸˛ā¸Ŗā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩāš€ā¸Ąā¸•ā¸˛ā¸—ā¸ĩāšˆā¸ā¸ŗā¸Ģā¸™ā¸”āš€ā¸­ā¸‡" }, - "author": "ā¸œā¸šāš‰āšā¸•āšˆā¸‡:", - "creationDate": "ā¸§ā¸ąā¸™ā¸—ā¸ĩāšˆā¸Ēā¸Ŗāš‰ā¸˛ā¸‡ (yyyy/MM/dd HH:mm:ss):", - "creator": "ā¸œā¸šāš‰ā¸Ēā¸Ŗāš‰ā¸˛ā¸‡:", - "keywords": "⏄⏺ā¸Ēā¸ŗā¸„ā¸ąā¸:", - "modDate": "ā¸§ā¸ąā¸™ā¸—ā¸ĩāšˆāšā¸āš‰āš„ā¸‚ (yyyy/MM/dd HH:mm:ss):", - "producer": "ā¸œā¸šāš‰ā¸œā¸Ĩ⏴⏕:", - "subject": "ā¸Ģā¸ąā¸§ā¸‚āš‰ā¸­:", - "trapped": "ā¸•ā¸´ā¸”ā¸ā¸ąā¸š:", - "submit": "āš€ā¸›ā¸Ĩā¸ĩāšˆā¸ĸ⏙" + "modDate": "ā¸§ā¸ąā¸™ā¸—ā¸ĩāšˆāšā¸āš‰āš„ā¸‚ (yyyy/MM/dd HH:mm:ss):" }, "fileToPDF": { "tags": "ā¸ā¸˛ā¸Ŗāšā¸›ā¸Ĩ⏇, ā¸Ŗā¸šā¸›āšā¸šā¸š, āš€ā¸­ā¸ā¸Ē⏞⏪, ā¸Ŗā¸šā¸›ā¸ ā¸˛ā¸ž, ā¸Ēāš„ā¸Ĩā¸”āšŒ, ā¸‚āš‰ā¸­ā¸„ā¸§ā¸˛ā¸Ą, ā¸ā¸˛ā¸Ŗāšā¸›ā¸Ĩ⏇, ā¸Ēā¸ŗā¸™ā¸ąā¸ā¸‡ā¸˛ā¸™, āš€ā¸­ā¸ā¸Ē⏞⏪, Word, Excel, PowerPoint", @@ -878,6 +1891,7 @@ "ocr": { "tags": "ā¸ā¸˛ā¸Ŗā¸Ŗā¸šāš‰ā¸ˆā¸ŗ, ā¸‚āš‰ā¸­ā¸„ā¸§ā¸˛ā¸Ą, ā¸Ŗā¸šā¸›ā¸ ā¸˛ā¸ž, ⏁⏞⏪ā¸Ēāšā¸ā¸™, ā¸­āšˆā¸˛ā¸™, ⏪⏰⏚⏏, ā¸•ā¸Ŗā¸§ā¸ˆā¸ˆā¸ąā¸š, āšā¸āš‰āš„ā¸‚āš„ā¸”āš‰", "title": "OCR / ā¸—ā¸ŗā¸„ā¸§ā¸˛ā¸Ąā¸Ē⏰⏭⏞⏔⏁⏞⏪ā¸Ēāšā¸ā¸™", + "desc": "ā¸—ā¸ŗā¸„ā¸§ā¸˛ā¸Ąā¸Ē⏰⏭⏞⏔⏁⏞⏪ā¸Ēāšā¸ā¸™āšā¸Ĩā¸°ā¸•ā¸Ŗā¸§ā¸ˆā¸ˆā¸ąā¸šā¸‚āš‰ā¸­ā¸„ā¸§ā¸˛ā¸Ąā¸ˆā¸˛ā¸ā¸ ā¸˛ā¸žā¸ ā¸˛ā¸ĸāšƒā¸™ PDF āšā¸Ĩā¸°āš€ā¸žā¸´āšˆā¸Ąāš€ā¸›āš‡ā¸™ā¸‚āš‰ā¸­ā¸„ā¸§ā¸˛ā¸Ąā¸­ā¸ĩā¸ā¸„ā¸Ŗā¸ąāš‰ā¸‡", "header": "ā¸—ā¸ŗā¸„ā¸§ā¸˛ā¸Ąā¸Ē⏰⏭⏞⏔⏁⏞⏪ā¸Ēāšā¸ā¸™ / OCR (ā¸ā¸˛ā¸Ŗā¸Ŗā¸šāš‰ā¸ˆā¸ŗā¸­ā¸ąā¸ā¸‚ā¸Ŗā¸°ā¸”āš‰ā¸§ā¸ĸāšā¸Ē⏇)", "selectText": { "1": "āš€ā¸Ĩā¸ˇā¸­ā¸ā¸ ā¸˛ā¸Šā¸˛ā¸—ā¸ĩāšˆā¸ˆā¸°ā¸•ā¸Ŗā¸§ā¸ˆā¸ˆā¸ąā¸šāšƒā¸™ PDF (⏪⏞ā¸ĸ⏁⏞⏪⏗ā¸ĩāšˆāšā¸Ēā¸”ā¸‡ā¸„ā¸ˇā¸­ā¸ ā¸˛ā¸Šā¸˛ā¸—ā¸ĩāšˆā¸•ā¸Ŗā¸§ā¸ˆā¸ˆā¸ąā¸šāš„ā¸”āš‰āšƒā¸™ā¸‚ā¸“ā¸°ā¸™ā¸ĩāš‰):", @@ -896,23 +1910,89 @@ "help": "āš‚ā¸›ā¸Ŗā¸”ā¸­āšˆā¸˛ā¸™āš€ā¸­ā¸ā¸Ē⏞⏪⏙ā¸ĩāš‰āš€ā¸žā¸ˇāšˆā¸­āšƒā¸Šāš‰ā¸‡ā¸˛ā¸™ā¸ ā¸˛ā¸Šā¸˛ā¸­ā¸ˇāšˆā¸™āš† āšā¸Ĩ⏰/ā¸Ģā¸Ŗā¸ˇā¸­āšƒā¸Šāš‰ā¸‡ā¸˛ā¸™ā¸™ā¸­ā¸ docker", "credit": "ā¸šā¸Ŗā¸´ā¸ā¸˛ā¸Ŗā¸™ā¸ĩāš‰āšƒā¸Šāš‰ qpdf āšā¸Ĩ⏰ Tesseract ā¸Ē⏺ā¸Ģā¸Ŗā¸ąā¸š OCR", "submit": "ā¸›ā¸Ŗā¸°ā¸Ąā¸§ā¸Ĩ⏜ā¸Ĩ PDF ā¸”āš‰ā¸§ā¸ĸ OCR", - "desc": "ā¸—ā¸ŗā¸„ā¸§ā¸˛ā¸Ąā¸Ē⏰⏭⏞⏔⏁⏞⏪ā¸Ēāšā¸ā¸™āšā¸Ĩā¸°ā¸•ā¸Ŗā¸§ā¸ˆā¸ˆā¸ąā¸šā¸‚āš‰ā¸­ā¸„ā¸§ā¸˛ā¸Ąā¸ˆā¸˛ā¸ā¸ ā¸˛ā¸žā¸ ā¸˛ā¸ĸāšƒā¸™ PDF āšā¸Ĩā¸°āš€ā¸žā¸´āšˆā¸Ąāš€ā¸›āš‡ā¸™ā¸‚āš‰ā¸­ā¸„ā¸§ā¸˛ā¸Ąā¸­ā¸ĩā¸ā¸„ā¸Ŗā¸ąāš‰ā¸‡", + "operation": { + "submit": "Process OCR and Review" + }, + "results": { + "title": "OCR Results" + }, + "languagePicker": { + "additionalLanguages": "Looking for additional languages?", + "viewSetupGuide": "View setup guide →" + }, "settings": { "title": "ā¸ā¸˛ā¸Ŗā¸•ā¸ąāš‰ā¸‡ā¸„āšˆā¸˛", "ocrMode": { - "label": "āš‚ā¸Ģā¸Ąā¸” OCR" + "label": "āš‚ā¸Ģā¸Ąā¸” OCR", + "auto": "Auto (skip text layers)", + "force": "Force (re-OCR all, replace text)", + "strict": "Strict (abort if text found)" }, "languages": { - "label": "ā¸ ā¸˛ā¸Šā¸˛" + "label": "ā¸ ā¸˛ā¸Šā¸˛", + "placeholder": "Select languages" + }, + "compatibilityMode": { + "label": "Compatibility Mode" + }, + "advancedOptions": { + "label": "Processing Options", + "sidecar": "Create a text file", + "deskew": "Deskew pages", + "clean": "Clean input file", + "cleanFinal": "Clean final output" } }, "tooltip": { + "header": { + "title": "OCR Settings Overview" + }, "mode": { - "title": "āš‚ā¸Ģā¸Ąā¸” OCR" + "title": "āš‚ā¸Ģā¸Ąā¸” OCR", + "text": "Optical Character Recognition (OCR) helps you turn scanned or screenshotted pages into text you can search, copy, or highlight.", + "bullet1": "Auto skips pages that already contain text layers.", + "bullet2": "Force re-OCRs every page and replaces all the text.", + "bullet3": "Strict halts if any selectable text is found." }, "languages": { - "title": "ā¸ ā¸˛ā¸Šā¸˛" + "title": "ā¸ ā¸˛ā¸Šā¸˛", + "text": "Improve OCR accuracy by specifying the expected languages. Choose one or more languages to guide detection." + }, + "output": { + "title": "Output", + "text": "Decide how you want the text output formatted:", + "bullet1": "Searchable PDF embeds text behind the original image.", + "bullet2": "HOCR XML returns a structured machine-readable file.", + "bullet3": "Plain-text sidecar creates a separate .txt file with raw content." + }, + "advanced": { + "header": { + "title": "Advanced OCR Processing" + }, + "compatibility": { + "title": "Compatibility Mode", + "text": "Uses OCR 'sandwich PDF' mode: results in larger files, but more reliable with certain languages and older PDF software. By default we use hOCR for smaller, modern PDFs." + }, + "sidecar": { + "title": "Create Text File", + "text": "Generates a separate .txt file alongside the PDF containing all extracted text content for easy access and processing." + }, + "deskew": { + "title": "Deskew Pages", + "text": "Automatically corrects skewed or tilted pages to improve OCR accuracy. Useful for scanned documents that weren't perfectly aligned." + }, + "clean": { + "title": "Clean Input File", + "text": "Preprocesses the input by removing noise, enhancing contrast, and optimising the image for better OCR recognition before processing." + }, + "cleanFinal": { + "title": "Clean Final Output", + "text": "Post-processes the final PDF by removing OCR artefacts and optimising the text layer for better readability and smaller file size." + } } + }, + "error": { + "failed": "OCR operation failed" } }, "extractImages": { @@ -921,7 +2001,13 @@ "header": "āšā¸ĸā¸ā¸Ŗā¸šā¸›ā¸ ā¸˛ā¸ž", "selectText": "āš€ā¸Ĩā¸ˇā¸­ā¸ā¸Ŗā¸šā¸›āšā¸šā¸šā¸ ā¸˛ā¸žā¸—ā¸ĩāšˆā¸ˆā¸°āšƒā¸Šāš‰āšƒā¸™ā¸ā¸˛ā¸Ŗāšā¸›ā¸Ĩā¸‡ā¸Ŗā¸šā¸›ā¸ ā¸˛ā¸žā¸—ā¸ĩāšˆāšā¸ĸā¸āš„ā¸”āš‰", "allowDuplicates": "ā¸šā¸ąā¸™ā¸—ā¸ļ⏁ā¸Ĩ⏞ā¸ĸā¸‹āš‰ā¸ŗ", - "submit": "āšā¸ĸ⏁" + "submit": "āšā¸ĸ⏁", + "settings": { + "title": "Settings" + }, + "error": { + "failed": "An error occurred while extracting images from the PDF." + } }, "pdfToPDFA": { "tags": "ā¸ā¸˛ā¸Ŗā¸ˆā¸ąā¸”āš€ā¸āš‡ā¸š, ⏪⏰ā¸ĸ⏰ā¸ĸ⏞⏧, ā¸Ąā¸˛ā¸•ā¸Ŗā¸ā¸˛ā¸™, ā¸ā¸˛ā¸Ŗāšā¸›ā¸Ĩ⏇, ā¸ā¸˛ā¸Ŗāš€ā¸āš‡ā¸šā¸Ŗā¸ąā¸ā¸Šā¸˛", @@ -993,17 +2079,53 @@ }, "info": "Python āš„ā¸Ąāšˆā¸Ąā¸ĩā¸ā¸˛ā¸Ŗā¸•ā¸´ā¸”ā¸•ā¸ąāš‰ā¸‡ ā¸ā¸Ŗā¸¸ā¸“ā¸˛ā¸•ā¸´ā¸”ā¸•ā¸ąāš‰ā¸‡āš€ā¸žā¸ˇāšˆā¸­āšƒā¸Šāš‰ā¸‡ā¸˛ā¸™" }, + "scannerImageSplit": { + "title": "Extracted Images", + "submit": "Extract Image Scans", + "error": { + "failed": "An error occurred while extracting image scans." + }, + "tooltip": { + "title": "Photo Splitter", + "whatThisDoes": "What this does", + "whatThisDoesDesc": "Automatically finds and extracts each photo from a scanned page or composite image—no manual cropping.", + "whenToUse": "When to use", + "useCase1": "Scan whole album pages in one go", + "useCase2": "Split flatbed batches into separate files", + "useCase3": "Break collages into individual photos", + "useCase4": "Pull photos from documents", + "quickFixes": "Quick fixes", + "problem1": "Photos not detected → increase Tolerance to 30-50", + "problem2": "Too many false detections → increase Minimum Area to 15,000-20,000", + "problem3": "Crops are too tight → increase Border Size to 5-10", + "problem4": "Tilted photos not straightened → lower Angle Threshold to ~5°", + "problem5": "Dust/noise boxes → increase Minimum Contour Area to 1000-2000", + "setupTips": "Setup tips", + "tip1": "Use a plain, light background", + "tip2": "Leave a small gap (≈1 cm) between photos", + "tip3": "Scan at 300-600 DPI", + "tip4": "Clean the scanner glass", + "headsUp": "Heads-up", + "headsUpDesc": "Overlapping photos or backgrounds very close in colour to the photos can reduce accuracy-try a lighter or darker background and leave more space." + } + }, "sign": { - "tags": "ā¸­ā¸™ā¸¸ā¸ā¸˛ā¸•, ā¸­ā¸ąā¸ā¸Šā¸Ŗā¸ĸāšˆā¸­, ā¸Ĩ⏞ā¸ĸāš€ā¸‹āš‡ā¸™ā¸—ā¸ĩāšˆā¸§ā¸˛ā¸”, ā¸Ĩ⏞ā¸ĸāš€ā¸‹āš‡ā¸™ā¸‚āš‰ā¸­ā¸„ā¸§ā¸˛ā¸Ą, ā¸Ĩ⏞ā¸ĸāš€ā¸‹āš‡ā¸™ā¸Ŗā¸šā¸›ā¸ ā¸˛ā¸ž", "title": "āš€ā¸‹āš‡ā¸™ā¸Šā¸ˇāšˆā¸­", "header": "āš€ā¸‹āš‡ā¸™ā¸Šā¸ˇāšˆā¸­ PDF", "upload": "ā¸­ā¸ąā¸›āš‚ā¸Ģā¸Ĩā¸”ā¸Ŗā¸šā¸›ā¸ ā¸˛ā¸ž", - "draw": "⏧⏞⏔ā¸Ĩ⏞ā¸ĸāš€ā¸‹āš‡ā¸™", - "text": "ā¸›āš‰ā¸­ā¸™ā¸‚āš‰ā¸­ā¸„ā¸§ā¸˛ā¸Ą", + "draw": { + "title": "Draw your signature", + "clear": "Clear" + }, + "text": { + "name": "Signer Name", + "placeholder": "Enter your full name" + }, "clear": "ā¸Ĩāš‰ā¸˛ā¸‡", "add": "āš€ā¸žā¸´āšˆā¸Ą", "saved": "ā¸Ĩ⏞ā¸ĸāš€ā¸‹āš‡ā¸™ā¸—ā¸ĩāšˆā¸šā¸ąā¸™ā¸—ā¸ļā¸āš„ā¸§āš‰", "save": "ā¸šā¸ąā¸™ā¸—ā¸ļ⏁ā¸Ĩ⏞ā¸ĸāš€ā¸‹āš‡ā¸™", + "applySignatures": "Apply Signatures", "personalSigs": "ā¸Ĩ⏞ā¸ĸāš€ā¸‹āš‡ā¸™ā¸Ēāšˆā¸§ā¸™ā¸•ā¸ąā¸§", "sharedSigs": "ā¸Ĩ⏞ā¸ĸāš€ā¸‹āš‡ā¸™ā¸Ŗāšˆā¸§ā¸Ą", "noSavedSigs": "āš„ā¸Ąāšˆā¸žā¸šā¸Ĩ⏞ā¸ĸāš€ā¸‹āš‡ā¸™ā¸—ā¸ĩāšˆā¸šā¸ąā¸™ā¸—ā¸ļā¸āš„ā¸§āš‰", @@ -1015,42 +2137,179 @@ "previous": "Previous page", "maintainRatio": "Toggle maintain aspect ratio", "undo": "Undo", - "redo": "Redo" + "redo": "Redo", + "submit": "Sign Document", + "steps": { + "configure": "Configure Signature" + }, + "type": { + "title": "Signature Type", + "draw": "Draw", + "canvas": "Canvas", + "image": "Image", + "text": "Text" + }, + "image": { + "label": "Upload signature image", + "placeholder": "Select image file", + "hint": "Upload a PNG or JPG image of your signature" + }, + "instructions": { + "title": "How to add signature", + "canvas": "After drawing your signature in the canvas, close the modal then click anywhere on the PDF to place it.", + "image": "After uploading your signature image above, click anywhere on the PDF to place it.", + "text": "After entering your name above, click anywhere on the PDF to place your signature." + }, + "mode": { + "move": "Move Signature", + "place": "Place Signature" + }, + "updateAndPlace": "Update and Place", + "activate": "Activate Signature Placement", + "deactivate": "Stop Placing Signatures", + "results": { + "title": "Signature Results" + }, + "error": { + "failed": "An error occurred while signing the PDF." + }, + "tags": "ā¸­ā¸™ā¸¸ā¸ā¸˛ā¸•, ā¸­ā¸ąā¸ā¸Šā¸Ŗā¸ĸāšˆā¸­, ā¸Ĩ⏞ā¸ĸāš€ā¸‹āš‡ā¸™ā¸—ā¸ĩāšˆā¸§ā¸˛ā¸”, ā¸Ĩ⏞ā¸ĸāš€ā¸‹āš‡ā¸™ā¸‚āš‰ā¸­ā¸„ā¸§ā¸˛ā¸Ą, ā¸Ĩ⏞ā¸ĸāš€ā¸‹āš‡ā¸™ā¸Ŗā¸šā¸›ā¸ ā¸˛ā¸ž" }, "flatten": { - "tags": "ā¸Ē⏖⏴⏕, ā¸›ā¸´ā¸”ā¸ā¸˛ā¸Ŗāšƒā¸Šāš‰ā¸‡ā¸˛ā¸™, āš„ā¸Ąāšˆāš‚ā¸•āš‰ā¸•ā¸­ā¸š, ā¸Ĩā¸”ā¸ˆā¸ŗā¸™ā¸§ā¸™", "title": "āšā¸šā¸™", "header": "āšā¸šā¸™ PDF", "flattenOnlyForms": "āšā¸šā¸™āš€ā¸‰ā¸žā¸˛ā¸°ā¸Ÿā¸­ā¸ŖāšŒā¸Ą", "submit": "āšā¸šā¸™", + "filenamePrefix": "flattened", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, "steps": { "settings": "ā¸ā¸˛ā¸Ŗā¸•ā¸ąāš‰ā¸‡ā¸„āšˆā¸˛" }, "options": { - "flattenOnlyForms": "āšā¸šā¸™āš€ā¸‰ā¸žā¸˛ā¸°ā¸Ÿā¸­ā¸ŖāšŒā¸Ą" - } + "stepTitle": "Flatten Options", + "title": "Flatten Options", + "flattenOnlyForms": { + "label": "āšā¸šā¸™āš€ā¸‰ā¸žā¸˛ā¸°ā¸Ÿā¸­ā¸ŖāšŒā¸Ą", + "desc": "Only flatten form fields, leaving other interactive elements intact" + }, + "note": "Flattening removes interactive elements from the PDF, making them non-editable." + }, + "results": { + "title": "Flatten Results" + }, + "error": { + "failed": "An error occurred while flattening the PDF." + }, + "tooltip": { + "header": { + "title": "About Flattening PDFs" + }, + "description": { + "title": "What does flattening do?", + "text": "Flattening makes your PDF non-editable by turning fillable forms and buttons into regular text and images. The PDF will look exactly the same, but no one can change or fill in the forms anymore. Perfect for sharing completed forms, creating final documents for records, or ensuring the PDF looks the same everywhere.", + "bullet1": "Text boxes become regular text (can't be edited)", + "bullet2": "Checkboxes and buttons become pictures", + "bullet3": "Great for final versions you don't want changed", + "bullet4": "Ensures consistent appearance across all devices" + }, + "formsOnly": { + "title": "What does 'Flatten only forms' mean?", + "text": "This option only removes the ability to fill in forms, but keeps other features working like clicking links, viewing bookmarks, and reading comments.", + "bullet1": "Forms become non-editable", + "bullet2": "Links still work when clicked", + "bullet3": "Comments and notes remain visible", + "bullet4": "Bookmarks still help you navigate" + } + }, + "tags": "ā¸Ē⏖⏴⏕, ā¸›ā¸´ā¸”ā¸ā¸˛ā¸Ŗāšƒā¸Šāš‰ā¸‡ā¸˛ā¸™, āš„ā¸Ąāšˆāš‚ā¸•āš‰ā¸•ā¸­ā¸š, ā¸Ĩā¸”ā¸ˆā¸ŗā¸™ā¸§ā¸™" }, "repair": { "tags": "ā¸‹āšˆā¸­ā¸Ąāšā¸‹ā¸Ą, ā¸ā¸šāš‰ā¸„ā¸ˇā¸™, ā¸ā¸šāš‰", "title": "ā¸‹āšˆā¸­ā¸Ąāšā¸‹ā¸Ą", "header": "ā¸‹āšˆā¸­ā¸Ąāšā¸‹ā¸Ą PDF", - "submit": "ā¸‹āšˆā¸­ā¸Ąāšā¸‹ā¸Ą" + "submit": "ā¸‹āšˆā¸­ā¸Ąāšā¸‹ā¸Ą", + "description": "This tool will attempt to repair corrupted or damaged PDF files. No additional settings are required.", + "filenamePrefix": "repaired", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst repairing the PDF." + }, + "results": { + "title": "Repair Results" + } }, "removeBlanks": { - "tags": "ā¸—ā¸ŗā¸„ā¸§ā¸˛ā¸Ąā¸Ē⏰⏭⏞⏔, ā¸Ĩā¸”ā¸ˆā¸ŗā¸™ā¸§ā¸™, āš„ā¸Ąāšˆā¸Ąā¸ĩāš€ā¸™ā¸ˇāš‰ā¸­ā¸Ģ⏞, ā¸ˆā¸ąā¸”ā¸Ŗā¸°āš€ā¸šā¸ĩā¸ĸ⏚", "title": "ā¸Ĩ⏚ā¸Ģā¸™āš‰ā¸˛ā¸§āšˆā¸˛ā¸‡", "header": "ā¸Ĩ⏚ā¸Ģā¸™āš‰ā¸˛ā¸§āšˆā¸˛ā¸‡", - "threshold": "āš€ā¸ā¸“ā¸‘āšŒā¸„ā¸§ā¸˛ā¸Ąā¸‚ā¸˛ā¸§ā¸‚ā¸­ā¸‡ā¸žā¸´ā¸āš€ā¸‹ā¸Ĩ:", + "settings": { + "title": "Settings" + }, + "threshold": { + "label": "Pixel Whiteness Threshold" + }, + "whitePercent": { + "label": "White Percentage Threshold", + "unit": "%" + }, + "includeBlankPages": { + "label": "Include detected blank pages" + }, + "tooltip": { + "header": { + "title": "Remove Blank Pages Settings" + }, + "threshold": { + "title": "Pixel Whiteness Threshold", + "text": "Controls how white a pixel must be to be considered 'white'. This helps determine what counts as a blank area on the page.", + "bullet1": "0 = Pure black (most restrictive)", + "bullet2": "128 = Medium grey", + "bullet3": "255 = Pure white (least restrictive)" + }, + "whitePercent": { + "title": "White Percentage Threshold", + "text": "Sets the minimum percentage of white pixels required for a page to be considered blank and removed.", + "bullet1": "Lower values (e.g., 80%) = More pages removed", + "bullet2": "Higher values (e.g., 95%) = Only very blank pages removed", + "bullet3": "Use higher values for documents with light backgrounds" + }, + "includeBlankPages": { + "title": "Include Detected Blank Pages", + "text": "When enabled, creates a separate PDF containing all the blank pages that were detected and removed from the original document.", + "bullet1": "Useful for reviewing what was removed", + "bullet2": "Helps verify the detection accuracy", + "bullet3": "Can be disabled to reduce output file size" + } + }, + "submit": "ā¸Ĩ⏚ā¸Ģā¸™āš‰ā¸˛ā¸§āšˆā¸˛ā¸‡", + "error": { + "failed": "Failed to remove blank pages" + }, + "results": { + "title": "Removed Blank Pages" + }, + "tags": "ā¸—ā¸ŗā¸„ā¸§ā¸˛ā¸Ąā¸Ē⏰⏭⏞⏔, ā¸Ĩā¸”ā¸ˆā¸ŗā¸™ā¸§ā¸™, āš„ā¸Ąāšˆā¸Ąā¸ĩāš€ā¸™ā¸ˇāš‰ā¸­ā¸Ģ⏞, ā¸ˆā¸ąā¸”ā¸Ŗā¸°āš€ā¸šā¸ĩā¸ĸ⏚", "thresholdDesc": "āš€ā¸ā¸“ā¸‘āšŒāšƒā¸™ā¸ā¸˛ā¸Ŗā¸ā¸ŗā¸Ģā¸™ā¸”ā¸§āšˆā¸˛ā¸žā¸´ā¸āš€ā¸‹ā¸Ĩā¸‚ā¸˛ā¸§āš€ā¸žā¸ĩā¸ĸā¸‡ā¸žā¸­ā¸ˆā¸°ā¸–ā¸šā¸ā¸ˆā¸ąā¸”āš€ā¸›āš‡ā¸™ '⏂⏞⏧' āš€ā¸—āšˆā¸˛āšƒā¸” 0 = ⏔⏺, 255 = ā¸‚ā¸˛ā¸§ā¸šā¸Ŗā¸´ā¸Ēā¸¸ā¸—ā¸˜ā¸´āšŒ", - "whitePercent": "āš€ā¸›ā¸­ā¸ŖāšŒāš€ā¸‹āš‡ā¸™ā¸•āšŒā¸„ā¸§ā¸˛ā¸Ąā¸‚ā¸˛ā¸§ (%):", - "whitePercentDesc": "āš€ā¸›ā¸­ā¸ŖāšŒāš€ā¸‹āš‡ā¸™ā¸•āšŒā¸‚ā¸­ā¸‡ā¸Ģā¸™āš‰ā¸˛ā¸—ā¸ĩāšˆā¸•āš‰ā¸­ā¸‡āš€ā¸›āš‡ā¸™ā¸žā¸´ā¸āš€ā¸‹ā¸Ĩ '⏂⏞⏧' āš€ā¸žā¸ˇāšˆā¸­ā¸ˆā¸°ā¸–ā¸šā¸ā¸Ĩ⏚", - "submit": "ā¸Ĩ⏚ā¸Ģā¸™āš‰ā¸˛ā¸§āšˆā¸˛ā¸‡" + "whitePercentDesc": "āš€ā¸›ā¸­ā¸ŖāšŒāš€ā¸‹āš‡ā¸™ā¸•āšŒā¸‚ā¸­ā¸‡ā¸Ģā¸™āš‰ā¸˛ā¸—ā¸ĩāšˆā¸•āš‰ā¸­ā¸‡āš€ā¸›āš‡ā¸™ā¸žā¸´ā¸āš€ā¸‹ā¸Ĩ '⏂⏞⏧' āš€ā¸žā¸ˇāšˆā¸­ā¸ˆā¸°ā¸–ā¸šā¸ā¸Ĩ⏚" }, "removeAnnotations": { "tags": "ā¸„ā¸§ā¸˛ā¸Ąā¸„ā¸´ā¸”āš€ā¸Ģāš‡ā¸™, āš€ā¸™āš‰ā¸™ā¸‚āš‰ā¸­ā¸„ā¸§ā¸˛ā¸Ą, āš‚ā¸™āš‰ā¸•, ā¸Ąā¸˛ā¸ŖāšŒā¸„ā¸­ā¸ąā¸ž, ā¸Ĩ⏚", "title": "ā¸Ĩā¸šā¸„ā¸ŗā¸­ā¸˜ā¸´ā¸šā¸˛ā¸ĸā¸›ā¸Ŗā¸°ā¸ā¸­ā¸š", "header": "ā¸Ĩā¸šā¸„ā¸ŗā¸­ā¸˜ā¸´ā¸šā¸˛ā¸ĸā¸›ā¸Ŗā¸°ā¸ā¸­ā¸š", - "submit": "ā¸Ĩ⏚" + "submit": "ā¸Ĩ⏚", + "settings": { + "title": "Settings" + }, + "info": { + "title": "About Remove Annotations", + "description": "This tool will remove all annotations (comments, highlights, notes, etc.) from your PDF documents." + }, + "error": { + "failed": "An error occurred while removing annotations from the PDF." + } }, "compare": { "tags": "āšā¸ĸā¸āšā¸ĸ⏰, āš€ā¸›ā¸Ŗā¸ĩā¸ĸā¸šāš€ā¸—ā¸ĩā¸ĸ⏚, ā¸ā¸˛ā¸Ŗāš€ā¸›ā¸Ĩā¸ĩāšˆā¸ĸā¸™āšā¸›ā¸Ĩ⏇, ā¸ā¸˛ā¸Ŗā¸§ā¸´āš€ā¸„ā¸Ŗā¸˛ā¸°ā¸ĢāšŒ", @@ -1082,6 +2341,142 @@ "certSign": { "tags": "ā¸ĸ⏎⏙ā¸ĸā¸ąā¸™, PEM, P12, āš€ā¸›āš‡ā¸™ā¸—ā¸˛ā¸‡ā¸ā¸˛ā¸Ŗ, āš€ā¸‚āš‰ā¸˛ā¸Ŗā¸Ģā¸ąā¸Ē", "title": "ā¸ā¸˛ā¸Ŗāš€ā¸‹āš‡ā¸™ā¸Šā¸ˇāšˆā¸­ā¸”āš‰ā¸§ā¸ĸāšƒā¸šā¸Ŗā¸ąā¸šā¸Ŗā¸­ā¸‡", + "filenamePrefix": "signed", + "signMode": { + "stepTitle": "Sign Mode", + "tooltip": { + "header": { + "title": "About PDF Signatures" + }, + "overview": { + "title": "How signatures work", + "text": "Both modes seal the document (any edits are flagged as tampering) and record who/when/how for auditing. Viewer trust depends on the certificate chain." + }, + "manual": { + "title": "Manual - Bring your certificate", + "text": "Use your own certificate files for brand-aligned identity. Can display Trusted when your CA/chain is recognised.", + "use": "Use for: customer-facing, legal, compliance." + }, + "auto": { + "title": "Auto - Zero-setup, instant system seal", + "text": "Signs with a server self-signed certificate. Same tamper-evident seal and audit trail; typically shows Unverified in viewers.", + "use": "Use when: you need speed and consistent internal identity across reviews and records." + }, + "rule": { + "title": "Rule of thumb", + "text": "Need recipient Trusted status? Manual. Need a fast, tamper-evident seal and audit trail with no setup? Auto." + } + } + }, + "certTypeStep": { + "stepTitle": "Certificate Format" + }, + "certFiles": { + "stepTitle": "Certificate Files" + }, + "appearance": { + "stepTitle": "Signature Appearance", + "tooltip": { + "header": { + "title": "About Signature Appearance" + }, + "invisible": { + "title": "Invisible Signatures", + "text": "The signature is added to the PDF for security but won't be visible when viewing the document. Perfect for legal requirements without changing the document's appearance.", + "bullet1": "Provides security without visual changes", + "bullet2": "Meets legal requirements for digital signing", + "bullet3": "Doesn't affect document layout or design" + }, + "visible": { + "title": "Visible Signatures", + "text": "Shows a signature block on the PDF with your name, date, and optional details. Useful when you want readers to clearly see the document is signed.", + "bullet1": "Shows signer name and date on the document", + "bullet2": "Can include reason and location for signing", + "bullet3": "Choose which page to place the signature", + "bullet4": "Optional logo can be included" + } + }, + "invisible": "Invisible", + "options": { + "title": "Signature Details" + }, + "visible": "Visible" + }, + "sign": { + "submit": "Sign PDF", + "results": "Signed PDF" + }, + "error": { + "failed": "An error occurred whilst processing signatures." + }, + "tooltip": { + "header": { + "title": "About Managing Signatures" + }, + "overview": { + "title": "What can this tool do?", + "text": "This tool lets you check if your PDFs are digitally signed and add new digital signatures. Digital signatures prove who created or approved a document and show if it has been changed since signing.", + "bullet1": "Check existing signatures and their validity", + "bullet2": "View detailed information about signers and certificates", + "bullet3": "Add new digital signatures to secure your documents", + "bullet4": "Multiple files supported with easy navigation" + }, + "validation": { + "title": "Checking Signatures", + "text": "When you check signatures, the tool tells you if they're valid, who signed the document, when it was signed, and whether the document has been changed since signing.", + "bullet1": "Shows if signatures are valid or invalid", + "bullet2": "Displays signer information and signing date", + "bullet3": "Checks if the document was modified after signing", + "bullet4": "Can use custom certificates for verification" + }, + "signing": { + "title": "Adding Signatures", + "text": "To sign a PDF, you need a digital certificate (like PEM, PKCS12, or JKS). You can choose to make the signature visible on the document or keep it invisible for security only.", + "bullet1": "Supports PEM, PKCS12, JKS, and server certificate formats", + "bullet2": "Option to show or hide signature on the PDF", + "bullet3": "Add reason, location, and signer name", + "bullet4": "Choose which page to place visible signatures", + "bullet5": "Use server certificate for simple 'Sign with Stirling-PDF' option" + } + }, + "certType": { + "tooltip": { + "header": { + "title": "About Certificate Types" + }, + "what": { + "title": "What's a certificate?", + "text": "It's a secure ID for your signature that proves you signed. Unless you're required to sign via certificate, we recommend using another secure method like Type, Draw, or Upload." + }, + "which": { + "title": "Which option should I use?", + "text": "Choose the format that matches your certificate file:", + "bullet1": "PKCS#12 (.p12 / .pfx) – one combined file (most common)", + "bullet2": "PFX (.pfx) – Microsoft's version of PKCS12", + "bullet3": "PEM – separate private-key and certificate .pem files", + "bullet4": "JKS – Java .jks keystore for dev / CI-CD workflows" + }, + "convert": { + "title": "Key not listed?", + "text": "Convert your file to a Java keystore (.jks) with keytool, then pick JKS." + } + } + }, + "chooseCertificate": "Choose Certificate File", + "chooseJksFile": "Choose JKS File", + "chooseP12File": "Choose PKCS12 File", + "choosePfxFile": "Choose PFX File", + "choosePrivateKey": "Choose Private Key File", + "location": "ā¸•ā¸ŗāšā¸Ģā¸™āšˆā¸‡", + "logoTitle": "Logo", + "name": "ā¸Šā¸ˇāšˆā¸­", + "noLogo": "No Logo", + "pageNumber": "Page Number", + "password": "āšƒā¸Ēāšˆā¸Ŗā¸Ģā¸ąā¸Ēā¸œāšˆā¸˛ā¸™ Keystore ā¸Ģ⏪⏎⏭⏄ā¸ĩā¸ĸāšŒā¸Ēāšˆā¸§ā¸™ā¸•ā¸ąā¸§ā¸‚ā¸­ā¸‡ā¸„ā¸¸ā¸“ (ā¸–āš‰ā¸˛ā¸Ąā¸ĩ):", + "passwordOptional": "Leave empty if no password", + "reason": "āš€ā¸Ģā¸•ā¸¸ā¸œā¸Ĩ", + "serverCertMessage": "Using server certificate - no files or password required", + "showLogo": "āšā¸Ēā¸”ā¸‡āš‚ā¸Ĩāš‚ā¸āš‰", "header": "āš€ā¸‹āš‡ā¸™ā¸Šā¸ˇāšˆā¸­ PDF ā¸”āš‰ā¸§ā¸ĸāšƒā¸šā¸Ŗā¸ąā¸šā¸Ŗā¸­ā¸‡ā¸‚ā¸­ā¸‡ā¸„ā¸¸ā¸“ (⏁⏺ā¸Ĩā¸ąā¸‡ā¸”ā¸ŗāš€ā¸™ā¸´ā¸™ā¸ā¸˛ā¸Ŗ)", "selectPDF": "āš€ā¸Ĩā¸ˇā¸­ā¸āš„ā¸Ÿā¸ĨāšŒ PDF ā¸Ē⏺ā¸Ģā¸Ŗā¸ąā¸šā¸ā¸˛ā¸Ŗāš€ā¸‹āš‡ā¸™:", "jksNote": "ā¸Ģā¸Ąā¸˛ā¸ĸāš€ā¸Ģ⏕⏏: ā¸Ģā¸˛ā¸ā¸›ā¸Ŗā¸°āš€ā¸ ā¸—āšƒā¸šā¸Ŗā¸ąā¸šā¸Ŗā¸­ā¸‡ā¸‚ā¸­ā¸‡ā¸„ā¸¸ā¸“āš„ā¸Ąāšˆā¸­ā¸ĸā¸šāšˆāšƒā¸™ā¸Ŗā¸˛ā¸ĸā¸ā¸˛ā¸Ŗā¸”āš‰ā¸˛ā¸™ā¸Ĩāšˆā¸˛ā¸‡ ā¸ā¸Ŗā¸¸ā¸“ā¸˛āšā¸›ā¸Ĩā¸‡āš€ā¸›āš‡ā¸™āš„ā¸Ÿā¸ĨāšŒ Java Keystore (.jks) āš‚ā¸”ā¸ĸāšƒā¸Šāš‰āš€ā¸„ā¸Ŗā¸ˇāšˆā¸­ā¸‡ā¸Ąā¸ˇā¸­ keytool ā¸ˆā¸˛ā¸ā¸šā¸Ŗā¸Ŗā¸—ā¸ąā¸”ā¸„ā¸ŗā¸Ēā¸ąāšˆā¸‡ ā¸ˆā¸˛ā¸ā¸™ā¸ąāš‰ā¸™āš€ā¸Ĩā¸ˇā¸­ā¸ā¸•ā¸ąā¸§āš€ā¸Ĩā¸ˇā¸­ā¸āš„ā¸Ÿā¸ĨāšŒ .jks ā¸”āš‰ā¸˛ā¸™ā¸Ĩāšˆā¸˛ā¸‡", @@ -1089,13 +2484,7 @@ "selectCert": "āš€ā¸Ĩā¸ˇā¸­ā¸āš„ā¸Ÿā¸ĨāšŒāšƒā¸šā¸Ŗā¸ąā¸šā¸Ŗā¸­ā¸‡ā¸‚ā¸­ā¸‡ā¸„ā¸¸ā¸“ (ā¸Ŗā¸šā¸›āšā¸šā¸š X.509, ā¸­ā¸˛ā¸ˆāš€ā¸›āš‡ā¸™ .pem ā¸Ģ⏪⏎⏭ .der):", "selectP12": "āš€ā¸Ĩā¸ˇā¸­ā¸āš„ā¸Ÿā¸ĨāšŒ PKCS#12 Keystore ⏂⏭⏇⏄⏏⏓ (.p12 ā¸Ģ⏪⏎⏭ .pfx) (āš„ā¸Ąāšˆā¸šā¸ąā¸‡ā¸„ā¸ąā¸š ā¸Ģā¸˛ā¸ā¸Ąā¸ĩ ā¸„ā¸§ā¸Ŗā¸Ąā¸ĩ⏄ā¸ĩā¸ĸāšŒā¸Ēāšˆā¸§ā¸™ā¸•ā¸ąā¸§āšā¸Ĩā¸°āšƒā¸šā¸Ŗā¸ąā¸šā¸Ŗā¸­ā¸‡ā¸‚ā¸­ā¸‡ā¸„ā¸¸ā¸“):", "selectJKS": "āš€ā¸Ĩā¸ˇā¸­ā¸āš„ā¸Ÿā¸ĨāšŒ Java Keystore ⏂⏭⏇⏄⏏⏓ (.jks ā¸Ģ⏪⏎⏭ .keystore):", - "certType": "ā¸›ā¸Ŗā¸°āš€ā¸ ā¸—āšƒā¸šā¸Ŗā¸ąā¸šā¸Ŗā¸­ā¸‡", - "password": "āšƒā¸Ēāšˆā¸Ŗā¸Ģā¸ąā¸Ēā¸œāšˆā¸˛ā¸™ Keystore ā¸Ģ⏪⏎⏭⏄ā¸ĩā¸ĸāšŒā¸Ēāšˆā¸§ā¸™ā¸•ā¸ąā¸§ā¸‚ā¸­ā¸‡ā¸„ā¸¸ā¸“ (ā¸–āš‰ā¸˛ā¸Ąā¸ĩ):", "showSig": "āšā¸Ē⏔⏇ā¸Ĩ⏞ā¸ĸāš€ā¸‹āš‡ā¸™", - "reason": "āš€ā¸Ģā¸•ā¸¸ā¸œā¸Ĩ", - "location": "ā¸•ā¸ŗāšā¸Ģā¸™āšˆā¸‡", - "name": "ā¸Šā¸ˇāšˆā¸­", - "showLogo": "āšā¸Ēā¸”ā¸‡āš‚ā¸Ĩāš‚ā¸āš‰", "submit": "āš€ā¸‹āš‡ā¸™ā¸Šā¸ˇāšˆā¸­ PDF" }, "removeCertSign": { @@ -1103,7 +2492,18 @@ "title": "ā¸Ĩ⏚ā¸Ĩ⏞ā¸ĸāš€ā¸‹āš‡ā¸™āšƒā¸šā¸Ŗā¸ąā¸šā¸Ŗā¸­ā¸‡", "header": "ā¸Ĩ⏚ā¸Ĩ⏞ā¸ĸāš€ā¸‹āš‡ā¸™ā¸”ā¸´ā¸ˆā¸´ā¸—ā¸ąā¸Ĩ⏈⏞⏁ PDF", "selectPDF": "āš€ā¸Ĩā¸ˇā¸­ā¸āš„ā¸Ÿā¸ĨāšŒ PDF:", - "submit": "ā¸Ĩ⏚ā¸Ĩ⏞ā¸ĸāš€ā¸‹āš‡ā¸™" + "submit": "ā¸Ĩ⏚ā¸Ĩ⏞ā¸ĸāš€ā¸‹āš‡ā¸™", + "description": "This tool will remove digital certificate signatures from your PDF document.", + "filenamePrefix": "unsigned", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst removing certificate signatures." + }, + "results": { + "title": "Certificate Removal Results" + } }, "pageLayout": { "tags": "ā¸Ŗā¸§ā¸Ą, ā¸›ā¸Ŗā¸°ā¸ā¸­ā¸š, ā¸Ąā¸¸ā¸Ąā¸Ąā¸­ā¸‡āš€ā¸”ā¸ĩā¸ĸ⏧, ā¸ˆā¸ąā¸”ā¸Ŗā¸°āš€ā¸šā¸ĩā¸ĸ⏚", @@ -1111,16 +2511,157 @@ "header": "āš€ā¸Ĩā¸ĸāšŒāš€ā¸­ā¸˛ā¸•āšŒā¸Ģā¸Ĩ⏞ā¸ĸā¸Ģā¸™āš‰ā¸˛", "pagesPerSheet": "ā¸ˆā¸ŗā¸™ā¸§ā¸™ā¸Ģā¸™āš‰ā¸˛ā¸•āšˆā¸­āšā¸œāšˆā¸™:", "addBorder": "āš€ā¸žā¸´āšˆā¸Ąā¸‚ā¸­ā¸š", - "submit": "ā¸Ēāšˆā¸‡" + "submit": "ā¸Ēāšˆā¸‡", + "desc": { + "2": "Place 2 pages side-by-side on a single sheet.", + "3": "Place 3 pages on a single sheet in a single row.", + "4": "Place 4 pages on a single sheet (2 × 2 grid).", + "9": "Place 9 pages on a single sheet (3 × 3 grid).", + "16": "Place 16 pages on a single sheet (4 × 4 grid)." + }, + "error": { + "failed": "An error occurred while creating the multi-page layout." + } + }, + "bookletImposition": { + "tags": "booklet,imposition,printing,binding,folding,signature", + "title": "Booklet Imposition", + "header": "Booklet Imposition", + "submit": "Create Booklet", + "spineLocation": { + "label": "Spine Location", + "left": "Left (Standard)", + "right": "Right (RTL)" + }, + "doubleSided": { + "label": "Double-sided printing", + "tooltip": "Creates both front and back sides for proper booklet printing" + }, + "manualDuplex": { + "title": "Manual Duplex Mode", + "instructions": "For printers without automatic duplex. You'll need to run this twice:" + }, + "duplexPass": { + "label": "Print Pass", + "first": "1st Pass", + "second": "2nd Pass", + "firstInstructions": "Prints front sides → stack face-down → run again with 2nd Pass", + "secondInstructions": "Load printed stack face-down → prints back sides" + }, + "rtlBinding": { + "label": "Right-to-left binding", + "tooltip": "For Arabic, Hebrew, or other right-to-left languages" + }, + "addBorder": { + "label": "Add borders around pages", + "tooltip": "Adds borders around each page section to help with cutting and alignment" + }, + "addGutter": { + "label": "Add gutter margin", + "tooltip": "Adds inner margin space for binding" + }, + "gutterSize": { + "label": "Gutter size (points)" + }, + "flipOnShortEdge": { + "label": "Flip on short edge (automatic duplex only)", + "tooltip": "Enable for short-edge duplex printing (automatic duplex only - ignored in manual mode)", + "manualNote": "Not needed in manual mode - you flip the stack yourself" + }, + "advanced": { + "toggle": "Advanced Options" + }, + "paperSizeNote": "Paper size is automatically derived from your first page.", + "tooltip": { + "header": { + "title": "Booklet Creation Guide" + }, + "description": { + "title": "What is Booklet Imposition?", + "text": "Creates professional booklets by arranging pages in the correct printing order. Your PDF pages are placed 2-up on landscape sheets so when folded and bound, they read in proper sequence like a real book." + }, + "example": { + "title": "Example: 8-Page Booklet", + "text": "Your 8-page document becomes 2 sheets:", + "bullet1": "Sheet 1 Front: Pages 8, 1 | Back: Pages 2, 7", + "bullet2": "Sheet 2 Front: Pages 6, 3 | Back: Pages 4, 5", + "bullet3": "When folded & stacked: Reads 1→2→3→4→5→6→7→8" + }, + "printing": { + "title": "How to Print & Assemble", + "text": "Follow these steps for perfect booklets:", + "bullet1": "Print double-sided with 'Flip on long edge'", + "bullet2": "Stack sheets in order, fold in half", + "bullet3": "Staple or bind along the folded spine", + "bullet4": "For short-edge printers: Enable 'Flip on short edge' option" + }, + "manualDuplex": { + "title": "Manual Duplex (Single-sided Printers)", + "text": "For printers without automatic duplex:", + "bullet1": "Turn OFF 'Double-sided printing'", + "bullet2": "Select '1st Pass' → Print → Stack face-down", + "bullet3": "Select '2nd Pass' → Load stack → Print backs", + "bullet4": "Fold and assemble as normal" + }, + "advanced": { + "title": "Advanced Options", + "text": "Fine-tune your booklet:", + "bullet1": "Right-to-Left Binding: For Arabic, Hebrew, or RTL languages", + "bullet2": "Borders: Shows cut lines for trimming", + "bullet3": "Gutter Margin: Adds space for binding/stapling", + "bullet4": "Short-edge Flip: Only for automatic duplex printers" + } + }, + "error": { + "failed": "An error occurred while creating the booklet imposition." + } }, "scalePages": { - "tags": "ā¸›ā¸Ŗā¸ąā¸šā¸‚ā¸™ā¸˛ā¸”, āšā¸āš‰āš„ā¸‚, ā¸Ąā¸´ā¸•ā¸´, ā¸›ā¸Ŗā¸ąā¸š", "title": "ā¸›ā¸Ŗā¸ąā¸šā¸Ēāš€ā¸ā¸Ĩā¸Ģā¸™āš‰ā¸˛", "header": "ā¸›ā¸Ŗā¸ąā¸šā¸Ēāš€ā¸ā¸Ĩā¸Ģā¸™āš‰ā¸˛", "pageSize": "⏂⏙⏞⏔ā¸Ģā¸™āš‰ā¸˛ā¸‚ā¸­ā¸‡āš€ā¸­ā¸ā¸Ē⏞⏪", "keepPageSize": "ā¸‚ā¸™ā¸˛ā¸”ā¸•āš‰ā¸™ā¸‰ā¸šā¸ąā¸š", "scaleFactor": "ā¸Ŗā¸°ā¸”ā¸ąā¸šā¸ā¸˛ā¸Ŗā¸‹ā¸šā¸Ą (ā¸„ā¸Ŗā¸­ā¸šā¸•ā¸ąā¸”) ⏂⏭⏇ā¸Ģā¸™āš‰ā¸˛", - "submit": "ā¸Ēāšˆā¸‡" + "submit": "ā¸Ēāšˆā¸‡", + "tags": "ā¸›ā¸Ŗā¸ąā¸šā¸‚ā¸™ā¸˛ā¸”, āšā¸āš‰āš„ā¸‚, ā¸Ąā¸´ā¸•ā¸´, ā¸›ā¸Ŗā¸ąā¸š" + }, + "adjustPageScale": { + "tags": "resize,modify,dimension,adapt", + "title": "Adjust Page Scale", + "header": "Adjust Page Scale", + "scaleFactor": { + "label": "Scale Factor" + }, + "pageSize": { + "label": "Target Page Size", + "keep": "Keep Original Size", + "letter": "Letter", + "legal": "Legal" + }, + "submit": "Adjust Page Scale", + "error": { + "failed": "An error occurred while adjusting the page scale." + }, + "tooltip": { + "header": { + "title": "Page Scale Settings Overview" + }, + "description": { + "title": "Description", + "text": "Adjust the size of PDF content and change the page dimensions." + }, + "scaleFactor": { + "title": "Scale Factor", + "text": "Controls how large or small the content appears on the page. Content is scaled and centred - if scaled content is larger than the page size, it may be cropped.", + "bullet1": "1.0 = Original size", + "bullet2": "0.5 = Half size (50% smaller)", + "bullet3": "2.0 = Double size (200% larger, may crop)" + }, + "pageSize": { + "title": "Target Page Size", + "text": "Sets the dimensions of the output PDF pages. 'Keep Original Size' maintains current dimensions, whilst other options resize to standard paper sizes." + } + } }, "add-page-numbers": { "tags": "ā¸Ģā¸™āš‰ā¸˛, āš€ā¸Ĩ⏂ā¸Ģā¸™āš‰ā¸˛, ā¸ˆā¸ąā¸”ā¸Ŗā¸°āš€ā¸šā¸ĩā¸ĸ⏚, ā¸”ā¸ąā¸Šā¸™ā¸ĩ" @@ -1129,16 +2670,83 @@ "tags": "ā¸•ā¸Ŗā¸§ā¸ˆā¸ˆā¸ąā¸šā¸­ā¸ąā¸•āš‚ā¸™ā¸Ąā¸ąā¸•ā¸´, ā¸•ā¸ąāš‰ā¸‡ā¸Šā¸ˇāšˆā¸­āšƒā¸Ģā¸Ąāšˆ, ā¸ˆā¸ąā¸”ā¸Ŗā¸°āš€ā¸šā¸ĩā¸ĸ⏚, ā¸›āš‰ā¸˛ā¸ĸ", "title": "āš€ā¸›ā¸Ĩā¸ĩāšˆā¸ĸā¸™ā¸Šā¸ˇāšˆā¸­ā¸­ā¸ąā¸•āš‚ā¸™ā¸Ąā¸ąā¸•ā¸´", "header": "āš€ā¸›ā¸Ĩā¸ĩāšˆā¸ĸā¸™ā¸Šā¸ˇāšˆā¸­ PDF ā¸­ā¸ąā¸•āš‚ā¸™ā¸Ąā¸ąā¸•ā¸´", - "submit": "āš€ā¸›ā¸Ĩā¸ĩāšˆā¸ĸā¸™ā¸Šā¸ˇāšˆā¸­ā¸­ā¸ąā¸•āš‚ā¸™ā¸Ąā¸ąā¸•ā¸´" + "description": "Automatically finds the title from your PDF content and uses it as the filename.", + "submit": "āš€ā¸›ā¸Ĩā¸ĩāšˆā¸ĸā¸™ā¸Šā¸ˇāšˆā¸­ā¸­ā¸ąā¸•āš‚ā¸™ā¸Ąā¸ąā¸•ā¸´", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst auto-renaming the PDF." + }, + "results": { + "title": "Auto-Rename Results" + }, + "tooltip": { + "header": { + "title": "How Auto-Rename Works" + }, + "howItWorks": { + "title": "Smart Renaming", + "text": "Automatically finds the title from your PDF content and uses it as the filename.", + "bullet1": "Looks for text that appears to be a title or heading", + "bullet2": "Creates a clean, valid filename from the detected title", + "bullet3": "Keeps the original name if no suitable title is found" + } + } }, "adjust-contrast": { "tags": "ā¸›ā¸Ŗā¸ąā¸šā¸Ēā¸ĩ, ā¸ˆā¸šā¸™, āšā¸āš‰āš„ā¸‚, ā¸›ā¸Ŗā¸ąā¸šā¸›ā¸Ŗā¸¸ā¸‡" }, "crop": { - "tags": "ā¸„ā¸Ŗā¸­ā¸šā¸•ā¸ąā¸”, ā¸Ĩ⏔⏂⏙⏞⏔, āšā¸āš‰āš„ā¸‚, ā¸Ŗā¸šā¸›ā¸—ā¸Ŗā¸‡", "title": "ā¸„ā¸Ŗā¸­ā¸šā¸•ā¸ąā¸”", "header": "ā¸„ā¸Ŗā¸­ā¸šā¸•ā¸ąā¸” PDF", - "submit": "ā¸Ēāšˆā¸‡" + "submit": "ā¸Ēāšˆā¸‡", + "noFileSelected": "Select a PDF file to begin cropping", + "preview": { + "title": "Crop Area Selection" + }, + "reset": "Reset to full PDF", + "coordinates": { + "title": "Position and Size", + "x": { + "label": "X Position", + "desc": "Left edge (points)" + }, + "y": { + "label": "Y Position", + "desc": "Bottom edge (points)" + }, + "width": { + "label": "Width", + "desc": "Crop width (points)" + }, + "height": { + "label": "Height", + "desc": "Crop height (points)" + } + }, + "error": { + "invalidArea": "Crop area extends beyond PDF boundaries", + "failed": "Failed to crop PDF" + }, + "steps": { + "selectArea": "Select Crop Area" + }, + "tooltip": { + "title": "How to Crop PDFs", + "description": "Select the area to crop from your PDF by dragging and resizing the blue overlay on the thumbnail.", + "drag": "Drag the overlay to move the crop area", + "resize": "Drag the corner and edge handles to resize", + "precision": "Use coordinate inputs for precise positioning" + }, + "results": { + "title": "Crop Results" + }, + "automation": { + "info": "Enter crop coordinates in PDF points. Origin (0,0) is at bottom-left. These values will be applied to all PDFs processed in this automation.", + "reference": "Reference: A4 page is 595.28 × 841.89 points (210mm × 297mm). 1 inch = 72 points." + }, + "tags": "ā¸„ā¸Ŗā¸­ā¸šā¸•ā¸ąā¸”, ā¸Ĩ⏔⏂⏙⏞⏔, āšā¸āš‰āš„ā¸‚, ā¸Ŗā¸šā¸›ā¸—ā¸Ŗā¸‡" }, "autoSplitPDF": { "tags": "āšā¸ĸā¸āš‚ā¸”ā¸ĸ QR, āšā¸ĸ⏁, ā¸Ēāšˆā¸§ā¸™ā¸Ēāšā¸ā¸™, ā¸ˆā¸ąā¸”ā¸Ŗā¸°āš€ā¸šā¸ĩā¸ĸ⏚", @@ -1221,24 +2829,124 @@ "downloadJS": "ā¸”ā¸˛ā¸§ā¸™āšŒāš‚ā¸Ģā¸Ĩ⏔ Javascript", "submit": "āšā¸Ē⏔⏇" }, - "autoRedact": { - "tags": "ā¸‹āšˆā¸­ā¸™, ā¸‹āšˆā¸­ā¸™ā¸‚āš‰ā¸­ā¸„ā¸§ā¸˛ā¸Ą, ā¸‹āšˆā¸­ā¸™ā¸”āš‰ā¸§ā¸ĸā¸Ēā¸ĩ⏔⏺", - "title": "ā¸‹āšˆā¸­ā¸™ā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩā¸­ā¸ąā¸•āš‚ā¸™ā¸Ąā¸ąā¸•ā¸´", - "header": "ā¸‹āšˆā¸­ā¸™ā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩā¸­ā¸ąā¸•āš‚ā¸™ā¸Ąā¸ąā¸•ā¸´", - "colorLabel": "ā¸Ēā¸ĩ", - "textsToRedactLabel": "ā¸‚āš‰ā¸­ā¸„ā¸§ā¸˛ā¸Ąā¸—ā¸ĩāšˆā¸ˆā¸°ā¸‹āšˆā¸­ā¸™ (āšā¸ĸā¸ā¸”āš‰ā¸§ā¸ĸā¸šā¸Ŗā¸Ŗā¸—ā¸ąā¸”)", - "textsToRedactPlaceholder": "āš€ā¸Šāšˆā¸™ \\nConfidential \\nTop-Secret", - "useRegexLabel": "āšƒā¸Šāš‰ Regex", - "wholeWordSearchLabel": "ā¸„āš‰ā¸™ā¸Ģā¸˛ā¸—ā¸ąāš‰ā¸‡ā¸„ā¸ŗ", - "customPaddingLabel": "ā¸ā¸˛ā¸Ŗāš€ā¸•ā¸´ā¸Ąā¸—ā¸ĩāšˆā¸ā¸ŗā¸Ģā¸™ā¸”āš€ā¸­ā¸‡", - "convertPDFToImageLabel": "āšā¸›ā¸Ĩ⏇ PDF āš€ā¸›āš‡ā¸™ā¸ ā¸˛ā¸ž PDF (āšƒā¸Šāš‰āš€ā¸žā¸ˇāšˆā¸­ā¸Ĩā¸šā¸‚āš‰ā¸­ā¸„ā¸§ā¸˛ā¸Ąā¸—ā¸ĩāšˆā¸­ā¸ĸā¸šāšˆā¸”āš‰ā¸˛ā¸™ā¸Ģā¸Ĩā¸ąā¸‡ā¸ā¸Ĩāšˆā¸­ā¸‡)", - "submitButton": "ā¸Ēāšˆā¸‡" - }, "redact": { "tags": "Redact,Hide,black out,black,marker,hidden,manual", "title": "Manual Redaction", - "header": "Manual Redaction", "submit": "Manual Redaction", + "error": { + "failed": "An error occurred while redacting the PDF." + }, + "modeSelector": { + "title": "Redaction Method", + "mode": "Mode", + "automatic": "Automatic", + "automaticDesc": "Redact text based on search terms", + "manual": "Manual", + "manualDesc": "Click and drag to redact specific areas", + "manualComingSoon": "Manual redaction coming soon" + }, + "auto": { + "header": "Auto Redact", + "settings": { + "title": "Redaction Settings", + "advancedTitle": "ā¸‚ā¸ąāš‰ā¸™ā¸Ēā¸šā¸‡" + }, + "colorLabel": "Box Colour", + "wordsToRedact": { + "title": "Words to Redact", + "placeholder": "Enter a word", + "add": "āš€ā¸žā¸´āšˆā¸Ą", + "examples": "Examples: Confidential, Top-Secret" + }, + "useRegexLabel": "Use Regex", + "wholeWordSearchLabel": "Whole Word Search", + "customPaddingLabel": "Custom Extra Padding", + "convertPDFToImageLabel": "Convert PDF to PDF-Image" + }, + "tooltip": { + "mode": { + "header": { + "title": "Redaction Method" + }, + "automatic": { + "title": "Automatic Redaction", + "text": "Automatically finds and redacts specified text throughout the document. Perfect for removing consistent sensitive information like names, addresses, or confidential markers." + }, + "manual": { + "title": "Manual Redaction", + "text": "Click and drag to manually select specific areas to redact. Gives you precise control over what gets redacted. (Coming soon)" + } + }, + "words": { + "header": { + "title": "Words to Redact" + }, + "description": { + "title": "Text Matching", + "text": "Enter words or phrases to find and redact in your document. Each word will be searched for separately." + }, + "bullet1": "Add one word at a time", + "bullet2": "Press Enter or click 'Add Another' to add", + "bullet3": "Click × to remove words", + "examples": { + "title": "Common Examples", + "text": "Typical words to redact include: bank details, email addresses, or specific names." + } + }, + "advanced": { + "header": { + "title": "Advanced Redaction Settings" + }, + "color": { + "title": "Box Colour & Padding", + "text": "Customise the appearance of redaction boxes. Black is standard, but you can choose any colour. Padding adds extra space around the found text." + }, + "regex": { + "title": "Use Regex", + "text": "Enable regular expressions for advanced pattern matching. Useful for finding phone numbers, emails, or complex patterns.", + "bullet1": "Example: \\d{4}-\\d{2}-\\d{2} to match any dates in YYYY-MM-DD format", + "bullet2": "Use with caution - test thoroughly" + }, + "wholeWord": { + "title": "Whole Word Search", + "text": "Only match complete words, not partial matches. 'John' won't match 'Johnson' when enabled." + }, + "convert": { + "title": "Convert to PDF-Image", + "text": "Converts the PDF to an image-based PDF after redaction. This ensures text behind redaction boxes is completely removed and unrecoverable." + } + } + }, + "manual": { + "header": "Manual Redaction", + "textBasedRedaction": "Text-based Redaction", + "pageBasedRedaction": "Page-based Redaction", + "convertPDFToImageLabel": "Convert PDF to PDF-Image (Used to remove text behind the box)", + "pageRedactionNumbers": { + "title": "ā¸Ģā¸™āš‰ā¸˛", + "placeholder": "(āš€ā¸Šāšˆā¸™ 1,2,8 ā¸Ģ⏪⏎⏭ 4,7,12-16 ā¸Ģ⏪⏎⏭ 2n-1)" + }, + "redactionColor": { + "title": "Redaction Colour" + }, + "export": "Export", + "upload": "Upload", + "boxRedaction": "Box draw redaction", + "zoom": "Zoom", + "zoomIn": "Zoom in", + "zoomOut": "Zoom out", + "nextPage": "Next Page", + "previousPage": "Previous Page", + "toggleSidebar": "Toggle Sidebar", + "showThumbnails": "Show Thumbnails", + "showDocumentOutline": "Show Document Outline (double-click to expand/collapse all items)", + "showAttachments": "Show Attachments", + "showLayers": "Show Layers (double-click to reset all layers to the default state)", + "colourPicker": "Colour Picker", + "findCurrentOutlineItem": "Find current outline item", + "applyChanges": "Apply Changes" + }, + "header": "Manual Redaction", "textBasedRedaction": "Text based Redaction", "pageBasedRedaction": "Page-based Redaction", "convertPDFToImageLabel": "Convert PDF to PDF-Image (Used to remove text behind the box)", @@ -1264,21 +2972,7 @@ "showLayers": "Show Layers (double-click to reset all layers to the default state)", "colourPicker": "Colour Picker", "findCurrentOutlineItem": "Find current outline item", - "applyChanges": "Apply Changes", - "auto": { - "settings": { - "advancedTitle": "ā¸‚ā¸ąāš‰ā¸™ā¸Ēā¸šā¸‡" - }, - "wordsToRedact": { - "add": "āš€ā¸žā¸´āšˆā¸Ą" - } - }, - "manual": { - "pageRedactionNumbers": { - "title": "ā¸Ģā¸™āš‰ā¸˛", - "placeholder": "(āš€ā¸Šāšˆā¸™ 1,2,8 ā¸Ģ⏪⏎⏭ 4,7,12-16 ā¸Ģ⏪⏎⏭ 2n-1)" - } - } + "applyChanges": "Apply Changes" }, "tableExtraxt": { "tags": "CSV, ā¸ā¸˛ā¸Ŗāšā¸ĸ⏁⏕⏞⏪⏞⏇, āšā¸ĸ⏁, ā¸ā¸˛ā¸Ŗāšā¸›ā¸Ĩ⏇" @@ -1289,11 +2983,15 @@ "overlay-pdfs": { "tags": "ā¸‹āš‰ā¸­ā¸™ā¸—ā¸ąā¸š", "header": "ā¸‹āš‰ā¸­ā¸™ā¸—ā¸ąā¸šāš„ā¸Ÿā¸ĨāšŒ PDF", + "title": "Overlay PDFs", + "desc": "Overlay one PDF on top of another", "baseFile": { "label": "āš€ā¸Ĩā¸ˇā¸­ā¸āš„ā¸Ÿā¸ĨāšŒ PDF ā¸žā¸ˇāš‰ā¸™ā¸ā¸˛ā¸™" }, "overlayFiles": { - "label": "āš€ā¸Ĩā¸ˇā¸­ā¸āš„ā¸Ÿā¸ĨāšŒ PDF ā¸‹āš‰ā¸­ā¸™ā¸—ā¸ąā¸š" + "label": "āš€ā¸Ĩā¸ˇā¸­ā¸āš„ā¸Ÿā¸ĨāšŒ PDF ā¸‹āš‰ā¸­ā¸™ā¸—ā¸ąā¸š", + "placeholder": "Choose PDF(s)...", + "addMore": "Add more PDFs..." }, "mode": { "label": "āš€ā¸Ĩā¸ˇā¸­ā¸āš‚ā¸Ģā¸Ąā¸”ā¸‹āš‰ā¸­ā¸™ā¸—ā¸ąā¸š", @@ -1303,14 +3001,53 @@ }, "counts": { "label": "ā¸ˆā¸ŗā¸™ā¸§ā¸™ā¸ā¸˛ā¸Ŗā¸‹āš‰ā¸­ā¸™ā¸—ā¸ąā¸š (ā¸Ē⏺ā¸Ģā¸Ŗā¸ąā¸šāš‚ā¸Ģā¸Ąā¸”ā¸§ā¸™ā¸‹āš‰ā¸ŗ)", - "placeholder": "ā¸›āš‰ā¸­ā¸™ā¸ˆā¸ŗā¸™ā¸§ā¸™āšā¸ĸā¸ā¸”āš‰ā¸§ā¸ĸāš€ā¸„ā¸Ŗā¸ˇāšˆā¸­ā¸‡ā¸Ģā¸Ąā¸˛ā¸ĸ⏈⏏ā¸Ĩ⏠⏞⏄ (āš€ā¸Šāšˆā¸™ 2,3,1)" + "placeholder": "ā¸›āš‰ā¸­ā¸™ā¸ˆā¸ŗā¸™ā¸§ā¸™āšā¸ĸā¸ā¸”āš‰ā¸§ā¸ĸāš€ā¸„ā¸Ŗā¸ˇāšˆā¸­ā¸‡ā¸Ģā¸Ąā¸˛ā¸ĸ⏈⏏ā¸Ĩ⏠⏞⏄ (āš€ā¸Šāšˆā¸™ 2,3,1)", + "item": "Count for file", + "noFiles": "Add overlay files to configure counts" }, "position": { "label": "āš€ā¸Ĩā¸ˇā¸­ā¸ā¸•ā¸ŗāšā¸Ģā¸™āšˆā¸‡ā¸‹āš‰ā¸­ā¸™ā¸—ā¸ąā¸š", "foreground": "ā¸žā¸ˇāš‰ā¸™ā¸Ģā¸™āš‰ā¸˛", "background": "ā¸žā¸ˇāš‰ā¸™ā¸Ģā¸Ĩā¸ąā¸‡" }, - "submit": "ā¸Ēāšˆā¸‡" + "submit": "ā¸Ēāšˆā¸‡", + "settings": { + "title": "Settings" + }, + "results": { + "title": "Overlay Results" + }, + "tooltip": { + "header": { + "title": "Overlay PDFs Overview" + }, + "description": { + "title": "Description", + "text": "Combine a base PDF with one or more overlay PDFs. Overlays can be applied page-by-page in different modes and placed in the foreground or background." + }, + "mode": { + "title": "Overlay Mode", + "text": "Choose how to distribute overlay pages across the base PDF pages.", + "sequential": "Sequential Overlay: Use pages from the first overlay PDF until it ends, then move to the next.", + "interleaved": "Interleaved Overlay: Take one page from each overlay in turn.", + "fixedRepeat": "Fixed Repeat Overlay: Take a set number of pages from each overlay before moving to the next. Use Counts to set the numbers." + }, + "position": { + "title": "Overlay Position", + "text": "Foreground places the overlay on top of the page. Background places it behind." + }, + "overlayFiles": { + "title": "Overlay Files", + "text": "Select one or more PDFs to overlay on the base. The order of these files affects how pages are applied in Sequential and Fixed Repeat modes." + }, + "counts": { + "title": "Counts (Fixed Repeat only)", + "text": "Provide a positive number for each overlay file showing how many pages to take before moving to the next. Required when mode is Fixed Repeat." + } + }, + "error": { + "failed": "An error occurred while overlaying PDFs." + } }, "split-by-sections": { "tags": "āšā¸ĸ⏁ā¸Ēāšˆā¸§ā¸™, āšā¸šāšˆā¸‡, ā¸›ā¸Ŗā¸ąā¸šāšā¸•āšˆā¸‡", @@ -1331,6 +3068,7 @@ "tags": "ā¸•ā¸Ŗā¸˛ā¸›ā¸Ŗā¸°ā¸—ā¸ąā¸š, āš€ā¸žā¸´āšˆā¸Ąā¸Ŗā¸šā¸›ā¸ ā¸˛ā¸ž, ā¸Ŗā¸šā¸›ā¸ ā¸˛ā¸žā¸ā¸ļāšˆā¸‡ā¸ā¸Ĩ⏞⏇, ā¸Ĩ⏞ā¸ĸā¸™āš‰ā¸ŗ, PDF, ā¸ā¸ąā¸‡, ā¸›ā¸Ŗā¸ąā¸šāšā¸•āšˆā¸‡", "header": "ā¸•ā¸Ŗā¸˛ā¸›ā¸Ŗā¸°ā¸—ā¸ąā¸š PDF", "title": "ā¸•ā¸Ŗā¸˛ā¸›ā¸Ŗā¸°ā¸—ā¸ąā¸š PDF", + "stampSetup": "Stamp Setup", "stampType": "ā¸›ā¸Ŗā¸°āš€ā¸ ā¸—ā¸•ā¸Ŗā¸˛ā¸›ā¸Ŗā¸°ā¸—ā¸ąā¸š", "stampText": "ā¸‚āš‰ā¸­ā¸„ā¸§ā¸˛ā¸Ąā¸•ā¸Ŗā¸˛ā¸›ā¸Ŗā¸°ā¸—ā¸ąā¸š", "stampImage": "ā¸Ŗā¸šā¸›ā¸ ā¸˛ā¸žā¸•ā¸Ŗā¸˛ā¸›ā¸Ŗā¸°ā¸—ā¸ąā¸š", @@ -1343,7 +3081,19 @@ "overrideY": "āšā¸—ā¸™ā¸—ā¸ĩāšˆā¸žā¸´ā¸ā¸ąā¸” Y", "customMargin": "ā¸‚ā¸­ā¸šā¸—ā¸ĩāšˆā¸ā¸ŗā¸Ģā¸™ā¸”āš€ā¸­ā¸‡", "customColor": "ā¸Ēā¸ĩā¸‚āš‰ā¸­ā¸„ā¸§ā¸˛ā¸Ąā¸—ā¸ĩāšˆā¸ā¸ŗā¸Ģā¸™ā¸”āš€ā¸­ā¸‡", - "submit": "ā¸Ēāšˆā¸‡" + "submit": "ā¸Ēāšˆā¸‡", + "noStampSelected": "No stamp selected. Return to Step 1.", + "customPosition": "Drag the stamp to the desired location in the preview window.", + "error": { + "failed": "An error occurred while adding stamp to the PDF." + }, + "imageSize": "Image Size", + "margin": "Margin", + "positionAndFormatting": "Position & Formatting", + "quickPosition": "Select a position on the page to place the stamp.", + "results": { + "title": "Stamp Results" + } }, "removeImagePdf": { "tags": "Remove Image,Page operations,Back end,server side" @@ -1361,7 +3111,8 @@ "status": { "_value": "Status", "valid": "Valid", - "invalid": "Invalid" + "invalid": "Invalid", + "complete": "Validation complete" }, "signer": "Signer", "date": "Date", @@ -1388,40 +3139,122 @@ "version": "āš€ā¸§ā¸­ā¸ŖāšŒā¸Šā¸ąā¸™", "keyUsage": "Key Usage", "selfSigned": "Self-Signed", - "bits": "bits" + "bits": "bits", + "details": "Certificate Details" }, "signature": { "info": "Signature Information", "_value": "Signature", "mathValid": "Signature is mathematically valid BUT:" }, - "selectCustomCert": "Custom Certificate File X.509 (Optional)" - }, - "replace-color": { - "title": "Replace-Invert-Color", - "header": "Replace-Invert Color PDF", - "selectText": { - "1": "Replace or Invert color Options", - "2": "Default(Default high contrast colors)", - "3": "Custom(Customized colors)", - "4": "Full-Invert(Invert all colors)", - "5": "High contrast color options", - "6": "white text on black background", - "7": "Black text on white background", - "8": "Yellow text on black background", - "9": "Green text on black background", - "10": "Choose text Color", - "11": "Choose background Color" + "selectCustomCert": "Custom Certificate File X.509 (Optional)", + "downloadCsv": "Download CSV", + "downloadJson": "Download JSON", + "downloadPdf": "Download PDF Report", + "downloadType": { + "csv": "CSV", + "json": "JSON", + "pdf": "PDF" }, - "submit": "Replace" + "error": { + "allFailed": "Unable to validate the selected files.", + "partial": "Some files could not be validated.", + "reportGeneration": "Could not generate the PDF report. JSON and CSV are available.", + "unexpected": "Unexpected error during validation." + }, + "finalizing": "Preparing downloads...", + "issue": { + "certExpired": "Certificate expired", + "certRevocationUnknown": "Certificate revocation status unknown", + "certRevoked": "Certificate revoked", + "chainInvalid": "Certificate chain invalid", + "signatureInvalid": "Signature cryptographic check failed", + "trustInvalid": "Certificate not trusted" + }, + "noResults": "Run the validation to generate a report.", + "noSignaturesShort": "No signatures", + "processing": "Validating signatures...", + "report": { + "continued": "Continued", + "downloads": "Downloads", + "entryLabel": "Signature Summary", + "fields": { + "created": "Created", + "fileSize": "File Size", + "signatureCount": "Total Signatures", + "signatureDate": "Signature Date" + }, + "filesEvaluated": "{{count}} files evaluated", + "footer": "Validated via Stirling PDF", + "generatedAt": "Generated", + "noPdf": "PDF report will be available after a successful validation.", + "page": "Page", + "shortTitle": "Signature Summary", + "signatureCountLabel": "{{count}} signatures", + "signaturesFound": "{{count}} signatures detected", + "signaturesValid": "{{count}} fully valid", + "title": "Signature Validation Report" + }, + "settings": { + "certHint": "Upload a trusted X.509 certificate to validate against a custom trust source.", + "title": "Validation Settings" + }, + "signatureDate": "Signature Date", + "totalSignatures": "Total Signatures" }, - "replaceColorPdf": { - "tags": "Replace Color,Page operations,Back end,server side" + "replaceColor": { + "tags": "Replace Colour,Page operations,Back end,server side", + "labels": { + "settings": "Settings", + "colourOperation": "Colour operation" + }, + "options": { + "highContrast": "High contrast", + "invertAll": "Invert all colours", + "custom": "Custom", + "cmyk": "Convert to CMYK" + }, + "tooltip": { + "header": { + "title": "Replace & Invert Colour Settings Overview" + }, + "description": { + "title": "Description", + "text": "Transform PDF colours to improve readability and accessibility. Choose from high contrast presets, invert all colours, or create custom colour schemes." + }, + "highContrast": { + "title": "High Contrast", + "text": "Apply predefined high contrast colour combinations designed for better readability and accessibility compliance.", + "bullet1": "White text on black background - Classic dark mode", + "bullet2": "Black text on white background - Standard high contrast", + "bullet3": "Yellow text on black background - High visibility option", + "bullet4": "Green text on black background - Alternative high contrast" + }, + "invertAll": { + "title": "Invert All Colours", + "text": "Completely invert all colours in the PDF, creating a negative-like effect. Useful for creating dark mode versions of documents or reducing eye strain in low-light conditions." + }, + "custom": { + "title": "Custom Colours", + "text": "Define your own text and background colours using the colour pickers. Perfect for creating branded documents or specific accessibility requirements.", + "bullet1": "Text colour - Choose the colour for text elements", + "bullet2": "Background colour - Set the background colour for the document" + }, + "cmyk": { + "title": "Convert to CMYK", + "text": "Convert the PDF from RGB colour space to CMYK colour space, optimized for professional printing. This process converts colours to the Cyan, Magenta, Yellow, Black model used by printers." + } + }, + "error": { + "failed": "An error occurred while processing the colour replacement." + } }, "login": { "title": "ā¸Ĩā¸‡ā¸Šā¸ˇāšˆā¸­āš€ā¸‚āš‰ā¸˛āšƒā¸Šāš‰", "header": "ā¸Ĩā¸‡ā¸Šā¸ˇāšˆā¸­āš€ā¸‚āš‰ā¸˛āšƒā¸Šāš‰", "signin": "ā¸Ĩā¸‡ā¸Šā¸ˇāšˆā¸­āš€ā¸‚āš‰ā¸˛āšƒā¸Šāš‰", + "signInWith": "Sign in with", + "signInAnonymously": "Sign Up as a Guest", "rememberme": "ā¸ˆā¸ŗā¸‰ā¸ąā¸™āš„ā¸§āš‰", "invalid": "ā¸Šā¸ˇāšˆā¸­ā¸œā¸šāš‰āšƒā¸Šāš‰ā¸Ģ⏪⏎⏭⏪ā¸Ģā¸ąā¸Ēā¸œāšˆā¸˛ā¸™āš„ā¸Ąāšˆā¸–ā¸šā¸ā¸•āš‰ā¸­ā¸‡", "locked": "ā¸šā¸ąā¸ā¸Šā¸ĩā¸‚ā¸­ā¸‡ā¸„ā¸¸ā¸“ā¸–ā¸šā¸ā¸Ĩāš‡ā¸­ā¸„", @@ -1440,12 +3273,83 @@ "alreadyLoggedIn": "ā¸„ā¸¸ā¸“āš„ā¸”āš‰āš€ā¸‚āš‰ā¸˛ā¸Ēā¸šāšˆā¸Ŗā¸°ā¸šā¸šāšƒā¸™", "alreadyLoggedIn2": "ā¸­ā¸¸ā¸›ā¸ā¸Ŗā¸“āšŒāšā¸Ĩāš‰ā¸§ ā¸ā¸Ŗā¸¸ā¸“ā¸˛ā¸­ā¸­ā¸ā¸ˆā¸˛ā¸ā¸Ŗā¸°ā¸šā¸šā¸ˆā¸˛ā¸ā¸­ā¸¸ā¸›ā¸ā¸Ŗā¸“āšŒā¸—ā¸ĩāšˆāšƒā¸Šāš‰ā¸‡ā¸˛ā¸™ā¸­ā¸ĸā¸šāšˆāšā¸Ĩāš‰ā¸§ ā¸ˆā¸˛ā¸ā¸™ā¸ąāš‰ā¸™ā¸Ĩā¸­ā¸‡āšƒā¸Ģā¸Ąāšˆā¸­ā¸ĩā¸ā¸„ā¸Ŗā¸ąāš‰ā¸‡", "toManySessions": "ā¸„ā¸¸ā¸“ā¸Ąā¸ĩā¸ā¸˛ā¸Ŗāš€ā¸‚āš‰ā¸˛ā¸Ēā¸šāšˆā¸Ŗā¸°ā¸šā¸šā¸žā¸Ŗāš‰ā¸­ā¸Ąā¸ā¸ąā¸™āš€ā¸ā¸´ā¸™ā¸ā¸§āšˆā¸˛ā¸ā¸ŗā¸Ģ⏙⏔", - "logoutMessage": "You have been logged out." + "logoutMessage": "You have been logged out.", + "youAreLoggedIn": "You are logged in!", + "email": "Email", + "password": "Password", + "enterEmail": "Enter your email", + "enterPassword": "Enter your password", + "loggingIn": "Logging In...", + "username": "Username", + "enterUsername": "Enter username", + "useEmailInstead": "Login with email", + "forgotPassword": "Forgot your password?", + "logIn": "Log In", + "signingIn": "Signing in...", + "login": "Login", + "or": "Or", + "useMagicLink": "Use magic link instead", + "enterEmailForMagicLink": "Enter your email for magic link", + "sending": "Sendingâ€Ļ", + "sendMagicLink": "Send Magic Link", + "cancel": "Cancel", + "dontHaveAccount": "Don't have an account? Sign up", + "home": "Home", + "debug": "Debug", + "signOut": "Sign Out", + "pleaseEnterBoth": "Please enter both email and password", + "pleaseEnterEmail": "Please enter your email address", + "magicLinkSent": "Magic link sent to {{email}}! Check your email and click the link to sign in.", + "passwordResetSent": "Password reset link sent to {{email}}! Check your email and follow the instructions.", + "failedToSignIn": "Failed to sign in with {{provider}}: {{message}}", + "unexpectedError": "Unexpected error: {{message}}", + "accountCreatedSuccess": "Account created successfully! You can now sign in.", + "passwordChangedSuccess": "Password changed successfully! Please sign in with your new password.", + "credentialsUpdated": "Your credentials have been updated. Please sign in again." + }, + "signup": { + "title": "Create an account", + "subtitle": "Join Stirling PDF to get started", + "name": "Name", + "email": "Email", + "password": "Password", + "confirmPassword": "Confirm password", + "enterName": "Enter your name", + "enterEmail": "Enter your email", + "enterPassword": "Enter your password", + "confirmPasswordPlaceholder": "Confirm password", + "or": "or", + "creatingAccount": "Creating Account...", + "signUp": "Sign Up", + "alreadyHaveAccount": "Already have an account? Sign in", + "pleaseFillAllFields": "Please fill in all fields", + "passwordsDoNotMatch": "Passwords do not match", + "passwordTooShort": "Password must be at least 6 characters long", + "invalidEmail": "Please enter a valid email address", + "checkEmailConfirmation": "Check your email for a confirmation link to complete your registration.", + "accountCreatedSuccessfully": "Account created successfully! You can now sign in.", + "unexpectedError": "Unexpected error: {{message}}", + "useEmailInstead": "Use Email Instead", + "nameRequired": "Name is required", + "emailRequired": "Email is required", + "passwordRequired": "Password is required", + "confirmPasswordRequired": "Please confirm your password" }, "pdfToSinglePage": { "title": "PDF āš€ā¸›āš‡ā¸™ā¸Ģā¸™āš‰ā¸˛ā¸‚ā¸™ā¸˛ā¸”āšƒā¸Ģā¸āšˆāš€ā¸žā¸ĩā¸ĸ⏇ā¸Ģā¸™āš‰ā¸˛āš€ā¸”ā¸ĩā¸ĸ⏧", "header": "PDF āš€ā¸›āš‡ā¸™ā¸Ģā¸™āš‰ā¸˛ā¸‚ā¸™ā¸˛ā¸”āšƒā¸Ģā¸āšˆāš€ā¸žā¸ĩā¸ĸ⏇ā¸Ģā¸™āš‰ā¸˛āš€ā¸”ā¸ĩā¸ĸ⏧", - "submit": "āšā¸›ā¸Ĩā¸‡āš€ā¸›āš‡ā¸™ā¸Ģā¸™āš‰ā¸˛ā¸‚ā¸™ā¸˛ā¸”āšƒā¸Ģā¸āšˆāš€ā¸žā¸ĩā¸ĸ⏇ā¸Ģā¸™āš‰ā¸˛āš€ā¸”ā¸ĩā¸ĸ⏧" + "submit": "āšā¸›ā¸Ĩā¸‡āš€ā¸›āš‡ā¸™ā¸Ģā¸™āš‰ā¸˛ā¸‚ā¸™ā¸˛ā¸”āšƒā¸Ģā¸āšˆāš€ā¸žā¸ĩā¸ĸ⏇ā¸Ģā¸™āš‰ā¸˛āš€ā¸”ā¸ĩā¸ĸ⏧", + "description": "This tool will merge all pages of your PDF into one large single page. The width will remain the same as the original pages, but the height will be the sum of all page heights.", + "filenamePrefix": "single_page", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst converting to single page." + }, + "results": { + "title": "Single Page Results" + } }, "pageExtracter": { "title": "āšā¸ĸ⏁ā¸Ģā¸™āš‰ā¸˛", @@ -1469,18 +3373,59 @@ "adjustContrast": { "title": "ā¸›ā¸Ŗā¸ąā¸šā¸„ā¸­ā¸™ā¸—ā¸Ŗā¸˛ā¸Ēā¸•āšŒ", "header": "ā¸›ā¸Ŗā¸ąā¸šā¸„ā¸­ā¸™ā¸—ā¸Ŗā¸˛ā¸Ēā¸•āšŒ", + "basic": "Basic Adjustments", "contrast": "⏄⏭⏙⏗⏪⏞ā¸Ēā¸•āšŒ:", "brightness": "ā¸„ā¸§ā¸˛ā¸Ąā¸Ēā¸§āšˆā¸˛ā¸‡:", "saturation": "ā¸„ā¸§ā¸˛ā¸Ąā¸­ā¸´āšˆā¸Ąā¸•ā¸ąā¸§:", - "download": "ā¸”ā¸˛ā¸§ā¸™āšŒāš‚ā¸Ģā¸Ĩ⏔" + "download": "ā¸”ā¸˛ā¸§ā¸™āšŒāš‚ā¸Ģā¸Ĩ⏔", + "adjustColors": "Adjust Colors", + "blue": "Blue", + "confirm": "Confirm", + "error": { + "failed": "Failed to adjust colors/contrast" + }, + "green": "Green", + "noPreview": "Select a PDF to preview", + "red": "Red", + "results": { + "title": "Adjusted PDF" + } }, "compress": { "title": "⏚ā¸ĩā¸šā¸­ā¸ąā¸”", + "desc": "Compress PDFs to reduce their file size.", "header": "⏚ā¸ĩā¸šā¸­ā¸ąā¸” PDF", + "method": { + "title": "Compression Method", + "quality": "Quality", + "filesize": "ā¸‚ā¸™ā¸˛ā¸”āš„ā¸Ÿā¸ĨāšŒ" + }, "credit": "ā¸šā¸Ŗā¸´ā¸ā¸˛ā¸Ŗā¸™ā¸ĩāš‰āšƒā¸Šāš‰ qpdf ā¸Ē⏺ā¸Ģā¸Ŗā¸ąā¸šā¸ā¸˛ā¸Ŗā¸šā¸ĩā¸šā¸­ā¸ąā¸”/ā¸ā¸˛ā¸Ŗāš€ā¸žā¸´āšˆā¸Ąā¸›ā¸Ŗā¸°ā¸Ēā¸´ā¸—ā¸˜ā¸´ā¸ ā¸˛ā¸ž PDF", "grayscale": { "label": "āšƒā¸Šāš‰ā¸Ŗā¸°ā¸”ā¸ąā¸šā¸Ēā¸ĩāš€ā¸—ā¸˛ā¸Ē⏺ā¸Ģā¸Ŗā¸ąā¸šā¸ā¸˛ā¸Ŗā¸šā¸ĩā¸šā¸­ā¸ąā¸”" }, + "tooltip": { + "header": { + "title": "Compress Settings Overview" + }, + "description": { + "title": "Description", + "text": "Compression is an easy way to reduce your file size. Pick File Size to enter a target size and have us adjust quality for you. Pick Quality to set compression strength manually." + }, + "qualityAdjustment": { + "title": "Quality Adjustment", + "text": "Drag the slider to adjust the compression strength. Lower values (1-3) preserve quality but result in larger files. Higher values (7-9) shrink the file more but reduce image clarity.", + "bullet1": "Lower values preserve quality", + "bullet2": "Higher values reduce file size" + }, + "grayscale": { + "title": "Grayscale", + "text": "Select this option to convert all images to black and white, which can significantly reduce file size especially for scanned PDFs or image-heavy documents." + } + }, + "error": { + "failed": "An error occurred while compressing the PDF." + }, "selectText": { "1": { "_value": "Compression Settings", @@ -1490,10 +3435,7 @@ "4": "āš‚ā¸Ģā¸Ąā¸”ā¸­ā¸ąā¸•āš‚ā¸™ā¸Ąā¸ąā¸•ā¸´ - ā¸›ā¸Ŗā¸ąā¸šā¸„ā¸¸ā¸“ā¸ ā¸˛ā¸žā¸­ā¸ąā¸•āš‚ā¸™ā¸Ąā¸ąā¸•ā¸´āš€ā¸žā¸ˇāšˆā¸­āšƒā¸Ģāš‰ PDF ā¸•ā¸Ŗā¸‡ā¸ā¸ąā¸šā¸‚ā¸™ā¸˛ā¸”ā¸—ā¸ĩāšˆā¸•āš‰ā¸­ā¸‡ā¸ā¸˛ā¸Ŗ", "5": "⏂⏙⏞⏔ PDF ⏗ā¸ĩāšˆā¸„ā¸˛ā¸”ā¸Ģā¸§ā¸ąā¸‡ (āš€ā¸Šāšˆā¸™ 25MB, 10.8MB, 25KB)" }, - "submit": "⏚ā¸ĩā¸šā¸­ā¸ąā¸”", - "method": { - "filesize": "ā¸‚ā¸™ā¸˛ā¸”āš„ā¸Ÿā¸ĨāšŒ" - } + "submit": "⏚ā¸ĩā¸šā¸­ā¸ąā¸”" }, "decrypt": { "passwordPrompt": "This file is password-protected. Please enter the password:", @@ -1594,7 +3536,13 @@ "title": "ā¸Ĩā¸šā¸ ā¸˛ā¸ž", "header": "ā¸Ĩā¸šā¸ ā¸˛ā¸ž", "removeImage": "ā¸Ĩā¸šā¸ ā¸˛ā¸ž", - "submit": "ā¸ĸ⏎⏙ā¸ĸā¸ąā¸™ā¸ā¸˛ā¸Ŗā¸Ĩā¸šā¸ ā¸˛ā¸ž" + "submit": "ā¸ĸ⏎⏙ā¸ĸā¸ąā¸™ā¸ā¸˛ā¸Ŗā¸Ĩā¸šā¸ ā¸˛ā¸ž", + "error": { + "failed": "Failed to remove images from the PDF." + }, + "results": { + "title": "Remove Images Results" + } }, "splitByChapters": { "title": "āšā¸šāšˆā¸‡āš„ā¸Ÿā¸ĨāšŒ PDF ā¸•ā¸˛ā¸Ąā¸Ģā¸Ąā¸§ā¸”ā¸Ģā¸Ąā¸šāšˆ", @@ -1628,6 +3576,12 @@ }, "note": "Release notes are only available in English" }, + "swagger": { + "title": "API Documentation", + "header": "API Documentation", + "desc": "View and test the Stirling PDF API endpoints", + "tags": "api,documentation,swagger,endpoints,development" + }, "cookieBanner": { "popUp": { "title": "How we use Cookies", @@ -1663,45 +3617,943 @@ "title": "Analytics", "description": "These cookies help us understand how our tools are being used, so we can focus on building the features our community values most. Rest assured—Stirling PDF cannot and will never track the content of the documents you work with." } + }, + "services": { + "posthog": "PostHog Analytics", + "scarf": "Scarf Pixel" } }, - "download": "ā¸”ā¸˛ā¸§ā¸™āšŒāš‚ā¸Ģā¸Ĩ⏔", - "convert": { - "title": "āšā¸›ā¸Ĩ⏇", - "settings": "ā¸ā¸˛ā¸Ŗā¸•ā¸ąāš‰ā¸‡ā¸„āšˆā¸˛", - "color": "ā¸Ēā¸ĩ", - "greyscale": "ā¸Ŗā¸°ā¸”ā¸ąā¸šā¸Ēā¸ĩāš€ā¸—ā¸˛", - "fillPage": "āš€ā¸•ā¸´ā¸Ąā¸Ģā¸™āš‰ā¸˛", - "pdfaDigitalSignatureWarning": "PDF ā¸Ąā¸ĩā¸Ĩ⏞ā¸ĸāš€ā¸‹āš‡ā¸™ā¸”ā¸´ā¸ˆā¸´ā¸—ā¸ąā¸Ĩ ⏋ā¸ļāšˆā¸‡ā¸ˆā¸°ā¸–ā¸šā¸ā¸Ĩā¸šāšƒā¸™ā¸‚ā¸ąāš‰ā¸™ā¸•ā¸­ā¸™ā¸–ā¸ąā¸”āš„ā¸›", - "grayscale": "ā¸Ŗā¸°ā¸”ā¸ąā¸šā¸Ēā¸ĩāš€ā¸—ā¸˛" + "removeMetadata": { + "submit": "Remove Metadata" }, - "attachments": { - "tags": "embed,attach,file,attachment,attachments", - "title": "Add attachments", - "header": "Add attachments", - "submit": "Add attachments" + "sidebar": { + "toggle": "Toggle Sidebar" + }, + "theme": { + "toggle": "Toggle Theme" + }, + "view": { + "viewer": "Viewer", + "pageEditor": "Page Editor", + "fileManager": "File Manager" + }, + "pageEditor": { + "title": "Page Editor", + "save": "Save Changes", + "noPdfLoaded": "No PDF loaded. Please upload a PDF to edit.", + "rotatedLeft": "Rotated left:", + "rotatedRight": "Rotated right:", + "deleted": "Deleted:", + "movedLeft": "Moved left:", + "movedRight": "Moved right:", + "splitAt": "Split at:", + "insertedPageBreak": "Inserted page break at:", + "addFileNotImplemented": "Add file not implemented in demo", + "closePdf": "Close PDF", + "reset": "Reset Changes", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "fitToWidth": "Fit to Width", + "actualSize": "Actual Size" + }, + "viewer": { + "firstPage": "First Page", + "lastPage": "Last Page", + "previousPage": "Previous Page", + "nextPage": "Next Page", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "singlePageView": "Single Page View", + "dualPageView": "Dual Page View" + }, + "rightRail": { + "closeSelected": "Close Selected Files", + "selectAll": "Select All", + "deselectAll": "Deselect All", + "selectByNumber": "Select by Page Numbers", + "deleteSelected": "Delete Selected Pages", + "closePdf": "Close PDF", + "exportAll": "Export PDF", + "downloadSelected": "Download Selected Files", + "downloadAll": "Download All", + "toggleTheme": "Toggle Theme", + "language": "Language", + "search": "Search PDF", + "panMode": "Pan Mode", + "rotateLeft": "Rotate Left", + "rotateRight": "Rotate Right", + "toggleSidebar": "Toggle Sidebar", + "exportSelected": "Export Selected Pages", + "toggleAnnotations": "Toggle Annotations Visibility", + "annotationMode": "Toggle Annotation Mode", + "draw": "Draw", + "save": "Save" + }, + "search": { + "title": "Search PDF", + "placeholder": "Enter search term...", + "noResults": "No results found", + "searching": "Searching..." + }, + "guestBanner": { + "title": "You're using Stirling PDF as a guest!", + "message": "Create a free account to save your work, access more features, and support the project.", + "dismiss": "Dismiss banner", + "signUp": "Sign Up Free" + }, + "toolPicker": { + "searchPlaceholder": "Search tools...", + "noToolsFound": "No tools found", + "allTools": "ALL TOOLS", + "quickAccess": "QUICK ACCESS", + "categories": { + "standardTools": "Standard Tools", + "advancedTools": "Advanced Tools", + "recommendedTools": "Recommended Tools" + }, + "subcategories": { + "signing": "Signing", + "documentSecurity": "Document Security", + "verification": "Verification", + "documentReview": "Document Review", + "pageFormatting": "Page Formatting", + "extraction": "Extraction", + "removal": "Removal", + "automation": "Automation", + "general": "General", + "advancedFormatting": "Advanced Formatting", + "developerTools": "Developer Tools" + } }, "quickAccess": { - "sign": "āš€ā¸‹āš‡ā¸™ā¸Šā¸ˇāšˆā¸­" + "read": "Read", + "sign": "āš€ā¸‹āš‡ā¸™ā¸Šā¸ˇāšˆā¸­", + "automate": "Automate", + "files": "Files", + "activity": "Activity", + "help": "Help", + "account": "Account", + "config": "Config", + "adminSettings": "Admin Settings", + "allTools": "All Tools" + }, + "admin": { + "error": "Error", + "success": "Success", + "expand": "Expand", + "close": "Close", + "status": { + "active": "Active", + "inactive": "Inactive" + }, + "settings": { + "title": "Admin Settings", + "workspace": "Workspace", + "fetchError": "Failed to load settings", + "saveError": "Failed to save settings", + "saved": "Settings saved successfully", + "saveSuccess": "Settings saved successfully", + "save": "Save Changes", + "restartRequired": "Restart Required", + "restart": { + "title": "Restart Required", + "message": "Settings have been saved successfully. A server restart is required for the changes to take effect.", + "question": "Would you like to restart the server now or later?", + "now": "Restart Now", + "later": "Restart Later" + }, + "restarting": "Restarting Server", + "restartingMessage": "The server is restarting. Please wait a moment...", + "restartError": "Failed to restart server. Please restart manually.", + "general": { + "title": "System Settings", + "description": "Configure system-wide application settings including branding and default behaviour.", + "ui": "User Interface", + "system": "System", + "appName": { + "label": "Application Name", + "description": "The name displayed in the browser tab and home page" + }, + "appNameNavbar": { + "label": "Navbar Brand", + "description": "The name displayed in the navigation bar" + }, + "homeDescription": { + "label": "Home Description", + "description": "The description text shown on the home page" + }, + "defaultLocale": { + "label": "Default Locale", + "description": "The default language for new users (e.g., en_US, es_ES)" + }, + "fileUploadLimit": { + "label": "File Upload Limit", + "description": "Maximum file upload size (e.g., 100MB, 1GB)" + }, + "showUpdate": { + "label": "Show Update Notifications", + "description": "Display notifications when a new version is available" + }, + "showUpdateOnlyAdmin": { + "label": "Show Updates to Admins Only", + "description": "Restrict update notifications to admin users only" + }, + "customHTMLFiles": { + "label": "Custom HTML Files", + "description": "Allow serving custom HTML files from the customFiles directory" + }, + "languages": { + "label": "Available Languages", + "description": "Languages that users can select from (leave empty to enable all languages)" + }, + "customMetadata": { + "label": "Custom Metadata", + "autoUpdate": { + "label": "Auto Update Metadata", + "description": "Automatically update PDF metadata on all processed documents" + }, + "author": { + "label": "Default Author", + "description": "Default author for PDF metadata (e.g., username)" + }, + "creator": { + "label": "Default Creator", + "description": "Default creator for PDF metadata" + }, + "producer": { + "label": "Default Producer", + "description": "Default producer for PDF metadata" + } + }, + "customPaths": { + "label": "Custom Paths", + "description": "Configure custom file system paths for pipeline processing and external tools", + "pipeline": { + "label": "Pipeline Directories", + "watchedFoldersDir": { + "label": "Watched Folders Directory", + "description": "Directory where pipeline monitors for incoming PDFs (leave empty for default: /pipeline/watchedFolders)" + }, + "finishedFoldersDir": { + "label": "Finished Folders Directory", + "description": "Directory where processed PDFs are outputted (leave empty for default: /pipeline/finishedFolders)" + } + }, + "operations": { + "label": "External Tool Paths", + "weasyprint": { + "label": "WeasyPrint Executable", + "description": "Path to WeasyPrint executable for HTML to PDF conversion (leave empty for default: /opt/venv/bin/weasyprint)" + }, + "unoconvert": { + "label": "Unoconvert Executable", + "description": "Path to LibreOffice unoconvert for document conversions (leave empty for default: /opt/venv/bin/unoconvert)" + } + } + } + }, + "security": { + "title": "Security", + "description": "Configure authentication, login behaviour, and security policies.", + "ssoNotice": { + "title": "Looking for SSO/SAML settings?", + "message": "OAuth2 and SAML2 authentication providers have been moved to the Connections menu for easier management." + }, + "authentication": "Authentication", + "enableLogin": { + "label": "Enable Login", + "description": "Require users to log in before accessing the application" + }, + "loginMethod": { + "label": "Login Method", + "description": "The authentication method to use for user login", + "all": "All Methods", + "normal": "Username/Password Only", + "oauth2": "OAuth2 Only", + "saml2": "SAML2 Only" + }, + "loginAttemptCount": { + "label": "Login Attempt Limit", + "description": "Maximum number of failed login attempts before account lockout" + }, + "loginResetTimeMinutes": { + "label": "Login Reset Time (minutes)", + "description": "Time before failed login attempts are reset" + }, + "csrfDisabled": { + "label": "Disable CSRF Protection", + "description": "Disable Cross-Site Request Forgery protection (not recommended)" + }, + "initialLogin": { + "label": "Initial Login", + "username": { + "label": "Initial Username", + "description": "The username for the initial admin account" + }, + "password": { + "label": "Initial Password", + "description": "The password for the initial admin account" + } + }, + "jwt": { + "label": "JWT Configuration", + "secureCookie": { + "label": "Secure Cookie", + "description": "Require HTTPS for JWT cookies (recommended for production)" + }, + "keyRetentionDays": { + "label": "Key Retention Days", + "description": "Number of days to retain old JWT keys for verification" + }, + "persistence": { + "label": "Enable Key Persistence", + "description": "Store JWT keys persistently to survive server restarts" + }, + "enableKeyRotation": { + "label": "Enable Key Rotation", + "description": "Automatically rotate JWT signing keys periodically" + }, + "enableKeyCleanup": { + "label": "Enable Key Cleanup", + "description": "Automatically remove expired JWT keys" + } + }, + "audit": { + "label": "Audit Logging", + "enabled": { + "label": "Enable Audit Logging", + "description": "Track user actions and system events for compliance and security monitoring" + }, + "level": { + "label": "Audit Level", + "description": "0=OFF, 1=BASIC, 2=STANDARD, 3=VERBOSE" + }, + "retentionDays": { + "label": "Audit Retention (days)", + "description": "Number of days to retain audit logs" + } + }, + "htmlUrlSecurity": { + "label": "HTML URL Security", + "description": "Configure URL access restrictions for HTML processing to prevent SSRF attacks", + "enabled": { + "label": "Enable URL Security", + "description": "Enable URL security restrictions for HTML to PDF conversions" + }, + "level": { + "label": "Security Level", + "description": "MAX: whitelist only, MEDIUM: block internal networks, OFF: no restrictions", + "max": "Maximum (Whitelist Only)", + "medium": "Medium (Block Internal)", + "off": "Off (No Restrictions)" + }, + "advanced": "Advanced Settings", + "allowedDomains": { + "label": "Allowed Domains (Whitelist)", + "description": "One domain per line (e.g., cdn.example.com). Only these domains allowed when level is MAX" + }, + "blockedDomains": { + "label": "Blocked Domains (Blacklist)", + "description": "One domain per line (e.g., malicious.com). Additional domains to block" + }, + "internalTlds": { + "label": "Internal TLDs", + "description": "One TLD per line (e.g., .local, .internal). Block domains with these TLD patterns" + }, + "networkBlocking": "Network Blocking", + "blockPrivateNetworks": { + "label": "Block Private Networks", + "description": "Block RFC 1918 private networks (10.x.x.x, 192.168.x.x, 172.16-31.x.x)" + }, + "blockLocalhost": { + "label": "Block Localhost", + "description": "Block localhost and loopback addresses (127.x.x.x, ::1)" + }, + "blockLinkLocal": { + "label": "Block Link-Local Addresses", + "description": "Block link-local addresses (169.254.x.x, fe80::/10)" + }, + "blockCloudMetadata": { + "label": "Block Cloud Metadata Endpoints", + "description": "Block cloud provider metadata endpoints (169.254.169.254)" + } + } + }, + "connections": { + "title": "Connections", + "description": "Configure external authentication providers like OAuth2 and SAML.", + "linkedServices": "Linked Services", + "unlinkedServices": "Unlinked Services", + "connect": "Connect", + "disconnect": "Disconnect", + "disconnected": "Provider disconnected successfully", + "disconnectError": "Failed to disconnect provider", + "ssoAutoLogin": { + "label": "SSO Auto Login", + "enable": "Enable SSO Auto Login", + "description": "Automatically redirect to SSO login when authentication is required" + }, + "oauth2": { + "label": "OAuth2", + "enabled": { + "label": "Enable OAuth2", + "description": "Allow users to authenticate using OAuth2 providers" + }, + "provider": { + "label": "Provider", + "description": "The OAuth2 provider to use for authentication" + }, + "issuer": { + "label": "Issuer URL", + "description": "The OAuth2 provider issuer URL" + }, + "clientId": { + "label": "Client ID", + "description": "The OAuth2 client ID from your provider" + }, + "clientSecret": { + "label": "Client Secret", + "description": "The OAuth2 client secret from your provider" + }, + "useAsUsername": { + "label": "Use as Username", + "description": "The OAuth2 claim to use as the username (e.g., email, sub)" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first OAuth2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via OAuth2" + }, + "scopes": { + "label": "OAuth2 Scopes", + "description": "Comma-separated list of OAuth2 scopes to request (e.g., openid, profile, email)" + } + }, + "saml2": { + "label": "SAML2", + "enabled": { + "label": "Enable SAML2", + "description": "Allow users to authenticate using SAML2 providers" + }, + "provider": { + "label": "Provider", + "description": "The SAML2 provider name" + }, + "registrationId": { + "label": "Registration ID", + "description": "The SAML2 registration identifier" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first SAML2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via SAML2" + } + } + }, + "database": { + "title": "Database", + "description": "Configure custom database connection settings for enterprise deployments.", + "configuration": "Database Configuration", + "enableCustom": { + "label": "Enable Custom Database", + "description": "Use your own custom database configuration instead of the default embedded database" + }, + "customUrl": { + "label": "Custom Database URL", + "description": "Full JDBC connection string (e.g., jdbc:postgresql://localhost:5432/postgres). If provided, individual connection settings below are not used." + }, + "type": { + "label": "Database Type", + "description": "Type of database (not used if custom URL is provided)" + }, + "hostName": { + "label": "Host Name", + "description": "Database server hostname (not used if custom URL is provided)" + }, + "port": { + "label": "Port", + "description": "Database server port (not used if custom URL is provided)" + }, + "name": { + "label": "Database Name", + "description": "Name of the database (not used if custom URL is provided)" + }, + "username": { + "label": "Username", + "description": "Database authentication username" + }, + "password": { + "label": "Password", + "description": "Database authentication password" + } + }, + "privacy": { + "title": "Privacy", + "description": "Configure privacy and data collection settings.", + "analytics": "Analytics & Tracking", + "enableAnalytics": { + "label": "Enable Analytics", + "description": "Collect anonymous usage analytics to help improve the application" + }, + "metricsEnabled": { + "label": "Enable Metrics", + "description": "Enable collection of performance and usage metrics. Provides API endpoint for admins to access metrics data" + }, + "searchEngine": "Search Engine Visibility", + "googleVisibility": { + "label": "Google Visibility", + "description": "Allow search engines to index this application" + } + }, + "advanced": { + "title": "Advanced", + "description": "Configure advanced features and experimental functionality.", + "features": "Feature Flags", + "processing": "Processing", + "endpoints": { + "label": "Endpoints", + "manage": "Manage API Endpoints", + "description": "Endpoint management is configured via YAML. See documentation for details on enabling/disabling specific endpoints." + }, + "enableAlphaFunctionality": { + "label": "Enable Alpha Features", + "description": "Enable experimental and alpha-stage features (may be unstable)" + }, + "enableUrlToPDF": { + "label": "Enable URL to PDF", + "description": "Allow conversion of web pages to PDF documents" + }, + "maxDPI": { + "label": "Maximum DPI", + "description": "Maximum DPI for image processing (0 = unlimited)" + }, + "tessdataDir": { + "label": "Tessdata Directory", + "description": "Path to the tessdata directory for OCR language files" + }, + "disableSanitize": { + "label": "Disable HTML Sanitization", + "description": "WARNING: Security risk - disabling HTML sanitization can lead to XSS vulnerabilities" + }, + "tempFileManagement": { + "label": "Temp File Management", + "description": "Configure temporary file storage and cleanup behavior", + "baseTmpDir": { + "label": "Base Temp Directory", + "description": "Base directory for temporary files (leave empty for default: java.io.tmpdir/stirling-pdf)" + }, + "libreofficeDir": { + "label": "LibreOffice Temp Directory", + "description": "Directory for LibreOffice temp files (leave empty for default: baseTmpDir/libreoffice)" + }, + "systemTempDir": { + "label": "System Temp Directory", + "description": "System temp directory to clean (only used if cleanupSystemTemp is enabled)" + }, + "prefix": { + "label": "Temp File Prefix", + "description": "Prefix for temp file names" + }, + "maxAgeHours": { + "label": "Max Age (hours)", + "description": "Maximum age in hours before temp files are cleaned up" + }, + "cleanupIntervalMinutes": { + "label": "Cleanup Interval (minutes)", + "description": "How often to run cleanup (in minutes)" + }, + "startupCleanup": { + "label": "Startup Cleanup", + "description": "Clean up old temp files on application startup" + }, + "cleanupSystemTemp": { + "label": "Cleanup System Temp", + "description": "Whether to clean broader system temp directory (use with caution)" + } + }, + "processExecutor": { + "label": "Process Executor Limits", + "description": "Configure session limits and timeouts for each process executor", + "sessionLimit": { + "label": "Session Limit", + "description": "Maximum concurrent instances" + }, + "timeout": { + "label": "Timeout (minutes)", + "description": "Maximum execution time" + }, + "libreOffice": "LibreOffice", + "pdfToHtml": "PDF to HTML", + "qpdf": "QPDF", + "tesseract": "Tesseract OCR", + "pythonOpenCv": "Python OpenCV", + "weasyPrint": "WeasyPrint", + "installApp": "Install App", + "calibre": "Calibre", + "ghostscript": "Ghostscript", + "ocrMyPdf": "OCRmyPDF" + } + }, + "mail": { + "title": "Mail Server", + "description": "Configure SMTP settings for sending email notifications.", + "smtp": "SMTP Configuration", + "enabled": { + "label": "Enable Mail", + "description": "Enable email notifications and SMTP functionality" + }, + "host": { + "label": "SMTP Host", + "description": "The hostname or IP address of your SMTP server" + }, + "port": { + "label": "SMTP Port", + "description": "The port number for SMTP connection (typically 25, 465, or 587)" + }, + "username": { + "label": "SMTP Username", + "description": "Username for SMTP authentication" + }, + "password": { + "label": "SMTP Password", + "description": "Password for SMTP authentication" + }, + "from": { + "label": "From Address", + "description": "The email address to use as the sender" + }, + "enableInvites": { + "label": "Enable Email Invites", + "description": "Allow admins to invite users via email with auto-generated passwords" + }, + "frontendUrl": { + "label": "Frontend URL", + "description": "Base URL for frontend (e.g. https://pdf.example.com). Used for generating invite links in emails. Leave empty to use backend URL." + } + }, + "legal": { + "title": "Legal Documents", + "description": "Configure links to legal documents and policies.", + "disclaimer": { + "title": "Legal Responsibility Warning", + "message": "By customizing these legal documents, you assume full responsibility for ensuring compliance with all applicable laws and regulations, including but not limited to GDPR and other EU data protection requirements. Only modify these settings if: (1) you are operating a personal/private instance, (2) you are outside EU jurisdiction and understand your local legal obligations, or (3) you have obtained proper legal counsel and accept sole responsibility for all user data and legal compliance. Stirling-PDF and its developers assume no liability for your legal obligations." + }, + "termsAndConditions": { + "label": "Terms and Conditions", + "description": "URL or filename to terms and conditions" + }, + "privacyPolicy": { + "label": "Privacy Policy", + "description": "URL or filename to privacy policy" + }, + "accessibilityStatement": { + "label": "Accessibility Statement", + "description": "URL or filename to accessibility statement" + }, + "cookiePolicy": { + "label": "Cookie Policy", + "description": "URL or filename to cookie policy" + }, + "impressum": { + "label": "Impressum", + "description": "URL or filename to impressum (required in some jurisdictions)" + } + }, + "premium": { + "title": "Premium & Enterprise", + "description": "Configure your premium or enterprise license key.", + "license": "License Configuration", + "key": { + "label": "License Key", + "description": "Enter your premium or enterprise license key" + }, + "enabled": { + "label": "Enable Premium Features", + "description": "Enable license key checks for pro/enterprise features" + }, + "movedFeatures": { + "title": "Premium Features Distributed", + "message": "Premium and Enterprise features are now organized in their respective sections:" + } + }, + "features": { + "title": "Features", + "description": "Configure optional features and functionality.", + "serverCertificate": { + "label": "Server Certificate", + "description": "Configure server-side certificate generation for \"Sign with Stirling-PDF\" functionality", + "enabled": { + "label": "Enable Server Certificate", + "description": "Enable server-side certificate for \"Sign with Stirling-PDF\" option" + }, + "organizationName": { + "label": "Organization Name", + "description": "Organization name for generated certificates" + }, + "validity": { + "label": "Certificate Validity (days)", + "description": "Number of days the certificate will be valid" + }, + "regenerateOnStartup": { + "label": "Regenerate on Startup", + "description": "Generate new certificate on each application startup" + } + } + }, + "endpoints": { + "title": "API Endpoints", + "description": "Control which API endpoints and endpoint groups are available.", + "management": "Endpoint Management", + "toRemove": { + "label": "Disabled Endpoints", + "description": "Select individual endpoints to disable" + }, + "groupsToRemove": { + "label": "Disabled Endpoint Groups", + "description": "Select endpoint groups to disable" + }, + "note": "Note: Disabling endpoints restricts API access but does not remove UI components. Restart required for changes to take effect." + } + } }, "fileUpload": { - "loading": "⏁⏺ā¸Ĩā¸ąā¸‡āš‚ā¸Ģā¸Ĩ⏔..." + "selectFile": "Select a file", + "selectFiles": "Select files", + "selectPdfToView": "Select a PDF to view", + "selectPdfToEdit": "Select a PDF to edit", + "chooseFromStorage": "Choose a file from storage or upload a new PDF", + "chooseFromStorageMultiple": "Choose files from storage or upload new PDFs", + "loadFromStorage": "Load from Storage", + "filesAvailable": "files available", + "loading": "⏁⏺ā¸Ĩā¸ąā¸‡āš‚ā¸Ģā¸Ĩ⏔...", + "or": "or", + "dropFileHere": "Drop file here or click to upload", + "dropFilesHere": "Drop files here or click the upload button", + "pdfFilesOnly": "PDF files only", + "supportedFileTypes": "Supported file types", + "upload": "Upload", + "uploadFile": "Upload File", + "uploadFiles": "Upload Files", + "noFilesInStorage": "No files available in storage. Upload some files first.", + "selectFromStorage": "Select from Storage", + "backToTools": "Back to Tools", + "addFiles": "Add Files", + "dragFilesInOrClick": "Drag files in or click \"Add Files\" to browse" + }, + "fileEditor": { + "addFiles": "Add Files" }, "fileManager": { + "title": "Upload PDF Files", + "subtitle": "Add files to your storage for easy access across tools", + "filesSelected": "files selected", + "clearSelection": "Clear Selection", + "openInFileEditor": "Open in File Editor", + "uploadError": "Failed to upload some files.", + "failedToOpen": "Failed to open file. It may have been removed from storage.", + "failedToLoad": "Failed to load file to active set.", + "storageCleared": "Browser cleared storage. Files have been removed. Please re-upload.", + "clearAll": "Clear All", + "reloadFiles": "Reload Files", + "dragDrop": "Drag & Drop files here", + "clickToUpload": "Click to upload files", + "selectedFiles": "Selected Files", + "storage": "Storage", + "filesStored": "files stored", + "storageError": "Storage error occurred", + "storageLow": "Storage is running low. Consider removing old files.", + "supportMessage": "Powered by browser database storage for unlimited capacity", + "noFileSelected": "No files selected", + "showHistory": "Show History", + "hideHistory": "Hide History", + "fileHistory": "File History", + "loadingHistory": "Loading History...", + "lastModified": "Last Modified", + "toolChain": "Tools Applied", + "restore": "Restore", + "unzip": "Unzip", + "searchFiles": "Search files...", + "recent": "Recent", + "localFiles": "Local Files", + "googleDrive": "Google Drive", + "googleDriveShort": "Drive", + "myFiles": "My Files", + "noRecentFiles": "No recent files found", + "googleDriveNotAvailable": "Google Drive integration not available", + "openFiles": "Open Files", + "openFile": "Open File", + "details": "File Details", "fileName": "ā¸Šā¸ˇāšˆā¸­", + "fileFormat": "Format", + "fileSize": "Size", "fileVersion": "āš€ā¸§ā¸­ā¸ŖāšŒā¸Šā¸ąā¸™", + "totalSelected": "Total Selected", + "dropFilesHere": "Drop files here", + "selectAll": "Select All", + "deselectAll": "Deselect All", + "deleteSelected": "Delete Selected", + "downloadSelected": "Download Selected", + "selectedCount": "{{count}} selected", "download": "ā¸”ā¸˛ā¸§ā¸™āšŒāš‚ā¸Ģā¸Ĩ⏔", - "delete": "ā¸Ĩ⏚" + "delete": "ā¸Ĩ⏚", + "unsupported": "Unsupported", + "addToUpload": "Add to Upload", + "deleteAll": "Delete All", + "loadingFiles": "Loading files...", + "noFiles": "No files available", + "noFilesFound": "No files found matching your search", + "openInPageEditor": "Open in Page Editor", + "showAll": "Show All", + "sortByDate": "Sort by Date", + "sortByName": "Sort by Name", + "sortBySize": "Sort by Size" + }, + "storage": { + "temporaryNotice": "Files are stored temporarily in your browser and may be cleared automatically", + "storageLimit": "Storage limit", + "storageUsed": "Temporary Storage used", + "storageFull": "Storage is nearly full. Consider removing some files.", + "fileTooLarge": "File too large. Maximum size per file is", + "storageQuotaExceeded": "Storage quota exceeded. Please remove some files before uploading more.", + "approximateSize": "Approximate size" }, "sanitize": { + "title": "Sanitise", + "desc": "Remove potentially harmful elements from PDF files.", "submit": "ā¸—ā¸ŗā¸„ā¸§ā¸˛ā¸Ąā¸Ē⏰⏭⏞⏔ PDF", + "completed": "Sanitisation completed successfully", + "error": { + "generic": "Sanitisation failed", + "failed": "An error occurred while sanitising the PDF." + }, + "filenamePrefix": "sanitised", + "sanitizationResults": "Sanitisation Results", "steps": { - "settings": "ā¸ā¸˛ā¸Ŗā¸•ā¸ąāš‰ā¸‡ā¸„āšˆā¸˛" + "files": "Files", + "settings": "ā¸ā¸˛ā¸Ŗā¸•ā¸ąāš‰ā¸‡ā¸„āšˆā¸˛", + "results": "Results" + }, + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "options": { + "title": "Sanitisation Options", + "note": "Select the elements you want to remove from the PDF. At least one option must be selected.", + "removeJavaScript": { + "label": "Remove JavaScript", + "desc": "Remove JavaScript actions and scripts from the PDF" + }, + "removeEmbeddedFiles": { + "label": "Remove Embedded Files", + "desc": "Remove any files embedded within the PDF" + }, + "removeXMPMetadata": { + "label": "Remove XMP Metadata", + "desc": "Remove XMP metadata from the PDF" + }, + "removeMetadata": { + "label": "Remove Document Metadata", + "desc": "Remove document information metadata (title, author, etc.)" + }, + "removeLinks": { + "label": "Remove Links", + "desc": "Remove external links and launch actions from the PDF" + }, + "removeFonts": { + "label": "Remove Fonts", + "desc": "Remove embedded fonts from the PDF" + } + } + }, + "addPassword": { + "title": "āš€ā¸žā¸´āšˆā¸Ąā¸Ŗā¸Ģā¸ąā¸Ēā¸œāšˆā¸˛ā¸™", + "desc": "Encrypt your PDF document with a password.", + "completed": "Password protection applied", + "submit": "āš€ā¸‚āš‰ā¸˛ā¸Ŗā¸Ģā¸ąā¸Ē", + "filenamePrefix": "encrypted", + "error": { + "failed": "An error occurred while encrypting the PDF." + }, + "passwords": { + "stepTitle": "Passwords & Encryption", + "completed": "Passwords configured", + "user": { + "label": "User Password", + "placeholder": "Enter user password" + }, + "owner": { + "label": "Owner Password", + "placeholder": "Enter owner password" + } + }, + "encryption": { + "keyLength": { + "label": "Encryption Key Length", + "40bit": "40-bit (Low)", + "128bit": "128-bit (Standard)", + "256bit": "256-bit (High)" + } + }, + "results": { + "title": "Encrypted PDFs" + }, + "tooltip": { + "header": { + "title": "Password Protection Overview" + }, + "passwords": { + "title": "Password Types", + "text": "User passwords restrict opening the document, while owner passwords control what can be done with the document once opened. You can set both or just one.", + "bullet1": "User Password: Required to open the PDF", + "bullet2": "Owner Password: Controls document permissions (not supported by all PDF viewers)" + }, + "encryption": { + "title": "Encryption Levels", + "text": "Higher encryption levels provide better security but may not be supported by older PDF viewers.", + "bullet1": "40-bit: Basic security, compatible with older viewers", + "bullet2": "128-bit: Standard security, widely supported", + "bullet3": "256-bit: Maximum security, requires modern viewers" + }, + "permissions": { + "title": "āš€ā¸›ā¸Ĩā¸ĩāšˆā¸ĸ⏙ā¸Ēā¸´ā¸—ā¸˜ā¸´āšŒ", + "text": "These permissions control what users can do with the PDF. Most effective when combined with an owner password." + } + }, + "tags": "⏛ā¸Ĩā¸­ā¸”ā¸ ā¸ąā¸ĸ, ā¸„ā¸§ā¸˛ā¸Ąā¸›ā¸Ĩā¸­ā¸”ā¸ ā¸ąā¸ĸ", + "header": "āš€ā¸žā¸´āšˆā¸Ąā¸Ŗā¸Ģā¸ąā¸Ēā¸œāšˆā¸˛ā¸™ (āš€ā¸‚āš‰ā¸˛ā¸Ŗā¸Ģā¸ąā¸Ē)", + "selectText": { + "1": "āš€ā¸Ĩ⏎⏭⏁ PDF āš€ā¸žā¸ˇāšˆā¸­āš€ā¸‚āš‰ā¸˛ā¸Ŗā¸Ģā¸ąā¸Ē", + "2": "⏪ā¸Ģā¸ąā¸Ēā¸œāšˆā¸˛ā¸™ā¸œā¸šāš‰āšƒā¸Šāš‰", + "3": "ā¸„ā¸§ā¸˛ā¸Ąā¸ĸ⏞⏧⏄ā¸ĩā¸ĸāšŒā¸ā¸˛ā¸Ŗāš€ā¸‚āš‰ā¸˛ā¸Ŗā¸Ģā¸ąā¸Ē", + "4": "ā¸„āšˆā¸˛ā¸Ēā¸šā¸‡ā¸ā¸§āšˆā¸˛ā¸Ąā¸ĩā¸„ā¸§ā¸˛ā¸Ąāšā¸‚āš‡ā¸‡āšā¸ā¸Ŗāšˆā¸‡ā¸ā¸§āšˆā¸˛ āšā¸•āšˆā¸„āšˆā¸˛ā¸•āšˆā¸ŗā¸ā¸§āšˆā¸˛āš€ā¸‚āš‰ā¸˛ā¸ā¸ąā¸™āš„ā¸”āš‰ā¸”ā¸ĩā¸ā¸§āšˆā¸˛", + "5": "ā¸Ēā¸´ā¸—ā¸˜ā¸´āšŒā¸—ā¸ĩāšˆā¸•ā¸ąāš‰ā¸‡ā¸„āšˆā¸˛ (āšā¸™ā¸°ā¸™ā¸ŗāšƒā¸Ģāš‰āšƒā¸Šāš‰ā¸žā¸Ŗāš‰ā¸­ā¸Ąā¸Ŗā¸Ģā¸ąā¸Ēā¸œāšˆā¸˛ā¸™ā¸œā¸šāš‰ā¸”ā¸šāšā¸Ĩ)", + "6": "ā¸›āš‰ā¸­ā¸‡ā¸ā¸ąā¸™ā¸ā¸˛ā¸Ŗā¸›ā¸Ŗā¸°ā¸ā¸­ā¸šāš€ā¸­ā¸ā¸Ē⏞⏪", + "7": "ā¸›āš‰ā¸­ā¸‡ā¸ā¸ąā¸™ā¸ā¸˛ā¸Ŗā¸Ēā¸ā¸ąā¸”āš€ā¸™ā¸ˇāš‰ā¸­ā¸Ģ⏞", + "8": "ā¸›āš‰ā¸­ā¸‡ā¸ā¸ąā¸™ā¸ā¸˛ā¸Ŗā¸Ēā¸ā¸ąā¸”āš€ā¸žā¸ˇāšˆā¸­ā¸ā¸˛ā¸Ŗāš€ā¸‚āš‰ā¸˛ā¸–ā¸ļ⏇", + "9": "ā¸›āš‰ā¸­ā¸‡ā¸ā¸ąā¸™ā¸ā¸˛ā¸Ŗā¸ā¸Ŗā¸­ā¸āšā¸šā¸šā¸Ÿā¸­ā¸ŖāšŒā¸Ą", + "10": "ā¸›āš‰ā¸­ā¸‡ā¸ā¸ąā¸™ā¸ā¸˛ā¸Ŗāšā¸āš‰āš„ā¸‚", + "11": "ā¸›āš‰ā¸­ā¸‡ā¸ā¸ąā¸™ā¸ā¸˛ā¸Ŗāšā¸āš‰āš„ā¸‚ā¸„ā¸ŗā¸­ā¸˜ā¸´ā¸šā¸˛ā¸ĸā¸›ā¸Ŗā¸°ā¸ā¸­ā¸š", + "12": "ā¸›āš‰ā¸­ā¸‡ā¸ā¸ąā¸™ā¸ā¸˛ā¸Ŗā¸žā¸´ā¸Ąā¸žāšŒ", + "13": "ā¸›āš‰ā¸­ā¸‡ā¸ā¸ąā¸™ā¸ā¸˛ā¸Ŗā¸žā¸´ā¸Ąā¸žāšŒā¸Ŗā¸šā¸›āšā¸šā¸šā¸•āšˆā¸˛ā¸‡āš†", + "14": "⏪ā¸Ģā¸ąā¸Ēā¸œāšˆā¸˛ā¸™ā¸œā¸šāš‰ā¸”ā¸šāšā¸Ĩ", + "15": "ā¸ˆā¸ŗā¸ā¸ąā¸”ā¸Ēā¸´āšˆā¸‡ā¸—ā¸ĩāšˆā¸Ēā¸˛ā¸Ąā¸˛ā¸Ŗā¸–ā¸—ā¸ŗāš„ā¸”āš‰ā¸ā¸ąā¸šāš€ā¸­ā¸ā¸Ēā¸˛ā¸Ŗāš€ā¸Ąā¸ˇāšˆā¸­āš€ā¸›ā¸´ā¸” (āš„ā¸Ąāšˆā¸Ŗā¸­ā¸‡ā¸Ŗā¸ąā¸šāš‚ā¸”ā¸ĸā¸œā¸šāš‰ā¸­āšˆā¸˛ā¸™ā¸—ā¸ąāš‰ā¸‡ā¸Ģā¸Ąā¸”)", + "16": "ā¸ˆā¸ŗā¸ā¸ąā¸”ā¸ā¸˛ā¸Ŗāš€ā¸›ā¸´ā¸”āš€ā¸­ā¸ā¸Ē⏞⏪" } }, "changePermissions": { "title": "āš€ā¸›ā¸Ĩā¸ĩāšˆā¸ĸ⏙ā¸Ēā¸´ā¸—ā¸˜ā¸´āšŒ", + "desc": "Change document restrictions and permissions.", + "completed": "Permissions changed", "submit": "āš€ā¸›ā¸Ĩā¸ĩāšˆā¸ĸ⏙ā¸Ēā¸´ā¸—ā¸˜ā¸´āšŒ", + "error": { + "failed": "An error occurred while changing PDF permissions." + }, "permissions": { "preventAssembly": { "label": "ā¸›āš‰ā¸­ā¸‡ā¸ā¸ąā¸™ā¸ā¸˛ā¸Ŗā¸›ā¸Ŗā¸°ā¸ā¸­ā¸šāš€ā¸­ā¸ā¸Ē⏞⏪" @@ -1728,10 +4580,784 @@ "label": "ā¸›āš‰ā¸­ā¸‡ā¸ā¸ąā¸™ā¸ā¸˛ā¸Ŗā¸žā¸´ā¸Ąā¸žāšŒā¸Ŗā¸šā¸›āšā¸šā¸šā¸•āšˆā¸˛ā¸‡āš†" } }, + "results": { + "title": "Modified PDFs" + }, "tooltip": { "header": { "title": "āš€ā¸›ā¸Ĩā¸ĩāšˆā¸ĸ⏙ā¸Ēā¸´ā¸—ā¸˜ā¸´āšŒ" + }, + "description": { + "text": "Changes document permissions, allowing/disallowing access to different features in PDF readers." + }, + "warning": { + "text": "To make these permissions unchangeable, use the Add Password tool to set an owner password." } } + }, + "removePassword": { + "title": "ā¸Ĩ⏚⏪ā¸Ģā¸ąā¸Ēā¸œāšˆā¸˛ā¸™", + "desc": "ā¸Ĩ⏚⏪ā¸Ģā¸ąā¸Ēā¸œāšˆā¸˛ā¸™ā¸ˆā¸˛ā¸ā¸ā¸˛ā¸Ŗā¸›āš‰ā¸­ā¸‡ā¸ā¸ąā¸™āš€ā¸­ā¸ā¸Ē⏞⏪ PDF ⏂⏭⏇⏄⏏⏓", + "tags": "⏛ā¸Ĩā¸­ā¸”ā¸ ā¸ąā¸ĸ, ⏖⏭⏔⏪ā¸Ģā¸ąā¸Ē, ā¸„ā¸§ā¸˛ā¸Ąā¸›ā¸Ĩā¸­ā¸”ā¸ ā¸ąā¸ĸ, ā¸Ĩ⏚⏪ā¸Ģā¸ąā¸Ēā¸œāšˆā¸˛ā¸™", + "password": { + "stepTitle": "ā¸Ĩ⏚⏪ā¸Ģā¸ąā¸Ēā¸œāšˆā¸˛ā¸™", + "label": "⏪ā¸Ģā¸ąā¸Ēā¸œāšˆā¸˛ā¸™ā¸›ā¸ąā¸ˆā¸ˆā¸¸ā¸šā¸ąā¸™", + "placeholder": "Enter current password", + "completed": "Password configured" + }, + "filenamePrefix": "decrypted", + "error": { + "failed": "An error occurred while removing the password from the PDF." + }, + "tooltip": { + "description": "Removing password protection requires the password that was used to encrypt the PDF. This will decrypt the document, making it accessible without a password." + }, + "submit": "ā¸Ĩ⏚", + "results": { + "title": "Decrypted PDFs" + }, + "header": "ā¸Ĩ⏚⏪ā¸Ģā¸ąā¸Ēā¸œāšˆā¸˛ā¸™ (⏖⏭⏔⏪ā¸Ģā¸ąā¸Ē)", + "selectText": { + "1": "āš€ā¸Ĩ⏎⏭⏁ PDF ⏗ā¸ĩāšˆā¸•āš‰ā¸­ā¸‡ā¸ā¸˛ā¸Ŗā¸–ā¸­ā¸”ā¸Ŗā¸Ģā¸ąā¸Ē", + "2": "⏪ā¸Ģā¸ąā¸Ēā¸œāšˆā¸˛ā¸™" + } + }, + "automate": { + "title": "Automate", + "desc": "Build multi-step workflows by chaining together PDF actions. Ideal for recurring tasks.", + "invalidStep": "Invalid step", + "files": { + "placeholder": "Select files to process with this automation" + }, + "selection": { + "title": "Automation Selection", + "saved": { + "title": "Saved" + }, + "createNew": { + "title": "Create New Automation" + }, + "suggested": { + "title": "Suggested" + } + }, + "creation": { + "createTitle": "Create Automation", + "editTitle": "Edit Automation", + "intro": "Automations run tools sequentially. To get started, add tools in the order you want them to run.", + "name": { + "label": "Automation Name", + "placeholder": "My Automation" + }, + "description": { + "label": "Description (optional)", + "placeholder": "Describe what this automation does..." + }, + "tools": { + "selectTool": "Select a tool...", + "selected": "Selected Tools", + "remove": "Remove tool", + "configure": "Configure tool", + "notConfigured": "! Not Configured", + "addTool": "Add Tool", + "add": "Add a tool..." + }, + "save": "Save Automation", + "unsavedChanges": { + "title": "Unsaved Changes", + "message": "You have unsaved changes. Are you sure you want to go back? All changes will be lost.", + "cancel": "Cancel", + "confirm": "Go Back" + }, + "icon": { + "label": "Icon" + } + }, + "run": { + "title": "Run Automation" + }, + "sequence": { + "unnamed": "Unnamed Automation", + "steps": "{{count}} steps", + "running": "Running Automation...", + "run": "Run Automation", + "finish": "Finish" + }, + "reviewTitle": "Automation Results", + "config": { + "loading": "Loading tool configuration...", + "noSettings": "This tool does not have configurable settings.", + "title": "Configure {{toolName}}", + "description": "Configure the settings for this tool. These settings will be applied when the automation runs.", + "cancel": "Cancel", + "save": "Save Configuration" + }, + "copyToSaved": "Copy to Saved" + }, + "automation": { + "suggested": { + "securePdfIngestion": "Secure PDF Ingestion", + "securePdfIngestionDesc": "Comprehensive PDF processing workflow that sanitises documents, applies OCR with cleanup, converts to PDF/A format for long-term archival, and optimises file size.", + "emailPreparation": "Email Preparation", + "emailPreparationDesc": "Optimises PDFs for email distribution by compressing files, splitting large documents into 20MB chunks for email compatibility, and removing metadata for privacy.", + "secureWorkflow": "Security Workflow", + "secureWorkflowDesc": "Secures PDF documents by removing potentially malicious content like JavaScript and embedded files, then adds password protection to prevent unauthorised access. Password is set to 'password' by default.", + "processImages": "Process Images", + "processImagesDesc": "Converts multiple image files into a single PDF document, then applies OCR technology to extract searchable text from the images." + } + }, + "common": { + "copy": "Copy", + "copied": "Copied!", + "refresh": "Refresh", + "retry": "Retry", + "remaining": "remaining", + "used": "used", + "available": "available", + "cancel": "Cancel", + "preview": "Preview" + }, + "config": { + "overview": { + "title": "Application Configuration", + "description": "Current application settings and configuration details." + }, + "account": { + "overview": { + "title": "Account Settings", + "manageAccountPreferences": "Manage your account preferences", + "guestDescription": "You are signed in as a guest. Consider upgrading your account above." + }, + "upgrade": { + "title": "Upgrade Guest Account", + "description": "Link your account to preserve your history and access more features!", + "socialLogin": "Upgrade with Social Account", + "linkWith": "Link with", + "emailPassword": "or enter your email & password", + "email": "Email", + "emailPlaceholder": "Enter your email", + "password": "Password (optional)", + "passwordPlaceholder": "Set a password", + "passwordNote": "Leave empty to use email verification only", + "upgradeButton": "Upgrade Account" + } + }, + "apiKeys": { + "description": "Your API key for accessing Stirling's suite of PDF tools. Copy it to your project or refresh to generate a new one.", + "publicKeyAriaLabel": "Public API key", + "copyKeyAriaLabel": "Copy API key", + "refreshAriaLabel": "Refresh API key", + "includedCredits": "Included credits", + "purchasedCredits": "Purchased credits", + "totalCredits": "Total Credits", + "chartAriaLabel": "Credits usage: included {{includedUsed}} of {{includedTotal}}, purchased {{purchasedUsed}} of {{purchasedTotal}}", + "nextReset": "Next Reset", + "lastApiUse": "Last API Use", + "overlayMessage": "Generate a key to see credits and available credits", + "label": "API Key", + "guestInfo": "Guest users do not receive API keys. Create an account to get an API key you can use in your applications.", + "goToAccount": "Go to Account", + "refreshModal": { + "title": "Refresh API Keys", + "warning": "âš ī¸ Warning: This action will generate new API keys and make your previous keys invalid.", + "impact": "Any applications or services currently using these keys will stop working until you update them with the new keys.", + "confirmPrompt": "Are you sure you want to continue?", + "confirmCta": "Refresh Keys" + }, + "generateError": "We couldn't generate your API key." + } + }, + "AddAttachmentsRequest": { + "attachments": "Select Attachments", + "info": "Select files to attach to your PDF. These files will be embedded and accessible through the PDF's attachment panel.", + "selectFiles": "Select Files to Attach", + "placeholder": "Choose files...", + "addMoreFiles": "Add more files...", + "selectedFiles": "Selected Files", + "submit": "Add Attachments", + "results": { + "title": "Attachment Results" + }, + "error": { + "failed": "Add attachments operation failed" + } + }, + "termsAndConditions": "Terms & Conditions", + "logOut": "Log out", + "addAttachments": { + "error": { + "failed": "An error occurred while adding attachments to the PDF." + } + }, + "autoRename": { + "description": "This tool will automatically rename PDF files based on their content. It analyzes the document to find the most suitable title from the text." + }, + "customPosition": "Custom Position", + "details": "Details", + "downloadUnavailable": "Download unavailable for this item", + "invalidUndoData": "Cannot undo: invalid operation data", + "margin": { + "large": "Large", + "medium": "Medium", + "small": "Small", + "xLarge": "Extra Large" + }, + "noFilesToUndo": "Cannot undo: no files were processed in the last operation", + "noOperationToUndo": "No operation to undo", + "noValidFiles": "No valid files to process", + "operationCancelled": "Operation cancelled", + "pageEdit": { + "deselectAll": "Select None", + "selectAll": "Select All" + }, + "quickPosition": "Quick Position", + "reorganizePages": { + "error": { + "failed": "Failed to reorganize pages" + }, + "results": { + "title": "Pages Reorganized" + }, + "settings": { + "title": "Settings" + }, + "submit": "Reorganize Pages" + }, + "replace-color": { + "options": { + "fill": "Fill colour", + "gradient": "Gradient" + }, + "previewOverlayOpacity": "Preview overlay opacity", + "previewOverlayTransparency": "Preview overlay transparency", + "previewOverlayVisibility": "Show preview overlay", + "selectText": { + "1": "Replace or Invert color Options", + "2": "Default(Default high contrast colors)", + "3": "Custom(Customized colors)", + "4": "Full-Invert(Invert all colors)", + "5": "High contrast color options", + "6": "white text on black background", + "7": "Black text on white background", + "8": "Yellow text on black background", + "9": "Green text on black background", + "10": "Choose text Color", + "11": "Choose background Color", + "12": "Choose start colour", + "13": "Choose end colour" + }, + "submit": "Replace", + "title": "Replace-Invert-Color", + "header": "Replace-Invert Color PDF" + }, + "size": "Size", + "submit": "Submit", + "success": "Success", + "tools": { + "noSearchResults": "No tools found", + "noTools": "No tools available" + }, + "undoDataMismatch": "Cannot undo: operation data is corrupted", + "undoFailed": "Failed to undo operation", + "undoQuotaError": "Cannot undo: insufficient storage space", + "undoStorageError": "Undo completed but some files could not be saved to storage", + "undoSuccess": "Operation undone successfully", + "unsupported": "Unsupported", + "onboarding": { + "welcomeModal": { + "title": "Welcome to Stirling PDF!", + "description": "Would you like to take a quick 1-minute tour to learn the key features and how to get started?", + "helpHint": "You can always access this tour later from the Help button in the bottom left.", + "startTour": "Start Tour", + "maybeLater": "Maybe Later", + "dontShowAgain": "Don't Show Again" + }, + "allTools": "This is the All Tools panel, where you can browse and select from all available PDF tools.", + "selectCropTool": "Let's select the Crop tool to demonstrate how to use one of the tools.", + "toolInterface": "This is the Crop tool interface. As you can see, there's not much there because we haven't added any PDF files to work with yet.", + "filesButton": "The Files button on the Quick Access bar allows you to upload PDFs to use the tools on.", + "fileSources": "You can upload new files or access recent files from here. For the tour, we'll just use a sample file.", + "workbench": "This is the Workbench - the main area where you view and edit your PDFs.", + "viewSwitcher": "Use these controls to select how you want to view your PDFs.", + "viewer": "The Viewer lets you read and annotate your PDFs.", + "pageEditor": "The Page Editor allows you to do various operations on the pages within your PDFs, such as reordering, rotating and deleting.", + "activeFiles": "The Active Files view shows all of the PDFs you have loaded into the tool, and allows you to select which ones to process.", + "fileCheckbox": "Clicking one of the files selects it for processing. You can select multiple files for batch operations.", + "selectControls": "The Right Rail contains buttons to quickly select/deselect all of your active PDFs, along with buttons to change the app's theme or language.", + "cropSettings": "Now that we've selected the file we want crop, we can configure the Crop tool to choose the area that we want to crop the PDF to.", + "runButton": "Once the tool has been configured, this button allows you to run the tool on all the selected PDFs.", + "results": "After the tool has finished running, the Review step will show a preview of the results in this panel, and allow you to undo the operation or download the file. ", + "fileReplacement": "The modified file will replace the original file in the Workbench automatically, allowing you to easily run it through more tools.", + "pinButton": "You can use the Pin button if you'd rather your files stay active after running tools on them.", + "wrapUp": "You're all set! You've learnt about the main areas of the app and how to use them. Click the Help button whenever you like to see this tour again.", + "previous": "Previous", + "next": "Next", + "finish": "Finish", + "startTour": "Start Tour", + "startTourDescription": "Take a guided tour of Stirling PDF's key features" + }, + "workspace": { + "title": "Workspace", + "people": { + "title": "People", + "description": "Manage workspace members and their permissions", + "loading": "Loading people...", + "searchMembers": "Search members...", + "addMembers": "Add Members", + "inviteMembers": { + "label": "Invite Members", + "subtitle": "Type or paste in emails below, separated by commas. Your workspace will be billed by members." + }, + "user": "User", + "role": "Role", + "team": "Team", + "status": "Status", + "actions": "Actions", + "noMembersFound": "No members found", + "active": "Active", + "disabled": "Disabled", + "activeSession": "Active session", + "member": "Member", + "admin": "Admin", + "roleDescriptions": { + "admin": "Can manage settings and invite members, with full administrative access.", + "member": "Can view and edit shared files, but cannot manage workspace settings or members." + }, + "editRole": "Edit Role", + "enable": "Enable", + "disable": "Disable", + "deleteUser": "Delete User", + "deleteUserSuccess": "User deleted successfully", + "deleteUserError": "Failed to delete user", + "confirmDelete": "Are you sure you want to delete this user? This action cannot be undone.", + "addMember": { + "title": "Add Member", + "username": "Username (Email)", + "usernamePlaceholder": "user@example.com", + "password": "Password", + "passwordPlaceholder": "Enter password", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "forcePasswordChange": "Force password change on first login", + "cancel": "Cancel", + "submit": "Add Member", + "usernameRequired": "Username and password are required", + "passwordTooShort": "Password must be at least 6 characters", + "success": "User created successfully", + "error": "Failed to create user" + }, + "editMember": { + "title": "Edit Member", + "editing": "Editing:", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "cancel": "Cancel", + "submit": "Update Member", + "success": "User updated successfully", + "error": "Failed to update user" + }, + "toggleEnabled": { + "success": "User status updated successfully", + "error": "Failed to update user status" + }, + "delete": { + "success": "User deleted successfully", + "error": "Failed to delete user" + }, + "emailInvite": { + "tab": "Email Invite", + "description": "Type or paste in emails below, separated by commas. Users will receive login credentials via email.", + "emails": "Email Addresses", + "emailsPlaceholder": "user1@example.com, user2@example.com", + "emailsRequired": "At least one email address is required", + "submit": "Send Invites", + "success": "user(s) invited successfully", + "partialSuccess": "Some invites failed", + "allFailed": "Failed to invite users", + "error": "Failed to send invites" + }, + "directInvite": { + "tab": "Direct Create" + }, + "inviteLinkTab": { + "tab": "Invite Link" + }, + "inviteLink": { + "description": "Generate a secure link that allows the user to set their own password", + "email": "Email Address", + "emailPlaceholder": "user@example.com (optional)", + "emailDescription": "Optional - leave blank for a general invite link that can be used by anyone", + "emailRequired": "Email address is required", + "emailOptional": "Optional - leave blank for a general invite link", + "emailRequiredForSend": "Email address is required to send email notification", + "expiryHours": "Expiry Hours", + "expiryDescription": "How many hours until the link expires", + "sendEmail": "Send invite link via email", + "sendEmailDescription": "If enabled, the invite link will be sent to the specified email address", + "smtpRequired": "SMTP not configured", + "generate": "Generate Link", + "generated": "Invite Link Generated", + "copied": "Link copied to clipboard", + "success": "Invite link generated successfully", + "successWithEmail": "Invite link generated and sent via email", + "emailFailed": "Invite link generated, but email failed", + "emailFailedDetails": "Error: {0}. Please share the invite link manually.", + "error": "Failed to generate invite link", + "submit": "Generate Invite Link" + }, + "inviteMode": { + "username": "Username", + "email": "Email", + "link": "Link", + "emailDisabled": "Email invites require SMTP configuration and mail.enableInvites=true in settings" + }, + "license": { + "users": "users", + "availableSlots": "Available Slots", + "grandfathered": "Grandfathered", + "grandfatheredShort": "{{count}} grandfathered", + "fromLicense": "from license", + "slotsAvailable": "{{count}} user slot(s) available", + "noSlotsAvailable": "No slots available", + "currentUsage": "Currently using {{current}} of {{max}} user licences" + } + }, + "teams": { + "title": "Teams", + "description": "Manage teams and organize workspace members", + "loading": "Loading teams...", + "loadingDetails": "Loading team details...", + "createNewTeam": "Create New Team", + "teamName": "Team Name", + "totalMembers": "Total Members", + "actions": "Actions", + "noTeamsFound": "No teams found", + "noMembers": "No members in this team", + "system": "System", + "addMember": "Add Member", + "viewTeam": "View Team", + "removeMember": "Remove from team", + "cannotRemoveFromSystemTeam": "Cannot remove from system team", + "renameTeamLabel": "Rename Team", + "deleteTeamLabel": "Delete Team", + "cannotDeleteInternal": "Cannot delete the Internal team", + "confirmDelete": "Are you sure you want to delete this team? This team must be empty to delete.", + "confirmRemove": "Remove user from this team?", + "cannotRenameInternal": "Cannot rename the Internal team", + "cannotAddToInternal": "Cannot add members to the Internal team", + "teamNotFound": "Team not found", + "backToTeams": "Back to Teams", + "memberCount": "{{count}} members", + "removeMemberSuccess": "User removed from team", + "removeMemberError": "Failed to remove user from team", + "createTeam": { + "title": "Create New Team", + "teamName": "Team Name", + "teamNamePlaceholder": "Enter team name", + "cancel": "Cancel", + "submit": "Create Team", + "nameRequired": "Team name is required", + "success": "Team created successfully", + "error": "Failed to create team" + }, + "renameTeam": { + "title": "Rename Team", + "renaming": "Renaming:", + "newTeamName": "New Team Name", + "newTeamNamePlaceholder": "Enter new team name", + "cancel": "Cancel", + "submit": "Rename Team", + "nameRequired": "Team name is required", + "success": "Team renamed successfully", + "error": "Failed to rename team" + }, + "deleteTeam": { + "success": "Team deleted successfully", + "error": "Failed to delete team. Make sure the team is empty.", + "teamMustBeEmpty": "Team must be empty before deletion" + }, + "addMemberToTeam": { + "title": "Add Member to Team", + "addingTo": "Adding to", + "selectUser": "Select User", + "selectUserPlaceholder": "Choose a user", + "selectUserRequired": "Please select a user", + "currentlyIn": "currently in", + "willBeMoved": "Note: This user will be moved from their current team to this team.", + "cancel": "Cancel", + "submit": "Add Member", + "userRequired": "Please select a user", + "success": "Member added to team successfully", + "error": "Failed to add member to team" + }, + "changeTeam": { + "label": "Change Team", + "title": "Change Team", + "changing": "Moving", + "selectTeam": "Select Team", + "selectTeamPlaceholder": "Choose a team", + "selectTeamRequired": "Please select a team", + "success": "Team changed successfully", + "error": "Failed to change team", + "submit": "Change Team" + } + } + }, + "plan": { + "currency": "Currency", + "popular": "Popular", + "current": "Current Plan", + "upgrade": "Upgrade", + "contact": "Contact Us", + "customPricing": "Custom", + "showComparison": "Compare All Features", + "hideComparison": "Hide Feature Comparison", + "featureComparison": "Feature Comparison", + "activePlan": { + "title": "Active Plan", + "subtitle": "Your current subscription details" + }, + "availablePlans": { + "title": "Available Plans", + "subtitle": "Choose the plan that fits your needs" + }, + "static": { + "title": "Billing Information", + "message": "Online billing is not currently configured. To upgrade your plan or manage subscriptions, please contact us directly.", + "contactSales": "Contact Sales", + "contactToUpgrade": "Contact us to upgrade or customize your plan", + "maxUsers": "Max Users", + "upTo": "Up to" + }, + "period": { + "month": "month" + }, + "free": { + "name": "Free", + "highlight1": "Limited Tool Usage Per week", + "highlight2": "Access to all tools", + "highlight3": "Community support" + }, + "pro": { + "name": "Pro", + "highlight1": "Unlimited Tool Usage", + "highlight2": "Advanced PDF tools", + "highlight3": "No watermarks" + }, + "enterprise": { + "name": "Enterprise", + "highlight1": "Custom pricing", + "highlight2": "Dedicated support", + "highlight3": "Latest features" + }, + "feature": { + "title": "Feature", + "pdfTools": "Basic PDF Tools", + "fileSize": "File Size Limit", + "automation": "Automate tool workflows", + "api": "API Access", + "priority": "Priority Support", + "customPricing": "Custom Pricing" + } + }, + "subscription": { + "status": { + "active": "Active", + "pastDue": "Past Due", + "canceled": "Canceled", + "incomplete": "Incomplete", + "trialing": "Trial", + "none": "No Subscription" + }, + "renewsOn": "Renews on {{date}}", + "cancelsOn": "Cancels on {{date}}" + }, + "billing": { + "manageBilling": "Manage Billing", + "portal": { + "error": "Failed to open billing portal" + } + }, + "payment": { + "preparing": "Preparing your checkout...", + "upgradeTitle": "Upgrade to {{planName}}", + "success": "Payment Successful!", + "successMessage": "Your subscription has been activated successfully. You will receive a confirmation email shortly.", + "autoClose": "This window will close automatically...", + "error": "Payment Error" + }, + "firstLogin": { + "title": "First Time Login", + "welcomeTitle": "Welcome!", + "welcomeMessage": "For security reasons, you must change your password on your first login.", + "loggedInAs": "Logged in as", + "error": "Error", + "currentPassword": "Current Password", + "enterCurrentPassword": "Enter your current password", + "newPassword": "New Password", + "enterNewPassword": "Enter new password (min 8 characters)", + "confirmPassword": "Confirm New Password", + "reEnterNewPassword": "Re-enter new password", + "changePassword": "Change Password", + "allFieldsRequired": "All fields are required", + "passwordsDoNotMatch": "New passwords do not match", + "passwordTooShort": "Password must be at least 8 characters", + "passwordMustBeDifferent": "New password must be different from current password", + "passwordChangedSuccess": "Password changed successfully! Please log in again.", + "passwordChangeFailed": "Failed to change password. Please check your current password." + }, + "invite": { + "welcome": "Welcome to Stirling PDF", + "invalidToken": "Invalid invitation link", + "validationError": "Failed to validate invitation link", + "passwordRequired": "Password is required", + "passwordTooShort": "Password must be at least 6 characters", + "passwordMismatch": "Passwords do not match", + "acceptError": "Failed to create account", + "validating": "Validating invitation...", + "invalidInvitation": "Invalid Invitation", + "goToLogin": "Go to Login", + "welcomeTitle": "You've been invited!", + "welcomeSubtitle": "Complete your account setup to get started", + "accountFor": "Creating account for", + "linkExpires": "Link expires", + "email": "Email address", + "emailPlaceholder": "Enter your email address", + "emailRequired": "Email address is required", + "invalidEmail": "Invalid email address", + "choosePassword": "Choose a password", + "passwordPlaceholder": "Enter your password", + "confirmPassword": "Confirm password", + "confirmPasswordPlaceholder": "Re-enter your password", + "createAccount": "Create Account", + "creating": "Creating Account...", + "alreadyHaveAccount": "Already have an account?", + "signIn": "Sign in" + }, + "audit": { + "error": { + "title": "Error loading audit system" + }, + "notAvailable": "Audit system not available", + "notAvailableMessage": "The audit system is not configured or not available.", + "disabled": "Audit logging is disabled", + "disabledMessage": "Enable audit logging in your application configuration to track system events.", + "systemStatus": { + "title": "System Status", + "status": "Audit Logging", + "enabled": "Enabled", + "disabled": "Disabled", + "level": "Audit Level", + "retention": "Retention Period", + "days": "days", + "totalEvents": "Total Events" + }, + "tabs": { + "dashboard": "Dashboard", + "events": "Audit Events", + "export": "Export" + }, + "charts": { + "title": "Audit Dashboard", + "error": "Error loading charts", + "day": "Day", + "week": "Week", + "month": "Month", + "byType": "Events by Type", + "byUser": "Events by User", + "overTime": "Events Over Time" + }, + "events": { + "title": "Audit Events", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "error": "Error loading events", + "noEvents": "No events found", + "timestamp": "Timestamp", + "type": "Type", + "user": "User", + "ipAddress": "IP Address", + "actions": "Actions", + "viewDetails": "View Details", + "eventDetails": "Event Details", + "details": "Details" + }, + "export": { + "title": "Export Audit Data", + "description": "Export audit events to CSV or JSON format. Use filters to limit the exported data.", + "format": "Export Format", + "filters": "Filters (Optional)", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "exportButton": "Export Data", + "error": "Failed to export data" + } + }, + "usage": { + "noData": "No data available", + "error": "Error loading usage statistics", + "noDataMessage": "No usage statistics are currently available.", + "controls": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All", + "refresh": "Refresh", + "dataTypeLabel": "Data Type:", + "dataType": { + "all": "All", + "api": "API", + "ui": "UI" + } + }, + "showing": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All" + }, + "stats": { + "totalEndpoints": "Total Endpoints", + "totalVisits": "Total Visits", + "showing": "Showing", + "selectedVisits": "Selected Visits" + }, + "chart": { + "title": "Endpoint Usage Chart" + }, + "table": { + "title": "Detailed Statistics", + "endpoint": "Endpoint", + "visits": "Visits", + "percentage": "Percentage", + "noData": "No data available" + } + }, + "backendHealth": { + "checking": "Checking backend status...", + "online": "Backend Online", + "offline": "Backend Offline" + }, + "autoRedact": { + "tags": "ā¸‹āšˆā¸­ā¸™, ā¸‹āšˆā¸­ā¸™ā¸‚āš‰ā¸­ā¸„ā¸§ā¸˛ā¸Ą, ā¸‹āšˆā¸­ā¸™ā¸”āš‰ā¸§ā¸ĸā¸Ēā¸ĩ⏔⏺", + "title": "ā¸‹āšˆā¸­ā¸™ā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩā¸­ā¸ąā¸•āš‚ā¸™ā¸Ąā¸ąā¸•ā¸´", + "header": "ā¸‹āšˆā¸­ā¸™ā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩā¸­ā¸ąā¸•āš‚ā¸™ā¸Ąā¸ąā¸•ā¸´", + "colorLabel": "ā¸Ēā¸ĩ", + "textsToRedactLabel": "ā¸‚āš‰ā¸­ā¸„ā¸§ā¸˛ā¸Ąā¸—ā¸ĩāšˆā¸ˆā¸°ā¸‹āšˆā¸­ā¸™ (āšā¸ĸā¸ā¸”āš‰ā¸§ā¸ĸā¸šā¸Ŗā¸Ŗā¸—ā¸ąā¸”)", + "textsToRedactPlaceholder": "āš€ā¸Šāšˆā¸™ \\nConfidential \\nTop-Secret", + "useRegexLabel": "āšƒā¸Šāš‰ Regex", + "wholeWordSearchLabel": "ā¸„āš‰ā¸™ā¸Ģā¸˛ā¸—ā¸ąāš‰ā¸‡ā¸„ā¸ŗ", + "customPaddingLabel": "ā¸ā¸˛ā¸Ŗāš€ā¸•ā¸´ā¸Ąā¸—ā¸ĩāšˆā¸ā¸ŗā¸Ģā¸™ā¸”āš€ā¸­ā¸‡", + "convertPDFToImageLabel": "āšā¸›ā¸Ĩ⏇ PDF āš€ā¸›āš‡ā¸™ā¸ ā¸˛ā¸ž PDF (āšƒā¸Šāš‰āš€ā¸žā¸ˇāšˆā¸­ā¸Ĩā¸šā¸‚āš‰ā¸­ā¸„ā¸§ā¸˛ā¸Ąā¸—ā¸ĩāšˆā¸­ā¸ĸā¸šāšˆā¸”āš‰ā¸˛ā¸™ā¸Ģā¸Ĩā¸ąā¸‡ā¸ā¸Ĩāšˆā¸­ā¸‡)", + "submitButton": "ā¸Ēāšˆā¸‡" + }, + "replaceColorPdf": { + "tags": "Replace Color,Page operations,Back end,server side" } -} \ No newline at end of file +} diff --git a/frontend/public/locales/tr-TR/translation.json b/frontend/public/locales/tr-TR/translation.json index b7f549348..d4495d033 100644 --- a/frontend/public/locales/tr-TR/translation.json +++ b/frontend/public/locales/tr-TR/translation.json @@ -1,4 +1,40 @@ { + "toolPanel": { + "modePrompt": { + "title": "Choose how you browse tools", + "description": "Preview both layouts and decide how you want to explore Stirling PDF tools.", + "sidebarTitle": "Sidebar mode", + "sidebarDescription": "Keep tools alongside your workspace for quick switching.", + "recommended": "Recommended", + "chooseSidebar": "Use sidebar mode", + "fullscreenTitle": "Fullscreen mode - (legacy)", + "fullscreenDescription": "Browse every tool in a catalogue that covers the workspace until you pick one.", + "chooseFullscreen": "Use fullscreen mode", + "dismiss": "Maybe later" + }, + "fullscreen": { + "showDetails": "Show Details", + "comingSoon": "Coming soon:", + "favorite": "Add to favourites", + "favorites": "Favourites", + "heading": "All tools (fullscreen view)", + "noResults": "Try adjusting your search or toggle descriptions to find what you need.", + "recommended": "Recommended", + "unfavorite": "Remove from favourites" + }, + "placeholder": "Choose a tool to get started", + "toggle": { + "fullscreen": "Switch to fullscreen mode", + "sidebar": "Switch to sidebar mode" + } + }, + "unsavedChanges": "You have unsaved changes to your PDF.", + "areYouSure": "Are you sure you want to leave?", + "unsavedChangesTitle": "Unsaved Changes", + "keepWorking": "Keep Working", + "discardChanges": "Discard & Leave", + "applyAndContinue": "Save & Leave", + "exportAndContinue": "Export & Continue", "language": { "direction": "ltr" }, @@ -18,8 +54,26 @@ "customTextDesc": "Özel Metin", "numberPagesDesc": "Hangi sayfalarÄąn numaralandÄąrÄąlacağınÄą, varsayÄąlan 'all', ayrÄąca 1-5 veya 2,5,9 vb. kabul eder", "customNumberDesc": "VarsayÄąlan {n}, ayrÄąca 'Sayfa {n} / {total}', 'Metin-{n}', '{filename}-{n} kabul eder", - "submit": "Sayfa NumaralarÄą Ekle" + "submit": "Sayfa NumaralarÄą Ekle", + "configuration": "Configuration", + "customize": "Customize Appearance", + "pagesAndStarting": "Pages & Starting Number", + "positionAndPages": "Position & Pages", + "error": { + "failed": "Add page numbers operation failed" + }, + "results": { + "title": "Page Number Results" + }, + "preview": "Position Selection", + "previewDisclaimer": "Preview is approximate. Final output may vary due to PDF font metrics." }, + "pageSelectionPrompt": "Özel Sayfa Seçimi (1,5,6 sayfa numaralarÄąnÄąn virgÃŧlle ayrÄąlmÄąÅŸ bir listesini veya 2n+1 gibi bir fonksiyon girin) :", + "startingNumberTooltip": "The first number to display. Subsequent pages will increment from this number.", + "marginTooltip": "Distance between the page number and the edge of the page.", + "fontSizeTooltip": "Size of the page number text in points. Larger numbers create bigger text.", + "fontTypeTooltip": "Font family for the page numbers. Choose based on your document style.", + "customTextTooltip": "Optional custom format for page numbers. Use {n} as placeholder for the number. Example: \"Page {n}\" will show \"Page 1\", \"Page 2\", etc.", "pdfPrompt": "PDF(leri) seçin", "multiPdfPrompt": "PDFleri seçin (2+)", "multiPdfDropPrompt": "TÃŧm gerekli PDF'leri seçin (ya da sÃŧrÃŧkleyip bÄąrakÄąn)", @@ -30,15 +84,41 @@ "uploadLimitExceededPlural": "çok bÃŧyÃŧk. İzin verilen maksimum boyut:", "processTimeWarning": "UyarÄą: Bu işlem, dosya boyutuna bağlÄą olarak bir dakikaya kadar sÃŧrebilir.", "pageOrderPrompt": "Özel Sayfa SÄąrasÄą (VirgÃŧlle ayrÄąlmÄąÅŸ sayfa numaralarÄą veya 2n+1 gibi bir fonksiyon girin) :", - "pageSelectionPrompt": "Özel Sayfa Seçimi (1,5,6 sayfa numaralarÄąnÄąn virgÃŧlle ayrÄąlmÄąÅŸ bir listesini veya 2n+1 gibi bir fonksiyon girin) :", "goToPage": "Sayfaya Git", "true": "Doğru", "false": "YanlÄąÅŸ", "unknown": "Bilinmeyen", + "app": { + "description": "The Free Adobe Acrobat alternative (10M+ Downloads)" + }, "save": "Kaydet", "saveToBrowser": "TarayÄącÄąya Kaydet", + "download": "İndir", + "pin": "Pin File (keep active after tool run)", + "unpin": "Unpin File (replace after tool run)", + "undoOperationTooltip": "Click to undo the last operation and restore the original files", + "undo": "Geri Al", + "moreOptions": "More Options", + "editYourNewFiles": "Edit your new file(s)", "close": "Kapat", + "openInViewer": "Open in Viewer", + "confirmClose": "Confirm Close", + "confirmCloseMessage": "Are you sure you want to close this file?", + "confirmCloseCancel": "Cancel", + "confirmCloseConfirm": "Close File", + "fileSelected": "Selected: {{filename}}", + "chooseFile": "Choose File", "filesSelected": "dosya seçildi", + "files": { + "title": "Files", + "upload": "Upload", + "uploadFiles": "Upload Files", + "addFiles": "Add files", + "selectFromWorkbench": "Select files from the workbench or ", + "selectMultipleFromWorkbench": "Select at least {{count}} files from the workbench or ", + "created": "Created", + "size": "File Size" + }, "noFavourites": "Favori eklenmedi", "downloadComplete": "İndirme TamamlandÄą", "bored": "SÄąkÄąldÄąnÄąz mÄą?", @@ -56,7 +136,10 @@ }, "error": { "pdfPassword": "PDF belgesi şifreli ve şifre ya sağlanmadÄą ya da yanlÄąÅŸ.", + "encryptedPdfMustRemovePassword": "This PDF is encrypted or password-protected. Please unlock it before converting to PDF/A.", + "incorrectPasswordProvided": "The PDF password is incorrect or not provided.", "_value": "Hata", + "dismissAllErrors": "Dismiss All Errors", "sorry": "Sorun için ÃļzÃŧr dileriz!", "needHelp": "YardÄąma mÄą ihtiyacÄąnÄąz var / Bir sorun mu buldunuz?", "contactTip": "Hala sorun yaÅŸÄąyorsanÄąz, yardÄąm için bize ulaşmaktan çekinmeyin. GitHub sayfamÄązdan bir bilet gÃļnderebilir veya Discord Ãŧzerinden bizimle iletişime geçebilirsiniz:", @@ -71,6 +154,10 @@ "githubSubmit": "GitHub - Hata gÃļnderin", "discordSubmit": "Discord - Destek gÃļnderisi gÃļnderin" }, + "warning": { + "tooltipTitle": "Warning" + }, + "edit": "Edit", "delete": "Sil", "username": "KullanÄącÄą AdÄą", "password": "Parola", @@ -82,6 +169,7 @@ "green": "Yeşil", "blue": "Mavi", "custom": "Özel", + "comingSoon": "Coming soon", "WorkInProgess": "ÇalÄąÅŸmalar devam ediyor, ÇalÄąÅŸmayabilir veya hatalÄą olabilir, LÃŧtfen herhangi bir sorunu bildirin!", "poweredBy": "TarafÄąndan desteklenmektedir", "yes": "Evet", @@ -115,12 +203,14 @@ "page": "Sayfa", "pages": "Sayfalar", "loading": "YÃŧkleniyor...", + "review": "Review", "addToDoc": "DÃļkÃŧmana Ekle", "reset": "SÄąfÄąrla", "apply": "Uygula", "noFileSelected": "Hiçbir dosya seçilmedi. LÃŧtfen bir dosya yÃŧkleyin.", "legal": { "privacy": "Gizlilik PolitikasÄą", + "iAgreeToThe": "I agree to all of the", "terms": "Şartlar ve koşullar", "accessibility": "Erişilebilirlik", "cookie": "Çerez PolitikasÄą", @@ -160,6 +250,7 @@ "title": "Stirling PDF’i daha iyi hale getirmek ister misiniz?", "paragraph1": "Stirling PDF, ÃŧrÃŧnÃŧ geliştirmemize yardÄąmcÄą olmak için isteğe bağlÄą analizleri içerir. Kişisel bilgileri veya dosya içeriklerini asla takip etmiyoruz.", "paragraph2": "Stirling PDF’in bÃŧyÃŧmesine destek olmak ve kullanÄącÄąlarÄąmÄązÄą daha iyi anlayabilmemiz için analizleri etkinleştirmeyi dÃŧşÃŧnebilirsiniz.", + "learnMore": "Learn more", "enable": "Analizi Etkinleştir", "disable": "Analizi Devre DÄąÅŸÄą BÄąrak", "settings": "Analiz ayarlarÄąnÄą config/settings.yml dosyasÄąndan değiştirebilirsiniz" @@ -203,6 +294,54 @@ "cacheInputs": { "name": "Form girdilerini kaydet", "help": "Gelecekteki çalÄąÅŸtÄąrmalar için Ãļnceden kullanÄąlan girdileri saklamayÄą etkinleştirin" + }, + "general": { + "title": "General", + "description": "Configure general application preferences.", + "account": "Account", + "accountDescription": "Manage your account settings", + "user": "User", + "signedInAs": "Signed in as", + "logout": "Log out", + "enableFeatures": { + "title": "For System Administrators", + "intro": "Enable user authentication, team management, and workspace features for your organization.", + "action": "Configure", + "and": "and", + "benefit": "Enables user roles, team collaboration, admin controls, and enterprise features.", + "learnMore": "Learn more in documentation", + "dismiss": "Dismiss" + }, + "autoUnzip": "Auto-unzip API responses", + "autoUnzipDescription": "Automatically extract files from ZIP responses", + "autoUnzipTooltip": "Automatically extract ZIP files returned from API operations. Disable to keep ZIP files intact. This does not affect automation workflows.", + "autoUnzipFileLimit": "Auto-unzip file limit", + "autoUnzipFileLimitDescription": "Maximum number of files to extract from ZIP", + "autoUnzipFileLimitTooltip": "Only unzip if the ZIP contains this many files or fewer. Set higher to extract larger ZIPs.", + "defaultToolPickerMode": "Default tool picker mode", + "defaultToolPickerModeDescription": "Choose whether the tool picker opens in fullscreen or sidebar by default", + "mode": { + "fullscreen": "Fullscreen", + "sidebar": "Sidebar" + } + }, + "hotkeys": { + "title": "Keyboard Shortcuts", + "description": "Hover a tool to see its shortcut or customise it below. Click \"Change shortcut\" and press a new key combination. Press Esc to cancel.", + "errorModifier": { + "mac": "Include ⌘ (Command), âŒĨ (Option), or another modifier in your shortcut.", + "windows": "Include Ctrl, Alt, or another modifier in your shortcut." + }, + "errorConflict": "Shortcut already used by {{tool}}.", + "none": "Not assigned", + "customBadge": "Custom", + "defaultLabel": "Default: {{shortcut}}", + "capturing": "Press keysâ€Ļ (Esc to cancel)", + "change": "Change shortcut", + "reset": "Reset", + "shortcut": "Shortcut", + "noShortcut": "No shortcut set", + "searchPlaceholder": "Search tools..." } }, "changeCreds": { @@ -274,8 +413,10 @@ "top20": "En Çok KullanÄąlan 20", "all": "Hepsi", "refresh": "Yenile", - "includeHomepage": "Ana SayfayÄą Dahil Et ('/')", - "includeLoginPage": "Giriş SayfasÄąnÄą Dahil Et ('/login')", + "dataTypeLabel": "Data Type:", + "dataTypeAll": "All", + "dataTypeApi": "API", + "dataTypeUi": "UI", "totalEndpoints": "Toplam Uç Nokta", "totalVisits": "Toplam Ziyaret", "showing": "GÃļsteriliyor", @@ -290,7 +431,9 @@ "top": "En Çok", "numberOfVisits": "Ziyaret SayÄąsÄą", "visitsTooltip": "Ziyaret: {0} (toplamÄąn %{1}’i)", - "retry": "Yeniden Dene" + "retry": "Yeniden Dene", + "includeHomepage": "Ana SayfayÄą Dahil Et ('/')", + "includeLoginPage": "Giriş SayfasÄąnÄą Dahil Et ('/login')" }, "database": { "title": "Veri TabanÄąnÄą İçe/DÄąÅŸa Aktar", @@ -331,22 +474,310 @@ "alphabetical": "Alfabetik", "globalPopularity": "Global PopÃŧlerlik", "sortBy": "SÄąralama ÃļlçÃŧtÃŧ:", + "mobile": { + "brandAlt": "Stirling PDF logo", + "openFiles": "Open files", + "swipeHint": "Swipe left or right to switch views", + "tools": "Tools", + "toolsSlide": "Tool selection panel", + "viewSwitcher": "Switch workspace view", + "workbenchSlide": "Workspace panel", + "workspace": "Workspace" + }, "multiTool": { + "tags": "multiple,tools", "title": "PDF Çoklu Araç", "desc": "Birleştir, DÃļndÃŧr, Yeniden DÃŧzenle ve SayfalarÄą KaldÄąr" }, "merge": { + "tags": "combine,join,unite", "title": "Birleştir", "desc": "Çoklu PDF'leri tek bir dosyada kolayca birleştirin." }, "split": { + "tags": "divide,separate,break", "title": "AyÄąr", "desc": "PDF'leri birden fazla belgeye ayÄąrÄąn" }, "rotate": { + "tags": "turn,flip,orient", "title": "DÃļndÃŧr", "desc": "PDF'lerinizi kolayca dÃļndÃŧrÃŧn." }, + "convert": { + "tags": "transform,change", + "title": "DÃļnÃŧştÃŧr", + "desc": "Convert files between different formats" + }, + "pdfOrganiser": { + "tags": "organize,rearrange,reorder", + "title": "DÃŧzenle", + "desc": "SayfalarÄą herhangi bir sÄąrayla kaldÄąrÄąn/dÃŧzenleyin" + }, + "addImage": { + "tags": "insert,embed,place", + "title": "Resim Ekle", + "desc": "PDF'e belirli bir konuma resim ekler" + }, + "addAttachments": { + "tags": "embed,attach,include", + "title": "Add Attachments", + "desc": "Add or remove embedded files (attachments) to/from a PDF" + }, + "watermark": { + "tags": "stamp,mark,overlay", + "title": "Filigran Ekle", + "desc": "PDF belgenize Ãļzel bir filigran ekleyin." + }, + "removePassword": { + "tags": "unlock", + "title": "ParolayÄą KaldÄąr", + "desc": "PDF belgenizden parola korumasÄąnÄą kaldÄąrÄąn." + }, + "compress": { + "tags": "shrink,reduce,optimize", + "title": "SÄąkÄąÅŸtÄąr", + "desc": "PDF'lerin dosya boyutunu azaltmak için sÄąkÄąÅŸtÄąrÄąn." + }, + "unlockPDFForms": { + "tags": "unlock,enable,edit", + "title": "PDF FormlarÄąnÄąn Kilidini KaldÄąr", + "desc": "Form alanlarÄąnÄą dÃŧzenlenebilir hÃĸle getir." + }, + "changeMetadata": { + "tags": "edit,modify,update", + "title": "Metaveriyi Değiştir", + "desc": "Bir PDF belgesinden metaveriyi değiştir/kaldÄąr/ekle" + }, + "ocr": { + "tags": "extract,scan", + "title": "OCR / TaramalarÄą Temizle", + "desc": "TaramalarÄą temizler ve bir PDF içindeki resimlerden metni algÄąlar ve tekrar metin olarak ekler." + }, + "extractImages": { + "tags": "pull,save,export", + "title": "Resimleri Ã‡Äąkar", + "desc": "Bir PDF'ten tÃŧm resimleri Ã§ÄąkarÄąr ve bunlarÄą zip olarak kaydeder." + }, + "scannerImageSplit": { + "tags": "detect,split,photos", + "title": "Detect & Split Scanned Photos", + "desc": "Detect and split scanned photos into separate pages" + }, + "sign": { + "tags": "signature,autograph", + "title": "İmzala", + "desc": "Çizim, metin veya resim ile PDF'e imza ekler" + }, + "flatten": { + "tags": "simplify,remove,interactive", + "title": "DÃŧzleştir", + "desc": "PDF'ten tÃŧm etkileşimli Ãļğeleri ve formlarÄą kaldÄąrÄąr" + }, + "certSign": { + "tags": "authenticate,PEM,P12,official,encrypt,sign,certificate,PKCS12,JKS,server,manual,auto", + "title": "Sertifika ile İmzala", + "desc": "Bir PDF'i Sertifika/Anahtar (PEM/P12) ile imzalar" + }, + "repair": { + "tags": "fix,restore", + "title": "Onar", + "desc": "Bozuk/kÄąrÄąk bir PDF'i onarmaya çalÄąÅŸÄąr" + }, + "removeBlanks": { + "tags": "delete,clean,empty", + "title": "Boş SayfalarÄą KaldÄąr", + "desc": "Bir belgeden boş sayfalarÄą tespit eder ve kaldÄąrÄąr" + }, + "removeAnnotations": { + "tags": "delete,clean,strip", + "title": "Ek AÃ§ÄąklamalarÄą KaldÄąr", + "desc": "PDF'deki tÃŧm yorumlarÄą/aÃ§ÄąklamalarÄą kaldÄąrÄąr" + }, + "compare": { + "tags": "difference", + "title": "KarÅŸÄąlaştÄąr", + "desc": "2 PDF Belgesi arasÄąndaki farklarÄą karÅŸÄąlaştÄąrÄąr ve gÃļsterir" + }, + "removeCertSign": { + "tags": "remove,delete,unlock", + "title": "Sertifika İmzasÄąnÄą KaldÄąr", + "desc": "PDF'ten sertifika imzasÄąnÄą kaldÄąrÄąr" + }, + "pageLayout": { + "tags": "layout,arrange,combine", + "title": "Çoklu-Sayfa DÃŧzeni", + "desc": "Bir PDF belgesinin çoklu sayfalarÄąnÄą tek bir sayfada birleştirir" + }, + "bookletImposition": { + "tags": "booklet,print,binding", + "title": "Booklet Imposition", + "desc": "Create booklets with proper page ordering and multi-page layout for printing and binding" + }, + "scalePages": { + "tags": "resize,adjust,scale", + "title": "Sayfa boyutunu/Ãļlçeğini ayarla", + "desc": "Bir sayfanÄąn ve/veya içeriğinin boyutunu/Ãļlçeğini değiştirir" + }, + "addPageNumbers": { + "tags": "number,pagination,count", + "title": "Sayfa NumaralarÄą Ekle", + "desc": "Bir belgeye belirli bir konuma sayfa numaralarÄą ekler" + }, + "autoRename": { + "tags": "auto-detect,header-based,organize,relabel", + "title": "Auto Rename PDF File", + "desc": "Auto renames a PDF file based on its detected header" + }, + "adjustContrast": { + "tags": "contrast,brightness,saturation", + "title": "Renkleri/KontrastÄą Ayarla", + "desc": "Bir PDF'in KontrastÄąnÄą, Doygunluğunu ve ParlaklığınÄą ayarlar" + }, + "crop": { + "tags": "trim,cut,resize", + "title": "PDF'i KÄąrp", + "desc": "Boyutunu azaltmak için bir PDF'i kÄąrpar (metni korur!)" + }, + "autoSplitPDF": { + "tags": "auto,split,QR", + "title": "SayfalarÄą Otomatik BÃļl", + "desc": "Fiziksel taranmÄąÅŸ sayfa bÃļlÃŧcÃŧ QR Kod ile TaranmÄąÅŸ PDF'i Otomatik BÃļl" + }, + "sanitize": { + "tags": "clean,purge,remove", + "title": "Sanitise", + "desc": "Remove potentially harmful elements from PDF files" + }, + "getPdfInfo": { + "tags": "info,metadata,details", + "title": "PDF HakkÄąnda TÜM Bilgiyi Al", + "desc": "PDF'ler hakkÄąnda mÃŧmkÃŧn olan her tÃŧrlÃŧ bilgiyi toplar" + }, + "pdfToSinglePage": { + "tags": "combine,merge,single", + "title": "PDF'i Tek BÃŧyÃŧk Sayfaya", + "desc": "TÃŧm PDF sayfalarÄąnÄą tek bÃŧyÃŧk bir sayfada birleştirir" + }, + "showJS": { + "tags": "javascript,code,script", + "title": "Javascript'i GÃļster", + "desc": "Bir PDF'e enjekte edilen herhangi bir JS'i araştÄąrÄąr ve gÃļsterir" + }, + "redact": { + "tags": "censor,blackout,hide", + "title": "Manuel SansÃŧrleme", + "desc": "Seçilen metinler, çizilen şekiller ve/veya belirli sayfalar Ãŧzerinden PDF'yi sansÃŧrler" + }, + "splitBySections": { + "tags": "split,sections,divide", + "title": "Split PDF by Sections", + "desc": "Divide each page of a PDF into smaller horizontal and vertical sections" + }, + "addStamp": { + "tags": "stamp,mark,seal", + "title": "Add Stamp to PDF", + "desc": "Add text or add image stamps at set locations" + }, + "removeImage": { + "tags": "remove,delete,clean", + "title": "Resmi kaldÄąr", + "desc": "Dosya boyutunu kÃŧçÃŧltmek için PDF'den resmi kaldÄąrÄąn" + }, + "splitByChapters": { + "tags": "split,chapters,structure", + "title": "PDF'yi BÃļlÃŧmlere GÃļre BÃļl", + "desc": "PDF'yi bÃļlÃŧm yapÄąsÄąna gÃļre birden fazla dosyaya ayÄąrÄąn." + }, + "validateSignature": { + "tags": "validate,verify,certificate", + "title": "PDF İmzasÄąnÄą Doğrula", + "desc": "PDF belgelerindeki dijital imzalarÄą ve sertifikalarÄą doğrulayÄąn" + }, + "swagger": { + "tags": "API,documentation,test", + "title": "API Documentation", + "desc": "View API documentation and test endpoints" + }, + "scannerEffect": { + "tags": "scan,simulate,create", + "title": "Scanner Effect", + "desc": "Create a PDF that looks like it was scanned" + }, + "editTableOfContents": { + "tags": "bookmarks,contents,edit", + "title": "İçindekiler Tablosunu DÃŧzenle", + "desc": "PDF belgelerinde yer işaretleri ve içindekiler tablosu ekleyin veya dÃŧzenleyin" + }, + "manageCertificates": { + "tags": "certificates,import,export", + "title": "Manage Certificates", + "desc": "Import, export, or delete digital certificate files used for signing PDFs." + }, + "read": { + "tags": "view,open,display", + "title": "Read", + "desc": "View and annotate PDFs. Highlight text, draw, or insert comments for review and collaboration." + }, + "reorganizePages": { + "tags": "rearrange,reorder,organize", + "title": "Reorganize Pages", + "desc": "Rearrange, duplicate, or delete PDF pages with visual drag-and-drop control." + }, + "extractPages": { + "tags": "pull,select,copy", + "title": "SayfalarÄą Ã‡Äąkar", + "desc": "Extract specific pages from a PDF document" + }, + "removePages": { + "tags": "delete,extract,exclude", + "title": "KaldÄąr", + "desc": "PDF belgenizden istenmeyen sayfalarÄą silin." + }, + "autoSizeSplitPDF": { + "tags": "auto,split,size", + "title": "Boyut/SayÄąya GÃļre Otomatik BÃļlme", + "desc": "Tek bir PDF'yi boyut, sayfa sayÄąsÄą veya belge sayÄąsÄąna gÃļre birden fazla belgeye bÃļlÃŧn" + }, + "replaceColor": { + "title": "Replace & Invert Colour", + "desc": "Replace or invert colours in PDF documents" + }, + "devApi": { + "tags": "API,development,documentation", + "title": "API", + "desc": "Link to API documentation" + }, + "devFolderScanning": { + "tags": "automation,folder,scanning", + "title": "Automated Folder Scanning", + "desc": "Link to automated folder scanning guide" + }, + "devSsoGuide": { + "title": "SSO Guide", + "desc": "Link to SSO guide" + }, + "devAirgapped": { + "title": "Air-gapped Setup", + "desc": "Link to air-gapped setup guide" + }, + "addPassword": { + "title": "Parola Ekle", + "desc": "PDF belgenizi bir parola ile şifreleyin." + }, + "changePermissions": { + "title": "İzinleri Değiştir", + "desc": "Change document restrictions and permissions" + }, + "automate": { + "tags": "workflow,sequence,automation", + "title": "Automate", + "desc": "Build multi-step workflows by chaining together PDF actions. Ideal for recurring tasks." + }, + "overlay-pdfs": { + "desc": "PDF'leri başka bir PDF'nin Ãŧzerine bindirir", + "title": "PDF'leri Bindirme" + }, "imageToPDF": { "title": "Resimden PDF'e", "desc": "Bir resmi (PNG, JPEG, GIF) PDF'e dÃļnÃŧştÃŧrÃŧn." @@ -355,18 +786,6 @@ "title": "PDF'den Resme", "desc": "PDF'yi bir resme dÃļnÃŧştÃŧrÃŧn. (PNG, JPEG, GIF)" }, - "pdfOrganiser": { - "title": "DÃŧzenle", - "desc": "SayfalarÄą herhangi bir sÄąrayla kaldÄąrÄąn/dÃŧzenleyin" - }, - "addImage": { - "title": "Resim Ekle", - "desc": "PDF'e belirli bir konuma resim ekler" - }, - "watermark": { - "title": "Filigran Ekle", - "desc": "PDF belgenize Ãļzel bir filigran ekleyin." - }, "permissions": { "title": "İzinleri Değiştir", "desc": "PDF belgenizin izinlerini değiştirin" @@ -375,38 +794,10 @@ "title": "KaldÄąr", "desc": "PDF belgenizden istenmeyen sayfalarÄą silin." }, - "addPassword": { - "title": "Parola Ekle", - "desc": "PDF belgenizi bir parola ile şifreleyin." - }, - "removePassword": { - "title": "ParolayÄą KaldÄąr", - "desc": "PDF belgenizden parola korumasÄąnÄą kaldÄąrÄąn." - }, - "compress": { - "title": "SÄąkÄąÅŸtÄąr", - "desc": "PDF'lerin dosya boyutunu azaltmak için sÄąkÄąÅŸtÄąrÄąn." - }, - "unlockPDFForms": { - "title": "PDF FormlarÄąnÄąn Kilidini KaldÄąr", - "desc": "Form alanlarÄąnÄą dÃŧzenlenebilir hÃĸle getir." - }, - "changeMetadata": { - "title": "Metaveriyi Değiştir", - "desc": "Bir PDF belgesinden metaveriyi değiştir/kaldÄąr/ekle" - }, "fileToPDF": { "title": "DosyayÄą PDF'e DÃļnÃŧştÃŧr", "desc": "Hemen hemen her dosyayÄą PDF'e dÃļnÃŧştÃŧrÃŧn (DOCX, PNG, XLS, PPT, TXT ve daha fazlasÄą)" }, - "ocr": { - "title": "OCR / TaramalarÄą Temizle", - "desc": "TaramalarÄą temizler ve bir PDF içindeki resimlerden metni algÄąlar ve tekrar metin olarak ekler." - }, - "extractImages": { - "title": "Resimleri Ã‡Äąkar", - "desc": "Bir PDF'ten tÃŧm resimleri Ã§ÄąkarÄąr ve bunlarÄą zip olarak kaydeder." - }, "pdfToPDFA": { "title": "PDF'den PDF/A'ya", "desc": "PDF'yi uzun vadeli saklama için PDF/A'ya dÃļnÃŧştÃŧrÃŧn" @@ -435,70 +826,14 @@ "title": "TaranmÄąÅŸ FotoğraflarÄą Tespit Et/BÃļl", "desc": "Bir fotoğraf/PDF içerisindeki birden fazla fotoğrafÄą ayÄąrÄąr" }, - "sign": { - "title": "İmzala", - "desc": "Çizim, metin veya resim ile PDF'e imza ekler" - }, - "flatten": { - "title": "DÃŧzleştir", - "desc": "PDF'ten tÃŧm etkileşimli Ãļğeleri ve formlarÄą kaldÄąrÄąr" - }, - "repair": { - "title": "Onar", - "desc": "Bozuk/kÄąrÄąk bir PDF'i onarmaya çalÄąÅŸÄąr" - }, - "removeBlanks": { - "title": "Boş SayfalarÄą KaldÄąr", - "desc": "Bir belgeden boş sayfalarÄą tespit eder ve kaldÄąrÄąr" - }, - "removeAnnotations": { - "title": "Ek AÃ§ÄąklamalarÄą KaldÄąr", - "desc": "PDF'deki tÃŧm yorumlarÄą/aÃ§ÄąklamalarÄą kaldÄąrÄąr" - }, - "compare": { - "title": "KarÅŸÄąlaştÄąr", - "desc": "2 PDF Belgesi arasÄąndaki farklarÄą karÅŸÄąlaştÄąrÄąr ve gÃļsterir" - }, - "certSign": { - "title": "Sertifika ile İmzala", - "desc": "Bir PDF'i Sertifika/Anahtar (PEM/P12) ile imzalar" - }, - "removeCertSign": { - "title": "Sertifika İmzasÄąnÄą KaldÄąr", - "desc": "PDF'ten sertifika imzasÄąnÄą kaldÄąrÄąr" - }, - "pageLayout": { - "title": "Çoklu-Sayfa DÃŧzeni", - "desc": "Bir PDF belgesinin çoklu sayfalarÄąnÄą tek bir sayfada birleştirir" - }, - "scalePages": { - "title": "Sayfa boyutunu/Ãļlçeğini ayarla", - "desc": "Bir sayfanÄąn ve/veya içeriğinin boyutunu/Ãļlçeğini değiştirir" - }, "pipeline": { "title": "Çoklu İşlemler", "desc": "Çoklu İşlemler tanÄąmlayarak PDF'lere birden fazla işlemi çalÄąÅŸtÄąr" }, - "addPageNumbers": { - "title": "Sayfa NumaralarÄą Ekle", - "desc": "Bir belgeye belirli bir konuma sayfa numaralarÄą ekler" - }, "auto-rename": { "title": "PDF DosyasÄąnÄą Otomatik Yeniden AdlandÄąr", "desc": "Tespit edilen başlığa dayanarak bir PDF dosyasÄąnÄą otomatik olarak yeniden adlandÄąrÄąr" }, - "adjustContrast": { - "title": "Renkleri/KontrastÄą Ayarla", - "desc": "Bir PDF'in KontrastÄąnÄą, Doygunluğunu ve ParlaklığınÄą ayarlar" - }, - "crop": { - "title": "PDF'i KÄąrp", - "desc": "Boyutunu azaltmak için bir PDF'i kÄąrpar (metni korur!)" - }, - "autoSplitPDF": { - "title": "SayfalarÄą Otomatik BÃļl", - "desc": "Fiziksel taranmÄąÅŸ sayfa bÃļlÃŧcÃŧ QR Kod ile TaranmÄąÅŸ PDF'i Otomatik BÃļl" - }, "sanitizePDF": { "title": "Temizle", "desc": "PDF dosyalarÄąndan betikleri ve diğer Ãļğeleri kaldÄąrÄąr" @@ -519,30 +854,14 @@ "title": "PDF'den Markdown'a", "desc": "Herhangi bir PDF'yi Markdown formatÄąna dÃļnÃŧştÃŧrÃŧr" }, - "getPdfInfo": { - "title": "PDF HakkÄąnda TÜM Bilgiyi Al", - "desc": "PDF'ler hakkÄąnda mÃŧmkÃŧn olan her tÃŧrlÃŧ bilgiyi toplar" - }, "pageExtracter": { "title": "Sayfa(larÄą) Ã‡Äąkar", "desc": "PDF'ten seçili sayfalarÄą Ã§ÄąkarÄąr" }, - "pdfToSinglePage": { - "title": "PDF'i Tek BÃŧyÃŧk Sayfaya", - "desc": "TÃŧm PDF sayfalarÄąnÄą tek bÃŧyÃŧk bir sayfada birleştirir" - }, - "showJS": { - "title": "Javascript'i GÃļster", - "desc": "Bir PDF'e enjekte edilen herhangi bir JS'i araştÄąrÄąr ve gÃļsterir" - }, "autoRedact": { "title": "Otomatik Karartma", "desc": "Giriş metnine dayanarak bir PDF'teki metni Otomatik KarartÄąr (Redakte)" }, - "redact": { - "title": "Manuel SansÃŧrleme", - "desc": "Seçilen metinler, çizilen şekiller ve/veya belirli sayfalar Ãŧzerinden PDF'yi sansÃŧrler" - }, "PDFToCSV": { "title": "PDF'den CSV'ye", "desc": "PDF'den TablolarÄą Ã§ÄąkarÄąr ve CSV'ye dÃļnÃŧştÃŧrÃŧr" @@ -551,10 +870,6 @@ "title": "Boyut/SayÄąya GÃļre Otomatik BÃļlme", "desc": "Tek bir PDF'yi boyut, sayfa sayÄąsÄą veya belge sayÄąsÄąna gÃļre birden fazla belgeye bÃļlÃŧn" }, - "overlay-pdfs": { - "title": "PDF'leri Bindirme", - "desc": "PDF'leri başka bir PDF'nin Ãŧzerine bindirir" - }, "split-by-sections": { "title": "PDF'yi BÃļlÃŧmlere AyÄąrma", "desc": "PDF'nin her sayfasÄąnÄą daha kÃŧçÃŧk yatay ve dikey bÃļlÃŧmlere ayÄąrÄąn" @@ -563,47 +878,17 @@ "title": "PDF'ye Damga Ekleme", "desc": "Belirlenen konumlara metin veya resim damgalarÄą ekleyin" }, - "removeImage": { - "title": "Resmi kaldÄąr", - "desc": "Dosya boyutunu kÃŧçÃŧltmek için PDF'den resmi kaldÄąrÄąn" - }, - "splitByChapters": { - "title": "PDF'yi BÃļlÃŧmlere GÃļre BÃļl", - "desc": "PDF'yi bÃļlÃŧm yapÄąsÄąna gÃļre birden fazla dosyaya ayÄąrÄąn." - }, - "validateSignature": { - "title": "PDF İmzasÄąnÄą Doğrula", - "desc": "PDF belgelerindeki dijital imzalarÄą ve sertifikalarÄą doğrulayÄąn" - }, "replace-color": { "title": "Renkleri Değiştir ve Tersine Çevir", "desc": "PDF'deki metin ve arka plan renklerini değiştirin ve PDF'nin tÃŧm renklerini tersine çevirerek dosya boyutunu azaltÄąn" }, - "convert": { - "title": "DÃļnÃŧştÃŧr" - }, "attachments": { "title": "Add attachments" }, - "editTableOfContents": { - "title": "İçindekiler Tablosunu DÃŧzenle", - "desc": "PDF belgelerinde yer işaretleri ve içindekiler tablosu ekleyin veya dÃŧzenleyin" - }, - "extractPages": { - "title": "SayfalarÄą Ã‡Äąkar" - }, - "removePages": { - "title": "KaldÄąr", - "desc": "PDF belgenizden istenmeyen sayfalarÄą silin." - }, "removeImagePdf": { "title": "Resmi kaldÄąr", "desc": "Dosya boyutunu kÃŧçÃŧltmek için PDF'den resmi kaldÄąrÄąn" }, - "autoSizeSplitPDF": { - "title": "Boyut/SayÄąya GÃļre Otomatik BÃļlme", - "desc": "Tek bir PDF'yi boyut, sayfa sayÄąsÄą veya belge sayÄąsÄąna gÃļre birden fazla belgeye bÃļlÃŧn" - }, "adjust-contrast": { "title": "Renkleri/KontrastÄą Ayarla", "desc": "Bir PDF'in KontrastÄąnÄą, Doygunluğunu ve ParlaklığınÄą ayarlar" @@ -611,11 +896,12 @@ "replaceColorPdf": { "title": "Renkleri Değiştir ve Tersine Çevir", "desc": "PDF'deki metin ve arka plan renklerini değiştirin ve PDF'nin tÃŧm renklerini tersine çevirerek dosya boyutunu azaltÄąn" - }, - "changePermissions": { - "title": "İzinleri Değiştir" } }, + "landing": { + "addFiles": "Add Files", + "uploadFromComputer": "Upload from computer" + }, "viewPdf": { "tags": "gÃļrÃŧntÃŧle,oku,aÃ§Äąklama ekle,metin,gÃļrÃŧntÃŧ", "title": "PDF GÃļrÃŧntÃŧle/DÃŧzenle", @@ -649,17 +935,39 @@ "merge": { "tags": "birleştir,Sayfa işlemleri,Arka uç,sunucu tarafÄą", "title": "Birleştir", + "removeDigitalSignature": { + "label": "Remove digital signature in the merged file?", + "tooltip": { + "title": "Remove Digital Signature", + "description": "Digital signatures will be invalidated when merging files. Check this to remove them from the final merged PDF." + } + }, + "generateTableOfContents": { + "label": "Generate table of contents in the merged file?", + "tooltip": { + "title": "Generate Table of Contents", + "description": "Automatically creates a clickable table of contents in the merged PDF based on the original file names and page numbers." + } + }, + "submit": "Birleştir", + "sortBy": { + "description": "Files will be merged in the order they're selected. Drag to reorder or sort below.", + "label": "Sort By", + "filename": "Dosya AdÄą", + "dateModified": "Date Modified", + "ascending": "Ascending", + "descending": "Descending", + "sort": "Sort" + }, + "error": { + "failed": "An error occurred while merging the PDFs." + }, "header": "Çoklu PDF'leri Birleştir (2+)", "sortByName": "İsme gÃļre sÄąrala", "sortByDate": "Tarihe gÃļre sÄąrala", - "removeCertSign": "Birleştirilen dosyadaki dijital imza kaldÄąrÄąlsÄąn mÄą?", - "submit": "Birleştir", - "sortBy": { - "filename": "Dosya AdÄą" - } + "removeCertSign": "Birleştirilen dosyadaki dijital imza kaldÄąrÄąlsÄąn mÄą?" }, "split": { - "tags": "Sayfa işlemleri,bÃļl,Çoklu Sayfa,kes,sunucu tarafÄą", "title": "PDF AyÄąr", "header": "PDF AyÄąr", "desc": { @@ -675,25 +983,249 @@ "splitPages": "AyrÄąlacak sayfalarÄą girin:", "submit": "AyÄąr", "steps": { + "chooseMethod": "Choose Method", "settings": "Ayarlar" }, + "settings": { + "selectMethodFirst": "Please select a split method first" + }, + "error": { + "failed": "An error occurred while splitting the PDF." + }, + "method": { + "label": "Choose split method", + "placeholder": "Select how to split the PDF" + }, "methods": { + "prefix": { + "splitAt": "Split at", + "splitBy": "Split by" + }, + "byPages": { + "name": "Page Numbers", + "desc": "Extract specific pages (1,3,5-10)", + "tooltip": "Enter page numbers separated by commas or ranges with hyphens" + }, + "bySections": { + "name": "Sections", + "desc": "Divide pages into grid sections", + "tooltip": "Split each page into horizontal and vertical sections" + }, "bySize": { - "name": "Dosya Boyutu" + "name": "Dosya Boyutu", + "desc": "Limit maximum file size", + "tooltip": "Specify maximum file size (e.g. 10MB, 500KB)" + }, + "byPageCount": { + "name": "Page Count", + "desc": "Fixed pages per file", + "tooltip": "Enter the number of pages for each split file" + }, + "byDocCount": { + "name": "Document Count", + "desc": "Create specific number of files", + "tooltip": "Enter how many files you want to create" + }, + "byChapters": { + "name": "Chapters", + "desc": "Split at bookmark boundaries", + "tooltip": "Uses PDF bookmarks to determine split points" + }, + "byPageDivider": { + "name": "Page Divider", + "desc": "Auto-split with divider sheets", + "tooltip": "Use QR code divider sheets between documents when scanning" } }, "value": { "fileSize": { - "label": "Dosya Boyutu" + "label": "Dosya Boyutu", + "placeholder": "e.g. 10MB, 500KB" + }, + "pageCount": { + "label": "Pages per File", + "placeholder": "e.g. 5, 10" + }, + "docCount": { + "label": "Number of Files", + "placeholder": "e.g. 3, 5" } - } + }, + "tooltip": { + "header": { + "title": "Split Methods Overview" + }, + "byPages": { + "title": "Split at Page Numbers", + "text": "Split your PDF at specific page numbers. Using 'n' splits after page n. Using 'n-m' splits before page n and after page m.", + "bullet1": "Single split points: 3,7 (splits after pages 3 and 7)", + "bullet2": "Range split points: 3-8 (splits before page 3 and after page 8)", + "bullet3": "Mixed: 2,5-10,15 (splits after page 2, before page 5, after page 10, and after page 15)" + }, + "bySections": { + "title": "Split by Grid Sections", + "text": "Divide each page into a grid of sections. Useful for splitting documents with multiple columns or extracting specific areas.", + "bullet1": "Horizontal: Number of rows to create", + "bullet2": "Vertical: Number of columns to create", + "bullet3": "Merge: Combine all sections into one PDF" + }, + "bySize": { + "title": "Split by File Size", + "text": "Create multiple PDFs that don't exceed a specified file size. Ideal for file size limitations or email attachments.", + "bullet1": "Use MB for larger files (e.g., 10MB)", + "bullet2": "Use KB for smaller files (e.g., 500KB)", + "bullet3": "System will split at page boundaries" + }, + "byCount": { + "title": "Split by Count", + "text": "Create multiple PDFs with a specific number of pages or documents each.", + "bullet1": "Page Count: Fixed number of pages per file", + "bullet2": "Document Count: Fixed number of output files", + "bullet3": "Useful for batch processing workflows" + }, + "byChapters": { + "title": "Split by Chapters", + "text": "Use PDF bookmarks to automatically split at chapter boundaries. Requires PDFs with bookmark structure.", + "bullet1": "Bookmark Level: Which level to split on (1=top level)", + "bullet2": "Include Metadata: Preserve document properties", + "bullet3": "Allow Duplicates: Handle repeated bookmark names" + }, + "byDocCount": { + "bullet1": "Enter the number of output files you want", + "bullet2": "Pages are distributed as evenly as possible", + "bullet3": "Useful when you need a specific number of files", + "text": "Create a specific number of output files by evenly distributing pages across them.", + "title": "Split by Document Count" + }, + "byPageCount": { + "bullet1": "Enter the number of pages per output file", + "bullet2": "Last file may have fewer pages if not evenly divisible", + "bullet3": "Useful for batch processing workflows", + "text": "Create multiple PDFs with a specific number of pages each. Perfect for creating uniform document chunks.", + "title": "Split by Page Count" + }, + "byPageDivider": { + "bullet1": "Print divider sheets from the download link", + "bullet2": "Insert divider sheets between your documents", + "bullet3": "Scan all documents together as one PDF", + "bullet4": "Upload - divider pages are automatically detected and removed", + "bullet5": "Enable Duplex Mode if scanning both sides of divider sheets", + "text": "Automatically split scanned documents using physical divider sheets with QR codes. Perfect for processing multiple documents scanned together.", + "title": "Split by Page Divider" + } + }, + "methodSelection": { + "tooltip": { + "bullet1": "Click on a method card to select it", + "bullet2": "Hover over each card to see a quick description", + "bullet3": "The settings step will appear after you select a method", + "bullet4": "You can change methods at any time before processing", + "header": { + "text": "Choose how you want to split your PDF document. Each method is optimized for different use cases and document types.", + "title": "Split Method Selection" + }, + "title": "Choose Your Split Method" + } + }, + "selectMethod": "Select a split method", + "tags": "Sayfa işlemleri,bÃļl,Çoklu Sayfa,kes,sunucu tarafÄą" }, "rotate": { - "tags": "sunucu tarafÄą", "title": "PDF DÃļndÃŧr", + "submit": "DÃļndÃŧr", + "selectRotation": "Select Rotation Angle (Clockwise)", + "error": { + "failed": "An error occurred while rotating the PDF." + }, + "preview": { + "title": "Rotation Preview" + }, + "rotateLeft": "Rotate Anticlockwise", + "rotateRight": "Rotate Clockwise", + "tooltip": { + "header": { + "title": "Rotate Settings Overview" + }, + "description": { + "text": "Rotate your PDF pages clockwise or anticlockwise in 90-degree increments. All pages in the PDF will be rotated. The preview shows how your document will look after rotation." + }, + "controls": { + "title": "Controls", + "text": "Use the rotation buttons to adjust orientation. Left button rotates anticlockwise, right button rotates clockwise. Each click rotates by 90 degrees." + } + }, + "tags": "sunucu tarafÄą", "header": "PDF DÃļndÃŧr", - "selectAngle": "DÃļndÃŧrme aÃ§ÄąsÄąnÄą seçin (90 derecenin katlarÄą olarak):", - "submit": "DÃļndÃŧr" + "selectAngle": "DÃļndÃŧrme aÃ§ÄąsÄąnÄą seçin (90 derecenin katlarÄą olarak):" + }, + "convert": { + "title": "DÃļnÃŧştÃŧr", + "desc": "Convert files between different formats", + "files": "Files", + "selectFilesPlaceholder": "Select files in the main view to get started", + "settings": "Ayarlar", + "conversionCompleted": "Conversion completed", + "results": "Results", + "defaultFilename": "converted_file", + "conversionResults": "Conversion Results", + "convertFrom": "Convert from", + "convertTo": "Convert to", + "sourceFormatPlaceholder": "Source format", + "targetFormatPlaceholder": "Target format", + "selectSourceFormatFirst": "Select a source format first", + "outputOptions": "Output Options", + "pdfOptions": "PDF Options", + "imageOptions": "Image Options", + "colorType": "Colour Type", + "color": "Renk", + "greyscale": "Gri tonlama", + "blackwhite": "Black & White", + "dpi": "DPI", + "output": "Output", + "single": "Single", + "multiple": "Multiple", + "fitOption": "Fit Option", + "maintainAspectRatio": "Maintain Aspect Ratio", + "fitDocumentToPage": "Fit Document to Page", + "fillPage": "SayfayÄą Doldur", + "autoRotate": "Auto Rotate", + "autoRotateDescription": "Automatically rotate images to better fit the PDF page", + "combineImages": "Combine Images", + "combineImagesDescription": "Combine all images into one PDF, or create separate PDFs for each image", + "webOptions": "Web to PDF Options", + "zoomLevel": "Zoom Level", + "emailOptions": "Email to PDF Options", + "includeAttachments": "Include email attachments", + "maxAttachmentSize": "Maximum attachment size (MB)", + "includeAllRecipients": "Include CC and BCC recipients in header", + "downloadHtml": "Download HTML intermediate file instead of PDF", + "pdfaOptions": "PDF/A Options", + "outputFormat": "Output Format", + "pdfaNote": "PDF/A-1b is more compatible, PDF/A-2b supports more features.", + "pdfaDigitalSignatureWarning": "PDF dijital imza içeriyor. Bu bir sonraki adÄąmda kaldÄąrÄąlacak.", + "fileFormat": "File Format", + "wordDoc": "Word Document", + "wordDocExt": "Word Document (.docx)", + "odtExt": "OpenDocument Text (.odt)", + "pptExt": "PowerPoint (.pptx)", + "odpExt": "OpenDocument Presentation (.odp)", + "txtExt": "Plain Text (.txt)", + "rtfExt": "Rich Text Format (.rtf)", + "selectedFiles": "Selected files", + "noFileSelected": "No file selected. Use the file panel to add files.", + "convertFiles": "Convert Files", + "converting": "Converting...", + "downloadConverted": "Download Converted File", + "errorNoFiles": "Please select at least one file to convert.", + "errorNoFormat": "Please select both source and target formats.", + "errorNotSupported": "Conversion from {{from}} to {{to}} is not supported.", + "images": "Images", + "officeDocs": "Office Documents (Word, Excel, PowerPoint)", + "imagesExt": "Images (JPG, PNG, etc.)", + "markdown": "Markdown", + "textRtf": "Text/RTF", + "grayscale": "Gri tonlama", + "errorConversion": "An error occurred while converting the file." }, "imageToPdf": { "tags": "dÃļnÃŧşÃŧm,img,jpg,fotoğraf,resim" @@ -731,7 +1263,33 @@ "8": "Sonuncuyu KaldÄąr", "9": "İlk ve Sonu KaldÄąr", "10": "Tek-Çift Birleştirme", - "11": "TÃŧm sayfalarÄą çoğalt" + "11": "TÃŧm sayfalarÄą çoğalt", + "desc": { + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, â€Ļ).", + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, â€Ļ).", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimized for binding on the side)." + } + }, + "desc": { + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, â€Ļ).", + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, â€Ļ).", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimised for binding on the side).", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document." }, "placeholder": "(Ãļrn. 1,3,2 veya 4-8,2,10-12 veya 2n-1)" }, @@ -743,9 +1301,198 @@ "upload": "Resim ekle", "submit": "Resim ekle" }, + "attachments": { + "tags": "embed,attach,file,attachment,attachments", + "title": "Add attachments", + "header": "Add attachments", + "add": "Add Attachment", + "remove": "Remove Attachment", + "embed": "Embed Attachment", + "submit": "Add attachments" + }, "watermark": { - "tags": "Metin,tekrarlayan,etiket,kendi,telif hakkÄą,marka,img,jpg,fotoğraf,resim", "title": "Filigran Ekle", + "desc": "Add text or image watermarks to PDF files", + "completed": "Watermark added", + "submit": "Filigran Ekle", + "filenamePrefix": "watermarked", + "error": { + "failed": "An error occurred while adding watermark to the PDF." + }, + "watermarkType": { + "text": "Metin", + "image": "Image" + }, + "settings": { + "type": "Watermark Type", + "text": { + "label": "Watermark Text", + "placeholder": "Enter watermark text" + }, + "image": { + "label": "Watermark Image", + "choose": "Choose Image", + "selected": "Selected: {{filename}}" + }, + "fontSize": "Font BÃŧyÃŧklÃŧğÃŧ", + "size": "Size", + "alphabet": "Font/Language", + "color": "Watermark Colour", + "rotation": "Rotation (degrees)", + "opacity": "Opacity (%)", + "spacing": { + "horizontal": "Horizontal Spacing", + "vertical": "Vertical Spacing", + "height": "Height Spacing", + "width": "Width Spacing" + }, + "convertToImage": "Flatten PDF pages to images" + }, + "alphabet": { + "roman": "Roman/Latin", + "arabic": "Arabic", + "japanese": "Japanese", + "korean": "Korean", + "chinese": "Chinese", + "thai": "Thai" + }, + "steps": { + "type": "Watermark Type", + "wording": "Wording", + "textStyle": "Style", + "formatting": "Formatting", + "file": "Watermark File" + }, + "results": { + "title": "Watermark Results" + }, + "tooltip": { + "language": { + "title": "Language Support", + "text": "Choose the appropriate language setting to ensure proper font rendering for your text." + }, + "appearance": { + "title": "Appearance Settings", + "text": "Control how your watermark looks and blends with the document.", + "bullet1": "Rotation: -360° to 360° for angled watermarks", + "bullet2": "Opacity: 0-100% for transparency control", + "bullet3": "Lower opacity creates subtle watermarks" + }, + "spacing": { + "title": "Spacing Control", + "text": "Adjust the spacing between repeated watermarks across the page.", + "bullet1": "Width spacing: Horizontal distance between watermarks", + "bullet2": "Height spacing: Vertical distance between watermarks", + "bullet3": "Higher values create more spread out patterns" + }, + "type": { + "header": { + "title": "Watermark Type Selection" + }, + "description": { + "title": "Choose Your Watermark", + "text": "Select between text or image watermarks based on your needs." + }, + "text": { + "title": "Text Watermarks", + "text": "Perfect for adding copyright notices, company names, or confidentiality labels. Supports multiple languages and custom colours.", + "bullet1": "Customisable fonts and languages", + "bullet2": "Adjustable colours and transparency", + "bullet3": "Ideal for legal or branding text" + }, + "image": { + "title": "Image Watermarks", + "text": "Use logos, stamps, or any image as a watermark. Great for branding and visual identification.", + "bullet1": "Upload any image format", + "bullet2": "Maintains image quality", + "bullet3": "Perfect for logos and stamps" + } + }, + "wording": { + "header": { + "title": "Text Content" + }, + "text": { + "title": "Watermark Text", + "text": "Enter the text that will appear as your watermark across the document.", + "bullet1": "Keep it concise for better readability", + "bullet2": "Common examples: 'CONFIDENTIAL', 'DRAFT', company name", + "bullet3": "Emoji characters are not supported and will be filtered out" + } + }, + "textStyle": { + "header": { + "title": "Text Style" + }, + "color": { + "title": "Colour Selection", + "text": "Choose a colour that provides good contrast with your document content.", + "bullet1": "Light grey (#d3d3d3) for subtle watermarks", + "bullet2": "Black or dark colours for high contrast", + "bullet3": "Custom colours for branding purposes" + }, + "language": { + "title": "Language Support", + "text": "Choose the appropriate language setting to ensure proper font rendering." + } + }, + "file": { + "header": { + "title": "Image Upload" + }, + "upload": { + "title": "Image Selection", + "text": "Upload an image file to use as your watermark.", + "bullet1": "Supports common formats: PNG, JPG, GIF, BMP", + "bullet2": "PNG with transparency works best", + "bullet3": "Higher resolution images maintain quality better" + }, + "recommendations": { + "title": "Best Practices", + "text": "Tips for optimal image watermark results.", + "bullet1": "Use logos or stamps with transparent backgrounds", + "bullet2": "Simple designs work better than complex images", + "bullet3": "Consider the final document size when choosing resolution" + } + }, + "formatting": { + "header": { + "title": "Formatting & Layout" + }, + "size": { + "title": "Size Control", + "text": "Adjust the size of your watermark (text or image).", + "bullet1": "Larger sizes create more prominent watermarks" + }, + "appearance": { + "title": "Appearance Settings", + "text": "Control how your watermark looks and blends with the document.", + "bullet1": "Rotation: -360° to 360° for angled watermarks", + "bullet2": "Opacity: 0-100% for transparency control", + "bullet3": "Lower opacity creates subtle watermarks" + }, + "spacing": { + "title": "Spacing Control", + "text": "Adjust the spacing between repeated watermarks across the page.", + "bullet1": "Horizontal spacing: Distance between watermarks left to right", + "bullet2": "Vertical spacing: Distance between watermarks top to bottom", + "bullet3": "Higher values create more spread out patterns" + }, + "security": { + "title": "Security Option", + "text": "Convert the final PDF to an image-based format for enhanced security.", + "bullet1": "Prevents text selection and copying", + "bullet2": "Makes watermarks harder to remove", + "bullet3": "Results in larger file sizes", + "bullet4": "Best for sensitive or copyrighted content" + } + } + }, + "type": { + "1": "Metin", + "2": "Resim" + }, + "tags": "Metin,tekrarlayan,etiket,kendi,telif hakkÄą,marka,img,jpg,fotoğraf,resim", "header": "Filigran Ekle", "customColor": "Özel Metin Rengi", "selectText": { @@ -759,17 +1506,6 @@ "8": "Filigran TÃŧrÃŧ:", "9": "Filigran Resmi:", "10": "PDF'yi PDF-Resim'e DÃļnÃŧştÃŧr" - }, - "submit": "Filigran Ekle", - "type": { - "1": "Metin", - "2": "Resim" - }, - "watermarkType": { - "text": "Metin" - }, - "settings": { - "fontSize": "Font BÃŧyÃŧklÃŧğÃŧ" } }, "permissions": { @@ -794,50 +1530,201 @@ "removePages": { "tags": "SayfalarÄą kaldÄąr,sayfalarÄą sil", "title": "KaldÄąr", + "pageNumbers": { + "label": "Pages to Remove", + "placeholder": "e.g., 1,3,5-8,10", + "error": "Invalid page number format. Use numbers, ranges (1-5), or mathematical expressions (2n+1)" + }, + "filenamePrefix": "pages_removed", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "settings": { + "title": "Settings" + }, + "tooltip": { + "header": { + "title": "Remove Pages Settings" + }, + "pageNumbers": { + "title": "Page Selection", + "text": "Specify which pages to remove from your PDF. You can select individual pages, ranges, or use mathematical expressions.", + "bullet1": "Individual pages: 1,3,5 (removes pages 1, 3, and 5)", + "bullet2": "Page ranges: 1-5,10-15 (removes pages 1-5 and 10-15)", + "bullet3": "Mathematical: 2n+1 (removes odd pages)", + "bullet4": "Open ranges: 5- (removes from page 5 to end)" + }, + "examples": { + "title": "Common Examples", + "text": "Here are some common page selection patterns:", + "bullet1": "Remove first page: 1", + "bullet2": "Remove last 3 pages: -3", + "bullet3": "Remove every other page: 2n", + "bullet4": "Remove specific scattered pages: 1,5,10,15" + }, + "safety": { + "title": "Safety Tips", + "text": "Important considerations when removing pages:", + "bullet1": "Always preview your selection before processing", + "bullet2": "Keep a backup of your original file", + "bullet3": "Page numbers start from 1, not 0", + "bullet4": "Invalid page numbers will be ignored" + } + }, + "error": { + "failed": "An error occurred whilst removing pages." + }, + "results": { + "title": "Page Removal Results" + }, "submit": "KaldÄąr" }, - "addPassword": { - "tags": "gÃŧvenli, gÃŧvenlik", - "title": "Parola Ekle", - "header": "Parola Ekle (Şifrele)", - "selectText": { - "1": "Şifrelenecek PDF'i seçin", - "2": "KullanÄącÄą ParolasÄą", - "3": "Şifreleme Anahtar Uzunluğu", - "4": "Daha yÃŧksek değerler daha gÃŧçlÃŧdÃŧr, ancak daha dÃŧşÃŧk değerler daha iyi uyumluluğa sahiptir.", - "5": "İzinlerin ayarlanmasÄą (Sahip parolasÄą ile birlikte kullanÄąlmasÄą Ãļnerilir)", - "6": "Belgenin birleştirilmesini Ãļnle", - "7": "İçeriğin Ã§ÄąkarÄąlmasÄąnÄą Ãļnle", - "8": "Erişilebilirlik için Ã§ÄąkarmanÄąn Ãļnlenmesi", - "9": "Formun doldurulmasÄąnÄą Ãļnle", - "10": "Değişikliği Ãļnle", - "11": "AÃ§Äąklama değişikliğini Ãļnle", - "12": "YazdÄąrmayÄą Ãļnle", - "13": "FarklÄą formatlarda yazdÄąrmayÄą Ãļnle", - "14": "Sahip ParolasÄą", - "15": "AÃ§Äąldığında belgeyle ne yapÄąlacağınÄą kÄąsÄątlar (TÃŧm okuyucular tarafÄąndan desteklenmez)", - "16": "Belgenin kendisinin aÃ§ÄąlmasÄąnÄą kÄąsÄątlar" + "extractPages": { + "title": "Extract Pages", + "pageNumbers": { + "label": "Pages to Extract", + "placeholder": "e.g., 1,3,5-8 or odd & 1-10" + }, + "settings": { + "title": "Settings" }, - "submit": "Şifrele", "tooltip": { - "permissions": { - "title": "İzinleri Değiştir" + "description": "Extracts the selected pages into a new PDF, preserving order." + }, + "error": { + "failed": "Failed to extract pages" + }, + "results": { + "title": "Pages Extracted" + }, + "submit": "Extract Pages" + }, + "pageSelection": { + "tooltip": { + "header": { + "title": "Page Selection Guide" + }, + "basic": { + "title": "Basic Usage", + "text": "Select specific pages from your PDF document using simple syntax.", + "bullet1": "Individual pages: 1,3,5", + "bullet2": "Page ranges: 3-6 or 10-15", + "bullet3": "All pages: all" + }, + "advanced": { + "title": "Advanced Features" + }, + "tips": { + "title": "Tips", + "text": "Keep these guidelines in mind:", + "bullet1": "Page numbers start from 1 (not 0)", + "bullet2": "Spaces are automatically removed", + "bullet3": "Invalid expressions are ignored" + }, + "syntax": { + "title": "Syntax Basics", + "text": "Use numbers, ranges, keywords, and progressions (n starts at 0). Parentheses are supported.", + "bullets": { + "numbers": "Numbers/ranges: 5, 10-20", + "keywords": "Keywords: odd, even", + "progressions": "Progressions: 3n, 4n+1" + } + }, + "operators": { + "title": "Operators", + "text": "AND has higher precedence than comma. NOT applies within the document range.", + "and": "AND: & or \"and\" — require both conditions (e.g., 1-50 & even)", + "comma": "Comma: , or | — combine selections (e.g., 1-10, 20)", + "not": "NOT: ! or \"not\" — exclude pages (e.g., 3n & not 30)" + }, + "examples": { + "title": "Examples" + }, + "complex": { + "bullet1": "1,3-5,8,2n → pages 1, 3–5, 8, plus evens", + "bullet2": "10-,2n-1 → from page 10 to end + odd pages", + "description": "Mix different types.", + "title": "Complex Combinations" + }, + "description": "Choose which pages to use for the operation. Supports single pages, ranges, formulas, and the all keyword.", + "individual": { + "bullet1": "1,3,5 → selects pages 1, 3, 5", + "bullet2": "2,7,12 → selects pages 2, 7, 12", + "description": "Enter numbers separated by commas.", + "title": "Individual Pages" + }, + "mathematical": { + "bullet1": "2n → all even pages (2, 4, 6â€Ļ)", + "bullet2": "2n-1 → all odd pages (1, 3, 5â€Ļ)", + "bullet3": "3n → every 3rd page (3, 6, 9â€Ļ)", + "bullet4": "4n-1 → pages 3, 7, 11, 15â€Ļ", + "description": "Use n in formulas for patterns.", + "title": "Mathematical Functions" + }, + "ranges": { + "bullet1": "3-6 → selects pages 3–6", + "bullet2": "10-15 → selects pages 10–15", + "bullet3": "5- → selects pages 5 to end", + "description": "Use - for consecutive pages.", + "title": "Page Ranges" + }, + "special": { + "bullet1": "all → selects all pages", + "title": "Special Keywords" } } }, - "removePassword": { - "tags": "gÃŧvenli,Şifreyi çÃļz,gÃŧvenlik,parolasÄąz,parolayÄą sil", - "title": "Parola KaldÄąr", - "header": "Parola KaldÄąr (Şifre ÇÃļz)", - "selectText": { - "1": "Şifreyi ÇÃļzmek için PDF Seçin", - "2": "Parola" + "bulkSelection": { + "syntaxError": "There is a syntax issue. See Page Selection tips for help.", + "header": { + "title": "Page Selection Guide" }, - "submit": "KaldÄąr", - "desc": "PDF belgenizden parola korumasÄąnÄą kaldÄąrÄąn.", - "password": { - "stepTitle": "ParolayÄą KaldÄąr", - "label": "Mevcut Şifre" + "syntax": { + "title": "Syntax Basics", + "text": "Use numbers, ranges, keywords, and progressions (n starts at 0). Parentheses are supported.", + "bullets": { + "numbers": "Numbers/ranges: 5, 10-20", + "keywords": "Keywords: odd, even", + "progressions": "Progressions: 3n, 4n+1" + } + }, + "operators": { + "title": "Operators", + "text": "AND has higher precedence than comma. NOT applies within the document range.", + "and": "AND: & or \"and\" — require both conditions (e.g., 1-50 & even)", + "comma": "Comma: , or | — combine selections (e.g., 1-10, 20)", + "not": "NOT: ! or \"not\" — exclude pages (e.g., 3n & not 30)" + }, + "examples": { + "title": "Examples", + "first50": "First 50", + "last50": "Last 50", + "every3rd": "Every 3rd", + "oddWithinExcluding": "Odd within 1-20 excluding 5-7", + "combineSets": "Combine sets" + }, + "firstNPages": { + "title": "First N Pages", + "placeholder": "Number of pages" + }, + "lastNPages": { + "title": "Last N Pages", + "placeholder": "Number of pages" + }, + "everyNthPage": { + "title": "Every Nth Page", + "placeholder": "Step size" + }, + "range": { + "title": "Range", + "fromPlaceholder": "From", + "toPlaceholder": "To" + }, + "keywords": { + "title": "Keywords" + }, + "advanced": { + "title": "Advanced" } }, "compressPdfs": { @@ -847,12 +1734,142 @@ "tags": "remove,delete,form,field,readonly", "title": "Form AlanlarÄąnÄąn Salt Okunur Özelliğini KaldÄąr", "header": "PDF FormlarÄąnÄąn Kilidini Aç", - "submit": "Remove" + "submit": "Remove", + "description": "This tool will remove read-only restrictions from PDF form fields, making them editable and fillable.", + "filenamePrefix": "unlocked_forms", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst unlocking PDF forms." + }, + "results": { + "title": "Unlocked Forms Results" + } }, "changeMetadata": { - "tags": "BaşlÄąk,yazar,tarih,oluşturma,zaman,yayÄąncÄą,Ãŧretici,istatistikler", - "title": "BaşlÄąk:", "header": "Metaveriyi Değiştir", + "submit": "Değiştir", + "filenamePrefix": "metadata", + "settings": { + "title": "Metadata Settings" + }, + "standardFields": { + "title": "Standard Fields" + }, + "deleteAll": { + "label": "Remove Existing Metadata", + "checkbox": "Delete all metadata" + }, + "title": { + "label": "Title", + "placeholder": "Document title" + }, + "author": { + "label": "Author", + "placeholder": "Document author" + }, + "subject": { + "label": "Subject", + "placeholder": "Document subject" + }, + "keywords": { + "label": "Keywords", + "placeholder": "Document keywords" + }, + "creator": { + "label": "Creator", + "placeholder": "Document creator" + }, + "producer": { + "label": "Producer", + "placeholder": "Document producer" + }, + "dates": { + "title": "Date Fields" + }, + "creationDate": { + "label": "Creation Date", + "placeholder": "Creation date" + }, + "modificationDate": { + "label": "Modification Date", + "placeholder": "Modification date" + }, + "trapped": { + "label": "Trapped Status", + "unknown": "Unknown", + "true": "True", + "false": "False" + }, + "advanced": { + "title": "Advanced Options" + }, + "customFields": { + "title": "Custom Metadata", + "description": "Add custom metadata fields to the document", + "add": "Add Field", + "key": "Key", + "keyPlaceholder": "Custom key", + "value": "Value", + "valuePlaceholder": "Custom value", + "remove": "Remove" + }, + "results": { + "title": "Updated PDFs" + }, + "error": { + "failed": "An error occurred while changing the PDF metadata." + }, + "tooltip": { + "header": { + "title": "PDF Metadata Overview" + }, + "standardFields": { + "title": "Standard Fields", + "text": "Common PDF metadata fields that describe the document.", + "bullet1": "Title: Document name or heading", + "bullet2": "Author: Person who created the document", + "bullet3": "Subject: Brief description of content", + "bullet4": "Keywords: Search terms for the document", + "bullet5": "Creator/Producer: Software used to create the PDF" + }, + "dates": { + "title": "Date Fields", + "text": "When the document was created and modified.", + "bullet1": "Creation Date: When original document was made", + "bullet2": "Modification Date: When last changed" + }, + "options": { + "title": "Additional Options", + "text": "Custom fields and privacy controls.", + "bullet1": "Custom Metadata: Add your own key-value pairs", + "bullet2": "Trapped Status: High-quality printing setting", + "bullet3": "Delete All: Remove all metadata for privacy" + }, + "deleteAll": { + "title": "Remove Existing Metadata", + "text": "Complete metadata deletion to ensure privacy." + }, + "customFields": { + "title": "Custom Metadata", + "text": "Add your own custom key-value metadata pairs.", + "bullet1": "Add any custom fields relevant to your document", + "bullet2": "Examples: Department, Project, Version, Status", + "bullet3": "Both key and value are required for each entry" + }, + "advanced": { + "title": "Advanced Options", + "trapped": { + "title": "Trapped Status", + "description": "Indicates if document is prepared for high-quality printing.", + "bullet1": "True: Document has been trapped for printing", + "bullet2": "False: Document has not been trapped", + "bullet3": "Unknown: Trapped status is not specified" + } + } + }, + "tags": "BaşlÄąk,yazar,tarih,oluşturma,zaman,yayÄąncÄą,Ãŧretici,istatistikler", "selectText": { "1": "Değiştirmek istediğiniz değişkenleri dÃŧzenleyin", "2": "TÃŧm metaveriyi sil", @@ -860,15 +1877,7 @@ "4": "Diğer Metaveri:", "5": "Özel Metaveri Girişi Ekle" }, - "author": "Yazar:", - "creationDate": "Oluşturma Tarihi (yyyy/MM/dd HH:mm:ss):", - "creator": "Oluşturan:", - "keywords": "Anahtar Kelimeler:", - "modDate": "Değişiklik Tarihi (yyyy/MM/dd HH:mm:ss):", - "producer": "Üretici:", - "subject": "Konu:", - "trapped": "Tuzak:", - "submit": "Değiştir" + "modDate": "Değişiklik Tarihi (yyyy/MM/dd HH:mm:ss):" }, "fileToPDF": { "tags": "dÃļnÃŧşÃŧm,format,belge,fotoğraf,slayt,metin,dÃļnÃŧşÃŧm,ofis,dokÃŧman,word,excel,powerpoint", @@ -882,6 +1891,7 @@ "ocr": { "tags": "tanÄąma,metin,resim,tarama,okuma,tanÄąmlama,algÄąlama,dÃŧzenlenebilir", "title": "OCR / Tarama Temizleme", + "desc": "TaramalarÄą temizler ve bir PDF içindeki resimlerden metni algÄąlar ve tekrar metin olarak ekler.", "header": "TaramalarÄą Temizle / OCR (Optik Karakter TanÄąma)", "selectText": { "1": "PDF içinde tespit edilecek dilleri seçin (Listelenenler şu anda tespit edilenlerdir):", @@ -900,23 +1910,89 @@ "help": "LÃŧtfen bu belgede başka dillerde nasÄąl kullanÄąlacağı ve/veya docker'da kullanÄąlmamasÄą hakkÄąnda bilgi edinin", "credit": "Bu hizmet OCR için qpdf ve Tesseract'Äą kullanÄąr.", "submit": "PDF'i OCR(Metin TanÄąma) ile İşle", - "desc": "TaramalarÄą temizler ve bir PDF içindeki resimlerden metni algÄąlar ve tekrar metin olarak ekler.", + "operation": { + "submit": "Process OCR and Review" + }, + "results": { + "title": "OCR Results" + }, + "languagePicker": { + "additionalLanguages": "Looking for additional languages?", + "viewSetupGuide": "View setup guide →" + }, "settings": { "title": "Ayarlar", "ocrMode": { - "label": "OCR Modu" + "label": "OCR Modu", + "auto": "Auto (skip text layers)", + "force": "Force (re-OCR all, replace text)", + "strict": "Strict (abort if text found)" }, "languages": { - "label": "Diller" + "label": "Diller", + "placeholder": "Select languages" + }, + "compatibilityMode": { + "label": "Compatibility Mode" + }, + "advancedOptions": { + "label": "Processing Options", + "sidecar": "Create a text file", + "deskew": "Deskew pages", + "clean": "Clean input file", + "cleanFinal": "Clean final output" } }, "tooltip": { + "header": { + "title": "OCR Settings Overview" + }, "mode": { - "title": "OCR Modu" + "title": "OCR Modu", + "text": "Optical Character Recognition (OCR) helps you turn scanned or screenshotted pages into text you can search, copy, or highlight.", + "bullet1": "Auto skips pages that already contain text layers.", + "bullet2": "Force re-OCRs every page and replaces all the text.", + "bullet3": "Strict halts if any selectable text is found." }, "languages": { - "title": "Diller" + "title": "Diller", + "text": "Improve OCR accuracy by specifying the expected languages. Choose one or more languages to guide detection." + }, + "output": { + "title": "Output", + "text": "Decide how you want the text output formatted:", + "bullet1": "Searchable PDF embeds text behind the original image.", + "bullet2": "HOCR XML returns a structured machine-readable file.", + "bullet3": "Plain-text sidecar creates a separate .txt file with raw content." + }, + "advanced": { + "header": { + "title": "Advanced OCR Processing" + }, + "compatibility": { + "title": "Compatibility Mode", + "text": "Uses OCR 'sandwich PDF' mode: results in larger files, but more reliable with certain languages and older PDF software. By default we use hOCR for smaller, modern PDFs." + }, + "sidecar": { + "title": "Create Text File", + "text": "Generates a separate .txt file alongside the PDF containing all extracted text content for easy access and processing." + }, + "deskew": { + "title": "Deskew Pages", + "text": "Automatically corrects skewed or tilted pages to improve OCR accuracy. Useful for scanned documents that weren't perfectly aligned." + }, + "clean": { + "title": "Clean Input File", + "text": "Preprocesses the input by removing noise, enhancing contrast, and optimising the image for better OCR recognition before processing." + }, + "cleanFinal": { + "title": "Clean Final Output", + "text": "Post-processes the final PDF by removing OCR artefacts and optimising the text layer for better readability and smaller file size." + } } + }, + "error": { + "failed": "OCR operation failed" } }, "extractImages": { @@ -925,7 +2001,13 @@ "header": "Resimleri Ã‡Äąkar", "selectText": "Ã‡ÄąkarÄąlan resimleri dÃļnÃŧştÃŧrmek için resim formatÄąnÄą seçin", "allowDuplicates": "Yinelenen gÃļrselleri kaydet", - "submit": "Ã‡Äąkar" + "submit": "Ã‡Äąkar", + "settings": { + "title": "Settings" + }, + "error": { + "failed": "An error occurred while extracting images from the PDF." + } }, "pdfToPDFA": { "tags": "arşiv,uzun vadeli,standart,dÃļnÃŧşÃŧm,saklama,koruma", @@ -997,17 +2079,53 @@ }, "info": "Python kurulu değil. ÇalÄąÅŸmasÄą için gereklidir." }, + "scannerImageSplit": { + "title": "Extracted Images", + "submit": "Extract Image Scans", + "error": { + "failed": "An error occurred while extracting image scans." + }, + "tooltip": { + "title": "Photo Splitter", + "whatThisDoes": "What this does", + "whatThisDoesDesc": "Automatically finds and extracts each photo from a scanned page or composite image—no manual cropping.", + "whenToUse": "When to use", + "useCase1": "Scan whole album pages in one go", + "useCase2": "Split flatbed batches into separate files", + "useCase3": "Break collages into individual photos", + "useCase4": "Pull photos from documents", + "quickFixes": "Quick fixes", + "problem1": "Photos not detected → increase Tolerance to 30-50", + "problem2": "Too many false detections → increase Minimum Area to 15,000-20,000", + "problem3": "Crops are too tight → increase Border Size to 5-10", + "problem4": "Tilted photos not straightened → lower Angle Threshold to ~5°", + "problem5": "Dust/noise boxes → increase Minimum Contour Area to 1000-2000", + "setupTips": "Setup tips", + "tip1": "Use a plain, light background", + "tip2": "Leave a small gap (≈1 cm) between photos", + "tip3": "Scan at 300-600 DPI", + "tip4": "Clean the scanner glass", + "headsUp": "Heads-up", + "headsUpDesc": "Overlapping photos or backgrounds very close in colour to the photos can reduce accuracy-try a lighter or darker background and leave more space." + } + }, "sign": { - "tags": "onayla,başharfler,çizili-imza,metin-imza,resim-imza", "title": "İmzala", "header": "PDF'lere İmza At", "upload": "Resim YÃŧkle", - "draw": "İmza Çiz", - "text": "Metin Girişi", + "draw": { + "title": "Draw your signature", + "clear": "Clear" + }, + "text": { + "name": "Signer Name", + "placeholder": "Enter your full name" + }, "clear": "Temizle", "add": "Ekle", "saved": "Kaydedilmiş İmzalar", "save": "İmzayÄą Kaydet", + "applySignatures": "Apply Signatures", "personalSigs": "Kişisel İmzalar", "sharedSigs": "PaylaÅŸÄąlan İmzalar", "noSavedSigs": "KayÄątlÄą imza bulunamadÄą", @@ -1019,42 +2137,179 @@ "previous": "Önceki sayfa", "maintainRatio": "OranÄą korumayÄą değiştir", "undo": "Geri Al", - "redo": "Yinele" + "redo": "Yinele", + "submit": "Sign Document", + "steps": { + "configure": "Configure Signature" + }, + "type": { + "title": "Signature Type", + "draw": "Draw", + "canvas": "Canvas", + "image": "Image", + "text": "Text" + }, + "image": { + "label": "Upload signature image", + "placeholder": "Select image file", + "hint": "Upload a PNG or JPG image of your signature" + }, + "instructions": { + "title": "How to add signature", + "canvas": "After drawing your signature in the canvas, close the modal then click anywhere on the PDF to place it.", + "image": "After uploading your signature image above, click anywhere on the PDF to place it.", + "text": "After entering your name above, click anywhere on the PDF to place your signature." + }, + "mode": { + "move": "Move Signature", + "place": "Place Signature" + }, + "updateAndPlace": "Update and Place", + "activate": "Activate Signature Placement", + "deactivate": "Stop Placing Signatures", + "results": { + "title": "Signature Results" + }, + "error": { + "failed": "An error occurred while signing the PDF." + }, + "tags": "onayla,başharfler,çizili-imza,metin-imza,resim-imza" }, "flatten": { - "tags": "statik,devre dÄąÅŸÄą bÄąrak,etkileşimsiz,sadeleştir", "title": "DÃŧzleştir", "header": "PDF'leri DÃŧzleştir", "flattenOnlyForms": "YalnÄązca formlarÄą dÃŧzleştir", "submit": "DÃŧzleştir", + "filenamePrefix": "flattened", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, "steps": { "settings": "Ayarlar" }, "options": { - "flattenOnlyForms": "YalnÄązca formlarÄą dÃŧzleştir" - } + "stepTitle": "Flatten Options", + "title": "Flatten Options", + "flattenOnlyForms": { + "label": "YalnÄązca formlarÄą dÃŧzleştir", + "desc": "Only flatten form fields, leaving other interactive elements intact" + }, + "note": "Flattening removes interactive elements from the PDF, making them non-editable." + }, + "results": { + "title": "Flatten Results" + }, + "error": { + "failed": "An error occurred while flattening the PDF." + }, + "tooltip": { + "header": { + "title": "About Flattening PDFs" + }, + "description": { + "title": "What does flattening do?", + "text": "Flattening makes your PDF non-editable by turning fillable forms and buttons into regular text and images. The PDF will look exactly the same, but no one can change or fill in the forms anymore. Perfect for sharing completed forms, creating final documents for records, or ensuring the PDF looks the same everywhere.", + "bullet1": "Text boxes become regular text (can't be edited)", + "bullet2": "Checkboxes and buttons become pictures", + "bullet3": "Great for final versions you don't want changed", + "bullet4": "Ensures consistent appearance across all devices" + }, + "formsOnly": { + "title": "What does 'Flatten only forms' mean?", + "text": "This option only removes the ability to fill in forms, but keeps other features working like clicking links, viewing bookmarks, and reading comments.", + "bullet1": "Forms become non-editable", + "bullet2": "Links still work when clicked", + "bullet3": "Comments and notes remain visible", + "bullet4": "Bookmarks still help you navigate" + } + }, + "tags": "statik,devre dÄąÅŸÄą bÄąrak,etkileşimsiz,sadeleştir" }, "repair": { "tags": "onar,geri yÃŧkle,dÃŧzelt,geri getir", "title": "Onar", "header": "PDF'leri Onar", - "submit": "Onar" + "submit": "Onar", + "description": "This tool will attempt to repair corrupted or damaged PDF files. No additional settings are required.", + "filenamePrefix": "repaired", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst repairing the PDF." + }, + "results": { + "title": "Repair Results" + } }, "removeBlanks": { - "tags": "temizle,sadeleştir,içeriksiz,dÃŧzenle", "title": "BoşlarÄą KaldÄąr", "header": "Boş SayfalarÄą KaldÄąr", - "threshold": "Pixel BeyazlÄąk Eşiği:", + "settings": { + "title": "Settings" + }, + "threshold": { + "label": "Pixel Whiteness Threshold" + }, + "whitePercent": { + "label": "White Percentage Threshold", + "unit": "%" + }, + "includeBlankPages": { + "label": "Include detected blank pages" + }, + "tooltip": { + "header": { + "title": "Remove Blank Pages Settings" + }, + "threshold": { + "title": "Pixel Whiteness Threshold", + "text": "Controls how white a pixel must be to be considered 'white'. This helps determine what counts as a blank area on the page.", + "bullet1": "0 = Pure black (most restrictive)", + "bullet2": "128 = Medium grey", + "bullet3": "255 = Pure white (least restrictive)" + }, + "whitePercent": { + "title": "White Percentage Threshold", + "text": "Sets the minimum percentage of white pixels required for a page to be considered blank and removed.", + "bullet1": "Lower values (e.g., 80%) = More pages removed", + "bullet2": "Higher values (e.g., 95%) = Only very blank pages removed", + "bullet3": "Use higher values for documents with light backgrounds" + }, + "includeBlankPages": { + "title": "Include Detected Blank Pages", + "text": "When enabled, creates a separate PDF containing all the blank pages that were detected and removed from the original document.", + "bullet1": "Useful for reviewing what was removed", + "bullet2": "Helps verify the detection accuracy", + "bullet3": "Can be disabled to reduce output file size" + } + }, + "submit": "BoşlarÄą KaldÄąr", + "error": { + "failed": "Failed to remove blank pages" + }, + "results": { + "title": "Removed Blank Pages" + }, + "tags": "temizle,sadeleştir,içeriksiz,dÃŧzenle", "thresholdDesc": "Bir beyaz pixelin 'Beyaz' olarak sÄąnÄąflandÄąrÄąlmasÄą için ne kadar beyaz olmasÄą gerektiğini belirlemek için eşik. 0 = Siyah, 255 saf beyaz.", - "whitePercent": "Beyaz YÃŧzde (%):", - "whitePercentDesc": "Bir sayfanÄąn 'beyaz' pixel olmasÄą gereken yÃŧzdesi", - "submit": "BoşlarÄą KaldÄąr" + "whitePercentDesc": "Bir sayfanÄąn 'beyaz' pixel olmasÄą gereken yÃŧzdesi" }, "removeAnnotations": { "tags": "yorumlar,vurgulama,notlar,işaretleme,kaldÄąrma", "title": "Ek AÃ§ÄąklamalarÄą KaldÄąr", "header": "Ek AÃ§ÄąklamalarÄą KaldÄąr", - "submit": "KaldÄąr" + "submit": "KaldÄąr", + "settings": { + "title": "Settings" + }, + "info": { + "title": "About Remove Annotations", + "description": "This tool will remove all annotations (comments, highlights, notes, etc.) from your PDF documents." + }, + "error": { + "failed": "An error occurred while removing annotations from the PDF." + } }, "compare": { "tags": "farklÄąlaştÄąr,karÅŸÄąlaştÄąr,değişiklikler,analiz", @@ -1086,6 +2341,142 @@ "certSign": { "tags": "doğrula,PEM,P12,resmi,şifrele", "title": "Sertifika İmzalama", + "filenamePrefix": "signed", + "signMode": { + "stepTitle": "Sign Mode", + "tooltip": { + "header": { + "title": "About PDF Signatures" + }, + "overview": { + "title": "How signatures work", + "text": "Both modes seal the document (any edits are flagged as tampering) and record who/when/how for auditing. Viewer trust depends on the certificate chain." + }, + "manual": { + "title": "Manual - Bring your certificate", + "text": "Use your own certificate files for brand-aligned identity. Can display Trusted when your CA/chain is recognised.", + "use": "Use for: customer-facing, legal, compliance." + }, + "auto": { + "title": "Auto - Zero-setup, instant system seal", + "text": "Signs with a server self-signed certificate. Same tamper-evident seal and audit trail; typically shows Unverified in viewers.", + "use": "Use when: you need speed and consistent internal identity across reviews and records." + }, + "rule": { + "title": "Rule of thumb", + "text": "Need recipient Trusted status? Manual. Need a fast, tamper-evident seal and audit trail with no setup? Auto." + } + } + }, + "certTypeStep": { + "stepTitle": "Certificate Format" + }, + "certFiles": { + "stepTitle": "Certificate Files" + }, + "appearance": { + "stepTitle": "Signature Appearance", + "tooltip": { + "header": { + "title": "About Signature Appearance" + }, + "invisible": { + "title": "Invisible Signatures", + "text": "The signature is added to the PDF for security but won't be visible when viewing the document. Perfect for legal requirements without changing the document's appearance.", + "bullet1": "Provides security without visual changes", + "bullet2": "Meets legal requirements for digital signing", + "bullet3": "Doesn't affect document layout or design" + }, + "visible": { + "title": "Visible Signatures", + "text": "Shows a signature block on the PDF with your name, date, and optional details. Useful when you want readers to clearly see the document is signed.", + "bullet1": "Shows signer name and date on the document", + "bullet2": "Can include reason and location for signing", + "bullet3": "Choose which page to place the signature", + "bullet4": "Optional logo can be included" + } + }, + "invisible": "Invisible", + "options": { + "title": "Signature Details" + }, + "visible": "Visible" + }, + "sign": { + "submit": "Sign PDF", + "results": "Signed PDF" + }, + "error": { + "failed": "An error occurred whilst processing signatures." + }, + "tooltip": { + "header": { + "title": "About Managing Signatures" + }, + "overview": { + "title": "What can this tool do?", + "text": "This tool lets you check if your PDFs are digitally signed and add new digital signatures. Digital signatures prove who created or approved a document and show if it has been changed since signing.", + "bullet1": "Check existing signatures and their validity", + "bullet2": "View detailed information about signers and certificates", + "bullet3": "Add new digital signatures to secure your documents", + "bullet4": "Multiple files supported with easy navigation" + }, + "validation": { + "title": "Checking Signatures", + "text": "When you check signatures, the tool tells you if they're valid, who signed the document, when it was signed, and whether the document has been changed since signing.", + "bullet1": "Shows if signatures are valid or invalid", + "bullet2": "Displays signer information and signing date", + "bullet3": "Checks if the document was modified after signing", + "bullet4": "Can use custom certificates for verification" + }, + "signing": { + "title": "Adding Signatures", + "text": "To sign a PDF, you need a digital certificate (like PEM, PKCS12, or JKS). You can choose to make the signature visible on the document or keep it invisible for security only.", + "bullet1": "Supports PEM, PKCS12, JKS, and server certificate formats", + "bullet2": "Option to show or hide signature on the PDF", + "bullet3": "Add reason, location, and signer name", + "bullet4": "Choose which page to place visible signatures", + "bullet5": "Use server certificate for simple 'Sign with Stirling-PDF' option" + } + }, + "certType": { + "tooltip": { + "header": { + "title": "About Certificate Types" + }, + "what": { + "title": "What's a certificate?", + "text": "It's a secure ID for your signature that proves you signed. Unless you're required to sign via certificate, we recommend using another secure method like Type, Draw, or Upload." + }, + "which": { + "title": "Which option should I use?", + "text": "Choose the format that matches your certificate file:", + "bullet1": "PKCS#12 (.p12 / .pfx) – one combined file (most common)", + "bullet2": "PFX (.pfx) – Microsoft's version of PKCS12", + "bullet3": "PEM – separate private-key and certificate .pem files", + "bullet4": "JKS – Java .jks keystore for dev / CI-CD workflows" + }, + "convert": { + "title": "Key not listed?", + "text": "Convert your file to a Java keystore (.jks) with keytool, then pick JKS." + } + } + }, + "chooseCertificate": "Choose Certificate File", + "chooseJksFile": "Choose JKS File", + "chooseP12File": "Choose PKCS12 File", + "choosePfxFile": "Choose PFX File", + "choosePrivateKey": "Choose Private Key File", + "location": "Konum", + "logoTitle": "Logo", + "name": "İsim", + "noLogo": "No Logo", + "pageNumber": "Page Number", + "password": "Anahtar Deposu veya Özel Anahtar Şifrenizi Girin (Varsa):", + "passwordOptional": "Leave empty if no password", + "reason": "Neden", + "serverCertMessage": "Using server certificate - no files or password required", + "showLogo": "Show Logo", "header": "SertifikanÄązla bir PDF imzalayÄąn (Devam eden iş)", "selectPDF": "İmzalamak için bir PDF DosyasÄą seçin:", "jksNote": "Not: Sertifika tÃŧrÃŧnÃŧz aşağıda listelenmemişse, lÃŧtfen keytool komut satÄąrÄą aracÄąnÄą kullanarak sertifikanÄązÄą bir Java Keystore (.jks) dosyasÄąna dÃļnÃŧştÃŧrÃŧn. ArdÄąndan, aşağıdaki .jks dosyasÄą seçeneğini seçin.", @@ -1093,13 +2484,7 @@ "selectCert": "Sertifika DosyanÄązÄą Seçin (X.509 formatÄąnda, .pem veya .der olabilir):", "selectP12": "PKCS#12 Anahtar Deposu DosyanÄązÄą Seçin (.p12 veya .pfx) (İsteğe bağlÄą, sağlanÄąrsa, Ãļzel anahtarÄąnÄązÄą ve sertifikanÄązÄą içermelidir):", "selectJKS": "Java Keystore DosyanÄązÄą (.jks veya .keystore) seçin:", - "certType": "Sertifika TÃŧrÃŧ", - "password": "Anahtar Deposu veya Özel Anahtar Şifrenizi Girin (Varsa):", "showSig": "İmzayÄą GÃļster", - "reason": "Neden", - "location": "Konum", - "name": "İsim", - "showLogo": "Show Logo", "submit": "PDF'i İmzala" }, "removeCertSign": { @@ -1107,7 +2492,18 @@ "title": "Sertifika İmzasÄąnÄą KaldÄąr", "header": "PDF'ten dijital sertifikayÄą kaldÄąrÄąn", "selectPDF": "PDF dosyasÄą seçin:", - "submit": "İmzayÄą KaldÄąr" + "submit": "İmzayÄą KaldÄąr", + "description": "This tool will remove digital certificate signatures from your PDF document.", + "filenamePrefix": "unsigned", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst removing certificate signatures." + }, + "results": { + "title": "Certificate Removal Results" + } }, "pageLayout": { "tags": "birleştir,kompozit,tek-gÃļrÃŧnÃŧm,dÃŧzenle", @@ -1115,16 +2511,157 @@ "header": "Çoklu Sayfa DÃŧzeni", "pagesPerSheet": "Sayfa baÅŸÄąna sayfalar:", "addBorder": "KenarlÄąk Ekle", - "submit": "GÃļnder" + "submit": "GÃļnder", + "desc": { + "2": "Place 2 pages side-by-side on a single sheet.", + "3": "Place 3 pages on a single sheet in a single row.", + "4": "Place 4 pages on a single sheet (2 × 2 grid).", + "9": "Place 9 pages on a single sheet (3 × 3 grid).", + "16": "Place 16 pages on a single sheet (4 × 4 grid)." + }, + "error": { + "failed": "An error occurred while creating the multi-page layout." + } + }, + "bookletImposition": { + "tags": "booklet,imposition,printing,binding,folding,signature", + "title": "Booklet Imposition", + "header": "Booklet Imposition", + "submit": "Create Booklet", + "spineLocation": { + "label": "Spine Location", + "left": "Left (Standard)", + "right": "Right (RTL)" + }, + "doubleSided": { + "label": "Double-sided printing", + "tooltip": "Creates both front and back sides for proper booklet printing" + }, + "manualDuplex": { + "title": "Manual Duplex Mode", + "instructions": "For printers without automatic duplex. You'll need to run this twice:" + }, + "duplexPass": { + "label": "Print Pass", + "first": "1st Pass", + "second": "2nd Pass", + "firstInstructions": "Prints front sides → stack face-down → run again with 2nd Pass", + "secondInstructions": "Load printed stack face-down → prints back sides" + }, + "rtlBinding": { + "label": "Right-to-left binding", + "tooltip": "For Arabic, Hebrew, or other right-to-left languages" + }, + "addBorder": { + "label": "Add borders around pages", + "tooltip": "Adds borders around each page section to help with cutting and alignment" + }, + "addGutter": { + "label": "Add gutter margin", + "tooltip": "Adds inner margin space for binding" + }, + "gutterSize": { + "label": "Gutter size (points)" + }, + "flipOnShortEdge": { + "label": "Flip on short edge (automatic duplex only)", + "tooltip": "Enable for short-edge duplex printing (automatic duplex only - ignored in manual mode)", + "manualNote": "Not needed in manual mode - you flip the stack yourself" + }, + "advanced": { + "toggle": "Advanced Options" + }, + "paperSizeNote": "Paper size is automatically derived from your first page.", + "tooltip": { + "header": { + "title": "Booklet Creation Guide" + }, + "description": { + "title": "What is Booklet Imposition?", + "text": "Creates professional booklets by arranging pages in the correct printing order. Your PDF pages are placed 2-up on landscape sheets so when folded and bound, they read in proper sequence like a real book." + }, + "example": { + "title": "Example: 8-Page Booklet", + "text": "Your 8-page document becomes 2 sheets:", + "bullet1": "Sheet 1 Front: Pages 8, 1 | Back: Pages 2, 7", + "bullet2": "Sheet 2 Front: Pages 6, 3 | Back: Pages 4, 5", + "bullet3": "When folded & stacked: Reads 1→2→3→4→5→6→7→8" + }, + "printing": { + "title": "How to Print & Assemble", + "text": "Follow these steps for perfect booklets:", + "bullet1": "Print double-sided with 'Flip on long edge'", + "bullet2": "Stack sheets in order, fold in half", + "bullet3": "Staple or bind along the folded spine", + "bullet4": "For short-edge printers: Enable 'Flip on short edge' option" + }, + "manualDuplex": { + "title": "Manual Duplex (Single-sided Printers)", + "text": "For printers without automatic duplex:", + "bullet1": "Turn OFF 'Double-sided printing'", + "bullet2": "Select '1st Pass' → Print → Stack face-down", + "bullet3": "Select '2nd Pass' → Load stack → Print backs", + "bullet4": "Fold and assemble as normal" + }, + "advanced": { + "title": "Advanced Options", + "text": "Fine-tune your booklet:", + "bullet1": "Right-to-Left Binding: For Arabic, Hebrew, or RTL languages", + "bullet2": "Borders: Shows cut lines for trimming", + "bullet3": "Gutter Margin: Adds space for binding/stapling", + "bullet4": "Short-edge Flip: Only for automatic duplex printers" + } + }, + "error": { + "failed": "An error occurred while creating the booklet imposition." + } }, "scalePages": { - "tags": "boyutlandÄąr,değiştir,boyut,uyarla", "title": "Sayfa Ölçeğini Ayarla", "header": "Sayfa Ölçeğini Ayarla", "pageSize": "Belgenin bir sayfa boyutu.", "keepPageSize": "Original Size", "scaleFactor": "Bir sayfanÄąn yakÄąnlaştÄąrma seviyesi (kÄąrpma).", - "submit": "GÃļnder" + "submit": "GÃļnder", + "tags": "boyutlandÄąr,değiştir,boyut,uyarla" + }, + "adjustPageScale": { + "tags": "resize,modify,dimension,adapt", + "title": "Adjust Page Scale", + "header": "Adjust Page Scale", + "scaleFactor": { + "label": "Scale Factor" + }, + "pageSize": { + "label": "Target Page Size", + "keep": "Keep Original Size", + "letter": "Letter", + "legal": "Legal" + }, + "submit": "Adjust Page Scale", + "error": { + "failed": "An error occurred while adjusting the page scale." + }, + "tooltip": { + "header": { + "title": "Page Scale Settings Overview" + }, + "description": { + "title": "Description", + "text": "Adjust the size of PDF content and change the page dimensions." + }, + "scaleFactor": { + "title": "Scale Factor", + "text": "Controls how large or small the content appears on the page. Content is scaled and centred - if scaled content is larger than the page size, it may be cropped.", + "bullet1": "1.0 = Original size", + "bullet2": "0.5 = Half size (50% smaller)", + "bullet3": "2.0 = Double size (200% larger, may crop)" + }, + "pageSize": { + "title": "Target Page Size", + "text": "Sets the dimensions of the output PDF pages. 'Keep Original Size' maintains current dimensions, whilst other options resize to standard paper sizes." + } + } }, "add-page-numbers": { "tags": "sayfalandÄąr,etiket,dÃŧzenle,dizin" @@ -1133,16 +2670,83 @@ "tags": "otomatik-tespit,başlÄąk-tabanlÄą,dÃŧzenle,yeniden-etiketle", "title": "Otomatik Yeniden AdlandÄąr", "header": "PDF'i Otomatik Yeniden AdlandÄąr", - "submit": "Otomatik Yeniden AdlandÄąr" + "description": "Automatically finds the title from your PDF content and uses it as the filename.", + "submit": "Otomatik Yeniden AdlandÄąr", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst auto-renaming the PDF." + }, + "results": { + "title": "Auto-Rename Results" + }, + "tooltip": { + "header": { + "title": "How Auto-Rename Works" + }, + "howItWorks": { + "title": "Smart Renaming", + "text": "Automatically finds the title from your PDF content and uses it as the filename.", + "bullet1": "Looks for text that appears to be a title or heading", + "bullet2": "Creates a clean, valid filename from the detected title", + "bullet3": "Keeps the original name if no suitable title is found" + } + } }, "adjust-contrast": { "tags": "renk-dÃŧzeltme,ayarla,değiştir,artÄąr" }, "crop": { - "tags": "kÄąrp,kÃŧçÃŧlt,dÃŧzenle,şekillendir", "title": "KÄąrp", "header": "PDF'i KÄąrp", - "submit": "GÃļnder" + "submit": "GÃļnder", + "noFileSelected": "Select a PDF file to begin cropping", + "preview": { + "title": "Crop Area Selection" + }, + "reset": "Reset to full PDF", + "coordinates": { + "title": "Position and Size", + "x": { + "label": "X Position", + "desc": "Left edge (points)" + }, + "y": { + "label": "Y Position", + "desc": "Bottom edge (points)" + }, + "width": { + "label": "Width", + "desc": "Crop width (points)" + }, + "height": { + "label": "Height", + "desc": "Crop height (points)" + } + }, + "error": { + "invalidArea": "Crop area extends beyond PDF boundaries", + "failed": "Failed to crop PDF" + }, + "steps": { + "selectArea": "Select Crop Area" + }, + "tooltip": { + "title": "How to Crop PDFs", + "description": "Select the area to crop from your PDF by dragging and resizing the blue overlay on the thumbnail.", + "drag": "Drag the overlay to move the crop area", + "resize": "Drag the corner and edge handles to resize", + "precision": "Use coordinate inputs for precise positioning" + }, + "results": { + "title": "Crop Results" + }, + "automation": { + "info": "Enter crop coordinates in PDF points. Origin (0,0) is at bottom-left. These values will be applied to all PDFs processed in this automation.", + "reference": "Reference: A4 page is 595.28 × 841.89 points (210mm × 297mm). 1 inch = 72 points." + }, + "tags": "kÄąrp,kÃŧçÃŧlt,dÃŧzenle,şekillendir" }, "autoSplitPDF": { "tags": "QR-tabanlÄą,ayÄąr,tarama-segmenti,dÃŧzenle", @@ -1225,24 +2829,124 @@ "downloadJS": "Javascript İndir", "submit": "GÃļster" }, - "autoRedact": { - "tags": "Karart,Gizle,karartma,siyah,markÃļr,gizli", - "title": "Otomatik Karartma", - "header": "Otomatik Karartma", - "colorLabel": "Renk", - "textsToRedactLabel": "KarartÄąlacak Metin (satÄąr ayrÄąlmÄąÅŸ)", - "textsToRedactPlaceholder": "Örn. \\nGizli \\nÇok Gizli", - "useRegexLabel": "Regex Kullan", - "wholeWordSearchLabel": "Tam Kelime Arama", - "customPaddingLabel": "Özel Ekstra Dolgu", - "convertPDFToImageLabel": "PDF'i PDF-GÃļrÃŧntÃŧ'ye dÃļnÃŧştÃŧr (Kutunun arkasÄąndaki metni kaldÄąrmak için kullanÄąlÄąr)", - "submitButton": "GÃļnder" - }, "redact": { "tags": "SansÃŧrle,Gizle,karart,karartma,işaretleyici,gizli,manuel", "title": "Manuel SansÃŧrleme", - "header": "Manuel SansÃŧrleme", "submit": "SansÃŧrle", + "error": { + "failed": "An error occurred while redacting the PDF." + }, + "modeSelector": { + "title": "Redaction Method", + "mode": "Mode", + "automatic": "Automatic", + "automaticDesc": "Redact text based on search terms", + "manual": "Manual", + "manualDesc": "Click and drag to redact specific areas", + "manualComingSoon": "Manual redaction coming soon" + }, + "auto": { + "header": "Auto Redact", + "settings": { + "title": "Redaction Settings", + "advancedTitle": "Gelişmiş" + }, + "colorLabel": "Box Colour", + "wordsToRedact": { + "title": "Words to Redact", + "placeholder": "Enter a word", + "add": "Ekle", + "examples": "Examples: Confidential, Top-Secret" + }, + "useRegexLabel": "Use Regex", + "wholeWordSearchLabel": "Whole Word Search", + "customPaddingLabel": "Custom Extra Padding", + "convertPDFToImageLabel": "Convert PDF to PDF-Image" + }, + "tooltip": { + "mode": { + "header": { + "title": "Redaction Method" + }, + "automatic": { + "title": "Automatic Redaction", + "text": "Automatically finds and redacts specified text throughout the document. Perfect for removing consistent sensitive information like names, addresses, or confidential markers." + }, + "manual": { + "title": "Manual Redaction", + "text": "Click and drag to manually select specific areas to redact. Gives you precise control over what gets redacted. (Coming soon)" + } + }, + "words": { + "header": { + "title": "Words to Redact" + }, + "description": { + "title": "Text Matching", + "text": "Enter words or phrases to find and redact in your document. Each word will be searched for separately." + }, + "bullet1": "Add one word at a time", + "bullet2": "Press Enter or click 'Add Another' to add", + "bullet3": "Click × to remove words", + "examples": { + "title": "Common Examples", + "text": "Typical words to redact include: bank details, email addresses, or specific names." + } + }, + "advanced": { + "header": { + "title": "Advanced Redaction Settings" + }, + "color": { + "title": "Box Colour & Padding", + "text": "Customise the appearance of redaction boxes. Black is standard, but you can choose any colour. Padding adds extra space around the found text." + }, + "regex": { + "title": "Use Regex", + "text": "Enable regular expressions for advanced pattern matching. Useful for finding phone numbers, emails, or complex patterns.", + "bullet1": "Example: \\d{4}-\\d{2}-\\d{2} to match any dates in YYYY-MM-DD format", + "bullet2": "Use with caution - test thoroughly" + }, + "wholeWord": { + "title": "Whole Word Search", + "text": "Only match complete words, not partial matches. 'John' won't match 'Johnson' when enabled." + }, + "convert": { + "title": "Convert to PDF-Image", + "text": "Converts the PDF to an image-based PDF after redaction. This ensures text behind redaction boxes is completely removed and unrecoverable." + } + } + }, + "manual": { + "header": "Manual Redaction", + "textBasedRedaction": "Text-based Redaction", + "pageBasedRedaction": "Page-based Redaction", + "convertPDFToImageLabel": "Convert PDF to PDF-Image (Used to remove text behind the box)", + "pageRedactionNumbers": { + "title": "Sayfalar", + "placeholder": "(Ãļrneğin 1,2,8 veya 4,7,12-16 ya da 2n-1)" + }, + "redactionColor": { + "title": "Redaction Colour" + }, + "export": "DÄąÅŸa Aktar", + "upload": "Upload", + "boxRedaction": "Box draw redaction", + "zoom": "Zoom", + "zoomIn": "Zoom in", + "zoomOut": "Zoom out", + "nextPage": "Next Page", + "previousPage": "Previous Page", + "toggleSidebar": "Toggle Sidebar", + "showThumbnails": "Show Thumbnails", + "showDocumentOutline": "Show Document Outline (double-click to expand/collapse all items)", + "showAttachments": "Show Attachments", + "showLayers": "Show Layers (double-click to reset all layers to the default state)", + "colourPicker": "Colour Picker", + "findCurrentOutlineItem": "Find current outline item", + "applyChanges": "Apply Changes" + }, + "header": "Manuel SansÃŧrleme", "textBasedRedaction": "Metin TabanlÄą SansÃŧrleme", "pageBasedRedaction": "Sayfa TabanlÄą SansÃŧrleme", "convertPDFToImageLabel": "PDF'yi GÃļrsel PDF'ye DÃļnÃŧştÃŧr (Kutunun arkasÄąndaki metni kaldÄąrmak için kullanÄąlÄąr)", @@ -1268,22 +2972,7 @@ "showLayers": "KatmanlarÄą GÃļster (tÃŧm katmanlarÄą varsayÄąlana dÃļndÃŧrmek için çift tÄąklayÄąn)", "colourPicker": "Renk Seçici", "findCurrentOutlineItem": "Geçerli Anahat Öğesini Bul", - "applyChanges": "Değişiklikleri Uygula", - "auto": { - "settings": { - "advancedTitle": "Gelişmiş" - }, - "wordsToRedact": { - "add": "Ekle" - } - }, - "manual": { - "pageRedactionNumbers": { - "title": "Sayfalar", - "placeholder": "(Ãļrneğin 1,2,8 veya 4,7,12-16 ya da 2n-1)" - }, - "export": "DÄąÅŸa Aktar" - } + "applyChanges": "Değişiklikleri Uygula" }, "tableExtraxt": { "tags": "CSV, Tablo Ã‡Äąkarma, ayÄąklama, dÃļnÃŧştÃŧrme" @@ -1294,11 +2983,15 @@ "overlay-pdfs": { "tags": "Bindirme", "header": "PDF DosyalarÄąnÄą Bindirme", + "title": "Overlay PDFs", + "desc": "Overlay one PDF on top of another", "baseFile": { "label": "Temel PDF DosyasÄąnÄą Seçin" }, "overlayFiles": { - "label": "İkinci PDF DosyalarÄąnÄą Seçin" + "label": "İkinci PDF DosyalarÄąnÄą Seçin", + "placeholder": "Choose PDF(s)...", + "addMore": "Add more PDFs..." }, "mode": { "label": "Bindirme Modunu Seçin", @@ -1308,14 +3001,53 @@ }, "counts": { "label": "Bindirme SayÄąlarÄą (Sabit Tekrar Modu için)", - "placeholder": "VirgÃŧlle ayrÄąlmÄąÅŸ sayÄąlarÄą girin (Ãļrn. 2,3,1)" + "placeholder": "VirgÃŧlle ayrÄąlmÄąÅŸ sayÄąlarÄą girin (Ãļrn. 2,3,1)", + "item": "Count for file", + "noFiles": "Add overlay files to configure counts" }, "position": { "label": "Bindirme Konumunu Seçin", "foreground": "Ön plan", "background": "Arka plan" }, - "submit": "GÃļnder" + "submit": "GÃļnder", + "settings": { + "title": "Settings" + }, + "results": { + "title": "Overlay Results" + }, + "tooltip": { + "header": { + "title": "Overlay PDFs Overview" + }, + "description": { + "title": "Description", + "text": "Combine a base PDF with one or more overlay PDFs. Overlays can be applied page-by-page in different modes and placed in the foreground or background." + }, + "mode": { + "title": "Overlay Mode", + "text": "Choose how to distribute overlay pages across the base PDF pages.", + "sequential": "Sequential Overlay: Use pages from the first overlay PDF until it ends, then move to the next.", + "interleaved": "Interleaved Overlay: Take one page from each overlay in turn.", + "fixedRepeat": "Fixed Repeat Overlay: Take a set number of pages from each overlay before moving to the next. Use Counts to set the numbers." + }, + "position": { + "title": "Overlay Position", + "text": "Foreground places the overlay on top of the page. Background places it behind." + }, + "overlayFiles": { + "title": "Overlay Files", + "text": "Select one or more PDFs to overlay on the base. The order of these files affects how pages are applied in Sequential and Fixed Repeat modes." + }, + "counts": { + "title": "Counts (Fixed Repeat only)", + "text": "Provide a positive number for each overlay file showing how many pages to take before moving to the next. Required when mode is Fixed Repeat." + } + }, + "error": { + "failed": "An error occurred while overlaying PDFs." + } }, "split-by-sections": { "tags": "BÃļlÃŧmlere AyÄąrma, BÃļlme, Özelleştirme", @@ -1336,6 +3068,7 @@ "tags": "Damga, GÃļrÃŧntÃŧ ekle, GÃļrÃŧntÃŧyÃŧ ortala, Filigran, PDF, GÃļm, Özelleştir", "header": "Damga PDF", "title": "Damga PDF", + "stampSetup": "Stamp Setup", "stampType": "Damga TÃŧrÃŧ", "stampText": "Damga Metni", "stampImage": "Damga Resmi", @@ -1348,7 +3081,19 @@ "overrideY": "Y KoordinatÄąnÄą Geçersiz KÄąl", "customMargin": "Özel Kenar Boşluğu", "customColor": "Özel Metin Rengi", - "submit": "GÃļnder" + "submit": "GÃļnder", + "noStampSelected": "No stamp selected. Return to Step 1.", + "customPosition": "Drag the stamp to the desired location in the preview window.", + "error": { + "failed": "An error occurred while adding stamp to the PDF." + }, + "imageSize": "Image Size", + "margin": "Margin", + "positionAndFormatting": "Position & Formatting", + "quickPosition": "Select a position on the page to place the stamp.", + "results": { + "title": "Stamp Results" + } }, "removeImagePdf": { "tags": "Resmi KaldÄąr,Sayfa İşlemleri,Arka uç,sunucu tarafÄą" @@ -1366,7 +3111,8 @@ "status": { "_value": "Durum", "valid": "Geçerli", - "invalid": "Geçersiz" + "invalid": "Geçersiz", + "complete": "Validation complete" }, "signer": "İmzalayan", "date": "Tarih", @@ -1393,40 +3139,122 @@ "version": "SÃŧrÃŧm", "keyUsage": "Anahtar KullanÄąmÄą", "selfSigned": "Kendi Kendine İmzalÄą", - "bits": "bits" + "bits": "bits", + "details": "Certificate Details" }, "signature": { "info": "İmza Bilgisi", "_value": "İmza", "mathValid": "İmza matematiksel olarak geçerli, ANCAK:" }, - "selectCustomCert": "Özel Sertifika DosyasÄą X.509 (İsteğe BağlÄą)" - }, - "replace-color": { - "title": "Renk Değiştir-Tersine Çevir", - "header": "PDF Renklerini Değiştir veya Tersine Çevir", - "selectText": { - "1": "Renk Değiştir veya Tersine Çevirme Seçenekleri", - "2": "VarsayÄąlan (YÃŧksek kontrastlÄą varsayÄąlan renkler)", - "3": "Özel (Kişiselleştirilmiş renkler)", - "4": "TÃŧmÃŧ Tersine Çevir (TÃŧm renkleri tersine çevir)", - "5": "YÃŧksek kontrastlÄą renk seçenekleri", - "6": "Siyah arka plan Ãŧzerine beyaz metin", - "7": "Beyaz arka plan Ãŧzerine siyah metin", - "8": "Siyah arka plan Ãŧzerine sarÄą metin", - "9": "Siyah arka plan Ãŧzerine yeşil metin", - "10": "Metin Rengini Seç", - "11": "Arka Plan Rengini Seç" + "selectCustomCert": "Özel Sertifika DosyasÄą X.509 (İsteğe BağlÄą)", + "downloadCsv": "Download CSV", + "downloadJson": "Download JSON", + "downloadPdf": "Download PDF Report", + "downloadType": { + "csv": "CSV", + "json": "JSON", + "pdf": "PDF" }, - "submit": "Değiştir" + "error": { + "allFailed": "Unable to validate the selected files.", + "partial": "Some files could not be validated.", + "reportGeneration": "Could not generate the PDF report. JSON and CSV are available.", + "unexpected": "Unexpected error during validation." + }, + "finalizing": "Preparing downloads...", + "issue": { + "certExpired": "Certificate expired", + "certRevocationUnknown": "Certificate revocation status unknown", + "certRevoked": "Certificate revoked", + "chainInvalid": "Certificate chain invalid", + "signatureInvalid": "Signature cryptographic check failed", + "trustInvalid": "Certificate not trusted" + }, + "noResults": "Run the validation to generate a report.", + "noSignaturesShort": "No signatures", + "processing": "Validating signatures...", + "report": { + "continued": "Continued", + "downloads": "Downloads", + "entryLabel": "Signature Summary", + "fields": { + "created": "Created", + "fileSize": "File Size", + "signatureCount": "Total Signatures", + "signatureDate": "Signature Date" + }, + "filesEvaluated": "{{count}} files evaluated", + "footer": "Validated via Stirling PDF", + "generatedAt": "Generated", + "noPdf": "PDF report will be available after a successful validation.", + "page": "Page", + "shortTitle": "Signature Summary", + "signatureCountLabel": "{{count}} signatures", + "signaturesFound": "{{count}} signatures detected", + "signaturesValid": "{{count}} fully valid", + "title": "Signature Validation Report" + }, + "settings": { + "certHint": "Upload a trusted X.509 certificate to validate against a custom trust source.", + "title": "Validation Settings" + }, + "signatureDate": "Signature Date", + "totalSignatures": "Total Signatures" }, - "replaceColorPdf": { - "tags": "Renk Değiştir, Sayfa işlemleri, Arka yÃŧz, Sunucu tarafÄą" + "replaceColor": { + "tags": "Replace Colour,Page operations,Back end,server side", + "labels": { + "settings": "Settings", + "colourOperation": "Colour operation" + }, + "options": { + "highContrast": "High contrast", + "invertAll": "Invert all colours", + "custom": "Custom", + "cmyk": "Convert to CMYK" + }, + "tooltip": { + "header": { + "title": "Replace & Invert Colour Settings Overview" + }, + "description": { + "title": "Description", + "text": "Transform PDF colours to improve readability and accessibility. Choose from high contrast presets, invert all colours, or create custom colour schemes." + }, + "highContrast": { + "title": "High Contrast", + "text": "Apply predefined high contrast colour combinations designed for better readability and accessibility compliance.", + "bullet1": "White text on black background - Classic dark mode", + "bullet2": "Black text on white background - Standard high contrast", + "bullet3": "Yellow text on black background - High visibility option", + "bullet4": "Green text on black background - Alternative high contrast" + }, + "invertAll": { + "title": "Invert All Colours", + "text": "Completely invert all colours in the PDF, creating a negative-like effect. Useful for creating dark mode versions of documents or reducing eye strain in low-light conditions." + }, + "custom": { + "title": "Custom Colours", + "text": "Define your own text and background colours using the colour pickers. Perfect for creating branded documents or specific accessibility requirements.", + "bullet1": "Text colour - Choose the colour for text elements", + "bullet2": "Background colour - Set the background colour for the document" + }, + "cmyk": { + "title": "Convert to CMYK", + "text": "Convert the PDF from RGB colour space to CMYK colour space, optimized for professional printing. This process converts colours to the Cyan, Magenta, Yellow, Black model used by printers." + } + }, + "error": { + "failed": "An error occurred while processing the colour replacement." + } }, "login": { "title": "Giriş Yap", "header": "Giriş Yap", "signin": "Giriş Yap", + "signInWith": "Sign in with", + "signInAnonymously": "Sign Up as a Guest", "rememberme": "Beni hatÄąrla", "invalid": "Geçersiz kullanÄącÄą adÄą veya şifre.", "locked": "HesabÄąnÄąz kilitlendi.", @@ -1445,12 +3273,83 @@ "alreadyLoggedIn": "Zaten şu cihazlarda oturum aÃ§ÄąlmÄąÅŸ:", "alreadyLoggedIn2": "LÃŧtfen bu cihazlardan Ã§ÄąkÄąÅŸ yaparak tekrar deneyin.", "toManySessions": "Çok fazla aktif oturumunuz var", - "logoutMessage": "You have been logged out." + "logoutMessage": "You have been logged out.", + "youAreLoggedIn": "You are logged in!", + "email": "Email", + "password": "Password", + "enterEmail": "Enter your email", + "enterPassword": "Enter your password", + "loggingIn": "Logging In...", + "username": "Username", + "enterUsername": "Enter username", + "useEmailInstead": "Login with email", + "forgotPassword": "Forgot your password?", + "logIn": "Log In", + "signingIn": "Signing in...", + "login": "Login", + "or": "Or", + "useMagicLink": "Use magic link instead", + "enterEmailForMagicLink": "Enter your email for magic link", + "sending": "Sendingâ€Ļ", + "sendMagicLink": "Send Magic Link", + "cancel": "Cancel", + "dontHaveAccount": "Don't have an account? Sign up", + "home": "Home", + "debug": "Debug", + "signOut": "Sign Out", + "pleaseEnterBoth": "Please enter both email and password", + "pleaseEnterEmail": "Please enter your email address", + "magicLinkSent": "Magic link sent to {{email}}! Check your email and click the link to sign in.", + "passwordResetSent": "Password reset link sent to {{email}}! Check your email and follow the instructions.", + "failedToSignIn": "Failed to sign in with {{provider}}: {{message}}", + "unexpectedError": "Unexpected error: {{message}}", + "accountCreatedSuccess": "Account created successfully! You can now sign in.", + "passwordChangedSuccess": "Password changed successfully! Please sign in with your new password.", + "credentialsUpdated": "Your credentials have been updated. Please sign in again." + }, + "signup": { + "title": "Create an account", + "subtitle": "Join Stirling PDF to get started", + "name": "Name", + "email": "Email", + "password": "Password", + "confirmPassword": "Confirm password", + "enterName": "Enter your name", + "enterEmail": "Enter your email", + "enterPassword": "Enter your password", + "confirmPasswordPlaceholder": "Confirm password", + "or": "or", + "creatingAccount": "Creating Account...", + "signUp": "Sign Up", + "alreadyHaveAccount": "Already have an account? Sign in", + "pleaseFillAllFields": "Please fill in all fields", + "passwordsDoNotMatch": "Passwords do not match", + "passwordTooShort": "Password must be at least 6 characters long", + "invalidEmail": "Please enter a valid email address", + "checkEmailConfirmation": "Check your email for a confirmation link to complete your registration.", + "accountCreatedSuccessfully": "Account created successfully! You can now sign in.", + "unexpectedError": "Unexpected error: {{message}}", + "useEmailInstead": "Use Email Instead", + "nameRequired": "Name is required", + "emailRequired": "Email is required", + "passwordRequired": "Password is required", + "confirmPasswordRequired": "Please confirm your password" }, "pdfToSinglePage": { "title": "PDF'i Tek Sayfaya", "header": "PDF'i Tek Sayfaya", - "submit": "Tek Sayfaya DÃļnÃŧştÃŧr" + "submit": "Tek Sayfaya DÃļnÃŧştÃŧr", + "description": "This tool will merge all pages of your PDF into one large single page. The width will remain the same as the original pages, but the height will be the sum of all page heights.", + "filenamePrefix": "single_page", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst converting to single page." + }, + "results": { + "title": "Single Page Results" + } }, "pageExtracter": { "title": "SayfalarÄą Ã‡Äąkar", @@ -1474,18 +3373,59 @@ "adjustContrast": { "title": "KontrastÄą Ayarla", "header": "KontrastÄą Ayarla", + "basic": "Basic Adjustments", "contrast": "Kontrast:", "brightness": "ParlaklÄąk:", "saturation": "Doygunluk:", - "download": "İndir" + "download": "İndir", + "adjustColors": "Adjust Colors", + "blue": "Blue", + "confirm": "Confirm", + "error": { + "failed": "Failed to adjust colors/contrast" + }, + "green": "Green", + "noPreview": "Select a PDF to preview", + "red": "Red", + "results": { + "title": "Adjusted PDF" + } }, "compress": { "title": "SÄąkÄąÅŸtÄąr", + "desc": "Compress PDFs to reduce their file size.", "header": "PDF'i SÄąkÄąÅŸtÄąr", + "method": { + "title": "Compression Method", + "quality": "Quality", + "filesize": "Dosya Boyutu" + }, "credit": "Bu hizmet PDF SÄąkÄąÅŸtÄąrma/Optimizasyonu için qpdf kullanÄąr.", "grayscale": { "label": "SÄąkÄąÅŸtÄąrma için Gri Ton Uygula" }, + "tooltip": { + "header": { + "title": "Compress Settings Overview" + }, + "description": { + "title": "Description", + "text": "Compression is an easy way to reduce your file size. Pick File Size to enter a target size and have us adjust quality for you. Pick Quality to set compression strength manually." + }, + "qualityAdjustment": { + "title": "Quality Adjustment", + "text": "Drag the slider to adjust the compression strength. Lower values (1-3) preserve quality but result in larger files. Higher values (7-9) shrink the file more but reduce image clarity.", + "bullet1": "Lower values preserve quality", + "bullet2": "Higher values reduce file size" + }, + "grayscale": { + "title": "Grayscale", + "text": "Select this option to convert all images to black and white, which can significantly reduce file size especially for scanned PDFs or image-heavy documents." + } + }, + "error": { + "failed": "An error occurred while compressing the PDF." + }, "selectText": { "1": { "_value": "Compression Settings", @@ -1495,10 +3435,7 @@ "4": "Otomatik mod - PDF'in tam boyutuna ulaşmak için kaliteyi otomatik ayarlar", "5": "Beklenen PDF Boyutu (Ãļrn. 25MB, 10.8MB, 25KB)" }, - "submit": "SÄąkÄąÅŸtÄąr", - "method": { - "filesize": "Dosya Boyutu" - } + "submit": "SÄąkÄąÅŸtÄąr" }, "decrypt": { "passwordPrompt": "Bu dosya parola korumalÄą. LÃŧtfen parolayÄą girin:", @@ -1599,7 +3536,13 @@ "title": "Resmi kaldÄąr", "header": "Resmi kaldÄąr", "removeImage": "Resmi kaldÄąr", - "submit": "Resmi kaldÄąr" + "submit": "Resmi kaldÄąr", + "error": { + "failed": "Failed to remove images from the PDF." + }, + "results": { + "title": "Remove Images Results" + } }, "splitByChapters": { "title": "PDF'yi BÃļlÃŧmlere AyÄąr", @@ -1633,6 +3576,12 @@ }, "note": "SÃŧrÃŧm notlarÄą yalnÄązca İngilizce dilinde mevcuttur" }, + "swagger": { + "title": "API Documentation", + "header": "API Documentation", + "desc": "View and test the Stirling PDF API endpoints", + "tags": "api,documentation,swagger,endpoints,development" + }, "cookieBanner": { "popUp": { "title": "Çerezleri NasÄąl KullanÄąyoruz", @@ -1668,54 +3617,943 @@ "title": "Analitik", "description": "Bu çerezler, araçlarÄąmÄązÄąn nasÄąl kullanÄąldığınÄą anlamamÄąza yardÄąmcÄą olur, bÃļylece topluluğumuzun en çok değer verdiği Ãļzellikleri geliştirmeye odaklanabiliriz. İçiniz rahat olsun — Stirling PDF, belgelerinizin içeriğini asla takip etmez ve etmeyecektir." } + }, + "services": { + "posthog": "PostHog Analytics", + "scarf": "Scarf Pixel" } }, - "download": "İndir", - "undo": "Geri Al", - "convert": { - "title": "DÃļnÃŧştÃŧr", - "settings": "Ayarlar", - "color": "Renk", - "greyscale": "Gri tonlama", - "fillPage": "SayfayÄą Doldur", - "pdfaDigitalSignatureWarning": "PDF dijital imza içeriyor. Bu bir sonraki adÄąmda kaldÄąrÄąlacak.", - "grayscale": "Gri tonlama" + "removeMetadata": { + "submit": "Remove Metadata" }, - "attachments": { - "tags": "embed,attach,file,attachment,attachments", - "title": "Add attachments", - "header": "Add attachments", - "submit": "Add attachments" + "sidebar": { + "toggle": "Toggle Sidebar" + }, + "theme": { + "toggle": "Toggle Theme" + }, + "view": { + "viewer": "Viewer", + "pageEditor": "Page Editor", + "fileManager": "File Manager" + }, + "pageEditor": { + "title": "Page Editor", + "save": "Save Changes", + "noPdfLoaded": "No PDF loaded. Please upload a PDF to edit.", + "rotatedLeft": "Rotated left:", + "rotatedRight": "Rotated right:", + "deleted": "Deleted:", + "movedLeft": "Moved left:", + "movedRight": "Moved right:", + "splitAt": "Split at:", + "insertedPageBreak": "Inserted page break at:", + "addFileNotImplemented": "Add file not implemented in demo", + "closePdf": "Close PDF", + "reset": "Reset Changes", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "fitToWidth": "Fit to Width", + "actualSize": "Actual Size" + }, + "viewer": { + "firstPage": "First Page", + "lastPage": "Last Page", + "previousPage": "Previous Page", + "nextPage": "Next Page", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "singlePageView": "Single Page View", + "dualPageView": "Dual Page View" }, "rightRail": { + "closeSelected": "Close Selected Files", "selectAll": "TÃŧmÃŧnÃŧ Seç", - "deselectAll": "Seçimi KaldÄąr" + "deselectAll": "Seçimi KaldÄąr", + "selectByNumber": "Select by Page Numbers", + "deleteSelected": "Delete Selected Pages", + "closePdf": "Close PDF", + "exportAll": "Export PDF", + "downloadSelected": "Download Selected Files", + "downloadAll": "Download All", + "toggleTheme": "Toggle Theme", + "language": "Language", + "search": "Search PDF", + "panMode": "Pan Mode", + "rotateLeft": "Rotate Left", + "rotateRight": "Rotate Right", + "toggleSidebar": "Toggle Sidebar", + "exportSelected": "Export Selected Pages", + "toggleAnnotations": "Toggle Annotations Visibility", + "annotationMode": "Toggle Annotation Mode", + "draw": "Draw", + "save": "Save" + }, + "search": { + "title": "Search PDF", + "placeholder": "Enter search term...", + "noResults": "No results found", + "searching": "Searching..." + }, + "guestBanner": { + "title": "You're using Stirling PDF as a guest!", + "message": "Create a free account to save your work, access more features, and support the project.", + "dismiss": "Dismiss banner", + "signUp": "Sign Up Free" + }, + "toolPicker": { + "searchPlaceholder": "Search tools...", + "noToolsFound": "No tools found", + "allTools": "ALL TOOLS", + "quickAccess": "QUICK ACCESS", + "categories": { + "standardTools": "Standard Tools", + "advancedTools": "Advanced Tools", + "recommendedTools": "Recommended Tools" + }, + "subcategories": { + "signing": "Signing", + "documentSecurity": "Document Security", + "verification": "Verification", + "documentReview": "Document Review", + "pageFormatting": "Page Formatting", + "extraction": "Extraction", + "removal": "Removal", + "automation": "Automation", + "general": "General", + "advancedFormatting": "Advanced Formatting", + "developerTools": "Developer Tools" + } }, "quickAccess": { - "sign": "İmzala" + "read": "Read", + "sign": "İmzala", + "automate": "Automate", + "files": "Files", + "activity": "Activity", + "help": "Help", + "account": "Account", + "config": "Config", + "adminSettings": "Admin Settings", + "allTools": "All Tools" + }, + "admin": { + "error": "Error", + "success": "Success", + "expand": "Expand", + "close": "Close", + "status": { + "active": "Active", + "inactive": "Inactive" + }, + "settings": { + "title": "Admin Settings", + "workspace": "Workspace", + "fetchError": "Failed to load settings", + "saveError": "Failed to save settings", + "saved": "Settings saved successfully", + "saveSuccess": "Settings saved successfully", + "save": "Save Changes", + "restartRequired": "Restart Required", + "restart": { + "title": "Restart Required", + "message": "Settings have been saved successfully. A server restart is required for the changes to take effect.", + "question": "Would you like to restart the server now or later?", + "now": "Restart Now", + "later": "Restart Later" + }, + "restarting": "Restarting Server", + "restartingMessage": "The server is restarting. Please wait a moment...", + "restartError": "Failed to restart server. Please restart manually.", + "general": { + "title": "System Settings", + "description": "Configure system-wide application settings including branding and default behaviour.", + "ui": "User Interface", + "system": "System", + "appName": { + "label": "Application Name", + "description": "The name displayed in the browser tab and home page" + }, + "appNameNavbar": { + "label": "Navbar Brand", + "description": "The name displayed in the navigation bar" + }, + "homeDescription": { + "label": "Home Description", + "description": "The description text shown on the home page" + }, + "defaultLocale": { + "label": "Default Locale", + "description": "The default language for new users (e.g., en_US, es_ES)" + }, + "fileUploadLimit": { + "label": "File Upload Limit", + "description": "Maximum file upload size (e.g., 100MB, 1GB)" + }, + "showUpdate": { + "label": "Show Update Notifications", + "description": "Display notifications when a new version is available" + }, + "showUpdateOnlyAdmin": { + "label": "Show Updates to Admins Only", + "description": "Restrict update notifications to admin users only" + }, + "customHTMLFiles": { + "label": "Custom HTML Files", + "description": "Allow serving custom HTML files from the customFiles directory" + }, + "languages": { + "label": "Available Languages", + "description": "Languages that users can select from (leave empty to enable all languages)" + }, + "customMetadata": { + "label": "Custom Metadata", + "autoUpdate": { + "label": "Auto Update Metadata", + "description": "Automatically update PDF metadata on all processed documents" + }, + "author": { + "label": "Default Author", + "description": "Default author for PDF metadata (e.g., username)" + }, + "creator": { + "label": "Default Creator", + "description": "Default creator for PDF metadata" + }, + "producer": { + "label": "Default Producer", + "description": "Default producer for PDF metadata" + } + }, + "customPaths": { + "label": "Custom Paths", + "description": "Configure custom file system paths for pipeline processing and external tools", + "pipeline": { + "label": "Pipeline Directories", + "watchedFoldersDir": { + "label": "Watched Folders Directory", + "description": "Directory where pipeline monitors for incoming PDFs (leave empty for default: /pipeline/watchedFolders)" + }, + "finishedFoldersDir": { + "label": "Finished Folders Directory", + "description": "Directory where processed PDFs are outputted (leave empty for default: /pipeline/finishedFolders)" + } + }, + "operations": { + "label": "External Tool Paths", + "weasyprint": { + "label": "WeasyPrint Executable", + "description": "Path to WeasyPrint executable for HTML to PDF conversion (leave empty for default: /opt/venv/bin/weasyprint)" + }, + "unoconvert": { + "label": "Unoconvert Executable", + "description": "Path to LibreOffice unoconvert for document conversions (leave empty for default: /opt/venv/bin/unoconvert)" + } + } + } + }, + "security": { + "title": "Security", + "description": "Configure authentication, login behaviour, and security policies.", + "ssoNotice": { + "title": "Looking for SSO/SAML settings?", + "message": "OAuth2 and SAML2 authentication providers have been moved to the Connections menu for easier management." + }, + "authentication": "Authentication", + "enableLogin": { + "label": "Enable Login", + "description": "Require users to log in before accessing the application" + }, + "loginMethod": { + "label": "Login Method", + "description": "The authentication method to use for user login", + "all": "All Methods", + "normal": "Username/Password Only", + "oauth2": "OAuth2 Only", + "saml2": "SAML2 Only" + }, + "loginAttemptCount": { + "label": "Login Attempt Limit", + "description": "Maximum number of failed login attempts before account lockout" + }, + "loginResetTimeMinutes": { + "label": "Login Reset Time (minutes)", + "description": "Time before failed login attempts are reset" + }, + "csrfDisabled": { + "label": "Disable CSRF Protection", + "description": "Disable Cross-Site Request Forgery protection (not recommended)" + }, + "initialLogin": { + "label": "Initial Login", + "username": { + "label": "Initial Username", + "description": "The username for the initial admin account" + }, + "password": { + "label": "Initial Password", + "description": "The password for the initial admin account" + } + }, + "jwt": { + "label": "JWT Configuration", + "secureCookie": { + "label": "Secure Cookie", + "description": "Require HTTPS for JWT cookies (recommended for production)" + }, + "keyRetentionDays": { + "label": "Key Retention Days", + "description": "Number of days to retain old JWT keys for verification" + }, + "persistence": { + "label": "Enable Key Persistence", + "description": "Store JWT keys persistently to survive server restarts" + }, + "enableKeyRotation": { + "label": "Enable Key Rotation", + "description": "Automatically rotate JWT signing keys periodically" + }, + "enableKeyCleanup": { + "label": "Enable Key Cleanup", + "description": "Automatically remove expired JWT keys" + } + }, + "audit": { + "label": "Audit Logging", + "enabled": { + "label": "Enable Audit Logging", + "description": "Track user actions and system events for compliance and security monitoring" + }, + "level": { + "label": "Audit Level", + "description": "0=OFF, 1=BASIC, 2=STANDARD, 3=VERBOSE" + }, + "retentionDays": { + "label": "Audit Retention (days)", + "description": "Number of days to retain audit logs" + } + }, + "htmlUrlSecurity": { + "label": "HTML URL Security", + "description": "Configure URL access restrictions for HTML processing to prevent SSRF attacks", + "enabled": { + "label": "Enable URL Security", + "description": "Enable URL security restrictions for HTML to PDF conversions" + }, + "level": { + "label": "Security Level", + "description": "MAX: whitelist only, MEDIUM: block internal networks, OFF: no restrictions", + "max": "Maximum (Whitelist Only)", + "medium": "Medium (Block Internal)", + "off": "Off (No Restrictions)" + }, + "advanced": "Advanced Settings", + "allowedDomains": { + "label": "Allowed Domains (Whitelist)", + "description": "One domain per line (e.g., cdn.example.com). Only these domains allowed when level is MAX" + }, + "blockedDomains": { + "label": "Blocked Domains (Blacklist)", + "description": "One domain per line (e.g., malicious.com). Additional domains to block" + }, + "internalTlds": { + "label": "Internal TLDs", + "description": "One TLD per line (e.g., .local, .internal). Block domains with these TLD patterns" + }, + "networkBlocking": "Network Blocking", + "blockPrivateNetworks": { + "label": "Block Private Networks", + "description": "Block RFC 1918 private networks (10.x.x.x, 192.168.x.x, 172.16-31.x.x)" + }, + "blockLocalhost": { + "label": "Block Localhost", + "description": "Block localhost and loopback addresses (127.x.x.x, ::1)" + }, + "blockLinkLocal": { + "label": "Block Link-Local Addresses", + "description": "Block link-local addresses (169.254.x.x, fe80::/10)" + }, + "blockCloudMetadata": { + "label": "Block Cloud Metadata Endpoints", + "description": "Block cloud provider metadata endpoints (169.254.169.254)" + } + } + }, + "connections": { + "title": "Connections", + "description": "Configure external authentication providers like OAuth2 and SAML.", + "linkedServices": "Linked Services", + "unlinkedServices": "Unlinked Services", + "connect": "Connect", + "disconnect": "Disconnect", + "disconnected": "Provider disconnected successfully", + "disconnectError": "Failed to disconnect provider", + "ssoAutoLogin": { + "label": "SSO Auto Login", + "enable": "Enable SSO Auto Login", + "description": "Automatically redirect to SSO login when authentication is required" + }, + "oauth2": { + "label": "OAuth2", + "enabled": { + "label": "Enable OAuth2", + "description": "Allow users to authenticate using OAuth2 providers" + }, + "provider": { + "label": "Provider", + "description": "The OAuth2 provider to use for authentication" + }, + "issuer": { + "label": "Issuer URL", + "description": "The OAuth2 provider issuer URL" + }, + "clientId": { + "label": "Client ID", + "description": "The OAuth2 client ID from your provider" + }, + "clientSecret": { + "label": "Client Secret", + "description": "The OAuth2 client secret from your provider" + }, + "useAsUsername": { + "label": "Use as Username", + "description": "The OAuth2 claim to use as the username (e.g., email, sub)" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first OAuth2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via OAuth2" + }, + "scopes": { + "label": "OAuth2 Scopes", + "description": "Comma-separated list of OAuth2 scopes to request (e.g., openid, profile, email)" + } + }, + "saml2": { + "label": "SAML2", + "enabled": { + "label": "Enable SAML2", + "description": "Allow users to authenticate using SAML2 providers" + }, + "provider": { + "label": "Provider", + "description": "The SAML2 provider name" + }, + "registrationId": { + "label": "Registration ID", + "description": "The SAML2 registration identifier" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first SAML2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via SAML2" + } + } + }, + "database": { + "title": "Database", + "description": "Configure custom database connection settings for enterprise deployments.", + "configuration": "Database Configuration", + "enableCustom": { + "label": "Enable Custom Database", + "description": "Use your own custom database configuration instead of the default embedded database" + }, + "customUrl": { + "label": "Custom Database URL", + "description": "Full JDBC connection string (e.g., jdbc:postgresql://localhost:5432/postgres). If provided, individual connection settings below are not used." + }, + "type": { + "label": "Database Type", + "description": "Type of database (not used if custom URL is provided)" + }, + "hostName": { + "label": "Host Name", + "description": "Database server hostname (not used if custom URL is provided)" + }, + "port": { + "label": "Port", + "description": "Database server port (not used if custom URL is provided)" + }, + "name": { + "label": "Database Name", + "description": "Name of the database (not used if custom URL is provided)" + }, + "username": { + "label": "Username", + "description": "Database authentication username" + }, + "password": { + "label": "Password", + "description": "Database authentication password" + } + }, + "privacy": { + "title": "Privacy", + "description": "Configure privacy and data collection settings.", + "analytics": "Analytics & Tracking", + "enableAnalytics": { + "label": "Enable Analytics", + "description": "Collect anonymous usage analytics to help improve the application" + }, + "metricsEnabled": { + "label": "Enable Metrics", + "description": "Enable collection of performance and usage metrics. Provides API endpoint for admins to access metrics data" + }, + "searchEngine": "Search Engine Visibility", + "googleVisibility": { + "label": "Google Visibility", + "description": "Allow search engines to index this application" + } + }, + "advanced": { + "title": "Advanced", + "description": "Configure advanced features and experimental functionality.", + "features": "Feature Flags", + "processing": "Processing", + "endpoints": { + "label": "Endpoints", + "manage": "Manage API Endpoints", + "description": "Endpoint management is configured via YAML. See documentation for details on enabling/disabling specific endpoints." + }, + "enableAlphaFunctionality": { + "label": "Enable Alpha Features", + "description": "Enable experimental and alpha-stage features (may be unstable)" + }, + "enableUrlToPDF": { + "label": "Enable URL to PDF", + "description": "Allow conversion of web pages to PDF documents" + }, + "maxDPI": { + "label": "Maximum DPI", + "description": "Maximum DPI for image processing (0 = unlimited)" + }, + "tessdataDir": { + "label": "Tessdata Directory", + "description": "Path to the tessdata directory for OCR language files" + }, + "disableSanitize": { + "label": "Disable HTML Sanitization", + "description": "WARNING: Security risk - disabling HTML sanitization can lead to XSS vulnerabilities" + }, + "tempFileManagement": { + "label": "Temp File Management", + "description": "Configure temporary file storage and cleanup behavior", + "baseTmpDir": { + "label": "Base Temp Directory", + "description": "Base directory for temporary files (leave empty for default: java.io.tmpdir/stirling-pdf)" + }, + "libreofficeDir": { + "label": "LibreOffice Temp Directory", + "description": "Directory for LibreOffice temp files (leave empty for default: baseTmpDir/libreoffice)" + }, + "systemTempDir": { + "label": "System Temp Directory", + "description": "System temp directory to clean (only used if cleanupSystemTemp is enabled)" + }, + "prefix": { + "label": "Temp File Prefix", + "description": "Prefix for temp file names" + }, + "maxAgeHours": { + "label": "Max Age (hours)", + "description": "Maximum age in hours before temp files are cleaned up" + }, + "cleanupIntervalMinutes": { + "label": "Cleanup Interval (minutes)", + "description": "How often to run cleanup (in minutes)" + }, + "startupCleanup": { + "label": "Startup Cleanup", + "description": "Clean up old temp files on application startup" + }, + "cleanupSystemTemp": { + "label": "Cleanup System Temp", + "description": "Whether to clean broader system temp directory (use with caution)" + } + }, + "processExecutor": { + "label": "Process Executor Limits", + "description": "Configure session limits and timeouts for each process executor", + "sessionLimit": { + "label": "Session Limit", + "description": "Maximum concurrent instances" + }, + "timeout": { + "label": "Timeout (minutes)", + "description": "Maximum execution time" + }, + "libreOffice": "LibreOffice", + "pdfToHtml": "PDF to HTML", + "qpdf": "QPDF", + "tesseract": "Tesseract OCR", + "pythonOpenCv": "Python OpenCV", + "weasyPrint": "WeasyPrint", + "installApp": "Install App", + "calibre": "Calibre", + "ghostscript": "Ghostscript", + "ocrMyPdf": "OCRmyPDF" + } + }, + "mail": { + "title": "Mail Server", + "description": "Configure SMTP settings for sending email notifications.", + "smtp": "SMTP Configuration", + "enabled": { + "label": "Enable Mail", + "description": "Enable email notifications and SMTP functionality" + }, + "host": { + "label": "SMTP Host", + "description": "The hostname or IP address of your SMTP server" + }, + "port": { + "label": "SMTP Port", + "description": "The port number for SMTP connection (typically 25, 465, or 587)" + }, + "username": { + "label": "SMTP Username", + "description": "Username for SMTP authentication" + }, + "password": { + "label": "SMTP Password", + "description": "Password for SMTP authentication" + }, + "from": { + "label": "From Address", + "description": "The email address to use as the sender" + }, + "enableInvites": { + "label": "Enable Email Invites", + "description": "Allow admins to invite users via email with auto-generated passwords" + }, + "frontendUrl": { + "label": "Frontend URL", + "description": "Base URL for frontend (e.g. https://pdf.example.com). Used for generating invite links in emails. Leave empty to use backend URL." + } + }, + "legal": { + "title": "Legal Documents", + "description": "Configure links to legal documents and policies.", + "disclaimer": { + "title": "Legal Responsibility Warning", + "message": "By customizing these legal documents, you assume full responsibility for ensuring compliance with all applicable laws and regulations, including but not limited to GDPR and other EU data protection requirements. Only modify these settings if: (1) you are operating a personal/private instance, (2) you are outside EU jurisdiction and understand your local legal obligations, or (3) you have obtained proper legal counsel and accept sole responsibility for all user data and legal compliance. Stirling-PDF and its developers assume no liability for your legal obligations." + }, + "termsAndConditions": { + "label": "Terms and Conditions", + "description": "URL or filename to terms and conditions" + }, + "privacyPolicy": { + "label": "Privacy Policy", + "description": "URL or filename to privacy policy" + }, + "accessibilityStatement": { + "label": "Accessibility Statement", + "description": "URL or filename to accessibility statement" + }, + "cookiePolicy": { + "label": "Cookie Policy", + "description": "URL or filename to cookie policy" + }, + "impressum": { + "label": "Impressum", + "description": "URL or filename to impressum (required in some jurisdictions)" + } + }, + "premium": { + "title": "Premium & Enterprise", + "description": "Configure your premium or enterprise license key.", + "license": "License Configuration", + "key": { + "label": "License Key", + "description": "Enter your premium or enterprise license key" + }, + "enabled": { + "label": "Enable Premium Features", + "description": "Enable license key checks for pro/enterprise features" + }, + "movedFeatures": { + "title": "Premium Features Distributed", + "message": "Premium and Enterprise features are now organized in their respective sections:" + } + }, + "features": { + "title": "Features", + "description": "Configure optional features and functionality.", + "serverCertificate": { + "label": "Server Certificate", + "description": "Configure server-side certificate generation for \"Sign with Stirling-PDF\" functionality", + "enabled": { + "label": "Enable Server Certificate", + "description": "Enable server-side certificate for \"Sign with Stirling-PDF\" option" + }, + "organizationName": { + "label": "Organization Name", + "description": "Organization name for generated certificates" + }, + "validity": { + "label": "Certificate Validity (days)", + "description": "Number of days the certificate will be valid" + }, + "regenerateOnStartup": { + "label": "Regenerate on Startup", + "description": "Generate new certificate on each application startup" + } + } + }, + "endpoints": { + "title": "API Endpoints", + "description": "Control which API endpoints and endpoint groups are available.", + "management": "Endpoint Management", + "toRemove": { + "label": "Disabled Endpoints", + "description": "Select individual endpoints to disable" + }, + "groupsToRemove": { + "label": "Disabled Endpoint Groups", + "description": "Select endpoint groups to disable" + }, + "note": "Note: Disabling endpoints restricts API access but does not remove UI components. Restart required for changes to take effect." + } + } }, "fileUpload": { + "selectFile": "Select a file", + "selectFiles": "Select files", + "selectPdfToView": "Select a PDF to view", + "selectPdfToEdit": "Select a PDF to edit", + "chooseFromStorage": "Choose a file from storage or upload a new PDF", + "chooseFromStorageMultiple": "Choose files from storage or upload new PDFs", + "loadFromStorage": "Load from Storage", + "filesAvailable": "files available", "loading": "YÃŧkleniyor...", - "or": "veya" + "or": "veya", + "dropFileHere": "Drop file here or click to upload", + "dropFilesHere": "Drop files here or click the upload button", + "pdfFilesOnly": "PDF files only", + "supportedFileTypes": "Supported file types", + "upload": "Upload", + "uploadFile": "Upload File", + "uploadFiles": "Upload Files", + "noFilesInStorage": "No files available in storage. Upload some files first.", + "selectFromStorage": "Select from Storage", + "backToTools": "Back to Tools", + "addFiles": "Add Files", + "dragFilesInOrClick": "Drag files in or click \"Add Files\" to browse" + }, + "fileEditor": { + "addFiles": "Add Files" }, "fileManager": { + "title": "Upload PDF Files", + "subtitle": "Add files to your storage for easy access across tools", + "filesSelected": "files selected", + "clearSelection": "Clear Selection", + "openInFileEditor": "Open in File Editor", + "uploadError": "Failed to upload some files.", + "failedToOpen": "Failed to open file. It may have been removed from storage.", + "failedToLoad": "Failed to load file to active set.", + "storageCleared": "Browser cleared storage. Files have been removed. Please re-upload.", + "clearAll": "Clear All", + "reloadFiles": "Reload Files", + "dragDrop": "Drag & Drop files here", + "clickToUpload": "Click to upload files", + "selectedFiles": "Selected Files", + "storage": "Storage", + "filesStored": "files stored", + "storageError": "Storage error occurred", + "storageLow": "Storage is running low. Consider removing old files.", + "supportMessage": "Powered by browser database storage for unlimited capacity", + "noFileSelected": "No files selected", + "showHistory": "Show History", + "hideHistory": "Hide History", + "fileHistory": "File History", + "loadingHistory": "Loading History...", + "lastModified": "Last Modified", + "toolChain": "Tools Applied", + "restore": "Restore", + "unzip": "Unzip", + "searchFiles": "Search files...", + "recent": "Recent", + "localFiles": "Local Files", + "googleDrive": "Google Drive", + "googleDriveShort": "Drive", + "myFiles": "My Files", + "noRecentFiles": "No recent files found", + "googleDriveNotAvailable": "Google Drive integration not available", + "openFiles": "Open Files", + "openFile": "Open File", + "details": "File Details", "fileName": "İsim", + "fileFormat": "Format", + "fileSize": "Size", "fileVersion": "SÃŧrÃŧm", + "totalSelected": "Total Selected", + "dropFilesHere": "Drop files here", "selectAll": "TÃŧmÃŧnÃŧ Seç", "deselectAll": "Seçimi KaldÄąr", "deleteSelected": "Seçilenleri Sil", + "downloadSelected": "Download Selected", + "selectedCount": "{{count}} selected", "download": "İndir", - "delete": "Sil" + "delete": "Sil", + "unsupported": "Unsupported", + "addToUpload": "Add to Upload", + "deleteAll": "Delete All", + "loadingFiles": "Loading files...", + "noFiles": "No files available", + "noFilesFound": "No files found matching your search", + "openInPageEditor": "Open in Page Editor", + "showAll": "Show All", + "sortByDate": "Sort by Date", + "sortByName": "Sort by Name", + "sortBySize": "Sort by Size" + }, + "storage": { + "temporaryNotice": "Files are stored temporarily in your browser and may be cleared automatically", + "storageLimit": "Storage limit", + "storageUsed": "Temporary Storage used", + "storageFull": "Storage is nearly full. Consider removing some files.", + "fileTooLarge": "File too large. Maximum size per file is", + "storageQuotaExceeded": "Storage quota exceeded. Please remove some files before uploading more.", + "approximateSize": "Approximate size" }, "sanitize": { + "title": "Sanitise", + "desc": "Remove potentially harmful elements from PDF files.", "submit": "PDF'i Temizle", + "completed": "Sanitisation completed successfully", + "error": { + "generic": "Sanitisation failed", + "failed": "An error occurred while sanitising the PDF." + }, + "filenamePrefix": "sanitised", + "sanitizationResults": "Sanitisation Results", "steps": { - "settings": "Ayarlar" + "files": "Files", + "settings": "Ayarlar", + "results": "Results" + }, + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "options": { + "title": "Sanitisation Options", + "note": "Select the elements you want to remove from the PDF. At least one option must be selected.", + "removeJavaScript": { + "label": "Remove JavaScript", + "desc": "Remove JavaScript actions and scripts from the PDF" + }, + "removeEmbeddedFiles": { + "label": "Remove Embedded Files", + "desc": "Remove any files embedded within the PDF" + }, + "removeXMPMetadata": { + "label": "Remove XMP Metadata", + "desc": "Remove XMP metadata from the PDF" + }, + "removeMetadata": { + "label": "Remove Document Metadata", + "desc": "Remove document information metadata (title, author, etc.)" + }, + "removeLinks": { + "label": "Remove Links", + "desc": "Remove external links and launch actions from the PDF" + }, + "removeFonts": { + "label": "Remove Fonts", + "desc": "Remove embedded fonts from the PDF" + } + } + }, + "addPassword": { + "title": "Parola Ekle", + "desc": "Encrypt your PDF document with a password.", + "completed": "Password protection applied", + "submit": "Şifrele", + "filenamePrefix": "encrypted", + "error": { + "failed": "An error occurred while encrypting the PDF." + }, + "passwords": { + "stepTitle": "Passwords & Encryption", + "completed": "Passwords configured", + "user": { + "label": "User Password", + "placeholder": "Enter user password" + }, + "owner": { + "label": "Owner Password", + "placeholder": "Enter owner password" + } + }, + "encryption": { + "keyLength": { + "label": "Encryption Key Length", + "40bit": "40-bit (Low)", + "128bit": "128-bit (Standard)", + "256bit": "256-bit (High)" + } + }, + "results": { + "title": "Encrypted PDFs" + }, + "tooltip": { + "header": { + "title": "Password Protection Overview" + }, + "passwords": { + "title": "Password Types", + "text": "User passwords restrict opening the document, while owner passwords control what can be done with the document once opened. You can set both or just one.", + "bullet1": "User Password: Required to open the PDF", + "bullet2": "Owner Password: Controls document permissions (not supported by all PDF viewers)" + }, + "encryption": { + "title": "Encryption Levels", + "text": "Higher encryption levels provide better security but may not be supported by older PDF viewers.", + "bullet1": "40-bit: Basic security, compatible with older viewers", + "bullet2": "128-bit: Standard security, widely supported", + "bullet3": "256-bit: Maximum security, requires modern viewers" + }, + "permissions": { + "title": "İzinleri Değiştir", + "text": "These permissions control what users can do with the PDF. Most effective when combined with an owner password." + } + }, + "tags": "gÃŧvenli, gÃŧvenlik", + "header": "Parola Ekle (Şifrele)", + "selectText": { + "1": "Şifrelenecek PDF'i seçin", + "2": "KullanÄącÄą ParolasÄą", + "3": "Şifreleme Anahtar Uzunluğu", + "4": "Daha yÃŧksek değerler daha gÃŧçlÃŧdÃŧr, ancak daha dÃŧşÃŧk değerler daha iyi uyumluluğa sahiptir.", + "5": "İzinlerin ayarlanmasÄą (Sahip parolasÄą ile birlikte kullanÄąlmasÄą Ãļnerilir)", + "6": "Belgenin birleştirilmesini Ãļnle", + "7": "İçeriğin Ã§ÄąkarÄąlmasÄąnÄą Ãļnle", + "8": "Erişilebilirlik için Ã§ÄąkarmanÄąn Ãļnlenmesi", + "9": "Formun doldurulmasÄąnÄą Ãļnle", + "10": "Değişikliği Ãļnle", + "11": "AÃ§Äąklama değişikliğini Ãļnle", + "12": "YazdÄąrmayÄą Ãļnle", + "13": "FarklÄą formatlarda yazdÄąrmayÄą Ãļnle", + "14": "Sahip ParolasÄą", + "15": "AÃ§Äąldığında belgeyle ne yapÄąlacağınÄą kÄąsÄątlar (TÃŧm okuyucular tarafÄąndan desteklenmez)", + "16": "Belgenin kendisinin aÃ§ÄąlmasÄąnÄą kÄąsÄątlar" } }, "changePermissions": { "title": "İzinleri Değiştir", + "desc": "Change document restrictions and permissions.", + "completed": "Permissions changed", "submit": "İzinleri Değiştir", + "error": { + "failed": "An error occurred while changing PDF permissions." + }, "permissions": { "preventAssembly": { "label": "Belgenin birleştirilmesini Ãļnle" @@ -1742,10 +4580,784 @@ "label": "FarklÄą formatlarda yazdÄąrmayÄą Ãļnle" } }, + "results": { + "title": "Modified PDFs" + }, "tooltip": { "header": { "title": "İzinleri Değiştir" + }, + "description": { + "text": "Changes document permissions, allowing/disallowing access to different features in PDF readers." + }, + "warning": { + "text": "To make these permissions unchangeable, use the Add Password tool to set an owner password." } } + }, + "removePassword": { + "title": "Parola KaldÄąr", + "desc": "PDF belgenizden parola korumasÄąnÄą kaldÄąrÄąn.", + "tags": "gÃŧvenli,Şifreyi çÃļz,gÃŧvenlik,parolasÄąz,parolayÄą sil", + "password": { + "stepTitle": "ParolayÄą KaldÄąr", + "label": "Mevcut Şifre", + "placeholder": "Enter current password", + "completed": "Password configured" + }, + "filenamePrefix": "decrypted", + "error": { + "failed": "An error occurred while removing the password from the PDF." + }, + "tooltip": { + "description": "Removing password protection requires the password that was used to encrypt the PDF. This will decrypt the document, making it accessible without a password." + }, + "submit": "KaldÄąr", + "results": { + "title": "Decrypted PDFs" + }, + "header": "Parola KaldÄąr (Şifre ÇÃļz)", + "selectText": { + "1": "Şifreyi ÇÃļzmek için PDF Seçin", + "2": "Parola" + } + }, + "automate": { + "title": "Automate", + "desc": "Build multi-step workflows by chaining together PDF actions. Ideal for recurring tasks.", + "invalidStep": "Invalid step", + "files": { + "placeholder": "Select files to process with this automation" + }, + "selection": { + "title": "Automation Selection", + "saved": { + "title": "Saved" + }, + "createNew": { + "title": "Create New Automation" + }, + "suggested": { + "title": "Suggested" + } + }, + "creation": { + "createTitle": "Create Automation", + "editTitle": "Edit Automation", + "intro": "Automations run tools sequentially. To get started, add tools in the order you want them to run.", + "name": { + "label": "Automation Name", + "placeholder": "My Automation" + }, + "description": { + "label": "Description (optional)", + "placeholder": "Describe what this automation does..." + }, + "tools": { + "selectTool": "Select a tool...", + "selected": "Selected Tools", + "remove": "Remove tool", + "configure": "Configure tool", + "notConfigured": "! Not Configured", + "addTool": "Add Tool", + "add": "Add a tool..." + }, + "save": "Save Automation", + "unsavedChanges": { + "title": "Unsaved Changes", + "message": "You have unsaved changes. Are you sure you want to go back? All changes will be lost.", + "cancel": "Cancel", + "confirm": "Go Back" + }, + "icon": { + "label": "Icon" + } + }, + "run": { + "title": "Run Automation" + }, + "sequence": { + "unnamed": "Unnamed Automation", + "steps": "{{count}} steps", + "running": "Running Automation...", + "run": "Run Automation", + "finish": "Finish" + }, + "reviewTitle": "Automation Results", + "config": { + "loading": "Loading tool configuration...", + "noSettings": "This tool does not have configurable settings.", + "title": "Configure {{toolName}}", + "description": "Configure the settings for this tool. These settings will be applied when the automation runs.", + "cancel": "Cancel", + "save": "Save Configuration" + }, + "copyToSaved": "Copy to Saved" + }, + "automation": { + "suggested": { + "securePdfIngestion": "Secure PDF Ingestion", + "securePdfIngestionDesc": "Comprehensive PDF processing workflow that sanitises documents, applies OCR with cleanup, converts to PDF/A format for long-term archival, and optimises file size.", + "emailPreparation": "Email Preparation", + "emailPreparationDesc": "Optimises PDFs for email distribution by compressing files, splitting large documents into 20MB chunks for email compatibility, and removing metadata for privacy.", + "secureWorkflow": "Security Workflow", + "secureWorkflowDesc": "Secures PDF documents by removing potentially malicious content like JavaScript and embedded files, then adds password protection to prevent unauthorised access. Password is set to 'password' by default.", + "processImages": "Process Images", + "processImagesDesc": "Converts multiple image files into a single PDF document, then applies OCR technology to extract searchable text from the images." + } + }, + "common": { + "copy": "Copy", + "copied": "Copied!", + "refresh": "Refresh", + "retry": "Retry", + "remaining": "remaining", + "used": "used", + "available": "available", + "cancel": "Cancel", + "preview": "Preview" + }, + "config": { + "overview": { + "title": "Application Configuration", + "description": "Current application settings and configuration details." + }, + "account": { + "overview": { + "title": "Account Settings", + "manageAccountPreferences": "Manage your account preferences", + "guestDescription": "You are signed in as a guest. Consider upgrading your account above." + }, + "upgrade": { + "title": "Upgrade Guest Account", + "description": "Link your account to preserve your history and access more features!", + "socialLogin": "Upgrade with Social Account", + "linkWith": "Link with", + "emailPassword": "or enter your email & password", + "email": "Email", + "emailPlaceholder": "Enter your email", + "password": "Password (optional)", + "passwordPlaceholder": "Set a password", + "passwordNote": "Leave empty to use email verification only", + "upgradeButton": "Upgrade Account" + } + }, + "apiKeys": { + "description": "Your API key for accessing Stirling's suite of PDF tools. Copy it to your project or refresh to generate a new one.", + "publicKeyAriaLabel": "Public API key", + "copyKeyAriaLabel": "Copy API key", + "refreshAriaLabel": "Refresh API key", + "includedCredits": "Included credits", + "purchasedCredits": "Purchased credits", + "totalCredits": "Total Credits", + "chartAriaLabel": "Credits usage: included {{includedUsed}} of {{includedTotal}}, purchased {{purchasedUsed}} of {{purchasedTotal}}", + "nextReset": "Next Reset", + "lastApiUse": "Last API Use", + "overlayMessage": "Generate a key to see credits and available credits", + "label": "API Key", + "guestInfo": "Guest users do not receive API keys. Create an account to get an API key you can use in your applications.", + "goToAccount": "Go to Account", + "refreshModal": { + "title": "Refresh API Keys", + "warning": "âš ī¸ Warning: This action will generate new API keys and make your previous keys invalid.", + "impact": "Any applications or services currently using these keys will stop working until you update them with the new keys.", + "confirmPrompt": "Are you sure you want to continue?", + "confirmCta": "Refresh Keys" + }, + "generateError": "We couldn't generate your API key." + } + }, + "AddAttachmentsRequest": { + "attachments": "Select Attachments", + "info": "Select files to attach to your PDF. These files will be embedded and accessible through the PDF's attachment panel.", + "selectFiles": "Select Files to Attach", + "placeholder": "Choose files...", + "addMoreFiles": "Add more files...", + "selectedFiles": "Selected Files", + "submit": "Add Attachments", + "results": { + "title": "Attachment Results" + }, + "error": { + "failed": "Add attachments operation failed" + } + }, + "termsAndConditions": "Terms & Conditions", + "logOut": "Log out", + "addAttachments": { + "error": { + "failed": "An error occurred while adding attachments to the PDF." + } + }, + "autoRename": { + "description": "This tool will automatically rename PDF files based on their content. It analyzes the document to find the most suitable title from the text." + }, + "customPosition": "Custom Position", + "details": "Details", + "downloadUnavailable": "Download unavailable for this item", + "invalidUndoData": "Cannot undo: invalid operation data", + "margin": { + "large": "Large", + "medium": "Medium", + "small": "Small", + "xLarge": "Extra Large" + }, + "noFilesToUndo": "Cannot undo: no files were processed in the last operation", + "noOperationToUndo": "No operation to undo", + "noValidFiles": "No valid files to process", + "operationCancelled": "Operation cancelled", + "pageEdit": { + "deselectAll": "Select None", + "selectAll": "Select All" + }, + "quickPosition": "Quick Position", + "reorganizePages": { + "error": { + "failed": "Failed to reorganize pages" + }, + "results": { + "title": "Pages Reorganized" + }, + "settings": { + "title": "Settings" + }, + "submit": "Reorganize Pages" + }, + "replace-color": { + "options": { + "fill": "Fill colour", + "gradient": "Gradient" + }, + "previewOverlayOpacity": "Preview overlay opacity", + "previewOverlayTransparency": "Preview overlay transparency", + "previewOverlayVisibility": "Show preview overlay", + "selectText": { + "1": "Renk Değiştir veya Tersine Çevirme Seçenekleri", + "2": "VarsayÄąlan (YÃŧksek kontrastlÄą varsayÄąlan renkler)", + "3": "Özel (Kişiselleştirilmiş renkler)", + "4": "TÃŧmÃŧ Tersine Çevir (TÃŧm renkleri tersine çevir)", + "5": "YÃŧksek kontrastlÄą renk seçenekleri", + "6": "Siyah arka plan Ãŧzerine beyaz metin", + "7": "Beyaz arka plan Ãŧzerine siyah metin", + "8": "Siyah arka plan Ãŧzerine sarÄą metin", + "9": "Siyah arka plan Ãŧzerine yeşil metin", + "10": "Metin Rengini Seç", + "11": "Arka Plan Rengini Seç", + "12": "Choose start colour", + "13": "Choose end colour" + }, + "submit": "Değiştir", + "title": "Renk Değiştir-Tersine Çevir", + "header": "PDF Renklerini Değiştir veya Tersine Çevir" + }, + "size": "Size", + "submit": "Submit", + "success": "Success", + "tools": { + "noSearchResults": "No tools found", + "noTools": "No tools available" + }, + "undoDataMismatch": "Cannot undo: operation data is corrupted", + "undoFailed": "Failed to undo operation", + "undoQuotaError": "Cannot undo: insufficient storage space", + "undoStorageError": "Undo completed but some files could not be saved to storage", + "undoSuccess": "Operation undone successfully", + "unsupported": "Unsupported", + "onboarding": { + "welcomeModal": { + "title": "Welcome to Stirling PDF!", + "description": "Would you like to take a quick 1-minute tour to learn the key features and how to get started?", + "helpHint": "You can always access this tour later from the Help button in the bottom left.", + "startTour": "Start Tour", + "maybeLater": "Maybe Later", + "dontShowAgain": "Don't Show Again" + }, + "allTools": "This is the All Tools panel, where you can browse and select from all available PDF tools.", + "selectCropTool": "Let's select the Crop tool to demonstrate how to use one of the tools.", + "toolInterface": "This is the Crop tool interface. As you can see, there's not much there because we haven't added any PDF files to work with yet.", + "filesButton": "The Files button on the Quick Access bar allows you to upload PDFs to use the tools on.", + "fileSources": "You can upload new files or access recent files from here. For the tour, we'll just use a sample file.", + "workbench": "This is the Workbench - the main area where you view and edit your PDFs.", + "viewSwitcher": "Use these controls to select how you want to view your PDFs.", + "viewer": "The Viewer lets you read and annotate your PDFs.", + "pageEditor": "The Page Editor allows you to do various operations on the pages within your PDFs, such as reordering, rotating and deleting.", + "activeFiles": "The Active Files view shows all of the PDFs you have loaded into the tool, and allows you to select which ones to process.", + "fileCheckbox": "Clicking one of the files selects it for processing. You can select multiple files for batch operations.", + "selectControls": "The Right Rail contains buttons to quickly select/deselect all of your active PDFs, along with buttons to change the app's theme or language.", + "cropSettings": "Now that we've selected the file we want crop, we can configure the Crop tool to choose the area that we want to crop the PDF to.", + "runButton": "Once the tool has been configured, this button allows you to run the tool on all the selected PDFs.", + "results": "After the tool has finished running, the Review step will show a preview of the results in this panel, and allow you to undo the operation or download the file. ", + "fileReplacement": "The modified file will replace the original file in the Workbench automatically, allowing you to easily run it through more tools.", + "pinButton": "You can use the Pin button if you'd rather your files stay active after running tools on them.", + "wrapUp": "You're all set! You've learnt about the main areas of the app and how to use them. Click the Help button whenever you like to see this tour again.", + "previous": "Previous", + "next": "Next", + "finish": "Finish", + "startTour": "Start Tour", + "startTourDescription": "Take a guided tour of Stirling PDF's key features" + }, + "workspace": { + "title": "Workspace", + "people": { + "title": "People", + "description": "Manage workspace members and their permissions", + "loading": "Loading people...", + "searchMembers": "Search members...", + "addMembers": "Add Members", + "inviteMembers": { + "label": "Invite Members", + "subtitle": "Type or paste in emails below, separated by commas. Your workspace will be billed by members." + }, + "user": "User", + "role": "Role", + "team": "Team", + "status": "Status", + "actions": "Actions", + "noMembersFound": "No members found", + "active": "Active", + "disabled": "Disabled", + "activeSession": "Active session", + "member": "Member", + "admin": "Admin", + "roleDescriptions": { + "admin": "Can manage settings and invite members, with full administrative access.", + "member": "Can view and edit shared files, but cannot manage workspace settings or members." + }, + "editRole": "Edit Role", + "enable": "Enable", + "disable": "Disable", + "deleteUser": "Delete User", + "deleteUserSuccess": "User deleted successfully", + "deleteUserError": "Failed to delete user", + "confirmDelete": "Are you sure you want to delete this user? This action cannot be undone.", + "addMember": { + "title": "Add Member", + "username": "Username (Email)", + "usernamePlaceholder": "user@example.com", + "password": "Password", + "passwordPlaceholder": "Enter password", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "forcePasswordChange": "Force password change on first login", + "cancel": "Cancel", + "submit": "Add Member", + "usernameRequired": "Username and password are required", + "passwordTooShort": "Password must be at least 6 characters", + "success": "User created successfully", + "error": "Failed to create user" + }, + "editMember": { + "title": "Edit Member", + "editing": "Editing:", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "cancel": "Cancel", + "submit": "Update Member", + "success": "User updated successfully", + "error": "Failed to update user" + }, + "toggleEnabled": { + "success": "User status updated successfully", + "error": "Failed to update user status" + }, + "delete": { + "success": "User deleted successfully", + "error": "Failed to delete user" + }, + "emailInvite": { + "tab": "Email Invite", + "description": "Type or paste in emails below, separated by commas. Users will receive login credentials via email.", + "emails": "Email Addresses", + "emailsPlaceholder": "user1@example.com, user2@example.com", + "emailsRequired": "At least one email address is required", + "submit": "Send Invites", + "success": "user(s) invited successfully", + "partialSuccess": "Some invites failed", + "allFailed": "Failed to invite users", + "error": "Failed to send invites" + }, + "directInvite": { + "tab": "Direct Create" + }, + "inviteLinkTab": { + "tab": "Invite Link" + }, + "inviteLink": { + "description": "Generate a secure link that allows the user to set their own password", + "email": "Email Address", + "emailPlaceholder": "user@example.com (optional)", + "emailDescription": "Optional - leave blank for a general invite link that can be used by anyone", + "emailRequired": "Email address is required", + "emailOptional": "Optional - leave blank for a general invite link", + "emailRequiredForSend": "Email address is required to send email notification", + "expiryHours": "Expiry Hours", + "expiryDescription": "How many hours until the link expires", + "sendEmail": "Send invite link via email", + "sendEmailDescription": "If enabled, the invite link will be sent to the specified email address", + "smtpRequired": "SMTP not configured", + "generate": "Generate Link", + "generated": "Invite Link Generated", + "copied": "Link copied to clipboard", + "success": "Invite link generated successfully", + "successWithEmail": "Invite link generated and sent via email", + "emailFailed": "Invite link generated, but email failed", + "emailFailedDetails": "Error: {0}. Please share the invite link manually.", + "error": "Failed to generate invite link", + "submit": "Generate Invite Link" + }, + "inviteMode": { + "username": "Username", + "email": "Email", + "link": "Link", + "emailDisabled": "Email invites require SMTP configuration and mail.enableInvites=true in settings" + }, + "license": { + "users": "users", + "availableSlots": "Available Slots", + "grandfathered": "Grandfathered", + "grandfatheredShort": "{{count}} grandfathered", + "fromLicense": "from license", + "slotsAvailable": "{{count}} user slot(s) available", + "noSlotsAvailable": "No slots available", + "currentUsage": "Currently using {{current}} of {{max}} user licences" + } + }, + "teams": { + "title": "Teams", + "description": "Manage teams and organize workspace members", + "loading": "Loading teams...", + "loadingDetails": "Loading team details...", + "createNewTeam": "Create New Team", + "teamName": "Team Name", + "totalMembers": "Total Members", + "actions": "Actions", + "noTeamsFound": "No teams found", + "noMembers": "No members in this team", + "system": "System", + "addMember": "Add Member", + "viewTeam": "View Team", + "removeMember": "Remove from team", + "cannotRemoveFromSystemTeam": "Cannot remove from system team", + "renameTeamLabel": "Rename Team", + "deleteTeamLabel": "Delete Team", + "cannotDeleteInternal": "Cannot delete the Internal team", + "confirmDelete": "Are you sure you want to delete this team? This team must be empty to delete.", + "confirmRemove": "Remove user from this team?", + "cannotRenameInternal": "Cannot rename the Internal team", + "cannotAddToInternal": "Cannot add members to the Internal team", + "teamNotFound": "Team not found", + "backToTeams": "Back to Teams", + "memberCount": "{{count}} members", + "removeMemberSuccess": "User removed from team", + "removeMemberError": "Failed to remove user from team", + "createTeam": { + "title": "Create New Team", + "teamName": "Team Name", + "teamNamePlaceholder": "Enter team name", + "cancel": "Cancel", + "submit": "Create Team", + "nameRequired": "Team name is required", + "success": "Team created successfully", + "error": "Failed to create team" + }, + "renameTeam": { + "title": "Rename Team", + "renaming": "Renaming:", + "newTeamName": "New Team Name", + "newTeamNamePlaceholder": "Enter new team name", + "cancel": "Cancel", + "submit": "Rename Team", + "nameRequired": "Team name is required", + "success": "Team renamed successfully", + "error": "Failed to rename team" + }, + "deleteTeam": { + "success": "Team deleted successfully", + "error": "Failed to delete team. Make sure the team is empty.", + "teamMustBeEmpty": "Team must be empty before deletion" + }, + "addMemberToTeam": { + "title": "Add Member to Team", + "addingTo": "Adding to", + "selectUser": "Select User", + "selectUserPlaceholder": "Choose a user", + "selectUserRequired": "Please select a user", + "currentlyIn": "currently in", + "willBeMoved": "Note: This user will be moved from their current team to this team.", + "cancel": "Cancel", + "submit": "Add Member", + "userRequired": "Please select a user", + "success": "Member added to team successfully", + "error": "Failed to add member to team" + }, + "changeTeam": { + "label": "Change Team", + "title": "Change Team", + "changing": "Moving", + "selectTeam": "Select Team", + "selectTeamPlaceholder": "Choose a team", + "selectTeamRequired": "Please select a team", + "success": "Team changed successfully", + "error": "Failed to change team", + "submit": "Change Team" + } + } + }, + "plan": { + "currency": "Currency", + "popular": "Popular", + "current": "Current Plan", + "upgrade": "Upgrade", + "contact": "Contact Us", + "customPricing": "Custom", + "showComparison": "Compare All Features", + "hideComparison": "Hide Feature Comparison", + "featureComparison": "Feature Comparison", + "activePlan": { + "title": "Active Plan", + "subtitle": "Your current subscription details" + }, + "availablePlans": { + "title": "Available Plans", + "subtitle": "Choose the plan that fits your needs" + }, + "static": { + "title": "Billing Information", + "message": "Online billing is not currently configured. To upgrade your plan or manage subscriptions, please contact us directly.", + "contactSales": "Contact Sales", + "contactToUpgrade": "Contact us to upgrade or customize your plan", + "maxUsers": "Max Users", + "upTo": "Up to" + }, + "period": { + "month": "month" + }, + "free": { + "name": "Free", + "highlight1": "Limited Tool Usage Per week", + "highlight2": "Access to all tools", + "highlight3": "Community support" + }, + "pro": { + "name": "Pro", + "highlight1": "Unlimited Tool Usage", + "highlight2": "Advanced PDF tools", + "highlight3": "No watermarks" + }, + "enterprise": { + "name": "Enterprise", + "highlight1": "Custom pricing", + "highlight2": "Dedicated support", + "highlight3": "Latest features" + }, + "feature": { + "title": "Feature", + "pdfTools": "Basic PDF Tools", + "fileSize": "File Size Limit", + "automation": "Automate tool workflows", + "api": "API Access", + "priority": "Priority Support", + "customPricing": "Custom Pricing" + } + }, + "subscription": { + "status": { + "active": "Active", + "pastDue": "Past Due", + "canceled": "Canceled", + "incomplete": "Incomplete", + "trialing": "Trial", + "none": "No Subscription" + }, + "renewsOn": "Renews on {{date}}", + "cancelsOn": "Cancels on {{date}}" + }, + "billing": { + "manageBilling": "Manage Billing", + "portal": { + "error": "Failed to open billing portal" + } + }, + "payment": { + "preparing": "Preparing your checkout...", + "upgradeTitle": "Upgrade to {{planName}}", + "success": "Payment Successful!", + "successMessage": "Your subscription has been activated successfully. You will receive a confirmation email shortly.", + "autoClose": "This window will close automatically...", + "error": "Payment Error" + }, + "firstLogin": { + "title": "First Time Login", + "welcomeTitle": "Welcome!", + "welcomeMessage": "For security reasons, you must change your password on your first login.", + "loggedInAs": "Logged in as", + "error": "Error", + "currentPassword": "Current Password", + "enterCurrentPassword": "Enter your current password", + "newPassword": "New Password", + "enterNewPassword": "Enter new password (min 8 characters)", + "confirmPassword": "Confirm New Password", + "reEnterNewPassword": "Re-enter new password", + "changePassword": "Change Password", + "allFieldsRequired": "All fields are required", + "passwordsDoNotMatch": "New passwords do not match", + "passwordTooShort": "Password must be at least 8 characters", + "passwordMustBeDifferent": "New password must be different from current password", + "passwordChangedSuccess": "Password changed successfully! Please log in again.", + "passwordChangeFailed": "Failed to change password. Please check your current password." + }, + "invite": { + "welcome": "Welcome to Stirling PDF", + "invalidToken": "Invalid invitation link", + "validationError": "Failed to validate invitation link", + "passwordRequired": "Password is required", + "passwordTooShort": "Password must be at least 6 characters", + "passwordMismatch": "Passwords do not match", + "acceptError": "Failed to create account", + "validating": "Validating invitation...", + "invalidInvitation": "Invalid Invitation", + "goToLogin": "Go to Login", + "welcomeTitle": "You've been invited!", + "welcomeSubtitle": "Complete your account setup to get started", + "accountFor": "Creating account for", + "linkExpires": "Link expires", + "email": "Email address", + "emailPlaceholder": "Enter your email address", + "emailRequired": "Email address is required", + "invalidEmail": "Invalid email address", + "choosePassword": "Choose a password", + "passwordPlaceholder": "Enter your password", + "confirmPassword": "Confirm password", + "confirmPasswordPlaceholder": "Re-enter your password", + "createAccount": "Create Account", + "creating": "Creating Account...", + "alreadyHaveAccount": "Already have an account?", + "signIn": "Sign in" + }, + "audit": { + "error": { + "title": "Error loading audit system" + }, + "notAvailable": "Audit system not available", + "notAvailableMessage": "The audit system is not configured or not available.", + "disabled": "Audit logging is disabled", + "disabledMessage": "Enable audit logging in your application configuration to track system events.", + "systemStatus": { + "title": "System Status", + "status": "Audit Logging", + "enabled": "Enabled", + "disabled": "Disabled", + "level": "Audit Level", + "retention": "Retention Period", + "days": "days", + "totalEvents": "Total Events" + }, + "tabs": { + "dashboard": "Dashboard", + "events": "Audit Events", + "export": "Export" + }, + "charts": { + "title": "Audit Dashboard", + "error": "Error loading charts", + "day": "Day", + "week": "Week", + "month": "Month", + "byType": "Events by Type", + "byUser": "Events by User", + "overTime": "Events Over Time" + }, + "events": { + "title": "Audit Events", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "error": "Error loading events", + "noEvents": "No events found", + "timestamp": "Timestamp", + "type": "Type", + "user": "User", + "ipAddress": "IP Address", + "actions": "Actions", + "viewDetails": "View Details", + "eventDetails": "Event Details", + "details": "Details" + }, + "export": { + "title": "Export Audit Data", + "description": "Export audit events to CSV or JSON format. Use filters to limit the exported data.", + "format": "Export Format", + "filters": "Filters (Optional)", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "exportButton": "Export Data", + "error": "Failed to export data" + } + }, + "usage": { + "noData": "No data available", + "error": "Error loading usage statistics", + "noDataMessage": "No usage statistics are currently available.", + "controls": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All", + "refresh": "Refresh", + "dataTypeLabel": "Data Type:", + "dataType": { + "all": "All", + "api": "API", + "ui": "UI" + } + }, + "showing": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All" + }, + "stats": { + "totalEndpoints": "Total Endpoints", + "totalVisits": "Total Visits", + "showing": "Showing", + "selectedVisits": "Selected Visits" + }, + "chart": { + "title": "Endpoint Usage Chart" + }, + "table": { + "title": "Detailed Statistics", + "endpoint": "Endpoint", + "visits": "Visits", + "percentage": "Percentage", + "noData": "No data available" + } + }, + "backendHealth": { + "checking": "Checking backend status...", + "online": "Backend Online", + "offline": "Backend Offline" + }, + "autoRedact": { + "tags": "Karart,Gizle,karartma,siyah,markÃļr,gizli", + "title": "Otomatik Karartma", + "header": "Otomatik Karartma", + "colorLabel": "Renk", + "textsToRedactLabel": "KarartÄąlacak Metin (satÄąr ayrÄąlmÄąÅŸ)", + "textsToRedactPlaceholder": "Örn. \\nGizli \\nÇok Gizli", + "useRegexLabel": "Regex Kullan", + "wholeWordSearchLabel": "Tam Kelime Arama", + "customPaddingLabel": "Özel Ekstra Dolgu", + "convertPDFToImageLabel": "PDF'i PDF-GÃļrÃŧntÃŧ'ye dÃļnÃŧştÃŧr (Kutunun arkasÄąndaki metni kaldÄąrmak için kullanÄąlÄąr)", + "submitButton": "GÃļnder" + }, + "replaceColorPdf": { + "tags": "Renk Değiştir, Sayfa işlemleri, Arka yÃŧz, Sunucu tarafÄą" } -} \ No newline at end of file +} diff --git a/frontend/public/locales/uk-UA/translation.json b/frontend/public/locales/uk-UA/translation.json index 47c7f408d..043c82914 100644 --- a/frontend/public/locales/uk-UA/translation.json +++ b/frontend/public/locales/uk-UA/translation.json @@ -1,4 +1,40 @@ { + "toolPanel": { + "modePrompt": { + "title": "Choose how you browse tools", + "description": "Preview both layouts and decide how you want to explore Stirling PDF tools.", + "sidebarTitle": "Sidebar mode", + "sidebarDescription": "Keep tools alongside your workspace for quick switching.", + "recommended": "Recommended", + "chooseSidebar": "Use sidebar mode", + "fullscreenTitle": "Fullscreen mode - (legacy)", + "fullscreenDescription": "Browse every tool in a catalogue that covers the workspace until you pick one.", + "chooseFullscreen": "Use fullscreen mode", + "dismiss": "Maybe later" + }, + "fullscreen": { + "showDetails": "Show Details", + "comingSoon": "Coming soon:", + "favorite": "Add to favourites", + "favorites": "Favourites", + "heading": "All tools (fullscreen view)", + "noResults": "Try adjusting your search or toggle descriptions to find what you need.", + "recommended": "Recommended", + "unfavorite": "Remove from favourites" + }, + "placeholder": "Choose a tool to get started", + "toggle": { + "fullscreen": "Switch to fullscreen mode", + "sidebar": "Switch to sidebar mode" + } + }, + "unsavedChanges": "You have unsaved changes to your PDF.", + "areYouSure": "Are you sure you want to leave?", + "unsavedChangesTitle": "Unsaved Changes", + "keepWorking": "Keep Working", + "discardChanges": "Discard & Leave", + "applyAndContinue": "Save & Leave", + "exportAndContinue": "Export & Continue", "language": { "direction": "ltr" }, @@ -18,8 +54,26 @@ "customTextDesc": "ĐšĐžŅ€Đ¸ŅŅ‚ŅƒĐ˛Đ°Ņ†ŅŒĐēиК Ņ‚ĐĩĐēҁ҂", "numberPagesDesc": "Đ¯ĐēŅ– ŅŅ‚ĐžŅ€Ņ–ĐŊĐēи ĐŊ҃ĐŧĐĩŅ€ŅƒĐ˛Đ°Ņ‚Đ¸, Са СаĐŧĐžĐ˛Ņ‡ŅƒĐ˛Đ°ĐŊĐŊŅĐŧ 'Đ˛ŅŅ–', Ņ‚Đ°ĐēĐžĐļ ĐŋŅ€Đ¸ĐšĐŧĐ°Ņ” 1-5 айО 2,5,9 Ņ‚ĐžŅ‰Đž.", "customNumberDesc": "За СаĐŧĐžĐ˛Ņ‡ŅƒĐ˛Đ°ĐŊĐŊŅĐŧ {n}, Ņ‚Đ°ĐēĐžĐļ ĐŧĐžĐļĐŊа виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ 'ĐĄŅ‚ĐžŅ€Ņ–ĐŊĐēа {n} С {total}', 'ĐĸĐĩĐēҁ҂-{n}', '{filename}-{n}'", - "submit": "Đ”ĐžĐ´Đ°Ņ‚Đ¸ ĐŊĐžĐŧĐĩŅ€Đ¸ ŅŅ‚ĐžŅ€Ņ–ĐŊĐžĐē" + "submit": "Đ”ĐžĐ´Đ°Ņ‚Đ¸ ĐŊĐžĐŧĐĩŅ€Đ¸ ŅŅ‚ĐžŅ€Ņ–ĐŊĐžĐē", + "configuration": "Configuration", + "customize": "Customize Appearance", + "pagesAndStarting": "Pages & Starting Number", + "positionAndPages": "Position & Pages", + "error": { + "failed": "Add page numbers operation failed" + }, + "results": { + "title": "Page Number Results" + }, + "preview": "Position Selection", + "previewDisclaimer": "Preview is approximate. Final output may vary due to PDF font metrics." }, + "pageSelectionPrompt": "ĐšĐžŅ€Đ¸ŅŅ‚ŅƒĐ˛Đ°Ņ†ŅŒĐēиК Đ˛Đ¸ĐąŅ–Ņ€ ŅŅ‚ĐžŅ€Ņ–ĐŊĐēи (ввĐĩĐ´Ņ–Ņ‚ŅŒ ҁĐŋĐ¸ŅĐžĐē ĐŊĐžĐŧĐĩŅ€Ņ–Đ˛ ŅŅ‚ĐžŅ€Ņ–ĐŊĐžĐē ҇ĐĩŅ€ĐĩС ĐēĐžĐŧ҃ 1,5,6 айО Ņ„ŅƒĐŊĐē҆Җҗ Ņ‚Đ¸Đŋ҃ 2n+1) :", + "startingNumberTooltip": "The first number to display. Subsequent pages will increment from this number.", + "marginTooltip": "Distance between the page number and the edge of the page.", + "fontSizeTooltip": "Size of the page number text in points. Larger numbers create bigger text.", + "fontTypeTooltip": "Font family for the page numbers. Choose based on your document style.", + "customTextTooltip": "Optional custom format for page numbers. Use {n} as placeholder for the number. Example: \"Page {n}\" will show \"Page 1\", \"Page 2\", etc.", "pdfPrompt": "ОбĐĩŅ€Ņ–Ņ‚ŅŒ PDF(и)", "multiPdfPrompt": "ОбĐĩŅ€Ņ–Ņ‚ŅŒ PDFи (2+)", "multiPdfDropPrompt": "ОбĐĩŅ€Ņ–Ņ‚ŅŒ (айО ĐŋĐĩŅ€ĐĩŅ‚ŅĐŗĐŊŅ–Ņ‚ŅŒ) Đ˛ŅŅ– ĐŊĐĩĐžĐąŅ…Ņ–Đ´ĐŊŅ– PDFи", @@ -30,15 +84,41 @@ "uploadLimitExceededPlural": "are too large. Maximum allowed size is", "processTimeWarning": "ĐŖĐ˛Đ°ĐŗĐ°: ĐĻĐĩĐš ĐŋŅ€ĐžŅ†Đĩҁ ĐŧĐžĐļĐĩ Ņ‚Ņ€Đ¸Đ˛Đ°Ņ‚Đ¸ Đ´Đž Ņ…Đ˛Đ¸ĐģиĐŊи в СаĐģĐĩĐļĐŊĐžŅŅ‚Ņ– Đ˛Ņ–Đ´ Ņ€ĐžĐˇĐŧŅ–Ņ€Ņƒ Ņ„Đ°ĐšĐģ҃.", "pageOrderPrompt": "ĐŸĐžŅ€ŅĐ´ĐžĐē ŅŅ‚ĐžŅ€Ņ–ĐŊĐžĐē (ввĐĩĐ´Ņ–Ņ‚ŅŒ ҁĐŋĐ¸ŅĐžĐē ĐŊĐžĐŧĐĩŅ€Ņ–Đ˛ ŅŅ‚ĐžŅ€Ņ–ĐŊĐžĐē ҇ĐĩŅ€ĐĩС ĐēĐžĐŧ҃):", - "pageSelectionPrompt": "ĐšĐžŅ€Đ¸ŅŅ‚ŅƒĐ˛Đ°Ņ†ŅŒĐēиК Đ˛Đ¸ĐąŅ–Ņ€ ŅŅ‚ĐžŅ€Ņ–ĐŊĐēи (ввĐĩĐ´Ņ–Ņ‚ŅŒ ҁĐŋĐ¸ŅĐžĐē ĐŊĐžĐŧĐĩŅ€Ņ–Đ˛ ŅŅ‚ĐžŅ€Ņ–ĐŊĐžĐē ҇ĐĩŅ€ĐĩС ĐēĐžĐŧ҃ 1,5,6 айО Ņ„ŅƒĐŊĐē҆Җҗ Ņ‚Đ¸Đŋ҃ 2n+1) :", "goToPage": "ВĐŋĐĩŅ€ĐĩĐ´", "true": "ĐŸŅ€Đ°Đ˛Đ´Đ°", "false": "Đ‘Ņ€ĐĩŅ…ĐŊŅ", "unknown": "НĐĩĐ˛Ņ–Đ´ĐžĐŧĐž", + "app": { + "description": "The Free Adobe Acrobat alternative (10M+ Downloads)" + }, "save": "ЗбĐĩŅ€ĐĩĐŗŅ‚Đ¸", "saveToBrowser": "ЗбĐĩŅ€ĐĩĐŗŅ‚Đ¸ в ĐąŅ€Đ°ŅƒĐˇĐĩҀҖ", + "download": "ЗаваĐŊŅ‚Đ°ĐļĐ¸Ņ‚Đ¸", + "pin": "Pin File (keep active after tool run)", + "unpin": "Unpin File (replace after tool run)", + "undoOperationTooltip": "Click to undo the last operation and restore the original files", + "undo": "ĐĄĐēĐ°ŅŅƒĐ˛Đ°Ņ‚Đ¸", + "moreOptions": "More Options", + "editYourNewFiles": "Edit your new file(s)", "close": "ЗаĐēŅ€Đ¸Ņ‚Đ¸", + "openInViewer": "Open in Viewer", + "confirmClose": "Confirm Close", + "confirmCloseMessage": "Are you sure you want to close this file?", + "confirmCloseCancel": "Cancel", + "confirmCloseConfirm": "Close File", + "fileSelected": "Selected: {{filename}}", + "chooseFile": "Choose File", "filesSelected": "Ņ„Đ°ĐšĐģŅ–Đ˛ ĐžĐąŅ€Đ°ĐŊĐž", + "files": { + "title": "Files", + "upload": "Upload", + "uploadFiles": "Upload Files", + "addFiles": "Add files", + "selectFromWorkbench": "Select files from the workbench or ", + "selectMultipleFromWorkbench": "Select at least {{count}} files from the workbench or ", + "created": "Created", + "size": "File Size" + }, "noFavourites": "НĐĩĐŧĐ°Ņ” Đ˛Đ¸ĐąŅ€Đ°ĐŊĐžĐŗĐž", "downloadComplete": "ЗаваĐŊŅ‚Đ°ĐļĐĩĐŊĐŊŅ СавĐĩŅ€ŅˆĐĩĐŊĐž", "bored": "ĐŅƒĐ´ĐŊĐž ҇ĐĩĐēĐ°Ņ‚Đ¸?", @@ -56,7 +136,10 @@ }, "error": { "pdfPassword": "ДоĐē҃ĐŧĐĩĐŊŅ‚ PDF ĐˇĐ°Ņ…Đ¸Ņ‰ĐĩĐŊĐž ĐŋĐ°Ņ€ĐžĐģĐĩĐŧ, Ņ– ĐŋĐ°Ņ€ĐžĐģҌ ĐŊĐĩ ĐąŅƒĐ˛ ĐŊадаĐŊиК айО ĐąŅƒĐ˛ ĐŊĐĩĐ˛Ņ–Ņ€ĐŊиĐŧ", + "encryptedPdfMustRemovePassword": "This PDF is encrypted or password-protected. Please unlock it before converting to PDF/A.", + "incorrectPasswordProvided": "The PDF password is incorrect or not provided.", "_value": "ПоĐŧиĐģĐēа", + "dismissAllErrors": "Dismiss All Errors", "sorry": "Đ’Đ¸ĐąĐ°Ņ‡Ņ‚Đĩ Са ĐŊĐĩĐˇŅ€ŅƒŅ‡ĐŊĐžŅŅ‚Ņ–!", "needHelp": "ĐŸĐžŅ‚Ņ€Ņ–ĐąĐŊа Đ´ĐžĐŋĐžĐŧĐžĐŗĐ° / ЗĐŊĐ°ĐšŅˆĐģи ĐŋŅ€ĐžĐąĐģĐĩĐŧ҃?", "contactTip": "Đ¯ĐēŅ‰Đž ҃ Đ˛Đ°Ņ Đ´ĐžŅŅ– виĐŊиĐēĐ°ŅŽŅ‚ŅŒ ĐŋŅ€ĐžĐąĐģĐĩĐŧи, ĐŊĐĩ ŅĐžŅ€ĐžĐŧŅ‚ĐĩŅŅ СвĐĩŅ€Ņ‚Đ°Ņ‚Đ¸ŅŅ Đ´Đž ĐŊĐ°Ņ Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅŽ. Ви ĐŧĐžĐļĐĩŅ‚Đĩ ĐŊĐ°Đ´Ņ–ŅĐģĐ°Ņ‚Đ¸ СаĐŋĐ¸Ņ‚ ĐŊа ĐŊĐ°ŅˆŅ–Đš ŅŅ‚ĐžŅ€Ņ–ĐŊ҆Җ GitHub айО Св'ŅĐˇĐ°Ņ‚Đ¸ŅŅ С ĐŊаĐŧи ҇ĐĩŅ€ĐĩС Discord:", @@ -71,6 +154,10 @@ "githubSubmit": "GitHub - ĐĐ°Đ´Ņ–ŅĐģĐ°Ņ‚Đ¸ СаĐŋĐ¸Ņ‚", "discordSubmit": "Discord - ĐĐ°Đ´Ņ–ŅĐģĐ°Ņ‚Đ¸ ĐŋĐžĐ˛Ņ–Đ´ĐžĐŧĐģĐĩĐŊĐŊŅ ĐŋŅ–Đ´Ņ‚Ņ€Đ¸ĐŧĐēи" }, + "warning": { + "tooltipTitle": "Warning" + }, + "edit": "Edit", "delete": "ВидаĐģĐ¸Ņ‚Đ¸", "username": "ІĐŧ'Ņ ĐēĐžŅ€Đ¸ŅŅ‚ŅƒĐ˛Đ°Ņ‡Đ°", "password": "ĐŸĐ°Ņ€ĐžĐģҌ", @@ -82,6 +169,7 @@ "green": "ЗĐĩĐģĐĩĐŊиК", "blue": "ХиĐŊŅ–Đš", "custom": "Đ—Đ˛Đ¸Ņ‡Đ°Đš...", + "comingSoon": "Coming soon", "WorkInProgess": "Đ ĐžĐąĐžŅ‚Đ° Ņ‚Ņ€Đ¸Đ˛Đ°Ņ”, ĐŧĐžĐļĐĩ ĐŊĐĩ ĐŋŅ€Đ°Ņ†ŅŽĐ˛Đ°Ņ‚Đ¸ айО ĐŗĐģŅŽŅ‡Đ¸Ņ‚Đ¸, ĐąŅƒĐ´ŅŒ ĐģĐ°ŅĐēа, ĐŋĐžĐ˛Ņ–Đ´ĐžĐŧĐģŅĐšŅ‚Đĩ ĐŋŅ€Đž ĐąŅƒĐ´ŅŒ-ŅĐēŅ– ĐŋŅ€ĐžĐąĐģĐĩĐŧи!", "poweredBy": "ĐŸŅ€Đ°Ņ†ŅŽŅ” ĐŊа", "yes": "ĐĸаĐē", @@ -115,12 +203,14 @@ "page": "ĐĄŅ‚ĐžŅ€Ņ–ĐŊĐēа", "pages": "ĐĄŅ‚ĐžŅ€Ņ–ĐŊĐēи", "loading": "ЗаваĐŊŅ‚Đ°ĐļĐĩĐŊĐŊŅ...", + "review": "Review", "addToDoc": "Đ”ĐžĐ´Đ°Ņ‚Đ¸ Đ´Đž Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Ņƒ", "reset": "ĐĄĐēиĐŊŅƒŅ‚Đ¸", "apply": "Đ—Đ°ŅŅ‚ĐžŅŅƒĐ˛Đ°Ņ‚Đ¸", "noFileSelected": "No file selected. Please upload one.", "legal": { "privacy": "ПоĐģŅ–Ņ‚Đ¸Đēа ĐēĐžĐŊŅ„Ņ–Đ´ĐĩĐŊŅ†Ņ–ĐšĐŊĐžŅŅ‚Ņ–", + "iAgreeToThe": "I agree to all of the", "terms": "ĐŸŅ€Đ°Đ˛Đ¸Đģа Ņ‚Đ° ҃ĐŧОви", "accessibility": "Đ”ĐžŅŅ‚ŅƒĐŋĐŊŅ–ŅŅ‚ŅŒ", "cookie": "ПоĐģŅ–Ņ‚Đ¸Đēа виĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊĐŊŅ Ņ„Đ°ĐšĐģŅ–Đ˛ cookie", @@ -160,6 +250,7 @@ "title": "БаĐļĐ°Ņ”Ņ‚Đĩ ĐŋĐžĐēŅ€Đ°Ņ‰Đ¸Ņ‚Đ¸ Stirling PDF?", "paragraph1": "Stirling PDF ŅƒĐ˛Ņ–ĐŧĐēĐŊŅƒĐ˛ аĐŊаĐģŅ–Ņ‚Đ¸Đē҃, Ņ‰ĐžĐą Đ´ĐžĐŋĐžĐŧĐžĐŗŅ‚Đ¸ ĐŊаĐŧ ĐŋĐžĐēŅ€Đ°Ņ‰Đ¸Ņ‚Đ¸ ĐŋŅ€ĐžĐ´ŅƒĐēŅ‚. Ми ĐŊĐĩ Đ˛Ņ–Đ´ŅŅ‚ĐĩĐļŅƒŅ”ĐŧĐž ĐļОдĐŊ҃ ĐžŅĐžĐąĐ¸ŅŅ‚Ņƒ Ņ–ĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–ŅŽ Ņ‡Đ¸ вĐŧҖҁ҂ Ņ„Đ°ĐšĐģŅ–Đ˛.", "paragraph2": "ĐŖĐ˛Ņ–ĐŧĐēĐŊŅ–Ņ‚ŅŒ аĐŊаĐģŅ–Ņ‚Đ¸Đē҃, Ņ‰ĐžĐą Đ´ĐžĐŋĐžĐŧĐžĐŗŅ‚Đ¸ Stirling-PDF Ņ€ĐžĐˇĐ˛Đ¸Đ˛Đ°Ņ‚Đ¸ŅŅ Ņ‚Đ° дОСвОĐģĐ¸Ņ‚Đ¸ ĐŊаĐŧ ĐēŅ€Đ°Ņ‰Đĩ Ņ€ĐžĐˇŅƒĐŧŅ–Ņ‚Đ¸ ĐŊĐ°ŅˆĐ¸Ņ… ĐēĐžŅ€Đ¸ŅŅ‚ŅƒĐ˛Đ°Ņ‡Ņ–Đ˛.", + "learnMore": "Learn more", "enable": "ĐŖĐ˛Ņ–ĐŧĐēĐŊŅƒŅ‚Đ¸ аĐŊаĐģŅ–Ņ‚Đ¸Đē҃", "disable": "ВиĐŧĐēĐŊŅƒŅ‚Đ¸ аĐŊаĐģŅ–Ņ‚Đ¸Đē҃", "settings": "Ви ĐŧĐžĐļĐĩŅ‚Đĩ СĐŧŅ–ĐŊĐ¸Ņ‚Đ¸ ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€Đ¸ аĐŊаĐģŅ–Ņ‚Đ¸Đēи ҃ Ņ„Đ°ĐšĐģŅ– config/settings.yml" @@ -203,6 +294,54 @@ "cacheInputs": { "name": "ЗбĐĩŅ€Ņ–ĐŗĐ°Ņ‚Đ¸ даĐŊŅ– Ņ„ĐžŅ€Đŧ", "help": "ĐŖĐ˛Ņ–ĐŧĐēĐŊŅƒŅ‚Đ¸ Đ´ĐģŅ СйĐĩŅ€ĐĩĐļĐĩĐŊĐŊŅ Ņ€Đ°ĐŊŅ–ŅˆĐĩ виĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊĐ¸Ņ… Đ˛Ņ…Ņ–Đ´ĐŊĐ¸Ņ… даĐŊĐ¸Ņ… Đ´ĐģŅ ĐŧĐ°ĐšĐąŅƒŅ‚ĐŊŅ–Ņ… ĐŋŅ€ĐžĐŗĐžĐŊŅ–Đ˛" + }, + "general": { + "title": "General", + "description": "Configure general application preferences.", + "account": "Account", + "accountDescription": "Manage your account settings", + "user": "User", + "signedInAs": "Signed in as", + "logout": "Log out", + "enableFeatures": { + "title": "For System Administrators", + "intro": "Enable user authentication, team management, and workspace features for your organization.", + "action": "Configure", + "and": "and", + "benefit": "Enables user roles, team collaboration, admin controls, and enterprise features.", + "learnMore": "Learn more in documentation", + "dismiss": "Dismiss" + }, + "autoUnzip": "Auto-unzip API responses", + "autoUnzipDescription": "Automatically extract files from ZIP responses", + "autoUnzipTooltip": "Automatically extract ZIP files returned from API operations. Disable to keep ZIP files intact. This does not affect automation workflows.", + "autoUnzipFileLimit": "Auto-unzip file limit", + "autoUnzipFileLimitDescription": "Maximum number of files to extract from ZIP", + "autoUnzipFileLimitTooltip": "Only unzip if the ZIP contains this many files or fewer. Set higher to extract larger ZIPs.", + "defaultToolPickerMode": "Default tool picker mode", + "defaultToolPickerModeDescription": "Choose whether the tool picker opens in fullscreen or sidebar by default", + "mode": { + "fullscreen": "Fullscreen", + "sidebar": "Sidebar" + } + }, + "hotkeys": { + "title": "Keyboard Shortcuts", + "description": "Hover a tool to see its shortcut or customise it below. Click \"Change shortcut\" and press a new key combination. Press Esc to cancel.", + "errorModifier": { + "mac": "Include ⌘ (Command), âŒĨ (Option), or another modifier in your shortcut.", + "windows": "Include Ctrl, Alt, or another modifier in your shortcut." + }, + "errorConflict": "Shortcut already used by {{tool}}.", + "none": "Not assigned", + "customBadge": "Custom", + "defaultLabel": "Default: {{shortcut}}", + "capturing": "Press keysâ€Ļ (Esc to cancel)", + "change": "Change shortcut", + "reset": "Reset", + "shortcut": "Shortcut", + "noShortcut": "No shortcut set", + "searchPlaceholder": "Search tools..." } }, "changeCreds": { @@ -274,8 +413,10 @@ "top20": "ĐĸĐžĐŋ 20", "all": "Đ’ŅŅ–", "refresh": "ОĐŊĐžĐ˛Đ¸Ņ‚Đ¸", - "includeHomepage": "ВĐēĐģŅŽŅ‡Đ¸Ņ‚Đ¸ ĐŗĐžĐģОвĐŊ҃ ŅŅ‚ĐžŅ€Ņ–ĐŊĐē҃ ('/')", - "includeLoginPage": "ВĐēĐģŅŽŅ‡Đ¸Ņ‚Đ¸ ŅŅ‚ĐžŅ€Ņ–ĐŊĐē҃ Đ˛Ņ…ĐžĐ´Ņƒ ('/login')", + "dataTypeLabel": "Data Type:", + "dataTypeAll": "All", + "dataTypeApi": "API", + "dataTypeUi": "UI", "totalEndpoints": "Đ’ŅŅŒĐžĐŗĐž ĐēŅ–ĐŊ҆ĐĩĐ˛Đ¸Ņ… Ņ‚ĐžŅ‡ĐžĐē", "totalVisits": "Đ’ŅŅŒĐžĐŗĐž Đ˛Ņ–Đ´Đ˛Ņ–Đ´ŅƒĐ˛Đ°ĐŊҌ", "showing": "ПоĐēаСаĐŊĐž", @@ -290,7 +431,9 @@ "top": "ĐĸĐžĐŋ", "numberOfVisits": "ĐšŅ–ĐģҌĐēŅ–ŅŅ‚ŅŒ Đ˛Ņ–Đ´Đ˛Ņ–Đ´ŅƒĐ˛Đ°ĐŊҌ", "visitsTooltip": "Đ’Ņ–Đ´Đ˛Ņ–Đ´ŅƒĐ˛Đ°ĐŊĐŊŅ: {0} ({1}% Đ˛Ņ–Đ´ ĐˇĐ°ĐŗĐ°ĐģҌĐŊĐžŅ— ĐēŅ–ĐģҌĐēĐžŅŅ‚Ņ–)", - "retry": "ĐŸĐžĐ˛Ņ‚ĐžŅ€Đ¸Ņ‚Đ¸" + "retry": "ĐŸĐžĐ˛Ņ‚ĐžŅ€Đ¸Ņ‚Đ¸", + "includeHomepage": "ВĐēĐģŅŽŅ‡Đ¸Ņ‚Đ¸ ĐŗĐžĐģОвĐŊ҃ ŅŅ‚ĐžŅ€Ņ–ĐŊĐē҃ ('/')", + "includeLoginPage": "ВĐēĐģŅŽŅ‡Đ¸Ņ‚Đ¸ ŅŅ‚ĐžŅ€Ņ–ĐŊĐē҃ Đ˛Ņ…ĐžĐ´Ņƒ ('/login')" }, "database": { "title": "ІĐŧĐŋĐžŅ€Ņ‚/ĐĩĐēҁĐŋĐžŅ€Ņ‚ йаСи даĐŊĐ¸Ņ…", @@ -331,22 +474,310 @@ "alphabetical": "АйĐĩŅ‚ĐēĐžŅŽ", "globalPopularity": "ГĐģОйаĐģҌĐŊĐžŅŽ ĐŋĐžŅƒĐģŅŅ€ĐŊŅ–ŅŅ‚ŅŽ", "sortBy": "ĐĄĐžŅ€Ņ‚ŅƒĐ˛Đ°Ņ‚Đ¸ Са:", + "mobile": { + "brandAlt": "Stirling PDF logo", + "openFiles": "Open files", + "swipeHint": "Swipe left or right to switch views", + "tools": "Tools", + "toolsSlide": "Tool selection panel", + "viewSwitcher": "Switch workspace view", + "workbenchSlide": "Workspace panel", + "workspace": "Workspace" + }, "multiTool": { + "tags": "multiple,tools", "title": "ĐœŅƒĐģŅŒŅ‚Ņ–Ņ–ĐŊŅŅ‚Ņ€ŅƒĐŧĐĩĐŊŅ‚ PDF", "desc": "Об'Ņ”Đ´ĐŊаĐŊĐŊŅ, ĐŋĐžĐ˛ĐžŅ€ĐžŅ‚, СĐŧŅ–ĐŊа ĐŋĐžŅ€ŅĐ´Đē҃ Ņ‚Đ° видаĐģĐĩĐŊĐŊŅ ŅŅ‚ĐžŅ€Ņ–ĐŊĐžĐē" }, "merge": { + "tags": "combine,join,unite", "title": "Об'Ņ”Đ´ĐŊĐ°Ņ‚Đ¸", "desc": "ЛĐĩĐŗĐēĐž Ой'Ņ”Đ´ĐŊŅƒĐšŅ‚Đĩ ĐēŅ–ĐģҌĐēа PDF-Ņ„Đ°ĐšĐģŅ–Đ˛ ҃ ОдиĐŊ." }, "split": { + "tags": "divide,separate,break", "title": "Đ ĐžĐˇĐ´Ņ–ĐģĐ¸Ņ‚Đ¸", "desc": "Đ ĐžĐˇĐ´Ņ–ĐģŅ–Ņ‚ŅŒ PDF-Ņ„Đ°ĐšĐģи ĐŊа ĐēŅ–ĐģҌĐēа Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Ņ–Đ˛" }, "rotate": { + "tags": "turn,flip,orient", "title": "ПовĐĩŅ€ĐŊŅƒŅ‚Đ¸", "desc": "ЛĐĩĐŗĐēĐž ĐŋОвĐĩŅ€Ņ‚Đ°ĐšŅ‚Đĩ Đ˛Đ°ŅˆŅ– PDF-Ņ„Đ°ĐšĐģи." }, + "convert": { + "tags": "transform,change", + "title": "КоĐŊвĐĩŅ€Ņ‚ŅƒĐ˛Đ°Ņ‚Đ¸", + "desc": "Convert files between different formats" + }, + "pdfOrganiser": { + "tags": "organize,rearrange,reorder", + "title": "Đ ĐĩĐžŅ€ĐŗĐ°ĐŊŅ–ĐˇĐ°Ņ†Ņ–Ņ", + "desc": "ВидаĐģĐĩĐŊĐŊŅ/ĐŋĐĩŅ€ĐĩŅŅ‚Đ°ĐŊОвĐēа ŅŅ‚ĐžŅ€Ņ–ĐŊĐžĐē ҃ ĐąŅƒĐ´ŅŒ-ŅĐēĐžĐŧ҃ ĐŋĐžŅ€ŅĐ´Đē҃" + }, + "addImage": { + "tags": "insert,embed,place", + "title": "Đ”ĐžĐ´Đ°Ņ‚Đ¸ ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊĐŊŅ", + "desc": "Đ”ĐžĐ´Đ°Ņ” ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊĐŊŅ ҃ вĐēаСаĐŊĐĩ ĐŧҖҁ҆Đĩ в PDF (в Ņ€ĐžĐˇŅ€ĐžĐąŅ†Ņ–)" + }, + "addAttachments": { + "tags": "embed,attach,include", + "title": "Add Attachments", + "desc": "Add or remove embedded files (attachments) to/from a PDF" + }, + "watermark": { + "tags": "stamp,mark,overlay", + "title": "Đ”ĐžĐ´Đ°Ņ‚Đ¸ Đ˛ĐžĐ´ŅĐŊиК СĐŊаĐē", + "desc": "Đ”ĐžĐ´Đ°ĐšŅ‚Đĩ ŅĐ˛Ņ–Đš Đ˛ĐžĐ´ŅĐŊиК СĐŊаĐē Đ´Đž Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ° PDF." + }, + "removePassword": { + "tags": "unlock", + "title": "ВидаĐģĐ¸Ņ‚Đ¸ ĐŋĐ°Ņ€ĐžĐģҌ", + "desc": "ЗĐŊŅ–ĐŧŅ–Ņ‚ŅŒ ĐˇĐ°Ņ…Đ¸ŅŅ‚ ĐŋĐ°Ņ€ĐžĐģĐĩĐŧ С Đ˛Đ°ŅˆĐžĐŗĐž Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ° PDF." + }, + "compress": { + "tags": "shrink,reduce,optimize", + "title": "ĐĄŅ‚Đ¸ŅĐŊŅƒŅ‚Đ¸", + "desc": "ĐĄŅ‚Đ¸ŅĐēĐ°ĐšŅ‚Đĩ PDF-Ņ„Đ°ĐšĐģи, Ņ‰ĐžĐą СĐŧĐĩĐŊŅˆĐ¸Ņ‚Đ¸ Ņ—Ņ… Ņ€ĐžĐˇĐŧŅ–Ņ€." + }, + "unlockPDFForms": { + "tags": "unlock,enable,edit", + "title": "Unlock PDF Forms", + "desc": "Remove read-only property of form fields in a PDF document." + }, + "changeMetadata": { + "tags": "edit,modify,update", + "title": "ЗĐŧŅ–ĐŊĐ¸Ņ‚Đ¸ ĐŧĐĩŅ‚Đ°Đ´Đ°ĐŊŅ–", + "desc": "ЗĐŧŅ–ĐŊĐ¸Ņ‚Đ¸/видаĐģĐ¸Ņ‚Đ¸/Đ´ĐžĐ´Đ°Ņ‚Đ¸ ĐŧĐĩŅ‚Đ°Đ´Đ°ĐŊŅ– С Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ° PDF" + }, + "ocr": { + "tags": "extract,scan", + "title": "OCR/ĐžŅ‡Đ¸Ņ‰ĐĩĐŊĐŊŅ ҁĐēаĐŊŅƒĐ˛Đ°ĐŊĐŊŅ", + "desc": "ĐžŅ‡Đ¸Ņ‰ĐĩĐŊĐŊŅ ҁĐēаĐŊŅƒĐ˛Đ°ĐŊĐŊŅ Ņ‚Đ° Đ˛Đ¸ŅĐ˛ĐģĐĩĐŊĐŊŅ Ņ‚ĐĩĐēŅŅ‚Ņƒ ĐŊа ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊĐŊŅŅ… ҃ Ņ„Đ°ĐšĐģŅ– PDF Ņ‚Đ° ĐŋĐžĐ˛Ņ‚ĐžŅ€ĐŊĐĩ дОдаваĐŊĐŊŅ ĐšĐžĐŗĐž ŅĐē Ņ‚ĐĩĐēҁ҂." + }, + "extractImages": { + "tags": "pull,save,export", + "title": "Đ’Đ¸Ņ‚ŅĐŗĐŊŅƒŅ‚Đ¸ ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊĐŊŅ", + "desc": "Đ’Đ¸Ņ‚ŅĐŗŅƒŅ” Đ˛ŅŅ– ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊĐŊŅ С PDF Ņ– СйĐĩŅ€Ņ–ĐŗĐ°Ņ” Ņ—Ņ… ҃ zip" + }, + "scannerImageSplit": { + "tags": "detect,split,photos", + "title": "Detect & Split Scanned Photos", + "desc": "Detect and split scanned photos into separate pages" + }, + "sign": { + "tags": "signature,autograph", + "title": "ĐŸŅ–Đ´ĐŋĐ¸Ņ", + "desc": "Đ”ĐžĐ´Đ°Ņ” ĐŋŅ–Đ´ĐŋĐ¸Ņ Đ´Đž PDF Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅŽ ĐŧаĐģŅŽĐŊĐēа, Ņ‚ĐĩĐēŅŅ‚Ņƒ айО ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊĐŊŅ" + }, + "flatten": { + "tags": "simplify,remove,interactive", + "title": "ЗĐŊĐĩаĐēŅ‚Đ¸Đ˛ŅƒĐ˛Đ°ĐŊĐŊŅ", + "desc": "ВидаĐģĐĩĐŊĐŊŅ Đ˛ŅŅ–Ņ… Ņ–ĐŊŅ‚ĐĩŅ€Đ°ĐēŅ‚Đ¸Đ˛ĐŊĐ¸Ņ… ĐĩĐģĐĩĐŧĐĩĐŊŅ‚Ņ–Đ˛ Ņ‚Đ° Ņ„ĐžŅ€Đŧ С PDF" + }, + "certSign": { + "tags": "authenticate,PEM,P12,official,encrypt,sign,certificate,PKCS12,JKS,server,manual,auto", + "title": "ĐŸŅ–Đ´ĐŋĐ¸ŅĐ°Ņ‚Đ¸ ҁĐĩŅ€Ņ‚Đ¸Ņ„Ņ–ĐēĐ°Ņ‚ĐžĐŧ", + "desc": "ĐŸŅ–Đ´ĐŋĐ¸ŅĐ°Ņ‚Đ¸ PDF ҁĐĩŅ€Ņ‚Đ¸Ņ„Ņ–ĐēĐ°Ņ‚ĐžĐŧ/ĐēĐģŅŽŅ‡ĐĩĐŧ (PEM/P12)" + }, + "repair": { + "tags": "fix,restore", + "title": "Đ ĐĩĐŧĐžĐŊŅ‚", + "desc": "НаĐŧĐ°ĐŗĐ°Ņ”Ņ‚ŅŒŅŅ Đ˛Ņ–Đ´ĐŊĐžĐ˛Đ¸Ņ‚Đ¸ ĐŋĐžŅˆĐēОдĐļĐĩĐŊиК/СĐģаĐŧаĐŊиК PDF" + }, + "removeBlanks": { + "tags": "delete,clean,empty", + "title": "ВидаĐģĐ¸Ņ‚Đ¸ ĐŋĐžŅ€ĐžĐļĐŊŅ– ŅŅ‚ĐžŅ€Ņ–ĐŊĐēи", + "desc": "Đ’Đ¸ŅĐ˛ĐģŅŅ” Ņ‚Đ° видаĐģŅŅ” ĐŋĐžŅ€ĐžĐļĐŊŅ– ŅŅ‚ĐžŅ€Ņ–ĐŊĐēи С Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ°" + }, + "removeAnnotations": { + "tags": "delete,clean,strip", + "title": "ВидаĐģĐ¸Ņ‚Đ¸ аĐŊĐžŅ‚Đ°Ņ†Ņ–Ņ—", + "desc": "ВидаĐģŅŅ” Đ˛ŅŅ– ĐēĐžĐŧĐĩĐŊŅ‚Đ°Ņ€Ņ–/аĐŊĐžŅ‚Đ°Ņ†Ņ–Ņ— С PDF" + }, + "compare": { + "tags": "difference", + "title": "ĐŸĐžŅ€Ņ–Đ˛ĐŊŅĐŊĐŊŅ", + "desc": "ĐŸĐžŅ€Ņ–Đ˛ĐŊŅŽŅ” Ņ‚Đ° ĐŋĐžĐēĐ°ĐˇŅƒŅ” Ņ€Ņ–ĐˇĐŊĐ¸Ņ†ŅŽ ĐŧŅ–Đļ двОĐŧа PDF-Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ°Đŧи" + }, + "removeCertSign": { + "tags": "remove,delete,unlock", + "title": "ВидаĐģĐ¸Ņ‚Đ¸ ĐŋŅ–Đ´ĐŋĐ¸Ņ ҁĐĩŅ€Ņ‚Đ¸Ņ„Ņ–ĐēĐ°Ņ‚ĐžĐŧ", + "desc": "ВидаĐģĐ¸Ņ‚Đ¸ ĐŋŅ–Đ´ĐŋĐ¸Ņ ҁĐĩŅ€Ņ‚Đ¸Ņ„Ņ–ĐēĐ°Ņ‚ĐžĐŧ С PDF-Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Ņƒ" + }, + "pageLayout": { + "tags": "layout,arrange,combine", + "title": "Об'Ņ”Đ´ĐŊĐ°Ņ‚Đ¸ ŅŅ‚ĐžŅ€Ņ–ĐŊĐēи", + "desc": "Об'Ņ”Đ´ĐŊаĐŊĐŊŅ ĐēŅ–ĐģҌĐēĐžŅ… ŅŅ‚ĐžŅ€Ņ–ĐŊĐžĐē Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ° PDF в ОдĐŊ҃ ŅŅ‚ĐžŅ€Ņ–ĐŊĐē҃" + }, + "bookletImposition": { + "tags": "booklet,print,binding", + "title": "Booklet Imposition", + "desc": "Create booklets with proper page ordering and multi-page layout for printing and binding" + }, + "scalePages": { + "tags": "resize,adjust,scale", + "title": "ЗĐŧŅ–ĐŊĐ¸Ņ‚Đ¸ Ņ€ĐžĐˇĐŧŅ–Ņ€/ĐŧĐ°ŅŅˆŅ‚Đ°Đą ŅŅ‚ĐžŅ€Ņ–ĐŊĐēи", + "desc": "ЗĐŧŅ–ĐŊĐ¸Ņ‚Đ¸ Ņ€ĐžĐˇĐŧŅ–Ņ€/ĐŧĐ°ŅŅˆŅ‚Đ°Đą ŅŅ‚ĐžŅ€Ņ–ĐŊĐēи Ņ‚Đ°/айО Ņ—Ņ— вĐŧŅ–ŅŅ‚Ņƒ." + }, + "addPageNumbers": { + "tags": "number,pagination,count", + "title": "Đ”ĐžĐ´Đ°Ņ‚Đ¸ ĐŊĐžĐŧĐĩŅ€Đ° ŅŅ‚ĐžŅ€Ņ–ĐŊĐžĐē", + "desc": "Đ”ĐžĐ´Đ°Ņ” ĐŊĐžĐŧĐĩŅ€Đ° ŅŅ‚ĐžŅ€Ņ–ĐŊĐžĐē ĐŋĐž Đ˛ŅŅŒĐžĐŧ҃ Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Ņƒ в СадаĐŊĐžĐŧ҃ ĐŧҖҁ҆Җ" + }, + "autoRename": { + "tags": "auto-detect,header-based,organize,relabel", + "title": "Auto Rename PDF File", + "desc": "Auto renames a PDF file based on its detected header" + }, + "adjustContrast": { + "tags": "contrast,brightness,saturation", + "title": "НаĐģĐ°ŅˆŅ‚ŅƒĐ˛Đ°ĐŊĐŊŅ ĐēĐžĐģŅŒĐžŅ€Ņ–Đ˛/ĐēĐžĐŊŅ‚Ņ€Đ°ŅŅ‚ĐŊĐžŅŅ‚Ņ–", + "desc": "НаĐģĐ°ŅˆŅ‚ŅƒĐ˛Đ°ĐŊĐŊŅ ĐēĐžĐŊŅ‚Ņ€Đ°ŅŅ‚ĐŊĐžŅŅ‚Ņ–, ĐŊĐ°ŅĐ¸Ņ‡ĐĩĐŊĐžŅŅ‚Ņ– Ņ‚Đ° ŅŅĐēŅ€Đ°Đ˛ĐžŅŅ‚Ņ– Ņ„Đ°ĐšĐģ҃ PDF" + }, + "crop": { + "tags": "trim,cut,resize", + "title": "ĐžĐąŅ€Ņ–ĐˇĐ°Ņ‚Đ¸ PDF-Ņ„Đ°ĐšĐģ", + "desc": "ĐžĐąŅ€Ņ–ĐˇĐ°Ņ‚Đ¸ PDF-Ņ„Đ°ĐšĐģ, Ņ‰ĐžĐą СĐŧĐĩĐŊŅˆĐ¸Ņ‚Đ¸ ĐšĐžĐŗĐž Ņ€ĐžĐˇĐŧŅ–Ņ€ (Ņ‚ĐĩĐēҁ҂ СаĐģĐ¸ŅˆĐ°Ņ”Ņ‚ŅŒŅŅ!)" + }, + "autoSplitPDF": { + "tags": "auto,split,QR", + "title": "ĐĐ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐĩ Ņ€ĐžĐˇĐ´Ņ–ĐģĐĩĐŊĐŊŅ ŅŅ‚ĐžŅ€Ņ–ĐŊĐžĐē", + "desc": "ĐĐ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐĩ Ņ€ĐžĐˇĐ´Ņ–ĐģĐĩĐŊĐŊŅ Đ˛Ņ–Đ´ŅĐēаĐŊОваĐŊĐžĐŗĐž PDF-Ņ„Đ°ĐšĐģ҃ Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅŽ Ņ„Ņ–ĐˇĐ¸Ņ‡ĐŊĐžĐŗĐž Ņ€ĐžĐˇĐ´Ņ–ĐģҌĐŊиĐēа Đ˛Ņ–Đ´ŅĐēаĐŊОваĐŊĐ¸Ņ… ŅŅ‚ĐžŅ€Ņ–ĐŊĐžĐē QR-ĐēĐžĐ´Ņƒ" + }, + "sanitize": { + "tags": "clean,purge,remove", + "title": "Sanitise", + "desc": "Remove potentially harmful elements from PDF files" + }, + "getPdfInfo": { + "tags": "info,metadata,details", + "title": "ĐžŅ‚Ņ€Đ¸ĐŧĐ°Ņ‚Đ¸ ВСЮ Ņ–ĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–ŅŽ ҃ Ņ„ĐžŅ€ĐŧĐ°Ņ‚Ņ– PDF", + "desc": "Đ—ĐąĐ¸Ņ€Đ°Ņ” ĐąŅƒĐ´ŅŒ-ŅĐē҃ ĐŧĐžĐļĐģĐ¸Đ˛Ņƒ Ņ–ĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–ŅŽ ҃ PDF-Ņ„Đ°ĐšĐģĐ°Ņ…." + }, + "pdfToSinglePage": { + "tags": "combine,merge,single", + "title": "PDF ĐŊа ОдĐŊ҃ вĐĩĐģиĐē҃ ŅŅ‚ĐžŅ€Ņ–ĐŊĐē҃", + "desc": "Об'Ņ”Đ´ĐŊŅƒŅ” Đ˛ŅŅ– ŅŅ‚ĐžŅ€Ņ–ĐŊĐēи PDF в ОдĐŊ҃ вĐĩĐģиĐē҃ ŅŅ‚ĐžŅ€Ņ–ĐŊĐē҃." + }, + "showJS": { + "tags": "javascript,code,script", + "title": "ПоĐēĐ°ĐˇĐ°Ņ‚Đ¸ JavaScript", + "desc": "Đ¨ŅƒĐēĐ°Ņ” Ņ‚Đ° Đ˛Ņ–Đ´ĐžĐąŅ€Đ°ĐļĐ°Ņ” ĐąŅƒĐ´ŅŒ-ŅĐēиК JS, Đ˛ĐąŅƒĐ´ĐžĐ˛Đ°ĐŊиК ҃ PDF-Ņ„Đ°ĐšĐģ." + }, + "redact": { + "tags": "censor,blackout,hide", + "title": "Đ ŅƒŅ‡ĐŊĐĩ Ņ€ĐĩĐ´Đ°ĐŗŅƒĐ˛Đ°ĐŊĐŊŅ", + "desc": "Đ ĐĩĐ´Đ°ĐŗŅƒŅ” PDF-Ņ„Đ°ĐšĐģ ĐŊа ĐžŅĐŊĐžĐ˛Ņ– Đ˛Đ¸Đ´Ņ–ĐģĐĩĐŊĐžĐŗĐž Ņ‚ĐĩĐēŅŅ‚Ņƒ, ĐŊаĐŧаĐģŅŒĐžĐ˛Đ°ĐŊĐ¸Ņ… Ņ„ĐžŅ€Đŧ Ņ–/айО Đ˛Đ¸ĐąŅ€Đ°ĐŊĐ¸Ņ… ŅŅ‚ĐžŅ€Ņ–ĐŊĐžĐē" + }, + "splitBySections": { + "tags": "split,sections,divide", + "title": "Split PDF by Sections", + "desc": "Divide each page of a PDF into smaller horizontal and vertical sections" + }, + "addStamp": { + "tags": "stamp,mark,seal", + "title": "Add Stamp to PDF", + "desc": "Add text or add image stamps at set locations" + }, + "removeImage": { + "tags": "remove,delete,clean", + "title": "ВидаĐģĐ¸Ņ‚Đ¸ ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊĐŊŅ", + "desc": "ВидаĐģŅŅ” ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊĐŊŅ С PDF Đ´ĐģŅ СĐŧĐĩĐŊ҈ĐĩĐŊĐŊŅ Ņ€ĐžĐˇĐŧŅ–Ņ€Ņƒ Ņ„Đ°ĐšĐģ҃" + }, + "splitByChapters": { + "tags": "split,chapters,structure", + "title": "Đ ĐžĐˇĐ´Ņ–ĐģĐ¸Ņ‚Đ¸ PDF Са Ņ€ĐžĐˇĐ´Ņ–ĐģаĐŧи", + "desc": "Đ ĐžĐˇĐ´Ņ–ĐģŅŅ” PDF ĐŊа ĐēŅ–ĐģҌĐēа Ņ„Đ°ĐšĐģŅ–Đ˛ ĐŊа ĐžŅĐŊĐžĐ˛Ņ– ŅŅ‚Ņ€ŅƒĐēŅ‚ŅƒŅ€Đ¸ ĐšĐžĐŗĐž Ņ€ĐžĐˇĐ´Ņ–ĐģŅ–Đ˛" + }, + "validateSignature": { + "tags": "validate,verify,certificate", + "title": "ПĐĩŅ€ĐĩĐ˛Ņ–Ņ€Đēа ĐŋŅ–Đ´ĐŋĐ¸ŅŅƒ PDF", + "desc": "ПĐĩŅ€ĐĩĐ˛Ņ–Ņ€Đēа Ņ†Đ¸Ņ„Ņ€ĐžĐ˛Đ¸Ņ… ĐŋŅ–Đ´ĐŋĐ¸ŅŅ–Đ˛ Ņ‚Đ° ҁĐĩŅ€Ņ‚Đ¸Ņ„Ņ–ĐēĐ°Ņ‚Ņ–Đ˛ ҃ PDF-Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ°Ņ…" + }, + "swagger": { + "tags": "API,documentation,test", + "title": "API Documentation", + "desc": "View API documentation and test endpoints" + }, + "scannerEffect": { + "tags": "scan,simulate,create", + "title": "Scanner Effect", + "desc": "Create a PDF that looks like it was scanned" + }, + "editTableOfContents": { + "tags": "bookmarks,contents,edit", + "title": "Edit Table of Contents", + "desc": "Add or edit bookmarks and table of contents in PDF documents" + }, + "manageCertificates": { + "tags": "certificates,import,export", + "title": "Manage Certificates", + "desc": "Import, export, or delete digital certificate files used for signing PDFs." + }, + "read": { + "tags": "view,open,display", + "title": "Read", + "desc": "View and annotate PDFs. Highlight text, draw, or insert comments for review and collaboration." + }, + "reorganizePages": { + "tags": "rearrange,reorder,organize", + "title": "Reorganize Pages", + "desc": "Rearrange, duplicate, or delete PDF pages with visual drag-and-drop control." + }, + "extractPages": { + "tags": "pull,select,copy", + "title": "Đ’Đ¸Đ´ĐžĐąŅƒŅ‚Đ¸ ŅŅ‚ĐžŅ€Ņ–ĐŊĐēи", + "desc": "Extract specific pages from a PDF document" + }, + "removePages": { + "tags": "delete,extract,exclude", + "title": "ВидаĐģĐĩĐŊĐŊŅ", + "desc": "ВидаĐģŅ–Ņ‚ŅŒ ĐŊĐĩĐŋĐžŅ‚Ņ€Ņ–ĐąĐŊŅ– ŅŅ‚ĐžŅ€Ņ–ĐŊĐēи С Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ° PDF." + }, + "autoSizeSplitPDF": { + "tags": "auto,split,size", + "title": "ĐĐ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐĩ Ņ€ĐžĐˇĐ´Ņ–ĐģĐĩĐŊĐŊŅ Са Ņ€ĐžĐˇĐŧŅ–Ņ€ĐžĐŧ/ĐēŅ–ĐģҌĐēŅ–ŅŅ‚ŅŽ", + "desc": "Đ ĐžĐˇĐ´Ņ–ĐģŅŅ” ОдиĐŊ PDF ĐŊа ĐēŅ–ĐģҌĐēа Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Ņ–Đ˛ ĐŊа ĐžŅĐŊĐžĐ˛Ņ– Ņ€ĐžĐˇĐŧŅ–Ņ€Ņƒ, ĐēŅ–ĐģҌĐēĐžŅŅ‚Ņ– ŅŅ‚ĐžŅ€Ņ–ĐŊĐžĐē айО ĐēŅ–ĐģҌĐēĐžŅŅ‚Ņ– Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Ņ–Đ˛" + }, + "replaceColor": { + "title": "Replace & Invert Colour", + "desc": "Replace or invert colours in PDF documents" + }, + "devApi": { + "tags": "API,development,documentation", + "title": "API", + "desc": "Link to API documentation" + }, + "devFolderScanning": { + "tags": "automation,folder,scanning", + "title": "Automated Folder Scanning", + "desc": "Link to automated folder scanning guide" + }, + "devSsoGuide": { + "title": "SSO Guide", + "desc": "Link to SSO guide" + }, + "devAirgapped": { + "title": "Air-gapped Setup", + "desc": "Link to air-gapped setup guide" + }, + "addPassword": { + "title": "Đ”ĐžĐ´Đ°Ņ‚Đ¸ ĐŋĐ°Ņ€ĐžĐģҌ", + "desc": "Đ—Đ°ŅˆĐ¸Ņ„Ņ€ŅƒĐšŅ‚Đĩ Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚ PDF ĐŋĐ°Ņ€ĐžĐģĐĩĐŧ." + }, + "changePermissions": { + "title": "ЗĐŧŅ–ĐŊĐ¸Ņ‚Đ¸ дОСвОĐģи", + "desc": "Change document restrictions and permissions" + }, + "automate": { + "tags": "workflow,sequence,automation", + "title": "Automate", + "desc": "Build multi-step workflows by chaining together PDF actions. Ideal for recurring tasks." + }, + "overlay-pdfs": { + "desc": "НаĐēĐģадĐĩĐŊĐŊŅ ОдĐŊĐžĐŗĐž PDF ĐŋОвĐĩҀ҅ Ņ–ĐŊŅˆĐžĐŗĐž PDF", + "title": "НаĐēĐģадĐĩĐŊĐŊŅ PDF" + }, "imageToPDF": { "title": "Đ—ĐžĐąŅ€Đ°ĐļĐĩĐŊĐŊŅ в PDF", "desc": "ПĐĩŅ€ĐĩŅ‚Đ˛ĐžŅ€ĐĩĐŊĐŊŅ ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊĐŊŅ (PNG, JPEG, GIF) в PDF." @@ -355,18 +786,6 @@ "title": "PDF в ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊĐŊŅ", "desc": "ПĐĩŅ€ĐĩŅ‚Đ˛ĐžŅ€ĐĩĐŊĐŊŅ PDF в ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊĐŊŅ. (PNG, JPEG, GIF)" }, - "pdfOrganiser": { - "title": "Đ ĐĩĐžŅ€ĐŗĐ°ĐŊŅ–ĐˇĐ°Ņ†Ņ–Ņ", - "desc": "ВидаĐģĐĩĐŊĐŊŅ/ĐŋĐĩŅ€ĐĩŅŅ‚Đ°ĐŊОвĐēа ŅŅ‚ĐžŅ€Ņ–ĐŊĐžĐē ҃ ĐąŅƒĐ´ŅŒ-ŅĐēĐžĐŧ҃ ĐŋĐžŅ€ŅĐ´Đē҃" - }, - "addImage": { - "title": "Đ”ĐžĐ´Đ°Ņ‚Đ¸ ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊĐŊŅ", - "desc": "Đ”ĐžĐ´Đ°Ņ” ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊĐŊŅ ҃ вĐēаСаĐŊĐĩ ĐŧҖҁ҆Đĩ в PDF (в Ņ€ĐžĐˇŅ€ĐžĐąŅ†Ņ–)" - }, - "watermark": { - "title": "Đ”ĐžĐ´Đ°Ņ‚Đ¸ Đ˛ĐžĐ´ŅĐŊиК СĐŊаĐē", - "desc": "Đ”ĐžĐ´Đ°ĐšŅ‚Đĩ ŅĐ˛Ņ–Đš Đ˛ĐžĐ´ŅĐŊиК СĐŊаĐē Đ´Đž Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ° PDF." - }, "permissions": { "title": "ЗĐŧŅ–ĐŊĐ¸Ņ‚Đ¸ дОСвОĐģи", "desc": "ЗĐŧŅ–ĐŊŅ–Ņ‚ŅŒ дОСвОĐģи Đ˛Đ°ŅˆĐžĐŗĐž Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ° PDF" @@ -375,38 +794,10 @@ "title": "ВидаĐģĐĩĐŊĐŊŅ", "desc": "ВидаĐģŅ–Ņ‚ŅŒ ĐŊĐĩĐŋĐžŅ‚Ņ€Ņ–ĐąĐŊŅ– ŅŅ‚ĐžŅ€Ņ–ĐŊĐēи С Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ° PDF." }, - "addPassword": { - "title": "Đ”ĐžĐ´Đ°Ņ‚Đ¸ ĐŋĐ°Ņ€ĐžĐģҌ", - "desc": "Đ—Đ°ŅˆĐ¸Ņ„Ņ€ŅƒĐšŅ‚Đĩ Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚ PDF ĐŋĐ°Ņ€ĐžĐģĐĩĐŧ." - }, - "removePassword": { - "title": "ВидаĐģĐ¸Ņ‚Đ¸ ĐŋĐ°Ņ€ĐžĐģҌ", - "desc": "ЗĐŊŅ–ĐŧŅ–Ņ‚ŅŒ ĐˇĐ°Ņ…Đ¸ŅŅ‚ ĐŋĐ°Ņ€ĐžĐģĐĩĐŧ С Đ˛Đ°ŅˆĐžĐŗĐž Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ° PDF." - }, - "compress": { - "title": "ĐĄŅ‚Đ¸ŅĐŊŅƒŅ‚Đ¸", - "desc": "ĐĄŅ‚Đ¸ŅĐēĐ°ĐšŅ‚Đĩ PDF-Ņ„Đ°ĐšĐģи, Ņ‰ĐžĐą СĐŧĐĩĐŊŅˆĐ¸Ņ‚Đ¸ Ņ—Ņ… Ņ€ĐžĐˇĐŧŅ–Ņ€." - }, - "unlockPDFForms": { - "title": "Unlock PDF Forms", - "desc": "Remove read-only property of form fields in a PDF document." - }, - "changeMetadata": { - "title": "ЗĐŧŅ–ĐŊĐ¸Ņ‚Đ¸ ĐŧĐĩŅ‚Đ°Đ´Đ°ĐŊŅ–", - "desc": "ЗĐŧŅ–ĐŊĐ¸Ņ‚Đ¸/видаĐģĐ¸Ņ‚Đ¸/Đ´ĐžĐ´Đ°Ņ‚Đ¸ ĐŧĐĩŅ‚Đ°Đ´Đ°ĐŊŅ– С Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ° PDF" - }, "fileToPDF": { "title": "КоĐŊвĐĩŅ€Ņ‚ŅƒĐ˛Đ°Ņ‚Đ¸ Ņ„Đ°ĐšĐģ в PDF", "desc": "КоĐŊвĐĩŅ€Ņ‚ŅƒĐšŅ‚Đĩ ĐŧаКĐļĐĩ ĐąŅƒĐ´ŅŒ-ŅĐēиК Ņ„Đ°ĐšĐģ в PDF (DOCX, PNG, XLS, PPT, TXT Ņ‚Đ° Ņ–ĐŊŅˆŅ–)" }, - "ocr": { - "title": "OCR/ĐžŅ‡Đ¸Ņ‰ĐĩĐŊĐŊŅ ҁĐēаĐŊŅƒĐ˛Đ°ĐŊĐŊŅ", - "desc": "ĐžŅ‡Đ¸Ņ‰ĐĩĐŊĐŊŅ ҁĐēаĐŊŅƒĐ˛Đ°ĐŊĐŊŅ Ņ‚Đ° Đ˛Đ¸ŅĐ˛ĐģĐĩĐŊĐŊŅ Ņ‚ĐĩĐēŅŅ‚Ņƒ ĐŊа ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊĐŊŅŅ… ҃ Ņ„Đ°ĐšĐģŅ– PDF Ņ‚Đ° ĐŋĐžĐ˛Ņ‚ĐžŅ€ĐŊĐĩ дОдаваĐŊĐŊŅ ĐšĐžĐŗĐž ŅĐē Ņ‚ĐĩĐēҁ҂." - }, - "extractImages": { - "title": "Đ’Đ¸Ņ‚ŅĐŗĐŊŅƒŅ‚Đ¸ ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊĐŊŅ", - "desc": "Đ’Đ¸Ņ‚ŅĐŗŅƒŅ” Đ˛ŅŅ– ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊĐŊŅ С PDF Ņ– СйĐĩŅ€Ņ–ĐŗĐ°Ņ” Ņ—Ņ… ҃ zip" - }, "pdfToPDFA": { "title": "PDF в PDF/A", "desc": "ПĐĩŅ€ĐĩŅ‚Đ˛ĐžŅ€ĐĩĐŊĐŊŅ PDF в PDF/A Đ´ĐģŅ Đ´ĐžĐ˛ĐŗĐžŅ‚Ņ€Đ¸Đ˛Đ°ĐģĐžĐŗĐž СйĐĩŅ€Ņ–ĐŗĐ°ĐŊĐŊŅ" @@ -435,70 +826,14 @@ "title": "Đ’Đ¸ŅĐ˛ĐģĐĩĐŊĐŊŅ/Ņ€ĐžĐˇĐ´Ņ–ĐģĐĩĐŊĐŊŅ Đ˛Ņ–Đ´ŅĐēаĐŊОваĐŊĐ¸Ņ… Ņ„ĐžŅ‚ĐžĐŗŅ€Đ°Ņ„Ņ–Đš", "desc": "Đ ĐžĐˇĐ´Ņ–ĐģŅŅ” ĐēŅ–ĐģҌĐēа Ņ„ĐžŅ‚ĐžĐŗŅ€Đ°Ņ„Ņ–Đš С Ņ„ĐžŅ‚Đž/PDF" }, - "sign": { - "title": "ĐŸŅ–Đ´ĐŋĐ¸Ņ", - "desc": "Đ”ĐžĐ´Đ°Ņ” ĐŋŅ–Đ´ĐŋĐ¸Ņ Đ´Đž PDF Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅŽ ĐŧаĐģŅŽĐŊĐēа, Ņ‚ĐĩĐēŅŅ‚Ņƒ айО ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊĐŊŅ" - }, - "flatten": { - "title": "ЗĐŊĐĩаĐēŅ‚Đ¸Đ˛ŅƒĐ˛Đ°ĐŊĐŊŅ", - "desc": "ВидаĐģĐĩĐŊĐŊŅ Đ˛ŅŅ–Ņ… Ņ–ĐŊŅ‚ĐĩŅ€Đ°ĐēŅ‚Đ¸Đ˛ĐŊĐ¸Ņ… ĐĩĐģĐĩĐŧĐĩĐŊŅ‚Ņ–Đ˛ Ņ‚Đ° Ņ„ĐžŅ€Đŧ С PDF" - }, - "repair": { - "title": "Đ ĐĩĐŧĐžĐŊŅ‚", - "desc": "НаĐŧĐ°ĐŗĐ°Ņ”Ņ‚ŅŒŅŅ Đ˛Ņ–Đ´ĐŊĐžĐ˛Đ¸Ņ‚Đ¸ ĐŋĐžŅˆĐēОдĐļĐĩĐŊиК/СĐģаĐŧаĐŊиК PDF" - }, - "removeBlanks": { - "title": "ВидаĐģĐ¸Ņ‚Đ¸ ĐŋĐžŅ€ĐžĐļĐŊŅ– ŅŅ‚ĐžŅ€Ņ–ĐŊĐēи", - "desc": "Đ’Đ¸ŅĐ˛ĐģŅŅ” Ņ‚Đ° видаĐģŅŅ” ĐŋĐžŅ€ĐžĐļĐŊŅ– ŅŅ‚ĐžŅ€Ņ–ĐŊĐēи С Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ°" - }, - "removeAnnotations": { - "title": "ВидаĐģĐ¸Ņ‚Đ¸ аĐŊĐžŅ‚Đ°Ņ†Ņ–Ņ—", - "desc": "ВидаĐģŅŅ” Đ˛ŅŅ– ĐēĐžĐŧĐĩĐŊŅ‚Đ°Ņ€Ņ–/аĐŊĐžŅ‚Đ°Ņ†Ņ–Ņ— С PDF" - }, - "compare": { - "title": "ĐŸĐžŅ€Ņ–Đ˛ĐŊŅĐŊĐŊŅ", - "desc": "ĐŸĐžŅ€Ņ–Đ˛ĐŊŅŽŅ” Ņ‚Đ° ĐŋĐžĐēĐ°ĐˇŅƒŅ” Ņ€Ņ–ĐˇĐŊĐ¸Ņ†ŅŽ ĐŧŅ–Đļ двОĐŧа PDF-Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ°Đŧи" - }, - "certSign": { - "title": "ĐŸŅ–Đ´ĐŋĐ¸ŅĐ°Ņ‚Đ¸ ҁĐĩŅ€Ņ‚Đ¸Ņ„Ņ–ĐēĐ°Ņ‚ĐžĐŧ", - "desc": "ĐŸŅ–Đ´ĐŋĐ¸ŅĐ°Ņ‚Đ¸ PDF ҁĐĩŅ€Ņ‚Đ¸Ņ„Ņ–ĐēĐ°Ņ‚ĐžĐŧ/ĐēĐģŅŽŅ‡ĐĩĐŧ (PEM/P12)" - }, - "removeCertSign": { - "title": "ВидаĐģĐ¸Ņ‚Đ¸ ĐŋŅ–Đ´ĐŋĐ¸Ņ ҁĐĩŅ€Ņ‚Đ¸Ņ„Ņ–ĐēĐ°Ņ‚ĐžĐŧ", - "desc": "ВидаĐģĐ¸Ņ‚Đ¸ ĐŋŅ–Đ´ĐŋĐ¸Ņ ҁĐĩŅ€Ņ‚Đ¸Ņ„Ņ–ĐēĐ°Ņ‚ĐžĐŧ С PDF-Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Ņƒ" - }, - "pageLayout": { - "title": "Об'Ņ”Đ´ĐŊĐ°Ņ‚Đ¸ ŅŅ‚ĐžŅ€Ņ–ĐŊĐēи", - "desc": "Об'Ņ”Đ´ĐŊаĐŊĐŊŅ ĐēŅ–ĐģҌĐēĐžŅ… ŅŅ‚ĐžŅ€Ņ–ĐŊĐžĐē Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ° PDF в ОдĐŊ҃ ŅŅ‚ĐžŅ€Ņ–ĐŊĐē҃" - }, - "scalePages": { - "title": "ЗĐŧŅ–ĐŊĐ¸Ņ‚Đ¸ Ņ€ĐžĐˇĐŧŅ–Ņ€/ĐŧĐ°ŅŅˆŅ‚Đ°Đą ŅŅ‚ĐžŅ€Ņ–ĐŊĐēи", - "desc": "ЗĐŧŅ–ĐŊĐ¸Ņ‚Đ¸ Ņ€ĐžĐˇĐŧŅ–Ņ€/ĐŧĐ°ŅŅˆŅ‚Đ°Đą ŅŅ‚ĐžŅ€Ņ–ĐŊĐēи Ņ‚Đ°/айО Ņ—Ņ— вĐŧŅ–ŅŅ‚Ņƒ." - }, "pipeline": { "title": "КоĐŊвĐĩҔҀ (Ņ€ĐžĐˇŅˆĐ¸Ņ€ĐĩĐŊиК)", "desc": "ВиĐēĐžĐŊŅƒĐšŅ‚Đĩ ĐēŅ–ĐģҌĐēа Đ´Ņ–Đš С PDF-Ņ„Đ°ĐšĐģаĐŧи, виСĐŊĐ°Ņ‡Đ°ŅŽŅ‡Đ¸ ҁ҆ĐĩĐŊĐ°Ņ€Ņ–Ņ— ĐēĐžĐŊвĐĩҔҀĐŊĐžŅ— ĐžĐąŅ€ĐžĐąĐēи." }, - "addPageNumbers": { - "title": "Đ”ĐžĐ´Đ°Ņ‚Đ¸ ĐŊĐžĐŧĐĩŅ€Đ° ŅŅ‚ĐžŅ€Ņ–ĐŊĐžĐē", - "desc": "Đ”ĐžĐ´Đ°Ņ” ĐŊĐžĐŧĐĩŅ€Đ° ŅŅ‚ĐžŅ€Ņ–ĐŊĐžĐē ĐŋĐž Đ˛ŅŅŒĐžĐŧ҃ Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Ņƒ в СадаĐŊĐžĐŧ҃ ĐŧҖҁ҆Җ" - }, "auto-rename": { "title": "ĐĐ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐĩ ĐŋĐĩŅ€ĐĩĐšĐŧĐĩĐŊŅƒĐ˛Đ°ĐŊĐŊŅ PDF-Ņ„Đ°ĐšĐģ҃", "desc": "ĐĐ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐĩ ĐŋĐĩŅ€ĐĩĐšĐŧĐĩĐŊŅƒĐ˛Đ°ĐŊĐŊŅ Ņ„Đ°ĐšĐģ҃ PDF ĐŊа ĐžŅĐŊĐžĐ˛Ņ– ĐšĐžĐŗĐž Đ˛Đ¸ŅĐ˛ĐģĐĩĐŊĐžĐŗĐž ĐˇĐ°ĐŗĐžĐģОвĐē҃" }, - "adjustContrast": { - "title": "НаĐģĐ°ŅˆŅ‚ŅƒĐ˛Đ°ĐŊĐŊŅ ĐēĐžĐģŅŒĐžŅ€Ņ–Đ˛/ĐēĐžĐŊŅ‚Ņ€Đ°ŅŅ‚ĐŊĐžŅŅ‚Ņ–", - "desc": "НаĐģĐ°ŅˆŅ‚ŅƒĐ˛Đ°ĐŊĐŊŅ ĐēĐžĐŊŅ‚Ņ€Đ°ŅŅ‚ĐŊĐžŅŅ‚Ņ–, ĐŊĐ°ŅĐ¸Ņ‡ĐĩĐŊĐžŅŅ‚Ņ– Ņ‚Đ° ŅŅĐēŅ€Đ°Đ˛ĐžŅŅ‚Ņ– Ņ„Đ°ĐšĐģ҃ PDF" - }, - "crop": { - "title": "ĐžĐąŅ€Ņ–ĐˇĐ°Ņ‚Đ¸ PDF-Ņ„Đ°ĐšĐģ", - "desc": "ĐžĐąŅ€Ņ–ĐˇĐ°Ņ‚Đ¸ PDF-Ņ„Đ°ĐšĐģ, Ņ‰ĐžĐą СĐŧĐĩĐŊŅˆĐ¸Ņ‚Đ¸ ĐšĐžĐŗĐž Ņ€ĐžĐˇĐŧŅ–Ņ€ (Ņ‚ĐĩĐēҁ҂ СаĐģĐ¸ŅˆĐ°Ņ”Ņ‚ŅŒŅŅ!)" - }, - "autoSplitPDF": { - "title": "ĐĐ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐĩ Ņ€ĐžĐˇĐ´Ņ–ĐģĐĩĐŊĐŊŅ ŅŅ‚ĐžŅ€Ņ–ĐŊĐžĐē", - "desc": "ĐĐ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐĩ Ņ€ĐžĐˇĐ´Ņ–ĐģĐĩĐŊĐŊŅ Đ˛Ņ–Đ´ŅĐēаĐŊОваĐŊĐžĐŗĐž PDF-Ņ„Đ°ĐšĐģ҃ Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅŽ Ņ„Ņ–ĐˇĐ¸Ņ‡ĐŊĐžĐŗĐž Ņ€ĐžĐˇĐ´Ņ–ĐģҌĐŊиĐēа Đ˛Ņ–Đ´ŅĐēаĐŊОваĐŊĐ¸Ņ… ŅŅ‚ĐžŅ€Ņ–ĐŊĐžĐē QR-ĐēĐžĐ´Ņƒ" - }, "sanitizePDF": { "title": "ХаĐŊŅ–Ņ‚Đ°Ņ€ĐŊа ĐžĐąŅ€ĐžĐąĐēа", "desc": "ВидаĐģĐĩĐŊĐŊŅ ҁĐēŅ€Đ¸ĐŋŅ‚Ņ–Đ˛ Ņ‚Đ° Ņ–ĐŊŅˆĐ¸Ņ… ĐĩĐģĐĩĐŧĐĩĐŊŅ‚Ņ–Đ˛ С PDF-Ņ„Đ°ĐšĐģŅ–Đ˛" @@ -519,30 +854,14 @@ "title": "PDF в Markdown", "desc": "КоĐŊвĐĩŅ€Ņ‚ŅƒŅ” ĐąŅƒĐ´ŅŒ-ŅĐēиК Ņ„Đ°ĐšĐģ PDF ҃ Markdown" }, - "getPdfInfo": { - "title": "ĐžŅ‚Ņ€Đ¸ĐŧĐ°Ņ‚Đ¸ ВСЮ Ņ–ĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–ŅŽ ҃ Ņ„ĐžŅ€ĐŧĐ°Ņ‚Ņ– PDF", - "desc": "Đ—ĐąĐ¸Ņ€Đ°Ņ” ĐąŅƒĐ´ŅŒ-ŅĐē҃ ĐŧĐžĐļĐģĐ¸Đ˛Ņƒ Ņ–ĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–ŅŽ ҃ PDF-Ņ„Đ°ĐšĐģĐ°Ņ…." - }, "pageExtracter": { "title": "Đ’Đ¸Đ´ĐžĐąŅƒŅ‚Đ¸ ŅŅ‚ĐžŅ€Ņ–ĐŊĐē҃(и)", "desc": "Đ’Đ¸Đ´ĐžĐąŅƒĐ˛Đ°Ņ” ĐžĐąŅ€Đ°ĐŊŅ– ŅŅ‚ĐžŅ€Ņ–ĐŊĐēи С PDF" }, - "pdfToSinglePage": { - "title": "PDF ĐŊа ОдĐŊ҃ вĐĩĐģиĐē҃ ŅŅ‚ĐžŅ€Ņ–ĐŊĐē҃", - "desc": "Об'Ņ”Đ´ĐŊŅƒŅ” Đ˛ŅŅ– ŅŅ‚ĐžŅ€Ņ–ĐŊĐēи PDF в ОдĐŊ҃ вĐĩĐģиĐē҃ ŅŅ‚ĐžŅ€Ņ–ĐŊĐē҃." - }, - "showJS": { - "title": "ПоĐēĐ°ĐˇĐ°Ņ‚Đ¸ JavaScript", - "desc": "Đ¨ŅƒĐēĐ°Ņ” Ņ‚Đ° Đ˛Ņ–Đ´ĐžĐąŅ€Đ°ĐļĐ°Ņ” ĐąŅƒĐ´ŅŒ-ŅĐēиК JS, Đ˛ĐąŅƒĐ´ĐžĐ˛Đ°ĐŊиК ҃ PDF-Ņ„Đ°ĐšĐģ." - }, "autoRedact": { "title": "ĐĐ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐĩ Ņ€ĐĩĐ´Đ°ĐŗŅƒĐ˛Đ°ĐŊĐŊŅ", "desc": "ĐĐ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐĩ ĐˇĐ°Ņ‚ĐĩĐŧĐŊĐĩĐŊĐŊŅ (Ņ‡ĐžŅ€ĐŊŅ–ĐŊĐŊŅ) Ņ‚ĐĩĐēŅŅ‚Ņƒ в PDF ĐŊа ĐžŅĐŊĐžĐ˛Ņ– Đ˛Ņ…Ņ–Đ´ĐŊĐžĐŗĐž Ņ‚ĐĩĐēŅŅ‚Ņƒ" }, - "redact": { - "title": "Đ ŅƒŅ‡ĐŊĐĩ Ņ€ĐĩĐ´Đ°ĐŗŅƒĐ˛Đ°ĐŊĐŊŅ", - "desc": "Đ ĐĩĐ´Đ°ĐŗŅƒŅ” PDF-Ņ„Đ°ĐšĐģ ĐŊа ĐžŅĐŊĐžĐ˛Ņ– Đ˛Đ¸Đ´Ņ–ĐģĐĩĐŊĐžĐŗĐž Ņ‚ĐĩĐēŅŅ‚Ņƒ, ĐŊаĐŧаĐģŅŒĐžĐ˛Đ°ĐŊĐ¸Ņ… Ņ„ĐžŅ€Đŧ Ņ–/айО Đ˛Đ¸ĐąŅ€Đ°ĐŊĐ¸Ņ… ŅŅ‚ĐžŅ€Ņ–ĐŊĐžĐē" - }, "PDFToCSV": { "title": "PDF в CSV", "desc": "Đ’Đ¸Đ´ĐžĐąŅƒĐ˛Đ°Ņ” Ņ‚Đ°ĐąĐģĐ¸Ņ†Ņ– С PDF Ņ‚Đ° ĐŋĐĩŅ€ĐĩŅ‚Đ˛ĐžŅ€ŅŽŅ” Ņ—Ņ… ҃ CSV" @@ -551,10 +870,6 @@ "title": "ĐĐ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐĩ Ņ€ĐžĐˇĐ´Ņ–ĐģĐĩĐŊĐŊŅ Са Ņ€ĐžĐˇĐŧŅ–Ņ€ĐžĐŧ/ĐēŅ–ĐģҌĐēŅ–ŅŅ‚ŅŽ", "desc": "Đ ĐžĐˇĐ´Ņ–ĐģŅŅ” ОдиĐŊ PDF ĐŊа ĐēŅ–ĐģҌĐēа Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Ņ–Đ˛ ĐŊа ĐžŅĐŊĐžĐ˛Ņ– Ņ€ĐžĐˇĐŧŅ–Ņ€Ņƒ, ĐēŅ–ĐģҌĐēĐžŅŅ‚Ņ– ŅŅ‚ĐžŅ€Ņ–ĐŊĐžĐē айО ĐēŅ–ĐģҌĐēĐžŅŅ‚Ņ– Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Ņ–Đ˛" }, - "overlay-pdfs": { - "title": "НаĐēĐģадĐĩĐŊĐŊŅ PDF", - "desc": "НаĐēĐģадĐĩĐŊĐŊŅ ОдĐŊĐžĐŗĐž PDF ĐŋОвĐĩҀ҅ Ņ–ĐŊŅˆĐžĐŗĐž PDF" - }, "split-by-sections": { "title": "Đ ĐžĐˇĐ´Ņ–ĐģĐĩĐŊĐŊŅ PDF Са ҁĐĩĐēŅ†Ņ–ŅĐŧи", "desc": "Đ ĐžĐˇĐ´Ņ–ĐģĐĩĐŊĐŊŅ ĐēĐžĐļĐŊĐžŅ— ŅŅ‚ĐžŅ€Ņ–ĐŊĐēи PDF ĐŊа ĐŧĐĩĐŊŅˆŅ– ĐŗĐžŅ€Đ¸ĐˇĐžĐŊŅ‚Đ°ĐģҌĐŊŅ– Ņ‚Đ° вĐĩŅ€Ņ‚Đ¸ĐēаĐģҌĐŊŅ– ҁĐĩĐē҆Җҗ" @@ -563,43 +878,17 @@ "title": "Đ”ĐžĐ´Đ°Ņ‚Đ¸ ĐŋĐĩŅ‡Đ°Ņ‚Đē҃ ĐŊа PDF", "desc": "ДодаваĐŊĐŊŅ Ņ‚ĐĩĐēŅŅ‚ĐžĐ˛ĐžŅ— айО ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊĐŊŅ ĐŋĐĩŅ‡Đ°Ņ‚Đēи ҃ вĐēаСаĐŊŅ– ĐŧŅ–ŅŅ†Ņ" }, - "removeImage": { - "title": "ВидаĐģĐ¸Ņ‚Đ¸ ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊĐŊŅ", - "desc": "ВидаĐģŅŅ” ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊĐŊŅ С PDF Đ´ĐģŅ СĐŧĐĩĐŊ҈ĐĩĐŊĐŊŅ Ņ€ĐžĐˇĐŧŅ–Ņ€Ņƒ Ņ„Đ°ĐšĐģ҃" - }, - "splitByChapters": { - "title": "Đ ĐžĐˇĐ´Ņ–ĐģĐ¸Ņ‚Đ¸ PDF Са Ņ€ĐžĐˇĐ´Ņ–ĐģаĐŧи", - "desc": "Đ ĐžĐˇĐ´Ņ–ĐģŅŅ” PDF ĐŊа ĐēŅ–ĐģҌĐēа Ņ„Đ°ĐšĐģŅ–Đ˛ ĐŊа ĐžŅĐŊĐžĐ˛Ņ– ŅŅ‚Ņ€ŅƒĐēŅ‚ŅƒŅ€Đ¸ ĐšĐžĐŗĐž Ņ€ĐžĐˇĐ´Ņ–ĐģŅ–Đ˛" - }, - "validateSignature": { - "title": "ПĐĩŅ€ĐĩĐ˛Ņ–Ņ€Đēа ĐŋŅ–Đ´ĐŋĐ¸ŅŅƒ PDF", - "desc": "ПĐĩŅ€ĐĩĐ˛Ņ–Ņ€Đēа Ņ†Đ¸Ņ„Ņ€ĐžĐ˛Đ¸Ņ… ĐŋŅ–Đ´ĐŋĐ¸ŅŅ–Đ˛ Ņ‚Đ° ҁĐĩŅ€Ņ‚Đ¸Ņ„Ņ–ĐēĐ°Ņ‚Ņ–Đ˛ ҃ PDF-Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ°Ņ…" - }, "replace-color": { "title": "ЗаĐŧŅ–ĐŊа Ņ‚Đ° Ņ–ĐŊвĐĩŅ€ŅŅ–Ņ ĐēĐžĐģŅŒĐžŅ€Ņƒ", "desc": "ЗаĐŧŅ–ĐŊŅŽŅ” ĐēĐžĐģŅ–Ņ€ Ņ‚ĐĩĐēŅŅ‚Ņƒ Ņ‚Đ° Ņ„ĐžĐŊ҃ ҃ PDF Ņ‚Đ° Ņ–ĐŊвĐĩŅ€Ņ‚ŅƒŅ” Đ˛ŅŅ– ĐēĐžĐģŅŒĐžŅ€Đ¸ PDF Đ´ĐģŅ СĐŧĐĩĐŊ҈ĐĩĐŊĐŊŅ Ņ€ĐžĐˇĐŧŅ–Ņ€Ņƒ Ņ„Đ°ĐšĐģ҃" }, - "convert": { - "title": "КоĐŊвĐĩŅ€Ņ‚ŅƒĐ˛Đ°Ņ‚Đ¸" - }, "attachments": { "title": "Add attachments" }, - "extractPages": { - "title": "Đ’Đ¸Đ´ĐžĐąŅƒŅ‚Đ¸ ŅŅ‚ĐžŅ€Ņ–ĐŊĐēи" - }, - "removePages": { - "title": "ВидаĐģĐĩĐŊĐŊŅ", - "desc": "ВидаĐģŅ–Ņ‚ŅŒ ĐŊĐĩĐŋĐžŅ‚Ņ€Ņ–ĐąĐŊŅ– ŅŅ‚ĐžŅ€Ņ–ĐŊĐēи С Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ° PDF." - }, "removeImagePdf": { "title": "ВидаĐģĐ¸Ņ‚Đ¸ ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊĐŊŅ", "desc": "ВидаĐģŅŅ” ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊĐŊŅ С PDF Đ´ĐģŅ СĐŧĐĩĐŊ҈ĐĩĐŊĐŊŅ Ņ€ĐžĐˇĐŧŅ–Ņ€Ņƒ Ņ„Đ°ĐšĐģ҃" }, - "autoSizeSplitPDF": { - "title": "ĐĐ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐĩ Ņ€ĐžĐˇĐ´Ņ–ĐģĐĩĐŊĐŊŅ Са Ņ€ĐžĐˇĐŧŅ–Ņ€ĐžĐŧ/ĐēŅ–ĐģҌĐēŅ–ŅŅ‚ŅŽ", - "desc": "Đ ĐžĐˇĐ´Ņ–ĐģŅŅ” ОдиĐŊ PDF ĐŊа ĐēŅ–ĐģҌĐēа Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Ņ–Đ˛ ĐŊа ĐžŅĐŊĐžĐ˛Ņ– Ņ€ĐžĐˇĐŧŅ–Ņ€Ņƒ, ĐēŅ–ĐģҌĐēĐžŅŅ‚Ņ– ŅŅ‚ĐžŅ€Ņ–ĐŊĐžĐē айО ĐēŅ–ĐģҌĐēĐžŅŅ‚Ņ– Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Ņ–Đ˛" - }, "adjust-contrast": { "title": "НаĐģĐ°ŅˆŅ‚ŅƒĐ˛Đ°ĐŊĐŊŅ ĐēĐžĐģŅŒĐžŅ€Ņ–Đ˛/ĐēĐžĐŊŅ‚Ņ€Đ°ŅŅ‚ĐŊĐžŅŅ‚Ņ–", "desc": "НаĐģĐ°ŅˆŅ‚ŅƒĐ˛Đ°ĐŊĐŊŅ ĐēĐžĐŊŅ‚Ņ€Đ°ŅŅ‚ĐŊĐžŅŅ‚Ņ–, ĐŊĐ°ŅĐ¸Ņ‡ĐĩĐŊĐžŅŅ‚Ņ– Ņ‚Đ° ŅŅĐēŅ€Đ°Đ˛ĐžŅŅ‚Ņ– Ņ„Đ°ĐšĐģ҃ PDF" @@ -607,11 +896,12 @@ "replaceColorPdf": { "title": "ЗаĐŧŅ–ĐŊа Ņ‚Đ° Ņ–ĐŊвĐĩŅ€ŅŅ–Ņ ĐēĐžĐģŅŒĐžŅ€Ņƒ", "desc": "ЗаĐŧŅ–ĐŊŅŽŅ” ĐēĐžĐģŅ–Ņ€ Ņ‚ĐĩĐēŅŅ‚Ņƒ Ņ‚Đ° Ņ„ĐžĐŊ҃ ҃ PDF Ņ‚Đ° Ņ–ĐŊвĐĩŅ€Ņ‚ŅƒŅ” Đ˛ŅŅ– ĐēĐžĐģŅŒĐžŅ€Đ¸ PDF Đ´ĐģŅ СĐŧĐĩĐŊ҈ĐĩĐŊĐŊŅ Ņ€ĐžĐˇĐŧŅ–Ņ€Ņƒ Ņ„Đ°ĐšĐģ҃" - }, - "changePermissions": { - "title": "ЗĐŧŅ–ĐŊĐ¸Ņ‚Đ¸ дОСвОĐģи" } }, + "landing": { + "addFiles": "Add Files", + "uploadFromComputer": "Upload from computer" + }, "viewPdf": { "tags": "ĐŋĐĩŅ€ĐĩĐŗĐģŅĐ´,Ņ‡Đ¸Ņ‚Đ°ĐŊĐŊŅ,аĐŊĐžŅ‚Đ°Ņ†Ņ–Ņ—,Ņ‚ĐĩĐēҁ҂,ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊĐŊŅ", "title": "ПĐĩŅ€ĐĩĐŗĐģŅĐ´/Ņ€ĐĩĐ´Đ°ĐŗŅƒĐ˛Đ°ĐŊĐŊŅ PDF", @@ -645,17 +935,39 @@ "merge": { "tags": "Ой'Ņ”Đ´ĐŊаĐŊĐŊŅ,ĐžĐŋĐĩŅ€Đ°Ņ†Ņ–Ņ— ĐˇŅ– ŅŅ‚ĐžŅ€Ņ–ĐŊĐēаĐŧи,ҁĐĩŅ€Đ˛ĐĩŅ€ĐŊа Ņ‡Đ°ŅŅ‚Đ¸ĐŊа", "title": "Об'Ņ”Đ´ĐŊĐ°Ņ‚Đ¸", + "removeDigitalSignature": { + "label": "Remove digital signature in the merged file?", + "tooltip": { + "title": "Remove Digital Signature", + "description": "Digital signatures will be invalidated when merging files. Check this to remove them from the final merged PDF." + } + }, + "generateTableOfContents": { + "label": "Generate table of contents in the merged file?", + "tooltip": { + "title": "Generate Table of Contents", + "description": "Automatically creates a clickable table of contents in the merged PDF based on the original file names and page numbers." + } + }, + "submit": "Об'Ņ”Đ´ĐŊĐ°Ņ‚Đ¸", + "sortBy": { + "description": "Files will be merged in the order they're selected. Drag to reorder or sort below.", + "label": "Sort By", + "filename": "ІĐŧ'Ņ Ņ„Đ°ĐšĐģ҃", + "dateModified": "Date Modified", + "ascending": "Ascending", + "descending": "Descending", + "sort": "Sort" + }, + "error": { + "failed": "An error occurred while merging the PDFs." + }, "header": "Об'Ņ”Đ´ĐŊаĐŊĐŊŅ ĐēŅ–ĐģҌĐēĐžŅ… PDF-Ņ„Đ°ĐšĐģŅ–Đ˛ (2+)", "sortByName": "ĐĄĐžŅ€Ņ‚ŅƒĐ˛Đ°ĐŊĐŊŅ Са Ņ–Đŧ'ŅĐŧ", "sortByDate": "ĐĄĐžŅ€Ņ‚ŅƒĐ˛Đ°ĐŊĐŊŅ Са Đ´Đ°Ņ‚ĐžŅŽ", - "removeCertSign": "ВидаĐģĐ¸Ņ‚Đ¸ Ņ†Đ¸Ņ„Ņ€ĐžĐ˛Đ¸Đš ĐŋŅ–Đ´ĐŋĐ¸Ņ ҃ ĐžĐąâ€™Ņ”Đ´ĐŊаĐŊĐžĐŧ҃ Ņ„Đ°ĐšĐģŅ–?", - "submit": "Об'Ņ”Đ´ĐŊĐ°Ņ‚Đ¸", - "sortBy": { - "filename": "ІĐŧ'Ņ Ņ„Đ°ĐšĐģ҃" - } + "removeCertSign": "ВидаĐģĐ¸Ņ‚Đ¸ Ņ†Đ¸Ņ„Ņ€ĐžĐ˛Đ¸Đš ĐŋŅ–Đ´ĐŋĐ¸Ņ ҃ ĐžĐąâ€™Ņ”Đ´ĐŊаĐŊĐžĐŧ҃ Ņ„Đ°ĐšĐģŅ–?" }, "split": { - "tags": "ĐžĐŋĐĩŅ€Đ°Ņ†Ņ–Ņ— ĐˇŅ– ŅŅ‚ĐžŅ€Ņ–ĐŊĐēаĐŧи,Ņ€ĐžĐˇĐ´Ņ–ĐģĐĩĐŊĐŊŅ,ĐąĐ°ĐŗĐ°Ņ‚ĐžŅŅ‚ĐžŅ€Ņ–ĐŊĐēОвиК,Đ˛Đ¸Ņ€Ņ–ĐˇĐ°ĐŊĐŊŅ,ҁĐĩŅ€Đ˛ĐĩŅ€ĐŊа Ņ‡Đ°ŅŅ‚Đ¸ĐŊа", "title": "Đ ĐžĐˇĐ´Ņ–ĐģĐ¸Ņ‚Đ¸ PDF", "header": "Đ ĐžĐˇĐ´Ņ–ĐģĐ¸Ņ‚Đ¸ PDF", "desc": { @@ -671,25 +983,249 @@ "splitPages": "ВвĐĩĐ´Ņ–Ņ‚ŅŒ ŅŅ‚ĐžŅ€Ņ–ĐŊĐēи Đ´ĐģŅ Ņ€ĐžĐˇĐ´Ņ–ĐģĐĩĐŊĐŊŅ:", "submit": "Đ ĐžĐˇĐ´Ņ–ĐģĐ¸Ņ‚Đ¸", "steps": { + "chooseMethod": "Choose Method", "settings": "НаĐģĐ°ŅˆŅ‚ŅƒĐ˛Đ°ĐŊĐŊŅ" }, + "settings": { + "selectMethodFirst": "Please select a split method first" + }, + "error": { + "failed": "An error occurred while splitting the PDF." + }, + "method": { + "label": "Choose split method", + "placeholder": "Select how to split the PDF" + }, "methods": { + "prefix": { + "splitAt": "Split at", + "splitBy": "Split by" + }, + "byPages": { + "name": "Page Numbers", + "desc": "Extract specific pages (1,3,5-10)", + "tooltip": "Enter page numbers separated by commas or ranges with hyphens" + }, + "bySections": { + "name": "Sections", + "desc": "Divide pages into grid sections", + "tooltip": "Split each page into horizontal and vertical sections" + }, "bySize": { - "name": "РОСĐŧŅ–Ņ€ Ņ„Đ°ĐšĐģ҃" + "name": "РОСĐŧŅ–Ņ€ Ņ„Đ°ĐšĐģ҃", + "desc": "Limit maximum file size", + "tooltip": "Specify maximum file size (e.g. 10MB, 500KB)" + }, + "byPageCount": { + "name": "Page Count", + "desc": "Fixed pages per file", + "tooltip": "Enter the number of pages for each split file" + }, + "byDocCount": { + "name": "Document Count", + "desc": "Create specific number of files", + "tooltip": "Enter how many files you want to create" + }, + "byChapters": { + "name": "Chapters", + "desc": "Split at bookmark boundaries", + "tooltip": "Uses PDF bookmarks to determine split points" + }, + "byPageDivider": { + "name": "Page Divider", + "desc": "Auto-split with divider sheets", + "tooltip": "Use QR code divider sheets between documents when scanning" } }, "value": { "fileSize": { - "label": "РОСĐŧŅ–Ņ€ Ņ„Đ°ĐšĐģ҃" + "label": "РОСĐŧŅ–Ņ€ Ņ„Đ°ĐšĐģ҃", + "placeholder": "e.g. 10MB, 500KB" + }, + "pageCount": { + "label": "Pages per File", + "placeholder": "e.g. 5, 10" + }, + "docCount": { + "label": "Number of Files", + "placeholder": "e.g. 3, 5" } - } + }, + "tooltip": { + "header": { + "title": "Split Methods Overview" + }, + "byPages": { + "title": "Split at Page Numbers", + "text": "Split your PDF at specific page numbers. Using 'n' splits after page n. Using 'n-m' splits before page n and after page m.", + "bullet1": "Single split points: 3,7 (splits after pages 3 and 7)", + "bullet2": "Range split points: 3-8 (splits before page 3 and after page 8)", + "bullet3": "Mixed: 2,5-10,15 (splits after page 2, before page 5, after page 10, and after page 15)" + }, + "bySections": { + "title": "Split by Grid Sections", + "text": "Divide each page into a grid of sections. Useful for splitting documents with multiple columns or extracting specific areas.", + "bullet1": "Horizontal: Number of rows to create", + "bullet2": "Vertical: Number of columns to create", + "bullet3": "Merge: Combine all sections into one PDF" + }, + "bySize": { + "title": "Split by File Size", + "text": "Create multiple PDFs that don't exceed a specified file size. Ideal for file size limitations or email attachments.", + "bullet1": "Use MB for larger files (e.g., 10MB)", + "bullet2": "Use KB for smaller files (e.g., 500KB)", + "bullet3": "System will split at page boundaries" + }, + "byCount": { + "title": "Split by Count", + "text": "Create multiple PDFs with a specific number of pages or documents each.", + "bullet1": "Page Count: Fixed number of pages per file", + "bullet2": "Document Count: Fixed number of output files", + "bullet3": "Useful for batch processing workflows" + }, + "byChapters": { + "title": "Split by Chapters", + "text": "Use PDF bookmarks to automatically split at chapter boundaries. Requires PDFs with bookmark structure.", + "bullet1": "Bookmark Level: Which level to split on (1=top level)", + "bullet2": "Include Metadata: Preserve document properties", + "bullet3": "Allow Duplicates: Handle repeated bookmark names" + }, + "byDocCount": { + "bullet1": "Enter the number of output files you want", + "bullet2": "Pages are distributed as evenly as possible", + "bullet3": "Useful when you need a specific number of files", + "text": "Create a specific number of output files by evenly distributing pages across them.", + "title": "Split by Document Count" + }, + "byPageCount": { + "bullet1": "Enter the number of pages per output file", + "bullet2": "Last file may have fewer pages if not evenly divisible", + "bullet3": "Useful for batch processing workflows", + "text": "Create multiple PDFs with a specific number of pages each. Perfect for creating uniform document chunks.", + "title": "Split by Page Count" + }, + "byPageDivider": { + "bullet1": "Print divider sheets from the download link", + "bullet2": "Insert divider sheets between your documents", + "bullet3": "Scan all documents together as one PDF", + "bullet4": "Upload - divider pages are automatically detected and removed", + "bullet5": "Enable Duplex Mode if scanning both sides of divider sheets", + "text": "Automatically split scanned documents using physical divider sheets with QR codes. Perfect for processing multiple documents scanned together.", + "title": "Split by Page Divider" + } + }, + "methodSelection": { + "tooltip": { + "bullet1": "Click on a method card to select it", + "bullet2": "Hover over each card to see a quick description", + "bullet3": "The settings step will appear after you select a method", + "bullet4": "You can change methods at any time before processing", + "header": { + "text": "Choose how you want to split your PDF document. Each method is optimized for different use cases and document types.", + "title": "Split Method Selection" + }, + "title": "Choose Your Split Method" + } + }, + "selectMethod": "Select a split method", + "tags": "ĐžĐŋĐĩŅ€Đ°Ņ†Ņ–Ņ— ĐˇŅ– ŅŅ‚ĐžŅ€Ņ–ĐŊĐēаĐŧи,Ņ€ĐžĐˇĐ´Ņ–ĐģĐĩĐŊĐŊŅ,ĐąĐ°ĐŗĐ°Ņ‚ĐžŅŅ‚ĐžŅ€Ņ–ĐŊĐēОвиК,Đ˛Đ¸Ņ€Ņ–ĐˇĐ°ĐŊĐŊŅ,ҁĐĩŅ€Đ˛ĐĩŅ€ĐŊа Ņ‡Đ°ŅŅ‚Đ¸ĐŊа" }, "rotate": { - "tags": "ҁĐĩŅ€Đ˛ĐĩŅ€ĐŊа Ņ‡Đ°ŅŅ‚Đ¸ĐŊа", "title": "ПовĐĩŅ€ĐŊŅƒŅ‚Đ¸ PDF", + "submit": "ПовĐĩŅ€ĐŊŅƒŅ‚Đ¸", + "selectRotation": "Select Rotation Angle (Clockwise)", + "error": { + "failed": "An error occurred while rotating the PDF." + }, + "preview": { + "title": "Rotation Preview" + }, + "rotateLeft": "Rotate Anticlockwise", + "rotateRight": "Rotate Clockwise", + "tooltip": { + "header": { + "title": "Rotate Settings Overview" + }, + "description": { + "text": "Rotate your PDF pages clockwise or anticlockwise in 90-degree increments. All pages in the PDF will be rotated. The preview shows how your document will look after rotation." + }, + "controls": { + "title": "Controls", + "text": "Use the rotation buttons to adjust orientation. Left button rotates anticlockwise, right button rotates clockwise. Each click rotates by 90 degrees." + } + }, + "tags": "ҁĐĩŅ€Đ˛ĐĩŅ€ĐŊа Ņ‡Đ°ŅŅ‚Đ¸ĐŊа", "header": "ПовĐĩŅ€ĐŊŅƒŅ‚Đ¸ PDF", - "selectAngle": "ВибĐĩŅ€Ņ–Ņ‚ŅŒ ĐēŅƒŅ‚ ĐŋĐžĐ˛ĐžŅ€ĐžŅ‚Ņƒ (ĐēŅ€Đ°Ņ‚ĐŊиК 90 ĐŗŅ€Đ°Đ´ŅƒŅĐ°Đŧ):", - "submit": "ПовĐĩŅ€ĐŊŅƒŅ‚Đ¸" + "selectAngle": "ВибĐĩŅ€Ņ–Ņ‚ŅŒ ĐēŅƒŅ‚ ĐŋĐžĐ˛ĐžŅ€ĐžŅ‚Ņƒ (ĐēŅ€Đ°Ņ‚ĐŊиК 90 ĐŗŅ€Đ°Đ´ŅƒŅĐ°Đŧ):" + }, + "convert": { + "title": "КоĐŊвĐĩŅ€Ņ‚ŅƒĐ˛Đ°Ņ‚Đ¸", + "desc": "Convert files between different formats", + "files": "Files", + "selectFilesPlaceholder": "Select files in the main view to get started", + "settings": "НаĐģĐ°ŅˆŅ‚ŅƒĐ˛Đ°ĐŊĐŊŅ", + "conversionCompleted": "Conversion completed", + "results": "Results", + "defaultFilename": "converted_file", + "conversionResults": "Conversion Results", + "convertFrom": "Convert from", + "convertTo": "Convert to", + "sourceFormatPlaceholder": "Source format", + "targetFormatPlaceholder": "Target format", + "selectSourceFormatFirst": "Select a source format first", + "outputOptions": "Output Options", + "pdfOptions": "PDF Options", + "imageOptions": "Image Options", + "colorType": "Colour Type", + "color": "КоĐģŅ–Ņ€", + "greyscale": "Đ’Ņ–Đ´Ņ‚Ņ–ĐŊĐēи ŅŅ–Ņ€ĐžĐŗĐž", + "blackwhite": "Black & White", + "dpi": "DPI", + "output": "Output", + "single": "Single", + "multiple": "Multiple", + "fitOption": "Fit Option", + "maintainAspectRatio": "Maintain Aspect Ratio", + "fitDocumentToPage": "Fit Document to Page", + "fillPage": "ЗаĐŋОвĐŊĐĩĐŊĐŊŅ ŅŅ‚ĐžŅ€Ņ–ĐŊĐēи", + "autoRotate": "Auto Rotate", + "autoRotateDescription": "Automatically rotate images to better fit the PDF page", + "combineImages": "Combine Images", + "combineImagesDescription": "Combine all images into one PDF, or create separate PDFs for each image", + "webOptions": "Web to PDF Options", + "zoomLevel": "Zoom Level", + "emailOptions": "Email to PDF Options", + "includeAttachments": "Include email attachments", + "maxAttachmentSize": "Maximum attachment size (MB)", + "includeAllRecipients": "Include CC and BCC recipients in header", + "downloadHtml": "Download HTML intermediate file instead of PDF", + "pdfaOptions": "PDF/A Options", + "outputFormat": "Output Format", + "pdfaNote": "PDF/A-1b is more compatible, PDF/A-2b supports more features.", + "pdfaDigitalSignatureWarning": "ĐĻĐĩĐš PDF Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚ ĐŧĐ°Ņ” Ņ†Đ¸Ņ„Ņ€ĐžĐ˛Đ¸Đš ĐŋŅ–Đ´ĐŋĐ¸Ņ. ĐĻĐĩĐš ĐŋŅ–Đ´ĐŋĐ¸Ņ ĐąŅƒĐ´Đĩ видаĐģĐĩĐŊиК ҃ ĐŊĐ°ŅŅ‚ŅƒĐŋĐŊĐžĐŧ҃ ĐēŅ€ĐžŅ†Ņ–.", + "fileFormat": "File Format", + "wordDoc": "Word Document", + "wordDocExt": "Word Document (.docx)", + "odtExt": "OpenDocument Text (.odt)", + "pptExt": "PowerPoint (.pptx)", + "odpExt": "OpenDocument Presentation (.odp)", + "txtExt": "Plain Text (.txt)", + "rtfExt": "Rich Text Format (.rtf)", + "selectedFiles": "Selected files", + "noFileSelected": "No file selected. Use the file panel to add files.", + "convertFiles": "Convert Files", + "converting": "Converting...", + "downloadConverted": "Download Converted File", + "errorNoFiles": "Please select at least one file to convert.", + "errorNoFormat": "Please select both source and target formats.", + "errorNotSupported": "Conversion from {{from}} to {{to}} is not supported.", + "images": "Images", + "officeDocs": "Office Documents (Word, Excel, PowerPoint)", + "imagesExt": "Images (JPG, PNG, etc.)", + "markdown": "Markdown", + "textRtf": "Text/RTF", + "grayscale": "Đ’Ņ–Đ´Ņ‚Ņ–ĐŊĐēи ŅŅ–Ņ€ĐžĐŗĐž", + "errorConversion": "An error occurred while converting the file." }, "imageToPdf": { "tags": "ĐēĐžĐŊвĐĩŅ€Ņ‚Đ°Ņ†Ņ–Ņ,ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊĐŊŅ,jpg,ĐēĐ°Ņ€Ņ‚Đ¸ĐŊĐēа,Ņ„ĐžŅ‚Đž" @@ -727,7 +1263,33 @@ "8": "ВидаĐģĐ¸Ņ‚Đ¸ ĐžŅŅ‚Đ°ĐŊĐŊŅŽ", "9": "ВидаĐģĐ¸Ņ‚Đ¸ ĐŋĐĩŅ€ŅˆŅƒ Ņ‚Đ° ĐžŅŅ‚Đ°ĐŊĐŊŅŽ", "10": "Об'Ņ”Đ´ĐŊаĐŊĐŊŅ ĐŋĐ°Ņ€ĐŊĐ¸Ņ…-ĐŊĐĩĐŋĐ°Ņ€ĐŊĐ¸Ņ…", - "11": "Đ”ŅƒĐąĐģŅŽĐ˛Đ°Ņ‚Đ¸ Đ˛ŅŅ– ŅŅ‚ĐžŅ€Ņ–ĐŊĐēи" + "11": "Đ”ŅƒĐąĐģŅŽĐ˛Đ°Ņ‚Đ¸ Đ˛ŅŅ– ŅŅ‚ĐžŅ€Ņ–ĐŊĐēи", + "desc": { + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, â€Ļ).", + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, â€Ļ).", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimized for binding on the side)." + } + }, + "desc": { + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, â€Ļ).", + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, â€Ļ).", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimised for binding on the side).", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document." }, "placeholder": "(ĐŊаĐŋŅ€Đ¸ĐēĐģад, 1,3,2 айО 4-8,2,10-12 айО 2n-1)" }, @@ -739,9 +1301,198 @@ "upload": "Đ”ĐžĐ´Đ°Ņ‚Đ¸ ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊĐŊŅ", "submit": "Đ”ĐžĐ´Đ°Ņ‚Đ¸ ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊĐŊŅ" }, + "attachments": { + "tags": "embed,attach,file,attachment,attachments", + "title": "Add attachments", + "header": "Add attachments", + "add": "Add Attachment", + "remove": "Remove Attachment", + "embed": "Embed Attachment", + "submit": "Add attachments" + }, "watermark": { - "tags": "Ņ‚ĐĩĐēҁ҂,ĐŋĐžĐ˛Ņ‚ĐžŅ€ĐŊиК,ĐŧŅ–Ņ‚Đēа,вĐģĐ°ŅĐŊиК,Đ°Đ˛Ņ‚ĐžŅ€ŅŅŒĐēĐĩ ĐŋŅ€Đ°Đ˛Đž,Ņ‚ĐžŅ€ĐŗĐžĐ˛ĐĩĐģҌĐŊа ĐŧĐ°Ņ€Đēа,ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊĐŊŅ,jpg,ĐēĐ°Ņ€Ņ‚Đ¸ĐŊĐēа,Ņ„ĐžŅ‚Đž", "title": "Đ”ĐžĐ´Đ°Ņ‚Đ¸ Đ˛ĐžĐ´ŅĐŊиК СĐŊаĐē", + "desc": "Add text or image watermarks to PDF files", + "completed": "Watermark added", + "submit": "Đ”ĐžĐ´Đ°Ņ‚Đ¸ Đ˛ĐžĐ´ŅĐŊиК СĐŊаĐē", + "filenamePrefix": "watermarked", + "error": { + "failed": "An error occurred while adding watermark to the PDF." + }, + "watermarkType": { + "text": "ĐĸĐĩĐēҁ҂", + "image": "Image" + }, + "settings": { + "type": "Watermark Type", + "text": { + "label": "Watermark Text", + "placeholder": "Enter watermark text" + }, + "image": { + "label": "Watermark Image", + "choose": "Choose Image", + "selected": "Selected: {{filename}}" + }, + "fontSize": "РОСĐŧŅ–Ņ€ ŅˆŅ€Đ¸Ņ„Ņ‚Ņƒ", + "size": "Size", + "alphabet": "Font/Language", + "color": "Watermark Colour", + "rotation": "Rotation (degrees)", + "opacity": "Opacity (%)", + "spacing": { + "horizontal": "Horizontal Spacing", + "vertical": "Vertical Spacing", + "height": "Height Spacing", + "width": "Width Spacing" + }, + "convertToImage": "Flatten PDF pages to images" + }, + "alphabet": { + "roman": "Roman/Latin", + "arabic": "Arabic", + "japanese": "Japanese", + "korean": "Korean", + "chinese": "Chinese", + "thai": "Thai" + }, + "steps": { + "type": "Watermark Type", + "wording": "Wording", + "textStyle": "Style", + "formatting": "Formatting", + "file": "Watermark File" + }, + "results": { + "title": "Watermark Results" + }, + "tooltip": { + "language": { + "title": "Language Support", + "text": "Choose the appropriate language setting to ensure proper font rendering for your text." + }, + "appearance": { + "title": "Appearance Settings", + "text": "Control how your watermark looks and blends with the document.", + "bullet1": "Rotation: -360° to 360° for angled watermarks", + "bullet2": "Opacity: 0-100% for transparency control", + "bullet3": "Lower opacity creates subtle watermarks" + }, + "spacing": { + "title": "Spacing Control", + "text": "Adjust the spacing between repeated watermarks across the page.", + "bullet1": "Width spacing: Horizontal distance between watermarks", + "bullet2": "Height spacing: Vertical distance between watermarks", + "bullet3": "Higher values create more spread out patterns" + }, + "type": { + "header": { + "title": "Watermark Type Selection" + }, + "description": { + "title": "Choose Your Watermark", + "text": "Select between text or image watermarks based on your needs." + }, + "text": { + "title": "Text Watermarks", + "text": "Perfect for adding copyright notices, company names, or confidentiality labels. Supports multiple languages and custom colours.", + "bullet1": "Customisable fonts and languages", + "bullet2": "Adjustable colours and transparency", + "bullet3": "Ideal for legal or branding text" + }, + "image": { + "title": "Image Watermarks", + "text": "Use logos, stamps, or any image as a watermark. Great for branding and visual identification.", + "bullet1": "Upload any image format", + "bullet2": "Maintains image quality", + "bullet3": "Perfect for logos and stamps" + } + }, + "wording": { + "header": { + "title": "Text Content" + }, + "text": { + "title": "Watermark Text", + "text": "Enter the text that will appear as your watermark across the document.", + "bullet1": "Keep it concise for better readability", + "bullet2": "Common examples: 'CONFIDENTIAL', 'DRAFT', company name", + "bullet3": "Emoji characters are not supported and will be filtered out" + } + }, + "textStyle": { + "header": { + "title": "Text Style" + }, + "color": { + "title": "Colour Selection", + "text": "Choose a colour that provides good contrast with your document content.", + "bullet1": "Light grey (#d3d3d3) for subtle watermarks", + "bullet2": "Black or dark colours for high contrast", + "bullet3": "Custom colours for branding purposes" + }, + "language": { + "title": "Language Support", + "text": "Choose the appropriate language setting to ensure proper font rendering." + } + }, + "file": { + "header": { + "title": "Image Upload" + }, + "upload": { + "title": "Image Selection", + "text": "Upload an image file to use as your watermark.", + "bullet1": "Supports common formats: PNG, JPG, GIF, BMP", + "bullet2": "PNG with transparency works best", + "bullet3": "Higher resolution images maintain quality better" + }, + "recommendations": { + "title": "Best Practices", + "text": "Tips for optimal image watermark results.", + "bullet1": "Use logos or stamps with transparent backgrounds", + "bullet2": "Simple designs work better than complex images", + "bullet3": "Consider the final document size when choosing resolution" + } + }, + "formatting": { + "header": { + "title": "Formatting & Layout" + }, + "size": { + "title": "Size Control", + "text": "Adjust the size of your watermark (text or image).", + "bullet1": "Larger sizes create more prominent watermarks" + }, + "appearance": { + "title": "Appearance Settings", + "text": "Control how your watermark looks and blends with the document.", + "bullet1": "Rotation: -360° to 360° for angled watermarks", + "bullet2": "Opacity: 0-100% for transparency control", + "bullet3": "Lower opacity creates subtle watermarks" + }, + "spacing": { + "title": "Spacing Control", + "text": "Adjust the spacing between repeated watermarks across the page.", + "bullet1": "Horizontal spacing: Distance between watermarks left to right", + "bullet2": "Vertical spacing: Distance between watermarks top to bottom", + "bullet3": "Higher values create more spread out patterns" + }, + "security": { + "title": "Security Option", + "text": "Convert the final PDF to an image-based format for enhanced security.", + "bullet1": "Prevents text selection and copying", + "bullet2": "Makes watermarks harder to remove", + "bullet3": "Results in larger file sizes", + "bullet4": "Best for sensitive or copyrighted content" + } + } + }, + "type": { + "1": "ĐĸĐĩĐēҁ҂", + "2": "Đ—ĐžĐąŅ€Đ°ĐļĐĩĐŊĐŊŅ" + }, + "tags": "Ņ‚ĐĩĐēҁ҂,ĐŋĐžĐ˛Ņ‚ĐžŅ€ĐŊиК,ĐŧŅ–Ņ‚Đēа,вĐģĐ°ŅĐŊиК,Đ°Đ˛Ņ‚ĐžŅ€ŅŅŒĐēĐĩ ĐŋŅ€Đ°Đ˛Đž,Ņ‚ĐžŅ€ĐŗĐžĐ˛ĐĩĐģҌĐŊа ĐŧĐ°Ņ€Đēа,ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊĐŊŅ,jpg,ĐēĐ°Ņ€Ņ‚Đ¸ĐŊĐēа,Ņ„ĐžŅ‚Đž", "header": "Đ”ĐžĐ´Đ°Ņ‚Đ¸ Đ˛ĐžĐ´ŅĐŊиК СĐŊаĐē", "customColor": "ĐšĐžŅ€Đ¸ŅŅ‚ŅƒĐ˛Đ°Ņ†ŅŒĐēиК ĐēĐžĐģŅ–Ņ€ Ņ‚ĐĩĐēŅŅ‚Ņƒ", "selectText": { @@ -755,17 +1506,6 @@ "8": "ĐĸиĐŋ Đ˛ĐžĐ´ŅĐŊĐžĐŗĐž СĐŊаĐē҃:", "9": "Đ—ĐžĐąŅ€Đ°ĐļĐĩĐŊĐŊŅ Đ˛ĐžĐ´ŅĐŊĐžĐŗĐž СĐŊаĐē҃:", "10": "КĐĩвĐĩŅ€Ņ‚ŅƒĐ˛Đ°Ņ‚Đ¸ PDF в PDF-Image" - }, - "submit": "Đ”ĐžĐ´Đ°Ņ‚Đ¸ Đ˛ĐžĐ´ŅĐŊиК СĐŊаĐē", - "type": { - "1": "ĐĸĐĩĐēҁ҂", - "2": "Đ—ĐžĐąŅ€Đ°ĐļĐĩĐŊĐŊŅ" - }, - "watermarkType": { - "text": "ĐĸĐĩĐēҁ҂" - }, - "settings": { - "fontSize": "РОСĐŧŅ–Ņ€ ŅˆŅ€Đ¸Ņ„Ņ‚Ņƒ" } }, "permissions": { @@ -790,50 +1530,201 @@ "removePages": { "tags": "видаĐģĐ¸Ņ‚Đ¸ ŅŅ‚ĐžŅ€Ņ–ĐŊĐēи,видаĐģĐĩĐŊĐŊŅ ŅŅ‚ĐžŅ€Ņ–ĐŊĐžĐē", "title": "ВидаĐģĐĩĐŊĐŊŅ", + "pageNumbers": { + "label": "Pages to Remove", + "placeholder": "e.g., 1,3,5-8,10", + "error": "Invalid page number format. Use numbers, ranges (1-5), or mathematical expressions (2n+1)" + }, + "filenamePrefix": "pages_removed", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "settings": { + "title": "Settings" + }, + "tooltip": { + "header": { + "title": "Remove Pages Settings" + }, + "pageNumbers": { + "title": "Page Selection", + "text": "Specify which pages to remove from your PDF. You can select individual pages, ranges, or use mathematical expressions.", + "bullet1": "Individual pages: 1,3,5 (removes pages 1, 3, and 5)", + "bullet2": "Page ranges: 1-5,10-15 (removes pages 1-5 and 10-15)", + "bullet3": "Mathematical: 2n+1 (removes odd pages)", + "bullet4": "Open ranges: 5- (removes from page 5 to end)" + }, + "examples": { + "title": "Common Examples", + "text": "Here are some common page selection patterns:", + "bullet1": "Remove first page: 1", + "bullet2": "Remove last 3 pages: -3", + "bullet3": "Remove every other page: 2n", + "bullet4": "Remove specific scattered pages: 1,5,10,15" + }, + "safety": { + "title": "Safety Tips", + "text": "Important considerations when removing pages:", + "bullet1": "Always preview your selection before processing", + "bullet2": "Keep a backup of your original file", + "bullet3": "Page numbers start from 1, not 0", + "bullet4": "Invalid page numbers will be ignored" + } + }, + "error": { + "failed": "An error occurred whilst removing pages." + }, + "results": { + "title": "Page Removal Results" + }, "submit": "ВидаĐģĐĩĐŊĐŊŅ" }, - "addPassword": { - "tags": "ĐąĐĩСĐŋĐĩĐēа,ĐˇĐ°Ņ…Đ¸ŅŅ‚", - "title": "Đ”ĐžĐ´Đ°Ņ‚Đ¸ ĐŋĐ°Ņ€ĐžĐģҌ", - "header": "Đ”ĐžĐ´Đ°Ņ‚Đ¸ ĐŋĐ°Ņ€ĐžĐģҌ (ĐˇĐ°ŅˆĐ¸Ņ„Ņ€ŅƒĐ˛Đ°Ņ‚Đ¸)", - "selectText": { - "1": "ОбĐĩŅ€Ņ–Ņ‚ŅŒ PDF Đ´ĐģŅ ŅˆĐ¸Ņ„Ņ€ŅƒĐ˛Đ°ĐŊĐŊŅ", - "2": "ĐŸĐ°Ņ€ĐžĐģҌ", - "3": "ДовĐļиĐŊа ĐēĐģŅŽŅ‡Đ° ŅˆĐ¸Ņ„Ņ€ŅƒĐ˛Đ°ĐŊĐŊŅ", - "4": "Đ’Đ¸Ņ‰Ņ– СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ ŅĐ¸ĐģҌĐŊŅ–ŅˆŅ–, аĐģĐĩ ĐŊиĐļ҇Җ СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ ĐŧĐ°ŅŽŅ‚ŅŒ ĐēŅ€Đ°Ņ‰Ņƒ ҁ҃ĐŧҖҁĐŊŅ–ŅŅ‚ŅŒ.", - "5": "ДозвоĐģи ĐŊа Đ˛ŅŅ‚Đ°ĐŊОвĐģĐĩĐŊĐŊŅ", - "6": "ЗаĐŋĐžĐąŅ–ĐŗŅ‚Đ¸ ĐˇĐąŅ–Ņ€Ņ†Ņ– Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ°", - "7": "ЗаĐŋĐžĐąŅ–ĐŗŅ‚Đ¸ виĐģŅƒŅ‡ĐĩĐŊĐŊŅŽ ĐēĐžĐŊŅ‚ĐĩĐŊŅ‚Ņƒ", - "8": "ЗаĐŋĐžĐąŅ–ĐŗŅ‚Đ¸ виĐģŅƒŅ‡ĐĩĐŊĐŊŅŽ Đ´ĐģŅ Đ´ĐžŅŅ‚ŅƒĐŋĐŊĐžŅŅ‚Ņ–", - "9": "Đ—Đ°ĐąĐžŅ€ĐžĐŊĐ¸Ņ‚Đ¸ СаĐŋОвĐŊĐĩĐŊĐŊŅ Ņ„ĐžŅ€Đŧ", - "10": "ЗаĐŋĐžĐąŅ–ĐŗŅ‚Đ¸ ĐŧĐžĐ´Đ¸Ņ„Ņ–ĐēĐ°Ņ†Ņ–Ņ—", - "11": "Đ—Đ°ĐąĐžŅ€ĐžĐŊĐ¸Ņ‚Đ¸ ĐŧĐžĐ´Đ¸Ņ„Ņ–ĐēĐ°Ņ†Ņ–ŅŽ аĐŊĐžŅ‚Đ°Ņ†Ņ–Đš", - "12": "Đ—Đ°ĐąĐžŅ€ĐžĐŊĐ¸Ņ‚Đ¸ Đ´Ņ€ŅƒĐē", - "13": "Đ—Đ°ĐąĐžŅ€ĐžĐŊĐ¸Ņ‚Đ¸ Đ´Ņ€ŅƒĐē Ņ€Ņ–ĐˇĐŊĐ¸Ņ… Ņ„ĐžŅ€ĐŧĐ°Ņ‚Ņ–Đ˛", - "14": "ВĐģĐ°ŅĐŊĐ¸Ņ†ŅŒĐēиК ĐŋĐ°Ņ€ĐžĐģҌ", - "15": "ОбĐŧĐĩĐļŅƒŅ”, Ņ‰Đž ĐŧĐžĐļĐŊа Ņ€ĐžĐąĐ¸Ņ‚Đ¸ С Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚ĐžĐŧ ĐŋҖҁĐģŅ ĐšĐžĐŗĐž Đ˛Ņ–Đ´ĐēŅ€Đ¸Ņ‚Ņ‚Ņ (ĐŊĐĩ ĐŋŅ–Đ´Ņ‚Ņ€Đ¸ĐŧŅƒŅ”Ņ‚ŅŒŅŅ Đ˛ŅŅ–Đŧа ĐŋŅ€ĐžĐŗŅ€Đ°ĐŧаĐŧи Ņ‡Đ¸Ņ‚Đ°ĐŊĐŊŅ)", - "16": "ОбĐŧĐĩĐļŅƒŅ” Đ˛Ņ–Đ´ĐēŅ€Đ¸Ņ‚Ņ‚Ņ ŅĐ°ĐŧĐžĐŗĐž Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ°" + "extractPages": { + "title": "Extract Pages", + "pageNumbers": { + "label": "Pages to Extract", + "placeholder": "e.g., 1,3,5-8 or odd & 1-10" + }, + "settings": { + "title": "Settings" }, - "submit": "Đ¨Đ¸Ņ„Ņ€ŅƒĐ˛Đ°Ņ‚Đ¸", "tooltip": { - "permissions": { - "title": "ЗĐŧŅ–ĐŊĐ¸Ņ‚Đ¸ дОСвОĐģи" + "description": "Extracts the selected pages into a new PDF, preserving order." + }, + "error": { + "failed": "Failed to extract pages" + }, + "results": { + "title": "Pages Extracted" + }, + "submit": "Extract Pages" + }, + "pageSelection": { + "tooltip": { + "header": { + "title": "Page Selection Guide" + }, + "basic": { + "title": "Basic Usage", + "text": "Select specific pages from your PDF document using simple syntax.", + "bullet1": "Individual pages: 1,3,5", + "bullet2": "Page ranges: 3-6 or 10-15", + "bullet3": "All pages: all" + }, + "advanced": { + "title": "Advanced Features" + }, + "tips": { + "title": "Tips", + "text": "Keep these guidelines in mind:", + "bullet1": "Page numbers start from 1 (not 0)", + "bullet2": "Spaces are automatically removed", + "bullet3": "Invalid expressions are ignored" + }, + "syntax": { + "title": "Syntax Basics", + "text": "Use numbers, ranges, keywords, and progressions (n starts at 0). Parentheses are supported.", + "bullets": { + "numbers": "Numbers/ranges: 5, 10-20", + "keywords": "Keywords: odd, even", + "progressions": "Progressions: 3n, 4n+1" + } + }, + "operators": { + "title": "Operators", + "text": "AND has higher precedence than comma. NOT applies within the document range.", + "and": "AND: & or \"and\" — require both conditions (e.g., 1-50 & even)", + "comma": "Comma: , or | — combine selections (e.g., 1-10, 20)", + "not": "NOT: ! or \"not\" — exclude pages (e.g., 3n & not 30)" + }, + "examples": { + "title": "Examples" + }, + "complex": { + "bullet1": "1,3-5,8,2n → pages 1, 3–5, 8, plus evens", + "bullet2": "10-,2n-1 → from page 10 to end + odd pages", + "description": "Mix different types.", + "title": "Complex Combinations" + }, + "description": "Choose which pages to use for the operation. Supports single pages, ranges, formulas, and the all keyword.", + "individual": { + "bullet1": "1,3,5 → selects pages 1, 3, 5", + "bullet2": "2,7,12 → selects pages 2, 7, 12", + "description": "Enter numbers separated by commas.", + "title": "Individual Pages" + }, + "mathematical": { + "bullet1": "2n → all even pages (2, 4, 6â€Ļ)", + "bullet2": "2n-1 → all odd pages (1, 3, 5â€Ļ)", + "bullet3": "3n → every 3rd page (3, 6, 9â€Ļ)", + "bullet4": "4n-1 → pages 3, 7, 11, 15â€Ļ", + "description": "Use n in formulas for patterns.", + "title": "Mathematical Functions" + }, + "ranges": { + "bullet1": "3-6 → selects pages 3–6", + "bullet2": "10-15 → selects pages 10–15", + "bullet3": "5- → selects pages 5 to end", + "description": "Use - for consecutive pages.", + "title": "Page Ranges" + }, + "special": { + "bullet1": "all → selects all pages", + "title": "Special Keywords" } } }, - "removePassword": { - "tags": "ĐąĐĩСĐŋĐĩĐēа,Ņ€ĐžĐˇŅˆĐ¸Ņ„Ņ€ĐžĐ˛Đēа,ĐˇĐ°Ņ…Đ¸ŅŅ‚,видаĐģĐĩĐŊĐŊŅ ĐŋĐ°Ņ€ĐžĐģŅ", - "title": "ВидаĐģĐ¸Ņ‚Đ¸ ĐŋĐ°Ņ€ĐžĐģҌ", - "header": "ВидаĐģĐ¸Ņ‚Đ¸ ĐŋĐ°Ņ€ĐžĐģҌ (Đ ĐžĐˇŅˆĐ¸Ņ„Ņ€ŅƒĐ˛Đ°Ņ‚Đ¸)", - "selectText": { - "1": "ВибĐĩŅ€Ņ–Ņ‚ŅŒ PDF Đ´ĐģŅ Ņ€ĐžĐˇŅˆĐ¸Ņ„Ņ€ŅƒĐ˛Đ°ĐŊĐŊŅ", - "2": "ĐŸĐ°Ņ€ĐžĐģҌ" + "bulkSelection": { + "syntaxError": "There is a syntax issue. See Page Selection tips for help.", + "header": { + "title": "Page Selection Guide" }, - "submit": "ВидаĐģĐ¸Ņ‚Đ¸", - "desc": "ЗĐŊŅ–ĐŧŅ–Ņ‚ŅŒ ĐˇĐ°Ņ…Đ¸ŅŅ‚ ĐŋĐ°Ņ€ĐžĐģĐĩĐŧ С Đ˛Đ°ŅˆĐžĐŗĐž Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ° PDF.", - "password": { - "stepTitle": "ВидаĐģĐ¸Ņ‚Đ¸ ĐŋĐ°Ņ€ĐžĐģҌ", - "label": "ĐŸĐžŅ‚ĐžŅ‡ĐŊиК ĐŋĐ°Ņ€ĐžĐģҌ" + "syntax": { + "title": "Syntax Basics", + "text": "Use numbers, ranges, keywords, and progressions (n starts at 0). Parentheses are supported.", + "bullets": { + "numbers": "Numbers/ranges: 5, 10-20", + "keywords": "Keywords: odd, even", + "progressions": "Progressions: 3n, 4n+1" + } + }, + "operators": { + "title": "Operators", + "text": "AND has higher precedence than comma. NOT applies within the document range.", + "and": "AND: & or \"and\" — require both conditions (e.g., 1-50 & even)", + "comma": "Comma: , or | — combine selections (e.g., 1-10, 20)", + "not": "NOT: ! or \"not\" — exclude pages (e.g., 3n & not 30)" + }, + "examples": { + "title": "Examples", + "first50": "First 50", + "last50": "Last 50", + "every3rd": "Every 3rd", + "oddWithinExcluding": "Odd within 1-20 excluding 5-7", + "combineSets": "Combine sets" + }, + "firstNPages": { + "title": "First N Pages", + "placeholder": "Number of pages" + }, + "lastNPages": { + "title": "Last N Pages", + "placeholder": "Number of pages" + }, + "everyNthPage": { + "title": "Every Nth Page", + "placeholder": "Step size" + }, + "range": { + "title": "Range", + "fromPlaceholder": "From", + "toPlaceholder": "To" + }, + "keywords": { + "title": "Keywords" + }, + "advanced": { + "title": "Advanced" } }, "compressPdfs": { @@ -843,12 +1734,142 @@ "tags": "remove,delete,form,field,readonly", "title": "Remove Read-Only from Form Fields", "header": "Unlock PDF Forms", - "submit": "Remove" + "submit": "Remove", + "description": "This tool will remove read-only restrictions from PDF form fields, making them editable and fillable.", + "filenamePrefix": "unlocked_forms", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst unlocking PDF forms." + }, + "results": { + "title": "Unlocked Forms Results" + } }, "changeMetadata": { - "tags": "ĐˇĐ°ĐŗĐžĐģОвОĐē,Đ°Đ˛Ņ‚ĐžŅ€,Đ´Đ°Ņ‚Đ°,ŅŅ‚Đ˛ĐžŅ€ĐĩĐŊĐŊŅ,Ņ‡Đ°Ņ,видавĐĩŅ†ŅŒ,Đ˛Đ¸Ņ€ĐžĐąĐŊиĐē,ŅŅ‚Đ°Ņ‚Đ¸ŅŅ‚Đ¸Đēа", - "title": "Đ—Đ°ĐŗĐžĐģОвОĐē:", "header": "ЗĐŧŅ–ĐŊĐ¸Ņ‚Đ¸ ĐŧĐĩŅ‚Đ°Đ´Đ°ĐŊŅ–", + "submit": "ЗĐŧŅ–ĐŊĐ¸Ņ‚Đ¸", + "filenamePrefix": "metadata", + "settings": { + "title": "Metadata Settings" + }, + "standardFields": { + "title": "Standard Fields" + }, + "deleteAll": { + "label": "Remove Existing Metadata", + "checkbox": "Delete all metadata" + }, + "title": { + "label": "Title", + "placeholder": "Document title" + }, + "author": { + "label": "Author", + "placeholder": "Document author" + }, + "subject": { + "label": "Subject", + "placeholder": "Document subject" + }, + "keywords": { + "label": "Keywords", + "placeholder": "Document keywords" + }, + "creator": { + "label": "Creator", + "placeholder": "Document creator" + }, + "producer": { + "label": "Producer", + "placeholder": "Document producer" + }, + "dates": { + "title": "Date Fields" + }, + "creationDate": { + "label": "Creation Date", + "placeholder": "Creation date" + }, + "modificationDate": { + "label": "Modification Date", + "placeholder": "Modification date" + }, + "trapped": { + "label": "Trapped Status", + "unknown": "Unknown", + "true": "True", + "false": "False" + }, + "advanced": { + "title": "Advanced Options" + }, + "customFields": { + "title": "Custom Metadata", + "description": "Add custom metadata fields to the document", + "add": "Add Field", + "key": "Key", + "keyPlaceholder": "Custom key", + "value": "Value", + "valuePlaceholder": "Custom value", + "remove": "Remove" + }, + "results": { + "title": "Updated PDFs" + }, + "error": { + "failed": "An error occurred while changing the PDF metadata." + }, + "tooltip": { + "header": { + "title": "PDF Metadata Overview" + }, + "standardFields": { + "title": "Standard Fields", + "text": "Common PDF metadata fields that describe the document.", + "bullet1": "Title: Document name or heading", + "bullet2": "Author: Person who created the document", + "bullet3": "Subject: Brief description of content", + "bullet4": "Keywords: Search terms for the document", + "bullet5": "Creator/Producer: Software used to create the PDF" + }, + "dates": { + "title": "Date Fields", + "text": "When the document was created and modified.", + "bullet1": "Creation Date: When original document was made", + "bullet2": "Modification Date: When last changed" + }, + "options": { + "title": "Additional Options", + "text": "Custom fields and privacy controls.", + "bullet1": "Custom Metadata: Add your own key-value pairs", + "bullet2": "Trapped Status: High-quality printing setting", + "bullet3": "Delete All: Remove all metadata for privacy" + }, + "deleteAll": { + "title": "Remove Existing Metadata", + "text": "Complete metadata deletion to ensure privacy." + }, + "customFields": { + "title": "Custom Metadata", + "text": "Add your own custom key-value metadata pairs.", + "bullet1": "Add any custom fields relevant to your document", + "bullet2": "Examples: Department, Project, Version, Status", + "bullet3": "Both key and value are required for each entry" + }, + "advanced": { + "title": "Advanced Options", + "trapped": { + "title": "Trapped Status", + "description": "Indicates if document is prepared for high-quality printing.", + "bullet1": "True: Document has been trapped for printing", + "bullet2": "False: Document has not been trapped", + "bullet3": "Unknown: Trapped status is not specified" + } + } + }, + "tags": "ĐˇĐ°ĐŗĐžĐģОвОĐē,Đ°Đ˛Ņ‚ĐžŅ€,Đ´Đ°Ņ‚Đ°,ŅŅ‚Đ˛ĐžŅ€ĐĩĐŊĐŊŅ,Ņ‡Đ°Ņ,видавĐĩŅ†ŅŒ,Đ˛Đ¸Ņ€ĐžĐąĐŊиĐē,ŅŅ‚Đ°Ņ‚Đ¸ŅŅ‚Đ¸Đēа", "selectText": { "1": "Đ‘ŅƒĐ´ŅŒ ĐģĐ°ŅĐēа, Đ˛Ņ–Đ´Ņ€ĐĩĐ´Đ°ĐŗŅƒĐšŅ‚Đĩ СĐŧŅ–ĐŊĐŊŅ–, ŅĐēŅ– ви Ņ…ĐžŅ‡ĐĩŅ‚Đĩ СĐŧŅ–ĐŊĐ¸Ņ‚Đ¸", "2": "ВидаĐģĐ¸Ņ‚Đ¸ Đ˛ŅŅ– ĐŧĐĩŅ‚Đ°Đ´Đ°ĐŊŅ–", @@ -856,15 +1877,7 @@ "4": "ІĐŊŅˆŅ– ĐŧĐĩŅ‚Đ°Đ´Đ°ĐŊŅ–:", "5": "Đ”ĐžĐ´Đ°Ņ‚Đ¸ ĐēĐžŅ€Đ¸ŅŅ‚ŅƒĐ˛Đ°Ņ†ŅŒĐēиК СаĐŋĐ¸Ņ ĐŧĐĩŅ‚Đ°Đ´Đ°ĐŊĐ¸Ņ…" }, - "author": "ĐĐ˛Ņ‚ĐžŅ€:", - "creationDate": "Đ”Đ°Ņ‚Đ° ŅŅ‚Đ˛ĐžŅ€ĐĩĐŊĐŊŅ (yyyy/MM/dd HH:mm:ss):", - "creator": "ĐĄŅ‚Đ˛ĐžŅ€ŅŽĐ˛Đ°Ņ‡:", - "keywords": "КĐģŅŽŅ‡ĐžĐ˛Ņ– ҁĐģОва:", - "modDate": "Đ”Đ°Ņ‚Đ° СĐŧŅ–ĐŊи (yyyy/MM/dd HH:mm:ss):", - "producer": "Đ’Đ¸Ņ€ĐžĐąĐŊиĐē:", - "subject": "ĐĸĐĩĐŧа:", - "trapped": "ĐŸĐ°ŅŅ‚Đēа:", - "submit": "ЗĐŧŅ–ĐŊĐ¸Ņ‚Đ¸" + "modDate": "Đ”Đ°Ņ‚Đ° СĐŧŅ–ĐŊи (yyyy/MM/dd HH:mm:ss):" }, "fileToPDF": { "tags": "ĐŋĐĩŅ€ĐĩŅ‚Đ˛ĐžŅ€ĐĩĐŊĐŊŅ,Ņ„ĐžŅ€ĐŧĐ°Ņ‚,Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚,ĐēĐ°Ņ€Ņ‚Đ¸ĐŊĐēа,ĐŋŅ€ĐĩСĐĩĐŊŅ‚Đ°Ņ†Ņ–Ņ,Ņ‚ĐĩĐēҁ҂,ĐēĐžĐŊвĐĩŅ€Ņ‚Đ°Ņ†Ņ–Ņ,ĐžŅ„Ņ–Ņ,Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ¸,word,excel,powerpoint", @@ -878,6 +1891,7 @@ "ocr": { "tags": "Ņ€ĐžĐˇĐŋŅ–ĐˇĐŊаваĐŊĐŊŅ,Ņ‚ĐĩĐēҁ҂,ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊĐŊŅ,ҁĐēаĐŊŅƒĐ˛Đ°ĐŊĐŊŅ,Ņ‡Đ¸Ņ‚Đ°ĐŊĐŊŅ,Ņ–Đ´ĐĩĐŊŅ‚Đ¸Ņ„Ņ–ĐēĐ°Ņ†Ņ–Ņ,Đ˛Đ¸ŅĐ˛ĐģĐĩĐŊĐŊŅ,Ņ€ĐĩĐ´Đ°ĐŗĐžĐ˛Đ°ĐŊиК", "title": "OCR/ĐžŅ‡Đ¸Ņ‰ĐĩĐŊĐŊŅ ҁĐēаĐŊŅƒĐ˛Đ°ĐŊĐŊŅ", + "desc": "ĐžŅ‡Đ¸Ņ‰ĐĩĐŊĐŊŅ ҁĐēаĐŊŅƒĐ˛Đ°ĐŊĐŊŅ Ņ‚Đ° Đ˛Đ¸ŅĐ˛ĐģĐĩĐŊĐŊŅ Ņ‚ĐĩĐēŅŅ‚Ņƒ ĐŊа ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊĐŊŅŅ… ҃ Ņ„Đ°ĐšĐģŅ– PDF Ņ‚Đ° ĐŋĐžĐ˛Ņ‚ĐžŅ€ĐŊĐĩ дОдаваĐŊĐŊŅ ĐšĐžĐŗĐž ŅĐē Ņ‚ĐĩĐēҁ҂.", "header": "ĐžŅ‡Đ¸Ņ‰ĐĩĐŊĐŊŅ ҁĐēаĐŊŅƒĐ˛Đ°ĐŊĐŊŅ / OCR (Optical Character Recognition) РОСĐŋŅ–ĐˇĐŊаваĐŊĐŊŅ Ņ‚ĐĩĐēŅŅ‚Ņƒ", "selectText": { "1": "ВибĐĩŅ€Ņ–Ņ‚ŅŒ ĐŧОви, ŅĐēŅ– ĐŋОвиĐŊĐŊŅ– ĐąŅƒŅ‚Đ¸ Đ˛Đ¸ŅĐ˛ĐģĐĩĐŊŅ– ҃ PDF-Ņ„Đ°ĐšĐģŅ– (ĐŋĐĩŅ€ĐĩĐģҖ҇ĐĩĐŊŅ– ҂Җ, ŅĐēŅ– Đ˛Đ¸ŅĐ˛ĐģĐĩĐŊŅ– ĐŊа даĐŊиК ĐŧĐžĐŧĐĩĐŊŅ‚):", @@ -896,23 +1910,89 @@ "help": "ĐŸŅ€ĐžŅ‡Đ¸Ņ‚Đ°ĐšŅ‚Đĩ Ņ†ŅŽ Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ°Ņ†Ņ–ŅŽ ĐŋŅ€Đž Ņ‚Đĩ, ŅĐē виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ҆Đĩ Đ´ĐģŅ Ņ–ĐŊŅˆĐ¸Ņ… ĐŧОв Ņ–/айО виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐŊĐĩ в Đ´ĐžĐēĐĩҀҖ.", "credit": "ĐĻĐĩĐš ҁĐĩŅ€Đ˛Ņ–Ņ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅ” qpdf Ņ‚Đ° Tesseract Đ´ĐģŅ OCR.", "submit": "ĐžĐąŅ€ĐžĐąĐēа PDF С OCR", - "desc": "ĐžŅ‡Đ¸Ņ‰ĐĩĐŊĐŊŅ ҁĐēаĐŊŅƒĐ˛Đ°ĐŊĐŊŅ Ņ‚Đ° Đ˛Đ¸ŅĐ˛ĐģĐĩĐŊĐŊŅ Ņ‚ĐĩĐēŅŅ‚Ņƒ ĐŊа ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊĐŊŅŅ… ҃ Ņ„Đ°ĐšĐģŅ– PDF Ņ‚Đ° ĐŋĐžĐ˛Ņ‚ĐžŅ€ĐŊĐĩ дОдаваĐŊĐŊŅ ĐšĐžĐŗĐž ŅĐē Ņ‚ĐĩĐēҁ҂.", + "operation": { + "submit": "Process OCR and Review" + }, + "results": { + "title": "OCR Results" + }, + "languagePicker": { + "additionalLanguages": "Looking for additional languages?", + "viewSetupGuide": "View setup guide →" + }, "settings": { "title": "НаĐģĐ°ŅˆŅ‚ŅƒĐ˛Đ°ĐŊĐŊŅ", "ocrMode": { - "label": "Đ ĐĩĐļиĐŧ OCR" + "label": "Đ ĐĩĐļиĐŧ OCR", + "auto": "Auto (skip text layers)", + "force": "Force (re-OCR all, replace text)", + "strict": "Strict (abort if text found)" }, "languages": { - "label": "Мови" + "label": "Мови", + "placeholder": "Select languages" + }, + "compatibilityMode": { + "label": "Compatibility Mode" + }, + "advancedOptions": { + "label": "Processing Options", + "sidecar": "Create a text file", + "deskew": "Deskew pages", + "clean": "Clean input file", + "cleanFinal": "Clean final output" } }, "tooltip": { + "header": { + "title": "OCR Settings Overview" + }, "mode": { - "title": "Đ ĐĩĐļиĐŧ OCR" + "title": "Đ ĐĩĐļиĐŧ OCR", + "text": "Optical Character Recognition (OCR) helps you turn scanned or screenshotted pages into text you can search, copy, or highlight.", + "bullet1": "Auto skips pages that already contain text layers.", + "bullet2": "Force re-OCRs every page and replaces all the text.", + "bullet3": "Strict halts if any selectable text is found." }, "languages": { - "title": "Мови" + "title": "Мови", + "text": "Improve OCR accuracy by specifying the expected languages. Choose one or more languages to guide detection." + }, + "output": { + "title": "Output", + "text": "Decide how you want the text output formatted:", + "bullet1": "Searchable PDF embeds text behind the original image.", + "bullet2": "HOCR XML returns a structured machine-readable file.", + "bullet3": "Plain-text sidecar creates a separate .txt file with raw content." + }, + "advanced": { + "header": { + "title": "Advanced OCR Processing" + }, + "compatibility": { + "title": "Compatibility Mode", + "text": "Uses OCR 'sandwich PDF' mode: results in larger files, but more reliable with certain languages and older PDF software. By default we use hOCR for smaller, modern PDFs." + }, + "sidecar": { + "title": "Create Text File", + "text": "Generates a separate .txt file alongside the PDF containing all extracted text content for easy access and processing." + }, + "deskew": { + "title": "Deskew Pages", + "text": "Automatically corrects skewed or tilted pages to improve OCR accuracy. Useful for scanned documents that weren't perfectly aligned." + }, + "clean": { + "title": "Clean Input File", + "text": "Preprocesses the input by removing noise, enhancing contrast, and optimising the image for better OCR recognition before processing." + }, + "cleanFinal": { + "title": "Clean Final Output", + "text": "Post-processes the final PDF by removing OCR artefacts and optimising the text layer for better readability and smaller file size." + } } + }, + "error": { + "failed": "OCR operation failed" } }, "extractImages": { @@ -921,7 +2001,13 @@ "header": "Đ’Đ¸Ņ‚ŅĐŗĐŊŅƒŅ‚Đ¸ ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊĐŊŅ", "selectText": "ВибĐĩŅ€Ņ–Ņ‚ŅŒ Ņ„ĐžŅ€ĐŧĐ°Ņ‚ ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊĐŊŅ Đ´ĐģŅ ĐŋĐĩŅ€ĐĩŅ‚Đ˛ĐžŅ€ĐĩĐŊĐŊŅ Đ˛Đ¸Ņ‚ŅĐŗĐŊŅƒŅ‚Đ¸Ņ… ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊҌ ҃", "allowDuplicates": "ЗбĐĩŅ€Ņ–ĐŗĐ°Ņ‚Đ¸ Đ´ŅƒĐąĐģŅ–ĐēĐ°Ņ‚Đ¸ ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊҌ", - "submit": "Đ’Đ¸Ņ‚ŅĐŗĐŊŅƒŅ‚Đ¸" + "submit": "Đ’Đ¸Ņ‚ŅĐŗĐŊŅƒŅ‚Đ¸", + "settings": { + "title": "Settings" + }, + "error": { + "failed": "An error occurred while extracting images from the PDF." + } }, "pdfToPDFA": { "tags": "Đ°Ņ€Ņ…Ņ–Đ˛,Đ´ĐžĐ˛ĐŗĐžŅŅ‚Ņ€ĐžĐēОвиК,ŅŅ‚Đ°ĐŊĐ´Đ°Ņ€Ņ‚ĐŊиК,ĐēĐžĐŊвĐĩŅ€ŅŅ–Ņ,СйĐĩŅ€Ņ–ĐŗĐ°ĐŊĐŊŅ,ĐēĐžĐŊҁĐĩŅ€Đ˛Đ°Ņ†Ņ–Ņ", @@ -993,17 +2079,53 @@ }, "info": "Python ĐŊĐĩ Đ˛ŅŅ‚Đ°ĐŊОвĐģĐĩĐŊĐž. Đ’Ņ–ĐŊ ĐŊĐĩĐžĐąŅ…Ņ–Đ´ĐŊиК Ņ€ĐžĐąĐžŅ‚Đ¸." }, + "scannerImageSplit": { + "title": "Extracted Images", + "submit": "Extract Image Scans", + "error": { + "failed": "An error occurred while extracting image scans." + }, + "tooltip": { + "title": "Photo Splitter", + "whatThisDoes": "What this does", + "whatThisDoesDesc": "Automatically finds and extracts each photo from a scanned page or composite image—no manual cropping.", + "whenToUse": "When to use", + "useCase1": "Scan whole album pages in one go", + "useCase2": "Split flatbed batches into separate files", + "useCase3": "Break collages into individual photos", + "useCase4": "Pull photos from documents", + "quickFixes": "Quick fixes", + "problem1": "Photos not detected → increase Tolerance to 30-50", + "problem2": "Too many false detections → increase Minimum Area to 15,000-20,000", + "problem3": "Crops are too tight → increase Border Size to 5-10", + "problem4": "Tilted photos not straightened → lower Angle Threshold to ~5°", + "problem5": "Dust/noise boxes → increase Minimum Contour Area to 1000-2000", + "setupTips": "Setup tips", + "tip1": "Use a plain, light background", + "tip2": "Leave a small gap (≈1 cm) between photos", + "tip3": "Scan at 300-600 DPI", + "tip4": "Clean the scanner glass", + "headsUp": "Heads-up", + "headsUpDesc": "Overlapping photos or backgrounds very close in colour to the photos can reduce accuracy-try a lighter or darker background and leave more space." + } + }, "sign": { - "tags": "Đ°Đ˛Ņ‚ĐžŅ€Đ¸ĐˇŅƒĐ˛Đ°Ņ‚Đ¸,Ņ–ĐŊŅ–Ņ†Ņ–Đ°Đģи,ĐŊаĐŧаĐģŅŒĐžĐ˛Đ°ĐŊиК-ĐŋŅ–Đ´ĐŋĐ¸Ņ,Ņ‚ĐĩĐēŅŅ‚ĐžĐ˛Đ¸Đš-ĐŋŅ–Đ´ĐŋĐ¸Ņ,ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊĐŊŅ-ĐŋŅ–Đ´ĐŋĐ¸Ņ", "title": "ĐŸŅ–Đ´ĐŋĐ¸Ņ", "header": "ĐŸŅ–Đ´ĐŋĐ¸ŅĐ°Ņ‚Đ¸ PDF", "upload": "ЗаваĐŊŅ‚Đ°ĐļĐ¸Ņ‚Đ¸ ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊĐŊŅ", - "draw": "НаĐŧаĐģŅŽĐ˛Đ°Ņ‚Đ¸ ĐŋŅ–Đ´ĐŋĐ¸Ņ", - "text": "Đ’Đ˛Ņ–Đ´ Ņ‚ĐĩĐēŅŅ‚Ņƒ", + "draw": { + "title": "Draw your signature", + "clear": "Clear" + }, + "text": { + "name": "Signer Name", + "placeholder": "Enter your full name" + }, "clear": "ĐžŅ‡Đ¸ŅŅ‚Đ¸Ņ‚Đ¸", "add": "Đ”ĐžĐ´Đ°Ņ‚Đ¸", "saved": "ЗбĐĩŅ€ĐĩĐļĐĩĐŊŅ– ĐŋŅ–Đ´ĐŋĐ¸ŅĐ¸", "save": "ЗбĐĩŅ€ĐĩĐŗŅ‚Đ¸ ĐŋŅ–Đ´ĐŋĐ¸Ņ", + "applySignatures": "Apply Signatures", "personalSigs": "ĐžŅĐžĐąĐ¸ŅŅ‚Ņ– ĐŋŅ–Đ´ĐŋĐ¸ŅĐ¸", "sharedSigs": "Đ—Đ°ĐŗĐ°ĐģҌĐŊŅ– ĐŋŅ–Đ´ĐŋĐ¸ŅĐ¸", "noSavedSigs": "ЗбĐĩŅ€ĐĩĐļĐĩĐŊŅ– ĐŋŅ–Đ´ĐŋĐ¸ŅĐ¸ ĐŊĐĩ СĐŊаКдĐĩĐŊĐž", @@ -1015,42 +2137,179 @@ "previous": "ПоĐŋĐĩŅ€ĐĩĐ´ĐŊŅ ŅŅ‚ĐžŅ€Ņ–ĐŊĐēа", "maintainRatio": "ПĐĩŅ€ĐĩĐēĐģŅŽŅ‡Đ¸Ņ‚Đ¸ СйĐĩŅ€ĐĩĐļĐĩĐŊĐŊŅ ĐŋŅ€ĐžĐŋĐžŅ€Ņ†Ņ–Đš", "undo": "ĐĄĐēĐ°ŅŅƒĐ˛Đ°Ņ‚Đ¸", - "redo": "ĐŸĐžĐ˛Ņ‚ĐžŅ€Đ¸Ņ‚Đ¸" + "redo": "ĐŸĐžĐ˛Ņ‚ĐžŅ€Đ¸Ņ‚Đ¸", + "submit": "Sign Document", + "steps": { + "configure": "Configure Signature" + }, + "type": { + "title": "Signature Type", + "draw": "Draw", + "canvas": "Canvas", + "image": "Image", + "text": "Text" + }, + "image": { + "label": "Upload signature image", + "placeholder": "Select image file", + "hint": "Upload a PNG or JPG image of your signature" + }, + "instructions": { + "title": "How to add signature", + "canvas": "After drawing your signature in the canvas, close the modal then click anywhere on the PDF to place it.", + "image": "After uploading your signature image above, click anywhere on the PDF to place it.", + "text": "After entering your name above, click anywhere on the PDF to place your signature." + }, + "mode": { + "move": "Move Signature", + "place": "Place Signature" + }, + "updateAndPlace": "Update and Place", + "activate": "Activate Signature Placement", + "deactivate": "Stop Placing Signatures", + "results": { + "title": "Signature Results" + }, + "error": { + "failed": "An error occurred while signing the PDF." + }, + "tags": "Đ°Đ˛Ņ‚ĐžŅ€Đ¸ĐˇŅƒĐ˛Đ°Ņ‚Đ¸,Ņ–ĐŊŅ–Ņ†Ņ–Đ°Đģи,ĐŊаĐŧаĐģŅŒĐžĐ˛Đ°ĐŊиК-ĐŋŅ–Đ´ĐŋĐ¸Ņ,Ņ‚ĐĩĐēŅŅ‚ĐžĐ˛Đ¸Đš-ĐŋŅ–Đ´ĐŋĐ¸Ņ,ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊĐŊŅ-ĐŋŅ–Đ´ĐŋĐ¸Ņ" }, "flatten": { - "tags": "flatten,ŅŅ‚Đ°Ņ‚Đ¸Ņ‡ĐŊиК,Đ´ĐĩСаĐēŅ‚Đ¸Đ˛ŅƒĐ˛Đ°Ņ‚Đ¸,ĐŊĐĩŅ–ĐŊŅ‚ĐĩŅ€Đ°ĐēŅ‚Đ¸Đ˛ĐŊиК, ҃ĐŋĐžŅ€ŅĐ´ĐēŅƒĐ˛Đ°Ņ‚Đ¸", "title": "Đ—ĐŗĐģадĐļŅƒĐ˛Đ°ĐŊĐŊŅ", "header": "Đ—ĐŗĐģадĐļŅƒĐ˛Đ°ĐŊĐŊŅ PDF", "flattenOnlyForms": "Đ—ĐŗĐģĐ°Đ´Đ¸Ņ‚Đ¸ ҂ҖĐģҌĐēи Ņ„ĐžŅ€Đŧи", "submit": "Đ—ĐŗĐģĐ°Đ´Đ¸Ņ‚Đ¸", + "filenamePrefix": "flattened", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, "steps": { "settings": "НаĐģĐ°ŅˆŅ‚ŅƒĐ˛Đ°ĐŊĐŊŅ" }, "options": { - "flattenOnlyForms": "Đ—ĐŗĐģĐ°Đ´Đ¸Ņ‚Đ¸ ҂ҖĐģҌĐēи Ņ„ĐžŅ€Đŧи" - } + "stepTitle": "Flatten Options", + "title": "Flatten Options", + "flattenOnlyForms": { + "label": "Đ—ĐŗĐģĐ°Đ´Đ¸Ņ‚Đ¸ ҂ҖĐģҌĐēи Ņ„ĐžŅ€Đŧи", + "desc": "Only flatten form fields, leaving other interactive elements intact" + }, + "note": "Flattening removes interactive elements from the PDF, making them non-editable." + }, + "results": { + "title": "Flatten Results" + }, + "error": { + "failed": "An error occurred while flattening the PDF." + }, + "tooltip": { + "header": { + "title": "About Flattening PDFs" + }, + "description": { + "title": "What does flattening do?", + "text": "Flattening makes your PDF non-editable by turning fillable forms and buttons into regular text and images. The PDF will look exactly the same, but no one can change or fill in the forms anymore. Perfect for sharing completed forms, creating final documents for records, or ensuring the PDF looks the same everywhere.", + "bullet1": "Text boxes become regular text (can't be edited)", + "bullet2": "Checkboxes and buttons become pictures", + "bullet3": "Great for final versions you don't want changed", + "bullet4": "Ensures consistent appearance across all devices" + }, + "formsOnly": { + "title": "What does 'Flatten only forms' mean?", + "text": "This option only removes the ability to fill in forms, but keeps other features working like clicking links, viewing bookmarks, and reading comments.", + "bullet1": "Forms become non-editable", + "bullet2": "Links still work when clicked", + "bullet3": "Comments and notes remain visible", + "bullet4": "Bookmarks still help you navigate" + } + }, + "tags": "flatten,ŅŅ‚Đ°Ņ‚Đ¸Ņ‡ĐŊиК,Đ´ĐĩСаĐēŅ‚Đ¸Đ˛ŅƒĐ˛Đ°Ņ‚Đ¸,ĐŊĐĩŅ–ĐŊŅ‚ĐĩŅ€Đ°ĐēŅ‚Đ¸Đ˛ĐŊиК, ҃ĐŋĐžŅ€ŅĐ´ĐēŅƒĐ˛Đ°Ņ‚Đ¸" }, "repair": { "tags": "виĐŋŅ€Đ°Đ˛Đ¸Ņ‚Đ¸,Đ˛Ņ–Đ´ĐŊĐžĐ˛Đ¸Ņ‚Đ¸,виĐŋŅ€Đ°Đ˛Đ¸Ņ‚Đ¸,Đ˛Ņ–Đ´ĐŊĐžĐ˛Đ¸Ņ‚Đ¸", "title": "Đ ĐĩĐŧĐžĐŊŅ‚", "header": "Đ ĐĩĐŧĐžĐŊŅ‚ PDF", - "submit": "Đ ĐĩĐŧĐžĐŊŅ‚ŅƒĐ˛Đ°Ņ‚Đ¸" + "submit": "Đ ĐĩĐŧĐžĐŊŅ‚ŅƒĐ˛Đ°Ņ‚Đ¸", + "description": "This tool will attempt to repair corrupted or damaged PDF files. No additional settings are required.", + "filenamePrefix": "repaired", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst repairing the PDF." + }, + "results": { + "title": "Repair Results" + } }, "removeBlanks": { - "tags": "ĐžŅ‡Đ¸Ņ‰ĐĩĐŊĐŊŅ,҃ĐŋĐžŅ€ŅĐ´ĐēŅƒĐ˛Đ°ĐŊĐŊŅ,ĐąĐĩС вĐŧŅ–ŅŅ‚Ņƒ,҃ĐŋĐžŅ€ŅĐ´ĐēŅƒĐ˛Đ°ĐŊĐŊŅ", "title": "ВидаĐģĐ¸Ņ‚Đ¸ ĐŋĐžŅ€ĐžĐļĐŊŅ–", "header": "ВидаĐģĐ¸Ņ‚Đ¸ ĐŋĐžŅ€ĐžĐļĐŊŅ– ŅŅ‚ĐžŅ€Ņ–ĐŊĐēи", - "threshold": "ĐŸĐžŅ€Ņ–Đŗ:", + "settings": { + "title": "Settings" + }, + "threshold": { + "label": "Pixel Whiteness Threshold" + }, + "whitePercent": { + "label": "White Percentage Threshold", + "unit": "%" + }, + "includeBlankPages": { + "label": "Include detected blank pages" + }, + "tooltip": { + "header": { + "title": "Remove Blank Pages Settings" + }, + "threshold": { + "title": "Pixel Whiteness Threshold", + "text": "Controls how white a pixel must be to be considered 'white'. This helps determine what counts as a blank area on the page.", + "bullet1": "0 = Pure black (most restrictive)", + "bullet2": "128 = Medium grey", + "bullet3": "255 = Pure white (least restrictive)" + }, + "whitePercent": { + "title": "White Percentage Threshold", + "text": "Sets the minimum percentage of white pixels required for a page to be considered blank and removed.", + "bullet1": "Lower values (e.g., 80%) = More pages removed", + "bullet2": "Higher values (e.g., 95%) = Only very blank pages removed", + "bullet3": "Use higher values for documents with light backgrounds" + }, + "includeBlankPages": { + "title": "Include Detected Blank Pages", + "text": "When enabled, creates a separate PDF containing all the blank pages that were detected and removed from the original document.", + "bullet1": "Useful for reviewing what was removed", + "bullet2": "Helps verify the detection accuracy", + "bullet3": "Can be disabled to reduce output file size" + } + }, + "submit": "ВидаĐģĐ¸Ņ‚Đ¸ ĐŋĐžŅ€ĐžĐļĐŊŅ–", + "error": { + "failed": "Failed to remove blank pages" + }, + "results": { + "title": "Removed Blank Pages" + }, + "tags": "ĐžŅ‡Đ¸Ņ‰ĐĩĐŊĐŊŅ,҃ĐŋĐžŅ€ŅĐ´ĐēŅƒĐ˛Đ°ĐŊĐŊŅ,ĐąĐĩС вĐŧŅ–ŅŅ‚Ņƒ,҃ĐŋĐžŅ€ŅĐ´ĐēŅƒĐ˛Đ°ĐŊĐŊŅ", "thresholdDesc": "ĐŸĐžŅ€Ņ–Đŗ Đ´ĐģŅ виСĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ Ņ‚ĐžĐŗĐž, ĐŊĐ°ŅĐēŅ–ĐģҌĐēи ĐąŅ–ĐģиĐŧ ĐŧĐ°Ņ” ĐąŅƒŅ‚Đ¸ ĐąŅ–ĐģиК ĐŋŅ–ĐēҁĐĩĐģҌ", - "whitePercent": "Đ’Ņ–Đ´ŅĐžŅ‚ĐžĐē ĐąŅ–ĐģĐžĐŗĐž (%):", - "whitePercentDesc": "Đ—Đ°ĐŗĐ°ĐģҌĐŊиК Đ˛Ņ–Đ´ŅĐžŅ‚ĐžĐē ĐąŅ–ĐģĐžĐŗĐž ĐŊа ŅŅ‚ĐžŅ€Ņ–ĐŊ҆Җ, Đ´ĐģŅ видаĐģĐĩĐŊĐŊŅ", - "submit": "ВидаĐģĐ¸Ņ‚Đ¸ ĐŋĐžŅ€ĐžĐļĐŊŅ–" + "whitePercentDesc": "Đ—Đ°ĐŗĐ°ĐģҌĐŊиК Đ˛Ņ–Đ´ŅĐžŅ‚ĐžĐē ĐąŅ–ĐģĐžĐŗĐž ĐŊа ŅŅ‚ĐžŅ€Ņ–ĐŊ҆Җ, Đ´ĐģŅ видаĐģĐĩĐŊĐŊŅ" }, "removeAnnotations": { "tags": "ĐēĐžĐŧĐĩĐŊŅ‚Đ°Ņ€Ņ–,Đ˛Đ¸Đ´Ņ–ĐģĐĩĐŊĐŊŅ,ĐŋŅ€Đ¸ĐŧŅ–Ņ‚Đēи,Ņ€ĐžĐˇĐŧŅ–Ņ‚Đēа,видаĐģĐĩĐŊĐŊŅ", "title": "ВидаĐģĐ¸Ņ‚Đ¸ аĐŊĐžŅ‚Đ°Ņ†Ņ–Ņ—", "header": "ВидаĐģĐ¸Ņ‚Đ¸ аĐŊĐžŅ‚Đ°Ņ†Ņ–Ņ—", - "submit": "ВидаĐģĐ¸Ņ‚Đ¸" + "submit": "ВидаĐģĐ¸Ņ‚Đ¸", + "settings": { + "title": "Settings" + }, + "info": { + "title": "About Remove Annotations", + "description": "This tool will remove all annotations (comments, highlights, notes, etc.) from your PDF documents." + }, + "error": { + "failed": "An error occurred while removing annotations from the PDF." + } }, "compare": { "tags": "Đ´Đ¸Ņ„ĐĩŅ€ĐĩĐŊŅ†Ņ–Đ°Ņ†Ņ–Ņ,ĐēĐžĐŊŅ‚Ņ€Đ°ŅŅ‚,СĐŧŅ–ĐŊи,аĐŊаĐģŅ–Đˇ", @@ -1082,6 +2341,142 @@ "certSign": { "tags": "Đ°Đ˛Ņ‚ĐĩĐŊŅ‚Đ¸Ņ„Ņ–ĐēĐ°Ņ†Ņ–Ņ,pem,p12,ĐžŅ„Ņ–Ņ†Ņ–ĐšĐŊиК,ŅˆĐ¸Ņ„Ņ€ŅƒĐ˛Đ°ĐŊĐŊŅ", "title": "ĐŸŅ–Đ´ĐŋĐ¸Ņ ҁĐĩŅ€Ņ‚Đ¸Ņ„Ņ–ĐēĐ°Ņ‚ĐžĐŧ", + "filenamePrefix": "signed", + "signMode": { + "stepTitle": "Sign Mode", + "tooltip": { + "header": { + "title": "About PDF Signatures" + }, + "overview": { + "title": "How signatures work", + "text": "Both modes seal the document (any edits are flagged as tampering) and record who/when/how for auditing. Viewer trust depends on the certificate chain." + }, + "manual": { + "title": "Manual - Bring your certificate", + "text": "Use your own certificate files for brand-aligned identity. Can display Trusted when your CA/chain is recognised.", + "use": "Use for: customer-facing, legal, compliance." + }, + "auto": { + "title": "Auto - Zero-setup, instant system seal", + "text": "Signs with a server self-signed certificate. Same tamper-evident seal and audit trail; typically shows Unverified in viewers.", + "use": "Use when: you need speed and consistent internal identity across reviews and records." + }, + "rule": { + "title": "Rule of thumb", + "text": "Need recipient Trusted status? Manual. Need a fast, tamper-evident seal and audit trail with no setup? Auto." + } + } + }, + "certTypeStep": { + "stepTitle": "Certificate Format" + }, + "certFiles": { + "stepTitle": "Certificate Files" + }, + "appearance": { + "stepTitle": "Signature Appearance", + "tooltip": { + "header": { + "title": "About Signature Appearance" + }, + "invisible": { + "title": "Invisible Signatures", + "text": "The signature is added to the PDF for security but won't be visible when viewing the document. Perfect for legal requirements without changing the document's appearance.", + "bullet1": "Provides security without visual changes", + "bullet2": "Meets legal requirements for digital signing", + "bullet3": "Doesn't affect document layout or design" + }, + "visible": { + "title": "Visible Signatures", + "text": "Shows a signature block on the PDF with your name, date, and optional details. Useful when you want readers to clearly see the document is signed.", + "bullet1": "Shows signer name and date on the document", + "bullet2": "Can include reason and location for signing", + "bullet3": "Choose which page to place the signature", + "bullet4": "Optional logo can be included" + } + }, + "invisible": "Invisible", + "options": { + "title": "Signature Details" + }, + "visible": "Visible" + }, + "sign": { + "submit": "Sign PDF", + "results": "Signed PDF" + }, + "error": { + "failed": "An error occurred whilst processing signatures." + }, + "tooltip": { + "header": { + "title": "About Managing Signatures" + }, + "overview": { + "title": "What can this tool do?", + "text": "This tool lets you check if your PDFs are digitally signed and add new digital signatures. Digital signatures prove who created or approved a document and show if it has been changed since signing.", + "bullet1": "Check existing signatures and their validity", + "bullet2": "View detailed information about signers and certificates", + "bullet3": "Add new digital signatures to secure your documents", + "bullet4": "Multiple files supported with easy navigation" + }, + "validation": { + "title": "Checking Signatures", + "text": "When you check signatures, the tool tells you if they're valid, who signed the document, when it was signed, and whether the document has been changed since signing.", + "bullet1": "Shows if signatures are valid or invalid", + "bullet2": "Displays signer information and signing date", + "bullet3": "Checks if the document was modified after signing", + "bullet4": "Can use custom certificates for verification" + }, + "signing": { + "title": "Adding Signatures", + "text": "To sign a PDF, you need a digital certificate (like PEM, PKCS12, or JKS). You can choose to make the signature visible on the document or keep it invisible for security only.", + "bullet1": "Supports PEM, PKCS12, JKS, and server certificate formats", + "bullet2": "Option to show or hide signature on the PDF", + "bullet3": "Add reason, location, and signer name", + "bullet4": "Choose which page to place visible signatures", + "bullet5": "Use server certificate for simple 'Sign with Stirling-PDF' option" + } + }, + "certType": { + "tooltip": { + "header": { + "title": "About Certificate Types" + }, + "what": { + "title": "What's a certificate?", + "text": "It's a secure ID for your signature that proves you signed. Unless you're required to sign via certificate, we recommend using another secure method like Type, Draw, or Upload." + }, + "which": { + "title": "Which option should I use?", + "text": "Choose the format that matches your certificate file:", + "bullet1": "PKCS#12 (.p12 / .pfx) – one combined file (most common)", + "bullet2": "PFX (.pfx) – Microsoft's version of PKCS12", + "bullet3": "PEM – separate private-key and certificate .pem files", + "bullet4": "JKS – Java .jks keystore for dev / CI-CD workflows" + }, + "convert": { + "title": "Key not listed?", + "text": "Convert your file to a Java keystore (.jks) with keytool, then pick JKS." + } + } + }, + "chooseCertificate": "Choose Certificate File", + "chooseJksFile": "Choose JKS File", + "chooseP12File": "Choose PKCS12 File", + "choosePfxFile": "Choose PFX File", + "choosePrivateKey": "Choose Private Key File", + "location": "ĐœŅ–ŅŅ†ĐĩСĐŊĐ°Ņ…ĐžĐ´ĐļĐĩĐŊĐŊŅ", + "logoTitle": "Logo", + "name": "ІĐŧ'Ņ", + "noLogo": "No Logo", + "pageNumber": "Page Number", + "password": "ВвĐĩĐ´Ņ–Ņ‚ŅŒ ĐŋĐ°Ņ€ĐžĐģҌ Đ´Đž ŅŅ…ĐžĐ˛Đ¸Ņ‰Đ° ĐēĐģŅŽŅ‡Ņ–Đ˛ айО ĐžŅĐžĐąĐ¸ŅŅ‚ĐžĐŗĐž ĐēĐģŅŽŅ‡Đ° (ŅĐēŅ‰Đž Ņ”):", + "passwordOptional": "Leave empty if no password", + "reason": "ĐŸŅ€Đ¸Ņ‡Đ¸ĐŊа", + "serverCertMessage": "Using server certificate - no files or password required", + "showLogo": "ПоĐēĐ°ĐˇĐ°Ņ‚Đ¸ ĐģĐžĐŗĐžŅ‚Đ¸Đŋ", "header": "ĐŸŅ–Đ´ĐŋĐ¸ŅˆŅ–Ņ‚ŅŒ PDF ŅĐ˛ĐžŅ—Đŧ ҁĐĩŅ€Ņ‚Đ¸Ņ„Ņ–ĐēĐ°Ņ‚ĐžĐŧ (Ņ€ĐžĐąĐžŅ‚Đ° в ĐŋŅ€ĐžŅ†ĐĩҁҖ)", "selectPDF": "ВибĐĩŅ€Ņ–Ņ‚ŅŒ Ņ„Đ°ĐšĐģ PDF Đ´ĐģŅ ĐŋŅ–Đ´ĐŋĐ¸ŅŅƒ:", "jksNote": "ĐŸŅ€Đ¸ĐŧŅ–Ņ‚Đēа: Đ¯ĐēŅ‰Đž Đ˛Đ°Ņˆ Ņ‚Đ¸Đŋ ҁĐĩŅ€Ņ‚Đ¸Ņ„Ņ–ĐēĐ°Ņ‚Đ° ĐŊĐĩ СаСĐŊĐ°Ņ‡ĐĩĐŊиК ĐŊиĐļ҇Đĩ, ĐąŅƒĐ´ŅŒ ĐģĐ°ŅĐēа, ĐēĐžĐŊвĐĩŅ€Ņ‚ŅƒĐšŅ‚Đĩ ĐšĐžĐŗĐž в Ņ„Đ°ĐšĐģ ŅŅ…ĐžĐ˛Đ¸Ņ‰Đ° Java Keystore (.jks), виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅŽŅ‡Đ¸ ŅƒŅ‚Đ¸ĐģŅ–Ņ‚Ņƒ ĐēĐžĐŧаĐŊĐ´ĐŊĐžĐŗĐž Ņ€ŅĐ´Đēа keytool. ĐŸĐžŅ‚Ņ–Đŧ вийĐĩŅ€Ņ–Ņ‚ŅŒ ĐžĐŋŅ†Ņ–ŅŽ Ņ„Đ°ĐšĐģ҃ .jks ĐŊиĐļ҇Đĩ.", @@ -1089,13 +2484,7 @@ "selectCert": "ВибĐĩŅ€Ņ–Ņ‚ŅŒ Ņ„Đ°ĐšĐģ ҁĐĩŅ€Ņ‚Đ¸Ņ„Ņ–ĐēĐ°Ņ‚Đ° (Ņ„ĐžŅ€ĐŧĐ°Ņ‚ X.509, ĐŧĐžĐļĐĩ ĐąŅƒŅ‚Đ¸ .pem айО .der):", "selectP12": "ВибĐĩŅ€Ņ–Ņ‚ŅŒ Ņ„Đ°ĐšĐģ ŅŅ…ĐžĐ˛Đ¸Ņ‰Đ° ĐēĐģŅŽŅ‡Ņ–Đ˛ PKCS#12 (.p12 айО .pfx) (ĐŊĐĩОйОв'ŅĐˇĐēОвО, ŅĐēŅ‰Đž Đ˛Ņ–ĐŊ ĐŊадаĐŊиК, Đ˛Ņ–ĐŊ ĐŋОвиĐŊĐĩĐŊ ĐŧŅ–ŅŅ‚Đ¸Ņ‚Đ¸ Đ˛Đ°Ņˆ СаĐēŅ€Đ¸Ņ‚Đ¸Đš ĐēĐģŅŽŅ‡ Ņ– ҁĐĩŅ€Ņ‚Đ¸Ņ„Ņ–ĐēĐ°Ņ‚):", "selectJKS": "ВибĐĩŅ€Ņ–Ņ‚ŅŒ Ņ„Đ°ĐšĐģ ŅŅ…ĐžĐ˛Đ¸Ņ‰Đ° Java Keystore (.jks айО .keystore):", - "certType": "ĐĸиĐŋ ҁĐĩŅ€Ņ‚Đ¸Ņ„Ņ–ĐēĐ°Ņ‚Đ°", - "password": "ВвĐĩĐ´Ņ–Ņ‚ŅŒ ĐŋĐ°Ņ€ĐžĐģҌ Đ´Đž ŅŅ…ĐžĐ˛Đ¸Ņ‰Đ° ĐēĐģŅŽŅ‡Ņ–Đ˛ айО ĐžŅĐžĐąĐ¸ŅŅ‚ĐžĐŗĐž ĐēĐģŅŽŅ‡Đ° (ŅĐēŅ‰Đž Ņ”):", "showSig": "ПоĐēĐ°ĐˇĐ°Ņ‚Đ¸ ĐŋŅ–Đ´ĐŋĐ¸Ņ", - "reason": "ĐŸŅ€Đ¸Ņ‡Đ¸ĐŊа", - "location": "ĐœŅ–ŅŅ†ĐĩСĐŊĐ°Ņ…ĐžĐ´ĐļĐĩĐŊĐŊŅ", - "name": "ІĐŧ'Ņ", - "showLogo": "ПоĐēĐ°ĐˇĐ°Ņ‚Đ¸ ĐģĐžĐŗĐžŅ‚Đ¸Đŋ", "submit": "ĐŸŅ–Đ´ĐŋĐ¸ŅĐ°Ņ‚Đ¸ PDF" }, "removeCertSign": { @@ -1103,7 +2492,18 @@ "title": "ВидаĐģĐĩĐŊĐŊŅ ĐŋŅ–Đ´ĐŋĐ¸ŅŅƒ ҁĐĩŅ€Ņ‚Đ¸Ņ„Ņ–ĐēĐ°Ņ‚ĐžĐŧ", "header": "ВидаĐģĐĩĐŊĐŊŅ ĐŋŅ–Đ´ĐŋĐ¸ŅŅƒ ҁĐĩŅ€Ņ‚Đ¸Ņ„Ņ–ĐēĐ°Ņ‚ĐžĐŧ С PDF Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Ņƒ", "selectPDF": "ОбĐĩŅ€Ņ–Ņ‚ŅŒ PDF-Ņ„Đ°ĐšĐģ:", - "submit": "ВидаĐģĐ¸Ņ‚Đ¸ ĐŋŅ–Đ´ĐŋĐ¸Ņ" + "submit": "ВидаĐģĐ¸Ņ‚Đ¸ ĐŋŅ–Đ´ĐŋĐ¸Ņ", + "description": "This tool will remove digital certificate signatures from your PDF document.", + "filenamePrefix": "unsigned", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst removing certificate signatures." + }, + "results": { + "title": "Certificate Removal Results" + } }, "pageLayout": { "tags": "Ой'Ņ”Đ´ĐŊĐ°Ņ‚Đ¸,ҁĐēĐģĐ°ŅŅ‚Đ¸,Ņ”Đ´Đ¸ĐŊиК ĐŋĐĩŅ€ĐĩĐŗĐģŅĐ´,҃ĐŋĐžŅ€ŅĐ´ĐēŅƒĐ˛Đ°Ņ‚Đ¸", @@ -1111,16 +2511,157 @@ "header": "МĐŊĐžĐŗĐžŅŅ‚ĐžŅ€Ņ–ĐŊĐēОвиК ĐŧаĐēĐĩŅ‚", "pagesPerSheet": "ĐĄŅ‚ĐžŅ€Ņ–ĐŊĐžĐē ĐŊа ОдĐŊĐžĐŧ҃ Đ°Ņ€ĐēŅƒŅˆŅ–:", "addBorder": "Đ”ĐžĐ´Đ°Ņ‚Đ¸ Ņ€Đ°ĐŧĐēи", - "submit": "Đ’Ņ–Đ´ĐŋŅ€Đ°Đ˛Đ¸Ņ‚Đ¸" + "submit": "Đ’Ņ–Đ´ĐŋŅ€Đ°Đ˛Đ¸Ņ‚Đ¸", + "desc": { + "2": "Place 2 pages side-by-side on a single sheet.", + "3": "Place 3 pages on a single sheet in a single row.", + "4": "Place 4 pages on a single sheet (2 × 2 grid).", + "9": "Place 9 pages on a single sheet (3 × 3 grid).", + "16": "Place 16 pages on a single sheet (4 × 4 grid)." + }, + "error": { + "failed": "An error occurred while creating the multi-page layout." + } + }, + "bookletImposition": { + "tags": "booklet,imposition,printing,binding,folding,signature", + "title": "Booklet Imposition", + "header": "Booklet Imposition", + "submit": "Create Booklet", + "spineLocation": { + "label": "Spine Location", + "left": "Left (Standard)", + "right": "Right (RTL)" + }, + "doubleSided": { + "label": "Double-sided printing", + "tooltip": "Creates both front and back sides for proper booklet printing" + }, + "manualDuplex": { + "title": "Manual Duplex Mode", + "instructions": "For printers without automatic duplex. You'll need to run this twice:" + }, + "duplexPass": { + "label": "Print Pass", + "first": "1st Pass", + "second": "2nd Pass", + "firstInstructions": "Prints front sides → stack face-down → run again with 2nd Pass", + "secondInstructions": "Load printed stack face-down → prints back sides" + }, + "rtlBinding": { + "label": "Right-to-left binding", + "tooltip": "For Arabic, Hebrew, or other right-to-left languages" + }, + "addBorder": { + "label": "Add borders around pages", + "tooltip": "Adds borders around each page section to help with cutting and alignment" + }, + "addGutter": { + "label": "Add gutter margin", + "tooltip": "Adds inner margin space for binding" + }, + "gutterSize": { + "label": "Gutter size (points)" + }, + "flipOnShortEdge": { + "label": "Flip on short edge (automatic duplex only)", + "tooltip": "Enable for short-edge duplex printing (automatic duplex only - ignored in manual mode)", + "manualNote": "Not needed in manual mode - you flip the stack yourself" + }, + "advanced": { + "toggle": "Advanced Options" + }, + "paperSizeNote": "Paper size is automatically derived from your first page.", + "tooltip": { + "header": { + "title": "Booklet Creation Guide" + }, + "description": { + "title": "What is Booklet Imposition?", + "text": "Creates professional booklets by arranging pages in the correct printing order. Your PDF pages are placed 2-up on landscape sheets so when folded and bound, they read in proper sequence like a real book." + }, + "example": { + "title": "Example: 8-Page Booklet", + "text": "Your 8-page document becomes 2 sheets:", + "bullet1": "Sheet 1 Front: Pages 8, 1 | Back: Pages 2, 7", + "bullet2": "Sheet 2 Front: Pages 6, 3 | Back: Pages 4, 5", + "bullet3": "When folded & stacked: Reads 1→2→3→4→5→6→7→8" + }, + "printing": { + "title": "How to Print & Assemble", + "text": "Follow these steps for perfect booklets:", + "bullet1": "Print double-sided with 'Flip on long edge'", + "bullet2": "Stack sheets in order, fold in half", + "bullet3": "Staple or bind along the folded spine", + "bullet4": "For short-edge printers: Enable 'Flip on short edge' option" + }, + "manualDuplex": { + "title": "Manual Duplex (Single-sided Printers)", + "text": "For printers without automatic duplex:", + "bullet1": "Turn OFF 'Double-sided printing'", + "bullet2": "Select '1st Pass' → Print → Stack face-down", + "bullet3": "Select '2nd Pass' → Load stack → Print backs", + "bullet4": "Fold and assemble as normal" + }, + "advanced": { + "title": "Advanced Options", + "text": "Fine-tune your booklet:", + "bullet1": "Right-to-Left Binding: For Arabic, Hebrew, or RTL languages", + "bullet2": "Borders: Shows cut lines for trimming", + "bullet3": "Gutter Margin: Adds space for binding/stapling", + "bullet4": "Short-edge Flip: Only for automatic duplex printers" + } + }, + "error": { + "failed": "An error occurred while creating the booklet imposition." + } }, "scalePages": { - "tags": "СĐŧŅ–ĐŊĐ¸Ņ‚Đ¸ Ņ€ĐžĐˇĐŧŅ–Ņ€,СĐŧŅ–ĐŊĐ¸Ņ‚Đ¸,Ņ€ĐžĐˇĐŧŅ–Ņ€,адаĐŋŅ‚ŅƒĐ˛Đ°Ņ‚Đ¸", "title": "Đ’Ņ–Đ´Ņ€ĐĩĐŗŅƒĐģŅŽĐ˛Đ°Ņ‚Đ¸ ĐŧĐ°ŅŅˆŅ‚Đ°Đą ŅŅ‚ĐžŅ€Ņ–ĐŊĐēи", "header": "Đ’Ņ–Đ´Ņ€ĐĩĐŗŅƒĐģŅŽĐ˛Đ°Ņ‚Đ¸ ĐŧĐ°ŅŅˆŅ‚Đ°Đą ŅŅ‚ĐžŅ€Ņ–ĐŊĐēи", "pageSize": "РОСĐŧŅ–Ņ€ ŅŅ‚ĐžŅ€Ņ–ĐŊĐēи Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ°.", "keepPageSize": "ĐžŅ€Đ¸ĐŗŅ–ĐŊаĐģҌĐŊиК Ņ€ĐžĐˇĐŧŅ–Ņ€", "scaleFactor": "Đ Ņ–Đ˛ĐĩĐŊҌ ĐŧĐ°ŅŅˆŅ‚Đ°ĐąŅƒĐ˛Đ°ĐŊĐŊŅ (ĐžĐąŅ€Ņ–ĐˇĐēи) ŅŅ‚ĐžŅ€Ņ–ĐŊĐēи.", - "submit": "Đ’Ņ–Đ´ĐŋŅ€Đ°Đ˛Đ¸Ņ‚Đ¸" + "submit": "Đ’Ņ–Đ´ĐŋŅ€Đ°Đ˛Đ¸Ņ‚Đ¸", + "tags": "СĐŧŅ–ĐŊĐ¸Ņ‚Đ¸ Ņ€ĐžĐˇĐŧŅ–Ņ€,СĐŧŅ–ĐŊĐ¸Ņ‚Đ¸,Ņ€ĐžĐˇĐŧŅ–Ņ€,адаĐŋŅ‚ŅƒĐ˛Đ°Ņ‚Đ¸" + }, + "adjustPageScale": { + "tags": "resize,modify,dimension,adapt", + "title": "Adjust Page Scale", + "header": "Adjust Page Scale", + "scaleFactor": { + "label": "Scale Factor" + }, + "pageSize": { + "label": "Target Page Size", + "keep": "Keep Original Size", + "letter": "Letter", + "legal": "Legal" + }, + "submit": "Adjust Page Scale", + "error": { + "failed": "An error occurred while adjusting the page scale." + }, + "tooltip": { + "header": { + "title": "Page Scale Settings Overview" + }, + "description": { + "title": "Description", + "text": "Adjust the size of PDF content and change the page dimensions." + }, + "scaleFactor": { + "title": "Scale Factor", + "text": "Controls how large or small the content appears on the page. Content is scaled and centred - if scaled content is larger than the page size, it may be cropped.", + "bullet1": "1.0 = Original size", + "bullet2": "0.5 = Half size (50% smaller)", + "bullet3": "2.0 = Double size (200% larger, may crop)" + }, + "pageSize": { + "title": "Target Page Size", + "text": "Sets the dimensions of the output PDF pages. 'Keep Original Size' maintains current dimensions, whilst other options resize to standard paper sizes." + } + } }, "add-page-numbers": { "tags": "Ņ€ĐžĐˇĐąĐ¸Ņ‚Đ¸ ĐŊа ŅŅ‚ĐžŅ€Ņ–ĐŊĐēи,ĐŋОСĐŊĐ°Ņ‡Đ¸Ņ‚Đ¸,҃ĐŋĐžŅ€ŅĐ´ĐēŅƒĐ˛Đ°Ņ‚Đ¸,Ņ–ĐŊĐ´ĐĩĐēŅŅƒĐ˛Đ°Ņ‚Đ¸" @@ -1129,16 +2670,83 @@ "tags": "Đ°Đ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐĩ виСĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ,ĐŊа ĐžŅĐŊĐžĐ˛Ņ– ĐˇĐ°ĐŗĐžĐģОвĐēа,ĐžŅ€ĐŗĐ°ĐŊŅ–ĐˇĐ°Ņ†Ņ–Ņ,СĐŧŅ–ĐŊа ĐŧŅ–Ņ‚ĐžĐē", "title": "ĐĐ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐĩ ĐŋĐĩŅ€ĐĩĐšĐŧĐĩĐŊŅƒĐ˛Đ°ĐŊĐŊŅ", "header": "ĐĐ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐĩ ĐŋĐĩŅ€ĐĩĐšĐŧĐĩĐŊŅƒĐ˛Đ°ĐŊĐŊŅ PDF", - "submit": "ĐĐ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐĩ ĐŋĐĩŅ€ĐĩĐšĐŧĐĩĐŊŅƒĐ˛Đ°ĐŊĐŊŅ" + "description": "Automatically finds the title from your PDF content and uses it as the filename.", + "submit": "ĐĐ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐĩ ĐŋĐĩŅ€ĐĩĐšĐŧĐĩĐŊŅƒĐ˛Đ°ĐŊĐŊŅ", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst auto-renaming the PDF." + }, + "results": { + "title": "Auto-Rename Results" + }, + "tooltip": { + "header": { + "title": "How Auto-Rename Works" + }, + "howItWorks": { + "title": "Smart Renaming", + "text": "Automatically finds the title from your PDF content and uses it as the filename.", + "bullet1": "Looks for text that appears to be a title or heading", + "bullet2": "Creates a clean, valid filename from the detected title", + "bullet3": "Keeps the original name if no suitable title is found" + } + } }, "adjust-contrast": { "tags": "ĐēĐžŅ€ĐĩĐēŅ†Ņ–Ņ ĐēĐžĐģŅŒĐžŅ€Ņƒ,ĐŊаĐģĐ°ŅˆŅ‚ŅƒĐ˛Đ°ĐŊĐŊŅ,СĐŧŅ–ĐŊа,ĐŋĐžĐēŅ€Đ°Ņ‰ĐĩĐŊĐŊŅ" }, "crop": { - "tags": "ĐžĐąŅ€Ņ–ĐˇĐ°Ņ‚Đ¸,СĐŧĐĩĐŊŅˆŅƒĐ˛Đ°Ņ‚Đ¸,Ņ€ĐĩĐ´Đ°ĐŗŅƒĐ˛Đ°Ņ‚Đ¸,Ņ„ĐžŅ€ĐŧŅƒĐ˛Đ°Ņ‚Đ¸", "title": "ĐžĐąŅ€Ņ–ĐˇĐ°Ņ‚Đ¸", "header": "ĐžĐąŅ€Ņ–ĐˇĐ°Ņ‚Đ¸ PDF-Ņ„Đ°ĐšĐģ", - "submit": "ĐĐ°Đ´Ņ–ŅĐģĐ°Ņ‚Đ¸" + "submit": "ĐĐ°Đ´Ņ–ŅĐģĐ°Ņ‚Đ¸", + "noFileSelected": "Select a PDF file to begin cropping", + "preview": { + "title": "Crop Area Selection" + }, + "reset": "Reset to full PDF", + "coordinates": { + "title": "Position and Size", + "x": { + "label": "X Position", + "desc": "Left edge (points)" + }, + "y": { + "label": "Y Position", + "desc": "Bottom edge (points)" + }, + "width": { + "label": "Width", + "desc": "Crop width (points)" + }, + "height": { + "label": "Height", + "desc": "Crop height (points)" + } + }, + "error": { + "invalidArea": "Crop area extends beyond PDF boundaries", + "failed": "Failed to crop PDF" + }, + "steps": { + "selectArea": "Select Crop Area" + }, + "tooltip": { + "title": "How to Crop PDFs", + "description": "Select the area to crop from your PDF by dragging and resizing the blue overlay on the thumbnail.", + "drag": "Drag the overlay to move the crop area", + "resize": "Drag the corner and edge handles to resize", + "precision": "Use coordinate inputs for precise positioning" + }, + "results": { + "title": "Crop Results" + }, + "automation": { + "info": "Enter crop coordinates in PDF points. Origin (0,0) is at bottom-left. These values will be applied to all PDFs processed in this automation.", + "reference": "Reference: A4 page is 595.28 × 841.89 points (210mm × 297mm). 1 inch = 72 points." + }, + "tags": "ĐžĐąŅ€Ņ–ĐˇĐ°Ņ‚Đ¸,СĐŧĐĩĐŊŅˆŅƒĐ˛Đ°Ņ‚Đ¸,Ņ€ĐĩĐ´Đ°ĐŗŅƒĐ˛Đ°Ņ‚Đ¸,Ņ„ĐžŅ€ĐŧŅƒĐ˛Đ°Ņ‚Đ¸" }, "autoSplitPDF": { "tags": "ĐŊа ĐžŅĐŊĐžĐ˛Ņ– qr,Đ˛Ņ–Đ´ĐžĐēŅ€ĐĩĐŧĐ¸Ņ‚Đ¸,ҁĐēаĐŊŅƒĐ˛Đ°Ņ‚Đ¸ ҁĐĩĐŗĐŧĐĩĐŊŅ‚,҃ĐŋĐžŅ€ŅĐ´ĐēŅƒĐ˛Đ°Ņ‚Đ¸", @@ -1221,24 +2829,124 @@ "downloadJS": "ЗаваĐŊŅ‚Đ°ĐļĐ¸Ņ‚Đ¸ JavaScript", "submit": "ПоĐēĐ°ĐˇĐ°Ņ‚Đ¸" }, - "autoRedact": { - "tags": "Ņ€ĐĩĐ´Đ°ĐŗŅƒĐ˛Đ°Ņ‚Đ¸,ĐŋŅ€Đ¸Ņ…ĐžĐ˛Đ°Ņ‚Đ¸,ĐˇĐ°Ņ‚ĐĩĐŧĐŊĐ¸Ņ‚Đ¸,Ņ‡ĐžŅ€ĐŊиК,ĐŧĐ°Ņ€ĐēĐĩŅ€,ĐŋŅ€Đ¸Ņ…ĐžĐ˛Đ°ĐŊĐž", - "title": "ĐĐ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐĩ Ņ€ĐĩĐ´Đ°ĐŗŅƒĐ˛Đ°ĐŊĐŊŅ", - "header": "ĐĐ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐĩ Ņ€ĐĩĐ´Đ°ĐŗŅƒĐ˛Đ°ĐŊĐŊŅ", - "colorLabel": "КоĐģŅ–Ņ€", - "textsToRedactLabel": "ĐĸĐĩĐēҁ҂ Đ´ĐģŅ ĐŋŅ€Đ¸Ņ…ĐžĐ˛ŅƒĐ˛Đ°ĐŊĐŊŅ (ĐēĐžĐļĐĩĐŊ Ņ€ŅĐ´ĐžĐē ĐžĐēŅ€ĐĩĐŧĐž)", - "textsToRedactPlaceholder": "ĐŊаĐŋŅ€Đ¸ĐēĐģад \\nКоĐŊŅ„Ņ–Đ´ĐĩĐŊŅ†Ņ–ĐšĐŊĐž \\nĐĻŅ–ĐģĐēĐžĐŧ Ņ‚Đ°Ņ”ĐŧĐŊĐž", - "useRegexLabel": "ВиĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ Ņ€ĐĩĐŗŅƒĐģŅŅ€ĐŊŅ– Đ˛Đ¸Ņ€Đ°ĐˇĐ¸", - "wholeWordSearchLabel": "ĐŸĐžŅˆŅƒĐē ҆ҖĐģĐ¸Ņ… ҁĐģŅ–Đ˛", - "customPaddingLabel": "Đ”ĐžĐ´Đ°Ņ‚ĐēОвĐĩ СаĐŋОвĐŊĐĩĐŊĐŊŅ Са ĐēĐžŅ€Đ¸ŅŅ‚ŅƒĐ˛Đ°Ņ†ŅŒĐēиĐŧ СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅĐŧ", - "convertPDFToImageLabel": "ПĐĩŅ€ĐĩŅ‚Đ˛ĐžŅ€Đ¸Ņ‚Đ¸ PDF в ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊĐŊŅ PDF (виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅ”Ņ‚ŅŒŅŅ Đ´ĐģŅ видаĐģĐĩĐŊĐŊŅ Ņ‚ĐĩĐēŅŅ‚Ņƒ ĐŋОСа ĐŧĐĩĐļаĐŧи)", - "submitButton": "ĐĐ°Đ´Ņ–ŅĐģĐ°Ņ‚Đ¸" - }, "redact": { "tags": "Ņ€ĐĩĐ´Đ°ĐŗŅƒĐ˛Đ°Ņ‚Đ¸,ĐŋŅ€Đ¸Ņ…ĐžĐ˛Đ°Ņ‚Đ¸,ĐˇĐ°Ņ‚ĐĩĐŧĐŊĐ¸Ņ‚Đ¸,Ņ‡ĐžŅ€ĐŊиК,ĐŧĐ°Ņ€ĐēĐĩŅ€,ĐŋŅ€Đ¸Ņ…ĐžĐ˛Đ°ĐŊĐž,Đ˛Ņ€ŅƒŅ‡ĐŊ҃", "title": "Đ ŅƒŅ‡ĐŊĐĩ Ņ€ĐĩĐ´Đ°ĐŗŅƒĐ˛Đ°ĐŊĐŊŅ", - "header": "Đ ŅƒŅ‡ĐŊĐĩ Ņ€ĐĩĐ´Đ°ĐŗŅƒĐ˛Đ°ĐŊĐŊŅ", "submit": "Đ ĐĩĐ´Đ°ĐŗŅƒĐ˛Đ°Ņ‚Đ¸", + "error": { + "failed": "An error occurred while redacting the PDF." + }, + "modeSelector": { + "title": "Redaction Method", + "mode": "Mode", + "automatic": "Automatic", + "automaticDesc": "Redact text based on search terms", + "manual": "Manual", + "manualDesc": "Click and drag to redact specific areas", + "manualComingSoon": "Manual redaction coming soon" + }, + "auto": { + "header": "Auto Redact", + "settings": { + "title": "Redaction Settings", + "advancedTitle": "Đ”ĐžĐ´Đ°Ņ‚ĐēОвĐĩ" + }, + "colorLabel": "Box Colour", + "wordsToRedact": { + "title": "Words to Redact", + "placeholder": "Enter a word", + "add": "Đ”ĐžĐ´Đ°Ņ‚Đ¸", + "examples": "Examples: Confidential, Top-Secret" + }, + "useRegexLabel": "Use Regex", + "wholeWordSearchLabel": "Whole Word Search", + "customPaddingLabel": "Custom Extra Padding", + "convertPDFToImageLabel": "Convert PDF to PDF-Image" + }, + "tooltip": { + "mode": { + "header": { + "title": "Redaction Method" + }, + "automatic": { + "title": "Automatic Redaction", + "text": "Automatically finds and redacts specified text throughout the document. Perfect for removing consistent sensitive information like names, addresses, or confidential markers." + }, + "manual": { + "title": "Manual Redaction", + "text": "Click and drag to manually select specific areas to redact. Gives you precise control over what gets redacted. (Coming soon)" + } + }, + "words": { + "header": { + "title": "Words to Redact" + }, + "description": { + "title": "Text Matching", + "text": "Enter words or phrases to find and redact in your document. Each word will be searched for separately." + }, + "bullet1": "Add one word at a time", + "bullet2": "Press Enter or click 'Add Another' to add", + "bullet3": "Click × to remove words", + "examples": { + "title": "Common Examples", + "text": "Typical words to redact include: bank details, email addresses, or specific names." + } + }, + "advanced": { + "header": { + "title": "Advanced Redaction Settings" + }, + "color": { + "title": "Box Colour & Padding", + "text": "Customise the appearance of redaction boxes. Black is standard, but you can choose any colour. Padding adds extra space around the found text." + }, + "regex": { + "title": "Use Regex", + "text": "Enable regular expressions for advanced pattern matching. Useful for finding phone numbers, emails, or complex patterns.", + "bullet1": "Example: \\d{4}-\\d{2}-\\d{2} to match any dates in YYYY-MM-DD format", + "bullet2": "Use with caution - test thoroughly" + }, + "wholeWord": { + "title": "Whole Word Search", + "text": "Only match complete words, not partial matches. 'John' won't match 'Johnson' when enabled." + }, + "convert": { + "title": "Convert to PDF-Image", + "text": "Converts the PDF to an image-based PDF after redaction. This ensures text behind redaction boxes is completely removed and unrecoverable." + } + } + }, + "manual": { + "header": "Manual Redaction", + "textBasedRedaction": "Text-based Redaction", + "pageBasedRedaction": "Page-based Redaction", + "convertPDFToImageLabel": "Convert PDF to PDF-Image (Used to remove text behind the box)", + "pageRedactionNumbers": { + "title": "ĐĄŅ‚ĐžŅ€Ņ–ĐŊĐēи", + "placeholder": "(ĐŊаĐŋŅ€Đ¸ĐēĐģад 1,2,8 айО 4,7,12-16 айО 2n-1)" + }, + "redactionColor": { + "title": "Redaction Colour" + }, + "export": "ЕĐēҁĐŋĐžŅ€Ņ‚", + "upload": "Upload", + "boxRedaction": "Box draw redaction", + "zoom": "Zoom", + "zoomIn": "Zoom in", + "zoomOut": "Zoom out", + "nextPage": "Next Page", + "previousPage": "Previous Page", + "toggleSidebar": "Toggle Sidebar", + "showThumbnails": "Show Thumbnails", + "showDocumentOutline": "Show Document Outline (double-click to expand/collapse all items)", + "showAttachments": "Show Attachments", + "showLayers": "Show Layers (double-click to reset all layers to the default state)", + "colourPicker": "Colour Picker", + "findCurrentOutlineItem": "Find current outline item", + "applyChanges": "Apply Changes" + }, + "header": "Đ ŅƒŅ‡ĐŊĐĩ Ņ€ĐĩĐ´Đ°ĐŗŅƒĐ˛Đ°ĐŊĐŊŅ", "textBasedRedaction": "Đ ĐĩĐ´Đ°ĐŗŅƒĐ˛Đ°ĐŊĐŊŅ ĐŊа ĐžŅĐŊĐžĐ˛Ņ– Ņ‚ĐĩĐēŅŅ‚Ņƒ", "pageBasedRedaction": "Đ ĐĩĐ´Đ°ĐŗŅƒĐ˛Đ°ĐŊĐŊŅ ĐŊа ĐžŅĐŊĐžĐ˛Ņ– ŅŅ‚ĐžŅ€Ņ–ĐŊĐžĐē", "convertPDFToImageLabel": "ПĐĩŅ€ĐĩŅ‚Đ˛ĐžŅ€Đ¸Ņ‚Đ¸ PDF ĐŊа PDF-ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊĐŊŅ (виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅ”Ņ‚ŅŒŅŅ Đ´ĐģŅ видаĐģĐĩĐŊĐŊŅ Ņ‚ĐĩĐēŅŅ‚Ņƒ Са Ņ€Đ°ĐŧĐēĐžŅŽ)", @@ -1264,22 +2972,7 @@ "showLayers": "ПоĐēĐ°ĐˇĐ°Ņ‚Đ¸ ŅˆĐ°Ņ€Đ¸ (ĐŋĐžĐ´Đ˛Ņ–ĐšĐŊĐĩ ĐēĐģĐ°Ņ†Đ°ĐŊĐŊŅ Đ´ĐģŅ ҁĐēидаĐŊĐŊŅ Đ˛ŅŅ–Ņ… ŅˆĐ°Ņ€Ņ–Đ˛ Đ´Đž ŅŅ‚Đ°ĐŊ҃ Са ҃ĐŧĐžĐ˛Ņ‡Đ°ĐŊĐŊŅĐŧ)", "colourPicker": "Đ’Đ¸ĐąŅ–Ņ€ ĐēĐžĐģŅŒĐžŅ€Ņƒ", "findCurrentOutlineItem": "ЗĐŊĐ°ĐšŅ‚Đ¸ ĐŋĐžŅ‚ĐžŅ‡ĐŊиК ĐĩĐģĐĩĐŧĐĩĐŊŅ‚ ŅŅ‚Ņ€ŅƒĐēŅ‚ŅƒŅ€Đ¸", - "applyChanges": "Đ—Đ°ŅŅ‚ĐžŅŅƒĐ˛Đ°Ņ‚Đ¸ СĐŧŅ–ĐŊи", - "auto": { - "settings": { - "advancedTitle": "Đ”ĐžĐ´Đ°Ņ‚ĐēОвĐĩ" - }, - "wordsToRedact": { - "add": "Đ”ĐžĐ´Đ°Ņ‚Đ¸" - } - }, - "manual": { - "pageRedactionNumbers": { - "title": "ĐĄŅ‚ĐžŅ€Ņ–ĐŊĐēи", - "placeholder": "(ĐŊаĐŋŅ€Đ¸ĐēĐģад 1,2,8 айО 4,7,12-16 айО 2n-1)" - }, - "export": "ЕĐēҁĐŋĐžŅ€Ņ‚" - } + "applyChanges": "Đ—Đ°ŅŅ‚ĐžŅŅƒĐ˛Đ°Ņ‚Đ¸ СĐŧŅ–ĐŊи" }, "tableExtraxt": { "tags": "csv,Đ˛Đ¸Đ´ĐžĐąŅƒŅ‚ĐžĐē Ņ‚Đ°ĐąĐģĐ¸Ņ†Ņ–,виĐģŅƒŅ‡ĐĩĐŊĐŊŅ,ĐēĐžĐŊвĐĩŅ€Ņ‚Đ°Ņ†Ņ–Ņ" @@ -1290,11 +2983,15 @@ "overlay-pdfs": { "tags": "ĐŊаĐēĐģадаĐŊĐŊŅ", "header": "НаĐēĐģадĐĩĐŊĐŊŅ Ņ„Đ°ĐšĐģŅ–Đ˛ PDF", + "title": "Overlay PDFs", + "desc": "Overlay one PDF on top of another", "baseFile": { "label": "ВибĐĩŅ€Ņ–Ņ‚ŅŒ ĐžŅĐŊОвĐŊиК Ņ„Đ°ĐšĐģ PDF" }, "overlayFiles": { - "label": "ВибĐĩŅ€Ņ–Ņ‚ŅŒ Ņ„Đ°ĐšĐģ(и) Đ´ĐģŅ ĐŊаĐēĐģадĐĩĐŊĐŊŅ" + "label": "ВибĐĩŅ€Ņ–Ņ‚ŅŒ Ņ„Đ°ĐšĐģ(и) Đ´ĐģŅ ĐŊаĐēĐģадĐĩĐŊĐŊŅ", + "placeholder": "Choose PDF(s)...", + "addMore": "Add more PDFs..." }, "mode": { "label": "ВибĐĩŅ€Ņ–Ņ‚ŅŒ Ņ€ĐĩĐļиĐŧ ĐŊаĐēĐģадĐĩĐŊĐŊŅ", @@ -1304,14 +3001,53 @@ }, "counts": { "label": "ĐšŅ–ĐģҌĐēŅ–ŅŅ‚ŅŒ ĐŊаĐēĐģадĐĩĐŊҌ (Đ´ĐģŅ Ņ€ĐĩĐļиĐŧ҃ С ҄ҖĐēŅĐžĐ˛Đ°ĐŊиĐŧ ĐŋĐžĐ˛Ņ‚ĐžŅ€ĐĩĐŊĐŊŅĐŧ)", - "placeholder": "ВвĐĩĐ´Ņ–Ņ‚ŅŒ ҇ĐĩŅ€ĐĩС ĐēĐžĐŧ҃ ĐēŅ–ĐģҌĐēŅ–ŅŅ‚ŅŒ ĐŋĐžĐ˛Ņ‚ĐžŅ€ĐĩĐŊҌ (ĐŊаĐŋŅ€Đ¸ĐēĐģад, 2,3,1)" + "placeholder": "ВвĐĩĐ´Ņ–Ņ‚ŅŒ ҇ĐĩŅ€ĐĩС ĐēĐžĐŧ҃ ĐēŅ–ĐģҌĐēŅ–ŅŅ‚ŅŒ ĐŋĐžĐ˛Ņ‚ĐžŅ€ĐĩĐŊҌ (ĐŊаĐŋŅ€Đ¸ĐēĐģад, 2,3,1)", + "item": "Count for file", + "noFiles": "Add overlay files to configure counts" }, "position": { "label": "ВибĐĩŅ€Ņ–Ņ‚ŅŒ ĐŋĐžĐˇĐ¸Ņ†Ņ–ŅŽ ĐŊаĐēĐģадĐĩĐŊĐŊŅ", "foreground": "Над ĐžŅĐŊОвĐŊиĐŧ", "background": "За ĐžŅĐŊОвĐŊиĐŧ" }, - "submit": "ĐĐ°Đ´Ņ–ŅĐģĐ°Ņ‚Đ¸" + "submit": "ĐĐ°Đ´Ņ–ŅĐģĐ°Ņ‚Đ¸", + "settings": { + "title": "Settings" + }, + "results": { + "title": "Overlay Results" + }, + "tooltip": { + "header": { + "title": "Overlay PDFs Overview" + }, + "description": { + "title": "Description", + "text": "Combine a base PDF with one or more overlay PDFs. Overlays can be applied page-by-page in different modes and placed in the foreground or background." + }, + "mode": { + "title": "Overlay Mode", + "text": "Choose how to distribute overlay pages across the base PDF pages.", + "sequential": "Sequential Overlay: Use pages from the first overlay PDF until it ends, then move to the next.", + "interleaved": "Interleaved Overlay: Take one page from each overlay in turn.", + "fixedRepeat": "Fixed Repeat Overlay: Take a set number of pages from each overlay before moving to the next. Use Counts to set the numbers." + }, + "position": { + "title": "Overlay Position", + "text": "Foreground places the overlay on top of the page. Background places it behind." + }, + "overlayFiles": { + "title": "Overlay Files", + "text": "Select one or more PDFs to overlay on the base. The order of these files affects how pages are applied in Sequential and Fixed Repeat modes." + }, + "counts": { + "title": "Counts (Fixed Repeat only)", + "text": "Provide a positive number for each overlay file showing how many pages to take before moving to the next. Required when mode is Fixed Repeat." + } + }, + "error": { + "failed": "An error occurred while overlaying PDFs." + } }, "split-by-sections": { "tags": "Ņ€ĐžĐˇĐ´Ņ–Đģ Ņ€ĐžĐˇĐ´Ņ–Đģ҃,Ņ€ĐžĐˇĐ´Ņ–ĐģĐĩĐŊĐŊŅ,ĐŊаĐģĐ°ŅˆŅ‚ŅƒĐ˛Đ°ĐŊĐŊŅ", @@ -1332,6 +3068,7 @@ "tags": "ŅˆŅ‚Đ°ĐŧĐŋ,Đ´ĐžĐ´Đ°Ņ‚Đ¸ ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊĐŊŅ,҆ĐĩĐŊŅ‚Ņ€Đ°ĐģҌĐŊĐĩ ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊĐŊŅ,Đ˛ĐžĐ´ŅĐŊиК СĐŊаĐē,pdf,Đ˛ŅŅ‚Đ°Đ˛Đ¸Ņ‚Đ¸,ĐŊаĐģĐ°ŅˆŅ‚ŅƒĐ˛Đ°Ņ‚Đ¸", "header": "ĐŸĐžŅŅ‚Đ°Đ˛Đ¸Ņ‚Đ¸ ĐŋĐĩŅ‡Đ°Ņ‚Đē҃ ĐŊа PDF", "title": "ĐŸĐžŅŅ‚Đ°Đ˛Đ¸Ņ‚Đ¸ ĐŋĐĩŅ‡Đ°Ņ‚Đē҃ ĐŊа PDF", + "stampSetup": "Stamp Setup", "stampType": "ĐĸиĐŋ ĐŋĐĩŅ‡Đ°Ņ‚Đēи", "stampText": "ĐĸĐĩĐēҁ҂ ĐŋĐĩŅ‡Đ°Ņ‚Đēи", "stampImage": "Đ—ĐžĐąŅ€Đ°ĐļĐĩĐŊĐŊŅ ĐŋĐĩŅ‡Đ°Ņ‚Đēи", @@ -1344,7 +3081,19 @@ "overrideY": "ПĐĩŅ€ĐĩвиСĐŊĐ°Ņ‡Đ¸Ņ‚Đ¸ ĐēĐžĐžŅ€Đ´Đ¸ĐŊĐ°Ņ‚Ņƒ Y", "customMargin": "ĐšĐžŅ€Đ¸ŅŅ‚ŅƒĐ˛Đ°Ņ†ŅŒĐēиК Đ˛Ņ–Đ´ŅŅ‚ŅƒĐŋ", "customColor": "ĐšĐžŅ€Đ¸ŅŅ‚ŅƒĐ˛Đ°Ņ†ŅŒĐēиК ĐēĐžĐģŅ–Ņ€ Ņ‚ĐĩĐēŅŅ‚Ņƒ", - "submit": "ĐĐ°Đ´Ņ–ŅĐģĐ°Ņ‚Đ¸" + "submit": "ĐĐ°Đ´Ņ–ŅĐģĐ°Ņ‚Đ¸", + "noStampSelected": "No stamp selected. Return to Step 1.", + "customPosition": "Drag the stamp to the desired location in the preview window.", + "error": { + "failed": "An error occurred while adding stamp to the PDF." + }, + "imageSize": "Image Size", + "margin": "Margin", + "positionAndFormatting": "Position & Formatting", + "quickPosition": "Select a position on the page to place the stamp.", + "results": { + "title": "Stamp Results" + } }, "removeImagePdf": { "tags": "видаĐģĐĩĐŊĐŊŅ ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊĐŊŅ,ĐžĐŋĐĩŅ€Đ°Ņ†Ņ–Ņ— ĐˇŅ– ŅŅ‚ĐžŅ€Ņ–ĐŊĐēаĐŧи,ҁĐĩŅ€Đ˛ĐĩŅ€ĐŊа Ņ‡Đ°ŅŅ‚Đ¸ĐŊа" @@ -1362,7 +3111,8 @@ "status": { "_value": "ĐĄŅ‚Đ°Ņ‚ŅƒŅ", "valid": "Đ”Ņ–ĐšĐŊа", - "invalid": "НĐĩĐ´Ņ–ĐšŅĐŊа" + "invalid": "НĐĩĐ´Ņ–ĐšŅĐŊа", + "complete": "Validation complete" }, "signer": "ĐŸŅ–Đ´ĐŋĐ¸ŅĐ°ĐŊŅ‚", "date": "Đ”Đ°Ņ‚Đ°", @@ -1389,40 +3139,122 @@ "version": "ВĐĩŅ€ŅŅ–Ņ", "keyUsage": "ВиĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊĐŊŅ ĐēĐģŅŽŅ‡Đ°", "selfSigned": "ХаĐŧĐžĐŋОдĐŋĐ¸ŅĐ°ĐŊĐŊŅ‹Đš", - "bits": "ĐąŅ–Ņ‚" + "bits": "ĐąŅ–Ņ‚", + "details": "Certificate Details" }, "signature": { "info": "ІĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–Ņ ĐŋŅ€Đž ĐŋŅ–Đ´ĐŋĐ¸ŅĐ¸", "_value": "ПодĐŋĐ¸ŅŅŒ", "mathValid": "ПодĐŋĐ¸ŅŅŒ ĐŧĐ°Ņ‚ĐĩĐŧĐ°Ņ‚Đ¸Ņ‡ĐĩҁĐēи ĐēĐžŅ€Ņ€ĐĩĐēŅ‚ĐŊа, НО:" }, - "selectCustomCert": "ĐšĐžŅ€Đ¸ŅŅ‚ŅƒĐ˛Đ°Ņ‡ŅŅŒĐēиК Ņ„Đ°ĐšĐģ ҁĐĩŅ€Ņ‚Đ¸Ņ„Ņ–ĐēĐ°Ņ‚Đ° X.509 (НĐĩОйОв'ŅĐˇĐēОвО)" - }, - "replace-color": { - "title": "ЗаĐŧŅ–ĐŊа-Ņ–ĐŊвĐĩŅ€ŅŅ–Ņ ĐēĐžĐģŅŒĐžŅ€Ņƒ", - "header": "ЗаĐŧŅ–ĐŊа-Ņ–ĐŊвĐĩŅ€ŅŅ–Ņ ĐēĐžĐģŅŒĐžŅ€Ņƒ PDF", - "selectText": { - "1": "ĐŸĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€Đ¸ СаĐŧŅ–ĐŊи айО Ņ–ĐŊвĐĩҀҁҖҗ ĐēĐžĐģŅŒĐžŅ€Ņƒ", - "2": "За СаĐŧĐžĐ˛Ņ‡ŅƒĐ˛Đ°ĐŊĐŊŅĐŧ (ĐēĐžĐģŅŒĐžŅ€Đ¸ Đ˛Đ¸ŅĐžĐēĐžĐŗĐž Ņ€ĐžĐˇĐŧĐ°Ņ—Ņ‚Ņ‚Ņ)", - "3": "ĐšĐžŅ€Đ¸ŅŅ‚ŅƒĐ˛Đ°ĐģҌĐŊĐ¸Ņ†ŅŒĐēŅ– (ĐŊĐ°ŅŅ‚Ņ€ĐžŅŽĐ˛Đ°ĐŊŅ– ĐēĐžĐģŅŒĐžŅ€Đ¸)", - "4": "ПовĐŊа Ņ–ĐŊвĐĩŅ€ŅŅ–Ņ (Ņ–ĐŊвĐĩŅ€Ņ‚ŅƒĐ˛Đ°Ņ‚Đ¸ Đ˛ŅŅ– ĐēĐžĐģŅŒĐžŅ€Đ¸)", - "5": "ĐŸĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€Đ¸ Đ˛Đ¸ŅĐžĐēĐžĐŗĐž Ņ€ĐžĐˇĐŧĐ°Ņ—Ņ‚Ņ‚Ņ", - "6": "ĐąŅ–ĐģиК Ņ‚ĐĩĐēҁ҂ ĐŊа Ņ‡ĐžŅ€ĐŊĐžĐŧ҃ Ņ‚ĐģŅ–", - "7": "Ņ‡ĐžŅ€ĐŊиК Ņ‚ĐĩĐēҁ҂ ĐŊа ĐąŅ–ĐģĐžĐŧ҃ Ņ‚ĐģŅ–", - "8": "ĐļĐžĐ˛Ņ‚Đ¸Đš Ņ‚ĐĩĐēҁ҂ ĐŊа Ņ‡ĐžŅ€ĐŊĐžĐŧ҃ Ņ‚ĐģŅ–", - "9": "СĐĩĐģĐĩĐŊиК Ņ‚ĐĩĐēҁ҂ ĐŊа Ņ‡ĐžŅ€ĐŊĐžĐŧ҃ Ņ‚ĐģŅ–", - "10": "Đ’Đ¸ĐąŅ€Đ°Ņ‚Đ¸ ĐēĐžĐģŅ–Ņ€ Ņ‚ĐĩĐēŅŅ‚Ņƒ", - "11": "Đ’Đ¸ĐąŅ€Đ°Ņ‚Đ¸ ĐēĐžĐģŅ–Ņ€ Ņ‚Đģа" + "selectCustomCert": "ĐšĐžŅ€Đ¸ŅŅ‚ŅƒĐ˛Đ°Ņ‡ŅŅŒĐēиК Ņ„Đ°ĐšĐģ ҁĐĩŅ€Ņ‚Đ¸Ņ„Ņ–ĐēĐ°Ņ‚Đ° X.509 (НĐĩОйОв'ŅĐˇĐēОвО)", + "downloadCsv": "Download CSV", + "downloadJson": "Download JSON", + "downloadPdf": "Download PDF Report", + "downloadType": { + "csv": "CSV", + "json": "JSON", + "pdf": "PDF" }, - "submit": "ЗаĐŧŅ–ĐŊĐ¸Ņ‚Đ¸" + "error": { + "allFailed": "Unable to validate the selected files.", + "partial": "Some files could not be validated.", + "reportGeneration": "Could not generate the PDF report. JSON and CSV are available.", + "unexpected": "Unexpected error during validation." + }, + "finalizing": "Preparing downloads...", + "issue": { + "certExpired": "Certificate expired", + "certRevocationUnknown": "Certificate revocation status unknown", + "certRevoked": "Certificate revoked", + "chainInvalid": "Certificate chain invalid", + "signatureInvalid": "Signature cryptographic check failed", + "trustInvalid": "Certificate not trusted" + }, + "noResults": "Run the validation to generate a report.", + "noSignaturesShort": "No signatures", + "processing": "Validating signatures...", + "report": { + "continued": "Continued", + "downloads": "Downloads", + "entryLabel": "Signature Summary", + "fields": { + "created": "Created", + "fileSize": "File Size", + "signatureCount": "Total Signatures", + "signatureDate": "Signature Date" + }, + "filesEvaluated": "{{count}} files evaluated", + "footer": "Validated via Stirling PDF", + "generatedAt": "Generated", + "noPdf": "PDF report will be available after a successful validation.", + "page": "Page", + "shortTitle": "Signature Summary", + "signatureCountLabel": "{{count}} signatures", + "signaturesFound": "{{count}} signatures detected", + "signaturesValid": "{{count}} fully valid", + "title": "Signature Validation Report" + }, + "settings": { + "certHint": "Upload a trusted X.509 certificate to validate against a custom trust source.", + "title": "Validation Settings" + }, + "signatureDate": "Signature Date", + "totalSignatures": "Total Signatures" }, - "replaceColorPdf": { - "tags": "ЗаĐŧŅ–ĐŊа ĐēĐžĐģŅŒĐžŅ€Ņƒ, ĐžĐŋĐĩŅ€Đ°Ņ†Ņ–Ņ— ĐˇŅ– ŅŅ‚ĐžŅ€Ņ–ĐŊĐēаĐŧи, ĐĄĐĩŅ€Đ˛ĐĩŅ€ĐŊа Ņ‡Đ°ŅŅ‚Đ¸ĐŊа" + "replaceColor": { + "tags": "Replace Colour,Page operations,Back end,server side", + "labels": { + "settings": "Settings", + "colourOperation": "Colour operation" + }, + "options": { + "highContrast": "High contrast", + "invertAll": "Invert all colours", + "custom": "Custom", + "cmyk": "Convert to CMYK" + }, + "tooltip": { + "header": { + "title": "Replace & Invert Colour Settings Overview" + }, + "description": { + "title": "Description", + "text": "Transform PDF colours to improve readability and accessibility. Choose from high contrast presets, invert all colours, or create custom colour schemes." + }, + "highContrast": { + "title": "High Contrast", + "text": "Apply predefined high contrast colour combinations designed for better readability and accessibility compliance.", + "bullet1": "White text on black background - Classic dark mode", + "bullet2": "Black text on white background - Standard high contrast", + "bullet3": "Yellow text on black background - High visibility option", + "bullet4": "Green text on black background - Alternative high contrast" + }, + "invertAll": { + "title": "Invert All Colours", + "text": "Completely invert all colours in the PDF, creating a negative-like effect. Useful for creating dark mode versions of documents or reducing eye strain in low-light conditions." + }, + "custom": { + "title": "Custom Colours", + "text": "Define your own text and background colours using the colour pickers. Perfect for creating branded documents or specific accessibility requirements.", + "bullet1": "Text colour - Choose the colour for text elements", + "bullet2": "Background colour - Set the background colour for the document" + }, + "cmyk": { + "title": "Convert to CMYK", + "text": "Convert the PDF from RGB colour space to CMYK colour space, optimized for professional printing. This process converts colours to the Cyan, Magenta, Yellow, Black model used by printers." + } + }, + "error": { + "failed": "An error occurred while processing the colour replacement." + } }, "login": { "title": "Đ’Ņ…Ņ–Đ´", "header": "Đ’Ņ…Ņ–Đ´", "signin": "ĐŖĐ˛Ņ–ĐšŅ‚Đ¸", + "signInWith": "Sign in with", + "signInAnonymously": "Sign Up as a Guest", "rememberme": "ЗаĐŋаĐŧ'ŅŅ‚Đ°Ņ‚Đ¸ ĐŧĐĩĐŊĐĩ", "invalid": "НĐĩĐ´Ņ–ĐšŅĐŊĐĩ Ņ–Đŧ'Ņ ĐēĐžŅ€Đ¸ŅŅ‚ŅƒĐ˛Đ°Ņ‡Đ° айО ĐŋĐ°Ņ€ĐžĐģҌ.", "locked": "Đ’Đ°Ņˆ ОйĐģŅ–ĐēОвиК СаĐŋĐ¸Ņ СайĐģĐžĐēОваĐŊĐž.", @@ -1441,12 +3273,83 @@ "alreadyLoggedIn": "Ви вĐļĐĩ ŅƒĐ˛Ņ–ĐšŅˆĐģи Đ´Đž", "alreadyLoggedIn2": "ĐŋŅ€Đ¸ŅŅ‚Ņ€ĐžŅ—Đ˛ (а). Đ‘ŅƒĐ´ŅŒ ĐģĐ°ŅĐēа, Đ˛Đ¸ĐšĐ´Ņ–Ņ‚ŅŒ Ņ–Đˇ Ņ†Đ¸Ņ… ĐŋŅ€Đ¸ŅŅ‚Ņ€ĐžŅ—Đ˛ Ņ– ҁĐŋŅ€ĐžĐąŅƒĐšŅ‚Đĩ СĐŊĐžĐ˛Ņƒ.", "toManySessions": "ĐŖ Đ˛Đ°Ņ Đ´ŅƒĐļĐĩ ĐąĐ°ĐŗĐ°Ņ‚Đž аĐēŅ‚Đ¸Đ˛ĐŊĐ¸Ņ… ҁĐĩŅŅ–Đš", - "logoutMessage": "You have been logged out." + "logoutMessage": "You have been logged out.", + "youAreLoggedIn": "You are logged in!", + "email": "Email", + "password": "Password", + "enterEmail": "Enter your email", + "enterPassword": "Enter your password", + "loggingIn": "Logging In...", + "username": "Username", + "enterUsername": "Enter username", + "useEmailInstead": "Login with email", + "forgotPassword": "Forgot your password?", + "logIn": "Log In", + "signingIn": "Signing in...", + "login": "Login", + "or": "Or", + "useMagicLink": "Use magic link instead", + "enterEmailForMagicLink": "Enter your email for magic link", + "sending": "Sendingâ€Ļ", + "sendMagicLink": "Send Magic Link", + "cancel": "Cancel", + "dontHaveAccount": "Don't have an account? Sign up", + "home": "Home", + "debug": "Debug", + "signOut": "Sign Out", + "pleaseEnterBoth": "Please enter both email and password", + "pleaseEnterEmail": "Please enter your email address", + "magicLinkSent": "Magic link sent to {{email}}! Check your email and click the link to sign in.", + "passwordResetSent": "Password reset link sent to {{email}}! Check your email and follow the instructions.", + "failedToSignIn": "Failed to sign in with {{provider}}: {{message}}", + "unexpectedError": "Unexpected error: {{message}}", + "accountCreatedSuccess": "Account created successfully! You can now sign in.", + "passwordChangedSuccess": "Password changed successfully! Please sign in with your new password.", + "credentialsUpdated": "Your credentials have been updated. Please sign in again." + }, + "signup": { + "title": "Create an account", + "subtitle": "Join Stirling PDF to get started", + "name": "Name", + "email": "Email", + "password": "Password", + "confirmPassword": "Confirm password", + "enterName": "Enter your name", + "enterEmail": "Enter your email", + "enterPassword": "Enter your password", + "confirmPasswordPlaceholder": "Confirm password", + "or": "or", + "creatingAccount": "Creating Account...", + "signUp": "Sign Up", + "alreadyHaveAccount": "Already have an account? Sign in", + "pleaseFillAllFields": "Please fill in all fields", + "passwordsDoNotMatch": "Passwords do not match", + "passwordTooShort": "Password must be at least 6 characters long", + "invalidEmail": "Please enter a valid email address", + "checkEmailConfirmation": "Check your email for a confirmation link to complete your registration.", + "accountCreatedSuccessfully": "Account created successfully! You can now sign in.", + "unexpectedError": "Unexpected error: {{message}}", + "useEmailInstead": "Use Email Instead", + "nameRequired": "Name is required", + "emailRequired": "Email is required", + "passwordRequired": "Password is required", + "confirmPasswordRequired": "Please confirm your password" }, "pdfToSinglePage": { "title": "PDF ĐŊа ОдĐŊ҃ ŅŅ‚ĐžŅ€Ņ–ĐŊĐē҃", "header": "PDF ĐŊа ОдĐŊ҃ ŅŅ‚ĐžŅ€Ņ–ĐŊĐē҃", - "submit": "ПĐĩŅ€ĐĩŅ‚Đ˛ĐžŅ€Đ¸Ņ‚Đ¸ ĐŊа ОдĐŊ҃ ŅŅ‚ĐžŅ€Ņ–ĐŊĐē҃" + "submit": "ПĐĩŅ€ĐĩŅ‚Đ˛ĐžŅ€Đ¸Ņ‚Đ¸ ĐŊа ОдĐŊ҃ ŅŅ‚ĐžŅ€Ņ–ĐŊĐē҃", + "description": "This tool will merge all pages of your PDF into one large single page. The width will remain the same as the original pages, but the height will be the sum of all page heights.", + "filenamePrefix": "single_page", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst converting to single page." + }, + "results": { + "title": "Single Page Results" + } }, "pageExtracter": { "title": "Đ’Đ¸Đ´ĐžĐąŅƒŅ‚Đ¸ ŅŅ‚ĐžŅ€Ņ–ĐŊĐēи", @@ -1470,18 +3373,59 @@ "adjustContrast": { "title": "НаĐģĐ°ŅˆŅ‚ŅƒĐ˛Đ°ĐŊĐŊŅ ĐēĐžĐŊŅ‚Ņ€Đ°ŅŅ‚ĐŊĐžŅŅ‚Ņ–", "header": "НаĐģĐ°ŅˆŅ‚ŅƒĐ˛Đ°ĐŊĐŊŅ ĐēĐžĐŊŅ‚Ņ€Đ°ŅŅ‚ĐŊĐžŅŅ‚Ņ–", + "basic": "Basic Adjustments", "contrast": "КоĐŊŅ‚Ņ€Đ°ŅŅ‚:", "brightness": "Đ¯ŅĐēŅ€Đ°Đ˛Ņ–ŅŅ‚ŅŒ:", "saturation": "ĐĐ°ŅĐ¸Ņ‡ĐĩĐŊŅ–ŅŅ‚ŅŒ:", - "download": "ЗаваĐŊŅ‚Đ°ĐļĐ¸Ņ‚Đ¸" + "download": "ЗаваĐŊŅ‚Đ°ĐļĐ¸Ņ‚Đ¸", + "adjustColors": "Adjust Colors", + "blue": "Blue", + "confirm": "Confirm", + "error": { + "failed": "Failed to adjust colors/contrast" + }, + "green": "Green", + "noPreview": "Select a PDF to preview", + "red": "Red", + "results": { + "title": "Adjusted PDF" + } }, "compress": { "title": "ĐĄŅ‚Đ¸ŅĐŊŅƒŅ‚Đ¸", + "desc": "Compress PDFs to reduce their file size.", "header": "ĐĄŅ‚Đ¸ŅĐŊŅƒŅ‚Đ¸ PDF", + "method": { + "title": "Compression Method", + "quality": "Quality", + "filesize": "РОСĐŧŅ–Ņ€ Ņ„Đ°ĐšĐģ҃" + }, "credit": "ĐĻŅ ҁĐģ҃Đļйа виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅ” qpdf Đ´ĐģŅ ŅŅ‚Đ¸ŅĐŊĐĩĐŊĐŊŅ/ĐžĐŋŅ‚Đ¸ĐŧŅ–ĐˇĐ°Ņ†Ņ–Ņ— PDF.", "grayscale": { "label": "Đ—Đ°ŅŅ‚ĐžŅŅƒĐ˛Đ°Ņ‚Đ¸ Đ˛Ņ–Đ´Ņ‚Ņ–ĐŊĐēи ŅŅ–Ņ€ĐžĐŗĐž Đ´ĐģŅ ŅŅ‚Đ¸ŅĐŊĐĩĐŊĐŊŅ" }, + "tooltip": { + "header": { + "title": "Compress Settings Overview" + }, + "description": { + "title": "Description", + "text": "Compression is an easy way to reduce your file size. Pick File Size to enter a target size and have us adjust quality for you. Pick Quality to set compression strength manually." + }, + "qualityAdjustment": { + "title": "Quality Adjustment", + "text": "Drag the slider to adjust the compression strength. Lower values (1-3) preserve quality but result in larger files. Higher values (7-9) shrink the file more but reduce image clarity.", + "bullet1": "Lower values preserve quality", + "bullet2": "Higher values reduce file size" + }, + "grayscale": { + "title": "Grayscale", + "text": "Select this option to convert all images to black and white, which can significantly reduce file size especially for scanned PDFs or image-heavy documents." + } + }, + "error": { + "failed": "An error occurred while compressing the PDF." + }, "selectText": { "1": { "_value": "ĐŸĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€Đ¸ ŅŅ‚Đ¸ŅĐŊĐĩĐŊĐŊŅ", @@ -1491,10 +3435,7 @@ "4": "ĐĐ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊиК Ņ€ĐĩĐļиĐŧ - Đ°Đ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐž ĐŊаĐģĐ°ŅˆŅ‚ĐžĐ˛ŅƒŅ” ŅĐēŅ–ŅŅ‚ŅŒ Đ´ĐģŅ ĐžŅ‚Ņ€Đ¸ĐŧаĐŊĐŊŅ PDF Ņ‚ĐžŅ‡ĐŊĐžĐŗĐž Ņ€ĐžĐˇĐŧŅ–Ņ€Ņƒ", "5": "ĐžŅ‡Ņ–ĐēŅƒĐ˛Đ°ĐŊиК Ņ€ĐžĐˇĐŧŅ–Ņ€ PDF (ĐŊаĐŋŅ€Đ¸ĐēĐģад, 25 МБ, 10,8 МБ, 25 КБ)" }, - "submit": "ĐĄŅ‚Đ¸ŅĐŊŅƒŅ‚Đ¸", - "method": { - "filesize": "РОСĐŧŅ–Ņ€ Ņ„Đ°ĐšĐģ҃" - } + "submit": "ĐĄŅ‚Đ¸ŅĐŊŅƒŅ‚Đ¸" }, "decrypt": { "passwordPrompt": "ĐĻĐĩĐš Ņ„Đ°ĐšĐģ ĐˇĐ°Ņ…Đ¸Ņ‰ĐĩĐŊиК ĐŋĐ°Ņ€ĐžĐģĐĩĐŧ. Đ‘ŅƒĐ´ŅŒ ĐģĐ°ŅĐēа, ввĐĩĐ´Ņ–Ņ‚ŅŒ ĐŋĐ°Ņ€ĐžĐģҌ:", @@ -1595,7 +3536,13 @@ "title": "ВидаĐģĐ¸Ņ‚Đ¸ ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊĐŊŅ", "header": "ВидаĐģĐ¸Ņ‚Đ¸ ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊĐŊŅ", "removeImage": "ВидаĐģĐ¸Ņ‚Đ¸ ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊĐŊŅ", - "submit": "ВидаĐģĐ¸Ņ‚Đ¸ ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊĐŊŅ" + "submit": "ВидаĐģĐ¸Ņ‚Đ¸ ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊĐŊŅ", + "error": { + "failed": "Failed to remove images from the PDF." + }, + "results": { + "title": "Remove Images Results" + } }, "splitByChapters": { "title": "Đ ĐžĐˇĐ´Ņ–ĐģĐ¸Ņ‚Đ¸ PDF ĐŋĐž ĐŗĐģаваĐŧ", @@ -1629,6 +3576,12 @@ }, "note": "ĐŸŅ€Đ¸ĐŧŅ–Ņ‚Đēа Đ´Đž Ņ€ĐĩĐģŅ–ĐˇŅƒ Đ´ĐžŅŅ‚ŅƒĐŋĐŊа ҂ҖĐģҌĐēи ĐŊа аĐŊĐŗĐģŅ–ĐšŅŅŒĐēŅ–Đš ĐŧĐžĐ˛Ņ–" }, + "swagger": { + "title": "API Documentation", + "header": "API Documentation", + "desc": "View and test the Stirling PDF API endpoints", + "tags": "api,documentation,swagger,endpoints,development" + }, "cookieBanner": { "popUp": { "title": "How we use Cookies", @@ -1664,54 +3617,943 @@ "title": "Analytics", "description": "These cookies help us understand how our tools are being used, so we can focus on building the features our community values most. Rest assured—Stirling PDF cannot and will never track the content of the documents you work with." } + }, + "services": { + "posthog": "PostHog Analytics", + "scarf": "Scarf Pixel" } }, - "download": "ЗаваĐŊŅ‚Đ°ĐļĐ¸Ņ‚Đ¸", - "undo": "ĐĄĐēĐ°ŅŅƒĐ˛Đ°Ņ‚Đ¸", - "convert": { - "title": "КоĐŊвĐĩŅ€Ņ‚ŅƒĐ˛Đ°Ņ‚Đ¸", - "settings": "НаĐģĐ°ŅˆŅ‚ŅƒĐ˛Đ°ĐŊĐŊŅ", - "color": "КоĐģŅ–Ņ€", - "greyscale": "Đ’Ņ–Đ´Ņ‚Ņ–ĐŊĐēи ŅŅ–Ņ€ĐžĐŗĐž", - "fillPage": "ЗаĐŋОвĐŊĐĩĐŊĐŊŅ ŅŅ‚ĐžŅ€Ņ–ĐŊĐēи", - "pdfaDigitalSignatureWarning": "ĐĻĐĩĐš PDF Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚ ĐŧĐ°Ņ” Ņ†Đ¸Ņ„Ņ€ĐžĐ˛Đ¸Đš ĐŋŅ–Đ´ĐŋĐ¸Ņ. ĐĻĐĩĐš ĐŋŅ–Đ´ĐŋĐ¸Ņ ĐąŅƒĐ´Đĩ видаĐģĐĩĐŊиК ҃ ĐŊĐ°ŅŅ‚ŅƒĐŋĐŊĐžĐŧ҃ ĐēŅ€ĐžŅ†Ņ–.", - "grayscale": "Đ’Ņ–Đ´Ņ‚Ņ–ĐŊĐēи ŅŅ–Ņ€ĐžĐŗĐž" + "removeMetadata": { + "submit": "Remove Metadata" }, - "attachments": { - "tags": "embed,attach,file,attachment,attachments", - "title": "Add attachments", - "header": "Add attachments", - "submit": "Add attachments" + "sidebar": { + "toggle": "Toggle Sidebar" + }, + "theme": { + "toggle": "Toggle Theme" + }, + "view": { + "viewer": "Viewer", + "pageEditor": "Page Editor", + "fileManager": "File Manager" + }, + "pageEditor": { + "title": "Page Editor", + "save": "Save Changes", + "noPdfLoaded": "No PDF loaded. Please upload a PDF to edit.", + "rotatedLeft": "Rotated left:", + "rotatedRight": "Rotated right:", + "deleted": "Deleted:", + "movedLeft": "Moved left:", + "movedRight": "Moved right:", + "splitAt": "Split at:", + "insertedPageBreak": "Inserted page break at:", + "addFileNotImplemented": "Add file not implemented in demo", + "closePdf": "Close PDF", + "reset": "Reset Changes", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "fitToWidth": "Fit to Width", + "actualSize": "Actual Size" + }, + "viewer": { + "firstPage": "First Page", + "lastPage": "Last Page", + "previousPage": "Previous Page", + "nextPage": "Next Page", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "singlePageView": "Single Page View", + "dualPageView": "Dual Page View" }, "rightRail": { + "closeSelected": "Close Selected Files", "selectAll": "Đ’Đ¸ĐąŅ€Đ°Ņ‚Đ¸ Đ˛ŅĐĩ", - "deselectAll": "ĐĄĐēĐ°ŅŅƒĐ˛Đ°Ņ‚Đ¸ Đ˛Đ¸ĐąŅ–Ņ€ ŅƒŅŅ–Ņ…" + "deselectAll": "ĐĄĐēĐ°ŅŅƒĐ˛Đ°Ņ‚Đ¸ Đ˛Đ¸ĐąŅ–Ņ€ ŅƒŅŅ–Ņ…", + "selectByNumber": "Select by Page Numbers", + "deleteSelected": "Delete Selected Pages", + "closePdf": "Close PDF", + "exportAll": "Export PDF", + "downloadSelected": "Download Selected Files", + "downloadAll": "Download All", + "toggleTheme": "Toggle Theme", + "language": "Language", + "search": "Search PDF", + "panMode": "Pan Mode", + "rotateLeft": "Rotate Left", + "rotateRight": "Rotate Right", + "toggleSidebar": "Toggle Sidebar", + "exportSelected": "Export Selected Pages", + "toggleAnnotations": "Toggle Annotations Visibility", + "annotationMode": "Toggle Annotation Mode", + "draw": "Draw", + "save": "Save" + }, + "search": { + "title": "Search PDF", + "placeholder": "Enter search term...", + "noResults": "No results found", + "searching": "Searching..." + }, + "guestBanner": { + "title": "You're using Stirling PDF as a guest!", + "message": "Create a free account to save your work, access more features, and support the project.", + "dismiss": "Dismiss banner", + "signUp": "Sign Up Free" + }, + "toolPicker": { + "searchPlaceholder": "Search tools...", + "noToolsFound": "No tools found", + "allTools": "ALL TOOLS", + "quickAccess": "QUICK ACCESS", + "categories": { + "standardTools": "Standard Tools", + "advancedTools": "Advanced Tools", + "recommendedTools": "Recommended Tools" + }, + "subcategories": { + "signing": "Signing", + "documentSecurity": "Document Security", + "verification": "Verification", + "documentReview": "Document Review", + "pageFormatting": "Page Formatting", + "extraction": "Extraction", + "removal": "Removal", + "automation": "Automation", + "general": "General", + "advancedFormatting": "Advanced Formatting", + "developerTools": "Developer Tools" + } }, "quickAccess": { - "sign": "ĐŸŅ–Đ´ĐŋĐ¸Ņ" + "read": "Read", + "sign": "ĐŸŅ–Đ´ĐŋĐ¸Ņ", + "automate": "Automate", + "files": "Files", + "activity": "Activity", + "help": "Help", + "account": "Account", + "config": "Config", + "adminSettings": "Admin Settings", + "allTools": "All Tools" + }, + "admin": { + "error": "Error", + "success": "Success", + "expand": "Expand", + "close": "Close", + "status": { + "active": "Active", + "inactive": "Inactive" + }, + "settings": { + "title": "Admin Settings", + "workspace": "Workspace", + "fetchError": "Failed to load settings", + "saveError": "Failed to save settings", + "saved": "Settings saved successfully", + "saveSuccess": "Settings saved successfully", + "save": "Save Changes", + "restartRequired": "Restart Required", + "restart": { + "title": "Restart Required", + "message": "Settings have been saved successfully. A server restart is required for the changes to take effect.", + "question": "Would you like to restart the server now or later?", + "now": "Restart Now", + "later": "Restart Later" + }, + "restarting": "Restarting Server", + "restartingMessage": "The server is restarting. Please wait a moment...", + "restartError": "Failed to restart server. Please restart manually.", + "general": { + "title": "System Settings", + "description": "Configure system-wide application settings including branding and default behaviour.", + "ui": "User Interface", + "system": "System", + "appName": { + "label": "Application Name", + "description": "The name displayed in the browser tab and home page" + }, + "appNameNavbar": { + "label": "Navbar Brand", + "description": "The name displayed in the navigation bar" + }, + "homeDescription": { + "label": "Home Description", + "description": "The description text shown on the home page" + }, + "defaultLocale": { + "label": "Default Locale", + "description": "The default language for new users (e.g., en_US, es_ES)" + }, + "fileUploadLimit": { + "label": "File Upload Limit", + "description": "Maximum file upload size (e.g., 100MB, 1GB)" + }, + "showUpdate": { + "label": "Show Update Notifications", + "description": "Display notifications when a new version is available" + }, + "showUpdateOnlyAdmin": { + "label": "Show Updates to Admins Only", + "description": "Restrict update notifications to admin users only" + }, + "customHTMLFiles": { + "label": "Custom HTML Files", + "description": "Allow serving custom HTML files from the customFiles directory" + }, + "languages": { + "label": "Available Languages", + "description": "Languages that users can select from (leave empty to enable all languages)" + }, + "customMetadata": { + "label": "Custom Metadata", + "autoUpdate": { + "label": "Auto Update Metadata", + "description": "Automatically update PDF metadata on all processed documents" + }, + "author": { + "label": "Default Author", + "description": "Default author for PDF metadata (e.g., username)" + }, + "creator": { + "label": "Default Creator", + "description": "Default creator for PDF metadata" + }, + "producer": { + "label": "Default Producer", + "description": "Default producer for PDF metadata" + } + }, + "customPaths": { + "label": "Custom Paths", + "description": "Configure custom file system paths for pipeline processing and external tools", + "pipeline": { + "label": "Pipeline Directories", + "watchedFoldersDir": { + "label": "Watched Folders Directory", + "description": "Directory where pipeline monitors for incoming PDFs (leave empty for default: /pipeline/watchedFolders)" + }, + "finishedFoldersDir": { + "label": "Finished Folders Directory", + "description": "Directory where processed PDFs are outputted (leave empty for default: /pipeline/finishedFolders)" + } + }, + "operations": { + "label": "External Tool Paths", + "weasyprint": { + "label": "WeasyPrint Executable", + "description": "Path to WeasyPrint executable for HTML to PDF conversion (leave empty for default: /opt/venv/bin/weasyprint)" + }, + "unoconvert": { + "label": "Unoconvert Executable", + "description": "Path to LibreOffice unoconvert for document conversions (leave empty for default: /opt/venv/bin/unoconvert)" + } + } + } + }, + "security": { + "title": "Security", + "description": "Configure authentication, login behaviour, and security policies.", + "ssoNotice": { + "title": "Looking for SSO/SAML settings?", + "message": "OAuth2 and SAML2 authentication providers have been moved to the Connections menu for easier management." + }, + "authentication": "Authentication", + "enableLogin": { + "label": "Enable Login", + "description": "Require users to log in before accessing the application" + }, + "loginMethod": { + "label": "Login Method", + "description": "The authentication method to use for user login", + "all": "All Methods", + "normal": "Username/Password Only", + "oauth2": "OAuth2 Only", + "saml2": "SAML2 Only" + }, + "loginAttemptCount": { + "label": "Login Attempt Limit", + "description": "Maximum number of failed login attempts before account lockout" + }, + "loginResetTimeMinutes": { + "label": "Login Reset Time (minutes)", + "description": "Time before failed login attempts are reset" + }, + "csrfDisabled": { + "label": "Disable CSRF Protection", + "description": "Disable Cross-Site Request Forgery protection (not recommended)" + }, + "initialLogin": { + "label": "Initial Login", + "username": { + "label": "Initial Username", + "description": "The username for the initial admin account" + }, + "password": { + "label": "Initial Password", + "description": "The password for the initial admin account" + } + }, + "jwt": { + "label": "JWT Configuration", + "secureCookie": { + "label": "Secure Cookie", + "description": "Require HTTPS for JWT cookies (recommended for production)" + }, + "keyRetentionDays": { + "label": "Key Retention Days", + "description": "Number of days to retain old JWT keys for verification" + }, + "persistence": { + "label": "Enable Key Persistence", + "description": "Store JWT keys persistently to survive server restarts" + }, + "enableKeyRotation": { + "label": "Enable Key Rotation", + "description": "Automatically rotate JWT signing keys periodically" + }, + "enableKeyCleanup": { + "label": "Enable Key Cleanup", + "description": "Automatically remove expired JWT keys" + } + }, + "audit": { + "label": "Audit Logging", + "enabled": { + "label": "Enable Audit Logging", + "description": "Track user actions and system events for compliance and security monitoring" + }, + "level": { + "label": "Audit Level", + "description": "0=OFF, 1=BASIC, 2=STANDARD, 3=VERBOSE" + }, + "retentionDays": { + "label": "Audit Retention (days)", + "description": "Number of days to retain audit logs" + } + }, + "htmlUrlSecurity": { + "label": "HTML URL Security", + "description": "Configure URL access restrictions for HTML processing to prevent SSRF attacks", + "enabled": { + "label": "Enable URL Security", + "description": "Enable URL security restrictions for HTML to PDF conversions" + }, + "level": { + "label": "Security Level", + "description": "MAX: whitelist only, MEDIUM: block internal networks, OFF: no restrictions", + "max": "Maximum (Whitelist Only)", + "medium": "Medium (Block Internal)", + "off": "Off (No Restrictions)" + }, + "advanced": "Advanced Settings", + "allowedDomains": { + "label": "Allowed Domains (Whitelist)", + "description": "One domain per line (e.g., cdn.example.com). Only these domains allowed when level is MAX" + }, + "blockedDomains": { + "label": "Blocked Domains (Blacklist)", + "description": "One domain per line (e.g., malicious.com). Additional domains to block" + }, + "internalTlds": { + "label": "Internal TLDs", + "description": "One TLD per line (e.g., .local, .internal). Block domains with these TLD patterns" + }, + "networkBlocking": "Network Blocking", + "blockPrivateNetworks": { + "label": "Block Private Networks", + "description": "Block RFC 1918 private networks (10.x.x.x, 192.168.x.x, 172.16-31.x.x)" + }, + "blockLocalhost": { + "label": "Block Localhost", + "description": "Block localhost and loopback addresses (127.x.x.x, ::1)" + }, + "blockLinkLocal": { + "label": "Block Link-Local Addresses", + "description": "Block link-local addresses (169.254.x.x, fe80::/10)" + }, + "blockCloudMetadata": { + "label": "Block Cloud Metadata Endpoints", + "description": "Block cloud provider metadata endpoints (169.254.169.254)" + } + } + }, + "connections": { + "title": "Connections", + "description": "Configure external authentication providers like OAuth2 and SAML.", + "linkedServices": "Linked Services", + "unlinkedServices": "Unlinked Services", + "connect": "Connect", + "disconnect": "Disconnect", + "disconnected": "Provider disconnected successfully", + "disconnectError": "Failed to disconnect provider", + "ssoAutoLogin": { + "label": "SSO Auto Login", + "enable": "Enable SSO Auto Login", + "description": "Automatically redirect to SSO login when authentication is required" + }, + "oauth2": { + "label": "OAuth2", + "enabled": { + "label": "Enable OAuth2", + "description": "Allow users to authenticate using OAuth2 providers" + }, + "provider": { + "label": "Provider", + "description": "The OAuth2 provider to use for authentication" + }, + "issuer": { + "label": "Issuer URL", + "description": "The OAuth2 provider issuer URL" + }, + "clientId": { + "label": "Client ID", + "description": "The OAuth2 client ID from your provider" + }, + "clientSecret": { + "label": "Client Secret", + "description": "The OAuth2 client secret from your provider" + }, + "useAsUsername": { + "label": "Use as Username", + "description": "The OAuth2 claim to use as the username (e.g., email, sub)" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first OAuth2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via OAuth2" + }, + "scopes": { + "label": "OAuth2 Scopes", + "description": "Comma-separated list of OAuth2 scopes to request (e.g., openid, profile, email)" + } + }, + "saml2": { + "label": "SAML2", + "enabled": { + "label": "Enable SAML2", + "description": "Allow users to authenticate using SAML2 providers" + }, + "provider": { + "label": "Provider", + "description": "The SAML2 provider name" + }, + "registrationId": { + "label": "Registration ID", + "description": "The SAML2 registration identifier" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first SAML2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via SAML2" + } + } + }, + "database": { + "title": "Database", + "description": "Configure custom database connection settings for enterprise deployments.", + "configuration": "Database Configuration", + "enableCustom": { + "label": "Enable Custom Database", + "description": "Use your own custom database configuration instead of the default embedded database" + }, + "customUrl": { + "label": "Custom Database URL", + "description": "Full JDBC connection string (e.g., jdbc:postgresql://localhost:5432/postgres). If provided, individual connection settings below are not used." + }, + "type": { + "label": "Database Type", + "description": "Type of database (not used if custom URL is provided)" + }, + "hostName": { + "label": "Host Name", + "description": "Database server hostname (not used if custom URL is provided)" + }, + "port": { + "label": "Port", + "description": "Database server port (not used if custom URL is provided)" + }, + "name": { + "label": "Database Name", + "description": "Name of the database (not used if custom URL is provided)" + }, + "username": { + "label": "Username", + "description": "Database authentication username" + }, + "password": { + "label": "Password", + "description": "Database authentication password" + } + }, + "privacy": { + "title": "Privacy", + "description": "Configure privacy and data collection settings.", + "analytics": "Analytics & Tracking", + "enableAnalytics": { + "label": "Enable Analytics", + "description": "Collect anonymous usage analytics to help improve the application" + }, + "metricsEnabled": { + "label": "Enable Metrics", + "description": "Enable collection of performance and usage metrics. Provides API endpoint for admins to access metrics data" + }, + "searchEngine": "Search Engine Visibility", + "googleVisibility": { + "label": "Google Visibility", + "description": "Allow search engines to index this application" + } + }, + "advanced": { + "title": "Advanced", + "description": "Configure advanced features and experimental functionality.", + "features": "Feature Flags", + "processing": "Processing", + "endpoints": { + "label": "Endpoints", + "manage": "Manage API Endpoints", + "description": "Endpoint management is configured via YAML. See documentation for details on enabling/disabling specific endpoints." + }, + "enableAlphaFunctionality": { + "label": "Enable Alpha Features", + "description": "Enable experimental and alpha-stage features (may be unstable)" + }, + "enableUrlToPDF": { + "label": "Enable URL to PDF", + "description": "Allow conversion of web pages to PDF documents" + }, + "maxDPI": { + "label": "Maximum DPI", + "description": "Maximum DPI for image processing (0 = unlimited)" + }, + "tessdataDir": { + "label": "Tessdata Directory", + "description": "Path to the tessdata directory for OCR language files" + }, + "disableSanitize": { + "label": "Disable HTML Sanitization", + "description": "WARNING: Security risk - disabling HTML sanitization can lead to XSS vulnerabilities" + }, + "tempFileManagement": { + "label": "Temp File Management", + "description": "Configure temporary file storage and cleanup behavior", + "baseTmpDir": { + "label": "Base Temp Directory", + "description": "Base directory for temporary files (leave empty for default: java.io.tmpdir/stirling-pdf)" + }, + "libreofficeDir": { + "label": "LibreOffice Temp Directory", + "description": "Directory for LibreOffice temp files (leave empty for default: baseTmpDir/libreoffice)" + }, + "systemTempDir": { + "label": "System Temp Directory", + "description": "System temp directory to clean (only used if cleanupSystemTemp is enabled)" + }, + "prefix": { + "label": "Temp File Prefix", + "description": "Prefix for temp file names" + }, + "maxAgeHours": { + "label": "Max Age (hours)", + "description": "Maximum age in hours before temp files are cleaned up" + }, + "cleanupIntervalMinutes": { + "label": "Cleanup Interval (minutes)", + "description": "How often to run cleanup (in minutes)" + }, + "startupCleanup": { + "label": "Startup Cleanup", + "description": "Clean up old temp files on application startup" + }, + "cleanupSystemTemp": { + "label": "Cleanup System Temp", + "description": "Whether to clean broader system temp directory (use with caution)" + } + }, + "processExecutor": { + "label": "Process Executor Limits", + "description": "Configure session limits and timeouts for each process executor", + "sessionLimit": { + "label": "Session Limit", + "description": "Maximum concurrent instances" + }, + "timeout": { + "label": "Timeout (minutes)", + "description": "Maximum execution time" + }, + "libreOffice": "LibreOffice", + "pdfToHtml": "PDF to HTML", + "qpdf": "QPDF", + "tesseract": "Tesseract OCR", + "pythonOpenCv": "Python OpenCV", + "weasyPrint": "WeasyPrint", + "installApp": "Install App", + "calibre": "Calibre", + "ghostscript": "Ghostscript", + "ocrMyPdf": "OCRmyPDF" + } + }, + "mail": { + "title": "Mail Server", + "description": "Configure SMTP settings for sending email notifications.", + "smtp": "SMTP Configuration", + "enabled": { + "label": "Enable Mail", + "description": "Enable email notifications and SMTP functionality" + }, + "host": { + "label": "SMTP Host", + "description": "The hostname or IP address of your SMTP server" + }, + "port": { + "label": "SMTP Port", + "description": "The port number for SMTP connection (typically 25, 465, or 587)" + }, + "username": { + "label": "SMTP Username", + "description": "Username for SMTP authentication" + }, + "password": { + "label": "SMTP Password", + "description": "Password for SMTP authentication" + }, + "from": { + "label": "From Address", + "description": "The email address to use as the sender" + }, + "enableInvites": { + "label": "Enable Email Invites", + "description": "Allow admins to invite users via email with auto-generated passwords" + }, + "frontendUrl": { + "label": "Frontend URL", + "description": "Base URL for frontend (e.g. https://pdf.example.com). Used for generating invite links in emails. Leave empty to use backend URL." + } + }, + "legal": { + "title": "Legal Documents", + "description": "Configure links to legal documents and policies.", + "disclaimer": { + "title": "Legal Responsibility Warning", + "message": "By customizing these legal documents, you assume full responsibility for ensuring compliance with all applicable laws and regulations, including but not limited to GDPR and other EU data protection requirements. Only modify these settings if: (1) you are operating a personal/private instance, (2) you are outside EU jurisdiction and understand your local legal obligations, or (3) you have obtained proper legal counsel and accept sole responsibility for all user data and legal compliance. Stirling-PDF and its developers assume no liability for your legal obligations." + }, + "termsAndConditions": { + "label": "Terms and Conditions", + "description": "URL or filename to terms and conditions" + }, + "privacyPolicy": { + "label": "Privacy Policy", + "description": "URL or filename to privacy policy" + }, + "accessibilityStatement": { + "label": "Accessibility Statement", + "description": "URL or filename to accessibility statement" + }, + "cookiePolicy": { + "label": "Cookie Policy", + "description": "URL or filename to cookie policy" + }, + "impressum": { + "label": "Impressum", + "description": "URL or filename to impressum (required in some jurisdictions)" + } + }, + "premium": { + "title": "Premium & Enterprise", + "description": "Configure your premium or enterprise license key.", + "license": "License Configuration", + "key": { + "label": "License Key", + "description": "Enter your premium or enterprise license key" + }, + "enabled": { + "label": "Enable Premium Features", + "description": "Enable license key checks for pro/enterprise features" + }, + "movedFeatures": { + "title": "Premium Features Distributed", + "message": "Premium and Enterprise features are now organized in their respective sections:" + } + }, + "features": { + "title": "Features", + "description": "Configure optional features and functionality.", + "serverCertificate": { + "label": "Server Certificate", + "description": "Configure server-side certificate generation for \"Sign with Stirling-PDF\" functionality", + "enabled": { + "label": "Enable Server Certificate", + "description": "Enable server-side certificate for \"Sign with Stirling-PDF\" option" + }, + "organizationName": { + "label": "Organization Name", + "description": "Organization name for generated certificates" + }, + "validity": { + "label": "Certificate Validity (days)", + "description": "Number of days the certificate will be valid" + }, + "regenerateOnStartup": { + "label": "Regenerate on Startup", + "description": "Generate new certificate on each application startup" + } + } + }, + "endpoints": { + "title": "API Endpoints", + "description": "Control which API endpoints and endpoint groups are available.", + "management": "Endpoint Management", + "toRemove": { + "label": "Disabled Endpoints", + "description": "Select individual endpoints to disable" + }, + "groupsToRemove": { + "label": "Disabled Endpoint Groups", + "description": "Select endpoint groups to disable" + }, + "note": "Note: Disabling endpoints restricts API access but does not remove UI components. Restart required for changes to take effect." + } + } }, "fileUpload": { + "selectFile": "Select a file", + "selectFiles": "Select files", + "selectPdfToView": "Select a PDF to view", + "selectPdfToEdit": "Select a PDF to edit", + "chooseFromStorage": "Choose a file from storage or upload a new PDF", + "chooseFromStorageMultiple": "Choose files from storage or upload new PDFs", + "loadFromStorage": "Load from Storage", + "filesAvailable": "files available", "loading": "ЗаваĐŊŅ‚Đ°ĐļĐĩĐŊĐŊŅ...", - "or": "айО" + "or": "айО", + "dropFileHere": "Drop file here or click to upload", + "dropFilesHere": "Drop files here or click the upload button", + "pdfFilesOnly": "PDF files only", + "supportedFileTypes": "Supported file types", + "upload": "Upload", + "uploadFile": "Upload File", + "uploadFiles": "Upload Files", + "noFilesInStorage": "No files available in storage. Upload some files first.", + "selectFromStorage": "Select from Storage", + "backToTools": "Back to Tools", + "addFiles": "Add Files", + "dragFilesInOrClick": "Drag files in or click \"Add Files\" to browse" + }, + "fileEditor": { + "addFiles": "Add Files" }, "fileManager": { + "title": "Upload PDF Files", + "subtitle": "Add files to your storage for easy access across tools", + "filesSelected": "files selected", + "clearSelection": "Clear Selection", + "openInFileEditor": "Open in File Editor", + "uploadError": "Failed to upload some files.", + "failedToOpen": "Failed to open file. It may have been removed from storage.", + "failedToLoad": "Failed to load file to active set.", + "storageCleared": "Browser cleared storage. Files have been removed. Please re-upload.", + "clearAll": "Clear All", + "reloadFiles": "Reload Files", + "dragDrop": "Drag & Drop files here", + "clickToUpload": "Click to upload files", + "selectedFiles": "Selected Files", + "storage": "Storage", + "filesStored": "files stored", + "storageError": "Storage error occurred", + "storageLow": "Storage is running low. Consider removing old files.", + "supportMessage": "Powered by browser database storage for unlimited capacity", + "noFileSelected": "No files selected", + "showHistory": "Show History", + "hideHistory": "Hide History", + "fileHistory": "File History", + "loadingHistory": "Loading History...", + "lastModified": "Last Modified", + "toolChain": "Tools Applied", + "restore": "Restore", + "unzip": "Unzip", + "searchFiles": "Search files...", + "recent": "Recent", + "localFiles": "Local Files", + "googleDrive": "Google Drive", + "googleDriveShort": "Drive", + "myFiles": "My Files", + "noRecentFiles": "No recent files found", + "googleDriveNotAvailable": "Google Drive integration not available", + "openFiles": "Open Files", + "openFile": "Open File", + "details": "File Details", "fileName": "ІĐŧ'Ņ", + "fileFormat": "Format", + "fileSize": "Size", "fileVersion": "ВĐĩŅ€ŅŅ–Ņ", + "totalSelected": "Total Selected", + "dropFilesHere": "Drop files here", "selectAll": "Đ’Đ¸ĐąŅ€Đ°Ņ‚Đ¸ Đ˛ŅĐĩ", "deselectAll": "ĐĄĐēĐ°ŅŅƒĐ˛Đ°Ņ‚Đ¸ Đ˛Đ¸ĐąŅ–Ņ€ ŅƒŅŅ–Ņ…", "deleteSelected": "ВидаĐģĐ¸Ņ‚Đ¸ Đ˛Đ¸ĐąŅ€Đ°ĐŊŅ–", + "downloadSelected": "Download Selected", + "selectedCount": "{{count}} selected", "download": "ЗаваĐŊŅ‚Đ°ĐļĐ¸Ņ‚Đ¸", - "delete": "ВидаĐģĐ¸Ņ‚Đ¸" + "delete": "ВидаĐģĐ¸Ņ‚Đ¸", + "unsupported": "Unsupported", + "addToUpload": "Add to Upload", + "deleteAll": "Delete All", + "loadingFiles": "Loading files...", + "noFiles": "No files available", + "noFilesFound": "No files found matching your search", + "openInPageEditor": "Open in Page Editor", + "showAll": "Show All", + "sortByDate": "Sort by Date", + "sortByName": "Sort by Name", + "sortBySize": "Sort by Size" + }, + "storage": { + "temporaryNotice": "Files are stored temporarily in your browser and may be cleared automatically", + "storageLimit": "Storage limit", + "storageUsed": "Temporary Storage used", + "storageFull": "Storage is nearly full. Consider removing some files.", + "fileTooLarge": "File too large. Maximum size per file is", + "storageQuotaExceeded": "Storage quota exceeded. Please remove some files before uploading more.", + "approximateSize": "Approximate size" }, "sanitize": { + "title": "Sanitise", + "desc": "Remove potentially harmful elements from PDF files.", "submit": "ДĐĩĐˇŅ–ĐŊŅ„ĐĩĐēŅ†Ņ–Ņ PDF", + "completed": "Sanitisation completed successfully", + "error": { + "generic": "Sanitisation failed", + "failed": "An error occurred while sanitising the PDF." + }, + "filenamePrefix": "sanitised", + "sanitizationResults": "Sanitisation Results", "steps": { - "settings": "НаĐģĐ°ŅˆŅ‚ŅƒĐ˛Đ°ĐŊĐŊŅ" + "files": "Files", + "settings": "НаĐģĐ°ŅˆŅ‚ŅƒĐ˛Đ°ĐŊĐŊŅ", + "results": "Results" + }, + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "options": { + "title": "Sanitisation Options", + "note": "Select the elements you want to remove from the PDF. At least one option must be selected.", + "removeJavaScript": { + "label": "Remove JavaScript", + "desc": "Remove JavaScript actions and scripts from the PDF" + }, + "removeEmbeddedFiles": { + "label": "Remove Embedded Files", + "desc": "Remove any files embedded within the PDF" + }, + "removeXMPMetadata": { + "label": "Remove XMP Metadata", + "desc": "Remove XMP metadata from the PDF" + }, + "removeMetadata": { + "label": "Remove Document Metadata", + "desc": "Remove document information metadata (title, author, etc.)" + }, + "removeLinks": { + "label": "Remove Links", + "desc": "Remove external links and launch actions from the PDF" + }, + "removeFonts": { + "label": "Remove Fonts", + "desc": "Remove embedded fonts from the PDF" + } + } + }, + "addPassword": { + "title": "Đ”ĐžĐ´Đ°Ņ‚Đ¸ ĐŋĐ°Ņ€ĐžĐģҌ", + "desc": "Encrypt your PDF document with a password.", + "completed": "Password protection applied", + "submit": "Đ¨Đ¸Ņ„Ņ€ŅƒĐ˛Đ°Ņ‚Đ¸", + "filenamePrefix": "encrypted", + "error": { + "failed": "An error occurred while encrypting the PDF." + }, + "passwords": { + "stepTitle": "Passwords & Encryption", + "completed": "Passwords configured", + "user": { + "label": "User Password", + "placeholder": "Enter user password" + }, + "owner": { + "label": "Owner Password", + "placeholder": "Enter owner password" + } + }, + "encryption": { + "keyLength": { + "label": "Encryption Key Length", + "40bit": "40-bit (Low)", + "128bit": "128-bit (Standard)", + "256bit": "256-bit (High)" + } + }, + "results": { + "title": "Encrypted PDFs" + }, + "tooltip": { + "header": { + "title": "Password Protection Overview" + }, + "passwords": { + "title": "Password Types", + "text": "User passwords restrict opening the document, while owner passwords control what can be done with the document once opened. You can set both or just one.", + "bullet1": "User Password: Required to open the PDF", + "bullet2": "Owner Password: Controls document permissions (not supported by all PDF viewers)" + }, + "encryption": { + "title": "Encryption Levels", + "text": "Higher encryption levels provide better security but may not be supported by older PDF viewers.", + "bullet1": "40-bit: Basic security, compatible with older viewers", + "bullet2": "128-bit: Standard security, widely supported", + "bullet3": "256-bit: Maximum security, requires modern viewers" + }, + "permissions": { + "title": "ЗĐŧŅ–ĐŊĐ¸Ņ‚Đ¸ дОСвОĐģи", + "text": "These permissions control what users can do with the PDF. Most effective when combined with an owner password." + } + }, + "tags": "ĐąĐĩСĐŋĐĩĐēа,ĐˇĐ°Ņ…Đ¸ŅŅ‚", + "header": "Đ”ĐžĐ´Đ°Ņ‚Đ¸ ĐŋĐ°Ņ€ĐžĐģҌ (ĐˇĐ°ŅˆĐ¸Ņ„Ņ€ŅƒĐ˛Đ°Ņ‚Đ¸)", + "selectText": { + "1": "ОбĐĩŅ€Ņ–Ņ‚ŅŒ PDF Đ´ĐģŅ ŅˆĐ¸Ņ„Ņ€ŅƒĐ˛Đ°ĐŊĐŊŅ", + "2": "ĐŸĐ°Ņ€ĐžĐģҌ", + "3": "ДовĐļиĐŊа ĐēĐģŅŽŅ‡Đ° ŅˆĐ¸Ņ„Ņ€ŅƒĐ˛Đ°ĐŊĐŊŅ", + "4": "Đ’Đ¸Ņ‰Ņ– СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ ŅĐ¸ĐģҌĐŊŅ–ŅˆŅ–, аĐģĐĩ ĐŊиĐļ҇Җ СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ ĐŧĐ°ŅŽŅ‚ŅŒ ĐēŅ€Đ°Ņ‰Ņƒ ҁ҃ĐŧҖҁĐŊŅ–ŅŅ‚ŅŒ.", + "5": "ДозвоĐģи ĐŊа Đ˛ŅŅ‚Đ°ĐŊОвĐģĐĩĐŊĐŊŅ", + "6": "ЗаĐŋĐžĐąŅ–ĐŗŅ‚Đ¸ ĐˇĐąŅ–Ņ€Ņ†Ņ– Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ°", + "7": "ЗаĐŋĐžĐąŅ–ĐŗŅ‚Đ¸ виĐģŅƒŅ‡ĐĩĐŊĐŊŅŽ ĐēĐžĐŊŅ‚ĐĩĐŊŅ‚Ņƒ", + "8": "ЗаĐŋĐžĐąŅ–ĐŗŅ‚Đ¸ виĐģŅƒŅ‡ĐĩĐŊĐŊŅŽ Đ´ĐģŅ Đ´ĐžŅŅ‚ŅƒĐŋĐŊĐžŅŅ‚Ņ–", + "9": "Đ—Đ°ĐąĐžŅ€ĐžĐŊĐ¸Ņ‚Đ¸ СаĐŋОвĐŊĐĩĐŊĐŊŅ Ņ„ĐžŅ€Đŧ", + "10": "ЗаĐŋĐžĐąŅ–ĐŗŅ‚Đ¸ ĐŧĐžĐ´Đ¸Ņ„Ņ–ĐēĐ°Ņ†Ņ–Ņ—", + "11": "Đ—Đ°ĐąĐžŅ€ĐžĐŊĐ¸Ņ‚Đ¸ ĐŧĐžĐ´Đ¸Ņ„Ņ–ĐēĐ°Ņ†Ņ–ŅŽ аĐŊĐžŅ‚Đ°Ņ†Ņ–Đš", + "12": "Đ—Đ°ĐąĐžŅ€ĐžĐŊĐ¸Ņ‚Đ¸ Đ´Ņ€ŅƒĐē", + "13": "Đ—Đ°ĐąĐžŅ€ĐžĐŊĐ¸Ņ‚Đ¸ Đ´Ņ€ŅƒĐē Ņ€Ņ–ĐˇĐŊĐ¸Ņ… Ņ„ĐžŅ€ĐŧĐ°Ņ‚Ņ–Đ˛", + "14": "ВĐģĐ°ŅĐŊĐ¸Ņ†ŅŒĐēиК ĐŋĐ°Ņ€ĐžĐģҌ", + "15": "ОбĐŧĐĩĐļŅƒŅ”, Ņ‰Đž ĐŧĐžĐļĐŊа Ņ€ĐžĐąĐ¸Ņ‚Đ¸ С Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚ĐžĐŧ ĐŋҖҁĐģŅ ĐšĐžĐŗĐž Đ˛Ņ–Đ´ĐēŅ€Đ¸Ņ‚Ņ‚Ņ (ĐŊĐĩ ĐŋŅ–Đ´Ņ‚Ņ€Đ¸ĐŧŅƒŅ”Ņ‚ŅŒŅŅ Đ˛ŅŅ–Đŧа ĐŋŅ€ĐžĐŗŅ€Đ°ĐŧаĐŧи Ņ‡Đ¸Ņ‚Đ°ĐŊĐŊŅ)", + "16": "ОбĐŧĐĩĐļŅƒŅ” Đ˛Ņ–Đ´ĐēŅ€Đ¸Ņ‚Ņ‚Ņ ŅĐ°ĐŧĐžĐŗĐž Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ°" } }, "changePermissions": { "title": "ЗĐŧŅ–ĐŊĐ¸Ņ‚Đ¸ дОСвОĐģи", + "desc": "Change document restrictions and permissions.", + "completed": "Permissions changed", "submit": "ЗĐŧŅ–ĐŊĐ¸Ņ‚Đ¸ дОСвОĐģи", + "error": { + "failed": "An error occurred while changing PDF permissions." + }, "permissions": { "preventAssembly": { "label": "ЗаĐŋĐžĐąŅ–ĐŗŅ‚Đ¸ ĐˇĐąŅ–Ņ€Ņ†Ņ– Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ°" @@ -1738,10 +4580,784 @@ "label": "Đ—Đ°ĐąĐžŅ€ĐžĐŊĐ¸Ņ‚Đ¸ Đ´Ņ€ŅƒĐē Ņ€Ņ–ĐˇĐŊĐ¸Ņ… Ņ„ĐžŅ€ĐŧĐ°Ņ‚Ņ–Đ˛" } }, + "results": { + "title": "Modified PDFs" + }, "tooltip": { "header": { "title": "ЗĐŧŅ–ĐŊĐ¸Ņ‚Đ¸ дОСвОĐģи" + }, + "description": { + "text": "Changes document permissions, allowing/disallowing access to different features in PDF readers." + }, + "warning": { + "text": "To make these permissions unchangeable, use the Add Password tool to set an owner password." } } + }, + "removePassword": { + "title": "ВидаĐģĐ¸Ņ‚Đ¸ ĐŋĐ°Ņ€ĐžĐģҌ", + "desc": "ЗĐŊŅ–ĐŧŅ–Ņ‚ŅŒ ĐˇĐ°Ņ…Đ¸ŅŅ‚ ĐŋĐ°Ņ€ĐžĐģĐĩĐŧ С Đ˛Đ°ŅˆĐžĐŗĐž Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ° PDF.", + "tags": "ĐąĐĩСĐŋĐĩĐēа,Ņ€ĐžĐˇŅˆĐ¸Ņ„Ņ€ĐžĐ˛Đēа,ĐˇĐ°Ņ…Đ¸ŅŅ‚,видаĐģĐĩĐŊĐŊŅ ĐŋĐ°Ņ€ĐžĐģŅ", + "password": { + "stepTitle": "ВидаĐģĐ¸Ņ‚Đ¸ ĐŋĐ°Ņ€ĐžĐģҌ", + "label": "ĐŸĐžŅ‚ĐžŅ‡ĐŊиК ĐŋĐ°Ņ€ĐžĐģҌ", + "placeholder": "Enter current password", + "completed": "Password configured" + }, + "filenamePrefix": "decrypted", + "error": { + "failed": "An error occurred while removing the password from the PDF." + }, + "tooltip": { + "description": "Removing password protection requires the password that was used to encrypt the PDF. This will decrypt the document, making it accessible without a password." + }, + "submit": "ВидаĐģĐ¸Ņ‚Đ¸", + "results": { + "title": "Decrypted PDFs" + }, + "header": "ВидаĐģĐ¸Ņ‚Đ¸ ĐŋĐ°Ņ€ĐžĐģҌ (Đ ĐžĐˇŅˆĐ¸Ņ„Ņ€ŅƒĐ˛Đ°Ņ‚Đ¸)", + "selectText": { + "1": "ВибĐĩŅ€Ņ–Ņ‚ŅŒ PDF Đ´ĐģŅ Ņ€ĐžĐˇŅˆĐ¸Ņ„Ņ€ŅƒĐ˛Đ°ĐŊĐŊŅ", + "2": "ĐŸĐ°Ņ€ĐžĐģҌ" + } + }, + "automate": { + "title": "Automate", + "desc": "Build multi-step workflows by chaining together PDF actions. Ideal for recurring tasks.", + "invalidStep": "Invalid step", + "files": { + "placeholder": "Select files to process with this automation" + }, + "selection": { + "title": "Automation Selection", + "saved": { + "title": "Saved" + }, + "createNew": { + "title": "Create New Automation" + }, + "suggested": { + "title": "Suggested" + } + }, + "creation": { + "createTitle": "Create Automation", + "editTitle": "Edit Automation", + "intro": "Automations run tools sequentially. To get started, add tools in the order you want them to run.", + "name": { + "label": "Automation Name", + "placeholder": "My Automation" + }, + "description": { + "label": "Description (optional)", + "placeholder": "Describe what this automation does..." + }, + "tools": { + "selectTool": "Select a tool...", + "selected": "Selected Tools", + "remove": "Remove tool", + "configure": "Configure tool", + "notConfigured": "! Not Configured", + "addTool": "Add Tool", + "add": "Add a tool..." + }, + "save": "Save Automation", + "unsavedChanges": { + "title": "Unsaved Changes", + "message": "You have unsaved changes. Are you sure you want to go back? All changes will be lost.", + "cancel": "Cancel", + "confirm": "Go Back" + }, + "icon": { + "label": "Icon" + } + }, + "run": { + "title": "Run Automation" + }, + "sequence": { + "unnamed": "Unnamed Automation", + "steps": "{{count}} steps", + "running": "Running Automation...", + "run": "Run Automation", + "finish": "Finish" + }, + "reviewTitle": "Automation Results", + "config": { + "loading": "Loading tool configuration...", + "noSettings": "This tool does not have configurable settings.", + "title": "Configure {{toolName}}", + "description": "Configure the settings for this tool. These settings will be applied when the automation runs.", + "cancel": "Cancel", + "save": "Save Configuration" + }, + "copyToSaved": "Copy to Saved" + }, + "automation": { + "suggested": { + "securePdfIngestion": "Secure PDF Ingestion", + "securePdfIngestionDesc": "Comprehensive PDF processing workflow that sanitises documents, applies OCR with cleanup, converts to PDF/A format for long-term archival, and optimises file size.", + "emailPreparation": "Email Preparation", + "emailPreparationDesc": "Optimises PDFs for email distribution by compressing files, splitting large documents into 20MB chunks for email compatibility, and removing metadata for privacy.", + "secureWorkflow": "Security Workflow", + "secureWorkflowDesc": "Secures PDF documents by removing potentially malicious content like JavaScript and embedded files, then adds password protection to prevent unauthorised access. Password is set to 'password' by default.", + "processImages": "Process Images", + "processImagesDesc": "Converts multiple image files into a single PDF document, then applies OCR technology to extract searchable text from the images." + } + }, + "common": { + "copy": "Copy", + "copied": "Copied!", + "refresh": "Refresh", + "retry": "Retry", + "remaining": "remaining", + "used": "used", + "available": "available", + "cancel": "Cancel", + "preview": "Preview" + }, + "config": { + "overview": { + "title": "Application Configuration", + "description": "Current application settings and configuration details." + }, + "account": { + "overview": { + "title": "Account Settings", + "manageAccountPreferences": "Manage your account preferences", + "guestDescription": "You are signed in as a guest. Consider upgrading your account above." + }, + "upgrade": { + "title": "Upgrade Guest Account", + "description": "Link your account to preserve your history and access more features!", + "socialLogin": "Upgrade with Social Account", + "linkWith": "Link with", + "emailPassword": "or enter your email & password", + "email": "Email", + "emailPlaceholder": "Enter your email", + "password": "Password (optional)", + "passwordPlaceholder": "Set a password", + "passwordNote": "Leave empty to use email verification only", + "upgradeButton": "Upgrade Account" + } + }, + "apiKeys": { + "description": "Your API key for accessing Stirling's suite of PDF tools. Copy it to your project or refresh to generate a new one.", + "publicKeyAriaLabel": "Public API key", + "copyKeyAriaLabel": "Copy API key", + "refreshAriaLabel": "Refresh API key", + "includedCredits": "Included credits", + "purchasedCredits": "Purchased credits", + "totalCredits": "Total Credits", + "chartAriaLabel": "Credits usage: included {{includedUsed}} of {{includedTotal}}, purchased {{purchasedUsed}} of {{purchasedTotal}}", + "nextReset": "Next Reset", + "lastApiUse": "Last API Use", + "overlayMessage": "Generate a key to see credits and available credits", + "label": "API Key", + "guestInfo": "Guest users do not receive API keys. Create an account to get an API key you can use in your applications.", + "goToAccount": "Go to Account", + "refreshModal": { + "title": "Refresh API Keys", + "warning": "âš ī¸ Warning: This action will generate new API keys and make your previous keys invalid.", + "impact": "Any applications or services currently using these keys will stop working until you update them with the new keys.", + "confirmPrompt": "Are you sure you want to continue?", + "confirmCta": "Refresh Keys" + }, + "generateError": "We couldn't generate your API key." + } + }, + "AddAttachmentsRequest": { + "attachments": "Select Attachments", + "info": "Select files to attach to your PDF. These files will be embedded and accessible through the PDF's attachment panel.", + "selectFiles": "Select Files to Attach", + "placeholder": "Choose files...", + "addMoreFiles": "Add more files...", + "selectedFiles": "Selected Files", + "submit": "Add Attachments", + "results": { + "title": "Attachment Results" + }, + "error": { + "failed": "Add attachments operation failed" + } + }, + "termsAndConditions": "Terms & Conditions", + "logOut": "Log out", + "addAttachments": { + "error": { + "failed": "An error occurred while adding attachments to the PDF." + } + }, + "autoRename": { + "description": "This tool will automatically rename PDF files based on their content. It analyzes the document to find the most suitable title from the text." + }, + "customPosition": "Custom Position", + "details": "Details", + "downloadUnavailable": "Download unavailable for this item", + "invalidUndoData": "Cannot undo: invalid operation data", + "margin": { + "large": "Large", + "medium": "Medium", + "small": "Small", + "xLarge": "Extra Large" + }, + "noFilesToUndo": "Cannot undo: no files were processed in the last operation", + "noOperationToUndo": "No operation to undo", + "noValidFiles": "No valid files to process", + "operationCancelled": "Operation cancelled", + "pageEdit": { + "deselectAll": "Select None", + "selectAll": "Select All" + }, + "quickPosition": "Quick Position", + "reorganizePages": { + "error": { + "failed": "Failed to reorganize pages" + }, + "results": { + "title": "Pages Reorganized" + }, + "settings": { + "title": "Settings" + }, + "submit": "Reorganize Pages" + }, + "replace-color": { + "options": { + "fill": "Fill colour", + "gradient": "Gradient" + }, + "previewOverlayOpacity": "Preview overlay opacity", + "previewOverlayTransparency": "Preview overlay transparency", + "previewOverlayVisibility": "Show preview overlay", + "selectText": { + "1": "ĐŸĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€Đ¸ СаĐŧŅ–ĐŊи айО Ņ–ĐŊвĐĩҀҁҖҗ ĐēĐžĐģŅŒĐžŅ€Ņƒ", + "2": "За СаĐŧĐžĐ˛Ņ‡ŅƒĐ˛Đ°ĐŊĐŊŅĐŧ (ĐēĐžĐģŅŒĐžŅ€Đ¸ Đ˛Đ¸ŅĐžĐēĐžĐŗĐž Ņ€ĐžĐˇĐŧĐ°Ņ—Ņ‚Ņ‚Ņ)", + "3": "ĐšĐžŅ€Đ¸ŅŅ‚ŅƒĐ˛Đ°ĐģҌĐŊĐ¸Ņ†ŅŒĐēŅ– (ĐŊĐ°ŅŅ‚Ņ€ĐžŅŽĐ˛Đ°ĐŊŅ– ĐēĐžĐģŅŒĐžŅ€Đ¸)", + "4": "ПовĐŊа Ņ–ĐŊвĐĩŅ€ŅŅ–Ņ (Ņ–ĐŊвĐĩŅ€Ņ‚ŅƒĐ˛Đ°Ņ‚Đ¸ Đ˛ŅŅ– ĐēĐžĐģŅŒĐžŅ€Đ¸)", + "5": "ĐŸĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€Đ¸ Đ˛Đ¸ŅĐžĐēĐžĐŗĐž Ņ€ĐžĐˇĐŧĐ°Ņ—Ņ‚Ņ‚Ņ", + "6": "ĐąŅ–ĐģиК Ņ‚ĐĩĐēҁ҂ ĐŊа Ņ‡ĐžŅ€ĐŊĐžĐŧ҃ Ņ‚ĐģŅ–", + "7": "Ņ‡ĐžŅ€ĐŊиК Ņ‚ĐĩĐēҁ҂ ĐŊа ĐąŅ–ĐģĐžĐŧ҃ Ņ‚ĐģŅ–", + "8": "ĐļĐžĐ˛Ņ‚Đ¸Đš Ņ‚ĐĩĐēҁ҂ ĐŊа Ņ‡ĐžŅ€ĐŊĐžĐŧ҃ Ņ‚ĐģŅ–", + "9": "СĐĩĐģĐĩĐŊиК Ņ‚ĐĩĐēҁ҂ ĐŊа Ņ‡ĐžŅ€ĐŊĐžĐŧ҃ Ņ‚ĐģŅ–", + "10": "Đ’Đ¸ĐąŅ€Đ°Ņ‚Đ¸ ĐēĐžĐģŅ–Ņ€ Ņ‚ĐĩĐēŅŅ‚Ņƒ", + "11": "Đ’Đ¸ĐąŅ€Đ°Ņ‚Đ¸ ĐēĐžĐģŅ–Ņ€ Ņ‚Đģа", + "12": "Choose start colour", + "13": "Choose end colour" + }, + "submit": "ЗаĐŧŅ–ĐŊĐ¸Ņ‚Đ¸", + "title": "ЗаĐŧŅ–ĐŊа-Ņ–ĐŊвĐĩŅ€ŅŅ–Ņ ĐēĐžĐģŅŒĐžŅ€Ņƒ", + "header": "ЗаĐŧŅ–ĐŊа-Ņ–ĐŊвĐĩŅ€ŅŅ–Ņ ĐēĐžĐģŅŒĐžŅ€Ņƒ PDF" + }, + "size": "Size", + "submit": "Submit", + "success": "Success", + "tools": { + "noSearchResults": "No tools found", + "noTools": "No tools available" + }, + "undoDataMismatch": "Cannot undo: operation data is corrupted", + "undoFailed": "Failed to undo operation", + "undoQuotaError": "Cannot undo: insufficient storage space", + "undoStorageError": "Undo completed but some files could not be saved to storage", + "undoSuccess": "Operation undone successfully", + "unsupported": "Unsupported", + "onboarding": { + "welcomeModal": { + "title": "Welcome to Stirling PDF!", + "description": "Would you like to take a quick 1-minute tour to learn the key features and how to get started?", + "helpHint": "You can always access this tour later from the Help button in the bottom left.", + "startTour": "Start Tour", + "maybeLater": "Maybe Later", + "dontShowAgain": "Don't Show Again" + }, + "allTools": "This is the All Tools panel, where you can browse and select from all available PDF tools.", + "selectCropTool": "Let's select the Crop tool to demonstrate how to use one of the tools.", + "toolInterface": "This is the Crop tool interface. As you can see, there's not much there because we haven't added any PDF files to work with yet.", + "filesButton": "The Files button on the Quick Access bar allows you to upload PDFs to use the tools on.", + "fileSources": "You can upload new files or access recent files from here. For the tour, we'll just use a sample file.", + "workbench": "This is the Workbench - the main area where you view and edit your PDFs.", + "viewSwitcher": "Use these controls to select how you want to view your PDFs.", + "viewer": "The Viewer lets you read and annotate your PDFs.", + "pageEditor": "The Page Editor allows you to do various operations on the pages within your PDFs, such as reordering, rotating and deleting.", + "activeFiles": "The Active Files view shows all of the PDFs you have loaded into the tool, and allows you to select which ones to process.", + "fileCheckbox": "Clicking one of the files selects it for processing. You can select multiple files for batch operations.", + "selectControls": "The Right Rail contains buttons to quickly select/deselect all of your active PDFs, along with buttons to change the app's theme or language.", + "cropSettings": "Now that we've selected the file we want crop, we can configure the Crop tool to choose the area that we want to crop the PDF to.", + "runButton": "Once the tool has been configured, this button allows you to run the tool on all the selected PDFs.", + "results": "After the tool has finished running, the Review step will show a preview of the results in this panel, and allow you to undo the operation or download the file. ", + "fileReplacement": "The modified file will replace the original file in the Workbench automatically, allowing you to easily run it through more tools.", + "pinButton": "You can use the Pin button if you'd rather your files stay active after running tools on them.", + "wrapUp": "You're all set! You've learnt about the main areas of the app and how to use them. Click the Help button whenever you like to see this tour again.", + "previous": "Previous", + "next": "Next", + "finish": "Finish", + "startTour": "Start Tour", + "startTourDescription": "Take a guided tour of Stirling PDF's key features" + }, + "workspace": { + "title": "Workspace", + "people": { + "title": "People", + "description": "Manage workspace members and their permissions", + "loading": "Loading people...", + "searchMembers": "Search members...", + "addMembers": "Add Members", + "inviteMembers": { + "label": "Invite Members", + "subtitle": "Type or paste in emails below, separated by commas. Your workspace will be billed by members." + }, + "user": "User", + "role": "Role", + "team": "Team", + "status": "Status", + "actions": "Actions", + "noMembersFound": "No members found", + "active": "Active", + "disabled": "Disabled", + "activeSession": "Active session", + "member": "Member", + "admin": "Admin", + "roleDescriptions": { + "admin": "Can manage settings and invite members, with full administrative access.", + "member": "Can view and edit shared files, but cannot manage workspace settings or members." + }, + "editRole": "Edit Role", + "enable": "Enable", + "disable": "Disable", + "deleteUser": "Delete User", + "deleteUserSuccess": "User deleted successfully", + "deleteUserError": "Failed to delete user", + "confirmDelete": "Are you sure you want to delete this user? This action cannot be undone.", + "addMember": { + "title": "Add Member", + "username": "Username (Email)", + "usernamePlaceholder": "user@example.com", + "password": "Password", + "passwordPlaceholder": "Enter password", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "forcePasswordChange": "Force password change on first login", + "cancel": "Cancel", + "submit": "Add Member", + "usernameRequired": "Username and password are required", + "passwordTooShort": "Password must be at least 6 characters", + "success": "User created successfully", + "error": "Failed to create user" + }, + "editMember": { + "title": "Edit Member", + "editing": "Editing:", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "cancel": "Cancel", + "submit": "Update Member", + "success": "User updated successfully", + "error": "Failed to update user" + }, + "toggleEnabled": { + "success": "User status updated successfully", + "error": "Failed to update user status" + }, + "delete": { + "success": "User deleted successfully", + "error": "Failed to delete user" + }, + "emailInvite": { + "tab": "Email Invite", + "description": "Type or paste in emails below, separated by commas. Users will receive login credentials via email.", + "emails": "Email Addresses", + "emailsPlaceholder": "user1@example.com, user2@example.com", + "emailsRequired": "At least one email address is required", + "submit": "Send Invites", + "success": "user(s) invited successfully", + "partialSuccess": "Some invites failed", + "allFailed": "Failed to invite users", + "error": "Failed to send invites" + }, + "directInvite": { + "tab": "Direct Create" + }, + "inviteLinkTab": { + "tab": "Invite Link" + }, + "inviteLink": { + "description": "Generate a secure link that allows the user to set their own password", + "email": "Email Address", + "emailPlaceholder": "user@example.com (optional)", + "emailDescription": "Optional - leave blank for a general invite link that can be used by anyone", + "emailRequired": "Email address is required", + "emailOptional": "Optional - leave blank for a general invite link", + "emailRequiredForSend": "Email address is required to send email notification", + "expiryHours": "Expiry Hours", + "expiryDescription": "How many hours until the link expires", + "sendEmail": "Send invite link via email", + "sendEmailDescription": "If enabled, the invite link will be sent to the specified email address", + "smtpRequired": "SMTP not configured", + "generate": "Generate Link", + "generated": "Invite Link Generated", + "copied": "Link copied to clipboard", + "success": "Invite link generated successfully", + "successWithEmail": "Invite link generated and sent via email", + "emailFailed": "Invite link generated, but email failed", + "emailFailedDetails": "Error: {0}. Please share the invite link manually.", + "error": "Failed to generate invite link", + "submit": "Generate Invite Link" + }, + "inviteMode": { + "username": "Username", + "email": "Email", + "link": "Link", + "emailDisabled": "Email invites require SMTP configuration and mail.enableInvites=true in settings" + }, + "license": { + "users": "users", + "availableSlots": "Available Slots", + "grandfathered": "Grandfathered", + "grandfatheredShort": "{{count}} grandfathered", + "fromLicense": "from license", + "slotsAvailable": "{{count}} user slot(s) available", + "noSlotsAvailable": "No slots available", + "currentUsage": "Currently using {{current}} of {{max}} user licences" + } + }, + "teams": { + "title": "Teams", + "description": "Manage teams and organize workspace members", + "loading": "Loading teams...", + "loadingDetails": "Loading team details...", + "createNewTeam": "Create New Team", + "teamName": "Team Name", + "totalMembers": "Total Members", + "actions": "Actions", + "noTeamsFound": "No teams found", + "noMembers": "No members in this team", + "system": "System", + "addMember": "Add Member", + "viewTeam": "View Team", + "removeMember": "Remove from team", + "cannotRemoveFromSystemTeam": "Cannot remove from system team", + "renameTeamLabel": "Rename Team", + "deleteTeamLabel": "Delete Team", + "cannotDeleteInternal": "Cannot delete the Internal team", + "confirmDelete": "Are you sure you want to delete this team? This team must be empty to delete.", + "confirmRemove": "Remove user from this team?", + "cannotRenameInternal": "Cannot rename the Internal team", + "cannotAddToInternal": "Cannot add members to the Internal team", + "teamNotFound": "Team not found", + "backToTeams": "Back to Teams", + "memberCount": "{{count}} members", + "removeMemberSuccess": "User removed from team", + "removeMemberError": "Failed to remove user from team", + "createTeam": { + "title": "Create New Team", + "teamName": "Team Name", + "teamNamePlaceholder": "Enter team name", + "cancel": "Cancel", + "submit": "Create Team", + "nameRequired": "Team name is required", + "success": "Team created successfully", + "error": "Failed to create team" + }, + "renameTeam": { + "title": "Rename Team", + "renaming": "Renaming:", + "newTeamName": "New Team Name", + "newTeamNamePlaceholder": "Enter new team name", + "cancel": "Cancel", + "submit": "Rename Team", + "nameRequired": "Team name is required", + "success": "Team renamed successfully", + "error": "Failed to rename team" + }, + "deleteTeam": { + "success": "Team deleted successfully", + "error": "Failed to delete team. Make sure the team is empty.", + "teamMustBeEmpty": "Team must be empty before deletion" + }, + "addMemberToTeam": { + "title": "Add Member to Team", + "addingTo": "Adding to", + "selectUser": "Select User", + "selectUserPlaceholder": "Choose a user", + "selectUserRequired": "Please select a user", + "currentlyIn": "currently in", + "willBeMoved": "Note: This user will be moved from their current team to this team.", + "cancel": "Cancel", + "submit": "Add Member", + "userRequired": "Please select a user", + "success": "Member added to team successfully", + "error": "Failed to add member to team" + }, + "changeTeam": { + "label": "Change Team", + "title": "Change Team", + "changing": "Moving", + "selectTeam": "Select Team", + "selectTeamPlaceholder": "Choose a team", + "selectTeamRequired": "Please select a team", + "success": "Team changed successfully", + "error": "Failed to change team", + "submit": "Change Team" + } + } + }, + "plan": { + "currency": "Currency", + "popular": "Popular", + "current": "Current Plan", + "upgrade": "Upgrade", + "contact": "Contact Us", + "customPricing": "Custom", + "showComparison": "Compare All Features", + "hideComparison": "Hide Feature Comparison", + "featureComparison": "Feature Comparison", + "activePlan": { + "title": "Active Plan", + "subtitle": "Your current subscription details" + }, + "availablePlans": { + "title": "Available Plans", + "subtitle": "Choose the plan that fits your needs" + }, + "static": { + "title": "Billing Information", + "message": "Online billing is not currently configured. To upgrade your plan or manage subscriptions, please contact us directly.", + "contactSales": "Contact Sales", + "contactToUpgrade": "Contact us to upgrade or customize your plan", + "maxUsers": "Max Users", + "upTo": "Up to" + }, + "period": { + "month": "month" + }, + "free": { + "name": "Free", + "highlight1": "Limited Tool Usage Per week", + "highlight2": "Access to all tools", + "highlight3": "Community support" + }, + "pro": { + "name": "Pro", + "highlight1": "Unlimited Tool Usage", + "highlight2": "Advanced PDF tools", + "highlight3": "No watermarks" + }, + "enterprise": { + "name": "Enterprise", + "highlight1": "Custom pricing", + "highlight2": "Dedicated support", + "highlight3": "Latest features" + }, + "feature": { + "title": "Feature", + "pdfTools": "Basic PDF Tools", + "fileSize": "File Size Limit", + "automation": "Automate tool workflows", + "api": "API Access", + "priority": "Priority Support", + "customPricing": "Custom Pricing" + } + }, + "subscription": { + "status": { + "active": "Active", + "pastDue": "Past Due", + "canceled": "Canceled", + "incomplete": "Incomplete", + "trialing": "Trial", + "none": "No Subscription" + }, + "renewsOn": "Renews on {{date}}", + "cancelsOn": "Cancels on {{date}}" + }, + "billing": { + "manageBilling": "Manage Billing", + "portal": { + "error": "Failed to open billing portal" + } + }, + "payment": { + "preparing": "Preparing your checkout...", + "upgradeTitle": "Upgrade to {{planName}}", + "success": "Payment Successful!", + "successMessage": "Your subscription has been activated successfully. You will receive a confirmation email shortly.", + "autoClose": "This window will close automatically...", + "error": "Payment Error" + }, + "firstLogin": { + "title": "First Time Login", + "welcomeTitle": "Welcome!", + "welcomeMessage": "For security reasons, you must change your password on your first login.", + "loggedInAs": "Logged in as", + "error": "Error", + "currentPassword": "Current Password", + "enterCurrentPassword": "Enter your current password", + "newPassword": "New Password", + "enterNewPassword": "Enter new password (min 8 characters)", + "confirmPassword": "Confirm New Password", + "reEnterNewPassword": "Re-enter new password", + "changePassword": "Change Password", + "allFieldsRequired": "All fields are required", + "passwordsDoNotMatch": "New passwords do not match", + "passwordTooShort": "Password must be at least 8 characters", + "passwordMustBeDifferent": "New password must be different from current password", + "passwordChangedSuccess": "Password changed successfully! Please log in again.", + "passwordChangeFailed": "Failed to change password. Please check your current password." + }, + "invite": { + "welcome": "Welcome to Stirling PDF", + "invalidToken": "Invalid invitation link", + "validationError": "Failed to validate invitation link", + "passwordRequired": "Password is required", + "passwordTooShort": "Password must be at least 6 characters", + "passwordMismatch": "Passwords do not match", + "acceptError": "Failed to create account", + "validating": "Validating invitation...", + "invalidInvitation": "Invalid Invitation", + "goToLogin": "Go to Login", + "welcomeTitle": "You've been invited!", + "welcomeSubtitle": "Complete your account setup to get started", + "accountFor": "Creating account for", + "linkExpires": "Link expires", + "email": "Email address", + "emailPlaceholder": "Enter your email address", + "emailRequired": "Email address is required", + "invalidEmail": "Invalid email address", + "choosePassword": "Choose a password", + "passwordPlaceholder": "Enter your password", + "confirmPassword": "Confirm password", + "confirmPasswordPlaceholder": "Re-enter your password", + "createAccount": "Create Account", + "creating": "Creating Account...", + "alreadyHaveAccount": "Already have an account?", + "signIn": "Sign in" + }, + "audit": { + "error": { + "title": "Error loading audit system" + }, + "notAvailable": "Audit system not available", + "notAvailableMessage": "The audit system is not configured or not available.", + "disabled": "Audit logging is disabled", + "disabledMessage": "Enable audit logging in your application configuration to track system events.", + "systemStatus": { + "title": "System Status", + "status": "Audit Logging", + "enabled": "Enabled", + "disabled": "Disabled", + "level": "Audit Level", + "retention": "Retention Period", + "days": "days", + "totalEvents": "Total Events" + }, + "tabs": { + "dashboard": "Dashboard", + "events": "Audit Events", + "export": "Export" + }, + "charts": { + "title": "Audit Dashboard", + "error": "Error loading charts", + "day": "Day", + "week": "Week", + "month": "Month", + "byType": "Events by Type", + "byUser": "Events by User", + "overTime": "Events Over Time" + }, + "events": { + "title": "Audit Events", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "error": "Error loading events", + "noEvents": "No events found", + "timestamp": "Timestamp", + "type": "Type", + "user": "User", + "ipAddress": "IP Address", + "actions": "Actions", + "viewDetails": "View Details", + "eventDetails": "Event Details", + "details": "Details" + }, + "export": { + "title": "Export Audit Data", + "description": "Export audit events to CSV or JSON format. Use filters to limit the exported data.", + "format": "Export Format", + "filters": "Filters (Optional)", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "exportButton": "Export Data", + "error": "Failed to export data" + } + }, + "usage": { + "noData": "No data available", + "error": "Error loading usage statistics", + "noDataMessage": "No usage statistics are currently available.", + "controls": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All", + "refresh": "Refresh", + "dataTypeLabel": "Data Type:", + "dataType": { + "all": "All", + "api": "API", + "ui": "UI" + } + }, + "showing": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All" + }, + "stats": { + "totalEndpoints": "Total Endpoints", + "totalVisits": "Total Visits", + "showing": "Showing", + "selectedVisits": "Selected Visits" + }, + "chart": { + "title": "Endpoint Usage Chart" + }, + "table": { + "title": "Detailed Statistics", + "endpoint": "Endpoint", + "visits": "Visits", + "percentage": "Percentage", + "noData": "No data available" + } + }, + "backendHealth": { + "checking": "Checking backend status...", + "online": "Backend Online", + "offline": "Backend Offline" + }, + "autoRedact": { + "tags": "Ņ€ĐĩĐ´Đ°ĐŗŅƒĐ˛Đ°Ņ‚Đ¸,ĐŋŅ€Đ¸Ņ…ĐžĐ˛Đ°Ņ‚Đ¸,ĐˇĐ°Ņ‚ĐĩĐŧĐŊĐ¸Ņ‚Đ¸,Ņ‡ĐžŅ€ĐŊиК,ĐŧĐ°Ņ€ĐēĐĩŅ€,ĐŋŅ€Đ¸Ņ…ĐžĐ˛Đ°ĐŊĐž", + "title": "ĐĐ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐĩ Ņ€ĐĩĐ´Đ°ĐŗŅƒĐ˛Đ°ĐŊĐŊŅ", + "header": "ĐĐ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐĩ Ņ€ĐĩĐ´Đ°ĐŗŅƒĐ˛Đ°ĐŊĐŊŅ", + "colorLabel": "КоĐģŅ–Ņ€", + "textsToRedactLabel": "ĐĸĐĩĐēҁ҂ Đ´ĐģŅ ĐŋŅ€Đ¸Ņ…ĐžĐ˛ŅƒĐ˛Đ°ĐŊĐŊŅ (ĐēĐžĐļĐĩĐŊ Ņ€ŅĐ´ĐžĐē ĐžĐēŅ€ĐĩĐŧĐž)", + "textsToRedactPlaceholder": "ĐŊаĐŋŅ€Đ¸ĐēĐģад \\nКоĐŊŅ„Ņ–Đ´ĐĩĐŊŅ†Ņ–ĐšĐŊĐž \\nĐĻŅ–ĐģĐēĐžĐŧ Ņ‚Đ°Ņ”ĐŧĐŊĐž", + "useRegexLabel": "ВиĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ Ņ€ĐĩĐŗŅƒĐģŅŅ€ĐŊŅ– Đ˛Đ¸Ņ€Đ°ĐˇĐ¸", + "wholeWordSearchLabel": "ĐŸĐžŅˆŅƒĐē ҆ҖĐģĐ¸Ņ… ҁĐģŅ–Đ˛", + "customPaddingLabel": "Đ”ĐžĐ´Đ°Ņ‚ĐēОвĐĩ СаĐŋОвĐŊĐĩĐŊĐŊŅ Са ĐēĐžŅ€Đ¸ŅŅ‚ŅƒĐ˛Đ°Ņ†ŅŒĐēиĐŧ СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅĐŧ", + "convertPDFToImageLabel": "ПĐĩŅ€ĐĩŅ‚Đ˛ĐžŅ€Đ¸Ņ‚Đ¸ PDF в ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊĐŊŅ PDF (виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅ”Ņ‚ŅŒŅŅ Đ´ĐģŅ видаĐģĐĩĐŊĐŊŅ Ņ‚ĐĩĐēŅŅ‚Ņƒ ĐŋОСа ĐŧĐĩĐļаĐŧи)", + "submitButton": "ĐĐ°Đ´Ņ–ŅĐģĐ°Ņ‚Đ¸" + }, + "replaceColorPdf": { + "tags": "ЗаĐŧŅ–ĐŊа ĐēĐžĐģŅŒĐžŅ€Ņƒ, ĐžĐŋĐĩŅ€Đ°Ņ†Ņ–Ņ— ĐˇŅ– ŅŅ‚ĐžŅ€Ņ–ĐŊĐēаĐŧи, ĐĄĐĩŅ€Đ˛ĐĩŅ€ĐŊа Ņ‡Đ°ŅŅ‚Đ¸ĐŊа" } -} \ No newline at end of file +} diff --git a/frontend/public/locales/vi-VN/translation.json b/frontend/public/locales/vi-VN/translation.json index f5fa86f40..fd0dcc40c 100644 --- a/frontend/public/locales/vi-VN/translation.json +++ b/frontend/public/locales/vi-VN/translation.json @@ -1,4 +1,40 @@ { + "toolPanel": { + "modePrompt": { + "title": "Choose how you browse tools", + "description": "Preview both layouts and decide how you want to explore Stirling PDF tools.", + "sidebarTitle": "Sidebar mode", + "sidebarDescription": "Keep tools alongside your workspace for quick switching.", + "recommended": "Recommended", + "chooseSidebar": "Use sidebar mode", + "fullscreenTitle": "Fullscreen mode - (legacy)", + "fullscreenDescription": "Browse every tool in a catalogue that covers the workspace until you pick one.", + "chooseFullscreen": "Use fullscreen mode", + "dismiss": "Maybe later" + }, + "fullscreen": { + "showDetails": "Show Details", + "comingSoon": "Coming soon:", + "favorite": "Add to favourites", + "favorites": "Favourites", + "heading": "All tools (fullscreen view)", + "noResults": "Try adjusting your search or toggle descriptions to find what you need.", + "recommended": "Recommended", + "unfavorite": "Remove from favourites" + }, + "placeholder": "Choose a tool to get started", + "toggle": { + "fullscreen": "Switch to fullscreen mode", + "sidebar": "Switch to sidebar mode" + } + }, + "unsavedChanges": "You have unsaved changes to your PDF.", + "areYouSure": "Are you sure you want to leave?", + "unsavedChangesTitle": "Unsaved Changes", + "keepWorking": "Keep Working", + "discardChanges": "Discard & Leave", + "applyAndContinue": "Save & Leave", + "exportAndContinue": "Export & Continue", "language": { "direction": "ltr" }, @@ -18,8 +54,26 @@ "customTextDesc": "Văn báēŖn tÚy cháģ‰nh", "numberPagesDesc": "Nháģ¯ng trang cáē§n Ä‘ÃĄnh sáģ‘, máēˇc đáģ‹nh là 'all', cÅŠng cháēĨp nháē­n 1-5 hoáēˇc 2,5,9 v.v.", "customNumberDesc": "Máēˇc đáģ‹nh là {n}, cÅŠng cháēĨp nháē­n 'Trang {n} / {total}', 'Văn báēŖn-{n}', '{filename}-{n}", - "submit": "ThÃĒm sáģ‘ trang" + "submit": "ThÃĒm sáģ‘ trang", + "configuration": "Configuration", + "customize": "Customize Appearance", + "pagesAndStarting": "Pages & Starting Number", + "positionAndPages": "Position & Pages", + "error": { + "failed": "Add page numbers operation failed" + }, + "results": { + "title": "Page Number Results" + }, + "preview": "Position Selection", + "previewDisclaimer": "Preview is approximate. Final output may vary due to PDF font metrics." }, + "pageSelectionPrompt": "Láģąa cháģn trang tÚy cháģ‰nh (Nháē­p danh sÃĄch sáģ‘ trang đưáģŖc phÃĸn tÃĄch báēąng dáēĨu pháēŠy 1,5,6 hoáēˇc CÃĄc hàm như 2n+1) :", + "startingNumberTooltip": "The first number to display. Subsequent pages will increment from this number.", + "marginTooltip": "Distance between the page number and the edge of the page.", + "fontSizeTooltip": "Size of the page number text in points. Larger numbers create bigger text.", + "fontTypeTooltip": "Font family for the page numbers. Choose based on your document style.", + "customTextTooltip": "Optional custom format for page numbers. Use {n} as placeholder for the number. Example: \"Page {n}\" will show \"Page 1\", \"Page 2\", etc.", "pdfPrompt": "Cháģn (cÃĄc) táģ‡p PDF", "multiPdfPrompt": "Cháģn cÃĄc táģ‡p PDF (2+)", "multiPdfDropPrompt": "Cháģn (hoáēˇc kÊo và tháēŖ) táēĨt cáēŖ cÃĄc táģ‡p PDF báēĄn cáē§n", @@ -30,15 +84,41 @@ "uploadLimitExceededPlural": "are too large. Maximum allowed size is", "processTimeWarning": "CáēŖnh bÃĄo: QuÃĄ trÃŦnh này cÃŗ tháģƒ máēĨt đáēŋn máģ™t phÃēt tÚy thuáģ™c vào kích thưáģ›c táģ‡p", "pageOrderPrompt": "TháģŠ táģą trang tÚy cháģ‰nh (Nháē­p danh sÃĄch sáģ‘ trang đưáģŖc phÃĸn tÃĄch báēąng dáēĨu pháēŠy hoáēˇc CÃĄc hàm như 2n+1) :", - "pageSelectionPrompt": "Láģąa cháģn trang tÚy cháģ‰nh (Nháē­p danh sÃĄch sáģ‘ trang đưáģŖc phÃĸn tÃĄch báēąng dáēĨu pháēŠy 1,5,6 hoáēˇc CÃĄc hàm như 2n+1) :", "goToPage": "Đi đáēŋn", "true": "ĐÃēng", "false": "Sai", "unknown": "Không xÃĄc đáģ‹nh", + "app": { + "description": "The Free Adobe Acrobat alternative (10M+ Downloads)" + }, "save": "Lưu", "saveToBrowser": "Lưu vào trÃŦnh duyáģ‡t", + "download": "TáēŖi xuáģ‘ng", + "pin": "Pin File (keep active after tool run)", + "unpin": "Unpin File (replace after tool run)", + "undoOperationTooltip": "Click to undo the last operation and restore the original files", + "undo": "Undo", + "moreOptions": "More Options", + "editYourNewFiles": "Edit your new file(s)", "close": "ÄÃŗng", + "openInViewer": "Open in Viewer", + "confirmClose": "Confirm Close", + "confirmCloseMessage": "Are you sure you want to close this file?", + "confirmCloseCancel": "Cancel", + "confirmCloseConfirm": "Close File", + "fileSelected": "Selected: {{filename}}", + "chooseFile": "Choose File", "filesSelected": "táģ‡p Ä‘ÃŖ cháģn", + "files": { + "title": "Files", + "upload": "Upload", + "uploadFiles": "Upload Files", + "addFiles": "Add files", + "selectFromWorkbench": "Select files from the workbench or ", + "selectMultipleFromWorkbench": "Select at least {{count}} files from the workbench or ", + "created": "Created", + "size": "File Size" + }, "noFavourites": "Không cÃŗ máģĨc yÃĒu thích nào đưáģŖc thÃĒm", "downloadComplete": "TáēŖi xuáģ‘ng hoàn táēĨt", "bored": "ChÃĄn pháēŖi cháģ Ä‘áģŖi?", @@ -56,7 +136,10 @@ }, "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", + "encryptedPdfMustRemovePassword": "This PDF is encrypted or password-protected. Please unlock it before converting to PDF/A.", + "incorrectPasswordProvided": "The PDF password is incorrect or not provided.", "_value": "Láģ—i", + "dismissAllErrors": "Dismiss All Errors", "sorry": "Xin láģ—i vÃŦ sáģą cáģ‘!", "needHelp": "Cáē§n tráģŖ giÃēp / PhÃĄt hiáģ‡n sáģą cáģ‘?", "contactTip": "Náēŋu báēĄn váēĢn gáēˇp khÃŗ khăn, đáģĢng ngáē§n ngáēĄi liÃĒn háģ‡ váģ›i chÃēng tôi đáģƒ Ä‘Æ°áģŖc tráģŖ giÃēp. BáēĄn cÃŗ tháģƒ gáģ­i ticket trÃĒn trang GitHub cáģ§a chÃēng tôi hoáēˇc liÃĒn háģ‡ qua Discord:", @@ -71,6 +154,10 @@ "githubSubmit": "GitHub - Gáģ­i ticket", "discordSubmit": "Discord - Gáģ­i bài đăng háģ— tráģŖ" }, + "warning": { + "tooltipTitle": "Warning" + }, + "edit": "Edit", "delete": "XÃŗa", "username": "TÃĒn ngưáģi dÚng", "password": "Máē­t kháēŠu", @@ -82,6 +169,7 @@ "green": "Xanh lÃĄ", "blue": "Xanh dÆ°ÆĄng", "custom": "TÚy cháģ‰nh...", + "comingSoon": "Coming soon", "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Ãŗ", @@ -115,12 +203,14 @@ "page": "Page", "pages": "Pages", "loading": "Loading...", + "review": "Review", "addToDoc": "Add to Document", "reset": "Reset", "apply": "Apply", "noFileSelected": "No file selected. Please upload one.", "legal": { "privacy": "Privacy Policy", + "iAgreeToThe": "I agree to all of the", "terms": "Terms and Conditions", "accessibility": "Accessibility", "cookie": "Cookie Policy", @@ -160,6 +250,7 @@ "title": "Do you want make Stirling PDF better?", "paragraph1": "Stirling PDF has opt in analytics to help us improve the product. We do not track any personal information or file contents.", "paragraph2": "Please consider enabling analytics to help Stirling-PDF grow and to allow us to understand our users better.", + "learnMore": "Learn more", "enable": "Enable analytics", "disable": "Disable analytics", "settings": "You can change the settings for analytics in the config/settings.yml file" @@ -203,6 +294,54 @@ "cacheInputs": { "name": "Lưu đáē§u vào biáģƒu máēĢu", "help": "Báē­t đáģƒ lưu tráģ¯ cÃĄc đáē§u vào Ä‘ÃŖ sáģ­ dáģĨng trưáģ›c Ä‘Ãŗ cho cÃĄc láē§n cháēĄy trong tÆ°ÆĄng lai" + }, + "general": { + "title": "General", + "description": "Configure general application preferences.", + "account": "Account", + "accountDescription": "Manage your account settings", + "user": "User", + "signedInAs": "Signed in as", + "logout": "Log out", + "enableFeatures": { + "title": "For System Administrators", + "intro": "Enable user authentication, team management, and workspace features for your organization.", + "action": "Configure", + "and": "and", + "benefit": "Enables user roles, team collaboration, admin controls, and enterprise features.", + "learnMore": "Learn more in documentation", + "dismiss": "Dismiss" + }, + "autoUnzip": "Auto-unzip API responses", + "autoUnzipDescription": "Automatically extract files from ZIP responses", + "autoUnzipTooltip": "Automatically extract ZIP files returned from API operations. Disable to keep ZIP files intact. This does not affect automation workflows.", + "autoUnzipFileLimit": "Auto-unzip file limit", + "autoUnzipFileLimitDescription": "Maximum number of files to extract from ZIP", + "autoUnzipFileLimitTooltip": "Only unzip if the ZIP contains this many files or fewer. Set higher to extract larger ZIPs.", + "defaultToolPickerMode": "Default tool picker mode", + "defaultToolPickerModeDescription": "Choose whether the tool picker opens in fullscreen or sidebar by default", + "mode": { + "fullscreen": "Fullscreen", + "sidebar": "Sidebar" + } + }, + "hotkeys": { + "title": "Keyboard Shortcuts", + "description": "Hover a tool to see its shortcut or customise it below. Click \"Change shortcut\" and press a new key combination. Press Esc to cancel.", + "errorModifier": { + "mac": "Include ⌘ (Command), âŒĨ (Option), or another modifier in your shortcut.", + "windows": "Include Ctrl, Alt, or another modifier in your shortcut." + }, + "errorConflict": "Shortcut already used by {{tool}}.", + "none": "Not assigned", + "customBadge": "Custom", + "defaultLabel": "Default: {{shortcut}}", + "capturing": "Press keysâ€Ļ (Esc to cancel)", + "change": "Change shortcut", + "reset": "Reset", + "shortcut": "Shortcut", + "noShortcut": "No shortcut set", + "searchPlaceholder": "Search tools..." } }, "changeCreds": { @@ -274,8 +413,10 @@ "top20": "Top 20", "all": "All", "refresh": "Refresh", - "includeHomepage": "Include Homepage ('/')", - "includeLoginPage": "Include Login Page ('/login')", + "dataTypeLabel": "Data Type:", + "dataTypeAll": "All", + "dataTypeApi": "API", + "dataTypeUi": "UI", "totalEndpoints": "Total Endpoints", "totalVisits": "Total Visits", "showing": "Showing", @@ -290,7 +431,9 @@ "top": "Top", "numberOfVisits": "Number of Visits", "visitsTooltip": "Visits: {0} ({1}% of total)", - "retry": "Retry" + "retry": "Retry", + "includeHomepage": "Include Homepage ('/')", + "includeLoginPage": "Include Login Page ('/login')" }, "database": { "title": "Nháē­p/XuáēĨt cÆĄ sáģŸ dáģ¯ liáģ‡u", @@ -331,22 +474,310 @@ "alphabetical": "Alphabetical", "globalPopularity": "Global Popularity", "sortBy": "Sort by:", + "mobile": { + "brandAlt": "Stirling PDF logo", + "openFiles": "Open files", + "swipeHint": "Swipe left or right to switch views", + "tools": "Tools", + "toolsSlide": "Tool selection panel", + "viewSwitcher": "Switch workspace view", + "workbenchSlide": "Workspace panel", + "workspace": "Workspace" + }, "multiTool": { + "tags": "multiple,tools", "title": "Đa công cáģĨ PDF", "desc": "GhÊp náģ‘i, Xoay, Sáē¯p xáēŋp láēĄi và XÃŗa trang" }, "merge": { + "tags": "combine,join,unite", "title": "GhÊp náģ‘i", "desc": "Dáģ… dàng ghÊp náģ‘i nhiáģu PDF thành máģ™t." }, "split": { + "tags": "divide,separate,break", "title": "TÃĄch", "desc": "TÃĄch PDF thành nhiáģu tài liáģ‡u" }, "rotate": { + "tags": "turn,flip,orient", "title": "Xoay", "desc": "Dáģ… dàng xoay PDF cáģ§a báēĄn." }, + "convert": { + "tags": "transform,change", + "title": "Chuyáģƒn đáģ•i", + "desc": "Convert files between different formats" + }, + "pdfOrganiser": { + "tags": "organize,rearrange,reorder", + "title": "Sáē¯p xáēŋp", + "desc": "XÃŗa/Sáē¯p xáēŋp láēĄi trang theo báēĨt káģŗ tháģŠ táģą nào" + }, + "addImage": { + "tags": "insert,embed,place", + "title": "ThÃĒm hÃŦnh áēŖnh", + "desc": "ThÃĒm hÃŦnh áēŖnh vào váģ‹ trí cáģ‘ Ä‘áģ‹nh trÃĒn PDF" + }, + "addAttachments": { + "tags": "embed,attach,include", + "title": "Add Attachments", + "desc": "Add or remove embedded files (attachments) to/from a PDF" + }, + "watermark": { + "tags": "stamp,mark,overlay", + "title": "ThÃĒm hÃŦnh máģ", + "desc": "ThÃĒm hÃŦnh máģ tÚy cháģ‰nh vào tài liáģ‡u PDF cáģ§a báēĄn." + }, + "removePassword": { + "tags": "unlock", + "title": "XÃŗa máē­t kháēŠu", + "desc": "XÃŗa báēŖo váģ‡ máē­t kháēŠu kháģi tài liáģ‡u PDF cáģ§a báēĄn." + }, + "compress": { + "tags": "shrink,reduce,optimize", + "title": "NÊn", + "desc": "NÊn PDF đáģƒ giáēŖm kích thưáģ›c táģ‡p." + }, + "unlockPDFForms": { + "tags": "unlock,enable,edit", + "title": "Unlock PDF Forms", + "desc": "Remove read-only property of form fields in a PDF document." + }, + "changeMetadata": { + "tags": "edit,modify,update", + "title": "Thay đáģ•i Metadata", + "desc": "Thay đáģ•i/XÃŗa/ThÃĒm metadata táģĢ tài liáģ‡u PDF" + }, + "ocr": { + "tags": "extract,scan", + "title": "OCR / Dáģn dáēšp báēŖn quÊt", + "desc": "Dáģn dáēšp báēŖn quÊt và phÃĄt hiáģ‡n văn báēŖn táģĢ hÃŦnh áēŖnh trong PDF và thÃĒm láēĄi dưáģ›i dáēĄng văn báēŖn." + }, + "extractImages": { + "tags": "pull,save,export", + "title": "Trích xuáēĨt hÃŦnh áēŖnh", + "desc": "Trích xuáēĨt táēĨt cáēŖ hÃŦnh áēŖnh táģĢ PDF và lưu chÃēng vào táģ‡p zip" + }, + "scannerImageSplit": { + "tags": "detect,split,photos", + "title": "Detect & Split Scanned Photos", + "desc": "Detect and split scanned photos into separate pages" + }, + "sign": { + "tags": "signature,autograph", + "title": "KÃŊ", + "desc": "ThÃĒm cháģ¯ kÃŊ vào PDF báēąng cÃĄch váēŊ, văn báēŖn hoáēˇc hÃŦnh áēŖnh" + }, + "flatten": { + "tags": "simplify,remove,interactive", + "title": "Làm pháēŗng", + "desc": "XÃŗa táēĨt cáēŖ cÃĄc pháē§n táģ­ tÆ°ÆĄng tÃĄc và biáģƒu máēĢu táģĢ PDF" + }, + "certSign": { + "tags": "authenticate,PEM,P12,official,encrypt,sign,certificate,PKCS12,JKS,server,manual,auto", + "title": "KÃŊ báēąng cháģŠng cháģ‰", + "desc": "KÃŊ PDF báēąng CháģŠng cháģ‰/KhÃŗa (PEM/P12)" + }, + "repair": { + "tags": "fix,restore", + "title": "Sáģ­a cháģ¯a", + "desc": "Cáģ‘ gáē¯ng sáģ­a cháģ¯a PDF báģ‹ háģng/láģ—i" + }, + "removeBlanks": { + "tags": "delete,clean,empty", + "title": "XÃŗa trang tráģ‘ng", + "desc": "PhÃĄt hiáģ‡n và xÃŗa cÃĄc trang tráģ‘ng kháģi tài liáģ‡u" + }, + "removeAnnotations": { + "tags": "delete,clean,strip", + "title": "XÃŗa chÃē thích", + "desc": "XÃŗa táēĨt cáēŖ cÃĄc bÃŦnh luáē­n/chÃē thích kháģi PDF" + }, + "compare": { + "tags": "difference", + "title": "So sÃĄnh", + "desc": "So sÃĄnh và hiáģƒn tháģ‹ sáģą khÃĄc biáģ‡t giáģ¯a 2 tài liáģ‡u PDF" + }, + "removeCertSign": { + "tags": "remove,delete,unlock", + "title": "XÃŗa cháģ¯ kÃŊ cháģŠng cháģ‰", + "desc": "XÃŗa cháģ¯ kÃŊ cháģŠng cháģ‰ kháģi PDF" + }, + "pageLayout": { + "tags": "layout,arrange,combine", + "title": "Báģ‘ cáģĨc nhiáģu trang", + "desc": "GhÊp nhiáģu trang cáģ§a tài liáģ‡u PDF thành máģ™t trang duy nháēĨt" + }, + "bookletImposition": { + "tags": "booklet,print,binding", + "title": "Booklet Imposition", + "desc": "Create booklets with proper page ordering and multi-page layout for printing and binding" + }, + "scalePages": { + "tags": "resize,adjust,scale", + "title": "Điáģu cháģ‰nh kích thưáģ›c/táģˇ láģ‡ trang", + "desc": "Thay đáģ•i kích thưáģ›c/táģˇ láģ‡ cáģ§a trang và/hoáēˇc náģ™i dung cáģ§a nÃŗ." + }, + "addPageNumbers": { + "tags": "number,pagination,count", + "title": "ThÃĒm sáģ‘ trang", + "desc": "ThÃĒm sáģ‘ trang xuyÃĒn suáģ‘t tài liáģ‡u áģŸ váģ‹ trí cáģ‘ Ä‘áģ‹nh" + }, + "autoRename": { + "tags": "auto-detect,header-based,organize,relabel", + "title": "Auto Rename PDF File", + "desc": "Auto renames a PDF file based on its detected header" + }, + "adjustContrast": { + "tags": "contrast,brightness,saturation", + "title": "Điáģu cháģ‰nh màu sáē¯c/tÆ°ÆĄng pháēŖn", + "desc": "Điáģu cháģ‰nh đáģ™ tÆ°ÆĄng pháēŖn, đáģ™ bÃŖo hÃ˛a và đáģ™ sÃĄng cáģ§a PDF" + }, + "crop": { + "tags": "trim,cut,resize", + "title": "Cáē¯t PDF", + "desc": "Cáē¯t PDF đáģƒ giáēŖm kích thưáģ›c (giáģ¯ nguyÃĒn văn báēŖn!)" + }, + "autoSplitPDF": { + "tags": "auto,split,QR", + "title": "Táģą Ä‘áģ™ng tÃĄch trang", + "desc": "Táģą Ä‘áģ™ng tÃĄch PDF Ä‘ÃŖ quÊt váģ›i mÃŖ QR tÃĄch trang quÊt váē­t lÃŊ" + }, + "sanitize": { + "tags": "clean,purge,remove", + "title": "Sanitise", + "desc": "Remove potentially harmful elements from PDF files" + }, + "getPdfInfo": { + "tags": "info,metadata,details", + "title": "LáēĨy Táē¤T Cáēĸ thông tin váģ PDF", + "desc": "LáēĨy báēĨt káģŗ và táēĨt cáēŖ thông tin cÃŗ tháģƒ váģ PDF" + }, + "pdfToSinglePage": { + "tags": "combine,merge,single", + "title": "PDF sang máģ™t trang láģ›n", + "desc": "GhÊp táēĨt cáēŖ cÃĄc trang PDF thành máģ™t trang láģ›n duy nháēĨt" + }, + "showJS": { + "tags": "javascript,code,script", + "title": "Hiáģƒn tháģ‹ Javascript", + "desc": "TÃŦm kiáēŋm và hiáģƒn tháģ‹ báēĨt káģŗ JS nào đưáģŖc chèn vào PDF" + }, + "redact": { + "tags": "censor,blackout,hide", + "title": "Manual Redaction", + "desc": "Redacts a PDF based on selected text, drawn shapes and/or selected page(s)" + }, + "splitBySections": { + "tags": "split,sections,divide", + "title": "Split PDF by Sections", + "desc": "Divide each page of a PDF into smaller horizontal and vertical sections" + }, + "addStamp": { + "tags": "stamp,mark,seal", + "title": "Add Stamp to PDF", + "desc": "Add text or add image stamps at set locations" + }, + "removeImage": { + "tags": "remove,delete,clean", + "title": "Remove image", + "desc": "Remove image from PDF to reduce file size" + }, + "splitByChapters": { + "tags": "split,chapters,structure", + "title": "Split PDF by Chapters", + "desc": "Split a PDF into multiple files based on its chapter structure." + }, + "validateSignature": { + "tags": "validate,verify,certificate", + "title": "Validate PDF Signature", + "desc": "Verify digital signatures and certificates in PDF documents" + }, + "swagger": { + "tags": "API,documentation,test", + "title": "API Documentation", + "desc": "View API documentation and test endpoints" + }, + "scannerEffect": { + "tags": "scan,simulate,create", + "title": "Scanner Effect", + "desc": "Create a PDF that looks like it was scanned" + }, + "editTableOfContents": { + "tags": "bookmarks,contents,edit", + "title": "Edit Table of Contents", + "desc": "Add or edit bookmarks and table of contents in PDF documents" + }, + "manageCertificates": { + "tags": "certificates,import,export", + "title": "Manage Certificates", + "desc": "Import, export, or delete digital certificate files used for signing PDFs." + }, + "read": { + "tags": "view,open,display", + "title": "Read", + "desc": "View and annotate PDFs. Highlight text, draw, or insert comments for review and collaboration." + }, + "reorganizePages": { + "tags": "rearrange,reorder,organize", + "title": "Reorganize Pages", + "desc": "Rearrange, duplicate, or delete PDF pages with visual drag-and-drop control." + }, + "extractPages": { + "tags": "pull,select,copy", + "title": "Trích xuáēĨt trang", + "desc": "Extract specific pages from a PDF document" + }, + "removePages": { + "tags": "delete,extract,exclude", + "title": "XÃŗa", + "desc": "XÃŗa cÃĄc trang không mong muáģ‘n kháģi tài liáģ‡u PDF cáģ§a báēĄn." + }, + "autoSizeSplitPDF": { + "tags": "auto,split,size", + "title": "Táģą Ä‘áģ™ng chia theo kích thưáģ›c/sáģ‘ lưáģŖng", + "desc": "Chia máģ™t táģ‡p PDF thành nhiáģu tài liáģ‡u dáģąa trÃĒn kích thưáģ›c, sáģ‘ trang hoáēˇc sáģ‘ lưáģŖng tài liáģ‡u" + }, + "replaceColor": { + "title": "Replace & Invert Colour", + "desc": "Replace or invert colours in PDF documents" + }, + "devApi": { + "tags": "API,development,documentation", + "title": "API", + "desc": "Link to API documentation" + }, + "devFolderScanning": { + "tags": "automation,folder,scanning", + "title": "Automated Folder Scanning", + "desc": "Link to automated folder scanning guide" + }, + "devSsoGuide": { + "title": "SSO Guide", + "desc": "Link to SSO guide" + }, + "devAirgapped": { + "title": "Air-gapped Setup", + "desc": "Link to air-gapped setup guide" + }, + "addPassword": { + "title": "ThÃĒm máē­t kháēŠu", + "desc": "MÃŖ hÃŗa tài liáģ‡u PDF cáģ§a báēĄn báēąng máē­t kháēŠu." + }, + "changePermissions": { + "title": "Thay đáģ•i quyáģn", + "desc": "Change document restrictions and permissions" + }, + "automate": { + "tags": "workflow,sequence,automation", + "title": "Automate", + "desc": "Build multi-step workflows by chaining together PDF actions. Ideal for recurring tasks." + }, + "overlay-pdfs": { + "desc": "Cháģ“ng láģ›p PDF lÃĒn trÃĒn PDF khÃĄc", + "title": "Cháģ“ng láģ›p PDF" + }, "imageToPDF": { "title": "HÃŦnh áēŖnh sang PDF", "desc": "Chuyáģƒn đáģ•i hÃŦnh áēŖnh (PNG, JPEG, GIF) sang PDF." @@ -355,18 +786,6 @@ "title": "PDF sang HÃŦnh áēŖnh", "desc": "Chuyáģƒn đáģ•i PDF sang hÃŦnh áēŖnh. (PNG, JPEG, GIF)" }, - "pdfOrganiser": { - "title": "Sáē¯p xáēŋp", - "desc": "XÃŗa/Sáē¯p xáēŋp láēĄi trang theo báēĨt káģŗ tháģŠ táģą nào" - }, - "addImage": { - "title": "ThÃĒm hÃŦnh áēŖnh", - "desc": "ThÃĒm hÃŦnh áēŖnh vào váģ‹ trí cáģ‘ Ä‘áģ‹nh trÃĒn PDF" - }, - "watermark": { - "title": "ThÃĒm hÃŦnh máģ", - "desc": "ThÃĒm hÃŦnh máģ tÚy cháģ‰nh vào tài liáģ‡u PDF cáģ§a báēĄn." - }, "permissions": { "title": "Thay đáģ•i quyáģn", "desc": "Thay đáģ•i quyáģn cáģ§a tài liáģ‡u PDF cáģ§a báēĄn" @@ -375,38 +794,10 @@ "title": "XÃŗa", "desc": "XÃŗa cÃĄc trang không mong muáģ‘n kháģi tài liáģ‡u PDF cáģ§a báēĄn." }, - "addPassword": { - "title": "ThÃĒm máē­t kháēŠu", - "desc": "MÃŖ hÃŗa tài liáģ‡u PDF cáģ§a báēĄn báēąng máē­t kháēŠu." - }, - "removePassword": { - "title": "XÃŗa máē­t kháēŠu", - "desc": "XÃŗa báēŖo váģ‡ máē­t kháēŠu kháģi tài liáģ‡u PDF cáģ§a báēĄn." - }, - "compress": { - "title": "NÊn", - "desc": "NÊn PDF đáģƒ giáēŖm kích thưáģ›c táģ‡p." - }, - "unlockPDFForms": { - "title": "Unlock PDF Forms", - "desc": "Remove read-only property of form fields in a PDF document." - }, - "changeMetadata": { - "title": "Thay đáģ•i Metadata", - "desc": "Thay đáģ•i/XÃŗa/ThÃĒm metadata táģĢ tài liáģ‡u PDF" - }, "fileToPDF": { "title": "Chuyáģƒn đáģ•i táģ‡p sang PDF", "desc": "Chuyáģƒn đáģ•i háē§u háēŋt máģi táģ‡p sang PDF (DOCX, PNG, XLS, PPT, TXT và nhiáģu hÆĄn náģ¯a)" }, - "ocr": { - "title": "OCR / Dáģn dáēšp báēŖn quÊt", - "desc": "Dáģn dáēšp báēŖn quÊt và phÃĄt hiáģ‡n văn báēŖn táģĢ hÃŦnh áēŖnh trong PDF và thÃĒm láēĄi dưáģ›i dáēĄng văn báēŖn." - }, - "extractImages": { - "title": "Trích xuáēĨt hÃŦnh áēŖnh", - "desc": "Trích xuáēĨt táēĨt cáēŖ hÃŦnh áēŖnh táģĢ PDF và lưu chÃēng vào táģ‡p zip" - }, "pdfToPDFA": { "title": "PDF sang PDF/A", "desc": "Chuyáģƒn đáģ•i PDF sang PDF/A đáģƒ lưu tráģ¯ lÃĸu dài" @@ -435,70 +826,14 @@ "title": "PhÃĄt hiáģ‡n/TÃĄch áēŖnh quÊt", "desc": "TÃĄch nhiáģu áēŖnh táģĢ trong máģ™t áēŖnh/PDF" }, - "sign": { - "title": "KÃŊ", - "desc": "ThÃĒm cháģ¯ kÃŊ vào PDF báēąng cÃĄch váēŊ, văn báēŖn hoáēˇc hÃŦnh áēŖnh" - }, - "flatten": { - "title": "Làm pháēŗng", - "desc": "XÃŗa táēĨt cáēŖ cÃĄc pháē§n táģ­ tÆ°ÆĄng tÃĄc và biáģƒu máēĢu táģĢ PDF" - }, - "repair": { - "title": "Sáģ­a cháģ¯a", - "desc": "Cáģ‘ gáē¯ng sáģ­a cháģ¯a PDF báģ‹ háģng/láģ—i" - }, - "removeBlanks": { - "title": "XÃŗa trang tráģ‘ng", - "desc": "PhÃĄt hiáģ‡n và xÃŗa cÃĄc trang tráģ‘ng kháģi tài liáģ‡u" - }, - "removeAnnotations": { - "title": "XÃŗa chÃē thích", - "desc": "XÃŗa táēĨt cáēŖ cÃĄc bÃŦnh luáē­n/chÃē thích kháģi PDF" - }, - "compare": { - "title": "So sÃĄnh", - "desc": "So sÃĄnh và hiáģƒn tháģ‹ sáģą khÃĄc biáģ‡t giáģ¯a 2 tài liáģ‡u PDF" - }, - "certSign": { - "title": "KÃŊ báēąng cháģŠng cháģ‰", - "desc": "KÃŊ PDF báēąng CháģŠng cháģ‰/KhÃŗa (PEM/P12)" - }, - "removeCertSign": { - "title": "XÃŗa cháģ¯ kÃŊ cháģŠng cháģ‰", - "desc": "XÃŗa cháģ¯ kÃŊ cháģŠng cháģ‰ kháģi PDF" - }, - "pageLayout": { - "title": "Báģ‘ cáģĨc nhiáģu trang", - "desc": "GhÊp nhiáģu trang cáģ§a tài liáģ‡u PDF thành máģ™t trang duy nháēĨt" - }, - "scalePages": { - "title": "Điáģu cháģ‰nh kích thưáģ›c/táģˇ láģ‡ trang", - "desc": "Thay đáģ•i kích thưáģ›c/táģˇ láģ‡ cáģ§a trang và/hoáēˇc náģ™i dung cáģ§a nÃŗ." - }, "pipeline": { "title": "Pipeline (NÃĸng cao)", "desc": "CháēĄy nhiáģu thao tÃĄc trÃĒn PDF báēąng cÃĄch đáģ‹nh nghÄŠa cÃĄc táē­p láģ‡nh pipeline" }, - "addPageNumbers": { - "title": "ThÃĒm sáģ‘ trang", - "desc": "ThÃĒm sáģ‘ trang xuyÃĒn suáģ‘t tài liáģ‡u áģŸ váģ‹ trí cáģ‘ Ä‘áģ‹nh" - }, "auto-rename": { "title": "Táģą Ä‘áģ™ng đáģ•i tÃĒn táģ‡p PDF", "desc": "Táģą Ä‘áģ™ng đáģ•i tÃĒn táģ‡p PDF dáģąa trÃĒn tiÃĒu đáģ Ä‘Æ°áģŖc phÃĄt hiáģ‡n" }, - "adjustContrast": { - "title": "Điáģu cháģ‰nh màu sáē¯c/tÆ°ÆĄng pháēŖn", - "desc": "Điáģu cháģ‰nh đáģ™ tÆ°ÆĄng pháēŖn, đáģ™ bÃŖo hÃ˛a và đáģ™ sÃĄng cáģ§a PDF" - }, - "crop": { - "title": "Cáē¯t PDF", - "desc": "Cáē¯t PDF đáģƒ giáēŖm kích thưáģ›c (giáģ¯ nguyÃĒn văn báēŖn!)" - }, - "autoSplitPDF": { - "title": "Táģą Ä‘áģ™ng tÃĄch trang", - "desc": "Táģą Ä‘áģ™ng tÃĄch PDF Ä‘ÃŖ quÊt váģ›i mÃŖ QR tÃĄch trang quÊt váē­t lÃŊ" - }, "sanitizePDF": { "title": "Làm sáēĄch", "desc": "XÃŗa cÃĄc táē­p láģ‡nh và pháē§n táģ­ khÃĄc kháģi cÃĄc táģ‡p PDF" @@ -519,30 +854,14 @@ "title": "PDF to Markdown", "desc": "Converts any PDF to Markdown" }, - "getPdfInfo": { - "title": "LáēĨy Táē¤T Cáēĸ thông tin váģ PDF", - "desc": "LáēĨy báēĨt káģŗ và táēĨt cáēŖ thông tin cÃŗ tháģƒ váģ PDF" - }, "pageExtracter": { "title": "Trích xuáēĨt (cÃĄc) trang", "desc": "Trích xuáēĨt cÃĄc trang đưáģŖc cháģn táģĢ PDF" }, - "pdfToSinglePage": { - "title": "PDF sang máģ™t trang láģ›n", - "desc": "GhÊp táēĨt cáēŖ cÃĄc trang PDF thành máģ™t trang láģ›n duy nháēĨt" - }, - "showJS": { - "title": "Hiáģƒn tháģ‹ Javascript", - "desc": "TÃŦm kiáēŋm và hiáģƒn tháģ‹ báēĨt káģŗ JS nào đưáģŖc chèn vào PDF" - }, "autoRedact": { "title": "Táģą Ä‘áģ™ng biÃĒn táē­p", "desc": "Táģą Ä‘áģ™ng biÃĒn táē­p (Che đen) văn báēŖn trong PDF dáģąa trÃĒn văn báēŖn đáē§u vào" }, - "redact": { - "title": "Manual Redaction", - "desc": "Redacts a PDF based on selected text, drawn shapes and/or selected page(s)" - }, "PDFToCSV": { "title": "PDF sang CSV", "desc": "Trích xuáēĨt báēŖng táģĢ PDF chuyáģƒn đáģ•i thành CSV" @@ -551,10 +870,6 @@ "title": "Táģą Ä‘áģ™ng chia theo kích thưáģ›c/sáģ‘ lưáģŖng", "desc": "Chia máģ™t táģ‡p PDF thành nhiáģu tài liáģ‡u dáģąa trÃĒn kích thưáģ›c, sáģ‘ trang hoáēˇc sáģ‘ lưáģŖng tài liáģ‡u" }, - "overlay-pdfs": { - "title": "Cháģ“ng láģ›p PDF", - "desc": "Cháģ“ng láģ›p PDF lÃĒn trÃĒn PDF khÃĄc" - }, "split-by-sections": { "title": "Chia PDF theo pháē§n", "desc": "Chia máģ—i trang cáģ§a PDF thành cÃĄc pháē§n nháģ hÆĄn theo chiáģu ngang và dáģc" @@ -563,43 +878,17 @@ "title": "ThÃĒm dáēĨu vào PDF", "desc": "ThÃĒm văn báēŖn hoáēˇc hÃŦnh áēŖnh dáēĨu táēĄi váģ‹ trí cáģ‘ Ä‘áģ‹nh" }, - "removeImage": { - "title": "Remove image", - "desc": "Remove image from PDF to reduce file size" - }, - "splitByChapters": { - "title": "Split PDF by Chapters", - "desc": "Split a PDF into multiple files based on its chapter structure." - }, - "validateSignature": { - "title": "Validate PDF Signature", - "desc": "Verify digital signatures and certificates in PDF documents" - }, "replace-color": { "title": "Replace and Invert Color", "desc": "Replace color for text and background in PDF and invert full color of pdf to reduce file size" }, - "convert": { - "title": "Chuyáģƒn đáģ•i" - }, "attachments": { "title": "Add attachments" }, - "extractPages": { - "title": "Trích xuáēĨt trang" - }, - "removePages": { - "title": "XÃŗa", - "desc": "XÃŗa cÃĄc trang không mong muáģ‘n kháģi tài liáģ‡u PDF cáģ§a báēĄn." - }, "removeImagePdf": { "title": "Remove image", "desc": "Remove image from PDF to reduce file size" }, - "autoSizeSplitPDF": { - "title": "Táģą Ä‘áģ™ng chia theo kích thưáģ›c/sáģ‘ lưáģŖng", - "desc": "Chia máģ™t táģ‡p PDF thành nhiáģu tài liáģ‡u dáģąa trÃĒn kích thưáģ›c, sáģ‘ trang hoáēˇc sáģ‘ lưáģŖng tài liáģ‡u" - }, "adjust-contrast": { "title": "Điáģu cháģ‰nh màu sáē¯c/tÆ°ÆĄng pháēŖn", "desc": "Điáģu cháģ‰nh đáģ™ tÆ°ÆĄng pháēŖn, đáģ™ bÃŖo hÃ˛a và đáģ™ sÃĄng cáģ§a PDF" @@ -607,11 +896,12 @@ "replaceColorPdf": { "title": "Replace and Invert Color", "desc": "Replace color for text and background in PDF and invert full color of pdf to reduce file size" - }, - "changePermissions": { - "title": "Thay đáģ•i quyáģn" } }, + "landing": { + "addFiles": "Add Files", + "uploadFromComputer": "Upload from computer" + }, "viewPdf": { "tags": "xem,đáģc,chÃē thích,văn báēŖn,hÃŦnh áēŖnh", "title": "View/Edit PDF", @@ -645,17 +935,39 @@ "merge": { "tags": "ghÊp náģ‘i,Thao tÃĄc trang,Phía sau,phía mÃĄy cháģ§", "title": "Tráģ™n", + "removeDigitalSignature": { + "label": "Remove digital signature in the merged file?", + "tooltip": { + "title": "Remove Digital Signature", + "description": "Digital signatures will be invalidated when merging files. Check this to remove them from the final merged PDF." + } + }, + "generateTableOfContents": { + "label": "Generate table of contents in the merged file?", + "tooltip": { + "title": "Generate Table of Contents", + "description": "Automatically creates a clickable table of contents in the merged PDF based on the original file names and page numbers." + } + }, + "submit": "Tráģ™n", + "sortBy": { + "description": "Files will be merged in the order they're selected. Drag to reorder or sort below.", + "label": "Sort By", + "filename": "TÃĒn táģ‡p", + "dateModified": "Date Modified", + "ascending": "Ascending", + "descending": "Descending", + "sort": "Sort" + }, + "error": { + "failed": "An error occurred while merging the PDFs." + }, "header": "Tráģ™n nhiáģu PDF (2+)", "sortByName": "Sáē¯p xáēŋp theo tÃĒn", "sortByDate": "Sáē¯p xáēŋp theo ngày", - "removeCertSign": "XÃŗa cháģ¯ kÃŊ sáģ‘ trong táģ‡p Ä‘ÃŖ tráģ™n?", - "submit": "Tráģ™n", - "sortBy": { - "filename": "TÃĒn táģ‡p" - } + "removeCertSign": "XÃŗa cháģ¯ kÃŊ sáģ‘ trong táģ‡p Ä‘ÃŖ tráģ™n?" }, "split": { - "tags": "Thao tÃĄc trang,chia,Nhiáģu trang,cáē¯t,phía mÃĄy cháģ§", "title": "Chia PDF", "header": "Chia PDF", "desc": { @@ -671,25 +983,249 @@ "splitPages": "Nháē­p cÃĄc trang cáē§n chia:", "submit": "Chia", "steps": { + "chooseMethod": "Choose Method", "settings": "Cài đáēˇt" }, + "settings": { + "selectMethodFirst": "Please select a split method first" + }, + "error": { + "failed": "An error occurred while splitting the PDF." + }, + "method": { + "label": "Choose split method", + "placeholder": "Select how to split the PDF" + }, "methods": { + "prefix": { + "splitAt": "Split at", + "splitBy": "Split by" + }, + "byPages": { + "name": "Page Numbers", + "desc": "Extract specific pages (1,3,5-10)", + "tooltip": "Enter page numbers separated by commas or ranges with hyphens" + }, + "bySections": { + "name": "Sections", + "desc": "Divide pages into grid sections", + "tooltip": "Split each page into horizontal and vertical sections" + }, "bySize": { - "name": "Kích thưáģ›c táģ‡p" + "name": "Kích thưáģ›c táģ‡p", + "desc": "Limit maximum file size", + "tooltip": "Specify maximum file size (e.g. 10MB, 500KB)" + }, + "byPageCount": { + "name": "Page Count", + "desc": "Fixed pages per file", + "tooltip": "Enter the number of pages for each split file" + }, + "byDocCount": { + "name": "Document Count", + "desc": "Create specific number of files", + "tooltip": "Enter how many files you want to create" + }, + "byChapters": { + "name": "Chapters", + "desc": "Split at bookmark boundaries", + "tooltip": "Uses PDF bookmarks to determine split points" + }, + "byPageDivider": { + "name": "Page Divider", + "desc": "Auto-split with divider sheets", + "tooltip": "Use QR code divider sheets between documents when scanning" } }, "value": { "fileSize": { - "label": "Kích thưáģ›c táģ‡p" + "label": "Kích thưáģ›c táģ‡p", + "placeholder": "e.g. 10MB, 500KB" + }, + "pageCount": { + "label": "Pages per File", + "placeholder": "e.g. 5, 10" + }, + "docCount": { + "label": "Number of Files", + "placeholder": "e.g. 3, 5" } - } + }, + "tooltip": { + "header": { + "title": "Split Methods Overview" + }, + "byPages": { + "title": "Split at Page Numbers", + "text": "Split your PDF at specific page numbers. Using 'n' splits after page n. Using 'n-m' splits before page n and after page m.", + "bullet1": "Single split points: 3,7 (splits after pages 3 and 7)", + "bullet2": "Range split points: 3-8 (splits before page 3 and after page 8)", + "bullet3": "Mixed: 2,5-10,15 (splits after page 2, before page 5, after page 10, and after page 15)" + }, + "bySections": { + "title": "Split by Grid Sections", + "text": "Divide each page into a grid of sections. Useful for splitting documents with multiple columns or extracting specific areas.", + "bullet1": "Horizontal: Number of rows to create", + "bullet2": "Vertical: Number of columns to create", + "bullet3": "Merge: Combine all sections into one PDF" + }, + "bySize": { + "title": "Split by File Size", + "text": "Create multiple PDFs that don't exceed a specified file size. Ideal for file size limitations or email attachments.", + "bullet1": "Use MB for larger files (e.g., 10MB)", + "bullet2": "Use KB for smaller files (e.g., 500KB)", + "bullet3": "System will split at page boundaries" + }, + "byCount": { + "title": "Split by Count", + "text": "Create multiple PDFs with a specific number of pages or documents each.", + "bullet1": "Page Count: Fixed number of pages per file", + "bullet2": "Document Count: Fixed number of output files", + "bullet3": "Useful for batch processing workflows" + }, + "byChapters": { + "title": "Split by Chapters", + "text": "Use PDF bookmarks to automatically split at chapter boundaries. Requires PDFs with bookmark structure.", + "bullet1": "Bookmark Level: Which level to split on (1=top level)", + "bullet2": "Include Metadata: Preserve document properties", + "bullet3": "Allow Duplicates: Handle repeated bookmark names" + }, + "byDocCount": { + "bullet1": "Enter the number of output files you want", + "bullet2": "Pages are distributed as evenly as possible", + "bullet3": "Useful when you need a specific number of files", + "text": "Create a specific number of output files by evenly distributing pages across them.", + "title": "Split by Document Count" + }, + "byPageCount": { + "bullet1": "Enter the number of pages per output file", + "bullet2": "Last file may have fewer pages if not evenly divisible", + "bullet3": "Useful for batch processing workflows", + "text": "Create multiple PDFs with a specific number of pages each. Perfect for creating uniform document chunks.", + "title": "Split by Page Count" + }, + "byPageDivider": { + "bullet1": "Print divider sheets from the download link", + "bullet2": "Insert divider sheets between your documents", + "bullet3": "Scan all documents together as one PDF", + "bullet4": "Upload - divider pages are automatically detected and removed", + "bullet5": "Enable Duplex Mode if scanning both sides of divider sheets", + "text": "Automatically split scanned documents using physical divider sheets with QR codes. Perfect for processing multiple documents scanned together.", + "title": "Split by Page Divider" + } + }, + "methodSelection": { + "tooltip": { + "bullet1": "Click on a method card to select it", + "bullet2": "Hover over each card to see a quick description", + "bullet3": "The settings step will appear after you select a method", + "bullet4": "You can change methods at any time before processing", + "header": { + "text": "Choose how you want to split your PDF document. Each method is optimized for different use cases and document types.", + "title": "Split Method Selection" + }, + "title": "Choose Your Split Method" + } + }, + "selectMethod": "Select a split method", + "tags": "Thao tÃĄc trang,chia,Nhiáģu trang,cáē¯t,phía mÃĄy cháģ§" }, "rotate": { - "tags": "phía mÃĄy cháģ§", "title": "Xoay PDF", + "submit": "Xoay", + "selectRotation": "Select Rotation Angle (Clockwise)", + "error": { + "failed": "An error occurred while rotating the PDF." + }, + "preview": { + "title": "Rotation Preview" + }, + "rotateLeft": "Rotate Anticlockwise", + "rotateRight": "Rotate Clockwise", + "tooltip": { + "header": { + "title": "Rotate Settings Overview" + }, + "description": { + "text": "Rotate your PDF pages clockwise or anticlockwise in 90-degree increments. All pages in the PDF will be rotated. The preview shows how your document will look after rotation." + }, + "controls": { + "title": "Controls", + "text": "Use the rotation buttons to adjust orientation. Left button rotates anticlockwise, right button rotates clockwise. Each click rotates by 90 degrees." + } + }, + "tags": "phía mÃĄy cháģ§", "header": "Xoay PDF", - "selectAngle": "Cháģn gÃŗc xoay (theo báģ™i sáģ‘ cáģ§a 90 đáģ™):", - "submit": "Xoay" + "selectAngle": "Cháģn gÃŗc xoay (theo báģ™i sáģ‘ cáģ§a 90 đáģ™):" + }, + "convert": { + "title": "Chuyáģƒn đáģ•i", + "desc": "Convert files between different formats", + "files": "Files", + "selectFilesPlaceholder": "Select files in the main view to get started", + "settings": "Cài đáēˇt", + "conversionCompleted": "Conversion completed", + "results": "Results", + "defaultFilename": "converted_file", + "conversionResults": "Conversion Results", + "convertFrom": "Convert from", + "convertTo": "Convert to", + "sourceFormatPlaceholder": "Source format", + "targetFormatPlaceholder": "Target format", + "selectSourceFormatFirst": "Select a source format first", + "outputOptions": "Output Options", + "pdfOptions": "PDF Options", + "imageOptions": "Image Options", + "colorType": "Colour Type", + "color": "Màu sáē¯c", + "greyscale": "Thang đáģ™ xÃĄm", + "blackwhite": "Black & White", + "dpi": "DPI", + "output": "Output", + "single": "Single", + "multiple": "Multiple", + "fitOption": "Fit Option", + "maintainAspectRatio": "Maintain Aspect Ratio", + "fitDocumentToPage": "Fit Document to Page", + "fillPage": "LáēĨp đáē§y trang", + "autoRotate": "Auto Rotate", + "autoRotateDescription": "Automatically rotate images to better fit the PDF page", + "combineImages": "Combine Images", + "combineImagesDescription": "Combine all images into one PDF, or create separate PDFs for each image", + "webOptions": "Web to PDF Options", + "zoomLevel": "Zoom Level", + "emailOptions": "Email to PDF Options", + "includeAttachments": "Include email attachments", + "maxAttachmentSize": "Maximum attachment size (MB)", + "includeAllRecipients": "Include CC and BCC recipients in header", + "downloadHtml": "Download HTML intermediate file instead of PDF", + "pdfaOptions": "PDF/A Options", + "outputFormat": "Output Format", + "pdfaNote": "PDF/A-1b is more compatible, PDF/A-2b supports more features.", + "pdfaDigitalSignatureWarning": "PDF cháģŠa cháģ¯ kÃŊ sáģ‘. Điáģu này sáēŊ báģ‹ xÃŗa trong bưáģ›c tiáēŋp theo.", + "fileFormat": "File Format", + "wordDoc": "Word Document", + "wordDocExt": "Word Document (.docx)", + "odtExt": "OpenDocument Text (.odt)", + "pptExt": "PowerPoint (.pptx)", + "odpExt": "OpenDocument Presentation (.odp)", + "txtExt": "Plain Text (.txt)", + "rtfExt": "Rich Text Format (.rtf)", + "selectedFiles": "Selected files", + "noFileSelected": "No file selected. Use the file panel to add files.", + "convertFiles": "Convert Files", + "converting": "Converting...", + "downloadConverted": "Download Converted File", + "errorNoFiles": "Please select at least one file to convert.", + "errorNoFormat": "Please select both source and target formats.", + "errorNotSupported": "Conversion from {{from}} to {{to}} is not supported.", + "images": "Images", + "officeDocs": "Office Documents (Word, Excel, PowerPoint)", + "imagesExt": "Images (JPG, PNG, etc.)", + "markdown": "Markdown", + "textRtf": "Text/RTF", + "grayscale": "Thang đáģ™ xÃĄm", + "errorConversion": "An error occurred while converting the file." }, "imageToPdf": { "tags": "chuyáģƒn đáģ•i,img,jpg,hÃŦnh áēŖnh,áēŖnh" @@ -727,7 +1263,33 @@ "8": "XÃŗa trang cuáģ‘i", "9": "XÃŗa trang đáē§u và cuáģ‘i", "10": "Tráģ™n láēģ-cháēĩn", - "11": "Duplicate all pages" + "11": "Duplicate all pages", + "desc": { + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, â€Ļ).", + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, â€Ļ).", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimized for binding on the side)." + } + }, + "desc": { + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, â€Ļ).", + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, â€Ļ).", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimised for binding on the side).", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document." }, "placeholder": "(ví dáģĨ: 1,3,2 hoáēˇc 4-8,2,10-12 hoáēˇc 2n-1)" }, @@ -739,9 +1301,198 @@ "upload": "ThÃĒm hÃŦnh áēŖnh", "submit": "ThÃĒm hÃŦnh áēŖnh" }, + "attachments": { + "tags": "embed,attach,file,attachment,attachments", + "title": "Add attachments", + "header": "Add attachments", + "add": "Add Attachment", + "remove": "Remove Attachment", + "embed": "Embed Attachment", + "submit": "Add attachments" + }, "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", "title": "ThÃĒm hÃŦnh máģ", + "desc": "Add text or image watermarks to PDF files", + "completed": "Watermark added", + "submit": "ThÃĒm hÃŦnh máģ", + "filenamePrefix": "watermarked", + "error": { + "failed": "An error occurred while adding watermark to the PDF." + }, + "watermarkType": { + "text": "Văn báēŖn", + "image": "Image" + }, + "settings": { + "type": "Watermark Type", + "text": { + "label": "Watermark Text", + "placeholder": "Enter watermark text" + }, + "image": { + "label": "Watermark Image", + "choose": "Choose Image", + "selected": "Selected: {{filename}}" + }, + "fontSize": "Font Size", + "size": "Size", + "alphabet": "Font/Language", + "color": "Watermark Colour", + "rotation": "Rotation (degrees)", + "opacity": "Opacity (%)", + "spacing": { + "horizontal": "Horizontal Spacing", + "vertical": "Vertical Spacing", + "height": "Height Spacing", + "width": "Width Spacing" + }, + "convertToImage": "Flatten PDF pages to images" + }, + "alphabet": { + "roman": "Roman/Latin", + "arabic": "Arabic", + "japanese": "Japanese", + "korean": "Korean", + "chinese": "Chinese", + "thai": "Thai" + }, + "steps": { + "type": "Watermark Type", + "wording": "Wording", + "textStyle": "Style", + "formatting": "Formatting", + "file": "Watermark File" + }, + "results": { + "title": "Watermark Results" + }, + "tooltip": { + "language": { + "title": "Language Support", + "text": "Choose the appropriate language setting to ensure proper font rendering for your text." + }, + "appearance": { + "title": "Appearance Settings", + "text": "Control how your watermark looks and blends with the document.", + "bullet1": "Rotation: -360° to 360° for angled watermarks", + "bullet2": "Opacity: 0-100% for transparency control", + "bullet3": "Lower opacity creates subtle watermarks" + }, + "spacing": { + "title": "Spacing Control", + "text": "Adjust the spacing between repeated watermarks across the page.", + "bullet1": "Width spacing: Horizontal distance between watermarks", + "bullet2": "Height spacing: Vertical distance between watermarks", + "bullet3": "Higher values create more spread out patterns" + }, + "type": { + "header": { + "title": "Watermark Type Selection" + }, + "description": { + "title": "Choose Your Watermark", + "text": "Select between text or image watermarks based on your needs." + }, + "text": { + "title": "Text Watermarks", + "text": "Perfect for adding copyright notices, company names, or confidentiality labels. Supports multiple languages and custom colours.", + "bullet1": "Customisable fonts and languages", + "bullet2": "Adjustable colours and transparency", + "bullet3": "Ideal for legal or branding text" + }, + "image": { + "title": "Image Watermarks", + "text": "Use logos, stamps, or any image as a watermark. Great for branding and visual identification.", + "bullet1": "Upload any image format", + "bullet2": "Maintains image quality", + "bullet3": "Perfect for logos and stamps" + } + }, + "wording": { + "header": { + "title": "Text Content" + }, + "text": { + "title": "Watermark Text", + "text": "Enter the text that will appear as your watermark across the document.", + "bullet1": "Keep it concise for better readability", + "bullet2": "Common examples: 'CONFIDENTIAL', 'DRAFT', company name", + "bullet3": "Emoji characters are not supported and will be filtered out" + } + }, + "textStyle": { + "header": { + "title": "Text Style" + }, + "color": { + "title": "Colour Selection", + "text": "Choose a colour that provides good contrast with your document content.", + "bullet1": "Light grey (#d3d3d3) for subtle watermarks", + "bullet2": "Black or dark colours for high contrast", + "bullet3": "Custom colours for branding purposes" + }, + "language": { + "title": "Language Support", + "text": "Choose the appropriate language setting to ensure proper font rendering." + } + }, + "file": { + "header": { + "title": "Image Upload" + }, + "upload": { + "title": "Image Selection", + "text": "Upload an image file to use as your watermark.", + "bullet1": "Supports common formats: PNG, JPG, GIF, BMP", + "bullet2": "PNG with transparency works best", + "bullet3": "Higher resolution images maintain quality better" + }, + "recommendations": { + "title": "Best Practices", + "text": "Tips for optimal image watermark results.", + "bullet1": "Use logos or stamps with transparent backgrounds", + "bullet2": "Simple designs work better than complex images", + "bullet3": "Consider the final document size when choosing resolution" + } + }, + "formatting": { + "header": { + "title": "Formatting & Layout" + }, + "size": { + "title": "Size Control", + "text": "Adjust the size of your watermark (text or image).", + "bullet1": "Larger sizes create more prominent watermarks" + }, + "appearance": { + "title": "Appearance Settings", + "text": "Control how your watermark looks and blends with the document.", + "bullet1": "Rotation: -360° to 360° for angled watermarks", + "bullet2": "Opacity: 0-100% for transparency control", + "bullet3": "Lower opacity creates subtle watermarks" + }, + "spacing": { + "title": "Spacing Control", + "text": "Adjust the spacing between repeated watermarks across the page.", + "bullet1": "Horizontal spacing: Distance between watermarks left to right", + "bullet2": "Vertical spacing: Distance between watermarks top to bottom", + "bullet3": "Higher values create more spread out patterns" + }, + "security": { + "title": "Security Option", + "text": "Convert the final PDF to an image-based format for enhanced security.", + "bullet1": "Prevents text selection and copying", + "bullet2": "Makes watermarks harder to remove", + "bullet3": "Results in larger file sizes", + "bullet4": "Best for sensitive or copyrighted content" + } + } + }, + "type": { + "1": "Văn báēŖn", + "2": "HÃŦnh áēŖnh" + }, + "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", "header": "ThÃĒm hÃŦnh máģ", "customColor": "Màu văn báēŖn tÚy cháģ‰nh", "selectText": { @@ -755,14 +1506,6 @@ "8": "LoáēĄi hÃŦnh máģ:", "9": "HÃŦnh áēŖnh hÃŦnh máģ:", "10": "Convert PDF to PDF-Image" - }, - "submit": "ThÃĒm hÃŦnh máģ", - "type": { - "1": "Văn báēŖn", - "2": "HÃŦnh áēŖnh" - }, - "watermarkType": { - "text": "Văn báēŖn" } }, "permissions": { @@ -787,50 +1530,201 @@ "removePages": { "tags": "XÃŗa trang,xÃŗa trang", "title": "XÃŗa", + "pageNumbers": { + "label": "Pages to Remove", + "placeholder": "e.g., 1,3,5-8,10", + "error": "Invalid page number format. Use numbers, ranges (1-5), or mathematical expressions (2n+1)" + }, + "filenamePrefix": "pages_removed", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "settings": { + "title": "Settings" + }, + "tooltip": { + "header": { + "title": "Remove Pages Settings" + }, + "pageNumbers": { + "title": "Page Selection", + "text": "Specify which pages to remove from your PDF. You can select individual pages, ranges, or use mathematical expressions.", + "bullet1": "Individual pages: 1,3,5 (removes pages 1, 3, and 5)", + "bullet2": "Page ranges: 1-5,10-15 (removes pages 1-5 and 10-15)", + "bullet3": "Mathematical: 2n+1 (removes odd pages)", + "bullet4": "Open ranges: 5- (removes from page 5 to end)" + }, + "examples": { + "title": "Common Examples", + "text": "Here are some common page selection patterns:", + "bullet1": "Remove first page: 1", + "bullet2": "Remove last 3 pages: -3", + "bullet3": "Remove every other page: 2n", + "bullet4": "Remove specific scattered pages: 1,5,10,15" + }, + "safety": { + "title": "Safety Tips", + "text": "Important considerations when removing pages:", + "bullet1": "Always preview your selection before processing", + "bullet2": "Keep a backup of your original file", + "bullet3": "Page numbers start from 1, not 0", + "bullet4": "Invalid page numbers will be ignored" + } + }, + "error": { + "failed": "An error occurred whilst removing pages." + }, + "results": { + "title": "Page Removal Results" + }, "submit": "XÃŗa" }, - "addPassword": { - "tags": "báēŖo máē­t,an toàn", - "title": "ThÃĒm máē­t kháēŠu", - "header": "ThÃĒm máē­t kháēŠu (MÃŖ hÃŗa)", - "selectText": { - "1": "Cháģn PDF đáģƒ mÃŖ hÃŗa", - "2": "Máē­t kháēŠu ngưáģi dÚng", - "3": "Đáģ™ dài khÃŗa mÃŖ hÃŗa", - "4": "GiÃĄ tráģ‹ cao hÆĄn thÃŦ máēĄnh hÆĄn, nhưng giÃĄ tráģ‹ tháēĨp hÆĄn cÃŗ tính tÆ°ÆĄng thích táģ‘t hÆĄn.", - "5": "Quyáģn cáē§n đáēˇt (Khuyáēŋn ngháģ‹ sáģ­ dáģĨng cÚng váģ›i máē­t kháēŠu cháģ§ sáģŸ háģ¯u)", - "6": "Ngăn cháēˇn láē¯p rÃĄp tài liáģ‡u", - "7": "Ngăn cháēˇn trích xuáēĨt náģ™i dung", - "8": "Ngăn cháēˇn trích xuáēĨt đáģƒ truy cáē­p", - "9": "Ngăn cháēˇn điáģn vào biáģƒu máēĢu", - "10": "Ngăn cháēˇn sáģ­a đáģ•i", - "11": "Ngăn cháēˇn sáģ­a đáģ•i chÃē thích", - "12": "Ngăn cháēˇn in", - "13": "Ngăn cháēˇn in cÃĄc đáģ‹nh dáēĄng khÃĄc nhau", - "14": "Máē­t kháēŠu cháģ§ sáģŸ háģ¯u", - "15": "HáēĄn cháēŋ nháģ¯ng gÃŦ cÃŗ tháģƒ làm váģ›i tài liáģ‡u sau khi máģŸ (Không đưáģŖc háģ— tráģŖ báģŸi táēĨt cáēŖ cÃĄc trÃŦnh đáģc)", - "16": "HáēĄn cháēŋ viáģ‡c máģŸ tài liáģ‡u" + "extractPages": { + "title": "Extract Pages", + "pageNumbers": { + "label": "Pages to Extract", + "placeholder": "e.g., 1,3,5-8 or odd & 1-10" + }, + "settings": { + "title": "Settings" }, - "submit": "MÃŖ hÃŗa", "tooltip": { - "permissions": { - "title": "Thay đáģ•i quyáģn" + "description": "Extracts the selected pages into a new PDF, preserving order." + }, + "error": { + "failed": "Failed to extract pages" + }, + "results": { + "title": "Pages Extracted" + }, + "submit": "Extract Pages" + }, + "pageSelection": { + "tooltip": { + "header": { + "title": "Page Selection Guide" + }, + "basic": { + "title": "Basic Usage", + "text": "Select specific pages from your PDF document using simple syntax.", + "bullet1": "Individual pages: 1,3,5", + "bullet2": "Page ranges: 3-6 or 10-15", + "bullet3": "All pages: all" + }, + "advanced": { + "title": "Advanced Features" + }, + "tips": { + "title": "Tips", + "text": "Keep these guidelines in mind:", + "bullet1": "Page numbers start from 1 (not 0)", + "bullet2": "Spaces are automatically removed", + "bullet3": "Invalid expressions are ignored" + }, + "syntax": { + "title": "Syntax Basics", + "text": "Use numbers, ranges, keywords, and progressions (n starts at 0). Parentheses are supported.", + "bullets": { + "numbers": "Numbers/ranges: 5, 10-20", + "keywords": "Keywords: odd, even", + "progressions": "Progressions: 3n, 4n+1" + } + }, + "operators": { + "title": "Operators", + "text": "AND has higher precedence than comma. NOT applies within the document range.", + "and": "AND: & or \"and\" — require both conditions (e.g., 1-50 & even)", + "comma": "Comma: , or | — combine selections (e.g., 1-10, 20)", + "not": "NOT: ! or \"not\" — exclude pages (e.g., 3n & not 30)" + }, + "examples": { + "title": "Examples" + }, + "complex": { + "bullet1": "1,3-5,8,2n → pages 1, 3–5, 8, plus evens", + "bullet2": "10-,2n-1 → from page 10 to end + odd pages", + "description": "Mix different types.", + "title": "Complex Combinations" + }, + "description": "Choose which pages to use for the operation. Supports single pages, ranges, formulas, and the all keyword.", + "individual": { + "bullet1": "1,3,5 → selects pages 1, 3, 5", + "bullet2": "2,7,12 → selects pages 2, 7, 12", + "description": "Enter numbers separated by commas.", + "title": "Individual Pages" + }, + "mathematical": { + "bullet1": "2n → all even pages (2, 4, 6â€Ļ)", + "bullet2": "2n-1 → all odd pages (1, 3, 5â€Ļ)", + "bullet3": "3n → every 3rd page (3, 6, 9â€Ļ)", + "bullet4": "4n-1 → pages 3, 7, 11, 15â€Ļ", + "description": "Use n in formulas for patterns.", + "title": "Mathematical Functions" + }, + "ranges": { + "bullet1": "3-6 → selects pages 3–6", + "bullet2": "10-15 → selects pages 10–15", + "bullet3": "5- → selects pages 5 to end", + "description": "Use - for consecutive pages.", + "title": "Page Ranges" + }, + "special": { + "bullet1": "all → selects all pages", + "title": "Special Keywords" } } }, - "removePassword": { - "tags": "báēŖo máē­t,GiáēŖi mÃŖ,an toàn,báģ máē­t kháēŠu,xÃŗa máē­t kháēŠu", - "title": "XÃŗa máē­t kháēŠu", - "header": "XÃŗa máē­t kháēŠu (GiáēŖi mÃŖ)", - "selectText": { - "1": "Cháģn PDF đáģƒ giáēŖi mÃŖ", - "2": "Máē­t kháēŠu" + "bulkSelection": { + "syntaxError": "There is a syntax issue. See Page Selection tips for help.", + "header": { + "title": "Page Selection Guide" }, - "submit": "XÃŗa", - "desc": "XÃŗa báēŖo váģ‡ máē­t kháēŠu kháģi tài liáģ‡u PDF cáģ§a báēĄn.", - "password": { - "stepTitle": "XÃŗa máē­t kháēŠu", - "label": "Máē­t kháēŠu hiáģ‡n táēĄi" + "syntax": { + "title": "Syntax Basics", + "text": "Use numbers, ranges, keywords, and progressions (n starts at 0). Parentheses are supported.", + "bullets": { + "numbers": "Numbers/ranges: 5, 10-20", + "keywords": "Keywords: odd, even", + "progressions": "Progressions: 3n, 4n+1" + } + }, + "operators": { + "title": "Operators", + "text": "AND has higher precedence than comma. NOT applies within the document range.", + "and": "AND: & or \"and\" — require both conditions (e.g., 1-50 & even)", + "comma": "Comma: , or | — combine selections (e.g., 1-10, 20)", + "not": "NOT: ! or \"not\" — exclude pages (e.g., 3n & not 30)" + }, + "examples": { + "title": "Examples", + "first50": "First 50", + "last50": "Last 50", + "every3rd": "Every 3rd", + "oddWithinExcluding": "Odd within 1-20 excluding 5-7", + "combineSets": "Combine sets" + }, + "firstNPages": { + "title": "First N Pages", + "placeholder": "Number of pages" + }, + "lastNPages": { + "title": "Last N Pages", + "placeholder": "Number of pages" + }, + "everyNthPage": { + "title": "Every Nth Page", + "placeholder": "Step size" + }, + "range": { + "title": "Range", + "fromPlaceholder": "From", + "toPlaceholder": "To" + }, + "keywords": { + "title": "Keywords" + }, + "advanced": { + "title": "Advanced" } }, "compressPdfs": { @@ -840,12 +1734,142 @@ "tags": "remove,delete,form,field,readonly", "title": "Remove Read-Only from Form Fields", "header": "Unlock PDF Forms", - "submit": "Remove" + "submit": "Remove", + "description": "This tool will remove read-only restrictions from PDF form fields, making them editable and fillable.", + "filenamePrefix": "unlocked_forms", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst unlocking PDF forms." + }, + "results": { + "title": "Unlocked Forms Results" + } }, "changeMetadata": { - "tags": "TiÃĒu đáģ,tÃĄc giáēŖ,ngày,táēĄo,tháģi gian,nhà xuáēĨt báēŖn,nhà sáēŖn xuáēĨt,tháģ‘ng kÃĒ", - "title": "Thay đáģ•i metadata", "header": "Thay đáģ•i metadata", + "submit": "Thay đáģ•i", + "filenamePrefix": "metadata", + "settings": { + "title": "Metadata Settings" + }, + "standardFields": { + "title": "Standard Fields" + }, + "deleteAll": { + "label": "Remove Existing Metadata", + "checkbox": "Delete all metadata" + }, + "title": { + "label": "Title", + "placeholder": "Document title" + }, + "author": { + "label": "Author", + "placeholder": "Document author" + }, + "subject": { + "label": "Subject", + "placeholder": "Document subject" + }, + "keywords": { + "label": "Keywords", + "placeholder": "Document keywords" + }, + "creator": { + "label": "Creator", + "placeholder": "Document creator" + }, + "producer": { + "label": "Producer", + "placeholder": "Document producer" + }, + "dates": { + "title": "Date Fields" + }, + "creationDate": { + "label": "Creation Date", + "placeholder": "Creation date" + }, + "modificationDate": { + "label": "Modification Date", + "placeholder": "Modification date" + }, + "trapped": { + "label": "Trapped Status", + "unknown": "Unknown", + "true": "True", + "false": "False" + }, + "advanced": { + "title": "Advanced Options" + }, + "customFields": { + "title": "Custom Metadata", + "description": "Add custom metadata fields to the document", + "add": "Add Field", + "key": "Key", + "keyPlaceholder": "Custom key", + "value": "Value", + "valuePlaceholder": "Custom value", + "remove": "Remove" + }, + "results": { + "title": "Updated PDFs" + }, + "error": { + "failed": "An error occurred while changing the PDF metadata." + }, + "tooltip": { + "header": { + "title": "PDF Metadata Overview" + }, + "standardFields": { + "title": "Standard Fields", + "text": "Common PDF metadata fields that describe the document.", + "bullet1": "Title: Document name or heading", + "bullet2": "Author: Person who created the document", + "bullet3": "Subject: Brief description of content", + "bullet4": "Keywords: Search terms for the document", + "bullet5": "Creator/Producer: Software used to create the PDF" + }, + "dates": { + "title": "Date Fields", + "text": "When the document was created and modified.", + "bullet1": "Creation Date: When original document was made", + "bullet2": "Modification Date: When last changed" + }, + "options": { + "title": "Additional Options", + "text": "Custom fields and privacy controls.", + "bullet1": "Custom Metadata: Add your own key-value pairs", + "bullet2": "Trapped Status: High-quality printing setting", + "bullet3": "Delete All: Remove all metadata for privacy" + }, + "deleteAll": { + "title": "Remove Existing Metadata", + "text": "Complete metadata deletion to ensure privacy." + }, + "customFields": { + "title": "Custom Metadata", + "text": "Add your own custom key-value metadata pairs.", + "bullet1": "Add any custom fields relevant to your document", + "bullet2": "Examples: Department, Project, Version, Status", + "bullet3": "Both key and value are required for each entry" + }, + "advanced": { + "title": "Advanced Options", + "trapped": { + "title": "Trapped Status", + "description": "Indicates if document is prepared for high-quality printing.", + "bullet1": "True: Document has been trapped for printing", + "bullet2": "False: Document has not been trapped", + "bullet3": "Unknown: Trapped status is not specified" + } + } + }, + "tags": "TiÃĒu đáģ,tÃĄc giáēŖ,ngày,táēĄo,tháģi gian,nhà xuáēĨt báēŖn,nhà sáēŖn xuáēĨt,tháģ‘ng kÃĒ", "selectText": { "1": "Vui lÃ˛ng cháģ‰nh sáģ­a cÃĄc biáēŋn báēĄn muáģ‘n thay đáģ•i", "2": "XÃŗa táēĨt cáēŖ metadata", @@ -853,15 +1877,7 @@ "4": "Metadata khÃĄc:", "5": "ThÃĒm máģĨc metadata tÚy cháģ‰nh" }, - "author": "TÃĄc giáēŖ:", - "creationDate": "Ngày táēĄo (yyyy/MM/dd HH:mm:ss):", - "creator": "Ngưáģi táēĄo:", - "keywords": "TáģĢ khÃŗa:", - "modDate": "Ngày sáģ­a đáģ•i (yyyy/MM/dd HH:mm:ss):", - "producer": "Nhà sáēŖn xuáēĨt:", - "subject": "Cháģ§ Ä‘áģ:", - "trapped": "Trapped:", - "submit": "Thay đáģ•i" + "modDate": "Ngày sáģ­a đáģ•i (yyyy/MM/dd HH:mm:ss):" }, "fileToPDF": { "tags": "chuyáģƒn đáģ•i,đáģ‹nh dáēĄng,tài liáģ‡u,hÃŦnh áēŖnh,slide,văn báēŖn,chuyáģƒn đáģ•i,văn phÃ˛ng,tài liáģ‡u,word,excel,powerpoint", @@ -875,6 +1891,7 @@ "ocr": { "tags": "nháē­n dáēĄng,văn báēŖn,hÃŦnh áēŖnh,quÊt,đáģc,nháē­n dáēĄng,phÃĄt hiáģ‡n,cÃŗ tháģƒ cháģ‰nh sáģ­a", "title": "OCR / Làm sáēĄch báēŖn Scan", + "desc": "Dáģn dáēšp báēŖn quÊt và phÃĄt hiáģ‡n văn báēŖn táģĢ hÃŦnh áēŖnh trong PDF và thÃĒm láēĄi dưáģ›i dáēĄng văn báēŖn.", "header": "Làm sáēĄch cÃĄc báēŖn Scan / OCR (Nháē­n dáēĄng kÃŊ táģą quang háģc)", "selectText": { "1": "Cháģn ngôn ngáģ¯ cáē§n đưáģŖc phÃĄt hiáģ‡n trong PDF (Nháģ¯ng ngôn ngáģ¯ Ä‘Æ°áģŖc liáģ‡t kÃĒ là nháģ¯ng ngôn ngáģ¯ hiáģ‡n đang đưáģŖc phÃĄt hiáģ‡n):", @@ -893,23 +1910,89 @@ "help": "Vui lÃ˛ng đáģc tài liáģ‡u này váģ cÃĄch sáģ­ dáģĨng cho cÃĄc ngôn ngáģ¯ khÃĄc và/hoáēˇc sáģ­ dáģĨng không trong docker", "credit": "Dáģ‹ch váģĨ này sáģ­ dáģĨng qpdf và Tesseract cho OCR.", "submit": "Xáģ­ lÃŊ PDF váģ›i OCR", - "desc": "Dáģn dáēšp báēŖn quÊt và phÃĄt hiáģ‡n văn báēŖn táģĢ hÃŦnh áēŖnh trong PDF và thÃĒm láēĄi dưáģ›i dáēĄng văn báēŖn.", + "operation": { + "submit": "Process OCR and Review" + }, + "results": { + "title": "OCR Results" + }, + "languagePicker": { + "additionalLanguages": "Looking for additional languages?", + "viewSetupGuide": "View setup guide →" + }, "settings": { "title": "Cài đáēˇt", "ocrMode": { - "label": "Cháēŋ đáģ™ OCR" + "label": "Cháēŋ đáģ™ OCR", + "auto": "Auto (skip text layers)", + "force": "Force (re-OCR all, replace text)", + "strict": "Strict (abort if text found)" }, "languages": { - "label": "Ngôn ngáģ¯" + "label": "Ngôn ngáģ¯", + "placeholder": "Select languages" + }, + "compatibilityMode": { + "label": "Compatibility Mode" + }, + "advancedOptions": { + "label": "Processing Options", + "sidecar": "Create a text file", + "deskew": "Deskew pages", + "clean": "Clean input file", + "cleanFinal": "Clean final output" } }, "tooltip": { + "header": { + "title": "OCR Settings Overview" + }, "mode": { - "title": "Cháēŋ đáģ™ OCR" + "title": "Cháēŋ đáģ™ OCR", + "text": "Optical Character Recognition (OCR) helps you turn scanned or screenshotted pages into text you can search, copy, or highlight.", + "bullet1": "Auto skips pages that already contain text layers.", + "bullet2": "Force re-OCRs every page and replaces all the text.", + "bullet3": "Strict halts if any selectable text is found." }, "languages": { - "title": "Ngôn ngáģ¯" + "title": "Ngôn ngáģ¯", + "text": "Improve OCR accuracy by specifying the expected languages. Choose one or more languages to guide detection." + }, + "output": { + "title": "Output", + "text": "Decide how you want the text output formatted:", + "bullet1": "Searchable PDF embeds text behind the original image.", + "bullet2": "HOCR XML returns a structured machine-readable file.", + "bullet3": "Plain-text sidecar creates a separate .txt file with raw content." + }, + "advanced": { + "header": { + "title": "Advanced OCR Processing" + }, + "compatibility": { + "title": "Compatibility Mode", + "text": "Uses OCR 'sandwich PDF' mode: results in larger files, but more reliable with certain languages and older PDF software. By default we use hOCR for smaller, modern PDFs." + }, + "sidecar": { + "title": "Create Text File", + "text": "Generates a separate .txt file alongside the PDF containing all extracted text content for easy access and processing." + }, + "deskew": { + "title": "Deskew Pages", + "text": "Automatically corrects skewed or tilted pages to improve OCR accuracy. Useful for scanned documents that weren't perfectly aligned." + }, + "clean": { + "title": "Clean Input File", + "text": "Preprocesses the input by removing noise, enhancing contrast, and optimising the image for better OCR recognition before processing." + }, + "cleanFinal": { + "title": "Clean Final Output", + "text": "Post-processes the final PDF by removing OCR artefacts and optimising the text layer for better readability and smaller file size." + } } + }, + "error": { + "failed": "OCR operation failed" } }, "extractImages": { @@ -918,7 +2001,13 @@ "header": "Trích xuáēĨt hÃŦnh áēŖnh", "selectText": "Cháģn đáģ‹nh dáēĄng hÃŦnh áēŖnh đáģƒ chuyáģƒn đáģ•i hÃŦnh áēŖnh Ä‘ÃŖ trích xuáēĨt", "allowDuplicates": "Save duplicate images", - "submit": "Trích xuáēĨt" + "submit": "Trích xuáēĨt", + "settings": { + "title": "Settings" + }, + "error": { + "failed": "An error occurred while extracting images from the PDF." + } }, "pdfToPDFA": { "tags": "lưu tráģ¯,dài háēĄn,tiÃĒu chuáēŠn,chuyáģƒn đáģ•i,lưu tráģ¯,báēŖo quáēŖn", @@ -990,17 +2079,53 @@ }, "info": "Python is not installed. It is required to run." }, + "scannerImageSplit": { + "title": "Extracted Images", + "submit": "Extract Image Scans", + "error": { + "failed": "An error occurred while extracting image scans." + }, + "tooltip": { + "title": "Photo Splitter", + "whatThisDoes": "What this does", + "whatThisDoesDesc": "Automatically finds and extracts each photo from a scanned page or composite image—no manual cropping.", + "whenToUse": "When to use", + "useCase1": "Scan whole album pages in one go", + "useCase2": "Split flatbed batches into separate files", + "useCase3": "Break collages into individual photos", + "useCase4": "Pull photos from documents", + "quickFixes": "Quick fixes", + "problem1": "Photos not detected → increase Tolerance to 30-50", + "problem2": "Too many false detections → increase Minimum Area to 15,000-20,000", + "problem3": "Crops are too tight → increase Border Size to 5-10", + "problem4": "Tilted photos not straightened → lower Angle Threshold to ~5°", + "problem5": "Dust/noise boxes → increase Minimum Contour Area to 1000-2000", + "setupTips": "Setup tips", + "tip1": "Use a plain, light background", + "tip2": "Leave a small gap (≈1 cm) between photos", + "tip3": "Scan at 300-600 DPI", + "tip4": "Clean the scanner glass", + "headsUp": "Heads-up", + "headsUpDesc": "Overlapping photos or backgrounds very close in colour to the photos can reduce accuracy-try a lighter or darker background and leave more space." + } + }, "sign": { - "tags": "áģ§y quyáģn,kÃŊ táē¯t,cháģ¯ kÃŊ váēŊ,kÃŊ văn báēŖn,cháģ¯ kÃŊ hÃŦnh áēŖnh", "title": "KÃŊ", "header": "KÃŊ PDF", "upload": "TáēŖi lÃĒn hÃŦnh áēŖnh", - "draw": "VáēŊ cháģ¯ kÃŊ", - "text": "Nháē­p văn báēŖn", + "draw": { + "title": "Draw your signature", + "clear": "Clear" + }, + "text": { + "name": "Signer Name", + "placeholder": "Enter your full name" + }, "clear": "XÃŗa", "add": "ThÃĒm", "saved": "Saved Signatures", "save": "Save Signature", + "applySignatures": "Apply Signatures", "personalSigs": "Personal Signatures", "sharedSigs": "Shared Signatures", "noSavedSigs": "No saved signatures found", @@ -1012,42 +2137,179 @@ "previous": "Previous page", "maintainRatio": "Toggle maintain aspect ratio", "undo": "Undo", - "redo": "Redo" + "redo": "Redo", + "submit": "Sign Document", + "steps": { + "configure": "Configure Signature" + }, + "type": { + "title": "Signature Type", + "draw": "Draw", + "canvas": "Canvas", + "image": "Image", + "text": "Text" + }, + "image": { + "label": "Upload signature image", + "placeholder": "Select image file", + "hint": "Upload a PNG or JPG image of your signature" + }, + "instructions": { + "title": "How to add signature", + "canvas": "After drawing your signature in the canvas, close the modal then click anywhere on the PDF to place it.", + "image": "After uploading your signature image above, click anywhere on the PDF to place it.", + "text": "After entering your name above, click anywhere on the PDF to place your signature." + }, + "mode": { + "move": "Move Signature", + "place": "Place Signature" + }, + "updateAndPlace": "Update and Place", + "activate": "Activate Signature Placement", + "deactivate": "Stop Placing Signatures", + "results": { + "title": "Signature Results" + }, + "error": { + "failed": "An error occurred while signing the PDF." + }, + "tags": "áģ§y quyáģn,kÃŊ táē¯t,cháģ¯ kÃŊ váēŊ,kÃŊ văn báēŖn,cháģ¯ kÃŊ hÃŦnh áēŖnh" }, "flatten": { - "tags": "tÄŠnh,vô hiáģ‡u hÃŗa,không tÆ°ÆĄng tÃĄc,tinh giáēŖn", "title": "Làm pháēŗng", "header": "Làm pháēŗng PDF", "flattenOnlyForms": "Cháģ‰ làm pháēŗng biáģƒu máēĢu", "submit": "Làm pháēŗng", + "filenamePrefix": "flattened", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, "steps": { "settings": "Cài đáēˇt" }, "options": { - "flattenOnlyForms": "Cháģ‰ làm pháēŗng biáģƒu máēĢu" - } + "stepTitle": "Flatten Options", + "title": "Flatten Options", + "flattenOnlyForms": { + "label": "Cháģ‰ làm pháēŗng biáģƒu máēĢu", + "desc": "Only flatten form fields, leaving other interactive elements intact" + }, + "note": "Flattening removes interactive elements from the PDF, making them non-editable." + }, + "results": { + "title": "Flatten Results" + }, + "error": { + "failed": "An error occurred while flattening the PDF." + }, + "tooltip": { + "header": { + "title": "About Flattening PDFs" + }, + "description": { + "title": "What does flattening do?", + "text": "Flattening makes your PDF non-editable by turning fillable forms and buttons into regular text and images. The PDF will look exactly the same, but no one can change or fill in the forms anymore. Perfect for sharing completed forms, creating final documents for records, or ensuring the PDF looks the same everywhere.", + "bullet1": "Text boxes become regular text (can't be edited)", + "bullet2": "Checkboxes and buttons become pictures", + "bullet3": "Great for final versions you don't want changed", + "bullet4": "Ensures consistent appearance across all devices" + }, + "formsOnly": { + "title": "What does 'Flatten only forms' mean?", + "text": "This option only removes the ability to fill in forms, but keeps other features working like clicking links, viewing bookmarks, and reading comments.", + "bullet1": "Forms become non-editable", + "bullet2": "Links still work when clicked", + "bullet3": "Comments and notes remain visible", + "bullet4": "Bookmarks still help you navigate" + } + }, + "tags": "tÄŠnh,vô hiáģ‡u hÃŗa,không tÆ°ÆĄng tÃĄc,tinh giáēŖn" }, "repair": { "tags": "sáģ­a,khôi pháģĨc,sáģ­a cháģ¯a,pháģĨc háģ“i", "title": "Sáģ­a cháģ¯a", "header": "Sáģ­a cháģ¯a PDF", - "submit": "Sáģ­a cháģ¯a" + "submit": "Sáģ­a cháģ¯a", + "description": "This tool will attempt to repair corrupted or damaged PDF files. No additional settings are required.", + "filenamePrefix": "repaired", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst repairing the PDF." + }, + "results": { + "title": "Repair Results" + } }, "removeBlanks": { - "tags": "dáģn dáēšp,tinh giáēŖn,không náģ™i dung,sáē¯p xáēŋp", "title": "XÃŗa trang tráē¯ng", "header": "XÃŗa trang tráē¯ng", - "threshold": "NgưáģĄng đáģ™ tráē¯ng cáģ§a pixel:", + "settings": { + "title": "Settings" + }, + "threshold": { + "label": "Pixel Whiteness Threshold" + }, + "whitePercent": { + "label": "White Percentage Threshold", + "unit": "%" + }, + "includeBlankPages": { + "label": "Include detected blank pages" + }, + "tooltip": { + "header": { + "title": "Remove Blank Pages Settings" + }, + "threshold": { + "title": "Pixel Whiteness Threshold", + "text": "Controls how white a pixel must be to be considered 'white'. This helps determine what counts as a blank area on the page.", + "bullet1": "0 = Pure black (most restrictive)", + "bullet2": "128 = Medium grey", + "bullet3": "255 = Pure white (least restrictive)" + }, + "whitePercent": { + "title": "White Percentage Threshold", + "text": "Sets the minimum percentage of white pixels required for a page to be considered blank and removed.", + "bullet1": "Lower values (e.g., 80%) = More pages removed", + "bullet2": "Higher values (e.g., 95%) = Only very blank pages removed", + "bullet3": "Use higher values for documents with light backgrounds" + }, + "includeBlankPages": { + "title": "Include Detected Blank Pages", + "text": "When enabled, creates a separate PDF containing all the blank pages that were detected and removed from the original document.", + "bullet1": "Useful for reviewing what was removed", + "bullet2": "Helps verify the detection accuracy", + "bullet3": "Can be disabled to reduce output file size" + } + }, + "submit": "XÃŗa trang tráē¯ng", + "error": { + "failed": "Failed to remove blank pages" + }, + "results": { + "title": "Removed Blank Pages" + }, + "tags": "dáģn dáēšp,tinh giáēŖn,không náģ™i dung,sáē¯p xáēŋp", "thresholdDesc": "NgưáģĄng đáģƒ xÃĄc đáģ‹nh máģŠc đáģ™ tráē¯ng cáģ§a máģ™t pixel đáģƒ Ä‘Æ°áģŖc coi là 'Tráē¯ng'. 0 = Đen, 255 tráē¯ng tinh khiáēŋt.", - "whitePercent": "Pháē§n trăm tráē¯ng (%):", - "whitePercentDesc": "Pháē§n trăm cáģ§a trang pháēŖi là pixel 'tráē¯ng' đáģƒ báģ‹ xÃŗa", - "submit": "XÃŗa trang tráē¯ng" + "whitePercentDesc": "Pháē§n trăm cáģ§a trang pháēŖi là pixel 'tráē¯ng' đáģƒ báģ‹ xÃŗa" }, "removeAnnotations": { "tags": "bÃŦnh luáē­n,Ä‘ÃĄnh dáēĨu,ghi chÃē,Ä‘ÃĄnh dáēĨu,xÃŗa", "title": "XÃŗa chÃē thích", "header": "XÃŗa chÃē thích", - "submit": "XÃŗa" + "submit": "XÃŗa", + "settings": { + "title": "Settings" + }, + "info": { + "title": "About Remove Annotations", + "description": "This tool will remove all annotations (comments, highlights, notes, etc.) from your PDF documents." + }, + "error": { + "failed": "An error occurred while removing annotations from the PDF." + } }, "compare": { "tags": "phÃĸn biáģ‡t,đáģ‘i chiáēŋu,thay đáģ•i,phÃĸn tích", @@ -1079,6 +2341,142 @@ "certSign": { "tags": "xÃĄc tháģąc,PEM,P12,chính tháģŠc,mÃŖ hÃŗa", "title": "KÃŊ báēąng cháģŠng cháģ‰", + "filenamePrefix": "signed", + "signMode": { + "stepTitle": "Sign Mode", + "tooltip": { + "header": { + "title": "About PDF Signatures" + }, + "overview": { + "title": "How signatures work", + "text": "Both modes seal the document (any edits are flagged as tampering) and record who/when/how for auditing. Viewer trust depends on the certificate chain." + }, + "manual": { + "title": "Manual - Bring your certificate", + "text": "Use your own certificate files for brand-aligned identity. Can display Trusted when your CA/chain is recognised.", + "use": "Use for: customer-facing, legal, compliance." + }, + "auto": { + "title": "Auto - Zero-setup, instant system seal", + "text": "Signs with a server self-signed certificate. Same tamper-evident seal and audit trail; typically shows Unverified in viewers.", + "use": "Use when: you need speed and consistent internal identity across reviews and records." + }, + "rule": { + "title": "Rule of thumb", + "text": "Need recipient Trusted status? Manual. Need a fast, tamper-evident seal and audit trail with no setup? Auto." + } + } + }, + "certTypeStep": { + "stepTitle": "Certificate Format" + }, + "certFiles": { + "stepTitle": "Certificate Files" + }, + "appearance": { + "stepTitle": "Signature Appearance", + "tooltip": { + "header": { + "title": "About Signature Appearance" + }, + "invisible": { + "title": "Invisible Signatures", + "text": "The signature is added to the PDF for security but won't be visible when viewing the document. Perfect for legal requirements without changing the document's appearance.", + "bullet1": "Provides security without visual changes", + "bullet2": "Meets legal requirements for digital signing", + "bullet3": "Doesn't affect document layout or design" + }, + "visible": { + "title": "Visible Signatures", + "text": "Shows a signature block on the PDF with your name, date, and optional details. Useful when you want readers to clearly see the document is signed.", + "bullet1": "Shows signer name and date on the document", + "bullet2": "Can include reason and location for signing", + "bullet3": "Choose which page to place the signature", + "bullet4": "Optional logo can be included" + } + }, + "invisible": "Invisible", + "options": { + "title": "Signature Details" + }, + "visible": "Visible" + }, + "sign": { + "submit": "Sign PDF", + "results": "Signed PDF" + }, + "error": { + "failed": "An error occurred whilst processing signatures." + }, + "tooltip": { + "header": { + "title": "About Managing Signatures" + }, + "overview": { + "title": "What can this tool do?", + "text": "This tool lets you check if your PDFs are digitally signed and add new digital signatures. Digital signatures prove who created or approved a document and show if it has been changed since signing.", + "bullet1": "Check existing signatures and their validity", + "bullet2": "View detailed information about signers and certificates", + "bullet3": "Add new digital signatures to secure your documents", + "bullet4": "Multiple files supported with easy navigation" + }, + "validation": { + "title": "Checking Signatures", + "text": "When you check signatures, the tool tells you if they're valid, who signed the document, when it was signed, and whether the document has been changed since signing.", + "bullet1": "Shows if signatures are valid or invalid", + "bullet2": "Displays signer information and signing date", + "bullet3": "Checks if the document was modified after signing", + "bullet4": "Can use custom certificates for verification" + }, + "signing": { + "title": "Adding Signatures", + "text": "To sign a PDF, you need a digital certificate (like PEM, PKCS12, or JKS). You can choose to make the signature visible on the document or keep it invisible for security only.", + "bullet1": "Supports PEM, PKCS12, JKS, and server certificate formats", + "bullet2": "Option to show or hide signature on the PDF", + "bullet3": "Add reason, location, and signer name", + "bullet4": "Choose which page to place visible signatures", + "bullet5": "Use server certificate for simple 'Sign with Stirling-PDF' option" + } + }, + "certType": { + "tooltip": { + "header": { + "title": "About Certificate Types" + }, + "what": { + "title": "What's a certificate?", + "text": "It's a secure ID for your signature that proves you signed. Unless you're required to sign via certificate, we recommend using another secure method like Type, Draw, or Upload." + }, + "which": { + "title": "Which option should I use?", + "text": "Choose the format that matches your certificate file:", + "bullet1": "PKCS#12 (.p12 / .pfx) – one combined file (most common)", + "bullet2": "PFX (.pfx) – Microsoft's version of PKCS12", + "bullet3": "PEM – separate private-key and certificate .pem files", + "bullet4": "JKS – Java .jks keystore for dev / CI-CD workflows" + }, + "convert": { + "title": "Key not listed?", + "text": "Convert your file to a Java keystore (.jks) with keytool, then pick JKS." + } + } + }, + "chooseCertificate": "Choose Certificate File", + "chooseJksFile": "Choose JKS File", + "chooseP12File": "Choose PKCS12 File", + "choosePfxFile": "Choose PFX File", + "choosePrivateKey": "Choose Private Key File", + "location": "Váģ‹ trí", + "logoTitle": "Logo", + "name": "TÃĒn", + "noLogo": "No Logo", + "pageNumber": "Page Number", + "password": "Nháē­p máē­t kháēŠu Keystore hoáēˇc Private Key cáģ§a báēĄn (Náēŋu cÃŗ):", + "passwordOptional": "Leave empty if no password", + "reason": "LÃŊ do", + "serverCertMessage": "Using server certificate - no files or password required", + "showLogo": "Show Logo", "header": "KÃŊ PDF báēąng cháģŠng cháģ‰ cáģ§a báēĄn (Đang trong quÃĄ trÃŦnh phÃĄt triáģƒn)", "selectPDF": "Cháģn táģ‡p PDF đáģƒ kÃŊ:", "jksNote": "Lưu ÃŊ: Náēŋu loáēĄi cháģŠng cháģ‰ cáģ§a báēĄn không đưáģŖc liáģ‡t kÃĒ bÃĒn dưáģ›i, vui lÃ˛ng chuyáģƒn đáģ•i nÃŗ thành táģ‡p Java Keystore (.jks) báēąng công cáģĨ dÃ˛ng láģ‡nh keytool. Sau Ä‘Ãŗ, cháģn tÚy cháģn táģ‡p .jks bÃĒn dưáģ›i.", @@ -1086,13 +2484,7 @@ "selectCert": "Cháģn táģ‡p cháģŠng cháģ‰ cáģ§a báēĄn (đáģ‹nh dáēĄng X.509, cÃŗ tháģƒ là .pem hoáēˇc .der):", "selectP12": "Cháģn táģ‡p Keystore PKCS#12 cáģ§a báēĄn (.p12 hoáēˇc .pfx) (TÚy cháģn, náēŋu cung cáēĨp, nÃŗ pháēŖi cháģŠa khÃŗa riÃĒng và cháģŠng cháģ‰ cáģ§a báēĄn):", "selectJKS": "Cháģn táģ‡p Java Keystore cáģ§a báēĄn (.jks hoáēˇc .keystore):", - "certType": "LoáēĄi cháģŠng cháģ‰", - "password": "Nháē­p máē­t kháēŠu Keystore hoáēˇc Private Key cáģ§a báēĄn (Náēŋu cÃŗ):", "showSig": "Hiáģƒn tháģ‹ cháģ¯ kÃŊ", - "reason": "LÃŊ do", - "location": "Váģ‹ trí", - "name": "TÃĒn", - "showLogo": "Show Logo", "submit": "KÃŊ PDF" }, "removeCertSign": { @@ -1100,7 +2492,18 @@ "title": "XÃŗa cháģ¯ kÃŊ cháģŠng cháģ‰", "header": "XÃŗa cháģŠng cháģ‰ sáģ‘ kháģi PDF", "selectPDF": "Cháģn máģ™t táģ‡p PDF:", - "submit": "XÃŗa cháģ¯ kÃŊ" + "submit": "XÃŗa cháģ¯ kÃŊ", + "description": "This tool will remove digital certificate signatures from your PDF document.", + "filenamePrefix": "unsigned", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst removing certificate signatures." + }, + "results": { + "title": "Certificate Removal Results" + } }, "pageLayout": { "tags": "ghÊp,táģ•ng háģŖp,xem Ä‘ÆĄn,sáē¯p xáēŋp", @@ -1108,16 +2511,157 @@ "header": "Báģ‘ cáģĨc nhiáģu trang", "pagesPerSheet": "Sáģ‘ trang trÃĒn máģ™t táģ:", "addBorder": "ThÃĒm viáģn", - "submit": "Gáģ­i" + "submit": "Gáģ­i", + "desc": { + "2": "Place 2 pages side-by-side on a single sheet.", + "3": "Place 3 pages on a single sheet in a single row.", + "4": "Place 4 pages on a single sheet (2 × 2 grid).", + "9": "Place 9 pages on a single sheet (3 × 3 grid).", + "16": "Place 16 pages on a single sheet (4 × 4 grid)." + }, + "error": { + "failed": "An error occurred while creating the multi-page layout." + } + }, + "bookletImposition": { + "tags": "booklet,imposition,printing,binding,folding,signature", + "title": "Booklet Imposition", + "header": "Booklet Imposition", + "submit": "Create Booklet", + "spineLocation": { + "label": "Spine Location", + "left": "Left (Standard)", + "right": "Right (RTL)" + }, + "doubleSided": { + "label": "Double-sided printing", + "tooltip": "Creates both front and back sides for proper booklet printing" + }, + "manualDuplex": { + "title": "Manual Duplex Mode", + "instructions": "For printers without automatic duplex. You'll need to run this twice:" + }, + "duplexPass": { + "label": "Print Pass", + "first": "1st Pass", + "second": "2nd Pass", + "firstInstructions": "Prints front sides → stack face-down → run again with 2nd Pass", + "secondInstructions": "Load printed stack face-down → prints back sides" + }, + "rtlBinding": { + "label": "Right-to-left binding", + "tooltip": "For Arabic, Hebrew, or other right-to-left languages" + }, + "addBorder": { + "label": "Add borders around pages", + "tooltip": "Adds borders around each page section to help with cutting and alignment" + }, + "addGutter": { + "label": "Add gutter margin", + "tooltip": "Adds inner margin space for binding" + }, + "gutterSize": { + "label": "Gutter size (points)" + }, + "flipOnShortEdge": { + "label": "Flip on short edge (automatic duplex only)", + "tooltip": "Enable for short-edge duplex printing (automatic duplex only - ignored in manual mode)", + "manualNote": "Not needed in manual mode - you flip the stack yourself" + }, + "advanced": { + "toggle": "Advanced Options" + }, + "paperSizeNote": "Paper size is automatically derived from your first page.", + "tooltip": { + "header": { + "title": "Booklet Creation Guide" + }, + "description": { + "title": "What is Booklet Imposition?", + "text": "Creates professional booklets by arranging pages in the correct printing order. Your PDF pages are placed 2-up on landscape sheets so when folded and bound, they read in proper sequence like a real book." + }, + "example": { + "title": "Example: 8-Page Booklet", + "text": "Your 8-page document becomes 2 sheets:", + "bullet1": "Sheet 1 Front: Pages 8, 1 | Back: Pages 2, 7", + "bullet2": "Sheet 2 Front: Pages 6, 3 | Back: Pages 4, 5", + "bullet3": "When folded & stacked: Reads 1→2→3→4→5→6→7→8" + }, + "printing": { + "title": "How to Print & Assemble", + "text": "Follow these steps for perfect booklets:", + "bullet1": "Print double-sided with 'Flip on long edge'", + "bullet2": "Stack sheets in order, fold in half", + "bullet3": "Staple or bind along the folded spine", + "bullet4": "For short-edge printers: Enable 'Flip on short edge' option" + }, + "manualDuplex": { + "title": "Manual Duplex (Single-sided Printers)", + "text": "For printers without automatic duplex:", + "bullet1": "Turn OFF 'Double-sided printing'", + "bullet2": "Select '1st Pass' → Print → Stack face-down", + "bullet3": "Select '2nd Pass' → Load stack → Print backs", + "bullet4": "Fold and assemble as normal" + }, + "advanced": { + "title": "Advanced Options", + "text": "Fine-tune your booklet:", + "bullet1": "Right-to-Left Binding: For Arabic, Hebrew, or RTL languages", + "bullet2": "Borders: Shows cut lines for trimming", + "bullet3": "Gutter Margin: Adds space for binding/stapling", + "bullet4": "Short-edge Flip: Only for automatic duplex printers" + } + }, + "error": { + "failed": "An error occurred while creating the booklet imposition." + } }, "scalePages": { - "tags": "điáģu cháģ‰nh kích thưáģ›c,sáģ­a đáģ•i,kích thưáģ›c,điáģu cháģ‰nh", "title": "Điáģu cháģ‰nh táģˇ láģ‡ trang", "header": "Điáģu cháģ‰nh táģˇ láģ‡ trang", "pageSize": "Kích thưáģ›c cáģ§a máģ™t trang trong tài liáģ‡u.", "keepPageSize": "Original Size", "scaleFactor": "MáģŠc đáģ™ phÃŗng to (cáē¯t cÃēp) cáģ§a máģ™t trang.", - "submit": "Gáģ­i" + "submit": "Gáģ­i", + "tags": "điáģu cháģ‰nh kích thưáģ›c,sáģ­a đáģ•i,kích thưáģ›c,điáģu cháģ‰nh" + }, + "adjustPageScale": { + "tags": "resize,modify,dimension,adapt", + "title": "Adjust Page Scale", + "header": "Adjust Page Scale", + "scaleFactor": { + "label": "Scale Factor" + }, + "pageSize": { + "label": "Target Page Size", + "keep": "Keep Original Size", + "letter": "Letter", + "legal": "Legal" + }, + "submit": "Adjust Page Scale", + "error": { + "failed": "An error occurred while adjusting the page scale." + }, + "tooltip": { + "header": { + "title": "Page Scale Settings Overview" + }, + "description": { + "title": "Description", + "text": "Adjust the size of PDF content and change the page dimensions." + }, + "scaleFactor": { + "title": "Scale Factor", + "text": "Controls how large or small the content appears on the page. Content is scaled and centred - if scaled content is larger than the page size, it may be cropped.", + "bullet1": "1.0 = Original size", + "bullet2": "0.5 = Half size (50% smaller)", + "bullet3": "2.0 = Double size (200% larger, may crop)" + }, + "pageSize": { + "title": "Target Page Size", + "text": "Sets the dimensions of the output PDF pages. 'Keep Original Size' maintains current dimensions, whilst other options resize to standard paper sizes." + } + } }, "add-page-numbers": { "tags": "Ä‘ÃĄnh sáģ‘ trang,gáē¯n nhÃŖn,sáē¯p xáēŋp,cháģ‰ máģĨc" @@ -1126,16 +2670,83 @@ "tags": "táģą Ä‘áģ™ng phÃĄt hiáģ‡n,dáģąa trÃĒn tiÃĒu đáģ,sáē¯p xáēŋp,đáģ•i nhÃŖn", "title": "Táģą Ä‘áģ™ng đáģ•i tÃĒn", "header": "Táģą Ä‘áģ™ng đáģ•i tÃĒn PDF", - "submit": "Táģą Ä‘áģ™ng đáģ•i tÃĒn" + "description": "Automatically finds the title from your PDF content and uses it as the filename.", + "submit": "Táģą Ä‘áģ™ng đáģ•i tÃĒn", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst auto-renaming the PDF." + }, + "results": { + "title": "Auto-Rename Results" + }, + "tooltip": { + "header": { + "title": "How Auto-Rename Works" + }, + "howItWorks": { + "title": "Smart Renaming", + "text": "Automatically finds the title from your PDF content and uses it as the filename.", + "bullet1": "Looks for text that appears to be a title or heading", + "bullet2": "Creates a clean, valid filename from the detected title", + "bullet3": "Keeps the original name if no suitable title is found" + } + } }, "adjust-contrast": { "tags": "hiáģ‡u cháģ‰nh màu sáē¯c,điáģu cháģ‰nh,sáģ­a đáģ•i,nÃĸng cao" }, "crop": { - "tags": "cáē¯t táģ‰a,thu nháģ,cháģ‰nh sáģ­a,đáģ‹nh hÃŦnh", "title": "Cáē¯t cÃēp", "header": "Cáē¯t cÃēp PDF", - "submit": "Gáģ­i" + "submit": "Gáģ­i", + "noFileSelected": "Select a PDF file to begin cropping", + "preview": { + "title": "Crop Area Selection" + }, + "reset": "Reset to full PDF", + "coordinates": { + "title": "Position and Size", + "x": { + "label": "X Position", + "desc": "Left edge (points)" + }, + "y": { + "label": "Y Position", + "desc": "Bottom edge (points)" + }, + "width": { + "label": "Width", + "desc": "Crop width (points)" + }, + "height": { + "label": "Height", + "desc": "Crop height (points)" + } + }, + "error": { + "invalidArea": "Crop area extends beyond PDF boundaries", + "failed": "Failed to crop PDF" + }, + "steps": { + "selectArea": "Select Crop Area" + }, + "tooltip": { + "title": "How to Crop PDFs", + "description": "Select the area to crop from your PDF by dragging and resizing the blue overlay on the thumbnail.", + "drag": "Drag the overlay to move the crop area", + "resize": "Drag the corner and edge handles to resize", + "precision": "Use coordinate inputs for precise positioning" + }, + "results": { + "title": "Crop Results" + }, + "automation": { + "info": "Enter crop coordinates in PDF points. Origin (0,0) is at bottom-left. These values will be applied to all PDFs processed in this automation.", + "reference": "Reference: A4 page is 595.28 × 841.89 points (210mm × 297mm). 1 inch = 72 points." + }, + "tags": "cáē¯t táģ‰a,thu nháģ,cháģ‰nh sáģ­a,đáģ‹nh hÃŦnh" }, "autoSplitPDF": { "tags": "Dáģąa trÃĒn QR,tÃĄch,phÃĸn đoáēĄn quÊt,sáē¯p xáēŋp", @@ -1218,24 +2829,124 @@ "downloadJS": "TáēŖi xuáģ‘ng Javascript", "submit": "Hiáģƒn tháģ‹" }, - "autoRedact": { - "tags": "BiÃĒn táē­p,áē¨n,che đen,đen,bÃēt Ä‘ÃĄnh dáēĨu,áēŠn", - "title": "Táģą Ä‘áģ™ng biÃĒn táē­p", - "header": "Táģą Ä‘áģ™ng biÃĒn táē­p", - "colorLabel": "Màu sáē¯c", - "textsToRedactLabel": "Văn báēŖn cáē§n biÃĒn táē­p (máģ—i dÃ˛ng máģ™t táģĢ)", - "textsToRedactPlaceholder": "ví dáģĨ: \\nMáē­t \\nTáģ‘i máē­t", - "useRegexLabel": "Sáģ­ dáģĨng Regex", - "wholeWordSearchLabel": "TÃŦm kiáēŋm toàn báģ™ táģĢ", - "customPaddingLabel": "Đáģ‡m thÃĒm tÚy cháģ‰nh", - "convertPDFToImageLabel": "Chuyáģƒn đáģ•i PDF thành PDF-HÃŦnh áēŖnh (DÚng đáģƒ xÃŗa văn báēŖn phía sau ô)", - "submitButton": "Gáģ­i" - }, "redact": { "tags": "Redact,Hide,black out,black,marker,hidden,manual", "title": "Manual Redaction", - "header": "Manual Redaction", "submit": "Manual Redaction", + "error": { + "failed": "An error occurred while redacting the PDF." + }, + "modeSelector": { + "title": "Redaction Method", + "mode": "Mode", + "automatic": "Automatic", + "automaticDesc": "Redact text based on search terms", + "manual": "Manual", + "manualDesc": "Click and drag to redact specific areas", + "manualComingSoon": "Manual redaction coming soon" + }, + "auto": { + "header": "Auto Redact", + "settings": { + "title": "Redaction Settings", + "advancedTitle": "NÃĸng cao" + }, + "colorLabel": "Box Colour", + "wordsToRedact": { + "title": "Words to Redact", + "placeholder": "Enter a word", + "add": "ThÃĒm", + "examples": "Examples: Confidential, Top-Secret" + }, + "useRegexLabel": "Use Regex", + "wholeWordSearchLabel": "Whole Word Search", + "customPaddingLabel": "Custom Extra Padding", + "convertPDFToImageLabel": "Convert PDF to PDF-Image" + }, + "tooltip": { + "mode": { + "header": { + "title": "Redaction Method" + }, + "automatic": { + "title": "Automatic Redaction", + "text": "Automatically finds and redacts specified text throughout the document. Perfect for removing consistent sensitive information like names, addresses, or confidential markers." + }, + "manual": { + "title": "Manual Redaction", + "text": "Click and drag to manually select specific areas to redact. Gives you precise control over what gets redacted. (Coming soon)" + } + }, + "words": { + "header": { + "title": "Words to Redact" + }, + "description": { + "title": "Text Matching", + "text": "Enter words or phrases to find and redact in your document. Each word will be searched for separately." + }, + "bullet1": "Add one word at a time", + "bullet2": "Press Enter or click 'Add Another' to add", + "bullet3": "Click × to remove words", + "examples": { + "title": "Common Examples", + "text": "Typical words to redact include: bank details, email addresses, or specific names." + } + }, + "advanced": { + "header": { + "title": "Advanced Redaction Settings" + }, + "color": { + "title": "Box Colour & Padding", + "text": "Customise the appearance of redaction boxes. Black is standard, but you can choose any colour. Padding adds extra space around the found text." + }, + "regex": { + "title": "Use Regex", + "text": "Enable regular expressions for advanced pattern matching. Useful for finding phone numbers, emails, or complex patterns.", + "bullet1": "Example: \\d{4}-\\d{2}-\\d{2} to match any dates in YYYY-MM-DD format", + "bullet2": "Use with caution - test thoroughly" + }, + "wholeWord": { + "title": "Whole Word Search", + "text": "Only match complete words, not partial matches. 'John' won't match 'Johnson' when enabled." + }, + "convert": { + "title": "Convert to PDF-Image", + "text": "Converts the PDF to an image-based PDF after redaction. This ensures text behind redaction boxes is completely removed and unrecoverable." + } + } + }, + "manual": { + "header": "Manual Redaction", + "textBasedRedaction": "Text-based Redaction", + "pageBasedRedaction": "Page-based Redaction", + "convertPDFToImageLabel": "Convert PDF to PDF-Image (Used to remove text behind the box)", + "pageRedactionNumbers": { + "title": "Pages", + "placeholder": "(ví dáģĨ: 1,2,8 hoáēˇc 4,7,12-16 hoáēˇc 2n-1)" + }, + "redactionColor": { + "title": "Redaction Colour" + }, + "export": "Export", + "upload": "Upload", + "boxRedaction": "Box draw redaction", + "zoom": "Zoom", + "zoomIn": "Zoom in", + "zoomOut": "Zoom out", + "nextPage": "Next Page", + "previousPage": "Previous Page", + "toggleSidebar": "Toggle Sidebar", + "showThumbnails": "Show Thumbnails", + "showDocumentOutline": "Show Document Outline (double-click to expand/collapse all items)", + "showAttachments": "Show Attachments", + "showLayers": "Show Layers (double-click to reset all layers to the default state)", + "colourPicker": "Colour Picker", + "findCurrentOutlineItem": "Find current outline item", + "applyChanges": "Apply Changes" + }, + "header": "Manual Redaction", "textBasedRedaction": "Text based Redaction", "pageBasedRedaction": "Page-based Redaction", "convertPDFToImageLabel": "Convert PDF to PDF-Image (Used to remove text behind the box)", @@ -1261,20 +2972,7 @@ "showLayers": "Show Layers (double-click to reset all layers to the default state)", "colourPicker": "Colour Picker", "findCurrentOutlineItem": "Find current outline item", - "applyChanges": "Apply Changes", - "auto": { - "settings": { - "advancedTitle": "NÃĸng cao" - }, - "wordsToRedact": { - "add": "ThÃĒm" - } - }, - "manual": { - "pageRedactionNumbers": { - "placeholder": "(ví dáģĨ: 1,2,8 hoáēˇc 4,7,12-16 hoáēˇc 2n-1)" - } - } + "applyChanges": "Apply Changes" }, "tableExtraxt": { "tags": "CSV,Trích xuáēĨt báēŖng,trích xuáēĨt,chuyáģƒn đáģ•i" @@ -1285,11 +2983,15 @@ "overlay-pdfs": { "tags": "Cháģ“ng láģ›p", "header": "Cháģ“ng láģ›p táģ‡p PDF", + "title": "Overlay PDFs", + "desc": "Overlay one PDF on top of another", "baseFile": { "label": "Cháģn táģ‡p PDF náģn" }, "overlayFiles": { - "label": "Cháģn cÃĄc táģ‡p PDF cháģ“ng láģ›p" + "label": "Cháģn cÃĄc táģ‡p PDF cháģ“ng láģ›p", + "placeholder": "Choose PDF(s)...", + "addMore": "Add more PDFs..." }, "mode": { "label": "Cháģn cháēŋ đáģ™ cháģ“ng láģ›p", @@ -1299,14 +3001,53 @@ }, "counts": { "label": "Sáģ‘ láē§n cháģ“ng láģ›p (cho cháēŋ đáģ™ láēˇp láēĄi cáģ‘ Ä‘áģ‹nh)", - "placeholder": "Nháē­p sáģ‘ láē§n cháģ“ng láģ›p, phÃĸn cÃĄch báēąng dáēĨu pháēŠy (ví dáģĨ: 2,3,1)" + "placeholder": "Nháē­p sáģ‘ láē§n cháģ“ng láģ›p, phÃĸn cÃĄch báēąng dáēĨu pháēŠy (ví dáģĨ: 2,3,1)", + "item": "Count for file", + "noFiles": "Add overlay files to configure counts" }, "position": { "label": "Cháģn váģ‹ trí cháģ“ng láģ›p", "foreground": "Náģn trưáģ›c", "background": "Náģn sau" }, - "submit": "Gáģ­i" + "submit": "Gáģ­i", + "settings": { + "title": "Settings" + }, + "results": { + "title": "Overlay Results" + }, + "tooltip": { + "header": { + "title": "Overlay PDFs Overview" + }, + "description": { + "title": "Description", + "text": "Combine a base PDF with one or more overlay PDFs. Overlays can be applied page-by-page in different modes and placed in the foreground or background." + }, + "mode": { + "title": "Overlay Mode", + "text": "Choose how to distribute overlay pages across the base PDF pages.", + "sequential": "Sequential Overlay: Use pages from the first overlay PDF until it ends, then move to the next.", + "interleaved": "Interleaved Overlay: Take one page from each overlay in turn.", + "fixedRepeat": "Fixed Repeat Overlay: Take a set number of pages from each overlay before moving to the next. Use Counts to set the numbers." + }, + "position": { + "title": "Overlay Position", + "text": "Foreground places the overlay on top of the page. Background places it behind." + }, + "overlayFiles": { + "title": "Overlay Files", + "text": "Select one or more PDFs to overlay on the base. The order of these files affects how pages are applied in Sequential and Fixed Repeat modes." + }, + "counts": { + "title": "Counts (Fixed Repeat only)", + "text": "Provide a positive number for each overlay file showing how many pages to take before moving to the next. Required when mode is Fixed Repeat." + } + }, + "error": { + "failed": "An error occurred while overlaying PDFs." + } }, "split-by-sections": { "tags": "Chia pháē§n,PhÃĸn chia,TÚy cháģ‰nh", @@ -1327,6 +3068,7 @@ "tags": "DáēĨu,ThÃĒm hÃŦnh áēŖnh,căn giáģ¯a hÃŦnh áēŖnh,HÃŦnh máģ,PDF,NhÃēng,TÚy cháģ‰nh", "header": "ÄÃŗng dáēĨu PDF", "title": "ÄÃŗng dáēĨu PDF", + "stampSetup": "Stamp Setup", "stampType": "LoáēĄi dáēĨu", "stampText": "Văn báēŖn dáēĨu", "stampImage": "HÃŦnh áēŖnh dáēĨu", @@ -1339,7 +3081,19 @@ "overrideY": "Ghi đè táģa đáģ™ Y", "customMargin": "Láģ tÚy cháģ‰nh", "customColor": "Màu văn báēŖn tÚy cháģ‰nh", - "submit": "Gáģ­i" + "submit": "Gáģ­i", + "noStampSelected": "No stamp selected. Return to Step 1.", + "customPosition": "Drag the stamp to the desired location in the preview window.", + "error": { + "failed": "An error occurred while adding stamp to the PDF." + }, + "imageSize": "Image Size", + "margin": "Margin", + "positionAndFormatting": "Position & Formatting", + "quickPosition": "Select a position on the page to place the stamp.", + "results": { + "title": "Stamp Results" + } }, "removeImagePdf": { "tags": "Remove Image,Page operations,Back end,server side" @@ -1357,7 +3111,8 @@ "status": { "_value": "Status", "valid": "Valid", - "invalid": "Invalid" + "invalid": "Invalid", + "complete": "Validation complete" }, "signer": "Signer", "date": "Date", @@ -1384,40 +3139,122 @@ "version": "PhiÃĒn báēŖn", "keyUsage": "Key Usage", "selfSigned": "Self-Signed", - "bits": "bits" + "bits": "bits", + "details": "Certificate Details" }, "signature": { "info": "Signature Information", "_value": "Signature", "mathValid": "Signature is mathematically valid BUT:" }, - "selectCustomCert": "Custom Certificate File X.509 (Optional)" - }, - "replace-color": { - "title": "Replace-Invert-Color", - "header": "Replace-Invert Color PDF", - "selectText": { - "1": "Replace or Invert color Options", - "2": "Default(Default high contrast colors)", - "3": "Custom(Customized colors)", - "4": "Full-Invert(Invert all colors)", - "5": "High contrast color options", - "6": "white text on black background", - "7": "Black text on white background", - "8": "Yellow text on black background", - "9": "Green text on black background", - "10": "Choose text Color", - "11": "Choose background Color" + "selectCustomCert": "Custom Certificate File X.509 (Optional)", + "downloadCsv": "Download CSV", + "downloadJson": "Download JSON", + "downloadPdf": "Download PDF Report", + "downloadType": { + "csv": "CSV", + "json": "JSON", + "pdf": "PDF" }, - "submit": "Replace" + "error": { + "allFailed": "Unable to validate the selected files.", + "partial": "Some files could not be validated.", + "reportGeneration": "Could not generate the PDF report. JSON and CSV are available.", + "unexpected": "Unexpected error during validation." + }, + "finalizing": "Preparing downloads...", + "issue": { + "certExpired": "Certificate expired", + "certRevocationUnknown": "Certificate revocation status unknown", + "certRevoked": "Certificate revoked", + "chainInvalid": "Certificate chain invalid", + "signatureInvalid": "Signature cryptographic check failed", + "trustInvalid": "Certificate not trusted" + }, + "noResults": "Run the validation to generate a report.", + "noSignaturesShort": "No signatures", + "processing": "Validating signatures...", + "report": { + "continued": "Continued", + "downloads": "Downloads", + "entryLabel": "Signature Summary", + "fields": { + "created": "Created", + "fileSize": "File Size", + "signatureCount": "Total Signatures", + "signatureDate": "Signature Date" + }, + "filesEvaluated": "{{count}} files evaluated", + "footer": "Validated via Stirling PDF", + "generatedAt": "Generated", + "noPdf": "PDF report will be available after a successful validation.", + "page": "Page", + "shortTitle": "Signature Summary", + "signatureCountLabel": "{{count}} signatures", + "signaturesFound": "{{count}} signatures detected", + "signaturesValid": "{{count}} fully valid", + "title": "Signature Validation Report" + }, + "settings": { + "certHint": "Upload a trusted X.509 certificate to validate against a custom trust source.", + "title": "Validation Settings" + }, + "signatureDate": "Signature Date", + "totalSignatures": "Total Signatures" }, - "replaceColorPdf": { - "tags": "Replace Color,Page operations,Back end,server side" + "replaceColor": { + "tags": "Replace Colour,Page operations,Back end,server side", + "labels": { + "settings": "Settings", + "colourOperation": "Colour operation" + }, + "options": { + "highContrast": "High contrast", + "invertAll": "Invert all colours", + "custom": "Custom", + "cmyk": "Convert to CMYK" + }, + "tooltip": { + "header": { + "title": "Replace & Invert Colour Settings Overview" + }, + "description": { + "title": "Description", + "text": "Transform PDF colours to improve readability and accessibility. Choose from high contrast presets, invert all colours, or create custom colour schemes." + }, + "highContrast": { + "title": "High Contrast", + "text": "Apply predefined high contrast colour combinations designed for better readability and accessibility compliance.", + "bullet1": "White text on black background - Classic dark mode", + "bullet2": "Black text on white background - Standard high contrast", + "bullet3": "Yellow text on black background - High visibility option", + "bullet4": "Green text on black background - Alternative high contrast" + }, + "invertAll": { + "title": "Invert All Colours", + "text": "Completely invert all colours in the PDF, creating a negative-like effect. Useful for creating dark mode versions of documents or reducing eye strain in low-light conditions." + }, + "custom": { + "title": "Custom Colours", + "text": "Define your own text and background colours using the colour pickers. Perfect for creating branded documents or specific accessibility requirements.", + "bullet1": "Text colour - Choose the colour for text elements", + "bullet2": "Background colour - Set the background colour for the document" + }, + "cmyk": { + "title": "Convert to CMYK", + "text": "Convert the PDF from RGB colour space to CMYK colour space, optimized for professional printing. This process converts colours to the Cyan, Magenta, Yellow, Black model used by printers." + } + }, + "error": { + "failed": "An error occurred while processing the colour replacement." + } }, "login": { "title": "Đăng nháē­p", "header": "Đăng nháē­p", "signin": "Đăng nháē­p", + "signInWith": "Sign in with", + "signInAnonymously": "Sign Up as a Guest", "rememberme": "Ghi nháģ› tôi", "invalid": "TÃĒn đăng nháē­p hoáēˇc máē­t kháēŠu không háģŖp láģ‡.", "locked": "Tài khoáēŖn cáģ§a báēĄn Ä‘ÃŖ báģ‹ khÃŗa.", @@ -1436,12 +3273,83 @@ "alreadyLoggedIn": "You are already logged in to", "alreadyLoggedIn2": "devices. Please log out of the devices and try again.", "toManySessions": "You have too many active sessions", - "logoutMessage": "You have been logged out." + "logoutMessage": "You have been logged out.", + "youAreLoggedIn": "You are logged in!", + "email": "Email", + "password": "Password", + "enterEmail": "Enter your email", + "enterPassword": "Enter your password", + "loggingIn": "Logging In...", + "username": "Username", + "enterUsername": "Enter username", + "useEmailInstead": "Login with email", + "forgotPassword": "Forgot your password?", + "logIn": "Log In", + "signingIn": "Signing in...", + "login": "Login", + "or": "Or", + "useMagicLink": "Use magic link instead", + "enterEmailForMagicLink": "Enter your email for magic link", + "sending": "Sendingâ€Ļ", + "sendMagicLink": "Send Magic Link", + "cancel": "Cancel", + "dontHaveAccount": "Don't have an account? Sign up", + "home": "Home", + "debug": "Debug", + "signOut": "Sign Out", + "pleaseEnterBoth": "Please enter both email and password", + "pleaseEnterEmail": "Please enter your email address", + "magicLinkSent": "Magic link sent to {{email}}! Check your email and click the link to sign in.", + "passwordResetSent": "Password reset link sent to {{email}}! Check your email and follow the instructions.", + "failedToSignIn": "Failed to sign in with {{provider}}: {{message}}", + "unexpectedError": "Unexpected error: {{message}}", + "accountCreatedSuccess": "Account created successfully! You can now sign in.", + "passwordChangedSuccess": "Password changed successfully! Please sign in with your new password.", + "credentialsUpdated": "Your credentials have been updated. Please sign in again." + }, + "signup": { + "title": "Create an account", + "subtitle": "Join Stirling PDF to get started", + "name": "Name", + "email": "Email", + "password": "Password", + "confirmPassword": "Confirm password", + "enterName": "Enter your name", + "enterEmail": "Enter your email", + "enterPassword": "Enter your password", + "confirmPasswordPlaceholder": "Confirm password", + "or": "or", + "creatingAccount": "Creating Account...", + "signUp": "Sign Up", + "alreadyHaveAccount": "Already have an account? Sign in", + "pleaseFillAllFields": "Please fill in all fields", + "passwordsDoNotMatch": "Passwords do not match", + "passwordTooShort": "Password must be at least 6 characters long", + "invalidEmail": "Please enter a valid email address", + "checkEmailConfirmation": "Check your email for a confirmation link to complete your registration.", + "accountCreatedSuccessfully": "Account created successfully! You can now sign in.", + "unexpectedError": "Unexpected error: {{message}}", + "useEmailInstead": "Use Email Instead", + "nameRequired": "Name is required", + "emailRequired": "Email is required", + "passwordRequired": "Password is required", + "confirmPasswordRequired": "Please confirm your password" }, "pdfToSinglePage": { "title": "PDF thành máģ™t trang", "header": "PDF thành máģ™t trang", - "submit": "Chuyáģƒn đáģ•i thành máģ™t trang" + "submit": "Chuyáģƒn đáģ•i thành máģ™t trang", + "description": "This tool will merge all pages of your PDF into one large single page. The width will remain the same as the original pages, but the height will be the sum of all page heights.", + "filenamePrefix": "single_page", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst converting to single page." + }, + "results": { + "title": "Single Page Results" + } }, "pageExtracter": { "title": "Trích xuáēĨt trang", @@ -1465,18 +3373,59 @@ "adjustContrast": { "title": "Điáģu cháģ‰nh đáģ™ tÆ°ÆĄng pháēŖn", "header": "Điáģu cháģ‰nh đáģ™ tÆ°ÆĄng pháēŖn", + "basic": "Basic Adjustments", "contrast": "Đáģ™ tÆ°ÆĄng pháēŖn:", "brightness": "Đáģ™ sÃĄng:", "saturation": "Đáģ™ bÃŖo hÃ˛a:", - "download": "TáēŖi xuáģ‘ng" + "download": "TáēŖi xuáģ‘ng", + "adjustColors": "Adjust Colors", + "blue": "Blue", + "confirm": "Confirm", + "error": { + "failed": "Failed to adjust colors/contrast" + }, + "green": "Green", + "noPreview": "Select a PDF to preview", + "red": "Red", + "results": { + "title": "Adjusted PDF" + } }, "compress": { "title": "NÊn", + "desc": "Compress PDFs to reduce their file size.", "header": "NÊn PDF", + "method": { + "title": "Compression Method", + "quality": "Quality", + "filesize": "Kích thưáģ›c táģ‡p" + }, "credit": "Dáģ‹ch váģĨ này sáģ­ dáģĨng qpdf đáģƒ NÊn/Táģ‘i ưu hÃŗa PDF.", "grayscale": { "label": "Áp dáģĨng thang đáģ™ xÃĄm đáģƒ nÊn" }, + "tooltip": { + "header": { + "title": "Compress Settings Overview" + }, + "description": { + "title": "Description", + "text": "Compression is an easy way to reduce your file size. Pick File Size to enter a target size and have us adjust quality for you. Pick Quality to set compression strength manually." + }, + "qualityAdjustment": { + "title": "Quality Adjustment", + "text": "Drag the slider to adjust the compression strength. Lower values (1-3) preserve quality but result in larger files. Higher values (7-9) shrink the file more but reduce image clarity.", + "bullet1": "Lower values preserve quality", + "bullet2": "Higher values reduce file size" + }, + "grayscale": { + "title": "Grayscale", + "text": "Select this option to convert all images to black and white, which can significantly reduce file size especially for scanned PDFs or image-heavy documents." + } + }, + "error": { + "failed": "An error occurred while compressing the PDF." + }, "selectText": { "1": { "_value": "Compression Settings", @@ -1486,10 +3435,7 @@ "4": "Cháēŋ đáģ™ táģą Ä‘áģ™ng - Táģą Ä‘áģ™ng điáģu cháģ‰nh cháēĨt lưáģŖng đáģƒ Ä‘áēĄt đưáģŖc kích thưáģ›c PDF chính xÃĄc", "5": "Kích thưáģ›c PDF mong muáģ‘n (ví dáģĨ: 25MB, 10.8MB, 25KB)" }, - "submit": "NÊn", - "method": { - "filesize": "Kích thưáģ›c táģ‡p" - } + "submit": "NÊn" }, "decrypt": { "passwordPrompt": "This file is password-protected. Please enter the password:", @@ -1590,7 +3536,13 @@ "title": "Remove image", "header": "Remove image", "removeImage": "Remove image", - "submit": "Remove image" + "submit": "Remove image", + "error": { + "failed": "Failed to remove images from the PDF." + }, + "results": { + "title": "Remove Images Results" + } }, "splitByChapters": { "title": "Split PDF by Chapters", @@ -1624,6 +3576,12 @@ }, "note": "Release notes are only available in English" }, + "swagger": { + "title": "API Documentation", + "header": "API Documentation", + "desc": "View and test the Stirling PDF API endpoints", + "tags": "api,documentation,swagger,endpoints,development" + }, "cookieBanner": { "popUp": { "title": "How we use Cookies", @@ -1659,42 +3617,943 @@ "title": "Analytics", "description": "These cookies help us understand how our tools are being used, so we can focus on building the features our community values most. Rest assured—Stirling PDF cannot and will never track the content of the documents you work with." } + }, + "services": { + "posthog": "PostHog Analytics", + "scarf": "Scarf Pixel" } }, - "download": "TáēŖi xuáģ‘ng", - "convert": { - "title": "Chuyáģƒn đáģ•i", - "settings": "Cài đáēˇt", - "color": "Màu sáē¯c", - "greyscale": "Thang đáģ™ xÃĄm", - "fillPage": "LáēĨp đáē§y trang", - "pdfaDigitalSignatureWarning": "PDF cháģŠa cháģ¯ kÃŊ sáģ‘. Điáģu này sáēŊ báģ‹ xÃŗa trong bưáģ›c tiáēŋp theo.", - "grayscale": "Thang đáģ™ xÃĄm" + "removeMetadata": { + "submit": "Remove Metadata" }, - "attachments": { - "tags": "embed,attach,file,attachment,attachments", - "title": "Add attachments", - "header": "Add attachments", - "submit": "Add attachments" + "sidebar": { + "toggle": "Toggle Sidebar" + }, + "theme": { + "toggle": "Toggle Theme" + }, + "view": { + "viewer": "Viewer", + "pageEditor": "Page Editor", + "fileManager": "File Manager" + }, + "pageEditor": { + "title": "Page Editor", + "save": "Save Changes", + "noPdfLoaded": "No PDF loaded. Please upload a PDF to edit.", + "rotatedLeft": "Rotated left:", + "rotatedRight": "Rotated right:", + "deleted": "Deleted:", + "movedLeft": "Moved left:", + "movedRight": "Moved right:", + "splitAt": "Split at:", + "insertedPageBreak": "Inserted page break at:", + "addFileNotImplemented": "Add file not implemented in demo", + "closePdf": "Close PDF", + "reset": "Reset Changes", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "fitToWidth": "Fit to Width", + "actualSize": "Actual Size" + }, + "viewer": { + "firstPage": "First Page", + "lastPage": "Last Page", + "previousPage": "Previous Page", + "nextPage": "Next Page", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "singlePageView": "Single Page View", + "dualPageView": "Dual Page View" + }, + "rightRail": { + "closeSelected": "Close Selected Files", + "selectAll": "Select All", + "deselectAll": "Deselect All", + "selectByNumber": "Select by Page Numbers", + "deleteSelected": "Delete Selected Pages", + "closePdf": "Close PDF", + "exportAll": "Export PDF", + "downloadSelected": "Download Selected Files", + "downloadAll": "Download All", + "toggleTheme": "Toggle Theme", + "language": "Language", + "search": "Search PDF", + "panMode": "Pan Mode", + "rotateLeft": "Rotate Left", + "rotateRight": "Rotate Right", + "toggleSidebar": "Toggle Sidebar", + "exportSelected": "Export Selected Pages", + "toggleAnnotations": "Toggle Annotations Visibility", + "annotationMode": "Toggle Annotation Mode", + "draw": "Draw", + "save": "Save" + }, + "search": { + "title": "Search PDF", + "placeholder": "Enter search term...", + "noResults": "No results found", + "searching": "Searching..." + }, + "guestBanner": { + "title": "You're using Stirling PDF as a guest!", + "message": "Create a free account to save your work, access more features, and support the project.", + "dismiss": "Dismiss banner", + "signUp": "Sign Up Free" + }, + "toolPicker": { + "searchPlaceholder": "Search tools...", + "noToolsFound": "No tools found", + "allTools": "ALL TOOLS", + "quickAccess": "QUICK ACCESS", + "categories": { + "standardTools": "Standard Tools", + "advancedTools": "Advanced Tools", + "recommendedTools": "Recommended Tools" + }, + "subcategories": { + "signing": "Signing", + "documentSecurity": "Document Security", + "verification": "Verification", + "documentReview": "Document Review", + "pageFormatting": "Page Formatting", + "extraction": "Extraction", + "removal": "Removal", + "automation": "Automation", + "general": "General", + "advancedFormatting": "Advanced Formatting", + "developerTools": "Developer Tools" + } }, "quickAccess": { - "sign": "KÃŊ" + "read": "Read", + "sign": "KÃŊ", + "automate": "Automate", + "files": "Files", + "activity": "Activity", + "help": "Help", + "account": "Account", + "config": "Config", + "adminSettings": "Admin Settings", + "allTools": "All Tools" + }, + "admin": { + "error": "Error", + "success": "Success", + "expand": "Expand", + "close": "Close", + "status": { + "active": "Active", + "inactive": "Inactive" + }, + "settings": { + "title": "Admin Settings", + "workspace": "Workspace", + "fetchError": "Failed to load settings", + "saveError": "Failed to save settings", + "saved": "Settings saved successfully", + "saveSuccess": "Settings saved successfully", + "save": "Save Changes", + "restartRequired": "Restart Required", + "restart": { + "title": "Restart Required", + "message": "Settings have been saved successfully. A server restart is required for the changes to take effect.", + "question": "Would you like to restart the server now or later?", + "now": "Restart Now", + "later": "Restart Later" + }, + "restarting": "Restarting Server", + "restartingMessage": "The server is restarting. Please wait a moment...", + "restartError": "Failed to restart server. Please restart manually.", + "general": { + "title": "System Settings", + "description": "Configure system-wide application settings including branding and default behaviour.", + "ui": "User Interface", + "system": "System", + "appName": { + "label": "Application Name", + "description": "The name displayed in the browser tab and home page" + }, + "appNameNavbar": { + "label": "Navbar Brand", + "description": "The name displayed in the navigation bar" + }, + "homeDescription": { + "label": "Home Description", + "description": "The description text shown on the home page" + }, + "defaultLocale": { + "label": "Default Locale", + "description": "The default language for new users (e.g., en_US, es_ES)" + }, + "fileUploadLimit": { + "label": "File Upload Limit", + "description": "Maximum file upload size (e.g., 100MB, 1GB)" + }, + "showUpdate": { + "label": "Show Update Notifications", + "description": "Display notifications when a new version is available" + }, + "showUpdateOnlyAdmin": { + "label": "Show Updates to Admins Only", + "description": "Restrict update notifications to admin users only" + }, + "customHTMLFiles": { + "label": "Custom HTML Files", + "description": "Allow serving custom HTML files from the customFiles directory" + }, + "languages": { + "label": "Available Languages", + "description": "Languages that users can select from (leave empty to enable all languages)" + }, + "customMetadata": { + "label": "Custom Metadata", + "autoUpdate": { + "label": "Auto Update Metadata", + "description": "Automatically update PDF metadata on all processed documents" + }, + "author": { + "label": "Default Author", + "description": "Default author for PDF metadata (e.g., username)" + }, + "creator": { + "label": "Default Creator", + "description": "Default creator for PDF metadata" + }, + "producer": { + "label": "Default Producer", + "description": "Default producer for PDF metadata" + } + }, + "customPaths": { + "label": "Custom Paths", + "description": "Configure custom file system paths for pipeline processing and external tools", + "pipeline": { + "label": "Pipeline Directories", + "watchedFoldersDir": { + "label": "Watched Folders Directory", + "description": "Directory where pipeline monitors for incoming PDFs (leave empty for default: /pipeline/watchedFolders)" + }, + "finishedFoldersDir": { + "label": "Finished Folders Directory", + "description": "Directory where processed PDFs are outputted (leave empty for default: /pipeline/finishedFolders)" + } + }, + "operations": { + "label": "External Tool Paths", + "weasyprint": { + "label": "WeasyPrint Executable", + "description": "Path to WeasyPrint executable for HTML to PDF conversion (leave empty for default: /opt/venv/bin/weasyprint)" + }, + "unoconvert": { + "label": "Unoconvert Executable", + "description": "Path to LibreOffice unoconvert for document conversions (leave empty for default: /opt/venv/bin/unoconvert)" + } + } + } + }, + "security": { + "title": "Security", + "description": "Configure authentication, login behaviour, and security policies.", + "ssoNotice": { + "title": "Looking for SSO/SAML settings?", + "message": "OAuth2 and SAML2 authentication providers have been moved to the Connections menu for easier management." + }, + "authentication": "Authentication", + "enableLogin": { + "label": "Enable Login", + "description": "Require users to log in before accessing the application" + }, + "loginMethod": { + "label": "Login Method", + "description": "The authentication method to use for user login", + "all": "All Methods", + "normal": "Username/Password Only", + "oauth2": "OAuth2 Only", + "saml2": "SAML2 Only" + }, + "loginAttemptCount": { + "label": "Login Attempt Limit", + "description": "Maximum number of failed login attempts before account lockout" + }, + "loginResetTimeMinutes": { + "label": "Login Reset Time (minutes)", + "description": "Time before failed login attempts are reset" + }, + "csrfDisabled": { + "label": "Disable CSRF Protection", + "description": "Disable Cross-Site Request Forgery protection (not recommended)" + }, + "initialLogin": { + "label": "Initial Login", + "username": { + "label": "Initial Username", + "description": "The username for the initial admin account" + }, + "password": { + "label": "Initial Password", + "description": "The password for the initial admin account" + } + }, + "jwt": { + "label": "JWT Configuration", + "secureCookie": { + "label": "Secure Cookie", + "description": "Require HTTPS for JWT cookies (recommended for production)" + }, + "keyRetentionDays": { + "label": "Key Retention Days", + "description": "Number of days to retain old JWT keys for verification" + }, + "persistence": { + "label": "Enable Key Persistence", + "description": "Store JWT keys persistently to survive server restarts" + }, + "enableKeyRotation": { + "label": "Enable Key Rotation", + "description": "Automatically rotate JWT signing keys periodically" + }, + "enableKeyCleanup": { + "label": "Enable Key Cleanup", + "description": "Automatically remove expired JWT keys" + } + }, + "audit": { + "label": "Audit Logging", + "enabled": { + "label": "Enable Audit Logging", + "description": "Track user actions and system events for compliance and security monitoring" + }, + "level": { + "label": "Audit Level", + "description": "0=OFF, 1=BASIC, 2=STANDARD, 3=VERBOSE" + }, + "retentionDays": { + "label": "Audit Retention (days)", + "description": "Number of days to retain audit logs" + } + }, + "htmlUrlSecurity": { + "label": "HTML URL Security", + "description": "Configure URL access restrictions for HTML processing to prevent SSRF attacks", + "enabled": { + "label": "Enable URL Security", + "description": "Enable URL security restrictions for HTML to PDF conversions" + }, + "level": { + "label": "Security Level", + "description": "MAX: whitelist only, MEDIUM: block internal networks, OFF: no restrictions", + "max": "Maximum (Whitelist Only)", + "medium": "Medium (Block Internal)", + "off": "Off (No Restrictions)" + }, + "advanced": "Advanced Settings", + "allowedDomains": { + "label": "Allowed Domains (Whitelist)", + "description": "One domain per line (e.g., cdn.example.com). Only these domains allowed when level is MAX" + }, + "blockedDomains": { + "label": "Blocked Domains (Blacklist)", + "description": "One domain per line (e.g., malicious.com). Additional domains to block" + }, + "internalTlds": { + "label": "Internal TLDs", + "description": "One TLD per line (e.g., .local, .internal). Block domains with these TLD patterns" + }, + "networkBlocking": "Network Blocking", + "blockPrivateNetworks": { + "label": "Block Private Networks", + "description": "Block RFC 1918 private networks (10.x.x.x, 192.168.x.x, 172.16-31.x.x)" + }, + "blockLocalhost": { + "label": "Block Localhost", + "description": "Block localhost and loopback addresses (127.x.x.x, ::1)" + }, + "blockLinkLocal": { + "label": "Block Link-Local Addresses", + "description": "Block link-local addresses (169.254.x.x, fe80::/10)" + }, + "blockCloudMetadata": { + "label": "Block Cloud Metadata Endpoints", + "description": "Block cloud provider metadata endpoints (169.254.169.254)" + } + } + }, + "connections": { + "title": "Connections", + "description": "Configure external authentication providers like OAuth2 and SAML.", + "linkedServices": "Linked Services", + "unlinkedServices": "Unlinked Services", + "connect": "Connect", + "disconnect": "Disconnect", + "disconnected": "Provider disconnected successfully", + "disconnectError": "Failed to disconnect provider", + "ssoAutoLogin": { + "label": "SSO Auto Login", + "enable": "Enable SSO Auto Login", + "description": "Automatically redirect to SSO login when authentication is required" + }, + "oauth2": { + "label": "OAuth2", + "enabled": { + "label": "Enable OAuth2", + "description": "Allow users to authenticate using OAuth2 providers" + }, + "provider": { + "label": "Provider", + "description": "The OAuth2 provider to use for authentication" + }, + "issuer": { + "label": "Issuer URL", + "description": "The OAuth2 provider issuer URL" + }, + "clientId": { + "label": "Client ID", + "description": "The OAuth2 client ID from your provider" + }, + "clientSecret": { + "label": "Client Secret", + "description": "The OAuth2 client secret from your provider" + }, + "useAsUsername": { + "label": "Use as Username", + "description": "The OAuth2 claim to use as the username (e.g., email, sub)" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first OAuth2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via OAuth2" + }, + "scopes": { + "label": "OAuth2 Scopes", + "description": "Comma-separated list of OAuth2 scopes to request (e.g., openid, profile, email)" + } + }, + "saml2": { + "label": "SAML2", + "enabled": { + "label": "Enable SAML2", + "description": "Allow users to authenticate using SAML2 providers" + }, + "provider": { + "label": "Provider", + "description": "The SAML2 provider name" + }, + "registrationId": { + "label": "Registration ID", + "description": "The SAML2 registration identifier" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first SAML2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via SAML2" + } + } + }, + "database": { + "title": "Database", + "description": "Configure custom database connection settings for enterprise deployments.", + "configuration": "Database Configuration", + "enableCustom": { + "label": "Enable Custom Database", + "description": "Use your own custom database configuration instead of the default embedded database" + }, + "customUrl": { + "label": "Custom Database URL", + "description": "Full JDBC connection string (e.g., jdbc:postgresql://localhost:5432/postgres). If provided, individual connection settings below are not used." + }, + "type": { + "label": "Database Type", + "description": "Type of database (not used if custom URL is provided)" + }, + "hostName": { + "label": "Host Name", + "description": "Database server hostname (not used if custom URL is provided)" + }, + "port": { + "label": "Port", + "description": "Database server port (not used if custom URL is provided)" + }, + "name": { + "label": "Database Name", + "description": "Name of the database (not used if custom URL is provided)" + }, + "username": { + "label": "Username", + "description": "Database authentication username" + }, + "password": { + "label": "Password", + "description": "Database authentication password" + } + }, + "privacy": { + "title": "Privacy", + "description": "Configure privacy and data collection settings.", + "analytics": "Analytics & Tracking", + "enableAnalytics": { + "label": "Enable Analytics", + "description": "Collect anonymous usage analytics to help improve the application" + }, + "metricsEnabled": { + "label": "Enable Metrics", + "description": "Enable collection of performance and usage metrics. Provides API endpoint for admins to access metrics data" + }, + "searchEngine": "Search Engine Visibility", + "googleVisibility": { + "label": "Google Visibility", + "description": "Allow search engines to index this application" + } + }, + "advanced": { + "title": "Advanced", + "description": "Configure advanced features and experimental functionality.", + "features": "Feature Flags", + "processing": "Processing", + "endpoints": { + "label": "Endpoints", + "manage": "Manage API Endpoints", + "description": "Endpoint management is configured via YAML. See documentation for details on enabling/disabling specific endpoints." + }, + "enableAlphaFunctionality": { + "label": "Enable Alpha Features", + "description": "Enable experimental and alpha-stage features (may be unstable)" + }, + "enableUrlToPDF": { + "label": "Enable URL to PDF", + "description": "Allow conversion of web pages to PDF documents" + }, + "maxDPI": { + "label": "Maximum DPI", + "description": "Maximum DPI for image processing (0 = unlimited)" + }, + "tessdataDir": { + "label": "Tessdata Directory", + "description": "Path to the tessdata directory for OCR language files" + }, + "disableSanitize": { + "label": "Disable HTML Sanitization", + "description": "WARNING: Security risk - disabling HTML sanitization can lead to XSS vulnerabilities" + }, + "tempFileManagement": { + "label": "Temp File Management", + "description": "Configure temporary file storage and cleanup behavior", + "baseTmpDir": { + "label": "Base Temp Directory", + "description": "Base directory for temporary files (leave empty for default: java.io.tmpdir/stirling-pdf)" + }, + "libreofficeDir": { + "label": "LibreOffice Temp Directory", + "description": "Directory for LibreOffice temp files (leave empty for default: baseTmpDir/libreoffice)" + }, + "systemTempDir": { + "label": "System Temp Directory", + "description": "System temp directory to clean (only used if cleanupSystemTemp is enabled)" + }, + "prefix": { + "label": "Temp File Prefix", + "description": "Prefix for temp file names" + }, + "maxAgeHours": { + "label": "Max Age (hours)", + "description": "Maximum age in hours before temp files are cleaned up" + }, + "cleanupIntervalMinutes": { + "label": "Cleanup Interval (minutes)", + "description": "How often to run cleanup (in minutes)" + }, + "startupCleanup": { + "label": "Startup Cleanup", + "description": "Clean up old temp files on application startup" + }, + "cleanupSystemTemp": { + "label": "Cleanup System Temp", + "description": "Whether to clean broader system temp directory (use with caution)" + } + }, + "processExecutor": { + "label": "Process Executor Limits", + "description": "Configure session limits and timeouts for each process executor", + "sessionLimit": { + "label": "Session Limit", + "description": "Maximum concurrent instances" + }, + "timeout": { + "label": "Timeout (minutes)", + "description": "Maximum execution time" + }, + "libreOffice": "LibreOffice", + "pdfToHtml": "PDF to HTML", + "qpdf": "QPDF", + "tesseract": "Tesseract OCR", + "pythonOpenCv": "Python OpenCV", + "weasyPrint": "WeasyPrint", + "installApp": "Install App", + "calibre": "Calibre", + "ghostscript": "Ghostscript", + "ocrMyPdf": "OCRmyPDF" + } + }, + "mail": { + "title": "Mail Server", + "description": "Configure SMTP settings for sending email notifications.", + "smtp": "SMTP Configuration", + "enabled": { + "label": "Enable Mail", + "description": "Enable email notifications and SMTP functionality" + }, + "host": { + "label": "SMTP Host", + "description": "The hostname or IP address of your SMTP server" + }, + "port": { + "label": "SMTP Port", + "description": "The port number for SMTP connection (typically 25, 465, or 587)" + }, + "username": { + "label": "SMTP Username", + "description": "Username for SMTP authentication" + }, + "password": { + "label": "SMTP Password", + "description": "Password for SMTP authentication" + }, + "from": { + "label": "From Address", + "description": "The email address to use as the sender" + }, + "enableInvites": { + "label": "Enable Email Invites", + "description": "Allow admins to invite users via email with auto-generated passwords" + }, + "frontendUrl": { + "label": "Frontend URL", + "description": "Base URL for frontend (e.g. https://pdf.example.com). Used for generating invite links in emails. Leave empty to use backend URL." + } + }, + "legal": { + "title": "Legal Documents", + "description": "Configure links to legal documents and policies.", + "disclaimer": { + "title": "Legal Responsibility Warning", + "message": "By customizing these legal documents, you assume full responsibility for ensuring compliance with all applicable laws and regulations, including but not limited to GDPR and other EU data protection requirements. Only modify these settings if: (1) you are operating a personal/private instance, (2) you are outside EU jurisdiction and understand your local legal obligations, or (3) you have obtained proper legal counsel and accept sole responsibility for all user data and legal compliance. Stirling-PDF and its developers assume no liability for your legal obligations." + }, + "termsAndConditions": { + "label": "Terms and Conditions", + "description": "URL or filename to terms and conditions" + }, + "privacyPolicy": { + "label": "Privacy Policy", + "description": "URL or filename to privacy policy" + }, + "accessibilityStatement": { + "label": "Accessibility Statement", + "description": "URL or filename to accessibility statement" + }, + "cookiePolicy": { + "label": "Cookie Policy", + "description": "URL or filename to cookie policy" + }, + "impressum": { + "label": "Impressum", + "description": "URL or filename to impressum (required in some jurisdictions)" + } + }, + "premium": { + "title": "Premium & Enterprise", + "description": "Configure your premium or enterprise license key.", + "license": "License Configuration", + "key": { + "label": "License Key", + "description": "Enter your premium or enterprise license key" + }, + "enabled": { + "label": "Enable Premium Features", + "description": "Enable license key checks for pro/enterprise features" + }, + "movedFeatures": { + "title": "Premium Features Distributed", + "message": "Premium and Enterprise features are now organized in their respective sections:" + } + }, + "features": { + "title": "Features", + "description": "Configure optional features and functionality.", + "serverCertificate": { + "label": "Server Certificate", + "description": "Configure server-side certificate generation for \"Sign with Stirling-PDF\" functionality", + "enabled": { + "label": "Enable Server Certificate", + "description": "Enable server-side certificate for \"Sign with Stirling-PDF\" option" + }, + "organizationName": { + "label": "Organization Name", + "description": "Organization name for generated certificates" + }, + "validity": { + "label": "Certificate Validity (days)", + "description": "Number of days the certificate will be valid" + }, + "regenerateOnStartup": { + "label": "Regenerate on Startup", + "description": "Generate new certificate on each application startup" + } + } + }, + "endpoints": { + "title": "API Endpoints", + "description": "Control which API endpoints and endpoint groups are available.", + "management": "Endpoint Management", + "toRemove": { + "label": "Disabled Endpoints", + "description": "Select individual endpoints to disable" + }, + "groupsToRemove": { + "label": "Disabled Endpoint Groups", + "description": "Select endpoint groups to disable" + }, + "note": "Note: Disabling endpoints restricts API access but does not remove UI components. Restart required for changes to take effect." + } + } + }, + "fileUpload": { + "selectFile": "Select a file", + "selectFiles": "Select files", + "selectPdfToView": "Select a PDF to view", + "selectPdfToEdit": "Select a PDF to edit", + "chooseFromStorage": "Choose a file from storage or upload a new PDF", + "chooseFromStorageMultiple": "Choose files from storage or upload new PDFs", + "loadFromStorage": "Load from Storage", + "filesAvailable": "files available", + "loading": "Loading...", + "or": "or", + "dropFileHere": "Drop file here or click to upload", + "dropFilesHere": "Drop files here or click the upload button", + "pdfFilesOnly": "PDF files only", + "supportedFileTypes": "Supported file types", + "upload": "Upload", + "uploadFile": "Upload File", + "uploadFiles": "Upload Files", + "noFilesInStorage": "No files available in storage. Upload some files first.", + "selectFromStorage": "Select from Storage", + "backToTools": "Back to Tools", + "addFiles": "Add Files", + "dragFilesInOrClick": "Drag files in or click \"Add Files\" to browse" + }, + "fileEditor": { + "addFiles": "Add Files" }, "fileManager": { + "title": "Upload PDF Files", + "subtitle": "Add files to your storage for easy access across tools", + "filesSelected": "files selected", + "clearSelection": "Clear Selection", + "openInFileEditor": "Open in File Editor", + "uploadError": "Failed to upload some files.", + "failedToOpen": "Failed to open file. It may have been removed from storage.", + "failedToLoad": "Failed to load file to active set.", + "storageCleared": "Browser cleared storage. Files have been removed. Please re-upload.", + "clearAll": "Clear All", + "reloadFiles": "Reload Files", + "dragDrop": "Drag & Drop files here", + "clickToUpload": "Click to upload files", + "selectedFiles": "Selected Files", + "storage": "Storage", + "filesStored": "files stored", + "storageError": "Storage error occurred", + "storageLow": "Storage is running low. Consider removing old files.", + "supportMessage": "Powered by browser database storage for unlimited capacity", + "noFileSelected": "No files selected", + "showHistory": "Show History", + "hideHistory": "Hide History", + "fileHistory": "File History", + "loadingHistory": "Loading History...", + "lastModified": "Last Modified", + "toolChain": "Tools Applied", + "restore": "Restore", + "unzip": "Unzip", + "searchFiles": "Search files...", + "recent": "Recent", + "localFiles": "Local Files", + "googleDrive": "Google Drive", + "googleDriveShort": "Drive", + "myFiles": "My Files", + "noRecentFiles": "No recent files found", + "googleDriveNotAvailable": "Google Drive integration not available", + "openFiles": "Open Files", + "openFile": "Open File", + "details": "File Details", "fileName": "TÃĒn", + "fileFormat": "Format", + "fileSize": "Size", "fileVersion": "PhiÃĒn báēŖn", + "totalSelected": "Total Selected", + "dropFilesHere": "Drop files here", + "selectAll": "Select All", + "deselectAll": "Deselect All", + "deleteSelected": "Delete Selected", + "downloadSelected": "Download Selected", + "selectedCount": "{{count}} selected", "download": "TáēŖi xuáģ‘ng", - "delete": "XÃŗa" + "delete": "XÃŗa", + "unsupported": "Unsupported", + "addToUpload": "Add to Upload", + "deleteAll": "Delete All", + "loadingFiles": "Loading files...", + "noFiles": "No files available", + "noFilesFound": "No files found matching your search", + "openInPageEditor": "Open in Page Editor", + "showAll": "Show All", + "sortByDate": "Sort by Date", + "sortByName": "Sort by Name", + "sortBySize": "Sort by Size" + }, + "storage": { + "temporaryNotice": "Files are stored temporarily in your browser and may be cleared automatically", + "storageLimit": "Storage limit", + "storageUsed": "Temporary Storage used", + "storageFull": "Storage is nearly full. Consider removing some files.", + "fileTooLarge": "File too large. Maximum size per file is", + "storageQuotaExceeded": "Storage quota exceeded. Please remove some files before uploading more.", + "approximateSize": "Approximate size" }, "sanitize": { + "title": "Sanitise", + "desc": "Remove potentially harmful elements from PDF files.", "submit": "Làm sáēĄch PDF", + "completed": "Sanitisation completed successfully", + "error": { + "generic": "Sanitisation failed", + "failed": "An error occurred while sanitising the PDF." + }, + "filenamePrefix": "sanitised", + "sanitizationResults": "Sanitisation Results", "steps": { - "settings": "Cài đáēˇt" + "files": "Files", + "settings": "Cài đáēˇt", + "results": "Results" + }, + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "options": { + "title": "Sanitisation Options", + "note": "Select the elements you want to remove from the PDF. At least one option must be selected.", + "removeJavaScript": { + "label": "Remove JavaScript", + "desc": "Remove JavaScript actions and scripts from the PDF" + }, + "removeEmbeddedFiles": { + "label": "Remove Embedded Files", + "desc": "Remove any files embedded within the PDF" + }, + "removeXMPMetadata": { + "label": "Remove XMP Metadata", + "desc": "Remove XMP metadata from the PDF" + }, + "removeMetadata": { + "label": "Remove Document Metadata", + "desc": "Remove document information metadata (title, author, etc.)" + }, + "removeLinks": { + "label": "Remove Links", + "desc": "Remove external links and launch actions from the PDF" + }, + "removeFonts": { + "label": "Remove Fonts", + "desc": "Remove embedded fonts from the PDF" + } + } + }, + "addPassword": { + "title": "ThÃĒm máē­t kháēŠu", + "desc": "Encrypt your PDF document with a password.", + "completed": "Password protection applied", + "submit": "MÃŖ hÃŗa", + "filenamePrefix": "encrypted", + "error": { + "failed": "An error occurred while encrypting the PDF." + }, + "passwords": { + "stepTitle": "Passwords & Encryption", + "completed": "Passwords configured", + "user": { + "label": "User Password", + "placeholder": "Enter user password" + }, + "owner": { + "label": "Owner Password", + "placeholder": "Enter owner password" + } + }, + "encryption": { + "keyLength": { + "label": "Encryption Key Length", + "40bit": "40-bit (Low)", + "128bit": "128-bit (Standard)", + "256bit": "256-bit (High)" + } + }, + "results": { + "title": "Encrypted PDFs" + }, + "tooltip": { + "header": { + "title": "Password Protection Overview" + }, + "passwords": { + "title": "Password Types", + "text": "User passwords restrict opening the document, while owner passwords control what can be done with the document once opened. You can set both or just one.", + "bullet1": "User Password: Required to open the PDF", + "bullet2": "Owner Password: Controls document permissions (not supported by all PDF viewers)" + }, + "encryption": { + "title": "Encryption Levels", + "text": "Higher encryption levels provide better security but may not be supported by older PDF viewers.", + "bullet1": "40-bit: Basic security, compatible with older viewers", + "bullet2": "128-bit: Standard security, widely supported", + "bullet3": "256-bit: Maximum security, requires modern viewers" + }, + "permissions": { + "title": "Thay đáģ•i quyáģn", + "text": "These permissions control what users can do with the PDF. Most effective when combined with an owner password." + } + }, + "tags": "báēŖo máē­t,an toàn", + "header": "ThÃĒm máē­t kháēŠu (MÃŖ hÃŗa)", + "selectText": { + "1": "Cháģn PDF đáģƒ mÃŖ hÃŗa", + "2": "Máē­t kháēŠu ngưáģi dÚng", + "3": "Đáģ™ dài khÃŗa mÃŖ hÃŗa", + "4": "GiÃĄ tráģ‹ cao hÆĄn thÃŦ máēĄnh hÆĄn, nhưng giÃĄ tráģ‹ tháēĨp hÆĄn cÃŗ tính tÆ°ÆĄng thích táģ‘t hÆĄn.", + "5": "Quyáģn cáē§n đáēˇt (Khuyáēŋn ngháģ‹ sáģ­ dáģĨng cÚng váģ›i máē­t kháēŠu cháģ§ sáģŸ háģ¯u)", + "6": "Ngăn cháēˇn láē¯p rÃĄp tài liáģ‡u", + "7": "Ngăn cháēˇn trích xuáēĨt náģ™i dung", + "8": "Ngăn cháēˇn trích xuáēĨt đáģƒ truy cáē­p", + "9": "Ngăn cháēˇn điáģn vào biáģƒu máēĢu", + "10": "Ngăn cháēˇn sáģ­a đáģ•i", + "11": "Ngăn cháēˇn sáģ­a đáģ•i chÃē thích", + "12": "Ngăn cháēˇn in", + "13": "Ngăn cháēˇn in cÃĄc đáģ‹nh dáēĄng khÃĄc nhau", + "14": "Máē­t kháēŠu cháģ§ sáģŸ háģ¯u", + "15": "HáēĄn cháēŋ nháģ¯ng gÃŦ cÃŗ tháģƒ làm váģ›i tài liáģ‡u sau khi máģŸ (Không đưáģŖc háģ— tráģŖ báģŸi táēĨt cáēŖ cÃĄc trÃŦnh đáģc)", + "16": "HáēĄn cháēŋ viáģ‡c máģŸ tài liáģ‡u" } }, "changePermissions": { "title": "Thay đáģ•i quyáģn", + "desc": "Change document restrictions and permissions.", + "completed": "Permissions changed", "submit": "Thay đáģ•i quyáģn", + "error": { + "failed": "An error occurred while changing PDF permissions." + }, "permissions": { "preventAssembly": { "label": "Ngăn cháēˇn láē¯p rÃĄp tài liáģ‡u" @@ -1721,10 +4580,784 @@ "label": "Ngăn cháēˇn in cÃĄc đáģ‹nh dáēĄng khÃĄc nhau" } }, + "results": { + "title": "Modified PDFs" + }, "tooltip": { "header": { "title": "Thay đáģ•i quyáģn" + }, + "description": { + "text": "Changes document permissions, allowing/disallowing access to different features in PDF readers." + }, + "warning": { + "text": "To make these permissions unchangeable, use the Add Password tool to set an owner password." } } + }, + "removePassword": { + "title": "XÃŗa máē­t kháēŠu", + "desc": "XÃŗa báēŖo váģ‡ máē­t kháēŠu kháģi tài liáģ‡u PDF cáģ§a báēĄn.", + "tags": "báēŖo máē­t,GiáēŖi mÃŖ,an toàn,báģ máē­t kháēŠu,xÃŗa máē­t kháēŠu", + "password": { + "stepTitle": "XÃŗa máē­t kháēŠu", + "label": "Máē­t kháēŠu hiáģ‡n táēĄi", + "placeholder": "Enter current password", + "completed": "Password configured" + }, + "filenamePrefix": "decrypted", + "error": { + "failed": "An error occurred while removing the password from the PDF." + }, + "tooltip": { + "description": "Removing password protection requires the password that was used to encrypt the PDF. This will decrypt the document, making it accessible without a password." + }, + "submit": "XÃŗa", + "results": { + "title": "Decrypted PDFs" + }, + "header": "XÃŗa máē­t kháēŠu (GiáēŖi mÃŖ)", + "selectText": { + "1": "Cháģn PDF đáģƒ giáēŖi mÃŖ", + "2": "Máē­t kháēŠu" + } + }, + "automate": { + "title": "Automate", + "desc": "Build multi-step workflows by chaining together PDF actions. Ideal for recurring tasks.", + "invalidStep": "Invalid step", + "files": { + "placeholder": "Select files to process with this automation" + }, + "selection": { + "title": "Automation Selection", + "saved": { + "title": "Saved" + }, + "createNew": { + "title": "Create New Automation" + }, + "suggested": { + "title": "Suggested" + } + }, + "creation": { + "createTitle": "Create Automation", + "editTitle": "Edit Automation", + "intro": "Automations run tools sequentially. To get started, add tools in the order you want them to run.", + "name": { + "label": "Automation Name", + "placeholder": "My Automation" + }, + "description": { + "label": "Description (optional)", + "placeholder": "Describe what this automation does..." + }, + "tools": { + "selectTool": "Select a tool...", + "selected": "Selected Tools", + "remove": "Remove tool", + "configure": "Configure tool", + "notConfigured": "! Not Configured", + "addTool": "Add Tool", + "add": "Add a tool..." + }, + "save": "Save Automation", + "unsavedChanges": { + "title": "Unsaved Changes", + "message": "You have unsaved changes. Are you sure you want to go back? All changes will be lost.", + "cancel": "Cancel", + "confirm": "Go Back" + }, + "icon": { + "label": "Icon" + } + }, + "run": { + "title": "Run Automation" + }, + "sequence": { + "unnamed": "Unnamed Automation", + "steps": "{{count}} steps", + "running": "Running Automation...", + "run": "Run Automation", + "finish": "Finish" + }, + "reviewTitle": "Automation Results", + "config": { + "loading": "Loading tool configuration...", + "noSettings": "This tool does not have configurable settings.", + "title": "Configure {{toolName}}", + "description": "Configure the settings for this tool. These settings will be applied when the automation runs.", + "cancel": "Cancel", + "save": "Save Configuration" + }, + "copyToSaved": "Copy to Saved" + }, + "automation": { + "suggested": { + "securePdfIngestion": "Secure PDF Ingestion", + "securePdfIngestionDesc": "Comprehensive PDF processing workflow that sanitises documents, applies OCR with cleanup, converts to PDF/A format for long-term archival, and optimises file size.", + "emailPreparation": "Email Preparation", + "emailPreparationDesc": "Optimises PDFs for email distribution by compressing files, splitting large documents into 20MB chunks for email compatibility, and removing metadata for privacy.", + "secureWorkflow": "Security Workflow", + "secureWorkflowDesc": "Secures PDF documents by removing potentially malicious content like JavaScript and embedded files, then adds password protection to prevent unauthorised access. Password is set to 'password' by default.", + "processImages": "Process Images", + "processImagesDesc": "Converts multiple image files into a single PDF document, then applies OCR technology to extract searchable text from the images." + } + }, + "common": { + "copy": "Copy", + "copied": "Copied!", + "refresh": "Refresh", + "retry": "Retry", + "remaining": "remaining", + "used": "used", + "available": "available", + "cancel": "Cancel", + "preview": "Preview" + }, + "config": { + "overview": { + "title": "Application Configuration", + "description": "Current application settings and configuration details." + }, + "account": { + "overview": { + "title": "Account Settings", + "manageAccountPreferences": "Manage your account preferences", + "guestDescription": "You are signed in as a guest. Consider upgrading your account above." + }, + "upgrade": { + "title": "Upgrade Guest Account", + "description": "Link your account to preserve your history and access more features!", + "socialLogin": "Upgrade with Social Account", + "linkWith": "Link with", + "emailPassword": "or enter your email & password", + "email": "Email", + "emailPlaceholder": "Enter your email", + "password": "Password (optional)", + "passwordPlaceholder": "Set a password", + "passwordNote": "Leave empty to use email verification only", + "upgradeButton": "Upgrade Account" + } + }, + "apiKeys": { + "description": "Your API key for accessing Stirling's suite of PDF tools. Copy it to your project or refresh to generate a new one.", + "publicKeyAriaLabel": "Public API key", + "copyKeyAriaLabel": "Copy API key", + "refreshAriaLabel": "Refresh API key", + "includedCredits": "Included credits", + "purchasedCredits": "Purchased credits", + "totalCredits": "Total Credits", + "chartAriaLabel": "Credits usage: included {{includedUsed}} of {{includedTotal}}, purchased {{purchasedUsed}} of {{purchasedTotal}}", + "nextReset": "Next Reset", + "lastApiUse": "Last API Use", + "overlayMessage": "Generate a key to see credits and available credits", + "label": "API Key", + "guestInfo": "Guest users do not receive API keys. Create an account to get an API key you can use in your applications.", + "goToAccount": "Go to Account", + "refreshModal": { + "title": "Refresh API Keys", + "warning": "âš ī¸ Warning: This action will generate new API keys and make your previous keys invalid.", + "impact": "Any applications or services currently using these keys will stop working until you update them with the new keys.", + "confirmPrompt": "Are you sure you want to continue?", + "confirmCta": "Refresh Keys" + }, + "generateError": "We couldn't generate your API key." + } + }, + "AddAttachmentsRequest": { + "attachments": "Select Attachments", + "info": "Select files to attach to your PDF. These files will be embedded and accessible through the PDF's attachment panel.", + "selectFiles": "Select Files to Attach", + "placeholder": "Choose files...", + "addMoreFiles": "Add more files...", + "selectedFiles": "Selected Files", + "submit": "Add Attachments", + "results": { + "title": "Attachment Results" + }, + "error": { + "failed": "Add attachments operation failed" + } + }, + "termsAndConditions": "Terms & Conditions", + "logOut": "Log out", + "addAttachments": { + "error": { + "failed": "An error occurred while adding attachments to the PDF." + } + }, + "autoRename": { + "description": "This tool will automatically rename PDF files based on their content. It analyzes the document to find the most suitable title from the text." + }, + "customPosition": "Custom Position", + "details": "Details", + "downloadUnavailable": "Download unavailable for this item", + "invalidUndoData": "Cannot undo: invalid operation data", + "margin": { + "large": "Large", + "medium": "Medium", + "small": "Small", + "xLarge": "Extra Large" + }, + "noFilesToUndo": "Cannot undo: no files were processed in the last operation", + "noOperationToUndo": "No operation to undo", + "noValidFiles": "No valid files to process", + "operationCancelled": "Operation cancelled", + "pageEdit": { + "deselectAll": "Select None", + "selectAll": "Select All" + }, + "quickPosition": "Quick Position", + "reorganizePages": { + "error": { + "failed": "Failed to reorganize pages" + }, + "results": { + "title": "Pages Reorganized" + }, + "settings": { + "title": "Settings" + }, + "submit": "Reorganize Pages" + }, + "replace-color": { + "options": { + "fill": "Fill colour", + "gradient": "Gradient" + }, + "previewOverlayOpacity": "Preview overlay opacity", + "previewOverlayTransparency": "Preview overlay transparency", + "previewOverlayVisibility": "Show preview overlay", + "selectText": { + "1": "Replace or Invert color Options", + "2": "Default(Default high contrast colors)", + "3": "Custom(Customized colors)", + "4": "Full-Invert(Invert all colors)", + "5": "High contrast color options", + "6": "white text on black background", + "7": "Black text on white background", + "8": "Yellow text on black background", + "9": "Green text on black background", + "10": "Choose text Color", + "11": "Choose background Color", + "12": "Choose start colour", + "13": "Choose end colour" + }, + "submit": "Replace", + "title": "Replace-Invert-Color", + "header": "Replace-Invert Color PDF" + }, + "size": "Size", + "submit": "Submit", + "success": "Success", + "tools": { + "noSearchResults": "No tools found", + "noTools": "No tools available" + }, + "undoDataMismatch": "Cannot undo: operation data is corrupted", + "undoFailed": "Failed to undo operation", + "undoQuotaError": "Cannot undo: insufficient storage space", + "undoStorageError": "Undo completed but some files could not be saved to storage", + "undoSuccess": "Operation undone successfully", + "unsupported": "Unsupported", + "onboarding": { + "welcomeModal": { + "title": "Welcome to Stirling PDF!", + "description": "Would you like to take a quick 1-minute tour to learn the key features and how to get started?", + "helpHint": "You can always access this tour later from the Help button in the bottom left.", + "startTour": "Start Tour", + "maybeLater": "Maybe Later", + "dontShowAgain": "Don't Show Again" + }, + "allTools": "This is the All Tools panel, where you can browse and select from all available PDF tools.", + "selectCropTool": "Let's select the Crop tool to demonstrate how to use one of the tools.", + "toolInterface": "This is the Crop tool interface. As you can see, there's not much there because we haven't added any PDF files to work with yet.", + "filesButton": "The Files button on the Quick Access bar allows you to upload PDFs to use the tools on.", + "fileSources": "You can upload new files or access recent files from here. For the tour, we'll just use a sample file.", + "workbench": "This is the Workbench - the main area where you view and edit your PDFs.", + "viewSwitcher": "Use these controls to select how you want to view your PDFs.", + "viewer": "The Viewer lets you read and annotate your PDFs.", + "pageEditor": "The Page Editor allows you to do various operations on the pages within your PDFs, such as reordering, rotating and deleting.", + "activeFiles": "The Active Files view shows all of the PDFs you have loaded into the tool, and allows you to select which ones to process.", + "fileCheckbox": "Clicking one of the files selects it for processing. You can select multiple files for batch operations.", + "selectControls": "The Right Rail contains buttons to quickly select/deselect all of your active PDFs, along with buttons to change the app's theme or language.", + "cropSettings": "Now that we've selected the file we want crop, we can configure the Crop tool to choose the area that we want to crop the PDF to.", + "runButton": "Once the tool has been configured, this button allows you to run the tool on all the selected PDFs.", + "results": "After the tool has finished running, the Review step will show a preview of the results in this panel, and allow you to undo the operation or download the file. ", + "fileReplacement": "The modified file will replace the original file in the Workbench automatically, allowing you to easily run it through more tools.", + "pinButton": "You can use the Pin button if you'd rather your files stay active after running tools on them.", + "wrapUp": "You're all set! You've learnt about the main areas of the app and how to use them. Click the Help button whenever you like to see this tour again.", + "previous": "Previous", + "next": "Next", + "finish": "Finish", + "startTour": "Start Tour", + "startTourDescription": "Take a guided tour of Stirling PDF's key features" + }, + "workspace": { + "title": "Workspace", + "people": { + "title": "People", + "description": "Manage workspace members and their permissions", + "loading": "Loading people...", + "searchMembers": "Search members...", + "addMembers": "Add Members", + "inviteMembers": { + "label": "Invite Members", + "subtitle": "Type or paste in emails below, separated by commas. Your workspace will be billed by members." + }, + "user": "User", + "role": "Role", + "team": "Team", + "status": "Status", + "actions": "Actions", + "noMembersFound": "No members found", + "active": "Active", + "disabled": "Disabled", + "activeSession": "Active session", + "member": "Member", + "admin": "Admin", + "roleDescriptions": { + "admin": "Can manage settings and invite members, with full administrative access.", + "member": "Can view and edit shared files, but cannot manage workspace settings or members." + }, + "editRole": "Edit Role", + "enable": "Enable", + "disable": "Disable", + "deleteUser": "Delete User", + "deleteUserSuccess": "User deleted successfully", + "deleteUserError": "Failed to delete user", + "confirmDelete": "Are you sure you want to delete this user? This action cannot be undone.", + "addMember": { + "title": "Add Member", + "username": "Username (Email)", + "usernamePlaceholder": "user@example.com", + "password": "Password", + "passwordPlaceholder": "Enter password", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "forcePasswordChange": "Force password change on first login", + "cancel": "Cancel", + "submit": "Add Member", + "usernameRequired": "Username and password are required", + "passwordTooShort": "Password must be at least 6 characters", + "success": "User created successfully", + "error": "Failed to create user" + }, + "editMember": { + "title": "Edit Member", + "editing": "Editing:", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "cancel": "Cancel", + "submit": "Update Member", + "success": "User updated successfully", + "error": "Failed to update user" + }, + "toggleEnabled": { + "success": "User status updated successfully", + "error": "Failed to update user status" + }, + "delete": { + "success": "User deleted successfully", + "error": "Failed to delete user" + }, + "emailInvite": { + "tab": "Email Invite", + "description": "Type or paste in emails below, separated by commas. Users will receive login credentials via email.", + "emails": "Email Addresses", + "emailsPlaceholder": "user1@example.com, user2@example.com", + "emailsRequired": "At least one email address is required", + "submit": "Send Invites", + "success": "user(s) invited successfully", + "partialSuccess": "Some invites failed", + "allFailed": "Failed to invite users", + "error": "Failed to send invites" + }, + "directInvite": { + "tab": "Direct Create" + }, + "inviteLinkTab": { + "tab": "Invite Link" + }, + "inviteLink": { + "description": "Generate a secure link that allows the user to set their own password", + "email": "Email Address", + "emailPlaceholder": "user@example.com (optional)", + "emailDescription": "Optional - leave blank for a general invite link that can be used by anyone", + "emailRequired": "Email address is required", + "emailOptional": "Optional - leave blank for a general invite link", + "emailRequiredForSend": "Email address is required to send email notification", + "expiryHours": "Expiry Hours", + "expiryDescription": "How many hours until the link expires", + "sendEmail": "Send invite link via email", + "sendEmailDescription": "If enabled, the invite link will be sent to the specified email address", + "smtpRequired": "SMTP not configured", + "generate": "Generate Link", + "generated": "Invite Link Generated", + "copied": "Link copied to clipboard", + "success": "Invite link generated successfully", + "successWithEmail": "Invite link generated and sent via email", + "emailFailed": "Invite link generated, but email failed", + "emailFailedDetails": "Error: {0}. Please share the invite link manually.", + "error": "Failed to generate invite link", + "submit": "Generate Invite Link" + }, + "inviteMode": { + "username": "Username", + "email": "Email", + "link": "Link", + "emailDisabled": "Email invites require SMTP configuration and mail.enableInvites=true in settings" + }, + "license": { + "users": "users", + "availableSlots": "Available Slots", + "grandfathered": "Grandfathered", + "grandfatheredShort": "{{count}} grandfathered", + "fromLicense": "from license", + "slotsAvailable": "{{count}} user slot(s) available", + "noSlotsAvailable": "No slots available", + "currentUsage": "Currently using {{current}} of {{max}} user licences" + } + }, + "teams": { + "title": "Teams", + "description": "Manage teams and organize workspace members", + "loading": "Loading teams...", + "loadingDetails": "Loading team details...", + "createNewTeam": "Create New Team", + "teamName": "Team Name", + "totalMembers": "Total Members", + "actions": "Actions", + "noTeamsFound": "No teams found", + "noMembers": "No members in this team", + "system": "System", + "addMember": "Add Member", + "viewTeam": "View Team", + "removeMember": "Remove from team", + "cannotRemoveFromSystemTeam": "Cannot remove from system team", + "renameTeamLabel": "Rename Team", + "deleteTeamLabel": "Delete Team", + "cannotDeleteInternal": "Cannot delete the Internal team", + "confirmDelete": "Are you sure you want to delete this team? This team must be empty to delete.", + "confirmRemove": "Remove user from this team?", + "cannotRenameInternal": "Cannot rename the Internal team", + "cannotAddToInternal": "Cannot add members to the Internal team", + "teamNotFound": "Team not found", + "backToTeams": "Back to Teams", + "memberCount": "{{count}} members", + "removeMemberSuccess": "User removed from team", + "removeMemberError": "Failed to remove user from team", + "createTeam": { + "title": "Create New Team", + "teamName": "Team Name", + "teamNamePlaceholder": "Enter team name", + "cancel": "Cancel", + "submit": "Create Team", + "nameRequired": "Team name is required", + "success": "Team created successfully", + "error": "Failed to create team" + }, + "renameTeam": { + "title": "Rename Team", + "renaming": "Renaming:", + "newTeamName": "New Team Name", + "newTeamNamePlaceholder": "Enter new team name", + "cancel": "Cancel", + "submit": "Rename Team", + "nameRequired": "Team name is required", + "success": "Team renamed successfully", + "error": "Failed to rename team" + }, + "deleteTeam": { + "success": "Team deleted successfully", + "error": "Failed to delete team. Make sure the team is empty.", + "teamMustBeEmpty": "Team must be empty before deletion" + }, + "addMemberToTeam": { + "title": "Add Member to Team", + "addingTo": "Adding to", + "selectUser": "Select User", + "selectUserPlaceholder": "Choose a user", + "selectUserRequired": "Please select a user", + "currentlyIn": "currently in", + "willBeMoved": "Note: This user will be moved from their current team to this team.", + "cancel": "Cancel", + "submit": "Add Member", + "userRequired": "Please select a user", + "success": "Member added to team successfully", + "error": "Failed to add member to team" + }, + "changeTeam": { + "label": "Change Team", + "title": "Change Team", + "changing": "Moving", + "selectTeam": "Select Team", + "selectTeamPlaceholder": "Choose a team", + "selectTeamRequired": "Please select a team", + "success": "Team changed successfully", + "error": "Failed to change team", + "submit": "Change Team" + } + } + }, + "plan": { + "currency": "Currency", + "popular": "Popular", + "current": "Current Plan", + "upgrade": "Upgrade", + "contact": "Contact Us", + "customPricing": "Custom", + "showComparison": "Compare All Features", + "hideComparison": "Hide Feature Comparison", + "featureComparison": "Feature Comparison", + "activePlan": { + "title": "Active Plan", + "subtitle": "Your current subscription details" + }, + "availablePlans": { + "title": "Available Plans", + "subtitle": "Choose the plan that fits your needs" + }, + "static": { + "title": "Billing Information", + "message": "Online billing is not currently configured. To upgrade your plan or manage subscriptions, please contact us directly.", + "contactSales": "Contact Sales", + "contactToUpgrade": "Contact us to upgrade or customize your plan", + "maxUsers": "Max Users", + "upTo": "Up to" + }, + "period": { + "month": "month" + }, + "free": { + "name": "Free", + "highlight1": "Limited Tool Usage Per week", + "highlight2": "Access to all tools", + "highlight3": "Community support" + }, + "pro": { + "name": "Pro", + "highlight1": "Unlimited Tool Usage", + "highlight2": "Advanced PDF tools", + "highlight3": "No watermarks" + }, + "enterprise": { + "name": "Enterprise", + "highlight1": "Custom pricing", + "highlight2": "Dedicated support", + "highlight3": "Latest features" + }, + "feature": { + "title": "Feature", + "pdfTools": "Basic PDF Tools", + "fileSize": "File Size Limit", + "automation": "Automate tool workflows", + "api": "API Access", + "priority": "Priority Support", + "customPricing": "Custom Pricing" + } + }, + "subscription": { + "status": { + "active": "Active", + "pastDue": "Past Due", + "canceled": "Canceled", + "incomplete": "Incomplete", + "trialing": "Trial", + "none": "No Subscription" + }, + "renewsOn": "Renews on {{date}}", + "cancelsOn": "Cancels on {{date}}" + }, + "billing": { + "manageBilling": "Manage Billing", + "portal": { + "error": "Failed to open billing portal" + } + }, + "payment": { + "preparing": "Preparing your checkout...", + "upgradeTitle": "Upgrade to {{planName}}", + "success": "Payment Successful!", + "successMessage": "Your subscription has been activated successfully. You will receive a confirmation email shortly.", + "autoClose": "This window will close automatically...", + "error": "Payment Error" + }, + "firstLogin": { + "title": "First Time Login", + "welcomeTitle": "Welcome!", + "welcomeMessage": "For security reasons, you must change your password on your first login.", + "loggedInAs": "Logged in as", + "error": "Error", + "currentPassword": "Current Password", + "enterCurrentPassword": "Enter your current password", + "newPassword": "New Password", + "enterNewPassword": "Enter new password (min 8 characters)", + "confirmPassword": "Confirm New Password", + "reEnterNewPassword": "Re-enter new password", + "changePassword": "Change Password", + "allFieldsRequired": "All fields are required", + "passwordsDoNotMatch": "New passwords do not match", + "passwordTooShort": "Password must be at least 8 characters", + "passwordMustBeDifferent": "New password must be different from current password", + "passwordChangedSuccess": "Password changed successfully! Please log in again.", + "passwordChangeFailed": "Failed to change password. Please check your current password." + }, + "invite": { + "welcome": "Welcome to Stirling PDF", + "invalidToken": "Invalid invitation link", + "validationError": "Failed to validate invitation link", + "passwordRequired": "Password is required", + "passwordTooShort": "Password must be at least 6 characters", + "passwordMismatch": "Passwords do not match", + "acceptError": "Failed to create account", + "validating": "Validating invitation...", + "invalidInvitation": "Invalid Invitation", + "goToLogin": "Go to Login", + "welcomeTitle": "You've been invited!", + "welcomeSubtitle": "Complete your account setup to get started", + "accountFor": "Creating account for", + "linkExpires": "Link expires", + "email": "Email address", + "emailPlaceholder": "Enter your email address", + "emailRequired": "Email address is required", + "invalidEmail": "Invalid email address", + "choosePassword": "Choose a password", + "passwordPlaceholder": "Enter your password", + "confirmPassword": "Confirm password", + "confirmPasswordPlaceholder": "Re-enter your password", + "createAccount": "Create Account", + "creating": "Creating Account...", + "alreadyHaveAccount": "Already have an account?", + "signIn": "Sign in" + }, + "audit": { + "error": { + "title": "Error loading audit system" + }, + "notAvailable": "Audit system not available", + "notAvailableMessage": "The audit system is not configured or not available.", + "disabled": "Audit logging is disabled", + "disabledMessage": "Enable audit logging in your application configuration to track system events.", + "systemStatus": { + "title": "System Status", + "status": "Audit Logging", + "enabled": "Enabled", + "disabled": "Disabled", + "level": "Audit Level", + "retention": "Retention Period", + "days": "days", + "totalEvents": "Total Events" + }, + "tabs": { + "dashboard": "Dashboard", + "events": "Audit Events", + "export": "Export" + }, + "charts": { + "title": "Audit Dashboard", + "error": "Error loading charts", + "day": "Day", + "week": "Week", + "month": "Month", + "byType": "Events by Type", + "byUser": "Events by User", + "overTime": "Events Over Time" + }, + "events": { + "title": "Audit Events", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "error": "Error loading events", + "noEvents": "No events found", + "timestamp": "Timestamp", + "type": "Type", + "user": "User", + "ipAddress": "IP Address", + "actions": "Actions", + "viewDetails": "View Details", + "eventDetails": "Event Details", + "details": "Details" + }, + "export": { + "title": "Export Audit Data", + "description": "Export audit events to CSV or JSON format. Use filters to limit the exported data.", + "format": "Export Format", + "filters": "Filters (Optional)", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "exportButton": "Export Data", + "error": "Failed to export data" + } + }, + "usage": { + "noData": "No data available", + "error": "Error loading usage statistics", + "noDataMessage": "No usage statistics are currently available.", + "controls": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All", + "refresh": "Refresh", + "dataTypeLabel": "Data Type:", + "dataType": { + "all": "All", + "api": "API", + "ui": "UI" + } + }, + "showing": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All" + }, + "stats": { + "totalEndpoints": "Total Endpoints", + "totalVisits": "Total Visits", + "showing": "Showing", + "selectedVisits": "Selected Visits" + }, + "chart": { + "title": "Endpoint Usage Chart" + }, + "table": { + "title": "Detailed Statistics", + "endpoint": "Endpoint", + "visits": "Visits", + "percentage": "Percentage", + "noData": "No data available" + } + }, + "backendHealth": { + "checking": "Checking backend status...", + "online": "Backend Online", + "offline": "Backend Offline" + }, + "autoRedact": { + "tags": "BiÃĒn táē­p,áē¨n,che đen,đen,bÃēt Ä‘ÃĄnh dáēĨu,áēŠn", + "title": "Táģą Ä‘áģ™ng biÃĒn táē­p", + "header": "Táģą Ä‘áģ™ng biÃĒn táē­p", + "colorLabel": "Màu sáē¯c", + "textsToRedactLabel": "Văn báēŖn cáē§n biÃĒn táē­p (máģ—i dÃ˛ng máģ™t táģĢ)", + "textsToRedactPlaceholder": "ví dáģĨ: \\nMáē­t \\nTáģ‘i máē­t", + "useRegexLabel": "Sáģ­ dáģĨng Regex", + "wholeWordSearchLabel": "TÃŦm kiáēŋm toàn báģ™ táģĢ", + "customPaddingLabel": "Đáģ‡m thÃĒm tÚy cháģ‰nh", + "convertPDFToImageLabel": "Chuyáģƒn đáģ•i PDF thành PDF-HÃŦnh áēŖnh (DÚng đáģƒ xÃŗa văn báēŖn phía sau ô)", + "submitButton": "Gáģ­i" + }, + "replaceColorPdf": { + "tags": "Replace Color,Page operations,Back end,server side" } -} \ No newline at end of file +} diff --git a/frontend/public/locales/zh-BO/translation.json b/frontend/public/locales/zh-BO/translation.json index b98ba42d9..28b04e4db 100644 --- a/frontend/public/locales/zh-BO/translation.json +++ b/frontend/public/locales/zh-BO/translation.json @@ -1,4 +1,40 @@ { + "toolPanel": { + "modePrompt": { + "title": "Choose how you browse tools", + "description": "Preview both layouts and decide how you want to explore Stirling PDF tools.", + "sidebarTitle": "Sidebar mode", + "sidebarDescription": "Keep tools alongside your workspace for quick switching.", + "recommended": "Recommended", + "chooseSidebar": "Use sidebar mode", + "fullscreenTitle": "Fullscreen mode - (legacy)", + "fullscreenDescription": "Browse every tool in a catalogue that covers the workspace until you pick one.", + "chooseFullscreen": "Use fullscreen mode", + "dismiss": "Maybe later" + }, + "fullscreen": { + "showDetails": "Show Details", + "comingSoon": "Coming soon:", + "favorite": "Add to favourites", + "favorites": "Favourites", + "heading": "All tools (fullscreen view)", + "noResults": "Try adjusting your search or toggle descriptions to find what you need.", + "recommended": "Recommended", + "unfavorite": "Remove from favourites" + }, + "placeholder": "Choose a tool to get started", + "toggle": { + "fullscreen": "Switch to fullscreen mode", + "sidebar": "Switch to sidebar mode" + } + }, + "unsavedChanges": "You have unsaved changes to your PDF.", + "areYouSure": "Are you sure you want to leave?", + "unsavedChangesTitle": "Unsaved Changes", + "keepWorking": "Keep Working", + "discardChanges": "Discard & Leave", + "applyAndContinue": "Save & Leave", + "exportAndContinue": "Export & Continue", "language": { "direction": "ltr" }, @@ -18,8 +54,26 @@ "customTextDesc": "āŊĸāŊ„āŧ‹āŊĻāž’āž˛āŊ˛āŊ‚āŧ‹āŊĄāŊ˛āŧ‹āŊ‚āŊē", "numberPagesDesc": "āŊ¨āŊ„āŧ‹āŊ‚āž˛āŊ„āŊĻāŧ‹āŊĸāž’āžąāŊ‚āŧ‹āŊĸāž’āžąāŊ´āŊ āŊ˛āŧ‹āŊ¤āŊŧāŊ‚āŧ‹āŊ„āŊŧāŊĻāŧ āŊĻāž”āŊŧāŊ“āŧ‹āŊĻāž’āž˛āŊ˛āŊ‚āŧ‹āŊ“āŊ˛āŧ‹'āŊšāŊ„āŧ‹āŊ˜āŧ‹'āŊĄāŊ˛āŊ“āŧ 1-5 āŊĄāŊ„āŧ‹āŊ“āŧ‹ 2,5,9 āŊĻāŊŧāŊ‚āŊĻāŧ‹āŊ€āžąāŊ„āŧ‹āŊ„āŊŧāŊĻāŧ‹āŊŖāŊēāŊ“āŧ‹āŊ–āžąāŊēāŊ‘āŧ", "customNumberDesc": "āŊĻāž”āŊŧāŊ“āŧ‹āŊĻāž’āž˛āŊ˛āŊ‚āŧ‹āŊ“āŊ˛āŧ‹ {n} āŊĄāŊ˛āŊ“āŧ 'āŊ¤āŊŧāŊ‚āŧ‹āŊ„āŊŧāŊĻāŧ‹ {n} / {total}', 'āŊĄāŊ˛āŧ‹āŊ‚āŊē-{n}', '{filename}-{n}' āŊĻāŊŧāŊ‚āŊĻāŧ‹āŊ€āžąāŊ„āŧ‹āŊ„āŊŧāŊĻāŧ‹āŊŖāŊēāŊ“āŧ‹āŊ–āžąāŊēāŊ‘āŧ", - "submit": "āŊ¤āŊŧāŊ‚āŧ‹āŊ‚āž˛āŊ„āŊĻāŧ‹āŊĻāžŖāŊŧāŊ“āŧ‹āŊ”āŧ" + "submit": "āŊ¤āŊŧāŊ‚āŧ‹āŊ‚āž˛āŊ„āŊĻāŧ‹āŊĻāžŖāŊŧāŊ“āŧ‹āŊ”āŧ", + "configuration": "Configuration", + "customize": "Customize Appearance", + "pagesAndStarting": "Pages & Starting Number", + "positionAndPages": "Position & Pages", + "error": { + "failed": "Add page numbers operation failed" + }, + "results": { + "title": "Page Number Results" + }, + "preview": "Position Selection", + "previewDisclaimer": "Preview is approximate. Final output may vary due to PDF font metrics." }, + "pageSelectionPrompt": "āŊ¤āŊŧāŊ‚āŧ‹āŊ„āŊŧāŊĻāŧ‹āŊ āŊ‘āŊēāŊ˜āŊĻāŧ‹āŊĻāž’āž˛āŊ´āŊ‚īŧˆāŊ¤āŊŧāŊ‚āŧ‹āŊ‚āž˛āŊ„āŊĻāŧ‹āŊ€āžąāŊ˛āŧ‹āŊāŊŧāŧ‹āŊ‚āŊžāŊ´āŊ„āŧ‹ 1,5,6 āŊ āŊ˜āŧ‹āŊĸāžŠāŊ˛āŊĻāŧ‹āŊĸāž’āžąāŊ‚āŧ‹āŊ–āžąāŊēāŊ‘āŧ‹āŊāŊ–āŊĻāŧ‹ 2n+1 āŊŖāžŸāŧ‹āŊ–āŊ´āŧ‹āŊ āŊ‡āŊ´āŊ‚āŧ‹āŊĸāŊŧāŊ‚āŊĻāŧīŧ‰", + "startingNumberTooltip": "The first number to display. Subsequent pages will increment from this number.", + "marginTooltip": "Distance between the page number and the edge of the page.", + "fontSizeTooltip": "Size of the page number text in points. Larger numbers create bigger text.", + "fontTypeTooltip": "Font family for the page numbers. Choose based on your document style.", + "customTextTooltip": "Optional custom format for page numbers. Use {n} as placeholder for the number. Example: \"Page {n}\" will show \"Page 1\", \"Page 2\", etc.", "pdfPrompt": "PDF āŊ āŊ‘āŊēāŊ˜āŊĻāŧ‹āŊĸāŊŧāŊ‚āŊĻāŧ", "multiPdfPrompt": "PDF āŊ‚āŊ‰āŊ˛āŊĻāŧ‹āŊĄāŊ“āŧ‹āŊ āŊ‘āŊēāŊ˜āŊĻāŧ‹āŊĸāŊŧāŊ‚āŊĻāŧ", "multiPdfDropPrompt": "āŊ‘āŊ‚āŊŧāŊĻāŧ‹āŊ˜āŊāŊŧāŧ‹āŊ āŊ‘āŊ˛āŧ‹ PDF āŊĄāŊ˛āŊ‚āŧ‹āŊ†āŧ‹āŊšāŊ„āŧ‹āŊ˜āŧ‹āŊ āŊ‘āŊēāŊ˜āŊĻāŧ‹āŊ”āŊ āŊ˜āŧ‹āŊ āŊāŊēāŊ“āŧ‹āŊĸāŊŧāŊ‚āŊĻāŧ", @@ -30,15 +84,41 @@ "uploadLimitExceededPlural": "are too large. Maximum allowed size is", "processTimeWarning": "āŊ‰āŊēāŊ“āŧ‹āŊ–āŊ…āŊŧāŊĻāŧ āŊ–āžąāŧ‹āŊĸāŊ˛āŊ˜āŧ‹āŊ āŊ‘āŊ˛āŧ‹āŊĄāŊ˛āŊ‚āŧ‹āŊ†āŊ āŊ˛āŧ‹āŊ†āŊēāŧ‹āŊ†āŊ´āŊ„āŧ‹āŊŖāŧ‹āŊ‚āŊžāŊ˛āŊ‚āŊĻāŧ‹āŊ“āŊĻāŧ‹āŊĻāžāŊĸāŧ‹āŊ˜āŧ‹āŊ‚āŊ…āŊ˛āŊ‚āŧ‹āŊ–āŊĸāŧ‹āŊ āŊ‚āŊŧāŊĸāŧ‹āŊĻāž˛āŊ˛āŊ‘āŧ", "pageOrderPrompt": "āŊ¤āŊŧāŊ‚āŧ‹āŊ„āŊŧāŊĻāŧ‹āŊ‚āŊŧāŧ‹āŊĸāŊ˛āŊ˜āŧ‹āŊĸāŊ„āŧ‹āŊĻāž’āž˛āŊ˛āŊ‚īŧˆāŊ¤āŊŧāŊ‚āŧ‹āŊ‚āž˛āŊ„āŊĻāŧ‹āŊ€āžąāŊ˛āŧ‹āŊāŊŧāŧ‹āŊ‚āŊžāŊ´āŊ„āŧ‹āŊ„āŊ˜āŧ‹āŊĸāžŠāŊ˛āŊĻāŧ‹āŊĸāž’āžąāŊ‚āŧ‹āŊ–āžąāŊēāŊ‘āŧ‹āŊāŊ–āŊĻāŧ‹ 2n+1 āŊŖāžŸāŧ‹āŊ–āŊ´āŧ‹āŊ āŊ‡āŊ´āŊ‚āŧ‹āŊĸāŊŧāŊ‚āŊĻāŧīŧ‰", - "pageSelectionPrompt": "āŊ¤āŊŧāŊ‚āŧ‹āŊ„āŊŧāŊĻāŧ‹āŊ āŊ‘āŊēāŊ˜āŊĻāŧ‹āŊĻāž’āž˛āŊ´āŊ‚īŧˆāŊ¤āŊŧāŊ‚āŧ‹āŊ‚āž˛āŊ„āŊĻāŧ‹āŊ€āžąāŊ˛āŧ‹āŊāŊŧāŧ‹āŊ‚āŊžāŊ´āŊ„āŧ‹ 1,5,6 āŊ āŊ˜āŧ‹āŊĸāžŠāŊ˛āŊĻāŧ‹āŊĸāž’āžąāŊ‚āŧ‹āŊ–āžąāŊēāŊ‘āŧ‹āŊāŊ–āŊĻāŧ‹ 2n+1 āŊŖāžŸāŧ‹āŊ–āŊ´āŧ‹āŊ āŊ‡āŊ´āŊ‚āŧ‹āŊĸāŊŧāŊ‚āŊĻāŧīŧ‰", "goToPage": "āŊ āŊ‚āž˛āŊŧāŧ‹āŊ–āŧ", "true": "āŊ–āŊ‘āŊēāŊ“āŧ‹āŊ”āŧ", "false": "āŊĸāžĢāŊ´āŊ“āŧ‹āŊ˜āŧ", "unknown": "āŊ˜āŊ˛āŧ‹āŊ¤āŊēāŊĻāŧ‹āŊ”āŧ", + "app": { + "description": "The Free Adobe Acrobat alternative (10M+ Downloads)" + }, "save": "āŊ‰āŊĸāŧ‹āŊšāŊ‚āŊĻāŧ", "saveToBrowser": "āŊ–āŊ¤āŊĸāŧ‹āŊ†āŊēāŧ‹āŊ“āŊ„āŧ‹āŊ‰āŊĸāŧ‹āŊšāŊ‚āŊĻāŧ", + "download": "Download", + "pin": "Pin File (keep active after tool run)", + "unpin": "Unpin File (replace after tool run)", + "undoOperationTooltip": "Click to undo the last operation and restore the original files", + "undo": "Undo", + "moreOptions": "More Options", + "editYourNewFiles": "Edit your new file(s)", "close": "āŊĻāž’āŊŧāŧ‹āŊĸāŊ˛āŊ‚āŧ", + "openInViewer": "Open in Viewer", + "confirmClose": "Confirm Close", + "confirmCloseMessage": "Are you sure you want to close this file?", + "confirmCloseCancel": "Cancel", + "confirmCloseConfirm": "Close File", + "fileSelected": "Selected: {{filename}}", + "chooseFile": "Choose File", "filesSelected": "āŊĄāŊ˛āŊ‚āŧ‹āŊ†āŊ–āŊ‘āŊ˜āŊĻāŧ‹āŊŸāŊ˛āŊ“āŧ", + "files": { + "title": "Files", + "upload": "Upload", + "uploadFiles": "Upload Files", + "addFiles": "Add files", + "selectFromWorkbench": "Select files from the workbench or ", + "selectMultipleFromWorkbench": "Select at least {{count}} files from the workbench or ", + "created": "Created", + "size": "File Size" + }, "noFavourites": "āŊ‘āŊ‚āŊ āŧ‹āŊ˜āŊŧāŊĻāŧ‹āŊ‚āŊ„āŧ‹āŊĄāŊ„āŧ‹āŊĻāžŖāŊŧāŊ“āŧ‹āŊ˜āŊēāŊ‘āŧ", "downloadComplete": "āŊ•āŊ–āŧ‹āŊŖāŊēāŊ“āŧ‹āŊŖāŊēāŊ‚āŊĻāŧ‹āŊ‚āž˛āŊ´āŊ–āŧ", "bored": "āŊĻāž’āŊ´āŊ‚āŧ‹āŊĻāžĄāŊŧāŊ‘āŧ‹āŊĻāžāžąāŊ˛āŊ‘āŧ‹āŊ”āŊŧāŧ‹āŊ˜āŊ˛āŧ‹āŊ āŊ‘āŊ´āŊ‚āŧ‹āŊ‚āŊ˜āŧ", @@ -56,7 +136,10 @@ }, "error": { "pdfPassword": "PDF āŊĄāŊ˛āŊ‚āŧ‹āŊ†āŊĸāŧ‹āŊ‚āŊĻāŊ„āŧ‹āŊšāŊ˛āŊ‚āŧ‹āŊ–āŊ€āŊŧāŊ‘āŧ‹āŊĄāŊŧāŊ‘āŧ‹āŊ”āŧ‹āŊ‘āŊ„āŧ‹āŧ āŊ‚āŊĻāŊ„āŧ‹āŊšāŊ˛āŊ‚āŧ‹āŊ˜āŧ‹āŊ–āŊ€āŊŧāŊ‘āŧ‹āŊ”āŊ āŊ˜āŧ‹āŊ“āŊŧāŊĸāŧ‹āŊ āŊ‘āŊ´āŊ‚", + "encryptedPdfMustRemovePassword": "This PDF is encrypted or password-protected. Please unlock it before converting to PDF/A.", + "incorrectPasswordProvided": "The PDF password is incorrect or not provided.", "_value": "āŊ“āŊŧāŊĸāŧ‹āŊ āŊāž˛āŊ´āŊŖāŧ", + "dismissAllErrors": "Dismiss All Errors", "sorry": "āŊ‘āŊ€āŊ āŧ‹āŊ„āŊŖāŧ‹āŊŖāŧ‹āŊ‘āŊ‚āŊŧāŊ„āŊĻāŧ‹āŊ‘āŊ‚", "needHelp": "āŊĸāŊŧāŊ‚āŊĻāŧ‹āŊĸāŊ˜āŧ‹āŊ‘āŊ‚āŊŧāŊĻāŧ‹āŊĻāŊ˜āŧ / āŊ‘āŊ€āŊ āŧ‹āŊ„āŊŖāŧ‹āŊžāŊ˛āŊ‚āŧ‹āŊĸāž™āŊēāŊ‘āŧ‹āŊĻāŊŧāŊ„āŧ‹āŊ„āŊ˜āŧ", "contactTip": "āŊ‚āŊŖāŧ‹āŊĻāž˛āŊ˛āŊ‘āŧ‹āŊ‘āŧ‹āŊ‘āŊ´āŊ„āŧ‹āŊ‘āŊ€āŊ āŧ‹āŊ„āŊŖāŧ‹āŊ āŊ•āž˛āŊ‘āŧ‹āŊ–āŊžāŊ˛āŊ“āŧ‹āŊĄāŊŧāŊ‘āŧ‹āŊ“āŧ āŊĸāŊŧāŊ‚āŊĻāŧ‹āŊĸāŊ˜āŧ‹āŊžāŊ´āŧ‹āŊ–āŊĸāŧ‹āŊ„āŧ‹āŊšāŊŧāŊĸāŧ‹āŊ āŊ–āž˛āŊēāŊŖāŧ‹āŊ‚āŊāŊ´āŊ‚āŧ‹āŊ–āžąāŊēāŊ‘āŧ‹āŊĸāŊŧāŊ‚āŊĻāŧ āŊāžąāŊēāŊ‘āŧ‹āŊ€āžąāŊ˛āŊĻāŧ‹āŊ„āŧ‹āŊšāŊŧāŊ āŊ˛āŧ‹ GitHub āŊ¤āŊŧāŊ‚āŧ‹āŊ„āŊŧāŊĻāŧ‹āŊĻāŊ´āŧ‹āŊĻāž™āŊ“āŧ‹āŊžāŊ´āŧ‹āŊ āŊ–āŊ´āŊŖāŧ‹āŊ–āŊ āŊ˜āŧ‹ Discord āŊ–āŊĸāž’āžąāŊ´āŊ‘āŧ‹āŊ“āŊĻāŧ‹āŊ āŊ–āž˛āŊēāŊŖāŧ‹āŊ–āŧ‹āŊ‚āŊ“āŊ„āŧ‹āŊ†āŊŧāŊ‚", @@ -71,6 +154,10 @@ "githubSubmit": "GitHub - āŊĻāž™āŊ“āŧ‹āŊžāŊ´āŧ‹āŊ āŊ–āŊ´āŊŖāŧ‹āŊ–āŧ", "discordSubmit": "Discord - āŊĸāž’āžąāŊ–āŧ‹āŊĻāžāžąāŊŧāŊĸāŧ‹āŊĻāž™āŊ“āŧ‹āŊžāŊ´āŧ‹āŊ āŊ–āŊ´āŊŖāŧ‹āŊ–āŧ" }, + "warning": { + "tooltipTitle": "Warning" + }, + "edit": "Edit", "delete": "āŊĻāŊ´āŊ–āŧ‹āŊ”āŧ", "username": "āŊĻāž¤āžąāŊŧāŊ‘āŧ‹āŊ˜āŊāŊ“āŧ‹āŊ˜āŊ˛āŊ„āŧ‹āŧ", "password": "āŊ‚āŊĻāŊ„āŧ‹āŊšāŊ˛āŊ‚āŧ", @@ -82,6 +169,7 @@ "green": "āŊŖāž—āŊ„āŧ‹āŊāŊ´āŧ", "blue": "āŊĻāž”āŊŧāŊ“āŧ‹āŊ”āŊŧ", "custom": "āŊ˜āŊšāŊ“āŧ‹āŊ‰āŊ˛āŊ‘āŧ‹āŊĸāŊ„āŧ‹āŊĻāž’āž˛āŊ˛āŊ‚...", + "comingSoon": "Coming soon", "WorkInProgess": "āŊŖāŊĻāŧ‹āŊ€āŧ‹āŊ–āžąāŊēāŊ‘āŧ‹āŊ–āŊžāŊ˛āŊ“āŧ‹āŊ”āŧ āŊ“āŊŧāŊĸāŧ‹āŊ āŊāž˛āŊ´āŊŖāŧ‹āŊĄāŊŧāŊ„āŧ‹āŊĻāž˛āŊ˛āŊ‘āŧ āŊ‘āŊ€āŊ āŧ‹āŊ„āŊŖāŧ‹āŊĄāŊŧāŊ‘āŧ‹āŊšāŊēāŧ‹āŊĻāž™āŊ“āŧ‹āŊĻāŊēāŊ„āŧ‹āŊ‚āŊ“āŊ„āŧ‹āŊĸāŊŧāŊ‚āŊĻāŧ", "poweredBy": "āŊ˜āŊāŊŧāŧ‹āŊĻāž˛āŊŧāŊ‘āŧ‹āŊ–āžąāŊēāŊ‘āŧ‹āŊ˜āŊāŊ“āŧ", "yes": "āŊĄāŊ˛āŊ“āŧ", @@ -115,12 +203,14 @@ "page": "āŊ¤āŊŧāŊ‚āŧ‹āŊ„āŊŧāŊĻāŧ", "pages": "āŊ¤āŊŧāŊ‚āŧ‹āŊ„āŊŧāŊĻāŧ‹āŊāŊ‚", "loading": "āŊ āŊ‡āŊ´āŊ‚āŧ‹āŊ–āŊžāŊ˛āŊ“āŧ‹āŊ”...", + "review": "Review", "addToDoc": "āŊĄāŊ˛āŊ‚āŧ‹āŊ†āŊĸāŧ‹āŊĻāžŖāŊŧāŊ“āŧ", "reset": "āŊ–āŊĻāžāžąāŊĸāŧ‹āŊĻāž’āž˛āŊ˛āŊ‚", "apply": "āŊ‰āŊēāŊĸāŧ‹āŊĻāž¤āžąāŊŧāŊ‘āŧ", "noFileSelected": "No file selected. Please upload one.", "legal": { "privacy": "āŊ‚āŊĻāŊ„āŧ‹āŊ‘āŊŧāŊ“āŧ‹āŊĻāž˛āŊ˛āŊ‘āŧ‹āŊ–āžąāŊ´āŊĻāŧ", + "iAgreeToThe": "I agree to all of the", "terms": "āŊ–āŊēāŊ‘āŧ‹āŊĻāž¤āžąāŊŧāŊ‘āŧ‹āŊ†āŧ‹āŊĸāžāžąāŊēāŊ“āŧ", "accessibility": "āŊ–āŊēāŊ‘āŧ‹āŊĻāž¤āžąāŊŧāŊ‘āŧ‹āŊ“āŊ´āŊĻāŧ‹āŊ”āŧ", "cookie": "Cookie āŊĻāž˛āŊ˛āŊ‘āŧ‹āŊ–āžąāŊ´āŊĻāŧ", @@ -160,6 +250,7 @@ "title": "āŊāžąāŊēāŊ‘āŧ‹āŊ€āžąāŊ˛āŊĻāŧ‹ Stirling PDF āŊŖāŊēāŊ‚āŊĻāŧ‹āŊĻāŊ´āŧ‹āŊ‚āŊāŊŧāŊ„āŧ‹āŊ āŊ‘āŊŧāŊ‘āŧ‹āŊ‘āŊ˜āŧ", "paragraph1": "Stirling PDF āŊŖāŧ‹āŊāŊŧāŊ“āŧ‹āŊĸāžĢāŊĻāŧ‹āŊŖāŊēāŊ‚āŊĻāŧ‹āŊĻāŊ´āŧ‹āŊ‚āŊāŊŧāŊ„āŧ‹āŊ–āŊĸāŧ‹āŊĸāŊŧāŊ‚āŊĻāŧ‹āŊĸāŊ˜āŧ‹āŊ–āžąāŊēāŊ‘āŧ‹āŊ”āŊ āŊ˛āŧ‹āŊ‚āŊ‘āŊ˜āŧ‹āŊ‚āŧ‹āŊĄāŊŧāŊ‘āŧ‹āŊ”āŊ āŊ˛āŧ‹āŊ‘āŊ”āžąāŊ‘āŧ‹āŊžāŊ˛āŊ–āŧ‹āŊĄāŊŧāŊ‘āŧ āŊ„āŧ‹āŊšāŊŧāŊĻāŧ‹āŊĻāž’āŊēāŊĸāŧ‹āŊ‚āžąāŊ˛āŧ‹āŊ†āŧ‹āŊ āŊ•āž˛āŊ˛āŊ“āŧ‹āŊ‘āŊ„āŧ‹āŊĄāŊ˛āŊ‚āŧ‹āŊ†āŊ āŊ˛āŧ‹āŊ“āŊ„āŧ‹āŊ‘āŊŧāŊ“āŧ‹āŊ‚āŊ„āŧ‹āŊĄāŊ„āŧ‹āŊĸāž—āŊēāŊĻāŧ‹āŊ āŊ‘āŊēāŊ‘āŧ‹āŊ˜āŊ˛āŧ‹āŊ–āžąāŊēāŊ‘āŧ", "paragraph2": "Stirling-PDF āŊ āŊ•āŊēāŊŖāŧ‹āŊĸāž’āžąāŊĻāŧ‹āŊ‘āŊ„āŧ‹āŊ„āŧ‹āŊšāŊŧāŊ āŊ˛āŧ‹āŊĻāž¤āžąāŊŧāŊ‘āŧ‹āŊ˜āŊāŊ“āŧ‹āŊŖāŊēāŊ‚āŊĻāŧ‹āŊ”āŊŧāŊĸāŧ‹āŊĸāžŸāŊŧāŊ‚āŊĻāŧ‹āŊ”āŊĸāŧ‹āŊĸāŊŧāŊ‚āŊĻāŧ‹āŊĸāŊ˜āŧ‹āŊ–āžąāŊēāŊ‘āŧ‹āŊ”āŊ āŊ˛āŧ‹āŊ†āŊēāŊ‘āŧ‹āŊ‘āŊ´āŧ‹āŊ‘āŊ”āžąāŊ‘āŧ‹āŊžāŊ˛āŊ–āŧ‹āŊĻāž¤āžąāŊŧāŊ‘āŧ‹āŊ āŊ‚āŊŧāŧ‹āŊ āŊ›āŊ´āŊ‚āŊĻāŧ‹āŊĸāŊŧāŊ‚āŊĻāŧ", + "learnMore": "Learn more", "enable": "āŊ‘āŊ”āžąāŊ‘āŧ‹āŊžāŊ˛āŊ–āŧ‹āŊĻāž¤āžąāŊŧāŊ‘āŧ‹āŊ āŊ‚āŊŧāŧ‹āŊ āŊ›āŊ´āŊ‚āŊĻāŧ", "disable": "āŊ‘āŊ”āžąāŊ‘āŧ‹āŊžāŊ˛āŊ–āŧ‹āŊĻāž¤āžąāŊŧāŊ‘āŧ‹āŊ˜āŊšāŊ˜āŊĻāŧ‹āŊ āŊ‡āŊŧāŊ‚", "settings": "āŊ‘āŊ”āžąāŊ‘āŧ‹āŊžāŊ˛āŊ–āŧ‹āŊ€āžąāŊ˛āŧ‹āŊĻāž’āž˛āŊ˛āŊ‚āŧ‹āŊ āŊ‚āŊŧāŊ‘āŧ‹ config/settings.yml āŊĄāŊ˛āŊ‚āŧ‹āŊ†āŊ āŊ˛āŧ‹āŊ“āŊ„āŧ‹āŊ–āŊĻāž’āžąāŊ´āŊĸāŧ‹āŊ–āŊ…āŊŧāŊĻāŧ‹āŊ–āžąāŊēāŊ‘āŧ‹āŊ†āŊŧāŊ‚" @@ -203,6 +294,54 @@ "cacheInputs": { "name": "āŊ“āŊ„āŧ‹āŊ āŊ‡āŊ´āŊ‚āŧ‹āŊ‚āŊ˛āŧ‹āŊ“āŊ„āŧ‹āŊ‘āŊŧāŊ“āŧ‹āŊ‰āŊĸāŧ‹āŊšāŊ‚āŊĻāŧ", "help": "āŊĻāž”āŊŧāŊ“āŧ‹āŊ˜āŧ‹āŊ–āŊēāŊ‘āŧ‹āŊĻāž¤āžąāŊ‘āŧ‹āŊ”āŊ āŊ˛āŧ‹āŊ“āŊ„āŧ‹āŊ āŊ‡āŊ´āŊ‚āŧ‹āŊ‚āŊ˛āŧ‹āŊ“āŊ„āŧ‹āŊ‘āŊŧāŊ“āŧ‹āŊ˜āŧ‹āŊ āŊŧāŊ„āŊĻāŧ‹āŊ”āŊĸāŧ‹āŊ–āŊēāŊ‘āŧ‹āŊĻāž¤āžąāŊŧāŊ‘āŧ‹āŊ†āŊēāŊ‘āŧ‹āŊ‰āŊĸāŧ‹āŊšāŊ‚āŊĻāŧ‹āŊ–āžąāŊēāŊ‘āŧ" + }, + "general": { + "title": "General", + "description": "Configure general application preferences.", + "account": "Account", + "accountDescription": "Manage your account settings", + "user": "User", + "signedInAs": "Signed in as", + "logout": "Log out", + "enableFeatures": { + "title": "For System Administrators", + "intro": "Enable user authentication, team management, and workspace features for your organization.", + "action": "Configure", + "and": "and", + "benefit": "Enables user roles, team collaboration, admin controls, and enterprise features.", + "learnMore": "Learn more in documentation", + "dismiss": "Dismiss" + }, + "autoUnzip": "Auto-unzip API responses", + "autoUnzipDescription": "Automatically extract files from ZIP responses", + "autoUnzipTooltip": "Automatically extract ZIP files returned from API operations. Disable to keep ZIP files intact. This does not affect automation workflows.", + "autoUnzipFileLimit": "Auto-unzip file limit", + "autoUnzipFileLimitDescription": "Maximum number of files to extract from ZIP", + "autoUnzipFileLimitTooltip": "Only unzip if the ZIP contains this many files or fewer. Set higher to extract larger ZIPs.", + "defaultToolPickerMode": "Default tool picker mode", + "defaultToolPickerModeDescription": "Choose whether the tool picker opens in fullscreen or sidebar by default", + "mode": { + "fullscreen": "Fullscreen", + "sidebar": "Sidebar" + } + }, + "hotkeys": { + "title": "Keyboard Shortcuts", + "description": "Hover a tool to see its shortcut or customise it below. Click \"Change shortcut\" and press a new key combination. Press Esc to cancel.", + "errorModifier": { + "mac": "Include ⌘ (Command), âŒĨ (Option), or another modifier in your shortcut.", + "windows": "Include Ctrl, Alt, or another modifier in your shortcut." + }, + "errorConflict": "Shortcut already used by {{tool}}.", + "none": "Not assigned", + "customBadge": "Custom", + "defaultLabel": "Default: {{shortcut}}", + "capturing": "Press keysâ€Ļ (Esc to cancel)", + "change": "Change shortcut", + "reset": "Reset", + "shortcut": "Shortcut", + "noShortcut": "No shortcut set", + "searchPlaceholder": "Search tools..." } }, "changeCreds": { @@ -274,8 +413,10 @@ "top20": "Top 20", "all": "All", "refresh": "Refresh", - "includeHomepage": "Include Homepage ('/')", - "includeLoginPage": "Include Login Page ('/login')", + "dataTypeLabel": "Data Type:", + "dataTypeAll": "All", + "dataTypeApi": "API", + "dataTypeUi": "UI", "totalEndpoints": "Total Endpoints", "totalVisits": "Total Visits", "showing": "Showing", @@ -290,7 +431,9 @@ "top": "Top", "numberOfVisits": "Number of Visits", "visitsTooltip": "Visits: {0} ({1}% of total)", - "retry": "Retry" + "retry": "Retry", + "includeHomepage": "Include Homepage ('/')", + "includeLoginPage": "Include Login Page ('/login')" }, "database": { "title": "āŊ‚āŊžāŊ˛āŧ‹āŊ‚āž˛āŊ„āŊĻāŧ‹āŊ˜āŊ›āŊŧāŊ‘āŧ‹āŊ“āŊ„āŧ‹āŊ āŊ‘āž˛āŊēāŊ“āŧ‹/āŊ•āžąāŊ˛āŊĸāŧ‹āŊ āŊ‘āž˛āŊēāŊ“āŧ", @@ -331,22 +474,310 @@ "alphabetical": "Alphabetical", "globalPopularity": "Global Popularity", "sortBy": "Sort by:", + "mobile": { + "brandAlt": "Stirling PDF logo", + "openFiles": "Open files", + "swipeHint": "Swipe left or right to switch views", + "tools": "Tools", + "toolsSlide": "Tool selection panel", + "viewSwitcher": "Switch workspace view", + "workbenchSlide": "Workspace panel", + "workspace": "Workspace" + }, "multiTool": { + "tags": "multiple,tools", "title": "PDF āŊŖāŊ‚āŧ‹āŊ†āŧ‹āŊ˜āŊ„āŧ‹āŊ”āŊŧāŧ", "desc": "āŊĻāžĄāŊēāŊ–āŧ‹āŊĻāžĻāžąāŊŧāŊĸāŧ āŊ āŊāŊŧāŊĸāŧ‹āŊĻāžāžąāŊŧāŊ‘āŧ āŊ–āŊĻāžāžąāŊĸāŧ‹āŊĻāž’āž˛āŊ˛āŊ‚ āŊāŧ‹āŊ‚āžąāŊēāŊĻāŧ āŊ‘āŊ„āŧ‹āŊ¤āŊŧāŊ‚āŧ‹āŊ„āŊŧāŊĻāŧ‹āŊĻāŊ´āŊ–āŧ‹āŊ”āŧ" }, "merge": { + "tags": "combine,join,unite", "title": "āŊĻāžĄāŊēāŊ–āŧ‹āŊĻāžĻāžąāŊŧāŊĸāŧ", "desc": "PDF āŊ˜āŊ„āŧ‹āŊ”āŊŧāŧ‹āŊ‚āŊ…āŊ˛āŊ‚āŧ‹āŊāŊ´āŧ‹āŊĻāžĄāŊēāŊ–āŧ‹āŊĻāžĻāžąāŊŧāŊĸāŧ‹āŊ–āžąāŊēāŊ‘āŧ‹āŊ”āŧ" }, "split": { + "tags": "divide,separate,break", "title": "āŊāŧ‹āŊ‚āžąāŊēāŊĻāŧ", "desc": "PDF āŊĄāŊ˛āŊ‚āŧ‹āŊ†āŧ‹āŊ˜āŊ„āŧ‹āŊ”āŊŧāŊĸāŧ‹āŊ–āŊ‚āŊŧāŧ‹āŊ–āŧ" }, "rotate": { + "tags": "turn,flip,orient", "title": "āŊ āŊāŊŧāŊĸāŧ‹āŊĻāžāžąāŊŧāŊ‘āŧ", "desc": "PDF āŊŖāŊĻāŧ‹āŊĻāžŗāŧ‹āŊ”āŊŧāŊ āŊ˛āŧ‹āŊ„āŊ„āŧ‹āŊ āŊāŊŧāŊĸāŧ‹āŊĻāžāžąāŊŧāŊ‘āŧ‹āŊ–āžąāŊēāŊ‘āŧ‹āŊ”āŧ" }, + "convert": { + "tags": "transform,change", + "title": "Convert", + "desc": "Convert files between different formats" + }, + "pdfOrganiser": { + "tags": "organize,rearrange,reorder", + "title": "āŊ‚āŊŧāŧ‹āŊĻāž’āž˛āŊ˛āŊ‚", + "desc": "āŊ¤āŊŧāŊ‚āŧ‹āŊ„āŊŧāŊĻāŧ‹āŊĸāžŖāŊ˜āŊĻāŧ‹āŊ‚āŊŧāŧ‹āŊĸāŊ˛āŊ˜āŧ‹āŊ‚āŊ„āŧ‹āŊĸāŊ´āŊ„āŧ‹āŊ‘āŊ´āŧ‹āŊĻāŊ´āŊ–āŧ‹āŊ”āŊ āŊ˜āŧ‹āŊ–āŊĻāžāžąāŊĸāŧ‹āŊĻāž’āž˛āŊ˛āŊ‚āŧ‹āŊ–āžąāŊēāŊ‘āŧ‹āŊ”āŧ" + }, + "addImage": { + "tags": "insert,embed,place", + "title": "āŊ”āŊĸāŧ‹āŊĸāŊ˛āŊĻāŧ‹āŊĻāžŖāŊŧāŊ“āŧ‹āŊ”āŧ", + "desc": "PDF āŊ“āŊ„āŧ‹āŊ‚āŊ“āŊĻāŧ‹āŊĻāŧ‹āŊ„āŊēāŊĻāŧ‹āŊ…āŊ“āŧ‹āŊžāŊ˛āŊ‚āŧ‹āŊāŊ´āŧ‹āŊ”āŊĸāŧ‹āŊĸāŊ˛āŊĻāŧ‹āŊĻāžŖāŊŧāŊ“āŧ‹āŊ”āŧ" + }, + "addAttachments": { + "tags": "embed,attach,include", + "title": "Add Attachments", + "desc": "Add or remove embedded files (attachments) to/from a PDF" + }, + "watermark": { + "tags": "stamp,mark,overlay", + "title": "āŊ†āŊ´āŧ‹āŊĸāžŸāŊ‚āŊĻāŧ‹āŊĻāžŖāŊŧāŊ“āŧ‹āŊ”āŧ", + "desc": "PDF āŊĄāŊ˛āŊ‚āŧ‹āŊ†āŊĸāŧ‹āŊĸāŊ„āŧ‹āŊĻāž’āž˛āŊ˛āŊ‚āŧ‹āŊ‚āŊ˛āŧ‹āŊ†āŊ´āŧ‹āŊĸāžŸāŊ‚āŊĻāŧ‹āŊĻāžŖāŊŧāŊ“āŧ‹āŊ”āŧ" + }, + "removePassword": { + "tags": "unlock", + "title": "āŊ‚āŊĻāŊ„āŧ‹āŊšāŊ˛āŊ‚āŧ‹āŊĻāŊ´āŊ–āŧ‹āŊ”āŧ", + "desc": "PDF āŊĄāŊ˛āŊ‚āŧ‹āŊ†āŧ‹āŊ“āŊĻāŧ‹āŊ‚āŊĻāŊ„āŧ‹āŊšāŊ˛āŊ‚āŧ‹āŊĻāž˛āŊ´āŊ„āŧ‹āŊĻāžāžąāŊŧāŊ–āŧ‹āŊĻāŊ´āŊ–āŧ‹āŊ”āŧ" + }, + "compress": { + "tags": "shrink,reduce,optimize", + "title": "āŊĻāžĄāŊ´āŊ‘āŧ‹āŊĻāž’āž˛āŊ˛āŊŖāŧ", + "desc": "āŊĄāŊ˛āŊ‚āŧ‹āŊ†āŊ āŊ˛āŧ‹āŊ†āŊēāŧ‹āŊ†āŊ´āŊ„āŧ‹āŊ†āŊ´āŊ„āŧ‹āŊ‘āŊ´āŧ‹āŊ‚āŊāŊŧāŊ„āŧ‹āŊ†āŊēāŊ‘āŧ‹ PDF āŊĻāžĄāŊ´āŊ‘āŧ‹āŊĻāž’āž˛āŊ˛āŊŖāŧ‹āŊ–āžąāŊēāŊ‘āŧ‹āŊ”āŧ" + }, + "unlockPDFForms": { + "tags": "unlock,enable,edit", + "title": "Unlock PDF Forms", + "desc": "Remove read-only property of form fields in a PDF document." + }, + "changeMetadata": { + "tags": "edit,modify,update", + "title": "āŊ‚āŊ“āŊĻāŧ‹āŊ†āŧ‹āŊĻāž’āžąāŊ´āŊĸāŧ‹āŊ–āŊ…āŊŧāŊĻāŧ", + "desc": "PDF āŊĄāŊ˛āŊ‚āŧ‹āŊ†āŧ‹āŊ“āŊĻāŧ‹āŊ‚āŊ“āŊĻāŧ‹āŊ†āŧ‹āŊ–āŊĻāž’āžąāŊ´āŊĸāŧ‹āŊ–āŊ āŊ˜āŧ‹āŊĻāŊ´āŊ–āŧ‹āŊ”āŧāŊĻāžŖāŊŧāŊ“āŧ‹āŊ”āŧ" + }, + "ocr": { + "tags": "extract,scan", + "title": "OCR / āŊ–āŊ¤āŊēāŊĸāŧ‹āŊ āŊ–āŊēāŊ–āŊĻāŧ‹āŊ‚āŊ™āŊ„āŧ‹āŊĻāŊēāŊŖāŧ", + "desc": "āŊ–āŊ¤āŊēāŊĸāŧ‹āŊ āŊ–āŊēāŊ–āŊĻāŧ‹āŊ‚āŊ™āŊ„āŧ‹āŊĻāŊēāŊŖāŧ‹āŊ‘āŊ„āŧ‹ PDF āŊ“āŊ„āŧ‹āŊ‚āŊ˛āŧ‹āŊ”āŊĸāŧ‹āŊĸāŊ˛āŊĻāŧ‹āŊ“āŊĻāŧ‹āŊĄāŊ˛āŧ‹āŊ‚āŊēāŧ‹āŊ„āŊŧāŊĻāŧ‹āŊ āŊ›āŊ˛āŊ“āŧ‹āŊ–āžąāŊĻāŧ‹āŊāŊēāŧ‹āŊĄāŊ˛āŧ‹āŊ‚āŊēāŊ āŊ˛āŧ‹āŊĸāžŖāŊ˜āŧ‹āŊ”āŊĸāŧ‹āŊ–āŊĻāžāžąāŊĸāŧ‹āŊĻāžŖāŊŧāŊ“āŧ‹āŊ–āžąāŊēāŊ‘āŧ‹āŊ”āŧ" + }, + "extractImages": { + "tags": "pull,save,export", + "title": "āŊ”āŊĸāŧ‹āŊĸāŊ˛āŊĻāŧ‹āŊ•āžąāŊ˛āŊĸāŧ‹āŊ āŊ‘āŊŧāŊ“āŧ", + "desc": "PDF āŊ“āŊĻāŧ‹āŊ”āŊĸāŧ‹āŊĸāŊ˛āŊĻāŧ‹āŊšāŊ„āŧ‹āŊ˜āŧ‹āŊ•āžąāŊ˛āŊĸāŧ‹āŊ–āŊāŊŧāŊ“āŧ‹āŊ“āŊĻāŧ‹ zip āŊ“āŊ„āŧ‹āŊ‰āŊĸāŧ‹āŊšāŊ‚āŊĻāŧ‹āŊ–āžąāŊēāŊ‘āŧ‹āŊ”āŧ" + }, + "scannerImageSplit": { + "tags": "detect,split,photos", + "title": "Detect & Split Scanned Photos", + "desc": "Detect and split scanned photos into separate pages" + }, + "sign": { + "tags": "signature,autograph", + "title": "āŊ˜āŊ˛āŊ„āŧ‹āŊĸāžŸāŊ‚āŊĻāŧ", + "desc": "āŊĸāŊ˛āŧ‹āŊ˜āŊŧāŧ āŊĄāŊ˛āŧ‹āŊ‚āŊēāŧ āŊ”āŊĸāŧ‹āŊĸāŊ˛āŊĻāŧ‹āŊ–āŊ…āŊĻāŧ‹āŊ€āžąāŊ˛āŧ‹āŊĻāž’āŊŧāŧ‹āŊ“āŊĻāŧ‹ PDF āŊŖāŧ‹āŊ˜āŊ˛āŊ„āŧ‹āŊĸāžŸāŊ‚āŊĻāŧ‹āŊĻāžŖāŊŧāŊ“āŧ‹āŊ”āŧ" + }, + "flatten": { + "tags": "simplify,remove,interactive", + "title": "āŊĻāž™āŊŧāŊ˜āŊĻāŧ‹āŊ”āŧ", + "desc": "PDF āŊ“āŊĻāŧ‹āŊĻāž¤āžąāŊŧāŊ‘āŧ‹āŊĻāž’āŊŧāŧ‹āŊ…āŊ“āŧ‹āŊ‚āžąāŊ˛āŧ‹āŊ†āŧ‹āŊ¤āŊĻāŧ‹āŊ‘āŊ„āŧ‹āŊ āŊ‚āŊēāŊ„āŊĻāŧ‹āŊ¤āŊŧāŊ‚āŧ‹āŊšāŊ„āŧ‹āŊ˜āŧ‹āŊĻāŊ´āŊ–āŧ‹āŊ”āŧ" + }, + "certSign": { + "tags": "authenticate,PEM,P12,official,encrypt,sign,certificate,PKCS12,JKS,server,manual,auto", + "title": "āŊŖāŊ‚āŧ‹āŊāžąāŊēāŊĸāŧ‹āŊ˜āŊ˛āŊ„āŧ‹āŊĸāžŸāŊ‚āŊĻāŧ", + "desc": "āŊŖāŊ‚āŧ‹āŊāžąāŊēāŊĸāŧ‹/āŊŖāžĄāŊēāŧ‹āŊ˜āŊ˛āŊ‚āŧ‹ (PEM/P12) āŊ‚āžąāŊ˛āŊĻāŧ‹ PDF āŊŖāŧ‹āŊ˜āŊ˛āŊ„āŧ‹āŊĸāžŸāŊ‚āŊĻāŧ‹āŊĸāž’āžąāŊ‚āŧ‹āŊ”āŧ" + }, + "repair": { + "tags": "fix,restore", + "title": "āŊ–āŊŸāŊŧāŧ‹āŊ–āŊ…āŊŧāŊĻāŧ", + "desc": "āŊĻāžāžąāŊŧāŊ“āŧ‹āŊ¤āŊŧāŊĸāŧ‹āŊ–āŊ āŊ˜āŧ‹āŊ‚āŊāŊŧāŊĸāŧ‹āŊ–āŊ¤āŊ˛āŊ‚āŧ‹āŊāŊēāŊ–āŊĻāŧ‹āŊ”āŊ āŊ˛āŧ‹ PDF āŊ–āŊŸāŊŧāŧ‹āŊ–āŊ…āŊŧāŊĻāŧ‹āŊ–āžąāŊēāŊ‘āŧ‹āŊāŊ–āŊĻāŧ‹āŊ–āžąāŊēāŊ‘āŧ‹āŊ”āŧ" + }, + "removeBlanks": { + "tags": "delete,clean,empty", + "title": "āŊĻāžŸāŊŧāŊ„āŧ‹āŊ¤āŊŧāŊ‚āŧ‹āŊĻāŊ´āŊ–āŧ‹āŊ”āŧ", + "desc": "PDF āŊ“āŊ„āŧ‹āŊ‚āŊ˛āŧ‹āŊĻāžŸāŊŧāŊ„āŧ‹āŊ¤āŊŧāŊ‚āŧ‹āŊĸāŊ„āŧ‹āŊ āŊ‚āŊ´āŊŖāŧ‹āŊ„āŊŧāŊĻāŧ‹āŊ āŊ›āŊ˛āŊ“āŧ‹āŊ‘āŊ„āŧ‹āŊĻāŊ´āŊ–āŧ‹āŊ”āŧ" + }, + "removeAnnotations": { + "tags": "delete,clean,strip", + "title": "āŊ˜āŊ†āŊ“āŧ‹āŊ āŊ‚āž˛āŊēāŊŖāŧ‹āŊĻāŊ´āŊ–āŧ‹āŊ”āŧ", + "desc": "PDF āŊ“āŊ„āŧ‹āŊ‚āŊ˛āŧ‹āŊ˜āŊ†āŊ“āŧ‹āŊ āŊ‚āž˛āŊēāŊŖāŧ‹āŊšāŊ„āŧ‹āŊ˜āŧ‹āŊĻāŊ´āŊ–āŧ‹āŊ”āŧ" + }, + "compare": { + "tags": "difference", + "title": "PDF āŊ–āŊĻāžĄāŊ´āŊĸāŧ‹āŊ–āŧ", + "desc": "PDF āŊĄāŊ˛āŊ‚āŧ‹āŊ†āŧ‹āŊ‚āŊ‰āŊ˛āŊĻāŧ‹āŊ€āžąāŊ˛āŧ‹āŊāžąāŊ‘āŧ‹āŊ”āŊĸāŧ‹āŊ–āŊĻāžĄāŊ´āŊĸāŧ‹āŊ–āŧ" + }, + "removeCertSign": { + "tags": "remove,delete,unlock", + "title": "āŊŖāŊ‚āŧ‹āŊāžąāŊēāŊĸāŧ‹āŊ˜āŊ˛āŊ„āŧ‹āŊĸāžŸāŊ‚āŊĻāŧ‹āŊĻāŊ´āŊ–āŧ‹āŊ”āŧ", + "desc": "PDF āŊ“āŊĻāŧ‹āŊŖāŊ‚āŧ‹āŊāžąāŊēāŊĸāŧ‹āŊ˜āŊ˛āŊ„āŧ‹āŊĸāžŸāŊ‚āŊĻāŧ‹āŊĻāŊ´āŊ–āŧ‹āŊ”āŧ" + }, + "pageLayout": { + "tags": "layout,arrange,combine", + "title": "āŊ¤āŊŧāŊ‚āŧ‹āŊ„āŊŧāŊĻāŧ‹āŊ˜āŊ„āŧ‹āŊ”āŊŧāŊ āŊ˛āŧ‹āŊ–āŊ€āŊŧāŊ‘āŧ‹āŊ”āŧ", + "desc": "PDF āŊĄāŊ˛āŊ‚āŧ‹āŊ†āŊ āŊ˛āŧ‹āŊ¤āŊŧāŊ‚āŧ‹āŊ„āŊŧāŊĻāŧ‹āŊ˜āŊ„āŧ‹āŊ”āŊŧāŧ‹āŊ¤āŊŧāŊ‚āŧ‹āŊ„āŊŧāŊĻāŧ‹āŊ‚āŊ…āŊ˛āŊ‚āŧ‹āŊāŊ´āŧ‹āŊĻāžĄāŊēāŊ–āŧ‹āŊĻāžĻāžąāŊŧāŊĸāŧ‹āŊ–āžąāŊēāŊ‘āŧ‹āŊ”āŧ" + }, + "bookletImposition": { + "tags": "booklet,print,binding", + "title": "Booklet Imposition", + "desc": "Create booklets with proper page ordering and multi-page layout for printing and binding" + }, + "scalePages": { + "tags": "resize,adjust,scale", + "title": "āŊ¤āŊŧāŊ‚āŧ‹āŊ„āŊŧāŊĻāŧ‹āŊ†āŊēāŧ‹āŊ†āŊ´āŊ„āŧ‹/āŊšāŊ‘āŧ‹āŊĻāž’āž˛āŊ˛āŊ‚āŧ‹āŊ”āŧ", + "desc": "āŊ¤āŊŧāŊ‚āŧ‹āŊ„āŊŧāŊĻāŧ‹āŊ‘āŊ„āŧ‹/āŊĄāŊ„āŧ‹āŊ“āŧ‹āŊ‘āŊēāŊ āŊ˛āŧ‹āŊ“āŊ„āŧ‹āŊ‘āŊŧāŊ“āŧ‹āŊ‚āžąāŊ˛āŧ‹āŊ†āŊēāŧ‹āŊ†āŊ´āŊ„āŧ‹/āŊšāŊ‘āŧ‹āŊ–āŊĻāž’āžąāŊ´āŊĸāŧ‹āŊ–āŧ" + }, + "addPageNumbers": { + "tags": "number,pagination,count", + "title": "āŊ¤āŊŧāŊ‚āŧ‹āŊ‚āž˛āŊ„āŊĻāŧ‹āŊĻāžŖāŊŧāŊ“āŧ‹āŊ”āŧ", + "desc": "āŊĄāŊ˛āŊ‚āŧ‹āŊ†āŊ āŊ˛āŧ‹āŊ“āŊ„āŧ‹āŊ‚āŊ“āŊĻāŧ‹āŊĻāŧ‹āŊ„āŊēāŊĻāŧ‹āŊ…āŊ“āŧ‹āŊ‘āŊ´āŧ‹āŊ¤āŊŧāŊ‚āŧ‹āŊ‚āž˛āŊ„āŊĻāŧ‹āŊĻāžŖāŊŧāŊ“āŧ‹āŊ”āŧ" + }, + "autoRename": { + "tags": "auto-detect,header-based,organize,relabel", + "title": "Auto Rename PDF File", + "desc": "Auto renames a PDF file based on its detected header" + }, + "adjustContrast": { + "tags": "contrast,brightness,saturation", + "title": "āŊšāŊŧāŊĻāŧ‹āŊ‚āŊžāŊ˛āŧ‹/āŊ āŊŧāŊ‘āŧ‹āŊāžąāŊ‘āŧ‹āŊĻāž™āŊŧāŊ˜āŧ‹āŊĻāž’āž˛āŊ˛āŊ‚", + "desc": "PDF āŊĄāŊ˛āŧ‹āŊ āŊŧāŊ‘āŧ‹āŊāžąāŊ‘āŧ āŊšāŊŧāŊĻāŧ‹āŊŸāŊ˛āŊŖāŧ āŊ‘āŊ„āŧ‹āŊ‚āŊĻāŊŖāŧ‹āŊšāŊ‘āŧ‹āŊĻāž™āŊŧāŊ˜āŧ‹āŊĻāž’āž˛āŊ˛āŊ‚āŧ‹āŊ–āžąāŊēāŊ‘āŧ‹āŊ”āŧ" + }, + "crop": { + "tags": "trim,cut,resize", + "title": "PDF āŊ‚āŊāŊ´āŊ–āŧ‹āŊ‚āŊ…āŊŧāŊ‘āŧ", + "desc": "āŊ†āŊēāŧ‹āŊ†āŊ´āŊ„āŧ‹āŊ†āŊ´āŊ„āŧ‹āŊ‘āŊ´āŧ‹āŊ‚āŊāŊŧāŊ„āŧ‹āŊ†āŊēāŊ‘āŧ‹ PDF āŊ‚āŊāŊ´āŊ–āŧ‹āŊ‚āŊ…āŊŧāŊ‘āŧ‹āŊ–āžąāŊēāŊ‘āŧ‹āŊ”āŧ (āŊĄāŊ˛āŧ‹āŊ‚āŊēāŧ‹āŊĸāžŖāŊ˜āŊĻāŧ‹āŊĻāž˛āŊ´āŊ„āŧ‹āŊĻāžāžąāŊŧāŊ–āŧ‹āŊ–āžąāŊēāŊ‘āŧ‹āŊāŊ´āŊ–āŧ)" + }, + "autoSplitPDF": { + "tags": "auto,split,QR", + "title": "āŊ¤āŊŧāŊ‚āŧ‹āŊ„āŊŧāŊĻāŧ‹āŊĸāŊ„āŧ‹āŊ āŊ‚āŊ´āŊŖāŧ‹āŊāŧ‹āŊ‚āžąāŊēāŊĻāŧ", + "desc": "āŊ–āŊ¤āŊēāŊĸāŧ‹āŊ āŊ–āŊēāŊ–āŊĻāŧ‹āŊ–āžąāŊĻāŧ‹āŊ”āŊ āŊ˛āŧ‹ PDF āŊ“āŊ„āŧ‹āŊ‚āŊ˛āŧ‹āŊ‘āŊ„āŊŧāŊĻāŧ‹āŊĄāŊŧāŊ‘āŧ‹āŊ–āŊ¤āŊēāŊĸāŧ‹āŊ āŊ–āŊēāŊ–āŊĻāŧ‹āŊ¤āŊŧāŊ‚āŧ‹āŊ„āŊŧāŊĻāŧ‹āŊāŧ‹āŊ‚āžąāŊēāŊĻāŧ‹ QR Code āŊ–āŊēāŊ‘āŧ‹āŊĻāž¤āžąāŊŧāŊ‘āŧ‹āŊ–āžąāŊĻāŧ‹āŊ“āŊĻāŧ‹āŊĸāŊ„āŧ‹āŊ āŊ‚āŊ´āŊŖāŧ‹āŊāŧ‹āŊ‚āžąāŊēāŊĻāŧ‹āŊ–āžąāŊēāŊ‘āŧ‹āŊ”āŧ" + }, + "sanitize": { + "tags": "clean,purge,remove", + "title": "Sanitise", + "desc": "Remove potentially harmful elements from PDF files" + }, + "getPdfInfo": { + "tags": "info,metadata,details", + "title": "PDF āŊĄāŊ˛āŧ‹āŊ‚āŊ“āŊĻāŧ‹āŊšāŊ´āŊŖāŧ‹āŊ†āŧ‹āŊšāŊ„āŧ‹āŊŖāŊēāŊ“āŧ‹āŊ”āŧ", + "desc": "PDF āŊĄāŊ˛āŧ‹āŊ‚āŊ“āŊĻāŧ‹āŊšāŊ´āŊŖāŧ‹āŊĄāŊŧāŊ‘āŧ‹āŊšāŊ‘āŧ‹āŊŖāŊēāŊ“āŧ‹āŊ”āŧ" + }, + "pdfToSinglePage": { + "tags": "combine,merge,single", + "title": "PDF āŊ“āŊĻāŧ‹āŊ¤āŊŧāŊ‚āŧ‹āŊ„āŊŧāŊĻāŧ‹āŊ†āŊēāŊ“āŧ‹āŊ”āŊŧāŧ‹āŊ‚āŊ…āŊ˛āŊ‚āŧ‹āŊŖāŧ", + "desc": "PDF āŊĄāŊ˛āŧ‹āŊ¤āŊŧāŊ‚āŧ‹āŊ„āŊŧāŊĻāŧ‹āŊšāŊ„āŧ‹āŊ˜āŧ‹āŊ¤āŊŧāŊ‚āŧ‹āŊ„āŊŧāŊĻāŧ‹āŊ†āŊēāŊ“āŧ‹āŊ”āŊŧāŧ‹āŊ‚āŊ…āŊ˛āŊ‚āŧ‹āŊāŊ´āŧ‹āŊĻāžĄāŊēāŊ–āŧ‹āŊĻāžĻāžąāŊŧāŊĸāŧ‹āŊ–āžąāŊēāŊ‘āŧ‹āŊ”āŧ" + }, + "showJS": { + "tags": "javascript,code,script", + "title": "Javascript āŊĻāžŸāŊŧāŊ“āŧ‹āŊ”āŧ", + "desc": "PDF āŊ“āŊ„āŧ‹āŊ‘āŊ´āŧ‹āŊ–āŊ…āŊ´āŊ‚āŧ‹āŊ”āŊ āŊ˛āŧ‹ JS āŊ‚āŊ„āŧ‹āŊĄāŊŧāŊ‘āŧ‹āŊ āŊšāŊŧāŊŖāŧ‹āŊžāŊ˛āŊ–āŧ‹āŊ‘āŊ„āŧ‹āŊ˜āŊ„āŊŧāŊ“āŧ‹āŊĻāžŸāŊŧāŊ“āŧ‹āŊ–āžąāŊēāŊ‘āŧ‹āŊ”āŧ" + }, + "redact": { + "tags": "censor,blackout,hide", + "title": "āŊŖāŊ‚āŧ‹āŊ–āŊŸāŊŧāŊĻāŧ‹āŊĻāž’āž˛āŊ˛āŊ–āŧ‹āŊĻāž˛āŊ´āŊ„āŧ‹āŧ", + "desc": "āŊ āŊ‘āŊēāŊ˜āŊĻāŧ‹āŊĻāž’āž˛āŊ´āŊ‚āŧ‹āŊ–āžąāŊĻāŧ‹āŊ”āŊ āŊ˛āŧ‹āŊĄāŊ˛āŧ‹āŊ‚āŊēāŧ āŊ–āž˛āŊ˛āŊĻāŧ‹āŊ”āŊ āŊ˛āŧ‹āŊ‘āŊ–āžąāŊ˛āŊ–āŊĻāŧ āŊ‘āŊ„āŧ‹/āŊĄāŊ„āŧ‹āŊ“āŧ‹āŊ āŊ‘āŊēāŊ˜āŊĻāŧ‹āŊĻāž’āž˛āŊ´āŊ‚āŧ‹āŊ–āžąāŊĻāŧ‹āŊ”āŊ āŊ˛āŧ‹āŊ¤āŊŧāŊ‚āŧ‹āŊ„āŊŧāŊĻāŧ‹āŊ‚āŊžāŊ˛āŊĸāŧ‹āŊ–āŊŸāŊ´āŊ„āŧ‹āŊ“āŊĻāŧ‹ PDF āŊĻāž’āž˛āŊ˛āŊ–āŧ‹āŊĻāž˛āŊ´āŊ„āŧ‹āŊ–āžąāŊēāŊ‘āŧ‹āŊ”āŧ" + }, + "splitBySections": { + "tags": "split,sections,divide", + "title": "Split PDF by Sections", + "desc": "Divide each page of a PDF into smaller horizontal and vertical sections" + }, + "addStamp": { + "tags": "stamp,mark,seal", + "title": "Add Stamp to PDF", + "desc": "Add text or add image stamps at set locations" + }, + "removeImage": { + "tags": "remove,delete,clean", + "title": "āŊ”āŊĸāŧ‹āŊĸāŊ˛āŊĻāŧ‹āŊĻāŊ´āŊ–āŧ‹āŊ”āŧ", + "desc": "āŊĄāŊ˛āŊ‚āŧ‹āŊ†āŊ āŊ˛āŧ‹āŊ†āŊēāŧ‹āŊ†āŊ´āŊ„āŧ‹āŊ†āŊ´āŊ„āŧ‹āŊ‘āŊ´āŧ‹āŊ‚āŊāŊŧāŊ„āŧ‹āŊ†āŊēāŊ‘āŧ‹ PDF āŊ“āŊĻāŧ‹āŊ”āŊĸāŧ‹āŊĸāŊ˛āŊĻāŧ‹āŊĻāŊ´āŊ–āŧ‹āŊ”āŧ" + }, + "splitByChapters": { + "tags": "split,chapters,structure", + "title": "āŊŖāŊēāŊ āŊ´āŧ‹āŊŖāžŸāŊĸāŧ‹ PDF āŊāŧ‹āŊ‚āžąāŊēāŊĻāŧ", + "desc": "PDF āŊĄāŊ˛āŧ‹āŊŖāŊēāŊ āŊ´āŊ āŊ˛āŧ‹āŊĻāž’āž˛āŊŧāŊ˜āŧ‹āŊ‚āŊžāŊ˛āŧ‹āŊ‚āŊžāŊ˛āŊĸāŧ‹āŊ–āŊŸāŊ´āŊ„āŧ‹āŊ“āŊĻāŧ‹āŊĄāŊ˛āŊ‚āŧ‹āŊ†āŧ‹āŊ˜āŊ„āŧ‹āŊ”āŊŧāŊĸāŧ‹āŊāŧ‹āŊ‚āžąāŊēāŊĻāŧ‹āŊ–āžąāŊēāŊ‘āŧ‹āŊ”āŧ" + }, + "validateSignature": { + "tags": "validate,verify,certificate", + "title": "PDF āŊ˜āŊ˛āŊ„āŧ‹āŊĸāžŸāŊ‚āŊĻāŧ‹āŊĸāŧ‹āŊĻāž¤āž˛āŊŧāŊ‘āŧ", + "desc": "PDF āŊĄāŊ˛āŊ‚āŧ‹āŊ†āŊ āŊ˛āŧ‹āŊ“āŊ„āŧ‹āŊ‚āŊ˛āŧ‹āŊ¨āŊ„āŧ‹āŊ€āŊ˛āŊ āŊ˛āŧ‹āŊ˜āŊ˛āŊ„āŧ‹āŊĸāžŸāŊ‚āŊĻāŧ‹āŊ‘āŊ„āŧ‹āŊŖāŊ‚āŧ‹āŊāžąāŊēāŊĸāŧ‹āŊĸāŧ‹āŊĻāž¤āž˛āŊŧāŊ‘āŧ‹āŊ–āžąāŊēāŊ‘āŧ‹āŊ”āŧ" + }, + "swagger": { + "tags": "API,documentation,test", + "title": "API Documentation", + "desc": "View API documentation and test endpoints" + }, + "scannerEffect": { + "tags": "scan,simulate,create", + "title": "Scanner Effect", + "desc": "Create a PDF that looks like it was scanned" + }, + "editTableOfContents": { + "tags": "bookmarks,contents,edit", + "title": "Edit Table of Contents", + "desc": "Add or edit bookmarks and table of contents in PDF documents" + }, + "manageCertificates": { + "tags": "certificates,import,export", + "title": "Manage Certificates", + "desc": "Import, export, or delete digital certificate files used for signing PDFs." + }, + "read": { + "tags": "view,open,display", + "title": "Read", + "desc": "View and annotate PDFs. Highlight text, draw, or insert comments for review and collaboration." + }, + "reorganizePages": { + "tags": "rearrange,reorder,organize", + "title": "Reorganize Pages", + "desc": "Rearrange, duplicate, or delete PDF pages with visual drag-and-drop control." + }, + "extractPages": { + "tags": "pull,select,copy", + "title": "Extract Pages", + "desc": "Extract specific pages from a PDF document" + }, + "removePages": { + "tags": "delete,extract,exclude", + "title": "Remove Pages", + "desc": "Remove specific pages from a PDF document" + }, + "autoSizeSplitPDF": { + "tags": "auto,split,size", + "title": "Auto Split by Size/Count", + "desc": "Automatically split PDFs by file size or page count" + }, + "replaceColor": { + "title": "Replace & Invert Colour", + "desc": "Replace or invert colours in PDF documents" + }, + "devApi": { + "tags": "API,development,documentation", + "title": "API", + "desc": "Link to API documentation" + }, + "devFolderScanning": { + "tags": "automation,folder,scanning", + "title": "Automated Folder Scanning", + "desc": "Link to automated folder scanning guide" + }, + "devSsoGuide": { + "title": "SSO Guide", + "desc": "Link to SSO guide" + }, + "devAirgapped": { + "title": "Air-gapped Setup", + "desc": "Link to air-gapped setup guide" + }, + "addPassword": { + "title": "āŊ‚āŊĻāŊ„āŧ‹āŊšāŊ˛āŊ‚āŧ‹āŊĻāžŖāŊŧāŊ“āŧ‹āŊ”āŧ", + "desc": "PDF āŊĄāŊ˛āŊ‚āŧ‹āŊ†āŊĸāŧ‹āŊ‚āŊĻāŊ„āŧ‹āŊšāŊ˛āŊ‚āŧ‹āŊ‚āŊ˛āŊĻāŧ‹āŊ‚āŊĻāŊ„āŧ‹āŊĻāžĄāŊŧāŊ˜āŧ‹āŊ–āžąāŊēāŊ‘āŧ‹āŊ”āŧ" + }, + "changePermissions": { + "title": "Change Permissions", + "desc": "Change document restrictions and permissions" + }, + "automate": { + "tags": "workflow,sequence,automation", + "title": "Automate", + "desc": "Build multi-step workflows by chaining together PDF actions. Ideal for recurring tasks." + }, + "overlay-pdfs": { + "desc": "PDF āŊ‚āŊžāŊ“āŧ‹āŊžāŊ˛āŊ‚āŧ‹āŊ‚āŊ˛āŧ‹āŊĻāžŸāŊēāŊ„āŧ‹āŊ‘āŊ´āŧ‹ PDF āŊ–āŊĸāžŠāŊēāŊ‚āŊĻāŧ‹āŊ”āŧ", + "title": "PDF āŊĻāžŸāŊēāŊ„āŧ‹āŊ–āŊĸāžŠāŊēāŊ‚āŊĻāŧ" + }, "imageToPDF": { "title": "āŊ”āŊĸāŧ‹āŊĸāŊ˛āŊĻāŧ‹āŊ“āŊĻāŧ‹ PDF āŊŖāŧ", "desc": "āŊ”āŊĸāŧ‹āŊĸāŊ˛āŊĻāŧ‹ (PNG, JPEG, GIF) āŊ“āŊĻāŧ‹ PDF āŊŖāŧ‹āŊ–āŊĻāž’āžąāŊ´āŊĸāŧ‹āŊ–āŧ" @@ -355,18 +786,6 @@ "title": "PDF āŊ“āŊĻāŧ‹āŊ”āŊĸāŧ‹āŊĸāŊ˛āŊĻāŧ‹āŊŖāŧ", "desc": "PDF āŊ“āŊĻāŧ‹āŊ”āŊĸāŧ‹āŊĸāŊ˛āŊĻāŧ‹ (PNG, JPEG, GIF) āŊŖāŧ‹āŊ–āŊĻāž’āžąāŊ´āŊĸāŧ‹āŊ–āŧ" }, - "pdfOrganiser": { - "title": "āŊ‚āŊŧāŧ‹āŊĻāž’āž˛āŊ˛āŊ‚", - "desc": "āŊ¤āŊŧāŊ‚āŧ‹āŊ„āŊŧāŊĻāŧ‹āŊĸāžŖāŊ˜āŊĻāŧ‹āŊ‚āŊŧāŧ‹āŊĸāŊ˛āŊ˜āŧ‹āŊ‚āŊ„āŧ‹āŊĸāŊ´āŊ„āŧ‹āŊ‘āŊ´āŧ‹āŊĻāŊ´āŊ–āŧ‹āŊ”āŊ āŊ˜āŧ‹āŊ–āŊĻāžāžąāŊĸāŧ‹āŊĻāž’āž˛āŊ˛āŊ‚āŧ‹āŊ–āžąāŊēāŊ‘āŧ‹āŊ”āŧ" - }, - "addImage": { - "title": "āŊ”āŊĸāŧ‹āŊĸāŊ˛āŊĻāŧ‹āŊĻāžŖāŊŧāŊ“āŧ‹āŊ”āŧ", - "desc": "PDF āŊ“āŊ„āŧ‹āŊ‚āŊ“āŊĻāŧ‹āŊĻāŧ‹āŊ„āŊēāŊĻāŧ‹āŊ…āŊ“āŧ‹āŊžāŊ˛āŊ‚āŧ‹āŊāŊ´āŧ‹āŊ”āŊĸāŧ‹āŊĸāŊ˛āŊĻāŧ‹āŊĻāžŖāŊŧāŊ“āŧ‹āŊ”āŧ" - }, - "watermark": { - "title": "āŊ†āŊ´āŧ‹āŊĸāžŸāŊ‚āŊĻāŧ‹āŊĻāžŖāŊŧāŊ“āŧ‹āŊ”āŧ", - "desc": "PDF āŊĄāŊ˛āŊ‚āŧ‹āŊ†āŊĸāŧ‹āŊĸāŊ„āŧ‹āŊĻāž’āž˛āŊ˛āŊ‚āŧ‹āŊ‚āŊ˛āŧ‹āŊ†āŊ´āŧ‹āŊĸāžŸāŊ‚āŊĻāŧ‹āŊĻāžŖāŊŧāŊ“āŧ‹āŊ”āŧ" - }, "permissions": { "title": "āŊ†āŊŧāŊ‚āŧ‹āŊ˜āŊ†āŊ“āŧ‹āŊ–āŊĻāž’āžąāŊ´āŊĸāŧ‹āŊ–āŧ", "desc": "PDF āŊĄāŊ˛āŊ‚āŧ‹āŊ†āŊ āŊ˛āŧ‹āŊ†āŊŧāŊ‚āŧ‹āŊ˜āŊ†āŊ“āŧ‹āŊ–āŊĻāž’āžąāŊ´āŊĸāŧ‹āŊ–āŧ" @@ -375,38 +794,10 @@ "title": "āŊĻāŊ´āŊ–āŧ‹āŊ”āŧ", "desc": "PDF āŊĄāŊ˛āŊ‚āŧ‹āŊ†āŧ‹āŊ“āŊĻāŧ‹āŊ˜āŊ˛āŧ‹āŊ‘āŊ‚āŊŧāŊĻāŧ‹āŊ”āŊ āŊ˛āŧ‹āŊ¤āŊŧāŊ‚āŧ‹āŊ„āŊŧāŊĻāŧ‹āŊĸāžŖāŊ˜āŊĻāŧ‹āŊĻāŊ´āŊ–āŧ‹āŊ”āŧ" }, - "addPassword": { - "title": "āŊ‚āŊĻāŊ„āŧ‹āŊšāŊ˛āŊ‚āŧ‹āŊĻāžŖāŊŧāŊ“āŧ‹āŊ”āŧ", - "desc": "PDF āŊĄāŊ˛āŊ‚āŧ‹āŊ†āŊĸāŧ‹āŊ‚āŊĻāŊ„āŧ‹āŊšāŊ˛āŊ‚āŧ‹āŊ‚āŊ˛āŊĻāŧ‹āŊ‚āŊĻāŊ„āŧ‹āŊĻāžĄāŊŧāŊ˜āŧ‹āŊ–āžąāŊēāŊ‘āŧ‹āŊ”āŧ" - }, - "removePassword": { - "title": "āŊ‚āŊĻāŊ„āŧ‹āŊšāŊ˛āŊ‚āŧ‹āŊĻāŊ´āŊ–āŧ‹āŊ”āŧ", - "desc": "PDF āŊĄāŊ˛āŊ‚āŧ‹āŊ†āŧ‹āŊ“āŊĻāŧ‹āŊ‚āŊĻāŊ„āŧ‹āŊšāŊ˛āŊ‚āŧ‹āŊĻāž˛āŊ´āŊ„āŧ‹āŊĻāžāžąāŊŧāŊ–āŧ‹āŊĻāŊ´āŊ–āŧ‹āŊ”āŧ" - }, - "compress": { - "title": "āŊĻāžĄāŊ´āŊ‘āŧ‹āŊĻāž’āž˛āŊ˛āŊŖāŧ", - "desc": "āŊĄāŊ˛āŊ‚āŧ‹āŊ†āŊ āŊ˛āŧ‹āŊ†āŊēāŧ‹āŊ†āŊ´āŊ„āŧ‹āŊ†āŊ´āŊ„āŧ‹āŊ‘āŊ´āŧ‹āŊ‚āŊāŊŧāŊ„āŧ‹āŊ†āŊēāŊ‘āŧ‹ PDF āŊĻāžĄāŊ´āŊ‘āŧ‹āŊĻāž’āž˛āŊ˛āŊŖāŧ‹āŊ–āžąāŊēāŊ‘āŧ‹āŊ”āŧ" - }, - "unlockPDFForms": { - "title": "Unlock PDF Forms", - "desc": "Remove read-only property of form fields in a PDF document." - }, - "changeMetadata": { - "title": "āŊ‚āŊ“āŊĻāŧ‹āŊ†āŧ‹āŊĻāž’āžąāŊ´āŊĸāŧ‹āŊ–āŊ…āŊŧāŊĻāŧ", - "desc": "PDF āŊĄāŊ˛āŊ‚āŧ‹āŊ†āŧ‹āŊ“āŊĻāŧ‹āŊ‚āŊ“āŊĻāŧ‹āŊ†āŧ‹āŊ–āŊĻāž’āžąāŊ´āŊĸāŧ‹āŊ–āŊ āŊ˜āŧ‹āŊĻāŊ´āŊ–āŧ‹āŊ”āŧāŊĻāžŖāŊŧāŊ“āŧ‹āŊ”āŧ" - }, "fileToPDF": { "title": "āŊĄāŊ˛āŊ‚āŧ‹āŊ†āŧ‹āŊ“āŊĻāŧ‹ PDF āŊŖāŧ‹āŊ–āŊĻāž’āžąāŊ´āŊĸāŧ‹āŊ–āŧ", "desc": "āŊĄāŊ˛āŊ‚āŧ‹āŊ†āŧ‹āŊ•āŊŖāŧ‹āŊ†āŊēāŧ‹āŊ–āŧ‹ PDF āŊŖāŧ‹āŊ–āŊĻāž’āžąāŊ´āŊĸāŧ‹āŊāŊ´āŊ–āŧ (DOCX, PNG, XLS, PPT, TXT āŊĻāŊŧāŊ‚āŊĻāŧ)" }, - "ocr": { - "title": "OCR / āŊ–āŊ¤āŊēāŊĸāŧ‹āŊ āŊ–āŊēāŊ–āŊĻāŧ‹āŊ‚āŊ™āŊ„āŧ‹āŊĻāŊēāŊŖāŧ", - "desc": "āŊ–āŊ¤āŊēāŊĸāŧ‹āŊ āŊ–āŊēāŊ–āŊĻāŧ‹āŊ‚āŊ™āŊ„āŧ‹āŊĻāŊēāŊŖāŧ‹āŊ‘āŊ„āŧ‹ PDF āŊ“āŊ„āŧ‹āŊ‚āŊ˛āŧ‹āŊ”āŊĸāŧ‹āŊĸāŊ˛āŊĻāŧ‹āŊ“āŊĻāŧ‹āŊĄāŊ˛āŧ‹āŊ‚āŊēāŧ‹āŊ„āŊŧāŊĻāŧ‹āŊ āŊ›āŊ˛āŊ“āŧ‹āŊ–āžąāŊĻāŧ‹āŊāŊēāŧ‹āŊĄāŊ˛āŧ‹āŊ‚āŊēāŊ āŊ˛āŧ‹āŊĸāžŖāŊ˜āŧ‹āŊ”āŊĸāŧ‹āŊ–āŊĻāžāžąāŊĸāŧ‹āŊĻāžŖāŊŧāŊ“āŧ‹āŊ–āžąāŊēāŊ‘āŧ‹āŊ”āŧ" - }, - "extractImages": { - "title": "āŊ”āŊĸāŧ‹āŊĸāŊ˛āŊĻāŧ‹āŊ•āžąāŊ˛āŊĸāŧ‹āŊ āŊ‘āŊŧāŊ“āŧ", - "desc": "PDF āŊ“āŊĻāŧ‹āŊ”āŊĸāŧ‹āŊĸāŊ˛āŊĻāŧ‹āŊšāŊ„āŧ‹āŊ˜āŧ‹āŊ•āžąāŊ˛āŊĸāŧ‹āŊ–āŊāŊŧāŊ“āŧ‹āŊ“āŊĻāŧ‹ zip āŊ“āŊ„āŧ‹āŊ‰āŊĸāŧ‹āŊšāŊ‚āŊĻāŧ‹āŊ–āžąāŊēāŊ‘āŧ‹āŊ”āŧ" - }, "pdfToPDFA": { "title": "PDF āŊ“āŊĻāŧ‹ PDF/A āŊŖāŧ", "desc": "PDF āŊ“āŊĻāŧ‹āŊ‘āŊ´āŊĻāŧ‹āŊĄāŊ´āŊ“āŧ‹āŊĸāŊ˛āŊ„āŧ‹āŊ”āŊŧāŊ āŊ˛āŧ‹āŊ‰āŊĸāŧ‹āŊšāŊ‚āŊĻāŧ‹āŊ†āŊēāŊ‘āŧ‹ PDF/A āŊŖāŧ‹āŊ–āŊĻāž’āžąāŊ´āŊĸāŧ‹āŊ–āŧ" @@ -435,70 +826,14 @@ "title": "āŊ–āŊ¤āŊēāŊĸāŧ‹āŊ”āŊĸāŧ‹āŊ„āŊŧāŊĻāŧ‹āŊ āŊ›āŊ˛āŊ“āŧ‹/āŊāŧ‹āŊ‚āžąāŊēāŊĻāŧ", "desc": "āŊ”āŊĸāŧ‹āŊĸāŊ˛āŊĻāŧ‹/PDF āŊ“āŊ„āŧ‹āŊ‚āŊ˛āŧ‹āŊ”āŊĸāŧ‹āŊ˜āŊ„āŧ‹āŊ”āŊŧāŧ‹āŊāŧ‹āŊ‚āžąāŊēāŊĻāŧ‹āŊ–āžąāŊēāŊ‘āŧ‹āŊ”āŧ" }, - "sign": { - "title": "āŊ˜āŊ˛āŊ„āŧ‹āŊĸāžŸāŊ‚āŊĻāŧ", - "desc": "āŊĸāŊ˛āŧ‹āŊ˜āŊŧāŧ āŊĄāŊ˛āŧ‹āŊ‚āŊēāŧ āŊ”āŊĸāŧ‹āŊĸāŊ˛āŊĻāŧ‹āŊ–āŊ…āŊĻāŧ‹āŊ€āžąāŊ˛āŧ‹āŊĻāž’āŊŧāŧ‹āŊ“āŊĻāŧ‹ PDF āŊŖāŧ‹āŊ˜āŊ˛āŊ„āŧ‹āŊĸāžŸāŊ‚āŊĻāŧ‹āŊĻāžŖāŊŧāŊ“āŧ‹āŊ”āŧ" - }, - "flatten": { - "title": "āŊĻāž™āŊŧāŊ˜āŊĻāŧ‹āŊ”āŧ", - "desc": "PDF āŊ“āŊĻāŧ‹āŊĻāž¤āžąāŊŧāŊ‘āŧ‹āŊĻāž’āŊŧāŧ‹āŊ…āŊ“āŧ‹āŊ‚āžąāŊ˛āŧ‹āŊ†āŧ‹āŊ¤āŊĻāŧ‹āŊ‘āŊ„āŧ‹āŊ āŊ‚āŊēāŊ„āŊĻāŧ‹āŊ¤āŊŧāŊ‚āŧ‹āŊšāŊ„āŧ‹āŊ˜āŧ‹āŊĻāŊ´āŊ–āŧ‹āŊ”āŧ" - }, - "repair": { - "title": "āŊ–āŊŸāŊŧāŧ‹āŊ–āŊ…āŊŧāŊĻāŧ", - "desc": "āŊĻāžāžąāŊŧāŊ“āŧ‹āŊ¤āŊŧāŊĸāŧ‹āŊ–āŊ āŊ˜āŧ‹āŊ‚āŊāŊŧāŊĸāŧ‹āŊ–āŊ¤āŊ˛āŊ‚āŧ‹āŊāŊēāŊ–āŊĻāŧ‹āŊ”āŊ āŊ˛āŧ‹ PDF āŊ–āŊŸāŊŧāŧ‹āŊ–āŊ…āŊŧāŊĻāŧ‹āŊ–āžąāŊēāŊ‘āŧ‹āŊāŊ–āŊĻāŧ‹āŊ–āžąāŊēāŊ‘āŧ‹āŊ”āŧ" - }, - "removeBlanks": { - "title": "āŊĻāžŸāŊŧāŊ„āŧ‹āŊ¤āŊŧāŊ‚āŧ‹āŊĻāŊ´āŊ–āŧ‹āŊ”āŧ", - "desc": "PDF āŊ“āŊ„āŧ‹āŊ‚āŊ˛āŧ‹āŊĻāžŸāŊŧāŊ„āŧ‹āŊ¤āŊŧāŊ‚āŧ‹āŊĸāŊ„āŧ‹āŊ āŊ‚āŊ´āŊŖāŧ‹āŊ„āŊŧāŊĻāŧ‹āŊ āŊ›āŊ˛āŊ“āŧ‹āŊ‘āŊ„āŧ‹āŊĻāŊ´āŊ–āŧ‹āŊ”āŧ" - }, - "removeAnnotations": { - "title": "āŊ˜āŊ†āŊ“āŧ‹āŊ āŊ‚āž˛āŊēāŊŖāŧ‹āŊĻāŊ´āŊ–āŧ‹āŊ”āŧ", - "desc": "PDF āŊ“āŊ„āŧ‹āŊ‚āŊ˛āŧ‹āŊ˜āŊ†āŊ“āŧ‹āŊ āŊ‚āž˛āŊēāŊŖāŧ‹āŊšāŊ„āŧ‹āŊ˜āŧ‹āŊĻāŊ´āŊ–āŧ‹āŊ”āŧ" - }, - "compare": { - "title": "PDF āŊ–āŊĻāžĄāŊ´āŊĸāŧ‹āŊ–āŧ", - "desc": "PDF āŊĄāŊ˛āŊ‚āŧ‹āŊ†āŧ‹āŊ‚āŊ‰āŊ˛āŊĻāŧ‹āŊ€āžąāŊ˛āŧ‹āŊāžąāŊ‘āŧ‹āŊ”āŊĸāŧ‹āŊ–āŊĻāžĄāŊ´āŊĸāŧ‹āŊ–āŧ" - }, - "certSign": { - "title": "āŊŖāŊ‚āŧ‹āŊāžąāŊēāŊĸāŧ‹āŊ˜āŊ˛āŊ„āŧ‹āŊĸāžŸāŊ‚āŊĻāŧ", - "desc": "āŊŖāŊ‚āŧ‹āŊāžąāŊēāŊĸāŧ‹/āŊŖāžĄāŊēāŧ‹āŊ˜āŊ˛āŊ‚āŧ‹ (PEM/P12) āŊ‚āžąāŊ˛āŊĻāŧ‹ PDF āŊŖāŧ‹āŊ˜āŊ˛āŊ„āŧ‹āŊĸāžŸāŊ‚āŊĻāŧ‹āŊĸāž’āžąāŊ‚āŧ‹āŊ”āŧ" - }, - "removeCertSign": { - "title": "āŊŖāŊ‚āŧ‹āŊāžąāŊēāŊĸāŧ‹āŊ˜āŊ˛āŊ„āŧ‹āŊĸāžŸāŊ‚āŊĻāŧ‹āŊĻāŊ´āŊ–āŧ‹āŊ”āŧ", - "desc": "PDF āŊ“āŊĻāŧ‹āŊŖāŊ‚āŧ‹āŊāžąāŊēāŊĸāŧ‹āŊ˜āŊ˛āŊ„āŧ‹āŊĸāžŸāŊ‚āŊĻāŧ‹āŊĻāŊ´āŊ–āŧ‹āŊ”āŧ" - }, - "pageLayout": { - "title": "āŊ¤āŊŧāŊ‚āŧ‹āŊ„āŊŧāŊĻāŧ‹āŊ˜āŊ„āŧ‹āŊ”āŊŧāŊ āŊ˛āŧ‹āŊ–āŊ€āŊŧāŊ‘āŧ‹āŊ”āŧ", - "desc": "PDF āŊĄāŊ˛āŊ‚āŧ‹āŊ†āŊ āŊ˛āŧ‹āŊ¤āŊŧāŊ‚āŧ‹āŊ„āŊŧāŊĻāŧ‹āŊ˜āŊ„āŧ‹āŊ”āŊŧāŧ‹āŊ¤āŊŧāŊ‚āŧ‹āŊ„āŊŧāŊĻāŧ‹āŊ‚āŊ…āŊ˛āŊ‚āŧ‹āŊāŊ´āŧ‹āŊĻāžĄāŊēāŊ–āŧ‹āŊĻāžĻāžąāŊŧāŊĸāŧ‹āŊ–āžąāŊēāŊ‘āŧ‹āŊ”āŧ" - }, - "scalePages": { - "title": "āŊ¤āŊŧāŊ‚āŧ‹āŊ„āŊŧāŊĻāŧ‹āŊ†āŊēāŧ‹āŊ†āŊ´āŊ„āŧ‹/āŊšāŊ‘āŧ‹āŊĻāž’āž˛āŊ˛āŊ‚āŧ‹āŊ”āŧ", - "desc": "āŊ¤āŊŧāŊ‚āŧ‹āŊ„āŊŧāŊĻāŧ‹āŊ‘āŊ„āŧ‹/āŊĄāŊ„āŧ‹āŊ“āŧ‹āŊ‘āŊēāŊ āŊ˛āŧ‹āŊ“āŊ„āŧ‹āŊ‘āŊŧāŊ“āŧ‹āŊ‚āžąāŊ˛āŧ‹āŊ†āŊēāŧ‹āŊ†āŊ´āŊ„āŧ‹/āŊšāŊ‘āŧ‹āŊ–āŊĻāž’āžąāŊ´āŊĸāŧ‹āŊ–āŧ" - }, "pipeline": { "title": "āŊ–āŊĸāž’āžąāŊ´āŊ‘āŧ‹āŊĸāŊ˛āŊ˜āŧ", "desc": "āŊ–āŊĸāž’āžąāŊ´āŊ‘āŧ‹āŊĸāŊ˛āŊ˜āŧ‹āŊ āŊāž˛āŊ–āŧ‹āŊ‚āŊžāŊ´āŊ„āŧ‹āŊ–āŊŸāŊŧāŊĻāŧ‹āŊ“āŊĻāŧ‹ PDF āŊŖāŧ‹āŊ–āžąāŧ‹āŊ–āŧ‹āŊ˜āŊ„āŧ‹āŊ”āŊŧāŧ‹āŊ āŊāŊŧāŊĸāŧ‹āŊĻāžāžąāŊŧāŊ‘āŧ‹āŊ–āžąāŊēāŊ‘āŧ‹āŊ”āŧ" }, - "addPageNumbers": { - "title": "āŊ¤āŊŧāŊ‚āŧ‹āŊ‚āž˛āŊ„āŊĻāŧ‹āŊĻāžŖāŊŧāŊ“āŧ‹āŊ”āŧ", - "desc": "āŊĄāŊ˛āŊ‚āŧ‹āŊ†āŊ āŊ˛āŧ‹āŊ“āŊ„āŧ‹āŊ‚āŊ“āŊĻāŧ‹āŊĻāŧ‹āŊ„āŊēāŊĻāŧ‹āŊ…āŊ“āŧ‹āŊ‘āŊ´āŧ‹āŊ¤āŊŧāŊ‚āŧ‹āŊ‚āž˛āŊ„āŊĻāŧ‹āŊĻāžŖāŊŧāŊ“āŧ‹āŊ”āŧ" - }, "auto-rename": { "title": "PDF āŊĄāŊ˛āŊ‚āŧ‹āŊ†āŊ āŊ˛āŧ‹āŊ˜āŊ˛āŊ„āŧ‹āŊĸāŊ„āŧ‹āŊ āŊ‚āŊ´āŊŖāŧ‹āŊ–āŊĻāžāžąāŊĸāŧ‹āŊ āŊ‘āŊŧāŊ‚āŊĻāŧ", "desc": "āŊ„āŊŧāŊĻāŧ‹āŊ āŊ›āŊ˛āŊ“āŧ‹āŊ–āžąāŊĻāŧ‹āŊ”āŊ āŊ˛āŧ‹āŊ āŊ‚āŊŧāŧ‹āŊ–āŊĸāž—āŊŧāŊ‘āŧ‹āŊŖāŧ‹āŊ‚āŊžāŊ˛āŊ‚āŊĻāŧ‹āŊ“āŊĻāŧ‹ PDF āŊĄāŊ˛āŊ‚āŧ‹āŊ†āŊ āŊ˛āŧ‹āŊ˜āŊ˛āŊ„āŧ‹āŊĸāŊ„āŧ‹āŊ āŊ‚āŊ´āŊŖāŧ‹āŊ–āŊĻāžāžąāŊĸāŧ‹āŊ āŊ‘āŊŧāŊ‚āŊĻāŧ‹āŊ–āžąāŊēāŊ‘āŧ‹āŊ”āŧ" }, - "adjustContrast": { - "title": "āŊšāŊŧāŊĻāŧ‹āŊ‚āŊžāŊ˛āŧ‹/āŊ āŊŧāŊ‘āŧ‹āŊāžąāŊ‘āŧ‹āŊĻāž™āŊŧāŊ˜āŧ‹āŊĻāž’āž˛āŊ˛āŊ‚", - "desc": "PDF āŊĄāŊ˛āŧ‹āŊ āŊŧāŊ‘āŧ‹āŊāžąāŊ‘āŧ āŊšāŊŧāŊĻāŧ‹āŊŸāŊ˛āŊŖāŧ āŊ‘āŊ„āŧ‹āŊ‚āŊĻāŊŖāŧ‹āŊšāŊ‘āŧ‹āŊĻāž™āŊŧāŊ˜āŧ‹āŊĻāž’āž˛āŊ˛āŊ‚āŧ‹āŊ–āžąāŊēāŊ‘āŧ‹āŊ”āŧ" - }, - "crop": { - "title": "PDF āŊ‚āŊāŊ´āŊ–āŧ‹āŊ‚āŊ…āŊŧāŊ‘āŧ", - "desc": "āŊ†āŊēāŧ‹āŊ†āŊ´āŊ„āŧ‹āŊ†āŊ´āŊ„āŧ‹āŊ‘āŊ´āŧ‹āŊ‚āŊāŊŧāŊ„āŧ‹āŊ†āŊēāŊ‘āŧ‹ PDF āŊ‚āŊāŊ´āŊ–āŧ‹āŊ‚āŊ…āŊŧāŊ‘āŧ‹āŊ–āžąāŊēāŊ‘āŧ‹āŊ”āŧ (āŊĄāŊ˛āŧ‹āŊ‚āŊēāŧ‹āŊĸāžŖāŊ˜āŊĻāŧ‹āŊĻāž˛āŊ´āŊ„āŧ‹āŊĻāžāžąāŊŧāŊ–āŧ‹āŊ–āžąāŊēāŊ‘āŧ‹āŊāŊ´āŊ–āŧ)" - }, - "autoSplitPDF": { - "title": "āŊ¤āŊŧāŊ‚āŧ‹āŊ„āŊŧāŊĻāŧ‹āŊĸāŊ„āŧ‹āŊ āŊ‚āŊ´āŊŖāŧ‹āŊāŧ‹āŊ‚āžąāŊēāŊĻāŧ", - "desc": "āŊ–āŊ¤āŊēāŊĸāŧ‹āŊ āŊ–āŊēāŊ–āŊĻāŧ‹āŊ–āžąāŊĻāŧ‹āŊ”āŊ āŊ˛āŧ‹ PDF āŊ“āŊ„āŧ‹āŊ‚āŊ˛āŧ‹āŊ‘āŊ„āŊŧāŊĻāŧ‹āŊĄāŊŧāŊ‘āŧ‹āŊ–āŊ¤āŊēāŊĸāŧ‹āŊ āŊ–āŊēāŊ–āŊĻāŧ‹āŊ¤āŊŧāŊ‚āŧ‹āŊ„āŊŧāŊĻāŧ‹āŊāŧ‹āŊ‚āžąāŊēāŊĻāŧ‹ QR Code āŊ–āŊēāŊ‘āŧ‹āŊĻāž¤āžąāŊŧāŊ‘āŧ‹āŊ–āžąāŊĻāŧ‹āŊ“āŊĻāŧ‹āŊĸāŊ„āŧ‹āŊ āŊ‚āŊ´āŊŖāŧ‹āŊāŧ‹āŊ‚āžąāŊēāŊĻāŧ‹āŊ–āžąāŊēāŊ‘āŧ‹āŊ”āŧ" - }, "sanitizePDF": { "title": "āŊ‚āŊ™āŊ„āŧ‹āŊĻāŊēāŊŖāŧ", "desc": "PDF āŊĄāŊ˛āŊ‚āŧ‹āŊ†āŧ‹āŊ“āŊĻāŧ‹āŊ āŊāž˛āŊ–āŧ‹āŊ‚āŊžāŊ´āŊ„āŧ‹āŊ‘āŊ„āŧ‹āŊ†āŧ‹āŊ¤āŊĻāŧ‹āŊ‚āŊžāŊ“āŧ‹āŊ‘āŊ‚āŧ‹āŊĻāŊ´āŊ–āŧ‹āŊ”āŧ" @@ -519,30 +854,14 @@ "title": "PDF to Markdown", "desc": "Converts any PDF to Markdown" }, - "getPdfInfo": { - "title": "PDF āŊĄāŊ˛āŧ‹āŊ‚āŊ“āŊĻāŧ‹āŊšāŊ´āŊŖāŧ‹āŊ†āŧ‹āŊšāŊ„āŧ‹āŊŖāŊēāŊ“āŧ‹āŊ”āŧ", - "desc": "PDF āŊĄāŊ˛āŧ‹āŊ‚āŊ“āŊĻāŧ‹āŊšāŊ´āŊŖāŧ‹āŊĄāŊŧāŊ‘āŧ‹āŊšāŊ‘āŧ‹āŊŖāŊēāŊ“āŧ‹āŊ”āŧ" - }, "pageExtracter": { "title": "āŊ¤āŊŧāŊ‚āŧ‹āŊ„āŊŧāŊĻāŧ‹āŊ•āžąāŊ˛āŊĸāŧ‹āŊ āŊ‘āŊŧāŊ“āŧ", "desc": "PDF āŊ“āŊĻāŧ‹āŊ āŊ‘āŊēāŊ˜āŊĻāŧ‹āŊĻāž’āž˛āŊ´āŊ‚āŧ‹āŊ–āžąāŊĻāŧ‹āŊ”āŊ āŊ˛āŧ‹āŊ¤āŊŧāŊ‚āŧ‹āŊ„āŊŧāŊĻāŧ‹āŊĸāžŖāŊ˜āŊĻāŧ‹āŊ•āžąāŊ˛āŊĸāŧ‹āŊ āŊ‘āŊŧāŊ“āŧ‹āŊ”āŧ" }, - "pdfToSinglePage": { - "title": "PDF āŊ“āŊĻāŧ‹āŊ¤āŊŧāŊ‚āŧ‹āŊ„āŊŧāŊĻāŧ‹āŊ†āŊēāŊ“āŧ‹āŊ”āŊŧāŧ‹āŊ‚āŊ…āŊ˛āŊ‚āŧ‹āŊŖāŧ", - "desc": "PDF āŊĄāŊ˛āŧ‹āŊ¤āŊŧāŊ‚āŧ‹āŊ„āŊŧāŊĻāŧ‹āŊšāŊ„āŧ‹āŊ˜āŧ‹āŊ¤āŊŧāŊ‚āŧ‹āŊ„āŊŧāŊĻāŧ‹āŊ†āŊēāŊ“āŧ‹āŊ”āŊŧāŧ‹āŊ‚āŊ…āŊ˛āŊ‚āŧ‹āŊāŊ´āŧ‹āŊĻāžĄāŊēāŊ–āŧ‹āŊĻāžĻāžąāŊŧāŊĸāŧ‹āŊ–āžąāŊēāŊ‘āŧ‹āŊ”āŧ" - }, - "showJS": { - "title": "Javascript āŊĻāžŸāŊŧāŊ“āŧ‹āŊ”āŧ", - "desc": "PDF āŊ“āŊ„āŧ‹āŊ‘āŊ´āŧ‹āŊ–āŊ…āŊ´āŊ‚āŧ‹āŊ”āŊ āŊ˛āŧ‹ JS āŊ‚āŊ„āŧ‹āŊĄāŊŧāŊ‘āŧ‹āŊ āŊšāŊŧāŊŖāŧ‹āŊžāŊ˛āŊ–āŧ‹āŊ‘āŊ„āŧ‹āŊ˜āŊ„āŊŧāŊ“āŧ‹āŊĻāžŸāŊŧāŊ“āŧ‹āŊ–āžąāŊēāŊ‘āŧ‹āŊ”āŧ" - }, "autoRedact": { "title": "āŊĸāŊ„āŧ‹āŊ āŊ‚āŊ´āŊŖāŧ‹āŊĻāž’āž˛āŊ˛āŊ–āŧ‹āŊĻāž˛āŊ´āŊ„āŧ‹āŧ", "desc": "āŊ āŊ‡āŊ´āŊ‚āŧ‹āŊ”āŊ āŊ˛āŧ‹āŊĄāŊ˛āŧ‹āŊ‚āŊēāŧ‹āŊ‚āŊžāŊ˛āŊĸāŧ‹āŊ–āŊŸāŊ´āŊ„āŧ‹āŊ“āŊĻāŧ‹ PDF āŊ“āŊ„āŧ‹āŊ‚āŊ˛āŧ‹āŊĄāŊ˛āŧ‹āŊ‚āŊēāŧ‹āŊĸāžŖāŊ˜āŊĻāŧ‹āŊĸāŊ„āŧ‹āŊ āŊ‚āŊ´āŊŖāŧ‹āŊ‚āžąāŊ˛āŊĻāŧ‹āŊĻāž’āž˛āŊ˛āŊ–āŧ‹āŊ”āŧ" }, - "redact": { - "title": "āŊŖāŊ‚āŧ‹āŊ–āŊŸāŊŧāŊĻāŧ‹āŊĻāž’āž˛āŊ˛āŊ–āŧ‹āŊĻāž˛āŊ´āŊ„āŧ‹āŧ", - "desc": "āŊ āŊ‘āŊēāŊ˜āŊĻāŧ‹āŊĻāž’āž˛āŊ´āŊ‚āŧ‹āŊ–āžąāŊĻāŧ‹āŊ”āŊ āŊ˛āŧ‹āŊĄāŊ˛āŧ‹āŊ‚āŊēāŧ āŊ–āž˛āŊ˛āŊĻāŧ‹āŊ”āŊ āŊ˛āŧ‹āŊ‘āŊ–āžąāŊ˛āŊ–āŊĻāŧ āŊ‘āŊ„āŧ‹/āŊĄāŊ„āŧ‹āŊ“āŧ‹āŊ āŊ‘āŊēāŊ˜āŊĻāŧ‹āŊĻāž’āž˛āŊ´āŊ‚āŧ‹āŊ–āžąāŊĻāŧ‹āŊ”āŊ āŊ˛āŧ‹āŊ¤āŊŧāŊ‚āŧ‹āŊ„āŊŧāŊĻāŧ‹āŊ‚āŊžāŊ˛āŊĸāŧ‹āŊ–āŊŸāŊ´āŊ„āŧ‹āŊ“āŊĻāŧ‹ PDF āŊĻāž’āž˛āŊ˛āŊ–āŧ‹āŊĻāž˛āŊ´āŊ„āŧ‹āŊ–āžąāŊēāŊ‘āŧ‹āŊ”āŧ" - }, "PDFToCSV": { "title": "PDF āŊ“āŊĻāŧ‹ CSV āŊŖāŧ", "desc": "PDF āŊ“āŊĻāŧ‹āŊĸāŊēāŊ āŊ´āŧ‹āŊ˜āŊ˛āŊ‚āŧ‹āŊĸāžŖāŊ˜āŊĻāŧ‹ CSV āŊŖāŧ‹āŊ•āžąāŊ˛āŊĸāŧ‹āŊ āŊ‘āŊŧāŊ“āŧ‹āŊ”āŧ" @@ -551,10 +870,6 @@ "title": "āŊ†āŊēāŧ‹āŊ†āŊ´āŊ„āŧ‹/āŊ‚āž˛āŊ„āŊĻāŧ‹āŊ€āŧ‹āŊŖāžŸāŊĸāŧ‹āŊĸāŊ„āŧ‹āŊ āŊ‚āŊ´āŊŖāŧ‹āŊāŧ‹āŊ‚āžąāŊēāŊĻāŧ", "desc": "PDF āŊ‚āŊ…āŊ˛āŊ‚āŧ‹āŊ“āŊĻāŧ‹āŊĄāŊ˛āŊ‚āŧ‹āŊ†āŧ‹āŊ˜āŊ„āŧ‹āŊ”āŊŧāŊĸāŧ‹āŊ†āŊēāŧ‹āŊ†āŊ´āŊ„āŧ‹āŧ āŊ¤āŊŧāŊ‚āŧ‹āŊ‚āž˛āŊ„āŊĻāŧ āŊĄāŊ„āŧ‹āŊ“āŧ‹āŊĄāŊ˛āŊ‚āŧ‹āŊ†āŊ āŊ˛āŧ‹āŊ‚āž˛āŊ„āŊĻāŧ‹āŊ€āŧ‹āŊ‚āŊžāŊ˛āŊĸāŧ‹āŊ–āŊŸāŊ´āŊ„āŧ‹āŊ“āŊĻāŧ‹āŊāŧ‹āŊ‚āžąāŊēāŊĻāŧ‹āŊ–āžąāŊēāŊ‘āŧ‹āŊ”āŧ" }, - "overlay-pdfs": { - "title": "PDF āŊĻāžŸāŊēāŊ„āŧ‹āŊ–āŊĸāžŠāŊēāŊ‚āŊĻāŧ", - "desc": "PDF āŊ‚āŊžāŊ“āŧ‹āŊžāŊ˛āŊ‚āŧ‹āŊ‚āŊ˛āŧ‹āŊĻāžŸāŊēāŊ„āŧ‹āŊ‘āŊ´āŧ‹ PDF āŊ–āŊĸāžŠāŊēāŊ‚āŊĻāŧ‹āŊ”āŧ" - }, "split-by-sections": { "title": "āŊ‘āŊ´āŊ˜āŧ‹āŊ–āŊ´āŧ‹āŊŖāžŸāŊĸāŧ‹ PDF āŊāŧ‹āŊ‚āžąāŊēāŊĻāŧ", "desc": "PDF āŊĄāŊ˛āŧ‹āŊ¤āŊŧāŊ‚āŧ‹āŊ„āŊŧāŊĻāŧ‹āŊĸāŊēāŧ‹āŊĸāŊēāŧ‹āŊ‚āŊžāŊ´āŊ„āŧ‹āŊ‘āŊ„āŧ‹āŊ āŊ•āž˛āŊēāŊ‘āŧ‹āŊ€āžąāŊ˛āŧ‹āŊ‘āŊ´āŊ˜āŧ‹āŊ–āŊ´āŧ‹āŊ†āŊ´āŊ„āŧ‹āŊ†āŊ´āŊ„āŧ‹āŊ‘āŊ´āŧ‹āŊ–āŊ‚āŊŧāŧ‹āŊ–āŧ" @@ -563,23 +878,15 @@ "title": "PDF āŊŖāŧ‹āŊāŊēāŊŖāŧ‹āŊ™āŊēāŧ‹āŊĻāžŖāŊŧāŊ“āŧ‹āŊ”āŧ", "desc": "āŊ‚āŊ“āŊĻāŧ‹āŊĻāŧ‹āŊ„āŊēāŊĻāŧ‹āŊ…āŊ“āŧ‹āŊ‘āŊ´āŧ‹āŊĄāŊ˛āŧ‹āŊ‚āŊēāŊ āŊ˜āŧ‹āŊ”āŊĸāŧ‹āŊĸāŊ˛āŊĻāŧ‹āŊ€āžąāŊ˛āŧ‹āŊāŊēāŊŖāŧ‹āŊ™āŊēāŧ‹āŊĻāžŖāŊŧāŊ“āŧ‹āŊ”āŧ" }, - "removeImage": { - "title": "āŊ”āŊĸāŧ‹āŊĸāŊ˛āŊĻāŧ‹āŊĻāŊ´āŊ–āŧ‹āŊ”āŧ", - "desc": "āŊĄāŊ˛āŊ‚āŧ‹āŊ†āŊ āŊ˛āŧ‹āŊ†āŊēāŧ‹āŊ†āŊ´āŊ„āŧ‹āŊ†āŊ´āŊ„āŧ‹āŊ‘āŊ´āŧ‹āŊ‚āŊāŊŧāŊ„āŧ‹āŊ†āŊēāŊ‘āŧ‹ PDF āŊ“āŊĻāŧ‹āŊ”āŊĸāŧ‹āŊĸāŊ˛āŊĻāŧ‹āŊĻāŊ´āŊ–āŧ‹āŊ”āŧ" - }, - "splitByChapters": { - "title": "āŊŖāŊēāŊ āŊ´āŧ‹āŊŖāžŸāŊĸāŧ‹ PDF āŊāŧ‹āŊ‚āžąāŊēāŊĻāŧ", - "desc": "PDF āŊĄāŊ˛āŧ‹āŊŖāŊēāŊ āŊ´āŊ āŊ˛āŧ‹āŊĻāž’āž˛āŊŧāŊ˜āŧ‹āŊ‚āŊžāŊ˛āŧ‹āŊ‚āŊžāŊ˛āŊĸāŧ‹āŊ–āŊŸāŊ´āŊ„āŧ‹āŊ“āŊĻāŧ‹āŊĄāŊ˛āŊ‚āŧ‹āŊ†āŧ‹āŊ˜āŊ„āŧ‹āŊ”āŊŧāŊĸāŧ‹āŊāŧ‹āŊ‚āžąāŊēāŊĻāŧ‹āŊ–āžąāŊēāŊ‘āŧ‹āŊ”āŧ" - }, - "validateSignature": { - "title": "PDF āŊ˜āŊ˛āŊ„āŧ‹āŊĸāžŸāŊ‚āŊĻāŧ‹āŊĸāŧ‹āŊĻāž¤āž˛āŊŧāŊ‘āŧ", - "desc": "PDF āŊĄāŊ˛āŊ‚āŧ‹āŊ†āŊ āŊ˛āŧ‹āŊ“āŊ„āŧ‹āŊ‚āŊ˛āŧ‹āŊ¨āŊ„āŧ‹āŊ€āŊ˛āŊ āŊ˛āŧ‹āŊ˜āŊ˛āŊ„āŧ‹āŊĸāžŸāŊ‚āŊĻāŧ‹āŊ‘āŊ„āŧ‹āŊŖāŊ‚āŧ‹āŊāžąāŊēāŊĸāŧ‹āŊĸāŧ‹āŊĻāž¤āž˛āŊŧāŊ‘āŧ‹āŊ–āžąāŊēāŊ‘āŧ‹āŊ”āŧ" - }, "replace-color": { "title": "āŊšāŊŧāŊĻāŧ‹āŊ‚āŊžāŊ˛āŊ āŊ˛āŧ‹āŊ‚āŊ‘āŊ˜āŧ‹āŊ‚āŧ‹āŊ˜āŊāŊŧāŧ‹āŊĸāŊ˛āŊ˜āŧ", "desc": "PDF āŊ“āŊ„āŧ‹āŊ‚āŊ˛āŧ‹āŊĄāŊ˛āŧ‹āŊ‚āŊēāŧ‹āŊ‘āŊ„āŧ‹āŊĸāž’āžąāŊ–āŧ‹āŊŖāž—āŊŧāŊ„āŊĻāŧ‹āŊ€āžąāŊ˛āŧ‹āŊšāŊŧāŊĻāŧ‹āŊ‚āŊžāŊ˛āŧ‹āŊ–āŊĸāž—āŊēāŧ‹āŊĻāž’āžąāŊ´āŊĸāŧ‹āŊ–āžąāŊēāŊ‘āŧ‹āŊ”āŧ‹āŊ‘āŊ„āŧ‹āŊĄāŊ˛āŊ‚āŧ‹āŊ†āŊ āŊ˛āŧ‹āŊ†āŊēāŧ‹āŊ†āŊ´āŊ„āŧ‹āŊ†āŊ´āŊ„āŧ‹āŊ‘āŊ´āŧ‹āŊ‚āŊāŊŧāŊ„āŧ‹āŊ†āŊēāŊ‘āŧ‹āŊšāŊŧāŊĻāŧ‹āŊ‚āŊžāŊ˛āŧ‹āŊĄāŊŧāŊ„āŊĻāŧ‹āŊĸāžĢāŊŧāŊ‚āŊĻāŧ‹āŊŖāžĄāŊŧāŊ‚āŧ‹āŊĻāž’āžąāŊ´āŊĸāŧ‹āŊ–āžąāŊēāŊ‘āŧ‹āŊ”āŧ" } }, + "landing": { + "addFiles": "Add Files", + "uploadFromComputer": "Upload from computer" + }, "viewPdf": { "tags": "āŊŖāžŸāŧ‹āŊ–āŧ,āŊ€āžŗāŊŧāŊ‚āŧ‹āŊ”āŧ,āŊ˜āŊ†āŊ“āŧ‹āŊ āŊ‚āž˛āŊēāŊŖāŧ,āŊĄāŊ˛āŧ‹āŊ‚āŊē,āŊ”āŊĸāŧ‹āŊĸāŊ˛āŊĻāŧ", "title": "View/Edit PDF", @@ -613,14 +920,39 @@ "merge": { "tags": "āŊĻāžĄāŊēāŊ–āŧ‹āŊĻāžĻāžąāŊŧāŊĸāŧ,āŊ¤āŊŧāŊ‚āŧ‹āŊ„āŊŧāŊĻāŧ‹āŊ–āŊ€āŊŧāŊŖāŧ‹āŊĻāž¤āžąāŊŧāŊ‘āŧ,āŊĸāž’āžąāŊ–āŧ‹āŊ„āŊŧāŊĻāŧ,āŊžāŊ–āŊĻāŧ‹āŊžāŊ´āŧ‹āŊ•āžąāŊŧāŊ‚āŊĻāŧ", "title": "āŊĻāžĄāŊēāŊ–āŧ‹āŊĻāžĻāžąāŊŧāŊĸāŧ", + "removeDigitalSignature": { + "label": "Remove digital signature in the merged file?", + "tooltip": { + "title": "Remove Digital Signature", + "description": "Digital signatures will be invalidated when merging files. Check this to remove them from the final merged PDF." + } + }, + "generateTableOfContents": { + "label": "Generate table of contents in the merged file?", + "tooltip": { + "title": "Generate Table of Contents", + "description": "Automatically creates a clickable table of contents in the merged PDF based on the original file names and page numbers." + } + }, + "submit": "āŊĻāžĄāŊēāŊ–āŧ‹āŊĻāžĻāžąāŊŧāŊĸāŧ", + "sortBy": { + "description": "Files will be merged in the order they're selected. Drag to reorder or sort below.", + "label": "Sort By", + "filename": "File Name", + "dateModified": "Date Modified", + "ascending": "Ascending", + "descending": "Descending", + "sort": "Sort" + }, + "error": { + "failed": "An error occurred while merging the PDFs." + }, "header": "Merge multiple PDFs (2+)", "sortByName": "Sort by name", "sortByDate": "āŊ‘āŊ´āŊĻāŧ‹āŊšāŊŧāŊ‘āŧ‹āŊŖāžŸāŊĸāŧ‹āŊ‚āŊŧāŧ‹āŊĸāŊ˛āŊ˜āŧ‹āŊĻāž’āž˛āŊ˛āŊ‚āŧ‹āŊ”āŧ", - "removeCertSign": "āŊĻāžĄāŊēāŊ–āŧ‹āŊĻāžĻāžąāŊŧāŊĸāŧ‹āŊ–āžąāŊĻāŧ‹āŊ”āŊ āŊ˛āŧ‹āŊĄāŊ˛āŊ‚āŧ‹āŊ†āŊ āŊ˛āŧ‹āŊ“āŊ„āŧ‹āŊ‚āŊ˛āŧ‹āŊ¨āŊ„āŧ‹āŊ€āŊ˛āŊ āŊ˛āŧ‹āŊ˜āŊ˛āŊ„āŧ‹āŊĸāžŸāŊ‚āŊĻāŧ‹āŊĻāŊ´āŊ–āŧ‹āŊ–āŊ˜āŧ", - "submit": "āŊĻāžĄāŊēāŊ–āŧ‹āŊĻāžĻāžąāŊŧāŊĸāŧ" + "removeCertSign": "āŊĻāžĄāŊēāŊ–āŧ‹āŊĻāžĻāžąāŊŧāŊĸāŧ‹āŊ–āžąāŊĻāŧ‹āŊ”āŊ āŊ˛āŧ‹āŊĄāŊ˛āŊ‚āŧ‹āŊ†āŊ āŊ˛āŧ‹āŊ“āŊ„āŧ‹āŊ‚āŊ˛āŧ‹āŊ¨āŊ„āŧ‹āŊ€āŊ˛āŊ āŊ˛āŧ‹āŊ˜āŊ˛āŊ„āŧ‹āŊĸāžŸāŊ‚āŊĻāŧ‹āŊĻāŊ´āŊ–āŧ‹āŊ–āŊ˜āŧ" }, "split": { - "tags": "āŊ¤āŊŧāŊ‚āŧ‹āŊ„āŊŧāŊĻāŧ‹āŊ–āŊ€āŊŧāŊŖāŧ‹āŊĻāž¤āžąāŊŧāŊ‘āŧ,āŊ–āŊ‚āŊŧāŧ‹āŊ–āŧ,āŊ¤āŊŧāŊ‚āŧ‹āŊ„āŊŧāŊĻāŧ‹āŊ˜āŊ„āŧ‹āŊ”āŊŧāŧ,āŊ‚āŊ…āŊŧāŊ‘āŧ‹āŊ”āŧ,āŊžāŊ–āŊĻāŧ‹āŊžāŊ´āŧ‹āŊ•āžąāŊŧāŊ‚āŊĻāŧ", "title": "PDF āŊāŧ‹āŊ‚āžąāŊēāŊĻāŧ", "header": "PDF āŊāŧ‹āŊ‚āžąāŊēāŊĻāŧ", "desc": { @@ -634,14 +966,251 @@ "8": "āŊĄāŊ˛āŊ‚āŧ‹āŊ†āŧ‹ #6: āŊ¤āŊŧāŊ‚āŧ‹āŊ„āŊŧāŊĻāŧ‹ 10" }, "splitPages": "āŊāŧ‹āŊ‚āžąāŊēāŊĻāŧ‹āŊ–āžąāŧ‹āŊĸāž’āžąāŊ´āŊ āŊ˛āŧ‹āŊ¤āŊŧāŊ‚āŧ‹āŊ„āŊŧāŊĻāŧ‹āŊ āŊ‡āŊ´āŊ‚āŧ‹āŊ”āŧ", - "submit": "āŊāŧ‹āŊ‚āžąāŊēāŊĻāŧ" + "submit": "āŊāŧ‹āŊ‚āžąāŊēāŊĻāŧ", + "steps": { + "chooseMethod": "Choose Method", + "settings": "Settings" + }, + "settings": { + "selectMethodFirst": "Please select a split method first" + }, + "error": { + "failed": "An error occurred while splitting the PDF." + }, + "method": { + "label": "Choose split method", + "placeholder": "Select how to split the PDF" + }, + "methods": { + "prefix": { + "splitAt": "Split at", + "splitBy": "Split by" + }, + "byPages": { + "name": "Page Numbers", + "desc": "Extract specific pages (1,3,5-10)", + "tooltip": "Enter page numbers separated by commas or ranges with hyphens" + }, + "bySections": { + "name": "Sections", + "desc": "Divide pages into grid sections", + "tooltip": "Split each page into horizontal and vertical sections" + }, + "bySize": { + "name": "File Size", + "desc": "Limit maximum file size", + "tooltip": "Specify maximum file size (e.g. 10MB, 500KB)" + }, + "byPageCount": { + "name": "Page Count", + "desc": "Fixed pages per file", + "tooltip": "Enter the number of pages for each split file" + }, + "byDocCount": { + "name": "Document Count", + "desc": "Create specific number of files", + "tooltip": "Enter how many files you want to create" + }, + "byChapters": { + "name": "Chapters", + "desc": "Split at bookmark boundaries", + "tooltip": "Uses PDF bookmarks to determine split points" + }, + "byPageDivider": { + "name": "Page Divider", + "desc": "Auto-split with divider sheets", + "tooltip": "Use QR code divider sheets between documents when scanning" + } + }, + "value": { + "fileSize": { + "label": "File Size", + "placeholder": "e.g. 10MB, 500KB" + }, + "pageCount": { + "label": "Pages per File", + "placeholder": "e.g. 5, 10" + }, + "docCount": { + "label": "Number of Files", + "placeholder": "e.g. 3, 5" + } + }, + "tooltip": { + "header": { + "title": "Split Methods Overview" + }, + "byPages": { + "title": "Split at Page Numbers", + "text": "Split your PDF at specific page numbers. Using 'n' splits after page n. Using 'n-m' splits before page n and after page m.", + "bullet1": "Single split points: 3,7 (splits after pages 3 and 7)", + "bullet2": "Range split points: 3-8 (splits before page 3 and after page 8)", + "bullet3": "Mixed: 2,5-10,15 (splits after page 2, before page 5, after page 10, and after page 15)" + }, + "bySections": { + "title": "Split by Grid Sections", + "text": "Divide each page into a grid of sections. Useful for splitting documents with multiple columns or extracting specific areas.", + "bullet1": "Horizontal: Number of rows to create", + "bullet2": "Vertical: Number of columns to create", + "bullet3": "Merge: Combine all sections into one PDF" + }, + "bySize": { + "title": "Split by File Size", + "text": "Create multiple PDFs that don't exceed a specified file size. Ideal for file size limitations or email attachments.", + "bullet1": "Use MB for larger files (e.g., 10MB)", + "bullet2": "Use KB for smaller files (e.g., 500KB)", + "bullet3": "System will split at page boundaries" + }, + "byCount": { + "title": "Split by Count", + "text": "Create multiple PDFs with a specific number of pages or documents each.", + "bullet1": "Page Count: Fixed number of pages per file", + "bullet2": "Document Count: Fixed number of output files", + "bullet3": "Useful for batch processing workflows" + }, + "byChapters": { + "title": "Split by Chapters", + "text": "Use PDF bookmarks to automatically split at chapter boundaries. Requires PDFs with bookmark structure.", + "bullet1": "Bookmark Level: Which level to split on (1=top level)", + "bullet2": "Include Metadata: Preserve document properties", + "bullet3": "Allow Duplicates: Handle repeated bookmark names" + }, + "byDocCount": { + "bullet1": "Enter the number of output files you want", + "bullet2": "Pages are distributed as evenly as possible", + "bullet3": "Useful when you need a specific number of files", + "text": "Create a specific number of output files by evenly distributing pages across them.", + "title": "Split by Document Count" + }, + "byPageCount": { + "bullet1": "Enter the number of pages per output file", + "bullet2": "Last file may have fewer pages if not evenly divisible", + "bullet3": "Useful for batch processing workflows", + "text": "Create multiple PDFs with a specific number of pages each. Perfect for creating uniform document chunks.", + "title": "Split by Page Count" + }, + "byPageDivider": { + "bullet1": "Print divider sheets from the download link", + "bullet2": "Insert divider sheets between your documents", + "bullet3": "Scan all documents together as one PDF", + "bullet4": "Upload - divider pages are automatically detected and removed", + "bullet5": "Enable Duplex Mode if scanning both sides of divider sheets", + "text": "Automatically split scanned documents using physical divider sheets with QR codes. Perfect for processing multiple documents scanned together.", + "title": "Split by Page Divider" + } + }, + "methodSelection": { + "tooltip": { + "bullet1": "Click on a method card to select it", + "bullet2": "Hover over each card to see a quick description", + "bullet3": "The settings step will appear after you select a method", + "bullet4": "You can change methods at any time before processing", + "header": { + "text": "Choose how you want to split your PDF document. Each method is optimized for different use cases and document types.", + "title": "Split Method Selection" + }, + "title": "Choose Your Split Method" + } + }, + "selectMethod": "Select a split method", + "tags": "āŊ¤āŊŧāŊ‚āŧ‹āŊ„āŊŧāŊĻāŧ‹āŊ–āŊ€āŊŧāŊŖāŧ‹āŊĻāž¤āžąāŊŧāŊ‘āŧ,āŊ–āŊ‚āŊŧāŧ‹āŊ–āŧ,āŊ¤āŊŧāŊ‚āŧ‹āŊ„āŊŧāŊĻāŧ‹āŊ˜āŊ„āŧ‹āŊ”āŊŧāŧ,āŊ‚āŊ…āŊŧāŊ‘āŧ‹āŊ”āŧ,āŊžāŊ–āŊĻāŧ‹āŊžāŊ´āŧ‹āŊ•āžąāŊŧāŊ‚āŊĻāŧ" }, "rotate": { - "tags": "āŊžāŊ–āŊĻāŧ‹āŊžāŊ´āŧ‹āŊ•āžąāŊŧāŊ‚āŊĻāŧ", "title": "Rotate PDF", + "submit": "āŊ āŊāŊŧāŊĸāŧ‹āŊĻāžāžąāŊŧāŊ‘āŧ", + "selectRotation": "Select Rotation Angle (Clockwise)", + "error": { + "failed": "An error occurred while rotating the PDF." + }, + "preview": { + "title": "Rotation Preview" + }, + "rotateLeft": "Rotate Anticlockwise", + "rotateRight": "Rotate Clockwise", + "tooltip": { + "header": { + "title": "Rotate Settings Overview" + }, + "description": { + "text": "Rotate your PDF pages clockwise or anticlockwise in 90-degree increments. All pages in the PDF will be rotated. The preview shows how your document will look after rotation." + }, + "controls": { + "title": "Controls", + "text": "Use the rotation buttons to adjust orientation. Left button rotates anticlockwise, right button rotates clockwise. Each click rotates by 90 degrees." + } + }, + "tags": "āŊžāŊ–āŊĻāŧ‹āŊžāŊ´āŧ‹āŊ•āžąāŊŧāŊ‚āŊĻāŧ", "header": "PDF āŊ āŊāŊŧāŊĸāŧ‹āŊĻāžāžąāŊŧāŊ‘āŧ", - "selectAngle": "āŊ āŊāŊŧāŊĸāŧ‹āŊĻāžāžąāŊŧāŊ‘āŧ‹āŊ€āžąāŊ˛āŧ‹āŊŸāŊ´āŊĸāŧ‹āŊšāŊ‘āŧ‹āŊ āŊ‘āŊēāŊ˜āŊĻāŧ‹āŊ”āŧ (āŊŸāŊ´āŊĸāŧ‹āŊšāŊ‘āŧ‹ 90 āŊĄāŊ˛āŧ‹āŊĻāž’āžąāŊ´āŊĸāŧ‹āŊāŊŧāŊ–āŧ‹āŊ“āŊ„āŧ‹āŊ‘āŊ´āŧ)", - "submit": "āŊ āŊāŊŧāŊĸāŧ‹āŊĻāžāžąāŊŧāŊ‘āŧ" + "selectAngle": "āŊ āŊāŊŧāŊĸāŧ‹āŊĻāžāžąāŊŧāŊ‘āŧ‹āŊ€āžąāŊ˛āŧ‹āŊŸāŊ´āŊĸāŧ‹āŊšāŊ‘āŧ‹āŊ āŊ‘āŊēāŊ˜āŊĻāŧ‹āŊ”āŧ (āŊŸāŊ´āŊĸāŧ‹āŊšāŊ‘āŧ‹ 90 āŊĄāŊ˛āŧ‹āŊĻāž’āžąāŊ´āŊĸāŧ‹āŊāŊŧāŊ–āŧ‹āŊ“āŊ„āŧ‹āŊ‘āŊ´āŧ)" + }, + "convert": { + "title": "Convert", + "desc": "Convert files between different formats", + "files": "Files", + "selectFilesPlaceholder": "Select files in the main view to get started", + "settings": "Settings", + "conversionCompleted": "Conversion completed", + "results": "Results", + "defaultFilename": "converted_file", + "conversionResults": "Conversion Results", + "convertFrom": "Convert from", + "convertTo": "Convert to", + "sourceFormatPlaceholder": "Source format", + "targetFormatPlaceholder": "Target format", + "selectSourceFormatFirst": "Select a source format first", + "outputOptions": "Output Options", + "pdfOptions": "PDF Options", + "imageOptions": "Image Options", + "colorType": "Colour Type", + "color": "Colour", + "greyscale": "Greyscale", + "blackwhite": "Black & White", + "dpi": "DPI", + "output": "Output", + "single": "Single", + "multiple": "Multiple", + "fitOption": "Fit Option", + "maintainAspectRatio": "Maintain Aspect Ratio", + "fitDocumentToPage": "Fit Document to Page", + "fillPage": "Fill Page", + "autoRotate": "Auto Rotate", + "autoRotateDescription": "Automatically rotate images to better fit the PDF page", + "combineImages": "Combine Images", + "combineImagesDescription": "Combine all images into one PDF, or create separate PDFs for each image", + "webOptions": "Web to PDF Options", + "zoomLevel": "Zoom Level", + "emailOptions": "Email to PDF Options", + "includeAttachments": "Include email attachments", + "maxAttachmentSize": "Maximum attachment size (MB)", + "includeAllRecipients": "Include CC and BCC recipients in header", + "downloadHtml": "Download HTML intermediate file instead of PDF", + "pdfaOptions": "PDF/A Options", + "outputFormat": "Output Format", + "pdfaNote": "PDF/A-1b is more compatible, PDF/A-2b supports more features.", + "pdfaDigitalSignatureWarning": "The PDF contains a digital signature. This will be removed in the next step.", + "fileFormat": "File Format", + "wordDoc": "Word Document", + "wordDocExt": "Word Document (.docx)", + "odtExt": "OpenDocument Text (.odt)", + "pptExt": "PowerPoint (.pptx)", + "odpExt": "OpenDocument Presentation (.odp)", + "txtExt": "Plain Text (.txt)", + "rtfExt": "Rich Text Format (.rtf)", + "selectedFiles": "Selected files", + "noFileSelected": "No file selected. Use the file panel to add files.", + "convertFiles": "Convert Files", + "converting": "Converting...", + "downloadConverted": "Download Converted File", + "errorNoFiles": "Please select at least one file to convert.", + "errorNoFormat": "Please select both source and target formats.", + "errorNotSupported": "Conversion from {{from}} to {{to}} is not supported.", + "images": "Images", + "officeDocs": "Office Documents (Word, Excel, PowerPoint)", + "imagesExt": "Images (JPG, PNG, etc.)", + "markdown": "Markdown", + "textRtf": "Text/RTF", + "grayscale": "Greyscale", + "errorConversion": "An error occurred while converting the file." }, "imageToPdf": { "tags": "āŊ–āŊĻāž’āžąāŊ´āŊĸāŧ‹āŊ–āŧ,āŊ”āŊĸāŧ‹āŊĸāŊ˛āŊĻāŧ,jpg,āŊ”āŊĸāŧ,āŊ āŊ‘āž˛āŧ‹āŊ”āŊĸāŧ" @@ -679,7 +1248,33 @@ "8": "Remove Last", "9": "āŊ‘āŊ„āŧ‹āŊ”āŊŧāŧ‹āŊ‘āŊ„āŧ‹āŊ˜āŊāŊ āŧ‹āŊ˜āŧ‹āŊĻāŊ´āŊ–āŧ‹āŊ”āŧ", "10": "āŊĄāŧ‹āŊŸāŊ´āŊ„āŧ‹āŊĻāžĄāŊēāŊ–āŧ‹āŊĻāžĻāžąāŊŧāŊĸāŧ", - "11": "Duplicate all pages" + "11": "Duplicate all pages", + "desc": { + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, â€Ļ).", + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, â€Ļ).", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimized for binding on the side)." + } + }, + "desc": { + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, â€Ļ).", + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, â€Ļ).", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimised for binding on the side).", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document." }, "placeholder": "(āŊ‘āŊ”āŊēāŊĸāŧ‹āŊ“āŧ 1,3,2 āŊĄāŊ„āŧ‹āŊ“āŧ‹ 4-8,2,10-12 āŊĄāŊ„āŧ‹āŊ“āŧ‹ 2n-1)" }, @@ -691,9 +1286,198 @@ "upload": "āŊ”āŊĸāŧ‹āŊĸāŊ˛āŊĻāŧ‹āŊĻāžŖāŊŧāŊ“āŧ‹āŊ”āŧ", "submit": "āŊ”āŊĸāŧ‹āŊĸāŊ˛āŊĻāŧ‹āŊĻāžŖāŊŧāŊ“āŧ‹āŊ”āŧ" }, + "attachments": { + "tags": "attachments,add,remove,embed,file", + "title": "Add Attachments", + "header": "Add Attachments", + "add": "Add Attachment", + "remove": "Remove Attachment", + "embed": "Embed Attachment", + "submit": "Add Attachments" + }, "watermark": { - "tags": "āŊĄāŊ˛āŧ‹āŊ‚āŊē,āŊ–āŊĻāžāžąāŊĸāŧ‹āŊŸāžŗāŊŧāŊĻāŧ,āŊāŧ‹āŊĄāŊ˛āŊ‚,āŊĸāŊ„āŧ‹āŊ‘āŊ–āŊ„āŧ‹āŧ,āŊ”āŊĸāŧ‹āŊ‘āŊ–āŊ„āŧ‹āŧ,āŊšāŊŧāŊ„āŧ‹āŊĸāžŸāŊ‚āŊĻāŧ,āŊ”āŊĸāŧ‹āŊĸāŊ˛āŊĻāŧ,jpg,āŊ”āŊĸāŧ,āŊ āŊ‘āž˛āŧ‹āŊ”āŊĸāŧ", "title": "āŊĸāžŸīŋŊāŊĻāŧ‹āŊāŊēāŊŖāŧ‹āŊĻāžŖāŊŧāŊ“āŧ‹āŊ”āŧ", + "desc": "Add text or image watermarks to PDF files", + "completed": "Watermark added", + "submit": "āŊĸāžŸāŊ‚āŊĻāŧ‹āŊāŊēāŊŖāŧ‹āŊĻāžŖāŊŧāŊ“āŧ‹āŊ”āŧ", + "filenamePrefix": "watermarked", + "error": { + "failed": "An error occurred while adding watermark to the PDF." + }, + "watermarkType": { + "text": "Text", + "image": "Image" + }, + "settings": { + "type": "Watermark Type", + "text": { + "label": "Watermark Text", + "placeholder": "Enter watermark text" + }, + "image": { + "label": "Watermark Image", + "choose": "Choose Image", + "selected": "Selected: {{filename}}" + }, + "fontSize": "Font Size", + "size": "Size", + "alphabet": "Font/Language", + "color": "Watermark Colour", + "rotation": "Rotation (degrees)", + "opacity": "Opacity (%)", + "spacing": { + "horizontal": "Horizontal Spacing", + "vertical": "Vertical Spacing", + "height": "Height Spacing", + "width": "Width Spacing" + }, + "convertToImage": "Flatten PDF pages to images" + }, + "alphabet": { + "roman": "Roman/Latin", + "arabic": "Arabic", + "japanese": "Japanese", + "korean": "Korean", + "chinese": "Chinese", + "thai": "Thai" + }, + "steps": { + "type": "Watermark Type", + "wording": "Wording", + "textStyle": "Style", + "formatting": "Formatting", + "file": "Watermark File" + }, + "results": { + "title": "Watermark Results" + }, + "tooltip": { + "language": { + "title": "Language Support", + "text": "Choose the appropriate language setting to ensure proper font rendering for your text." + }, + "appearance": { + "title": "Appearance Settings", + "text": "Control how your watermark looks and blends with the document.", + "bullet1": "Rotation: -360° to 360° for angled watermarks", + "bullet2": "Opacity: 0-100% for transparency control", + "bullet3": "Lower opacity creates subtle watermarks" + }, + "spacing": { + "title": "Spacing Control", + "text": "Adjust the spacing between repeated watermarks across the page.", + "bullet1": "Width spacing: Horizontal distance between watermarks", + "bullet2": "Height spacing: Vertical distance between watermarks", + "bullet3": "Higher values create more spread out patterns" + }, + "type": { + "header": { + "title": "Watermark Type Selection" + }, + "description": { + "title": "Choose Your Watermark", + "text": "Select between text or image watermarks based on your needs." + }, + "text": { + "title": "Text Watermarks", + "text": "Perfect for adding copyright notices, company names, or confidentiality labels. Supports multiple languages and custom colours.", + "bullet1": "Customisable fonts and languages", + "bullet2": "Adjustable colours and transparency", + "bullet3": "Ideal for legal or branding text" + }, + "image": { + "title": "Image Watermarks", + "text": "Use logos, stamps, or any image as a watermark. Great for branding and visual identification.", + "bullet1": "Upload any image format", + "bullet2": "Maintains image quality", + "bullet3": "Perfect for logos and stamps" + } + }, + "wording": { + "header": { + "title": "Text Content" + }, + "text": { + "title": "Watermark Text", + "text": "Enter the text that will appear as your watermark across the document.", + "bullet1": "Keep it concise for better readability", + "bullet2": "Common examples: 'CONFIDENTIAL', 'DRAFT', company name", + "bullet3": "Emoji characters are not supported and will be filtered out" + } + }, + "textStyle": { + "header": { + "title": "Text Style" + }, + "color": { + "title": "Colour Selection", + "text": "Choose a colour that provides good contrast with your document content.", + "bullet1": "Light grey (#d3d3d3) for subtle watermarks", + "bullet2": "Black or dark colours for high contrast", + "bullet3": "Custom colours for branding purposes" + }, + "language": { + "title": "Language Support", + "text": "Choose the appropriate language setting to ensure proper font rendering." + } + }, + "file": { + "header": { + "title": "Image Upload" + }, + "upload": { + "title": "Image Selection", + "text": "Upload an image file to use as your watermark.", + "bullet1": "Supports common formats: PNG, JPG, GIF, BMP", + "bullet2": "PNG with transparency works best", + "bullet3": "Higher resolution images maintain quality better" + }, + "recommendations": { + "title": "Best Practices", + "text": "Tips for optimal image watermark results.", + "bullet1": "Use logos or stamps with transparent backgrounds", + "bullet2": "Simple designs work better than complex images", + "bullet3": "Consider the final document size when choosing resolution" + } + }, + "formatting": { + "header": { + "title": "Formatting & Layout" + }, + "size": { + "title": "Size Control", + "text": "Adjust the size of your watermark (text or image).", + "bullet1": "Larger sizes create more prominent watermarks" + }, + "appearance": { + "title": "Appearance Settings", + "text": "Control how your watermark looks and blends with the document.", + "bullet1": "Rotation: -360° to 360° for angled watermarks", + "bullet2": "Opacity: 0-100% for transparency control", + "bullet3": "Lower opacity creates subtle watermarks" + }, + "spacing": { + "title": "Spacing Control", + "text": "Adjust the spacing between repeated watermarks across the page.", + "bullet1": "Horizontal spacing: Distance between watermarks left to right", + "bullet2": "Vertical spacing: Distance between watermarks top to bottom", + "bullet3": "Higher values create more spread out patterns" + }, + "security": { + "title": "Security Option", + "text": "Convert the final PDF to an image-based format for enhanced security.", + "bullet1": "Prevents text selection and copying", + "bullet2": "Makes watermarks harder to remove", + "bullet3": "Results in larger file sizes", + "bullet4": "Best for sensitive or copyrighted content" + } + } + }, + "type": { + "1": "āŊĄāŊ˛āŧ‹āŊ‚āŊē", + "2": "āŊ”āŊĸāŧ‹āŊĸāŊ˛āŊĻāŧ" + }, + "tags": "āŊĄāŊ˛āŧ‹āŊ‚āŊē,āŊ–āŊĻāžāžąāŊĸāŧ‹āŊŸāžŗāŊŧāŊĻāŧ,āŊāŧ‹āŊĄāŊ˛āŊ‚,āŊĸāŊ„āŧ‹āŊ‘āŊ–āŊ„āŧ‹āŧ,āŊ”āŊĸāŧ‹āŊ‘āŊ–āŊ„āŧ‹āŧ,āŊšāŊŧāŊ„āŧ‹āŊĸāžŸāŊ‚āŊĻāŧ,āŊ”āŊĸāŧ‹āŊĸāŊ˛āŊĻāŧ,jpg,āŊ”āŊĸāŧ,āŊ āŊ‘āž˛āŧ‹āŊ”āŊĸāŧ", "header": "āŊĸāžŸāŊ‚āŊĻāŧ‹āŊāŊēāŊŖāŧ‹āŊĻāžŖāŊŧāŊ“āŧ‹āŊ”āŧ", "customColor": "āŊĄāŊ˛āŧ‹āŊ‚āŊēāŊ āŊ˛āŧ‹āŊšāŊŧāŊĻāŧ‹āŊ˜āŊ‘āŊŧāŊ‚āŧ‹āŊĸāŊ„āŧ‹āŊĻāž’āž˛āŊ˛āŊ‚", "selectText": { @@ -707,11 +1491,6 @@ "8": "āŊĸāžŸāŊ‚āŊĻāŧ‹āŊāŊēāŊŖāŧ‹āŊ‚āžąāŊ˛āŧ‹āŊĸāŊ˛āŊ‚āŊĻāŧ", "9": "āŊĸāžŸāŊ‚āŊĻāŧ‹āŊāŊēāŊŖāŧ‹āŊ‚āžąāŊ˛āŧ‹āŊ”āŊĸāŧ‹āŊĸāŊ˛āŊĻāŧ", "10": "PDF āŊ“āŊĻāŧ‹ PDF-āŊ”āŊĸāŧ‹āŊĸāŊ˛āŊĻāŧ‹āŊŖāŧ‹āŊ–āŊĻāž’āžąāŊ´āŊĸāŧ‹āŊ–āŧ" - }, - "submit": "āŊĸāžŸāŊ‚āŊĻāŧ‹āŊāŊēāŊŖāŧ‹āŊĻāžŖāŊŧāŊ“āŧ‹āŊ”āŧ", - "type": { - "1": "āŊĄāŊ˛āŧ‹āŊ‚āŊē", - "2": "āŊ”āŊĸāŧ‹āŊĸāŊ˛āŊĻāŧ" } }, "permissions": { @@ -734,41 +1513,204 @@ "submit": "āŊ–āŊĻāž’āžąāŊ´āŊĸāŧ‹āŊ–āŧ" }, "removePages": { - "tags": "āŊ¤āŊŧāŊ‚āŧ‹āŊ„āŊŧāŊĻāŧ‹āŊĻāŊ´āŊ–āŧ‹āŊ”āŧ,āŊ¤āŊŧāŊ‚āŧ‹āŊ„āŊŧāŊĻāŧ‹āŊ‚āŊĻāŊ´āŊ–āŧ‹āŊ”āŧ" - }, - "addPassword": { - "tags": "āŊ–āŊ‘āŊēāŧ‹āŊ āŊ‡āŊ‚āŊĻāŧ,āŊ‰āŊēāŊ“āŧ‹āŊĻāž˛āŊ´āŊ„āŧ‹āŧ", - "title": "āŊ‚āŊĻāŊ„āŧ‹āŊšāŊ˛āŊ‚āŧ‹āŊĻāžŖāŊŧāŊ“āŧ‹āŊ”āŧ", - "header": "āŊ‚āŊĻāŊ„āŧ‹āŊšāŊ˛āŊ‚āŧ‹āŊĻāžŖāŊŧāŊ“āŧ‹āŊ”āŧ (āŊ‚āŊĻāŊ„āŧ‹āŊĻāžĄāŊŧāŊ˜āŧ)", - "selectText": { - "1": "āŊ‚āŊĻāŊ„āŧ‹āŊĻāžĄāŊŧāŊ˜āŧ‹āŊ–āžąāŧ‹āŊĸāž’āžąāŊ´āŊ āŊ˛āŧ‹ PDF āŊ āŊ‘āŊēāŊ˜āŊĻāŧ‹āŊ”āŧ", - "2": "āŊĻāž¤āžąāŊŧāŊ‘āŧ‹āŊ˜āŊāŊ“āŧ‹āŊ‚āžąāŊ˛āŧ‹āŊ‚āŊĻāŊ„āŧ‹āŊšāŊ˛āŊ‚", - "3": "āŊ‚āŊĻāŊ„āŧ‹āŊĻāžĄāŊŧāŊ˜āŧ‹āŊŖāžĄāŊēāŧ‹āŊ˜āŊ˛āŊ‚āŧ‹āŊ‚āŊ˛āŧ‹āŊĸāŊ˛āŊ„āŧ‹āŊšāŊ‘āŧ", - "4": "āŊšāŊ‘āŧ‹āŊ˜āŊāŊŧāŧ‹āŊ–āŧ‹āŊĸāžŖāŊ˜āŊĻāŧ‹āŊĻāž˛āŧ‹āŊ–āŊĸāžŸāŊ“āŧ‹āŊ†āŊēāŧ‹āŊ–āŧ‹āŊĄāŊŧāŊ‘āŧ āŊ āŊŧāŊ“āŧ‹āŊ€āžąāŊ„āŧ‹āŊšāŊ‘āŧ‹āŊ‘āŊ˜āŊ āŧ‹āŊ–āŧ‹āŊĸāžŖāŊ˜āŊĻāŧ‹āŊ āŊ†āŊ˜āŧ‹āŊ˜āŊāŊ´āŊ“āŧ‹āŊĸāŊ„āŧ‹āŊ–āŊžāŊ˛āŊ“āŧ‹āŊ–āŊŸāŊ„āŧ‹āŊ–āŧ‹āŊĄāŊŧāŊ‘āŧ", - "5": "āŊ†āŊŧāŊ‚āŧ‹āŊ˜āŊ†āŊ“āŧ‹āŊĻāž’āž˛āŊ˛āŊ‚āŧ‹āŊ āŊ‚āŊŧāŊ‘āŧ (āŊ–āŊ‘āŊ‚āŧ‹āŊ”āŊŧāŊ āŊ˛āŧ‹āŊ‚āŊĻāŊ„āŧ‹āŊšāŊ˛āŊ‚āŧ‹āŊ‘āŊ„āŧ‹āŊ˜āŊ‰āŊ˜āŧ‹āŊ‘āŊ´āŧ‹āŊ–āŊēāŊ‘āŧ‹āŊĻāž¤āžąāŊŧāŊ‘āŧ‹āŊ–āžąāŊēāŊ‘āŧ‹āŊ”āŊĸāŧ‹āŊ āŊŧāŊĻāŧ‹āŊĻāžĻāžąāŊŧāŊĸāŧ‹āŊ–āžąāŊēāŊ‘āŧ)", - "6": "āŊĄāŊ˛āŊ‚āŧ‹āŊ†āŧ‹āŊĻāž’āž˛āŊ˛āŊ‚āŧ‹āŊĻāžĻāžąāŊŧāŊĸāŧ‹āŊ āŊ‚āŊŧāŊ‚āŧ‹āŊ”āŧ", - "7": "āŊ“āŊ„āŧ‹āŊ‘āŊŧāŊ“āŧ‹āŊ•āžąāŊ˛āŊĸāŧ‹āŊ āŊ‘āŊŧāŊ“āŧ‹āŊ āŊ‚āŊŧāŊ‚āŧ‹āŊ”āŧ", - "8": "āŊ˜āŊāŊ´āŊ“āŧ‹āŊĸāžāžąāŊēāŊ“āŧ‹āŊ‚āžąāŊ˛āŧ‹āŊ†āŊēāŊ‘āŧ‹āŊ‘āŊ´āŧ‹āŊ•āžąāŊ˛āŊĸāŧ‹āŊ āŊ‘āŊŧāŊ“āŧ‹āŊ āŊ‚āŊŧāŊ‚āŧ‹āŊ”āŧ", - "9": "āŊ āŊ‚āŊēāŊ„āŊĻāŧ‹āŊ¤āŊŧāŊ‚āŧ‹āŊ–āŊ€āŊ„āŧ‹āŊ–āŧ‹āŊ āŊ‚āŊŧāŊ‚āŧ‹āŊ”āŧ", - "10": "āŊ–āŊŸāŊŧāŧ‹āŊ–āŊ…āŊŧāŊĻāŧ‹āŊ āŊ‚āŊŧāŊ‚āŧ‹āŊ”āŧ", - "11": "āŊ˜āŊ†āŊ“āŧ‹āŊ āŊ‚āž˛āŊēāŊŖāŧ‹āŊ–āŊŸāŊŧāŧ‹āŊ–āŊ…āŊŧāŊĻāŧ‹āŊ āŊ‚āŊŧāŊ‚āŧ‹āŊ”āŧ", - "12": "Prevent printin", - "13": "Prevent printing different formats", - "14": "āŊĻāž¤āžąāŊŧāŊ‘āŧ‹āŊ˜āŊāŊ“āŧ‹āŊ‚āžąāŊ˛āŧ‹āŊ‚āŊĻāŊ„āŧ‹āŊ‚āž˛āŊ„āŊĻāŧ", - "15": "āŊĄāŊ˛āŊ‚āŧ‹āŊšāŊ‚āŊĻāŧ‹āŊĸāŊ„āŧ‹āŊĻāžŸāŊēāŊ„āŧ‹āŊāŧ‹āŊ•āžąāŊēāŊĻāŧ‹āŊĸāž’āžąāŊ´āŊĸāŧ‹āŊ–āŊ€āŊ‚āŧ‹āŊĻāžĄāŊŧāŊ˜āŧ‹āŊ–āžąāŊēāŊ‘āŧ āŊ āŊ‘āŊ˛āŧ‹āŊŖāžŸāŊĸāŧ‹āŊ–āžąāŊĻāŧ‹āŊ“āŧ‹āŊ€āžŗāŊŧāŊ‚āŧ‹āŊ†āŊĻāŧ‹āŊ€āžąāŊ˛āŊĻāŧ‹āŊ“āŊ´āŊĻāŧ‹āŊ”āŧ‹āŊāŊŧāŊ“āŧ‹āŊ”āŧ‹āŊ”āŊ āŊ˛āŧ‹āŊ„āŊēāŊĻāŧ‹āŊ”āŧ‹āŊ˜āŊēāŊ‘āŧ", - "16": "āŊĄāŊ˛āŊ‚āŧ‹āŊšāŊ‚āŊĻāŧ‹āŊĸāŊ„āŧ‹āŊĻāžŸāŊēāŊ„āŧ‹āŊāŧ‹āŊ•āžąāŊēāŊĻāŧ‹āŊĸāž’āžąāŊ´āŊĸāŧ‹āŊ–āŊ€āŊ‚āŧ‹āŊĻāžĄāŊŧāŊ˜āŧ‹āŊ–āžąāŊēāŊ‘āŧ" + "tags": "āŊ¤āŊŧāŊ‚āŧ‹āŊ„āŊŧāŊĻāŧ‹āŊĻāŊ´āŊ–āŧ‹āŊ”āŧ,āŊ¤āŊŧāŊ‚āŧ‹āŊ„āŊŧāŊĻāŧ‹āŊ‚āŊĻāŊ´āŊ–āŧ‹āŊ”āŧ", + "title": "Remove Pages", + "pageNumbers": { + "label": "Pages to Remove", + "placeholder": "e.g., 1,3,5-8,10", + "error": "Invalid page number format. Use numbers, ranges (1-5), or mathematical expressions (2n+1)" }, - "submit": "āŊ‚āŊĻāŊ„āŧ‹āŊ–āŊĻāž’āžąāŊ´āŊĸāŧ" - }, - "removePassword": { - "tags": "āŊ–āŊ‘āŊēāŧ‹āŊ āŊ‡āŊ‚āŊĻāŧ,āŊ‚āŊĻāŊ„āŧ‹āŊĻāžĄāŊŧāŊ˜āŧ‹āŊ‚āž˛āŊŧāŊŖāŧ‹āŊ–āŧ,āŊ‰āŊēāŊ“āŧ‹āŊĻāž˛āŊ´āŊ„āŧ‹āŧ,āŊ‚āŊĻāŊ„āŧ‹āŊšāŊ˛āŊ‚āŧ‹āŊ˜āŊēāŊ‘āŧ‹āŊ”āŧ,āŊ‚āŊĻāŊ„āŧ‹āŊšāŊ˛āŊ‚āŧ‹āŊĻāŊ´āŊ–āŧ‹āŊ”āŧ", - "title": "āŊ‚āŊĻāŊ„āŧ‹āŊšāŊ˛āŊ‚āŧ‹āŊĻāŊ´āŊ–āŧ‹āŊ”āŧ", - "header": "āŊ‚āŊĻāŊ„āŧ‹āŊšāŊ˛āŊ‚āŧ‹āŊĻāŊ´āŊ–āŧ‹āŊ”āŧ (āŊ‚āŊĻāŊ„āŧ‹āŊĻāžĄāŊŧāŊ˜āŧ‹āŊ‚āž˛āŊŧāŊŖāŧ‹āŊ–āŧ)", - "selectText": { - "1": "āŊ‚āŊĻāŊ„āŧ‹āŊĻāžĄāŊŧāŊ˜āŧ‹āŊ‚āž˛āŊŧāŊŖāŧ‹āŊĸāž’āžąāŊ´āŊ āŊ˛āŧ‹ PDF āŊ āŊ‘āŊēāŊ˜āŊĻāŧ‹āŊ”āŧ", - "2": "āŊ‚āŊĻāŊ„āŧ‹āŊšāŊ˛āŊ‚" + "filenamePrefix": "pages_removed", + "files": { + "placeholder": "Select a PDF file in the main view to get started" }, - "submit": "āŊĻāŊ´āŊ–āŧ‹āŊ”āŧ" + "settings": { + "title": "Settings" + }, + "tooltip": { + "header": { + "title": "Remove Pages Settings" + }, + "pageNumbers": { + "title": "Page Selection", + "text": "Specify which pages to remove from your PDF. You can select individual pages, ranges, or use mathematical expressions.", + "bullet1": "Individual pages: 1,3,5 (removes pages 1, 3, and 5)", + "bullet2": "Page ranges: 1-5,10-15 (removes pages 1-5 and 10-15)", + "bullet3": "Mathematical: 2n+1 (removes odd pages)", + "bullet4": "Open ranges: 5- (removes from page 5 to end)" + }, + "examples": { + "title": "Common Examples", + "text": "Here are some common page selection patterns:", + "bullet1": "Remove first page: 1", + "bullet2": "Remove last 3 pages: -3", + "bullet3": "Remove every other page: 2n", + "bullet4": "Remove specific scattered pages: 1,5,10,15" + }, + "safety": { + "title": "Safety Tips", + "text": "Important considerations when removing pages:", + "bullet1": "Always preview your selection before processing", + "bullet2": "Keep a backup of your original file", + "bullet3": "Page numbers start from 1, not 0", + "bullet4": "Invalid page numbers will be ignored" + } + }, + "error": { + "failed": "An error occurred whilst removing pages." + }, + "results": { + "title": "Page Removal Results" + }, + "submit": "Remove Pages" + }, + "extractPages": { + "title": "Extract Pages", + "pageNumbers": { + "label": "Pages to Extract", + "placeholder": "e.g., 1,3,5-8 or odd & 1-10" + }, + "settings": { + "title": "Settings" + }, + "tooltip": { + "description": "Extracts the selected pages into a new PDF, preserving order." + }, + "error": { + "failed": "Failed to extract pages" + }, + "results": { + "title": "Pages Extracted" + }, + "submit": "Extract Pages" + }, + "pageSelection": { + "tooltip": { + "header": { + "title": "Page Selection Guide" + }, + "basic": { + "title": "Basic Usage", + "text": "Select specific pages from your PDF document using simple syntax.", + "bullet1": "Individual pages: 1,3,5", + "bullet2": "Page ranges: 3-6 or 10-15", + "bullet3": "All pages: all" + }, + "advanced": { + "title": "Advanced Features" + }, + "tips": { + "title": "Tips", + "text": "Keep these guidelines in mind:", + "bullet1": "Page numbers start from 1 (not 0)", + "bullet2": "Spaces are automatically removed", + "bullet3": "Invalid expressions are ignored" + }, + "syntax": { + "title": "Syntax Basics", + "text": "Use numbers, ranges, keywords, and progressions (n starts at 0). Parentheses are supported.", + "bullets": { + "numbers": "Numbers/ranges: 5, 10-20", + "keywords": "Keywords: odd, even", + "progressions": "Progressions: 3n, 4n+1" + } + }, + "operators": { + "title": "Operators", + "text": "AND has higher precedence than comma. NOT applies within the document range.", + "and": "AND: & or \"and\" — require both conditions (e.g., 1-50 & even)", + "comma": "Comma: , or | — combine selections (e.g., 1-10, 20)", + "not": "NOT: ! or \"not\" — exclude pages (e.g., 3n & not 30)" + }, + "examples": { + "title": "Examples" + }, + "complex": { + "bullet1": "1,3-5,8,2n → pages 1, 3–5, 8, plus evens", + "bullet2": "10-,2n-1 → from page 10 to end + odd pages", + "description": "Mix different types.", + "title": "Complex Combinations" + }, + "description": "Choose which pages to use for the operation. Supports single pages, ranges, formulas, and the all keyword.", + "individual": { + "bullet1": "1,3,5 → selects pages 1, 3, 5", + "bullet2": "2,7,12 → selects pages 2, 7, 12", + "description": "Enter numbers separated by commas.", + "title": "Individual Pages" + }, + "mathematical": { + "bullet1": "2n → all even pages (2, 4, 6â€Ļ)", + "bullet2": "2n-1 → all odd pages (1, 3, 5â€Ļ)", + "bullet3": "3n → every 3rd page (3, 6, 9â€Ļ)", + "bullet4": "4n-1 → pages 3, 7, 11, 15â€Ļ", + "description": "Use n in formulas for patterns.", + "title": "Mathematical Functions" + }, + "ranges": { + "bullet1": "3-6 → selects pages 3–6", + "bullet2": "10-15 → selects pages 10–15", + "bullet3": "5- → selects pages 5 to end", + "description": "Use - for consecutive pages.", + "title": "Page Ranges" + }, + "special": { + "bullet1": "all → selects all pages", + "title": "Special Keywords" + } + } + }, + "bulkSelection": { + "syntaxError": "There is a syntax issue. See Page Selection tips for help.", + "header": { + "title": "Page Selection Guide" + }, + "syntax": { + "title": "Syntax Basics", + "text": "Use numbers, ranges, keywords, and progressions (n starts at 0). Parentheses are supported.", + "bullets": { + "numbers": "Numbers/ranges: 5, 10-20", + "keywords": "Keywords: odd, even", + "progressions": "Progressions: 3n, 4n+1" + } + }, + "operators": { + "title": "Operators", + "text": "AND has higher precedence than comma. NOT applies within the document range.", + "and": "AND: & or \"and\" — require both conditions (e.g., 1-50 & even)", + "comma": "Comma: , or | — combine selections (e.g., 1-10, 20)", + "not": "NOT: ! or \"not\" — exclude pages (e.g., 3n & not 30)" + }, + "examples": { + "title": "Examples", + "first50": "First 50", + "last50": "Last 50", + "every3rd": "Every 3rd", + "oddWithinExcluding": "Odd within 1-20 excluding 5-7", + "combineSets": "Combine sets" + }, + "firstNPages": { + "title": "First N Pages", + "placeholder": "Number of pages" + }, + "lastNPages": { + "title": "Last N Pages", + "placeholder": "Number of pages" + }, + "everyNthPage": { + "title": "Every Nth Page", + "placeholder": "Step size" + }, + "range": { + "title": "Range", + "fromPlaceholder": "From", + "toPlaceholder": "To" + }, + "keywords": { + "title": "Keywords" + }, + "advanced": { + "title": "Advanced" + } }, "compressPdfs": { "tags": "āŊ–āŊĻāžĄāŊ´āŊĻāŧ‹āŊ”āŧ,āŊ†āŊ´āŊ„āŧ‹āŊ†āŊ´āŊ„āŧ‹āŧ,āŊ†āŊ´āŊ„āŧ‹āŊ†āŊ´āŊ„āŧ‹āŧ" @@ -777,12 +1719,142 @@ "tags": "remove,delete,form,field,readonly", "title": "Remove Read-Only from Form Fields", "header": "Unlock PDF Forms", - "submit": "Remove" + "submit": "Remove", + "description": "This tool will remove read-only restrictions from PDF form fields, making them editable and fillable.", + "filenamePrefix": "unlocked_forms", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst unlocking PDF forms." + }, + "results": { + "title": "Unlocked Forms Results" + } }, "changeMetadata": { - "tags": "āŊāŧ‹āŊ–āžąāŊ„āŧ‹āŧ,āŊĸāžŠāŊŧāŊ˜āŧ‹āŊ”āŧ‹āŊ”āŊŧāŧ,āŊšāŊēāŊĻāŧ‹āŊ‚āž˛āŊ„āŊĻāŧ,āŊ–āŊŸāŊŧāŧ‹āŊ–āŧ,āŊ‘āŊ´āŊĻāŧ‹āŊšāŊŧāŊ‘āŧ,āŊ”āŊĸāŧ‹āŊĻāžāž˛āŊ´āŊ“āŧ‹āŊ”āŧ,āŊāŊŧāŊ“āŧ‹āŊĻāžāžąāŊēāŊ‘āŧ‹āŊ”āŧ,āŊĻāžĄāŊŧāŊ˜āŧ‹āŊĸāžŠāŊ˛āŊĻāŧ", - "title": "āŊ‚āŊ“āŊĻāŧ‹āŊšāŊ´āŊŖāŧ‹āŊžāŊ˛āŊ–āŧ‹āŊ•āž˛āŧ‹āŊ–āŊĻāž’āžąāŊ´āŊĸāŧ‹āŊ–āŧ", "header": "āŊ‚āŊ“āŊĻāŧ‹āŊšāŊ´āŊŖāŧ‹āŊžāŊ˛āŊ–āŧ‹āŊ•āž˛āŧ‹āŊ–āŊĻāž’āžąāŊ´āŊĸāŧ‹āŊ–āŧ", + "submit": "āŊ–āŊĻāž’āžąāŊ´āŊĸāŧ‹āŊ–āŧ", + "filenamePrefix": "metadata", + "settings": { + "title": "Metadata Settings" + }, + "standardFields": { + "title": "Standard Fields" + }, + "deleteAll": { + "label": "Remove Existing Metadata", + "checkbox": "Delete all metadata" + }, + "title": { + "label": "Title", + "placeholder": "Document title" + }, + "author": { + "label": "Author", + "placeholder": "Document author" + }, + "subject": { + "label": "Subject", + "placeholder": "Document subject" + }, + "keywords": { + "label": "Keywords", + "placeholder": "Document keywords" + }, + "creator": { + "label": "Creator", + "placeholder": "Document creator" + }, + "producer": { + "label": "Producer", + "placeholder": "Document producer" + }, + "dates": { + "title": "Date Fields" + }, + "creationDate": { + "label": "Creation Date", + "placeholder": "Creation date" + }, + "modificationDate": { + "label": "Modification Date", + "placeholder": "Modification date" + }, + "trapped": { + "label": "Trapped Status", + "unknown": "Unknown", + "true": "True", + "false": "False" + }, + "advanced": { + "title": "Advanced Options" + }, + "customFields": { + "title": "Custom Metadata", + "description": "Add custom metadata fields to the document", + "add": "Add Field", + "key": "Key", + "keyPlaceholder": "Custom key", + "value": "Value", + "valuePlaceholder": "Custom value", + "remove": "Remove" + }, + "results": { + "title": "Updated PDFs" + }, + "error": { + "failed": "An error occurred while changing the PDF metadata." + }, + "tooltip": { + "header": { + "title": "PDF Metadata Overview" + }, + "standardFields": { + "title": "Standard Fields", + "text": "Common PDF metadata fields that describe the document.", + "bullet1": "Title: Document name or heading", + "bullet2": "Author: Person who created the document", + "bullet3": "Subject: Brief description of content", + "bullet4": "Keywords: Search terms for the document", + "bullet5": "Creator/Producer: Software used to create the PDF" + }, + "dates": { + "title": "Date Fields", + "text": "When the document was created and modified.", + "bullet1": "Creation Date: When original document was made", + "bullet2": "Modification Date: When last changed" + }, + "options": { + "title": "Additional Options", + "text": "Custom fields and privacy controls.", + "bullet1": "Custom Metadata: Add your own key-value pairs", + "bullet2": "Trapped Status: High-quality printing setting", + "bullet3": "Delete All: Remove all metadata for privacy" + }, + "deleteAll": { + "title": "Remove Existing Metadata", + "text": "Complete metadata deletion to ensure privacy." + }, + "customFields": { + "title": "Custom Metadata", + "text": "Add your own custom key-value metadata pairs.", + "bullet1": "Add any custom fields relevant to your document", + "bullet2": "Examples: Department, Project, Version, Status", + "bullet3": "Both key and value are required for each entry" + }, + "advanced": { + "title": "Advanced Options", + "trapped": { + "title": "Trapped Status", + "description": "Indicates if document is prepared for high-quality printing.", + "bullet1": "True: Document has been trapped for printing", + "bullet2": "False: Document has not been trapped", + "bullet3": "Unknown: Trapped status is not specified" + } + } + }, + "tags": "āŊāŧ‹āŊ–āžąāŊ„āŧ‹āŧ,āŊĸāžŠāŊŧāŊ˜āŧ‹āŊ”āŧ‹āŊ”āŊŧāŧ,āŊšāŊēāŊĻāŧ‹āŊ‚āž˛āŊ„āŊĻāŧ,āŊ–āŊŸāŊŧāŧ‹āŊ–āŧ,āŊ‘āŊ´āŊĻāŧ‹āŊšāŊŧāŊ‘āŧ,āŊ”āŊĸāŧ‹āŊĻāžāž˛āŊ´āŊ“āŧ‹āŊ”āŧ,āŊāŊŧāŊ“āŧ‹āŊĻāžāžąāŊēāŊ‘āŧ‹āŊ”āŧ,āŊĻāžĄāŊŧāŊ˜āŧ‹āŊĸāžŠāŊ˛āŊĻāŧ", "selectText": { "1": "āŊ–āŊĻāž’āžąāŊ´āŊĸāŧ‹āŊ āŊ‘āŊŧāŊ‘āŧ‹āŊ”āŊ āŊ˛āŧ‹āŊ āŊ‚āžąāŊ´āŊĸāŧ‹āŊšāŊ‘āŧ‹āŊĸāžŖāŊ˜āŊĻāŧ‹āŊĸāžŠāŊŧāŊ˜āŧ‹āŊĻāž’āž˛āŊ˛āŊ‚āŧ‹āŊ–āžąāŊēāŊ‘āŧ‹āŊĸāŊŧāŊ‚āŊĻāŧ", "2": "āŊ‚āŊ“āŊĻāŧ‹āŊšāŊ´āŊŖāŧ‹āŊžāŊ˛āŊ–āŧ‹āŊ•āž˛āŧ‹āŊšāŊ„āŧ‹āŊ˜āŧ‹āŊĻāŊ´āŊ–āŧ‹āŊ”āŧ", @@ -790,15 +1862,7 @@ "4": "āŊ‚āŊ“āŊĻāŧ‹āŊšāŊ´āŊŖāŧ‹āŊžāŊ˛āŊ–āŧ‹āŊ•āž˛āŧ‹āŊ‚āŊžāŊ“āŧ", "5": "āŊĸāŊ„āŧ‹āŊĻāž’āž˛āŊ˛āŊ‚āŧ‹āŊ‚āŊ“āŊĻāŧ‹āŊšāŊ´āŊŖāŧ‹āŊžāŊ˛āŊ–āŧ‹āŊ•āž˛āŧ‹āŊ‚āŊĻāŊĸāŧ‹āŊĻāžŖāŊŧāŊ“āŧ" }, - "author": "āŊĸāžŠāŊŧāŊ˜āŧ‹āŊ”āŧ‹āŊ”āŊŧāŧ", - "creationDate": "āŊ–āŊŸāŊŧāŧ‹āŊ–āŊ āŊ˛āŧ‹āŊ‘āŊ´āŊĻāŧ‹āŊšāŊŧāŊ‘āŧ (yyyy/MM/dd HH:mm:ss)", - "creator": "āŊ–āŊŸāŊŧāŧ‹āŊ˜āŊāŊ“āŧ", - "keywords": "āŊ‚āŊ“āŊ‘āŧ‹āŊšāŊ˛āŊ‚", - "modDate": "āŊ–āŊŸāŊŧāŧ‹āŊ–āŊ…āŊŧāŊĻāŧ‹āŊ‘āŊ´āŊĻāŧ‹āŊšāŊŧāŊ‘āŧ (yyyy/MM/dd HH:mm:ss)", - "producer": "āŊĻāžāž˛āŊ´āŊ“āŧ‹āŊ˜āŊāŊ“āŧ", - "subject": "āŊ–āŊĸāž—āŊŧāŊ‘āŧ‹āŊ‚āŊžāŊ˛āŧ", - "trapped": "āŊ–āŊŸāŊ´āŊ„āŧ‹āŊ–āŧ", - "submit": "āŊ–āŊĻāž’āžąāŊ´āŊĸāŧ‹āŊ–āŧ" + "modDate": "āŊ–āŊŸāŊŧāŧ‹āŊ–āŊ…āŊŧāŊĻāŧ‹āŊ‘āŊ´āŊĻāŧ‹āŊšāŊŧāŊ‘āŧ (yyyy/MM/dd HH:mm:ss)" }, "fileToPDF": { "tags": "āŊ–āŊĻāž’āžąāŊ´āŊĸāŧ‹āŊ–āŊ…āŊŧāŊĻāŧ,āŊĸāžŖāŊ˜āŧ‹āŊ‚āŊžāŊ‚,āŊĄāŊ˛āŊ‚āŧ‹āŊ†āŧ,āŊ”āŊĸāŧ,āŊĻāžŸāŊŧāŊ“āŧ‹āŊ–āžąāŊēāŊ‘āŧ,āŊĄāŊ˛āŧ‹āŊ‚āŊē,āŊ–āŊĻāž’āžąāŊ´āŊĸāŧ‹āŊ–āŧ,āŊĄāŊ˛āŊ‚āŧ‹āŊšāŊ„āŧ‹āŧ,docs,word,excel,powerpoint", @@ -812,6 +1876,7 @@ "ocr": { "tags": "āŊ„āŊŧāŊĻāŧ‹āŊ āŊ›āŊ˛āŊ“āŧ,āŊĄāŊ˛āŧ‹āŊ‚āŊē,āŊ”āŊĸāŧ‹āŊĸāŊ˛āŊĻāŧ,āŊ–āŊ¤āŊēāŊĸāŧ‹āŊ āŊ–āŊēāŊ–āŊĻāŧ,āŊ€āžŗāŊŧāŊ‚āŧ‹āŊ”āŧ,āŊ„āŊŧāŊĻāŧ‹āŊ āŊ›āŊ˛āŊ“āŧ,āŊ āŊšāŊŧāŊŖāŧ‹āŊžāŊ˛āŊ–āŧ,āŊĸāžŠāŊŧāŊ˜āŧ‹āŊĻāž’āž˛āŊ˛āŊ‚āŧ‹āŊĸāŊ´āŊ„āŧ‹āŊ–āŧ", "title": "OCR / āŊ–īŋŊāŊēāŊĸāŧ‹āŊ āŊ–āŊēāŊ–āŊĻāŧ‹āŊ‚āŊ™āŊ„āŧ‹āŊĻāŊēāŊŖāŧ", + "desc": "Cleanup scans and detects text from images within a PDF and re-adds it as text.", "header": "āŊ–āŊ¤āŊēāŊĸāŧ‹āŊ āŊ–āŊēāŊ–āŊĻāŧ‹āŊ‚āŊ™āŊ„āŧ‹āŊĻāŊēāŊŖāŧ / OCR (āŊ āŊŧāŊ‘āŧ‹āŊ€āžąāŊ˛āŧ‹āŊĄāŊ˛āŊ‚āŧ‹āŊ āŊ–āž˛āŊ´āŧ‹āŊ„āŊŧāŊĻāŧ‹āŊ āŊ›āŊ˛āŊ“āŧ)", "selectText": { "1": "PDF āŊ“āŊ„āŧ‹āŊ‘āŊ´āŧ‹āŊ„āŊŧāŊĻāŧ‹āŊ āŊ›āŊ˛āŊ“āŧ‹āŊ–āžąāŧ‹āŊĸāž’āžąāŊ´āŊ āŊ˛āŧ‹āŊĻāžāŊ‘āŧ‹āŊĄāŊ˛āŊ‚āŧ‹āŊ āŊ‘āŊēāŊ˜āŊĻāŧ‹āŊ”āŧ (āŊ–āŊ€āŊŧāŊ‘āŧ‹āŊ”āŧ‹āŊĸāžŖāŊ˜āŊĻāŧ‹āŊ“āŊ˛āŧ‹āŊ‘āŧ‹āŊŖāžŸāŧ‹āŊ„āŊŧāŊĻāŧ‹āŊ āŊ›āŊ˛āŊ“āŧ‹āŊ–āžąāŊĻāŧ‹āŊŸāŊ˛āŊ“āŧ‹āŊ”āŧ‹āŊĄāŊ˛āŊ“āŧ)", @@ -829,7 +1894,91 @@ }, "help": "āŊĻāžāŊ‘āŧ‹āŊĄāŊ˛āŊ‚āŧ‹āŊ‚āŊžāŊ“āŧ‹āŊ‘āŊ‚āŧ‹āŊ‚āŊ˛āŧ‹āŊ†āŊēāŊ‘āŧ‹āŊ‘āŊ´āŧ‹āŊ–āŊēāŊ‘āŧ‹āŊĻāž¤āžąāŊŧāŊ‘āŧ‹āŊ–āžąāŊēāŊ‘āŧ‹āŊĻāžŸāŊ„āŊĻāŧ‹āŊ‘āŊ„āŧ‹/āŊĄāŊ„āŧ‹āŊ“āŧ‹ docker āŊ˜āŊ˛āŊ“āŧ‹āŊ”āŊ āŊ˛āŧ‹āŊ–āŊēāŊ‘āŧ‹āŊĻāž¤āžąāŊŧāŊ‘āŧ‹āŊ€āžąāŊ˛āŧ‹āŊ†āŊēāŊ‘āŧ‹āŊ‘āŊ´āŧ‹āŊĄāŊ˛āŊ‚āŧ‹āŊ†āŧ‹āŊ āŊ‘āŊ˛āŧ‹āŊ€āžŗāŊŧāŊ‚āŧ‹āŊĸāŊŧāŊ‚āŊĻāŧ", "credit": "āŊžāŊ–āŊĻāŧ‹āŊžāŊ´āŧ‹āŊ āŊ‘āŊ˛āŊĻāŧ‹ OCR āŊ‚āžąāŊ˛āŧ‹āŊ†āŊēāŊ‘āŧ‹āŊ‘āŊ´āŧ‹ qpdf āŊ‘āŊ„āŧ‹ Tesseract āŊ–āŊēāŊ‘āŧ‹āŊĻāž¤āžąāŊŧāŊ‘āŧ‹āŊ–āžąāŊēāŊ‘āŧ‹āŊ”āŧ", - "submit": "OCR āŊ–āŊĸāž’āžąāŊ´āŊ‘āŧ‹āŊ“āŊĻāŧ‹ PDF āŊ–āŊ€āŊŧāŊŖāŧ‹āŊĻāž¤āžąāŊŧāŊ‘āŧ" + "submit": "OCR āŊ–āŊĸāž’āžąāŊ´āŊ‘āŧ‹āŊ“āŊĻāŧ‹ PDF āŊ–āŊ€āŊŧāŊŖāŧ‹āŊĻāž¤āžąāŊŧāŊ‘āŧ", + "operation": { + "submit": "Process OCR and Review" + }, + "results": { + "title": "OCR Results" + }, + "languagePicker": { + "additionalLanguages": "Looking for additional languages?", + "viewSetupGuide": "View setup guide →" + }, + "settings": { + "title": "Settings", + "ocrMode": { + "label": "OCR Mode", + "auto": "Auto (skip text layers)", + "force": "Force (re-OCR all, replace text)", + "strict": "Strict (abort if text found)" + }, + "languages": { + "label": "Languages", + "placeholder": "Select languages" + }, + "compatibilityMode": { + "label": "Compatibility Mode" + }, + "advancedOptions": { + "label": "Processing Options", + "sidecar": "Create a text file", + "deskew": "Deskew pages", + "clean": "Clean input file", + "cleanFinal": "Clean final output" + } + }, + "tooltip": { + "header": { + "title": "OCR Settings Overview" + }, + "mode": { + "title": "OCR Mode", + "text": "Optical Character Recognition (OCR) helps you turn scanned or screenshotted pages into text you can search, copy, or highlight.", + "bullet1": "Auto skips pages that already contain text layers.", + "bullet2": "Force re-OCRs every page and replaces all the text.", + "bullet3": "Strict halts if any selectable text is found." + }, + "languages": { + "title": "Languages", + "text": "Improve OCR accuracy by specifying the expected languages. Choose one or more languages to guide detection." + }, + "output": { + "title": "Output", + "text": "Decide how you want the text output formatted:", + "bullet1": "Searchable PDF embeds text behind the original image.", + "bullet2": "HOCR XML returns a structured machine-readable file.", + "bullet3": "Plain-text sidecar creates a separate .txt file with raw content." + }, + "advanced": { + "header": { + "title": "Advanced OCR Processing" + }, + "compatibility": { + "title": "Compatibility Mode", + "text": "Uses OCR 'sandwich PDF' mode: results in larger files, but more reliable with certain languages and older PDF software. By default we use hOCR for smaller, modern PDFs." + }, + "sidecar": { + "title": "Create Text File", + "text": "Generates a separate .txt file alongside the PDF containing all extracted text content for easy access and processing." + }, + "deskew": { + "title": "Deskew Pages", + "text": "Automatically corrects skewed or tilted pages to improve OCR accuracy. Useful for scanned documents that weren't perfectly aligned." + }, + "clean": { + "title": "Clean Input File", + "text": "Preprocesses the input by removing noise, enhancing contrast, and optimising the image for better OCR recognition before processing." + }, + "cleanFinal": { + "title": "Clean Final Output", + "text": "Post-processes the final PDF by removing OCR artefacts and optimising the text layer for better readability and smaller file size." + } + } + }, + "error": { + "failed": "OCR operation failed" + } }, "extractImages": { "tags": "āŊ”āŊĸāŧ,āŊ āŊ‘āž˛āŧ‹āŊ”āŊĸāŧ,āŊ‰āŊĸāŧ‹āŊšāŊ‚āŊĻāŧ,āŊĄāŊ˛āŊ‚āŧ‹āŊ˜āŊ›āŊŧāŊ‘āŧ,zip,āŊ āŊ›āŊ˛āŊ“āŧ‹āŊ”āŧ,āŊŖāŊēāŊ“āŧ‹āŊ”āŧ", @@ -837,7 +1986,13 @@ "header": "Extract Images", "selectText": "āŊ•āžąāŊ˛āŊĸāŧ‹āŊ–āŊāŊŧāŊ“āŧ‹āŊ”āŊ āŊ˛āŧ‹āŊ”āŊĸāŧ‹āŊĸāŊ˛āŊĻāŧ‹āŊĸāžŖāŊ˜āŊĻāŧ‹āŊ–āŊĻāž’āžąāŊ´āŊĸāŧ‹āŊĸāž’āžąāŊ´āŊ āŊ˛āŧ‹āŊ”āŊĸāŧ‹āŊĸāŊ˛āŊĻāŧ‹āŊĸāžŖāŊ˜āŧ‹āŊ‚āŊžāŊ‚āŧ‹āŊ āŊ‘āŊēāŊ˜āŊĻāŧ‹āŊ”āŧ", "allowDuplicates": "āŊ–āŊĻāžāžąāŊĸāŧ‹āŊŸāžŗāŊŧāŊĻāŧ‹āŊ”āŊĸāŧ‹āŊĸāŊ˛āŊĻāŧ‹āŊ‰āŊĸāŧ‹āŊšāŊ‚āŊĻāŧ", - "submit": "āŊ•āžąāŊ˛āŊĸāŧ‹āŊ āŊ‘āŊŧāŊ“āŧ" + "submit": "āŊ•āžąāŊ˛āŊĸāŧ‹āŊ āŊ‘āŊŧāŊ“āŧ", + "settings": { + "title": "Settings" + }, + "error": { + "failed": "An error occurred while extracting images from the PDF." + } }, "pdfToPDFA": { "tags": "āŊĄāŊ˛āŊ‚āŧ‹āŊ˜āŊ›āŊŧāŊ‘āŧ,āŊ‘āŊ´āŊĻāŧ‹āŊĄāŊ´āŊ“āŧ‹āŊĸāŊ˛āŊ„āŧ‹āŊ”āŊŧāŧ,āŊšāŊ‘āŧ‹āŊŖāžĄāŊ“āŧ,āŊ–āŊĻāž’āžąāŊ´āŊĸāŧ‹āŊ–āŧ,āŊ‰āŊĸāŧ‹āŊšāŊ‚āŊĻāŧ,āŊĻāž˛āŊ´āŊ„āŧ‹āŊĻāžāžąāŊŧāŊ–āŧ", @@ -909,17 +2064,53 @@ }, "info": "Python āŊĻāž’āž˛āŊ˛āŊ‚āŧ‹āŊ āŊ‡āŊ´āŊ‚āŧ‹āŊ–āžąāŊĻāŧ‹āŊ˜āŊ˛āŧ‹āŊ āŊ‘āŊ´āŊ‚ āŊ āŊ‘āŊ˛āŧ‹āŊ–āŊ€āŊŧāŊŖāŧ‹āŊĻāž¤āžąāŊŧāŊ‘āŧ‹āŊ–āžąāŊēāŊ‘āŧ‹āŊ”āŊĸāŧ‹āŊ‘āŊ‚āŊŧāŊĻāŧ‹āŊ˜āŊāŊŧāŧ‹āŊĄāŊ˛āŊ“āŧ" }, + "scannerImageSplit": { + "title": "Extracted Images", + "submit": "Extract Image Scans", + "error": { + "failed": "An error occurred while extracting image scans." + }, + "tooltip": { + "title": "Photo Splitter", + "whatThisDoes": "What this does", + "whatThisDoesDesc": "Automatically finds and extracts each photo from a scanned page or composite image—no manual cropping.", + "whenToUse": "When to use", + "useCase1": "Scan whole album pages in one go", + "useCase2": "Split flatbed batches into separate files", + "useCase3": "Break collages into individual photos", + "useCase4": "Pull photos from documents", + "quickFixes": "Quick fixes", + "problem1": "Photos not detected → increase Tolerance to 30-50", + "problem2": "Too many false detections → increase Minimum Area to 15,000-20,000", + "problem3": "Crops are too tight → increase Border Size to 5-10", + "problem4": "Tilted photos not straightened → lower Angle Threshold to ~5°", + "problem5": "Dust/noise boxes → increase Minimum Contour Area to 1000-2000", + "setupTips": "Setup tips", + "tip1": "Use a plain, light background", + "tip2": "Leave a small gap (≈1 cm) between photos", + "tip3": "Scan at 300-600 DPI", + "tip4": "Clean the scanner glass", + "headsUp": "Heads-up", + "headsUpDesc": "Overlapping photos or backgrounds very close in colour to the photos can reduce accuracy-try a lighter or darker background and leave more space." + } + }, "sign": { - "tags": "āŊ‘āŊ–āŊ„āŧ‹āŊĻāž¤āž˛āŊŧāŊ‘āŧ,āŊ˜āŊ˛āŊ„āŧ‹āŊĸāžŸāŊ‚āŊĻāŧ‹āŊāŊ´āŊ„āŧ‹āŊ„āŊ´āŧ‹āŧ,āŊ–āž˛āŊ˛āŊĻāŧ‹āŊ”āŊ āŊ˛āŧ‹āŊ˜āŊ˛āŊ„āŧ‹āŊĸāžŸāŊ‚āŊĻāŧ,āŊĄāŊ˛āŧ‹āŊ‚āŊēāŊ āŊ˛āŧ‹āŊ˜āŊ˛āŊ„āŧ‹āŊĸāžŸāŊ‚āŊĻāŧ,āŊ”āŊĸāŧ‹āŊĸāŊ˛āŊĻāŧ‹āŊ˜āŊ˛āŊ„āŧ‹āŊĸāžŸāŊ‚āŊĻāŧ", "title": "āŊ˜āŊ˛āŊ„āŧ‹āŊĸāžŸāŊ‚āŊĻāŧ", "header": "PDF āŊŖāŧ‹āŊ˜āŊ˛āŊ„āŧ‹āŊĸāžŸāŊ‚āŊĻāŧ‹āŊĸāž’āžąāŊ‚āŧ‹āŊ”āŧ", "upload": "āŊ”āŊĸāŧ‹āŊĸāŊ˛āŊĻāŧ‹āŊĄāŊĸāŧ‹āŊ āŊ‡āŊŧāŊ‚", - "draw": "āŊ˜āŊ˛āŊ„āŧ‹āŊĸāžŸāŊ‚āŊĻāŧ‹āŊ āŊ–āž˛āŊ˛āŧ‹āŊ–āŧ", - "text": "āŊĄāŊ˛āŧ‹āŊ‚āŊēāŧ‹āŊ āŊ‡āŊ´āŊ‚āŧ‹āŊ”āŧ", + "draw": { + "title": "Draw your signature", + "clear": "Clear" + }, + "text": { + "name": "Signer Name", + "placeholder": "Enter your full name" + }, "clear": "āŊ‚āŊ™āŊ„āŧ‹āŊĻāŊēāŊŖāŧ", "add": "āŊĻāžŖāŊŧāŊ“āŧ‹āŊ”āŧ", "saved": "āŊ‰āŊĸāŧ‹āŊšāŊ‚āŊĻāŧ‹āŊ–āžąāŊĻāŧ‹āŊ”āŊ āŊ˛āŧ‹āŊ˜āŊ˛āŊ„āŧ‹āŊĸāžŸāŊ‚āŊĻāŧ", "save": "āŊ˜āŊ˛āŊ„āŧ‹āŊĸāžŸāŊ‚āŊĻāŧ‹āŊ‰āŊĸāŧ‹āŊšāŊ‚āŊĻāŧ", + "applySignatures": "Apply Signatures", "personalSigs": "āŊĻāž’āŊēāŊĸāŧ‹āŊ‚āžąāŊ˛āŧ‹āŊ˜āŊ˛āŊ„āŧ‹āŊĸāžŸāŊ‚āŊĻāŧ", "sharedSigs": "āŊ˜āŊ‰āŊ˜āŧ‹āŊĻāž¤āžąāŊŧāŊ‘āŧ‹āŊ˜āŊ˛āŊ„āŧ‹āŊĸāžŸāŊ‚āŊĻāŧ", "noSavedSigs": "āŊ‰āŊĸāŧ‹āŊšāŊ‚āŊĻāŧ‹āŊ–āžąāŊĻāŧ‹āŊ”āŊ āŊ˛āŧ‹āŊ˜āŊ˛āŊ„āŧ‹āŊĸāžŸāŊ‚āŊĻāŧ‹āŊ˜āŧ‹āŊĸāž™āŊēāŊ‘āŧ", @@ -931,36 +2122,179 @@ "previous": "āŊ¤āŊŧāŊ‚āŧ‹āŊ„āŊŧāŊĻāŧ‹āŊĻāž”āŊŧāŊ“āŧ‹āŊ˜āŧ", "maintainRatio": "āŊ–āŊĻāžĄāŊ´āŊĸāŧ‹āŊšāŊ‘āŧ‹āŊĸāž’āžąāŊ´āŊ“āŧ‹āŊ āŊāžąāŊŧāŊ„āŊĻāŧ‹āŊĻāž’āŊŧāŧ‹āŊĸāž’āžąāŊ‚āŧ‹āŊ”āŧ", "undo": "Undo", - "redo": "Redo" + "redo": "Redo", + "submit": "Sign Document", + "steps": { + "configure": "Configure Signature" + }, + "type": { + "title": "Signature Type", + "draw": "Draw", + "canvas": "Canvas", + "image": "Image", + "text": "Text" + }, + "image": { + "label": "Upload signature image", + "placeholder": "Select image file", + "hint": "Upload a PNG or JPG image of your signature" + }, + "instructions": { + "title": "How to add signature", + "canvas": "After drawing your signature in the canvas, close the modal then click anywhere on the PDF to place it.", + "image": "After uploading your signature image above, click anywhere on the PDF to place it.", + "text": "After entering your name above, click anywhere on the PDF to place your signature." + }, + "mode": { + "move": "Move Signature", + "place": "Place Signature" + }, + "updateAndPlace": "Update and Place", + "activate": "Activate Signature Placement", + "deactivate": "Stop Placing Signatures", + "results": { + "title": "Signature Results" + }, + "error": { + "failed": "An error occurred while signing the PDF." + }, + "tags": "āŊ‘āŊ–āŊ„āŧ‹āŊĻāž¤āž˛āŊŧāŊ‘āŧ,āŊ˜āŊ˛āŊ„āŧ‹āŊĸāžŸāŊ‚āŊĻāŧ‹āŊāŊ´āŊ„āŧ‹āŊ„āŊ´āŧ‹āŧ,āŊ–āž˛āŊ˛āŊĻāŧ‹āŊ”āŊ āŊ˛āŧ‹āŊ˜āŊ˛āŊ„āŧ‹āŊĸāžŸāŊ‚āŊĻāŧ,āŊĄāŊ˛āŧ‹āŊ‚āŊēāŊ āŊ˛āŧ‹āŊ˜āŊ˛āŊ„āŧ‹āŊĸāžŸāŊ‚āŊĻāŧ,āŊ”āŊĸāŧ‹āŊĸāŊ˛āŊĻāŧ‹āŊ˜āŊ˛āŊ„āŧ‹āŊĸāžŸāŊ‚āŊĻāŧ" }, "flatten": { - "tags": "āŊĻāž™āŊŧāŊ˜āŊĻāŧ‹āŊ”āŧ,āŊ āŊ‚āŊēāŊ„āŊĻāŧ‹āŊ¤āŊŧāŊ‚,āŊĻāž¤āžąāŊŧāŊ‘āŧ‹āŊĻāž’āŊŧāŧ,āŊ†āŧ‹āŊ¤āŊĻāŧ,āŊĻāŊ´āŊ–āŧ‹āŊ”āŧ", "title": "āŊĻāž™īŋŊāŊ˜āŊĻāŧ‹āŊ”āŧ", "header": "PDF āŊĻāž™āŊŧāŊ˜āŊĻāŧ‹āŊ”āŧ", "flattenOnlyForms": "āŊ āŊ‚āŊēāŊ„āŊĻāŧ‹āŊ¤āŊŧāŊ‚āŧ‹āŊāŊŧāŧ‹āŊ“āŧ‹āŊĻāž™āŊŧāŊ˜āŊĻāŧ‹āŊ”āŧ", - "submit": "āŊĻāž™āŊŧāŊ˜āŊĻāŧ‹āŊ”āŧ" + "submit": "āŊĻāž™āŊŧāŊ˜āŊĻāŧ‹āŊ”āŧ", + "filenamePrefix": "flattened", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "steps": { + "settings": "Settings" + }, + "options": { + "stepTitle": "Flatten Options", + "title": "Flatten Options", + "flattenOnlyForms": { + "label": "Flatten only forms", + "desc": "Only flatten form fields, leaving other interactive elements intact" + }, + "note": "Flattening removes interactive elements from the PDF, making them non-editable." + }, + "results": { + "title": "Flatten Results" + }, + "error": { + "failed": "An error occurred while flattening the PDF." + }, + "tooltip": { + "header": { + "title": "About Flattening PDFs" + }, + "description": { + "title": "What does flattening do?", + "text": "Flattening makes your PDF non-editable by turning fillable forms and buttons into regular text and images. The PDF will look exactly the same, but no one can change or fill in the forms anymore. Perfect for sharing completed forms, creating final documents for records, or ensuring the PDF looks the same everywhere.", + "bullet1": "Text boxes become regular text (can't be edited)", + "bullet2": "Checkboxes and buttons become pictures", + "bullet3": "Great for final versions you don't want changed", + "bullet4": "Ensures consistent appearance across all devices" + }, + "formsOnly": { + "title": "What does 'Flatten only forms' mean?", + "text": "This option only removes the ability to fill in forms, but keeps other features working like clicking links, viewing bookmarks, and reading comments.", + "bullet1": "Forms become non-editable", + "bullet2": "Links still work when clicked", + "bullet3": "Comments and notes remain visible", + "bullet4": "Bookmarks still help you navigate" + } + }, + "tags": "āŊĻāž™āŊŧāŊ˜āŊĻāŧ‹āŊ”āŧ,āŊ āŊ‚āŊēāŊ„āŊĻāŧ‹āŊ¤āŊŧāŊ‚,āŊĻāž¤āžąāŊŧāŊ‘āŧ‹āŊĻāž’āŊŧāŧ,āŊ†āŧ‹āŊ¤āŊĻāŧ,āŊĻāŊ´āŊ–āŧ‹āŊ”āŧ" }, "repair": { "tags": "āŊĻāžāžąāŊŧāŊ“āŧ‹āŊĻāŊēāŊŖāŧ,āŊ–āŊŸāŊŧāŧ‹āŊ–āŊ…āŊŧāŊĻāŧ,āŊ‚āŊĻāŊŧāŧ‹āŊ–āŧ,āŊŖāŊēāŊ‚āŊĻāŧ‹āŊ–āŊ…āŊŧāŊĻāŧ", "title": "āŊ–āŊŸāŊŧāŧ‹āŊ–āŊ…āŊŧāŊĻāŧ", "header": "PDF āŊ–āŊŸāŊŧāŧ‹āŊ–āŊ…āŊŧāŊĻāŧ", - "submit": "āŊ–āŊŸāŊŧāŧ‹āŊ–āŊ…āŊŧāŊĻāŧ" + "submit": "āŊ–āŊŸāŊŧāŧ‹āŊ–āŊ…āŊŧāŊĻāŧ", + "description": "This tool will attempt to repair corrupted or damaged PDF files. No additional settings are required.", + "filenamePrefix": "repaired", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst repairing the PDF." + }, + "results": { + "title": "Repair Results" + } }, "removeBlanks": { - "tags": "āŊĻāžŸāŊŧāŊ„āŧ‹āŊ¤āŊŧāŊ‚āŧ‹āŊĻāŊ´āŊ–āŧ‹āŊ”āŧ āŊĻāžŸāŊŧāŊ„āŧ‹āŊ”āŧ‹āŊĻāŊ´āŊ–āŧ‹āŊ”āŧ āŊ‘āŊ€āŊĸāŧ‹āŊ¤āŊŧāŊ‚āŧ‹āŊĻāŊ´āŊ–āŧ‹āŊ”āŧ PDF āŊĻāžŸāŊŧāŊ„āŧ‹āŊ¤āŊŧāŊ‚āŧ‹āŊĻāŊ´āŊ–āŧ‹āŊ”āŧ", "title": "āŊĻāžŸāŊŧāŊ„āŧ‹āŊ¤āŊŧāŊ‚āŧ‹āŊĻāŊ´āŊ–āŧ‹āŊ”āŧ", "header": "āŊĻāžŸāŊŧāŊ„āŧ‹āŊ”āŊ āŊ˛āŧ‹āŊ¤āŊŧāŊ‚āŧ‹āŊ„āŊŧāŊĻāŧ‹āŊĻāŊ´āŊ–āŧ‹āŊ”āŧ", - "threshold": "āŊ”āŊ˛āŊ‚āŧ‹āŊŸāŊēāŊŖāŧ‹āŊ‘āŊ€āŊĸāŧ‹āŊ”āŊŧāŊ āŊ˛āŧ‹āŊ˜āŊšāŊ˜āŊĻāŧ‹āŊšāŊ‘āŧ", + "settings": { + "title": "Settings" + }, + "threshold": { + "label": "Pixel Whiteness Threshold" + }, + "whitePercent": { + "label": "White Percentage Threshold", + "unit": "%" + }, + "includeBlankPages": { + "label": "Include detected blank pages" + }, + "tooltip": { + "header": { + "title": "Remove Blank Pages Settings" + }, + "threshold": { + "title": "Pixel Whiteness Threshold", + "text": "Controls how white a pixel must be to be considered 'white'. This helps determine what counts as a blank area on the page.", + "bullet1": "0 = Pure black (most restrictive)", + "bullet2": "128 = Medium grey", + "bullet3": "255 = Pure white (least restrictive)" + }, + "whitePercent": { + "title": "White Percentage Threshold", + "text": "Sets the minimum percentage of white pixels required for a page to be considered blank and removed.", + "bullet1": "Lower values (e.g., 80%) = More pages removed", + "bullet2": "Higher values (e.g., 95%) = Only very blank pages removed", + "bullet3": "Use higher values for documents with light backgrounds" + }, + "includeBlankPages": { + "title": "Include Detected Blank Pages", + "text": "When enabled, creates a separate PDF containing all the blank pages that were detected and removed from the original document.", + "bullet1": "Useful for reviewing what was removed", + "bullet2": "Helps verify the detection accuracy", + "bullet3": "Can be disabled to reduce output file size" + } + }, + "submit": "āŊĻāžŸāŊŧāŊ„āŧ‹āŊ¤āŊŧāŊ‚āŧ‹āŊĻāŊ´āŊ–āŧ‹āŊ”āŧ", + "error": { + "failed": "Failed to remove blank pages" + }, + "results": { + "title": "Removed Blank Pages" + }, + "tags": "āŊĻāžŸāŊŧāŊ„āŧ‹āŊ¤āŊŧāŊ‚āŧ‹āŊĻāŊ´āŊ–āŧ‹āŊ”āŧ āŊĻāžŸāŊŧāŊ„āŧ‹āŊ”āŧ‹āŊĻāŊ´āŊ–āŧ‹āŊ”āŧ āŊ‘āŊ€āŊĸāŧ‹āŊ¤āŊŧāŊ‚āŧ‹āŊĻāŊ´āŊ–āŧ‹āŊ”āŧ PDF āŊĻāžŸāŊŧāŊ„āŧ‹āŊ¤āŊŧāŊ‚āŧ‹āŊĻāŊ´āŊ–āŧ‹āŊ”āŧ", "thresholdDesc": "āŊ”āŊ˛āŊ‚āŧ‹āŊŸāŊēāŊŖāŧ‹āŊ‘āŊ€āŊĸāŧ‹āŊ”āŊŧāŧ‹āŊžāŊ˛āŊ‚āŧ‹'āŊ‘āŊ€āŊĸāŧ‹āŊ”āŊŧāŧ‹'āŊĸāŊ´āŧ‹āŊĸāžŠāŊ˛āŧ‹āŊ–āŊ āŊ˛āŧ‹āŊ‘āŊ€āŊĸāŧ‹āŊšāŊ‘āŧ‹āŊ€āžąāŊ˛āŧ‹āŊ˜āŊšāŊ˜āŊĻāŧ 0 = āŊ“āŊ‚āŧ‹āŊ”āŊŧāŧ 255 āŊ‘āŊ€āŊĸāŧ‹āŊ”āŊŧāŧ‹āŊ‚āŊ™āŊ„āŧ‹āŊ˜āŧ", - "whitePercent": "āŊ‘āŊ€āŊĸāŧ‹āŊ”āŊŧāŊ āŊ˛āŧ‹āŊ–āŊĸāž’āžąāŧ‹āŊ†āŧ (%)", - "whitePercentDesc": "āŊĻāŊ´āŊ–āŧ‹āŊĸāž’āžąāŊ´āŊ āŊ˛āŧ‹āŊ¤āŊŧāŊ‚āŧ‹āŊ„āŊŧāŊĻāŧ‹āŊ¤āŊ˛āŊ‚āŧ‹āŊ‚āŊ˛āŧ‹'āŊ‘āŊ€āŊĸāŧ‹āŊ”āŊŧāŊ āŊ˛āŧ‹'āŊ”āŊ˛āŊ‚āŧ‹āŊŸāŊēāŊŖāŧ‹āŊ‚āžąāŊ˛āŧ‹āŊ–āŊĸāž’āžąāŧ‹āŊ†āŧ", - "submit": "āŊĻāžŸāŊŧāŊ„āŧ‹āŊ¤āŊŧāŊ‚āŧ‹āŊĻāŊ´āŊ–āŧ‹āŊ”āŧ" + "whitePercentDesc": "āŊĻāŊ´āŊ–āŧ‹āŊĸāž’āžąāŊ´āŊ āŊ˛āŧ‹āŊ¤āŊŧāŊ‚āŧ‹āŊ„āŊŧāŊĻāŧ‹āŊ¤āŊ˛āŊ‚āŧ‹āŊ‚āŊ˛āŧ‹'āŊ‘āŊ€āŊĸāŧ‹āŊ”āŊŧāŊ āŊ˛āŧ‹'āŊ”āŊ˛āŊ‚āŧ‹āŊŸāŊēāŊŖāŧ‹āŊ‚āžąāŊ˛āŧ‹āŊ–āŊĸāž’āžąāŧ‹āŊ†āŧ" }, "removeAnnotations": { "tags": "āŊ˜āŊ†āŊ“āŧ‹āŊ āŊ‚āž˛āŊēāŊŖāŧ‹āŊĻāŊ´āŊ–āŧ‹āŊ”āŧ āŊ‘āŊ”āžąāŊ‘āŧ‹āŊ–āŊĸāž—āŊŧāŊ‘āŧ‹āŊĻāŊ´āŊ–āŧ‹āŊ”āŧ āŊ˜āŊ†āŊ“āŧ‹āŊ–āŊ´āŧ‹āŊĻāŊ´āŊ–āŧ‹āŊ”āŧ PDF āŊ˜āŊ†āŊ“āŧ‹āŊ āŊ‚āž˛āŊēāŊŖāŧ‹āŊĻāŊ´āŊ–āŧ‹āŊ”āŧ", "title": "āŊ˜āŊ†āŊ“āŧ‹āŊ āŊ‚āž˛āŊēāŊŖāŧ‹āŊĻāŊ´āŊ–āŧ‹āŊ”āŧ", "header": "āŊ˜āŊ†āŊ“āŧ‹āŊ āŊ‚āž˛āŊēāŊŖāŧ‹āŊĻāŊ´āŊ–āŧ‹āŊ”āŧ", - "submit": "āŊĻāŊ´āŊ–āŧ‹āŊ”āŧ" + "submit": "āŊĻāŊ´āŊ–āŧ‹āŊ”āŧ", + "settings": { + "title": "Settings" + }, + "info": { + "title": "About Remove Annotations", + "description": "This tool will remove all annotations (comments, highlights, notes, etc.) from your PDF documents." + }, + "error": { + "failed": "An error occurred while removing annotations from the PDF." + } }, "compare": { "tags": "āŊ–āŊĻāžĄāŊ´āŊĸāŧ‹āŊ–āŧ āŊāžąāŊ‘āŧ‹āŊ”āŊĸāŧ āŊžāŊ˛āŊ–āŧ‹āŊ–āŊĻāžĄāŊ´āŊĸāŧ āŊ‚āŊ¤āŊ˛āŊ–āŧ‹āŊ–āŊĻāžĄāŊ´āŊĸāŧ PDF āŊ–āŊĻāžĄāŊ´āŊĸāŧ‹āŊ–āŧ", @@ -992,6 +2326,142 @@ "certSign": { "tags": "āŊĸāŧ‹āŊĻāž¤āž˛āŊŧāŊ‘āŧ,PEM,P12,āŊ‚āŊžāŊ´āŊ„āŧ‹āŊ āŊ–āž˛āŊēāŊŖāŧ,āŊ‚āŊĻāŊ„āŧ‹āŊĻāžĄāŊŧāŊ˜āŧ", "title": "āŊŖāŊ‚āŧ‹āŊāžąāŊēāŊĸāŧ‹āŊ˜āŊ˛āŊ„āŧ‹āŊĸāžŸāŊ‚āŊĻāŧ", + "filenamePrefix": "signed", + "signMode": { + "stepTitle": "Sign Mode", + "tooltip": { + "header": { + "title": "About PDF Signatures" + }, + "overview": { + "title": "How signatures work", + "text": "Both modes seal the document (any edits are flagged as tampering) and record who/when/how for auditing. Viewer trust depends on the certificate chain." + }, + "manual": { + "title": "Manual - Bring your certificate", + "text": "Use your own certificate files for brand-aligned identity. Can display Trusted when your CA/chain is recognised.", + "use": "Use for: customer-facing, legal, compliance." + }, + "auto": { + "title": "Auto - Zero-setup, instant system seal", + "text": "Signs with a server self-signed certificate. Same tamper-evident seal and audit trail; typically shows Unverified in viewers.", + "use": "Use when: you need speed and consistent internal identity across reviews and records." + }, + "rule": { + "title": "Rule of thumb", + "text": "Need recipient Trusted status? Manual. Need a fast, tamper-evident seal and audit trail with no setup? Auto." + } + } + }, + "certTypeStep": { + "stepTitle": "Certificate Format" + }, + "certFiles": { + "stepTitle": "Certificate Files" + }, + "appearance": { + "stepTitle": "Signature Appearance", + "tooltip": { + "header": { + "title": "About Signature Appearance" + }, + "invisible": { + "title": "Invisible Signatures", + "text": "The signature is added to the PDF for security but won't be visible when viewing the document. Perfect for legal requirements without changing the document's appearance.", + "bullet1": "Provides security without visual changes", + "bullet2": "Meets legal requirements for digital signing", + "bullet3": "Doesn't affect document layout or design" + }, + "visible": { + "title": "Visible Signatures", + "text": "Shows a signature block on the PDF with your name, date, and optional details. Useful when you want readers to clearly see the document is signed.", + "bullet1": "Shows signer name and date on the document", + "bullet2": "Can include reason and location for signing", + "bullet3": "Choose which page to place the signature", + "bullet4": "Optional logo can be included" + } + }, + "invisible": "Invisible", + "options": { + "title": "Signature Details" + }, + "visible": "Visible" + }, + "sign": { + "submit": "Sign PDF", + "results": "Signed PDF" + }, + "error": { + "failed": "An error occurred whilst processing signatures." + }, + "tooltip": { + "header": { + "title": "About Managing Signatures" + }, + "overview": { + "title": "What can this tool do?", + "text": "This tool lets you check if your PDFs are digitally signed and add new digital signatures. Digital signatures prove who created or approved a document and show if it has been changed since signing.", + "bullet1": "Check existing signatures and their validity", + "bullet2": "View detailed information about signers and certificates", + "bullet3": "Add new digital signatures to secure your documents", + "bullet4": "Multiple files supported with easy navigation" + }, + "validation": { + "title": "Checking Signatures", + "text": "When you check signatures, the tool tells you if they're valid, who signed the document, when it was signed, and whether the document has been changed since signing.", + "bullet1": "Shows if signatures are valid or invalid", + "bullet2": "Displays signer information and signing date", + "bullet3": "Checks if the document was modified after signing", + "bullet4": "Can use custom certificates for verification" + }, + "signing": { + "title": "Adding Signatures", + "text": "To sign a PDF, you need a digital certificate (like PEM, PKCS12, or JKS). You can choose to make the signature visible on the document or keep it invisible for security only.", + "bullet1": "Supports PEM, PKCS12, JKS, and server certificate formats", + "bullet2": "Option to show or hide signature on the PDF", + "bullet3": "Add reason, location, and signer name", + "bullet4": "Choose which page to place visible signatures", + "bullet5": "Use server certificate for simple 'Sign with Stirling-PDF' option" + } + }, + "certType": { + "tooltip": { + "header": { + "title": "About Certificate Types" + }, + "what": { + "title": "What's a certificate?", + "text": "It's a secure ID for your signature that proves you signed. Unless you're required to sign via certificate, we recommend using another secure method like Type, Draw, or Upload." + }, + "which": { + "title": "Which option should I use?", + "text": "Choose the format that matches your certificate file:", + "bullet1": "PKCS#12 (.p12 / .pfx) – one combined file (most common)", + "bullet2": "PFX (.pfx) – Microsoft's version of PKCS12", + "bullet3": "PEM – separate private-key and certificate .pem files", + "bullet4": "JKS – Java .jks keystore for dev / CI-CD workflows" + }, + "convert": { + "title": "Key not listed?", + "text": "Convert your file to a Java keystore (.jks) with keytool, then pick JKS." + } + } + }, + "chooseCertificate": "Choose Certificate File", + "chooseJksFile": "Choose JKS File", + "chooseP12File": "Choose PKCS12 File", + "choosePfxFile": "Choose PFX File", + "choosePrivateKey": "Choose Private Key File", + "location": "āŊĻāŧ‹āŊ‚āŊ“āŊĻāŧ", + "logoTitle": "Logo", + "name": "āŊ˜āŊ˛āŊ„āŧ‹āŧ", + "noLogo": "No Logo", + "pageNumber": "Page Number", + "password": "āŊāžąāŊēāŊ‘āŧ‹āŊ€āžąāŊ˛āŧ‹āŊŖāžĄāŊēāŧ‹āŊ˜āŊ˛āŊ‚āŧ‹āŊ˜āŊ›āŊŧāŊ‘āŧ‹āŊ‘āŊ˜āŧ‹āŊĻāž’āŊēāŊĸāŧ‹āŊ‚āžąāŊ˛āŧ‹āŊŖāžĄāŊēāŧ‹āŊ˜āŊ˛āŊ‚āŧ‹āŊ‚āŊ˛āŧ‹āŊ‚āŊĻāŊ„āŧ‹āŊšāŊ˛āŊ‚āŧ‹āŊ āŊ‡āŊ´āŊ‚āŧ‹āŊ”āŧ (āŊ‚āŊŖāŧ‹āŊĻāž˛āŊ˛āŊ‘āŧ‹āŊĄāŊŧāŊ‘āŧ‹āŊ“āŧ)", + "passwordOptional": "Leave empty if no password", + "reason": "āŊĸāž’āžąāŊ´āŧ‹āŊ˜āŊšāŊ“āŧ", + "serverCertMessage": "Using server certificate - no files or password required", + "showLogo": "āŊ˜āŊšāŊŧāŊ“āŧ‹āŊĸāžŸāŊ‚āŊĻāŧ‹āŊĻāžŸāŊŧāŊ“āŧ", "header": "āŊāžąāŊēāŊ‘āŧ‹āŊ€āžąāŊ˛āŧ‹āŊŖāŊ‚āŧ‹āŊāžąāŊēāŊĸāŧ‹āŊ‚āžąāŊ˛āŊĻāŧ‹ PDF āŊŖāŧ‹āŊ˜āŊ˛āŊ„āŧ‹āŊĸāžŸāŊ‚āŊĻāŧ‹āŊĸāž’āžąāŊ‚āŧ‹āŊ”āŧ (āŊŖāŊĻāŧ‹āŊ€āŧ‹āŊ–āžąāŊēāŊ‘āŧ‹āŊ–āŊžāŊ˛āŊ“āŧ‹āŊ”āŧ)", "selectPDF": "āŊ˜āŊ˛āŊ„āŧ‹āŊĸāžŸāŊ‚āŊĻāŧ‹āŊĸāž’āžąāŊ‚āŧ‹āŊĸāž’āžąāŊ´āŊ āŊ˛āŧ‹ PDF āŊĄāŊ˛āŊ‚āŧ‹āŊ†āŧ‹āŊ āŊ‘āŊēāŊ˜āŊĻāŧ‹āŊ”āŧ", "jksNote": "āŊ‘āž˛āŊ“āŧ‹āŊ‚āŊĻāŊŧāŧ āŊ‚āŊŖāŧ‹āŊĻāž˛āŊ˛āŊ‘āŧ‹āŊāžąāŊēāŊ‘āŧ‹āŊ€āžąāŊ˛āŧ‹āŊŖāŊ‚āŧ‹āŊāžąāŊēāŊĸāŧ‹āŊ‚āžąāŊ˛āŧ‹āŊĸāŊ˛āŊ‚āŊĻāŧ‹āŊ‚āŊ¤āŊ˜āŧ‹āŊ‘āŊ´āŧ‹āŊ˜āŊēāŊ‘āŧ‹āŊ“āŧ keytool āŊ–āŊ€āŊ āŧ‹āŊ–āŊĸāžĄāŧ‹āŊāŊ˛āŊ‚āŧ‹āŊ–āŊēāŊ‘āŧ‹āŊĻāž¤āžąāŊŧāŊ‘āŧ‹āŊ–āžąāŊĻāŧ‹āŊ“āŊĻāŧ‹ Java Keystore (.jks) āŊĄāŊ˛āŊ‚āŧ‹āŊ†āŧ‹āŊŖāŧ‹āŊ–āŊĻāž’āžąāŊ´āŊĸāŧ‹āŊĸāŊŧāŊ‚āŊĻāŧ āŊ‘āŊēāŧ‹āŊ“āŊĻāŧ‹āŊ‚āŊ¤āŊ˜āŧ‹āŊ‘āŊ´āŧ‹ .jks āŊĄāŊ˛āŊ‚āŧ‹āŊ†āŧ‹āŊ āŊ‘āŊēāŊ˜āŊĻāŧ‹āŊĸāŊŧāŊ‚āŊĻāŧ", @@ -999,13 +2469,7 @@ "selectCert": "āŊŖāŊ‚āŧ‹āŊāžąāŊēāŊĸāŧ‹āŊĄāŊ˛āŊ‚āŧ‹āŊ†āŧ‹āŊ āŊ‘āŊēāŊ˜āŊĻāŧ‹āŊ”āŧ (X.509 āŊĸāžŖāŊ˜āŧ‹āŊ‚āŊžāŊ‚ .pem āŊĄāŊ„āŧ‹āŊ“āŧ‹ .der āŊĄāŊ˛āŊ“āŧ‹āŊĻāž˛āŊ˛āŊ‘āŧ)", "selectP12": "PKCS#12 āŊŖāžĄāŊēāŧ‹āŊ˜āŊ˛āŊ‚āŧ‹āŊ˜āŊ›āŊŧāŊ‘āŧ‹āŊĄāŊ˛āŊ‚āŧ‹āŊ†āŧ‹āŊ āŊ‘āŊēāŊ˜āŊĻāŧ‹āŊ”āŧ (.p12 āŊĄāŊ„āŧ‹āŊ“āŧ‹ .pfx) (āŊ āŊ‘āŊēāŊ˜āŊĻāŧ‹āŊĸāŊ´āŊ„āŧ‹āŧ āŊ‚āŊŖāŧ‹āŊĻāž˛āŊ˛āŊ‘āŧ‹āŊ˜āŊāŊŧāŧ‹āŊĻāž¤āž˛āŊŧāŊ‘āŧ‹āŊ–āžąāŊĻāŧ‹āŊ“āŧ āŊ‘āŊēāŊ āŊ˛āŧ‹āŊ“āŊ„āŧ‹āŊ‘āŊ´āŧ‹āŊāžąāŊēāŊ‘āŧ‹āŊ€āžąāŊ˛āŧ‹āŊĻāž’āŊēāŊĸāŧ‹āŊ‚āžąāŊ˛āŧ‹āŊŖāžĄāŊēāŧ‹āŊ˜āŊ˛āŊ‚āŧ‹āŊ‘āŊ„āŧ‹āŊŖāŊ‚āŧ‹āŊāžąāŊēāŊĸāŧ‹āŊ āŊ‘āŊ´āŊĻāŧ‹āŊĄāŊŧāŊ‘āŧ‹āŊ‘āŊ‚āŊŧāŊĻāŧ)", "selectJKS": "Java āŊŖāžĄāŊēāŧ‹āŊ˜āŊ˛āŊ‚āŧ‹āŊ˜āŊ›āŊŧāŊ‘āŧ‹āŊĄāŊ˛āŊ‚āŧ‹āŊ†āŧ‹āŊ āŊ‘āŊēāŊ˜āŊĻāŧ‹āŊ”āŧ (.jks āŊĄāŊ„āŧ‹āŊ“āŧ‹ .keystore)", - "certType": "āŊŖāŊ‚āŧ‹āŊāžąāŊēāŊĸāŧ‹āŊ‚āžąāŊ˛āŧ‹āŊĸāŊ˛āŊ‚āŊĻāŧ", - "password": "āŊāžąāŊēāŊ‘āŧ‹āŊ€āžąāŊ˛āŧ‹āŊŖāžĄāŊēāŧ‹āŊ˜āŊ˛āŊ‚āŧ‹āŊ˜āŊ›āŊŧāŊ‘āŧ‹āŊ‘āŊ˜āŧ‹āŊĻāž’āŊēāŊĸāŧ‹āŊ‚āžąāŊ˛āŧ‹āŊŖāžĄāŊēāŧ‹āŊ˜āŊ˛āŊ‚āŧ‹āŊ‚āŊ˛āŧ‹āŊ‚āŊĻāŊ„āŧ‹āŊšāŊ˛āŊ‚āŧ‹āŊ āŊ‡āŊ´āŊ‚āŧ‹āŊ”āŧ (āŊ‚āŊŖāŧ‹āŊĻāž˛āŊ˛āŊ‘āŧ‹āŊĄāŊŧāŊ‘āŧ‹āŊ“āŧ)", "showSig": "āŊ˜āŊ˛āŊ„āŧ‹āŊĸāžŸāŊ‚āŊĻāŧ‹āŊĻāžŸāŊŧāŊ“āŧ", - "reason": "āŊĸāž’āžąāŊ´āŧ‹āŊ˜āŊšāŊ“āŧ", - "location": "āŊĻāŧ‹āŊ‚āŊ“āŊĻāŧ", - "name": "āŊ˜āŊ˛āŊ„āŧ‹āŧ", - "showLogo": "āŊ˜āŊšāŊŧāŊ“āŧ‹āŊĸāžŸāŊ‚āŊĻāŧ‹āŊĻāžŸāŊŧāŊ“āŧ", "submit": "PDF āŊŖāŧ‹āŊ˜āŊ˛āŊ„āŧ‹āŊĸāžŸāŊ‚āŊĻāŧ‹āŊĸāž’āžąāŊ‚āŧ‹āŊ”āŧ" }, "removeCertSign": { @@ -1013,7 +2477,18 @@ "title": "āŊŖāŊ‚āŧ‹āŊāžąāŊēāŊĸāŧ‹āŊ˜āŊ˛āŊ„āŧ‹āŊĸāžŸāŊ‚āŊĻāŧ‹āŊĻāŊ´āŊ–āŧ‹āŊ”āŧ", "header": "PDF āŊ“āŊĻāŧ‹āŊ¨āŊ„āŧ‹āŊ€āŊ˛āŊ āŊ˛āŧ‹āŊŖāŊ‚āŧ‹āŊāžąāŊēāŊĸāŧ‹āŊĻāŊ´āŊ–āŧ‹āŊ”āŧ", "selectPDF": "PDF āŊĄāŊ˛āŊ‚āŧ‹āŊ†āŧ‹āŊ āŊ‘āŊēāŊ˜āŊĻāŧ‹āŊ”āŧ", - "submit": "āŊ˜āŊ˛āŊ„āŧ‹āŊĸāžŸāŊ‚āŊĻāŧ‹āŊĻāŊ´āŊ–āŧ‹āŊ”āŧ" + "submit": "āŊ˜āŊ˛āŊ„āŧ‹āŊĸāžŸāŊ‚āŊĻāŧ‹āŊĻāŊ´āŊ–āŧ‹āŊ”āŧ", + "description": "This tool will remove digital certificate signatures from your PDF document.", + "filenamePrefix": "unsigned", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst removing certificate signatures." + }, + "results": { + "title": "Certificate Removal Results" + } }, "pageLayout": { "tags": "āŊĻāžĄāŊēāŊ–āŧ‹āŊĻāžĻāžąāŊŧāŊĸāŧ,āŊ–āŊĻāžĄāŊ´āŊĻāŧ‹āŊ”āŧ,āŊŖāžŸāŧ‹āŊšāŊ´āŊŖāŧ‹āŊ‚āŊ…āŊ˛āŊ‚,āŊ‚āŊŧāŧ‹āŊĻāž’āž˛āŊ˛āŊ‚", @@ -1021,16 +2496,157 @@ "header": "āŊ¤āŊŧāŊ‚āŧ‹āŊ„āŊŧāŊĻāŧ‹āŊ˜āŊ„āŧ‹āŊ”āŊŧāŊ āŊ˛āŧ‹āŊ–āŊ€āŊŧāŊ‘āŧ‹āŊ”āŧ", "pagesPerSheet": "āŊ¤āŊŧāŊ‚āŧ‹āŊŖāžˇāŊēāŧ‹āŊĸāŊēāŊĸāŧ‹āŊ¤āŊŧāŊ‚āŧ‹āŊ„āŊŧāŊĻāŧ‹āŊ‚āž˛āŊ„āŊĻāŧ", "addBorder": "āŊ˜āŊāŊ āŧ‹āŊ˜āŊšāŊ˜āŊĻāŧ‹āŊĻāžŖāŊŧāŊ“āŧ‹āŊ”āŧ", - "submit": "āŊ•āŊ´āŊŖāŧ‹āŊ–āŧ" + "submit": "āŊ•āŊ´āŊŖāŧ‹āŊ–āŧ", + "desc": { + "2": "Place 2 pages side-by-side on a single sheet.", + "3": "Place 3 pages on a single sheet in a single row.", + "4": "Place 4 pages on a single sheet (2 × 2 grid).", + "9": "Place 9 pages on a single sheet (3 × 3 grid).", + "16": "Place 16 pages on a single sheet (4 × 4 grid)." + }, + "error": { + "failed": "An error occurred while creating the multi-page layout." + } + }, + "bookletImposition": { + "tags": "booklet,imposition,printing,binding,folding,signature", + "title": "Booklet Imposition", + "header": "Booklet Imposition", + "submit": "Create Booklet", + "spineLocation": { + "label": "Spine Location", + "left": "Left (Standard)", + "right": "Right (RTL)" + }, + "doubleSided": { + "label": "Double-sided printing", + "tooltip": "Creates both front and back sides for proper booklet printing" + }, + "manualDuplex": { + "title": "Manual Duplex Mode", + "instructions": "For printers without automatic duplex. You'll need to run this twice:" + }, + "duplexPass": { + "label": "Print Pass", + "first": "1st Pass", + "second": "2nd Pass", + "firstInstructions": "Prints front sides → stack face-down → run again with 2nd Pass", + "secondInstructions": "Load printed stack face-down → prints back sides" + }, + "rtlBinding": { + "label": "Right-to-left binding", + "tooltip": "For Arabic, Hebrew, or other right-to-left languages" + }, + "addBorder": { + "label": "Add borders around pages", + "tooltip": "Adds borders around each page section to help with cutting and alignment" + }, + "addGutter": { + "label": "Add gutter margin", + "tooltip": "Adds inner margin space for binding" + }, + "gutterSize": { + "label": "Gutter size (points)" + }, + "flipOnShortEdge": { + "label": "Flip on short edge (automatic duplex only)", + "tooltip": "Enable for short-edge duplex printing (automatic duplex only - ignored in manual mode)", + "manualNote": "Not needed in manual mode - you flip the stack yourself" + }, + "advanced": { + "toggle": "Advanced Options" + }, + "paperSizeNote": "Paper size is automatically derived from your first page.", + "tooltip": { + "header": { + "title": "Booklet Creation Guide" + }, + "description": { + "title": "What is Booklet Imposition?", + "text": "Creates professional booklets by arranging pages in the correct printing order. Your PDF pages are placed 2-up on landscape sheets so when folded and bound, they read in proper sequence like a real book." + }, + "example": { + "title": "Example: 8-Page Booklet", + "text": "Your 8-page document becomes 2 sheets:", + "bullet1": "Sheet 1 Front: Pages 8, 1 | Back: Pages 2, 7", + "bullet2": "Sheet 2 Front: Pages 6, 3 | Back: Pages 4, 5", + "bullet3": "When folded & stacked: Reads 1→2→3→4→5→6→7→8" + }, + "printing": { + "title": "How to Print & Assemble", + "text": "Follow these steps for perfect booklets:", + "bullet1": "Print double-sided with 'Flip on long edge'", + "bullet2": "Stack sheets in order, fold in half", + "bullet3": "Staple or bind along the folded spine", + "bullet4": "For short-edge printers: Enable 'Flip on short edge' option" + }, + "manualDuplex": { + "title": "Manual Duplex (Single-sided Printers)", + "text": "For printers without automatic duplex:", + "bullet1": "Turn OFF 'Double-sided printing'", + "bullet2": "Select '1st Pass' → Print → Stack face-down", + "bullet3": "Select '2nd Pass' → Load stack → Print backs", + "bullet4": "Fold and assemble as normal" + }, + "advanced": { + "title": "Advanced Options", + "text": "Fine-tune your booklet:", + "bullet1": "Right-to-Left Binding: For Arabic, Hebrew, or RTL languages", + "bullet2": "Borders: Shows cut lines for trimming", + "bullet3": "Gutter Margin: Adds space for binding/stapling", + "bullet4": "Short-edge Flip: Only for automatic duplex printers" + } + }, + "error": { + "failed": "An error occurred while creating the booklet imposition." + } }, "scalePages": { - "tags": "āŊ†āŊēāŧ‹āŊ†āŊ´āŊ„āŧ‹āŊ–āŊĻāžāžąāŊĸāŧ‹āŊĻāž’āž˛āŊ˛āŊ‚,āŊ–āŊŸāŊŧāŧ‹āŊ–āŊ…āŊŧāŊĻāŧ,āŊšāŊ‘āŧ‹āŊ‚āŊžāŊ˛āŧ,āŊ–āŊĻāžŸāŊ´āŊ“āŧ‹āŊ āŊ‚āžąāŊ´āŊĸāŧ", "title": "āŊ¤āŊŧāŊ‚āŧ‹āŊ„āŊŧāŊĻāŧ‹āŊ†āŊēāŧ‹āŊ†āŊ´āŊ„āŧ‹āŊĻāž™āŊŧāŊ˜āŧ‹āŊĻāž’āž˛āŊ˛āŊ‚", "header": "āŊ¤āŊŧāŊ‚āŧ‹āŊ„āŊŧāŊĻāŧ‹āŊ†āŊēāŧ‹āŊ†āŊ´āŊ„āŧ‹āŊĻāž™āŊŧāŊ˜āŧ‹āŊĻāž’āž˛āŊ˛āŊ‚", "pageSize": "āŊĄāŊ˛āŊ‚āŧ‹āŊ†āŊ āŊ˛āŧ‹āŊ¤āŊŧāŊ‚āŧ‹āŊ„āŊŧāŊĻāŧ‹āŊ€āžąāŊ˛āŧ‹āŊ†āŊēāŧ‹āŊ†āŊ´āŊ„āŧ‹āŧ", "keepPageSize": "āŊāŊŧāŊ‚āŧ‹āŊ˜āŊ āŊ˛āŧ‹āŊ†āŊēāŧ‹āŊ†āŊ´āŊ„āŧ‹āŧ", "scaleFactor": "āŊ¤āŊŧāŊ‚āŧ‹āŊ„āŊŧāŊĻāŧ‹āŊ€āžąāŊ˛āŧ‹āŊ†āŊēāŧ‹āŊ†āŊ´āŊ„āŧ‹āŊšāŊ‘āŧ (āŊ‚āŊāŊ´āŊ–āŧ‹āŊ‚āŊ…āŊŧāŊ‘āŧ)", - "submit": "āŊ•āŊ´āŊŖāŧ‹āŊ–āŧ" + "submit": "āŊ•āŊ´āŊŖāŧ‹āŊ–āŧ", + "tags": "āŊ†āŊēāŧ‹āŊ†āŊ´āŊ„āŧ‹āŊ–āŊĻāžāžąāŊĸāŧ‹āŊĻāž’āž˛āŊ˛āŊ‚,āŊ–āŊŸāŊŧāŧ‹āŊ–āŊ…āŊŧāŊĻāŧ,āŊšāŊ‘āŧ‹āŊ‚āŊžāŊ˛āŧ,āŊ–āŊĻāžŸāŊ´āŊ“āŧ‹āŊ āŊ‚āžąāŊ´āŊĸāŧ" + }, + "adjustPageScale": { + "tags": "resize,modify,dimension,adapt", + "title": "Adjust Page Scale", + "header": "Adjust Page Scale", + "scaleFactor": { + "label": "Scale Factor" + }, + "pageSize": { + "label": "Target Page Size", + "keep": "Keep Original Size", + "letter": "Letter", + "legal": "Legal" + }, + "submit": "Adjust Page Scale", + "error": { + "failed": "An error occurred while adjusting the page scale." + }, + "tooltip": { + "header": { + "title": "Page Scale Settings Overview" + }, + "description": { + "title": "Description", + "text": "Adjust the size of PDF content and change the page dimensions." + }, + "scaleFactor": { + "title": "Scale Factor", + "text": "Controls how large or small the content appears on the page. Content is scaled and centred - if scaled content is larger than the page size, it may be cropped.", + "bullet1": "1.0 = Original size", + "bullet2": "0.5 = Half size (50% smaller)", + "bullet3": "2.0 = Double size (200% larger, may crop)" + }, + "pageSize": { + "title": "Target Page Size", + "text": "Sets the dimensions of the output PDF pages. 'Keep Original Size' maintains current dimensions, whilst other options resize to standard paper sizes." + } + } }, "add-page-numbers": { "tags": "āŊ¤āŊŧāŊ‚āŧ‹āŊ‚āž˛āŊ„āŊĻāŧ‹āŊĸāž’āžąāŊ‚āŧ‹āŊ”āŧ,āŊ˜āŊ˛āŊ„āŧ‹āŊĸāžŸāŊ‚āŊĻāŧ,āŊ‚āŊŧāŧ‹āŊĻāž’āž˛āŊ˛āŊ‚,āŊ‘āŊ€āŊĸāŧ‹āŊ†āŊ‚" @@ -1039,16 +2655,83 @@ "tags": "āŊĸāŊ„āŧ‹āŊ āŊ‚āŊ´āŊŖāŧ‹āŊ„āŊŧāŊĻāŧ‹āŊ āŊ›āŊ˛āŊ“āŧ,āŊ āŊ‚āŊŧāŧ‹āŊ–āŊĸāž—āŊŧāŊ‘āŧ‹āŊ‚āŊžāŊ˛āŊĸāŧ‹āŊ–āŊŸāŊ´āŊ„āŧ‹āŧ,āŊ‚āŊŧāŧ‹āŊĻāž’āž˛āŊ˛āŊ‚,āŊ˜āŊ˛āŊ„āŧ‹āŊ–āŊĻāžāžąāŊĸāŧ‹āŊ āŊ‘āŊŧāŊ‚āŊĻāŧ", "title": "āŊĸāŊ„āŧ‹āŊ āŊ‚āŊ´āŊŖāŧ‹āŊ˜āŊ˛āŊ„āŧ‹āŊ–āŊĻāžāžąāŊĸāŧ‹āŊ āŊ‘āŊŧāŊ‚āŊĻāŧ", "header": "PDF āŊĸāŊ„āŧ‹āŊ āŊ‚āŊ´āŊŖāŧ‹āŊ˜āŊ˛āŊ„āŧ‹āŊ–āŊĻāžāžąāŊĸāŧ‹āŊ āŊ‘āŊŧāŊ‚āŊĻāŧ", - "submit": "āŊĸāŊ„āŧ‹āŊ āŊ‚āŊ´āŊŖāŧ‹āŊ˜āŊ˛āŊ„āŧ‹āŊ–āŊĻāžāžąāŊĸāŧ‹āŊ āŊ‘āŊŧāŊ‚āŊĻāŧ" + "description": "Automatically finds the title from your PDF content and uses it as the filename.", + "submit": "āŊĸāŊ„āŧ‹āŊ āŊ‚āŊ´āŊŖāŧ‹āŊ˜āŊ˛āŊ„āŧ‹āŊ–āŊĻāžāžąāŊĸāŧ‹āŊ āŊ‘āŊŧāŊ‚āŊĻāŧ", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst auto-renaming the PDF." + }, + "results": { + "title": "Auto-Rename Results" + }, + "tooltip": { + "header": { + "title": "How Auto-Rename Works" + }, + "howItWorks": { + "title": "Smart Renaming", + "text": "Automatically finds the title from your PDF content and uses it as the filename.", + "bullet1": "Looks for text that appears to be a title or heading", + "bullet2": "Creates a clean, valid filename from the detected title", + "bullet3": "Keeps the original name if no suitable title is found" + } + } }, "adjust-contrast": { "tags": "āŊšāŊŧāŊĻāŧ‹āŊ‚āŊžāŊ˛āŧ‹āŊŖāŊēāŊ‚āŊĻāŧ‹āŊĻāž’āž˛āŊ˛āŊ‚,āŊĻāž™āŊŧāŊ˜āŧ‹āŊĻāž’āž˛āŊ˛āŊ‚,āŊ–āŊŸāŊŧāŧ‹āŊ–āŊ…āŊŧāŊĻāŧ,āŊĄāŊĸāŧ‹āŊĸāž’āžąāŊĻāŧ,āŊšāŊŧāŊĻāŧ‹āŊ˜āŊ‘āŊ„āŊĻāŧ‹āŊŖāŊēāŊ‚āŊĻāŧ‹āŊĻāž’āž˛āŊ˛āŊ‚" }, "crop": { - "tags": "āŊ‚āŊāŊ´āŊ–āŧ‹āŊ”āŧ,āŊ†āŊ´āŊ„āŧ‹āŊ‘āŊ´āŧ‹āŊ‚āŊāŊŧāŊ„āŧ‹āŊ–āŧ,āŊĸāžŠāŊŧāŊ˜āŧ‹āŊĻāž’āž˛āŊ˛āŊ‚,āŊ‘āŊ–āžąāŊ˛āŊ–āŊĻāŧ", "title": "āŊ‚āŊāŊ´āŊ–āŧ‹āŊ‚āŊ…āŊŧāŊ‘āŧ", "header": "PDF āŊ‚āŊāŊ´āŊ–āŧ‹āŊ‚āŊ…āŊŧāŊ‘āŧ", - "submit": "āŊ•āŊ´āŊŖāŧ‹āŊ–āŧ" + "submit": "āŊ•āŊ´āŊŖāŧ‹āŊ–āŧ", + "noFileSelected": "Select a PDF file to begin cropping", + "preview": { + "title": "Crop Area Selection" + }, + "reset": "Reset to full PDF", + "coordinates": { + "title": "Position and Size", + "x": { + "label": "X Position", + "desc": "Left edge (points)" + }, + "y": { + "label": "Y Position", + "desc": "Bottom edge (points)" + }, + "width": { + "label": "Width", + "desc": "Crop width (points)" + }, + "height": { + "label": "Height", + "desc": "Crop height (points)" + } + }, + "error": { + "invalidArea": "Crop area extends beyond PDF boundaries", + "failed": "Failed to crop PDF" + }, + "steps": { + "selectArea": "Select Crop Area" + }, + "tooltip": { + "title": "How to Crop PDFs", + "description": "Select the area to crop from your PDF by dragging and resizing the blue overlay on the thumbnail.", + "drag": "Drag the overlay to move the crop area", + "resize": "Drag the corner and edge handles to resize", + "precision": "Use coordinate inputs for precise positioning" + }, + "results": { + "title": "Crop Results" + }, + "automation": { + "info": "Enter crop coordinates in PDF points. Origin (0,0) is at bottom-left. These values will be applied to all PDFs processed in this automation.", + "reference": "Reference: A4 page is 595.28 × 841.89 points (210mm × 297mm). 1 inch = 72 points." + }, + "tags": "āŊ‚āŊāŊ´āŊ–āŧ‹āŊ”āŧ,āŊ†āŊ´āŊ„āŧ‹āŊ‘āŊ´āŧ‹āŊ‚āŊāŊŧāŊ„āŧ‹āŊ–āŧ,āŊĸāžŠāŊŧāŊ˜āŧ‹āŊĻāž’āž˛āŊ˛āŊ‚,āŊ‘āŊ–āžąāŊ˛āŊ–āŊĻāŧ" }, "autoSplitPDF": { "tags": "QR āŊ‚āŊžāŊ˛āŊĸāŧ‹āŊ–āŊŸāŊ´āŊ„āŧ‹āŧ,āŊāŧ‹āŊ‚āžąāŊēāŊĻāŧ,āŊ–āŊ¤āŊēāŊĸāŧ‹āŊ‘āŊ´āŊ˜āŧ,āŊ‚āŊŧāŧ‹āŊĻāž’āž˛āŊ˛āŊ‚", @@ -1131,24 +2814,124 @@ "downloadJS": "Javascript āŊ•āŊ–āŧ‹āŊŖāŊēāŊ“āŧ", "submit": "āŊĻāžŸāŊŧāŊ“āŧ‹āŊ”āŧ" }, - "autoRedact": { - "tags": "āŊĻāž’āž˛āŊ˛āŊ–āŧ‹āŊĻāž˛āŊ´āŊ„āŧ‹āŧ,āŊĻāžĻāŊĻāŧ‹āŊ”āŧ,āŊ“āŊ‚āŧ‹āŊ”āŊŧāŊĻāŧ‹āŊĻāž’āž˛āŊ˛āŊ–āŧ‹āŊ”āŧ,āŊ“āŊ‚āŧ‹āŊ”āŊŧāŧ,āŊĸāžŸāŊ‚āŊĻāŧ‹āŊĸāž’āžąāŊ‚,āŊĻāžĻāŊĻāŧ‹āŊ”āŧ", - "title": "āŊĸāŊ„āŧ‹āŊ āŊ‚āŊ´āŊŖāŧ‹āŊĻāž’āž˛āŊ˛āŊ–āŧ‹āŊĻāž˛āŊ´āŊ„āŧ‹āŧ", - "header": "āŊĸāŊ„āŧ‹āŊ āŊ‚āŊ´āŊŖāŧ‹āŊĻāž’āž˛āŊ˛āŊ–āŧ‹āŊĻāž˛āŊ´āŊ„āŧ‹āŧ", - "colorLabel": "āŊšāŊŧāŊĻāŧ‹āŊ‚āŊžāŊ˛āŧ", - "textsToRedactLabel": "āŊĻāž’āž˛āŊ˛āŊ–āŧ‹āŊĸāž’āžąāŊ´āŊ āŊ˛āŧ‹āŊĄāŊ˛āŧ‹āŊ‚āŊēāŧ (āŊāŊ˛āŊ‚āŧ‹āŊ•āž˛āŊēāŊ„āŧ‹āŊĻāŊŧāŧ‹āŊĻāŊŧāŊĸāŧ)", - "textsToRedactPlaceholder": "āŊ‘āŊ”āŊēāŊĸāŧ‹āŊ“āŧ \\nāŊ‚āŊĻāŊ„āŧ‹āŊ–āŧ \\nāŊ‚āŊĻāŊ„āŧ‹āŊ†āŊēāŧ", - "useRegexLabel": "Regex āŊ–āŊēāŊ‘āŧ‹āŊĻāž¤āžąāŊŧāŊ‘āŧ", - "wholeWordSearchLabel": "āŊšāŊ˛āŊ‚āŧ‹āŊ†āŧ‹āŊšāŊ„āŧ‹āŊ āŊšāŊŧāŊŖāŧ‹āŊ–āŧ", - "customPaddingLabel": "āŊ˜āŊāŊ āŧ‹āŊ˜āŊšāŊ˜āŊĻāŧ‹āŊĻāžŸāŊŧāŊ„āŧ‹āŊ†āŧ‹āŊĻāžŖāŊŧāŊ“āŧ‹āŊ”āŧ", - "convertPDFToImageLabel": "PDF āŊ“āŊĻāŧ‹ PDF-āŊ”āŊĸāŧ‹āŊĸāŊ˛āŊĻāŧ‹āŊŖāŧ‹āŊ–āŊĻāž’āžąāŊ´āŊĸāŧ‹āŊ–āŧ (āŊĻāž’āž˛āŊŧāŊ˜āŧ‹āŊ‚āžąāŊ˛āŧ‹āŊĸāž’āžąāŊ–āŧ‹āŊ€āžąāŊ˛āŧ‹āŊĄāŊ˛āŧ‹āŊ‚āŊēāŧ‹āŊĻāŊ´āŊ–āŧ‹āŊ”āŊĸāŧ‹āŊ–āŊēāŊ‘āŧ‹āŊĻāž¤āžąāŊŧāŊ‘āŧ)", - "submitButton": "āŊ•āŊ´āŊŖāŧ‹āŊ–āŧ" - }, "redact": { "tags": "āŊĻāž’āž˛āŊ˛āŊ–āŧ‹āŊĻāž˛āŊ´āŊ„āŧ‹āŧ,āŊĻāžĻāŊĻāŧ‹āŊ”āŧ,āŊ“āŊ‚āŧ‹āŊ”āŊŧāŊĻāŧ‹āŊĻāž’āž˛āŊ˛āŊ–āŧ‹āŊ”āŧ,āŊ“āŊ‚āŧ‹āŊ”āŊŧāŧ,āŊĸāžŸāŊ‚āŊĻāŧ‹āŊĸāž’āžąāŊ‚,āŊĻāžĻāŊĻāŧ‹āŊ”āŧ,āŊŖāŊ‚āŧ‹āŊ–āŊŸāŊŧāŊĻāŧ", "title": "āŊŖāŊ‚āŧ‹āŊ–āŊŸāŊŧāŊĻāŧ‹āŊĻāž’āž˛āŊ˛āŊ–āŧ‹āŊĻāž˛āŊ´āŊ„āŧ‹āŧ", - "header": "āŊŖāŊ‚āŧ‹āŊ–āŊŸāŊŧāŊĻāŧ‹āŊĻāž’āž˛āŊ˛āŊ–āŧ‹āŊĻāž˛āŊ´āŊ„āŧ‹āŧ", "submit": "āŊĻāž’āž˛āŊ˛āŊ–āŧ‹āŊĻāž˛āŊ´āŊ„āŧ‹āŧ", + "error": { + "failed": "An error occurred while redacting the PDF." + }, + "modeSelector": { + "title": "Redaction Method", + "mode": "Mode", + "automatic": "Automatic", + "automaticDesc": "Redact text based on search terms", + "manual": "Manual", + "manualDesc": "Click and drag to redact specific areas", + "manualComingSoon": "Manual redaction coming soon" + }, + "auto": { + "header": "Auto Redact", + "settings": { + "title": "Redaction Settings", + "advancedTitle": "Advanced" + }, + "colorLabel": "Box Colour", + "wordsToRedact": { + "title": "Words to Redact", + "placeholder": "Enter a word", + "add": "Add", + "examples": "Examples: Confidential, Top-Secret" + }, + "useRegexLabel": "Use Regex", + "wholeWordSearchLabel": "Whole Word Search", + "customPaddingLabel": "Custom Extra Padding", + "convertPDFToImageLabel": "Convert PDF to PDF-Image" + }, + "tooltip": { + "mode": { + "header": { + "title": "Redaction Method" + }, + "automatic": { + "title": "Automatic Redaction", + "text": "Automatically finds and redacts specified text throughout the document. Perfect for removing consistent sensitive information like names, addresses, or confidential markers." + }, + "manual": { + "title": "Manual Redaction", + "text": "Click and drag to manually select specific areas to redact. Gives you precise control over what gets redacted. (Coming soon)" + } + }, + "words": { + "header": { + "title": "Words to Redact" + }, + "description": { + "title": "Text Matching", + "text": "Enter words or phrases to find and redact in your document. Each word will be searched for separately." + }, + "bullet1": "Add one word at a time", + "bullet2": "Press Enter or click 'Add Another' to add", + "bullet3": "Click × to remove words", + "examples": { + "title": "Common Examples", + "text": "Typical words to redact include: bank details, email addresses, or specific names." + } + }, + "advanced": { + "header": { + "title": "Advanced Redaction Settings" + }, + "color": { + "title": "Box Colour & Padding", + "text": "Customise the appearance of redaction boxes. Black is standard, but you can choose any colour. Padding adds extra space around the found text." + }, + "regex": { + "title": "Use Regex", + "text": "Enable regular expressions for advanced pattern matching. Useful for finding phone numbers, emails, or complex patterns.", + "bullet1": "Example: \\d{4}-\\d{2}-\\d{2} to match any dates in YYYY-MM-DD format", + "bullet2": "Use with caution - test thoroughly" + }, + "wholeWord": { + "title": "Whole Word Search", + "text": "Only match complete words, not partial matches. 'John' won't match 'Johnson' when enabled." + }, + "convert": { + "title": "Convert to PDF-Image", + "text": "Converts the PDF to an image-based PDF after redaction. This ensures text behind redaction boxes is completely removed and unrecoverable." + } + } + }, + "manual": { + "header": "Manual Redaction", + "textBasedRedaction": "Text-based Redaction", + "pageBasedRedaction": "Page-based Redaction", + "convertPDFToImageLabel": "Convert PDF to PDF-Image (Used to remove text behind the box)", + "pageRedactionNumbers": { + "title": "Pages", + "placeholder": "(e.g. 1,2,8 or 4,7,12-16 or 2n-1)" + }, + "redactionColor": { + "title": "Redaction Colour" + }, + "export": "Export", + "upload": "Upload", + "boxRedaction": "Box draw redaction", + "zoom": "Zoom", + "zoomIn": "Zoom in", + "zoomOut": "Zoom out", + "nextPage": "Next Page", + "previousPage": "Previous Page", + "toggleSidebar": "Toggle Sidebar", + "showThumbnails": "Show Thumbnails", + "showDocumentOutline": "Show Document Outline (double-click to expand/collapse all items)", + "showAttachments": "Show Attachments", + "showLayers": "Show Layers (double-click to reset all layers to the default state)", + "colourPicker": "Colour Picker", + "findCurrentOutlineItem": "Find current outline item", + "applyChanges": "Apply Changes" + }, + "header": "āŊŖāŊ‚āŧ‹āŊ–āŊŸāŊŧāŊĻāŧ‹āŊĻāž’āž˛āŊ˛āŊ–āŧ‹āŊĻāž˛āŊ´āŊ„āŧ‹āŧ", "textBasedRedaction": "āŊĄāŊ˛āŧ‹āŊ‚āŊēāŧ‹āŊ‚āŊžāŊ˛āŊĸāŧ‹āŊ–āŊŸāŊ´āŊ„āŧ‹āŊ–āŊ āŊ˛āŧ‹āŊĻāž’āž˛āŊ˛āŊ–āŧ‹āŊĻāž˛āŊ´āŊ„āŧ‹āŧ", "pageBasedRedaction": "āŊ¤āŊŧāŊ‚āŧ‹āŊ„āŊŧāŊĻāŧ‹āŊ‚āŊžāŊ˛āŊĸāŧ‹āŊ–āŊŸāŊ´āŊ„āŧ‹āŊ–āŊ āŊ˛āŧ‹āŊĻāž’āž˛āŊ˛āŊ–āŧ‹āŊĻāž˛āŊ´āŊ„āŧ‹āŧ", "convertPDFToImageLabel": "PDF āŊ“āŊĻāŧ‹ PDF-āŊ”āŊĸāŧ‹āŊĸāŊ˛āŊĻāŧ‹āŊŖāŧ‹āŊ–āŊĻāž’āžąāŊ´āŊĸāŧ‹āŊ–āŧ (āŊĻāž’āž˛āŊŧāŊ˜āŧ‹āŊ‚āžąāŊ˛āŧ‹āŊĸāž’āžąāŊ–āŧ‹āŊ€āžąāŊ˛āŧ‹āŊĄāŊ˛āŧ‹āŊ‚āŊēāŧ‹āŊĻāŊ´āŊ–āŧ‹āŊ”āŊĸāŧ‹āŊ–āŊēāŊ‘āŧ‹āŊĻāž¤āžąāŊŧāŊ‘āŧ)", @@ -1185,11 +2968,15 @@ "overlay-pdfs": { "tags": "āŊĻāžŸāŊēāŊ„āŧ‹āŊ–āŊĸāžŠāŊēāŊ‚āŊĻāŧ", "header": "PDF āŊĄāŊ˛āŊ‚āŧ‹āŊ†āŧ‹āŊ–āŊĸāžŠāŊēāŊ‚āŊĻāŧ‹āŊ”āŧ", + "title": "Overlay PDFs", + "desc": "Overlay one PDF on top of another", "baseFile": { "label": "āŊ‚āŊžāŊ˛āŧ‹āŊĸāžŠāŊ āŊ˛āŧ‹ PDF āŊĄāŊ˛āŊ‚āŧ‹āŊ†āŧ‹āŊ āŊ‘āŊēāŊ˜āŊĻāŧ‹āŊ”āŧ" }, "overlayFiles": { - "label": "āŊ–āŊĸāžŠāŊēāŊ‚āŊĻāŧ‹āŊĸāž’āžąāŊ´āŊ āŊ˛āŧ‹ PDF āŊĄāŊ˛āŊ‚āŧ‹āŊ†āŧ‹āŊ āŊ‘āŊēāŊ˜āŊĻāŧ‹āŊ”āŧ" + "label": "āŊ–āŊĸāžŠāŊēāŊ‚āŊĻāŧ‹āŊĸāž’āžąāŊ´āŊ āŊ˛āŧ‹ PDF āŊĄāŊ˛āŊ‚āŧ‹āŊ†āŧ‹āŊ āŊ‘āŊēāŊ˜āŊĻāŧ‹āŊ”āŧ", + "placeholder": "Choose PDF(s)...", + "addMore": "Add more PDFs..." }, "mode": { "label": "āŊ–āŊĸāžŠāŊēāŊ‚āŊĻāŧ‹āŊĻāžŸāŊ„āŊĻāŧ‹āŊ āŊ‘āŊēāŊ˜āŊĻāŧ‹āŊ”āŧ", @@ -1199,14 +2986,53 @@ }, "counts": { "label": "āŊ–āŊĸāžŠāŊēāŊ‚āŊĻāŧ‹āŊ‚āž˛āŊ„āŊĻāŧ (āŊ–āŊĻāžāžąāŊĸāŧ‹āŊŸāžŗāŊŧāŊĻāŧ‹āŊ‚āŊāŊ“āŧ‹āŊ āŊ‡āŊ‚āŊĻāŧ‹āŊĸāžŖāŊ˜āŧ‹āŊ”āŊ āŊ˛āŧ‹āŊ†āŊēāŊ‘āŧ)", - "placeholder": "āŊšāŊēāŊ‚āŧ‹āŊāžąāŊ˛āŊ˜āŧ‹āŊ‚āžąāŊ˛āŊĻāŧ‹āŊ–āŊ…āŊ‘āŧ‹āŊ”āŊ āŊ˛āŧ‹āŊ‚āž˛āŊ„āŊĻāŧ‹āŊ€āŧ‹āŊ āŊ‡āŊ´āŊ‚āŧ‹āŊ”āŧ (āŊ‘āŊ”āŊēāŊĸāŧ‹āŊ“āŧ 2,3,1)" + "placeholder": "āŊšāŊēāŊ‚āŧ‹āŊāžąāŊ˛āŊ˜āŧ‹āŊ‚āžąāŊ˛āŊĻāŧ‹āŊ–āŊ…āŊ‘āŧ‹āŊ”āŊ āŊ˛āŧ‹āŊ‚āž˛āŊ„āŊĻāŧ‹āŊ€āŧ‹āŊ āŊ‡āŊ´āŊ‚āŧ‹āŊ”āŧ (āŊ‘āŊ”āŊēāŊĸāŧ‹āŊ“āŧ 2,3,1)", + "item": "Count for file", + "noFiles": "Add overlay files to configure counts" }, "position": { "label": "āŊ–āŊĸāžŠāŊēāŊ‚āŊĻāŧ‹āŊĻāŊ āŊ˛āŧ‹āŊ‚āŊ“āŊĻāŧ‹āŊĻāŧ‹āŊ āŊ‘āŊēāŊ˜āŊĻāŧ‹āŊ”āŧ", "foreground": "āŊ˜āŊ‘āŊ´āŊ“āŧ‹āŊ„āŊŧāŊĻāŧ", "background": "āŊĸāž’āžąāŊ–āŧ‹āŊŖāž—āŊŧāŊ„āŊĻāŧ" }, - "submit": "āŊ•āŊ´āŊŖāŧ‹āŊ–āŧ" + "submit": "āŊ•āŊ´āŊŖāŧ‹āŊ–āŧ", + "settings": { + "title": "Settings" + }, + "results": { + "title": "Overlay Results" + }, + "tooltip": { + "header": { + "title": "Overlay PDFs Overview" + }, + "description": { + "title": "Description", + "text": "Combine a base PDF with one or more overlay PDFs. Overlays can be applied page-by-page in different modes and placed in the foreground or background." + }, + "mode": { + "title": "Overlay Mode", + "text": "Choose how to distribute overlay pages across the base PDF pages.", + "sequential": "Sequential Overlay: Use pages from the first overlay PDF until it ends, then move to the next.", + "interleaved": "Interleaved Overlay: Take one page from each overlay in turn.", + "fixedRepeat": "Fixed Repeat Overlay: Take a set number of pages from each overlay before moving to the next. Use Counts to set the numbers." + }, + "position": { + "title": "Overlay Position", + "text": "Foreground places the overlay on top of the page. Background places it behind." + }, + "overlayFiles": { + "title": "Overlay Files", + "text": "Select one or more PDFs to overlay on the base. The order of these files affects how pages are applied in Sequential and Fixed Repeat modes." + }, + "counts": { + "title": "Counts (Fixed Repeat only)", + "text": "Provide a positive number for each overlay file showing how many pages to take before moving to the next. Required when mode is Fixed Repeat." + } + }, + "error": { + "failed": "An error occurred while overlaying PDFs." + } }, "split-by-sections": { "tags": "āŊ‘āŊ´āŊ˜āŧ‹āŊ–āŊ´āŧ‹āŊāŧ‹āŊ‚āžąāŊēāŊĻāŧ,āŊ–āŊ‚āŊŧāŧ‹āŊ–āŧ,āŊĸāŊ„āŧ‹āŊĻāž’āž˛āŊ˛āŊ‚,āŊĻāž’āž˛āŊ˛āŊ‚āŧ‹āŊĻāžĻāžąāŊŧāŊĸāŧ", @@ -1227,6 +3053,7 @@ "tags": "āŊāŊēāŊŖāŧ‹āŊ™āŊēāŧ,āŊ”āŊĸāŧ‹āŊĸāŊ˛āŊĻāŧ‹āŊĻāžŖāŊŧāŊ“āŧ‹āŊ”āŧ,āŊ‘āŊ€āžąāŊ˛āŊŖāŧ‹āŊĻāž’āž˛āŊ˛āŊ‚āŧ‹āŊ”āŊĸāŧ‹āŊĸāŊ˛āŊĻāŧ,āŊ†āŊ´āŧ‹āŊĸāžŸāŊ‚āŊĻāŧ,PDF,āŊ“āŊ„āŧ‹āŊ āŊ‡āŊ´āŊ‚,āŊĸāŊ„āŧ‹āŊĻāž’āž˛āŊ˛āŊ‚,āŊĻāž’āž˛āŊ˛āŊ‚āŧ‹āŊĻāžĻāžąāŊŧāŊĸāŧ", "header": "PDF āŊŖāŧ‹āŊāŊēāŊŖāŧ‹āŊ™āŊēāŧ‹āŊĸāž’āžąāŊ‚āŧ‹āŊ”āŧ", "title": "PDF āŊŖāŧ‹āŊāŊēāŊŖāŧ‹āŊ™āŊēāŧ‹āŊĸāž’āžąāŊ‚āŧ‹āŊ”āŧ", + "stampSetup": "Stamp Setup", "stampType": "āŊāŊēāŊŖāŧ‹āŊ™āŊēāŊ āŊ˛āŧ‹āŊĸāŊ˛āŊ‚āŊĻāŧ", "stampText": "āŊāŊēāŊŖāŧ‹āŊ™āŊēāŊ āŊ˛āŧ‹āŊĄāŊ˛āŧ‹āŊ‚āŊē", "stampImage": "āŊāŊēāŊŖāŧ‹āŊ™āŊēāŊ āŊ˛āŧ‹āŊ”āŊĸāŧ‹āŊĸāŊ˛āŊĻāŧ", @@ -1239,7 +3066,19 @@ "overrideY": "Y āŊ‚āŊ“āŊĻāŧ‹āŊšāŊ‘āŧ‹āŊ–āŊĸāž—āŊēāŧ‹āŊ–āŊĻāž’āžąāŊ´āŊĸāŧ", "customMargin": "āŊ˜āŊāŊ āŧ‹āŊ˜āŊšāŊ˜āŊĻāŧ‹āŊĸāŊ„āŧ‹āŊĻāž’āž˛āŊ˛āŊ‚", "customColor": "āŊĄāŊ˛āŧ‹āŊ‚āŊēāŊ āŊ˛āŧ‹āŊšāŊŧāŊĻāŧ‹āŊ˜āŊ‘āŊŧāŊ‚āŧ‹āŊĸāŊ„āŧ‹āŊĻāž’āž˛āŊ˛āŊ‚", - "submit": "āŊ•āŊ´āŊŖāŧ‹āŊ–āŧ" + "submit": "āŊ•āŊ´āŊŖāŧ‹āŊ–āŧ", + "noStampSelected": "No stamp selected. Return to Step 1.", + "customPosition": "Drag the stamp to the desired location in the preview window.", + "error": { + "failed": "An error occurred while adding stamp to the PDF." + }, + "imageSize": "Image Size", + "margin": "Margin", + "positionAndFormatting": "Position & Formatting", + "quickPosition": "Select a position on the page to place the stamp.", + "results": { + "title": "Stamp Results" + } }, "removeImagePdf": { "tags": "āŊ”āŊĸāŧ‹āŊĸāŊ˛āŊĻāŧ‹āŊĻāŊ´āŊ–āŧ‹āŊ”āŧ,āŊ¤āŊŧāŊ‚āŧ‹āŊ„āŊŧāŊĻāŧ‹āŊ–āŊ€āŊŧāŊŖāŧ‹āŊĻāž¤āžąāŊŧāŊ‘āŧ,āŊĸāž’āžąāŊ–āŧ‹āŊ„āŊŧāŊĻāŧ,āŊžāŊ–āŊĻāŧ‹āŊžāŊ´āŧ‹āŊ•āžąāŊŧāŊ‚āŊĻāŧ" @@ -1257,7 +3096,8 @@ "status": { "_value": "āŊ‚āŊ“āŊĻāŧ‹āŊĻāžŸāŊ„āŊĻāŧ", "valid": "āŊ“āŊ´āŊĻāŧ‹āŊŖāžĄāŊ“āŧ", - "invalid": "āŊ“āŊ´āŊĻāŧ‹āŊ˜āŊēāŊ‘āŧ" + "invalid": "āŊ“āŊ´āŊĻāŧ‹āŊ˜āŊēāŊ‘āŧ", + "complete": "Validation complete" }, "signer": "āŊ˜āŊ˛āŊ„āŧ‹āŊĸāžŸāŊ‚āŊĻāŧ‹āŊ āŊ‚āŊŧāŊ‘āŧ‹āŊ˜āŊāŊ“āŧ", "date": "āŊ‘āŊ´āŊĻāŧ‹āŊšāŊŧāŊ‘āŧ", @@ -1284,40 +3124,122 @@ "version": "āŊ”āŊĸāŧ‹āŊ‚āŊžāŊ˛āŧ", "keyUsage": "āŊŖāžĄāŊēāŧ‹āŊ˜āŊ˛āŊ‚āŧ‹āŊ–āŊēāŊ‘āŧ‹āŊĻāž¤āžąāŊŧāŊ‘āŧ", "selfSigned": "āŊĸāŊ„āŧ‹āŊ˜āŊ˛āŊ„āŧ‹āŊĸāžŸāŊ‚āŊĻāŧ", - "bits": "āŊ‚āŊ“āŊĻāŧ" + "bits": "āŊ‚āŊ“āŊĻāŧ", + "details": "Certificate Details" }, "signature": { "info": "āŊ˜āŊ˛āŊ„āŧ‹āŊĸāžŸāŊ‚āŊĻāŧ‹āŊ€āžąāŊ˛āŧ‹āŊ‚āŊ“āŊĻāŧ‹āŊšāŊ´āŊŖāŧ", "_value": "āŊ˜āŊ˛āŊ„āŧ‹āŊĸāžŸāŊ‚āŊĻāŧ", "mathValid": "āŊ˜āŊ˛āŊ„āŧ‹āŊĸāžŸāŊ‚āŊĻāŧ‹āŊ¨āŊ„āŧ‹āŊĸāžŠāŊ˛āŊĻāŧ‹āŊāŊŧāŊ‚āŧ‹āŊ“āŊĻāŧ‹āŊ“āŊ´āŊĻāŧ‹āŊŖāžĄāŊ“āŧ‹āŊĄāŊ˛āŊ“āŧ‹āŊĄāŊ„āŧ‹āŧ" }, - "selectCustomCert": "āŊĸāŊ„āŧ‹āŊĻāž’āž˛āŊ˛āŊ‚āŧ‹āŊŖāŊ‚āŧ‹āŊāžąāŊēāŊĸāŧ‹āŊĄāŊ˛āŊ‚āŧ‹āŊ†āŧ‹ X.509 (āŊ āŊ‘āŊ˜āŧ‹āŊ‚)" - }, - "replace-color": { - "title": "āŊšāŊŧāŊĻāŧ‹āŊ‚āŊžāŊ˛āŊ āŊ˛āŧ‹āŊ‚āŊ‘āŊ˜āŧ‹āŊ‚āŧ‹āŊ˜āŊāŊŧāŧ‹āŊĸāŊ˛āŊ˜āŧ", - "header": "āŊšāŊŧāŊĻāŧ‹āŊ‚āŊžāŊ˛āŧ‹āŊ–āŊĸāž—āŊēāŧ‹āŊĻāž’āžąāŊ´āŊĸāŧ‹-āŊŖāžĄāŊŧāŊ‚āŧ‹āŊĻāž’āžąāŊ´āŊĸāŧ‹ PDF", - "selectText": { - "1": "āŊšāŊŧāŊĻāŧ‹āŊ‚āŊžāŊ˛āŧ‹āŊ–āŊĸāž—āŊēāŧ‹āŊĻāž’āžąāŊ´āŊĸāŧ‹āŊĸāŊ˜āŧ‹āŊŖāžĄāŊŧāŊ‚āŧ‹āŊĻāž’āžąāŊ´āŊĸāŧ‹āŊ‚āžąāŊ˛āŧ‹āŊ‚āŊ‘āŊ˜āŧ‹āŊ‚", - "2": "āŊĻāž”āŊŧāŊ“āŧ‹āŊĻāž’āž˛āŊ˛āŊ‚ (āŊĻāž”āŊŧāŊ“āŧ‹āŊĻāž’āž˛āŊ˛āŊ‚āŧ‹āŊ‚āŊ˛āŧ‹āŊ āŊŧāŊ‘āŧ‹āŊāžąāŊ‘āŧ‹āŊ˜āŊāŊŧāŧ‹āŊ–āŊ āŊ˛āŧ‹āŊšāŊŧāŊĻāŧ‹āŊ‚āŊžāŊ˛āŧ)", - "3": "āŊĸāŊ„āŧ‹āŊĻāž’āž˛āŊ˛āŊ‚ (āŊĸāŊ„āŧ‹āŊĻāž’āž˛āŊ˛āŊ‚āŧ‹āŊ‚āŊ˛āŧ‹āŊšāŊŧāŊĻāŧ‹āŊ‚āŊžāŊ˛āŧ)", - "4": "āŊĄāŊŧāŊ„āŊĻāŧ‹āŊĸāžĢāŊŧāŊ‚āŊĻāŧ‹āŊŖāžĄāŊŧāŊ‚āŧ‹āŊĻāž’āžąāŊ´āŊĸāŧ (āŊšāŊŧāŊĻāŧ‹āŊ‚āŊžāŊ˛āŧ‹āŊšāŊ„āŧ‹āŊ˜āŧ‹āŊŖāžĄāŊŧāŊ‚āŧ‹āŊĻāž’āžąāŊ´āŊĸāŧ)", - "5": "āŊ āŊŧāŊ‘āŧ‹āŊāžąāŊ‘āŧ‹āŊ˜āŊāŊŧāŧ‹āŊ–āŊ āŊ˛āŧ‹āŊšāŊŧāŊĻāŧ‹āŊ‚āŊžāŊ˛āŊ āŊ˛āŧ‹āŊ‚āŊ‘āŊ˜āŧ‹āŊ‚", - "6": "āŊĸāž’āžąāŊ–āŧ‹āŊŖāž—āŊŧāŊ„āŊĻāŧ‹āŊ“āŊ‚āŧ‹āŊ”āŊŧāŊ āŊ˛āŧ‹āŊĻāžŸāŊēāŊ„āŧ‹āŊ‚āŊ˛āŧ‹āŊĄāŊ˛āŧ‹āŊ‚āŊēāŧ‹āŊ‘āŊ€āŊĸāŧ‹āŊ”āŊŧāŧ", - "7": "āŊĸāž’āžąāŊ–āŧ‹āŊŖāž—āŊŧāŊ„āŊĻāŧ‹āŊ‘āŊ€āŊĸāŧ‹āŊ”āŊŧāŊ āŊ˛āŧ‹āŊĻāžŸāŊēāŊ„āŧ‹āŊ‚āŊ˛āŧ‹āŊĄāŊ˛āŧ‹āŊ‚āŊēāŧ‹āŊ“āŊ‚āŧ‹āŊ”āŊŧāŧ", - "8": "āŊĸāž’āžąāŊ–āŧ‹āŊŖāž—āŊŧāŊ„āŊĻāŧ‹āŊ“āŊ‚āŧ‹āŊ”āŊŧāŊ āŊ˛āŧ‹āŊĻāžŸāŊēāŊ„āŧ‹āŊ‚āŊ˛āŧ‹āŊĄāŊ˛āŧ‹āŊ‚āŊēāŧ‹āŊĻāŊēāŊĸāŧ‹āŊ”āŊŧāŧ", - "9": "āŊĸāž’āžąāŊ–āŧ‹āŊŖāž—āŊŧāŊ„āŊĻāŧ‹āŊ“āŊ‚āŧ‹āŊ”āŊŧāŊ āŊ˛āŧ‹āŊĻāžŸāŊēāŊ„āŧ‹āŊ‚āŊ˛āŧ‹āŊĄāŊ˛āŧ‹āŊ‚āŊēāŧ‹āŊŖāž—āŊ„āŧ‹āŊāŊ´āŧ", - "10": "āŊĄāŊ˛āŧ‹āŊ‚āŊēāŊ āŊ˛āŧ‹āŊšāŊŧāŊĻāŧ‹āŊ‚āŊžāŊ˛āŧ‹āŊ āŊ‘āŊēāŊ˜āŊĻāŧ‹āŊ”āŧ", - "11": "āŊĸāž’āžąāŊ–āŧ‹āŊŖāž—āŊŧāŊ„āŊĻāŧ‹āŊ€āžąāŊ˛āŧ‹āŊšāŊŧāŊĻāŧ‹āŊ‚āŊžāŊ˛āŧ‹āŊ āŊ‘āŊēāŊ˜āŊĻāŧ‹āŊ”āŧ" + "selectCustomCert": "āŊĸāŊ„āŧ‹āŊĻāž’āž˛āŊ˛āŊ‚āŧ‹āŊŖāŊ‚āŧ‹āŊāžąāŊēāŊĸāŧ‹āŊĄāŊ˛āŊ‚āŧ‹āŊ†āŧ‹ X.509 (āŊ āŊ‘āŊ˜āŧ‹āŊ‚)", + "downloadCsv": "Download CSV", + "downloadJson": "Download JSON", + "downloadPdf": "Download PDF Report", + "downloadType": { + "csv": "CSV", + "json": "JSON", + "pdf": "PDF" }, - "submit": "āŊ–āŊĸāž—āŊēāŧ‹āŊĻāž’āžąāŊ´āŊĸāŧ" + "error": { + "allFailed": "Unable to validate the selected files.", + "partial": "Some files could not be validated.", + "reportGeneration": "Could not generate the PDF report. JSON and CSV are available.", + "unexpected": "Unexpected error during validation." + }, + "finalizing": "Preparing downloads...", + "issue": { + "certExpired": "Certificate expired", + "certRevocationUnknown": "Certificate revocation status unknown", + "certRevoked": "Certificate revoked", + "chainInvalid": "Certificate chain invalid", + "signatureInvalid": "Signature cryptographic check failed", + "trustInvalid": "Certificate not trusted" + }, + "noResults": "Run the validation to generate a report.", + "noSignaturesShort": "No signatures", + "processing": "Validating signatures...", + "report": { + "continued": "Continued", + "downloads": "Downloads", + "entryLabel": "Signature Summary", + "fields": { + "created": "Created", + "fileSize": "File Size", + "signatureCount": "Total Signatures", + "signatureDate": "Signature Date" + }, + "filesEvaluated": "{{count}} files evaluated", + "footer": "Validated via Stirling PDF", + "generatedAt": "Generated", + "noPdf": "PDF report will be available after a successful validation.", + "page": "Page", + "shortTitle": "Signature Summary", + "signatureCountLabel": "{{count}} signatures", + "signaturesFound": "{{count}} signatures detected", + "signaturesValid": "{{count}} fully valid", + "title": "Signature Validation Report" + }, + "settings": { + "certHint": "Upload a trusted X.509 certificate to validate against a custom trust source.", + "title": "Validation Settings" + }, + "signatureDate": "Signature Date", + "totalSignatures": "Total Signatures" }, - "replaceColorPdf": { - "tags": "āŊšāŊŧāŊĻāŧ‹āŊ‚āŊžāŊ˛āŧ‹āŊ–āŊĸāž—āŊēāŧ‹āŊĻāž’āžąāŊ´āŊĸāŧ,āŊ¤āŊŧāŊ‚āŧ‹āŊ„āŊŧāŊĻāŧ‹āŊ–āŊ€āŊŧāŊŖāŧ‹āŊĻāž¤āžąāŊŧāŊ‘īŋŊīŋŊīŋŊ,āŊĸāž’āžąāŊ–āŧ‹āŊ„āŊŧāŊĻāŧ,āŊžāŊ–āŊĻāŧ‹āŊžāŊ´āŧ‹āŊ•āžąāŊŧāŊ‚āŊĻāŧ" + "replaceColor": { + "tags": "Replace Colour,Page operations,Back end,server side", + "labels": { + "settings": "Settings", + "colourOperation": "Colour operation" + }, + "options": { + "highContrast": "High contrast", + "invertAll": "Invert all colours", + "custom": "Custom", + "cmyk": "Convert to CMYK" + }, + "tooltip": { + "header": { + "title": "Replace & Invert Colour Settings Overview" + }, + "description": { + "title": "Description", + "text": "Transform PDF colours to improve readability and accessibility. Choose from high contrast presets, invert all colours, or create custom colour schemes." + }, + "highContrast": { + "title": "High Contrast", + "text": "Apply predefined high contrast colour combinations designed for better readability and accessibility compliance.", + "bullet1": "White text on black background - Classic dark mode", + "bullet2": "Black text on white background - Standard high contrast", + "bullet3": "Yellow text on black background - High visibility option", + "bullet4": "Green text on black background - Alternative high contrast" + }, + "invertAll": { + "title": "Invert All Colours", + "text": "Completely invert all colours in the PDF, creating a negative-like effect. Useful for creating dark mode versions of documents or reducing eye strain in low-light conditions." + }, + "custom": { + "title": "Custom Colours", + "text": "Define your own text and background colours using the colour pickers. Perfect for creating branded documents or specific accessibility requirements.", + "bullet1": "Text colour - Choose the colour for text elements", + "bullet2": "Background colour - Set the background colour for the document" + }, + "cmyk": { + "title": "Convert to CMYK", + "text": "Convert the PDF from RGB colour space to CMYK colour space, optimized for professional printing. This process converts colours to the Cyan, Magenta, Yellow, Black model used by printers." + } + }, + "error": { + "failed": "An error occurred while processing the colour replacement." + } }, "login": { "title": "īŋŊāŊ„āŧ‹āŊ āŊ›āŊ´āŊŖāŧ", "header": "āŊ“āŊ„āŧ‹āŊ āŊ›āŊ´āŊŖāŧ", "signin": "āŊ“āŊ„āŧ‹āŊ āŊ›āŊ´āŊŖāŧ", + "signInWith": "Sign in with", + "signInAnonymously": "Sign Up as a Guest", "rememberme": "āŊ„āŧ‹āŊ‘āž˛āŊ“āŧ‹āŊ”āŊĸāŧ‹āŊ–āžąāŊēāŊ‘āŧ", "invalid": "āŊĻāž¤āžąāŊŧāŊ‘āŧ‹āŊ˜āŊ˛āŊ„āŧ‹āŊ„āŊ˜āŧ‹āŊ‚āŊĻāŊ„āŧ‹āŊšāŊ˛āŊ‚āŧ‹āŊ“āŊŧāŊĸāŧ‹āŊ āŊ‘āŊ´āŊ‚", "locked": "āŊāžąāŊēāŊ‘āŧ‹āŊ€āžąāŊ˛āŧ‹āŊāŊŧāŧ‹āŊ˜āŊ›āŊŧāŊ‘āŧ‹āŊŸāž­āŧ‹āŊĸāž’āžąāŊ‚āŧ‹āŊ–āŊĸāž’āžąāŊ–āŧ‹āŊŸāŊ˛āŊ“āŧ", @@ -1336,12 +3258,83 @@ "alreadyLoggedIn": "āŊāžąāŊēāŊ‘āŧ‹āŊĸāŊ„āŧ‹", "alreadyLoggedIn2": "āŊĻāž’āž˛āŊ˛āŊ‚āŧ‹āŊ†āŊĻāŧ‹āŊ“āŊ„āŧ‹āŊ“āŊ„āŧ‹āŊ āŊ›āŊ´āŊŖāŧ‹āŊ–āžąāŊĻāŧ‹āŊŸāŊ˛āŊ“āŧ āŊĻāž’āž˛āŊ˛āŊ‚āŧ‹āŊ†āŊĻāŧ‹āŊ“āŊĻāŧ‹āŊ•āžąāŊ˛āŊĸāŧ‹āŊ āŊāŊēāŊ“āŧ‹āŊ–āžąāŊĻāŧ‹āŊ“āŊĻāŧ‹āŊĄāŊ„āŧ‹āŊ–āŊĻāžāžąāŊĸāŧ‹āŊšāŊŧāŊ‘āŧ‹āŊŖāžŸāŧ‹āŊ–āžąāŊēāŊ‘āŧ‹āŊĸāŊŧāŊ‚āŊĻāŧ", "toManySessions": "āŊāžąāŊēāŊ‘āŧ‹āŊŖāŧ‹āŊ āŊ›āŊ´āŊŖāŧ‹āŊžāŊ´āŊ‚āŊĻāŧ‹āŊ–āžąāŊĻāŧ‹āŊ”āŊ āŊ˛āŧ‹āŊ‚āŊ“āŊĻāŧ‹āŊĻāžāŊ–āŊĻāŧ‹āŊ˜āŊ„āŧ‹āŊ‘āž˛āŊ‚āŊĻāŧ‹āŊ āŊ‘āŊ´āŊ‚", - "logoutMessage": "You have been logged out." + "logoutMessage": "You have been logged out.", + "youAreLoggedIn": "You are logged in!", + "email": "Email", + "password": "Password", + "enterEmail": "Enter your email", + "enterPassword": "Enter your password", + "loggingIn": "Logging In...", + "username": "Username", + "enterUsername": "Enter username", + "useEmailInstead": "Login with email", + "forgotPassword": "Forgot your password?", + "logIn": "Log In", + "signingIn": "Signing in...", + "login": "Login", + "or": "Or", + "useMagicLink": "Use magic link instead", + "enterEmailForMagicLink": "Enter your email for magic link", + "sending": "Sendingâ€Ļ", + "sendMagicLink": "Send Magic Link", + "cancel": "Cancel", + "dontHaveAccount": "Don't have an account? Sign up", + "home": "Home", + "debug": "Debug", + "signOut": "Sign Out", + "pleaseEnterBoth": "Please enter both email and password", + "pleaseEnterEmail": "Please enter your email address", + "magicLinkSent": "Magic link sent to {{email}}! Check your email and click the link to sign in.", + "passwordResetSent": "Password reset link sent to {{email}}! Check your email and follow the instructions.", + "failedToSignIn": "Failed to sign in with {{provider}}: {{message}}", + "unexpectedError": "Unexpected error: {{message}}", + "accountCreatedSuccess": "Account created successfully! You can now sign in.", + "passwordChangedSuccess": "Password changed successfully! Please sign in with your new password.", + "credentialsUpdated": "Your credentials have been updated. Please sign in again." + }, + "signup": { + "title": "Create an account", + "subtitle": "Join Stirling PDF to get started", + "name": "Name", + "email": "Email", + "password": "Password", + "confirmPassword": "Confirm password", + "enterName": "Enter your name", + "enterEmail": "Enter your email", + "enterPassword": "Enter your password", + "confirmPasswordPlaceholder": "Confirm password", + "or": "or", + "creatingAccount": "Creating Account...", + "signUp": "Sign Up", + "alreadyHaveAccount": "Already have an account? Sign in", + "pleaseFillAllFields": "Please fill in all fields", + "passwordsDoNotMatch": "Passwords do not match", + "passwordTooShort": "Password must be at least 6 characters long", + "invalidEmail": "Please enter a valid email address", + "checkEmailConfirmation": "Check your email for a confirmation link to complete your registration.", + "accountCreatedSuccessfully": "Account created successfully! You can now sign in.", + "unexpectedError": "Unexpected error: {{message}}", + "useEmailInstead": "Use Email Instead", + "nameRequired": "Name is required", + "emailRequired": "Email is required", + "passwordRequired": "Password is required", + "confirmPasswordRequired": "Please confirm your password" }, "pdfToSinglePage": { "title": "PDF āŊ“āŊĻāŧ‹āŊ¤āŊŧāŊ‚āŧ‹āŊ„āŊŧāŊĻāŧ‹āŊ‚āŊ…āŊ˛āŊ‚āŧ‹āŊŖāŧ", "header": "PDF āŊ“āŊĻāŧ‹āŊ¤āŊŧāŊ‚āŧ‹āŊ„āŊŧāŊĻāŧ‹āŊ‚āŊ…āŊ˛āŊ‚āŧ‹āŊŖāŧ", - "submit": "āŊ¤āŊŧāŊ‚āŧ‹āŊ„āŊŧāŊĻāŧ‹āŊ‚āŊ…āŊ˛āŊ‚āŧ‹āŊŖāŧ‹āŊ–āŊĻāž’āžąāŊ´āŊĸāŧ‹āŊ–āŧ" + "submit": "āŊ¤āŊŧāŊ‚āŧ‹āŊ„āŊŧāŊĻāŧ‹āŊ‚āŊ…āŊ˛āŊ‚āŧ‹āŊŖāŧ‹āŊ–āŊĻāž’āžąāŊ´āŊĸāŧ‹āŊ–āŧ", + "description": "This tool will merge all pages of your PDF into one large single page. The width will remain the same as the original pages, but the height will be the sum of all page heights.", + "filenamePrefix": "single_page", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst converting to single page." + }, + "results": { + "title": "Single Page Results" + } }, "pageExtracter": { "title": "āŊ¤āŊŧāŊ‚āŧ‹āŊ„āŊŧāŊĻāŧ‹āŊ•āžąāŊ˛āŊĸāŧ‹āŊ āŊ‘āŊŧāŊ“āŧ", @@ -1365,18 +3358,59 @@ "adjustContrast": { "title": "āŊ āŊŧāŊ‘āŧ‹āŊāžąāŊ‘āŧ‹āŊĻāž™āŊŧāŊ˜āŧ‹āŊĻāž’āž˛āŊ˛āŊ‚", "header": "āŊ āŊŧāŊ‘āŧ‹āŊāžąāŊ‘āŧ‹āŊĻāž™āŊŧāŊ˜āŧ‹āŊĻāž’āž˛āŊ˛āŊ‚", + "basic": "Basic Adjustments", "contrast": "āŊ āŊŧāŊ‘āŧ‹āŊāžąāŊ‘āŧ", "brightness": "āŊ‚āŊĻāŊŖāŧ‹āŊšāŊ‘āŧ", "saturation": "āŊ˜āŊ‘āŊŧāŊ‚āŧ‹āŊšāŊ‘āŧ", - "download": "āŊ•āŊ–āŧ‹āŊŖāŊēāŊ“āŧ" + "download": "āŊ•āŊ–āŧ‹āŊŖāŊēāŊ“āŧ", + "adjustColors": "Adjust Colors", + "blue": "Blue", + "confirm": "Confirm", + "error": { + "failed": "Failed to adjust colors/contrast" + }, + "green": "Green", + "noPreview": "Select a PDF to preview", + "red": "Red", + "results": { + "title": "Adjusted PDF" + } }, "compress": { "title": "āŊĻāžĄāŊ´āŊ‘āŧ‹āŊĻāž’āž˛āŊ˛āŊŖāŧ", + "desc": "Compress PDFs to reduce their file size.", "header": "PDF āŊĻāžĄāŊ´āŊ‘āŧ‹āŊĻāž’āž˛āŊ˛āŊŖāŧ", + "method": { + "title": "Compression Method", + "quality": "Quality", + "filesize": "File Size" + }, "credit": "āŊžāŊ–āŊĻāŧ‹āŊžāŊ´āŧ‹āŊ āŊ‘āŊ˛āŊĻāŧ‹ PDF āŊĻāžĄāŊ´āŊ‘āŧ‹āŊĻāž’āž˛āŊ˛āŊŖāŧ‹/āŊĄāŊĸāŧ‹āŊĸāž’āžąāŊĻāŧ‹āŊ‚āŊāŊŧāŊ„āŧ‹āŊ–āŊ āŊ˛āŧ‹āŊ†āŊēāŊ‘āŧ‹āŊ‘āŊ´āŧ‹ qpdf āŊ–āŊēāŊ‘āŧ‹āŊĻāž¤āžąāŊŧāŊ‘āŧ‹āŊ–āžąāŊēāŊ‘āŧ‹āŊ”āŧ", "grayscale": { "label": "åē”ᔍၰåēĻčŋ›čĄŒåŽ‹įŧŠ" }, + "tooltip": { + "header": { + "title": "Compress Settings Overview" + }, + "description": { + "title": "Description", + "text": "Compression is an easy way to reduce your file size. Pick File Size to enter a target size and have us adjust quality for you. Pick Quality to set compression strength manually." + }, + "qualityAdjustment": { + "title": "Quality Adjustment", + "text": "Drag the slider to adjust the compression strength. Lower values (1-3) preserve quality but result in larger files. Higher values (7-9) shrink the file more but reduce image clarity.", + "bullet1": "Lower values preserve quality", + "bullet2": "Higher values reduce file size" + }, + "grayscale": { + "title": "Grayscale", + "text": "Select this option to convert all images to black and white, which can significantly reduce file size especially for scanned PDFs or image-heavy documents." + } + }, + "error": { + "failed": "An error occurred while compressing the PDF." + }, "selectText": { "1": { "_value": "Compression Settings", @@ -1487,7 +3521,13 @@ "title": "āŊ”īŋŊāŧ‹āŊĸāŊ˛āŊĻāŧ‹āŊĻāŊ´āŊ–āŧ‹āŊ”āŧ", "header": "āŊ”āŊĸāŧ‹āŊĸāŊ˛āŊĻāŧ‹āŊĻāŊ´āŊ–āŧ‹āŊ”āŧ", "removeImage": "āŊ”āŊĸāŧ‹āŊĸāŊ˛āŊĻāŧ‹āŊĻāŊ´āŊ–āŧ‹āŊ”āŧ", - "submit": "āŊ”āŊĸāŧ‹āŊĸāŊ˛āŊĻāŧ‹āŊĻāŊ´āŊ–āŧ‹āŊ”āŧ" + "submit": "āŊ”āŊĸāŧ‹āŊĸāŊ˛āŊĻāŧ‹āŊĻāŊ´āŊ–āŧ‹āŊ”āŧ", + "error": { + "failed": "Failed to remove images from the PDF." + }, + "results": { + "title": "Remove Images Results" + } }, "splitByChapters": { "title": "āŊŖāŊēāŊ īŋŊāŧ‹āŊŖāžŸāŊĸāŧ‹ PDF āŊāŧ‹āŊ‚āžąāŊēāŊĻāŧ", @@ -1521,6 +3561,12 @@ }, "note": "āŊ”āŊĸāŧ‹āŊ‚āŊžāŊ˛āŧ‹āŊ‚āŊĻāŊĸāŧ‹āŊ”āŊ āŊ˛āŧ‹āŊ‚āŊĻāŊŖāŧ‹āŊ–āŊĻāž’āž˛āŊ‚āŊĻāŧ‹āŊ‘āŊ–āžąāŊ˛āŊ“āŧ‹āŊĄāŊ˛āŊ‚āŧ‹āŊāŊŧāŧ‹āŊ“āŊĸāŧ‹āŊĄāŊŧāŊ‘āŧ" }, + "swagger": { + "title": "API Documentation", + "header": "API Documentation", + "desc": "View and test the Stirling PDF API endpoints", + "tags": "api,documentation,swagger,endpoints,development" + }, "cookieBanner": { "popUp": { "title": "How we use Cookies", @@ -1556,6 +3602,1747 @@ "title": "Analytics", "description": "These cookies help us understand how our tools are being used, so we can focus on building the features our community values most. Rest assured—Stirling PDF cannot and will never track the content of the documents you work with." } + }, + "services": { + "posthog": "PostHog Analytics", + "scarf": "Scarf Pixel" } + }, + "removeMetadata": { + "submit": "Remove Metadata" + }, + "sidebar": { + "toggle": "Toggle Sidebar" + }, + "theme": { + "toggle": "Toggle Theme" + }, + "view": { + "viewer": "Viewer", + "pageEditor": "Page Editor", + "fileManager": "File Manager" + }, + "pageEditor": { + "title": "Page Editor", + "save": "Save Changes", + "noPdfLoaded": "No PDF loaded. Please upload a PDF to edit.", + "rotatedLeft": "Rotated left:", + "rotatedRight": "Rotated right:", + "deleted": "Deleted:", + "movedLeft": "Moved left:", + "movedRight": "Moved right:", + "splitAt": "Split at:", + "insertedPageBreak": "Inserted page break at:", + "addFileNotImplemented": "Add file not implemented in demo", + "closePdf": "Close PDF", + "reset": "Reset Changes", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "fitToWidth": "Fit to Width", + "actualSize": "Actual Size" + }, + "viewer": { + "firstPage": "First Page", + "lastPage": "Last Page", + "previousPage": "Previous Page", + "nextPage": "Next Page", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "singlePageView": "Single Page View", + "dualPageView": "Dual Page View" + }, + "rightRail": { + "closeSelected": "Close Selected Files", + "selectAll": "Select All", + "deselectAll": "Deselect All", + "selectByNumber": "Select by Page Numbers", + "deleteSelected": "Delete Selected Pages", + "closePdf": "Close PDF", + "exportAll": "Export PDF", + "downloadSelected": "Download Selected Files", + "downloadAll": "Download All", + "toggleTheme": "Toggle Theme", + "language": "Language", + "search": "Search PDF", + "panMode": "Pan Mode", + "rotateLeft": "Rotate Left", + "rotateRight": "Rotate Right", + "toggleSidebar": "Toggle Sidebar", + "exportSelected": "Export Selected Pages", + "toggleAnnotations": "Toggle Annotations Visibility", + "annotationMode": "Toggle Annotation Mode", + "draw": "Draw", + "save": "Save" + }, + "search": { + "title": "Search PDF", + "placeholder": "Enter search term...", + "noResults": "No results found", + "searching": "Searching..." + }, + "guestBanner": { + "title": "You're using Stirling PDF as a guest!", + "message": "Create a free account to save your work, access more features, and support the project.", + "dismiss": "Dismiss banner", + "signUp": "Sign Up Free" + }, + "toolPicker": { + "searchPlaceholder": "Search tools...", + "noToolsFound": "No tools found", + "allTools": "ALL TOOLS", + "quickAccess": "QUICK ACCESS", + "categories": { + "standardTools": "Standard Tools", + "advancedTools": "Advanced Tools", + "recommendedTools": "Recommended Tools" + }, + "subcategories": { + "signing": "Signing", + "documentSecurity": "Document Security", + "verification": "Verification", + "documentReview": "Document Review", + "pageFormatting": "Page Formatting", + "extraction": "Extraction", + "removal": "Removal", + "automation": "Automation", + "general": "General", + "advancedFormatting": "Advanced Formatting", + "developerTools": "Developer Tools" + } + }, + "quickAccess": { + "read": "Read", + "sign": "Sign", + "automate": "Automate", + "files": "Files", + "activity": "Activity", + "help": "Help", + "account": "Account", + "config": "Config", + "adminSettings": "Admin Settings", + "allTools": "All Tools" + }, + "admin": { + "error": "Error", + "success": "Success", + "expand": "Expand", + "close": "Close", + "status": { + "active": "Active", + "inactive": "Inactive" + }, + "settings": { + "title": "Admin Settings", + "workspace": "Workspace", + "fetchError": "Failed to load settings", + "saveError": "Failed to save settings", + "saved": "Settings saved successfully", + "saveSuccess": "Settings saved successfully", + "save": "Save Changes", + "restartRequired": "Restart Required", + "restart": { + "title": "Restart Required", + "message": "Settings have been saved successfully. A server restart is required for the changes to take effect.", + "question": "Would you like to restart the server now or later?", + "now": "Restart Now", + "later": "Restart Later" + }, + "restarting": "Restarting Server", + "restartingMessage": "The server is restarting. Please wait a moment...", + "restartError": "Failed to restart server. Please restart manually.", + "general": { + "title": "System Settings", + "description": "Configure system-wide application settings including branding and default behaviour.", + "ui": "User Interface", + "system": "System", + "appName": { + "label": "Application Name", + "description": "The name displayed in the browser tab and home page" + }, + "appNameNavbar": { + "label": "Navbar Brand", + "description": "The name displayed in the navigation bar" + }, + "homeDescription": { + "label": "Home Description", + "description": "The description text shown on the home page" + }, + "defaultLocale": { + "label": "Default Locale", + "description": "The default language for new users (e.g., en_US, es_ES)" + }, + "fileUploadLimit": { + "label": "File Upload Limit", + "description": "Maximum file upload size (e.g., 100MB, 1GB)" + }, + "showUpdate": { + "label": "Show Update Notifications", + "description": "Display notifications when a new version is available" + }, + "showUpdateOnlyAdmin": { + "label": "Show Updates to Admins Only", + "description": "Restrict update notifications to admin users only" + }, + "customHTMLFiles": { + "label": "Custom HTML Files", + "description": "Allow serving custom HTML files from the customFiles directory" + }, + "languages": { + "label": "Available Languages", + "description": "Languages that users can select from (leave empty to enable all languages)" + }, + "customMetadata": { + "label": "Custom Metadata", + "autoUpdate": { + "label": "Auto Update Metadata", + "description": "Automatically update PDF metadata on all processed documents" + }, + "author": { + "label": "Default Author", + "description": "Default author for PDF metadata (e.g., username)" + }, + "creator": { + "label": "Default Creator", + "description": "Default creator for PDF metadata" + }, + "producer": { + "label": "Default Producer", + "description": "Default producer for PDF metadata" + } + }, + "customPaths": { + "label": "Custom Paths", + "description": "Configure custom file system paths for pipeline processing and external tools", + "pipeline": { + "label": "Pipeline Directories", + "watchedFoldersDir": { + "label": "Watched Folders Directory", + "description": "Directory where pipeline monitors for incoming PDFs (leave empty for default: /pipeline/watchedFolders)" + }, + "finishedFoldersDir": { + "label": "Finished Folders Directory", + "description": "Directory where processed PDFs are outputted (leave empty for default: /pipeline/finishedFolders)" + } + }, + "operations": { + "label": "External Tool Paths", + "weasyprint": { + "label": "WeasyPrint Executable", + "description": "Path to WeasyPrint executable for HTML to PDF conversion (leave empty for default: /opt/venv/bin/weasyprint)" + }, + "unoconvert": { + "label": "Unoconvert Executable", + "description": "Path to LibreOffice unoconvert for document conversions (leave empty for default: /opt/venv/bin/unoconvert)" + } + } + } + }, + "security": { + "title": "Security", + "description": "Configure authentication, login behaviour, and security policies.", + "ssoNotice": { + "title": "Looking for SSO/SAML settings?", + "message": "OAuth2 and SAML2 authentication providers have been moved to the Connections menu for easier management." + }, + "authentication": "Authentication", + "enableLogin": { + "label": "Enable Login", + "description": "Require users to log in before accessing the application" + }, + "loginMethod": { + "label": "Login Method", + "description": "The authentication method to use for user login", + "all": "All Methods", + "normal": "Username/Password Only", + "oauth2": "OAuth2 Only", + "saml2": "SAML2 Only" + }, + "loginAttemptCount": { + "label": "Login Attempt Limit", + "description": "Maximum number of failed login attempts before account lockout" + }, + "loginResetTimeMinutes": { + "label": "Login Reset Time (minutes)", + "description": "Time before failed login attempts are reset" + }, + "csrfDisabled": { + "label": "Disable CSRF Protection", + "description": "Disable Cross-Site Request Forgery protection (not recommended)" + }, + "initialLogin": { + "label": "Initial Login", + "username": { + "label": "Initial Username", + "description": "The username for the initial admin account" + }, + "password": { + "label": "Initial Password", + "description": "The password for the initial admin account" + } + }, + "jwt": { + "label": "JWT Configuration", + "secureCookie": { + "label": "Secure Cookie", + "description": "Require HTTPS for JWT cookies (recommended for production)" + }, + "keyRetentionDays": { + "label": "Key Retention Days", + "description": "Number of days to retain old JWT keys for verification" + }, + "persistence": { + "label": "Enable Key Persistence", + "description": "Store JWT keys persistently to survive server restarts" + }, + "enableKeyRotation": { + "label": "Enable Key Rotation", + "description": "Automatically rotate JWT signing keys periodically" + }, + "enableKeyCleanup": { + "label": "Enable Key Cleanup", + "description": "Automatically remove expired JWT keys" + } + }, + "audit": { + "label": "Audit Logging", + "enabled": { + "label": "Enable Audit Logging", + "description": "Track user actions and system events for compliance and security monitoring" + }, + "level": { + "label": "Audit Level", + "description": "0=OFF, 1=BASIC, 2=STANDARD, 3=VERBOSE" + }, + "retentionDays": { + "label": "Audit Retention (days)", + "description": "Number of days to retain audit logs" + } + }, + "htmlUrlSecurity": { + "label": "HTML URL Security", + "description": "Configure URL access restrictions for HTML processing to prevent SSRF attacks", + "enabled": { + "label": "Enable URL Security", + "description": "Enable URL security restrictions for HTML to PDF conversions" + }, + "level": { + "label": "Security Level", + "description": "MAX: whitelist only, MEDIUM: block internal networks, OFF: no restrictions", + "max": "Maximum (Whitelist Only)", + "medium": "Medium (Block Internal)", + "off": "Off (No Restrictions)" + }, + "advanced": "Advanced Settings", + "allowedDomains": { + "label": "Allowed Domains (Whitelist)", + "description": "One domain per line (e.g., cdn.example.com). Only these domains allowed when level is MAX" + }, + "blockedDomains": { + "label": "Blocked Domains (Blacklist)", + "description": "One domain per line (e.g., malicious.com). Additional domains to block" + }, + "internalTlds": { + "label": "Internal TLDs", + "description": "One TLD per line (e.g., .local, .internal). Block domains with these TLD patterns" + }, + "networkBlocking": "Network Blocking", + "blockPrivateNetworks": { + "label": "Block Private Networks", + "description": "Block RFC 1918 private networks (10.x.x.x, 192.168.x.x, 172.16-31.x.x)" + }, + "blockLocalhost": { + "label": "Block Localhost", + "description": "Block localhost and loopback addresses (127.x.x.x, ::1)" + }, + "blockLinkLocal": { + "label": "Block Link-Local Addresses", + "description": "Block link-local addresses (169.254.x.x, fe80::/10)" + }, + "blockCloudMetadata": { + "label": "Block Cloud Metadata Endpoints", + "description": "Block cloud provider metadata endpoints (169.254.169.254)" + } + } + }, + "connections": { + "title": "Connections", + "description": "Configure external authentication providers like OAuth2 and SAML.", + "linkedServices": "Linked Services", + "unlinkedServices": "Unlinked Services", + "connect": "Connect", + "disconnect": "Disconnect", + "disconnected": "Provider disconnected successfully", + "disconnectError": "Failed to disconnect provider", + "ssoAutoLogin": { + "label": "SSO Auto Login", + "enable": "Enable SSO Auto Login", + "description": "Automatically redirect to SSO login when authentication is required" + }, + "oauth2": { + "label": "OAuth2", + "enabled": { + "label": "Enable OAuth2", + "description": "Allow users to authenticate using OAuth2 providers" + }, + "provider": { + "label": "Provider", + "description": "The OAuth2 provider to use for authentication" + }, + "issuer": { + "label": "Issuer URL", + "description": "The OAuth2 provider issuer URL" + }, + "clientId": { + "label": "Client ID", + "description": "The OAuth2 client ID from your provider" + }, + "clientSecret": { + "label": "Client Secret", + "description": "The OAuth2 client secret from your provider" + }, + "useAsUsername": { + "label": "Use as Username", + "description": "The OAuth2 claim to use as the username (e.g., email, sub)" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first OAuth2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via OAuth2" + }, + "scopes": { + "label": "OAuth2 Scopes", + "description": "Comma-separated list of OAuth2 scopes to request (e.g., openid, profile, email)" + } + }, + "saml2": { + "label": "SAML2", + "enabled": { + "label": "Enable SAML2", + "description": "Allow users to authenticate using SAML2 providers" + }, + "provider": { + "label": "Provider", + "description": "The SAML2 provider name" + }, + "registrationId": { + "label": "Registration ID", + "description": "The SAML2 registration identifier" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first SAML2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via SAML2" + } + } + }, + "database": { + "title": "Database", + "description": "Configure custom database connection settings for enterprise deployments.", + "configuration": "Database Configuration", + "enableCustom": { + "label": "Enable Custom Database", + "description": "Use your own custom database configuration instead of the default embedded database" + }, + "customUrl": { + "label": "Custom Database URL", + "description": "Full JDBC connection string (e.g., jdbc:postgresql://localhost:5432/postgres). If provided, individual connection settings below are not used." + }, + "type": { + "label": "Database Type", + "description": "Type of database (not used if custom URL is provided)" + }, + "hostName": { + "label": "Host Name", + "description": "Database server hostname (not used if custom URL is provided)" + }, + "port": { + "label": "Port", + "description": "Database server port (not used if custom URL is provided)" + }, + "name": { + "label": "Database Name", + "description": "Name of the database (not used if custom URL is provided)" + }, + "username": { + "label": "Username", + "description": "Database authentication username" + }, + "password": { + "label": "Password", + "description": "Database authentication password" + } + }, + "privacy": { + "title": "Privacy", + "description": "Configure privacy and data collection settings.", + "analytics": "Analytics & Tracking", + "enableAnalytics": { + "label": "Enable Analytics", + "description": "Collect anonymous usage analytics to help improve the application" + }, + "metricsEnabled": { + "label": "Enable Metrics", + "description": "Enable collection of performance and usage metrics. Provides API endpoint for admins to access metrics data" + }, + "searchEngine": "Search Engine Visibility", + "googleVisibility": { + "label": "Google Visibility", + "description": "Allow search engines to index this application" + } + }, + "advanced": { + "title": "Advanced", + "description": "Configure advanced features and experimental functionality.", + "features": "Feature Flags", + "processing": "Processing", + "endpoints": { + "label": "Endpoints", + "manage": "Manage API Endpoints", + "description": "Endpoint management is configured via YAML. See documentation for details on enabling/disabling specific endpoints." + }, + "enableAlphaFunctionality": { + "label": "Enable Alpha Features", + "description": "Enable experimental and alpha-stage features (may be unstable)" + }, + "enableUrlToPDF": { + "label": "Enable URL to PDF", + "description": "Allow conversion of web pages to PDF documents" + }, + "maxDPI": { + "label": "Maximum DPI", + "description": "Maximum DPI for image processing (0 = unlimited)" + }, + "tessdataDir": { + "label": "Tessdata Directory", + "description": "Path to the tessdata directory for OCR language files" + }, + "disableSanitize": { + "label": "Disable HTML Sanitization", + "description": "WARNING: Security risk - disabling HTML sanitization can lead to XSS vulnerabilities" + }, + "tempFileManagement": { + "label": "Temp File Management", + "description": "Configure temporary file storage and cleanup behavior", + "baseTmpDir": { + "label": "Base Temp Directory", + "description": "Base directory for temporary files (leave empty for default: java.io.tmpdir/stirling-pdf)" + }, + "libreofficeDir": { + "label": "LibreOffice Temp Directory", + "description": "Directory for LibreOffice temp files (leave empty for default: baseTmpDir/libreoffice)" + }, + "systemTempDir": { + "label": "System Temp Directory", + "description": "System temp directory to clean (only used if cleanupSystemTemp is enabled)" + }, + "prefix": { + "label": "Temp File Prefix", + "description": "Prefix for temp file names" + }, + "maxAgeHours": { + "label": "Max Age (hours)", + "description": "Maximum age in hours before temp files are cleaned up" + }, + "cleanupIntervalMinutes": { + "label": "Cleanup Interval (minutes)", + "description": "How often to run cleanup (in minutes)" + }, + "startupCleanup": { + "label": "Startup Cleanup", + "description": "Clean up old temp files on application startup" + }, + "cleanupSystemTemp": { + "label": "Cleanup System Temp", + "description": "Whether to clean broader system temp directory (use with caution)" + } + }, + "processExecutor": { + "label": "Process Executor Limits", + "description": "Configure session limits and timeouts for each process executor", + "sessionLimit": { + "label": "Session Limit", + "description": "Maximum concurrent instances" + }, + "timeout": { + "label": "Timeout (minutes)", + "description": "Maximum execution time" + }, + "libreOffice": "LibreOffice", + "pdfToHtml": "PDF to HTML", + "qpdf": "QPDF", + "tesseract": "Tesseract OCR", + "pythonOpenCv": "Python OpenCV", + "weasyPrint": "WeasyPrint", + "installApp": "Install App", + "calibre": "Calibre", + "ghostscript": "Ghostscript", + "ocrMyPdf": "OCRmyPDF" + } + }, + "mail": { + "title": "Mail Server", + "description": "Configure SMTP settings for sending email notifications.", + "smtp": "SMTP Configuration", + "enabled": { + "label": "Enable Mail", + "description": "Enable email notifications and SMTP functionality" + }, + "host": { + "label": "SMTP Host", + "description": "The hostname or IP address of your SMTP server" + }, + "port": { + "label": "SMTP Port", + "description": "The port number for SMTP connection (typically 25, 465, or 587)" + }, + "username": { + "label": "SMTP Username", + "description": "Username for SMTP authentication" + }, + "password": { + "label": "SMTP Password", + "description": "Password for SMTP authentication" + }, + "from": { + "label": "From Address", + "description": "The email address to use as the sender" + }, + "enableInvites": { + "label": "Enable Email Invites", + "description": "Allow admins to invite users via email with auto-generated passwords" + }, + "frontendUrl": { + "label": "Frontend URL", + "description": "Base URL for frontend (e.g. https://pdf.example.com). Used for generating invite links in emails. Leave empty to use backend URL." + } + }, + "legal": { + "title": "Legal Documents", + "description": "Configure links to legal documents and policies.", + "disclaimer": { + "title": "Legal Responsibility Warning", + "message": "By customizing these legal documents, you assume full responsibility for ensuring compliance with all applicable laws and regulations, including but not limited to GDPR and other EU data protection requirements. Only modify these settings if: (1) you are operating a personal/private instance, (2) you are outside EU jurisdiction and understand your local legal obligations, or (3) you have obtained proper legal counsel and accept sole responsibility for all user data and legal compliance. Stirling-PDF and its developers assume no liability for your legal obligations." + }, + "termsAndConditions": { + "label": "Terms and Conditions", + "description": "URL or filename to terms and conditions" + }, + "privacyPolicy": { + "label": "Privacy Policy", + "description": "URL or filename to privacy policy" + }, + "accessibilityStatement": { + "label": "Accessibility Statement", + "description": "URL or filename to accessibility statement" + }, + "cookiePolicy": { + "label": "Cookie Policy", + "description": "URL or filename to cookie policy" + }, + "impressum": { + "label": "Impressum", + "description": "URL or filename to impressum (required in some jurisdictions)" + } + }, + "premium": { + "title": "Premium & Enterprise", + "description": "Configure your premium or enterprise license key.", + "license": "License Configuration", + "key": { + "label": "License Key", + "description": "Enter your premium or enterprise license key" + }, + "enabled": { + "label": "Enable Premium Features", + "description": "Enable license key checks for pro/enterprise features" + }, + "movedFeatures": { + "title": "Premium Features Distributed", + "message": "Premium and Enterprise features are now organized in their respective sections:" + } + }, + "features": { + "title": "Features", + "description": "Configure optional features and functionality.", + "serverCertificate": { + "label": "Server Certificate", + "description": "Configure server-side certificate generation for \"Sign with Stirling-PDF\" functionality", + "enabled": { + "label": "Enable Server Certificate", + "description": "Enable server-side certificate for \"Sign with Stirling-PDF\" option" + }, + "organizationName": { + "label": "Organization Name", + "description": "Organization name for generated certificates" + }, + "validity": { + "label": "Certificate Validity (days)", + "description": "Number of days the certificate will be valid" + }, + "regenerateOnStartup": { + "label": "Regenerate on Startup", + "description": "Generate new certificate on each application startup" + } + } + }, + "endpoints": { + "title": "API Endpoints", + "description": "Control which API endpoints and endpoint groups are available.", + "management": "Endpoint Management", + "toRemove": { + "label": "Disabled Endpoints", + "description": "Select individual endpoints to disable" + }, + "groupsToRemove": { + "label": "Disabled Endpoint Groups", + "description": "Select endpoint groups to disable" + }, + "note": "Note: Disabling endpoints restricts API access but does not remove UI components. Restart required for changes to take effect." + } + } + }, + "fileUpload": { + "selectFile": "Select a file", + "selectFiles": "Select files", + "selectPdfToView": "Select a PDF to view", + "selectPdfToEdit": "Select a PDF to edit", + "chooseFromStorage": "Choose a file from storage or upload a new PDF", + "chooseFromStorageMultiple": "Choose files from storage or upload new PDFs", + "loadFromStorage": "Load from Storage", + "filesAvailable": "files available", + "loading": "Loading...", + "or": "or", + "dropFileHere": "Drop file here or click to upload", + "dropFilesHere": "Drop files here or click the upload button", + "pdfFilesOnly": "PDF files only", + "supportedFileTypes": "Supported file types", + "upload": "Upload", + "uploadFile": "Upload File", + "uploadFiles": "Upload Files", + "noFilesInStorage": "No files available in storage. Upload some files first.", + "selectFromStorage": "Select from Storage", + "backToTools": "Back to Tools", + "addFiles": "Add Files", + "dragFilesInOrClick": "Drag files in or click \"Add Files\" to browse" + }, + "fileEditor": { + "addFiles": "Add Files" + }, + "fileManager": { + "title": "Upload PDF Files", + "subtitle": "Add files to your storage for easy access across tools", + "filesSelected": "files selected", + "clearSelection": "Clear Selection", + "openInFileEditor": "Open in File Editor", + "uploadError": "Failed to upload some files.", + "failedToOpen": "Failed to open file. It may have been removed from storage.", + "failedToLoad": "Failed to load file to active set.", + "storageCleared": "Browser cleared storage. Files have been removed. Please re-upload.", + "clearAll": "Clear All", + "reloadFiles": "Reload Files", + "dragDrop": "Drag & Drop files here", + "clickToUpload": "Click to upload files", + "selectedFiles": "Selected Files", + "storage": "Storage", + "filesStored": "files stored", + "storageError": "Storage error occurred", + "storageLow": "Storage is running low. Consider removing old files.", + "supportMessage": "Powered by browser database storage for unlimited capacity", + "noFileSelected": "No files selected", + "showHistory": "Show History", + "hideHistory": "Hide History", + "fileHistory": "File History", + "loadingHistory": "Loading History...", + "lastModified": "Last Modified", + "toolChain": "Tools Applied", + "restore": "Restore", + "unzip": "Unzip", + "searchFiles": "Search files...", + "recent": "Recent", + "localFiles": "Local Files", + "googleDrive": "Google Drive", + "googleDriveShort": "Drive", + "myFiles": "My Files", + "noRecentFiles": "No recent files found", + "googleDriveNotAvailable": "Google Drive integration not available", + "openFiles": "Open Files", + "openFile": "Open File", + "details": "File Details", + "fileName": "Name", + "fileFormat": "Format", + "fileSize": "Size", + "fileVersion": "Version", + "totalSelected": "Total Selected", + "dropFilesHere": "Drop files here", + "selectAll": "Select All", + "deselectAll": "Deselect All", + "deleteSelected": "Delete Selected", + "downloadSelected": "Download Selected", + "selectedCount": "{{count}} selected", + "download": "Download", + "delete": "Delete", + "unsupported": "Unsupported", + "addToUpload": "Add to Upload", + "deleteAll": "Delete All", + "loadingFiles": "Loading files...", + "noFiles": "No files available", + "noFilesFound": "No files found matching your search", + "openInPageEditor": "Open in Page Editor", + "showAll": "Show All", + "sortByDate": "Sort by Date", + "sortByName": "Sort by Name", + "sortBySize": "Sort by Size" + }, + "storage": { + "temporaryNotice": "Files are stored temporarily in your browser and may be cleared automatically", + "storageLimit": "Storage limit", + "storageUsed": "Temporary Storage used", + "storageFull": "Storage is nearly full. Consider removing some files.", + "fileTooLarge": "File too large. Maximum size per file is", + "storageQuotaExceeded": "Storage quota exceeded. Please remove some files before uploading more.", + "approximateSize": "Approximate size" + }, + "sanitize": { + "title": "Sanitise", + "desc": "Remove potentially harmful elements from PDF files.", + "submit": "Sanitise PDF", + "completed": "Sanitisation completed successfully", + "error": { + "generic": "Sanitisation failed", + "failed": "An error occurred while sanitising the PDF." + }, + "filenamePrefix": "sanitised", + "sanitizationResults": "Sanitisation Results", + "steps": { + "files": "Files", + "settings": "Settings", + "results": "Results" + }, + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "options": { + "title": "Sanitisation Options", + "note": "Select the elements you want to remove from the PDF. At least one option must be selected.", + "removeJavaScript": { + "label": "Remove JavaScript", + "desc": "Remove JavaScript actions and scripts from the PDF" + }, + "removeEmbeddedFiles": { + "label": "Remove Embedded Files", + "desc": "Remove any files embedded within the PDF" + }, + "removeXMPMetadata": { + "label": "Remove XMP Metadata", + "desc": "Remove XMP metadata from the PDF" + }, + "removeMetadata": { + "label": "Remove Document Metadata", + "desc": "Remove document information metadata (title, author, etc.)" + }, + "removeLinks": { + "label": "Remove Links", + "desc": "Remove external links and launch actions from the PDF" + }, + "removeFonts": { + "label": "Remove Fonts", + "desc": "Remove embedded fonts from the PDF" + } + } + }, + "addPassword": { + "title": "āŊ‚āŊĻāŊ„āŧ‹āŊšāŊ˛āŊ‚āŧ‹āŊĻāžŖāŊŧāŊ“āŧ‹āŊ”āŧ", + "desc": "Encrypt your PDF document with a password.", + "completed": "Password protection applied", + "submit": "āŊ‚āŊĻāŊ„āŧ‹āŊ–āŊĻāž’āžąāŊ´āŊĸāŧ", + "filenamePrefix": "encrypted", + "error": { + "failed": "An error occurred while encrypting the PDF." + }, + "passwords": { + "stepTitle": "Passwords & Encryption", + "completed": "Passwords configured", + "user": { + "label": "User Password", + "placeholder": "Enter user password" + }, + "owner": { + "label": "Owner Password", + "placeholder": "Enter owner password" + } + }, + "encryption": { + "keyLength": { + "label": "Encryption Key Length", + "40bit": "40-bit (Low)", + "128bit": "128-bit (Standard)", + "256bit": "256-bit (High)" + } + }, + "results": { + "title": "Encrypted PDFs" + }, + "tooltip": { + "header": { + "title": "Password Protection Overview" + }, + "passwords": { + "title": "Password Types", + "text": "User passwords restrict opening the document, while owner passwords control what can be done with the document once opened. You can set both or just one.", + "bullet1": "User Password: Required to open the PDF", + "bullet2": "Owner Password: Controls document permissions (not supported by all PDF viewers)" + }, + "encryption": { + "title": "Encryption Levels", + "text": "Higher encryption levels provide better security but may not be supported by older PDF viewers.", + "bullet1": "40-bit: Basic security, compatible with older viewers", + "bullet2": "128-bit: Standard security, widely supported", + "bullet3": "256-bit: Maximum security, requires modern viewers" + }, + "permissions": { + "title": "Change Permissions", + "text": "These permissions control what users can do with the PDF. Most effective when combined with an owner password." + } + }, + "tags": "āŊ–āŊ‘āŊēāŧ‹āŊ āŊ‡āŊ‚āŊĻāŧ,āŊ‰āŊēāŊ“āŧ‹āŊĻāž˛āŊ´āŊ„āŧ‹āŧ", + "header": "āŊ‚āŊĻāŊ„āŧ‹āŊšāŊ˛āŊ‚āŧ‹āŊĻāžŖāŊŧāŊ“āŧ‹āŊ”āŧ (āŊ‚āŊĻāŊ„āŧ‹āŊĻāžĄāŊŧāŊ˜āŧ)", + "selectText": { + "1": "āŊ‚āŊĻāŊ„āŧ‹āŊĻāžĄāŊŧāŊ˜āŧ‹āŊ–āžąāŧ‹āŊĸāž’āžąāŊ´āŊ āŊ˛āŧ‹ PDF āŊ āŊ‘āŊēāŊ˜āŊĻāŧ‹āŊ”āŧ", + "2": "āŊĻāž¤āžąāŊŧāŊ‘āŧ‹āŊ˜āŊāŊ“āŧ‹āŊ‚āžąāŊ˛āŧ‹āŊ‚āŊĻāŊ„āŧ‹āŊšāŊ˛āŊ‚", + "3": "āŊ‚āŊĻāŊ„āŧ‹āŊĻāžĄāŊŧāŊ˜āŧ‹āŊŖāžĄāŊēāŧ‹āŊ˜āŊ˛āŊ‚āŧ‹āŊ‚āŊ˛āŧ‹āŊĸāŊ˛āŊ„āŧ‹āŊšāŊ‘āŧ", + "4": "āŊšāŊ‘āŧ‹āŊ˜āŊāŊŧāŧ‹āŊ–āŧ‹āŊĸāžŖāŊ˜āŊĻāŧ‹āŊĻāž˛āŧ‹āŊ–āŊĸāžŸāŊ“āŧ‹āŊ†āŊēāŧ‹āŊ–āŧ‹āŊĄāŊŧāŊ‘āŧ āŊ āŊŧāŊ“āŧ‹āŊ€āžąāŊ„āŧ‹āŊšāŊ‘āŧ‹āŊ‘āŊ˜āŊ āŧ‹āŊ–āŧ‹āŊĸāžŖāŊ˜āŊĻāŧ‹āŊ āŊ†āŊ˜āŧ‹āŊ˜āŊāŊ´āŊ“āŧ‹āŊĸāŊ„āŧ‹āŊ–āŊžāŊ˛āŊ“āŧ‹āŊ–āŊŸāŊ„āŧ‹āŊ–āŧ‹āŊĄāŊŧāŊ‘āŧ", + "5": "āŊ†āŊŧāŊ‚āŧ‹āŊ˜āŊ†āŊ“āŧ‹āŊĻāž’āž˛āŊ˛āŊ‚āŧ‹āŊ āŊ‚āŊŧāŊ‘āŧ (āŊ–āŊ‘āŊ‚āŧ‹āŊ”āŊŧāŊ āŊ˛āŧ‹āŊ‚āŊĻāŊ„āŧ‹āŊšāŊ˛āŊ‚āŧ‹āŊ‘āŊ„āŧ‹āŊ˜āŊ‰āŊ˜āŧ‹āŊ‘āŊ´āŧ‹āŊ–āŊēāŊ‘āŧ‹āŊĻāž¤āžąāŊŧāŊ‘āŧ‹āŊ–āžąāŊēāŊ‘āŧ‹āŊ”āŊĸāŧ‹āŊ āŊŧāŊĻāŧ‹āŊĻāžĻāžąāŊŧāŊĸāŧ‹āŊ–āžąāŊēāŊ‘āŧ)", + "6": "āŊĄāŊ˛āŊ‚āŧ‹āŊ†āŧ‹āŊĻāž’āž˛āŊ˛āŊ‚āŧ‹āŊĻāžĻāžąāŊŧāŊĸāŧ‹āŊ āŊ‚āŊŧāŊ‚āŧ‹āŊ”āŧ", + "7": "āŊ“āŊ„āŧ‹āŊ‘āŊŧāŊ“āŧ‹āŊ•āžąāŊ˛āŊĸāŧ‹āŊ āŊ‘āŊŧāŊ“āŧ‹āŊ āŊ‚āŊŧāŊ‚āŧ‹āŊ”āŧ", + "8": "āŊ˜āŊāŊ´āŊ“āŧ‹āŊĸāžāžąāŊēāŊ“āŧ‹āŊ‚āžąāŊ˛āŧ‹āŊ†āŊēāŊ‘āŧ‹āŊ‘āŊ´āŧ‹āŊ•āžąāŊ˛āŊĸāŧ‹āŊ āŊ‘āŊŧāŊ“āŧ‹āŊ āŊ‚āŊŧāŊ‚āŧ‹āŊ”āŧ", + "9": "āŊ āŊ‚āŊēāŊ„āŊĻāŧ‹āŊ¤āŊŧāŊ‚āŧ‹āŊ–āŊ€āŊ„āŧ‹āŊ–āŧ‹āŊ āŊ‚āŊŧāŊ‚āŧ‹āŊ”āŧ", + "10": "āŊ–āŊŸāŊŧāŧ‹āŊ–āŊ…āŊŧāŊĻāŧ‹āŊ āŊ‚āŊŧāŊ‚āŧ‹āŊ”āŧ", + "11": "āŊ˜āŊ†āŊ“āŧ‹āŊ āŊ‚āž˛āŊēāŊŖāŧ‹āŊ–āŊŸāŊŧāŧ‹āŊ–āŊ…āŊŧāŊĻāŧ‹āŊ āŊ‚āŊŧāŊ‚āŧ‹āŊ”āŧ", + "12": "Prevent printin", + "13": "Prevent printing different formats", + "14": "āŊĻāž¤āžąāŊŧāŊ‘āŧ‹āŊ˜āŊāŊ“āŧ‹āŊ‚āžąāŊ˛āŧ‹āŊ‚āŊĻāŊ„āŧ‹āŊ‚āž˛āŊ„āŊĻāŧ", + "15": "āŊĄāŊ˛āŊ‚āŧ‹āŊšāŊ‚āŊĻāŧ‹āŊĸāŊ„āŧ‹āŊĻāžŸāŊēāŊ„āŧ‹āŊāŧ‹āŊ•āžąāŊēāŊĻāŧ‹āŊĸāž’āžąāŊ´āŊĸāŧ‹āŊ–āŊ€āŊ‚āŧ‹āŊĻāžĄāŊŧāŊ˜āŧ‹āŊ–āžąāŊēāŊ‘āŧ āŊ āŊ‘āŊ˛āŧ‹āŊŖāžŸāŊĸāŧ‹āŊ–āžąāŊĻāŧ‹āŊ“āŧ‹āŊ€āžŗāŊŧāŊ‚āŧ‹āŊ†āŊĻāŧ‹āŊ€āžąāŊ˛āŊĻāŧ‹āŊ“āŊ´āŊĻāŧ‹āŊ”āŧ‹āŊāŊŧāŊ“āŧ‹āŊ”āŧ‹āŊ”āŊ āŊ˛āŧ‹āŊ„āŊēāŊĻāŧ‹āŊ”āŧ‹āŊ˜āŊēāŊ‘āŧ", + "16": "āŊĄāŊ˛āŊ‚āŧ‹āŊšāŊ‚āŊĻāŧ‹āŊĸāŊ„āŧ‹āŊĻāžŸāŊēāŊ„āŧ‹āŊāŧ‹āŊ•āžąāŊēāŊĻāŧ‹āŊĸāž’āžąāŊ´āŊĸāŧ‹āŊ–āŊ€āŊ‚āŧ‹āŊĻāžĄāŊŧāŊ˜āŧ‹āŊ–āžąāŊēāŊ‘āŧ" + } + }, + "changePermissions": { + "title": "Change Permissions", + "desc": "Change document restrictions and permissions.", + "completed": "Permissions changed", + "submit": "Change Permissions", + "error": { + "failed": "An error occurred while changing PDF permissions." + }, + "permissions": { + "preventAssembly": { + "label": "Prevent assembly of document" + }, + "preventExtractContent": { + "label": "Prevent content extraction" + }, + "preventExtractForAccessibility": { + "label": "Prevent extraction for accessibility" + }, + "preventFillInForm": { + "label": "Prevent filling in form" + }, + "preventModify": { + "label": "Prevent modification" + }, + "preventModifyAnnotations": { + "label": "Prevent annotation modification" + }, + "preventPrinting": { + "label": "Prevent printing" + }, + "preventPrintingFaithful": { + "label": "Prevent printing different formats" + } + }, + "results": { + "title": "Modified PDFs" + }, + "tooltip": { + "header": { + "title": "Change Permissions" + }, + "description": { + "text": "Changes document permissions, allowing/disallowing access to different features in PDF readers." + }, + "warning": { + "text": "To make these permissions unchangeable, use the Add Password tool to set an owner password." + } + } + }, + "removePassword": { + "title": "āŊ‚āŊĻāŊ„āŧ‹āŊšāŊ˛āŊ‚āŧ‹āŊĻāŊ´āŊ–āŧ‹āŊ”āŧ", + "desc": "Remove password protection from your PDF document.", + "tags": "āŊ–āŊ‘āŊēāŧ‹āŊ āŊ‡āŊ‚āŊĻāŧ,āŊ‚āŊĻāŊ„āŧ‹āŊĻāžĄāŊŧāŊ˜āŧ‹āŊ‚āž˛āŊŧāŊŖāŧ‹āŊ–āŧ,āŊ‰āŊēāŊ“āŧ‹āŊĻāž˛āŊ´āŊ„āŧ‹āŧ,āŊ‚āŊĻāŊ„āŧ‹āŊšāŊ˛āŊ‚āŧ‹āŊ˜āŊēāŊ‘āŧ‹āŊ”āŧ,āŊ‚āŊĻāŊ„āŧ‹āŊšāŊ˛āŊ‚āŧ‹āŊĻāŊ´āŊ–āŧ‹āŊ”āŧ", + "password": { + "stepTitle": "Remove Password", + "label": "Current Password", + "placeholder": "Enter current password", + "completed": "Password configured" + }, + "filenamePrefix": "decrypted", + "error": { + "failed": "An error occurred while removing the password from the PDF." + }, + "tooltip": { + "description": "Removing password protection requires the password that was used to encrypt the PDF. This will decrypt the document, making it accessible without a password." + }, + "submit": "āŊĻāŊ´āŊ–āŧ‹āŊ”āŧ", + "results": { + "title": "Decrypted PDFs" + }, + "header": "āŊ‚āŊĻāŊ„āŧ‹āŊšāŊ˛āŊ‚āŧ‹āŊĻāŊ´āŊ–āŧ‹āŊ”āŧ (āŊ‚āŊĻāŊ„āŧ‹āŊĻāžĄāŊŧāŊ˜āŧ‹āŊ‚āž˛āŊŧāŊŖāŧ‹āŊ–āŧ)", + "selectText": { + "1": "āŊ‚āŊĻāŊ„āŧ‹āŊĻāžĄāŊŧāŊ˜āŧ‹āŊ‚āž˛āŊŧāŊŖāŧ‹āŊĸāž’āžąāŊ´āŊ āŊ˛āŧ‹ PDF āŊ āŊ‘āŊēāŊ˜āŊĻāŧ‹āŊ”āŧ", + "2": "āŊ‚āŊĻāŊ„āŧ‹āŊšāŊ˛āŊ‚" + } + }, + "automate": { + "title": "Automate", + "desc": "Build multi-step workflows by chaining together PDF actions. Ideal for recurring tasks.", + "invalidStep": "Invalid step", + "files": { + "placeholder": "Select files to process with this automation" + }, + "selection": { + "title": "Automation Selection", + "saved": { + "title": "Saved" + }, + "createNew": { + "title": "Create New Automation" + }, + "suggested": { + "title": "Suggested" + } + }, + "creation": { + "createTitle": "Create Automation", + "editTitle": "Edit Automation", + "intro": "Automations run tools sequentially. To get started, add tools in the order you want them to run.", + "name": { + "label": "Automation Name", + "placeholder": "My Automation" + }, + "description": { + "label": "Description (optional)", + "placeholder": "Describe what this automation does..." + }, + "tools": { + "selectTool": "Select a tool...", + "selected": "Selected Tools", + "remove": "Remove tool", + "configure": "Configure tool", + "notConfigured": "! Not Configured", + "addTool": "Add Tool", + "add": "Add a tool..." + }, + "save": "Save Automation", + "unsavedChanges": { + "title": "Unsaved Changes", + "message": "You have unsaved changes. Are you sure you want to go back? All changes will be lost.", + "cancel": "Cancel", + "confirm": "Go Back" + }, + "icon": { + "label": "Icon" + } + }, + "run": { + "title": "Run Automation" + }, + "sequence": { + "unnamed": "Unnamed Automation", + "steps": "{{count}} steps", + "running": "Running Automation...", + "run": "Run Automation", + "finish": "Finish" + }, + "reviewTitle": "Automation Results", + "config": { + "loading": "Loading tool configuration...", + "noSettings": "This tool does not have configurable settings.", + "title": "Configure {{toolName}}", + "description": "Configure the settings for this tool. These settings will be applied when the automation runs.", + "cancel": "Cancel", + "save": "Save Configuration" + }, + "copyToSaved": "Copy to Saved" + }, + "automation": { + "suggested": { + "securePdfIngestion": "Secure PDF Ingestion", + "securePdfIngestionDesc": "Comprehensive PDF processing workflow that sanitises documents, applies OCR with cleanup, converts to PDF/A format for long-term archival, and optimises file size.", + "emailPreparation": "Email Preparation", + "emailPreparationDesc": "Optimises PDFs for email distribution by compressing files, splitting large documents into 20MB chunks for email compatibility, and removing metadata for privacy.", + "secureWorkflow": "Security Workflow", + "secureWorkflowDesc": "Secures PDF documents by removing potentially malicious content like JavaScript and embedded files, then adds password protection to prevent unauthorised access. Password is set to 'password' by default.", + "processImages": "Process Images", + "processImagesDesc": "Converts multiple image files into a single PDF document, then applies OCR technology to extract searchable text from the images." + } + }, + "common": { + "copy": "Copy", + "copied": "Copied!", + "refresh": "Refresh", + "retry": "Retry", + "remaining": "remaining", + "used": "used", + "available": "available", + "cancel": "Cancel", + "preview": "Preview" + }, + "config": { + "overview": { + "title": "Application Configuration", + "description": "Current application settings and configuration details." + }, + "account": { + "overview": { + "title": "Account Settings", + "manageAccountPreferences": "Manage your account preferences", + "guestDescription": "You are signed in as a guest. Consider upgrading your account above." + }, + "upgrade": { + "title": "Upgrade Guest Account", + "description": "Link your account to preserve your history and access more features!", + "socialLogin": "Upgrade with Social Account", + "linkWith": "Link with", + "emailPassword": "or enter your email & password", + "email": "Email", + "emailPlaceholder": "Enter your email", + "password": "Password (optional)", + "passwordPlaceholder": "Set a password", + "passwordNote": "Leave empty to use email verification only", + "upgradeButton": "Upgrade Account" + } + }, + "apiKeys": { + "description": "Your API key for accessing Stirling's suite of PDF tools. Copy it to your project or refresh to generate a new one.", + "publicKeyAriaLabel": "Public API key", + "copyKeyAriaLabel": "Copy API key", + "refreshAriaLabel": "Refresh API key", + "includedCredits": "Included credits", + "purchasedCredits": "Purchased credits", + "totalCredits": "Total Credits", + "chartAriaLabel": "Credits usage: included {{includedUsed}} of {{includedTotal}}, purchased {{purchasedUsed}} of {{purchasedTotal}}", + "nextReset": "Next Reset", + "lastApiUse": "Last API Use", + "overlayMessage": "Generate a key to see credits and available credits", + "label": "API Key", + "guestInfo": "Guest users do not receive API keys. Create an account to get an API key you can use in your applications.", + "goToAccount": "Go to Account", + "refreshModal": { + "title": "Refresh API Keys", + "warning": "âš ī¸ Warning: This action will generate new API keys and make your previous keys invalid.", + "impact": "Any applications or services currently using these keys will stop working until you update them with the new keys.", + "confirmPrompt": "Are you sure you want to continue?", + "confirmCta": "Refresh Keys" + }, + "generateError": "We couldn't generate your API key." + } + }, + "AddAttachmentsRequest": { + "attachments": "Select Attachments", + "info": "Select files to attach to your PDF. These files will be embedded and accessible through the PDF's attachment panel.", + "selectFiles": "Select Files to Attach", + "placeholder": "Choose files...", + "addMoreFiles": "Add more files...", + "selectedFiles": "Selected Files", + "submit": "Add Attachments", + "results": { + "title": "Attachment Results" + }, + "error": { + "failed": "Add attachments operation failed" + } + }, + "termsAndConditions": "Terms & Conditions", + "logOut": "Log out", + "addAttachments": { + "error": { + "failed": "An error occurred while adding attachments to the PDF." + } + }, + "autoRename": { + "description": "This tool will automatically rename PDF files based on their content. It analyzes the document to find the most suitable title from the text." + }, + "customPosition": "Custom Position", + "details": "Details", + "downloadUnavailable": "Download unavailable for this item", + "invalidUndoData": "Cannot undo: invalid operation data", + "margin": { + "large": "Large", + "medium": "Medium", + "small": "Small", + "xLarge": "Extra Large" + }, + "noFilesToUndo": "Cannot undo: no files were processed in the last operation", + "noOperationToUndo": "No operation to undo", + "noValidFiles": "No valid files to process", + "operationCancelled": "Operation cancelled", + "pageEdit": { + "deselectAll": "Select None", + "selectAll": "Select All" + }, + "quickPosition": "Quick Position", + "reorganizePages": { + "error": { + "failed": "Failed to reorganize pages" + }, + "results": { + "title": "Pages Reorganized" + }, + "settings": { + "title": "Settings" + }, + "submit": "Reorganize Pages" + }, + "replace-color": { + "options": { + "fill": "Fill colour", + "gradient": "Gradient" + }, + "previewOverlayOpacity": "Preview overlay opacity", + "previewOverlayTransparency": "Preview overlay transparency", + "previewOverlayVisibility": "Show preview overlay", + "selectText": { + "1": "āŊšāŊŧāŊĻāŧ‹āŊ‚āŊžāŊ˛āŧ‹āŊ–āŊĸāž—āŊēāŧ‹āŊĻāž’āžąāŊ´āŊĸāŧ‹āŊĸāŊ˜āŧ‹āŊŖāžĄāŊŧāŊ‚āŧ‹āŊĻāž’āžąāŊ´āŊĸāŧ‹āŊ‚āžąāŊ˛āŧ‹āŊ‚āŊ‘āŊ˜āŧ‹āŊ‚", + "2": "āŊĻāž”āŊŧāŊ“āŧ‹āŊĻāž’āž˛āŊ˛āŊ‚ (āŊĻāž”āŊŧāŊ“āŧ‹āŊĻāž’āž˛āŊ˛āŊ‚āŧ‹āŊ‚āŊ˛āŧ‹āŊ āŊŧāŊ‘āŧ‹āŊāžąāŊ‘āŧ‹āŊ˜āŊāŊŧāŧ‹āŊ–āŊ āŊ˛āŧ‹āŊšāŊŧāŊĻāŧ‹āŊ‚āŊžāŊ˛āŧ)", + "3": "āŊĸāŊ„āŧ‹āŊĻāž’āž˛āŊ˛āŊ‚ (āŊĸāŊ„āŧ‹āŊĻāž’āž˛āŊ˛āŊ‚āŧ‹āŊ‚āŊ˛āŧ‹āŊšāŊŧāŊĻāŧ‹āŊ‚āŊžāŊ˛āŧ)", + "4": "āŊĄāŊŧāŊ„āŊĻāŧ‹āŊĸāžĢāŊŧāŊ‚āŊĻāŧ‹āŊŖāžĄāŊŧāŊ‚āŧ‹āŊĻāž’āžąāŊ´āŊĸāŧ (āŊšāŊŧāŊĻāŧ‹āŊ‚āŊžāŊ˛āŧ‹āŊšāŊ„āŧ‹āŊ˜āŧ‹āŊŖāžĄāŊŧāŊ‚āŧ‹āŊĻāž’āžąāŊ´āŊĸāŧ)", + "5": "āŊ āŊŧāŊ‘āŧ‹āŊāžąāŊ‘āŧ‹āŊ˜āŊāŊŧāŧ‹āŊ–āŊ āŊ˛āŧ‹āŊšāŊŧāŊĻāŧ‹āŊ‚āŊžāŊ˛āŊ āŊ˛āŧ‹āŊ‚āŊ‘āŊ˜āŧ‹āŊ‚", + "6": "āŊĸāž’āžąāŊ–āŧ‹āŊŖāž—āŊŧāŊ„āŊĻāŧ‹āŊ“āŊ‚āŧ‹āŊ”āŊŧāŊ āŊ˛āŧ‹āŊĻāžŸāŊēāŊ„āŧ‹āŊ‚āŊ˛āŧ‹āŊĄāŊ˛āŧ‹āŊ‚āŊēāŧ‹āŊ‘āŊ€āŊĸāŧ‹āŊ”āŊŧāŧ", + "7": "āŊĸāž’āžąāŊ–āŧ‹āŊŖāž—āŊŧāŊ„āŊĻāŧ‹āŊ‘āŊ€āŊĸāŧ‹āŊ”āŊŧāŊ āŊ˛āŧ‹āŊĻāžŸāŊēāŊ„āŧ‹āŊ‚āŊ˛āŧ‹āŊĄāŊ˛āŧ‹āŊ‚āŊēāŧ‹āŊ“āŊ‚āŧ‹āŊ”āŊŧāŧ", + "8": "āŊĸāž’āžąāŊ–āŧ‹āŊŖāž—āŊŧāŊ„āŊĻāŧ‹āŊ“āŊ‚āŧ‹āŊ”āŊŧāŊ āŊ˛āŧ‹āŊĻāžŸāŊēāŊ„āŧ‹āŊ‚āŊ˛āŧ‹āŊĄāŊ˛āŧ‹āŊ‚āŊēāŧ‹āŊĻāŊēāŊĸāŧ‹āŊ”āŊŧāŧ", + "9": "āŊĸāž’āžąāŊ–āŧ‹āŊŖāž—āŊŧāŊ„āŊĻāŧ‹āŊ“āŊ‚āŧ‹āŊ”āŊŧāŊ āŊ˛āŧ‹āŊĻāžŸāŊēāŊ„āŧ‹āŊ‚āŊ˛āŧ‹āŊĄāŊ˛āŧ‹āŊ‚āŊēāŧ‹āŊŖāž—āŊ„āŧ‹āŊāŊ´āŧ", + "10": "āŊĄāŊ˛āŧ‹āŊ‚āŊēāŊ āŊ˛āŧ‹āŊšāŊŧāŊĻāŧ‹āŊ‚āŊžāŊ˛āŧ‹āŊ āŊ‘āŊēāŊ˜āŊĻāŧ‹āŊ”āŧ", + "11": "āŊĸāž’āžąāŊ–āŧ‹āŊŖāž—āŊŧāŊ„āŊĻāŧ‹āŊ€āžąāŊ˛āŧ‹āŊšāŊŧāŊĻāŧ‹āŊ‚āŊžāŊ˛āŧ‹āŊ āŊ‘āŊēāŊ˜āŊĻāŧ‹āŊ”āŧ", + "12": "Choose start colour", + "13": "Choose end colour" + }, + "submit": "āŊ–āŊĸāž—āŊēāŧ‹āŊĻāž’āžąāŊ´āŊĸāŧ", + "title": "āŊšāŊŧāŊĻāŧ‹āŊ‚āŊžāŊ˛āŊ āŊ˛āŧ‹āŊ‚āŊ‘āŊ˜āŧ‹āŊ‚āŧ‹āŊ˜āŊāŊŧāŧ‹āŊĸāŊ˛āŊ˜āŧ", + "header": "āŊšāŊŧāŊĻāŧ‹āŊ‚āŊžāŊ˛āŧ‹āŊ–āŊĸāž—āŊēāŧ‹āŊĻāž’āžąāŊ´āŊĸāŧ‹-āŊŖāžĄāŊŧāŊ‚āŧ‹āŊĻāž’āžąāŊ´āŊĸāŧ‹ PDF" + }, + "size": "Size", + "submit": "Submit", + "success": "Success", + "tools": { + "noSearchResults": "No tools found", + "noTools": "No tools available" + }, + "undoDataMismatch": "Cannot undo: operation data is corrupted", + "undoFailed": "Failed to undo operation", + "undoQuotaError": "Cannot undo: insufficient storage space", + "undoStorageError": "Undo completed but some files could not be saved to storage", + "undoSuccess": "Operation undone successfully", + "unsupported": "Unsupported", + "onboarding": { + "welcomeModal": { + "title": "Welcome to Stirling PDF!", + "description": "Would you like to take a quick 1-minute tour to learn the key features and how to get started?", + "helpHint": "You can always access this tour later from the Help button in the bottom left.", + "startTour": "Start Tour", + "maybeLater": "Maybe Later", + "dontShowAgain": "Don't Show Again" + }, + "allTools": "This is the All Tools panel, where you can browse and select from all available PDF tools.", + "selectCropTool": "Let's select the Crop tool to demonstrate how to use one of the tools.", + "toolInterface": "This is the Crop tool interface. As you can see, there's not much there because we haven't added any PDF files to work with yet.", + "filesButton": "The Files button on the Quick Access bar allows you to upload PDFs to use the tools on.", + "fileSources": "You can upload new files or access recent files from here. For the tour, we'll just use a sample file.", + "workbench": "This is the Workbench - the main area where you view and edit your PDFs.", + "viewSwitcher": "Use these controls to select how you want to view your PDFs.", + "viewer": "The Viewer lets you read and annotate your PDFs.", + "pageEditor": "The Page Editor allows you to do various operations on the pages within your PDFs, such as reordering, rotating and deleting.", + "activeFiles": "The Active Files view shows all of the PDFs you have loaded into the tool, and allows you to select which ones to process.", + "fileCheckbox": "Clicking one of the files selects it for processing. You can select multiple files for batch operations.", + "selectControls": "The Right Rail contains buttons to quickly select/deselect all of your active PDFs, along with buttons to change the app's theme or language.", + "cropSettings": "Now that we've selected the file we want crop, we can configure the Crop tool to choose the area that we want to crop the PDF to.", + "runButton": "Once the tool has been configured, this button allows you to run the tool on all the selected PDFs.", + "results": "After the tool has finished running, the Review step will show a preview of the results in this panel, and allow you to undo the operation or download the file. ", + "fileReplacement": "The modified file will replace the original file in the Workbench automatically, allowing you to easily run it through more tools.", + "pinButton": "You can use the Pin button if you'd rather your files stay active after running tools on them.", + "wrapUp": "You're all set! You've learnt about the main areas of the app and how to use them. Click the Help button whenever you like to see this tour again.", + "previous": "Previous", + "next": "Next", + "finish": "Finish", + "startTour": "Start Tour", + "startTourDescription": "Take a guided tour of Stirling PDF's key features" + }, + "workspace": { + "title": "Workspace", + "people": { + "title": "People", + "description": "Manage workspace members and their permissions", + "loading": "Loading people...", + "searchMembers": "Search members...", + "addMembers": "Add Members", + "inviteMembers": { + "label": "Invite Members", + "subtitle": "Type or paste in emails below, separated by commas. Your workspace will be billed by members." + }, + "user": "User", + "role": "Role", + "team": "Team", + "status": "Status", + "actions": "Actions", + "noMembersFound": "No members found", + "active": "Active", + "disabled": "Disabled", + "activeSession": "Active session", + "member": "Member", + "admin": "Admin", + "roleDescriptions": { + "admin": "Can manage settings and invite members, with full administrative access.", + "member": "Can view and edit shared files, but cannot manage workspace settings or members." + }, + "editRole": "Edit Role", + "enable": "Enable", + "disable": "Disable", + "deleteUser": "Delete User", + "deleteUserSuccess": "User deleted successfully", + "deleteUserError": "Failed to delete user", + "confirmDelete": "Are you sure you want to delete this user? This action cannot be undone.", + "addMember": { + "title": "Add Member", + "username": "Username (Email)", + "usernamePlaceholder": "user@example.com", + "password": "Password", + "passwordPlaceholder": "Enter password", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "forcePasswordChange": "Force password change on first login", + "cancel": "Cancel", + "submit": "Add Member", + "usernameRequired": "Username and password are required", + "passwordTooShort": "Password must be at least 6 characters", + "success": "User created successfully", + "error": "Failed to create user" + }, + "editMember": { + "title": "Edit Member", + "editing": "Editing:", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "cancel": "Cancel", + "submit": "Update Member", + "success": "User updated successfully", + "error": "Failed to update user" + }, + "toggleEnabled": { + "success": "User status updated successfully", + "error": "Failed to update user status" + }, + "delete": { + "success": "User deleted successfully", + "error": "Failed to delete user" + }, + "emailInvite": { + "tab": "Email Invite", + "description": "Type or paste in emails below, separated by commas. Users will receive login credentials via email.", + "emails": "Email Addresses", + "emailsPlaceholder": "user1@example.com, user2@example.com", + "emailsRequired": "At least one email address is required", + "submit": "Send Invites", + "success": "user(s) invited successfully", + "partialSuccess": "Some invites failed", + "allFailed": "Failed to invite users", + "error": "Failed to send invites" + }, + "directInvite": { + "tab": "Direct Create" + }, + "inviteLinkTab": { + "tab": "Invite Link" + }, + "inviteLink": { + "description": "Generate a secure link that allows the user to set their own password", + "email": "Email Address", + "emailPlaceholder": "user@example.com (optional)", + "emailDescription": "Optional - leave blank for a general invite link that can be used by anyone", + "emailRequired": "Email address is required", + "emailOptional": "Optional - leave blank for a general invite link", + "emailRequiredForSend": "Email address is required to send email notification", + "expiryHours": "Expiry Hours", + "expiryDescription": "How many hours until the link expires", + "sendEmail": "Send invite link via email", + "sendEmailDescription": "If enabled, the invite link will be sent to the specified email address", + "smtpRequired": "SMTP not configured", + "generate": "Generate Link", + "generated": "Invite Link Generated", + "copied": "Link copied to clipboard", + "success": "Invite link generated successfully", + "successWithEmail": "Invite link generated and sent via email", + "emailFailed": "Invite link generated, but email failed", + "emailFailedDetails": "Error: {0}. Please share the invite link manually.", + "error": "Failed to generate invite link", + "submit": "Generate Invite Link" + }, + "inviteMode": { + "username": "Username", + "email": "Email", + "link": "Link", + "emailDisabled": "Email invites require SMTP configuration and mail.enableInvites=true in settings" + }, + "license": { + "users": "users", + "availableSlots": "Available Slots", + "grandfathered": "Grandfathered", + "grandfatheredShort": "{{count}} grandfathered", + "fromLicense": "from license", + "slotsAvailable": "{{count}} user slot(s) available", + "noSlotsAvailable": "No slots available", + "currentUsage": "Currently using {{current}} of {{max}} user licences" + } + }, + "teams": { + "title": "Teams", + "description": "Manage teams and organize workspace members", + "loading": "Loading teams...", + "loadingDetails": "Loading team details...", + "createNewTeam": "Create New Team", + "teamName": "Team Name", + "totalMembers": "Total Members", + "actions": "Actions", + "noTeamsFound": "No teams found", + "noMembers": "No members in this team", + "system": "System", + "addMember": "Add Member", + "viewTeam": "View Team", + "removeMember": "Remove from team", + "cannotRemoveFromSystemTeam": "Cannot remove from system team", + "renameTeamLabel": "Rename Team", + "deleteTeamLabel": "Delete Team", + "cannotDeleteInternal": "Cannot delete the Internal team", + "confirmDelete": "Are you sure you want to delete this team? This team must be empty to delete.", + "confirmRemove": "Remove user from this team?", + "cannotRenameInternal": "Cannot rename the Internal team", + "cannotAddToInternal": "Cannot add members to the Internal team", + "teamNotFound": "Team not found", + "backToTeams": "Back to Teams", + "memberCount": "{{count}} members", + "removeMemberSuccess": "User removed from team", + "removeMemberError": "Failed to remove user from team", + "createTeam": { + "title": "Create New Team", + "teamName": "Team Name", + "teamNamePlaceholder": "Enter team name", + "cancel": "Cancel", + "submit": "Create Team", + "nameRequired": "Team name is required", + "success": "Team created successfully", + "error": "Failed to create team" + }, + "renameTeam": { + "title": "Rename Team", + "renaming": "Renaming:", + "newTeamName": "New Team Name", + "newTeamNamePlaceholder": "Enter new team name", + "cancel": "Cancel", + "submit": "Rename Team", + "nameRequired": "Team name is required", + "success": "Team renamed successfully", + "error": "Failed to rename team" + }, + "deleteTeam": { + "success": "Team deleted successfully", + "error": "Failed to delete team. Make sure the team is empty.", + "teamMustBeEmpty": "Team must be empty before deletion" + }, + "addMemberToTeam": { + "title": "Add Member to Team", + "addingTo": "Adding to", + "selectUser": "Select User", + "selectUserPlaceholder": "Choose a user", + "selectUserRequired": "Please select a user", + "currentlyIn": "currently in", + "willBeMoved": "Note: This user will be moved from their current team to this team.", + "cancel": "Cancel", + "submit": "Add Member", + "userRequired": "Please select a user", + "success": "Member added to team successfully", + "error": "Failed to add member to team" + }, + "changeTeam": { + "label": "Change Team", + "title": "Change Team", + "changing": "Moving", + "selectTeam": "Select Team", + "selectTeamPlaceholder": "Choose a team", + "selectTeamRequired": "Please select a team", + "success": "Team changed successfully", + "error": "Failed to change team", + "submit": "Change Team" + } + } + }, + "plan": { + "currency": "Currency", + "popular": "Popular", + "current": "Current Plan", + "upgrade": "Upgrade", + "contact": "Contact Us", + "customPricing": "Custom", + "showComparison": "Compare All Features", + "hideComparison": "Hide Feature Comparison", + "featureComparison": "Feature Comparison", + "activePlan": { + "title": "Active Plan", + "subtitle": "Your current subscription details" + }, + "availablePlans": { + "title": "Available Plans", + "subtitle": "Choose the plan that fits your needs" + }, + "static": { + "title": "Billing Information", + "message": "Online billing is not currently configured. To upgrade your plan or manage subscriptions, please contact us directly.", + "contactSales": "Contact Sales", + "contactToUpgrade": "Contact us to upgrade or customize your plan", + "maxUsers": "Max Users", + "upTo": "Up to" + }, + "period": { + "month": "month" + }, + "free": { + "name": "Free", + "highlight1": "Limited Tool Usage Per week", + "highlight2": "Access to all tools", + "highlight3": "Community support" + }, + "pro": { + "name": "Pro", + "highlight1": "Unlimited Tool Usage", + "highlight2": "Advanced PDF tools", + "highlight3": "No watermarks" + }, + "enterprise": { + "name": "Enterprise", + "highlight1": "Custom pricing", + "highlight2": "Dedicated support", + "highlight3": "Latest features" + }, + "feature": { + "title": "Feature", + "pdfTools": "Basic PDF Tools", + "fileSize": "File Size Limit", + "automation": "Automate tool workflows", + "api": "API Access", + "priority": "Priority Support", + "customPricing": "Custom Pricing" + } + }, + "subscription": { + "status": { + "active": "Active", + "pastDue": "Past Due", + "canceled": "Canceled", + "incomplete": "Incomplete", + "trialing": "Trial", + "none": "No Subscription" + }, + "renewsOn": "Renews on {{date}}", + "cancelsOn": "Cancels on {{date}}" + }, + "billing": { + "manageBilling": "Manage Billing", + "portal": { + "error": "Failed to open billing portal" + } + }, + "payment": { + "preparing": "Preparing your checkout...", + "upgradeTitle": "Upgrade to {{planName}}", + "success": "Payment Successful!", + "successMessage": "Your subscription has been activated successfully. You will receive a confirmation email shortly.", + "autoClose": "This window will close automatically...", + "error": "Payment Error" + }, + "firstLogin": { + "title": "First Time Login", + "welcomeTitle": "Welcome!", + "welcomeMessage": "For security reasons, you must change your password on your first login.", + "loggedInAs": "Logged in as", + "error": "Error", + "currentPassword": "Current Password", + "enterCurrentPassword": "Enter your current password", + "newPassword": "New Password", + "enterNewPassword": "Enter new password (min 8 characters)", + "confirmPassword": "Confirm New Password", + "reEnterNewPassword": "Re-enter new password", + "changePassword": "Change Password", + "allFieldsRequired": "All fields are required", + "passwordsDoNotMatch": "New passwords do not match", + "passwordTooShort": "Password must be at least 8 characters", + "passwordMustBeDifferent": "New password must be different from current password", + "passwordChangedSuccess": "Password changed successfully! Please log in again.", + "passwordChangeFailed": "Failed to change password. Please check your current password." + }, + "invite": { + "welcome": "Welcome to Stirling PDF", + "invalidToken": "Invalid invitation link", + "validationError": "Failed to validate invitation link", + "passwordRequired": "Password is required", + "passwordTooShort": "Password must be at least 6 characters", + "passwordMismatch": "Passwords do not match", + "acceptError": "Failed to create account", + "validating": "Validating invitation...", + "invalidInvitation": "Invalid Invitation", + "goToLogin": "Go to Login", + "welcomeTitle": "You've been invited!", + "welcomeSubtitle": "Complete your account setup to get started", + "accountFor": "Creating account for", + "linkExpires": "Link expires", + "email": "Email address", + "emailPlaceholder": "Enter your email address", + "emailRequired": "Email address is required", + "invalidEmail": "Invalid email address", + "choosePassword": "Choose a password", + "passwordPlaceholder": "Enter your password", + "confirmPassword": "Confirm password", + "confirmPasswordPlaceholder": "Re-enter your password", + "createAccount": "Create Account", + "creating": "Creating Account...", + "alreadyHaveAccount": "Already have an account?", + "signIn": "Sign in" + }, + "audit": { + "error": { + "title": "Error loading audit system" + }, + "notAvailable": "Audit system not available", + "notAvailableMessage": "The audit system is not configured or not available.", + "disabled": "Audit logging is disabled", + "disabledMessage": "Enable audit logging in your application configuration to track system events.", + "systemStatus": { + "title": "System Status", + "status": "Audit Logging", + "enabled": "Enabled", + "disabled": "Disabled", + "level": "Audit Level", + "retention": "Retention Period", + "days": "days", + "totalEvents": "Total Events" + }, + "tabs": { + "dashboard": "Dashboard", + "events": "Audit Events", + "export": "Export" + }, + "charts": { + "title": "Audit Dashboard", + "error": "Error loading charts", + "day": "Day", + "week": "Week", + "month": "Month", + "byType": "Events by Type", + "byUser": "Events by User", + "overTime": "Events Over Time" + }, + "events": { + "title": "Audit Events", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "error": "Error loading events", + "noEvents": "No events found", + "timestamp": "Timestamp", + "type": "Type", + "user": "User", + "ipAddress": "IP Address", + "actions": "Actions", + "viewDetails": "View Details", + "eventDetails": "Event Details", + "details": "Details" + }, + "export": { + "title": "Export Audit Data", + "description": "Export audit events to CSV or JSON format. Use filters to limit the exported data.", + "format": "Export Format", + "filters": "Filters (Optional)", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "exportButton": "Export Data", + "error": "Failed to export data" + } + }, + "usage": { + "noData": "No data available", + "error": "Error loading usage statistics", + "noDataMessage": "No usage statistics are currently available.", + "controls": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All", + "refresh": "Refresh", + "dataTypeLabel": "Data Type:", + "dataType": { + "all": "All", + "api": "API", + "ui": "UI" + } + }, + "showing": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All" + }, + "stats": { + "totalEndpoints": "Total Endpoints", + "totalVisits": "Total Visits", + "showing": "Showing", + "selectedVisits": "Selected Visits" + }, + "chart": { + "title": "Endpoint Usage Chart" + }, + "table": { + "title": "Detailed Statistics", + "endpoint": "Endpoint", + "visits": "Visits", + "percentage": "Percentage", + "noData": "No data available" + } + }, + "backendHealth": { + "checking": "Checking backend status...", + "online": "Backend Online", + "offline": "Backend Offline" + }, + "autoRedact": { + "tags": "āŊĻāž’āž˛āŊ˛āŊ–āŧ‹āŊĻāž˛āŊ´āŊ„āŧ‹āŧ,āŊĻāžĻāŊĻāŧ‹āŊ”āŧ,āŊ“āŊ‚āŧ‹āŊ”āŊŧāŊĻāŧ‹āŊĻāž’āž˛āŊ˛āŊ–āŧ‹āŊ”āŧ,āŊ“āŊ‚āŧ‹āŊ”āŊŧāŧ,āŊĸāžŸāŊ‚āŊĻāŧ‹āŊĸāž’āžąāŊ‚,āŊĻāžĻāŊĻāŧ‹āŊ”āŧ", + "title": "āŊĸāŊ„āŧ‹āŊ āŊ‚āŊ´āŊŖāŧ‹āŊĻāž’āž˛āŊ˛āŊ–āŧ‹āŊĻāž˛āŊ´āŊ„āŧ‹āŧ", + "header": "āŊĸāŊ„āŧ‹āŊ āŊ‚āŊ´āŊŖāŧ‹āŊĻāž’āž˛āŊ˛āŊ–āŧ‹āŊĻāž˛āŊ´āŊ„āŧ‹āŧ", + "colorLabel": "āŊšāŊŧāŊĻāŧ‹āŊ‚āŊžāŊ˛āŧ", + "textsToRedactLabel": "āŊĻāž’āž˛āŊ˛āŊ–āŧ‹āŊĸāž’āžąāŊ´āŊ āŊ˛āŧ‹āŊĄāŊ˛āŧ‹āŊ‚āŊēāŧ (āŊāŊ˛āŊ‚āŧ‹āŊ•āž˛āŊēāŊ„āŧ‹āŊĻāŊŧāŧ‹āŊĻāŊŧāŊĸāŧ)", + "textsToRedactPlaceholder": "āŊ‘āŊ”āŊēāŊĸāŧ‹āŊ“āŧ \\nāŊ‚āŊĻāŊ„āŧ‹āŊ–āŧ \\nāŊ‚āŊĻāŊ„āŧ‹āŊ†āŊēāŧ", + "useRegexLabel": "Regex āŊ–āŊēāŊ‘āŧ‹āŊĻāž¤āžąāŊŧāŊ‘āŧ", + "wholeWordSearchLabel": "āŊšāŊ˛āŊ‚āŧ‹āŊ†āŧ‹āŊšāŊ„āŧ‹āŊ āŊšāŊŧāŊŖāŧ‹āŊ–āŧ", + "customPaddingLabel": "āŊ˜āŊāŊ āŧ‹āŊ˜āŊšāŊ˜āŊĻāŧ‹āŊĻāžŸāŊŧāŊ„āŧ‹āŊ†āŧ‹āŊĻāžŖāŊŧāŊ“āŧ‹āŊ”āŧ", + "convertPDFToImageLabel": "PDF āŊ“āŊĻāŧ‹ PDF-āŊ”āŊĸāŧ‹āŊĸāŊ˛āŊĻāŧ‹āŊŖāŧ‹āŊ–āŊĻāž’āžąāŊ´āŊĸāŧ‹āŊ–āŧ (āŊĻāž’āž˛āŊŧāŊ˜āŧ‹āŊ‚āžąāŊ˛āŧ‹āŊĸāž’āžąāŊ–āŧ‹āŊ€āžąāŊ˛āŧ‹āŊĄāŊ˛āŧ‹āŊ‚āŊēāŧ‹āŊĻāŊ´āŊ–āŧ‹āŊ”āŊĸāŧ‹āŊ–āŊēāŊ‘āŧ‹āŊĻāž¤āžąāŊŧāŊ‘āŧ)", + "submitButton": "āŊ•āŊ´āŊŖāŧ‹āŊ–āŧ" + }, + "replaceColorPdf": { + "tags": "āŊšāŊŧāŊĻāŧ‹āŊ‚āŊžāŊ˛āŧ‹āŊ–āŊĸāž—āŊēāŧ‹āŊĻāž’āžąāŊ´āŊĸāŧ,āŊ¤āŊŧāŊ‚āŧ‹āŊ„āŊŧāŊĻāŧ‹āŊ–āŊ€āŊŧāŊŖāŧ‹āŊĻāž¤āžąāŊŧāŊ‘īŋŊīŋŊīŋŊ,āŊĸāž’āžąāŊ–āŧ‹āŊ„āŊŧāŊĻāŧ,āŊžāŊ–āŊĻāŧ‹āŊžāŊ´āŧ‹āŊ•āžąāŊŧāŊ‚āŊĻāŧ" } } diff --git a/frontend/public/locales/zh-CN/translation.json b/frontend/public/locales/zh-CN/translation.json index dd34c090e..0154128b3 100644 --- a/frontend/public/locales/zh-CN/translation.json +++ b/frontend/public/locales/zh-CN/translation.json @@ -1,4 +1,40 @@ { + "toolPanel": { + "modePrompt": { + "title": "Choose how you browse tools", + "description": "Preview both layouts and decide how you want to explore Stirling PDF tools.", + "sidebarTitle": "Sidebar mode", + "sidebarDescription": "Keep tools alongside your workspace for quick switching.", + "recommended": "Recommended", + "chooseSidebar": "Use sidebar mode", + "fullscreenTitle": "Fullscreen mode - (legacy)", + "fullscreenDescription": "Browse every tool in a catalogue that covers the workspace until you pick one.", + "chooseFullscreen": "Use fullscreen mode", + "dismiss": "Maybe later" + }, + "fullscreen": { + "showDetails": "Show Details", + "comingSoon": "Coming soon:", + "favorite": "Add to favourites", + "favorites": "Favourites", + "heading": "All tools (fullscreen view)", + "noResults": "Try adjusting your search or toggle descriptions to find what you need.", + "recommended": "Recommended", + "unfavorite": "Remove from favourites" + }, + "placeholder": "Choose a tool to get started", + "toggle": { + "fullscreen": "Switch to fullscreen mode", + "sidebar": "Switch to sidebar mode" + } + }, + "unsavedChanges": "æ‚¨įš„ PDF 有æœĒäŋå­˜įš„æ›´æ”šã€‚æ‚¨æƒŗåšäģ€äšˆ?", + "areYouSure": "Are you sure you want to leave?", + "unsavedChangesTitle": "æœĒäŋå­˜įš„æ›´æ”š", + "keepWorking": "įģ§įģ­åˇĨäŊœ", + "discardChanges": "攞åŧƒæ›´æ”š", + "applyAndContinue": "åē”ᔍåšļįģ§įģ­", + "exportAndContinue": "å¯ŧå‡ēåšļįģ§įģ­", "language": { "direction": "ltr" }, @@ -18,8 +54,26 @@ "customTextDesc": "č‡Ē厚䚉文æœŦ", "numberPagesDesc": "čρæˇģ加éĄĩį įš„éĄĩ数īŧŒéģ˜čޤä¸ē“所有”īŧŒäšŸå¯äģĨæŽĨ受1-5或2,5,9į­‰", "customNumberDesc": "éģ˜čޤä¸ē {n}īŧŒäšŸå¯äģĨæŽĨ受“įŦŦ {n} éĄĩ/å…ą {total} éĄĩ”īŧŒâ€œæ–‡æœŦ-{n}”īŧŒâ€œ{filename}-{n}”", - "submit": "æˇģ加éĄĩ᠁" + "submit": "æˇģ加éĄĩ᠁", + "configuration": "Configuration", + "customize": "Customize Appearance", + "pagesAndStarting": "Pages & Starting Number", + "positionAndPages": "Position & Pages", + "error": { + "failed": "Add page numbers operation failed" + }, + "results": { + "title": "Page Number Results" + }, + "preview": "Position Selection", + "previewDisclaimer": "Preview is approximate. Final output may vary due to PDF font metrics." }, + "pageSelectionPrompt": "č‡Ē厚䚉éĄĩéĸ选拊īŧˆčž“å…ĨäģĨé€—åˇåˆ†éš”įš„éĄĩį åˆ—čĄ¨æˆ–å‡Ŋ数īŧš1,5,6、2n+1īŧ‰īŧš", + "startingNumberTooltip": "The first number to display. Subsequent pages will increment from this number.", + "marginTooltip": "Distance between the page number and the edge of the page.", + "fontSizeTooltip": "Size of the page number text in points. Larger numbers create bigger text.", + "fontTypeTooltip": "Font family for the page numbers. Choose based on your document style.", + "customTextTooltip": "Optional custom format for page numbers. Use {n} as placeholder for the number. Example: \"Page {n}\" will show \"Page 1\", \"Page 2\", etc.", "pdfPrompt": "选拊 PDF", "multiPdfPrompt": "选拊多ä¸Ē PDFīŧˆ2ä¸Ē或更多īŧ‰", "multiPdfDropPrompt": "选拊īŧˆæˆ–æ‹–æ‹Ŋīŧ‰æ‰€éœ€įš„ PDF", @@ -30,7 +84,6 @@ "uploadLimitExceededPlural": "文äģļčŋ‡å¤§ã€‚æœ€å¤§å…čŽ¸å¤§å°ä¸ē", "processTimeWarning": "č­Ļ告īŧšæ­¤čŋ‡į¨‹å¯čƒŊ需čĻå¤ščžžä¸€åˆ†é’ŸīŧŒå…ˇäŊ“æ—ļé—´å–å†ŗäēŽæ–‡äģļ大小", "pageOrderPrompt": "éĄĩéĸéĄēåēīŧˆčž“å…Ĩé€—åˇåˆ†éš”įš„éĄĩį åˆ—čĄ¨æˆ–å‡Ŋ数īŧ‰īŧš", - "pageSelectionPrompt": "č‡Ē厚䚉éĄĩéĸ选拊īŧˆčž“å…ĨäģĨé€—åˇåˆ†éš”įš„éĄĩį åˆ—čĄ¨æˆ–å‡Ŋ数īŧš1,5,6、2n+1īŧ‰īŧš", "goToPage": "到", "true": "寚", "false": "错", @@ -41,11 +94,18 @@ "save": "äŋå­˜", "saveToBrowser": "äŋå­˜åˆ°æĩč§ˆå™¨", "download": "下čŊŊ", + "pin": "Pin File (keep active after tool run)", + "unpin": "Unpin File (replace after tool run)", "undoOperationTooltip": "į‚šå‡ģ撤销上一æŦĄæ“äŊœåšļčŋ˜åŽŸåŽŸå§‹æ–‡äģļ", "undo": "撤销", "moreOptions": "æ›´å¤šé€‰éĄš", "editYourNewFiles": "įŧ–čž‘æ‚¨įš„æ–°æ–‡äģļ", "close": "å…ŗé—­", + "openInViewer": "Open in Viewer", + "confirmClose": "Confirm Close", + "confirmCloseMessage": "Are you sure you want to close this file?", + "confirmCloseCancel": "Cancel", + "confirmCloseConfirm": "Close File", "fileSelected": "厞选īŧš{{filename}}", "chooseFile": "选拊文äģļ", "filesSelected": "é€‰ä¸­įš„æ–‡äģļ", @@ -55,7 +115,9 @@ "uploadFiles": "上äŧ æ–‡äģļ", "addFiles": "æˇģ加文äģļ", "selectFromWorkbench": "äģŽåˇĨäŊœå°ä¸­é€‰æ‹Šæ–‡äģ￈– ", - "selectMultipleFromWorkbench": "äģŽåˇĨäŊœå°ä¸­č‡ŗå°‘选拊 {{count}} ä¸Ē文äģ￈– " + "selectMultipleFromWorkbench": "äģŽåˇĨäŊœå°ä¸­č‡ŗå°‘选拊 {{count}} ä¸Ē文äģ￈– ", + "created": "Created", + "size": "File Size" }, "noFavourites": "æ˛Ąæœ‰æˇģ加æ”ļč—å¤š", "downloadComplete": "下čŊŊ厌成", @@ -74,7 +136,10 @@ }, "error": { "pdfPassword": "PDFæ–‡æĄŖæœ‰å¯†į īŧŒæœĒæäž›å¯†į æˆ–å¯†į ä¸æ­ŖįĄŽ", + "encryptedPdfMustRemovePassword": "æ­¤ PDF åˇ˛åŠ å¯†æˆ–å—å¯†į äŋæŠ¤ã€‚č¯ˇåœ¨čŊŦæĸä¸ē PDF/A 䚋前将å…ļč§Ŗé”ã€‚", + "incorrectPasswordProvided": "PDF å¯†į ä¸æ­ŖįĄŽæˆ–æœĒ提䞛。", "_value": "错蝝", + "dismissAllErrors": "å…ŗé—­æ‰€æœ‰é”™č¯¯", "sorry": "寚此闎éĸ˜æ„Ÿåˆ°æŠąæ­‰īŧ", "needHelp": "需čĻå¸ŽåŠŠ / å‘įŽ°é—Žéĸ˜īŧŸ", "contactTip": "åĻ‚æžœäŊ äģį„ļ遇到闎éĸ˜īŧŒä¸čĻįŠščąĢīŧŒå‘我äģŦå¯ģæą‚å¸ŽåŠŠã€‚äŊ å¯äģĨ在我äģŦįš„ GitHub éĄĩéĸ上提äē¤åˇĨ单īŧŒæˆ–者通čŋ‡ Discord 与我äģŦ联įŗģīŧš", @@ -87,10 +152,7 @@ "showStack": "昞į¤ēå †æ ˆčˇŸč¸Ē", "copyStack": "复åˆļå †æ ˆčˇŸč¸Ē", "githubSubmit": "GitHub - 提äē¤åˇĨ单", - "discordSubmit": "Discord - 提ä礿”¯æŒå¸–子", - "dismissAllErrors": "å…ŗé—­æ‰€æœ‰é”™č¯¯", - "encryptedPdfMustRemovePassword": "æ­¤ PDF åˇ˛åŠ å¯†æˆ–å—å¯†į äŋæŠ¤ã€‚č¯ˇåœ¨čŊŦæĸä¸ē PDF/A 䚋前将å…ļč§Ŗé”ã€‚", - "incorrectPasswordProvided": "PDF å¯†į ä¸æ­ŖįĄŽæˆ–æœĒ提䞛。" + "discordSubmit": "Discord - 提ä礿”¯æŒå¸–子" }, "warning": { "tooltipTitle": "č­Ļ告" @@ -188,6 +250,7 @@ "title": "äŊ æƒŗååŠŠæ”šå–„Stirling PDF吗", "paragraph1": "Stirling PDF有选拊性分析功čƒŊīŧŒå¯äģĨ帎劊我äģŦ攚čŋ›äē§å“ã€‚我äģŦ不跟č¸ĒäģģäŊ•ä¸ĒäēēäŋĄæ¯æˆ–æ–‡äģļ内厚。", "paragraph2": "č¯ˇč€ƒč™‘å¯į”¨åˆ†æžæĨ帎劊Stirling-PDFįš„å‘åą•īŧŒåšļčŽŠæˆ‘äģŦ更åĨŊ地äē†č§Ŗæˆ‘äģŦįš„į”¨æˆˇã€‚", + "learnMore": "Learn more", "enable": "å¯į”¨åˆ†æžåŠŸčƒŊ", "disable": "įĻį”¨åˆ†æžåŠŸčƒŊ", "settings": "您可äģĨ在 config/settings.yml 文äģļ中变更分析功čƒŊįš„čŽžåŽš" @@ -231,6 +294,54 @@ "cacheInputs": { "name": "äŋå­˜čĄ¨å•čž“å…Ĩ", "help": "äŋå­˜å…ˆå‰čž“å…ĨäģĨ供æ—Ĩ后äŊŋᔍ" + }, + "general": { + "title": "General", + "description": "Configure general application preferences.", + "account": "Account", + "accountDescription": "Manage your account settings", + "user": "User", + "signedInAs": "Signed in as", + "logout": "Log out", + "enableFeatures": { + "title": "For System Administrators", + "intro": "Enable user authentication, team management, and workspace features for your organization.", + "action": "Configure", + "and": "and", + "benefit": "Enables user roles, team collaboration, admin controls, and enterprise features.", + "learnMore": "Learn more in documentation", + "dismiss": "Dismiss" + }, + "autoUnzip": "Auto-unzip API responses", + "autoUnzipDescription": "Automatically extract files from ZIP responses", + "autoUnzipTooltip": "Automatically extract ZIP files returned from API operations. Disable to keep ZIP files intact. This does not affect automation workflows.", + "autoUnzipFileLimit": "Auto-unzip file limit", + "autoUnzipFileLimitDescription": "Maximum number of files to extract from ZIP", + "autoUnzipFileLimitTooltip": "Only unzip if the ZIP contains this many files or fewer. Set higher to extract larger ZIPs.", + "defaultToolPickerMode": "Default tool picker mode", + "defaultToolPickerModeDescription": "Choose whether the tool picker opens in fullscreen or sidebar by default", + "mode": { + "fullscreen": "Fullscreen", + "sidebar": "Sidebar" + } + }, + "hotkeys": { + "title": "Keyboard Shortcuts", + "description": "Hover a tool to see its shortcut or customise it below. Click \"Change shortcut\" and press a new key combination. Press Esc to cancel.", + "errorModifier": { + "mac": "Include ⌘ (Command), âŒĨ (Option), or another modifier in your shortcut.", + "windows": "Include Ctrl, Alt, or another modifier in your shortcut." + }, + "errorConflict": "Shortcut already used by {{tool}}.", + "none": "Not assigned", + "customBadge": "Custom", + "defaultLabel": "Default: {{shortcut}}", + "capturing": "Press keysâ€Ļ (Esc to cancel)", + "change": "Change shortcut", + "reset": "Reset", + "shortcut": "Shortcut", + "noShortcut": "No shortcut set", + "searchPlaceholder": "Search tools..." } }, "changeCreds": { @@ -302,8 +413,10 @@ "top20": "前20", "all": "全部", "refresh": "åˆˇæ–°", - "includeHomepage": "包åĢä¸ģéĄĩ('/')", - "includeLoginPage": "包åĢį™ģåŊ•éĄĩ('/login')", + "dataTypeLabel": "Data Type:", + "dataTypeAll": "All", + "dataTypeApi": "API", + "dataTypeUi": "UI", "totalEndpoints": "įĢ¯į‚šæ€ģ数", "totalVisits": "čŽŋ问æ€ģ数", "showing": "昞į¤ē", @@ -318,7 +431,9 @@ "top": "éĄļ部", "numberOfVisits": "čŽŋ问æŦĄæ•°", "visitsTooltip": "čŽŋ问æŦĄæ•°īŧš{0}(占æ€ģæ•°įš„{1}%)", - "retry": "é‡č¯•" + "retry": "é‡č¯•", + "includeHomepage": "包åĢä¸ģéĄĩ('/')", + "includeLoginPage": "包åĢį™ģåŊ•éĄĩ('/login')" }, "database": { "title": "数捎åē“ å¯ŧå…Ĩ/å¯ŧå‡ē", @@ -359,278 +474,284 @@ "alphabetical": "按字母éĄēåē", "globalPopularity": "æŒ‰å…¨įƒįƒ­åēĻ", "sortBy": "排åē:", + "mobile": { + "brandAlt": "Stirling PDF logo", + "openFiles": "Open files", + "swipeHint": "Swipe left or right to switch views", + "tools": "Tools", + "toolsSlide": "Tool selection panel", + "viewSwitcher": "Switch workspace view", + "workbenchSlide": "Workspace panel", + "workspace": "Workspace" + }, "multiTool": { + "tags": "多ä¸Ē,åˇĨå…ˇ", "title": "PDF 多功čƒŊåˇĨå…ˇ", - "desc": "合åšļ、旋čŊŦ、重新排列和删除 PDF éĄĩéĸ", - "tags": "多ä¸Ē,åˇĨå…ˇ" + "desc": "合åšļ、旋čŊŦ、重新排列和删除 PDF éĄĩéĸ" }, "merge": { + "tags": "įģ„合,合åšļ,č”åˆ", "title": "合åšļ", - "desc": "čŊģæžå°†å¤šä¸Ē PDF 合åšļ成一ä¸Ē。", - "tags": "įģ„合,合åšļ,č”åˆ" + "desc": "čŊģæžå°†å¤šä¸Ē PDF 合åšļ成一ä¸Ē。" }, "split": { + "tags": "åˆ†å‰˛,分įĻģ,拆分", "title": "拆分", - "desc": "将 PDF 拆分ä¸ē多ä¸Ēæ–‡æĄŖã€‚", - "tags": "åˆ†å‰˛,分įĻģ,拆分" + "desc": "将 PDF 拆分ä¸ē多ä¸Ēæ–‡æĄŖã€‚" }, "rotate": { + "tags": "旋čŊŦ,įŋģčŊŦ,厚向", "title": "旋čŊŦ", - "desc": "旋čŊŦ PDF。", - "tags": "旋čŊŦ,įŋģčŊŦ,厚向" + "desc": "旋čŊŦ PDF。" }, "convert": { + "tags": "čŊŦæĸ,更攚", "title": "čŊŦæĸ", - "desc": "在不同æ ŧåŧäš‹é—´čŊŦæĸ文äģļ", - "tags": "čŊŦæĸ,更攚" + "desc": "在不同æ ŧåŧäš‹é—´čŊŦæĸ文äģļ" }, "pdfOrganiser": { + "tags": "įģ„įģ‡,重新排列,重新排åē", "title": "æ•´į†", - "desc": "按äģģæ„éĄēåēåˆ é™¤/重新排列éĄĩéĸ。", - "tags": "įģ„įģ‡,重新排列,重新排åē" + "desc": "按äģģæ„éĄēåēåˆ é™¤/重新排列éĄĩéĸ。" }, "addImage": { + "tags": "插å…Ĩ,åĩŒå…Ĩ,攞įŊŽ", "title": "在 PDF 中æˇģåŠ å›žį‰‡", - "desc": "将回像æˇģ加到 PDF įš„æŒ‡åŽšäŊįŊŽã€‚", - "tags": "插å…Ĩ,åĩŒå…Ĩ,攞įŊŽ" + "desc": "将回像æˇģ加到 PDF įš„æŒ‡åŽšäŊįŊŽã€‚" }, "addAttachments": { + "tags": "åĩŒå…Ĩ,附加,包åĢ", "title": "æˇģ加附äģļ", - "desc": "向 PDF æˇģ加或į§ģ除åĩŒå…Ĩ文äģļīŧˆé™„äģļīŧ‰", - "tags": "åĩŒå…Ĩ,附加,包åĢ" + "desc": "向 PDF æˇģ加或į§ģ除åĩŒå…Ĩ文äģļīŧˆé™„äģļīŧ‰" }, "watermark": { + "tags": "印įĢ ,æ ‡čŽ°,叠加", "title": "æˇģ加水印", - "desc": "在 PDF 中æˇģ加č‡Ē厚䚉水印。", - "tags": "印įĢ ,æ ‡čŽ°,叠加" + "desc": "在 PDF 中æˇģ加č‡Ē厚䚉水印。" }, "removePassword": { + "tags": "觪锁", "title": "åˆ é™¤å¯†į ", - "desc": "äģŽ PDF æ–‡æĄŖä¸­į§ģ除坆᠁äŋæŠ¤ã€‚", - "tags": "觪锁" + "desc": "äģŽ PDF æ–‡æĄŖä¸­į§ģ除坆᠁äŋæŠ¤ã€‚" }, "compress": { + "tags": "įŧŠå°,减少,äŧ˜åŒ–", "title": "压įŧŠ", - "desc": "压įŧŠ PDF 文äģļäģĨ减小文äģļ大小。", - "tags": "įŧŠå°,减少,äŧ˜åŒ–" + "desc": "压įŧŠ PDF 文äģļäģĨ减小文äģļ大小。" }, "unlockPDFForms": { + "tags": "觪锁,吝ᔍ,įŧ–čž‘", "title": "觪锁PDFčĄ¨å•", - "desc": "į§ģé™¤čĄ¨å•å­—æŽĩåĒč¯ģåąžæ€§", - "tags": "觪锁,吝ᔍ,įŧ–čž‘" + "desc": "į§ģé™¤čĄ¨å•å­—æŽĩåĒč¯ģåąžæ€§" }, "changeMetadata": { + "tags": "įŧ–čž‘,äŋŽæ”š,更新", "title": "更攚元数捎", - "desc": "更攚/删除/æˇģ加 PDF æ–‡æĄŖįš„å…ƒæ•°æŽã€‚", - "tags": "įŧ–čž‘,äŋŽæ”š,更新" + "desc": "更攚/删除/æˇģ加 PDF æ–‡æĄŖįš„å…ƒæ•°æŽã€‚" }, "ocr": { + "tags": "提取,æ‰Ģ描", "title": "čŋčĄŒ OCR /æ¸…į†æ‰Ģ描", - "desc": "æ¸…į†å’Œč¯†åˆĢ PDF ä¸­įš„å›žåƒæ–‡æœŦīŧŒåšļ将å…ļčŊŦæĸä¸ē可įŧ–čž‘æ–‡æœŦ。", - "tags": "提取,æ‰Ģ描" + "desc": "æ¸…į†å’Œč¯†åˆĢ PDF ä¸­įš„å›žåƒæ–‡æœŦīŧŒåšļ将å…ļčŊŦæĸä¸ē可įŧ–čž‘æ–‡æœŦ。" }, "extractImages": { + "tags": "提取,äŋå­˜,å¯ŧå‡ē", "title": "提取回像", - "desc": "äģŽ PDF 中提取所有回像åšļäŋå­˜åˆ°åŽ‹įŧŠåŒ…中。", - "tags": "提取,äŋå­˜,å¯ŧå‡ē" + "desc": "äģŽ PDF 中提取所有回像åšļäŋå­˜åˆ°åŽ‹įŧŠåŒ…中。" }, "scannerImageSplit": { + "tags": "æŖ€æĩ‹,拆分,ᅧቇ", "title": "æŖ€æĩ‹/拆分æ‰Ģæį…§į‰‡", - "desc": "äģŽį…§į‰‡/PDF 中拆分å‡ē多åŧ į…§į‰‡", - "tags": "æŖ€æĩ‹,拆分,ᅧቇ" + "desc": "äģŽį…§į‰‡/PDF 中拆分å‡ē多åŧ į…§į‰‡" }, "sign": { + "tags": "į­žå,äē˛įŦ”į­žå", "title": "į­žå", - "desc": "通čŋ‡įģ˜å›žã€æ–‡å­—或回像向 PDF æˇģåŠ į­žå", - "tags": "į­žå,äē˛įŦ”į­žå" + "desc": "通čŋ‡įģ˜å›žã€æ–‡å­—或回像向 PDF æˇģåŠ į­žå" }, "flatten": { + "tags": "įŽ€åŒ–,删除,äē¤äē’åŧ", "title": "åą•åšŗ", - "desc": "äģŽ PDF 中删除所有äē’åŠ¨å…ƒį´ å’ŒčĄ¨å•", - "tags": "įŽ€åŒ–,删除,äē¤äē’åŧ" + "desc": "äģŽ PDF 中删除所有äē’åŠ¨å…ƒį´ å’ŒčĄ¨å•" }, "certSign": { + "tags": "čŽ¤č¯,PEM,P12,厘斚,加密,į­žå,蝁äšĻ,PKCS12,JKS,æœåŠĄå™¨,手动,č‡Ē动", "title": "äŊŋᔍ蝁äšĻį­žå", - "desc": "äŊŋᔍ蝁äšĻ/密é’ĨīŧˆPEM/P12īŧ‰å¯šPDFčŋ›čĄŒį­žå", - "tags": "čŽ¤č¯,PEM,P12,厘斚,加密,į­žå,蝁äšĻ,PKCS12,JKS,æœåŠĄå™¨,手动,č‡Ē动" + "desc": "äŊŋᔍ蝁äšĻ/密é’ĨīŧˆPEM/P12īŧ‰å¯šPDFčŋ›čĄŒį­žå" }, "repair": { + "tags": "äŋŽå¤,æĸ复", "title": "äŋŽå¤", - "desc": "å°č¯•äŋŽå¤æŸå/æŸåįš„ PDF", - "tags": "äŋŽå¤,æĸ复" + "desc": "å°č¯•äŋŽå¤æŸå/æŸåįš„ PDF" }, "removeBlanks": { + "tags": "删除,æ¸…į†,įŠēį™Ŋ", "title": "删除įŠēį™ŊéĄĩ", - "desc": "æŖ€æĩ‹åšļåˆ é™¤æ–‡æĄŖä¸­įš„įŠēį™ŊéĄĩ", - "tags": "删除,æ¸…į†,įŠēį™Ŋ" + "desc": "æŖ€æĩ‹åšļåˆ é™¤æ–‡æĄŖä¸­įš„įŠēį™ŊéĄĩ" }, "removeAnnotations": { + "tags": "删除,æ¸…į†,删除", "title": "åˆ é™¤æ ‡æŗ¨", - "desc": "删除 PDF ä¸­įš„æ‰€æœ‰æ ‡æŗ¨/蝄čŽē", - "tags": "删除,æ¸…į†,删除" + "desc": "删除 PDF ä¸­įš„æ‰€æœ‰æ ‡æŗ¨/蝄čŽē" }, "compare": { + "tags": "åˇŽåŧ‚", "title": "æ¯”čžƒ", - "desc": "æ¯”čžƒåšļ昞į¤ē两ä¸Ē PDF æ–‡æĄŖäš‹é—´įš„åˇŽåŧ‚", - "tags": "åˇŽåŧ‚" + "desc": "æ¯”čžƒåšļ昞į¤ē两ä¸Ē PDF æ–‡æĄŖäš‹é—´įš„åˇŽåŧ‚" }, "removeCertSign": { + "tags": "删除,删除,觪锁", "title": "į§ģ除蝁äšĻį­žå", - "desc": "į§ģ除 PDF įš„č¯äšĻį­žå", - "tags": "删除,删除,觪锁" + "desc": "į§ģ除 PDF įš„č¯äšĻį­žå" }, "pageLayout": { + "tags": "å¸ƒåą€,排列,įģ„合", "title": "多éĄĩå¸ƒåą€", - "desc": "将 PDF æ–‡æĄŖįš„å¤šä¸ĒéĄĩéĸ合åšļ成一éĄĩ", - "tags": "å¸ƒåą€,排列,įģ„合" + "desc": "将 PDF æ–‡æĄŖįš„å¤šä¸ĒéĄĩéĸ合åšļ成一éĄĩ" }, "bookletImposition": { + "tags": "小册子,打印,čŖ…čŽĸ", "title": "小册子æ‹ŧį‰ˆ", - "desc": "创åģēå…ˇæœ‰æ­ŖįĄŽéĄĩéĸéĄēåēå’Œå¤šéĄĩå¸ƒåą€įš„å°å†Œå­īŧŒį”¨äēŽæ‰“å°å’ŒčŖ…čŽĸ", - "tags": "小册子,打印,čŖ…čŽĸ" + "desc": "创åģēå…ˇæœ‰æ­ŖįĄŽéĄĩéĸéĄēåēå’Œå¤šéĄĩå¸ƒåą€įš„å°å†Œå­īŧŒį”¨äēŽæ‰“å°å’ŒčŖ…čŽĸ" }, "scalePages": { + "tags": "č°ƒæ•´å¤§å°,č°ƒæ•´,įŧŠæ”ž", "title": "č°ƒæ•´éĄĩéĸå°ē寸/įŧŠæ”ž", - "desc": "č°ƒæ•´éĄĩéĸ及/或å…ļå†…åŽšįš„å°ē寸/įŧŠæ”ž", - "tags": "č°ƒæ•´å¤§å°,č°ƒæ•´,įŧŠæ”ž" + "desc": "č°ƒæ•´éĄĩéĸ及/或å…ļå†…åŽšįš„å°ē寸/įŧŠæ”ž" }, "addPageNumbers": { + "tags": "įŧ–åˇ,分éĄĩ,čŽĄæ•°", "title": "æˇģ加éĄĩ᠁", - "desc": "åœ¨æ–‡æĄŖįš„æŒ‡åŽšäŊįŊŽæˇģ加éĄĩ᠁", - "tags": "įŧ–åˇ,分éĄĩ,čŽĄæ•°" + "desc": "åœ¨æ–‡æĄŖįš„æŒ‡åŽšäŊįŊŽæˇģ加éĄĩ᠁" }, "autoRename": { + "tags": "č‡ĒåŠ¨æŖ€æĩ‹,åŸēäēŽæ ‡éĸ˜,įģ„įģ‡,é‡æ–°æ ‡čŽ°", "title": "č‡Ē动重å‘Ŋ名 PDF 文äģļ", - "desc": "åŸēäēŽæŖ€æĩ‹åˆ°įš„éĄĩįœ‰č‡Ē动重å‘Ŋ名 PDF 文äģļ", - "tags": "č‡ĒåŠ¨æŖ€æĩ‹,åŸēäēŽæ ‡éĸ˜,įģ„įģ‡,é‡æ–°æ ‡čŽ°" + "desc": "åŸēäēŽæŖ€æĩ‹åˆ°įš„éĄĩįœ‰č‡Ē动重å‘Ŋ名 PDF 文äģļ" }, "adjustContrast": { + "tags": "寚比åēĻ,äēŽåēĻ,éĨąå’ŒåēĻ", "title": "č°ƒæ•´éĸœč‰˛/寚比åēĻ", - "desc": "č°ƒæ•´ PDF įš„å¯šæ¯”åēĻ、éĨąå’ŒåēĻ和äēŽåēĻ", - "tags": "寚比åēĻ,äēŽåēĻ,éĨąå’ŒåēĻ" + "desc": "č°ƒæ•´ PDF įš„å¯šæ¯”åēĻ、éĨąå’ŒåēĻ和äēŽåēĻ" }, "crop": { + "tags": "誁å‰Ē,å‰Ē切,č°ƒæ•´å¤§å°", "title": "誁å‰Ē PDF", - "desc": "誁å‰Ē PDF äģĨ减小å…ļ文äģļ大小īŧˆäŋį•™æ–‡æœŦīŧīŧ‰", - "tags": "誁å‰Ē,å‰Ē切,č°ƒæ•´å¤§å°" + "desc": "誁å‰Ē PDF äģĨ减小å…ļ文äģļ大小īŧˆäŋį•™æ–‡æœŦīŧīŧ‰" }, "autoSplitPDF": { + "tags": "č‡Ē动,拆分,QR", "title": "č‡Ē动拆分éĄĩéĸ", - "desc": "äŊŋį”¨į‰Šį†æ‰Ģ描éĄĩéĸåˆ†å‰˛å™¨ QR äģŖį č‡Ē动拆分æ‰Ģæįš„ PDF", - "tags": "č‡Ē动,拆分,QR" + "desc": "äŊŋį”¨į‰Šį†æ‰Ģ描éĄĩéĸåˆ†å‰˛å™¨ QR äģŖį č‡Ē动拆分æ‰Ģæįš„ PDF" }, "sanitize": { + "tags": "æ¸…į†,清除,删除", "title": "åŽ‰å…¨æ¸…į†", - "desc": "į§ģ除 PDF 文äģļä¸­įš„æŊœåœ¨æœ‰åŽŗå…ƒį´ ", - "tags": "æ¸…į†,清除,删除" + "desc": "į§ģ除 PDF 文äģļä¸­įš„æŊœåœ¨æœ‰åŽŗå…ƒį´ " }, "getPdfInfo": { + "tags": "äŋĄæ¯,元数捎,č¯Ļįģ†äŋĄæ¯", "title": "čŽˇå– PDF įš„æ‰€æœ‰äŋĄæ¯", - "desc": "čŽˇå– PDF įš„æ‰€æœ‰å¯čƒŊįš„äŋĄæ¯", - "tags": "äŋĄæ¯,元数捎,č¯Ļįģ†äŋĄæ¯" + "desc": "čŽˇå– PDF įš„æ‰€æœ‰å¯čƒŊįš„äŋĄæ¯" }, "pdfToSinglePage": { + "tags": "įģ„合,合åšļ,单éĄĩ", "title": "PDF čŊŦ单一大éĄĩ", - "desc": "将所有 PDF éĄĩéĸ合åšļä¸ē一ä¸Ēå¤§įš„å•éĄĩ", - "tags": "įģ„合,合åšļ,单éĄĩ" + "desc": "将所有 PDF éĄĩéĸ合åšļä¸ē一ä¸Ēå¤§įš„å•éĄĩ" }, "showJS": { + "tags": "javascript,äģŖį ,脚æœŦ", "title": "昞į¤ē JavaScript", - "desc": "搜į´ĸåšļ昞į¤ēåĩŒå…Ĩ到 PDF ä¸­įš„äģģäŊ• JavaScript äģŖį ", - "tags": "javascript,äģŖį ,脚æœŦ" + "desc": "搜į´ĸåšļ昞į¤ēåĩŒå…Ĩ到 PDF ä¸­įš„äģģäŊ• JavaScript äģŖį " }, "redact": { + "tags": "åŽĄæŸĨ,æļ‚éģ‘,隐藏", "title": "手动äŋŽčŽĸ", - "desc": "æ šæŽé€‰åŽšįš„æ–‡æœŦ、įģ˜åˆļįš„åŊĸįŠļ和/æˆ–é€‰åŽšįš„éĄĩéĸįŧ–čž‘PDF", - "tags": "åŽĄæŸĨ,æļ‚éģ‘,隐藏" - }, - "overlayPdfs": { - "title": "叠加 PDF", - "desc": "将一ä¸Ē PDF 叠加到åĻ一ä¸Ē PDF 之上", - "tags": "叠加,įģ„合,堆叠" + "desc": "æ šæŽé€‰åŽšįš„æ–‡æœŦ、įģ˜åˆļįš„åŊĸįŠļ和/æˆ–é€‰åŽšįš„éĄĩéĸįŧ–čž‘PDF" }, "splitBySections": { + "tags": "拆分,部分,åˆ†å‰˛", "title": "按åŒē块拆分 PDF", - "desc": "将 PDF įš„æ¯ä¸€éĄĩåˆ†å‰˛ä¸ēæ›´å°įš„æ¨Ē向与įēĩ向åŒē块", - "tags": "拆分,部分,åˆ†å‰˛" + "desc": "将 PDF įš„æ¯ä¸€éĄĩåˆ†å‰˛ä¸ēæ›´å°įš„æ¨Ē向与įēĩ向åŒē块" }, "addStamp": { + "tags": "印įĢ ,æ ‡čŽ°,į›–įĢ ", "title": "向 PDF æˇģ加印įĢ ", - "desc": "在指厚äŊįŊŽæˇģ加文æœŦ或回像印įĢ ", - "tags": "印įĢ ,æ ‡čŽ°,į›–įĢ " + "desc": "在指厚äŊįŊŽæˇģ加文æœŦ或回像印įĢ " }, "removeImage": { + "tags": "删除,删除,æ¸…į†", "title": "删除回像", - "desc": "删除回像减少 PDF 大小", - "tags": "删除,删除,æ¸…į†" + "desc": "删除回像减少 PDF 大小" }, "splitByChapters": { + "tags": "拆分,įĢ čŠ‚,į쓿ž„", "title": "按įĢ čŠ‚æ‹†åˆ† PDF", - "desc": "栚捎å…ļįĢ čŠ‚į쓿ž„å°† PDF 拆分ä¸ē多ä¸Ē文äģļ。", - "tags": "拆分,įĢ čŠ‚,į쓿ž„" + "desc": "栚捎å…ļįĢ čŠ‚į쓿ž„å°† PDF 拆分ä¸ē多ä¸Ē文äģļ。" }, "validateSignature": { + "tags": "énj蝁,核厞,蝁äšĻ", "title": "énj蝁 PDF į­žå", - "desc": "énj蝁 PDF æ–‡æĄŖä¸­įš„æ•°å­—į­žåå’Œč¯äšĻ", - "tags": "énj蝁,核厞,蝁äšĻ" + "desc": "énj蝁 PDF æ–‡æĄŖä¸­įš„æ•°å­—į­žåå’Œč¯äšĻ" }, "swagger": { + "tags": "API,æ–‡æĄŖ,æĩ‹č¯•", "title": "API æ–‡æĄŖ", - "desc": "æŸĨįœ‹ API æ–‡æĄŖåšļæĩ‹č¯•įĢ¯į‚š", - "tags": "API,æ–‡æĄŖ,æĩ‹č¯•" + "desc": "æŸĨįœ‹ API æ–‡æĄŖåšļæĩ‹č¯•įĢ¯į‚š" }, - "fakeScan": { - "title": "äŧĒæ‰Ģ描", - "desc": "创åģēįœ‹čĩˇæĨ像æ‰Ģ描äģļįš„ PDF" + "scannerEffect": { + "tags": "æ‰Ģ描,æ¨Ąæ‹Ÿ,创åģē", + "title": "æ‰Ģ描äģĒæ•ˆæžœ", + "desc": "创åģēįœ‹čĩˇæĨ像æ‰Ģæįš„ PDF" }, "editTableOfContents": { + "tags": "äšĻį­ž,į›ŽåŊ•,įŧ–čž‘", "title": "įŧ–čž‘į›ŽåŊ•", - "desc": "ä¸ē PDF æ–‡æĄŖæˇģ加或įŧ–čž‘į›ŽåŊ•å’ŒäšĻį­ž", - "tags": "äšĻį­ž,į›ŽåŊ•,įŧ–čž‘" + "desc": "ä¸ē PDF æ–‡æĄŖæˇģ加或įŧ–čž‘į›ŽåŊ•å’ŒäšĻį­ž" }, "manageCertificates": { + "tags": "蝁äšĻ,å¯ŧå…Ĩ,å¯ŧå‡ē", "title": "įŽĄį†č¯äšĻ", - "desc": "å¯ŧå…Ĩ、å¯ŧå‡ēæˆ–åˆ é™¤į”¨äēŽį­žå PDF įš„æ•°å­—č¯äšĻ文äģļ。", - "tags": "蝁äšĻ,å¯ŧå…Ĩ,å¯ŧå‡ē" + "desc": "å¯ŧå…Ĩ、å¯ŧå‡ēæˆ–åˆ é™¤į”¨äēŽį­žå PDF įš„æ•°å­—č¯äšĻ文äģļ。" }, "read": { + "tags": "æŸĨįœ‹,打åŧ€,昞į¤ē", "title": "阅č¯ģ", - "desc": "æŸĨįœ‹ä¸Žæ‰šæŗ¨ PDF。é̘äēŽã€įģ˜åˆļ或插å…Ĩ蝄čŽēäģĨäžŋåŽĄé˜…åäŊœã€‚", - "tags": "æŸĨįœ‹,打åŧ€,昞į¤ē" + "desc": "æŸĨįœ‹ä¸Žæ‰šæŗ¨ PDF。é̘äēŽã€įģ˜åˆļ或插å…Ĩ蝄čŽēäģĨäžŋåŽĄé˜…åäŊœã€‚" }, "reorganizePages": { + "tags": "重新排列,重新排åē,įģ„įģ‡", "title": "重įģ„éĄĩéĸ", - "desc": "通čŋ‡å¯č§†åŒ–拖攞控åˆļ重新排列、复åˆļ或删除 PDF éĄĩéĸ。", - "tags": "重新排列,重新排åē,įģ„įģ‡" + "desc": "通čŋ‡å¯č§†åŒ–拖攞控åˆļ重新排列、复åˆļ或删除 PDF éĄĩéĸ。" }, "extractPages": { + "tags": "提取,选拊,复åˆļ", "title": "提取éĄĩéĸ", - "desc": "äģŽ PDF æ–‡æĄŖä¸­æå–į‰šåŽšéĄĩéĸ", - "tags": "提取,选拊,复åˆļ" + "desc": "äģŽ PDF æ–‡æĄŖä¸­æå–į‰šåŽšéĄĩéĸ" }, "removePages": { + "tags": "删除,提取,排除", "title": "删除", - "desc": "äģŽ PDF æ–‡æĄŖä¸­åˆ é™¤ä¸éœ€čĻįš„éĄĩéĸ。", - "tags": "删除,提取,排除" + "desc": "äģŽ PDF æ–‡æĄŖä¸­åˆ é™¤ä¸éœ€čĻįš„éĄĩéĸ。" }, "autoSizeSplitPDF": { + "tags": "č‡Ē动,拆分,大小", "title": "č‡Ē动栚捎大小/æ•°į›Žæ‹†åˆ† PDF", - "desc": "将单ä¸Ē PDF 拆分ä¸ē多ä¸Ēæ–‡æĄŖīŧŒåŸēäēŽå¤§å°ã€éĄĩæ•°æˆ–æ–‡æĄŖæ•°", - "tags": "č‡Ē动,拆分,大小" + "desc": "将单ä¸Ē PDF 拆分ä¸ē多ä¸Ēæ–‡æĄŖīŧŒåŸēäēŽå¤§å°ã€éĄĩæ•°æˆ–æ–‡æĄŖæ•°" }, - "replaceColorPdf": { + "replaceColor": { "title": "æ›ŋæĸ和反čŊŦéĸœč‰˛", - "desc": "æ›ŋæĸ PDF 中文æœŦå’ŒčƒŒæ™¯įš„éĸœč‰˛īŧŒåšļ将PDF反čŊŦéĸœč‰˛äģĨ减小文äģļ大小" + "desc": "æ›ŋæĸ或反čŊŦ PDF æ–‡æĄŖä¸­įš„éĸœč‰˛" }, "devApi": { + "tags": "API,åŧ€å‘,æ–‡æĄŖ", "title": "API", - "desc": "莺čŊŦ臺 API æ–‡æĄŖ", - "tags": "API,åŧ€å‘,æ–‡æĄŖ" + "desc": "莺čŊŦ臺 API æ–‡æĄŖ" }, "devFolderScanning": { + "tags": "č‡Ē动化,文äģļ多,æ‰Ģ描", "title": "č‡Ē动文äģļ多æ‰Ģ描", - "desc": "莺čŊŦ臺č‡Ē动文äģļ多æ‰Ģ描指南", - "tags": "č‡Ē动化,文äģļ多,æ‰Ģ描" + "desc": "莺čŊŦ臺č‡Ē动文äģļ多æ‰Ģ描指南" }, "devSsoGuide": { "title": "SSO 指南", @@ -649,18 +770,26 @@ "desc": "æ›´æ”šæ–‡æĄŖé™åˆļ与权限" }, "automate": { + "tags": "åˇĨäŊœæĩ,åēåˆ—,č‡Ē动化", "title": "č‡Ē动化", - "desc": "通čŋ‡ä¸˛č” PDF 操äŊœæž„åģē多æ­ĨåˇĨäŊœæĩã€‚适合重复性äģģåŠĄã€‚", - "tags": "åˇĨäŊœæĩ,åēåˆ—,č‡Ē动化" + "desc": "通čŋ‡ä¸˛č” PDF 操äŊœæž„åģē多æ­ĨåˇĨäŊœæĩã€‚适合重复性äģģåŠĄã€‚" }, - "replaceColor": { - "desc": "æ›ŋæĸ或反čŊŦ PDF æ–‡æĄŖä¸­įš„éĸœč‰˛", - "title": "æ›ŋæĸ和反čŊŦéĸœč‰˛" + "overlay-pdfs": { + "desc": "Overlay one PDF on top of another", + "title": "Overlay PDFs" }, - "scannerEffect": { - "desc": "创åģēįœ‹čĩˇæĨ像æ‰Ģæįš„ PDF", - "tags": "æ‰Ģ描,æ¨Ąæ‹Ÿ,创åģē", - "title": "æ‰Ģ描äģĒæ•ˆæžœ" + "overlayPdfs": { + "title": "叠加 PDF", + "desc": "将一ä¸Ē PDF 叠加到åĻ一ä¸Ē PDF 之上", + "tags": "叠加,įģ„合,堆叠" + }, + "fakeScan": { + "title": "äŧĒæ‰Ģ描", + "desc": "创åģēįœ‹čĩˇæĨ像æ‰Ģ描äģļįš„ PDF" + }, + "replaceColorPdf": { + "title": "æ›ŋæĸ和反čŊŦéĸœč‰˛", + "desc": "æ›ŋæĸ PDF 中文æœŦå’ŒčƒŒæ™¯įš„éĸœč‰˛īŧŒåšļ将PDF反čŊŦéĸœč‰˛äģĨ减小文äģļ大小" } }, "landing": { @@ -700,13 +829,19 @@ "merge": { "tags": "合åšļīŧŒéĄĩéĸ操äŊœīŧŒåŽį̝īŧŒæœåŠĄå™¨į̝", "title": "合åšļ", - "removeDigitalSignature.tooltip": { - "title": "į§ģé™¤æ•°å­—į­žå", - "description": "合åšļ文äģļæ—ļæ•°å­—į­žåäŧšå¤ąæ•ˆã€‚å‹žé€‰æ­¤éĄšäģĨäģŽæœ€įģˆåˆåšļįš„ PDF 中į§ģ除厃äģŦ。" + "removeDigitalSignature": { + "label": "在合åšļįš„æ–‡äģļä¸­åˆ é™¤æ•°å­—į­žå?", + "tooltip": { + "title": "į§ģé™¤æ•°å­—į­žå", + "description": "合åšļ文äģļæ—ļæ•°å­—į­žåäŧšå¤ąæ•ˆã€‚å‹žé€‰æ­¤éĄšäģĨäģŽæœ€įģˆåˆåšļįš„ PDF 中į§ģ除厃äģŦ。" + } }, - "generateTableOfContents.tooltip": { - "title": "į”Ÿæˆį›ŽåŊ•", - "description": "栚捎原始文äģļ名和éĄĩ᠁īŧŒč‡Ē动在合åšļåŽįš„ PDF 中创åģēå¯į‚šå‡ģįš„į›ŽåŊ•。" + "generateTableOfContents": { + "label": "在合åšļįš„æ–‡äģļä¸­į”Ÿæˆį›ŽåŊ•?", + "tooltip": { + "title": "į”Ÿæˆį›ŽåŊ•", + "description": "栚捎原始文äģļ名和éĄĩ᠁īŧŒč‡Ē动在合åšļåŽįš„ PDF 中创åģēå¯į‚šå‡ģįš„į›ŽåŊ•。" + } }, "submit": "合åšļ", "sortBy": { @@ -720,12 +855,9 @@ }, "error": { "failed": "合åšļ PDF æ—ļå‘į”Ÿé”™č¯¯ã€‚" - }, - "generateTableOfContents": "在合åšļįš„æ–‡äģļä¸­į”Ÿæˆį›ŽåŊ•?", - "removeDigitalSignature": "在合åšļįš„æ–‡äģļä¸­åˆ é™¤æ•°å­—į­žå?" + } }, "split": { - "tags": "éĄĩéĸ操äŊœīŧŒåˆ’分īŧŒå¤šéĄĩéĸīŧŒå‰Ē切īŧŒæœåŠĄå™¨į̝", "title": "拆分 PDF", "header": "拆分 PDF", "desc": { @@ -847,13 +979,51 @@ "bullet1": "äšĻį­žåą‚įē§īŧšåœ¨įŦŦ几įē§äšĻį­žå¤„æ‹†åˆ†īŧˆ1=éĄļįē§īŧ‰", "bullet2": "包åĢ元数捎īŧšäŋį•™æ–‡æĄŖåąžæ€§", "bullet3": "å…čŽ¸é‡å¤īŧšå¤„į†é‡å¤įš„äšĻį­žåį§°" + }, + "byDocCount": { + "bullet1": "Enter the number of output files you want", + "bullet2": "Pages are distributed as evenly as possible", + "bullet3": "Useful when you need a specific number of files", + "text": "Create a specific number of output files by evenly distributing pages across them.", + "title": "Split by Document Count" + }, + "byPageCount": { + "bullet1": "Enter the number of pages per output file", + "bullet2": "Last file may have fewer pages if not evenly divisible", + "bullet3": "Useful for batch processing workflows", + "text": "Create multiple PDFs with a specific number of pages each. Perfect for creating uniform document chunks.", + "title": "Split by Page Count" + }, + "byPageDivider": { + "bullet1": "Print divider sheets from the download link", + "bullet2": "Insert divider sheets between your documents", + "bullet3": "Scan all documents together as one PDF", + "bullet4": "Upload - divider pages are automatically detected and removed", + "bullet5": "Enable Duplex Mode if scanning both sides of divider sheets", + "text": "Automatically split scanned documents using physical divider sheets with QR codes. Perfect for processing multiple documents scanned together.", + "title": "Split by Page Divider" } - } + }, + "methodSelection": { + "tooltip": { + "bullet1": "Click on a method card to select it", + "bullet2": "Hover over each card to see a quick description", + "bullet3": "The settings step will appear after you select a method", + "bullet4": "You can change methods at any time before processing", + "header": { + "text": "Choose how you want to split your PDF document. Each method is optimized for different use cases and document types.", + "title": "Split Method Selection" + }, + "title": "Choose Your Split Method" + } + }, + "selectMethod": "Select a split method", + "tags": "éĄĩéĸ操äŊœīŧŒåˆ’分īŧŒå¤šéĄĩéĸīŧŒå‰Ē切īŧŒæœåŠĄå™¨į̝" }, "rotate": { - "tags": "æœåŠĄå™¨į̝", "title": "旋čŊŦ PDF", "submit": "旋čŊŦ", + "selectRotation": "Select Rotation Angle (Clockwise)", "error": { "failed": "旋čŊŦ PDF æ—ļå‘į”Ÿé”™č¯¯ã€‚" }, @@ -873,7 +1043,8 @@ "title": "控äģļ", "text": "äŊŋį”¨æ—‹čŊŦæŒ‰é’Žč°ƒæ•´æ–šå‘ã€‚åˇĻ键逆æ—ļ针īŧŒåŗé”ŽéĄēæ—ļ针。每æŦĄį‚šå‡ģ旋čŊŦ 90°。" } - } + }, + "tags": "æœåŠĄå™¨į̝" }, "convert": { "title": "čŊŦæĸ", @@ -941,7 +1112,8 @@ "imagesExt": "回像īŧˆJPG、PNG į­‰īŧ‰", "markdown": "Markdown", "textRtf": "文æœŦ/RTF", - "grayscale": "ၰåēĻ" + "grayscale": "ၰåēĻ", + "errorConversion": "An error occurred while converting the file." }, "imageToPdf": { "tags": "čŊŦæĸ、回像、JPGã€å›žį‰‡ã€į…§į‰‡" @@ -979,22 +1151,35 @@ "8": "删除最后一éĄĩ", "9": "删除įŦŦ一éĄĩ和最后一éĄĩ", "10": "åĨ‡åļ合åšļ", - "11": "复åˆļ所有éĄĩéĸ" + "11": "复åˆļ所有éĄĩéĸ", + "desc": { + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, â€Ļ).", + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, â€Ļ).", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimized for binding on the side)." + } }, - "placeholder": "īŧˆäž‹åĻ‚īŧš1,3,2 或 4-8,2,10-12 或 2n-1īŧ‰", "desc": { - "BOOKLET_SORT": "排列éĄĩéĸäģĨčŋ›čĄŒå°å†Œå­æ‰“印(最后,įŦŦ一,įŦŦäēŒ,倒数įŦŦäēŒ,...)。", "CUSTOM": "äŊŋᔍč‡ĒåŽšäš‰įš„éĄĩ᠁åēåˆ—æˆ–čĄ¨čžžåŧæĨ厚䚉新éĄēåēã€‚", - "DUPLEX_SORT": "äē¤é”™æ­Ŗéĸį„ļåŽčƒŒéĸ,å°ąåƒåŒéĸæ‰Ģ描äģĒæ‰Ģ描ä熿‰€æœ‰æ­Ŗéĸ,į„ļåŽæ‰€æœ‰čƒŒéĸ(1, n, 2, n-1, ...)。", - "DUPLICATE": "栚捎č‡Ē厚䚉éĄēåēčŽĄæ•°å¤åˆļ每éĄĩ(例åĻ‚,4 复åˆļ每éĄĩ 4×)。", - "ODD_EVEN_MERGE": "通čŋ‡ä礿›ŋéĄĩéĸ合åšļ两ä¸Ē PDF:įŦŦ一ä¸Ēįš„åĨ‡æ•°éĄĩ,įŦŦäēŒä¸Ēįš„åļ数éĄĩ。", - "ODD_EVEN_SPLIT": "å°†æ–‡æĄŖæ‹†åˆ†ä¸ē两ä¸Ē输å‡ē:所有åĨ‡æ•°éĄĩ和所有åļ数éĄĩ。", - "REMOVE_FIRST": "äģŽæ–‡æĄŖä¸­åˆ é™¤įŦŦ一éĄĩ。", - "REMOVE_FIRST_AND_LAST": "äģŽæ–‡æĄŖä¸­åˆ é™¤įŦŦ一éĄĩ和最后一éĄĩ。", - "REMOVE_LAST": "äģŽæ–‡æĄŖä¸­åˆ é™¤æœ€åŽä¸€éĄĩ。", "REVERSE_ORDER": "įŋģčŊŦæ–‡æĄŖ,äŊŋ最后一éĄĩ变ä¸ēįŦŦ一éĄĩ,䞝此įąģ推。", - "SIDE_STITCH_BOOKLET_SORT": "排列éĄĩéĸäģĨčŋ›čĄŒäž§įŧå°å†Œå­æ‰“印(针寚䞧éĸčŖ…čŽĸčŋ›čĄŒäē†äŧ˜åŒ–)。" - } + "DUPLEX_SORT": "äē¤é”™æ­Ŗéĸį„ļåŽčƒŒéĸ,å°ąåƒåŒéĸæ‰Ģ描äģĒæ‰Ģ描ä熿‰€æœ‰æ­Ŗéĸ,į„ļåŽæ‰€æœ‰čƒŒéĸ(1, n, 2, n-1, ...)。", + "BOOKLET_SORT": "排列éĄĩéĸäģĨčŋ›čĄŒå°å†Œå­æ‰“印(最后,įŦŦ一,įŦŦäēŒ,倒数įŦŦäēŒ,...)。", + "SIDE_STITCH_BOOKLET_SORT": "排列éĄĩéĸäģĨčŋ›čĄŒäž§įŧå°å†Œå­æ‰“印(针寚䞧éĸčŖ…čŽĸčŋ›čĄŒäē†äŧ˜åŒ–)。", + "ODD_EVEN_SPLIT": "å°†æ–‡æĄŖæ‹†åˆ†ä¸ē两ä¸Ē输å‡ē:所有åĨ‡æ•°éĄĩ和所有åļ数éĄĩ。", + "ODD_EVEN_MERGE": "通čŋ‡ä礿›ŋéĄĩéĸ合åšļ两ä¸Ē PDF:įŦŦ一ä¸Ēįš„åĨ‡æ•°éĄĩ,įŦŦäēŒä¸Ēįš„åļ数éĄĩ。", + "DUPLICATE": "栚捎č‡Ē厚䚉éĄēåēčŽĄæ•°å¤åˆļ每éĄĩ(例åĻ‚,4 复åˆļ每éĄĩ 4×)。", + "REMOVE_FIRST": "äģŽæ–‡æĄŖä¸­åˆ é™¤įŦŦ一éĄĩ。", + "REMOVE_LAST": "äģŽæ–‡æĄŖä¸­åˆ é™¤æœ€åŽä¸€éĄĩ。", + "REMOVE_FIRST_AND_LAST": "äģŽæ–‡æĄŖä¸­åˆ é™¤įŦŦ一éĄĩ和最后一éĄĩ。" + }, + "placeholder": "īŧˆäž‹åĻ‚īŧš1,3,2 或 4-8,2,10-12 或 2n-1īŧ‰" }, "addImage": { "tags": "回像、JPGã€å›žį‰‡ã€į…§į‰‡", @@ -1045,7 +1230,9 @@ "opacity": "不透明åēĻīŧˆ%īŧ‰", "spacing": { "horizontal": "æ°´åšŗé—´čˇ", - "vertical": "åž‚į›´é—´čˇ" + "vertical": "åž‚į›´é—´čˇ", + "height": "Height Spacing", + "width": "Width Spacing" }, "convertToImage": "将 PDF éĄĩéĸčŊŦä¸ē回像" }, @@ -1188,6 +1375,10 @@ "bullet4": "适ᔍäēŽæ•æ„Ÿæˆ–å—į‰ˆæƒäŋæŠ¤įš„内厚" } } + }, + "type": { + "1": "Text", + "2": "Image" } }, "permissions": { @@ -1261,6 +1452,26 @@ }, "submit": "删除" }, + "extractPages": { + "title": "Extract Pages", + "pageNumbers": { + "label": "Pages to Extract", + "placeholder": "e.g., 1,3,5-8 or odd & 1-10" + }, + "settings": { + "title": "Settings" + }, + "tooltip": { + "description": "Extracts the selected pages into a new PDF, preserving order." + }, + "error": { + "failed": "Failed to extract pages" + }, + "results": { + "title": "Pages Extracted" + }, + "submit": "Extract Pages" + }, "pageSelection": { "tooltip": { "header": { @@ -1301,10 +1512,43 @@ }, "examples": { "title": "į¤ē例" + }, + "complex": { + "bullet1": "1,3-5,8,2n → pages 1, 3–5, 8, plus evens", + "bullet2": "10-,2n-1 → from page 10 to end + odd pages", + "description": "Mix different types.", + "title": "Complex Combinations" + }, + "description": "Choose which pages to use for the operation. Supports single pages, ranges, formulas, and the all keyword.", + "individual": { + "bullet1": "1,3,5 → selects pages 1, 3, 5", + "bullet2": "2,7,12 → selects pages 2, 7, 12", + "description": "Enter numbers separated by commas.", + "title": "Individual Pages" + }, + "mathematical": { + "bullet1": "2n → all even pages (2, 4, 6â€Ļ)", + "bullet2": "2n-1 → all odd pages (1, 3, 5â€Ļ)", + "bullet3": "3n → every 3rd page (3, 6, 9â€Ļ)", + "bullet4": "4n-1 → pages 3, 7, 11, 15â€Ļ", + "description": "Use n in formulas for patterns.", + "title": "Mathematical Functions" + }, + "ranges": { + "bullet1": "3-6 → selects pages 3–6", + "bullet2": "10-15 → selects pages 10–15", + "bullet3": "5- → selects pages 5 to end", + "description": "Use - for consecutive pages.", + "title": "Page Ranges" + }, + "special": { + "bullet1": "all → selects all pages", + "title": "Special Keywords" } } }, "bulkSelection": { + "syntaxError": "There is a syntax issue. See Page Selection tips for help.", "header": { "title": "éĄĩéĸ选拊指南" }, @@ -1377,7 +1621,6 @@ } }, "changeMetadata": { - "tags": "标éĸ˜ã€äŊœč€…、æ—Ĩ期、创åģē、æ—ļé—´ã€å‘å¸ƒč€…ã€åˆļäŊœäēē、įģŸčŽĄæ•°æŽ", "header": "更攚元数捎", "submit": "更攚", "filenamePrefix": "元数捎", @@ -1498,7 +1741,8 @@ "bullet3": "UnknownīŧšæœĒæŒ‡åŽšé™ˇå°įŠļ态" } } - } + }, + "tags": "标éĸ˜ã€äŊœč€…、æ—Ĩ期、创åģē、æ—ļé—´ã€å‘å¸ƒč€…ã€åˆļäŊœäēē、įģŸčŽĄæ•°æŽ" }, "fileToPDF": { "tags": "čŊŦæĸ、æ ŧåŧã€æ–‡æĄŖã€å›žį‰‡ã€åšģį¯į‰‡ã€æ–‡æœŦ、čŊŦæĸ、Office、Docs、Word、Excel、PowerPoint", @@ -1611,6 +1855,9 @@ "text": "åœ¨į”Ÿæˆįš„ PDF 上čŋ›čĄŒåŽå¤„ᐆīŧŒį§ģ除 OCR äŧĒåŊąåšļäŧ˜åŒ–æ–‡æœŦåą‚äģĨ提éĢ˜å¯č¯ģ性åšļ减小äŊ“į§¯ã€‚" } } + }, + "error": { + "failed": "OCR operation failed" } }, "extractImages": { @@ -1620,11 +1867,11 @@ "selectText": "选拊回像æ ŧåŧīŧŒå°†æå–įš„å›žåƒčŊŦæĸä¸ē", "allowDuplicates": "äŋå­˜é‡å¤å›žåƒ", "submit": "提取", - "error": { - "failed": "äģŽ PDF 提取回像æ—ļå‘į”Ÿé”™č¯¯ã€‚" - }, "settings": { "title": "莞įŊŽ" + }, + "error": { + "failed": "äģŽ PDF 提取回像æ—ļå‘į”Ÿé”™č¯¯ã€‚" } }, "pdfToPDFA": { @@ -1697,14 +1944,43 @@ }, "info": "此功čƒŊ需čĻåŽ‰čŖ… Python" }, + "scannerImageSplit": { + "title": "åˇ˛æå–įš„å›žåƒ", + "submit": "提取回像æ‰Ģ描", + "error": { + "failed": "提取回像æ‰Ģ描æ—ļå‘į”Ÿé”™č¯¯ã€‚" + }, + "tooltip": { + "title": "į…§į‰‡åˆ†å‰˛å™¨", + "whatThisDoes": "功čƒŊč¯´æ˜Ž", + "whatThisDoesDesc": "č‡Ē动æŸĨ扞åšļäģŽæ‰Ģ描éĄĩéĸ或合成回像中提取每åŧ į…§į‰‡ - æ— éœ€æ‰‹åŠ¨čŖå‰Ē。", + "whenToUse": "äŊ•æ—ļäŊŋᔍ", + "useCase1": "一æŦĄæ‰Ģ描整ä¸Ēį›¸å†ŒéĄĩéĸ", + "useCase2": "å°†åšŗæŋ扚æŦĄæ‹†åˆ†ä¸ē单į‹Ŧįš„æ–‡äģļ", + "useCase3": "将æ‹ŧč´´į”ģ拆分ä¸ē单į‹Ŧįš„į…§į‰‡", + "useCase4": "äģŽæ–‡æĄŖä¸­æå–ᅧቇ", + "quickFixes": "åŋĢ速äŋŽå¤", + "problem1": "æœĒæŖ€æĩ‹åˆ°į…§į‰‡ → å°†åŽšåˇŽåĸžåŠ åˆ° 30-50", + "problem2": "č¯¯æŖ€æĩ‹å¤Ē多 → 将最小éĸ᧝åĸžåŠ åˆ° 15,000-20,000", + "problem3": "誁å‰Ēå¤Ēį´§ → å°†čžšæĄ†å¤§å°åĸžåŠ åˆ° 5-10", + "problem4": "å€žæ–œįš„į…§į‰‡æœĒįŸĢæ­Ŗ → 将角åēĻ阈å€ŧ降äŊŽåˆ° ~5°", + "problem5": "ၰ尘/å™ĒåŖ°æĄ† → 将最小čŊŽåģ“éĸ᧝åĸžåŠ åˆ° 1000-2000", + "setupTips": "莞įŊŽæį¤ē", + "tip1": "äŊŋį”¨įŽ€å•įš„æĩ…č‰˛čƒŒæ™¯", + "tip2": "åœ¨į…§į‰‡äš‹é—´į•™å‡ē小间隙(≈1 åŽ˜įąŗ)", + "tip3": "äģĨ 300-600 DPI æ‰Ģ描", + "tip4": "清洁æ‰Ģ描äģĒįŽģį’ƒ", + "headsUp": "æŗ¨æ„", + "headsUpDesc": "é‡å įš„į…§į‰‡æˆ–éĸœč‰˛ä¸Žį…§į‰‡éžå¸¸æŽĨčŋ‘įš„čƒŒæ™¯äŧšé™äŊŽå‡†įĄŽæ€§ - å°č¯•äŊŋį”¨æ›´æĩ…æˆ–æ›´æˇąįš„čƒŒæ™¯åšļį•™å‡ē更多įŠē间。" + } + }, "sign": { - "tags": "授权、įŧŠå†™ã€æ‰‹įģ˜į­žåã€æ–‡æœŦį­žåã€å›žåƒį­žå", "title": "į­žå", "header": "į­žįŊ˛ PDF", "upload": "上äŧ å›žį‰‡", "draw": { - "clear": "清除", - "title": "įģ˜åˆļæ‚¨įš„į­žå" + "title": "įģ˜åˆļæ‚¨įš„į­žå", + "clear": "清除" }, "text": { "name": "į­žįŊ˛äēē姓名", @@ -1714,6 +1990,7 @@ "add": "æˇģ加", "saved": "厞äŋå­˜į­žå", "save": "äŋå­˜į­žå", + "applySignatures": "åē”į”¨į­žå", "personalSigs": "ä¸Ēäēēį­žå", "sharedSigs": "å…ąäēĢį­žå", "noSavedSigs": "æœĒæ‰žåˆ°åˇ˛äŋå­˜įš„į­žå", @@ -1726,37 +2003,44 @@ "maintainRatio": "切æĸäŋæŒé•ŋåŽŊ比", "undo": "撤销", "redo": "重做", - "activate": "æŋ€æ´ģį­žåæ”žįŊŽ", - "applySignatures": "åē”į”¨į­žå", - "deactivate": "停æ­ĸ攞įŊŽį­žå", - "error": { - "failed": "į­žįŊ˛ PDF æ—ļå‘į”Ÿé”™č¯¯ã€‚" - }, - "image": { - "hint": "上äŧ  PNG 或 JPG æ ŧåŧįš„į­žåå›žåƒ", - "label": "上äŧ į­žåå›žåƒ", - "placeholder": "选拊回像文äģļ" - }, - "instructions": { - "title": "åĻ‚äŊ•æˇģåŠ į­žå" - }, - "results": { - "title": "į­žåį쓿žœ" - }, + "submit": "į­žįŊ˛æ–‡æĄŖ", "steps": { "configure": "配įŊŽį­žå" }, - "submit": "į­žįŊ˛æ–‡æĄŖ", "type": { - "canvas": "į”ģ布", + "title": "į­žåįąģ型", "draw": "įģ˜åˆļ", + "canvas": "į”ģ布", "image": "回像", - "text": "文æœŦ", - "title": "į­žåįąģ型" - } + "text": "文æœŦ" + }, + "image": { + "label": "上äŧ į­žåå›žåƒ", + "placeholder": "选拊回像文äģļ", + "hint": "上äŧ  PNG 或 JPG æ ŧåŧįš„į­žåå›žåƒ" + }, + "instructions": { + "title": "åĻ‚äŊ•æˇģåŠ į­žå", + "canvas": "After drawing your signature in the canvas, close the modal then click anywhere on the PDF to place it.", + "image": "After uploading your signature image above, click anywhere on the PDF to place it.", + "text": "After entering your name above, click anywhere on the PDF to place your signature." + }, + "mode": { + "move": "Move Signature", + "place": "Place Signature" + }, + "updateAndPlace": "Update and Place", + "activate": "æŋ€æ´ģį­žåæ”žįŊŽ", + "deactivate": "停æ­ĸ攞įŊŽį­žå", + "results": { + "title": "į­žåį쓿žœ" + }, + "error": { + "failed": "į­žįŊ˛ PDF æ—ļå‘į”Ÿé”™č¯¯ã€‚" + }, + "tags": "授权、įŧŠå†™ã€æ‰‹įģ˜į­žåã€æ–‡æœŦį­žåã€å›žåƒį­žå" }, "flatten": { - "tags": "é™æ€ã€åœį”¨ã€éžäē¤äē’ã€įŽ€åŒ–", "title": "åą•åšŗ", "header": "åą•åšŗ PDF", "flattenOnlyForms": "äģ…åą•åšŗčĄ¨æ ŧ", @@ -1771,9 +2055,11 @@ "options": { "stepTitle": "æ‰åšŗåŒ–é€‰éĄš", "title": "æ‰åšŗåŒ–é€‰éĄš", - "flattenOnlyForms.desc": "äģ…æ‰åšŗåŒ–čĄ¨å•å­—æŽĩīŧŒäŋį•™å…ļäģ–äē¤äē’å…ƒį´ ", - "note": "æ‰åšŗåŒ–äŧšį§ģ除 PDF įš„äē¤äē’å…ƒį´ īŧŒäŊŋå…ļ不可įŧ–čž‘ã€‚", - "flattenOnlyForms": "äģ…æ‰åšŗåŒ–čĄ¨å•" + "flattenOnlyForms": { + "label": "äģ…æ‰åšŗåŒ–čĄ¨å•", + "desc": "äģ…æ‰åšŗåŒ–čĄ¨å•å­—æŽĩīŧŒäŋį•™å…ļäģ–äē¤äē’å…ƒį´ " + }, + "note": "æ‰åšŗåŒ–äŧšį§ģ除 PDF įš„äē¤äē’å…ƒį´ īŧŒäŊŋå…ļ不可įŧ–čž‘ã€‚" }, "results": { "title": "æ‰åšŗåŒ–į쓿žœ" @@ -1801,7 +2087,8 @@ "bullet3": "æ‰šæŗ¨ä¸Žå¤‡æŗ¨äģå¯č§", "bullet4": "äšĻį­žäģå¯į”¨äēŽå¯ŧčˆĒ" } - } + }, + "tags": "é™æ€ã€åœį”¨ã€éžäē¤äē’ã€įŽ€åŒ–" }, "repair": { "tags": "äŋŽå¤ã€æĸ复、įē æ­Ŗã€æĸ复", @@ -1821,7 +2108,6 @@ } }, "removeBlanks": { - "tags": "æ¸…į†ã€įŽ€åŒ–ã€éžå†…åŽšã€æ•´į†", "title": "删除įŠēį™Ŋ", "header": "删除įŠēį™ŊéĄĩ", "settings": { @@ -1863,22 +2149,29 @@ "bullet3": "å¯å…ŗé—­äģĨå‡å°čž“å‡ē文äģļ大小" } }, - "submit": "删除įŠēį™Ŋ" + "submit": "删除įŠēį™Ŋ", + "error": { + "failed": "Failed to remove blank pages" + }, + "results": { + "title": "Removed Blank Pages" + }, + "tags": "æ¸…į†ã€įŽ€åŒ–ã€éžå†…åŽšã€æ•´į†" }, "removeAnnotations": { "tags": "蝄čŽē、é̘äēŽã€įŦ”čŽ°ã€æ ‡æŗ¨ã€åˆ é™¤", "title": "åˆ é™¤æ ‡æŗ¨", "header": "åˆ é™¤æ ‡æŗ¨", "submit": "删除", - "error": { - "failed": "äģŽ PDF åˆ é™¤æŗ¨é‡Šæ—ļå‘į”Ÿé”™č¯¯ã€‚" - }, - "info": { - "description": "æ­¤åˇĨ兎将äģŽæ‚¨įš„ PDF æ–‡æĄŖä¸­åˆ é™¤æ‰€æœ‰æŗ¨é‡Š(蝄čŽē、é̘äēŽã€įŦ”čްᭉ)。", - "title": "å…ŗäēŽåˆ é™¤æŗ¨é‡Š" - }, "settings": { "title": "莞įŊŽ" + }, + "info": { + "title": "å…ŗäēŽåˆ é™¤æŗ¨é‡Š", + "description": "æ­¤åˇĨ兎将äģŽæ‚¨įš„ PDF æ–‡æĄŖä¸­åˆ é™¤æ‰€æœ‰æŗ¨é‡Š(蝄čŽē、é̘äēŽã€įŦ”čްᭉ)。" + }, + "error": { + "failed": "äģŽ PDF åˆ é™¤æŗ¨é‡Šæ—ļå‘į”Ÿé”™č¯¯ã€‚" } }, "compare": { @@ -1965,7 +2258,12 @@ "bullet3": "可选拊攞įŊŽį­žåįš„éĄĩéĸ", "bullet4": "可选æˇģ加åžŊ标" } - } + }, + "invisible": "Invisible", + "options": { + "title": "Signature Details" + }, + "visible": "Visible" }, "sign": { "submit": "į­žįŊ˛ PDF", @@ -2026,7 +2324,22 @@ "text": "äŊŋᔍ keytool 将文äģļčŊŦæĸä¸ē Java 密é’Ĩåē“īŧˆ.jksīŧ‰īŧŒį„ļ后选拊 JKS。" } } - } + }, + "chooseCertificate": "Choose Certificate File", + "chooseJksFile": "Choose JKS File", + "chooseP12File": "Choose PKCS12 File", + "choosePfxFile": "Choose PFX File", + "choosePrivateKey": "Choose Private Key File", + "location": "Location", + "logoTitle": "Logo", + "name": "Name", + "noLogo": "No Logo", + "pageNumber": "Page Number", + "password": "Certificate Password", + "passwordOptional": "Leave empty if no password", + "reason": "Reason", + "serverCertMessage": "Using server certificate - no files or password required", + "showLogo": "Show Logo" }, "removeCertSign": { "tags": "čēĢäģŊéĒŒč¯ã€PEM、P12、厘斚、加密", @@ -2052,7 +2365,17 @@ "header": "多éĄĩå¸ƒåą€", "pagesPerSheet": "每éĄĩįš„éĄĩéĸ数īŧš", "addBorder": "æˇģåŠ čžšæĄ†", - "submit": "提äē¤" + "submit": "提äē¤", + "desc": { + "2": "Place 2 pages side-by-side on a single sheet.", + "3": "Place 3 pages on a single sheet in a single row.", + "4": "Place 4 pages on a single sheet (2 × 2 grid).", + "9": "Place 9 pages on a single sheet (3 × 3 grid).", + "16": "Place 16 pages on a single sheet (4 × 4 grid)." + }, + "error": { + "failed": "An error occurred while creating the multi-page layout." + } }, "bookletImposition": { "tags": "小册子,æ‹ŧį‰ˆ,打印,čŖ…čŽĸ,折叠,į­žå", @@ -2228,7 +2551,6 @@ "tags": "éĸœč‰˛æ Ąæ­Ŗã€č°ƒčŠ‚ã€äŋŽæ”šã€åĸžåŧē" }, "crop": { - "tags": "äŋŽå‰Ē、įŧŠå°ã€įŧ–čž‘ã€åŊĸįŠļ", "title": "誁å‰Ē", "header": "誁å‰Ē PDF", "submit": "提äē¤", @@ -2239,10 +2561,22 @@ "reset": "重įŊŽä¸ē整éĄĩ", "coordinates": { "title": "äŊįŊŽä¸Žå°ē寸", - "x": "X äŊįŊŽ", - "y": "Y äŊįŊŽ", - "width": "åŽŊåēĻ", - "height": "é̘åēĻ" + "x": { + "label": "X Position", + "desc": "Left edge (points)" + }, + "y": { + "label": "Y Position", + "desc": "Bottom edge (points)" + }, + "width": { + "label": "Width", + "desc": "Crop width (points)" + }, + "height": { + "label": "Height", + "desc": "Crop height (points)" + } }, "error": { "invalidArea": "誁å‰ĒåŒē域čļ…å‡ē PDF čžšį•Œ", @@ -2260,7 +2594,12 @@ }, "results": { "title": "誁å‰Ēį쓿žœ" - } + }, + "automation": { + "info": "Enter crop coordinates in PDF points. Origin (0,0) is at bottom-left. These values will be applied to all PDFs processed in this automation.", + "reference": "Reference: A4 page is 595.28 × 841.89 points (210mm × 297mm). 1 inch = 72 points." + }, + "tags": "äŋŽå‰Ē、įŧŠå°ã€įŧ–čž‘ã€åŊĸįŠļ" }, "autoSplitPDF": { "tags": "åŸēäēŽ QR į ã€åˆ†įĻģ、æ‰Ģæåˆ†å‰˛ã€æ•´į†", @@ -2470,11 +2809,15 @@ "overlay-pdfs": { "tags": "叠加", "header": "叠加 PDF 文äģļ", + "title": "Overlay PDFs", + "desc": "Overlay one PDF on top of another", "baseFile": { "label": "选拊åŸēįĄ€ PDF 文äģļ" }, "overlayFiles": { - "label": "选拊需čĻå åŠ åœ¨åŸēįĄ€ä¸Šįš„ PDF 文äģļ" + "label": "选拊需čĻå åŠ åœ¨åŸēįĄ€ä¸Šįš„ PDF 文äģļ", + "placeholder": "Choose PDF(s)...", + "addMore": "Add more PDFs..." }, "mode": { "label": "é€‰æ‹Šå åŠ æ¨Ąåŧ", @@ -2484,14 +2827,53 @@ }, "counts": { "label": "叠加æŦĄæ•°īŧˆäģ…限å›ēåŽšé‡å¤å åŠ æ¨Ąåŧīŧ‰", - "placeholder": "输å…Ĩį”¨é€—åˇåˆ†éš”įš„æŦĄæ•°īŧˆäž‹åĻ‚īŧš2,3,1īŧ‰" + "placeholder": "输å…Ĩį”¨é€—åˇåˆ†éš”įš„æŦĄæ•°īŧˆäž‹åĻ‚īŧš2,3,1īŧ‰", + "item": "Count for file", + "noFiles": "Add overlay files to configure counts" }, "position": { "label": "选拊叠加äŊįŊŽ", "foreground": "前éĸīŧˆä¸Šéĸīŧ‰", "background": "后éĸīŧˆä¸‹éĸīŧ‰" }, - "submit": "提äē¤" + "submit": "提äē¤", + "settings": { + "title": "Settings" + }, + "results": { + "title": "Overlay Results" + }, + "tooltip": { + "header": { + "title": "Overlay PDFs Overview" + }, + "description": { + "title": "Description", + "text": "Combine a base PDF with one or more overlay PDFs. Overlays can be applied page-by-page in different modes and placed in the foreground or background." + }, + "mode": { + "title": "Overlay Mode", + "text": "Choose how to distribute overlay pages across the base PDF pages.", + "sequential": "Sequential Overlay: Use pages from the first overlay PDF until it ends, then move to the next.", + "interleaved": "Interleaved Overlay: Take one page from each overlay in turn.", + "fixedRepeat": "Fixed Repeat Overlay: Take a set number of pages from each overlay before moving to the next. Use Counts to set the numbers." + }, + "position": { + "title": "Overlay Position", + "text": "Foreground places the overlay on top of the page. Background places it behind." + }, + "overlayFiles": { + "title": "Overlay Files", + "text": "Select one or more PDFs to overlay on the base. The order of these files affects how pages are applied in Sequential and Fixed Repeat modes." + }, + "counts": { + "title": "Counts (Fixed Repeat only)", + "text": "Provide a positive number for each overlay file showing how many pages to take before moving to the next. Required when mode is Fixed Repeat." + } + }, + "error": { + "failed": "An error occurred while overlaying PDFs." + } }, "split-by-sections": { "tags": "įĢ čŠ‚æ‹†åˆ†ã€åˆ†å‰˛ã€č‡Ē厚䚉", @@ -2526,7 +2908,18 @@ "customMargin": "č‡ĒåŽšäš‰å¤–čžščˇ", "customColor": "č‡Ē厚䚉文æœŦéĸœč‰˛", "submit": "提äē¤", - "noStampSelected": "æœĒ选拊印įĢ ã€‚čŋ”回到įŦŦ 1 æ­Ĩ。" + "noStampSelected": "æœĒ选拊印įĢ ã€‚čŋ”回到įŦŦ 1 æ­Ĩ。", + "customPosition": "Drag the stamp to the desired location in the preview window.", + "error": { + "failed": "An error occurred while adding stamp to the PDF." + }, + "imageSize": "Image Size", + "margin": "Margin", + "positionAndFormatting": "Position & Formatting", + "quickPosition": "Select a position on the page to place the stamp.", + "results": { + "title": "Stamp Results" + } }, "removeImagePdf": { "tags": "删除回像, éĄĩéĸ操äŊœ, 后į̝, æœåŠĄį̝" @@ -2544,7 +2937,8 @@ "status": { "_value": "įŠļ态", "valid": "有效", - "invalid": "无效" + "invalid": "无效", + "complete": "Validation complete" }, "signer": "į­žįŊ˛č€…", "date": "æ—Ĩ期", @@ -2571,35 +2965,115 @@ "version": "į‰ˆæœŦ", "keyUsage": "密é’Ĩᔍ途", "selfSigned": "č‡Ēį­žå", - "bits": "æ¯”į‰š" + "bits": "æ¯”į‰š", + "details": "Certificate Details" }, "signature": { "info": "į­žåäŋĄæ¯", "_value": "į­žå", "mathValid": "į­žååœ¨æ•°å­Ļ上有效īŧŒäŊ†:" }, - "selectCustomCert": "X.509 č‡Ēį­žåč¯äšĻīŧˆå¯é€‰īŧ‰" - }, - "replace-color": { - "title": "æ›ŋæĸ-反čŊŦ-éĸœč‰˛", - "header": "æ›ŋæĸ-反čŊŦ PDF éĸœč‰˛", - "selectText": { - "1": "æ›ŋæĸ或反čŊŦéĸœč‰˛é€‰éĄš", - "2": "éģ˜čޤīŧˆéģ˜čޤéĢ˜å¯šæ¯”åēĻéĸœč‰˛īŧ‰", - "3": "厚åˆļ(厚åˆļįš„éĸœč‰˛)", - "4": "全反čŊŦīŧˆåčŊŦ所有éĸœč‰˛īŧ‰", - "5": "éĢ˜å¯šæ¯”åēĻéĸœč‰˛é€‰éĄš", - "6": "éģ‘åē•į™Ŋ字", - "7": "į™Ŋåē•éģ‘å­—", - "8": "éģ‘åē•éģ„å­—", - "9": "éģ‘åē•įģŋ字", - "10": "选拊文æœŦéĸœč‰˛", - "11": "é€‰æ‹ŠčƒŒæ™¯éĸœč‰˛" + "selectCustomCert": "X.509 č‡Ēį­žåč¯äšĻīŧˆå¯é€‰īŧ‰", + "downloadCsv": "Download CSV", + "downloadJson": "Download JSON", + "downloadPdf": "Download PDF Report", + "downloadType": { + "csv": "CSV", + "json": "JSON", + "pdf": "PDF" }, - "submit": "取äģŖ" + "error": { + "allFailed": "Unable to validate the selected files.", + "partial": "Some files could not be validated.", + "reportGeneration": "Could not generate the PDF report. JSON and CSV are available.", + "unexpected": "Unexpected error during validation." + }, + "finalizing": "Preparing downloads...", + "issue": { + "certExpired": "Certificate expired", + "certRevocationUnknown": "Certificate revocation status unknown", + "certRevoked": "Certificate revoked", + "chainInvalid": "Certificate chain invalid", + "signatureInvalid": "Signature cryptographic check failed", + "trustInvalid": "Certificate not trusted" + }, + "noResults": "Run the validation to generate a report.", + "noSignaturesShort": "No signatures", + "processing": "Validating signatures...", + "report": { + "continued": "Continued", + "downloads": "Downloads", + "entryLabel": "Signature Summary", + "fields": { + "created": "Created", + "fileSize": "File Size", + "signatureCount": "Total Signatures", + "signatureDate": "Signature Date" + }, + "filesEvaluated": "{{count}} files evaluated", + "footer": "Validated via Stirling PDF", + "generatedAt": "Generated", + "noPdf": "PDF report will be available after a successful validation.", + "page": "Page", + "shortTitle": "Signature Summary", + "signatureCountLabel": "{{count}} signatures", + "signaturesFound": "{{count}} signatures detected", + "signaturesValid": "{{count}} fully valid", + "title": "Signature Validation Report" + }, + "settings": { + "certHint": "Upload a trusted X.509 certificate to validate against a custom trust source.", + "title": "Validation Settings" + }, + "signatureDate": "Signature Date", + "totalSignatures": "Total Signatures" }, - "replaceColorPdf": { - "tags": "更æĸéĸœč‰˛īŧŒéĄĩéĸ操äŊœīŧŒåŽį̝īŧŒæœåŠĄå™¨į̝" + "replaceColor": { + "tags": "æ›ŋæĸéĸœč‰˛,éĄĩéĸ操äŊœ,后į̝,æœåŠĄå™¨į̝", + "labels": { + "settings": "Settings", + "colourOperation": "Colour operation" + }, + "options": { + "highContrast": "High contrast", + "invertAll": "Invert all colours", + "custom": "Custom", + "cmyk": "Convert to CMYK" + }, + "tooltip": { + "header": { + "title": "Replace & Invert Colour Settings Overview" + }, + "description": { + "title": "Description", + "text": "Transform PDF colours to improve readability and accessibility. Choose from high contrast presets, invert all colours, or create custom colour schemes." + }, + "highContrast": { + "title": "High Contrast", + "text": "Apply predefined high contrast colour combinations designed for better readability and accessibility compliance.", + "bullet1": "White text on black background - Classic dark mode", + "bullet2": "Black text on white background - Standard high contrast", + "bullet3": "Yellow text on black background - High visibility option", + "bullet4": "Green text on black background - Alternative high contrast" + }, + "invertAll": { + "title": "Invert All Colours", + "text": "Completely invert all colours in the PDF, creating a negative-like effect. Useful for creating dark mode versions of documents or reducing eye strain in low-light conditions." + }, + "custom": { + "title": "Custom Colours", + "text": "Define your own text and background colours using the colour pickers. Perfect for creating branded documents or specific accessibility requirements.", + "bullet1": "Text colour - Choose the colour for text elements", + "bullet2": "Background colour - Set the background colour for the document" + }, + "cmyk": { + "title": "Convert to CMYK", + "text": "Convert the PDF from RGB colour space to CMYK colour space, optimized for professional printing. This process converts colours to the Cyan, Magenta, Yellow, Black model used by printers." + } + }, + "error": { + "failed": "An error occurred while processing the colour replacement." + } }, "login": { "title": "į™ģåŊ•", @@ -2632,6 +3106,11 @@ "enterEmail": "输å…Ĩæ‚¨įš„é‚ŽįŽą", "enterPassword": "输å…Ĩæ‚¨įš„å¯†į ", "loggingIn": "æ­Ŗåœ¨į™ģåŊ•â€Ļ", + "username": "Username", + "enterUsername": "Enter username", + "useEmailInstead": "Login with email", + "forgotPassword": "Forgot your password?", + "logIn": "Log In", "signingIn": "æ­Ŗåœ¨į™ģåŊ•â€Ļ", "login": "į™ģåŊ•", "or": "或", @@ -2649,7 +3128,10 @@ "magicLinkSent": "é­”æŗ•é“žæŽĨåˇ˛å‘é€č‡ŗ {{email}}īŧč¯ˇæŖ€æŸĨé‚ŽįŽąåšļį‚šå‡ģ链æŽĨį™ģåŊ•。", "passwordResetSent": "å¯†į é‡įŊŽé“žæŽĨåˇ˛å‘é€č‡ŗ {{email}}īŧč¯ˇæŖ€æŸĨé‚ŽįŽąåšļ按指åŧ•操äŊœã€‚", "failedToSignIn": "äŊŋᔍ {{provider}} į™ģåŊ•å¤ąč´Ĩīŧš{{message}}", - "unexpectedError": "æ„å¤–é”™č¯¯īŧš{{message}}" + "unexpectedError": "æ„å¤–é”™č¯¯īŧš{{message}}", + "accountCreatedSuccess": "Account created successfully! You can now sign in.", + "passwordChangedSuccess": "Password changed successfully! Please sign in with your new password.", + "credentialsUpdated": "Your credentials have been updated. Please sign in again." }, "signup": { "title": "创åģēč´Ļæˆˇ", @@ -2672,7 +3154,12 @@ "invalidEmail": "č¯ˇčž“å…Ĩæœ‰æ•ˆįš„é‚ŽįŽąåœ°å€", "checkEmailConfirmation": "č¯ˇæŖ€æŸĨé‚ŽįŽąä¸­įš„įĄŽčŽ¤é“žæŽĨäģĨåŽŒæˆæŗ¨å†Œã€‚", "accountCreatedSuccessfully": "č´Ļæˆˇåˆ›åģ翈åŠŸīŧæ‚¨įŽ°åœ¨å¯äģĨį™ģåŊ•。", - "unexpectedError": "æ„å¤–é”™č¯¯īŧš{{message}}" + "unexpectedError": "æ„å¤–é”™č¯¯īŧš{{message}}", + "useEmailInstead": "Use Email Instead", + "nameRequired": "Name is required", + "emailRequired": "Email is required", + "passwordRequired": "Password is required", + "confirmPasswordRequired": "Please confirm your password" }, "pdfToSinglePage": { "title": "PDF čŊŦ单éĄĩ", @@ -2712,10 +3199,23 @@ "adjustContrast": { "title": "č°ƒæ•´å¯šæ¯”åēĻ", "header": "č°ƒæ•´å¯šæ¯”åēĻ", + "basic": "Basic Adjustments", "contrast": "寚比åēĻīŧš", "brightness": "äēŽåēĻīŧš", "saturation": "éĨąå’ŒåēĻīŧš", - "download": "下čŊŊ" + "download": "下čŊŊ", + "adjustColors": "Adjust Colors", + "blue": "Blue", + "confirm": "Confirm", + "error": { + "failed": "Failed to adjust colors/contrast" + }, + "green": "Green", + "noPreview": "Select a PDF to preview", + "red": "Red", + "results": { + "title": "Adjusted PDF" + } }, "compress": { "title": "压įŧŠ", @@ -2862,7 +3362,13 @@ "title": "删除回像", "header": "删除回像", "removeImage": "删除回像", - "submit": "删除回像" + "submit": "删除回像", + "error": { + "failed": "Failed to remove images from the PDF." + }, + "results": { + "title": "Remove Images Results" + } }, "splitByChapters": { "title": "按įĢ čŠ‚æ‹†åˆ† PDF", @@ -2937,6 +3443,10 @@ "title": "分析įģŸčŽĄ", "description": "čŋ™äē›Cookie帎劊我äģŦ分析åˇĨå…ˇäŊŋį”¨æƒ…å†ĩīŧŒäģĨäžŋ聚į„Ļåŧ€å‘į”¨æˆˇæœ€éœ€čĻįš„åŠŸčƒŊ。再æŦĄåŧē调īŧšStirling PDFįģä¸äŧščŋŊč¸Ēæ‚¨å¤„į†įš„æ–‡æĄŖå†…åŽšã€‚" } + }, + "services": { + "posthog": "PostHog Analytics", + "scarf": "Scarf Pixel" } }, "removeMetadata": { @@ -2998,11 +3508,18 @@ "panMode": "åšŗį§ģæ¨Ąåŧ", "rotateLeft": "向åˇĻ旋čŊŦ", "rotateRight": "å‘åŗæ—‹čŊŦ", - "toggleSidebar": "切æĸäž§čžšæ " + "toggleSidebar": "切æĸäž§čžšæ ", + "exportSelected": "Export Selected Pages", + "toggleAnnotations": "Toggle Annotations Visibility", + "annotationMode": "Toggle Annotation Mode", + "draw": "Draw", + "save": "Save" }, "search": { "title": "搜į´ĸ PDF", - "placeholder": "输å…Ĩ搜į´ĸč¯â€Ļ" + "placeholder": "输å…Ĩ搜į´ĸč¯â€Ļ", + "noResults": "No results found", + "searching": "Searching..." }, "guestBanner": { "title": "æ‚¨æ­Ŗåœ¨äģĨčŽŋåŽĸčēĢäģŊäŊŋᔍ Stirling PDFīŧ", @@ -3040,9 +3557,597 @@ "automate": "č‡Ē动化", "files": "文äģļ", "activity": "æ´ģ动", + "help": "Help", + "account": "Account", "config": "配įŊŽ", + "adminSettings": "Admin Settings", "allTools": "全部åˇĨå…ˇ" }, + "admin": { + "error": "Error", + "success": "Success", + "expand": "Expand", + "close": "Close", + "status": { + "active": "Active", + "inactive": "Inactive" + }, + "settings": { + "title": "Admin Settings", + "workspace": "Workspace", + "fetchError": "Failed to load settings", + "saveError": "Failed to save settings", + "saved": "Settings saved successfully", + "saveSuccess": "Settings saved successfully", + "save": "Save Changes", + "restartRequired": "Restart Required", + "restart": { + "title": "Restart Required", + "message": "Settings have been saved successfully. A server restart is required for the changes to take effect.", + "question": "Would you like to restart the server now or later?", + "now": "Restart Now", + "later": "Restart Later" + }, + "restarting": "Restarting Server", + "restartingMessage": "The server is restarting. Please wait a moment...", + "restartError": "Failed to restart server. Please restart manually.", + "general": { + "title": "System Settings", + "description": "Configure system-wide application settings including branding and default behaviour.", + "ui": "User Interface", + "system": "System", + "appName": { + "label": "Application Name", + "description": "The name displayed in the browser tab and home page" + }, + "appNameNavbar": { + "label": "Navbar Brand", + "description": "The name displayed in the navigation bar" + }, + "homeDescription": { + "label": "Home Description", + "description": "The description text shown on the home page" + }, + "defaultLocale": { + "label": "Default Locale", + "description": "The default language for new users (e.g., en_US, es_ES)" + }, + "fileUploadLimit": { + "label": "File Upload Limit", + "description": "Maximum file upload size (e.g., 100MB, 1GB)" + }, + "showUpdate": { + "label": "Show Update Notifications", + "description": "Display notifications when a new version is available" + }, + "showUpdateOnlyAdmin": { + "label": "Show Updates to Admins Only", + "description": "Restrict update notifications to admin users only" + }, + "customHTMLFiles": { + "label": "Custom HTML Files", + "description": "Allow serving custom HTML files from the customFiles directory" + }, + "languages": { + "label": "Available Languages", + "description": "Languages that users can select from (leave empty to enable all languages)" + }, + "customMetadata": { + "label": "Custom Metadata", + "autoUpdate": { + "label": "Auto Update Metadata", + "description": "Automatically update PDF metadata on all processed documents" + }, + "author": { + "label": "Default Author", + "description": "Default author for PDF metadata (e.g., username)" + }, + "creator": { + "label": "Default Creator", + "description": "Default creator for PDF metadata" + }, + "producer": { + "label": "Default Producer", + "description": "Default producer for PDF metadata" + } + }, + "customPaths": { + "label": "Custom Paths", + "description": "Configure custom file system paths for pipeline processing and external tools", + "pipeline": { + "label": "Pipeline Directories", + "watchedFoldersDir": { + "label": "Watched Folders Directory", + "description": "Directory where pipeline monitors for incoming PDFs (leave empty for default: /pipeline/watchedFolders)" + }, + "finishedFoldersDir": { + "label": "Finished Folders Directory", + "description": "Directory where processed PDFs are outputted (leave empty for default: /pipeline/finishedFolders)" + } + }, + "operations": { + "label": "External Tool Paths", + "weasyprint": { + "label": "WeasyPrint Executable", + "description": "Path to WeasyPrint executable for HTML to PDF conversion (leave empty for default: /opt/venv/bin/weasyprint)" + }, + "unoconvert": { + "label": "Unoconvert Executable", + "description": "Path to LibreOffice unoconvert for document conversions (leave empty for default: /opt/venv/bin/unoconvert)" + } + } + } + }, + "security": { + "title": "Security", + "description": "Configure authentication, login behaviour, and security policies.", + "ssoNotice": { + "title": "Looking for SSO/SAML settings?", + "message": "OAuth2 and SAML2 authentication providers have been moved to the Connections menu for easier management." + }, + "authentication": "Authentication", + "enableLogin": { + "label": "Enable Login", + "description": "Require users to log in before accessing the application" + }, + "loginMethod": { + "label": "Login Method", + "description": "The authentication method to use for user login", + "all": "All Methods", + "normal": "Username/Password Only", + "oauth2": "OAuth2 Only", + "saml2": "SAML2 Only" + }, + "loginAttemptCount": { + "label": "Login Attempt Limit", + "description": "Maximum number of failed login attempts before account lockout" + }, + "loginResetTimeMinutes": { + "label": "Login Reset Time (minutes)", + "description": "Time before failed login attempts are reset" + }, + "csrfDisabled": { + "label": "Disable CSRF Protection", + "description": "Disable Cross-Site Request Forgery protection (not recommended)" + }, + "initialLogin": { + "label": "Initial Login", + "username": { + "label": "Initial Username", + "description": "The username for the initial admin account" + }, + "password": { + "label": "Initial Password", + "description": "The password for the initial admin account" + } + }, + "jwt": { + "label": "JWT Configuration", + "secureCookie": { + "label": "Secure Cookie", + "description": "Require HTTPS for JWT cookies (recommended for production)" + }, + "keyRetentionDays": { + "label": "Key Retention Days", + "description": "Number of days to retain old JWT keys for verification" + }, + "persistence": { + "label": "Enable Key Persistence", + "description": "Store JWT keys persistently to survive server restarts" + }, + "enableKeyRotation": { + "label": "Enable Key Rotation", + "description": "Automatically rotate JWT signing keys periodically" + }, + "enableKeyCleanup": { + "label": "Enable Key Cleanup", + "description": "Automatically remove expired JWT keys" + } + }, + "audit": { + "label": "Audit Logging", + "enabled": { + "label": "Enable Audit Logging", + "description": "Track user actions and system events for compliance and security monitoring" + }, + "level": { + "label": "Audit Level", + "description": "0=OFF, 1=BASIC, 2=STANDARD, 3=VERBOSE" + }, + "retentionDays": { + "label": "Audit Retention (days)", + "description": "Number of days to retain audit logs" + } + }, + "htmlUrlSecurity": { + "label": "HTML URL Security", + "description": "Configure URL access restrictions for HTML processing to prevent SSRF attacks", + "enabled": { + "label": "Enable URL Security", + "description": "Enable URL security restrictions for HTML to PDF conversions" + }, + "level": { + "label": "Security Level", + "description": "MAX: whitelist only, MEDIUM: block internal networks, OFF: no restrictions", + "max": "Maximum (Whitelist Only)", + "medium": "Medium (Block Internal)", + "off": "Off (No Restrictions)" + }, + "advanced": "Advanced Settings", + "allowedDomains": { + "label": "Allowed Domains (Whitelist)", + "description": "One domain per line (e.g., cdn.example.com). Only these domains allowed when level is MAX" + }, + "blockedDomains": { + "label": "Blocked Domains (Blacklist)", + "description": "One domain per line (e.g., malicious.com). Additional domains to block" + }, + "internalTlds": { + "label": "Internal TLDs", + "description": "One TLD per line (e.g., .local, .internal). Block domains with these TLD patterns" + }, + "networkBlocking": "Network Blocking", + "blockPrivateNetworks": { + "label": "Block Private Networks", + "description": "Block RFC 1918 private networks (10.x.x.x, 192.168.x.x, 172.16-31.x.x)" + }, + "blockLocalhost": { + "label": "Block Localhost", + "description": "Block localhost and loopback addresses (127.x.x.x, ::1)" + }, + "blockLinkLocal": { + "label": "Block Link-Local Addresses", + "description": "Block link-local addresses (169.254.x.x, fe80::/10)" + }, + "blockCloudMetadata": { + "label": "Block Cloud Metadata Endpoints", + "description": "Block cloud provider metadata endpoints (169.254.169.254)" + } + } + }, + "connections": { + "title": "Connections", + "description": "Configure external authentication providers like OAuth2 and SAML.", + "linkedServices": "Linked Services", + "unlinkedServices": "Unlinked Services", + "connect": "Connect", + "disconnect": "Disconnect", + "disconnected": "Provider disconnected successfully", + "disconnectError": "Failed to disconnect provider", + "ssoAutoLogin": { + "label": "SSO Auto Login", + "enable": "Enable SSO Auto Login", + "description": "Automatically redirect to SSO login when authentication is required" + }, + "oauth2": { + "label": "OAuth2", + "enabled": { + "label": "Enable OAuth2", + "description": "Allow users to authenticate using OAuth2 providers" + }, + "provider": { + "label": "Provider", + "description": "The OAuth2 provider to use for authentication" + }, + "issuer": { + "label": "Issuer URL", + "description": "The OAuth2 provider issuer URL" + }, + "clientId": { + "label": "Client ID", + "description": "The OAuth2 client ID from your provider" + }, + "clientSecret": { + "label": "Client Secret", + "description": "The OAuth2 client secret from your provider" + }, + "useAsUsername": { + "label": "Use as Username", + "description": "The OAuth2 claim to use as the username (e.g., email, sub)" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first OAuth2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via OAuth2" + }, + "scopes": { + "label": "OAuth2 Scopes", + "description": "Comma-separated list of OAuth2 scopes to request (e.g., openid, profile, email)" + } + }, + "saml2": { + "label": "SAML2", + "enabled": { + "label": "Enable SAML2", + "description": "Allow users to authenticate using SAML2 providers" + }, + "provider": { + "label": "Provider", + "description": "The SAML2 provider name" + }, + "registrationId": { + "label": "Registration ID", + "description": "The SAML2 registration identifier" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first SAML2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via SAML2" + } + } + }, + "database": { + "title": "Database", + "description": "Configure custom database connection settings for enterprise deployments.", + "configuration": "Database Configuration", + "enableCustom": { + "label": "Enable Custom Database", + "description": "Use your own custom database configuration instead of the default embedded database" + }, + "customUrl": { + "label": "Custom Database URL", + "description": "Full JDBC connection string (e.g., jdbc:postgresql://localhost:5432/postgres). If provided, individual connection settings below are not used." + }, + "type": { + "label": "Database Type", + "description": "Type of database (not used if custom URL is provided)" + }, + "hostName": { + "label": "Host Name", + "description": "Database server hostname (not used if custom URL is provided)" + }, + "port": { + "label": "Port", + "description": "Database server port (not used if custom URL is provided)" + }, + "name": { + "label": "Database Name", + "description": "Name of the database (not used if custom URL is provided)" + }, + "username": { + "label": "Username", + "description": "Database authentication username" + }, + "password": { + "label": "Password", + "description": "Database authentication password" + } + }, + "privacy": { + "title": "Privacy", + "description": "Configure privacy and data collection settings.", + "analytics": "Analytics & Tracking", + "enableAnalytics": { + "label": "Enable Analytics", + "description": "Collect anonymous usage analytics to help improve the application" + }, + "metricsEnabled": { + "label": "Enable Metrics", + "description": "Enable collection of performance and usage metrics. Provides API endpoint for admins to access metrics data" + }, + "searchEngine": "Search Engine Visibility", + "googleVisibility": { + "label": "Google Visibility", + "description": "Allow search engines to index this application" + } + }, + "advanced": { + "title": "Advanced", + "description": "Configure advanced features and experimental functionality.", + "features": "Feature Flags", + "processing": "Processing", + "endpoints": { + "label": "Endpoints", + "manage": "Manage API Endpoints", + "description": "Endpoint management is configured via YAML. See documentation for details on enabling/disabling specific endpoints." + }, + "enableAlphaFunctionality": { + "label": "Enable Alpha Features", + "description": "Enable experimental and alpha-stage features (may be unstable)" + }, + "enableUrlToPDF": { + "label": "Enable URL to PDF", + "description": "Allow conversion of web pages to PDF documents" + }, + "maxDPI": { + "label": "Maximum DPI", + "description": "Maximum DPI for image processing (0 = unlimited)" + }, + "tessdataDir": { + "label": "Tessdata Directory", + "description": "Path to the tessdata directory for OCR language files" + }, + "disableSanitize": { + "label": "Disable HTML Sanitization", + "description": "WARNING: Security risk - disabling HTML sanitization can lead to XSS vulnerabilities" + }, + "tempFileManagement": { + "label": "Temp File Management", + "description": "Configure temporary file storage and cleanup behavior", + "baseTmpDir": { + "label": "Base Temp Directory", + "description": "Base directory for temporary files (leave empty for default: java.io.tmpdir/stirling-pdf)" + }, + "libreofficeDir": { + "label": "LibreOffice Temp Directory", + "description": "Directory for LibreOffice temp files (leave empty for default: baseTmpDir/libreoffice)" + }, + "systemTempDir": { + "label": "System Temp Directory", + "description": "System temp directory to clean (only used if cleanupSystemTemp is enabled)" + }, + "prefix": { + "label": "Temp File Prefix", + "description": "Prefix for temp file names" + }, + "maxAgeHours": { + "label": "Max Age (hours)", + "description": "Maximum age in hours before temp files are cleaned up" + }, + "cleanupIntervalMinutes": { + "label": "Cleanup Interval (minutes)", + "description": "How often to run cleanup (in minutes)" + }, + "startupCleanup": { + "label": "Startup Cleanup", + "description": "Clean up old temp files on application startup" + }, + "cleanupSystemTemp": { + "label": "Cleanup System Temp", + "description": "Whether to clean broader system temp directory (use with caution)" + } + }, + "processExecutor": { + "label": "Process Executor Limits", + "description": "Configure session limits and timeouts for each process executor", + "sessionLimit": { + "label": "Session Limit", + "description": "Maximum concurrent instances" + }, + "timeout": { + "label": "Timeout (minutes)", + "description": "Maximum execution time" + }, + "libreOffice": "LibreOffice", + "pdfToHtml": "PDF to HTML", + "qpdf": "QPDF", + "tesseract": "Tesseract OCR", + "pythonOpenCv": "Python OpenCV", + "weasyPrint": "WeasyPrint", + "installApp": "Install App", + "calibre": "Calibre", + "ghostscript": "Ghostscript", + "ocrMyPdf": "OCRmyPDF" + } + }, + "mail": { + "title": "Mail Server", + "description": "Configure SMTP settings for sending email notifications.", + "smtp": "SMTP Configuration", + "enabled": { + "label": "Enable Mail", + "description": "Enable email notifications and SMTP functionality" + }, + "host": { + "label": "SMTP Host", + "description": "The hostname or IP address of your SMTP server" + }, + "port": { + "label": "SMTP Port", + "description": "The port number for SMTP connection (typically 25, 465, or 587)" + }, + "username": { + "label": "SMTP Username", + "description": "Username for SMTP authentication" + }, + "password": { + "label": "SMTP Password", + "description": "Password for SMTP authentication" + }, + "from": { + "label": "From Address", + "description": "The email address to use as the sender" + }, + "enableInvites": { + "label": "Enable Email Invites", + "description": "Allow admins to invite users via email with auto-generated passwords" + }, + "frontendUrl": { + "label": "Frontend URL", + "description": "Base URL for frontend (e.g. https://pdf.example.com). Used for generating invite links in emails. Leave empty to use backend URL." + } + }, + "legal": { + "title": "Legal Documents", + "description": "Configure links to legal documents and policies.", + "disclaimer": { + "title": "Legal Responsibility Warning", + "message": "By customizing these legal documents, you assume full responsibility for ensuring compliance with all applicable laws and regulations, including but not limited to GDPR and other EU data protection requirements. Only modify these settings if: (1) you are operating a personal/private instance, (2) you are outside EU jurisdiction and understand your local legal obligations, or (3) you have obtained proper legal counsel and accept sole responsibility for all user data and legal compliance. Stirling-PDF and its developers assume no liability for your legal obligations." + }, + "termsAndConditions": { + "label": "Terms and Conditions", + "description": "URL or filename to terms and conditions" + }, + "privacyPolicy": { + "label": "Privacy Policy", + "description": "URL or filename to privacy policy" + }, + "accessibilityStatement": { + "label": "Accessibility Statement", + "description": "URL or filename to accessibility statement" + }, + "cookiePolicy": { + "label": "Cookie Policy", + "description": "URL or filename to cookie policy" + }, + "impressum": { + "label": "Impressum", + "description": "URL or filename to impressum (required in some jurisdictions)" + } + }, + "premium": { + "title": "Premium & Enterprise", + "description": "Configure your premium or enterprise license key.", + "license": "License Configuration", + "key": { + "label": "License Key", + "description": "Enter your premium or enterprise license key" + }, + "enabled": { + "label": "Enable Premium Features", + "description": "Enable license key checks for pro/enterprise features" + }, + "movedFeatures": { + "title": "Premium Features Distributed", + "message": "Premium and Enterprise features are now organized in their respective sections:" + } + }, + "features": { + "title": "Features", + "description": "Configure optional features and functionality.", + "serverCertificate": { + "label": "Server Certificate", + "description": "Configure server-side certificate generation for \"Sign with Stirling-PDF\" functionality", + "enabled": { + "label": "Enable Server Certificate", + "description": "Enable server-side certificate for \"Sign with Stirling-PDF\" option" + }, + "organizationName": { + "label": "Organization Name", + "description": "Organization name for generated certificates" + }, + "validity": { + "label": "Certificate Validity (days)", + "description": "Number of days the certificate will be valid" + }, + "regenerateOnStartup": { + "label": "Regenerate on Startup", + "description": "Generate new certificate on each application startup" + } + } + }, + "endpoints": { + "title": "API Endpoints", + "description": "Control which API endpoints and endpoint groups are available.", + "management": "Endpoint Management", + "toRemove": { + "label": "Disabled Endpoints", + "description": "Select individual endpoints to disable" + }, + "groupsToRemove": { + "label": "Disabled Endpoint Groups", + "description": "Select endpoint groups to disable" + }, + "note": "Note: Disabling endpoints restricts API access but does not remove UI components. Restart required for changes to take effect." + } + } + }, "fileUpload": { "selectFile": "选拊文äģļ", "selectFiles": "选拊文äģļ", @@ -3067,6 +4172,9 @@ "addFiles": "æˇģ加文äģļ", "dragFilesInOrClick": "拖å…Ĩ文äģ￈–į‚šå‡ģ“æˇģ加文äģĩč§ˆ" }, + "fileEditor": { + "addFiles": "Add Files" + }, "fileManager": { "title": "上äŧ  PDF 文äģļ", "subtitle": "将文äģᅫģåŠ åˆ°æ‚¨įš„å­˜å‚¨īŧŒäģĨäžŋ在各åˇĨå…ˇäš‹é—´čŊģæžčŽŋ问", @@ -3095,6 +4203,7 @@ "lastModified": "上æŦĄäŋŽæ”š", "toolChain": "厞åē”ᔍåˇĨå…ˇ", "restore": "æĸ复", + "unzip": "Unzip", "searchFiles": "搜į´ĸ文äģļâ€Ļ", "recent": "最čŋ‘", "localFiles": "æœŦ地文äģļ", @@ -3102,7 +4211,6 @@ "googleDriveShort": "Drive", "myFiles": "æˆ‘įš„æ–‡äģļ", "noRecentFiles": "æœĒ扞到最čŋ‘æ–‡äģļ", - "dropFilesHint": "将文äģļæ‹–åˆ°æ­¤å¤„åŗå¯ä¸Šäŧ ", "googleDriveNotAvailable": "不可äŊŋᔍ Google äē‘į̝įĄŦį›˜é›†æˆ", "openFiles": "打åŧ€æ–‡äģļ", "openFile": "打åŧ€æ–‡äģļ", @@ -3120,7 +4228,18 @@ "selectedCount": "厞选 {{count}}", "download": "下čŊŊ", "delete": "删除", - "unsupported": "不支持" + "unsupported": "不支持", + "addToUpload": "Add to Upload", + "deleteAll": "Delete All", + "loadingFiles": "Loading files...", + "noFiles": "No files available", + "noFilesFound": "No files found matching your search", + "openInPageEditor": "Open in Page Editor", + "showAll": "Show All", + "sortByDate": "Sort by Date", + "sortByName": "Sort by Name", + "sortBySize": "Sort by Size", + "dropFilesHint": "将文äģļæ‹–åˆ°æ­¤å¤„åŗå¯ä¸Šäŧ " }, "storage": { "temporaryNotice": "文äģļ临æ—ļå­˜å‚¨åœ¨æ‚¨įš„æĩč§ˆå™¨ä¸­īŧŒå¯čƒŊäŧščĸĢč‡Ē动清除", @@ -3136,8 +4255,10 @@ "desc": "į§ģ除 PDF 文äģļä¸­įš„æŊœåœ¨æœ‰åŽŗå…ƒį´ ã€‚", "submit": "æ¸…į† PDF", "completed": "åŽ‰å…¨æ¸…į†æˆåŠŸåŽŒæˆ", - "error.generic": "åŽ‰å…¨æ¸…į†å¤ąč´Ĩ", - "error.failed": "åŽ‰å…¨æ¸…į† PDF æ—ļå‘į”Ÿé”™č¯¯ã€‚", + "error": { + "generic": "åŽ‰å…¨æ¸…į†å¤ąč´Ĩ", + "failed": "åŽ‰å…¨æ¸…į† PDF æ—ļå‘į”Ÿé”™č¯¯ã€‚" + }, "filenamePrefix": "åˇ˛æ¸…į†", "sanitizationResults": "åŽ‰å…¨æ¸…į†į쓿žœ", "steps": { @@ -3151,18 +4272,30 @@ "options": { "title": "åŽ‰å…¨æ¸…į†é€‰éĄš", "note": "č¯ˇé€‰æ‹ŠčρäģŽ PDF 中į§ģé™¤įš„å…ƒį´ ã€‚č‡ŗå°‘éœ€čĻé€‰æ‹Šä¸€ä¸Ēé€‰éĄšã€‚", - "removeJavaScript.desc": "į§ģ除 PDF ä¸­įš„ JavaScript 操äŊœä¸Žč„šæœŦ", - "removeEmbeddedFiles.desc": "į§ģ除åĩŒå…Ĩ在 PDF ä¸­įš„äģģäŊ•æ–‡äģļ", - "removeXMPMetadata.desc": "äģŽ PDF 中į§ģ除 XMP 元数捎", - "removeMetadata.desc": "į§ģé™¤æ–‡æĄŖäŋĄæ¯å…ƒæ•°æŽīŧˆæ ‡éĸ˜ã€äŊœč€…į­‰īŧ‰", - "removeLinks.desc": "į§ģ除外部铞æŽĨ与启动动äŊœ", - "removeFonts.desc": "äģŽ PDF 中į§ģ除åĩŒå…Ĩ字äŊ“", - "removeEmbeddedFiles": "删除åĩŒå…Ĩ文äģļ", - "removeFonts": "删除字äŊ“", - "removeJavaScript": "删除 JavaScript", - "removeLinks": "删除铞æŽĨ", - "removeMetadata": "åˆ é™¤æ–‡æĄŖå…ƒæ•°æŽ", - "removeXMPMetadata": "删除 XMP 元数捎" + "removeJavaScript": { + "label": "删除 JavaScript", + "desc": "į§ģ除 PDF ä¸­įš„ JavaScript 操äŊœä¸Žč„šæœŦ" + }, + "removeEmbeddedFiles": { + "label": "删除åĩŒå…Ĩ文äģļ", + "desc": "į§ģ除åĩŒå…Ĩ在 PDF ä¸­įš„äģģäŊ•æ–‡äģļ" + }, + "removeXMPMetadata": { + "label": "删除 XMP 元数捎", + "desc": "äģŽ PDF 中į§ģ除 XMP 元数捎" + }, + "removeMetadata": { + "label": "åˆ é™¤æ–‡æĄŖå…ƒæ•°æŽ", + "desc": "į§ģé™¤æ–‡æĄŖäŋĄæ¯å…ƒæ•°æŽīŧˆæ ‡éĸ˜ã€äŊœč€…į­‰īŧ‰" + }, + "removeLinks": { + "label": "删除铞æŽĨ", + "desc": "į§ģ除外部铞æŽĨ与启动动äŊœ" + }, + "removeFonts": { + "label": "删除字äŊ“", + "desc": "äģŽ PDF 中į§ģ除åĩŒå…Ĩ字äŊ“" + } } }, "addPassword": { @@ -3383,9 +4516,14 @@ "remaining": "削äŊ™", "used": "厞ᔍ", "available": "å¯į”¨", - "cancel": "取æļˆ" + "cancel": "取æļˆ", + "preview": "Preview" }, "config": { + "overview": { + "title": "Application Configuration", + "description": "Current application settings and configuration details." + }, "account": { "overview": { "title": "č´ĻæˆˇčŽžįŊŽ", @@ -3431,57 +4569,584 @@ "generateError": "我äģŦæ— æŗ•į”Ÿæˆæ‚¨įš„ API 密é’Ĩ。" } }, - "termsAndConditions": "æĄæŦžä¸ŽæĄäģļ", - "logOut": "退å‡ēį™ģåŊ•", "AddAttachmentsRequest": { - "addMoreFiles": "æˇģ加更多文äģļ...", "attachments": "选拊附äģļ", "info": "选拊čĻé™„åŠ åˆ° PDF įš„æ–‡äģļ。čŋ™ä盿–‡äģļ将čĸĢåĩŒå…Ĩåšļ可通čŋ‡ PDF įš„é™„äģļéĸæŋčŽŋ闎。", + "selectFiles": "选拊čĻé™„åŠ įš„æ–‡äģļ", "placeholder": "选拊文äģļ...", + "addMoreFiles": "æˇģ加更多文äģļ...", + "selectedFiles": "åˇ˛é€‰æ‹Šįš„æ–‡äģļ", + "submit": "æˇģ加附äģļ", "results": { "title": "附äģļį쓿žœ" }, - "selectFiles": "选拊čĻé™„åŠ įš„æ–‡äģļ", - "selectedFiles": "åˇ˛é€‰æ‹Šįš„æ–‡äģļ", - "submit": "æˇģ加附äģļ" - }, - "applyAndContinue": "åē”ᔍåšļįģ§įģ­", - "discardChanges": "攞åŧƒæ›´æ”š", - "exportAndContinue": "å¯ŧå‡ēåšļįģ§įģ­", - "keepWorking": "įģ§įģ­åˇĨäŊœ", - "replaceColor": { - "tags": "æ›ŋæĸéĸœč‰˛,éĄĩéĸ操äŊœ,后į̝,æœåŠĄå™¨į̝" - }, - "scannerImageSplit": { "error": { - "failed": "提取回像æ‰Ģ描æ—ļå‘į”Ÿé”™č¯¯ã€‚" - }, - "submit": "提取回像æ‰Ģ描", - "title": "åˇ˛æå–įš„å›žåƒ", - "tooltip": { - "headsUp": "æŗ¨æ„", - "headsUpDesc": "é‡å įš„į…§į‰‡æˆ–éĸœč‰˛ä¸Žį…§į‰‡éžå¸¸æŽĨčŋ‘įš„čƒŒæ™¯äŧšé™äŊŽå‡†įĄŽæ€§ - å°č¯•äŊŋį”¨æ›´æĩ…æˆ–æ›´æˇąįš„čƒŒæ™¯åšļį•™å‡ē更多įŠē间。", - "problem1": "æœĒæŖ€æĩ‹åˆ°į…§į‰‡ → å°†åŽšåˇŽåĸžåŠ åˆ° 30-50", - "problem2": "č¯¯æŖ€æĩ‹å¤Ē多 → 将最小éĸ᧝åĸžåŠ åˆ° 15,000-20,000", - "problem3": "誁å‰Ēå¤Ēį´§ → å°†čžšæĄ†å¤§å°åĸžåŠ åˆ° 5-10", - "problem4": "å€žæ–œįš„į…§į‰‡æœĒįŸĢæ­Ŗ → 将角åēĻ阈å€ŧ降äŊŽåˆ° ~5°", - "problem5": "ၰ尘/å™ĒåŖ°æĄ† → 将最小čŊŽåģ“éĸ᧝åĸžåŠ åˆ° 1000-2000", - "quickFixes": "åŋĢ速äŋŽå¤", - "setupTips": "莞įŊŽæį¤ē", - "tip1": "äŊŋį”¨įŽ€å•įš„æĩ…č‰˛čƒŒæ™¯", - "tip2": "åœ¨į…§į‰‡äš‹é—´į•™å‡ē小间隙(≈1 åŽ˜įąŗ)", - "tip3": "äģĨ 300-600 DPI æ‰Ģ描", - "tip4": "清洁æ‰Ģ描äģĒįŽģį’ƒ", - "title": "į…§į‰‡åˆ†å‰˛å™¨", - "useCase1": "一æŦĄæ‰Ģ描整ä¸Ēį›¸å†ŒéĄĩéĸ", - "useCase2": "å°†åšŗæŋ扚æŦĄæ‹†åˆ†ä¸ē单į‹Ŧįš„æ–‡äģļ", - "useCase3": "将æ‹ŧč´´į”ģ拆分ä¸ē单į‹Ŧįš„į…§į‰‡", - "useCase4": "äģŽæ–‡æĄŖä¸­æå–ᅧቇ", - "whatThisDoes": "功čƒŊč¯´æ˜Ž", - "whatThisDoesDesc": "č‡Ē动æŸĨ扞åšļäģŽæ‰Ģ描éĄĩéĸ或合成回像中提取每åŧ į…§į‰‡ - æ— éœ€æ‰‹åŠ¨čŖå‰Ē。", - "whenToUse": "äŊ•æ—ļäŊŋᔍ" + "failed": "Add attachments operation failed" } }, - "unsavedChanges": "æ‚¨įš„ PDF 有æœĒäŋå­˜įš„æ›´æ”šã€‚æ‚¨æƒŗåšäģ€äšˆ?", - "unsavedChangesTitle": "æœĒäŋå­˜įš„æ›´æ”š" -} \ No newline at end of file + "termsAndConditions": "æĄæŦžä¸ŽæĄäģļ", + "logOut": "退å‡ēį™ģåŊ•", + "addAttachments": { + "error": { + "failed": "An error occurred while adding attachments to the PDF." + } + }, + "autoRename": { + "description": "This tool will automatically rename PDF files based on their content. It analyzes the document to find the most suitable title from the text." + }, + "customPosition": "Custom Position", + "details": "Details", + "downloadUnavailable": "Download unavailable for this item", + "invalidUndoData": "Cannot undo: invalid operation data", + "margin": { + "large": "Large", + "medium": "Medium", + "small": "Small", + "xLarge": "Extra Large" + }, + "noFilesToUndo": "Cannot undo: no files were processed in the last operation", + "noOperationToUndo": "No operation to undo", + "noValidFiles": "No valid files to process", + "operationCancelled": "Operation cancelled", + "pageEdit": { + "deselectAll": "Select None", + "selectAll": "Select All" + }, + "quickPosition": "Quick Position", + "reorganizePages": { + "error": { + "failed": "Failed to reorganize pages" + }, + "results": { + "title": "Pages Reorganized" + }, + "settings": { + "title": "Settings" + }, + "submit": "Reorganize Pages" + }, + "replace-color": { + "options": { + "fill": "Fill colour", + "gradient": "Gradient" + }, + "previewOverlayOpacity": "Preview overlay opacity", + "previewOverlayTransparency": "Preview overlay transparency", + "previewOverlayVisibility": "Show preview overlay", + "selectText": { + "1": "æ›ŋæĸ或反čŊŦéĸœč‰˛é€‰éĄš", + "2": "éģ˜čޤīŧˆéģ˜čޤéĢ˜å¯šæ¯”åēĻéĸœč‰˛īŧ‰", + "3": "厚åˆļ(厚åˆļįš„éĸœč‰˛)", + "4": "全反čŊŦīŧˆåčŊŦ所有éĸœč‰˛īŧ‰", + "5": "éĢ˜å¯šæ¯”åēĻéĸœč‰˛é€‰éĄš", + "6": "éģ‘åē•į™Ŋ字", + "7": "į™Ŋåē•éģ‘å­—", + "8": "éģ‘åē•éģ„å­—", + "9": "éģ‘åē•įģŋ字", + "10": "选拊文æœŦéĸœč‰˛", + "11": "é€‰æ‹ŠčƒŒæ™¯éĸœč‰˛", + "12": "Choose start colour", + "13": "Choose end colour" + }, + "submit": "取äģŖ", + "title": "æ›ŋæĸ-反čŊŦ-éĸœč‰˛", + "header": "æ›ŋæĸ-反čŊŦ PDF éĸœč‰˛" + }, + "size": "Size", + "submit": "Submit", + "success": "Success", + "tools": { + "noSearchResults": "No tools found", + "noTools": "No tools available" + }, + "undoDataMismatch": "Cannot undo: operation data is corrupted", + "undoFailed": "Failed to undo operation", + "undoQuotaError": "Cannot undo: insufficient storage space", + "undoStorageError": "Undo completed but some files could not be saved to storage", + "undoSuccess": "Operation undone successfully", + "unsupported": "Unsupported", + "onboarding": { + "welcomeModal": { + "title": "Welcome to Stirling PDF!", + "description": "Would you like to take a quick 1-minute tour to learn the key features and how to get started?", + "helpHint": "You can always access this tour later from the Help button in the bottom left.", + "startTour": "Start Tour", + "maybeLater": "Maybe Later", + "dontShowAgain": "Don't Show Again" + }, + "allTools": "This is the All Tools panel, where you can browse and select from all available PDF tools.", + "selectCropTool": "Let's select the Crop tool to demonstrate how to use one of the tools.", + "toolInterface": "This is the Crop tool interface. As you can see, there's not much there because we haven't added any PDF files to work with yet.", + "filesButton": "The Files button on the Quick Access bar allows you to upload PDFs to use the tools on.", + "fileSources": "You can upload new files or access recent files from here. For the tour, we'll just use a sample file.", + "workbench": "This is the Workbench - the main area where you view and edit your PDFs.", + "viewSwitcher": "Use these controls to select how you want to view your PDFs.", + "viewer": "The Viewer lets you read and annotate your PDFs.", + "pageEditor": "The Page Editor allows you to do various operations on the pages within your PDFs, such as reordering, rotating and deleting.", + "activeFiles": "The Active Files view shows all of the PDFs you have loaded into the tool, and allows you to select which ones to process.", + "fileCheckbox": "Clicking one of the files selects it for processing. You can select multiple files for batch operations.", + "selectControls": "The Right Rail contains buttons to quickly select/deselect all of your active PDFs, along with buttons to change the app's theme or language.", + "cropSettings": "Now that we've selected the file we want crop, we can configure the Crop tool to choose the area that we want to crop the PDF to.", + "runButton": "Once the tool has been configured, this button allows you to run the tool on all the selected PDFs.", + "results": "After the tool has finished running, the Review step will show a preview of the results in this panel, and allow you to undo the operation or download the file. ", + "fileReplacement": "The modified file will replace the original file in the Workbench automatically, allowing you to easily run it through more tools.", + "pinButton": "You can use the Pin button if you'd rather your files stay active after running tools on them.", + "wrapUp": "You're all set! You've learnt about the main areas of the app and how to use them. Click the Help button whenever you like to see this tour again.", + "previous": "Previous", + "next": "Next", + "finish": "Finish", + "startTour": "Start Tour", + "startTourDescription": "Take a guided tour of Stirling PDF's key features" + }, + "workspace": { + "title": "Workspace", + "people": { + "title": "People", + "description": "Manage workspace members and their permissions", + "loading": "Loading people...", + "searchMembers": "Search members...", + "addMembers": "Add Members", + "inviteMembers": { + "label": "Invite Members", + "subtitle": "Type or paste in emails below, separated by commas. Your workspace will be billed by members." + }, + "user": "User", + "role": "Role", + "team": "Team", + "status": "Status", + "actions": "Actions", + "noMembersFound": "No members found", + "active": "Active", + "disabled": "Disabled", + "activeSession": "Active session", + "member": "Member", + "admin": "Admin", + "roleDescriptions": { + "admin": "Can manage settings and invite members, with full administrative access.", + "member": "Can view and edit shared files, but cannot manage workspace settings or members." + }, + "editRole": "Edit Role", + "enable": "Enable", + "disable": "Disable", + "deleteUser": "Delete User", + "deleteUserSuccess": "User deleted successfully", + "deleteUserError": "Failed to delete user", + "confirmDelete": "Are you sure you want to delete this user? This action cannot be undone.", + "addMember": { + "title": "Add Member", + "username": "Username (Email)", + "usernamePlaceholder": "user@example.com", + "password": "Password", + "passwordPlaceholder": "Enter password", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "forcePasswordChange": "Force password change on first login", + "cancel": "Cancel", + "submit": "Add Member", + "usernameRequired": "Username and password are required", + "passwordTooShort": "Password must be at least 6 characters", + "success": "User created successfully", + "error": "Failed to create user" + }, + "editMember": { + "title": "Edit Member", + "editing": "Editing:", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "cancel": "Cancel", + "submit": "Update Member", + "success": "User updated successfully", + "error": "Failed to update user" + }, + "toggleEnabled": { + "success": "User status updated successfully", + "error": "Failed to update user status" + }, + "delete": { + "success": "User deleted successfully", + "error": "Failed to delete user" + }, + "emailInvite": { + "tab": "Email Invite", + "description": "Type or paste in emails below, separated by commas. Users will receive login credentials via email.", + "emails": "Email Addresses", + "emailsPlaceholder": "user1@example.com, user2@example.com", + "emailsRequired": "At least one email address is required", + "submit": "Send Invites", + "success": "user(s) invited successfully", + "partialSuccess": "Some invites failed", + "allFailed": "Failed to invite users", + "error": "Failed to send invites" + }, + "directInvite": { + "tab": "Direct Create" + }, + "inviteLinkTab": { + "tab": "Invite Link" + }, + "inviteLink": { + "description": "Generate a secure link that allows the user to set their own password", + "email": "Email Address", + "emailPlaceholder": "user@example.com (optional)", + "emailDescription": "Optional - leave blank for a general invite link that can be used by anyone", + "emailRequired": "Email address is required", + "emailOptional": "Optional - leave blank for a general invite link", + "emailRequiredForSend": "Email address is required to send email notification", + "expiryHours": "Expiry Hours", + "expiryDescription": "How many hours until the link expires", + "sendEmail": "Send invite link via email", + "sendEmailDescription": "If enabled, the invite link will be sent to the specified email address", + "smtpRequired": "SMTP not configured", + "generate": "Generate Link", + "generated": "Invite Link Generated", + "copied": "Link copied to clipboard", + "success": "Invite link generated successfully", + "successWithEmail": "Invite link generated and sent via email", + "emailFailed": "Invite link generated, but email failed", + "emailFailedDetails": "Error: {0}. Please share the invite link manually.", + "error": "Failed to generate invite link", + "submit": "Generate Invite Link" + }, + "inviteMode": { + "username": "Username", + "email": "Email", + "link": "Link", + "emailDisabled": "Email invites require SMTP configuration and mail.enableInvites=true in settings" + }, + "license": { + "users": "users", + "availableSlots": "Available Slots", + "grandfathered": "Grandfathered", + "grandfatheredShort": "{{count}} grandfathered", + "fromLicense": "from license", + "slotsAvailable": "{{count}} user slot(s) available", + "noSlotsAvailable": "No slots available", + "currentUsage": "Currently using {{current}} of {{max}} user licences" + } + }, + "teams": { + "title": "Teams", + "description": "Manage teams and organize workspace members", + "loading": "Loading teams...", + "loadingDetails": "Loading team details...", + "createNewTeam": "Create New Team", + "teamName": "Team Name", + "totalMembers": "Total Members", + "actions": "Actions", + "noTeamsFound": "No teams found", + "noMembers": "No members in this team", + "system": "System", + "addMember": "Add Member", + "viewTeam": "View Team", + "removeMember": "Remove from team", + "cannotRemoveFromSystemTeam": "Cannot remove from system team", + "renameTeamLabel": "Rename Team", + "deleteTeamLabel": "Delete Team", + "cannotDeleteInternal": "Cannot delete the Internal team", + "confirmDelete": "Are you sure you want to delete this team? This team must be empty to delete.", + "confirmRemove": "Remove user from this team?", + "cannotRenameInternal": "Cannot rename the Internal team", + "cannotAddToInternal": "Cannot add members to the Internal team", + "teamNotFound": "Team not found", + "backToTeams": "Back to Teams", + "memberCount": "{{count}} members", + "removeMemberSuccess": "User removed from team", + "removeMemberError": "Failed to remove user from team", + "createTeam": { + "title": "Create New Team", + "teamName": "Team Name", + "teamNamePlaceholder": "Enter team name", + "cancel": "Cancel", + "submit": "Create Team", + "nameRequired": "Team name is required", + "success": "Team created successfully", + "error": "Failed to create team" + }, + "renameTeam": { + "title": "Rename Team", + "renaming": "Renaming:", + "newTeamName": "New Team Name", + "newTeamNamePlaceholder": "Enter new team name", + "cancel": "Cancel", + "submit": "Rename Team", + "nameRequired": "Team name is required", + "success": "Team renamed successfully", + "error": "Failed to rename team" + }, + "deleteTeam": { + "success": "Team deleted successfully", + "error": "Failed to delete team. Make sure the team is empty.", + "teamMustBeEmpty": "Team must be empty before deletion" + }, + "addMemberToTeam": { + "title": "Add Member to Team", + "addingTo": "Adding to", + "selectUser": "Select User", + "selectUserPlaceholder": "Choose a user", + "selectUserRequired": "Please select a user", + "currentlyIn": "currently in", + "willBeMoved": "Note: This user will be moved from their current team to this team.", + "cancel": "Cancel", + "submit": "Add Member", + "userRequired": "Please select a user", + "success": "Member added to team successfully", + "error": "Failed to add member to team" + }, + "changeTeam": { + "label": "Change Team", + "title": "Change Team", + "changing": "Moving", + "selectTeam": "Select Team", + "selectTeamPlaceholder": "Choose a team", + "selectTeamRequired": "Please select a team", + "success": "Team changed successfully", + "error": "Failed to change team", + "submit": "Change Team" + } + } + }, + "plan": { + "currency": "Currency", + "popular": "Popular", + "current": "Current Plan", + "upgrade": "Upgrade", + "contact": "Contact Us", + "customPricing": "Custom", + "showComparison": "Compare All Features", + "hideComparison": "Hide Feature Comparison", + "featureComparison": "Feature Comparison", + "activePlan": { + "title": "Active Plan", + "subtitle": "Your current subscription details" + }, + "availablePlans": { + "title": "Available Plans", + "subtitle": "Choose the plan that fits your needs" + }, + "static": { + "title": "Billing Information", + "message": "Online billing is not currently configured. To upgrade your plan or manage subscriptions, please contact us directly.", + "contactSales": "Contact Sales", + "contactToUpgrade": "Contact us to upgrade or customize your plan", + "maxUsers": "Max Users", + "upTo": "Up to" + }, + "period": { + "month": "month" + }, + "free": { + "name": "Free", + "highlight1": "Limited Tool Usage Per week", + "highlight2": "Access to all tools", + "highlight3": "Community support" + }, + "pro": { + "name": "Pro", + "highlight1": "Unlimited Tool Usage", + "highlight2": "Advanced PDF tools", + "highlight3": "No watermarks" + }, + "enterprise": { + "name": "Enterprise", + "highlight1": "Custom pricing", + "highlight2": "Dedicated support", + "highlight3": "Latest features" + }, + "feature": { + "title": "Feature", + "pdfTools": "Basic PDF Tools", + "fileSize": "File Size Limit", + "automation": "Automate tool workflows", + "api": "API Access", + "priority": "Priority Support", + "customPricing": "Custom Pricing" + } + }, + "subscription": { + "status": { + "active": "Active", + "pastDue": "Past Due", + "canceled": "Canceled", + "incomplete": "Incomplete", + "trialing": "Trial", + "none": "No Subscription" + }, + "renewsOn": "Renews on {{date}}", + "cancelsOn": "Cancels on {{date}}" + }, + "billing": { + "manageBilling": "Manage Billing", + "portal": { + "error": "Failed to open billing portal" + } + }, + "payment": { + "preparing": "Preparing your checkout...", + "upgradeTitle": "Upgrade to {{planName}}", + "success": "Payment Successful!", + "successMessage": "Your subscription has been activated successfully. You will receive a confirmation email shortly.", + "autoClose": "This window will close automatically...", + "error": "Payment Error" + }, + "firstLogin": { + "title": "First Time Login", + "welcomeTitle": "Welcome!", + "welcomeMessage": "For security reasons, you must change your password on your first login.", + "loggedInAs": "Logged in as", + "error": "Error", + "currentPassword": "Current Password", + "enterCurrentPassword": "Enter your current password", + "newPassword": "New Password", + "enterNewPassword": "Enter new password (min 8 characters)", + "confirmPassword": "Confirm New Password", + "reEnterNewPassword": "Re-enter new password", + "changePassword": "Change Password", + "allFieldsRequired": "All fields are required", + "passwordsDoNotMatch": "New passwords do not match", + "passwordTooShort": "Password must be at least 8 characters", + "passwordMustBeDifferent": "New password must be different from current password", + "passwordChangedSuccess": "Password changed successfully! Please log in again.", + "passwordChangeFailed": "Failed to change password. Please check your current password." + }, + "invite": { + "welcome": "Welcome to Stirling PDF", + "invalidToken": "Invalid invitation link", + "validationError": "Failed to validate invitation link", + "passwordRequired": "Password is required", + "passwordTooShort": "Password must be at least 6 characters", + "passwordMismatch": "Passwords do not match", + "acceptError": "Failed to create account", + "validating": "Validating invitation...", + "invalidInvitation": "Invalid Invitation", + "goToLogin": "Go to Login", + "welcomeTitle": "You've been invited!", + "welcomeSubtitle": "Complete your account setup to get started", + "accountFor": "Creating account for", + "linkExpires": "Link expires", + "email": "Email address", + "emailPlaceholder": "Enter your email address", + "emailRequired": "Email address is required", + "invalidEmail": "Invalid email address", + "choosePassword": "Choose a password", + "passwordPlaceholder": "Enter your password", + "confirmPassword": "Confirm password", + "confirmPasswordPlaceholder": "Re-enter your password", + "createAccount": "Create Account", + "creating": "Creating Account...", + "alreadyHaveAccount": "Already have an account?", + "signIn": "Sign in" + }, + "audit": { + "error": { + "title": "Error loading audit system" + }, + "notAvailable": "Audit system not available", + "notAvailableMessage": "The audit system is not configured or not available.", + "disabled": "Audit logging is disabled", + "disabledMessage": "Enable audit logging in your application configuration to track system events.", + "systemStatus": { + "title": "System Status", + "status": "Audit Logging", + "enabled": "Enabled", + "disabled": "Disabled", + "level": "Audit Level", + "retention": "Retention Period", + "days": "days", + "totalEvents": "Total Events" + }, + "tabs": { + "dashboard": "Dashboard", + "events": "Audit Events", + "export": "Export" + }, + "charts": { + "title": "Audit Dashboard", + "error": "Error loading charts", + "day": "Day", + "week": "Week", + "month": "Month", + "byType": "Events by Type", + "byUser": "Events by User", + "overTime": "Events Over Time" + }, + "events": { + "title": "Audit Events", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "error": "Error loading events", + "noEvents": "No events found", + "timestamp": "Timestamp", + "type": "Type", + "user": "User", + "ipAddress": "IP Address", + "actions": "Actions", + "viewDetails": "View Details", + "eventDetails": "Event Details", + "details": "Details" + }, + "export": { + "title": "Export Audit Data", + "description": "Export audit events to CSV or JSON format. Use filters to limit the exported data.", + "format": "Export Format", + "filters": "Filters (Optional)", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "exportButton": "Export Data", + "error": "Failed to export data" + } + }, + "usage": { + "noData": "No data available", + "error": "Error loading usage statistics", + "noDataMessage": "No usage statistics are currently available.", + "controls": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All", + "refresh": "Refresh", + "dataTypeLabel": "Data Type:", + "dataType": { + "all": "All", + "api": "API", + "ui": "UI" + } + }, + "showing": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All" + }, + "stats": { + "totalEndpoints": "Total Endpoints", + "totalVisits": "Total Visits", + "showing": "Showing", + "selectedVisits": "Selected Visits" + }, + "chart": { + "title": "Endpoint Usage Chart" + }, + "table": { + "title": "Detailed Statistics", + "endpoint": "Endpoint", + "visits": "Visits", + "percentage": "Percentage", + "noData": "No data available" + } + }, + "backendHealth": { + "checking": "Checking backend status...", + "online": "Backend Online", + "offline": "Backend Offline" + }, + "replaceColorPdf": { + "tags": "更æĸéĸœč‰˛īŧŒéĄĩéĸ操äŊœīŧŒåŽį̝īŧŒæœåŠĄå™¨į̝" + } +} diff --git a/frontend/public/locales/zh-TW/translation.json b/frontend/public/locales/zh-TW/translation.json index c27acf642..4a3a7cf01 100644 --- a/frontend/public/locales/zh-TW/translation.json +++ b/frontend/public/locales/zh-TW/translation.json @@ -1,4 +1,40 @@ { + "toolPanel": { + "modePrompt": { + "title": "Choose how you browse tools", + "description": "Preview both layouts and decide how you want to explore Stirling PDF tools.", + "sidebarTitle": "Sidebar mode", + "sidebarDescription": "Keep tools alongside your workspace for quick switching.", + "recommended": "Recommended", + "chooseSidebar": "Use sidebar mode", + "fullscreenTitle": "Fullscreen mode - (legacy)", + "fullscreenDescription": "Browse every tool in a catalogue that covers the workspace until you pick one.", + "chooseFullscreen": "Use fullscreen mode", + "dismiss": "Maybe later" + }, + "fullscreen": { + "showDetails": "Show Details", + "comingSoon": "Coming soon:", + "favorite": "Add to favourites", + "favorites": "Favourites", + "heading": "All tools (fullscreen view)", + "noResults": "Try adjusting your search or toggle descriptions to find what you need.", + "recommended": "Recommended", + "unfavorite": "Remove from favourites" + }, + "placeholder": "Choose a tool to get started", + "toggle": { + "fullscreen": "Switch to fullscreen mode", + "sidebar": "Switch to sidebar mode" + } + }, + "unsavedChanges": "You have unsaved changes to your PDF.", + "areYouSure": "Are you sure you want to leave?", + "unsavedChangesTitle": "Unsaved Changes", + "keepWorking": "Keep Working", + "discardChanges": "Discard & Leave", + "applyAndContinue": "Save & Leave", + "exportAndContinue": "Export & Continue", "language": { "direction": "ltr" }, @@ -18,8 +54,26 @@ "customTextDesc": "č‡Ēč¨‚æ–‡å­—", "numberPagesDesc": "čĻįˇ¨č™Ÿįš„é éĸīŧŒé č¨­į‚ē '全部'īŧŒäšŸå¯äŊŋᔍ 1-5 或 2,5,9 į­‰æ ŧåŧ", "customNumberDesc": "預設į‚ē {n}īŧŒäšŸæŽĨ受 '頁éĸ {n} å…ą {total}'īŧŒ'文字-{n}'īŧŒ'{filename}-{n}'", - "submit": "新åĸžé įĸŧ" + "submit": "新åĸžé įĸŧ", + "configuration": "Configuration", + "customize": "Customize Appearance", + "pagesAndStarting": "Pages & Starting Number", + "positionAndPages": "Position & Pages", + "error": { + "failed": "Add page numbers operation failed" + }, + "results": { + "title": "Page Number Results" + }, + "preview": "Position Selection", + "previewDisclaimer": "Preview is approximate. Final output may vary due to PDF font metrics." }, + "pageSelectionPrompt": "č‡Ē訂頁éĸ選擇īŧˆčŧ¸å…ĨäģĨé€—č™Ÿåˆ†éš”įš„é įĸŧ 1、5、6 或 2n+1 į­‰å‡Ŋåŧįš„æ¸…å–Žīŧ‰īŧš", + "startingNumberTooltip": "The first number to display. Subsequent pages will increment from this number.", + "marginTooltip": "Distance between the page number and the edge of the page.", + "fontSizeTooltip": "Size of the page number text in points. Larger numbers create bigger text.", + "fontTypeTooltip": "Font family for the page numbers. Choose based on your document style.", + "customTextTooltip": "Optional custom format for page numbers. Use {n} as placeholder for the number. Example: \"Page {n}\" will show \"Page 1\", \"Page 2\", etc.", "pdfPrompt": "選擇 PDF æĒ”æĄˆ", "multiPdfPrompt": "選擇多個 PDF æĒ”æĄˆ", "multiPdfDropPrompt": "選擇īŧˆæˆ–拖攞īŧ‰æ‰€æœ‰éœ€čĻįš„ PDF æĒ”æĄˆ", @@ -30,15 +84,41 @@ "uploadLimitExceededPlural": "å¤Ēå¤§ã€‚å…č¨ąįš„æœ€å¤§æĒ”æĄˆå¤§å°į‚ē", "processTimeWarning": "č­Ļ告īŧšæ­¤éŽį¨‹å¯čƒŊé•ˇé”ä¸€åˆ†é˜īŧŒå…ˇéĢ”å–æąēæ–ŧæĒ”æĄˆå¤§å°", "pageOrderPrompt": "č‡Ē訂頁éĸ順åēīŧˆčŧ¸å…ĨäģĨé€—č™Ÿåˆ†éš”įš„é įĸŧ或å‡ŊåŧīŧŒåĻ‚ 2n+1īŧ‰īŧš", - "pageSelectionPrompt": "č‡Ē訂頁éĸ選擇īŧˆčŧ¸å…ĨäģĨé€—č™Ÿåˆ†éš”įš„é įĸŧ 1、5、6 或 2n+1 į­‰å‡Ŋåŧįš„æ¸…å–Žīŧ‰īŧš", "goToPage": "前垀", "true": "是", "false": "åĻ", "unknown": "æœĒįŸĨ", + "app": { + "description": "The Free Adobe Acrobat alternative (10M+ Downloads)" + }, "save": "å„˛å­˜", "saveToBrowser": "å„˛å­˜åˆ°į€čĻŊ器", + "download": "下čŧ‰", + "pin": "Pin File (keep active after tool run)", + "unpin": "Unpin File (replace after tool run)", + "undoOperationTooltip": "Click to undo the last operation and restore the original files", + "undo": "æ’¤éŠˇ", + "moreOptions": "More Options", + "editYourNewFiles": "Edit your new file(s)", "close": "關閉", + "openInViewer": "Open in Viewer", + "confirmClose": "Confirm Close", + "confirmCloseMessage": "Are you sure you want to close this file?", + "confirmCloseCancel": "Cancel", + "confirmCloseConfirm": "Close File", + "fileSelected": "Selected: {{filename}}", + "chooseFile": "Choose File", "filesSelected": "åˇ˛é¸æ“‡įš„æĒ”æĄˆ", + "files": { + "title": "Files", + "upload": "Upload", + "uploadFiles": "Upload Files", + "addFiles": "Add files", + "selectFromWorkbench": "Select files from the workbench or ", + "selectMultipleFromWorkbench": "Select at least {{count}} files from the workbench or ", + "created": "Created", + "size": "File Size" + }, "noFavourites": "é‚„æ˛’æœ‰åŠŸčƒŊčĸĢæ”ļ藏", "downloadComplete": "下čŧ‰åŽŒæˆ", "bored": "į­‰åž…æ™‚čĻēåž—į„ĄčŠīŧŸ", @@ -56,7 +136,10 @@ }, "error": { "pdfPassword": "PDF æĒ”æĄˆåˇ˛åŠ å¯†īŧŒäŊ†æœĒ提䞛密įĸŧ或密įĸŧä¸æ­Ŗįĸē", + "encryptedPdfMustRemovePassword": "This PDF is encrypted or password-protected. Please unlock it before converting to PDF/A.", + "incorrectPasswordProvided": "The PDF password is incorrect or not provided.", "_value": "錯čǤ", + "dismissAllErrors": "Dismiss All Errors", "sorry": "åžˆæŠąæ­‰é€ æˆæ‚¨įš„å›°æ“žīŧ", "needHelp": "需čĻå”åŠŠæˆ–į™ŧįžå•éĄŒīŧŸ", "contactTip": "åĻ‚æžœæ‚¨äģį„ļé‡åˆ°å•éĄŒīŧŒčĢ‹ä¸čρįŒļčąĢīŧŒéš¨æ™‚å‘æˆ‘å€‘å°‹æą‚å”åŠŠã€‚æ‚¨å¯äģĨåœ¨æˆ‘å€‘įš„ GitHub 頁éĸå›žå ąå•éĄŒīŧŒæˆ–透過 Discord čˇŸæˆ‘å€‘č¯įĩĄīŧš", @@ -71,6 +154,10 @@ "githubSubmit": "GitHub - å›žå ąå•éĄŒ", "discordSubmit": "Discord - į™ŧčĄ¨æ”¯æ´æ–‡įĢ " }, + "warning": { + "tooltipTitle": "Warning" + }, + "edit": "Edit", "delete": "åˆĒ除", "username": "äŊŋį”¨č€…åį¨ą", "password": "密įĸŧ", @@ -82,6 +169,7 @@ "green": "įļ č‰˛", "blue": "藍色", "custom": "č‡Ē訂...", + "comingSoon": "Coming soon", "WorkInProgess": "åˇĨäŊœæ­Ŗåœ¨é€˛čĄŒä¸­īŧŒå¯čƒŊį„Ąæŗ•åˇĨäŊœæˆ–æœ‰å•éĄŒīŧŒčĢ‹å ąå‘ŠäģģäŊ•å•éĄŒīŧ", "poweredBy": "Powered by", "yes": "是", @@ -115,12 +203,14 @@ "page": "頁éĸ", "pages": "頁éĸ", "loading": "čŧ‰å…Ĩ中...", + "review": "Review", "addToDoc": "新åĸžč‡ŗæ–‡äģļ", "reset": "重設", "apply": "åĨ—ᔍ", "noFileSelected": "æœĒ選擇æĒ”æĄˆīŧŒčĢ‹ä¸Šå‚ŗä¸€å€‹ã€‚", "legal": { "privacy": "éšąį§æŦŠæ”ŋį­–", + "iAgreeToThe": "I agree to all of the", "terms": "äŊŋᔍæĸæŦž", "accessibility": "į„Ąéšœį¤™æ€§č˛æ˜Ž", "cookie": "Cookie æ”ŋį­–", @@ -160,6 +250,7 @@ "title": "æ‚¨æƒŗå”åŠŠæ”šå–„ Stirling PDF 嗎īŧŸ", "paragraph1": "Stirling PDF æœ‰é¸æ“‡æ€§įš„åˆ†æžåŠŸčƒŊīŧŒå¯åšĢåŠŠæˆ‘å€‘æ”šé€˛į”ĸ品。我們不會čŋŊ蚤äģģäŊ•個äēēčŗ‡č¨Šæˆ–æĒ”æĄˆå…§åŽšã€‚", "paragraph2": "čĢ‹č€ƒæ…Žå•Ÿį”¨åˆ†æžåŠŸčƒŊīŧŒäģĨ協劊 Stirling-PDF æˆé•ˇä¸ĻčŽ“æˆ‘å€‘æ›´äē†č§ŖäŊŋį”¨č€…éœ€æą‚ã€‚", + "learnMore": "Learn more", "enable": "å•Ÿį”¨åˆ†æžåŠŸčƒŊ", "disable": "åœį”¨åˆ†æžåŠŸčƒŊ", "settings": "您可äģĨ在 config/settings.yml æĒ”æĄˆä¸­čŽŠæ›´åˆ†æžåŠŸčƒŊįš„č¨­åŽš" @@ -203,6 +294,54 @@ "cacheInputs": { "name": "å„˛å­˜čĄ¨å–Žčŧ¸å…Ĩ", "help": "å•Ÿį”¨æ­¤åŠŸčƒŊäģĨå„˛å­˜å…ˆå‰äŊŋį”¨įš„čŧ¸å…ĨīŧŒäģĨäžŋæ—Ĩ垌äŊŋᔍ" + }, + "general": { + "title": "General", + "description": "Configure general application preferences.", + "account": "Account", + "accountDescription": "Manage your account settings", + "user": "User", + "signedInAs": "Signed in as", + "logout": "Log out", + "enableFeatures": { + "title": "For System Administrators", + "intro": "Enable user authentication, team management, and workspace features for your organization.", + "action": "Configure", + "and": "and", + "benefit": "Enables user roles, team collaboration, admin controls, and enterprise features.", + "learnMore": "Learn more in documentation", + "dismiss": "Dismiss" + }, + "autoUnzip": "Auto-unzip API responses", + "autoUnzipDescription": "Automatically extract files from ZIP responses", + "autoUnzipTooltip": "Automatically extract ZIP files returned from API operations. Disable to keep ZIP files intact. This does not affect automation workflows.", + "autoUnzipFileLimit": "Auto-unzip file limit", + "autoUnzipFileLimitDescription": "Maximum number of files to extract from ZIP", + "autoUnzipFileLimitTooltip": "Only unzip if the ZIP contains this many files or fewer. Set higher to extract larger ZIPs.", + "defaultToolPickerMode": "Default tool picker mode", + "defaultToolPickerModeDescription": "Choose whether the tool picker opens in fullscreen or sidebar by default", + "mode": { + "fullscreen": "Fullscreen", + "sidebar": "Sidebar" + } + }, + "hotkeys": { + "title": "Keyboard Shortcuts", + "description": "Hover a tool to see its shortcut or customise it below. Click \"Change shortcut\" and press a new key combination. Press Esc to cancel.", + "errorModifier": { + "mac": "Include ⌘ (Command), âŒĨ (Option), or another modifier in your shortcut.", + "windows": "Include Ctrl, Alt, or another modifier in your shortcut." + }, + "errorConflict": "Shortcut already used by {{tool}}.", + "none": "Not assigned", + "customBadge": "Custom", + "defaultLabel": "Default: {{shortcut}}", + "capturing": "Press keysâ€Ļ (Esc to cancel)", + "change": "Change shortcut", + "reset": "Reset", + "shortcut": "Shortcut", + "noShortcut": "No shortcut set", + "searchPlaceholder": "Search tools..." } }, "changeCreds": { @@ -274,8 +413,10 @@ "top20": "前 20 名", "all": "全部", "refresh": "é‡æ–°æ•´į†", - "includeHomepage": "包åĢéϖ頁 ('/')", - "includeLoginPage": "包åĢį™ģå…Ĩ頁éĸ ('/login')", + "dataTypeLabel": "Data Type:", + "dataTypeAll": "All", + "dataTypeApi": "API", + "dataTypeUi": "UI", "totalEndpoints": "į̝éģžį¸Ŋ數", "totalVisits": "į¸Ŋ造č¨ĒæŦĄæ•¸", "showing": "éĄ¯į¤ē中", @@ -290,7 +431,9 @@ "top": "前", "numberOfVisits": "造č¨ĒæŦĄæ•¸", "visitsTooltip": "造č¨ĒæŦĄæ•¸īŧš{0}īŧˆį¸Ŋæ•¸įš„ {1}%īŧ‰", - "retry": "重čŠĻ" + "retry": "重čŠĻ", + "includeHomepage": "包åĢéϖ頁 ('/')", + "includeLoginPage": "包åĢį™ģå…Ĩ頁éĸ ('/login')" }, "database": { "title": "čŗ‡æ–™åēĢ匯å…Ĩ/匯å‡ē", @@ -331,22 +474,310 @@ "alphabetical": "æŒ‰į…§å­—æ¯æŽ’åē", "globalPopularity": "į†ąé–€į¨‹åēĻ", "sortBy": "排åēæ–šåŧīŧš", + "mobile": { + "brandAlt": "Stirling PDF logo", + "openFiles": "Open files", + "swipeHint": "Swipe left or right to switch views", + "tools": "Tools", + "toolsSlide": "Tool selection panel", + "viewSwitcher": "Switch workspace view", + "workbenchSlide": "Workspace panel", + "workspace": "Workspace" + }, "multiTool": { + "tags": "multiple,tools", "title": "PDF č¤‡åˆåˇĨå…ˇ", "desc": "合äŊĩ、旋čŊ‰ã€é‡æ–°æŽ’列和į§ģ除頁éĸ" }, "merge": { + "tags": "combine,join,unite", "title": "合äŊĩ", "desc": "čŧ•éŦ†å°‡å¤šå€‹ PDF 合äŊĩį‚ē一個。" }, "split": { + "tags": "divide,separate,break", "title": "åˆ†å‰˛", "desc": "將 PDF åˆ†å‰˛į‚ē多個文äģļ" }, "rotate": { + "tags": "turn,flip,orient", "title": "旋čŊ‰", "desc": "čŧ•éŦ†æ—‹čŊ‰æ‚¨įš„ PDF。" }, + "convert": { + "tags": "transform,change", + "title": "čŊ‰æ›", + "desc": "Convert files between different formats" + }, + "pdfOrganiser": { + "tags": "organize,rearrange,reorder", + "title": "æ•´į†", + "desc": "äģĨäģģäŊ•é †åēį§ģ除/重新排列頁éĸ" + }, + "addImage": { + "tags": "insert,embed,place", + "title": "新åĸžåœ–ቇ", + "desc": "在 PDF įš„æŒ‡åŽšäŊįŊŽæ–°åĸžåœ–ቇ" + }, + "addAttachments": { + "tags": "embed,attach,include", + "title": "Add Attachments", + "desc": "Add or remove embedded files (attachments) to/from a PDF" + }, + "watermark": { + "tags": "stamp,mark,overlay", + "title": "新åĸžæĩŽæ°´å°", + "desc": "åœ¨æ‚¨įš„ PDF æĒ”æĄˆä¸­æ–°åĸžč‡Ē訂æĩŽæ°´å°ã€‚" + }, + "removePassword": { + "tags": "unlock", + "title": "į§ģ除密įĸŧ", + "desc": "åžžæ‚¨įš„ PDF æĒ”æĄˆä¸­į§ģ除密įĸŧäŋč­ˇã€‚" + }, + "compress": { + "tags": "shrink,reduce,optimize", + "title": "åŖ“į¸Ž", + "desc": "åŖ“į¸Ž PDF äģĨ減少å…ļæĒ”æĄˆå¤§å°ã€‚" + }, + "unlockPDFForms": { + "tags": "unlock,enable,edit", + "title": "č§ŖéŽ– PDF čĄ¨å–Ž", + "desc": "į§ģ除 PDF 文äģļä¸­čĄ¨å–ŽæŦ„äŊįš„å”¯čŽ€åąŦ性" + }, + "changeMetadata": { + "tags": "edit,modify,update", + "title": "čŽŠæ›´ä¸­įšŧčŗ‡æ–™", + "desc": "åžž PDF æĒ”æĄˆä¸­čŽŠæ›´/į§ģ除/新åĸžä¸­įšŧčŗ‡æ–™" + }, + "ocr": { + "tags": "extract,scan", + "title": "OCR / æ¸…į†æŽƒæ", + "desc": "æ¸…į†æŽƒæä¸Ļåžž PDF ä¸­įš„åŊąåƒä¸­åĩæ¸Ŧ文字ä¸Ļ重新新åĸžį‚ē文字。" + }, + "extractImages": { + "tags": "pull,save,export", + "title": "æå–åœ–į‰‡", + "desc": "åžž PDF ä¸­æå–æ‰€æœ‰åœ–į‰‡ä¸Ļå°‡åŽƒå€‘å„˛å­˜åˆ°åŖ“į¸ŽæĒ”中" + }, + "scannerImageSplit": { + "tags": "detect,split,photos", + "title": "Detect & Split Scanned Photos", + "desc": "Detect and split scanned photos into separate pages" + }, + "sign": { + "tags": "signature,autograph", + "title": "į°ŊįĢ ", + "desc": "透過įšĒ圖、文字或åŊąåƒæ–°åĸžį°Ŋį̠到 PDF" + }, + "flatten": { + "tags": "simplify,remove,interactive", + "title": "åšŗåĻ化", + "desc": "åžž PDF 中į§ģ除所有äē’å‹•å…ƒį´ å’ŒčĄ¨å–Ž" + }, + "certSign": { + "tags": "authenticate,PEM,P12,official,encrypt,sign,certificate,PKCS12,JKS,server,manual,auto", + "title": "äŊŋį”¨æ†‘č­‰į°ŊįĢ ", + "desc": "äŊŋį”¨æ†‘č­‰/金鑰īŧˆPEM/P12īŧ‰į°ŊįĢ  PDF" + }, + "repair": { + "tags": "fix,restore", + "title": "äŋŽåžŠ", + "desc": "嘗čŠĻäŋŽåžŠæåŖž/į ´æįš„ PDF" + }, + "removeBlanks": { + "tags": "delete,clean,empty", + "title": "į§ģ除įŠēį™Ŋ頁éĸ", + "desc": "åĩæ¸Ŧä¸Ļåžžæ–‡äģļ中į§ģ除įŠēį™Ŋ頁éĸ" + }, + "removeAnnotations": { + "tags": "delete,clean,strip", + "title": "į§ģ除č¨ģ釋", + "desc": "åžž PDF 中į§ģ除所有č¨ģ釋/č¨ģč§Ŗ" + }, + "compare": { + "tags": "difference", + "title": "比čŧƒ", + "desc": "比čŧƒä¸ĻéĄ¯į¤ē 2 個 PDF æĒ”æĄˆįš„åˇŽį•°" + }, + "removeCertSign": { + "tags": "remove,delete,unlock", + "title": "į§ģ除į°ŊįĢ ", + "desc": "åžž PDF į§ģ除į°ŊįĢ " + }, + "pageLayout": { + "tags": "layout,arrange,combine", + "title": "多頁éĸį‰ˆéĸ配įŊŽ", + "desc": "將 PDF æĒ”æĄˆįš„å¤šå€‹é éĸ合äŊĩ到喎一頁éĸ" + }, + "bookletImposition": { + "tags": "booklet,print,binding", + "title": "Booklet Imposition", + "desc": "Create booklets with proper page ordering and multi-page layout for printing and binding" + }, + "scalePages": { + "tags": "resize,adjust,scale", + "title": "čĒŋ整頁éĸ大小/比䞋", + "desc": "äŋŽæ”šé éĸ及å…ļå…§åŽšįš„å¤§å°/比䞋。" + }, + "addPageNumbers": { + "tags": "number,pagination,count", + "title": "新åĸžé įĸŧ", + "desc": "在文äģļįš„č¨­åŽšäŊįŊŽæ–°åĸžé įĸŧ" + }, + "autoRename": { + "tags": "auto-detect,header-based,organize,relabel", + "title": "Auto Rename PDF File", + "desc": "Auto renames a PDF file based on its detected header" + }, + "adjustContrast": { + "tags": "contrast,brightness,saturation", + "title": "čĒŋæ•´éĄč‰˛/對比åēĻ", + "desc": "čĒŋ整 PDF įš„å°æ¯”åēĻ、éŖŊ和åēĻ和äēŽåēĻ" + }, + "crop": { + "tags": "trim,cut,resize", + "title": "誁å‰Ē PDF", + "desc": "誁å‰Ē PDF äģĨ減少å…ļ大小īŧˆäŋæŒæ–‡å­—īŧīŧ‰" + }, + "autoSplitPDF": { + "tags": "auto,split,QR", + "title": "č‡Ēå‹•åˆ†å‰˛é éĸ", + "desc": "č‡Ēå‹•åˆ†å‰˛æŽƒæįš„ PDFīŧŒäŊŋᔍå¯ĻéĢ”æŽƒæé éĸåˆ†å‰˛å™¨ QR Code" + }, + "sanitize": { + "tags": "clean,purge,remove", + "title": "Sanitise", + "desc": "Remove potentially harmful elements from PDF files" + }, + "getPdfInfo": { + "tags": "info,metadata,details", + "title": "取垗 PDF įš„æ‰€æœ‰čŗ‡č¨Š", + "desc": "取垗 PDF įš„æ‰€æœ‰å¯čƒŊčŗ‡č¨Š" + }, + "pdfToSinglePage": { + "tags": "combine,merge,single", + "title": "PDF čŊ‰å–Žä¸€å¤§é éĸ", + "desc": "將所有 PDF 頁éĸ合äŊĩį‚ēä¸€å€‹å¤§įš„å–Žä¸€é éĸ" + }, + "showJS": { + "tags": "javascript,code,script", + "title": "éĄ¯į¤ē JavaScript", + "desc": "搜尋ä¸ĻéĄ¯į¤ēåĩŒå…Ĩ PDF ä¸­įš„äģģäŊ• JSīŧˆJavaScriptīŧ‰" + }, + "redact": { + "tags": "censor,blackout,hide", + "title": "æ‰‹å‹•åĄ—éģ‘", + "desc": "äžæ“šé¸å–įš„æ–‡å­—ã€įšĒčŖŊįš„åŊĸį‹€å’Œé¸å–įš„é éĸåĄ—éģ‘ PDF" + }, + "splitBySections": { + "tags": "split,sections,divide", + "title": "Split PDF by Sections", + "desc": "Divide each page of a PDF into smaller horizontal and vertical sections" + }, + "addStamp": { + "tags": "stamp,mark,seal", + "title": "Add Stamp to PDF", + "desc": "Add text or add image stamps at set locations" + }, + "removeImage": { + "tags": "remove,delete,clean", + "title": "į§ģé™¤åœ–į‰‡", + "desc": "åžž PDF 中į§ģé™¤åœ–į‰‡äģĨ減少æĒ”æĄˆå¤§å°" + }, + "splitByChapters": { + "tags": "split,chapters,structure", + "title": "䞝įĢ į¯€åˆ†å‰˛ PDF", + "desc": "栚據 PDF įš„į̠ᝀįĩæ§‹å°‡å…ļåˆ†å‰˛æˆå¤šå€‹æĒ”æĄˆã€‚" + }, + "validateSignature": { + "tags": "validate,verify,certificate", + "title": "驗證 PDF į°ŊįĢ ", + "desc": "驗證 PDF 文äģļä¸­įš„æ•¸äŊį°ŊįĢ čˆ‡æ†‘č­‰" + }, + "swagger": { + "tags": "API,documentation,test", + "title": "API Documentation", + "desc": "View API documentation and test endpoints" + }, + "scannerEffect": { + "tags": "scan,simulate,create", + "title": "Scanner Effect", + "desc": "Create a PDF that looks like it was scanned" + }, + "editTableOfContents": { + "tags": "bookmarks,contents,edit", + "title": "ᎍčŧ¯į›ŽéŒ„", + "desc": "在 PDF 文äģļ中新åĸžæˆ–ᎍčŧ¯æ›¸įą¤å’Œį›ŽéŒ„" + }, + "manageCertificates": { + "tags": "certificates,import,export", + "title": "Manage Certificates", + "desc": "Import, export, or delete digital certificate files used for signing PDFs." + }, + "read": { + "tags": "view,open,display", + "title": "Read", + "desc": "View and annotate PDFs. Highlight text, draw, or insert comments for review and collaboration." + }, + "reorganizePages": { + "tags": "rearrange,reorder,organize", + "title": "Reorganize Pages", + "desc": "Rearrange, duplicate, or delete PDF pages with visual drag-and-drop control." + }, + "extractPages": { + "tags": "pull,select,copy", + "title": "提取頁éĸ", + "desc": "Extract specific pages from a PDF document" + }, + "removePages": { + "tags": "delete,extract,exclude", + "title": "į§ģ除", + "desc": "åžžæ‚¨įš„ PDF æĒ”æĄˆä¸­åˆĒ除不需čĻįš„é éĸ。" + }, + "autoSizeSplitPDF": { + "tags": "auto,split,size", + "title": "栚據大小/數量č‡Ēå‹•åˆ†å‰˛", + "desc": "栚據大小、頁數或文äģļæ•¸å°‡å–Žä¸€ PDF åˆ†å‰˛į‚ē多個文äģļ" + }, + "replaceColor": { + "title": "Replace & Invert Colour", + "desc": "Replace or invert colours in PDF documents" + }, + "devApi": { + "tags": "API,development,documentation", + "title": "API", + "desc": "Link to API documentation" + }, + "devFolderScanning": { + "tags": "automation,folder,scanning", + "title": "Automated Folder Scanning", + "desc": "Link to automated folder scanning guide" + }, + "devSsoGuide": { + "title": "SSO Guide", + "desc": "Link to SSO guide" + }, + "devAirgapped": { + "title": "Air-gapped Setup", + "desc": "Link to air-gapped setup guide" + }, + "addPassword": { + "title": "新åĸžå¯†įĸŧ", + "desc": "ᔍ坆įĸŧåŠ å¯†æ‚¨įš„ PDF æĒ”æĄˆã€‚" + }, + "changePermissions": { + "title": "čŽŠæ›´æŦŠé™", + "desc": "Change document restrictions and permissions" + }, + "automate": { + "tags": "workflow,sequence,automation", + "title": "Automate", + "desc": "Build multi-step workflows by chaining together PDF actions. Ideal for recurring tasks." + }, + "overlay-pdfs": { + "desc": "將 PDF čĻ†č“‹åœ¨åĻ一個 PDF 上", + "title": "čφ蓋 PDF" + }, "imageToPDF": { "title": "åœ–į‰‡čŊ‰ PDF", "desc": "å°‡åœ–į‰‡īŧˆPNG、JPEG、GIFīŧ‰čŊ‰æ›į‚ē PDF。" @@ -355,18 +786,6 @@ "title": "PDF čŊ‰åœ–ቇ", "desc": "將 PDF čŊ‰æ›į‚ēåœ–į‰‡ã€‚īŧˆPNG、JPEG、GIFīŧ‰" }, - "pdfOrganiser": { - "title": "æ•´į†", - "desc": "äģĨäģģäŊ•é †åēį§ģ除/重新排列頁éĸ" - }, - "addImage": { - "title": "新åĸžåœ–ቇ", - "desc": "在 PDF įš„æŒ‡åŽšäŊįŊŽæ–°åĸžåœ–ቇ" - }, - "watermark": { - "title": "新åĸžæĩŽæ°´å°", - "desc": "åœ¨æ‚¨įš„ PDF æĒ”æĄˆä¸­æ–°åĸžč‡Ē訂æĩŽæ°´å°ã€‚" - }, "permissions": { "title": "äŋŽæ”šæŦŠé™", "desc": "äŋŽæ”šæ‚¨įš„ PDF æĒ”æĄˆæŦŠé™" @@ -375,38 +794,10 @@ "title": "į§ģ除", "desc": "åžžæ‚¨įš„ PDF æĒ”æĄˆä¸­åˆĒ除不需čĻįš„é éĸ。" }, - "addPassword": { - "title": "新åĸžå¯†įĸŧ", - "desc": "ᔍ坆įĸŧåŠ å¯†æ‚¨įš„ PDF æĒ”æĄˆã€‚" - }, - "removePassword": { - "title": "į§ģ除密įĸŧ", - "desc": "åžžæ‚¨įš„ PDF æĒ”æĄˆä¸­į§ģ除密įĸŧäŋč­ˇã€‚" - }, - "compress": { - "title": "åŖ“į¸Ž", - "desc": "åŖ“į¸Ž PDF äģĨ減少å…ļæĒ”æĄˆå¤§å°ã€‚" - }, - "unlockPDFForms": { - "title": "č§ŖéŽ– PDF čĄ¨å–Ž", - "desc": "į§ģ除 PDF 文äģļä¸­čĄ¨å–ŽæŦ„äŊįš„å”¯čŽ€åąŦ性" - }, - "changeMetadata": { - "title": "čŽŠæ›´ä¸­įšŧčŗ‡æ–™", - "desc": "åžž PDF æĒ”æĄˆä¸­čŽŠæ›´/į§ģ除/新åĸžä¸­įšŧčŗ‡æ–™" - }, "fileToPDF": { "title": "æĒ”æĄˆčŊ‰ PDF", "desc": "將嚞䚎所有æ ŧåŧčŊ‰æ›į‚ē PDFīŧˆDOCX、PNG、XLS、PPT、TXT ᭉᭉīŧ‰" }, - "ocr": { - "title": "OCR / æ¸…į†æŽƒæ", - "desc": "æ¸…į†æŽƒæä¸Ļåžž PDF ä¸­įš„åŊąåƒä¸­åĩæ¸Ŧ文字ä¸Ļ重新新åĸžį‚ē文字。" - }, - "extractImages": { - "title": "æå–åœ–į‰‡", - "desc": "åžž PDF ä¸­æå–æ‰€æœ‰åœ–į‰‡ä¸Ļå°‡åŽƒå€‘å„˛å­˜åˆ°åŖ“į¸ŽæĒ”中" - }, "pdfToPDFA": { "title": "PDF čŊ‰ PDF/A", "desc": "將 PDF čŊ‰æ›į‚ēé•ˇæœŸå„˛å­˜įš„ PDF/A" @@ -435,70 +826,14 @@ "title": "åĩæ¸Ŧ/åˆ†å‰˛æŽƒæį…§į‰‡", "desc": "åžžį…§į‰‡/PDF ä¸­åˆ†å‰˛å¤šåŧĩᅧቇ" }, - "sign": { - "title": "į°ŊįĢ ", - "desc": "透過įšĒ圖、文字或åŊąåƒæ–°åĸžį°Ŋį̠到 PDF" - }, - "flatten": { - "title": "åšŗåĻ化", - "desc": "åžž PDF 中į§ģ除所有äē’å‹•å…ƒį´ å’ŒčĄ¨å–Ž" - }, - "repair": { - "title": "äŋŽåžŠ", - "desc": "嘗čŠĻäŋŽåžŠæåŖž/į ´æįš„ PDF" - }, - "removeBlanks": { - "title": "į§ģ除įŠēį™Ŋ頁éĸ", - "desc": "åĩæ¸Ŧä¸Ļåžžæ–‡äģļ中į§ģ除įŠēį™Ŋ頁éĸ" - }, - "removeAnnotations": { - "title": "į§ģ除č¨ģ釋", - "desc": "åžž PDF 中į§ģ除所有č¨ģ釋/č¨ģč§Ŗ" - }, - "compare": { - "title": "比čŧƒ", - "desc": "比čŧƒä¸ĻéĄ¯į¤ē 2 個 PDF æĒ”æĄˆįš„åˇŽį•°" - }, - "certSign": { - "title": "äŊŋį”¨æ†‘č­‰į°ŊįĢ ", - "desc": "äŊŋį”¨æ†‘č­‰/金鑰īŧˆPEM/P12īŧ‰į°ŊįĢ  PDF" - }, - "removeCertSign": { - "title": "į§ģ除į°ŊįĢ ", - "desc": "åžž PDF į§ģ除į°ŊįĢ " - }, - "pageLayout": { - "title": "多頁éĸį‰ˆéĸ配įŊŽ", - "desc": "將 PDF æĒ”æĄˆįš„å¤šå€‹é éĸ合äŊĩ到喎一頁éĸ" - }, - "scalePages": { - "title": "čĒŋ整頁éĸ大小/比䞋", - "desc": "äŋŽæ”šé éĸ及å…ļå…§åŽšįš„å¤§å°/比䞋。" - }, "pipeline": { "title": "įŽĄé“īŧˆé€˛éšŽīŧ‰", "desc": "é€éŽåŽšįžŠįŽĄé“æŒ‡äģ¤įĸŧ在 PDF ä¸ŠåŸˇčĄŒå¤šå€‹æ“äŊœ" }, - "addPageNumbers": { - "title": "新åĸžé įĸŧ", - "desc": "在文äģļįš„č¨­åŽšäŊįŊŽæ–°åĸžé įĸŧ" - }, "auto-rename": { "title": "č‡Ē動重新å‘Ŋ名 PDF æĒ”æĄˆ", "desc": "栚據å…ļåĩæ¸Ŧåˆ°įš„æ¨™é ­č‡Ē動重新å‘Ŋ名 PDF æĒ”æĄˆ" }, - "adjustContrast": { - "title": "čĒŋæ•´éĄč‰˛/對比åēĻ", - "desc": "čĒŋ整 PDF įš„å°æ¯”åēĻ、éŖŊ和åēĻ和äēŽåēĻ" - }, - "crop": { - "title": "誁å‰Ē PDF", - "desc": "誁å‰Ē PDF äģĨ減少å…ļ大小īŧˆäŋæŒæ–‡å­—īŧīŧ‰" - }, - "autoSplitPDF": { - "title": "č‡Ēå‹•åˆ†å‰˛é éĸ", - "desc": "č‡Ēå‹•åˆ†å‰˛æŽƒæįš„ PDFīŧŒäŊŋᔍå¯ĻéĢ”æŽƒæé éĸåˆ†å‰˛å™¨ QR Code" - }, "sanitizePDF": { "title": "æ¸…į†", "desc": "åžž PDF æĒ”æĄˆä¸­į§ģ除指äģ¤įĸŧ和å…ļäģ–å…ƒį´ " @@ -519,30 +854,14 @@ "title": "PDF čŊ‰ Markdown", "desc": "將äģģäŊ• PDF čŊ‰æ›į‚ē Markdown æĒ”æĄˆ" }, - "getPdfInfo": { - "title": "取垗 PDF įš„æ‰€æœ‰čŗ‡č¨Š", - "desc": "取垗 PDF įš„æ‰€æœ‰å¯čƒŊčŗ‡č¨Š" - }, "pageExtracter": { "title": "提取多個頁éĸ", "desc": "åžž PDF ä¸­æå–é¸åŽšįš„é éĸ" }, - "pdfToSinglePage": { - "title": "PDF čŊ‰å–Žä¸€å¤§é éĸ", - "desc": "將所有 PDF 頁éĸ合äŊĩį‚ēä¸€å€‹å¤§įš„å–Žä¸€é éĸ" - }, - "showJS": { - "title": "éĄ¯į¤ē JavaScript", - "desc": "搜尋ä¸ĻéĄ¯į¤ēåĩŒå…Ĩ PDF ä¸­įš„äģģäŊ• JSīŧˆJavaScriptīŧ‰" - }, "autoRedact": { "title": "č‡Ēå‹•åĄ—éģ‘", "desc": "栚據čŧ¸å…Ĩįš„æ–‡å­—č‡Ēå‹•åĄ—éģ‘ PDF ä¸­įš„æ–‡å­—" }, - "redact": { - "title": "æ‰‹å‹•åĄ—éģ‘", - "desc": "äžæ“šé¸å–įš„æ–‡å­—ã€įšĒčŖŊįš„åŊĸį‹€å’Œé¸å–įš„é éĸåĄ—éģ‘ PDF" - }, "PDFToCSV": { "title": "PDF čŊ‰ CSV", "desc": "åžž PDF ä¸­æå–čĄ¨æ ŧä¸Ļ將å…ļčŊ‰æ›į‚ē CSV" @@ -551,10 +870,6 @@ "title": "栚據大小/數量č‡Ēå‹•åˆ†å‰˛", "desc": "栚據大小、頁數或文äģļæ•¸å°‡å–Žä¸€ PDF åˆ†å‰˛į‚ē多個文äģļ" }, - "overlay-pdfs": { - "title": "čφ蓋 PDF", - "desc": "將 PDF čĻ†č“‹åœ¨åĻ一個 PDF 上" - }, "split-by-sections": { "title": "䞝區æŽĩåˆ†å‰˛ PDF", "desc": "將 PDF įš„æ¯ä¸€é åˆ†å‰˛į‚ēčŧƒå°įš„æ°´åšŗå’Œåž‚į›´å€æŽĩ" @@ -563,48 +878,18 @@ "title": "將圖įĢ æ–°åĸžåˆ° PDF", "desc": "åœ¨č¨­åŽšäŊįŊŽæ–°åĸžæ–‡å­—或新åĸžåŊąåƒåœ–įĢ " }, - "removeImage": { - "title": "į§ģé™¤åœ–į‰‡", - "desc": "åžž PDF 中į§ģé™¤åœ–į‰‡äģĨ減少æĒ”æĄˆå¤§å°" - }, - "splitByChapters": { - "title": "䞝įĢ į¯€åˆ†å‰˛ PDF", - "desc": "栚據 PDF įš„į̠ᝀįĩæ§‹å°‡å…ļåˆ†å‰˛æˆå¤šå€‹æĒ”æĄˆã€‚" - }, - "validateSignature": { - "title": "驗證 PDF į°ŊįĢ ", - "desc": "驗證 PDF 文äģļä¸­įš„æ•¸äŊį°ŊįĢ čˆ‡æ†‘č­‰" - }, "replace-color": { "title": "取äģŖčˆ‡åčŊ‰éĄč‰˛", "desc": "取äģŖ PDF ä¸­æ–‡å­—å’ŒčƒŒæ™¯įš„éĄč‰˛īŧŒä¸Ļ反čŊ‰æ•´å€‹ PDF įš„éĄč‰˛äģĨ減少æĒ”æĄˆå¤§å°" }, - "convert": { - "title": "čŊ‰æ›" - }, "attachments": { "title": "新åĸžé™„äģļ", "desc": "將æĒ”æĄˆīŧˆé™„äģļīŧ‰æ–°åĸžæˆ–į§ģ除臺/åžž PDF" }, - "editTableOfContents": { - "title": "ᎍčŧ¯į›ŽéŒ„", - "desc": "在 PDF 文äģļ中新åĸžæˆ–ᎍčŧ¯æ›¸įą¤å’Œį›ŽéŒ„" - }, - "extractPages": { - "title": "提取頁éĸ" - }, - "removePages": { - "title": "į§ģ除", - "desc": "åžžæ‚¨įš„ PDF æĒ”æĄˆä¸­åˆĒ除不需čĻįš„é éĸ。" - }, "removeImagePdf": { "title": "į§ģé™¤åœ–į‰‡", "desc": "åžž PDF 中į§ģé™¤åœ–į‰‡äģĨ減少æĒ”æĄˆå¤§å°" }, - "autoSizeSplitPDF": { - "title": "栚據大小/數量č‡Ēå‹•åˆ†å‰˛", - "desc": "栚據大小、頁數或文äģļæ•¸å°‡å–Žä¸€ PDF åˆ†å‰˛į‚ē多個文äģļ" - }, "adjust-contrast": { "title": "čĒŋæ•´éĄč‰˛/對比", "desc": "čĒŋ整 PDF įš„å°æ¯”ã€éŖŊ和åēĻ和äēŽåēĻ" @@ -612,11 +897,12 @@ "replaceColorPdf": { "title": "取äģŖčˆ‡åčŊ‰éĄč‰˛", "desc": "取äģŖ PDF ä¸­æ–‡å­—å’ŒčƒŒæ™¯įš„éĄč‰˛īŧŒä¸Ļ反čŊ‰æ•´å€‹ PDF įš„éĄč‰˛äģĨ減少æĒ”æĄˆå¤§å°" - }, - "changePermissions": { - "title": "čŽŠæ›´æŦŠé™" } }, + "landing": { + "addFiles": "Add Files", + "uploadFromComputer": "Upload from computer" + }, "viewPdf": { "tags": "æĒĸčĻ–,閱讀,č¨ģ釋,文字,åœ–į‰‡", "title": "æĒĸčĻ–/ᎍčŧ¯ PDF", @@ -650,17 +936,39 @@ "merge": { "tags": "合äŊĩ,頁éĸ操äŊœ,垌į̝,äŧ翜å™¨į̝", "title": "合äŊĩ", + "removeDigitalSignature": { + "label": "Remove digital signature in the merged file?", + "tooltip": { + "title": "Remove Digital Signature", + "description": "Digital signatures will be invalidated when merging files. Check this to remove them from the final merged PDF." + } + }, + "generateTableOfContents": { + "label": "Generate table of contents in the merged file?", + "tooltip": { + "title": "Generate Table of Contents", + "description": "Automatically creates a clickable table of contents in the merged PDF based on the original file names and page numbers." + } + }, + "submit": "合äŊĩ", + "sortBy": { + "description": "Files will be merged in the order they're selected. Drag to reorder or sort below.", + "label": "Sort By", + "filename": "æĒ”æĄˆåį¨ą", + "dateModified": "Date Modified", + "ascending": "Ascending", + "descending": "Descending", + "sort": "Sort" + }, + "error": { + "failed": "An error occurred while merging the PDFs." + }, "header": "合äŊĩ多個 PDF", "sortByName": "äžåį¨ąæŽ’åē", "sortByDate": "䞝æ—Ĩ期排åē", - "removeCertSign": "是åĻį§ģ除合äŊĩ垌æĒ”æĄˆįš„æ†‘č­‰į°ŊįĢ īŧŸ", - "submit": "合äŊĩ", - "sortBy": { - "filename": "æĒ”æĄˆåį¨ą" - } + "removeCertSign": "是åĻį§ģ除合äŊĩ垌æĒ”æĄˆįš„æ†‘č­‰į°ŊįĢ īŧŸ" }, "split": { - "tags": "頁éĸ操äŊœ,劃分,多頁,å‰Ē下,äŧ翜å™¨į̝", "title": "åˆ†å‰˛ PDF", "header": "åˆ†å‰˛ PDF", "desc": { @@ -676,25 +984,249 @@ "splitPages": "čŧ¸å…ĨčĻåˆ†å‰˛įš„é éĸīŧš", "submit": "åˆ†å‰˛", "steps": { + "chooseMethod": "Choose Method", "settings": "č¨­åŽš" }, + "settings": { + "selectMethodFirst": "Please select a split method first" + }, + "error": { + "failed": "An error occurred while splitting the PDF." + }, + "method": { + "label": "Choose split method", + "placeholder": "Select how to split the PDF" + }, "methods": { + "prefix": { + "splitAt": "Split at", + "splitBy": "Split by" + }, + "byPages": { + "name": "Page Numbers", + "desc": "Extract specific pages (1,3,5-10)", + "tooltip": "Enter page numbers separated by commas or ranges with hyphens" + }, + "bySections": { + "name": "Sections", + "desc": "Divide pages into grid sections", + "tooltip": "Split each page into horizontal and vertical sections" + }, "bySize": { - "name": "æĒ”æĄˆå¤§å°" + "name": "æĒ”æĄˆå¤§å°", + "desc": "Limit maximum file size", + "tooltip": "Specify maximum file size (e.g. 10MB, 500KB)" + }, + "byPageCount": { + "name": "Page Count", + "desc": "Fixed pages per file", + "tooltip": "Enter the number of pages for each split file" + }, + "byDocCount": { + "name": "Document Count", + "desc": "Create specific number of files", + "tooltip": "Enter how many files you want to create" + }, + "byChapters": { + "name": "Chapters", + "desc": "Split at bookmark boundaries", + "tooltip": "Uses PDF bookmarks to determine split points" + }, + "byPageDivider": { + "name": "Page Divider", + "desc": "Auto-split with divider sheets", + "tooltip": "Use QR code divider sheets between documents when scanning" } }, "value": { "fileSize": { - "label": "æĒ”æĄˆå¤§å°" + "label": "æĒ”æĄˆå¤§å°", + "placeholder": "e.g. 10MB, 500KB" + }, + "pageCount": { + "label": "Pages per File", + "placeholder": "e.g. 5, 10" + }, + "docCount": { + "label": "Number of Files", + "placeholder": "e.g. 3, 5" } - } + }, + "tooltip": { + "header": { + "title": "Split Methods Overview" + }, + "byPages": { + "title": "Split at Page Numbers", + "text": "Split your PDF at specific page numbers. Using 'n' splits after page n. Using 'n-m' splits before page n and after page m.", + "bullet1": "Single split points: 3,7 (splits after pages 3 and 7)", + "bullet2": "Range split points: 3-8 (splits before page 3 and after page 8)", + "bullet3": "Mixed: 2,5-10,15 (splits after page 2, before page 5, after page 10, and after page 15)" + }, + "bySections": { + "title": "Split by Grid Sections", + "text": "Divide each page into a grid of sections. Useful for splitting documents with multiple columns or extracting specific areas.", + "bullet1": "Horizontal: Number of rows to create", + "bullet2": "Vertical: Number of columns to create", + "bullet3": "Merge: Combine all sections into one PDF" + }, + "bySize": { + "title": "Split by File Size", + "text": "Create multiple PDFs that don't exceed a specified file size. Ideal for file size limitations or email attachments.", + "bullet1": "Use MB for larger files (e.g., 10MB)", + "bullet2": "Use KB for smaller files (e.g., 500KB)", + "bullet3": "System will split at page boundaries" + }, + "byCount": { + "title": "Split by Count", + "text": "Create multiple PDFs with a specific number of pages or documents each.", + "bullet1": "Page Count: Fixed number of pages per file", + "bullet2": "Document Count: Fixed number of output files", + "bullet3": "Useful for batch processing workflows" + }, + "byChapters": { + "title": "Split by Chapters", + "text": "Use PDF bookmarks to automatically split at chapter boundaries. Requires PDFs with bookmark structure.", + "bullet1": "Bookmark Level: Which level to split on (1=top level)", + "bullet2": "Include Metadata: Preserve document properties", + "bullet3": "Allow Duplicates: Handle repeated bookmark names" + }, + "byDocCount": { + "bullet1": "Enter the number of output files you want", + "bullet2": "Pages are distributed as evenly as possible", + "bullet3": "Useful when you need a specific number of files", + "text": "Create a specific number of output files by evenly distributing pages across them.", + "title": "Split by Document Count" + }, + "byPageCount": { + "bullet1": "Enter the number of pages per output file", + "bullet2": "Last file may have fewer pages if not evenly divisible", + "bullet3": "Useful for batch processing workflows", + "text": "Create multiple PDFs with a specific number of pages each. Perfect for creating uniform document chunks.", + "title": "Split by Page Count" + }, + "byPageDivider": { + "bullet1": "Print divider sheets from the download link", + "bullet2": "Insert divider sheets between your documents", + "bullet3": "Scan all documents together as one PDF", + "bullet4": "Upload - divider pages are automatically detected and removed", + "bullet5": "Enable Duplex Mode if scanning both sides of divider sheets", + "text": "Automatically split scanned documents using physical divider sheets with QR codes. Perfect for processing multiple documents scanned together.", + "title": "Split by Page Divider" + } + }, + "methodSelection": { + "tooltip": { + "bullet1": "Click on a method card to select it", + "bullet2": "Hover over each card to see a quick description", + "bullet3": "The settings step will appear after you select a method", + "bullet4": "You can change methods at any time before processing", + "header": { + "text": "Choose how you want to split your PDF document. Each method is optimized for different use cases and document types.", + "title": "Split Method Selection" + }, + "title": "Choose Your Split Method" + } + }, + "selectMethod": "Select a split method", + "tags": "頁éĸ操äŊœ,劃分,多頁,å‰Ē下,äŧ翜å™¨į̝" }, "rotate": { - "tags": "äŧ翜å™¨į̝", "title": "旋čŊ‰ PDF", + "submit": "旋čŊ‰", + "selectRotation": "Select Rotation Angle (Clockwise)", + "error": { + "failed": "An error occurred while rotating the PDF." + }, + "preview": { + "title": "Rotation Preview" + }, + "rotateLeft": "Rotate Anticlockwise", + "rotateRight": "Rotate Clockwise", + "tooltip": { + "header": { + "title": "Rotate Settings Overview" + }, + "description": { + "text": "Rotate your PDF pages clockwise or anticlockwise in 90-degree increments. All pages in the PDF will be rotated. The preview shows how your document will look after rotation." + }, + "controls": { + "title": "Controls", + "text": "Use the rotation buttons to adjust orientation. Left button rotates anticlockwise, right button rotates clockwise. Each click rotates by 90 degrees." + } + }, + "tags": "äŧ翜å™¨į̝", "header": "旋čŊ‰ PDF", - "selectAngle": "選擇旋čŊ‰č§’åēĻīŧˆäģĨ 90 åēĻįš„å€æ•¸īŧ‰īŧš", - "submit": "旋čŊ‰" + "selectAngle": "選擇旋čŊ‰č§’åēĻīŧˆäģĨ 90 åēĻįš„å€æ•¸īŧ‰īŧš" + }, + "convert": { + "title": "čŊ‰æ›", + "desc": "Convert files between different formats", + "files": "Files", + "selectFilesPlaceholder": "Select files in the main view to get started", + "settings": "č¨­åŽš", + "conversionCompleted": "Conversion completed", + "results": "Results", + "defaultFilename": "converted_file", + "conversionResults": "Conversion Results", + "convertFrom": "Convert from", + "convertTo": "Convert to", + "sourceFormatPlaceholder": "Source format", + "targetFormatPlaceholder": "Target format", + "selectSourceFormatFirst": "Select a source format first", + "outputOptions": "Output Options", + "pdfOptions": "PDF Options", + "imageOptions": "Image Options", + "colorType": "Colour Type", + "color": "顏色", + "greyscale": "ၰåēĻ", + "blackwhite": "Black & White", + "dpi": "DPI", + "output": "Output", + "single": "Single", + "multiple": "Multiple", + "fitOption": "Fit Option", + "maintainAspectRatio": "Maintain Aspect Ratio", + "fitDocumentToPage": "Fit Document to Page", + "fillPage": "åĄĢ充頁éĸ", + "autoRotate": "Auto Rotate", + "autoRotateDescription": "Automatically rotate images to better fit the PDF page", + "combineImages": "Combine Images", + "combineImagesDescription": "Combine all images into one PDF, or create separate PDFs for each image", + "webOptions": "Web to PDF Options", + "zoomLevel": "Zoom Level", + "emailOptions": "Email to PDF Options", + "includeAttachments": "Include email attachments", + "maxAttachmentSize": "Maximum attachment size (MB)", + "includeAllRecipients": "Include CC and BCC recipients in header", + "downloadHtml": "Download HTML intermediate file instead of PDF", + "pdfaOptions": "PDF/A Options", + "outputFormat": "Output Format", + "pdfaNote": "PDF/A-1b is more compatible, PDF/A-2b supports more features.", + "pdfaDigitalSignatureWarning": "芲 PDF įš„æ†‘č­‰į°ŊįĢ å°‡æœƒåœ¨ä¸‹ä¸€æ­ĨčĸĢį§ģ除", + "fileFormat": "File Format", + "wordDoc": "Word Document", + "wordDocExt": "Word Document (.docx)", + "odtExt": "OpenDocument Text (.odt)", + "pptExt": "PowerPoint (.pptx)", + "odpExt": "OpenDocument Presentation (.odp)", + "txtExt": "Plain Text (.txt)", + "rtfExt": "Rich Text Format (.rtf)", + "selectedFiles": "Selected files", + "noFileSelected": "No file selected. Use the file panel to add files.", + "convertFiles": "Convert Files", + "converting": "Converting...", + "downloadConverted": "Download Converted File", + "errorNoFiles": "Please select at least one file to convert.", + "errorNoFormat": "Please select both source and target formats.", + "errorNotSupported": "Conversion from {{from}} to {{to}} is not supported.", + "images": "Images", + "officeDocs": "Office Documents (Word, Excel, PowerPoint)", + "imagesExt": "Images (JPG, PNG, etc.)", + "markdown": "Markdown", + "textRtf": "Text/RTF", + "grayscale": "ၰåēĻ", + "errorConversion": "An error occurred while converting the file." }, "imageToPdf": { "tags": "čŊ‰æ›,img,jpg,åœ–į‰‡,ᅧቇ" @@ -732,7 +1264,33 @@ "8": "åˆĒ除最垌一頁", "9": "åˆĒ除įŦŦ一頁和最垌一頁", "10": "åĨ‡åļ合äŊĩ", - "11": "複čŖŊ所有頁éĸ" + "11": "複čŖŊ所有頁éĸ", + "desc": { + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, â€Ļ).", + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, â€Ļ).", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimized for binding on the side)." + } + }, + "desc": { + "CUSTOM": "Use a custom sequence of page numbers or expressions to define a new order.", + "REVERSE_ORDER": "Flip the document so the last page becomes first and so on.", + "DUPLEX_SORT": "Interleave fronts then backs as if a duplex scanner scanned all fronts, then all backs (1, n, 2, n-1, â€Ļ).", + "BOOKLET_SORT": "Arrange pages for booklet printing (last, first, second, second last, â€Ļ).", + "SIDE_STITCH_BOOKLET_SORT": "Arrange pages for side‑stitch booklet printing (optimised for binding on the side).", + "ODD_EVEN_SPLIT": "Split the document into two outputs: all odd pages and all even pages.", + "ODD_EVEN_MERGE": "Merge two PDFs by alternating pages: odd from the first, even from the second.", + "DUPLICATE": "Duplicate each page according to the custom order count (e.g., 4 duplicates each page 4×).", + "REMOVE_FIRST": "Remove the first page from the document.", + "REMOVE_LAST": "Remove the last page from the document.", + "REMOVE_FIRST_AND_LAST": "Remove both the first and last pages from the document." }, "placeholder": "īŧˆäž‹åĻ‚ 1,3,2 或 4-8,2,10-12 或 2n-1īŧ‰" }, @@ -744,9 +1302,198 @@ "upload": "新åĸžåœ–ቇ", "submit": "新åĸžåœ–ቇ" }, + "attachments": { + "tags": "åĩŒå…Ĩ,附äģļ,æĒ”æĄˆ,附加,附äģļįŽĄį†", + "title": "新åĸžé™„äģļ", + "header": "新åĸžé™„äģļ", + "add": "Add Attachment", + "remove": "Remove Attachment", + "embed": "Embed Attachment", + "submit": "新åĸžé™„äģļ" + }, "watermark": { - "tags": "文字,重複,æ¨™įą¤,č‡Ē有,į‰ˆæŦŠ,商標,img,jpg,åœ–į‰‡,ᅧቇ", "title": "新åĸžæĩŽæ°´å°", + "desc": "Add text or image watermarks to PDF files", + "completed": "Watermark added", + "submit": "新åĸžæĩŽæ°´å°", + "filenamePrefix": "watermarked", + "error": { + "failed": "An error occurred while adding watermark to the PDF." + }, + "watermarkType": { + "text": "文字", + "image": "Image" + }, + "settings": { + "type": "Watermark Type", + "text": { + "label": "Watermark Text", + "placeholder": "Enter watermark text" + }, + "image": { + "label": "Watermark Image", + "choose": "Choose Image", + "selected": "Selected: {{filename}}" + }, + "fontSize": "字型大小", + "size": "Size", + "alphabet": "Font/Language", + "color": "Watermark Colour", + "rotation": "Rotation (degrees)", + "opacity": "Opacity (%)", + "spacing": { + "horizontal": "Horizontal Spacing", + "vertical": "Vertical Spacing", + "height": "Height Spacing", + "width": "Width Spacing" + }, + "convertToImage": "Flatten PDF pages to images" + }, + "alphabet": { + "roman": "Roman/Latin", + "arabic": "Arabic", + "japanese": "Japanese", + "korean": "Korean", + "chinese": "Chinese", + "thai": "Thai" + }, + "steps": { + "type": "Watermark Type", + "wording": "Wording", + "textStyle": "Style", + "formatting": "Formatting", + "file": "Watermark File" + }, + "results": { + "title": "Watermark Results" + }, + "tooltip": { + "language": { + "title": "Language Support", + "text": "Choose the appropriate language setting to ensure proper font rendering for your text." + }, + "appearance": { + "title": "Appearance Settings", + "text": "Control how your watermark looks and blends with the document.", + "bullet1": "Rotation: -360° to 360° for angled watermarks", + "bullet2": "Opacity: 0-100% for transparency control", + "bullet3": "Lower opacity creates subtle watermarks" + }, + "spacing": { + "title": "Spacing Control", + "text": "Adjust the spacing between repeated watermarks across the page.", + "bullet1": "Width spacing: Horizontal distance between watermarks", + "bullet2": "Height spacing: Vertical distance between watermarks", + "bullet3": "Higher values create more spread out patterns" + }, + "type": { + "header": { + "title": "Watermark Type Selection" + }, + "description": { + "title": "Choose Your Watermark", + "text": "Select between text or image watermarks based on your needs." + }, + "text": { + "title": "Text Watermarks", + "text": "Perfect for adding copyright notices, company names, or confidentiality labels. Supports multiple languages and custom colours.", + "bullet1": "Customisable fonts and languages", + "bullet2": "Adjustable colours and transparency", + "bullet3": "Ideal for legal or branding text" + }, + "image": { + "title": "Image Watermarks", + "text": "Use logos, stamps, or any image as a watermark. Great for branding and visual identification.", + "bullet1": "Upload any image format", + "bullet2": "Maintains image quality", + "bullet3": "Perfect for logos and stamps" + } + }, + "wording": { + "header": { + "title": "Text Content" + }, + "text": { + "title": "Watermark Text", + "text": "Enter the text that will appear as your watermark across the document.", + "bullet1": "Keep it concise for better readability", + "bullet2": "Common examples: 'CONFIDENTIAL', 'DRAFT', company name", + "bullet3": "Emoji characters are not supported and will be filtered out" + } + }, + "textStyle": { + "header": { + "title": "Text Style" + }, + "color": { + "title": "Colour Selection", + "text": "Choose a colour that provides good contrast with your document content.", + "bullet1": "Light grey (#d3d3d3) for subtle watermarks", + "bullet2": "Black or dark colours for high contrast", + "bullet3": "Custom colours for branding purposes" + }, + "language": { + "title": "Language Support", + "text": "Choose the appropriate language setting to ensure proper font rendering." + } + }, + "file": { + "header": { + "title": "Image Upload" + }, + "upload": { + "title": "Image Selection", + "text": "Upload an image file to use as your watermark.", + "bullet1": "Supports common formats: PNG, JPG, GIF, BMP", + "bullet2": "PNG with transparency works best", + "bullet3": "Higher resolution images maintain quality better" + }, + "recommendations": { + "title": "Best Practices", + "text": "Tips for optimal image watermark results.", + "bullet1": "Use logos or stamps with transparent backgrounds", + "bullet2": "Simple designs work better than complex images", + "bullet3": "Consider the final document size when choosing resolution" + } + }, + "formatting": { + "header": { + "title": "Formatting & Layout" + }, + "size": { + "title": "Size Control", + "text": "Adjust the size of your watermark (text or image).", + "bullet1": "Larger sizes create more prominent watermarks" + }, + "appearance": { + "title": "Appearance Settings", + "text": "Control how your watermark looks and blends with the document.", + "bullet1": "Rotation: -360° to 360° for angled watermarks", + "bullet2": "Opacity: 0-100% for transparency control", + "bullet3": "Lower opacity creates subtle watermarks" + }, + "spacing": { + "title": "Spacing Control", + "text": "Adjust the spacing between repeated watermarks across the page.", + "bullet1": "Horizontal spacing: Distance between watermarks left to right", + "bullet2": "Vertical spacing: Distance between watermarks top to bottom", + "bullet3": "Higher values create more spread out patterns" + }, + "security": { + "title": "Security Option", + "text": "Convert the final PDF to an image-based format for enhanced security.", + "bullet1": "Prevents text selection and copying", + "bullet2": "Makes watermarks harder to remove", + "bullet3": "Results in larger file sizes", + "bullet4": "Best for sensitive or copyrighted content" + } + } + }, + "type": { + "1": "文字", + "2": "åœ–į‰‡" + }, + "tags": "文字,重複,æ¨™įą¤,č‡Ē有,į‰ˆæŦŠ,商標,img,jpg,åœ–į‰‡,ᅧቇ", "header": "新åĸžæĩŽæ°´å°", "customColor": "č‡Ēč¨‚æ–‡å­—éĄč‰˛", "selectText": { @@ -760,17 +1507,6 @@ "8": "æĩŽæ°´å°éĄžåž‹īŧš", "9": "æĩŽæ°´å°åŊąåƒīŧš", "10": "將 PDF čŊ‰æ›į‚ē PDF åŊąåƒ" - }, - "submit": "新åĸžæĩŽæ°´å°", - "type": { - "1": "文字", - "2": "åœ–į‰‡" - }, - "watermarkType": { - "text": "文字" - }, - "settings": { - "fontSize": "字型大小" } }, "permissions": { @@ -795,50 +1531,201 @@ "removePages": { "tags": "į§ģ除頁éĸ,åˆĒ除頁éĸ", "title": "į§ģ除", + "pageNumbers": { + "label": "Pages to Remove", + "placeholder": "e.g., 1,3,5-8,10", + "error": "Invalid page number format. Use numbers, ranges (1-5), or mathematical expressions (2n+1)" + }, + "filenamePrefix": "pages_removed", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "settings": { + "title": "Settings" + }, + "tooltip": { + "header": { + "title": "Remove Pages Settings" + }, + "pageNumbers": { + "title": "Page Selection", + "text": "Specify which pages to remove from your PDF. You can select individual pages, ranges, or use mathematical expressions.", + "bullet1": "Individual pages: 1,3,5 (removes pages 1, 3, and 5)", + "bullet2": "Page ranges: 1-5,10-15 (removes pages 1-5 and 10-15)", + "bullet3": "Mathematical: 2n+1 (removes odd pages)", + "bullet4": "Open ranges: 5- (removes from page 5 to end)" + }, + "examples": { + "title": "Common Examples", + "text": "Here are some common page selection patterns:", + "bullet1": "Remove first page: 1", + "bullet2": "Remove last 3 pages: -3", + "bullet3": "Remove every other page: 2n", + "bullet4": "Remove specific scattered pages: 1,5,10,15" + }, + "safety": { + "title": "Safety Tips", + "text": "Important considerations when removing pages:", + "bullet1": "Always preview your selection before processing", + "bullet2": "Keep a backup of your original file", + "bullet3": "Page numbers start from 1, not 0", + "bullet4": "Invalid page numbers will be ignored" + } + }, + "error": { + "failed": "An error occurred whilst removing pages." + }, + "results": { + "title": "Page Removal Results" + }, "submit": "į§ģ除" }, - "addPassword": { - "tags": "厉全,厉全性", - "title": "新åĸžå¯†įĸŧ", - "header": "新åĸžå¯†įĸŧīŧˆåР坆īŧ‰", - "selectText": { - "1": "選擇čĻåŠ å¯†įš„ PDF", - "2": "äŊŋᔍ者坆įĸŧ", - "3": "åŠ å¯†é‡‘é‘°é•ˇåēĻ", - "4": "čŧƒéĢ˜įš„å€ŧ更åŧˇīŧŒäŊ†čŧƒäŊŽįš„å€ŧå…ˇæœ‰æ›´åĨŊįš„į›¸åŽšæ€§ã€‚", - "5": "čĻč¨­åŽšįš„æŦŠé™īŧˆåģēč­°čˆ‡æ“æœ‰č€…å¯†įĸŧ一čĩˇäŊŋᔍīŧ‰", - "6": "防æ­ĸ文äģļįĩ„čŖ", - "7": "防æ­ĸ內厚提取", - "8": "防æ­ĸį‚ēäē†į„Ąéšœį¤™äŊŋį”¨č€Œæå–čŗ‡æ–™", - "9": "防æ­ĸåĄĢå¯ĢčĄ¨å–Ž", - "10": "防æ­ĸäŋŽæ”š", - "11": "防æ­ĸč¨ģ釋äŋŽæ”š", - "12": "防æ­ĸ列印", - "13": "防æ­ĸ列印不同æ ŧåŧ", - "14": "æ“æœ‰č€…å¯†įĸŧ", - "15": "限åˆļ一æ—Ļ開啟文äģļ可äģĨ做äģ€éēŧīŧˆä¸Ļ非所有čģŸéĢ”éƒŊ支援īŧ‰", - "16": "限åˆļ開啟文äģᅵŦčēĢ" + "extractPages": { + "title": "Extract Pages", + "pageNumbers": { + "label": "Pages to Extract", + "placeholder": "e.g., 1,3,5-8 or odd & 1-10" + }, + "settings": { + "title": "Settings" }, - "submit": "加密", "tooltip": { - "permissions": { - "title": "čŽŠæ›´æŦŠé™" + "description": "Extracts the selected pages into a new PDF, preserving order." + }, + "error": { + "failed": "Failed to extract pages" + }, + "results": { + "title": "Pages Extracted" + }, + "submit": "Extract Pages" + }, + "pageSelection": { + "tooltip": { + "header": { + "title": "Page Selection Guide" + }, + "basic": { + "title": "Basic Usage", + "text": "Select specific pages from your PDF document using simple syntax.", + "bullet1": "Individual pages: 1,3,5", + "bullet2": "Page ranges: 3-6 or 10-15", + "bullet3": "All pages: all" + }, + "advanced": { + "title": "Advanced Features" + }, + "tips": { + "title": "Tips", + "text": "Keep these guidelines in mind:", + "bullet1": "Page numbers start from 1 (not 0)", + "bullet2": "Spaces are automatically removed", + "bullet3": "Invalid expressions are ignored" + }, + "syntax": { + "title": "Syntax Basics", + "text": "Use numbers, ranges, keywords, and progressions (n starts at 0). Parentheses are supported.", + "bullets": { + "numbers": "Numbers/ranges: 5, 10-20", + "keywords": "Keywords: odd, even", + "progressions": "Progressions: 3n, 4n+1" + } + }, + "operators": { + "title": "Operators", + "text": "AND has higher precedence than comma. NOT applies within the document range.", + "and": "AND: & or \"and\" — require both conditions (e.g., 1-50 & even)", + "comma": "Comma: , or | — combine selections (e.g., 1-10, 20)", + "not": "NOT: ! or \"not\" — exclude pages (e.g., 3n & not 30)" + }, + "examples": { + "title": "Examples" + }, + "complex": { + "bullet1": "1,3-5,8,2n → pages 1, 3–5, 8, plus evens", + "bullet2": "10-,2n-1 → from page 10 to end + odd pages", + "description": "Mix different types.", + "title": "Complex Combinations" + }, + "description": "Choose which pages to use for the operation. Supports single pages, ranges, formulas, and the all keyword.", + "individual": { + "bullet1": "1,3,5 → selects pages 1, 3, 5", + "bullet2": "2,7,12 → selects pages 2, 7, 12", + "description": "Enter numbers separated by commas.", + "title": "Individual Pages" + }, + "mathematical": { + "bullet1": "2n → all even pages (2, 4, 6â€Ļ)", + "bullet2": "2n-1 → all odd pages (1, 3, 5â€Ļ)", + "bullet3": "3n → every 3rd page (3, 6, 9â€Ļ)", + "bullet4": "4n-1 → pages 3, 7, 11, 15â€Ļ", + "description": "Use n in formulas for patterns.", + "title": "Mathematical Functions" + }, + "ranges": { + "bullet1": "3-6 → selects pages 3–6", + "bullet2": "10-15 → selects pages 10–15", + "bullet3": "5- → selects pages 5 to end", + "description": "Use - for consecutive pages.", + "title": "Page Ranges" + }, + "special": { + "bullet1": "all → selects all pages", + "title": "Special Keywords" } } }, - "removePassword": { - "tags": "厉全,觪坆,厉全性,取æļˆå¯†įĸŧ,åˆĒ除密įĸŧ", - "title": "į§ģ除密įĸŧ", - "header": "į§ģ除密įĸŧīŧˆč§Ŗå¯†īŧ‰", - "selectText": { - "1": "選擇čĻč§Ŗå¯†įš„ PDF", - "2": "密įĸŧ" + "bulkSelection": { + "syntaxError": "There is a syntax issue. See Page Selection tips for help.", + "header": { + "title": "Page Selection Guide" }, - "submit": "į§ģ除", - "desc": "åžžæ‚¨įš„ PDF æĒ”æĄˆä¸­į§ģ除密įĸŧäŋč­ˇã€‚", - "password": { - "stepTitle": "į§ģ除密įĸŧ", - "label": "į›Žå‰å¯†įĸŧ" + "syntax": { + "title": "Syntax Basics", + "text": "Use numbers, ranges, keywords, and progressions (n starts at 0). Parentheses are supported.", + "bullets": { + "numbers": "Numbers/ranges: 5, 10-20", + "keywords": "Keywords: odd, even", + "progressions": "Progressions: 3n, 4n+1" + } + }, + "operators": { + "title": "Operators", + "text": "AND has higher precedence than comma. NOT applies within the document range.", + "and": "AND: & or \"and\" — require both conditions (e.g., 1-50 & even)", + "comma": "Comma: , or | — combine selections (e.g., 1-10, 20)", + "not": "NOT: ! or \"not\" — exclude pages (e.g., 3n & not 30)" + }, + "examples": { + "title": "Examples", + "first50": "First 50", + "last50": "Last 50", + "every3rd": "Every 3rd", + "oddWithinExcluding": "Odd within 1-20 excluding 5-7", + "combineSets": "Combine sets" + }, + "firstNPages": { + "title": "First N Pages", + "placeholder": "Number of pages" + }, + "lastNPages": { + "title": "Last N Pages", + "placeholder": "Number of pages" + }, + "everyNthPage": { + "title": "Every Nth Page", + "placeholder": "Step size" + }, + "range": { + "title": "Range", + "fromPlaceholder": "From", + "toPlaceholder": "To" + }, + "keywords": { + "title": "Keywords" + }, + "advanced": { + "title": "Advanced" } }, "compressPdfs": { @@ -848,12 +1735,142 @@ "tags": "į§ģ除,åˆĒ除,襨æ ŧ,æŦ„äŊ,å”¯čŽ€", "title": "į§ģé™¤čĄ¨å–ŽæŦ„äŊįš„唯čހ限åˆļ", "header": "č§ŖéŽ– PDF čĄ¨å–Ž", - "submit": "Remove" + "submit": "Remove", + "description": "This tool will remove read-only restrictions from PDF form fields, making them editable and fillable.", + "filenamePrefix": "unlocked_forms", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst unlocking PDF forms." + }, + "results": { + "title": "Unlocked Forms Results" + } }, "changeMetadata": { - "tags": "æ¨™éĄŒ,äŊœč€…,æ—Ĩ期,åģēįĢ‹,時間,å‡ēį‰ˆå•†,čŖŊäŊœäēē,įĩąč¨ˆ", - "title": "æ¨™éĄŒīŧš", "header": "čŽŠæ›´ä¸­įšŧčŗ‡æ–™", + "submit": "čŽŠæ›´", + "filenamePrefix": "metadata", + "settings": { + "title": "Metadata Settings" + }, + "standardFields": { + "title": "Standard Fields" + }, + "deleteAll": { + "label": "Remove Existing Metadata", + "checkbox": "Delete all metadata" + }, + "title": { + "label": "Title", + "placeholder": "Document title" + }, + "author": { + "label": "Author", + "placeholder": "Document author" + }, + "subject": { + "label": "Subject", + "placeholder": "Document subject" + }, + "keywords": { + "label": "Keywords", + "placeholder": "Document keywords" + }, + "creator": { + "label": "Creator", + "placeholder": "Document creator" + }, + "producer": { + "label": "Producer", + "placeholder": "Document producer" + }, + "dates": { + "title": "Date Fields" + }, + "creationDate": { + "label": "Creation Date", + "placeholder": "Creation date" + }, + "modificationDate": { + "label": "Modification Date", + "placeholder": "Modification date" + }, + "trapped": { + "label": "Trapped Status", + "unknown": "Unknown", + "true": "True", + "false": "False" + }, + "advanced": { + "title": "Advanced Options" + }, + "customFields": { + "title": "Custom Metadata", + "description": "Add custom metadata fields to the document", + "add": "Add Field", + "key": "Key", + "keyPlaceholder": "Custom key", + "value": "Value", + "valuePlaceholder": "Custom value", + "remove": "Remove" + }, + "results": { + "title": "Updated PDFs" + }, + "error": { + "failed": "An error occurred while changing the PDF metadata." + }, + "tooltip": { + "header": { + "title": "PDF Metadata Overview" + }, + "standardFields": { + "title": "Standard Fields", + "text": "Common PDF metadata fields that describe the document.", + "bullet1": "Title: Document name or heading", + "bullet2": "Author: Person who created the document", + "bullet3": "Subject: Brief description of content", + "bullet4": "Keywords: Search terms for the document", + "bullet5": "Creator/Producer: Software used to create the PDF" + }, + "dates": { + "title": "Date Fields", + "text": "When the document was created and modified.", + "bullet1": "Creation Date: When original document was made", + "bullet2": "Modification Date: When last changed" + }, + "options": { + "title": "Additional Options", + "text": "Custom fields and privacy controls.", + "bullet1": "Custom Metadata: Add your own key-value pairs", + "bullet2": "Trapped Status: High-quality printing setting", + "bullet3": "Delete All: Remove all metadata for privacy" + }, + "deleteAll": { + "title": "Remove Existing Metadata", + "text": "Complete metadata deletion to ensure privacy." + }, + "customFields": { + "title": "Custom Metadata", + "text": "Add your own custom key-value metadata pairs.", + "bullet1": "Add any custom fields relevant to your document", + "bullet2": "Examples: Department, Project, Version, Status", + "bullet3": "Both key and value are required for each entry" + }, + "advanced": { + "title": "Advanced Options", + "trapped": { + "title": "Trapped Status", + "description": "Indicates if document is prepared for high-quality printing.", + "bullet1": "True: Document has been trapped for printing", + "bullet2": "False: Document has not been trapped", + "bullet3": "Unknown: Trapped status is not specified" + } + } + }, + "tags": "æ¨™éĄŒ,äŊœč€…,æ—Ĩ期,åģēįĢ‹,時間,å‡ēį‰ˆå•†,čŖŊäŊœäēē,įĩąč¨ˆ", "selectText": { "1": "č̋ᎍčŧ¯äŊ å¸Œæœ›čŽŠæ›´įš„čŽŠæ•¸", "2": "åˆĒ除所有中įšŧčŗ‡æ–™", @@ -861,15 +1878,7 @@ "4": "å…ļäģ–中įšŧčŗ‡æ–™īŧš", "5": "新åĸžč‡Ē訂中įšŧčŗ‡æ–™é …į›Ž" }, - "author": "äŊœč€…īŧš", - "creationDate": "åģēįĢ‹æ—Ĩ期īŧˆyyyy/MM/dd HH:mm:ssīŧ‰īŧš", - "creator": "åģēį̋者īŧš", - "keywords": "關éĩ字īŧš", - "modDate": "äŋŽæ”šæ—Ĩ期īŧˆyyyy/MM/dd HH:mm:ssīŧ‰īŧš", - "producer": "čŖŊäŊœäēēīŧš", - "subject": "ä¸ģ題īŧš", - "trapped": "陷阱īŧš", - "submit": "čŽŠæ›´" + "modDate": "äŋŽæ”šæ—Ĩ期īŧˆyyyy/MM/dd HH:mm:ssīŧ‰īŧš" }, "fileToPDF": { "tags": "čŊ‰æ›,æ ŧåŧ,文äģļ,åœ–į‰‡,投åŊąį‰‡,文字,čŊ‰æ›,office,docs,Word,Excel,PowerPoint", @@ -883,6 +1892,7 @@ "ocr": { "tags": "識åˆĨ,文字,åŊąåƒ,掃描,čŽ€å–,識åˆĨ,åĩæ¸Ŧ,å¯įˇ¨čŧ¯", "title": "OCR / æŽƒææ¸…į†", + "desc": "æ¸…į†æŽƒæä¸Ļåžž PDF ä¸­įš„åŊąåƒä¸­åĩæ¸Ŧ文字ä¸Ļ重新新åĸžį‚ē文字。", "header": "æ¸…į†æŽƒæ / OCRīŧˆå…‰å­¸å­—å…ƒč­˜åˆĨīŧ‰", "selectText": { "1": "選擇čρ圍 PDF 中åĩæ¸Ŧįš„čĒžč¨€īŧˆåˆ—å‡ēįš„æ˜¯į›Žå‰å¯äģĨåĩæ¸Ŧįš„čĒžč¨€īŧ‰īŧš", @@ -901,23 +1911,89 @@ "help": "čĢ‹é–ąčŽ€æ­¤æ–‡äģļīŧŒäē†č§ŖåĻ‚äŊ•äŊŋᔍå…ļäģ–čĒžč¨€å’Œ/或在 Docker 中äŊŋᔍ", "credit": "此服務äŊŋᔍ qpdf 和 Tesseract 進行 OCR。", "submit": "äŊŋᔍ OCR 處ᐆ PDF", - "desc": "æ¸…į†æŽƒæä¸Ļåžž PDF ä¸­įš„åŊąåƒä¸­åĩæ¸Ŧ文字ä¸Ļ重新新åĸžį‚ē文字。", + "operation": { + "submit": "Process OCR and Review" + }, + "results": { + "title": "OCR Results" + }, + "languagePicker": { + "additionalLanguages": "Looking for additional languages?", + "viewSetupGuide": "View setup guide →" + }, "settings": { "title": "č¨­åŽš", "ocrMode": { - "label": "OCR æ¨Ąåŧ" + "label": "OCR æ¨Ąåŧ", + "auto": "Auto (skip text layers)", + "force": "Force (re-OCR all, replace text)", + "strict": "Strict (abort if text found)" }, "languages": { - "label": "čĒžč¨€" + "label": "čĒžč¨€", + "placeholder": "Select languages" + }, + "compatibilityMode": { + "label": "Compatibility Mode" + }, + "advancedOptions": { + "label": "Processing Options", + "sidecar": "Create a text file", + "deskew": "Deskew pages", + "clean": "Clean input file", + "cleanFinal": "Clean final output" } }, "tooltip": { + "header": { + "title": "OCR Settings Overview" + }, "mode": { - "title": "OCR æ¨Ąåŧ" + "title": "OCR æ¨Ąåŧ", + "text": "Optical Character Recognition (OCR) helps you turn scanned or screenshotted pages into text you can search, copy, or highlight.", + "bullet1": "Auto skips pages that already contain text layers.", + "bullet2": "Force re-OCRs every page and replaces all the text.", + "bullet3": "Strict halts if any selectable text is found." }, "languages": { - "title": "čĒžč¨€" + "title": "čĒžč¨€", + "text": "Improve OCR accuracy by specifying the expected languages. Choose one or more languages to guide detection." + }, + "output": { + "title": "Output", + "text": "Decide how you want the text output formatted:", + "bullet1": "Searchable PDF embeds text behind the original image.", + "bullet2": "HOCR XML returns a structured machine-readable file.", + "bullet3": "Plain-text sidecar creates a separate .txt file with raw content." + }, + "advanced": { + "header": { + "title": "Advanced OCR Processing" + }, + "compatibility": { + "title": "Compatibility Mode", + "text": "Uses OCR 'sandwich PDF' mode: results in larger files, but more reliable with certain languages and older PDF software. By default we use hOCR for smaller, modern PDFs." + }, + "sidecar": { + "title": "Create Text File", + "text": "Generates a separate .txt file alongside the PDF containing all extracted text content for easy access and processing." + }, + "deskew": { + "title": "Deskew Pages", + "text": "Automatically corrects skewed or tilted pages to improve OCR accuracy. Useful for scanned documents that weren't perfectly aligned." + }, + "clean": { + "title": "Clean Input File", + "text": "Preprocesses the input by removing noise, enhancing contrast, and optimising the image for better OCR recognition before processing." + }, + "cleanFinal": { + "title": "Clean Final Output", + "text": "Post-processes the final PDF by removing OCR artefacts and optimising the text layer for better readability and smaller file size." + } } + }, + "error": { + "failed": "OCR operation failed" } }, "extractImages": { @@ -926,7 +2002,13 @@ "header": "æå–åœ–į‰‡", "selectText": "選擇čρčŊ‰æ›æå–åŊąåƒįš„åŊąåƒæ ŧåŧ", "allowDuplicates": "å„˛å­˜é‡č¤‡įš„åœ–į‰‡", - "submit": "提取" + "submit": "提取", + "settings": { + "title": "Settings" + }, + "error": { + "failed": "An error occurred while extracting images from the PDF." + } }, "pdfToPDFA": { "tags": "存æĒ”,é•ˇæœŸ,標æē–,čŊ‰æ›,å„˛å­˜,äŋå­˜", @@ -998,17 +2080,53 @@ }, "info": "尚æœĒåŽ‰čŖ Python。需čĻåŽ‰čŖ Python 才čƒŊåŸˇčĄŒã€‚" }, + "scannerImageSplit": { + "title": "Extracted Images", + "submit": "Extract Image Scans", + "error": { + "failed": "An error occurred while extracting image scans." + }, + "tooltip": { + "title": "Photo Splitter", + "whatThisDoes": "What this does", + "whatThisDoesDesc": "Automatically finds and extracts each photo from a scanned page or composite image—no manual cropping.", + "whenToUse": "When to use", + "useCase1": "Scan whole album pages in one go", + "useCase2": "Split flatbed batches into separate files", + "useCase3": "Break collages into individual photos", + "useCase4": "Pull photos from documents", + "quickFixes": "Quick fixes", + "problem1": "Photos not detected → increase Tolerance to 30-50", + "problem2": "Too many false detections → increase Minimum Area to 15,000-20,000", + "problem3": "Crops are too tight → increase Border Size to 5-10", + "problem4": "Tilted photos not straightened → lower Angle Threshold to ~5°", + "problem5": "Dust/noise boxes → increase Minimum Contour Area to 1000-2000", + "setupTips": "Setup tips", + "tip1": "Use a plain, light background", + "tip2": "Leave a small gap (≈1 cm) between photos", + "tip3": "Scan at 300-600 DPI", + "tip4": "Clean the scanner glass", + "headsUp": "Heads-up", + "headsUpDesc": "Overlapping photos or backgrounds very close in colour to the photos can reduce accuracy-try a lighter or darker background and leave more space." + } + }, "sign": { - "tags": "授æŦŠ,į¸Žå¯Ģ,įšĒčŖŊį°ŊįĢ ,文字,åŊąåƒį°ŊįĢ ", "title": "į°ŊįĢ ", "header": "į°ŊįŊ˛ PDF", "upload": "ä¸Šå‚ŗåŊąåƒ", - "draw": "įšĒčŖŊį°ŊįĢ ", - "text": "文字čŧ¸å…Ĩ", + "draw": { + "title": "Draw your signature", + "clear": "Clear" + }, + "text": { + "name": "Signer Name", + "placeholder": "Enter your full name" + }, "clear": "清除", "add": "新åĸž", "saved": "åˇ˛å„˛å­˜įš„į°ŊįĢ ", "save": "å„˛å­˜į°ŊįĢ ", + "applySignatures": "Apply Signatures", "personalSigs": "個äēēį°ŊįĢ ", "sharedSigs": "å…ąį”¨į°ŊįĢ ", "noSavedSigs": "尚æœĒå„˛å­˜äģģäŊ•į°ŊįĢ ", @@ -1020,42 +2138,179 @@ "previous": "上一頁", "maintainRatio": "切換įļ­æŒé•ˇå¯Ŧ比", "undo": "æ’¤éŠˇ", - "redo": "重做" + "redo": "重做", + "submit": "Sign Document", + "steps": { + "configure": "Configure Signature" + }, + "type": { + "title": "Signature Type", + "draw": "Draw", + "canvas": "Canvas", + "image": "Image", + "text": "Text" + }, + "image": { + "label": "Upload signature image", + "placeholder": "Select image file", + "hint": "Upload a PNG or JPG image of your signature" + }, + "instructions": { + "title": "How to add signature", + "canvas": "After drawing your signature in the canvas, close the modal then click anywhere on the PDF to place it.", + "image": "After uploading your signature image above, click anywhere on the PDF to place it.", + "text": "After entering your name above, click anywhere on the PDF to place your signature." + }, + "mode": { + "move": "Move Signature", + "place": "Place Signature" + }, + "updateAndPlace": "Update and Place", + "activate": "Activate Signature Placement", + "deactivate": "Stop Placing Signatures", + "results": { + "title": "Signature Results" + }, + "error": { + "failed": "An error occurred while signing the PDF." + }, + "tags": "授æŦŠ,į¸Žå¯Ģ,įšĒčŖŊį°ŊįĢ ,文字,åŊąåƒį°ŊįĢ " }, "flatten": { - "tags": "靜態,åœį”¨,非äē’å‹•,į°ĄåŒ–", "title": "åšŗåĻ化", "header": "PDF åšŗåĻ化", "flattenOnlyForms": "åƒ…å°‡čĄ¨å–ŽåšŗåĻ化", "submit": "åšŗåĻ化", + "filenamePrefix": "flattened", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, "steps": { "settings": "č¨­åŽš" }, "options": { - "flattenOnlyForms": "åƒ…å°‡čĄ¨å–ŽåšŗåĻ化" - } + "stepTitle": "Flatten Options", + "title": "Flatten Options", + "flattenOnlyForms": { + "label": "åƒ…å°‡čĄ¨å–ŽåšŗåĻ化", + "desc": "Only flatten form fields, leaving other interactive elements intact" + }, + "note": "Flattening removes interactive elements from the PDF, making them non-editable." + }, + "results": { + "title": "Flatten Results" + }, + "error": { + "failed": "An error occurred while flattening the PDF." + }, + "tooltip": { + "header": { + "title": "About Flattening PDFs" + }, + "description": { + "title": "What does flattening do?", + "text": "Flattening makes your PDF non-editable by turning fillable forms and buttons into regular text and images. The PDF will look exactly the same, but no one can change or fill in the forms anymore. Perfect for sharing completed forms, creating final documents for records, or ensuring the PDF looks the same everywhere.", + "bullet1": "Text boxes become regular text (can't be edited)", + "bullet2": "Checkboxes and buttons become pictures", + "bullet3": "Great for final versions you don't want changed", + "bullet4": "Ensures consistent appearance across all devices" + }, + "formsOnly": { + "title": "What does 'Flatten only forms' mean?", + "text": "This option only removes the ability to fill in forms, but keeps other features working like clicking links, viewing bookmarks, and reading comments.", + "bullet1": "Forms become non-editable", + "bullet2": "Links still work when clicked", + "bullet3": "Comments and notes remain visible", + "bullet4": "Bookmarks still help you navigate" + } + }, + "tags": "靜態,åœį”¨,非äē’å‹•,į°ĄåŒ–" }, "repair": { "tags": "äŋŽåžŠ,æĸ垊,äŋŽæ­Ŗ,垊原", "title": "äŋŽåžŠ", "header": "äŋŽåžŠ PDF", - "submit": "äŋŽåžŠ" + "submit": "äŋŽåžŠ", + "description": "This tool will attempt to repair corrupted or damaged PDF files. No additional settings are required.", + "filenamePrefix": "repaired", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst repairing the PDF." + }, + "results": { + "title": "Repair Results" + } }, "removeBlanks": { - "tags": "æ¸…į†,į°ĄåŒ–,非內厚,įĩ„įš”", "title": "į§ģ除įŠēį™Ŋ頁éĸ", "header": "į§ģ除įŠēį™Ŋ頁éĸ", - "threshold": "į•Ģį´ į™ŊåēĻ閾å€ŧīŧš", + "settings": { + "title": "Settings" + }, + "threshold": { + "label": "Pixel Whiteness Threshold" + }, + "whitePercent": { + "label": "White Percentage Threshold", + "unit": "%" + }, + "includeBlankPages": { + "label": "Include detected blank pages" + }, + "tooltip": { + "header": { + "title": "Remove Blank Pages Settings" + }, + "threshold": { + "title": "Pixel Whiteness Threshold", + "text": "Controls how white a pixel must be to be considered 'white'. This helps determine what counts as a blank area on the page.", + "bullet1": "0 = Pure black (most restrictive)", + "bullet2": "128 = Medium grey", + "bullet3": "255 = Pure white (least restrictive)" + }, + "whitePercent": { + "title": "White Percentage Threshold", + "text": "Sets the minimum percentage of white pixels required for a page to be considered blank and removed.", + "bullet1": "Lower values (e.g., 80%) = More pages removed", + "bullet2": "Higher values (e.g., 95%) = Only very blank pages removed", + "bullet3": "Use higher values for documents with light backgrounds" + }, + "includeBlankPages": { + "title": "Include Detected Blank Pages", + "text": "When enabled, creates a separate PDF containing all the blank pages that were detected and removed from the original document.", + "bullet1": "Useful for reviewing what was removed", + "bullet2": "Helps verify the detection accuracy", + "bullet3": "Can be disabled to reduce output file size" + } + }, + "submit": "į§ģ除įŠēį™Ŋ", + "error": { + "failed": "Failed to remove blank pages" + }, + "results": { + "title": "Removed Blank Pages" + }, + "tags": "æ¸…į†,į°ĄåŒ–,非內厚,įĩ„įš”", "thresholdDesc": "įĸē厚一個į™Ŋ色į•Ģį´ åŋ…須多éēŧį™Ŋ才čƒŊčĸĢåˆ†éĄžį‚ē 'į™Ŋ色'。0 = éģ‘色īŧŒ255 į´”į™Ŋ。", - "whitePercent": "į™Ŋč‰˛į™žåˆ†æ¯”īŧˆ%īŧ‰īŧš", - "whitePercentDesc": "頁éĸåŋ…須是 'į™Ŋ色' į•Ģį´ įš„į™žåˆ†æ¯”æ‰čƒŊčĸĢį§ģ除", - "submit": "į§ģ除įŠēį™Ŋ" + "whitePercentDesc": "頁éĸåŋ…須是 'į™Ŋ色' į•Ģį´ įš„į™žåˆ†æ¯”æ‰čƒŊčĸĢį§ģ除" }, "removeAnnotations": { "tags": "č¨ģ釋,įǁå‡ē,č¨ģč§Ŗ,æ¨™č¨˜,į§ģ除", "title": "į§ģ除č¨ģ釋", "header": "į§ģ除č¨ģ釋", - "submit": "į§ģ除" + "submit": "į§ģ除", + "settings": { + "title": "Settings" + }, + "info": { + "title": "About Remove Annotations", + "description": "This tool will remove all annotations (comments, highlights, notes, etc.) from your PDF documents." + }, + "error": { + "failed": "An error occurred while removing annotations from the PDF." + } }, "compare": { "tags": "區分,對比,čŽŠåŒ–,分析", @@ -1087,6 +2342,142 @@ "certSign": { "tags": "驗證,PEM,P12,厘斚,加密", "title": "æ†‘č­‰į°ŊįĢ ", + "filenamePrefix": "signed", + "signMode": { + "stepTitle": "Sign Mode", + "tooltip": { + "header": { + "title": "About PDF Signatures" + }, + "overview": { + "title": "How signatures work", + "text": "Both modes seal the document (any edits are flagged as tampering) and record who/when/how for auditing. Viewer trust depends on the certificate chain." + }, + "manual": { + "title": "Manual - Bring your certificate", + "text": "Use your own certificate files for brand-aligned identity. Can display Trusted when your CA/chain is recognised.", + "use": "Use for: customer-facing, legal, compliance." + }, + "auto": { + "title": "Auto - Zero-setup, instant system seal", + "text": "Signs with a server self-signed certificate. Same tamper-evident seal and audit trail; typically shows Unverified in viewers.", + "use": "Use when: you need speed and consistent internal identity across reviews and records." + }, + "rule": { + "title": "Rule of thumb", + "text": "Need recipient Trusted status? Manual. Need a fast, tamper-evident seal and audit trail with no setup? Auto." + } + } + }, + "certTypeStep": { + "stepTitle": "Certificate Format" + }, + "certFiles": { + "stepTitle": "Certificate Files" + }, + "appearance": { + "stepTitle": "Signature Appearance", + "tooltip": { + "header": { + "title": "About Signature Appearance" + }, + "invisible": { + "title": "Invisible Signatures", + "text": "The signature is added to the PDF for security but won't be visible when viewing the document. Perfect for legal requirements without changing the document's appearance.", + "bullet1": "Provides security without visual changes", + "bullet2": "Meets legal requirements for digital signing", + "bullet3": "Doesn't affect document layout or design" + }, + "visible": { + "title": "Visible Signatures", + "text": "Shows a signature block on the PDF with your name, date, and optional details. Useful when you want readers to clearly see the document is signed.", + "bullet1": "Shows signer name and date on the document", + "bullet2": "Can include reason and location for signing", + "bullet3": "Choose which page to place the signature", + "bullet4": "Optional logo can be included" + } + }, + "invisible": "Invisible", + "options": { + "title": "Signature Details" + }, + "visible": "Visible" + }, + "sign": { + "submit": "Sign PDF", + "results": "Signed PDF" + }, + "error": { + "failed": "An error occurred whilst processing signatures." + }, + "tooltip": { + "header": { + "title": "About Managing Signatures" + }, + "overview": { + "title": "What can this tool do?", + "text": "This tool lets you check if your PDFs are digitally signed and add new digital signatures. Digital signatures prove who created or approved a document and show if it has been changed since signing.", + "bullet1": "Check existing signatures and their validity", + "bullet2": "View detailed information about signers and certificates", + "bullet3": "Add new digital signatures to secure your documents", + "bullet4": "Multiple files supported with easy navigation" + }, + "validation": { + "title": "Checking Signatures", + "text": "When you check signatures, the tool tells you if they're valid, who signed the document, when it was signed, and whether the document has been changed since signing.", + "bullet1": "Shows if signatures are valid or invalid", + "bullet2": "Displays signer information and signing date", + "bullet3": "Checks if the document was modified after signing", + "bullet4": "Can use custom certificates for verification" + }, + "signing": { + "title": "Adding Signatures", + "text": "To sign a PDF, you need a digital certificate (like PEM, PKCS12, or JKS). You can choose to make the signature visible on the document or keep it invisible for security only.", + "bullet1": "Supports PEM, PKCS12, JKS, and server certificate formats", + "bullet2": "Option to show or hide signature on the PDF", + "bullet3": "Add reason, location, and signer name", + "bullet4": "Choose which page to place visible signatures", + "bullet5": "Use server certificate for simple 'Sign with Stirling-PDF' option" + } + }, + "certType": { + "tooltip": { + "header": { + "title": "About Certificate Types" + }, + "what": { + "title": "What's a certificate?", + "text": "It's a secure ID for your signature that proves you signed. Unless you're required to sign via certificate, we recommend using another secure method like Type, Draw, or Upload." + }, + "which": { + "title": "Which option should I use?", + "text": "Choose the format that matches your certificate file:", + "bullet1": "PKCS#12 (.p12 / .pfx) – one combined file (most common)", + "bullet2": "PFX (.pfx) – Microsoft's version of PKCS12", + "bullet3": "PEM – separate private-key and certificate .pem files", + "bullet4": "JKS – Java .jks keystore for dev / CI-CD workflows" + }, + "convert": { + "title": "Key not listed?", + "text": "Convert your file to a Java keystore (.jks) with keytool, then pick JKS." + } + } + }, + "chooseCertificate": "Choose Certificate File", + "chooseJksFile": "Choose JKS File", + "chooseP12File": "Choose PKCS12 File", + "choosePfxFile": "Choose PFX File", + "choosePrivateKey": "Choose Private Key File", + "location": "äŊįŊŽ", + "logoTitle": "Logo", + "name": "åį¨ą", + "noLogo": "No Logo", + "pageNumber": "Page Number", + "password": "čŧ¸å…Ĩæ‚¨įš„é‡‘é‘°åēĢæˆ–ᧁ鑰坆įĸŧīŧˆåĻ‚æžœæœ‰įš„čŠąīŧ‰īŧš", + "passwordOptional": "Leave empty if no password", + "reason": "原因", + "serverCertMessage": "Using server certificate - no files or password required", + "showLogo": "éĄ¯į¤ē Logo", "header": "äŊŋį”¨æ‚¨įš„æ†‘č­‰į°ŊįĢ īŧˆé€˛čĄŒä¸­īŧ‰", "selectPDF": "選擇čρį°ŊįĢ įš„ PDF æĒ”æĄˆīŧš", "jksNote": "æŗ¨æ„īŧšåĻ‚æžœæ‚¨įš„č­‰æ›¸éĄžåž‹æœĒčĸĢ列在下斚īŧŒčĢ‹äŊŋᔍ keytool å‘Ŋäģ¤åˆ—åˇĨ兎將å…ļčŊ‰æ›į‚ē Java Keystore īŧˆ.jksīŧ‰ æĒ”æĄˆæ ŧåŧīŧŒį„ļ垌選擇下éĸįš„ .jks æĒ”æĄˆé¸é …ã€‚", @@ -1094,13 +2485,7 @@ "selectCert": "é¸æ“‡æ‚¨įš„æ†‘č­‰æĒ”æĄˆīŧˆX.509 æ ŧåŧīŧŒå‰¯æĒ”名可čƒŊ是 .pem 或 .derīŧ‰īŧš", "selectP12": "é¸æ“‡æ‚¨įš„ PKCS#12 金鑰åēĢæĒ”æĄˆīŧˆå‰¯æĒ”名可čƒŊ是 .p12 或 .pfxīŧ‰īŧˆé¸åĄĢīŧŒåĻ‚æžœæœ‰æäž›īŧŒå‰‡åŽƒæ‡‰čŠ˛åŒ…åĢæ‚¨įš„į§é‘°å’Œæ†‘č­‰īŧ‰īŧš", "selectJKS": "é¸æ“‡æ‚¨įš„ Java Keystore æĒ”æĄˆ īŧˆå‰¯æĒ”名可čƒŊ是 .jks 或 .keystoreīŧ‰īŧš", - "certType": "æ†‘č­‰éĄžåž‹", - "password": "čŧ¸å…Ĩæ‚¨įš„é‡‘é‘°åēĢæˆ–ᧁ鑰坆įĸŧīŧˆåĻ‚æžœæœ‰įš„čŠąīŧ‰īŧš", "showSig": "éĄ¯į¤ēį°ŊįĢ ", - "reason": "原因", - "location": "äŊįŊŽ", - "name": "åį¨ą", - "showLogo": "éĄ¯į¤ē Logo", "submit": "į°ŊįĢ  PDF" }, "removeCertSign": { @@ -1108,7 +2493,18 @@ "title": "į§ģé™¤æ†‘č­‰į°ŊįĢ ", "header": "åžž PDF æĒ”æĄˆä¸­į§ģé™¤æ†‘č­‰į°ŊįĢ ", "selectPDF": "選擇 PDF æĒ”æĄˆ", - "submit": "į§ģ除" + "submit": "į§ģ除", + "description": "This tool will remove digital certificate signatures from your PDF document.", + "filenamePrefix": "unsigned", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst removing certificate signatures." + }, + "results": { + "title": "Certificate Removal Results" + } }, "pageLayout": { "tags": "合äŊĩ,č¤‡åˆ,喎一æĒĸčĻ–,įĩ„įš”", @@ -1116,16 +2512,157 @@ "header": "多頁éĸį‰ˆéĸ配įŊŽ", "pagesPerSheet": "每åŧĩį´™įš„é éĸ數īŧš", "addBorder": "新åĸžé‚ŠæĄ†", - "submit": "送å‡ē" + "submit": "送å‡ē", + "desc": { + "2": "Place 2 pages side-by-side on a single sheet.", + "3": "Place 3 pages on a single sheet in a single row.", + "4": "Place 4 pages on a single sheet (2 × 2 grid).", + "9": "Place 9 pages on a single sheet (3 × 3 grid).", + "16": "Place 16 pages on a single sheet (4 × 4 grid)." + }, + "error": { + "failed": "An error occurred while creating the multi-page layout." + } + }, + "bookletImposition": { + "tags": "booklet,imposition,printing,binding,folding,signature", + "title": "Booklet Imposition", + "header": "Booklet Imposition", + "submit": "Create Booklet", + "spineLocation": { + "label": "Spine Location", + "left": "Left (Standard)", + "right": "Right (RTL)" + }, + "doubleSided": { + "label": "Double-sided printing", + "tooltip": "Creates both front and back sides for proper booklet printing" + }, + "manualDuplex": { + "title": "Manual Duplex Mode", + "instructions": "For printers without automatic duplex. You'll need to run this twice:" + }, + "duplexPass": { + "label": "Print Pass", + "first": "1st Pass", + "second": "2nd Pass", + "firstInstructions": "Prints front sides → stack face-down → run again with 2nd Pass", + "secondInstructions": "Load printed stack face-down → prints back sides" + }, + "rtlBinding": { + "label": "Right-to-left binding", + "tooltip": "For Arabic, Hebrew, or other right-to-left languages" + }, + "addBorder": { + "label": "Add borders around pages", + "tooltip": "Adds borders around each page section to help with cutting and alignment" + }, + "addGutter": { + "label": "Add gutter margin", + "tooltip": "Adds inner margin space for binding" + }, + "gutterSize": { + "label": "Gutter size (points)" + }, + "flipOnShortEdge": { + "label": "Flip on short edge (automatic duplex only)", + "tooltip": "Enable for short-edge duplex printing (automatic duplex only - ignored in manual mode)", + "manualNote": "Not needed in manual mode - you flip the stack yourself" + }, + "advanced": { + "toggle": "Advanced Options" + }, + "paperSizeNote": "Paper size is automatically derived from your first page.", + "tooltip": { + "header": { + "title": "Booklet Creation Guide" + }, + "description": { + "title": "What is Booklet Imposition?", + "text": "Creates professional booklets by arranging pages in the correct printing order. Your PDF pages are placed 2-up on landscape sheets so when folded and bound, they read in proper sequence like a real book." + }, + "example": { + "title": "Example: 8-Page Booklet", + "text": "Your 8-page document becomes 2 sheets:", + "bullet1": "Sheet 1 Front: Pages 8, 1 | Back: Pages 2, 7", + "bullet2": "Sheet 2 Front: Pages 6, 3 | Back: Pages 4, 5", + "bullet3": "When folded & stacked: Reads 1→2→3→4→5→6→7→8" + }, + "printing": { + "title": "How to Print & Assemble", + "text": "Follow these steps for perfect booklets:", + "bullet1": "Print double-sided with 'Flip on long edge'", + "bullet2": "Stack sheets in order, fold in half", + "bullet3": "Staple or bind along the folded spine", + "bullet4": "For short-edge printers: Enable 'Flip on short edge' option" + }, + "manualDuplex": { + "title": "Manual Duplex (Single-sided Printers)", + "text": "For printers without automatic duplex:", + "bullet1": "Turn OFF 'Double-sided printing'", + "bullet2": "Select '1st Pass' → Print → Stack face-down", + "bullet3": "Select '2nd Pass' → Load stack → Print backs", + "bullet4": "Fold and assemble as normal" + }, + "advanced": { + "title": "Advanced Options", + "text": "Fine-tune your booklet:", + "bullet1": "Right-to-Left Binding: For Arabic, Hebrew, or RTL languages", + "bullet2": "Borders: Shows cut lines for trimming", + "bullet3": "Gutter Margin: Adds space for binding/stapling", + "bullet4": "Short-edge Flip: Only for automatic duplex printers" + } + }, + "error": { + "failed": "An error occurred while creating the booklet imposition." + } }, "scalePages": { - "tags": "čĒŋ整大小,äŋŽæ”š,å°ē寸,遊應", "title": "čĒŋ整頁éĸ大小/比䞋", "header": "čĒŋ整頁éĸ大小/比䞋", "pageSize": "文äģļįš„é éĸ大小。", "keepPageSize": "原始大小", "scaleFactor": "頁éĸįš„į¸Žæ”žį´šåˆĨīŧˆčŖå‰Ēīŧ‰ã€‚", - "submit": "送å‡ē" + "submit": "送å‡ē", + "tags": "čĒŋ整大小,äŋŽæ”š,å°ē寸,遊應" + }, + "adjustPageScale": { + "tags": "resize,modify,dimension,adapt", + "title": "Adjust Page Scale", + "header": "Adjust Page Scale", + "scaleFactor": { + "label": "Scale Factor" + }, + "pageSize": { + "label": "Target Page Size", + "keep": "Keep Original Size", + "letter": "Letter", + "legal": "Legal" + }, + "submit": "Adjust Page Scale", + "error": { + "failed": "An error occurred while adjusting the page scale." + }, + "tooltip": { + "header": { + "title": "Page Scale Settings Overview" + }, + "description": { + "title": "Description", + "text": "Adjust the size of PDF content and change the page dimensions." + }, + "scaleFactor": { + "title": "Scale Factor", + "text": "Controls how large or small the content appears on the page. Content is scaled and centred - if scaled content is larger than the page size, it may be cropped.", + "bullet1": "1.0 = Original size", + "bullet2": "0.5 = Half size (50% smaller)", + "bullet3": "2.0 = Double size (200% larger, may crop)" + }, + "pageSize": { + "title": "Target Page Size", + "text": "Sets the dimensions of the output PDF pages. 'Keep Original Size' maintains current dimensions, whilst other options resize to standard paper sizes." + } + } }, "add-page-numbers": { "tags": "分頁,æ¨™įą¤,įĩ„įš”,į´ĸåŧ•" @@ -1134,16 +2671,83 @@ "tags": "č‡Ē動åĩæ¸Ŧ,åŸēæ–ŧ標頭,įĩ„įš”,é‡æ–°æ¨™įą¤", "title": "č‡Ē動重新å‘Ŋ名", "header": "č‡Ē動重新å‘Ŋ名 PDF", - "submit": "č‡Ē動重新å‘Ŋ名" + "description": "Automatically finds the title from your PDF content and uses it as the filename.", + "submit": "č‡Ē動重新å‘Ŋ名", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst auto-renaming the PDF." + }, + "results": { + "title": "Auto-Rename Results" + }, + "tooltip": { + "header": { + "title": "How Auto-Rename Works" + }, + "howItWorks": { + "title": "Smart Renaming", + "text": "Automatically finds the title from your PDF content and uses it as the filename.", + "bullet1": "Looks for text that appears to be a title or heading", + "bullet2": "Creates a clean, valid filename from the detected title", + "bullet3": "Keeps the original name if no suitable title is found" + } + } }, "adjust-contrast": { "tags": "色åŊŠæ Ąæ­Ŗ,čĒŋ整,äŋŽæ”š,åĸžåŧˇ" }, "crop": { - "tags": "äŋŽå‰Ē,į¸Žå°,ᎍčŧ¯,åŊĸį‹€", "title": "誁å‰Ē", "header": "誁å‰Ē PDF", - "submit": "送å‡ē" + "submit": "送å‡ē", + "noFileSelected": "Select a PDF file to begin cropping", + "preview": { + "title": "Crop Area Selection" + }, + "reset": "Reset to full PDF", + "coordinates": { + "title": "Position and Size", + "x": { + "label": "X Position", + "desc": "Left edge (points)" + }, + "y": { + "label": "Y Position", + "desc": "Bottom edge (points)" + }, + "width": { + "label": "Width", + "desc": "Crop width (points)" + }, + "height": { + "label": "Height", + "desc": "Crop height (points)" + } + }, + "error": { + "invalidArea": "Crop area extends beyond PDF boundaries", + "failed": "Failed to crop PDF" + }, + "steps": { + "selectArea": "Select Crop Area" + }, + "tooltip": { + "title": "How to Crop PDFs", + "description": "Select the area to crop from your PDF by dragging and resizing the blue overlay on the thumbnail.", + "drag": "Drag the overlay to move the crop area", + "resize": "Drag the corner and edge handles to resize", + "precision": "Use coordinate inputs for precise positioning" + }, + "results": { + "title": "Crop Results" + }, + "automation": { + "info": "Enter crop coordinates in PDF points. Origin (0,0) is at bottom-left. These values will be applied to all PDFs processed in this automation.", + "reference": "Reference: A4 page is 595.28 × 841.89 points (210mm × 297mm). 1 inch = 72 points." + }, + "tags": "äŋŽå‰Ē,į¸Žå°,ᎍčŧ¯,åŊĸį‹€" }, "autoSplitPDF": { "tags": "åŸēæ–ŧ QR Code,分é›ĸ,掃描區æŽĩ,įĩ„įš”", @@ -1226,24 +2830,124 @@ "downloadJS": "下čŧ‰ JavaScript", "submit": "éĄ¯į¤ē" }, - "autoRedact": { - "tags": "åĄ—æ”š,隱藏,åĄ—éģ‘,éģ‘色,æ¨™č¨˜,過č”Ŋ", - "title": "č‡Ēå‹•åĄ—éģ‘", - "header": "č‡Ēå‹•åĄ—éģ‘", - "colorLabel": "顏色", - "textsToRedactLabel": "čĻåĄ—éģ‘įš„æ–‡å­—īŧˆäģĨčĄŒåˆ†éš”īŧ‰", - "textsToRedactPlaceholder": "例åĻ‚ \\n抟密 \\n最éĢ˜æŠŸå¯†", - "useRegexLabel": "äŊŋį”¨æ­Ŗå‰‡čĄ¨é”åŧ", - "wholeWordSearchLabel": "æ•´å€‹å–ŽčŠžæœå°‹", - "customPaddingLabel": "č‡Ēč¨‚éĄå¤–åĄĢ充", - "convertPDFToImageLabel": "將 PDF čŊ‰æ›į‚ē PDF-åŊąåƒīŧˆį”¨æ–ŧį§ģé™¤æ–šæĄ†åžŒéĸįš„æ–‡å­—īŧ‰", - "submitButton": "送å‡ē" - }, "redact": { "tags": "åĄ—æ”š,隱藏,åĄ—éģ‘,éģ‘色,æ¨™č¨˜,過č”Ŋ,手動", "title": "æ‰‹å‹•åĄ—éģ‘", - "header": "æ‰‹å‹•åĄ—éģ‘", "submit": "åĄ—éģ‘", + "error": { + "failed": "An error occurred while redacting the PDF." + }, + "modeSelector": { + "title": "Redaction Method", + "mode": "Mode", + "automatic": "Automatic", + "automaticDesc": "Redact text based on search terms", + "manual": "Manual", + "manualDesc": "Click and drag to redact specific areas", + "manualComingSoon": "Manual redaction coming soon" + }, + "auto": { + "header": "Auto Redact", + "settings": { + "title": "Redaction Settings", + "advancedTitle": "進階" + }, + "colorLabel": "Box Colour", + "wordsToRedact": { + "title": "Words to Redact", + "placeholder": "Enter a word", + "add": "新åĸž", + "examples": "Examples: Confidential, Top-Secret" + }, + "useRegexLabel": "Use Regex", + "wholeWordSearchLabel": "Whole Word Search", + "customPaddingLabel": "Custom Extra Padding", + "convertPDFToImageLabel": "Convert PDF to PDF-Image" + }, + "tooltip": { + "mode": { + "header": { + "title": "Redaction Method" + }, + "automatic": { + "title": "Automatic Redaction", + "text": "Automatically finds and redacts specified text throughout the document. Perfect for removing consistent sensitive information like names, addresses, or confidential markers." + }, + "manual": { + "title": "Manual Redaction", + "text": "Click and drag to manually select specific areas to redact. Gives you precise control over what gets redacted. (Coming soon)" + } + }, + "words": { + "header": { + "title": "Words to Redact" + }, + "description": { + "title": "Text Matching", + "text": "Enter words or phrases to find and redact in your document. Each word will be searched for separately." + }, + "bullet1": "Add one word at a time", + "bullet2": "Press Enter or click 'Add Another' to add", + "bullet3": "Click × to remove words", + "examples": { + "title": "Common Examples", + "text": "Typical words to redact include: bank details, email addresses, or specific names." + } + }, + "advanced": { + "header": { + "title": "Advanced Redaction Settings" + }, + "color": { + "title": "Box Colour & Padding", + "text": "Customise the appearance of redaction boxes. Black is standard, but you can choose any colour. Padding adds extra space around the found text." + }, + "regex": { + "title": "Use Regex", + "text": "Enable regular expressions for advanced pattern matching. Useful for finding phone numbers, emails, or complex patterns.", + "bullet1": "Example: \\d{4}-\\d{2}-\\d{2} to match any dates in YYYY-MM-DD format", + "bullet2": "Use with caution - test thoroughly" + }, + "wholeWord": { + "title": "Whole Word Search", + "text": "Only match complete words, not partial matches. 'John' won't match 'Johnson' when enabled." + }, + "convert": { + "title": "Convert to PDF-Image", + "text": "Converts the PDF to an image-based PDF after redaction. This ensures text behind redaction boxes is completely removed and unrecoverable." + } + } + }, + "manual": { + "header": "Manual Redaction", + "textBasedRedaction": "Text-based Redaction", + "pageBasedRedaction": "Page-based Redaction", + "convertPDFToImageLabel": "Convert PDF to PDF-Image (Used to remove text behind the box)", + "pageRedactionNumbers": { + "title": "頁éĸ", + "placeholder": "īŧˆäž‹åĻ‚ 1,2,8 或 4,7,12-16 或 2n-1īŧ‰" + }, + "redactionColor": { + "title": "Redaction Colour" + }, + "export": "匯å‡ē", + "upload": "Upload", + "boxRedaction": "Box draw redaction", + "zoom": "Zoom", + "zoomIn": "Zoom in", + "zoomOut": "Zoom out", + "nextPage": "Next Page", + "previousPage": "Previous Page", + "toggleSidebar": "Toggle Sidebar", + "showThumbnails": "Show Thumbnails", + "showDocumentOutline": "Show Document Outline (double-click to expand/collapse all items)", + "showAttachments": "Show Attachments", + "showLayers": "Show Layers (double-click to reset all layers to the default state)", + "colourPicker": "Colour Picker", + "findCurrentOutlineItem": "Find current outline item", + "applyChanges": "Apply Changes" + }, + "header": "æ‰‹å‹•åĄ—éģ‘", "textBasedRedaction": "äģĨ文字į‚ēåŸēį¤Žįš„åĄ—éģ‘", "pageBasedRedaction": "äģĨ頁éĸį‚ēåŸēį¤Žįš„åĄ—éģ‘", "convertPDFToImageLabel": "將 PDF čŊ‰æ›į‚ē PDF åŊąåƒīŧˆį”¨æ–ŧį§ģ除é쑿Ą†åžŒįš„æ–‡å­—īŧ‰", @@ -1269,22 +2973,7 @@ "showLayers": "éĄ¯į¤ēåœ–åą¤īŧˆæŒ‰å…Šä¸‹å¯å°‡æ‰€æœ‰åœ–åą¤é‡č¨­į‚ēé č¨­į‹€æ…‹īŧ‰", "colourPicker": "éĄč‰˛é¸æ“‡å™¨", "findCurrentOutlineItem": "å°‹æ‰žį›Žå‰įš„å¤§įļąé …į›Ž", - "applyChanges": "åĨ—į”¨čŽŠæ›´", - "auto": { - "settings": { - "advancedTitle": "進階" - }, - "wordsToRedact": { - "add": "新åĸž" - } - }, - "manual": { - "pageRedactionNumbers": { - "title": "頁éĸ", - "placeholder": "īŧˆäž‹åĻ‚ 1,2,8 或 4,7,12-16 或 2n-1īŧ‰" - }, - "export": "匯å‡ē" - } + "applyChanges": "åĨ—į”¨čŽŠæ›´" }, "tableExtraxt": { "tags": "CSV,襨æ ŧ提取,提取,čŊ‰æ›" @@ -1295,11 +2984,15 @@ "overlay-pdfs": { "tags": "čφ蓋", "header": "čφ蓋 PDF æĒ”æĄˆ", + "title": "Overlay PDFs", + "desc": "Overlay one PDF on top of another", "baseFile": { "label": "選擇åŸēåē• PDF æĒ”æĄˆ" }, "overlayFiles": { - "label": "選擇čφ蓋 PDF æĒ”æĄˆ" + "label": "選擇čφ蓋 PDF æĒ”æĄˆ", + "placeholder": "Choose PDF(s)...", + "addMore": "Add more PDFs..." }, "mode": { "label": "選擇čĻ†č“‹æ¨Ąåŧ", @@ -1309,14 +3002,53 @@ }, "counts": { "label": "čφ蓋æŦĄæ•¸īŧˆéŠį”¨æ–ŧå›ēåŽšé‡č¤‡æ¨Ąåŧīŧ‰", - "placeholder": "čŧ¸å…Ĩé€—č™Ÿåˆ†éš”įš„æŦĄæ•¸īŧˆäž‹åĻ‚īŧš2,3,1īŧ‰" + "placeholder": "čŧ¸å…Ĩé€—č™Ÿåˆ†éš”įš„æŦĄæ•¸īŧˆäž‹åĻ‚īŧš2,3,1īŧ‰", + "item": "Count for file", + "noFiles": "Add overlay files to configure counts" }, "position": { "label": "選擇čφ蓋äŊįŊŽ", "foreground": "前景", "background": "čƒŒæ™¯" }, - "submit": "送å‡ē" + "submit": "送å‡ē", + "settings": { + "title": "Settings" + }, + "results": { + "title": "Overlay Results" + }, + "tooltip": { + "header": { + "title": "Overlay PDFs Overview" + }, + "description": { + "title": "Description", + "text": "Combine a base PDF with one or more overlay PDFs. Overlays can be applied page-by-page in different modes and placed in the foreground or background." + }, + "mode": { + "title": "Overlay Mode", + "text": "Choose how to distribute overlay pages across the base PDF pages.", + "sequential": "Sequential Overlay: Use pages from the first overlay PDF until it ends, then move to the next.", + "interleaved": "Interleaved Overlay: Take one page from each overlay in turn.", + "fixedRepeat": "Fixed Repeat Overlay: Take a set number of pages from each overlay before moving to the next. Use Counts to set the numbers." + }, + "position": { + "title": "Overlay Position", + "text": "Foreground places the overlay on top of the page. Background places it behind." + }, + "overlayFiles": { + "title": "Overlay Files", + "text": "Select one or more PDFs to overlay on the base. The order of these files affects how pages are applied in Sequential and Fixed Repeat modes." + }, + "counts": { + "title": "Counts (Fixed Repeat only)", + "text": "Provide a positive number for each overlay file showing how many pages to take before moving to the next. Required when mode is Fixed Repeat." + } + }, + "error": { + "failed": "An error occurred while overlaying PDFs." + } }, "split-by-sections": { "tags": "區æŽĩåˆ†å‰˛, 劃分, č‡Ē訂", @@ -1337,6 +3069,7 @@ "tags": "圖įĢ ,新åĸžåœ–ቇ,中åŋƒåŊąåƒ,æĩŽæ°´å°,PDF,åĩŒå…Ĩ,č‡Ē訂", "header": "圖įĢ  PDF", "title": "圖įĢ  PDF", + "stampSetup": "Stamp Setup", "stampType": "圖įĢ éĄžåž‹", "stampText": "圖įĢ æ–‡å­—", "stampImage": "圖įĢ åœ–į‰‡", @@ -1349,7 +3082,19 @@ "overrideY": "čφ蓋 Y åē§æ¨™", "customMargin": "č‡Ēč¨‚é‚ŠįˇŖ", "customColor": "č‡Ēč¨‚æ–‡å­—éĄč‰˛", - "submit": "送å‡ē" + "submit": "送å‡ē", + "noStampSelected": "No stamp selected. Return to Step 1.", + "customPosition": "Drag the stamp to the desired location in the preview window.", + "error": { + "failed": "An error occurred while adding stamp to the PDF." + }, + "imageSize": "Image Size", + "margin": "Margin", + "positionAndFormatting": "Position & Formatting", + "quickPosition": "Select a position on the page to place the stamp.", + "results": { + "title": "Stamp Results" + } }, "removeImagePdf": { "tags": "į§ģé™¤åœ–į‰‡,頁éĸ操äŊœ,垌į̝,äŧ翜å™¨į̝" @@ -1367,7 +3112,8 @@ "status": { "_value": "į‹€æ…‹", "valid": "有效", - "invalid": "į„Ąæ•ˆ" + "invalid": "į„Ąæ•ˆ", + "complete": "Validation complete" }, "signer": "į°ŊįŊ˛č€…", "date": "æ—Ĩ期", @@ -1394,40 +3140,122 @@ "version": "į‰ˆæœŦ", "keyUsage": "金鑰ᔍ途", "selfSigned": "č‡Ē我į°ŊįŊ˛", - "bits": "äŊå…ƒ" + "bits": "äŊå…ƒ", + "details": "Certificate Details" }, "signature": { "info": "į°ŊįĢ čŗ‡č¨Š", "_value": "į°ŊįĢ ", "mathValid": "į°ŊįĢ åœ¨æ•¸å­¸ä¸Šæœ‰æ•ˆīŧŒäŊ†īŧš" }, - "selectCustomCert": "č‡Ē訂 X.509 æ†‘č­‰æĒ”æĄˆīŧˆé¸åĄĢīŧ‰" - }, - "replace-color": { - "title": "取äģŖ-反čŊ‰éĄč‰˛", - "header": "取äģŖ-反čŊ‰ PDF 顏色", - "selectText": { - "1": "取äģŖæˆ–反čŊ‰éĄč‰˛é¸é …", - "2": "預設īŧˆé č¨­éĢ˜å°æ¯”åēĻ顏色īŧ‰", - "3": "č‡Ē訂īŧˆč‡Ē訂顏色īŧ‰", - "4": "全部反čŊ‰īŧˆåčŊ‰æ‰€æœ‰éĄč‰˛īŧ‰", - "5": "éĢ˜å°æ¯”åēĻ顏色選項", - "6": "éģ‘åē•į™Ŋ字", - "7": "į™Ŋåē•éģ‘å­—", - "8": "éģ‘åē•éģƒå­—", - "9": "éģ‘åē•įļ å­—", - "10": "é¸æ“‡æ–‡å­—éĄč‰˛", - "11": "é¸æ“‡čƒŒæ™¯éĄč‰˛" + "selectCustomCert": "č‡Ē訂 X.509 æ†‘č­‰æĒ”æĄˆīŧˆé¸åĄĢīŧ‰", + "downloadCsv": "Download CSV", + "downloadJson": "Download JSON", + "downloadPdf": "Download PDF Report", + "downloadType": { + "csv": "CSV", + "json": "JSON", + "pdf": "PDF" }, - "submit": "取äģŖ" + "error": { + "allFailed": "Unable to validate the selected files.", + "partial": "Some files could not be validated.", + "reportGeneration": "Could not generate the PDF report. JSON and CSV are available.", + "unexpected": "Unexpected error during validation." + }, + "finalizing": "Preparing downloads...", + "issue": { + "certExpired": "Certificate expired", + "certRevocationUnknown": "Certificate revocation status unknown", + "certRevoked": "Certificate revoked", + "chainInvalid": "Certificate chain invalid", + "signatureInvalid": "Signature cryptographic check failed", + "trustInvalid": "Certificate not trusted" + }, + "noResults": "Run the validation to generate a report.", + "noSignaturesShort": "No signatures", + "processing": "Validating signatures...", + "report": { + "continued": "Continued", + "downloads": "Downloads", + "entryLabel": "Signature Summary", + "fields": { + "created": "Created", + "fileSize": "File Size", + "signatureCount": "Total Signatures", + "signatureDate": "Signature Date" + }, + "filesEvaluated": "{{count}} files evaluated", + "footer": "Validated via Stirling PDF", + "generatedAt": "Generated", + "noPdf": "PDF report will be available after a successful validation.", + "page": "Page", + "shortTitle": "Signature Summary", + "signatureCountLabel": "{{count}} signatures", + "signaturesFound": "{{count}} signatures detected", + "signaturesValid": "{{count}} fully valid", + "title": "Signature Validation Report" + }, + "settings": { + "certHint": "Upload a trusted X.509 certificate to validate against a custom trust source.", + "title": "Validation Settings" + }, + "signatureDate": "Signature Date", + "totalSignatures": "Total Signatures" }, - "replaceColorPdf": { - "tags": "取äģŖéĄč‰˛,頁éĸ操äŊœ,垌į̝,äŧ翜å™¨į̝" + "replaceColor": { + "tags": "Replace Colour,Page operations,Back end,server side", + "labels": { + "settings": "Settings", + "colourOperation": "Colour operation" + }, + "options": { + "highContrast": "High contrast", + "invertAll": "Invert all colours", + "custom": "Custom", + "cmyk": "Convert to CMYK" + }, + "tooltip": { + "header": { + "title": "Replace & Invert Colour Settings Overview" + }, + "description": { + "title": "Description", + "text": "Transform PDF colours to improve readability and accessibility. Choose from high contrast presets, invert all colours, or create custom colour schemes." + }, + "highContrast": { + "title": "High Contrast", + "text": "Apply predefined high contrast colour combinations designed for better readability and accessibility compliance.", + "bullet1": "White text on black background - Classic dark mode", + "bullet2": "Black text on white background - Standard high contrast", + "bullet3": "Yellow text on black background - High visibility option", + "bullet4": "Green text on black background - Alternative high contrast" + }, + "invertAll": { + "title": "Invert All Colours", + "text": "Completely invert all colours in the PDF, creating a negative-like effect. Useful for creating dark mode versions of documents or reducing eye strain in low-light conditions." + }, + "custom": { + "title": "Custom Colours", + "text": "Define your own text and background colours using the colour pickers. Perfect for creating branded documents or specific accessibility requirements.", + "bullet1": "Text colour - Choose the colour for text elements", + "bullet2": "Background colour - Set the background colour for the document" + }, + "cmyk": { + "title": "Convert to CMYK", + "text": "Convert the PDF from RGB colour space to CMYK colour space, optimized for professional printing. This process converts colours to the Cyan, Magenta, Yellow, Black model used by printers." + } + }, + "error": { + "failed": "An error occurred while processing the colour replacement." + } }, "login": { "title": "į™ģå…Ĩ", "header": "į™ģå…Ĩ", "signin": "į™ģå…Ĩ", + "signInWith": "Sign in with", + "signInAnonymously": "Sign Up as a Guest", "rememberme": "記äŊæˆ‘", "invalid": "äŊŋį”¨č€…åį¨ąæˆ–å¯†įĸŧį„Ąæ•ˆã€‚", "locked": "æ‚¨įš„å¸ŗč™Ÿåˇ˛čĸĢ鎖厚。", @@ -1446,12 +3274,83 @@ "alreadyLoggedIn": "æ‚¨åˇ˛įļ“į™ģå…Ĩäē†", "alreadyLoggedIn2": "éƒ¨čŖįŊŽã€‚čĢ‹å…ˆåžžé€™äē›čŖįŊŽį™ģå‡ē垌再čŠĻ一æŦĄã€‚", "toManySessions": "您有å¤Ē多äŊŋį”¨ä¸­įš„åˇĨäŊœéšŽæŽĩ", - "logoutMessage": "æ‚¨åˇ˛į™ģå‡ē。" + "logoutMessage": "æ‚¨åˇ˛į™ģå‡ē。", + "youAreLoggedIn": "You are logged in!", + "email": "Email", + "password": "Password", + "enterEmail": "Enter your email", + "enterPassword": "Enter your password", + "loggingIn": "Logging In...", + "username": "Username", + "enterUsername": "Enter username", + "useEmailInstead": "Login with email", + "forgotPassword": "Forgot your password?", + "logIn": "Log In", + "signingIn": "Signing in...", + "login": "Login", + "or": "Or", + "useMagicLink": "Use magic link instead", + "enterEmailForMagicLink": "Enter your email for magic link", + "sending": "Sendingâ€Ļ", + "sendMagicLink": "Send Magic Link", + "cancel": "Cancel", + "dontHaveAccount": "Don't have an account? Sign up", + "home": "Home", + "debug": "Debug", + "signOut": "Sign Out", + "pleaseEnterBoth": "Please enter both email and password", + "pleaseEnterEmail": "Please enter your email address", + "magicLinkSent": "Magic link sent to {{email}}! Check your email and click the link to sign in.", + "passwordResetSent": "Password reset link sent to {{email}}! Check your email and follow the instructions.", + "failedToSignIn": "Failed to sign in with {{provider}}: {{message}}", + "unexpectedError": "Unexpected error: {{message}}", + "accountCreatedSuccess": "Account created successfully! You can now sign in.", + "passwordChangedSuccess": "Password changed successfully! Please sign in with your new password.", + "credentialsUpdated": "Your credentials have been updated. Please sign in again." + }, + "signup": { + "title": "Create an account", + "subtitle": "Join Stirling PDF to get started", + "name": "Name", + "email": "Email", + "password": "Password", + "confirmPassword": "Confirm password", + "enterName": "Enter your name", + "enterEmail": "Enter your email", + "enterPassword": "Enter your password", + "confirmPasswordPlaceholder": "Confirm password", + "or": "or", + "creatingAccount": "Creating Account...", + "signUp": "Sign Up", + "alreadyHaveAccount": "Already have an account? Sign in", + "pleaseFillAllFields": "Please fill in all fields", + "passwordsDoNotMatch": "Passwords do not match", + "passwordTooShort": "Password must be at least 6 characters long", + "invalidEmail": "Please enter a valid email address", + "checkEmailConfirmation": "Check your email for a confirmation link to complete your registration.", + "accountCreatedSuccessfully": "Account created successfully! You can now sign in.", + "unexpectedError": "Unexpected error: {{message}}", + "useEmailInstead": "Use Email Instead", + "nameRequired": "Name is required", + "emailRequired": "Email is required", + "passwordRequired": "Password is required", + "confirmPasswordRequired": "Please confirm your password" }, "pdfToSinglePage": { "title": "PDF čŊ‰į‚ē喎一頁éĸ", "header": "PDF čŊ‰į‚ē喎一頁éĸ", - "submit": "čŊ‰æ›į‚ē喎一頁éĸ" + "submit": "čŊ‰æ›į‚ē喎一頁éĸ", + "description": "This tool will merge all pages of your PDF into one large single page. The width will remain the same as the original pages, but the height will be the sum of all page heights.", + "filenamePrefix": "single_page", + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "error": { + "failed": "An error occurred whilst converting to single page." + }, + "results": { + "title": "Single Page Results" + } }, "pageExtracter": { "title": "提取頁éĸ", @@ -1475,18 +3374,59 @@ "adjustContrast": { "title": "čĒŋ整對比åēĻ", "header": "čĒŋ整對比åēĻ", + "basic": "Basic Adjustments", "contrast": "對比åēĻīŧš", "brightness": "äēŽåēĻīŧš", "saturation": "éŖŊ和åēĻīŧš", - "download": "下čŧ‰" + "download": "下čŧ‰", + "adjustColors": "Adjust Colors", + "blue": "Blue", + "confirm": "Confirm", + "error": { + "failed": "Failed to adjust colors/contrast" + }, + "green": "Green", + "noPreview": "Select a PDF to preview", + "red": "Red", + "results": { + "title": "Adjusted PDF" + } }, "compress": { "title": "åŖ“į¸Ž", + "desc": "Compress PDFs to reduce their file size.", "header": "åŖ“į¸Ž PDF", + "method": { + "title": "Compression Method", + "quality": "Quality", + "filesize": "æĒ”æĄˆå¤§å°" + }, "credit": "此服務äŊŋᔍ qpdf 進行 PDF åŖ“į¸Ž/最äŊŗåŒ–。", "grayscale": { "label": "åĨ—į”¨į°éšŽé€˛čĄŒåŖ“į¸Ž" }, + "tooltip": { + "header": { + "title": "Compress Settings Overview" + }, + "description": { + "title": "Description", + "text": "Compression is an easy way to reduce your file size. Pick File Size to enter a target size and have us adjust quality for you. Pick Quality to set compression strength manually." + }, + "qualityAdjustment": { + "title": "Quality Adjustment", + "text": "Drag the slider to adjust the compression strength. Lower values (1-3) preserve quality but result in larger files. Higher values (7-9) shrink the file more but reduce image clarity.", + "bullet1": "Lower values preserve quality", + "bullet2": "Higher values reduce file size" + }, + "grayscale": { + "title": "Grayscale", + "text": "Select this option to convert all images to black and white, which can significantly reduce file size especially for scanned PDFs or image-heavy documents." + } + }, + "error": { + "failed": "An error occurred while compressing the PDF." + }, "selectText": { "1": { "_value": "åŖ“į¸Žč¨­åŽš", @@ -1496,10 +3436,7 @@ "4": "č‡Ēå‹•æ¨Ąåŧ - č‡Ē動čĒŋ整品čŗĒäŊŋ PDF é”åˆ°æŒ‡åŽšįš„æĒ”æĄˆå¤§å°", "5": "æŒ‡åŽšįš„ PDF æĒ”æĄˆå¤§å°īŧˆäž‹åĻ‚ 25MB, 10.8MB, 25KBīŧ‰" }, - "submit": "åŖ“į¸Ž", - "method": { - "filesize": "æĒ”æĄˆå¤§å°" - } + "submit": "åŖ“į¸Ž" }, "decrypt": { "passwordPrompt": "æ­¤æĒ”æĄˆåˇ˛å—å¯†įĸŧäŋč­ˇã€‚čĢ‹čŧ¸å…Ĩ密įĸŧīŧš", @@ -1600,7 +3537,13 @@ "title": "į§ģé™¤åœ–į‰‡", "header": "į§ģé™¤åœ–į‰‡", "removeImage": "į§ģé™¤åœ–į‰‡", - "submit": "į§ģé™¤åœ–į‰‡" + "submit": "į§ģé™¤åœ–į‰‡", + "error": { + "failed": "Failed to remove images from the PDF." + }, + "results": { + "title": "Remove Images Results" + } }, "splitByChapters": { "title": "䞝įĢ į¯€åˆ†å‰˛ PDF", @@ -1634,6 +3577,12 @@ }, "note": "į‰ˆæœŦčŗ‡č¨Šåƒ…æäž›č‹ąæ–‡į‰ˆæœŦ" }, + "swagger": { + "title": "API Documentation", + "header": "API Documentation", + "desc": "View and test the Stirling PDF API endpoints", + "tags": "api,documentation,swagger,endpoints,development" + }, "cookieBanner": { "popUp": { "title": "我們åĻ‚äŊ•äŊŋᔍ Cookies", @@ -1669,54 +3618,943 @@ "title": "分析 Cookies", "description": "這äē› Cookies åšĢ劊我們分析您åĻ‚äŊ•äŊŋį”¨æˆ‘å€‘įš„åˇĨå…ˇīŧŒåĨŊčŽ“æˆ‘å€‘čƒŊå°ˆæŗ¨åœ¨æ§‹åģēį¤žįž¤æœ€é‡čĻ–įš„åŠŸčƒŊã€‚å„˜įŽĄæ”žåŋƒâ€”— Stirling PDF 不會且永不čŋŊčš¤æ‚¨įš„æ–‡äģļ" } + }, + "services": { + "posthog": "PostHog Analytics", + "scarf": "Scarf Pixel" } }, - "download": "下čŧ‰", - "undo": "æ’¤éŠˇ", - "convert": { - "title": "čŊ‰æ›", - "settings": "č¨­åŽš", - "color": "顏色", - "greyscale": "ၰåēĻ", - "fillPage": "åĄĢ充頁éĸ", - "pdfaDigitalSignatureWarning": "芲 PDF įš„æ†‘č­‰į°ŊįĢ å°‡æœƒåœ¨ä¸‹ä¸€æ­ĨčĸĢį§ģ除", - "grayscale": "ၰåēĻ" + "removeMetadata": { + "submit": "Remove Metadata" }, - "attachments": { - "tags": "åĩŒå…Ĩ,附äģļ,æĒ”æĄˆ,附加,附äģļįŽĄį†", - "title": "新åĸžé™„äģļ", - "header": "新åĸžé™„äģļ", - "submit": "新åĸžé™„äģļ" + "sidebar": { + "toggle": "Toggle Sidebar" + }, + "theme": { + "toggle": "Toggle Theme" + }, + "view": { + "viewer": "Viewer", + "pageEditor": "Page Editor", + "fileManager": "File Manager" + }, + "pageEditor": { + "title": "Page Editor", + "save": "Save Changes", + "noPdfLoaded": "No PDF loaded. Please upload a PDF to edit.", + "rotatedLeft": "Rotated left:", + "rotatedRight": "Rotated right:", + "deleted": "Deleted:", + "movedLeft": "Moved left:", + "movedRight": "Moved right:", + "splitAt": "Split at:", + "insertedPageBreak": "Inserted page break at:", + "addFileNotImplemented": "Add file not implemented in demo", + "closePdf": "Close PDF", + "reset": "Reset Changes", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "fitToWidth": "Fit to Width", + "actualSize": "Actual Size" + }, + "viewer": { + "firstPage": "First Page", + "lastPage": "Last Page", + "previousPage": "Previous Page", + "nextPage": "Next Page", + "zoomIn": "Zoom In", + "zoomOut": "Zoom Out", + "singlePageView": "Single Page View", + "dualPageView": "Dual Page View" }, "rightRail": { + "closeSelected": "Close Selected Files", "selectAll": "全選", - "deselectAll": "取æļˆå…¨é¸" + "deselectAll": "取æļˆå…¨é¸", + "selectByNumber": "Select by Page Numbers", + "deleteSelected": "Delete Selected Pages", + "closePdf": "Close PDF", + "exportAll": "Export PDF", + "downloadSelected": "Download Selected Files", + "downloadAll": "Download All", + "toggleTheme": "Toggle Theme", + "language": "Language", + "search": "Search PDF", + "panMode": "Pan Mode", + "rotateLeft": "Rotate Left", + "rotateRight": "Rotate Right", + "toggleSidebar": "Toggle Sidebar", + "exportSelected": "Export Selected Pages", + "toggleAnnotations": "Toggle Annotations Visibility", + "annotationMode": "Toggle Annotation Mode", + "draw": "Draw", + "save": "Save" + }, + "search": { + "title": "Search PDF", + "placeholder": "Enter search term...", + "noResults": "No results found", + "searching": "Searching..." + }, + "guestBanner": { + "title": "You're using Stirling PDF as a guest!", + "message": "Create a free account to save your work, access more features, and support the project.", + "dismiss": "Dismiss banner", + "signUp": "Sign Up Free" + }, + "toolPicker": { + "searchPlaceholder": "Search tools...", + "noToolsFound": "No tools found", + "allTools": "ALL TOOLS", + "quickAccess": "QUICK ACCESS", + "categories": { + "standardTools": "Standard Tools", + "advancedTools": "Advanced Tools", + "recommendedTools": "Recommended Tools" + }, + "subcategories": { + "signing": "Signing", + "documentSecurity": "Document Security", + "verification": "Verification", + "documentReview": "Document Review", + "pageFormatting": "Page Formatting", + "extraction": "Extraction", + "removal": "Removal", + "automation": "Automation", + "general": "General", + "advancedFormatting": "Advanced Formatting", + "developerTools": "Developer Tools" + } }, "quickAccess": { - "sign": "į°ŊįĢ " + "read": "Read", + "sign": "į°ŊįĢ ", + "automate": "Automate", + "files": "Files", + "activity": "Activity", + "help": "Help", + "account": "Account", + "config": "Config", + "adminSettings": "Admin Settings", + "allTools": "All Tools" + }, + "admin": { + "error": "Error", + "success": "Success", + "expand": "Expand", + "close": "Close", + "status": { + "active": "Active", + "inactive": "Inactive" + }, + "settings": { + "title": "Admin Settings", + "workspace": "Workspace", + "fetchError": "Failed to load settings", + "saveError": "Failed to save settings", + "saved": "Settings saved successfully", + "saveSuccess": "Settings saved successfully", + "save": "Save Changes", + "restartRequired": "Restart Required", + "restart": { + "title": "Restart Required", + "message": "Settings have been saved successfully. A server restart is required for the changes to take effect.", + "question": "Would you like to restart the server now or later?", + "now": "Restart Now", + "later": "Restart Later" + }, + "restarting": "Restarting Server", + "restartingMessage": "The server is restarting. Please wait a moment...", + "restartError": "Failed to restart server. Please restart manually.", + "general": { + "title": "System Settings", + "description": "Configure system-wide application settings including branding and default behaviour.", + "ui": "User Interface", + "system": "System", + "appName": { + "label": "Application Name", + "description": "The name displayed in the browser tab and home page" + }, + "appNameNavbar": { + "label": "Navbar Brand", + "description": "The name displayed in the navigation bar" + }, + "homeDescription": { + "label": "Home Description", + "description": "The description text shown on the home page" + }, + "defaultLocale": { + "label": "Default Locale", + "description": "The default language for new users (e.g., en_US, es_ES)" + }, + "fileUploadLimit": { + "label": "File Upload Limit", + "description": "Maximum file upload size (e.g., 100MB, 1GB)" + }, + "showUpdate": { + "label": "Show Update Notifications", + "description": "Display notifications when a new version is available" + }, + "showUpdateOnlyAdmin": { + "label": "Show Updates to Admins Only", + "description": "Restrict update notifications to admin users only" + }, + "customHTMLFiles": { + "label": "Custom HTML Files", + "description": "Allow serving custom HTML files from the customFiles directory" + }, + "languages": { + "label": "Available Languages", + "description": "Languages that users can select from (leave empty to enable all languages)" + }, + "customMetadata": { + "label": "Custom Metadata", + "autoUpdate": { + "label": "Auto Update Metadata", + "description": "Automatically update PDF metadata on all processed documents" + }, + "author": { + "label": "Default Author", + "description": "Default author for PDF metadata (e.g., username)" + }, + "creator": { + "label": "Default Creator", + "description": "Default creator for PDF metadata" + }, + "producer": { + "label": "Default Producer", + "description": "Default producer for PDF metadata" + } + }, + "customPaths": { + "label": "Custom Paths", + "description": "Configure custom file system paths for pipeline processing and external tools", + "pipeline": { + "label": "Pipeline Directories", + "watchedFoldersDir": { + "label": "Watched Folders Directory", + "description": "Directory where pipeline monitors for incoming PDFs (leave empty for default: /pipeline/watchedFolders)" + }, + "finishedFoldersDir": { + "label": "Finished Folders Directory", + "description": "Directory where processed PDFs are outputted (leave empty for default: /pipeline/finishedFolders)" + } + }, + "operations": { + "label": "External Tool Paths", + "weasyprint": { + "label": "WeasyPrint Executable", + "description": "Path to WeasyPrint executable for HTML to PDF conversion (leave empty for default: /opt/venv/bin/weasyprint)" + }, + "unoconvert": { + "label": "Unoconvert Executable", + "description": "Path to LibreOffice unoconvert for document conversions (leave empty for default: /opt/venv/bin/unoconvert)" + } + } + } + }, + "security": { + "title": "Security", + "description": "Configure authentication, login behaviour, and security policies.", + "ssoNotice": { + "title": "Looking for SSO/SAML settings?", + "message": "OAuth2 and SAML2 authentication providers have been moved to the Connections menu for easier management." + }, + "authentication": "Authentication", + "enableLogin": { + "label": "Enable Login", + "description": "Require users to log in before accessing the application" + }, + "loginMethod": { + "label": "Login Method", + "description": "The authentication method to use for user login", + "all": "All Methods", + "normal": "Username/Password Only", + "oauth2": "OAuth2 Only", + "saml2": "SAML2 Only" + }, + "loginAttemptCount": { + "label": "Login Attempt Limit", + "description": "Maximum number of failed login attempts before account lockout" + }, + "loginResetTimeMinutes": { + "label": "Login Reset Time (minutes)", + "description": "Time before failed login attempts are reset" + }, + "csrfDisabled": { + "label": "Disable CSRF Protection", + "description": "Disable Cross-Site Request Forgery protection (not recommended)" + }, + "initialLogin": { + "label": "Initial Login", + "username": { + "label": "Initial Username", + "description": "The username for the initial admin account" + }, + "password": { + "label": "Initial Password", + "description": "The password for the initial admin account" + } + }, + "jwt": { + "label": "JWT Configuration", + "secureCookie": { + "label": "Secure Cookie", + "description": "Require HTTPS for JWT cookies (recommended for production)" + }, + "keyRetentionDays": { + "label": "Key Retention Days", + "description": "Number of days to retain old JWT keys for verification" + }, + "persistence": { + "label": "Enable Key Persistence", + "description": "Store JWT keys persistently to survive server restarts" + }, + "enableKeyRotation": { + "label": "Enable Key Rotation", + "description": "Automatically rotate JWT signing keys periodically" + }, + "enableKeyCleanup": { + "label": "Enable Key Cleanup", + "description": "Automatically remove expired JWT keys" + } + }, + "audit": { + "label": "Audit Logging", + "enabled": { + "label": "Enable Audit Logging", + "description": "Track user actions and system events for compliance and security monitoring" + }, + "level": { + "label": "Audit Level", + "description": "0=OFF, 1=BASIC, 2=STANDARD, 3=VERBOSE" + }, + "retentionDays": { + "label": "Audit Retention (days)", + "description": "Number of days to retain audit logs" + } + }, + "htmlUrlSecurity": { + "label": "HTML URL Security", + "description": "Configure URL access restrictions for HTML processing to prevent SSRF attacks", + "enabled": { + "label": "Enable URL Security", + "description": "Enable URL security restrictions for HTML to PDF conversions" + }, + "level": { + "label": "Security Level", + "description": "MAX: whitelist only, MEDIUM: block internal networks, OFF: no restrictions", + "max": "Maximum (Whitelist Only)", + "medium": "Medium (Block Internal)", + "off": "Off (No Restrictions)" + }, + "advanced": "Advanced Settings", + "allowedDomains": { + "label": "Allowed Domains (Whitelist)", + "description": "One domain per line (e.g., cdn.example.com). Only these domains allowed when level is MAX" + }, + "blockedDomains": { + "label": "Blocked Domains (Blacklist)", + "description": "One domain per line (e.g., malicious.com). Additional domains to block" + }, + "internalTlds": { + "label": "Internal TLDs", + "description": "One TLD per line (e.g., .local, .internal). Block domains with these TLD patterns" + }, + "networkBlocking": "Network Blocking", + "blockPrivateNetworks": { + "label": "Block Private Networks", + "description": "Block RFC 1918 private networks (10.x.x.x, 192.168.x.x, 172.16-31.x.x)" + }, + "blockLocalhost": { + "label": "Block Localhost", + "description": "Block localhost and loopback addresses (127.x.x.x, ::1)" + }, + "blockLinkLocal": { + "label": "Block Link-Local Addresses", + "description": "Block link-local addresses (169.254.x.x, fe80::/10)" + }, + "blockCloudMetadata": { + "label": "Block Cloud Metadata Endpoints", + "description": "Block cloud provider metadata endpoints (169.254.169.254)" + } + } + }, + "connections": { + "title": "Connections", + "description": "Configure external authentication providers like OAuth2 and SAML.", + "linkedServices": "Linked Services", + "unlinkedServices": "Unlinked Services", + "connect": "Connect", + "disconnect": "Disconnect", + "disconnected": "Provider disconnected successfully", + "disconnectError": "Failed to disconnect provider", + "ssoAutoLogin": { + "label": "SSO Auto Login", + "enable": "Enable SSO Auto Login", + "description": "Automatically redirect to SSO login when authentication is required" + }, + "oauth2": { + "label": "OAuth2", + "enabled": { + "label": "Enable OAuth2", + "description": "Allow users to authenticate using OAuth2 providers" + }, + "provider": { + "label": "Provider", + "description": "The OAuth2 provider to use for authentication" + }, + "issuer": { + "label": "Issuer URL", + "description": "The OAuth2 provider issuer URL" + }, + "clientId": { + "label": "Client ID", + "description": "The OAuth2 client ID from your provider" + }, + "clientSecret": { + "label": "Client Secret", + "description": "The OAuth2 client secret from your provider" + }, + "useAsUsername": { + "label": "Use as Username", + "description": "The OAuth2 claim to use as the username (e.g., email, sub)" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first OAuth2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via OAuth2" + }, + "scopes": { + "label": "OAuth2 Scopes", + "description": "Comma-separated list of OAuth2 scopes to request (e.g., openid, profile, email)" + } + }, + "saml2": { + "label": "SAML2", + "enabled": { + "label": "Enable SAML2", + "description": "Allow users to authenticate using SAML2 providers" + }, + "provider": { + "label": "Provider", + "description": "The SAML2 provider name" + }, + "registrationId": { + "label": "Registration ID", + "description": "The SAML2 registration identifier" + }, + "autoCreateUser": { + "label": "Auto Create Users", + "description": "Automatically create user accounts on first SAML2 login" + }, + "blockRegistration": { + "label": "Block Registration", + "description": "Prevent new user registration via SAML2" + } + } + }, + "database": { + "title": "Database", + "description": "Configure custom database connection settings for enterprise deployments.", + "configuration": "Database Configuration", + "enableCustom": { + "label": "Enable Custom Database", + "description": "Use your own custom database configuration instead of the default embedded database" + }, + "customUrl": { + "label": "Custom Database URL", + "description": "Full JDBC connection string (e.g., jdbc:postgresql://localhost:5432/postgres). If provided, individual connection settings below are not used." + }, + "type": { + "label": "Database Type", + "description": "Type of database (not used if custom URL is provided)" + }, + "hostName": { + "label": "Host Name", + "description": "Database server hostname (not used if custom URL is provided)" + }, + "port": { + "label": "Port", + "description": "Database server port (not used if custom URL is provided)" + }, + "name": { + "label": "Database Name", + "description": "Name of the database (not used if custom URL is provided)" + }, + "username": { + "label": "Username", + "description": "Database authentication username" + }, + "password": { + "label": "Password", + "description": "Database authentication password" + } + }, + "privacy": { + "title": "Privacy", + "description": "Configure privacy and data collection settings.", + "analytics": "Analytics & Tracking", + "enableAnalytics": { + "label": "Enable Analytics", + "description": "Collect anonymous usage analytics to help improve the application" + }, + "metricsEnabled": { + "label": "Enable Metrics", + "description": "Enable collection of performance and usage metrics. Provides API endpoint for admins to access metrics data" + }, + "searchEngine": "Search Engine Visibility", + "googleVisibility": { + "label": "Google Visibility", + "description": "Allow search engines to index this application" + } + }, + "advanced": { + "title": "Advanced", + "description": "Configure advanced features and experimental functionality.", + "features": "Feature Flags", + "processing": "Processing", + "endpoints": { + "label": "Endpoints", + "manage": "Manage API Endpoints", + "description": "Endpoint management is configured via YAML. See documentation for details on enabling/disabling specific endpoints." + }, + "enableAlphaFunctionality": { + "label": "Enable Alpha Features", + "description": "Enable experimental and alpha-stage features (may be unstable)" + }, + "enableUrlToPDF": { + "label": "Enable URL to PDF", + "description": "Allow conversion of web pages to PDF documents" + }, + "maxDPI": { + "label": "Maximum DPI", + "description": "Maximum DPI for image processing (0 = unlimited)" + }, + "tessdataDir": { + "label": "Tessdata Directory", + "description": "Path to the tessdata directory for OCR language files" + }, + "disableSanitize": { + "label": "Disable HTML Sanitization", + "description": "WARNING: Security risk - disabling HTML sanitization can lead to XSS vulnerabilities" + }, + "tempFileManagement": { + "label": "Temp File Management", + "description": "Configure temporary file storage and cleanup behavior", + "baseTmpDir": { + "label": "Base Temp Directory", + "description": "Base directory for temporary files (leave empty for default: java.io.tmpdir/stirling-pdf)" + }, + "libreofficeDir": { + "label": "LibreOffice Temp Directory", + "description": "Directory for LibreOffice temp files (leave empty for default: baseTmpDir/libreoffice)" + }, + "systemTempDir": { + "label": "System Temp Directory", + "description": "System temp directory to clean (only used if cleanupSystemTemp is enabled)" + }, + "prefix": { + "label": "Temp File Prefix", + "description": "Prefix for temp file names" + }, + "maxAgeHours": { + "label": "Max Age (hours)", + "description": "Maximum age in hours before temp files are cleaned up" + }, + "cleanupIntervalMinutes": { + "label": "Cleanup Interval (minutes)", + "description": "How often to run cleanup (in minutes)" + }, + "startupCleanup": { + "label": "Startup Cleanup", + "description": "Clean up old temp files on application startup" + }, + "cleanupSystemTemp": { + "label": "Cleanup System Temp", + "description": "Whether to clean broader system temp directory (use with caution)" + } + }, + "processExecutor": { + "label": "Process Executor Limits", + "description": "Configure session limits and timeouts for each process executor", + "sessionLimit": { + "label": "Session Limit", + "description": "Maximum concurrent instances" + }, + "timeout": { + "label": "Timeout (minutes)", + "description": "Maximum execution time" + }, + "libreOffice": "LibreOffice", + "pdfToHtml": "PDF to HTML", + "qpdf": "QPDF", + "tesseract": "Tesseract OCR", + "pythonOpenCv": "Python OpenCV", + "weasyPrint": "WeasyPrint", + "installApp": "Install App", + "calibre": "Calibre", + "ghostscript": "Ghostscript", + "ocrMyPdf": "OCRmyPDF" + } + }, + "mail": { + "title": "Mail Server", + "description": "Configure SMTP settings for sending email notifications.", + "smtp": "SMTP Configuration", + "enabled": { + "label": "Enable Mail", + "description": "Enable email notifications and SMTP functionality" + }, + "host": { + "label": "SMTP Host", + "description": "The hostname or IP address of your SMTP server" + }, + "port": { + "label": "SMTP Port", + "description": "The port number for SMTP connection (typically 25, 465, or 587)" + }, + "username": { + "label": "SMTP Username", + "description": "Username for SMTP authentication" + }, + "password": { + "label": "SMTP Password", + "description": "Password for SMTP authentication" + }, + "from": { + "label": "From Address", + "description": "The email address to use as the sender" + }, + "enableInvites": { + "label": "Enable Email Invites", + "description": "Allow admins to invite users via email with auto-generated passwords" + }, + "frontendUrl": { + "label": "Frontend URL", + "description": "Base URL for frontend (e.g. https://pdf.example.com). Used for generating invite links in emails. Leave empty to use backend URL." + } + }, + "legal": { + "title": "Legal Documents", + "description": "Configure links to legal documents and policies.", + "disclaimer": { + "title": "Legal Responsibility Warning", + "message": "By customizing these legal documents, you assume full responsibility for ensuring compliance with all applicable laws and regulations, including but not limited to GDPR and other EU data protection requirements. Only modify these settings if: (1) you are operating a personal/private instance, (2) you are outside EU jurisdiction and understand your local legal obligations, or (3) you have obtained proper legal counsel and accept sole responsibility for all user data and legal compliance. Stirling-PDF and its developers assume no liability for your legal obligations." + }, + "termsAndConditions": { + "label": "Terms and Conditions", + "description": "URL or filename to terms and conditions" + }, + "privacyPolicy": { + "label": "Privacy Policy", + "description": "URL or filename to privacy policy" + }, + "accessibilityStatement": { + "label": "Accessibility Statement", + "description": "URL or filename to accessibility statement" + }, + "cookiePolicy": { + "label": "Cookie Policy", + "description": "URL or filename to cookie policy" + }, + "impressum": { + "label": "Impressum", + "description": "URL or filename to impressum (required in some jurisdictions)" + } + }, + "premium": { + "title": "Premium & Enterprise", + "description": "Configure your premium or enterprise license key.", + "license": "License Configuration", + "key": { + "label": "License Key", + "description": "Enter your premium or enterprise license key" + }, + "enabled": { + "label": "Enable Premium Features", + "description": "Enable license key checks for pro/enterprise features" + }, + "movedFeatures": { + "title": "Premium Features Distributed", + "message": "Premium and Enterprise features are now organized in their respective sections:" + } + }, + "features": { + "title": "Features", + "description": "Configure optional features and functionality.", + "serverCertificate": { + "label": "Server Certificate", + "description": "Configure server-side certificate generation for \"Sign with Stirling-PDF\" functionality", + "enabled": { + "label": "Enable Server Certificate", + "description": "Enable server-side certificate for \"Sign with Stirling-PDF\" option" + }, + "organizationName": { + "label": "Organization Name", + "description": "Organization name for generated certificates" + }, + "validity": { + "label": "Certificate Validity (days)", + "description": "Number of days the certificate will be valid" + }, + "regenerateOnStartup": { + "label": "Regenerate on Startup", + "description": "Generate new certificate on each application startup" + } + } + }, + "endpoints": { + "title": "API Endpoints", + "description": "Control which API endpoints and endpoint groups are available.", + "management": "Endpoint Management", + "toRemove": { + "label": "Disabled Endpoints", + "description": "Select individual endpoints to disable" + }, + "groupsToRemove": { + "label": "Disabled Endpoint Groups", + "description": "Select endpoint groups to disable" + }, + "note": "Note: Disabling endpoints restricts API access but does not remove UI components. Restart required for changes to take effect." + } + } }, "fileUpload": { + "selectFile": "Select a file", + "selectFiles": "Select files", + "selectPdfToView": "Select a PDF to view", + "selectPdfToEdit": "Select a PDF to edit", + "chooseFromStorage": "Choose a file from storage or upload a new PDF", + "chooseFromStorageMultiple": "Choose files from storage or upload new PDFs", + "loadFromStorage": "Load from Storage", + "filesAvailable": "files available", "loading": "čŧ‰å…Ĩ中...", - "or": "或" + "or": "或", + "dropFileHere": "Drop file here or click to upload", + "dropFilesHere": "Drop files here or click the upload button", + "pdfFilesOnly": "PDF files only", + "supportedFileTypes": "Supported file types", + "upload": "Upload", + "uploadFile": "Upload File", + "uploadFiles": "Upload Files", + "noFilesInStorage": "No files available in storage. Upload some files first.", + "selectFromStorage": "Select from Storage", + "backToTools": "Back to Tools", + "addFiles": "Add Files", + "dragFilesInOrClick": "Drag files in or click \"Add Files\" to browse" + }, + "fileEditor": { + "addFiles": "Add Files" }, "fileManager": { + "title": "Upload PDF Files", + "subtitle": "Add files to your storage for easy access across tools", + "filesSelected": "files selected", + "clearSelection": "Clear Selection", + "openInFileEditor": "Open in File Editor", + "uploadError": "Failed to upload some files.", + "failedToOpen": "Failed to open file. It may have been removed from storage.", + "failedToLoad": "Failed to load file to active set.", + "storageCleared": "Browser cleared storage. Files have been removed. Please re-upload.", + "clearAll": "Clear All", + "reloadFiles": "Reload Files", + "dragDrop": "Drag & Drop files here", + "clickToUpload": "Click to upload files", + "selectedFiles": "Selected Files", + "storage": "Storage", + "filesStored": "files stored", + "storageError": "Storage error occurred", + "storageLow": "Storage is running low. Consider removing old files.", + "supportMessage": "Powered by browser database storage for unlimited capacity", + "noFileSelected": "No files selected", + "showHistory": "Show History", + "hideHistory": "Hide History", + "fileHistory": "File History", + "loadingHistory": "Loading History...", + "lastModified": "Last Modified", + "toolChain": "Tools Applied", + "restore": "Restore", + "unzip": "Unzip", + "searchFiles": "Search files...", + "recent": "Recent", + "localFiles": "Local Files", + "googleDrive": "Google Drive", + "googleDriveShort": "Drive", + "myFiles": "My Files", + "noRecentFiles": "No recent files found", + "googleDriveNotAvailable": "Google Drive integration not available", + "openFiles": "Open Files", + "openFile": "Open File", + "details": "File Details", "fileName": "åį¨ą", + "fileFormat": "Format", + "fileSize": "Size", "fileVersion": "į‰ˆæœŦ", + "totalSelected": "Total Selected", + "dropFilesHere": "Drop files here", "selectAll": "全選", "deselectAll": "取æļˆå…¨é¸", "deleteSelected": "åˆĒé™¤åˇ˛é¸å–įš„é …į›Ž", + "downloadSelected": "Download Selected", + "selectedCount": "{{count}} selected", "download": "下čŧ‰", - "delete": "åˆĒ除" + "delete": "åˆĒ除", + "unsupported": "Unsupported", + "addToUpload": "Add to Upload", + "deleteAll": "Delete All", + "loadingFiles": "Loading files...", + "noFiles": "No files available", + "noFilesFound": "No files found matching your search", + "openInPageEditor": "Open in Page Editor", + "showAll": "Show All", + "sortByDate": "Sort by Date", + "sortByName": "Sort by Name", + "sortBySize": "Sort by Size" + }, + "storage": { + "temporaryNotice": "Files are stored temporarily in your browser and may be cleared automatically", + "storageLimit": "Storage limit", + "storageUsed": "Temporary Storage used", + "storageFull": "Storage is nearly full. Consider removing some files.", + "fileTooLarge": "File too large. Maximum size per file is", + "storageQuotaExceeded": "Storage quota exceeded. Please remove some files before uploading more.", + "approximateSize": "Approximate size" }, "sanitize": { + "title": "Sanitise", + "desc": "Remove potentially harmful elements from PDF files.", "submit": "æ¸…į† PDF", + "completed": "Sanitisation completed successfully", + "error": { + "generic": "Sanitisation failed", + "failed": "An error occurred while sanitising the PDF." + }, + "filenamePrefix": "sanitised", + "sanitizationResults": "Sanitisation Results", "steps": { - "settings": "č¨­åŽš" + "files": "Files", + "settings": "č¨­åŽš", + "results": "Results" + }, + "files": { + "placeholder": "Select a PDF file in the main view to get started" + }, + "options": { + "title": "Sanitisation Options", + "note": "Select the elements you want to remove from the PDF. At least one option must be selected.", + "removeJavaScript": { + "label": "Remove JavaScript", + "desc": "Remove JavaScript actions and scripts from the PDF" + }, + "removeEmbeddedFiles": { + "label": "Remove Embedded Files", + "desc": "Remove any files embedded within the PDF" + }, + "removeXMPMetadata": { + "label": "Remove XMP Metadata", + "desc": "Remove XMP metadata from the PDF" + }, + "removeMetadata": { + "label": "Remove Document Metadata", + "desc": "Remove document information metadata (title, author, etc.)" + }, + "removeLinks": { + "label": "Remove Links", + "desc": "Remove external links and launch actions from the PDF" + }, + "removeFonts": { + "label": "Remove Fonts", + "desc": "Remove embedded fonts from the PDF" + } + } + }, + "addPassword": { + "title": "新åĸžå¯†įĸŧ", + "desc": "Encrypt your PDF document with a password.", + "completed": "Password protection applied", + "submit": "加密", + "filenamePrefix": "encrypted", + "error": { + "failed": "An error occurred while encrypting the PDF." + }, + "passwords": { + "stepTitle": "Passwords & Encryption", + "completed": "Passwords configured", + "user": { + "label": "User Password", + "placeholder": "Enter user password" + }, + "owner": { + "label": "Owner Password", + "placeholder": "Enter owner password" + } + }, + "encryption": { + "keyLength": { + "label": "Encryption Key Length", + "40bit": "40-bit (Low)", + "128bit": "128-bit (Standard)", + "256bit": "256-bit (High)" + } + }, + "results": { + "title": "Encrypted PDFs" + }, + "tooltip": { + "header": { + "title": "Password Protection Overview" + }, + "passwords": { + "title": "Password Types", + "text": "User passwords restrict opening the document, while owner passwords control what can be done with the document once opened. You can set both or just one.", + "bullet1": "User Password: Required to open the PDF", + "bullet2": "Owner Password: Controls document permissions (not supported by all PDF viewers)" + }, + "encryption": { + "title": "Encryption Levels", + "text": "Higher encryption levels provide better security but may not be supported by older PDF viewers.", + "bullet1": "40-bit: Basic security, compatible with older viewers", + "bullet2": "128-bit: Standard security, widely supported", + "bullet3": "256-bit: Maximum security, requires modern viewers" + }, + "permissions": { + "title": "čŽŠæ›´æŦŠé™", + "text": "These permissions control what users can do with the PDF. Most effective when combined with an owner password." + } + }, + "tags": "厉全,厉全性", + "header": "新åĸžå¯†įĸŧīŧˆåР坆īŧ‰", + "selectText": { + "1": "選擇čĻåŠ å¯†įš„ PDF", + "2": "äŊŋᔍ者坆įĸŧ", + "3": "åŠ å¯†é‡‘é‘°é•ˇåēĻ", + "4": "čŧƒéĢ˜įš„å€ŧ更åŧˇīŧŒäŊ†čŧƒäŊŽįš„å€ŧå…ˇæœ‰æ›´åĨŊįš„į›¸åŽšæ€§ã€‚", + "5": "čĻč¨­åŽšįš„æŦŠé™īŧˆåģēč­°čˆ‡æ“æœ‰č€…å¯†įĸŧ一čĩˇäŊŋᔍīŧ‰", + "6": "防æ­ĸ文äģļįĩ„čŖ", + "7": "防æ­ĸ內厚提取", + "8": "防æ­ĸį‚ēäē†į„Ąéšœį¤™äŊŋį”¨č€Œæå–čŗ‡æ–™", + "9": "防æ­ĸåĄĢå¯ĢčĄ¨å–Ž", + "10": "防æ­ĸäŋŽæ”š", + "11": "防æ­ĸč¨ģ釋äŋŽæ”š", + "12": "防æ­ĸ列印", + "13": "防æ­ĸ列印不同æ ŧåŧ", + "14": "æ“æœ‰č€…å¯†įĸŧ", + "15": "限åˆļ一æ—Ļ開啟文äģļ可äģĨ做äģ€éēŧīŧˆä¸Ļ非所有čģŸéĢ”éƒŊ支援īŧ‰", + "16": "限åˆļ開啟文äģᅵŦčēĢ" } }, "changePermissions": { "title": "čŽŠæ›´æŦŠé™", + "desc": "Change document restrictions and permissions.", + "completed": "Permissions changed", "submit": "čŽŠæ›´æŦŠé™", + "error": { + "failed": "An error occurred while changing PDF permissions." + }, "permissions": { "preventAssembly": { "label": "防æ­ĸ文äģļįĩ„čŖ" @@ -1743,10 +4581,784 @@ "label": "防æ­ĸ列印不同æ ŧåŧ" } }, + "results": { + "title": "Modified PDFs" + }, "tooltip": { "header": { "title": "čŽŠæ›´æŦŠé™" + }, + "description": { + "text": "Changes document permissions, allowing/disallowing access to different features in PDF readers." + }, + "warning": { + "text": "To make these permissions unchangeable, use the Add Password tool to set an owner password." } } + }, + "removePassword": { + "title": "į§ģ除密įĸŧ", + "desc": "åžžæ‚¨įš„ PDF æĒ”æĄˆä¸­į§ģ除密įĸŧäŋč­ˇã€‚", + "tags": "厉全,觪坆,厉全性,取æļˆå¯†įĸŧ,åˆĒ除密įĸŧ", + "password": { + "stepTitle": "į§ģ除密įĸŧ", + "label": "į›Žå‰å¯†įĸŧ", + "placeholder": "Enter current password", + "completed": "Password configured" + }, + "filenamePrefix": "decrypted", + "error": { + "failed": "An error occurred while removing the password from the PDF." + }, + "tooltip": { + "description": "Removing password protection requires the password that was used to encrypt the PDF. This will decrypt the document, making it accessible without a password." + }, + "submit": "į§ģ除", + "results": { + "title": "Decrypted PDFs" + }, + "header": "į§ģ除密įĸŧīŧˆč§Ŗå¯†īŧ‰", + "selectText": { + "1": "選擇čĻč§Ŗå¯†įš„ PDF", + "2": "密įĸŧ" + } + }, + "automate": { + "title": "Automate", + "desc": "Build multi-step workflows by chaining together PDF actions. Ideal for recurring tasks.", + "invalidStep": "Invalid step", + "files": { + "placeholder": "Select files to process with this automation" + }, + "selection": { + "title": "Automation Selection", + "saved": { + "title": "Saved" + }, + "createNew": { + "title": "Create New Automation" + }, + "suggested": { + "title": "Suggested" + } + }, + "creation": { + "createTitle": "Create Automation", + "editTitle": "Edit Automation", + "intro": "Automations run tools sequentially. To get started, add tools in the order you want them to run.", + "name": { + "label": "Automation Name", + "placeholder": "My Automation" + }, + "description": { + "label": "Description (optional)", + "placeholder": "Describe what this automation does..." + }, + "tools": { + "selectTool": "Select a tool...", + "selected": "Selected Tools", + "remove": "Remove tool", + "configure": "Configure tool", + "notConfigured": "! Not Configured", + "addTool": "Add Tool", + "add": "Add a tool..." + }, + "save": "Save Automation", + "unsavedChanges": { + "title": "Unsaved Changes", + "message": "You have unsaved changes. Are you sure you want to go back? All changes will be lost.", + "cancel": "Cancel", + "confirm": "Go Back" + }, + "icon": { + "label": "Icon" + } + }, + "run": { + "title": "Run Automation" + }, + "sequence": { + "unnamed": "Unnamed Automation", + "steps": "{{count}} steps", + "running": "Running Automation...", + "run": "Run Automation", + "finish": "Finish" + }, + "reviewTitle": "Automation Results", + "config": { + "loading": "Loading tool configuration...", + "noSettings": "This tool does not have configurable settings.", + "title": "Configure {{toolName}}", + "description": "Configure the settings for this tool. These settings will be applied when the automation runs.", + "cancel": "Cancel", + "save": "Save Configuration" + }, + "copyToSaved": "Copy to Saved" + }, + "automation": { + "suggested": { + "securePdfIngestion": "Secure PDF Ingestion", + "securePdfIngestionDesc": "Comprehensive PDF processing workflow that sanitises documents, applies OCR with cleanup, converts to PDF/A format for long-term archival, and optimises file size.", + "emailPreparation": "Email Preparation", + "emailPreparationDesc": "Optimises PDFs for email distribution by compressing files, splitting large documents into 20MB chunks for email compatibility, and removing metadata for privacy.", + "secureWorkflow": "Security Workflow", + "secureWorkflowDesc": "Secures PDF documents by removing potentially malicious content like JavaScript and embedded files, then adds password protection to prevent unauthorised access. Password is set to 'password' by default.", + "processImages": "Process Images", + "processImagesDesc": "Converts multiple image files into a single PDF document, then applies OCR technology to extract searchable text from the images." + } + }, + "common": { + "copy": "Copy", + "copied": "Copied!", + "refresh": "Refresh", + "retry": "Retry", + "remaining": "remaining", + "used": "used", + "available": "available", + "cancel": "Cancel", + "preview": "Preview" + }, + "config": { + "overview": { + "title": "Application Configuration", + "description": "Current application settings and configuration details." + }, + "account": { + "overview": { + "title": "Account Settings", + "manageAccountPreferences": "Manage your account preferences", + "guestDescription": "You are signed in as a guest. Consider upgrading your account above." + }, + "upgrade": { + "title": "Upgrade Guest Account", + "description": "Link your account to preserve your history and access more features!", + "socialLogin": "Upgrade with Social Account", + "linkWith": "Link with", + "emailPassword": "or enter your email & password", + "email": "Email", + "emailPlaceholder": "Enter your email", + "password": "Password (optional)", + "passwordPlaceholder": "Set a password", + "passwordNote": "Leave empty to use email verification only", + "upgradeButton": "Upgrade Account" + } + }, + "apiKeys": { + "description": "Your API key for accessing Stirling's suite of PDF tools. Copy it to your project or refresh to generate a new one.", + "publicKeyAriaLabel": "Public API key", + "copyKeyAriaLabel": "Copy API key", + "refreshAriaLabel": "Refresh API key", + "includedCredits": "Included credits", + "purchasedCredits": "Purchased credits", + "totalCredits": "Total Credits", + "chartAriaLabel": "Credits usage: included {{includedUsed}} of {{includedTotal}}, purchased {{purchasedUsed}} of {{purchasedTotal}}", + "nextReset": "Next Reset", + "lastApiUse": "Last API Use", + "overlayMessage": "Generate a key to see credits and available credits", + "label": "API Key", + "guestInfo": "Guest users do not receive API keys. Create an account to get an API key you can use in your applications.", + "goToAccount": "Go to Account", + "refreshModal": { + "title": "Refresh API Keys", + "warning": "âš ī¸ Warning: This action will generate new API keys and make your previous keys invalid.", + "impact": "Any applications or services currently using these keys will stop working until you update them with the new keys.", + "confirmPrompt": "Are you sure you want to continue?", + "confirmCta": "Refresh Keys" + }, + "generateError": "We couldn't generate your API key." + } + }, + "AddAttachmentsRequest": { + "attachments": "Select Attachments", + "info": "Select files to attach to your PDF. These files will be embedded and accessible through the PDF's attachment panel.", + "selectFiles": "Select Files to Attach", + "placeholder": "Choose files...", + "addMoreFiles": "Add more files...", + "selectedFiles": "Selected Files", + "submit": "Add Attachments", + "results": { + "title": "Attachment Results" + }, + "error": { + "failed": "Add attachments operation failed" + } + }, + "termsAndConditions": "Terms & Conditions", + "logOut": "Log out", + "addAttachments": { + "error": { + "failed": "An error occurred while adding attachments to the PDF." + } + }, + "autoRename": { + "description": "This tool will automatically rename PDF files based on their content. It analyzes the document to find the most suitable title from the text." + }, + "customPosition": "Custom Position", + "details": "Details", + "downloadUnavailable": "Download unavailable for this item", + "invalidUndoData": "Cannot undo: invalid operation data", + "margin": { + "large": "Large", + "medium": "Medium", + "small": "Small", + "xLarge": "Extra Large" + }, + "noFilesToUndo": "Cannot undo: no files were processed in the last operation", + "noOperationToUndo": "No operation to undo", + "noValidFiles": "No valid files to process", + "operationCancelled": "Operation cancelled", + "pageEdit": { + "deselectAll": "Select None", + "selectAll": "Select All" + }, + "quickPosition": "Quick Position", + "reorganizePages": { + "error": { + "failed": "Failed to reorganize pages" + }, + "results": { + "title": "Pages Reorganized" + }, + "settings": { + "title": "Settings" + }, + "submit": "Reorganize Pages" + }, + "replace-color": { + "options": { + "fill": "Fill colour", + "gradient": "Gradient" + }, + "previewOverlayOpacity": "Preview overlay opacity", + "previewOverlayTransparency": "Preview overlay transparency", + "previewOverlayVisibility": "Show preview overlay", + "selectText": { + "1": "取äģŖæˆ–反čŊ‰éĄč‰˛é¸é …", + "2": "預設īŧˆé č¨­éĢ˜å°æ¯”åēĻ顏色īŧ‰", + "3": "č‡Ē訂īŧˆč‡Ē訂顏色īŧ‰", + "4": "全部反čŊ‰īŧˆåčŊ‰æ‰€æœ‰éĄč‰˛īŧ‰", + "5": "éĢ˜å°æ¯”åēĻ顏色選項", + "6": "éģ‘åē•į™Ŋ字", + "7": "į™Ŋåē•éģ‘å­—", + "8": "éģ‘åē•éģƒå­—", + "9": "éģ‘åē•įļ å­—", + "10": "é¸æ“‡æ–‡å­—éĄč‰˛", + "11": "é¸æ“‡čƒŒæ™¯éĄč‰˛", + "12": "Choose start colour", + "13": "Choose end colour" + }, + "submit": "取äģŖ", + "title": "取äģŖ-反čŊ‰éĄč‰˛", + "header": "取äģŖ-反čŊ‰ PDF 顏色" + }, + "size": "Size", + "submit": "Submit", + "success": "Success", + "tools": { + "noSearchResults": "No tools found", + "noTools": "No tools available" + }, + "undoDataMismatch": "Cannot undo: operation data is corrupted", + "undoFailed": "Failed to undo operation", + "undoQuotaError": "Cannot undo: insufficient storage space", + "undoStorageError": "Undo completed but some files could not be saved to storage", + "undoSuccess": "Operation undone successfully", + "unsupported": "Unsupported", + "onboarding": { + "welcomeModal": { + "title": "Welcome to Stirling PDF!", + "description": "Would you like to take a quick 1-minute tour to learn the key features and how to get started?", + "helpHint": "You can always access this tour later from the Help button in the bottom left.", + "startTour": "Start Tour", + "maybeLater": "Maybe Later", + "dontShowAgain": "Don't Show Again" + }, + "allTools": "This is the All Tools panel, where you can browse and select from all available PDF tools.", + "selectCropTool": "Let's select the Crop tool to demonstrate how to use one of the tools.", + "toolInterface": "This is the Crop tool interface. As you can see, there's not much there because we haven't added any PDF files to work with yet.", + "filesButton": "The Files button on the Quick Access bar allows you to upload PDFs to use the tools on.", + "fileSources": "You can upload new files or access recent files from here. For the tour, we'll just use a sample file.", + "workbench": "This is the Workbench - the main area where you view and edit your PDFs.", + "viewSwitcher": "Use these controls to select how you want to view your PDFs.", + "viewer": "The Viewer lets you read and annotate your PDFs.", + "pageEditor": "The Page Editor allows you to do various operations on the pages within your PDFs, such as reordering, rotating and deleting.", + "activeFiles": "The Active Files view shows all of the PDFs you have loaded into the tool, and allows you to select which ones to process.", + "fileCheckbox": "Clicking one of the files selects it for processing. You can select multiple files for batch operations.", + "selectControls": "The Right Rail contains buttons to quickly select/deselect all of your active PDFs, along with buttons to change the app's theme or language.", + "cropSettings": "Now that we've selected the file we want crop, we can configure the Crop tool to choose the area that we want to crop the PDF to.", + "runButton": "Once the tool has been configured, this button allows you to run the tool on all the selected PDFs.", + "results": "After the tool has finished running, the Review step will show a preview of the results in this panel, and allow you to undo the operation or download the file. ", + "fileReplacement": "The modified file will replace the original file in the Workbench automatically, allowing you to easily run it through more tools.", + "pinButton": "You can use the Pin button if you'd rather your files stay active after running tools on them.", + "wrapUp": "You're all set! You've learnt about the main areas of the app and how to use them. Click the Help button whenever you like to see this tour again.", + "previous": "Previous", + "next": "Next", + "finish": "Finish", + "startTour": "Start Tour", + "startTourDescription": "Take a guided tour of Stirling PDF's key features" + }, + "workspace": { + "title": "Workspace", + "people": { + "title": "People", + "description": "Manage workspace members and their permissions", + "loading": "Loading people...", + "searchMembers": "Search members...", + "addMembers": "Add Members", + "inviteMembers": { + "label": "Invite Members", + "subtitle": "Type or paste in emails below, separated by commas. Your workspace will be billed by members." + }, + "user": "User", + "role": "Role", + "team": "Team", + "status": "Status", + "actions": "Actions", + "noMembersFound": "No members found", + "active": "Active", + "disabled": "Disabled", + "activeSession": "Active session", + "member": "Member", + "admin": "Admin", + "roleDescriptions": { + "admin": "Can manage settings and invite members, with full administrative access.", + "member": "Can view and edit shared files, but cannot manage workspace settings or members." + }, + "editRole": "Edit Role", + "enable": "Enable", + "disable": "Disable", + "deleteUser": "Delete User", + "deleteUserSuccess": "User deleted successfully", + "deleteUserError": "Failed to delete user", + "confirmDelete": "Are you sure you want to delete this user? This action cannot be undone.", + "addMember": { + "title": "Add Member", + "username": "Username (Email)", + "usernamePlaceholder": "user@example.com", + "password": "Password", + "passwordPlaceholder": "Enter password", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "forcePasswordChange": "Force password change on first login", + "cancel": "Cancel", + "submit": "Add Member", + "usernameRequired": "Username and password are required", + "passwordTooShort": "Password must be at least 6 characters", + "success": "User created successfully", + "error": "Failed to create user" + }, + "editMember": { + "title": "Edit Member", + "editing": "Editing:", + "role": "Role", + "team": "Team (Optional)", + "teamPlaceholder": "Select a team", + "cancel": "Cancel", + "submit": "Update Member", + "success": "User updated successfully", + "error": "Failed to update user" + }, + "toggleEnabled": { + "success": "User status updated successfully", + "error": "Failed to update user status" + }, + "delete": { + "success": "User deleted successfully", + "error": "Failed to delete user" + }, + "emailInvite": { + "tab": "Email Invite", + "description": "Type or paste in emails below, separated by commas. Users will receive login credentials via email.", + "emails": "Email Addresses", + "emailsPlaceholder": "user1@example.com, user2@example.com", + "emailsRequired": "At least one email address is required", + "submit": "Send Invites", + "success": "user(s) invited successfully", + "partialSuccess": "Some invites failed", + "allFailed": "Failed to invite users", + "error": "Failed to send invites" + }, + "directInvite": { + "tab": "Direct Create" + }, + "inviteLinkTab": { + "tab": "Invite Link" + }, + "inviteLink": { + "description": "Generate a secure link that allows the user to set their own password", + "email": "Email Address", + "emailPlaceholder": "user@example.com (optional)", + "emailDescription": "Optional - leave blank for a general invite link that can be used by anyone", + "emailRequired": "Email address is required", + "emailOptional": "Optional - leave blank for a general invite link", + "emailRequiredForSend": "Email address is required to send email notification", + "expiryHours": "Expiry Hours", + "expiryDescription": "How many hours until the link expires", + "sendEmail": "Send invite link via email", + "sendEmailDescription": "If enabled, the invite link will be sent to the specified email address", + "smtpRequired": "SMTP not configured", + "generate": "Generate Link", + "generated": "Invite Link Generated", + "copied": "Link copied to clipboard", + "success": "Invite link generated successfully", + "successWithEmail": "Invite link generated and sent via email", + "emailFailed": "Invite link generated, but email failed", + "emailFailedDetails": "Error: {0}. Please share the invite link manually.", + "error": "Failed to generate invite link", + "submit": "Generate Invite Link" + }, + "inviteMode": { + "username": "Username", + "email": "Email", + "link": "Link", + "emailDisabled": "Email invites require SMTP configuration and mail.enableInvites=true in settings" + }, + "license": { + "users": "users", + "availableSlots": "Available Slots", + "grandfathered": "Grandfathered", + "grandfatheredShort": "{{count}} grandfathered", + "fromLicense": "from license", + "slotsAvailable": "{{count}} user slot(s) available", + "noSlotsAvailable": "No slots available", + "currentUsage": "Currently using {{current}} of {{max}} user licences" + } + }, + "teams": { + "title": "Teams", + "description": "Manage teams and organize workspace members", + "loading": "Loading teams...", + "loadingDetails": "Loading team details...", + "createNewTeam": "Create New Team", + "teamName": "Team Name", + "totalMembers": "Total Members", + "actions": "Actions", + "noTeamsFound": "No teams found", + "noMembers": "No members in this team", + "system": "System", + "addMember": "Add Member", + "viewTeam": "View Team", + "removeMember": "Remove from team", + "cannotRemoveFromSystemTeam": "Cannot remove from system team", + "renameTeamLabel": "Rename Team", + "deleteTeamLabel": "Delete Team", + "cannotDeleteInternal": "Cannot delete the Internal team", + "confirmDelete": "Are you sure you want to delete this team? This team must be empty to delete.", + "confirmRemove": "Remove user from this team?", + "cannotRenameInternal": "Cannot rename the Internal team", + "cannotAddToInternal": "Cannot add members to the Internal team", + "teamNotFound": "Team not found", + "backToTeams": "Back to Teams", + "memberCount": "{{count}} members", + "removeMemberSuccess": "User removed from team", + "removeMemberError": "Failed to remove user from team", + "createTeam": { + "title": "Create New Team", + "teamName": "Team Name", + "teamNamePlaceholder": "Enter team name", + "cancel": "Cancel", + "submit": "Create Team", + "nameRequired": "Team name is required", + "success": "Team created successfully", + "error": "Failed to create team" + }, + "renameTeam": { + "title": "Rename Team", + "renaming": "Renaming:", + "newTeamName": "New Team Name", + "newTeamNamePlaceholder": "Enter new team name", + "cancel": "Cancel", + "submit": "Rename Team", + "nameRequired": "Team name is required", + "success": "Team renamed successfully", + "error": "Failed to rename team" + }, + "deleteTeam": { + "success": "Team deleted successfully", + "error": "Failed to delete team. Make sure the team is empty.", + "teamMustBeEmpty": "Team must be empty before deletion" + }, + "addMemberToTeam": { + "title": "Add Member to Team", + "addingTo": "Adding to", + "selectUser": "Select User", + "selectUserPlaceholder": "Choose a user", + "selectUserRequired": "Please select a user", + "currentlyIn": "currently in", + "willBeMoved": "Note: This user will be moved from their current team to this team.", + "cancel": "Cancel", + "submit": "Add Member", + "userRequired": "Please select a user", + "success": "Member added to team successfully", + "error": "Failed to add member to team" + }, + "changeTeam": { + "label": "Change Team", + "title": "Change Team", + "changing": "Moving", + "selectTeam": "Select Team", + "selectTeamPlaceholder": "Choose a team", + "selectTeamRequired": "Please select a team", + "success": "Team changed successfully", + "error": "Failed to change team", + "submit": "Change Team" + } + } + }, + "plan": { + "currency": "Currency", + "popular": "Popular", + "current": "Current Plan", + "upgrade": "Upgrade", + "contact": "Contact Us", + "customPricing": "Custom", + "showComparison": "Compare All Features", + "hideComparison": "Hide Feature Comparison", + "featureComparison": "Feature Comparison", + "activePlan": { + "title": "Active Plan", + "subtitle": "Your current subscription details" + }, + "availablePlans": { + "title": "Available Plans", + "subtitle": "Choose the plan that fits your needs" + }, + "static": { + "title": "Billing Information", + "message": "Online billing is not currently configured. To upgrade your plan or manage subscriptions, please contact us directly.", + "contactSales": "Contact Sales", + "contactToUpgrade": "Contact us to upgrade or customize your plan", + "maxUsers": "Max Users", + "upTo": "Up to" + }, + "period": { + "month": "month" + }, + "free": { + "name": "Free", + "highlight1": "Limited Tool Usage Per week", + "highlight2": "Access to all tools", + "highlight3": "Community support" + }, + "pro": { + "name": "Pro", + "highlight1": "Unlimited Tool Usage", + "highlight2": "Advanced PDF tools", + "highlight3": "No watermarks" + }, + "enterprise": { + "name": "Enterprise", + "highlight1": "Custom pricing", + "highlight2": "Dedicated support", + "highlight3": "Latest features" + }, + "feature": { + "title": "Feature", + "pdfTools": "Basic PDF Tools", + "fileSize": "File Size Limit", + "automation": "Automate tool workflows", + "api": "API Access", + "priority": "Priority Support", + "customPricing": "Custom Pricing" + } + }, + "subscription": { + "status": { + "active": "Active", + "pastDue": "Past Due", + "canceled": "Canceled", + "incomplete": "Incomplete", + "trialing": "Trial", + "none": "No Subscription" + }, + "renewsOn": "Renews on {{date}}", + "cancelsOn": "Cancels on {{date}}" + }, + "billing": { + "manageBilling": "Manage Billing", + "portal": { + "error": "Failed to open billing portal" + } + }, + "payment": { + "preparing": "Preparing your checkout...", + "upgradeTitle": "Upgrade to {{planName}}", + "success": "Payment Successful!", + "successMessage": "Your subscription has been activated successfully. You will receive a confirmation email shortly.", + "autoClose": "This window will close automatically...", + "error": "Payment Error" + }, + "firstLogin": { + "title": "First Time Login", + "welcomeTitle": "Welcome!", + "welcomeMessage": "For security reasons, you must change your password on your first login.", + "loggedInAs": "Logged in as", + "error": "Error", + "currentPassword": "Current Password", + "enterCurrentPassword": "Enter your current password", + "newPassword": "New Password", + "enterNewPassword": "Enter new password (min 8 characters)", + "confirmPassword": "Confirm New Password", + "reEnterNewPassword": "Re-enter new password", + "changePassword": "Change Password", + "allFieldsRequired": "All fields are required", + "passwordsDoNotMatch": "New passwords do not match", + "passwordTooShort": "Password must be at least 8 characters", + "passwordMustBeDifferent": "New password must be different from current password", + "passwordChangedSuccess": "Password changed successfully! Please log in again.", + "passwordChangeFailed": "Failed to change password. Please check your current password." + }, + "invite": { + "welcome": "Welcome to Stirling PDF", + "invalidToken": "Invalid invitation link", + "validationError": "Failed to validate invitation link", + "passwordRequired": "Password is required", + "passwordTooShort": "Password must be at least 6 characters", + "passwordMismatch": "Passwords do not match", + "acceptError": "Failed to create account", + "validating": "Validating invitation...", + "invalidInvitation": "Invalid Invitation", + "goToLogin": "Go to Login", + "welcomeTitle": "You've been invited!", + "welcomeSubtitle": "Complete your account setup to get started", + "accountFor": "Creating account for", + "linkExpires": "Link expires", + "email": "Email address", + "emailPlaceholder": "Enter your email address", + "emailRequired": "Email address is required", + "invalidEmail": "Invalid email address", + "choosePassword": "Choose a password", + "passwordPlaceholder": "Enter your password", + "confirmPassword": "Confirm password", + "confirmPasswordPlaceholder": "Re-enter your password", + "createAccount": "Create Account", + "creating": "Creating Account...", + "alreadyHaveAccount": "Already have an account?", + "signIn": "Sign in" + }, + "audit": { + "error": { + "title": "Error loading audit system" + }, + "notAvailable": "Audit system not available", + "notAvailableMessage": "The audit system is not configured or not available.", + "disabled": "Audit logging is disabled", + "disabledMessage": "Enable audit logging in your application configuration to track system events.", + "systemStatus": { + "title": "System Status", + "status": "Audit Logging", + "enabled": "Enabled", + "disabled": "Disabled", + "level": "Audit Level", + "retention": "Retention Period", + "days": "days", + "totalEvents": "Total Events" + }, + "tabs": { + "dashboard": "Dashboard", + "events": "Audit Events", + "export": "Export" + }, + "charts": { + "title": "Audit Dashboard", + "error": "Error loading charts", + "day": "Day", + "week": "Week", + "month": "Month", + "byType": "Events by Type", + "byUser": "Events by User", + "overTime": "Events Over Time" + }, + "events": { + "title": "Audit Events", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "error": "Error loading events", + "noEvents": "No events found", + "timestamp": "Timestamp", + "type": "Type", + "user": "User", + "ipAddress": "IP Address", + "actions": "Actions", + "viewDetails": "View Details", + "eventDetails": "Event Details", + "details": "Details" + }, + "export": { + "title": "Export Audit Data", + "description": "Export audit events to CSV or JSON format. Use filters to limit the exported data.", + "format": "Export Format", + "filters": "Filters (Optional)", + "filterByType": "Filter by type", + "filterByUser": "Filter by user", + "startDate": "Start date", + "endDate": "End date", + "clearFilters": "Clear", + "exportButton": "Export Data", + "error": "Failed to export data" + } + }, + "usage": { + "noData": "No data available", + "error": "Error loading usage statistics", + "noDataMessage": "No usage statistics are currently available.", + "controls": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All", + "refresh": "Refresh", + "dataTypeLabel": "Data Type:", + "dataType": { + "all": "All", + "api": "API", + "ui": "UI" + } + }, + "showing": { + "top10": "Top 10", + "top20": "Top 20", + "all": "All" + }, + "stats": { + "totalEndpoints": "Total Endpoints", + "totalVisits": "Total Visits", + "showing": "Showing", + "selectedVisits": "Selected Visits" + }, + "chart": { + "title": "Endpoint Usage Chart" + }, + "table": { + "title": "Detailed Statistics", + "endpoint": "Endpoint", + "visits": "Visits", + "percentage": "Percentage", + "noData": "No data available" + } + }, + "backendHealth": { + "checking": "Checking backend status...", + "online": "Backend Online", + "offline": "Backend Offline" + }, + "autoRedact": { + "tags": "åĄ—æ”š,隱藏,åĄ—éģ‘,éģ‘色,æ¨™č¨˜,過č”Ŋ", + "title": "č‡Ēå‹•åĄ—éģ‘", + "header": "č‡Ēå‹•åĄ—éģ‘", + "colorLabel": "顏色", + "textsToRedactLabel": "čĻåĄ—éģ‘įš„æ–‡å­—īŧˆäģĨčĄŒåˆ†éš”īŧ‰", + "textsToRedactPlaceholder": "例åĻ‚ \\n抟密 \\n最éĢ˜æŠŸå¯†", + "useRegexLabel": "äŊŋį”¨æ­Ŗå‰‡čĄ¨é”åŧ", + "wholeWordSearchLabel": "æ•´å€‹å–ŽčŠžæœå°‹", + "customPaddingLabel": "č‡Ēč¨‚éĄå¤–åĄĢ充", + "convertPDFToImageLabel": "將 PDF čŊ‰æ›į‚ē PDF-åŊąåƒīŧˆį”¨æ–ŧį§ģé™¤æ–šæĄ†åžŒéĸįš„æ–‡å­—īŧ‰", + "submitButton": "送å‡ē" + }, + "replaceColorPdf": { + "tags": "取äģŖéĄč‰˛,頁éĸ操äŊœ,垌į̝,äŧ翜å™¨į̝" } -} \ No newline at end of file +} diff --git a/frontend/src-tauri/Cargo.lock b/frontend/src-tauri/Cargo.lock index 5f4f9b350..d2abe9651 100644 --- a/frontend/src-tauri/Cargo.lock +++ b/frontend/src-tauri/Cargo.lock @@ -81,6 +81,137 @@ version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" +[[package]] +name = "async-broadcast" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "435a87a52755b8f27fcf321ac4f04b2802e337c8c4872923137471ec39c37532" +dependencies = [ + "event-listener", + "event-listener-strategy", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-channel" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "924ed96dd52d1b75e9c1a3e6275715fd320f5f9439fb5a4a11fa51f4221158d2" +dependencies = [ + "concurrent-queue", + "event-listener-strategy", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-executor" +version = "1.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "497c00e0fd83a72a79a39fcbd8e3e2f055d6f6c7e025f3b3d91f4f8e76527fb8" +dependencies = [ + "async-task", + "concurrent-queue", + "fastrand", + "futures-lite", + "pin-project-lite", + "slab", +] + +[[package]] +name = "async-io" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "456b8a8feb6f42d237746d4b3e9a178494627745c3c56c6ea55d92ba50d026fc" +dependencies = [ + "autocfg", + "cfg-if", + "concurrent-queue", + "futures-io", + "futures-lite", + "parking", + "polling", + "rustix", + "slab", + "windows-sys 0.61.2", +] + +[[package]] +name = "async-lock" +version = "3.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fd03604047cee9b6ce9de9f70c6cd540a0520c813cbd49bae61f33ab80ed1dc" +dependencies = [ + "event-listener", + "event-listener-strategy", + "pin-project-lite", +] + +[[package]] +name = "async-process" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc50921ec0055cdd8a16de48773bfeec5c972598674347252c0399676be7da75" +dependencies = [ + "async-channel", + "async-io", + "async-lock", + "async-signal", + "async-task", + "blocking", + "cfg-if", + "event-listener", + "futures-lite", + "rustix", +] + +[[package]] +name = "async-recursion" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.108", +] + +[[package]] +name = "async-signal" +version = "0.2.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43c070bbf59cd3570b6b2dd54cd772527c7c3620fce8be898406dd3ed6adc64c" +dependencies = [ + "async-io", + "async-lock", + "atomic-waker", + "cfg-if", + "futures-core", + "futures-io", + "rustix", + "signal-hook-registry", + "slab", + "windows-sys 0.61.2", +] + +[[package]] +name = "async-task" +version = "4.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" + +[[package]] +name = "async-trait" +version = "0.1.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.108", +] + [[package]] name = "atk" version = "0.18.2" @@ -155,12 +286,6 @@ dependencies = [ "wyz", ] -[[package]] -name = "block" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" - [[package]] name = "block-buffer" version = "0.10.4" @@ -188,6 +313,19 @@ dependencies = [ "objc2 0.6.3", ] +[[package]] +name = "blocking" +version = "1.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e83f8d02be6967315521be875afa792a316e28d57b5a2d401897e2a7921b7f21" +dependencies = [ + "async-channel", + "async-task", + "futures-io", + "futures-lite", + "piper", +] + [[package]] name = "borsh" version = "1.5.7" @@ -420,36 +558,6 @@ dependencies = [ "windows-link 0.2.1", ] -[[package]] -name = "cocoa" -version = "0.24.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f425db7937052c684daec3bd6375c8abe2d146dca4b8b143d6db777c39138f3a" -dependencies = [ - "bitflags 1.3.2", - "block", - "cocoa-foundation", - "core-foundation 0.9.4", - "core-graphics 0.22.3", - "foreign-types 0.3.2", - "libc", - "objc", -] - -[[package]] -name = "cocoa-foundation" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c6234cbb2e4c785b456c0644748b1ac416dd045799740356f8363dfe00c93f7" -dependencies = [ - "bitflags 1.3.2", - "block", - "core-foundation 0.9.4", - "core-graphics-types 0.1.3", - "libc", - "objc", -] - [[package]] name = "combine" version = "4.6.7" @@ -460,6 +568,15 @@ dependencies = [ "memchr", ] +[[package]] +name = "concurrent-queue" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" +dependencies = [ + "crossbeam-utils", +] + [[package]] name = "convert_case" version = "0.4.0" @@ -502,19 +619,6 @@ version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" -[[package]] -name = "core-graphics" -version = "0.22.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2581bbab3b8ffc6fcbd550bf46c355135d16e9ff2a6ea032ad6b9bf1d7efe4fb" -dependencies = [ - "bitflags 1.3.2", - "core-foundation 0.9.4", - "core-graphics-types 0.1.3", - "foreign-types 0.3.2", - "libc", -] - [[package]] name = "core-graphics" version = "0.24.0" @@ -523,22 +627,11 @@ checksum = "fa95a34622365fa5bbf40b20b75dba8dfa8c94c734aea8ac9a5ca38af14316f1" dependencies = [ "bitflags 2.10.0", "core-foundation 0.10.1", - "core-graphics-types 0.2.0", + "core-graphics-types", "foreign-types 0.5.0", "libc", ] -[[package]] -name = "core-graphics-types" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45390e6114f68f718cc7a830514a96f903cccd70d02a8f6d9f643ac4ba45afaf" -dependencies = [ - "bitflags 1.3.2", - "core-foundation 0.9.4", - "libc", -] - [[package]] name = "core-graphics-types" version = "0.2.0" @@ -834,6 +927,33 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "endi" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3d8a32ae18130a3c84dd492d4215c3d913c3b07c6b63c2eb3eb7ff1101ab7bf" + +[[package]] +name = "enumflags2" +version = "0.7.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1027f7680c853e056ebcec683615fb6fbbc07dbaa13b4d5d9442b146ded4ecef" +dependencies = [ + "enumflags2_derive", + "serde", +] + +[[package]] +name = "enumflags2_derive" +version = "0.7.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67c78a4d8fdf9953a5c9d458f9efe940fd97a0cab0941c075a813ac594733827" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.108", +] + [[package]] name = "env_filter" version = "0.1.4" @@ -871,6 +991,27 @@ dependencies = [ "windows-sys 0.61.2", ] +[[package]] +name = "event-listener" +version = "5.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5d4b856ab" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] + +[[package]] +name = "event-listener-strategy" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93" +dependencies = [ + "event-listener", + "pin-project-lite", +] + [[package]] name = "fastrand" version = "2.3.0" @@ -1026,6 +1167,19 @@ version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" +[[package]] +name = "futures-lite" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f78e10609fe0e0b3f4157ffab1876319b5b0db102a2c60dc4626306dc46b44ad" +dependencies = [ + "fastrand", + "futures-core", + "futures-io", + "parking", + "pin-project-lite", +] + [[package]] name = "futures-macro" version = "0.3.31" @@ -1412,6 +1566,12 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" +[[package]] +name = "hermit-abi" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" + [[package]] name = "hex" version = "0.4.3" @@ -1992,15 +2152,6 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4" -[[package]] -name = "malloc_buf" -version = "0.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" -dependencies = [ - "libc", -] - [[package]] name = "markup5ever" version = "0.14.1" @@ -2148,6 +2299,19 @@ version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" +[[package]] +name = "nix" +version = "0.30.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74523f3a35e05aba87a1d978330aef40f67b0304ac79c1c00b294c9830543db6" +dependencies = [ + "bitflags 2.10.0", + "cfg-if", + "cfg_aliases", + "libc", + "memoffset", +] + [[package]] name = "nodrop" version = "0.1.14" @@ -2200,15 +2364,6 @@ dependencies = [ "libc", ] -[[package]] -name = "objc" -version = "0.2.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" -dependencies = [ - "malloc_buf", -] - [[package]] name = "objc-sys" version = "0.3.5" @@ -2541,6 +2696,16 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" +[[package]] +name = "ordered-stream" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aa2b01e1d916879f73a53d01d1d6cee68adbb31d6d9177a8cfce093cced1d50" +dependencies = [ + "futures-core", + "pin-project-lite", +] + [[package]] name = "os_pipe" version = "1.2.3" @@ -2576,6 +2741,12 @@ dependencies = [ "system-deps", ] +[[package]] +name = "parking" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" + [[package]] name = "parking_lot" version = "0.12.5" @@ -2757,6 +2928,17 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" +[[package]] +name = "piper" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96c8c490f422ef9a4efd2cb5b42b76c8613d7e7dfc1caf667b8a3350a5acc066" +dependencies = [ + "atomic-waker", + "fastrand", + "futures-io", +] + [[package]] name = "pkg-config" version = "0.3.32" @@ -2789,6 +2971,20 @@ dependencies = [ "miniz_oxide", ] +[[package]] +name = "polling" +version = "3.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d0e4f59085d47d8241c88ead0f274e8a0cb551f3625263c05eb8dd897c34218" +dependencies = [ + "cfg-if", + "concurrent-queue", + "hermit-abi", + "pin-project-lite", + "rustix", + "windows-sys 0.61.2", +] + [[package]] name = "potential_utf" version = "0.1.3" @@ -3689,7 +3885,7 @@ checksum = "18051cdd562e792cad055119e0cdb2cfc137e44e3987532e0f9659a77931bb08" dependencies = [ "bytemuck", "cfg_aliases", - "core-graphics 0.24.0", + "core-graphics", "foreign-types 0.5.0", "js-sys", "log", @@ -3735,14 +3931,17 @@ version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + [[package]] name = "stirling-pdf" version = "0.1.0" dependencies = [ - "cocoa", "log", - "objc", - "once_cell", "reqwest 0.11.27", "serde", "serde_json", @@ -3751,6 +3950,7 @@ dependencies = [ "tauri-plugin-fs", "tauri-plugin-log", "tauri-plugin-shell", + "tauri-plugin-single-instance", "tokio", ] @@ -3887,7 +4087,7 @@ dependencies = [ "bitflags 2.10.0", "block2 0.6.2", "core-foundation 0.10.1", - "core-graphics 0.24.0", + "core-graphics", "crossbeam-channel", "dispatch", "dlopen2", @@ -4137,6 +4337,21 @@ dependencies = [ "tokio", ] +[[package]] +name = "tauri-plugin-single-instance" +version = "2.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd707f8c86b4e3004e2c141fa24351f1909ba40ce1b8437e30d5ed5277dd3710" +dependencies = [ + "serde", + "serde_json", + "tauri", + "thiserror 2.0.17", + "tracing", + "windows-sys 0.60.2", + "zbus", +] + [[package]] name = "tauri-runtime" version = "2.9.1" @@ -4544,9 +4759,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" dependencies = [ "pin-project-lite", + "tracing-attributes", "tracing-core", ] +[[package]] +name = "tracing-attributes" +version = "0.1.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.108", +] + [[package]] name = "tracing-core" version = "0.1.34" @@ -4596,6 +4823,17 @@ version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" +[[package]] +name = "uds_windows" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89daebc3e6fd160ac4aa9fc8b3bf71e1f74fbf92367ae71fb83a037e8bf164b9" +dependencies = [ + "memoffset", + "tempfile", + "winapi", +] + [[package]] name = "unic-char-property" version = "0.9.0" @@ -5611,6 +5849,67 @@ dependencies = [ "synstructure", ] +[[package]] +name = "zbus" +version = "5.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b622b18155f7a93d1cd2dc8c01d2d6a44e08fb9ebb7b3f9e6ed101488bad6c91" +dependencies = [ + "async-broadcast", + "async-executor", + "async-io", + "async-lock", + "async-process", + "async-recursion", + "async-task", + "async-trait", + "blocking", + "enumflags2", + "event-listener", + "futures-core", + "futures-lite", + "hex", + "nix", + "ordered-stream", + "serde", + "serde_repr", + "tracing", + "uds_windows", + "uuid", + "windows-sys 0.61.2", + "winnow 0.7.13", + "zbus_macros", + "zbus_names", + "zvariant", +] + +[[package]] +name = "zbus_macros" +version = "5.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cdb94821ca8a87ca9c298b5d1cbd80e2a8b67115d99f6e4551ac49e42b6a314" +dependencies = [ + "proc-macro-crate 3.4.0", + "proc-macro2", + "quote", + "syn 2.0.108", + "zbus_names", + "zvariant", + "zvariant_utils", +] + +[[package]] +name = "zbus_names" +version = "4.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7be68e64bf6ce8db94f63e72f0c7eb9a60d733f7e0499e628dfab0f84d6bcb97" +dependencies = [ + "serde", + "static_assertions", + "winnow 0.7.13", + "zvariant", +] + [[package]] name = "zerocopy" version = "0.8.27" @@ -5684,3 +5983,43 @@ dependencies = [ "quote", "syn 2.0.108", ] + +[[package]] +name = "zvariant" +version = "5.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2be61892e4f2b1772727be11630a62664a1826b62efa43a6fe7449521cb8744c" +dependencies = [ + "endi", + "enumflags2", + "serde", + "winnow 0.7.13", + "zvariant_derive", + "zvariant_utils", +] + +[[package]] +name = "zvariant_derive" +version = "5.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da58575a1b2b20766513b1ec59d8e2e68db2745379f961f86650655e862d2006" +dependencies = [ + "proc-macro-crate 3.4.0", + "proc-macro2", + "quote", + "syn 2.0.108", + "zvariant_utils", +] + +[[package]] +name = "zvariant_utils" +version = "3.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6949d142f89f6916deca2232cf26a8afacf2b9fdc35ce766105e104478be599" +dependencies = [ + "proc-macro2", + "quote", + "serde", + "syn 2.0.108", + "winnow 0.7.13", +] diff --git a/frontend/src-tauri/Cargo.toml b/frontend/src-tauri/Cargo.toml index caddf867d..e14bbaaee 100644 --- a/frontend/src-tauri/Cargo.toml +++ b/frontend/src-tauri/Cargo.toml @@ -10,6 +10,9 @@ rust-version = "1.77.2" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html +[lints.rust] +warnings = "deny" + [lib] name = "app_lib" crate-type = ["staticlib", "cdylib", "rlib"] @@ -25,11 +28,6 @@ tauri = { version = "2.9.0", features = [ "devtools"] } tauri-plugin-log = "2.0.0-rc" tauri-plugin-shell = "2.1.0" tauri-plugin-fs = "2.4.4" +tauri-plugin-single-instance = "2.0.1" tokio = { version = "1.0", features = ["time"] } reqwest = { version = "0.11", features = ["json"] } - -# macOS-specific dependencies for native file opening -[target.'cfg(target_os = "macos")'.dependencies] -objc = "0.2" -cocoa = "0.24" -once_cell = "1.19" diff --git a/frontend/src-tauri/src/commands/backend.rs b/frontend/src-tauri/src/commands/backend.rs index c465f7cc8..c7bce50f7 100644 --- a/frontend/src-tauri/src/commands/backend.rs +++ b/frontend/src-tauri/src/commands/backend.rs @@ -234,6 +234,8 @@ fn monitor_backend_output(mut rx: tauri::async_runtime::Receiver { let output_str = String::from_utf8_lossy(&output); + // Strip exactly one trailing newline to avoid double newlines + let output_str = output_str.strip_suffix('\n').unwrap_or(&output_str); add_log(format!("📤 Backend: {}", output_str)); // Look for startup indicators @@ -250,6 +252,8 @@ fn monitor_backend_output(mut rx: tauri::async_runtime::Receiver { let output_str = String::from_utf8_lossy(&output); + // Strip exactly one trailing newline to avoid double newlines + let output_str = output_str.strip_suffix('\n').unwrap_or(&output_str); add_log(format!("đŸ“Ĩ Backend Error: {}", output_str)); // Look for error indicators diff --git a/frontend/src-tauri/src/commands/files.rs b/frontend/src-tauri/src/commands/files.rs index 7c397cfcf..2d22ac53e 100644 --- a/frontend/src-tauri/src/commands/files.rs +++ b/frontend/src-tauri/src/commands/files.rs @@ -1,48 +1,47 @@ use crate::utils::add_log; use std::sync::Mutex; -// Store the opened file path globally -static OPENED_FILE: Mutex> = Mutex::new(None); +// Store the opened file paths globally (supports multiple files) +static OPENED_FILES: Mutex> = Mutex::new(Vec::new()); -// Set the opened file path (called by macOS file open events) -pub fn set_opened_file(file_path: String) { - let mut opened_file = OPENED_FILE.lock().unwrap(); - *opened_file = Some(file_path.clone()); - add_log(format!("📂 File opened via file open event: {}", file_path)); +// Add an opened file path +pub fn add_opened_file(file_path: String) { + let mut opened_files = OPENED_FILES.lock().unwrap(); + opened_files.push(file_path.clone()); + add_log(format!("📂 File stored for later retrieval: {}", file_path)); } -// Command to get opened file path (if app was launched with a file) +// Command to get opened file paths (if app was launched with files) #[tauri::command] -pub async fn get_opened_file() -> Result, String> { - // First check if we have a file from macOS file open events - { - let opened_file = OPENED_FILE.lock().unwrap(); - if let Some(ref file_path) = *opened_file { - add_log(format!("📂 Returning stored opened file: {}", file_path)); - return Ok(Some(file_path.clone())); - } - } - - // Fallback to command line arguments (Windows/Linux) +pub async fn get_opened_files() -> Result, String> { + let mut all_files: Vec = Vec::new(); + + // Get files from command line arguments (Windows/Linux 'Open With Stirling' behaviour) let args: Vec = std::env::args().collect(); - - // Look for a PDF file argument (skip the first arg which is the executable) - for arg in args.iter().skip(1) { - if arg.ends_with(".pdf") && std::path::Path::new(arg).exists() { - add_log(format!("📂 PDF file opened via command line: {}", arg)); - return Ok(Some(arg.clone())); - } + let pdf_files: Vec = args.iter() + .skip(1) + .filter(|arg| std::path::Path::new(arg).exists()) + .cloned() + .collect(); + + all_files.extend(pdf_files); + + // Add any files sent via events or other instances (macOS 'Open With Stirling' behaviour, also Windows/Linux extra files) + { + let opened_files = OPENED_FILES.lock().unwrap(); + all_files.extend(opened_files.clone()); } - - Ok(None) + + add_log(format!("📂 Returning {} opened file(s)", all_files.len())); + Ok(all_files) } -// Command to clear the opened file (after processing) +// Command to clear the opened files (after processing) #[tauri::command] -pub async fn clear_opened_file() -> Result<(), String> { - let mut opened_file = OPENED_FILE.lock().unwrap(); - *opened_file = None; - add_log("📂 Cleared opened file".to_string()); +pub async fn clear_opened_files() -> Result<(), String> { + let mut opened_files = OPENED_FILES.lock().unwrap(); + opened_files.clear(); + add_log("📂 Cleared opened files".to_string()); Ok(()) } diff --git a/frontend/src-tauri/src/commands/mod.rs b/frontend/src-tauri/src/commands/mod.rs index 773f5d2dd..f21bf8042 100644 --- a/frontend/src-tauri/src/commands/mod.rs +++ b/frontend/src-tauri/src/commands/mod.rs @@ -4,4 +4,4 @@ pub mod files; pub use backend::{start_backend, cleanup_backend}; pub use health::check_backend_health; -pub use files::{get_opened_file, clear_opened_file, set_opened_file}; \ No newline at end of file +pub use files::{get_opened_files, clear_opened_files, add_opened_file}; diff --git a/frontend/src-tauri/src/file_handler.rs b/frontend/src-tauri/src/file_handler.rs deleted file mode 100644 index d432a8131..000000000 --- a/frontend/src-tauri/src/file_handler.rs +++ /dev/null @@ -1,189 +0,0 @@ -/// Multi-platform file opening handler -/// -/// This module provides unified file opening support across platforms: -/// - macOS: Uses native NSApplication delegate (proper Apple Events) -/// - Windows/Linux: Uses command line arguments (fallback approach) -/// - All platforms: Runtime event handling via Tauri events - -use crate::utils::add_log; -use crate::commands::set_opened_file; -use tauri::AppHandle; - - -/// Initialize file handling for the current platform -pub fn initialize_file_handler(app: &AppHandle) { - add_log("🔧 Initializing file handler...".to_string()); - - // Platform-specific initialization - #[cfg(target_os = "macos")] - { - add_log("🍎 Using macOS native file handler".to_string()); - macos_native::register_open_file_handler(app); - } - - #[cfg(not(target_os = "macos"))] - { - add_log("đŸ–Ĩī¸ Using command line argument file handler".to_string()); - let _ = app; // Suppress unused variable warning - } - - // Universal: Check command line arguments (works on all platforms) - check_command_line_args(); -} - -/// Early initialization for macOS delegate registration -pub fn early_init() { - #[cfg(target_os = "macos")] - { - add_log("🔄 Early macOS initialization...".to_string()); - macos_native::register_delegate_early(); - } -} - -/// Check command line arguments for file paths (universal fallback) -fn check_command_line_args() { - let args: Vec = std::env::args().collect(); - add_log(format!("🔍 DEBUG: All command line args: {:?}", args)); - - // Check command line arguments for file opening - for (i, arg) in args.iter().enumerate() { - add_log(format!("🔍 DEBUG: Arg {}: {}", i, arg)); - if i > 0 && arg.ends_with(".pdf") && std::path::Path::new(arg).exists() { - add_log(format!("📂 File argument detected: {}", arg)); - set_opened_file(arg.clone()); - break; // Only handle the first PDF file - } - } -} - -/// Handle runtime file open events (for future single-instance support) -#[allow(dead_code)] -pub fn handle_runtime_file_open(file_path: String) { - if file_path.ends_with(".pdf") && std::path::Path::new(&file_path).exists() { - add_log(format!("📂 Runtime file open: {}", file_path)); - set_opened_file(file_path); - } -} - -#[cfg(target_os = "macos")] -mod macos_native { - use objc::{class, msg_send, sel, sel_impl}; - use objc::runtime::{Class, Object, Sel}; - use cocoa::appkit::NSApplication; - use cocoa::base::{id, nil}; - use once_cell::sync::Lazy; - use std::sync::Mutex; - use tauri::{AppHandle, Emitter}; - - use crate::utils::add_log; - use crate::commands::set_opened_file; - - // Static app handle storage - static APP_HANDLE: Lazy>>> = Lazy::new(|| Mutex::new(None)); - - // Store files opened during launch - static LAUNCH_FILES: Lazy>> = Lazy::new(|| Mutex::new(Vec::new())); - - - extern "C" fn open_files(_self: &Object, _cmd: Sel, _sender: id, filenames: id) { - unsafe { - add_log(format!("📂 macOS native openFiles event called")); - - // filenames is an NSArray of NSString objects - let count: usize = msg_send![filenames, count]; - add_log(format!("📂 Number of files to open: {}", count)); - - for i in 0..count { - let filename: id = msg_send![filenames, objectAtIndex: i]; - let cstr = { - let bytes: *const std::os::raw::c_char = msg_send![filename, UTF8String]; - std::ffi::CStr::from_ptr(bytes) - }; - - if let Ok(path) = cstr.to_str() { - add_log(format!("📂 macOS file open: {}", path)); - if path.ends_with(".pdf") { - // Always set the opened file for command-line interface - set_opened_file(path.to_string()); - - if let Some(app) = APP_HANDLE.lock().unwrap().as_ref() { - // App is running, emit event immediately - add_log(format!("✅ App running, emitting file event: {}", path)); - let _ = app.emit("macos://open-file", path.to_string()); - } else { - // App not ready yet, store for later processing - add_log(format!("🚀 App not ready, storing file for later: {}", path)); - LAUNCH_FILES.lock().unwrap().push(path.to_string()); - } - } - } - } - } - } - - // Register the delegate immediately when the module loads - pub fn register_delegate_early() { - add_log("🔧 Registering macOS delegate early...".to_string()); - - unsafe { - let ns_app = NSApplication::sharedApplication(nil); - - // Check if there's already a delegate - let existing_delegate: id = msg_send![ns_app, delegate]; - if existing_delegate != nil { - add_log("âš ī¸ Tauri already has an NSApplication delegate, trying to extend it...".to_string()); - - // Try to add our method to the existing delegate's class - let delegate_class: id = msg_send![existing_delegate, class]; - let class_name: *const std::os::raw::c_char = msg_send![delegate_class, name]; - let class_name_str = std::ffi::CStr::from_ptr(class_name).to_string_lossy(); - add_log(format!("🔍 Existing delegate class: {}", class_name_str)); - - // This approach won't work with existing classes, so let's try a different method - // We'll use method swizzling or create a new delegate that forwards to the old one - add_log("🔄 Will try alternative approach...".to_string()); - } - - let delegate_class = Class::get("StirlingAppDelegate").unwrap_or_else(|| { - let superclass = class!(NSObject); - let mut decl = objc::declare::ClassDecl::new("StirlingAppDelegate", superclass).unwrap(); - - // Add file opening delegate method (modern plural version) - decl.add_method( - sel!(application:openFiles:), - open_files as extern "C" fn(&Object, Sel, id, id) - ); - - decl.register() - }); - - let delegate: id = msg_send![delegate_class, new]; - let _: () = msg_send![ns_app, setDelegate:delegate]; - } - - add_log("✅ macOS delegate registered early".to_string()); - } - - pub fn register_open_file_handler(app: &AppHandle) { - add_log("🔧 Connecting app handle to file handler...".to_string()); - - // Store the app handle - *APP_HANDLE.lock().unwrap() = Some(app.clone()); - - // Process any files that were opened during launch - let launch_files = { - let mut files = LAUNCH_FILES.lock().unwrap(); - let result = files.clone(); - files.clear(); - result - }; - - for file_path in launch_files { - add_log(format!("📂 Processing stored launch file: {}", file_path)); - set_opened_file(file_path.clone()); - let _ = app.emit("macos://open-file", file_path); - } - - add_log("✅ macOS file handler connected successfully".to_string()); - } -} \ No newline at end of file diff --git a/frontend/src-tauri/src/lib.rs b/frontend/src-tauri/src/lib.rs index f64b8bd0b..9a07845e1 100644 --- a/frontend/src-tauri/src/lib.rs +++ b/frontend/src-tauri/src/lib.rs @@ -1,30 +1,45 @@ -use tauri::{RunEvent, WindowEvent, Emitter}; +use tauri::{RunEvent, WindowEvent, Emitter, Manager}; mod utils; mod commands; -mod file_handler; -use commands::{start_backend, check_backend_health, get_opened_file, clear_opened_file, cleanup_backend, set_opened_file}; +use commands::{start_backend, check_backend_health, get_opened_files, clear_opened_files, cleanup_backend, add_opened_file}; use utils::{add_log, get_tauri_logs}; #[cfg_attr(mobile, tauri::mobile_entry_point)] pub fn run() { - // Initialize file handler early for macOS - file_handler::early_init(); - tauri::Builder::default() .plugin(tauri_plugin_shell::init()) .plugin(tauri_plugin_fs::init()) - .setup(|app| { + .plugin(tauri_plugin_single_instance::init(|app, args, _cwd| { + // This callback runs when a second instance tries to start + add_log(format!("📂 Second instance detected with args: {:?}", args)); + + // Scan args for PDF files (skip first arg which is the executable) + for arg in args.iter().skip(1) { + if std::path::Path::new(arg).exists() { + add_log(format!("📂 Forwarding file to existing instance: {}", arg)); + + // Store file for later retrieval (in case frontend isn't ready yet) + add_opened_file(arg.clone()); + + // Also emit event for immediate handling if frontend is ready + let _ = app.emit("file-opened", arg.clone()); + + // Bring the existing window to front + if let Some(window) = app.get_webview_window("main") { + let _ = window.set_focus(); + let _ = window.unminimize(); + } + } + } + })) + .setup(|_app| { add_log("🚀 Tauri app setup started".to_string()); - - // Initialize platform-specific file handler - file_handler::initialize_file_handler(&app.handle()); - add_log("🔍 DEBUG: Setup completed".to_string()); Ok(()) }) - .invoke_handler(tauri::generate_handler![start_backend, check_backend_health, get_opened_file, clear_opened_file, get_tauri_logs]) + .invoke_handler(tauri::generate_handler![start_backend, check_backend_health, get_opened_files, clear_opened_files, get_tauri_logs]) .build(tauri::generate_context!()) .expect("error while building tauri application") .run(|app_handle, event| { @@ -49,8 +64,9 @@ pub fn run() { let file_path = url_str.strip_prefix("file://").unwrap_or(url_str); if file_path.ends_with(".pdf") { add_log(format!("📂 Processing opened PDF: {}", file_path)); - set_opened_file(file_path.to_string()); - let _ = app_handle.emit("macos://open-file", file_path.to_string()); + add_opened_file(file_path.to_string()); + // Use unified event name for consistency across platforms + let _ = app_handle.emit("file-opened", file_path.to_string()); } } } @@ -62,4 +78,4 @@ pub fn run() { } } }); -} \ No newline at end of file +} diff --git a/frontend/src-tauri/tauri.conf.json b/frontend/src-tauri/tauri.conf.json index 45bb852da..d845a2dc9 100644 --- a/frontend/src-tauri/tauri.conf.json +++ b/frontend/src-tauri/tauri.conf.json @@ -22,7 +22,7 @@ }, "bundle": { "active": true, - "targets": ["deb", "rpm", "dmg", "msi"], + "targets": ["deb", "rpm", "dmg", "app", "msi"], "icon": [ "icons/icon.png", "icons/icon.icns", diff --git a/frontend/src/core/components/AppProviders.tsx b/frontend/src/core/components/AppProviders.tsx index 4dbd632b9..3bf96f29f 100644 --- a/frontend/src/core/components/AppProviders.tsx +++ b/frontend/src/core/components/AppProviders.tsx @@ -8,14 +8,16 @@ import { ToolWorkflowProvider } from "@app/contexts/ToolWorkflowContext"; import { HotkeyProvider } from "@app/contexts/HotkeyContext"; import { SidebarProvider } from "@app/contexts/SidebarContext"; import { PreferencesProvider } from "@app/contexts/PreferencesContext"; -import { AppConfigProvider } from "@app/contexts/AppConfigContext"; +import { AppConfigProvider, AppConfigProviderProps, AppConfigRetryOptions } from "@app/contexts/AppConfigContext"; import { RightRailProvider } from "@app/contexts/RightRailContext"; import { ViewerProvider } from "@app/contexts/ViewerContext"; import { SignatureProvider } from "@app/contexts/SignatureContext"; import { OnboardingProvider } from "@app/contexts/OnboardingContext"; import { TourOrchestrationProvider } from "@app/contexts/TourOrchestrationContext"; +import { AdminTourOrchestrationProvider } from "@app/contexts/AdminTourOrchestrationContext"; import ErrorBoundary from "@app/components/shared/ErrorBoundary"; import { useScarfTracking } from "@app/hooks/useScarfTracking"; +import { useAppInitialization } from "@app/hooks/useAppInitialization"; // Component to initialize scarf tracking (must be inside AppConfigProvider) function ScarfTrackingInitializer() { @@ -23,19 +25,38 @@ function ScarfTrackingInitializer() { return null; } +// Component to run app-level initialization (must be inside AppProviders for context access) +function AppInitializer() { + useAppInitialization(); + return null; +} + +// Avoid requirement to have props which are required in app providers anyway +type AppConfigProviderOverrides = Omit; + +export interface AppProvidersProps { + children: ReactNode; + appConfigRetryOptions?: AppConfigRetryOptions; + appConfigProviderProps?: Partial; +} + /** * Core application providers * Contains all providers needed for the core */ -export function AppProviders({ children }: { children: ReactNode }) { +export function AppProviders({ children, appConfigRetryOptions, appConfigProviderProps }: AppProvidersProps) { return ( - + + @@ -46,7 +67,9 @@ export function AppProviders({ children }: { children: ReactNode }) { - {children} + + {children} + diff --git a/frontend/src/core/components/annotation/shared/DrawingCanvas.tsx b/frontend/src/core/components/annotation/shared/DrawingCanvas.tsx index 4b9de1cbb..e8600e0a2 100644 --- a/frontend/src/core/components/annotation/shared/DrawingCanvas.tsx +++ b/frontend/src/core/components/annotation/shared/DrawingCanvas.tsx @@ -3,6 +3,7 @@ import { Paper, Button, Modal, Stack, Text, Popover, ColorPicker as MantineColor import { ColorSwatchButton } from '@app/components/annotation/shared/ColorPicker'; import PenSizeSelector from '@app/components/tools/sign/PenSizeSelector'; import SignaturePad from 'signature_pad'; +import { PrivateContent } from '@app/components/shared/PrivateContent'; interface DrawingCanvasProps { selectedColor: string; @@ -177,19 +178,21 @@ export const DrawingCanvas: React.FC = ({ Draw your signature - + + + Click to open drawing canvas @@ -246,23 +249,25 @@ export const DrawingCanvas: React.FC = ({ - { - modalCanvasRef.current = el; - if (el) initPad(el); - }} - style={{ - border: '1px solid #ccc', - borderRadius: '4px', - display: 'block', - touchAction: 'none', - backgroundColor: 'white', - width: '100%', - maxWidth: '800px', - height: '400px', - cursor: 'crosshair', - }} - /> + + { + modalCanvasRef.current = el; + if (el) initPad(el); + }} + style={{ + border: '1px solid #ccc', + borderRadius: '4px', + display: 'block', + touchAction: 'none', + backgroundColor: 'white', + width: '100%', + maxWidth: '800px', + height: '400px', + cursor: 'crosshair', + }} + /> +
diff --git a/frontend/src/core/components/pageEditor/PageThumbnail.tsx b/frontend/src/core/components/pageEditor/PageThumbnail.tsx index f0124b2c6..1a33e779b 100644 --- a/frontend/src/core/components/pageEditor/PageThumbnail.tsx +++ b/frontend/src/core/components/pageEditor/PageThumbnail.tsx @@ -1,6 +1,6 @@ import React, { useCallback, useState, useEffect, useRef, useMemo } from 'react'; import { Text, Checkbox } from '@mantine/core'; -import { useMediaQuery } from '@mantine/hooks'; +import { useIsMobile } from '@app/hooks/useIsMobile'; import ArrowBackIcon from '@mui/icons-material/ArrowBack'; import ArrowForwardIcon from '@mui/icons-material/ArrowForward'; import RotateLeftIcon from '@mui/icons-material/RotateLeft'; @@ -14,6 +14,7 @@ import { useThumbnailGeneration } from '@app/hooks/useThumbnailGeneration'; import { useFilesModalContext } from '@app/contexts/FilesModalContext'; import styles from '@app/components/pageEditor/PageEditor.module.css'; import HoverActionMenu, { HoverAction } from '@app/components/shared/HoverActionMenu'; +import { PrivateContent } from '@app/components/shared/PrivateContent'; interface PageThumbnailProps { @@ -68,7 +69,7 @@ const PageThumbnail: React.FC = ({ const [isMouseDown, setIsMouseDown] = useState(false); const [mouseStartPos, setMouseStartPos] = useState<{x: number, y: number} | null>(null); const [isHovered, setIsHovered] = useState(false); - const isMobile = useMediaQuery('(max-width: 1024px)'); + const isMobile = useIsMobile(); const dragElementRef = useRef(null); const [thumbnailUrl, setThumbnailUrl] = useState(page.thumbnail); const { getThumbnailFromCache, requestThumbnail } = useThumbnailGeneration(); @@ -442,21 +443,22 @@ const PageThumbnail: React.FC = ({ }}> ) : thumbnailUrl ? ( - {`Page + + {`Page + ) : (
📄 diff --git a/frontend/src/core/components/shared/AppConfigModal.tsx b/frontend/src/core/components/shared/AppConfigModal.tsx index a080ca3c7..be13be2d4 100644 --- a/frontend/src/core/components/shared/AppConfigModal.tsx +++ b/frontend/src/core/components/shared/AppConfigModal.tsx @@ -1,12 +1,12 @@ import React, { useMemo, useState, useEffect } from 'react'; import { Modal, Text, ActionIcon, Tooltip } from '@mantine/core'; -import { useMediaQuery } from '@mantine/hooks'; import { useNavigate, useLocation } from 'react-router-dom'; import LocalIcon from '@app/components/shared/LocalIcon'; import { createConfigNavSections } from '@app/components/shared/config/configNavSections'; import { NavKey, VALID_NAV_KEYS } from '@app/components/shared/config/types'; import { useAppConfig } from '@app/contexts/AppConfigContext'; import '@app/components/shared/AppConfigModal.css'; +import { useIsMobile } from '@app/hooks/useIsMobile'; import { Z_INDEX_OVER_FULLSCREEN_SURFACE, Z_INDEX_OVER_CONFIG_MODAL } from '@app/styles/zIndex'; interface AppConfigModalProps { @@ -15,10 +15,10 @@ interface AppConfigModalProps { } const AppConfigModal: React.FC = ({ opened, onClose }) => { + const [active, setActive] = useState('general'); + const isMobile = useIsMobile(); const navigate = useNavigate(); const location = useLocation(); - const [active, setActive] = useState('general'); - const isMobile = useMediaQuery("(max-width: 1024px)"); const { config } = useAppConfig(); // Extract section from URL path (e.g., /settings/people -> people) @@ -154,6 +154,7 @@ const AppConfigModal: React.FC = ({ opened, onClose }) => { opacity: isDisabled ? 0.5 : 1, cursor: isDisabled ? 'not-allowed' : 'pointer', }} + data-tour={`admin-${item.key}-nav`} > {!isMobile && ( @@ -185,7 +186,7 @@ const AppConfigModal: React.FC = ({ opened, onClose }) => {
{/* Right content */} -
+
{/* Sticky header with section title and small close button */}
= ({ ) : ( )} - + + +
@@ -61,7 +64,9 @@ export const FileDropdownMenu: React.FC = ({ >
- + + +
{file.versionNumber && file.versionNumber > 1 && ( diff --git a/frontend/src/core/components/shared/PrivateContent.tsx b/frontend/src/core/components/shared/PrivateContent.tsx new file mode 100644 index 000000000..3ed11bfc6 --- /dev/null +++ b/frontend/src/core/components/shared/PrivateContent.tsx @@ -0,0 +1,40 @@ +import React from 'react'; + +interface PrivateContentProps extends React.HTMLAttributes { + children: React.ReactNode; +} + +/** + * Wrapper component for content that should not be captured by analytics tools. + * Currently applies the 'ph-no-capture' className to prevent PostHog capture. + * + * Uses `display: contents` to be layout-invisible - the wrapper exists in the DOM + * for analytics filtering, but doesn't affect layout, flexbox, grid, or styling. + * + * Use this component to wrap any content containing sensitive or private information + * that should be excluded from analytics tracking. + * + * @example + * + * Sensitive filename.pdf + * + * + * + * preview + * + */ +export const PrivateContent: React.FC = ({ + children, + className = '', + style, + ...props +}) => { + const combinedClassName = `ph-no-capture${className ? ` ${className}` : ''}`; + const combinedStyle = { display: 'contents' as const, ...style }; + + return ( + + {children} + + ); +}; diff --git a/frontend/src/core/components/shared/QuickAccessBar.tsx b/frontend/src/core/components/shared/QuickAccessBar.tsx index b82fb09b0..2f73132a8 100644 --- a/frontend/src/core/components/shared/QuickAccessBar.tsx +++ b/frontend/src/core/components/shared/QuickAccessBar.tsx @@ -1,5 +1,5 @@ import React, { useState, useRef, forwardRef, useEffect } from "react"; -import { ActionIcon, Stack, Divider } from "@mantine/core"; +import { ActionIcon, Stack, Divider, Menu } from "@mantine/core"; import { useTranslation } from 'react-i18next'; import { useNavigate, useLocation } from 'react-router-dom'; import LocalIcon from '@app/components/shared/LocalIcon'; @@ -21,6 +21,7 @@ import { getNavButtonStyle, getActiveNavButton, } from '@app/components/shared/quickAccessBar/QuickAccessBar'; +import { Z_INDEX_OVER_FULLSCREEN_SURFACE } from '@app/styles/zIndex'; const QuickAccessBar = forwardRef((_, ref) => { const { t } = useTranslation(); @@ -179,7 +180,7 @@ const QuickAccessBar = forwardRef((_, ref) => { size: 'lg', type: 'action', onClick: () => { - startTour(); + // This will be overridden by the wrapper logic }, }, { @@ -258,11 +259,70 @@ const QuickAccessBar = forwardRef((_, ref) => { {/* Bottom section */} - {bottomButtons.map((config, index) => ( - - {renderNavButton(config, index)} - - ))} + {bottomButtons.map((buttonConfig, index) => { + // Handle help button with menu or direct action + if (buttonConfig.id === 'help') { + const isAdmin = config?.isAdmin === true; + + // If not admin, just show button that starts tools tour directly + if (!isAdmin) { + return ( +
startTour('tools')} + > + {renderNavButton(buttonConfig, index)} +
+ ); + } + + // If admin, show menu with both options + return ( +
+ + +
{renderNavButton(buttonConfig, index)}
+
+ + } + onClick={() => startTour('tools')} + > +
+
+ {t("quickAccess.helpMenu.toolsTour", "Tools Tour")} +
+
+ {t("quickAccess.helpMenu.toolsTourDesc", "Learn what the tools can do")} +
+
+
+ } + onClick={() => startTour('admin')} + > +
+
+ {t("quickAccess.helpMenu.adminTour", "Admin Tour")} +
+
+ {t("quickAccess.helpMenu.adminTourDesc", "Explore admin settings & features")} +
+
+
+
+
+
+ ); + } + + return ( + + {renderNavButton(buttonConfig, index)} + + ); + })}
diff --git a/frontend/src/core/components/shared/Tooltip.tsx b/frontend/src/core/components/shared/Tooltip.tsx index 77db24d46..502430e53 100644 --- a/frontend/src/core/components/shared/Tooltip.tsx +++ b/frontend/src/core/components/shared/Tooltip.tsx @@ -65,6 +65,10 @@ export const Tooltip: React.FC = ({ const clickPendingRef = useRef(false); const tooltipIdRef = useRef(`tooltip-${Math.random().toString(36).slice(2)}`); + // Runtime guard: some browsers may surface non-Node EventTargets for relatedTarget/target + const isDomNode = (value: unknown): value is Node => + typeof Node !== 'undefined' && value instanceof Node; + const clearTimers = useCallback(() => { if (openTimeoutRef.current) { clearTimeout(openTimeoutRef.current); @@ -103,9 +107,9 @@ export const Tooltip: React.FC = ({ (e: MouseEvent) => { const tEl = tooltipRef.current; const trg = triggerRef.current; - const target = e.target as Node | null; - const insideTooltip = tEl && target && tEl.contains(target); - const insideTrigger = trg && target && trg.contains(target); + const target = e.target as unknown; + const insideTooltip = Boolean(tEl && isDomNode(target) && tEl.contains(target)); + const insideTrigger = Boolean(trg && isDomNode(target) && trg.contains(target)); // If pinned: only close when clicking outside BOTH tooltip & trigger if (isPinned) { @@ -172,7 +176,7 @@ export const Tooltip: React.FC = ({ const related = e.relatedTarget as Node | null; // Moving into the tooltip → keep open - if (related && tooltipRef.current && tooltipRef.current.contains(related)) { + if (isDomNode(related) && tooltipRef.current && tooltipRef.current.contains(related)) { (children.props as any)?.onPointerLeave?.(e); return; } @@ -236,7 +240,7 @@ export const Tooltip: React.FC = ({ const handleBlur = useCallback( (e: React.FocusEvent) => { const related = e.relatedTarget as Node | null; - if (related && tooltipRef.current && tooltipRef.current.contains(related)) { + if (isDomNode(related) && tooltipRef.current && tooltipRef.current.contains(related)) { (children.props as any)?.onBlur?.(e); return; } @@ -258,7 +262,7 @@ export const Tooltip: React.FC = ({ const handleTooltipPointerLeave = useCallback( (e: React.PointerEvent) => { const related = e.relatedTarget as Node | null; - if (related && triggerRef.current && triggerRef.current.contains(related)) return; + if (isDomNode(related) && triggerRef.current && triggerRef.current.contains(related)) return; if (!isPinned) setOpen(false); }, [isPinned, setOpen] diff --git a/frontend/src/core/components/shared/TopControls.tsx b/frontend/src/core/components/shared/TopControls.tsx index 6c6ac6999..e62d00716 100644 --- a/frontend/src/core/components/shared/TopControls.tsx +++ b/frontend/src/core/components/shared/TopControls.tsx @@ -9,6 +9,7 @@ import PictureAsPdfIcon from "@mui/icons-material/PictureAsPdf"; import { WorkbenchType, isValidWorkbench } from '@app/types/workbench'; import type { CustomWorkbenchViewInstance } from '@app/contexts/ToolWorkflowContext'; import { FileDropdownMenu } from '@app/components/shared/FileDropdownMenu'; +import { PrivateContent } from '@app/components/shared/PrivateContent'; const viewOptionStyle: React.CSSProperties = { @@ -54,7 +55,7 @@ const createViewOptions = ( ) : ( )} - {displayName} + {displayName}
), value: "viewer", @@ -167,7 +168,8 @@ const TopControls = ({ return (
-
+
+ void; + onCancel: () => void; + fileCount: number; + zipFileName: string; +} + +const WARNING_ICON_STYLE: CSSProperties = { + fontSize: 36, + display: 'block', + margin: '0 auto 8px', + color: 'var(--mantine-color-blue-6)' +}; + +const ZipWarningModal = ({ opened, onConfirm, onCancel, fileCount, zipFileName }: ZipWarningModalProps) => { + const { t } = useTranslation(); + + return ( + + + + + {zipFileName} + + + {t("zipWarning.message", { + count: fileCount, + defaultValue: "This ZIP contains {{count}} files. Extract anyway?" + })} + + + + {/* Desktop layout: centered buttons */} + + + + + + {/* Mobile layout: vertical stack */} + + + + + + ); +}; + +export default ZipWarningModal; diff --git a/frontend/src/core/components/shared/config/configSections/AdminAdvancedSection.tsx b/frontend/src/core/components/shared/config/configSections/AdminAdvancedSection.tsx index b979a22b1..ffb9c8d0c 100644 --- a/frontend/src/core/components/shared/config/configSections/AdminAdvancedSection.tsx +++ b/frontend/src/core/components/shared/config/configSections/AdminAdvancedSection.tsx @@ -205,7 +205,7 @@ export default function AdminAdvancedSection() {
- {t('admin.settings.advanced.enableAlphaFunctionality', 'Enable Alpha Features')} + {t('admin.settings.advanced.enableAlphaFunctionality.label', 'Enable Alpha Features')} {t('admin.settings.advanced.enableAlphaFunctionality.description', 'Enable experimental and alpha-stage features (may be unstable)')} @@ -221,7 +221,7 @@ export default function AdminAdvancedSection() {
- {t('admin.settings.advanced.enableUrlToPDF', 'Enable URL to PDF')} + {t('admin.settings.advanced.enableUrlToPDF.label', 'Enable URL to PDF')} {t('admin.settings.advanced.enableUrlToPDF.description', 'Allow conversion of web pages to PDF documents (internal use only)')} @@ -237,7 +237,7 @@ export default function AdminAdvancedSection() {
- {t('admin.settings.advanced.disableSanitize', 'Disable HTML Sanitization')} + {t('admin.settings.advanced.disableSanitize.label', 'Disable HTML Sanitization')} {t('admin.settings.advanced.disableSanitize.description', 'Disable HTML sanitization (WARNING: Security risk - can lead to XSS injections)')} @@ -262,7 +262,7 @@ export default function AdminAdvancedSection() { - {t('admin.settings.advanced.maxDPI', 'Maximum DPI')} + {t('admin.settings.advanced.maxDPI.label', 'Maximum DPI')} } @@ -278,7 +278,7 @@ export default function AdminAdvancedSection() { - {t('admin.settings.advanced.tessdataDir', 'Tessdata Directory')} + {t('admin.settings.advanced.tessdataDir.label', 'Tessdata Directory')} } @@ -295,7 +295,7 @@ export default function AdminAdvancedSection() {
- {t('admin.settings.advanced.tempFileManagement', 'Temp File Management')} + {t('admin.settings.advanced.tempFileManagement.label', 'Temp File Management')} {t('admin.settings.advanced.tempFileManagement.description', 'Configure temporary file storage and cleanup behavior')} @@ -303,7 +303,7 @@ export default function AdminAdvancedSection() {
setSettings({ @@ -316,7 +316,7 @@ export default function AdminAdvancedSection() {
setSettings({ @@ -329,7 +329,7 @@ export default function AdminAdvancedSection() {
setSettings({ @@ -342,7 +342,7 @@ export default function AdminAdvancedSection() {
setSettings({ @@ -355,7 +355,7 @@ export default function AdminAdvancedSection() {
setSettings({ @@ -369,7 +369,7 @@ export default function AdminAdvancedSection() {
setSettings({ @@ -383,7 +383,7 @@ export default function AdminAdvancedSection() {
- {t('admin.settings.advanced.tempFileManagement.startupCleanup', 'Startup Cleanup')} + {t('admin.settings.advanced.tempFileManagement.startupCleanup.label', 'Startup Cleanup')} {t('admin.settings.advanced.tempFileManagement.startupCleanup.description', 'Clean up old temp files on application startup')} @@ -402,7 +402,7 @@ export default function AdminAdvancedSection() {
- {t('admin.settings.advanced.tempFileManagement.cleanupSystemTemp', 'Cleanup System Temp')} + {t('admin.settings.advanced.tempFileManagement.cleanupSystemTemp.label', 'Cleanup System Temp')} {t('admin.settings.advanced.tempFileManagement.cleanupSystemTemp.description', 'Whether to clean broader system temp directory (use with caution)')} @@ -424,7 +424,7 @@ export default function AdminAdvancedSection() { {/* Process Executor Limits */} - {t('admin.settings.advanced.processExecutor', 'Process Executor Limits')} + {t('admin.settings.advanced.processExecutor.label', 'Process Executor Limits')} {t('admin.settings.advanced.processExecutor.description', 'Configure session limits and timeouts for each process executor')} @@ -436,7 +436,7 @@ export default function AdminAdvancedSection() { setSettings({ @@ -450,7 +450,7 @@ export default function AdminAdvancedSection() { max={100} /> setSettings({ @@ -473,7 +473,7 @@ export default function AdminAdvancedSection() { setSettings({ @@ -487,7 +487,7 @@ export default function AdminAdvancedSection() { max={100} /> setSettings({ @@ -510,7 +510,7 @@ export default function AdminAdvancedSection() { setSettings({ @@ -524,7 +524,7 @@ export default function AdminAdvancedSection() { max={100} /> setSettings({ @@ -547,7 +547,7 @@ export default function AdminAdvancedSection() { setSettings({ @@ -561,7 +561,7 @@ export default function AdminAdvancedSection() { max={100} /> setSettings({ @@ -584,7 +584,7 @@ export default function AdminAdvancedSection() { setSettings({ @@ -598,7 +598,7 @@ export default function AdminAdvancedSection() { max={100} /> setSettings({ @@ -621,7 +621,7 @@ export default function AdminAdvancedSection() { setSettings({ @@ -635,7 +635,7 @@ export default function AdminAdvancedSection() { max={100} /> setSettings({ @@ -658,7 +658,7 @@ export default function AdminAdvancedSection() { setSettings({ @@ -672,7 +672,7 @@ export default function AdminAdvancedSection() { max={100} /> setSettings({ @@ -695,7 +695,7 @@ export default function AdminAdvancedSection() { setSettings({ @@ -709,7 +709,7 @@ export default function AdminAdvancedSection() { max={100} /> setSettings({ @@ -732,7 +732,7 @@ export default function AdminAdvancedSection() { setSettings({ @@ -746,7 +746,7 @@ export default function AdminAdvancedSection() { max={100} /> setSettings({ @@ -769,7 +769,7 @@ export default function AdminAdvancedSection() { setSettings({ @@ -783,7 +783,7 @@ export default function AdminAdvancedSection() { max={100} /> setSettings({ diff --git a/frontend/src/core/components/shared/config/configSections/AdminConnectionsSection.tsx b/frontend/src/core/components/shared/config/configSections/AdminConnectionsSection.tsx index 663295b38..ab3dc7dc0 100644 --- a/frontend/src/core/components/shared/config/configSections/AdminConnectionsSection.tsx +++ b/frontend/src/core/components/shared/config/configSections/AdminConnectionsSection.tsx @@ -328,7 +328,7 @@ export default function AdminConnectionsSection() { - {t('admin.settings.connections.ssoAutoLogin', 'SSO Auto Login')} + {t('admin.settings.connections.ssoAutoLogin.label', 'SSO Auto Login')} PRO diff --git a/frontend/src/core/components/shared/config/configSections/AdminDatabaseSection.tsx b/frontend/src/core/components/shared/config/configSections/AdminDatabaseSection.tsx index 647364f19..a28953781 100644 --- a/frontend/src/core/components/shared/config/configSections/AdminDatabaseSection.tsx +++ b/frontend/src/core/components/shared/config/configSections/AdminDatabaseSection.tsx @@ -123,7 +123,7 @@ export default function AdminDatabaseSection() {
- {t('admin.settings.database.enableCustom', 'Enable Custom Database')} + {t('admin.settings.database.enableCustom.label', 'Enable Custom Database')} {t('admin.settings.database.enableCustom.description', 'Use your own custom database configuration instead of the default embedded database')} @@ -143,7 +143,7 @@ export default function AdminDatabaseSection() { - {t('admin.settings.database.customUrl', 'Custom Database URL')} + {t('admin.settings.database.customUrl.label', 'Custom Database URL')} } @@ -158,7 +158,7 @@ export default function AdminDatabaseSection() { setSettings({ ...settings, loginMethod: value || 'all' })} @@ -236,7 +236,7 @@ export default function AdminSecuritySection() { - {t('admin.settings.security.loginAttemptCount', 'Login Attempt Limit')} + {t('admin.settings.security.loginAttemptCount.label', 'Login Attempt Limit')} } @@ -252,7 +252,7 @@ export default function AdminSecuritySection() { - {t('admin.settings.security.loginResetTimeMinutes', 'Login Reset Time (minutes)')} + {t('admin.settings.security.loginResetTimeMinutes.label', 'Login Reset Time (minutes)')} } @@ -266,7 +266,7 @@ export default function AdminSecuritySection() {
- {t('admin.settings.security.csrfDisabled', 'Disable CSRF Protection')} + {t('admin.settings.security.csrfDisabled.label', 'Disable CSRF Protection')} {t('admin.settings.security.csrfDisabled.description', 'Disable Cross-Site Request Forgery protection (not recommended)')} @@ -297,11 +297,11 @@ export default function AdminSecuritySection() { {/* JWT Settings */} - {t('admin.settings.security.jwt', 'JWT Configuration')} + {t('admin.settings.security.jwt.label', 'JWT Configuration')}
- {t('admin.settings.security.jwt.persistence', 'Enable Key Persistence')} + {t('admin.settings.security.jwt.persistence.label', 'Enable Key Persistence')} {t('admin.settings.security.jwt.persistence.description', 'Store JWT keys persistently (required for multi-instance deployments)')} @@ -317,7 +317,7 @@ export default function AdminSecuritySection() {
- {t('admin.settings.security.jwt.enableKeyRotation', 'Enable Key Rotation')} + {t('admin.settings.security.jwt.enableKeyRotation.label', 'Enable Key Rotation')} {t('admin.settings.security.jwt.enableKeyRotation.description', 'Automatically rotate JWT signing keys for improved security')} @@ -333,7 +333,7 @@ export default function AdminSecuritySection() {
- {t('admin.settings.security.jwt.enableKeyCleanup', 'Enable Key Cleanup')} + {t('admin.settings.security.jwt.enableKeyCleanup.label', 'Enable Key Cleanup')} {t('admin.settings.security.jwt.enableKeyCleanup.description', 'Automatically remove old JWT keys after retention period')} @@ -351,7 +351,7 @@ export default function AdminSecuritySection() { - {t('admin.settings.security.jwt.keyRetentionDays', 'Key Retention Days')} + {t('admin.settings.security.jwt.keyRetentionDays.label', 'Key Retention Days')} } @@ -365,7 +365,7 @@ export default function AdminSecuritySection() {
- {t('admin.settings.security.jwt.secureCookie', 'Secure Cookie')} + {t('admin.settings.security.jwt.secureCookie.label', 'Secure Cookie')} {t('admin.settings.security.jwt.secureCookie.description', 'Require HTTPS for JWT cookies (recommended for production)')} @@ -385,13 +385,13 @@ export default function AdminSecuritySection() { - {t('admin.settings.security.audit', 'Audit Logging')} + {t('admin.settings.security.audit.label', 'Audit Logging')} ENTERPRISE
- {t('admin.settings.security.audit.enabled', 'Enable Audit Logging')} + {t('admin.settings.security.audit.enabled.label', 'Enable Audit Logging')} {t('admin.settings.security.audit.enabled.description', 'Track user actions and system events for compliance and security monitoring')} @@ -409,7 +409,7 @@ export default function AdminSecuritySection() { - {t('admin.settings.security.audit.level', 'Audit Level')} + {t('admin.settings.security.audit.level.label', 'Audit Level')} } @@ -425,7 +425,7 @@ export default function AdminSecuritySection() { - {t('admin.settings.security.audit.retentionDays', 'Audit Retention (days)')} + {t('admin.settings.security.audit.retentionDays.label', 'Audit Retention (days)')} } @@ -443,7 +443,7 @@ export default function AdminSecuritySection() {
- {t('admin.settings.security.htmlUrlSecurity', 'HTML URL Security')} + {t('admin.settings.security.htmlUrlSecurity.label', 'HTML URL Security')} {t('admin.settings.security.htmlUrlSecurity.description', 'Configure URL access restrictions for HTML processing to prevent SSRF attacks')} @@ -451,7 +451,7 @@ export default function AdminSecuritySection() {
- {t('admin.settings.security.htmlUrlSecurity.enabled', 'Enable URL Security')} + {t('admin.settings.security.htmlUrlSecurity.enabled.label', 'Enable URL Security')} {t('admin.settings.security.htmlUrlSecurity.enabled.description', 'Enable URL security restrictions for HTML to PDF conversions')} @@ -475,7 +475,7 @@ export default function AdminSecuritySection() {