From 3c46010155e8aea41f73fd792f3f45503be690d4 Mon Sep 17 00:00:00 2001 From: Anthony Stirling <77850077+Frooodle@users.noreply.github.com> Date: Tue, 30 Sep 2025 14:36:44 +0100 Subject: [PATCH 1/7] Lang translation (#4556) # Description of Changes --- ## Checklist ### General - [ ] I have read the [Contribution Guidelines](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/CONTRIBUTING.md) - [ ] I have read the [Stirling-PDF Developer Guide](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/devGuide/DeveloperGuide.md) (if applicable) - [ ] I have read the [How to add new languages to Stirling-PDF](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/devGuide/HowToAddNewLanguage.md) (if applicable) - [ ] I have performed a self-review of my own code - [ ] My changes generate no new warnings ### Documentation - [ ] I have updated relevant docs on [Stirling-PDF's doc repo](https://github.com/Stirling-Tools/Stirling-Tools.github.io/blob/main/docs/) (if functionality has heavily changed) - [ ] I have read the section [Add New Translation Tags](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/devGuide/HowToAddNewLanguage.md#add-new-translation-tags) (for new translation tags only) ### UI Changes (if applicable) - [ ] Screenshots or videos demonstrating the UI changes are attached (e.g., as comments or direct attachments in the PR) ### Testing (if applicable) - [ ] I have tested my changes locally. Refer to the [Testing Guide](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/devGuide/DeveloperGuide.md#6-testing) for more details. From 0a242f6a5700a46b825a30d53fb72d07cce8f83a Mon Sep 17 00:00:00 2001 From: "stirlingbot[bot]" <195170888+stirlingbot[bot]@users.noreply.github.com> Date: Tue, 30 Sep 2025 15:53:50 +0100 Subject: [PATCH 2/7] :globe_with_meridians: [V2] Sync Translations + Update README Progress Table (#4558) Co-authored-by: stirlingbot[bot] <195170888+stirlingbot[bot]@users.noreply.github.com> --- README.md | 74 ++++++++++++++++----------------- scripts/ignore_translation.toml | 20 +++++---- 2 files changed, 48 insertions(+), 46 deletions(-) diff --git a/README.md b/README.md index 0533376b8..74783d0a0 100644 --- a/README.md +++ b/README.md @@ -116,46 +116,46 @@ Stirling-PDF currently supports 40 languages! | Language | Progress | | -------------------------------------------- | -------------------------------------- | -| Arabic (العربية) (ar_AR) | ![61%](https://geps.dev/progress/61) | -| Azerbaijani (Azərbaycan Dili) (az_AZ) | ![62%](https://geps.dev/progress/62) | -| Basque (Euskara) (eu_ES) | ![36%](https://geps.dev/progress/36) | -| Bulgarian (Български) (bg_BG) | ![68%](https://geps.dev/progress/68) | -| Catalan (Català) (ca_CA) | ![68%](https://geps.dev/progress/68) | -| Croatian (Hrvatski) (hr_HR) | ![60%](https://geps.dev/progress/60) | -| Czech (Česky) (cs_CZ) | ![70%](https://geps.dev/progress/70) | -| Danish (Dansk) (da_DK) | ![61%](https://geps.dev/progress/61) | -| Dutch (Nederlands) (nl_NL) | ![60%](https://geps.dev/progress/60) | +| Arabic (العربية) (ar_AR) | ![37%](https://geps.dev/progress/37) | +| Azerbaijani (Azərbaycan Dili) (az_AZ) | ![37%](https://geps.dev/progress/37) | +| Basque (Euskara) (eu_ES) | ![21%](https://geps.dev/progress/21) | +| Bulgarian (Български) (bg_BG) | ![40%](https://geps.dev/progress/40) | +| Catalan (Català) (ca_CA) | ![39%](https://geps.dev/progress/39) | +| Croatian (Hrvatski) (hr_HR) | ![36%](https://geps.dev/progress/36) | +| Czech (Česky) (cs_CZ) | ![39%](https://geps.dev/progress/39) | +| Danish (Dansk) (da_DK) | ![35%](https://geps.dev/progress/35) | +| Dutch (Nederlands) (nl_NL) | ![35%](https://geps.dev/progress/35) | | English (English) (en_GB) | ![100%](https://geps.dev/progress/100) | | English (US) (en_US) | ![100%](https://geps.dev/progress/100) | -| French (Français) (fr_FR) | ![89%](https://geps.dev/progress/89) | -| German (Deutsch) (de_DE) | ![98%](https://geps.dev/progress/98) | -| Greek (Ελληνικά) (el_GR) | ![67%](https://geps.dev/progress/67) | -| Hindi (हिंदी) (hi_IN) | ![67%](https://geps.dev/progress/67) | -| Hungarian (Magyar) (hu_HU) | ![99%](https://geps.dev/progress/99) | -| Indonesian (Bahasa Indonesia) (id_ID) | ![62%](https://geps.dev/progress/62) | -| Irish (Gaeilge) (ga_IE) | ![68%](https://geps.dev/progress/68) | -| Italian (Italiano) (it_IT) | ![98%](https://geps.dev/progress/98) | -| Japanese (日本語) (ja_JP) | ![93%](https://geps.dev/progress/93) | -| Korean (한국어) (ko_KR) | ![67%](https://geps.dev/progress/67) | -| Norwegian (Norsk) (no_NB) | ![66%](https://geps.dev/progress/66) | -| Persian (فارسی) (fa_IR) | ![64%](https://geps.dev/progress/64) | -| Polish (Polski) (pl_PL) | ![72%](https://geps.dev/progress/72) | -| Portuguese (Português) (pt_PT) | ![69%](https://geps.dev/progress/69) | -| Portuguese Brazilian (Português) (pt_BR) | ![76%](https://geps.dev/progress/76) | -| Romanian (Română) (ro_RO) | ![57%](https://geps.dev/progress/57) | -| Russian (Русский) (ru_RU) | ![88%](https://geps.dev/progress/88) | -| Serbian Latin alphabet (Srpski) (sr_LATN_RS) | ![95%](https://geps.dev/progress/95) | -| Simplified Chinese (简体中文) (zh_CN) | ![93%](https://geps.dev/progress/93) | -| Slovakian (Slovensky) (sk_SK) | ![51%](https://geps.dev/progress/51) | -| Slovenian (Slovenščina) (sl_SI) | ![71%](https://geps.dev/progress/71) | -| Spanish (Español) (es_ES) | ![74%](https://geps.dev/progress/74) | -| Swedish (Svenska) (sv_SE) | ![65%](https://geps.dev/progress/65) | -| Thai (ไทย) (th_TH) | ![59%](https://geps.dev/progress/59) | +| French (Français) (fr_FR) | ![42%](https://geps.dev/progress/42) | +| German (Deutsch) (de_DE) | ![92%](https://geps.dev/progress/92) | +| Greek (Ελληνικά) (el_GR) | ![39%](https://geps.dev/progress/39) | +| Hindi (हिंदी) (hi_IN) | ![40%](https://geps.dev/progress/40) | +| Hungarian (Magyar) (hu_HU) | ![43%](https://geps.dev/progress/43) | +| Indonesian (Bahasa Indonesia) (id_ID) | ![36%](https://geps.dev/progress/36) | +| Irish (Gaeilge) (ga_IE) | ![40%](https://geps.dev/progress/40) | +| Italian (Italiano) (it_IT) | ![92%](https://geps.dev/progress/92) | +| Japanese (日本語) (ja_JP) | ![41%](https://geps.dev/progress/41) | +| Korean (한국어) (ko_KR) | ![40%](https://geps.dev/progress/40) | +| Norwegian (Norsk) (no_NB) | ![37%](https://geps.dev/progress/37) | +| Persian (فارسی) (fa_IR) | ![39%](https://geps.dev/progress/39) | +| Polish (Polski) (pl_PL) | ![41%](https://geps.dev/progress/41) | +| Portuguese (Português) (pt_PT) | ![40%](https://geps.dev/progress/40) | +| Portuguese Brazilian (Português) (pt_BR) | ![42%](https://geps.dev/progress/42) | +| Romanian (Română) (ro_RO) | ![33%](https://geps.dev/progress/33) | +| Russian (Русский) (ru_RU) | ![43%](https://geps.dev/progress/43) | +| Serbian Latin alphabet (Srpski) (sr_LATN_RS) | ![43%](https://geps.dev/progress/43) | +| Simplified Chinese (简体中文) (zh_CN) | ![92%](https://geps.dev/progress/92) | +| Slovakian (Slovensky) (sk_SK) | ![30%](https://geps.dev/progress/30) | +| Slovenian (Slovenščina) (sl_SI) | ![41%](https://geps.dev/progress/41) | +| Spanish (Español) (es_ES) | ![43%](https://geps.dev/progress/43) | +| Swedish (Svenska) (sv_SE) | ![38%](https://geps.dev/progress/38) | +| Thai (ไทย) (th_TH) | ![35%](https://geps.dev/progress/35) | | Tibetan (བོད་ཡིག་) (bo_CN) | ![65%](https://geps.dev/progress/65) | -| Traditional Chinese (繁體中文) (zh_TW) | ![97%](https://geps.dev/progress/97) | -| Turkish (Türkçe) (tr_TR) | ![80%](https://geps.dev/progress/80) | -| Ukrainian (Українська) (uk_UA) | ![71%](https://geps.dev/progress/71) | -| Vietnamese (Tiếng Việt) (vi_VN) | ![57%](https://geps.dev/progress/57) | +| Traditional Chinese (繁體中文) (zh_TW) | ![43%](https://geps.dev/progress/43) | +| Turkish (Türkçe) (tr_TR) | ![43%](https://geps.dev/progress/43) | +| Ukrainian (Українська) (uk_UA) | ![42%](https://geps.dev/progress/42) | +| Vietnamese (Tiếng Việt) (vi_VN) | ![32%](https://geps.dev/progress/32) | | Malayalam (മലയാളം) (ml_IN) | ![73%](https://geps.dev/progress/73) | ## Stirling PDF Enterprise diff --git a/scripts/ignore_translation.toml b/scripts/ignore_translation.toml index 41dbe52b7..3f03dd0f6 100644 --- a/scripts/ignore_translation.toml +++ b/scripts/ignore_translation.toml @@ -3,7 +3,6 @@ ignore = [ 'lang.div', 'lang.dzo', 'lang.que', - 'language.direction', ] [az_AZ] @@ -193,7 +192,6 @@ ignore = [ 'AddStampRequest.alphabet', 'AddStampRequest.position', 'PDFToBook.selectText.1', - 'PDFToText.tags', 'addPageNumbers.selectText.3', 'adminUserSettings.team', 'alphabet', @@ -204,7 +202,6 @@ ignore = [ 'audit.dashboard.table.details', 'audit.dashboard.table.id', 'certSign.name', - 'cookieBanner.popUp.acceptAllBtn', 'endpointStatistics.top10', 'endpointStatistics.top20', 'fileChooser.dragAndDrop', @@ -245,7 +242,6 @@ ignore = [ 'sponsor', 'team.status', 'text', - 'validateSignature.cert.bits', 'validateSignature.cert.version', 'validateSignature.status', 'watermark.type.1', @@ -321,9 +317,7 @@ ignore = [ ] [fa_IR] -ignore = [ - 'language.direction', -] +ignore = [] [fr_FR] ignore = [ @@ -546,6 +540,11 @@ ignore = [ 'language.direction', ] +[ml_ML] +ignore = [ + 'language.direction', +] + [nl_NL] ignore = [ 'compare.document.1', @@ -790,7 +789,6 @@ ignore = [ [sk_SK] ignore = [ 'adminUserSettings.admin', - 'home.multiTool.title', 'info', 'lang.ceb', 'lang.chr', @@ -1014,11 +1012,15 @@ ignore = [ 'lang.yid', 'lang.yor', 'language.direction', - 'pipeline.title', 'pipelineOptions.pipelineHeader', 'showJS.tags', ] +[zh_BO] +ignore = [ + 'language.direction', +] + [zh_CN] ignore = [ 'language.direction', 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 3/7] 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 From fe2bfd8739c6e05cbda3cb020e04c8f40125ae27 Mon Sep 17 00:00:00 2001 From: "stirlingbot[bot]" <195170888+stirlingbot[bot]@users.noreply.github.com> Date: Wed, 1 Oct 2025 00:04:16 +0100 Subject: [PATCH 4/7] :globe_with_meridians: [V2] Sync Translations + Update README Progress Table (#4560) Co-authored-by: stirlingbot[bot] <195170888+stirlingbot[bot]@users.noreply.github.com> --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index ff11db9ab..77c49ae72 100644 --- a/README.md +++ b/README.md @@ -127,13 +127,13 @@ Stirling-PDF currently supports 40 languages! | English (English) (en_GB) | ![100%](https://geps.dev/progress/100) | | English (US) (en_US) | ![100%](https://geps.dev/progress/100) | | French (Français) (fr_FR) | ![42%](https://geps.dev/progress/42) | -| German (Deutsch) (de_DE) | ![92%](https://geps.dev/progress/92) | +| German (Deutsch) (de_DE) | ![98%](https://geps.dev/progress/98) | | Greek (Ελληνικά) (el_GR) | ![39%](https://geps.dev/progress/39) | | Hindi (हिंदी) (hi_IN) | ![40%](https://geps.dev/progress/40) | | Hungarian (Magyar) (hu_HU) | ![43%](https://geps.dev/progress/43) | | Indonesian (Bahasa Indonesia) (id_ID) | ![36%](https://geps.dev/progress/36) | | Irish (Gaeilge) (ga_IE) | ![40%](https://geps.dev/progress/40) | -| Italian (Italiano) (it_IT) | ![92%](https://geps.dev/progress/92) | +| Italian (Italiano) (it_IT) | ![98%](https://geps.dev/progress/98) | | Japanese (日本語) (ja_JP) | ![41%](https://geps.dev/progress/41) | | Korean (한국어) (ko_KR) | ![40%](https://geps.dev/progress/40) | | Norwegian (Norsk) (no_NB) | ![37%](https://geps.dev/progress/37) | @@ -144,10 +144,10 @@ Stirling-PDF currently supports 40 languages! | Romanian (Română) (ro_RO) | ![33%](https://geps.dev/progress/33) | | Russian (Русский) (ru_RU) | ![43%](https://geps.dev/progress/43) | | Serbian Latin alphabet (Srpski) (sr_LATN_RS) | ![43%](https://geps.dev/progress/43) | -| Simplified Chinese (简体中文) (zh_CN) | ![92%](https://geps.dev/progress/92) | +| Simplified Chinese (简体中文) (zh_CN) | ![99%](https://geps.dev/progress/99) | | Slovakian (Slovensky) (sk_SK) | ![30%](https://geps.dev/progress/30) | | Slovenian (Slovenščina) (sl_SI) | ![41%](https://geps.dev/progress/41) | -| Spanish (Español) (es_ES) | ![43%](https://geps.dev/progress/43) | +| Spanish (Español) (es_ES) | ![98%](https://geps.dev/progress/98) | | Swedish (Svenska) (sv_SE) | ![38%](https://geps.dev/progress/38) | | Thai (ไทย) (th_TH) | ![35%](https://geps.dev/progress/35) | | Tibetan (བོད་ཡིག་) (bo_CN) | ![65%](https://geps.dev/progress/65) | From 3dd4a3359530bd31503393dd96d6f54a7dc51086 Mon Sep 17 00:00:00 2001 From: Anthony Stirling <77850077+Frooodle@users.noreply.github.com> Date: Wed, 1 Oct 2025 12:18:31 +0100 Subject: [PATCH 5/7] Add page numbers (#4500) # Description of Changes Idk why i added a brightness detector for white/black text but hey its been done now ## Checklist ### General - [ ] I have read the [Contribution Guidelines](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/CONTRIBUTING.md) - [ ] I have read the [Stirling-PDF Developer Guide](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/devGuide/DeveloperGuide.md) (if applicable) - [ ] I have read the [How to add new languages to Stirling-PDF](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/devGuide/HowToAddNewLanguage.md) (if applicable) - [ ] I have performed a self-review of my own code - [ ] My changes generate no new warnings ### Documentation - [ ] I have updated relevant docs on [Stirling-PDF's doc repo](https://github.com/Stirling-Tools/Stirling-Tools.github.io/blob/main/docs/) (if functionality has heavily changed) - [ ] I have read the section [Add New Translation Tags](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/devGuide/HowToAddNewLanguage.md#add-new-translation-tags) (for new translation tags only) ### UI Changes (if applicable) - [ ] Screenshots or videos demonstrating the UI changes are attached (e.g., as comments or direct attachments in the PR) ### Testing (if applicable) - [ ] I have tested my changes locally. Refer to the [Testing Guide](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/devGuide/DeveloperGuide.md#6-testing) for more details. --------- Co-authored-by: EthanHealy01 <80844253+EthanHealy01@users.noreply.github.com> --- .../public/locales/en-GB/translation.json | 28 +- .../PageNumberPreview.module.css | 101 ++++++++ .../addPageNumbers/PageNumberPreview.tsx | 241 ++++++++++++++++++ .../useAddPageNumbersOperation.ts | 37 +++ .../useAddPageNumbersParameters.ts | 34 +++ .../src/data/useTranslatedToolRegistry.tsx | 8 +- frontend/src/tools/AddPageNumbers.tsx | 203 +++++++++++++++ 7 files changed, 645 insertions(+), 7 deletions(-) create mode 100644 frontend/src/components/tools/addPageNumbers/PageNumberPreview.module.css create mode 100644 frontend/src/components/tools/addPageNumbers/PageNumberPreview.tsx create mode 100644 frontend/src/components/tools/addPageNumbers/useAddPageNumbersOperation.ts create mode 100644 frontend/src/components/tools/addPageNumbers/useAddPageNumbersParameters.ts create mode 100644 frontend/src/tools/AddPageNumbers.tsx diff --git a/frontend/public/locales/en-GB/translation.json b/frontend/public/locales/en-GB/translation.json index 334231987..dd9ff0400 100644 --- a/frontend/public/locales/en-GB/translation.json +++ b/frontend/public/locales/en-GB/translation.json @@ -16,16 +16,34 @@ "selectText": { "1": "Select PDF file:", "2": "Margin Size", - "3": "Position", + "3": "Position Selection", "4": "Starting Number", "5": "Pages to Number", - "6": "Custom Text" + "6": "Custom Text Format" }, "customTextDesc": "Custom Text", - "numberPagesDesc": "Which pages to number, default 'all', also accepts 1-5 or 2,5,9 etc", - "customNumberDesc": "Defaults to {n}, also accepts 'Page {n} of {total}', 'Text-{n}', '{filename}-{n}", - "submit": "Add Page Numbers" + "numberPagesDesc": "e.g., 1,3,5-8 or leave blank for all pages", + "customNumberDesc": "e.g., \"Page {n}\" or leave blank for just numbers", + "submit": "Add Page Numbers", + "configuration": "Configuration", + "customize": "Customize Appearance", + "pagesAndStarting": "Pages & Starting Number", + "positionAndPages": "Position & Pages", + "error": { + "failed": "Add page numbers operation failed" + }, + "results": { + "title": "Page Number Results" + }, + "preview": "Position Selection", + "previewDisclaimer": "Preview is approximate. Final output may vary due to PDF font metrics." }, + "pageSelectionPrompt": "Specify which pages to add numbers to. Examples: \"1,3,5\" for specific pages, \"1-5\" for ranges, \"2n\" for even pages, or leave blank for all pages.", + "startingNumberTooltip": "The first number to display. Subsequent pages will increment from this number.", + "marginTooltip": "Distance between the page number and the edge of the page.", + "fontSizeTooltip": "Size of the page number text in points. Larger numbers create bigger text.", + "fontTypeTooltip": "Font family for the page numbers. Choose based on your document style.", + "customTextTooltip": "Optional custom format for page numbers. Use {n} as placeholder for the number. Example: \"Page {n}\" will show \"Page 1\", \"Page 2\", etc.", "pdfPrompt": "Select PDF(s)", "multiPdfPrompt": "Select PDFs (2+)", "multiPdfDropPrompt": "Select (or drag & drop) all PDFs you require", diff --git a/frontend/src/components/tools/addPageNumbers/PageNumberPreview.module.css b/frontend/src/components/tools/addPageNumbers/PageNumberPreview.module.css new file mode 100644 index 000000000..1657472b1 --- /dev/null +++ b/frontend/src/components/tools/addPageNumbers/PageNumberPreview.module.css @@ -0,0 +1,101 @@ +/* PageNumberPreview.module.css - EXACT copy from StampPreview */ + +/* Container styles */ +.container { + position: relative; + width: 100%; + overflow: hidden; +} + +.containerWithThumbnail { + background-color: transparent; +} + +.containerWithoutThumbnail { + background-color: rgba(255, 255, 255, 0.03); +} + +.containerBorder { + border: 1px solid var(--border-default, #333); +} + +/* Page thumbnail styles */ +.pageThumbnail { + position: absolute; + inset: 0; + width: 100%; + height: 100%; + object-fit: contain; + filter: grayscale(10%) contrast(95%) brightness(105%); +} + +/* Quick grid overlay styles - EXACT copy from stamp */ +.quickGrid { + position: absolute; + inset: 0; + display: grid; + grid-template-columns: repeat(3, 1fr); + grid-template-rows: repeat(3, 1fr); + gap: 8px; + padding: 8px; + pointer-events: auto; +} + +.gridTile { + border: 1px dashed rgba(0, 0, 0, 0.15); + background-color: transparent; + border-radius: 10px; + cursor: pointer; + display: flex; + font-size: 20px; + user-select: none; + font-weight: 600; + position: relative; +} + +/* Position numbers at edges within each tile with extra top/bottom spacing */ +.gridTile:nth-child(1) { align-items: flex-start; justify-content: flex-start; padding-top: 4px; } /* top-left */ +.gridTile:nth-child(2) { align-items: flex-start; justify-content: center; padding-top: 4px; } /* top-center */ +.gridTile:nth-child(3) { align-items: flex-start; justify-content: flex-end; padding-top: 4px; } /* top-right */ +.gridTile:nth-child(4) { align-items: center; justify-content: flex-start; } /* middle-left */ +.gridTile:nth-child(5) { align-items: center; justify-content: center; } /* center */ +.gridTile:nth-child(6) { align-items: center; justify-content: flex-end; } /* middle-right */ +.gridTile:nth-child(7) { align-items: flex-end; justify-content: flex-start; padding-bottom: 4px; } /* bottom-left */ +.gridTile:nth-child(8) { align-items: flex-end; justify-content: center; padding-bottom: 4px; } /* bottom-center */ +.gridTile:nth-child(9) { align-items: flex-end; justify-content: flex-end; padding-bottom: 4px; } /* bottom-right */ + +/* Base padding for all tiles */ +.gridTile { + padding: 8px; +} + +.gridTileSelected, +.gridTileHovered { + border: 2px solid var(--mantine-primary-color-filled, #3b82f6); + background-color: rgba(59, 130, 246, 0.2); +} + +/* Preview header */ +.previewHeader { + margin-bottom: 12px; +} + +.divider { + height: 1px; + background-color: var(--border-default, #333); + margin-bottom: 8px; +} + +.previewLabel { + font-size: 14px; + font-weight: 500; + color: var(--text-primary); + text-align: center; +} + +/* Preview disclaimer */ +.previewDisclaimer { + margin-top: 8px; + opacity: 0.7; + font-size: 12px; +} \ No newline at end of file diff --git a/frontend/src/components/tools/addPageNumbers/PageNumberPreview.tsx b/frontend/src/components/tools/addPageNumbers/PageNumberPreview.tsx new file mode 100644 index 000000000..0e31f426d --- /dev/null +++ b/frontend/src/components/tools/addPageNumbers/PageNumberPreview.tsx @@ -0,0 +1,241 @@ +import React, { useEffect, useMemo, useRef, useState } from 'react'; +import { useTranslation } from 'react-i18next'; +import { AddPageNumbersParameters } from './useAddPageNumbersParameters'; +import { pdfWorkerManager } from '../../../services/pdfWorkerManager'; +import { useThumbnailGeneration } from '../../../hooks/useThumbnailGeneration'; +import styles from './PageNumberPreview.module.css'; + +// Simple utilities for page numbers (adapted from stamp) +const A4_ASPECT_RATIO = 0.707; + +const getFirstSelectedPage = (input: string): number => { + if (!input) return 1; + const parts = input.split(',').map(s => s.trim()).filter(Boolean); + for (const part of parts) { + if (/^\d+\s*-\s*\d+$/.test(part)) { + const low = parseInt(part.split('-')[0].trim(), 10); + if (Number.isFinite(low) && low > 0) return low; + } + const n = parseInt(part, 10); + if (Number.isFinite(n) && n > 0) return n; + } + return 1; +}; + + +const detectOverallBackgroundColor = async (thumbnailSrc: string | null): Promise<'light' | 'dark'> => { + if (!thumbnailSrc) { + return 'light'; // Default to light background if no thumbnail + } + + return new Promise((resolve) => { + const img = new Image(); + img.crossOrigin = 'anonymous'; + + img.onload = () => { + try { + const canvas = document.createElement('canvas'); + const ctx = canvas.getContext('2d'); + + if (!ctx) { + resolve('light'); + return; + } + + canvas.width = img.width; + canvas.height = img.height; + ctx.drawImage(img, 0, 0); + + // Sample the entire image at reduced resolution for performance + const sampleWidth = Math.min(100, img.width); + const sampleHeight = Math.min(100, img.height); + const imageData = ctx.getImageData(0, 0, img.width, img.height); + const data = imageData.data; + + let totalBrightness = 0; + let pixelCount = 0; + + // Sample every nth pixel for performance + const step = Math.max(1, Math.floor((img.width * img.height) / (sampleWidth * sampleHeight))); + + for (let i = 0; i < data.length; i += 4 * step) { + const r = data[i]; + const g = data[i + 1]; + const b = data[i + 2]; + + // Calculate perceived brightness using luminance formula + const brightness = (0.299 * r + 0.587 * g + 0.114 * b); + totalBrightness += brightness; + pixelCount++; + } + + const averageBrightness = totalBrightness / pixelCount; + + // Threshold: 128 is middle gray + resolve(averageBrightness > 128 ? 'light' : 'dark'); + } catch (error) { + console.warn('Error detecting background color:', error); + resolve('light'); // Default fallback + } + }; + + img.onerror = () => resolve('light'); + img.src = thumbnailSrc; + }); +}; + +type Props = { + parameters: AddPageNumbersParameters; + onParameterChange: (key: K, value: AddPageNumbersParameters[K]) => void; + file?: File | null; + showQuickGrid?: boolean; +}; + +export default function PageNumberPreview({ parameters, onParameterChange, file, showQuickGrid }: Props) { + const { t } = useTranslation(); + const containerRef = useRef(null); + const [, setContainerSize] = useState<{ width: number; height: number }>({ width: 0, height: 0 }); + const [pageSize, setPageSize] = useState<{ widthPts: number; heightPts: number } | null>(null); + const [pageThumbnail, setPageThumbnail] = useState(null); + const { requestThumbnail } = useThumbnailGeneration(); + const [hoverTile, setHoverTile] = useState(null); + const [textColor, setTextColor] = useState('#fff'); + + // Observe container size for responsive positioning + useEffect(() => { + const node = containerRef.current; + if (!node) return; + const resize = () => { + const aspect = pageSize ? (pageSize.widthPts / pageSize.heightPts) : A4_ASPECT_RATIO; + setContainerSize({ width: node.clientWidth, height: node.clientWidth / aspect }); + }; + resize(); + const ro = new ResizeObserver(resize); + ro.observe(node); + return () => ro.disconnect(); + }, [pageSize]); + + // Load first PDF page size in points for accurate scaling + useEffect(() => { + let cancelled = false; + const load = async () => { + if (!file || file.type !== 'application/pdf') { + setPageSize(null); + return; + } + try { + const buffer = await file.arrayBuffer(); + const pdf = await pdfWorkerManager.createDocument(buffer, { disableAutoFetch: true, disableStream: true }); + const page = await pdf.getPage(1); + const viewport = page.getViewport({ scale: 1 }); + if (!cancelled) { + setPageSize({ widthPts: viewport.width, heightPts: viewport.height }); + } + pdfWorkerManager.destroyDocument(pdf); + } catch { + if (!cancelled) setPageSize(null); + } + }; + load(); + return () => { cancelled = true; }; + }, [file]); + + // Load first-page thumbnail for background preview + useEffect(() => { + let isActive = true; + const loadThumb = async () => { + if (!file || file.type !== 'application/pdf') { + setPageThumbnail(null); + return; + } + try { + const pageNumber = Math.max(1, getFirstSelectedPage(parameters.pagesToNumber || '1')); + const pageId = `${file.name}:${file.size}:${file.lastModified}:page:${pageNumber}`; + const thumb = await requestThumbnail(pageId, file, pageNumber); + if (isActive) setPageThumbnail(thumb || null); + } catch { + if (isActive) setPageThumbnail(null); + } + }; + loadThumb(); + return () => { isActive = false; }; + }, [file, parameters.pagesToNumber, requestThumbnail]); + + // Detect text color based on overall PDF background + useEffect(() => { + if (!pageThumbnail) { + setTextColor('#fff'); // Default to white for no thumbnail + return; + } + + const detectColor = async () => { + const backgroundType = await detectOverallBackgroundColor(pageThumbnail); + setTextColor(backgroundType === 'light' ? '#000' : '#fff'); + }; + + detectColor(); + }, [pageThumbnail]); + + const containerStyle = useMemo(() => ({ + position: 'relative' as const, + width: '100%', + aspectRatio: `${(pageSize?.widthPts ?? 595.28) / (pageSize?.heightPts ?? 841.89)} / 1`, + backgroundColor: pageThumbnail ? 'transparent' : 'rgba(255,255,255,0.03)', + border: '1px solid var(--border-default, #333)', + overflow: 'hidden' as const + }), [pageSize, pageThumbnail]); + + return ( +
+
+
+
{t('addPageNumbers.preview', 'Preview Page Numbers')}
+
+
+ {pageThumbnail && ( + page preview + )} + + {/* Quick position overlay grid - EXACT copy from stamp */} + {showQuickGrid && ( +
+ {Array.from({ length: 9 }).map((_, i) => { + const idx = (i + 1) as 1|2|3|4|5|6|7|8|9; + const selected = parameters.position === idx; + return ( + + ); + })} +
+ )} +
+
+ {t('addPageNumbers.previewDisclaimer', 'Preview is approximate. Final output may vary due to PDF font metrics.')} +
+
+ ); +} \ No newline at end of file diff --git a/frontend/src/components/tools/addPageNumbers/useAddPageNumbersOperation.ts b/frontend/src/components/tools/addPageNumbers/useAddPageNumbersOperation.ts new file mode 100644 index 000000000..775ee9009 --- /dev/null +++ b/frontend/src/components/tools/addPageNumbers/useAddPageNumbersOperation.ts @@ -0,0 +1,37 @@ +import { useTranslation } from 'react-i18next'; +import { ToolType, useToolOperation } from '../../../hooks/tools/shared/useToolOperation'; +import { createStandardErrorHandler } from '../../../utils/toolErrorHandler'; +import { AddPageNumbersParameters, defaultParameters } from './useAddPageNumbersParameters'; + +export const buildAddPageNumbersFormData = (parameters: AddPageNumbersParameters, file: File): FormData => { + const formData = new FormData(); + formData.append('fileInput', file); + formData.append('customMargin', parameters.customMargin); + formData.append('position', String(parameters.position)); + formData.append('fontSize', String(parameters.fontSize)); + formData.append('fontType', parameters.fontType); + formData.append('startingNumber', String(parameters.startingNumber)); + formData.append('pagesToNumber', parameters.pagesToNumber); + formData.append('customText', parameters.customText); + + return formData; +}; + +export const addPageNumbersOperationConfig = { + toolType: ToolType.singleFile, + buildFormData: buildAddPageNumbersFormData, + operationType: 'addPageNumbers', + endpoint: '/api/v1/misc/add-page-numbers', + defaultParameters, +} as const; + +export const useAddPageNumbersOperation = () => { + const { t } = useTranslation(); + + return useToolOperation({ + ...addPageNumbersOperationConfig, + getErrorMessage: createStandardErrorHandler( + t('addPageNumbers.error.failed', 'An error occurred while adding page numbers to the PDF.') + ), + }); +}; \ No newline at end of file diff --git a/frontend/src/components/tools/addPageNumbers/useAddPageNumbersParameters.ts b/frontend/src/components/tools/addPageNumbers/useAddPageNumbersParameters.ts new file mode 100644 index 000000000..ca5c1e2e1 --- /dev/null +++ b/frontend/src/components/tools/addPageNumbers/useAddPageNumbersParameters.ts @@ -0,0 +1,34 @@ +import { BaseParameters } from '../../../types/parameters'; +import { useBaseParameters, type BaseParametersHook } from '../../../hooks/tools/shared/useBaseParameters'; + +export interface AddPageNumbersParameters extends BaseParameters { + customMargin: 'small' | 'medium' | 'large' | 'x-large'; + position: 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9; + fontSize: number; + fontType: 'Times' | 'Helvetica' | 'Courier'; + startingNumber: number; + pagesToNumber: string; + customText: string; +} + +export const defaultParameters: AddPageNumbersParameters = { + customMargin: 'medium', + position: 8, // Default to bottom center like the original HTML + fontSize: 12, + fontType: 'Times', + startingNumber: 1, + pagesToNumber: '', + customText: '', +}; + +export type AddPageNumbersParametersHook = BaseParametersHook; + +export const useAddPageNumbersParameters = (): AddPageNumbersParametersHook => { + return useBaseParameters({ + defaultParameters, + endpointName: 'add-page-numbers', + validateFn: (params): boolean => { + return params.fontSize > 0 && params.startingNumber > 0; + }, + }); +}; \ No newline at end of file diff --git a/frontend/src/data/useTranslatedToolRegistry.tsx b/frontend/src/data/useTranslatedToolRegistry.tsx index 920c654ee..103de4356 100644 --- a/frontend/src/data/useTranslatedToolRegistry.tsx +++ b/frontend/src/data/useTranslatedToolRegistry.tsx @@ -90,6 +90,8 @@ import ScannerImageSplitSettings from "../components/tools/scannerImageSplit/Sca import ChangeMetadataSingleStep from "../components/tools/changeMetadata/ChangeMetadataSingleStep"; import SignSettings from "../components/tools/sign/SignSettings"; import CropSettings from "../components/tools/crop/CropSettings"; +import AddPageNumbers from "../tools/AddPageNumbers"; +import { addPageNumbersOperationConfig } from "../components/tools/addPageNumbers/useAddPageNumbersOperation"; import RemoveAnnotations from "../tools/RemoveAnnotations"; import RemoveAnnotationsSettings from "../components/tools/removeAnnotations/RemoveAnnotationsSettings"; import PageLayoutSettings from "../components/tools/pageLayout/PageLayoutSettings"; @@ -444,11 +446,13 @@ export function useFlatToolRegistry(): ToolRegistry { addPageNumbers: { icon: , name: t("home.addPageNumbers.title", "Add Page Numbers"), - component: null, - + component: AddPageNumbers, description: t("home.addPageNumbers.desc", "Add Page numbers throughout a document in a set location"), categoryId: ToolCategoryId.STANDARD_TOOLS, subcategoryId: SubcategoryId.PAGE_FORMATTING, + maxFiles: -1, + endpoints: ["add-page-numbers"], + operationConfig: addPageNumbersOperationConfig, synonyms: getSynonyms(t, "addPageNumbers") }, pageLayout: { diff --git a/frontend/src/tools/AddPageNumbers.tsx b/frontend/src/tools/AddPageNumbers.tsx new file mode 100644 index 000000000..992556491 --- /dev/null +++ b/frontend/src/tools/AddPageNumbers.tsx @@ -0,0 +1,203 @@ +import { useEffect } from "react"; +import { useTranslation } from "react-i18next"; +import { useFileSelection } from "../contexts/FileContext"; +import { createToolFlow } from "../components/tools/shared/createToolFlow"; +import { BaseToolProps, ToolComponent } from "../types/tool"; +import { useEndpointEnabled } from "../hooks/useEndpointConfig"; +import { useAddPageNumbersParameters } from "../components/tools/addPageNumbers/useAddPageNumbersParameters"; +import { useAddPageNumbersOperation } from "../components/tools/addPageNumbers/useAddPageNumbersOperation"; +import { Select, Stack, TextInput, NumberInput, Divider, Text } from "@mantine/core"; +import { Tooltip } from "../components/shared/Tooltip"; +import PageNumberPreview from "../components/tools/addPageNumbers/PageNumberPreview"; +import { useAccordionSteps } from "../hooks/tools/shared/useAccordionSteps"; + +const AddPageNumbers = ({ onPreviewFile, onComplete, onError }: BaseToolProps) => { + const { t } = useTranslation(); + const { selectedFiles } = useFileSelection(); + + const params = useAddPageNumbersParameters(); + const operation = useAddPageNumbersOperation(); + + const { enabled: endpointEnabled, loading: endpointLoading } = useEndpointEnabled("add-page-numbers"); + + useEffect(() => { + operation.resetResults(); + onPreviewFile?.(null); + }, [params.parameters]); + + const handleExecute = async () => { + try { + await operation.executeOperation(params.parameters, selectedFiles); + if (operation.files && onComplete) { + onComplete(operation.files); + } + } catch (error: any) { + onError?.(error?.message || t("addPageNumbers.error.failed", "Add page numbers operation failed")); + } + }; + + const hasFiles = selectedFiles.length > 0; + const hasResults = operation.files.length > 0 || operation.downloadUrl !== null; + + enum AddPageNumbersStep { + NONE = 'none', + POSITION_AND_PAGES = 'position_and_pages', + CUSTOMIZE = 'customize' + } + + const accordion = useAccordionSteps({ + noneValue: AddPageNumbersStep.NONE, + initialStep: AddPageNumbersStep.POSITION_AND_PAGES, + stateConditions: { + hasFiles, + hasResults + }, + afterResults: () => { + operation.resetResults(); + onPreviewFile?.(null); + } + }); + + const getSteps = () => { + const steps: any[] = []; + + // Step 1: Position Selection & Pages/Starting Number + steps.push({ + title: t("addPageNumbers.positionAndPages", "Position & Pages"), + isCollapsed: accordion.getCollapsedState(AddPageNumbersStep.POSITION_AND_PAGES), + onCollapsedClick: () => accordion.handleStepToggle(AddPageNumbersStep.POSITION_AND_PAGES), + isVisible: hasFiles || hasResults, + content: ( + + {/* Position Selection */} + + + + + + + {/* Pages & Starting Number Section */} + + {t('addPageNumbers.pagesAndStarting', 'Pages & Starting Number')} + + + params.updateParameter('pagesToNumber', e.currentTarget.value)} + placeholder={t('addPageNumbers.numberPagesDesc', 'e.g., 1,3,5-8 or leave blank for all pages')} + disabled={endpointLoading} + /> + + + + params.updateParameter('startingNumber', typeof v === 'number' ? v : 1)} + min={1} + disabled={endpointLoading} + /> + + + + ), + }); + + // Step 2: Customize Appearance + steps.push({ + title: t("addPageNumbers.customize", "Customize Appearance"), + isCollapsed: accordion.getCollapsedState(AddPageNumbersStep.CUSTOMIZE), + onCollapsedClick: () => accordion.handleStepToggle(AddPageNumbersStep.CUSTOMIZE), + isVisible: hasFiles || hasResults, + content: ( + + + params.updateParameter('fontType', (v as any) || 'Times')} + data={[ + { value: 'Times', label: 'Times Roman' }, + { value: 'Helvetica', label: 'Helvetica' }, + { value: 'Courier', label: 'Courier New' }, + ]} + disabled={endpointLoading} + /> + + + + params.updateParameter('customText', e.currentTarget.value)} + placeholder={t('addPageNumbers.customNumberDesc', 'e.g., "Page {n}" or leave blank for just numbers')} + disabled={endpointLoading} + /> + + + ), + }); + + return steps; + }; + + return createToolFlow({ + files: { + selectedFiles, + isCollapsed: hasResults, + }, + steps: getSteps(), + executeButton: { + text: t('addPageNumbers.submit', 'Add Page Numbers'), + isVisible: !hasResults, + loadingText: t('loading'), + onClick: handleExecute, + disabled: !params.validateParameters() || !hasFiles || !endpointEnabled, + }, + review: { + isVisible: hasResults, + operation: operation, + title: t('addPageNumbers.results.title', 'Page Number Results'), + onFileClick: (file) => onPreviewFile?.(file), + onUndo: async () => { + await operation.undoOperation(); + onPreviewFile?.(null); + }, + }, + }); +}; + +AddPageNumbers.tool = () => useAddPageNumbersOperation; + +export default AddPageNumbers as ToolComponent; \ No newline at end of file From 0fa53185f2b76147e838e9313cb6f1282081a307 Mon Sep 17 00:00:00 2001 From: Anthony Stirling <77850077+Frooodle@users.noreply.github.com> Date: Wed, 1 Oct 2025 12:58:41 +0100 Subject: [PATCH 6/7] =?UTF-8?q?Add=20translations=20for=20ar-AR,=20de-DE,?= =?UTF-8?q?=20fr-FR,=20it-IT,=20pt-BR,=20ru-RU=20and=20ena=E2=80=A6=20(#45?= =?UTF-8?q?72)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit …ble in frontend - Updated ar-AR (Arabic) to 98.7% completion (1088 entries) - Updated fr-FR (French) to 97.3% completion (1296 entries) - Updated pt-BR (Portuguese Brazil) to 98.6% completion (1294 entries) - Updated ru-RU (Russian) to 98.1% completion (1277 entries) - Updated ja-JP (Japanese) to 73.4% completion (796 entries, batches 1-2) - Updated es-ES minor corrections - Enabled 8 languages with >90% completion in LanguageSelector - Added JSON validation scripts for translation quality assurance - RTL support already enabled for ar-AR Enabled languages: en-GB, ar-AR, de-DE, es-ES, fr-FR, it-IT, pt-BR, ru-RU, zh-CN 🤖 Generated with [Claude Code](https://claude.com/claude-code) # Description of Changes --- ## Checklist ### General - [ ] I have read the [Contribution Guidelines](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/CONTRIBUTING.md) - [ ] I have read the [Stirling-PDF Developer Guide](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/devGuide/DeveloperGuide.md) (if applicable) - [ ] I have read the [How to add new languages to Stirling-PDF](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/devGuide/HowToAddNewLanguage.md) (if applicable) - [ ] I have performed a self-review of my own code - [ ] My changes generate no new warnings ### Documentation - [ ] I have updated relevant docs on [Stirling-PDF's doc repo](https://github.com/Stirling-Tools/Stirling-Tools.github.io/blob/main/docs/) (if functionality has heavily changed) - [ ] I have read the section [Add New Translation Tags](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/devGuide/HowToAddNewLanguage.md#add-new-translation-tags) (for new translation tags only) ### UI Changes (if applicable) - [ ] Screenshots or videos demonstrating the UI changes are attached (e.g., as comments or direct attachments in the PR) ### Testing (if applicable) - [ ] I have tested my changes locally. Refer to the [Testing Guide](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/devGuide/DeveloperGuide.md#6-testing) for more details. Co-authored-by: Claude --- .../public/locales/ar-AR/translation.json | 2872 +++++++++++++---- .../public/locales/es-ES/translation.json | 2 +- .../public/locales/fr-FR/translation.json | 2624 ++++++++++++--- .../public/locales/ja-JP/translation.json | 1817 ++++++++--- .../public/locales/pt-BR/translation.json | 2626 ++++++++++++--- .../public/locales/ru-RU/translation.json | 2612 ++++++++++++--- .../components/shared/LanguageSelector.tsx | 5 +- scripts/translations/README.md | 178 +- scripts/translations/json_validator.py | 259 ++ .../translations/validate_json_structure.py | 229 ++ scripts/translations/validate_placeholders.py | 189 ++ 11 files changed, 10963 insertions(+), 2450 deletions(-) create mode 100644 scripts/translations/json_validator.py create mode 100644 scripts/translations/validate_json_structure.py create mode 100644 scripts/translations/validate_placeholders.py diff --git a/frontend/public/locales/ar-AR/translation.json b/frontend/public/locales/ar-AR/translation.json index 7b95721f0..4d7618d56 100644 --- a/frontend/public/locales/ar-AR/translation.json +++ b/frontend/public/locales/ar-AR/translation.json @@ -1,4 +1,10 @@ { + "unsavedChanges": "لديك تغييرات غير محفوظة على ملف PDF. ماذا تريد أن تفعل؟", + "unsavedChangesTitle": "تغييرات غير محفوظة", + "keepWorking": "واصل العمل", + "discardChanges": "تجاهل التغييرات", + "applyAndContinue": "تطبيق والمتابعة", + "exportAndContinue": "تصدير ومتابعة", "language": { "direction": "rtl" }, @@ -25,9 +31,9 @@ "multiPdfDropPrompt": "حدد (أو اسحب وأفلت) جميع ملفات PDF التي تحتاجها", "imgPrompt": "اختر صورة", "genericSubmit": "إرسال", - "uploadLimit": "Maximum file size:", - "uploadLimitExceededSingular": "is too large. Maximum allowed size is", - "uploadLimitExceededPlural": "are too large. Maximum allowed size is", + "uploadLimit": "الحد الأقصى لحجم الملف:", + "uploadLimitExceededSingular": "كبير جدًا. الحد الأقصى المسموح به هو", + "uploadLimitExceededPlural": "كبيرة جدًا. الحد الأقصى المسموح به هو", "processTimeWarning": "تحذير: يمكن أن تستغرق هذه العملية ما يصل إلى دقيقة حسب حجم الملف", "pageOrderPrompt": "ترتيب الصفحات (أدخل قائمة بأرقام الصفحات مفصولة بفواصل):", "pageSelectionPrompt": "اختيار الصفحات المخصص (أدخل قائمة بأرقام الصفحات مفصولة بفواصل 1،5،6 أو دوال مثل 2n+1):", @@ -35,10 +41,28 @@ "true": "صحيح", "false": "خطأ", "unknown": "غير معروف", + "app": { + "description": "بديل Adobe Acrobat المجاني (10M+ تنزيلات)" + }, "save": "حفظ", "saveToBrowser": "حفظ في المتصفح", + "download": "تنزيل", + "undoOperationTooltip": "انقر للتراجع عن آخر عملية واستعادة الملفات الأصلية", + "undo": "تراجع", + "moreOptions": "خيارات إضافية", + "editYourNewFiles": "حرّر ملفاتك الجديدة", "close": "إغلاق", + "fileSelected": "المحدد: {{filename}}", + "chooseFile": "اختر ملفًا", "filesSelected": "الملفات المحددة", + "files": { + "title": "الملفات", + "upload": "تحميل", + "uploadFiles": "تحميل ملفات", + "addFiles": "إضافة ملفات", + "selectFromWorkbench": "اختر ملفات من طاولة العمل أو ", + "selectMultipleFromWorkbench": "اختر على الأقل {{count}} ملفًا من طاولة العمل أو " + }, "noFavourites": "لم تتم إضافة أي مفضلات", "downloadComplete": "إكتمل التحميل", "bored": "الانتظار بالملل؟", @@ -56,7 +80,10 @@ }, "error": { "pdfPassword": "ملف PDF محمي بكلمة مرور ولم يتم تقديم كلمة المرور أو كانت غير صحيحة", + "encryptedPdfMustRemovePassword": "هذا PDF مشفّر أو محمي بكلمة مرور. يرجى فتحه قبل التحويل إلى PDF/A.", + "incorrectPasswordProvided": "كلمة مرور PDF غير صحيحة أو غير مذكورة.", "_value": "خطأ", + "dismissAllErrors": "تجاهل كل الأخطاء", "sorry": "نأسف على المشكلة!", "needHelp": "هل تحتاج إلى مساعدة / وجدت مشكلة؟", "contactTip": "إذا كنت ما زلت تواجه صعوبة، لا تتردد في التواصل معنا للحصول على المساعدة. يمكنك إرسال تذكرة على صفحة GitHub الخاصة بنا أو الاتصال بنا عبر Discord:", @@ -71,6 +98,10 @@ "githubSubmit": "GitHub - إرسال تذكرة", "discordSubmit": "Discord - إرسال منشور دعم" }, + "warning": { + "tooltipTitle": "تحذير" + }, + "edit": "تحرير", "delete": "حذف", "username": "اسم المستخدم", "password": "كلمة المرور", @@ -82,6 +113,7 @@ "green": "أخضر", "blue": "أزرق", "custom": "مخصص...", + "comingSoon": "قريبًا", "WorkInProgess": "العمل قيد التقدم، قد لا يعمل أو يحتوي على أخطاء، يرجى الإبلاغ عن أي مشاكل!", "poweredBy": "مدعوم بواسطة", "yes": "نعم", @@ -115,17 +147,19 @@ "page": "صفحة", "pages": "صفحات", "loading": "جارٍ التحميل...", + "review": "مراجعة", "addToDoc": "إضافة إلى المستند", "reset": "إعداة ضبط", - "apply": "Apply", - "noFileSelected": "No file selected. Please upload one.", + "apply": "تطبيق", + "noFileSelected": "لا يوجد ملف محدد. يرجى رفع واحد.", "legal": { "privacy": "سياسة الخصوصية", + "iAgreeToThe": "أوافق على جميع", "terms": "شروط الاستخدام", "accessibility": "إمكانية الوصول", "cookie": "سياسة ملفات تعريف الارتباط", "impressum": "بيان الهوية", - "showCookieBanner": "Cookie Preferences" + "showCookieBanner": "تفضيلات ملفات الارتباط" }, "pipeline": { "header": "قائمة خط الأنابيب (تجريبي)", @@ -166,7 +200,7 @@ }, "navbar": { "favorite": "المفضلة", - "recent": "New and recently updated", + "recent": "الجديد والمحدّث حديثًا", "darkmode": "الوضع الداكن", "language": "اللغات", "settings": "إعدادات", @@ -265,32 +299,32 @@ "disabledUsers": "المستخدمين المعطلين:", "totalUsers": "إجمالي المستخدمين:", "lastRequest": "آخر طلب", - "usage": "View Usage" + "usage": "عرض الاستخدام" }, "endpointStatistics": { - "title": "Endpoint Statistics", - "header": "Endpoint Statistics", - "top10": "Top 10", - "top20": "Top 20", - "all": "All", - "refresh": "Refresh", - "includeHomepage": "Include Homepage ('/')", - "includeLoginPage": "Include Login Page ('/login')", - "totalEndpoints": "Total Endpoints", - "totalVisits": "Total Visits", - "showing": "Showing", - "selectedVisits": "Selected Visits", - "endpoint": "Endpoint", - "visits": "Visits", - "percentage": "Percentage", + "title": "إحصاءات المسارات", + "header": "إحصاءات المسارات", + "top10": "أعلى 10", + "top20": "أعلى 20", + "all": "الكل", + "refresh": "تحديث", + "includeHomepage": "تضمين الصفحة الرئيسية ('/')", + "includeLoginPage": "تضمين صفحة تسجيل الدخول ('/login')", + "totalEndpoints": "إجمالي المسارات", + "totalVisits": "إجمالي الزيارات", + "showing": "يعرض", + "selectedVisits": "الزيارات المحددة", + "endpoint": "المسار النهائي", + "visits": "الزيارات", + "percentage": "النسبة المئوية", "loading": "جارٍ التحميل...", - "failedToLoad": "Failed to load endpoint data. Please try refreshing.", - "home": "Home", - "login": "Login", - "top": "Top", - "numberOfVisits": "Number of Visits", - "visitsTooltip": "Visits: {0} ({1}% of total)", - "retry": "Retry" + "failedToLoad": "فشل تحميل بيانات المسارات. حاول التحديث.", + "home": "الصفحة الرئيسية", + "login": "تسجيل الدخول", + "top": "الأعلى", + "numberOfVisits": "عدد الزيارات", + "visitsTooltip": "الزيارات: {0} ({1}% من الإجمالي)", + "retry": "إعادة المحاولة" }, "database": { "title": "استيراد/تصدير قاعدة البيانات", @@ -300,17 +334,17 @@ "fileSize": "حجم الملف", "deleteBackupFile": "حذف ملف النسخ الاحتياطي", "importBackupFile": "استيراد ملف النسخ الاحتياطي", - "createBackupFile": "Create Backup File", + "createBackupFile": "إنشاء ملف نسخة احتياطية", "downloadBackupFile": "تنزيل ملف النسخ الاحتياطي", "info_1": "عند استيراد البيانات، من الضروري ضمان الهيكل الصحيح. إذا كنت غير متأكد مما تفعله، اطلب المشورة والدعم من محترف. يمكن أن يؤدي الخطأ في الهيكل إلى حدوث أعطال في التطبيق، حتى عدم القدرة على تشغيل التطبيق بالكامل.", "info_2": "لا يهم اسم الملف عند التحميل. سيتم إعادة تسميته بعد ذلك لاتباع التنسيق backup_user_yyyyMMddHHmm.sql، مما يضمن اتساق تسمية متناسق.", "submit": "استيراد النسخة الاحتياطية", "importIntoDatabaseSuccessed": "تم استيراد قاعدة البيانات بنجاح", - "backupCreated": "Database backup successful", + "backupCreated": "تم إنشاء نسخة احتياطية لقاعدة البيانات بنجاح", "fileNotFound": "لم يتم العثور على الملف", "fileNullOrEmpty": "يجب ألا يكون الملف فارغًا أو خاليًا", "failedImportFile": "فشل استيراد الملف", - "notSupported": "This function is not available for your database connection." + "notSupported": "هذه الوظيفة غير متاحة لاتصال قاعدة البيانات لديك." }, "session": { "expired": "لقد انتهت جلستك. يرجى تحديث الصفحة والمحاولة مرة أخرى", @@ -320,301 +354,320 @@ "desc": "متجرك الشامل المستضاف محليًا لجميع احتياجات PDF الخاصة بك.", "searchBar": "البحث عن الميزات...", "viewPdf": { - "title": "View/Edit PDF", + "title": "عرض/تحرير PDF", "desc": "عرض وتعليق وإضافة نص أو صور" }, - "setFavorites": "Set Favourites", - "hideFavorites": "Hide Favourites", - "showFavorites": "Show Favourites", - "legacyHomepage": "Old homepage", - "newHomePage": "Try our new homepage!", - "alphabetical": "Alphabetical", - "globalPopularity": "Global Popularity", - "sortBy": "Sort by:", + "setFavorites": "تعيين المفضلة", + "hideFavorites": "إخفاء المفضلة", + "showFavorites": "إظهار المفضلة", + "legacyHomepage": "الصفحة الرئيسية القديمة", + "newHomePage": "جرّب صفحتنا الرئيسية الجديدة!", + "alphabetical": "أبجدي", + "globalPopularity": "الشعبية العالمية", + "sortBy": "فرز حسب:", "multiTool": { + "tags": "متعدد،أدوات", "title": "أداة متعددة PDF", "desc": "دمج الصفحات وتدويرها وإعادة ترتيبها وإزالتها" }, "merge": { + "tags": "دمج،جمع،توحيد", "title": "دمج ملفات", "desc": "دمج ملفات PDF متعددة في ملف واحد بسهولة." }, "split": { + "tags": "تقسيم،فصل،تجزئة", "title": "تقسيم ملفات", "desc": "تقسيم ملفات PDF إلى مستندات متعددة" }, "rotate": { + "tags": "تدوير،قلب،توجيه", "title": "تدوير ملفات", "desc": "قم بتدوير ملفات PDF الخاصة بك بسهولة." }, - "imageToPDF": { - "title": "صورة إلى PDF", - "desc": "تحويل الصور (PNG ، JPEG ، GIF) إلى PDF." - }, - "pdfToImage": { - "title": "تحويل PDF إلى صورة", - "desc": "تحويل ملف PDF إلى صورة. (PNG ، JPEG ، GIF)" + "convert": { + "tags": "تحويل،تغيير", + "title": "تحويل", + "desc": "تحويل الملفات بين صيغ مختلفة" }, "pdfOrganiser": { + "tags": "تنظيم،إعادة ترتيب،إعادة فرز", "title": "منظم", "desc": "إزالة / إعادة ترتيب الصفحات بأي ترتيب" }, "addImage": { + "tags": "إدراج،تضمين،وضع", "title": "إضافة صورة إلى ملف PDF", "desc": "إضافة صورة إلى موقع معين في PDF (العمل قيد التقدم)" }, + "addAttachments": { + "tags": "تضمين،إرفاق،إدراج", + "title": "إضافة مرفقات", + "desc": "إضافة أو إزالة الملفات المضمّنة (المرفقات) إلى/من PDF" + }, "watermark": { + "tags": "ختم،وسم،تراكب", "title": "إضافة علامة مائية", "desc": "أضف علامة مائية مخصصة إلى مستند PDF الخاص بك." }, - "permissions": { - "title": "تغيير الأذونات", - "desc": "قم بتغيير أذونات مستند PDF الخاص بك" + "removePassword": { + "tags": "فتح", + "title": "إزالة كلمة المرور", + "desc": "إزالة الحماية بكلمة مرور من مستند PDF الخاص بك." }, - "pageRemover": { + "compress": { + "tags": "تصغير،تقليل،تحسين", + "title": "ضغط ملفات", + "desc": "ضغط ملفات PDF لتقليل حجم الملف." + }, + "unlockPDFForms": { + "tags": "فتح،تمكين،تحرير", + "title": "إلغاء قفل نماذج PDF", + "desc": "إزالة خاصية القراءة فقط لحقول النماذج في مستند PDF." + }, + "changeMetadata": { + "tags": "تحرير،تعديل،تحديث", + "title": "تغيير البيانات الوصفية", + "desc": "تغيير / إزالة / إضافة بيانات أولية من مستند PDF" + }, + "ocr": { + "tags": "استخراج،مسح", + "title": "تشغيل OCR على PDF و / أو مسح ضوئي", + "desc": "يقوم برنامج التنظيف بمسح واكتشاف النص من الصور داخل ملف PDF ويعيد إضافته كنص" + }, + "extractImages": { + "tags": "استخراج،حفظ،تصدير", + "title": "استخراج الصور", + "desc": "يستخرج جميع الصور من ملف PDF ويحفظها في الرمز البريدي" + }, + "scannerImageSplit": { + "tags": "كشف،تقسيم،صور", + "title": "اكتشاف وتقسيم الصور الممسوحة", + "desc": "اكتشاف الصور الممسوحة وتقسيمها إلى صفحات منفصلة" + }, + "sign": { + "tags": "توقيع،إمضاء", + "title": "توقيع", + "desc": "إضافة التوقيع إلى PDF عن طريق الرسم أو النص أو الصورة" + }, + "flatten": { + "tags": "تبسيط،إزالة،تفاعلي", + "title": "تسطيح", + "desc": "قم بإزالة كافة العناصر والنماذج التفاعلية من ملف PDF" + }, + "certSign": { + "tags": "تحقّق،PEM،P12،رسمي،تشفير،توقيع،شهادة،PKCS12،JKS،خادم،يدوي،تلقائي", + "title": "التوقيع بالشهادة", + "desc": "يوقع ملف PDF بشهادة/مفتاح (PEM/P12)" + }, + "repair": { + "tags": "إصلاح،استعادة", + "title": "إصلاح", + "desc": "يحاول إصلاح ملف PDF تالف / معطل" + }, + "removeBlanks": { + "tags": "حذف،تنظيف،فارغ", + "title": "إزالة الصفحات الفارغة", + "desc": "يكتشف ويزيل الصفحات الفارغة من المستند" + }, + "removeAnnotations": { + "tags": "حذف،تنظيف،إزالة", + "title": "إزالة التعليقات التوضيحية", + "desc": "يزيل جميع التعليقات/التعليقات التوضيحية من ملف PDF" + }, + "compare": { + "tags": "اختلاف", + "title": "مقارنة", + "desc": "يقارن ويظهر الاختلافات بين مستندين PDF" + }, + "removeCertSign": { + "tags": "إزالة،حذف،فتح", + "title": "إزالة توقيع الشهادة", + "desc": "إزالة توقيع الشهادة من ملف PDF" + }, + "pageLayout": { + "tags": "تخطيط،ترتيب،دمج", + "title": "تخطيط متعدد الصفحات", + "desc": "دمج صفحات متعددة من مستند PDF في صفحة واحدة" + }, + "bookletImposition": { + "tags": "كتيّب،طباعة،تجليد", + "title": "ترتيب الكتيّب", + "desc": "إنشاء كتيّبات بترتيب صفحات صحيح وتخطيط متعدد الصفحات للطباعة والتجليد" + }, + "scalePages": { + "tags": "تغيير حجم،ضبط،تحجيم", + "title": "ضبط حجم/مقياس الصفحة", + "desc": "تغيير حجم/مقياس الصفحة و/أو محتواها." + }, + "addPageNumbers": { + "tags": "ترقيم،صفحات،عدّ", + "title": "إضافة أرقام الصفحات", + "desc": "إضافة أرقام الصفحات في جميع أنحاء المستند في موقع محدد" + }, + "autoRename": { + "tags": "كشف تلقائي،مستند للعناوين،تنظيم،إعادة وسم", + "title": "إعادة تسمية ملف PDF تلقائيًا", + "desc": "إعادة تسمية ملف PDF تلقائيًا استنادًا إلى العنوان المكتشف" + }, + "adjustContrast": { + "tags": "تباين،سطوع،تشبّع", + "title": "ضبط الألوان/التباين", + "desc": "ضبط التباين والتشبع والسطوع لملف PDF" + }, + "crop": { + "tags": "قص،قطع،تغيير حجم", + "title": "اقتصاص PDF", + "desc": "اقتصاص ملف PDF لتقليل حجمه (مع الحفاظ على النص!)" + }, + "autoSplitPDF": { + "tags": "تلقائي،تقسيم،QR", + "title": "تقسيم الصفحات تلقائيًا", + "desc": "تقسيم PDF الممسوح ضوئيًا تلقائيًا باستخدام رمز QR لتقسيم الصفحات الممسوحة ضوئيًا فعليًا" + }, + "sanitize": { + "tags": "تنظيف،تطهير،إزالة", + "title": "تنقية", + "desc": "إزالة العناصر المحتملة الضرر من ملفات PDF" + }, + "getPdfInfo": { + "tags": "معلومات،بيانات وصفية،تفاصيل", + "title": "الحصول على جميع المعلومات عن PDF", + "desc": "يجمع أي وكل المعلومات الممكنة عن ملفات PDF" + }, + "pdfToSinglePage": { + "tags": "دمج،تجميع،صفحة واحدة", + "title": "PDF إلى صفحة واحدة كبيرة", + "desc": "يدمج جميع صفحات PDF في صفحة واحدة كبيرة" + }, + "showJS": { + "tags": "JavaScript،كود،سكريبت", + "title": "إظهار جافا سكريبت", + "desc": "يبحث ويعرض أي جافا سكريبت مدرج في PDF" + }, + "redact": { + "tags": "تنقيح،طمس،إخفاء", + "title": "Manual Redaction", + "desc": "Redacts a PDF based on selected text, drawn shapes and/or selected page(s)" + }, + "overlayPdfs": { + "tags": "تراكب،دمج،تكديس", + "title": "تراكب ملفات PDF", + "desc": "تراكب ملفات PDF فوق ملف PDF آخر" + }, + "splitBySections": { + "tags": "تقسيم،أقسام،تجزئة", + "title": "تقسيم PDF حسب الأقسام", + "desc": "قسّم كل صفحة من PDF إلى أقسام أصغر أفقية ورأسية" + }, + "addStamp": { + "tags": "ختم،وسم،خاتم", + "title": "إضافة ختم إلى PDF", + "desc": "أضف نصًا أو طوابع صور في مواقع محددة" + }, + "removeImage": { + "tags": "إزالة،حذف،تنظيف", + "title": "إزالة الصورة", + "desc": "إزالة الصورة من PDF لتقليل حجم الملف" + }, + "splitByChapters": { + "tags": "تقسيم،فصول،بنية", + "title": "تجزئة المستندات PDF حسب الفصول", + "desc": "قسم مستند PDF إلى ملفات متعددة بناءً على هيكل فصوله." + }, + "validateSignature": { + "tags": "تحقق،تأكيد،شهادة", + "title": "التحقق من توقيع PDF", + "desc": "التحقق من التواقيع الرقمية والشهادات في مستندات PDF" + }, + "swagger": { + "tags": "API،توثيق،اختبار", + "title": "توثيق API", + "desc": "عرض توثيق API واختبار المسارات النهائية" + }, + "scannerEffect": { + "tags": "مسح،محاكاة،إنشاء", + "title": "تأثير الماسح", + "desc": "إنشاء PDF يبدو وكأنه مُسح ضوئيًا" + }, + "editTableOfContents": { + "tags": "علامات مرجعية،محتويات،تحرير", + "title": "تحرير جدول المحتويات", + "desc": "أضف أو حرّر العلامات المرجعية وجدول المحتويات في مستندات PDF" + }, + "manageCertificates": { + "tags": "شهادات،استيراد،تصدير", + "title": "إدارة الشهادات", + "desc": "استيراد أو تصدير أو حذف ملفات الشهادات الرقمية المستخدمة لتوقيع ملفات PDF." + }, + "read": { + "tags": "عرض،فتح،إظهار", + "title": "قراءة", + "desc": "عرض ووسم ملفات PDF. تمييز النص، الرسم، أو إدراج التعليقات للمراجعة والتعاون." + }, + "reorganizePages": { + "tags": "إعادة ترتيب،إعادة فرز،تنظيم", + "title": "إعادة تنظيم الصفحات", + "desc": "إعادة ترتيب أو تكرار أو حذف صفحات PDF بتحكم مرئي بالسحب والإفلات." + }, + "extractPages": { + "tags": "سحب،تحديد،نسخ", + "title": "استخراج الصفحات", + "desc": "استخراج صفحات محددة من مستند PDF" + }, + "removePages": { + "tags": "حذف،استخراج،استبعاد", "title": "إزالة الصفحات", "desc": "حذف الصفحات غير المرغوب فيها من مستند PDF الخاص بك." }, + "autoSizeSplitPDF": { + "tags": "تلقائي،تقسيم،حجم", + "title": "تقسيم تلقائي حسب الحجم/العدد", + "desc": "تقسيم ملف PDF واحد إلى مستندات متعددة بناءً على الحجم أو عدد الصفحات أو عدد المستندات" + }, + "replaceColor": { + "title": "استبدال وعكس الألوان", + "desc": "استبدال الألوان أو عكسها في مستندات PDF" + }, + "devApi": { + "tags": "API،تطوير،توثيق", + "title": "API", + "desc": "رابط إلى توثيق API" + }, + "devFolderScanning": { + "tags": "أتمتة،مجلد،مسح", + "title": "المسح الآلي للمجلدات", + "desc": "رابط إلى دليل المسح الآلي للمجلدات" + }, + "devSsoGuide": { + "title": "دليل SSO", + "desc": "رابط إلى دليل SSO" + }, + "devAirgapped": { + "title": "إعداد معزول", + "desc": "رابط إلى دليل الإعداد المعزول" + }, "addPassword": { "title": "إضافة كلمة مرور", "desc": "تشفير مستند PDF الخاص بك بكلمة مرور." }, - "removePassword": { - "title": "إزالة كلمة المرور", - "desc": "إزالة الحماية بكلمة مرور من مستند PDF الخاص بك." - }, - "compress": { - "title": "ضغط ملفات", - "desc": "ضغط ملفات PDF لتقليل حجم الملف." - }, - "unlockPDFForms": { - "title": "Unlock PDF Forms", - "desc": "Remove read-only property of form fields in a PDF document." - }, - "changeMetadata": { - "title": "تغيير البيانات الوصفية", - "desc": "تغيير / إزالة / إضافة بيانات أولية من مستند PDF" - }, - "fileToPDF": { - "title": "تحويل الملف إلى PDF", - "desc": "تحويل أي ملف تقريبا إلى PDF (DOCX وPNG وXLS وPPT وTXT والمزيد)" - }, - "ocr": { - "title": "تشغيل OCR على PDF و / أو مسح ضوئي", - "desc": "يقوم برنامج التنظيف بمسح واكتشاف النص من الصور داخل ملف PDF ويعيد إضافته كنص" - }, - "extractImages": { - "title": "استخراج الصور", - "desc": "يستخرج جميع الصور من ملف PDF ويحفظها في الرمز البريدي" - }, - "pdfToPDFA": { - "title": "تحويل ملفات PDF إلى PDF / A", - "desc": "تحويل PDF إلى PDF / A للتخزين طويل المدى" - }, - "PDFToWord": { - "title": "تحويل PDF إلى Word", - "desc": "تحويل PDF إلى تنسيقات Word (DOC و DOCX و ODT)" - }, - "PDFToPresentation": { - "title": "PDF للعرض التقديمي", - "desc": "تحويل PDF إلى تنسيقات عرض تقديمي (PPT و PPTX و ODP)" - }, - "PDFToText": { - "title": "تحويل PDF إلى نص / RTF", - "desc": "تحويل PDF إلى تنسيق نص أو RTF" - }, - "PDFToHTML": { - "title": "تحويل PDF إلى HTML", - "desc": "تحويل PDF إلى تنسيق HTML" - }, - "PDFToXML": { - "title": "تحويل PDF إلى XML", - "desc": "تحويل PDF إلى تنسيق XML" - }, - "ScannerImageSplit": { - "title": "كشف / انقسام الصور الممسوحة ضوئيًا", - "desc": "تقسيم عدة صور من داخل صورة / ملف PDF" - }, - "sign": { - "title": "توقيع", - "desc": "إضافة التوقيع إلى PDF عن طريق الرسم أو النص أو الصورة" - }, - "flatten": { - "title": "تسطيح", - "desc": "قم بإزالة كافة العناصر والنماذج التفاعلية من ملف PDF" - }, - "repair": { - "title": "إصلاح", - "desc": "يحاول إصلاح ملف PDF تالف / معطل" - }, - "removeBlanks": { - "title": "إزالة الصفحات الفارغة", - "desc": "يكتشف ويزيل الصفحات الفارغة من المستند" - }, - "removeAnnotations": { - "title": "إزالة التعليقات التوضيحية", - "desc": "يزيل جميع التعليقات/التعليقات التوضيحية من ملف PDF" - }, - "compare": { - "title": "مقارنة", - "desc": "يقارن ويظهر الاختلافات بين مستندين PDF" - }, - "certSign": { - "title": "التوقيع بالشهادة", - "desc": "يوقع ملف PDF بشهادة/مفتاح (PEM/P12)" - }, - "removeCertSign": { - "title": "إزالة توقيع الشهادة", - "desc": "إزالة توقيع الشهادة من ملف PDF" - }, - "pageLayout": { - "title": "تخطيط متعدد الصفحات", - "desc": "دمج صفحات متعددة من مستند PDF في صفحة واحدة" - }, - "scalePages": { - "title": "ضبط حجم/مقياس الصفحة", - "desc": "تغيير حجم/مقياس الصفحة و/أو محتواها." - }, - "pipeline": { - "title": "خط الأنابيب", - "desc": "تشغيل إجراءات متعددة على ملفات PDF عن طريق تحديد نصوص خط الأنابيب" - }, - "addPageNumbers": { - "title": "إضافة أرقام الصفحات", - "desc": "إضافة أرقام الصفحات في جميع أنحاء المستند في موقع محدد" - }, - "auto-rename": { - "title": "إعادة تسمية ملف PDF تلقائيًا", - "desc": "إعادة تسمية ملف PDF تلقائيًا بناءً على الرأس المكتشف" - }, - "adjustContrast": { - "title": "ضبط الألوان/التباين", - "desc": "ضبط التباين والتشبع والسطوع لملف PDF" - }, - "crop": { - "title": "اقتصاص PDF", - "desc": "اقتصاص ملف PDF لتقليل حجمه (مع الحفاظ على النص!)" - }, - "autoSplitPDF": { - "title": "تقسيم الصفحات تلقائيًا", - "desc": "تقسيم PDF الممسوح ضوئيًا تلقائيًا باستخدام رمز QR لتقسيم الصفحات الممسوحة ضوئيًا فعليًا" - }, - "sanitizePDF": { - "title": "تنظيف", - "desc": "إزالة البرامج النصية والعناصر الأخرى من ملفات PDF" - }, - "URLToPDF": { - "title": "URL/موقع ويب إلى PDF", - "desc": "يحول أي عنوان URL للـ http(s) إلى PDF" - }, - "HTMLToPDF": { - "title": "HTML إلى PDF", - "desc": "يحول أي ملف HTML أو ملف مضغوط يحتوي" - }, - "MarkdownToPDF": { - "title": "Markdown إلى PDF", - "desc": "يحول أي ملف Markdown إلى PDF" - }, - "PDFToMarkdown": { - "title": "PDF to Markdown", - "desc": "Converts any PDF to Markdown" - }, - "getPdfInfo": { - "title": "الحصول على جميع المعلومات عن PDF", - "desc": "يجمع أي وكل المعلومات الممكنة عن ملفات PDF" - }, - "pageExtracter": { - "title": "استخراج الصفحة (الصفحات)", - "desc": "يستخرج صفحات محددة من PDF" - }, - "pdfToSinglePage": { - "title": "PDF إلى صفحة واحدة كبيرة", - "desc": "يدمج جميع صفحات PDF في صفحة واحدة كبيرة" - }, - "showJS": { - "title": "إظهار جافا سكريبت", - "desc": "يبحث ويعرض أي جافا سكريبت مدرج في PDF" - }, - "autoRedact": { - "title": "حجب تلقائي", - "desc": "يحجب (يسود) النص في PDF تلقائيًا بناءً على النص المدخل" - }, - "redact": { - "title": "Manual Redaction", - "desc": "Redacts a PDF based on selected text, drawn shapes and/or selected page(s)" - }, - "PDFToCSV": { - "title": "PDF إلى CSV", - "desc": "يستخرج الجداول من PDF ويحولها إلى CSV" - }, - "split-by-size-or-count": { - "title": "تقسيم تلقائي حسب الحجم/العدد", - "desc": "تقسيم ملف PDF واحد إلى مستندات متعددة بناءً على الحجم أو عدد الصفحات أو عدد المستندات" - }, - "overlay-pdfs": { - "title": "تراكب ملفات PDF", - "desc": "يضع ملفات PDF فوق ملف PDF آخر" - }, - "split-by-sections": { - "title": "تقسيم PDF حسب الأقسام", - "desc": "تقسيم كل صفحة من PDF إلى أقسام أفقية وعمودية أصغر" - }, - "AddStampRequest": { - "title": "إضافة ختم إلى PDF", - "desc": "إضافة نص أو إضافة أختام الصور في مواقع محددة" - }, - "removeImage": { - "title": "إزالة الصورة", - "desc": "إزالة الصورة من PDF لتقليل حجم الملف" - }, - "splitByChapters": { - "title": "تجزئة المستندات PDF حسب الفصول", - "desc": "قسم مستند PDF إلى ملفات متعددة بناءً على هيكل فصوله." - }, - "validateSignature": { - "title": "Validate PDF Signature", - "desc": "Verify digital signatures and certificates in PDF documents" - }, - "replace-color": { - "title": "إستبدال و عكس الألوان", - "desc": "استبدال الألوان للنصوص والخلفيات في المستندات PDF وإلغاء تعكير اللون الكامل للمستند لتقليل حجم الملف" - }, - "convert": { - "title": "تحويل" - }, - "attachments": { - "title": "Add attachments" - }, - "extractPages": { - "title": "استخراج الصفحات" - }, - "removePages": { - "title": "إزالة الصفحات", - "desc": "حذف الصفحات غير المرغوب فيها من مستند PDF الخاص بك." - }, - "removeImagePdf": { - "title": "إزالة الصورة", - "desc": "إزالة الصورة من PDF لتقليل حجم الملف" - }, - "autoSizeSplitPDF": { - "title": "تقسيم تلقائي حسب الحجم/العدد", - "desc": "تقسيم ملف PDF واحد إلى مستندات متعددة بناءً على الحجم أو عدد الصفحات أو عدد المستندات" - }, - "adjust-contrast": { - "title": "ضبط الألوان/التباين", - "desc": "ضبط التباين والتشبع والسطوع لملف PDF" - }, - "replaceColorPdf": { - "title": "إستبدال و عكس الألوان", - "desc": "استبدال الألوان للنصوص والخلفيات في المستندات PDF وإلغاء تعكير اللون الكامل للمستند لتقليل حجم الملف" - }, "changePermissions": { - "title": "تغيير الأذونات" + "title": "تغيير الأذونات", + "desc": "تغيير قيود المستند وأذوناته" + }, + "automate": { + "tags": "سير عمل،تسلسل،أتمتة", + "title": "أتمتة", + "desc": "ابنِ تدفّقات عمل متعددة الخطوات بسلسلة إجراءات PDF. مثالي للمهام المتكررة." } }, + "landing": { + "addFiles": "إضافة ملفات", + "uploadFromComputer": "الرفع من الكمبيوتر" + }, "viewPdf": { "tags": "عرض,قراءة,تعليق,نص,صورة", - "title": "View/Edit PDF", + "title": "عرض/تحرير PDF", "header": "عرض PDF" }, "multiTool": { @@ -645,17 +698,29 @@ "merge": { "tags": "دمج,عمليات الصفحة,الخلفية,جانب الخادم", "title": "دمج", - "header": "دمج ملفات PDF متعددة (2+)", - "sortByName": "الترتيب حسب الاسم", - "sortByDate": "الترتيب حسب التاريخ", - "removeCertSign": "إزالة التوقيع الرقمي في الملف المدمج؟", + "removeDigitalSignature.tooltip": { + "title": "إزالة التوقيع الرقمي", + "description": "سيتم إبطال التواقيع الرقمية عند دمج الملفات. حدّد هذا لإزالتها من ملف PDF النهائي." + }, + "generateTableOfContents.tooltip": { + "title": "إنشاء جدول المحتويات", + "description": "ينشئ تلقائيًا جدول محتويات قابلًا للنقر في PDF المدمج استنادًا إلى أسماء الملفات الأصلية وأرقام الصفحات." + }, "submit": "دمج", "sortBy": { - "filename": "اسم الملف" + "description": "سيتم دمج الملفات بترتيب اختيارها. اسحب لإعادة الترتيب أو فرز أدناه.", + "label": "الفرز حسب", + "filename": "اسم الملف", + "dateModified": "تاريخ التعديل", + "ascending": "تصاعدي", + "descending": "تنازلي", + "sort": "فرز" + }, + "error": { + "failed": "حدث خطأ أثناء دمج ملفات PDF." } }, "split": { - "tags": "عمليات الصفحة,تقسيم,صفحات متعددة,قص,جانب الخادم", "title": "تقسيم PDF", "header": "تقسيم PDF", "desc": { @@ -671,25 +736,206 @@ "splitPages": "أدخل الصفحات المراد تقسيمها:", "submit": "تقسيم", "steps": { + "chooseMethod": "اختر الطريقة", "settings": "إعدادات" }, + "settings": { + "selectMethodFirst": "يرجى اختيار طريقة التقسيم أولًا" + }, + "error": { + "failed": "حدث خطأ أثناء تقسيم PDF." + }, + "method": { + "label": "اختر طريقة التقسيم", + "placeholder": "حدّد كيفية تقسيم PDF" + }, "methods": { + "prefix": { + "splitAt": "تقسيم عند", + "splitBy": "تقسيم حسب" + }, + "byPages": { + "name": "أرقام الصفحات", + "desc": "استخراج صفحات محددة (1,3,5-10)", + "tooltip": "أدخل أرقام الصفحات مفصولة بفواصل أو نطاقات بشرطة" + }, + "bySections": { + "name": "الأقسام", + "desc": "تقسيم الصفحات إلى أقسام شبكية", + "tooltip": "قسّم كل صفحة إلى أقسام أفقية ورأسية" + }, "bySize": { - "name": "حجم الملف" + "name": "حجم الملف", + "desc": "تحديد الحد الأقصى لحجم الملف", + "tooltip": "حدّد أقصى حجم للملف (مثل 10MB، 500KB)" + }, + "byPageCount": { + "name": "عدد الصفحات", + "desc": "عدد ثابت من الصفحات لكل ملف", + "tooltip": "أدخل عدد الصفحات لكل ملف مقسّم" + }, + "byDocCount": { + "name": "عدد المستندات", + "desc": "إنشاء عدد محدد من الملفات", + "tooltip": "أدخل عدد الملفات التي تريد إنشاءها" + }, + "byChapters": { + "name": "الفصول", + "desc": "التقسيم عند حدود الإشارات المرجعية", + "tooltip": "يستخدم إشارات PDF المرجعية لتحديد نقاط التقسيم" + }, + "byPageDivider": { + "name": "فاصل الصفحات", + "desc": "تقسيم تلقائي باستخدام أوراق فاصلة", + "tooltip": "استخدم أوراق فواصل برمز QR بين المستندات عند المسح" } }, "value": { "fileSize": { - "label": "حجم الملف" + "label": "حجم الملف", + "placeholder": "مثال: 10MB، 500KB" + }, + "pageCount": { + "label": "صفحات لكل ملف", + "placeholder": "مثال: 5، 10" + }, + "docCount": { + "label": "عدد الملفات", + "placeholder": "مثال: 3، 5" + } + }, + "tooltip": { + "header": { + "title": "نظرة عامة على طرق التقسيم" + }, + "byPages": { + "title": "التقسيم عند أرقام الصفحات", + "text": "قسّم ملفك عند أرقام صفحات محددة. استخدام 'n' يقسم بعد الصفحة n. استخدام 'n-m' يقسم قبل n وبعد m.", + "bullet1": "نقاط تقسيم مفردة: 3,7 (يقسم بعد الصفحتين 3 و7)", + "bullet2": "نقاط تقسيم بالنطاق: 3-8 (يقسم قبل الصفحة 3 وبعد الصفحة 8)", + "bullet3": "مختلط: 2,5-10,15 (يقسم بعد 2، قبل 5، بعد 10، وبعد 15)" + }, + "bySections": { + "title": "التقسيم حسب الأقسام الشبكية", + "text": "قسّم كل صفحة إلى شبكة من الأقسام. مفيد للمستندات متعددة الأعمدة أو لاستخراج مناطق محددة.", + "bullet1": "أفقي: عدد الصفوف المطلوب إنشاؤها", + "bullet2": "رأسي: عدد الأعمدة المطلوب إنشاؤها", + "bullet3": "دمج: جمع جميع الأقسام في ملف PDF واحد" + }, + "bySize": { + "title": "التقسيم حسب حجم الملف", + "text": "أنشئ عدة ملفات PDF لا تتجاوز حجمًا محددًا. مثالي لقيود الحجم أو مرفقات البريد.", + "bullet1": "استخدم MB للملفات الكبيرة (مثل 10MB)", + "bullet2": "استخدم KB للملفات الصغيرة (مثل 500KB)", + "bullet3": "سيتم التقسيم عند حدود الصفحات" + }, + "byCount": { + "title": "التقسيم حسب العدد", + "text": "أنشئ عدة ملفات PDF بعدد محدد من الصفحات أو المستندات لكلٍ منها.", + "bullet1": "عدد الصفحات: عدد ثابت من الصفحات لكل ملف", + "bullet2": "عدد المستندات: عدد ثابت من ملفات الإخراج", + "bullet3": "مفيد لتدفّقات المعالجة الدُّفعية" + }, + "byChapters": { + "title": "التقسيم حسب الفصول", + "text": "استخدم إشارات PDF المرجعية للتقسيم تلقائيًا عند حدود الفصول. يتطلب ملفات PDF تحتوي على بنية إشارات مرجعية.", + "bullet1": "مستوى الإشارة المرجعية: المستوى الذي سيتم التقسيم عنده (1 = المستوى الأعلى)", + "bullet2": "تضمين البيانات الوصفية: الحفاظ على خصائص المستند", + "bullet3": "السماح بالتكرارات: معالجة أسماء الإشارات المرجعية المكررة" } } }, "rotate": { - "tags": "جانب الخادم", "title": "تدوير PDF", - "header": "تدوير PDF", - "selectAngle": "حدد زاوية الدوران (بمضاعفات 90 درجة):", - "submit": "تدوير" + "submit": "تدوير", + "error": { + "failed": "حدث خطأ أثناء تدوير PDF." + }, + "preview": { + "title": "معاينة التدوير" + }, + "rotateLeft": "تدوير عكس عقارب الساعة", + "rotateRight": "تدوير مع عقارب الساعة", + "tooltip": { + "header": { + "title": "نظرة عامة على إعدادات التدوير" + }, + "description": { + "text": "دوّر صفحات PDF بزيادات 90 درجة مع أو عكس عقارب الساعة. سيتم تدوير كل الصفحات. تعرض المعاينة شكل المستند بعد التدوير." + }, + "controls": { + "title": "عناصر التحكم", + "text": "استخدم أزرار التدوير لضبط الاتجاه. الزر الأيسر يدور عكس عقارب الساعة، والأيمن مع عقارب الساعة. كل نقرة تدور 90 درجة." + } + } + }, + "convert": { + "title": "تحويل", + "desc": "حوّل الملفات بين صيغ مختلفة", + "files": "الملفات", + "selectFilesPlaceholder": "حدّد الملفات في العرض الرئيسي للبدء", + "settings": "إعدادات", + "conversionCompleted": "اكتمل التحويل", + "results": "النتائج", + "defaultFilename": "converted_file", + "conversionResults": "نتائج التحويل", + "convertFrom": "التحويل من", + "convertTo": "التحويل إلى", + "sourceFormatPlaceholder": "صيغة المصدر", + "targetFormatPlaceholder": "صيغة الهدف", + "selectSourceFormatFirst": "حدّد أولًا صيغة المصدر", + "outputOptions": "خيارات الناتج", + "pdfOptions": "خيارات PDF", + "imageOptions": "خيارات الصور", + "colorType": "نوع اللون", + "color": "لون", + "greyscale": "تدرج الرمادي", + "blackwhite": "أبيض وأسود", + "dpi": "DPI", + "output": "الناتج", + "single": "مفرد", + "multiple": "متعدد", + "fitOption": "خيار الملاءمة", + "maintainAspectRatio": "الحفاظ على نسبة العرض إلى الارتفاع", + "fitDocumentToPage": "ملاءمة المستند للصفحة", + "fillPage": "ملء الصفحة", + "autoRotate": "تدوير تلقائي", + "autoRotateDescription": "تدوير الصور تلقائيًا لتناسب صفحة PDF بشكل أفضل", + "combineImages": "دمج الصور", + "combineImagesDescription": "ادمج جميع الصور في ملف PDF واحد، أو أنشئ ملفات PDF منفصلة لكل صورة", + "webOptions": "خيارات الويب إلى PDF", + "zoomLevel": "مستوى التكبير", + "emailOptions": "خيارات البريد إلى PDF", + "includeAttachments": "تضمين مرفقات البريد", + "maxAttachmentSize": "الحد الأقصى لحجم المرفق (MB)", + "includeAllRecipients": "تضمين مستلمي CC وBCC في الترويسة", + "downloadHtml": "تنزيل ملف HTML الوسيط بدلًا من PDF", + "pdfaOptions": "خيارات PDF/A", + "outputFormat": "صيغة الناتج", + "pdfaNote": "‏PDF/A-1b أكثر توافقًا، وPDF/A-2b يدعم مزيدًا من الميزات.", + "pdfaDigitalSignatureWarning": "يحتوي PDF على توقيع رقمي. سيتم إزالة هذا في الخطوة التالية.", + "fileFormat": "صيغة الملف", + "wordDoc": "مستند Word", + "wordDocExt": "مستند Word (.docx)", + "odtExt": "نص OpenDocument (.odt)", + "pptExt": "PowerPoint (.pptx)", + "odpExt": "عرض OpenDocument (.odp)", + "txtExt": "نص عادي (.txt)", + "rtfExt": "Rich Text Format (.rtf)", + "selectedFiles": "الملفات المحددة", + "noFileSelected": "لا يوجد ملف محدد. استخدم لوحة الملفات لإضافة ملفات.", + "convertFiles": "تحويل الملفات", + "converting": "جارٍ التحويل...", + "downloadConverted": "تنزيل الملف المحوّل", + "errorNoFiles": "يرجى اختيار ملف واحد على الأقل للتحويل.", + "errorNoFormat": "يرجى اختيار صيغتَي المصدر والهدف.", + "errorNotSupported": "التحويل من {{from}} إلى {{to}} غير مدعوم.", + "images": "الصور", + "officeDocs": "مستندات Office (Word, Excel, PowerPoint)", + "imagesExt": "صور (JPG, PNG، إلخ.)", + "markdown": "Markdown", + "textRtf": "نص/RTF", + "grayscale": "تدرج الرمادي" }, "imageToPdf": { "tags": "تحويل,صورة,jpg,صورة,صورة فوتوغرافية" @@ -727,7 +973,20 @@ "8": "إزالة الأخير", "9": "إزالة", "10": "دمج فردي-زوجي", - "11": "Duplicate all pages" + "11": "تكرار كل الصفحات" + }, + "desc": { + "CUSTOM": "استخدم تسلسلًا مخصصًا لأرقام الصفحات أو التعابير لتعريف ترتيب جديد.", + "REVERSE_ORDER": "عكس ترتيب المستند بحيث تصبح الصفحة الأخيرة أولى وهكذا.", + "DUPLEX_SORT": "تشابك الواجهات ثم الخلفيات كما لو أن ماسحًا مزدوجًا مسح كل الواجهات ثم كل الخلفيات (1، n، 2، n-1، …).", + "BOOKLET_SORT": "ترتيب الصفحات لطباعة الكتيّب (الأخيرة، الأولى، الثانية، قبل الأخيرة، …).", + "SIDE_STITCH_BOOKLET_SORT": "ترتيب الصفحات لطباعة كتيّب بخياطة جانبية (محسّن للتجليد من الجانب).", + "ODD_EVEN_SPLIT": "تقسيم المستند إلى مخرجيْن: كل الصفحات الفردية وكل الصفحات الزوجية.", + "ODD_EVEN_MERGE": "دمج ملفي PDF بالتناوب: الصفحات الفردية من الأول، والزوجية من الثاني.", + "DUPLICATE": "تكرار كل صفحة بحسب عدد الترتيب المخصص (مثلًا 4 نسخ لكل صفحة ×4).", + "REMOVE_FIRST": "إزالة الصفحة الأولى من المستند.", + "REMOVE_LAST": "إزالة الصفحة الأخيرة من المستند.", + "REMOVE_FIRST_AND_LAST": "إزالة الصفحتين الأولى والأخيرة من المستند." }, "placeholder": "(مثال: 1,3,2 أو 4-8,2,10-12 أو 2n-1)" }, @@ -739,33 +998,190 @@ "upload": "إضافة صورة", "submit": "إضافة صورة" }, + "attachments": { + "tags": "embed,attach,file,attachment,attachments", + "title": "Add attachments", + "header": "Add attachments", + "add": "إضافة مرفق", + "remove": "إزالة المرفق", + "embed": "تضمين مرفق", + "submit": "Add attachments" + }, "watermark": { - "tags": "نص,تكرار,تسمية,خاص,حقوق النشر,علامة تجارية,صورة,jpg,صورة,صورة فوتوغرافية", "title": "إضافة علامة مائية", - "header": "إضافة علامة مائية", - "customColor": "لون نص مخصص", - "selectText": { - "1": "حدد PDF لإضافة العلامة المائية إليه:", - "2": "نص العلامة المائية:", - "3": "حجم الخط:", - "4": "دوران (0-360):", - "5": "المباعدة الأفقية (مسافة بين كل علامة مائية أفقيًا):", - "6": "المباعدة العمودية (مسافة بين كل علامة مائية عموديًا):", - "7": "الشفافية (0٪ - 100٪):", - "8": "نوع العلامة المائية:", - "9": "صورة العلامة المائية:", - "10": "تحويل PDF إلى صورة PDF" - }, + "desc": "أضف علامات مائية نصية أو صورية إلى ملفات PDF", + "completed": "تمت إضافة العلامة المائية", "submit": "إضافة علامة مائية", - "type": { - "1": "نص", - "2": "صورة" + "filenamePrefix": "watermarked", + "error": { + "failed": "حدث خطأ أثناء إضافة العلامة المائية إلى PDF." }, "watermarkType": { - "text": "نص" + "text": "نص", + "image": "صورة" }, "settings": { - "fontSize": "حجم الخط" + "type": "نوع العلامة المائية", + "text": { + "label": "نص العلامة المائية", + "placeholder": "أدخل نص العلامة المائية" + }, + "image": { + "label": "صورة العلامة المائية", + "choose": "اختر صورة", + "selected": "المحدّد: {{filename}}" + }, + "fontSize": "حجم الخط", + "size": "الحجم", + "alphabet": "الخط/اللغة", + "color": "لون العلامة المائية", + "rotation": "الدوران (بالدرجات)", + "opacity": "الشفافية (%)", + "spacing": { + "horizontal": "التباعد الأفقي", + "vertical": "التباعد الرأسي" + }, + "convertToImage": "تسطيح صفحات PDF إلى صور" + }, + "alphabet": { + "roman": "اللاتينية/الرومانية", + "arabic": "العربية", + "japanese": "اليابانية", + "korean": "الكورية", + "chinese": "الصينية", + "thai": "التايلاندية" + }, + "steps": { + "type": "نوع العلامة المائية", + "wording": "الصياغة", + "textStyle": "النمط", + "formatting": "التنسيق", + "file": "ملف العلامة المائية" + }, + "results": { + "title": "نتائج العلامة المائية" + }, + "tooltip": { + "language": { + "title": "دعم اللغة", + "text": "اختر إعداد اللغة المناسب لضمان عرض صحيح للخطوط في نصك." + }, + "appearance": { + "title": "إعدادات المظهر", + "text": "تحكم في مظهر علامتك المائية وكيف تمتزج مع المستند.", + "bullet1": "الدوران: من -360° إلى 360° لوضع العلامة بزاوية", + "bullet2": "الشفافية: 0-100% للتحكم في الشفافية", + "bullet3": "الشفافية الأقل تنتج علامات مائية أكثر لطفًا" + }, + "spacing": { + "title": "التحكم في التباعد", + "text": "اضبط التباعد بين العلامات المائية المتكررة عبر الصفحة.", + "bullet1": "تباعد العرض: المسافة الأفقية بين العلامات", + "bullet2": "تباعد الارتفاع: المسافة الرأسية بين العلامات", + "bullet3": "القيم الأعلى تخلق نمطًا أكثر تفرّقًا" + }, + "type": { + "header": { + "title": "اختيار نوع العلامة المائية" + }, + "description": { + "title": "اختر علامتك المائية", + "text": "اختر بين علامات مائية نصية أو صورية حسب احتياجاتك." + }, + "text": { + "title": "علامات مائية نصية", + "text": "مثالية لإضافة إشعارات حقوق النشر أو أسماء الشركات أو ملصقات السرية. تدعم لغات متعددة وألوانًا مخصّصة.", + "bullet1": "خطوط ولغات قابلة للتخصيص", + "bullet2": "ألوان وشفافية قابلة للضبط", + "bullet3": "مثالية للنصوص القانونية أو الخاصة بالعلامة التجارية" + }, + "image": { + "title": "علامات مائية صورية", + "text": "استخدم الشعارات أو الأختام أو أي صورة كعلامة مائية. رائع للعلامة التجارية والتعرّف البصري.", + "bullet1": "ارفع أي صيغة صورة", + "bullet2": "تحافظ على جودة الصورة", + "bullet3": "مثالية للشعارات والأختام" + } + }, + "wording": { + "header": { + "title": "محتوى النص" + }, + "text": { + "title": "نص العلامة المائية", + "text": "أدخل النص الذي سيظهر كعلامة مائية عبر المستند.", + "bullet1": "اجعله موجزًا لقراءة أفضل", + "bullet2": "أمثلة شائعة: 'CONFIDENTIAL'، 'DRAFT'، اسم الشركة", + "bullet3": "الرموز التعبيرية غير مدعومة وسيتم حذفها" + } + }, + "textStyle": { + "header": { + "title": "نمط النص" + }, + "color": { + "title": "اختيار اللون", + "text": "اختر لونًا يوفّر تباينًا جيدًا مع محتوى مستندك.", + "bullet1": "رمادي فاتح (#d3d3d3) لعلامات مائية خفيفة", + "bullet2": "أسود أو ألوان داكنة لتباين عالٍ", + "bullet3": "ألوان مخصّصة لأغراض الهوية البصرية" + }, + "language": { + "title": "دعم اللغة", + "text": "اختر إعداد اللغة المناسب لضمان عرض صحيح للخطوط." + } + }, + "file": { + "header": { + "title": "رفع الصورة" + }, + "upload": { + "title": "اختيار الصورة", + "text": "ارفع ملف صورة لاستخدامه كعلامة مائية.", + "bullet1": "يدعم الصيغ الشائعة: PNG, JPG, GIF, BMP", + "bullet2": "‏PNG مع شفافية هو الأفضل", + "bullet3": "الصور عالية الدقة تحافظ على الجودة بشكل أفضل" + }, + "recommendations": { + "title": "أفضل الممارسات", + "text": "نصائح للحصول على أفضل نتائج للعلامات المائية الصورية.", + "bullet1": "استخدم شعارات أو أختام بخلفيات شفافة", + "bullet2": "التصاميم البسيطة تعمل أفضل من الصور المعقّدة", + "bullet3": "ضع في الاعتبار حجم المستند النهائي عند اختيار الدقة" + } + }, + "formatting": { + "header": { + "title": "التنسيق والتخطيط" + }, + "size": { + "title": "التحكم في الحجم", + "text": "اضبط حجم العلامة المائية (نص أو صورة).", + "bullet1": "الأحجام الأكبر تنتج علامات أكثر بروزًا" + }, + "appearance": { + "title": "إعدادات المظهر", + "text": "تحكم في مظهر علامتك المائية وكيف تمتزج مع المستند.", + "bullet1": "الدوران: من -360° إلى 360° لوضع العلامات بزاوية", + "bullet2": "الشفافية: 0-100% للتحكم في الشفافية", + "bullet3": "الشفافية الأقل تنتج علامات مائية أكثر لطفًا" + }, + "spacing": { + "title": "التحكم في التباعد", + "text": "اضبط التباعد بين العلامات المائية المتكررة عبر الصفحة.", + "bullet1": "التباعد الأفقي: المسافة بين العلامات من اليسار إلى اليمين", + "bullet2": "التباعد الرأسي: المسافة بين العلامات من الأعلى إلى الأسفل", + "bullet3": "القيم الأعلى تخلق نمطًا أكثر تفرّقًا" + }, + "security": { + "title": "خيار الأمان", + "text": "حوّل PDF النهائي إلى صيغة قائمة على الصور لتعزيز الأمان.", + "bullet1": "يمنع تحديد النص ونسخه", + "bullet2": "يجعل إزالة العلامات المائية أصعب", + "bullet3": "ينتج ملفات أكبر حجمًا", + "bullet4": "أفضل للمحتوى الحساس أو المحمي بحقوق" + } + } } }, "permissions": { @@ -790,50 +1206,148 @@ "removePages": { "tags": "إزالة الصفحات,حذف الصفحات", "title": "إزالة الصفحات", + "pageNumbers": { + "label": "الصفحات المراد إزالتها", + "placeholder": "مثال: 1,3,5-8,10", + "error": "صيغة أرقام الصفحات غير صالحة. استخدم الأرقام أو النطاقات (1-5) أو التعابير الرياضية (2n+1)" + }, + "filenamePrefix": "pages_removed", + "files": { + "placeholder": "حدّد ملف PDF في العرض الرئيسي للبدء" + }, + "settings": { + "title": "الإعدادات" + }, + "tooltip": { + "header": { + "title": "إعدادات إزالة الصفحات" + }, + "pageNumbers": { + "title": "اختيار الصفحات", + "text": "حدّد الصفحات التي تريد إزالتها من PDF. يمكنك اختيار صفحات فردية أو نطاقات أو استخدام تعابير رياضية.", + "bullet1": "صفحات فردية: 1,3,5 (يزيل الصفحات 1 و3 و5)", + "bullet2": "نطاقات صفحات: 1-5,10-15 (يزيل الصفحات 1-5 و10-15)", + "bullet3": "رياضي: 2n+1 (يزيل الصفحات الفردية)", + "bullet4": "نطاقات مفتوحة: 5- (يزيل من الصفحة 5 حتى النهاية)" + }, + "examples": { + "title": "أمثلة شائعة", + "text": "فيما يلي بعض أنماط اختيار الصفحات الشائعة:", + "bullet1": "إزالة الصفحة الأولى: 1", + "bullet2": "إزالة آخر 3 صفحات: -3", + "bullet3": "إزالة كل صفحة أخرى: 2n", + "bullet4": "إزالة صفحات متفرقة محددة: 1,5,10,15" + }, + "safety": { + "title": "نصائح الأمان", + "text": "اعتبارات مهمة عند إزالة الصفحات:", + "bullet1": "عاين اختيارك دائمًا قبل المعالجة", + "bullet2": "احتفظ بنسخة احتياطية من ملفك الأصلي", + "bullet3": "ترقيم الصفحات يبدأ من 1 وليس 0", + "bullet4": "سيتم تجاهل أرقام الصفحات غير الصالحة" + } + }, + "error": { + "failed": "حدث خطأ أثناء إزالة الصفحات." + }, + "results": { + "title": "نتائج إزالة الصفحات" + }, "submit": "إزالة الصفحات" }, - "addPassword": { - "tags": "تأمين,أمان", - "title": "إضافة كلمة مرور", - "header": "إضافة كلمة مرور (تشفير)", - "selectText": { - "1": "حدد ملف PDF للتشفير", - "2": "كلمة المرور", - "3": "طول مفتاح التشفير", - "4": "القيم الأعلى تكون أقوى، لكن القيم الأقل لها توافق أفضل.", - "5": "أذونات للتعيين", - "6": "منع تجميع المستند", - "7": "منع استخراج المحتوى", - "8": "منع الاستخراج للوصول", - "9": "منع ملء النموذج", - "10": "منع التعديل", - "11": "منع تعديل التعليقات التوضيحية", - "12": "منع الطباعة", - "13": "منع طباعة تنسيقات مختلفة", - "14": "كلمة مرور المالك", - "15": "يقيد ما يمكن القيام به بالمستند بمجرد فتحه (غير مدعوم من قبل جميع القراء)", - "16": "يقيد فتح المستند نفسه" - }, - "submit": "تشفير", + "pageSelection": { "tooltip": { - "permissions": { - "title": "تغيير الأذونات" + "header": { + "title": "دليل اختيار الصفحات" + }, + "basic": { + "title": "الاستخدام الأساسي", + "text": "حدّد صفحات معينة من مستند PDF باستخدام صياغة بسيطة.", + "bullet1": "صفحات فردية: 1,3,5", + "bullet2": "نطاقات صفحات: 3-6 أو 10-15", + "bullet3": "كل الصفحات: all" + }, + "advanced": { + "title": "ميزات متقدمة" + }, + "tips": { + "title": "نصائح", + "text": "ضع هذه الإرشادات في الاعتبار:", + "bullet1": "ترقيم الصفحات يبدأ من 1 (ليس 0)", + "bullet2": "تُزال المسافات تلقائيًا", + "bullet3": "تُتجاهل التعابير غير الصالحة" + }, + "syntax": { + "title": "أساسيات الصياغة", + "text": "استخدم الأرقام والنطاقات والكلمات المفتاحية والتتابعات (تبدأ n من 0). الأقواس مدعومة.", + "bullets": { + "numbers": "الأرقام/النطاقات: 5، 10-20", + "keywords": "الكلمات المفتاحية: odd, even", + "progressions": "التتابعات: 3n، 4n+1" + } + }, + "operators": { + "title": "العوامل", + "text": "للـ AND أسبقية أعلى من الفاصلة. ينطبق NOT ضمن نطاق المستند.", + "and": "AND: & أو \"and\" — يتطلب الشرطين معًا (مثال: 1-50 & even)", + "comma": "Comma: , أو | — دمج التحديدات (مثال: 1-10, 20)", + "not": "NOT: ! أو \"not\" — استبعاد الصفحات (مثال: 3n & not 30)" + }, + "examples": { + "title": "أمثلة" } } }, - "removePassword": { - "tags": "تأمين,فك التشفير,أمان,إزالة كلمة المرور,حذف كلمة المرور", - "title": "إزالة كلمة المرور", - "header": "إزالة كلمة المرور (فك التشفير)", - "selectText": { - "1": "حدد PDF لفك التشفير", - "2": "كلمة المرور" + "bulkSelection": { + "header": { + "title": "دليل اختيار الصفحات" }, - "submit": "إزالة", - "desc": "إزالة الحماية بكلمة مرور من مستند PDF الخاص بك.", - "password": { - "stepTitle": "إزالة كلمة المرور", - "label": "كلمة المرور الحالية" + "syntax": { + "title": "أساسيات الصياغة", + "text": "استخدم الأرقام والنطاقات والكلمات والتقدّمات (n تبدأ من 0). الأقواس مدعومة.", + "bullets": { + "numbers": "الأرقام/النطاقات: 5, 10-20", + "keywords": "الكلمات: odd, even", + "progressions": "التقدّم: 3n, 4n+1" + } + }, + "operators": { + "title": "العوامل", + "text": "AND له أسبقية أعلى من الفاصلة. يتم تطبيق NOT داخل نطاق المستند.", + "and": "AND: & أو \"and\" — يتطلب الشرطين معًا (مثال: 1-50 & even)", + "comma": "الفاصلة: , أو | — دمج الاختيارات (مثال: 1-10, 20)", + "not": "NOT: ! أو \"not\" — استبعاد صفحات (مثال: 3n & not 30)" + }, + "examples": { + "title": "أمثلة", + "first50": "أول 50", + "last50": "آخر 50", + "every3rd": "كل ثالثة", + "oddWithinExcluding": "الفردية ضمن 1-20 باستثناء 5-7", + "combineSets": "اجمع المجموعات" + }, + "firstNPages": { + "title": "أول N صفحة", + "placeholder": "عدد الصفحات" + }, + "lastNPages": { + "title": "آخر N صفحة", + "placeholder": "عدد الصفحات" + }, + "everyNthPage": { + "title": "كل N صفحة", + "placeholder": "حجم الخطوة" + }, + "range": { + "title": "نطاق", + "fromPlaceholder": "من", + "toPlaceholder": "إلى" + }, + "keywords": { + "title": "كلمات مفتاحية" + }, + "advanced": { + "title": "متقدم" } }, "compressPdfs": { @@ -841,30 +1355,143 @@ }, "unlockPDFForms": { "tags": "remove,delete,form,field,readonly", - "title": "Remove Read-Only from Form Fields", - "header": "Unlock PDF Forms", - "submit": "Remove" + "title": "إزالة خاصية القراءة فقط من حقول النماذج", + "header": "إلغاء قفل نماذج PDF", + "submit": "Remove", + "description": "ستزيل هذه الأداة قيود القراءة فقط من حقول نماذج PDF، لتصبح قابلة للتحرير والملء.", + "filenamePrefix": "unlocked_forms", + "files": { + "placeholder": "حدّد ملف PDF في العرض الرئيسي للبدء" + }, + "error": { + "failed": "حدث خطأ أثناء إلغاء قفل نماذج PDF." + }, + "results": { + "title": "نتائج قفل النماذج" + } }, "changeMetadata": { - "tags": "عنوان,مؤلف,تاريخ,إنشاء,وقت,ناشر,منتج,إحصائيات", - "title": "العنوان:", "header": "تغيير البيانات الوصفية", - "selectText": { - "1": "يرجى تعديل المتغيرات التي ترغب في تغييرها", - "2": "حذف كل البيانات الأولية", - "3": "إظهار البيانات الأولية المخصصة:", - "4": "بيانات وصفية أخرى:", - "5": "إضافة إدخال بيانات أولية مخصص" + "submit": "تغيير", + "filenamePrefix": "بيانات_وصفية", + "settings": { + "title": "إعدادات البيانات الوصفية" }, - "author": "المؤلف:", - "creationDate": "تاريخ الإنشاء (yyyy/MM/dd HH:mm:ss):", - "creator": "المنشئ:", - "keywords": "الكلمات الرئيسية:", - "modDate": "تاريخ التعديل (yyyy/MM/dd HH:mm:ss):", - "producer": "المنتج:", - "subject": "الموضوع:", - "trapped": "محاصر:", - "submit": "تغيير" + "standardFields": { + "title": "الحقول القياسية" + }, + "deleteAll": { + "label": "إزالة البيانات الوصفية الحالية", + "checkbox": "حذف كل البيانات الوصفية" + }, + "title": { + "label": "العنوان", + "placeholder": "عنوان المستند" + }, + "author": { + "label": "المؤلف", + "placeholder": "مؤلف المستند" + }, + "subject": { + "label": "الموضوع", + "placeholder": "موضوع المستند" + }, + "keywords": { + "label": "الكلمات المفتاحية", + "placeholder": "كلمات مفتاحية للمستند" + }, + "creator": { + "label": "المنشئ", + "placeholder": "منشئ المستند" + }, + "producer": { + "label": "المنتِج", + "placeholder": "منتِج المستند" + }, + "dates": { + "title": "حقول التاريخ" + }, + "creationDate": { + "label": "تاريخ الإنشاء", + "placeholder": "تاريخ الإنشاء" + }, + "modificationDate": { + "label": "تاريخ التعديل", + "placeholder": "تاريخ التعديل" + }, + "trapped": { + "label": "حالة Trapped", + "unknown": "غير معروف", + "true": "صحيح", + "false": "خطأ" + }, + "advanced": { + "title": "خيارات متقدمة" + }, + "customFields": { + "title": "بيانات وصفية مخصّصة", + "description": "أضف حقول بيانات وصفية مخصّصة للمستند", + "add": "إضافة حقل", + "key": "المفتاح", + "keyPlaceholder": "مفتاح مخصّص", + "value": "القيمة", + "valuePlaceholder": "قيمة مخصّصة", + "remove": "إزالة" + }, + "results": { + "title": "ملفات PDF المحدّثة" + }, + "error": { + "failed": "حدث خطأ أثناء تغيير بيانات PDF الوصفية." + }, + "tooltip": { + "header": { + "title": "نظرة عامة على بيانات PDF الوصفية" + }, + "standardFields": { + "title": "الحقول القياسية", + "text": "حقول بيانات وصفية شائعة لـ PDF تصف المستند.", + "bullet1": "العنوان: اسم المستند أو ترويسته", + "bullet2": "المؤلف: من أنشأ المستند", + "bullet3": "الموضوع: وصف موجز للمحتوى", + "bullet4": "الكلمات المفتاحية: مصطلحات البحث", + "bullet5": "المنشئ/المنتِج: البرمجيات المستخدمة لإنشاء PDF" + }, + "dates": { + "title": "حقول التاريخ", + "text": "متى تم إنشاء المستند وتعديله.", + "bullet1": "تاريخ الإنشاء: وقت إنشاء المستند الأصلي", + "bullet2": "تاريخ التعديل: وقت آخر تعديل" + }, + "options": { + "title": "خيارات إضافية", + "text": "حقول مخصّصة وعناصر للتحكم في الخصوصية.", + "bullet1": "بيانات مخصّصة: أضف حقولك الخاصة", + "bullet2": "حالة التجهيز: إعداد الطباعة عالية الجودة", + "bullet3": "حذف الكل: إزالة كل البيانات للخصوصية" + }, + "deleteAll": { + "title": "إزالة البيانات الوصفية الحالية", + "text": "حذف كامل للبيانات الوصفية لضمان الخصوصية." + }, + "customFields": { + "title": "بيانات وصفية مخصّصة", + "text": "أضف أزواج مفتاح-قيمة مخصّصة.", + "bullet1": "أضف أي حقول مخصّصة ذات صلة بمستندك", + "bullet2": "أمثلة: القسم، المشروع، الإصدار، الحالة", + "bullet3": "كل إدخال يتطلب مفتاحًا وقيمة" + }, + "advanced": { + "title": "خيارات متقدمة", + "trapped": { + "title": "حالة التجهيز للطباعة", + "description": "يشير إلى ما إذا كان المستند مُحضّرًا للطباعة عالية الجودة.", + "bullet1": "True: تم تجهيز المستند للطباعة عالية الجودة", + "bullet2": "False: لم يتم تجهيز المستند", + "bullet3": "Unknown: لم يُذكر وضع التجهيز" + } + } + } }, "fileToPDF": { "tags": "تحويل,تنسيق,مستند,صورة,شريحة,نص,تحويل,مكتب,مستندات,وورد,إكسل,باوربوينت", @@ -878,6 +1505,7 @@ "ocr": { "tags": "تعرف,نص,صورة,مسح,قراءة,تحديد,كشف,قابل للتحرير", "title": "التعرف الضوئي على الحروف / تنظيف المسح الضوئي", + "desc": "يقوم برنامج التنظيف بمسح واكتشاف النص من الصور داخل ملف PDF ويعيد إضافته كنص", "header": "مسح المسح الضوئي / التعرف الضوئي على الحروف (OCR)", "selectText": { "1": "حدد اللغات التي سيتم اكتشافها داخل ملف PDF (اللغات المدرجة هي تلك التي تم اكتشافها حاليًا):", @@ -896,22 +1524,85 @@ "help": "يرجى قراءة هذه الوثائق حول كيفية استخدام هذا للغات أخرى و/أو الاستخدام ليس في Docker", "credit": "تستخدم هذه الخدمة qpdf و Tesseract للتعرف الضوئي على الحروف.", "submit": "معالجة PDF باستخدام OCR", - "desc": "يقوم برنامج التنظيف بمسح واكتشاف النص من الصور داخل ملف PDF ويعيد إضافته كنص", + "operation": { + "submit": "معالجة OCR ومراجعة" + }, + "results": { + "title": "نتائج OCR" + }, + "languagePicker": { + "additionalLanguages": "تبحث عن لغات إضافية؟", + "viewSetupGuide": "عرض دليل الإعداد →" + }, "settings": { "title": "إعدادات", "ocrMode": { - "label": "وضع التعرف الضوئي على الحروف" + "label": "وضع التعرف الضوئي على الحروف", + "auto": "تلقائي (تخطي طبقات النص)", + "force": "إجباري (إعادة OCR لكل الصفحات واستبدال النص)", + "strict": "صارم (إلغاء إذا وُجد نص)" }, "languages": { - "label": "اللغات" + "label": "اللغات", + "placeholder": "اختر اللغات" + }, + "compatibilityMode": { + "label": "وضع التوافق" + }, + "advancedOptions": { + "label": "خيارات المعالجة", + "sidecar": "إنشاء ملف نصي", + "deskew": "تصحيح ميل الصفحات", + "clean": "تنظيف ملف الإدخال", + "cleanFinal": "تنظيف الناتج النهائي" } }, "tooltip": { + "header": { + "title": "نظرة عامة على إعدادات OCR" + }, "mode": { - "title": "وضع التعرف الضوئي على الحروف" + "title": "وضع التعرف الضوئي على الحروف", + "text": "التعرّف البصري على الحروف (OCR) يساعدك على تحويل الصفحات الممسوحة أو المصوّرة إلى نص يمكنك البحث فيه أو نسخه أو تمييزه.", + "bullet1": "التلقائي يتخطى الصفحات التي تحتوي بالفعل على طبقات نص.", + "bullet2": "الإجباري يعيد OCR لكل صفحة ويستبدل كل النص.", + "bullet3": "الصارم يوقف التنفيذ إذا عُثر على أي نص قابل للتحديد." }, "languages": { - "title": "اللغات" + "title": "اللغات", + "text": "حسّن دقة OCR بتحديد اللغات المتوقعة. اختر لغة أو أكثر لتوجيه الاكتشاف." + }, + "output": { + "title": "الناتج", + "text": "قرّر كيف تريد تنسيق ناتج النص:", + "bullet1": "PDF قابل للبحث يضمّن النص خلف الصورة الأصلية.", + "bullet2": "HOCR XML يُرجع ملفًا مُنظّمًا قابلًا للقراءة آليًا.", + "bullet3": "الملف النصي العادي ينشئ ملف .txt منفصلًا بالمحتوى الخام." + }, + "advanced": { + "header": { + "title": "معالجة OCR المتقدمة" + }, + "compatibility": { + "title": "وضع التوافق", + "text": "يستخدم وضع OCR 'sandwich PDF': ينتج ملفات أكبر، لكنه أكثر موثوقية مع بعض اللغات وبرامج PDF القديمة. افتراضيًا نستخدم hOCR لملفات PDF أصغر وحديثة." + }, + "sidecar": { + "title": "إنشاء ملف نصي", + "text": "ينشئ ملف .txt منفصلًا بجانب PDF يحتوي على كل النص المستخرج للوصول والمعالجة بسهولة." + }, + "deskew": { + "title": "تصحيح الميل", + "text": "يصحّح الصفحات المائلة تلقائيًا لتحسين دقة OCR. مفيد للمستندات الممسوحة غير المحاذاة تمامًا." + }, + "clean": { + "title": "تنظيف ملف الإدخال", + "text": "يقوم بتهيئة الإدخال بإزالة الضوضاء وتعزيز التباين وتحسين الصورة للتعرّف الأفضل بواسطة OCR قبل المعالجة." + }, + "cleanFinal": { + "title": "تنظيف الناتج النهائي", + "text": "يعالج ملف PDF النهائي بإزالة شوائب OCR وتحسين طبقة النص لقراءة أفضل وحجم أصغر." + } } } }, @@ -921,7 +1612,13 @@ "header": "استخراج الصور", "selectText": "حدد تنسيق الصورة لتحويل الصور المستخرجة إليه", "allowDuplicates": "حفظ الصور المكررة", - "submit": "استخراج" + "submit": "استخراج", + "settings": { + "title": "الإعدادات" + }, + "error": { + "failed": "حدث خطأ أثناء استخراج الصور من PDF." + } }, "pdfToPDFA": { "tags": "أرشيف,طويل الأجل,معيار,تحويل,تخزين,حفظ", @@ -993,64 +1690,215 @@ }, "info": "Python غير مثبت. مطلوب للتشغيل." }, + "scannerImageSplit": { + "title": "الصور المُستخرجة", + "submit": "استخراج صور المسح", + "error": { + "failed": "حدث خطأ أثناء استخراج صور المسح." + }, + "tooltip": { + "title": "أداة تقسيم الصور", + "whatThisDoes": "ما الذي تفعله", + "whatThisDoesDesc": "يعثر تلقائيًا على كل صورة ويستخرجها من صفحة ممسوحة أو صورة مركبة—دون قص يدوي.", + "whenToUse": "متى تُستخدم", + "useCase1": "مسح صفحات ألبوم كاملة دفعة واحدة", + "useCase2": "تقسيم دفعات المنضدة المسطحة إلى ملفات منفصلة", + "useCase3": "تفكيك الكولاج إلى صور فردية", + "useCase4": "سحب الصور من المستندات", + "quickFixes": "حلول سريعة", + "problem1": "الصور غير مُكتشفة → زد التسامح إلى 30-50", + "problem2": "الكثير من الاكتشافات الخاطئة → زد المساحة الدنيا إلى 15000-20000", + "problem3": "اقتطاعات ضيقة جدًا → زد حجم الحافة إلى 5-10", + "problem4": "صور مائلة لم تُقوَّم → خفّض حد الزاوية إلى ~5°", + "problem5": "مربعات غبار/ضوضاء → زد المساحة الدنيا للمحيط إلى 1000-2000", + "setupTips": "نصائح الإعداد", + "tip1": "استخدم خلفية بسيطة وفاتحة", + "tip2": "اترك فجوة صغيرة (≈1 سم) بين الصور", + "tip3": "امسح عند 300-600 DPI", + "tip4": "نظّف زجاج الماسح", + "headsUp": "تنبيه", + "headsUpDesc": "الصور المتداخلة أو الخلفيات القريبة جدًا في اللون من الصور قد تقلل الدقة—جرّب خلفية أفتح أو أغمق واترك مساحة أكبر." + } + }, "sign": { - "tags": "تخويل,الأحرف الأولى,توقيع مرسوم,توقيع نصي,توقيع بالصورة", "title": "توقيع", "header": "توقيع ملفات PDF", "upload": "تحميل الصورة", - "draw": "رسم التوقيع", - "text": "إدخال النص", + "draw": { + "title": "ارسم توقيعك", + "clear": "مسح" + }, + "text": { + "name": "اسم الموقّع", + "placeholder": "أدخل اسمك الكامل" + }, "clear": "مسح", "add": "إضافة", "saved": "توقيعات تم حفظها", "save": "حفظ توقيع", + "applySignatures": "تطبيق التواقيع", "personalSigs": "توقيعات شخصية", "sharedSigs": "توقيعات مشتركة", "noSavedSigs": "لم يتم العثور على توقيعات محفوظة", - "addToAll": "Add to all pages", + "addToAll": "إضافة إلى كل الصفحات", "delete": "حذف", - "first": "First page", - "last": "Last page", - "next": "Next page", - "previous": "Previous page", - "maintainRatio": "Toggle maintain aspect ratio", - "undo": "Undo", - "redo": "Redo" + "first": "الصفحة الأولى", + "last": "الصفحة الأخيرة", + "next": "الصفحة التالية", + "previous": "الصفحة السابقة", + "maintainRatio": "تبديل الحفاظ على نسبة الأبعاد", + "undo": "تراجع", + "redo": "إعادة", + "submit": "توقيع المستند", + "steps": { + "configure": "تهيئة التوقيع" + }, + "type": { + "title": "نوع التوقيع", + "draw": "رسم", + "canvas": "لوحة Canvas", + "image": "صورة", + "text": "نص" + }, + "image": { + "label": "رفع صورة التوقيع", + "placeholder": "اختر ملف صورة", + "hint": "ارفع صورة PNG أو JPG لتوقيعك" + }, + "instructions": { + "title": "كيفية إضافة توقيع" + }, + "activate": "تفعيل وضع وضع التوقيع", + "deactivate": "إيقاف وضع التوقيع", + "results": { + "title": "نتائج التوقيع" + }, + "error": { + "failed": "حدث خطأ أثناء توقيع PDF." + } }, "flatten": { - "tags": "ثابت,إلغاء التنشيط,غير تفاعلي,تبسيط", "title": "تسطيح", "header": "تسطيح ملفات PDF", "flattenOnlyForms": "تسطيح النماذج فقط", "submit": "تسطيح", + "filenamePrefix": "flattened", + "files": { + "placeholder": "حدد ملف PDF في العرض الرئيسي للبدء" + }, "steps": { "settings": "إعدادات" }, "options": { - "flattenOnlyForms": "تسطيح النماذج فقط" + "stepTitle": "خيارات التسطيح", + "title": "خيارات التسطيح", + "flattenOnlyForms.desc": "تسطيح حقول النماذج فقط مع إبقاء العناصر التفاعلية الأخرى كما هي", + "note": "التسطيح يزيل العناصر التفاعلية من PDF ويجعله غير قابل للتحرير." + }, + "results": { + "title": "نتائج التسطيح" + }, + "error": { + "failed": "حدث خطأ أثناء تسطيح PDF." + }, + "tooltip": { + "header": { + "title": "حول تسطيح ملفات PDF" + }, + "description": { + "title": "ماذا يفعل التسطيح؟", + "text": "يجعل التسطيح ملف PDF غير قابل للتحرير بتحويل النماذج القابلة للتعبئة والأزرار إلى نصوص وصور عادية. سيبدو PDF كما هو تمامًا، لكن لا يمكن لأحد تغييره أو تعبئة النماذج. مثالي لمشاركة النماذج المكتملة، وإنشاء مستندات نهائية للأرشفة، أو ضمان ظهور PDF بنفس الشكل في كل مكان.", + "bullet1": "تتحول مربعات النص إلى نص عادي (غير قابل للتحرير)", + "bullet2": "تتحول خانات الاختيار والأزرار إلى صور", + "bullet3": "ممتاز للإصدارات النهائية التي لا تريد تغييرها", + "bullet4": "يضمن مظهرًا متسقًا عبر جميع الأجهزة" + }, + "formsOnly": { + "title": "ماذا يعني 'تسطيح النماذج فقط'؟", + "text": "يزيل هذا الخيار فقط القدرة على تعبئة النماذج، لكنه يبقي الميزات الأخرى تعمل مثل النقر على الروابط، وعرض العلامات المرجعية، وقراءة التعليقات.", + "bullet1": "تصبح النماذج غير قابلة للتحرير", + "bullet2": "تظل الروابط تعمل عند النقر", + "bullet3": "تبقى التعليقات والملاحظات مرئية", + "bullet4": "تستمر العلامات المرجعية في مساعدتك على التنقل" + } } }, "repair": { "tags": "إصلاح,استعادة,تصحيح,استرداد", "title": "إصلاح", "header": "إصلاح ملفات PDF", - "submit": "إصلاح" + "submit": "إصلاح", + "description": "ستحاول هذه الأداة إصلاح ملفات PDF التالفة أو المعطوبة. لا إعدادات إضافية مطلوبة.", + "filenamePrefix": "repaired", + "files": { + "placeholder": "حدّد ملف PDF في العرض الرئيسي للبدء" + }, + "error": { + "failed": "حدث خطأ أثناء إصلاح PDF." + }, + "results": { + "title": "نتائج الإصلاح" + } }, "removeBlanks": { - "tags": "تنظيف,تبسيط,بدون محتوى,تنظيم", "title": "إزالة الفراغات", "header": "إزالة الصفحات الفارغة", - "threshold": "العتبة:", - "thresholdDesc": "الحد الفاصل لتحديد مدى بياض البكسل الأبيض", - "whitePercent": "نسبة الأبيض (%):", - "whitePercentDesc": "النسبة المئوية للصفحة التي يجب أن تكون بيضاء لتتم إزالتها", + "settings": { + "title": "الإعدادات" + }, + "threshold": { + "label": "عتبة بياض البكسل" + }, + "whitePercent": { + "label": "حد نسبة البياض", + "unit": "%" + }, + "includeBlankPages": { + "label": "تضمين الصفحات الفارغة المُكتشفة" + }, + "tooltip": { + "header": { + "title": "إعدادات إزالة الصفحات الفارغة" + }, + "threshold": { + "title": "عتبة بياض البكسل", + "text": "يتحكم في مدى بياض البكسل ليُعتبر «أبيض». يساعد في تحديد ما يُعد منطقة فارغة على الصفحة.", + "bullet1": "0 = أسود خالص (الأكثر تقييدًا)", + "bullet2": "128 = رمادي متوسط", + "bullet3": "255 = أبيض خالص (الأقل تقييدًا)" + }, + "whitePercent": { + "title": "حد نسبة البياض", + "text": "يضبط الحد الأدنى لنسبة البكسلات البيضاء المطلوبة لاعتبار الصفحة فارغة وإزالتها.", + "bullet1": "قيم أقل (مثل 80%) = إزالة المزيد من الصفحات", + "bullet2": "قيم أعلى (مثل 95%) = إزالة الصفحات الفارغة جدًا فقط", + "bullet3": "استخدم قيمًا أعلى للمستندات ذات الخلفيات الفاتحة" + }, + "includeBlankPages": { + "title": "تضمين الصفحات الفارغة المكتشفة", + "text": "عند التفعيل، ينشئ PDF منفصلًا يحتوي على جميع الصفحات الفارغة التي تم اكتشافها وإزالتها من المستند الأصلي.", + "bullet1": "مفيد لمراجعة ما تمت إزالته", + "bullet2": "يساعد على التحقق من دقة الاكتشاف", + "bullet3": "يمكن تعطيله لتقليل حجم ملف الناتج" + } + }, "submit": "إزالة الفراغات" }, "removeAnnotations": { "tags": "تعليقات,تظليل,ملاحظات,علامات,إزالة", "title": "إزالة التعليقات التوضيحية", "header": "إزالة التعليقات التوضيحية", - "submit": "إزالة" + "submit": "إزالة", + "settings": { + "title": "الإعدادات" + }, + "info": { + "title": "حول إزالة التعليقات", + "description": "ستزيل هذه الأداة جميع التعليقات (تعليقات، تمييزات، ملاحظات، إلخ) من ملفات PDF." + }, + "error": { + "failed": "حدث خطأ أثناء إزالة التعليقات من PDF." + } }, "compare": { "tags": "تمييز الاختلافات,مقارنة,تغييرات,تحليل", @@ -1082,28 +1930,140 @@ "certSign": { "tags": "مصادقة,PEM,P12,رسمي,تشفير", "title": "توقيع الشهادة", - "header": "قم بتوقيع ملف PDF بشهادتك (العمل قيد التقدم)", - "selectPDF": "حدد ملف PDF للتوقيع:", - "jksNote": "ملاحظة: إذا لم يكن نوع شهادتك مدرجًا أدناه، يرجى تحويلها إلى ملف مخزن مفاتيح جافا (.jks) باستخدام أداة سطر الأوامر keytool. ثم اختر خيار ملف .jks أدناه.", - "selectKey": "حدد ملف المفتاح الخاص (تنسيق PKCS # 8 ، يمكن أن يكون .pem أو .der):", - "selectCert": "حدد ملف الشهادة الخاص بك (تنسيق X.509 ، يمكن أن يكون .pem أو .der):", - "selectP12": "حدد ملف تخزين المفاتيح PKCS # 12 (.p12 أو .pfx) (اختياري ، إذا تم توفيره ، يجب أن يحتوي على مفتاحك الخاص وشهادتك):", - "selectJKS": "حدد ملف مخزن مفاتيح جافا الخاص بك (.jks أو .keystore):", - "certType": "نوع الشهادة", - "password": "أدخل كلمة مرور مخزن المفاتيح أو المفتاح الخاص (إن وجدت):", - "showSig": "إظهار التوقيع", - "reason": "السبب", - "location": "الموقع", - "name": "الاسم", - "showLogo": "عرض الشعار", - "submit": "توقيع PDF" + "filenamePrefix": "موقّع", + "signMode": { + "stepTitle": "وضع التوقيع", + "tooltip": { + "header": { + "title": "حول تواقيع PDF" + }, + "overview": { + "title": "كيف تعمل التوقيعات", + "text": "كلا الوضعين يختم المستند (أي تعديل يُعلَّم كعبث) ويسجل من/متى/كيف للمراجعة. ثقة العارض تعتمد على سلسلة الشهادة." + }, + "manual": { + "title": "يدوي — أحضر شهادتك", + "text": "استخدم ملفات شهادتك لهوية متوافقة مع علامتك التجارية. قد تعرض حالة موثوق عند التعرّف على السلسلة/هيئة الإصدار.", + "use": "للاستخدام: أمام العملاء، قانوني، امتثال." + }, + "auto": { + "title": "تلقائي — ختم نظام فوري بلا إعداد", + "text": "يوقّع بشهادة موقّعة ذاتيًا على الخادم. نفس ختم كشف العبث وسجل تدقيق؛ عادةً ما يظهر غير مُتحقق في العارضين.", + "use": "يُستخدم عندما: تحتاج سرعة وهوية داخلية متسقة عبر المراجعات والسجلات." + }, + "rule": { + "title": "قاعدة عامة", + "text": "تحتاج حالة موثوق للمتلقّي؟ اختر يدوي. تحتاج ختمًا سريعًا وكشف عبث وتدقيق بلا إعداد؟ اختر تلقائي." + } + } + }, + "certTypeStep": { + "stepTitle": "تنسيق الشهادة" + }, + "certFiles": { + "stepTitle": "ملفات الشهادة" + }, + "appearance": { + "stepTitle": "مظهر التوقيع", + "tooltip": { + "header": { + "title": "حول مظهر التوقيع" + }, + "invisible": { + "title": "تواقيع غير مرئية", + "text": "يُضاف التوقيع إلى PDF للأمان لكنه لن يكون مرئيًا عند العرض. مثالي للمتطلبات القانونية دون تغيير مظهر المستند.", + "bullet1": "يوفّر الأمان دون تغييرات مرئية", + "bullet2": "يلبّي المتطلبات القانونية للتوقيع الرقمي", + "bullet3": "لا يؤثر في تخطيط المستند أو تصميمه" + }, + "visible": { + "title": "تواقيع مرئية", + "text": "يعرض كتلة توقيع على PDF باسمك وتاريخك وتفاصيل اختيارية. مفيد لإيضاح أن المستند موقّع.", + "bullet1": "يُظهِر اسم الموقّع والتاريخ على المستند", + "bullet2": "يمكن تضمين السبب والموقع للتوقيع", + "bullet3": "اختر الصفحة التي يوضع فيها التوقيع", + "bullet4": "يمكن تضمين شعار اختياري" + } + } + }, + "sign": { + "submit": "توقيع PDF", + "results": "PDF الموقَّع" + }, + "error": { + "failed": "حدث خطأ أثناء معالجة التواقيع." + }, + "tooltip": { + "header": { + "title": "حول إدارة التواقيع" + }, + "overview": { + "title": "ما الذي تستطيع هذه الأداة فعله؟", + "text": "تتيح لك هذه الأداة التحقق مما إذا كانت ملفات PDF موقّعة رقميًا وإضافة تواقيع رقمية جديدة. التواقيع الرقمية تثبت من أنشأ أو وافق على المستند وتكشف ما إذا تم تغييره بعد التوقيع.", + "bullet1": "تحقق من التواقيع القائمة وصحتها", + "bullet2": "اعرض معلومات الموقّعين والشهادات بالتفصيل", + "bullet3": "أضف تواقيع رقمية جديدة لتأمين مستنداتك", + "bullet4": "يدعم ملفات متعددة مع تنقّل سهل" + }, + "validation": { + "title": "التحقق من التواقيع", + "text": "عند التحقق من التواقيع، تُظهر الأداة صلاحيتها، ومن وقّع ومتى، وما إذا تم تعديل المستند بعد التوقيع.", + "bullet1": "يعرض إن كانت التواقيع صالحة أم لا", + "bullet2": "يعرض معلومات الموقّع وتاريخ التوقيع", + "bullet3": "يتحقق مما إذا تم تعديل المستند بعد التوقيع", + "bullet4": "يمكن استخدام شهادات مخصّصة للتحقق" + }, + "signing": { + "title": "إضافة التواقيع", + "text": "للتوقيع على PDF تحتاج إلى شهادة رقمية (مثل PEM أو PKCS12 أو JKS). يمكنك جعل التوقيع مرئيًا على المستند أو إبقاءه غير مرئي للأمان فقط.", + "bullet1": "يدعم PEM وPKCS12 وJKS وشهادات الخادم", + "bullet2": "خيار إظهار/إخفاء التوقيع على PDF", + "bullet3": "إضافة السبب والموقع واسم الموقّع", + "bullet4": "اختر الصفحة لوضع التواقيع المرئية", + "bullet5": "استخدم شهادة الخادم لخيار بسيط 'وقّع مع Stirling-PDF'" + } + }, + "certType": { + "tooltip": { + "header": { + "title": "حول أنواع الشهادات" + }, + "what": { + "title": "ما هي الشهادة؟", + "text": "هو هوية آمنة لتوقيعك تثبت أنك وقّعت. ما لم يُطلب منك التوقيع عبر شهادة، نوصي باستخدام طريقة أخرى آمنة مثل الكتابة أو الرسم أو التحميل." + }, + "which": { + "title": "أي خيار أستخدم؟", + "text": "اختر التنسيق الذي يطابق ملف شهادتك:", + "bullet1": "PKCS#12 (.p12 / .pfx) – ملف واحد مدمج (الأكثر شيوعًا)", + "bullet2": "PFX (.pfx) – نسخة Microsoft من PKCS12", + "bullet3": "PEM – ملفات .pem منفصلة للمفتاح الخاص والشهادة", + "bullet4": "JKS – مخزن مفاتيح .jks لـ Java لبيئات التطوير/CI-CD" + }, + "convert": { + "title": "المفتاح غير موجود؟", + "text": "حوّل ملفك إلى مخزن مفاتيح Java (.jks) باستخدام keytool، ثم اختر JKS." + } + } + } }, "removeCertSign": { "tags": "مصادقة,PEM,P12,رسمي,فك التشفير", "title": "إزالة توقيع الشهادة", "header": "إزالة الشهادة الرقمية من PDF", "selectPDF": "حدد ملف PDF:", - "submit": "إزالة التوقيع" + "submit": "إزالة التوقيع", + "description": "ستزيل هذه الأداة توقيعات الشهادات الرقمية من مستند PDF.", + "filenamePrefix": "unsigned", + "files": { + "placeholder": "حدّد ملف PDF في العرض الرئيسي للبدء" + }, + "error": { + "failed": "حدث خطأ أثناء إزالة توقيعات الشهادات." + }, + "results": { + "title": "نتائج إزالة الشهادة" + } }, "pageLayout": { "tags": "دمج,مركب,عرض واحد,تنظيم", @@ -1113,8 +2073,100 @@ "addBorder": "إضافة حدود", "submit": "إرسال" }, + "bookletImposition": { + "tags": "كتيّب,ترتيب,طباعة,تجليد,تواقيع", + "title": "ترتيب الكتيّب", + "header": "ترتيب الكتيّب", + "submit": "إنشاء كتيّب", + "spineLocation": { + "label": "موضع الكعب", + "left": "يسار (قياسي)", + "right": "يمين (RTL)" + }, + "doubleSided": { + "label": "طباعة على الوجهين", + "tooltip": "ينشئ وجهيْن أمامي وخلفي لطباعة كتيّب صحيحة" + }, + "manualDuplex": { + "title": "وضع الازدواج اليدوي", + "instructions": "للطابعات بدون ازدواجية تلقائية. ستحتاج للتشغيل مرتيْن:" + }, + "duplexPass": { + "label": "تمرير الطباعة", + "first": "التمرير 1", + "second": "التمرير 2", + "firstInstructions": "اطبع الوجوه الأمامية → صفّ الأوراق مقلوبة → شغّل مرة أخرى مع التمرير 2", + "secondInstructions": "حمّل الرزمة مقلوبة → اطبع الوجوه الخلفية" + }, + "rtlBinding": { + "label": "تجليد من اليمين إلى اليسار", + "tooltip": "للغة العربية أو العبرية أو اللغات RTL الأخرى" + }, + "addBorder": { + "label": "إضافة حدود حول الصفحات", + "tooltip": "يضيف حدودًا حول كل مقطع صفحة للمساعدة في القص والمحاذاة" + }, + "addGutter": { + "label": "إضافة هامش تجليد", + "tooltip": "يضيف مساحة داخلية للتجليد" + }, + "gutterSize": { + "label": "حجم الهامش الداخلي (نقاط)" + }, + "flipOnShortEdge": { + "label": "قلب على الحافة القصيرة (الازدواجية التلقائية فقط)", + "tooltip": "فعّلها للطباعة مزدوجة على الحافة القصيرة (تجاهَلها في الوضع اليدوي)", + "manualNote": "غير مطلوب في الوضع اليدوي — ستقلب الرزمة بنفسك" + }, + "advanced": { + "toggle": "خيارات متقدمة" + }, + "paperSizeNote": "يُستمد حجم الورق تلقائيًا من صفحتك الأولى.", + "tooltip": { + "header": { + "title": "دليل إنشاء الكتيّب" + }, + "description": { + "title": "ما هو ترتيب الكتيّب؟", + "text": "ينشئ كتيّبات احترافية بترتيب صفحات صحيح للطباعة. توضع صفحات PDF بمخطط 2-في-صفحة على أوراق أفقية بحيث تُقرأ بالترتيب الصحيح بعد الطيّ والتجليد." + }, + "example": { + "title": "مثال: كتيّب من 8 صفحات", + "text": "مستندك المكوّن من 8 صفحات يصبح ورقتيْن:", + "bullet1": "ورقة 1 أمام: الصفحات 8، 1 | خلف: الصفحات 2، 7", + "bullet2": "ورقة 2 أمام: الصفحات 6، 3 | خلف: الصفحات 4، 5", + "bullet3": "عند الطيّ والتكديس: تُقرأ 1→2→3→4→5→6→7→8" + }, + "printing": { + "title": "كيفية الطباعة والتجميع", + "text": "اتبع هذه الخطوات لكتيّبات مثالية:", + "bullet1": "اطبع على الوجهين مع 'القلب على الحافة الطويلة'", + "bullet2": "صفّ الأوراق بالترتيب، واطوِ إلى النصف", + "bullet3": "دبّس أو اجعل التجليد على الكعب المطوي", + "bullet4": "للطابعات بحافة قصيرة: فعّل خيار 'القلب على الحافة القصيرة'" + }, + "manualDuplex": { + "title": "ازدواج يدوي (طابعات أحادية الوجه)", + "text": "للطابعات بدون ازدواج تلقائي:", + "bullet1": "أوقف 'الطباعة على الوجهين'", + "bullet2": "اختر 'التمرير 1' → اطبع → صفّ الأوراق مقلوبة", + "bullet3": "اختر 'التمرير 2' → حمّل الرزمة → اطبع الخلفيات", + "bullet4": "اطوِ وجمّع كالمعتاد" + }, + "advanced": { + "title": "خيارات متقدمة", + "text": "اضبط كتيّبك بدقّة:", + "bullet1": "تجليد من اليمين إلى اليسار: للغات RTL", + "bullet2": "الحدود: تعرض خطوط القطع", + "bullet3": "هامش التجليد: يضيف مساحة للتجليد/التدبيس", + "bullet4": "قلب الحافة القصيرة: للطابعات التلقائية فقط" + } + }, + "error": { + "failed": "حدث خطأ أثناء إنشاء ترتيب الكتيّب." + } + }, "scalePages": { - "tags": "تغيير الحجم,تعديل,الأبعاد,تكييف", "title": "ضبط مقياس الصفحة", "header": "ضبط مقياس الصفحة", "pageSize": "حجم صفحة المستند.", @@ -1122,6 +2174,44 @@ "scaleFactor": "مستوى التكبير (الاقتصاص) للصفحة.", "submit": "إرسال" }, + "adjustPageScale": { + "tags": "تغيير الحجم,تعديل,أبعاد,تكييف", + "title": "ضبط مقياس الصفحة", + "header": "ضبط مقياس الصفحة", + "scaleFactor": { + "label": "عامل المقياس" + }, + "pageSize": { + "label": "حجم الصفحة المستهدف", + "keep": "الإبقاء على الحجم الأصلي", + "letter": "ليتر", + "legal": "ليجال" + }, + "submit": "ضبط مقياس الصفحة", + "error": { + "failed": "حدث خطأ أثناء ضبط مقياس الصفحة." + }, + "tooltip": { + "header": { + "title": "نظرة عامة على إعدادات مقياس الصفحة" + }, + "description": { + "title": "الوصف", + "text": "اضبط حجم محتوى PDF وغيّر أبعاد الصفحة." + }, + "scaleFactor": { + "title": "عامل المقياس", + "text": "يتحكم في مدى كِبر أو صِغر ظهور المحتوى على الصفحة. يُعاد تحجيم المحتوى ويتم توسيطه — إذا كان أكبر من حجم الصفحة فقد يتم قصّه.", + "bullet1": "1.0 = الحجم الأصلي", + "bullet2": "0.5 = نصف الحجم (أصغر 50%)", + "bullet3": "2.0 = ضعف الحجم (أكبر 200% وقد يُقصّ)" + }, + "pageSize": { + "title": "حجم الصفحة المستهدف", + "text": "تُحدِّد أبعاد صفحات PDF الناتجة. يحافظ خيار 'الإبقاء على الحجم الأصلي' على الأبعاد الحالية، بينما تُعيد الخيارات الأخرى التحجيم إلى مقاسات ورق قياسية." + } + } + }, "add-page-numbers": { "tags": "ترقيم,تسمية,تنظيم,فهرسة" }, @@ -1129,16 +2219,66 @@ "tags": "كشف تلقائي,مبني على الرأس,تنظيم,إعادة تسمية", "title": "إعادة تسمية تلقائية", "header": "إعادة تسمية PDF تلقائيًا", - "submit": "إعادة تسمية تلقائية" + "description": "يجد تلقائيًا العنوان من محتوى PDF ويستخدمه كاسم الملف.", + "submit": "إعادة تسمية تلقائية", + "files": { + "placeholder": "حدد ملف PDF في العرض الرئيسي للبدء" + }, + "error": { + "failed": "حدث خطأ أثناء إعادة تسمية PDF تلقائيًا." + }, + "results": { + "title": "نتائج إعادة التسمية التلقائية" + }, + "tooltip": { + "header": { + "title": "كيف تعمل إعادة التسمية التلقائية" + }, + "howItWorks": { + "title": "إعادة تسمية ذكية", + "text": "يجد تلقائيًا العنوان من محتوى PDF ويستخدمه كاسم الملف.", + "bullet1": "يبحث عن نص يبدو كعنوان أو ترويسة", + "bullet2": "ينشئ اسم ملف نظيفًا وصالحًا من العنوان المُكتشف", + "bullet3": "يبقي الاسم الأصلي إذا لم يُعثر على عنوان مناسب" + } + } }, "adjust-contrast": { "tags": "تصحيح الألوان,ضبط,تعديل,تحسين" }, "crop": { - "tags": "تقليم,تقليص,تحرير,تشكيل", "title": "اقتصاص", "header": "اقتصاص PDF", - "submit": "إرسال" + "submit": "إرسال", + "noFileSelected": "حدّد ملف PDF لبدء القص", + "preview": { + "title": "معاينة منطقة القص" + }, + "reset": "إعادة التعيين إلى كامل PDF", + "coordinates": { + "title": "الموضع والحجم", + "x": "موضع X", + "y": "موضع Y", + "width": "العرض", + "height": "الارتفاع" + }, + "error": { + "invalidArea": "منطقة القص تتجاوز حدود PDF", + "failed": "فشل قصّ PDF" + }, + "steps": { + "selectArea": "تحديد منطقة القص" + }, + "tooltip": { + "title": "كيفية قص ملفات PDF", + "description": "حدّد المنطقة المراد قصّها من PDF بسحب وتغيير حجم التراكب الأزرق على الصورة المصغّرة.", + "drag": "اسحب التراكب لتحريك منطقة القص", + "resize": "اسحب مقابض الزوايا والحواف لتغيير الحجم", + "precision": "استخدم مدخلات الإحداثيات للتموضع الدقيق" + }, + "results": { + "title": "نتائج القص" + } }, "autoSplitPDF": { "tags": "مبني على QR,فصل,تقسيم المسح الضوئي,تنظيم", @@ -1197,8 +2337,8 @@ }, "PDFToMarkdown": { "tags": "لغة الترميز,محتوى الويب,تحويل,تحويل", - "title": "PDF To Markdown", - "header": "PDF To Markdown", + "title": "PDF إلى Markdown", + "header": "PDF إلى Markdown", "submit": "تحويل" }, "getPdfInfo": { @@ -1221,64 +2361,122 @@ "downloadJS": "تنزيل جافا سكريبت", "submit": "إظهار" }, - "autoRedact": { - "tags": "حجب,إخفاء,تسويد,أسود,علامة,مخفي", - "title": "حجب تلقائي", - "header": "حجب تلقائي", - "colorLabel": "اللون", - "textsToRedactLabel": "النص المراد حجبه (مفصول بأسطر)", - "textsToRedactPlaceholder": "مثال: \\nسري \\nسري للغاية", - "useRegexLabel": "استخدام التعبيرات العادية", - "wholeWordSearchLabel": "بحث الكلمة الكاملة", - "customPaddingLabel": "حشو إضافي مخصص", - "convertPDFToImageLabel": "تحويل PDF إلى صورة PDF (يستخدم لإزالة النص خلف المربع)", - "submitButton": "إرسال" - }, "redact": { "tags": "Redact,Hide,black out,black,marker,hidden,manual", "title": "Manual Redaction", - "header": "Manual Redaction", "submit": "Manual Redaction", - "textBasedRedaction": "Text based Redaction", - "pageBasedRedaction": "Page-based Redaction", - "convertPDFToImageLabel": "Convert PDF to PDF-Image (Used to remove text behind the box)", - "pageRedactionNumbers": { - "title": "Pages", - "placeholder": "(e.g. 1,2,8 or 4,7,12-16 or 2n-1)" + "error": { + "failed": "حدث خطأ أثناء توقيع PDF." }, - "redactionColor": { - "title": "Redaction Color" + "modeSelector": { + "title": "طريقة التنقيح", + "mode": "الوضع", + "automatic": "تلقائي", + "automaticDesc": "تنقيح النص بناءً على مصطلحات البحث", + "manual": "يدوي", + "manualDesc": "انقر واسحب لتنقيح مناطق محددة", + "manualComingSoon": "التنقيح اليدوي قريبًا" }, - "export": "Export", - "upload": "Upload", - "boxRedaction": "Box draw redaction", - "zoom": "Zoom", - "zoomIn": "Zoom in", - "zoomOut": "Zoom out", - "nextPage": "Next Page", - "previousPage": "Previous Page", - "toggleSidebar": "Toggle Sidebar", - "showThumbnails": "Show Thumbnails", - "showDocumentOutline": "Show Document Outline (double-click to expand/collapse all items)", - "showAttatchments": "Show Attachments", - "showLayers": "Show Layers (double-click to reset all layers to the default state)", - "colourPicker": "Colour Picker", - "findCurrentOutlineItem": "Find current outline item", - "applyChanges": "Apply Changes", "auto": { + "header": "تنقيح تلقائي", "settings": { + "title": "إعدادات التنقيح", "advancedTitle": "متقدم" }, + "colorLabel": "لون الصندوق", "wordsToRedact": { - "add": "إضافة" + "title": "كلمات للتنقيح", + "placeholder": "أدخل كلمة", + "add": "إضافة", + "examples": "أمثلة: Confidential, Top-Secret" + }, + "useRegexLabel": "استخدام Regex", + "wholeWordSearchLabel": "بحث عن كلمة كاملة", + "customPaddingLabel": "حشو إضافي مخصّص", + "convertPDFToImageLabel": "تحويل PDF إلى PDF-Image" + }, + "tooltip": { + "mode": { + "header": { + "title": "طريقة التنقيح" + }, + "automatic": { + "title": "تنقيح تلقائي", + "text": "يعثر تلقائيًا على النص المحدد وينقّحه عبر المستند. مثالي لإزالة المعلومات الحساسة المتكررة مثل الأسماء أو العناوين أو إشعارات السرية." + }, + "manual": { + "title": "تنقيح يدوي", + "text": "انقر واسحب لتحديد مناطق معينة يدويًا لتنقيحها. يمنحك تحكمًا دقيقًا فيما يتم تنقيحه. (قريبًا)" + } + }, + "words": { + "header": { + "title": "كلمات للتنقيح" + }, + "description": { + "title": "مطابقة النص", + "text": "أدخل كلمات أو عبارات للعثور عليها وتنقيحها في مستندك. سيتم البحث عن كل كلمة بشكل منفصل." + }, + "bullet1": "أضف كلمة واحدة كل مرة", + "bullet2": "اضغط Enter أو انقر «أضف أخرى» للإضافة", + "bullet3": "انقر × لإزالة الكلمات", + "examples": { + "title": "أمثلة شائعة", + "text": "تشمل الكلمات المعتادة لتنقيحها: بيانات بنكية، عناوين بريد إلكتروني، أو أسماء محددة." + } + }, + "advanced": { + "header": { + "title": "إعدادات التنقيح المتقدمة" + }, + "color": { + "title": "لون الصندوق والحشو", + "text": "خصّص مظهر صناديق التنقيح. الأسود قياسي، ويمكنك اختيار أي لون. يضيف الحشو مساحة إضافية حول النص المعثور عليه." + }, + "regex": { + "title": "استخدام Regex", + "text": "فعّل التعابير النمطية للمطابقة المتقدمة. مفيد للعثور على أرقام الهواتف أو رسائل البريد أو الأنماط المعقّدة.", + "bullet1": "مثال: \\d{4}-\\d{2}-\\d{2} لمطابقة أي تاريخ بصيغة YYYY-MM-DD", + "bullet2": "استخدم بحذر — اختبر جيدًا" + }, + "wholeWord": { + "title": "بحث كلمة كاملة", + "text": "مطابقة الكلمات الكاملة فقط، وليس المطابقات الجزئية. لن تطابق 'John' كلمة 'Johnson' عند التفعيل." + }, + "convert": { + "title": "التحويل إلى PDF-Image", + "text": "يحوّل PDF إلى PDF قائم على الصور بعد التنقيح. يضمن إزالة النص خلف صناديق التنقيح تمامًا وعدم إمكانية استعادته." + } } }, "manual": { + "header": "تنقيح يدوي", + "textBasedRedaction": "تنقيح قائم على النص", + "pageBasedRedaction": "تنقيح حسب الصفحة", + "convertPDFToImageLabel": "تحويل PDF إلى PDF-Image (لإزالة النص خلف الصندوق)", "pageRedactionNumbers": { "title": "صفحات", "placeholder": "(مثال: 1,2,8 أو 4,7,12-16 أو 2n-1)" }, - "export": "تصدير" + "redactionColor": { + "title": "لون التنقيح" + }, + "export": "تصدير", + "upload": "رفع", + "boxRedaction": "تنقيح بالرسم بصندوق", + "zoom": "تكبير/تصغير", + "zoomIn": "تكبير", + "zoomOut": "تصغير", + "nextPage": "الصفحة التالية", + "previousPage": "الصفحة السابقة", + "toggleSidebar": "تبديل الشريط الجانبي", + "showThumbnails": "إظهار المصغّرات", + "showDocumentOutline": "إظهار مخطط المستند (نقر مزدوج لتوسيع/طي جميع العناصر)", + "showAttachments": "إظهار المرفقات", + "showLayers": "إظهار الطبقات (نقر مزدوج لإعادة كل الطبقات للوضع الافتراضي)", + "colourPicker": "منتقي الألوان", + "findCurrentOutlineItem": "ابحث عن عنصر المخطط الحالي", + "applyChanges": "تطبيق التغييرات" } }, "tableExtraxt": { @@ -1332,6 +2530,7 @@ "tags": "ختم, إضافة صورة, صورة وسط, علامة مائية, PDF, تضمين, تخصيص", "header": "ختم PDF", "title": "ختم PDF", + "stampSetup": "إعداد الختم", "stampType": "نوع الختم", "stampText": "نص الختم", "stampImage": "صورة الختم", @@ -1344,7 +2543,8 @@ "overrideY": "تجاوز الإحداثي Y", "customMargin": "هامش مخصص", "customColor": "لون نص مخصص", - "submit": "إرسال" + "submit": "إرسال", + "noStampSelected": "لم يتم اختيار ختم. ارجع إلى الخطوة 1." }, "removeImagePdf": { "tags": "إزالة الصورة,عمليات الصفحة,الخلفية,جانب الخادم" @@ -1353,76 +2553,60 @@ "tags": "تجزئة، فصول، علامات تبويب، تنظيم" }, "validateSignature": { - "tags": "signature,verify,validate,pdf,certificate,digital signature,Validate Signature,Validate certificate", - "title": "Validate PDF Signatures", - "header": "Validate Digital Signatures", - "selectPDF": "Select signed PDF file", - "submit": "Validate Signatures", - "results": "Validation Results", + "tags": "توقيع،تحقق،تصديق،pdf،شهادة،توقيع رقمي،Validate Signature،Validate certificate", + "title": "التحقق من تواقيع PDF", + "header": "التحقق من التواقيع الرقمية", + "selectPDF": "اختر ملف PDF موقّع", + "submit": "تحقق من التواقيع", + "results": "نتائج التحقق", "status": { - "_value": "Status", - "valid": "Valid", - "invalid": "Invalid" + "_value": "الحالة", + "valid": "صالح", + "invalid": "غير صالح" }, - "signer": "Signer", - "date": "Date", + "signer": "الموقّع", + "date": "التاريخ", "reason": "السبب", "location": "الموقع", - "noSignatures": "No digital signatures found in this document", + "noSignatures": "لا توجد تواقيع رقمية في هذا المستند", "chain": { - "invalid": "Certificate chain validation failed - cannot verify signer's identity" + "invalid": "فشل التحقق من سلسلة الشهادات - لا يمكن التحقق من هوية الموقّع" }, "trust": { - "invalid": "Certificate not in trust store - source cannot be verified" + "invalid": "الشهادة غير موجودة في مخزن الثقة - المصدر غير قابل للتحقق" }, "cert": { - "expired": "Certificate has expired", - "revoked": "Certificate has been revoked", - "info": "Certificate Details", - "issuer": "Issuer", - "subject": "Subject", - "serialNumber": "Serial Number", - "validFrom": "Valid From", - "validUntil": "Valid Until", - "algorithm": "Algorithm", - "keySize": "Key Size", + "expired": "الشهادة منتهية الصلاحية", + "revoked": "تم إلغاء الشهادة", + "info": "تفاصيل الشهادة", + "issuer": "الجهة المُصدِرة", + "subject": "الموضوع", + "serialNumber": "الرقم التسلسلي", + "validFrom": "صالح من", + "validUntil": "صالح حتى", + "algorithm": "الخوارزمية", + "keySize": "حجم المفتاح", "version": "الإصدار", - "keyUsage": "Key Usage", - "selfSigned": "Self-Signed", - "bits": "bits" + "keyUsage": "استخدام المفتاح", + "selfSigned": "موقّعة ذاتيًا", + "bits": "بت" }, "signature": { - "info": "Signature Information", - "_value": "Signature", - "mathValid": "Signature is mathematically valid BUT:" + "info": "معلومات التوقيع", + "_value": "التوقيع", + "mathValid": "التوقيع صالح رياضيًا لكن:" }, - "selectCustomCert": "Custom Certificate File X.509 (Optional)" + "selectCustomCert": "ملف شهادة X.509 مخصص (اختياري)" }, - "replace-color": { - "title": "إستبدال-عكس اللون", - "header": "استبدال-عكس لون PDF", - "selectText": { - "1": "خيارات استبدال أو عكس الألوان", - "2": "افتراضي(ألوان التباين العالي الافتراضية)", - "3": "خصيصة (ألوان شخصية)", - "4": "عكس كامل(عكس جميع الألوان)", - "5": "خيارات ألوان التباين العالي", - "6": "نص أبيض على خلفية سوداء", - "7": "نص أسود على خلفية بيضاء", - "8": "نص صفرة على خلفية سوداء", - "9": "نص أخضر على خلفية سوداء", - "10": "اختر لون النص", - "11": "اختر لون الخلفية" - }, - "submit": "استبدال" - }, - "replaceColorPdf": { - "tags": "استبدال اللون، عمليات الصفحة، الخلفية، جانب الخادم" + "replaceColor": { + "tags": "استبدال اللون،عمليات الصفحة،الواجهة الخلفية،جهة الخادم" }, "login": { "title": "تسجيل الدخول", "header": "تسجيل الدخول", "signin": "تسجيل الدخول", + "signInWith": "تسجيل الدخول بواسطة", + "signInAnonymously": "التسجيل كضيف", "rememberme": "تذكرني", "invalid": "اسم المستخدم أو كلمة المرور غير صالحة.", "locked": "تم قفل حسابك.", @@ -1436,17 +2620,75 @@ "oauth2AccessDenied": "تم رفض الوصول", "oauth2InvalidTokenResponse": "استجابة الرمز المميز غير صالحة", "oauth2InvalidIdToken": "رمز الهوية غير صالح", - "relyingPartyRegistrationNotFound": "No relying party registration found", + "relyingPartyRegistrationNotFound": "لم يتم العثور على تسجيل الطرف المعتمد", "userIsDisabled": "تم تعطيل المستخدم، تم حظر تسجيل الدخول حاليًا باستخدام اسم المستخدم هذا. يرجى الاتصال بالمسؤول.", "alreadyLoggedIn": "لقد تسجل دخولًا إلى", "alreadyLoggedIn2": "أجهزة أخرى. يرجى تسجيل الخروج من الأجهزة وحاول مرة أخرى.", "toManySessions": "لديك عدة جلسات نشطة", - "logoutMessage": "You have been logged out." + "logoutMessage": "تم تسجيل خروجك.", + "youAreLoggedIn": "لقد سجّلت الدخول!", + "email": "البريد الإلكتروني", + "password": "كلمة المرور", + "enterEmail": "أدخل بريدك الإلكتروني", + "enterPassword": "أدخل كلمة المرور", + "loggingIn": "جارٍ تسجيل الدخول...", + "signingIn": "جارٍ تسجيل الدخول...", + "login": "تسجيل الدخول", + "or": "أو", + "useMagicLink": "استخدم الرابط السحري بدلًا من ذلك", + "enterEmailForMagicLink": "أدخل بريدك الإلكتروني للحصول على رابط سحري", + "sending": "جارٍ الإرسال…", + "sendMagicLink": "إرسال الرابط السحري", + "cancel": "إلغاء", + "dontHaveAccount": "لا تملك حسابًا؟ سجّل", + "home": "الصفحة الرئيسية", + "debug": "تصحيح", + "signOut": "تسجيل الخروج", + "pleaseEnterBoth": "يرجى إدخال البريد الإلكتروني وكلمة المرور معًا", + "pleaseEnterEmail": "يرجى إدخال عنوان بريدك الإلكتروني", + "magicLinkSent": "تم إرسال الرابط السحري إلى {{email}}! تفقد بريدك واضغط الرابط لتسجيل الدخول.", + "passwordResetSent": "تم إرسال رابط إعادة تعيين كلمة المرور إلى {{email}}! تفقد بريدك واتبع التعليمات.", + "failedToSignIn": "فشل تسجيل الدخول بواسطة {{provider}}: {{message}}", + "unexpectedError": "خطأ غير متوقع: {{message}}" + }, + "signup": { + "title": "إنشاء حساب", + "subtitle": "انضم إلى Stirling PDF للبدء", + "name": "الاسم", + "email": "البريد الإلكتروني", + "password": "كلمة المرور", + "confirmPassword": "تأكيد كلمة المرور", + "enterName": "أدخل اسمك", + "enterEmail": "أدخل بريدك الإلكتروني", + "enterPassword": "أدخل كلمة المرور", + "confirmPasswordPlaceholder": "أكّد كلمة المرور", + "or": "أو", + "creatingAccount": "جارٍ إنشاء الحساب...", + "signUp": "إنشاء حساب", + "alreadyHaveAccount": "هل لديك حساب بالفعل؟ سجّل الدخول", + "pleaseFillAllFields": "يرجى ملء جميع الحقول", + "passwordsDoNotMatch": "كلمتا المرور غير متطابقتين", + "passwordTooShort": "يجب أن تتكون كلمة المرور من 6 أحرف على الأقل", + "invalidEmail": "يرجى إدخال عنوان بريد إلكتروني صالح", + "checkEmailConfirmation": "تحقّق من بريدك الإلكتروني للعثور على رابط التأكيد لإكمال التسجيل.", + "accountCreatedSuccessfully": "تم إنشاء الحساب بنجاح! يمكنك الآن تسجيل الدخول.", + "unexpectedError": "خطأ غير متوقع: {{message}}" }, "pdfToSinglePage": { "title": "PDF إلى صفحة واحدة", "header": "PDF إلى صفحة واحدة", - "submit": "تحويل إلى صفحة واحدة" + "submit": "تحويل إلى صفحة واحدة", + "description": "هذه الأداة ستدمج كل صفحات PDF في صفحة واحدة كبيرة. سيبقى العرض كما هو في الصفحات الأصلية، لكن الارتفاع سيكون مجموع ارتفاعات جميع الصفحات.", + "filenamePrefix": "single_page", + "files": { + "placeholder": "حدّد ملف PDF في العرض الرئيسي للبدء" + }, + "error": { + "failed": "حدث خطأ أثناء التحويل إلى صفحة واحدة." + }, + "results": { + "title": "نتائج الصفحة الواحدة" + } }, "pageExtracter": { "title": "استخراج الصفحات", @@ -1460,10 +2702,10 @@ "selectText": { "1": "إزالة إجراءات جافا سكريبت", "2": "إزالة الملفات المضمنة", - "3": "Remove XMP metadata", + "3": "إزالة بيانات XMP الوصفية", "4": "إزالة الروابط", "5": "إزالة الخطوط", - "6": "Remove Document Info Metadata" + "6": "إزالة بيانات معلومات المستند" }, "submit": "تنظيف PDF" }, @@ -1477,34 +2719,59 @@ }, "compress": { "title": "ضغط", + "desc": "اضغط ملفات PDF لتقليل حجمها.", "header": "ضغط ملف PDF", + "method": { + "title": "طريقة الضغط", + "quality": "الجودة", + "filesize": "حجم الملف" + }, "credit": "تستخدم هذه الخدمة qpdf لضغط / تحسين PDF.", "grayscale": { "label": "تطبيق التدرج الرمادي للضغط" }, + "tooltip": { + "header": { + "title": "نظرة عامة على إعدادات الضغط" + }, + "description": { + "title": "الوصف", + "text": "الضغط طريقة سهلة لتقليل حجم ملفك. اختر حجم الملف لإدخال حجم مستهدف وسنعدّل الجودة من أجلك. اختر الجودة لضبط قوة الضغط يدويًا." + }, + "qualityAdjustment": { + "title": "ضبط الجودة", + "text": "اسحب شريط التمرير لضبط قوة الضغط. القيم المنخفضة (1-3) تحافظ على الجودة لكنها تنتج ملفات أكبر. القيم المرتفعة (7-9) تصغّر الملف أكثر لكنها تقلّل وضوح الصور.", + "bullet1": "القيم المنخفضة تحافظ على الجودة", + "bullet2": "القيم المرتفعة تقلّل حجم الملف" + }, + "grayscale": { + "title": "تدرّج رمادي", + "text": "حدد هذا الخيار لتحويل جميع الصور إلى الأبيض والأسود، ما قد يقلّل حجم الملف بشكل ملحوظ خاصة لملفات PDF الممسوحة أو الكثيرة الصور." + } + }, + "error": { + "failed": "حدث خطأ أثناء ضغط PDF." + }, "selectText": { "1": { - "_value": "Compression Settings", - "1": "1-3 PDF compression,
4-6 lite image compression,
7-9 intense image compression Will dramatically reduce image quality" + "_value": "إعدادات الضغط", + "1": "1-3 ضغط PDF،
4-6 ضغط صور خفيف،
7-9 ضغط صور قوي سيقلّل جودة الصور بشكل كبير" }, "2": "مستوى التحسين:", "4": "الوضع التلقائي - يضبط الجودة تلقائيًا للحصول على ملف PDF بالحجم المحدد", "5": "حجم PDF المتوقع (على سبيل المثال 25 ميجا بايت، 10.8 ميجا بايت، 25 كيلو بايت)" }, - "submit": "ضغط", - "method": { - "filesize": "حجم الملف" - } + "submit": "ضغط" }, "decrypt": { - "passwordPrompt": "This file is password-protected. Please enter the password:", - "cancelled": "Operation cancelled for PDF: {0}", - "noPassword": "No password provided for encrypted PDF: {0}", - "invalidPassword": "Please try again with the correct password.", - "invalidPasswordHeader": "Incorrect password or unsupported encryption for PDF: {0}", - "unexpectedError": "There was an error processing the file. Please try again.", - "serverError": "Server error while decrypting: {0}", - "success": "File decrypted successfully." + "passwordPrompt": "هذا الملف محمي بكلمة مرور. يرجى إدخال كلمة المرور:", + "cancelled": "تم إلغاء العملية لـ PDF: {0}", + "noPassword": "لم تُوفَّر كلمة مرور لملف PDF المشفّر: {0}", + "invalidPassword": "يرجى المحاولة مرة أخرى باستخدام كلمة المرور الصحيحة.", + "invalidPasswordHeader": "كلمة المرور غير صحيحة أو التشفير غير مدعوم لـ PDF: {0}", + "unexpectedError": "حدث خطأ أثناء معالجة الملف. يرجى المحاولة مرة أخرى.", + "serverError": "خطأ في الخادم أثناء فك التشفير: {0}", + "success": "تم فك تشفير الملف بنجاح." }, "multiTool-advert": { "message": "هذه الميزة متوفرة في صفحة الأدوات المتعددة لدينا. اطلع عليها للحصول على واجهة مستخدم محسّنة لكل صفحة وميزات إضافية!" @@ -1580,15 +2847,15 @@ "button": "المشاركة في الاستطلاع", "dontShowAgain": "عدم الإظهار مرة أخرى", "meeting": { - "1": "If you're using Stirling PDF at work, we'd love to speak to you. We're offering technical support sessions in exchange for a 15 minute user discovery session.", - "2": "This is a chance to:", - "3": "Get help with deployment, integrations, or troubleshooting", - "4": "Provide direct feedback on performance, edge cases, and feature gaps", - "5": "Help us refine Stirling PDF for real-world enterprise use", - "6": "If you're interested, you can book time with our team directly. (English speaking only)", - "7": "Looking forward to digging into your use cases and making Stirling PDF even better!", - "notInterested": "Not a business and/or interested in a meeting?", - "button": "Book meeting" + "1": "إذا كنت تستخدم Stirling PDF في العمل، يسعدنا التحدث معك. نقدّم جلسات دعم تقني مقابل جلسة اكتشاف مستخدم مدتها 15 دقيقة.", + "2": "هذه فرصة لـ:", + "3": "الحصول على مساعدة في النشر، التكاملات، أو استكشاف الأخطاء", + "4": "تقديم ملاحظات مباشرة حول الأداء والحالات الحدّية وثغرات الميزات", + "5": "مساعدتنا على تحسين Stirling PDF للاستخدام المؤسسي الواقعي", + "6": "إذا كنت مهتمًا، يمكنك حجز وقت مع فريقنا مباشرةً. (اللغة الإنجليزية فقط)", + "7": "نتطلع للتعمّق في استخداماتك وجعل Stirling PDF أفضل!", + "notInterested": "لست شركة و/أو غير مهتم بالاجتماع؟", + "button": "احجز موعدًا" } }, "removeImage": { @@ -1615,102 +2882,346 @@ "click": "انقر هنا", "or": "أو", "dragAndDrop": "قم بسحب الملفات وإفلاتها", - "dragAndDropPDF": "Drag & Drop PDF file", - "dragAndDropImage": "Drag & Drop Image file", + "dragAndDropPDF": "اسحب وأفلت ملف PDF", + "dragAndDropImage": "اسحب وأفلت ملف صورة", "hoveredDragAndDrop": "قم بسحب المفات وإفلاتها هنا", "extractPDF": "جاري الاستخراج..." }, "releases": { - "footer": "Releases", - "title": "Release Notes", - "header": "Release Notes", + "footer": "الإصدارات", + "title": "ملاحظات الإصدار", + "header": "ملاحظات الإصدار", "current": { - "version": "Current Release" + "version": "الإصدار الحالي" }, - "note": "Release notes are only available in English" + "note": "ملاحظات الإصدارات متاحة باللغة الإنجليزية فقط" + }, + "swagger": { + "title": "توثيق API", + "header": "توثيق API", + "desc": "عرض واختبار نقاط نهاية Stirling PDF API", + "tags": "api,documentation,swagger,endpoints,development" }, "cookieBanner": { "popUp": { - "title": "How we use Cookies", + "title": "كيف نستخدم ملفات تعريف الارتباط", "description": { - "1": "We use cookies and other technologies to make Stirling PDF work better for you—helping us improve our tools and keep building features you'll love.", + "1": "نستخدم ملفات تعريف الارتباط وتقنيات أخرى لجعل Stirling PDF يعمل بشكل أفضل لك—نساعدنا على تحسين أدواتنا والاستمرار في بناء ميزات ستحبها.", "2": "If you’d rather not, clicking 'No Thanks' will only enable the essential cookies needed to keep things running smoothly." }, - "acceptAllBtn": "Okay", - "acceptNecessaryBtn": "No Thanks", - "showPreferencesBtn": "Manage preferences" + "acceptAllBtn": "حسنًا", + "acceptNecessaryBtn": "لا شكرًا", + "showPreferencesBtn": "إدارة التفضيلات" }, "preferencesModal": { - "title": "Consent Preferences Center", - "acceptAllBtn": "Accept all", - "acceptNecessaryBtn": "Reject all", - "savePreferencesBtn": "Save preferences", - "closeIconLabel": "Close modal", - "serviceCounterLabel": "Service|Services", - "subtitle": "Cookie Usage", + "title": "مركز تفضيلات الموافقة", + "acceptAllBtn": "قبول الكل", + "acceptNecessaryBtn": "رفض الكل", + "savePreferencesBtn": "حفظ التفضيلات", + "closeIconLabel": "إغلاق النافذة", + "serviceCounterLabel": "خدمة|خدمات", + "subtitle": "استخدام ملفات تعريف الارتباط", "description": { - "1": "Stirling PDF uses cookies and similar technologies to enhance your experience and understand how our tools are used. This helps us improve performance, develop the features you care about, and provide ongoing support to our users.", - "2": "Stirling PDF cannot—and will never—track or access the content of the documents you use.", - "3": "Your privacy and trust are at the core of what we do." + "1": "يستخدم Stirling PDF ملفات تعريف الارتباط وتقنيات مشابهة لتحسين تجربتك وفهم كيفية استخدام أدواتنا. يساعدنا ذلك على تحسين الأداء وتطوير الميزات التي تهمك وتقديم دعم مستمر لمستخدمينا.", + "2": "لا يمكن لـ Stirling PDF—ولن—يتتبع أو يصل إلى محتوى المستندات التي تستخدمها.", + "3": "خصوصيتك وثقتك في صميم ما نقوم به." }, "necessary": { "title": { - "1": "Strictly Necessary Cookies", - "2": "Always Enabled" + "1": "ملفات تعريف الارتباط الضرورية للغاية", + "2": "مفعّلة دائمًا" }, "description": "These cookies are essential for the website to function properly. They enable core features like setting your privacy preferences, logging in, and filling out forms—which is why they can’t be turned off." }, "analytics": { - "title": "Analytics", - "description": "These cookies help us understand how our tools are being used, so we can focus on building the features our community values most. Rest assured—Stirling PDF cannot and will never track the content of the documents you work with." + "title": "التحليلات", + "description": "تساعدنا هذه الملفات على فهم كيفية استخدام أدواتنا، كي نركّز على بناء الميزات الأكثر قيمة لمجتمعنا. كن مطمئنًا—‏Stirling PDF لا يمكنه ولن يتتبع محتوى المستندات التي تعمل عليها." } } }, - "download": "تنزيل", - "convert": { - "title": "تحويل", - "settings": "إعدادات", - "color": "لون", - "greyscale": "تدرج الرمادي", - "fillPage": "ملء الصفحة", - "pdfaDigitalSignatureWarning": "يحتوي PDF على توقيع رقمي. سيتم إزالة هذا في الخطوة التالية.", - "grayscale": "تدرج الرمادي" + "removeMetadata": { + "submit": "إزالة البيانات الوصفية" }, - "attachments": { - "tags": "embed,attach,file,attachment,attachments", - "title": "Add attachments", - "header": "Add attachments", - "submit": "Add attachments" + "sidebar": { + "toggle": "تبديل الشريط الجانبي" + }, + "theme": { + "toggle": "تبديل السِمة" + }, + "view": { + "viewer": "عارض", + "pageEditor": "محرر الصفحات", + "fileManager": "مدير الملفات" + }, + "pageEditor": { + "title": "محرر الصفحات", + "save": "حفظ التغييرات", + "noPdfLoaded": "لا يوجد PDF محمّل. يرجى رفع PDF لتحريره.", + "rotatedLeft": "تم التدوير يسارًا:", + "rotatedRight": "تم التدوير يمينًا:", + "deleted": "تم الحذف:", + "movedLeft": "تم النقل يسارًا:", + "movedRight": "تم النقل يمينًا:", + "splitAt": "تقسيم عند:", + "insertedPageBreak": "إدراج فاصل صفحة عند:", + "addFileNotImplemented": "إضافة ملف غير متاحة في العرض التجريبي", + "closePdf": "إغلاق PDF", + "reset": "إعادة التعيين", + "zoomIn": "تكبير", + "zoomOut": "تصغير", + "fitToWidth": "ملاءمة للعرض", + "actualSize": "الحجم الفعلي" + }, + "viewer": { + "firstPage": "الصفحة الأولى", + "lastPage": "الصفحة الأخيرة", + "previousPage": "الصفحة السابقة", + "nextPage": "الصفحة التالية", + "zoomIn": "تكبير", + "zoomOut": "تصغير", + "singlePageView": "عرض صفحة واحدة", + "dualPageView": "عرض صفحتين" }, "rightRail": { + "closeSelected": "إغلاق الصفحات المحددة", "selectAll": "تحديد الكل", - "deselectAll": "إلغاء تحديد الكل" + "deselectAll": "إلغاء تحديد الكل", + "selectByNumber": "تحديد حسب أرقام الصفحات", + "deleteSelected": "حذف الصفحات المحددة", + "closePdf": "إغلاق PDF", + "exportAll": "تصدير PDF", + "downloadSelected": "تنزيل الملفات المحددة", + "downloadAll": "تنزيل الكل", + "toggleTheme": "تبديل السِمة", + "language": "اللغة", + "search": "بحث في PDF", + "panMode": "وضع السحب", + "rotateLeft": "تدوير لليسار", + "rotateRight": "تدوير لليمين", + "toggleSidebar": "تبديل الشريط الجانبي" + }, + "search": { + "title": "بحث PDF", + "placeholder": "أدخل مصطلح البحث..." + }, + "guestBanner": { + "title": "أنت تستخدم Stirling PDF كضيف!", + "message": "أنشئ حسابًا مجانيًا لحفظ عملك، والوصول إلى مزيد من الميزات، ودعم المشروع.", + "dismiss": "إخفاء الشريط", + "signUp": "سجل مجانًا" + }, + "toolPicker": { + "searchPlaceholder": "ابحث عن الأدوات...", + "noToolsFound": "لم يتم العثور على أدوات", + "allTools": "كل الأدوات", + "quickAccess": "وصول سريع", + "categories": { + "standardTools": "أدوات قياسية", + "advancedTools": "أدوات متقدمة", + "recommendedTools": "أدوات موصى بها" + }, + "subcategories": { + "signing": "توقيع", + "documentSecurity": "أمان المستند", + "verification": "تحقق", + "documentReview": "مراجعة المستند", + "pageFormatting": "تنسيق الصفحات", + "extraction": "استخراج", + "removal": "إزالة", + "automation": "أتمتة", + "general": "عام", + "advancedFormatting": "تنسيق متقدم", + "developerTools": "أدوات المطوّر" + } }, "quickAccess": { - "sign": "توقيع" + "read": "قراءة", + "sign": "توقيع", + "automate": "أتمتة", + "files": "الملفات", + "activity": "النشاط", + "config": "الإعداد", + "allTools": "كل الأدوات" }, "fileUpload": { + "selectFile": "حدد ملفًا", + "selectFiles": "حدد ملفات", + "selectPdfToView": "حدد ملف PDF لعرضه", + "selectPdfToEdit": "حدد ملف PDF لتحريره", + "chooseFromStorage": "اختر ملفًا من التخزين أو ارفع PDF جديدًا", + "chooseFromStorageMultiple": "اختر ملفات من التخزين أو ارفع ملفات PDF جديدة", + "loadFromStorage": "التحميل من التخزين", + "filesAvailable": "ملفات متاحة", "loading": "جارٍ التحميل...", - "or": "أو" + "or": "أو", + "dropFileHere": "أسقط الملف هنا أو انقر للتحميل", + "dropFilesHere": "أسقط الملفات هنا أو انقر زر التحميل", + "pdfFilesOnly": "ملفات PDF فقط", + "supportedFileTypes": "أنواع الملفات المدعومة", + "upload": "تحميل", + "uploadFile": "تحميل ملف", + "uploadFiles": "تحميل ملفات", + "noFilesInStorage": "لا توجد ملفات في التخزين. ارفع بعض الملفات أولًا.", + "selectFromStorage": "الاختيار من التخزين", + "backToTools": "عودة إلى الأدوات", + "addFiles": "إضافة ملفات", + "dragFilesInOrClick": "اسحب الملفات أو انقر \"إضافة ملفات\" للتصفّح" }, "fileManager": { + "title": "تحميل ملفات PDF", + "subtitle": "أضف ملفاتك إلى التخزين للوصول إليها بسهولة عبر الأدوات", + "filesSelected": "ملفات محددة", + "clearSelection": "مسح التحديد", + "openInFileEditor": "فتح في محرر الملفات", + "uploadError": "فشل تحميل بعض الملفات.", + "failedToOpen": "فشل فتح الملف. ربما تمت إزالته من التخزين.", + "failedToLoad": "فشل تحميل الملف إلى المجموعة النشطة.", + "storageCleared": "مسح المتصفح التخزين. تمت إزالة الملفات. يرجى إعادة الرفع.", + "clearAll": "مسح الكل", + "reloadFiles": "إعادة تحميل الملفات", + "dragDrop": "اسحب وأفلت الملفات هنا", + "clickToUpload": "انقر لتحميل الملفات", + "selectedFiles": "الملفات المحددة", + "storage": "التخزين", + "filesStored": "ملفات مخزّنة", + "storageError": "حدث خطأ في التخزين", + "storageLow": "سعة التخزين توشك على النفاد. فكّر في إزالة الملفات القديمة.", + "supportMessage": "مدعوم بتخزين قاعدة بيانات المتصفح لسعة غير محدودة", + "noFileSelected": "لا توجد ملفات محددة", + "showHistory": "عرض السجلّ", + "hideHistory": "إخفاء السجلّ", + "fileHistory": "سجلّ الملف", + "loadingHistory": "جارٍ تحميل السجلّ...", + "lastModified": "آخر تعديل", + "toolChain": "الأدوات المطبّقة", + "restore": "استعادة", + "searchFiles": "ابحث في الملفات...", + "recent": "الأخيرة", + "localFiles": "الملفات المحلية", + "googleDrive": "Google Drive", + "googleDriveShort": "Drive", + "myFiles": "ملفاتي", + "noRecentFiles": "لم يتم العثور على ملفات حديثة", + "dropFilesHint": "أسقط الملفات هنا للتحميل", + "googleDriveNotAvailable": "تكامل Google Drive غير متاح", + "openFiles": "فتح ملفات", + "openFile": "فتح ملف", + "details": "تفاصيل الملف", "fileName": "الاسم", + "fileFormat": "الصيغة", + "fileSize": "الحجم", "fileVersion": "الإصدار", + "totalSelected": "الإجمالي المحدد", + "dropFilesHere": "أسقط الملفات هنا", "selectAll": "تحديد الكل", "deselectAll": "إلغاء تحديد الكل", "deleteSelected": "حذف المحدد", + "downloadSelected": "تنزيل المحدّد", + "selectedCount": "{{count}} محدد", "download": "تنزيل", - "delete": "حذف" + "delete": "حذف", + "unsupported": "غير مدعوم" + }, + "storage": { + "temporaryNotice": "تُخزَّن الملفات مؤقتًا في متصفحك وقد تُمسح تلقائيًا", + "storageLimit": "حدّ التخزين", + "storageUsed": "التخزين المؤقت المستخدم", + "storageFull": "التخزين يوشك على الامتلاء. فكّر في إزالة بعض الملفات.", + "fileTooLarge": "الملف كبير جدًا. الحد الأقصى للحجم لكل ملف هو", + "storageQuotaExceeded": "تم تجاوز حصة التخزين. يرجى إزالة بعض الملفات قبل رفع المزيد.", + "approximateSize": "الحجم التقريبي" }, "sanitize": { + "title": "تنقية", + "desc": "إزالة العناصر المحتملة الضرر من ملفات PDF.", "submit": "تنظيف PDF", + "completed": "اكتملت عملية التنقية بنجاح", + "error.generic": "فشلت عملية التنقية", + "error.failed": "حدث خطأ أثناء تنقية PDF.", + "filenamePrefix": "sanitised", + "sanitizationResults": "نتائج التنقية", "steps": { - "settings": "إعدادات" + "files": "الملفات", + "settings": "إعدادات", + "results": "النتائج" + }, + "files": { + "placeholder": "حدّد ملف PDF في العرض الرئيسي للبدء" + }, + "options": { + "title": "خيارات التنقية", + "note": "اختر العناصر التي تريد إزالتها من PDF. يجب اختيار خيار واحد على الأقل.", + "removeJavaScript.desc": "إزالة إجراءات JavaScript والسكريبتات من PDF", + "removeEmbeddedFiles.desc": "إزالة أي ملفات مضمّنة داخل PDF", + "removeXMPMetadata.desc": "إزالة بيانات XMP الوصفية من PDF", + "removeMetadata.desc": "إزالة معلومات بيانات المستند (العنوان، المؤلف، إلخ)", + "removeLinks.desc": "إزالة الروابط الخارجية وإجراءات التشغيل من PDF", + "removeFonts.desc": "إزالة الخطوط المضمّنة من PDF" + } + }, + "addPassword": { + "title": "إضافة كلمة مرور", + "desc": "قم بتشفير مستند PDF بكلمة مرور.", + "completed": "تم تطبيق حماية كلمة المرور", + "submit": "تشفير", + "filenamePrefix": "مشفر", + "error": { + "failed": "حدث خطأ أثناء تشفير PDF." + }, + "passwords": { + "stepTitle": "كلمات المرور والتشفير", + "completed": "تم ضبط كلمات المرور", + "user": { + "label": "كلمة مرور المستخدم", + "placeholder": "أدخل كلمة مرور المستخدم" + }, + "owner": { + "label": "كلمة مرور المالك", + "placeholder": "أدخل كلمة مرور المالك" + } + }, + "encryption": { + "keyLength": { + "label": "طول مفتاح التشفير", + "40bit": "40-بت (منخفض)", + "128bit": "128-بت (قياسي)", + "256bit": "256-بت (عالي)" + } + }, + "results": { + "title": "ملفات PDF المشفرة" + }, + "tooltip": { + "header": { + "title": "نظرة عامة على حماية كلمة المرور" + }, + "passwords": { + "title": "أنواع كلمات المرور", + "text": "تقيّد كلمة مرور المستخدم فتح المستند، بينما تتحكم كلمة مرور المالك فيما يمكن فعله بالمستند بعد فتحه. يمكنك تعيين كليهما أو واحدٍ منهما.", + "bullet1": "كلمة مرور المستخدم: مطلوبة لفتح ملف PDF", + "bullet2": "كلمة مرور المالك: تتحكم في أذونات المستند (قد لا تدعمها جميع عارضات PDF)" + }, + "encryption": { + "title": "مستويات التشفير", + "text": "توفّر مستويات التشفير الأعلى أمانًا أفضل، لكنها قد لا تكون مدعومة من عارضات PDF الأقدم.", + "bullet1": "40-بت: أمان أساسي، متوافق مع العارضين الأقدم", + "bullet2": "128-بت: أمان قياسي، مدعوم على نطاق واسع", + "bullet3": "256-بت: أقصى أمان، يتطلب عارضين حديثين" + }, + "permissions": { + "title": "تغيير الأذونات", + "text": "تتحكم هذه الأذونات فيما يمكن للمستخدمين فعله في PDF. تكون أكثر فاعلية عند دمجها مع كلمة مرور المالك." + } } }, "changePermissions": { "title": "تغيير الأذونات", + "desc": "غيّر قيود المستند وأذوناته.", + "completed": "تم تغيير الأذونات", "submit": "تغيير الأذونات", + "error": { + "failed": "حدث خطأ أثناء تغيير أذونات PDF." + }, "permissions": { "preventAssembly": { "label": "منع تجميع المستند" @@ -1737,10 +3248,195 @@ "label": "منع طباعة التنسيقات المختلفة" } }, + "results": { + "title": "ملفات PDF المعدَّلة" + }, "tooltip": { "header": { "title": "تغيير الأذونات" + }, + "description": { + "text": "يغيّر أذونات المستند، مما يسمح/يمنع الوصول إلى ميزات مختلفة في قارئات PDF." + }, + "warning": { + "text": "لجعل هذه الأذونات غير قابلة للتغيير، استخدم أداة إضافة كلمة مرور لتعيين كلمة مرور للمالك." } } - } + }, + "removePassword": { + "title": "إزالة كلمة المرور", + "desc": "إزالة الحماية بكلمة مرور من مستند PDF الخاص بك.", + "tags": "تأمين,فك التشفير,أمان,إزالة كلمة المرور,حذف كلمة المرور", + "password": { + "stepTitle": "إزالة كلمة المرور", + "label": "كلمة المرور الحالية", + "placeholder": "أدخل كلمة المرور الحالية", + "completed": "تم إعداد كلمة المرور" + }, + "filenamePrefix": "decrypted", + "error": { + "failed": "حدث خطأ أثناء إزالة كلمة المرور من PDF." + }, + "tooltip": { + "description": "إزالة حماية كلمة المرور تتطلب الكلمة المستخدمة لتشفير PDF. سيؤدي ذلك إلى فك تشفير المستند، مما يجعله متاحًا بدون كلمة مرور." + }, + "submit": "إزالة", + "results": { + "title": "ملفات PDF مُفككة التشفير" + } + }, + "automate": { + "title": "أتمتة", + "desc": "ابنِ مهامًا متعددة الخطوات عبر ربط إجراءات PDF. مثالي للمهام المتكررة.", + "invalidStep": "خطوة غير صالحة", + "files": { + "placeholder": "اختر ملفات لمعالجتها بهذه الأتمتة" + }, + "selection": { + "title": "اختيار الأتمتة", + "saved": { + "title": "المحفوظ" + }, + "createNew": { + "title": "إنشاء أتمتة جديدة" + }, + "suggested": { + "title": "المقترح" + } + }, + "creation": { + "createTitle": "إنشاء أتمتة", + "editTitle": "تحرير الأتمتة", + "intro": "تشغّل الأتمتات الأدوات بالتتابع. للبدء، أضف الأدوات بالترتيب الذي تريد تشغيلها.", + "name": { + "label": "اسم الأتمتة", + "placeholder": "أتمتتي" + }, + "description": { + "label": "الوصف (اختياري)", + "placeholder": "صِف ما تفعله هذه الأتمتة..." + }, + "tools": { + "selectTool": "اختر أداة...", + "selected": "الأدوات المحددة", + "remove": "إزالة الأداة", + "configure": "تهيئة الأداة", + "notConfigured": "! غير مُهيأ", + "addTool": "إضافة أداة", + "add": "أضف أداة..." + }, + "save": "حفظ الأتمتة", + "unsavedChanges": { + "title": "تغييرات غير محفوظة", + "message": "لديك تغييرات غير محفوظة. هل أنت متأكد أنك تريد الرجوع؟ ستُفقد كل التغييرات.", + "cancel": "إلغاء", + "confirm": "عودة" + }, + "icon": { + "label": "الأيقونة" + } + }, + "run": { + "title": "تشغيل الأتمتة" + }, + "sequence": { + "unnamed": "أتمتة بدون اسم", + "steps": "{{count}} خطوة", + "running": "جارٍ تشغيل الأتمتة...", + "run": "تشغيل الأتمتة", + "finish": "إنهاء" + }, + "reviewTitle": "نتائج الأتمتة", + "config": { + "loading": "جارٍ تحميل إعدادات الأداة...", + "noSettings": "لا تحتوي هذه الأداة على إعدادات قابلة للضبط.", + "title": "تهيئة {{toolName}}", + "description": "اضبط الإعدادات لهذه الأداة. ستُطبَّق عند تشغيل الأتمتة.", + "cancel": "إلغاء", + "save": "حفظ الإعدادات" + }, + "copyToSaved": "نسخ إلى المحفوظ" + }, + "automation": { + "suggested": { + "securePdfIngestion": "استيعاب PDF الآمن", + "securePdfIngestionDesc": "سير عمل شامل لمعالجة PDF ينظّف المستندات، ويطبّق OCR مع تنظيف، ويحوّل إلى PDF/A للأرشفة طويلة الأمد، ويُحسّن حجم الملف.", + "emailPreparation": "تحضير البريد الإلكتروني", + "emailPreparationDesc": "تحسّن PDFs للتوزيع عبر البريد الإلكتروني بضغط الملفات، وتقسيم المستندات الكبيرة إلى أجزاء 20MB للتوافق مع البريد، وإزالة البيانات الوصفية للخصوصية.", + "secureWorkflow": "سير عمل الأمان", + "secureWorkflowDesc": "يؤمّن مستندات PDF بإزالة المحتوى المحتمل الضرر مثل JavaScript والملفات المضمّنة، ثم يضيف حماية بكلمة مرور لمنع الوصول غير المصرح به. كلمة المرور الافتراضية 'password'.", + "processImages": "معالجة الصور", + "processImagesDesc": "تحوّل ملفات صور متعددة إلى ملف PDF واحد، ثم تطبّق تقنية OCR لاستخراج نص قابل للبحث من الصور." + } + }, + "common": { + "copy": "نسخ", + "copied": "تم النسخ!", + "refresh": "تحديث", + "retry": "إعادة المحاولة", + "remaining": "متبقّي", + "used": "مستخدم", + "available": "متاح", + "cancel": "إلغاء" + }, + "config": { + "account": { + "overview": { + "title": "إعدادات الحساب", + "manageAccountPreferences": "إدارة تفضيلات الحساب", + "guestDescription": "أنت مسجّل كضيف. فكّر في ترقية حسابك أعلاه." + }, + "upgrade": { + "title": "ترقية حساب الضيف", + "description": "اربط حسابك للحفاظ على تاريخك والوصول إلى مزيد من الميزات!", + "socialLogin": "الترقية بحساب اجتماعي", + "linkWith": "ربط مع", + "emailPassword": "أو أدخل بريدك وكلمة المرور", + "email": "البريد الإلكتروني", + "emailPlaceholder": "أدخل بريدك الإلكتروني", + "password": "كلمة المرور (اختياري)", + "passwordPlaceholder": "عيّن كلمة مرور", + "passwordNote": "اتركه فارغًا لاستخدام التحقق عبر البريد فقط", + "upgradeButton": "ترقية الحساب" + } + }, + "apiKeys": { + "description": "مفتاح API للوصول إلى مجموعة أدوات Stirling الخاصة بـ PDF. انسخه إلى مشروعك أو حدّثه لإنشاء مفتاح جديد.", + "publicKeyAriaLabel": "مفتاح API عام", + "copyKeyAriaLabel": "نسخ مفتاح API", + "refreshAriaLabel": "تحديث مفتاح API", + "includedCredits": "الأرصدة المشمولة", + "purchasedCredits": "أرصدة مشتراة", + "totalCredits": "إجمالي الأرصدة", + "chartAriaLabel": "استخدام الأرصدة: شُمِل {{includedUsed}} من {{includedTotal}}، المُشتَرى {{purchasedUsed}} من {{purchasedTotal}}", + "nextReset": "إعادة التعيين التالية", + "lastApiUse": "آخر استخدام لـ API", + "overlayMessage": "أنشئ مفتاحًا لعرض الأرصدة والأرصدة المتاحة", + "label": "مفتاح API", + "guestInfo": "لا يتلقى المستخدمون الضيوف مفاتيح API. أنشئ حسابًا للحصول على مفتاح API لاستخدامه في تطبيقاتك.", + "goToAccount": "الانتقال إلى الحساب", + "refreshModal": { + "title": "تحديث مفاتيح API", + "warning": "⚠️ تحذير: سيؤدي هذا الإجراء إلى إنشاء مفاتيح API جديدة وجعل المفاتيح السابقة غير صالحة.", + "impact": "أي تطبيقات أو خدمات تستخدم هذه المفاتيح ستتوقف عن العمل حتى تحدّثها بالمفاتيح الجديدة.", + "confirmPrompt": "هل أنت متأكد أنك تريد المتابعة؟", + "confirmCta": "تحديث المفاتيح" + }, + "generateError": "تعذّر علينا إنشاء مفتاح API." + } + }, + "AddAttachmentsRequest": { + "attachments": "اختر المرفقات", + "info": "اختر ملفات لإرفاقها بملف PDF الخاص بك. سيتم تضمين هذه الملفات وإتاحتها عبر لوحة مرفقات PDF.", + "selectFiles": "اختر ملفات للإرفاق", + "placeholder": "اختر ملفات...", + "addMoreFiles": "أضف مزيدًا من الملفات...", + "selectedFiles": "الملفات المحددة", + "submit": "إضافة المرفقات", + "results": { + "title": "نتائج المرفقات" + } + }, + "termsAndConditions": "الشروط والأحكام", + "logOut": "تسجيل الخروج" } \ 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 2234e8275..b7315b217 100644 --- a/frontend/public/locales/es-ES/translation.json +++ b/frontend/public/locales/es-ES/translation.json @@ -38,7 +38,7 @@ "save": "Guardar", "saveToBrowser": "Guardar en el navegador", "close": "Cerrar", - "filesSelected": "archivos seleccionados", + "filesSelected": "{{count}} archivos seleccionados", "noFavourites": "No se agregaron favoritos", "downloadComplete": "Descarga completada", "bored": "¿Aburrido de esperar?", diff --git a/frontend/public/locales/fr-FR/translation.json b/frontend/public/locales/fr-FR/translation.json index 98a964cc0..b4d390197 100644 --- a/frontend/public/locales/fr-FR/translation.json +++ b/frontend/public/locales/fr-FR/translation.json @@ -1,4 +1,10 @@ { + "unsavedChanges": "Vous avez des modifications non enregistrées sur votre PDF. Que souhaitez-vous faire ?", + "unsavedChangesTitle": "Modifications non enregistrées", + "keepWorking": "Continuer à travailler", + "discardChanges": "Ignorer les modifications", + "applyAndContinue": "Appliquer et continuer", + "exportAndContinue": "Exporter et continuer", "language": { "direction": "ltr" }, @@ -35,10 +41,28 @@ "true": "Vrai", "false": "Faux", "unknown": "Inconnu", + "app": { + "description": "L’alternative gratuite à Adobe Acrobat (10M+ téléchargements)" + }, "save": "Enregistrer", "saveToBrowser": "Enregistrer dans le navigateur", + "download": "Télécharger", + "undoOperationTooltip": "Cliquez pour annuler la dernière opération et restaurer les fichiers d’origine", + "undo": "Défaire", + "moreOptions": "Plus d’options", + "editYourNewFiles": "Modifier votre/vos nouveau(x) fichier(s)", "close": "Fermer", + "fileSelected": "Sélectionné : {{filename}}", + "chooseFile": "Choisir un fichier", "filesSelected": "fichiers sélectionnés", + "files": { + "title": "Fichiers", + "upload": "Téléverser", + "uploadFiles": "Téléverser des fichiers", + "addFiles": "Ajouter des fichiers", + "selectFromWorkbench": "Sélectionnez des fichiers depuis l’espace de travail ou ", + "selectMultipleFromWorkbench": "Sélectionnez au moins {{count}} fichiers depuis l’espace de travail ou " + }, "noFavourites": "Aucun favori ajouté", "downloadComplete": "Téléchargement terminé", "bored": "Marre d'attendre ?", @@ -56,7 +80,10 @@ }, "error": { "pdfPassword": "Le document PDF est protégé par un mot de passe qui n'a pas été fourni ou était incorrect", + "encryptedPdfMustRemovePassword": "Ce PDF est chiffré ou protégé par mot de passe. Veuillez le déverrouiller avant de convertir en PDF/A.", + "incorrectPasswordProvided": "Le mot de passe du PDF est incorrect ou non fourni.", "_value": "Erreur", + "dismissAllErrors": "Ignorer toutes les erreurs", "sorry": "Désolé pour ce problème !", "needHelp": "Besoin d'aide / Vous avez trouvé un problème ?", "contactTip": "Si vous avez encore des problèmes, n'hésitez pas à nous contacter pour obtenir de l'aide. Vous pouvez soumettre un ticket sur notre page GitHub ou nous contacter via Discord :", @@ -71,6 +98,10 @@ "githubSubmit": "GitHub - Créer un ticket", "discordSubmit": "Discord - Poster un message de demande d'assistance" }, + "warning": { + "tooltipTitle": "Avertissement" + }, + "edit": "Modifier", "delete": "Supprimer", "username": "Nom d'utilisateur", "password": "Mot de passe", @@ -82,6 +113,7 @@ "green": "Vert", "blue": "Bleu", "custom": "Personnalisé…", + "comingSoon": "Bientôt disponible", "WorkInProgess": "En cours de développement, merci de nous remonter les problèmes que vous pourriez constater!", "poweredBy": "Propulsé par", "yes": "Oui", @@ -115,12 +147,14 @@ "page": "Page", "pages": "Pages", "loading": "Chargement...", + "review": "Examiner", "addToDoc": "Ajouter au Document", "reset": "Réinitialiser", "apply": "Appliquer", "noFileSelected": "Aucun fichier sélectionné. Veuillez en télécharger un.", "legal": { "privacy": "Politique de Confidentialité", + "iAgreeToThe": "J’accepte l’ensemble des", "terms": "Conditions Générales", "accessibility": "Accessibilité", "cookie": "Politique des Cookies", @@ -332,291 +366,305 @@ "globalPopularity": "Popularité globale", "sortBy": "Trier par :", "multiTool": { + "tags": "multiple,outils", "title": "Outil multifonction PDF", "desc": "Fusionnez, faites pivoter, réorganisez et supprimez des pages." }, "merge": { + "tags": "fusionner,joindre,unir", "title": "Fusionner", "desc": "Fusionnez facilement plusieurs PDF en un seul." }, "split": { + "tags": "diviser,séparer,scinder", "title": "Diviser", "desc": "Divisez un PDF en plusieurs documents." }, "rotate": { + "tags": "tourner,retourner,orienter", "title": "Pivoter", "desc": "Faites pivoter facilement vos PDF." }, - "imageToPDF": { - "title": "Image en PDF", - "desc": "Convertissez une image (PNG, JPEG, GIF) en PDF." - }, - "pdfToImage": { - "title": "PDF en image", - "desc": "Convertissez un PDF en image (PNG, JPEG, GIF)." + "convert": { + "tags": "transformer,changer", + "title": "Convertir", + "desc": "Convertir des fichiers entre différents formats" }, "pdfOrganiser": { + "tags": "organiser,réorganiser,réordonner", "title": "Organiser", "desc": "Supprimez ou réorganisez les pages dans n'importe quel ordre." }, "addImage": { + "tags": "insérer,intégrer,placer", "title": "Ajouter une image", "desc": "Ajoutez une image à un emplacement défini sur un PDF." }, + "addAttachments": { + "tags": "intégrer,joindre,inclure", + "title": "Ajouter des pièces jointes", + "desc": "Ajouter ou supprimer des fichiers intégrés (pièces jointes) dans un PDF" + }, "watermark": { + "tags": "tampon,marque,superposition", "title": "Ajouter un filigrane", "desc": "Ajoutez un filigrane personnalisé à votre PDF." }, - "permissions": { - "title": "Modifier les permissions", - "desc": "Modifiez les permissions de votre PDF." + "removePassword": { + "tags": "déverrouiller", + "title": "Supprimer le mot de passe", + "desc": "Supprimez la protection par mot de passe de votre PDF." }, - "pageRemover": { + "compress": { + "tags": "réduire,compresser,optimiser", + "title": "Compresser", + "desc": "Compressez les PDF pour réduire leur tailles." + }, + "unlockPDFForms": { + "tags": "déverrouiller,activer,modifier", + "title": "Déverrouiller les formulaires PDF", + "desc": "Supprimer la propriété lecture seule des champs de formulaire dans un document PDF" + }, + "changeMetadata": { + "tags": "éditer,modifier,mettre à jour", + "title": "Modifier les métadonnées", + "desc": "Modifiez, supprimez ou ajoutez des métadonnées à un PDF." + }, + "ocr": { + "tags": "extraire,scanner", + "title": "OCR / Nettoyage des numérisations", + "desc": "Utilisez l'OCR pour analyser et détecter le texte des images d'un PDF et le rajouter en tant que tel." + }, + "extractImages": { + "tags": "extraire,sauver,exporter", + "title": "Extraire les images", + "desc": "Extrayez toutes les images d'un PDF et enregistrez-les dans un ZIP." + }, + "scannerImageSplit": { + "tags": "détecter,diviser,photos", + "title": "Détecter & scinder des photos scannées", + "desc": "Détecter et scinder des photos scannées en pages séparées" + }, + "sign": { + "tags": "signature,autographe", + "title": "Signer", + "desc": "Ajoutez une signature au PDF avec un dessin, du texte ou une image." + }, + "flatten": { + "tags": "simplifier,retirer,interactif", + "title": "Rendre inerte", + "desc": "Supprimez tous les éléments et formulaires interactifs d'un PDF." + }, + "certSign": { + "tags": "authentifier,PEM,P12,officiel,chiffrer,signer,certificat,PKCS12,JKS,serveur,manuel,auto", + "title": "Signer avec un certificat", + "desc": "Signez un PDF avec un certificat ou une clé (PEM/P12)." + }, + "repair": { + "tags": "corriger,restaurer", + "title": "Réparer", + "desc": "Essayez de réparer un PDF corrompu ou cassé." + }, + "removeBlanks": { + "tags": "supprimer,nettoyer,vider", + "title": "Supprimer les pages vierges", + "desc": "Détectez et supprimez les pages vierges d'un PDF." + }, + "removeAnnotations": { + "tags": "supprimer,nettoyer,retirer", + "title": "Supprimer les annotations", + "desc": "Supprimer tous les commentaires/annotations d'un PDF." + }, + "compare": { + "tags": "différence", + "title": "Comparer", + "desc": "Comparez et visualisez les différences entre deux PDF." + }, + "removeCertSign": { + "tags": "retirer,supprimer,déverrouiller", + "title": "Supprimer la signature par certificat", + "desc": "Supprimez la signature par certificat d'un PDF" + }, + "pageLayout": { + "tags": "mise en page,arranger,combiner", + "title": "Fusionner des pages", + "desc": "Fusionnez plusieurs pages d'un PDF en une seule." + }, + "bookletImposition": { + "tags": "livret,imprimer,reliure", + "title": "Imposition en livret", + "desc": "Créer des livrets avec un ordre de pages correct et une mise en page multi-pages pour l’impression et la reliure" + }, + "scalePages": { + "tags": "redimensionner,ajuster,mettre à l’échelle", + "title": "Ajuster l'échelle ou la taille", + "desc": "Modifiez la taille ou l'échelle d'une page et/ou de son contenu." + }, + "addPageNumbers": { + "tags": "numéro,pagination,compter", + "title": "Ajouter des numéros de page", + "desc": "Ajoutez des numéros de page dans un PDF à un emplacement défini." + }, + "autoRename": { + "tags": "détection automatique,basé-en-tête,organiser,renommer", + "title": "Renommer automatiquement le fichier PDF", + "desc": "Renomme automatiquement un fichier PDF sur la base de son en-tête détecté" + }, + "adjustContrast": { + "tags": "contraste,luminosité,saturation", + "title": "Ajuster les couleurs", + "desc": "Ajustez le contraste, la saturation et la luminosité d'un PDF." + }, + "crop": { + "tags": "rogner,couper,redimensionner", + "title": "Redimensionner", + "desc": "Redimensionnez un PDF pour réduire sa taille (en conservant le texte !)." + }, + "autoSplitPDF": { + "tags": "auto,diviser,QR", + "title": "Séparer automatiquement les pages", + "desc": "Séparez automatiquement le PDF numérisé avec le code QR du diviseur de page numérisé." + }, + "sanitize": { + "tags": "nettoyer,purger,retirer", + "title": "Assainir", + "desc": "Supprimer les éléments potentiellement nuisibles des fichiers PDF" + }, + "getPdfInfo": { + "tags": "info,métadonnées,détails", + "title": "Récupérer les informations", + "desc": "Récupérez toutes les informations possibles sur un PDF." + }, + "pdfToSinglePage": { + "tags": "combiner,fusionner,unique", + "title": "Fusionner en une seule page", + "desc": "Fusionnez toutes les pages PDF en une seule grande page." + }, + "showJS": { + "tags": "javascript,code,script", + "title": "Afficher le JavaScript", + "desc": "Recherche et affiche tout JavaScript injecté dans un PDF." + }, + "redact": { + "tags": "censurer,noircir,masquer", + "title": "Caviardage manuel", + "desc": "Caviarder un PDF en fonction de texte sélectionné, formes dessinées et/ou des pages sélectionnées." + }, + "overlayPdfs": { + "tags": "superposer,combiner,empiler", + "title": "Superposer des PDF", + "desc": "Superpose des PDF au-dessus d’un autre PDF" + }, + "splitBySections": { + "tags": "diviser,sections,scinder", + "title": "Diviser le PDF par sections", + "desc": "Diviser chaque page d’un PDF en plus petites sections horizontales et verticales" + }, + "addStamp": { + "tags": "tampon,marque,sceau", + "title": "Ajouter un tampon au PDF", + "desc": "Ajouter des tampons de texte ou d’image à des emplacements définis" + }, + "removeImage": { + "tags": "retirer,supprimer,nettoyer", + "title": "Supprimer les images", + "desc": "Supprimez les images d'un PDF pour réduire sa taille" + }, + "splitByChapters": { + "tags": "diviser,chapitres,structure", + "title": "Séparer un PDF par chapitres", + "desc": "Séparez un PDF en fichiers multiples en fonction de sa structure par chapitres." + }, + "validateSignature": { + "tags": "valider,vérifier,certificat", + "title": "Valider la signature du fichier PDF", + "desc": "Vérifier les signatures numériques et les certificats des documents PDF" + }, + "swagger": { + "tags": "API,documentation,test", + "title": "Documentation de l’API", + "desc": "Voir la documentation de l’API et tester les points de terminaison" + }, + "scannerEffect": { + "tags": "scanner,simuler,créer", + "title": "Effet scanner", + "desc": "Créer un PDF qui ressemble à un document scanné" + }, + "editTableOfContents": { + "tags": "signets,contenu,éditer", + "title": "Modifier la table des matières", + "desc": "Ajouter ou modifier les signets et la table des matières dans les documents PDF" + }, + "manageCertificates": { + "tags": "certificats,importer,exporter", + "title": "Gérer les certificats", + "desc": "Importer, exporter ou supprimer des fichiers de certificats numériques utilisés pour signer des PDF." + }, + "read": { + "tags": "voir,ouvrir,afficher", + "title": "Lire", + "desc": "Afficher et annoter des PDF. Surlignez du texte, dessinez ou insérez des commentaires pour l’examen et la collaboration." + }, + "reorganizePages": { + "tags": "réarranger,réordonner,organiser", + "title": "Réorganiser les pages", + "desc": "Réorganisez, dupliquez ou supprimez des pages PDF avec un contrôle visuel par glisser-déposer." + }, + "extractPages": { + "tags": "extraire,sélectionner,copier", + "title": "Extraire des pages", + "desc": "Extraire des pages spécifiques d’un document PDF" + }, + "removePages": { + "tags": "supprimer,extraire,exclure", "title": "Supprimer", "desc": "Supprimez les pages inutiles de votre PDF." }, + "autoSizeSplitPDF": { + "tags": "auto,diviser,taille", + "title": "Séparer automatiquement par taille/nombre", + "desc": "Séparer un PDF unique en plusieurs documents en fonction de la taille, du nombre de pages ou du nombre de documents." + }, + "replaceColor": { + "title": "Remplacer & Inverser la couleur", + "desc": "Remplacer ou inverser les couleurs dans les documents PDF" + }, + "devApi": { + "tags": "API,développement,documentation", + "title": "API", + "desc": "Lien vers la documentation de l’API" + }, + "devFolderScanning": { + "tags": "automatisation,dossier,analyse", + "title": "Analyse automatisée de dossiers", + "desc": "Lien vers le guide d’analyse de dossier automatisée" + }, + "devSsoGuide": { + "title": "Guide SSO", + "desc": "Lien vers le guide SSO" + }, + "devAirgapped": { + "title": "Installation isolée", + "desc": "Lien vers le guide d’installation isolée (air-gapped)" + }, "addPassword": { "title": "Ajouter un mot de passe", "desc": "Chiffrez votre PDF avec un mot de passe." }, - "removePassword": { - "title": "Supprimer le mot de passe", - "desc": "Supprimez la protection par mot de passe de votre PDF." - }, - "compress": { - "title": "Compresser", - "desc": "Compressez les PDF pour réduire leur tailles." - }, - "unlockPDFForms": { - "title": "Déverrouiller les formulaires PDF", - "desc": "Supprimer la propriété lecture seule des champs de formulaire dans un document PDF" - }, - "changeMetadata": { - "title": "Modifier les métadonnées", - "desc": "Modifiez, supprimez ou ajoutez des métadonnées à un PDF." - }, - "fileToPDF": { - "title": "Fichier en PDF", - "desc": "Convertissez presque n'importe quel fichier en PDF (DOCX, PNG, XLS, PPT, TXT, etc.)." - }, - "ocr": { - "title": "OCR / Nettoyage des numérisations", - "desc": "Utilisez l'OCR pour analyser et détecter le texte des images d'un PDF et le rajouter en tant que tel." - }, - "extractImages": { - "title": "Extraire les images", - "desc": "Extrayez toutes les images d'un PDF et enregistrez-les dans un ZIP." - }, - "pdfToPDFA": { - "title": "PDF en PDF/A", - "desc": "Convertir un PDF en PDF/A pour un stockage à long terme." - }, - "PDFToWord": { - "title": "PDF en Word", - "desc": "Convertissez un PDF en Word (DOC, DOCX et ODT)." - }, - "PDFToPresentation": { - "title": "PDF en formats de présentation", - "desc": "Convertissez un PDF en format de présentation (PPT, PPTX et ODP)." - }, - "PDFToText": { - "title": "PDF en RTF (texte)", - "desc": "Convertissez un PDF au format RTF (texte)." - }, - "PDFToHTML": { - "title": "PDF en HTML", - "desc": "Convertissez un PDF au format HTML." - }, - "PDFToXML": { - "title": "PDF en XML", - "desc": "Convertissez un PDF au format XML." - }, - "ScannerImageSplit": { - "title": "Diviser les photos numérisées", - "desc": "Divisez plusieurs photos à partir d'une photo ou d'un PDF." - }, - "sign": { - "title": "Signer", - "desc": "Ajoutez une signature au PDF avec un dessin, du texte ou une image." - }, - "flatten": { - "title": "Rendre inerte", - "desc": "Supprimez tous les éléments et formulaires interactifs d'un PDF." - }, - "repair": { - "title": "Réparer", - "desc": "Essayez de réparer un PDF corrompu ou cassé." - }, - "removeBlanks": { - "title": "Supprimer les pages vierges", - "desc": "Détectez et supprimez les pages vierges d'un PDF." - }, - "removeAnnotations": { - "title": "Supprimer les annotations", - "desc": "Supprimer tous les commentaires/annotations d'un PDF." - }, - "compare": { - "title": "Comparer", - "desc": "Comparez et visualisez les différences entre deux PDF." - }, - "certSign": { - "title": "Signer avec un certificat", - "desc": "Signez un PDF avec un certificat ou une clé (PEM/P12)." - }, - "removeCertSign": { - "title": "Supprimer la signature par certificat", - "desc": "Supprimez la signature par certificat d'un PDF" - }, - "pageLayout": { - "title": "Fusionner des pages", - "desc": "Fusionnez plusieurs pages d'un PDF en une seule." - }, - "scalePages": { - "title": "Ajuster l'échelle ou la taille", - "desc": "Modifiez la taille ou l'échelle d'une page et/ou de son contenu." - }, - "pipeline": { - "title": "Pipeline", - "desc": "Exécutez plusieurs actions sur les PDF en définissant des scripts de pipeline." - }, - "addPageNumbers": { - "title": "Ajouter des numéros de page", - "desc": "Ajoutez des numéros de page dans un PDF à un emplacement défini." - }, - "auto-rename": { - "title": "Renommer automatiquement", - "desc": "Renommez automatiquement un fichier PDF en fonction de son en-tête détecté." - }, - "adjustContrast": { - "title": "Ajuster les couleurs", - "desc": "Ajustez le contraste, la saturation et la luminosité d'un PDF." - }, - "crop": { - "title": "Redimensionner", - "desc": "Redimensionnez un PDF pour réduire sa taille (en conservant le texte !)." - }, - "autoSplitPDF": { - "title": "Séparer automatiquement les pages", - "desc": "Séparez automatiquement le PDF numérisé avec le code QR du diviseur de page numérisé." - }, - "sanitizePDF": { - "title": "Assainir", - "desc": "Supprimez les scripts et autres éléments des PDF." - }, - "URLToPDF": { - "title": "URL en PDF", - "desc": "Convertissez n'importe quelle URL http(s) en PDF." - }, - "HTMLToPDF": { - "title": "HTML en PDF", - "desc": "Convertissez n'importe quel fichier HTML ou ZIP en PDF." - }, - "MarkdownToPDF": { - "title": "Markdown en PDF", - "desc": "Convertissez n'importe quel fichier Markdown en PDF." - }, - "PDFToMarkdown": { - "title": "PDF en Markdown", - "desc": "Convertissez n'importe quel fichier PDF en Markdown." - }, - "getPdfInfo": { - "title": "Récupérer les informations", - "desc": "Récupérez toutes les informations possibles sur un PDF." - }, - "pageExtracter": { - "title": "Extraire des pages", - "desc": "Extrayez certaines pages du PDF." - }, - "pdfToSinglePage": { - "title": "Fusionner en une seule page", - "desc": "Fusionnez toutes les pages PDF en une seule grande page." - }, - "showJS": { - "title": "Afficher le JavaScript", - "desc": "Recherche et affiche tout JavaScript injecté dans un PDF." - }, - "autoRedact": { - "title": "Caviardage automatique", - "desc": "Caviardez automatiquement les informations sensibles d'un PDF." - }, - "redact": { - "title": "Caviardage manuel", - "desc": "Caviarder un PDF en fonction de texte sélectionné, formes dessinées et/ou des pages sélectionnées." - }, - "PDFToCSV": { - "title": "PDF en CSV", - "desc": "Extrait les tableaux d'un PDF et les transforme en CSV." - }, - "split-by-size-or-count": { - "title": "Séparer automatiquement par taille/nombre", - "desc": "Séparer un PDF unique en plusieurs documents en fonction de la taille, du nombre de pages ou du nombre de documents." - }, - "overlay-pdfs": { - "title": "Incrustation de PDF", - "desc": "Incrustation d'un PDF sur un autre PDF." - }, - "split-by-sections": { - "title": "Séparer un PDF en sections", - "desc": "Diviser chaque page d'un PDF en sections horizontales/verticales plus petites." - }, - "AddStampRequest": { - "title": "Ajouter un tampon sur un PDF", - "desc": "Ajouter un texte ou l'image d'un tampon à un emplacement défini." - }, - "removeImage": { - "title": "Supprimer les images", - "desc": "Supprimez les images d'un PDF pour réduire sa taille" - }, - "splitByChapters": { - "title": "Séparer un PDF par chapitres", - "desc": "Séparez un PDF en fichiers multiples en fonction de sa structure par chapitres." - }, - "validateSignature": { - "title": "Valider la signature du fichier PDF", - "desc": "Vérifier les signatures numériques et les certificats des documents PDF" - }, - "replace-color": { - "title": "Remplacer et Inverser Couleur", - "desc": "Remplacer la couleur pour le texte et l'arrière-plan dans le PDF et inverser la couleur complète du PDF pour réduire la taille du fichier" - }, - "convert": { - "title": "Convertir" - }, - "attachments": { - "title": "Ajouter des pièces jointes", - "desc": "Ajouter ou supprimer des fichiers intégrés (pièces jointes) dans un PDF" - }, - "editTableOfContents": { - "title": "Modifier la table des matières", - "desc": "Ajouter ou modifier les signets et la table des matières dans les documents PDF" - }, - "extractPages": { - "title": "Extraire des pages" - }, - "removePages": { - "title": "Supprimer", - "desc": "Supprimez les pages inutiles de votre PDF." - }, - "removeImagePdf": { - "title": "Supprimer les images", - "desc": "Supprimez les images d'un PDF pour réduire sa taille" - }, - "autoSizeSplitPDF": { - "title": "Séparer automatiquement par taille/nombre", - "desc": "Séparer un PDF unique en plusieurs documents en fonction de la taille, du nombre de pages ou du nombre de documents." - }, - "adjust-contrast": { - "title": "Ajuster les couleurs", - "desc": "Ajustez le contraste, la saturation et la luminosité d'un PDF." - }, - "replaceColorPdf": { - "title": "Remplacer et Inverser Couleur", - "desc": "Remplacer la couleur pour le texte et l'arrière-plan dans le PDF et inverser la couleur complète du PDF pour réduire la taille du fichier" - }, "changePermissions": { - "title": "Modifier les permissions" + "title": "Modifier les permissions", + "desc": "Modifier les restrictions et permissions du document" + }, + "automate": { + "tags": "workflow,séquence,automatisation", + "title": "Automatiser", + "desc": "Créez des workflows multi-étapes en enchaînant des actions PDF. Idéal pour les tâches récurrentes." } }, + "landing": { + "addFiles": "Ajouter des fichiers", + "uploadFromComputer": "Téléverser depuis l’ordinateur" + }, "viewPdf": { "tags": "visualiser,lire,annoter,texte,image", "title": "Afficher/modifier un PDF", @@ -650,51 +698,244 @@ "merge": { "tags": "fusionner,opérations sur les pages,backend,server side,merge", "title": "Fusionner", - "header": "Fusionner plusieurs PDF", - "sortByName": "Trier par nom", - "sortByDate": "Trier par date", - "removeCertSign": "Supprimer la signature numérique dans le fichier fusionné ?", + "removeDigitalSignature.tooltip": { + "title": "Supprimer la signature numérique", + "description": "Les signatures numériques seront invalidées lors de la fusion. Cochez ceci pour les supprimer du PDF final." + }, + "generateTableOfContents.tooltip": { + "title": "Générer une table des matières", + "description": "Crée automatiquement une table des matières cliquable dans le PDF fusionné à partir des noms de fichiers d’origine et des numéros de page." + }, "submit": "Fusionner", "sortBy": { - "filename": "Nom du Fichier" + "description": "Les fichiers seront fusionnés dans l’ordre de sélection. Faites glisser pour réorganiser ou triez ci-dessous.", + "label": "Trier par", + "filename": "Nom du Fichier", + "dateModified": "Date de modification", + "ascending": "Croissant", + "descending": "Décroissant", + "sort": "Trier" + }, + "error": { + "failed": "Une erreur est survenue lors de la fusion des PDF." } }, "split": { - "tags": "opérations sur les pages,diviser,plusieurs pages,cut,server side,divide", "title": "Diviser", "header": "Diviser", "desc": { "1": "Les numéros que vous sélectionnez sont le numéro de page sur lequel vous souhaitez faire une division", "2": "Ainsi, la sélection de 1,3,7-9 diviserait un document de 10 pages en 6 PDF distincts avec :", - "3": "Document #1: Page 1", + "3": "Document n°1 : Page 1", "4": "Document #2: Page 2 et 3", "5": "Document #3: Page 4, 5, 6 et 7", - "6": "Document #4: Page 8", - "7": "Document #5: Page 9", - "8": "Document #6: Page 10" + "6": "Document n°4 : Page 8", + "7": "Document n°5 : Page 9", + "8": "Document n°6 : Page 10" }, "splitPages": "Pages sur lesquelles diviser", "submit": "Diviser", "steps": { + "chooseMethod": "Choisir la méthode", "settings": "Paramètres" }, + "settings": { + "selectMethodFirst": "Veuillez d’abord sélectionner une méthode de fractionnement" + }, + "error": { + "failed": "Une erreur est survenue lors du fractionnement du PDF." + }, + "method": { + "label": "Choisir la méthode de fractionnement", + "placeholder": "Sélectionnez comment fractionner le PDF" + }, "methods": { + "prefix": { + "splitAt": "Fractionner à", + "splitBy": "Fractionner par" + }, + "byPages": { + "name": "Numéros de page", + "desc": "Extraire des pages spécifiques (1,3,5-10)", + "tooltip": "Saisissez des numéros de page séparés par des virgules ou des plages avec des tirets" + }, + "bySections": { + "name": "Sections", + "desc": "Diviser les pages en sections de grille", + "tooltip": "Scinder chaque page en sections horizontales et verticales" + }, "bySize": { - "name": "Taille du Fichier" + "name": "Taille du Fichier", + "desc": "Limiter la taille maximale du fichier", + "tooltip": "Spécifiez la taille maximale du fichier (p. ex. 10MB, 500KB)" + }, + "byPageCount": { + "name": "Nombre de pages", + "desc": "Nombre fixe de pages par fichier", + "tooltip": "Saisissez le nombre de pages pour chaque fichier" + }, + "byDocCount": { + "name": "Nombre de documents", + "desc": "Créer un nombre spécifique de fichiers", + "tooltip": "Indiquez combien de fichiers vous souhaitez créer" + }, + "byChapters": { + "name": "Chapitres", + "desc": "Fractionner aux limites des signets", + "tooltip": "Utilise les signets du PDF pour déterminer les points de coupure" + }, + "byPageDivider": { + "name": "Feuille séparatrice", + "desc": "Fractionnement automatique avec feuilles séparatrices", + "tooltip": "Utilisez des feuilles séparatrices QR entre les documents lors de la numérisation" } }, "value": { "fileSize": { - "label": "Taille du Fichier" + "label": "Taille du Fichier", + "placeholder": "p. ex., 10MB, 500KB" + }, + "pageCount": { + "label": "Pages par fichier", + "placeholder": "p. ex., 5, 10" + }, + "docCount": { + "label": "Nombre de fichiers", + "placeholder": "p. ex., 3, 5" + } + }, + "tooltip": { + "header": { + "title": "Aperçu des méthodes de fractionnement" + }, + "byPages": { + "title": "Fractionner aux numéros de page", + "text": "Fractionnez votre PDF à des numéros de page spécifiques. « n » fractionne après la page n. « n-m » fractionne avant la page n et après la page m.", + "bullet1": "Points uniques : 3,7 (fractionne après les pages 3 et 7)", + "bullet2": "Plages : 3-8 (fractionne avant la page 3 et après la page 8)", + "bullet3": "Mixte : 2,5-10,15 (fractionne après la page 2, avant la page 5, après la page 10 et après la page 15)" + }, + "bySections": { + "title": "Fractionner par sections de grille", + "text": "Divisez chaque page en une grille de sections. Utile pour scinder des documents multi-colonnes ou extraire des zones spécifiques.", + "bullet1": "Horizontal : nombre de lignes à créer", + "bullet2": "Vertical : nombre de colonnes à créer", + "bullet3": "Fusionner : combiner toutes les sections en un PDF" + }, + "bySize": { + "title": "Fractionner par taille de fichier", + "text": "Créez plusieurs PDF qui ne dépassent pas une taille de fichier spécifiée. Idéal pour les limites de taille ou les pièces jointes e-mail.", + "bullet1": "Utilisez MB pour les fichiers plus volumineux (p. ex., 10MB)", + "bullet2": "Utilisez KB pour les plus petits fichiers (p. ex., 500KB)", + "bullet3": "Le système fractionnera aux limites de page" + }, + "byCount": { + "title": "Fractionner par comptage", + "text": "Créez plusieurs PDF avec un nombre spécifique de pages ou de documents chacun.", + "bullet1": "Nombre de pages : nombre fixe de pages par fichier", + "bullet2": "Nombre de documents : nombre fixe de fichiers en sortie", + "bullet3": "Utile pour des workflows en lot" + }, + "byChapters": { + "title": "Fractionner par chapitres", + "text": "Utilisez les signets du PDF pour fractionner automatiquement aux limites des chapitres. Nécessite des PDF avec une structure de signets.", + "bullet1": "Niveau de signet : niveau sur lequel fractionner (1 = niveau supérieur)", + "bullet2": "Inclure les métadonnées : préserver les propriétés du document", + "bullet3": "Autoriser les doublons : gérer les noms de signets répétés" } } }, "rotate": { - "tags": "pivoter,server side,rotate", "title": "Pivoter", - "header": "Pivoter", - "selectAngle": "Angle de rotation (par multiples de 90 degrés)", - "submit": "Pivoter" + "submit": "Pivoter", + "error": { + "failed": "Une erreur est survenue lors de la rotation du PDF." + }, + "preview": { + "title": "Aperçu de la rotation" + }, + "rotateLeft": "Pivoter dans le sens antihoraire", + "rotateRight": "Pivoter dans le sens horaire", + "tooltip": { + "header": { + "title": "Aperçu des paramètres de rotation" + }, + "description": { + "text": "Faites pivoter les pages de votre PDF dans le sens horaire ou antihoraire par incréments de 90 degrés. Toutes les pages du PDF seront pivotées. L’aperçu montre l’aspect de votre document après rotation." + }, + "controls": { + "title": "Contrôles", + "text": "Utilisez les boutons de rotation pour ajuster l’orientation. Le bouton gauche fait pivoter dans le sens antihoraire, le bouton droit dans le sens horaire. Chaque clic tourne de 90 degrés." + } + } + }, + "convert": { + "title": "Convertir", + "desc": "Convertir des fichiers entre différents formats", + "files": "Fichiers", + "selectFilesPlaceholder": "Sélectionnez des fichiers dans la vue principale pour commencer", + "settings": "Paramètres", + "conversionCompleted": "Conversion terminée", + "results": "Résultats", + "defaultFilename": "fichier_converti", + "conversionResults": "Résultats de la conversion", + "convertFrom": "Convertir depuis", + "convertTo": "Convertir vers", + "sourceFormatPlaceholder": "Format source", + "targetFormatPlaceholder": "Format cible", + "selectSourceFormatFirst": "Sélectionnez d’abord un format source", + "outputOptions": "Options de sortie", + "pdfOptions": "Options PDF", + "imageOptions": "Options d’image", + "colorType": "Type de couleur", + "color": "Couleur", + "greyscale": "Niveaux de gris", + "blackwhite": "Noir et blanc", + "dpi": "DPI", + "output": "Sortie", + "single": "Unique", + "multiple": "Multiple", + "fitOption": "Option d’ajustement", + "maintainAspectRatio": "Conserver les proportions", + "fitDocumentToPage": "Ajuster le document à la page", + "fillPage": "Remplir la page", + "autoRotate": "Rotation automatique", + "autoRotateDescription": "Fait pivoter automatiquement les images pour mieux s’adapter à la page PDF", + "combineImages": "Combiner les images", + "combineImagesDescription": "Combiner toutes les images dans un seul PDF, ou créer des PDF séparés pour chaque image", + "webOptions": "Options Web vers PDF", + "zoomLevel": "Niveau de zoom", + "emailOptions": "Options e-mail vers PDF", + "includeAttachments": "Inclure les pièces jointes de l’e-mail", + "maxAttachmentSize": "Taille maximale de pièce jointe (Mo)", + "includeAllRecipients": "Inclure les destinataires CC et CCI dans l’en-tête", + "downloadHtml": "Télécharger le fichier HTML intermédiaire au lieu du PDF", + "pdfaOptions": "Options PDF/A", + "outputFormat": "Format de sortie", + "pdfaNote": "PDF/A-1b est plus compatible, PDF/A-2b prend en charge davantage de fonctionnalités.", + "pdfaDigitalSignatureWarning": "Le PDF contient une signature numérique. Elle sera supprimée dans l'étape suivante.", + "fileFormat": "Format de fichier", + "wordDoc": "Document Word", + "wordDocExt": "Document Word (.docx)", + "odtExt": "Texte OpenDocument (.odt)", + "pptExt": "PowerPoint (.pptx)", + "odpExt": "Présentation OpenDocument (.odp)", + "txtExt": "Texte brut (.txt)", + "rtfExt": "Rich Text Format (.rtf)", + "selectedFiles": "Fichiers sélectionnés", + "noFileSelected": "Aucun fichier sélectionné. Utilisez le panneau de fichiers pour ajouter des fichiers.", + "convertFiles": "Convertir les fichiers", + "converting": "Conversion…", + "downloadConverted": "Télécharger le fichier converti", + "errorNoFiles": "Veuillez sélectionner au moins un fichier à convertir.", + "errorNoFormat": "Veuillez sélectionner à la fois les formats source et cible.", + "errorNotSupported": "La conversion de {{from}} vers {{to}} n’est pas prise en charge.", + "images": "Images", + "officeDocs": "Documents Office (Word, Excel, PowerPoint)", + "imagesExt": "Images (JPG, PNG, etc.)", + "markdown": "Markdown", + "textRtf": "Texte/RTF", + "grayscale": "Niveaux de gris" }, "imageToPdf": { "tags": "pdf,conversion,img,jpg,image,photo" @@ -734,6 +975,19 @@ "10": "Méger Impair-Pair", "11": "Dupliquer toutes les pages" }, + "desc": { + "CUSTOM": "Utiliser une séquence personnalisée de numéros de page ou d’expressions pour définir un nouvel ordre.", + "REVERSE_ORDER": "Inverser le document afin que la dernière page devienne la première, et ainsi de suite.", + "DUPLEX_SORT": "Entrelacer faces avant puis faces arrière comme si un scanner duplex avait scanné toutes les faces avant, puis toutes les faces arrière (1, n, 2, n-1, …).", + "BOOKLET_SORT": "Arranger les pages pour l’impression en livret (dernière, première, deuxième, avant-dernière, …).", + "SIDE_STITCH_BOOKLET_SORT": "Arranger les pages pour l’impression de livret à piqûre latérale (optimisé pour une reliure sur le côté).", + "ODD_EVEN_SPLIT": "Scinder le document en deux sorties : toutes les pages impaires et toutes les pages paires.", + "ODD_EVEN_MERGE": "Fusionner deux PDF en alternant les pages : impaires du premier, paires du second.", + "DUPLICATE": "Dupliquer chaque page en fonction du nombre indiqué dans l’ordre personnalisé (p. ex., 4 duplique chaque page 4×).", + "REMOVE_FIRST": "Supprimer la première page du document.", + "REMOVE_LAST": "Supprimer la dernière page du document.", + "REMOVE_FIRST_AND_LAST": "Supprimer la première et la dernière pages du document." + }, "placeholder": "(par exemple 1,3,2 ou 4-8,2,10-12 ou 2n-1)" }, "addImage": { @@ -744,33 +998,190 @@ "upload": "Télécharger une image", "submit": "Ajouter une image" }, + "attachments": { + "tags": "intégrer,joindre,fichier,pièce,jointe,embed,attach,file,attachment,attachments", + "title": "Ajouter des pièces jointes", + "header": "Ajouter des pièces jointes", + "add": "Ajouter une pièce jointe", + "remove": "Supprimer la pièce jointe", + "embed": "Intégrer la pièce jointe", + "submit": "Ajouter des pièces jointes" + }, "watermark": { - "tags": "texte,filigrane,label,propriété,droit d'auteur,marque déposée,img,jpg,image,photo,copyright,trademark", "title": "Ajouter un filigrane", - "header": "Ajouter un filigrane", - "customColor": "Couleur de texte personnalisée", - "selectText": { - "1": "PDF auquel ajouter un filigrane", - "2": "Texte du filigrane", - "3": "Taille de police", - "4": "Rotation (de 0 à 360 degrés)", - "5": "Width Spacer (espace entre chaque filigrane horizontalement)", - "6": "Height Spacer (espace entre chaque filigrane verticalement)", - "7": "Opacité (de 0% à 100%)", - "8": "Type de filigrane", - "9": "Image du filigrane", - "10": "Convertir le PDF en PDF-Image" - }, + "desc": "Ajouter des filigranes texte ou image aux fichiers PDF", + "completed": "Filigrane ajouté", "submit": "Ajouter un filigrane", - "type": { - "1": "Texte", - "2": "Image" + "filenamePrefix": "watermarked", + "error": { + "failed": "Une erreur est survenue lors de l’ajout du filigrane au PDF." }, "watermarkType": { - "text": "Texte" + "text": "Texte", + "image": "Image" }, "settings": { - "fontSize": "Taille de Police" + "type": "Type de filigrane", + "text": { + "label": "Texte du filigrane", + "placeholder": "Saisir le texte du filigrane" + }, + "image": { + "label": "Image de filigrane", + "choose": "Choisir une image", + "selected": "Sélectionné : {{filename}}" + }, + "fontSize": "Taille de Police", + "size": "Taille", + "alphabet": "Police/langue", + "color": "Couleur du filigrane", + "rotation": "Rotation (degrés)", + "opacity": "Opacité (%)", + "spacing": { + "horizontal": "Espacement horizontal", + "vertical": "Espacement vertical" + }, + "convertToImage": "Aplatir les pages PDF en images" + }, + "alphabet": { + "roman": "Romain/latin", + "arabic": "Arabe", + "japanese": "Japonais", + "korean": "Coréen", + "chinese": "Chinois", + "thai": "Thaï" + }, + "steps": { + "type": "Type de filigrane", + "wording": "Libellé", + "textStyle": "Style", + "formatting": "Mise en forme", + "file": "Fichier à filigraner" + }, + "results": { + "title": "Résultats du filigrane" + }, + "tooltip": { + "language": { + "title": "Prise en charge des langues", + "text": "Choisissez le paramètre de langue approprié pour garantir un rendu correct des polices de votre texte." + }, + "appearance": { + "title": "Paramètres d’apparence", + "text": "Contrôlez l’apparence de votre filigrane et sa fusion avec le document.", + "bullet1": "Rotation : -360° à 360° pour des filigranes inclinés", + "bullet2": "Opacité : 0–100 % pour contrôler la transparence", + "bullet3": "Une opacité faible crée des filigranes discrets" + }, + "spacing": { + "title": "Contrôle de l’espacement", + "text": "Ajustez l’espacement entre les filigranes répétés sur la page.", + "bullet1": "Espacement en largeur : distance horizontale entre les filigranes", + "bullet2": "Espacement en hauteur : distance verticale entre les filigranes", + "bullet3": "Des valeurs plus élevées créent des motifs plus espacés" + }, + "type": { + "header": { + "title": "Sélection du type de filigrane" + }, + "description": { + "title": "Choisissez votre filigrane", + "text": "Sélectionnez des filigranes texte ou image selon vos besoins." + }, + "text": { + "title": "Filigranes texte", + "text": "Parfait pour ajouter des mentions de copyright, noms d’entreprise ou labels de confidentialité. Prend en charge plusieurs langues et des couleurs personnalisées.", + "bullet1": "Polices et langues personnalisables", + "bullet2": "Couleurs et transparence réglables", + "bullet3": "Idéal pour du texte juridique ou de marque" + }, + "image": { + "title": "Filigranes image", + "text": "Utilisez des logos, tampons ou toute image comme filigrane. Idéal pour l’image de marque et l’identification visuelle.", + "bullet1": "Téléversez n’importe quel format d’image", + "bullet2": "Préserve la qualité de l’image", + "bullet3": "Parfait pour les logos et tampons" + } + }, + "wording": { + "header": { + "title": "Contenu du texte" + }, + "text": { + "title": "Texte du filigrane", + "text": "Saisissez le texte qui apparaîtra comme filigrane sur l’ensemble du document.", + "bullet1": "Restez concis pour une meilleure lisibilité", + "bullet2": "Exemples courants : « CONFIDENTIEL », « BROUILLON », nom de l’entreprise", + "bullet3": "Les caractères emoji ne sont pas pris en charge et seront filtrés" + } + }, + "textStyle": { + "header": { + "title": "Style du texte" + }, + "color": { + "title": "Sélection de la couleur", + "text": "Choisissez une couleur offrant un bon contraste avec le contenu du document.", + "bullet1": "Gris clair (#d3d3d3) pour des filigranes discrets", + "bullet2": "Noir ou couleurs foncées pour un fort contraste", + "bullet3": "Couleurs personnalisées pour l’image de marque" + }, + "language": { + "title": "Prise en charge des langues", + "text": "Choisissez le paramètre de langue approprié pour garantir un rendu correct des polices." + } + }, + "file": { + "header": { + "title": "Téléversement d’image" + }, + "upload": { + "title": "Sélection d’image", + "text": "Téléversez une image à utiliser comme filigrane.", + "bullet1": "Formats courants pris en charge : PNG, JPG, GIF, BMP", + "bullet2": "Le PNG avec transparence est idéal", + "bullet3": "Des images à plus haute résolution conservent mieux la qualité" + }, + "recommendations": { + "title": "Bonnes pratiques", + "text": "Conseils pour des filigranes image optimaux.", + "bullet1": "Utilisez des logos ou tampons avec arrière-plan transparent", + "bullet2": "Les designs simples fonctionnent mieux que les images complexes", + "bullet3": "Tenez compte de la taille finale du document pour choisir la résolution" + } + }, + "formatting": { + "header": { + "title": "Mise en forme et disposition" + }, + "size": { + "title": "Contrôle de la taille", + "text": "Ajustez la taille de votre filigrane (texte ou image).", + "bullet1": "Des tailles plus grandes rendent les filigranes plus visibles" + }, + "appearance": { + "title": "Paramètres d’apparence", + "text": "Contrôlez l’apparence de votre filigrane et sa fusion avec le document.", + "bullet1": "Rotation : -360° à 360° pour des filigranes inclinés", + "bullet2": "Opacité : 0–100 % pour contrôler la transparence", + "bullet3": "Une opacité faible crée des filigranes discrets" + }, + "spacing": { + "title": "Contrôle de l’espacement", + "text": "Ajustez l’espacement entre les filigranes répétés sur la page.", + "bullet1": "Espacement horizontal : distance entre les filigranes de gauche à droite", + "bullet2": "Espacement vertical : distance entre les filigranes de haut en bas", + "bullet3": "Des valeurs plus élevées créent des motifs plus espacés" + }, + "security": { + "title": "Option de sécurité", + "text": "Convertir le PDF final en format basé sur l’image pour une sécurité renforcée.", + "bullet1": "Empêche la sélection et la copie de texte", + "bullet2": "Rend les filigranes plus difficiles à supprimer", + "bullet3": "Entraîne des fichiers plus volumineux", + "bullet4": "Idéal pour le contenu sensible ou protégé par droit d’auteur" + } + } } }, "permissions": { @@ -795,50 +1206,148 @@ "removePages": { "tags": "supprimer,remove,delete", "title": "Supprimer", + "pageNumbers": { + "label": "Pages à supprimer", + "placeholder": "p. ex., 1,3,5-8,10", + "error": "Format de numéro de page invalide. Utilisez des nombres, des plages (1-5) ou des expressions mathématiques (2n+1)" + }, + "filenamePrefix": "pages_removed", + "files": { + "placeholder": "Sélectionnez un fichier PDF dans la vue principale pour commencer" + }, + "settings": { + "title": "Paramètres" + }, + "tooltip": { + "header": { + "title": "Paramètres de suppression de pages" + }, + "pageNumbers": { + "title": "Sélection de pages", + "text": "Spécifiez quelles pages supprimer de votre PDF. Vous pouvez sélectionner des pages individuelles, des plages ou utiliser des expressions mathématiques.", + "bullet1": "Pages individuelles : 1,3,5 (supprime les pages 1, 3 et 5)", + "bullet2": "Plages de pages : 1-5,10-15 (supprime les pages 1-5 et 10-15)", + "bullet3": "Mathématique : 2n+1 (supprime les pages impaires)", + "bullet4": "Plages ouvertes : 5- (supprime de la page 5 à la fin)" + }, + "examples": { + "title": "Exemples courants", + "text": "Voici des modèles courants de sélection de pages :", + "bullet1": "Supprimer la première page : 1", + "bullet2": "Supprimer les 3 dernières pages : -3", + "bullet3": "Supprimer une page sur deux : 2n", + "bullet4": "Supprimer des pages dispersées spécifiques : 1,5,10,15" + }, + "safety": { + "title": "Conseils de sécurité", + "text": "Points importants à considérer lors de la suppression de pages :", + "bullet1": "Prévisualisez toujours votre sélection avant traitement", + "bullet2": "Conservez une sauvegarde de votre fichier original", + "bullet3": "Les numéros de page commencent à 1, pas 0", + "bullet4": "Les numéros de page invalides seront ignorés" + } + }, + "error": { + "failed": "Une erreur est survenue lors de la suppression des pages." + }, + "results": { + "title": "Résultats de suppression de pages" + }, "submit": "Supprimer" }, - "addPassword": { - "tags": "ajouter,sécurité,mot de passe,secure,security", - "title": "Ajouter un mot de passe", - "header": "Ajouter un mot de passe", - "selectText": { - "1": "PDF à chiffrer", - "2": "Mot de passe de l'utilisateur", - "3": "Longueur de la clé de chiffrement", - "4": "Les valeurs plus élevées sont plus fortes, mais les valeurs plus faibles ont une meilleure compatibilité.", - "5": "Autorisations à définir (utilisation recommandée avec le mot de passe du propriétaire)", - "6": "Empêcher l'assemblage du document", - "7": "Empêcher l'extraction de contenu", - "8": "Empêcher l'extraction pour l'accessibilité", - "9": "Empêcher de remplir les formulaires", - "10": "Empêcher la modification", - "11": "Empêcher la modification des annotations", - "12": "Empêcher l'impression", - "13": "Empêcher l'impression des différents formats", - "14": "Mot de passe du propriétaire", - "15": "Restreint ce qui peut être fait avec le document une fois qu'il est ouvert (non pris en charge par tous les lecteurs).", - "16": "Restreint l'ouverture du document lui-même." - }, - "submit": "Chiffrer", + "pageSelection": { "tooltip": { - "permissions": { - "title": "Modifier les permissions" + "header": { + "title": "Guide de sélection des pages" + }, + "basic": { + "title": "Utilisation de base", + "text": "Sélectionnez des pages spécifiques de votre PDF à l’aide d’une syntaxe simple.", + "bullet1": "Pages individuelles : 1,3,5", + "bullet2": "Plages de pages : 3-6 ou 10-15", + "bullet3": "Toutes les pages : all" + }, + "advanced": { + "title": "Fonctionnalités avancées" + }, + "tips": { + "title": "Conseils", + "text": "Gardez ces consignes à l’esprit :", + "bullet1": "Les numéros de page commencent à 1 (pas 0)", + "bullet2": "Les espaces sont automatiquement supprimés", + "bullet3": "Les expressions invalides sont ignorées" + }, + "syntax": { + "title": "Principes de base de la syntaxe", + "text": "Utilisez des nombres, des plages, des mots-clés et des progressions (n commence à 0). Les parenthèses sont prises en charge.", + "bullets": { + "numbers": "Nombres/plages : 5, 10-20", + "keywords": "Mots-clés : odd, even", + "progressions": "Progressions : 3n, 4n+1" + } + }, + "operators": { + "title": "Opérateurs", + "text": "ET a une priorité plus élevée que la virgule. NON s’applique dans l’intervalle du document.", + "and": "ET : & ou « and » — exige les deux conditions (p. ex. : 1-50 & even)", + "comma": "Virgule : , ou | — combine les sélections (p. ex. : 1-10, 20)", + "not": "NON : ! ou « not » — exclut des pages (p. ex. : 3n & not 30)" + }, + "examples": { + "title": "Exemples" } } }, - "removePassword": { - "tags": "supprimer,sécurité,mot de passe,secure,decrypt,security,unpassword,delete password", - "title": "Supprimer le mot de passe", - "header": "Supprimer le mot de passe", - "selectText": { - "1": "Sélectionnez le PDF", - "2": "Mot de passe" + "bulkSelection": { + "header": { + "title": "Guide de sélection des pages" }, - "submit": "Supprimer", - "desc": "Supprimez la protection par mot de passe de votre PDF.", - "password": { - "stepTitle": "Supprimer le mot de passe", - "label": "Mot de passe actuel" + "syntax": { + "title": "Principes de base de la syntaxe", + "text": "Utilisez des nombres, des plages, des mots-clés et des progressions (n commence à 0). Les parenthèses sont prises en charge.", + "bullets": { + "numbers": "Nombres/plages : 5, 10-20", + "keywords": "Mots-clés : impair, pair", + "progressions": "Progressions : 3n, 4n+1" + } + }, + "operators": { + "title": "Opérateurs", + "text": "ET a une priorité plus élevée que la virgule. NON s’applique dans l’intervalle du document.", + "and": "ET : & ou « and » — exige les deux conditions (p. ex. : 1-50 & even)", + "comma": "Virgule : , ou | — combine les sélections (p. ex. : 1-10, 20)", + "not": "NON : ! ou « not » — exclut des pages (p. ex. : 3n & not 30)" + }, + "examples": { + "title": "Exemples", + "first50": "Premières 50", + "last50": "Dernières 50", + "every3rd": "Toutes les 3", + "oddWithinExcluding": "Impaires dans 1-20 en excluant 5-7", + "combineSets": "Combiner les ensembles" + }, + "firstNPages": { + "title": "Premières N pages", + "placeholder": "Nombre de pages" + }, + "lastNPages": { + "title": "Dernières N pages", + "placeholder": "Nombre de pages" + }, + "everyNthPage": { + "title": "Toutes les N pages", + "placeholder": "Pas" + }, + "range": { + "title": "Plage", + "fromPlaceholder": "De", + "toPlaceholder": "À" + }, + "keywords": { + "title": "Mots-clés" + }, + "advanced": { + "title": "Avancé" } }, "compressPdfs": { @@ -848,28 +1357,141 @@ "tags": "supprimer,propriété,déverrouiller,formulaire,champs,lecture,remove,delete,form,field,readonly", "title": "Supprimer la lecture seule des champs de formulaire", "header": "Déverrouiller les formulaires PDF", - "submit": "Remove" + "submit": "Remove", + "description": "Cet outil supprimera les restrictions en lecture seule des champs de formulaires PDF, les rendant modifiables et remplissables.", + "filenamePrefix": "unlocked_forms", + "files": { + "placeholder": "Sélectionnez un fichier PDF dans la vue principale pour commencer" + }, + "error": { + "failed": "Une erreur est survenue lors du déverrouillage des formulaires PDF." + }, + "results": { + "title": "Résultats des formulaires déverrouillés" + } }, "changeMetadata": { - "tags": "métadonnées,titre,auteur,date,création,heure,éditeur,statistiques,title,author,date,creation,time,publisher,producer,stats,metadata", - "title": "Titre", "header": "Modifier les métadonnées", - "selectText": { - "1": "Veuillez modifier les variables que vous souhaitez modifier.", - "2": "Supprimer toutes les métadonnées", - "3": "Afficher des métadonnées personnalisées", - "4": "Autres métadonnées", - "5": "Ajouter une entrée de métadonnées personnalisée" + "submit": "Modifier", + "filenamePrefix": "metadata", + "settings": { + "title": "Paramètres des métadonnées" }, - "author": "Auteur", - "creationDate": "Date de création (yyyy/MM/dd HH:mm:ss)", - "creator": "Créateur", - "keywords": "Mots clés", - "modDate": "Date de modification (yyyy/MM/dd HH:mm:ss)", - "producer": "Producteur", - "subject": "Sujet", - "trapped": "Recouvrement (technique d'impression)", - "submit": "Modifier" + "standardFields": { + "title": "Champs standard" + }, + "deleteAll": { + "label": "Supprimer les métadonnées existantes", + "checkbox": "Supprimer toutes les métadonnées" + }, + "title": { + "label": "Titre", + "placeholder": "Titre du document" + }, + "author": { + "label": "Auteur", + "placeholder": "Auteur du document" + }, + "subject": { + "label": "Sujet", + "placeholder": "Sujet du document" + }, + "keywords": { + "label": "Mots-clés", + "placeholder": "Mots-clés du document" + }, + "creator": { + "label": "Créateur", + "placeholder": "Créateur du document" + }, + "producer": { + "label": "Producteur", + "placeholder": "Producteur du document" + }, + "dates": { + "title": "Champs de date" + }, + "creationDate": { + "label": "Date de création", + "placeholder": "Date de création" + }, + "modificationDate": { + "label": "Date de modification", + "placeholder": "Date de modification" + }, + "trapped": { + "label": "État de piégeage", + "unknown": "Unknown", + "true": "True", + "false": "False" + }, + "advanced": { + "title": "Options avancées" + }, + "customFields": { + "title": "Métadonnées personnalisées", + "description": "Ajoutez des champs de métadonnées personnalisés au document", + "add": "Ajouter un champ", + "key": "Clé", + "keyPlaceholder": "Clé personnalisée", + "value": "Valeur", + "valuePlaceholder": "Valeur personnalisée", + "remove": "Supprimer" + }, + "results": { + "title": "PDF mis à jour" + }, + "error": { + "failed": "Une erreur est survenue lors de la modification des métadonnées du PDF." + }, + "tooltip": { + "header": { + "title": "Aperçu des métadonnées PDF" + }, + "standardFields": { + "title": "Champs standard", + "text": "Champs de métadonnées PDF courants décrivant le document.", + "bullet1": "Titre : nom ou en-tête du document", + "bullet2": "Auteur : personne ayant créé le document", + "bullet3": "Sujet : brève description du contenu", + "bullet4": "Mots-clés : termes de recherche du document", + "bullet5": "Créateur/Producteur : logiciel utilisé pour créer le PDF" + }, + "dates": { + "title": "Champs de date", + "text": "Quand le document a été créé et modifié.", + "bullet1": "Date de création : quand le document original a été créé", + "bullet2": "Date de modification : quand il a été modifié pour la dernière fois" + }, + "options": { + "title": "Options supplémentaires", + "text": "Champs personnalisés et contrôles de confidentialité.", + "bullet1": "Métadonnées personnalisées : ajoutez vos propres paires clé-valeur", + "bullet2": "État de piégeage : réglage d’impression haute qualité", + "bullet3": "Tout supprimer : supprime toutes les métadonnées pour la confidentialité" + }, + "deleteAll": { + "title": "Supprimer les métadonnées existantes", + "text": "Suppression complète des métadonnées pour garantir la confidentialité." + }, + "customFields": { + "title": "Métadonnées personnalisées", + "text": "Ajoutez vos propres paires clé-valeur de métadonnées.", + "bullet1": "Ajoutez tous les champs personnalisés utiles à votre document", + "bullet2": "Exemples : Département, Projet, Version, Statut", + "bullet3": "La clé et la valeur sont requises pour chaque entrée" + }, + "advanced": { + "title": "Options avancées", + "trapped": { + "title": "État de piégeage", + "description": "Indique si le document est préparé pour une impression de haute qualité.", + "bullet1": "True : le document a été piégé pour l’impression", + "bullet2": "False : le document n’a pas été piégé", + "bullet3": "Unknown : l’état de piégeage n’est pas spécifié" + } + } + } }, "fileToPDF": { "tags": "convertion,transformation,format,document,image,slide,texte,conversion,office,docs,word,excel,powerpoint", @@ -883,6 +1505,7 @@ "ocr": { "tags": "ocr,reconnaissance,texte,image,numérisation,scan,read,identify,detection,editable", "title": "OCR / Nettoyage des numérisations", + "desc": "Utilisez l'OCR pour analyser et détecter le texte des images d'un PDF et le rajouter en tant que tel.", "header": "OCR (Reconnaissance optique de caractères) / Nettoyage des numérisations", "selectText": { "1": "Langues à détecter dans le PDF (celles listées sont celles actuellement détectées)", @@ -901,22 +1524,85 @@ "help": "Veuillez lire cette documentation pour savoir comment utiliser l'OCR pour d'autres langues ou une utilisation hors Docker :", "credit": "Ce service utilise qpdf et Tesseract pour l'OCR.", "submit": "Traiter", - "desc": "Utilisez l'OCR pour analyser et détecter le texte des images d'un PDF et le rajouter en tant que tel.", + "operation": { + "submit": "Traiter l’OCR et relire" + }, + "results": { + "title": "Résultats OCR" + }, + "languagePicker": { + "additionalLanguages": "Vous cherchez d’autres langues ?", + "viewSetupGuide": "Voir le guide d’installation →" + }, "settings": { "title": "Paramètres", "ocrMode": { - "label": "Mode OCR" + "label": "Mode OCR", + "auto": "Auto (ignorer les calques de texte)", + "force": "Forcer (re-OCR de tout, remplacer le texte)", + "strict": "Strict (abandonner si du texte est trouvé)" }, "languages": { - "label": "Langues" + "label": "Langues", + "placeholder": "Sélectionner des langues" + }, + "compatibilityMode": { + "label": "Mode de compatibilité" + }, + "advancedOptions": { + "label": "Options de traitement", + "sidecar": "Créer un fichier texte", + "deskew": "Redresser les pages", + "clean": "Nettoyer le fichier d’entrée", + "cleanFinal": "Nettoyer la sortie finale" } }, "tooltip": { + "header": { + "title": "Aperçu des paramètres OCR" + }, "mode": { - "title": "Mode OCR" + "title": "Mode OCR", + "text": "La reconnaissance optique de caractères (OCR) vous aide à transformer des pages scannées ou capturées en texte que vous pouvez rechercher, copier ou surligner.", + "bullet1": "Auto ignore les pages contenant déjà des calques de texte.", + "bullet2": "Forcer ré-exécute l’OCR sur chaque page et remplace tout le texte.", + "bullet3": "Strict s’arrête si du texte sélectionnable est trouvé." }, "languages": { - "title": "Langues" + "title": "Langues", + "text": "Améliorez la précision de l’OCR en spécifiant les langues attendues. Choisissez une ou plusieurs langues pour guider la détection." + }, + "output": { + "title": "Sortie", + "text": "Décidez du format de sortie du texte :", + "bullet1": "Le PDF consultable intègre le texte derrière l’image d’origine.", + "bullet2": "HOCR XML renvoie un fichier structuré lisible par machine.", + "bullet3": "Le sidecar texte crée un fichier .txt séparé avec le contenu brut." + }, + "advanced": { + "header": { + "title": "Traitement OCR avancé" + }, + "compatibility": { + "title": "Mode de compatibilité", + "text": "Utilise le mode OCR « sandwich PDF » : produit des fichiers plus volumineux, mais plus fiables avec certaines langues et anciens logiciels PDF. Par défaut nous utilisons hOCR pour des PDF modernes plus légers." + }, + "sidecar": { + "title": "Créer un fichier texte", + "text": "Génère un fichier .txt séparé à côté du PDF contenant tout le texte extrait pour un accès et un traitement facilités." + }, + "deskew": { + "title": "Redresser les pages", + "text": "Corrige automatiquement les pages inclinées pour améliorer la précision de l’OCR. Utile pour les documents scannés mal alignés." + }, + "clean": { + "title": "Nettoyer le fichier d’entrée", + "text": "Prétraite l’entrée en supprimant le bruit, en améliorant le contraste et en optimisant l’image pour une meilleure reconnaissance OCR avant traitement." + }, + "cleanFinal": { + "title": "Nettoyer la sortie finale", + "text": "Post-traite le PDF final en supprimant les artefacts d’OCR et en optimisant le calque de texte pour une meilleure lisibilité et une taille de fichier plus petite." + } } } }, @@ -926,7 +1612,13 @@ "header": "Extraire les images", "selectText": "Format d'image dans lequel convertir les images extraites", "allowDuplicates": "Enregistrer les images dupliquées", - "submit": "Extraire" + "submit": "Extraire", + "settings": { + "title": "Paramètres" + }, + "error": { + "failed": "Une erreur est survenue lors de l’extraction des images du PDF." + } }, "pdfToPDFA": { "tags": "convertion,archive,long-term,standard,conversion,storage,préservation,preservation", @@ -998,17 +1690,53 @@ }, "info": "Python n'est pas installé. Il est nécessaire pour le fonctionnement." }, + "scannerImageSplit": { + "title": "Images extraites", + "submit": "Extraire les photos scannées", + "error": { + "failed": "Une erreur est survenue lors de l’extraction des photos scannées." + }, + "tooltip": { + "title": "Séparateur de photos", + "whatThisDoes": "Ce que fait cet outil", + "whatThisDoesDesc": "Détecte et extrait automatiquement chaque photo d’une page scannée ou d’une image composite — sans recadrage manuel.", + "whenToUse": "Quand l’utiliser", + "useCase1": "Numériser des pages d’album entières en une fois", + "useCase2": "Scinder des lots de platine en fichiers séparés", + "useCase3": "Découper des collages en photos individuelles", + "useCase4": "Extraire des photos depuis des documents", + "quickFixes": "Correctifs rapides", + "problem1": "Photos non détectées → augmentez la Tolérance à 30-50", + "problem2": "Trop de fausses détections → augmentez la Zone minimale à 15 000-20 000", + "problem3": "Recadrages trop serrés → augmentez la Taille de bordure à 5-10", + "problem4": "Photos inclinées non redressées → baissez le Seuil d’angle à ~5°", + "problem5": "Boîtes de poussière/bruit → augmentez la Zone de contour minimale à 1000-2000", + "setupTips": "Conseils de configuration", + "tip1": "Utilisez un fond uni et clair", + "tip2": "Laissez un petit espace (≈ 1 cm) entre les photos", + "tip3": "Numérisez à 300-600 DPI", + "tip4": "Nettoyez la vitre du scanner", + "headsUp": "À savoir", + "headsUpDesc": "Des photos qui se chevauchent ou des arrière-plans très proches en couleur des photos peuvent réduire la précision — essayez un fond plus clair ou plus sombre et laissez plus d’espace." + } + }, "sign": { - "tags": "signer,authorize,initials,drawn-signature,text-sign,image-signature", "title": "Signer", "header": "Signer", "upload": "Télécharger une image", - "draw": "Dessiner une signature", - "text": "Saisir de texte", + "draw": { + "title": "Dessinez votre signature", + "clear": "Effacer" + }, + "text": { + "name": "Nom du signataire", + "placeholder": "Saisissez votre nom complet" + }, "clear": "Effacer", "add": "Ajouter", "saved": "Sceaux enregistrées", "save": "Enregistrer le sceau", + "applySignatures": "Appliquer les signatures", "personalSigs": "Sceaux personnels", "sharedSigs": "Sceaux partagés", "noSavedSigs": "Aucun sceau enregistré trouvé", @@ -1020,42 +1748,157 @@ "previous": "Page précédente", "maintainRatio": "Conserver les proportions", "undo": "Défaire", - "redo": "Refaire" + "redo": "Refaire", + "submit": "Signer le document", + "steps": { + "configure": "Configurer la signature" + }, + "type": { + "title": "Type de signature", + "draw": "Dessiner", + "canvas": "Canvas", + "image": "Image", + "text": "Texte" + }, + "image": { + "label": "Téléverser une image de signature", + "placeholder": "Sélectionner un fichier image", + "hint": "Téléversez une image PNG ou JPG de votre signature" + }, + "instructions": { + "title": "Comment ajouter une signature" + }, + "activate": "Activer le placement de signature", + "deactivate": "Arrêter le placement de signatures", + "results": { + "title": "Résultats de signature" + }, + "error": { + "failed": "Une erreur est survenue lors de la signature du PDF." + } }, "flatten": { - "tags": "inerte,static,deactivate,non-interactive,streamline", "title": "Rendre inerte", "header": "Rendre inerte", "flattenOnlyForms": "Aplatir uniquement les formulaires", "submit": "Rendre inerte", + "filenamePrefix": "flattened", + "files": { + "placeholder": "Sélectionnez un fichier PDF dans la vue principale pour commencer" + }, "steps": { "settings": "Paramètres" }, "options": { - "flattenOnlyForms": "Aplatir uniquement les formulaires" + "stepTitle": "Options d’aplatissement", + "title": "Options d’aplatissement", + "flattenOnlyForms.desc": "Aplatir uniquement les champs de formulaire, en laissant les autres éléments interactifs intacts", + "note": "L’aplatissement supprime les éléments interactifs du PDF, les rendant non modifiables." + }, + "results": { + "title": "Résultats de l’aplatissement" + }, + "error": { + "failed": "Une erreur est survenue lors de l’aplatissement du PDF." + }, + "tooltip": { + "header": { + "title": "À propos de l’aplatissement des PDF" + }, + "description": { + "title": "Que fait l’aplatissement ?", + "text": "L’aplatissement rend votre PDF non modifiable en transformant les formulaires remplissables et les boutons en texte et images ordinaires. Le PDF aura exactement le même aspect, mais personne ne pourra plus modifier ou remplir les formulaires. Parfait pour partager des formulaires complétés, créer des documents finaux pour archivage, ou garantir un rendu identique partout.", + "bullet1": "Les zones de texte deviennent du texte normal (non modifiable)", + "bullet2": "Les cases à cocher et boutons deviennent des images", + "bullet3": "Idéal pour les versions finales que vous ne voulez pas modifier", + "bullet4": "Assure une apparence cohérente sur tous les appareils" + }, + "formsOnly": { + "title": "Que signifie « Aplatir uniquement les formulaires » ?", + "text": "Cette option supprime uniquement la possibilité de remplir des formulaires, mais conserve les autres fonctionnalités comme les liens cliquables, les signets et les commentaires.", + "bullet1": "Les formulaires deviennent non modifiables", + "bullet2": "Les liens fonctionnent toujours au clic", + "bullet3": "Les commentaires et notes restent visibles", + "bullet4": "Les signets aident toujours à naviguer" + } } }, "repair": { "tags": "réparer,restaurer,corriger,récupérer,fix,restore,correction,recover", "title": "Réparer", "header": "Réparer", - "submit": "Réparer" + "submit": "Réparer", + "description": "Cet outil tentera de réparer des fichiers PDF corrompus ou endommagés. Aucun paramètre supplémentaire n’est requis.", + "filenamePrefix": "repaired", + "files": { + "placeholder": "Sélectionnez un fichier PDF dans la vue principale pour commencer" + }, + "error": { + "failed": "Une erreur est survenue lors de la réparation du PDF." + }, + "results": { + "title": "Résultats de la réparation" + } }, "removeBlanks": { - "tags": "pages vierges,supprimer,nettoyer,cleanup,streamline,non-content,organize", "title": "Supprimer les pages vierges", "header": "Supprimer les pages vierges", - "threshold": "Seuil de blancheur des pixels", - "thresholdDesc": "Seuil pour déterminer à quel point un pixel blanc doit être blanc pour être classé comme « blanc » (0 = noir, 255 = blanc pur).", - "whitePercent": "Pourcentage de blanc", - "whitePercentDesc": "Pourcentage de la page qui doit contenir des pixels « blancs » à supprimer.", + "settings": { + "title": "Paramètres" + }, + "threshold": { + "label": "Seuil de blancheur des pixels" + }, + "whitePercent": { + "label": "Seuil de pourcentage de blanc", + "unit": "%" + }, + "includeBlankPages": { + "label": "Inclure les pages vides détectées" + }, + "tooltip": { + "header": { + "title": "Paramètres de suppression des pages blanches" + }, + "threshold": { + "title": "Seuil de blancheur des pixels", + "text": "Contrôle à quel point un pixel doit être blanc pour être considéré comme « blanc ». Aide à déterminer ce qui compte comme zone vide sur la page.", + "bullet1": "0 = Noir pur (le plus restrictif)", + "bullet2": "128 = Gris moyen", + "bullet3": "255 = Blanc pur (le moins restrictif)" + }, + "whitePercent": { + "title": "Seuil de pourcentage de blanc", + "text": "Définit le pourcentage minimal de pixels blancs requis pour qu’une page soit considérée comme blanche et supprimée.", + "bullet1": "Valeurs faibles (p. ex., 80 %) = Plus de pages supprimées", + "bullet2": "Valeurs élevées (p. ex., 95 %) = Seules les pages très blanches sont supprimées", + "bullet3": "Utilisez des valeurs élevées pour les documents à fond clair" + }, + "includeBlankPages": { + "title": "Inclure les pages vides détectées", + "text": "Lorsqu’il est activé, crée un PDF séparé contenant toutes les pages vides détectées et supprimées du document d’origine.", + "bullet1": "Utile pour passer en revue ce qui a été supprimé", + "bullet2": "Aide à vérifier l’exactitude de la détection", + "bullet3": "Peut être désactivé pour réduire la taille du fichier de sortie" + } + }, "submit": "Supprimer les pages vierges" }, "removeAnnotations": { "tags": "commentaires,supprimer,annotations,highlight,notes,markup,remove", "title": "Supprimer les annotations", "header": "Supprimer les annotations", - "submit": "Supprimer" + "submit": "Supprimer", + "settings": { + "title": "Paramètres" + }, + "info": { + "title": "À propos de Supprimer les annotations", + "description": "Cet outil supprimera toutes les annotations (commentaires, surlignages, notes, etc.) de vos documents PDF." + }, + "error": { + "failed": "Une erreur est survenue lors de la suppression des annotations du PDF." + } }, "compare": { "tags": "comparer,analyser,differentiate,contrast,changes,analysis", @@ -1087,28 +1930,140 @@ "certSign": { "tags": "signer,chiffrer,certificat,authenticate,PEM,P12,official,encrypt", "title": "Signer avec un certificat", - "header": "Signer avec un certificat (Travail en cours)", - "selectPDF": "PDF à signer", - "jksNote": "Note: Si votre type de certificat n'est pas listé ci-dessous, merci de le convertir en fichier Java Keystore (.jks) en utilisant l'outil en ligne de commande keytool. Puis choisissez l'option Fichier .jks ci-dessous.", - "selectKey": "Fichier de clé privée (format PKCS#8, peut être .pem ou .der)", - "selectCert": "Fichier de certificat (format X.509, peut être .pem ou .der)", - "selectP12": "Fichier keystore de clés PKCS#12 (.p12 ou .pfx) (facultatif, s'il n'est fourni, il doit contenir votre clé privée et votre certificat)", - "selectJKS": "Sélectionner votre fichier Java Keystore File (.jks or .keystore):", - "certType": "Type de certificat", - "password": "Mot de passe keystore ou clé privée le cas échéant", - "showSig": "Afficher la signature", - "reason": "Raison", - "location": "Emplacement", - "name": "Nom", - "showLogo": "Afficher le logo", - "submit": "Signer" + "filenamePrefix": "signed", + "signMode": { + "stepTitle": "Mode de signature", + "tooltip": { + "header": { + "title": "À propos des signatures PDF" + }, + "overview": { + "title": "Fonctionnement des signatures", + "text": "Les deux modes scellent le document (toute modification est signalée comme une altération) et enregistrent qui/quand/comment pour l’audit. La confiance affichée par le lecteur dépend de la chaîne de certificats." + }, + "manual": { + "title": "Manuel – Utiliser votre certificat", + "text": "Utilisez vos propres fichiers de certificat pour une identité alignée à votre marque. Peut afficher Fiable lorsque votre AC/chaîne est reconnue.", + "use": "À utiliser pour : relation client, juridique, conformité." + }, + "auto": { + "title": "Auto – Sceau système instantané, sans configuration", + "text": "Signe avec un certificat auto-signé par le serveur. Même sceau anti-altération et journal d’audit ; s’affiche généralement comme Non vérifié dans les lecteurs.", + "use": "À utiliser lorsque : vous avez besoin de rapidité et d’une identité interne cohérente pour les revues et dossiers." + }, + "rule": { + "title": "Règle générale", + "text": "Besoin du statut Fiable côté destinataire ? Manuel. Besoin d’un sceau anti-altération rapide avec traçabilité sans configuration ? Auto." + } + } + }, + "certTypeStep": { + "stepTitle": "Format du certificat" + }, + "certFiles": { + "stepTitle": "Fichiers de certificat" + }, + "appearance": { + "stepTitle": "Apparence de la signature", + "tooltip": { + "header": { + "title": "À propos de l’apparence de la signature" + }, + "invisible": { + "title": "Signatures invisibles", + "text": "La signature est ajoutée au PDF pour la sécurité mais n’est pas visible à l’affichage. Parfait pour répondre aux exigences légales sans modifier l’apparence du document.", + "bullet1": "Fournit de la sécurité sans changement visuel", + "bullet2": "Répond aux exigences légales de signature numérique", + "bullet3": "N’affecte pas la mise en page ou le design du document" + }, + "visible": { + "title": "Signatures visibles", + "text": "Affiche un bloc de signature sur le PDF avec votre nom, la date et des détails optionnels. Utile lorsque vous voulez que les lecteurs voient clairement que le document est signé.", + "bullet1": "Affiche le nom du signataire et la date sur le document", + "bullet2": "Peut inclure la raison et le lieu de signature", + "bullet3": "Choisissez la page où placer la signature", + "bullet4": "Logo facultatif" + } + } + }, + "sign": { + "submit": "Signer le PDF", + "results": "PDF signé" + }, + "error": { + "failed": "Une erreur est survenue lors du traitement des signatures." + }, + "tooltip": { + "header": { + "title": "À propos de la gestion des signatures" + }, + "overview": { + "title": "Que peut faire cet outil ?", + "text": "Cet outil vous permet de vérifier si vos PDF sont signés numériquement et d’ajouter de nouvelles signatures. Les signatures numériques prouvent l’auteur ou l’approbateur d’un document et indiquent s’il a été modifié depuis la signature.", + "bullet1": "Vérifiez les signatures existantes et leur validité", + "bullet2": "Affichez des informations détaillées sur les signataires et certificats", + "bullet3": "Ajoutez de nouvelles signatures numériques pour sécuriser vos documents", + "bullet4": "Plusieurs fichiers pris en charge avec navigation facilitée" + }, + "validation": { + "title": "Vérification des signatures", + "text": "Lors de la vérification des signatures, l’outil indique si elles sont valides, qui a signé le document, quand il a été signé et s’il a été modifié depuis.", + "bullet1": "Indique si les signatures sont valides ou invalides", + "bullet2": "Affiche les informations sur le signataire et la date de signature", + "bullet3": "Vérifie si le document a été modifié après la signature", + "bullet4": "Peut utiliser des certificats personnalisés pour la vérification" + }, + "signing": { + "title": "Ajout de signatures", + "text": "Pour signer un PDF, vous avez besoin d’un certificat numérique (comme PEM, PKCS12 ou JKS). Vous pouvez choisir d’afficher la signature sur le document ou de la garder invisible pour la sécurité uniquement.", + "bullet1": "Prend en charge les formats PEM, PKCS12, JKS et le certificat serveur", + "bullet2": "Option pour afficher ou masquer la signature sur le PDF", + "bullet3": "Ajoutez la raison, le lieu et le nom du signataire", + "bullet4": "Choisissez la page où placer les signatures visibles", + "bullet5": "Utilisez le certificat serveur pour l’option simple « Signer avec Stirling-PDF »" + } + }, + "certType": { + "tooltip": { + "header": { + "title": "À propos des types de certificats" + }, + "what": { + "title": "Qu’est-ce qu’un certificat ?", + "text": "C’est une identité sécurisée pour votre signature qui prouve que vous avez signé. Sauf obligation de signer via certificat, nous recommandons d’utiliser une autre méthode sécurisée comme Taper, Dessiner ou Importer." + }, + "which": { + "title": "Quelle option utiliser ?", + "text": "Choisissez le format correspondant à votre fichier de certificat :", + "bullet1": "PKCS#12 (.p12 / .pfx) – un fichier combiné (le plus courant)", + "bullet2": "PFX (.pfx) – version Microsoft de PKCS12", + "bullet3": "PEM – fichiers .pem séparés pour la clé privée et le certificat", + "bullet4": "JKS – keystore Java .jks pour les workflows dev / CI-CD" + }, + "convert": { + "title": "Clé non répertoriée ?", + "text": "Convertissez votre fichier en keystore Java (.jks) avec keytool, puis choisissez JKS." + } + } + } }, "removeCertSign": { "tags": "signer,chiffrer,certificat,authenticate,PEM,P12,official,decrypt", "title": "Supprimer la Signature de Certificat", "header": "Supprimer le certificat numérique du PDF", "selectPDF": "Sélectionnez un fichier PDF :", - "submit": "Supprimer la Signature" + "submit": "Supprimer la Signature", + "description": "Cet outil supprimera les signatures de certificats numériques de votre document PDF.", + "filenamePrefix": "unsigned", + "files": { + "placeholder": "Sélectionnez un fichier PDF dans la vue principale pour commencer" + }, + "error": { + "failed": "Une erreur est survenue lors de la suppression des signatures de certificat." + }, + "results": { + "title": "Résultats de suppression des certificats" + } }, "pageLayout": { "tags": "fusionner,merge,composite,single-view,organize", @@ -1118,8 +2073,100 @@ "addBorder": "Ajouter des bordures", "submit": "Fusionner" }, + "bookletImposition": { + "tags": "livret,imposition,impression,reliure,pliage,signature", + "title": "Imposition en livret", + "header": "Imposition en livret", + "submit": "Créer le livret", + "spineLocation": { + "label": "Position de la reliure", + "left": "Gauche (standard)", + "right": "Droite (RTL)" + }, + "doubleSided": { + "label": "Impression recto-verso", + "tooltip": "Crée les faces avant et arrière pour une impression en livret correcte" + }, + "manualDuplex": { + "title": "Mode duplex manuel", + "instructions": "Pour les imprimantes sans duplex automatique. Vous devrez lancer l’opération deux fois :" + }, + "duplexPass": { + "label": "Passe d’impression", + "first": "1re passe", + "second": "2e passe", + "firstInstructions": "Imprime les faces avant → empilez face vers le bas → relancez avec la 2e passe", + "secondInstructions": "Chargez la pile imprimée face vers le bas → imprime les faces arrière" + }, + "rtlBinding": { + "label": "Reliure de droite à gauche", + "tooltip": "Pour l’arabe, l’hébreu ou d’autres langues RTL" + }, + "addBorder": { + "label": "Ajouter des bordures autour des pages", + "tooltip": "Ajoute des bordures autour de chaque section de page pour faciliter la découpe et l’alignement" + }, + "addGutter": { + "label": "Ajouter une marge de reliure", + "tooltip": "Ajoute un espace intérieur pour la reliure" + }, + "gutterSize": { + "label": "Taille de marge (points)" + }, + "flipOnShortEdge": { + "label": "Retourner sur le petit bord (duplex automatique uniquement)", + "tooltip": "Activer pour l’impression recto-verso sur le petit bord (duplex automatique uniquement – ignoré en mode manuel)", + "manualNote": "Inutile en mode manuel – vous retournez vous-même la pile" + }, + "advanced": { + "toggle": "Options avancées" + }, + "paperSizeNote": "La taille du papier est automatiquement dérivée de votre première page.", + "tooltip": { + "header": { + "title": "Guide de création de livret" + }, + "description": { + "title": "Qu’est-ce que l’imposition en livret ?", + "text": "Crée des livrets professionnels en arrangeant les pages dans le bon ordre d’impression. Vos pages PDF sont placées 2-par-page sur des feuilles paysage afin qu’une fois pliées et reliées, elles se lisent dans l’ordre correct comme un vrai livre." + }, + "example": { + "title": "Exemple : livret de 8 pages", + "text": "Votre document de 8 pages devient 2 feuilles :", + "bullet1": "Feuille 1 Avant : Pages 8, 1 | Arrière : Pages 2, 7", + "bullet2": "Feuille 2 Avant : Pages 6, 3 | Arrière : Pages 4, 5", + "bullet3": "Une fois plié et empilé : lecture 1→2→3→4→5→6→7→8" + }, + "printing": { + "title": "Comment imprimer et assembler", + "text": "Suivez ces étapes pour des livrets parfaits :", + "bullet1": "Imprimez en recto-verso avec « Retour sur grand bord »", + "bullet2": "Empilez les feuilles dans l’ordre, pliez en deux", + "bullet3": "Agrafez ou reliez le long du pli", + "bullet4": "Pour les imprimantes sur petit bord : activez l’option « Retour sur petit bord »" + }, + "manualDuplex": { + "title": "Duplex manuel (imprimantes simple face)", + "text": "Pour les imprimantes sans duplex automatique :", + "bullet1": "Désactivez « Impression recto-verso »", + "bullet2": "Sélectionnez « 1re passe » → Imprimez → Empilez face vers le bas", + "bullet3": "Sélectionnez « 2e passe » → Chargez la pile → Imprimez les dos", + "bullet4": "Pliez et assemblez normalement" + }, + "advanced": { + "title": "Options avancées", + "text": "Ajustez finement votre livret :", + "bullet1": "Reliure de droite à gauche : pour les langues RTL", + "bullet2": "Bordures : affiche des traits de coupe pour le rognage", + "bullet3": "Marge de reliure : ajoute de l’espace pour relier/agrafer", + "bullet4": "Retour sur petit bord : seulement pour les imprimantes en duplex automatique" + } + }, + "error": { + "failed": "Une erreur est survenue lors de la création de l’imposition en livret." + } + }, "scalePages": { - "tags": "ajuster,redimensionner,resize,modify,dimension,adapt", "title": "Ajuster la taille ou l'échelle", "header": "Ajuster la taille ou l'échelle", "pageSize": "Taille d'une page du document", @@ -1127,6 +2174,44 @@ "scaleFactor": "Niveau de zoom (recadrage) d'une page", "submit": "Ajuster" }, + "adjustPageScale": { + "tags": "redimensionner,modifier,dimension,adapter", + "title": "Ajuster l’échelle de page", + "header": "Ajuster l’échelle de page", + "scaleFactor": { + "label": "Facteur d’échelle" + }, + "pageSize": { + "label": "Taille de page cible", + "keep": "Conserver la taille d’origine", + "letter": "Lettre", + "legal": "Légal" + }, + "submit": "Ajuster l’échelle de page", + "error": { + "failed": "Une erreur est survenue lors de l’ajustement de l’échelle de page." + }, + "tooltip": { + "header": { + "title": "Aperçu des paramètres d’échelle de page" + }, + "description": { + "title": "Description", + "text": "Ajustez la taille du contenu PDF et modifiez les dimensions de la page." + }, + "scaleFactor": { + "title": "Facteur d’échelle", + "text": "Contrôle la taille d’affichage du contenu sur la page. Le contenu est mis à l’échelle et centré ; s’il dépasse la taille de la page, il peut être rogné.", + "bullet1": "1,0 = Taille d’origine", + "bullet2": "0,5 = Demi-taille (50 % plus petit)", + "bullet3": "2,0 = Taille doublée (200 % plus grand, peut rogner)" + }, + "pageSize": { + "title": "Taille de page cible", + "text": "Définit les dimensions des pages PDF en sortie. « Conserver la taille d’origine » maintient les dimensions actuelles, tandis que les autres options redimensionnent vers des formats standards." + } + } + }, "add-page-numbers": { "tags": "paginer,numéros,étiqueter,paginate,label,organize,index" }, @@ -1134,16 +2219,66 @@ "tags": "renommer,détection automatique,réétiqueter,auto-detect,header-based,organize,relabel", "title": "Renommer automatiquement", "header": "Renommer automatiquement", - "submit": "Renommer automatiquement" + "description": "Trouve automatiquement le titre dans le contenu de votre PDF et l’utilise comme nom de fichier.", + "submit": "Renommer automatiquement", + "files": { + "placeholder": "Sélectionnez un fichier PDF dans la vue principale pour commencer" + }, + "error": { + "failed": "Une erreur est survenue lors du renommage automatique du PDF." + }, + "results": { + "title": "Résultats du renommage automatique" + }, + "tooltip": { + "header": { + "title": "Fonctionnement du renommage automatique" + }, + "howItWorks": { + "title": "Renommage intelligent", + "text": "Trouve automatiquement le titre dans votre contenu PDF et l’utilise comme nom de fichier.", + "bullet1": "Recherche du texte ressemblant à un titre ou un en-tête", + "bullet2": "Crée un nom de fichier propre et valide à partir du titre détecté", + "bullet3": "Conserve le nom d’origine si aucun titre adapté n’est trouvé" + } + } }, "adjust-contrast": { "tags": "ajuster,couleurs,amélioration,color-correction,tune,modify,enhance" }, "crop": { - "tags": "redimensionner,trim,shrink,edit,shape", "title": "Redimensionner", "header": "Redimensionner", - "submit": "Envoyer" + "submit": "Envoyer", + "noFileSelected": "Sélectionnez un fichier PDF pour commencer le recadrage", + "preview": { + "title": "Sélection de la zone de recadrage" + }, + "reset": "Réinitialiser au PDF complet", + "coordinates": { + "title": "Position et taille", + "x": "Position X", + "y": "Position Y", + "width": "Largeur", + "height": "Hauteur" + }, + "error": { + "invalidArea": "La zone de recadrage dépasse les limites du PDF", + "failed": "Échec du recadrage du PDF" + }, + "steps": { + "selectArea": "Sélectionner la zone de recadrage" + }, + "tooltip": { + "title": "Comment recadrer des PDF", + "description": "Sélectionnez la zone à recadrer dans votre PDF en faisant glisser et en redimensionnant la superposition bleue sur la vignette.", + "drag": "Faites glisser la superposition pour déplacer la zone de recadrage", + "resize": "Faites glisser les poignées d’angle et de bord pour redimensionner", + "precision": "Utilisez les champs de coordonnées pour un positionnement précis" + }, + "results": { + "title": "Résultats du recadrage" + } }, "autoSplitPDF": { "tags": "séparer,QR-based,separate,scan-segment,organize", @@ -1226,63 +2361,122 @@ "downloadJS": "Télécharger le JavaScript", "submit": "Afficher" }, - "autoRedact": { - "tags": "caviarder,redact,auto,Masquer,noircir,noir,marqueur,caché,rédiger,censurer", - "title": "Caviarder automatiquement", - "header": "Caviarder automatiquement", - "colorLabel": "Couleur", - "textsToRedactLabel": "Texte à caviarder (séparé par des lignes)", - "textsToRedactPlaceholder": "ex. \\nConfidentiel \\nTop secret", - "useRegexLabel": "Utiliser une Regex", - "wholeWordSearchLabel": "Recherche de mots entiers", - "customPaddingLabel": "Marge intérieure supplémentaire", - "convertPDFToImageLabel": "Convertir un PDF en PDF-Image (utilisé pour supprimer le texte en arrière-plan)", - "submitButton": "Caviarder" - }, "redact": { "tags": "Caviarder,Redact,Masquer,noircir,noir,marqueur,caché,rédiger,censurer", "title": "Caviardage manuel", - "header": "Caviardage manuel", "submit": "Caviarder", - "textBasedRedaction": "Caviarder du texte", - "pageBasedRedaction": "Caviarder des pages", - "convertPDFToImageLabel": "Convertir en PDF-Image (pour supprimer le texte derrière le rectangle)", - "pageRedactionNumbers": { - "title": "Pages", - "placeholder": "(ex: 1,2,8 ou 4,7,12-16 ou 2n-1)" + "error": { + "failed": "Une erreur est survenue lors de l’occultation du PDF." }, - "redactionColor": { - "title": "Couleur" + "modeSelector": { + "title": "Méthode d’occultation", + "mode": "Mode", + "automatic": "Automatique", + "automaticDesc": "Occulter le texte selon des termes de recherche", + "manual": "Manuel", + "manualDesc": "Cliquez et faites glisser pour occulter des zones spécifiques", + "manualComingSoon": "Occultation manuelle bientôt disponible" }, - "export": "Exporter", - "upload": "Téléverser", - "boxRedaction": "Tracer le rectangle à caviarder", - "zoom": "Zoom", - "zoomIn": "Zoom avant", - "zoomOut": "Zoom arrière", - "nextPage": "Page suivante", - "previousPage": "Page précédente", - "toggleSidebar": "Montrer la barre latérale", - "showThumbnails": "Afficher les miniatures", - "showDocumentOutline": "Montrer les contours du document (double-click pour agrandir/réduire tous les éléments)", - "showAttatchments": "Montrer les éléments attachés", - "showLayers": "Montrer les calques (double-click pour réinitialiser tous les calques à l'état par défaut)", - "colourPicker": "Sélection de couleur", - "findCurrentOutlineItem": "Trouver l'élément de contour courrant", - "applyChanges": "Appliquer les changements", "auto": { + "header": "Occultation automatique", "settings": { + "title": "Paramètres d’occultation", "advancedTitle": "Mode avancé" }, + "colorLabel": "Couleur de la boîte", "wordsToRedact": { - "add": "Ajouter" + "title": "Mots à occulter", + "placeholder": "Saisir un mot", + "add": "Ajouter", + "examples": "Exemples : Confidentiel, Top secret" + }, + "useRegexLabel": "Utiliser des regex", + "wholeWordSearchLabel": "Recherche de mots entiers", + "customPaddingLabel": "Marge intérieure personnalisée", + "convertPDFToImageLabel": "Convertir le PDF en PDF-image" + }, + "tooltip": { + "mode": { + "header": { + "title": "Méthode d’occultation" + }, + "automatic": { + "title": "Occultation automatique", + "text": "Trouve et occulte automatiquement le texte spécifié dans tout le document. Parfait pour supprimer des informations sensibles récurrentes comme des noms, adresses ou mentions confidentielles." + }, + "manual": { + "title": "Occultation manuelle", + "text": "Cliquez et faites glisser pour sélectionner manuellement des zones à occulter. Offre un contrôle précis sur ce qui est masqué. (Bientôt disponible)" + } + }, + "words": { + "header": { + "title": "Mots à occulter" + }, + "description": { + "title": "Correspondance de texte", + "text": "Saisissez des mots ou phrases à rechercher et à occulter dans votre document. Chaque mot sera recherché séparément." + }, + "bullet1": "Ajoutez un mot à la fois", + "bullet2": "Appuyez sur Entrée ou cliquez sur « Ajouter un autre » pour ajouter", + "bullet3": "Cliquez sur × pour supprimer des mots", + "examples": { + "title": "Exemples courants", + "text": "Exemples typiques à occulter : coordonnées bancaires, adresses e-mail ou noms spécifiques." + } + }, + "advanced": { + "header": { + "title": "Paramètres d’occultation avancés" + }, + "color": { + "title": "Couleur de boîte & marge", + "text": "Personnalisez l’apparence des boîtes d’occultation. Le noir est standard, mais vous pouvez choisir n’importe quelle couleur. La marge ajoute de l’espace autour du texte trouvé." + }, + "regex": { + "title": "Utiliser des regex", + "text": "Active les expressions régulières pour une recherche avancée. Utile pour trouver des numéros de téléphone, e-mails ou des motifs complexes.", + "bullet1": "Exemple : \\d{4}-\\d{2}-\\d{2} pour correspondre aux dates au format YYYY-MM-DD", + "bullet2": "À utiliser avec précaution — testez soigneusement" + }, + "wholeWord": { + "title": "Recherche de mots entiers", + "text": "Ne fait correspondre que les mots complets, pas les correspondances partielles. « John » ne correspondra pas à « Johnson » si activé." + }, + "convert": { + "title": "Convertir en PDF-image", + "text": "Convertit le PDF en PDF-image après occultation. Cela garantit que le texte derrière les boîtes est entièrement supprimé et irrécupérable." + } } }, "manual": { + "header": "Occultation manuelle", + "textBasedRedaction": "Occultation basée sur le texte", + "pageBasedRedaction": "Occultation par page", + "convertPDFToImageLabel": "Convertir le PDF en PDF-image (permet de supprimer le texte derrière la boîte)", "pageRedactionNumbers": { + "title": "Pages", "placeholder": "(par exemple : 1,2,8 ou 4,7,12-16 ou 2n-1)" }, - "export": "Exporter" + "redactionColor": { + "title": "Couleur d’occultation" + }, + "export": "Exporter", + "upload": "Téléverser", + "boxRedaction": "Occultation par boîte dessinée", + "zoom": "Zoom", + "zoomIn": "Zoom avant", + "zoomOut": "Zoom arrière", + "nextPage": "Page suivante", + "previousPage": "Page précédente", + "toggleSidebar": "Afficher/masquer la barre latérale", + "showThumbnails": "Afficher les vignettes", + "showDocumentOutline": "Afficher le plan du document (double-cliquez pour tout développer/réduire)", + "showAttachments": "Afficher les pièces jointes", + "showLayers": "Afficher les calques (double-cliquez pour réinitialiser tous les calques à l’état par défaut)", + "colourPicker": "Sélecteur de couleur", + "findCurrentOutlineItem": "Trouver l’élément actuel du plan", + "applyChanges": "Appliquer les modifications" } }, "tableExtraxt": { @@ -1336,6 +2530,7 @@ "tags": "Tampon,Ajouter,Stamp,Add image,center image,Watermark,PDF,Embed,Customize", "header": "Tampon PDF", "title": "Tampon PDF", + "stampSetup": "Configuration du tampon", "stampType": "Type de tampon", "stampText": "Tampon texte", "stampImage": "Tampon image", @@ -1348,7 +2543,8 @@ "overrideY": "Définir coordonnées Y", "customMargin": "Marge personnalisée", "customColor": "Couleur de texte personnalisée", - "submit": "Soumettre" + "submit": "Soumettre", + "noStampSelected": "Aucun tampon sélectionné. Retour à l’étape 1." }, "removeImagePdf": { "tags": "Images,Remove Image,Page operations,Back end,server side" @@ -1357,7 +2553,7 @@ "tags": "séparer,chapitres,split,chapters,bookmarks,organize" }, "validateSignature": { - "tags": "signature,verify,validate,pdf,certificate,digital signature,Validate Signature,Validate certificate", + "tags": "signature,vérifier,valider,pdf,certificat,signature numérique,Valider la signature,Valider le certificat", "title": "Valider les signatures PDF", "header": "Valider les signatures numériques", "selectPDF": "Sélectionnez un fichier PDF signé", @@ -1402,31 +2598,15 @@ }, "selectCustomCert": "Fichier de certificat personnalisé X.509 (Optionnel)" }, - "replace-color": { - "title": "Remplacer-Inverser-Couleur", - "header": "Remplacer-Inverser Couleur PDF", - "selectText": { - "1": "Options de Remplacement ou d'Inversion de Couleur", - "2": "Par défaut (Couleurs à fort contraste par défaut)", - "3": "Personnalisé (Couleurs personnalisées)", - "4": "Inversion complète (Inverser toutes les couleurs)", - "5": "Options de couleur à fort contraste", - "6": "Texte blanc sur fond noir", - "7": "Texte noir sur fond blanc", - "8": "Texte jaune sur fond noir", - "9": "Texte vert sur fond noir", - "10": "Choisir la couleur du texte", - "11": "Choisir la couleur de l'arrière-plan" - }, - "submit": "Remplacer" - }, - "replaceColorPdf": { - "tags": "Remplacer Couleur,Opérations de Page,Back-end,Côté serveur" + "replaceColor": { + "tags": "Remplacer la couleur,Opérations de page,Back-end,côté serveur" }, "login": { "title": "Connexion", "header": "Connexion", "signin": "Connexion", + "signInWith": "Se connecter avec", + "signInAnonymously": "S’inscrire en tant qu’invité", "rememberme": "Se souvenir de moi", "invalid": "Nom d'utilisateur ou mot de passe invalide.", "locked": "Votre compte a été verrouillé.", @@ -1445,12 +2625,70 @@ "alreadyLoggedIn": "Vous êtes déjà connecté sur", "alreadyLoggedIn2": "appareils. Veuillez vous déconnecter des appareils et réessayer.", "toManySessions": "Vous avez trop de sessions actives.", - "logoutMessage": "Vous avez été déconnecté." + "logoutMessage": "Vous avez été déconnecté.", + "youAreLoggedIn": "Vous êtes connecté !", + "email": "E-mail", + "password": "Mot de passe", + "enterEmail": "Saisissez votre e-mail", + "enterPassword": "Saisissez votre mot de passe", + "loggingIn": "Connexion…", + "signingIn": "Connexion en cours…", + "login": "Se connecter", + "or": "Ou", + "useMagicLink": "Utiliser plutôt le lien magique", + "enterEmailForMagicLink": "Saisissez votre e-mail pour le lien magique", + "sending": "Envoi…", + "sendMagicLink": "Envoyer le lien magique", + "cancel": "Annuler", + "dontHaveAccount": "Vous n’avez pas de compte ? Inscrivez-vous", + "home": "Accueil", + "debug": "Déboguer", + "signOut": "Se déconnecter", + "pleaseEnterBoth": "Veuillez saisir l’e-mail et le mot de passe", + "pleaseEnterEmail": "Veuillez saisir votre adresse e-mail", + "magicLinkSent": "Lien magique envoyé à {{email}} ! Consultez votre e-mail et cliquez sur le lien pour vous connecter.", + "passwordResetSent": "Lien de réinitialisation envoyé à {{email}} ! Consultez votre e-mail et suivez les instructions.", + "failedToSignIn": "Échec de connexion avec {{provider}} : {{message}}", + "unexpectedError": "Erreur inattendue : {{message}}" + }, + "signup": { + "title": "Créer un compte", + "subtitle": "Rejoignez Stirling PDF pour commencer", + "name": "Nom", + "email": "E-mail", + "password": "Mot de passe", + "confirmPassword": "Confirmer le mot de passe", + "enterName": "Saisissez votre nom", + "enterEmail": "Saisissez votre e-mail", + "enterPassword": "Saisissez votre mot de passe", + "confirmPasswordPlaceholder": "Confirmer le mot de passe", + "or": "ou", + "creatingAccount": "Création du compte…", + "signUp": "S’inscrire", + "alreadyHaveAccount": "Vous avez déjà un compte ? Connectez-vous", + "pleaseFillAllFields": "Veuillez remplir tous les champs", + "passwordsDoNotMatch": "Les mots de passe ne correspondent pas", + "passwordTooShort": "Le mot de passe doit comporter au moins 6 caractères", + "invalidEmail": "Veuillez saisir une adresse e-mail valide", + "checkEmailConfirmation": "Consultez votre e-mail pour un lien de confirmation afin de terminer votre inscription.", + "accountCreatedSuccessfully": "Compte créé avec succès ! Vous pouvez maintenant vous connecter.", + "unexpectedError": "Erreur inattendue : {{message}}" }, "pdfToSinglePage": { "title": "Fusionner les pages", "header": "Fusionner les pages", - "submit": "Convertir en une seule page" + "submit": "Convertir en une seule page", + "description": "Cet outil fusionnera toutes les pages de votre PDF en une seule grande page. La largeur restera identique à celle des pages d’origine, mais la hauteur sera la somme de toutes les hauteurs de page.", + "filenamePrefix": "single_page", + "files": { + "placeholder": "Sélectionnez un fichier PDF dans la vue principale pour commencer" + }, + "error": { + "failed": "Une erreur est survenue lors de la conversion en page unique." + }, + "results": { + "title": "Résultats page unique" + } }, "pageExtracter": { "title": "Extraire des pages", @@ -1481,24 +2719,49 @@ }, "compress": { "title": "Compresser un PDF", + "desc": "Compressez les PDF pour réduire leur taille.", "header": "Compresser un PDF (lorsque c'est possible!)", + "method": { + "title": "Méthode de compression", + "quality": "Qualité", + "filesize": "Taille du Fichier" + }, "credit": "Ce service utilise qpdf pour la compression et l'optimisation des PDF.", "grayscale": { "label": "Appliquer l'échelle de gris pour la compression" }, + "tooltip": { + "header": { + "title": "Aperçu des paramètres de compression" + }, + "description": { + "title": "Description", + "text": "La compression est un moyen simple de réduire la taille de votre fichier. Choisissez Taille de fichier pour saisir une taille cible et nous ajusterons la qualité pour vous. Choisissez Qualité pour régler manuellement la force de compression." + }, + "qualityAdjustment": { + "title": "Réglage de la qualité", + "text": "Faites glisser le curseur pour ajuster la force de compression. Des valeurs basses (1-3) préservent la qualité mais produisent des fichiers plus volumineux. Des valeurs hautes (7-9) réduisent davantage la taille mais diminuent la netteté des images.", + "bullet1": "Des valeurs faibles préservent la qualité", + "bullet2": "Des valeurs élevées réduisent la taille du fichier" + }, + "grayscale": { + "title": "Niveaux de gris", + "text": "Sélectionnez cette option pour convertir toutes les images en noir et blanc, ce qui peut réduire significativement la taille, en particulier pour les PDF scannés ou riches en images." + } + }, + "error": { + "failed": "Une erreur est survenue lors de la compression du PDF." + }, "selectText": { "1": { - "_value": "Compression Settings", + "_value": "Paramètres de compression", "1": "1-3 compression PDF,
4-6 compression d'image légère,
7-9 compression d'image intense qui réduira considérablement la qualité de l'image" }, "2": "Niveau d'optimisation", "4": "Mode automatique – ajuste automatiquement la qualité pour obtenir le PDF à la taille exacte", "5": "Taille PDF attendue (par exemple, 25 MB, 10,8 MB, 25 KB)" }, - "submit": "Compresser", - "method": { - "filesize": "Taille du Fichier" - } + "submit": "Compresser" }, "decrypt": { "passwordPrompt": "Ce fichier est protégé par un mot de passe. Veuillez saisir le mot de passe :", @@ -1633,6 +2896,12 @@ }, "note": "Les notes de version sont uniquement disponibles en anglais" }, + "swagger": { + "title": "Documentation de l’API", + "header": "Documentation de l’API", + "desc": "Voir et tester les points de terminaison de l’API Stirling PDF", + "tags": "api,documentation,swagger,points de terminaison,développement" + }, "cookieBanner": { "popUp": { "title": "Comment nous utilisons les cookies", @@ -1670,51 +2939,289 @@ } } }, - "download": "Télécharger", - "undo": "Défaire", - "convert": { - "title": "Convertir", - "settings": "Paramètres", - "color": "Couleur", - "greyscale": "Niveaux de gris", - "fillPage": "Remplir la page", - "pdfaDigitalSignatureWarning": "Le PDF contient une signature numérique. Elle sera supprimée dans l'étape suivante.", - "grayscale": "Niveaux de gris" + "removeMetadata": { + "submit": "Supprimer les métadonnées" }, - "attachments": { - "tags": "intégrer,joindre,fichier,pièce,jointe,embed,attach,file,attachment,attachments", - "title": "Ajouter des pièces jointes", - "header": "Ajouter des pièces jointes", - "submit": "Ajouter des pièces jointes" + "sidebar": { + "toggle": "Afficher/masquer la barre latérale" + }, + "theme": { + "toggle": "Changer de thème" + }, + "view": { + "viewer": "Visionneuse", + "pageEditor": "Éditeur de pages", + "fileManager": "Gestionnaire de fichiers" + }, + "pageEditor": { + "title": "Éditeur de pages", + "save": "Enregistrer les modifications", + "noPdfLoaded": "Aucun PDF chargé. Veuillez téléverser un PDF à modifier.", + "rotatedLeft": "Tourné à gauche :", + "rotatedRight": "Tourné à droite :", + "deleted": "Supprimé :", + "movedLeft": "Déplacé à gauche :", + "movedRight": "Déplacé à droite :", + "splitAt": "Scindé à :", + "insertedPageBreak": "Saut de page inséré à :", + "addFileNotImplemented": "Ajout de fichier non implémenté dans la démo", + "closePdf": "Fermer le PDF", + "reset": "Réinitialiser les modifications", + "zoomIn": "Zoom avant", + "zoomOut": "Zoom arrière", + "fitToWidth": "Ajuster à la largeur", + "actualSize": "Taille réelle" + }, + "viewer": { + "firstPage": "Première page", + "lastPage": "Dernière page", + "previousPage": "Page précédente", + "nextPage": "Page suivante", + "zoomIn": "Zoom avant", + "zoomOut": "Zoom arrière", + "singlePageView": "Vue page unique", + "dualPageView": "Vue double page" }, "rightRail": { + "closeSelected": "Fermer les fichiers sélectionnés", "selectAll": "Tout sélectionner", - "deselectAll": "Tout déselectionner" + "deselectAll": "Tout déselectionner", + "selectByNumber": "Sélectionner par numéros de page", + "deleteSelected": "Supprimer les pages sélectionnées", + "closePdf": "Fermer le PDF", + "exportAll": "Exporter le PDF", + "downloadSelected": "Télécharger les fichiers sélectionnés", + "downloadAll": "Tout télécharger", + "toggleTheme": "Changer de thème", + "language": "Langue", + "search": "Rechercher dans le PDF", + "panMode": "Mode panoramique", + "rotateLeft": "Pivoter à gauche", + "rotateRight": "Pivoter à droite", + "toggleSidebar": "Afficher/masquer la barre latérale" + }, + "search": { + "title": "Rechercher dans le PDF", + "placeholder": "Saisir un terme de recherche…" + }, + "guestBanner": { + "title": "Vous utilisez Stirling PDF en tant qu’invité !", + "message": "Créez un compte gratuit pour enregistrer votre travail, accéder à plus de fonctionnalités et soutenir le projet.", + "dismiss": "Masquer la bannière", + "signUp": "S’inscrire gratuitement" + }, + "toolPicker": { + "searchPlaceholder": "Rechercher des outils…", + "noToolsFound": "Aucun outil trouvé", + "allTools": "TOUS LES OUTILS", + "quickAccess": "ACCÈS RAPIDE", + "categories": { + "standardTools": "Outils standards", + "advancedTools": "Outils avancés", + "recommendedTools": "Outils recommandés" + }, + "subcategories": { + "signing": "Signature", + "documentSecurity": "Sécurité du document", + "verification": "Vérification", + "documentReview": "Révision de document", + "pageFormatting": "Mise en page", + "extraction": "Extraction", + "removal": "Suppression", + "automation": "Automatisation", + "general": "Général", + "advancedFormatting": "Mise en forme avancée", + "developerTools": "Outils développeur" + } }, "quickAccess": { - "sign": "Signer" + "read": "Lire", + "sign": "Signer", + "automate": "Automatiser", + "files": "Fichiers", + "activity": "Activité", + "config": "Configuration", + "allTools": "Tous les outils" }, "fileUpload": { + "selectFile": "Sélectionner un fichier", + "selectFiles": "Sélectionner des fichiers", + "selectPdfToView": "Sélectionnez un PDF à afficher", + "selectPdfToEdit": "Sélectionnez un PDF à modifier", + "chooseFromStorage": "Choisissez un fichier depuis le stockage ou téléversez un nouveau PDF", + "chooseFromStorageMultiple": "Choisissez des fichiers depuis le stockage ou téléversez de nouveaux PDF", + "loadFromStorage": "Charger depuis le stockage", + "filesAvailable": "fichiers disponibles", "loading": "Chargement...", - "or": "ou" + "or": "ou", + "dropFileHere": "Déposez un fichier ici ou cliquez pour téléverser", + "dropFilesHere": "Déposez des fichiers ici ou cliquez sur le bouton de téléversement", + "pdfFilesOnly": "Fichiers PDF uniquement", + "supportedFileTypes": "Types de fichiers pris en charge", + "upload": "Téléverser", + "uploadFile": "Téléverser un fichier", + "uploadFiles": "Téléverser des fichiers", + "noFilesInStorage": "Aucun fichier disponible dans le stockage. Téléversez d’abord des fichiers.", + "selectFromStorage": "Sélectionner depuis le stockage", + "backToTools": "Retour aux outils", + "addFiles": "Ajouter des fichiers", + "dragFilesInOrClick": "Glissez des fichiers ou cliquez sur « Ajouter des fichiers » pour parcourir" }, "fileManager": { + "title": "Téléverser des fichiers PDF", + "subtitle": "Ajoutez des fichiers à votre stockage pour un accès facile dans tous les outils", + "filesSelected": "fichiers sélectionnés", + "clearSelection": "Effacer la sélection", + "openInFileEditor": "Ouvrir dans l’éditeur de fichiers", + "uploadError": "Échec du téléversement de certains fichiers.", + "failedToOpen": "Échec de l’ouverture du fichier. Il a peut-être été supprimé du stockage.", + "failedToLoad": "Échec du chargement du fichier dans l’ensemble actif.", + "storageCleared": "Le navigateur a effacé le stockage. Les fichiers ont été supprimés. Veuillez téléverser de nouveau.", + "clearAll": "Tout effacer", + "reloadFiles": "Recharger les fichiers", + "dragDrop": "Glissez-déposez des fichiers ici", + "clickToUpload": "Cliquez pour téléverser des fichiers", + "selectedFiles": "Fichiers sélectionnés", + "storage": "Stockage", + "filesStored": "fichiers stockés", + "storageError": "Une erreur de stockage est survenue", + "storageLow": "Le stockage est presque plein. Envisagez de supprimer d’anciens fichiers.", + "supportMessage": "Alimenté par le stockage de la base de données du navigateur pour une capacité illimitée", + "noFileSelected": "Aucun fichier sélectionné", + "showHistory": "Afficher l’historique", + "hideHistory": "Masquer l’historique", + "fileHistory": "Historique du fichier", + "loadingHistory": "Chargement de l’historique…", + "lastModified": "Dernière modification", + "toolChain": "Outils appliqués", + "restore": "Restaurer", + "searchFiles": "Rechercher des fichiers…", + "recent": "Récents", + "localFiles": "Fichiers locaux", + "googleDrive": "Google Drive", + "googleDriveShort": "Drive", + "myFiles": "Mes fichiers", + "noRecentFiles": "Aucun fichier récent trouvé", + "dropFilesHint": "Déposez les fichiers ici pour les téléverser", + "googleDriveNotAvailable": "Intégration Google Drive non disponible", + "openFiles": "Ouvrir des fichiers", + "openFile": "Ouvrir le fichier", + "details": "Détails du fichier", "fileName": "Nom", + "fileFormat": "Format", + "fileSize": "Taille", + "fileVersion": "Version", + "totalSelected": "Total sélectionné", + "dropFilesHere": "Déposez les fichiers ici", "selectAll": "Tout sélectionner", "deselectAll": "Tout déselectionner", "deleteSelected": "Supprimer la sélection", + "downloadSelected": "Télécharger la sélection", + "selectedCount": "{{count}} sélectionné(s)", "download": "Télécharger", - "delete": "Supprimer" + "delete": "Supprimer", + "unsupported": "Non pris en charge" + }, + "storage": { + "temporaryNotice": "Les fichiers sont stockés temporairement dans votre navigateur et peuvent être effacés automatiquement", + "storageLimit": "Limite de stockage", + "storageUsed": "Stockage temporaire utilisé", + "storageFull": "Le stockage est presque plein. Envisagez de supprimer certains fichiers.", + "fileTooLarge": "Fichier trop volumineux. Taille maximale par fichier :", + "storageQuotaExceeded": "Quota de stockage dépassé. Veuillez supprimer des fichiers avant d’en ajouter.", + "approximateSize": "Taille approximative" }, "sanitize": { + "title": "Assainir", + "desc": "Supprimer les éléments potentiellement nuisibles des fichiers PDF.", "submit": "Assainir", + "completed": "Assainissement effectué avec succès", + "error.generic": "Échec de l’assainissement", + "error.failed": "Une erreur est survenue lors de l’assainissement du PDF.", + "filenamePrefix": "sanitised", + "sanitizationResults": "Résultats de l’assainissement", "steps": { - "settings": "Paramètres" + "files": "Fichiers", + "settings": "Paramètres", + "results": "Résultats" + }, + "files": { + "placeholder": "Sélectionnez un fichier PDF dans la vue principale pour commencer" + }, + "options": { + "title": "Options d’assainissement", + "note": "Sélectionnez les éléments à supprimer du PDF. Au moins une option doit être sélectionnée.", + "removeJavaScript.desc": "Supprimer les actions et scripts JavaScript du PDF", + "removeEmbeddedFiles.desc": "Supprimer tous les fichiers intégrés dans le PDF", + "removeXMPMetadata.desc": "Supprimer les métadonnées XMP du PDF", + "removeMetadata.desc": "Supprimer les informations de document (titre, auteur, etc.)", + "removeLinks.desc": "Supprimer les liens externes et actions de lancement du PDF", + "removeFonts.desc": "Supprimer les polices intégrées du PDF" + } + }, + "addPassword": { + "title": "Ajouter un mot de passe", + "desc": "Chiffrez votre document PDF avec un mot de passe.", + "completed": "Protection par mot de passe appliquée", + "submit": "Chiffrer", + "filenamePrefix": "encrypted", + "error": { + "failed": "Une erreur est survenue lors du chiffrement du PDF." + }, + "passwords": { + "stepTitle": "Mots de passe & chiffrement", + "completed": "Mots de passe configurés", + "user": { + "label": "Mot de passe utilisateur", + "placeholder": "Saisir le mot de passe utilisateur" + }, + "owner": { + "label": "Mot de passe propriétaire", + "placeholder": "Saisir le mot de passe propriétaire" + } + }, + "encryption": { + "keyLength": { + "label": "Longueur de clé de chiffrement", + "40bit": "40 bits (Faible)", + "128bit": "128 bits (Standard)", + "256bit": "256 bits (Élevé)" + } + }, + "results": { + "title": "PDF chiffrés" + }, + "tooltip": { + "header": { + "title": "Aperçu de la protection par mot de passe" + }, + "passwords": { + "title": "Types de mots de passe", + "text": "Les mots de passe utilisateur restreignent l’ouverture du document, tandis que les mots de passe propriétaire contrôlent ce qui peut être fait une fois le document ouvert. Vous pouvez définir les deux ou seulement l’un d’eux.", + "bullet1": "Mot de passe utilisateur : requis pour ouvrir le PDF", + "bullet2": "Mot de passe propriétaire : contrôle les permissions du document (non pris en charge par tous les lecteurs PDF)" + }, + "encryption": { + "title": "Niveaux de chiffrement", + "text": "Des niveaux de chiffrement plus élevés offrent une meilleure sécurité mais peuvent ne pas être pris en charge par d’anciens lecteurs PDF.", + "bullet1": "40 bits : Sécurité basique, compatible avec les anciens lecteurs", + "bullet2": "128 bits : Sécurité standard, largement prise en charge", + "bullet3": "256 bits : Sécurité maximale, nécessite des lecteurs modernes" + }, + "permissions": { + "title": "Modifier les permissions", + "text": "Ces permissions contrôlent ce que les utilisateurs peuvent faire avec le PDF. Le plus efficace lorsqu’elles sont combinées avec un mot de passe propriétaire." + } } }, "changePermissions": { "title": "Modifier les permissions", + "desc": "Modifier les restrictions et permissions du document.", + "completed": "Permissions modifiées", "submit": "Modifier les permissions", + "error": { + "failed": "Une erreur est survenue lors de la modification des permissions du PDF." + }, "permissions": { "preventAssembly": { "label": "Empêcher l'assemblage du document" @@ -1741,10 +3248,195 @@ "label": "Empêcher l'impression des différents formats" } }, + "results": { + "title": "PDF modifiés" + }, "tooltip": { "header": { "title": "Modifier les permissions" + }, + "description": { + "text": "Modifie les permissions du document, autorisant/interdisant l’accès à différentes fonctions dans les lecteurs PDF." + }, + "warning": { + "text": "Pour rendre ces permissions non modifiables, utilisez l’outil Ajouter un mot de passe pour définir un mot de passe propriétaire." } } - } + }, + "removePassword": { + "title": "Supprimer le mot de passe", + "desc": "Supprimez la protection par mot de passe de votre PDF.", + "tags": "supprimer,sécurité,mot de passe,secure,decrypt,security,unpassword,delete password", + "password": { + "stepTitle": "Supprimer le mot de passe", + "label": "Mot de passe actuel", + "placeholder": "Saisir le mot de passe actuel", + "completed": "Mot de passe configuré" + }, + "filenamePrefix": "decrypted", + "error": { + "failed": "Une erreur est survenue lors du retrait du mot de passe du PDF." + }, + "tooltip": { + "description": "La suppression de la protection par mot de passe nécessite le mot de passe utilisé pour chiffrer le PDF. Cela déchiffrera le document, le rendant accessible sans mot de passe." + }, + "submit": "Supprimer", + "results": { + "title": "PDF déchiffrés" + } + }, + "automate": { + "title": "Automatiser", + "desc": "Créez des workflows multi-étapes en enchaînant des actions PDF. Idéal pour les tâches récurrentes.", + "invalidStep": "Étape invalide", + "files": { + "placeholder": "Sélectionnez des fichiers à traiter avec cette automatisation" + }, + "selection": { + "title": "Sélection d’automatisation", + "saved": { + "title": "Enregistré" + }, + "createNew": { + "title": "Créer une nouvelle automatisation" + }, + "suggested": { + "title": "Suggéré" + } + }, + "creation": { + "createTitle": "Créer une automatisation", + "editTitle": "Modifier l’automatisation", + "intro": "Les automatisations exécutent les outils séquentiellement. Pour commencer, ajoutez les outils dans l’ordre d’exécution souhaité.", + "name": { + "label": "Nom de l’automatisation", + "placeholder": "Mon automatisation" + }, + "description": { + "label": "Description (facultatif)", + "placeholder": "Décrivez ce que fait cette automatisation…" + }, + "tools": { + "selectTool": "Sélectionner un outil…", + "selected": "Outils sélectionnés", + "remove": "Supprimer l’outil", + "configure": "Configurer l’outil", + "notConfigured": " ! Non configuré", + "addTool": "Ajouter l’outil", + "add": "Ajouter un outil…" + }, + "save": "Enregistrer l’automatisation", + "unsavedChanges": { + "title": "Modifications non enregistrées", + "message": "Vous avez des modifications non enregistrées. Êtes-vous sûr de vouloir revenir en arrière ? Toutes les modifications seront perdues.", + "cancel": "Annuler", + "confirm": "Revenir en arrière" + }, + "icon": { + "label": "Icône" + } + }, + "run": { + "title": "Exécuter l’automatisation" + }, + "sequence": { + "unnamed": "Automatisation sans nom", + "steps": "{{count}} étapes", + "running": "Exécution de l’automatisation…", + "run": "Lancer l’automatisation", + "finish": "Terminer" + }, + "reviewTitle": "Résultats de l’automatisation", + "config": { + "loading": "Chargement de la configuration de l’outil…", + "noSettings": "Cet outil n’a pas de paramètres configurables.", + "title": "Configurer {{toolName}}", + "description": "Configurez les paramètres de cet outil. Ils seront appliqués lors de l’exécution de l’automatisation.", + "cancel": "Annuler", + "save": "Enregistrer la configuration" + }, + "copyToSaved": "Copier vers Enregistré" + }, + "automation": { + "suggested": { + "securePdfIngestion": "Ingestion PDF sécurisée", + "securePdfIngestionDesc": "Workflow complet de traitement PDF qui assainit les documents, applique l’OCR avec nettoyage, convertit en format PDF/A pour l’archivage à long terme et optimise la taille du fichier.", + "emailPreparation": "Préparation des e-mails", + "emailPreparationDesc": "Optimise les PDF pour la distribution par e-mail en compressant les fichiers, en scindant les documents volumineux en blocs de 20 Mo pour la compatibilité e-mail et en supprimant les métadonnées pour la confidentialité.", + "secureWorkflow": "Workflow de sécurité", + "secureWorkflowDesc": "Sécurise les documents PDF en supprimant les contenus potentiellement malveillants comme JavaScript et les fichiers intégrés, puis ajoute une protection par mot de passe pour empêcher tout accès non autorisé. Par défaut, le mot de passe est « password ».", + "processImages": "Traiter les images", + "processImagesDesc": "Convertit plusieurs fichiers image en un seul document PDF, puis applique la technologie OCR pour extraire un texte recherchable à partir des images." + } + }, + "common": { + "copy": "Copier", + "copied": "Copié !", + "refresh": "Actualiser", + "retry": "Réessayer", + "remaining": "restant", + "used": "utilisé", + "available": "disponible", + "cancel": "Annuler" + }, + "config": { + "account": { + "overview": { + "title": "Paramètres du compte", + "manageAccountPreferences": "Gérer les préférences de votre compte", + "guestDescription": "Vous êtes connecté en tant qu’invité. Envisagez de mettre à niveau votre compte ci-dessus." + }, + "upgrade": { + "title": "Mettre à niveau le compte invité", + "description": "Liez votre compte pour préserver votre historique et accéder à davantage de fonctionnalités !", + "socialLogin": "Mettre à niveau avec un compte social", + "linkWith": "Lier avec", + "emailPassword": "ou saisissez votre e-mail et mot de passe", + "email": "E-mail", + "emailPlaceholder": "Saisissez votre e-mail", + "password": "Mot de passe (facultatif)", + "passwordPlaceholder": "Définir un mot de passe", + "passwordNote": "Laissez vide pour utiliser uniquement la vérification par e-mail", + "upgradeButton": "Mettre à niveau le compte" + } + }, + "apiKeys": { + "description": "Votre clé API pour accéder à la suite d’outils PDF de Stirling. Copiez-la dans votre projet ou actualisez pour en générer une nouvelle.", + "publicKeyAriaLabel": "Clé API publique", + "copyKeyAriaLabel": "Copier la clé API", + "refreshAriaLabel": "Actualiser la clé API", + "includedCredits": "Crédits inclus", + "purchasedCredits": "Crédits achetés", + "totalCredits": "Crédits totaux", + "chartAriaLabel": "Utilisation des crédits : inclus {{includedUsed}} sur {{includedTotal}}, achetés {{purchasedUsed}} sur {{purchasedTotal}}", + "nextReset": "Prochaine réinitialisation", + "lastApiUse": "Dernière utilisation de l’API", + "overlayMessage": "Générez une clé pour voir les crédits et les crédits disponibles", + "label": "Clé API", + "guestInfo": "Les utilisateurs invités ne reçoivent pas de clés API. Créez un compte pour obtenir une clé API à utiliser dans vos applications.", + "goToAccount": "Aller au compte", + "refreshModal": { + "title": "Actualiser les clés API", + "warning": "⚠️ Avertissement : cette action générera de nouvelles clés API et rendra vos clés précédentes invalides.", + "impact": "Toute application ou service utilisant actuellement ces clés cessera de fonctionner jusqu’à leur mise à jour avec les nouvelles clés.", + "confirmPrompt": "Êtes-vous sûr de vouloir continuer ?", + "confirmCta": "Actualiser les clés" + }, + "generateError": "Nous n’avons pas pu générer votre clé API." + } + }, + "AddAttachmentsRequest": { + "attachments": "Sélectionner des pièces jointes", + "info": "Sélectionnez des fichiers à joindre à votre PDF. Ces fichiers seront intégrés et accessibles via le panneau des pièces jointes du PDF.", + "selectFiles": "Sélectionner des fichiers à joindre", + "placeholder": "Choisir des fichiers…", + "addMoreFiles": "Ajouter d’autres fichiers…", + "selectedFiles": "Fichiers sélectionnés", + "submit": "Ajouter les pièces jointes", + "results": { + "title": "Résultats des pièces jointes" + } + }, + "termsAndConditions": "Conditions générales", + "logOut": "Se déconnecter" } \ No newline at end of file diff --git a/frontend/public/locales/ja-JP/translation.json b/frontend/public/locales/ja-JP/translation.json index 43b6d4abf..c68b843ba 100644 --- a/frontend/public/locales/ja-JP/translation.json +++ b/frontend/public/locales/ja-JP/translation.json @@ -1,4 +1,8 @@ { + "keepWorking": "作業を続ける", + "discardChanges": "変更を破棄", + "applyAndContinue": "適用して続行", + "exportAndContinue": "エクスポートして続行", "language": { "direction": "ltr" }, @@ -35,10 +39,27 @@ "true": "真", "false": "偽", "unknown": "不明", + "app": { + "description": "無料の Adobe Acrobat 代替(1,000万+ ダウンロード)" + }, "save": "保存", "saveToBrowser": "ブラウザへ保存", + "download": "ダウンロード", + "undo": "元に戻す", + "moreOptions": "その他のオプション", + "editYourNewFiles": "新しいファイルを編集", "close": "閉じる", + "fileSelected": "選択中:{{filename}}", + "chooseFile": "ファイルを選択", "filesSelected": "選択されたファイル", + "files": { + "title": "ファイル", + "upload": "アップロード", + "uploadFiles": "ファイルをアップロード", + "addFiles": "ファイルを追加", + "selectFromWorkbench": "ワークベンチからファイルを選択または ", + "selectMultipleFromWorkbench": "ワークベンチから少なくとも {{count}} 件選択または " + }, "noFavourites": "お気に入りはありません", "downloadComplete": "ダウンロード完了", "bored": "待ち時間が退屈", @@ -56,7 +77,10 @@ }, "error": { "pdfPassword": "PDFにパスワードが設定されてますが、パスワードが入力されてないか間違ってます。", + "encryptedPdfMustRemovePassword": "この PDF は暗号化またはパスワード保護されています。PDF/A へ変換する前にロックを解除してください。", + "incorrectPasswordProvided": "PDF のパスワードが間違っているか指定されていません。", "_value": "エラー", + "dismissAllErrors": "すべてのエラーを閉じる", "sorry": "問題が発生したことをお詫び申し上げます!", "needHelp": "助けが必要/問題が見つかりましたか?", "contactTip": "まだ問題が解決していない場合は、お手数ですが、GitHubページでチケットを提出するか、Discordで私たちに連絡してください:", @@ -71,6 +95,7 @@ "githubSubmit": "GitHub - チケットを提出", "discordSubmit": "Discord - サポート投稿を提出" }, + "edit": "編集", "delete": "削除", "username": "ユーザー名", "password": "パスワード", @@ -82,6 +107,7 @@ "green": "緑", "blue": "青", "custom": "カスタム...", + "comingSoon": "近日公開", "WorkInProgess": "作業中です。動作しないまたはバグがある可能性があります。問題があれば報告してください!", "poweredBy": "Powered by", "yes": "はい", @@ -121,6 +147,7 @@ "noFileSelected": "ファイルが選択されていません。アップロードしてください。", "legal": { "privacy": "プライバシーポリシー", + "iAgreeToThe": "以下すべてに同意します:", "terms": "利用規約", "accessibility": "アクセシビリティ", "cookie": "Cookieポリシー", @@ -332,291 +359,305 @@ "globalPopularity": "グローバル人気", "sortBy": "ソート順:", "multiTool": { + "tags": "multiple,tools", "title": "PDFマルチツール", "desc": "ページの結合、回転、並べ替え、削除します。" }, "merge": { + "tags": "combine,join,unite", "title": "結合", "desc": "複数のPDFを1つに結合します。" }, "split": { + "tags": "divide,separate,break", "title": "分割", "desc": "PDFを複数のドキュメントに分割します。" }, "rotate": { + "tags": "turn,flip,orient", "title": "回転", "desc": "PDFを回転します。" }, - "imageToPDF": { - "title": "画像をPDFに変換", - "desc": "画像 (PNG, JPEG, GIF) をPDFに変換します。" - }, - "pdfToImage": { - "title": "PDFを画像に変換", - "desc": "PDFを画像 (PNG, JPEG, GIF) に変換します。" + "convert": { + "tags": "transform,change", + "title": "変換", + "desc": "異なる形式間でファイルを変換" }, "pdfOrganiser": { + "tags": "organize,rearrange,reorder", "title": "整理", "desc": "ページの削除/並べ替えします。" }, "addImage": { + "tags": "insert,embed,place", "title": "画像の追加", "desc": "PDF上の任意の場所に画像を追加します。" }, + "addAttachments": { + "tags": "embed,attach,include", + "title": "添付を追加", + "desc": "PDF に埋め込みファイル(添付)を追加・削除します" + }, "watermark": { + "tags": "stamp,mark,overlay", "title": "透かしの追加", "desc": "PDFに独自の透かしを追加します。" }, - "permissions": { - "title": "権限の変更", - "desc": "PDFの権限を変更します。" + "removePassword": { + "tags": "unlock", + "title": "パスワードの削除", + "desc": "PDFからパスワードの削除します。" }, - "pageRemover": { + "compress": { + "tags": "shrink,reduce,optimize", + "title": "圧縮", + "desc": "PDFを圧縮してファイルサイズを小さくします。" + }, + "unlockPDFForms": { + "tags": "unlock,enable,edit", + "title": "PDFフォームのロックを解除", + "desc": "PDFドキュメント内のフォームフィールドの読み取り専用プロパティを削除します。" + }, + "changeMetadata": { + "tags": "edit,modify,update", + "title": "メタデータの変更", + "desc": "PDFのメタデータを変更/削除/追加します。" + }, + "ocr": { + "tags": "extract,scan", + "title": "OCR / クリーンアップ", + "desc": "クリーンアップはPDF内の画像からテキストを検出してテキストとして再追加します。" + }, + "extractImages": { + "tags": "pull,save,export", + "title": "画像の抽出", + "desc": "PDFからすべての画像を抽出してzipで保存します。" + }, + "scannerImageSplit": { + "tags": "detect,split,photos", + "title": "スキャン写真の検出と分割", + "desc": "スキャンした写真を検出して別々のページに分割" + }, + "sign": { + "tags": "signature,autograph", + "title": "署名", + "desc": "手書き、テキストまたは画像によってPDFに署名を追加します。" + }, + "flatten": { + "tags": "simplify,remove,interactive", + "title": "平坦化", + "desc": "PDFからインタラクティブな要素とフォームをすべて削除します。" + }, + "certSign": { + "tags": "authenticate,PEM,P12,official,encrypt,sign,certificate,PKCS12,JKS,server,manual,auto", + "title": "証明書による署名", + "desc": "証明書/キーを使用してPDFに署名します。 (PEM/P12)" + }, + "repair": { + "tags": "fix,restore", + "title": "修復", + "desc": "破損したPDFの修復を試みます。" + }, + "removeBlanks": { + "tags": "delete,clean,empty", + "title": "空白ページの削除", + "desc": "ドキュメントから空白ページを検出して削除します。" + }, + "removeAnnotations": { + "tags": "delete,clean,strip", + "title": "注釈の削除", + "desc": "PDFからすべてのコメント・注釈を削除します。" + }, + "compare": { + "tags": "difference", + "title": "比較", + "desc": "2つのPDFを比較して表示します。" + }, + "removeCertSign": { + "tags": "remove,delete,unlock", + "title": "証明書の署名を削除する", + "desc": "PDFから証明書署名を削除する" + }, + "pageLayout": { + "tags": "layout,arrange,combine", + "title": "マルチページレイアウト", + "desc": "PDFの複数のページを1ページに結合します。" + }, + "bookletImposition": { + "tags": "booklet,print,binding", + "title": "小冊子面付け", + "desc": "印刷と製本に適したページ順と多面付けレイアウトで小冊子を作成" + }, + "scalePages": { + "tags": "resize,adjust,scale", + "title": "ページの縮尺の調整", + "desc": "ページやコンテンツの縮尺を変更します。" + }, + "addPageNumbers": { + "tags": "number,pagination,count", + "title": "ページ番号の追加", + "desc": "ドキュメント全体の設定された場所にページ番号を追加します。" + }, + "autoRename": { + "tags": "auto-detect,header-based,organize,relabel", + "title": "PDF ファイル名を自動変更", + "desc": "検出されたヘッダーに基づいて PDF ファイル名を自動変更" + }, + "adjustContrast": { + "tags": "contrast,brightness,saturation", + "title": "色/コントラストの調整", + "desc": "PDFのコントラスト、彩度、明るさを調整します。" + }, + "crop": { + "tags": "trim,cut,resize", + "title": "PDFのトリミング", + "desc": "PDFをトリミングしてサイズを縮小します (テキストは維持します!)。" + }, + "autoSplitPDF": { + "tags": "auto,split,QR", + "title": "ページの自動分割", + "desc": "ページ分割用QRコードを使用したスキャンしたPDFを自動分割します。" + }, + "sanitize": { + "tags": "clean,purge,remove", + "title": "無害化", + "desc": "PDF ファイルから潜在的に有害な要素を削除" + }, + "getPdfInfo": { + "tags": "info,metadata,details", + "title": "PDFのすべての情報を入手", + "desc": "PDFのあらゆる情報を取得します。" + }, + "pdfToSinglePage": { + "tags": "combine,merge,single", + "title": "PDFを単一の大きなページに変換", + "desc": "PDFのすべてのページを1つの大きな単一ページに結合します" + }, + "showJS": { + "tags": "javascript,code,script", + "title": "JavaScriptを表示", + "desc": "PDFに挿入されたJavaScriptを検索して表示します。" + }, + "redact": { + "tags": "censor,blackout,hide", + "title": "手動墨消し", + "desc": "選択したテキスト、描画した図形、選択したページに基づいてPDFを墨消します。" + }, + "overlayPdfs": { + "tags": "overlay,combine,stack", + "title": "PDF をオーバーレイ", + "desc": "PDF を別の PDF に重ね合わせます" + }, + "splitBySections": { + "tags": "split,sections,divide", + "title": "セクションで PDF を分割", + "desc": "PDF の各ページを水平・垂直の小セクションに分割" + }, + "addStamp": { + "tags": "stamp,mark,seal", + "title": "PDF にスタンプを追加", + "desc": "指定位置にテキストまたは画像スタンプを追加" + }, + "removeImage": { + "tags": "remove,delete,clean", + "title": "画像の削除", + "desc": "PDFから画像を削除してファイルサイズを小さくします" + }, + "splitByChapters": { + "tags": "split,chapters,structure", + "title": "PDFをチャプターごとに分割", + "desc": "チャプターの構造に基づいてPDFを複数のファイルに分割します" + }, + "validateSignature": { + "tags": "validate,verify,certificate", + "title": "PDF署名の検証", + "desc": "PDF文書のデジタル署名と証明書を検証します" + }, + "swagger": { + "tags": "API,documentation,test", + "title": "API ドキュメント", + "desc": "API ドキュメントを表示し、エンドポイントをテスト" + }, + "scannerEffect": { + "tags": "scan,simulate,create", + "title": "スキャナー風効果", + "desc": "スキャンしたように見える PDF を作成" + }, + "editTableOfContents": { + "tags": "bookmarks,contents,edit", + "title": "目次の編集", + "desc": "PDFドキュメントにしおりと目次を追加または編集します" + }, + "manageCertificates": { + "tags": "certificates,import,export", + "title": "証明書を管理", + "desc": "PDF 署名に使用するデジタル証明書ファイルをインポート、エクスポート、削除します。" + }, + "read": { + "tags": "view,open,display", + "title": "閲覧", + "desc": "PDF を閲覧・注釈。テキストのハイライト、描画、コメント挿入でレビューやコラボに対応。" + }, + "reorganizePages": { + "tags": "rearrange,reorder,organize", + "title": "ページを再配置", + "desc": "ドラッグ&ドロップで視覚的に PDF ページを並べ替え・複製・削除。" + }, + "extractPages": { + "tags": "pull,select,copy", + "title": "ページの抽出", + "desc": "PDF 文書から特定のページを抽出" + }, + "removePages": { + "tags": "delete,extract,exclude", "title": "削除", "desc": "PDFから不要なページを削除します。" }, + "autoSizeSplitPDF": { + "tags": "auto,split,size", + "title": "サイズ・数による自動分割", + "desc": "サイズ・ページ数またはドキュメント数に基づいて、1つのPDFを複数のドキュメントに分割します。" + }, + "replaceColor": { + "title": "色の置換と反転", + "desc": "PDF 文書の色を置換または反転" + }, + "devApi": { + "tags": "API,development,documentation", + "title": "API", + "desc": "API ドキュメントへのリンク" + }, + "devFolderScanning": { + "tags": "automation,folder,scanning", + "title": "自動フォルダスキャン", + "desc": "自動フォルダスキャン ガイドへのリンク" + }, + "devSsoGuide": { + "title": "SSO ガイド", + "desc": "SSO ガイドへのリンク" + }, + "devAirgapped": { + "title": "エアギャップ設定", + "desc": "エアギャップ環境のセットアップガイドへのリンク" + }, "addPassword": { "title": "パスワードの追加", "desc": "PDFをパスワードで暗号化します。" }, - "removePassword": { - "title": "パスワードの削除", - "desc": "PDFからパスワードの削除します。" - }, - "compress": { - "title": "圧縮", - "desc": "PDFを圧縮してファイルサイズを小さくします。" - }, - "unlockPDFForms": { - "title": "PDFフォームのロックを解除", - "desc": "PDFドキュメント内のフォームフィールドの読み取り専用プロパティを削除します。" - }, - "changeMetadata": { - "title": "メタデータの変更", - "desc": "PDFのメタデータを変更/削除/追加します。" - }, - "fileToPDF": { - "title": "ファイルをPDFに変換", - "desc": "ほぼすべてのファイルをPDFに変換します。 (DOCX, PNG, XLS, PPT, TXTなど)" - }, - "ocr": { - "title": "OCR / クリーンアップ", - "desc": "クリーンアップはPDF内の画像からテキストを検出してテキストとして再追加します。" - }, - "extractImages": { - "title": "画像の抽出", - "desc": "PDFからすべての画像を抽出してzipで保存します。" - }, - "pdfToPDFA": { - "title": "PDFをPDF/Aに変換", - "desc": "長期保存のためにPDFをPDF/Aに変換。" - }, - "PDFToWord": { - "title": "PDFをWordに変換", - "desc": "PDFをWord形式に変換します。 (DOC, DOCX および ODT)" - }, - "PDFToPresentation": { - "title": "PDFをプレゼンテーションに変換", - "desc": "PDFをプレゼンテーション形式に変換します。 (PPT, PPTX および ODP)" - }, - "PDFToText": { - "title": "PDFをText/RTFに変換", - "desc": "PDFをTextまたはRTF形式に変換します。" - }, - "PDFToHTML": { - "title": "PDFをHTMLに変換", - "desc": "PDFをHTML形式に変換します。" - }, - "PDFToXML": { - "title": "PDFをXMLに変換", - "desc": "PDFをXML形式に変換します。" - }, - "ScannerImageSplit": { - "title": "スキャンされた画像の検出/分割", - "desc": "1枚の画像/PDFから複数の写真を分割します。" - }, - "sign": { - "title": "署名", - "desc": "手書き、テキストまたは画像によってPDFに署名を追加します。" - }, - "flatten": { - "title": "平坦化", - "desc": "PDFからインタラクティブな要素とフォームをすべて削除します。" - }, - "repair": { - "title": "修復", - "desc": "破損したPDFの修復を試みます。" - }, - "removeBlanks": { - "title": "空白ページの削除", - "desc": "ドキュメントから空白ページを検出して削除します。" - }, - "removeAnnotations": { - "title": "注釈の削除", - "desc": "PDFからすべてのコメント・注釈を削除します。" - }, - "compare": { - "title": "比較", - "desc": "2つのPDFを比較して表示します。" - }, - "certSign": { - "title": "証明書による署名", - "desc": "証明書/キーを使用してPDFに署名します。 (PEM/P12)" - }, - "removeCertSign": { - "title": "証明書の署名を削除する", - "desc": "PDFから証明書署名を削除する" - }, - "pageLayout": { - "title": "マルチページレイアウト", - "desc": "PDFの複数のページを1ページに結合します。" - }, - "scalePages": { - "title": "ページの縮尺の調整", - "desc": "ページやコンテンツの縮尺を変更します。" - }, - "pipeline": { - "title": "パイプライン", - "desc": "パイプラインスクリプトを定義してPDF上で複数のアクションを実行します。" - }, - "addPageNumbers": { - "title": "ページ番号の追加", - "desc": "ドキュメント全体の設定された場所にページ番号を追加します。" - }, - "auto-rename": { - "title": "PDFファイル名の自動変更", - "desc": "検出されたヘッダーに基づいてPDFファイルの名前を自動的に変更します。" - }, - "adjustContrast": { - "title": "色/コントラストの調整", - "desc": "PDFのコントラスト、彩度、明るさを調整します。" - }, - "crop": { - "title": "PDFのトリミング", - "desc": "PDFをトリミングしてサイズを縮小します (テキストは維持します!)。" - }, - "autoSplitPDF": { - "title": "ページの自動分割", - "desc": "ページ分割用QRコードを使用したスキャンしたPDFを自動分割します。" - }, - "sanitizePDF": { - "title": "サニタイズ", - "desc": "PDFファイルからスクリプトやその他の要素を削除します。" - }, - "URLToPDF": { - "title": "URL/WebサイトをPDFに変換", - "desc": "あらゆるhttp(s)URLをPDFに変換します。" - }, - "HTMLToPDF": { - "title": "HTMLをPDFに変換", - "desc": "HTMLファイルまたはzipをPDFに変換します。" - }, - "MarkdownToPDF": { - "title": "MarkdownをPDFに変換", - "desc": "あらゆるMarkdownファイルをPDFに変換します。" - }, - "PDFToMarkdown": { - "title": "PDFをMarkdownに変換", - "desc": "あらゆるPDFをMarkdownに変換します。" - }, - "getPdfInfo": { - "title": "PDFのすべての情報を入手", - "desc": "PDFのあらゆる情報を取得します。" - }, - "pageExtracter": { - "title": "ページの抽出", - "desc": "PDFから選択したページを抽出します。" - }, - "pdfToSinglePage": { - "title": "PDFを単一の大きなページに変換", - "desc": "PDFのすべてのページを1つの大きな単一ページに結合します" - }, - "showJS": { - "title": "JavaScriptを表示", - "desc": "PDFに挿入されたJavaScriptを検索して表示します。" - }, - "autoRedact": { - "title": "自動墨消し", - "desc": "入力したテキストに基づいてPDF内のテキストを自動で墨消し(黒塗り)ます。" - }, - "redact": { - "title": "手動墨消し", - "desc": "選択したテキスト、描画した図形、選択したページに基づいてPDFを墨消します。" - }, - "PDFToCSV": { - "title": "PDFをCSVに変換", - "desc": "PDFから表を抽出しCSVに変換します。" - }, - "split-by-size-or-count": { - "title": "サイズ・数による自動分割", - "desc": "サイズ・ページ数またはドキュメント数に基づいて、1つのPDFを複数のドキュメントに分割します。" - }, - "overlay-pdfs": { - "title": "PDFのオーバーレイ", - "desc": "PDFの上に別のPDFを重ねます。" - }, - "split-by-sections": { - "title": "PDFをセクションで分割", - "desc": "PDFの各ページを縦横に分割します。" - }, - "AddStampRequest": { - "title": "PDFにスタンプを追加", - "desc": "設定した位置にテキストや画像のスタンプを追加できます" - }, - "removeImage": { - "title": "画像の削除", - "desc": "PDFから画像を削除してファイルサイズを小さくします" - }, - "splitByChapters": { - "title": "PDFをチャプターごとに分割", - "desc": "チャプターの構造に基づいてPDFを複数のファイルに分割します" - }, - "validateSignature": { - "title": "PDF署名の検証", - "desc": "PDF文書のデジタル署名と証明書を検証します" - }, - "replace-color": { - "title": "色の置換と反転", - "desc": "PDF内のテキストと背景の色を置き換え、PDFのフルカラーを反転してファイルサイズを縮小します。" - }, - "convert": { - "title": "変換" - }, - "attachments": { - "title": "添付ファイルの追加", - "desc": "PDFに埋め込みファイル(添付ファイル)を追加または削除します" - }, - "editTableOfContents": { - "title": "目次の編集", - "desc": "PDFドキュメントにしおりと目次を追加または編集します" - }, - "extractPages": { - "title": "ページの抽出" - }, - "removePages": { - "title": "削除", - "desc": "PDFから不要なページを削除します。" - }, - "removeImagePdf": { - "title": "画像の削除", - "desc": "PDFから画像を削除してファイルサイズを小さくします" - }, - "autoSizeSplitPDF": { - "title": "サイズ・数による自動分割", - "desc": "サイズ・ページ数またはドキュメント数に基づいて、1つのPDFを複数のドキュメントに分割します。" - }, - "adjust-contrast": { - "title": "色/コントラストの調整", - "desc": "PDFのコントラスト、彩度、明るさを調整します。" - }, - "replaceColorPdf": { - "title": "色の置換と反転", - "desc": "PDF内のテキストと背景の色を置き換え、PDFのフルカラーを反転してファイルサイズを縮小します。" - }, "changePermissions": { - "title": "権限の変更" + "title": "権限の変更", + "desc": "文書の制限と権限を変更" + }, + "automate": { + "tags": "workflow,sequence,automation", + "title": "自動化", + "desc": "PDF アクションを連結して複数ステップのワークフローを構築。繰り返し作業に最適です。" } }, + "landing": { + "addFiles": "ファイルを追加", + "uploadFromComputer": "コンピュータからアップロード" + }, "viewPdf": { "tags": "view,read,annotate,text,image", "title": "PDFの表示/編集", @@ -650,17 +691,29 @@ "merge": { "tags": "merge,Page operations,Back end,server side", "title": "結合", - "header": "複数のPDFを結合 (2ファイル以上)", - "sortByName": "名前で並べ替え", - "sortByDate": "日付で並べ替え", - "removeCertSign": "結合されたファイル内のデジタル署名を削除しますか?", + "removeDigitalSignature.tooltip": { + "title": "デジタル署名を削除", + "description": "ファイルを結合するとデジタル署名は無効になります。最終的な結合 PDF から署名を削除するにはチェックを入れてください。" + }, + "generateTableOfContents.tooltip": { + "title": "目次を生成", + "description": "元のファイル名とページ番号に基づいて、結合後の PDF にクリック可能な目次を自動作成します。" + }, "submit": "結合", "sortBy": { - "filename": "ファイル名" + "description": "ファイルは選択した順に結合されます。ドラッグで並べ替えるか、下のソートを使用してください。", + "label": "並べ替え", + "filename": "ファイル名", + "dateModified": "更新日", + "ascending": "昇順", + "descending": "降順", + "sort": "ソート" + }, + "error": { + "failed": "PDF の結合中にエラーが発生しました。" } }, "split": { - "tags": "Page operations,divide,Multi Page,cut,server side", "title": "PDFの分割", "header": "PDFの分割", "desc": { @@ -690,12 +743,77 @@ } }, "rotate": { - "tags": "server side", "title": "PDFの回転", - "header": "PDFの回転", - "selectAngle": "回転角度を選択 (90度の倍数):", "submit": "回転" }, + "convert": { + "title": "変換", + "desc": "異なる形式間でファイルを変換します", + "files": "ファイル", + "selectFilesPlaceholder": "開始するにはメインビューでファイルを選択してください", + "settings": "設定", + "conversionCompleted": "変換が完了しました", + "results": "結果", + "defaultFilename": "converted_file", + "conversionResults": "変換結果", + "convertFrom": "変換元", + "convertTo": "変換先", + "sourceFormatPlaceholder": "変換元形式", + "targetFormatPlaceholder": "変換先形式", + "selectSourceFormatFirst": "先に変換元形式を選択してください", + "outputOptions": "出力オプション", + "pdfOptions": "PDF オプション", + "imageOptions": "画像オプション", + "colorType": "色の種類", + "color": "色", + "greyscale": "グレースケール", + "blackwhite": "白黒", + "dpi": "DPI", + "output": "出力", + "single": "単一", + "multiple": "複数", + "fitOption": "フィットオプション", + "maintainAspectRatio": "縦横比を維持", + "fitDocumentToPage": "ページに合わせて文書をフィット", + "fillPage": "フルページ", + "autoRotate": "自動回転", + "autoRotateDescription": "PDF ページにより適した向きになるよう画像を自動回転します", + "combineImages": "画像を結合", + "combineImagesDescription": "すべての画像を 1 つの PDF に結合するか、各画像ごとに別々の PDF を作成します", + "webOptions": "Web → PDF オプション", + "zoomLevel": "ズームレベル", + "emailOptions": "メール → PDF オプション", + "includeAttachments": "メールの添付ファイルを含める", + "maxAttachmentSize": "最大添付サイズ(MB)", + "includeAllRecipients": "ヘッダーに CC と BCC 受信者を含める", + "downloadHtml": "PDF の代わりに中間ファイル(HTML)をダウンロード", + "pdfaOptions": "PDF/A オプション", + "outputFormat": "出力形式", + "pdfaNote": "PDF/A-1b は互換性が高く、PDF/A-2b はより多くの機能をサポートします。", + "pdfaDigitalSignatureWarning": "PDFにはデジタル署名が含まれています。これは次の手順で削除されます。", + "fileFormat": "ファイル形式", + "wordDoc": "Word 文書", + "wordDocExt": "Word 文書(.docx)", + "odtExt": "OpenDocument テキスト(.odt)", + "pptExt": "PowerPoint(.pptx)", + "odpExt": "OpenDocument プレゼンテーション(.odp)", + "txtExt": "プレーンテキスト(.txt)", + "rtfExt": "リッチテキスト形式(.rtf)", + "selectedFiles": "選択したファイル", + "noFileSelected": "ファイルが選択されていません。ファイルパネルから追加してください。", + "convertFiles": "ファイルを変換", + "converting": "変換中...", + "downloadConverted": "変換後のファイルをダウンロード", + "errorNoFiles": "変換するファイルを少なくとも 1 つ選択してください。", + "errorNoFormat": "変換元と変換先の両方の形式を選択してください。", + "errorNotSupported": "{{from}} から {{to}} への変換はサポートされていません。", + "images": "画像", + "officeDocs": "オフィス文書(Word、Excel、PowerPoint)", + "imagesExt": "画像(JPG、PNG など)", + "markdown": "Markdown", + "textRtf": "テキスト/RTF", + "grayscale": "グレースケール" + }, "imageToPdf": { "tags": "conversion,img,jpg,picture,photo,psd,photoshop" }, @@ -737,35 +855,25 @@ "placeholder": "(例:1,3,2または4-8,2,10-12または2n-1)" }, "addImage": { - "tags": "img,jpg,picture,photo", + "tags": "画像,img,jpg,ピクチャ,写真", "title": "画像の追加", "header": "PDFに画像を追加", "everyPage": "全ページ?", "upload": "画像の追加", "submit": "画像の追加" }, + "attachments": { + "tags": "embed,attach,file,attachment,attachments", + "title": "添付ファイルの追加", + "header": "添付ファイルの追加", + "add": "添付を追加", + "remove": "添付を削除", + "embed": "添付を埋め込む", + "submit": "添付ファイルの追加" + }, "watermark": { - "tags": "Text,repeating,label,own,copyright,trademark,img,jpg,picture,photo", "title": "透かしの追加", - "header": "透かしの追加", - "customColor": "文字色のカスタム", - "selectText": { - "1": "透かしを追加するPDFを選択:", - "2": "透かしのテキスト:", - "3": "文字サイズ:", - "4": "回転 (0-360):", - "5": "幅スペース (各透かし間の水平方向のスペース):", - "6": "高さスペース (各透かし間の垂直方向のスペース):", - "7": "不透明度 (0% - 100%):", - "8": "透かしの種類:", - "9": "透かしの画像:", - "10": "PDFをPDFイメージに変換する" - }, "submit": "透かしを追加", - "type": { - "1": "テキスト", - "2": "画像" - }, "watermarkType": { "text": "テキスト" }, @@ -797,52 +905,60 @@ "title": "削除", "submit": "削除" }, - "addPassword": { - "tags": "secure,security", - "title": "パスワードの追加", - "header": "パスワードの追加 (暗号化)", - "selectText": { - "1": "暗号化するPDFを選択", - "2": "ユーザーパスワード", - "3": "暗号化キーの長さ", - "4": "値が大きいほど強力ですが、値が小さいほど互換性が高くなります。", - "5": "権限の設定 (所有者パスワードとの併用をおすすめします)", - "6": "ドキュメントの組立を禁止", - "7": "コンテンツの抽出を禁止", - "8": "アクセシビリティのための抽出を禁止", - "9": "フォームへの入力を禁止", - "10": "変更を禁止", - "11": "注釈の変更を禁止", - "12": "印刷を禁止", - "13": "異なる形式の印刷を禁止", - "14": "所有者パスワード", - "15": "ドキュメントを開いた後に実行できる操作を制限します (すべてのリーダーでサポートされているわけではありません)", - "16": "ドキュメントを開くことを制限します" + "bulkSelection": { + "header": { + "title": "ページ選択ガイド" }, - "submit": "暗号化", - "tooltip": { - "permissions": { - "title": "権限の変更" + "syntax": { + "title": "構文の基本", + "text": "数値、範囲、キーワード、等差列(n は 0 から)を使用します。括弧も使用できます。", + "bullets": { + "numbers": "数値/範囲:5、10-20", + "keywords": "キーワード:odd, even", + "progressions": "等差列:3n、4n+1" } - } - }, - "removePassword": { - "tags": "secure,Decrypt,security,unpassword,delete password", - "title": "パスワードの削除", - "header": "パスワードの削除 (復号化)", - "selectText": { - "1": "復号化するPDFを選択", - "2": "パスワード" }, - "submit": "削除", - "desc": "PDFからパスワードの削除します。", - "password": { - "stepTitle": "パスワードの削除", - "label": "現在のパスワード" + "operators": { + "title": "演算子", + "text": "AND はカンマより優先されます。NOT は文書範囲内に適用されます。", + "and": "AND:& または \"and\" — 両方の条件を必須(例:1-50 & even)", + "comma": "カンマ:, または | — 選択を結合(例:1-10, 20)", + "not": "NOT:! または \"not\" — ページを除外(例:3n & not 30)" + }, + "examples": { + "title": "例", + "first50": "最初の 50", + "last50": "最後の 50", + "every3rd": "3 ページごと", + "oddWithinExcluding": "1–20 の奇数(5–7 を除外)", + "combineSets": "セットを結合" + }, + "firstNPages": { + "title": "最初の N ページ", + "placeholder": "ページ数" + }, + "lastNPages": { + "title": "最後の N ページ", + "placeholder": "ページ数" + }, + "everyNthPage": { + "title": "N ページごと", + "placeholder": "ステップ幅" + }, + "range": { + "title": "範囲", + "fromPlaceholder": "開始", + "toPlaceholder": "終了" + }, + "keywords": { + "title": "キーワード" + }, + "advanced": { + "title": "詳細" } }, "compressPdfs": { - "tags": "squish,small,tiny" + "tags": "圧縮,小さく,軽量" }, "unlockPDFForms": { "tags": "remove,delete,form,field,readonly", @@ -851,25 +967,118 @@ "submit": "Remove" }, "changeMetadata": { - "tags": "Title,author,date,creation,time,publisher,producer,stats", - "title": "タイトル:", "header": "メタデータの変更", - "selectText": { - "1": "変更したい変数を編集してください", - "2": "すべてのメタデータを削除", - "3": "カスタムメタデータを表示", - "4": "その他のメタデータ:", - "5": "カスタムメタデータの追加" + "submit": "変更", + "filenamePrefix": "metadata", + "settings": { + "title": "メタデータ設定" }, - "author": "著者:", - "creationDate": "作成日 (yyyy/MM/dd HH:mm:ss):", - "creator": "作成者:", - "keywords": "キーワード:", - "modDate": "変更日 (yyyy/MM/dd HH:mm:ss):", - "producer": "プロデューサー:", - "subject": "主題:", - "trapped": "トラッピング:", - "submit": "変更" + "standardFields": { + "title": "標準フィールド" + }, + "deleteAll": { + "label": "既存メタデータを削除", + "checkbox": "すべてのメタデータを削除" + }, + "title": { + "label": "タイトル", + "placeholder": "文書のタイトル" + }, + "author": { + "label": "著者", + "placeholder": "文書の著者" + }, + "subject": { + "label": "件名", + "placeholder": "文書の件名" + }, + "keywords": { + "label": "キーワード", + "placeholder": "文書のキーワード" + }, + "creator": { + "label": "作成アプリ", + "placeholder": "文書の作成アプリ" + }, + "producer": { + "label": "生成アプリ", + "placeholder": "文書の生成アプリ" + }, + "dates": { + "title": "日付フィールド" + }, + "creationDate": { + "label": "作成日", + "placeholder": "作成日" + }, + "modificationDate": { + "label": "更新日", + "placeholder": "更新日" + }, + "trapped": { + "label": "トラッピング状態", + "unknown": "Unknown", + "true": "True", + "false": "False" + }, + "advanced": { + "title": "詳細オプション" + }, + "customFields": { + "title": "カスタムメタデータ", + "description": "文書にカスタムメタデータ項目を追加します", + "add": "フィールドを追加", + "key": "キー", + "keyPlaceholder": "カスタムキー", + "value": "値", + "valuePlaceholder": "カスタム値", + "remove": "削除" + }, + "results": { + "title": "更新された PDF" + }, + "error": { + "failed": "PDF メタデータの変更中にエラーが発生しました。" + }, + "tooltip": { + "header": { + "title": "PDF メタデータの概要" + }, + "dates": { + "title": "日付フィールド", + "text": "文書の作成日時と最終更新日時です。", + "bullet1": "作成日:文書が作られた日", + "bullet2": "更新日:最後に変更された日" + }, + "options": { + "title": "追加オプション", + "text": "カスタム項目とプライバシー制御。", + "bullet1": "カスタムメタデータ:独自のキー/値を追加", + "bullet2": "トラッピング:高品質印刷向け設定", + "bullet3": "すべて削除:プライバシー保護のため" + }, + "deleteAll": { + "title": "既存メタデータの削除", + "text": "プライバシー保護のためにメタデータを完全削除します。" + }, + "customFields": { + "title": "カスタムメタデータ", + "text": "独自のキーと値のペアを追加します。", + "bullet1": "文書に関連する任意のカスタム項目を追加", + "bullet2": "例:部署、プロジェクト、バージョン、ステータス", + "bullet3": "各項目にはキーと値が必要" + }, + "advanced": { + "title": "詳細オプション", + "trapped": { + "title": "トラッピング状態", + "description": "高品質印刷のために文書が準備されているかを示します。", + "bullet1": "True:高品質印刷のためにトラッピング済み", + "bullet2": "False:トラッピングされていない", + "bullet3": "Unknown:トラッピング状態は未指定" + } + } + } }, "fileToPDF": { "tags": "transformation,format,document,picture,slide,text,conversion,office,docs,word,excel,powerpoint", @@ -883,6 +1092,7 @@ "ocr": { "tags": "recognition,text,image,scan,read,identify,detection,editable", "title": "OCR / クリーンアップ", + "desc": "クリーンアップはPDF内の画像からテキストを検出してテキストとして再追加します。", "header": "クリーンアップ / OCR (光学式文字認識)", "selectText": { "1": "PDF内で検出される言語を選択 (リストされているものは現在検出されているものです):", @@ -901,22 +1111,85 @@ "help": "他の言語でこれを使用する方法やDocker以外で使用する方法についてはこのドキュメントをお読みください。", "credit": "本サービスにはOCRにqpdfとTesseractを使用しています。", "submit": "OCRでPDFを処理する", - "desc": "クリーンアップはPDF内の画像からテキストを検出してテキストとして再追加します。", + "operation": { + "submit": "OCR を実行してレビュー" + }, + "results": { + "title": "OCR 結果" + }, + "languagePicker": { + "additionalLanguages": "追加の言語をお探しですか?", + "viewSetupGuide": "セットアップガイドを見る →" + }, "settings": { "title": "設定", "ocrMode": { - "label": "OCRモード" + "label": "OCRモード", + "auto": "自動(テキストレイヤーはスキップ)", + "force": "強制(全ページを再 OCR・テキスト置換)", + "strict": "厳密(テキストが見つかったら中止)" }, "languages": { - "label": "言語" + "label": "言語", + "placeholder": "言語を選択" + }, + "compatibilityMode": { + "label": "互換モード" + }, + "advancedOptions": { + "label": "処理オプション", + "sidecar": "テキストファイルを作成", + "deskew": "ページの傾きを補正", + "clean": "入力ファイルをクリーン化", + "cleanFinal": "最終出力をクリーン化" } }, "tooltip": { + "header": { + "title": "OCR 設定の概要" + }, "mode": { - "title": "OCRモード" + "title": "OCRモード", + "text": "OCR(光学式文字認識)は、スキャンやスクリーンショットのページを検索・コピー・ハイライト可能なテキストに変換します。", + "bullet1": "自動はすでにテキストレイヤーを含むページをスキップします。", + "bullet2": "強制はすべてのページを再 OCR し、テキストを置換します。", + "bullet3": "厳密は選択可能なテキストが見つかれば処理を停止します。" }, "languages": { - "title": "言語" + "title": "言語", + "text": "想定する言語を指定することで OCR の精度を高めます。検出を補助するため 1 つ以上の言語を選択してください。" + }, + "output": { + "title": "出力", + "text": "テキスト出力の形式を選択してください:", + "bullet1": "検索可能 PDF は、元画像の背後にテキストを埋め込みます。", + "bullet2": "HOCR XML は構造化された機械可読ファイルを返します。", + "bullet3": "プレーンテキストのサイドカーは生テキストを含む別個の .txt を作成します。" + }, + "advanced": { + "header": { + "title": "高度な OCR 処理" + }, + "compatibility": { + "title": "互換モード", + "text": "OCR の “サンドイッチ PDF” モードを使用します:ファイルサイズは大きくなりますが、一部の言語や古い PDF ソフトでより確実です。既定では小さくモダンな hOCR を使用します。" + }, + "sidecar": { + "title": "テキストファイルを作成", + "text": "抽出された全テキストを含む .txt ファイルを PDF と並行して生成し、アクセスや処理を容易にします。" + }, + "deskew": { + "title": "ページの傾きを補正", + "text": "傾いたページを自動補正して OCR 精度を向上します。完全に整列していないスキャン文書に有用です。" + }, + "clean": { + "title": "入力ファイルをクリーン化", + "text": "ノイズ除去、コントラスト強調などの前処理を行い、OCR の認識精度を高めてから処理します。" + }, + "cleanFinal": { + "title": "最終出力をクリーン化", + "text": "OCR のアーティファクトを除去し、テキストレイヤーを最適化して可読性の向上とファイルサイズの縮小を図ります。" + } } } }, @@ -926,7 +1199,13 @@ "header": "画像の抽出", "selectText": "抽出した画像のフォーマットを選択", "allowDuplicates": "重複した画像を保存する", - "submit": "抽出" + "submit": "抽出", + "settings": { + "title": "設定" + }, + "error": { + "failed": "PDF からの画像抽出中にエラーが発生しました。" + } }, "pdfToPDFA": { "tags": "archive,long-term,standard,conversion,storage,preservation", @@ -939,7 +1218,7 @@ "pdfWithDigitalSignature": "PDFにはデジタル署名が含まれています。これは次の手順で削除されます。" }, "PDFToWord": { - "tags": "doc,docx,odt,word,transformation,format,conversion,office,microsoft,docfile", + "tags": "doc,docx,odt,word,変換,フォーマット,コンバージョン,オフィス,microsoft,docファイル", "title": "PDFをWordに変換", "header": "PDFをWordに変換", "selectText": { @@ -949,7 +1228,7 @@ "submit": "変換" }, "PDFToPresentation": { - "tags": "slides,show,office,microsoft", + "tags": "スライド,プレゼン,オフィス,microsoft", "title": "PDFをプレゼンテーションに変換", "header": "PDFをプレゼンテーションに変換", "selectText": { @@ -959,7 +1238,7 @@ "submit": "変換" }, "PDFToText": { - "tags": "richformat,richtextformat,rich text format", + "tags": "リッチフォーマット,リッチテキストフォーマット,リッチ テキスト フォーマット", "title": "PDFをText/RTFに変換", "header": "PDFをText/RTFに変換", "selectText": { @@ -969,21 +1248,21 @@ "submit": "変換" }, "PDFToHTML": { - "tags": "web content,browser friendly", + "tags": "ウェブコンテンツ,ブラウザー対応", "title": "PDFをHTMLに変換", "header": "PDFをHTMLに変換", "credit": "本サービスはファイル変換にpdftohtmlを使用しています。", "submit": "変換" }, "PDFToXML": { - "tags": "data-extraction,structured-content,interop,transformation,convert", + "tags": "データ抽出,構造化コンテンツ,相互運用,変換,コンバート", "title": "PDFをXMLに変換", "header": "PDFをXMLに変換", "credit": "本サービスはファイル変換にLibreOfficeを使用しています。", "submit": "変換" }, "ScannerImageSplit": { - "tags": "separate,auto-detect,scans,multi-photo,organize", + "tags": "分割,自動検出,スキャン,複数写真,整理", "selectText": { "1": "角度のしきい値:", "2": "画像を回転させるために必要な絶対角度の最小値を設定 (初期値:10)。", @@ -999,7 +1278,6 @@ "info": "Pythonがインストールされていません。実行する必要があります。" }, "sign": { - "tags": "authorize,initials,drawn-signature,text-sign,image-signature", "title": "署名", "header": "PDFに署名", "upload": "画像をアップロード", @@ -1023,16 +1301,49 @@ "redo": "やり直す" }, "flatten": { - "tags": "static,deactivate,non-interactive,streamline", "title": "平坦化", "header": "PDFを平坦化する", "flattenOnlyForms": "フォームのみを平坦にする", "submit": "平坦化", + "filenamePrefix": "flattened", + "files": { + "placeholder": "開始するにはメインビューで PDF ファイルを選択してください" + }, "steps": { "settings": "設定" }, "options": { - "flattenOnlyForms": "フォームのみを平坦にする" + "stepTitle": "フラット化オプション", + "title": "フラット化オプション", + "flattenOnlyForms.desc": "フォームフィールドのみをフラット化し、その他のインタラクティブ要素は維持します", + "note": "フラット化すると PDF からインタラクティブ要素が削除され、編集できなくなります。" + }, + "results": { + "title": "フラット化の結果" + }, + "error": { + "failed": "PDF のフラット化中にエラーが発生しました。" + }, + "tooltip": { + "header": { + "title": "PDF のフラット化について" + }, + "description": { + "title": "フラット化とは?", + "text": "フラット化は、入力可能なフォームやボタンを通常のテキストや画像に変換して PDF を編集不可にします。見た目はまったく同じですが、フォームの入力や変更はできなくなります。完成したフォームの共有、記録用の最終文書作成、表示の一貫性確保に最適です。", + "bullet1": "テキストボックスは通常のテキストになり(編集不可)", + "bullet2": "チェックボックスやボタンは画像になります", + "bullet3": "変更されたくない最終版に最適", + "bullet4": "すべてのデバイスで見た目が一貫します" + }, + "formsOnly": { + "title": "「フォームのみフラット化」とは?", + "text": "このオプションはフォームの入力機能だけを無効化し、リンクのクリック、ブックマーク表示、コメントの閲覧など他の機能は維持します。", + "bullet1": "フォームは編集不可になります", + "bullet2": "リンクは引き続きクリックで機能します", + "bullet3": "コメントやメモは表示されたままです", + "bullet4": "ブックマークは引き続きナビゲーションに有用です" + } } }, "repair": { @@ -1042,13 +1353,10 @@ "submit": "修復" }, "removeBlanks": { - "tags": "cleanup,streamline,non-content,organize", "title": "空白の削除", "header": "空白ページの削除", "threshold": "しきい値 :", - "thresholdDesc": "白色ピクセルの白さを決めるためのしきい値", "whitePercent": "白比率", - "whitePercentDesc": "削除するページの白の割合", "submit": "空白ページの削除" }, "removeAnnotations": { @@ -1058,7 +1366,7 @@ "submit": "削除" }, "compare": { - "tags": "differentiate,contrast,changes,analysis", + "tags": "差分,対比,変更,分析", "title": "比較", "header": "PDFの比較", "highlightColor": { @@ -1087,21 +1395,122 @@ "certSign": { "tags": "authenticate,PEM,P12,official,encrypt", "title": "証明書による署名", - "header": "証明書を使用してPDFに署名します。 (制作中)", - "selectPDF": "署名するPDFファイルを選択:", - "jksNote": "注: 証明書のタイプが以下にリストされていない場合は、keytoolコマンドラインツールを使用して証明書をJavaキーストア(.jks)ファイルに変換してください。次に以下の.jksファイル オプションを選択します。", - "selectKey": "秘密キーファイルを選択 (PKCS#8形式、.pemまたは.der) :", - "selectCert": "証明書ファイルを選択 (X.509形式、.pemまたは.der) :", - "selectP12": "PKCS#12キーストアファイルを選択 (.p12または.pfx) (オプション。指定する場合は秘密キーと証明書が含まれている必要があります。):", - "selectJKS": "Javaキーストアファイルを選択 (.jks or .keystore):", - "certType": "証明書の種類", - "password": "キーストアまたは秘密キーのパスワードを入力 (ある場合) :", - "showSig": "署名を表示", - "reason": "理由", - "location": "場所", - "name": "名前", - "showLogo": "ロゴを表示", - "submit": "PDFに署名" + "filenamePrefix": "signed", + "signMode": { + "stepTitle": "署名モード", + "tooltip": { + "header": { + "title": "PDF 署名について" + }, + "overview": { + "title": "署名の仕組み", + "text": "どちらのモードでも文書にシールを施し(編集は改ざんとして検知)、誰が・いつ・どのようにを記録します。ビューアーの信頼表示は証明書チェーンに依存します。" + }, + "manual": { + "title": "手動 — 証明書を持ち込む", + "text": "独自の証明書ファイルで署名し、ブランドに合ったアイデンティティを示せます。CA/チェーンが認識されると信頼済みと表示できます。", + "use": "用途:対外的、法務、コンプライアンス。" + }, + "auto": { + "title": "自動 — 設定不要・即時のシステムシール", + "text": "サーバーの自己署名証明書で署名します。同じ改ざん検知シール監査証跡を提供し、多くのビューアーでは未検証と表示されます。", + "use": "用途:迅速性が必要で、レビューや記録で一貫した内部アイデンティティが求められる場合。" + }, + "rule": { + "title": "判断基準", + "text": "受信者側で信頼済み表示が必要なら手動。設定不要で高速な改ざん検知と監査証跡が必要なら自動。" + } + } + }, + "certTypeStep": { + "stepTitle": "証明書形式" + }, + "certFiles": { + "stepTitle": "証明書ファイル" + }, + "appearance": { + "stepTitle": "署名の表示", + "tooltip": { + "header": { + "title": "署名の表示について" + }, + "invisible": { + "title": "不可視署名", + "text": "PDF にセキュリティのため署名を追加しますが、表示時には見えません。見た目を変えずに法的要件を満たしたい場合に最適です。", + "bullet1": "見た目を変えずにセキュリティを提供", + "bullet2": "電子署名の法的要件を満たす", + "bullet3": "文書のレイアウトやデザインに影響しない" + }, + "visible": { + "title": "可視署名", + "text": "PDF 上に署名ブロックを表示し、氏名、日付、任意の詳細を示します。文書が署名済みであることを読者に明確に示したい場合に有用です。", + "bullet1": "署名者名と日付を文書上に表示", + "bullet2": "署名理由と場所を含めることが可能", + "bullet3": "署名を配置するページを選択可能", + "bullet4": "任意でロゴを含められます" + } + } + }, + "sign": { + "submit": "PDF に署名", + "results": "署名済み PDF" + }, + "error": { + "failed": "署名の処理中にエラーが発生しました。" + }, + "tooltip": { + "header": { + "title": "署名の管理について" + }, + "overview": { + "title": "このツールでできること", + "text": "PDF が電子署名されているかの確認や、新しい電子署名の追加ができます。電子署名は文書の作成者や承認者を証明し、署名後に変更があったかを示します。", + "bullet1": "既存の署名とその有効性を確認", + "bullet2": "署名者と証明書の詳細を表示", + "bullet3": "新しい電子署名を追加して文書を保護", + "bullet4": "複数ファイルをサポートし、簡単に移動" + }, + "validation": { + "title": "署名の検証", + "text": "署名の確認では、署名が有効か、誰がいつ署名したか、署名後に文書が変更されたかを知らせます。", + "bullet1": "署名が有効か無効かを表示", + "bullet2": "署名者情報と署名日時を表示", + "bullet3": "署名後に文書が変更されたかを確認", + "bullet4": "検証にカスタム証明書を使用可能" + }, + "signing": { + "title": "署名の追加", + "text": "PDF に署名するには、PEM、PKCS12、JKS などの電子証明書が必要です。署名を文書上に表示することも、セキュリティ目的のみで非表示にすることもできます。", + "bullet1": "PEM、PKCS12、JKS、サーバー証明書形式に対応", + "bullet2": "署名を PDF 上に表示/非表示にするオプション", + "bullet3": "理由、場所、署名者名を追加", + "bullet4": "可視署名の配置ページを選択", + "bullet5": "「Stirling-PDF で署名」用のサーバー証明書を使用可能" + } + }, + "certType": { + "tooltip": { + "header": { + "title": "証明書タイプについて" + }, + "what": { + "title": "証明書とは?", + "text": "あなたが署名したことを証明する安全な ID です。証明書による署名が必須でない場合は、タイプ入力、手書き、アップロードなどの別の安全な方法をお勧めします。" + }, + "which": { + "title": "どのオプションを使うべき?", + "text": "お持ちの証明書ファイルに合う形式を選択してください:", + "bullet1": "PKCS#12(.p12 / .pfx)— 1 つの結合ファイル(最も一般的)", + "bullet2": "PFX(.pfx)— Microsoft の PKCS12 形式", + "bullet3": "PEM — 秘密鍵と証明書の .pem を別々に", + "bullet4": "JKS — 開発/CI-CD 用の Java .jks キーストア" + }, + "convert": { + "title": "鍵が一覧にありませんか?", + "text": "keytool でファイルを Java キーストア(.jks)に変換し、JKS を選択してください。" + } + } + } }, "removeCertSign": { "tags": "authenticate,PEM,P12,official,decrypt", @@ -1118,8 +1527,100 @@ "addBorder": "境界線を追加", "submit": "送信" }, + "bookletImposition": { + "tags": "小冊子,面付け,印刷,製本,折り,折丁", + "title": "小冊子面付け", + "header": "小冊子面付け", + "submit": "小冊子を作成", + "spineLocation": { + "label": "背位置", + "left": "左(標準)", + "right": "右(RTL)" + }, + "doubleSided": { + "label": "両面印刷", + "tooltip": "適切な小冊子印刷のために表裏の両面を作成します" + }, + "manualDuplex": { + "title": "手動両面モード", + "instructions": "自動両面機能のないプリンター用。次の 2 回に分けて印刷します:" + }, + "duplexPass": { + "label": "印刷パス", + "first": "1 回目", + "second": "2 回目", + "firstInstructions": "表面を印刷 → 用紙を表向きのまま積む → 2 回目で再給紙", + "secondInstructions": "印刷済みの束を表向きでトレイに戻す → 裏面を印刷" + }, + "rtlBinding": { + "label": "右綴じ", + "tooltip": "アラビア語、ヘブライ語など右から左の言語向け" + }, + "addBorder": { + "label": "ページの周囲に枠線を追加", + "tooltip": "各ページ区画の周りにカットや位置合わせ用の枠線を追加します" + }, + "addGutter": { + "label": "ノド(余白)を追加", + "tooltip": "製本用の内側余白スペースを追加します" + }, + "gutterSize": { + "label": "ノド幅(ポイント)" + }, + "flipOnShortEdge": { + "label": "短辺で反転(自動両面のみ)", + "tooltip": "短辺反転の自動両面印刷向けに有効化(手動モードでは無視)", + "manualNote": "手動モードでは不要です—束を自分で反転します" + }, + "advanced": { + "toggle": "詳細オプション" + }, + "paperSizeNote": "用紙サイズは 1 ページ目から自動的に取得されます。", + "tooltip": { + "header": { + "title": "小冊子作成ガイド" + }, + "description": { + "title": "小冊子面付けとは?", + "text": "印刷順序に合わせてページを配置し、プロ品質の小冊子を作成します。PDF ページは横置き用紙に 2 面付けされ、折って綴じると本のように正しい順序で読めます。" + }, + "example": { + "title": "例:8 ページ小冊子", + "text": "8 ページ文書は 2 枚の用紙になります:", + "bullet1": "用紙 1 表:ページ 8, 1|裏:ページ 2, 7", + "bullet2": "用紙 2 表:ページ 6, 3|裏:ページ 4, 5", + "bullet3": "折って重ねると:1→2→3→4→5→6→7→8 の順で読めます" + }, + "printing": { + "title": "印刷と組み立て方法", + "text": "完璧な小冊子のための手順:", + "bullet1": "「長辺で反転」の両面印刷を使用", + "bullet2": "用紙を順に重ね、半分に折る", + "bullet3": "折り目に沿ってホチキス留めや製本をする", + "bullet4": "短辺反転プリンターの場合:「短辺で反転」を有効化" + }, + "manualDuplex": { + "title": "手動両面(片面プリンター)", + "text": "自動両面機能がないプリンター向け:", + "bullet1": "「両面印刷」をオフにする", + "bullet2": "「1 回目」を選択 → 印刷 → 束を表向きで積む", + "bullet3": "「2 回目」を選択 → 束をセット → 裏面を印刷", + "bullet4": "通常どおり折って組み立てる" + }, + "advanced": { + "title": "詳細オプション", + "text": "小冊子を細かく調整:", + "bullet1": "右綴じ:RTL 言語向け", + "bullet2": "枠線:トリミング用のカットライン表示", + "bullet3": "ノド:製本/ホチキス用スペースを追加", + "bullet4": "短辺反転:自動両面プリンターのみ" + } + }, + "error": { + "failed": "丁合いレイアウトの作成中にエラーが発生しました。" + } + }, "scalePages": { - "tags": "resize,modify,dimension,adapt", "title": "ページの縮尺の調整", "header": "ページの縮尺の調整", "pageSize": "1ページのサイズ", @@ -1127,26 +1628,114 @@ "scaleFactor": "1ページの拡大レベル (トリミング)。", "submit": "送信" }, + "adjustPageScale": { + "tags": "リサイズ,変更,寸法,調整", + "title": "ページスケールを調整", + "header": "ページスケールを調整", + "scaleFactor": { + "label": "拡大縮小率" + }, + "pageSize": { + "label": "出力ページサイズ", + "keep": "元のサイズを保持", + "letter": "レター", + "legal": "リーガル" + }, + "submit": "ページスケールを調整", + "error": { + "failed": "ページスケールの調整中にエラーが発生しました。" + }, + "tooltip": { + "header": { + "title": "ページスケール設定の概要" + }, + "description": { + "title": "説明", + "text": "PDF コンテンツのサイズを調整し、ページ寸法を変更します。" + }, + "scaleFactor": { + "title": "拡大縮小率", + "text": "ページ上のコンテンツの見え方の大きさを制御します。コンテンツは拡大縮小され中央配置されます。拡大後にページより大きい場合はトリミングされることがあります。", + "bullet1": "1.0 = 元のサイズ", + "bullet2": "0.5 = 半分(50% 小さく)", + "bullet3": "2.0 = 2 倍(200% 大きく、切り抜かれ得ます)" + }, + "pageSize": { + "title": "出力ページサイズ", + "text": "出力 PDF ページの寸法を設定します。「元のサイズを保持」は現在の寸法を維持し、その他は標準的な用紙サイズにリサイズします。" + } + } + }, "add-page-numbers": { - "tags": "paginate,label,organize,index" + "tags": "ページ番号,ラベル,整理,索引" }, "auto-rename": { - "tags": "auto-detect,header-based,organize,relabel", + "tags": "自動検出,ヘッダー基準,整理,リネーム", "title": "ファイル名の自動変更", "header": "PDF名の自動変更", - "submit": "自動リネーム" + "description": "PDF コンテンツからタイトルを自動的に検出し、ファイル名として使用します。", + "submit": "自動リネーム", + "files": { + "placeholder": "開始するにはメインビューで PDF ファイルを選択してください" + }, + "error": { + "failed": "PDF の自動リネーム中にエラーが発生しました。" + }, + "results": { + "title": "自動リネーム結果" + }, + "tooltip": { + "header": { + "title": "自動リネームの仕組み" + }, + "howItWorks": { + "title": "スマートリネーム", + "text": "PDF コンテンツからタイトルを自動的に検出し、ファイル名として使用します。", + "bullet1": "タイトルや見出しと見なせるテキストを探します", + "bullet2": "検出したタイトルからクリーンで有効なファイル名を作成します", + "bullet3": "適切なタイトルが見つからない場合は元の名前を保持します" + } + } }, "adjust-contrast": { "tags": "color-correction,tune,modify,enhance" }, "crop": { - "tags": "trim,shrink,edit,shape", "title": "切り抜き", "header": "PDFのトリミング", - "submit": "送信" + "submit": "送信", + "noFileSelected": "トリミングを開始する PDF ファイルを選択してください", + "preview": { + "title": "切り抜き範囲の選択" + }, + "reset": "PDF 全体にリセット", + "coordinates": { + "title": "位置とサイズ", + "x": "X 位置", + "y": "Y 位置", + "width": "幅", + "height": "高さ" + }, + "error": { + "invalidArea": "切り抜き範囲が PDF の境界を超えています", + "failed": "PDF の切り抜きに失敗しました" + }, + "steps": { + "selectArea": "切り抜き範囲を選択" + }, + "tooltip": { + "title": "PDF を切り抜く方法", + "description": "サムネイル上の青いオーバーレイをドラッグしてサイズ変更し、PDF から切り抜く範囲を選択します。", + "drag": "オーバーレイをドラッグして切り抜き範囲を移動", + "resize": "角と辺のハンドルをドラッグしてサイズ変更", + "precision": "座標入力で正確に位置指定" + }, + "results": { + "title": "切り抜き結果" + } }, "autoSplitPDF": { - "tags": "QR-based,separate,scan-segment,organize", + "tags": "QR ベース,分離,スキャン分割,整理", "title": "PDFの自動分割", "header": "PDFの自動分割", "description": "印刷、挿入、スキャン、アップロード、およびドキュメントを自動分離します。手動での仕分けの必要ありません。", @@ -1165,14 +1754,14 @@ "tags": "clean,secure,safe,remove-threats" }, "URLToPDF": { - "tags": "web-capture,save-page,web-to-doc,archive", + "tags": "ウェブキャプチャ,ページ保存,Web→ドキュメント,アーカイブ", "title": "URLをPDFに変換", "header": "URLをPDFに変換", "submit": "変換", "credit": "WeasyPrintを使用" }, "HTMLToPDF": { - "tags": "markup,web-content,transformation,convert", + "tags": "マークアップ,ウェブコンテンツ,変換,コンバート", "title": "HTMLをPDFに変換", "header": "HTMLをPDFに変換", "help": "HTMLファイルと必要なhtml/css/画像などを含むZIPを受け入れます", @@ -1201,7 +1790,7 @@ "credit": "WeasyPrintを使用" }, "PDFToMarkdown": { - "tags": "markup,web-content,transformation,convert,md", + "tags": "マークアップ,ウェブコンテンツ,変換,コンバート,md", "title": "PDFをMarkdownに変換", "header": "PDFをMarkdownに変換", "submit": "変換" @@ -1217,7 +1806,7 @@ "tags": "extract" }, "PdfToSinglePage": { - "tags": "single page" + "tags": "単一ページ" }, "showJS": { "tags": "JS", @@ -1226,50 +1815,10 @@ "downloadJS": "Javascriptをダウンロード", "submit": "表示" }, - "autoRedact": { - "tags": "Redact,Hide,black out,black,marker,hidden", - "title": "自動墨消し", - "header": "自動墨消し", - "colorLabel": "カラー", - "textsToRedactLabel": "編集するテキスト(行区切り)", - "textsToRedactPlaceholder": "例: \\n機密 \\n極秘", - "useRegexLabel": "正規表現を使用する", - "wholeWordSearchLabel": "単語単位の検索", - "customPaddingLabel": "追加の余白", - "convertPDFToImageLabel": "PDFをPDF画像に変換 (墨消しの後ろのテキストを削除するために使用)", - "submitButton": "送信" - }, "redact": { "tags": "Redact,Hide,black out,black,marker,hidden,manual", "title": "手動墨消し", - "header": "手動墨消し", "submit": "編集", - "textBasedRedaction": "テキストベースの墨消し", - "pageBasedRedaction": "ページベースの墨消し", - "convertPDFToImageLabel": "PDFをPDF画像に変換します (ボックスの背後のテキストを削除するために使用します)", - "pageRedactionNumbers": { - "title": "ページ", - "placeholder": "(例:1,2,8、4,7,12-16、2n-1)" - }, - "redactionColor": { - "title": "編集色" - }, - "export": "出力", - "upload": "アップロード", - "boxRedaction": "ボックス描画の墨消し", - "zoom": "ズーム", - "zoomIn": "拡大", - "zoomOut": "縮小", - "nextPage": "次のページ", - "previousPage": "前のページ", - "toggleSidebar": "サイドバーを切替え", - "showThumbnails": "サムネイルを表示", - "showDocumentOutline": "ドキュメントのアウトラインを表示 (ダブルクリックするとすべての項目を展開/折りたたむことができます)", - "showAttatchments": "添付ファイルを表示", - "showLayers": "レイヤーを表示(ダブルクリックするとすべてのレイヤーがデフォルトの状態にリセットされます)", - "colourPicker": "カラー選択", - "findCurrentOutlineItem": "現在のアウトライン項目を検索", - "applyChanges": "変更を適用", "auto": { "settings": { "advancedTitle": "アドバンスド" @@ -1290,7 +1839,7 @@ "tags": "CSV,Table Extraction,extract,convert" }, "autoSizeSplitPDF": { - "tags": "pdf,split,document,organization" + "tags": "pdf,分割,ドキュメント,整理" }, "overlay-pdfs": { "tags": "Overlay", @@ -1334,9 +1883,10 @@ "merge": "1 つの PDF に結合するかどうか" }, "AddStampRequest": { - "tags": "Stamp, Add image, center image, Watermark, PDF, Embed, Customize,Customise", + "tags": "スタンプ, 画像を追加, 画像を中央に配置, 透かし, PDF, 埋め込み, カスタマイズ", "header": "PDFにスタンプを押す", "title": "PDFにスタンプを押す", + "stampSetup": "スタンプ設定", "stampType": "スタンプの種類", "stampText": "スタンプする文章", "stampImage": "スタンプする画像", @@ -1349,7 +1899,8 @@ "overrideY": "Y座標のオーバーライド", "customMargin": "余白のカスタム", "customColor": "文字色のカスタム", - "submit": "送信" + "submit": "送信", + "noStampSelected": "スタンプが選択されていません。ステップ1に戻ってください。" }, "removeImagePdf": { "tags": "Remove Image,Page operations,Back end,server side" @@ -1403,31 +1954,12 @@ }, "selectCustomCert": "カスタム証明書ファイル X.509 (オプション)" }, - "replace-color": { - "title": "色の置換・反転", - "header": "PDFの色の置換・反転", - "selectText": { - "1": "色の置換または反転オプション", - "2": "デフォルト(デフォルトの高コントラスト色)", - "3": "カスタム(カスタマイズされた色)", - "4": "フル反転(すべての色を反転)", - "5": "高コントラストカラーオプション", - "6": "黒背景に白文字", - "7": "白背景に黒文字", - "8": "黒背景に黄色文字", - "9": "黒背景に緑文字", - "10": "テキストの色を選択", - "11": "背景色を選択" - }, - "submit": "置換" - }, - "replaceColorPdf": { - "tags": "色の置き換え、ページ操作、バックエンド、サーバー側" - }, "login": { "title": "サインイン", "header": "サインイン", "signin": "サインイン", + "signInWith": "次でサインイン", + "signInAnonymously": "ゲストとして登録", "rememberme": "サインイン状態を記憶する", "invalid": "ユーザー名かパスワードが無効です。", "locked": "あなたのアカウントはロックされています。", @@ -1446,7 +1978,31 @@ "alreadyLoggedIn": "すでにログインしています", "alreadyLoggedIn2": "デバイスからログアウトしてもう一度お試しください。", "toManySessions": "アクティブなセッションが多すぎます", - "logoutMessage": "ログアウトしました" + "logoutMessage": "ログアウトしました", + "youAreLoggedIn": "ログイン済みです!", + "email": "メール", + "password": "パスワード", + "enterEmail": "メールアドレスを入力", + "enterPassword": "パスワードを入力", + "loggingIn": "サインイン中...", + "signingIn": "サインイン中...", + "login": "ログイン", + "or": "または", + "useMagicLink": "代わりにマジックリンクを使う", + "enterEmailForMagicLink": "マジックリンク用のメールアドレスを入力", + "sending": "送信中…", + "sendMagicLink": "マジックリンクを送る", + "cancel": "キャンセル", + "dontHaveAccount": "アカウントをお持ちでないですか? 登録", + "home": "ホーム", + "debug": "デバッグ", + "signOut": "サインアウト", + "pleaseEnterBoth": "メールとパスワードの両方を入力してください", + "pleaseEnterEmail": "メールアドレスを入力してください", + "magicLinkSent": "マジックリンクを {{email}} に送信しました! メールを確認してリンクをクリックし、サインインしてください。", + "passwordResetSent": "パスワード再設定リンクを {{email}} に送信しました! メールの指示に従ってください。", + "failedToSignIn": "{{provider}} でのサインインに失敗しました:{{message}}", + "unexpectedError": "予期しないエラー:{{message}}" }, "pdfToSinglePage": { "title": "PDFを単一ページに変換", @@ -1482,11 +2038,39 @@ }, "compress": { "title": "圧縮", + "desc": "PDF を圧縮してファイルサイズを削減します。", "header": "PDFを圧縮", + "method": { + "title": "圧縮方式", + "quality": "品質", + "filesize": "ファイルサイズ" + }, "credit": "本サービスはPDFの圧縮/最適化にqpdfを使用しています。", "grayscale": { "label": "圧縮にグレースケールを適用する" }, + "tooltip": { + "header": { + "title": "圧縮設定の概要" + }, + "description": { + "title": "説明", + "text": "圧縮はファイルサイズを簡単に減らす方法です。「ファイルサイズ」を選ぶと目標サイズを入力でき、品質は自動調整します。「品質」を選ぶと圧縮強度を手動設定できます。" + }, + "qualityAdjustment": { + "title": "品質調整", + "text": "スライダーで圧縮強度を調整します。低め(1–3)は画質を保ちますがサイズは大きめ、高め(7–9)は大きく縮小できますが画像の鮮明さが低下します。", + "bullet1": "値が小さいほど画質を保持", + "bullet2": "値が大きいほどファイルサイズを削減" + }, + "grayscale": { + "title": "グレースケール", + "text": "このオプションを選ぶと、すべての画像を白黒に変換します。特にスキャン PDF や画像の多い文書で大幅なサイズ削減が見込めます。" + } + }, + "error": { + "failed": "PDF の圧縮中にエラーが発生しました。" + }, "selectText": { "1": { "_value": "圧縮設定", @@ -1496,10 +2080,7 @@ "4": "自動モード - PDFを正確なサイズにするために品質を自動調整する。", "5": "PDFサイズ (例:25MB, 10.8MB, 25KB)" }, - "submit": "圧縮", - "method": { - "filesize": "ファイルサイズ" - } + "submit": "圧縮" }, "decrypt": { "passwordPrompt": "このファイルはパスワードで保護されています。パスワードを入力してください:", @@ -1671,42 +2252,116 @@ } } }, - "download": "ダウンロード", - "undo": "元に戻す", - "convert": { - "title": "変換", - "settings": "設定", - "color": "色", - "greyscale": "グレースケール", - "fillPage": "フルページ", - "pdfaDigitalSignatureWarning": "PDFにはデジタル署名が含まれています。これは次の手順で削除されます。", - "grayscale": "グレースケール" - }, - "attachments": { - "tags": "embed,attach,file,attachment,attachments", - "title": "添付ファイルの追加", - "header": "添付ファイルの追加", - "submit": "添付ファイルの追加" + "pageEditor": { + "title": "ページエディタ", + "save": "変更を保存", + "noPdfLoaded": "PDF が読み込まれていません。編集する PDF をアップロードしてください。", + "rotatedLeft": "左へ回転:", + "rotatedRight": "右へ回転:", + "deleted": "削除:", + "movedLeft": "左へ移動:", + "movedRight": "右へ移動:", + "splitAt": "分割位置:", + "insertedPageBreak": "ここで改ページを挿入:", + "addFileNotImplemented": "デモではファイル追加は未実装です", + "closePdf": "PDF を閉じる", + "reset": "変更をリセット", + "zoomIn": "拡大", + "zoomOut": "縮小", + "fitToWidth": "幅に合わせる", + "actualSize": "原寸" }, "rightRail": { "selectAll": "すべて選択", "deselectAll": "選択を解除" }, + "guestBanner": { + "title": "ゲストとして Stirling PDF を利用中です!", + "message": "無料アカウントを作成して作業を保存し、より多くの機能にアクセスしてプロジェクトをサポートしましょう。", + "dismiss": "バナーを閉じる", + "signUp": "無料で登録" + }, "quickAccess": { "sign": "署名" }, "fileUpload": { + "selectFile": "ファイルを選択", + "selectFiles": "ファイルを選択", + "selectPdfToView": "閲覧する PDF を選択", + "selectPdfToEdit": "編集する PDF を選択", + "chooseFromStorage": "ストレージから選択するか、新しい PDF をアップロード", + "chooseFromStorageMultiple": "ストレージから選択するか、新しい PDF をアップロード(複数)", + "loadFromStorage": "ストレージから読み込む", + "filesAvailable": "件利用可能", "loading": "読込中...", - "or": "または" + "or": "または", + "dropFileHere": "ここにドロップするかクリックしてアップロード", + "dropFilesHere": "ここにドロップするかアップロードボタンをクリック", + "pdfFilesOnly": "PDF のみ", + "supportedFileTypes": "対応ファイルタイプ", + "upload": "アップロード", + "uploadFile": "ファイルをアップロード", + "uploadFiles": "複数ファイルをアップロード", + "noFilesInStorage": "ストレージにファイルがありません。まずはファイルをアップロードしてください。", + "selectFromStorage": "ストレージから選択", + "backToTools": "ツールに戻る", + "addFiles": "ファイルを追加", + "dragFilesInOrClick": "ファイルをドラッグするか「ファイルを追加」をクリックして参照" }, "fileManager": { + "title": "PDF ファイルをアップロード", + "subtitle": "ツール間で簡単にアクセスできるよう、ファイルをストレージに追加", + "filesSelected": "件選択", + "clearSelection": "選択をクリア", + "openInFileEditor": "ファイルエディタで開く", + "uploadError": "一部のファイルのアップロードに失敗しました。", + "failedToOpen": "ファイルを開けません。ストレージから削除された可能性があります。", + "failedToLoad": "アクティブセットへのファイル読み込みに失敗しました。", + "storageCleared": "ブラウザのストレージがクリアされました。ファイルは削除されました。再アップロードしてください。", + "clearAll": "すべてクリア", + "reloadFiles": "ファイルを再読み込み", + "dragDrop": "ここにファイルをドラッグ&ドロップ", + "clickToUpload": "クリックしてファイルをアップロード", + "selectedFiles": "選択したファイル", + "storage": "ストレージ", + "filesStored": "件保存済み", + "storageError": "ストレージエラーが発生しました", + "storageLow": "ストレージの空き容量が少なくなっています。古いファイルの削除をご検討ください。", + "supportMessage": "ブラウザ内データベース ストレージにより無制限の容量を実現", + "noFileSelected": "ファイルが選択されていません", + "showHistory": "履歴を表示", + "hideHistory": "履歴を非表示", + "fileHistory": "ファイル履歴", + "loadingHistory": "履歴を読み込み中...", + "lastModified": "最終更新", + "toolChain": "適用ツール", + "restore": "復元", + "searchFiles": "ファイルを検索...", + "recent": "最近使用", + "localFiles": "ローカルファイル", + "googleDrive": "Google ドライブ", + "googleDriveShort": "ドライブ", + "myFiles": "マイファイル", + "noRecentFiles": "最近のファイルは見つかりませんでした", + "dropFilesHint": "ここにドロップしてアップロード", + "googleDriveNotAvailable": "Google ドライブ連携は利用できません", + "openFiles": "複数ファイルを開く", + "openFile": "ファイルを開く", + "details": "ファイル詳細", "fileName": "名前", + "fileFormat": "形式", + "fileSize": "サイズ", "fileVersion": "バージョン", + "totalSelected": "合計選択数", + "dropFilesHere": "ここにファイルをドロップ", "selectAll": "すべて選択", "deselectAll": "選択を解除", "deleteSelected": "選択項目を削除", + "downloadSelected": "選択をダウンロード", + "selectedCount": "{{count}} 件選択", "download": "ダウンロード", - "delete": "削除" + "delete": "削除", + "unsupported": "未対応" }, "sanitize": { "submit": "PDFをサニタイズ", @@ -1714,9 +2369,69 @@ "settings": "設定" } }, + "addPassword": { + "title": "パスワードの追加", + "desc": "パスワードで PDF 文書を暗号化します。", + "completed": "パスワード保護を適用しました", + "submit": "暗号化", + "filenamePrefix": "encrypted", + "error": { + "failed": "PDF の暗号化中にエラーが発生しました。" + }, + "passwords": { + "stepTitle": "パスワードと暗号化", + "completed": "パスワードを設定しました", + "user": { + "label": "ユーザーパスワード", + "placeholder": "ユーザーパスワードを入力" + }, + "owner": { + "label": "オーナーパスワード", + "placeholder": "オーナーパスワードを入力" + } + }, + "encryption": { + "keyLength": { + "label": "暗号鍵長", + "40bit": "40 ビット(低)", + "128bit": "128 ビット(標準)", + "256bit": "256 ビット(高)" + } + }, + "results": { + "title": "暗号化済み PDF" + }, + "tooltip": { + "header": { + "title": "パスワード保護の概要" + }, + "passwords": { + "title": "パスワードの種類", + "text": "ユーザーパスワードは文書のオープンを制限し、オーナーパスワードは開いた後に実行できる操作を制御します。両方、またはいずれか一方を設定できます。", + "bullet1": "ユーザーパスワード:PDF を開くために必要", + "bullet2": "オーナーパスワード:文書の権限を制御(すべての PDF ビューアーでサポートされるわけではありません)" + }, + "encryption": { + "title": "暗号化レベル", + "text": "暗号化レベルが高いほど安全性は向上しますが、古い PDF ビューアーではサポートされない場合があります。", + "bullet1": "40 ビット:基本的なセキュリティ。古いビューアーと互換", + "bullet2": "128 ビット:標準的なセキュリティ。広くサポート", + "bullet3": "256 ビット:最大のセキュリティ。最新ビューアーが必要" + }, + "permissions": { + "title": "権限の変更", + "text": "これらの権限は、PDF でユーザーができることを制御します。オーナーパスワードと併用すると最も効果的です。" + } + } + }, "changePermissions": { "title": "権限の変更", + "desc": "文書の制限と権限を変更します。", + "completed": "権限を変更しました", "submit": "権限の変更", + "error": { + "failed": "PDF の権限変更中にエラーが発生しました。" + }, "permissions": { "preventAssembly": { "label": "ドキュメントの組立を禁止" @@ -1743,10 +2458,182 @@ "label": "異なる形式の印刷を禁止" } }, + "results": { + "title": "変更済み PDF" + }, "tooltip": { "header": { "title": "権限の変更" + }, + "description": { + "text": "PDF リーダーで利用できる各種機能へのアクセス可否を変更します。" + }, + "warning": { + "text": "これらの権限を変更不可にするには、パスワード追加ツールでオーナーパスワードを設定してください。" } } - } + }, + "removePassword": { + "title": "パスワードの削除", + "desc": "PDFからパスワードの削除します。", + "tags": "secure,Decrypt,security,unpassword,delete password", + "password": { + "stepTitle": "パスワードの削除", + "label": "現在のパスワード" + }, + "submit": "削除" + }, + "automate": { + "title": "自動化", + "desc": "PDF アクションを連結して複数ステップのワークフローを構築します。繰り返し作業に最適です。", + "invalidStep": "無効なステップ", + "files": { + "placeholder": "この自動処理で処理するファイルを選択" + }, + "selection": { + "title": "自動処理の選択", + "saved": { + "title": "保存済み" + }, + "createNew": { + "title": "新しい自動処理を作成" + }, + "suggested": { + "title": "提案" + } + }, + "creation": { + "createTitle": "自動処理を作成", + "editTitle": "自動処理を編集", + "intro": "自動処理はツールを順番に実行します。まずは実行したい順にツールを追加してください。", + "name": { + "label": "自動処理名", + "placeholder": "マイ自動処理" + }, + "description": { + "label": "説明(任意)", + "placeholder": "この自動処理が何を行うかを説明..." + }, + "tools": { + "selectTool": "ツールを選択...", + "selected": "選択したツール", + "remove": "ツールを削除", + "configure": "ツールを設定", + "notConfigured": "!未設定", + "addTool": "ツールを追加", + "add": "ツールを追加..." + }, + "save": "自動処理を保存", + "unsavedChanges": { + "title": "未保存の変更", + "message": "未保存の変更があります。本当に戻りますか?すべての変更は失われます。", + "cancel": "キャンセル", + "confirm": "戻る" + }, + "icon": { + "label": "アイコン" + } + }, + "run": { + "title": "自動処理を実行" + }, + "sequence": { + "unnamed": "名称未設定の自動処理", + "steps": "{{count}} ステップ", + "running": "自動処理を実行中...", + "run": "自動処理を実行", + "finish": "完了" + }, + "reviewTitle": "自動処理の結果", + "config": { + "loading": "ツール設定を読み込み中...", + "noSettings": "このツールに設定項目はありません。", + "title": "{{toolName}} を構成", + "description": "このツールの設定を構成します。設定は自動実行時に適用されます。", + "cancel": "キャンセル", + "save": "設定を保存" + }, + "copyToSaved": "保存済みにコピー" + }, + "automation": { + "suggested": { + "securePdfIngestion": "安全な PDF 取り込み", + "securePdfIngestionDesc": "文書の無害化、クリーンアップ付き OCR、長期保存のための PDF/A 変換、ファイルサイズ最適化を行う総合ワークフローです。", + "emailPreparation": "メール配布の準備", + "emailPreparationDesc": "PDF をメール配布向けに最適化します。ファイルを圧縮し、大きな文書はメール互換の 20MB チャンクに分割し、プライバシーのためメタデータを削除します。", + "secureWorkflow": "セキュリティ ワークフロー", + "secureWorkflowDesc": "JavaScript や埋め込みファイルなどの潜在的に悪意あるコンテンツを削除し、パスワード保護を追加して PDF を保護します。既定パスワードは「password」です。", + "processImages": "画像を処理", + "processImagesDesc": "複数の画像ファイルを 1 つの PDF に変換し、OCR で検索可能なテキストを抽出します。" + } + }, + "common": { + "copy": "コピー", + "copied": "コピーしました!", + "refresh": "更新", + "retry": "再試行", + "remaining": "残り", + "used": "使用済み", + "available": "利用可能", + "cancel": "キャンセル" + }, + "config": { + "account": { + "overview": { + "title": "アカウント設定", + "manageAccountPreferences": "アカウント設定を管理", + "guestDescription": "現在はゲストとしてサインインしています。上位プランへのアップグレードをご検討ください。" + }, + "upgrade": { + "title": "ゲストアカウントをアップグレード", + "description": "アカウントを連携すると履歴が保存され、より多くの機能にアクセスできます!", + "socialLogin": "ソーシャルアカウントでアップグレード", + "linkWith": "連携するサービス", + "emailPassword": "またはメールとパスワードを入力", + "email": "メール", + "emailPlaceholder": "メールアドレスを入力", + "password": "パスワード(任意)", + "passwordPlaceholder": "パスワードを設定", + "passwordNote": "空欄のままにするとメール認証のみを使用します", + "upgradeButton": "アカウントをアップグレード" + } + }, + "apiKeys": { + "description": "Stirling の PDF ツール群にアクセスするための API キーです。プロジェクトにコピーするか、更新して新しいキーを生成できます。", + "publicKeyAriaLabel": "公開 API キー", + "copyKeyAriaLabel": "API キーをコピー", + "refreshAriaLabel": "API キーを更新", + "includedCredits": "含まれるクレジット", + "purchasedCredits": "購入したクレジット", + "totalCredits": "合計クレジット", + "chartAriaLabel": "クレジット使用状況:含まれる分 {{includedUsed}} / {{includedTotal}}、購入分 {{purchasedUsed}} / {{purchasedTotal}}", + "nextReset": "次回リセット", + "lastApiUse": "最終 API 使用", + "overlayMessage": "キーを生成すると、クレジットと利用可能クレジットが表示されます", + "label": "API キー", + "guestInfo": "ゲストユーザーには API キーは付与されません。アカウントを作成して、アプリケーションで利用できる API キーを取得してください。", + "goToAccount": "アカウントへ移動", + "refreshModal": { + "title": "API キーを更新", + "warning": "⚠️ 警告:この操作は新しい API キーを生成し、以前のキーを無効にします。", + "impact": "現在これらのキーを使用しているアプリやサービスは、新しいキーに更新するまで動作しなくなります。", + "confirmPrompt": "続行してよろしいですか?", + "confirmCta": "キーを更新" + }, + "generateError": "API キーを生成できませんでした。" + } + }, + "AddAttachmentsRequest": { + "attachments": "添付ファイルを選択", + "info": "PDF に添付するファイルを選択します。これらのファイルは埋め込まれ、PDF の添付パネルからアクセスできます。", + "selectFiles": "添付するファイルを選択", + "placeholder": "ファイルを選択...", + "addMoreFiles": "さらにファイルを追加...", + "selectedFiles": "選択したファイル", + "submit": "添付を追加", + "results": { + "title": "添付結果" + } + }, + "logOut": "ログアウト" } \ No newline at end of file diff --git a/frontend/public/locales/pt-BR/translation.json b/frontend/public/locales/pt-BR/translation.json index 0b475b977..803f38772 100644 --- a/frontend/public/locales/pt-BR/translation.json +++ b/frontend/public/locales/pt-BR/translation.json @@ -1,4 +1,10 @@ { + "unsavedChanges": "Você tem alterações não salvas no seu PDF. O que você gostaria de fazer?", + "unsavedChangesTitle": "Alterações não salvas", + "keepWorking": "Continuar trabalhando", + "discardChanges": "Descartar alterações", + "applyAndContinue": "Aplicar e continuar", + "exportAndContinue": "Exportar e continuar", "language": { "direction": "ltr" }, @@ -35,10 +41,28 @@ "true": "Verdadeiro", "false": "Falso", "unknown": "Desconhecido", + "app": { + "description": "A alternativa gratuita ao Adobe Acrobat (10M+ downloads)" + }, "save": "Salvar", "saveToBrowser": "Salvar no Navegador", + "download": "Baixar (JSON)", + "undoOperationTooltip": "Clique para desfazer a última operação e restaurar os arquivos originais", + "undo": "Desfazer", + "moreOptions": "Mais opções", + "editYourNewFiles": "Edite seu(s) novo(s) arquivo(s)", "close": "Fechar", + "fileSelected": "Selecionado: {{filename}}", + "chooseFile": "Escolher arquivo", "filesSelected": "Arquivos Selecionados", + "files": { + "title": "Arquivos", + "upload": "Fazer upload", + "uploadFiles": "Fazer upload de arquivos", + "addFiles": "Adicionar arquivos", + "selectFromWorkbench": "Selecione arquivos da bancada de trabalho ou ", + "selectMultipleFromWorkbench": "Selecione pelo menos {{count}} arquivos da bancada de trabalho ou " + }, "noFavourites": "Nenhum Favorito Adicionado", "downloadComplete": "Download Completo", "bored": "Entediado? Clique aqui!", @@ -56,7 +80,10 @@ }, "error": { "pdfPassword": "O PDF está protegido por senha e a senha não foi fornecida ou está incorreta", + "encryptedPdfMustRemovePassword": "Este PDF está criptografado ou protegido por senha. Desbloqueie-o antes de converter para PDF/A.", + "incorrectPasswordProvided": "A senha do PDF está incorreta ou não foi fornecida.", "_value": "Erro", + "dismissAllErrors": "Dispensar todos os erros", "sorry": "Desculpe pelo problema!", "needHelp": "Precisa de ajuda / Encontrou um problema?", "contactTip": "Se você ainda estiver com problemas, não hesite em entrar em contato conosco para obter ajuda. Você pode enviar um tíquete em nossa página GitHub ou entrar em contato conosco através do Discord:", @@ -71,6 +98,10 @@ "githubSubmit": "GitHub - Submeter um tíquete", "discordSubmit": "Discord - Submeter um post de suporte" }, + "warning": { + "tooltipTitle": "Aviso" + }, + "edit": "Editar", "delete": "Apagar", "username": "Usuário", "password": "Senha", @@ -82,6 +113,7 @@ "green": "Verde", "blue": "Azul", "custom": "Personalizado...", + "comingSoon": "Em breve", "WorkInProgess": "Trabalho em progresso, talvez não funcione ou apresente erros, Por favor, reporte qualquer problema!", "poweredBy": "Distribuído por", "yes": "Sim", @@ -115,12 +147,14 @@ "page": "Página", "pages": "Páginas", "loading": "Carregando...", + "review": "Revisar", "addToDoc": "Adicionar ao Documento", "reset": "Reiniciar", "apply": "Aplicar", "noFileSelected": "Nenhum arquivo selecionado. Por favo, envie um arquivo.", "legal": { "privacy": "Política de Privacidade", + "iAgreeToThe": "Concordo com todos os", "terms": "Termos e Condições", "accessibility": "Acessibilidade", "cookie": "Política de Cookies", @@ -285,7 +319,7 @@ "percentage": "Percentagem", "loading": "Carregando...", "failedToLoad": "Falha ao carregar dados do Endpoint. Por favor, tente atualizar.", - "home": "Home", + "home": "Início", "login": "Login", "top": "Top", "numberOfVisits": "Número de Visitas", @@ -300,13 +334,13 @@ "fileSize": "Tamanho do Arquivo", "deleteBackupFile": "Apagar arquivo de backup", "importBackupFile": "Importar arquivo de backup", - "createBackupFile": "Create Backup File", + "createBackupFile": "Criar arquivo de backup", "downloadBackupFile": "Baixar arquivo de backup", "info_1": "Ao importar dados, é crucial garantir a estrutura correta. Se você não tem certeza do que está fazendo procure auxílio de um profissional. Um erro na estrutura pode ocasionar em mau funcionamento da aplicação, incluindo a impossibilidade da aplicação ser executada.", "info_2": "O nome do arquivo não importa ao enviar. Ele será renomeado em seguida para seguir o formato backup_usuario_yyyyMMddHHmm.sql, garantindo uma convenção de nomes coerente.", "submit": "Importar Backup", "importIntoDatabaseSuccessed": "Importação para o banco de dados bem sucedida", - "backupCreated": "Database backup successful", + "backupCreated": "Backup do banco de dados criado com sucesso", "fileNotFound": "Arquivo não encontrado", "fileNullOrEmpty": "O arquivo não pode estar nulo ou vazio", "failedImportFile": "Falha ao importar arquivo", @@ -332,286 +366,305 @@ "globalPopularity": "Popularidade Global", "sortBy": "Ordenar por:", "multiTool": { + "tags": "múltiplas,ferramentas", "title": "Multiferramentas de PDF", "desc": "Mesclar, girar, reorganizar, dividir, inserir e remover páginas." }, "merge": { + "tags": "combinar,juntar,unir", "title": "Mesclar", "desc": "Mescle facilmente vários PDFs em um só." }, "split": { + "tags": "dividir,separar,quebrar", "title": "Dividir", "desc": "Dividir PDFs em vários documentos/arquivos." }, "rotate": { + "tags": "girar,virar,orientar", "title": "Girar", "desc": "Gire facilmente seus PDFs." }, - "imageToPDF": { - "title": "Imagem para PDF", - "desc": "Converter uma imagem (PNG, JPG, GIF) em PDF." - }, - "pdfToImage": { - "title": "PDF para Imagem", - "desc": "Converter PDF em uma imagem (PNG, JPG, GIF e outros)." + "convert": { + "tags": "transformar,alterar", + "title": "Converter", + "desc": "Converter arquivos entre diferentes formatos" }, "pdfOrganiser": { + "tags": "organizar,rearranjar,reordenar", "title": "Organizar Páginas", "desc": "Remover/reorganizar as páginas de diversas formas diferentes." }, "addImage": { + "tags": "inserir,incorporar,colocar", "title": "Adicionar Imagem", "desc": "Adicionar imagens em um local definido no PDF." }, + "addAttachments": { + "tags": "incorporar,anexar,incluir", + "title": "Adicionar anexos", + "desc": "Adicionar ou remover arquivos incorporados (anexos) em um PDF" + }, "watermark": { + "tags": "carimbo,marca,sobreposição", "title": "Adicionar Marca d'água", "desc": "Adicionar uma marca d'água personalizada ao seu PDF." }, - "permissions": { - "title": "Alterar Permissões", - "desc": "Alterar as permissões do seu PDF." + "removePassword": { + "tags": "desbloquear", + "title": "Desproteger PDF", + "desc": "Descriptografar o PDF realizando a remoção da senha." }, - "pageRemover": { + "compress": { + "tags": "reduzir,compactar,otimizar", + "title": "Comprimir", + "desc": "Comprimir PDFs para reduzir o tamanho do arquivo." + }, + "unlockPDFForms": { + "tags": "desbloquear,habilitar,editar", + "title": "Desbloquear Formulários do PDF", + "desc": "Remove a propriedade de apenas leitura de formulários em um documento PDF." + }, + "changeMetadata": { + "tags": "editar,modificar,atualizar", + "title": "Alterar Metadados", + "desc": "Alterar/remover/adicionar metadados de um PDF." + }, + "ocr": { + "tags": "extrair,escanear", + "title": "Processamento de OCR", + "desc": "Reconhecimento Óptico de Caracteres transforma PDFs com imagens em documentos pesquisáveis e com texto selecionável." + }, + "extractImages": { + "tags": "extrair,salvar,exportar", + "title": "Extrair Imagens", + "desc": "Extrair as imagens de um PDF e salvá-las em um arquivo compactado." + }, + "scannerImageSplit": { + "tags": "detectar,dividir,fotos", + "title": "Detectar e dividir fotos digitalizadas", + "desc": "Detectar e dividir fotos digitalizadas em páginas separadas" + }, + "sign": { + "tags": "assinatura,autógrafo", + "title": "Assinar", + "desc": "Adicionar assinatura ao PDF por desenho, texto ou imagem." + }, + "flatten": { + "tags": "simplificar,remover,interativo", + "title": "Achatar", + "desc": "Combinar todos os elementos e formulários interativos de um PDF em uma única camada fixa, não editável." + }, + "certSign": { + "tags": "autenticar,PEM,P12,oficial,criptografar,assinar,certificado,PKCS12,JKS,servidor,manual,automático", + "title": "Assinar com Certificado", + "desc": "Assinar PDF com um Certificado/Chave (PEM/P12/JKS)." + }, + "repair": { + "tags": "corrigir,restaurar", + "title": "Reparar", + "desc": "Tentar reparar um PDF corrompido/quebrado." + }, + "removeBlanks": { + "tags": "excluir,limpar,vazio", + "title": "Remover Páginas em Branco", + "desc": "Detectar e remover páginas em branco de um PDF." + }, + "removeAnnotations": { + "tags": "excluir,limpar,remover", + "title": "Remover Anotações", + "desc": "Remove todos os comentários/anotações de um PDF." + }, + "compare": { + "tags": "diferença", + "title": "Comparar", + "desc": "Comparar e mostrar as diferenças entre dois documentos PDF." + }, + "removeCertSign": { + "tags": "remover,excluir,desbloquear", + "title": "Remover Assinatura com Certificado", + "desc": "Remover assinatura com Certificado/Chave (PEM/P12/JKS) em um PDF." + }, + "pageLayout": { + "tags": "layout,organizar,combinar", + "title": "Layout de Múltiplas Páginas", + "desc": "Mesclar várias páginas de um documento PDF em uma única página." + }, + "bookletImposition": { + "tags": "livreto,impressão,encadernação", + "title": "Imposição de livreto", + "desc": "Criar livretos com ordenação correta de páginas e layout multi-página para impressão e encadernação" + }, + "scalePages": { + "tags": "redimensionar,ajustar,escalar", + "title": "Ajustar Dimensões da Página", + "desc": "Alterar o tamanho/escala da página e/ou seu conteúdo." + }, + "addPageNumbers": { + "tags": "numerar,paginação,contar", + "title": "Adicionar Números de Página", + "desc": "Adicionar números de página no documento, em um local definido." + }, + "autoRename": { + "tags": "detecção automática,baseado em cabeçalho,organizar,renomear", + "title": "Renomear PDF automaticamente", + "desc": "Renomeia automaticamente um arquivo PDF com base no cabeçalho detectado" + }, + "adjustContrast": { + "tags": "contraste,brilho,saturação", + "title": "Ajuste Visual do PDF", + "desc": "Ajustar Contraste, Saturação e Brilho de um PDF." + }, + "crop": { + "tags": "recortar,cortar,redimensionar", + "title": "Recortar", + "desc": "Recortar trecho de um PDF para reduzir o tamanho." + }, + "autoSplitPDF": { + "tags": "auto,dividir,QR", + "title": "Divisão Automática de Páginas", + "desc": "Dividir automaticamente um PDF digitalizado utilizando um separador de páginas físico com QR Code." + }, + "sanitize": { + "tags": "limpar,purgar,remover", + "title": "Sanitizar", + "desc": "Remover elementos potencialmente nocivos de arquivos PDF" + }, + "getPdfInfo": { + "tags": "informações,metadados,detalhes", + "title": "Obter Informações de um PDF", + "desc": "Obtém informações (metadata) de um PDF." + }, + "pdfToSinglePage": { + "tags": "combinar,mesclar,única", + "title": "PDF para Página Única", + "desc": "Combina todas as páginas de um PDF em uma única página." + }, + "showJS": { + "tags": "javascript,código,script", + "title": "Mostrar Javascript", + "desc": "Procura, exibe e extrai qualquer JavaScript injetado em um PDF." + }, + "redact": { + "tags": "censurar,ocultar,esconder", + "title": "Ocultação de Texto Manual", + "desc": "Ocultação de texto manual baseada em um texto selecionado, desenho de formas ou/e páginas selecionadas." + }, + "overlayPdfs": { + "tags": "sobrepor,combinar,empilhar", + "title": "Sobrepor PDFs", + "desc": "Sobrepõe PDFs sobre outro PDF" + }, + "splitBySections": { + "tags": "dividir,seções,particionar", + "title": "Dividir PDF por seções", + "desc": "Divida cada página de um PDF em seções menores horizontais e verticais" + }, + "addStamp": { + "tags": "carimbo,marcar,selo", + "title": "Adicionar carimbo ao PDF", + "desc": "Adicionar carimbos de texto ou imagem em locais definidos" + }, + "removeImage": { + "tags": "remover,excluir,limpar", + "title": "Remover Imagem", + "desc": "Remova imagens do PDF para reduzir o tamanho do arquivo." + }, + "splitByChapters": { + "tags": "dividir,capítulos,estrutura", + "title": "Divide PDF por Capítulos", + "desc": "Divide um PDF em vários arquivos baseado na sua estrutura de capítulos." + }, + "validateSignature": { + "tags": "validar,verificar,certificado", + "title": "Verificar Assinatura com Certificado", + "desc": "Verifica assinatura digital e certificado em um PDF." + }, + "swagger": { + "tags": "API,documentação,teste", + "title": "Documentação da API", + "desc": "Ver documentação da API e testar endpoints" + }, + "scannerEffect": { + "tags": "scanner,simular,criar", + "title": "Efeito de scanner", + "desc": "Criar um PDF que pareça ter sido digitalizado" + }, + "editTableOfContents": { + "tags": "marcadores,conteúdo,editar", + "title": "Editar sumário", + "desc": "Adicionar ou editar marcadores e sumário em documentos PDF" + }, + "manageCertificates": { + "tags": "certificados,importar,exportar", + "title": "Gerenciar certificados", + "desc": "Importar, exportar ou excluir arquivos de certificado digital usados para assinar PDFs." + }, + "read": { + "tags": "visualizar,abrir,exibir", + "title": "Ler", + "desc": "Visualize e anote PDFs. Realce texto, desenhe ou insira comentários para revisão e colaboração." + }, + "reorganizePages": { + "tags": "reorganizar,reordenar,organizar", + "title": "Reorganizar páginas", + "desc": "Reorganize, duplique ou exclua páginas do PDF com controle visual de arrastar e soltar." + }, + "extractPages": { + "tags": "extrair,selecionar,copiar", + "title": "Extrair Página(s)", + "desc": "Extrair páginas específicas de um documento PDF" + }, + "removePages": { + "tags": "excluir,extrair,remover", "title": "Remover Páginas", "desc": "Excluir páginas indesejadas do seu PDF." }, + "autoSizeSplitPDF": { + "tags": "auto,dividir,tamanho", + "title": "Divisão Manual do PDF", + "desc": "Divida um PDF em vários, com base no tamanho, contagem de páginas ou contagem de documentos." + }, + "replaceColor": { + "title": "Substituir e inverter cor", + "desc": "Substituir ou inverter cores em documentos PDF" + }, + "devApi": { + "tags": "API,desenvolvimento,documentação", + "title": "API", + "desc": "Link para a documentação da API" + }, + "devFolderScanning": { + "tags": "automação,pasta,varredura", + "title": "Varredura automática de pasta", + "desc": "Link para o guia de varredura automática de pastas" + }, + "devSsoGuide": { + "title": "Guia de SSO", + "desc": "Link para o guia de SSO" + }, + "devAirgapped": { + "title": "Configuração Air-gapped", + "desc": "Link para o guia de configuração isolada (air-gapped)" + }, "addPassword": { "title": "Proteger PDF", "desc": "Criptografar seu PDF com uma senha podendo realizar alterações de permissões." }, - "removePassword": { - "title": "Desproteger PDF", - "desc": "Descriptografar o PDF realizando a remoção da senha." - }, - "compress": { - "title": "Comprimir", - "desc": "Comprimir PDFs para reduzir o tamanho do arquivo." - }, - "unlockPDFForms": { - "title": "Desbloquear Formulários do PDF", - "desc": "Remove a propriedade de apenas leitura de formulários em um documento PDF." - }, - "changeMetadata": { - "title": "Alterar Metadados", - "desc": "Alterar/remover/adicionar metadados de um PDF." - }, - "fileToPDF": { - "title": "Converter Arquivo para PDF", - "desc": "Converter praticamente qualquer arquivo em PDF (DOCX, PNG, XLS, PPT, TXT e outros)." - }, - "ocr": { - "title": "Processamento de OCR", - "desc": "Reconhecimento Óptico de Caracteres transforma PDFs com imagens em documentos pesquisáveis e com texto selecionável." - }, - "extractImages": { - "title": "Extrair Imagens", - "desc": "Extrair as imagens de um PDF e salvá-las em um arquivo compactado." - }, - "pdfToPDFA": { - "title": "PDF para PDF/A", - "desc": "Converter o PDF para o formato PDF/A, voltado a armazenamento a longo prazo." - }, - "PDFToWord": { - "title": "PDF para Word", - "desc": "Converter PDF para formatos Word (DOC, DOCX e ODT)." - }, - "PDFToPresentation": { - "title": "PDF para Apresentação", - "desc": "Converter PDF para formatos de Apresentação (PPT, PPTX e ODP)." - }, - "PDFToText": { - "title": "PDF para TXT/RTF", - "desc": "Converter PDF em formato de TXT ou RTF." - }, - "PDFToHTML": { - "title": "PDF para HTML", - "desc": "Converter PDF para o formato HTML." - }, - "PDFToXML": { - "title": "PDF para XML", - "desc": "Converter PDF para formato XML." - }, - "ScannerImageSplit": { - "title": "Detectar/Dividir Fotos Digitalizadas", - "desc": "Divide várias fotos de dentro de uma imagem/PDF." - }, - "sign": { - "title": "Assinar", - "desc": "Adicionar assinatura ao PDF por desenho, texto ou imagem." - }, - "flatten": { - "title": "Achatar", - "desc": "Combinar todos os elementos e formulários interativos de um PDF em uma única camada fixa, não editável." - }, - "repair": { - "title": "Reparar", - "desc": "Tentar reparar um PDF corrompido/quebrado." - }, - "removeBlanks": { - "title": "Remover Páginas em Branco", - "desc": "Detectar e remover páginas em branco de um PDF." - }, - "removeAnnotations": { - "title": "Remover Anotações", - "desc": "Remove todos os comentários/anotações de um PDF." - }, - "compare": { - "title": "Comparar", - "desc": "Comparar e mostrar as diferenças entre dois documentos PDF." - }, - "certSign": { - "title": "Assinar com Certificado", - "desc": "Assinar PDF com um Certificado/Chave (PEM/P12/JKS)." - }, - "removeCertSign": { - "title": "Remover Assinatura com Certificado", - "desc": "Remover assinatura com Certificado/Chave (PEM/P12/JKS) em um PDF." - }, - "pageLayout": { - "title": "Layout de Múltiplas Páginas", - "desc": "Mesclar várias páginas de um documento PDF em uma única página." - }, - "scalePages": { - "title": "Ajustar Dimensões da Página", - "desc": "Alterar o tamanho/escala da página e/ou seu conteúdo." - }, - "pipeline": { - "title": "Pipeline", - "desc": "Executar várias ações em PDFs seguindo scripts de operações." - }, - "addPageNumbers": { - "title": "Adicionar Números de Página", - "desc": "Adicionar números de página no documento, em um local definido." - }, - "auto-rename": { - "title": "Renomeação Automática do PDF", - "desc": "Renomeia automaticamente o PDF com base no cabeçalho detectado." - }, - "adjustContrast": { - "title": "Ajuste Visual do PDF", - "desc": "Ajustar Contraste, Saturação e Brilho de um PDF." - }, - "crop": { - "title": "Recortar", - "desc": "Recortar trecho de um PDF para reduzir o tamanho." - }, - "autoSplitPDF": { - "title": "Divisão Automática de Páginas", - "desc": "Dividir automaticamente um PDF digitalizado utilizando um separador de páginas físico com QR Code." - }, - "sanitizePDF": { - "title": "Higienizar", - "desc": "Remover scripts, links, metadados e outros elementos de um PDF." - }, - "URLToPDF": { - "title": "Converter URL/Site para PDF", - "desc": "Converter qualquer página da internet para um PDF." - }, - "HTMLToPDF": { - "title": "HTML para PDF", - "desc": "Converter qualquer arquivo HTML ou zip para PDF." - }, - "MarkdownToPDF": { - "title": "Markdown para PDF", - "desc": "Converte qualquer arquivo Markdown para PDF." - }, - "PDFToMarkdown": { - "title": "PDF para Markdown", - "desc": "Converte qualquer PDF para Markdown." - }, - "getPdfInfo": { - "title": "Obter Informações de um PDF", - "desc": "Obtém informações (metadata) de um PDF." - }, - "pageExtracter": { - "title": "Extrair Página(s)", - "desc": "Extrair determinadas páginas de um PDF." - }, - "pdfToSinglePage": { - "title": "PDF para Página Única", - "desc": "Combina todas as páginas de um PDF em uma única página." - }, - "showJS": { - "title": "Mostrar Javascript", - "desc": "Procura, exibe e extrai qualquer JavaScript injetado em um PDF." - }, - "autoRedact": { - "title": "Ocultação de Texto Automática", - "desc": "Ocultação automática (escurecimento) de texto em um PDF com base em texto de entrada." - }, - "redact": { - "title": "Ocultação de Texto Manual", - "desc": "Ocultação de texto manual baseada em um texto selecionado, desenho de formas ou/e páginas selecionadas." - }, - "PDFToCSV": { - "title": "PDF para CSV", - "desc": "Extração de tabelas de um PDF convertendo para CSV." - }, - "split-by-size-or-count": { - "title": "Divisão Manual do PDF", - "desc": "Divida um PDF em vários, com base no tamanho, contagem de páginas ou contagem de documentos." - }, - "overlay-pdfs": { - "title": "Sobrepor PDFs", - "desc": "Sobrepõe PDF sobre outro PDF." - }, - "split-by-sections": { - "title": "Dividir PDF por Seções", - "desc": "Divida cada página de um PDF em seções horizontais e/ou verticais menores." - }, - "AddStampRequest": { - "title": "Adicionar Carimbo ao PDF", - "desc": "Adicione texto ou carimbos de imagem em locais definidos." - }, - "removeImage": { - "title": "Remover Imagem", - "desc": "Remova imagens do PDF para reduzir o tamanho do arquivo." - }, - "splitByChapters": { - "title": "Divide PDF por Capítulos", - "desc": "Divide um PDF em vários arquivos baseado na sua estrutura de capítulos." - }, - "validateSignature": { - "title": "Verificar Assinatura com Certificado", - "desc": "Verifica assinatura digital e certificado em um PDF." - }, - "replace-color": { - "title": "Substitui e Inverte Cores", - "desc": "Substitui cor do texto e plano de fundo de um PDF e/ou inverte a toda cor do PDF para reduzir o tamanho." - }, - "convert": { - "title": "Converter" - }, - "attachments": { - "title": "Add attachments" - }, - "extractPages": { - "title": "Extrair Página(s)" - }, - "removePages": { - "title": "Remover Páginas", - "desc": "Excluir páginas indesejadas do seu PDF." - }, - "removeImagePdf": { - "title": "Remover Imagem", - "desc": "Remova imagens do PDF para reduzir o tamanho do arquivo." - }, - "autoSizeSplitPDF": { - "title": "Divisão Manual do PDF", - "desc": "Divida um PDF em vários, com base no tamanho, contagem de páginas ou contagem de documentos." - }, - "adjust-contrast": { - "title": "Ajuste Visual do PDF", - "desc": "Ajustar Contraste, Saturação e Brilho de um PDF." - }, - "replaceColorPdf": { - "title": "Substitui e Inverte Cores", - "desc": "Substitui cor do texto e plano de fundo de um PDF e/ou inverte a toda cor do PDF para reduzir o tamanho." - }, "changePermissions": { - "title": "Alterar Permissões" + "title": "Alterar Permissões", + "desc": "Alterar restrições e permissões do documento" + }, + "automate": { + "tags": "fluxo de trabalho,sequência,automação", + "title": "Automatizar", + "desc": "Crie fluxos de trabalho de várias etapas encadeando ações de PDF. Ideal para tarefas recorrentes." } }, + "landing": { + "addFiles": "Adicionar arquivos", + "uploadFromComputer": "Fazer upload do computador" + }, "viewPdf": { "tags": "visualizar,ler,anotar,texto,imagem", "title": "Ver/Editar PDF", @@ -645,17 +698,29 @@ "merge": { "tags": "mesclar,Operações de Página,Back-end,lado do servidor", "title": "Mesclar", - "header": "Mesclar", - "sortByName": "Classificar por Nome", - "sortByDate": "Classificar por Data", - "removeCertSign": "Remover a assinatura digital do arquivo mesclado?", + "removeDigitalSignature.tooltip": { + "title": "Remover assinatura digital", + "description": "Assinaturas digitais serão invalidadas ao mesclar arquivos. Marque isto para removê-las do PDF final." + }, + "generateTableOfContents.tooltip": { + "title": "Gerar sumário", + "description": "Cria automaticamente um sumário clicável no PDF mesclado com base nos nomes originais dos arquivos e nos números de página." + }, "submit": "Mesclar", "sortBy": { - "filename": "Nome do Arquivo" + "description": "Os arquivos serão mesclados na ordem em que forem selecionados. Arraste para reordenar ou ordene abaixo.", + "label": "Ordenar por", + "filename": "Nome do Arquivo", + "dateModified": "Data de modificação", + "ascending": "Ascendente", + "descending": "Descendente", + "sort": "Ordenar" + }, + "error": { + "failed": "Ocorreu um erro ao mesclar os PDFs." } }, "split": { - "tags": "Operações de Página,dividir,Múltiplas Páginas,cortar,lado do servidor", "title": "Dividir", "header": "Dividir", "desc": { @@ -671,25 +736,206 @@ "splitPages": "Digite as páginas para a divisão:", "submit": "Dividir", "steps": { + "chooseMethod": "Escolher método", "settings": "Configurações" }, + "settings": { + "selectMethodFirst": "Selecione um método de divisão primeiro" + }, + "error": { + "failed": "Ocorreu um erro ao dividir o PDF." + }, + "method": { + "label": "Escolha o método de divisão", + "placeholder": "Selecione como dividir o PDF" + }, "methods": { + "prefix": { + "splitAt": "Dividir em", + "splitBy": "Dividir por" + }, + "byPages": { + "name": "Números de página", + "desc": "Extrair páginas específicas (1,3,5-10)", + "tooltip": "Insira números de página separados por vírgulas ou intervalos com hífens" + }, + "bySections": { + "name": "Seções", + "desc": "Dividir páginas em seções de grade", + "tooltip": "Divida cada página em seções horizontais e verticais" + }, "bySize": { - "name": "Tamanho do Arquivo" + "name": "Tamanho do Arquivo", + "desc": "Limitar tamanho máximo do arquivo", + "tooltip": "Especifique o tamanho máximo do arquivo (ex.: 10MB, 500KB)" + }, + "byPageCount": { + "name": "Quantidade de páginas", + "desc": "Páginas fixas por arquivo", + "tooltip": "Informe o número de páginas para cada arquivo dividido" + }, + "byDocCount": { + "name": "Quantidade de documentos", + "desc": "Criar número específico de arquivos", + "tooltip": "Informe quantos arquivos deseja criar" + }, + "byChapters": { + "name": "Capítulos", + "desc": "Dividir nos limites de marcadores", + "tooltip": "Usa marcadores do PDF para determinar pontos de corte" + }, + "byPageDivider": { + "name": "Folha divisora", + "desc": "Divisão automática com folhas divisoras", + "tooltip": "Use folhas divisoras com código QR entre documentos ao digitalizar" } }, "value": { "fileSize": { - "label": "Tamanho do Arquivo" + "label": "Tamanho do Arquivo", + "placeholder": "ex.: 10MB, 500KB" + }, + "pageCount": { + "label": "Páginas por arquivo", + "placeholder": "ex.: 5, 10" + }, + "docCount": { + "label": "Número de arquivos", + "placeholder": "ex.: 3, 5" + } + }, + "tooltip": { + "header": { + "title": "Visão geral dos métodos de divisão" + }, + "byPages": { + "title": "Dividir por números de página", + "text": "Divida seu PDF em números de página específicos. Usar 'n' divide após a página n. Usar 'n-m' divide antes de n e após m.", + "bullet1": "Pontos únicos: 3,7 (divide após as páginas 3 e 7)", + "bullet2": "Intervalos: 3-8 (divide antes da página 3 e após a 8)", + "bullet3": "Misto: 2,5-10,15 (divide após 2, antes de 5, após 10 e após 15)" + }, + "bySections": { + "title": "Dividir por seções de grade", + "text": "Divida cada página em uma grade de seções. Útil para documentos com múltiplas colunas ou para extrair áreas específicas.", + "bullet1": "Horizontal: número de linhas a criar", + "bullet2": "Vertical: número de colunas a criar", + "bullet3": "Mesclar: combine todas as seções em um PDF" + }, + "bySize": { + "title": "Dividir por tamanho de arquivo", + "text": "Crie vários PDFs que não excedam um tamanho de arquivo especificado. Ideal para limitações de tamanho ou anexos de e-mail.", + "bullet1": "Use MB para arquivos maiores (ex.: 10MB)", + "bullet2": "Use KB para arquivos menores (ex.: 500KB)", + "bullet3": "O sistema dividirá em limites de página" + }, + "byCount": { + "title": "Dividir por contagem", + "text": "Crie vários PDFs com um número específico de páginas ou documentos cada.", + "bullet1": "Contagem de páginas: número fixo de páginas por arquivo", + "bullet2": "Contagem de documentos: número fixo de arquivos de saída", + "bullet3": "Útil para fluxos de trabalho em lote" + }, + "byChapters": { + "title": "Dividir por capítulos", + "text": "Use marcadores do PDF para dividir automaticamente nos limites de capítulos. Requer PDFs com estrutura de marcadores.", + "bullet1": "Nível de marcador: em qual nível dividir (1=nível superior)", + "bullet2": "Incluir metadados: preservar propriedades do documento", + "bullet3": "Permitir duplicados: lidar com nomes de marcador repetidos" } } }, "rotate": { - "tags": "Lado do servidor", "title": "Girar", - "header": "Girar", - "selectAngle": "Selecione o ângulo de rotação (múltiplos de 90 graus):", - "submit": "Girar" + "submit": "Girar", + "error": { + "failed": "Ocorreu um erro ao girar o PDF." + }, + "preview": { + "title": "Pré-visualização da rotação" + }, + "rotateLeft": "Girar no sentido anti-horário", + "rotateRight": "Girar no sentido horário", + "tooltip": { + "header": { + "title": "Visão geral das configurações de rotação" + }, + "description": { + "text": "Gire as páginas do seu PDF no sentido horário ou anti-horário em incrementos de 90 graus. Todas as páginas do PDF serão giradas. A pré-visualização mostra como o documento ficará após a rotação." + }, + "controls": { + "title": "Controles", + "text": "Use os botões de rotação para ajustar a orientação. O botão esquerdo gira no sentido anti-horário; o direito, no sentido horário. Cada clique gira 90 graus." + } + } + }, + "convert": { + "title": "Converter", + "desc": "Converter arquivos entre diferentes formatos", + "files": "Arquivos", + "selectFilesPlaceholder": "Selecione arquivos na visualização principal para começar", + "settings": "Configurações", + "conversionCompleted": "Conversão concluída", + "results": "Resultados", + "defaultFilename": "arquivo_convertido", + "conversionResults": "Resultados da conversão", + "convertFrom": "Converter de", + "convertTo": "Converter para", + "sourceFormatPlaceholder": "Formato de origem", + "targetFormatPlaceholder": "Formato de destino", + "selectSourceFormatFirst": "Selecione primeiro um formato de origem", + "outputOptions": "Opções de saída", + "pdfOptions": "Opções de PDF", + "imageOptions": "Opções de imagem", + "colorType": "Tipo de cor", + "color": "Cor", + "greyscale": "Escala de Cinza", + "blackwhite": "Preto e branco", + "dpi": "DPI", + "output": "Saída", + "single": "Único", + "multiple": "Múltiplos", + "fitOption": "Opção de ajuste", + "maintainAspectRatio": "Manter proporção", + "fitDocumentToPage": "Ajustar documento à página", + "fillPage": "Preencher a página", + "autoRotate": "Rotação automática", + "autoRotateDescription": "Gira automaticamente as imagens para se ajustarem melhor à página do PDF", + "combineImages": "Combinar imagens", + "combineImagesDescription": "Combine todas as imagens em um único PDF ou crie PDFs separados para cada imagem", + "webOptions": "Opções de Web para PDF", + "zoomLevel": "Nível de zoom", + "emailOptions": "Opções de E-mail para PDF", + "includeAttachments": "Incluir anexos do e-mail", + "maxAttachmentSize": "Tamanho máximo do anexo (MB)", + "includeAllRecipients": "Incluir destinatários CC e BCC no cabeçalho", + "downloadHtml": "Baixar arquivo HTML intermediário em vez de PDF", + "pdfaOptions": "Opções de PDF/A", + "outputFormat": "Formato de saída", + "pdfaNote": "PDF/A-1b é mais compatível; PDF/A-2b oferece mais recursos.", + "pdfaDigitalSignatureWarning": "O PDF contém uma assinatura digital. Isso será removido na próxima etapa.", + "fileFormat": "Formato de arquivo", + "wordDoc": "Documento do Word", + "wordDocExt": "Documento do Word (.docx)", + "odtExt": "Texto OpenDocument (.odt)", + "pptExt": "PowerPoint (.pptx)", + "odpExt": "Apresentação OpenDocument (.odp)", + "txtExt": "Texto simples (.txt)", + "rtfExt": "Rich Text Format (.rtf)", + "selectedFiles": "Arquivos selecionados", + "noFileSelected": "Nenhum arquivo selecionado. Use o painel de arquivos para adicionar arquivos.", + "convertFiles": "Converter arquivos", + "converting": "Convertendo...", + "downloadConverted": "Baixar arquivo convertido", + "errorNoFiles": "Selecione ao menos um arquivo para converter.", + "errorNoFormat": "Selecione os formatos de origem e de destino.", + "errorNotSupported": "Conversão de {{from}} para {{to}} não é suportada.", + "images": "Imagens", + "officeDocs": "Documentos do Office (Word, Excel, PowerPoint)", + "imagesExt": "Imagens (JPG, PNG, etc.)", + "markdown": "Markdown", + "textRtf": "Texto/RTF", + "grayscale": "Escala de Cinza" }, "imageToPdf": { "tags": "conversão,img,jpg,imagem,foto" @@ -729,6 +975,19 @@ "10": "Mesclagem ímpar-par", "11": "Duplicar todas as páginas" }, + "desc": { + "CUSTOM": "Use uma sequência personalizada de números de página ou expressões para definir uma nova ordem.", + "REVERSE_ORDER": "Inverta o documento para que a última página se torne a primeira e assim por diante.", + "DUPLEX_SORT": "Intercale frentes e depois versos como se um scanner duplex escaneasse todas as frentes e depois todos os versos (1, n, 2, n-1, …).", + "BOOKLET_SORT": "Organize páginas para impressão em livreto (última, primeira, segunda, penúltima, …).", + "SIDE_STITCH_BOOKLET_SORT": "Organize páginas para livreto grampeado na lateral (otimizado para encadernação lateral).", + "ODD_EVEN_SPLIT": "Divida o documento em duas saídas: todas as páginas ímpares e todas as pares.", + "ODD_EVEN_MERGE": "Mescle dois PDFs alternando páginas: ímpares do primeiro, pares do segundo.", + "DUPLICATE": "Duplique cada página de acordo com a contagem da ordem personalizada (ex.: 4 duplicatas — cada página 4×).", + "REMOVE_FIRST": "Remova a primeira página do documento.", + "REMOVE_LAST": "Remova a última página do documento.", + "REMOVE_FIRST_AND_LAST": "Remova a primeira e a última páginas do documento." + }, "placeholder": "(por exemplo 1,3,2 ou 4-8,2,10-12 ou 2n-1)" }, "addImage": { @@ -739,33 +998,190 @@ "upload": "Carregar imagem", "submit": "Adicionar imagem" }, + "attachments": { + "tags": "embed,attach,file,attachment,attachments", + "title": "Add attachments", + "header": "Add attachments", + "add": "Adicionar anexo", + "remove": "Remover anexo", + "embed": "Incorporar anexo", + "submit": "Add attachments" + }, "watermark": { - "tags": "Texto,repetindo,rótulo,próprio,direitos autorais,marca registrada,img,jpg,imagem,foto", "title": "Adicionar marca d'água", - "header": "Adicionar marca d'água", - "customColor": "Cor de texto personalizada", - "selectText": { - "1": "Selecione PDF para adicionar a marca d'água:", - "2": "Texto da marca d'água:", - "3": "Tamanho da fonte:", - "4": "Rotação (0-360):", - "5": "Espaçador de Largura (Espaço entre cada marca d'água horizontalmente):", - "6": "Espaçador de Altura (Espaço entre cada marca d'água verticalmente):", - "7": "Opacidade (0% - 100%):", - "8": "Tipo de marca d'água:", - "9": "Imagem da marca d'água:", - "10": "Converter PDF em imagem PDF." - }, + "desc": "Adicione marcas d'água de texto ou imagem a arquivos PDF", + "completed": "Marca d'água adicionada", "submit": "Adicionar Marca D'água", - "type": { - "1": "Texto", - "2": "Imagem" + "filenamePrefix": "com_marca_dagua", + "error": { + "failed": "Ocorreu um erro ao adicionar a marca d'água ao PDF." }, "watermarkType": { - "text": "Texto" + "text": "Texto", + "image": "Imagem" }, "settings": { - "fontSize": "Tamanho da Fonte" + "type": "Tipo de marca d'água", + "text": { + "label": "Texto da marca d'água", + "placeholder": "Insira o texto da marca d'água" + }, + "image": { + "label": "Imagem da marca d'água", + "choose": "Escolher imagem", + "selected": "Selecionado: {{filename}}" + }, + "fontSize": "Tamanho da Fonte", + "size": "Tamanho", + "alphabet": "Fonte/Idioma", + "color": "Cor da marca d'água", + "rotation": "Rotação (graus)", + "opacity": "Opacidade (%)", + "spacing": { + "horizontal": "Espaçamento horizontal", + "vertical": "Espaçamento vertical" + }, + "convertToImage": "Achatar páginas do PDF em imagens" + }, + "alphabet": { + "roman": "Romano/Latino", + "arabic": "Árabe", + "japanese": "Japonês", + "korean": "Coreano", + "chinese": "Chinês", + "thai": "Tailandês" + }, + "steps": { + "type": "Tipo de marca d'água", + "wording": "Texto", + "textStyle": "Estilo", + "formatting": "Formatação", + "file": "Arquivo de marca d'água" + }, + "results": { + "title": "Resultados da marca d'água" + }, + "tooltip": { + "language": { + "title": "Suporte a idiomas", + "text": "Escolha o idioma apropriado para garantir a renderização correta da fonte do seu texto." + }, + "appearance": { + "title": "Configurações de aparência", + "text": "Controle como a sua marca d'água aparece e se mistura ao documento.", + "bullet1": "Rotação: -360° a 360° para marcas d'água inclinadas", + "bullet2": "Opacidade: 0–100% para controlar a transparência", + "bullet3": "Opacidade menor cria marcas d'água sutis" + }, + "spacing": { + "title": "Controle de espaçamento", + "text": "Ajuste o espaçamento entre marcas d'água repetidas pela página.", + "bullet1": "Espaçamento em largura: distância horizontal entre marcas d'água", + "bullet2": "Espaçamento em altura: distância vertical entre marcas d'água", + "bullet3": "Valores maiores criam padrões mais espaçados" + }, + "type": { + "header": { + "title": "Seleção do tipo de marca d'água" + }, + "description": { + "title": "Escolha sua marca d'água", + "text": "Selecione entre marcas d'água de texto ou de imagem conforme sua necessidade." + }, + "text": { + "title": "Marcas d'água de texto", + "text": "Perfeito para adicionar avisos de copyright, nomes de empresa ou etiquetas de confidencialidade. Suporta vários idiomas e cores personalizadas.", + "bullet1": "Fontes e idiomas personalizáveis", + "bullet2": "Cores e transparência ajustáveis", + "bullet3": "Ideal para texto legal ou de branding" + }, + "image": { + "title": "Marcas d'água de imagem", + "text": "Use logos, carimbos ou qualquer imagem como marca d'água. Ótimo para branding e identificação visual.", + "bullet1": "Envie qualquer formato de imagem", + "bullet2": "Mantém a qualidade da imagem", + "bullet3": "Perfeito para logos e carimbos" + } + }, + "wording": { + "header": { + "title": "Conteúdo do texto" + }, + "text": { + "title": "Texto da marca d'água", + "text": "Insira o texto que aparecerá como sua marca d'água ao longo do documento.", + "bullet1": "Seja conciso para melhor legibilidade", + "bullet2": "Exemplos comuns: 'CONFIDENCIAL', 'RASCUNHO', nome da empresa", + "bullet3": "Caracteres de emoji não são suportados e serão filtrados" + } + }, + "textStyle": { + "header": { + "title": "Estilo do texto" + }, + "color": { + "title": "Seleção de cor", + "text": "Escolha uma cor que tenha bom contraste com o conteúdo do documento.", + "bullet1": "Cinza claro (#d3d3d3) para marcas d'água discretas", + "bullet2": "Preto ou cores escuras para alto contraste", + "bullet3": "Cores personalizadas para branding" + }, + "language": { + "title": "Suporte a idiomas", + "text": "Escolha o idioma apropriado para garantir a renderização correta da fonte." + } + }, + "file": { + "header": { + "title": "Envio de imagem" + }, + "upload": { + "title": "Seleção de imagem", + "text": "Envie uma imagem para usar como marca d'água.", + "bullet1": "Suporta formatos comuns: PNG, JPG, GIF, BMP", + "bullet2": "PNG com transparência funciona melhor", + "bullet3": "Imagens de maior resolução mantêm melhor a qualidade" + }, + "recommendations": { + "title": "Boas práticas", + "text": "Dicas para melhores resultados com marca d'água de imagem.", + "bullet1": "Use logos ou carimbos com fundo transparente", + "bullet2": "Designs simples funcionam melhor que imagens complexas", + "bullet3": "Considere o tamanho final do documento ao escolher a resolução" + } + }, + "formatting": { + "header": { + "title": "Formatação e layout" + }, + "size": { + "title": "Controle de tamanho", + "text": "Ajuste o tamanho da sua marca d'água (texto ou imagem).", + "bullet1": "Tamanhos maiores criam marcas d'água mais proeminentes" + }, + "appearance": { + "title": "Configurações de aparência", + "text": "Controle como a sua marca d'água aparece e se mistura ao documento.", + "bullet1": "Rotação: -360° a 360° para marcas d'água inclinadas", + "bullet2": "Opacidade: 0–100% para controlar a transparência", + "bullet3": "Opacidade menor cria marcas d'água sutis" + }, + "spacing": { + "title": "Controle de espaçamento", + "text": "Ajuste o espaçamento entre marcas d'água repetidas pela página.", + "bullet1": "Espaçamento horizontal: distância entre marcas d'água da esquerda para a direita", + "bullet2": "Espaçamento vertical: distância entre marcas d'água de cima para baixo", + "bullet3": "Valores maiores criam padrões mais espaçados" + }, + "security": { + "title": "Opção de segurança", + "text": "Converta o PDF final para um formato baseado em imagem para segurança aprimorada.", + "bullet1": "Impede seleção e cópia de texto", + "bullet2": "Torna as marcas d'água mais difíceis de remover", + "bullet3": "Gera arquivos de tamanho maior", + "bullet4": "Melhor para conteúdo sensível ou com direitos autorais" + } + } } }, "permissions": { @@ -790,50 +1206,148 @@ "removePages": { "tags": "Remover páginas,excluir páginas", "title": "Remover Páginas", + "pageNumbers": { + "label": "Páginas para remover", + "placeholder": "ex.: 1,3,5-8,10", + "error": "Formato de número de página inválido. Use números, intervalos (1-5) ou expressões matemáticas (2n+1)" + }, + "filenamePrefix": "paginas_removidas", + "files": { + "placeholder": "Selecione um arquivo PDF na visualização principal para começar" + }, + "settings": { + "title": "Configurações" + }, + "tooltip": { + "header": { + "title": "Configurações de remoção de páginas" + }, + "pageNumbers": { + "title": "Seleção de páginas", + "text": "Especifique quais páginas remover do seu PDF. Você pode selecionar páginas individuais, intervalos ou usar expressões matemáticas.", + "bullet1": "Páginas individuais: 1,3,5 (remove as páginas 1, 3 e 5)", + "bullet2": "Intervalos de páginas: 1-5,10-15 (remove 1-5 e 10-15)", + "bullet3": "Matemática: 2n+1 (remove páginas ímpares)", + "bullet4": "Intervalos abertos: 5- (remove da página 5 até o fim)" + }, + "examples": { + "title": "Exemplos comuns", + "text": "Aqui estão alguns padrões comuns de seleção de páginas:", + "bullet1": "Remover primeira página: 1", + "bullet2": "Remover as últimas 3 páginas: -3", + "bullet3": "Remover páginas alternadas: 2n", + "bullet4": "Remover páginas específicas espalhadas: 1,5,10,15" + }, + "safety": { + "title": "Dicas de segurança", + "text": "Considerações importantes ao remover páginas:", + "bullet1": "Sempre visualize sua seleção antes de processar", + "bullet2": "Mantenha um backup do arquivo original", + "bullet3": "A numeração de páginas começa em 1, não 0", + "bullet4": "Números de página inválidos serão ignorados" + } + }, + "error": { + "failed": "Ocorreu um erro ao remover páginas." + }, + "results": { + "title": "Resultados da remoção de páginas" + }, "submit": "Remover Páginas" }, - "addPassword": { - "tags": "seguro,segurança", - "title": "Proteger PDF", - "header": "Proteger PDF (Criptografar)", - "selectText": { - "1": "Selecione o PDF para Criptografar:", - "2": "Senha de acesso:", - "3": "Tamanho da chave de criptografia:", - "4": "Valores mais altos são mais seguros, mas valores mais baixos são melhores para compatibilidade.", - "5": "Permissões a serem definidas (recomendado para uso junto com a senha do proprietário):", - "6": "Impedir a montagem do documento.", - "7": "Impedir a extração de conteúdo.", - "8": "Impedir a extração para acessibilidade.", - "9": "Impedir o preenchimento do formulário.", - "10": "Impedir modificação.", - "11": "Impedir modificação de anotações.", - "12": "Impedir impressão.", - "13": "Impedir impressão de formatos diferentes.", - "14": "Senha do proprietário:", - "15": "Restringe o que pode ser feito com o documento depois de aberto (não suportado por todos os leitores).", - "16": "Restringe a abertura do próprio documento." - }, - "submit": "Criptografar", + "pageSelection": { "tooltip": { - "permissions": { - "title": "Alterar Permissões" + "header": { + "title": "Guia de seleção de páginas" + }, + "basic": { + "title": "Uso básico", + "text": "Selecione páginas específicas do seu documento PDF usando sintaxe simples.", + "bullet1": "Páginas individuais: 1,3,5", + "bullet2": "Intervalos de páginas: 3-6 ou 10-15", + "bullet3": "Todas as páginas: all" + }, + "advanced": { + "title": "Recursos avançados" + }, + "tips": { + "title": "Dicas", + "text": "Mantenha estas diretrizes em mente:", + "bullet1": "A numeração de páginas começa em 1 (não 0)", + "bullet2": "Espaços são removidos automaticamente", + "bullet3": "Expressões inválidas são ignoradas" + }, + "syntax": { + "title": "Noções básicas de sintaxe", + "text": "Use números, intervalos, palavras-chave e progressões (n começa em 0). Parênteses são suportados.", + "bullets": { + "numbers": "Números/intervalos: 5, 10-20", + "keywords": "Palavras-chave: ímpar, par", + "progressions": "Progressões: 3n, 4n+1" + } + }, + "operators": { + "title": "Operadores", + "text": "AND tem precedência maior que vírgula. NOT se aplica dentro do intervalo do documento.", + "and": "AND: & ou \"and\" — exige ambas as condições (ex.: 1-50 & par)", + "comma": "Vírgula: , ou | — combina seleções (ex.: 1-10, 20)", + "not": "NOT: ! ou \"not\" — exclui páginas (ex.: 3n & not 30)" + }, + "examples": { + "title": "Exemplos" } } }, - "removePassword": { - "tags": "seguro, descriptografar, segurança, remover senha", - "title": "Desproteger PDF", - "header": "Desproteger PDF (descriptografar)", - "selectText": { - "1": "Selecione o PDF para descriptografar:", - "2": "Senha" + "bulkSelection": { + "header": { + "title": "Guia de seleção de páginas" }, - "submit": "Descriptografar", - "desc": "Descriptografar o PDF realizando a remoção da senha.", - "password": { - "stepTitle": "Desproteger PDF", - "label": "Senha Atual" + "syntax": { + "title": "Noções básicas de sintaxe", + "text": "Use números, intervalos, palavras-chave e progressões (n começa em 0). Parênteses são suportados.", + "bullets": { + "numbers": "Números/intervalos: 5, 10-20", + "keywords": "Palavras-chave: ímpar, par", + "progressions": "Progressões: 3n, 4n+1" + } + }, + "operators": { + "title": "Operadores", + "text": "AND tem precedência maior que a vírgula. NOT se aplica dentro do intervalo do documento.", + "and": "AND: & ou \"and\" — exige ambas as condições (ex.: 1-50 & par)", + "comma": "Vírgula: , ou | — combina seleções (ex.: 1-10, 20)", + "not": "NOT: ! ou \"not\" — exclui páginas (ex.: 3n & not 30)" + }, + "examples": { + "title": "Exemplos", + "first50": "Primeiras 50", + "last50": "Últimas 50", + "every3rd": "A cada 3ª", + "oddWithinExcluding": "Ímpares entre 1-20, excluindo 5-7", + "combineSets": "Combinar conjuntos" + }, + "firstNPages": { + "title": "Primeiras N páginas", + "placeholder": "Número de páginas" + }, + "lastNPages": { + "title": "Últimas N páginas", + "placeholder": "Número de páginas" + }, + "everyNthPage": { + "title": "A cada N páginas", + "placeholder": "Tamanho do passo" + }, + "range": { + "title": "Intervalo", + "fromPlaceholder": "De", + "toPlaceholder": "Até" + }, + "keywords": { + "title": "Palavras-chave" + }, + "advanced": { + "title": "Avançado" } }, "compressPdfs": { @@ -843,28 +1357,141 @@ "tags": "remoção,apagar,formulario,campo,apenasleitura", "title": "Remover Apenas Leitura de Formulários", "header": "Desbloquear Formulários do PDF", - "submit": "Remove" + "submit": "Remove", + "description": "Esta ferramenta removerá as restrições de somente leitura dos campos de formulário PDF, tornando-os editáveis e preenchíveis.", + "filenamePrefix": "formularios_desbloqueados", + "files": { + "placeholder": "Selecione um arquivo PDF na visualização principal para começar" + }, + "error": { + "failed": "Ocorreu um erro ao desbloquear formulários PDF." + }, + "results": { + "title": "Resultados dos formulários desbloqueados" + } }, "changeMetadata": { - "tags": "Título,autor,data,criação,hora,editor,produtor,estatísticas", - "title": "Alterar Metadados", "header": "Alterar Metadados", - "selectText": { - "1": "Edite as variáveis ​​que deseja alterar.", - "2": "Excluir todos os metadados.", - "3": "Mostrar metadados personalizados.", - "4": "Outros metadados:", - "5": "Adicionar Entrada de Metadados Personalizada" + "submit": "Alterar", + "filenamePrefix": "metadados", + "settings": { + "title": "Configurações de metadados" }, - "author": "Autor:", - "creationDate": "Data de criação (aaaa/mm/dd HH:mm:ss):", - "creator": "Criador:", - "keywords": "Palavras-chave:", - "modDate": "Data de modificação (aaaa/mm/dd HH:mm:ss):", - "producer": "Produtor:", - "subject": "Assunto:", - "trapped": "Metadados trapping:", - "submit": "Alterar" + "standardFields": { + "title": "Campos padrão" + }, + "deleteAll": { + "label": "Remover metadados existentes", + "checkbox": "Excluir todos os metadados" + }, + "title": { + "label": "Título", + "placeholder": "Título do documento" + }, + "author": { + "label": "Autor", + "placeholder": "Autor do documento" + }, + "subject": { + "label": "Assunto", + "placeholder": "Assunto do documento" + }, + "keywords": { + "label": "Palavras-chave", + "placeholder": "Palavras-chave do documento" + }, + "creator": { + "label": "Criador", + "placeholder": "Criador do documento" + }, + "producer": { + "label": "Produtor", + "placeholder": "Produtor do documento" + }, + "dates": { + "title": "Campos de data" + }, + "creationDate": { + "label": "Data de criação", + "placeholder": "Data de criação" + }, + "modificationDate": { + "label": "Data de modificação", + "placeholder": "Data de modificação" + }, + "trapped": { + "label": "Status de trapping", + "unknown": "Desconhecido", + "true": "Verdadeiro", + "false": "Falso" + }, + "advanced": { + "title": "Opções avançadas" + }, + "customFields": { + "title": "Metadados personalizados", + "description": "Adicione campos de metadados personalizados ao documento", + "add": "Adicionar campo", + "key": "Chave", + "keyPlaceholder": "Chave personalizada", + "value": "Valor", + "valuePlaceholder": "Valor personalizado", + "remove": "Remover" + }, + "results": { + "title": "PDFs atualizados" + }, + "error": { + "failed": "Ocorreu um erro ao alterar os metadados do PDF." + }, + "tooltip": { + "header": { + "title": "Visão geral dos metadados de PDF" + }, + "standardFields": { + "title": "Campos padrão", + "text": "Campos comuns de metadados de PDF que descrevem o documento.", + "bullet1": "Título: nome ou título do documento", + "bullet2": "Autor: pessoa que criou o documento", + "bullet3": "Assunto: breve descrição do conteúdo", + "bullet4": "Palavras-chave: termos de pesquisa do documento", + "bullet5": "Criador/Produtor: software usado para criar o PDF" + }, + "dates": { + "title": "Campos de data", + "text": "Quando o documento foi criado e modificado.", + "bullet1": "Data de criação: quando o documento original foi criado", + "bullet2": "Data de modificação: quando foi alterado pela última vez" + }, + "options": { + "title": "Opções adicionais", + "text": "Campos personalizados e controles de privacidade.", + "bullet1": "Metadados personalizados: adicione seus próprios pares chave-valor", + "bullet2": "Status de trapping: configuração para impressão de alta qualidade", + "bullet3": "Excluir tudo: remove todos os metadados para privacidade" + }, + "deleteAll": { + "title": "Remover metadados existentes", + "text": "Exclusão completa de metadados para garantir privacidade." + }, + "customFields": { + "title": "Metadados personalizados", + "text": "Adicione seus próprios pares de metadados chave-valor.", + "bullet1": "Adicione quaisquer campos personalizados relevantes ao seu documento", + "bullet2": "Exemplos: Departamento, Projeto, Versão, Status", + "bullet3": "Chave e valor são obrigatórios para cada entrada" + }, + "advanced": { + "title": "Opções avançadas", + "trapped": { + "title": "Status de trapping", + "description": "Indica se o documento está preparado para impressão de alta qualidade.", + "bullet1": "Verdadeiro: o documento foi preparado (trapping) para impressão", + "bullet2": "Falso: o documento não foi preparado (trapping)", + "bullet3": "Desconhecido: o status de trapping não está especificado" + } + } + } }, "fileToPDF": { "tags": "transformação,formato,documento,imagem,slide,texto,conversão,escritório,documentos,word,excel,powerpoint", @@ -878,6 +1505,7 @@ "ocr": { "tags": "reconhecimento,texto,imagem,digitalização,leitura,identificação,detecção,editável", "title": "Processamento de OCR", + "desc": "Reconhecimento Óptico de Caracteres transforma PDFs com imagens em documentos pesquisáveis e com texto selecionável.", "header": "Processamento de OCR (Reconhecimento Óptico de Caracteres)", "selectText": { "1": "Selecione os idiomas a serem detectados no PDF (os listados são os atualmente instalados):", @@ -896,22 +1524,85 @@ "help": "Por favor, leia a documentação abaixo para saber mais sobre OCR e sua utilização.", "credit": "Este serviço usa Qpdf e Tesseract para OCR.", "submit": "Processar OCR no PDF", - "desc": "Reconhecimento Óptico de Caracteres transforma PDFs com imagens em documentos pesquisáveis e com texto selecionável.", + "operation": { + "submit": "Processar OCR e revisar" + }, + "results": { + "title": "Resultados de OCR" + }, + "languagePicker": { + "additionalLanguages": "Procurando idiomas adicionais?", + "viewSetupGuide": "Ver guia de configuração →" + }, "settings": { "title": "Configurações", "ocrMode": { - "label": "Modo OCR:" + "label": "Modo OCR:", + "auto": "Automático (pular camadas de texto)", + "force": "Forçar (re-OCR em tudo, substituir texto)", + "strict": "Rígido (abortar se houver texto)" }, "languages": { - "label": "Idiomas" + "label": "Idiomas", + "placeholder": "Selecionar idiomas" + }, + "compatibilityMode": { + "label": "Modo de compatibilidade" + }, + "advancedOptions": { + "label": "Opções de processamento", + "sidecar": "Criar um arquivo de texto", + "deskew": "Corrigir inclinação das páginas", + "clean": "Limpar arquivo de entrada", + "cleanFinal": "Limpar saída final" } }, "tooltip": { + "header": { + "title": "Visão geral das configurações de OCR" + }, "mode": { - "title": "Modo OCR:" + "title": "Modo OCR:", + "text": "Optical Character Recognition (OCR) ajuda você a transformar páginas digitalizadas ou capturas de tela em texto que pode pesquisar, copiar ou destacar.", + "bullet1": "Automático pula páginas que já contêm camadas de texto.", + "bullet2": "Forçar reexecuta o OCR em todas as páginas e substitui todo o texto.", + "bullet3": "Rígido interrompe se for encontrado qualquer texto selecionável." }, "languages": { - "title": "Idiomas" + "title": "Idiomas", + "text": "Melhore a precisão do OCR especificando os idiomas esperados. Escolha um ou mais idiomas para orientar a detecção." + }, + "output": { + "title": "Saída", + "text": "Decida como você quer que o texto de saída seja formatado:", + "bullet1": "PDF pesquisável incorpora o texto atrás da imagem original.", + "bullet2": "HOCR XML retorna um arquivo estruturado legível por máquina.", + "bullet3": "Sidecar de texto simples cria um arquivo .txt separado com o conteúdo bruto." + }, + "advanced": { + "header": { + "title": "Processamento avançado de OCR" + }, + "compatibility": { + "title": "Modo de compatibilidade", + "text": "Usa o modo de OCR 'sandwich PDF': resulta em arquivos maiores, porém mais confiáveis com certos idiomas e softwares PDF mais antigos. Por padrão usamos hOCR para PDFs menores e modernos." + }, + "sidecar": { + "title": "Criar arquivo de texto", + "text": "Gera um arquivo .txt separado junto ao PDF contendo todo o texto extraído para fácil acesso e processamento." + }, + "deskew": { + "title": "Corrigir inclinação das páginas", + "text": "Corrige automaticamente páginas tortas ou inclinadas para melhorar a precisão do OCR. Útil para documentos digitalizados que não ficaram perfeitamente alinhados." + }, + "clean": { + "title": "Limpar arquivo de entrada", + "text": "Pré-processa a entrada removendo ruído, aprimorando contraste e otimizando a imagem para melhor reconhecimento de OCR antes do processamento." + }, + "cleanFinal": { + "title": "Limpar saída final", + "text": "Pós-processa o PDF final removendo artefatos de OCR e otimizando a camada de texto para melhor legibilidade e tamanho menor." + } } } }, @@ -921,7 +1612,13 @@ "header": "Extrair Imagens", "selectText": "Selecione o formato de saída das imagens extraídas:", "allowDuplicates": "Salvar imagens duplicadas.", - "submit": "Extrair" + "submit": "Extrair", + "settings": { + "title": "Configurações" + }, + "error": { + "failed": "Ocorreu um erro ao extrair imagens do PDF." + } }, "pdfToPDFA": { "tags": "arquivo,longo prazo,padrão,conversão,armazenamento,preservação", @@ -993,17 +1690,53 @@ }, "info": "Python não está instalado. É necessário para executar." }, + "scannerImageSplit": { + "title": "Imagens extraídas", + "submit": "Extrair fotos digitalizadas", + "error": { + "failed": "Ocorreu um erro ao extrair fotos digitalizadas." + }, + "tooltip": { + "title": "Divisor de fotos", + "whatThisDoes": "O que isso faz", + "whatThisDoesDesc": "Localiza e extrai automaticamente cada foto de uma página digitalizada ou imagem composta — sem recorte manual.", + "whenToUse": "Quando usar", + "useCase1": "Digitalize páginas inteiras de álbuns de uma vez", + "useCase2": "Divida lotes de mesa plana em arquivos separados", + "useCase3": "Quebre colagens em fotos individuais", + "useCase4": "Puxe fotos de documentos", + "quickFixes": "Correções rápidas", + "problem1": "Fotos não detectadas → aumente a Tolerância para 30–50", + "problem2": "Muitas detecções falsas → aumente a Área mínima para 15.000–20.000", + "problem3": "Cortes muito justos → aumente o Tamanho da borda para 5–10", + "problem4": "Fotos inclinadas não endireitadas → reduza o Limite de ângulo para ~5°", + "problem5": "Caixas de poeira/ruído → aumente a Área mínima de contorno para 1000–2000", + "setupTips": "Dicas de configuração", + "tip1": "Use um fundo liso e claro", + "tip2": "Deixe um pequeno espaço (≈1 cm) entre as fotos", + "tip3": "Digitalize a 300–600 DPI", + "tip4": "Limpe o vidro do scanner", + "headsUp": "Atenção", + "headsUpDesc": "Fotos sobrepostas ou fundos muito próximos em cor às fotos podem reduzir a precisão — tente um fundo mais claro ou mais escuro e deixe mais espaço." + } + }, "sign": { - "tags": "autorizar,iniciais,assinatura-desenhada,assinatura-de-texto,assinatura-de-imagem", "title": "Assinar", "header": "Assinar", "upload": "Carregar Imagem", - "draw": "Desenhar Assinatura", - "text": "Inserir Texto", + "draw": { + "title": "Desenhe sua assinatura", + "clear": "Limpar" + }, + "text": { + "name": "Nome do signatário", + "placeholder": "Insira seu nome completo" + }, "clear": "Limpar", "add": "Adicionar", "saved": "Assinaturas Salvas", "save": "Salvar Assinatura", + "applySignatures": "Aplicar assinaturas", "personalSigs": "Assinaturas Pessoais", "sharedSigs": "Assinaturas Compartilhadas", "noSavedSigs": "Nenhuma assinatura salva encontrada.", @@ -1015,42 +1748,157 @@ "previous": "Página anterior", "maintainRatio": "Habilitar manter proporção", "undo": "Desfazer", - "redo": "Refazer" + "redo": "Refazer", + "submit": "Assinar documento", + "steps": { + "configure": "Configurar assinatura" + }, + "type": { + "title": "Tipo de assinatura", + "draw": "Desenhar", + "canvas": "Canvas", + "image": "Imagem", + "text": "Texto" + }, + "image": { + "label": "Enviar imagem da assinatura", + "placeholder": "Selecionar arquivo de imagem", + "hint": "Envie uma imagem PNG ou JPG da sua assinatura" + }, + "instructions": { + "title": "Como adicionar assinatura" + }, + "activate": "Ativar posicionamento de assinatura", + "deactivate": "Parar de posicionar assinaturas", + "results": { + "title": "Resultados da assinatura" + }, + "error": { + "failed": "Ocorreu um erro ao assinar o PDF." + } }, "flatten": { - "tags": "estático,desativar,não-interativo,otimizar", "title": "Achatar", "header": "Achatar", "flattenOnlyForms": "Achatar apenas formulários interativos.", "submit": "Achatar", + "filenamePrefix": "achatado", + "files": { + "placeholder": "Selecione um arquivo PDF na visualização principal para começar" + }, "steps": { "settings": "Configurações" }, "options": { - "flattenOnlyForms": "Achatar apenas formulários interativos." + "stepTitle": "Opções de achatamento", + "title": "Opções de achatamento", + "flattenOnlyForms.desc": "Achatar apenas campos de formulário, mantendo outros elementos interativos", + "note": "Achatar remove elementos interativos do PDF, tornando-os não editáveis." + }, + "results": { + "title": "Resultados do achatamento" + }, + "error": { + "failed": "Ocorreu um erro ao achatar o PDF." + }, + "tooltip": { + "header": { + "title": "Sobre o achatamento de PDFs" + }, + "description": { + "title": "O que o achatamento faz?", + "text": "Achatar torna seu PDF não editável transformando formulários preenchíveis e botões em texto e imagens comuns. O PDF terá exatamente a mesma aparência, mas ninguém poderá alterar ou preencher os formulários. Perfeito para compartilhar formulários concluídos, criar documentos finais para registros ou garantir que o PDF tenha a mesma aparência em qualquer lugar.", + "bullet1": "Caixas de texto viram texto comum (não pode ser editado)", + "bullet2": "Caixas de seleção e botões viram imagens", + "bullet3": "Ótimo para versões finais que você não quer alterar", + "bullet4": "Garante aparência consistente em todos os dispositivos" + }, + "formsOnly": { + "title": "O que significa 'Achatar apenas formulários'?", + "text": "Essa opção apenas remove a capacidade de preencher formulários, mas mantém outros recursos funcionando como clicar em links, ver marcadores e ler comentários.", + "bullet1": "Formulários ficam não editáveis", + "bullet2": "Links continuam funcionando ao clicar", + "bullet3": "Comentários e notas permanecem visíveis", + "bullet4": "Marcadores continuam ajudando na navegação" + } } }, "repair": { "tags": "corrigir,restaurar,correção,recuperar", "title": "Reparar", "header": "Reparar", - "submit": "Reparar" + "submit": "Reparar", + "description": "Esta ferramenta tentará reparar arquivos PDF corrompidos ou danificados. Nenhuma configuração adicional é necessária.", + "filenamePrefix": "reparado", + "files": { + "placeholder": "Selecione um arquivo PDF na visualização principal para começar" + }, + "error": { + "failed": "Ocorreu um erro ao reparar o PDF." + }, + "results": { + "title": "Resultados do reparo" + } }, "removeBlanks": { - "tags": "limpeza,otimização,sem-conteúdo,organizar", "title": "Remover Páginas em Branco", "header": "Remover Páginas em Branco", - "threshold": "Limite de brancura de pixel:", - "thresholdDesc": "Limite para determinar o quão branco um pixel branco deve ser para ser classificado como \"branco\", para remoção. 0 = Preto, 255 = branco puro.", - "whitePercent": "Porcentagem de branco (%):", - "whitePercentDesc": "Porcentagem da página que devem ter pixels classificados como “brancos” para serem removidas.", + "settings": { + "title": "Configurações" + }, + "threshold": { + "label": "Limite de brancura do pixel" + }, + "whitePercent": { + "label": "Limite de porcentagem de branco", + "unit": "%" + }, + "includeBlankPages": { + "label": "Incluir páginas em branco detectadas" + }, + "tooltip": { + "header": { + "title": "Configurações de remoção de páginas em branco" + }, + "threshold": { + "title": "Limite de brancura do pixel", + "text": "Controla quão branco um pixel deve ser para ser considerado 'branco'. Isso ajuda a determinar o que conta como área em branco na página.", + "bullet1": "0 = Preto puro (mais restritivo)", + "bullet2": "128 = Cinza médio", + "bullet3": "255 = Branco puro (menos restritivo)" + }, + "whitePercent": { + "title": "Limite de porcentagem de branco", + "text": "Define a porcentagem mínima de pixels brancos necessária para que uma página seja considerada em branco e removida.", + "bullet1": "Valores menores (ex.: 80%) = Mais páginas removidas", + "bullet2": "Valores maiores (ex.: 95%) = Apenas páginas muito em branco removidas", + "bullet3": "Use valores maiores para documentos com fundos claros" + }, + "includeBlankPages": { + "title": "Incluir páginas em branco detectadas", + "text": "Quando ativado, cria um PDF separado contendo todas as páginas em branco que foram detectadas e removidas do documento original.", + "bullet1": "Útil para revisar o que foi removido", + "bullet2": "Ajuda a verificar a precisão da detecção", + "bullet3": "Pode ser desativado para reduzir o tamanho do arquivo de saída" + } + }, "submit": "Remover Páginas em Branco" }, "removeAnnotations": { "tags": "comentários,destaque,notas,marcação,remover", "title": "Remover Anotações", "header": "Remover Anotações", - "submit": "Remover" + "submit": "Remover", + "settings": { + "title": "Configurações" + }, + "info": { + "title": "Sobre remover anotações", + "description": "Esta ferramenta removerá todas as anotações (comentários, realces, notas etc.) dos seus documentos PDF." + }, + "error": { + "failed": "Ocorreu um erro ao remover anotações do PDF." + } }, "compare": { "tags": "diferenciar,contraste,mudanças,análise", @@ -1082,28 +1930,140 @@ "certSign": { "tags": "autenticar,PEM,P12,oficial,criptografar", "title": "Assinatura com Certificado", - "header": "Assinatura com Certificado (Em desenvolvimento)", - "selectPDF": "Selecione um arquivo PDF para assinatura:", - "jksNote": "Nota: Se o seu tipo de certificado não estiver listado abaixo, converta-o em um arquivo Java Keystore (.jks) usando a ferramenta de linha de comando keytool. Em seguida, escolha a opção de arquivo .jks abaixo.", - "selectKey": "Selecione o seu arquivo de chave privada (formato PKCS#8, pode ser .pem ou .der):", - "selectCert": "Selecione o seu arquivo de certificado (formato X.509, pode ser .pem ou .der):", - "selectP12": "Selecione o seu arquivo de armazenamento de chave PKCS#12 (.p12 ou .pfx) (opcional, se fornecido, deve conter a sua chave privada e certificado):", - "selectJKS": "Selecione seu arquivo Java Keystore (.jks ou .keystore):", - "certType": "Tipo de Certificado:", - "password": "Digite a senha do seu armazenamento de chave ou chave privada (se aplicável):", - "showSig": "Mostrar Assinatura.", - "reason": "Razão", - "location": "Localização", - "name": "Nome", - "showLogo": "Mostrar Logotipo", - "submit": "Assinar PDF" + "filenamePrefix": "assinado", + "signMode": { + "stepTitle": "Modo de assinatura", + "tooltip": { + "header": { + "title": "Sobre assinaturas de PDF" + }, + "overview": { + "title": "Como funcionam as assinaturas", + "text": "Ambos os modos selam o documento (quaisquer edições são sinalizadas como adulteração) e registram quem/quando/como para auditoria. A confiabilidade no visualizador depende da cadeia de certificação." + }, + "manual": { + "title": "Manual — Traga seu certificado", + "text": "Use seus próprios arquivos de certificado para uma identidade alinhada à marca. Pode exibir Confiável quando sua AC/cadeia for reconhecida.", + "use": "Use para: voltado ao cliente, jurídico, conformidade." + }, + "auto": { + "title": "Automático — Selagem instantânea sem configuração", + "text": "Assina com um certificado de servidor autoassinado. Mesmo selo à prova de adulteração e trilha de auditoria; normalmente exibe Não verificado nos visualizadores.", + "use": "Use quando: você precisa de rapidez e identidade interna consistente em revisões e registros." + }, + "rule": { + "title": "Regra prática", + "text": "Precisa do status Confiável no destinatário? Manual. Precisa de selagem rápida, à prova de adulteração e trilha de auditoria sem configuração? Automático." + } + } + }, + "certTypeStep": { + "stepTitle": "Formato do certificado" + }, + "certFiles": { + "stepTitle": "Arquivos de certificado" + }, + "appearance": { + "stepTitle": "Aparência da assinatura", + "tooltip": { + "header": { + "title": "Sobre a aparência da assinatura" + }, + "invisible": { + "title": "Assinaturas invisíveis", + "text": "A assinatura é adicionada ao PDF para segurança, mas não ficará visível ao visualizar o documento. Perfeita para requisitos legais sem alterar a aparência do documento.", + "bullet1": "Fornece segurança sem alterações visuais", + "bullet2": "Atende aos requisitos legais para assinatura digital", + "bullet3": "Não afeta o layout ou design do documento" + }, + "visible": { + "title": "Assinaturas visíveis", + "text": "Exibe um bloco de assinatura no PDF com seu nome, data e detalhes opcionais. Útil quando você quer que os leitores vejam claramente que o documento está assinado.", + "bullet1": "Mostra o nome e a data do signatário no documento", + "bullet2": "Pode incluir o motivo e o local da assinatura", + "bullet3": "Escolha em qual página posicionar a assinatura", + "bullet4": "Logo opcional pode ser incluído" + } + } + }, + "sign": { + "submit": "Assinar PDF", + "results": "PDF assinado" + }, + "error": { + "failed": "Ocorreu um erro ao processar as assinaturas." + }, + "tooltip": { + "header": { + "title": "Sobre o gerenciamento de assinaturas" + }, + "overview": { + "title": "O que esta ferramenta pode fazer?", + "text": "Esta ferramenta permite verificar se seus PDFs estão assinados digitalmente e adicionar novas assinaturas digitais. Assinaturas digitais provam quem criou ou aprovou um documento e mostram se ele foi alterado desde a assinatura.", + "bullet1": "Verifique as assinaturas existentes e sua validade", + "bullet2": "Veja informações detalhadas sobre signatários e certificados", + "bullet3": "Adicione novas assinaturas digitais para proteger seus documentos", + "bullet4": "Vários arquivos suportados com navegação fácil" + }, + "validation": { + "title": "Verificando assinaturas", + "text": "Ao verificar as assinaturas, a ferramenta informa se são válidas, quem assinou o documento, quando foi assinado e se o documento foi alterado desde a assinatura.", + "bullet1": "Mostra se as assinaturas são válidas ou inválidas", + "bullet2": "Exibe informações do signatário e data da assinatura", + "bullet3": "Verifica se o documento foi modificado após a assinatura", + "bullet4": "Pode usar certificados personalizados para verificação" + }, + "signing": { + "title": "Adicionando assinaturas", + "text": "Para assinar um PDF, você precisa de um certificado digital (como PEM, PKCS12 ou JKS). Você pode optar por deixar a assinatura visível no documento ou mantê-la invisível apenas para segurança.", + "bullet1": "Suporta formatos de certificado PEM, PKCS12, JKS e de servidor", + "bullet2": "Opção para mostrar ou ocultar a assinatura no PDF", + "bullet3": "Adicione motivo, local e nome do signatário", + "bullet4": "Escolha em qual página colocar assinaturas visíveis", + "bullet5": "Use certificado do servidor para a opção simples 'Assinar com Stirling-PDF'" + } + }, + "certType": { + "tooltip": { + "header": { + "title": "Sobre os tipos de certificado" + }, + "what": { + "title": "O que é um certificado?", + "text": "É uma identificação segura da sua assinatura que comprova que você assinou. A menos que seja exigido assinar por certificado, recomendamos usar outro método seguro como Digitar, Desenhar ou Enviar." + }, + "which": { + "title": "Qual opção devo usar?", + "text": "Escolha o formato que corresponde ao seu arquivo de certificado:", + "bullet1": "PKCS#12 (.p12 / .pfx) – um arquivo combinado (mais comum)", + "bullet2": "PFX (.pfx) – versão da Microsoft do PKCS12", + "bullet3": "PEM – arquivos .pem separados de chave privada e certificado", + "bullet4": "JKS – keystore .jks Java para fluxos de trabalho de dev / CI-CD" + }, + "convert": { + "title": "Chave não listada?", + "text": "Converta seu arquivo para um keystore Java (.jks) com o keytool e, em seguida, escolha JKS." + } + } + } }, "removeCertSign": { "tags": "autenticar,PEM,P12,oficial,descriptografar", "title": "Remover Assinatura com Certificado", "header": "Remover Assinatura com Certificado", "selectPDF": "Selecione um arquivo PDF:", - "submit": "Remover Assinatura" + "submit": "Remover Assinatura", + "description": "Esta ferramenta removerá assinaturas de certificado digital do seu documento PDF.", + "filenamePrefix": "sem_assinatura", + "files": { + "placeholder": "Selecione um arquivo PDF na visualização principal para começar" + }, + "error": { + "failed": "Ocorreu um erro ao remover assinaturas de certificado." + }, + "results": { + "title": "Resultados da remoção de certificados" + } }, "pageLayout": { "tags": "mesclar,composto,vista-única,organizar", @@ -1113,8 +2073,100 @@ "addBorder": "Adicionar bordas.", "submit": "Enviar" }, + "bookletImposition": { + "tags": "livreto,imposição,impressão,encadernação,dobra,assinatura", + "title": "Imposição de livreto", + "header": "Imposição de livreto", + "submit": "Criar livreto", + "spineLocation": { + "label": "Posição da lombada", + "left": "Esquerda (Padrão)", + "right": "Direita (RTL)" + }, + "doubleSided": { + "label": "Impressão frente e verso", + "tooltip": "Cria frente e verso para impressão correta do livreto" + }, + "manualDuplex": { + "title": "Modo duplex manual", + "instructions": "Para impressoras sem duplex automático. Você precisará executar isto duas vezes:" + }, + "duplexPass": { + "label": "Passagem de impressão", + "first": "1ª passagem", + "second": "2ª passagem", + "firstInstructions": "Imprime as frentes → empilhe com a face voltada para baixo → execute novamente com a 2ª passagem", + "secondInstructions": "Carregue a pilha impressa com a face voltada para baixo → imprime os versos" + }, + "rtlBinding": { + "label": "Encadernação da direita para a esquerda (RTL)", + "tooltip": "Para árabe, hebraico ou outros idiomas da direita para a esquerda (RTL)" + }, + "addBorder": { + "label": "Adicionar bordas ao redor das páginas", + "tooltip": "Adiciona bordas ao redor de cada seção da página para ajudar no corte e alinhamento" + }, + "addGutter": { + "label": "Adicionar margem de lombada", + "tooltip": "Adiciona espaço de margem interna para encadernação" + }, + "gutterSize": { + "label": "Tamanho da lombada (pontos)" + }, + "flipOnShortEdge": { + "label": "Virar na borda curta (apenas duplex automático)", + "tooltip": "Ative para impressão duplex na borda curta (apenas duplex automático — ignorado no modo manual)", + "manualNote": "Não necessário no modo manual — você vira a pilha manualmente" + }, + "advanced": { + "toggle": "Opções avançadas" + }, + "paperSizeNote": "O tamanho do papel é derivado automaticamente da sua primeira página.", + "tooltip": { + "header": { + "title": "Guia de criação de livreto" + }, + "description": { + "title": "O que é imposição de livreto?", + "text": "Cria livretos profissionais organizando as páginas na ordem correta de impressão. Suas páginas do PDF são posicionadas 2 por folha em folhas paisagem para que, quando dobradas e encadernadas, sejam lidas na sequência correta como um livro real." + }, + "example": { + "title": "Exemplo: livreto de 8 páginas", + "text": "Seu documento de 8 páginas se torna 2 folhas:", + "bullet1": "Folha 1 Frente: Páginas 8, 1 | Verso: Páginas 2, 7", + "bullet2": "Folha 2 Frente: Páginas 6, 3 | Verso: Páginas 4, 5", + "bullet3": "Quando dobrado e empilhado: Lê 1→2→3→4→5→6→7→8" + }, + "printing": { + "title": "Como imprimir e montar", + "text": "Siga estas etapas para livretos perfeitos:", + "bullet1": "Imprima frente e verso com 'Virar na borda longa'", + "bullet2": "Empilhe as folhas em ordem e dobre ao meio", + "bullet3": "Grampeie ou encaderne ao longo da lombada dobrada", + "bullet4": "Para impressoras de borda curta: habilite a opção 'Virar na borda curta'" + }, + "manualDuplex": { + "title": "Duplex manual (impressoras de uma face)", + "text": "Para impressoras sem duplex automático:", + "bullet1": "Desative 'Impressão frente e verso'", + "bullet2": "Selecione '1ª passagem' → Imprima → Empilhe com a face para baixo", + "bullet3": "Selecione '2ª passagem' → Carregue a pilha → Imprima os versos", + "bullet4": "Dobre e monte normalmente" + }, + "advanced": { + "title": "Opções avançadas", + "text": "Ajuste fino do seu livreto:", + "bullet1": "Encadernação da direita para a esquerda: Para árabe, hebraico ou idiomas RTL", + "bullet2": "Bordas: Mostra linhas de corte para acabamento", + "bullet3": "Margem de lombada: Adiciona espaço para encadernação", + "bullet4": "Virar na borda curta: Somente para impressoras com duplex automático" + } + }, + "error": { + "failed": "Ocorreu um erro ao criar a imposição de livreto." + } + }, "scalePages": { - "tags": "redimensionar,modificar,dimensão,adaptar", "title": "Ajustar Dimensões da Página", "header": "Ajustar Dimensões da Página", "pageSize": "Tamanho desejado do documento:", @@ -1122,6 +2174,44 @@ "scaleFactor": "Fator de zoom (corte) de uma página:", "submit": "Enviar" }, + "adjustPageScale": { + "tags": "redimensionar,modificar,dimensão,adaptar", + "title": "Ajustar escala da página", + "header": "Ajustar escala da página", + "scaleFactor": { + "label": "Fator de escala" + }, + "pageSize": { + "label": "Tamanho de página desejado", + "keep": "Manter tamanho original", + "letter": "Carta", + "legal": "Legal" + }, + "submit": "Ajustar escala da página", + "error": { + "failed": "Ocorreu um erro ao ajustar a escala da página." + }, + "tooltip": { + "header": { + "title": "Visão geral das configurações de escala da página" + }, + "description": { + "title": "Descrição", + "text": "Ajuste o tamanho do conteúdo do PDF e altere as dimensões da página." + }, + "scaleFactor": { + "title": "Fator de escala", + "text": "Controla o quão grande ou pequeno o conteúdo aparece na página. O conteúdo é escalado e centralizado — se o conteúdo escalado for maior que o tamanho da página, ele poderá ser recortado.", + "bullet1": "1,0 = Tamanho original", + "bullet2": "0,5 = Metade do tamanho (50% menor)", + "bullet3": "2,0 = Dobro do tamanho (200% maior, pode recortar)" + }, + "pageSize": { + "title": "Tamanho de página desejado", + "text": "Define as dimensões das páginas do PDF de saída. 'Manter tamanho original' mantém as dimensões atuais, enquanto as outras opções redimensionam para tamanhos de papel padrão." + } + } + }, "add-page-numbers": { "tags": "paginar,rotular,organizar,índice" }, @@ -1129,16 +2219,66 @@ "tags": "detecção-automática,baseado-em-cabeçalho,organizar,relabel", "title": "Renomeação Automática do PDF", "header": "Renomeação Automática do PDF", - "submit": "Renomeação Automática" + "description": "Localiza automaticamente o título no conteúdo do seu PDF e o usa como nome de arquivo.", + "submit": "Renomeação Automática", + "files": { + "placeholder": "Selecione um arquivo PDF na visualização principal para começar" + }, + "error": { + "failed": "Ocorreu um erro ao renomear automaticamente o PDF." + }, + "results": { + "title": "Resultados de renomeação automática" + }, + "tooltip": { + "header": { + "title": "Como funciona a renomeação automática" + }, + "howItWorks": { + "title": "Renomeação inteligente", + "text": "Localiza automaticamente o título no conteúdo do seu PDF e o usa como nome de arquivo.", + "bullet1": "Procura por texto que pareça ser um título ou cabeçalho", + "bullet2": "Cria um nome de arquivo limpo e válido a partir do título detectado", + "bullet3": "Mantém o nome original se nenhum título adequado for encontrado" + } + } }, "adjust-contrast": { "tags": "correção-de-cor,ajustar,modificar,realçar" }, "crop": { - "tags": "aparar,encolher,editar,formato", "title": "Recortar", "header": "Recortar", - "submit": "Enviar" + "submit": "Enviar", + "noFileSelected": "Selecione um arquivo PDF para iniciar o corte", + "preview": { + "title": "Seleção da área de corte" + }, + "reset": "Redefinir para o PDF completo", + "coordinates": { + "title": "Posição e tamanho", + "x": "Posição X", + "y": "Posição Y", + "width": "Largura", + "height": "Altura" + }, + "error": { + "invalidArea": "A área de corte se estende além dos limites do PDF", + "failed": "Falha ao recortar o PDF" + }, + "steps": { + "selectArea": "Selecionar área de corte" + }, + "tooltip": { + "title": "Como recortar PDFs", + "description": "Selecione a área a recortar do seu PDF arrastando e redimensionando a sobreposição azul na miniatura.", + "drag": "Arraste a sobreposição para mover a área de corte", + "resize": "Arraste os cantos e bordas para redimensionar", + "precision": "Use as entradas de coordenadas para posicionamento preciso" + }, + "results": { + "title": "Resultados do corte" + } }, "autoSplitPDF": { "tags": "baseado-em-QR,separar,segmento-de-digitalização,organizar", @@ -1221,64 +2361,122 @@ "downloadJS": "Baixar JavaScript", "submit": "Mostrar" }, - "autoRedact": { - "tags": "Redigir,ocultar,escurecer,preto,marcador,oculto", - "title": "Ocultação de Texto Automática", - "header": "Ocultação de Texto Automática", - "colorLabel": "Cor:", - "textsToRedactLabel": "Texto para ocultar (um por linha):", - "textsToRedactPlaceholder": "Por exemplo: \\nConfidencial \\nSecreto", - "useRegexLabel": "Usar Regex (expressão regular).", - "wholeWordSearchLabel": "Pesquisa apenas palavras inteiras.", - "customPaddingLabel": "Preenchimento extra personalizado:", - "convertPDFToImageLabel": "Converter PDF em imagem PDF (Usado para remover o texto atrás da caixa).", - "submitButton": "Ocultar" - }, "redact": { "tags": "Redigir,ocultar,escurecer,preto,marcador,oculto,manual", "title": "Ocultação de Texto Manual", - "header": "Ocultação de Texto Manual", "submit": "Ocultar", - "textBasedRedaction": "Ocultação baseada em texto", - "pageBasedRedaction": "Ocultação baseada em páginas", - "convertPDFToImageLabel": "Converter PDF para PDF-Imagem (Utilizado para remover texto atrás da seleção)", - "pageRedactionNumbers": { - "title": "Páginas", - "placeholder": "(p.ex. 1,2,8 ou 4,7,12-16 ou 2n-1)" + "error": { + "failed": "Ocorreu um erro ao ocultar o PDF." }, - "redactionColor": { - "title": "Cor da Ocultação" + "modeSelector": { + "title": "Método de ocultação", + "mode": "Modo", + "automatic": "Automático", + "automaticDesc": "Oculte texto com base em termos de busca", + "manual": "Manual", + "manualDesc": "Clique e arraste para ocultar áreas específicas", + "manualComingSoon": "Ocultação manual em breve" }, - "export": "Exportar", - "upload": "Carregar", - "boxRedaction": "Ocultação baseada em formas", - "zoom": "Zoom", - "zoomIn": "Ampliar", - "zoomOut": "Reduzir", - "nextPage": "Proxima Página", - "previousPage": "Página Anterior", - "toggleSidebar": "Mostrar/Ocultar Barra Lateral", - "showThumbnails": "Mostrar Miniaturas", - "showDocumentOutline": "Mostrar Estrutura do Documento (duplo clique para expandir/recolher todos os itens)", - "showAttatchments": "Mostrar Anexos", - "showLayers": "Mostrar Camadas (duplo clique para restabelecer as camadas para o estado padrão)", - "colourPicker": "Seletor de Cores", - "findCurrentOutlineItem": "Encontrar item atual", - "applyChanges": "Aplicar Alterações", "auto": { + "header": "Ocultação automática", "settings": { + "title": "Configurações de ocultação", "advancedTitle": "Avançado" }, + "colorLabel": "Cor da caixa", "wordsToRedact": { - "add": "Adicionar" + "title": "Palavras para ocultar", + "placeholder": "Digite uma palavra", + "add": "Adicionar", + "examples": "Exemplos: Confidential, Top-Secret" + }, + "useRegexLabel": "Usar Regex", + "wholeWordSearchLabel": "Correspondência de palavra inteira", + "customPaddingLabel": "Espaçamento extra personalizado", + "convertPDFToImageLabel": "Converter PDF para PDF-imagem" + }, + "tooltip": { + "mode": { + "header": { + "title": "Método de ocultação" + }, + "automatic": { + "title": "Ocultação automática", + "text": "Localiza e oculta automaticamente o texto especificado por todo o documento. Perfeito para remover informações sensíveis consistentes como nomes, endereços ou marcadores de confidencialidade." + }, + "manual": { + "title": "Ocultação manual", + "text": "Clique e arraste para selecionar manualmente áreas específicas para ocultar. Dá controle preciso sobre o que será ocultado. (Em breve)" + } + }, + "words": { + "header": { + "title": "Palavras para ocultar" + }, + "description": { + "title": "Correspondência de texto", + "text": "Digite palavras ou frases para localizar e ocultar em seu documento. Cada palavra será pesquisada separadamente." + }, + "bullet1": "Adicione uma palavra por vez", + "bullet2": "Pressione Enter ou clique em 'Adicionar outra' para incluir", + "bullet3": "Clique em × para remover palavras", + "examples": { + "title": "Exemplos comuns", + "text": "Palavras típicas para ocultar incluem: dados bancários, endereços de e-mail ou nomes específicos." + } + }, + "advanced": { + "header": { + "title": "Configurações avançadas de ocultação" + }, + "color": { + "title": "Cor da caixa e espaçamento", + "text": "Personalize a aparência das caixas de ocultação. Preto é o padrão, mas você pode escolher qualquer cor. O espaçamento adiciona espaço extra ao redor do texto encontrado." + }, + "regex": { + "title": "Usar Regex", + "text": "Ative expressões regulares para correspondência avançada de padrões. Útil para encontrar telefones, e-mails ou padrões complexos.", + "bullet1": "Exemplo: \\d{4}-\\d{2}-\\d{2} para corresponder datas no formato YYYY-MM-DD", + "bullet2": "Use com cautela — teste cuidadosamente" + }, + "wholeWord": { + "title": "Palavra inteira", + "text": "Corresponde apenas palavras completas, não correspondências parciais. 'John' não corresponderá a 'Johnson' quando ativado." + }, + "convert": { + "title": "Converter para PDF-imagem", + "text": "Converte o PDF para um PDF baseado em imagem após a ocultação. Isso garante que o texto atrás das caixas seja completamente removido e irrecuperável." + } } }, "manual": { + "header": "Ocultação manual", + "textBasedRedaction": "Ocultação baseada em texto", + "pageBasedRedaction": "Ocultação baseada em página", + "convertPDFToImageLabel": "Converter PDF para PDF-imagem (usado para remover texto atrás da caixa)", "pageRedactionNumbers": { "title": "Páginas", "placeholder": "(por exemplo 1,2,8 ou 4,7,12-16 ou 2n-1)" }, - "export": "Exportar" + "redactionColor": { + "title": "Cor da ocultação" + }, + "export": "Exportar", + "upload": "Upload", + "boxRedaction": "Ocultação por caixa", + "zoom": "Zoom", + "zoomIn": "Ampliar", + "zoomOut": "Reduzir", + "nextPage": "Próxima página", + "previousPage": "Página anterior", + "toggleSidebar": "Alternar barra lateral", + "showThumbnails": "Mostrar miniaturas", + "showDocumentOutline": "Mostrar estrutura do documento (clique duplo para expandir/recolher todos os itens)", + "showAttachments": "Mostrar anexos", + "showLayers": "Mostrar camadas (clique duplo para restaurar todas as camadas ao padrão)", + "colourPicker": "Seletor de cor", + "findCurrentOutlineItem": "Localizar item atual do sumário", + "applyChanges": "Aplicar alterações" } }, "tableExtraxt": { @@ -1332,6 +2530,7 @@ "tags": "Carimbo,Adicionar imagem,centralizar imagem,Marca d'água,PDF,Incorporar,Personalizar", "header": "Adicionar Carimbo ao PDF", "title": "Adicionar Carimbo ao PDF", + "stampSetup": "Configuração de carimbo", "stampType": "Tipo de carimbo:", "stampText": "Texto do carimbo:", "stampImage": "Imagem do carimbo:", @@ -1344,7 +2543,8 @@ "overrideY": "Substituir coordenada Y:", "customMargin": "Margem personalizada:", "customColor": "Cor de texto personalizada:", - "submit": "Enviar" + "submit": "Enviar", + "noStampSelected": "Nenhum carimbo selecionado. Volte para a Etapa 1." }, "removeImagePdf": { "tags": "Remover imagem,operações de página,back-end,lado do servidor" @@ -1398,31 +2598,15 @@ }, "selectCustomCert": "Arquivo customizado de certificado X.509 (Opcional)" }, - "replace-color": { - "title": "Substitui e Inverte Cores", - "header": "Substitui e Inverte Cores", - "selectText": { - "1": "Substituir ou inverter cores Opções:", - "2": "Padrão (Cores de alto constraste)", - "3": "Customizado (Cores customizadas)", - "4": "Inversão Completa (Inverte todas cores)", - "5": "Opções de cores de alto contraste:", - "6": "Texto branco em um plano de fundo preto", - "7": "Texto preto em um plano de fundo branco", - "8": "Texto amarelo em um plano de fundo preto", - "9": "Texto verde em um plano de fundo preto", - "10": "Escolha a cor do texto:", - "11": "Escolha a cor do plano de fundo:" - }, - "submit": "Substituir" - }, - "replaceColorPdf": { - "tags": "Substitui Cor, Operações na Página, back end, lado do servidor" + "replaceColor": { + "tags": "Substituir cor,Operações de página,Back end,server side" }, "login": { "title": "Iniciar sessão", "header": "Iniciar sessão", "signin": "Iniciar sessão", + "signInWith": "Entrar com", + "signInAnonymously": "Cadastrar-se como convidado", "rememberme": "Lembrar de mim", "invalid": "Usuário ou senha inválidos.", "locked": "Sua conta foi bloqueada.", @@ -1441,12 +2625,70 @@ "alreadyLoggedIn": "Você já está conectado em", "alreadyLoggedIn2": "aparelhos. Por favor saia dos aparelhos e tente novamente.", "toManySessions": "Você tem muitas sessões ativas", - "logoutMessage": "Você foi desconectado." + "logoutMessage": "Você foi desconectado.", + "youAreLoggedIn": "Você está conectado!", + "email": "E-mail", + "password": "Senha", + "enterEmail": "Insira seu e-mail", + "enterPassword": "Insira sua senha", + "loggingIn": "Entrando...", + "signingIn": "Fazendo login...", + "login": "Login", + "or": "Ou", + "useMagicLink": "Usar link mágico", + "enterEmailForMagicLink": "Insira seu e-mail para link mágico", + "sending": "Enviando…", + "sendMagicLink": "Enviar link mágico", + "cancel": "Cancelar", + "dontHaveAccount": "Não tem uma conta? Cadastre-se", + "home": "Início", + "debug": "Depurar", + "signOut": "Sair", + "pleaseEnterBoth": "Insira e-mail e senha", + "pleaseEnterEmail": "Insira seu endereço de e-mail", + "magicLinkSent": "Link mágico enviado para {{email}}! Verifique seu e-mail e clique no link para entrar.", + "passwordResetSent": "Link de redefinição de senha enviado para {{email}}! Verifique seu e-mail e siga as instruções.", + "failedToSignIn": "Falha ao entrar com {{provider}}: {{message}}", + "unexpectedError": "Erro inesperado: {{message}}" + }, + "signup": { + "title": "Criar uma conta", + "subtitle": "Junte-se ao Stirling PDF para começar", + "name": "Nome", + "email": "E-mail", + "password": "Senha", + "confirmPassword": "Confirmar senha", + "enterName": "Insira seu nome", + "enterEmail": "Insira seu e-mail", + "enterPassword": "Insira sua senha", + "confirmPasswordPlaceholder": "Confirmar senha", + "or": "ou", + "creatingAccount": "Criando conta...", + "signUp": "Cadastrar", + "alreadyHaveAccount": "Já tem uma conta? Entre", + "pleaseFillAllFields": "Preencha todos os campos", + "passwordsDoNotMatch": "As senhas não correspondem", + "passwordTooShort": "A senha deve ter pelo menos 6 caracteres", + "invalidEmail": "Insira um endereço de e-mail válido", + "checkEmailConfirmation": "Verifique seu e-mail para um link de confirmação e conclua seu cadastro.", + "accountCreatedSuccessfully": "Conta criada com sucesso! Agora você pode entrar.", + "unexpectedError": "Erro inesperado: {{message}}" }, "pdfToSinglePage": { "title": "PDF para Página Única", "header": "PDF para Página Única", - "submit": "Converter para Página Única" + "submit": "Converter para Página Única", + "description": "Esta ferramenta irá mesclar todas as páginas do seu PDF em uma única página grande. A largura permanecerá a mesma das páginas originais, mas a altura será a soma de todas as alturas.", + "filenamePrefix": "pagina_unica", + "files": { + "placeholder": "Selecione um arquivo PDF na visualização principal para começar" + }, + "error": { + "failed": "Ocorreu um erro ao converter para página única." + }, + "results": { + "title": "Resultados de página única" + } }, "pageExtracter": { "title": "Extrair Página(s)", @@ -1477,11 +2719,39 @@ }, "compress": { "title": "Comprimir", + "desc": "Comprimir PDFs para reduzir o tamanho do arquivo.", "header": "Comprimir", + "method": { + "title": "Método de compressão", + "quality": "Qualidade", + "filesize": "Tamanho do Arquivo" + }, "credit": "Este serviço usa o Qpdf para compressão/otimização de PDF.", "grayscale": { "label": "Aplicar escala de cinza para compressão" }, + "tooltip": { + "header": { + "title": "Visão geral das configurações de compressão" + }, + "description": { + "title": "Descrição", + "text": "A compressão é uma forma fácil de reduzir o tamanho do arquivo. Escolha Tamanho do arquivo para informar um tamanho alvo e deixarmos a qualidade ajustada para você. Escolha Qualidade para definir manualmente a intensidade da compressão." + }, + "qualityAdjustment": { + "title": "Ajuste de qualidade", + "text": "Arraste o controle deslizante para ajustar a intensidade da compressão. Valores menores (1–3) preservam a qualidade, mas resultam em arquivos maiores. Valores maiores (7–9) reduzem mais o arquivo, porém diminuem a clareza das imagens.", + "bullet1": "Valores menores preservam a qualidade", + "bullet2": "Valores maiores reduzem o tamanho do arquivo" + }, + "grayscale": { + "title": "Tons de cinza", + "text": "Selecione esta opção para converter todas as imagens para preto e branco, o que pode reduzir significativamente o tamanho do arquivo, especialmente para PDFs digitalizados ou documentos com muitas imagens." + } + }, + "error": { + "failed": "Ocorreu um erro ao comprimir o PDF." + }, "selectText": { "1": { "_value": "Configurações de Compressão:", @@ -1491,20 +2761,17 @@ "4": "Modo Automático - Ajusta automaticamente a qualidade para atingir o tamanho exato desejado", "5": "Tamanho esperado do PDF (por exemplo, 25 MB, 10,8 MB, 25 KB):" }, - "submit": "Comprimir", - "method": { - "filesize": "Tamanho do Arquivo" - } + "submit": "Comprimir" }, "decrypt": { - "passwordPrompt": "This file is password-protected. Please enter the password:", - "cancelled": "Operation cancelled for PDF: {0}", - "noPassword": "No password provided for encrypted PDF: {0}", - "invalidPassword": "Please try again with the correct password.", - "invalidPasswordHeader": "Incorrect password or unsupported encryption for PDF: {0}", - "unexpectedError": "There was an error processing the file. Please try again.", - "serverError": "Server error while decrypting: {0}", - "success": "File decrypted successfully." + "passwordPrompt": "Este arquivo está protegido por senha. Insira a senha:", + "cancelled": "Operação cancelada para PDF: {0}", + "noPassword": "Nenhuma senha fornecida para PDF criptografado: {0}", + "invalidPassword": "Tente novamente com a senha correta.", + "invalidPasswordHeader": "Senha incorreta ou criptografia não suportada para PDF: {0}", + "unexpectedError": "Houve um erro ao processar o arquivo. Tente novamente.", + "serverError": "Erro do servidor ao descriptografar: {0}", + "success": "Arquivo descriptografado com sucesso." }, "multiTool-advert": { "message": "Esta função também está disponível em Multiferramentas de PDF. Com uma interface mais completa e funções adicionais." @@ -1629,6 +2896,12 @@ }, "note": "Notas de Lançamento estão disponíveis apenas em Inglês" }, + "swagger": { + "title": "Documentação da API", + "header": "Documentação da API", + "desc": "Visualize e teste os endpoints da API do Stirling PDF", + "tags": "api,documentação,swagger,endpoints,desenvolvimento" + }, "cookieBanner": { "popUp": { "title": "Como nós utilizamos Cookies:", @@ -1666,52 +2939,288 @@ } } }, - "download": "Baixar (JSON)", - "undo": "Desfazer", - "convert": { - "title": "Converter", - "settings": "Configurações", - "color": "Cor", - "greyscale": "Escala de Cinza", - "fillPage": "Preencher a página", - "pdfaDigitalSignatureWarning": "O PDF contém uma assinatura digital. Isso será removido na próxima etapa.", - "grayscale": "Escala de Cinza" + "removeMetadata": { + "submit": "Remover metadados" }, - "attachments": { - "tags": "embed,attach,file,attachment,attachments", - "title": "Add attachments", - "header": "Add attachments", - "submit": "Add attachments" + "sidebar": { + "toggle": "Alternar barra lateral" + }, + "theme": { + "toggle": "Alternar tema" + }, + "view": { + "viewer": "Visualizador", + "pageEditor": "Editor de páginas", + "fileManager": "Gerenciador de arquivos" + }, + "pageEditor": { + "title": "Editor de páginas", + "save": "Salvar alterações", + "noPdfLoaded": "Nenhum PDF carregado. Faça upload de um PDF para editar.", + "rotatedLeft": "Giro à esquerda:", + "rotatedRight": "Giro à direita:", + "deleted": "Excluído:", + "movedLeft": "Movido para a esquerda:", + "movedRight": "Movido para a direita:", + "splitAt": "Dividir em:", + "insertedPageBreak": "Quebra de página inserida em:", + "addFileNotImplemented": "Adicionar arquivo não implementado na demonstração", + "closePdf": "Fechar PDF", + "reset": "Redefinir alterações", + "zoomIn": "Ampliar", + "zoomOut": "Reduzir", + "fitToWidth": "Ajustar à largura", + "actualSize": "Tamanho real" + }, + "viewer": { + "firstPage": "Primeira página", + "lastPage": "Última página", + "previousPage": "Página anterior", + "nextPage": "Próxima página", + "zoomIn": "Ampliar", + "zoomOut": "Reduzir", + "singlePageView": "Visualização de página única", + "dualPageView": "Visualização de duas páginas" }, "rightRail": { + "closeSelected": "Fechar arquivos selecionados", "selectAll": "Selecionar Tudo", - "deselectAll": "Desselecionar Tudo" + "deselectAll": "Desselecionar Tudo", + "selectByNumber": "Selecionar por números de página", + "deleteSelected": "Excluir páginas selecionadas", + "closePdf": "Fechar PDF", + "exportAll": "Exportar PDF", + "downloadSelected": "Baixar arquivos selecionados", + "downloadAll": "Baixar tudo", + "toggleTheme": "Alternar tema", + "language": "Idioma", + "search": "Pesquisar PDF", + "panMode": "Modo de panorâmica", + "rotateLeft": "Girar à esquerda", + "rotateRight": "Girar à direita", + "toggleSidebar": "Alternar barra lateral" + }, + "search": { + "title": "Pesquisar PDF", + "placeholder": "Digite o termo de busca..." + }, + "guestBanner": { + "title": "Você está usando o Stirling PDF como convidado!", + "message": "Crie uma conta gratuita para salvar seu trabalho, acessar mais recursos e apoiar o projeto.", + "dismiss": "Dispensar banner", + "signUp": "Inscreva-se grátis" + }, + "toolPicker": { + "searchPlaceholder": "Pesquisar ferramentas...", + "noToolsFound": "Nenhuma ferramenta encontrada", + "allTools": "TODAS AS FERRAMENTAS", + "quickAccess": "ACESSO RÁPIDO", + "categories": { + "standardTools": "Ferramentas padrão", + "advancedTools": "Ferramentas avançadas", + "recommendedTools": "Ferramentas recomendadas" + }, + "subcategories": { + "signing": "Assinatura", + "documentSecurity": "Segurança de documentos", + "verification": "Verificação", + "documentReview": "Revisão de documentos", + "pageFormatting": "Formatação de página", + "extraction": "Extração", + "removal": "Remoção", + "automation": "Automação", + "general": "Geral", + "advancedFormatting": "Formatação avançada", + "developerTools": "Ferramentas de desenvolvedor" + } }, "quickAccess": { - "sign": "Assinar" + "read": "Ler", + "sign": "Assinar", + "automate": "Automatizar", + "files": "Arquivos", + "activity": "Atividade", + "config": "Config", + "allTools": "Todas as ferramentas" }, "fileUpload": { + "selectFile": "Selecionar um arquivo", + "selectFiles": "Selecionar arquivos", + "selectPdfToView": "Selecione um PDF para visualizar", + "selectPdfToEdit": "Selecione um PDF para editar", + "chooseFromStorage": "Escolha um arquivo do armazenamento ou faça upload de um novo PDF", + "chooseFromStorageMultiple": "Escolha arquivos do armazenamento ou faça upload de novos PDFs", + "loadFromStorage": "Carregar do armazenamento", + "filesAvailable": "arquivos disponíveis", "loading": "Carregando...", - "or": "ou" + "or": "ou", + "dropFileHere": "Solte o arquivo aqui ou clique para fazer upload", + "dropFilesHere": "Solte os arquivos aqui ou clique no botão de upload", + "pdfFilesOnly": "Apenas arquivos PDF", + "supportedFileTypes": "Tipos de arquivo suportados", + "upload": "Fazer upload", + "uploadFile": "Fazer upload de arquivo", + "uploadFiles": "Fazer upload de arquivos", + "noFilesInStorage": "Nenhum arquivo disponível no armazenamento. Primeiro faça upload de alguns arquivos.", + "selectFromStorage": "Selecionar do armazenamento", + "backToTools": "Voltar às ferramentas", + "addFiles": "Adicionar arquivos", + "dragFilesInOrClick": "Arraste arquivos ou clique em \"Adicionar arquivos\" para procurar" }, "fileManager": { + "title": "Fazer upload de arquivos PDF", + "subtitle": "Adicione arquivos ao seu armazenamento para fácil acesso entre as ferramentas", + "filesSelected": "arquivos selecionados", + "clearSelection": "Limpar seleção", + "openInFileEditor": "Abrir no editor de arquivos", + "uploadError": "Falha ao fazer upload de alguns arquivos.", + "failedToOpen": "Falha ao abrir o arquivo. Ele pode ter sido removido do armazenamento.", + "failedToLoad": "Falha ao carregar o arquivo para o conjunto ativo.", + "storageCleared": "O navegador limpou o armazenamento. Os arquivos foram removidos. Reenvie-os.", + "clearAll": "Limpar tudo", + "reloadFiles": "Recarregar arquivos", + "dragDrop": "Arraste e solte arquivos aqui", + "clickToUpload": "Clique para fazer upload de arquivos", + "selectedFiles": "Arquivos selecionados", + "storage": "Armazenamento", + "filesStored": "arquivos armazenados", + "storageError": "Ocorreu um erro de armazenamento", + "storageLow": "O armazenamento está acabando. Considere remover arquivos antigos.", + "noFileSelected": "Nenhum arquivo selecionado", + "showHistory": "Mostrar histórico", + "hideHistory": "Ocultar histórico", + "fileHistory": "Histórico de arquivos", + "loadingHistory": "Carregando histórico...", + "lastModified": "Última modificação", + "toolChain": "Ferramentas aplicadas", + "restore": "Restaurar", + "searchFiles": "Pesquisar arquivos...", + "recent": "Recentes", + "localFiles": "Arquivos locais", + "googleDrive": "Google Drive", + "googleDriveShort": "Drive", + "myFiles": "Meus arquivos", + "noRecentFiles": "Nenhum arquivo recente encontrado", + "dropFilesHint": "Solte os arquivos aqui para fazer upload", + "googleDriveNotAvailable": "Integração com Google Drive indisponível", + "openFiles": "Abrir arquivos", + "openFile": "Abrir arquivo", + "details": "Detalhes do arquivo", "fileName": "Nome", + "fileFormat": "Formato", + "fileSize": "Tamanho", "fileVersion": "Versão", + "totalSelected": "Total selecionado", + "dropFilesHere": "Solte os arquivos aqui", "selectAll": "Selecionar Tudo", "deselectAll": "Desselecionar Tudo", "deleteSelected": "Apagar Selecionados", + "downloadSelected": "Baixar selecionados", + "selectedCount": "{{count}} selecionado(s)", "download": "Baixar (JSON)", - "delete": "Apagar" + "delete": "Apagar", + "unsupported": "Não suportado" + }, + "storage": { + "temporaryNotice": "Os arquivos são armazenados temporariamente no seu navegador e podem ser limpos automaticamente", + "storageLimit": "Limite de armazenamento", + "storageUsed": "Armazenamento temporário usado", + "storageFull": "O armazenamento está quase cheio. Considere remover alguns arquivos.", + "fileTooLarge": "Arquivo muito grande. Tamanho máximo por arquivo é", + "storageQuotaExceeded": "Cota de armazenamento excedida. Remova alguns arquivos antes de enviar mais.", + "approximateSize": "Tamanho aproximado" }, "sanitize": { + "title": "Sanitizar", + "desc": "Remova elementos potencialmente nocivos de arquivos PDF.", "submit": "Higienizar", + "completed": "Sanitização concluída com sucesso", + "error.generic": "Falha na sanitização", + "error.failed": "Ocorreu um erro ao sanitizar o PDF.", + "filenamePrefix": "sanitizado", + "sanitizationResults": "Resultados da sanitização", "steps": { - "settings": "Configurações" + "files": "Arquivos", + "settings": "Configurações", + "results": "Resultados" + }, + "files": { + "placeholder": "Selecione um arquivo PDF na visualização principal para começar" + }, + "options": { + "title": "Opções de sanitização", + "note": "Selecione os elementos que deseja remover do PDF. Pelo menos uma opção deve ser selecionada.", + "removeJavaScript.desc": "Remover ações e scripts JavaScript do PDF", + "removeEmbeddedFiles.desc": "Remover quaisquer arquivos incorporados no PDF", + "removeXMPMetadata.desc": "Remover metadados XMP do PDF", + "removeMetadata.desc": "Remover metadados de informações do documento (título, autor etc.)", + "removeLinks.desc": "Remover links externos e ações de lançamento do PDF", + "removeFonts.desc": "Remover fontes incorporadas do PDF" + } + }, + "addPassword": { + "title": "Proteger PDF", + "desc": "Criptografe seu documento PDF com uma senha.", + "completed": "Proteção por senha aplicada", + "submit": "Criptografar", + "filenamePrefix": "criptografado", + "error": { + "failed": "Ocorreu um erro ao criptografar o PDF." + }, + "passwords": { + "stepTitle": "Senhas e criptografia", + "completed": "Senhas configuradas", + "user": { + "label": "Senha do usuário", + "placeholder": "Insira a senha do usuário" + }, + "owner": { + "label": "Senha do proprietário", + "placeholder": "Insira a senha do proprietário" + } + }, + "encryption": { + "keyLength": { + "label": "Tamanho da chave de criptografia", + "40bit": "40 bits (Baixo)", + "128bit": "128 bits (Padrão)", + "256bit": "256 bits (Alto)" + } + }, + "results": { + "title": "PDFs criptografados" + }, + "tooltip": { + "header": { + "title": "Visão geral da proteção por senha" + }, + "passwords": { + "title": "Tipos de senha", + "text": "A senha do usuário restringe a abertura do documento, enquanto a senha do proprietário controla o que pode ser feito com o documento após aberto. Você pode definir ambas ou apenas uma.", + "bullet1": "Senha do usuário: Necessária para abrir o PDF", + "bullet2": "Senha do proprietário: Controla as permissões do documento (não suportado por todos os visualizadores de PDF)" + }, + "encryption": { + "title": "Níveis de criptografia", + "text": "Níveis mais altos de criptografia oferecem melhor segurança, mas podem não ser compatíveis com visualizadores de PDF mais antigos.", + "bullet1": "40 bits: Segurança básica, compatível com leitores antigos", + "bullet2": "128 bits: Segurança padrão, amplamente suportada", + "bullet3": "256 bits: Segurança máxima, requer leitores modernos" + }, + "permissions": { + "title": "Alterar Permissões", + "text": "Essas permissões controlam o que os usuários podem fazer com o PDF. São mais eficazes quando combinadas com uma senha de proprietário." + } } }, "changePermissions": { "title": "Alterar Permissões", + "desc": "Altere as restrições e permissões do documento.", + "completed": "Permissões alteradas", "submit": "Alterar Permissões", + "error": { + "failed": "Ocorreu um erro ao alterar as permissões do PDF." + }, "permissions": { "preventAssembly": { "label": "Impedir montagem do documento." @@ -1738,10 +3247,195 @@ "label": "Impedir impressão de formatos diferentes." } }, + "results": { + "title": "PDFs modificados" + }, "tooltip": { "header": { "title": "Alterar Permissões" + }, + "description": { + "text": "Altera as permissões do documento, permitindo/bloqueando o acesso a diferentes recursos nos leitores de PDF." + }, + "warning": { + "text": "Para tornar essas permissões imutáveis, use a ferramenta Adicionar senha para definir uma senha de proprietário." } } - } + }, + "removePassword": { + "title": "Desproteger PDF", + "desc": "Descriptografar o PDF realizando a remoção da senha.", + "tags": "seguro, descriptografar, segurança, remover senha", + "password": { + "stepTitle": "Desproteger PDF", + "label": "Senha Atual", + "placeholder": "Insira a senha atual", + "completed": "Senha configurada" + }, + "filenamePrefix": "descriptografado", + "error": { + "failed": "Ocorreu um erro ao remover a senha do PDF." + }, + "tooltip": { + "description": "Remover a proteção por senha requer a senha usada para criptografar o PDF. Isso irá descriptografar o documento, tornando-o acessível sem senha." + }, + "submit": "Descriptografar", + "results": { + "title": "PDFs descriptografados" + } + }, + "automate": { + "title": "Automatizar", + "desc": "Crie fluxos de trabalho de várias etapas encadeando ações de PDF. Ideal para tarefas recorrentes.", + "invalidStep": "Etapa inválida", + "files": { + "placeholder": "Selecione arquivos para processar com esta automação" + }, + "selection": { + "title": "Seleção de automação", + "saved": { + "title": "Salvos" + }, + "createNew": { + "title": "Criar nova automação" + }, + "suggested": { + "title": "Sugeridos" + } + }, + "creation": { + "createTitle": "Criar automação", + "editTitle": "Editar automação", + "intro": "As automações executam ferramentas sequencialmente. Para começar, adicione as ferramentas na ordem em que deseja executá-las.", + "name": { + "label": "Nome da automação", + "placeholder": "Minha automação" + }, + "description": { + "label": "Descrição (opcional)", + "placeholder": "Descreva o que esta automação faz..." + }, + "tools": { + "selectTool": "Selecionar uma ferramenta...", + "selected": "Ferramentas selecionadas", + "remove": "Remover ferramenta", + "configure": "Configurar ferramenta", + "notConfigured": "! Não configurado", + "addTool": "Adicionar ferramenta", + "add": "Adicionar uma ferramenta..." + }, + "save": "Salvar automação", + "unsavedChanges": { + "title": "Alterações não salvas", + "message": "Você tem alterações não salvas. Tem certeza de que deseja voltar? Todas as alterações serão perdidas.", + "cancel": "Cancelar", + "confirm": "Voltar" + }, + "icon": { + "label": "Ícone" + } + }, + "run": { + "title": "Executar automação" + }, + "sequence": { + "unnamed": "Automação sem nome", + "steps": "{{count}} etapas", + "running": "Executando automação...", + "run": "Executar automação", + "finish": "Concluir" + }, + "reviewTitle": "Resultados da automação", + "config": { + "loading": "Carregando configuração da ferramenta...", + "noSettings": "Esta ferramenta não possui configurações.", + "title": "Configurar {{toolName}}", + "description": "Configure as configurações desta ferramenta. Essas configurações serão aplicadas quando a automação for executada.", + "cancel": "Cancelar", + "save": "Salvar configuração" + }, + "copyToSaved": "Copiar para Salvos" + }, + "automation": { + "suggested": { + "securePdfIngestion": "Ingestão segura de PDF", + "securePdfIngestionDesc": "Fluxo de processamento de PDF abrangente que higieniza documentos, aplica OCR com limpeza, converte para o formato PDF/A para arquivamento de longo prazo e otimiza o tamanho do arquivo.", + "emailPreparation": "Preparação para e-mail", + "emailPreparationDesc": "Otimiza PDFs para distribuição por e-mail comprimindo arquivos, dividindo documentos grandes em partes de 20MB para compatibilidade com e-mail e removendo metadados para privacidade.", + "secureWorkflow": "Fluxo de segurança", + "secureWorkflowDesc": "Protege documentos PDF removendo conteúdo potencialmente malicioso, como JavaScript e arquivos incorporados, e adiciona proteção por senha para evitar acesso não autorizado. A senha padrão é 'password'.", + "processImages": "Processar imagens", + "processImagesDesc": "Converte vários arquivos de imagem em um único documento PDF e, em seguida, aplica tecnologia de OCR para extrair texto pesquisável das imagens." + } + }, + "common": { + "copy": "Copiar", + "copied": "Copiado!", + "refresh": "Atualizar", + "retry": "Tentar novamente", + "remaining": "restante", + "used": "usado", + "available": "disponível", + "cancel": "Cancelar" + }, + "config": { + "account": { + "overview": { + "title": "Configurações da conta", + "manageAccountPreferences": "Gerencie as preferências da sua conta", + "guestDescription": "Você entrou como convidado. Considere atualizar sua conta acima." + }, + "upgrade": { + "title": "Atualizar conta de convidado", + "description": "Vincule sua conta para preservar seu histórico e acessar mais recursos!", + "socialLogin": "Atualizar com conta social", + "linkWith": "Vincular com", + "emailPassword": "ou insira seu e-mail e senha", + "email": "E-mail", + "emailPlaceholder": "Insira seu e-mail", + "password": "Senha (opcional)", + "passwordPlaceholder": "Defina uma senha", + "passwordNote": "Deixe em branco para usar apenas verificação por e-mail", + "upgradeButton": "Atualizar conta" + } + }, + "apiKeys": { + "description": "Sua chave de API para acessar a suíte de ferramentas de PDF do Stirling. Copie-a para seu projeto ou atualize para gerar uma nova.", + "publicKeyAriaLabel": "Chave pública de API", + "copyKeyAriaLabel": "Copiar chave de API", + "refreshAriaLabel": "Atualizar chave de API", + "includedCredits": "Créditos incluídos", + "purchasedCredits": "Créditos comprados", + "totalCredits": "Créditos totais", + "chartAriaLabel": "Uso de créditos: incluídos {{includedUsed}} de {{includedTotal}}, comprados {{purchasedUsed}} de {{purchasedTotal}}", + "nextReset": "Próxima redefinição", + "lastApiUse": "Último uso da API", + "overlayMessage": "Gere uma chave para ver os créditos e os créditos disponíveis", + "label": "Chave de API", + "guestInfo": "Usuários convidados não recebem chaves de API. Crie uma conta para obter uma chave de API que você possa usar em suas aplicações.", + "goToAccount": "Ir para a conta", + "refreshModal": { + "title": "Atualizar chaves de API", + "warning": "⚠️ Aviso: Esta ação gerará novas chaves de API e tornará suas chaves anteriores inválidas.", + "impact": "Quaisquer aplicativos ou serviços que estejam usando essas chaves deixarão de funcionar até que você os atualize com as novas chaves.", + "confirmPrompt": "Tem certeza de que deseja continuar?", + "confirmCta": "Atualizar chaves" + }, + "generateError": "Não conseguimos gerar sua chave de API." + } + }, + "AddAttachmentsRequest": { + "attachments": "Selecionar anexos", + "info": "Selecione arquivos para anexar ao seu PDF. Esses arquivos serão incorporados e acessíveis pelo painel de anexos do PDF.", + "selectFiles": "Selecionar arquivos para anexar", + "placeholder": "Escolha arquivos...", + "addMoreFiles": "Adicionar mais arquivos...", + "selectedFiles": "Arquivos selecionados", + "submit": "Adicionar anexos", + "results": { + "title": "Resultados dos anexos" + } + }, + "termsAndConditions": "Termos e Condições", + "logOut": "Sair" } \ No newline at end of file diff --git a/frontend/public/locales/ru-RU/translation.json b/frontend/public/locales/ru-RU/translation.json index e365371c1..bf27a8a05 100644 --- a/frontend/public/locales/ru-RU/translation.json +++ b/frontend/public/locales/ru-RU/translation.json @@ -1,4 +1,10 @@ { + "unsavedChanges": "У вас есть несохранённые изменения в вашем PDF. Что вы хотите сделать?", + "unsavedChangesTitle": "Несохранённые изменения", + "keepWorking": "Продолжить работу", + "discardChanges": "Отменить изменения", + "applyAndContinue": "Применить и продолжить", + "exportAndContinue": "Экспорт и продолжить", "language": { "direction": "ltr" }, @@ -35,10 +41,28 @@ "true": "Да", "false": "Нет", "unknown": "Неизвестно", + "app": { + "description": "Бесплатная альтернатива Adobe Acrobat (10M+ загрузок)" + }, "save": "Сохранить", "saveToBrowser": "Сохранить в браузере", + "download": "Скачать", + "undoOperationTooltip": "Нажмите, чтобы отменить последнюю операцию и восстановить исходные файлы", + "undo": "Отменить", + "moreOptions": "Больше параметров", + "editYourNewFiles": "Отредактируйте ваши новые файлы", "close": "Закрыть", + "fileSelected": "Выбрано: {{filename}}", + "chooseFile": "Выбрать файл", "filesSelected": "файлов выбрано", + "files": { + "title": "Файлы", + "upload": "Загрузка", + "uploadFiles": "Загрузить файлы", + "addFiles": "Добавить файлы", + "selectFromWorkbench": "Выберите файлы из рабочей области или ", + "selectMultipleFromWorkbench": "Выберите не менее {{count}} файлов из рабочей области или " + }, "noFavourites": "Нет избранного", "downloadComplete": "Загрузка завершена", "bored": "Скучно ждать?", @@ -56,7 +80,10 @@ }, "error": { "pdfPassword": "PDF-документ защищен паролем, и пароль не был предоставлен или был неверным", + "encryptedPdfMustRemovePassword": "Этот PDF зашифрован или защищён паролем. Пожалуйста, разблокируйте его перед преобразованием в PDF/A.", + "incorrectPasswordProvided": "Пароль к PDF неверен или не указан.", "_value": "Ошибка", + "dismissAllErrors": "Скрыть все ошибки", "sorry": "Извините за неполадки!", "needHelp": "Нужна помощь / Нашли проблему?", "contactTip": "Если у вас все еще есть проблемы, не стесняйтесь обращаться к нам за помощью. Вы можете отправить тикет на нашей странице GitHub или связаться с нами через Discord:", @@ -71,6 +98,10 @@ "githubSubmit": "GitHub - Отправить тикет", "discordSubmit": "Discord - Отправить запрос в поддержку" }, + "warning": { + "tooltipTitle": "Предупреждение" + }, + "edit": "Редактировать", "delete": "Удалить", "username": "Имя пользователя", "password": "Пароль", @@ -82,6 +113,7 @@ "green": "Зеленый", "blue": "Синий", "custom": "Пользовательский...", + "comingSoon": "Скоро", "WorkInProgess": "В разработке, возможны ошибки и сбои, пожалуйста, сообщайте о любых проблемах!", "poweredBy": "Работает на", "yes": "Да", @@ -115,12 +147,14 @@ "page": "Страница", "pages": "Страницы", "loading": "Загрузка...", + "review": "Рецензирование", "addToDoc": "Добавить в документ", "reset": "Сбросить", "apply": "Применить", "noFileSelected": "Файл не выбран. Пожалуйста, загрузите его.", "legal": { "privacy": "Политика конфиденциальности", + "iAgreeToThe": "Я согласен(на) со всеми", "terms": "Условия использования", "accessibility": "Доступность", "cookie": "Политика использования файлов cookie", @@ -332,291 +366,305 @@ "globalPopularity": "Популярности", "sortBy": "Сортировать по:", "multiTool": { + "tags": "несколько,инструменты", "title": "Мультиинструмент PDF", "desc": "Объединение, поворот, переупорядочивание и удаление страниц" }, "merge": { + "tags": "объединить,соединить,слить", "title": "Объединить", "desc": "Легко объединяйте несколько PDF-файлов в один." }, "split": { + "tags": "разделить,отделить,разбить", "title": "Разделить", "desc": "Разделить PDF на несколько документов" }, "rotate": { + "tags": "повернуть,перевернуть,ориентировать", "title": "Повернуть", "desc": "Легко поворачивайте ваши PDF-файлы." }, - "imageToPDF": { - "title": "Изображение в PDF", - "desc": "Преобразование изображения (PNG, JPEG, GIF) в PDF." - }, - "pdfToImage": { - "title": "PDF в изображение", - "desc": "Преобразование PDF в изображение (PNG, JPEG, GIF)." + "convert": { + "tags": "трансформировать,изменить", + "title": "Преобразовать", + "desc": "Преобразование файлов между разными форматами" }, "pdfOrganiser": { + "tags": "организовать,переставить,переупорядочить", "title": "Организация", "desc": "Удаление/переупорядочивание страниц в любом порядке" }, "addImage": { + "tags": "вставить,встроить,разместить", "title": "Добавить изображение", "desc": "Добавляет изображение в указанное место PDF" }, + "addAttachments": { + "tags": "встроить,прикрепить,включить", + "title": "Добавить вложения", + "desc": "Добавляйте или удаляйте встроенные файлы (вложения) в PDF" + }, "watermark": { + "tags": "штамп,метка,оверлей", "title": "Добавить водяной знак", "desc": "Добавьте собственный водяной знак в ваш PDF-документ." }, - "permissions": { - "title": "Изменить разрешения", - "desc": "Измените разрешения вашего PDF-документа" + "removePassword": { + "tags": "разблокировать", + "title": "Удалить пароль", + "desc": "Удалите защиту паролем из вашего PDF-документа." }, - "pageRemover": { + "compress": { + "tags": "сжать,уменьшить,оптимизировать", + "title": "Сжать", + "desc": "Сжимайте PDF-файлы для уменьшения их размера." + }, + "unlockPDFForms": { + "tags": "разблокировать,включить,редактировать", + "title": "Разблокировать PDF-формы", + "desc": "Удалите свойство 'только для чтения' для полей формы в PDF-документа." + }, + "changeMetadata": { + "tags": "редактировать,изменить,обновить", + "title": "Изменить метаданные", + "desc": "Изменить/удалить/добавить метаданные из PDF-документа" + }, + "ocr": { + "tags": "извлечь,скан", + "title": "OCR / Очистка сканов", + "desc": "Очистка сканов и распознавание текста с изображений в PDF с последующим добавлением его как текст." + }, + "extractImages": { + "tags": "извлечь,сохранить,экспорт", + "title": "Извлечь изображения", + "desc": "Извлекает все изображения из PDF и сохраняет их в zip-архив" + }, + "scannerImageSplit": { + "tags": "обнаружить,разделить,фото", + "title": "Обнаружить и разделить отсканированные фото", + "desc": "Обнаружение и разбиение отсканированных фотографий на отдельные страницы" + }, + "sign": { + "tags": "подпись,автограф", + "title": "Подпись", + "desc": "Добавляет подпись в PDF рисованием, текстом или изображением" + }, + "flatten": { + "tags": "упростить,удалить,интерактив", + "title": "Сведение", + "desc": "Удаляет все интерактивные элементы и формы из PDF" + }, + "certSign": { + "tags": "аутентификация,PEM,P12,официально,шифрование,подпись,сертификат,PKCS12,JKS,сервер,вручную,авто", + "title": "Подписать сертификатом", + "desc": "Подписывает PDF сертификатом/ключом (PEM/P12)" + }, + "repair": { + "tags": "исправить,восстановить", + "title": "Восстановление", + "desc": "Пытается восстановить поврежденный/сломанный PDF" + }, + "removeBlanks": { + "tags": "удалить,очистить,пустые", + "title": "Удалить пустые страницы", + "desc": "Обнаруживает и удаляет пустые страницы из документа" + }, + "removeAnnotations": { + "tags": "удалить,очистить,убрать", + "title": "Удалить аннотации", + "desc": "Удаляет все комментарии/аннотации из PDF" + }, + "compare": { + "tags": "разница", + "title": "Сравнить", + "desc": "Сравнивает и показывает различия между 2 PDF-документами" + }, + "removeCertSign": { + "tags": "удалить,удалить,разблокировать", + "title": "Удалить сертификат подписи", + "desc": "Удаляет сертификат подписи из PDF" + }, + "pageLayout": { + "tags": "макет,расположение,комбинировать", + "title": "Многостраничная компоновка", + "desc": "Объединяет несколько страниц PDF-документа в одну страницу" + }, + "bookletImposition": { + "tags": "буклет,печать,переплёт", + "title": "Импозиция буклета", + "desc": "Создание буклетов с корректным порядком страниц и многополосной раскладкой для печати и переплёта" + }, + "scalePages": { + "tags": "изменить размер,подогнать,масштаб", + "title": "Настроить размер/масштаб страницы", + "desc": "Изменить размер/масштаб страницы и/или её содержимого." + }, + "addPageNumbers": { + "tags": "нумерация,пагинация,подсчёт", + "title": "Добавить нумерацию страниц", + "desc": "Добавить номера страниц по всему документу в указанном месте" + }, + "autoRename": { + "tags": "автообнаружение,заголовок,организация,переименование", + "title": "Автопереименование PDF", + "desc": "Автоматически переименовывает PDF по обнаруженному заголовку" + }, + "adjustContrast": { + "tags": "контраст,яркость,насыщенность", + "title": "Настройка цветов/контраста", + "desc": "Настройка контраста, насыщенности и яркости PDF" + }, + "crop": { + "tags": "обрезать,вырезать,изменить размер", + "title": "Обрезать PDF", + "desc": "Обрезать PDF для уменьшения его размера (сохраняет текст!)" + }, + "autoSplitPDF": { + "tags": "авто,разделить,QR", + "title": "Авторазделение страниц", + "desc": "Автоматическое разделение сканированного PDF с физическим разделителем страниц по QR-коду" + }, + "sanitize": { + "tags": "очистить,удалить,убрать", + "title": "Санитизация", + "desc": "Удаление потенциально вредных элементов из PDF-файлов" + }, + "getPdfInfo": { + "tags": "инфо,метаданные,подробности", + "title": "Получить ВСЮ информацию о PDF", + "desc": "Собирает всю возможную информацию о PDF" + }, + "pdfToSinglePage": { + "tags": "объединить,слияние,единая", + "title": "Одна большая страница", + "desc": "Объединяет все страницы PDF в одну большую страницу" + }, + "showJS": { + "tags": "javascript,код,скрипт", + "title": "Показать Javascript", + "desc": "Ищет и отображает любой JS, внедрённый в PDF" + }, + "redact": { + "tags": "цензура,зачернить,скрыть", + "title": "Ручное редактирование", + "desc": "Редактирует PDF на основе выбранного текста, нарисованных форм и/или выбранных страниц" + }, + "overlayPdfs": { + "tags": "оверлей,объединить,сложить", + "title": "Наложить PDF", + "desc": "Наложение одного PDF поверх другого" + }, + "splitBySections": { + "tags": "разделить,секции,делить", + "title": "Разделить PDF по секциям", + "desc": "Разделяйте каждую страницу PDF на меньшие горизонтальные и вертикальные секции" + }, + "addStamp": { + "tags": "штамп,метка,печать", + "title": "Добавить штамп в PDF", + "desc": "Добавляйте текстовые или графические штампы в заданных местах" + }, + "removeImage": { + "tags": "удалить,очистить,убрать", + "title": "Удалить изображение", + "desc": "Удаляет изображения из PDF для уменьшения размера файла" + }, + "splitByChapters": { + "tags": "разделить,главы,структура", + "title": "Разделить PDF по главам", + "desc": "Разделяет PDF на несколько файлов на основе структуры его глав" + }, + "validateSignature": { + "tags": "проверить,верификация,сертификат", + "title": "Проверка подписи PDF", + "desc": "Проверка цифровых подписей и сертификатов в PDF-документах" + }, + "swagger": { + "tags": "API,документация,тест", + "title": "Документация API", + "desc": "Просмотр документации API и тестирование эндпоинтов" + }, + "scannerEffect": { + "tags": "сканировать,симулировать,создать", + "title": "Эффект сканера", + "desc": "Создайте PDF, который выглядит как отсканированный" + }, + "editTableOfContents": { + "tags": "закладки,содержание,редактировать", + "title": "Редактир оглавления", + "desc": "Добавление или редактирование закладок и оглавления в PDF-документах" + }, + "manageCertificates": { + "tags": "сертификаты,импорт,экспорт", + "title": "Управление сертификатами", + "desc": "Импорт, экспорт или удаление файлов цифровых сертификатов, используемых для подписания PDF." + }, + "read": { + "tags": "просмотр,открыть,показ", + "title": "Чтение", + "desc": "Просмотр и аннотация PDF. Подсвечивайте текст, рисуйте или добавляйте комментарии для рецензии и совместной работы." + }, + "reorganizePages": { + "tags": "переупорядочить,переставить,организовать", + "title": "Переупорядочить страницы", + "desc": "Переупорядочивайте, дублируйте или удаляйте страницы PDF с визуальным перетаскиванием." + }, + "extractPages": { + "tags": "извлечь,выбрать,скопировать", + "title": "Извлечь страницы", + "desc": "Извлечение определённых страниц из PDF-документа" + }, + "removePages": { + "tags": "удалить,извлечь,исключить", "title": "Удалить", "desc": "Удалите ненужные страницы из вашего PDF-документа." }, + "autoSizeSplitPDF": { + "tags": "авто,разделить,размер", + "title": "Авторазделение по размеру/количеству", + "desc": "Разделяет один PDF на несколько документов на основе размера, количества страниц или количества документов" + }, + "replaceColor": { + "title": "Заменить и инвертировать цвет", + "desc": "Заменяйте или инвертируйте цвета в PDF-документах" + }, + "devApi": { + "tags": "API,разработка,документация", + "title": "API", + "desc": "Ссылка на документацию по API" + }, + "devFolderScanning": { + "tags": "автоматизация,папка,сканирование", + "title": "Автосканирование папок", + "desc": "Ссылка на руководство по автоматическому сканированию папок" + }, + "devSsoGuide": { + "title": "Руководство по SSO", + "desc": "Ссылка на руководство по SSO" + }, + "devAirgapped": { + "title": "Изолированная установка", + "desc": "Ссылка на руководство по изолированной установке" + }, "addPassword": { "title": "Добавить пароль", "desc": "Зашифруйте ваш PDF-документ паролем." }, - "removePassword": { - "title": "Удалить пароль", - "desc": "Удалите защиту паролем из вашего PDF-документа." - }, - "compress": { - "title": "Сжать", - "desc": "Сжимайте PDF-файлы для уменьшения их размера." - }, - "unlockPDFForms": { - "title": "Разблокировать PDF-формы", - "desc": "Удалите свойство 'только для чтения' для полей формы в PDF-документа." - }, - "changeMetadata": { - "title": "Изменить метаданные", - "desc": "Изменить/удалить/добавить метаданные из PDF-документа" - }, - "fileToPDF": { - "title": "Файл в PDF", - "desc": "Преобразуйте практически любой файл в PDF (DOCX, PNG, XLS, PPT, TXT и другие)" - }, - "ocr": { - "title": "OCR / Очистка сканов", - "desc": "Очистка сканов и распознавание текста с изображений в PDF с последующим добавлением его как текст." - }, - "extractImages": { - "title": "Извлечь изображения", - "desc": "Извлекает все изображения из PDF и сохраняет их в zip-архив" - }, - "pdfToPDFA": { - "title": "PDF в PDF/A", - "desc": "Преобразование PDF в PDF/A для долгосрочного хранения" - }, - "PDFToWord": { - "title": "PDF в Word", - "desc": "Преобразование PDF в форматы Word (DOC, DOCX и ODT)" - }, - "PDFToPresentation": { - "title": "PDF в презентацию", - "desc": "Преобразование PDF в форматы презентаций (PPT, PPTX и ODP)" - }, - "PDFToText": { - "title": "PDF в RTF (текст)", - "desc": "Преобразование PDF в текстовый или RTF формат" - }, - "PDFToHTML": { - "title": "PDF в HTML", - "desc": "Преобразование PDF в формат HTML" - }, - "PDFToXML": { - "title": "PDF в XML", - "desc": "Преобразование PDF в формат XML" - }, - "ScannerImageSplit": { - "title": "Обнаружение/разделение сканированных фото", - "desc": "Разделяет несколько фотографий внутри фото/PDF" - }, - "sign": { - "title": "Подпись", - "desc": "Добавляет подпись в PDF рисованием, текстом или изображением" - }, - "flatten": { - "title": "Сведение", - "desc": "Удаляет все интерактивные элементы и формы из PDF" - }, - "repair": { - "title": "Восстановление", - "desc": "Пытается восстановить поврежденный/сломанный PDF" - }, - "removeBlanks": { - "title": "Удалить пустые страницы", - "desc": "Обнаруживает и удаляет пустые страницы из документа" - }, - "removeAnnotations": { - "title": "Удалить аннотации", - "desc": "Удаляет все комментарии/аннотации из PDF" - }, - "compare": { - "title": "Сравнить", - "desc": "Сравнивает и показывает различия между 2 PDF-документами" - }, - "certSign": { - "title": "Подписать сертификатом", - "desc": "Подписывает PDF сертификатом/ключом (PEM/P12)" - }, - "removeCertSign": { - "title": "Удалить сертификат подписи", - "desc": "Удаляет сертификат подписи из PDF" - }, - "pageLayout": { - "title": "Многостраничная компоновка", - "desc": "Объединяет несколько страниц PDF-документа в одну страницу" - }, - "scalePages": { - "title": "Настроить размер/масштаб страницы", - "desc": "Изменить размер/масштаб страницы и/или её содержимого." - }, - "pipeline": { - "title": "Конвейер", - "desc": "Выполняйте несколько действий с PDF, определяя сценарии конвейера" - }, - "addPageNumbers": { - "title": "Добавить нумерацию страниц", - "desc": "Добавить номера страниц по всему документу в указанном месте" - }, - "auto-rename": { - "title": "Автопереименование PDF-файла", - "desc": "Автоматически переименовывает PDF-файл на основе обнаруженного заголовка" - }, - "adjustContrast": { - "title": "Настройка цветов/контраста", - "desc": "Настройка контраста, насыщенности и яркости PDF" - }, - "crop": { - "title": "Обрезать PDF", - "desc": "Обрезать PDF для уменьшения его размера (сохраняет текст!)" - }, - "autoSplitPDF": { - "title": "Авторазделение страниц", - "desc": "Автоматическое разделение сканированного PDF с физическим разделителем страниц по QR-коду" - }, - "sanitizePDF": { - "title": "Очистка", - "desc": "Удаление скриптов и других элементов из PDF-файлов" - }, - "URLToPDF": { - "title": "URL/веб-сайт в PDF", - "desc": "Преобразует любой http(s)URL в PDF" - }, - "HTMLToPDF": { - "title": "HTML в PDF", - "desc": "Преобразует любой HTML-файл или zip в PDF" - }, - "MarkdownToPDF": { - "title": "Markdown в PDF", - "desc": "Преобразует любой файл Markdown в PDF" - }, - "PDFToMarkdown": { - "title": "PDF to Markdown", - "desc": "Converts any PDF to Markdown" - }, - "getPdfInfo": { - "title": "Получить ВСЮ информацию о PDF", - "desc": "Собирает всю возможную информацию о PDF" - }, - "pageExtracter": { - "title": "Извлечь страницу(ы)", - "desc": "Извлекает выбранные страницы из PDF" - }, - "pdfToSinglePage": { - "title": "Одна большая страница", - "desc": "Объединяет все страницы PDF в одну большую страницу" - }, - "showJS": { - "title": "Показать Javascript", - "desc": "Ищет и отображает любой JS, внедрённый в PDF" - }, - "autoRedact": { - "title": "Автоматическое редактирование", - "desc": "Автоматически закрашивает (чернит) текст в PDF на основе входного текста" - }, - "redact": { - "title": "Ручное редактирование", - "desc": "Редактирует PDF на основе выбранного текста, нарисованных форм и/или выбранных страниц" - }, - "PDFToCSV": { - "title": "PDF в CSV", - "desc": "Извлекает таблицы из PDF с преобразованием в CSV" - }, - "split-by-size-or-count": { - "title": "Авторазделение по размеру/количеству", - "desc": "Разделяет один PDF на несколько документов на основе размера, количества страниц или количества документов" - }, - "overlay-pdfs": { - "title": "Наложение PDF", - "desc": "Накладывает PDF поверх другого PDF" - }, - "split-by-sections": { - "title": "Разделить PDF по секциям", - "desc": "Разделяет каждую страницу PDF на меньшие горизонтальные и вертикальные секции" - }, - "AddStampRequest": { - "title": "Добавить штамп в PDF", - "desc": "Добавляет текстовые или графические штампы в указанных местах" - }, - "removeImage": { - "title": "Удалить изображение", - "desc": "Удаляет изображения из PDF для уменьшения размера файла" - }, - "splitByChapters": { - "title": "Разделить PDF по главам", - "desc": "Разделяет PDF на несколько файлов на основе структуры его глав" - }, - "validateSignature": { - "title": "Проверка подписи PDF", - "desc": "Проверка цифровых подписей и сертификатов в PDF-документах" - }, - "replace-color": { - "title": "Замена и инверсия цвета", - "desc": "Заменяет цвет текста и фона в PDF и инвертирует все цвета PDF для уменьшения размера файла" - }, - "convert": { - "title": "Преобразовать" - }, - "attachments": { - "title": "Добавлять вложения", - "desc": "Добавление или удаление встроенных файлов (вложений) в PDF-файл или из него" - }, - "editTableOfContents": { - "title": "Редактир оглавления", - "desc": "Добавление или редактирование закладок и оглавления в PDF-документах" - }, - "extractPages": { - "title": "Извлечь страницы" - }, - "removePages": { - "title": "Удалить", - "desc": "Удалите ненужные страницы из вашего PDF-документа." - }, - "removeImagePdf": { - "title": "Удалить изображение", - "desc": "Удаляет изображения из PDF для уменьшения размера файла" - }, - "autoSizeSplitPDF": { - "title": "Авторазделение по размеру/количеству", - "desc": "Разделяет один PDF на несколько документов на основе размера, количества страниц или количества документов" - }, - "adjust-contrast": { - "title": "Настройка цветов/контраста", - "desc": "Настройка контраста, насыщенности и яркости PDF" - }, - "replaceColorPdf": { - "title": "Замена и инверсия цвета", - "desc": "Заменяет цвет текста и фона в PDF и инвертирует все цвета PDF для уменьшения размера файла" - }, "changePermissions": { - "title": "Изменить разрешения" + "title": "Изменить разрешения", + "desc": "Изменение ограничений и разрешений документа" + }, + "automate": { + "tags": "рабочий процесс,последовательность,автоматизация", + "title": "Автоматизация", + "desc": "Создавайте многошаговые процессы, связывая PDF-действия. Идеально для повторяющихся задач." } }, + "landing": { + "addFiles": "Добавить файлы", + "uploadFromComputer": "Загрузить с компьютера" + }, "viewPdf": { "tags": "просмотр,чтение,аннотации,текст,изображение", "title": "Смотреть/Редактировать PDF", @@ -650,17 +698,29 @@ "merge": { "tags": "объединение,операции со страницами,серверная часть", "title": "Объединить", - "header": "Объединение нескольких PDF (2+)", - "sortByName": "Сортировать по имени", - "sortByDate": "Сортировать по дате", - "removeCertSign": "Удалить цифровую подпись в объединенном файле?", + "removeDigitalSignature.tooltip": { + "title": "Удалить цифровую подпись", + "description": "Цифровые подписи становятся недействительными при объединении. Отметьте, чтобы удалить их из итогового PDF." + }, + "generateTableOfContents.tooltip": { + "title": "Сгенерировать оглавление", + "description": "Автоматически создаёт кликабельное оглавление в объединённом PDF на основе исходных имён файлов и номеров страниц." + }, "submit": "Объединить", "sortBy": { - "filename": "Имя файла" + "description": "Файлы будут объединены в порядке их выбора. Перетаскивайте для изменения порядка или отсортируйте ниже.", + "label": "Сортировать по", + "filename": "Имя файла", + "dateModified": "Дата изменения", + "ascending": "По возрастанию", + "descending": "По убыванию", + "sort": "Сортировать" + }, + "error": { + "failed": "Произошла ошибка при объединении PDF." } }, "split": { - "tags": "операции со страницами,разделение,многостраничный,вырезание,серверная часть", "title": "Разделить PDF", "header": "Разделить PDF", "desc": { @@ -676,25 +736,206 @@ "splitPages": "Введите страницы для разделения:", "submit": "Разделить", "steps": { + "chooseMethod": "Выбрать метод", "settings": "Настройки" }, + "settings": { + "selectMethodFirst": "Сначала выберите метод разделения" + }, + "error": { + "failed": "Произошла ошибка при разделении PDF." + }, + "method": { + "label": "Выберите метод разделения", + "placeholder": "Выберите способ разделения PDF" + }, "methods": { + "prefix": { + "splitAt": "Разделить на", + "splitBy": "Разделить по" + }, + "byPages": { + "name": "Номера страниц", + "desc": "Извлечь конкретные страницы (1,3,5-10)", + "tooltip": "Введите номера страниц через запятую или диапазоны через дефис" + }, + "bySections": { + "name": "Секции", + "desc": "Делить страницы на секции сетки", + "tooltip": "Разделить каждую страницу на горизонтальные и вертикальные секции" + }, "bySize": { - "name": "Размер файла" + "name": "Размер файла", + "desc": "Ограничить максимальный размер файла", + "tooltip": "Укажите максимальный размер файла (напр., 10MB, 500KB)" + }, + "byPageCount": { + "name": "Количество страниц", + "desc": "Фиксированное число страниц на файл", + "tooltip": "Введите число страниц для каждого файла" + }, + "byDocCount": { + "name": "Количество документов", + "desc": "Создать заданное количество файлов", + "tooltip": "Укажите, сколько файлов нужно создать" + }, + "byChapters": { + "name": "Главы", + "desc": "Разделить по границам закладок", + "tooltip": "Использует закладки PDF для определения точек разделения" + }, + "byPageDivider": { + "name": "Разделитель страниц", + "desc": "Авто-разделение с разделительными листами", + "tooltip": "Используйте листы-разделители с QR-кодом между документами при сканировании" } }, "value": { "fileSize": { - "label": "Размер файла" + "label": "Размер файла", + "placeholder": "напр. 10MB, 500KB" + }, + "pageCount": { + "label": "Страниц на файл", + "placeholder": "напр. 5, 10" + }, + "docCount": { + "label": "Количество файлов", + "placeholder": "напр. 3, 5" + } + }, + "tooltip": { + "header": { + "title": "Обзор методов разделения" + }, + "byPages": { + "title": "Делить по номерам страниц", + "text": "Разделяйте PDF в указанных точках. «n» — делит после страницы n. «n-m» — делит перед n и после m.", + "bullet1": "Единичные точки: 3,7 (делит после страниц 3 и 7)", + "bullet2": "Диапазоны: 3-8 (делит перед 3 и после 8)", + "bullet3": "Смешанные: 2,5-10,15 (после 2, перед 5, после 10 и после 15)" + }, + "bySections": { + "title": "Делить по сетке", + "text": "Разделяет каждую страницу на сетку секций. Полезно для документов с несколькими колонками или извлечения областей.", + "bullet1": "Горизонтально: число строк", + "bullet2": "Вертикально: число столбцов", + "bullet3": "Объединить: собрать все секции в один PDF" + }, + "bySize": { + "title": "Делить по размеру файла", + "text": "Создавайте несколько PDF, не превышающих заданный размер. Идеально для ограничений по размеру или email-вложений.", + "bullet1": "Используйте MB для больших файлов (напр., 10MB)", + "bullet2": "Используйте KB для меньших (напр., 500KB)", + "bullet3": "Система делит по границам страниц" + }, + "byCount": { + "title": "Делить по количеству", + "text": "Создавайте несколько PDF с заданным числом страниц или документов.", + "bullet1": "Количество страниц: фиксированное число страниц на файл", + "bullet2": "Количество документов: фиксированное число выходных файлов", + "bullet3": "Полезно для пакетной обработки" + }, + "byChapters": { + "title": "Делить по главам", + "text": "Используйте закладки PDF для автоматического разделения по границам глав. Требуются PDF с структурой закладок.", + "bullet1": "Уровень закладок: по какому уровню делить (1 = верхний)", + "bullet2": "Включить метаданные: сохранять свойства документа", + "bullet3": "Разрешить дубликаты: обрабатывать повторяющиеся названия закладок" } } }, "rotate": { - "tags": "серверная часть", "title": "Повернуть PDF", - "header": "Повернуть PDF", - "selectAngle": "Выберите угол поворота (кратный 90 градусам):", - "submit": "Повернуть" + "submit": "Повернуть", + "error": { + "failed": "Произошла ошибка при повороте PDF." + }, + "preview": { + "title": "Предпросмотр поворота" + }, + "rotateLeft": "Повернуть против часовой стрелки", + "rotateRight": "Повернуть по часовой стрелке", + "tooltip": { + "header": { + "title": "Обзор настроек поворота" + }, + "description": { + "text": "Поворачивайте страницы PDF по или против часовой стрелки с шагом 90 градусов. Все страницы в PDF будут повернуты. Предпросмотр показывает, как будет выглядеть документ." + }, + "controls": { + "title": "Управление", + "text": "Используйте кнопки поворота для изменения ориентации. Левая — против часовой, правая — по часовой. Каждый щелчок поворачивает на 90°." + } + } + }, + "convert": { + "title": "Преобразовать", + "desc": "Преобразование файлов между разными форматами", + "files": "Файлы", + "selectFilesPlaceholder": "Выберите файлы в главном окне, чтобы начать", + "settings": "Настройки", + "conversionCompleted": "Преобразование завершено", + "results": "Результаты", + "defaultFilename": "converted_file", + "conversionResults": "Результаты преобразования", + "convertFrom": "Преобразовать из", + "convertTo": "Преобразовать в", + "sourceFormatPlaceholder": "Исходный формат", + "targetFormatPlaceholder": "Целевой формат", + "selectSourceFormatFirst": "Сначала выберите исходный формат", + "outputOptions": "Параметры вывода", + "pdfOptions": "Параметры PDF", + "imageOptions": "Параметры изображений", + "colorType": "Тип цвета", + "color": "Цвет", + "greyscale": "Оттенки серого", + "blackwhite": "Чёрно-белый", + "dpi": "DPI", + "output": "Выходные данные", + "single": "Один", + "multiple": "Несколько", + "fitOption": "Вариант подгонки", + "maintainAspectRatio": "Сохранять пропорции", + "fitDocumentToPage": "Подогнать документ под страницу", + "fillPage": "Заполнить страницу", + "autoRotate": "Автоповорот", + "autoRotateDescription": "Автоматически поворачивать изображения для лучшего соответствия странице PDF", + "combineImages": "Объединить изображения", + "combineImagesDescription": "Объедините все изображения в один PDF или создайте отдельные PDF для каждого изображения", + "webOptions": "Параметры Web→PDF", + "zoomLevel": "Уровень масштабирования", + "emailOptions": "Параметры Email→PDF", + "includeAttachments": "Включать вложения письма", + "maxAttachmentSize": "Максимальный размер вложения (МБ)", + "includeAllRecipients": "Включать получателей CC и BCC в заголовок", + "downloadHtml": "Скачать промежуточный HTML вместо PDF", + "pdfaOptions": "Параметры PDF/A", + "outputFormat": "Выходной формат", + "pdfaNote": "PDF/A-1b более совместим, PDF/A-2b поддерживает больше функций.", + "pdfaDigitalSignatureWarning": "PDF содержит цифровую подпись. Она будет удалена на следующем шаге.", + "fileFormat": "Формат файла", + "wordDoc": "Документ Word", + "wordDocExt": "Документ Word (.docx)", + "odtExt": "OpenDocument Text (.odt)", + "pptExt": "PowerPoint (.pptx)", + "odpExt": "OpenDocument Presentation (.odp)", + "txtExt": "Простой текст (.txt)", + "rtfExt": "Rich Text Format (.rtf)", + "selectedFiles": "Выбранные файлы", + "noFileSelected": "Файл не выбран. Используйте панель файлов, чтобы добавить файлы.", + "convertFiles": "Преобразовать файлы", + "converting": "Преобразование...", + "downloadConverted": "Скачать преобразованный файл", + "errorNoFiles": "Пожалуйста, выберите хотя бы один файл для преобразования.", + "errorNoFormat": "Пожалуйста, выберите и исходный, и целевой формат.", + "errorNotSupported": "Преобразование из {{from}} в {{to}} не поддерживается.", + "images": "Изображения", + "officeDocs": "Документы Office (Word, Excel, PowerPoint)", + "imagesExt": "Изображения (JPG, PNG и т. д.)", + "markdown": "Markdown", + "textRtf": "Текст/RTF", + "grayscale": "Оттенки серого" }, "imageToPdf": { "tags": "конвертация,изображение,jpg,картинка,фото" @@ -734,6 +975,19 @@ "10": "Объединение четных-нечетных", "11": "Дублировать все страницы" }, + "desc": { + "CUSTOM": "Используйте собственную последовательность номеров страниц или выражения для задания нового порядка.", + "REVERSE_ORDER": "Перевернуть документ так, чтобы последняя страница стала первой и далее по порядку.", + "DUPLEX_SORT": "Чередовать лицевые, затем оборотные, как если бы дуплекс-сканер просканировал сначала все лицевые, затем все обороты (1, n, 2, n-1, …).", + "BOOKLET_SORT": "Упорядочить страницы для печати буклета (последняя, первая, вторая, предпоследняя, …).", + "SIDE_STITCH_BOOKLET_SORT": "Упорядочить страницы для буклета со скреплением сбоку (оптимизировано для бокового переплёта).", + "ODD_EVEN_SPLIT": "Разделить документ на два результата: все нечётные страницы и все чётные страницы.", + "ODD_EVEN_MERGE": "Объединить два PDF, чередуя страницы: нечётные из первого, чётные из второго.", + "DUPLICATE": "Дублировать каждую страницу согласно количеству в пользовательском порядке (напр., 4 дубликата — каждая страница по 4×).", + "REMOVE_FIRST": "Удалить первую страницу документа.", + "REMOVE_LAST": "Удалить последнюю страницу документа.", + "REMOVE_FIRST_AND_LAST": "Удалить первую и последнюю страницы документа." + }, "placeholder": "(например, 1,3,2 или 4-8,2,10-12 или 2n-1)" }, "addImage": { @@ -744,33 +998,190 @@ "upload": "Добавить изображение", "submit": "Добавить изображение" }, + "attachments": { + "tags": "вставлять,прикреплять,файл,вложение,вложения", + "title": "Добавлять вложения", + "header": "Добавлять вложения", + "add": "Добавить вложение", + "remove": "Удалить вложение", + "embed": "Встроить вложение", + "submit": "Добавлять вложения" + }, "watermark": { - "tags": "текст,повторяющийся,метка,собственный,авторское право,торговая марка,изображение,jpg,картинка,фото", "title": "Добавить водяной знак", - "header": "Добавить водяной знак", - "customColor": "Пользовательский цвет текста", - "selectText": { - "1": "Выберите PDF для добавления водяного знака:", - "2": "Текст водяного знака:", - "3": "Размер шрифта:", - "4": "Поворот (0-360):", - "5": "Горизонтальный интервал (расстояние между водяными знаками по горизонтали):", - "6": "Вертикальный интервал (расстояние между водяными знаками по вертикали):", - "7": "Прозрачность (0% - 100%):", - "8": "Тип водяного знака:", - "9": "Изображение водяного знака:", - "10": "Преобразовать PDF в PDF-изображение" - }, + "desc": "Добавляйте текстовые или графические водяные знаки в PDF-файлы", + "completed": "Водяной знак добавлен", "submit": "Добавить водяной знак", - "type": { - "1": "Текст", - "2": "Изображение" + "filenamePrefix": "watermarked", + "error": { + "failed": "Произошла ошибка при добавлении водяного знака в PDF." }, "watermarkType": { - "text": "Текст" + "text": "Текст", + "image": "Изображение" }, "settings": { - "fontSize": "Размер шрифта" + "type": "Тип водяного знака", + "text": { + "label": "Текст водяного знака", + "placeholder": "Введите текст водяного знака" + }, + "image": { + "label": "Изображение водяного знака", + "choose": "Выбрать изображение", + "selected": "Выбрано: {{filename}}" + }, + "fontSize": "Размер шрифта", + "size": "Размер", + "alphabet": "Шрифт/язык", + "color": "Цвет водяного знака", + "rotation": "Поворот (градусы)", + "opacity": "Непрозрачность (%)", + "spacing": { + "horizontal": "Горизонтальный интервал", + "vertical": "Вертикальный интервал" + }, + "convertToImage": "Превратить страницы PDF в изображения" + }, + "alphabet": { + "roman": "Roman/Latin", + "arabic": "Arabic", + "japanese": "Japanese", + "korean": "Korean", + "chinese": "Chinese", + "thai": "Thai" + }, + "steps": { + "type": "Тип водяного знака", + "wording": "Текст", + "textStyle": "Стиль", + "formatting": "Форматирование", + "file": "Файл водяного знака" + }, + "results": { + "title": "Результаты водяного знака" + }, + "tooltip": { + "language": { + "title": "Поддержка языка", + "text": "Выберите соответствующий язык, чтобы обеспечить корректное отображение шрифтов в вашем тексте." + }, + "appearance": { + "title": "Параметры внешнего вида", + "text": "Управляйте внешним видом водяного знака и его смешиванием с документом.", + "bullet1": "Поворот: от -360° до 360° для наклонных водяных знаков", + "bullet2": "Непрозрачность: 0–100% для управления прозрачностью", + "bullet3": "Меньшая непрозрачность делает водяные знаки менее заметными" + }, + "spacing": { + "title": "Управление интервалами", + "text": "Настройте расстояние между повторяющимися водяными знаками на странице.", + "bullet1": "Ширина интервала: горизонтальное расстояние между водяными знаками", + "bullet2": "Высота интервала: вертикальное расстояние между водяными знаками", + "bullet3": "Более высокие значения формируют более редкий узор" + }, + "type": { + "header": { + "title": "Выбор типа водяного знака" + }, + "description": { + "title": "Выберите тип водяного знака", + "text": "Выберите между текстовыми или графическими водяными знаками в зависимости от ваших потребностей." + }, + "text": { + "title": "Текстовые водяные знаки", + "text": "Отлично подходит для добавления уведомлений об авторских правах, названий компаний или отметок конфиденциальности. Поддерживает несколько языков и пользовательские цвета.", + "bullet1": "Настраиваемые шрифты и языки", + "bullet2": "Регулируемые цвета и прозрачность", + "bullet3": "Идеально для юридического или фирменного текста" + }, + "image": { + "title": "Водяные знаки-изображения", + "text": "Используйте логотипы, штампы или любое изображение как водяной знак. Отлично подходит для брендинга и визуальной идентификации.", + "bullet1": "Загружайте изображение в любом формате", + "bullet2": "Сохраняет качество изображения", + "bullet3": "Идеально для логотипов и штампов" + } + }, + "wording": { + "header": { + "title": "Текстовое содержимое" + }, + "text": { + "title": "Текст водяного знака", + "text": "Введите текст, который будет отображаться как водяной знак по всему документу.", + "bullet1": "Краткость улучшает читаемость", + "bullet2": "Типичные примеры: «CONFIDENTIAL», «DRAFT», название компании", + "bullet3": "Символы эмодзи не поддерживаются и будут удалены" + } + }, + "textStyle": { + "header": { + "title": "Стиль текста" + }, + "color": { + "title": "Выбор цвета", + "text": "Выберите цвет, обеспечивающий хороший контраст с содержимым документа.", + "bullet1": "Светло-серый (#d3d3d3) — для ненавязчивых знаков", + "bullet2": "Чёрный или тёмные цвета — для высокого контраста", + "bullet3": "Пользовательские цвета — для фирменного стиля" + }, + "language": { + "title": "Поддержка языка", + "text": "Выберите соответствующий язык, чтобы обеспечить корректное отображение шрифтов." + } + }, + "file": { + "header": { + "title": "Загрузка изображения" + }, + "upload": { + "title": "Выбор изображения", + "text": "Загрузите файл изображения для использования в качестве водяного знака.", + "bullet1": "Поддерживаются популярные форматы: PNG, JPG, GIF, BMP", + "bullet2": "Лучше всего подходит PNG с прозрачностью", + "bullet3": "Изображения с более высоким разрешением лучше сохраняют качество" + }, + "recommendations": { + "title": "Рекомендации", + "text": "Советы для оптимальных результатов при использовании водяных знаков-изображений.", + "bullet1": "Используйте логотипы или штампы с прозрачным фоном", + "bullet2": "Простые дизайны работают лучше, чем сложные изображения", + "bullet3": "Учитывайте итоговый размер документа при выборе разрешения" + } + }, + "formatting": { + "header": { + "title": "Форматирование и компоновка" + }, + "size": { + "title": "Управление размером", + "text": "Настройте размер вашего водяного знака (текста или изображения).", + "bullet1": "Больший размер делает водяные знаки более заметными" + }, + "appearance": { + "title": "Параметры внешнего вида", + "text": "Управляйте внешним видом водяного знака и его смешиванием с документом.", + "bullet1": "Поворот: от -360° до 360° для наклонных водяных знаков", + "bullet2": "Непрозрачность: 0–100% для управления прозрачностью", + "bullet3": "Меньшая непрозрачность делает водяные знаки менее заметными" + }, + "spacing": { + "title": "Управление интервалами", + "text": "Настройте расстояние между повторяющимися водяными знаками на странице.", + "bullet1": "Горизонтальный интервал: расстояние между водяными знаками слева направо", + "bullet2": "Вертикальный интервал: расстояние между водяными знаками сверху вниз", + "bullet3": "Более высокие значения формируют более редкий узор" + }, + "security": { + "title": "Опция безопасности", + "text": "Преобразуйте итоговый PDF в формат на основе изображений для повышения безопасности.", + "bullet1": "Предотвращает выделение и копирование текста", + "bullet2": "Усложняет удаление водяных знаков", + "bullet3": "Приводит к увеличению размера файла", + "bullet4": "Лучше для чувствительного или защищённого авторским правом контента" + } + } } }, "permissions": { @@ -795,50 +1206,148 @@ "removePages": { "tags": "Удалить страницы,удаление страниц", "title": "Удалить", + "pageNumbers": { + "label": "Страницы для удаления", + "placeholder": "напр., 1,3,5-8,10", + "error": "Недопустимый формат номеров страниц. Используйте числа, диапазоны (1-5) или математические выражения (2n+1)" + }, + "filenamePrefix": "pages_removed", + "files": { + "placeholder": "Выберите PDF-файл в главном окне, чтобы начать" + }, + "settings": { + "title": "Настройки" + }, + "tooltip": { + "header": { + "title": "Настройки удаления страниц" + }, + "pageNumbers": { + "title": "Выбор страниц", + "text": "Укажите, какие страницы удалить из PDF. Можно выбрать отдельные страницы, диапазоны или использовать математические выражения.", + "bullet1": "Отдельные страницы: 1,3,5 (удаляются страницы 1, 3 и 5)", + "bullet2": "Диапазоны: 1-5,10-15 (удаляются 1-5 и 10-15)", + "bullet3": "Математически: 2n+1 (удаляются нечётные)", + "bullet4": "Открытые диапазоны: 5- (удаляются с 5-й до конца)" + }, + "examples": { + "title": "Типичные примеры", + "text": "Вот распространённые шаблоны выбора страниц:", + "bullet1": "Удалить первую страницу: 1", + "bullet2": "Удалить последние 3 страницы: -3", + "bullet3": "Удалить каждую вторую страницу: 2n", + "bullet4": "Удалить разбросанные страницы: 1,5,10,15" + }, + "safety": { + "title": "Советы по безопасности", + "text": "Важные рекомендации при удалении страниц:", + "bullet1": "Всегда предварительно просматривайте выбор перед обработкой", + "bullet2": "Храните резервную копию исходного файла", + "bullet3": "Нумерация страниц начинается с 1, а не с 0", + "bullet4": "Недопустимые номера страниц будут проигнорированы" + } + }, + "error": { + "failed": "Произошла ошибка при удалении страниц." + }, + "results": { + "title": "Результаты удаления страниц" + }, "submit": "Удалить" }, - "addPassword": { - "tags": "безопасность,защита", - "title": "Добавить пароль", - "header": "Добавить пароль (Шифрование)", - "selectText": { - "1": "Выберите PDF для шифрования", - "2": "Пароль пользователя", - "3": "Длина ключа шифрования", - "4": "Более высокие значения сильнее, но более низкие значения обеспечивают лучшую совместимость.", - "5": "Устанавливаемые разрешения (Рекомендуется использовать вместе с паролем владельца)", - "6": "Запретить компоновку документа", - "7": "Запретить извлечение содержимого", - "8": "Запретить извлечение для специальных возможностей", - "9": "Запретить заполнение форм", - "10": "Запретить модификацию", - "11": "Запретить модификацию аннотаций", - "12": "Запретить печать", - "13": "Запретить печать в высоком качестве", - "14": "Пароль владельца", - "15": "Ограничивает действия с документом после его открытия (Поддерживается не всеми программами чтения)", - "16": "Ограничивает само открытие документа" - }, - "submit": "Зашифровать", + "pageSelection": { "tooltip": { - "permissions": { - "title": "Изменить разрешения" + "header": { + "title": "Памятка по выбору страниц" + }, + "basic": { + "title": "Базовое использование", + "text": "Выбирайте конкретные страницы вашего PDF с помощью простой записи.", + "bullet1": "Отдельные страницы: 1,3,5", + "bullet2": "Диапазоны: 3-6 или 10-15", + "bullet3": "Все страницы: all" + }, + "advanced": { + "title": "Расширенные возможности" + }, + "tips": { + "title": "Советы", + "text": "Держите в уме следующие рекомендации:", + "bullet1": "Нумерация страниц начинается с 1 (не с 0)", + "bullet2": "Пробелы удаляются автоматически", + "bullet3": "Недопустимые выражения игнорируются" + }, + "syntax": { + "title": "Основы синтаксиса", + "text": "Используйте числа, диапазоны, ключевые слова и прогрессии (n начинается с 0). Поддерживаются скобки.", + "bullets": { + "numbers": "Числа/диапазоны: 5, 10-20", + "keywords": "Ключевые слова: odd, even", + "progressions": "Прогрессии: 3n, 4n+1" + } + }, + "operators": { + "title": "Операторы", + "text": "AND имеет приоритет выше, чем запятая. NOT применяется внутри диапазона документа.", + "and": "AND: & или \"and\" — требуется выполнение обоих условий (напр., 1-50 & even)", + "comma": "Запятая: , или | — объединение выборок (напр., 1-10, 20)", + "not": "NOT: ! или \"not\" — исключить страницы (напр., 3n & not 30)" + }, + "examples": { + "title": "Примеры" } } }, - "removePassword": { - "tags": "безопасность,расшифровка,защита,удаление пароля", - "title": "Удалить пароль", - "header": "Удалить пароль (Расшифровать)", - "selectText": { - "1": "Выберите PDF для расшифровки", - "2": "Пароль" + "bulkSelection": { + "header": { + "title": "Памятка по выбору страниц" }, - "submit": "Удалить", - "desc": "Удалите защиту паролем из вашего PDF-документа.", - "password": { - "stepTitle": "Удалить пароль", - "label": "Текущий пароль" + "syntax": { + "title": "Основы синтаксиса", + "text": "Используйте числа, диапазоны, ключевые слова и прогрессии (n начинается с 0). Поддерживаются скобки.", + "bullets": { + "numbers": "Числа/диапазоны: 5, 10–20", + "keywords": "Ключевые слова: odd, even", + "progressions": "Прогрессии: 3n, 4n+1" + } + }, + "operators": { + "title": "Операторы", + "text": "AND имеет приоритет выше, чем запятая. NOT применяется внутри диапазона документа.", + "and": "AND: & или «and» — требуется выполнение обоих условий (напр., 1–50 & even)", + "comma": "Запятая: , или | — объединение выборок (напр., 1–10, 20)", + "not": "NOT: ! или «not» — исключить страницы (напр., 3n & not 30)" + }, + "examples": { + "title": "Примеры", + "first50": "Первые 50", + "last50": "Последние 50", + "every3rd": "Каждая 3-я", + "oddWithinExcluding": "Нечётные в 1–20, исключая 5–7", + "combineSets": "Комбинировать наборы" + }, + "firstNPages": { + "title": "Первые N страниц", + "placeholder": "Количество страниц" + }, + "lastNPages": { + "title": "Последние N страниц", + "placeholder": "Количество страниц" + }, + "everyNthPage": { + "title": "Каждая N-я страница", + "placeholder": "Шаг" + }, + "range": { + "title": "Диапазон", + "fromPlaceholder": "От", + "toPlaceholder": "До" + }, + "keywords": { + "title": "Ключевые слова" + }, + "advanced": { + "title": "Дополнительно" } }, "compressPdfs": { @@ -848,28 +1357,141 @@ "tags": "удалить,форма,поле,только для чтения", "title": "Удалить поля формы, доступные только для чтения", "header": "Разблокировать PDF-формы", - "submit": "Remove" + "submit": "Remove", + "description": "Этот инструмент снимет режим «только чтение» с полей PDF-форм, сделав их редактируемыми и заполняемыми.", + "filenamePrefix": "unlocked_forms", + "files": { + "placeholder": "Выберите PDF-файл в главном окне, чтобы начать" + }, + "error": { + "failed": "Произошла ошибка при разблокировке PDF-форм." + }, + "results": { + "title": "Результаты разблокировки форм" + } }, "changeMetadata": { - "tags": "заголовок,автор,дата,создание,время,издатель,производитель,статистика", - "title": "Изменить метаданные", "header": "Изменить метаданные", - "selectText": { - "1": "Пожалуйста, отредактируйте переменные, которые хотите изменить", - "2": "Удалить все метаданные", - "3": "Показать пользовательские метаданные:", - "4": "Другие метаданные:", - "5": "Добавить пользовательскую запись метаданных" + "submit": "Изменить", + "filenamePrefix": "metadata", + "settings": { + "title": "Настройки метаданных" }, - "author": "Автор:", - "creationDate": "Дата создания (yyyy/MM/dd HH:mm:ss):", - "creator": "Создатель:", - "keywords": "Ключевые слова:", - "modDate": "Дата изменения (yyyy/MM/dd HH:mm:ss):", - "producer": "Производитель:", - "subject": "Тема:", - "trapped": "Захвачен:", - "submit": "Изменить" + "standardFields": { + "title": "Стандартные поля" + }, + "deleteAll": { + "label": "Удалить существующие метаданные", + "checkbox": "Удалить все метаданные" + }, + "title": { + "label": "Название", + "placeholder": "Название документа" + }, + "author": { + "label": "Автор", + "placeholder": "Автор документа" + }, + "subject": { + "label": "Тема", + "placeholder": "Тема документа" + }, + "keywords": { + "label": "Ключевые слова", + "placeholder": "Ключевые слова документа" + }, + "creator": { + "label": "Создатель", + "placeholder": "Создатель документа" + }, + "producer": { + "label": "Производитель", + "placeholder": "Производитель документа" + }, + "dates": { + "title": "Поля дат" + }, + "creationDate": { + "label": "Дата создания", + "placeholder": "Дата создания" + }, + "modificationDate": { + "label": "Дата изменения", + "placeholder": "Дата изменения" + }, + "trapped": { + "label": "Статус trapping", + "unknown": "Unknown", + "true": "True", + "false": "False" + }, + "advanced": { + "title": "Дополнительные параметры" + }, + "customFields": { + "title": "Пользовательские метаданные", + "description": "Добавьте пользовательские поля метаданных в документ", + "add": "Добавить поле", + "key": "Ключ", + "keyPlaceholder": "Пользовательский ключ", + "value": "Значение", + "valuePlaceholder": "Пользовательское значение", + "remove": "Удалить" + }, + "results": { + "title": "Обновлённые PDF" + }, + "error": { + "failed": "Произошла ошибка при изменении метаданных PDF." + }, + "tooltip": { + "header": { + "title": "Обзор метаданных PDF" + }, + "standardFields": { + "title": "Стандартные поля", + "text": "Общие поля метаданных PDF, описывающие документ.", + "bullet1": "Название: имя документа или заголовок", + "bullet2": "Автор: кто создал документ", + "bullet3": "Тема: краткое описание содержания", + "bullet4": "Ключевые слова: поисковые термины", + "bullet5": "Создатель/Производитель: ПО, которым создан PDF" + }, + "dates": { + "title": "Поля дат", + "text": "Когда документ был создан и изменён.", + "bullet1": "Дата создания: когда документ был создан", + "bullet2": "Дата изменения: когда последний раз изменён" + }, + "options": { + "title": "Дополнительные опции", + "text": "Пользовательские поля и настройки приватности.", + "bullet1": "Пользовательские метаданные: добавляйте свои пары ключ-значение", + "bullet2": "Статус trapping: настройка для высококачественной печати", + "bullet3": "Удалить всё: удаление всех метаданных для приватности" + }, + "deleteAll": { + "title": "Удалить существующие метаданные", + "text": "Полное удаление метаданных для обеспечения приватности." + }, + "customFields": { + "title": "Пользовательские метаданные", + "text": "Добавляйте собственные пары ключ-значение метаданных.", + "bullet1": "Добавляйте любые поля, важные для вашего документа", + "bullet2": "Примеры: Отдел, Проект, Версия, Статус", + "bullet3": "Для каждой записи требуются и ключ, и значение" + }, + "advanced": { + "title": "Дополнительные параметры", + "trapped": { + "title": "Статус trapping", + "description": "Указывает, подготовлен ли документ для высококачественной печати.", + "bullet1": "True: документ подготовлен для высококачественной печати", + "bullet2": "False: документ не подготовлен", + "bullet3": "Unknown: статус не указан" + } + } + } }, "fileToPDF": { "tags": "преобразование,формат,документ,картинка,презентация,текст,конвертация,офис,документы,word,excel,powerpoint", @@ -883,6 +1505,7 @@ "ocr": { "tags": "распознавание,текст,изображение,сканирование,чтение,идентификация,обнаружение,редактируемый", "title": "OCR / Очистка сканов", + "desc": "Очистка сканов и распознавание текста с изображений в PDF с последующим добавлением его как текст.", "header": "Очистка сканов / OCR (оптическое распознавание символов)", "selectText": { "1": "Выберите языки, которые должны быть обнаружены в PDF (перечислены те, которые обнаружены в данный момент):", @@ -901,22 +1524,85 @@ "help": "Пожалуйста, прочтите эту документацию о том, как использовать это для других языков и/или использовать не в Docker", "credit": "Этот сервис использует qpdf и Tesseract для OCR.", "submit": "Обработать PDF с OCR", - "desc": "Очистка сканов и распознавание текста с изображений в PDF с последующим добавлением его как текст.", + "operation": { + "submit": "Выполнить OCR и просмотреть" + }, + "results": { + "title": "Результаты OCR" + }, + "languagePicker": { + "additionalLanguages": "Ищете дополнительные языки?", + "viewSetupGuide": "Посмотреть руководство по настройке →" + }, "settings": { "title": "Настройки", "ocrMode": { - "label": "Режим OCR" + "label": "Режим OCR", + "auto": "Авто (пропускать страницы с текстовым слоем)", + "force": "Принудительно (повторно OCR всех страниц, заменить текст)", + "strict": "Строго (прервать, если найден текст)" }, "languages": { - "label": "Языки" + "label": "Языки", + "placeholder": "Выберите языки" + }, + "compatibilityMode": { + "label": "Режим совместимости" + }, + "advancedOptions": { + "label": "Параметры обработки", + "sidecar": "Создать текстовый файл", + "deskew": "Выравнивать перекос страниц", + "clean": "Очистить входной файл", + "cleanFinal": "Очистить итоговый файл" } }, "tooltip": { + "header": { + "title": "Обзор настроек OCR" + }, "mode": { - "title": "Режим OCR" + "title": "Режим OCR", + "text": "Оптическое распознавание символов (OCR) помогает превратить сканы и снимки страниц в текст, который можно искать, копировать или подсвечивать.", + "bullet1": "Авто пропускает страницы, где уже есть текстовый слой.", + "bullet2": "Принудительный режим повторно обрабатывает каждую страницу и заменяет весь текст.", + "bullet3": "Строгий режим останавливается при обнаружении любого выделяемого текста." }, "languages": { - "title": "Языки" + "title": "Языки", + "text": "Улучшите точность OCR, указав ожидаемые языки. Выберите один или несколько языков для направляющей детекции." + }, + "output": { + "title": "Выходные данные", + "text": "Выберите форматирование выходного текста:", + "bullet1": "Ищущийся PDF встраивает текст за исходным изображением.", + "bullet2": "HOCR XML возвращает структурированный машиночитаемый файл.", + "bullet3": "Текстовый sidecar создаёт отдельный .txt с необработанным содержимым." + }, + "advanced": { + "header": { + "title": "Расширенная обработка OCR" + }, + "compatibility": { + "title": "Режим совместимости", + "text": "Использует режим «бутербродного PDF» для OCR: файлы больше, но надёжнее для некоторых языков и старого ПО. По умолчанию используем hOCR для более компактных современных PDF." + }, + "sidecar": { + "title": "Создать текстовый файл", + "text": "Генерирует отдельный .txt рядом с PDF, содержащий весь извлечённый текст для удобного доступа и обработки." + }, + "deskew": { + "title": "Выравнивание страниц", + "text": "Автоматически исправляет перекошенные или наклонённые страницы для улучшения точности OCR. Полезно для неидеально отсканированных документов." + }, + "clean": { + "title": "Очистка входного файла", + "text": "Предобрабатывает вход: удаляет шум, повышает контраст и оптимизирует изображение для лучшего распознавания перед OCR." + }, + "cleanFinal": { + "title": "Очистка итогового файла", + "text": "Постобработка итогового PDF: удаление артефактов OCR и оптимизация текстового слоя для лучшей читаемости и меньшего размера." + } } } }, @@ -926,7 +1612,13 @@ "header": "Извлечь изображения", "selectText": "Выберите формат изображения для преобразования извлеченных изображений", "allowDuplicates": "Сохранять дубликаты изображений", - "submit": "Извлечь" + "submit": "Извлечь", + "settings": { + "title": "Параметры" + }, + "error": { + "failed": "Произошла ошибка при извлечении изображений из PDF." + } }, "pdfToPDFA": { "tags": "архив,долгосрочный,стандарт,конвертация,хранение,сохранение", @@ -998,17 +1690,53 @@ }, "info": "Python не установлен. Он необходим для работы." }, + "scannerImageSplit": { + "title": "Извлечённые изображения", + "submit": "Извлечь отсканированные изображения", + "error": { + "failed": "Произошла ошибка при извлечении отсканированных фотографий." + }, + "tooltip": { + "title": "Разделитель фотографий", + "whatThisDoes": "Что делает инструмент", + "whatThisDoesDesc": "Автоматически находит и извлекает каждую фотографию со отсканированной страницы или составного изображения — без ручной обрезки.", + "whenToUse": "Когда использовать", + "useCase1": "Сканировать целые страницы альбома за раз", + "useCase2": "Разделять партии со сканера-планшета на отдельные файлы", + "useCase3": "Разбивать коллажи на отдельные фото", + "useCase4": "Извлекать фото из документов", + "quickFixes": "Быстрые исправления", + "problem1": "Фотографии не обнаружены → увеличьте «Допуск» до 30–50", + "problem2": "Слишком много ложных срабатываний → увеличьте «Минимальную площадь» до 15 000–20 000", + "problem3": "Слишком тесные обрезки → увеличьте «Размер поля» до 5–10", + "problem4": "Наклон не выпрямлен → уменьшите «Порог угла» до ~5°", + "problem5": "Появляются квадраты пыли/шума → увеличьте «Минимальную площадь контура» до 1000–2000", + "setupTips": "Советы по подготовке", + "tip1": "Используйте ровный светлый фон", + "tip2": "Оставляйте небольшой зазор (≈1 см) между фото", + "tip3": "Сканируйте в 300–600 DPI", + "tip4": "Очистите стекло сканера", + "headsUp": "Внимание", + "headsUpDesc": "Перекрывающиеся фотографии или фон, близкий по цвету к фото, снижают точность — используйте более светлый/тёмный фон и оставляйте больше пространства." + } + }, "sign": { - "tags": "авторизация,инициалы,нарисованная подпись,текстовая подпись,подпись изображением", "title": "Подпись", "header": "Подписать PDF", "upload": "Загрузить изображение", - "draw": "Нарисовать подпись", - "text": "Текстовый ввод", + "draw": { + "title": "Нарисуйте свою подпись", + "clear": "Очистить" + }, + "text": { + "name": "Имя подписанта", + "placeholder": "Введите ваше полное имя" + }, "clear": "Очистить", "add": "Добавить", "saved": "Сохраненные подписи", "save": "Сохранить подпись", + "applySignatures": "Применить подписи", "personalSigs": "Личные подписи", "sharedSigs": "Общие подписи", "noSavedSigs": "Сохраненные подписи не найдены", @@ -1020,42 +1748,157 @@ "previous": "Предыдущая страница", "maintainRatio": "Переключить сохранение пропорций", "undo": "Отменить", - "redo": "Повторить" + "redo": "Повторить", + "submit": "Подписать документ", + "steps": { + "configure": "Настроить подпись" + }, + "type": { + "title": "Тип подписи", + "draw": "Рисунок", + "canvas": "Холст", + "image": "Изображение", + "text": "Текст" + }, + "image": { + "label": "Загрузить изображение подписи", + "placeholder": "Выберите файл изображения", + "hint": "Загрузите PNG или JPG с вашей подписью" + }, + "instructions": { + "title": "Как добавить подпись" + }, + "activate": "Активировать размещение подписи", + "deactivate": "Остановить размещение подписей", + "results": { + "title": "Результаты подписи" + }, + "error": { + "failed": "Произошла ошибка при подписании PDF." + } }, "flatten": { - "tags": "статический,деактивация,неинтерактивный,упрощение", "title": "Сведение", "header": "Сведение PDF", "flattenOnlyForms": "Свести только формы", "submit": "Свести", + "filenamePrefix": "flattened", + "files": { + "placeholder": "Выберите PDF-файл в главном окне, чтобы начать" + }, "steps": { "settings": "Настройки" }, "options": { - "flattenOnlyForms": "Свести только формы" + "stepTitle": "Параметры уплощения", + "title": "Параметры уплощения", + "flattenOnlyForms.desc": "Уплощать только поля форм, оставляя прочие интерактивные элементы", + "note": "Уплощение удаляет интерактивные элементы из PDF, делая их нередактируемыми." + }, + "results": { + "title": "Результаты уплощения" + }, + "error": { + "failed": "Произошла ошибка при уплощении PDF." + }, + "tooltip": { + "header": { + "title": "Об уплощении PDF" + }, + "description": { + "title": "Что делает уплощение?", + "text": "Уплощение делает ваш PDF нередактируемым, превращая заполняемые формы и кнопки в обычный текст и изображения. PDF будет выглядеть точно так же, но никто больше не сможет изменять формы. Идеально для обмена заполненными формами, создания финальных документов для архива или обеспечения единообразного отображения.", + "bullet1": "Текстовые поля становятся обычным текстом (нельзя редактировать)", + "bullet2": "Флажки и кнопки превращаются в изображения", + "bullet3": "Отлично подходит для финальных версий, которые нельзя менять", + "bullet4": "Обеспечивает одинаковый внешний вид на всех устройствах" + }, + "formsOnly": { + "title": "Что значит «Уплощать только формы»?", + "text": "Этот вариант удаляет только возможность заполнять формы, но сохраняет другие функции: кликабельные ссылки, видимые закладки и комментарии.", + "bullet1": "Формы становятся нередактируемыми", + "bullet2": "Ссылки продолжают работать при нажатии", + "bullet3": "Комментарии и заметки остаются видимыми", + "bullet4": "Закладки по-прежнему помогают навигации" + } } }, "repair": { "tags": "исправление,восстановление,коррекция,возврат", "title": "Восстановление", "header": "Восстановление PDF", - "submit": "Восстановить" + "submit": "Восстановить", + "description": "Этот инструмент попытается восстановить повреждённые или испорченные PDF-файлы. Дополнительные настройки не требуются.", + "filenamePrefix": "repaired", + "files": { + "placeholder": "Выберите PDF-файл в главном окне, чтобы начать" + }, + "error": { + "failed": "Произошла ошибка при восстановлении PDF." + }, + "results": { + "title": "Результаты восстановления" + } }, "removeBlanks": { - "tags": "очистка,упрощение,без содержимого,организация", "title": "Удалить пустые страницы", "header": "Удалить пустые страницы", - "threshold": "Порог белизны пикселей:", - "thresholdDesc": "Порог определения, насколько белым должен быть пиксель, чтобы считаться 'белым'. 0 = черный, 255 = чисто белый.", - "whitePercent": "Процент белого (%):", - "whitePercentDesc": "Процент страницы, который должен быть 'белыми' пикселями для удаления", + "settings": { + "title": "Настройки" + }, + "threshold": { + "label": "Порог белизны пикселя" + }, + "whitePercent": { + "label": "Порог процента белого", + "unit": "%" + }, + "includeBlankPages": { + "label": "Включить обнаруженные пустые страницы" + }, + "tooltip": { + "header": { + "title": "Настройки удаления пустых страниц" + }, + "threshold": { + "title": "Порог белизны пикселя", + "text": "Определяет, насколько светлым должен быть пиксель, чтобы считаться «белым». Это помогает определить, что считать пустой областью на странице.", + "bullet1": "0 = Чисто чёрный (самый строгий)", + "bullet2": "128 = Средне-серый", + "bullet3": "255 = Чисто белый (наименее строгий)" + }, + "whitePercent": { + "title": "Порог процента белого", + "text": "Задаёт минимальный процент белых пикселей, необходимый для признания страницы пустой и её удаления.", + "bullet1": "Низкие значения (напр., 80%) = Удаляется больше страниц", + "bullet2": "Высокие значения (напр., 95%) = Удаляются только очень пустые страницы", + "bullet3": "Используйте более высокие значения для документов со светлыми фонами" + }, + "includeBlankPages": { + "title": "Включить обнаруженные пустые страницы", + "text": "Если включено, создаётся отдельный PDF со всеми пустыми страницами, обнаруженными и удалёнными из исходного документа.", + "bullet1": "Полезно для проверки того, что было удалено", + "bullet2": "Помогает убедиться в точности определения", + "bullet3": "Можно отключить для уменьшения размера файла" + } + }, "submit": "Удалить пустые" }, "removeAnnotations": { "tags": "комментарии,выделение,заметки,разметка,удаление", "title": "Удалить аннотации", "header": "Удалить аннотации", - "submit": "Удалить" + "submit": "Удалить", + "settings": { + "title": "Настройки" + }, + "info": { + "title": "О функции удаления аннотаций", + "description": "Этот инструмент удалит все аннотации (комментарии, выделения, примечания и т. п.) из ваших PDF-документов." + }, + "error": { + "failed": "Произошла ошибка при удалении аннотаций из PDF." + } }, "compare": { "tags": "различие,контраст,изменения,анализ", @@ -1087,28 +1930,140 @@ "certSign": { "tags": "аутентификация,PEM,P12,официальный,шифрование", "title": "Подписание сертификатом", - "header": "Подпишите PDF вашим сертификатом (в разработке)", - "selectPDF": "Выберите PDF-файл для подписания:", - "jksNote": "Примечание: Если тип вашего сертификата не указан ниже, пожалуйста, преобразуйте его в файл хранилища ключей Java (.jks) с помощью утилиты командной строки keytool. Затем выберите опцию .jks файла ниже.", - "selectKey": "Выберите файл закрытого ключа (формат PKCS#8, может быть .pem или .der):", - "selectCert": "Выберите файл сертификата (формат X.509, может быть .pem или .der):", - "selectP12": "Выберите файл хранилища ключей PKCS#12 (.p12 или .pfx) (необязательно, если предоставлен, должен содержать ваш закрытый ключ и сертификат):", - "selectJKS": "Выберите файл хранилища ключей Java (.jks или .keystore):", - "certType": "Тип сертификата", - "password": "Введите пароль хранилища ключей или закрытого ключа (если есть):", - "showSig": "Показать подпись", - "reason": "Причина", - "location": "Местоположение", - "name": "Имя", - "showLogo": "Показать логотип", - "submit": "Подписать PDF" + "filenamePrefix": "signed", + "signMode": { + "stepTitle": "Режим подписи", + "tooltip": { + "header": { + "title": "О PDF-подписях" + }, + "overview": { + "title": "Как работают подписи", + "text": "Оба режима запечатывают документ (любые правки считаются вмешательством) и фиксируют кто/когда/как для аудита. Доверие в просмотрщике зависит от цепочки сертификатов." + }, + "manual": { + "title": "Вручную — свой сертификат", + "text": "Используйте собственные файлы сертификата для фирменной идентичности. Может отображаться как Доверено при распознанной цепочке ЦС.", + "use": "Для: клиентских, юридических, комплаенс-сценариев." + }, + "auto": { + "title": "Авто — мгновенная системная печать", + "text": "Подписывает серверным самоподписанным сертификатом. Та же индикация вмешательства и аудит; обычно отображается как Непроверено в просмотрщиках.", + "use": "Используйте, когда нужны скорость и единая внутренняя идентичность для ревью и учёта." + }, + "rule": { + "title": "Правило большого пальца", + "text": "Нужен статус Доверено у получателя? Вручную. Нужна быстрая пломба и аудит без настроек? Авто." + } + } + }, + "certTypeStep": { + "stepTitle": "Формат сертификата" + }, + "certFiles": { + "stepTitle": "Файлы сертификата" + }, + "appearance": { + "stepTitle": "Вид подписи", + "tooltip": { + "header": { + "title": "О внешнем виде подписи" + }, + "invisible": { + "title": "Невидимые подписи", + "text": "Подпись добавляется в PDF для безопасности, но не видна при просмотре. Идеально для юридических требований без изменения внешнего вида документа.", + "bullet1": "Обеспечивает безопасность без визуальных изменений", + "bullet2": "Соответствует юридическим требованиям к цифровой подписи", + "bullet3": "Не влияет на макет и дизайн документа" + }, + "visible": { + "title": "Видимые подписи", + "text": "Показывает блок подписи в PDF с вашим именем, датой и дополнительными сведениями. Полезно, когда нужно явно показать, что документ подписан.", + "bullet1": "Показывает имя подписанта и дату в документе", + "bullet2": "Можно добавить причину и место подписания", + "bullet3": "Выберите страницу для размещения подписи", + "bullet4": "Можно добавить логотип" + } + } + }, + "sign": { + "submit": "Подписать PDF", + "results": "Подписанный PDF" + }, + "error": { + "failed": "Произошла ошибка при обработке подписей." + }, + "tooltip": { + "header": { + "title": "Управление подписями" + }, + "overview": { + "title": "Что умеет инструмент?", + "text": "Этот инструмент позволяет проверить, подписаны ли ваши PDF, и добавить новые цифровые подписи. Цифровые подписи подтверждают автора/согласование и показывают, изменялся ли документ после подписания.", + "bullet1": "Проверяйте существующие подписи и их валидность", + "bullet2": "Просматривайте сведения о подписантах и сертификатах", + "bullet3": "Добавляйте новые цифровые подписи для защиты документов", + "bullet4": "Поддержка нескольких файлов с удобной навигацией" + }, + "validation": { + "title": "Проверка подписей", + "text": "При проверке подписей инструмент сообщает, действительны ли они, кто подписал документ, когда он был подписан и менялся ли после подписания.", + "bullet1": "Показывает, действительны подписи или нет", + "bullet2": "Отображает информацию о подписанте и дату подписания", + "bullet3": "Проверяет, изменялся ли документ после подписания", + "bullet4": "Можно использовать пользовательские сертификаты для проверки" + }, + "signing": { + "title": "Добавление подписей", + "text": "Для подписи PDF нужен цифровой сертификат (например, PEM, PKCS12 или JKS). Вы можете сделать подпись видимой в документе или оставить невидимой — только для безопасности.", + "bullet1": "Поддерживаются форматы PEM, PKCS12, JKS и серверные сертификаты", + "bullet2": "Можно показывать или скрывать подпись в PDF", + "bullet3": "Добавьте причину, местоположение и имя подписанта", + "bullet4": "Выберите страницу для видимых подписей", + "bullet5": "Используйте серверный сертификат для простого варианта «Подписать со Stirling-PDF»" + } + }, + "certType": { + "tooltip": { + "header": { + "title": "О типах сертификатов" + }, + "what": { + "title": "Что такое сертификат?", + "text": "Это защищённый идентификатор вашей подписи, подтверждающий, что подписали вы. Если сертификат не обязателен, рекомендуем другой способ — Текст, Рисование или Загрузка." + }, + "which": { + "title": "Какой вариант выбрать?", + "text": "Выберите формат, соответствующий вашему файлу сертификата:", + "bullet1": "PKCS#12 (.p12 / .pfx) – один объединённый файл (наиболее распространённый)", + "bullet2": "PFX (.pfx) – версия PKCS12 от Microsoft", + "bullet3": "PEM – отдельные файлы .pem с закрытым ключом и сертификатом", + "bullet4": "JKS – Java .jks хранилище для дев/CI-CD" + }, + "convert": { + "title": "Ключ не указан?", + "text": "Преобразуйте файл в Java-хранилище ключей (.jks) с помощью keytool, затем выберите JKS." + } + } + } }, "removeCertSign": { "tags": "аутентификация,PEM,P12,официальный,расшифровка", "title": "Удалить сертификат подписи", "header": "Удалить цифровой сертификат из PDF", "selectPDF": "Выберите PDF-файл:", - "submit": "Удалить подпись" + "submit": "Удалить подпись", + "description": "Этот инструмент удалит цифровые подписи сертификатов из вашего PDF-документа.", + "filenamePrefix": "unsigned", + "files": { + "placeholder": "Выберите PDF-файл в главном окне, чтобы начать" + }, + "error": { + "failed": "Произошла ошибка при удалении подписей сертификатов." + }, + "results": { + "title": "Результаты удаления сертификатов" + } }, "pageLayout": { "tags": "объединение,композиция,единый вид,организация", @@ -1118,8 +2073,100 @@ "addBorder": "Добавить границы", "submit": "Отправить" }, + "bookletImposition": { + "tags": "буклет,импозиция,печать,переплёт,сгиб,сигнатура", + "title": "Буклет (импозиция)", + "header": "Буклет (импозиция)", + "submit": "Создать буклет", + "spineLocation": { + "label": "Расположение корешка", + "left": "Слева (стандарт)", + "right": "Справа (RTL)" + }, + "doubleSided": { + "label": "Двусторонняя печать", + "tooltip": "Создаёт лицевую и обратную стороны для корректной печати буклета" + }, + "manualDuplex": { + "title": "Ручной дуплекс", + "instructions": "Для принтеров без авто-дуплекса. Потребуется два прохода:" + }, + "duplexPass": { + "label": "Проход печати", + "first": "1-й проход", + "second": "2-й проход", + "firstInstructions": "Печать лицевых сторон → сложите стопкой лицом вниз → запустите снова для 2-го прохода", + "secondInstructions": "Загрузите отпечатанную стопку лицом вниз → печать обратных сторон" + }, + "rtlBinding": { + "label": "Переплёт справа налево", + "tooltip": "Для арабского, иврита и других RTL-языков" + }, + "addBorder": { + "label": "Добавить рамки вокруг страниц", + "tooltip": "Добавляет рамки вокруг каждого сегмента страницы для облегчения резки и совмещения" + }, + "addGutter": { + "label": "Добавить поле под переплёт", + "tooltip": "Добавляет внутреннее поле для переплёта" + }, + "gutterSize": { + "label": "Размер поля под переплёт (в пунктах)" + }, + "flipOnShortEdge": { + "label": "Переворачивать по короткой стороне (только авто-дуплекс)", + "tooltip": "Включите для двусторонней печати по короткой стороне (только автоматический дуплекс — игнорируется в ручном режиме)", + "manualNote": "Не требуется в ручном режиме — вы переворачиваете стопку сами" + }, + "advanced": { + "toggle": "Дополнительные параметры" + }, + "paperSizeNote": "Размер бумаги автоматически определяется по первой странице.", + "tooltip": { + "header": { + "title": "Руководство по созданию буклета" + }, + "description": { + "title": "Что такое импозиция буклета?", + "text": "Создаёт профессиональные буклеты, располагая страницы в корректном порядке печати. Страницы вашего PDF размещаются 2-up на альбомных листах, чтобы при сгибе и переплёте они читались по порядку, как настоящая книга." + }, + "example": { + "title": "Пример: буклет на 8 страниц", + "text": "Ваш 8-страничный документ превращается в 2 листа:", + "bullet1": "Лист 1 Лицевая: Стр. 8, 1 | Оборот: Стр. 2, 7", + "bullet2": "Лист 2 Лицевая: Стр. 6, 3 | Оборот: Стр. 4, 5", + "bullet3": "После сгиба и сборки: Чтение 1→2→3→4→5→6→7→8" + }, + "printing": { + "title": "Как печатать и собирать", + "text": "Следуйте этим шагам для идеального буклета:", + "bullet1": "Печатайте двусторонне с «Переворот по длинной стороне»", + "bullet2": "Сложите листы по порядку, согните пополам", + "bullet3": "Скрепите или переплетите вдоль сгиба корешка", + "bullet4": "Для принтеров с короткой стороной: включите опцию «Переворот по короткой стороне»" + }, + "manualDuplex": { + "title": "Ручной дуплекс (односторонние принтеры)", + "text": "Для принтеров без автоматического дуплекса:", + "bullet1": "Отключите «Двустороннюю печать»", + "bullet2": "Выберите «1-й проход» → Печать → Сложите лицом вниз", + "bullet3": "Выберите «2-й проход» → Загрузите стопку → Печать оборотов", + "bullet4": "Согните и соберите как обычно" + }, + "advanced": { + "title": "Дополнительные параметры", + "text": "Тонкая настройка буклета:", + "bullet1": "Переплёт справа налево: для RTL-языков", + "bullet2": "Рамки: показывают линии реза", + "bullet3": "Поле под переплёт: добавляет место для скрепления/переплёта", + "bullet4": "Переворот по короткой стороне: только для авто-дуплекса" + } + }, + "error": { + "failed": "Произошла ошибка при создании буклета." + } + }, "scalePages": { - "tags": "изменение размера,модификация,размеры,адаптация", "title": "Настройка масштаба страницы", "header": "Настройка масштаба страницы", "pageSize": "Размер страницы документа.", @@ -1127,6 +2174,44 @@ "scaleFactor": "Коэффициент масштабирования (обрезки) страницы.", "submit": "Отправить" }, + "adjustPageScale": { + "tags": "изменение размера,изменить,размер,адаптация", + "title": "Изменить масштаб страницы", + "header": "Изменить масштаб страницы", + "scaleFactor": { + "label": "Коэффициент масштабирования" + }, + "pageSize": { + "label": "Целевой размер страницы", + "keep": "Сохранить исходный размер", + "letter": "Letter", + "legal": "Legal" + }, + "submit": "Применить масштабирование страницы", + "error": { + "failed": "Произошла ошибка при изменении масштаба страницы." + }, + "tooltip": { + "header": { + "title": "Обзор настроек масштаба страниц" + }, + "description": { + "title": "Описание", + "text": "Изменяйте размер содержимого PDF и меняйте размеры страниц." + }, + "scaleFactor": { + "title": "Коэффициент масштабирования", + "text": "Управляет тем, насколько крупным или мелким выглядит содержимое на странице. Содержимое масштабируется и центрируется — если оно больше размера страницы, часть может быть обрезана.", + "bullet1": "1.0 = исходный размер", + "bullet2": "0.5 = половина размера (на 50% меньше)", + "bullet3": "2.0 = двойной размер (на 200% больше, возможна обрезка)" + }, + "pageSize": { + "title": "Целевой размер страницы", + "text": "Задает размеры выходных страниц PDF. «Сохранить исходный размер» сохраняет текущие размеры, остальные варианты — стандартные форматы бумаги." + } + } + }, "add-page-numbers": { "tags": "нумерация,метка,организация,индекс" }, @@ -1134,16 +2219,66 @@ "tags": "автообнаружение,на основе заголовка,организация,переименование", "title": "Автопереименование", "header": "Автопереименование PDF", - "submit": "Автопереименование" + "description": "Автоматически находит заголовок в содержимом вашего PDF и использует его как имя файла.", + "submit": "Автопереименование", + "files": { + "placeholder": "Выберите PDF-файл в главном окне, чтобы начать" + }, + "error": { + "failed": "Произошла ошибка при автоматическом переименовании PDF." + }, + "results": { + "title": "Результаты автопереименования" + }, + "tooltip": { + "header": { + "title": "Как работает автопереименование" + }, + "howItWorks": { + "title": "Умное переименование", + "text": "Автоматически находит заголовок в содержимом вашего PDF и использует его как имя файла.", + "bullet1": "Ищет текст, похожий на заголовок или шапку", + "bullet2": "Создает чистое, корректное имя файла из найденного заголовка", + "bullet3": "Сохраняет исходное имя, если подходящий заголовок не найден" + } + } }, "adjust-contrast": { "tags": "цветокоррекция,настройка,модификация,улучшение" }, "crop": { - "tags": "обрезка,уменьшение,редактирование,форма", "title": "Обрезка", "header": "Обрезка PDF", - "submit": "Отправить" + "submit": "Отправить", + "noFileSelected": "Выберите PDF-файл, чтобы начать обрезку", + "preview": { + "title": "Выбор области обрезки" + }, + "reset": "Сбросить к полному PDF", + "coordinates": { + "title": "Положение и размер", + "x": "Положение X", + "y": "Положение Y", + "width": "Ширина", + "height": "Высота" + }, + "error": { + "invalidArea": "Область обрезки выходит за границы PDF", + "failed": "Не удалось обрезать PDF" + }, + "steps": { + "selectArea": "Выберите область обрезки" + }, + "tooltip": { + "title": "Как обрезать PDF", + "description": "Выберите область для обрезки в вашем PDF, перетаскивая и изменяя размер синей области на миниатюре.", + "drag": "Перетащите область, чтобы переместить зону обрезки", + "resize": "Тяните за углы и края, чтобы изменить размер", + "precision": "Используйте координаты для точного позиционирования" + }, + "results": { + "title": "Результаты обрезки" + } }, "autoSplitPDF": { "tags": "QR-код,разделение,скан-сегмент,организация", @@ -1226,64 +2361,122 @@ "downloadJS": "Скачать Javascript", "submit": "Показать" }, - "autoRedact": { - "tags": "Редактирование,Скрытие,зачернение,чёрный,маркер,скрытый", - "title": "Автоматическое редактирование", - "header": "Автоматическое редактирование", - "colorLabel": "Цвет", - "textsToRedactLabel": "Текст для редактирования (построчно)", - "textsToRedactPlaceholder": "например \\nКонфиденциально \\nСовершенно секретно", - "useRegexLabel": "Использовать регулярные выражения", - "wholeWordSearchLabel": "Поиск целых слов", - "customPaddingLabel": "Пользовательские отступы", - "convertPDFToImageLabel": "Преобразовать PDF в PDF-изображение (используется для удаления текста за рамкой)", - "submitButton": "Отправить" - }, "redact": { "tags": "Редактирование,Скрытие,зачернение,чёрный,маркер,скрытый,ручной", "title": "Ручное редактирование", - "header": "Ручное редактирование", "submit": "Редактировать", - "textBasedRedaction": "Редактирование на основе текста", - "pageBasedRedaction": "Редактирование на основе страниц", - "convertPDFToImageLabel": "Преобразовать PDF в PDF-изображение (используется для удаления текста за рамкой)", - "pageRedactionNumbers": { - "title": "Страницы", - "placeholder": "(например, 1,2,8 или 4,7,12-16 или 2n-1)" + "error": { + "failed": "Произошла ошибка при редактировании (редакции) PDF." }, - "redactionColor": { - "title": "Цвет редактирования" + "modeSelector": { + "title": "Метод редактирования", + "mode": "Режим", + "automatic": "Автоматически", + "automaticDesc": "Скрывать текст на основе поисковых терминов", + "manual": "Вручную", + "manualDesc": "Щёлкните и тяните, чтобы скрыть выбранные области", + "manualComingSoon": "Ручная редакция скоро появится" }, - "export": "Экспорт", - "upload": "Загрузить", - "boxRedaction": "Редактирование рисованием рамки", - "zoom": "Масштаб", - "zoomIn": "Увеличить", - "zoomOut": "Уменьшить", - "nextPage": "Следующая страница", - "previousPage": "Предыдущая страница", - "toggleSidebar": "Переключить боковую панель", - "showThumbnails": "Показать миниатюры", - "showDocumentOutline": "Показать структуру документа (двойной щелчок для развертывания/свертывания всех элементов)", - "showAttatchments": "Показать вложения", - "showLayers": "Показать слои (двойной щелчок для сброса всех слоев к состоянию по умолчанию)", - "colourPicker": "Выбор цвета", - "findCurrentOutlineItem": "Найти текущий элемент структуры", - "applyChanges": "Apply Changes", "auto": { + "header": "Авто-редакция", "settings": { + "title": "Настройки редактирования", "advancedTitle": "Расширенные" }, + "colorLabel": "Цвет рамки", "wordsToRedact": { - "add": "Добавить" + "title": "Слова для скрытия", + "placeholder": "Введите слово", + "add": "Добавить", + "examples": "Примеры: Confidential, Top-Secret" + }, + "useRegexLabel": "Использовать регулярные выражения", + "wholeWordSearchLabel": "Поиск по целому слову", + "customPaddingLabel": "Пользовательский отступ", + "convertPDFToImageLabel": "Преобразовать PDF в PDF-изображение" + }, + "tooltip": { + "mode": { + "header": { + "title": "Метод редактирования" + }, + "automatic": { + "title": "Автоматическая редакция", + "text": "Автоматически находит и скрывает указанный текст по всему документу. Идеально для систематического удаления чувствительных данных: имён, адресов, меток конфиденциальности." + }, + "manual": { + "title": "Ручная редакция", + "text": "Щёлкните и тяните, чтобы вручную выделять области для сокрытия. Даёт точный контроль над тем, что скрывается. (Скоро)" + } + }, + "words": { + "header": { + "title": "Слова для сокрытия" + }, + "description": { + "title": "Сопоставление текста", + "text": "Введите слова или фразы для поиска и сокрытия в документе. Каждое слово ищется отдельно." + }, + "bullet1": "Добавляйте по одному слову за раз", + "bullet2": "Нажмите Enter или «Добавить ещё» для добавления", + "bullet3": "Нажмите ×, чтобы удалить слова", + "examples": { + "title": "Распространённые примеры", + "text": "Типичные слова для сокрытия: банковские реквизиты, адреса электронной почты, конкретные имена." + } + }, + "advanced": { + "header": { + "title": "Расширенные настройки редактирования" + }, + "color": { + "title": "Цвет рамки и отступ", + "text": "Настройте внешний вид рамок сокрытия. Чёрный — стандарт, но можно выбрать любой цвет. Отступ добавляет пространство вокруг найденного текста." + }, + "regex": { + "title": "Использовать регулярные выражения", + "text": "Включите регулярные выражения для продвинутого сопоставления шаблонов. Полезно для поиска телефонов, email или сложных шаблонов.", + "bullet1": "Пример: \\d{4}-\\d{2}-\\d{2} для дат в формате YYYY-MM-DD", + "bullet2": "Используйте с осторожностью — тщательно тестируйте" + }, + "wholeWord": { + "title": "Поиск по целому слову", + "text": "Совпадать только с целыми словами, не с частями. «John» не совпадёт с «Johnson», если включено." + }, + "convert": { + "title": "Преобразовать в PDF-изображение", + "text": "Преобразует PDF в основанный на изображениях после сокрытия. Это гарантирует, что текст за рамками полностью удалён и невосстановим." + } } }, "manual": { + "header": "Ручная редакция", + "textBasedRedaction": "Сокрытие по тексту", + "pageBasedRedaction": "Сокрытие по страницам", + "convertPDFToImageLabel": "Преобразовать PDF в PDF-изображение (для удаления текста за рамкой)", "pageRedactionNumbers": { "title": "Страницы", "placeholder": "(например, 1,2,8 или 4,7,12-16 или 2n-1)" }, - "export": "Экспорт" + "redactionColor": { + "title": "Цвет сокрытия" + }, + "export": "Экспорт", + "upload": "Загрузить", + "boxRedaction": "Скрытие рамкой", + "zoom": "Масштаб", + "zoomIn": "Увеличить", + "zoomOut": "Уменьшить", + "nextPage": "Следующая страница", + "previousPage": "Предыдущая страница", + "toggleSidebar": "Показать/скрыть боковую панель", + "showThumbnails": "Показать миниатюры", + "showDocumentOutline": "Показать оглавление документа (двойной щелчок — развернуть/свернуть всё)", + "showAttachments": "Показать вложения", + "showLayers": "Показать слои (двойной щелчок — сбросить все слои по умолчанию)", + "colourPicker": "Выбор цвета", + "findCurrentOutlineItem": "Найти текущий элемент оглавления", + "applyChanges": "Применить изменения" } }, "tableExtraxt": { @@ -1337,6 +2530,7 @@ "tags": "Штамп,Добавить изображение,центрировать изображение,Водяной знак,PDF,Встраивание,Настройка", "header": "Штамп PDF", "title": "Штамп PDF", + "stampSetup": "Настройка штампа", "stampType": "Тип штампа", "stampText": "Текст штампа", "stampImage": "Изображение штампа", @@ -1349,7 +2543,8 @@ "overrideY": "Переопределить координату Y", "customMargin": "Пользовательские поля", "customColor": "Пользовательский цвет текста", - "submit": "Отправить" + "submit": "Отправить", + "noStampSelected": "Штамп не выбран. Вернитесь к Шагу 1." }, "removeImagePdf": { "tags": "Удаление изображения,операции со страницами,Серверная часть" @@ -1403,31 +2598,15 @@ }, "selectCustomCert": "Пользовательский файл сертификата X.509 (Необязательно)" }, - "replace-color": { - "title": "Замена-Инверсия цвета", - "header": "Замена-Инверсия цвета PDF", - "selectText": { - "1": "Параметры замены или инверсии цвета", - "2": "По умолчанию (цвета высокого контраста)", - "3": "Пользовательские (настраиваемые цвета)", - "4": "Полная инверсия (инвертировать все цвета)", - "5": "Параметры высокого контраста", - "6": "белый текст на чёрном фоне", - "7": "чёрный текст на белом фоне", - "8": "жёлтый текст на чёрном фоне", - "9": "зелёный текст на чёрном фоне", - "10": "Выбрать цвет текста", - "11": "Выбрать цвет фона" - }, - "submit": "Заменить" - }, - "replaceColorPdf": { - "tags": "Замена цвета,операции со страницами,Серверная часть" + "replaceColor": { + "tags": "Замена цвета,Операции со страницами,Back end,на стороне сервера" }, "login": { "title": "Вход", "header": "Вход", "signin": "Войти", + "signInWith": "Войти с помощью", + "signInAnonymously": "Войти как гость", "rememberme": "Запомнить меня", "invalid": "Неверное имя пользователя или пароль.", "locked": "Ваша учетная запись заблокирована.", @@ -1446,12 +2625,70 @@ "alreadyLoggedIn": "Вы уже вошли в", "alreadyLoggedIn2": "устройств(а). Пожалуйста, выйдите из этих устройств и попробуйте снова.", "toManySessions": "У вас слишком много активных сессий", - "logoutMessage": "Вы вышли из системы." + "logoutMessage": "Вы вышли из системы.", + "youAreLoggedIn": "Вы вошли в систему!", + "email": "Email", + "password": "Пароль", + "enterEmail": "Введите ваш email", + "enterPassword": "Введите ваш пароль", + "loggingIn": "Вход...", + "signingIn": "Входим...", + "login": "Войти", + "or": "Или", + "useMagicLink": "Использовать магическую ссылку", + "enterEmailForMagicLink": "Введите ваш email для магической ссылки", + "sending": "Отправка…", + "sendMagicLink": "Отправить магическую ссылку", + "cancel": "Отмена", + "dontHaveAccount": "Нет аккаунта? Зарегистрируйтесь", + "home": "Главная", + "debug": "Отладка", + "signOut": "Выйти", + "pleaseEnterBoth": "Пожалуйста, введите и email, и пароль", + "pleaseEnterEmail": "Пожалуйста, введите адрес email", + "magicLinkSent": "Магическая ссылка отправлена на {{email}}! Проверьте почту и перейдите по ссылке для входа.", + "passwordResetSent": "Ссылка для сброса пароля отправлена на {{email}}! Проверьте почту и следуйте инструкциям.", + "failedToSignIn": "Не удалось войти через {{provider}}: {{message}}", + "unexpectedError": "Непредвиденная ошибка: {{message}}" + }, + "signup": { + "title": "Создать аккаунт", + "subtitle": "Присоединяйтесь к Stirling PDF, чтобы начать", + "name": "Имя", + "email": "Email", + "password": "Пароль", + "confirmPassword": "Подтвердите пароль", + "enterName": "Введите ваше имя", + "enterEmail": "Введите ваш email", + "enterPassword": "Введите ваш пароль", + "confirmPasswordPlaceholder": "Подтвердите пароль", + "or": "или", + "creatingAccount": "Создание аккаунта...", + "signUp": "Зарегистрироваться", + "alreadyHaveAccount": "Уже есть аккаунт? Войдите", + "pleaseFillAllFields": "Пожалуйста, заполните все поля", + "passwordsDoNotMatch": "Пароли не совпадают", + "passwordTooShort": "Пароль должен быть длиной не менее 6 символов", + "invalidEmail": "Пожалуйста, введите корректный адрес email", + "checkEmailConfirmation": "Проверьте почту и перейдите по ссылке для завершения регистрации.", + "accountCreatedSuccessfully": "Аккаунт успешно создан! Теперь вы можете войти.", + "unexpectedError": "Непредвиденная ошибка: {{message}}" }, "pdfToSinglePage": { "title": "PDF в одну страницу", "header": "PDF в одну страницу", - "submit": "Преобразовать в одну страницу" + "submit": "Преобразовать в одну страницу", + "description": "Этот инструмент объединит все страницы вашего PDF в одну большую страницу. Ширина останется как у исходных страниц, а высота будет равна сумме высот всех страниц.", + "filenamePrefix": "single_page", + "files": { + "placeholder": "Выберите PDF-файл в главном окне, чтобы начать" + }, + "error": { + "failed": "Произошла ошибка при преобразовании в одну страницу." + }, + "results": { + "title": "Результаты объединения в одну страницу" + } }, "pageExtracter": { "title": "Извлечь страницы", @@ -1482,24 +2719,49 @@ }, "compress": { "title": "Сжать", + "desc": "Сжимайте PDF, чтобы уменьшить их размер.", "header": "Сжать PDF", + "method": { + "title": "Метод сжатия", + "quality": "Качество", + "filesize": "Размер файла" + }, "credit": "Этот сервис использует qpdf для сжатия/оптимизации PDF.", "grayscale": { "label": "Применить шкалу серого для сжатия" }, + "tooltip": { + "header": { + "title": "Обзор настроек сжатия" + }, + "description": { + "title": "Описание", + "text": "Сжатие — простой способ уменьшить размер файла. Выберите «Размер файла», чтобы указать целевой размер, а мы подберём качество. Выберите «Качество», чтобы задать силу сжатия вручную." + }, + "qualityAdjustment": { + "title": "Настройка качества", + "text": "Перемещайте ползунок, чтобы настроить силу сжатия. Низкие значения (1–3) лучше сохраняют качество, но дают большие файлы. Высокие значения (7–9) сильнее уменьшают размер, но снижают чёткость изображений.", + "bullet1": "Низкие значения сохраняют качество", + "bullet2": "Высокие значения уменьшают размер файла" + }, + "grayscale": { + "title": "Оттенки серого", + "text": "Выберите эту опцию, чтобы преобразовать все изображения в чёрно-белые. Это может существенно уменьшить размер файла, особенно для отсканированных PDF или документов с большим количеством изображений." + } + }, + "error": { + "failed": "Произошла ошибка при сжатии PDF." + }, "selectText": { "1": { - "_value": "Compression Settings", + "_value": "Настройки сжатия", "1": "1-3 сжатие PDF,
4-6 лёгкое сжатие изображений,
7-9 интенсивное сжатие изображений (значительно снижает качество изображений)" }, "2": "Уровень оптимизации:", "4": "Автоматический режим - автоматически настраивает качество для получения точного размера PDF", "5": "Ожидаемый размер PDF (например, 25MB, 10.8MB, 25KB)" }, - "submit": "Сжать", - "method": { - "filesize": "Размер файла" - } + "submit": "Сжать" }, "decrypt": { "passwordPrompt": "Этот файл защищен паролем. Пожалуйста, введите пароль:", @@ -1634,6 +2896,12 @@ }, "note": "Примечания к релизу доступны только на английском языке" }, + "swagger": { + "title": "Документация API", + "header": "Документация API", + "desc": "Просматривайте и тестируйте эндпоинты Stirling PDF API", + "tags": "api,документация,swagger,эндпоинты,разработка" + }, "cookieBanner": { "popUp": { "title": "Как мы используем файлы cookie", @@ -1671,52 +2939,289 @@ } } }, - "download": "Скачать", - "undo": "Отменить", - "convert": { - "title": "Преобразовать", - "settings": "Настройки", - "color": "Цвет", - "greyscale": "Оттенки серого", - "fillPage": "Заполнить страницу", - "pdfaDigitalSignatureWarning": "PDF содержит цифровую подпись. Она будет удалена на следующем шаге.", - "grayscale": "Оттенки серого" + "removeMetadata": { + "submit": "Удалить метаданные" }, - "attachments": { - "tags": "вставлять,прикреплять,файл,вложение,вложения", - "title": "Добавлять вложения", - "header": "Добавлять вложения", - "submit": "Добавлять вложения" + "sidebar": { + "toggle": "Показать/скрыть боковую панель" + }, + "theme": { + "toggle": "Переключить тему" + }, + "view": { + "viewer": "Просмотрщик", + "pageEditor": "Редактор страниц", + "fileManager": "Менеджер файлов" + }, + "pageEditor": { + "title": "Редактор страниц", + "save": "Сохранить изменения", + "noPdfLoaded": "PDF не загружен. Пожалуйста, загрузите PDF для редактирования.", + "rotatedLeft": "Повернуто влево:", + "rotatedRight": "Повернуто вправо:", + "deleted": "Удалено:", + "movedLeft": "Сдвинуто влево:", + "movedRight": "Сдвинуто вправо:", + "splitAt": "Разделить в:", + "insertedPageBreak": "Вставлен разрыв страницы в:", + "addFileNotImplemented": "Добавление файла не реализовано в демо", + "closePdf": "Закрыть PDF", + "reset": "Сбросить изменения", + "zoomIn": "Увеличить", + "zoomOut": "Уменьшить", + "fitToWidth": "По ширине", + "actualSize": "Фактический размер" + }, + "viewer": { + "firstPage": "Первая страница", + "lastPage": "Последняя страница", + "previousPage": "Предыдущая страница", + "nextPage": "Следующая страница", + "zoomIn": "Увеличить", + "zoomOut": "Уменьшить", + "singlePageView": "Одностраничный вид", + "dualPageView": "Двухстраничный вид" }, "rightRail": { + "closeSelected": "Закрыть выбранные файлы", "selectAll": "Выбрать все", - "deselectAll": "Отменить выбор всех" + "deselectAll": "Отменить выбор всех", + "selectByNumber": "Выбрать по номерам страниц", + "deleteSelected": "Удалить выбранные страницы", + "closePdf": "Закрыть PDF", + "exportAll": "Экспортировать PDF", + "downloadSelected": "Скачать выбранные файлы", + "downloadAll": "Скачать все", + "toggleTheme": "Переключить тему", + "language": "Язык", + "search": "Поиск по PDF", + "panMode": "Режим панорамирования", + "rotateLeft": "Повернуть влево", + "rotateRight": "Повернуть вправо", + "toggleSidebar": "Показать/скрыть боковую панель" + }, + "search": { + "title": "Поиск по PDF", + "placeholder": "Введите поисковый запрос..." + }, + "guestBanner": { + "title": "Вы используете Stirling PDF как гость!", + "message": "Создайте бесплатный аккаунт, чтобы сохранять работу, получить больше функций и поддержать проект.", + "dismiss": "Скрыть баннер", + "signUp": "Зарегистрироваться бесплатно" + }, + "toolPicker": { + "searchPlaceholder": "Поиск инструментов...", + "noToolsFound": "Инструменты не найдены", + "allTools": "ВСЕ ИНСТРУМЕНТЫ", + "quickAccess": "БЫСТРЫЙ ДОСТУП", + "categories": { + "standardTools": "Стандартные инструменты", + "advancedTools": "Расширенные инструменты", + "recommendedTools": "Рекомендуемые инструменты" + }, + "subcategories": { + "signing": "Подписание", + "documentSecurity": "Безопасность документа", + "verification": "Проверка", + "documentReview": "Рецензирование документа", + "pageFormatting": "Форматирование страниц", + "extraction": "Извлечение", + "removal": "Удаление", + "automation": "Автоматизация", + "general": "Общее", + "advancedFormatting": "Расширенное форматирование", + "developerTools": "Инструменты разработчика" + } }, "quickAccess": { - "sign": "Подпись" + "read": "Чтение", + "sign": "Подпись", + "automate": "Автоматизация", + "files": "Файлы", + "activity": "Активность", + "config": "Конфигурация", + "allTools": "Все инструменты" }, "fileUpload": { + "selectFile": "Выберите файл", + "selectFiles": "Выберите файлы", + "selectPdfToView": "Выберите PDF для просмотра", + "selectPdfToEdit": "Выберите PDF для редактирования", + "chooseFromStorage": "Выберите файл из хранилища или загрузите новый PDF", + "chooseFromStorageMultiple": "Выберите файлы из хранилища или загрузите новые PDF", + "loadFromStorage": "Загрузить из хранилища", + "filesAvailable": "файлов доступно", "loading": "Загрузка...", - "or": "или" + "or": "или", + "dropFileHere": "Перетащите файл сюда или нажмите для загрузки", + "dropFilesHere": "Перетащите файлы сюда или нажмите кнопку загрузки", + "pdfFilesOnly": "Только PDF-файлы", + "supportedFileTypes": "Поддерживаемые типы файлов", + "upload": "Загрузить", + "uploadFile": "Загрузить файл", + "uploadFiles": "Загрузить файлы", + "noFilesInStorage": "В хранилище нет файлов. Сначала загрузите несколько.", + "selectFromStorage": "Выбрать из хранилища", + "backToTools": "Назад к инструментам", + "addFiles": "Добавить файлы", + "dragFilesInOrClick": "Перетащите файлы или нажмите «Добавить файлы», чтобы выбрать" }, "fileManager": { + "title": "Загрузить PDF-файлы", + "subtitle": "Добавляйте файлы в хранилище для удобного доступа во всех инструментах", + "filesSelected": "файлов выбрано", + "clearSelection": "Снять выделение", + "openInFileEditor": "Открыть в редакторе файлов", + "uploadError": "Не удалось загрузить некоторые файлы.", + "failedToOpen": "Не удалось открыть файл. Возможно, он был удалён из хранилища.", + "failedToLoad": "Не удалось загрузить файл в активный набор.", + "storageCleared": "Браузер очистил хранилище. Файлы удалены. Пожалуйста, загрузите их снова.", + "clearAll": "Очистить всё", + "reloadFiles": "Обновить список", + "dragDrop": "Перетащите файлы сюда", + "clickToUpload": "Нажмите, чтобы загрузить файлы", + "selectedFiles": "Выбранные файлы", + "storage": "Хранилище", + "filesStored": "файлов в хранилище", + "storageError": "Произошла ошибка хранилища", + "storageLow": "Недостаточно места в хранилище. Рассмотрите удаление старых файлов.", + "supportMessage": "Работает на базе хранилища браузера для неограниченной ёмкости", + "noFileSelected": "Файлы не выбраны", + "showHistory": "Показать историю", + "hideHistory": "Скрыть историю", + "fileHistory": "История файлов", + "loadingHistory": "Загрузка истории...", + "lastModified": "Дата изменения", + "toolChain": "Применённые инструменты", + "restore": "Восстановить", + "searchFiles": "Поиск файлов...", + "recent": "Недавние", + "localFiles": "Локальные файлы", + "googleDrive": "Google Drive", + "googleDriveShort": "Drive", + "myFiles": "Мои файлы", + "noRecentFiles": "Недавние файлы не найдены", + "dropFilesHint": "Перетащите файлы сюда, чтобы загрузить", + "googleDriveNotAvailable": "Интеграция с Google Drive недоступна", + "openFiles": "Открыть файлы", + "openFile": "Открыть файл", + "details": "Сведения о файле", "fileName": "Имя", + "fileFormat": "Формат", + "fileSize": "Размер", "fileVersion": "Версия", + "totalSelected": "Всего выбрано", + "dropFilesHere": "Бросьте файлы здесь", "selectAll": "Выбрать все", "deselectAll": "Отменить выбор всех", "deleteSelected": "Удалить выбранные", + "downloadSelected": "Скачать выбранные", + "selectedCount": "{{count}} выбрано", "download": "Скачать", - "delete": "Удалить" + "delete": "Удалить", + "unsupported": "Не поддерживается" + }, + "storage": { + "temporaryNotice": "Файлы временно сохраняются в вашем браузере и могут быть автоматически удалены", + "storageLimit": "Лимит хранилища", + "storageUsed": "Использовано временного хранилища", + "storageFull": "Хранилище почти заполнено. Рассмотрите удаление некоторых файлов.", + "fileTooLarge": "Файл слишком большой. Максимальный размер на файл —", + "storageQuotaExceeded": "Квота хранилища превышена. Пожалуйста, удалите часть файлов перед дальнейшей загрузкой.", + "approximateSize": "Примерный размер" }, "sanitize": { + "title": "Санитизация", + "desc": "Удаление потенциально вредных элементов из PDF-файлов.", "submit": "Очистить PDF", + "completed": "Санитизация успешно завершена", + "error.generic": "Сбой санитизации", + "error.failed": "Произошла ошибка при санитизации PDF.", + "filenamePrefix": "sanitised", + "sanitizationResults": "Результаты санитизации", "steps": { - "settings": "Настройки" + "files": "Файлы", + "settings": "Настройки", + "results": "Результаты" + }, + "files": { + "placeholder": "Выберите PDF-файл в главном окне, чтобы начать" + }, + "options": { + "title": "Параметры санитизации", + "note": "Выберите элементы, которые хотите удалить из PDF. Должен быть выбран хотя бы один вариант.", + "removeJavaScript.desc": "Удалить действия и скрипты JavaScript из PDF", + "removeEmbeddedFiles.desc": "Удалить любые файлы, встроенные в PDF", + "removeXMPMetadata.desc": "Удалить XMP-метаданные из PDF", + "removeMetadata.desc": "Удалить информацию о документе (название, автор и т. д.)", + "removeLinks.desc": "Удалить внешние ссылки и действия запуска из PDF", + "removeFonts.desc": "Удалить встроенные шрифты из PDF" + } + }, + "addPassword": { + "title": "Добавить пароль", + "desc": "Зашифруйте ваш PDF-документ паролем.", + "completed": "Парольная защита применена", + "submit": "Зашифровать", + "filenamePrefix": "encrypted", + "error": { + "failed": "Произошла ошибка при шифровании PDF." + }, + "passwords": { + "stepTitle": "Пароли и шифрование", + "completed": "Пароли настроены", + "user": { + "label": "Пароль пользователя", + "placeholder": "Введите пароль пользователя" + }, + "owner": { + "label": "Пароль владельца", + "placeholder": "Введите пароль владельца" + } + }, + "encryption": { + "keyLength": { + "label": "Длина ключа шифрования", + "40bit": "40-бит (низкая)", + "128bit": "128-бит (стандартная)", + "256bit": "256-бит (высокая)" + } + }, + "results": { + "title": "Зашифрованные PDF" + }, + "tooltip": { + "header": { + "title": "Обзор защиты паролем" + }, + "passwords": { + "title": "Типы паролей", + "text": "Пароль пользователя ограничивает открытие документа, а пароль владельца — то, что можно делать с документом после открытия. Можно задать оба пароля или только один.", + "bullet1": "Пароль пользователя: требуется для открытия PDF", + "bullet2": "Пароль владельца: управляет разрешениями документа (поддерживается не всеми PDF-просмотрщиками)" + }, + "encryption": { + "title": "Уровни шифрования", + "text": "Более высокий уровень шифрования обеспечивает лучшую безопасность, но может не поддерживаться старыми PDF-просмотрщиками.", + "bullet1": "40-бит: базовая безопасность, совместима со старыми просмотрщиками", + "bullet2": "128-бит: стандартная безопасность, широко поддерживается", + "bullet3": "256-бит: максимальная безопасность, требует современных просмотрщиков" + }, + "permissions": { + "title": "Изменить разрешения", + "text": "Эти разрешения контролируют, что пользователи могут делать с PDF. Наиболее эффективно вместе с паролем владельца." + } } }, "changePermissions": { "title": "Изменить разрешения", + "desc": "Изменяйте ограничения и разрешения документа.", + "completed": "Разрешения изменены", "submit": "Изменить разрешения", + "error": { + "failed": "Произошла ошибка при изменении разрешений PDF." + }, "permissions": { "preventAssembly": { "label": "Запретить компоновку документа" @@ -1743,10 +3248,195 @@ "label": "Запретить печать в высоком качестве" } }, + "results": { + "title": "Изменённые PDF" + }, "tooltip": { "header": { "title": "Изменить разрешения" + }, + "description": { + "text": "Изменяет разрешения документа, разрешая/запрещая доступ к различным функциям в PDF-читалках." + }, + "warning": { + "text": "Чтобы сделать эти разрешения неизменяемыми, используйте инструмент «Добавить пароль» и задайте пароль владельца." } } - } + }, + "removePassword": { + "title": "Удалить пароль", + "desc": "Удалите защиту паролем из вашего PDF-документа.", + "tags": "безопасность,расшифровка,защита,удаление пароля", + "password": { + "stepTitle": "Удалить пароль", + "label": "Текущий пароль", + "placeholder": "Введите текущий пароль", + "completed": "Пароль указан" + }, + "filenamePrefix": "decrypted", + "error": { + "failed": "Произошла ошибка при удалении пароля из PDF." + }, + "tooltip": { + "description": "Для снятия защиты паролем требуется пароль, которым был зашифрован PDF. Это расшифрует документ, сделав его доступным без пароля." + }, + "submit": "Удалить", + "results": { + "title": "Расшифрованные PDF" + } + }, + "automate": { + "title": "Автоматизация", + "desc": "Создавайте многошаговые процессы, связывая PDF-действия. Идеально для повторяющихся задач.", + "invalidStep": "Недопустимый шаг", + "files": { + "placeholder": "Выберите файлы для обработки этой автоматизацией" + }, + "selection": { + "title": "Выбор автоматизации", + "saved": { + "title": "Сохранённые" + }, + "createNew": { + "title": "Создать новую автоматизацию" + }, + "suggested": { + "title": "Предложенные" + } + }, + "creation": { + "createTitle": "Создать автоматизацию", + "editTitle": "Редактировать автоматизацию", + "intro": "Автоматизации запускают инструменты последовательно. Для начала добавьте инструменты в нужном порядке.", + "name": { + "label": "Название автоматизации", + "placeholder": "Моя автоматизация" + }, + "description": { + "label": "Описание (необязательно)", + "placeholder": "Опишите, что делает эта автоматизация..." + }, + "tools": { + "selectTool": "Выберите инструмент...", + "selected": "Выбранные инструменты", + "remove": "Удалить инструмент", + "configure": "Настроить инструмент", + "notConfigured": "! Не настроено", + "addTool": "Добавить инструмент", + "add": "Добавить инструмент..." + }, + "save": "Сохранить автоматизацию", + "unsavedChanges": { + "title": "Несохранённые изменения", + "message": "У вас есть несохранённые изменения. Вы уверены, что хотите вернуться? Все изменения будут потеряны.", + "cancel": "Отмена", + "confirm": "Вернуться назад" + }, + "icon": { + "label": "Иконка" + } + }, + "run": { + "title": "Запустить автоматизацию" + }, + "sequence": { + "unnamed": "Безымянная автоматизация", + "steps": "{{count}} шаг(ов)", + "running": "Автоматизация выполняется...", + "run": "Запустить автоматизацию", + "finish": "Готово" + }, + "reviewTitle": "Результаты автоматизации", + "config": { + "loading": "Загрузка конфигурации инструмента...", + "noSettings": "У этого инструмента нет настраиваемых параметров.", + "title": "Настроить {{toolName}}", + "description": "Настройте параметры для этого инструмента. Эти параметры будут применены при запуске автоматизации.", + "cancel": "Отмена", + "save": "Сохранить конфигурацию" + }, + "copyToSaved": "Копировать в «Сохранённые»" + }, + "automation": { + "suggested": { + "securePdfIngestion": "Безопасный приём PDF", + "securePdfIngestionDesc": "Комплексная обработка PDF: санация документов, OCR с очисткой, конвертация в формат PDF/A для долгосрочного архива и оптимизация размера.", + "emailPreparation": "Подготовка к email", + "emailPreparationDesc": "Оптимизирует PDF для рассылки по email: сжимает файлы, делит большие документы на части по 20 МБ для совместимости с почтой и удаляет метаданные для приватности.", + "secureWorkflow": "Процесс безопасности", + "secureWorkflowDesc": "Защищает PDF-документы, удаляя потенциально вредоносный контент, такой как JavaScript и встроенные файлы, затем добавляет защиту паролем для предотвращения несанкционированного доступа. По умолчанию пароль — «password».", + "processImages": "Обработка изображений", + "processImagesDesc": "Преобразует несколько файлов изображений в один PDF-документ, затем применяет OCR для извлечения поискового текста с изображений." + } + }, + "common": { + "copy": "Копировать", + "copied": "Скопировано!", + "refresh": "Обновить", + "retry": "Повторить", + "remaining": "осталось", + "used": "использовано", + "available": "доступно", + "cancel": "Отмена" + }, + "config": { + "account": { + "overview": { + "title": "Настройки аккаунта", + "manageAccountPreferences": "Управляйте настройками аккаунта", + "guestDescription": "Вы вошли как гость. Рассмотрите возможность обновления аккаунта выше." + }, + "upgrade": { + "title": "Обновить гостевой аккаунт", + "description": "Привяжите аккаунт, чтобы сохранить историю и получить доступ к дополнительным функциям!", + "socialLogin": "Обновить через соцсеть", + "linkWith": "Привязать к", + "emailPassword": "или введите email и пароль", + "email": "Email", + "emailPlaceholder": "Введите ваш email", + "password": "Пароль (необязательно)", + "passwordPlaceholder": "Задайте пароль", + "passwordNote": "Оставьте пустым для входа только по email-подтверждению", + "upgradeButton": "Обновить аккаунт" + } + }, + "apiKeys": { + "description": "Ваш API-ключ для доступа к набору PDF-инструментов Stirling. Скопируйте его в ваш проект или обновите, чтобы сгенерировать новый.", + "publicKeyAriaLabel": "Публичный API-ключ", + "copyKeyAriaLabel": "Скопировать API-ключ", + "refreshAriaLabel": "Обновить API-ключ", + "includedCredits": "Включённые кредиты", + "purchasedCredits": "Купленные кредиты", + "totalCredits": "Всего кредитов", + "chartAriaLabel": "Использовано кредитов: включённых {{includedUsed}} из {{includedTotal}}, купленных {{purchasedUsed}} из {{purchasedTotal}}", + "nextReset": "Следующий сброс", + "lastApiUse": "Последнее использование API", + "overlayMessage": "Сгенерируйте ключ, чтобы увидеть кредиты и доступные остатки", + "label": "API-ключ", + "guestInfo": "Гостевые пользователи не получают API-ключи. Создайте аккаунт, чтобы получить API-ключ для ваших приложений.", + "goToAccount": "Перейти в аккаунт", + "refreshModal": { + "title": "Обновление API-ключей", + "warning": "⚠️ Внимание: это действие сгенерирует новые API-ключи и сделает предыдущие недействительными.", + "impact": "Любые приложения или сервисы, использующие эти ключи, перестанут работать, пока вы не обновите их новыми ключами.", + "confirmPrompt": "Вы уверены, что хотите продолжить?", + "confirmCta": "Обновить ключи" + }, + "generateError": "Не удалось сгенерировать ваш API-ключ." + } + }, + "AddAttachmentsRequest": { + "attachments": "Выбор вложений", + "info": "Выберите файлы для прикрепления к вашему PDF. Эти файлы будут внедрены и доступны через панель вложений PDF.", + "selectFiles": "Выберите файлы для вложения", + "placeholder": "Выберите файлы...", + "addMoreFiles": "Добавить ещё файлы...", + "selectedFiles": "Выбранные файлы", + "submit": "Добавить вложения", + "results": { + "title": "Результаты вложений" + } + }, + "termsAndConditions": "Условия и положения", + "logOut": "Выйти" } \ No newline at end of file diff --git a/frontend/src/components/shared/LanguageSelector.tsx b/frontend/src/components/shared/LanguageSelector.tsx index 3cf8b3b11..0ea80a79f 100644 --- a/frontend/src/components/shared/LanguageSelector.tsx +++ b/frontend/src/components/shared/LanguageSelector.tsx @@ -269,8 +269,9 @@ const LanguageSelector: React.FC = ({ position = 'bottom-
{languageOptions.map((option, index) => { - const isEnglishGB = option.value === 'en-GB'; // Currently only English GB has enough translations to use - const isDisabled = !isEnglishGB; + // Enable languages with >90% translation completion + const enabledLanguages = ['en-GB', 'ar-AR', 'de-DE', 'es-ES', 'fr-FR', 'it-IT', 'pt-BR', 'ru-RU', 'zh-CN']; + const isDisabled = !enabledLanguages.includes(option.value); return ( + python3 json_validator.py ar_AR_batch_*.json + python3 json_validator.py ar_AR_batch_1_of_3.json + python3 json_validator.py --all-batches ar_AR +""" + +import json +import sys +import argparse +import glob +from pathlib import Path + + +def get_line_context(file_path, line_num, context_lines=3): + """Get lines around the error for context""" + try: + with open(file_path, 'r', encoding='utf-8') as f: + lines = f.readlines() + + start = max(0, line_num - context_lines - 1) + end = min(len(lines), line_num + context_lines) + + context = [] + for i in range(start, end): + marker = ">>> " if i == line_num - 1 else " " + context.append(f"{marker}{i+1:4d}: {lines[i].rstrip()}") + + return "\n".join(context) + except Exception as e: + return f"Could not read context: {e}" + + +def get_character_context(file_path, char_pos, context_chars=100): + """Get characters around the error position""" + try: + with open(file_path, 'r', encoding='utf-8') as f: + content = f.read() + + start = max(0, char_pos - context_chars) + end = min(len(content), char_pos + context_chars) + + before = content[start:char_pos] + error_char = content[char_pos] if char_pos < len(content) else "EOF" + after = content[char_pos+1:end] + + return { + 'before': before, + 'error_char': error_char, + 'after': after, + 'display': f"{before}[{error_char}]{after}" + } + except Exception as e: + return None + + +def validate_json_file(file_path): + """Validate a single JSON file and return detailed error info""" + result = { + 'file': str(file_path), + 'valid': False, + 'error': None, + 'line': None, + 'column': None, + 'position': None, + 'context': None, + 'char_context': None, + 'entry_count': 0 + } + + try: + with open(file_path, 'r', encoding='utf-8') as f: + data = json.load(f) + + result['valid'] = True + result['entry_count'] = len(data) if isinstance(data, dict) else 0 + + except json.JSONDecodeError as e: + result['error'] = e.msg + result['line'] = e.lineno + result['column'] = e.colno + result['position'] = e.pos + result['context'] = get_line_context(file_path, e.lineno) + result['char_context'] = get_character_context(file_path, e.pos) + + except FileNotFoundError: + result['error'] = "File not found" + + except Exception as e: + result['error'] = str(e) + + return result + + +def print_validation_result(result, verbose=True): + """Print validation result in a formatted way""" + file_name = Path(result['file']).name + + if result['valid']: + print(f"✓ {file_name}: Valid JSON ({result['entry_count']} entries)") + else: + print(f"✗ {file_name}: Invalid JSON") + print(f" Error: {result['error']}") + + if result['line']: + print(f" Location: Line {result['line']}, Column {result['column']} (character {result['position']})") + + if verbose and result['context']: + print(f"\n Context:") + for line in result['context'].split('\n'): + print(f" {line}") + + if verbose and result['char_context']: + print(f"\n Character context:") + print(f" ...{result['char_context']['display'][-150:]}...") + print(f" Error character: {repr(result['char_context']['error_char'])}") + + print() + + +def get_common_fixes(error_msg): + """Suggest common fixes based on error message""" + fixes = [] + + if "Expecting ',' delimiter" in error_msg: + fixes.append("Missing comma between JSON entries") + fixes.append("Check for unescaped quotes inside string values") + + if "Invalid \\escape" in error_msg or "Invalid escape" in error_msg: + fixes.append("Unescaped backslash in string (use \\\\ for literal backslash)") + fixes.append("Common in regex patterns: \\d should be \\\\d") + + if "Expecting property name" in error_msg: + fixes.append("Missing or extra comma") + fixes.append("Trailing comma before closing brace") + + if "Expecting value" in error_msg: + fixes.append("Missing value after colon") + fixes.append("Extra comma") + + return fixes + + +def main(): + parser = argparse.ArgumentParser( + description='Validate JSON syntax in translation files', + formatter_class=argparse.RawDescriptionHelpFormatter, + epilog=""" +Examples: + Validate single file: + python3 json_validator.py ar_AR_batch_1_of_3.json + + Validate all batches for a language: + python3 json_validator.py --all-batches ar_AR + + Validate pattern: + python3 json_validator.py "ar_AR_batch_*.json" + + Validate multiple files: + python3 json_validator.py file1.json file2.json file3.json + """ + ) + + parser.add_argument( + 'files', + nargs='*', + help='JSON file(s) to validate (supports wildcards)' + ) + + parser.add_argument( + '--all-batches', + metavar='LANGUAGE', + help='Validate all batch files for a language (e.g., ar_AR)' + ) + + parser.add_argument( + '--quiet', + action='store_true', + help='Only show files with errors' + ) + + parser.add_argument( + '--brief', + action='store_true', + help='Brief output without context' + ) + + args = parser.parse_args() + + # Determine which files to validate + files_to_validate = [] + + if args.all_batches: + pattern = f"{args.all_batches}_batch_*.json" + files_to_validate = glob.glob(pattern) + if not files_to_validate: + print(f"No batch files found matching: {pattern}") + return 1 + elif args.files: + for file_pattern in args.files: + if '*' in file_pattern or '?' in file_pattern: + files_to_validate.extend(glob.glob(file_pattern)) + else: + files_to_validate.append(file_pattern) + else: + parser.print_help() + return 1 + + if not files_to_validate: + print("No files to validate") + return 1 + + # Sort files for consistent output + files_to_validate.sort() + + print(f"Validating {len(files_to_validate)} file(s)...\n") + + # Validate each file + results = [] + for file_path in files_to_validate: + result = validate_json_file(file_path) + results.append(result) + + if not args.quiet or not result['valid']: + print_validation_result(result, verbose=not args.brief) + + # Summary + valid_count = sum(1 for r in results if r['valid']) + invalid_count = len(results) - valid_count + + print("=" * 60) + print(f"Summary: {valid_count} valid, {invalid_count} invalid") + + # Show common fixes for errors + if invalid_count > 0: + all_errors = [r['error'] for r in results if r['error']] + unique_error_types = set(all_errors) + + print("\nCommon fixes:") + fixes_shown = set() + for error in unique_error_types: + fixes = get_common_fixes(error) + for fix in fixes: + if fix not in fixes_shown: + print(f" • {fix}") + fixes_shown.add(fix) + + return 0 if invalid_count == 0 else 1 + + +if __name__ == '__main__': + sys.exit(main()) diff --git a/scripts/translations/validate_json_structure.py b/scripts/translations/validate_json_structure.py new file mode 100644 index 000000000..3f071c5be --- /dev/null +++ b/scripts/translations/validate_json_structure.py @@ -0,0 +1,229 @@ +#!/usr/bin/env python3 +""" +Validate JSON structure and formatting of translation files. + +Checks for: +- Valid JSON syntax +- Consistent key structure with en-GB +- Missing keys +- Extra keys not in en-GB +- Malformed entries + +Usage: + python scripts/translations/validate_json_structure.py [--language LANG] +""" + +import json +import sys +from pathlib import Path +from typing import Dict, List, Set +import argparse + + +def get_all_keys(d: dict, parent_key: str = '', sep: str = '.') -> Set[str]: + """Get all keys from nested dict as dot-notation paths.""" + keys = set() + for k, v in d.items(): + new_key = f"{parent_key}{sep}{k}" if parent_key else k + keys.add(new_key) + if isinstance(v, dict): + keys.update(get_all_keys(v, new_key, sep=sep)) + return keys + + +def validate_json_file(file_path: Path) -> tuple[bool, str]: + """Validate that a file contains valid JSON.""" + try: + with open(file_path, 'r', encoding='utf-8') as f: + json.load(f) + return True, "Valid JSON" + except json.JSONDecodeError as e: + return False, f"Invalid JSON at line {e.lineno}, column {e.colno}: {e.msg}" + except Exception as e: + return False, f"Error reading file: {str(e)}" + + +def validate_structure( + en_gb_keys: Set[str], + lang_keys: Set[str], + lang_code: str +) -> Dict: + """Compare structure between en-GB and target language.""" + missing_keys = en_gb_keys - lang_keys + extra_keys = lang_keys - en_gb_keys + + return { + 'language': lang_code, + 'missing_keys': sorted(missing_keys), + 'extra_keys': sorted(extra_keys), + 'total_keys': len(lang_keys), + 'expected_keys': len(en_gb_keys), + 'missing_count': len(missing_keys), + 'extra_count': len(extra_keys) + } + + +def print_validation_result(result: Dict, verbose: bool = False): + """Print validation results in readable format.""" + lang = result['language'] + + print(f"\n{'='*100}") + print(f"Language: {lang}") + print(f"{'='*100}") + print(f" Total keys: {result['total_keys']}") + print(f" Expected keys (en-GB): {result['expected_keys']}") + print(f" Missing keys: {result['missing_count']}") + print(f" Extra keys: {result['extra_count']}") + + if result['missing_count'] == 0 and result['extra_count'] == 0: + print(f" ✅ Structure matches en-GB perfectly!") + else: + if result['missing_count'] > 0: + print(f"\n ⚠️ Missing {result['missing_count']} key(s):") + if verbose or result['missing_count'] <= 20: + for key in result['missing_keys'][:50]: + print(f" - {key}") + if result['missing_count'] > 50: + print(f" ... and {result['missing_count'] - 50} more") + else: + print(f" (use --verbose to see all)") + + if result['extra_count'] > 0: + print(f"\n ⚠️ Extra {result['extra_count']} key(s) not in en-GB:") + if verbose or result['extra_count'] <= 20: + for key in result['extra_keys'][:50]: + print(f" - {key}") + if result['extra_count'] > 50: + print(f" ... and {result['extra_count'] - 50} more") + else: + print(f" (use --verbose to see all)") + + print("-" * 100) + + +def main(): + parser = argparse.ArgumentParser( + description='Validate translation JSON structure' + ) + parser.add_argument( + '--language', + help='Specific language code to validate (e.g., es-ES)', + default=None + ) + parser.add_argument( + '--verbose', '-v', + action='store_true', + help='Show all missing/extra keys' + ) + parser.add_argument( + '--json', + action='store_true', + help='Output results as JSON' + ) + + args = parser.parse_args() + + # Define paths + locales_dir = Path('frontend/public/locales') + en_gb_path = locales_dir / 'en-GB' / 'translation.json' + + if not en_gb_path.exists(): + print(f"❌ Error: en-GB translation file not found at {en_gb_path}") + sys.exit(1) + + # Validate en-GB itself + is_valid, message = validate_json_file(en_gb_path) + if not is_valid: + print(f"❌ Error in en-GB file: {message}") + sys.exit(1) + + # Load en-GB structure + with open(en_gb_path, 'r', encoding='utf-8') as f: + en_gb = json.load(f) + + en_gb_keys = get_all_keys(en_gb) + + # Get list of languages to validate + if args.language: + languages = [args.language] + else: + languages = [ + d.name for d in locales_dir.iterdir() + if d.is_dir() and d.name != 'en-GB' and (d / 'translation.json').exists() + ] + + results = [] + json_errors = [] + + # Validate each language + for lang_code in sorted(languages): + lang_path = locales_dir / lang_code / 'translation.json' + + if not lang_path.exists(): + print(f"⚠️ Warning: {lang_code}/translation.json not found, skipping") + continue + + # First check if JSON is valid + is_valid, message = validate_json_file(lang_path) + if not is_valid: + json_errors.append({ + 'language': lang_code, + 'file': str(lang_path), + 'error': message + }) + continue + + # Load and compare structure + with open(lang_path, 'r', encoding='utf-8') as f: + lang_data = json.load(f) + + lang_keys = get_all_keys(lang_data) + result = validate_structure(en_gb_keys, lang_keys, lang_code) + results.append(result) + + # Output results + if args.json: + output = { + 'json_errors': json_errors, + 'structure_validation': results + } + print(json.dumps(output, indent=2, ensure_ascii=False)) + else: + # Print JSON errors first + if json_errors: + print("\n❌ JSON Syntax Errors:") + print("=" * 100) + for error in json_errors: + print(f"\nLanguage: {error['language']}") + print(f"File: {error['file']}") + print(f"Error: {error['error']}") + print("\n") + + # Print structure validation results + if results: + print("\n📊 Structure Validation Summary:") + print(f" Languages validated: {len(results)}") + + perfect = sum(1 for r in results if r['missing_count'] == 0 and r['extra_count'] == 0) + print(f" Perfect matches: {perfect}/{len(results)}") + + total_missing = sum(r['missing_count'] for r in results) + total_extra = sum(r['extra_count'] for r in results) + print(f" Total missing keys: {total_missing}") + print(f" Total extra keys: {total_extra}") + + for result in results: + print_validation_result(result, verbose=args.verbose) + + if not json_errors and perfect == len(results): + print("\n✅ All translations have perfect structure!") + + # Exit with error code if issues found + has_issues = len(json_errors) > 0 or any( + r['missing_count'] > 0 or r['extra_count'] > 0 for r in results + ) + sys.exit(1 if has_issues else 0) + + +if __name__ == '__main__': + main() diff --git a/scripts/translations/validate_placeholders.py b/scripts/translations/validate_placeholders.py new file mode 100644 index 000000000..ff73755ce --- /dev/null +++ b/scripts/translations/validate_placeholders.py @@ -0,0 +1,189 @@ +#!/usr/bin/env python3 +""" +Validate that translation files have the same placeholders as en-GB (source of truth). + +Usage: + python scripts/translations/validate_placeholders.py [--language LANG] [--fix] + + --language: Validate specific language (e.g., es-ES, de-DE) + --fix: Automatically remove extra placeholders (use with caution) +""" + +import json +import re +import sys +from pathlib import Path +from typing import Dict, List, Set, Tuple +import argparse + + +def find_placeholders(text: str) -> Set[str]: + """Find all placeholders in text like {n}, {{var}}, {0}, etc.""" + if not isinstance(text, str): + return set() + return set(re.findall(r'\{\{?[^}]+\}\}?', text)) + + +def flatten_dict(d: dict, parent_key: str = '', sep: str = '.') -> Dict[str, str]: + """Flatten nested dict to dot-notation keys.""" + items = [] + for k, v in d.items(): + new_key = f"{parent_key}{sep}{k}" if parent_key else k + if isinstance(v, dict): + items.extend(flatten_dict(v, new_key, sep=sep).items()) + else: + items.append((new_key, v)) + return dict(items) + + +def validate_language( + en_gb_flat: Dict[str, str], + lang_flat: Dict[str, str], + lang_code: str +) -> List[Dict]: + """Validate placeholders for a language against en-GB.""" + issues = [] + + for key in en_gb_flat: + if key not in lang_flat: + continue + + en_placeholders = find_placeholders(en_gb_flat[key]) + lang_placeholders = find_placeholders(lang_flat[key]) + + if en_placeholders != lang_placeholders: + missing = en_placeholders - lang_placeholders + extra = lang_placeholders - en_placeholders + + issue = { + 'language': lang_code, + 'key': key, + 'missing': missing, + 'extra': extra, + 'en_text': en_gb_flat[key], + 'lang_text': lang_flat[key] + } + issues.append(issue) + + return issues + + +def print_issues(issues: List[Dict], verbose: bool = False): + """Print validation issues in a readable format.""" + if not issues: + print("✅ No placeholder validation issues found!") + return + + print(f"❌ Found {len(issues)} placeholder validation issue(s):\n") + print("=" * 100) + + for i, issue in enumerate(issues, 1): + print(f"\n{i}. Language: {issue['language']}") + print(f" Key: {issue['key']}") + + if issue['missing']: + print(f" ⚠️ MISSING placeholders: {issue['missing']}") + if issue['extra']: + print(f" ⚠️ EXTRA placeholders: {issue['extra']}") + + if verbose: + print(f" EN-GB: {issue['en_text'][:150]}") + print(f" {issue['language']}: {issue['lang_text'][:150]}") + + print("-" * 100) + + +def main(): + parser = argparse.ArgumentParser( + description='Validate translation placeholder consistency' + ) + parser.add_argument( + '--language', + help='Specific language code to validate (e.g., es-ES)', + default=None + ) + parser.add_argument( + '--verbose', '-v', + action='store_true', + help='Show full text samples for each issue' + ) + parser.add_argument( + '--json', + action='store_true', + help='Output results as JSON' + ) + + args = parser.parse_args() + + # Define paths + locales_dir = Path('frontend/public/locales') + en_gb_path = locales_dir / 'en-GB' / 'translation.json' + + if not en_gb_path.exists(): + print(f"❌ Error: en-GB translation file not found at {en_gb_path}") + sys.exit(1) + + # Load en-GB (source of truth) + with open(en_gb_path, 'r', encoding='utf-8') as f: + en_gb = json.load(f) + + en_gb_flat = flatten_dict(en_gb) + + # Get list of languages to validate + if args.language: + languages = [args.language] + else: + # Validate all languages except en-GB + languages = [ + d.name for d in locales_dir.iterdir() + if d.is_dir() and d.name != 'en-GB' and (d / 'translation.json').exists() + ] + + all_issues = [] + + # Validate each language + for lang_code in sorted(languages): + lang_path = locales_dir / lang_code / 'translation.json' + + if not lang_path.exists(): + print(f"⚠️ Warning: {lang_code}/translation.json not found, skipping") + continue + + with open(lang_path, 'r', encoding='utf-8') as f: + lang_data = json.load(f) + + lang_flat = flatten_dict(lang_data) + issues = validate_language(en_gb_flat, lang_flat, lang_code) + all_issues.extend(issues) + + # Output results + if args.json: + print(json.dumps(all_issues, indent=2, ensure_ascii=False)) + else: + if all_issues: + # Group by language + by_language = {} + for issue in all_issues: + lang = issue['language'] + if lang not in by_language: + by_language[lang] = [] + by_language[lang].append(issue) + + print(f"📊 Validation Summary:") + print(f" Total issues: {len(all_issues)}") + print(f" Languages with issues: {len(by_language)}\n") + + for lang in sorted(by_language.keys()): + print(f"\n{'='*100}") + print(f"Language: {lang} ({len(by_language[lang])} issue(s))") + print(f"{'='*100}") + print_issues(by_language[lang], verbose=args.verbose) + else: + print("✅ All translations have correct placeholders!") + + # Exit with error code if issues found + sys.exit(1 if all_issues else 0) + + +if __name__ == '__main__': + main() From 85dedf4b28adb8ac7736109598999472ae852297 Mon Sep 17 00:00:00 2001 From: Anthony Stirling <77850077+Frooodle@users.noreply.github.com> Date: Wed, 1 Oct 2025 13:21:13 +0100 Subject: [PATCH 7/7] feat: add mobile slider layout for home page (#4571) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Fix mobile view toggle buttons not working when clicked (use offsetWidth instead of clientWidth) - Add flag to prevent scroll handler interference during programmatic scrolls - Move Files button from header to bottom navigation bar - Add bottom navigation bar with All Tools, Automate, and Files buttons - Add RightRail to mobile workspace view - Auto-switch to Tools view when clicking All Tools or Automate in mobile - Style bottom bar buttons as full-width clickable areas with labels 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude # Description of Changes --- ## Checklist ### General - [ ] I have read the [Contribution Guidelines](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/CONTRIBUTING.md) - [ ] I have read the [Stirling-PDF Developer Guide](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/devGuide/DeveloperGuide.md) (if applicable) - [ ] I have read the [How to add new languages to Stirling-PDF](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/devGuide/HowToAddNewLanguage.md) (if applicable) - [ ] I have performed a self-review of my own code - [ ] My changes generate no new warnings ### Documentation - [ ] I have updated relevant docs on [Stirling-PDF's doc repo](https://github.com/Stirling-Tools/Stirling-Tools.github.io/blob/main/docs/) (if functionality has heavily changed) - [ ] I have read the section [Add New Translation Tags](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/devGuide/HowToAddNewLanguage.md#add-new-translation-tags) (for new translation tags only) ### UI Changes (if applicable) - [ ] Screenshots or videos demonstrating the UI changes are attached (e.g., as comments or direct attachments in the PR) ### Testing (if applicable) - [ ] I have tested my changes locally. Refer to the [Testing Guide](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/devGuide/DeveloperGuide.md#6-testing) for more details. --------- Co-authored-by: Claude --- frontend/src/components/tools/ToolPanel.tsx | 10 +- frontend/src/pages/HomePage.css | 168 ++++++++++++++++ frontend/src/pages/HomePage.tsx | 206 ++++++++++++++++++-- 3 files changed, 364 insertions(+), 20 deletions(-) create mode 100644 frontend/src/pages/HomePage.css diff --git a/frontend/src/components/tools/ToolPanel.tsx b/frontend/src/components/tools/ToolPanel.tsx index 7f19482bd..beefc2c45 100644 --- a/frontend/src/components/tools/ToolPanel.tsx +++ b/frontend/src/components/tools/ToolPanel.tsx @@ -8,6 +8,7 @@ import { useSidebarContext } from "../../contexts/SidebarContext"; import rainbowStyles from '../../styles/rainbow.module.css'; import { ScrollArea } from '@mantine/core'; import { ToolId } from '../../types/toolId'; +import { useMediaQuery } from '@mantine/hooks'; // No props needed - component uses context @@ -15,6 +16,7 @@ export default function ToolPanel() { const { isRainbowMode } = useRainbowThemeContext(); const { sidebarRefs } = useSidebarContext(); const { toolPanelRef } = sidebarRefs; + const isMobile = useMediaQuery('(max-width: 1024px)'); // Use context-based hooks to eliminate prop drilling @@ -34,17 +36,17 @@ export default function ToolPanel() {
* { + flex: 1 1 auto; + min-height: 0; +} + +.mobile-bottom-bar { + display: flex; + align-items: center; + justify-content: space-around; + padding: 0.5rem; + border-top: 1px solid var(--border-subtle); + background: var(--bg-toolbar); + gap: 0.5rem; + position: relative; + z-index: 10; + touch-action: manipulation; +} + +.mobile-bottom-button { + flex: 1; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + gap: 0.25rem; + padding: 0.5rem; + border: none; + background: transparent; + color: var(--text-primary); + cursor: pointer; + border-radius: 0.5rem; + transition: background 0.2s ease; + touch-action: manipulation; + -webkit-tap-highlight-color: transparent; + user-select: none; + -webkit-user-select: none; + min-height: 44px; +} + +@media (hover: hover) and (pointer: fine) { + .mobile-bottom-button:hover { + background: var(--bg-hover, rgba(0, 0, 0, 0.05)); + } +} + +.mobile-bottom-button:active { + background: var(--bg-active, rgba(0, 0, 0, 0.1)); +} + +.mobile-bottom-button-label { + font-size: 0.75rem; + font-weight: 500; + color: var(--text-muted); +} diff --git a/frontend/src/pages/HomePage.tsx b/frontend/src/pages/HomePage.tsx index 26d190dfa..f283a1caa 100644 --- a/frontend/src/pages/HomePage.tsx +++ b/frontend/src/pages/HomePage.tsx @@ -1,15 +1,24 @@ +import { useCallback, useEffect, useRef, useState } from "react"; import { useTranslation } from "react-i18next"; import { useToolWorkflow } from "../contexts/ToolWorkflowContext"; -import { Group } from "@mantine/core"; +import { Group, useMantineColorScheme } from "@mantine/core"; import { useSidebarContext } from "../contexts/SidebarContext"; import { useDocumentMeta } from "../hooks/useDocumentMeta"; -import { getBaseUrl } from "../constants/app"; +import { BASE_PATH, getBaseUrl } from "../constants/app"; +import { useMediaQuery } from "@mantine/hooks"; +import AppsIcon from '@mui/icons-material/AppsRounded'; import ToolPanel from "../components/tools/ToolPanel"; import Workbench from "../components/layout/Workbench"; import QuickAccessBar from "../components/shared/QuickAccessBar"; import RightRail from "../components/shared/RightRail"; import FileManager from "../components/FileManager"; +import LocalIcon from "../components/shared/LocalIcon"; +import { useFilesModalContext } from "../contexts/FilesModalContext"; + +import "./HomePage.css"; + +type MobileView = "tools" | "workbench"; export default function HomePage() { @@ -20,7 +29,84 @@ export default function HomePage() { const { quickAccessRef } = sidebarRefs; - const { selectedTool, selectedToolKey } = useToolWorkflow(); + const { selectedTool, selectedToolKey, handleToolSelect, handleBackToTools } = useToolWorkflow(); + + const { openFilesModal } = useFilesModalContext(); + const { colorScheme } = useMantineColorScheme(); + const isMobile = useMediaQuery("(max-width: 1024px)"); + const sliderRef = useRef(null); + const [activeMobileView, setActiveMobileView] = useState("tools"); + const isProgrammaticScroll = useRef(false); + + const brandAltText = t("home.mobile.brandAlt", "Stirling PDF logo"); + const brandIconSrc = `${BASE_PATH}/branding/StirlingPDFLogoNoText${ + colorScheme === "dark" ? "Dark" : "Light" + }.svg`; + const brandTextSrc = `${BASE_PATH}/branding/StirlingPDFLogo${ + colorScheme === "dark" ? "White" : "Black" + }Text.svg`; + + const handleSelectMobileView = useCallback((view: MobileView) => { + setActiveMobileView(view); + }, []); + + useEffect(() => { + if (isMobile) { + const container = sliderRef.current; + if (container) { + isProgrammaticScroll.current = true; + const offset = activeMobileView === "tools" ? 0 : container.offsetWidth; + container.scrollTo({ left: offset, behavior: "smooth" }); + + // Re-enable scroll listener after animation completes + setTimeout(() => { + isProgrammaticScroll.current = false; + }, 500); + } + return; + } + + setActiveMobileView("tools"); + const container = sliderRef.current; + if (container) { + container.scrollTo({ left: 0, behavior: "auto" }); + } + }, [activeMobileView, isMobile]); + + useEffect(() => { + if (!isMobile) return; + + const container = sliderRef.current; + if (!container) return; + + let animationFrame = 0; + + const handleScroll = () => { + if (isProgrammaticScroll.current) { + return; + } + + if (animationFrame) { + cancelAnimationFrame(animationFrame); + } + + animationFrame = window.requestAnimationFrame(() => { + const { scrollLeft, offsetWidth } = container; + const threshold = offsetWidth / 2; + const nextView: MobileView = scrollLeft >= threshold ? "workbench" : "tools"; + setActiveMobileView((current) => (current === nextView ? current : nextView)); + }); + }; + + container.addEventListener("scroll", handleScroll, { passive: true }); + + return () => { + container.removeEventListener("scroll", handleScroll); + if (animationFrame) { + cancelAnimationFrame(animationFrame); + } + }; + }, [isMobile]); const baseUrl = getBaseUrl(); @@ -38,19 +124,107 @@ export default function HomePage() { return (
- - - - - - - + {isMobile ? ( +
+
+
+
+ + {brandAltText} +
+
+
+ + +
+ + {t('home.mobile.swipeHint', 'Swipe left or right to switch views')} + +
+
+
+
+ +
+
+
+
+
+ + +
+
+
+
+
+ + + +
+ +
+ ) : ( + + + + + + + + )}
); }