From a15b0e33d5e844558c739791afe701d689bae9d4 Mon Sep 17 00:00:00 2001 From: Anthony Stirling <77850077+Frooodle@users.noreply.github.com> Date: Wed, 1 Oct 2025 00:03:26 +0100 Subject: [PATCH] test (#4559) --- .github/scripts/check_language_json.py | 345 +++ .github/workflows/sync_files_v2.yml | 118 + README.md | 1 - .../public/locales/de-DE/translation.json | 389 ++- .../public/locales/es-ES/translation.json | 2299 +++++++++++++++-- .../public/locales/it-IT/translation.json | 321 ++- .../public/locales/zh-CN/translation.json | 353 ++- scripts/counter_translation_v2.py | 204 ++ 8 files changed, 3641 insertions(+), 389 deletions(-) create mode 100644 .github/scripts/check_language_json.py create mode 100644 .github/workflows/sync_files_v2.yml create mode 100644 scripts/counter_translation_v2.py diff --git a/.github/scripts/check_language_json.py b/.github/scripts/check_language_json.py new file mode 100644 index 000000000..3921bdaa5 --- /dev/null +++ b/.github/scripts/check_language_json.py @@ -0,0 +1,345 @@ +""" +Author: Ludy87 +Description: This script processes JSON translation files for localization checks. It compares translation files in a branch with +a reference file to ensure consistency. The script performs two main checks: +1. Verifies that the number of translation keys in the translation files matches the reference file. +2. Ensures that all keys in the translation files are present in the reference file and vice versa. + +The script also provides functionality to update the translation files to match the reference file by adding missing keys and +adjusting the format. + +Usage: + python check_language_json.py --reference-file --branch [--actor ] [--files ] +""" +# Sample for Windows: +# python .github/scripts/check_language_json.py --reference-file frontend/public/locales/en-GB/translation.json --branch "" --files frontend/public/locales/de-DE/translation.json frontend/public/locales/fr-FR/translation.json + +import copy +import glob +import os +import argparse +import re +import json + + +def find_duplicate_keys(file_path, keys=None, prefix=""): + """ + Identifies duplicate keys in a JSON file (including nested keys). + :param file_path: Path to the JSON file. + :param keys: Dictionary to track keys (used for recursion). + :param prefix: Prefix for nested keys. + :return: List of tuples (key, first_occurrence_path, duplicate_path). + """ + if keys is None: + keys = {} + + duplicates = [] + + with open(file_path, "r", encoding="utf-8") as file: + data = json.load(file) + + def process_dict(obj, current_prefix=""): + for key, value in obj.items(): + full_key = f"{current_prefix}.{key}" if current_prefix else key + + if isinstance(value, dict): + process_dict(value, full_key) + else: + if full_key in keys: + duplicates.append((full_key, keys[full_key], full_key)) + else: + keys[full_key] = full_key + + process_dict(data, prefix) + return duplicates + + +# Maximum size for JSON files (e.g., 500 KB) +MAX_FILE_SIZE = 500 * 1024 + + +def parse_json_file(file_path): + """ + Parses a JSON translation file and returns a flat dictionary of all keys. + :param file_path: Path to the JSON file. + :return: Dictionary with flattened keys. + """ + with open(file_path, "r", encoding="utf-8") as file: + data = json.load(file) + + def flatten_dict(d, parent_key="", sep="."): + items = {} + for k, v in d.items(): + new_key = f"{parent_key}{sep}{k}" if parent_key else k + if isinstance(v, dict): + items.update(flatten_dict(v, new_key, sep=sep)) + else: + items[new_key] = v + return items + + return flatten_dict(data) + + +def unflatten_dict(d, sep="."): + """ + Converts a flat dictionary with dot notation keys back to nested dict. + :param d: Flattened dictionary. + :param sep: Separator used in keys. + :return: Nested dictionary. + """ + result = {} + for key, value in d.items(): + parts = key.split(sep) + current = result + for part in parts[:-1]: + if part not in current: + current[part] = {} + current = current[part] + current[parts[-1]] = value + return result + + +def write_json_file(file_path, updated_properties): + """ + Writes updated properties back to the JSON file. + :param file_path: Path to the JSON file. + :param updated_properties: Dictionary of updated properties to write. + """ + nested_data = unflatten_dict(updated_properties) + + with open(file_path, "w", encoding="utf-8", newline="\n") as file: + json.dump(nested_data, file, ensure_ascii=False, indent=2) + file.write("\n") # Add trailing newline + + +def update_missing_keys(reference_file, file_list, branch=""): + """ + Updates missing keys in the translation files based on the reference file. + :param reference_file: Path to the reference JSON file. + :param file_list: List of translation files to update. + :param branch: Branch where the files are located. + """ + reference_properties = parse_json_file(reference_file) + + for file_path in file_list: + basename_current_file = os.path.basename(os.path.join(branch, file_path)) + if ( + basename_current_file == os.path.basename(reference_file) + or not file_path.endswith(".json") + or not os.path.dirname(file_path).endswith("locales") + ): + continue + + current_properties = parse_json_file(os.path.join(branch, file_path)) + updated_properties = {} + + for ref_key, ref_value in reference_properties.items(): + if ref_key in current_properties: + # Keep the current translation + updated_properties[ref_key] = current_properties[ref_key] + else: + # Add missing key with reference value + updated_properties[ref_key] = ref_value + + write_json_file(os.path.join(branch, file_path), updated_properties) + + +def check_for_missing_keys(reference_file, file_list, branch): + update_missing_keys(reference_file, file_list, branch) + + +def read_json_keys(file_path): + if os.path.isfile(file_path) and os.path.exists(file_path): + return parse_json_file(file_path) + return {} + + +def check_for_differences(reference_file, file_list, branch, actor): + reference_branch = branch + basename_reference_file = os.path.basename(reference_file) + + report = [] + report.append(f"#### 🔄 Reference Branch: `{reference_branch}`") + reference_keys = read_json_keys(reference_file) + has_differences = False + + only_reference_file = True + + file_arr = file_list + + if len(file_list) == 1: + file_arr = file_list[0].split() + + base_dir = os.path.abspath( + os.path.join(os.getcwd(), "frontend", "public", "locales") + ) + + for file_path in file_arr: + file_normpath = os.path.normpath(file_path) + absolute_path = os.path.abspath(file_normpath) + + # Verify that file is within the expected directory + if not absolute_path.startswith(base_dir): + raise ValueError(f"Unsafe file found: {file_normpath}") + + # Verify file size before processing + if os.path.getsize(os.path.join(branch, file_normpath)) > MAX_FILE_SIZE: + raise ValueError( + f"The file {file_normpath} is too large and could pose a security risk." + ) + + basename_current_file = os.path.basename(os.path.join(branch, file_normpath)) + locale_dir = os.path.basename(os.path.dirname(file_normpath)) + + if ( + basename_current_file == basename_reference_file + and locale_dir == "en-GB" + ): + continue + + if not file_normpath.endswith(".json") or basename_current_file != "translation.json": + continue + + only_reference_file = False + report.append(f"#### 📃 **File Check:** `{locale_dir}/{basename_current_file}`") + current_keys = read_json_keys(os.path.join(branch, file_path)) + reference_key_count = len(reference_keys) + current_key_count = len(current_keys) + + if reference_key_count != current_key_count: + report.append("") + report.append("1. **Test Status:** ❌ **_Failed_**") + report.append(" - **Issue:**") + has_differences = True + if reference_key_count > current_key_count: + report.append( + f" - **_Mismatched key count_**: {reference_key_count} (reference) vs {current_key_count} (current). Translation keys are missing." + ) + elif reference_key_count < current_key_count: + report.append( + f" - **_Too many keys_**: {reference_key_count} (reference) vs {current_key_count} (current). Please verify if there are additional keys that need to be removed." + ) + else: + report.append("1. **Test Status:** ✅ **_Passed_**") + + # Check for missing or extra keys + current_keys_set = set(current_keys.keys()) + reference_keys_set = set(reference_keys.keys()) + missing_keys = current_keys_set.difference(reference_keys_set) + extra_keys = reference_keys_set.difference(current_keys_set) + missing_keys_list = list(missing_keys) + extra_keys_list = list(extra_keys) + + if missing_keys_list or extra_keys_list: + has_differences = True + missing_keys_str = "`, `".join(missing_keys_list) + extra_keys_str = "`, `".join(extra_keys_list) + report.append("2. **Test Status:** ❌ **_Failed_**") + report.append(" - **Issue:**") + if missing_keys_list: + report.append( + f" - **_Extra keys in `{locale_dir}/{basename_current_file}`_**: `{missing_keys_str}` that are not present in **_`{basename_reference_file}`_**." + ) + if extra_keys_list: + report.append( + f" - **_Missing keys in `{locale_dir}/{basename_current_file}`_**: `{extra_keys_str}` that are not present in **_`{basename_reference_file}`_**." + ) + else: + report.append("2. **Test Status:** ✅ **_Passed_**") + + if find_duplicate_keys(os.path.join(branch, file_normpath)): + has_differences = True + output = "\n".join( + [ + f" - `{key}`: first at {first}, duplicate at `{duplicate}`" + for key, first, duplicate in find_duplicate_keys( + os.path.join(branch, file_normpath) + ) + ] + ) + report.append("3. **Test Status:** ❌ **_Failed_**") + report.append(" - **Issue:**") + report.append(" - duplicate entries were found:") + report.append(output) + else: + report.append("3. **Test Status:** ✅ **_Passed_**") + + report.append("") + report.append("---") + report.append("") + + if has_differences: + report.append("## ❌ Overall Check Status: **_Failed_**") + report.append("") + report.append( + f"@{actor} please check your translation if it conforms to the standard. Follow the format of [en-GB/translation.json](https://github.com/Stirling-Tools/Stirling-PDF/blob/V2/frontend/public/locales/en-GB/translation.json)" + ) + else: + report.append("## ✅ Overall Check Status: **_Success_**") + report.append("") + report.append( + f"Thanks @{actor} for your help in keeping the translations up to date." + ) + + if not only_reference_file: + print("\n".join(report)) + + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description="Find missing keys") + parser.add_argument( + "--actor", + required=False, + help="Actor from PR.", + ) + parser.add_argument( + "--reference-file", + required=True, + help="Path to the reference file.", + ) + parser.add_argument( + "--branch", + type=str, + required=True, + help="Branch name.", + ) + parser.add_argument( + "--check-file", + type=str, + required=False, + help="List of changed files, separated by spaces.", + ) + parser.add_argument( + "--files", + nargs="+", + required=False, + help="List of changed files, separated by spaces.", + ) + args = parser.parse_args() + + # Sanitize --actor input to avoid injection attacks + if args.actor: + args.actor = re.sub(r"[^a-zA-Z0-9_\\-]", "", args.actor) + + # Sanitize --branch input to avoid injection attacks + if args.branch: + args.branch = re.sub(r"[^a-zA-Z0-9\\-]", "", args.branch) + + file_list = args.files + if file_list is None: + if args.check_file: + file_list = [args.check_file] + else: + file_list = glob.glob( + os.path.join( + os.getcwd(), + "frontend", + "public", + "locales", + "*", + "translation.json", + ) + ) + update_missing_keys(args.reference_file, file_list) + else: + check_for_differences(args.reference_file, file_list, args.branch, args.actor) \ No newline at end of file diff --git a/.github/workflows/sync_files_v2.yml b/.github/workflows/sync_files_v2.yml new file mode 100644 index 000000000..84645c59e --- /dev/null +++ b/.github/workflows/sync_files_v2.yml @@ -0,0 +1,118 @@ +name: Sync Files V2 + +on: + workflow_dispatch: + push: + branches: + - V2 + - syncLangTest + paths: + - "build.gradle" + - "README.md" + - "frontend/public/locales/*/translation.json" + - "app/core/src/main/resources/static/3rdPartyLicenses.json" + - "scripts/ignore_translation.toml" + +# cancel in-progress jobs if a new job is triggered +# This is useful to avoid running multiple builds for the same branch if a new commit is pushed +# or a pull request is updated. +# It helps to save resources and time by ensuring that only the latest commit is built and tested +# This is particularly useful for long-running jobs that may take a while to complete. +# The `group` is set to a combination of the workflow name, event name, and branch name. +# This ensures that jobs are grouped by the workflow and branch, allowing for cancellation of +# in-progress jobs when a new commit is pushed to the same branch or a new pull request is opened. +concurrency: + group: ${{ github.workflow }}-${{ github.event_name }}-${{ github.ref_name || github.ref }} + cancel-in-progress: true + +permissions: + contents: read + +jobs: + sync-files: + runs-on: ubuntu-latest + steps: + - name: Harden Runner + uses: step-security/harden-runner@ec9f2d5744a09debf3a187a3f4f675c53b671911 # v2.13.0 + with: + egress-policy: audit + + - uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0 + + - name: Setup GitHub App Bot + id: setup-bot + uses: ./.github/actions/setup-bot + with: + app-id: ${{ secrets.GH_APP_ID }} + private-key: ${{ secrets.GH_APP_PRIVATE_KEY }} + + - name: Set up Python + uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 + with: + python-version: "3.12" + cache: "pip" # caching pip dependencies + + - name: Sync translation JSON files + run: | + python .github/scripts/check_language_json.py --reference-file "frontend/public/locales/en-GB/translation.json" --branch V2 + + - name: Commit translation files + run: | + git add frontend/public/locales/*/translation.json + git diff --staged --quiet || git commit -m ":memo: Sync translation files" || echo "No changes detected" + + - name: Install dependencies + run: pip install --require-hashes -r ./.github/scripts/requirements_sync_readme.txt + + - name: Sync README.md + run: | + python scripts/counter_translation_v2.py + + - name: Run git add + run: | + git add README.md scripts/ignore_translation.toml + git diff --staged --quiet || git commit -m ":memo: Sync README.md & scripts/ignore_translation.toml" || echo "No changes detected" + + - name: Create Pull Request + if: always() + uses: peter-evans/create-pull-request@271a8d0340265f705b14b6d32b9829c1cb33d45e # v7.0.8 + with: + token: ${{ steps.setup-bot.outputs.token }} + commit-message: Update files + committer: ${{ steps.setup-bot.outputs.committer }} + author: ${{ steps.setup-bot.outputs.committer }} + signoff: true + branch: sync_readme_v2 + base: V2 + title: ":globe_with_meridians: [V2] Sync Translations + Update README Progress Table" + body: | + ### Description of Changes + + This Pull Request was automatically generated to synchronize updates to translation files and documentation for the **V2 branch**. Below are the details of the changes made: + + #### **1. Synchronization of Translation Files** + - Updated translation files (`frontend/public/locales/*/translation.json`) to reflect changes in the reference file `en-GB/translation.json`. + - Ensured consistency and synchronization across all supported language files. + - Highlighted any missing or incomplete translations. + + #### **2. Update README.md** + - Generated the translation progress table in `README.md`. + - Added a summary of the current translation status for all supported languages. + - Included up-to-date statistics on translation coverage. + + #### **Why these changes are necessary** + - Keeps translation files aligned with the latest reference updates. + - Ensures the documentation reflects the current translation progress. + + --- + + Auto-generated by [create-pull-request][1]. + + [1]: https://github.com/peter-evans/create-pull-request + draft: false + delete-branch: true + labels: github-actions + sign-commits: true + add-paths: | + README.md + frontend/public/locales/*/translation.json \ No newline at end of file diff --git a/README.md b/README.md index 74783d0a0..ff11db9ab 100644 --- a/README.md +++ b/README.md @@ -97,7 +97,6 @@ All documentation available at [https://docs.stirlingpdf.com/](https://docs.stir - # 📖 Get Started Visit our comprehensive documentation at [docs.stirlingpdf.com](https://docs.stirlingpdf.com) for: diff --git a/frontend/public/locales/de-DE/translation.json b/frontend/public/locales/de-DE/translation.json index 2066c7699..4ff3f64ef 100644 --- a/frontend/public/locales/de-DE/translation.json +++ b/frontend/public/locales/de-DE/translation.json @@ -87,7 +87,10 @@ "showStack": "Stack-Trace anzeigen", "copyStack": "Stack-Trace kopieren", "githubSubmit": "GitHub - Ein Ticket einreichen", - "discordSubmit": "Discord - Unterstützungsbeitrag 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." }, "warning": { "tooltipTitle": "Warnung" @@ -358,179 +361,223 @@ "sortBy": "Sortieren nach:", "multiTool": { "title": "PDF-Multitool", - "desc": "Seiten zusammenführen, drehen, neu anordnen und entfernen" + "desc": "Seiten zusammenführen, drehen, neu anordnen und entfernen", + "tags": "mehrere,werkzeuge" }, "merge": { "title": "Zusammenführen", - "desc": "Mehrere PDF-Dateien zu einer einzigen zusammenführen" + "desc": "Mehrere PDF-Dateien zu einer einzigen zusammenführen", + "tags": "kombinieren,zusammenführen,vereinen" }, "split": { "title": "Aufteilen", - "desc": "PDFs in mehrere Dokumente aufteilen" + "desc": "PDFs in mehrere Dokumente aufteilen", + "tags": "teilen,trennen,aufteilen" }, "rotate": { "title": "Drehen", - "desc": "Drehen Sie Ihre PDFs ganz einfach" + "desc": "Drehen Sie Ihre PDFs ganz einfach", + "tags": "drehen,spiegeln,ausrichten" }, "convert": { "title": "Umwandeln", - "desc": "Dateien zwischen verschiedenen Formaten konvertieren" + "desc": "Dateien zwischen verschiedenen Formaten konvertieren", + "tags": "umwandeln,ändern" }, "pdfOrganiser": { "title": "Organisieren", - "desc": "Seiten entfernen und Seitenreihenfolge ändern" + "desc": "Seiten entfernen und Seitenreihenfolge ändern", + "tags": "organisieren,umordnen,neu anordnen" }, "addImage": { "title": "Bild einfügen", - "desc": "Fügt ein Bild an eine bestimmte Stelle im PDF ein (in Arbeit)" + "desc": "Fügt ein Bild an eine bestimmte Stelle im PDF ein (in Arbeit)", + "tags": "einfügen,einbetten,platzieren" }, "addAttachments": { "title": "Anhänge hinzufügen", - "desc": "Eingebettete Dateien (Anhänge) zu einer PDF hinzufügen oder entfernen" + "desc": "Eingebettete Dateien (Anhänge) zu einer PDF hinzufügen oder entfernen", + "tags": "einbetten,anhängen,einfügen" }, "watermark": { "title": "Wasserzeichen hinzufügen", - "desc": "Fügen Sie ein eigenes Wasserzeichen zu Ihrem PDF hinzu" + "desc": "Fügen Sie ein eigenes Wasserzeichen zu Ihrem PDF hinzu", + "tags": "stempel,markierung,überlagerung" }, "removePassword": { "title": "Passwort entfernen", - "desc": "Den Passwortschutz eines PDFs entfernen" + "desc": "Den Passwortschutz eines PDFs entfernen", + "tags": "entsperren" }, "compress": { "title": "Komprimieren", - "desc": "PDF komprimieren um die Dateigröße zu reduzieren" + "desc": "PDF komprimieren um die Dateigröße zu reduzieren", + "tags": "verkleinern,reduzieren,optimieren" }, "unlockPDFForms": { "title": "Schreibgeschützte PDF-Formfelder entfernen", - "desc": "Entfernen Sie die schreibgeschützte Eigenschaft von Formularfeldern in einem PDF-Dokument." + "desc": "Entfernen Sie die schreibgeschützte Eigenschaft von Formularfeldern in einem PDF-Dokument.", + "tags": "entsperren,aktivieren,bearbeiten" }, "changeMetadata": { "title": "Metadaten ändern", - "desc": "Ändern/Entfernen/Hinzufügen von Metadaten aus einem PDF-Dokument" + "desc": "Ändern/Entfernen/Hinzufügen von Metadaten aus einem PDF-Dokument", + "tags": "bearbeiten,ändern,aktualisieren" }, "ocr": { "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" + "desc": "Cleanup scannt und erkennt Text aus Bildern in einer PDF-Datei und fügt ihn erneut als Text hinzu", + "tags": "extrahieren,scannen" }, "extractImages": { "title": "Bilder extrahieren", - "desc": "Extrahiert alle Bilder aus einer PDF-Datei und speichert sie als Zip-Archiv" + "desc": "Extrahiert alle Bilder aus einer PDF-Datei und speichert sie als Zip-Archiv", + "tags": "extrahieren,speichern,exportieren" }, "scannerImageSplit": { "title": "Gescannte Fotos erkennen/aufteilen", - "desc": "Teilt mehrere Fotos aus einem Foto/PDF auf" + "desc": "Teilt mehrere Fotos aus einem Foto/PDF auf", + "tags": "erkennen,teilen,fotos" }, "sign": { "title": "Signieren", - "desc": "Fügt PDF-Signaturen durch Zeichnung, Text oder Bild hinzu" + "desc": "Fügt PDF-Signaturen durch Zeichnung, Text oder Bild hinzu", + "tags": "unterschrift,autogramm" }, "flatten": { "title": "Abflachen", - "desc": "Alle interaktiven Elemente und Formulare aus einem PDF entfernen" + "desc": "Alle interaktiven Elemente und Formulare aus einem PDF entfernen", + "tags": "vereinfachen,entfernen,interaktiv" }, "certSign": { "title": "Mit Zertifikat signieren", - "desc": "Ein PDF mit einem Zertifikat/Schlüssel (PEM/P12) 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" }, "repair": { "title": "Reparatur", - "desc": "Versucht, ein beschädigtes/kaputtes PDF zu reparieren" + "desc": "Versucht, ein beschädigtes/kaputtes PDF zu reparieren", + "tags": "reparieren,wiederherstellen" }, "removeBlanks": { "title": "Leere Seiten entfernen", - "desc": "Erkennt und entfernt leere Seiten aus einem Dokument" + "desc": "Erkennt und entfernt leere Seiten aus einem Dokument", + "tags": "löschen,bereinigen,leer" }, "removeAnnotations": { "title": "Anmerkungen entfernen", - "desc": "Entfernt alle Kommentare/Anmerkungen aus einem PDF" + "desc": "Entfernt alle Kommentare/Anmerkungen aus einem PDF", + "tags": "löschen,bereinigen,entfernen" }, "compare": { "title": "Vergleichen", - "desc": "Vergleicht und zeigt die Unterschiede zwischen zwei PDF-Dokumenten an" + "desc": "Vergleicht und zeigt die Unterschiede zwischen zwei PDF-Dokumenten an", + "tags": "unterschied" }, "removeCertSign": { "title": "Zertifikatsignatur entfernen", - "desc": "Zertifikatsignatur aus PDF entfernen" + "desc": "Zertifikatsignatur aus PDF entfernen", + "tags": "entfernen,löschen,entsperren" }, "pageLayout": { "title": "Mehrseitiges Layout", - "desc": "Mehrere Seiten eines PDF zu einer Seite zusammenführen" + "desc": "Mehrere Seiten eines PDF zu einer Seite zusammenführen", + "tags": "layout,anordnen,kombinieren" }, "bookletImposition": { "title": "Broschüren-Layout", - "desc": "Broschüren mit korrekter Seitenreihenfolge und mehrseitigem Layout für Druck und Bindung erstellen" + "desc": "Broschüren mit korrekter Seitenreihenfolge und mehrseitigem Layout für Druck und Bindung erstellen", + "tags": "broschüre,druck,bindung" }, "scalePages": { "title": "Seitengröße/Skalierung anpassen", - "desc": "Größe/Skalierung der Seite und/oder des Inhalts ändern" + "desc": "Größe/Skalierung der Seite und/oder des Inhalts ändern", + "tags": "größe ändern,anpassen,skalieren" }, "addPageNumbers": { "title": "Seitenzahlen hinzufügen", - "desc": "Hinzufügen von Seitenzahlen an einer bestimmten Stelle" + "desc": "Hinzufügen von Seitenzahlen an einer bestimmten Stelle", + "tags": "nummerieren,paginierung,zählen" }, "autoRename": { "title": "PDF-Datei automatisch umbenennen", - "desc": "Benennt eine PDF-Datei automatisch basierend auf der erkannten Überschrift um" + "desc": "Benennt eine PDF-Datei automatisch basierend auf der erkannten Überschrift um", + "tags": "auto-erkennung,kopfzeilen-basiert,organisieren,umbenennen" }, "adjustContrast": { "title": "Farben/Kontrast anpassen", - "desc": "Kontrast, Sättigung und Helligkeit einer PDF anpassen" + "desc": "Kontrast, Sättigung und Helligkeit einer PDF anpassen", + "tags": "kontrast,helligkeit,sättigung" }, "crop": { "title": "PDF zuschneiden", - "desc": "PDF zuschneiden um die Größe zu verändern (Text bleibt erhalten!)" + "desc": "PDF zuschneiden um die Größe zu verändern (Text bleibt erhalten!)", + "tags": "zuschneiden,schneiden,größe ändern" }, "autoSplitPDF": { "title": "PDF automatisch teilen", - "desc": "Physisch gescannte PDF anhand von Splitter-Seiten und QR-Codes aufteilen" + "desc": "Physisch gescannte PDF anhand von Splitter-Seiten und QR-Codes aufteilen", + "tags": "auto,teilen,QR" }, "sanitize": { "title": "Bereinigen", - "desc": "Potentiell schädliche Elemente aus PDF-Dateien entfernen" + "desc": "Potentiell schädliche Elemente aus PDF-Dateien entfernen", + "tags": "bereinigen,löschen,entfernen" }, "getPdfInfo": { "title": "Alle Informationen anzeigen", - "desc": "Erfasst alle möglichen Informationen in einer PDF" + "desc": "Erfasst alle möglichen Informationen in einer PDF", + "tags": "info,metadaten,details" }, "pdfToSinglePage": { "title": "PDF zu einer Seite zusammenfassen", - "desc": "Fügt alle PDF-Seiten zu einer einzigen großen Seite zusammen" + "desc": "Fügt alle PDF-Seiten zu einer einzigen großen Seite zusammen", + "tags": "kombinieren,zusammenführen,einzeln" }, "showJS": { "title": "Javascript anzeigen", - "desc": "Alle Javascript Funktionen in einer PDF anzeigen" + "desc": "Alle Javascript Funktionen in einer PDF anzeigen", + "tags": "javascript,code,skript" }, "redact": { "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)" + "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" + "desc": "PDFs über eine andere PDF überlagern", + "tags": "überlagern,kombinieren,stapeln" }, "splitBySections": { "title": "PDF nach Abschnitten aufteilen", - "desc": "Jede Seite einer PDF in kleinere horizontale und vertikale Abschnitte unterteilen" + "desc": "Jede Seite einer PDF in kleinere horizontale und vertikale Abschnitte unterteilen", + "tags": "teilen,abschnitte,aufteilen" }, "addStamp": { "title": "Stempel zu PDF hinzufügen", - "desc": "Text- oder Bildstempel an festgelegten Positionen hinzufügen" + "desc": "Text- oder Bildstempel an festgelegten Positionen hinzufügen", + "tags": "stempel,markierung,siegel" }, "removeImage": { "title": "Bild entfernen", - "desc": "Bild aus PDF entfernen, um die Dateigröße zu verringern" + "desc": "Bild aus PDF entfernen, um die Dateigröße zu verringern", + "tags": "entfernen,löschen,bereinigen" }, "splitByChapters": { "title": "PDF-Datei nach Kapiteln aufteilen", - "desc": "Aufteilung einer PDF-Datei in mehrere Dateien auf Basis der Kapitelstruktur." + "desc": "Aufteilung einer PDF-Datei in mehrere Dateien auf Basis der Kapitelstruktur.", + "tags": "teilen,kapitel,struktur" }, "validateSignature": { "title": "PDF-Signatur überprüfen", - "desc": "Digitale Signaturen und Zertifikate in PDF-Dokumenten überprüfen" + "desc": "Digitale Signaturen und Zertifikate in PDF-Dokumenten überprüfen", + "tags": "validieren,überprüfen,zertifikat" }, "swagger": { "title": "API-Dokumentation", - "desc": "API-Dokumentation anzeigen und Endpunkte testen" + "desc": "API-Dokumentation anzeigen und Endpunkte testen", + "tags": "API,dokumentation,test" }, "fakeScan": { "title": "Scan simulieren", @@ -538,42 +585,52 @@ }, "editTableOfContents": { "title": "Inhaltsverzeichnis bearbeiten", - "desc": "Hinzufügen oder Bearbeiten von Lesezeichen und Inhaltsverzeichnissen in PDF-Dokumenten" + "desc": "Hinzufügen oder Bearbeiten von Lesezeichen und Inhaltsverzeichnissen in PDF-Dokumenten", + "tags": "lesezeichen,inhalt,bearbeiten" }, "manageCertificates": { "title": "Zertifikate verwalten", - "desc": "Digitale Zertifikatsdateien für die PDF-Signierung importieren, exportieren oder löschen." + "desc": "Digitale Zertifikatsdateien für die PDF-Signierung importieren, exportieren oder löschen.", + "tags": "zertifikate,importieren,exportieren" }, "read": { "title": "Lesen", - "desc": "PDFs anzeigen und kommentieren. Text hervorheben, zeichnen oder Kommentare für Überprüfung und Zusammenarbeit einfügen." + "desc": "PDFs anzeigen und kommentieren. Text hervorheben, zeichnen oder Kommentare für Überprüfung und Zusammenarbeit einfügen.", + "tags": "anzeigen,öffnen,anzeigen" }, "reorganizePages": { "title": "Seiten neu anordnen", - "desc": "PDF-Seiten mit visueller Drag-and-Drop-Steuerung neu anordnen, duplizieren oder löschen." + "desc": "PDF-Seiten mit visueller Drag-and-Drop-Steuerung neu anordnen, duplizieren oder löschen.", + "tags": "umordnen,neu anordnen,organisieren" }, "extractPages": { "title": "Seiten extrahieren", - "desc": "Spezifische Seiten aus einem PDF-Dokument extrahieren" + "desc": "Spezifische Seiten aus einem PDF-Dokument extrahieren", + "tags": "extrahieren,auswählen,kopieren" }, "removePages": { "title": "Entfernen", - "desc": "Ungewollte Seiten aus dem PDF entfernen" + "desc": "Ungewollte Seiten aus dem PDF entfernen", + "tags": "löschen,extrahieren,ausschließen" }, "autoSizeSplitPDF": { "title": "Teilen nach Größe/Anzahl", - "desc": "Teilen Sie ein einzelnes PDF basierend auf Größe, Seitenanzahl oder Dokumentanzahl in mehrere Dokumente auf" + "desc": "Teilen Sie ein einzelnes PDF basierend auf Größe, Seitenanzahl oder Dokumentanzahl in mehrere Dokumente auf", + "tags": "auto,teilen,größe" }, "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" }, "devApi": { - "desc": "Link zur API-Dokumentation" + "desc": "Link zur API-Dokumentation", + "tags": "API,entwicklung,dokumentation", + "title": "API" }, "devFolderScanning": { "title": "Automatische Ordnerüberwachung", - "desc": "Link zum Leitfaden für automatisches Ordner-Scannen" + "desc": "Link zum Leitfaden für automatisches Ordner-Scannen", + "tags": "automatisierung,ordner,scannen" }, "devSsoGuide": { "title": "SSO-Anleitung", @@ -593,7 +650,17 @@ }, "automate": { "title": "Automatisieren", - "desc": "Mehrstufige Arbeitsabläufe durch Verkettung von PDF-Aktionen erstellen. Ideal für wiederkehrende Aufgaben." + "desc": "Mehrstufige Arbeitsabläufe durch Verkettung von PDF-Aktionen erstellen. Ideal für wiederkehrende Aufgaben.", + "tags": "arbeitsablauf,sequenz,automatisierung" + }, + "replaceColor": { + "desc": "Farben in PDF-Dokumenten ersetzen oder invertieren", + "title": "Farbe ersetzen & invertieren" + }, + "scannerEffect": { + "desc": "Erstellen Sie eine PDF, die aussieht, als wäre sie gescannt worden", + "tags": "scannen,simulieren,erstellen", + "title": "Scanner-Effekt" } }, "landing": { @@ -633,8 +700,18 @@ "merge": { "tags": "zusammenführen,seitenvorgänge,back end,serverseitig", "title": "Zusammenführen", - "removeDigitalSignature": "Digitale Signatur in der zusammengeführten Datei entfernen?", - "generateTableOfContents": "Inhaltsverzeichnis in der zusammengeführten Datei erstellen?", + "removeDigitalSignature": { + "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" + } + }, + "generateTableOfContents": { + "tooltip": { + "description": "Erstellt automatisch ein klickbares Inhaltsverzeichnis in der zusammengeführten PDF basierend auf den ursprünglichen Dateinamen und Seitenzahlen.", + "title": "Inhaltsverzeichnis generieren" + } + }, "submit": "Zusammenführen", "sortBy": { "description": "Dateien werden in der Reihenfolge zusammengeführt, in der sie ausgewählt wurden. Ziehen Sie zum Neuordnen oder sortieren Sie unten.", @@ -860,7 +937,13 @@ "images": "Bilder", "officeDocs": "Office-Dokumente (Word, Excel, PowerPoint)", "imagesExt": "Bilder (JPG, PNG, usw.)", - "grayscale": "Graustufen" + "grayscale": "Graustufen", + "dpi": "DPI", + "markdown": "Markdown", + "odtExt": "OpenDocument Text (.odt)", + "pptExt": "PowerPoint (.pptx)", + "rtfExt": "Rich Text Format (.rtf)", + "textRtf": "Text/RTF" }, "imageToPdf": { "tags": "konvertierung,img,jpg,bild,foto" @@ -900,7 +983,20 @@ "10": "Ungerade-Gerade-Zusammenführung", "11": "Alle Seiten duplizieren" }, - "placeholder": "(z.B. 1,3,2 oder 4-8,2,10-12 oder 2n-1)" + "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)." + } }, "addImage": { "tags": "img,jpg,bild,foto", @@ -929,7 +1025,8 @@ "failed": "Ein Fehler ist beim Hinzufügen des Wasserzeichens zur PDF aufgetreten." }, "watermarkType": { - "image": "Bild" + "image": "Bild", + "text": "Text" }, "settings": { "type": "Wasserzeichen-Typ", @@ -1333,7 +1430,9 @@ }, "trapped": { "label": "Trapped-Status", - "unknown": "Unbekannt" + "unknown": "Unbekannt", + "false": "Falsch", + "true": "Wahr" }, "advanced": { "title": "Erweiterte Optionen" @@ -1522,7 +1621,13 @@ "header": "Bilder extrahieren", "selectText": "Wählen Sie das Bildformat aus, in das extrahierte Bilder konvertiert werden sollen", "allowDuplicates": "Doppelte Bilder speichern", - "submit": "Extrahieren" + "submit": "Extrahieren", + "error": { + "failed": "Beim Extrahieren der Bilder aus der PDF ist ein Fehler aufgetreten." + }, + "settings": { + "title": "Einstellungen" + } }, "pdfToPDFA": { "tags": "archiv,langfristig,standard,konvertierung,speicherung,aufbewahrung", @@ -1599,8 +1704,14 @@ "title": "Signieren", "header": "PDFs signieren", "upload": "Bild hochladen", - "draw": "Signatur zeichnen", - "text": "Texteingabe", + "draw": { + "clear": "Löschen", + "title": "Zeichnen Sie Ihre Unterschrift" + }, + "text": { + "name": "Name des Unterzeichners", + "placeholder": "Geben Sie Ihren vollständigen Namen ein" + }, "clear": "Leeren", "add": "Signieren", "saved": "Gespeicherte Signaturen", @@ -1616,7 +1727,35 @@ "previous": "Vorherige Seite", "maintainRatio": "Seitenverhältnis beibehalten ein-/ausschalten", "undo": "Rückgängig", - "redo": "Wiederherstellen" + "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" + }, + "steps": { + "configure": "Signatur konfigurieren" + }, + "submit": "Dokument signieren", + "type": { + "canvas": "Canvas", + "draw": "Zeichnen", + "image": "Bild", + "text": "Text", + "title": "Signaturtyp" + } }, "flatten": { "tags": "statisch,deaktivieren,nicht interaktiv,optimieren", @@ -1635,7 +1774,8 @@ "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." + "note": "Das Abflachen entfernt interaktive Elemente aus der PDF und macht sie nicht mehr bearbeitbar.", + "flattenOnlyForms": "Nur Formulare vereinfachen" }, "results": { "title": "Reduzierungs-Ergebnisse" @@ -1693,7 +1833,8 @@ "label": "Pixel-Weißheitsschwellwert" }, "whitePercent": { - "label": "Weiß-Prozentsatz-Schwellwert" + "label": "Weiß-Prozentsatz-Schwellwert", + "unit": "%" }, "includeBlankPages": { "label": "Erkannte leere Seiten einschließen" @@ -1730,7 +1871,17 @@ "tags": "kommentare,hervorheben,notizen,markieren,entfernen", "title": "Kommentare entfernen", "header": "Kommentare entfernen", - "submit": "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" + } }, "compare": { "tags": "differenzieren,kontrastieren,verändern,analysieren", @@ -2015,7 +2166,9 @@ }, "pageSize": { "label": "Ziel-Seitengröße", - "keep": "Ursprüngliche Größe beibehalten" + "keep": "Ursprüngliche Größe beibehalten", + "legal": "Legal", + "letter": "Letter" }, "submit": "Seitenskalierung anpassen", "error": { @@ -2306,7 +2459,8 @@ "showLayers": "Ebenen anzeigen (Doppelklick, um alle Ebenen auf den Standardzustand zurückzusetzen)", "colourPicker": "Farbwähler", "findCurrentOutlineItem": "Aktuelles Gliederungselement finden", - "applyChanges": "Änderungen anwenden" + "applyChanges": "Änderungen anwenden", + "zoom": "Zoom" } }, "tableExtraxt": { @@ -2496,7 +2650,8 @@ "magicLinkSent": "Magic Link wurde an {{email}} gesendet! Prüfen Sie Ihre E-Mails und klicken Sie auf den Link zur Anmeldung.", "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}}" + "unexpectedError": "Unerwarteter Fehler: {{message}}", + "debug": "Debug" }, "signup": { "title": "Konto erstellen", @@ -2518,7 +2673,8 @@ "invalidEmail": "Bitte geben Sie eine gültige E-Mail-Adresse ein", "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}}" + "unexpectedError": "Unerwarteter Fehler: {{message}}", + "name": "Name" }, "pdfToSinglePage": { "title": "PDF zu einer Seite zusammenfassen", @@ -2961,7 +3117,12 @@ "selectedCount": "{{count}} ausgewählt", "download": "Herunterladen", "delete": "Löschen", - "unsupported": "Nicht unterstützt" + "unsupported": "Nicht unterstützt", + "fileFormat": "Format", + "fileName": "Name", + "fileVersion": "Version", + "googleDrive": "Google Drive", + "googleDriveShort": "Drive" }, "storage": { "temporaryNotice": "Dateien werden temporär in Ihrem Browser gespeichert und können automatisch gelöscht werden", @@ -2992,12 +3153,24 @@ "options": { "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": "JavaScript entfernen", - "removeEmbeddedFiles": "Eingebettete Dateien entfernen", - "removeXMPMetadata": "XMP-Metadaten entfernen", - "removeMetadata": "Dokument-Metadaten entfernen", - "removeLinks": "Links entfernen", - "removeFonts": "Schriftarten entfernen" + "removeJavaScript": { + "desc": "JavaScript-Aktionen und Skripte aus der PDF entfernen" + }, + "removeEmbeddedFiles": { + "desc": "Alle in der PDF eingebetteten Dateien entfernen" + }, + "removeXMPMetadata": { + "desc": "XMP-Metadaten aus der PDF entfernen" + }, + "removeMetadata": { + "desc": "Dokumentinformations-Metadaten (Titel, Autor usw.) entfernen" + }, + "removeLinks": { + "desc": "Externe Links und Launch-Aktionen aus der PDF entfernen" + }, + "removeFonts": { + "desc": "Eingebettete Schriftarten aus der PDF entfernen" + } } }, "addPassword": { @@ -3025,7 +3198,8 @@ "keyLength": { "label": "Verschlüsselungsschlüssellänge", "40bit": "40-bit (Niedrig)", - "256bit": "256-bit (Hoch)" + "256bit": "256-bit (Hoch)", + "128bit": "128-bit (Standard)" } }, "results": { @@ -3264,5 +3438,58 @@ }, "generateError": "Wir konnten Ihren API-Schlüssel nicht generieren." } - } + }, + "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.", + "placeholder": "Dateien auswählen...", + "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" + } + }, + "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 diff --git a/frontend/public/locales/es-ES/translation.json b/frontend/public/locales/es-ES/translation.json index 540ff0163..2234e8275 100644 --- a/frontend/public/locales/es-ES/translation.json +++ b/frontend/public/locales/es-ES/translation.json @@ -3,8 +3,8 @@ "direction": "ltr" }, "addPageNumbers": { - "fontSize": "Tamaño de Letra", - "fontName": "Nombre de Letra", + "fontSize": "Tamaño de fuente", + "fontName": "Nombre de fuente", "title": "Añadir Números de Página", "header": "Añadir Números de Página", "selectText": { @@ -22,16 +22,16 @@ }, "pdfPrompt": "Seleccionar PDF(s)", "multiPdfPrompt": "Seleccionar PDFs (2+)", - "multiPdfDropPrompt": "Seleccione (o arrastre y suelte) todos los PDFs que quiera", + "multiPdfDropPrompt": "Seleccione (o arrastre y suelte) todos los PDF que necesite", "imgPrompt": "Seleccionar Imagen(es)", - "genericSubmit": "Enviar", + "genericSubmit": "Procesar", "uploadLimit": "Tamaño máximo de archivo:", "uploadLimitExceededSingular": "es demasiado grande. El tamaño máximo permitido es", "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 de páginas (Introduzca una lista de números de página separados por coma):", - "pageSelectionPrompt": "Selección de página personalizada (Introduzca una lista de números de página separados por comas 1,5,6 o funciones como 2n+1):", - "goToPage": "Ir a", + "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", @@ -40,8 +40,8 @@ "close": "Cerrar", "filesSelected": "archivos seleccionados", "noFavourites": "No se agregaron favoritos", - "downloadComplete": "Descarga finalizada", - "bored": "¿Cansado de esperar?", + "downloadComplete": "Descarga completada", + "bored": "¿Aburrido de esperar?", "alphabet": "Alfabeto", "downloadPdf": "Descargar PDF", "text": "Texto", @@ -57,37 +57,40 @@ "error": { "pdfPassword": "El documento PDF está protegido con contraseña y no se ha proporcionado o es incorrecta", "_value": "Error", - "sorry": "¡Perdón por el fallo!", + "sorry": "¡Disculpe por el problema!", "needHelp": "¿Necesita ayuda / Encontró un fallo?", - "contactTip": "Si sigue experimentando errores, no dude en contactarnos para solicitar soporte. Puede enviarnos un ticket en la página de GitHub o contactarnos mediante Discord:", + "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:", "404": { - "head": "404 - Página no encontrada | Ups, ¡algo salió mal!", - "1": "Parece que no podemos encontrar la página que está buscando.", + "head": "404 - Página No Encontrada | ¡Vaya, nos tropezamos en el código!", + "1": "No podemos encontrar la página que está buscando.", "2": "Algo salió mal" }, "github": "Envíe un ticket en GitHub", "showStack": "Mostrar seguimiento de pila", - "copyStack": "Mostrar seguimiento de pila", + "copyStack": "Copiar seguimiento de pila", "githubSubmit": "GitHub - Enviar un ticket", - "discordSubmit": "Discord - Enviar mensaje de soporte" + "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." }, "delete": "Borrar", "username": "Nombre de usuario", "password": "Contraseña", "welcome": "Bienvenido", - "property": "Propietario", + "property": "Propiedad", "black": "Negro", "white": "Blanco", "red": "Rojo", "green": "Verde", "blue": "Azul", "custom": "Personalizado...", - "WorkInProgess": "Tarea en progreso, puede no funcionar o ralentizarse; ¡por favor, informe de cualquier problema!", + "WorkInProgress": "Tarea en progreso, puede no funcionar o ralentizarse; ¡por favor, informe de cualquier problema!", "poweredBy": "Desarrollado por", "yes": "Sí", "no": "No", "changedCredsMessage": "¡Se cambiaron las credenciales!", - "notAuthenticatedMessage": "Usuario no autentificado.", + "notAuthenticatedMessage": "Usuario no autenticado.", "userNotFoundMessage": "Usuario no encontrado.", "incorrectPasswordMessage": "La contraseña actual no es correcta.", "usernameExistsMessage": "El nuevo nombre de usuario está en uso.", @@ -99,14 +102,14 @@ "downgradeCurrentUserMessage": "No se puede degradar el rol del usuario actual", "disabledCurrentUserMessage": "El usuario actual no se puede deshabilitar", "downgradeCurrentUserLongMessage": "No se puede degradar el rol del usuario actual. Por lo tanto, el usuario actual no se mostrará.", - "userAlreadyExistsOAuthMessage": "La usuario ya existe como usuario de OAuth2.", + "userAlreadyExistsOAuthMessage": "El usuario ya existe como usuario de OAuth2.", "userAlreadyExistsWebMessage": "El usuario ya existe como usuario web.", "oops": "¡Ups!", "help": "Ayuda", "goHomepage": "Ir a la página principal", "joinDiscord": "Únase a nuestro servidor Discord", "seeDockerHub": "Ver Docker Hub", - "visitGithub": "Visitar Repositorio de Github", + "visitGithub": "Visitar Repositorio de GitHub", "donate": "Donar", "color": "Color", "sponsor": "Patrocinador", @@ -124,8 +127,9 @@ "terms": "Términos y Condiciones", "accessibility": "Accesibilidad", "cookie": "Política de Cookies", - "impressum": "Impresión", - "showCookieBanner": "Preferencias de cookies" + "impressum": "Aviso legal", + "showCookieBanner": "Preferencias de cookies", + "iAgreeToThe": "Acepto todos los" }, "pipeline": { "header": "Menú de automatización (Alfa)", @@ -151,9 +155,9 @@ "validateButton": "Validar" }, "enterpriseEdition": { - "button": "Actualiza a Pro", + "button": "Actualizar a Pro", "warning": "Esta característica está únicamente disponible para usuarios Pro.", - "yamlAdvert": "Stirling PDF Pro soporta configuración de ficheros YAML y otras características SSO.", + "yamlAdvert": "Stirling PDF Pro admite archivos YAML y otras características SSO.", "ssoAdvert": "¿Busca más funciones de administración de usuarios? Consulte Stirling PDF Pro" }, "analytics": { @@ -166,7 +170,7 @@ }, "navbar": { "favorite": "Favoritos", - "recent": "Nuevo y recientemente actualizado", + "recent": "Nuevos y recientemente actualizados", "darkmode": "Modo oscuro", "language": "Idiomas", "settings": "Configuración", @@ -177,7 +181,7 @@ "organize": "Organizar", "convertTo": "Convertir a PDF", "convertFrom": "Convertir desde PDF", - "security": "Señalización y seguridad", + "security": "Firma y seguridad", "advance": "Avanzado", "edit": "Ver y Editar", "popular": "Populares" @@ -186,7 +190,7 @@ "settings": { "title": "Configuración", "update": "Actualización disponible", - "updateAvailable": "{0} es la versión instalada. Hay disponible una versión nueva ({1}).", + "updateAvailable": "{0} es la versión instalada actualmente. Hay una nueva versión ({1}) disponible.", "appVersion": "Versión de la aplicación:", "downloadOption": { "title": "Elegir la opción de descarga (para descargas de un solo archivo sin ZIP):", @@ -293,8 +297,8 @@ "retry": "Reintentar" }, "database": { - "title": "Base de Datos Importar/Exportar", - "header": "Base de Datos Importar/Exportar", + "title": "Importar/Exportar base de datos", + "header": "Importar/Exportar base de datos", "fileName": "Nombre de Archivo", "creationDate": "Fecha de creación", "fileSize": "Tamaño de archivo", @@ -310,7 +314,7 @@ "fileNotFound": "Archivo no encontrado", "fileNullOrEmpty": "El archivo no puede ser nulo o vacío.", "failedImportFile": "Archivo de importación fallido", - "notSupported": "Esta función no esta disponible para su conexión de Base de Datos" + "notSupported": "Esta función no está disponible para su conexión de Base de Datos" }, "session": { "expired": "Su sesión ha caducado. Actualice la página e inténtelo de nuevo.", @@ -333,19 +337,23 @@ "sortBy": "Ordenado por:", "multiTool": { "title": "Multi-herramienta PDF", - "desc": "Combinar, rotar, reorganizar y eliminar páginas" + "desc": "Combinar, rotar, reorganizar y eliminar páginas", + "tags": "múltiple,herramientas" }, "merge": { "title": "Unir", - "desc": "Unir fácilmente múltiples PDFs en uno" + "desc": "Unir fácilmente múltiples PDFs en uno", + "tags": "combinar,unir,juntar" }, "split": { "title": "Dividir", - "desc": "Dividir PDFs en múltiples documentos" + "desc": "Dividir PDFs en múltiples documentos", + "tags": "dividir,separar,partir" }, "rotate": { "title": "Rotar", - "desc": "Rotar fácilmente sus PDFs" + "desc": "Rotar fácilmente sus PDFs", + "tags": "girar,voltear,orientar" }, "imageToPDF": { "title": "Imagen a PDF", @@ -357,43 +365,50 @@ }, "pdfOrganiser": { "title": "Organizador", - "desc": "Eliminar/Reorganizar páginas en cualquier orden" + "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)" + "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": "Añadir una marca de agua predefinida al documento PDF" + "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" }, "pageRemover": { - "title": "Eliminar", + "title": "Eliminar páginas", "desc": "Eliminar páginas no deseadas del documento PDF" }, "addPassword": { - "title": "Añadir contraseña", - "desc": "Encriptar el documento PDF con una contraseña" + "title": "Proteger con contraseña", + "desc": "Cifrar documento PDF con contraseña" }, "removePassword": { - "title": "Eliminar contraseña", - "desc": "Eliminar la contraseña del documento PDF" + "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" + "desc": "Comprimir PDFs para reducir el tamaño del archivo", + "tags": "reducir,disminuir,optimizar" }, "unlockPDFForms": { - "title": "Unlock PDF Forms", - "desc": "Remove read-only property of form fields in a PDF document." + "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/Añadir metadatos al documento PDF" + "desc": "Cambiar, eliminar o agregar metadatos del documento PDF", + "tags": "editar,modificar,actualizar" }, "fileToPDF": { "title": "Convertir archivo a PDF", @@ -401,15 +416,17 @@ }, "ocr": { "title": "Ejecutar OCR en PDF y/o tareas de limpieza", - "desc": "Tareas de limpieza y detectar texto en imágenes dentro de un PDF y volver a incrustarlo como texto" + "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" + "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" + "desc": "Convertir PDF a PDF/A para almacenamiento a largo plazo y cumplimiento de estándares" }, "PDFToWord": { "title": "PDF a Word", @@ -437,43 +454,53 @@ }, "sign": { "title": "Firmar", - "desc": "Añadir firma a PDF mediante dibujo, texto o imagen" + "desc": "Añadir firma a PDF mediante dibujo, texto o imagen", + "tags": "firma,autógrafo" }, "flatten": { - "title": "Aplanar", - "desc": "Eliminar todos los elementos y formularios interactivos de un PDF" + "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" + "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" + "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" + "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" + "desc": "Comparar y mostrar las diferencias entre 2 documentos PDF", + "tags": "diferencia" }, "certSign": { "title": "Firmar con certificado", - "desc": "Firmar un PDF con un Certificado/Clave (PEM/P12)" + "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 signo de certificado", - "desc": "Eliminar firma de certificado de PDF" + "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": "Unir varias páginas de un documento PDF en una sola página" + "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" + "desc": "Escalar/cambiar el tamaño de una pagina y/o su contenido", + "tags": "redimensionar,ajustar,escalar" }, "pipeline": { "title": "Automatización", @@ -481,23 +508,27 @@ }, "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" + "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 PDF automáticamente", + "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" + "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!)" + "desc": "Recortar un PDF para reducir su tamaño (¡conservando el texto!)", + "tags": "recortar,cortar,redimensionar" }, "autoSplitPDF": { "title": "Auto Dividir Páginas", - "desc": "Auto Dividir PDF escaneado con código QR divsor de página escaneada físicamente" + "desc": "Dividir automáticamente PDF escaneado usando códigos QR divisores", + "tags": "auto,dividir,QR" }, "sanitizePDF": { "title": "Desinfectar", @@ -521,7 +552,8 @@ }, "getPdfInfo": { "title": "Obtener toda la información en PDF", - "desc": "Obtiene toda la información posible de archivos PDF" + "desc": "Obtiene toda la información posible de archivos PDF", + "tags": "info,metadatos,detalles" }, "pageExtracter": { "title": "Extraer página(s)", @@ -529,19 +561,22 @@ }, "pdfToSinglePage": { "title": "PDF a una sola página", - "desc": "Unir todas las páginas del PDF en 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" + "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": "Redacción Manual", - "desc": "Redacta un PDF basado en el texto seleccionado, dibuja formas y/o página(s) selecionada(s)" + "title": "Redactar", + "desc": "Ocultar texto confidencial en PDF", + "tags": "censurar,ocultar,tapar" }, "PDFToCSV": { "title": "PDF a CSV", @@ -565,32 +600,40 @@ }, "removeImage": { "title": "Eliminar imagen", - "desc": "Eliminar imagen del PDF> para reducir el tamaño de archivo" + "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." + "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": "Verifica firmas digitales y certificados en los documentos 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" + "title": "Convertir", + "desc": "Convertir archivos entre diferentes formatos", + "tags": "transformar,cambiar" }, "attachments": { "title": "Add attachments" }, "extractPages": { - "title": "Extraer Páginas" + "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" + "desc": "Eliminar páginas no deseadas del documento PDF", + "tags": "eliminar,extraer,excluir" }, "removeImagePdf": { "title": "Eliminar imagen", @@ -598,7 +641,8 @@ }, "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" + "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", @@ -609,7 +653,105 @@ "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" + "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" } }, "viewPdf": { @@ -625,11 +767,11 @@ "selectAll": "Seleccionar Todo", "deselectAll": "Deseleccionar Todo", "selectPages": "Seleccionar página(s)", - "selectedPages": "Página(s) Selecccionada(s)", + "selectedPages": "Página(s) seleccionada(s)", "page": "Página", - "deleteSelected": "Borrar selecionado(s)", + "deleteSelected": "Borrar seleccionado(s)", "downloadAll": "Exportar", - "downloadSelected": "Exportar selecionado(s)", + "downloadSelected": "Exportar seleccionado(s)", "insertPageBreak": "Insertar salto página", "addFile": "Agregar Archivo", "rotateLeft": "Rotar a la izquierda", @@ -638,7 +780,7 @@ "moveLeft": "Mover a la izquierda", "moveRight": "Mover a la derecha", "delete": "Borrar", - "dragDropMessage": "Página(s) Selecccionada(s)", + "dragDropMessage": "Página(s) seleccionada(s)", "undo": "Deshacer", "redo": "Rehacer" }, @@ -651,7 +793,28 @@ "removeCertSign": "¿Eliminar la firma digital en el archivo unido?", "submit": "Unir", "sortBy": { - "filename": "Nombre de Archivo" + "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", + "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" + } } }, "split": { @@ -671,16 +834,112 @@ "splitPages": "Introducir las páginas para dividir:", "submit": "Dividir", "steps": { - "settings": "Configuración" + "settings": "Configuración", + "chooseMethod": "Elegir Método" }, "methods": { "bySize": { - "name": "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)" + }, + "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" + "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" + } + }, + "error": { + "failed": "Se produjo un error al dividir el PDF." + }, + "method": { + "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" + }, + "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" + }, + "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" + }, + "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" + }, + "header": { + "title": "Resumen de Métodos de División" } } }, @@ -689,7 +948,27 @@ "title": "Rotar PDF", "header": "Rotar PDF", "selectAngle": "Seleccionar ángulo de rotación (en múltiplos de 90 grados):", - "submit": "Rotar" + "submit": "Rotar", + "error": { + "failed": "Se produjo un error al rotar el PDF." + }, + "preview": { + "title": "Vista Previa de Rotación" + }, + "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" + }, + "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" + } + } }, "imageToPdf": { "tags": "conversión,img,jpg,imagen,fotografía" @@ -729,12 +1008,25 @@ "10": "Unir impar-par", "11": "Duplicar todas las páginas" }, - "placeholder": "(por ejemplo, 1,3,2 o 4-8,2,10-12 o 2n-1)" + "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)." + } }, "addImage": { "tags": "img,jpg,imagen,fotografía", "title": "Añadir imagen", - "header": "Añadir imagen de PDF", + "header": "Añadir imagen al PDF", "everyPage": "¿Todas las páginas?", "upload": "Añadir imagen", "submit": "Enviar imagen" @@ -762,10 +1054,177 @@ "2": "Imagen" }, "watermarkType": { - "text": "Texto" + "text": "Texto", + "image": "Imagen" }, "settings": { - "fontSize": "Tamaño de Letra" + "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": { @@ -790,11 +1249,58 @@ "removePages": { "tags": "Borrar páginas,eliminar páginas", "title": "Eliminar", - "submit": "Eliminar" + "submit": "Eliminar", + "error": { + "failed": "Se produjo un error al eliminar páginas." + }, + "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": { + "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" + }, + "safety": { + "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" + } + } }, "addPassword": { "tags": "seguro,seguridad", - "title": "Añadir contraseña", + "title": "Proteger con contraseña", "header": "Añadir contraseña (encriptar)", "selectText": { "1": "Seleccionar PDF para encriptar", @@ -817,13 +1323,59 @@ "submit": "Encriptar", "tooltip": { "permissions": { - "title": "Cambiar permisos" + "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" + }, + "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" + }, + "stepTitle": "Contraseñas y cifrado", + "user": { + "label": "Contraseña de usuario", + "placeholder": "Introduzca la contraseña de usuario" + } + }, + "results": { + "title": "PDFs cifrados" } }, "removePassword": { - "tags": "seguro,Desencriptar,seguridad,quitar contraseña,eliminar contraseña", - "title": "Eliminar contraseña", + "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", @@ -833,21 +1385,47 @@ "desc": "Eliminar la contraseña del documento PDF", "password": { "stepTitle": "Eliminar contraseña", - "label": "Contraseña actual" + "label": "Contraseña actual", + "completed": "Contraseña configurada", + "placeholder": "Introduzca la contraseña actual" + }, + "error": { + "failed": "Se produjo un error al eliminar la contraseña del PDF." + }, + "filenamePrefix": "descifrado", + "results": { + "title": "PDF Descifrados" + }, + "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." } }, "compressPdfs": { "tags": "aplastar,pequeño,diminuto" }, "unlockPDFForms": { - "tags": "remove,delete,form,field,readonly", - "title": "Remove Read-Only from Form Fields", - "header": "Unlock PDF Forms", - "submit": "Remove" + "tags": "eliminar,borrar,formulario,campo,solo lectura", + "title": "Eliminar Solo Lectura de Campos de Formulario", + "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" + }, + "results": { + "title": "Resultados de Formularios Desbloqueados" + } }, "changeMetadata": { "tags": "título,autor,fecha,creación,hora,editorial,productor,estadísticas", - "title": "Título:", + "title": { + "label": "Título", + "placeholder": "Título del documento" + }, "header": "Cambiar metadatos", "selectText": { "1": "Editar las variables que desea cambiar", @@ -856,15 +1434,123 @@ "4": "Otros Metadatos:", "5": "Agregar entrada de metadatos personalizados" }, - "author": "Autor:", - "creationDate": "Fecha de creación (aaaa/MM/dd HH:mm:ss):", - "creator": "Creador:", - "keywords": "Palabras clave:", + "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": "Productor:", - "subject": "Asunto:", - "trapped": "Capturado:", - "submit": "Cambiar" + "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" + } + } }, "fileToPDF": { "tags": "transformación,formato,documento,imagen,diapositiva,texto,conversión,office,docs,word,excel,powerpoint", @@ -872,7 +1558,7 @@ "header": "Convertir cualquier archivo a PDF", "credit": "Este servicio usa LibreOffice y Unoconv para la conversión de archivos", "supportedFileTypesInfo": "Tipos de archivos admitidos", - "supportedFileTypes": "Los tipos de archivo soportados deben incluir los indicados a continuación; sin embargo, para una completa y acutualizada lista de formatos soportados, por favor consulte la documentación de LibreOffice", + "supportedFileTypes": "Los tipos de archivo soportados deben incluir los indicados a continuación; sin embargo, para una completa y actualizada lista de formatos soportados, por favor consulte la documentación de LibreOffice", "submit": "Convertir a PDF" }, "ocr": { @@ -885,8 +1571,8 @@ "3": "Corregir las páginas que se escanearon en un ángulo torcido girándolas nuevamente a su lugar", "4": "Limpiar la página para que sea menos probable que el OCR encuentre texto en el ruido de fondo (Sin cambio de salida)", "5": "Limpiar la página para que sea menos probable que el OCR encuentre texto en el ruido de fondo, mantiene la limpieza en la salida.", - "6": "Ignorar las páginas que tienen texto interactivo, solo las páginas OCR que son imágenes", - "7": "Forzar OCR, OCR eliminará en cada página todo el texto original", + "6": "Ignorar páginas que ya tienen texto editable, solo aplicar OCR en páginas que son imágenes", + "7": "Forzar OCR, procesará cada página eliminando todo el texto original", "8": "Normal (se producirá un error si el PDF contiene texto)", "9": "Ajustes adicionales", "10": "Modo OCR", @@ -900,19 +1586,83 @@ "settings": { "title": "Configuración", "ocrMode": { - "label": "Modo OCR" + "label": "Modo OCR", + "auto": "Automático (omitir capas de texto)", + "force": "Forzar (re-OCR todo, reemplazar texto)", + "strict": "Estricto (abortar si se encuentra texto)" }, "languages": { - "label": "Idiomas" + "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" } }, "tooltip": { "mode": { - "title": "Modo OCR" + "title": "Modo OCR", + "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." }, "languages": { - "title": "Idiomas" + "title": "Idiomas", + "text": "Mejore la precisión del OCR especificando los idiomas esperados. Elija uno o más idiomas para guiar la detección." + }, + "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" + }, + "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" + } + }, + "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" } }, "extractImages": { @@ -921,7 +1671,13 @@ "header": "Extraer imágenes", "selectText": "Seleccionar el formato de imagen para convertir las imágenes extraídas", "allowDuplicates": "Guardar imágenes duplicadas", - "submit": "Extraer" + "submit": "Extraer", + "error": { + "failed": "Ocurrió un error al extraer imágenes del PDF." + }, + "settings": { + "title": "Configuración" + } }, "pdfToPDFA": { "tags": "archivo,largo plazo,estándar,conversión,almacenamiento,conservación", @@ -998,8 +1754,14 @@ "title": "Firmar", "header": "Firmar archivos PDF", "upload": "Subir imagen", - "draw": "Dibujar firma", - "text": "Entrada de texto", + "draw": { + "clear": "Limpiar", + "title": "Dibuje su firma" + }, + "text": { + "name": "Nombre del Firmante", + "placeholder": "Ingrese su nombre completo" + }, "clear": "Borrar", "add": "Agregar", "saved": "firmas guardadas", @@ -1015,7 +1777,35 @@ "previous": "Página anterior", "maintainRatio": "Activar/desactivar la relación de aspecto", "undo": "Deshacer", - "redo": "Rehacer" + "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" + }, + "steps": { + "configure": "Configurar Firma" + }, + "submit": "Firmar Documento", + "type": { + "canvas": "Lienzo", + "draw": "Dibujar", + "image": "Imagen", + "text": "Texto", + "title": "Tipo de Firma" + } }, "flatten": { "tags": "estática,desactivar,no interactiva,etiqueta dinámica", @@ -1027,30 +1817,124 @@ "settings": "Configuración" }, "options": { - "flattenOnlyForms": "Aplanar sólo formularios" + "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" + }, + "results": { + "title": "Resultados de Aplanado" + }, + "tooltip": { + "description": { + "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?" + }, + "formsOnly": { + "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" + } } }, "repair": { "tags": "reparar,restaurar,corregir,recuperar", "title": "Reparar", "header": "Reparar archivos PDF", - "submit": "Reparar" + "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" + }, + "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", - "threshold": "Umbral:", + "threshold": { + "label": "Umbral de Blancura de Píxeles" + }, "thresholdDesc": "Umbral para determinar cuán blanco debe ser un píxel blanco", - "whitePercent": "Porcentaje de 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" + "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": { + "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" + }, + "whitePercent": { + "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" + } + } }, "removeAnnotations": { "tags": "comentarios,subrayar,notas,margen,eliminar", "title": "Eliminar anotaciones", "header": "Eliminar anotaciones", - "submit": "Eliminar" + "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" + } }, "compare": { "tags": "diferenciar,contrastar,cambios,análisis", @@ -1089,21 +1973,147 @@ "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": "Tipo de certificado", + "certType": { + "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" + }, + "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?" + }, + "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?" + } + } + }, "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" + "submit": "Firmar PDF", + "appearance": { + "stepTitle": "Apariencia de firma", + "tooltip": { + "header": { + "title": "Acerca de la apariencia de firma" + }, + "invisible": { + "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" + }, + "visible": { + "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" + } + } + }, + "certFiles": { + "stepTitle": "Archivos de certificado" + }, + "certTypeStep": { + "stepTitle": "Formato de certificado" + }, + "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": { + "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?" + }, + "signing": { + "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" + } + } }, "removeCertSign": { "tags": "autenticar,PEM,P12,oficial,desencriptar", "title": "Eliminar firma del certificado", "header": "Quitar el certificado digital del PDF", "selectPDF": "Seleccione un archivo PDF:", - "submit": "Eliminar firma" + "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" + }, + "results": { + "title": "Resultados de Eliminación de Certificado" + } }, "pageLayout": { "tags": "unir,compuesto,vista única,organizar", @@ -1116,7 +2126,7 @@ "scalePages": { "tags": "cambiar tamaño,modificar,dimensionar,adaptar", "title": "Ajustar escala de la página", - "header": "Adjustar 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", @@ -1129,7 +2139,29 @@ "tags": "auto-detectar,basado en el encabezamiento,organizar,re-etiquetar", "title": "Renombrar automáticamente", "header": "Renombrar PDF automáticamente", - "submit": "Renombrar 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." + }, + "files": { + "placeholder": "Seleccione un archivo PDF en la vista principal para comenzar" + }, + "results": { + "title": "Resultados de cambio de nombre automático" + }, + "tooltip": { + "header": { + "title": "Cómo funciona el cambio de nombre automático" + }, + "howItWorks": { + "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" + } + } }, "adjust-contrast": { "tags": "corrección de color,sintonizar color,modificar,mejorar" @@ -1138,13 +2170,42 @@ "tags": "recortar,contraer,editar,forma", "title": "Recortar", "header": "Recortar PDF", - "submit": "Entregar" + "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" + }, + "steps": { + "selectArea": "Seleccionar Área de Recorte" + }, + "tooltip": { + "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" + } }, "autoSplitPDF": { "tags": "Marcado por QR,separar,segmento de escaneo,organizar", "title": "Dividir PDF automáticamente", "header": "Dividir PDF automáticamente", - "description": "Imprimir, Insertar, Escanear, cargar, y déjenos sepsrar automáticamente sus documentos. No se necesita clasificación manual.", + "description": "Imprimir, Insertar, Escanear, cargar, y déjenos separar automáticamente sus documentos. No se necesita clasificación manual.", "selectText": { "1": "Imprimir algunas hojas divisorias desde la parte inferior (Blanco y negro está bien).", "2": "Escanee todos sus documentos a la vez insertando la hoja divisoria entre ellos.", @@ -1267,18 +2328,116 @@ "applyChanges": "Aplicar cambios", "auto": { "settings": { - "advancedTitle": "Avanzado" + "advancedTitle": "Avanzado", + "title": "Configuración de Censura" }, "wordsToRedact": { - "add": "Agregar" - } + "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" + "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" + } + } } }, "tableExtraxt": { @@ -1344,7 +2503,9 @@ "overrideY": "Forzar coordenada Y", "customMargin": "Personalizar margen", "customColor": "Personalizar color de texto", - "submit": "Enviar" + "submit": "Enviar", + "noStampSelected": "No se ha seleccionado ningún sello. Vuelva al Paso 1.", + "stampSetup": "Configuración de sello" }, "removeImagePdf": { "tags": "Eliminar imagen,Operaciones de página,Back end,Backend" @@ -1368,7 +2529,7 @@ "date": "Fecha", "reason": "Motivo", "location": "Ubicación", - "noSignatures": "No se encontraron firmas digiales en este documento", + "noSignatures": "No se encontraron firmas digitales en este documento", "chain": { "invalid": "Error en la validación de la cadena de certificados: no se puede verificar la identidad del firmante" }, @@ -1376,9 +2537,9 @@ "invalid": "El certificado no se encuentra en los almacenes de confianza: no se puede verificar la fuente" }, "cert": { - "expired": "Certificado expiredo", + "expired": "Certificado expirado", "revoked": "Certificado fue revocado", - "info": "Detalles Certificado", + "info": "Detalles del certificado", "issuer": "Emisor", "subject": "Asunto", "serialNumber": "Número de Serie", @@ -1441,12 +2602,49 @@ "alreadyLoggedIn": "Ya ha iniciado sesión en", "alreadyLoggedIn2": "dispositivos. Cierre sesión en los dispositivos y vuelva a intentarlo.", "toManySessions": "Tiene demasiadas sesiones activas", - "logoutMessage": "You have been logged out." + "logoutMessage": "Ha cerrado sesión.", + "cancel": "Cancelar", + "debug": "Depurar", + "dontHaveAccount": "¿No tiene una cuenta? Registrarse", + "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.", + "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...", + "unexpectedError": "Error inesperado: {{message}}", + "useMagicLink": "Usar enlace mágico en su lugar", + "youAreLoggedIn": "¡Ha iniciado sesión!" }, "pdfToSinglePage": { "title": "PDF a página única", "header": "PDF a página única", - "submit": "Convertir 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" + }, + "results": { + "title": "Resultados de Página Única" + } }, "pageExtracter": { "title": "Extraer Páginas", @@ -1484,7 +2682,7 @@ }, "selectText": { "1": { - "_value": "Compression Settings", + "_value": "Configuración de Compresión", "1": "1-3 compresión PDF,
4-6 compresión de imagen suave,
7-9 compresión de imágenes intensa reducirá drásticamente la calidad de imagen" }, "2": "Nivel de optimización:", @@ -1493,11 +2691,36 @@ }, "submit": "Comprimir", "method": { - "filesize": "Tamaño de archivo" + "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" + } } }, "decrypt": { - "passwordPrompt": "Este archivo está protegido con contraseña. Introdúzca la contraseña:", + "passwordPrompt": "Este archivo está protegido con contraseña. Por favor, introduzca la contraseña:", "cancelled": "Operación cancelada para el PDF: {0}", "noPassword": "No se proporcionó contraseña para PDF cifrado: {0}", "invalidPassword": "Por favor, inténtelo de nuevo con la contraseña correcta.", @@ -1612,7 +2835,7 @@ "submit": "Dividir PDF" }, "fileChooser": { - "click": "Click", + "click": "Clic", "or": "o", "dragAndDrop": "Arrastrar & Soltar", "dragAndDropPDF": "Arrastrar & Soltar archivo PDF", @@ -1655,7 +2878,7 @@ }, "necessary": { "title": { - "1": "Cookies estrictsamente necesarias", + "1": "Cookies estrictamente necesarias", "2": "Siempre activado" }, "description": "Estas cookies son esenciales para que el sitio web funcione correctamente. Permiten funciones básicas como configurar sus preferencias de privacidad, iniciar sesión y completar formularios, por lo que no se pueden desactivar." @@ -1675,39 +2898,223 @@ "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" + "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" }, "attachments": { "tags": "embed,attach,file,attachment,attachments", "title": "Add attachments", "header": "Add attachments", - "submit": "Add attachments" + "submit": "Add attachments", + "add": "Añadir archivo adjunto", + "embed": "Incrustar archivo adjunto", + "remove": "Eliminar archivo adjunto" }, "rightRail": { "selectAll": "Seleccionar Todo", - "deselectAll": "Deseleccionar Todo" + "deselectAll": "Deseleccionar Todo", + "closePdf": "Cerrar PDF", + "closeSelected": "Cerrar Archivos Seleccionados", + "deleteSelected": "Eliminar Páginas Seleccionadas", + "downloadAll": "Descargar Todo", + "downloadSelected": "Descargar Archivos Seleccionados", + "exportAll": "Exportar PDF", + "language": "Idioma", + "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" }, "quickAccess": { - "sign": "Firmar" + "sign": "Firmar", + "activity": "Actividad", + "allTools": "Todas las Herramientas", + "automate": "Automatizar", + "config": "Configuración", + "files": "Archivos", + "read": "Leer" }, "fileUpload": { "loading": "Cargando...", - "or": "o" + "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", + "supportedFileTypes": "Tipos de archivo soportados", + "upload": "Cargar", + "uploadFile": "Cargar Archivo", + "uploadFiles": "Cargar Archivos" }, "fileManager": { "fileName": "Nombre", "fileVersion": "Versión", "selectAll": "Seleccionar Todo", "deselectAll": "Deseleccionar Todo", - "deleteSelected": "Borrar selecionado(s)", + "deleteSelected": "Borrar seleccionado(s)", "download": "Descargar", - "delete": "Borrar" + "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." }, "sanitize": { "submit": "Limpiar archivo PDF", "steps": { - "settings": "Configuración" - } + "settings": "Configuración", + "files": "Archivos", + "results": "Resultados" + }, + "completed": "Desinfección completada con éxito", + "desc": "Eliminar elementos potencialmente dañinos de archivos PDF.", + "error": { + "failed": "Se produjo un error al desinfectar el PDF.", + "generic": "La desinfección falló" + }, + "filenamePrefix": "desinfectado", + "files": { + "placeholder": "Seleccione un archivo PDF en la vista principal para comenzar" + }, + "options": { + "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": { + "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.)" + }, + "removeXMPMetadata": { + "desc": "Eliminar metadatos XMP del PDF" + }, + "title": "Opciones de Desinfección" + }, + "sanitizationResults": "Resultados de Desinfección", + "title": "Desinfectar" }, "changePermissions": { "title": "Cambiar permisos", @@ -1741,7 +3148,581 @@ "tooltip": { "header": { "title": "Cambiar permisos" + }, + "description": { + "text": "Cambia los permisos del documento, permitiendo/prohibiendo el acceso a diferentes funciones en lectores de PDF." + }, + "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" + }, + "selectFiles": "Seleccionar archivos para adjuntar", + "selectedFiles": "Archivos seleccionados", + "submit": "Añadir archivos adjuntos" + }, + "adjustPageScale": { + "error": { + "failed": "Se produjo un error al ajustar la escala de página." + }, + "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" } } + }, + "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}}" + }, + "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", + "tools": { + "add": "Añadir una herramienta...", + "addTool": "Añadir herramienta", + "configure": "Configurar herramienta", + "notConfigured": "! No configurado", + "remove": "Eliminar herramienta", + "selectTool": "Seleccionar una herramienta...", + "selected": "Herramientas seleccionadas" + }, + "unsavedChanges": { + "cancel": "Cancelar", + "confirm": "Volver", + "message": "Tiene cambios sin guardar. ¿Está seguro de que desea volver? Se perderán todos los cambios.", + "title": "Cambios sin guardar" + } + }, + "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...", + "steps": "{{count}} pasos", + "unnamed": "Automatización sin nombre" + }, + "title": "Automatizar" + }, + "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.", + "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." + } + }, + "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": { + "available": "disponible", + "cancel": "Cancelar", + "copied": "¡Copiado!", + "copy": "Copiar", + "refresh": "Actualizar", + "remaining": "restante", + "retry": "Reintentar", + "used": "usado" + }, + "config": { + "account": { + "overview": { + "guestDescription": "Ha iniciado sesión como invitado. Considere actualizar su cuenta arriba.", + "manageAccountPreferences": "Administre las preferencias de su cuenta", + "title": "Configuración de Cuenta" + }, + "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", + "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", + "refreshAriaLabel": "Actualizar clave API", + "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." + }, + "totalCredits": "Créditos Totales" + } + }, + "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" + }, + "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" + }, + "pageSelection": { + "tooltip": { + "advanced": { + "title": "Funciones Avanzadas" + }, + "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" + }, + "examples": { + "title": "Ejemplos" + }, + "header": { + "title": "Guía de Selección de Páginas" + }, + "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" + }, + "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" + }, + "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" + } + } + }, + "removeMetadata": { + "submit": "Eliminar Metadatos" + }, + "replaceColor": { + "tags": "Reemplazar Color,Operaciones de página,Back end,lado del servidor" + }, + "review": "Revisar", + "scannerImageSplit": { + "error": { + "failed": "Se produjo un error al extraer escaneos de imágenes." + }, + "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" + } + }, + "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" + }, + "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" + } + }, + "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" + }, + "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" + }, + "warning": { + "tooltipTitle": "Advertencia" } } \ 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 b95b1ca8f..03aef76f2 100644 --- a/frontend/public/locales/it-IT/translation.json +++ b/frontend/public/locales/it-IT/translation.json @@ -87,7 +87,10 @@ "showStack": "Mostra traccia dello stack", "copyStack": "Copia traccia dello stack", "githubSubmit": "GitHub: apri un ticket", - "discordSubmit": "Discord: invia post di supporto" + "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." }, "warning": { "tooltipTitle": "Avviso" @@ -358,179 +361,223 @@ "sortBy": "Ordinamento:", "multiTool": { "title": "Multifunzione PDF", - "desc": "Unisci, Ruota, Riordina, e Rimuovi pagine" + "desc": "Unisci, Ruota, Riordina, e Rimuovi pagine", + "tags": "multipli,strumenti" }, "merge": { "title": "Unisci", - "desc": "Unisci facilmente più PDF in uno." + "desc": "Unisci facilmente più PDF in uno.", + "tags": "combina,unisci,unifica" }, "split": { "title": "Dividi", - "desc": "Dividi un singolo PDF in più documenti." + "desc": "Dividi un singolo PDF in più documenti.", + "tags": "dividi,separa,spezza" }, "rotate": { "title": "Ruota", - "desc": "Ruota un PDF." + "desc": "Ruota un PDF.", + "tags": "ruota,capovolgi,orienta" }, "convert": { "title": "Converti", - "desc": "Converti file tra diversi formati" + "desc": "Converti file tra diversi formati", + "tags": "trasforma,cambia" }, "pdfOrganiser": { "title": "Organizza", - "desc": "Rimuovi/Riordina le pagine in qualsiasi ordine." + "desc": "Rimuovi/Riordina le pagine in qualsiasi ordine.", + "tags": "organizza,riordina,riorganizza" }, "addImage": { "title": "Aggiungi Immagine", - "desc": "Aggiungi un'immagine in un punto specifico del PDF (Lavori in corso)" + "desc": "Aggiungi un'immagine in un punto specifico del PDF (Lavori in corso)", + "tags": "inserisci,incorpora,posiziona" }, "addAttachments": { "title": "Aggiungi allegati", - "desc": "Aggiungi o rimuovi file incorporati (allegati) da/verso un PDF" + "desc": "Aggiungi o rimuovi file incorporati (allegati) da/verso un PDF", + "tags": "incorpora,allega,includi" }, "watermark": { "title": "Aggiungi Filigrana", - "desc": "Aggiungi una filigrana al tuo PDF." + "desc": "Aggiungi una filigrana al tuo PDF.", + "tags": "timbro,marca,sovrapponi" }, "removePassword": { "title": "Rimuovi Password", - "desc": "Rimuovi la password dal tuo PDF." + "desc": "Rimuovi la password dal tuo PDF.", + "tags": "sblocca" }, "compress": { "title": "Comprimi", - "desc": "Comprimi PDF per ridurne le dimensioni." + "desc": "Comprimi PDF per ridurne le dimensioni.", + "tags": "riduci,comprimi,ottimizza" }, "unlockPDFForms": { "title": "Sblocca moduli PDF", - "desc": "Rimuovi la proprietà di sola lettura dei campi del modulo in un documento PDF." + "desc": "Rimuovi la proprietà di sola lettura dei campi del modulo in un documento PDF.", + "tags": "sblocca,abilita,modifica" }, "changeMetadata": { "title": "Modifica Proprietà", - "desc": "Modifica/Aggiungi/Rimuovi le proprietà di un documento PDF." + "desc": "Modifica/Aggiungi/Rimuovi le proprietà di un documento PDF.", + "tags": "modifica,cambia,aggiorna" }, "ocr": { "title": "OCR / Pulisci scansioni", - "desc": "Pulisci scansioni ed estrai testo da immagini, convertendo le immagini in testo puro." + "desc": "Pulisci scansioni ed estrai testo da immagini, convertendo le immagini in testo puro.", + "tags": "estrai,scansiona" }, "extractImages": { "title": "Estrai immagini", - "desc": "Estrai tutte le immagini da un PDF e salvale come zip." + "desc": "Estrai tutte le immagini da un PDF e salvale come zip.", + "tags": "estrai,salva,esporta" }, "scannerImageSplit": { "title": "Rileva/Dividi foto scansionate", - "desc": "Divide più foto all’interno di una foto/PDF" + "desc": "Divide più foto all’interno di una foto/PDF", + "tags": "rileva,dividi,foto" }, "sign": { "title": "Firma", - "desc": "Aggiungi una firma al PDF da disegno, testo o immagine." + "desc": "Aggiungi una firma al PDF da disegno, testo o immagine.", + "tags": "firma,autografo" }, "flatten": { "title": "Appiattisci", - "desc": "Rimuovi tutti gli elementi interattivi e moduli da un PDF." + "desc": "Rimuovi tutti gli elementi interattivi e moduli da un PDF.", + "tags": "semplifica,rimuovi,interattivo" }, "certSign": { "title": "Firma con certificato", - "desc": "Firma un PDF con un certificato/chiave (PEM/P12)" + "desc": "Firma un PDF con un certificato/chiave (PEM/P12)", + "tags": "autentica,PEM,P12,ufficiale,cripta,firma,certificato,PKCS12,JKS,server,manuale,auto" }, "repair": { "title": "Ripara", - "desc": "Prova a riparare un PDF corrotto." + "desc": "Prova a riparare un PDF corrotto.", + "tags": "ripara,ripristina" }, "removeBlanks": { "title": "Rimuovi pagine vuote", - "desc": "Trova e rimuovi pagine vuote da un PDF." + "desc": "Trova e rimuovi pagine vuote da un PDF.", + "tags": "elimina,pulisci,vuote" }, "removeAnnotations": { "title": "Rimuovi annotazioni", - "desc": "Rimuove tutti i commenti/annotazioni da un PDF" + "desc": "Rimuove tutti i commenti/annotazioni da un PDF", + "tags": "elimina,pulisci,rimuovi" }, "compare": { "title": "Compara", - "desc": "Vedi e compara le differenze tra due PDF." + "desc": "Vedi e compara le differenze tra due PDF.", + "tags": "differenza" }, "removeCertSign": { "title": "Rimuovere firma dal certificato", - "desc": "Rimuovi la firma del certificato dal PDF" + "desc": "Rimuovi la firma del certificato dal PDF", + "tags": "rimuovi,elimina,sblocca" }, "pageLayout": { "title": "Layout multipagina", - "desc": "Unisci più pagine di un documento PDF in un'unica pagina" + "desc": "Unisci più pagine di un documento PDF in un'unica pagina", + "tags": "layout,disponi,combina" }, "bookletImposition": { "title": "Imposizione a libretto", - "desc": "Crea libretti con corretto ordinamento pagine e layout multipagina per stampa e rilegatura" + "desc": "Crea libretti con corretto ordinamento pagine e layout multipagina per stampa e rilegatura", + "tags": "opuscolo,stampa,rilegatura" }, "scalePages": { "title": "Regola le dimensioni/scala della pagina", - "desc": "Modificare le dimensioni/scala della pagina e/o dei suoi contenuti." + "desc": "Modificare le dimensioni/scala della pagina e/o dei suoi contenuti.", + "tags": "ridimensiona,adatta,scala" }, "addPageNumbers": { "title": "Aggiungi numeri di pagina", - "desc": "Aggiungi numeri di pagina in tutto un documento in una posizione prestabilita" + "desc": "Aggiungi numeri di pagina in tutto un documento in una posizione prestabilita", + "tags": "numero,paginazione,conteggio" }, "autoRename": { "title": "Rinomina automatica file PDF", - "desc": "Rinomina automaticamente un file PDF in base all’intestazione rilevata" + "desc": "Rinomina automaticamente un file PDF in base all’intestazione rilevata", + "tags": "auto-rilevamento,basato su intestazione,organizza,rinomina" }, "adjustContrast": { "title": "Regola colori/contrasto", - "desc": "Regola contrasto, saturazione e luminosità di un PDF" + "desc": "Regola contrasto, saturazione e luminosità di un PDF", + "tags": "contrasto,luminosità,saturazione" }, "crop": { "title": "Ritaglia PDF", - "desc": "Ritaglia un PDF per ridurne le dimensioni (mantiene il testo!)" + "desc": "Ritaglia un PDF per ridurne le dimensioni (mantiene il testo!)", + "tags": "ritaglia,taglia,ridimensiona" }, "autoSplitPDF": { "title": "Pagine divise automaticamente", - "desc": "Dividi automaticamente il PDF scansionato con il codice QR dello divisore di pagina fisico scansionato" + "desc": "Dividi automaticamente il PDF scansionato con il codice QR dello divisore di pagina fisico scansionato", + "tags": "auto,dividi,QR" }, "sanitize": { "title": "Sanitizza", - "desc": "Rimuovi elementi potenzialmente dannosi dai PDF" + "desc": "Rimuovi elementi potenzialmente dannosi dai PDF", + "tags": "pulisci,elimina,rimuovi" }, "getPdfInfo": { "title": "Ottieni TUTTE le informazioni in PDF", - "desc": "Raccogli tutte le informazioni possibili sui PDF" + "desc": "Raccogli tutte le informazioni possibili sui PDF", + "tags": "info,metadati,dettagli" }, "pdfToSinglePage": { "title": "PDF in un'unica pagina di grandi dimensioni", - "desc": "Unisce tutte le pagine PDF in un'unica grande pagina" + "desc": "Unisce tutte le pagine PDF in un'unica grande pagina", + "tags": "combina,unisci,singola" }, "showJS": { "title": "Mostra Javascript", - "desc": "Cerca e visualizza qualsiasi JS inserito in un PDF" + "desc": "Cerca e visualizza qualsiasi JS inserito in un PDF", + "tags": "javascript,codice,script" }, "redact": { "title": "Redazione manuale", - "desc": "Redige un PDF in base al testo selezionato, alle forme disegnate e/o alle pagina selezionata(e)" + "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" + "desc": "Sovrapponi PDF sopra un altro PDF", + "tags": "sovrapponi,combina,impila" }, "splitBySections": { "title": "Dividi PDF per sezioni", - "desc": "Divide ogni pagina di un PDF in sezioni orizzontali e verticali più piccole" + "desc": "Divide ogni pagina di un PDF in sezioni orizzontali e verticali più piccole", + "tags": "dividi,sezioni,separa" }, "addStamp": { "title": "Aggiungi timbro al PDF", - "desc": "Aggiungi timbri di testo o immagine in posizioni specifiche" + "desc": "Aggiungi timbri di testo o immagine in posizioni specifiche", + "tags": "timbro,marca,sigillo" }, "removeImage": { "title": "Rimuovi immagine", - "desc": "Rimuovi le immagini dal PDF per ridurre la dimensione del file" + "desc": "Rimuovi le immagini dal PDF per ridurre la dimensione del file", + "tags": "rimuovi,elimina,pulisci" }, "splitByChapters": { "title": "Dividi PDF per capitoli", - "desc": "Dividi un PDF in più file in base alla struttura dei capitoli." + "desc": "Dividi un PDF in più file in base alla struttura dei capitoli.", + "tags": "dividi,capitoli,struttura" }, "validateSignature": { "title": "Convalida la firma PDF", - "desc": "Verificare le firme digitali e i certificati nei documenti PDF" + "desc": "Verificare le firme digitali e i certificati nei documenti PDF", + "tags": "convalida,verifica,certificato" }, "swagger": { "title": "Documentazione API", - "desc": "Visualizza documentazione API e testa gli endpoint" + "desc": "Visualizza documentazione API e testa gli endpoint", + "tags": "API,documentazione,test" }, "fakeScan": { "title": "Finta scansione", @@ -538,31 +585,38 @@ }, "editTableOfContents": { "title": "Modifica indice", - "desc": "Aggiungi o modifica segnalibri e sommario nei documenti PDF" + "desc": "Aggiungi o modifica segnalibri e sommario nei documenti PDF", + "tags": "segnalibri,contenuti,modifica" }, "manageCertificates": { "title": "Gestisci certificati", - "desc": "Importa, esporta o elimina i file certificato usati per firmare i PDF." + "desc": "Importa, esporta o elimina i file certificato usati per firmare i PDF.", + "tags": "certificati,importa,esporta" }, "read": { "title": "Leggi", - "desc": "Visualizza e annota PDF. Evidenzia testo, disegna o inserisci commenti per revisione e collaborazione." + "desc": "Visualizza e annota PDF. Evidenzia testo, disegna o inserisci commenti per revisione e collaborazione.", + "tags": "visualizza,apri,mostra" }, "reorganizePages": { "title": "Riorganizza pagine", - "desc": "Riorganizza, duplica o elimina pagine PDF con controllo visivo drag‑and‑drop." + "desc": "Riorganizza, duplica o elimina pagine PDF con controllo visivo drag‑and‑drop.", + "tags": "riordina,riorganizza,organizza" }, "extractPages": { "title": "Estrai pagine", - "desc": "Estrai pagine specifiche da un PDF" + "desc": "Estrai pagine specifiche da un PDF", + "tags": "estrai,seleziona,copia" }, "removePages": { "title": "Rimuovi", - "desc": "Elimina alcune pagine dal PDF." + "desc": "Elimina alcune pagine dal PDF.", + "tags": "elimina,estrai,escludi" }, "autoSizeSplitPDF": { "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" + "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" }, "replaceColorPdf": { "title": "Sostituisci e inverti il colore", @@ -570,11 +624,13 @@ }, "devApi": { "title": "API", - "desc": "Link alla documentazione API" + "desc": "Link alla documentazione API", + "tags": "API,sviluppo,documentazione" }, "devFolderScanning": { "title": "Scansione cartelle automatizzata", - "desc": "Link alla guida per scansione cartelle automatizzata" + "desc": "Link alla guida per scansione cartelle automatizzata", + "tags": "automazione,cartella,scansione" }, "devSsoGuide": { "title": "Guida SSO", @@ -594,7 +650,17 @@ }, "automate": { "title": "Automatizza", - "desc": "Crea flussi multi‑step concatenando azioni PDF. Ideale per attività ricorrenti." + "desc": "Crea flussi multi‑step concatenando azioni PDF. Ideale per attività ricorrenti.", + "tags": "flusso di lavoro,sequenza,automazione" + }, + "replaceColor": { + "desc": "Sostituisci o inverti i colori nei documenti PDF", + "title": "Sostituisci e inverti colore" + }, + "scannerEffect": { + "desc": "Crea un PDF che sembra essere stato scansionato", + "tags": "scansiona,simula,crea", + "title": "Effetto scanner" } }, "landing": { @@ -654,7 +720,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", @@ -913,7 +981,20 @@ "10": "Unione pari-dispari", "11": "Duplica tutte le pagine" }, - "placeholder": "(ad es. 1,3,2 o 4-8,2,10-12 o 2n-1)" + "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)." + } }, "addImage": { "tags": "img,jpg,immagine,foto", @@ -1347,7 +1428,7 @@ }, "trapped": { "label": "Stato Trapped", - "unknown": "Unknown", + "unknown": "Sconosciuto", "true": "True", "false": "False" }, @@ -1538,7 +1619,13 @@ "header": "Estrai immagini", "selectText": "Seleziona il formato in cui salvare le immagini estratte", "allowDuplicates": "Salva le immagini duplicate", - "submit": "Estrai" + "submit": "Estrai", + "error": { + "failed": "Si è verificato un errore durante l'estrazione delle immagini dal PDF." + }, + "settings": { + "title": "Impostazioni" + } }, "pdfToPDFA": { "tags": "archivio,a lungo termine,standard,conversione,archiviazione,conservazione", @@ -1615,8 +1702,14 @@ "title": "Firma", "header": "Firma PDF", "upload": "Carica immagine", - "draw": "Disegna Firma", - "text": "Testo", + "draw": { + "clear": "Cancella", + "title": "Disegna la tua firma" + }, + "text": { + "name": "Nome firmatario", + "placeholder": "Inserisci il tuo nome completo" + }, "clear": "Cancella", "add": "Aggiungi", "saved": "Firme salvate", @@ -1632,7 +1725,35 @@ "previous": "Pagina precedente", "maintainRatio": "Attiva il mantenimento delle proporzioni", "undo": "Annulla", - "redo": "Rifare" + "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" + }, + "steps": { + "configure": "Configura firma" + }, + "submit": "Firma documento", + "type": { + "canvas": "Canvas", + "draw": "Disegna", + "image": "Immagine", + "text": "Testo", + "title": "Tipo di firma" + } }, "flatten": { "tags": "statico,disattivato,non interattivo,ottimizzato", @@ -1651,7 +1772,8 @@ "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." + "note": "Il flattening rimuove gli elementi interattivi dal PDF, rendendoli non modificabili.", + "flattenOnlyForms": "Appiattisci solo i moduli" }, "results": { "title": "Risultati Flatten" @@ -1747,7 +1869,17 @@ "tags": "commenti,evidenziazioni,note,markup,rimozione", "title": "Rimuovi Annotazioni", "header": "Rimuovi Annotazioni", - "submit": "Rimuovi" + "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" + } }, "compare": { "tags": "differenziare,contrastare,cambiare,analisi", @@ -3024,7 +3156,13 @@ "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" + "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" } }, "addPassword": { @@ -3294,5 +3432,56 @@ } }, "termsAndConditions": "Termini e condizioni", - "logOut": "Esci" + "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.", + "placeholder": "Scegli file...", + "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" + } + }, + "unsavedChanges": "Hai modifiche non salvate al tuo PDF. Cosa vuoi fare?", + "unsavedChangesTitle": "Modifiche non salvate" } \ No newline at end of file diff --git a/frontend/public/locales/zh-CN/translation.json b/frontend/public/locales/zh-CN/translation.json index 52367f112..dd34c090e 100644 --- a/frontend/public/locales/zh-CN/translation.json +++ b/frontend/public/locales/zh-CN/translation.json @@ -87,7 +87,10 @@ "showStack": "显示堆栈跟踪", "copyStack": "复制堆栈跟踪", "githubSubmit": "GitHub - 提交工单", - "discordSubmit": "Discord - 提交支持帖子" + "discordSubmit": "Discord - 提交支持帖子", + "dismissAllErrors": "关闭所有错误", + "encryptedPdfMustRemovePassword": "此 PDF 已加密或受密码保护。请在转换为 PDF/A 之前将其解锁。", + "incorrectPasswordProvided": "PDF 密码不正确或未提供。" }, "warning": { "tooltipTitle": "警告" @@ -358,179 +361,223 @@ "sortBy": "排序:", "multiTool": { "title": "PDF 多功能工具", - "desc": "合并、旋转、重新排列和删除 PDF 页面" + "desc": "合并、旋转、重新排列和删除 PDF 页面", + "tags": "多个,工具" }, "merge": { "title": "合并", - "desc": "轻松将多个 PDF 合并成一个。" + "desc": "轻松将多个 PDF 合并成一个。", + "tags": "组合,合并,联合" }, "split": { "title": "拆分", - "desc": "将 PDF 拆分为多个文档。" + "desc": "将 PDF 拆分为多个文档。", + "tags": "分割,分离,拆分" }, "rotate": { "title": "旋转", - "desc": "旋转 PDF。" + "desc": "旋转 PDF。", + "tags": "旋转,翻转,定向" }, "convert": { "title": "转换", - "desc": "在不同格式之间转换文件" + "desc": "在不同格式之间转换文件", + "tags": "转换,更改" }, "pdfOrganiser": { "title": "整理", - "desc": "按任意顺序删除/重新排列页面。" + "desc": "按任意顺序删除/重新排列页面。", + "tags": "组织,重新排列,重新排序" }, "addImage": { "title": "在 PDF 中添加图片", - "desc": "将图像添加到 PDF 的指定位置。" + "desc": "将图像添加到 PDF 的指定位置。", + "tags": "插入,嵌入,放置" }, "addAttachments": { "title": "添加附件", - "desc": "向 PDF 添加或移除嵌入文件(附件)" + "desc": "向 PDF 添加或移除嵌入文件(附件)", + "tags": "嵌入,附加,包含" }, "watermark": { "title": "添加水印", - "desc": "在 PDF 中添加自定义水印。" + "desc": "在 PDF 中添加自定义水印。", + "tags": "印章,标记,叠加" }, "removePassword": { "title": "删除密码", - "desc": "从 PDF 文档中移除密码保护。" + "desc": "从 PDF 文档中移除密码保护。", + "tags": "解锁" }, "compress": { "title": "压缩", - "desc": "压缩 PDF 文件以减小文件大小。" + "desc": "压缩 PDF 文件以减小文件大小。", + "tags": "缩小,减少,优化" }, "unlockPDFForms": { "title": "解锁PDF表单", - "desc": "移除表单字段只读属性" + "desc": "移除表单字段只读属性", + "tags": "解锁,启用,编辑" }, "changeMetadata": { "title": "更改元数据", - "desc": "更改/删除/添加 PDF 文档的元数据。" + "desc": "更改/删除/添加 PDF 文档的元数据。", + "tags": "编辑,修改,更新" }, "ocr": { "title": "运行 OCR /清理扫描", - "desc": "清理和识别 PDF 中的图像文本,并将其转换为可编辑文本。" + "desc": "清理和识别 PDF 中的图像文本,并将其转换为可编辑文本。", + "tags": "提取,扫描" }, "extractImages": { "title": "提取图像", - "desc": "从 PDF 中提取所有图像并保存到压缩包中。" + "desc": "从 PDF 中提取所有图像并保存到压缩包中。", + "tags": "提取,保存,导出" }, "scannerImageSplit": { "title": "检测/拆分扫描照片", - "desc": "从照片/PDF 中拆分出多张照片" + "desc": "从照片/PDF 中拆分出多张照片", + "tags": "检测,拆分,照片" }, "sign": { "title": "签名", - "desc": "通过绘图、文字或图像向 PDF 添加签名" + "desc": "通过绘图、文字或图像向 PDF 添加签名", + "tags": "签名,亲笔签名" }, "flatten": { "title": "展平", - "desc": "从 PDF 中删除所有互动元素和表单" + "desc": "从 PDF 中删除所有互动元素和表单", + "tags": "简化,删除,交互式" }, "certSign": { "title": "使用证书签名", - "desc": "使用证书/密钥(PEM/P12)对PDF进行签名" + "desc": "使用证书/密钥(PEM/P12)对PDF进行签名", + "tags": "认证,PEM,P12,官方,加密,签名,证书,PKCS12,JKS,服务器,手动,自动" }, "repair": { "title": "修复", - "desc": "尝试修复损坏/损坏的 PDF" + "desc": "尝试修复损坏/损坏的 PDF", + "tags": "修复,恢复" }, "removeBlanks": { "title": "删除空白页", - "desc": "检测并删除文档中的空白页" + "desc": "检测并删除文档中的空白页", + "tags": "删除,清理,空白" }, "removeAnnotations": { "title": "删除标注", - "desc": "删除 PDF 中的所有标注/评论" + "desc": "删除 PDF 中的所有标注/评论", + "tags": "删除,清理,删除" }, "compare": { "title": "比较", - "desc": "比较并显示两个 PDF 文档之间的差异" + "desc": "比较并显示两个 PDF 文档之间的差异", + "tags": "差异" }, "removeCertSign": { "title": "移除证书签名", - "desc": "移除 PDF 的证书签名" + "desc": "移除 PDF 的证书签名", + "tags": "删除,删除,解锁" }, "pageLayout": { "title": "多页布局", - "desc": "将 PDF 文档的多个页面合并成一页" + "desc": "将 PDF 文档的多个页面合并成一页", + "tags": "布局,排列,组合" }, "bookletImposition": { "title": "小册子拼版", - "desc": "创建具有正确页面顺序和多页布局的小册子,用于打印和装订" + "desc": "创建具有正确页面顺序和多页布局的小册子,用于打印和装订", + "tags": "小册子,打印,装订" }, "scalePages": { "title": "调整页面尺寸/缩放", - "desc": "调整页面及/或其内容的尺寸/缩放" + "desc": "调整页面及/或其内容的尺寸/缩放", + "tags": "调整大小,调整,缩放" }, "addPageNumbers": { "title": "添加页码", - "desc": "在文档的指定位置添加页码" + "desc": "在文档的指定位置添加页码", + "tags": "编号,分页,计数" }, "autoRename": { "title": "自动重命名 PDF 文件", - "desc": "基于检测到的页眉自动重命名 PDF 文件" + "desc": "基于检测到的页眉自动重命名 PDF 文件", + "tags": "自动检测,基于标题,组织,重新标记" }, "adjustContrast": { "title": "调整颜色/对比度", - "desc": "调整 PDF 的对比度、饱和度和亮度" + "desc": "调整 PDF 的对比度、饱和度和亮度", + "tags": "对比度,亮度,饱和度" }, "crop": { "title": "裁剪 PDF", - "desc": "裁剪 PDF 以减小其文件大小(保留文本!)" + "desc": "裁剪 PDF 以减小其文件大小(保留文本!)", + "tags": "裁剪,剪切,调整大小" }, "autoSplitPDF": { "title": "自动拆分页面", - "desc": "使用物理扫描页面分割器 QR 代码自动拆分扫描的 PDF" + "desc": "使用物理扫描页面分割器 QR 代码自动拆分扫描的 PDF", + "tags": "自动,拆分,QR" }, "sanitize": { "title": "安全清理", - "desc": "移除 PDF 文件中的潜在有害元素" + "desc": "移除 PDF 文件中的潜在有害元素", + "tags": "清理,清除,删除" }, "getPdfInfo": { "title": "获取 PDF 的所有信息", - "desc": "获取 PDF 的所有可能的信息" + "desc": "获取 PDF 的所有可能的信息", + "tags": "信息,元数据,详细信息" }, "pdfToSinglePage": { "title": "PDF 转单一大页", - "desc": "将所有 PDF 页面合并为一个大的单页" + "desc": "将所有 PDF 页面合并为一个大的单页", + "tags": "组合,合并,单页" }, "showJS": { "title": "显示 JavaScript", - "desc": "搜索并显示嵌入到 PDF 中的任何 JavaScript 代码" + "desc": "搜索并显示嵌入到 PDF 中的任何 JavaScript 代码", + "tags": "javascript,代码,脚本" }, "redact": { "title": "手动修订", - "desc": "根据选定的文本、绘制的形状和/或选定的页面编辑PDF" + "desc": "根据选定的文本、绘制的形状和/或选定的页面编辑PDF", + "tags": "审查,涂黑,隐藏" }, "overlayPdfs": { "title": "叠加 PDF", - "desc": "将一个 PDF 叠加到另一个 PDF 之上" + "desc": "将一个 PDF 叠加到另一个 PDF 之上", + "tags": "叠加,组合,堆叠" }, "splitBySections": { "title": "按区块拆分 PDF", - "desc": "将 PDF 的每一页分割为更小的横向与纵向区块" + "desc": "将 PDF 的每一页分割为更小的横向与纵向区块", + "tags": "拆分,部分,分割" }, "addStamp": { "title": "向 PDF 添加印章", - "desc": "在指定位置添加文本或图像印章" + "desc": "在指定位置添加文本或图像印章", + "tags": "印章,标记,盖章" }, "removeImage": { "title": "删除图像", - "desc": "删除图像减少 PDF 大小" + "desc": "删除图像减少 PDF 大小", + "tags": "删除,删除,清理" }, "splitByChapters": { "title": "按章节拆分 PDF", - "desc": "根据其章节结构将 PDF 拆分为多个文件。" + "desc": "根据其章节结构将 PDF 拆分为多个文件。", + "tags": "拆分,章节,结构" }, "validateSignature": { "title": "验证 PDF 签名", - "desc": "验证 PDF 文档中的数字签名和证书" + "desc": "验证 PDF 文档中的数字签名和证书", + "tags": "验证,核实,证书" }, "swagger": { "title": "API 文档", - "desc": "查看 API 文档并测试端点" + "desc": "查看 API 文档并测试端点", + "tags": "API,文档,测试" }, "fakeScan": { "title": "伪扫描", @@ -538,31 +585,38 @@ }, "editTableOfContents": { "title": "编辑目录", - "desc": "为 PDF 文档添加或编辑目录和书签" + "desc": "为 PDF 文档添加或编辑目录和书签", + "tags": "书签,目录,编辑" }, "manageCertificates": { "title": "管理证书", - "desc": "导入、导出或删除用于签名 PDF 的数字证书文件。" + "desc": "导入、导出或删除用于签名 PDF 的数字证书文件。", + "tags": "证书,导入,导出" }, "read": { "title": "阅读", - "desc": "查看与批注 PDF。高亮、绘制或插入评论以便审阅协作。" + "desc": "查看与批注 PDF。高亮、绘制或插入评论以便审阅协作。", + "tags": "查看,打开,显示" }, "reorganizePages": { "title": "重组页面", - "desc": "通过可视化拖放控制重新排列、复制或删除 PDF 页面。" + "desc": "通过可视化拖放控制重新排列、复制或删除 PDF 页面。", + "tags": "重新排列,重新排序,组织" }, "extractPages": { "title": "提取页面", - "desc": "从 PDF 文档中提取特定页面" + "desc": "从 PDF 文档中提取特定页面", + "tags": "提取,选择,复制" }, "removePages": { "title": "删除", - "desc": "从 PDF 文档中删除不需要的页面。" + "desc": "从 PDF 文档中删除不需要的页面。", + "tags": "删除,提取,排除" }, "autoSizeSplitPDF": { "title": "自动根据大小/数目拆分 PDF", - "desc": "将单个 PDF 拆分为多个文档,基于大小、页数或文档数" + "desc": "将单个 PDF 拆分为多个文档,基于大小、页数或文档数", + "tags": "自动,拆分,大小" }, "replaceColorPdf": { "title": "替换和反转颜色", @@ -570,11 +624,13 @@ }, "devApi": { "title": "API", - "desc": "跳转至 API 文档" + "desc": "跳转至 API 文档", + "tags": "API,开发,文档" }, "devFolderScanning": { "title": "自动文件夹扫描", - "desc": "跳转至自动文件夹扫描指南" + "desc": "跳转至自动文件夹扫描指南", + "tags": "自动化,文件夹,扫描" }, "devSsoGuide": { "title": "SSO 指南", @@ -594,7 +650,17 @@ }, "automate": { "title": "自动化", - "desc": "通过串联 PDF 操作构建多步工作流。适合重复性任务。" + "desc": "通过串联 PDF 操作构建多步工作流。适合重复性任务。", + "tags": "工作流,序列,自动化" + }, + "replaceColor": { + "desc": "替换或反转 PDF 文档中的颜色", + "title": "替换和反转颜色" + }, + "scannerEffect": { + "desc": "创建看起来像扫描的 PDF", + "tags": "扫描,模拟,创建", + "title": "扫描仪效果" } }, "landing": { @@ -654,7 +720,9 @@ }, "error": { "failed": "合并 PDF 时发生错误。" - } + }, + "generateTableOfContents": "在合并的文件中生成目录?", + "removeDigitalSignature": "在合并的文件中删除数字签名?" }, "split": { "tags": "页面操作,划分,多页面,剪切,服务器端", @@ -815,7 +883,7 @@ "settings": "设置", "conversionCompleted": "转换完成", "results": "结果", - "defaultFilename": "converted_file", + "defaultFilename": "已转换文件", "conversionResults": "转换结果", "convertFrom": "转换来源", "convertTo": "转换为", @@ -913,7 +981,20 @@ "10": "奇偶合并", "11": "复制所有页面" }, - "placeholder": "(例如:1,3,2 或 4-8,2,10-12 或 2n-1)" + "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": "排列页面以进行侧缝小册子打印(针对侧面装订进行了优化)。" + } }, "addImage": { "tags": "图像、JPG、图片、照片", @@ -937,7 +1018,7 @@ "desc": "向 PDF 添加文本或图像水印", "completed": "已添加水印", "submit": "添加水印", - "filenamePrefix": "watermarked", + "filenamePrefix": "已加水印", "error": { "failed": "向 PDF 添加水印时发生错误。" }, @@ -1136,7 +1217,7 @@ "placeholder": "例如:1,3,5-8,10", "error": "无效的页码格式。使用数字、范围(1-5)或数学表达式(2n+1)" }, - "filenamePrefix": "pages_removed", + "filenamePrefix": "已删除页面", "files": { "placeholder": "在主视图中选择一个 PDF 文件以开始" }, @@ -1284,7 +1365,7 @@ "header": "解锁 PDF 表单", "submit": "Remove", "description": "该工具将移除 PDF 表单字段的只读限制,使其可编辑、可填写。", - "filenamePrefix": "unlocked_forms", + "filenamePrefix": "已解锁表单", "files": { "placeholder": "在主视图中选择一个 PDF 文件以开始" }, @@ -1299,7 +1380,7 @@ "tags": "标题、作者、日期、创建、时间、发布者、制作人、统计数据", "header": "更改元数据", "submit": "更改", - "filenamePrefix": "metadata", + "filenamePrefix": "元数据", "settings": { "title": "元数据设置" }, @@ -1347,7 +1428,7 @@ }, "trapped": { "label": "陷印状态", - "unknown": "Unknown", + "unknown": "未知", "true": "True", "false": "False" }, @@ -1538,7 +1619,13 @@ "header": "提取图像", "selectText": "选择图像格式,将提取的图像转换为", "allowDuplicates": "保存重复图像", - "submit": "提取" + "submit": "提取", + "error": { + "failed": "从 PDF 提取图像时发生错误。" + }, + "settings": { + "title": "设置" + } }, "pdfToPDFA": { "tags": "归档、长期、标准、转换、存储、保存", @@ -1615,8 +1702,14 @@ "title": "签名", "header": "签署 PDF", "upload": "上传图片", - "draw": "绘制签名", - "text": "文本输入", + "draw": { + "clear": "清除", + "title": "绘制您的签名" + }, + "text": { + "name": "签署人姓名", + "placeholder": "输入您的全名" + }, "clear": "清除", "add": "添加", "saved": "已保存签名", @@ -1632,7 +1725,35 @@ "previous": "上一页", "maintainRatio": "切换保持长宽比", "undo": "撤销", - "redo": "重做" + "redo": "重做", + "activate": "激活签名放置", + "applySignatures": "应用签名", + "deactivate": "停止放置签名", + "error": { + "failed": "签署 PDF 时发生错误。" + }, + "image": { + "hint": "上传 PNG 或 JPG 格式的签名图像", + "label": "上传签名图像", + "placeholder": "选择图像文件" + }, + "instructions": { + "title": "如何添加签名" + }, + "results": { + "title": "签名结果" + }, + "steps": { + "configure": "配置签名" + }, + "submit": "签署文档", + "type": { + "canvas": "画布", + "draw": "绘制", + "image": "图像", + "text": "文本", + "title": "签名类型" + } }, "flatten": { "tags": "静态、停用、非交互、简化", @@ -1640,7 +1761,7 @@ "header": "展平 PDF", "flattenOnlyForms": "仅展平表格", "submit": "展平", - "filenamePrefix": "flattened", + "filenamePrefix": "已扁平化", "files": { "placeholder": "在主视图中选择一个 PDF 文件以开始" }, @@ -1651,7 +1772,8 @@ "stepTitle": "扁平化选项", "title": "扁平化选项", "flattenOnlyForms.desc": "仅扁平化表单字段,保留其他交互元素", - "note": "扁平化会移除 PDF 的交互元素,使其不可编辑。" + "note": "扁平化会移除 PDF 的交互元素,使其不可编辑。", + "flattenOnlyForms": "仅扁平化表单" }, "results": { "title": "扁平化结果" @@ -1687,7 +1809,7 @@ "header": "修复 PDF", "submit": "修复", "description": "该工具将尝试修复损坏或受损的 PDF 文件。无需额外设置。", - "filenamePrefix": "repaired", + "filenamePrefix": "已修复", "files": { "placeholder": "在主视图中选择一个 PDF 文件以开始" }, @@ -1747,7 +1869,17 @@ "tags": "评论、高亮、笔记、标注、删除", "title": "删除标注", "header": "删除标注", - "submit": "删除" + "submit": "删除", + "error": { + "failed": "从 PDF 删除注释时发生错误。" + }, + "info": { + "description": "此工具将从您的 PDF 文档中删除所有注释(评论、高亮、笔记等)。", + "title": "关于删除注释" + }, + "settings": { + "title": "设置" + } }, "compare": { "tags": "区分、对比、更改、分析", @@ -1779,7 +1911,7 @@ "certSign": { "tags": "身份验证、PEM、P12、官方、加密", "title": "证书签名", - "filenamePrefix": "signed", + "filenamePrefix": "已签名", "signMode": { "stepTitle": "签名模式", "tooltip": { @@ -1903,7 +2035,7 @@ "selectPDF": "选择 PDF 文件:", "submit": "移除签名", "description": "该工具将从您的 PDF 文档中移除数字证书签名。", - "filenamePrefix": "unsigned", + "filenamePrefix": "未签名", "files": { "placeholder": "在主视图中选择一个 PDF 文件以开始" }, @@ -1923,7 +2055,7 @@ "submit": "提交" }, "bookletImposition": { - "tags": "booklet,imposition,printing,binding,folding,signature", + "tags": "小册子,拼版,打印,装订,折叠,签名", "title": "小册子拼版", "header": "小册子拼版", "submit": "创建小册子", @@ -2024,7 +2156,7 @@ "submit": "提交" }, "adjustPageScale": { - "tags": "resize,modify,dimension,adapt", + "tags": "调整大小,修改,尺寸,适应", "title": "调整页面比例", "header": "调整页面比例", "scaleFactor": { @@ -2547,7 +2679,7 @@ "header": "将 PDF 转换为单页", "submit": "转为单页", "description": "该工具会将 PDF 的所有页面合并为一张超长单页。宽度保持与原页面相同,高度为所有页面高度之和。", - "filenamePrefix": "single_page", + "filenamePrefix": "单页", "files": { "placeholder": "在主视图中选择一个 PDF 文件以开始" }, @@ -2768,7 +2900,7 @@ "title": "API 文档", "header": "API 文档", "desc": "查看并测试 Stirling PDF 的 API 端点", - "tags": "api,documentation,swagger,endpoints,development" + "tags": "api,文档,swagger,端点,开发" }, "cookieBanner": { "popUp": { @@ -3006,7 +3138,7 @@ "completed": "安全清理成功完成", "error.generic": "安全清理失败", "error.failed": "安全清理 PDF 时发生错误。", - "filenamePrefix": "sanitised", + "filenamePrefix": "已清理", "sanitizationResults": "安全清理结果", "steps": { "files": "文件", @@ -3024,7 +3156,13 @@ "removeXMPMetadata.desc": "从 PDF 中移除 XMP 元数据", "removeMetadata.desc": "移除文档信息元数据(标题、作者等)", "removeLinks.desc": "移除外部链接与启动动作", - "removeFonts.desc": "从 PDF 中移除嵌入字体" + "removeFonts.desc": "从 PDF 中移除嵌入字体", + "removeEmbeddedFiles": "删除嵌入文件", + "removeFonts": "删除字体", + "removeJavaScript": "删除 JavaScript", + "removeLinks": "删除链接", + "removeMetadata": "删除文档元数据", + "removeXMPMetadata": "删除 XMP 元数据" } }, "addPassword": { @@ -3032,7 +3170,7 @@ "desc": "使用密码加密您的 PDF 文档。", "completed": "已应用密码保护", "submit": "加密", - "filenamePrefix": "encrypted", + "filenamePrefix": "已加密", "error": { "failed": "加密 PDF 时发生错误。" }, @@ -3141,7 +3279,7 @@ "placeholder": "输入当前密码", "completed": "密码已配置" }, - "filenamePrefix": "decrypted", + "filenamePrefix": "已解密", "error": { "failed": "移除 PDF 密码时发生错误。" }, @@ -3294,5 +3432,56 @@ } }, "termsAndConditions": "条款与条件", - "logOut": "退出登录" + "logOut": "退出登录", + "AddAttachmentsRequest": { + "addMoreFiles": "添加更多文件...", + "attachments": "选择附件", + "info": "选择要附加到 PDF 的文件。这些文件将被嵌入并可通过 PDF 的附件面板访问。", + "placeholder": "选择文件...", + "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": "何时使用" + } + }, + "unsavedChanges": "您的 PDF 有未保存的更改。您想做什么?", + "unsavedChangesTitle": "未保存的更改" } \ No newline at end of file diff --git a/scripts/counter_translation_v2.py b/scripts/counter_translation_v2.py new file mode 100644 index 000000000..32b3075ad --- /dev/null +++ b/scripts/counter_translation_v2.py @@ -0,0 +1,204 @@ +"""A script to update language progress status in README.md based on +JSON translation file comparison. + +This script compares the default translation JSON file with others in the locales directory to +determine language progress. +It then updates README.md based on provided progress list. + +Author: Ludy87 + +Example: + To use this script, simply run it from command line: + $ python counter_translation_v2.py +""" # noqa: D205 + +import glob +import os +import re +import json + +import tomlkit +import tomlkit.toml_file + + +def convert_to_multiline(data: tomlkit.TOMLDocument) -> tomlkit.TOMLDocument: + """Converts 'ignore' and 'missing' arrays to multiline arrays and sorts the first-level keys of the TOML document. + Enhances readability and consistency in the TOML file by ensuring arrays contain unique and sorted entries. + + Parameters: + data (tomlkit.TOMLDocument): The original TOML document containing the data. + + Returns: + tomlkit.TOMLDocument: A new TOML document with sorted keys and properly formatted arrays. + """ # noqa: D205 + sorted_data = tomlkit.document() + for key in sorted(data.keys()): + value = data[key] + if isinstance(value, dict): + new_table = tomlkit.table() + for subkey in ("ignore", "missing"): + if subkey in value: + # Convert the list to a set to remove duplicates, sort it, and convert to multiline for readability + unique_sorted_array = sorted(set(value[subkey])) + array = tomlkit.array() + array.multiline(True) + for item in unique_sorted_array: + array.append(item) + new_table[subkey] = array + sorted_data[key] = new_table + else: + # Add other types of data unchanged + sorted_data[key] = value + return sorted_data + + +def write_readme(progress_list: list[tuple[str, int]]) -> None: + """Updates the progress status in the README.md file based + on the provided progress list. + + Parameters: + progress_list (list[tuple[str, int]]): A list of tuples containing + language and progress percentage. + + Returns: + None + """ # noqa: D205 + with open("README.md", encoding="utf-8") as file: + content = file.readlines() + + for i, line in enumerate(content[2:], start=2): + for progress in progress_list: + language, value = progress + if language in line: + if match := re.search(r"\!\[(\d+(\.\d+)?)%\]\(.*\)", line): + content[i] = line.replace( + match.group(0), + f"![{value}%](https://geps.dev/progress/{value})", + ) + + with open("README.md", "w", encoding="utf-8", newline="\n") as file: + file.writelines(content) + + +def parse_json_file(file_path): + """ + Parses a JSON translation file and returns a flat dictionary of all keys. + :param file_path: Path to the JSON file. + :return: Dictionary with flattened keys and values. + """ + with open(file_path, "r", encoding="utf-8") as file: + data = json.load(file) + + def flatten_dict(d, parent_key="", sep="."): + items = {} + for k, v in d.items(): + new_key = f"{parent_key}{sep}{k}" if parent_key else k + if isinstance(v, dict): + items.update(flatten_dict(v, new_key, sep=sep)) + else: + items[new_key] = v + return items + + return flatten_dict(data) + + +def compare_files( + default_file_path, file_paths, ignore_translation_file +) -> list[tuple[str, int]]: + """Compares the default JSON translation file with other + translation files in the locales directory. + + Parameters: + default_file_path (str): The path to the default translation JSON file. + file_paths (list): List of paths to translation JSON files. + ignore_translation_file (str): Path to the TOML file with ignore rules. + + Returns: + list[tuple[str, int]]: A list of tuples containing + language and progress percentage. + """ # noqa: D205 + default_keys = parse_json_file(default_file_path) + num_keys = len(default_keys) + + result_list = [] + sort_ignore_translation: tomlkit.TOMLDocument + + # read toml + with open(ignore_translation_file, encoding="utf-8") as f: + sort_ignore_translation = tomlkit.parse(f.read()) + + for file_path in file_paths: + # Extract language code from directory name + locale_dir = os.path.basename(os.path.dirname(file_path)) + + # Convert locale format from hyphen to underscore for TOML compatibility + # e.g., en-GB -> en_GB, sr-LATN-RS -> sr_LATN_RS + language = locale_dir.replace("-", "_") + + fails = 0 + if language in ["en_GB", "en_US"]: + result_list.append(("en_GB", 100)) + result_list.append(("en_US", 100)) + continue + + if language not in sort_ignore_translation: + sort_ignore_translation[language] = tomlkit.table() + + if ( + "ignore" not in sort_ignore_translation[language] + or len(sort_ignore_translation[language].get("ignore", [])) < 1 + ): + sort_ignore_translation[language]["ignore"] = tomlkit.array( + ["language.direction"] + ) + + current_keys = parse_json_file(file_path) + + # Compare keys + for default_key, default_value in default_keys.items(): + if default_key not in current_keys: + # Key is missing entirely + if default_key not in sort_ignore_translation[language]["ignore"]: + print(f"{language}: Key '{default_key}' is missing.") + fails += 1 + elif ( + default_value == current_keys[default_key] + and default_key not in sort_ignore_translation[language]["ignore"] + ): + # Key exists but value is untranslated (same as reference) + print(f"{language}: Key '{default_key}' is missing the translation.") + fails += 1 + elif default_value != current_keys[default_key]: + # Key is translated, remove from ignore list if present + if default_key in sort_ignore_translation[language]["ignore"]: + sort_ignore_translation[language]["ignore"].remove(default_key) + + print(f"{language}: {fails} out of {num_keys} keys are not translated.") + result_list.append( + ( + language, + int((num_keys - fails) * 100 / num_keys), + ) + ) + + ignore_translation = convert_to_multiline(sort_ignore_translation) + with open(ignore_translation_file, "w", encoding="utf-8", newline="\n") as file: + file.write(tomlkit.dumps(ignore_translation)) + + unique_data = list(set(result_list)) + unique_data.sort(key=lambda x: x[1], reverse=True) + + return unique_data + + +if __name__ == "__main__": + directory = os.path.join(os.getcwd(), "frontend", "public", "locales") + translation_file_paths = glob.glob(os.path.join(directory, "*", "translation.json")) + reference_file = os.path.join(directory, "en-GB", "translation.json") + + scripts_directory = os.path.join(os.getcwd(), "scripts") + translation_state_file = os.path.join(scripts_directory, "ignore_translation.toml") + + write_readme( + compare_files(reference_file, translation_file_paths, translation_state_file) + ) \ No newline at end of file