diff --git a/.github/labeler-config.yml b/.github/labeler-config.yml index f777e3ea7..d91bca361 100644 --- a/.github/labeler-config.yml +++ b/.github/labeler-config.yml @@ -16,21 +16,27 @@ Java: Back End: - changed-files: - - any-glob-to-any-file: 'src/main/java/stirling/software/SPDF/config/security/**/*' - - any-glob-to-any-file: 'src/main/java/stirling/software/SPDF/config/model/provider/**/*' + - any-glob-to-any-file: 'src/main/java/stirling/software/SPDF/config/**/*' + - any-glob-to-any-file: 'src/main/java/stirling/software/SPDF/controller/**/*' - any-glob-to-any-file: 'src/main/resources/settings.yml.template' + - any-glob-to-any-file: 'src/main/resources/application.properties' - any-glob-to-any-file: 'src/main/resources/banner.txt' + - any-glob-to-any-file: 'scripts/png_to_webp.py' + - any-glob-to-any-file: 'split_photos.py' Security: - changed-files: - any-glob-to-any-file: 'src/main/java/stirling/software/SPDF/config/security/**/*' - - any-glob-to-any-file: 'src/main/java/stirling/software/SPDF/config/model/provider/**/*' - - any-glob-to-any-file: 'src/main/java/stirling/software/SPDF/config/model/AuthenticationType.java' + - any-glob-to-any-file: 'src/main/java/stirling/software/SPDF/model/provider/**/*' + - any-glob-to-any-file: 'src/main/java/stirling/software/SPDF/model/AuthenticationType.java' + - any-glob-to-any-file: 'scripts/download-security-jar.sh' API: - changed-files: - any-glob-to-any-file: 'src/main/java/stirling/software/SPDF/controller/web/MetricsController.java' - any-glob-to-any-file: 'src/main/java/stirling/software/SPDF/controller/api/**/*' + - any-glob-to-any-file: 'scripts/png_to_webp.py' + - any-glob-to-any-file: 'split_photos.py' Documentation: - changed-files: @@ -43,6 +49,9 @@ Docker: - any-glob-to-any-file: 'Dockerfile' - any-glob-to-any-file: 'Dockerfile-*' - any-glob-to-any-file: 'exampleYmlFiles/*.yml' + - any-glob-to-any-file: 'scripts/init.sh' + - any-glob-to-any-file: 'scripts/init-without-ocr.sh' + - any-glob-to-any-file: 'scripts/installFonts.sh' Test: - changed-files: diff --git a/.github/labels.yml b/.github/labels.yml index 1d717e6f8..47f4be7f5 100644 --- a/.github/labels.yml +++ b/.github/labels.yml @@ -3,9 +3,12 @@ # # The repository labels will be automatically configured using this file and # the GitHub Action https://github.com/marketplace/actions/github-labeler. +- name: "Licenses" + color: "EDEDED" + from_name: "licenses" - name: "Back End" color: "20CE6C" - description: "Issues related to back-end development" + description: "Issues or pull requests related to back-end development" from_name: "Back end" - name: "Bug" description: "Something isn't working" @@ -24,6 +27,7 @@ from_name: "documentation" - name: "Done for next release" color: "0CDBD1" + description: "Items that are completed and will be included in the next release" - name: "Done" color: "60F13B" - name: "duplicate" @@ -37,7 +41,7 @@ description: "Fix needs to be confirmed" - name: "Front End" color: "BBD2F1" - description: "Issues related to front-end development" + description: "Issues or pull requests related to front-end development" - name: "github-actions" description: "Pull requests that update GitHub Actions code" color: "999999" @@ -91,3 +95,16 @@ description: "Testing-related issues or pull requests" - name: "Stale" color: "000000" + description: "Issues or pull requests that have become inactive" +- name: "Priority: Critical" + color: "000000" + description: "Issues or pull requests with the highest priority" +- name: "Priority: High" + color: "FF0000" + description: "Issues or pull requests with high priority" +- name: "Priority: Medium" + color: "FFFF00" + description: "Issues or pull requests with medium priority" +- name: "Priority: Low" + color: "00FF00" + description: "Issues or pull requests with low priority" diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index fd762f6d5..b5141f57a 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -8,6 +8,8 @@ Closes #(issue_number) - [ ] I have read the [Contribution Guidelines](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/CONTRIBUTING.md) - [ ] I have performed a self-review of my own code +- [ ] I have attached images of the change if it is UI based - [ ] I have commented my code, particularly in hard-to-understand areas +- [ ] If my code has heavily changed functionality I have updated relevant docs on [Stirling-PDFs doc repo](https://github.com/Stirling-Tools/Stirling-Tools.github.io/blob/main/docs/) - [ ] My changes generate no new warnings - [ ] I have read the section [Add New Translation Tags](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/HowToAddNewLanguage.md#add-new-translation-tags) (for new translation tags only) diff --git a/.github/scripts/gradle_to_chart.py b/.github/scripts/gradle_to_chart.py deleted file mode 100644 index 4d7a667fe..000000000 --- a/.github/scripts/gradle_to_chart.py +++ /dev/null @@ -1,67 +0,0 @@ -import re -import yaml - -# Paths to the files -chart_yaml_path = "chart/stirling-pdf/Chart.yaml" -gradle_path = "build.gradle" - - -def get_chart_version(path): - """ - Reads the appVersion from Chart.yaml. - - Args: - path (str): The file path to the Chart.yaml. - - Returns: - str: The appVersion if found, otherwise an empty string. - """ - with open(path, encoding="utf-8") as file: - chart_yaml = yaml.safe_load(file) - return chart_yaml.get("appVersion", "") - - -def get_gradle_version(path): - """ - Extracts the version from build.gradle. - - Args: - path (str): The file path to the build.gradle. - - Returns: - str: The version if found, otherwise an empty string. - """ - with open(path, encoding="utf-8") as file: - for line in file: - if "version =" in line: - # Extracts the value after 'version =' - return re.search(r'version\s*=\s*[\'"](.+?)[\'"]', line).group(1) - return "" - - -def update_chart_version(path, new_version): - """ - Updates the appVersion in Chart.yaml with a new version. - - Args: - path (str): The file path to the Chart.yaml. - new_version (str): The new version to update to. - """ - with open(path, encoding="utf-8") as file: - chart_yaml = yaml.safe_load(file) - chart_yaml["appVersion"] = new_version - with open(path, "w", encoding="utf-8") as file: - yaml.safe_dump(chart_yaml, file) - - -# Main logic -chart_version = get_chart_version(chart_yaml_path) -gradle_version = get_gradle_version(gradle_path) - -if chart_version != gradle_version: - print( - f"Versions do not match. Updating Chart.yaml from {chart_version} to {gradle_version}." - ) - update_chart_version(chart_yaml_path, gradle_version) -else: - print("Versions match. No update required.") diff --git a/.github/workflows/push-docker.yml b/.github/workflows/push-docker.yml index df7af98a0..334ca078a 100644 --- a/.github/workflows/push-docker.yml +++ b/.github/workflows/push-docker.yml @@ -10,6 +10,7 @@ on: permissions: contents: read packages: write + jobs: push: runs-on: ubuntu-latest @@ -66,6 +67,7 @@ jobs: images: | ${{ secrets.DOCKER_HUB_USERNAME }}/s-pdf ghcr.io/${{ steps.repoowner.outputs.lowercase }}/s-pdf + ${{ secrets.DOCKER_HUB_ORG_USERNAME }}/stirling-pdf tags: | type=raw,value=${{ steps.versionNumber.outputs.versionNumber }},enable=${{ github.ref == 'refs/heads/master' }} type=raw,value=latest,enable=${{ github.ref == 'refs/heads/master' }} @@ -93,6 +95,7 @@ jobs: images: | ${{ secrets.DOCKER_HUB_USERNAME }}/s-pdf ghcr.io/${{ steps.repoowner.outputs.lowercase }}/s-pdf + ${{ secrets.DOCKER_HUB_ORG_USERNAME }}/stirling-pdf tags: | type=raw,value=${{ steps.versionNumber.outputs.versionNumber }}-ultra-lite,enable=${{ github.ref == 'refs/heads/master' }} type=raw,value=latest-ultra-lite,enable=${{ github.ref == 'refs/heads/master' }} @@ -119,6 +122,7 @@ jobs: images: | ${{ secrets.DOCKER_HUB_USERNAME }}/s-pdf ghcr.io/${{ steps.repoowner.outputs.lowercase }}/s-pdf + ${{ secrets.DOCKER_HUB_ORG_USERNAME }}/stirling-pdf tags: | type=raw,value=${{ steps.versionNumber.outputs.versionNumber }}-fat,enable=${{ github.ref == 'refs/heads/master' }} type=raw,value=latest-fat,enable=${{ github.ref == 'refs/heads/master' }} diff --git a/.github/workflows/sync_files.yml b/.github/workflows/sync_files.yml index 07a828574..d220f92d4 100644 --- a/.github/workflows/sync_files.yml +++ b/.github/workflows/sync_files.yml @@ -14,44 +14,6 @@ permissions: pull-requests: write jobs: - sync-versions: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - name: Set up Python - uses: actions/setup-python@v5 - with: - python-version: "3.x" - - name: Install dependencies - run: pip install pyyaml - - name: Sync versions - run: python .github/scripts/gradle_to_chart.py - - name: Set up git config - run: | - git config --global user.name "github-actions[bot]" - git config --global user.email "github-actions[bot]@users.noreply.github.com" - - name: Run git add - run: | - git add . - git diff --staged --quiet || git commit -m ":floppy_disk: Sync Versions - > Made via sync_files.yml" || echo "no changes" - - name: Create Pull Request - uses: peter-evans/create-pull-request@v6 - with: - token: ${{ secrets.GITHUB_TOKEN }} - commit-message: Update files - committer: GitHub Action - author: GitHub Action - signoff: true - branch: sync_version - title: ":floppy_disk: Update Version" - body: | - Auto-generated by [create-pull-request][1] - - [1]: https://github.com/peter-evans/create-pull-request - draft: false - delete-branch: true - labels: github-actions sync-readme: runs-on: ubuntu-latest steps: diff --git a/.gitignore b/.gitignore index c5a8f2e76..b0bbfb9d3 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,7 @@ bin/ tmp/ *.tmp *.bak +*.exe *.swp *~.nib local.properties diff --git a/DATABASE.md b/DATABASE.md index efc1e467e..e8e0c838e 100644 --- a/DATABASE.md +++ b/DATABASE.md @@ -1,6 +1,7 @@ # New Database Backup and Import Functionality -**Full activation will take place on approximately January 5th, 2025!** +> [!IMPORTANT] +> **Full activation will take place on approximately January 5th, 2025!** Why is the waiting time six months? diff --git a/DeveloperGuide.md b/DeveloperGuide.md index eaed2afb3..23cb6108d 100644 --- a/DeveloperGuide.md +++ b/DeveloperGuide.md @@ -7,6 +7,7 @@ Stirling-PDF is a robust, locally hosted web-based PDF manipulation tool. This g ## 2. Project Overview Stirling-PDF is built using: + - Spring Boot + Thymeleaf - PDFBox - LibreOffice @@ -20,14 +21,17 @@ Stirling-PDF is built using: ## 3. Development Environment Setup ### Prerequisites + - Docker - Git - Java JDK 17 or later - Gradle 7.0 or later (Included within repo) ### Setup Steps + 1. Clone the repository: - ``` + + ```bash git clone https://github.com/Stirling-Tools/Stirling-PDF.git cd Stirling-PDF ``` @@ -43,10 +47,9 @@ Visit the [Lombok website](https://projectlombok.org/setup/) for installation in 5. Add environment variable For local testing you should generally be testing the full 'Security' version of Stirling-PDF to do this you must add the environment flag DOCKER_ENABLE_SECURITY=true to your system and/or IDE build/run step - ## 4. Project Structure -``` +```bash Stirling-PDF/ ├── .github/ # GitHub-specific files (workflows, issue templates) ├── configs/ # Configuration files used by stirling at runtime (generated at runtime) @@ -92,6 +95,7 @@ Stirling-PDF/ ## 5. Docker-based Development Stirling-PDF offers several Docker versions: + - Full: All features included - Ultra-Lite: Basic PDF operations only - Fat: Includes additional libraries and fonts predownloaded @@ -153,11 +157,13 @@ docker-compose -f exampleYmlFiles/docker-compose-latest-security.yml up Stirling-PDF uses different Docker images for various configurations. The build process is controlled by environment variables and uses specific Dockerfile variants. Here's how to build the Docker images: 1. Set the security environment variable: + ```bash export DOCKER_ENABLE_SECURITY=false # or true for security-enabled builds ``` 2. Build the project with Gradle: + ```bash ./gradlew clean build ``` @@ -165,16 +171,19 @@ Stirling-PDF uses different Docker images for various configurations. The build 3. Build the Docker images: For the latest version: + ```bash docker build --no-cache --pull --build-arg VERSION_TAG=alpha -t frooodle/s-pdf:latest -f ./Dockerfile . ``` For the ultra-lite version: + ```bash docker build --no-cache --pull --build-arg VERSION_TAG=alpha -t frooodle/s-pdf:latest-ultra-lite -f ./Dockerfile-ultra-lite . ``` For the fat version (with security enabled): + ```bash export DOCKER_ENABLE_SECURITY=true docker build --no-cache --pull --build-arg VERSION_TAG=alpha -t frooodle/s-pdf:latest-fat -f ./Dockerfile-fat . @@ -182,8 +191,6 @@ Stirling-PDF uses different Docker images for various configurations. The build Note: The `--no-cache` and `--pull` flags ensure that the build process uses the latest base images and doesn't use cached layers, which is useful for testing and ensuring reproducible builds. however to improve build times these can often be removed depending on your usecase - - ## 6. Testing ### Comprehensive Testing Script @@ -197,6 +204,7 @@ To run the test script: ``` This script performs the following actions: + 1. Builds all Docker images (full, ultra-lite, fat) 2. Runs each version to ensure it starts correctly 3. Executes Cucumber tests against main version and ensures feature compatibility, in the event these tests fail your PR will not be merged @@ -209,7 +217,6 @@ Note: The `test.sh` script will run automatically when you raise a PR. However, 2. Access the application at `http://localhost:8080` and manually test all features developed. - ### Local Testing (Java and UI Components) For quick iterations and development of Java backend, JavaScript, and UI components, you can run and test Stirling-PDF locally without Docker. This approach allows you to work on and verify changes to: @@ -223,7 +230,8 @@ For quick iterations and development of Java backend, JavaScript, and UI compone To run Stirling-PDF locally: 1. Compile and run the project using built in IDE methods or by running: - ``` + + ```bash ./gradlew bootRun ``` @@ -234,11 +242,11 @@ To run Stirling-PDF locally: 4. For API changes, use tools like Postman or curl to test endpoints directly. Important notes: + - Local testing doesn't include features that depend on external tools like OCRmyPDF, LibreOffice, or Python scripts. - There are currently no automated unit tests. All testing is done manually through the UI or API calls. (You are welcome to add JUnits!) - Always verify your changes in the full Docker environment before submitting pull requests, as some integrations and features will only work in the complete setup. - ## 7. Contributing 1. Fork the repository on GitHub. @@ -246,14 +254,17 @@ Important notes: 3. Make your changes and commit them with clear, descriptive messages and ensure any documentation is updated related to your changes. 4. Test your changes thoroughly in the Docker environment. 5. Run the `test.sh` script to ensure all versions build correctly and pass the Cucumber tests: + ```bash ./test.sh ``` + 6. Push your changes to your fork. -7. Submit a pull request to the main repository. +7. Submit a pull request to the main repository. 8. See additional [contributing guidelines](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/CONTRIBUTING.md) When you raise a PR: + - The `test.sh` script will run automatically against your PR. - The PR checks will verify versioning and dependency updates. - Documentation will be automatically updated for dependency changes. @@ -268,6 +279,7 @@ API documentation is available at `/swagger-ui/index.html` when running the appl ## 9. Customization Stirling-PDF can be customized through environment variables or a `settings.yml` file. Key customization options include: + - Application name and branding - Security settings - UI customization @@ -276,7 +288,8 @@ Stirling-PDF can be customized through environment variables or a `settings.yml` When using Docker, pass environment variables using the `-e` flag or in your `docker-compose.yml` file. Example: -``` + +```bash docker run -p 8080:8080 -e APP_NAME="My PDF Tool" stirling-pdf:full ``` @@ -293,16 +306,14 @@ For managing language translations that affect multiple files, Stirling-PDF prov This script helps you make consistent replacements across language files. When contributing translations: + 1. Use the helper script for multi-file changes. 2. Ensure all language files are updated consistently. 3. The PR checks will verify consistency in language file updates. Remember to test your changes thoroughly to ensure they don't break any existing functionality. - - - -# Code examples +## Code examples ### Overview of Thymeleaf @@ -311,22 +322,28 @@ Thymeleaf is a server-side Java HTML template engine. It is used in Stirling-PD ### Thymeleaf overview In Stirling-PDF, Thymeleaf is used to create HTML templates that are rendered on the server side. These templates are located in the `src/main/resources/templates` directory. Thymeleaf templates use a combination of HTML and special Thymeleaf attributes to dynamically generate content. -Some examples of this are + +Some examples of this are: + ```html or ``` + Where it uses the th:block, th: indicating its a special thymeleaf element to be used serverside in generating the html, and block being the actual element type. In this case we are inserting the ``navbar`` entry within the ``fragments/navbar.html`` fragment into the ``th:block`` element. -They can be more complex such as +They can be more complex such as: + ```html ``` + Which is the same as above but passes the parameters title and header into the fragment common.html to be used in its HTML generation Thymeleaf can also be used to loop through objects or pass things from java side into html side. + ```java @GetMapping public String newFeaturePage(Model model) { @@ -334,7 +351,9 @@ Thymeleaf can also be used to loop through objects or pass things from java side return "new-feature"; } ``` + in above example if exampleData is a list of plain java objects of class Person and within it you had id, name, age etc. You can reference it like so + ```html @@ -346,6 +365,7 @@ in above example if exampleData is a list of plain java objects of class Person ``` + This would generate n entries of tr for each person in exampleData ### Adding a New Feature to the Backend (API) @@ -397,34 +417,35 @@ This would generate n entries of tr for each person in exampleData ``` 2b. **Integrate the Service with the Controller:** - - Autowire the service class in the controller and use it to handle the API request. - ```java - package stirling.software.SPDF.controller.api; +- Autowire the service class in the controller and use it to handle the API request. - import org.springframework.beans.factory.annotation.Autowired; - import org.springframework.web.bind.annotation.GetMapping; - import org.springframework.web.bind.annotation.RequestMapping; - import org.springframework.web.bind.annotation.RestController; - import stirling.software.SPDF.service.NewFeatureService; - import io.swagger.v3.oas.annotations.Operation; - import io.swagger.v3.oas.annotations.tags.Tag; + ```java + package stirling.software.SPDF.controller.api; - @RestController - @RequestMapping("/api/v1/new-feature") - @Tag(name = "General", description = "General APIs") - public class NewFeatureController { + import org.springframework.beans.factory.annotation.Autowired; + import org.springframework.web.bind.annotation.GetMapping; + import org.springframework.web.bind.annotation.RequestMapping; + import org.springframework.web.bind.annotation.RestController; + import stirling.software.SPDF.service.NewFeatureService; + import io.swagger.v3.oas.annotations.Operation; + import io.swagger.v3.oas.annotations.tags.Tag; - @Autowired - private NewFeatureService newFeatureService; + @RestController + @RequestMapping("/api/v1/new-feature") + @Tag(name = "General", description = "General APIs") + public class NewFeatureController { - @GetMapping - @Operation(summary = "New Feature", description = "This is a new feature endpoint.") - public String newFeature() { - return newFeatureService.getNewFeatureData(); - } - } - ``` + @Autowired + private NewFeatureService newFeatureService; + + @GetMapping + @Operation(summary = "New Feature", description = "This is a new feature endpoint.") + public String newFeature() { + return newFeatureService.getNewFeatureData(); + } + } + ``` ### Adding a New Feature to the Frontend (UI) @@ -511,7 +532,6 @@ This would generate n entries of tr for each person in exampleData ``` - ## Adding New Translations to Existing Language Files in Stirling-PDF When adding a new feature or modifying existing ones in Stirling-PDF, you'll need to add new translation entries to the existing language files. Here's a step-by-step guide: @@ -522,13 +542,13 @@ Find the existing `messages.properties` files in the `src/main/resources` direct - `messages.properties` (default, usually English) - `messages_en_GB.properties` -- `messages_fr.properties` -- `messages_de.properties` +- `messages_fr_FR.properties` +- `messages_de_DE.properties` - etc. ### 2. Add New Translation Entries -Open each of these files and add your new translation entries. For example, if you're adding a new feature called "PDF Splitter", +Open each of these files and add your new translation entries. For example, if you're adding a new feature called "PDF Splitter", Use descriptive, hierarchical keys (e.g., `feature.element.description`) you might add: @@ -552,6 +572,4 @@ In your Thymeleaf templates, use the `#{key}` syntax to reference the new transl ``` - - Remember, never hard-code text in your templates or Java code. Always use translation keys to ensure proper localization. diff --git a/Endpoint-groups.md b/Endpoint-groups.md index a1a298175..0c31c5daa 100644 --- a/Endpoint-groups.md +++ b/Endpoint-groups.md @@ -1,47 +1,46 @@ -| Operation | PageOps | Convert | Security | Other | CLI | Python | OpenCV | LibreOffice | OCRmyPDF | Java | Javascript | -| ------------------- | ------- | ------- | -------- | ----- | --- | ------ | ------ | ----------- | -------- | ---- | ---------- | -| adjust-contrast | ✔️ | | | | | | | | | | ✔️ | -| auto-split-pdf | ✔️ | | | | | | | | | ✔️ | | -| crop | ✔️ | | | | | | | | | ✔️ | | -| extract-page | ✔️ | | | | | | | | | ✔️ | | -| merge-pdfs | ✔️ | | | | | | | | | ✔️ | | -| multi-page-layout | ✔️ | | | | | | | | | ✔️ | | -| pdf-organizer | ✔️ | | | | | | | | | ✔️ | ✔️ | -| pdf-to-single-page | ✔️ | | | | | | | | | ✔️ | | -| remove-pages | ✔️ | | | | | | | | | ✔️ | | -| rotate-pdf | ✔️ | | | | | | | | | ✔️ | | -| scale-pages | ✔️ | | | | | | | | | ✔️ | | -| split-pdfs | ✔️ | | | | | | | | | ✔️ | | -| file-to-pdf | | ✔️ | | | ✔️ | | | ✔️ | | | | -| img-to-pdf | | ✔️ | | | | | | | | ✔️ | | -| pdf-to-html | | ✔️ | | | ✔️ | | | ✔️ | | | | -| pdf-to-img | | ✔️ | | | | ✔️ | | | | ✔️ | | -| pdf-to-pdfa | | ✔️ | | | ✔️ | | | | ✔️ | | | -| pdf-to-markdown | | ✔️ | | | | | | | | ✔️ | | -| pdf-to-presentation | | ✔️ | | | ✔️ | | | ✔️ | | | | -| pdf-to-text | | ✔️ | | | ✔️ | | | ✔️ | | | | -| pdf-to-word | | ✔️ | | | ✔️ | | | ✔️ | | | | -| pdf-to-xml | | ✔️ | | | ✔️ | | | ✔️ | | | | -| xlsx-to-pdf | | ✔️ | | | ✔️ | | | ✔️ | | | | -| add-password | | | ✔️ | | | | | | | ✔️ | | -| add-watermark | | | ✔️ | | | | | | | ✔️ | | -| cert-sign | | | ✔️ | | | | | | | ✔️ | | -| remove-cert-sign | | | ✔️ | | | | | | | ✔️ | | -| change-permissions | | | ✔️ | | | | | | | ✔️ | | -| remove-password | | | ✔️ | | | | | | | ✔️ | | -| sanitize-pdf | | | ✔️ | | | | | | | ✔️ | | -| add-image | | | | ✔️ | | | | | | ✔️ | | -| add-page-numbers | | | | ✔️ | | | | | | ✔️ | | -| auto-rename | | | | ✔️ | | | | | | ✔️ | | -| change-metadata | | | | ✔️ | | | | | | ✔️ | | -| compare | | | | ✔️ | | | | | | | ✔️ | -| compress-pdf | | | | ✔️ | ✔️ | | | | ✔️ | | | -| extract-image-scans | | | | ✔️ | ✔️ | ✔️ | ✔️ | | | | | -| extract-images | | | | ✔️ | | | | | | ✔️ | | -| flatten | | | | ✔️ | | | | | | | ✔️ | -| get-info-on-pdf | | | | ✔️ | | | | | | ✔️ | | -| ocr-pdf | | | | ✔️ | ✔️ | | | | ✔️ | | | -| remove-blanks | | | | ✔️ | ✔️ | ✔️ | ✔️ | | | | | -| repair | | | | ✔️ | ✔️ | | | ✔️ | | | | -| show-javascript | | | | ✔️ | | | | | | | ✔️ | -| sign | | | | ✔️ | | | | | | | ✔️ | +| Operation | PageOps | Convert | Security | Other | CLI | Python | OpenCV | LibreOffice | OCRmyPDF | Java | Javascript | Unoconv | Ghostscript | +| ------------------- | ------- | ------- | -------- | ----- | --- | ------ | ------ | ----------- | -------- | ---- | ---------- | ------- | ----------- | +| adjust-contrast | ✔️ | | | | | | | | | | ✔️ | | | +| auto-split-pdf | ✔️ | | | | | | | | | ✔️ | | | | +| crop | ✔️ | | | | | | | | | ✔️ | | | | +| extract-page | ✔️ | | | | | | | | | ✔️ | | | | +| merge-pdfs | ✔️ | | | | | | | | | ✔️ | | | | +| multi-page-layout | ✔️ | | | | | | | | | ✔️ | | | | +| pdf-organizer | ✔️ | | | | | | | | | ✔️ | ✔️ | | | +| pdf-to-single-page | ✔️ | | | | | | | | | ✔️ | | | | +| remove-pages | ✔️ | | | | | | | | | ✔️ | | | | +| rotate-pdf | ✔️ | | | | | | | | | ✔️ | | | | +| scale-pages | ✔️ | | | | | | | | | ✔️ | | | | +| split-pdfs | ✔️ | | | | | | | | | ✔️ | | | | +| file-to-pdf | | ✔️ | | | ✔️ | ✔️ | | ✔️ | | | | ✔️ | | +| img-to-pdf | | ✔️ | | | | | | | | ✔️ | | | | +| pdf-to-html | | ✔️ | | | ✔️ | | | ✔️ | | | | | | +| pdf-to-img | | ✔️ | | | | ✔️ | | | | ✔️ | | | | +| pdf-to-pdfa | | ✔️ | | | ✔️ | | | | ✔️ | | | | ✔️ | +| pdf-to-markdown | | ✔️ | | | | | | | | ✔️ | | | | +| pdf-to-presentation | | ✔️ | | | ✔️ | | | ✔️ | | | | | | +| pdf-to-text | | ✔️ | | | ✔️ | | | ✔️ | | | | | | +| pdf-to-word | | ✔️ | | | ✔️ | | | ✔️ | | | | | | +| pdf-to-xml | | ✔️ | | | ✔️ | | | ✔️ | | | | | | +| add-password | | | ✔️ | | | | | | | ✔️ | | | | +| add-watermark | | | ✔️ | | | | | | | ✔️ | | | | +| cert-sign | | | ✔️ | | | | | | | ✔️ | | | | +| remove-cert-sign | | | ✔️ | | | | | | | ✔️ | | | | +| change-permissions | | | ✔️ | | | | | | | ✔️ | | | | +| remove-password | | | ✔️ | | | | | | | ✔️ | | | | +| sanitize-pdf | | | ✔️ | | | | | | | ✔️ | | | | +| add-image | | | | ✔️ | | | | | | ✔️ | | | | +| add-page-numbers | | | | ✔️ | | | | | | ✔️ | | | | +| auto-rename | | | | ✔️ | | | | | | ✔️ | | | | +| change-metadata | | | | ✔️ | | | | | | ✔️ | | | | +| compare | | | | ✔️ | | | | | | | ✔️ | | | +| compress-pdf | | | | ✔️ | ✔️ | | | | ✔️ | | | | ✔️ | +| extract-image-scans | | | | ✔️ | ✔️ | ✔️ | ✔️ | | | | | | | +| extract-images | | | | ✔️ | | | | | | ✔️ | | | | +| flatten | | | | ✔️ | | | | | | | ✔️ | | | +| get-info-on-pdf | | | | ✔️ | | | | | | ✔️ | | | | +| ocr-pdf | | | | ✔️ | ✔️ | | | | ✔️ | | | | | +| remove-blanks | | | | ✔️ | ✔️ | ✔️ | ✔️ | | | | | | | +| repair | | | | ✔️ | ✔️ | | | ✔️ | | | | | ✔️ | +| show-javascript | | | | ✔️ | | | | | | | ✔️ | | | +| sign | | | | ✔️ | | | | | | | ✔️ | | | diff --git a/FolderScanning.md b/FolderScanning.md index 140c9f5f3..66707a103 100644 --- a/FolderScanning.md +++ b/FolderScanning.md @@ -1,33 +1,41 @@ ## User Guide for Local Directory Scanning and File Processing -### Setting Up Watched Folders: +### Setting Up Watched Folders + - Create a folder where you want your files to be monitored. This is your 'watched folder'. -- The default directory for this is `./pipeline/watchedFolders/` -- Place any directories you want to be scanned into this folder, this folder should contain multiple folders each for their own tasks and pipelines. +- The default directory for this is `./pipeline/watchedFolders/`. +- Place any directories you want to be scanned into this folder. This folder should contain multiple folders, each for their own tasks and pipelines. -### Configuring Processing with JSON Files: -- In each directory you want processed (e.g `./pipeline/watchedFolders/officePrinter`), include a JSON configuration file. -- This JSON file should specify how you want the files in the directory to be handled (e.g., what operations to perform on them) which can be made, configured and downloaded from Stirling-PDF Pipeline interface.r +### Configuring Processing with JSON Files + +- In each directory you want processed (e.g., `./pipeline/watchedFolders/officePrinter`), include a JSON configuration file. +- This JSON file should specify how you want the files in the directory to be handled (e.g., what operations to perform on them). This can be made, configured, and downloaded from the Stirling-PDF Pipeline interface. + +### Automatic Scanning and Processing -### Automatic Scanning and Processing: - The system automatically checks the watched folder every minute for new directories and files to process. -- When a directory with a valid JSON configuration file is found, it begins processing the files inside as per the configuration. +- When a directory with a valid JSON configuration file is found, it begins processing the files inside according to the configuration. + +### Processing Steps -### Processing Steps: - Files in each directory are processed according to the instructions in the JSON file. -- This might involve file conversions, data filtering, renaming files, etc. If the output of a step is a zip, this zip will be automatically unzipped as it passes to next process. +- This might involve file conversions, data filtering, renaming files, etc. If the output of a step is a zip, this zip will be automatically unzipped as it passes to the next process. + +### Results and Output -### Results and Output: - After processing, the results are saved in a specified output location. This could be a different folder or location as defined in the JSON file or the default location `./pipeline/finishedFolders/`. - Each processed file is named and organized according to the rules set in the JSON configuration. -### Completion and Cleanup: +### Completion and Cleanup + - Once processing is complete, the original files in the watched folder's directory are removed. - You can find the processed files in the designated output location. -### Error Handling: +### Error Handling + - If there's an error during processing, the system will not delete the original files, allowing you to check and retry if necessary. -### User Interaction: +### User Interaction + - As a user, your main tasks are to set up the watched folders, place directories with files for processing, and create the corresponding JSON configuration files. - The system handles the rest, including scanning, processing, and outputting results. diff --git a/HowToAddNewLanguage.md b/HowToAddNewLanguage.md index ed4208b9e..7ab6f53ab 100644 --- a/HowToAddNewLanguage.md +++ b/HowToAddNewLanguage.md @@ -1,43 +1,47 @@ -


Stirling-PDF

+

+ +
+

Stirling-PDF

# How to add new languages to Stirling-PDF -Fork Stirling-PDF and make a new branch out of Main +Fork Stirling-PDF and create a new branch out of `main`. -Then add reference to the language in the navbar by adding a new language entry to the dropdown +Then add a reference to the language in the navbar by adding a new language entry to the dropdown: -https://github.com/Stirling-Tools/Stirling-PDF/blob/main/src/main/resources/templates/fragments/languages.html -and add a flag svg file to -https://github.com/Stirling-Tools/Stirling-PDF/tree/main/src/main/resources/static/images/flags -Any SVG flags are fine, i got most of mine from [here](https://flagicons.lipis.dev/) -If your language isn't represented by a flag just find whichever closely matches it, such as for Arabic i chose Saudi Arabia +- Edit the file: [languages.html](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/src/main/resources/templates/fragments/languages.html) +- Add a flag SVG file to: [flags directory](https://github.com/Stirling-Tools/Stirling-PDF/tree/main/src/main/resources/static/images/flags) -For example to add Polish you would add +Any SVG flags are fine; most of the current ones were sourced from [here](https://flagicons.lipis.dev/). If your language isn't represented by a flag, choose a similar one, such as Saudi Arabia's flag for Arabic. + +For example, to add Polish, you would add: ```html - + icon Polski ``` -The data-language-code is the code used to reference the file in the next step. +The `data-bs-language-code` is the code used to reference the file in the next step. -Start by copying the existing english property file +### Add Language Property File -[https://github.com/Stirling-Tools/Stirling-PDF/blob/main/src/main/resources/messages_en_GB.properties](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/src/main/resources/messages_en_GB.properties) +Start by copying the existing English property file: -Copy and rename it to messages_{your data-language-code here}.properties, in the polish example you would set the name to messages_pl_PL.properties +- [messages_en_GB.properties](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/src/main/resources/messages_en_GB.properties) -Then simply translate all property entries within that file and make a PR into main for others to use! +Copy and rename it to `messages_{your data-bs-language-code here}.properties`. In the Polish example, you would set the name to `messages_pl_PL.properties`. -If you do not have a java IDE i am happy to verify the changes worked once you raise PR (but won't be able to verify the translations themselves) +Then simply translate all property entries within that file and make a Pull Request (PR) into `main` for others to use! + +If you do not have a Java IDE, I am happy to verify that the changes work once you raise the PR (but I won't be able to verify the translations themselves). ## Handling Untranslatable Strings Sometimes, certain strings in the properties file may not require translation because they are the same in the target language or are universal (like names of protocols, certain terminologies, etc.). To ensure accurate statistics for language progress, these strings should be added to the `ignore_translation.toml` file located in the `scripts` directory. This will exclude them from the translation progress calculations. -For example, if the English string error=Error does not need translation in Polish, add it to the ignore_translation.toml under the Polish section: +For example, if the English string `error=Error` does not need translation in Polish, add it to the `ignore_translation.toml` under the Polish section: ```toml [pl_PL] @@ -49,7 +53,9 @@ ignore = [ ## Add New Translation Tags -- **Important**: If you add any new translation tags, they must first be added to the `messages_en_GB.properties` file. This ensures consistency across all language files. +> [!IMPORTANT] +> If you add any new translation tags, they must first be added to the `messages_en_GB.properties` file. This ensures consistency across all language files. + - New translation tags **must be added** to the `messages_en_GB.properties` file to maintain a reference for other languages. - After adding the new tags to `messages_en_GB.properties`, add and translate them in the respective language file (e.g., `messages_pl_PL.properties`). diff --git a/HowToUseOCR.md b/HowToUseOCR.md index 8607c28dd..6f168111d 100644 --- a/HowToUseOCR.md +++ b/HowToUseOCR.md @@ -3,34 +3,36 @@ This document provides instructions on how to add additional language packs for the OCR tab in Stirling-PDF, both inside and outside of Docker. ## My OCR used to work and now doesn't! -The paths have changed for the tessadata locations on new docker images, please use ``/usr/share/tessdata`` (Others should still work for backwards compatibility but might not) + +The paths have changed for the tessdata locations on new Docker images. Please use `/usr/share/tessdata` (Others should still work for backward compatibility but might not). ## How does the OCR Work -Stirling-PDF uses [OCRmyPDF](https://github.com/ocrmypdf/OCRmyPDF) which in turn uses tesseract for its text recognition. -All credit goes to them for this awesome work! + +Stirling-PDF uses [OCRmyPDF](https://github.com/ocrmypdf/OCRmyPDF), which in turn uses Tesseract for its text recognition. All credit goes to them for this awesome work! ## Language Packs Tesseract OCR supports a variety of languages. You can find additional language packs in the Tesseract GitHub repositories: -- [tessdata_fast](https://github.com/tesseract-ocr/tessdata_fast): These language packs are smaller and faster to load, but may provide lower recognition accuracy. +- [tessdata_fast](https://github.com/tesseract-ocr/tessdata_fast): These language packs are smaller and faster to load but may provide lower recognition accuracy. - [tessdata](https://github.com/tesseract-ocr/tessdata): These language packs are larger and provide better recognition accuracy, but may take longer to load. -Depending on your requirements, you can choose the appropriate language pack for your use case. By default Stirling-PDF uses the tessdata_fast eng but this can be replaced. +Depending on your requirements, you can choose the appropriate language pack for your use case. By default, Stirling-PDF uses `tessdata_fast` for English, but this can be replaced. ### Installing Language Packs 1. Download the desired language pack(s) by selecting the `.traineddata` file(s) for the language(s) you need. 2. Place the `.traineddata` files in the Tesseract tessdata directory: `/usr/share/tessdata` -# DO NOT REMOVE EXISTING ENG.TRAINEDDATA, IT'S REQUIRED. +**DO NOT REMOVE EXISTING `eng.traineddata`, IT'S REQUIRED.** -#### Docker +### Docker Setup If you are using Docker, you need to expose the Tesseract tessdata directory as a volume in order to use the additional language packs. -#### Docker Compose -Modify your `docker-compose.yml` file to include the following volume configuration: +#### Docker Compose + +Modify your `docker-compose.yml` file to include the following volume configuration: ```yaml services: @@ -40,18 +42,19 @@ services: - /location/of/trainingData:/usr/share/tessdata ``` +#### Docker Run + +Add the following to your existing Docker run command: -#### Docker run -Add the following to your existing docker run command ```bash -v /location/of/trainingData:/usr/share/tessdata ``` -#### Non-Docker -If you are not using Docker, you need to install the OCR components, including the ocrmypdf app. -You can see [OCRmyPDF install guide](https://ocrmypdf.readthedocs.io/en/latest/installation.html) +### Non-Docker Setup -Debian based systems, install languages with this command: +If you are not using Docker, you need to install the OCR components, including the `ocrmypdf` app. You can see the [OCRmyPDF install guide](https://ocrmypdf.readthedocs.io/en/latest/installation.html). + +For Debian-based systems, install languages with this command: ```bash sudo apt update &&\ @@ -65,7 +68,7 @@ apt search tesseract-ocr- dpkg-query -W tesseract-ocr- | sed 's/tesseract-ocr-//g' ``` -Fedora: +For Fedora: ```bash # All languages @@ -77,3 +80,23 @@ dnf search -C tesseract-langpack- # View installed languages: rpm -qa | grep tesseract-langpack | sed 's/tesseract-langpack-//g' ``` + +For Windows: + +Ensure ocrmypdf in installed with +``pip install ocrmypdf`` + +Additional languages must be downloaded manually: +Download desired .traineddata files from tessdata or tessdata_fast +Place them in the tessdata folder within your Tesseract installation directory +(e.g., C:\Program Files\Tesseract-OCR\tessdata) + +Verify installation: +``tesseract --list-langs`` + +You must then edit your ``/configs/settings.yml`` and change the system.tessdataDir to match the directory containing lang files +``` +system: + tessdataDir: C:/Program Files/Tesseract-OCR/tessdata # path to the directory containing the Tessdata files. This setting is relevant for Windows systems. For Windows users, this path should be adjusted to point to the appropriate directory where the Tessdata files are stored. +``` + diff --git a/LocalRunGuide.md b/LocalRunGuide.md index edb136ec2..027c7b226 100644 --- a/LocalRunGuide.md +++ b/LocalRunGuide.md @@ -1,48 +1,35 @@ - To run the application without Docker/Podman, you will need to manually install all dependencies and build the necessary components. Note that some dependencies might not be available in the standard repositories of all Linux distributions, and may require additional steps to install. The following guide assumes you have a basic understanding of using a command line interface in your operating system. -It should work on most Linux distributions and MacOS. For Windows, you might need to use Windows Subsystem for Linux (WSL) for certain steps. -The amount of dependencies is to actually reduce overall size, ie installing LibreOffice sub components rather than full LibreOffice package. +It should work on most Linux distributions and MacOS. For Windows, you might need to use Windows Subsystem for Linux (WSL) for certain steps. The amount of dependencies is to actually reduce overall size, i.e., installing LibreOffice subcomponents rather than the full LibreOffice package. -You could theoretically use a Distrobox/Toolbox, if your Distribution has old or not all Packages. But you might just as well use the Docker Container then. +You could theoretically use a Distrobox/Toolbox if your distribution has old or not all packages. But you might just as well use the Docker container then. ### Step 1: Prerequisites Install the following software, if not already installed: - Java 17 or later (21 recommended) - - Gradle 7.0 or later (included within repo so not needed on server) - - Git - - Python 3.8 (with pip) - - Make - - GCC/G++ - - Automake - - Autoconf - - libtool - - pkg-config - - zlib1g-dev - - libleptonica-dev For Debian-based systems, you can use the following command: ```bash sudo apt-get update -sudo apt-get install -y git automake autoconf libtool libleptonica-dev pkg-config zlib1g-dev make g++ openjdk-21-jdk python3 python3-pip +sudo apt-get install -y git automake autoconf libtool libleptonica-dev pkg-config zlib1g-dev make g++ openjdk-21-jdk python3 python3-pip ``` For Fedora-based systems use this command: @@ -52,6 +39,7 @@ sudo dnf install -y git automake autoconf libtool leptonica-devel pkg-config zli ``` For non-root users with Nix Package Manager, use the following command: + ```bash nix-channel --update nix-env -iA nixpkgs.jdk21 nixpkgs.git nixpkgs.python38 nixpkgs.gnumake nixpkgs.libgcc nixpkgs.automake nixpkgs.autoconf nixpkgs.libtool nixpkgs.pkg-config nixpkgs.zlib nixpkgs.leptonica @@ -63,45 +51,37 @@ For Debian and Fedora, you can build it from source using the following commands ```bash mkdir ~/.git -cd ~/.git &&\ -git clone https://github.com/agl/jbig2enc.git &&\ -cd jbig2enc &&\ -./autogen.sh &&\ -./configure &&\ -make &&\ +cd ~/.git && \ +git clone https://github.com/agl/jbig2enc.git && \ +cd jbig2enc && \ +./autogen.sh && \ +./configure && \ +make && \ sudo make install ``` For Nix, you will face `Leptonica not detected`. Bypass this by installing it directly using the following command: + ```bash nix-env -iA nixpkgs.jbig2enc ``` ### Step 3: Install Additional Software -Next we need to install LibreOffice for conversions, ocrmypdf for OCR, and opencv for pattern recognition functionality. + +Next we need to install LibreOffice for conversions, ocrmypdf for OCR, and OpenCV for pattern recognition functionality. Install the following software: - libreoffice-core - - libreoffice-common - - libreoffice-writer - - libreoffice-calc - - libreoffice-impress - - python3-uno - - unoconv - - pngquant - - unpaper - - ocrmypdf - - opencv-python-headless For Debian-based systems, you can use the following command: @@ -128,51 +108,52 @@ pip3 install uno opencv-python-headless unoconv pngquant WeasyPrint ### Step 4: Clone and Build Stirling-PDF ```bash -cd ~/.git &&\ -git clone https://github.com/Stirling-Tools/Stirling-PDF.git &&\ -cd Stirling-PDF &&\ -chmod +x ./gradlew &&\ +cd ~/.git && \ +git clone https://github.com/Stirling-Tools/Stirling-PDF.git && \ +cd Stirling-PDF && \ +chmod +x ./gradlew && \ ./gradlew build ``` -### Step 5: Move jar to desired location +### Step 5: Move Jar to Desired Location -After the build process, a `.jar` file will be generated in the `build/libs` directory. -You can move this file to a desired location, for example, `/opt/Stirling-PDF/`. -You must also move the Script folder within the Stirling-PDF repo that you have downloaded to this directory. -This folder is required for the python scripts using OpenCV. +After the build process, a `.jar` file will be generated in the `build/libs` directory. You can move this file to a desired location, for example, `/opt/Stirling-PDF/`. You must also move the Script folder within the Stirling-PDF repo that you have downloaded to this directory. This folder is required for the Python scripts using OpenCV. ```bash -sudo mkdir /opt/Stirling-PDF &&\ -sudo mv ./build/libs/Stirling-PDF-*.jar /opt/Stirling-PDF/ &&\ -sudo mv scripts /opt/Stirling-PDF/ &&\ +sudo mkdir /opt/Stirling-PDF && \ +sudo mv ./build/libs/Stirling-PDF-*.jar /opt/Stirling-PDF/ && \ +sudo mv scripts /opt/Stirling-PDF/ && \ echo "Scripts installed." ``` For non-root users, you can just keep the jar in the main directory of Stirling-PDF using the following command: + ```bash mv ./build/libs/Stirling-PDF-*.jar ./Stirling-PDF-*.jar ``` -### Step 6: Other files +### Step 6: Other Files + #### OCR -If you plan to use the OCR (Optical Character Recognition) functionality, you might need to install language packs for Tesseract if running non-english scanning. + +If you plan to use the OCR (Optical Character Recognition) functionality, you might need to install language packs for Tesseract if running non-English scanning. ##### Installing Language Packs -Easiest is to use the langpacks provided by your repositories. Skip the other steps. -Manual: +The easiest method is to use the language packs provided by your repositories. Skip the other steps if they are available. + +**Manual:** 1. Download the desired language pack(s) by selecting the `.traineddata` file(s) for the language(s) you need. 2. Place the `.traineddata` files in the Tesseract tessdata directory: `/usr/share/tessdata` -3. Please view [OCRmyPDF install guide](https://ocrmypdf.readthedocs.io/en/latest/installation.html) for more info. +3. Please view [OCRmyPDF install guide](https://ocrmypdf.readthedocs.io/en/latest/installation.html) for more info. **IMPORTANT:** DO NOT REMOVE EXISTING `eng.traineddata`, IT'S REQUIRED. -Debian based systems, install languages with this command: +**Debian-based systems**, install languages with this command: ```bash -sudo apt update &&\ +sudo apt update && \ # All languages # sudo apt install -y 'tesseract-ocr-*' @@ -183,7 +164,7 @@ apt search tesseract-ocr- dpkg-query -W tesseract-ocr- | sed 's/tesseract-ocr-//g' ``` -Fedora: +**Fedora:** ```bash # All languages @@ -196,13 +177,13 @@ dnf search -C tesseract-langpack- rpm -qa | grep tesseract-langpack | sed 's/tesseract-langpack-//g' ``` -Nix: +**Nix:** ```bash nix-env -iA nixpkgs.tesseract ``` -**Note:** Nix Package Manager pre-installs almost all the language packs when tesseract is installed. +**Note:** Nix Package Manager pre-installs almost all the language packs when Tesseract is installed. ### Step 7: Run Stirling-PDF @@ -214,11 +195,13 @@ or java -jar /opt/Stirling-PDF/Stirling-PDF-*.jar ``` -Since libreoffice, soffice, and conversion tools have their dbus_tmp_dir set as `dbus_tmp_dir="/run/user/$(id -u)/libreoffice-dbus"`, you might get the following error when using their endpoints: +Since LibreOffice, soffice, and conversion tools have their dbus_tmp_dir set as `dbus_tmp_dir="/run/user/$(id -u)/libreoffice-dbus"`, you might get the following error when using their endpoints: + ``` [Thread-7] INFO s.s.SPDF.utils.ProcessExecutor - mkdir: cannot create directory ‘/run/user/1501’: Permission denied ``` -To resolve this, before starting the Stirling-PDF, you have to set the environment variable to a directory you have write access to by using the following commands: + +To resolve this, before starting Stirling-PDF, you have to set the environment variable to a directory you have write access to by using the following commands: ```bash mkdir temp @@ -228,9 +211,10 @@ or java -jar ./Stirling-PDF-*.jar ``` -### Step 8: Adding a Desktop icon +### Step 8: Adding a Desktop Icon + +This will add a modified app starter to your app menu. -This will add a modified Appstarter to your Appmenu. ```bash location=$(pwd)/gradlew image=$(pwd)/docs/stirling-transparent.svg @@ -251,35 +235,40 @@ EOF Note: Currently the app will run in the background until manually closed. -### Optional: Changing the host and port of the application: +### Optional: Changing the Host and Port of the Application To override the default configuration, you can add the following to `/.git/Stirling-PDF/configs/custom_settings.yml` file: -```bash +```yaml server: host: 0.0.0.0 # Not working - use instead address address: 0.0.0.0 port: 3000 ``` -'-Djava.net.preferIPv4Stack=true' --> To force ipv4 only in the java starting command + +`-Djava.net.preferIPv4Stack=true` --> To force IPv4 only in the Java starting command **Note:** This file is created after the first application launch. To have it before that, you can create the directory and add the file yourself. -### Optional: Run Stirling-PDF as a service (requires root). +### Optional: Run Stirling-PDF as a Service (requires root) -First create a .env file, where you can store environment variables: -``` +First create a `.env` file, where you can store environment variables: + +```bash touch /opt/Stirling-PDF/.env ``` -In this file you can add all variables, one variable per line, as stated in the main readme (for example SYSTEM_DEFAULTLOCALE="de-DE"). -Create a new file where we store our service settings and open it with nano editor: -``` +In this file, you can add all variables, one variable per line, as stated in the main readme (for example `SYSTEM_DEFAULTLOCALE="de-DE"`). + +Create a new file where we store our service settings and open it with the nano editor: + +```bash nano /etc/systemd/system/stirlingpdf.service ``` -Paste this content, make sure to update the filename of the jar-file. Press Ctrl+S and Ctrl+X to save and exit the nano editor: -``` +Paste this content, make sure to update the filename of the jar file. Press `Ctrl+S` and `Ctrl+X` to save and exit the nano editor: + +```ini [Unit] Description=Stirling-PDF service After=syslog.target network.target @@ -303,22 +292,25 @@ WantedBy=multi-user.target Notify systemd that it has to rebuild its internal service database (you have to run this command every time you make a change in the service file): -``` +```bash sudo systemctl daemon-reload ``` -Enable the service to tell the service to start it automatically: -``` +Enable the service to tell it to start automatically: + +```bash sudo systemctl enable stirlingpdf.service ``` See the status of the service: -``` + +```bash sudo systemctl status stirlingpdf.service ``` Manually start/stop/restart the service: -``` + +```bash sudo systemctl start stirlingpdf.service sudo systemctl stop stirlingpdf.service sudo systemctl restart stirlingpdf.service @@ -326,12 +318,11 @@ sudo systemctl restart stirlingpdf.service --- -Remember to set the necessary environment variables before running the project if you want to customize the application the list can be seen in the main readme. +Remember to set the necessary environment variables before running the project if you want to customize the application. The list can be seen in the main readme. -You can do this in the terminal by using the `export` command or -D argument to java -jar command: +You can do this in the terminal by using the `export` command or `-D` argument to the Java `-jar` command: ```bash export APP_HOME_NAME="Stirling PDF" or -DAPP_HOME_NAME="Stirling PDF" -``` diff --git a/PipelineFeature.md b/PipelineFeature.md index 7edbb089d..db1daa4f0 100644 --- a/PipelineFeature.md +++ b/PipelineFeature.md @@ -1,6 +1,7 @@ # Pipeline Configuration and Usage Tutorial -- Configure the pipeline config file and input files to run files against it -- For reuse, download the config file and re-upload it when needed, or place it in /pipeline/defaultWebUIConfigs/ to auto-load in the web UI for all users + +- Configure the pipeline config file and input files to run files against it. +- For reuse, download the config file and re-upload it when needed, or place it in `/pipeline/defaultWebUIConfigs/` to auto-load in the web UI for all users. ## Steps to Configure and Use Your Pipeline @@ -26,19 +27,16 @@ - Use the **Validation** button to check your pipeline. A green indicator signifies correct setup; a pop-out error indicates issues. 8. **Download Pipeline Configuration** - - To use the configuration for folder scanning (or save it for future use and reupload it), you can also download a JSON file in this menu. You can also pre-load this for future use by placing it in ``/pipeline/defaultWebUIConfigs/``. It will then appear in the dropdown menu for all users to use. + - To use the configuration for folder scanning (or save it for future use and re-upload it), download a JSON file in this menu. You can also pre-load it for future use by placing it in `/pipeline/defaultWebUIConfigs/`. It will then appear in the dropdown menu for all users to use. 9. **Submit Files for Processing** - - If your pipeline is correctly set up close the configure menu, input the files and hit **Submit**. + - If your pipeline is correctly set up, close the configure menu, input the files, and hit **Submit**. 10. **Note on Web UI Limitations** - The current web UI version does not support operations that require multiple different types of inputs, such as adding a separate image to a PDF. - ### Current Limitations -- Cannot have more than one of the same operation -- Cannot input additional files via UI -- All files and operations run in serial mode - - \ No newline at end of file +- Cannot have more than one of the same operation. +- Cannot input additional files via UI. +- All files and operations run in serial mode. diff --git a/README.md b/README.md index a979da3b6..26ece4770 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -

+

Stirling-PDF

[![Docker Pulls](https://img.shields.io/docker/pulls/frooodle/s-pdf)](https://hub.docker.com/r/frooodle/s-pdf) @@ -7,11 +7,10 @@ [![GitHub Repo stars](https://img.shields.io/github/stars/stirling-tools/stirling-pdf?style=social)](https://github.com/Stirling-Tools/stirling-pdf) [![Deploy to DO](https://www.deploytodo.com/do-btn-blue.svg)](https://cloud.digitalocean.com/apps/new?repo=https://github.com/Stirling-Tools/Stirling-PDF/tree/digitalOcean&refcode=c3210994b1af) -[Name](https://www.ssdnodes.com/manage/aff.php?aff=2216®ister=true) -This is a robust, locally hosted web-based PDF manipulation tool using Docker. It enables you to carry out various operations on PDF files, including splitting, merging, converting, reorganizing, adding images, rotating, compressing, and more. This locally hosted web application has evolved to encompass a comprehensive set of features, addressing all your PDF requirements. +[Stirling-PDF](https://www.stirlingpdf.com) is a robust, locally hosted web-based PDF manipulation tool using Docker. It enables you to carry out various operations on PDF files, including splitting, merging, converting, reorganizing, adding images, rotating, compressing, and more. This locally hosted web application has evolved to encompass a comprehensive set of features, addressing all your PDF requirements. -Stirling PDF does not initiate any outbound calls for record-keeping or tracking purposes. +Stirling-PDF does not initiate any outbound calls for record-keeping or tracking purposes. All files and PDFs exist either exclusively on the client side, reside in server memory only during task execution, or temporarily reside in a file solely for the execution of the task. Any file downloaded by the user will have been deleted from the server by that point. @@ -19,7 +18,8 @@ All files and PDFs exist either exclusively on the client side, reside in server ## Features -- Dark mode support. +- Enterprise features like SSO Check [here](https://docs.stirlingpdf.com/Enterprise%20Edition) +- Dark mode support - Custom download options - Parallel file processing and downloads - Custom 'Pipelines' to run multiple features in a queue @@ -27,68 +27,76 @@ All files and PDFs exist either exclusively on the client side, reside in server - Optional Login and Authentication support (see [here](https://github.com/Stirling-Tools/Stirling-PDF/tree/main#login-authentication) for documentation) - Database Backup and Import (see [here](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/DATABASE.md) for documentation) -## **PDF Features** -### **Page Operations** +## PDF Features -- View and modify PDFs - View multi page PDFs with custom viewing sorting and searching. Plus on page edit features like annotate, draw and adding text and images. (Using PDF.js with Joxit and Liberation.Liberation fonts) -- Full interactive GUI for merging/splitting/rotating/moving PDFs and their pages. -- Merge multiple PDFs together into a single resultant file. -- Split PDFs into multiple files at specified page numbers or extract all pages as individual files. -- Reorganize PDF pages into different orders. -- Rotate PDFs in 90-degree increments. -- Remove pages. -- Multi-page layout (Format PDFs into a multi-paged page). -- Scale page contents size by set %. -- Adjust Contrast. -- Crop PDF. -- Auto Split PDF (With physically scanned page dividers). -- Extract page(s). -- Convert PDF to a single page. -- Overlay PDFs ontop of each other +### Page Operations -### **Conversion Operations** +- View and modify PDFs - View multi-page PDFs with custom viewing, sorting, and searching. Plus on-page edit features like annotate, draw, and adding text and images. (Using PDF.js with Joxit and Liberation fonts) +- Full interactive GUI for merging/splitting/rotating/moving PDFs and their pages +- Merge multiple PDFs into a single resultant file +- Split PDFs into multiple files at specified page numbers or extract all pages as individual files +- Reorganize PDF pages into different orders +- Rotate PDFs in 90-degree increments +- Remove pages +- Multi-page layout (format PDFs into a multi-paged page) +- Scale page contents size by set percentage +- Adjust contrast +- Crop PDF +- Auto split PDF (with physically scanned page dividers) +- Extract page(s) +- Convert PDF to a single page +- Overlay PDFs on top of each other +- PDF to single page +- Split PDF by sections -- Convert PDFs to and from images. -- Convert any common file to PDF (using LibreOffice). -- Convert PDF to Word/Powerpoint/Others (using LibreOffice). -- Convert HTML to PDF. -- URL to PDF. -- Markdown to PDF. +### Conversion Operations -### **Security & Permissions** +- Convert PDFs to and from images +- Convert any common file to PDF (using LibreOffice) +- Convert PDF to Word/PowerPoint/others (using LibreOffice) +- Convert HTML to PDF +- Convert PDF to xml +- Convert PDF to CSV +- URL to PDF +- Markdown to PDF -- Add and remove passwords. -- Change/set PDF Permissions. -- Add watermark(s). -- Certify/sign PDFs. -- Sanitize PDFs. -- Auto-redact text. +### Security & Permissions -### **Other Operations** +- Add and remove passwords +- Change/set PDF permissions +- Add watermark(s) +- Certify/sign PDFs +- Sanitize PDFs +- Auto-redact text -- Add/Generate/Write signatures. -- Repair PDFs. -- Detect and remove blank pages. -- Compare 2 PDFs and show differences in text. -- Add images to PDFs. -- Compress PDFs to decrease their filesize (Using OCRMyPDF). -- Extract images from PDF. -- Extract images from Scans. -- Add page numbers. -- Auto rename file by detecting PDF header text. -- OCR on PDF (Using OCRMyPDF). -- PDF/A conversion (Using OCRMyPDF). -- Edit metadata. -- Flatten PDFs. -- Get all information on a PDF to view or export as JSON. -- Show/Detect embedded Javascript +### Other Operations -For a overview of the tasks and the technology each uses please view [Endpoint-groups.md](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/Endpoint-groups.md) +- Add/generate/write signatures +- Split by Size or PDF +- Repair PDFs +- Detect and remove blank pages +- Compare two PDFs and show differences in text +- Add images to PDFs +- Compress PDFs to decrease their filesize (using OCRMyPDF) +- Extract images from PDF +- Remove images from PDF +- Extract images from scans +- Remove annotations +- Add page numbers +- Auto rename file by detecting PDF header text +- OCR on PDF (using OCRMyPDF) +- PDF/A conversion (using OCRMyPDF) +- Edit metadata +- Flatten PDFs +- Get all information on a PDF to view or export as JSON +- Show/detect embedded JavaScript -Demo of the app is available [here](https://stirlingpdf.io). +For an overview of the tasks and the technology each uses, please view [Endpoint-groups.md](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/Endpoint-groups.md). -## Technologies used +A demo of the app is available [here](https://stirlingpdf.io). + +## Technologies Used - Spring Boot + Thymeleaf - [PDFBox](https://github.com/apache/pdfbox/tree/trunk) @@ -99,27 +107,28 @@ Demo of the app is available [here](https://stirlingpdf.io). - [PDF.js](https://github.com/mozilla/pdf.js) - [PDF-LIB.js](https://github.com/Hopding/pdf-lib) -## How to use +## How to Use + ### Windows -For windows users download the latest Stirling-PDF.exe from our [release](https://github.com/Stirling-Tools/Stirling-PDF/releases) section or by clicking [here](https://github.com/Stirling-Tools/Stirling-PDF/releases/latest/download/Stirling-PDF.exe) + +For Windows users, download the latest Stirling-PDF.exe from our [release](https://github.com/Stirling-Tools/Stirling-PDF/releases) section or by clicking [here](https://github.com/Stirling-Tools/Stirling-PDF/releases/latest/download/Stirling-PDF.exe). ### Locally -Please view https://github.com/Stirling-Tools/Stirling-PDF/blob/main/LocalRunGuide.md +Please view the [LocalRunGuide](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/LocalRunGuide.md). ### Docker / Podman -https://hub.docker.com/r/frooodle/s-pdf +> [!NOTE] +> + +Stirling-PDF has three different versions: a full version, an ultra-lite version, and a 'fat' version. Depending on the types of features you use, you may want a smaller image to save on space. To see what the different versions offer, please look at our [version mapping](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/Version-groups.md). For people that don't mind space optimization, just use the latest tag. -Stirling PDF has 3 different versions, a Full version and ultra-Lite version as well as a 'Fat' version. Depending on the types of features you use you may want a smaller image to save on space. -To see what the different versions offer please look at our [version mapping](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/Version-groups.md) -For people that don't mind about space optimization just use the latest tag. ![Docker Image Size (tag)](https://img.shields.io/docker/image-size/frooodle/s-pdf/latest?label=Stirling-PDF%20Full) ![Docker Image Size (tag)](https://img.shields.io/docker/image-size/frooodle/s-pdf/latest-ultra-lite?label=Stirling-PDF%20Ultra-Lite) ![Docker Image Size (tag)](https://img.shields.io/docker/image-size/frooodle/s-pdf/latest-fat?label=Stirling-PDF%20Fat) -Please note in below examples you may need to change the volume paths as needed, current examples install them to the current working directory -eg ``./extraConfigs:/configs`` to ``/opt/stirlingpdf/extraConfigs:/configs`` +Please note in the examples below, you may need to change the volume paths as needed, e.g., `./extraConfigs:/configs` to `/opt/stirlingpdf/extraConfigs:/configs`. ### Docker Run @@ -129,15 +138,13 @@ docker run -d \ -v ./trainingData:/usr/share/tessdata \ -v ./extraConfigs:/configs \ -v ./logs:/logs \ +# Optional customization (not required) +# -v /location/of/customFiles:/customFiles \ -e DOCKER_ENABLE_SECURITY=false \ -e INSTALL_BOOK_AND_ADVANCED_HTML_OPS=false \ -e LANGS=en_GB \ --name stirling-pdf \ frooodle/s-pdf:latest - - Can also add these for customisation but are not required - - -v /location/of/customFiles:/customFiles \ ``` ### Docker Compose @@ -150,7 +157,7 @@ services: ports: - '8080:8080' volumes: - - ./trainingData:/usr/share/tessdata #Required for extra OCR languages + - ./trainingData:/usr/share/tessdata # Required for extra OCR languages - ./extraConfigs:/configs # - ./customFiles:/customFiles/ # - ./logs:/logs/ @@ -162,196 +169,257 @@ services: Note: Podman is CLI-compatible with Docker, so simply replace "docker" with "podman". -## Enable OCR/Compression feature +### Kubernetes -Please view https://github.com/Stirling-Tools/Stirling-PDF/blob/main/HowToUseOCR.md +See the kubernetes helm chart [here](https://github.com/Stirling-Tools/Stirling-PDF-chart) + +## Enable OCR/Compression Feature + +Please view the [HowToUseOCR.md](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/HowToUseOCR.md). + +## Reuse Stored Files + +Certain functionality like `Sign` supports pre-saved files stored at `/customFiles/signatures/`. Image files placed within here will be accessible to be used via the web UI. Currently, this supports two folder types: + +- `/customFiles/signatures/ALL_USERS`: Accessible to all users, useful for organizations where many users use the same files or for users not using authentication +- `/customFiles/signatures/{username}`: Such as `/customFiles/signatures/froodle`, accessible only to the `froodle` username, private for all others ## Supported Languages -Stirling PDF currently supports 38! +Stirling-PDF currently supports 36 languages! -| Language | Progress | -| ------------------------------------------- | -------------------------------------- | -| Arabic (العربية) (ar_AR) | ![94%](https://geps.dev/progress/94) | -| Basque (Euskara) (eu_ES) | ![57%](https://geps.dev/progress/57) | -| Bulgarian (Български) (bg_BG) | ![99%](https://geps.dev/progress/99) | -| Catalan (Català) (ca_CA) | ![44%](https://geps.dev/progress/44) | -| Croatian (Hrvatski) (hr_HR) | ![87%](https://geps.dev/progress/87) | -| Czech (Česky) (cs_CZ) | ![83%](https://geps.dev/progress/83) | -| Danish (Dansk) (da_DK) | ![91%](https://geps.dev/progress/91) | -| Dutch (Nederlands) (nl_NL) | ![88%](https://geps.dev/progress/88) | -| 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) | ![88%](https://geps.dev/progress/88) | -| German (Deutsch) (de_DE) | ![94%](https://geps.dev/progress/94) | -| Greek (Ελληνικά) (el_GR) | ![75%](https://geps.dev/progress/75) | -| Hindi (हिंदी) (hi_IN) | ![72%](https://geps.dev/progress/72) | -| Hungarian (Magyar) (hu_HU) | ![69%](https://geps.dev/progress/69) | -| Indonesia (Bahasa Indonesia) (id_ID) | ![70%](https://geps.dev/progress/70) | -| Irish (Gaeilge) (ga_IE) | ![90%](https://geps.dev/progress/90) | -| Italian (Italiano) (it_IT) | ![99%](https://geps.dev/progress/99) | -| Japanese (日本語) (ja_JP) | ![87%](https://geps.dev/progress/87) | -| Korean (한국어) (ko_KR) | ![77%](https://geps.dev/progress/77) | -| Norwegian (Norsk) (no_NB) | ![90%](https://geps.dev/progress/90) | -| Polish (Polski) (pl_PL) | ![99%](https://geps.dev/progress/99) | -| Portuguese (Português) (pt_PT) | ![72%](https://geps.dev/progress/72) | -| Portuguese Brazilian (Português) (pt_BR) | ![99%](https://geps.dev/progress/99) | -| Romanian (Română) (ro_RO) | ![92%](https://geps.dev/progress/92) | -| Russian (Русский) (ru_RU) | ![77%](https://geps.dev/progress/77) | -| Serbian Latin alphabet (Srpski) (sr_LATN_RS) | ![72%](https://geps.dev/progress/72) | -| Simplified Chinese (简体中文) (zh_CN) | ![93%](https://geps.dev/progress/93) | -| Slovakian (Slovensky) (sk_SK) | ![84%](https://geps.dev/progress/84) | -| Spanish (Español) (es_ES) | ![93%](https://geps.dev/progress/93) | -| Swedish (Svenska) (sv_SE) | ![92%](https://geps.dev/progress/92) | -| Thai (ไทย) (th_TH) | ![91%](https://geps.dev/progress/91) | -| Traditional Chinese (繁體中文) (zh_TW) | ![99%](https://geps.dev/progress/99) | -| Turkish (Türkçe) (tr_TR) | ![94%](https://geps.dev/progress/94) | -| Ukrainian (Українська) (uk_UA) | ![82%](https://geps.dev/progress/82) | -| Vietnamese (Tiếng Việt) (vi_VN) | ![91%](https://geps.dev/progress/91) | +| Language | Progress | +| -------------------------------------------- | -------------------------------------- | +| Arabic (العربية) (ar_AR) | ![98%](https://geps.dev/progress/98) | +| Basque (Euskara) (eu_ES) | ![55%](https://geps.dev/progress/55) | +| Bulgarian (Български) (bg_BG) | ![97%](https://geps.dev/progress/97) | +| Catalan (Català) (ca_CA) | ![90%](https://geps.dev/progress/90) | +| Croatian (Hrvatski) (hr_HR) | ![98%](https://geps.dev/progress/98) | +| Czech (Česky) (cs_CZ) | ![98%](https://geps.dev/progress/98) | +| Danish (Dansk) (da_DK) | ![97%](https://geps.dev/progress/97) | +| Dutch (Nederlands) (nl_NL) | ![96%](https://geps.dev/progress/96) | +| 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) | ![97%](https://geps.dev/progress/97) | +| German (Deutsch) (de_DE) | ![98%](https://geps.dev/progress/98) | +| Greek (Ελληνικά) (el_GR) | ![98%](https://geps.dev/progress/98) | +| Hindi (हिंदी) (hi_IN) | ![95%](https://geps.dev/progress/95) | +| Hungarian (Magyar) (hu_HU) | ![98%](https://geps.dev/progress/98) | +| Indonesian (Bahasa Indonesia) (id_ID) | ![98%](https://geps.dev/progress/98) | +| Irish (Gaeilge) (ga_IE) | ![88%](https://geps.dev/progress/88) | +| Italian (Italiano) (it_IT) | ![98%](https://geps.dev/progress/98) | +| Japanese (日本語) (ja_JP) | ![86%](https://geps.dev/progress/86) | +| Korean (한국어) (ko_KR) | ![96%](https://geps.dev/progress/96) | +| Norwegian (Norsk) (no_NB) | ![88%](https://geps.dev/progress/88) | +| Polish (Polski) (pl_PL) | ![97%](https://geps.dev/progress/97) | +| Portuguese (Português) (pt_PT) | ![98%](https://geps.dev/progress/98) | +| Portuguese Brazilian (Português) (pt_BR) | ![98%](https://geps.dev/progress/98) | +| Romanian (Română) (ro_RO) | ![90%](https://geps.dev/progress/90) | +| Russian (Русский) (ru_RU) | ![97%](https://geps.dev/progress/97) | +| Serbian Latin alphabet (Srpski) (sr_LATN_RS) | ![70%](https://geps.dev/progress/70) | +| Simplified Chinese (简体中文) (zh_CN) | ![91%](https://geps.dev/progress/91) | +| Slovakian (Slovensky) (sk_SK) | ![82%](https://geps.dev/progress/82) | +| Spanish (Español) (es_ES) | ![98%](https://geps.dev/progress/98) | +| Swedish (Svenska) (sv_SE) | ![97%](https://geps.dev/progress/97) | +| Thai (ไทย) (th_TH) | ![96%](https://geps.dev/progress/96) | +| Traditional Chinese (繁體中文) (zh_TW) | ![98%](https://geps.dev/progress/98) | +| Turkish (Türkçe) (tr_TR) | ![92%](https://geps.dev/progress/92) | +| Ukrainian (Українська) (uk_UA) | ![80%](https://geps.dev/progress/80) | +| Vietnamese (Tiếng Việt) (vi_VN) | ![89%](https://geps.dev/progress/89) | -## Contributing (creating issues, translations, fixing bugs, etc.) +## Contributing (Creating Issues, Translations, Fixing Bugs, etc.) -Please see our [Contributing Guide](CONTRIBUTING.md)! +Please see our [Contributing Guide](CONTRIBUTING.md). -## Customisation +## Stirling PDF Enterprise -Stirling PDF allows easy customization of the app. -Includes things like +Stirling PDF offers a Enterprise edition of its software, This is the same great software but with added features and comforts + +### Whats included + +- Prioritised Support tickets via support@stirlingpdf.com to reach directly to Stirling-PDF team for support and 1:1 meetings where applicable (Provided they come from same email domain registered with us) +- Prioritised Enhancements to Stirling-PDF where applicable +- Base SSO support +- Advanced SSO such as automated login handling (Coming very soon) +- SAML SSO (Coming very soon) +- Custom automated metadata handling +- Advanced user configurations (Coming soon) +- Plus other exciting features to come + +Check out of [docs](https://docs.stirlingpdf.com/Enterprise%20Edition) on it or our official [website](https://www.stirlingpdf.com) + +## Customization + +Stirling-PDF allows easy customization of the app, including things like: - Custom application name -- Custom slogans, icons, HTML, images CSS etc (via file overrides) +- Custom slogans, icons, HTML, images, CSS, etc. (via file overrides) -There are two options for this, either using the generated settings file ``settings.yml`` -This file is located in the ``/configs`` directory and follows standard YAML formatting +There are two options for this, either using the generated settings file `settings.yml`, which is located in the `/configs` directory and follows standard YAML formatting, or using environment variables, which would override the settings file. -Environment variables are also supported and would override the settings file -For example in the settings.yml you have +For example, in `settings.yml`, you might have: ```yaml security: enableLogin: 'true' ``` -To have this via an environment variable you would have ``SECURITY_ENABLELOGIN`` +To have this via an environment variable, you would use `SECURITY_ENABLELOGIN`. -The Current list of settings is +The current list of settings is: ```yaml security: enableLogin: false # set to 'true' to enable login - csrfDisabled: true # Set to 'true' to disable CSRF protection (not recommended for production) + csrfDisabled: true # set to 'true' to disable CSRF protection (not recommended for production) loginAttemptCount: 5 # lock user account after 5 tries; when using e.g. Fail2Ban you can deactivate the function with -1 loginResetTimeMinutes: 120 # lock account for 2 hours after x attempts loginMethod: all # 'all' (Login Username/Password and OAuth2[must be enabled and configured]), 'normal'(only Login with Username/Password) or 'oauth2'(only Login with OAuth2) initialLogin: - username: '' # Initial username for the first login - password: '' # Initial password for the first login + username: '' # initial username for the first login + password: '' # initial password for the first login oauth2: enabled: false # set to 'true' to enable login (Note: enableLogin must also be 'true' for this to work) client: keycloak: issuer: '' # URL of the Keycloak realm's OpenID Connect Discovery endpoint - clientId: '' # Client ID for Keycloak OAuth2 - clientSecret: '' # Client Secret for Keycloak OAuth2 - scopes: openid, profile, email # Scopes for Keycloak OAuth2 - useAsUsername: preferred_username # Field to use as the username for Keycloak OAuth2 + clientId: '' # client ID for Keycloak OAuth2 + clientSecret: '' # client secret for Keycloak OAuth2 + scopes: openid, profile, email # scopes for Keycloak OAuth2 + useAsUsername: preferred_username # field to use as the username for Keycloak OAuth2 google: - clientId: '' # Client ID for Google OAuth2 - clientSecret: '' # Client Secret for Google OAuth2 - scopes: https://www.googleapis.com/auth/userinfo.email, https://www.googleapis.com/auth/userinfo.profile # Scopes for Google OAuth2 - useAsUsername: email # Field to use as the username for Google OAuth2 + clientId: '' # client ID for Google OAuth2 + clientSecret: '' # client secret for Google OAuth2 + scopes: https://www.googleapis.com/auth/userinfo.email, https://www.googleapis.com/auth/userinfo.profile # scopes for Google OAuth2 + useAsUsername: email # field to use as the username for Google OAuth2 github: - clientId: '' # Client ID for GitHub OAuth2 - clientSecret: '' # Client Secret for GitHub OAuth2 - scopes: read:user # Scope for GitHub OAuth2 - useAsUsername: login # Field to use as the username for GitHub OAuth2 - issuer: '' # set to any provider that supports OpenID Connect Discovery (/.well-known/openid-configuration) end-point - clientId: '' # Client ID from your provider - clientSecret: '' # Client Secret from your provider + clientId: '' # client ID for GitHub OAuth2 + clientSecret: '' # client secret for GitHub OAuth2 + scopes: read:user # scope for GitHub OAuth2 + useAsUsername: login # field to use as the username for GitHub OAuth2 + issuer: '' # set to any provider that supports OpenID Connect Discovery (/.well-known/openid-configuration) endpoint + clientId: '' # client ID from your provider + clientSecret: '' # client secret from your provider autoCreateUser: false # set to 'true' to allow auto-creation of non-existing users blockRegistration: false # set to 'true' to deny login with SSO without prior registration by an admin - useAsUsername: email # Default is 'email'; custom fields can be used as the username - scopes: openid, profile, email # Specify the scopes for which the application will request permissions - provider: google # Set this to your OAuth provider's name, e.g., 'google' or 'keycloak' + useAsUsername: email # default is 'email'; custom fields can be used as the username + scopes: openid, profile, email # specify the scopes for which the application will request permissions + provider: google # set this to your OAuth provider's name, e.g., 'google' or 'keycloak' + saml2: + enabled: false # currently in alpha, not recommended for use yet, enableAlphaFunctionality must be set to true + autoCreateUser: false # set to 'true' to allow auto-creation of non-existing users + blockRegistration: false # set to 'true' to deny login with SSO without prior registration by an admin + registrationId: stirling + idpMetadataUri: https://dev-XXXXXXXX.okta.com/app/externalKey/sso/saml/metadata + idpSingleLogoutUrl: https://dev-XXXXXXXX.okta.com/app/dev-XXXXXXXX_stirlingpdf_1/externalKey/slo/saml + idpSingleLoginUrl: https://dev-XXXXXXXX.okta.com/app/dev-XXXXXXXX_stirlingpdf_1/externalKey/sso/saml + idpIssuer: http://www.okta.com/externalKey + idpCert: classpath:okta.crt + privateKey: classpath:saml-private-key.key + spCert: classpath:saml-public-cert.crt + +enterpriseEdition: + enabled: false # set to 'true' to enable enterprise edition + key: 00000000-0000-0000-0000-000000000000 + CustomMetadata: + autoUpdateMetadata: false # set to 'true' to automatically update metadata with below values + author: username # supports text such as 'John Doe' or types such as username to autopopulate with user's username + creator: Stirling-PDF # supports text such as 'Company-PDF' + producer: Stirling-PDF # supports text such as 'Company-PDF' + +legal: + termsAndConditions: https://www.stirlingpdf.com/terms-and-conditions # URL to the terms and conditions of your application (e.g. https://example.com/terms). Empty string to disable or filename to load from local file in static folder + privacyPolicy: https://www.stirlingpdf.com/privacy-policy # URL to the privacy policy of your application (e.g. https://example.com/privacy). Empty string to disable or filename to load from local file in static folder + accessibilityStatement: '' # URL to the accessibility statement of your application (e.g. https://example.com/accessibility). Empty string to disable or filename to load from local file in static folder + cookiePolicy: '' # URL to the cookie policy of your application (e.g. https://example.com/cookie). Empty string to disable or filename to load from local file in static folder + impressum: '' # URL to the impressum of your application (e.g. https://example.com/impressum). Empty string to disable or filename to load from local file in static folder system: - defaultLocale: 'en-US' # Set the default language (e.g. 'de-DE', 'fr-FR', etc) + defaultLocale: en-US # set the default language (e.g. 'de-DE', 'fr-FR', etc) googlevisibility: false # 'true' to allow Google visibility (via robots.txt), 'false' to disallow - enableAlphaFunctionality: false # Set to enable functionality which might need more testing before it fully goes live (This feature might make no changes) - showUpdate: true # see when a new update is available - showUpdateOnlyAdmin: false # Only admins can see when a new update is available, depending on showUpdate it must be set to 'true' - customHTMLFiles: false # enable to have files placed in /customFiles/templates override the existing template html files + enableAlphaFunctionality: false # set to enable functionality which might need more testing before it fully goes live (this feature might make no changes) + showUpdate: false # see when a new update is available + showUpdateOnlyAdmin: false # only admins can see when a new update is available, depending on showUpdate it must be set to 'true' + customHTMLFiles: false # enable to have files placed in /customFiles/templates override the existing template HTML files + tessdataDir: /usr/share/tessdata # path to the directory containing the Tessdata files. This setting is relevant for Windows systems. For Windows users, this path should be adjusted to point to the appropriate directory where the Tessdata files are stored. + enableAnalytics: undefined # set to 'true' to enable analytics, set to 'false' to disable analytics; for enterprise users, this is set to true ui: - appName: '' # Application's visible name - homeDescription: '' # Short description or tagline shown on homepage. - appNameNavbar: '' # Name displayed on the navigation bar + appName: '' # application's visible name + homeDescription: '' # short description or tagline shown on the homepage + appNameNavbar: '' # name displayed on the navigation bar endpoints: - toRemove: [] # List endpoints to disable (e.g. ['img-to-pdf', 'remove-pages']) - groupsToRemove: [] # List groups to disable (e.g. ['LibreOffice']) + toRemove: [] # list endpoints to disable (e.g. ['img-to-pdf', 'remove-pages']) + groupsToRemove: [] # list groups to disable (e.g. ['LibreOffice']) metrics: enabled: true # 'true' to enable Info APIs (`/api/*`) endpoints, 'false' to disable + +# Automatically Generated Settings (Do Not Edit Directly) +AutomaticallyGenerated: + key: example + UUID: example ``` -There is an additional config file ``/configs/custom_settings.yml`` were users familiar with java and spring application.properties can input their own settings on-top of Stirling-PDFs existing ones +There is an additional config file `/configs/custom_settings.yml` where users familiar with Java and Spring `application.properties` can input their own settings on top of Stirling-PDF's existing ones. -### Extra notes -- Endpoints. Currently, the endpoints ENDPOINTS_TO_REMOVE and GROUPS_TO_REMOVE can include comma separate lists of endpoints and groups to disable as example ENDPOINTS_TO_REMOVE=img-to-pdf,remove-pages would disable both image-to-pdf and remove pages, GROUPS_TO_REMOVE=LibreOffice Would disable all things that use LibreOffice. You can see a list of all endpoints and groups [here](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/Endpoint-groups.md) -- customStaticFilePath. Customise static files such as the app logo by placing files in the /customFiles/static/ directory. An example of customising app logo is placing a /customFiles/static/favicon.svg to override current SVG. This can be used to change any images/icons/css/fonts/js etc in Stirling-PDF -### Environment only parameters +### Extra Notes -- ``SYSTEM_ROOTURIPATH`` ie set to ``/pdf-app`` to Set the application's root URI to ``localhost:8080/pdf-app`` -- ``SYSTEM_CONNECTIONTIMEOUTMINUTES`` to set custom connection timeout values -- ``DOCKER_ENABLE_SECURITY`` to tell docker to download security jar (required as true for auth login) -- ``INSTALL_BOOK_AND_ADVANCED_HTML_OPS`` to download calibre onto stirling-pdf enabling pdf to/from book and advanced html conversion -- ``LANGS`` to define custom font libraries to install for use for document conversions +- **Endpoints**: Currently, the `ENDPOINTS_TO_REMOVE` and `GROUPS_TO_REMOVE` endpoints can include comma-separated lists of endpoints and groups to disable. For example, `ENDPOINTS_TO_REMOVE=img-to-pdf,remove-pages` would disable both image-to-pdf and remove pages, while `GROUPS_TO_REMOVE=LibreOffice` would disable all things that use LibreOffice. You can see a list of all endpoints and groups [here](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/Endpoint-groups.md). +- **customStaticFilePath**: Customize static files such as the app logo by placing files in the `/customFiles/static/` directory. An example of customizing the app logo is placing `/customFiles/static/favicon.svg` to override the current SVG. This can be used to change any `images/icons/css/fonts/js`, etc. in Stirling-PDF. + +### Environment-Only Parameters + +- `SYSTEM_ROOTURIPATH` - Set the application's root URI (e.g. `/pdf-app` to set the root URI to `localhost:8080/pdf-app`) +- `SYSTEM_CONNECTIONTIMEOUTMINUTES` - Set custom connection timeout values +- `DOCKER_ENABLE_SECURITY` - Set to `true` to download security jar (required for authentication login) +- `INSTALL_BOOK_AND_ADVANCED_HTML_OPS` - Download Calibre onto Stirling-PDF to enable PDF to/from book and advanced HTML conversion +- `LANGS` - Define custom font libraries to install for document conversions ## API -For those wanting to use Stirling-PDFs backend API to link with their own custom scripting to edit PDFs you can view all existing API documentation -[here](https://app.swaggerhub.com/apis-docs/Stirling-Tools/Stirling-PDF/) or navigate to /swagger-ui/index.html of your stirling-pdf instance for your versions documentation (Or by following the API button in your settings of Stirling-PDF) +For those wanting to use Stirling-PDF's backend API to link with their own custom scripting to edit PDFs, you can view all existing API documentation [here](https://app.swaggerhub.com/apis-docs/Stirling-Tools/Stirling-PDF/), or navigate to `/swagger-ui/index.html` of your Stirling-PDF instance for your version's documentation (or by following the API button in the settings of Stirling-PDF). -## Login authentication +## Login Authentication ![stirling-login](images/login-light.png) ### Prerequisites -- User must have the folder ./configs volumed within docker so that it is retained during updates. -- Docker users must download the security jar version by setting ``DOCKER_ENABLE_SECURITY`` to ``true`` in environment variables. -- Then either enable login via the settings.yml file or via setting ``SECURITY_ENABLE_LOGIN`` to ``true`` -- Now the initial user will be generated with username ``admin`` and password ``stirling``. On login you will be forced to change the password to a new one. You can also use the environment variables ``SECURITY_INITIALLOGIN_USERNAME`` and ``SECURITY_INITIALLOGIN_PASSWORD`` to set your own straight away (Recommended to remove them after user creation). +- User must have the folder `./configs` volumed within Docker so that it is retained during updates. +- Docker users must download the security jar version by setting `DOCKER_ENABLE_SECURITY` to `true` in environment variables. +- Then either enable login via the `settings.yml` file or set `SECURITY_ENABLE_LOGIN` to `true`. +- Now the initial user will be generated with username `admin` and password `stirling`. On login, you will be forced to change the password to a new one. You can also use the environment variables `SECURITY_INITIALLOGIN_USERNAME` and `SECURITY_INITIALLOGIN_PASSWORD` to set your own credentials straight away (recommended to remove them after user creation). -Once the above has been done, on restart, a new stirling-pdf-DB.mv.db will show if everything worked. +Once the above has been done, on restart, a new `stirling-pdf-DB.mv.db` will show if everything worked. -When you login to Stirling PDF you will be redirected to /login page to login with those default credentials. After login everything should function as normal +When you log in to Stirling-PDF, you will be redirected to the `/login` page to log in with those default credentials. After login, everything should function as normal. -To access your account settings go to Account settings in the settings cog menu (top right in navbar) This Account settings menu is also where you find your API key. +To access your account settings, go to Account Settings in the settings cog menu (top right in the navbar). This Account Settings menu is also where you find your API key. -To add new users go to the bottom of Account settings and hit 'Admin Settings', here you can add new users. The different roles mentioned within this are for rate limiting. This is a Work in progress which will be expanding on more in future +To add new users, go to the bottom of Account Settings and hit 'Admin Settings'. Here you can add new users. The different roles mentioned within this are for rate limiting. This is a work in progress and will be expanded on more in the future. -For API usage you must provide a header with 'X-API-Key' and the associated API key for that user. +For API usage, you must provide a header with `X-API-Key` and the associated API key for that user. ## FAQ ### Q1: What are your planned features? -- Progress bar/Tracking -- Full custom logic pipelines to combine multiple operations together. -- Folder support with auto scanning to perform operations on -- Redact text (Via UI not just automated way) -- Add Forms -- Multi page layout (Stich PDF pages together) support x rows y columns and custom page sizing +- Progress bar/tracking +- Full custom logic pipelines to combine multiple operations together +- Folder support with auto-scanning to perform operations on +- Redact text (via UI, not just automated) +- Add forms +- Multi-page layout (stitch PDF pages together) support x rows y columns and custom page sizing - Fill forms manually or automatically -### Q2: Why is my application downloading .htm files? +### Q2: Why is my application downloading .htm files? Why am i getting HTTP error 413? -This is an issue caused commonly by your NGINX configuration. The default file upload size for NGINX is 1MB, you need to add the following in your Nginx sites-available file. ``client_max_body_size SIZE;`` Where "SIZE" is 50M for example for 50MB files. +This is an issue commonly caused by your NGINX configuration. The default file upload size for NGINX is 1MB. You need to add the following in your Nginx sites-available file: `client_max_body_size SIZE;` (where "SIZE" is 50M for example for 50MB files). -### Q3: Why is my download timing out +### Q3: Why is my download timing out? -NGINX has timeout values by default so if you are running Stirling-PDF behind NGINX you may need to set a timeout value such as adding the config ``proxy_read_timeout 3600;`` +NGINX has timeout values by default, so if you are running Stirling-PDF behind NGINX, you may need to set a timeout value, such as adding the config `proxy_read_timeout 3600;`. diff --git a/Version-groups.md b/Version-groups.md index 0e1bc0927..93c5b4b0e 100644 --- a/Version-groups.md +++ b/Version-groups.md @@ -1,7 +1,7 @@ |All versions in a Docker environment can download Calibre as a optional extra at runtime to support `book-to-pdf` and `pdf-to-book` using parameter ``INSTALL_BOOK_AND_ADVANCED_HTML_OPS``. -The 'Fat' container contains all those found in 'Full' with security jar along with this Calibre install. +The 'Fat' container contains all those found in 'Full' with security jar along with this Calibre install. -Technology | Ultra-Lite | Full | +| Technology | Ultra-Lite | Full | | ---------- | :--------: | :---: | | Java | ✔️ | ✔️ | | JavaScript | ✔️ | ✔️ | @@ -54,3 +54,15 @@ Technology | Ultra-Lite | Full | | ocr-pdf | | ✔️ | | pdf-to-pdfa | | ✔️ | | remove-blanks | | ✔️ | +pdf-to-text | ✔️ | ✔️ +pdf-to-html | | ✔️ +pdf-to-word | | ✔️ +pdf-to-presentation | | ✔️ +pdf-to-xml | | ✔️ +remove-annotations | ✔️ | ✔️ +remove-cert-sign | ✔️ | ✔️ +remove-image-pdf | ✔️ | ✔️ +file-to-pdf | | ✔️ +html-to-pdf | | ✔️ +url-to-pdf | | ✔️ +repair | | ✔️ diff --git a/build.gradle b/build.gradle index 35ca0d6bf..6d321618d 100644 --- a/build.gradle +++ b/build.gradle @@ -1,6 +1,6 @@ plugins { id "java" - id "org.springframework.boot" version "3.3.4" + id "org.springframework.boot" version "3.3.5" id "io.spring.dependency-management" version "1.1.6" id "org.springdoc.openapi-gradle-plugin" version "1.8.0" id "io.swagger.swaggerhub" version "1.3.2" @@ -13,7 +13,7 @@ plugins { import com.github.jk1.license.render.* ext { - springBootVersion = "3.3.4" + springBootVersion = "3.3.5" pdfboxVersion = "3.0.3" logbackVersion = "1.5.7" imageioVersion = "3.12.0" @@ -22,7 +22,7 @@ ext { } group = "stirling.software" -version = "0.30.1" +version = "0.32.0" java { // 17 is lowest but we support and recommend 21 @@ -78,7 +78,7 @@ launch4j { errTitle="Encountered error, Do you have Java 21?" downloadUrl="https://download.oracle.com/java/21/latest/jdk-21_windows-x64_bin.exe" - variables=["BROWSER_OPEN=true", "ENDPOINTS_GROUPS_TO_REMOVE=CLI"] + variables=["BROWSER_OPEN=true"] jreMinVersion="17" mutexName="Stirling-PDF" @@ -137,11 +137,11 @@ dependencies { if (System.getenv("DOCKER_ENABLE_SECURITY") != "false") { implementation "org.springframework.boot:spring-boot-starter-security:$springBootVersion" - runtimeOnly "org.thymeleaf.extras:thymeleaf-extras-springsecurity5:3.1.2.RELEASE" + implementation "org.thymeleaf.extras:thymeleaf-extras-springsecurity5:3.1.2.RELEASE" implementation "org.springframework.boot:spring-boot-starter-data-jpa:$springBootVersion" implementation "org.springframework.boot:spring-boot-starter-oauth2-client:$springBootVersion" - implementation 'org.springframework.security:spring-security-saml2-service-provider:6.3.3' + implementation 'org.springframework.security:spring-security-saml2-service-provider:6.3.4' implementation 'com.unboundid.product.scim2:scim2-sdk-client:2.3.5' //2.2.x requires rebuild of DB file.. need migration path runtimeOnly "com.h2database:h2:2.1.214" @@ -154,6 +154,8 @@ dependencies { implementation "org.springframework.security:spring-security-saml2-service-provider" implementation 'com.coveo:saml-client:5.0.0' + + } testImplementation "org.springframework.boot:spring-boot-starter-test:$springBootVersion" @@ -179,6 +181,9 @@ dependencies { runtimeOnly "com.twelvemonkeys.imageio:imageio-webp:$imageioVersion" // runtimeOnly "com.twelvemonkeys.imageio:imageio-xwd:$imageioVersion" + // Image metadata extractor + implementation "com.drewnoakes:metadata-extractor:2.19.0" + implementation "commons-io:commons-io:2.17.0" implementation "org.springdoc:springdoc-openapi-starter-webmvc-ui:2.2.0" //general PDF diff --git a/chart/stirling-pdf/Chart.yaml b/chart/stirling-pdf/Chart.yaml deleted file mode 100644 index 01ad871a1..000000000 --- a/chart/stirling-pdf/Chart.yaml +++ /dev/null @@ -1,16 +0,0 @@ -apiVersion: v2 -appVersion: 0.30.1 -description: locally hosted web application that allows you to perform various operations - on PDF files -home: https://github.com/Stirling-Tools/Stirling-PDF -keywords: -- stirling-pdf -- helm -- charts repo -maintainers: -- name: Stirling-Tools - url: https://github.com/Stirling-Tools/Stirling-PDF -name: stirling-pdf-chart -sources: -- https://github.com/Stirling-Tools/Stirling-PDF -version: 1.0.0 diff --git a/chart/stirling-pdf/templates/NOTES.txt b/chart/stirling-pdf/templates/NOTES.txt deleted file mode 100644 index 3b432f00e..000000000 --- a/chart/stirling-pdf/templates/NOTES.txt +++ /dev/null @@ -1,30 +0,0 @@ -** Please be patient while the chart is being deployed ** - -Get the stirlingpdf URL by running: - -{{- if contains "NodePort" .Values.service.type }} - - export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ template "stirlingpdf.fullname" . }}) - export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath="{.items[0].status.addresses[0].address}") - echo http://$NODE_IP:$NODE_PORT/ - -{{- else if contains "LoadBalancer" .Values.service.type }} - -** Please ensure an external IP is associated to the {{ template "stirlingpdf.fullname" . }} service before proceeding ** -** Watch the status using: kubectl get svc --namespace {{ .Release.Namespace }} -w {{ template "stirlingpdf.fullname" . }} ** - - export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ template "stirlingpdf.fullname" . }} -o jsonpath='{.status.loadBalancer.ingress[0].ip}') - echo http://$SERVICE_IP:{{ .Values.service.externalPort }}/ - -OR - - export SERVICE_HOST=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ template "stirlingpdf.fullname" . }} -o jsonpath='{.status.loadBalancer.ingress[0].hostname}') - echo http://$SERVICE_HOST:{{ .Values.service.externalPort }}/ - -{{- else if contains "ClusterIP" .Values.service.type }} - - export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l "app={{ template "stirlingpdf.name" . }}" -l "release={{ .Release.Name }}" -o jsonpath="{.items[0].metadata.name}") - echo http://127.0.0.1:8080/ - kubectl port-forward $POD_NAME 8080:8080 --namespace {{ .Release.Namespace }} - -{{- end }} diff --git a/chart/stirling-pdf/templates/_helpers.tpl b/chart/stirling-pdf/templates/_helpers.tpl deleted file mode 100644 index 4c8626044..000000000 --- a/chart/stirling-pdf/templates/_helpers.tpl +++ /dev/null @@ -1,129 +0,0 @@ -{{/* -Expand the name of the chart. -*/}} -{{- define "stirlingpdf.name" -}} -{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }} -{{- end }} - -{{/* -Create a default fully qualified app name. -We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). -If release name contains chart name it will be used as a full name. -*/}} -{{- define "stirlingpdf.fullname" -}} -{{- if .Values.fullnameOverride }} -{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }} -{{- else }} -{{- $name := default .Chart.Name .Values.nameOverride }} -{{- if contains $name .Release.Name }} -{{- .Release.Name | trunc 63 | trimSuffix "-" }} -{{- else }} -{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }} -{{- end }} -{{- end }} -{{- end }} - -{{- /* -Create chart name and version as used by the chart label. - -It does minimal escaping for use in Kubernetes labels. - -Example output: - -stirlingpdf-0.4.5 -*/ -}} -{{- define "stirlingpdf.chart" -}} -{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} -{{- end -}} - -{{/* -Common labels -*/}} -{{- define "stirlingpdf.labels" -}} -helm.sh/chart: {{ include "stirlingpdf.chart" . }} -{{ include "stirlingpdf.selectorLabels" . }} -{{- if .Chart.AppVersion }} -app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} -{{- end }} -{{- if .Values.commonLabels}} -{{ toYaml .Values.commonLabels }} -{{- end }} -app.kubernetes.io/managed-by: {{ .Release.Service }} -{{- end }} - -{{/* -Selector labels -*/}} -{{- define "stirlingpdf.selectorLabels" -}} -app.kubernetes.io/name: {{ include "stirlingpdf.name" . }} -app.kubernetes.io/instance: {{ .Release.Name }} -{{- end }} - -{{/* -Create the name of the service account to use -*/}} -{{- define "stirlingpdf.serviceAccountName" -}} -{{- if .Values.serviceAccount.create }} -{{- default (include "stirlingpdf.fullname" .) .Values.serviceAccount.name }} -{{- else }} -{{- default "default" .Values.serviceAccount.name }} -{{- end }} -{{- end }} - -{{/* -Return the proper image name to change the volume permissions -*/}} -{{- define "stirlingpdf.volumePermissions.image" -}} -{{- $registryName := .Values.volumePermissions.image.registry -}} -{{- $repositoryName := .Values.volumePermissions.image.repository -}} -{{- $tag := .Values.volumePermissions.image.tag | toString -}} -{{/* -Helm 2.11 supports the assignment of a value to a variable defined in a different scope, -but Helm 2.9 and 2.10 doesn't support it, so we need to implement this if-else logic. -Also, we can't use a single if because lazy evaluation is not an option -*/}} -{{- if .Values.global }} - {{- if .Values.global.imageRegistry }} - {{- printf "%s/%s:%s" .Values.global.imageRegistry $repositoryName $tag -}} - {{- else -}} - {{- printf "%s/%s:%s" $registryName $repositoryName $tag -}} - {{- end -}} -{{- else -}} - {{- printf "%s/%s:%s" $registryName $repositoryName $tag -}} -{{- end -}} -{{- end -}} - -{{/* -Return the proper Docker Image Registry Secret Names -*/}} -{{- define "stirlingpdf.imagePullSecrets" -}} -{{/* -Helm 2.11 supports the assignment of a value to a variable defined in a different scope, -but Helm 2.9 and 2.10 does not support it, so we need to implement this if-else logic. -Also, we can not use a single if because lazy evaluation is not an option -*/}} -{{- if .Values.global }} -{{- if .Values.global.imagePullSecrets }} -imagePullSecrets: -{{- range .Values.global.imagePullSecrets }} - - name: {{ . }} -{{- end }} -{{- else if or .Values.image.pullSecrets .Values.volumePermissions.image.pullSecrets }} -imagePullSecrets: -{{- range .Values.image.pullSecrets }} - - name: {{ . }} -{{- end }} -{{- range .Values.volumePermissions.image.pullSecrets }} - - name: {{ . }} -{{- end }} -{{- end -}} -{{- else if or .Values.image.pullSecrets .Values.volumePermissions.image.pullSecrets }} -imagePullSecrets: -{{- range .Values.image.pullSecrets }} - - name: {{ . }} -{{- end }} -{{- range .Values.volumePermissions.image.pullSecrets }} - - name: {{ . }} -{{- end }} -{{- end -}} -{{- end -}} \ No newline at end of file diff --git a/chart/stirling-pdf/templates/deployment.yaml b/chart/stirling-pdf/templates/deployment.yaml deleted file mode 100644 index d91e80977..000000000 --- a/chart/stirling-pdf/templates/deployment.yaml +++ /dev/null @@ -1,131 +0,0 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - name: {{ include "stirlingpdf.fullname" . }} - {{- with .Values.deployment.annotations }} - annotations: - {{- toYaml . | nindent 4 }} - {{- end }} - labels: - {{- include "stirlingpdf.labels" . | nindent 4 }} - {{- if .Values.deployment.labels }} - {{- toYaml .Values.deployment.labels | nindent 4 }} - {{- end }} -spec: - selector: - matchLabels: - {{- include "stirlingpdf.selectorLabels" . | nindent 6 }} - replicas: {{ .Values.replicaCount }} - strategy: -{{ toYaml .Values.strategy | indent 4 }} - revisionHistoryLimit: 10 - template: - metadata: - {{- with .Values.podAnnotations }} - annotations: - {{- toYaml . | nindent 8 }} - {{- end }} - labels: - {{- include "stirlingpdf.selectorLabels" . | nindent 8 }} - {{- if .Values.podLabels }} - {{- toYaml .Values.podLabels | nindent 8 }} - {{- end }} - spec: - {{- if .Values.priorityClassName }} - priorityClassName: "{{ .Values.priorityClassName }}" - {{- end }} - {{- if .Values.securityContext.enabled }} - securityContext: - fsGroup: {{ .Values.securityContext.fsGroup }} - {{- if .Values.securityContext.runAsNonRoot }} - runAsNonRoot: {{ .Values.securityContext.runAsNonRoot }} - {{- end }} - {{- if .Values.securityContext.supplementalGroups }} - supplementalGroups: {{ .Values.securityContext.supplementalGroups }} - {{- end }} - {{- else if .Values.persistence.enabled }} - initContainers: - - name: volume-permissions - image: {{ template "stirlingpdf.volumePermissions.image" . }} - imagePullPolicy: "{{ .Values.volumePermissions.image.pullPolicy }}" - securityContext: - {{- toYaml .Values.containerSecurityContext | nindent 10 }} - command: ['sh', '-c', 'chown -R {{ .Values.securityContext.fsGroup }}:{{ .Values.securityContext.fsGroup }} {{ .Values.persistence.path }}'] - volumeMounts: - - mountPath: {{ .Values.persistence.path }} - name: storage-volume - {{- end }} -{{- include "stirlingpdf.imagePullSecrets" . | indent 6 }} - containers: - - name: {{ .Chart.Name }} - image: {{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }} - imagePullPolicy: {{ .Values.image.pullPolicy }} - securityContext: - {{- toYaml .Values.containerSecurityContext | nindent 10 }} - env: - - name: SYSTEM_ROOTURIPATH - value: {{ .Values.rootPath}} -{{- if .Values.envs }} -{{ toYaml .Values.envs | indent 8 }} -{{- end }} -{{- if .Values.extraArgs }} - args: -{{ toYaml .Values.extraArgs | indent 8 }} -{{- end }} - ports: - - name: http - containerPort: 8080 - livenessProbe: - httpGet: - path: {{ .Values.rootPath}} - port: http -{{ toYaml .Values.probes.livenessHttpGetConfig | indent 12 }} -{{ toYaml .Values.probes.liveness | indent 10 }} - readinessProbe: - httpGet: - path: {{ .Values.rootPath}} - port: http -{{ toYaml .Values.probes.readinessHttpGetConfig | indent 12 }} -{{ toYaml .Values.probes.readiness | indent 10 }} - volumeMounts: -{{- if .Values.deployment.extraVolumeMounts }} - {{- toYaml .Values.deployment.extraVolumeMounts | nindent 8 }} -{{- end }} -{{- if .Values.deployment.sidecarContainers }} -{{- range $name, $spec := .Values.deployment.sidecarContainers }} - - name: {{ $name }} -{{- toYaml $spec | nindent 8 }} -{{- end }} -{{- end }} - {{- with .Values.resources }} - resources: -{{ toYaml . | indent 10 }} - {{- end }} - {{- with .Values.nodeSelector }} - nodeSelector: -{{ toYaml . | indent 8 }} - {{- end }} - {{- with .Values.affinity }} - affinity: -{{ toYaml . | indent 8 }} - {{- end }} - {{- with .Values.tolerations }} - tolerations: -{{ toYaml . | indent 8 }} - {{- end }} - {{- if .Values.schedulerName }} - schedulerName: {{ .Values.schedulerName }} - {{- end }} - serviceAccountName: {{ include "stirlingpdf.serviceAccountName" . }} - automountServiceAccountToken: {{ .Values.serviceAccount.automountServiceAccountToken }} - volumes: - {{- if .Values.deployment.extraVolumes }} - {{- toYaml .Values.deployment.extraVolumes | nindent 6 }} - {{- end }} - - name: storage-volume - {{- if .Values.persistence.enabled }} - persistentVolumeClaim: - claimName: {{ .Values.persistence.existingClaim | default (include "stirlingpdf.fullname" .) }} - {{- else }} - emptyDir: {} - {{- end }} diff --git a/chart/stirling-pdf/templates/ingress.yaml b/chart/stirling-pdf/templates/ingress.yaml deleted file mode 100644 index c09fef68e..000000000 --- a/chart/stirling-pdf/templates/ingress.yaml +++ /dev/null @@ -1,85 +0,0 @@ -{{- if .Values.ingress.enabled }} -{{- $servicePort := .Values.service.externalPort -}} -{{- $serviceName := include "stirlingpdf.fullname" . -}} -{{- $ingressExtraPaths := .Values.ingress.extraPaths -}} ---- -{{- if semverCompare "<1.14-0" .Capabilities.KubeVersion.GitVersion }} -apiVersion: extensions/v1beta1 -{{- else if semverCompare "<1.19-0" .Capabilities.KubeVersion.GitVersion }} -apiVersion: networking.k8s.io/v1beta1 -{{- else }} -apiVersion: networking.k8s.io/v1 -{{- end }} -kind: Ingress -metadata: - name: {{ include "stirlingpdf.fullname" . }} - {{- with .Values.ingress.annotations }} - annotations: - {{- toYaml . | nindent 4 }} - {{- end }} - labels: - {{- include "stirlingpdf.labels" . | nindent 4 }} - {{- with .Values.ingress.labels }} - {{- toYaml . | nindent 4 }} - {{- end }} -spec: - {{- with .Values.ingress.ingressClassName }} - ingressClassName: {{ . }} - {{- end }} - rules: - {{- range .Values.ingress.hosts }} - - host: {{ .name }} - http: - paths: - {{- range $ingressExtraPaths }} - - path: {{ default "/" .path | quote }} - backend: - {{- if semverCompare "<1.19-0" $.Capabilities.KubeVersion.GitVersion }} - {{- if $.Values.service.servicename }} - serviceName: {{ $.Values.service.servicename }} - {{- else }} - serviceName: {{ default $serviceName .service }} - {{- end }} - servicePort: {{ default $servicePort .port }} - {{- else }} - service: - {{- if $.Values.service.servicename }} - name: {{ $.Values.service.servicename }} - {{- else }} - name: {{ default $serviceName .service }} - {{- end }} - port: - number: {{ default $servicePort .port }} - pathType: {{ default $.Values.ingress.pathType .pathType }} - {{- end }} - {{- end }} - - path: {{ default "/" .path | quote }} - backend: - {{- if semverCompare "<1.19-0" $.Capabilities.KubeVersion.GitVersion }} - {{- if $.Values.service.servicename }} - serviceName: {{ $.Values.service.servicename }} - {{- else }} - serviceName: {{ default $serviceName .service }} - {{- end }} - servicePort: {{ default $servicePort .servicePort }} - {{- else }} - service: - {{- if $.Values.service.servicename }} - name: {{ $.Values.service.servicename }} - {{- else }} - name: {{ default $serviceName .service }} - {{- end }} - port: - number: {{ default $servicePort .port }} - pathType: {{ $.Values.ingress.pathType }} - {{- end }} - {{- end }} - tls: - {{- range .Values.ingress.hosts }} - {{- if .tls }} - - hosts: - - {{ .name }} - secretName: {{ .tlsSecret }} - {{- end }} - {{- end }} -{{- end -}} diff --git a/chart/stirling-pdf/templates/pv.yaml b/chart/stirling-pdf/templates/pv.yaml deleted file mode 100644 index aa99c6a9e..000000000 --- a/chart/stirling-pdf/templates/pv.yaml +++ /dev/null @@ -1,16 +0,0 @@ -{{- if .Values.persistence.pv.enabled -}} -apiVersion: v1 -kind: PersistentVolume -metadata: - name: {{ .Values.persistence.pv.pvname | default (include "stirlingpdf.fullname" .) }} - labels: - {{- include "stirlingpdf.labels" . | nindent 4 }} -spec: - capacity: - storage: {{ .Values.persistence.pv.capacity.storage }} - accessModes: - - {{ .Values.persistence.pv.accessMode | quote }} - nfs: - server: {{ .Values.persistence.pv.nfs.server }} - path: {{ .Values.persistence.pv.nfs.path | quote }} -{{- end }} \ No newline at end of file diff --git a/chart/stirling-pdf/templates/pvc.yaml b/chart/stirling-pdf/templates/pvc.yaml deleted file mode 100644 index f7a217228..000000000 --- a/chart/stirling-pdf/templates/pvc.yaml +++ /dev/null @@ -1,27 +0,0 @@ -{{- if and .Values.persistence.enabled (not .Values.persistence.existingClaim) -}} -kind: PersistentVolumeClaim -apiVersion: v1 -metadata: - name: {{ include "stirlingpdf.fullname" . }} - labels: - {{- include "stirlingpdf.labels" . | nindent 4 }} - {{- with .Values.persistence.labels }} - {{- toYaml . | nindent 4 }} - {{- end }} -spec: - accessModes: - - {{ .Values.persistence.accessMode | quote }} - resources: - requests: - storage: {{ .Values.persistence.size | quote }} -{{- if .Values.persistence.storageClass }} -{{- if (eq "-" .Values.persistence.storageClass) }} - storageClassName: "" -{{- else }} - storageClassName: "{{ .Values.persistence.storageClass }}" -{{- end }} -{{- if .Values.persistence.volumeName }} - volumeName: "{{ .Values.persistence.volumeName }}" -{{- end }} -{{- end }} -{{- end }} diff --git a/chart/stirling-pdf/templates/service.yaml b/chart/stirling-pdf/templates/service.yaml deleted file mode 100644 index 13ee2420b..000000000 --- a/chart/stirling-pdf/templates/service.yaml +++ /dev/null @@ -1,48 +0,0 @@ -apiVersion: v1 -kind: Service -metadata: - name: {{ .Values.service.servicename | default (include "stirlingpdf.fullname" .) }} - {{- with .Values.service.annotations }} - annotations: - {{- toYaml . | nindent 4 }} - {{- end }} - labels: - {{- include "stirlingpdf.labels" . | nindent 4 }} - {{- with .Values.service.labels }} - {{- toYaml . | nindent 4 }} - {{- end }} -spec: - type: {{ .Values.service.type }} - {{- if (or (eq .Values.service.type "LoadBalancer") (and (eq .Values.service.type "NodePort") (not (empty .Values.service.nodePort)))) }} - externalTrafficPolicy: {{ .Values.service.externalTrafficPolicy }} - {{- end }} - {{- if (and (eq .Values.service.type "LoadBalancer") .Values.service.loadBalancerIP) }} - loadBalancerIP: {{ .Values.service.loadBalancerIP }} - {{- end }} - {{- if (and (eq .Values.service.type "LoadBalancer") .Values.service.loadBalancerSourceRanges) }} - loadBalancerSourceRanges: - {{- with .Values.service.loadBalancerSourceRanges }} -{{ toYaml . | indent 2 }} - {{- end }} - {{- end }} - {{- if eq .Values.service.type "ClusterIP" }} - {{- if .Values.service.clusterIP }} - clusterIP: {{ .Values.service.clusterIP }} - {{- end }} - {{- end }} - ports: - - port: {{ .Values.service.externalPort }} -{{- if (and (eq .Values.service.type "NodePort") (not (empty .Values.service.nodePort))) }} - nodePort: {{.Values.service.nodePort}} -{{- end }} -{{- if .Values.service.targetPort }} - targetPort: {{ .Values.service.targetPort }} - name: {{ .Values.service.targetPort }} -{{- else }} - targetPort: http - name: http -{{- end }} - protocol: TCP - - selector: - {{- include "stirlingpdf.selectorLabels" . | nindent 4 }} diff --git a/chart/stirling-pdf/templates/serviceaccount.yaml b/chart/stirling-pdf/templates/serviceaccount.yaml deleted file mode 100644 index 7156e4a4f..000000000 --- a/chart/stirling-pdf/templates/serviceaccount.yaml +++ /dev/null @@ -1,13 +0,0 @@ -{{- if .Values.serviceAccount.create -}} ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - name: {{ include "stirlingpdf.serviceAccountName" . }} - {{- with .Values.serviceAccount.annotations }} - annotations: - {{ toYaml . | nindent 4 }} - {{- end }} - labels: - {{- include "stirlingpdf.labels" . | nindent 4 }} -{{- end }} diff --git a/chart/stirling-pdf/templates/servicemonitor.yaml b/chart/stirling-pdf/templates/servicemonitor.yaml deleted file mode 100644 index ca0d31bba..000000000 --- a/chart/stirling-pdf/templates/servicemonitor.yaml +++ /dev/null @@ -1,31 +0,0 @@ -{{- if and ( .Capabilities.APIVersions.Has "monitoring.coreos.com/v1" ) ( .Values.serviceMonitor.enabled ) }} -apiVersion: monitoring.coreos.com/v1 -kind: ServiceMonitor -metadata: - name: {{ include "stirlingpdf.fullname" . }} - namespace: {{ .Values.serviceMonitor.namespace | default .Release.Namespace }} - labels: - {{- include "stirlingpdf.labels" . | nindent 4 }} - {{- with .Values.serviceMonitor.labels }} - {{- toYaml . | nindent 4 }} - {{- end }} -spec: - endpoints: - - targetPort: 8080 -{{- if .Values.serviceMonitor.interval }} - interval: {{ .Values.serviceMonitor.interval }} -{{- end }} -{{- if .Values.serviceMonitor.metricsPath }} - path: {{ .Values.serviceMonitor.metricsPath }} -{{- end }} -{{- if .Values.serviceMonitor.timeout }} - scrapeTimeout: {{ .Values.serviceMonitor.timeout }} -{{- end }} - jobLabel: {{ include "stirlingpdf.fullname" . }} - namespaceSelector: - matchNames: - - {{ .Release.Namespace }} - selector: - matchLabels: - {{- include "stirlingpdf.selectorLabels" . | nindent 6 }} -{{- end }} diff --git a/chart/stirling-pdf/values.yaml b/chart/stirling-pdf/values.yaml deleted file mode 100644 index 3e3e560cc..000000000 --- a/chart/stirling-pdf/values.yaml +++ /dev/null @@ -1,240 +0,0 @@ -extraArgs: [] - # - --storage-timestamp-tolerance 1s -replicaCount: 1 -strategy: - type: RollingUpdate -image: - repository: frooodle/s-pdf - # took Chart appVersion by default - tag: ~ - pullPolicy: IfNotPresent -secret: - labels: {} -## Labels to apply to all resources -## -commonLabels: {} -# team_name: dev - -# rootpath for the application -rootPath: / - -envs: [] -# - name: UI_APP_NAME -# value: "Stirling PDF" -# - name: UI_HOME_DESCRIPTION -# value: "Your locally hosted one-stop-shop for all your PDF needs." -# - name: UI_APP_NAVBAR_NAME -# value: "Stirling PDF" -# - name: ALLOW_GOOGLE_VISIBILITY -# value: "true" -# - name: APP_LOCALE -# value: "en_GB" - -deployment: - ## stirling-pdf Deployment annotations - annotations: {} - # name: value - labels: {} - # name: value - # additional volumes - extraVolumes: [] - # - name: nginx-config - # secret: - # secretName: nginx-config - # additional volumes to mount - extraVolumeMounts: [] - ## sidecarContainers for the stirling-pdf - # Can be used to add a proxy to the pod that does - # scanning for secrets, signing, authentication, validation - # of the chart's content, send notifications... - sidecarContainers: {} - ## Example sidecarContainer which uses an extraVolume from above and - ## a named port that can be referenced in the service as targetPort. - # proxy: - # image: nginx:latest - # ports: - # - name: proxy - # containerPort: 8081 - # volumeMounts: - # - name: nginx-config - # readOnly: true - # mountPath: /etc/nginx - -## Pod annotations -## ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/ -## Read more about kube2iam to provide access to s3 https://github.com/jtblin/kube2iam -## -podAnnotations: {} - # iam.amazonaws.com/role: role-arn - -## Pod labels -## ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/ -podLabels: {} - # name: value - -service: - servicename: - type: ClusterIP - externalTrafficPolicy: Local - ## Uses pre-assigned IP address from cloud provider - ## Only valid if service.type: LoadBalancer - loadBalancerIP: - ## Limits which cidr blocks can connect to service's load balancer - ## Only valid if service.type: LoadBalancer - loadBalancerSourceRanges: [] - # clusterIP: None - externalPort: 8080 - ## targetPort of the container to use. If a sidecar should handle the - ## requests first, use the named port from the sidecar. See sidecar example - ## from deployment above. Leave empty to use stirling-pdf directly. - targetPort: - nodePort: - annotations: {} - labels: {} - -serviceMonitor: - enabled: false - # namespace: prometheus - labels: {} - metricsPath: "/metrics" - # timeout: 60 - # interval: 60 - -resources: {} -# limits: -# cpu: 100m -# memory: 128Mi -# requests: -# cpu: 80m -# memory: 64Mi - -probes: - liveness: - initialDelaySeconds: 5 - periodSeconds: 10 - timeoutSeconds: 1 - successThreshold: 1 - failureThreshold: 3 - livenessHttpGetConfig: - scheme: HTTP - readiness: - initialDelaySeconds: 5 - periodSeconds: 10 - timeoutSeconds: 1 - successThreshold: 1 - failureThreshold: 3 - readinessHttpGetConfig: - scheme: HTTP - -serviceAccount: - create: true - name: "" - automountServiceAccountToken: false - ## Annotations for the Service Account - annotations: {} - -# UID/GID 1000 is the default user "stirling-pdf" used in -# the container image starting in v0.8.0 and above. This -# is required for local persistent storage. If your cluster -# does not allow this, try setting securityContext: {} -securityContext: - enabled: true - fsGroup: 1000 - ## Optionally, specify supplementalGroups and/or - ## runAsNonRoot for security purposes - # runAsNonRoot: true - # supplementalGroups: [1000] - -containerSecurityContext: {} - -priorityClassName: "" - -nodeSelector: {} - -tolerations: [] - -affinity: {} - -persistence: - enabled: false - accessMode: ReadWriteOnce - size: 8Gi - labels: {} - # name: value - path: /tmp - ## A manually managed Persistent Volume and Claim - ## Requires persistence.enabled: true - ## If defined, PVC must be created manually before volume will be bound - # existingClaim: - - ## stirling-pdf data Persistent Volume Storage Class - ## If defined, storageClassName: - ## If set to "-", storageClassName: "", which disables dynamic provisioning - ## If undefined (the default) or set to null, no storageClassName spec is - ## set, choosing the default provisioner. (gp2 on AWS, standard on - ## GKE, AWS & OpenStack) - ## - # storageClass: "-" - # volumeName: - pv: - enabled: false - pvname: - capacity: - storage: 8Gi - accessMode: ReadWriteOnce - nfs: - server: - path: - -## Init containers parameters: -## volumePermissions: Change the owner of the persistent volume mountpoint to RunAsUser:fsGroup -## -volumePermissions: - image: - registry: docker.io - repository: bitnami/minideb - tag: buster - pullPolicy: Always - ## Optionally specify an array of imagePullSecrets. - ## Secrets must be manually created in the namespace. - ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/ - ## - # pullSecrets: - # - myRegistryKeySecretName - -## Ingress for load balancer -ingress: - enabled: false - pathType: "ImplementationSpecific" - ## stirling-pdf Ingress labels - ## - labels: {} - # dns: "route53" - - ## stirling-pdf Ingress annotations - ## - annotations: {} - # kubernetes.io/ingress.class: nginx - # kubernetes.io/tls-acme: "true" - - ## stirling-pdf Ingress hostnames - ## Must be provided if Ingress is enabled - ## - hosts: [] - # - name: stirling-pdf.domain1.com - # path: / - # tls: false - # - name: stirling-pdf.domain2.com - # path: / - # - # ## Set this to true in order to enable TLS on the ingress record - # tls: true - # - # ## If TLS is set to true, you must declare what secret will store the key/certificate for TLS - # ## Secrets must be added manually to the namespace - # tlsSecret: stirling-pdf.domain2-tls - - # For Kubernetes >= 1.18 you should specify the ingress-controller via the field ingressClassName - # See https://kubernetes.io/blog/2020/04/02/improvements-to-the-ingress-api-in-kubernetes-1.18/#specifying-the-class-of-an-ingress - ingressClassName: - diff --git a/scripts/ignore_translation.toml b/scripts/ignore_translation.toml index c6426c58c..b1d211a04 100644 --- a/scripts/ignore_translation.toml +++ b/scripts/ignore_translation.toml @@ -13,13 +13,11 @@ ignore = [ 'PDFToText.tags', 'adminUserSettings.admin', 'language.direction', - 'survey.button', 'watermark.type.1', ] [cs_CZ] ignore = [ - 'info', 'language.direction', 'pipeline.header', 'text', @@ -79,7 +77,6 @@ ignore = [ 'alphabet', 'compare.document.1', 'compare.document.2', - 'info', 'language.direction', 'licenses.license', 'licenses.module', @@ -87,8 +84,6 @@ ignore = [ 'licenses.version', 'pdfOrganiser.mode', 'pipeline.title', - 'pipelineOptions.pipelineHeader', - 'sponsor', 'watermark.type.2', ] @@ -105,11 +100,8 @@ ignore = [ [hr_HR] ignore = [ 'PDFToBook.selectText.1', - 'font', 'home.pipeline.title', - 'info', 'language.direction', - 'pdfOrganiser.tags', 'showJS.tags', ] @@ -125,7 +117,6 @@ ignore = [ [it_IT] ignore = [ - 'font', 'language.direction', 'no', 'password', @@ -148,18 +139,10 @@ ignore = [ [nl_NL] ignore = [ - 'HTMLToPDF.print', - 'adjustContrast.contrast', 'compare.document.1', 'compare.document.2', - 'error', - 'getPdfInfo.downloadJson', - 'help', - 'info', 'language.direction', 'navbar.allTools', - 'printFile.submit', - 'showJS.downloadJS', 'sponsor', ] @@ -181,7 +164,6 @@ ignore = [ [pt_BR] ignore = [ - 'changeMetadata.trapped', 'language.direction', 'pipelineOptions.pipelineHeader', ] @@ -227,7 +209,6 @@ ignore = [ [th_TH] ignore = [ 'language.direction', - 'pipeline.title', 'pipelineOptions.pipelineHeader', 'showJS.tags', ] diff --git a/src/main/java/stirling/software/SPDF/EE/EEAppConfig.java b/src/main/java/stirling/software/SPDF/EE/EEAppConfig.java index cf0bcbd4e..6cedd974b 100644 --- a/src/main/java/stirling/software/SPDF/EE/EEAppConfig.java +++ b/src/main/java/stirling/software/SPDF/EE/EEAppConfig.java @@ -1,7 +1,5 @@ package stirling.software.SPDF.EE; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; diff --git a/src/main/java/stirling/software/SPDF/config/EndpointConfiguration.java b/src/main/java/stirling/software/SPDF/config/EndpointConfiguration.java index e0ae56a1c..64f56045b 100644 --- a/src/main/java/stirling/software/SPDF/config/EndpointConfiguration.java +++ b/src/main/java/stirling/software/SPDF/config/EndpointConfiguration.java @@ -5,6 +5,7 @@ import java.util.List; import java.util.Map; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Collectors; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -42,7 +43,7 @@ public class EndpointConfiguration { public void disableEndpoint(String endpoint) { if (!endpointStatuses.containsKey(endpoint) || endpointStatuses.get(endpoint) != false) { - logger.info("Disabling {}", endpoint); + logger.debug("Disabling {}", endpoint); endpointStatuses.put(endpoint, false); } } @@ -76,6 +77,23 @@ public class EndpointConfiguration { } } + public void logDisabledEndpointsSummary() { + List disabledList = + endpointStatuses.entrySet().stream() + .filter(entry -> !entry.getValue()) // only get disabled endpoints (value + // is false) + .map(Map.Entry::getKey) + .sorted() + .collect(Collectors.toList()); + + if (!disabledList.isEmpty()) { + logger.info( + "Total disabled endpoints: {}. Disabled endpoints: {}", + disabledList.size(), + String.join(", ", disabledList)); + } + } + public void init() { // Adding endpoints to "PageOps" group addEndpointToGroup("PageOps", "remove-pages"); @@ -99,7 +117,6 @@ public class EndpointConfiguration { addEndpointToGroup("Convert", "img-to-pdf"); addEndpointToGroup("Convert", "pdf-to-pdfa"); addEndpointToGroup("Convert", "file-to-pdf"); - addEndpointToGroup("Convert", "xlsx-to-pdf"); addEndpointToGroup("Convert", "pdf-to-word"); addEndpointToGroup("Convert", "pdf-to-presentation"); addEndpointToGroup("Convert", "pdf-to-text"); @@ -145,7 +162,6 @@ public class EndpointConfiguration { addEndpointToGroup("CLI", "repair"); addEndpointToGroup("CLI", "pdf-to-pdfa"); addEndpointToGroup("CLI", "file-to-pdf"); - addEndpointToGroup("CLI", "xlsx-to-pdf"); addEndpointToGroup("CLI", "pdf-to-word"); addEndpointToGroup("CLI", "pdf-to-presentation"); addEndpointToGroup("CLI", "pdf-to-html"); @@ -163,25 +179,26 @@ public class EndpointConfiguration { // python addEndpointToGroup("Python", "extract-image-scans"); - addEndpointToGroup("Python", REMOVE_BLANKS); addEndpointToGroup("Python", "html-to-pdf"); addEndpointToGroup("Python", "url-to-pdf"); addEndpointToGroup("Python", "pdf-to-img"); + addEndpointToGroup("Python", "file-to-pdf"); // openCV addEndpointToGroup("OpenCV", "extract-image-scans"); - addEndpointToGroup("OpenCV", REMOVE_BLANKS); // LibreOffice addEndpointToGroup("LibreOffice", "repair"); addEndpointToGroup("LibreOffice", "file-to-pdf"); - addEndpointToGroup("LibreOffice", "xlsx-to-pdf"); addEndpointToGroup("LibreOffice", "pdf-to-word"); addEndpointToGroup("LibreOffice", "pdf-to-presentation"); addEndpointToGroup("LibreOffice", "pdf-to-rtf"); addEndpointToGroup("LibreOffice", "pdf-to-html"); addEndpointToGroup("LibreOffice", "pdf-to-xml"); + // Unoconv + addEndpointToGroup("Unoconv", "file-to-pdf"); + // OCRmyPDF addEndpointToGroup("OCRmyPDF", "compress-pdf"); addEndpointToGroup("OCRmyPDF", "pdf-to-pdfa"); @@ -230,6 +247,18 @@ public class EndpointConfiguration { addEndpointToGroup("Javascript", "sign"); addEndpointToGroup("Javascript", "compare"); addEndpointToGroup("Javascript", "adjust-contrast"); + + // Ghostscript dependent endpoints + addEndpointToGroup("Ghostscript", "compress-pdf"); + addEndpointToGroup("Ghostscript", "pdf-to-pdfa"); + addEndpointToGroup("Ghostscript", "repair"); + + // Weasyprint dependent endpoints + addEndpointToGroup("Weasyprint", "html-to-pdf"); + addEndpointToGroup("Weasyprint", "url-to-pdf"); + + // Pdftohtml dependent endpoints + addEndpointToGroup("Pdftohtml", "pdf-to-html"); } private void processEnvironmentConfigs() { @@ -251,5 +280,9 @@ public class EndpointConfiguration { } } + public Set getEndpointsForGroup(String group) { + return endpointGroups.getOrDefault(group, new HashSet<>()); + } + private static final String REMOVE_BLANKS = "remove-blanks"; } diff --git a/src/main/java/stirling/software/SPDF/config/ExternalAppDepConfig.java b/src/main/java/stirling/software/SPDF/config/ExternalAppDepConfig.java new file mode 100644 index 000000000..f8ab43ad5 --- /dev/null +++ b/src/main/java/stirling/software/SPDF/config/ExternalAppDepConfig.java @@ -0,0 +1,148 @@ +package stirling.software.SPDF.config; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; + +import jakarta.annotation.PostConstruct; +import lombok.extern.slf4j.Slf4j; + +@Configuration +@Slf4j +public class ExternalAppDepConfig { + @Autowired private EndpointConfiguration endpointConfiguration; + + private boolean isCommandAvailable(String command) { + try { + ProcessBuilder processBuilder = new ProcessBuilder(); + if (System.getProperty("os.name").toLowerCase().contains("windows")) { + processBuilder.command("where", command); + } else { + processBuilder.command("which", command); + } + Process process = processBuilder.start(); + int exitCode = process.waitFor(); + return exitCode == 0; + } catch (Exception e) { + log.debug("Error checking for command {}: {}", command, e.getMessage()); + return false; + } + } + + private final Map> commandToGroupMapping = + new HashMap<>() { + { + put("gs", List.of("Ghostscript")); + put("soffice", List.of("LibreOffice")); + put("ocrmypdf", List.of("OCRmyPDF")); + put("weasyprint", List.of("Weasyprint")); + put("pdftohtml", List.of("Pdftohtml")); + put("unoconv", List.of("Unoconv")); + } + }; + + private List getAffectedFeatures(String group) { + return endpointConfiguration.getEndpointsForGroup(group).stream() + .map(endpoint -> formatEndpointAsFeature(endpoint)) + .collect(Collectors.toList()); + } + + private String formatEndpointAsFeature(String endpoint) { + // First replace common terms + String feature = endpoint.replace("-", " ").replace("pdf", "PDF").replace("img", "image"); + + // Split into words and capitalize each word + return Arrays.stream(feature.split("\\s+")) + .map(word -> capitalizeWord(word)) + .collect(Collectors.joining(" ")); + } + + private String capitalizeWord(String word) { + if (word.isEmpty()) { + return word; + } + if ("pdf".equalsIgnoreCase(word)) { + return "PDF"; + } + return word.substring(0, 1).toUpperCase() + word.substring(1).toLowerCase(); + } + + private void checkDependencyAndDisableGroup(String command) { + boolean isAvailable = isCommandAvailable(command); + if (!isAvailable) { + List affectedGroups = commandToGroupMapping.get(command); + + if (affectedGroups != null) { + for (String group : affectedGroups) { + List affectedFeatures = getAffectedFeatures(group); + endpointConfiguration.disableGroup(group); + log.warn( + "Missing dependency: {} - Disabling group: {} (Affected features: {})", + command, + group, + affectedFeatures != null && !affectedFeatures.isEmpty() + ? String.join(", ", affectedFeatures) + : "unknown"); + } + } + } + } + + @PostConstruct + public void checkDependencies() { + + // Check core dependencies + checkDependencyAndDisableGroup("gs"); + checkDependencyAndDisableGroup("soffice"); + checkDependencyAndDisableGroup("ocrmypdf"); + checkDependencyAndDisableGroup("weasyprint"); + checkDependencyAndDisableGroup("pdftohtml"); + checkDependencyAndDisableGroup("unoconv"); + + // Special handling for Python/OpenCV dependencies + boolean pythonAvailable = isCommandAvailable("python3") || isCommandAvailable("python"); + if (!pythonAvailable) { + List pythonFeatures = getAffectedFeatures("Python"); + List openCVFeatures = getAffectedFeatures("OpenCV"); + + endpointConfiguration.disableGroup("Python"); + endpointConfiguration.disableGroup("OpenCV"); + log.warn( + "Missing dependency: Python - Disabling Python features: {} and OpenCV features: {}", + String.join(", ", pythonFeatures), + String.join(", ", openCVFeatures)); + } else { + // If Python is available, check for OpenCV + try { + ProcessBuilder processBuilder = new ProcessBuilder(); + if (System.getProperty("os.name").toLowerCase().contains("windows")) { + processBuilder.command("python", "-c", "import cv2"); + } else { + processBuilder.command("python3", "-c", "import cv2"); + } + Process process = processBuilder.start(); + int exitCode = process.waitFor(); + if (exitCode != 0) { + List openCVFeatures = getAffectedFeatures("OpenCV"); + endpointConfiguration.disableGroup("OpenCV"); + log.warn( + "OpenCV not available in Python - Disabling OpenCV features: {}", + String.join(", ", openCVFeatures)); + } + } catch (Exception e) { + List openCVFeatures = getAffectedFeatures("OpenCV"); + endpointConfiguration.disableGroup("OpenCV"); + log.warn( + "Error checking OpenCV: {} - Disabling OpenCV features: {}", + e.getMessage(), + String.join(", ", openCVFeatures)); + } + } + endpointConfiguration.logDisabledEndpointsSummary(); + } +} diff --git a/src/main/java/stirling/software/SPDF/config/InitialSetup.java b/src/main/java/stirling/software/SPDF/config/InitialSetup.java index 4be2e5e65..0e0ad2be0 100644 --- a/src/main/java/stirling/software/SPDF/config/InitialSetup.java +++ b/src/main/java/stirling/software/SPDF/config/InitialSetup.java @@ -9,6 +9,7 @@ import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; import io.micrometer.common.util.StringUtils; + import jakarta.annotation.PostConstruct; import lombok.extern.slf4j.Slf4j; import stirling.software.SPDF.model.ApplicationProperties; @@ -40,7 +41,7 @@ public class InitialSetup { applicationProperties.getAutomaticallyGenerated().setKey(secretKey); } } - + @PostConstruct public void initLegalUrls() throws IOException { // Initialize Terms and Conditions @@ -59,7 +60,4 @@ public class InitialSetup { applicationProperties.getLegal().setPrivacyPolicy(defaultPrivacyUrl); } } - } - - diff --git a/src/main/java/stirling/software/SPDF/config/security/SecurityConfiguration.java b/src/main/java/stirling/software/SPDF/config/security/SecurityConfiguration.java index e6b149ba9..1b7d37d61 100644 --- a/src/main/java/stirling/software/SPDF/config/security/SecurityConfiguration.java +++ b/src/main/java/stirling/software/SPDF/config/security/SecurityConfiguration.java @@ -36,6 +36,8 @@ import org.springframework.security.saml2.provider.service.web.authentication.Sa import org.springframework.security.web.SecurityFilterChain; import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; import org.springframework.security.web.authentication.rememberme.PersistentTokenRepository; +import org.springframework.security.web.csrf.CookieCsrfTokenRepository; +import org.springframework.security.web.csrf.CsrfTokenRequestAttributeHandler; import org.springframework.security.web.savedrequest.NullRequestCache; import org.springframework.security.web.util.matcher.AntPathRequestMatcher; @@ -94,6 +96,41 @@ public class SecurityConfiguration { userAuthenticationFilter, UsernamePasswordAuthenticationFilter.class); if (applicationProperties.getSecurity().getCsrfDisabled()) { http.csrf(csrf -> csrf.disable()); + } else { + CookieCsrfTokenRepository cookieRepo = + CookieCsrfTokenRepository.withHttpOnlyFalse(); + CsrfTokenRequestAttributeHandler requestHandler = + new CsrfTokenRequestAttributeHandler(); + requestHandler.setCsrfRequestAttributeName(null); + http.csrf( + csrf -> + csrf.ignoringRequestMatchers( + request -> { + String apiKey = request.getHeader("X-API-Key"); + + // If there's no API key, don't ignore CSRF + // (return false) + if (apiKey == null || apiKey.trim().isEmpty()) { + return false; + } + + // Validate API key using existing UserService + try { + Optional user = + userService.getUserByApiKey(apiKey); + // If API key is valid, ignore CSRF (return + // true) + // If API key is invalid, don't ignore CSRF + // (return false) + return user.isPresent(); + } catch (Exception e) { + // If there's any error validating the API + // key, don't ignore CSRF + return false; + } + }) + .csrfTokenRepository(cookieRepo) + .csrfTokenRequestHandler(requestHandler)); } http.addFilterBefore(rateLimitingFilter(), UsernamePasswordAuthenticationFilter.class); http.addFilterAfter(firstLoginFilter, UsernamePasswordAuthenticationFilter.class); @@ -113,15 +150,20 @@ public class SecurityConfiguration { logout.logoutRequestMatcher(new AntPathRequestMatcher("/logout")) .logoutSuccessHandler( new CustomLogoutSuccessHandler(applicationProperties)) + .clearAuthentication(true) .invalidateHttpSession(true) // Invalidate session .deleteCookies("JSESSIONID", "remember-me")); http.rememberMe( rememberMeConfigurer -> rememberMeConfigurer // Use the configurator directly - .key("uniqueAndSecret") .tokenRepository(persistentTokenRepository()) - .tokenValiditySeconds(1209600) // 2 weeks - ); + .tokenValiditySeconds(14 * 24 * 60 * 60) // 14 days + .userDetailsService( + userDetailsService) // Your existing UserDetailsService + .useSecureCookie(true) // Enable secure cookie + .rememberMeParameter("remember-me") // Form parameter name + .rememberMeCookieName("remember-me") // Cookie name + .alwaysRemember(false)); http.authorizeHttpRequests( authz -> authz.requestMatchers( @@ -203,7 +245,8 @@ public class SecurityConfiguration { } // Handle SAML - if (applicationProperties.getSecurity().isSaml2Activ() && applicationProperties.getSystem().getEnableAlphaFunctionality()) { + if (applicationProperties.getSecurity().isSaml2Activ() + && applicationProperties.getSystem().getEnableAlphaFunctionality()) { http.authenticationProvider(samlAuthenticationProvider()); http.saml2Login( saml2 -> @@ -222,6 +265,16 @@ public class SecurityConfiguration { } else { if (applicationProperties.getSecurity().getCsrfDisabled()) { http.csrf(csrf -> csrf.disable()); + } else { + CookieCsrfTokenRepository cookieRepo = + CookieCsrfTokenRepository.withHttpOnlyFalse(); + CsrfTokenRequestAttributeHandler requestHandler = + new CsrfTokenRequestAttributeHandler(); + requestHandler.setCsrfRequestAttributeName(null); + http.csrf( + csrf -> + csrf.csrfTokenRepository(cookieRepo) + .csrfTokenRequestHandler(requestHandler)); } http.authorizeHttpRequests(authz -> authz.anyRequest().permitAll()); } diff --git a/src/main/java/stirling/software/SPDF/config/security/UserService.java b/src/main/java/stirling/software/SPDF/config/security/UserService.java index c49002d64..4b130d111 100644 --- a/src/main/java/stirling/software/SPDF/config/security/UserService.java +++ b/src/main/java/stirling/software/SPDF/config/security/UserService.java @@ -19,10 +19,12 @@ import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.security.oauth2.core.user.OAuth2User; import org.springframework.stereotype.Service; +import lombok.extern.slf4j.Slf4j; import stirling.software.SPDF.config.interfaces.DatabaseBackupInterface; import stirling.software.SPDF.config.security.saml2.CustomSaml2AuthenticatedPrincipal; import stirling.software.SPDF.config.security.session.SessionPersistentRegistry; import stirling.software.SPDF.controller.api.pipeline.UserServiceInterface; +import stirling.software.SPDF.model.ApplicationProperties; import stirling.software.SPDF.model.AuthenticationType; import stirling.software.SPDF.model.Authority; import stirling.software.SPDF.model.Role; @@ -31,6 +33,7 @@ import stirling.software.SPDF.repository.AuthorityRepository; import stirling.software.SPDF.repository.UserRepository; @Service +@Slf4j public class UserService implements UserServiceInterface { @Autowired private UserRepository userRepository; @@ -45,6 +48,7 @@ public class UserService implements UserServiceInterface { @Autowired DatabaseBackupInterface databaseBackupHelper; + @Autowired ApplicationProperties applicationProperties; // Handle OAUTH2 login and user auto creation. public boolean processOAuth2PostLogin(String username, boolean autoCreateUser) @@ -355,13 +359,21 @@ public class UserService implements UserServiceInterface { if (principal instanceof UserDetails) { return ((UserDetails) principal).getUsername(); + } else if (principal instanceof OAuth2User) { + return ((OAuth2User) principal) + .getAttribute( + applicationProperties.getSecurity().getOauth2().getUseAsUsername()); + } else if (principal instanceof CustomSaml2AuthenticatedPrincipal) { + return ((CustomSaml2AuthenticatedPrincipal) principal).getName(); + } else if (principal instanceof String) { + return (String) principal; } else { return principal.toString(); } } - @Override - public long getTotalUsersCount() { - return userRepository.count(); - } + @Override + public long getTotalUsersCount() { + return userRepository.count(); + } } diff --git a/src/main/java/stirling/software/SPDF/config/security/saml2/CertificateUtils.java b/src/main/java/stirling/software/SPDF/config/security/saml2/CertificateUtils.java index 6a01ce0aa..4f0d2488a 100644 --- a/src/main/java/stirling/software/SPDF/config/security/saml2/CertificateUtils.java +++ b/src/main/java/stirling/software/SPDF/config/security/saml2/CertificateUtils.java @@ -1,48 +1,42 @@ package stirling.software.SPDF.config.security.saml2; import java.io.ByteArrayInputStream; +import java.io.InputStreamReader; import java.nio.charset.StandardCharsets; import java.security.KeyFactory; import java.security.cert.CertificateFactory; import java.security.cert.X509Certificate; import java.security.interfaces.RSAPrivateKey; import java.security.spec.PKCS8EncodedKeySpec; -import java.util.Base64; +import org.bouncycastle.util.io.pem.PemObject; +import org.bouncycastle.util.io.pem.PemReader; import org.springframework.core.io.Resource; -import org.springframework.util.FileCopyUtils; public class CertificateUtils { public static X509Certificate readCertificate(Resource certificateResource) throws Exception { - String certificateString = - new String( - FileCopyUtils.copyToByteArray(certificateResource.getInputStream()), - StandardCharsets.UTF_8); - String certContent = - certificateString - .replace("-----BEGIN CERTIFICATE-----", "") - .replace("-----END CERTIFICATE-----", "") - .replaceAll("\\R", "") - .replaceAll("\\s+", ""); - CertificateFactory cf = CertificateFactory.getInstance("X.509"); - byte[] decodedCert = Base64.getDecoder().decode(certContent); - return (X509Certificate) cf.generateCertificate(new ByteArrayInputStream(decodedCert)); + try (PemReader pemReader = + new PemReader( + new InputStreamReader( + certificateResource.getInputStream(), StandardCharsets.UTF_8))) { + PemObject pemObject = pemReader.readPemObject(); + byte[] decodedCert = pemObject.getContent(); + CertificateFactory cf = CertificateFactory.getInstance("X.509"); + return (X509Certificate) cf.generateCertificate(new ByteArrayInputStream(decodedCert)); + } } public static RSAPrivateKey readPrivateKey(Resource privateKeyResource) throws Exception { - String privateKeyString = - new String( - FileCopyUtils.copyToByteArray(privateKeyResource.getInputStream()), - StandardCharsets.UTF_8); - String privateKeyContent = - privateKeyString - .replace("-----BEGIN PRIVATE KEY-----", "") - .replace("-----END PRIVATE KEY-----", "") - .replaceAll("\\R", "") - .replaceAll("\\s+", ""); - KeyFactory kf = KeyFactory.getInstance("RSA"); - byte[] decodedKey = Base64.getDecoder().decode(privateKeyContent); - return (RSAPrivateKey) kf.generatePrivate(new PKCS8EncodedKeySpec(decodedKey)); + try (PemReader pemReader = + new PemReader( + new InputStreamReader( + privateKeyResource.getInputStream(), StandardCharsets.UTF_8))) { + PemObject pemObject = pemReader.readPemObject(); + byte[] decodedKey = pemObject.getContent(); + return (RSAPrivateKey) + KeyFactory.getInstance("RSA") + .generatePrivate(new PKCS8EncodedKeySpec(decodedKey)); + } } } diff --git a/src/main/java/stirling/software/SPDF/controller/api/AdditionalLanguageJsController.java b/src/main/java/stirling/software/SPDF/controller/api/AdditionalLanguageJsController.java new file mode 100644 index 000000000..959e9ac45 --- /dev/null +++ b/src/main/java/stirling/software/SPDF/controller/api/AdditionalLanguageJsController.java @@ -0,0 +1,65 @@ +package stirling.software.SPDF.controller.api; + +import java.io.IOException; +import java.io.PrintWriter; +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import io.swagger.v3.oas.annotations.Hidden; + +import jakarta.servlet.http.HttpServletResponse; +import stirling.software.SPDF.service.LanguageService; + +@RestController +@RequestMapping("/js") +public class AdditionalLanguageJsController { + + @Autowired private LanguageService languageService; + + @Hidden + @GetMapping(value = "/additionalLanguageCode.js", produces = "application/javascript") + public void generateAdditionalLanguageJs(HttpServletResponse response) throws IOException { + List supportedLanguages = languageService.getSupportedLanguages(); + + response.setContentType("application/javascript"); + PrintWriter writer = response.getWriter(); + + // Erstelle das JavaScript dynamisch + writer.println("const supportedLanguages = " + toJsonArray(supportedLanguages) + ";"); + + // Generiere die `getDetailedLanguageCode`-Funktion + writer.println( + """ + function getDetailedLanguageCode() { + const userLanguages = navigator.languages ? navigator.languages : [navigator.language]; + for (let lang of userLanguages) { + let matchedLang = supportedLanguages.find(supportedLang => supportedLang.startsWith(lang.replace('-', '_'))); + if (matchedLang) { + return matchedLang; + } + } + // Fallback + return "en_GB"; + } + """); + + writer.flush(); + } + + // Hilfsfunktion zum Konvertieren der Liste in ein JSON-Array + private String toJsonArray(List list) { + StringBuilder jsonArray = new StringBuilder("["); + for (int i = 0; i < list.size(); i++) { + jsonArray.append("\"").append(list.get(i)).append("\""); + if (i < list.size() - 1) { + jsonArray.append(","); + } + } + jsonArray.append("]"); + return jsonArray.toString(); + } +} diff --git a/src/main/java/stirling/software/SPDF/controller/api/pipeline/UserServiceInterface.java b/src/main/java/stirling/software/SPDF/controller/api/pipeline/UserServiceInterface.java index 4ef6e6ec4..3b69456b1 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/pipeline/UserServiceInterface.java +++ b/src/main/java/stirling/software/SPDF/controller/api/pipeline/UserServiceInterface.java @@ -4,6 +4,6 @@ public interface UserServiceInterface { String getApiKeyForUser(String username); String getCurrentUsername(); - + long getTotalUsersCount(); } diff --git a/src/main/java/stirling/software/SPDF/controller/api/security/CertSignController.java b/src/main/java/stirling/software/SPDF/controller/api/security/CertSignController.java index c37fcc9c6..27262febd 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/security/CertSignController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/security/CertSignController.java @@ -1,10 +1,14 @@ package stirling.software.SPDF.controller.api.security; +import java.awt.Color; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; +import java.io.File; import java.io.IOException; +import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; +import java.nio.file.Files; import java.security.KeyStore; import java.security.KeyStoreException; import java.security.NoSuchAlgorithmException; @@ -14,12 +18,39 @@ import java.security.UnrecoverableKeyException; import java.security.cert.Certificate; import java.security.cert.CertificateException; import java.security.cert.CertificateFactory; +import java.security.cert.X509Certificate; import java.util.Calendar; +import java.util.List; +import org.apache.commons.io.FileUtils; import org.apache.pdfbox.examples.signature.CreateSignatureBase; import org.apache.pdfbox.pdmodel.PDDocument; +import org.apache.pdfbox.pdmodel.PDPage; +import org.apache.pdfbox.pdmodel.PDPageContentStream; +import org.apache.pdfbox.pdmodel.PDResources; +import org.apache.pdfbox.pdmodel.common.PDRectangle; +import org.apache.pdfbox.pdmodel.common.PDStream; +import org.apache.pdfbox.pdmodel.font.PDFont; +import org.apache.pdfbox.pdmodel.font.PDType1Font; +import org.apache.pdfbox.pdmodel.font.Standard14Fonts.FontName; +import org.apache.pdfbox.pdmodel.graphics.blend.BlendMode; +import org.apache.pdfbox.pdmodel.graphics.form.PDFormXObject; +import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject; +import org.apache.pdfbox.pdmodel.graphics.state.PDExtendedGraphicsState; +import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotationWidget; +import org.apache.pdfbox.pdmodel.interactive.annotation.PDAppearanceDictionary; +import org.apache.pdfbox.pdmodel.interactive.annotation.PDAppearanceStream; import org.apache.pdfbox.pdmodel.interactive.digitalsignature.PDSignature; +import org.apache.pdfbox.pdmodel.interactive.digitalsignature.SignatureOptions; +import org.apache.pdfbox.pdmodel.interactive.form.PDAcroForm; +import org.apache.pdfbox.pdmodel.interactive.form.PDField; +import org.apache.pdfbox.pdmodel.interactive.form.PDSignatureField; +import org.apache.pdfbox.util.Matrix; import org.bouncycastle.asn1.pkcs.PrivateKeyInfo; +import org.bouncycastle.asn1.x500.RDN; +import org.bouncycastle.asn1.x500.X500Name; +import org.bouncycastle.asn1.x500.style.BCStyle; +import org.bouncycastle.asn1.x500.style.IETFUtils; import org.bouncycastle.jce.provider.BouncyCastleProvider; import org.bouncycastle.openssl.PEMDecryptorProvider; import org.bouncycastle.openssl.PEMEncryptedKeyPair; @@ -35,6 +66,7 @@ import org.bouncycastle.pkcs.PKCSException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.io.ClassPathResource; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PostMapping; @@ -62,6 +94,8 @@ public class CertSignController { } class CreateSignature extends CreateSignatureBase { + File logoFile; + public CreateSignature(KeyStore keystore, char[] pin) throws KeyStoreException, UnrecoverableKeyException, @@ -69,6 +103,101 @@ public class CertSignController { IOException, CertificateException { super(keystore, pin); + ClassPathResource resource = new ClassPathResource("static/images/signature.png"); + try (InputStream is = resource.getInputStream()) { + logoFile = Files.createTempFile("signature", ".png").toFile(); + FileUtils.copyInputStreamToFile(is, logoFile); + } catch (IOException e) { + logger.error("Failed to load image signature file"); + throw e; + } + } + + public InputStream createVisibleSignature( + PDDocument srcDoc, PDSignature signature, Integer pageNumber, Boolean showLogo) + throws IOException { + // modified from org.apache.pdfbox.examples.signature.CreateVisibleSignature2 + try (PDDocument doc = new PDDocument()) { + PDPage page = new PDPage(srcDoc.getPage(pageNumber).getMediaBox()); + doc.addPage(page); + PDAcroForm acroForm = new PDAcroForm(doc); + doc.getDocumentCatalog().setAcroForm(acroForm); + PDSignatureField signatureField = new PDSignatureField(acroForm); + PDAnnotationWidget widget = signatureField.getWidgets().get(0); + List acroFormFields = acroForm.getFields(); + acroForm.setSignaturesExist(true); + acroForm.setAppendOnly(true); + acroForm.getCOSObject().setDirect(true); + acroFormFields.add(signatureField); + + PDRectangle rect = new PDRectangle(0, 0, 200, 50); + + widget.setRectangle(rect); + + // from PDVisualSigBuilder.createHolderForm() + PDStream stream = new PDStream(doc); + PDFormXObject form = new PDFormXObject(stream); + PDResources res = new PDResources(); + form.setResources(res); + form.setFormType(1); + PDRectangle bbox = new PDRectangle(rect.getWidth(), rect.getHeight()); + float height = bbox.getHeight(); + form.setBBox(bbox); + PDFont font = new PDType1Font(FontName.TIMES_BOLD); + + // from PDVisualSigBuilder.createAppearanceDictionary() + PDAppearanceDictionary appearance = new PDAppearanceDictionary(); + appearance.getCOSObject().setDirect(true); + PDAppearanceStream appearanceStream = new PDAppearanceStream(form.getCOSObject()); + appearance.setNormalAppearance(appearanceStream); + widget.setAppearance(appearance); + + try (PDPageContentStream cs = new PDPageContentStream(doc, appearanceStream)) { + if (showLogo) { + cs.saveGraphicsState(); + PDExtendedGraphicsState extState = new PDExtendedGraphicsState(); + extState.setBlendMode(BlendMode.MULTIPLY); + extState.setNonStrokingAlphaConstant(0.5f); + cs.setGraphicsStateParameters(extState); + cs.transform(Matrix.getScaleInstance(0.08f, 0.08f)); + PDImageXObject img = + PDImageXObject.createFromFileByExtension(logoFile, doc); + cs.drawImage(img, 100, 0); + cs.restoreGraphicsState(); + } + + // show text + float fontSize = 10; + float leading = fontSize * 1.5f; + cs.beginText(); + cs.setFont(font, fontSize); + cs.setNonStrokingColor(Color.black); + cs.newLineAtOffset(fontSize, height - leading); + cs.setLeading(leading); + + X509Certificate cert = (X509Certificate) getCertificateChain()[0]; + + // https://stackoverflow.com/questions/2914521/ + X500Name x500Name = new X500Name(cert.getSubjectX500Principal().getName()); + RDN cn = x500Name.getRDNs(BCStyle.CN)[0]; + String name = IETFUtils.valueToString(cn.getFirst().getValue()); + + String date = signature.getSignDate().getTime().toString(); + String reason = signature.getReason(); + + cs.showText("Signed by " + name); + cs.newLine(); + cs.showText(date); + cs.newLine(); + cs.showText(reason); + + cs.endText(); + } + + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + doc.save(baos); + return new ByteArrayInputStream(baos.toByteArray()); + } } } @@ -97,7 +226,8 @@ public class CertSignController { String reason = request.getReason(); String location = request.getLocation(); String name = request.getName(); - Integer pageNumber = request.getPageNumber(); + Integer pageNumber = request.getPageNumber() - 1; + Boolean showLogo = request.isShowLogo(); if (certType == null) { throw new IllegalArgumentException("Cert type must be provided"); @@ -126,11 +256,19 @@ public class CertSignController { throw new IllegalArgumentException("Invalid cert type: " + certType); } - // TODO: page number - CreateSignature createSignature = new CreateSignature(ks, password.toCharArray()); ByteArrayOutputStream baos = new ByteArrayOutputStream(); - sign(pdfDocumentFactory, pdf.getBytes(), baos, createSignature, name, location, reason); + sign( + pdfDocumentFactory, + pdf.getBytes(), + baos, + createSignature, + showSignature, + pageNumber, + name, + location, + reason, + showLogo); return WebResponseUtils.boasToWebResponse( baos, Filenames.toSimpleFileName(pdf.getOriginalFilename()).replaceFirst("[.][^.]+$", "") @@ -142,9 +280,12 @@ public class CertSignController { byte[] input, OutputStream output, CreateSignature instance, + Boolean showSignature, + Integer pageNumber, String name, String location, - String reason) { + String reason, + Boolean showLogo) { try (PDDocument doc = pdfDocumentFactory.load(input)) { PDSignature signature = new PDSignature(); signature.setFilter(PDSignature.FILTER_ADOBE_PPKLITE); @@ -154,7 +295,17 @@ public class CertSignController { signature.setReason(reason); signature.setSignDate(Calendar.getInstance()); - doc.addSignature(signature, instance); + if (showSignature) { + SignatureOptions signatureOptions = new SignatureOptions(); + signatureOptions.setVisualSignature( + instance.createVisibleSignature(doc, signature, pageNumber, showLogo)); + signatureOptions.setPage(pageNumber); + + doc.addSignature(signature, instance, signatureOptions); + + } else { + doc.addSignature(signature, instance); + } doc.saveIncremental(output); } catch (Exception e) { logger.error("exception", e); diff --git a/src/main/java/stirling/software/SPDF/controller/api/security/WatermarkController.java b/src/main/java/stirling/software/SPDF/controller/api/security/WatermarkController.java index de7efd713..7bf9bbb75 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/security/WatermarkController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/security/WatermarkController.java @@ -187,18 +187,32 @@ public class WatermarkController { float watermarkHeight = heightSpacer + fontSize * textLines.length; float pageWidth = page.getMediaBox().getWidth(); float pageHeight = page.getMediaBox().getHeight(); - int watermarkRows = (int) (pageHeight / watermarkHeight + 1); - int watermarkCols = (int) (pageWidth / watermarkWidth + 1); + + + //Calculating the new width and height depending on the angle. + float radians = (float) Math.toRadians(rotation); + float newWatermarkWidth = + (float) + (Math.abs(watermarkWidth * Math.cos(radians)) + + Math.abs(watermarkHeight * Math.sin(radians))); + float newWatermarkHeight = + (float) + (Math.abs(watermarkWidth * Math.sin(radians)) + + Math.abs(watermarkHeight * Math.cos(radians))); + + //Calculating the number of rows and columns. + int watermarkRows = (int) (pageHeight / newWatermarkHeight + 1); + int watermarkCols = (int) (pageWidth / newWatermarkWidth + 1); // Add the text watermark - for (int i = 0; i < watermarkRows; i++) { - for (int j = 0; j < watermarkCols; j++) { + for (int i = 0; i <= watermarkRows; i++) { + for (int j = 0; j <= watermarkCols; j++) { contentStream.beginText(); contentStream.setTextMatrix( Matrix.getRotateInstance( (float) Math.toRadians(rotation), - j * watermarkWidth, - i * watermarkHeight)); + j * newWatermarkWidth, + i * newWatermarkHeight)); for (int k = 0; k < textLines.length; ++k) { contentStream.showText(textLines[k]); diff --git a/src/main/java/stirling/software/SPDF/controller/web/AccountWebController.java b/src/main/java/stirling/software/SPDF/controller/web/AccountWebController.java index 8dcb2a9a5..b46290201 100644 --- a/src/main/java/stirling/software/SPDF/controller/web/AccountWebController.java +++ b/src/main/java/stirling/software/SPDF/controller/web/AccountWebController.java @@ -89,10 +89,9 @@ public class AccountWebController { } SAML2 saml2 = securityProps.getSaml2(); - if (saml2 != null) { - if (saml2.getEnabled()) { - providerList.put("/saml2/authenticate/" + saml2.getRegistrationId(), "SAML 2"); - } + if (securityProps.isSaml2Activ() + && applicationProperties.getSystem().getEnableAlphaFunctionality()) { + providerList.put("/saml2/authenticate/" + saml2.getRegistrationId(), "SAML 2"); } // Remove any null keys/values from the providerList providerList @@ -101,7 +100,8 @@ public class AccountWebController { model.addAttribute("providerlist", providerList); model.addAttribute("loginMethod", securityProps.getLoginMethod()); - model.addAttribute("altLogin", securityProps.isAltLogin()); + boolean altLogin = providerList.size() > 0 ? securityProps.isAltLogin() : false; + model.addAttribute("altLogin", altLogin); model.addAttribute("currentPage", "login"); @@ -164,6 +164,17 @@ public class AccountWebController { case "userIsDisabled": erroroauth = "login.userIsDisabled"; break; + case "invalid_destination": + erroroauth = "login.invalid_destination"; + break; + // Valid InResponseTo was not available from the validation context, unable to + // evaluate + case "invalid_in_response_to": + erroroauth = "login.invalid_in_response_to"; + break; + case "not_authentication_provider_found": + erroroauth = "login.not_authentication_provider_found"; + break; default: break; } diff --git a/src/main/java/stirling/software/SPDF/controller/web/GeneralWebController.java b/src/main/java/stirling/software/SPDF/controller/web/GeneralWebController.java index 14af6ee7a..99e29bde7 100644 --- a/src/main/java/stirling/software/SPDF/controller/web/GeneralWebController.java +++ b/src/main/java/stirling/software/SPDF/controller/web/GeneralWebController.java @@ -31,6 +31,10 @@ import com.fasterxml.jackson.databind.ObjectMapper; import io.swagger.v3.oas.annotations.Hidden; import io.swagger.v3.oas.annotations.tags.Tag; +import stirling.software.SPDF.controller.api.pipeline.UserServiceInterface; +import stirling.software.SPDF.model.SignatureFile; +import stirling.software.SPDF.service.SignatureService; + @Controller @Tag(name = "General", description = "General APIs") public class GeneralWebController { @@ -171,11 +175,28 @@ public class GeneralWebController { return "split-pdfs"; } + private static final String SIGNATURE_BASE_PATH = "customFiles/static/signatures/"; + private static final String ALL_USERS_FOLDER = "ALL_USERS"; + + @Autowired private SignatureService signatureService; + + @Autowired(required = false) + private UserServiceInterface userService; + @GetMapping("/sign") @Hidden public String signForm(Model model) { + String username = ""; + if (userService != null) { + username = userService.getCurrentUsername(); + } + + // Get signatures from both personal and ALL_USERS folders + List signatures = signatureService.getAvailableSignatures(username); + model.addAttribute("currentPage", "sign"); model.addAttribute("fonts", getFontNames()); + model.addAttribute("signatures", signatures); return "sign"; } diff --git a/src/main/java/stirling/software/SPDF/controller/web/SignatureController.java b/src/main/java/stirling/software/SPDF/controller/web/SignatureController.java new file mode 100644 index 000000000..eba4e1c44 --- /dev/null +++ b/src/main/java/stirling/software/SPDF/controller/web/SignatureController.java @@ -0,0 +1,44 @@ +package stirling.software.SPDF.controller.web; + +import java.io.IOException; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; + +import stirling.software.SPDF.controller.api.pipeline.UserServiceInterface; +import stirling.software.SPDF.service.SignatureService; + +@Controller +@RequestMapping("/api/v1/general/") +public class SignatureController { + + @Autowired private SignatureService signatureService; + + @Autowired(required = false) + private UserServiceInterface userService; + + @GetMapping("/sign/{fileName}") + public ResponseEntity getSignature(@PathVariable(name = "fileName") String fileName) + throws IOException { + String username = "NON_SECURITY_USER"; + if (userService != null) { + username = userService.getCurrentUsername(); + } + + // Verify access permission + if (!signatureService.hasAccessToFile(username, fileName)) { + return ResponseEntity.status(HttpStatus.FORBIDDEN).build(); + } + + byte[] imageBytes = signatureService.getSignatureBytes(username, fileName); + return ResponseEntity.ok() + .contentType(MediaType.IMAGE_JPEG) // Adjust based on file type + .body(imageBytes); + } +} diff --git a/src/main/java/stirling/software/SPDF/model/ApplicationProperties.java b/src/main/java/stirling/software/SPDF/model/ApplicationProperties.java index 16397965a..83df30ae0 100644 --- a/src/main/java/stirling/software/SPDF/model/ApplicationProperties.java +++ b/src/main/java/stirling/software/SPDF/model/ApplicationProperties.java @@ -47,6 +47,7 @@ public class ApplicationProperties { private AutomaticallyGenerated automaticallyGenerated = new AutomaticallyGenerated(); private EnterpriseEdition enterpriseEdition = new EnterpriseEdition(); private AutoPipeline autoPipeline = new AutoPipeline(); + private ProcessExecutor processExecutor = new ProcessExecutor(); @Data public static class AutoPipeline { @@ -309,4 +310,98 @@ public class ApplicationProperties { } } } + + @Data + public static class ProcessExecutor { + private SessionLimit sessionLimit = new SessionLimit(); + private TimeoutMinutes timeoutMinutes = new TimeoutMinutes(); + + @Data + public static class SessionLimit { + private int libreOfficeSessionLimit; + private int pdfToHtmlSessionLimit; + private int ocrMyPdfSessionLimit; + private int pythonOpenCvSessionLimit; + private int ghostScriptSessionLimit; + private int weasyPrintSessionLimit; + private int installAppSessionLimit; + private int calibreSessionLimit; + + public int getLibreOfficeSessionLimit() { + return libreOfficeSessionLimit > 0 ? libreOfficeSessionLimit : 1; + } + + public int getPdfToHtmlSessionLimit() { + return pdfToHtmlSessionLimit > 0 ? pdfToHtmlSessionLimit : 1; + } + + public int getOcrMyPdfSessionLimit() { + return ocrMyPdfSessionLimit > 0 ? ocrMyPdfSessionLimit : 2; + } + + public int getPythonOpenCvSessionLimit() { + return pythonOpenCvSessionLimit > 0 ? pythonOpenCvSessionLimit : 8; + } + + public int getGhostScriptSessionLimit() { + return ghostScriptSessionLimit > 0 ? ghostScriptSessionLimit : 16; + } + + public int getWeasyPrintSessionLimit() { + return weasyPrintSessionLimit > 0 ? weasyPrintSessionLimit : 16; + } + + public int getInstallAppSessionLimit() { + return installAppSessionLimit > 0 ? installAppSessionLimit : 1; + } + + public int getCalibreSessionLimit() { + return calibreSessionLimit > 0 ? calibreSessionLimit : 1; + } + } + + @Data + public static class TimeoutMinutes { + private long libreOfficeTimeoutMinutes; + private long pdfToHtmlTimeoutMinutes; + private long ocrMyPdfTimeoutMinutes; + private long pythonOpenCvTimeoutMinutes; + private long ghostScriptTimeoutMinutes; + private long weasyPrintTimeoutMinutes; + private long installAppTimeoutMinutes; + private long calibreTimeoutMinutes; + + public long getLibreOfficeTimeoutMinutes() { + return libreOfficeTimeoutMinutes > 0 ? libreOfficeTimeoutMinutes : 30; + } + + public long getPdfToHtmlTimeoutMinutes() { + return pdfToHtmlTimeoutMinutes > 0 ? pdfToHtmlTimeoutMinutes : 20; + } + + public long getOcrMyPdfTimeoutMinutes() { + return ocrMyPdfTimeoutMinutes > 0 ? ocrMyPdfTimeoutMinutes : 30; + } + + public long getPythonOpenCvTimeoutMinutes() { + return pythonOpenCvTimeoutMinutes > 0 ? pythonOpenCvTimeoutMinutes : 30; + } + + public long getGhostScriptTimeoutMinutes() { + return ghostScriptTimeoutMinutes > 0 ? ghostScriptTimeoutMinutes : 30; + } + + public long getWeasyPrintTimeoutMinutes() { + return weasyPrintTimeoutMinutes > 0 ? weasyPrintTimeoutMinutes : 30; + } + + public long getInstallAppTimeoutMinutes() { + return installAppTimeoutMinutes > 0 ? installAppTimeoutMinutes : 60; + } + + public long getCalibreTimeoutMinutes() { + return calibreTimeoutMinutes > 0 ? calibreTimeoutMinutes : 30; + } + } + } } diff --git a/src/main/java/stirling/software/SPDF/model/SignatureFile.java b/src/main/java/stirling/software/SPDF/model/SignatureFile.java new file mode 100644 index 000000000..7d82ebf0f --- /dev/null +++ b/src/main/java/stirling/software/SPDF/model/SignatureFile.java @@ -0,0 +1,11 @@ +package stirling.software.SPDF.model; + +import lombok.AllArgsConstructor; +import lombok.Data; + +@Data +@AllArgsConstructor +public class SignatureFile { + private String fileName; + private String category; // "Personal" or "Shared" +} diff --git a/src/main/java/stirling/software/SPDF/model/api/security/SignPDFWithCertRequest.java b/src/main/java/stirling/software/SPDF/model/api/security/SignPDFWithCertRequest.java index d3399db9d..6949a95e0 100644 --- a/src/main/java/stirling/software/SPDF/model/api/security/SignPDFWithCertRequest.java +++ b/src/main/java/stirling/software/SPDF/model/api/security/SignPDFWithCertRequest.java @@ -50,4 +50,7 @@ public class SignPDFWithCertRequest extends PDFFile { description = "The page number where the signature should be visible. This is required if showSignature is set to true") private Integer pageNumber; + + @Schema(description = "Whether to visually show a signature logo along with the signature") + private boolean showLogo; } diff --git a/src/main/java/stirling/software/SPDF/repository/JPATokenRepositoryImpl.java b/src/main/java/stirling/software/SPDF/repository/JPATokenRepositoryImpl.java index a901d3c38..7b2e58ffc 100644 --- a/src/main/java/stirling/software/SPDF/repository/JPATokenRepositoryImpl.java +++ b/src/main/java/stirling/software/SPDF/repository/JPATokenRepositoryImpl.java @@ -5,6 +5,7 @@ import java.util.Date; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.web.authentication.rememberme.PersistentRememberMeToken; import org.springframework.security.web.authentication.rememberme.PersistentTokenRepository; +import org.springframework.transaction.annotation.Transactional; import stirling.software.SPDF.model.PersistentLogin; @@ -13,6 +14,7 @@ public class JPATokenRepositoryImpl implements PersistentTokenRepository { @Autowired private PersistentLoginRepository persistentLoginRepository; @Override + @Transactional public void createNewToken(PersistentRememberMeToken token) { PersistentLogin newToken = new PersistentLogin(); newToken.setSeries(token.getSeries()); @@ -23,6 +25,7 @@ public class JPATokenRepositoryImpl implements PersistentTokenRepository { } @Override + @Transactional public void updateToken(String series, String tokenValue, Date lastUsed) { PersistentLogin existingToken = persistentLoginRepository.findById(series).orElse(null); if (existingToken != null) { @@ -43,11 +46,11 @@ public class JPATokenRepositoryImpl implements PersistentTokenRepository { } @Override + @Transactional public void removeUserTokens(String username) { - for (PersistentLogin token : persistentLoginRepository.findAll()) { - if (token.getUsername().equals(username)) { - persistentLoginRepository.delete(token); - } + try { + persistentLoginRepository.deleteByUsername(username); + } catch (Exception e) { } } } diff --git a/src/main/java/stirling/software/SPDF/repository/PersistentLoginRepository.java b/src/main/java/stirling/software/SPDF/repository/PersistentLoginRepository.java index 92d7bb81d..e8ef19ce2 100644 --- a/src/main/java/stirling/software/SPDF/repository/PersistentLoginRepository.java +++ b/src/main/java/stirling/software/SPDF/repository/PersistentLoginRepository.java @@ -6,4 +6,6 @@ import org.springframework.stereotype.Repository; import stirling.software.SPDF.model.PersistentLogin; @Repository -public interface PersistentLoginRepository extends JpaRepository {} +public interface PersistentLoginRepository extends JpaRepository { + void deleteByUsername(String username); +} diff --git a/src/main/java/stirling/software/SPDF/service/LanguageService.java b/src/main/java/stirling/software/SPDF/service/LanguageService.java new file mode 100644 index 000000000..2d4a47c6d --- /dev/null +++ b/src/main/java/stirling/software/SPDF/service/LanguageService.java @@ -0,0 +1,41 @@ +package stirling.software.SPDF.service; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +import org.springframework.core.io.Resource; +import org.springframework.core.io.support.PathMatchingResourcePatternResolver; +import org.springframework.stereotype.Service; + +@Service +public class LanguageService { + + private final PathMatchingResourcePatternResolver resourcePatternResolver = + new PathMatchingResourcePatternResolver(); + + public List getSupportedLanguages() { + List supportedLanguages = new ArrayList<>(); + + try { + Resource[] resources = + resourcePatternResolver.getResources("classpath*:messages_*.properties"); + for (Resource resource : resources) { + if (resource.exists() && resource.isReadable()) { + String filename = resource.getFilename(); + if (filename != null + && filename.startsWith("messages_") + && filename.endsWith(".properties")) { + String languageCode = + filename.replace("messages_", "").replace(".properties", ""); + supportedLanguages.add(languageCode); + } + } + } + } catch (IOException e) { + e.printStackTrace(); + } + + return supportedLanguages; + } +} diff --git a/src/main/java/stirling/software/SPDF/service/PostHogService.java b/src/main/java/stirling/software/SPDF/service/PostHogService.java index 381bb0147..68a8aa7a2 100644 --- a/src/main/java/stirling/software/SPDF/service/PostHogService.java +++ b/src/main/java/stirling/software/SPDF/service/PostHogService.java @@ -29,12 +29,12 @@ public class PostHogService { private final ApplicationProperties applicationProperties; private final UserServiceInterface userService; - @Autowired public PostHogService( PostHog postHog, @Qualifier("UUID") String uuid, - ApplicationProperties applicationProperties, @Autowired(required = false) UserServiceInterface userService) { + ApplicationProperties applicationProperties, + @Autowired(required = false) UserServiceInterface userService) { this.postHog = postHog; this.uniqueId = uuid; this.applicationProperties = applicationProperties; @@ -43,7 +43,7 @@ public class PostHogService { } private void captureSystemInfo() { - if (!Boolean.getBoolean(applicationProperties.getSystem().getEnableAnalytics())) { + if (!Boolean.parseBoolean(applicationProperties.getSystem().getEnableAnalytics())) { return; } try { @@ -54,7 +54,7 @@ public class PostHogService { } public void captureEvent(String eventName, Map properties) { - if (!Boolean.getBoolean(applicationProperties.getSystem().getEnableAnalytics())) { + if (!Boolean.parseBoolean(applicationProperties.getSystem().getEnableAnalytics())) { return; } postHog.capture(uniqueId, eventName, properties); @@ -137,10 +137,9 @@ public class PostHogService { metrics.put("docker_metrics", getDockerMetrics()); } metrics.put("application_properties", captureApplicationProperties()); - - - if(userService != null) { - metrics.put("total_users_created", userService.getTotalUsersCount()); + + if (userService != null) { + metrics.put("total_users_created", userService.getTotalUsersCount()); } } catch (Exception e) { diff --git a/src/main/java/stirling/software/SPDF/service/SignatureService.java b/src/main/java/stirling/software/SPDF/service/SignatureService.java new file mode 100644 index 000000000..c939337fe --- /dev/null +++ b/src/main/java/stirling/software/SPDF/service/SignatureService.java @@ -0,0 +1,100 @@ +package stirling.software.SPDF.service; + +import java.io.FileNotFoundException; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +import org.springframework.stereotype.Service; +import org.thymeleaf.util.StringUtils; + +import lombok.extern.slf4j.Slf4j; +import stirling.software.SPDF.model.SignatureFile; + +@Service +@Slf4j +public class SignatureService { + + private static final String SIGNATURE_BASE_PATH = "customFiles/signatures/"; + private static final String ALL_USERS_FOLDER = "ALL_USERS"; + + public boolean hasAccessToFile(String username, String fileName) throws IOException { + validateFileName(fileName); + // Check if file exists in user's personal folder or ALL_USERS folder + Path userPath = Paths.get(SIGNATURE_BASE_PATH, username, fileName); + Path allUsersPath = Paths.get(SIGNATURE_BASE_PATH, ALL_USERS_FOLDER, fileName); + + return Files.exists(userPath) || Files.exists(allUsersPath); + } + + public List getAvailableSignatures(String username) { + List signatures = new ArrayList<>(); + + // Get signatures from user's personal folder + if (!StringUtils.isEmptyOrWhitespace(username)) { + Path userFolder = Paths.get(SIGNATURE_BASE_PATH, username); + if (Files.exists(userFolder)) { + try { + signatures.addAll(getSignaturesFromFolder(userFolder, "Personal")); + } catch (IOException e) { + log.error("Error reading user signatures folder", e); + } + } + } + + // Get signatures from ALL_USERS folder + Path allUsersFolder = Paths.get(SIGNATURE_BASE_PATH, ALL_USERS_FOLDER); + if (Files.exists(allUsersFolder)) { + try { + signatures.addAll(getSignaturesFromFolder(allUsersFolder, "Shared")); + } catch (IOException e) { + log.error("Error reading shared signatures folder", e); + } + } + + return signatures; + } + + private List getSignaturesFromFolder(Path folder, String category) + throws IOException { + return Files.list(folder) + .filter(path -> isImageFile(path)) + .map(path -> new SignatureFile(path.getFileName().toString(), category)) + .collect(Collectors.toList()); + } + + public byte[] getSignatureBytes(String username, String fileName) throws IOException { + validateFileName(fileName); + // First try user's personal folder + Path userPath = Paths.get(SIGNATURE_BASE_PATH, username, fileName); + if (Files.exists(userPath)) { + return Files.readAllBytes(userPath); + } + + // Then try ALL_USERS folder + Path allUsersPath = Paths.get(SIGNATURE_BASE_PATH, ALL_USERS_FOLDER, fileName); + if (Files.exists(allUsersPath)) { + return Files.readAllBytes(allUsersPath); + } + + throw new FileNotFoundException("Signature file not found"); + } + + private boolean isImageFile(Path path) { + String fileName = path.getFileName().toString().toLowerCase(); + return fileName.endsWith(".jpg") + || fileName.endsWith(".jpeg") + || fileName.endsWith(".png") + || fileName.endsWith(".gif"); + } + + private void validateFileName(String fileName) { + if (fileName.contains("..") || fileName.contains("/") || fileName.contains("\\")) { + throw new IllegalArgumentException("Invalid filename"); + } + } +} diff --git a/src/main/java/stirling/software/SPDF/utils/ImageProcessingUtils.java b/src/main/java/stirling/software/SPDF/utils/ImageProcessingUtils.java index 655e344c3..4eba6c25a 100644 --- a/src/main/java/stirling/software/SPDF/utils/ImageProcessingUtils.java +++ b/src/main/java/stirling/software/SPDF/utils/ImageProcessingUtils.java @@ -1,13 +1,31 @@ package stirling.software.SPDF.utils; +import java.awt.geom.AffineTransform; +import java.awt.image.AffineTransformOp; import java.awt.image.BufferedImage; import java.awt.image.DataBuffer; import java.awt.image.DataBufferByte; import java.awt.image.DataBufferInt; +import java.io.IOException; +import java.io.InputStream; import java.nio.ByteBuffer; +import javax.imageio.ImageIO; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.web.multipart.MultipartFile; + +import com.drew.imaging.ImageMetadataReader; +import com.drew.imaging.ImageProcessingException; +import com.drew.metadata.Metadata; +import com.drew.metadata.MetadataException; +import com.drew.metadata.exif.ExifSubIFDDirectory; + public class ImageProcessingUtils { + private static final Logger logger = LoggerFactory.getLogger(PdfUtils.class); + static BufferedImage convertColorType(BufferedImage sourceImage, String colorType) { BufferedImage convertedImage; switch (colorType) { @@ -59,4 +77,51 @@ public class ImageProcessingUtils { return data; } } + + public static double extractImageOrientation(InputStream is) throws IOException { + try { + Metadata metadata = ImageMetadataReader.readMetadata(is); + ExifSubIFDDirectory directory = + metadata.getFirstDirectoryOfType(ExifSubIFDDirectory.class); + if (directory == null) { + return 0; + } + int orientationTag = directory.getInt(ExifSubIFDDirectory.TAG_ORIENTATION); + switch (orientationTag) { + case 1: + return 0; + case 6: + return 90; + case 3: + return 180; + case 8: + return 270; + default: + logger.warn("Unknown orientation tag: {}", orientationTag); + return 0; + } + } catch (ImageProcessingException | MetadataException e) { + return 0; + } + } + + public static BufferedImage applyOrientation(BufferedImage image, double orientation) { + if (orientation == 0) { + return image; + } + AffineTransform transform = + AffineTransform.getRotateInstance( + Math.toRadians(orientation), + image.getWidth() / 2.0, + image.getHeight() / 2.0); + AffineTransformOp op = new AffineTransformOp(transform, AffineTransformOp.TYPE_BILINEAR); + return op.filter(image, null); + } + + public static BufferedImage loadImageWithExifOrientation(MultipartFile file) + throws IOException { + BufferedImage image = ImageIO.read(file.getInputStream()); + double orientation = extractImageOrientation(file.getInputStream()); + return applyOrientation(image, orientation); + } } diff --git a/src/main/java/stirling/software/SPDF/utils/PdfUtils.java b/src/main/java/stirling/software/SPDF/utils/PdfUtils.java index 3416dee6f..8ccd29429 100644 --- a/src/main/java/stirling/software/SPDF/utils/PdfUtils.java +++ b/src/main/java/stirling/software/SPDF/utils/PdfUtils.java @@ -194,7 +194,8 @@ public class PdfUtils { pdfDocument.close(); - // Assumes the expectedPageSize is in the format "widthxheight", e.g. "595x842" for A4 + // Assumes the expectedPageSize is in the format "widthxheight", e.g. "595x842" + // for A4 String[] dimensions = expectedPageSize.split("x"); float expectedPageWidth = Float.parseFloat(dimensions[0]); float expectedPageHeight = Float.parseFloat(dimensions[1]); @@ -407,7 +408,7 @@ public class PdfUtils { addImageToDocument(doc, pdImage, fitOption, autoRotate); } } else { - BufferedImage image = ImageIO.read(file.getInputStream()); + BufferedImage image = ImageProcessingUtils.loadImageWithExifOrientation(file); BufferedImage convertedImage = ImageProcessingUtils.convertColorType(image, colorType); // Use JPEGFactory if it's JPEG since JPEG is lossy diff --git a/src/main/java/stirling/software/SPDF/utils/ProcessExecutor.java b/src/main/java/stirling/software/SPDF/utils/ProcessExecutor.java index 5055c14c7..0947714fd 100644 --- a/src/main/java/stirling/software/SPDF/utils/ProcessExecutor.java +++ b/src/main/java/stirling/software/SPDF/utils/ProcessExecutor.java @@ -18,10 +18,14 @@ import org.slf4j.LoggerFactory; import io.github.pixee.security.BoundedLineReader; +import stirling.software.SPDF.model.ApplicationProperties; + public class ProcessExecutor { private static final Logger logger = LoggerFactory.getLogger(ProcessExecutor.class); + private static ApplicationProperties applicationProperties = new ApplicationProperties(); + public enum Processes { LIBRE_OFFICE, PDFTOHTML, @@ -45,26 +49,90 @@ public class ProcessExecutor { key -> { int semaphoreLimit = switch (key) { - case LIBRE_OFFICE -> 1; - case PDFTOHTML -> 1; - case OCR_MY_PDF -> 2; - case PYTHON_OPENCV -> 8; - case GHOSTSCRIPT -> 16; - case WEASYPRINT -> 16; - case INSTALL_APP -> 1; - case CALIBRE -> 1; + case LIBRE_OFFICE -> + applicationProperties + .getProcessExecutor() + .getSessionLimit() + .getLibreOfficeSessionLimit(); + case PDFTOHTML -> + applicationProperties + .getProcessExecutor() + .getSessionLimit() + .getPdfToHtmlSessionLimit(); + case OCR_MY_PDF -> + applicationProperties + .getProcessExecutor() + .getSessionLimit() + .getOcrMyPdfSessionLimit(); + case PYTHON_OPENCV -> + applicationProperties + .getProcessExecutor() + .getSessionLimit() + .getPythonOpenCvSessionLimit(); + case GHOSTSCRIPT -> + applicationProperties + .getProcessExecutor() + .getSessionLimit() + .getGhostScriptSessionLimit(); + case WEASYPRINT -> + applicationProperties + .getProcessExecutor() + .getSessionLimit() + .getWeasyPrintSessionLimit(); + case INSTALL_APP -> + applicationProperties + .getProcessExecutor() + .getSessionLimit() + .getInstallAppSessionLimit(); + case CALIBRE -> + applicationProperties + .getProcessExecutor() + .getSessionLimit() + .getCalibreSessionLimit(); }; long timeoutMinutes = switch (key) { - case LIBRE_OFFICE -> 30; - case PDFTOHTML -> 20; - case OCR_MY_PDF -> 30; - case PYTHON_OPENCV -> 30; - case GHOSTSCRIPT -> 30; - case WEASYPRINT -> 30; - case INSTALL_APP -> 60; - case CALIBRE -> 30; + case LIBRE_OFFICE -> + applicationProperties + .getProcessExecutor() + .getTimeoutMinutes() + .getLibreOfficeTimeoutMinutes(); + case PDFTOHTML -> + applicationProperties + .getProcessExecutor() + .getTimeoutMinutes() + .getPdfToHtmlTimeoutMinutes(); + case OCR_MY_PDF -> + applicationProperties + .getProcessExecutor() + .getTimeoutMinutes() + .getOcrMyPdfTimeoutMinutes(); + case PYTHON_OPENCV -> + applicationProperties + .getProcessExecutor() + .getTimeoutMinutes() + .getPythonOpenCvTimeoutMinutes(); + case GHOSTSCRIPT -> + applicationProperties + .getProcessExecutor() + .getTimeoutMinutes() + .getGhostScriptTimeoutMinutes(); + case WEASYPRINT -> + applicationProperties + .getProcessExecutor() + .getTimeoutMinutes() + .getWeasyPrintTimeoutMinutes(); + case INSTALL_APP -> + applicationProperties + .getProcessExecutor() + .getTimeoutMinutes() + .getInstallAppTimeoutMinutes(); + case CALIBRE -> + applicationProperties + .getProcessExecutor() + .getTimeoutMinutes() + .getCalibreTimeoutMinutes(); }; return new ProcessExecutor(semaphoreLimit, liveUpdates, timeoutMinutes); }); diff --git a/src/main/java/stirling/software/SPDF/utils/misc/CustomColorReplaceStrategy.java b/src/main/java/stirling/software/SPDF/utils/misc/CustomColorReplaceStrategy.java index 3c5753f02..de548881e 100644 --- a/src/main/java/stirling/software/SPDF/utils/misc/CustomColorReplaceStrategy.java +++ b/src/main/java/stirling/software/SPDF/utils/misc/CustomColorReplaceStrategy.java @@ -5,6 +5,7 @@ import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.IOException; +import java.nio.file.Files; import java.util.List; import java.util.Set; @@ -53,7 +54,7 @@ public class CustomColorReplaceStrategy extends ReplaceAndInvertColorStrategy { } // Create a temporary file, with the original filename from the multipart file - File file = File.createTempFile("temp", getFileInput().getOriginalFilename()); + File file = Files.createTempFile("temp", getFileInput().getOriginalFilename()).toFile(); // Transfer the content of the multipart file to the file getFileInput().transferTo(file); diff --git a/src/main/java/stirling/software/SPDF/utils/misc/InvertFullColorStrategy.java b/src/main/java/stirling/software/SPDF/utils/misc/InvertFullColorStrategy.java index 12cd5204f..e32c1375d 100644 --- a/src/main/java/stirling/software/SPDF/utils/misc/InvertFullColorStrategy.java +++ b/src/main/java/stirling/software/SPDF/utils/misc/InvertFullColorStrategy.java @@ -6,6 +6,7 @@ import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.IOException; +import java.nio.file.Files; import javax.imageio.ImageIO; @@ -30,7 +31,7 @@ public class InvertFullColorStrategy extends ReplaceAndInvertColorStrategy { public InputStreamResource replace() throws IOException { // Create a temporary file, with the original filename from the multipart file - File file = File.createTempFile("temp", getFileInput().getOriginalFilename()); + File file = Files.createTempFile("temp", getFileInput().getOriginalFilename()).toFile(); // Transfer the content of the multipart file to the file getFileInput().transferTo(file); diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 0f957c0a9..fdfb603c1 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -50,4 +50,4 @@ springdoc.swagger-ui.url=/v1/api-docs posthog.api.key=phc_fiR65u5j6qmXTYL56MNrLZSWqLaDW74OrZH0Insd2xq -posthog.host=https://eu.i.posthog.com \ No newline at end of file +posthog.host=https://eu.i.posthog.com diff --git a/src/main/resources/messages_ar_AR.properties b/src/main/resources/messages_ar_AR.properties index 275557428..f78376586 100644 --- a/src/main/resources/messages_ar_AR.properties +++ b/src/main/resources/messages_ar_AR.properties @@ -76,15 +76,17 @@ donate=تبرع color=لون sponsor=راعٍ info=معلومات -pro=Pro -page=Page -pages=Pages +pro=محترف +page=صفحة +pages=صفحات +loading=جارٍ التحميل... +addToDoc=إضافة إلى المستند -legal.privacy=Privacy Policy -legal.terms=Terms and Conditions +legal.privacy=سياسة الخصوصية +legal.terms=شروط الاستخدام legal.accessibility=Accessibility -legal.cookie=Cookie Policy -legal.impressum=Impressum +legal.cookie=سياسة ملفات تعريف الارتباط +legal.impressum=بيان الهوية ############### # Pipeline # @@ -114,8 +116,8 @@ pipelineOptions.validateButton=تحقق ######################## # ENTERPRISE EDITION # ######################## -enterpriseEdition.button=Upgrade to Pro -enterpriseEdition.warning=This feature is only available to Pro users. +enterpriseEdition.button=ترقية إلى محترف +enterpriseEdition.warning=هذه الخاصية متوفرة فقط للمستخدمين المحترفين. enterpriseEdition.yamlAdvert=Stirling PDF Pro supports YAML configuration files and other SSO features. enterpriseEdition.ssoAdvert=Looking for more user management features? Check out Stirling PDF Pro @@ -123,12 +125,12 @@ enterpriseEdition.ssoAdvert=Looking for more user management features? Check out ################# # Analytics # ################# -analytics.title=Do you want make Stirling PDF better? -analytics.paragraph1=Stirling PDF has opt in analytics to help us improve the product. We do not track any personal information or file contents. -analytics.paragraph2=Please consider enabling analytics to help Stirling-PDF grow and to allow us to understand our users better. -analytics.enable=Enable analytics -analytics.disable=Disable analytics -analytics.settings=You can change the settings for analytics in the config/settings.yml file +analytics.title=هل تريد تحسين Stirling PDF؟ +analytics.paragraph1=Stirling PDF يحتوي على إحصائيات مختصة للمساعدة في تحسين المنتج. لا نتبع أي معلومات شخصية أو محتوى الملفات. +analytics.paragraph2=يرجى مراعاة تفعيل الإحصائيات لمساعدتنا على نمو Stirling-PDF وتوفير فهم أفضل لمستخدمينا. +analytics.enable=تفعيل الإحصائيات +analytics.disable=تعطيل الإحصائيات +analytics.settings=يمكنك تغيير إعدادات الإحصائيات في ملف config/settings.yml ############# # NAVBAR # @@ -145,7 +147,7 @@ navbar.sections.convertFrom=تحويل من PDF navbar.sections.security=التوقيع والأمان navbar.sections.advance=متقدم navbar.sections.edit=عرض وتعديل -navbar.sections.popular=Popular +navbar.sections.popular=المفضل ############# # SETTINGS # @@ -244,6 +246,7 @@ database.fileNullOrEmpty=يجب ألا يكون الملف فارغًا أو خ database.failedImportFile=فشل استيراد الملف session.expired=Your session has expired. Please refresh the page and try again. +session.refreshPage=Refresh Page ############# # HOME-PAGE # @@ -503,28 +506,28 @@ home.removeImagePdf.desc=إزالة الصورة من PDF لتقليل حجم ا removeImagePdf.tags=إزالة الصورة,عمليات الصفحة,الخلفية,جانب الخادم -home.splitPdfByChapters.title=Split PDF by Chapters -home.splitPdfByChapters.desc=Split a PDF into multiple files based on its chapter structure. -splitPdfByChapters.tags=split,chapters,bookmarks,organize +home.splitPdfByChapters.title=تجزئة المستندات PDF حسب الفصول +home.splitPdfByChapters.desc=قسم مستند PDF إلى ملفات متعددة بناءً على هيكل فصوله. +splitPdfByChapters.tags=تجزئة، فصول، علامات تبويب، تنظيم #replace-invert-color replace-color.title=Replace-Invert-Color -replace-color.header=Replace-Invert Color PDF +replace-color.header=استبدال-إلغاء مirro لون PDF home.replaceColorPdf.title=Replace and Invert Color -home.replaceColorPdf.desc=Replace color for text and background in PDF and invert full color of pdf to reduce file size -replaceColorPdf.tags=Replace Color,Page operations,Back end,server side -replace-color.selectText.1=Replace or Invert color Options +home.replaceColorPdf.desc=استبدال الألوان للنصوص والخلفيات في المستندات PDF وإلغاء تعكير اللون الكامل للمستند لتقليل حجم الملف +replaceColorPdf.tags=استبدال اللون، عمليات الصفحة، الخلفية، جانب الخادم +replace-color.selectText.1=خيارات استبدال-إلغاء مirro لون replace-color.selectText.2=Default(Default high contrast colors) -replace-color.selectText.3=Custom(Customized colors) +replace-color.selectText.3=خصيصة (ألوان شخصية) replace-color.selectText.4=Full-Invert(Invert all colors) -replace-color.selectText.5=High contrast color options -replace-color.selectText.6=white text on black background -replace-color.selectText.7=Black text on white background -replace-color.selectText.8=Yellow text on black background -replace-color.selectText.9=Green text on black background -replace-color.selectText.10=Choose text Color -replace-color.selectText.11=Choose background Color -replace-color.submit=Replace +replace-color.selectText.5=خيارات ألوان التباين العالي +replace-color.selectText.6=نص أبيض على خلفية سوداء +replace-color.selectText.7=نص أسود على خلفية بيضاء +replace-color.selectText.8=نص صفرة على خلفية سوداء +replace-color.selectText.9=نص أخضر على خلفية سوداء +replace-color.selectText.10=اختر لون النص +replace-color.selectText.11=اختر لون الخلفية +replace-color.submit=استبدال @@ -551,9 +554,9 @@ login.oauth2AccessDenied=تم رفض الوصول login.oauth2InvalidTokenResponse=استجابة الرمز المميز غير صالحة login.oauth2InvalidIdToken=رمز الهوية غير صالح login.userIsDisabled=تم تعطيل المستخدم، تم حظر تسجيل الدخول حاليًا باستخدام اسم المستخدم هذا. يرجى الاتصال بالمسؤول. -login.alreadyLoggedIn=You are already logged in to -login.alreadyLoggedIn2=devices. Please log out of the devices and try again. -login.toManySessions=You have too many active sessions +login.alreadyLoggedIn=لقد تسجل دخولًا إلى +login.alreadyLoggedIn2=أجهزة أخرى. يرجى تسجيل الخروج من الأجهزة وحاول مرة أخرى. +login.toManySessions=لديك عدة جلسات نشطة #auto-redact autoRedact.title=حجب تلقائي @@ -728,7 +731,7 @@ pageLayout.submit=إرسال scalePages.title=ضبط مقياس الصفحة scalePages.header=ضبط مقياس الصفحة scalePages.pageSize=حجم صفحة المستند. -scalePages.keepPageSize=Original Size +scalePages.keepPageSize=الحجم الأصلي scalePages.scaleFactor=مستوى التكبير (الاقتصاص) للصفحة. scalePages.submit=إرسال @@ -748,6 +751,7 @@ certSign.showSig=إظهار التوقيع certSign.reason=السبب certSign.location=الموقع certSign.name=الاسم +certSign.showLogo=عرض الشعار certSign.submit=توقيع PDF @@ -782,6 +786,9 @@ compare.highlightColor.2=لون التظليل 2: compare.document.1=المستند 1 compare.document.2=المستند 2 compare.submit=مقارنة +compare.complex.message=أو كلا المستندين المقدمين كبيران حجمًا، مما يؤدي إلى تقليل دقة المقارنة +compare.large.file.message=أو كلا المستندين المقدمين كبيرة حجمهما للتعامل معهما +compare.no.text.message=أحد أو كلي المستندات المرجوة للمقارنة لا يحتوي على محتوى نصي. يرجى اختيار مستندات تحتوي على نص لم يتم التعرف عليه. #BookToPDF BookToPDF.title=الكتب والكوميكس إلى PDF @@ -804,6 +811,11 @@ sign.draw=رسم التوقيع sign.text=إدخال النص sign.clear=مسح sign.add=إضافة +sign.saved=توقيعات تم حفظها +sign.save=حفظ توقيع +sign.personalSigs=توقيعات شخصية +sign.sharedSigs=توقيعات مشتركة +sign.noSavedSigs=لم يتم العثور على توقيعات محفوظة #repair @@ -921,7 +933,14 @@ pdfOrganiser.placeholder=(مثال: 1,3,2 أو 4-8,2,10-12 أو 2n-1) multiTool.title=أداة متعددة PDF multiTool.header=أداة متعددة PDF multiTool.uploadPrompts=اسم الملف - +multiTool.selectAll=Select All +multiTool.deselectAll=Deselect All +multiTool.selectPages=Page Select +multiTool.selectedPages=Selected Pages +multiTool.page=Page +multiTool.deleteSelected=Delete Selected +multiTool.downloadAll=Export +multiTool.downloadSelected=Export Selected #view pdf viewPdf.title=عرض PDF viewPdf.header=عرض PDF @@ -1181,8 +1200,8 @@ licenses.license=الترخيص survey.nav=استطلاع survey.title=استطلاع Stirling-PDF survey.description=Stirling-PDF لا يحتوي على تتبع لذا نريد أن نسمع من مستخدمينا لتحسين Stirling-PDF! -survey.changes=Stirling-PDF has changed since the last survey! To find out more please check our blog post here: -survey.changes2=With these changes we are getting paid business support and funding +survey.changes=تحديث Stirling-PDF منذ آخر استبيان! للحصول على المزيد من المعلومات الرجاء زيارة مقالتنا في المدونة هنا: +survey.changes2=مع هذه التحديثات، نستفيد من الدعم العملي والمنحة المالية survey.please=يرجى النظر في المشاركة في استطلاعنا! survey.disabled=(سيتم تعطيل النافذة المنبثقة للاستطلاع في التحديثات التالية ولكنها ستكون متاحة في أسفل الصفحة) survey.button=المشاركة في الاستطلاع @@ -1210,15 +1229,13 @@ removeImage.removeImage=إزالة الصورة removeImage.submit=إزالة الصورة -splitByChapters.title=Split PDF by Chapters -splitByChapters.header=Split PDF by Chapters -splitByChapters.bookmarkLevel=Bookmark Level -splitByChapters.includeMetadata=Include Metadata +splitByChapters.title=تجزئة المستند حسب الفصول +splitByChapters.header=تجزئة المستند حسب الفصول +splitByChapters.bookmarkLevel=مستوى العلامات التذكارية +splitByChapters.includeMetadata=شامل البيانات المرفقة splitByChapters.allowDuplicates=Allow Duplicates splitByChapters.desc.1=This tool splits a PDF file into multiple PDFs based on its chapter structure. splitByChapters.desc.2=Bookmark Level: Choose the level of bookmarks to use for splitting (0 for top-level, 1 for second-level, etc.). -splitByChapters.desc.3=Include Metadata: If checked, the original PDF's metadata will be included in each split PDF. -splitByChapters.desc.4=Allow Duplicates: If checked, allows multiple bookmarks on the same page to create separate PDFs. -splitByChapters.submit=Split PDF - - +splitByChapters.desc.3=تمثيل البيانات الأصلية: إذا تم اختيارها، سترمز البيانات المرجعية الأصلية إلى كل PDF مجزأ. +splitByChapters.desc.4=سماح بالتكرار: إذا تم اختياره، يسمح بوجود معاينات متعددة في الصفحة نفسها لخلق ملفات PDF منفصلة. +splitByChapters.submit=تقطيع ملف PDF diff --git a/src/main/resources/messages_bg_BG.properties b/src/main/resources/messages_bg_BG.properties index c1f7a10d3..de9868da8 100644 --- a/src/main/resources/messages_bg_BG.properties +++ b/src/main/resources/messages_bg_BG.properties @@ -79,6 +79,8 @@ info=Информация pro=Pro page=Страница pages=Страници +loading=Loading... +addToDoc=Add to Document legal.privacy=Политика за поверителност legal.terms=Правила и условия @@ -244,6 +246,7 @@ database.fileNullOrEmpty=Файлът не трябва да е нулев ил database.failedImportFile=Неуспешно импортиране на файл session.expired=Вашата сесия е изтекла. Моля, опреснете страницата и опитайте отново. +session.refreshPage=Refresh Page ############# # HOME-PAGE # @@ -748,6 +751,7 @@ certSign.showSig=Показване на подпис certSign.reason=Причина certSign.location=Местоположение certSign.name=Име +certSign.showLogo=Show Logo certSign.submit=Подпишете PDF @@ -782,6 +786,9 @@ compare.highlightColor.2=Цвят на маркирането 2: compare.document.1=Документ 1 compare.document.2=Документ 2 compare.submit=Сравнявай +compare.complex.message=One or both of the provided documents are large files, accuracy of comparison may be reduced +compare.large.file.message=One or Both of the provided documents are too large to process +compare.no.text.message=One or both of the selected PDFs have no text content. Please choose PDFs with text for comparison. #BookToPDF BookToPDF.title=Книги и комикси в PDF @@ -804,6 +811,11 @@ sign.draw=Начертайте подпис sign.text=Въвеждане на текст sign.clear=Изчисти sign.add=Добави +sign.saved=Saved Signatures +sign.save=Save Signature +sign.personalSigs=Personal Signatures +sign.sharedSigs=Shared Signatures +sign.noSavedSigs=No saved signatures found #repair @@ -921,7 +933,14 @@ pdfOrganiser.placeholder=(напр. 1,3,2 или 4-8,2,10-12 или 2n-1) multiTool.title=PDF Мулти инструмент multiTool.header=PDF Мулти инструмент multiTool.uploadPrompts=Име на файл - +multiTool.selectAll=Select All +multiTool.deselectAll=Deselect All +multiTool.selectPages=Page Select +multiTool.selectedPages=Selected Pages +multiTool.page=Page +multiTool.deleteSelected=Delete Selected +multiTool.downloadAll=Export +multiTool.downloadSelected=Export Selected #view pdf viewPdf.title=Преглед на PDF viewPdf.header=Преглед на PDF @@ -1220,5 +1239,3 @@ splitByChapters.desc.2=Ниво на отметка: Изберете нивот splitByChapters.desc.3=Включване на метаданни: Ако е отметнато, метаданните на оригиналния PDF ще бъдат включени във всеки разделен PDF. splitByChapters.desc.4=Разрешаване на дубликати: Ако е отметнато, позволява множество отметки на една и съща страница за създаване на отделни PDF файлове. splitByChapters.submit=Разделяне на PDF - - diff --git a/src/main/resources/messages_ca_CA.properties b/src/main/resources/messages_ca_CA.properties index 71d30fa73..388247675 100644 --- a/src/main/resources/messages_ca_CA.properties +++ b/src/main/resources/messages_ca_CA.properties @@ -3,8 +3,8 @@ ########### # the direction that the language is written (ltr = left to right, rtl = right to left) language.direction=ltr -addPageNumbers.fontSize=Font Size -addPageNumbers.fontName=Font Name +addPageNumbers.fontSize=Mida del tipus de lletra +addPageNumbers.fontName=Nom del tipus de lletra pdfPrompt=Selecciona PDF(s) multiPdfPrompt=Selecciona PDFs (2+) multiPdfDropPrompt=Selecciona (o arrossega) els documents PDF @@ -12,17 +12,17 @@ imgPrompt=Selecciona Imatge(s) genericSubmit=Envia processTimeWarning=Alerta: Aquest procés pot tardar 1 minut depenent de la mida de l'arxiu pageOrderPrompt=Ordre de Pàgines (Llista separada per comes) : -pageSelectionPrompt=Custom Page Selection (Enter a comma-separated list of page numbers 1,5,6 or Functions like 2n+1) : +pageSelectionPrompt=Selecció de pàgines personalitzada (Introdueix una llista separada per comes de números de pàgina, 1,5,6 o funcions com 2n+1): goToPage=Anar true=Verdader false=Fals unknown=Desconegut save=Desa -saveToBrowser=Save to Browser +saveToBrowser=Desa al navegador close=Tanca filesSelected=fitxers seleccionats noFavourites=No s'ha afegit cap favorit -downloadComplete=Download Complete +downloadComplete=Descarrega completa bored=Avorrit esperant? alphabet=Alfabet downloadPdf=Descarregueu PDF @@ -46,105 +46,107 @@ red=Vermell green=Verd blue=Blau custom=Personalitzat... -WorkInProgess=Work in progress, May not work or be buggy, Please report any problems! -poweredBy=Powered by -yes=Yes +WorkInProgess=En desenvolupament, pot no funcionar o contenir errors. Si us plau, informa de qualsevol problema! +poweredBy=Impulsat per +yes=Si no=No -changedCredsMessage=Credentials changed! -notAuthenticatedMessage=User not authenticated. -userNotFoundMessage=User not found. -incorrectPasswordMessage=Current password is incorrect. -usernameExistsMessage=New Username already exists. -invalidUsernameMessage=Invalid username, username can only contain letters, numbers and the following special characters @._+- or must be a valid email address. -invalidPasswordMessage=The password must not be empty and must not have spaces at the beginning or end. -confirmPasswordErrorMessage=New Password and Confirm New Password must match. -deleteCurrentUserMessage=Cannot delete currently logged in user. -deleteUsernameExistsMessage=The username does not exist and cannot be deleted. +changedCredsMessage=Credencials canviades! +notAuthenticatedMessage=Usuari no autenticat. +userNotFoundMessage=Usuari no trobat. +incorrectPasswordMessage=La contrasenya actual és incorrecta. +usernameExistsMessage=El nou nom d’usuari ja existeix. +invalidUsernameMessage=Nom d’usuari no vàlid, només pot contenir lletres, números i els següents caràcters especials @._+- o ha de ser una adreça de correu electrònic vàlida. +invalidPasswordMessage=La contrasenya no pot estar buida ni tenir espais al principi o al final. +confirmPasswordErrorMessage=La contrasenya no pot estar buida ni tenir espais al principi o al final. +deleteCurrentUserMessage=No es pot eliminar l’usuari actualment connectat. +deleteUsernameExistsMessage=El nom d’usuari no existeix i no es pot eliminar. downgradeCurrentUserMessage=No es pot reduir la funció de l'usuari actual -disabledCurrentUserMessage=The current user cannot be disabled +disabledCurrentUserMessage=L’usuari actual no pot ser deshabilitat downgradeCurrentUserLongMessage=No es pot baixar la funció de l'usuari actual. Per tant, no es mostrarà l'usuari actual. -userAlreadyExistsOAuthMessage=The user already exists as an OAuth2 user. -userAlreadyExistsWebMessage=The user already exists as an web user. +userAlreadyExistsOAuthMessage=L’usuari ja existeix com a usuari OAuth2. +userAlreadyExistsWebMessage=L’usuari ja existeix com a usuari web. error=Error oops=Oops! -help=Help -goHomepage=Go to Homepage -joinDiscord=Join our Discord server -seeDockerHub=See Docker Hub -visitGithub=Visit Github Repository -donate=Donate +help=Ajuda +goHomepage=Vés a la pàgina principal +joinDiscord=Uneix-te al nostre servidor de Discord +seeDockerHub=Veure Docker Hub +visitGithub=Visita el repositori de GitHub +donate=Fes una donació color=Color -sponsor=Sponsor -info=Info +sponsor=Patrocinador +info=Informació pro=Pro -page=Page -pages=Pages +page=Pàgina +pages=Pàgines +loading=Carregant... +addToDoc=Afegeix al document -legal.privacy=Privacy Policy -legal.terms=Terms and Conditions -legal.accessibility=Accessibility -legal.cookie=Cookie Policy -legal.impressum=Impressum +legal.privacy=Política de Privacitat +legal.terms=Termes i condicions +legal.accessibility=Accessibilitat +legal.cookie=Política de galetes +legal.impressum=Avís Legal ############### # Pipeline # ############### -pipeline.header=Pipeline Menu (Beta) -pipeline.uploadButton=Upload Custom -pipeline.configureButton=Configure -pipeline.defaultOption=Custom -pipeline.submitButton=Submit -pipeline.help=Pipeline Help -pipeline.scanHelp=Folder Scanning Help -pipeline.deletePrompt=Are you sure you want to delete pipeline +pipeline.header=Menú de Processos (Beta) +pipeline.uploadButton=Càrrega personalitzada +pipeline.configureButton=Configura +pipeline.defaultOption=Personalitzat +pipeline.submitButton=Envia-ho +pipeline.help=Ajuda de Processos +pipeline.scanHelp=Ajuda per a l’Escaneig de Carpetes +pipeline.deletePrompt=Estàs segur que vols eliminar els processos? ###################### # Pipeline Options # ###################### -pipelineOptions.header=Pipeline Configuration -pipelineOptions.pipelineNameLabel=Pipeline Name -pipelineOptions.saveSettings=Save Operation Settings -pipelineOptions.pipelineNamePrompt=Enter pipeline name here -pipelineOptions.selectOperation=Select Operation -pipelineOptions.addOperationButton=Add operation -pipelineOptions.pipelineHeader=Pipeline: -pipelineOptions.saveButton=Download -pipelineOptions.validateButton=Validate +pipelineOptions.header=Configuració del Procés +pipelineOptions.pipelineNameLabel=Nom del Procés +pipelineOptions.saveSettings=Desa la configuració de l'operació +pipelineOptions.pipelineNamePrompt=Introdueix el nom del procés aquí +pipelineOptions.selectOperation=Selecciona Operació +pipelineOptions.addOperationButton=Afegeix operació +pipelineOptions.pipelineHeader=Procés: +pipelineOptions.saveButton=Descarrega +pipelineOptions.validateButton=Valida ######################## # ENTERPRISE EDITION # ######################## -enterpriseEdition.button=Upgrade to Pro -enterpriseEdition.warning=This feature is only available to Pro users. -enterpriseEdition.yamlAdvert=Stirling PDF Pro supports YAML configuration files and other SSO features. -enterpriseEdition.ssoAdvert=Looking for more user management features? Check out Stirling PDF Pro +enterpriseEdition.button=Actualitza a Pro +enterpriseEdition.warning=Aquesta funció només està disponible per a usuaris Pro. +enterpriseEdition.yamlAdvert=Stirling PDF Pro admet fitxers de configuració YAML i altres funcions d'SSO. +enterpriseEdition.ssoAdvert=Busques més funcions de gestió d'usuaris? Consulta Stirling PDF Pro ################# # Analytics # ################# -analytics.title=Do you want make Stirling PDF better? -analytics.paragraph1=Stirling PDF has opt in analytics to help us improve the product. We do not track any personal information or file contents. -analytics.paragraph2=Please consider enabling analytics to help Stirling-PDF grow and to allow us to understand our users better. -analytics.enable=Enable analytics -analytics.disable=Disable analytics -analytics.settings=You can change the settings for analytics in the config/settings.yml file +analytics.title=Vols ajudar a millorar Stirling PDF? +analytics.paragraph1=Stirling PDF té analítiques opcionals per ajudar-nos a millorar el producte. No recopilem cap informació personal ni el contingut dels fitxers. +analytics.paragraph2=Si us plau, considera habilitar les analítiques per ajudar Stirling PDF a créixer i permetre'ns entendre millor els nostres usuaris. +analytics.enable=Habilita analítiques +analytics.disable=Desactiva analítiques +analytics.settings=Pots canviar la configuració de les analítiques al fitxer config/settings.yml ############# # NAVBAR # ############# -navbar.favorite=Favorites +navbar.favorite=Favorits navbar.darkmode=Mode Fosc -navbar.language=Languages +navbar.language=Idiomes navbar.settings=Opcions -navbar.allTools=Tools -navbar.multiTool=Multi Tools -navbar.sections.organize=Organize -navbar.sections.convertTo=Convert to PDF -navbar.sections.convertFrom=Convert from PDF -navbar.sections.security=Sign & Security -navbar.sections.advance=Advanced -navbar.sections.edit=View & Edit +navbar.allTools=Eines +navbar.multiTool=Multi Tool +navbar.sections.organize=Organitzar +navbar.sections.convertTo=Convertir a PDF +navbar.sections.convertFrom=Convertir des de PDF +navbar.sections.security=Signatura i Seguretat +navbar.sections.advance=Avançat +navbar.sections.edit=Visualitzar i Editar navbar.sections.popular=Popular ############# @@ -152,112 +154,113 @@ navbar.sections.popular=Popular ############# settings.title=Opcions settings.update=Actualització Disponible -settings.updateAvailable={0} is the current installed version. A new version ({1}) is available. -settings.appVersion=Versió App: -settings.downloadOption.title=Trieu l'opció de descàrrega (per a descàrregues d'un sol fitxer no zip): -settings.downloadOption.1=Obre mateixa finestra -settings.downloadOption.2=Obre mateixa finestra -settings.downloadOption.3=Descarrega Arxiu +settings.updateAvailable=La versió actual instal·lada és {0}. Una nova versió ({1}) està disponible. +settings.appVersion=Versió de l'App: +settings.downloadOption.title=Trieu l'opció de descàrrega (per a descàrregues d'un sol fitxer no comprimit): +settings.downloadOption.1=Obre en la mateixa finestra +settings.downloadOption.2=Obre en una finestra nova +settings.downloadOption.3=Descarrega fitxer settings.zipThreshold=Comprimiu els fitxers quan el nombre de fitxers baixats superi settings.signOut=Sortir -settings.accountSettings=Account Settings -settings.bored.help=Enables easter egg game -settings.cacheInputs.name=Save form inputs -settings.cacheInputs.help=Enable to store previously used inputs for future runs +settings.accountSettings=Configuració del Compte +settings.bored.help=Activa un joc ocult +settings.cacheInputs.name=Desa els valors del formulari +settings.cacheInputs.help=Habilita per guardar els valors utilitzats prèviament per a futures execucions -changeCreds.title=Change Credentials -changeCreds.header=Update Your Account Details -changeCreds.changePassword=You are using default login credentials. Please enter a new password -changeCreds.newUsername=New Username -changeCreds.oldPassword=Current Password -changeCreds.newPassword=New Password -changeCreds.confirmNewPassword=Confirm New Password -changeCreds.submit=Submit Changes +changeCreds.title=Canvia les Credencials +changeCreds.header=Actualitza les Dades del Compte +changeCreds.changePassword=Estàs utilitzant les credencials d'inici de sessió per defecte. Si us plau, introdueix una nova contrasenya +changeCreds.newUsername=Nou Nom d'Usuari +changeCreds.oldPassword=Contrasenya Actual +changeCreds.newPassword=Nova Contrasenya +changeCreds.confirmNewPassword=Confirma la Nova Contrasenya +changeCreds.submit=Envia els Canvis account.title=Opcions del compte account.accountSettings=Opcions del compte -account.adminSettings=Opcions d'Admin - Veure i afegir usuaris +account.adminSettings=Opcions d'Administrador - Veure i afegir usuaris account.userControlSettings=Opcions de Control d'Usuari -account.changeUsername=Canvia nom usuari +account.changeUsername=Canvia el nom d'usuari account.newUsername=Nom d'usuari nou account.password=Confirma contrasenya -account.oldPassword=Password Antic -account.newPassword=Password Nou -account.changePassword=Canvia contrasenya -account.confirmNewPassword=Confirma Nova contrasenya +account.oldPassword=Contrasenya Antiga +account.newPassword=Nova Contrasenya +account.changePassword=Canvia la contrasenya +account.confirmNewPassword=Confirma la Nova Contrasenya account.signOut=Sortir account.yourApiKey=Clau API -account.syncTitle=Sincronitza opcions navegador amb compte -account.settingsCompare=Comparador Opcions: +account.syncTitle=Sincronitza les opcions del navegador amb el compte +account.settingsCompare=Comparador d'Opcions: account.property=Propietat: -account.webBrowserSettings=Opcins Navegador +account.webBrowserSettings=Opcions del Navegador account.syncToBrowser=Sincronitza Compte -> Navegador account.syncToAccount=Sincronitza Compte <- Navegador -adminUserSettings.title=Opcions Control Usuari -adminUserSettings.header=Usuari Admin Opcions Control +adminUserSettings.title=Opcions de Control d'Usuari +adminUserSettings.header=Opcions de Control d'Usuari Admin adminUserSettings.admin=Admin adminUserSettings.user=Usuari adminUserSettings.addUser=Afegir Usuari -adminUserSettings.deleteUser=Delete User -adminUserSettings.confirmDeleteUser=Should the user be deleted? -adminUserSettings.confirmChangeUserStatus=Should the user be disabled/enabled? -adminUserSettings.usernameInfo=Username can only contain letters, numbers and the following special characters @._+- or must be a valid email address. +adminUserSettings.deleteUser=Elimina Usuari +adminUserSettings.confirmDeleteUser=Vols eliminar aquest usuari? +adminUserSettings.confirmChangeUserStatus=Vols deshabilitar/habilitar aquest usuari? +adminUserSettings.usernameInfo=El nom d'usuari només pot contenir lletres, números i els següents caràcters especials: @._+- o ha de ser una adreça de correu electrònic vàlida. adminUserSettings.roles=Rols adminUserSettings.role=Rol adminUserSettings.actions=Accions adminUserSettings.apiUser=Usuari amb API limitada -adminUserSettings.extraApiUser=Additional Limited API User +adminUserSettings.extraApiUser=Usuari Addicional amb API limitada adminUserSettings.webOnlyUser=Usuari només WEB -adminUserSettings.demoUser=Demo User (No custom settings) -adminUserSettings.internalApiUser=Internal API User -adminUserSettings.forceChange=Force user to change password on login -adminUserSettings.submit=Desar Usuari +adminUserSettings.demoUser=Usuari de Demo (Sense configuracions personalitzades) +adminUserSettings.internalApiUser=Usuari d'API Interna +adminUserSettings.forceChange=Força l'usuari a canviar la contrasenya en iniciar sessió +adminUserSettings.submit=Desa Usuari adminUserSettings.changeUserRole=Canvia el rol de l'usuari -adminUserSettings.authenticated=Authenticated -adminUserSettings.editOwnProfil=Edit own profile -adminUserSettings.enabledUser=enabled user -adminUserSettings.disabledUser=disabled user -adminUserSettings.activeUsers=Active Users: -adminUserSettings.disabledUsers=Disabled Users: -adminUserSettings.totalUsers=Total Users: -adminUserSettings.lastRequest=Last Request +adminUserSettings.authenticated=Autenticat +adminUserSettings.editOwnProfil=Edita el propi perfil +adminUserSettings.enabledUser=usuari habilitat +adminUserSettings.disabledUser=usuari deshabilitat +adminUserSettings.activeUsers=Usuaris Actius: +adminUserSettings.disabledUsers=Usuaris Deshabilitats: +adminUserSettings.totalUsers=Total d'Usuaris: +adminUserSettings.lastRequest=Darrera Sol·licitud -database.title=Database Import/Export -database.header=Database Import/Export -database.fileName=File Name -database.creationDate=Creation Date -database.fileSize=File Size -database.deleteBackupFile=Delete Backup File -database.importBackupFile=Import Backup File -database.downloadBackupFile=Download Backup File -database.info_1=When importing data, it is crucial to ensure the correct structure. If you are unsure of what you are doing, seek advice and support from a professional. An error in the structure can cause application malfunctions, up to and including the complete inability to run the application. -database.info_2=The file name does not matter when uploading. It will be renamed afterward to follow the format backup_user_yyyyMMddHHmm.sql, ensuring a consistent naming convention. -database.submit=Import Backup -database.importIntoDatabaseSuccessed=Import into database successed -database.fileNotFound=File not Found -database.fileNullOrEmpty=File must not be null or empty -database.failedImportFile=Failed Import File +database.title=Importació/Exportació de Base de Dades +database.header=Importació/Exportació de Base de Dades +database.fileName=Nom del Fitxer +database.creationDate=Data de Creació +database.fileSize=Mida del Fitxer +database.deleteBackupFile=Elimina el Fitxer de Còpia de Seguretat +database.importBackupFile=Importa el Fitxer de Còpia de Seguretat +database.downloadBackupFile=Descarrega el Fitxer de Còpia de Seguretat +database.info_1=Quan importis dades, és crucial assegurar-se que l'estructura sigui correcta. Si no estàs segur del que fas, busca l'assessorament d'un professional. Un error en l'estructura pot causar malfuncionaments de l'aplicació, fins i tot impossibilitar-ne l'execució. +database.info_2=El nom del fitxer no importa quan es puja. Es renombrarà després per seguir el format backup_user_yyyyMMddHHmm.sql, assegurant una convenció de nomenclatura consistent. +database.submit=Importa la Còpia de Seguretat +database.importIntoDatabaseSuccessed=Importació a la base de dades completada amb èxit +database.fileNotFound=Fitxer no trobat +database.fileNullOrEmpty=El fitxer no ha de ser nul o buit +database.failedImportFile=Error en la importació del fitxer -session.expired=Your session has expired. Please refresh the page and try again. +session.expired=La teva sessió ha expirat. Si us plau, actualitza la pàgina i torna a intentar-ho. +session.refreshPage=Actualitza la pàgina ############# # HOME-PAGE # ############# -home.desc=L'eina allotjada localment per a necessitats PDF. -home.searchBar=Search for features... +home.desc=L'eina allotjada localment per a necessitats de PDF. +home.searchBar=Cerca funcions... -home.viewPdf.title=View PDF -home.viewPdf.desc=View, annotate, add text or images +home.viewPdf.title=Visualitza PDF +home.viewPdf.desc=Visualitza, anota, afegeix text o imatges viewPdf.tags=view,read,annotate,text,image -home.multiTool.title=PDF Multi Tool -home.multiTool.desc=Fusiona, Rota, Reorganitza, i Esborra pàgines +home.multiTool.title=Eina Multifunció de PDF +home.multiTool.desc=Fusiona, Rota, Reorganitza i Esborra pàgines multiTool.tags=Multi Tool,Multi operation,UI,click drag,front end,client side home.merge.title=Fusiona @@ -342,7 +345,7 @@ home.PDFToWord.desc=Converteix PDF a formats de Word (DOC, DOCX and ODT) PDFToWord.tags=doc,docx,odt,word,transformation,format,conversion,office,microsoft,docfile home.PDFToPresentation.title=PDF a Presentació -home.PDFToPresentation.desc=Convert PDF to Presentation formats (PPT, PPTX and ODP) +home.PDFToPresentation.desc=Converteix PDF a formats de Presentació (PPT, PPTX i ODP) PDFToPresentation.tags=slides,show,office,microsoft home.PDFToText.title=PDF a Text/RTF @@ -378,8 +381,8 @@ home.removeBlanks.title=Elimina les pàgines en blanc home.removeBlanks.desc=Detecta i elimina les pàgines en blanc d'un document removeBlanks.tags=cleanup,streamline,non-content,organize -home.removeAnnotations.title=Remove Annotations -home.removeAnnotations.desc=Removes all comments/annotations from a PDF +home.removeAnnotations.title=Elimina Anotacions +home.removeAnnotations.desc=Elimina tots els comentaris/anotacions d'un PDF removeAnnotations.tags=comments,highlight,notes,markup,remove home.compare.title=Compara @@ -387,31 +390,31 @@ home.compare.desc=Compara i mostra les diferències entre 2 documents PDF compare.tags=differentiate,contrast,changes,analysis home.certSign.title=Signa amb Certificat -home.certSign.desc=Sign PDF amb Certificate/Clau (PEM/P12) +home.certSign.desc=Signa PDF amb Certificat/Clau (PEM/P12) certSign.tags=authentica,PEM,P12,official,encripta -home.removeCertSign.title=Remove Certificate Sign -home.removeCertSign.desc=Remove certificate signature from PDF +home.removeCertSign.title=Elimina Signatura de Certificat +home.removeCertSign.desc=Elimina la signatura de certificat d'un PDF removeCertSign.tags=authenticate,PEM,P12,official,decrypt -home.pageLayout.title=Multi-Page Layout -home.pageLayout.desc=Merge multiple pages of a PDF document into a single page +home.pageLayout.title=Disposició Multi-Pàgina +home.pageLayout.desc=Fusiona diverses pàgines d'un document PDF en una sola pàgina pageLayout.tags=merge,composite,single-view,organize -home.scalePages.title=Adjust page size/scale -home.scalePages.desc=Change the size/scale of page and/or its contents. +home.scalePages.title=Ajusta la mida/escala de la pàgina +home.scalePages.desc=Canvia la mida/escala de la pàgina i/o del seu contingut. scalePages.tags=resize,modify,dimension,adapt -home.pipeline.title=Pipeline -home.pipeline.desc=Run multiple actions on PDFs by defining pipeline scripts +home.pipeline.title=Procés +home.pipeline.desc=Executa múltiples accions en PDFs definint scripts de procés pipeline.tags=automate,sequence,scripted,batch-process home.add-page-numbers.title=Afegir Números de Pàgina home.add-page-numbers.desc=Afegir Números de Pàgina en una localització add-page-numbers.tags=pagina,etiqueta,organitza,indexa -home.auto-rename.title=Auto Rename PDF File -home.auto-rename.desc=Auto renames a PDF file based on its detected header +home.auto-rename.title=Canvia Automàticament el Nom del Fitxer PDF +home.auto-rename.desc=Canvia automàticament el nom d'un fitxer PDF en funció de la capçalera detectada auto-rename.tags=auto-detect,header-based,organize,relabel home.adjust-contrast.title=Ajusta Colors/Contrast @@ -422,109 +425,109 @@ home.crop.title=Talla PDF home.crop.desc=Talla PDF per reduïr la mida (manté text!) crop.tags=trim,shrink,edit,shape -home.autoSplitPDF.title=Auto Split Pages -home.autoSplitPDF.desc=Auto Split Scanned PDF with physical scanned page splitter QR Code +home.autoSplitPDF.title=Divisió Automàtica de Pàgines +home.autoSplitPDF.desc=Divideix automàticament un PDF escanejat amb un codi QR de separació de pàgines escanejades autoSplitPDF.tags=QR-based,separate,scan-segment,organize -home.sanitizePdf.title=Sanitize -home.sanitizePdf.desc=Remove scripts and other elements from PDF files +home.sanitizePdf.title=Neteja +home.sanitizePdf.desc=Elimina scripts i altres elements dels fitxers PDF sanitizePdf.tags=clean,secure,safe,remove-threats -home.URLToPDF.title=URL/Website To PDF -home.URLToPDF.desc=Converts any http(s)URL to PDF +home.URLToPDF.title=URL/Lloc Web a PDF +home.URLToPDF.desc=Converteix qualsevol URL http(s) a PDF URLToPDF.tags=web-capture,save-page,web-to-doc,archive -home.HTMLToPDF.title=HTML to PDF -home.HTMLToPDF.desc=Converts any HTML file or zip to PDF +home.HTMLToPDF.title=HTML a PDF +home.HTMLToPDF.desc=Converteix qualsevol fitxer HTML o arxiu comprimit a PDF HTMLToPDF.tags=markup,web-content,transformation,convert -home.MarkdownToPDF.title=Markdown to PDF -home.MarkdownToPDF.desc=Converts any Markdown file to PDF +home.MarkdownToPDF.title=Markdown a PDF +home.MarkdownToPDF.desc=Converteix qualsevol fitxer Markdown a PDF MarkdownToPDF.tags=markup,web-content,transformation,convert -home.getPdfInfo.title=Get ALL Info on PDF -home.getPdfInfo.desc=Grabs any and all information possible on PDFs +home.getPdfInfo.title=Obteniu Tota la Informació sobre el PDF +home.getPdfInfo.desc=Recupera tota la informació possible sobre els PDFs getPdfInfo.tags=infomation,data,stats,statistics -home.extractPage.title=Extract page(s) -home.extractPage.desc=Extracts select pages from PDF +home.extractPage.title=Extreu pàgina(es) +home.extractPage.desc=Extreu pàgines seleccionades d'un PDF extractPage.tags=extract -home.PdfToSinglePage.title=PDF to Single Large Page -home.PdfToSinglePage.desc=Merges all PDF pages into one large single page +home.PdfToSinglePage.title=PDF a Una Sola Pàgina Gran +home.PdfToSinglePage.desc=Fusiona totes les pàgines d'un PDF en una sola pàgina gran PdfToSinglePage.tags=single page -home.showJS.title=Show Javascript -home.showJS.desc=Searches and displays any JS injected into a PDF +home.showJS.title=Mostra Javascript +home.showJS.desc=Cerca i mostra qualsevol JS injectat en un PDF showJS.tags=JS -home.autoRedact.title=Auto Redact -home.autoRedact.desc=Auto Redacts(Blacks out) text in a PDF based on input text +home.autoRedact.title=Redacció Automàtica +home.autoRedact.desc=Redacta automàticament (enfosqueix) text en un PDF basat en el text introduït autoRedact.tags=Redact,Hide,black out,black,marker,hidden -home.tableExtraxt.title=PDF to CSV -home.tableExtraxt.desc=Extracts Tables from a PDF converting it to CSV +home.tableExtraxt.title=PDF a CSV +home.tableExtraxt.desc=Extreu taules d'un PDF convertint-les a CSV tableExtraxt.tags=CSV,Table Extraction,extract,convert -home.autoSizeSplitPDF.title=Auto Split by Size/Count -home.autoSizeSplitPDF.desc=Split a single PDF into multiple documents based on size, page count, or document count +home.autoSizeSplitPDF.title=Divisió Automàtica per Mida/Quantitat +home.autoSizeSplitPDF.desc=Divideix un únic PDF en múltiples documents basant-se en la mida, el nombre de pàgines o el nombre de documents autoSizeSplitPDF.tags=pdf,split,document,organization -home.overlay-pdfs.title=Overlay PDFs -home.overlay-pdfs.desc=Overlays PDFs on-top of another PDF +home.overlay-pdfs.title=Superposar PDFs +home.overlay-pdfs.desc=Superposa PDFs sobre un altre PDF overlay-pdfs.tags=Overlay -home.split-by-sections.title=Split PDF by Sections -home.split-by-sections.desc=Divide each page of a PDF into smaller horizontal and vertical sections +home.split-by-sections.title=Divideix PDF per Seccions +home.split-by-sections.desc=Divideix cada pàgina d'un PDF en seccions horitzontals i verticals més petites split-by-sections.tags=Section Split, Divide, Customize -home.AddStampRequest.title=Add Stamp to PDF -home.AddStampRequest.desc=Add text or add image stamps at set locations +home.AddStampRequest.title=Afegeix Segell al PDF +home.AddStampRequest.desc=Afegeix segells de text o imatge en ubicacions establertes AddStampRequest.tags=Stamp, Add image, center image, Watermark, PDF, Embed, Customize -home.PDFToBook.title=PDF to Book -home.PDFToBook.desc=Converts PDF to Book/Comic formats using calibre +home.PDFToBook.title=PDF a Llibre +home.PDFToBook.desc=Converteix PDF a formats de llibre/còmic utilitzant Calibre PDFToBook.tags=Book,Comic,Calibre,Convert,manga,amazon,kindle -home.BookToPDF.title=Book to PDF -home.BookToPDF.desc=Converts Books/Comics formats to PDF using calibre +home.BookToPDF.title=Llibre a PDF +home.BookToPDF.desc=Converteix formats de llibres/còmics a PDF utilitzant Calibre BookToPDF.tags=Book,Comic,Calibre,Convert,manga,amazon,kindle -home.removeImagePdf.title=Remove image -home.removeImagePdf.desc=Remove image from PDF to reduce file size +home.removeImagePdf.title=Elimina imatge +home.removeImagePdf.desc=Elimina imatges d'un PDF per reduir la mida del fitxer removeImagePdf.tags=Remove Image,Page operations,Back end,server side -home.splitPdfByChapters.title=Split PDF by Chapters -home.splitPdfByChapters.desc=Split a PDF into multiple files based on its chapter structure. +home.splitPdfByChapters.title=Divideix PDF per Capítols +home.splitPdfByChapters.desc=Divideix un PDF en múltiples fitxers segons la seva estructura de capítols. splitPdfByChapters.tags=split,chapters,bookmarks,organize #replace-invert-color -replace-color.title=Replace-Invert-Color -replace-color.header=Replace-Invert Color PDF -home.replaceColorPdf.title=Replace and Invert Color -home.replaceColorPdf.desc=Replace color for text and background in PDF and invert full color of pdf to reduce file size -replaceColorPdf.tags=Replace Color,Page operations,Back end,server side -replace-color.selectText.1=Replace or Invert color Options -replace-color.selectText.2=Default(Default high contrast colors) -replace-color.selectText.3=Custom(Customized colors) -replace-color.selectText.4=Full-Invert(Invert all colors) -replace-color.selectText.5=High contrast color options -replace-color.selectText.6=white text on black background -replace-color.selectText.7=Black text on white background -replace-color.selectText.8=Yellow text on black background -replace-color.selectText.9=Green text on black background -replace-color.selectText.10=Choose text Color -replace-color.selectText.11=Choose background Color -replace-color.submit=Replace +replace-color.title=Reemplaça-Inverteix-Color +replace-color.header=Reemplaça-Inverteix Color en PDF +home.replaceColorPdf.title=Reemplaça i Inverteix Color +home.replaceColorPdf.desc=Reemplaça el color del text i el fons en un PDF i inverteix tot el color del PDF per reduir la mida del fitxer +replaceColorPdf.tags=Reemplaça Color,Operacions de pàgina,Back end,Costat servidor +replace-color.selectText.1=Opcions per Reemplaçar o Invertir color +replace-color.selectText.2=Per defecte (Colors d'alt contrast per defecte) +replace-color.selectText.3=Personalitzat (Colors personalitzats) +replace-color.selectText.4=Inversió completa (Inverteix tots els colors) +replace-color.selectText.5=Opcions de color d'alt contrast +replace-color.selectText.6=Text blanc sobre fons negre +replace-color.selectText.7=Text negre sobre fons blanc +replace-color.selectText.8=Text groc sobre fons negre +replace-color.selectText.9=Text verd sobre fons negre +replace-color.selectText.10=Tria el color del text +replace-color.selectText.11=Tria el color del fons +replace-color.submit=Reemplaça @@ -538,61 +541,61 @@ login.title=Accedir login.header=Accedir login.signin=Accedir login.rememberme=Recordar -login.invalid=Nom usuari / password no vàlid +login.invalid=Nom d'usuari/contrasenya no vàlid login.locked=Compte bloquejat login.signinTitle=Autenticat -login.ssoSignIn=Inicia sessió mitjançant l'inici de sessió ún -login.oauth2AutoCreateDisabled=L'usuari de creació automàtica OAUTH2 està desactivat -login.oauth2AdminBlockedUser=Registration or logging in of non-registered users is currently blocked. Please contact the administrator. -login.oauth2RequestNotFound=Authorization request not found -login.oauth2InvalidUserInfoResponse=Invalid User Info Response -login.oauth2invalidRequest=Invalid Request -login.oauth2AccessDenied=Access Denied -login.oauth2InvalidTokenResponse=Invalid Token Response -login.oauth2InvalidIdToken=Invalid Id Token -login.userIsDisabled=User is deactivated, login is currently blocked with this username. Please contact the administrator. -login.alreadyLoggedIn=You are already logged in to -login.alreadyLoggedIn2=devices. Please log out of the devices and try again. -login.toManySessions=You have too many active sessions +login.ssoSignIn=Inicia sessió mitjançant inici de sessió únic +login.oauth2AutoCreateDisabled=La creació automàtica d'usuaris OAUTH2 està desactivada +login.oauth2AdminBlockedUser=El registre o inici de sessió d'usuaris no registrats està actualment bloquejat. Si us plau, contacta amb l'administrador. +login.oauth2RequestNotFound=Sol·licitud d'autorització no trobada +login.oauth2InvalidUserInfoResponse=Resposta d'informació d'usuari no vàlida +login.oauth2invalidRequest=Sol·licitud no vàlida +login.oauth2AccessDenied=Accés denegat +login.oauth2InvalidTokenResponse=Resposta de token no vàlida +login.oauth2InvalidIdToken=ID Token no vàlid +login.userIsDisabled=L'usuari està desactivat, l'inici de sessió està actualment bloquejat amb aquest nom d'usuari. Si us plau, contacta amb l'administrador. +login.alreadyLoggedIn=Ja has iniciat sessió a +login.alreadyLoggedIn2=dispositius. Si us plau, tanca la sessió en els dispositius i torna-ho a intentar. +login.toManySessions=Tens massa sessions actives #auto-redact -autoRedact.title=Auto Redact -autoRedact.header=Auto Redact -autoRedact.colorLabel=Colour -autoRedact.textsToRedactLabel=Text to Redact (line-separated) -autoRedact.textsToRedactPlaceholder=e.g. \nConfidential \nTop-Secret -autoRedact.useRegexLabel=Use Regex -autoRedact.wholeWordSearchLabel=Whole Word Search -autoRedact.customPaddingLabel=Custom Extra Padding -autoRedact.convertPDFToImageLabel=Convert PDF to PDF-Image (Used to remove text behind the box) -autoRedact.submitButton=Submit +autoRedact.title=Redacció Automàtica +autoRedact.header=Redacció Automàtica +autoRedact.colorLabel=Color +autoRedact.textsToRedactLabel=Text a Redactar (separat per línies) +autoRedact.textsToRedactPlaceholder=p. ex. \nConfidencial \nMolt Secret +autoRedact.useRegexLabel=Utilitza Regex +autoRedact.wholeWordSearchLabel=Cerca de Paraula Completa +autoRedact.customPaddingLabel=Espai Extra Personalitzat +autoRedact.convertPDFToImageLabel=Converteix PDF a Imatge PDF (S'utilitza per eliminar text darrere del quadre) +autoRedact.submitButton=Envia #showJS -showJS.title=Show Javascript -showJS.header=Show Javascript -showJS.downloadJS=Download Javascript -showJS.submit=Show +showJS.title=Mostra Javascript +showJS.header=Mostra Javascript +showJS.downloadJS=Descarrega Javascript +showJS.submit=Mostra #pdfToSinglePage -pdfToSinglePage.title=PDF To Single Page -pdfToSinglePage.header=PDF To Single Page -pdfToSinglePage.submit=Convert To Single Page +pdfToSinglePage.title=PDF a Pàgina Única +pdfToSinglePage.header=PDF a Pàgina Única +pdfToSinglePage.submit=Converteix a Pàgina Única #pageExtracter -pageExtracter.title=Extract Pages -pageExtracter.header=Extract Pages -pageExtracter.submit=Extract -pageExtracter.placeholder=(e.g. 1,2,8 or 4,7,12-16 or 2n-1) +pageExtracter.title=Extreu Pàgines +pageExtracter.header=Extreu Pàgines +pageExtracter.submit=Extreu +pageExtracter.placeholder=(p. ex. 1,2,8 o 4,7,12-16 o 2n-1) #getPdfInfo -getPdfInfo.title=Get Info on PDF -getPdfInfo.header=Get Info on PDF -getPdfInfo.submit=Get Info -getPdfInfo.downloadJson=Download JSON +getPdfInfo.title=Obteniu Informació del PDF +getPdfInfo.header=Obteniu Informació del PDF +getPdfInfo.submit=Obteniu Informació +getPdfInfo.downloadJson=Descarrega JSON #markdown-to-pdf @@ -605,183 +608,187 @@ MarkdownToPDF.credit=Uses WeasyPrint #url-to-pdf -URLToPDF.title=URL To PDF -URLToPDF.header=URL To PDF -URLToPDF.submit=Convert -URLToPDF.credit=Uses WeasyPrint +URLToPDF.title=URL a PDF +URLToPDF.header=URL a PDF +URLToPDF.submit=Converteix +URLToPDF.credit=Utilitza WeasyPrint #html-to-pdf -HTMLToPDF.title=HTML To PDF -HTMLToPDF.header=HTML To PDF -HTMLToPDF.help=Accepts HTML files and ZIPs containing html/css/images etc required -HTMLToPDF.submit=Convert -HTMLToPDF.credit=Uses WeasyPrint -HTMLToPDF.zoom=Zoom level for displaying the website. -HTMLToPDF.pageWidth=Width of the page in centimeters. (Blank to default) -HTMLToPDF.pageHeight=Height of the page in centimeters. (Blank to default) -HTMLToPDF.marginTop=Top margin of the page in millimeters. (Blank to default) -HTMLToPDF.marginBottom=Bottom margin of the page in millimeters. (Blank to default) -HTMLToPDF.marginLeft=Left margin of the page in millimeters. (Blank to default) -HTMLToPDF.marginRight=Right margin of the page in millimeters. (Blank to default) -HTMLToPDF.printBackground=Render the background of websites. -HTMLToPDF.defaultHeader=Enable Default Header (Name and page number) -HTMLToPDF.cssMediaType=Change the CSS media type of the page. -HTMLToPDF.none=None -HTMLToPDF.print=Print -HTMLToPDF.screen=Screen +HTMLToPDF.title=HTML a PDF +HTMLToPDF.header=HTML a PDF +HTMLToPDF.help=Accepta fitxers HTML i arxius ZIP que contenen html/css/imatges, etc. necessaris +HTMLToPDF.submit=Converteix +HTMLToPDF.credit=Utilitza WeasyPrint +HTMLToPDF.zoom=Nivell de zoom per mostrar el lloc web. +HTMLToPDF.pageWidth=Amplada de la pàgina en centímetres. (En blanc per defecte) +HTMLToPDF.pageHeight=Alçada de la pàgina en centímetres. (En blanc per defecte) +HTMLToPDF.marginTop=Margen superior de la pàgina en mil·límetres. (En blanc per defecte) +HTMLToPDF.marginBottom=Marge inferior de la pàgina en mil·límetres. (En blanc per defecte) +HTMLToPDF.marginLeft=Marge esquerre de la pàgina en mil·límetres. (En blanc per defecte) +HTMLToPDF.marginRight=Marge dret de la pàgina en mil·límetres. (En blanc per defecte) +HTMLToPDF.printBackground=Renderitza el fons dels llocs web. +HTMLToPDF.defaultHeader=Habilita la Capçalera per Defecte (Nom i número de pàgina) +HTMLToPDF.cssMediaType=Canvia el tipus de mitjà CSS de la pàgina. +HTMLToPDF.none=Cap +HTMLToPDF.print=Imprimir +HTMLToPDF.screen=Pantalla #AddStampRequest -AddStampRequest.header=Stamp PDF -AddStampRequest.title=Stamp PDF -AddStampRequest.stampType=Stamp Type -AddStampRequest.stampText=Stamp Text -AddStampRequest.stampImage=Stamp Image -AddStampRequest.alphabet=Alphabet -AddStampRequest.fontSize=Font/Image Size -AddStampRequest.rotation=Rotation -AddStampRequest.opacity=Opacity -AddStampRequest.position=Position -AddStampRequest.overrideX=Override X Coordinate -AddStampRequest.overrideY=Override Y Coordinate -AddStampRequest.customMargin=Custom Margin -AddStampRequest.customColor=Custom Text Color -AddStampRequest.submit=Submit +AddStampRequest.header=Segella PDF +AddStampRequest.title=Segella PDF +AddStampRequest.stampType=Tipus de Segell +AddStampRequest.stampText=Text del Segell +AddStampRequest.stampImage=Imatge del Segell +AddStampRequest.alphabet=Alfabet +AddStampRequest.fontSize=Mida de la Font/Imatge +AddStampRequest.rotation=Rotació +AddStampRequest.opacity=Opacitat +AddStampRequest.position=Posició +AddStampRequest.overrideX=Modifica la Coordenada X +AddStampRequest.overrideY=Modifica la Coordenada Y +AddStampRequest.customMargin=Marge Personalitzat +AddStampRequest.customColor=Color de Text Personalitzat +AddStampRequest.submit=Envia #sanitizePDF -sanitizePDF.title=Sanitize PDF -sanitizePDF.header=Sanitize a PDF file -sanitizePDF.selectText.1=Remove JavaScript actions -sanitizePDF.selectText.2=Remove embedded files -sanitizePDF.selectText.3=Remove metadata -sanitizePDF.selectText.4=Remove links -sanitizePDF.selectText.5=Remove fonts -sanitizePDF.submit=Sanitize PDF +sanitizePDF.title=Neteja PDF +sanitizePDF.header=Neteja un fitxer PDF +sanitizePDF.selectText.1=Elimina accions JavaScript +sanitizePDF.selectText.2=Elimina fitxers incrustats +sanitizePDF.selectText.3=Elimina metadades +sanitizePDF.selectText.4=Elimina enllaços +sanitizePDF.selectText.5=Elimina fonts +sanitizePDF.submit=Neteja PDF #addPageNumbers addPageNumbers.title=Afegir Números de Pàgina addPageNumbers.header=Afegir Números de Pàgina addPageNumbers.selectText.1=Selecciona PDF: -addPageNumbers.selectText.2=Mida Marge +addPageNumbers.selectText.2=Mida del Marge addPageNumbers.selectText.3=Posició addPageNumbers.selectText.4=Número Inicial -addPageNumbers.selectText.5=Pàgines a enumerar +addPageNumbers.selectText.5=Pàgines a Enumerar addPageNumbers.selectText.6=Text Personalitzat addPageNumbers.customTextDesc=Text Personalitzat -addPageNumbers.numberPagesDesc=Pàgines a enumerar, defecte 'totes', accepta 1-5 o 2,5,9 etc -addPageNumbers.customNumberDesc=Defecte a {n}, accepta 'Pàgina {n} de {total}', 'Text-{n}', '{filename}-{n} +addPageNumbers.numberPagesDesc=Pàgines a enumerar, per defecte 'totes', accepta 1-5 o 2,5,9, etc. +addPageNumbers.customNumberDesc=Per defecte {n}, accepta 'Pàgina {n} de {total}', 'Text-{n}', '{filename}-{n}' addPageNumbers.submit=Afegir Números de Pàgina #auto-rename -auto-rename.title=Auto Rename -auto-rename.header=Auto Rename PDF -auto-rename.submit=Auto Rename +auto-rename.title=Canvi de Nom Automàtic +auto-rename.header=Canvi de Nom Automàtic de PDF +auto-rename.submit=Canvi de Nom Automàtic #adjustContrast -adjustContrast.title=Adjust Contrast -adjustContrast.header=Adjust Contrast +adjustContrast.title=Ajusta el Contrast +adjustContrast.header=Ajusta el Contrast adjustContrast.contrast=Contrast: -adjustContrast.brightness=Brightness: -adjustContrast.saturation=Saturation: -adjustContrast.download=Download +adjustContrast.brightness=Brillantor: +adjustContrast.saturation=Saturació: +adjustContrast.download=Descarrega #crop crop.title=Talla crop.header=Talla PDF -crop.submit=Submit +crop.submit=Envia #autoSplitPDF -autoSplitPDF.title=Auto Split PDF -autoSplitPDF.header=Auto Split PDF -autoSplitPDF.description=Print, Insert, Scan, upload, and let us auto-separate your documents. No manual work sorting needed. -autoSplitPDF.selectText.1=Print out some divider sheets from below (Black and white is fine). -autoSplitPDF.selectText.2=Scan all your documents at once by inserting the divider sheet between them. -autoSplitPDF.selectText.3=Upload the single large scanned PDF file and let Stirling PDF handle the rest. -autoSplitPDF.selectText.4=Divider pages are automatically detected and removed, guaranteeing a neat final document. -autoSplitPDF.formPrompt=Submit PDF containing Stirling-PDF Page dividers: -autoSplitPDF.duplexMode=Duplex Mode (Front and back scanning) -autoSplitPDF.dividerDownload1=Download 'Auto Splitter Divider (minimal).pdf' -autoSplitPDF.dividerDownload2=Download 'Auto Splitter Divider (with instructions).pdf' -autoSplitPDF.submit=Submit +autoSplitPDF.title=Divisió Automàtica de PDF +autoSplitPDF.header=Divisió Automàtica de PDF +autoSplitPDF.description=Imprimeix, insereix, escaneja, puja i deixa que el sistema separi automàticament els teus documents. No cal ordenar manualment. +autoSplitPDF.selectText.1=Imprimeix algunes fulles divisòries de les opcions següents (en blanc i negre està bé). +autoSplitPDF.selectText.2=Escaneja tots els teus documents alhora inserint una fulla divisòria entre cada document. +autoSplitPDF.selectText.3=Puja el fitxer PDF escanejat gran i deixa que Stirling PDF faci la resta. +autoSplitPDF.selectText.4=Les pàgines divisòries es detecten i eliminen automàticament, garantint un document final ordenat. +autoSplitPDF.formPrompt=Envia un PDF que contingui les pàgines divisòries de Stirling-PDF: +autoSplitPDF.duplexMode=Mode Dúplex (Escaneig de davant i darrere) +autoSplitPDF.dividerDownload1=Descarrega 'Divisor Automàtic (mínim).pdf' +autoSplitPDF.dividerDownload2=Descarrega 'Divisor Automàtic (amb instruccions).pdf' +autoSplitPDF.submit=Envia #pipeline -pipeline.title=Pipeline +pipeline.title=Procés #pageLayout -pageLayout.title=Multi Page Layout -pageLayout.header=Multi Page Layout -pageLayout.pagesPerSheet=Pages per sheet: -pageLayout.addBorder=Add Borders -pageLayout.submit=Submit +pageLayout.title=Disposició de Múltiples Pàgines +pageLayout.header=Disposició de Múltiples Pàgines +pageLayout.pagesPerSheet=Pàgines per full: +pageLayout.addBorder=Afegeix Marcs +pageLayout.submit=Envia #scalePages -scalePages.title=Adjust page-scale -scalePages.header=Adjust page-scale -scalePages.pageSize=Size of a page of the document. -scalePages.keepPageSize=Original Size -scalePages.scaleFactor=Zoom level (crop) of a page. -scalePages.submit=Submit +scalePages.title=Ajusta l'escala de la pàgina +scalePages.header=Ajusta l'escala de la pàgina +scalePages.pageSize=Mida d'una pàgina del document. +scalePages.keepPageSize=Mida Original +scalePages.scaleFactor=Nivell de zoom (retall) d'una pàgina. +scalePages.submit=Envia #certSign -certSign.title=Significació del certificat -certSign.header=Firmar un PDF amb el vostre certificat (Treball en curs) +certSign.title=Signatura amb Certificat +certSign.header=Signa un PDF amb el teu certificat (Treball en curs) certSign.selectPDF=Seleccioneu un fitxer PDF per signar: -certSign.jksNote=Note: If your certificate type is not listed below, please convert it to a Java Keystore (.jks) file using the keytool command line tool. Then, choose the .jks file option below. +certSign.jksNote=Nota: Si el vostre tipus de certificat no es troba a la llista, convertiu-lo a un fitxer de Java Keystore (.jks) utilitzant l'eina de línia de comandes keytool. A continuació, trieu l'opció de fitxer .jks més avall. certSign.selectKey=Seleccioneu el vostre fitxer de clau privada (format PKCS#8, podria ser .pem o .der): certSign.selectCert=Seleccioneu el vostre fitxer de certificat (format X.509, podria ser .pem o .der): certSign.selectP12=Seleccioneu el vostre fitxer de magatzem de claus PKCS#12 (.p12 o .pfx) (Opcional, si es proporciona, hauria de contenir la vostra clau privada i certificat): -certSign.selectJKS=Select Your Java Keystore File (.jks or .keystore): +certSign.selectJKS=Seleccioneu el vostre fitxer de Java Keystore (.jks o .keystore): certSign.certType=Tipus de certificat -certSign.password=Introduïu el vostre magatzem de claus o contrasenya de clau privada (si n'hi ha): +certSign.password=Introduïu la contrasenya del vostre magatzem de claus o clau privada (si n'hi ha): certSign.showSig=Mostra la signatura certSign.reason=Motiu certSign.location=Ubicació certSign.name=Nom -certSign.submit=Firma PDF +certSign.showLogo=Mostra el logotip +certSign.submit=Signa PDF #removeCertSign -removeCertSign.title=Remove Certificate Signature -removeCertSign.header=Remove the digital certificate from the PDF -removeCertSign.selectPDF=Select a PDF file: -removeCertSign.submit=Remove Signature +removeCertSign.title=Elimina la Signatura del Certificat +removeCertSign.header=Elimina el certificat digital del PDF +removeCertSign.selectPDF=Seleccioneu un fitxer PDF: +removeCertSign.submit=Elimina Signatura #removeBlanks removeBlanks.title=Elimina els espais en blanc removeBlanks.header=Elimina les pàgines en blanc removeBlanks.threshold=Llindar: -removeBlanks.thresholdDesc=Llindar per determinar el blanc que ha de ser un píxel blanc -removeBlanks.whitePercent=Percentatge blanc (%): -removeBlanks.whitePercentDesc=Percentatge de pàgina que ha de ser blanca per eliminar-la +removeBlanks.thresholdDesc=Llindar per determinar el nivell de blanc que ha de tenir un píxel per considerar-lo blanc +removeBlanks.whitePercent=Percentatge de blanc (%): +removeBlanks.whitePercentDesc=Percentatge de la pàgina que ha de ser blanca per eliminar-la removeBlanks.submit=Elimina els espais en blanc #removeAnnotations -removeAnnotations.title=Remove Annotations -removeAnnotations.header=Remove Annotations -removeAnnotations.submit=Remove +removeAnnotations.title=Elimina Anotacions +removeAnnotations.header=Elimina Anotacions +removeAnnotations.submit=Elimina #compare compare.title=Comparar compare.header=Compara PDF -compare.highlightColor.1=Highlight Color 1: -compare.highlightColor.2=Highlight Color 2: +compare.highlightColor.1=Color de Ressaltat 1: +compare.highlightColor.2=Color de Ressaltat 2: compare.document.1=Document 1 compare.document.2=Document 2 compare.submit=Comparar +compare.complex.message=Un o tots dos documents proporcionats són fitxers grans; la precisió de la comparació pot veure's reduïda. +compare.large.file.message=Un o tots dos documents proporcionats són massa grans per ser processats. +compare.no.text.message=Un o tots dos dels PDFs seleccionats no tenen contingut de text. Si us plau, trieu PDFs amb text per a la comparació. #BookToPDF BookToPDF.title=Books and Comics to PDF @@ -790,20 +797,25 @@ BookToPDF.credit=Uses Calibre BookToPDF.submit=Convert #PDFToBook -PDFToBook.title=PDF to Book -PDFToBook.header=PDF to Book +PDFToBook.title=PDF a Llibre +PDFToBook.header=PDF a Llibre PDFToBook.selectText.1=Format -PDFToBook.credit=Uses Calibre -PDFToBook.submit=Convert +PDFToBook.credit=Utilitza Calibre +PDFToBook.submit=Converteix #sign -sign.title=Sign -sign.header=Firma els PDF +sign.title=Signa +sign.header=Signa els PDF sign.upload=Penja la imatge sign.draw=Dibuixa la signatura sign.text=Entrada de text -sign.clear=Esborrar +sign.clear=Esborra sign.add=Afegeix +sign.saved=Signatures Desades +sign.save=Desa Signatura +sign.personalSigs=Signatures Personals +sign.sharedSigs=Signatures Compartides +sign.noSavedSigs=No s'han trobat signatures desades #repair @@ -815,41 +827,41 @@ repair.submit=Reparar #flatten flatten.title=Aplanar flatten.header=Aplana els PDF -flatten.flattenOnlyForms=Flatten only forms +flatten.flattenOnlyForms=Aplana només els formularis flatten.submit=Aplanar #ScannerImageSplit ScannerImageSplit.selectText.1=Llindar d'angle: -ScannerImageSplit.selectText.2=Estableix l'angle absolut mínim necessari perquè la imatge es giri (per defecte: 10). +ScannerImageSplit.selectText.2=Estableix l'angle mínim absolut necessari perquè la imatge es giri (per defecte: 10). ScannerImageSplit.selectText.3=Tolerància: ScannerImageSplit.selectText.4=Determina l'interval de variació de color al voltant del color de fons estimat (per defecte: 30). ScannerImageSplit.selectText.5=Àrea Mínima: ScannerImageSplit.selectText.6=Estableix el llindar d'àrea mínima per a una foto (per defecte: 10000). ScannerImageSplit.selectText.7=Àrea de contorn mínima: ScannerImageSplit.selectText.8=Estableix el llindar mínim de l'àrea de contorn per a una foto -ScannerImageSplit.selectText.9=Mida Vora: +ScannerImageSplit.selectText.9=Mida de Vora: ScannerImageSplit.selectText.10=Estableix la mida de la vora afegida i eliminada per evitar vores blanques a la sortida (per defecte: 1). -ScannerImageSplit.info=Python is not installed. It is required to run. +ScannerImageSplit.info=Python no està instal·lat. És necessari per executar-ho. #OCR -ocr.title=OCR / Neteja escaneig -ocr.header=Neteja Escanejos / OCR (Reconeixement òptic de caràcters) +ocr.title=OCR / Neteja Escanejats +ocr.header=Neteja Escanejats / OCR (Reconeixement Òptic de Caràcters) ocr.selectText.1=Selecciona els idiomes que s'han de detectar dins del PDF (els que s'indiquen són els detectats): -ocr.selectText.2=Produeix un fitxer de text que contingui text OCR juntament amb el PDF editat per OCR -ocr.selectText.3=Corregeix pàgines escanejades amb un angle esbiaixat girant-les de nou al seu lloc -ocr.selectText.4=Neteja la pàgina, de manera que és menys probable que l'OCR trobi soroll de text de fons. (Sense canvis de sortida) -ocr.selectText.5=Neteja la pàgina, de manera que és menys probable que l'OCR trobi text al soroll de fons, mantenint la neteja a la sortida. +ocr.selectText.2=Genera un fitxer de text que contingui el text OCR juntament amb el PDF editat per OCR +ocr.selectText.3=Corregeix pàgines escanejades amb un angle esbiaixat girant-les a la seva posició correcta +ocr.selectText.4=Neteja la pàgina, de manera que és menys probable que l'OCR trobi soroll de text de fons. (Sense canvis en la sortida) +ocr.selectText.5=Neteja la pàgina, de manera que és menys probable que l'OCR trobi text en el soroll de fons, mantenint la neteja en la sortida. ocr.selectText.6=Ignora les pàgines que tenen text interactiu, només les pàgines OCR que són imatges ocr.selectText.7=Força OCR, l'OCR de cada pàgina elimina tots els elements de text originals ocr.selectText.8=Normal (error si el PDF conté text) ocr.selectText.9=Opcions Addicionals ocr.selectText.10=Mode OCR -ocr.selectText.11=Elimia Imatges després de l'OCR (Alimina TOTES les imatges, útil si és part d'un procés de conversió) +ocr.selectText.11=Elimina Imatges després de l'OCR (Elimina TOTES les imatges, útil si forma part d'un procés de conversió) ocr.selectText.12=Tipus de Renderització (Avançat) -ocr.help=Llegiu aquesta documentació sobre com utilitzar-la per a altres idiomes i/o no utilitzar-la a Docker -ocr.credit=Aquest servei empra OCRmyPDF i Tesseract per OCR. +ocr.help=Llegeix aquesta documentació sobre com utilitzar-la per a altres idiomes i/o no utilitzar-la a Docker +ocr.credit=Aquest servei fa servir OCRmyPDF i Tesseract per a OCR. ocr.submit=Processa PDF amb OCR @@ -857,7 +869,7 @@ ocr.submit=Processa PDF amb OCR extractImages.title=Extreu Imatges extractImages.header=Extreu Imatges extractImages.selectText=Selecciona el format d'imatge al qual convertir les imatges extretes -extractImages.allowDuplicates=Save duplicate images +extractImages.allowDuplicates=Desa imatges duplicades extractImages.submit=Extreu @@ -865,8 +877,8 @@ extractImages.submit=Extreu fileToPDF.title=Arxiu a PDF fileToPDF.header=Converteix arxiu a PDF fileToPDF.credit=Utilitza LibreOffice i Unoconv per a la conversió. -fileToPDF.supportedFileTypesInfo=Supported File types -fileToPDF.supportedFileTypes=Els tipus de fitxers admesos haurien d'incloure el següent, però per obtenir una llista completa actualitzada dels formats compatibles, consulteu la documentació de LibreOffice +fileToPDF.supportedFileTypesInfo=Tipus de fitxers admesos +fileToPDF.supportedFileTypes=Els tipus de fitxers admesos haurien d'incloure els següents, però per obtenir una llista completa actualitzada dels formats compatibles, consulteu la documentació de LibreOffice fileToPDF.submit=Converteix a PDF @@ -877,7 +889,7 @@ compress.credit=Aquest servei utilitza Ghostscript per a la compressió/optimitz compress.selectText.1=Mode manual: de l'1 al 4 compress.selectText.2=Nivell d'optimització: compress.selectText.3=4 (terrible per a imatges de text) -compress.selectText.4=Mode automàtic: ajusta automàticament la qualitat per tal que el PDF tingui la mida exacta +compress.selectText.4=Mode automàtic: ajusta automàticament la qualitat perquè el PDF tingui la mida exacta compress.selectText.5=Mida esperada del PDF (p. ex. 25 MB, 10,8 MB, 25 KB) compress.submit=Comprimir @@ -893,45 +905,52 @@ addImage.submit=Afegir Imatge #merge merge.title=Fusiona merge.header=Fusiona múltiples PDFs (2+) -merge.sortByName=Sort by name -merge.sortByDate=Sort by date -merge.removeCertSign=Remove digital signature in the merged file? +merge.sortByName=Ordena per nom +merge.sortByDate=Ordena per data +merge.removeCertSign=Eliminar la signatura digital en el fitxer fusionat? merge.submit=Fusiona #pdfOrganiser -pdfOrganiser.title=Organitzador de pàgines -pdfOrganiser.header=Organitzador de pàgines PDF +pdfOrganiser.title=Organitzador de Pàgines +pdfOrganiser.header=Organitzador de Pàgines PDF pdfOrganiser.submit=Reorganitza Pàgines pdfOrganiser.mode=Mode -pdfOrganiser.mode.1=Custom Page Order -pdfOrganiser.mode.2=Reverse Order -pdfOrganiser.mode.3=Duplex Sort -pdfOrganiser.mode.4=Booklet Sort -pdfOrganiser.mode.5=Side Stitch Booklet Sort -pdfOrganiser.mode.6=Odd-Even Split -pdfOrganiser.mode.7=Remove First -pdfOrganiser.mode.8=Remove Last -pdfOrganiser.mode.9=Remove First and Last -pdfOrganiser.mode.10=Odd-Even Merge -pdfOrganiser.placeholder=(e.g. 1,3,2 or 4-8,2,10-12 or 2n-1) +pdfOrganiser.mode.1=Ordre Personalitzat de Pàgines +pdfOrganiser.mode.2=Ordre Invertit +pdfOrganiser.mode.3=Classificació Dúplex +pdfOrganiser.mode.4=Classificació en Llibret +pdfOrganiser.mode.5=Classificació en Llibret de Puntada Lateral +pdfOrganiser.mode.6=Divisió Parells-Senars +pdfOrganiser.mode.7=Eliminar Primer +pdfOrganiser.mode.8=Eliminar Últim +pdfOrganiser.mode.9=Eliminar Primer i Últim +pdfOrganiser.mode.10=Fusionar Parells-Senars +pdfOrganiser.placeholder=(p. ex. 1,3,2 o 4-8,2,10-12 o 2n-1) #multiTool -multiTool.title=PDF Multi Tool -multiTool.header=PDF Multi Tool -multiTool.uploadPrompts=File Name - +multiTool.title=Eina Multifunció de PDF +multiTool.header=Eina Multifunció de PDF +multiTool.uploadPrompts=Nom del fitxer +multiTool.selectAll=Select All +multiTool.deselectAll=Deselect All +multiTool.selectPages=Page Select +multiTool.selectedPages=Selected Pages +multiTool.page=Page +multiTool.deleteSelected=Delete Selected +multiTool.downloadAll=Export +multiTool.downloadSelected=Export Selected #view pdf -viewPdf.title=View PDF -viewPdf.header=View PDF +viewPdf.title=Visualitza PDF +viewPdf.header=Visualitza PDF #pageRemover -pageRemover.title=Eliminació Pàgines -pageRemover.header=Eliminació Pàgines PDF -pageRemover.pagesToDelete=Pàgines a esborrar (Números de pàgina) : +pageRemover.title=Eliminació de Pàgines +pageRemover.header=Eliminació de Pàgines PDF +pageRemover.pagesToDelete=Pàgines a eliminar (Números de pàgines): pageRemover.submit=Esborra Pàgines -pageRemover.placeholder=(e.g. 1,2,6 or 1-10,15-30) +pageRemover.placeholder=(p. ex. 1,2,6 o 1-10,15-30) #rotate @@ -944,15 +963,15 @@ rotate.submit=Rota #split-pdfs split.title=Divideix PDF split.header=Divideix PDF -split.desc.1=Els números seleccionats són el número de pàgina en què voleu fer la divisió -split.desc.2=Per tant, seleccionant 1,3,7-9 dividiria un document de 10 pàgines en 6 PDFS separats amb: +split.desc.1=Els números seleccionats indiquen les pàgines on vols realitzar la divisió +split.desc.2=Per exemple, seleccionant 1,3,7-9 dividiries un document de 10 pàgines en 6 PDFs separats amb: split.desc.3=Document #1: Pàgina 1 split.desc.4=Document #2: Pàgina 2 i 3 split.desc.5=Document #3: Pàgina 4, 5, 6 i 7 split.desc.6=Document #4: Pàgina 8 split.desc.7=Document #5: Pàgina 9 split.desc.8=Document #6: Pàgina 10 -split.splitPages=Introdueix pàgines per dividir-les: +split.splitPages=Introdueix les pàgines per dividir-les: split.submit=Divideix @@ -960,123 +979,123 @@ split.submit=Divideix imageToPDF.title=Imatge a PDF imageToPDF.header=Imatge a PDF imageToPDF.submit=Converteix -imageToPDF.selectLabel=Image Fit Options -imageToPDF.fillPage=Fill Page -imageToPDF.fitDocumentToImage=Fit Page to Image -imageToPDF.maintainAspectRatio=Maintain Aspect Ratios -imageToPDF.selectText.2=Auto rota PDF +imageToPDF.selectLabel=Opcions d'Ajust de la Imatge +imageToPDF.fillPage=Omple la Pàgina +imageToPDF.fitDocumentToImage=Ajusta la Pàgina a la Imatge +imageToPDF.maintainAspectRatio=Manté la Proporció de la Imatge +imageToPDF.selectText.2=Rota automàticament el PDF imageToPDF.selectText.3=Lògica de diversos fitxers (només està activada si es treballa amb diverses imatges) imageToPDF.selectText.4=Combina en un únic PDF -imageToPDF.selectText.5=Converteix per separar PDFs +imageToPDF.selectText.5=Converteix per separar els PDFs #pdfToImage pdfToImage.title=PDF a Imatge pdfToImage.header=PDF a Imatge -pdfToImage.selectText=Format Imatge -pdfToImage.singleOrMultiple=Tipus Imatge Resultant +pdfToImage.selectText=Format d'Imatge +pdfToImage.singleOrMultiple=Tipus d'Imatge Resultant pdfToImage.single=Única Imatge Gran pdfToImage.multi=Múltiples Imatges -pdfToImage.colorType=Tipus Color +pdfToImage.colorType=Tipus de Color pdfToImage.color=Color pdfToImage.grey=Escala de Grisos pdfToImage.blackwhite=Blanc i Negre (Pot perdre dades!) pdfToImage.submit=Converteix -pdfToImage.info=Python is not installed. Required for WebP conversion. +pdfToImage.info=Python no està instal·lat. És necessari per a la conversió a WebP. #addPassword -addPassword.title=Afegir Password -addPassword.header=Afegir password (Encriptat) +addPassword.title=Afegir Contrasenya +addPassword.header=Afegir contrasenya (Encriptat) addPassword.selectText.1=PDF a encriptar -addPassword.selectText.2=Password -addPassword.selectText.3=Longitud clau de xifratge +addPassword.selectText.2=Contrasenya +addPassword.selectText.3=Longitud de la clau de xifratge addPassword.selectText.4=Valors més alts són més forts, però els valors més baixos tenen una millor compatibilitat. addPassword.selectText.5=Permissos a Establir -addPassword.selectText.6=Evita muntatge del document -addPassword.selectText.7=Evita extracció de contingut -addPassword.selectText.8=Evita extracció per accessibilitat +addPassword.selectText.6=Evita el muntatge del document +addPassword.selectText.7=Evita l'extracció de contingut +addPassword.selectText.8=Evita l'extracció per accessibilitat addPassword.selectText.9=Evita emplenar formularis addPassword.selectText.10=Evita modificacions addPassword.selectText.11=Evita modificacions d'annotacions addPassword.selectText.12=Evita impressió -addPassword.selectText.13=Evita impressió de diferents formats -addPassword.selectText.14=Owner Password -addPassword.selectText.15=Restricts what can be done with the document once it is opened (Not supported by all readers) -addPassword.selectText.16=Restricts the opening of the document itself +addPassword.selectText.13=Evita impressió en diferents formats +addPassword.selectText.14=Contrasenya d'Administrador +addPassword.selectText.15=Restringeix el que es pot fer amb el document un cop obert (No compatible amb tots els lectors) +addPassword.selectText.16=Restringeix l'obertura del document addPassword.submit=Encripta #watermark watermark.title=Afegir Marca d'Aigua watermark.header=Afegir Marca d'Aigua -watermark.selectText.1=Seleciona PDF per afegir Marca d'Aigua: +watermark.selectText.1=Selecciona el PDF per afegir la Marca d'Aigua: watermark.selectText.2=Text de la Marca d'Aigua watermark.selectText.3=Mida de la Font: watermark.selectText.4=Rotació (0-360): -watermark.selectText.5=separació d'amplada (Espai horitzontal entre cada Marca d'Aigua): -watermark.selectText.6=separació d'alçada (Espai vertical entre cada Marca d'Aigua): +watermark.selectText.5=Separació d'amplada (Espai horitzontal entre cada Marca d'Aigua): +watermark.selectText.6=Separació d'alçada (Espai vertical entre cada Marca d'Aigua): watermark.selectText.7=Opacitat (0% - 100%): -watermark.selectText.8=Watermark Type: -watermark.selectText.9=Watermark Image: -watermark.selectText.10=Convert PDF to PDF-Image +watermark.selectText.8=Tipus de Marca d'Aigua: +watermark.selectText.9=Imatge de la Marca d'Aigua: +watermark.selectText.10=Converteix PDF a PDF-Image watermark.submit=Afegir Marca d'Aigua watermark.type.1=Text -watermark.type.2=Image +watermark.type.2=Imatge #Change permissions permissions.title=Canviar Permissos permissions.header=Canviar Permissos -permissions.warning=Advertència perquè aquests permisos siguin inalterables, es recomana establir-los amb una contrasenya a través de la pàgina d'afegir contrasenya -permissions.selectText.1=Selecciona PDF per Canviar Permissos +permissions.warning=Advertència: per fer que aquests permisos siguin inalterables, es recomana establir-los amb una contrasenya a través de la pàgina d'afegir contrasenya +permissions.selectText.1=Selecciona el PDF per Canviar Permissos permissions.selectText.2=Permissos a canviar -permissions.selectText.3=Evita muntatge del document -permissions.selectText.4=Evita extracció de contingut -permissions.selectText.5=evita extracció de contingut per accessibilitat +permissions.selectText.3=Evita el muntatge del document +permissions.selectText.4=Evita l'extracció de contingut +permissions.selectText.5=Evita l'extracció de contingut per accessibilitat permissions.selectText.6=Evita emplenar formularis permissions.selectText.7=Evita modificacions permissions.selectText.8=Evita modificacions d'annotacions permissions.selectText.9=Evita impressió -permissions.selectText.10=Evita impressió de diferents formats +permissions.selectText.10=Evita impressió en diferents formats permissions.submit=Canviar Permissos #remove password -removePassword.title=Treure Password -removePassword.header=Treure Password (Decriptar) -removePassword.selectText.1=Selecciona PDF a Decriptar -removePassword.selectText.2=Password -removePassword.submit=Treu Password +removePassword.title=Eliminar Contrasenya +removePassword.header=Eliminar Contrasenya (Desxifrar) +removePassword.selectText.1=Selecciona el PDF a Desxifrar +removePassword.selectText.2=Contrasenya +removePassword.submit=Eliminar Contrasenya #changeMetadata changeMetadata.title=Títol: changeMetadata.header=Canvia Metadades -changeMetadata.selectText.1=Edit les variables a canviar -changeMetadata.selectText.2=Neteja totes les matadades +changeMetadata.selectText.1=Edita les variables a canviar +changeMetadata.selectText.2=Neteja totes les metadades changeMetadata.selectText.3=Mostra Metadades Personalitzades: changeMetadata.author=Autor: -changeMetadata.creationDate=Data Creació (yyyy/MM/dd HH:mm:ss): +changeMetadata.creationDate=Data de Creació (yyyy/MM/dd HH:mm:ss): changeMetadata.creator=Creador: -changeMetadata.keywords=Keywords: -changeMetadata.modDate=Data Modificació (yyyy/MM/dd HH:mm:ss): +changeMetadata.keywords=Paraules clau: +changeMetadata.modDate=Data de Modificació (yyyy/MM/dd HH:mm:ss): changeMetadata.producer=Productor: changeMetadata.subject=Assumpte: changeMetadata.trapped=Atrapat: changeMetadata.selectText.4=Altres Metadades: -changeMetadata.selectText.5=Afegir entrada personalizada +changeMetadata.selectText.5=Afegir entrada personalitzada changeMetadata.submit=Canvia #pdfToPDFA pdfToPDFA.title=PDF a PDF/A pdfToPDFA.header=PDF a PDF/A -pdfToPDFA.credit=Utilitza ghostscript per la conversió a PDF/A +pdfToPDFA.credit=Utilitza Ghostscript per a la conversió a PDF/A pdfToPDFA.submit=Converteix -pdfToPDFA.tip=Currently does not work for multiple inputs at once -pdfToPDFA.outputFormat=Output format -pdfToPDFA.pdfWithDigitalSignature=The PDF contains a digital signature. This will be removed in the next step. +pdfToPDFA.tip=Actualment no funciona per a múltiples entrades al mateix temps +pdfToPDFA.outputFormat=Format de sortida +pdfToPDFA.pdfWithDigitalSignature=El PDF conté una signatura digital. Aquesta serà eliminada en el següent pas. #PDFToWord @@ -1119,106 +1138,104 @@ PDFToXML.submit=Converteix #PDFToCSV PDFToCSV.title=PDF a CSV PDFToCSV.header=PDF a CSV -PDFToCSV.prompt=Choose page to extract table -PDFToCSV.submit=Extracte +PDFToCSV.prompt=Selecciona la pàgina per extreure la taula +PDFToCSV.submit=Extreu #split-by-size-or-count -split-by-size-or-count.title=Split PDF by Size or Count -split-by-size-or-count.header=Split PDF by Size or Count -split-by-size-or-count.type.label=Select Split Type -split-by-size-or-count.type.size=By Size -split-by-size-or-count.type.pageCount=By Page Count -split-by-size-or-count.type.docCount=By Document Count -split-by-size-or-count.value.label=Enter Value -split-by-size-or-count.value.placeholder=Enter size (e.g., 2MB or 3KB) or count (e.g., 5) -split-by-size-or-count.submit=Submit +split-by-size-or-count.title=Divideix PDF per Mida o Nombre +split-by-size-or-count.header=Divideix PDF per Mida o Nombre +split-by-size-or-count.type.label=Selecciona el Tipus de Divisió +split-by-size-or-count.type.size=Per Mida +split-by-size-or-count.type.pageCount=Per Nombre de Pàgines +split-by-size-or-count.type.docCount=Per Nombre de Documents +split-by-size-or-count.value.label=Introdueix el Valor +split-by-size-or-count.value.placeholder=Introdueix la mida (p. ex., 2MB o 3KB) o el nombre (p. ex., 5) +split-by-size-or-count.submit=Envia #overlay-pdfs -overlay-pdfs.header=Overlay PDF Files -overlay-pdfs.baseFile.label=Select Base PDF File -overlay-pdfs.overlayFiles.label=Select Overlay PDF Files -overlay-pdfs.mode.label=Select Overlay Mode -overlay-pdfs.mode.sequential=Sequential Overlay -overlay-pdfs.mode.interleaved=Interleaved Overlay -overlay-pdfs.mode.fixedRepeat=Fixed Repeat Overlay -overlay-pdfs.counts.label=Overlay Counts (for Fixed Repeat Mode) -overlay-pdfs.counts.placeholder=Enter comma-separated counts (e.g., 2,3,1) -overlay-pdfs.position.label=Select Overlay Position -overlay-pdfs.position.foreground=Foreground -overlay-pdfs.position.background=Background -overlay-pdfs.submit=Submit +overlay-pdfs.header=Superposar Fitxers PDF +overlay-pdfs.baseFile.label=Selecciona el Fitxer PDF Base +overlay-pdfs.overlayFiles.label=Selecciona els Fitxers PDF a Superposar +overlay-pdfs.mode.label=Selecciona el Mode de Superposició +overlay-pdfs.mode.sequential=Superposició Seqüencial +overlay-pdfs.mode.interleaved=Superposició Intercalada +overlay-pdfs.mode.fixedRepeat=Superposició de Repte Fix +overlay-pdfs.counts.label=Nombre de Superposicions (per al Mode de Repte Fix) +overlay-pdfs.counts.placeholder=Introdueix els nombres separats per comes (p. ex., 2,3,1) +overlay-pdfs.position.label=Selecciona la Posició de la Superposició +overlay-pdfs.position.foreground=Primer pla +overlay-pdfs.position.background=Fons +overlay-pdfs.submit=Envia #split-by-sections -split-by-sections.title=Split PDF by Sections -split-by-sections.header=Split PDF into Sections -split-by-sections.horizontal.label=Horizontal Divisions -split-by-sections.vertical.label=Vertical Divisions -split-by-sections.horizontal.placeholder=Enter number of horizontal divisions -split-by-sections.vertical.placeholder=Enter number of vertical divisions -split-by-sections.submit=Split PDF -split-by-sections.merge=Merge Into One PDF +split-by-sections.title=Divideix PDF per Seccions +split-by-sections.header=Divideix el PDF en Seccions +split-by-sections.horizontal.label=Divisions Horitzontals +split-by-sections.vertical.label=Divisions Verticals +split-by-sections.horizontal.placeholder=Introdueix el nombre de divisions horitzontals +split-by-sections.vertical.placeholder=Introdueix el nombre de divisions verticals +split-by-sections.submit=Divideix PDF +split-by-sections.merge=Fusiona en un sol PDF #printFile -printFile.title=Print File -printFile.header=Print File to Printer -printFile.selectText.1=Select File to Print -printFile.selectText.2=Enter Printer Name -printFile.submit=Print +printFile.title=Imprimir Fitxer +printFile.header=Imprimir Fitxer a la Impresora +printFile.selectText.1=Selecciona el Fitxer per Imprimir +printFile.selectText.2=Introdueix el Nom de la Impresora +printFile.submit=Imprimir #licenses -licenses.nav=Licenses -licenses.title=3rd Party Licenses -licenses.header=3rd Party Licenses -licenses.module=Module -licenses.version=Version -licenses.license=License +licenses.nav=Llicències +licenses.title=Llicències de Tercers +licenses.header=Llicències de Tercers +licenses.module=Mòdul +licenses.version=Versió +licenses.license=Llicència #survey -survey.nav=Survey -survey.title=Stirling-PDF Survey -survey.description=Stirling-PDF has no tracking so we want to hear from our users to improve Stirling-PDF! -survey.changes=Stirling-PDF has changed since the last survey! To find out more please check our blog post here: -survey.changes2=With these changes we are getting paid business support and funding -survey.please=Please consider taking our survey! -survey.disabled=(Survey popup will be disabled in following updates but available at foot of page) -survey.button=Take Survey -survey.dontShowAgain=Don't show again +survey.nav=Enquesta +survey.title=Enquesta Stirling-PDF +survey.description=Stirling-PDF no fa seguiment, així que volem escoltar els nostres usuaris per millorar Stirling-PDF! +survey.changes=Stirling-PDF ha canviat des de l'última enquesta! Per saber-ne més, consulta la nostra publicació al blog aquí: +survey.changes2=Amb aquests canvis, estem rebent suport empresarial i finançament +survey.please=Si us plau, considera fer la nostra enquesta! +survey.disabled=(El popup de l'enquesta es desactivarà en les següents actualitzacions, però estarà disponible al peu de la pàgina) +survey.button=Fes l'Enquesta +survey.dontShowAgain=No mostrar més #error -error.sorry=Sorry for the issue! -error.needHelp=Need help / Found an issue? -error.contactTip=If you're still having trouble, don't hesitate to reach out to us for help. You can submit a ticket on our GitHub page or contact us through Discord: -error.404.head=404 - Page Not Found | Oops, we tripped in the code! -error.404.1=We can't seem to find the page you're looking for. -error.404.2=Something went wrong -error.github=Submit a ticket on GitHub -error.showStack=Show Stack Trace -error.copyStack=Copy Stack Trace -error.githubSubmit=GitHub - Submit a ticket -error.discordSubmit=Discord - Submit Support post +error.sorry=Ho sentim pel problema! +error.needHelp=Necessites ajuda / Has trobat un problema? +error.contactTip=Si encara tens problemes, no dubtis a contactar-nos per a ajuda. Pots enviar una sol·licitud a la nostra pàgina de GitHub o contactar-nos a través de Discord: +error.404.head=404 - Pàgina No Trovada | Ooops, hem fet un error en el codi! +error.404.1=Semblem no poder trobar la pàgina que estàs buscant. +error.404.2=Alguna cosa ha anat malament +error.github=Envia una sol·licitud a GitHub +error.showStack=Mostra la Pila d'Errors +error.copyStack=Copia la Pila d'Errors +error.githubSubmit=GitHub - Envia una sol·licitud +error.discordSubmit=Discord - Envia una sol·licitud d'ajuda #remove-image -removeImage.title=Remove image -removeImage.header=Remove image -removeImage.removeImage=Remove image -removeImage.submit=Remove image - - -splitByChapters.title=Split PDF by Chapters -splitByChapters.header=Split PDF by Chapters -splitByChapters.bookmarkLevel=Bookmark Level -splitByChapters.includeMetadata=Include Metadata -splitByChapters.allowDuplicates=Allow Duplicates -splitByChapters.desc.1=This tool splits a PDF file into multiple PDFs based on its chapter structure. -splitByChapters.desc.2=Bookmark Level: Choose the level of bookmarks to use for splitting (0 for top-level, 1 for second-level, etc.). -splitByChapters.desc.3=Include Metadata: If checked, the original PDF's metadata will be included in each split PDF. -splitByChapters.desc.4=Allow Duplicates: If checked, allows multiple bookmarks on the same page to create separate PDFs. -splitByChapters.submit=Split PDF +removeImage.title=Eliminar imatge +removeImage.header=Eliminar imatge +removeImage.removeImage=Eliminar imatge +removeImage.submit=Eliminar imatge +splitByChapters.title=Divideix PDF per Capítols +splitByChapters.header=Divideix PDF per Capítols +splitByChapters.bookmarkLevel=Nivell de Marcadors +splitByChapters.includeMetadata=Incloure Metadades +splitByChapters.allowDuplicates=Permetre Duplicats +splitByChapters.desc.1=Aquesta eina divideix un fitxer PDF en diversos PDFs segons l'estructura dels seus capítols. +splitByChapters.desc.2=Nivell de Marcadors: Tria el nivell de marcadors que s'utilitzarà per dividir (0 per al nivell superior, 1 per al segon nivell, etc.). +splitByChapters.desc.3=Incloure Metadades: Si està marcat, les metadades del PDF original s'inclouran en cada PDF dividit. +splitByChapters.desc.4=Permetre Duplicats: Si està marcat, permet diversos marcadors a la mateixa pàgina per crear PDFs separats. +splitByChapters.submit=Divideix PDF diff --git a/src/main/resources/messages_cs_CZ.properties b/src/main/resources/messages_cs_CZ.properties index b266097f8..e070018da 100644 --- a/src/main/resources/messages_cs_CZ.properties +++ b/src/main/resources/messages_cs_CZ.properties @@ -3,8 +3,8 @@ ########### # the direction that the language is written (ltr = left to right, rtl = right to left) language.direction=ltr -addPageNumbers.fontSize=Font Size -addPageNumbers.fontName=Font Name +addPageNumbers.fontSize=Velikost písma +addPageNumbers.fontName=Název písma pdfPrompt=Vyberte PDF soubory multiPdfPrompt=Vyberte PDF soubory (2+) multiPdfDropPrompt=Vyberte (nebo přetáhněte) všechny požadované PDF soubory @@ -56,12 +56,12 @@ userNotFoundMessage=Uživatel nenalezen. incorrectPasswordMessage=Současné heslo není správné. usernameExistsMessage=Nové uživatelské jméno již existuje. invalidUsernameMessage=Nesprávné uživatelské jméno, smí obsahovat pouze písmena, číslice a následující speciální znaky @._+- nebo musí být validní emailová adresa. -invalidPasswordMessage=The password must not be empty and must not have spaces at the beginning or end. -confirmPasswordErrorMessage=New Password and Confirm New Password must match. +invalidPasswordMessage=Heslo nemůže být prázdné a nemůže mít mezery na začátku nebo konci. +confirmPasswordErrorMessage=Nové heslo musí shodovat s potvrzujícím novým heslem. deleteCurrentUserMessage=Nelze smazat aktuální přihlášeného uživatele. deleteUsernameExistsMessage=Uživatelské jméno neexistuje a nelze ho smazat. downgradeCurrentUserMessage=Nelze snížit roli aktuálního uživatele. -disabledCurrentUserMessage=The current user cannot be disabled +disabledCurrentUserMessage=Současný uživatel nemůže být zakázán downgradeCurrentUserLongMessage=Nelze snížit roli aktuálního uživatele. Proto nebude aktuální uživatel zobrazen. userAlreadyExistsOAuthMessage=Uživatel již existuje jako OAuth2 uživatel. userAlreadyExistsWebMessage=Uživatel již existuje jako webový uživatel. @@ -75,16 +75,18 @@ visitGithub=Navštivte Github repozitář donate=Přispějte color=Barva sponsor=Sponzor -info=Info +info=Informace pro=Pro -page=Page -pages=Pages +page=Strana +pages=Strany +loading=Načítání... +addToDoc=Přidat do dokumentu -legal.privacy=Privacy Policy -legal.terms=Terms and Conditions -legal.accessibility=Accessibility -legal.cookie=Cookie Policy -legal.impressum=Impressum +legal.privacy=Politika soukromí +legal.terms=Podmínky použití +legal.accessibility=Snaha o přístupnost +legal.cookie=Zásada cookies +legal.impressum=Odborné prohlášení ############### # Pipeline # @@ -96,7 +98,7 @@ pipeline.defaultOption=Vlastní pipeline.submitButton=Odeslat pipeline.help=Pomoc s pipeline pipeline.scanHelp=Pomoc se skenováním adresáře -pipeline.deletePrompt=Are you sure you want to delete pipeline +pipeline.deletePrompt=Opravdu chcete smazat tento kanál? ###################### # Pipeline Options # @@ -114,21 +116,21 @@ pipelineOptions.validateButton=Ověřit ######################## # ENTERPRISE EDITION # ######################## -enterpriseEdition.button=Upgrade to Pro -enterpriseEdition.warning=This feature is only available to Pro users. -enterpriseEdition.yamlAdvert=Stirling PDF Pro supports YAML configuration files and other SSO features. -enterpriseEdition.ssoAdvert=Looking for more user management features? Check out Stirling PDF Pro +enterpriseEdition.button=Upgradujte na Pro +enterpriseEdition.warning=Tato funkce je k dispozici pouze pro uživatelé s předplatným Pro. +enterpriseEdition.yamlAdvert=Stirling PDF Pro podporuje konfigurační soubory YAML a další funkce SSO. +enterpriseEdition.ssoAdvert=Hledáte větší počet správních funkcí uživatelů? Podívejte se na Stirling PDF Pro ################# # Analytics # ################# -analytics.title=Do you want make Stirling PDF better? -analytics.paragraph1=Stirling PDF has opt in analytics to help us improve the product. We do not track any personal information or file contents. -analytics.paragraph2=Please consider enabling analytics to help Stirling-PDF grow and to allow us to understand our users better. -analytics.enable=Enable analytics -analytics.disable=Disable analytics -analytics.settings=You can change the settings for analytics in the config/settings.yml file +analytics.title=Chcete-li zlepšit Stirling PDF, pomozte nám. +analytics.paragraph1=Stirling PDF má povolené analýzy pro to, abychom mohli zlepšovat produkt. Nezaznamenáváme žádné osobní informace nebo obsah souborů. +analytics.paragraph2=Považte za možnost povolení analýz k tomu, abychom mohli růst Stirling-PDF a lépe pochopit naši skupinu uživatelů. +analytics.enable=Zapnout analýzy +analytics.disable=Vypnout analýzy +analytics.settings=Můžete změnit nastavení pro analýzy v souboru config/settings.yml ############# # NAVBAR # @@ -145,7 +147,7 @@ navbar.sections.convertFrom=Převést z PDF navbar.sections.security=Podpis a Bezpečnost navbar.sections.advance=Pokročilé navbar.sections.edit=Prohlédnout a Upravit -navbar.sections.popular=Popular +navbar.sections.popular=Populární ############# # SETTINGS # @@ -162,7 +164,7 @@ settings.zipThreshold=Zazipuj soubory, když překročí počet stažených soub settings.signOut=Odhlásit settings.accountSettings=Nastavení Účtu settings.bored.help=Umožňuje hru s easter eggy -settings.cacheInputs.name=Save form inputs +settings.cacheInputs.name=Ukládání vstupů formuláře settings.cacheInputs.help=Umožňuje uložit dříve použité vstupy pro budoucí použití changeCreds.title=Změnit pověření @@ -198,13 +200,13 @@ account.syncToAccount=Synchronizovat Účet <- Prohlížeč adminUserSettings.title=Nastavení Uživatelského Nastavení -adminUserSettings.header=Admin User Control Settings -adminUserSettings.admin=Admin +adminUserSettings.header=Nastavení správce uživatelů +adminUserSettings.admin=Správce adminUserSettings.user=Uživatel adminUserSettings.addUser=Přidat Nového Uživatele -adminUserSettings.deleteUser=Delete User -adminUserSettings.confirmDeleteUser=Should the user be deleted? -adminUserSettings.confirmChangeUserStatus=Should the user be disabled/enabled? +adminUserSettings.deleteUser=Smazat uživatele +adminUserSettings.confirmDeleteUser=Měli by se uživatel smazat? +adminUserSettings.confirmChangeUserStatus=Měli by se změnit stav uživatele (vytřída/aktivace)? adminUserSettings.usernameInfo=Uživatelské Jméno může obsahovat pouze písmena, čísla a následující speciální znaky @._+- nebo musí být správná emailová adresa. adminUserSettings.roles=Role adminUserSettings.role=Role @@ -218,32 +220,33 @@ adminUserSettings.forceChange=Vynutit uživateli změnu hesla při přihlášen adminUserSettings.submit=Uložit Uživatele adminUserSettings.changeUserRole=Zmenit Roli Uživatele adminUserSettings.authenticated=Ověřeno -adminUserSettings.editOwnProfil=Edit own profile -adminUserSettings.enabledUser=enabled user -adminUserSettings.disabledUser=disabled user -adminUserSettings.activeUsers=Active Users: -adminUserSettings.disabledUsers=Disabled Users: -adminUserSettings.totalUsers=Total Users: -adminUserSettings.lastRequest=Last Request +adminUserSettings.editOwnProfil=Upravit vlastní profil +adminUserSettings.enabledUser=povolený uživatel +adminUserSettings.disabledUser=zakázáný uživatel +adminUserSettings.activeUsers=Aktivní uživatelé: +adminUserSettings.disabledUsers=Zakázанные uživatelé: +adminUserSettings.totalUsers=Celkem uživatelů: +adminUserSettings.lastRequest=Poslední žádost -database.title=Database Import/Export -database.header=Database Import/Export -database.fileName=File Name -database.creationDate=Creation Date -database.fileSize=File Size -database.deleteBackupFile=Delete Backup File -database.importBackupFile=Import Backup File -database.downloadBackupFile=Download Backup File -database.info_1=When importing data, it is crucial to ensure the correct structure. If you are unsure of what you are doing, seek advice and support from a professional. An error in the structure can cause application malfunctions, up to and including the complete inability to run the application. -database.info_2=The file name does not matter when uploading. It will be renamed afterward to follow the format backup_user_yyyyMMddHHmm.sql, ensuring a consistent naming convention. -database.submit=Import Backup -database.importIntoDatabaseSuccessed=Import into database successed +database.title=Import/Export databáze +database.header=Import/Export databáze +database.fileName=Název souboru +database.creationDate=Datum vytvoření +database.fileSize=Velikost souboru +database.deleteBackupFile=Smazat záložní soubor +database.importBackupFile=Import zálohy souboru +database.downloadBackupFile=Stáhnout zálohový soubor +database.info_1=Při importu dat je důležité zajistit správnou strukturu. Pokud jste nejistí, jak se chovat, hledajte konzultaci a podporu od profesionala. Chyba v struktuře může vést k selhání aplikace, dokonce i k tomu, že by aplikace nemohla být spuštěna. +database.info_2=Název souboru nezáleží při nahrávání. Bude jeho zpětně znovu pojmenován podle formáту backup_user_yyyyMMddHHmm.sql, což zajišťuje konzistentní pravidlo označení. +database.submit=Import zálohy +database.importIntoDatabaseSuccessed=Import do databáze byl úspěšný database.fileNotFound=File not Found -database.fileNullOrEmpty=File must not be null or empty +database.fileNullOrEmpty=Soubor nemůže být null nebo prázdný database.failedImportFile=Failed Import File -session.expired=Your session has expired. Please refresh the page and try again. +session.expired=Vaše sesace vypršela. Prosím obnovte stránku a zkusit to znovu. +session.refreshPage=Refresh Page ############# # HOME-PAGE # @@ -347,7 +350,7 @@ PDFToPresentation.tags=snímky,přehled,kancelář,microsoft home.PDFToText.title=PDF na RTF (Text) home.PDFToText.desc=Převod PDF do formátu Textu nebo RTF -PDFToText.tags=richformat,richtextformat,rich text format +PDFToText.tags=bohatý formátování, bohaté formátování, bohatej formátkace textu home.PDFToHTML.title=PDF na HTML home.PDFToHTML.desc=Převod PDF do formátu HTML @@ -390,9 +393,9 @@ home.certSign.title=Podpis s certifikátem home.certSign.desc=Podpis PDF s certifikátem/klíčem (PEM/P12) certSign.tags=autentizace,PEM,P12,oficiální,šifrování -home.removeCertSign.title=Remove Certificate Sign -home.removeCertSign.desc=Remove certificate signature from PDF -removeCertSign.tags=authenticate,PEM,P12,official,decrypt +home.removeCertSign.title=Odstranit certifikátovou podepsanost +home.removeCertSign.desc=Odstranit certifikátovou podepsanost z PDF +removeCertSign.tags=autentizace, PEM, P12, úřední, dešifrování home.pageLayout.title=Vícestránkové rozložení home.pageLayout.desc=Sloučení více stránek dokumentu PDF do jedné stránky @@ -498,33 +501,33 @@ home.BookToPDF.title=Kniha na PDF home.BookToPDF.desc=Převádí formáty knih/komiksů do PDF pomocí calibre BookToPDF.tags=Kniha,Komiks,Calibre,Konvertovat,manga,amazon,kindle,epub,mobi,azw3,docx,rtf,txt,html,lit,fb2,pdb,lrf -home.removeImagePdf.title=Remove image -home.removeImagePdf.desc=Remove image from PDF to reduce file size -removeImagePdf.tags=Remove Image,Page operations,Back end,server side +home.removeImagePdf.title=Odstranit obrázek +home.removeImagePdf.desc=Odstranit obrázek z PDF k snížení velikosti souboru +removeImagePdf.tags=Odstranit obrázek, operace na stránkách, záložní strana, serverové čidla -home.splitPdfByChapters.title=Split PDF by Chapters -home.splitPdfByChapters.desc=Split a PDF into multiple files based on its chapter structure. -splitPdfByChapters.tags=split,chapters,bookmarks,organize +home.splitPdfByChapters.title=Rozdělit PDF podle kapitol +home.splitPdfByChapters.desc=Rozdělit PDF do více souborů na základě jeho struktury kapitol. +splitPdfByChapters.tags=rozdělení, kapitoly, zápisky, organizace #replace-invert-color replace-color.title=Replace-Invert-Color -replace-color.header=Replace-Invert Color PDF +replace-color.header=Nahradit inverzní barvu PDF home.replaceColorPdf.title=Replace and Invert Color -home.replaceColorPdf.desc=Replace color for text and background in PDF and invert full color of pdf to reduce file size -replaceColorPdf.tags=Replace Color,Page operations,Back end,server side -replace-color.selectText.1=Replace or Invert color Options -replace-color.selectText.2=Default(Default high contrast colors) -replace-color.selectText.3=Custom(Customized colors) -replace-color.selectText.4=Full-Invert(Invert all colors) -replace-color.selectText.5=High contrast color options -replace-color.selectText.6=white text on black background -replace-color.selectText.7=Black text on white background -replace-color.selectText.8=Yellow text on black background -replace-color.selectText.9=Green text on black background -replace-color.selectText.10=Choose text Color -replace-color.selectText.11=Choose background Color -replace-color.submit=Replace +home.replaceColorPdf.desc=Nahradit barvy pro text a pozadí v PDF a inverzní celý barvový spektrum PDF k snižení velikosti souboru +replaceColorPdf.tags=Nahrazovat barvu, operace na stránkách, záložní strana, serverové čidla +replace-color.selectText.1=Možnosti nahrazení nebo inverze barev +replace-color.selectText.2=Výchozí (vysoká kontrastová barva) +replace-color.selectText.3=Vlastní (vlastní barvy) +replace-color.selectText.4=Celé inverzní (inverzní všechny barvy) +replace-color.selectText.5=Možnosti vysoké kontrastové barvy +replace-color.selectText.6=Bílá text na černém pozadí +replace-color.selectText.7=Černý text na bílé pozadí +replace-color.selectText.8=Zlutý text na černém pozadí +replace-color.selectText.9=Zelený text na černém pozadí +replace-color.selectText.10=Vyberte barvu textu +replace-color.selectText.11=Vyberte barvu pozadí +replace-color.submit=Nahradit @@ -534,45 +537,45 @@ replace-color.submit=Replace # # ########################### #login -login.title=Sign in -login.header=Sign in -login.signin=Sign in -login.rememberme=Remember me -login.invalid=Invalid username or password. -login.locked=Your account has been locked. -login.signinTitle=Please sign in -login.ssoSignIn=Login via Single Sign-on -login.oauth2AutoCreateDisabled=OAUTH2 Auto-Create User Disabled -login.oauth2AdminBlockedUser=Registration or logging in of non-registered users is currently blocked. Please contact the administrator. -login.oauth2RequestNotFound=Authorization request not found -login.oauth2InvalidUserInfoResponse=Invalid User Info Response -login.oauth2invalidRequest=Invalid Request -login.oauth2AccessDenied=Access Denied -login.oauth2InvalidTokenResponse=Invalid Token Response -login.oauth2InvalidIdToken=Invalid Id Token -login.userIsDisabled=User is deactivated, login is currently blocked with this username. Please contact the administrator. -login.alreadyLoggedIn=You are already logged in to -login.alreadyLoggedIn2=devices. Please log out of the devices and try again. -login.toManySessions=You have too many active sessions +login.title=Přihlášení +login.header=Přihlášení +login.signin=Přihlásit se +login.rememberme=Zapamatovat si mě +login.invalid=Neplatné uživatelské jméno nebo heslo. +login.locked=Vaše účto bylo zablokováno. +login.signinTitle=Prosím, přihlaste se +login.ssoSignIn=Přihlášení prostřednictvím jednotného přihlašovacího systému +login.oauth2AutoCreateDisabled=Automatické vytvoření uživatele OAUTH2 je vypnuté +login.oauth2AdminBlockedUser=Registrace nebo přihlášení nepozitrovených uživatelů aktuálně jsou zablokovaná. Štěňte na správce. +login.oauth2RequestNotFound=Požadavek na autorizaci nenalezen +login.oauth2InvalidUserInfoResponse=Neplatný odpověď s informacemi o uživateli +login.oauth2invalidRequest=Neplatný požadavek +login.oauth2AccessDenied=Přístup zazobán +login.oauth2InvalidTokenResponse=Neplatná odpověď tokenu +login.oauth2InvalidIdToken=Neplatný identifikační token +login.userIsDisabled=Uživatel je deaktivován, přihlášení aktuálně pro tuto uživatelskou jmena je zakázáno. Kontaktujte správce. +login.alreadyLoggedIn=Jste již přihlášeni na +login.alreadyLoggedIn2=zariadení. Odhlašujte se z těchto zařízení a zkuste to znovu. +login.toManySessions=Máte příliš mnoho aktivních sesií #auto-redact -autoRedact.title=Auto Redact -autoRedact.header=Auto Redact -autoRedact.colorLabel=Colour -autoRedact.textsToRedactLabel=Text to Redact (line-separated) -autoRedact.textsToRedactPlaceholder=e.g. \nConfidential \nTop-Secret -autoRedact.useRegexLabel=Use Regex -autoRedact.wholeWordSearchLabel=Whole Word Search -autoRedact.customPaddingLabel=Custom Extra Padding -autoRedact.convertPDFToImageLabel=Convert PDF to PDF-Image (Used to remove text behind the box) -autoRedact.submitButton=Submit +autoRedact.title=Automatické smazání +autoRedact.header=Automatické smazání +autoRedact.colorLabel=Barva +autoRedact.textsToRedactLabel=Text k smazání (řádkově oddělený) +autoRedact.textsToRedactPlaceholder=např. \nKonfidenciální \nSkrytější +autoRedact.useRegexLabel=Použít regulární výraz +autoRedact.wholeWordSearchLabel=Hledání celých slov +autoRedact.customPaddingLabel=Vlastní doplňující vzdálenost +autoRedact.convertPDFToImageLabel=Převést PDF do PDF-Obrázku (Pro odstranění textu za obdélníkem) +autoRedact.submitButton=Odeslat #showJS -showJS.title=Show Javascript -showJS.header=Show Javascript -showJS.downloadJS=Download Javascript -showJS.submit=Show +showJS.title=Zobrazit JavaScript +showJS.header=Zobrazit JavaScript +showJS.downloadJS=Stáhnout JavaScript +showJS.submit=Zobrazit #pdfToSinglePage @@ -728,7 +731,7 @@ pageLayout.submit=Odeslat scalePages.title=Upravit měřítko stránky scalePages.header=Upravit měřítko stránky scalePages.pageSize=Velikost stránky dokumentu. -scalePages.keepPageSize=Original Size +scalePages.keepPageSize=Původní velikost scalePages.scaleFactor=Úroveň přiblížení (oříznutí) stránky. scalePages.submit=Odeslat @@ -748,14 +751,15 @@ certSign.showSig=Ukázat podpis certSign.reason=Důvod certSign.location=Umístění certSign.name=Název +certSign.showLogo=Zobraz loga certSign.submit=Podepsat PDF #removeCertSign -removeCertSign.title=Remove Certificate Signature -removeCertSign.header=Remove the digital certificate from the PDF -removeCertSign.selectPDF=Select a PDF file: -removeCertSign.submit=Remove Signature +removeCertSign.title=Odstranit certifikátovou podpisu +removeCertSign.header=Odstranění digitálního certifikátu z PDF +removeCertSign.selectPDF=Vyberte soubor PDF: +removeCertSign.submit=Odstranit podpis #removeBlanks @@ -777,11 +781,14 @@ removeAnnotations.submit=Odebrat #compare compare.title=Porovnat compare.header=Porovnat PDF -compare.highlightColor.1=Highlight Color 1: -compare.highlightColor.2=Highlight Color 2: +compare.highlightColor.1=Podtržovací barva 1: +compare.highlightColor.2=Podtržovací barva 2: compare.document.1=Dokument 1 compare.document.2=Dokument 2 compare.submit=Porovnat +compare.complex.message=Jedno nebo oba z předložených dokumentů jsou velké soubory, přesnost porovnání může být snižena +compare.large.file.message=Jeden nebo oba předložené dokumenty jsou příliš velké na zpracování +compare.no.text.message=Jedno nebo oba vybrané PDF soubory nemají textový obsah. Zvolte PDF soubory se textem pro porovnání. #BookToPDF BookToPDF.title=Knihy a komiksy do PDF @@ -804,6 +811,11 @@ sign.draw=Nakreslit podpis sign.text=Vstup textu sign.clear=Vymazat sign.add=Přidat +sign.saved=Uložené podpisy +sign.save=Uložit podpis +sign.personalSigs=Osobní podpisy +sign.sharedSigs=Sdílené podpisy +sign.noSavedSigs=Nenašly se žádné uložené podpisy #repair @@ -822,7 +834,7 @@ flatten.submit=Zploštit #ScannerImageSplit ScannerImageSplit.selectText.1=Práh úhlu: ScannerImageSplit.selectText.2=Nastaví minimální absolutní úhel, který je vyžadován k otočení obrázku (výchozí: 10). -ScannerImageSplit.selectText.3=Tolerance: +ScannerImageSplit.selectText.3=Tolerancie: ScannerImageSplit.selectText.4=Určuje rozsah barevné variace kolem odhadované barvy pozadí (výchozí: 30). ScannerImageSplit.selectText.5=Minimální plocha: ScannerImageSplit.selectText.6=Nastaví minimální plošný práh pro fotografii (výchozí: 10000). @@ -830,7 +842,7 @@ ScannerImageSplit.selectText.7=Minimální plocha kontury: ScannerImageSplit.selectText.8=Nastaví minimální plošný práh kontury pro fotografii ScannerImageSplit.selectText.9=Velikost okraje: ScannerImageSplit.selectText.10=Nastaví velikost okraje přidaného a odebraného k zabránění bílých ohraničení ve výstupu (výchozí: 1). -ScannerImageSplit.info=Python is not installed. It is required to run. +ScannerImageSplit.info=Python není nainstalován. Je potřeba pro jeho spuštění. #OCR @@ -857,7 +869,7 @@ ocr.submit=Zpracovat PDF s OCR extractImages.title=Extrahovat obrázky extractImages.header=Extrahovat obrázky extractImages.selectText=Vyberte formát obrázku pro extrahované obrázky -extractImages.allowDuplicates=Save duplicate images +extractImages.allowDuplicates=Uložit duplikátní obrázky extractImages.submit=Extrahovat @@ -895,7 +907,7 @@ merge.title=Sloučit merge.header=Sloučit více PDF (2+) merge.sortByName=Seřadit podle názvu merge.sortByDate=Seřadit podle data -merge.removeCertSign=Remove digital signature in the merged file? +merge.removeCertSign=Odebrat digitální podpis v převedeném souboru? merge.submit=Sloučit @@ -913,7 +925,7 @@ pdfOrganiser.mode.6=Liché-Sudé rozdělení pdfOrganiser.mode.7=Odstranit první pdfOrganiser.mode.8=Odstranit poslední pdfOrganiser.mode.9=Odstranit první a poslední -pdfOrganiser.mode.10=Odd-Even Merge +pdfOrganiser.mode.10=Lomeno spojení pdfOrganiser.placeholder=(např. 1,3,2 nebo 4-8,2,10-12 nebo 2n-1) @@ -921,7 +933,14 @@ pdfOrganiser.placeholder=(např. 1,3,2 nebo 4-8,2,10-12 nebo 2n-1) multiTool.title=Vícefunkční nástroj pro PDF multiTool.header=Vícefunkční nástroj pro PDF multiTool.uploadPrompts=Název souboru - +multiTool.selectAll=Select All +multiTool.deselectAll=Deselect All +multiTool.selectPages=Page Select +multiTool.selectedPages=Selected Pages +multiTool.page=Page +multiTool.deleteSelected=Delete Selected +multiTool.downloadAll=Export +multiTool.downloadSelected=Export Selected #view pdf viewPdf.title=Zobrazit PDF viewPdf.header=Zobrazit PDF @@ -982,7 +1001,7 @@ pdfToImage.color=Barevný pdfToImage.grey=Stupně šedi pdfToImage.blackwhite=Černobílý (Může dojít k ztrátě dat!) pdfToImage.submit=Převést -pdfToImage.info=Python is not installed. Required for WebP conversion. +pdfToImage.info=Python není nainstalován. Potřebuje se pro konverzi do WebP. #addPassword @@ -1019,7 +1038,7 @@ watermark.selectText.6=Výška mezery (Mezera mezi každým vodoznakem svisle): watermark.selectText.7=Průhlednost (0% - 100%): watermark.selectText.8=Typ vodoznaku: watermark.selectText.9=Obrázek vodoznaku: -watermark.selectText.10=Convert PDF to PDF-Image +watermark.selectText.10=Převést PDF na PDF-Obrázek watermark.submit=Přidat vodoznak watermark.type.1=Text watermark.type.2=Obrázek @@ -1076,7 +1095,7 @@ pdfToPDFA.credit=Tato služba používá ghostscript pro konverzi do formátu PD pdfToPDFA.submit=Převést pdfToPDFA.tip=V současné době nepracuje pro více vstupů najednou pdfToPDFA.outputFormat=Výstupní formát -pdfToPDFA.pdfWithDigitalSignature=The PDF contains a digital signature. This will be removed in the next step. +pdfToPDFA.pdfWithDigitalSignature=PDF obsahuje digitální podpis, který bude odebrán v následujícím kroku. #PDFToWord @@ -1178,15 +1197,15 @@ licenses.version=Verze licenses.license=Licence #survey -survey.nav=Survey -survey.title=Stirling-PDF Survey -survey.description=Stirling-PDF has no tracking so we want to hear from our users to improve Stirling-PDF! -survey.changes=Stirling-PDF has changed since the last survey! To find out more please check our blog post here: -survey.changes2=With these changes we are getting paid business support and funding +survey.nav=Přehled +survey.title=Stirling-PDF Přehled +survey.description=Stirling-PDF nemá sledování, proto chceme vaše názory k podnětom k lepšímu Stirling-PDF! +survey.changes=Stirling-PDF se změnil od posledního příspěvku! Další informace najdete na našem blogu zde: +survey.changes2=S těmito změnami získáváme platné podpory a finanční podporu od business partnerů. survey.please=Please consider taking our survey! -survey.disabled=(Survey popup will be disabled in following updates but available at foot of page) -survey.button=Take Survey -survey.dontShowAgain=Don't show again +survey.disabled=(Přehled bude v budoucnu zakázán, ale zůstane k dispozici na nástavbě) +survey.button=Udělat Příspěvek +survey.dontShowAgain=Neukazuj to znovu #error @@ -1204,21 +1223,19 @@ error.discordSubmit=Discord - Odeslat příspěvek podpory #remove-image -removeImage.title=Remove image -removeImage.header=Remove image -removeImage.removeImage=Remove image -removeImage.submit=Remove image - - -splitByChapters.title=Split PDF by Chapters -splitByChapters.header=Split PDF by Chapters -splitByChapters.bookmarkLevel=Bookmark Level -splitByChapters.includeMetadata=Include Metadata -splitByChapters.allowDuplicates=Allow Duplicates -splitByChapters.desc.1=This tool splits a PDF file into multiple PDFs based on its chapter structure. -splitByChapters.desc.2=Bookmark Level: Choose the level of bookmarks to use for splitting (0 for top-level, 1 for second-level, etc.). -splitByChapters.desc.3=Include Metadata: If checked, the original PDF's metadata will be included in each split PDF. -splitByChapters.desc.4=Allow Duplicates: If checked, allows multiple bookmarks on the same page to create separate PDFs. -splitByChapters.submit=Split PDF +removeImage.title=Odstranit obrázek +removeImage.header=Odstranit obrázek +removeImage.removeImage=Odstranit obrázek +removeImage.submit=Odebrat obrázek +splitByChapters.title=Podělit PDF podle kapitol +splitByChapters.header=Podělení PDF na kapitoly +splitByChapters.bookmarkLevel=Úroveň záhlaví +splitByChapters.includeMetadata=Zahrnout metadatů +splitByChapters.allowDuplicates=Povolit duplicitní záznamy +splitByChapters.desc.1=Tento nástroj podělí PDF soubor na více PDF soubory na základě struktury kapitol. +splitByChapters.desc.2=Úroveň záhlaví: Zvolte úroveň záhlaví pro použití při oddělování (0 pro hlavní, 1 pro druhou úroveň atd.). +splitByChapters.desc.3=Zahrnout metadatů: Pokud je zaškrtnuto, původní metadata PDF souboru budou zahrnuty do každého odděleného PDF souboru. +splitByChapters.desc.4=Povolit duplicitní záznamy: Pokud je zaškrtnuto, návštěvníci mohou vytvořit samostatné PDF soubory z více záhlaví na stejné straně. +splitByChapters.submit=Podělit se PDF diff --git a/src/main/resources/messages_da_DK.properties b/src/main/resources/messages_da_DK.properties index 22348c345..ab31b1ddc 100644 --- a/src/main/resources/messages_da_DK.properties +++ b/src/main/resources/messages_da_DK.properties @@ -74,17 +74,19 @@ seeDockerHub=Se Docker Hub visitGithub=Besøg Github Repository donate=Donér color=Farve -sponsor=Sponsor +sponsor=Sponsorer info=Info pro=Pro -page=Page -pages=Pages +page=Sidenummer +pages=Sideantal +loading=Laster... +addToDoc=Tilføj til Dokument legal.privacy=Privacy Policy -legal.terms=Terms and Conditions -legal.accessibility=Accessibility -legal.cookie=Cookie Policy -legal.impressum=Impressum +legal.terms=Vilkår og betingelser +legal.accessibility=Adgangsnævnteglen +legal.cookie=Cokiebelejring +legal.impressum=Angivelse af ansvar ############### # Pipeline # @@ -114,21 +116,21 @@ pipelineOptions.validateButton=Validér ######################## # ENTERPRISE EDITION # ######################## -enterpriseEdition.button=Upgrade to Pro -enterpriseEdition.warning=This feature is only available to Pro users. -enterpriseEdition.yamlAdvert=Stirling PDF Pro supports YAML configuration files and other SSO features. -enterpriseEdition.ssoAdvert=Looking for more user management features? Check out Stirling PDF Pro +enterpriseEdition.button=Opgrader til Pro +enterpriseEdition.warning=Denne funktion er kun tilgængelig for Pro-brugere. +enterpriseEdition.yamlAdvert=Stirling PDF Pro understøtter YAML-konfigurationsfiler og andre SSO-funktioner. +enterpriseEdition.ssoAdvert=søger du flere funktioner til brugerstyring? Prøv Stirling PDF Pro ################# # Analytics # ################# -analytics.title=Do you want make Stirling PDF better? -analytics.paragraph1=Stirling PDF has opt in analytics to help us improve the product. We do not track any personal information or file contents. -analytics.paragraph2=Please consider enabling analytics to help Stirling-PDF grow and to allow us to understand our users better. -analytics.enable=Enable analytics -analytics.disable=Disable analytics -analytics.settings=You can change the settings for analytics in the config/settings.yml file +analytics.title=Vil du gøre Stirling PDF bedre? +analytics.paragraph1=Stirling PDF har indsat analytics for at hjælpe os med at forbedre produktet. Vi følger ikke nogen personoplysninger eller filinhold. +analytics.paragraph2=Bevægelsesmæssigt aktiver du analytics for at hjælpe Stirling-PDF med at vokse og til atstå os bedre at forstå vores brugere. +analytics.enable=Aktivér analytics +analytics.disable=Deaktiver analytics +analytics.settings=Du kan ændre analytics-indstillingerne i config/settings.yml-filen ############# # NAVBAR # @@ -145,7 +147,7 @@ navbar.sections.convertFrom=Konvertér fra PDF navbar.sections.security=Signér & Sikkerhed navbar.sections.advance=Avanceret navbar.sections.edit=Vis & Redigér -navbar.sections.popular=Popular +navbar.sections.popular=Populære ############# # SETTINGS # @@ -199,7 +201,7 @@ account.syncToAccount=Synkroniser Konto <- Browser adminUserSettings.title=Brugerkontrolindstillinger adminUserSettings.header=Admin Brugerkontrolindstillinger -adminUserSettings.admin=Admin +adminUserSettings.admin=Administrer adminUserSettings.user=Bruger adminUserSettings.addUser=Tilføj Ny Bruger adminUserSettings.deleteUser=Slet Bruger @@ -243,7 +245,8 @@ database.fileNotFound=Fil ikke fundet database.fileNullOrEmpty=Fil må ikke være null eller tom database.failedImportFile=Kunne ikke importere fil -session.expired=Your session has expired. Please refresh the page and try again. +session.expired=Din sesions tid har udløbet. Genlad siden og prøv igen. +session.refreshPage=Refresh Page ############# # HOME-PAGE # @@ -503,28 +506,28 @@ home.removeImagePdf.desc=Fjern billede fra PDF for at reducere filstørrelse removeImagePdf.tags=Fjern Billede,Sideoperationer,Back end,server side -home.splitPdfByChapters.title=Split PDF by Chapters -home.splitPdfByChapters.desc=Split a PDF into multiple files based on its chapter structure. -splitPdfByChapters.tags=split,chapters,bookmarks,organize +home.splitPdfByChapters.title=Partitioner PDF efter kapitler +home.splitPdfByChapters.desc=Partitioner en PDF i flere filer baseret på dens kapitelstruktur. +splitPdfByChapters.tags=partitionering,kapitler,merker,organisering #replace-invert-color replace-color.title=Replace-Invert-Color -replace-color.header=Replace-Invert Color PDF +replace-color.header=Erstat-omgivende Farve PDF home.replaceColorPdf.title=Replace and Invert Color -home.replaceColorPdf.desc=Replace color for text and background in PDF and invert full color of pdf to reduce file size -replaceColorPdf.tags=Replace Color,Page operations,Back end,server side -replace-color.selectText.1=Replace or Invert color Options -replace-color.selectText.2=Default(Default high contrast colors) -replace-color.selectText.3=Custom(Customized colors) -replace-color.selectText.4=Full-Invert(Invert all colors) -replace-color.selectText.5=High contrast color options -replace-color.selectText.6=white text on black background -replace-color.selectText.7=Black text on white background -replace-color.selectText.8=Yellow text on black background -replace-color.selectText.9=Green text on black background -replace-color.selectText.10=Choose text Color -replace-color.selectText.11=Choose background Color -replace-color.submit=Replace +home.replaceColorPdf.desc=Erstatt farve for tekst og baggrund i en PDF og omgivende farve til fuld farve af PDF for at redusere filstørrelsen. +replaceColorPdf.tags=Erstat Farve,Side operationer,Behandling,server side +replace-color.selectText.1=Erstatt eller omgivende Farvemuligheder +replace-color.selectText.2=Standard (høj kontrastfarver) +replace-color.selectText.3=Brugerdefineret (anpassede farver) +replace-color.selectText.4=Inverter alle farver +replace-color.selectText.5=Høj kontrastfarveindstillinger +replace-color.selectText.6=Hvid tekst på sort baggrund +replace-color.selectText.7=Sort tekst på hvid baggrund +replace-color.selectText.8=Gul tekst på sort baggrund +replace-color.selectText.9=Grøn tekst på sort baggrund +replace-color.selectText.10=Vælg tekstfarve +replace-color.selectText.11=Vælg baggrundsfarve +replace-color.submit=Erstat @@ -551,9 +554,9 @@ login.oauth2AccessDenied=Adgang Nægtet login.oauth2InvalidTokenResponse=Ugyldigt Token Svar login.oauth2InvalidIdToken=Ugyldigt Id Token login.userIsDisabled=Bruger er deaktiveret, login er i øjeblikket blokeret med dette brugernavn. Kontakt venligst administratoren. -login.alreadyLoggedIn=You are already logged in to -login.alreadyLoggedIn2=devices. Please log out of the devices and try again. -login.toManySessions=You have too many active sessions +login.alreadyLoggedIn=Du er allerede logget ind på +login.alreadyLoggedIn2=enheder. Log ud af disse enheder og prøv igen. +login.toManySessions=Du har for mange aktive sessoner #auto-redact autoRedact.title=Auto Rediger @@ -571,7 +574,7 @@ autoRedact.submitButton=Indsend #showJS showJS.title=Vis Javascript showJS.header=Vis Javascript -showJS.downloadJS=Download Javascript +showJS.downloadJS=Last ned Javascript showJS.submit=Vis @@ -628,7 +631,7 @@ HTMLToPDF.printBackground=Render baggrunden af hjemmesider. HTMLToPDF.defaultHeader=Aktivér Standard Header (Navn og sidenummerAS HTMLToPDF.cssMediaType=Ændre CSS-medietypen for siden. HTMLToPDF.none=Ingen -HTMLToPDF.print=Print +HTMLToPDF.print=Skriv ud HTMLToPDF.screen=Skærm @@ -640,9 +643,9 @@ AddStampRequest.stampText=Stempeltekst AddStampRequest.stampImage=Stempelbillede AddStampRequest.alphabet=Alfabet AddStampRequest.fontSize=Skrift/Billedstørrelse -AddStampRequest.rotation=Rotation +AddStampRequest.rotation=Vendelse AddStampRequest.opacity=Gennemsigtighed -AddStampRequest.position=Position +AddStampRequest.position=Plassering AddStampRequest.overrideX=Tilsidesæt X-koordinat AddStampRequest.overrideY=Tilsidesæt Y-koordinat AddStampRequest.customMargin=Brugerdefineret Margin @@ -666,7 +669,7 @@ addPageNumbers.title=Tilføj Sidenumre addPageNumbers.header=Tilføj Sidenumre addPageNumbers.selectText.1=Vælg PDF-fil: addPageNumbers.selectText.2=Marginstørrelse -addPageNumbers.selectText.3=Position +addPageNumbers.selectText.3=Plassering addPageNumbers.selectText.4=Startnummer addPageNumbers.selectText.5=Sider at nummerere addPageNumbers.selectText.6=Brugerdefineret Tekst @@ -748,6 +751,7 @@ certSign.showSig=Vis Underskrift certSign.reason=Årsag certSign.location=Placering certSign.name=Navn +certSign.showLogo=Vis Logo certSign.submit=Underskriv PDF @@ -782,6 +786,9 @@ compare.highlightColor.2=Fremhævningsfarve 2: compare.document.1=Dokument 1 compare.document.2=Dokument 2 compare.submit=Sammenlign +compare.complex.message=Et eller begge af de angivne dokumenter er store filer, præcisionen ved sammenligningen kan geminse. +compare.large.file.message=Et eller Begge af de Angivne Dokumenter Er For Store At Behandle +compare.no.text.message=Et eller Begge Af de Vælgede PDFs Har Ingen Tekstindhold. Vælg Vores PDFs Med Tekst for Sammenligning. #BookToPDF BookToPDF.title=Bøger og Tegneserier til PDF @@ -804,6 +811,11 @@ sign.draw=Tegn Underskrift sign.text=Tekstinput sign.clear=Ryd sign.add=Tilføj +sign.saved=Gemte Signaturer +sign.save=Gem Signatur +sign.personalSigs=Personlige Signaturer +sign.sharedSigs=Delte Signaturer +sign.noSavedSigs=Ingen Gemte Signaturer Fundet #repair @@ -822,7 +834,7 @@ flatten.submit=Udjævn #ScannerImageSplit ScannerImageSplit.selectText.1=Vinkeltærskel: ScannerImageSplit.selectText.2=Indstiller den minimale absolutte vinkel, der kræves for at billedet roteres (standard: 10). -ScannerImageSplit.selectText.3=Tolerance: +ScannerImageSplit.selectText.3=Tolerancen: ScannerImageSplit.selectText.4=Bestemmer området for farvevariation omkring den estimerede baggrundsfarve (standard: 30). ScannerImageSplit.selectText.5=Minimum Areal: ScannerImageSplit.selectText.6=Indstiller den minimale arealtærskel for et foto (standard: 10000). @@ -921,7 +933,14 @@ pdfOrganiser.placeholder=(f.eks. 1,3,2 eller 4-8,2,10-12 eller 2n-1) multiTool.title=PDF Multi Værktøj multiTool.header=PDF Multi Værktøj multiTool.uploadPrompts=Filnavn - +multiTool.selectAll=Select All +multiTool.deselectAll=Deselect All +multiTool.selectPages=Page Select +multiTool.selectedPages=Selected Pages +multiTool.page=Page +multiTool.deleteSelected=Delete Selected +multiTool.downloadAll=Export +multiTool.downloadSelected=Export Selected #view pdf viewPdf.title=Se PDF viewPdf.header=Se PDF @@ -1013,7 +1032,7 @@ watermark.header=Tilføj Vandmærke watermark.selectText.1=Vælg PDF til at tilføje vandmærke: watermark.selectText.2=Vandmærketekst: watermark.selectText.3=Skriftstørrelse: -watermark.selectText.4=Rotation (0-360): +watermark.selectText.4=Vendt Side (0-360): watermark.selectText.5=breddeAfstand (Afstand mellem hvert vandmærke vandret): watermark.selectText.6=højdeAfstand (Afstand mellem hvert vandmærke lodret): watermark.selectText.7=Gennemsigtighed (0% - 100%): @@ -1181,8 +1200,8 @@ licenses.license=License survey.nav=Undersøgelse survey.title=Stirling-PDF Undersøgelse survey.description=Stirling-PDF har ingen sporing, så vi vil gerne høre fra vores brugere for at forbedre Stirling-PDF! -survey.changes=Stirling-PDF has changed since the last survey! To find out more please check our blog post here: -survey.changes2=With these changes we are getting paid business support and funding +survey.changes=Stirling-PDF Har Endtes Sidst Ganger du Foresatte En Kig! For At Lære Mere, Se Vores Blog Indlæg Her: +survey.changes2=Med Disse Endringer Er Vi Kommet I Betalende Forretningsstøtte og Finansiering survey.please=Overvej venligst at deltage i vores undersøgelse! survey.disabled=(Undersøgelsespop-up vil blive deaktiveret i følgende opdateringer, men vil være tilgængelig i bunden af siden) survey.button=Tag Undersøgelsen @@ -1210,15 +1229,13 @@ removeImage.removeImage=Fjern billede removeImage.submit=Fjern -splitByChapters.title=Split PDF by Chapters -splitByChapters.header=Split PDF by Chapters -splitByChapters.bookmarkLevel=Bookmark Level -splitByChapters.includeMetadata=Include Metadata -splitByChapters.allowDuplicates=Allow Duplicates -splitByChapters.desc.1=This tool splits a PDF file into multiple PDFs based on its chapter structure. -splitByChapters.desc.2=Bookmark Level: Choose the level of bookmarks to use for splitting (0 for top-level, 1 for second-level, etc.). -splitByChapters.desc.3=Include Metadata: If checked, the original PDF's metadata will be included in each split PDF. -splitByChapters.desc.4=Allow Duplicates: If checked, allows multiple bookmarks on the same page to create separate PDFs. -splitByChapters.submit=Split PDF - - +splitByChapters.title=Del PDF ved Kapitler +splitByChapters.header=Splitter PDF efter kapitel +splitByChapters.bookmarkLevel=Bogmærke niveau +splitByChapters.includeMetadata=Inkluder metadata +splitByChapters.allowDuplicates=Tillad duplikater +splitByChapters.desc.1=Denne værktøj splitter en PDF-fil op i flere PDF'er baseret på dens kapitelstruktur. +splitByChapters.desc.2=Bogmærke niveau: Vælg nivået af bogmærker, der skal bruges til at splittere (0 for hovedniveau, 1 for anden niveau osv.). +splitByChapters.desc.3=Inkluder metadata: Hvis markeret, vil den originale PDF's metadata inkluderes i hver splitterdels PDF. +splitByChapters.desc.4=Tillad duplikater: Hvis markeret, tillader det flere bogmærker på samme side til at oprette separate PDF'er. +splitByChapters.submit=Splitter PDF diff --git a/src/main/resources/messages_de_DE.properties b/src/main/resources/messages_de_DE.properties index 8467edd06..62c518ffd 100644 --- a/src/main/resources/messages_de_DE.properties +++ b/src/main/resources/messages_de_DE.properties @@ -3,8 +3,8 @@ ########### # the direction that the language is written (ltr = left to right, rtl = right to left) language.direction=ltr -addPageNumbers.fontSize=Font Size -addPageNumbers.fontName=Font Name +addPageNumbers.fontSize=Schriftgröße +addPageNumbers.fontName=Schriftart pdfPrompt=PDF(s) auswählen multiPdfPrompt=PDFs auswählen(2+) multiPdfDropPrompt=Wählen Sie alle gewünschten PDFs aus (oder ziehen Sie sie per Drag & Drop hierhin) @@ -77,8 +77,10 @@ color=Farbe sponsor=Sponsor info=Informationen pro=Pro -page=Page -pages=Pages +page=Seite +pages=Seiten +loading=Laden... +addToDoc=In Dokument hinzufügen legal.privacy=Datenschutz legal.terms=AGB @@ -114,21 +116,21 @@ pipelineOptions.validateButton=Validieren ######################## # ENTERPRISE EDITION # ######################## -enterpriseEdition.button=Upgrade to Pro -enterpriseEdition.warning=This feature is only available to Pro users. -enterpriseEdition.yamlAdvert=Stirling PDF Pro supports YAML configuration files and other SSO features. -enterpriseEdition.ssoAdvert=Looking for more user management features? Check out Stirling PDF Pro +enterpriseEdition.button=Auf Pro-Version umsteigen +enterpriseEdition.warning=Diese Funktion ist nur für Pro-Nutzer verfügbar. +enterpriseEdition.yamlAdvert=Stirling-PDF Pro unterstützt YAML Konfigurationsdateien, SSO und weitere Funktionen. +enterpriseEdition.ssoAdvert=Suchen Sie weitere Funktionen in der Benutzerverwaltung? Steigen Sie auf die Pro-Version um ################# # Analytics # ################# -analytics.title=Do you want make Stirling PDF better? -analytics.paragraph1=Stirling PDF has opt in analytics to help us improve the product. We do not track any personal information or file contents. -analytics.paragraph2=Please consider enabling analytics to help Stirling-PDF grow and to allow us to understand our users better. -analytics.enable=Enable analytics -analytics.disable=Disable analytics -analytics.settings=You can change the settings for analytics in the config/settings.yml file +analytics.title=Möchten Sie Stirling-PDF verbessern? +analytics.paragraph1=Stirling-PDF verfügt über Opt-in-Analytics, die uns helfen, das Produkt zu verbessern. Wir zeichnen keine persönlichen Informationen oder Dateiinhalte auf. +analytics.paragraph2=Bitte erwägen Sie die Analytics zu aktivieren, um Stirling-PDF beim Wachsen zu helfen und um unsere User besser zu verstehen. +analytics.enable=Analytics aktivieren +analytics.disable=Analytics deaktivieren +analytics.settings=Sie können die Einstellungen für die Analytics in der config/settings.yml Datei bearbeiten ############# # NAVBAR # @@ -145,7 +147,7 @@ navbar.sections.convertFrom=Konvertieren von PDF navbar.sections.security=Zeichen und Sicherheit navbar.sections.advance=Fortschrittlich navbar.sections.edit=Anzeigen und Bearbeiten -navbar.sections.popular=Popular +navbar.sections.popular=Beliebt ############# # SETTINGS # @@ -243,7 +245,8 @@ database.fileNotFound=Datei nicht gefunden database.fileNullOrEmpty=Datei darf nicht null oder leer sein database.failedImportFile=Dateiimport fehlgeschlagen -session.expired=Your session has expired. Please refresh the page and try again. +session.expired=Ihre Sitzung ist abgelaufen. Bitte laden Sie die Seite neu und versuchen Sie es erneut. +session.refreshPage=Refresh Page ############# # HOME-PAGE # @@ -392,7 +395,7 @@ certSign.tags=authentifizieren,pem,p12,offiziell,verschlüsseln home.removeCertSign.title=Zertifikatsignatur entfernen home.removeCertSign.desc=Zertifikatsignatur aus PDF entfernen -removeCertSign.tags=authentifizieren,PEM,P12,offiziell,entschlüsseln,decrypt +removeCertSign.tags=authentifizieren,PEM,P12,offiziell,entschlüsseln home.pageLayout.title=Mehrseitiges Layout home.pageLayout.desc=Mehrere Seiten eines PDF zu einer Seite zusammenführen @@ -503,28 +506,28 @@ home.removeImagePdf.desc=Bild aus PDF entfernen, um die Dateigröße zu verringe removeImagePdf.tags=bild entfernen,seitenoperationen,back end,server side -home.splitPdfByChapters.title=Split PDF by Chapters -home.splitPdfByChapters.desc=Split a PDF into multiple files based on its chapter structure. -splitPdfByChapters.tags=split,chapters,bookmarks,organize +home.splitPdfByChapters.title=PDF-Datei nach Kapiteln aufteilen +home.splitPdfByChapters.desc=Aufteilung einer PDF-Datei in mehrere Dateien auf Basis der Kapitelstruktur. +splitPdfByChapters.tags=aufteilen,kapitel,lesezeichen,organisieren #replace-invert-color -replace-color.title=Replace-Invert-Color -replace-color.header=Replace-Invert Color PDF -home.replaceColorPdf.title=Replace and Invert Color -home.replaceColorPdf.desc=Replace color for text and background in PDF and invert full color of pdf to reduce file size -replaceColorPdf.tags=Replace Color,Page operations,Back end,server side -replace-color.selectText.1=Replace or Invert color Options -replace-color.selectText.2=Default(Default high contrast colors) -replace-color.selectText.3=Custom(Customized colors) -replace-color.selectText.4=Full-Invert(Invert all colors) -replace-color.selectText.5=High contrast color options -replace-color.selectText.6=white text on black background -replace-color.selectText.7=Black text on white background -replace-color.selectText.8=Yellow text on black background -replace-color.selectText.9=Green text on black background -replace-color.selectText.10=Choose text Color -replace-color.selectText.11=Choose background Color -replace-color.submit=Replace +replace-color.title=Farbe Ersetzen-Invertieren +replace-color.header=Farb-PDF Ersetzen-Invertieren +home.replaceColorPdf.title=Farbe ersetzen und invertieren +home.replaceColorPdf.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 +replaceColorPdf.tags=Farbe ersetzen,Seiteneinstellungen,Backend,Serverseite +replace-color.selectText.1=Ersetzen oder Invertieren von Farboptionen +replace-color.selectText.2=Standard(Standardfarben mit hohem Kontrast) +replace-color.selectText.3=Benutzerdefiniert(Benutzerdefinierte Farben) +replace-color.selectText.4=Vollinvertierung(Invertierung aller Farben) +replace-color.selectText.5=Farboptionen mit hohem Kontrast +replace-color.selectText.6=Weißer Text auf schwarzem Hintergrund +replace-color.selectText.7=Schwarzer Text auf weißem Hintergrund +replace-color.selectText.8=Gelber Text auf schwarzem Hintergrund +replace-color.selectText.9=Grüner Text auf schwarzem Hintergrund +replace-color.selectText.10=Textfarbe auswählen +replace-color.selectText.11=Hintergrundfarbe auswählen +replace-color.submit=Ersetzen @@ -551,9 +554,9 @@ login.oauth2AccessDenied=Zugriff abgelehnt login.oauth2InvalidTokenResponse=Ungültige Token-Antwort login.oauth2InvalidIdToken=Ungültiges ID-Token login.userIsDisabled=Benutzer ist deaktiviert, die Anmeldung ist mit diesem Benutzernamen derzeit gesperrt. Bitte wenden Sie sich an den Administrator. -login.alreadyLoggedIn=You are already logged in to -login.alreadyLoggedIn2=devices. Please log out of the devices and try again. -login.toManySessions=You have too many active sessions +login.alreadyLoggedIn=Sie sind bereits an +login.alreadyLoggedIn2=Geräten angemeldet. Bitte melden Sie sich dort ab und versuchen es dann erneut. +login.toManySessions=Sie haben zu viele aktive Sitzungen #auto-redact autoRedact.title=Automatisch zensieren/schwärzen @@ -703,7 +706,7 @@ autoSplitPDF.header=PDF automatisch teilen autoSplitPDF.description=Drucken Sie, fügen Sie ein, scannen Sie, laden Sie hoch und lassen Sie uns Ihre Dokumente automatisch trennen. Kein manuelles Sortieren erforderlich. autoSplitPDF.selectText.1=Drucken Sie einige Trennblätter aus (schwarz/weiß ist ausreichend). autoSplitPDF.selectText.2=Scannen Sie alle Dokumente auf einmal, indem Sie das Trennblatt zwischen die Dokumente einlegen. -autoSplitPDF.selectText.3=Laden Sie die einzelne große gescannte PDF-Datei hoch und überlassen Sie Stirling PDF den Rest. +autoSplitPDF.selectText.3=Laden Sie die einzelne große gescannte PDF-Datei hoch und überlassen Sie Stirling-PDF den Rest. autoSplitPDF.selectText.4=Trennseiten werden automatisch erkannt und entfernt, so dass ein sauberes Enddokument garantiert ist. autoSplitPDF.formPrompt=PDF mit Stirling-PDF Seitentrennern hochladen: autoSplitPDF.duplexMode=Duplex-Modus (Scannen von Vorder- und Rückseite) @@ -728,7 +731,7 @@ pageLayout.submit=Abschicken scalePages.title=Seitengröße anpassen scalePages.header=Seitengröße anpassen scalePages.pageSize=Format der Seiten des Dokuments -scalePages.keepPageSize=Original Size +scalePages.keepPageSize=Originalgröße beibehalten scalePages.scaleFactor=Zoomstufe (Ausschnitt) einer Seite scalePages.submit=Abschicken @@ -748,6 +751,7 @@ certSign.showSig=Signatur anzeigen certSign.reason=Grund certSign.location=Standort certSign.name=Name +certSign.showLogo=Logo anzeigen certSign.submit=PDF signieren @@ -782,6 +786,9 @@ compare.highlightColor.2=Highlight-Farbe 2: compare.document.1=Dokument 1 compare.document.2=Dokument 2 compare.submit=Vergleichen +compare.complex.message=Eines oder beide Dokumente sind sehr groß, dadurch kann die Genauigkeit des Vergleichs kann beeinträchtigt werden. +compare.large.file.message=Eines oder beide Dokumente sind zu groß, um verarbeitet zu werden +compare.no.text.message=Ein oder beide ausgewählten PDFs enthalten keine Textinhalt. Wählen Sie bitte PDFs mit Text für die Vergleichsanalyse. #BookToPDF BookToPDF.title=Bücher und Comics zu PDF @@ -804,6 +811,11 @@ sign.draw=Signatur zeichnen sign.text=Texteingabe sign.clear=Leeren sign.add=Signieren +sign.saved=Gespeicherte Signaturen +sign.save=Signature speichern +sign.personalSigs=Persönliche Signaturen +sign.sharedSigs=Geteilte Signaturen +sign.noSavedSigs=Es wurden keine gespeicherten Signaturen gefunden #repair @@ -857,7 +869,7 @@ ocr.submit=PDF mit OCR verarbeiten extractImages.title=Bilder extrahieren extractImages.header=Bilder extrahieren extractImages.selectText=Wählen Sie das Bildformat aus, in das extrahierte Bilder konvertiert werden sollen -extractImages.allowDuplicates=Save duplicate images +extractImages.allowDuplicates=Doppelte Bilder speichern extractImages.submit=Extrahieren @@ -921,7 +933,14 @@ pdfOrganiser.placeholder=(z.B. 1,3,2 oder 4-8,2,10-12 oder 2n-1) multiTool.title=PDF-Multitool multiTool.header=PDF-Multitool multiTool.uploadPrompts=Dateiname - +multiTool.selectAll=Select All +multiTool.deselectAll=Deselect All +multiTool.selectPages=Page Select +multiTool.selectedPages=Selected Pages +multiTool.page=Page +multiTool.deleteSelected=Delete Selected +multiTool.downloadAll=Export +multiTool.downloadSelected=Export Selected #view pdf viewPdf.title=PDF anzeigen viewPdf.header=PDF anzeigen @@ -1181,8 +1200,8 @@ licenses.license=Lizenz survey.nav=Umfrage survey.title=Stirling-PDF-Umfrage survey.description=Stirling-PDF hat kein Tracking, daher möchten wir von unseren Benutzern hören, wie wir Stirling-PDF verbessern können! -survey.changes=Stirling-PDF has changed since the last survey! To find out more please check our blog post here: -survey.changes2=With these changes we are getting paid business support and funding +survey.changes=Stirling-PDF hat sich seit der letzten Umfrage verändert! Mehr Informationen finden Sie bitte in unserem Blog-Beitrag hier: +survey.changes2=Mit diesen Änderungen erhalten wir beauftragte Geschäftsunterstützung und Finanzierung survey.please=Bitte nehmen Sie an unserer Umfrage teil! survey.disabled=(Das Umfrage-Popup wird in folgenden Updates deaktiviert, ist aber am Fuß der Seite verfügbar.) survey.button=Umfrage durchführen @@ -1210,15 +1229,13 @@ removeImage.removeImage=Bild entfernen removeImage.submit=Bild entfernen -splitByChapters.title=Split PDF by Chapters -splitByChapters.header=Split PDF by Chapters -splitByChapters.bookmarkLevel=Bookmark Level -splitByChapters.includeMetadata=Include Metadata -splitByChapters.allowDuplicates=Allow Duplicates -splitByChapters.desc.1=This tool splits a PDF file into multiple PDFs based on its chapter structure. -splitByChapters.desc.2=Bookmark Level: Choose the level of bookmarks to use for splitting (0 for top-level, 1 for second-level, etc.). -splitByChapters.desc.3=Include Metadata: If checked, the original PDF's metadata will be included in each split PDF. -splitByChapters.desc.4=Allow Duplicates: If checked, allows multiple bookmarks on the same page to create separate PDFs. -splitByChapters.submit=Split PDF - - +splitByChapters.title=PDF nach Kapiteln aufteilen +splitByChapters.header=PDF nach Kapiteln aufteilen +splitByChapters.bookmarkLevel=Lesezeichenebene +splitByChapters.includeMetadata=Metadaten einschließen +splitByChapters.allowDuplicates=Duplikate erlauben +splitByChapters.desc.1=Dieses Werkzeug teilt eine PDF-Datei auf der Grundlage ihrer Kapitelstruktur in mehrere PDF-Dateien auf. +splitByChapters.desc.2=Lesezeichenebene: Wählen Sie die Ebene der Lesezeichen, die für die Aufteilung verwendet werden soll (0 für die erste Ebene, 1 für die zweite Ebene usw.). +splitByChapters.desc.3=Metadaten einschließen: Wenn diese Option aktiviert ist, werden die Metadaten der ursprünglichen PDF-Datei in jede aufgeteilte PDF-Datei übernommen. +splitByChapters.desc.4=Duplikate erlauben: Wenn diese Option aktiviert ist, können mehrere Lesezeichen auf derselben Seite separate PDF Dateien erstellen. +splitByChapters.submit=PDF teilen diff --git a/src/main/resources/messages_el_GR.properties b/src/main/resources/messages_el_GR.properties index a973715e8..924db72aa 100644 --- a/src/main/resources/messages_el_GR.properties +++ b/src/main/resources/messages_el_GR.properties @@ -3,8 +3,8 @@ ########### # the direction that the language is written (ltr = left to right, rtl = right to left) language.direction=ltr -addPageNumbers.fontSize=Font Size -addPageNumbers.fontName=Font Name +addPageNumbers.fontSize=Μέγεθος Τύπου +addPageNumbers.fontName=Όνομα Τύπου pdfPrompt=Επιλογή PDF(s) multiPdfPrompt=Επιλογή PDFs (2+) multiPdfDropPrompt=Επιλογή (ή τράβηγμα αρχείου και απόθεση) όλων των PDF που χρειάζεστε @@ -39,7 +39,7 @@ delete=Διαγραφή username=Όνομα Χρήστη password=Κωδικός welcome=Καλως Ήλθατε -property=Property +property=Χαρακτηριστικό black=Μαύρο white=Άσπρο red=Κόκκινο @@ -56,15 +56,15 @@ userNotFoundMessage=Ο χρήστης δεν βρέθηκε. incorrectPasswordMessage=Ο τρέχων κωδικός πρόσβασης είναι λανθασμένος. usernameExistsMessage=Το νέο όνομα χρήστη υπάρχει ήδη. invalidUsernameMessage=Μη έγκυρο όνομα χρήστη, όνομα χρήστη μπορεί να περιέχει μόνο γράμματα, αριθμούς και τους ακόλουθους ειδικούς χαρακτήρες @._+- ή πρέπει να είναι έγκυρη διεύθυνση email. -invalidPasswordMessage=The password must not be empty and must not have spaces at the beginning or end. -confirmPasswordErrorMessage=New Password and Confirm New Password must match. +invalidPasswordMessage=Ο κωδικός πρόσβασης δεν μπορεί να είναι αδύναμος και δεν μπορεί να έχει χαμογελάτα στην αρχή ή το τέλος. +confirmPasswordErrorMessage=Ο Διαβεβαιωμένος Νέος Κωδικός Πρόσβασης πρέπει να συνάρτησε με το Νέο Κωδίκο Πρόσβασης. deleteCurrentUserMessage=Δεν είναι δυνατή η διαγραφή του τρέχοντος συνδεδεμένου χρήστη. deleteUsernameExistsMessage=Το όνομα χρήστη δεν υπάρχει και δεν μπορεί να διαγραφεί. downgradeCurrentUserMessage=Δεν είναι δυνατή η υποβάθμιση του ρόλου του τρέχοντος χρήστη -disabledCurrentUserMessage=The current user cannot be disabled +disabledCurrentUserMessage=Ο σύγχρονος χρήστης δεν μπορεί να απενειλθείται downgradeCurrentUserLongMessage=Δεν είναι δυνατή η υποβάθμιση του ρόλου του τρέχοντος χρήστη. Ως εκ τούτου, ο τρέχων χρήστης δεν θα εμφανίζεται. -userAlreadyExistsOAuthMessage=The user already exists as an OAuth2 user. -userAlreadyExistsWebMessage=The user already exists as an web user. +userAlreadyExistsOAuthMessage=Το υχής ήδη υπάρχει ως OAuth2 χρήστης. +userAlreadyExistsWebMessage=Ο χρήστης εξαρτάται ήδη ως πλήρωμα χρήστη. error=Σφάλμα oops=Ωχ! help=Βοήθεια @@ -75,28 +75,30 @@ visitGithub=Επισκεφθείτε το Αποθετήριο του Github donate=Δωρισε color=Χρώμα sponsor=Yποστηρικτής -info=Info -pro=Pro -page=Page -pages=Pages +info=Πληροφορίες +pro=Προ +page=Σελίδα +pages=Σελίδες +loading=Φόρτωση... +addToDoc=Πρόσθεση στο Εκπομπώματο -legal.privacy=Privacy Policy -legal.terms=Terms and Conditions -legal.accessibility=Accessibility -legal.cookie=Cookie Policy -legal.impressum=Impressum +legal.privacy=Πολιτική Προνομίους +legal.terms=Φράσεις Υποχρεωτικότητας +legal.accessibility=Πρόσβαση +legal.cookie=Πολιτική Χώρου Συνθέσεων +legal.impressum=Κατάσταση ############### # Pipeline # ############### pipeline.header=Μενού Pipeline (Beta) -pipeline.uploadButton=Upload Custom +pipeline.uploadButton=Αναβάθμιση Καλυτερού pipeline.configureButton=Διαμόρφωσε -pipeline.defaultOption=Custom +pipeline.defaultOption=Κατασκευή Μετρόπολης pipeline.submitButton=Υποβολή pipeline.help=Βοήθεια για το Pipeline pipeline.scanHelp=Βοήθεια για Σάρωση Φακέλων -pipeline.deletePrompt=Are you sure you want to delete pipeline +pipeline.deletePrompt=Είστε σίγουροι ότι θέλετε να διαγράψετε το πρότυπο; ###################### # Pipeline Options # @@ -107,52 +109,52 @@ pipelineOptions.saveSettings=Αποθήκευση Ρυθμίσεων Λειτο pipelineOptions.pipelineNamePrompt=Εισαγάγετε το όνομα του pipeline εδώ pipelineOptions.selectOperation=Επιλέξτε Λειτουργία pipelineOptions.addOperationButton=Προσθήκη λειτουργίας -pipelineOptions.pipelineHeader=Pipeline: +pipelineOptions.pipelineHeader=Πρότυπο: pipelineOptions.saveButton=Λήψη pipelineOptions.validateButton=Επικυρώνω ######################## # ENTERPRISE EDITION # ######################## -enterpriseEdition.button=Upgrade to Pro -enterpriseEdition.warning=This feature is only available to Pro users. -enterpriseEdition.yamlAdvert=Stirling PDF Pro supports YAML configuration files and other SSO features. -enterpriseEdition.ssoAdvert=Looking for more user management features? Check out Stirling PDF Pro +enterpriseEdition.button=Ενημερώστε σε Pro +enterpriseEdition.warning=Αυτή η λειτουργία είναι διαθέσιμη μόνο για τους χρήστες Pro. +enterpriseEdition.yamlAdvert=Stirling PDF Pro υποστηρίζει αρχεία συνασκήματος YAML και άλλες λειτουργίες SSO. +enterpriseEdition.ssoAdvert=Σάξεις για περισσότερες λειτουργίες διαχείρισης χρηστών; Πроверьте Stirling PDF Pro ################# # Analytics # ################# -analytics.title=Do you want make Stirling PDF better? -analytics.paragraph1=Stirling PDF has opt in analytics to help us improve the product. We do not track any personal information or file contents. -analytics.paragraph2=Please consider enabling analytics to help Stirling-PDF grow and to allow us to understand our users better. -analytics.enable=Enable analytics -analytics.disable=Disable analytics -analytics.settings=You can change the settings for analytics in the config/settings.yml file +analytics.title=Επιθυμείτε να βελτιώσετε το Stirling PDF; +analytics.paragraph1=Stirling PDF έχει επιλεγμένα ανάλυμα για να με βοηθήσει στην βελτίωση του προϊόντος. Δεν ακολουθούμε καμία ιδιοχειρισμένη πληροφορία ή συγκέντρωση υπόλοιπου πλάνου. +analytics.paragraph2=Παρακαλώ ενεργοποιήστε τα ανάλυμα για να βοηθήσετε το Stirling-PDF να ξεφύγει και να μας βοηθήσετε στον καλύτερο δυνατό ανάλυμα χρηστών. +analytics.enable=Ενεργοποίηση ανάλυμα +analytics.disable=Διακόπτωση ανάλυμα +analytics.settings=Μπορείτε να αλλάξετε τις προπαραστάσεις των ανάλυμα σε υποθέσεις/settings.yml ############# # NAVBAR # ############# -navbar.favorite=Favorites +navbar.favorite=Πιρημός navbar.darkmode=Μαύρο Θέμα -navbar.language=Languages +navbar.language=Γλώσσες navbar.settings=Ρυθμίσεις -navbar.allTools=Tools +navbar.allTools=Εργαλεία navbar.multiTool=Multi Tools -navbar.sections.organize=Organize -navbar.sections.convertTo=Convert to PDF -navbar.sections.convertFrom=Convert from PDF -navbar.sections.security=Sign & Security -navbar.sections.advance=Advanced -navbar.sections.edit=View & Edit -navbar.sections.popular=Popular +navbar.sections.organize=Οργάνωση +navbar.sections.convertTo=Μετατροπή σε PDF +navbar.sections.convertFrom=Μετατροπή από PDF +navbar.sections.security=Υπογραφή & Σέκυνση +navbar.sections.advance=Διεξοδικό +navbar.sections.edit=Σύντομος Προβολής & Διοίκηση +navbar.sections.popular=Επιφανειακά ############# # SETTINGS # ############# settings.title=Ρυθμίσεις settings.update=Υπάρχει διαθέσιμη ενημέρωση -settings.updateAvailable={0} is the current installed version. A new version ({1}) is available. +settings.updateAvailable={0} είναι το πρόγραμμα εκτελεσιμωμένο σήμερα. Έχετε διαθέσιμη μια νέα έκδοση (σήμερα: {1}). settings.appVersion=Έκδοση εφαρμογής: settings.downloadOption.title=Επιλέξετε την επιλογή λήψης (Για λήψεις μεμονωμένων αρχείων χωρίς zip): settings.downloadOption.1=Άνοιγμα στο ίδιο παράθυρο @@ -161,9 +163,9 @@ settings.downloadOption.3=Λήψη αρχείου settings.zipThreshold=Αρχεία Zip όταν ο αριθμός των ληφθέντων αρχείων είναι πολύ μεγάλος settings.signOut=Αποσύνδεση settings.accountSettings=Ρυθμίσεις Λογαριασμού -settings.bored.help=Enables easter egg game -settings.cacheInputs.name=Save form inputs -settings.cacheInputs.help=Enable to store previously used inputs for future runs +settings.bored.help=Ενεργοποίηση παιχνίδι ευφήμων +settings.cacheInputs.name=Αποθήκευση των εισαγωγών +settings.cacheInputs.help=Ενεργοποίηση για να αποθηκεύσετε προηγουμένως χρησιμοποιημένες εισαγωγές για το μέλλον changeCreds.title=Αλλαγή Διαπιστευτηρίων changeCreds.header=Ενημέρωση των λεπτομερειών του Λογαριασμού σας @@ -191,7 +193,7 @@ account.signOut=Αποσύνδεση account.yourApiKey=Το κλειδί σας για τη διεπαφή προγραμματισμού εφαρμογών (API key) account.syncTitle=Συγχρονισμός των ρυθμίσεων του φυλλομετρητή (Web Browser) με τον λογαριασμό account.settingsCompare=Σύγκριση Ρυθμίσεων: -account.property=Property +account.property=Υπεροχή account.webBrowserSettings=Ρύθμιση φυλλομετρητή (Web Browser) account.syncToBrowser=Συγχρονισμός Λογαριασμού -> Φυλλομετρητή (Web Browser) account.syncToAccount=Συγχρονισμός Λογαριασμού <- Φυλλομετρητή (Web Browser) @@ -202,10 +204,10 @@ adminUserSettings.header=Ρυθμίσεις ελέγχου Διαχειριστ adminUserSettings.admin=Διαχειριστής adminUserSettings.user=Χρήστης adminUserSettings.addUser=Προσθήκη νέου Χρήστη -adminUserSettings.deleteUser=Delete User -adminUserSettings.confirmDeleteUser=Should the user be deleted? -adminUserSettings.confirmChangeUserStatus=Should the user be disabled/enabled? -adminUserSettings.usernameInfo=Username can only contain letters, numbers and the following special characters @._+- or must be a valid email address. +adminUserSettings.deleteUser=Διαγραφή Χρηστών +adminUserSettings.confirmDeleteUser=Είναι αποδεκτό να διαγράψετε τον χρήστη; +adminUserSettings.confirmChangeUserStatus=Είναι αποδεκτό να αλλάξετε το σύμβαθρο του χρηστών; +adminUserSettings.usernameInfo=Το όνομα χρήστη μπορεί να περιέχει μόνο γράμματα, αριθμούς και τα εξής διευρυμένα συμβολικά @._+- ή πρέπει να είναι έγκυρο e-mail. adminUserSettings.roles=Ρόλοι adminUserSettings.role=Ρόλος adminUserSettings.actions=Ενέργειες @@ -217,33 +219,34 @@ adminUserSettings.internalApiUser=Εσωτερικός API χρήστης adminUserSettings.forceChange=Αναγκάστε τον χρήστη να αλλάξει το όνομα χρήστη/κωδικό πρόσβασης κατά τη σύνδεση adminUserSettings.submit=Αποθήκευση Χρήστη adminUserSettings.changeUserRole=Αλλαγή ρόλου χρήστη -adminUserSettings.authenticated=Authenticated -adminUserSettings.editOwnProfil=Edit own profile -adminUserSettings.enabledUser=enabled user -adminUserSettings.disabledUser=disabled user -adminUserSettings.activeUsers=Active Users: -adminUserSettings.disabledUsers=Disabled Users: -adminUserSettings.totalUsers=Total Users: -adminUserSettings.lastRequest=Last Request +adminUserSettings.authenticated=Εγγεγραφές +adminUserSettings.editOwnProfil=Επεξεργασία Τοποθεσίας Δικότητας +adminUserSettings.enabledUser=Ενεργούς Χρήστης +adminUserSettings.disabledUser=Απενεργούς Χρήστης +adminUserSettings.activeUsers=Ενεργοί Χρήστες: +adminUserSettings.disabledUsers=Απενεργοί Χρήστες: +adminUserSettings.totalUsers=Συνολικός Αριθμός Χρηστών: +adminUserSettings.lastRequest=Τελευταία Ερώτηση -database.title=Database Import/Export -database.header=Database Import/Export -database.fileName=File Name -database.creationDate=Creation Date -database.fileSize=File Size -database.deleteBackupFile=Delete Backup File -database.importBackupFile=Import Backup File -database.downloadBackupFile=Download Backup File -database.info_1=When importing data, it is crucial to ensure the correct structure. If you are unsure of what you are doing, seek advice and support from a professional. An error in the structure can cause application malfunctions, up to and including the complete inability to run the application. -database.info_2=The file name does not matter when uploading. It will be renamed afterward to follow the format backup_user_yyyyMMddHHmm.sql, ensuring a consistent naming convention. -database.submit=Import Backup -database.importIntoDatabaseSuccessed=Import into database successed +database.title=Εισάγωντας/Εξαγωγή Δεδομένων Βάσης Δεδομένων +database.header=Εισάγωντας/Εξαγωγή Δεδομένων Βάσης Δεδομένων +database.fileName=Όνομα αρχείου +database.creationDate=Ημερομηνία δημιουργίας +database.fileSize=Μέγεθος αρχείου +database.deleteBackupFile=Διαγραφή Προγράμματος Ανασυγκρότησης +database.importBackupFile=Εισάγωντας Προγράμματος Ανασυγκρότησης +database.downloadBackupFile=Κατέβασμα Προγράμματος Ανασυγκρότησης +database.info_1=Όταν εισάγετε δεδομένα, είναι σημαντικό να εξασφαλίσετε τη σωστή μορφοποίηση. Αν δεν είστε σίγουροι για το ποια πράγματα κάνετε, αιτήστε υποβολή και υποστήριξη από ευελίκτω. Μια σφάλμα στη μορφοποίηση μπορεί να προκαλέσει καταστάσεις λάθους στην εφαρμογή, αν όχι ολόκληρη την αποχώρηση της εφαρμογής. +database.info_2=Το ονόμα του αρχείου δεν έχει σημασία όταν ξεκινάτε μια επέμβαση. Αλλαγήται αργότερα για να ακολουθήσει το σχήμα backup_ωςώντας_YYYYMMDDHHmm.sql, επιτρέποντας μια συνεχές κατάληψη ονόματος. +database.submit=Εισάγωντας Προγράμματος Ανασυγκρότησης +database.importIntoDatabaseSuccessed=Τελείωση εισαγωγής στη βάση δεδομένων. database.fileNotFound=File not Found -database.fileNullOrEmpty=File must not be null or empty +database.fileNullOrEmpty=Το αρχείο δεν μπορεί να είναι τυχόν ή κενό. database.failedImportFile=Failed Import File -session.expired=Your session has expired. Please refresh the page and try again. +session.expired=Η σεζώνη σας υπάρξει παραγωγή. Πατήστε για να ανανεώσετε το πλήρωμα και δοκιμάστε ξανά. +session.refreshPage=Refresh Page ############# # HOME-PAGE # @@ -254,7 +257,7 @@ home.searchBar=Αναζήτηση για χαρακτηριστικά... home.viewPdf.title=Εμφάνιση PDF home.viewPdf.desc=Εμφάνιση, προσθήκη σχεδίου, προσθήκη κειμένου ή εικόνων -viewPdf.tags=view,read,annotate,text,image +viewPdf.tags=ψηφιοποίηση,ανάγνωση,καταχώρηση,τεκτωνική,εικόνα home.multiTool.title=PDF Πολυεργαλείο home.multiTool.desc=Συγχώνευση, Περιστροφή, Αναδιάταξη και Κατάργηση σελίδων @@ -262,11 +265,11 @@ multiTool.tags=Multi Tool,Multi operation,UI,click drag,front end,client side,in home.merge.title=Συγχώνευση home.merge.desc=Συγχώνευση πολλών PDF σε ένα με εύκολο τρόπο. -merge.tags=merge,Page operations,Back end,server side +merge.tags=συνδυασμός,λεπτομέρειες σελίδας,μετάβαση από το μέχρι το κράτος,κρήτερο χρώμα home.split.title=Διαχωρισμός home.split.desc=Διαχωρισμός των PDF σε πολλά έγγραφα. -split.tags=Page operations,divide,Multi Page,cut,server side +split.tags=λεπτομέρειες σελίδας,διαχωρισμός,πολυσελίδια,κοπή,κρήτερο χρώμα home.rotate.title=Περιστροφή home.rotate.desc=Περιστροφή των PDF σας με εύκολο τρόπο. @@ -275,45 +278,45 @@ rotate.tags=από την πλευρά του server home.imageToPdf.title=Εικόνα σε PDF home.imageToPdf.desc=Μετατροπή εικόνας (PNG, JPEG, GIF) σε PDF. -imageToPdf.tags=conversion,img,jpg,picture,photo +imageToPdf.tags=διαδοχική ψηφιοποίηση,εικόνα,jpg,πληροφορίας,φωτογραφία home.pdfToImage.title=PDF σε εικόνα home.pdfToImage.desc=Μετατροπή ενός PDF σε μία εικόνα. (PNG, JPEG, GIF) -pdfToImage.tags=conversion,img,jpg,picture,photo +pdfToImage.tags=διαδοχική ψηφιοποίηση,εικόνα,jpg,πληροφορίας,φωτογραφία home.pdfOrganiser.title=Οργάνωση home.pdfOrganiser.desc=Αφαίρεση/Αναδιάταξη σελίδων με οποιαδήποτε σειρά -pdfOrganiser.tags=duplex,even,odd,sort,move +pdfOrganiser.tags=διπλώματος,ήρωαι,ίσοδες,κατάταξη,μέταβαση home.addImage.title=Προσθήκη Εικόνας home.addImage.desc=Προσθήκη μιας εικόνας σε μια καθορισμένη θέση στο PDF -addImage.tags=img,jpg,picture,photo +addImage.tags=εικόνα,γούστιο,φωτογραφία home.watermark.title=Προσθήκη Υδατογραφήματος home.watermark.desc=Προσθήκη ενός προσαρμοσμένου υδατογράφηματος στο έγγραφό PDF. -watermark.tags=Text,repeating,label,own,copyright,trademark,img,jpg,picture,photo +watermark.tags=λέξη-πίνακας,τυπώμενο,ετικέτα,δικαιοχειρισμός,διόρθωση,εικόνα,γούστιο,φωτογραφία home.permissions.title=Αλλαγή Δικαιωμάτων home.permissions.desc=Αλλαγή των Δικαιωμάτων στο έγγραφο PDF -permissions.tags=read,write,edit,print +permissions.tags=αποκοπή,γραμμακτής,μετάβαση home.removePages.title=Αφαίρεση home.removePages.desc=Αφαίρεση μή επιθυμητών σελίδων απο το έγγραφο PDF. -removePages.tags=Remove pages,delete pages +removePages.tags=απόθεση σελίδων,διαγραφή σελίδων home.addPassword.title=Προσθήκη κωδικού home.addPassword.desc=Κρυπτογράφηση - κλείδωμα του PDF αρχείου με έναν κωδικό. -addPassword.tags=secure,security +addPassword.tags=σφραγίστω,σφραγίζομαι home.removePassword.title=Αφαίρεση Κωδικού home.removePassword.desc=Κατάργήση της προστασίας με κωδικό πρόσβασης από το έγγραφο PDF. -removePassword.tags=secure,Decrypt,security,unpassword,delete password +removePassword.tags=σφραγίστω,παρακυμπνώ,σφραγική,διαγραφή σφραγίδας home.compressPdfs.title=Συμπίεση home.compressPdfs.desc=Συμπίεση των αρχείων PDF για την μείωση του μεγέθους τους. -compressPdfs.tags=squish,small,tiny +compressPdfs.tags=ελαφρύνση,κοντά,τροχιές home.changeMetadata.title=Αλλαγή Μεταδεδομένων @@ -326,16 +329,16 @@ fileToPDF.tags=transformation,format,document,picture,slide,text,conversion,offi home.ocr.title=οπτική αναγνώριση χαρακτήρων (OCR) / Σαρώσεις Cleanup home.ocr.desc=Το Cleanup σαρώνει και ανιχνεύει κείμενο από εικόνες μέσα σε ένα PDF και το προσθέτει ξανά ως κείμενο -ocr.tags=recognition,text,image,scan,read,identify,detection,editable +ocr.tags=γνώση,λέξεις,εικόνα,ζήτημα,ανίδηση,δοχή,πρόγραμμα γνωστικής ανάγνωσης home.extractImages.title=Εξαγωγή εικόνων home.extractImages.desc=Εξαγωγή όλων των εικόνων απο ένα PDF και αποθήκευση αυτών σε zip -extractImages.tags=picture,photo,save,archive,zip,capture,grab +extractImages.tags=εικόνα,φωτογραφία,θυλώματος,αρχείο,γραφή,παράδειγμα home.pdfToPDFA.title=PDF σε PDF/A home.pdfToPDFA.desc=Μετατροπή PDF σε PDF/A για μακροχρόνια αποθήκευση -pdfToPDFA.tags=archive,long-term,standard,conversion,storage,preservation +pdfToPDFA.tags=θυλώματος,σύνολο,κανόνες,παραστατικό,κράτηση home.PDFToWord.title=PDF σε Word home.PDFToWord.desc=Μετατροπή του PDF σε Word αρχείο (DOC, DOCX and ODT) @@ -351,24 +354,24 @@ PDFToText.tags=richformat,richtextformat,rich text format home.PDFToHTML.title=PDF σε HTML home.PDFToHTML.desc=Μετατροπή του PDF σε μορφή HTML -PDFToHTML.tags=web content,browser friendly +PDFToHTML.tags=πρόσβαση σε πλαίσιο,περιεχόμενα για διαδικτυακά home.PDFToXML.title=PDF σε XML home.PDFToXML.desc=Μετατροπή του PDF σε μορφή XML -PDFToXML.tags=data-extraction,structured-content,interop,transformation,convert +PDFToXML.tags=ξυστώση-δεδομένων,σύνθεση στρογγυλών εξισώσεων,κοντινή κατάληψη,πρόσβαση home.ScannerImageSplit.title=Ανίχνευση/Διαίρεση σαρωμένων φωτογραφιών home.ScannerImageSplit.desc=Διαχωρίσμός πολλών φωτογραφίών μέσα από μια φωτογραφία/PDF -ScannerImageSplit.tags=separate,auto-detect,scans,multi-photo,organize +ScannerImageSplit.tags=διχοτομία,δικτυακή-δοκιμασία,σκάνερις,θέση πλατύων,διαχώριση home.sign.title=Υπογραφή home.sign.desc=Προσθήκη υπογραφής στο PDF με σχέδιο, κείμενο ή εικόνα. -sign.tags=authorize,initials,drawn-signature,text-sign,image-signature +sign.tags=αποθωμάσια,κατογώρηση,φωνή,χαρακτεία-υπογραφής -home.flatten.title=Flatten +home.flatten.title=Συνοπτικοποίηση home.flatten.desc=Κατάργηση όλων των διαδραστικών στοιχείων και φορμών από ένα PDF -flatten.tags=static,deactivate,non-interactive,streamline +flatten.tags=εγχώριο,απενεργοποιήση,αδρανής-ενεργό,προσαρμογές home.repair.title=Επιδιόρθωση home.repair.desc=Προσπάθεια επιδιόρθωσης ενός κατεστραμμένου PDF @@ -376,87 +379,87 @@ repair.tags=fix,restore,correction,recover home.removeBlanks.title=Αφαίρεση κενών Σελίδων home.removeBlanks.desc=Ανίχευση και αφαίρεση κενών σελίδων από ένα έγγραφο -removeBlanks.tags=cleanup,streamline,non-content,organize +removeBlanks.tags=καθαρισμός,προσαρμογές,εξωφύλακτες-δεδομένων,διοργάνωση -home.removeAnnotations.title=Remove Annotations -home.removeAnnotations.desc=Removes all comments/annotations from a PDF -removeAnnotations.tags=comments,highlight,notes,markup,remove +home.removeAnnotations.title=Αποθήκευση Παρατηρήσεων +home.removeAnnotations.desc=Ελέγξτε και προστίθετε σχόλια/παρατηρήσεις από το PDF +removeAnnotations.tags=σχόλια,κουμπί-ντεκτ,χαρτές,κάθετα-δεδομένα,αποβολή home.compare.title=Σύγκριση home.compare.desc=Σύγκριση και εμφάνιση των διαφορών μεταξύ δύο PDF αρχείων -compare.tags=differentiate,contrast,changes,analysis +compare.tags=διακρίσεις,σύγκριση,αλλαγές,πληθυσμική-ανάλυση home.certSign.title=Υπογραφή με Πιστοποιητικό home.certSign.desc=Υπογραφή ενός PDF αρχείου με ένα Πιστοποιητικό/Κλειδί (PEM/P12) -certSign.tags=authenticate,PEM,P12,official,encrypt +certSign.tags=υπογραφή,PEM,P12,δημοσίες,δεκτικότητα,κρυπτογράφηση -home.removeCertSign.title=Remove Certificate Sign -home.removeCertSign.desc=Remove certificate signature from PDF -removeCertSign.tags=authenticate,PEM,P12,official,decrypt +home.removeCertSign.title=Αποθήκευση Υπογραφής Τέλους +home.removeCertSign.desc=Εμβέλειες σημάδισης από το PDF +removeCertSign.tags=υπογραφή,PEM,P12,δημοσίες,κρυπτογράφηση-κλείσιμο home.pageLayout.title=Διάταξη πολλών σελίδων home.pageLayout.desc=Συγχώνευση πολλαπλών σελίδων ενός εγγράφου PDF σε μία μόνο σελίδα -pageLayout.tags=merge,composite,single-view,organize +pageLayout.tags=σύνθεση,ενωμένη,απλή-ροεπίσκαιρα,διοργάνωση home.scalePages.title=Προσαρμογή του μεγέθους/κλίμακας σελίδας home.scalePages.desc=Αλλαγή του μεγέθους/κλίμακας μίας σελίδας και/η του περιεχομένου της. -scalePages.tags=resize,modify,dimension,adapt +scalePages.tags=μεταβάλλοντας τους διάστασες,ενδιαφέροντες πόροι,παρακμή,μετατύχηση home.pipeline.title=Pipeline (Για προχωρημένους) home.pipeline.desc=Εκτέλεση πολλαπλών ενεργειών σε αρχεία PDF ορίζοντας pipeline scripts -pipeline.tags=automate,sequence,scripted,batch-process +pipeline.tags=αυτόματος κλωστήρας,σειρά,γραμμογραφική,αποδτομή-πακέτων home.add-page-numbers.title=Προσθήκη αριθμών σε Σελίδες home.add-page-numbers.desc=Προσθήκη αριθμών σελίδων σε ένα έγγραφο σε μια καθορισμένη θέση -add-page-numbers.tags=paginate,label,organize,index +add-page-numbers.tags=αυτόματη αρίθμηση σελίδων,κατάταξη,διοργάνωση,παραγγελία home.auto-rename.title=Αυτόματη μετονομασία αρχείου PDF home.auto-rename.desc=Αυτόματη μετονομασία ενός αρχείου PDF με βάση την κεφαλίδα που έχει εντοπιστεί -auto-rename.tags=auto-detect,header-based,organize,relabel +auto-rename.tags=αυτόματη αναδεικτική κατατάξη μέσω κεφαλαιών,διοργάνωση,καθαρισμός home.adjust-contrast.title=Προσαρμογή χρωμάτων/Αντίθεση home.adjust-contrast.desc=Προσαρμογή της αντίθεσης, του κορεσμού και της φωτεινότητας ενός PDF -adjust-contrast.tags=color-correction,tune,modify,enhance +adjust-contrast.tags=καταπολέμηση του συγκρούσεων,ενδιαφέροντας ελέγχο,μεταβάλλοντας για είδη,εξέλιξη home.crop.title=Περικοπή PDF home.crop.desc=Περικοπή ενός PDF για να μειωθεί το μέγεθός του (διατηρεί το κείμενο!) -crop.tags=trim,shrink,edit,shape +crop.tags=καταγραφή-καύσης,περικόπτωση,επεξεργασία,forma home.autoSplitPDF.title=Αυτόματος διαχωρισμός σελίδων home.autoSplitPDF.desc=Αυτόματος διαχωρισμός σαρωμένου PDF με φυσικό σαρωμένο διαχωριστή σελίδων QR Code -autoSplitPDF.tags=QR-based,separate,scan-segment,organize +autoSplitPDF.tags=βάσει QR-code,διχοτομία,ελέγχο-διχοτομία,κλάδωση home.sanitizePdf.title=Απολύμανση home.sanitizePdf.desc=Αφαίρεση σεναρίων και άλλων στοιχείων από αρχεία PDF -sanitizePdf.tags=clean,secure,safe,remove-threats +sanitizePdf.tags=καθαρισμός,διατηρητική,ασφάλεια,προσχώρηση-δυνατότητες home.URLToPDF.title=URL/Ιστότοπος σε PDF home.URLToPDF.desc=Μετατροπή οποιαδήποτε διεύθυνσης URL http(s) σε PDF -URLToPDF.tags=web-capture,save-page,web-to-doc,archive +URLToPDF.tags=καταγραφή-Διαδικτύου,θηράω-σεγκένεια,Διαδικτυακό-σε-δοκίμιο,αποθήκευση home.HTMLToPDF.title=HTML σε PDF home.HTMLToPDF.desc=Μετατροπή οποιουδήποτε αρχείου HTML ή zip σε PDF -HTMLToPDF.tags=markup,web-content,transformation,convert +HTMLToPDF.tags=μάρκαρι,χρηστήρια-Διαδικτύου,παρασταση,καλύτερο home.MarkdownToPDF.title=Markdown σε PDF home.MarkdownToPDF.desc=Μετατροπή οποιουδήποτε αρχείου Markdown σε PDF -MarkdownToPDF.tags=markup,web-content,transformation,convert +MarkdownToPDF.tags=μάρκαρι,χρηστήρια-Διαδικτύου,παρασταση,καλύτερο home.getPdfInfo.title=Λήψη όλων των πληροφοριών από το PDF home.getPdfInfo.desc=Λήψη όλων των πιθανών πληροφοριών από τα αρχεία PDF -getPdfInfo.tags=infomation,data,stats,statistics +getPdfInfo.tags=πληροφορίες,δεδομένα,στατιστικά,πληθυσμός home.extractPage.title=Εξαγωγή σελίδων home.extractPage.desc=Εξαγωγή των επιλεγμένων σελίδων από ένα PDF -extractPage.tags=extract +extractPage.tags=αποδιατύπωση home.PdfToSinglePage.title=PDF σε μία μεγάλη σελίδα home.PdfToSinglePage.desc=Συγχώνευση όλων των σελίδων PDF σε μια μεγάλη σελίδα -PdfToSinglePage.tags=single page +PdfToSinglePage.tags=για-μία-σελίδα home.showJS.title=Εμφάνιση Javascript @@ -465,29 +468,29 @@ showJS.tags=JS home.autoRedact.title=Αυτόματο Μαύρισμα Κειμένου home.autoRedact.desc=Αυτόματη επεξεργασία (Μαύρισμα) κείμενου σε PDF με βάση το κείμενο εισαγωγής -autoRedact.tags=Redact,Hide,black out,black,marker,hidden +autoRedact.tags=ξεκράζω,φυλακίζω,εικόνο-κουπές,κρατήστε ασφαλείς,δημιουργήστε home.tableExtraxt.title=PDF σε CSV home.tableExtraxt.desc=Εξάγει πίνακες από PDF μετατρέποντάς το σε CSV -tableExtraxt.tags=CSV,Table Extraction,extract,convert +tableExtraxt.tags=CSV,καταθέσεις-τάβλες,αποδιατύπωση,μετατροπή home.autoSizeSplitPDF.title=Αυτόματη διαίρεση κατά μέγεθος/πλήθος home.autoSizeSplitPDF.desc=Διαχωρίστε ένα μόνο PDF σε πολλά έγγραφα με βάση το μέγεθος, τον αριθμό σελίδων ή τον αριθμό εγγράφων -autoSizeSplitPDF.tags=pdf,split,document,organization +autoSizeSplitPDF.tags=pdf,διαχωρισμός,γραμμακτής,διορθώσεις-κάντε home.overlay-pdfs.title=Επικάλυψη PDFs home.overlay-pdfs.desc=Επικαλύπτει αρχεία PDF πάνω σε άλλο PDF -overlay-pdfs.tags=Overlay +overlay-pdfs.tags=πλέξη-πDFs home.split-by-sections.title=Διαχωρισμός PDF ανά ενότητες home.split-by-sections.desc=Διαχωρίστε κάθε σελίδα ενός PDF σε μικρότερες οριζόντιες και κάθετες ενότητες -split-by-sections.tags=Section Split, Divide, Customize +split-by-sections.tags=διχοτομία-διεργασίες,διεργασίες,κρατήστε home.AddStampRequest.title=Προσθήκη σφραγίδας σε PDF home.AddStampRequest.desc=Προσθέστε κείμενο ή προσθέστε σφραγίδες εικόνας σε καθορισμένες τοποθεσίες -AddStampRequest.tags=Stamp, Add image, center image, Watermark, PDF, Embed, Customize +AddStampRequest.tags=κάντε-πίνακα,πρόσθεση-εικόνας,κέντρο-εικόνας,χαμυλόχατο,PDF,βάζω-δείγμα,κρατήστε home.PDFToBook.title=PDF σε Book @@ -498,33 +501,33 @@ home.BookToPDF.title=Book σε PDF home.BookToPDF.desc=Μετατρέπει τις μορφές Books/Comics σε PDF χρησιμοποιώντας calibre BookToPDF.tags=Book,Comic,Calibre,Convert,manga,amazon,kindle -home.removeImagePdf.title=Remove image -home.removeImagePdf.desc=Remove image from PDF to reduce file size -removeImagePdf.tags=Remove Image,Page operations,Back end,server side +home.removeImagePdf.title=Αφαίρεση εικόνας +home.removeImagePdf.desc=Αφαίρεση εικόνας από το PDF για να μειώσετε το μέγεθος του αρχείου +removeImagePdf.tags=Αφαίρεση-Εικόνας,Πράξεις-Σελίδας,ύπαρξη-τμήματος,πλην-δυναμική -home.splitPdfByChapters.title=Split PDF by Chapters +home.splitPdfByChapters.title=Διχοτομία PDF ανά Περιγραφές home.splitPdfByChapters.desc=Split a PDF into multiple files based on its chapter structure. -splitPdfByChapters.tags=split,chapters,bookmarks,organize +splitPdfByChapters.tags=διχοτομία,περιγραφές,κεφάλαια,συνορία #replace-invert-color replace-color.title=Replace-Invert-Color -replace-color.header=Replace-Invert Color PDF +replace-color.header=Αντικατάσταση-Αντίστροφη Παθωμένη Πίντσουρ home.replaceColorPdf.title=Replace and Invert Color -home.replaceColorPdf.desc=Replace color for text and background in PDF and invert full color of pdf to reduce file size -replaceColorPdf.tags=Replace Color,Page operations,Back end,server side -replace-color.selectText.1=Replace or Invert color Options -replace-color.selectText.2=Default(Default high contrast colors) -replace-color.selectText.3=Custom(Customized colors) -replace-color.selectText.4=Full-Invert(Invert all colors) -replace-color.selectText.5=High contrast color options -replace-color.selectText.6=white text on black background -replace-color.selectText.7=Black text on white background -replace-color.selectText.8=Yellow text on black background -replace-color.selectText.9=Green text on black background -replace-color.selectText.10=Choose text Color -replace-color.selectText.11=Choose background Color -replace-color.submit=Replace +home.replaceColorPdf.desc=Αντικατάσταση χρώματος για το πεδίο κειμένου και απόχρωμη έκθεση PDF για μείωση μεγέθους αρχείου +replaceColorPdf.tags=Αντικατάσταση χρώματος, Διαδικασίες σελίδας, Μέσω πληροφόρησης, Από την εσωτερική +replace-color.selectText.1=Επιλογές αντικατάστασης-Αντίστροφης χρώματος +replace-color.selectText.2=Προεπιλογή (Χαράκτηρες υψηλής αντιδιαβάσιμότητας) +replace-color.selectText.3=Εξαιρετικό (Προσωπικές επιλογές χρώματος) +replace-color.selectText.4=Αντίστροφη Παθωμένη (Αντίστροφη αντικατάσταση όλων των πχώματος) +replace-color.selectText.5=Επιλογές υψηλής αντιδιαβάσιμότητας +replace-color.selectText.6=Χρίστος το πεδίο κειμένου σε μαύρη οπτική +replace-color.selectText.7=Μαύρο το πεδίο κειμένου σε χλωρό οπτική +replace-color.selectText.8=Ευτυχισμένο το πεδίο κειμένου σε μαύρη οπτική +replace-color.selectText.9=Χλωροφαίνοντος το πεδίο κειμένου σε μαύρη οπτική +replace-color.selectText.10=Επιλογή χρώματος του κειμένου +replace-color.selectText.11=Επιλογή απόχρωμης οπτικής +replace-color.submit=Αντικατάσταση @@ -543,17 +546,17 @@ login.locked=Ο λογαριασμός σας έχει κλειδωθεί. login.signinTitle=Παρακαλώ, συνδεθείτε login.ssoSignIn=Σύνδεση μέσω μοναδικής σύνδεσης login.oauth2AutoCreateDisabled=Απενεργοποιήθηκε ο χρήστης αυτόματης δημιουργίας OAUTH2 -login.oauth2AdminBlockedUser=Registration or logging in of non-registered users is currently blocked. Please contact the administrator. -login.oauth2RequestNotFound=Authorization request not found -login.oauth2InvalidUserInfoResponse=Invalid User Info Response -login.oauth2invalidRequest=Invalid Request -login.oauth2AccessDenied=Access Denied -login.oauth2InvalidTokenResponse=Invalid Token Response -login.oauth2InvalidIdToken=Invalid Id Token -login.userIsDisabled=User is deactivated, login is currently blocked with this username. Please contact the administrator. -login.alreadyLoggedIn=You are already logged in to -login.alreadyLoggedIn2=devices. Please log out of the devices and try again. -login.toManySessions=You have too many active sessions +login.oauth2AdminBlockedUser=Η εγγραφή και το πληκτρολόγημα ανθρώπων με όχι εγγραμμένες λογισμικές αρχίζουν να είναι ορισμένες τοποθετήσεις. Παρακαλώ στείλτε μια ισχυρά παραίτηση στον διοικητή. +login.oauth2RequestNotFound=Απαιτήσεις πληροφόρησης χρήστη ανακαλύψτηκαν μη έχουν βρεθεί +login.oauth2InvalidUserInfoResponse=Απάντηση μεμονωμένων πληροφοριών χρήστη αποδείξτηκε άγνωστη +login.oauth2invalidRequest=Αρχαίως απαιτήσεις πληροφοριών χρήστη +login.oauth2AccessDenied=Πρόσβαση ορισμένες τοποθετήσεις +login.oauth2InvalidTokenResponse=Απάντηση άρκετο ρόταμα +login.oauth2InvalidIdToken=Λιδός όρκου μη αρκετός +login.userIsDisabled=Ο χρήστης είναι δευτεροβαθμιακά διακωμένος, το σύστημα άλλαξε τον καθώς βρεθεί. Παρακαλείστε τους αρχηγούς να επιβεβαιώσουν τη συμπεριφορά χρήστη. +login.alreadyLoggedIn=Είστε ήδη σύνδεδες σε +login.alreadyLoggedIn2=κατοχόι. Παρακαλώ δυσκέντρωση τους και προσπαθήστε ξανά. +login.toManySessions=Έχετε πολλές εγγραφές σε βίτιο μέση #auto-redact autoRedact.title=Αυτόματο Μαύρισμα Κειμένου @@ -563,7 +566,7 @@ autoRedact.textsToRedactLabel=Κείμενο για μαύρισμα (διαχω autoRedact.textsToRedactPlaceholder=π.χ. \nΕμπιστευτικό \nΑκρώς απόρρητο autoRedact.useRegexLabel=Χρήση Regex autoRedact.wholeWordSearchLabel=Αναζήτηση ολόκληρης της λέξης -autoRedact.customPaddingLabel=Custom Extra Padding +autoRedact.customPaddingLabel=Εμπνευσμένη Προσθήκη Ανάκρισης autoRedact.convertPDFToImageLabel=Μετατροπή PDF σε PDF-Εικόνα (Χρησιμοποιείται για την αφαίρεση κειμένου πίσω από το πλαίσιο) autoRedact.submitButton=Υποβολή @@ -629,7 +632,7 @@ HTMLToPDF.defaultHeader=Ενεργοποίηση προεπιλεγμένης κ HTMLToPDF.cssMediaType=Αλλάξτε τον τύπο μέσων (media type )CSS της σελίδας. HTMLToPDF.none=Κανένα HTMLToPDF.print=Εκτύπωσε -HTMLToPDF.screen=Screen +HTMLToPDF.screen=Ορόσκοπος #AddStampRequest @@ -728,7 +731,7 @@ pageLayout.submit=Υποβολή scalePages.title=Προσαρμογή κλίμακας σελίδας scalePages.header=Προσαρμογή κλίμακας σελίδας scalePages.pageSize=Μέγεθος μιας σελίδας του εγγράφου. -scalePages.keepPageSize=Original Size +scalePages.keepPageSize=Τροποποίηση με ευθύγειες γραμμές scalePages.scaleFactor=Επίπεδο ζουμ (περικοπή) σελίδας. scalePages.submit=Υποβολή @@ -748,14 +751,15 @@ certSign.showSig=Εμφάνιση Υπογραφής certSign.reason=Αιτία certSign.location=Τοποθεσία certSign.name=Όνομα +certSign.showLogo=Προειδοποίηση Παρόχου certSign.submit=Υπογραφή PDF #removeCertSign -removeCertSign.title=Remove Certificate Signature -removeCertSign.header=Remove the digital certificate from the PDF -removeCertSign.selectPDF=Select a PDF file: -removeCertSign.submit=Remove Signature +removeCertSign.title=Αφαίρεση Αντικειμένων Τυπογραφίας Τομβής +removeCertSign.header=Αφαίρεση της πληροφόρησης όρκου από το PDF +removeCertSign.selectPDF=Επιλέξτε ένα αρχείο PDF: +removeCertSign.submit=Αφαιρέστε την ψήφιση #removeBlanks @@ -777,11 +781,14 @@ removeAnnotations.submit=Κατάργηση #compare compare.title=Σύγκριση compare.header=Σύγκριση PDFs -compare.highlightColor.1=Highlight Color 1: -compare.highlightColor.2=Highlight Color 2: +compare.highlightColor.1=Μάσκα Εμφανισμού 1: +compare.highlightColor.2=Μάσκα Εμφανισμού 2: compare.document.1=Έγγραφο 1 compare.document.2=Έγγραφο 2 compare.submit=Σύγκριση +compare.complex.message=Ένα ή τα δίπλα αποδεκτής χαρτογράφημα είναι μεγάλο, η πραγματικότητα αναζήτησης μπορεί να εξαβλύσει τη συγκρίση +compare.large.file.message=Ένα ή τα δίπλα αποδεκτής χαρτογράφημα είναι πολύ μεγάλο για να εξυπηρετήσει +compare.no.text.message=ένα ή τα δίπλα αποδεκτής χαρτογράφημα δεν περιέχουν κείμενο. Παρακαλώ επιλέξτε PDF με κείμενο για σύγκριση. #BookToPDF BookToPDF.title=Books και Comics σε PDF @@ -804,6 +811,11 @@ sign.draw=Σχεδίαση υπογραφής sign.text=Εισαγωγή κειμένου sign.clear=Καθάρισμα sign.add=Προσθήκη +sign.saved=Αποθηκευμένες Αλιάσιδες +sign.save=Αποθήκευση Αλιάσης +sign.personalSigs=Προσωπικές Αλιάσεις +sign.sharedSigs=Μεταδότες Αλιάσεις +sign.noSavedSigs=Δεν βρέθηκαν αποθηκευμένες αλιάσεις #repair @@ -813,10 +825,10 @@ repair.submit=Επιδιόρθωση #flatten -flatten.title=Flatten +flatten.title=Φιλοξένηση flatten.header=Flatten PDFs -flatten.flattenOnlyForms=Flatten only forms -flatten.submit=Flatten +flatten.flattenOnlyForms=Φιλοξενήστε μόνο τα φόρμαδα +flatten.submit=Φιλοξένηση #ScannerImageSplit @@ -830,7 +842,7 @@ ScannerImageSplit.selectText.7=Ελάχιστη επιφάνεια περιγρ ScannerImageSplit.selectText.8=Ρυθμίζει το ελάχιστο όριο περιγράμματος για μια φωτογραφία ScannerImageSplit.selectText.9=Μέγεθος περιγράμματος: ScannerImageSplit.selectText.10=Ορίζει το μέγεθος του περιγράμματος που προστίθεται και αφαιρείται για να αποτρέπονται λευκά περιγράμματα στην έξοδο (προεπιλογή: 1). -ScannerImageSplit.info=Python is not installed. It is required to run. +ScannerImageSplit.info=Δεν είναι ιστάμενος Python. Είναι απαιτήτων για τη λειτουργία. #OCR @@ -857,7 +869,7 @@ ocr.submit=Επεξεργασία PDF με OCR extractImages.title=Εξαγωγή Εικόνων extractImages.header=Εξαγωγή Εικόνων extractImages.selectText=Επιλέξτε μορφή εικόνας για να μετατρέψετε τις εξαγόμενες εικόνες -extractImages.allowDuplicates=Save duplicate images +extractImages.allowDuplicates=Αποθήκευση εικόνων που μπορούν να είναι ίδιες extractImages.submit=Εξαγωγή @@ -865,7 +877,7 @@ extractImages.submit=Εξαγωγή fileToPDF.title=Αρχείο σε PDF fileToPDF.header=Μετατροπή οποιουδήποτε αρχείου σε PDF fileToPDF.credit=Αυτή η υπηρεσία χρησιμοποιεί LibreOffice και Unoconv για την μετατροπή των αρχείων. -fileToPDF.supportedFileTypesInfo=Supported File types +fileToPDF.supportedFileTypesInfo=Υποστηριζόμενα αρχεία fileToPDF.supportedFileTypes=Οι υποστηριζόμενοι τύποι αρχείων θα πρέπει να περιλαμβάνουν τα παρακάτω, ωστόσο, για μια πλήρη ενημερωμένη λίστα με τις υποστηριζόμενες μορφές, ανατρέξτε στην τεκμηρίωση του LibreOffice fileToPDF.submit=Μετατροπή σε PDF @@ -895,7 +907,7 @@ merge.title=Συγχώνευση merge.header=Συγχώνευση πολλαπλών PDFs (2+) merge.sortByName=Ταξινόμηση με βάση το Όνομα merge.sortByDate=Ταξινόμηση με βάση την Ημερομηνία -merge.removeCertSign=Remove digital signature in the merged file? +merge.removeCertSign=Επιλογή για τη μέριξη δικαιωμάτων σημείους σημάδους; Αφαίρεση ηλεκτρονικών πρόσβασης από το συγχέωνται αρχείο? merge.submit=Συγχώνευση @@ -903,25 +915,32 @@ merge.submit=Συγχώνευση pdfOrganiser.title=Διοργανωτής σελίδας pdfOrganiser.header=Διοργανωτής σελίδας PDF pdfOrganiser.submit=Αναδιάταξη σελίδων -pdfOrganiser.mode=Mode +pdfOrganiser.mode=Τύπος pdfOrganiser.mode.1=Προσαρμοσμένη Σειρά Σελίδας pdfOrganiser.mode.2=Αντίστροφη Σειρά pdfOrganiser.mode.3=Ταξινόμηση Διπλής Όψης (Duplex Sort) pdfOrganiser.mode.4=Ταξινόμηση Φυλλαδίου (Booklet Sort) -pdfOrganiser.mode.5=Side Stitch Booklet Sort +pdfOrganiser.mode.5=Πλάσμα Σεπτιμερή Λεφτοδυοκόσμου pdfOrganiser.mode.6=Διαίρεση Μονού-Ζυγού pdfOrganiser.mode.7=Αφαίρεση Πρώτου pdfOrganiser.mode.8=Αφαίρεση Τελευταίου pdfOrganiser.mode.9=Αφαίρεση Πρώτου και Τελευταίου -pdfOrganiser.mode.10=Odd-Even Merge +pdfOrganiser.mode.10=Περίπτωση Τυχαίου Μέριξης pdfOrganiser.placeholder=(π.χ. 1,3,2 ή 4-8,2,10-12 ή 2n-1) #multiTool multiTool.title=PDF Πολυεργαλείο multiTool.header=PDF Πολυεργαλείο -multiTool.uploadPrompts=File Name - +multiTool.uploadPrompts=Όνομα αρχείου +multiTool.selectAll=Select All +multiTool.deselectAll=Deselect All +multiTool.selectPages=Page Select +multiTool.selectedPages=Selected Pages +multiTool.page=Page +multiTool.deleteSelected=Delete Selected +multiTool.downloadAll=Export +multiTool.downloadSelected=Export Selected #view pdf viewPdf.title=Προβολή PDF viewPdf.header=Προβολή PDF @@ -982,7 +1001,7 @@ pdfToImage.color=Χρώμα pdfToImage.grey=Κλίμακα του γκρι pdfToImage.blackwhite=Ασπρόμαυρο (Μπορεί να χαθούν δεδομένα!) pdfToImage.submit=Μετατροπή -pdfToImage.info=Python is not installed. Required for WebP conversion. +pdfToImage.info=Δεν είναι ιστάμενος Python. Είναι απαιτήτων για τη μετατροπή σε WebP. #addPassword @@ -1019,7 +1038,7 @@ watermark.selectText.6=heightSpacer (Κενό μεταξύ κάθε υδατογ watermark.selectText.7=Αδιαφάνεια (Opacity) (0% - 100%): watermark.selectText.8=Τύπος Υδατογραφήματος: watermark.selectText.9=Εικόνα Υδατογραφήματος: -watermark.selectText.10=Convert PDF to PDF-Image +watermark.selectText.10=Μετατροπή PDF σε PDF-Image watermark.submit=Προσθήκη Υδατογραφήματος watermark.type.1=Κείμενο watermark.type.2=Εικόνα @@ -1063,7 +1082,7 @@ changeMetadata.keywords=Λέξεις-κλειδιά: changeMetadata.modDate=Ημερομηνία Τροποποίησης (yyyy/MM/dd HH:mm:ss): changeMetadata.producer=Παραγωγός: changeMetadata.subject=Θέμα: -changeMetadata.trapped=Trapped: +changeMetadata.trapped=Τυχόν Περίκλειση: changeMetadata.selectText.4=Άλλα μεταδεδομένα: changeMetadata.selectText.5=Προσθήκη εγγραφής προσαρμοσμένων μεταδεδομένων changeMetadata.submit=Αλλαγή @@ -1075,8 +1094,8 @@ pdfToPDFA.header=PDF σε PDF/A pdfToPDFA.credit=Αυτή η υπηρεσία χρησιμοποιεί ghostscript για PDF/A μετατροπή pdfToPDFA.submit=Μετατροπή pdfToPDFA.tip=Προς το παρόν δεν λειτουργεί για πολλαπλές εισόδους ταυτόχρονα -pdfToPDFA.outputFormat=Output format -pdfToPDFA.pdfWithDigitalSignature=The PDF contains a digital signature. This will be removed in the next step. +pdfToPDFA.outputFormat=Εξόδος αναμορφώσεων +pdfToPDFA.pdfWithDigitalSignature=Το PDF περιέχει ηλεκτρονική ψηφιακή υπογραφή. Αυτό θα αφαιρεθεί στο επόμενο βήμα. #PDFToWord @@ -1145,8 +1164,8 @@ overlay-pdfs.mode.fixedRepeat=Διορθώθηκε η Επικάλυψη Επα overlay-pdfs.counts.label=Μετρήσεις επικάλυψης (για σταθερή λειτουργία επανάληψης) overlay-pdfs.counts.placeholder=Εισαγάγετε μετρήσεις διαχωρισμένες με κόμματα (π.χ. 2,3,1) overlay-pdfs.position.label=Επιλέξτε Θέση Επικάλυψης -overlay-pdfs.position.foreground=Foreground -overlay-pdfs.position.background=Background +overlay-pdfs.position.foreground=Προσκήνιο +overlay-pdfs.position.background=фондо overlay-pdfs.submit=Υποβολή @@ -1162,31 +1181,31 @@ split-by-sections.merge=Συγχώνευση σε ένα PDF #printFile -printFile.title=Print File -printFile.header=Print File to Printer -printFile.selectText.1=Select File to Print -printFile.selectText.2=Enter Printer Name -printFile.submit=Print +printFile.title=Εκτύπωση Αρχείου +printFile.header=Εκτύπωση Αρχείου σε Εκτυπωτή +printFile.selectText.1=Επιλογή Αρχείου για Εκτύπωση +printFile.selectText.2=Εισάγετε το όνομα του εκτυπωτή +printFile.submit=Εκτύπωση #licenses licenses.nav=Άδειες licenses.title=3rd Party Άδειες licenses.header=3rd Party Άδειες -licenses.module=Module +licenses.module=Μόδουλο licenses.version=Εκδοχή licenses.license=Άδεια #survey -survey.nav=Survey -survey.title=Stirling-PDF Survey -survey.description=Stirling-PDF has no tracking so we want to hear from our users to improve Stirling-PDF! -survey.changes=Stirling-PDF has changed since the last survey! To find out more please check our blog post here: -survey.changes2=With these changes we are getting paid business support and funding +survey.nav=Έρευνα +survey.title=Περιεχόμενο Έρευνας Stirling-PDF +survey.description=Η Stirling-PDF δεν επηρεάζεται από τη μετακίνηση. Ελπίζουμε πως θα συμμεριζόμαστε για να βελτιώσουμε τη Stirling-PDF! +survey.changes=Αφού κάποιες αλλαγές στην Stirling-PDF, θα πρόκειται να εξετάσουμε με τρόπου πιο συγκεκριμένο αυτά. Αναχαίτιζε την ελέγχωσή τους! +survey.changes2=Με αυτές τις αλλαγές, συμπεριλαμβάνονται και οι δομοφόνια χρηματοδότησης και εκπομπής survey.please=Please consider taking our survey! -survey.disabled=(Survey popup will be disabled in following updates but available at foot of page) -survey.button=Take Survey -survey.dontShowAgain=Don't show again +survey.disabled=(Το παράθυρο ερεύνησης θα απενεργοποιηθεί σε μελλοντικές ενημερώσεις, αλλά θα παρουσιάζεται στο τέλος της διαδικασίας) +survey.button=Παίρνω μερίδα στην ερεύνα +survey.dontShowAgain=Δεν απεικονίζεται ξανά #error @@ -1204,21 +1223,19 @@ error.discordSubmit=Discord - Υποβάλετε ένα Support post #remove-image -removeImage.title=Remove image -removeImage.header=Remove image -removeImage.removeImage=Remove image -removeImage.submit=Remove image - - -splitByChapters.title=Split PDF by Chapters -splitByChapters.header=Split PDF by Chapters -splitByChapters.bookmarkLevel=Bookmark Level -splitByChapters.includeMetadata=Include Metadata -splitByChapters.allowDuplicates=Allow Duplicates -splitByChapters.desc.1=This tool splits a PDF file into multiple PDFs based on its chapter structure. -splitByChapters.desc.2=Bookmark Level: Choose the level of bookmarks to use for splitting (0 for top-level, 1 for second-level, etc.). -splitByChapters.desc.3=Include Metadata: If checked, the original PDF's metadata will be included in each split PDF. -splitByChapters.desc.4=Allow Duplicates: If checked, allows multiple bookmarks on the same page to create separate PDFs. -splitByChapters.submit=Split PDF +removeImage.title=Αφαίρεση εικόνας +removeImage.header=Αφαίρεση εικόνας +removeImage.removeImage=Αφαίρεση εικόνας +removeImage.submit=Αποθέτει την εικόνα +splitByChapters.title=Χωρίστε το PDF με βάση τα κεφάλαια +splitByChapters.header=Χωρίστε το PDF με βάση τα κεφάλαια +splitByChapters.bookmarkLevel=Επίπεδο Σήμανσης Σκέψης +splitByChapters.includeMetadata=Πρόσθεση Metadata +splitByChapters.allowDuplicates=Διάλυση Παρόντων Τίτλων Επιπέδου +splitByChapters.desc.1=Αυτή η εργαλείο χωρίζει το PDF αρχείο σε πολλά PDF βάση της καθορισμένης δομής του κεφαλαιώδους. +splitByChapters.desc.2=Επίπεδο Σήμανσης Σκέψης: Επιλέξτε το επίπεδο σήμανσης σκέψης που να χρησιμοποιηθεί για τη διάλυση (0 για το κύριο επίπεδο, 1 για το δεύτερο επίπεδο κλπ.). +splitByChapters.desc.3=Πρόσθεση Metadata: Αν επεξεργαστείται, οι αρχικές metadata του PDF θα προστεθούν σε κάθε διαλυμένο PDF. +splitByChapters.desc.4=Διάλυση Παρόντων Τίτλων Επιπέδου: Αν επεξεργαστείται, επιτρέπει τη δημιουργία αποκοπών PDF με βάση πλήρως καθορισμένους σήμαντες έδρας. +splitByChapters.submit=Διαλύστε το PDF diff --git a/src/main/resources/messages_en_GB.properties b/src/main/resources/messages_en_GB.properties index 29f40d8e7..350f01f51 100644 --- a/src/main/resources/messages_en_GB.properties +++ b/src/main/resources/messages_en_GB.properties @@ -79,6 +79,8 @@ info=Info pro=Pro page=Page pages=Pages +loading=Loading... +addToDoc=Add to Document legal.privacy=Privacy Policy legal.terms=Terms and Conditions @@ -244,6 +246,7 @@ database.fileNullOrEmpty=File must not be null or empty database.failedImportFile=Failed to import file session.expired=Your session has expired. Please refresh the page and try again. +session.refreshPage=Refresh Page ############# # HOME-PAGE # @@ -748,6 +751,7 @@ certSign.showSig=Show Signature certSign.reason=Reason certSign.location=Location certSign.name=Name +certSign.showLogo=Show Logo certSign.submit=Sign PDF @@ -782,6 +786,9 @@ compare.highlightColor.2=Highlight Color 2: compare.document.1=Document 1 compare.document.2=Document 2 compare.submit=Compare +compare.complex.message=One or both of the provided documents are large files, accuracy of comparison may be reduced +compare.large.file.message=One or Both of the provided documents are too large to process +compare.no.text.message=One or both of the selected PDFs have no text content. Please choose PDFs with text for comparison. #BookToPDF BookToPDF.title=Books and Comics to PDF @@ -804,6 +811,11 @@ sign.draw=Draw Signature sign.text=Text Input sign.clear=Clear sign.add=Add +sign.saved=Saved Signatures +sign.save=Save Signature +sign.personalSigs=Personal Signatures +sign.sharedSigs=Shared Signatures +sign.noSavedSigs=No saved signatures found #repair @@ -921,7 +933,14 @@ pdfOrganiser.placeholder=(e.g. 1,3,2 or 4-8,2,10-12 or 2n-1) multiTool.title=PDF Multi Tool multiTool.header=PDF Multi Tool multiTool.uploadPrompts=File Name - +multiTool.selectAll=Select All +multiTool.deselectAll=Deselect All +multiTool.selectPages=Page Select +multiTool.selectedPages=Selected Pages +multiTool.page=Page +multiTool.deleteSelected=Delete Selected +multiTool.downloadAll=Export +multiTool.downloadSelected=Export Selected #view pdf viewPdf.title=View PDF viewPdf.header=View PDF @@ -1220,5 +1239,3 @@ splitByChapters.desc.2=Bookmark Level: Choose the level of bookmarks to use for splitByChapters.desc.3=Include Metadata: If checked, the original PDF's metadata will be included in each split PDF. splitByChapters.desc.4=Allow Duplicates: If checked, allows multiple bookmarks on the same page to create separate PDFs. splitByChapters.submit=Split PDF - - diff --git a/src/main/resources/messages_en_US.properties b/src/main/resources/messages_en_US.properties index eadf3b031..3075c67a2 100644 --- a/src/main/resources/messages_en_US.properties +++ b/src/main/resources/messages_en_US.properties @@ -79,6 +79,8 @@ info=Info pro=Pro page=Page pages=Pages +loading=Loading... +addToDoc=Add to Document legal.privacy=Privacy Policy legal.terms=Terms and Conditions @@ -244,6 +246,7 @@ database.fileNullOrEmpty=File must not be null or empty database.failedImportFile=Failed Import File session.expired=Your session has expired. Please refresh the page and try again. +session.refreshPage=Refresh Page ############# # HOME-PAGE # @@ -748,6 +751,7 @@ certSign.showSig=Show Signature certSign.reason=Reason certSign.location=Location certSign.name=Name +certSign.showLogo=Show Logo certSign.submit=Sign PDF @@ -782,6 +786,9 @@ compare.highlightColor.2=Highlight Color 2: compare.document.1=Document 1 compare.document.2=Document 2 compare.submit=Compare +compare.complex.message=One or both of the provided documents are large files, accuracy of comparison may be reduced +compare.large.file.message=One or Both of the provided documents are too large to process +compare.no.text.message=One or both of the selected PDFs have no text content. Please choose PDFs with text for comparison. #BookToPDF BookToPDF.title=Books and Comics to PDF @@ -804,6 +811,11 @@ sign.draw=Draw Signature sign.text=Text Input sign.clear=Clear sign.add=Add +sign.saved=Saved Signatures +sign.save=Save Signature +sign.personalSigs=Personal Signatures +sign.sharedSigs=Shared Signatures +sign.noSavedSigs=No saved signatures found #repair @@ -921,7 +933,14 @@ pdfOrganiser.placeholder=(e.g. 1,3,2 or 4-8,2,10-12 or 2n-1) multiTool.title=PDF Multi Tool multiTool.header=PDF Multi Tool multiTool.uploadPrompts=File Name - +multiTool.selectAll=Select All +multiTool.deselectAll=Deselect All +multiTool.selectPages=Page Select +multiTool.selectedPages=Selected Pages +multiTool.page=Page +multiTool.deleteSelected=Delete Selected +multiTool.downloadAll=Export +multiTool.downloadSelected=Export Selected #view pdf viewPdf.title=View PDF viewPdf.header=View PDF @@ -1220,5 +1239,3 @@ splitByChapters.desc.2=Bookmark Level: Choose the level of bookmarks to use for splitByChapters.desc.3=Include Metadata: If checked, the original PDF's metadata will be included in each split PDF. splitByChapters.desc.4=Allow Duplicates: If checked, allows multiple bookmarks on the same page to create separate PDFs. splitByChapters.submit=Split PDF - - diff --git a/src/main/resources/messages_es_ES.properties b/src/main/resources/messages_es_ES.properties index 624ef96b2..229ad2da4 100644 --- a/src/main/resources/messages_es_ES.properties +++ b/src/main/resources/messages_es_ES.properties @@ -3,8 +3,8 @@ ########### # the direction that the language is written (ltr = left to right, rtl = right to left) language.direction=ltr -addPageNumbers.fontSize=Font Size -addPageNumbers.fontName=Font Name +addPageNumbers.fontSize=Tamaño de Letra +addPageNumbers.fontName=Nombre de Letra pdfPrompt=Seleccionar PDF(s) multiPdfPrompt=Seleccionar PDFs (2+) multiPdfDropPrompt=Seleccione (o arrastre y suelte) todos los PDFs que quiera @@ -50,7 +50,7 @@ WorkInProgess=Tarea en progreso, puede no funcionar o ralentizarse; ¡por favor, poweredBy=Desarrollado por yes=Sí no=No -changedCredsMessage=Se cambiaron las credenciales! +changedCredsMessage=¡Se cambiaron las credenciales! notAuthenticatedMessage=Usuario no autentificado. userNotFoundMessage=Usuario no encontrado. incorrectPasswordMessage=La contraseña actual no es correcta. @@ -75,16 +75,18 @@ visitGithub=Visitar Repositorio de Github donate=Donar color=Color sponsor=Patrocinador -info=Info +info=Información pro=Pro -page=Page -pages=Pages +page=Página +pages=Páginas +loading=Cargando... +addToDoc=Agregar al Documento -legal.privacy=Privacy Policy -legal.terms=Terms and Conditions -legal.accessibility=Accessibility -legal.cookie=Cookie Policy -legal.impressum=Impressum +legal.privacy=Política de Privacidad +legal.terms=Términos y Condiciones +legal.accessibility=Accesibilidad +legal.cookie=Política de Cookies +legal.impressum=Impresión ############### # Pipeline # @@ -114,21 +116,21 @@ pipelineOptions.validateButton=Validar ######################## # ENTERPRISE EDITION # ######################## -enterpriseEdition.button=Upgrade to Pro -enterpriseEdition.warning=This feature is only available to Pro users. -enterpriseEdition.yamlAdvert=Stirling PDF Pro supports YAML configuration files and other SSO features. -enterpriseEdition.ssoAdvert=Looking for more user management features? Check out Stirling PDF Pro +enterpriseEdition.button=Actualiza a Pro +enterpriseEdition.warning=Esta característica está únicamente disponible para usuarios Pro. +enterpriseEdition.yamlAdvert=Stirling PDF Pro soporta configuración de ficheros YAML y otras características SSO. +enterpriseEdition.ssoAdvert=¿Busca más funciones de administración de usuarios? Consulte Stirling PDF Pro ################# # Analytics # ################# -analytics.title=Do you want make Stirling PDF better? -analytics.paragraph1=Stirling PDF has opt in analytics to help us improve the product. We do not track any personal information or file contents. -analytics.paragraph2=Please consider enabling analytics to help Stirling-PDF grow and to allow us to understand our users better. -analytics.enable=Enable analytics -analytics.disable=Disable analytics -analytics.settings=You can change the settings for analytics in the config/settings.yml file +analytics.title=¿Quieres mejorar Stirling PDF? +analytics.paragraph1=Stirling PDF ha optado por analíticas para ayudarnos a mejorar el producto. No rastreamos ninguna información personal ni contenido de archivos. +analytics.paragraph2=Considere habilitar analíticas para ayudar a Stirling-PDF a crecer y permitirnos comprender mejor a nuestros usuarios. +analytics.enable=Habilitar analíticas +analytics.disable=Deshabilitar analíticas +analytics.settings=Puede cambiar la configuración de analíticas en el archivo config/settings.yml ############# # NAVBAR # @@ -145,7 +147,7 @@ navbar.sections.convertFrom=Convertir desde PDF navbar.sections.security=Señalización y seguridad navbar.sections.advance=Avanzado navbar.sections.edit=Ver y Editar -navbar.sections.popular=Popular +navbar.sections.popular=Populares ############# # SETTINGS # @@ -243,7 +245,8 @@ database.fileNotFound=Archivo no encontrado database.fileNullOrEmpty=El archivo no debe ser nulo o vacío. database.failedImportFile=Archivo de importación fallido -session.expired=Your session has expired. Please refresh the page and try again. +session.expired=Tu sesión ha caducado. Actualice la página e inténtelo de nuevo. +session.refreshPage=Refresh Page ############# # HOME-PAGE # @@ -392,7 +395,7 @@ certSign.tags=autentificar,PEM,P12,oficial,encriptar home.removeCertSign.title=Quitar signo de certificado home.removeCertSign.desc=Eliminar firma de certificado de PDF -removeCertSign.tags=authenticate,PEM,P12,official,decrypt +removeCertSign.tags=autenticar,PEM,P12,oficial,desencriptar home.pageLayout.title=Diseño de varias páginas home.pageLayout.desc=Unir varias páginas de un documento PDF en una sola página @@ -503,28 +506,28 @@ home.removeImagePdf.desc=Eliminar imagen del PDF> para reducir el tamaño de arc removeImagePdf.tags=Eliminar imagen,Operaciones de página,Back end,lado del servidor -home.splitPdfByChapters.title=Split PDF by Chapters -home.splitPdfByChapters.desc=Split a PDF into multiple files based on its chapter structure. -splitPdfByChapters.tags=split,chapters,bookmarks,organize +home.splitPdfByChapters.title=Dividir PDF por capítulos +home.splitPdfByChapters.desc=Divida un PDF en varios archivos según su estructura de capítulos. +splitPdfByChapters.tags=dividir,capítulos,marcadores,organizar #replace-invert-color -replace-color.title=Replace-Invert-Color -replace-color.header=Replace-Invert Color PDF -home.replaceColorPdf.title=Replace and Invert Color -home.replaceColorPdf.desc=Replace color for text and background in PDF and invert full color of pdf to reduce file size -replaceColorPdf.tags=Replace Color,Page operations,Back end,server side -replace-color.selectText.1=Replace or Invert color Options -replace-color.selectText.2=Default(Default high contrast colors) -replace-color.selectText.3=Custom(Customized colors) -replace-color.selectText.4=Full-Invert(Invert all colors) -replace-color.selectText.5=High contrast color options -replace-color.selectText.6=white text on black background -replace-color.selectText.7=Black text on white background -replace-color.selectText.8=Yellow text on black background -replace-color.selectText.9=Green text on black background -replace-color.selectText.10=Choose text Color -replace-color.selectText.11=Choose background Color -replace-color.submit=Replace +replace-color.title=Reemplazar-Invertir-Color +replace-color.header=Reemplazar-Invertir Color en PDF +home.replaceColorPdf.title=Reemplazar e Invertir Color +home.replaceColorPdf.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 +replaceColorPdf.tags=Reemplazar Color,Operaciones de Página,Back end,Lado del servidor +replace-color.selectText.1=Opciones para Reemplazar o Invertir color +replace-color.selectText.2=Predeterminado (Colores de alto contraste predeterminados) +replace-color.selectText.3=Personalizado (Colores personalizados) +replace-color.selectText.4=Invertir Completo (Invertir todos los colores) +replace-color.selectText.5=Opciones de color de alto contraste +replace-color.selectText.6=Texto blanco sobre fondo negro +replace-color.selectText.7=Texto negro sobre fondo blanco +replace-color.selectText.8=Texto amarillo sobre fondo negro +replace-color.selectText.9=Texto verde sobre fondo negro +replace-color.selectText.10=Elegir Color de Texto +replace-color.selectText.11=Elegir Color de Fondo +replace-color.submit=Reemplazar @@ -543,7 +546,7 @@ login.locked=Su cuenta se ha bloqueado. login.signinTitle=Por favor, inicie sesión login.ssoSignIn=Iniciar sesión a través del inicio de sesión único login.oauth2AutoCreateDisabled=Usuario de creación automática de OAUTH2 DESACTIVADO -login.oauth2AdminBlockedUser=Registration or logging in of non-registered users is currently blocked. Please contact the administrator. +login.oauth2AdminBlockedUser=El registro o inicio de sesión de usuarios no registrados está actualmente bloqueado. Por favor, contáctese con el administrador. login.oauth2RequestNotFound=Solicitud de autorización no encontrada login.oauth2InvalidUserInfoResponse=Respuesta de información de usuario no válida login.oauth2invalidRequest=Solicitud no válida @@ -551,9 +554,9 @@ login.oauth2AccessDenied=Acceso denegado login.oauth2InvalidTokenResponse=Respuesta de token no válida login.oauth2InvalidIdToken=Token de identificación no válido login.userIsDisabled=El usuario está desactivado, actualmente el acceso está bloqueado para ese nombre de usuario. Por favor, póngase en contacto con el administrador. -login.alreadyLoggedIn=You are already logged in to -login.alreadyLoggedIn2=devices. Please log out of the devices and try again. -login.toManySessions=You have too many active sessions +login.alreadyLoggedIn=Ya has iniciado sesión en +login.alreadyLoggedIn2=dispositivos. Cierra sesión en los dispositivos y vuelve a intentarlo. +login.toManySessions=Tienes demasiadas sesiones activas #auto-redact autoRedact.title=Auto Redactar @@ -748,6 +751,7 @@ certSign.showSig=Mostrar firma certSign.reason=Razón certSign.location=Ubicación certSign.name=Nombre +certSign.showLogo=Mostrar Logotipo certSign.submit=Firmar PDF @@ -782,6 +786,9 @@ compare.highlightColor.2=Color resaltado 2: compare.document.1=Documento 1 compare.document.2=Documento 2 compare.submit=Comparar +compare.complex.message=Uno o ambos de los documentos proporcionados son archivos grandes; la precisión de la comparación puede disminuir. +compare.large.file.message=Uno o ambos de los documentos proporcionados son demasiado grandes para procesarse. +compare.no.text.message=Uno o ambos de los PDF seleccionados no contienen contenido de texto. Por favor, elija PDFs con texto para la comparación. #BookToPDF BookToPDF.title=Libros y Cómics a PDF @@ -804,6 +811,11 @@ sign.draw=Dibujar firma sign.text=Entrada de texto sign.clear=Borrar sign.add=Agregar +sign.saved=firmas guardadas +sign.save=Guardar Firma +sign.personalSigs=Firmas Personales +sign.sharedSigs=Firmas compartidas +sign.noSavedSigs=No se encontraron firmas guardadas #repair @@ -887,7 +899,7 @@ addImage.title=Añadir imagen addImage.header=Añadir imagen de PDF addImage.everyPage=¿Todas las páginas? addImage.upload=Añadir imagen -addImage.submit=Añadir imagen +addImage.submit=Enviar imagen #merge @@ -921,7 +933,14 @@ pdfOrganiser.placeholder=(por ej., 1,3,2 o 4-8,2,10-12 o 2n-1) multiTool.title=Multi-herramienta PDF multiTool.header=Multi-herramienta PDF multiTool.uploadPrompts=Nombre del archivo - +multiTool.selectAll=Select All +multiTool.deselectAll=Deselect All +multiTool.selectPages=Page Select +multiTool.selectedPages=Selected Pages +multiTool.page=Page +multiTool.deleteSelected=Delete Selected +multiTool.downloadAll=Export +multiTool.downloadSelected=Export Selected #view pdf viewPdf.title=Ver PDF viewPdf.header=Ver PDF @@ -1123,7 +1142,7 @@ PDFToCSV.prompt=Elija una página para extraer la tabla PDFToCSV.submit=Extraer #split-by-size-or-count -split-by-size-or-count.title=Split PDF by Size or Count +split-by-size-or-count.title=Dividir PDF por tamaño o cantidad split-by-size-or-count.header=Dividir PDF por tamaño o número split-by-size-or-count.type.label=Seleccionar tipo de división split-by-size-or-count.type.size=Por tamaño @@ -1181,8 +1200,8 @@ licenses.license=Licencia survey.nav=Encuesta survey.title=Encuesta Stirling-PDF survey.description=Stirling-PDF no tiene seguimiento, por lo que queremos escuchar a nuestros usuarios para mejorar Stirling-PDF. -survey.changes=Stirling-PDF has changed since the last survey! To find out more please check our blog post here: -survey.changes2=With these changes we are getting paid business support and funding +survey.changes=Stirling-PDF ha cambiado desde la última encuesta! Para obtener más información, revise nuestro artículo de blog aquí: +survey.changes2=Con estos cambios estamos obteniendo apoyo y financiamiento empresarial survey.please=¡Considere realizar nuestra encuesta! survey.disabled=(La ventana emergente de la encuesta se desactivará en las siguientes actualizaciones, pero estará disponible al pie de la página.) survey.button=Realizar encuesta @@ -1210,15 +1229,13 @@ removeImage.removeImage=Eliminar imagen removeImage.submit=Eliminar imagen -splitByChapters.title=Split PDF by Chapters -splitByChapters.header=Split PDF by Chapters -splitByChapters.bookmarkLevel=Bookmark Level -splitByChapters.includeMetadata=Include Metadata -splitByChapters.allowDuplicates=Allow Duplicates -splitByChapters.desc.1=This tool splits a PDF file into multiple PDFs based on its chapter structure. -splitByChapters.desc.2=Bookmark Level: Choose the level of bookmarks to use for splitting (0 for top-level, 1 for second-level, etc.). -splitByChapters.desc.3=Include Metadata: If checked, the original PDF's metadata will be included in each split PDF. -splitByChapters.desc.4=Allow Duplicates: If checked, allows multiple bookmarks on the same page to create separate PDFs. -splitByChapters.submit=Split PDF - - +splitByChapters.title=Dividir PDF por Capítulos +splitByChapters.header=Dividir PDF por Capítulos +splitByChapters.bookmarkLevel=Nivel de Marcador +splitByChapters.includeMetadata=Incluir Metadatos +splitByChapters.allowDuplicates=Permitir Duplicados +splitByChapters.desc.1=Esta herramienta divide un archivo PDF en múltiples archivos PDF según su estructura de capítulos. +splitByChapters.desc.2=Nivel de Marcador: Elige el nivel de marcadores para dividir (0 para el nivel superior, 1 para el segundo nivel, etc.). +splitByChapters.desc.3=Incluir Metadatos: Si está seleccionado, los metadatos del PDF original se incluirán en cada PDF dividido. +splitByChapters.desc.4=Permitir Duplicados: Si está seleccionado, permite que múltiples marcadores en la misma página creen archivos PDF separados. +splitByChapters.submit=Dividir PDF diff --git a/src/main/resources/messages_eu_ES.properties b/src/main/resources/messages_eu_ES.properties index 99a6a1531..3c51172e3 100644 --- a/src/main/resources/messages_eu_ES.properties +++ b/src/main/resources/messages_eu_ES.properties @@ -79,6 +79,8 @@ info=Info pro=Pro page=Page pages=Pages +loading=Loading... +addToDoc=Add to Document legal.privacy=Privacy Policy legal.terms=Terms and Conditions @@ -244,6 +246,7 @@ database.fileNullOrEmpty=File must not be null or empty database.failedImportFile=Failed Import File session.expired=Your session has expired. Please refresh the page and try again. +session.refreshPage=Refresh Page ############# # HOME-PAGE # @@ -748,6 +751,7 @@ certSign.showSig=Erakutsi sinadura certSign.reason=Arrazoia certSign.location=Kokalekua certSign.name=Izena +certSign.showLogo=Show Logo certSign.submit=Sinatu PDFa @@ -782,6 +786,9 @@ compare.highlightColor.2=Highlight Color 2: compare.document.1=1. dokumentua compare.document.2=2. dokumentua compare.submit=Konparatu +compare.complex.message=One or both of the provided documents are large files, accuracy of comparison may be reduced +compare.large.file.message=One or Both of the provided documents are too large to process +compare.no.text.message=One or both of the selected PDFs have no text content. Please choose PDFs with text for comparison. #BookToPDF BookToPDF.title=Books and Comics to PDF @@ -804,6 +811,11 @@ sign.draw=Marraztu sinadura sign.text=Testua sartzea sign.clear=Garbitu sign.add=Gehitu +sign.saved=Saved Signatures +sign.save=Save Signature +sign.personalSigs=Personal Signatures +sign.sharedSigs=Shared Signatures +sign.noSavedSigs=No saved signatures found #repair @@ -921,7 +933,14 @@ pdfOrganiser.placeholder=(e.g. 1,3,2 or 4-8,2,10-12 or 2n-1) multiTool.title=PDF erabilera anitzeko tresna multiTool.header=PDF erabilera anitzeko tresna multiTool.uploadPrompts=File Name - +multiTool.selectAll=Select All +multiTool.deselectAll=Deselect All +multiTool.selectPages=Page Select +multiTool.selectedPages=Selected Pages +multiTool.page=Page +multiTool.deleteSelected=Delete Selected +multiTool.downloadAll=Export +multiTool.downloadSelected=Export Selected #view pdf viewPdf.title=View PDF viewPdf.header=View PDF @@ -1220,5 +1239,3 @@ splitByChapters.desc.2=Bookmark Level: Choose the level of bookmarks to use for splitByChapters.desc.3=Include Metadata: If checked, the original PDF's metadata will be included in each split PDF. splitByChapters.desc.4=Allow Duplicates: If checked, allows multiple bookmarks on the same page to create separate PDFs. splitByChapters.submit=Split PDF - - diff --git a/src/main/resources/messages_fr_FR.properties b/src/main/resources/messages_fr_FR.properties index aca42d2b2..1c0be3f28 100644 --- a/src/main/resources/messages_fr_FR.properties +++ b/src/main/resources/messages_fr_FR.properties @@ -3,14 +3,14 @@ ########### # the direction that the language is written (ltr = left to right, rtl = right to left) language.direction=ltr -addPageNumbers.fontSize=Font Size -addPageNumbers.fontName=Font Name +addPageNumbers.fontSize=Taille de Police +addPageNumbers.fontName=Nom de la Police pdfPrompt=Sélectionnez le(s) PDF multiPdfPrompt=Sélectionnez les PDF multiPdfDropPrompt=Sélectionnez (ou glissez-déposez) tous les PDF dont vous avez besoin imgPrompt=Choisir une image genericSubmit=Envoyer -processTimeWarning=Attention, ce processus peut prendre jusqu’à une minute en fonction de la taille du fichier. +processTimeWarning=Attention, ce processus peut prendre jusqu'à une minute en fonction de la taille du fichier. pageOrderPrompt=Ordre des pages (entrez une liste de numéros de page séparés par des virgules ou des fonctions telles que 2n+1) : pageSelectionPrompt=Sélection des pages (entrez une liste de numéros de page séparés par des virgules ou des fonctions telles que 2n+1) : goToPage=Aller @@ -23,7 +23,7 @@ close=Fermer filesSelected=fichiers sélectionnés noFavourites=Aucun favori ajouté downloadComplete=Téléchargement terminé -bored=Marre d’attendre ? +bored=Marre d'attendre ? alphabet=Alphabet downloadPdf=Télécharger le PDF text=Texte @@ -34,9 +34,9 @@ sizes.small=Petit sizes.medium=Moyen sizes.large=Grand sizes.x-large=Très grand -error.pdfPassword=Le document PDF est protégé par un mot de passe qui n’a pas été fourni ou était incorrect +error.pdfPassword=Le document PDF est protégé par un mot de passe qui n'a pas été fourni ou était incorrect delete=Supprimer -username=Nom d’utilisateur +username=Nom d'utilisateur password=Mot de passe welcome=Bienvenue property=Propriété @@ -54,37 +54,39 @@ changedCredsMessage=Les identifiants ont été mis à jour ! notAuthenticatedMessage=Utilisateur non authentifié. userNotFoundMessage=Utilisateur non trouvé. incorrectPasswordMessage=Le mot de passe actuel est incorrect. -usernameExistsMessage=Le nouveau nom d’utilisateur existe déjà. -invalidUsernameMessage=Nom d’utilisateur invalide, le nom d’utilisateur ne peut contenir que des lettres, des chiffres et les caractères spéciaux suivants @._+- ou doit être une adresse e-mail valide. -invalidPasswordMessage=The password must not be empty and must not have spaces at the beginning or end. -confirmPasswordErrorMessage=New Password and Confirm New Password must match. -deleteCurrentUserMessage=Impossible de supprimer l’utilisateur actuellement connecté. -deleteUsernameExistsMessage=Le nom d’utilisateur n’existe pas et ne peut pas être supprimé. +usernameExistsMessage=Le nouveau nom d'utilisateur existe déjà. +invalidUsernameMessage=Nom d'utilisateur invalide, le nom d'utilisateur ne peut contenir que des lettres, des chiffres et les caractères spéciaux suivants @._+- ou doit être une adresse e-mail valide. +invalidPasswordMessage=Le mot de passe ne peut pas être vide et ne doit pas contenir d'espaces au début ou en fin. +confirmPasswordErrorMessage=Nouveau Mot de passe et Confirmer le Nouveau Mot de passe doivent correspondre. +deleteCurrentUserMessage=Impossible de supprimer l'utilisateur actuellement connecté. +deleteUsernameExistsMessage=Le nom d'utilisateur n'existe pas et ne peut pas être supprimé. downgradeCurrentUserMessage=Impossible de rétrograder le rôle de l'utilisateur actuel. -disabledCurrentUserMessage=The current user cannot be disabled +disabledCurrentUserMessage=L'utilisateur actuel ne peut pas être désactivé downgradeCurrentUserLongMessage=Impossible de rétrograder le rôle de l'utilisateur actuel. Par conséquent, l'utilisateur actuel ne sera pas affiché. userAlreadyExistsOAuthMessage=L'utilisateur existe déjà en tant qu'utilisateur OAuth2. userAlreadyExistsWebMessage=L'utilisateur existe déjà en tant qu'utilisateur Web. error=Erreur oops=Oups ! help=Aide -goHomepage=Aller à la page d’accueil +goHomepage=Aller à la page d'accueil joinDiscord=Rejoignez notre serveur Discord seeDockerHub=Consulter le Docker Hub visitGithub=Visiter le dépôt Github donate=Faire un don color=Couleur -sponsor=Sponsor -info=Info +sponsor=Sponsoriser +info=Informations pro=Pro page=Page pages=Pages +loading=Chargement... +addToDoc=Ajouter au Document -legal.privacy=Privacy Policy -legal.terms=Terms and Conditions -legal.accessibility=Accessibility -legal.cookie=Cookie Policy -legal.impressum=Impressum +legal.privacy=Politique de Confidentialité +legal.terms=Conditions Générales +legal.accessibility=Accessibilité +legal.cookie=Politique des Cookies +legal.impressum=Mentions Légales ############### # Pipeline # @@ -96,7 +98,7 @@ pipeline.defaultOption=Personnaliser pipeline.submitButton=Soumettre pipeline.help=Aide Pipeline pipeline.scanHelp=Aide analyse de dossier -pipeline.deletePrompt=Are you sure you want to delete pipeline +pipeline.deletePrompt=Êtes-vous sûr de vouloir supprimer le pipeline ? ###################### # Pipeline Options # @@ -107,28 +109,28 @@ pipelineOptions.saveSettings=Sauvegarder la configuration pipelineOptions.pipelineNamePrompt=Entrez ici le nom du pipeline pipelineOptions.selectOperation=Sélectionner une opération pipelineOptions.addOperationButton=Ajouter une opération -pipelineOptions.pipelineHeader=Pipeline: +pipelineOptions.pipelineHeader=Pipeline : pipelineOptions.saveButton=Télécharger pipelineOptions.validateButton=Valider ######################## # ENTERPRISE EDITION # ######################## -enterpriseEdition.button=Upgrade to Pro -enterpriseEdition.warning=This feature is only available to Pro users. -enterpriseEdition.yamlAdvert=Stirling PDF Pro supports YAML configuration files and other SSO features. -enterpriseEdition.ssoAdvert=Looking for more user management features? Check out Stirling PDF Pro +enterpriseEdition.button=Passer à Pro +enterpriseEdition.warning=Cette fonctionnalité est uniquement disponible pour les utilisateurs Pro. +enterpriseEdition.yamlAdvert=Stirling PDF Pro prend en charge les fichiers de configuration YAML et d'autres fonctionnalités SSO. +enterpriseEdition.ssoAdvert=Vous cherchez plus de fonctionnalités de gestion des utilisateurs ? Découvrez Stirling PDF Pro ################# # Analytics # ################# -analytics.title=Do you want make Stirling PDF better? -analytics.paragraph1=Stirling PDF has opt in analytics to help us improve the product. We do not track any personal information or file contents. -analytics.paragraph2=Please consider enabling analytics to help Stirling-PDF grow and to allow us to understand our users better. -analytics.enable=Enable analytics -analytics.disable=Disable analytics -analytics.settings=You can change the settings for analytics in the config/settings.yml file +analytics.title=Souhaitez-vous améliorer Stirling PDF ? +analytics.paragraph1=Stirling PDF utilise des analyses volontaires pour nous aider à améliorer le produit. Nous ne suivons aucune information personnelle ni le contenu des fichiers. +analytics.paragraph2=Veuillez envisager d'activer les analyses pour aider Stirling-PDF à se développer et pour nous permettre de mieux comprendre nos utilisateurs. +analytics.enable=Activer les analyses +analytics.disable=Désactiver les analyses +analytics.settings=Vous pouvez modifier les paramètres des analyses dans le fichier config/settings.yml ############# # NAVBAR # @@ -153,8 +155,8 @@ navbar.sections.popular=Populaire settings.title=Paramètres settings.update=Mise à jour disponible settings.updateAvailable={0} est la version actuellement installée. Une nouvelle version ({1}) est disponible. -settings.appVersion=Version de l’application : -settings.downloadOption.title=Choisissez l’option de téléchargement (pour les téléchargements à fichier unique non ZIP) : +settings.appVersion=Version de l'application : +settings.downloadOption.title=Choisissez l'option de téléchargement (pour les téléchargements à fichier unique non ZIP) : settings.downloadOption.1=Ouvrir dans la même fenêtre settings.downloadOption.2=Ouvrir dans une nouvelle fenêtre settings.downloadOption.3=Télécharger le fichier @@ -168,7 +170,7 @@ settings.cacheInputs.help=Permet de stocker les entrées précédemment utilisé changeCreds.title=Modifiez vos identifiants changeCreds.header=Mettez à jour vos identifiants de connexion changeCreds.changePassword=Vous utilisez les identifiants de connexion par défaut. Veuillez saisir un nouveau mot de passe -changeCreds.newUsername=Nouveau nom d’utilisateur +changeCreds.newUsername=Nouveau nom d'utilisateur changeCreds.oldPassword=Mot de passe actuel changeCreds.newPassword=Nouveau mot de passe changeCreds.confirmNewPassword=Confirmer le nouveau mot de passe @@ -178,10 +180,10 @@ changeCreds.submit=Soumettre les modifications account.title=Paramètres du compte account.accountSettings=Paramètres du compte -account.adminSettings=Paramètres d’administration – Voir et ajouter des utilisateurs +account.adminSettings=Paramètres d'administration – Voir et ajouter des utilisateurs account.userControlSettings=Contrôle des paramètres des utilisateurs -account.changeUsername=Modifier le nom d’utilisateur -account.newUsername=Nouveau nom d’utilisateur +account.changeUsername=Modifier le nom d'utilisateur +account.newUsername=Nouveau nom d'utilisateur account.password=Mot de passe de confirmation account.oldPassword=Ancien mot de passe account.newPassword=Nouveau mot de passe @@ -210,11 +212,11 @@ adminUserSettings.roles=Rôles adminUserSettings.role=Rôle adminUserSettings.actions=Actions adminUserSettings.apiUser=Utilisateur API limité -adminUserSettings.extraApiUser=Utilisateur limité supplémentaire de l’API +adminUserSettings.extraApiUser=Utilisateur limité supplémentaire de l'API adminUserSettings.webOnlyUser=Utilisateur Web uniquement adminUserSettings.demoUser=Demo User (Paramètres par défaut) adminUserSettings.internalApiUser=Utilisateur de l'API interne -adminUserSettings.forceChange=Forcer l’utilisateur à changer son nom d’utilisateur/mot de passe lors de la connexion +adminUserSettings.forceChange=Forcer l'utilisateur à changer son nom d'utilisateur/mot de passe lors de la connexion adminUserSettings.submit=Ajouter adminUserSettings.changeUserRole=Changer le rôle de l'utilisateur adminUserSettings.authenticated=Authentifié @@ -227,23 +229,24 @@ adminUserSettings.totalUsers=Utilisateurs au total : adminUserSettings.lastRequest=Dernière requête -database.title=Database Import/Export -database.header=Database Import/Export -database.fileName=File Name -database.creationDate=Creation Date -database.fileSize=File Size -database.deleteBackupFile=Delete Backup File -database.importBackupFile=Import Backup File -database.downloadBackupFile=Download Backup File -database.info_1=When importing data, it is crucial to ensure the correct structure. If you are unsure of what you are doing, seek advice and support from a professional. An error in the structure can cause application malfunctions, up to and including the complete inability to run the application. -database.info_2=The file name does not matter when uploading. It will be renamed afterward to follow the format backup_user_yyyyMMddHHmm.sql, ensuring a consistent naming convention. -database.submit=Import Backup -database.importIntoDatabaseSuccessed=Import into database successed +database.title=Import/Export de la Base de Données +database.header=Import/Export de la Base de Données +database.fileName=Nom du Fichier +database.creationDate=Date de Création +database.fileSize=Taille du Fichier +database.deleteBackupFile=Supprimer le fichier de sauvegarde +database.importBackupFile=Importer le fichier de sauvegarde +database.downloadBackupFile=Télécharger le fichier de sauvegarde +database.info_1=Lors de l'importation des données, il est crucial de garantir la structure correcte. Si vous n'êtes pas sûr de ce que vous faites, sollicitez un avis et un soutien d'un professionnel. Une erreur dans la structure peut entraîner des dysfonctionnements de l'application, allant jusqu'à l'incapacité totale d'exécuter l'application. +database.info_2=Le nom du fichier ne fait pas de différence lors de l'upload. Il sera renommé ultérieurement selon le format backup_user_yyyyMMddHHmm.sql, assurant ainsi une convention de nommage cohérente. +database.submit=Importer la sauvegarde +database.importIntoDatabaseSuccessed=Importation dans la base de données réussie database.fileNotFound=File not Found -database.fileNullOrEmpty=File must not be null or empty +database.fileNullOrEmpty=Fichier ne peut pas être null ou vide database.failedImportFile=Failed Import File session.expired=Votre session a expiré. Veuillez recharger la page et réessayer. +session.refreshPage=Refresh Page ############# # HOME-PAGE # @@ -282,7 +285,7 @@ home.pdfToImage.desc=Convertissez un PDF en image (PNG, JPEG, GIF). pdfToImage.tags=conversion,img,jpg,image,photo home.pdfOrganiser.title=Organiser -home.pdfOrganiser.desc=Supprimez ou réorganisez les pages dans n’importe quel ordre. +home.pdfOrganiser.desc=Supprimez ou réorganisez les pages dans n'importe quel ordre. pdfOrganiser.tags=organiser,recto-verso,duplex,even,odd,sort,move @@ -292,7 +295,7 @@ addImage.tags=img,jpg,image,photo home.watermark.title=Ajouter un filigrane home.watermark.desc=Ajoutez un filigrane personnalisé à votre PDF. -watermark.tags=texte,filigrane,label,propriété,droit d’auteur,marque déposée,img,jpg,image,photo,copyright,trademark +watermark.tags=texte,filigrane,label,propriété,droit d'auteur,marque déposée,img,jpg,image,photo,copyright,trademark home.permissions.title=Modifier les permissions home.permissions.desc=Modifiez les permissions de votre PDF. @@ -321,16 +324,16 @@ home.changeMetadata.desc=Modifiez, supprimez ou ajoutez des métadonnées à un changeMetadata.tags=métadonnées,titre,auteur,date,création,heure,éditeur,statistiques,title,author,date,creation,time,publisher,producer,stats,metadata home.fileToPDF.title=Fichier en PDF -home.fileToPDF.desc=Convertissez presque n’importe quel fichier en PDF (DOCX, PNG, XLS, PPT, TXT, etc.). +home.fileToPDF.desc=Convertissez presque n'importe quel fichier en PDF (DOCX, PNG, XLS, PPT, TXT, etc.). fileToPDF.tags=convertion,transformation,format,document,image,slide,texte,conversion,office,docs,word,excel,powerpoint home.ocr.title=OCR / Nettoyage des numérisations -home.ocr.desc=Utilisez l’OCR pour analyser et détecter le texte des images d’un PDF et le rajouter en tant que tel. +home.ocr.desc=Utilisez l'OCR pour analyser et détecter le texte des images d'un PDF et le rajouter en tant que tel. ocr.tags=ocr,reconnaissance,texte,image,numérisation,scan,read,identify,detection,editable home.extractImages.title=Extraire les images -home.extractImages.desc=Extrayez toutes les images d’un PDF et enregistrez-les dans un ZIP. +home.extractImages.desc=Extrayez toutes les images d'un PDF et enregistrez-les dans un ZIP. extractImages.tags=image,photo,save,archive,zip,capture,grab home.pdfToPDFA.title=PDF en PDF/A @@ -339,7 +342,7 @@ pdfToPDFA.tags=convertion,archive,long-term,standard,conversion,storage,préserv home.PDFToWord.title=PDF en Word home.PDFToWord.desc=Convertissez un PDF en Word (DOC, DOCX et ODT). -PDFToWord.tags=doc,docx,odt,word,transformation,format,conversion,office,microsoft,docfile +PDFToWord.tags=doc, docx, odt, word, transformation, format, conversion, office, microsoft, docfile home.PDFToPresentation.title=PDF en formats de présentation home.PDFToPresentation.desc=Convertissez un PDF en format de présentation (PPT, PPTX et ODP). @@ -347,7 +350,7 @@ PDFToPresentation.tags=présentation,slides,show,office,microsoft home.PDFToText.title=PDF en RTF (texte) home.PDFToText.desc=Convertissez un PDF au format RTF (texte). -PDFToText.tags=richformat,richtextformat,rich text format +PDFToText.tags=format riche, format de texte riche, format de texte enrichi home.PDFToHTML.title=PDF en HTML home.PDFToHTML.desc=Convertissez un PDF au format HTML. @@ -359,7 +362,7 @@ home.PDFToXML.desc=Convertissez un PDF au format XML. PDFToXML.tags=xml,extraction de données,contenu structuré,interopérabilité,data-extraction,structured-content,interop,transformation,convert home.ScannerImageSplit.title=Diviser les photos numérisées -home.ScannerImageSplit.desc=Divisez plusieurs photos à partir d’une photo ou d’un PDF. +home.ScannerImageSplit.desc=Divisez plusieurs photos à partir d'une photo ou d'un PDF. ScannerImageSplit.tags=diviser,détecter automatiquement,numériser,separate,auto-detect,scans,multi-photo,organize home.sign.title=Signer @@ -367,7 +370,7 @@ home.sign.desc=Ajoutez une signature au PDF avec un dessin, du texte ou une imag sign.tags=signer,authorize,initials,drawn-signature,text-sign,image-signature home.flatten.title=Rendre inerte -home.flatten.desc=Supprimez tous les éléments et formulaires interactifs d’un PDF. +home.flatten.desc=Supprimez tous les éléments et formulaires interactifs d'un PDF. flatten.tags=inerte,static,deactivate,non-interactive,streamline home.repair.title=Réparer @@ -375,11 +378,11 @@ home.repair.desc=Essayez de réparer un PDF corrompu ou cassé. repair.tags=réparer,restaurer,corriger,récupérer,fix,restore,correction,recover home.removeBlanks.title=Supprimer les pages vierges -home.removeBlanks.desc=Détectez et supprimez les pages vierges d’un PDF. +home.removeBlanks.desc=Détectez et supprimez les pages vierges d'un PDF. removeBlanks.tags=pages vierges,supprimer,nettoyer,cleanup,streamline,non-content,organize home.removeAnnotations.title=Supprimer les annotations -home.removeAnnotations.desc=Supprimer tous les commentaires/annotations d’un PDF. +home.removeAnnotations.desc=Supprimer tous les commentaires/annotations d'un PDF. removeAnnotations.tags=commentaires,supprimer,annotations,highlight,notes,markup,remove home.compare.title=Comparer @@ -395,11 +398,11 @@ home.removeCertSign.desc=Supprimez la signature par certificat d'un PDF removeCertSign.tags=signer,chiffrer,certificat,authenticate,PEM,P12,official,decrypt home.pageLayout.title=Fusionner des pages -home.pageLayout.desc=Fusionnez plusieurs pages d’un PDF en une seule. +home.pageLayout.desc=Fusionnez plusieurs pages d'un PDF en une seule. pageLayout.tags=fusionner,merge,composite,single-view,organize -home.scalePages.title=Ajuster l’échelle ou la taille -home.scalePages.desc=Modifiez la taille ou l’échelle d’une page et/ou de son contenu. +home.scalePages.title=Ajuster l'échelle ou la taille +home.scalePages.desc=Modifiez la taille ou l'échelle d'une page et/ou de son contenu. scalePages.tags=ajuster,redimensionner,resize,modify,dimension,adapt home.pipeline.title=Pipeline @@ -415,7 +418,7 @@ home.auto-rename.desc=Renommez automatiquement un fichier PDF en fonction de son auto-rename.tags=renommer,détection automatique,réétiqueter,auto-detect,header-based,organize,relabel home.adjust-contrast.title=Ajuster les couleurs -home.adjust-contrast.desc=Ajustez le contraste, la saturation et la luminosité d’un PDF. +home.adjust-contrast.desc=Ajustez le contraste, la saturation et la luminosité d'un PDF. adjust-contrast.tags=ajuster,couleurs,amélioration,color-correction,tune,modify,enhance home.crop.title=Redimensionner @@ -431,16 +434,16 @@ home.sanitizePdf.desc=Supprimez les scripts et autres éléments des PDF. sanitizePdf.tags=assainir,sécurisé,clean,secure,safe,remove-threats home.URLToPDF.title=URL en PDF -home.URLToPDF.desc=Convertissez n’importe quelle URL http(s) en PDF. +home.URLToPDF.desc=Convertissez n'importe quelle URL http(s) en PDF. URLToPDF.tags=pdf,contenu Web,save-page,web-to-doc,archive home.HTMLToPDF.title=HTML en PDF -home.HTMLToPDF.desc=Convertissez n’importe quel fichier HTML ou ZIP en PDF. +home.HTMLToPDF.desc=Convertissez n'importe quel fichier HTML ou ZIP en PDF. HTMLToPDF.tags=html,markup,contenu Web,transformation,convert home.MarkdownToPDF.title=Markdown en PDF -home.MarkdownToPDF.desc=Convertissez n’importe quel fichier Markdown en PDF. +home.MarkdownToPDF.desc=Convertissez n'importe quel fichier Markdown en PDF. MarkdownToPDF.tags=markdown,markup,contenu Web,transformation,convert @@ -464,29 +467,29 @@ home.showJS.desc=Recherche et affiche tout JavaScript injecté dans un PDF. showJS.tags=JS home.autoRedact.title=Caviarder automatiquement -home.autoRedact.desc=Caviardez automatiquement les informations sensibles d’un PDF. +home.autoRedact.desc=Caviardez automatiquement les informations sensibles d'un PDF. autoRedact.tags=caviarder,redact,auto home.tableExtraxt.title=PDF en CSV -home.tableExtraxt.desc=Extrait les tableaux d’un PDF et les transforme en CSV. -tableExtraxt.tags=CSV,Table Extraction,extract,convert +home.tableExtraxt.desc=Extrait les tableaux d'un PDF et les transforme en CSV. +tableExtraxt.tags=CSV, Extraction de table, extraction, conversion home.autoSizeSplitPDF.title=Séparer automatiquement par taille/nombre home.autoSizeSplitPDF.desc=Séparer un PDF unique en plusieurs documents en fonction de la taille, du nombre de pages ou du nombre de documents. -autoSizeSplitPDF.tags=pdf,split,document,organization +autoSizeSplitPDF.tags=pdf, découpage, document, organisation home.overlay-pdfs.title=Incrustation de PDF -home.overlay-pdfs.desc=Incrustation d’un PDF sur un autre PDF. +home.overlay-pdfs.desc=Incrustation d'un PDF sur un autre PDF. overlay-pdfs.tags=Overlay,incrustation home.split-by-sections.title=Séparer un PDF en sections -home.split-by-sections.desc=Diviser chaque page d’un PDF en sections horizontales/verticales plus petites. +home.split-by-sections.desc=Diviser chaque page d'un PDF en sections horizontales/verticales plus petites. split-by-sections.tags=Sections,Diviser,Section Split, Divide, Customize home.AddStampRequest.title=Ajouter un tampon sur un PDF -home.AddStampRequest.desc=Ajouter un texte ou l’image d’un tampon à un emplacement défini. +home.AddStampRequest.desc=Ajouter un texte ou l'image d'un tampon à un emplacement défini. AddStampRequest.tags=Tampon,Ajouter,Stamp,Add image,center image,Watermark,PDF,Embed,Customize @@ -508,23 +511,23 @@ home.splitPdfByChapters.desc=Séparez un PDF en fichiers multiples en fonction d splitPdfByChapters.tags=séparer,chapitres,split,chapters,bookmarks,organize #replace-invert-color -replace-color.title=Replace-Invert-Color -replace-color.header=Replace-Invert Color PDF -home.replaceColorPdf.title=Replace and Invert Color -home.replaceColorPdf.desc=Replace color for text and background in PDF and invert full color of pdf to reduce file size -replaceColorPdf.tags=Replace Color,Page operations,Back end,server side -replace-color.selectText.1=Replace or Invert color Options -replace-color.selectText.2=Default(Default high contrast colors) -replace-color.selectText.3=Custom(Customized colors) -replace-color.selectText.4=Full-Invert(Invert all colors) -replace-color.selectText.5=High contrast color options -replace-color.selectText.6=white text on black background -replace-color.selectText.7=Black text on white background -replace-color.selectText.8=Yellow text on black background -replace-color.selectText.9=Green text on black background -replace-color.selectText.10=Choose text Color -replace-color.selectText.11=Choose background Color -replace-color.submit=Replace +replace-color.title=Remplacer-Inverser-Couleur +replace-color.header=Remplacer-Inverser Couleur PDF +home.replaceColorPdf.title=Remplacer et Inverser Couleur +home.replaceColorPdf.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 +replaceColorPdf.tags=Remplacer Couleur,Opérations de Page,Back-end,Côté serveur +replace-color.selectText.1=Options de Remplacement ou d'Inversion de Couleur +replace-color.selectText.2=Par défaut (Couleurs à fort contraste par défaut) +replace-color.selectText.3=Personnalisé (Couleurs personnalisées) +replace-color.selectText.4=Inversion complète (Inverser toutes les couleurs) +replace-color.selectText.5=Options de couleur à fort contraste +replace-color.selectText.6=Texte blanc sur fond noir +replace-color.selectText.7=Texte noir sur fond blanc +replace-color.selectText.8=Texte jaune sur fond noir +replace-color.selectText.9=Texte vert sur fond noir +replace-color.selectText.10=Choisir la couleur du texte +replace-color.selectText.11=Choisir la couleur de l'arrière-plan +replace-color.submit=Remplacer @@ -538,22 +541,22 @@ login.title=Connexion login.header=Connexion login.signin=Connexion login.rememberme=Se souvenir de moi -login.invalid=Nom d’utilisateur ou mot de passe invalide. +login.invalid=Nom d'utilisateur ou mot de passe invalide. login.locked=Votre compte a été verrouillé. login.signinTitle=Veuillez vous connecter login.ssoSignIn=Se connecter via l'authentification unique login.oauth2AutoCreateDisabled=OAUTH2 Création automatique d'utilisateur désactivée -login.oauth2AdminBlockedUser=Registration or logging in of non-registered users is currently blocked. Please contact the administrator. +login.oauth2AdminBlockedUser=La création ou l'authentification d'utilisateurs non enregistrés est actuellement bloquée. Veuillez contacter l'administrateur. login.oauth2RequestNotFound=Demande d'autorisation introuvable login.oauth2InvalidUserInfoResponse=Réponse contenant les informations de l'utilisateur est invalide login.oauth2invalidRequest=Requête invalide login.oauth2AccessDenied=Accès refusé login.oauth2InvalidTokenResponse=Réponse contenant le jeton est invalide login.oauth2InvalidIdToken=Jeton d'identification invalide -login.userIsDisabled=User is deactivated, login is currently blocked with this username. Please contact the administrator. -login.alreadyLoggedIn=You are already logged in to -login.alreadyLoggedIn2=devices. Please log out of the devices and try again. -login.toManySessions=You have too many active sessions +login.userIsDisabled=L'utilisateur est désactivé, la connexion est actuellement bloquée avec ce nom d'utilisateur. Veuillez contacter l'administrateur. +login.alreadyLoggedIn=Vous êtes déjà connecté sur +login.alreadyLoggedIn2=appareils. Veuillez vous déconnecter des appareils et réessayer. +login.toManySessions=Vous avez trop de sessions actives. #auto-redact autoRedact.title=Caviarder automatiquement @@ -585,7 +588,7 @@ pdfToSinglePage.submit=Convertir en une seule page pageExtracter.title=Extraire des pages pageExtracter.header=Extraire des pages pageExtracter.submit=Extraire -pageExtracter.placeholder=(e.g. 1,2,8 or 4,7,12-16 or 2n-1) +pageExtracter.placeholder=(par exemple : 1,2,8 ou 4,7,12-16 ou 2n-1) #getPdfInfo @@ -617,15 +620,15 @@ HTMLToPDF.header=HTML en PDF HTMLToPDF.help=Accepte les fichiers HTML et les ZIP contenant du HTML, du CSS, des images, etc. (requis). HTMLToPDF.submit=Convertir HTMLToPDF.credit=Utilise WeasyPrint. -HTMLToPDF.zoom=Niveau de zoom pour l’affichage du site web. +HTMLToPDF.zoom=Niveau de zoom pour l'affichage du site web. HTMLToPDF.pageWidth=Largeur de la page en centimètres. (Vide par défaut) HTMLToPDF.pageHeight=Hauteur de la page en centimètres. (Vide par défaut) HTMLToPDF.marginTop=Marge supérieure de la page en millimètres. (Vide par défaut) HTMLToPDF.marginBottom=Marge inférieure de la page en millimètres. (Vide par défaut) HTMLToPDF.marginLeft=Marge gauche de la page en millimètres. (Vide par défaut) HTMLToPDF.marginRight=Marge droite de la page en millimètres. (Vide par défaut) -HTMLToPDF.printBackground=Restituer l’image de fond des sites web. -HTMLToPDF.defaultHeader=Activer l’entête par défaut (Nom et numéro de page) +HTMLToPDF.printBackground=Restituer l'image de fond des sites web. +HTMLToPDF.defaultHeader=Activer l'entête par défaut (Nom et numéro de page) HTMLToPDF.cssMediaType=Modifier le type de média CSS de la page. HTMLToPDF.none=Aucun HTMLToPDF.print=Imprimer @@ -703,7 +706,7 @@ autoSplitPDF.header=Séparer automatiquement les pages autoSplitPDF.description=Imprimez, insérez, numérisez, téléchargez et laissez-nous séparer automatiquement vos documents. Aucun travail de tri manuel nécessaire. autoSplitPDF.selectText.1=Imprimez des feuilles de séparation ci-dessous (le mode noir et blanc convient). autoSplitPDF.selectText.2=Numérisez tous vos documents en une seule fois en insérant les feuilles intercalaires entre eux. -autoSplitPDF.selectText.3=Téléchargez le fichier PDF numérisé et laissez Stirling PDF s’occuper du reste. +autoSplitPDF.selectText.3=Téléchargez le fichier PDF numérisé et laissez Stirling PDF s'occuper du reste. autoSplitPDF.selectText.4=Les feuilles de séparation sont automatiquement détectées et supprimées, garantissant un document final soigné. autoSplitPDF.formPrompt=PDF contenant des feuilles de séparation de Stirling PDF : autoSplitPDF.duplexMode=Mode recto-verso @@ -725,11 +728,11 @@ pageLayout.submit=Fusionner #scalePages -scalePages.title=Ajuster la taille ou l’échelle -scalePages.header=Ajuster la taille ou l’échelle -scalePages.pageSize=Taille d’une page du document -scalePages.keepPageSize=Original Size -scalePages.scaleFactor=Niveau de zoom (recadrage) d’une page +scalePages.title=Ajuster la taille ou l'échelle +scalePages.header=Ajuster la taille ou l'échelle +scalePages.pageSize=Taille d'une page du document +scalePages.keepPageSize=Taille d'origine +scalePages.scaleFactor=Niveau de zoom (recadrage) d'une page scalePages.submit=Ajuster @@ -737,10 +740,10 @@ scalePages.submit=Ajuster certSign.title=Signer avec un certificat certSign.header=Signer avec un certificat (Travail en cours) certSign.selectPDF=PDF à signer -certSign.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. +certSign.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. certSign.selectKey=Fichier de clé privée (format PKCS#8, peut être .pem ou .der) certSign.selectCert=Fichier de certificat (format X.509, peut être .pem ou .der) -certSign.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) +certSign.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) certSign.selectJKS=Sélectionner votre fichier Java Keystore File (.jks or .keystore): certSign.certType=Type de certificat certSign.password=Mot de passe keystore ou clé privée le cas échéant @@ -748,14 +751,15 @@ certSign.showSig=Afficher la signature certSign.reason=Raison certSign.location=Emplacement certSign.name=Nom +certSign.showLogo=Afficher le logo certSign.submit=Signer #removeCertSign -removeCertSign.title=Remove Certificate Signature -removeCertSign.header=Remove the digital certificate from the PDF -removeCertSign.selectPDF=Select a PDF file: -removeCertSign.submit=Remove Signature +removeCertSign.title=Supprimer la Signature de Certificat +removeCertSign.header=Supprimer le certificat numérique du PDF +removeCertSign.selectPDF=Sélectionnez un fichier PDF : +removeCertSign.submit=Supprimer la Signature #removeBlanks @@ -777,11 +781,14 @@ removeAnnotations.submit=Supprimer #compare compare.title=Comparer compare.header=Comparer -compare.highlightColor.1=Highlight Color 1: -compare.highlightColor.2=Highlight Color 2: +compare.highlightColor.1=Couleur de mise en évidence 1 : +compare.highlightColor.2=Couleur de mise en évidence 2 : compare.document.1=Document 1 compare.document.2=Document 2 compare.submit=Comparer +compare.complex.message=Un ou les deux documents fournis sont des fichiers volumineux, l'exactitude de la comparaison peut être réduite +compare.large.file.message=Un ou les deux documents fournis sont trop volumineux pour être traités +compare.no.text.message=L'un ou les deux documents PDF sélectionnés ne contiennent aucun contenu textuel. Veuillez choisir des documents PDF avec du texte pour la comparaison. #BookToPDF BookToPDF.title=Livres et BD vers PDF @@ -804,6 +811,11 @@ sign.draw=Dessiner une signature sign.text=Saisir de texte sign.clear=Effacer sign.add=Ajouter +sign.saved=Saved Signatures +sign.save=Enregistrer le sceau +sign.personalSigs=Sceaux personnels +sign.sharedSigs=Sceaux partagés +sign.noSavedSigs=Aucun sceau enregistré trouvé #repair @@ -821,16 +833,16 @@ flatten.submit=Rendre inerte #ScannerImageSplit ScannerImageSplit.selectText.1=Seuil de rotation -ScannerImageSplit.selectText.2=Définit l’angle absolu minimum requis pour la rotation de l’image (par défaut : 10). +ScannerImageSplit.selectText.2=Définit l'angle absolu minimum requis pour la rotation de l'image (par défaut : 10). ScannerImageSplit.selectText.3=Tolérance -ScannerImageSplit.selectText.4=Détermine la plage de variation de couleur autour de la couleur d’arrière-plan estimée (par défaut : 20). +ScannerImageSplit.selectText.4=Détermine la plage de variation de couleur autour de la couleur d'arrière-plan estimée (par défaut : 20). ScannerImageSplit.selectText.5=Surface minimale ScannerImageSplit.selectText.6=Définit la surface minimale pour une photo (par défaut : 8 000). ScannerImageSplit.selectText.7=Surface de contour minimale ScannerImageSplit.selectText.8=Définit la surface de contour minimale pour une photo (par défaut : 500). ScannerImageSplit.selectText.9=Taille de la bordure ScannerImageSplit.selectText.10=Définit la taille de la bordure ajoutée et supprimée pour éviter les bordures blanches dans la sortie (par défaut : 1). -ScannerImageSplit.info=Python is not installed. It is required to run. +ScannerImageSplit.info=Python n'est pas installé. Il est nécessaire pour le fonctionnement. #OCR @@ -839,25 +851,25 @@ ocr.header=OCR (Reconnaissance optique de caractères) / Nettoyage des numérisa ocr.selectText.1=Langues à détecter dans le PDF (celles listées sont celles actuellement détectées) ocr.selectText.2=Produire un fichier texte contenant le texte détecté à côté du PDF ocr.selectText.3=Corriger les pages qui ont été numérisées à un angle oblique en les remettant en place -ocr.selectText.4=Nettoyer la page afin qu’il soit moins probable que l’OCR trouve du texte dans le bruit de fond, sans modifier la sortie -ocr.selectText.5=Nettoyer la page afin qu’il soit moins probable que l’OCR trouve du texte dans le bruit de fond, en modifiant la sortie -ocr.selectText.6=Ignorer les pages contenant du texte interactif, n’analyser que les pages qui sont des images -ocr.selectText.7=Forcer l’OCR, analyser chaque page et supprimer tous les éléments de texte d’origine +ocr.selectText.4=Nettoyer la page afin qu'il soit moins probable que l'OCR trouve du texte dans le bruit de fond, sans modifier la sortie +ocr.selectText.5=Nettoyer la page afin qu'il soit moins probable que l'OCR trouve du texte dans le bruit de fond, en modifiant la sortie +ocr.selectText.6=Ignorer les pages contenant du texte interactif, n'analyser que les pages qui sont des images +ocr.selectText.7=Forcer l'OCR, analyser chaque page et supprimer tous les éléments de texte d'origine ocr.selectText.8=Normal (génère une erreur si le PDF contient du texte) ocr.selectText.9=Paramètres additionnels ocr.selectText.10=Mode OCR -ocr.selectText.11=Supprimer les images après l’OCR (Supprime TOUTES les images, utile uniquement si elles font partie de l’étape de conversion) +ocr.selectText.11=Supprimer les images après l'OCR (Supprime TOUTES les images, utile uniquement si elles font partie de l'étape de conversion) ocr.selectText.12=Type de rendu (avancé) -ocr.help=Veuillez lire cette documentation pour savoir comment utiliser l’OCR pour d’autres langues ou une utilisation hors Docker : -ocr.credit=Ce service utilise OCRmyPDF et Tesseract pour l’OCR. +ocr.help=Veuillez lire cette documentation pour savoir comment utiliser l'OCR pour d'autres langues ou une utilisation hors Docker : +ocr.credit=Ce service utilise OCRmyPDF et Tesseract pour l'OCR. ocr.submit=Traiter #extractImages extractImages.title=Extraire les images extractImages.header=Extraire les images -extractImages.selectText=Format d’image dans lequel convertir les images extraites -extractImages.allowDuplicates=Save duplicate images +extractImages.selectText=Format d'image dans lequel convertir les images extraites +extractImages.allowDuplicates=Enregistrer les images dupliquées extractImages.submit=Extraire @@ -872,10 +884,10 @@ fileToPDF.submit=Convertir #compress compress.title=Compresser un PDF -compress.header=Compresser un PDF (lorsque c’est possible!) -compress.credit=Ce service utilise Ghostscript pour la compression et l’optimisation des PDF. +compress.header=Compresser un PDF (lorsque c'est possible!) +compress.credit=Ce service utilise Ghostscript pour la compression et l'optimisation des PDF. compress.selectText.1=Mode manuel – de 1 à 4 -compress.selectText.2=Niveau d’optimisation +compress.selectText.2=Niveau d'optimisation compress.selectText.3=4 (terrible pour les images textuelles) compress.selectText.4=Mode automatique – ajuste automatiquement la qualité pour obtenir le PDF à la taille exacte compress.selectText.5=Taille PDF attendue (par exemple, 25 MB, 10,8 MB, 25 KB) @@ -895,7 +907,7 @@ merge.title=Fusionner merge.header=Fusionner plusieurs PDF merge.sortByName=Trier par nom merge.sortByDate=Trier par date -merge.removeCertSign=Remove digital signature in the merged file? +merge.removeCertSign=Supprimer la signature numérique dans le fichier fusionné ? merge.submit=Fusionner @@ -913,15 +925,22 @@ pdfOrganiser.mode.6=Partage impair-pair pdfOrganiser.mode.7=Supprimer le premier pdfOrganiser.mode.8=Supprimer le dernier pdfOrganiser.mode.9=Supprimer le premier et le dernier -pdfOrganiser.mode.10=Odd-Even Merge -pdfOrganiser.placeholder=(e.g. 1,3,2 or 4-8,2,10-12 or 2n-1) +pdfOrganiser.mode.10=Méger Impair-Pair +pdfOrganiser.placeholder=(par exemple 1,3,2 ou 4-8,2,10-12 ou 2n-1) #multiTool multiTool.title=Outil multifonction PDF multiTool.header=Outil multifonction PDF multiTool.uploadPrompts=Nom du fichier - +multiTool.selectAll=Select All +multiTool.deselectAll=Deselect All +multiTool.selectPages=Page Select +multiTool.selectedPages=Selected Pages +multiTool.page=Page +multiTool.deleteSelected=Delete Selected +multiTool.downloadAll=Export +multiTool.downloadSelected=Export Selected #view pdf viewPdf.title=Visualiser un PDF viewPdf.header=Visualiser un PDF @@ -931,7 +950,7 @@ pageRemover.title=Supprimer des pages pageRemover.header=Supprimer des pages pageRemover.pagesToDelete=Pages à supprimer (entrez une liste de numéros de pages séparés par des virgules) : pageRemover.submit=Supprimer les pages -pageRemover.placeholder=(e.g. 1,2,6 or 1-10,15-30) +pageRemover.placeholder=(par exemple 1,2,6 ou 1-10,15-30) #rotate @@ -960,9 +979,9 @@ split.submit=Diviser imageToPDF.title=Image en PDF imageToPDF.header=Image en PDF imageToPDF.submit=Convertir -imageToPDF.selectLabel=Options d’ajustement de l’image +imageToPDF.selectLabel=Options d'ajustement de l'image imageToPDF.fillPage=Remplir la page -imageToPDF.fitDocumentToImage=Ajuster la page à l’image +imageToPDF.fitDocumentToImage=Ajuster la page à l'image imageToPDF.maintainAspectRatio=Maintenir les proportions imageToPDF.selectText.2=Rotation automatique du PDF imageToPDF.selectText.3=Logique multi-fichiers (uniquement activée si vous travaillez avec plusieurs images) @@ -973,37 +992,37 @@ imageToPDF.selectText.5=Convertir en PDF séparés #pdfToImage pdfToImage.title=Image en PDF pdfToImage.header=Image en PDF -pdfToImage.selectText=Format d’image +pdfToImage.selectText=Format d'image pdfToImage.singleOrMultiple=Type de résultat pdfToImage.single=Une seule grande image pdfToImage.multi=Plusieurs images -pdfToImage.colorType=Type d’impression +pdfToImage.colorType=Type d'impression pdfToImage.color=Couleur pdfToImage.grey=Niveaux de gris pdfToImage.blackwhite=Noir et blanc (peut engendrer une perte de données !) pdfToImage.submit=Convertir -pdfToImage.info=Python is not installed. Required for WebP conversion. +pdfToImage.info=Python n’est pas installé. Nécessaire pour la conversion WebP. #addPassword addPassword.title=Ajouter un mot de passe addPassword.header=Ajouter un mot de passe addPassword.selectText.1=PDF à chiffrer -addPassword.selectText.2=Mot de passe de l’utilisateur +addPassword.selectText.2=Mot de passe de l'utilisateur addPassword.selectText.3=Longueur de la clé de chiffrement addPassword.selectText.4=Les valeurs plus élevées sont plus fortes, mais les valeurs plus faibles ont une meilleure compatibilité. addPassword.selectText.5=Autorisations à définir (utilisation recommandée avec le mot de passe du propriétaire) -addPassword.selectText.6=Empêcher l’assemblage du document -addPassword.selectText.7=Empêcher l’extraction de contenu -addPassword.selectText.8=Empêcher l’extraction pour l’accessibilité +addPassword.selectText.6=Empêcher l'assemblage du document +addPassword.selectText.7=Empêcher l'extraction de contenu +addPassword.selectText.8=Empêcher l'extraction pour l'accessibilité addPassword.selectText.9=Empêcher de remplir les formulaires addPassword.selectText.10=Empêcher la modification addPassword.selectText.11=Empêcher la modification des annotations -addPassword.selectText.12=Empêcher l’impression -addPassword.selectText.13=Empêcher l’impression des différents formats +addPassword.selectText.12=Empêcher l'impression +addPassword.selectText.13=Empêcher l'impression des différents formats addPassword.selectText.14=Mot de passe du propriétaire -addPassword.selectText.15=Restreint ce qui peut être fait avec le document une fois qu’il est ouvert (non pris en charge par tous les lecteurs). -addPassword.selectText.16=Restreint l’ouverture du document lui-même. +addPassword.selectText.15=Restreint ce qui peut être fait avec le document une fois qu'il est ouvert (non pris en charge par tous les lecteurs). +addPassword.selectText.16=Restreint l'ouverture du document lui-même. addPassword.submit=Chiffrer @@ -1019,9 +1038,9 @@ watermark.selectText.6=heightSpacer (espace entre chaque filigrane verticalement watermark.selectText.7=Opacité (de 0% à 100%) watermark.selectText.8=Type de filigrane watermark.selectText.9=Image du filigrane -watermark.selectText.10=Convert PDF to PDF-Image +watermark.selectText.10=Convertir le PDF en PDF-Image watermark.submit=Ajouter un filigrane -watermark.type.1=Text +watermark.type.1=Texte watermark.type.2=Image @@ -1031,14 +1050,14 @@ permissions.header=Modifier les permissions permissions.warning=Attention, pour que ces permissions soient immuables il est recommandé de les paramétrer avec un mot de passe via la page Ajouter un mot de passe. permissions.selectText.1=Sélectionnez le PDF permissions.selectText.2=Permissions à définir -permissions.selectText.3=Empêcher l’assemblage du document -permissions.selectText.4=Empêcher l’extraction de contenu -permissions.selectText.5=Empêcher l’extraction pour l’accessibilité +permissions.selectText.3=Empêcher l'assemblage du document +permissions.selectText.4=Empêcher l'extraction de contenu +permissions.selectText.5=Empêcher l'extraction pour l'accessibilité permissions.selectText.6=Empêcher de remplir les formulaires permissions.selectText.7=Empêcher la modification permissions.selectText.8=Empêcher la modification des annotations -permissions.selectText.9=Empêcher l’impression -permissions.selectText.10=Empêcher l’impression des différents formats +permissions.selectText.9=Empêcher l'impression +permissions.selectText.10=Empêcher l'impression des différents formats permissions.submit=Modifier @@ -1063,7 +1082,7 @@ changeMetadata.keywords=Mots clés changeMetadata.modDate=Date de modification (yyyy/MM/dd HH:mm:ss) changeMetadata.producer=Producteur changeMetadata.subject=Sujet -changeMetadata.trapped=Recouvrement (technique d’impression) +changeMetadata.trapped=Recouvrement (technique d'impression) changeMetadata.selectText.4=Autres métadonnées changeMetadata.selectText.5=Ajouter une entrée de métadonnées personnalisée changeMetadata.submit=Modifier @@ -1138,13 +1157,13 @@ split-by-size-or-count.submit=Séparer overlay-pdfs.header=Incrustation de PDF overlay-pdfs.baseFile.label=Sélectionner le fichier PDF de base overlay-pdfs.overlayFiles.label=Sélectionner les fichiers PDF à superposer -overlay-pdfs.mode.label=Sélectionner le mode d’incrustation +overlay-pdfs.mode.label=Sélectionner le mode d'incrustation overlay-pdfs.mode.sequential=Superposition séquentielle overlay-pdfs.mode.interleaved=Superposition entrelacée overlay-pdfs.mode.fixedRepeat=Superposition à répétition fixe overlay-pdfs.counts.label=Nombre de superpositions (pour le mode de répétition fixe) overlay-pdfs.counts.placeholder=Compteurs (séparés par des virgules, exemple : 2,3,1) -overlay-pdfs.position.label=Définir la position de l’incrustation +overlay-pdfs.position.label=Définir la position de l'incrustation overlay-pdfs.position.foreground=Premier plan overlay-pdfs.position.background=Arrière-plan overlay-pdfs.submit=Soumettre @@ -1178,47 +1197,45 @@ licenses.version=Version licenses.license=Licence #survey -survey.nav=Survey -survey.title=Stirling-PDF Survey -survey.description=Stirling-PDF has no tracking so we want to hear from our users to improve Stirling-PDF! -survey.changes=Stirling-PDF has changed since the last survey! To find out more please check our blog post here: -survey.changes2=With these changes we are getting paid business support and funding -survey.please=Please consider taking our survey! -survey.disabled=(Survey popup will be disabled in following updates but available at foot of page) -survey.button=Take Survey -survey.dontShowAgain=Don't show again +survey.nav=Enquête +survey.title=Enquête Stirling-PDF +survey.description=Stirling-PDF n'a pas de suivi, donc nous voulons entendre nos utilisateurs pour améliorer Stirling-PDF ! +survey.changes=Stirling-PDF a changé depuis la dernière enquête ! Pour en savoir plus, veuillez consulter notre article de blog ici : +survey.changes2=Avec ces changements, nous obtenons un soutien commercial rémunéré et un financement +survey.please=Veuillez envisager de répondre à notre enquête ! +survey.disabled=(La fenêtre contextuelle de l'enquête sera désactivée dans les mises à jour suivantes mais sera disponible en bas de page) +survey.button=Répondre à l'enquête +survey.dontShowAgain=Ne plus afficher #error error.sorry=Désolé pour ce problème ! -error.needHelp=Besoin d’aide / Vous avez trouvé un problème ? -error.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 : -error.404.head=404 - Page non trouvée | oups on s’est foiré ! +error.needHelp=Besoin d'aide / Vous avez trouvé un problème ? +error.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 : +error.404.head=404 - Page non trouvée | oups on s'est foiré ! error.404.1=Nous ne parvenons pas à trouver la page que vous recherchez. -error.404.2=Quelque chose n’a pas fonctionné +error.404.2=Quelque chose n'a pas fonctionné error.github=Créer un ticket sur GitHub error.showStack=Afficher la Stack Trace error.copyStack=Copier la Stack Trace error.githubSubmit=GitHub - Créer un ticket -error.discordSubmit=Discord - Poster un message de demande d’assistance +error.discordSubmit=Discord - Poster un message de demande d'assistance #remove-image -removeImage.title=Remove image -removeImage.header=Remove image -removeImage.removeImage=Remove image -removeImage.submit=Remove image - - -splitByChapters.title=Split PDF by Chapters -splitByChapters.header=Split PDF by Chapters -splitByChapters.bookmarkLevel=Bookmark Level -splitByChapters.includeMetadata=Include Metadata -splitByChapters.allowDuplicates=Allow Duplicates -splitByChapters.desc.1=This tool splits a PDF file into multiple PDFs based on its chapter structure. -splitByChapters.desc.2=Bookmark Level: Choose the level of bookmarks to use for splitting (0 for top-level, 1 for second-level, etc.). -splitByChapters.desc.3=Include Metadata: If checked, the original PDF's metadata will be included in each split PDF. -splitByChapters.desc.4=Allow Duplicates: If checked, allows multiple bookmarks on the same page to create separate PDFs. -splitByChapters.submit=Split PDF +removeImage.title=Supprimer l'image +removeImage.header=Supprimer l'image +removeImage.removeImage=Supprimer l'image +removeImage.submit=Supprimer l'image +splitByChapters.title=Diviser un PDF par Chapitres +splitByChapters.header=Diviser un PDF par Chapitres +splitByChapters.bookmarkLevel=Niveau de Signet +splitByChapters.includeMetadata=Inclure les Métadonnées +splitByChapters.allowDuplicates=Autoriser les Doublons +splitByChapters.desc.1=Cet outil divise un fichier PDF en plusieurs PDF en fonction de sa structure de chapitres. +splitByChapters.desc.2=Niveau de Signet : Choisissez le niveau de signets à utiliser pour la division (0 pour le niveau supérieur, 1 pour le deuxième niveau, etc...). +splitByChapters.desc.3=Inclure les Métadonnées : Si coché, les métadonnées du PDF original seront incluses dans chaque PDF divisé. +splitByChapters.desc.4=Autoriser les Doublons : Si coché, permet à plusieurs signets sur la même page de créer des PDF séparés. +splitByChapters.submit=Diviser le PDF diff --git a/src/main/resources/messages_ga_IE.properties b/src/main/resources/messages_ga_IE.properties index c5389eb40..ee97c5f93 100644 --- a/src/main/resources/messages_ga_IE.properties +++ b/src/main/resources/messages_ga_IE.properties @@ -79,6 +79,8 @@ info=Eolas pro=Pro page=Page pages=Pages +loading=Loading... +addToDoc=Add to Document legal.privacy=Privacy Policy legal.terms=Terms and Conditions @@ -244,6 +246,7 @@ database.fileNullOrEmpty=Níor cheart go mbeadh an comhad ar neamhní nó folamh database.failedImportFile=Theip ar iompórtáil an chomhaid session.expired=Your session has expired. Please refresh the page and try again. +session.refreshPage=Refresh Page ############# # HOME-PAGE # @@ -748,6 +751,7 @@ certSign.showSig=Taispeáin Síniú certSign.reason=Cúis certSign.location=Suíomh certSign.name=Ainm +certSign.showLogo=Show Logo certSign.submit=Sínigh PDF @@ -782,6 +786,9 @@ compare.highlightColor.2=Dath Aibhsithe 2: compare.document.1=Doiciméad 1 compare.document.2=Doiciméad 2 compare.submit=Déan comparáid idir +compare.complex.message=One or both of the provided documents are large files, accuracy of comparison may be reduced +compare.large.file.message=One or Both of the provided documents are too large to process +compare.no.text.message=One or both of the selected PDFs have no text content. Please choose PDFs with text for comparison. #BookToPDF BookToPDF.title=Leabhair agus comics a PDF @@ -804,6 +811,11 @@ sign.draw=Tarraing Síniú sign.text=Ionchur Téacs sign.clear=Glan sign.add=Cuir +sign.saved=Saved Signatures +sign.save=Save Signature +sign.personalSigs=Personal Signatures +sign.sharedSigs=Shared Signatures +sign.noSavedSigs=No saved signatures found #repair @@ -921,7 +933,14 @@ pdfOrganiser.placeholder=(m.sh. 1,3,2 nó 4-8,2,10-12 nó 2n-1) multiTool.title=Il-uirlis PDF multiTool.header=Il-uirlis PDF multiTool.uploadPrompts=Ainm comhaid - +multiTool.selectAll=Select All +multiTool.deselectAll=Deselect All +multiTool.selectPages=Page Select +multiTool.selectedPages=Selected Pages +multiTool.page=Page +multiTool.deleteSelected=Delete Selected +multiTool.downloadAll=Export +multiTool.downloadSelected=Export Selected #view pdf viewPdf.title=Féach PDF viewPdf.header=Féach PDF @@ -1220,5 +1239,3 @@ splitByChapters.desc.2=Bookmark Level: Choose the level of bookmarks to use for splitByChapters.desc.3=Include Metadata: If checked, the original PDF's metadata will be included in each split PDF. splitByChapters.desc.4=Allow Duplicates: If checked, allows multiple bookmarks on the same page to create separate PDFs. splitByChapters.submit=Split PDF - - diff --git a/src/main/resources/messages_hi_IN.properties b/src/main/resources/messages_hi_IN.properties index 939835318..e96ac127d 100644 --- a/src/main/resources/messages_hi_IN.properties +++ b/src/main/resources/messages_hi_IN.properties @@ -12,17 +12,17 @@ imgPrompt=छवियों का चयन करें genericSubmit=प्रस्तुत करें processTimeWarning=चेतावनी: यह प्रक्रिया फ़ाइल के आकार पर निर्भर करती है और यह से एक मिनट तक लग सकती है pageOrderPrompt=कस्टम पेज क्रम (पेज नंबरों या 2n+1 जैसे कार्यों की एक कॉमा से अलग-अलग सूची दर्ज करें): -pageSelectionPrompt=Custom Page Selection (Enter a comma-separated list of page numbers 1,5,6 or Functions like 2n+1) : +pageSelectionPrompt=कस्तम पेज चयन (पेज संख्याओं 1,5,6 या फंक्शन 2n+1 को अलग-अलग बैरीज़ में लिखिए) : goToPage=जाएँ true=सही false=गलत unknown=अज्ञात save=सहेजें -saveToBrowser=Save to Browser +saveToBrowser=ब्राउझर में सहमत करें close=बंद करें filesSelected=फ़ाइलें चयनित हैं noFavourites=कोई पसंदीदा जोड़ा नहीं गया है -downloadComplete=Download Complete +downloadComplete=डाउनलोड पूरा हुआ bored=बोर हो रहे हैं? alphabet=वर्णमाला downloadPdf=पीडीएफ़ डाउनलोड करें @@ -46,89 +46,91 @@ red=लाल green=हरा blue=नीला custom=कस्टम... -WorkInProgess=Work in progress, May not work or be buggy, Please report any problems! -poweredBy=Powered by -yes=Yes -no=No +WorkInProgess=कार्य चल रहा है, ये लगभग कार्य कर सकते हैं या फ़ौल बिजी में हो सकते हैं, किसी समस्या का पता लगाने के लिए कृपया रिपोर्ट करें! +poweredBy=बलिदान की स्वामित्व +yes=हा +no=नहीं changedCredsMessage=क्रेडेंशियल्स बदल दी गईं! notAuthenticatedMessage=उपयोगकर्ता प्रमाणित नहीं है। userNotFoundMessage=उपयोगकर्ता नहीं मिला। incorrectPasswordMessage=वर्तमान पासवर्ड गलत है। usernameExistsMessage=नया उपयोगकर्ता नाम पहले से मौजूद है। -invalidUsernameMessage=Invalid username, username can only contain letters, numbers and the following special characters @._+- or must be a valid email address. -invalidPasswordMessage=The password must not be empty and must not have spaces at the beginning or end. -confirmPasswordErrorMessage=New Password and Confirm New Password must match. -deleteCurrentUserMessage=Cannot delete currently logged in user. -deleteUsernameExistsMessage=The username does not exist and cannot be deleted. +invalidUsernameMessage=अवैध उपयोगकर्ता नाम, उपयोगकर्ता नाम केवल अक्षर, संख्या और इन प्रतिकरणों @._+- में ही शामिल हो सकते हैं या एक बिल्ड-आउट वैध ईमेल एड्रेस के रूप में होना चाहिए। +invalidPasswordMessage=पासवर्ड खाली नहीं हो सकता है और इसमें शुरुआत या अंत में अज्ञात अंदाज के विच्छेदन नहीं हो सकते। +confirmPasswordErrorMessage=नया पासवर्ड और पुष्टि नया पासवर्ड मेल खाते हैं। +deleteCurrentUserMessage=प्रसिद्धिगत उपयोगकर्ता को नहीं हटा सकते हैं। +deleteUsernameExistsMessage=उपयोगकर्ता नाम मौजूद नहीं है और नहीं हटा सकता है। downgradeCurrentUserMessage=मौजूदा यूज़र की भूमिका को डाउनग्रेड नहीं किया जा सकता -disabledCurrentUserMessage=The current user cannot be disabled +disabledCurrentUserMessage=वर्तमान उपयोगकर्ता निषेध किया गया है। downgradeCurrentUserLongMessage=मौजूदा यूज़र की भूमिका को डाउनग्रेड नहीं किया जा सकता। इसलिए, वर्तमान उपयोगकर्ता को नहीं दिखाया जाएगा। -userAlreadyExistsOAuthMessage=The user already exists as an OAuth2 user. -userAlreadyExistsWebMessage=The user already exists as an web user. -error=Error -oops=Oops! -help=Help -goHomepage=Go to Homepage -joinDiscord=Join our Discord server -seeDockerHub=See Docker Hub -visitGithub=Visit Github Repository -donate=Donate -color=Color -sponsor=Sponsor -info=Info -pro=Pro +userAlreadyExistsOAuthMessage=उपयोगकर्ता ऑटहॉराइजेशन 2 से वास्तविक में मौजूद है। +userAlreadyExistsWebMessage=उपयोगकर्ता वेब से राजीव में मौजूद है। +error=मुश्किल +oops=ओह! +help=सहायता +goHomepage=主页前往 +joinDiscord=हमारे Discord सर्वर में शामिल होना +seeDockerHub=Docker Hub पर देखें +visitGithub=गिटहब को दृश्यकरण करें +donate=दान करें +color=रंग +sponsor=पatreon से पोर्टन +info=सूचना +pro=कॉलेजीय page=पृष्ठ pages=पृष्ठों +loading=डालिंग... +addToDoc=Add to Document -legal.privacy=Privacy Policy -legal.terms=Terms and Conditions -legal.accessibility=Accessibility -legal.cookie=Cookie Policy -legal.impressum=Impressum +legal.privacy=गुप्तता सूचना +legal.terms=शर्तें और प्रवाह +legal.accessibility=कारणीबिलिटी +legal.cookie=कुकीज़ नीति +legal.impressum=प्रेरणा ############### # Pipeline # ############### -pipeline.header=Pipeline Menu (Beta) -pipeline.uploadButton=Upload Custom -pipeline.configureButton=Configure -pipeline.defaultOption=Custom -pipeline.submitButton=Submit -pipeline.help=Pipeline Help -pipeline.scanHelp=Folder Scanning Help -pipeline.deletePrompt=Are you sure you want to delete pipeline +pipeline.header=पाइपलाइन सूची (बेटा) +pipeline.uploadButton=व्यक्तिगत अपलोड +pipeline.configureButton=संरचना करें +pipeline.defaultOption=कसरत की शुल्क +pipeline.submitButton=प्रविष्टि +pipeline.help=पाइपलाइन मदद +pipeline.scanHelp=फोल्डर स्फॅं जस्त्र मदद +pipeline.deletePrompt=कि आपकी है पाइपलाइन का हटाना करना चाहते हैं? ###################### # Pipeline Options # ###################### -pipelineOptions.header=Pipeline Configuration -pipelineOptions.pipelineNameLabel=Pipeline Name -pipelineOptions.saveSettings=Save Operation Settings -pipelineOptions.pipelineNamePrompt=Enter pipeline name here -pipelineOptions.selectOperation=Select Operation -pipelineOptions.addOperationButton=Add operation -pipelineOptions.pipelineHeader=Pipeline: -pipelineOptions.saveButton=Download -pipelineOptions.validateButton=Validate +pipelineOptions.header=पाइपलाइन संरचना +pipelineOptions.pipelineNameLabel=पाइपलाइन का नाम +pipelineOptions.saveSettings=कार्यक्रम सेटिंग्स संरक्षण +pipelineOptions.pipelineNamePrompt=यहाँ पाइपलाइन का नाम दर्ज करें +pipelineOptions.selectOperation=कार्य चुनें +pipelineOptions.addOperationButton=कार्य जोड़ें +pipelineOptions.pipelineHeader=पाइपलाइन: +pipelineOptions.saveButton=डाउनलोड +pipelineOptions.validateButton=सुविधा परीक्षण ######################## # ENTERPRISE EDITION # ######################## -enterpriseEdition.button=Upgrade to Pro -enterpriseEdition.warning=This feature is only available to Pro users. -enterpriseEdition.yamlAdvert=Stirling PDF Pro supports YAML configuration files and other SSO features. -enterpriseEdition.ssoAdvert=Looking for more user management features? Check out Stirling PDF Pro +enterpriseEdition.button=प्रो के लिए अदायगी में तहत तुलना करें +enterpriseEdition.warning=यह संभावना केवल प्रो उपयोगकर्ताओं के लिए उपलब्ध है। +enterpriseEdition.yamlAdvert=स्टीरिंग पीडीऍफ़ प्रो यॅमल संरचना फाइलें और अन्य SSO सुविधाओं का समर्थन करता है। +enterpriseEdition.ssoAdvert=सामान्य प्रबंधन विशेषताएं खोजने के लिए स्टीरिंग पीडीऍफ़ प्रो का परीक्षण करें ################# # Analytics # ################# -analytics.title=Do you want make Stirling PDF better? -analytics.paragraph1=Stirling PDF has opt in analytics to help us improve the product. We do not track any personal information or file contents. -analytics.paragraph2=Please consider enabling analytics to help Stirling-PDF grow and to allow us to understand our users better. -analytics.enable=Enable analytics -analytics.disable=Disable analytics -analytics.settings=You can change the settings for analytics in the config/settings.yml file +analytics.title=स्टीरिंग पीडीऍफ़ को बेहतर करने में मदद करना चाहते हैं? +analytics.paragraph1=स्टीरिंग पीडीऍफ़ मध्यम सुनिश्चित है जो हमें उपलब्ध कराता है और उत्पाद को बेहतर करने में मदद करता है। हम किसी प्रकार का व्यक्तिगत जानकारी या फ़ाइल सामग्रियों का ट्रॅक नहीं करते हैं। +analytics.paragraph2=मांगित गर्न मा, कैनलीस-पडफको सुधार बढाउने मदत गर्न माफि गर्ने प्रयोगकर्ताको समजलाई समज्दा परिवर्तनले मदत गर्न सकिँदू। +analytics.enable=कैनलीस खुलाउँछु +analytics.disable=कैनलीस बुझाउँछु +analytics.settings=परिष्कार संपर्कमा कैनलीस सेटिङहरू परिवर्तन गर्न सकिँदू ############# # NAVBAR # @@ -145,7 +147,7 @@ navbar.sections.convertFrom=पीडीएफ से कनवर्ट कर navbar.sections.security=संकेत और सुरक्षा navbar.sections.advance=उन्नत navbar.sections.edit=देखें और संपादित करें -navbar.sections.popular=Popular +navbar.sections.popular=यादृच्छिको ############# # SETTINGS # @@ -161,13 +163,13 @@ settings.downloadOption.3=फ़ाइल डाउनलोड करें settings.zipThreshold=जब डाउनलोड की गई फ़ाइलों की संख्या सीमा से अधिक हो settings.signOut=साइन आउट settings.accountSettings=खाता सेटिंग्स -settings.bored.help=Enables easter egg game -settings.cacheInputs.name=Save form inputs -settings.cacheInputs.help=Enable to store previously used inputs for future runs +settings.bored.help=बालाची खुशाखुशी गेम सक्रिय गर्ने आवकता +settings.cacheInputs.name=पहिलो इनपुटहरू बंदरगाहमा राख्न +settings.cacheInputs.help=क्रियाकलापको पारित कर्मचारी भेट्दा पूर्ववार उपयोग मा लगाएको इनपुटहरू बंदरगाहमा संग्रहित गर्ने आवकता changeCreds.title=क्रेडेंशियल बदलें changeCreds.header=अपना खाता विवरण अपडेट करें -changeCreds.changePassword=You are using default login credentials. Please enter a new password +changeCreds.changePassword=सुरक्षित पासワर्ड वापर्ने बदल्नु हो changeCreds.newUsername=नया उपयोगकर्ता नाम changeCreds.oldPassword=वर्तमान पासवर्ड changeCreds.newPassword=नया पासवर्ड @@ -202,25 +204,25 @@ adminUserSettings.header=व्यवस्थापक उपयोगकर् adminUserSettings.admin=व्यवस्थापक adminUserSettings.user=उपयोगकर्ता adminUserSettings.addUser=नया उपयोगकर्ता जोड़ें -adminUserSettings.deleteUser=Delete User -adminUserSettings.confirmDeleteUser=Should the user be deleted? -adminUserSettings.confirmChangeUserStatus=Should the user be disabled/enabled? -adminUserSettings.usernameInfo=Username can only contain letters, numbers and the following special characters @._+- or must be a valid email address. +adminUserSettings.deleteUser=उपयोगकर्ता छुट्टी देनु +adminUserSettings.confirmDeleteUser=उपयोगकर्ताको छुट्टी दिइने सँचार हुनुपछै अनुमति दिन्‍दै लागि पुष्टि गर्नुहोस् +adminUserSettings.confirmChangeUserStatus=उपयोगकर्ताको स्थिरपद्धति परिवर्तनले पुष्टि गर्नुहोस्‍ +adminUserSettings.usernameInfo=उपयोगकर्ता नाममा केही संख्या, क्रतिका र अगले पूर्णाङ्क @._+- मा जस्ता विशेष चिह्नहरू छुन्न सकिँदू उपयोगकर्ता नामले एक संधारणीय पत्रक्याले बनाइएच। adminUserSettings.roles=रोल्स adminUserSettings.role=रोल adminUserSettings.actions=क्रियाएँ adminUserSettings.apiUser=सीमित API उपयोगकर्ता -adminUserSettings.extraApiUser=Additional Limited API User +adminUserSettings.extraApiUser=अतिरिक्त सीमित API उपयोगकर्ता adminUserSettings.webOnlyUser=केवल वेब उपयोगकर्ता -adminUserSettings.demoUser=Demo User (No custom settings) -adminUserSettings.internalApiUser=Internal API User +adminUserSettings.demoUser=विनंति उपयोगकर्ता (स्वामित्व अनुकूली) +adminUserSettings.internalApiUser=अन्तराल API उपयोगकर्ता adminUserSettings.forceChange=उपयोगकर्ता को लॉगिन पर उपयोगकर्ता नाम/पासवर्ड बदलने के लिए मजबूर करें adminUserSettings.submit=उपयोगकर्ता को सहेजें adminUserSettings.changeUserRole=यूज़र की भूमिका बदलें -adminUserSettings.authenticated=Authenticated -adminUserSettings.editOwnProfil=Edit own profile -adminUserSettings.enabledUser=enabled user -adminUserSettings.disabledUser=disabled user +adminUserSettings.authenticated=मान्यताप्राप्त +adminUserSettings.editOwnProfil=आफु प्रोफाइल संपादन गर्नुहोस् +adminUserSettings.enabledUser=कार्यक्षम उपयोगकर्ता +adminUserSettings.disabledUser=अकार्यक्षम उपयोगकर्ता adminUserSettings.activeUsers=Active Users: adminUserSettings.disabledUsers=Disabled Users: adminUserSettings.totalUsers=Total Users: @@ -244,6 +246,7 @@ database.fileNullOrEmpty=File must not be null or empty database.failedImportFile=Failed Import File session.expired=Your session has expired. Please refresh the page and try again. +session.refreshPage=Refresh Page ############# # HOME-PAGE # @@ -485,46 +488,46 @@ home.split-by-sections.title=खंडों से पीडीएफ़ वि home.split-by-sections.desc=पीडीएफ़ के प्रत्येक पृष्ठ को छोटे से छोटे क्षैतिज और ऊर्ध्वाधर खंडों में विभाजित करें split-by-sections.tags=खंड विभाजन, विभाजित करें, अनुकूलित -home.AddStampRequest.title=Add Stamp to PDF -home.AddStampRequest.desc=Add text or add image stamps at set locations +home.AddStampRequest.title=PDF में स्पष्ट रंग जोड़ें +home.AddStampRequest.desc=साहित्य पुनर्व्यवस्थित करें या निर्धारित स्थानों पर चित्र लक्षण जोड़ें AddStampRequest.tags=Stamp, Add image, center image, Watermark, PDF, Embed, Customize -home.PDFToBook.title=PDF to Book -home.PDFToBook.desc=Converts PDF to Book/Comic formats using calibre +home.PDFToBook.title=PDF से बुक +home.PDFToBook.desc=Calibre का उपयोग करके PDF को बुक/कमिक्स फॉर्मेट में परिवर्तित करें PDFToBook.tags=Book,Comic,Calibre,Convert,manga,amazon,kindle -home.BookToPDF.title=Book to PDF -home.BookToPDF.desc=Converts Books/Comics formats to PDF using calibre +home.BookToPDF.title=बुक से PDF +home.BookToPDF.desc=Calibre का उपयोग करके Books/Comics फॉर्मेट को PDF में परिवर्तित करें BookToPDF.tags=Book,Comic,Calibre,Convert,manga,amazon,kindle -home.removeImagePdf.title=Remove image -home.removeImagePdf.desc=Remove image from PDF to reduce file size -removeImagePdf.tags=Remove Image,Page operations,Back end,server side +home.removeImagePdf.title=चित्र हटाएं +home.removeImagePdf.desc=PDF से चित्र हटा कर फाइल आकार को कम करें +removeImagePdf.tags=चित्र हटाएं,पृष्ठ ऑपरेशन्स,बाकी सिड,सर्वर साइड -home.splitPdfByChapters.title=Split PDF by Chapters -home.splitPdfByChapters.desc=Split a PDF into multiple files based on its chapter structure. -splitPdfByChapters.tags=split,chapters,bookmarks,organize +home.splitPdfByChapters.title=अध्यायों पर अलग-करें +home.splitPdfByChapters.desc=पुस्तक के अध्याय की संरचना पर आधारित एक PDF को बहिन-भागों में विभाजित करें +splitPdfByChapters.tags=विभाजन,अध्याय,पसंदीदा,रजैत #replace-invert-color replace-color.title=Replace-Invert-Color -replace-color.header=Replace-Invert Color PDF +replace-color.header=चित्र रंग परिवर्तन/उलटकर परिवर्तन PDF home.replaceColorPdf.title=Replace and Invert Color -home.replaceColorPdf.desc=Replace color for text and background in PDF and invert full color of pdf to reduce file size -replaceColorPdf.tags=Replace Color,Page operations,Back end,server side -replace-color.selectText.1=Replace or Invert color Options -replace-color.selectText.2=Default(Default high contrast colors) -replace-color.selectText.3=Custom(Customized colors) -replace-color.selectText.4=Full-Invert(Invert all colors) -replace-color.selectText.5=High contrast color options -replace-color.selectText.6=white text on black background -replace-color.selectText.7=Black text on white background -replace-color.selectText.8=Yellow text on black background -replace-color.selectText.9=Green text on black background -replace-color.selectText.10=Choose text Color -replace-color.selectText.11=Choose background Color -replace-color.submit=Replace +home.replaceColorPdf.desc=PDF में टेक्स्ट और पैरासेमा के लिए रंग परिवर्तन करें और पूरी फोटो उलटकर परिवर्तन करें जो कि फाइल आकार को कम करें +replaceColorPdf.tags=रंग परिवर्तन,पृष्ठ ऑपरेशन्स,बाकी सिड,सर्वर साइड +replace-color.selectText.1=रंग परिवर्तन/उलटकर परिवर्तन विकल्प +replace-color.selectText.2=वैश्विक(वैश्विक उच्च अंतराल रंग) +replace-color.selectText.3=स्वतन्त्र(आम रंग) +replace-color.selectText.4=सार्वभौमिक-क्रमांतरण(सभी रंगों को आलवा करें) +replace-color.selectText.5=कुछ तृvigya रंग विकल्प +replace-color.selectText.6=गायन उपरि पीक मैदान पर काला अवलोकन +replace-color.selectText.7=काले उपरि काला रेखा +replace-color.selectText.8=काले उपरि काला मैदान पर सफ़ेद अवलोकन +replace-color.selectText.9=काले उपरि काला मैदान पर हियंग अवलोकन +replace-color.selectText.10=याद की जाने वाली रेखा चुनें +replace-color.selectText.11=पौधा उपरि पीक मैदान चुनें +replace-color.submit=बदलें @@ -543,17 +546,17 @@ login.locked=आपका खाता लॉक कर दिया गया login.signinTitle=कृपया साइन इन करें login.ssoSignIn=सिंगल साइन - ऑन के ज़रिए लॉग इन करें login.oauth2AutoCreateDisabled=OAUTH2 ऑटो - क्रिएट यूज़र अक्षम किया गया -login.oauth2AdminBlockedUser=Registration or logging in of non-registered users is currently blocked. Please contact the administrator. -login.oauth2RequestNotFound=Authorization request not found -login.oauth2InvalidUserInfoResponse=Invalid User Info Response -login.oauth2invalidRequest=Invalid Request -login.oauth2AccessDenied=Access Denied -login.oauth2InvalidTokenResponse=Invalid Token Response -login.oauth2InvalidIdToken=Invalid Id Token -login.userIsDisabled=User is deactivated, login is currently blocked with this username. Please contact the administrator. -login.alreadyLoggedIn=You are already logged in to -login.alreadyLoggedIn2=devices. Please log out of the devices and try again. -login.toManySessions=You have too many active sessions +login.oauth2AdminBlockedUser=व्यक्तिगत नहीं की रजिस्टर या लॉग-इन वर्षा माह प्रतिबंधित है। कृपया संबवादक से संपर्क करें. +login.oauth2RequestNotFound=स्वीकारोचा याचना मिल नहीं रही +login.oauth2InvalidUserInfoResponse=अमान्तरित प्रकाशीय जानकारी संदेश कैसे है +login.oauth2invalidRequest=गलत याचना +login.oauth2AccessDenied=इनपुट उम्मीदवार डिसकार +login.oauth2InvalidTokenResponse=अमान्तरित सिक्वेंस जवाब कैसे है +login.oauth2InvalidIdToken=गलत इड टोकन +login.userIsDisabled=उपयोगकर्ता डिसबाल, यह वर्षा सभी उपयोगकर्ता जूझे वर्षाकरण बारा मिल गई है। कृपया संबवादक से संपर्क करें. +login.alreadyLoggedIn=आप पहले से ही +login.alreadyLoggedIn2=सुनिश्चित करने वाले डिवाइस्स पर लॉग-इन हैं। कृपया इन डिवाइस से लॉगआउट करें और पुनः प्रयास करें +login.toManySessions=आपके अधिक संख्या में विदीश हो रहे हैं #auto-redact autoRedact.title=स्वत: गोपनीयकरण @@ -585,7 +588,7 @@ pdfToSinglePage.submit=एकल पृष्ठ में परिवर्त pageExtracter.title=पृष्ठों को निकालें pageExtracter.header=पृष्ठों को निकालें pageExtracter.submit=निकालें -pageExtracter.placeholder=(e.g. 1,2,8 or 4,7,12-16 or 2n-1) +pageExtracter.placeholder=(उदाहरण के लिए 1,2,8 या 4,7,12-16 या 2n-1) #getPdfInfo @@ -617,37 +620,37 @@ HTMLToPDF.header=HTML से पीडीएफ़ HTMLToPDF.help=HTML फ़ाइलों और html/css/images आदि को आत्मसात करने वाले ZIPs को स्वीकार करता है HTMLToPDF.submit=रूपांतरित करें HTMLToPDF.credit=WeasyPrint का प्रयोग होता है -HTMLToPDF.zoom=Zoom level for displaying the website. -HTMLToPDF.pageWidth=Width of the page in centimeters. (Blank to default) -HTMLToPDF.pageHeight=Height of the page in centimeters. (Blank to default) -HTMLToPDF.marginTop=Top margin of the page in millimeters. (Blank to default) -HTMLToPDF.marginBottom=Bottom margin of the page in millimeters. (Blank to default) -HTMLToPDF.marginLeft=Left margin of the page in millimeters. (Blank to default) -HTMLToPDF.marginRight=Right margin of the page in millimeters. (Blank to default) -HTMLToPDF.printBackground=Render the background of websites. -HTMLToPDF.defaultHeader=Enable Default Header (Name and page number) -HTMLToPDF.cssMediaType=Change the CSS media type of the page. -HTMLToPDF.none=None -HTMLToPDF.print=Print -HTMLToPDF.screen=Screen +HTMLToPDF.zoom=संप्रेषण वेबसाइट के लिए डॉलर स्तर। +HTMLToPDF.pageWidth=पृष्ठ की चौड़ाई मिलीमिटर में। (व्यंकत अधिकतर मान) +HTMLToPDF.pageHeight=पृष्ठ की ऊँचाई मिलीमिटर में। (व्यंकत अधिकतर मान) +HTMLToPDF.marginTop=पृष्ठ का शीर्ष बन्दरगाह मिलीमिटर में। (व्यंकत अधिकतर मान) +HTMLToPDF.marginBottom=पृष्ठ का तल बन्दरगाह मिलीमिटर में। (व्यंकत अधिकतर मान) +HTMLToPDF.marginLeft=पृष्ठ का बाएँ बन्दरगाह मिलीमिटर में। (व्यंकत अधिकतर मान) +HTMLToPDF.marginRight=पृष्ठ का डाई बन्दरगाह मिलीमिटर में। (व्यंकत अधिकतर मान) +HTMLToPDF.printBackground=वेबसाइट के पैनल को छद्म रूप से दिखाएं। +HTMLToPDF.defaultHeader=उचित उपनाम (नाम और पृष्ठ संख्या) इनकार करें। +HTMLToPDF.cssMediaType=पृष्ठ के लिए CSS मीडिया टाइप परिवर्तित करें। +HTMLToPDF.none=कोई नहीं +HTMLToPDF.print=दबाओ और बन्दोच्स हार्डवेयर पर आउटपुट करें। +HTMLToPDF.screen=दिखाएँ जैसा कि अपने ट्रिपल पर। #AddStampRequest -AddStampRequest.header=Stamp PDF -AddStampRequest.title=Stamp PDF -AddStampRequest.stampType=Stamp Type -AddStampRequest.stampText=Stamp Text -AddStampRequest.stampImage=Stamp Image -AddStampRequest.alphabet=Alphabet -AddStampRequest.fontSize=Font/Image Size -AddStampRequest.rotation=Rotation -AddStampRequest.opacity=Opacity -AddStampRequest.position=Position -AddStampRequest.overrideX=Override X Coordinate -AddStampRequest.overrideY=Override Y Coordinate -AddStampRequest.customMargin=Custom Margin -AddStampRequest.customColor=Custom Text Color -AddStampRequest.submit=Submit +AddStampRequest.header=बिन्दुक बन्दोच्स हेडर +AddStampRequest.title=बिन्दुक बन्दोच्स +AddStampRequest.stampType=बिन्दुक प्रकार +AddStampRequest.stampText=बिन्दुक टेक्स्ट +AddStampRequest.stampImage=बिन्दुक आइमेज +AddStampRequest.alphabet=अक्षर +AddStampRequest.fontSize=फोन्ट/चित्र का आकार +AddStampRequest.rotation=वृद्धि +AddStampRequest.opacity=परिस्थिति +AddStampRequest.position=स्थिति +AddStampRequest.overrideX=X निर्देशांक परिबद्ध करें +AddStampRequest.overrideY=Y निर्देशांक परिबद्ध करें +AddStampRequest.customMargin=संवैधित मैरज +AddStampRequest.customColor=संवैधित टेक्स्ट रंग +AddStampRequest.submit=प्रदान करें #sanitizePDF @@ -728,7 +731,7 @@ pageLayout.submit=प्रस्तुत क scalePages.title=पृष्ठ-स्केल समायोजित करें scalePages.header=पृष्ठ-स्केल समायोजित करें scalePages.pageSize=दस्तावेज़ के पृष्ठ का आकार। -scalePages.keepPageSize=Original Size +scalePages.keepPageSize=मूल आकार scalePages.scaleFactor=पृष्ठ का ज़ूम स्तर (क्रॉप)। scalePages.submit=प्रस्तुत करें @@ -737,25 +740,26 @@ scalePages.submit=प्रस्तुत करें certSign.title=प्रमाणपत्र साइनिंग certSign.header=अपने प्रमाणपत्र के साथ एक पीडीएफ़ पर हस्ताक्षर करें (काम जारी है) certSign.selectPDF=साइन करने के लिए एक पीडीएफ़ फ़ाइल का चयन करें: -certSign.jksNote=Note: If your certificate type is not listed below, please convert it to a Java Keystore (.jks) file using the keytool command line tool. Then, choose the .jks file option below. +certSign.jksNote=नोट: यदि आपके संदेश प्रकार नीचे सूचीबद्ध नहीं है, तो कृपया keytool कमांड लाइन टूल का उपयोग कर आपका संदेश फ़ाइल (.jks) में परिवर्तित करें. फिर, नीचे .jks फ़ाइल विकल्प चुनें. certSign.selectKey=अपनी निजी कुंजी फ़ाइल का चयन करें (PKCS#8 प्रारूप, .pem या .der हो सकता है): certSign.selectCert=अपनी प्रमाणपत्र फ़ाइल का चयन करें (X.509 प्रारूप, .pem या .der हो सकता है): certSign.selectP12=अपनी PKCS#12 कीस्टोर फ़ाइल का चयन करें (.p12 या .pfx) (वैकल्पिक, यदि प्रदान की गई हो, तो इसमें आपकी निजी कुंजी और प्रमाणपत्र होना चाहिए): -certSign.selectJKS=Select Your Java Keystore File (.jks or .keystore): +certSign.selectJKS=आपका Java Keystore (.jks या .keystore) फ़ाइल को चुनें: certSign.certType=प्रमाणपत्र प्रकार certSign.password=अपनी कीस्टोर या निजी कुंजी पासवर्ड दर्ज करें (यदि कोई हो): certSign.showSig=हस्ताक्षर दिखाएं certSign.reason=कारण certSign.location=स्थान certSign.name=नाम +certSign.showLogo=लॉगो दिखाएं certSign.submit=पीडीएफ़ पर हस्ताक्षर करें #removeCertSign -removeCertSign.title=Remove Certificate Signature -removeCertSign.header=Remove the digital certificate from the PDF -removeCertSign.selectPDF=Select a PDF file: -removeCertSign.submit=Remove Signature +removeCertSign.title=वितरण साइनचर्टर हटाएं +removeCertSign.header=PDF में डिजिटल चार्टर को हटाएं +removeCertSign.selectPDF=एक PDF फ़ाइल को चुनें: +removeCertSign.submit=साइनचर्टर हटाएं #removeBlanks @@ -777,24 +781,27 @@ removeAnnotations.submit=हटाएं #compare compare.title=तुलना करें compare.header=पीडीएफ़ तुलना करें -compare.highlightColor.1=Highlight Color 1: -compare.highlightColor.2=Highlight Color 2: +compare.highlightColor.1=प्रकाशित रंग 1: +compare.highlightColor.2=प्रकाशित रंग 2: compare.document.1=दस्तावेज़ 1 compare.document.2=दस्तावेज़ 2 compare.submit=तुलना करें +compare.complex.message=एक या दोनों प्रदान की गई संस्कृति महंगे हैं, अपरिमेयता की तुलना की शुरुआत हो सकती है +compare.large.file.message=One or Both of the provided documents are too large to process +compare.no.text.message=चयनित PDF में कोई भी प्रतीक नहीं है. कृपया प्रतीक वाले PDFs का चयन करें. #BookToPDF -BookToPDF.title=Books and Comics to PDF -BookToPDF.header=Book to PDF -BookToPDF.credit=Uses Calibre -BookToPDF.submit=Convert +BookToPDF.title=बुक्स और कमिक्स को PDF में +BookToPDF.header=बुक्स से पीडीएफ +BookToPDF.credit=Calibre का उपयोग करता है +BookToPDF.submit=संवाद करें #PDFToBook -PDFToBook.title=PDF to Book -PDFToBook.header=PDF to Book -PDFToBook.selectText.1=Format -PDFToBook.credit=Uses Calibre -PDFToBook.submit=Convert +PDFToBook.title=PDF से बुक्स +PDFToBook.header=PDF से बुक्स +PDFToBook.selectText.1=फॉर्मट +PDFToBook.credit=Calibre का उपयोग करता है +PDFToBook.submit=संवाद करें #sign sign.title=हस्ताक्षर @@ -804,6 +811,11 @@ sign.draw=हस्ताक्षर बनाएँ sign.text=पाठ इनपुट sign.clear=साफ़ करें sign.add=जोड़ें +sign.saved=जोड़े हुए प्रदर्शन +sign.save=प्रदर्शन बचाएं +sign.personalSigs=मौजूदा प्रदर्शन +sign.sharedSigs=साझेदार प्रदर्शन +sign.noSavedSigs=कोई भी संवर्तित प्रदर्शन नहीं मौजूद है #repair @@ -830,7 +842,7 @@ ScannerImageSplit.selectText.7=न्यूनतम कंटोर क्ष ScannerImageSplit.selectText.8=फोटो के लिए न्यूनतम कंटोर क्षेत्र थ्रेशोल्ड को सेट करता है। ScannerImageSplit.selectText.9=बॉर्डर का आकार: ScannerImageSplit.selectText.10=निकालने और जोड़ने के लिए जोड़ा जाने वाला बॉर्डर का आकार सेट करता है ताकि आउटपुट में सफेद बॉर्डर न आए (डिफ़ॉल्ट: 1)। -ScannerImageSplit.info=Python is not installed. It is required to run. +ScannerImageSplit.info=Python नहीं इंस्टॉल है. यह संचालित करने के लिए आवश्यक है. #OCR @@ -857,7 +869,7 @@ ocr.submit=OCR के साथ PDF प्रोसेस करें extractImages.title=छवियां निकालें extractImages.header=छवियां निकालें extractImages.selectText=निकाली गई छवियों को कन्वर्ट करने के लिए छवि प्रारूप चुनें -extractImages.allowDuplicates=Save duplicate images +extractImages.allowDuplicates=यह दबाव अनुमति दें extractImages.submit=निकालें @@ -865,7 +877,7 @@ extractImages.submit=निकालें fileToPDF.title=फ़ाइल से पीडीएफ़ fileToPDF.header=किसी भी फ़ाइल को पीडीएफ़ में बदलें fileToPDF.credit=यह सेवा फ़ाइल परिवर्तन के लिए LibreOffice और Unoconv का उपयोग करती है। -fileToPDF.supportedFileTypesInfo=Supported File types +fileToPDF.supportedFileTypesInfo=समर्थित फ़ाइल प्रजातियाँ fileToPDF.supportedFileTypes=समर्थित फ़ाइल प्रकार नीचे दिए गए होने चाहिए हालांकि समर्थित प्रारूपों की पूरी अद्यतन सूची के लिए कृपया LibreOffice दस्तावेज़ीकरण से संदर्भित करें fileToPDF.submit=पीडीएफ़ में बदलें @@ -895,7 +907,7 @@ merge.title=मर्ज merge.header=एक से अधिक PDF एक साथ मर्ज करें (2+) merge.sortByName=नाम से क्रमबद्ध करें merge.sortByDate=तारीख से क्रमबद्ध करें -merge.removeCertSign=Remove digital signature in the merged file? +merge.removeCertSign=संयोजित फाइल में डिजिटल साइग्नचर को हटा दें? merge.submit=मर्ज करें @@ -903,25 +915,32 @@ merge.submit=मर्ज करें pdfOrganiser.title=पेज व्यवस्थापक pdfOrganiser.header=PDF पेज व्यवस्थापक pdfOrganiser.submit=पृष्ठों को पुनः व्यवस्थित करें -pdfOrganiser.mode=Mode -pdfOrganiser.mode.1=Custom Page Order -pdfOrganiser.mode.2=Reverse Order -pdfOrganiser.mode.3=Duplex Sort -pdfOrganiser.mode.4=Booklet Sort -pdfOrganiser.mode.5=Side Stitch Booklet Sort -pdfOrganiser.mode.6=Odd-Even Split -pdfOrganiser.mode.7=Remove First -pdfOrganiser.mode.8=Remove Last -pdfOrganiser.mode.9=Remove First and Last -pdfOrganiser.mode.10=Odd-Even Merge -pdfOrganiser.placeholder=(e.g. 1,3,2 or 4-8,2,10-12 or 2n-1) +pdfOrganiser.mode=रूप +pdfOrganiser.mode.1=कस्टम पेज क्रम +pdfOrganiser.mode.2=वापसी क्रम +pdfOrganiser.mode.3=दुबल इंस्टर क्रम +pdfOrganiser.mode.4=बुकलत सॉर्ट +pdfOrganiser.mode.5=पारित-पीछे स्टिस्ट बुकलत सॉर्ट +pdfOrganiser.mode.6=अशैली-बहूनी कटा-चिह्नित करना +pdfOrganiser.mode.7=पहली पेज हटाना +pdfOrganiser.mode.8=आखिरी पेज हटाना +pdfOrganiser.mode.9=पहली और आखिरी पेज हटाना +pdfOrganiser.mode.10=अशैली-बहूनी मिश्रण +pdfOrganiser.placeholder=(जैसे 1,3,2 या 4-8,2,10-12 या 2n-1) #multiTool multiTool.title=पीडीएफ मल्टी टूल multiTool.header=पीडीएफ मल्टी टूल -multiTool.uploadPrompts=File Name - +multiTool.uploadPrompts=फाइल का नाम +multiTool.selectAll=Select All +multiTool.deselectAll=Deselect All +multiTool.selectPages=Page Select +multiTool.selectedPages=Selected Pages +multiTool.page=Page +multiTool.deleteSelected=Delete Selected +multiTool.downloadAll=Export +multiTool.downloadSelected=Export Selected #view pdf viewPdf.title=पीडीएफ देखें viewPdf.header=पीडीएफ देखें @@ -931,7 +950,7 @@ pageRemover.title=पेज हटाने वाला pageRemover.header=पीडीएफ पेज हटाने वाला pageRemover.pagesToDelete=हटाने के पेज (पृष्ठ संख्याओं की व्यवस्था के लिए एक कॉमा से अलग संख्याओं की सूची दर्ज करें): pageRemover.submit=पेज हटाएं -pageRemover.placeholder=(e.g. 1,2,6 or 1-10,15-30) +pageRemover.placeholder=(जैसे 1,2,6 या 1-10,15-30) #rotate @@ -982,7 +1001,7 @@ pdfToImage.color=रंगीन pdfToImage.grey=ग्रे स्केल pdfToImage.blackwhite=काला और सफेद (डेटा खो सकता है!) pdfToImage.submit=परिवर्तित करें -pdfToImage.info=Python is not installed. Required for WebP conversion. +pdfToImage.info=पायथन नहीं अनिस्तारित है। वेबP परिवर्तन के लिए आवश्यक है। #addPassword @@ -1019,10 +1038,10 @@ watermark.selectText.6=ऊंचाई स्पेसर (प्रत्ये watermark.selectText.7=अपारदर्शिता (0% - 100%): watermark.selectText.8=वॉटरमार्क प्रकार: watermark.selectText.9=वॉटरमार्क छवि: -watermark.selectText.10=Convert PDF to PDF-Image +watermark.selectText.10=PDF डीपीआईमज़ देखभाल करें watermark.submit=वॉटरमार्क जोड़ें -watermark.type.1=Text -watermark.type.2=Image +watermark.type.1=संदेश +watermark.type.2=इमेज #Change permissions @@ -1074,9 +1093,9 @@ pdfToPDFA.title=PDF से PDF/A में pdfToPDFA.header=PDF से PDF/A में pdfToPDFA.credit=इस सेवा में PDF/A परिवर्तन के लिए ghostscript का उपयोग किया जाता है। pdfToPDFA.submit=परिवर्तित करें -pdfToPDFA.tip=Currently does not work for multiple inputs at once -pdfToPDFA.outputFormat=Output format -pdfToPDFA.pdfWithDigitalSignature=The PDF contains a digital signature. This will be removed in the next step. +pdfToPDFA.tip=यह सैकड़ों प्रविष्टियाँ एक ही समय में काम करते हैं +pdfToPDFA.outputFormat=आउटपुट फॉर्मेट +pdfToPDFA.pdfWithDigitalSignature=यह पीडीएफ मेला हस्ताक्षर से संबद्ध है। अगले कदम में यह हटाया जाएगा。 #PDFToWord @@ -1158,14 +1177,14 @@ split-by-sections.vertical.label=लंबवत विभाजन split-by-sections.horizontal.placeholder=क्षैतिज विभाजन की संख्या दर्ज करें split-by-sections.vertical.placeholder=लंबवत विभाजन की संख्या दर्ज करें split-by-sections.submit=PDF को विभाजित करें -split-by-sections.merge=Merge Into One PDF +split-by-sections.merge=एक पीडीऐ में मिलाएं #printFile -printFile.title=Print File -printFile.header=Print File to Printer +printFile.title=फाइल प्रिंत करें +printFile.header=प्रिंट फाइल को प्रिंटर पर प्रिंट करें printFile.selectText.1=Select File to Print -printFile.selectText.2=Enter Printer Name +printFile.selectText.2=प्रिंटर का नाम दर्ज करें printFile.submit=Print @@ -1173,52 +1192,50 @@ printFile.submit=Print licenses.nav=Licenses licenses.title=3rd Party Licenses licenses.header=3rd Party Licenses -licenses.module=Module -licenses.version=Version +licenses.module=मॗड्यूल +licenses.version=वेरसन licenses.license=License #survey -survey.nav=Survey -survey.title=Stirling-PDF Survey +survey.nav=परीक्षण +survey.title=स्टार्लिंग-पीडीएफ परीक्षण survey.description=Stirling-PDF has no tracking so we want to hear from our users to improve Stirling-PDF! -survey.changes=Stirling-PDF has changed since the last survey! To find out more please check our blog post here: -survey.changes2=With these changes we are getting paid business support and funding +survey.changes=अंतिम परीक्षण के बाद स्टार्लिंग-पीडीएफ में कई बदलाव हो गए! अधिक जानने के लिए यहाँ हमारे ब्लॉग पोस्ट का प्रयास करें: +survey.changes2=इन बदलावों से हम अपने व्यवसाय सहायता और जैकड़ की मिलान पाने की कुछ आशा रख रहे हैं survey.please=Please consider taking our survey! -survey.disabled=(Survey popup will be disabled in following updates but available at foot of page) -survey.button=Take Survey -survey.dontShowAgain=Don't show again +survey.disabled=(अपडेटों के बाद स्क्वायर पपपल अक्सर निष्क्रिय होगा, लेकिन पृष्ठ की तल उस पर उपलब्ध होगा) +survey.button=परीक्षण करें +survey.dontShowAgain=मुद्रण फ्लास्क से नहीं मिलाएं #error -error.sorry=Sorry for the issue! -error.needHelp=Need help / Found an issue? -error.contactTip=If you're still having trouble, don't hesitate to reach out to us for help. You can submit a ticket on our GitHub page or contact us through Discord: -error.404.head=404 - Page Not Found | Oops, we tripped in the code! -error.404.1=We can't seem to find the page you're looking for. -error.404.2=Something went wrong -error.github=Submit a ticket on GitHub -error.showStack=Show Stack Trace -error.copyStack=Copy Stack Trace -error.githubSubmit=GitHub - Submit a ticket -error.discordSubmit=Discord - Submit Support post +error.sorry=अनुभव में विफलता के लिए खेद होता है! +error.needHelp=मदद की जरूरत है / सहायता पानी पाया? +error.contactTip=अगर आप भी समस्याओं के साथ बच रहे हैं, तो हमें मदद प्राप्त करने के लिए निष्क्रियता न करके अपनी सहायता की मुद्दों को भेज सकते हैं. आप GitHub पेज पर टिकट भेज सकते हैं या Discord ग्रुप में हमसे संपर्क कर सकते हैं: +error.404.head=404 - पृष्ठ नहीं पाया | तो, कोड में कुछ गलती हुई! +error.404.1=मेहनदरी से, आप खोज रहे पृष्ठ नहीं पाया जा सकता. +error.404.2=कुछ गलती हुई. +error.github=GitHub पर टिकट भेजें +error.showStack=स्टैक ट्रेस को दिखाएं +error.copyStack=स्टैक ट्रेस कopiए +error.githubSubmit=GitHub - टिकट पहुँचाओ +error.discordSubmit=Discord - समर्थन पोस्ट पोस्ट करें #remove-image -removeImage.title=Remove image -removeImage.header=Remove image -removeImage.removeImage=Remove image -removeImage.submit=Remove image - - -splitByChapters.title=Split PDF by Chapters -splitByChapters.header=Split PDF by Chapters -splitByChapters.bookmarkLevel=Bookmark Level -splitByChapters.includeMetadata=Include Metadata -splitByChapters.allowDuplicates=Allow Duplicates -splitByChapters.desc.1=This tool splits a PDF file into multiple PDFs based on its chapter structure. -splitByChapters.desc.2=Bookmark Level: Choose the level of bookmarks to use for splitting (0 for top-level, 1 for second-level, etc.). -splitByChapters.desc.3=Include Metadata: If checked, the original PDF's metadata will be included in each split PDF. -splitByChapters.desc.4=Allow Duplicates: If checked, allows multiple bookmarks on the same page to create separate PDFs. -splitByChapters.submit=Split PDF +removeImage.title=इंजाइम हटाएं +removeImage.header=इंजाइम हटाएं +removeImage.removeImage=इंजाइम हटाएं +removeImage.submit=इंजाइम हटाएं +splitByChapters.title=पीडीएफ को अध्यायों द्वारा भागों में बाटें +splitByChapters.header=पीडीएफ को अध्यायों द्वारा भागों में बाटें +splitByChapters.bookmarkLevel=लेमैक्स स्तर +splitByChapters.includeMetadata=मीटाडेटा को शामिल करें +splitByChapters.allowDuplicates=डबल्स अनुमति दें +splitByChapters.desc.1=यह यंकल सिपटे एक पीडीएफ फाइल को अपनी अध्याय संरचना के आधार पर बहुतांश नेट्स में विभाजित करता है. +splitByChapters.desc.2=लेमैक्स स्तर: विभाजन के लिए उपयोग की गई लेमैक्स स्तर चुनें (0 टॉप-लेवल, 1 दूसरा-लेवल, इतर जैसे). +splitByChapters.desc.3=मॉडेटरेट का शामिल करें: यदि सत्यापित किया जाता है, प्रारंभिक PDF की मॉडेटरेट को प्रत्येक विभाग PDF में शामिल किया जाएगा। +splitByChapters.desc.4=यादृच्छिक पुनरावृत्ति अनुमोदित: यदि सत्यापित किया जाता है, एक ही पेज पर दोहरे मूल्यांकन पब्लिक पीड़एफ बनाने की संभावना देता है। +splitByChapters.submit=PDF विभाजित diff --git a/src/main/resources/messages_hr_HR.properties b/src/main/resources/messages_hr_HR.properties index aa0cd65cc..61492a91a 100644 --- a/src/main/resources/messages_hr_HR.properties +++ b/src/main/resources/messages_hr_HR.properties @@ -3,8 +3,8 @@ ########### # the direction that the language is written (ltr = left to right, rtl = right to left) language.direction=ltr -addPageNumbers.fontSize=Font Size -addPageNumbers.fontName=Font Name +addPageNumbers.fontSize=Veličina pisma +addPageNumbers.fontName=Ime pisma pdfPrompt=Odaberi PDF(ove) multiPdfPrompt=Odaberi PDF-ove (2+) multiPdfDropPrompt=Odaberi (ili povuci i ispusti) sve potrebne PDF-ove @@ -27,7 +27,7 @@ bored=Dosađujete se čekajući? alphabet=Abeceda downloadPdf=Preuzmi PDF text=Tekst -font=Font +font=Pismo selectFillter=-- Odaberi -- pageNum=Broj stranice sizes.small=Malo @@ -56,12 +56,12 @@ userNotFoundMessage=Korisnik nije pronađen. incorrectPasswordMessage=Kriva zaporka. usernameExistsMessage=Korisničko ime već postoji invalidUsernameMessage=Nevažeće korisničko ime, korisničko ime može sadržavati samo slova, brojke i sljedeće posebne znakove @._+- ili mora biti važeća adresa e-pošte. -invalidPasswordMessage=The password must not be empty and must not have spaces at the beginning or end. -confirmPasswordErrorMessage=New Password and Confirm New Password must match. +invalidPasswordMessage=Lozinka ne smije biti prazna i ne smije počinjati ni završavati sa razmakom. +confirmPasswordErrorMessage=Nova lozinka i potvrda nove lozinke moraju biti identične. deleteCurrentUserMessage=Nije moguće izbrisati trenutno prijavljenog korisnika. deleteUsernameExistsMessage=Korisničko ime ne postoji i ne može se izbrisati. downgradeCurrentUserMessage=Nije moguće vratiti unazad ulogu trenutnog korisnika -disabledCurrentUserMessage=The current user cannot be disabled +disabledCurrentUserMessage=Trenutni korisnik ne može biti onemogućen downgradeCurrentUserLongMessage=Nije moguće vratiti unazad ulogu trenutnog korisnika. Dakle, trenutni korisnik neće biti prikazan. userAlreadyExistsOAuthMessage=Korisnik već postoji kao OAuth2 korisnik. userAlreadyExistsWebMessage=Korisnik već postoji kao web korisnik. @@ -75,16 +75,18 @@ visitGithub=Posjeti Github Repository donate=Doniraj color=Boja sponsor=Sponzor -info=Info +info=Informacije pro=Pro -page=Page -pages=Pages +page=Stranica +pages=Stranice +loading=Učitavanje... +addToDoc=Dodaj u dokument -legal.privacy=Privacy Policy -legal.terms=Terms and Conditions -legal.accessibility=Accessibility -legal.cookie=Cookie Policy -legal.impressum=Impressum +legal.privacy=Politika privatnosti +legal.terms=Uspe sodržine +legal.accessibility=Dostupnost +legal.cookie=Politika kolačića +legal.impressum=Vedro ishoda ############### # Pipeline # @@ -96,7 +98,7 @@ pipeline.defaultOption=Prilagođeno pipeline.submitButton=Pošalji pipeline.help=Pipeline Pomoć pipeline.scanHelp=Pomoć za skeniranje mapa -pipeline.deletePrompt=Are you sure you want to delete pipeline +pipeline.deletePrompt=Jeste li sigurni da želite obrisati pipeline? ###################### # Pipeline Options # @@ -114,21 +116,21 @@ pipelineOptions.validateButton=Potvrdi ######################## # ENTERPRISE EDITION # ######################## -enterpriseEdition.button=Upgrade to Pro -enterpriseEdition.warning=This feature is only available to Pro users. -enterpriseEdition.yamlAdvert=Stirling PDF Pro supports YAML configuration files and other SSO features. -enterpriseEdition.ssoAdvert=Looking for more user management features? Check out Stirling PDF Pro +enterpriseEdition.button=Ažurirajte na Pro +enterpriseEdition.warning=Ova funkcija je dostupna samo pro korisnicima. +enterpriseEdition.yamlAdvert=Stirling PDF Pro podrzava konfiguiracione datoteke u formati YAML i druga osobine SSO. +enterpriseEdition.ssoAdvert=Tražite još funkcija za upravljanje korisnicima? Razmotrite Stirling PDF Pro ################# # Analytics # ################# -analytics.title=Do you want make Stirling PDF better? -analytics.paragraph1=Stirling PDF has opt in analytics to help us improve the product. We do not track any personal information or file contents. -analytics.paragraph2=Please consider enabling analytics to help Stirling-PDF grow and to allow us to understand our users better. -analytics.enable=Enable analytics -analytics.disable=Disable analytics -analytics.settings=You can change the settings for analytics in the config/settings.yml file +analytics.title=Želite li da stvarate Stirling PDF bolji? +analytics.paragraph1=Stirling PDF ima uključene analitike koje nam pomažu da proizvod poboljšamo. Niste pratili nikakva osobna informacija ni sadržaj datoteka. +analytics.paragraph2=Razmotrite omogućivanje analitičkih podataka kako biste stvorili Stirling-PDF veće i da bismo bolje razumeli naših korisnika. +analytics.enable=Omogući analitike +analytics.disable=Onemogući analitike +analytics.settings=Možete promijeniti postavke za analitike u datoteci config/settings.yml ############# # NAVBAR # @@ -145,7 +147,7 @@ navbar.sections.convertFrom=Pretvori iz PDF navbar.sections.security=Potpis & sigurnost navbar.sections.advance=Napredno navbar.sections.edit=Pregled & Uređivanje -navbar.sections.popular=Popular +navbar.sections.popular=Popularno ############# # SETTINGS # @@ -202,9 +204,9 @@ adminUserSettings.header=Postavka kontrole korisnika za administratora adminUserSettings.admin=Administrator adminUserSettings.user=Korisnik adminUserSettings.addUser=Dodaj novog korisnika -adminUserSettings.deleteUser=Delete User -adminUserSettings.confirmDeleteUser=Should the user be deleted? -adminUserSettings.confirmChangeUserStatus=Should the user be disabled/enabled? +adminUserSettings.deleteUser=Obriši korisnika +adminUserSettings.confirmDeleteUser=Treba li obračunati ovaj korisnika? +adminUserSettings.confirmChangeUserStatus=Treba li isključiti/uključiti ovog korisnika? adminUserSettings.usernameInfo=Korisničko ime može sadržavati samo slova, brojke i sljedeće posebne znakove @._+- ili mora biti važeća adresa e-pošte. adminUserSettings.roles=Uloge adminUserSettings.role=Uloga @@ -218,32 +220,33 @@ adminUserSettings.forceChange=Prisiliti korisnika da promijeni lozinku prilikom adminUserSettings.submit=Spremi korisnika adminUserSettings.changeUserRole=Promijenite korisničku ulogu adminUserSettings.authenticated=Autentificirano -adminUserSettings.editOwnProfil=Edit own profile -adminUserSettings.enabledUser=enabled user -adminUserSettings.disabledUser=disabled user -adminUserSettings.activeUsers=Active Users: -adminUserSettings.disabledUsers=Disabled Users: -adminUserSettings.totalUsers=Total Users: -adminUserSettings.lastRequest=Last Request +adminUserSettings.editOwnProfil=Uredi vlastit profil +adminUserSettings.enabledUser=Omotljiv korisnik +adminUserSettings.disabledUser=Onemogućen korisnik +adminUserSettings.activeUsers=Aktivni korisnici: +adminUserSettings.disabledUsers=Isključeni korisnici: +adminUserSettings.totalUsers=Ukupan broj korisnika: +adminUserSettings.lastRequest=Zadnji zahtjev database.title=Database Import/Export database.header=Database Import/Export -database.fileName=File Name -database.creationDate=Creation Date -database.fileSize=File Size -database.deleteBackupFile=Delete Backup File -database.importBackupFile=Import Backup File -database.downloadBackupFile=Download Backup File -database.info_1=When importing data, it is crucial to ensure the correct structure. If you are unsure of what you are doing, seek advice and support from a professional. An error in the structure can cause application malfunctions, up to and including the complete inability to run the application. -database.info_2=The file name does not matter when uploading. It will be renamed afterward to follow the format backup_user_yyyyMMddHHmm.sql, ensuring a consistent naming convention. -database.submit=Import Backup -database.importIntoDatabaseSuccessed=Import into database successed +database.fileName=Ime datoteke +database.creationDate=Datum stvaranja +database.fileSize=Veličina datoteke +database.deleteBackupFile=Obriši zadao sažeto datoteke +database.importBackupFile=Uvezi sažeto datoteku +database.downloadBackupFile=Preuzmi sažeto datoteku +database.info_1=Kada uvažavate podatke, je ključno sigurno imati ispravan struktur. Ako niste sigurni šta uradite, tražite savjet i podršku od professionala. Greška u strukturi može uzrokovati greške u aplikaciji, do i uključujući potpunu nevjerojatnost funkcionalnosti aplikacije. +database.info_2=Ime datoteke nije relevantno prijevezi. Buduće bit će ponovno oznaceno za određeni format backup_user_yyyyMMddHHmm.sql, čime se osigurava konzistentna nazivnica. +database.submit=Uvezi sažeto +database.importIntoDatabaseSuccessed=Uvez u bazu podataka uspio database.fileNotFound=File not Found -database.fileNullOrEmpty=File must not be null or empty +database.fileNullOrEmpty=Datoteka ne smije biti null ili prazna database.failedImportFile=Failed Import File -session.expired=Your session has expired. Please refresh the page and try again. +session.expired=Vaš sesija je istekla. Molim vas da osvježite stranicu i pokušate ponovno. +session.refreshPage=Refresh Page ############# # HOME-PAGE # @@ -283,7 +286,7 @@ pdfToImage.tags=konverzija,img,jpg,slika,foto home.pdfOrganiser.title=Organiziranje home.pdfOrganiser.desc=Uklonite/preuredite stranice bilo kojim redoslijedom -pdfOrganiser.tags=duplex,even,odd,sort,move +pdfOrganiser.tags=dvostrana,parne,neparni,prikupljanje,prebacivanje home.addImage.title=Dodaj sliku @@ -347,7 +350,7 @@ PDFToPresentation.tags=slajdovi,prikaz,office,microsoft home.PDFToText.title=PDF u RTF (Tekst) home.PDFToText.desc=Pretvorite PDF u tekst ili RTF format -PDFToText.tags=richformat,richtextformat,rich text format +PDFToText.tags=bojaformata,tjedentextformat,sadržanotekstformat home.PDFToHTML.title=PDF u HTML home.PDFToHTML.desc=Pretvorite PDF u HTML format @@ -390,9 +393,9 @@ home.certSign.title=Potpišite s certifikatom home.certSign.desc=Potpisuje PDF s certifikatom/ključem (PEM/P12) certSign.tags=autentifikacija,PEM,P12,zvanično,šifriranje -home.removeCertSign.title=Remove Certificate Sign -home.removeCertSign.desc=Remove certificate signature from PDF -removeCertSign.tags=authenticate,PEM,P12,official,decrypt +home.removeCertSign.title=Ukloni potpis sertifikata +home.removeCertSign.desc=Uklonite potpis sertifikata iz PDF-a +removeCertSign.tags=autentičiranje,PEM,P12,djelomičan dešifriranje home.pageLayout.title=Izgled s više stranica home.pageLayout.desc=Spojite više stranica PDF dokumenta u jednu stranicu @@ -498,33 +501,33 @@ home.BookToPDF.title=Book u PDF home.BookToPDF.desc=Pretvara format knjige/stripa u PDF format pomoću calibre BookToPDF.tags=Knjiga,Strip,Calibre,Pretvori,manga,amazon,kindle -home.removeImagePdf.title=Remove image -home.removeImagePdf.desc=Remove image from PDF to reduce file size -removeImagePdf.tags=Remove Image,Page operations,Back end,server side +home.removeImagePdf.title=Ukloni sliku +home.removeImagePdf.desc=Ukloni sliku iz PDF-a kako bi se smanjio veličina datoteke +removeImagePdf.tags=Ukloni sliku, Rad sa stranicama, Back end, server strana -home.splitPdfByChapters.title=Split PDF by Chapters -home.splitPdfByChapters.desc=Split a PDF into multiple files based on its chapter structure. -splitPdfByChapters.tags=split,chapters,bookmarks,organize +home.splitPdfByChapters.title=Podijeli PDF prema glavama +home.splitPdfByChapters.desc=Podijeli PDF na više datoteka prema njegovom strukturnom obliku glava. +splitPdfByChapters.tags=podjela, glave, markere, organizacija #replace-invert-color replace-color.title=Replace-Invert-Color -replace-color.header=Replace-Invert Color PDF +replace-color.header=Zameni-inverziranje boja u PDF-u home.replaceColorPdf.title=Replace and Invert Color -home.replaceColorPdf.desc=Replace color for text and background in PDF and invert full color of pdf to reduce file size -replaceColorPdf.tags=Replace Color,Page operations,Back end,server side -replace-color.selectText.1=Replace or Invert color Options -replace-color.selectText.2=Default(Default high contrast colors) -replace-color.selectText.3=Custom(Customized colors) -replace-color.selectText.4=Full-Invert(Invert all colors) -replace-color.selectText.5=High contrast color options -replace-color.selectText.6=white text on black background -replace-color.selectText.7=Black text on white background -replace-color.selectText.8=Yellow text on black background -replace-color.selectText.9=Green text on black background -replace-color.selectText.10=Choose text Color -replace-color.selectText.11=Choose background Color -replace-color.submit=Replace +home.replaceColorPdf.desc=Zamenite boju teksta i pozadine u PDF-u te inverzirajte cijeli PDF kako bi se smanjila veličina datoteke. +replaceColorPdf.tags=Zameni boju, Rad sa stranicama, Back end, server strana +replace-color.selectText.1=Optije za zamenu ili inverziranje boja +replace-color.selectText.2=Standardno (standarske visoko kontrastne boje) +replace-color.selectText.3=Napčno (prilagođene boje) +replace-color.selectText.4=Cijelo-inverzirajte (inverzirajte sve boje) +replace-color.selectText.5=Optije visoko kontrastne boje +replace-color.selectText.6=Crna tekst na bijelu pozadini +replace-color.selectText.7=Bijeli tekst na crvenoj pozadini +replace-color.selectText.8=Žutni tekst na crnoj pozadini +replace-color.selectText.9=Zeleni tekst na crnoj pozadini +replace-color.selectText.10=Izaberite boju teksta +replace-color.selectText.11=Izaberite pozadinu boju +replace-color.submit=Zamijeni @@ -543,17 +546,17 @@ login.locked=Vaš račun je zaključan. login.signinTitle=Molimo vas da se prijavite login.ssoSignIn=Prijavite se putem jedinstvene prijave login.oauth2AutoCreateDisabled=OAUTH2 automatsko kreiranje korisnika je onemogućeno -login.oauth2AdminBlockedUser=Registration or logging in of non-registered users is currently blocked. Please contact the administrator. +login.oauth2AdminBlockedUser=Registracija ili prijava nekadreguiranih korisnika trenutno su blokirane. Molimo Vas da kontaktirate administratora. login.oauth2RequestNotFound=Zahtjev za autorizaciju nije pronađen login.oauth2InvalidUserInfoResponse=Nevažeće informacije o korisniku login.oauth2invalidRequest=Neispravan zahtjev login.oauth2AccessDenied=Pristup odbijen login.oauth2InvalidTokenResponse=Nevažeći odgovor tokena login.oauth2InvalidIdToken=Nevažeći ID token -login.userIsDisabled=User is deactivated, login is currently blocked with this username. Please contact the administrator. -login.alreadyLoggedIn=You are already logged in to -login.alreadyLoggedIn2=devices. Please log out of the devices and try again. -login.toManySessions=You have too many active sessions +login.userIsDisabled=Korisnik je deaktiviran, prijava sa ovim korisničkim imenom je trenutno zakazana. Molimo Vas da kontaktirate administratorske osobe. +login.alreadyLoggedIn=Već ste se prijavili na +login.alreadyLoggedIn2=ure. Odjavite se s ure i pokušajte ponovo. +login.toManySessions=Imate preko mrežne sesije aktivnih #auto-redact autoRedact.title=Automatsko uređivanje @@ -728,7 +731,7 @@ pageLayout.submit=Potvrdi scalePages.title=Podesite veličinu stranice scalePages.header=Podesite veličinu stranice scalePages.pageSize=Veličina stranice dokumenta. -scalePages.keepPageSize=Original Size +scalePages.keepPageSize=Originalna veličina scalePages.scaleFactor=Razina zumiranja (obrezivanje) stranice. scalePages.submit=Potvrdi @@ -748,14 +751,15 @@ certSign.showSig=Prikaži potpis certSign.reason=Razlog certSign.location=Mjesto certSign.name=Ime +certSign.showLogo=Prikaži logo certSign.submit=Potpiši PDF #removeCertSign -removeCertSign.title=Remove Certificate Signature -removeCertSign.header=Remove the digital certificate from the PDF -removeCertSign.selectPDF=Select a PDF file: -removeCertSign.submit=Remove Signature +removeCertSign.title=Ukloni digitalno potpisano dokazilo +removeCertSign.header=Uklonite digitalni potpis iz PDF-a +removeCertSign.selectPDF=Odaberite datoteku PDF: +removeCertSign.submit=Ukloni potpisi #removeBlanks @@ -777,11 +781,14 @@ removeAnnotations.submit=Ukloni #compare compare.title=Uporedite compare.header=Usporedite PDF-ove -compare.highlightColor.1=Highlight Color 1: -compare.highlightColor.2=Highlight Color 2: +compare.highlightColor.1=Boja osvetljenja 1: +compare.highlightColor.2=Boja osvetljenja 2: compare.document.1=Dokument 1 compare.document.2=Dokument 2 compare.submit=Uporedi +compare.complex.message=Jedan ili oba unesena dokumenta su veliki datoteke, to može smanjiti preciznost usporedbi +compare.large.file.message=Jedan ili oba unesena dokumenta su prevelike za obradu +compare.no.text.message=Jedan ili oba odabrana PDF-a nema tekst. Odaberite PDF-ove s tekstom za usporedbu. #BookToPDF BookToPDF.title=Knjige i stripovi u PDF @@ -804,6 +811,11 @@ sign.draw=Nacrtaj potpis sign.text=Tekstualni unos sign.clear=Obriši sign.add=Dodaj +sign.saved=Sacuvane potpisne oznake +sign.save=Sačuvaj potpisnu oznaku +sign.personalSigs=Osobni potpisi +sign.sharedSigs=Dijeljeni potpisi +sign.noSavedSigs=Nema sacuvanih potpisa pronađenih #repair @@ -830,7 +842,7 @@ ScannerImageSplit.selectText.7=Minimalna konturna površina: ScannerImageSplit.selectText.8=Postavlja minimalni prag površine konture za fotografiju ScannerImageSplit.selectText.9=Veličina obruba: ScannerImageSplit.selectText.10=Postavlja veličinu obruba koji se dodaje i uklanja kako bi se spriječili bijeli obrubi u ispisu (zadano: 1). -ScannerImageSplit.info=Python is not installed. It is required to run. +ScannerImageSplit.info=Python nije instaliran. Treba je za izvršenje. #OCR @@ -857,7 +869,7 @@ ocr.submit=Obradi PDF sa OCR-om extractImages.title=Ekstrakt slika extractImages.header=Ekstrakt slika extractImages.selectText=Odaberite format slike za pretvaranje izdvojenih slika -extractImages.allowDuplicates=Save duplicate images +extractImages.allowDuplicates=Sačuvaj duplikate slike extractImages.submit=Izdvajanje @@ -895,7 +907,7 @@ merge.title=Spajanje merge.header=Spajanje više PDF-ova (2+) merge.sortByName=Poredaj po imenu merge.sortByDate=Poredaj po datumu -merge.removeCertSign=Remove digital signature in the merged file? +merge.removeCertSign=Ukloniti digitalni potpis u kombiniranom datoteku? merge.submit=Spajanje @@ -913,7 +925,7 @@ pdfOrganiser.mode.6=Par-Nepar Podjela pdfOrganiser.mode.7=Ukloni Prvu pdfOrganiser.mode.8=Ukloni Zadnju pdfOrganiser.mode.9=Ukloni Prvu i Zadnju -pdfOrganiser.mode.10=Odd-Even Merge +pdfOrganiser.mode.10=Neparno-parna kombinacija pdfOrganiser.placeholder=(npr. 1,3,2 ili 4-8,2,10-12 ili 2n-1) @@ -921,7 +933,14 @@ pdfOrganiser.placeholder=(npr. 1,3,2 ili 4-8,2,10-12 ili 2n-1) multiTool.title=PDF Višenamjenski alat multiTool.header=PDF Višenamjenski alat multiTool.uploadPrompts=Naziv datoteke - +multiTool.selectAll=Select All +multiTool.deselectAll=Deselect All +multiTool.selectPages=Page Select +multiTool.selectedPages=Selected Pages +multiTool.page=Page +multiTool.deleteSelected=Delete Selected +multiTool.downloadAll=Export +multiTool.downloadSelected=Export Selected #view pdf viewPdf.title=Pogledaj viewPdf.header=Pogledaj PDF @@ -982,7 +1001,7 @@ pdfToImage.color=Boja pdfToImage.grey=Sivi tonovi pdfToImage.blackwhite=Crno-bijelo (mogu se izgubiti podaci!) pdfToImage.submit=Pretvori -pdfToImage.info=Python is not installed. Required for WebP conversion. +pdfToImage.info=Python nije instaliran. Treba je za konverziju na WebP. #addPassword @@ -1019,7 +1038,7 @@ watermark.selectText.6=Visina razmaka (Razmak između svakog vodenog žiga okomi watermark.selectText.7=Neprozirnost (0% - 100%): watermark.selectText.8=Vrsta vodenog žiga: watermark.selectText.9=Slika vodenog žiga: -watermark.selectText.10=Convert PDF to PDF-Image +watermark.selectText.10=Konvertiraj PDF u PDF-Sliku watermark.submit=Dodaj vodeni žig watermark.type.1=Tekst watermark.type.2=Slika @@ -1076,7 +1095,7 @@ pdfToPDFA.credit=Ova usluga koristi ghostscript za PDF/A pretvorbu pdfToPDFA.submit=Pretvoriti pdfToPDFA.tip=Trenutno ne radi za više unosa odjednom pdfToPDFA.outputFormat=Izlazni format -pdfToPDFA.pdfWithDigitalSignature=The PDF contains a digital signature. This will be removed in the next step. +pdfToPDFA.pdfWithDigitalSignature=PDF sadrži digitalni potpis. U sledećem koraku će biti uklonjen. #PDFToWord @@ -1178,15 +1197,15 @@ licenses.version=Verzija licenses.license=Licenca #survey -survey.nav=Survey -survey.title=Stirling-PDF Survey -survey.description=Stirling-PDF has no tracking so we want to hear from our users to improve Stirling-PDF! -survey.changes=Stirling-PDF has changed since the last survey! To find out more please check our blog post here: -survey.changes2=With these changes we are getting paid business support and funding +survey.nav=Upitnica +survey.title=Stirling-PDF Upitnica +survey.description=Stirling-PDF nema praćenje pa želimo svesnost korisnika da bi poboljšali Stirling-PDF! +survey.changes=Stirling-PDF je promenjen od poslednje upitnice! Za više informacija, proverite naš blog ovdje: +survey.changes2=S ovim promenama dobivamo platnu podršku i financiranje poslovnim aktivnostima survey.please=Please consider taking our survey! -survey.disabled=(Survey popup will be disabled in following updates but available at foot of page) -survey.button=Take Survey -survey.dontShowAgain=Don't show again +survey.disabled=(Upitnica popup će biti onemogućena u sljedećim ažuracanjima aliće se nalaziti na dnu stranice) +survey.button=Izvrsi upitnicu +survey.dontShowAgain=Ne prikazujući ponovo #error @@ -1204,21 +1223,19 @@ error.discordSubmit=Discord - Pošalji objavu podrške #remove-image -removeImage.title=Remove image -removeImage.header=Remove image -removeImage.removeImage=Remove image -removeImage.submit=Remove image - - -splitByChapters.title=Split PDF by Chapters -splitByChapters.header=Split PDF by Chapters -splitByChapters.bookmarkLevel=Bookmark Level -splitByChapters.includeMetadata=Include Metadata -splitByChapters.allowDuplicates=Allow Duplicates -splitByChapters.desc.1=This tool splits a PDF file into multiple PDFs based on its chapter structure. -splitByChapters.desc.2=Bookmark Level: Choose the level of bookmarks to use for splitting (0 for top-level, 1 for second-level, etc.). -splitByChapters.desc.3=Include Metadata: If checked, the original PDF's metadata will be included in each split PDF. -splitByChapters.desc.4=Allow Duplicates: If checked, allows multiple bookmarks on the same page to create separate PDFs. -splitByChapters.submit=Split PDF +removeImage.title=Ukloni sliku +removeImage.header=Ukloni sliku +removeImage.removeImage=Ukloni sliku +removeImage.submit=Izbriši sliku +splitByChapters.title=Podijeli PDF naoglazdene glave +splitByChapters.header=Podijeli PDF naoglazdene glave +splitByChapters.bookmarkLevel=Nivo oznaka +splitByChapters.includeMetadata=Uključi metapodatke +splitByChapters.allowDuplicates=Dopuštaj duplikate +splitByChapters.desc.1=Ova alatka podijeli PDF datoteku u više PDFa na teme njene strukture glava. +splitByChapters.desc.2=Nivo oznaka: Odaberite nivo oznaka koji će se koristiti za podjelu (0 za prvi nivo, 1 za drugi nivo itd.). +splitByChapters.desc.3=Uključi metapodatke: Ako je pokušano, metapodaci iz originalne PDF datoteke će biti uključeni u svaku podijeljenu PDF datoteku. +splitByChapters.desc.4=Dopuštaj duplikate: Ako je ova opcija zaštićena, dozvoljava se da se na istoj strani mogu stvoriti posebne PDF datoteke s više oznaka. +splitByChapters.submit=Podijeli PDF diff --git a/src/main/resources/messages_hu_HU.properties b/src/main/resources/messages_hu_HU.properties index c53e52e1d..6c53aee5b 100644 --- a/src/main/resources/messages_hu_HU.properties +++ b/src/main/resources/messages_hu_HU.properties @@ -3,8 +3,8 @@ ########### # the direction that the language is written (ltr = left to right, rtl = right to left) language.direction=ltr -addPageNumbers.fontSize=Font Size -addPageNumbers.fontName=Font Name +addPageNumbers.fontSize=Betűméret +addPageNumbers.fontName=Betűtípus pdfPrompt=Válasszon PDF-fájlokat multiPdfPrompt=Válasszon PDF-fájlokat (2+) multiPdfDropPrompt=Válassza ki (vagy húzza ide) az összes szükséges PDF-fájlt @@ -12,17 +12,17 @@ imgPrompt=Válasszon képeket genericSubmit=Beküldés processTimeWarning=Figyelmeztetés: Ez a folyamat akár egy percig is eltarthat a fájlmérettől függően pageOrderPrompt=Egyedi oldalsorrend (Adjon meg vesszővel elválasztott oldalszámokat vagy függvényeket, például 2n+1): -pageSelectionPrompt=Custom Page Selection (Enter a comma-separated list of page numbers 1,5,6 or Functions like 2n+1) : +pageSelectionPrompt=Egyedi oldal kiválasztás (Virtuális, hússzögletes lista formátumban írja meg a választott oldalak számát, például 1,5,6 vagy függvények formában: 2n+1): goToPage=Ugrás true=Igaz false=Hamis unknown=Ismeretlen save=Mentés -saveToBrowser=Save to Browser +saveToBrowser=Mentés bölcskébe close=Bezárás filesSelected=kiválasztott fájlok noFavourites=Nincs hozzáadva kedvenc -downloadComplete=Download Complete +downloadComplete=Letöltés befejezve bored=Unatkozol? alphabet=Ábécé downloadPdf=PDF letöltése @@ -46,113 +46,115 @@ red=Piros green=Zöld blue=Kék custom=Egyedi... -WorkInProgess=Work in progress, May not work or be buggy, Please report any problems! -poweredBy=Powered by -yes=Yes -no=No +WorkInProgess=Munka folyamatban, lehetséges hibával működhet, kérjük jelentse meg bármilyen problémát! +poweredBy=Hozzávalója: +yes=Igen +no=Nem changedCredsMessage=A hitelek megváltoztak! notAuthenticatedMessage=Felhasználó nincs hitelesítve. userNotFoundMessage=A felhasználó nem található. incorrectPasswordMessage=A jelenlegi jelszó helytelen. usernameExistsMessage=Az új felhasználónév már létezik. -invalidUsernameMessage=Invalid username, username can only contain letters, numbers and the following special characters @._+- or must be a valid email address. -invalidPasswordMessage=The password must not be empty and must not have spaces at the beginning or end. -confirmPasswordErrorMessage=New Password and Confirm New Password must match. -deleteCurrentUserMessage=Cannot delete currently logged in user. -deleteUsernameExistsMessage=The username does not exist and cannot be deleted. +invalidUsernameMessage=Érvénytelen felhasználónév, a felhasználónév csak betűk, számokat és az alábbi kisebb karaktereket tartalmazhat @._+- vagy egy érvényes e-mail címnek kell lennie. +invalidPasswordMessage=A jelszó nem lehet üres és nem lehet teljesen tartalmazni háttérspácseket. +confirmPasswordErrorMessage=Új jelszó és Megerősítési új jelszó egyeztetése. +deleteCurrentUserMessage=Jelenleg bejelentkezett felhasználót nem lehet törölni. +deleteUsernameExistsMessage=A felhasználónév nem létezik és nem lehet törlésre került. downgradeCurrentUserMessage=A jelenlegi felhasználó szerepkörét nem lehet visszaminősíteni -disabledCurrentUserMessage=The current user cannot be disabled +disabledCurrentUserMessage=Jelenleg bejelentkezett felhasználó nem lehet letiltva. downgradeCurrentUserLongMessage=Az aktuális felhasználó szerepkörét nem lehet visszaminősíteni. Ezért az aktuális felhasználó nem jelenik meg. -userAlreadyExistsOAuthMessage=The user already exists as an OAuth2 user. -userAlreadyExistsWebMessage=The user already exists as an web user. -error=Error -oops=Oops! -help=Help -goHomepage=Go to Homepage -joinDiscord=Join our Discord server -seeDockerHub=See Docker Hub -visitGithub=Visit Github Repository -donate=Donate -color=Color -sponsor=Sponsor -info=Info -pro=Pro -page=Page -pages=Pages +userAlreadyExistsOAuthMessage=Az ezer hitelesítő szolgáltatás felhasználó ismertetve van. +userAlreadyExistsWebMessage=A web felhasználó ismertetve van. +error=Hiba +oops=Egy gond történt! +help=Segítség +goHomepage=Kezdőoldal megnyitása +joinDiscord=Jönj hozzá a Discord-szervert +seeDockerHub=Docker Hub-on látni +visitGithub=GitHub Repository megtekintése +donate=Szerzés működéséhez segítségnyújtás +color=Szín +sponsor=Támogatók bejegyzése +info=Információ +pro=Professionális +page=Oldal +pages=Oldalak +loading=Betöltés... +addToDoc=Hozzáadás dokumentumba -legal.privacy=Privacy Policy -legal.terms=Terms and Conditions -legal.accessibility=Accessibility -legal.cookie=Cookie Policy -legal.impressum=Impressum +legal.privacy=Adatvédelmi nyilatkozat +legal.terms=Feltételek és feltételek +legal.accessibility=Elérhetőség +legal.cookie=Cukiernyomtatványi zászló +legal.impressum=Rendszerinformáció ############### # Pipeline # ############### -pipeline.header=Pipeline Menu (Beta) -pipeline.uploadButton=Upload Custom -pipeline.configureButton=Configure -pipeline.defaultOption=Custom -pipeline.submitButton=Submit -pipeline.help=Pipeline Help -pipeline.scanHelp=Folder Scanning Help -pipeline.deletePrompt=Are you sure you want to delete pipeline +pipeline.header=Pipelinenavigációs menü (betavizsgálat) +pipeline.uploadButton=Feltöltés +pipeline.configureButton=Konfigurálás +pipeline.defaultOption=Egyéni +pipeline.submitButton=Küldés +pipeline.help=Útmutató a pipelínhez +pipeline.scanHelp=Mappák lekérése útmutatása +pipeline.deletePrompt=Biztosan törölni szeretné az opciókat? ###################### # Pipeline Options # ###################### -pipelineOptions.header=Pipeline Configuration -pipelineOptions.pipelineNameLabel=Pipeline Name -pipelineOptions.saveSettings=Save Operation Settings -pipelineOptions.pipelineNamePrompt=Enter pipeline name here -pipelineOptions.selectOperation=Select Operation -pipelineOptions.addOperationButton=Add operation -pipelineOptions.pipelineHeader=Pipeline: -pipelineOptions.saveButton=Download -pipelineOptions.validateButton=Validate +pipelineOptions.header=Pipelín beállításai +pipelineOptions.pipelineNameLabel=Pipelín neve +pipelineOptions.saveSettings=Beállítások mentése +pipelineOptions.pipelineNamePrompt=Írd be a pipelín nevét ide +pipelineOptions.selectOperation=Művelet kiválasztása +pipelineOptions.addOperationButton=Művelet hozzáadása +pipelineOptions.pipelineHeader=Pipelín: +pipelineOptions.saveButton=Mentés +pipelineOptions.validateButton=Érvényesítés ######################## # ENTERPRISE EDITION # ######################## -enterpriseEdition.button=Upgrade to Pro -enterpriseEdition.warning=This feature is only available to Pro users. -enterpriseEdition.yamlAdvert=Stirling PDF Pro supports YAML configuration files and other SSO features. -enterpriseEdition.ssoAdvert=Looking for more user management features? Check out Stirling PDF Pro +enterpriseEdition.button=Növelje a személyrendszert PRO-re +enterpriseEdition.warning=Ez a funkció csak a PRO felhasználók számára érhető el. +enterpriseEdition.yamlAdvert=Stirling PDF PRO támogatja a YAML konfigurációs fájlokat és más SSO jellemzőket. +enterpriseEdition.ssoAdvert=Több felhasználókezelési funkcióra vár? Ismételje meg a figyalmazást az Stirling PDF PRO szolgáltatásaihoz. ################# # Analytics # ################# -analytics.title=Do you want make Stirling PDF better? -analytics.paragraph1=Stirling PDF has opt in analytics to help us improve the product. We do not track any personal information or file contents. -analytics.paragraph2=Please consider enabling analytics to help Stirling-PDF grow and to allow us to understand our users better. -analytics.enable=Enable analytics -analytics.disable=Disable analytics -analytics.settings=You can change the settings for analytics in the config/settings.yml file +analytics.title=Szeretnéd tetszésre módosítani a Stirling PDF-t? +analytics.paragraph1=A Stirling PDF szöveges adatokat jellemző integrációt teszi lehetővé, hogy javítsuk a terméket. Nem folytatjuk semmit sem a személyes információk vagy fájl tartalmakat. +analytics.paragraph2=Köszönjük tekintse meg az integrációt, ami segít a Stirling-PDF növekedésében és segítne megértenünk a felhasználóinkat jobban. +analytics.enable=Engedélyezze az analitikát +analytics.disable=Letiltja az analitikát +analytics.settings=A beállítások módosítása az analitikáért a config/settings.yml fájlban ############# # NAVBAR # ############# -navbar.favorite=Favorites +navbar.favorite=Kedvencek navbar.darkmode=Sötét mód -navbar.language=Languages +navbar.language=Nyelvek navbar.settings=Beállítások -navbar.allTools=Tools +navbar.allTools=Eszközök navbar.multiTool=Multi Tools -navbar.sections.organize=Organize -navbar.sections.convertTo=Convert to PDF -navbar.sections.convertFrom=Convert from PDF -navbar.sections.security=Sign & Security -navbar.sections.advance=Advanced -navbar.sections.edit=View & Edit -navbar.sections.popular=Popular +navbar.sections.organize=Összeállítás +navbar.sections.convertTo=Átalakítás PDF-be +navbar.sections.convertFrom=PDF-ből átalakítás +navbar.sections.security=Hitelesítés & Biztonság +navbar.sections.advance=Fogadott funkciók +navbar.sections.edit=Nézés és szerkesztés +navbar.sections.popular=Populáris ############# # SETTINGS # ############# settings.title=Beállítások settings.update=Frisítés elérhető -settings.updateAvailable={0} is the current installed version. A new version ({1}) is available. +settings.updateAvailable={0} az aktuális telepített verzió. Az újabb verzió ({1}) elérhető. settings.appVersion=App Verzió: settings.downloadOption.title=Válassza ki a letöltési lehetőséget (Egyetlen fájl esetén a nem tömörített letöltésekhez): settings.downloadOption.1=Nyissa meg ugyanabban az ablakban @@ -161,13 +163,13 @@ settings.downloadOption.3=Töltse le a fájlt settings.zipThreshold=Fájlok tömörítése, ha a letöltött fájlok száma meghaladja settings.signOut=Kijelentkezés settings.accountSettings=Fiókbeállítások -settings.bored.help=Enables easter egg game -settings.cacheInputs.name=Save form inputs -settings.cacheInputs.help=Enable to store previously used inputs for future runs +settings.bored.help=Easter Egg játék engedélyezése +settings.cacheInputs.name=Formulálapok mentése +settings.cacheInputs.help=Engedélyezve a korábban használt adatok tárolása a következő futásokhoz changeCreds.title=Hitelesítés megváltoztatása changeCreds.header=Frissítse fiókadatait -changeCreds.changePassword=You are using default login credentials. Please enter a new password +changeCreds.changePassword=Használja a szükséges bejelentkezési adatokat. Kérjen meg egy új jelszót. changeCreds.newUsername=Új felhasználónév changeCreds.oldPassword=Jelenlegi jelszó changeCreds.newPassword=Új jelszó @@ -202,48 +204,49 @@ adminUserSettings.header=Adminisztrátori Felhasználói Vezérlési Beállítá adminUserSettings.admin=Adminisztrátor adminUserSettings.user=Felhasználó adminUserSettings.addUser=Új felhasználó hozzáadása -adminUserSettings.deleteUser=Delete User -adminUserSettings.confirmDeleteUser=Should the user be deleted? -adminUserSettings.confirmChangeUserStatus=Should the user be disabled/enabled? -adminUserSettings.usernameInfo=Username can only contain letters, numbers and the following special characters @._+- or must be a valid email address. +adminUserSettings.deleteUser=Törlés felhasználó +adminUserSettings.confirmDeleteUser=A felhasználót töröljük? +adminUserSettings.confirmChangeUserStatus=Az állapot módosítása megfelelően? +adminUserSettings.usernameInfo=A felhasználónév csak betűk, számok és az alábbi speciális karakterek @._+- vagy egy érvényes e-mail-cím lehet. adminUserSettings.roles=Szerepek adminUserSettings.role=Szerep adminUserSettings.actions=Műveletek adminUserSettings.apiUser=Korlátozott API-felhasználó -adminUserSettings.extraApiUser=Additional Limited API User +adminUserSettings.extraApiUser=További korlátozott API felhasználó adminUserSettings.webOnlyUser=Csak webes felhasználó -adminUserSettings.demoUser=Demo User (No custom settings) -adminUserSettings.internalApiUser=Internal API User +adminUserSettings.demoUser=Demofelhasználó (nincs egyedi beállítás) +adminUserSettings.internalApiUser=Belső API felhasználó adminUserSettings.forceChange=Kényszerítse a felhasználót a felhasználónév/jelszó megváltoztatására bejelentkezéskor adminUserSettings.submit=Felhasználó mentése adminUserSettings.changeUserRole=Felhasználó szerepkörének módosítása -adminUserSettings.authenticated=Authenticated -adminUserSettings.editOwnProfil=Edit own profile -adminUserSettings.enabledUser=enabled user -adminUserSettings.disabledUser=disabled user -adminUserSettings.activeUsers=Active Users: -adminUserSettings.disabledUsers=Disabled Users: -adminUserSettings.totalUsers=Total Users: -adminUserSettings.lastRequest=Last Request +adminUserSettings.authenticated=Bejelentkezett +adminUserSettings.editOwnProfil=Saját profil szerkesztése +adminUserSettings.enabledUser=Engedélyezett felhasználó +adminUserSettings.disabledUser=Letiltott felhasználó +adminUserSettings.activeUsers=Aktív Felhasználók: +adminUserSettings.disabledUsers=Letiltott Felhasználók: +adminUserSettings.totalUsers=Összes Felhasználó: +adminUserSettings.lastRequest=Utolsó kérelem -database.title=Database Import/Export -database.header=Database Import/Export -database.fileName=File Name -database.creationDate=Creation Date -database.fileSize=File Size -database.deleteBackupFile=Delete Backup File -database.importBackupFile=Import Backup File -database.downloadBackupFile=Download Backup File -database.info_1=When importing data, it is crucial to ensure the correct structure. If you are unsure of what you are doing, seek advice and support from a professional. An error in the structure can cause application malfunctions, up to and including the complete inability to run the application. -database.info_2=The file name does not matter when uploading. It will be renamed afterward to follow the format backup_user_yyyyMMddHHmm.sql, ensuring a consistent naming convention. -database.submit=Import Backup -database.importIntoDatabaseSuccessed=Import into database successed +database.title=Adatbázis import/export +database.header=Adatbázis import/export +database.fileName=Fájlnév +database.creationDate=Létrehozás dátuma +database.fileSize=Fájlszámítás +database.deleteBackupFile=Visszaulasztó fájl törlése +database.importBackupFile=Bemérsz visszaulastó fájl +database.downloadBackupFile=Bemérő fájlet letöltés +database.info_1=A bemeneti adatok bemérésekor fontos, hogy az helyes struktúrát biztosítsa. Ha nem tudja mit csinál, kérjen támogatást egy szakembertől. Az erőforrás hibája okozhat alkalmazás-ismerséleti gondokat, és viszontig, hogy az alkalmazás teljesen nem fut. +database.info_2=A fájl neve nem jelent részt a feltöltés során. Később újra néven lesz átalakítva egy konzisztens nevésrendszert követve, a formátum: visszaulasztó_user_yyyyMMddHHmm.sql. +database.submit=Bemérsz visszaulastó fájl +database.importIntoDatabaseSuccessed=Adatbázisba importálva sikeresen database.fileNotFound=File not Found -database.fileNullOrEmpty=File must not be null or empty +database.fileNullOrEmpty=Fájlnull vagy üres nélkül nem lehet folytatni database.failedImportFile=Failed Import File -session.expired=Your session has expired. Please refresh the page and try again. +session.expired=A munkamenet letelezett. Frissítse a lapot és próbálkozzon újra. +session.refreshPage=Refresh Page ############# # HOME-PAGE # @@ -378,9 +381,9 @@ home.removeBlanks.title=Üres lapok eltávolítása home.removeBlanks.desc=Felismeri és eltávolítja az üres lapokat a dokumentumból removeBlanks.tags=takarítás,egyszerűsítés,nem-tartalom,szervez -home.removeAnnotations.title=Remove Annotations -home.removeAnnotations.desc=Removes all comments/annotations from a PDF -removeAnnotations.tags=comments,highlight,notes,markup,remove +home.removeAnnotations.title=Kijelölések eltávolítása +home.removeAnnotations.desc=Egy PDF-től minden megjegyzés/mérlegelt elemét törli ki +removeAnnotations.tags=megjegyzések, kiemelés, jegyzetek, módosítások, törlés home.compare.title=Összehasonlítás home.compare.desc=Összehasonlítja és megmutatja a különbségeket két PDF dokumentum között @@ -390,9 +393,9 @@ home.certSign.title=Aláírás Tanúsítvánnyal home.certSign.desc=PDF aláírása tanúsítvánnyal/kulccsal (PEM/P12) certSign.tags=hitelesítés,PEM,P12,hivatalos,segitít,álca -home.removeCertSign.title=Remove Certificate Sign -home.removeCertSign.desc=Remove certificate signature from PDF -removeCertSign.tags=authenticate,PEM,P12,official,decrypt +home.removeCertSign.title=Tanúsítványi aláírás eltávolítása +home.removeCertSign.desc=A PDF-től a tanúsítványi aláíratot törli ki +removeCertSign.tags=hitelesítés, PEM, P12, szakmai, dekriptálás home.pageLayout.title=Több oldal elrendezése home.pageLayout.desc=Több oldal egyesítése egy PDF dokumentumban egyetlen oldallá @@ -418,7 +421,7 @@ home.adjust-contrast.title=Színek/Kontraszt beállítása home.adjust-contrast.desc=PDF kontrasztjának, telítettségének és világosságának beállítása adjust-contrast.tags=szín-korrekció,beállítás,módosítás,fokoz -home.crop.title=Crop PDF +home.crop.title=PDF vágása home.crop.desc=PDF vágása a méret csökkentése érdekében (a szöveg megőrzése mellett!) crop.tags=vágás,csökkentés,szerkesztés,forma @@ -467,7 +470,7 @@ home.autoRedact.title=Automatikus Elrejtés home.autoRedact.desc=Automatikusan kitakar (elrejt) szöveget egy PDF-ben az input szöveg alapján autoRedact.tags=Elrejt,Elrejtés,kitakarás,fekete,fekete,marker,elrejtett -home.tableExtraxt.title=PDF to CSV +home.tableExtraxt.title=PDF-től CSV-be való átalakítás home.tableExtraxt.desc=Táblázatok kinyerése a PDF-ből CSV formátumra konvertálva tableExtraxt.tags=CSV,Táblázat kinyerése,kinyer,konvertál @@ -485,46 +488,46 @@ home.split-by-sections.title=PDF Szakaszokra osztása home.split-by-sections.desc=Minden oldal felosztása kisebb vízszintes és függőleges szakaszokra split-by-sections.tags=Szakasz elosztás, felosztás, testreszabás -home.AddStampRequest.title=Add Stamp to PDF -home.AddStampRequest.desc=Add text or add image stamps at set locations -AddStampRequest.tags=Stamp, Add image, center image, Watermark, PDF, Embed, Customize +home.AddStampRequest.title=Stempel hozzáadása PDF-be +home.AddStampRequest.desc=Addja a szövegét vagy képkép stempelésekbe a megadott helyekre +AddStampRequest.tags=Stempel, kép hozzáadása, középső rendítés, csatorna, PDF, beágyazás, személyre szokásos -home.PDFToBook.title=PDF to Book -home.PDFToBook.desc=Converts PDF to Book/Comic formats using calibre +home.PDFToBook.title=PDF to könyv +home.PDFToBook.desc=A calibre segítségével PDF fájlt könyvtár/szókincs formátumba alakít. PDFToBook.tags=Book,Comic,Calibre,Convert,manga,amazon,kindle -home.BookToPDF.title=Book to PDF -home.BookToPDF.desc=Converts Books/Comics formats to PDF using calibre +home.BookToPDF.title=Könyv a PDF-be +home.BookToPDF.desc=A calibre segítségével könyvtár/szókincs fájlt PDF-be alakít. BookToPDF.tags=Book,Comic,Calibre,Convert,manga,amazon,kindle -home.removeImagePdf.title=Remove image -home.removeImagePdf.desc=Remove image from PDF to reduce file size -removeImagePdf.tags=Remove Image,Page operations,Back end,server side +home.removeImagePdf.title=Kép törölése +home.removeImagePdf.desc=Törlés a képből a fájl méret csökkentéséhez +removeImagePdf.tags=Kép törlése, oldalszerkezet műveletek, háttér műveletek, kiszolgálói oldal -home.splitPdfByChapters.title=Split PDF by Chapters -home.splitPdfByChapters.desc=Split a PDF into multiple files based on its chapter structure. -splitPdfByChapters.tags=split,chapters,bookmarks,organize +home.splitPdfByChapters.title=PDF felosztása fejezetek szerint +home.splitPdfByChapters.desc=Fejezetei alapján egy PDF fájl több dokumentumba osztás. +splitPdfByChapters.tags=Osztás, fejezetek, jelezes, organizálás #replace-invert-color replace-color.title=Replace-Invert-Color -replace-color.header=Replace-Invert Color PDF +replace-color.header=Visszaalakítás-összevétel a színekkel PDF-ben home.replaceColorPdf.title=Replace and Invert Color -home.replaceColorPdf.desc=Replace color for text and background in PDF and invert full color of pdf to reduce file size -replaceColorPdf.tags=Replace Color,Page operations,Back end,server side -replace-color.selectText.1=Replace or Invert color Options -replace-color.selectText.2=Default(Default high contrast colors) -replace-color.selectText.3=Custom(Customized colors) -replace-color.selectText.4=Full-Invert(Invert all colors) -replace-color.selectText.5=High contrast color options -replace-color.selectText.6=white text on black background -replace-color.selectText.7=Black text on white background -replace-color.selectText.8=Yellow text on black background -replace-color.selectText.9=Green text on black background -replace-color.selectText.10=Choose text Color -replace-color.selectText.11=Choose background Color -replace-color.submit=Replace +home.replaceColorPdf.desc=Cserélje le a szöveg és háttér színét PDF-ben és visszaalakítja a teljes színt az eszköz méret csökkentéséhez +replaceColorPdf.tags=Szín cseréje, oldalszerkezet műveletek, kiszolgálói oldal +replace-color.selectText.1=Cserélés-visszaalakítási opciók +replace-color.selectText.2=Alapértelmezett (Alacsony kontrastos színek) +replace-color.selectText.3=Egyéni (Egyéni színok) +replace-color.selectText.4=Összevétel Összesen (Mind a színeket visszaalakítja) +replace-color.selectText.5=Alacsony kontrastos szín opciók +replace-color.selectText.6=fehér szöveg fekete háttérre +replace-color.selectText.7=fekete szöveg fehére háttérre +replace-color.selectText.8=pálva szöveg fekete háttérre +replace-color.selectText.9=zöld szöveg fekete háttérre +replace-color.selectText.10=Válasszon színet a szövékre +replace-color.selectText.11=Válassza a háttérszínt +replace-color.submit=Cseréljön le @@ -543,17 +546,17 @@ login.locked=A fiókja zárolva lett! login.signinTitle=Kérjük, jelentkezzen be! login.ssoSignIn=Bejelentkezés egyszeri bejelentkezéssel login.oauth2AutoCreateDisabled=OAUTH2 Felhasználó automatikus létrehozása letiltva -login.oauth2AdminBlockedUser=Registration or logging in of non-registered users is currently blocked. Please contact the administrator. -login.oauth2RequestNotFound=Authorization request not found -login.oauth2InvalidUserInfoResponse=Invalid User Info Response -login.oauth2invalidRequest=Invalid Request -login.oauth2AccessDenied=Access Denied -login.oauth2InvalidTokenResponse=Invalid Token Response -login.oauth2InvalidIdToken=Invalid Id Token -login.userIsDisabled=User is deactivated, login is currently blocked with this username. Please contact the administrator. -login.alreadyLoggedIn=You are already logged in to -login.alreadyLoggedIn2=devices. Please log out of the devices and try again. -login.toManySessions=You have too many active sessions +login.oauth2AdminBlockedUser=A nevű felhasználók regisztrációja vagy bejelentkezése megszakítva. Kérjen segítséget a rendszergazdától. +login.oauth2RequestNotFound=Hozzájárulási kérést nem találtunk +login.oauth2InvalidUserInfoResponse=Érvénytelen felhasználói információs válasz +login.oauth2invalidRequest=Érvénytelen kérelem +login.oauth2AccessDenied=Hozzáférés megtagadva +login.oauth2InvalidTokenResponse=Érvénytelen token-válasz +login.oauth2InvalidIdToken=Érvénytelen azonosító token +login.userIsDisabled=A felhasználó deaktivált, a bejelentkezés jelenleg megszakítva ezzel a felhasználónévvel. Kérjen segítséget a rendszergazdától. +login.alreadyLoggedIn=Már be van jelentkezve az +login.alreadyLoggedIn2=eszközökre. Kijelentkezzen ezekből a eszközökből, majd próbálja újra bejelentkezni. +login.toManySessions=Túl sok aktív munkamenet #auto-redact autoRedact.title=Érzékeny tartalom eltávolítása @@ -585,7 +588,7 @@ pdfToSinglePage.submit=Átalakítás egyetlen oldallá pageExtracter.title=Oldalak kinyerése pageExtracter.header=Oldalak kinyerése pageExtracter.submit=Kinyerés -pageExtracter.placeholder=(e.g. 1,2,8 or 4,7,12-16 or 2n-1) +pageExtracter.placeholder=(pl. 1,2,8 vagy 4,7,12-16 vagy 2n-1) #getPdfInfo @@ -617,37 +620,37 @@ HTMLToPDF.header=HTML >> PDF HTMLToPDF.help=Elfogad HTML fájlokat és ZIP-fájlokat, amelyek tartalmaznak html/css/képeket stb. HTMLToPDF.submit=Átalakítás HTMLToPDF.credit=WeasyPrint alkalmazása -HTMLToPDF.zoom=Zoom level for displaying the website. -HTMLToPDF.pageWidth=Width of the page in centimeters. (Blank to default) -HTMLToPDF.pageHeight=Height of the page in centimeters. (Blank to default) -HTMLToPDF.marginTop=Top margin of the page in millimeters. (Blank to default) -HTMLToPDF.marginBottom=Bottom margin of the page in millimeters. (Blank to default) -HTMLToPDF.marginLeft=Left margin of the page in millimeters. (Blank to default) -HTMLToPDF.marginRight=Right margin of the page in millimeters. (Blank to default) -HTMLToPDF.printBackground=Render the background of websites. -HTMLToPDF.defaultHeader=Enable Default Header (Name and page number) -HTMLToPDF.cssMediaType=Change the CSS media type of the page. -HTMLToPDF.none=None -HTMLToPDF.print=Print -HTMLToPDF.screen=Screen +HTMLToPDF.zoom=Oldalnéző szint a weboldal megjelenítésére. +HTMLToPDF.pageWidth=Oldal szélessége centiméterben. (Törlés esetén az alapértelmezett érték lesz) +HTMLToPDF.pageHeight=Oldal magassága centiméterben. (Törlés esetén az alapértelmezett érték lesz) +HTMLToPDF.marginTop=Oldal felső marginalása milliméterben. (Törlés esetén az alapértelmezett érték lesz) +HTMLToPDF.marginBottom=Oldal alsó marginalása milliméterben. (Törlés esetén az alapértelmezett érték lesz) +HTMLToPDF.marginLeft=Oldal bal oldali marginalása milliméterben. (Törlés esetén az alapértelmezett érték lesz) +HTMLToPDF.marginRight=Oldal jobb oldali marginalása milliméterben. (Törlés esetén az alapértelmezett érték lesz) +HTMLToPDF.printBackground=Oldalsáv háttérét nyomtatásra jelenítse meg. +HTMLToPDF.defaultHeader=Alapértelmezett fejléc (Nevezés és oldal szám) engedélyezése +HTMLToPDF.cssMediaType=Oldal CSS média típusának módosítása. +HTMLToPDF.none=Nincs +HTMLToPDF.print=Nyomtatás +HTMLToPDF.screen=Élő képernyő #AddStampRequest -AddStampRequest.header=Stamp PDF -AddStampRequest.title=Stamp PDF -AddStampRequest.stampType=Stamp Type -AddStampRequest.stampText=Stamp Text -AddStampRequest.stampImage=Stamp Image +AddStampRequest.header=Stempel PDF-be +AddStampRequest.title=Stempel PDF-be +AddStampRequest.stampType=Stempel típusa +AddStampRequest.stampText=Stempel szövege +AddStampRequest.stampImage=Stempel képsora AddStampRequest.alphabet=Alphabet -AddStampRequest.fontSize=Font/Image Size -AddStampRequest.rotation=Rotation -AddStampRequest.opacity=Opacity -AddStampRequest.position=Position -AddStampRequest.overrideX=Override X Coordinate -AddStampRequest.overrideY=Override Y Coordinate -AddStampRequest.customMargin=Custom Margin -AddStampRequest.customColor=Custom Text Color -AddStampRequest.submit=Submit +AddStampRequest.fontSize=Betűméret/stépésnév +AddStampRequest.rotation=Fordítás +AddStampRequest.opacity=Átlátszathossz +AddStampRequest.position=Pozíció +AddStampRequest.overrideX=Överrite X koordinátája +AddStampRequest.overrideY=Överrite Y koordinátája +AddStampRequest.customMargin=Egyéni mezők marginalája +AddStampRequest.customColor=Egyéni szövegszín +AddStampRequest.submit=Küldés #sanitizePDF @@ -693,7 +696,7 @@ adjustContrast.download=Letöltés #crop crop.title=Körülvágás -crop.header=Crop PDF +crop.header=PDF kivágása crop.submit=Elküldés @@ -728,7 +731,7 @@ pageLayout.submit=Elküldés scalePages.title=Oldalméret beállítása scalePages.header=Oldalméret beállítása scalePages.pageSize=A dokumentum egy oldalának mérete. -scalePages.keepPageSize=Original Size +scalePages.keepPageSize=Váltás az eredeti méretre scalePages.scaleFactor=Az oldal nagyításának szintje (vágás). scalePages.submit=Küldés @@ -737,25 +740,26 @@ scalePages.submit=Küldés certSign.title=Tanúsítvánnyal történő aláírás certSign.header=Aláírás PDF tanúsítvánnyal (fejlesztés alatt) certSign.selectPDF=Válasszon PDF fájlt az aláíráshoz: -certSign.jksNote=Note: If your certificate type is not listed below, please convert it to a Java Keystore (.jks) file using the keytool command line tool. Then, choose the .jks file option below. +certSign.jksNote=Megjegyzés: Ha a tanúsítvány típusa nem szerepel a fenti listában, konvertálja Java Keystore (.jks) formátumba a keytool parancssor segítségével. Válassza az alábbi .jks vagy .keystore fájl opciót. certSign.selectKey=Válassza ki a saját kulcsfájlját (PKCS#8 formátum, lehet .pem vagy .der kiterjesztésű): certSign.selectCert=Válassza ki a tanúsítványfájlját (X.509 formátum, lehet .pem vagy .der kiterjesztésű): certSign.selectP12=Válassza ki a PKCS#12 kulcstár fájlját (.p12 vagy .pfx) (Opcionális, ha rendelkezésre áll, tartalmaznia kell a privát kulcsot és a tanúsítványt.): -certSign.selectJKS=Select Your Java Keystore File (.jks or .keystore): +certSign.selectJKS=Java Keystore-fájl választása (.jks vagy .keystore): certSign.certType=Tanúsítvány típusa certSign.password=Adja meg a kulcstár vagy a privát kulcs jelszavát (ha van): certSign.showSig=Aláírás megjelenítése certSign.reason=Ok certSign.location=Hely certSign.name=Név +certSign.showLogo=Logó megjelenítése certSign.submit=PDF aláírása #removeCertSign -removeCertSign.title=Remove Certificate Signature -removeCertSign.header=Remove the digital certificate from the PDF -removeCertSign.selectPDF=Select a PDF file: -removeCertSign.submit=Remove Signature +removeCertSign.title=Tanúsítvány aláírás eltávolítása +removeCertSign.header=PDF-ből törölje a digitális tanúsítványt +removeCertSign.selectPDF=PDF fájl kiválasztása: +removeCertSign.submit=Aláírást törlés #removeBlanks @@ -769,32 +773,35 @@ removeBlanks.submit=Üres oldalak eltávolítása #removeAnnotations -removeAnnotations.title=Remove Annotations -removeAnnotations.header=Remove Annotations -removeAnnotations.submit=Remove +removeAnnotations.title=Számítógépes bejegyzések törlése +removeAnnotations.header=Számítógépes bejegyzések törlése +removeAnnotations.submit=Töröl #compare compare.title=Összehasonlítás compare.header=PDF-ek összehasonlítása -compare.highlightColor.1=Highlight Color 1: -compare.highlightColor.2=Highlight Color 2: +compare.highlightColor.1=Kötłówiteli szín 1: +compare.highlightColor.2=Kijelzési szín 2: compare.document.1=Dokumentum 1 compare.document.2=Dokumentum 2 compare.submit=Összehasonlítás +compare.complex.message=Egy vagy mindkét kiválasztott dokumentum nagy, az összehasonlítás precizégének csökkenhet. +compare.large.file.message=Egy vagy mindkét kiválasztott dokumentum túl nagy a feldolgozáshoz. +compare.no.text.message=Egy vagy mindkét kiválasztott PDF nincs szöveggal. Kérjük, válasszon szöveg tartalmazó PDF-t. #BookToPDF -BookToPDF.title=Books and Comics to PDF -BookToPDF.header=Book to PDF -BookToPDF.credit=Uses Calibre -BookToPDF.submit=Convert +BookToPDF.title=Könyvek és kézirattak PDF-be +BookToPDF.header=Könyv to PDF +BookToPDF.credit=Használja a Calibre-t +BookToPDF.submit=Konvertálás #PDFToBook -PDFToBook.title=PDF to Book +PDFToBook.title=PDF-ből könyv PDFToBook.header=PDF to Book -PDFToBook.selectText.1=Format -PDFToBook.credit=Uses Calibre -PDFToBook.submit=Convert +PDFToBook.selectText.1=Formátum +PDFToBook.credit=Használja a Calibre-t +PDFToBook.submit=Konvertálás #sign sign.title=Aláírás @@ -804,6 +811,11 @@ sign.draw=Aláírás rajzolása sign.text=Szöveg beírása sign.clear=Törlés sign.add=Hozzáadás +sign.saved=Mentett aláírások +sign.save=Aláíráshoz mentés +sign.personalSigs=Személyi aláíráshoz +sign.sharedSigs=Megosztott aláíráshoz +sign.noSavedSigs=Nincsenek mentett aláírások találat #repair @@ -815,7 +827,7 @@ repair.submit=Javítás #flatten flatten.title=Kiegyenlítés flatten.header=PDF-ek kiegyenlítése -flatten.flattenOnlyForms=Flatten only forms +flatten.flattenOnlyForms=Csak formákat átalakít flatten.submit=Kiegyenlítés @@ -830,7 +842,7 @@ ScannerImageSplit.selectText.7=Minimális kontúr terület: ScannerImageSplit.selectText.8=A fotók minimális kontúrterületének beállítása ScannerImageSplit.selectText.9=Keret mérete: ScannerImageSplit.selectText.10=A hozzáadott és eltávolított keret méretének beállítása a fehér keretek elkerülése érdekében a kimeneten (alapértelmezett: 1). -ScannerImageSplit.info=Python is not installed. It is required to run. +ScannerImageSplit.info=A Python nincs telepítve. Összefogóként szükséges. #OCR @@ -857,7 +869,7 @@ ocr.submit=PDF feldolgozása OCR-rel extractImages.title=Képek kinyerése extractImages.header=Képek kinyerése extractImages.selectText=Válassza ki a képformátumot a kinyert képek konvertálásához -extractImages.allowDuplicates=Save duplicate images +extractImages.allowDuplicates=Duplikált képek mentése extractImages.submit=Kinyerés @@ -865,7 +877,7 @@ extractImages.submit=Kinyerés fileToPDF.title=Fájl PDF dokumentummá alakítása fileToPDF.header=Konvertáljon bármilyen fájlt PDF dokumentummá fileToPDF.credit=Ez a szolgáltatás a LibreOffice-t és az Unoconv-ot használja a fájlkonverzióhoz. -fileToPDF.supportedFileTypesInfo=Supported File types +fileToPDF.supportedFileTypesInfo=Támogatott fájltípusok fileToPDF.supportedFileTypes=A funkció az alábbi fájltípusokat támogatja, azonban a teljesen friss támogatott formátumok listájáért kérjük, tekintse meg a LibreOffice dokumentációját fileToPDF.submit=Konvertálás PDF dokumentummá @@ -895,7 +907,7 @@ merge.title=Összevonás merge.header=Több PDF összevonása (2+) merge.sortByName=Név szerinti rendezés merge.sortByDate=Dátum szerinti rendezés -merge.removeCertSign=Remove digital signature in the merged file? +merge.removeCertSign=Eltávolítja a megyérismereteket az összefuzött fájlban? merge.submit=Összevonás @@ -903,25 +915,32 @@ merge.submit=Összevonás pdfOrganiser.title=Oldalszervező pdfOrganiser.header=PDF Oldalszervező pdfOrganiser.submit=Oldalak átrendezése -pdfOrganiser.mode=Mode -pdfOrganiser.mode.1=Custom Page Order -pdfOrganiser.mode.2=Reverse Order -pdfOrganiser.mode.3=Duplex Sort -pdfOrganiser.mode.4=Booklet Sort -pdfOrganiser.mode.5=Side Stitch Booklet Sort -pdfOrganiser.mode.6=Odd-Even Split -pdfOrganiser.mode.7=Remove First -pdfOrganiser.mode.8=Remove Last -pdfOrganiser.mode.9=Remove First and Last -pdfOrganiser.mode.10=Odd-Even Merge -pdfOrganiser.placeholder=(e.g. 1,3,2 or 4-8,2,10-12 or 2n-1) +pdfOrganiser.mode=Mód +pdfOrganiser.mode.1=Törzsbeírás szabályos sorrend +pdfOrganiser.mode.2=Fordított sorrend +pdfOrganiser.mode.3=Dupla oldal rendezés +pdfOrganiser.mode.4=Könyvrész letrehozása rendezés +pdfOrganiser.mode.5=Oldalsarkatásos könyvrész letrehozása rendezés +pdfOrganiser.mode.6=Tökéletes páratlan-páros split +pdfOrganiser.mode.7=Először is eltávolítanunk +pdfOrganiser.mode.8=Utolsó törölése +pdfOrganiser.mode.9=Először és utolsó törlése +pdfOrganiser.mode.10=Tökéletes páratlan-páros összekeverés +pdfOrganiser.placeholder=(pl.: 1,3,2 vagy 4-8,2,10-12 vagy 2n-1) #multiTool multiTool.title=PDF többfunkciós eszköz multiTool.header=PDF többfunkciós eszköz -multiTool.uploadPrompts=File Name - +multiTool.uploadPrompts=Fájl neve +multiTool.selectAll=Select All +multiTool.deselectAll=Deselect All +multiTool.selectPages=Page Select +multiTool.selectedPages=Selected Pages +multiTool.page=Page +multiTool.deleteSelected=Delete Selected +multiTool.downloadAll=Export +multiTool.downloadSelected=Export Selected #view pdf viewPdf.title=PDF megtekintése viewPdf.header=PDF megtekintése @@ -931,7 +950,7 @@ pageRemover.title=Oldaltörlő pageRemover.header=PDF oldaltörlő pageRemover.pagesToDelete=Törlendő oldalak (adja meg az oldalszámok vesszővel elválasztott listáját): pageRemover.submit=Oldalak törlése -pageRemover.placeholder=(e.g. 1,2,6 or 1-10,15-30) +pageRemover.placeholder=(pl.: 1,2,6 vagy 1-10,15-30) #rotate @@ -982,7 +1001,7 @@ pdfToImage.color=színes pdfToImage.grey=szürkeárnyalatos pdfToImage.blackwhite=fekete-fehér (adatvesztéssel járhat!) pdfToImage.submit=Átalakítás -pdfToImage.info=Python is not installed. Required for WebP conversion. +pdfToImage.info=Nincs telepítve a Python. Szükséges a WebP konverzióhoz. #addPassword @@ -1019,10 +1038,10 @@ watermark.selectText.6=heightSpacer (Hely a vízjelek között függőlegesen): watermark.selectText.7=Átlátszóság (0% - 100%): watermark.selectText.8=Vízjel típusa: watermark.selectText.9=Vízjel képe: -watermark.selectText.10=Convert PDF to PDF-Image +watermark.selectText.10=PDF-t PDF-ra átalakítás watermark.submit=Vízjel hozzáadása -watermark.type.1=Text -watermark.type.2=Image +watermark.type.1=Szöveg +watermark.type.2=Kép #Change permissions @@ -1074,9 +1093,9 @@ pdfToPDFA.title=PDF >> PDF/A pdfToPDFA.header=PDF >> PDF/A pdfToPDFA.credit=Ez a szolgáltatás az ghostscript-t használja a PDF/A konverzióhoz pdfToPDFA.submit=Konvertálás -pdfToPDFA.tip=Currently does not work for multiple inputs at once -pdfToPDFA.outputFormat=Output format -pdfToPDFA.pdfWithDigitalSignature=The PDF contains a digital signature. This will be removed in the next step. +pdfToPDFA.tip=Jelenleg egyszerre több fájl nem működik ezzel a funkcióval +pdfToPDFA.outputFormat=Kimeneti formátum +pdfToPDFA.pdfWithDigitalSignature=A PDF tartalmaz digitális alásszegyeztetést. Ez lesz eltávolítva az alábbi lépésben. #PDFToWord @@ -1158,67 +1177,65 @@ split-by-sections.vertical.label=Vízszintes szakaszok split-by-sections.horizontal.placeholder=Adja meg a vízszintes szakaszok számát split-by-sections.vertical.placeholder=Adja meg a függőleges szakaszok számát split-by-sections.submit=Felosztás -split-by-sections.merge=Merge Into One PDF +split-by-sections.merge=Egyesítsük a dokumentumokat egybe #printFile -printFile.title=Print File -printFile.header=Print File to Printer -printFile.selectText.1=Select File to Print -printFile.selectText.2=Enter Printer Name -printFile.submit=Print +printFile.title=Fájl kinyomtatása +printFile.header=Fájlt nyomtatás a számítógépes kiíróra +printFile.selectText.1=Válasszon ki a kinyomtatandó fájlt +printFile.selectText.2=Add meg a kiíró nevét +printFile.submit=Nyomtatás #licenses licenses.nav=Licenses licenses.title=3rd Party Licenses licenses.header=3rd Party Licenses -licenses.module=Module -licenses.version=Version +licenses.module=Modul +licenses.version=Verzió licenses.license=License #survey -survey.nav=Survey -survey.title=Stirling-PDF Survey -survey.description=Stirling-PDF has no tracking so we want to hear from our users to improve Stirling-PDF! -survey.changes=Stirling-PDF has changed since the last survey! To find out more please check our blog post here: -survey.changes2=With these changes we are getting paid business support and funding +survey.nav=Kérdőív +survey.title=Stirling-PDF Kérdőív +survey.description=A Stirling-PDF nincs bejelentkezési adatokat tároló funkciója miatt szeretnénk a felhasználóink véleményét gyűjteni, hogy javítsuk meg a Stirling-PDF-t! +survey.changes=A Stirling-PDF változásai a visszaérkező kérdőív után! További információért látogasson el az alábbi blogfelsorolást. +survey.changes2=Ezek a változtatások során kapunk fizetendő üzleti támogatást és finanszírozást survey.please=Please consider taking our survey! -survey.disabled=(Survey popup will be disabled in following updates but available at foot of page) -survey.button=Take Survey -survey.dontShowAgain=Don't show again +survey.disabled=(A kérdőív bejelentkezés nélküli megjelenése le lesz tilos további frissítések után, de folyamatosan elérhető a oldal tetején) +survey.button=Kérdőív végrehajtása +survey.dontShowAgain=Más nincs mutatni ugyanarra a képernyőre #error -error.sorry=Sorry for the issue! -error.needHelp=Need help / Found an issue? -error.contactTip=If you're still having trouble, don't hesitate to reach out to us for help. You can submit a ticket on our GitHub page or contact us through Discord: -error.404.head=404 - Page Not Found | Oops, we tripped in the code! -error.404.1=We can't seem to find the page you're looking for. -error.404.2=Something went wrong -error.github=Submit a ticket on GitHub -error.showStack=Show Stack Trace -error.copyStack=Copy Stack Trace -error.githubSubmit=GitHub - Submit a ticket -error.discordSubmit=Discord - Submit Support post +error.sorry=Sajnáljuk, hogy probléma van! +error.needHelp=Segítségüket kérünk! / Hiba találkoztak? +error.contactTip=Ha további nehézségekkel találkozna, ne szudirmáld a segítségre kérését. A GitHub oldalán egy típusot is lehet kiküldeni, vagy a Discordban kapcsolatba lépheted veleink: +error.404.head=404 - Nincs ilyen oldal | Sajnáljuk, hogy valami meghibásodott! +error.404.1=Nem tudom megkerülni az oldalt, amit keresed. +error.404.2=Valami meghibásodott +error.github=Típusot kiküldheted a GitHub-on +error.showStack=Lássuk meg a sorozatot +error.copyStack=Kövesse a sorozat másolását +error.githubSubmit=GitHub - Típus kiküldése +error.discordSubmit=Discord - Jegyzettömb kijavítása #remove-image -removeImage.title=Remove image -removeImage.header=Remove image -removeImage.removeImage=Remove image -removeImage.submit=Remove image +removeImage.title=Távolítsa el az kép +removeImage.header=Távolítsa el a képet +removeImage.removeImage=Távolítsa el a képet +removeImage.submit=Távolítsa el a képet -splitByChapters.title=Split PDF by Chapters -splitByChapters.header=Split PDF by Chapters -splitByChapters.bookmarkLevel=Bookmark Level -splitByChapters.includeMetadata=Include Metadata -splitByChapters.allowDuplicates=Allow Duplicates -splitByChapters.desc.1=This tool splits a PDF file into multiple PDFs based on its chapter structure. +splitByChapters.title=PDF fájlt fejezések szerint bontson fel +splitByChapters.header=PDF fájlt fejezések szerint bontson fel +splitByChapters.bookmarkLevel=Fejezet címkézése szintje +splitByChapters.includeMetadata=Metadata beleszerkesztése +splitByChapters.allowDuplicates=Duplikációk engedélyezése +splitByChapters.desc.1=Ez az eszköz osztja fel a PDF-fájlt szövegszerkezet alapján lévő több fájlra. splitByChapters.desc.2=Bookmark Level: Choose the level of bookmarks to use for splitting (0 for top-level, 1 for second-level, etc.). -splitByChapters.desc.3=Include Metadata: If checked, the original PDF's metadata will be included in each split PDF. -splitByChapters.desc.4=Allow Duplicates: If checked, allows multiple bookmarks on the same page to create separate PDFs. -splitByChapters.submit=Split PDF - - +splitByChapters.desc.3=Metaadatok belefoglalása: Ha bevanítva van, az eredeti PDF fájl metaadatai megtartódnak minden osztott fájlban. +splitByChapters.desc.4=Duplikációk engedélyezése: Ha bevanítva van, lehetővé teszi a megadott oldalon lévő több kijelzőszint alapján új PDF-ek létrehozása. +splitByChapters.submit=PDF osztás diff --git a/src/main/resources/messages_id_ID.properties b/src/main/resources/messages_id_ID.properties index afdea33e6..f34900d37 100644 --- a/src/main/resources/messages_id_ID.properties +++ b/src/main/resources/messages_id_ID.properties @@ -3,8 +3,8 @@ ########### # the direction that the language is written (ltr = left to right, rtl = right to left) language.direction=ltr -addPageNumbers.fontSize=Font Size -addPageNumbers.fontName=Font Name +addPageNumbers.fontSize=Ukuran Fonta +addPageNumbers.fontName=Nama Fonta pdfPrompt=Pilih PDF multiPdfPrompt=Pilih PDF (2+) multiPdfDropPrompt=Pilih (atau seret & letakkan)) semua PDF yang Anda butuhkan @@ -12,17 +12,17 @@ imgPrompt=Pilih Gambar genericSubmit=Kirim processTimeWarning=Peringatan: Proses ini dapat memakan waktu hingga satu menit, tergantung pada ukuran berkas pageOrderPrompt=Urutan Halaman Khusus (Masukkan daftar nomor halaman yang dipisahkan dengan koma atau Fungsi seperti 2n + 1) : -pageSelectionPrompt=Custom Page Selection (Enter a comma-separated list of page numbers 1,5,6 or Functions like 2n+1) : +pageSelectionPrompt=Pemilihan Halaman Kustom (Masukkan daftar nomor halaman dipisahkan dengan koma 1,5,6 atau Fungsi seperti 2n+1) : goToPage=Ke true=Benar false=Salah unknown=Tidak diketahui save=Simpan -saveToBrowser=Save to Browser +saveToBrowser=Simpan ke Peramban close=Tutup filesSelected=berkas dipilih noFavourites=Tidak ada favorit yang ditambahkan -downloadComplete=Download Complete +downloadComplete=Unduhan Lengkap bored=Bosan Menunggu? alphabet=Abjad downloadPdf=Unduh PDF @@ -46,113 +46,115 @@ red=Merah green=Hijau blue=Biru custom=Kustom... -WorkInProgess=Work in progress, May not work or be buggy, Please report any problems! -poweredBy=Powered by -yes=Yes -no=No +WorkInProgess=Pekerjaan sedang diproses, Mungkin tidak berfungsi atau terdapat kutu, Silakan laporkan masalah apa pun! +poweredBy=Ditenagai oleh +yes=Ya +no=Tidak changedCredsMessage=Kredensial berubah!! notAuthenticatedMessage=Pengguna tidak ter-autentikasi. userNotFoundMessage=Pengguna tidak ditemukan. incorrectPasswordMessage=Kata sandi saat ini salah. usernameExistsMessage=Nama pengguna baru sudah ada. -invalidUsernameMessage=Invalid username, username can only contain letters, numbers and the following special characters @._+- or must be a valid email address. -invalidPasswordMessage=The password must not be empty and must not have spaces at the beginning or end. -confirmPasswordErrorMessage=New Password and Confirm New Password must match. -deleteCurrentUserMessage=Cannot delete currently logged in user. -deleteUsernameExistsMessage=The username does not exist and cannot be deleted. +invalidUsernameMessage=Nama pengguna tidak valid, nama pengguna hanya boleh mengandung huruf, angka, dan karakter khusus berikut @._+- atau harus berupa alamat email yang valid. +invalidPasswordMessage=Kata sandi tidak boleh kosong dan tidak boleh memiliki spasi di awal atau akhir. +confirmPasswordErrorMessage=Kata Sandi Baru dan Konfirmasi Kata Sandi Baru harus sama. +deleteCurrentUserMessage=Pengguna yang sedang masuk tidak dapat dihapus. +deleteUsernameExistsMessage=Nama pengguna tidak ada dan tidak dapat dihapus. downgradeCurrentUserMessage=Tidak dapat menurunkan peran pengguna saat ini -disabledCurrentUserMessage=The current user cannot be disabled +disabledCurrentUserMessage=Pengguna saat ini tidak dapat dinonaktifkan downgradeCurrentUserLongMessage=Tidak dapat menurunkan peran pengguna saat ini. Oleh karena itu, pengguna saat ini tidak akan ditampilkan. -userAlreadyExistsOAuthMessage=The user already exists as an OAuth2 user. -userAlreadyExistsWebMessage=The user already exists as an web user. -error=Error -oops=Oops! -help=Help -goHomepage=Go to Homepage -joinDiscord=Join our Discord server -seeDockerHub=See Docker Hub -visitGithub=Visit Github Repository -donate=Donate -color=Color -sponsor=Sponsor -info=Info +userAlreadyExistsOAuthMessage=Pengguna sudah ada sebagai pengguna OAuth2. +userAlreadyExistsWebMessage=Pengguna sudah ada sebagai pengguna web. +error=Kesalahan +oops=Ups! +help=Bantuan +goHomepage=Kembali ke Beranda +joinDiscord=Bergabung dengan server Discord kami +seeDockerHub=Lihat Docker Hub +visitGithub=Kunjungi Repositori Github +donate=Donasi +color=Warna +sponsor=Pembantu +info=Informasi pro=Pro -page=Page -pages=Pages +page=Halaman +pages=Halaman-halaman +loading=Mengambil data... +addToDoc=Tambahkan ke Dokumen -legal.privacy=Privacy Policy -legal.terms=Terms and Conditions -legal.accessibility=Accessibility -legal.cookie=Cookie Policy -legal.impressum=Impressum +legal.privacy=Kebijakan Privasi +legal.terms=Syarat dan Ketentuan +legal.accessibility=Aksesibilitas +legal.cookie=Kebijakan Kuki +legal.impressum=Impresum ############### # Pipeline # ############### -pipeline.header=Pipeline Menu (Beta) -pipeline.uploadButton=Upload Custom -pipeline.configureButton=Configure -pipeline.defaultOption=Custom -pipeline.submitButton=Submit -pipeline.help=Pipeline Help -pipeline.scanHelp=Folder Scanning Help -pipeline.deletePrompt=Are you sure you want to delete pipeline +pipeline.header=Menu Pipeline (Beta) +pipeline.uploadButton=Unggah Kustom +pipeline.configureButton=Konfigurasi +pipeline.defaultOption=Kustom +pipeline.submitButton=Kirim +pipeline.help=Bantuan Pipeline +pipeline.scanHelp=Bantuan Pemindaian Folder +pipeline.deletePrompt=Apakah Anda yakin ingin menghapus pipeline ###################### # Pipeline Options # ###################### -pipelineOptions.header=Pipeline Configuration -pipelineOptions.pipelineNameLabel=Pipeline Name -pipelineOptions.saveSettings=Save Operation Settings -pipelineOptions.pipelineNamePrompt=Enter pipeline name here -pipelineOptions.selectOperation=Select Operation -pipelineOptions.addOperationButton=Add operation +pipelineOptions.header=Konfigurasi Pipeline +pipelineOptions.pipelineNameLabel=Nama Pipeline +pipelineOptions.saveSettings=Simpan Pengaturan Operasi +pipelineOptions.pipelineNamePrompt=Masukkan nama pipeline di sini +pipelineOptions.selectOperation=Pilih Operasi +pipelineOptions.addOperationButton=Tambah operasi pipelineOptions.pipelineHeader=Pipeline: -pipelineOptions.saveButton=Download -pipelineOptions.validateButton=Validate +pipelineOptions.saveButton=Unduh +pipelineOptions.validateButton=Validasi ######################## # ENTERPRISE EDITION # ######################## -enterpriseEdition.button=Upgrade to Pro -enterpriseEdition.warning=This feature is only available to Pro users. -enterpriseEdition.yamlAdvert=Stirling PDF Pro supports YAML configuration files and other SSO features. -enterpriseEdition.ssoAdvert=Looking for more user management features? Check out Stirling PDF Pro +enterpriseEdition.button=Upgrade ke Pro +enterpriseEdition.warning=Fitur ini hanya tersedia untuk pengguna Pro. +enterpriseEdition.yamlAdvert=Stirling PDF Pro mendukung berkas konfigurasi YAML dan fitur SSO lainnya. +enterpriseEdition.ssoAdvert=Mencari lebih banyak fitur manajemen pengguna? Lihat Stirling PDF Pro ################# # Analytics # ################# -analytics.title=Do you want make Stirling PDF better? -analytics.paragraph1=Stirling PDF has opt in analytics to help us improve the product. We do not track any personal information or file contents. -analytics.paragraph2=Please consider enabling analytics to help Stirling-PDF grow and to allow us to understand our users better. -analytics.enable=Enable analytics -analytics.disable=Disable analytics -analytics.settings=You can change the settings for analytics in the config/settings.yml file +analytics.title=Apakah Anda ingin membuat Stirling PDF lebih baik? +analytics.paragraph1=Stirling PDF memiliki analitik yang dapat diaktifkan untuk membantu kami meningkatkan produk. Kami tidak melacak informasi pribadi atau konten berkas. +analytics.paragraph2=Silakan pertimbangkan untuk mengaktifkan analitik agar Stirling PDF dapat berkembang dan untuk memungkinkan kami memahami pengguna kami dengan lebih baik. +analytics.enable=Aktifkan analitik +analytics.disable=Nonaktifkan analitik +analytics.settings=Anda dapat mengubah pengaturan untuk analitik di berkas config/settings.yml ############# # NAVBAR # ############# -navbar.favorite=Favorites +navbar.favorite=Favorit navbar.darkmode=Mode Gelap -navbar.language=Languages +navbar.language=Bahasa navbar.settings=Pengaturan -navbar.allTools=Tools -navbar.multiTool=Multi Tools -navbar.sections.organize=Organize -navbar.sections.convertTo=Convert to PDF -navbar.sections.convertFrom=Convert from PDF -navbar.sections.security=Sign & Security -navbar.sections.advance=Advanced -navbar.sections.edit=View & Edit -navbar.sections.popular=Popular +navbar.allTools=Alat +navbar.multiTool=Alat Multi +navbar.sections.organize=Atur +navbar.sections.convertTo=Konversi ke PDF +navbar.sections.convertFrom=Konversi dari PDF +navbar.sections.security=Tanda Tangan & Keamanan +navbar.sections.advance=Langkah Lanjut +navbar.sections.edit=Melihat & Mengedit +navbar.sections.popular=Populer ############# # SETTINGS # ############# settings.title=Pengaturan settings.update=Pembaruan tersedia -settings.updateAvailable={0} is the current installed version. A new version ({1}) is available. +settings.updateAvailable={0} adalah versi yang terpasang saat ini. Versi baru ({1}) tersedia. settings.appVersion=Versi Aplikasi: settings.downloadOption.title=Pilih opsi unduhan (Untuk unduhan berkas tunggal non zip): settings.downloadOption.1=Buka di jendela yang sama @@ -161,13 +163,13 @@ settings.downloadOption.3=Unduh berkas settings.zipThreshold=Berkas zip ketika jumlah berkas yang diunduh melebihi settings.signOut=Keluar settings.accountSettings=Pengaturan Akun -settings.bored.help=Enables easter egg game -settings.cacheInputs.name=Save form inputs -settings.cacheInputs.help=Enable to store previously used inputs for future runs +settings.bored.help=Mengaktifkan permainan telur paskah +settings.cacheInputs.name=Simpan input formulir +settings.cacheInputs.help=Aktifkan untuk menyimpan input yang pernah digunakan untuk menjalankan di masa depan changeCreds.title=Ubah Kredensial changeCreds.header=Perbarui Detail Akun Anda -changeCreds.changePassword=You are using default login credentials. Please enter a new password +changeCreds.changePassword=Anda menggunakan kredensial login default. Silakan masukkan kata sandi baru changeCreds.newUsername=Nama Pengguna Baru changeCreds.oldPassword=Kata Sandi Saat Ini changeCreds.newPassword=Kata Sandi Baru @@ -199,51 +201,52 @@ account.syncToAccount=Sinkronisasi Akun <- Browser adminUserSettings.title=Pengaturan Kontrol Pengguna adminUserSettings.header=Pengaturan Kontrol Admin -adminUserSettings.admin=Admin +adminUserSettings.admin=Administrator adminUserSettings.user=Pengguna adminUserSettings.addUser=Tambahkan Pengguna Baru -adminUserSettings.deleteUser=Delete User -adminUserSettings.confirmDeleteUser=Should the user be deleted? -adminUserSettings.confirmChangeUserStatus=Should the user be disabled/enabled? -adminUserSettings.usernameInfo=Username can only contain letters, numbers and the following special characters @._+- or must be a valid email address. +adminUserSettings.deleteUser=Hapus Pengguna +adminUserSettings.confirmDeleteUser=Haruskah pengguna dihapus? +adminUserSettings.confirmChangeUserStatus=Haruskah pengguna dinonaktifkan/diaktifkan? +adminUserSettings.usernameInfo=Nama pengguna hanya boleh mengandung huruf, angka, dan karakter khusus berikut @._+- atau harus berupa alamat email yang valid. adminUserSettings.roles=Peran adminUserSettings.role=Peran adminUserSettings.actions=Tindakan adminUserSettings.apiUser=Pengguna API Terbatas -adminUserSettings.extraApiUser=Additional Limited API User +adminUserSettings.extraApiUser=Pengguna API Terbatas Tambahan adminUserSettings.webOnlyUser=Pengguna Khusus Web -adminUserSettings.demoUser=Demo User (No custom settings) -adminUserSettings.internalApiUser=Internal API User +adminUserSettings.demoUser=Pengguna Demo (Tanpa pengaturan kustom) +adminUserSettings.internalApiUser=Pengguna API Internal adminUserSettings.forceChange=Memaksa pengguna untuk mengubah nama pengguna/kata sandi saat masuk adminUserSettings.submit=Simpan Pengguna adminUserSettings.changeUserRole=Ubah Peran Pengguna -adminUserSettings.authenticated=Authenticated -adminUserSettings.editOwnProfil=Edit own profile -adminUserSettings.enabledUser=enabled user -adminUserSettings.disabledUser=disabled user -adminUserSettings.activeUsers=Active Users: -adminUserSettings.disabledUsers=Disabled Users: -adminUserSettings.totalUsers=Total Users: -adminUserSettings.lastRequest=Last Request +adminUserSettings.authenticated=Terautentikasi +adminUserSettings.editOwnProfil=Edit profil sendiri +adminUserSettings.enabledUser=Pengguna diaktifkan +adminUserSettings.disabledUser=Pengguna dinonaktifkan +adminUserSettings.activeUsers=Pengguna Aktif: +adminUserSettings.disabledUsers=Pengguna Dinonaktifkan: +adminUserSettings.totalUsers=Total Pengguna: +adminUserSettings.lastRequest=Permintaan Terakhir -database.title=Database Import/Export -database.header=Database Import/Export -database.fileName=File Name -database.creationDate=Creation Date -database.fileSize=File Size -database.deleteBackupFile=Delete Backup File -database.importBackupFile=Import Backup File -database.downloadBackupFile=Download Backup File -database.info_1=When importing data, it is crucial to ensure the correct structure. If you are unsure of what you are doing, seek advice and support from a professional. An error in the structure can cause application malfunctions, up to and including the complete inability to run the application. -database.info_2=The file name does not matter when uploading. It will be renamed afterward to follow the format backup_user_yyyyMMddHHmm.sql, ensuring a consistent naming convention. -database.submit=Import Backup -database.importIntoDatabaseSuccessed=Import into database successed -database.fileNotFound=File not Found -database.fileNullOrEmpty=File must not be null or empty -database.failedImportFile=Failed Import File +database.title=Impor/Ekspor Database +database.header=Impor/Ekspor Database +database.fileName=Nama Berkas +database.creationDate=Tanggal Pembuatan +database.fileSize=Ukuran Berkas +database.deleteBackupFile=Hapus Berkas Cadangan +database.importBackupFile=Impor Berkas Cadangan +database.downloadBackupFile=Unduh Berkas Cadangan +database.info_1=Ketika mengimpor data, sangat penting untuk memastikan struktur yang benar. Jika Anda tidak yakin dengan apa yang Anda lakukan, cari nasihat dan dukungan dari seorang profesional. Kesalahan dalam struktur dapat menyebabkan malfungsi aplikasi, bahkan hingga tidak dapat menjalankan aplikasi sama sekali. +database.info_2=Nama berkas tidak menjadi masalah saat mengunggah. Nama berkas akan diubah setelahnya mengikuti format backup_user_yyyyMMddHHmm.sql, memastikan konsistensi dalam penamaan. +database.submit=Impor Cadangan +database.importIntoDatabaseSuccessed=Impor ke database berhasil +database.fileNotFound=Berkas tidak Ditemukan +database.fileNullOrEmpty=Berkas tidak boleh null atau kosong +database.failedImportFile=Impor Berkas Gagal -session.expired=Your session has expired. Please refresh the page and try again. +session.expired=Sesi Anda telah kedaluwarsa. Silakan muat ulang halaman dan coba lagi. +session.refreshPage=Refresh Page ############# # HOME-PAGE # @@ -313,7 +316,7 @@ removePassword.tags=aman,Dekripsi,keamanan,buka kata sandi,hapus kata sandi home.compressPdfs.title=Kompres home.compressPdfs.desc=Kompres PDF untuk mengurangi ukuran berkas. -compressPdfs.tags=squish, kecil, kecil +compressPdfs.tags=remas, kecil, mini home.changeMetadata.title=Ubah Metadata @@ -390,9 +393,9 @@ home.certSign.title=Tanda tangani dengan Sertifikat home.certSign.desc=Menandatangani PDF dengan Certificate/Key (PEM/P12) certSign.tags=mengotentikasi, PEM, P12, resmi, mengenkripsi -home.removeCertSign.title=Remove Certificate Sign -home.removeCertSign.desc=Remove certificate signature from PDF -removeCertSign.tags=authenticate,PEM,P12,official,decrypt +home.removeCertSign.title=Hapus Tanda Tangan Sertifikat +home.removeCertSign.desc=Hapus tanda tangan sertifikat dari PDF +removeCertSign.tags=otentikasi, PEM, P12, resmi, dekripsi home.pageLayout.title=Tata Letak Multi-Halaman home.pageLayout.desc=Menggabungkan beberapa halaman dokumen PDF menjadi satu halaman @@ -479,52 +482,52 @@ autoSizeSplitPDF.tags=pdf, membagi, dokumen, organisasi home.overlay-pdfs.title=Tumpuk PDF home.overlay-pdfs.desc=Menumpuk PDF di atas PDF lain -overlay-pdfs.tags=Overlay +overlay-pdfs.tags=Overlays home.split-by-sections.title=Membagi PDF berdasarkan Bagian home.split-by-sections.desc=Membagi setiap halaman PDF menjadi beberapa bagian horizontal dan vertikal yang lebih kecil split-by-sections.tags=Membagi Bagian, Membagi, Menyesuaikan -home.AddStampRequest.title=Add Stamp to PDF -home.AddStampRequest.desc=Add text or add image stamps at set locations -AddStampRequest.tags=Stamp, Add image, center image, Watermark, PDF, Embed, Customize +home.AddStampRequest.title=Tambahkan Tanda Tangan ke PDF +home.AddStampRequest.desc=Tambahkan teks atau gambar tanda tangan di lokasi yang ditentukan +AddStampRequest.tags=Tanda tangan, tambahkan gambar, posisikan gambar di tengah, air tinta, PDF, embedding, customisasi -home.PDFToBook.title=PDF to Book -home.PDFToBook.desc=Converts PDF to Book/Comic formats using calibre -PDFToBook.tags=Book,Comic,Calibre,Convert,manga,amazon,kindle +home.PDFToBook.title=PDF ke Buku +home.PDFToBook.desc=Mengonversi PDF ke format Buku/Komik menggunakan calibre +PDFToBook.tags=Buku,Komik,Calibre,Konversi,manga,amazon,kindle -home.BookToPDF.title=Book to PDF -home.BookToPDF.desc=Converts Books/Comics formats to PDF using calibre -BookToPDF.tags=Book,Comic,Calibre,Convert,manga,amazon,kindle +home.BookToPDF.title=Buku ke PDF +home.BookToPDF.desc=Mengonversi format Buku/Komik ke PDF menggunakan calibre +BookToPDF.tags=Buku,Komik,Calibre,Konversi,manga,amazon,kindle -home.removeImagePdf.title=Remove image -home.removeImagePdf.desc=Remove image from PDF to reduce file size -removeImagePdf.tags=Remove Image,Page operations,Back end,server side +home.removeImagePdf.title=Hapus Gambar +home.removeImagePdf.desc=Hapus gambar dari PDF untuk mengurangi ukuran file +removeImagePdf.tags=Hapus Gambar,Operasi Halaman,Backend,server side -home.splitPdfByChapters.title=Split PDF by Chapters -home.splitPdfByChapters.desc=Split a PDF into multiple files based on its chapter structure. -splitPdfByChapters.tags=split,chapters,bookmarks,organize +home.splitPdfByChapters.title=Pisahkan PDF berdasarkan Bab +home.splitPdfByChapters.desc=Memisahkan PDF menjadi beberapa file berdasarkan struktur babnya. +splitPdfByChapters.tags=pemisahan,bab,bookmark,atur #replace-invert-color -replace-color.title=Replace-Invert-Color -replace-color.header=Replace-Invert Color PDF -home.replaceColorPdf.title=Replace and Invert Color -home.replaceColorPdf.desc=Replace color for text and background in PDF and invert full color of pdf to reduce file size -replaceColorPdf.tags=Replace Color,Page operations,Back end,server side -replace-color.selectText.1=Replace or Invert color Options -replace-color.selectText.2=Default(Default high contrast colors) -replace-color.selectText.3=Custom(Customized colors) -replace-color.selectText.4=Full-Invert(Invert all colors) -replace-color.selectText.5=High contrast color options -replace-color.selectText.6=white text on black background -replace-color.selectText.7=Black text on white background -replace-color.selectText.8=Yellow text on black background -replace-color.selectText.9=Green text on black background -replace-color.selectText.10=Choose text Color -replace-color.selectText.11=Choose background Color -replace-color.submit=Replace +replace-color.title=Ganti-Inversi-Warna +replace-color.header=Ganti-Inversi Warna PDF +home.replaceColorPdf.title=Ganti dan Inversi Warna +home.replaceColorPdf.desc=Ganti warna untuk teks dan latar belakang dalam PDF dan inversi seluruh warna PDF untuk mengurangi ukuran file +replaceColorPdf.tags=Ganti Warna,Operasi Halaman,Backend,server side +replace-color.selectText.1=Opsi Ganti atau Inversi warna +replace-color.selectText.2=Default(Warna kontras tinggi default) +replace-color.selectText.3=Kustom(Warna yang disesuaikan) +replace-color.selectText.4=Full-Inversi(Inversi semua warna) +replace-color.selectText.5=Opsi warna kontras tinggi +replace-color.selectText.6=teks putih di latar belakang hitam +replace-color.selectText.7=teks hitam di latar belakang putih +replace-color.selectText.8=teks kuning di latar belakang hitam +replace-color.selectText.9=teks hijau di latar belakang hitam +replace-color.selectText.10=Pilih warna teks +replace-color.selectText.11=Pilih warna latar belakang +replace-color.submit=Ganti @@ -543,17 +546,17 @@ login.locked=Akun Anda telah dikunci. login.signinTitle=Silakan masuk login.ssoSignIn=Masuk melalui Single Sign - on login.oauth2AutoCreateDisabled=OAUTH2 Buat Otomatis Pengguna Dinonaktifkan -login.oauth2AdminBlockedUser=Registration or logging in of non-registered users is currently blocked. Please contact the administrator. -login.oauth2RequestNotFound=Authorization request not found -login.oauth2InvalidUserInfoResponse=Invalid User Info Response -login.oauth2invalidRequest=Invalid Request -login.oauth2AccessDenied=Access Denied -login.oauth2InvalidTokenResponse=Invalid Token Response -login.oauth2InvalidIdToken=Invalid Id Token -login.userIsDisabled=User is deactivated, login is currently blocked with this username. Please contact the administrator. -login.alreadyLoggedIn=You are already logged in to -login.alreadyLoggedIn2=devices. Please log out of the devices and try again. -login.toManySessions=You have too many active sessions +login.oauth2AdminBlockedUser=Registrasi atau login pengguna yang tidak terdaftar saat ini diblokir. Silakan hubungi administrator. +login.oauth2RequestNotFound=Permintaan otorisasi tidak ditemukan +login.oauth2InvalidUserInfoResponse=Respons Info Pengguna Tidak Valid +login.oauth2invalidRequest=Permintaan Tidak Valid +login.oauth2AccessDenied=Akses Ditolak +login.oauth2InvalidTokenResponse=Respons Token Tidak Valid +login.oauth2InvalidIdToken=Token ID Tidak Valid +login.userIsDisabled=Pengguna dinonaktifkan, login saat ini diblokir dengan nama pengguna ini. Silakan hubungi administrator. +login.alreadyLoggedIn=Anda sudah login ke +login.alreadyLoggedIn2=perangkat. Silakan keluar dari perangkat dan coba lagi. +login.toManySessions=Anda memiliki terlalu banyak sesi aktif #auto-redact autoRedact.title=Redaksional Otomatis @@ -585,7 +588,7 @@ pdfToSinglePage.submit=Konversi ke Halaman Tunggal pageExtracter.title=Ekstrak Halaman pageExtracter.header=Ekstrak Halaman pageExtracter.submit=Ekstrak -pageExtracter.placeholder=(e.g. 1,2,8 or 4,7,12-16 or 2n-1) +pageExtracter.placeholder=(misalnya 1,2,8 atau 4,7,12-16 atau 2n-1) #getPdfInfo @@ -617,37 +620,37 @@ HTMLToPDF.header=HTML Ke PDF HTMLToPDF.help=Menerima berkas HTML dan ZIP yang berisi html / css / gambar, dll yang diperlukan HTMLToPDF.submit=Konversi HTMLToPDF.credit=Menggunakan WeasyPrint -HTMLToPDF.zoom=Zoom level for displaying the website. -HTMLToPDF.pageWidth=Width of the page in centimeters. (Blank to default) -HTMLToPDF.pageHeight=Height of the page in centimeters. (Blank to default) -HTMLToPDF.marginTop=Top margin of the page in millimeters. (Blank to default) -HTMLToPDF.marginBottom=Bottom margin of the page in millimeters. (Blank to default) -HTMLToPDF.marginLeft=Left margin of the page in millimeters. (Blank to default) -HTMLToPDF.marginRight=Right margin of the page in millimeters. (Blank to default) -HTMLToPDF.printBackground=Render the background of websites. -HTMLToPDF.defaultHeader=Enable Default Header (Name and page number) -HTMLToPDF.cssMediaType=Change the CSS media type of the page. -HTMLToPDF.none=None -HTMLToPDF.print=Print -HTMLToPDF.screen=Screen +HTMLToPDF.zoom=Tingkat perbersan untuk menampilkan situs web. +HTMLToPDF.pageWidth=Lebar halaman dalam sentimeter. (Kosong untuk default) +HTMLToPDF.pageHeight=Tinggi halaman dalam sentimeter. (Kosong untuk default) +HTMLToPDF.marginTop=Margin atas halaman dalam milimeter. (Kosong untuk default) +HTMLToPDF.marginBottom=Margin bawah halaman dalam milimeter. (Kosong untuk default) +HTMLToPDF.marginLeft=Margin kiri halaman dalam milimeter. (Kosong untuk default) +HTMLToPDF.marginRight=Margin kanan halaman dalam milimeter. (Kosong untuk default) +HTMLToPDF.printBackground=Render latar belakang situs web. +HTMLToPDF.defaultHeader=Aktifkan Header Default (Nama dan nomor halaman) +HTMLToPDF.cssMediaType=Ubah jenis media CSS halaman. +HTMLToPDF.none=Tidak ada +HTMLToPDF.print=Cetak +HTMLToPDF.screen=Layar #AddStampRequest -AddStampRequest.header=Stamp PDF -AddStampRequest.title=Stamp PDF -AddStampRequest.stampType=Stamp Type -AddStampRequest.stampText=Stamp Text -AddStampRequest.stampImage=Stamp Image -AddStampRequest.alphabet=Alphabet -AddStampRequest.fontSize=Font/Image Size -AddStampRequest.rotation=Rotation -AddStampRequest.opacity=Opacity -AddStampRequest.position=Position -AddStampRequest.overrideX=Override X Coordinate -AddStampRequest.overrideY=Override Y Coordinate -AddStampRequest.customMargin=Custom Margin -AddStampRequest.customColor=Custom Text Color -AddStampRequest.submit=Submit +AddStampRequest.header=Stampel PDF +AddStampRequest.title=Stampel PDF +AddStampRequest.stampType=Jenis Stampel +AddStampRequest.stampText=Teks Stampel +AddStampRequest.stampImage=Gambar Stampel +AddStampRequest.alphabet=Alfabet +AddStampRequest.fontSize=Ukuran Font/Gambar +AddStampRequest.rotation=Rotasi +AddStampRequest.opacity=Transparansi +AddStampRequest.position=Posisi +AddStampRequest.overrideX=Timpa Koordinat X +AddStampRequest.overrideY=Timpa Koordinat Y +AddStampRequest.customMargin=Margin Kustom +AddStampRequest.customColor=Warna Teks Kustom +AddStampRequest.submit=Kirim #sanitizePDF @@ -728,7 +731,7 @@ pageLayout.submit=Kirim scalePages.title=Sesuaikan skala halaman scalePages.header=Sesuaikan skala halaman scalePages.pageSize=Ukuran halaman dokumen. -scalePages.keepPageSize=Original Size +scalePages.keepPageSize=Ukuran Asli scalePages.scaleFactor=Tingkat zoom (potong) halaman. scalePages.submit=Kirim @@ -737,30 +740,31 @@ scalePages.submit=Kirim certSign.title=Penandatanganan Sertifikat certSign.header=Menandatangani PDF dengan sertifikat Anda (Sedang dalam proses) certSign.selectPDF=Pilih Berkas PDF untuk Penandatanganan: -certSign.jksNote=Note: If your certificate type is not listed below, please convert it to a Java Keystore (.jks) file using the keytool command line tool. Then, choose the .jks file option below. +certSign.jksNote=Catatan: Jika tipe sertifikat Anda tidak terdaftar di bawah, silakan konversi ke file Java Keystore (.jks) menggunakan alat baris perintah keytool. Kemudian, pilih opsi file .jks di bawah. certSign.selectKey=Pilih Berkas Kunci Pribadi Anda (format PKCS # 8, bisa .pem atau .der): certSign.selectCert=Pilih Berkas Sertifikat Anda (format X.509, bisa .pem atau .der): certSign.selectP12=Pilih Berkas Keystore PKCS #12 Anda (.p12 atau .pfx) (Opsional, Jika disediakan, berkas tersebut harus berisi kunci pribadi dan sertifikat Anda): -certSign.selectJKS=Select Your Java Keystore File (.jks or .keystore): +certSign.selectJKS=Pilih Berkas Java Keystore File (.jks atau .keystore): certSign.certType=Jenis Sertifikat certSign.password=Masukkan Kata Sandi Kunci atau Kunci Pribadi Anda (Jika Ada): certSign.showSig=Tampilkan Tanda Tangan certSign.reason=Alasan certSign.location=Lokasi certSign.name=Nama +certSign.showLogo=Tampilkan Logo certSign.submit=Tanda tangani PDF #removeCertSign -removeCertSign.title=Remove Certificate Signature -removeCertSign.header=Remove the digital certificate from the PDF -removeCertSign.selectPDF=Select a PDF file: -removeCertSign.submit=Remove Signature +removeCertSign.title=Hapus Tanda Tangan Sertifikat +removeCertSign.header=Hapus sertifikat digital dari PDF +removeCertSign.selectPDF=Pilih file PDF: +removeCertSign.submit=Hapus Tanda Tangan #removeBlanks -removeBlanks.title=Hapus Halaman Kosong -removeBlanks.header=Remove Blank Pages +removeBlanks.title=Hapus yang Kosong +removeBlanks.header=Hapus Halaman Kosong removeBlanks.threshold=Ambang Batas Keputihan Piksel: removeBlanks.thresholdDesc=Ambang batas untuk menentukan seberapa putih piksel putih yang harus diklasifikasikan sebagai 'Putih'. 0=Hitam, 255 putih murni. removeBlanks.whitePercent=Persen Putih (%): @@ -777,24 +781,27 @@ removeAnnotations.submit=Hapus #compare compare.title=Bandingkan compare.header=Bandingkan PDF -compare.highlightColor.1=Highlight Color 1: -compare.highlightColor.2=Highlight Color 2: +compare.highlightColor.1=Warna Sorotan 1: +compare.highlightColor.2=Warna Sorotan 2: compare.document.1=Dokumen 1 compare.document.2=Dokumen 2 compare.submit=Bandingkan +compare.complex.message=Satu atau kedua dokumen yang disediakan adalah file besar, keakuratan perbandingan mungkin berkurang +compare.large.file.message=Satu atau Kedua dokumen yang disediakan terlalu besar untuk diproses +compare.no.text.message=Satu atau kedua PDF yang dipilih tidak memiliki konten teks. Pilih PDF dengan teks untuk perbandingan. #BookToPDF -BookToPDF.title=Books and Comics to PDF -BookToPDF.header=Book to PDF -BookToPDF.credit=Uses Calibre -BookToPDF.submit=Convert +BookToPDF.title=Buku dan Komik ke PDF +BookToPDF.header=Buku ke PDF +BookToPDF.credit=Menggunakan Calibre +BookToPDF.submit=Konversi #PDFToBook -PDFToBook.title=PDF to Book -PDFToBook.header=PDF to Book +PDFToBook.title=PDF ke Buku +PDFToBook.header=PDF ke Buku PDFToBook.selectText.1=Format -PDFToBook.credit=Uses Calibre -PDFToBook.submit=Convert +PDFToBook.credit=Menggunakan Calibre +PDFToBook.submit=Konversi #sign sign.title=Tanda @@ -804,6 +811,11 @@ sign.draw=Gambar Tanda Tangan sign.text=Masukan Teks sign.clear=Hapus sign.add=Tambah +sign.saved=Tanda Tangan Disimpan +sign.save=Simpan Tanda Tangan +sign.personalSigs=Tanda Tangan Pribadi +sign.sharedSigs=Tanda Tangan Berbagi +sign.noSavedSigs=Tidak ditemukan tanda tangan yang disimpan #repair @@ -815,7 +827,7 @@ repair.submit=Perbaiki #flatten flatten.title=Ratakan flatten.header=Ratakan PDF -flatten.flattenOnlyForms=Flatten only forms +flatten.flattenOnlyForms=Ratakan hanya formulir flatten.submit=Ratakan @@ -830,7 +842,7 @@ ScannerImageSplit.selectText.7=Area Kontur Minimum: ScannerImageSplit.selectText.8=Menetapkan ambang batas area kontur minimum untuk foto ScannerImageSplit.selectText.9=Ukuran Batas: ScannerImageSplit.selectText.10=Menetapkan ukuran batas yang ditambahkan dan dihapus untuk mencegah batas putih pada output (default: 1). -ScannerImageSplit.info=Python is not installed. It is required to run. +ScannerImageSplit.info=Python tidak terinstal. Ini diperlukan untuk menjalankan. #OCR @@ -857,7 +869,7 @@ ocr.submit=Memproses PDF dengan OCR extractImages.title=Ekstrak Gambar extractImages.header=Mengekstrak Gambar extractImages.selectText=Pilih format gambar yang akan dikonversi -extractImages.allowDuplicates=Save duplicate images +extractImages.allowDuplicates=Simpan Gambar Duplikat extractImages.submit=Ekstrak @@ -865,7 +877,7 @@ extractImages.submit=Ekstrak fileToPDF.title=Berkas ke PDF fileToPDF.header=Mengonversi berkas apa pun ke PDF fileToPDF.credit=Layanan ini menggunakan LibreOffice dan Unoconv untuk konversi berkas. -fileToPDF.supportedFileTypesInfo=Supported File types +fileToPDF.supportedFileTypesInfo=Jenis File Dukungan fileToPDF.supportedFileTypes=Jenis berkas yang didukung harus mencakup yang di bawah ini, namun untuk daftar lengkap format yang didukung, silakan lihat dokumentasi LibreOffice fileToPDF.submit=Konversi ke PDF @@ -895,7 +907,7 @@ merge.title=Gabungkan merge.header=Gabungkan beberapa PDFs (2+) merge.sortByName=Sortir berdasarkan nama merge.sortByDate=Sortir berdasrkan tanggal -merge.removeCertSign=Remove digital signature in the merged file? +merge.removeCertSign=Hapus tanda tangan digital dalam file yang dicampur? merge.submit=Gabungkan @@ -904,24 +916,31 @@ pdfOrganiser.title=Pengaturan Halaman pdfOrganiser.header=Pengaturan Halaman PDF pdfOrganiser.submit=Susun ulang halaman pdfOrganiser.mode=Mode -pdfOrganiser.mode.1=Custom Page Order -pdfOrganiser.mode.2=Reverse Order -pdfOrganiser.mode.3=Duplex Sort -pdfOrganiser.mode.4=Booklet Sort -pdfOrganiser.mode.5=Side Stitch Booklet Sort -pdfOrganiser.mode.6=Odd-Even Split -pdfOrganiser.mode.7=Remove First -pdfOrganiser.mode.8=Remove Last -pdfOrganiser.mode.9=Remove First and Last -pdfOrganiser.mode.10=Odd-Even Merge -pdfOrganiser.placeholder=(e.g. 1,3,2 or 4-8,2,10-12 or 2n-1) +pdfOrganiser.mode.1=Urutan Halaman Kustom +pdfOrganiser.mode.2=Urutan Terbalik +pdfOrganiser.mode.3=Sortir Duplex +pdfOrganiser.mode.4=Sortir Buku +pdfOrganiser.mode.5=Sortir Buku Jahitan Samping +pdfOrganiser.mode.6=Pemisahan Genap-Ganjil +pdfOrganiser.mode.7=Hapus Pertama +pdfOrganiser.mode.8=Hapus Terakhir +pdfOrganiser.mode.9=Hapus Pertama dan Terakhir +pdfOrganiser.mode.10=Penggabungan Genap-Ganjil +pdfOrganiser.placeholder=(misalnya 1,3,2 atau 4-8,2,10-12 atau 2n-1) #multiTool multiTool.title=Alat Multi PDF multiTool.header=Alat Multi PDF -multiTool.uploadPrompts=File Name - +multiTool.uploadPrompts=Nama Berkas +multiTool.selectAll=Select All +multiTool.deselectAll=Deselect All +multiTool.selectPages=Page Select +multiTool.selectedPages=Selected Pages +multiTool.page=Page +multiTool.deleteSelected=Delete Selected +multiTool.downloadAll=Export +multiTool.downloadSelected=Export Selected #view pdf viewPdf.title=Lihat PDF viewPdf.header=Lihat PDF @@ -931,7 +950,7 @@ pageRemover.title=Penghapus Halaman pageRemover.header=Penghapus Halaman PDF pageRemover.pagesToDelete=Halaman yang akan dihapus (Masukkan daftar nomor halaman yang dipisahkan dengan koma) : pageRemover.submit=Hapus Halaman -pageRemover.placeholder=(e.g. 1,2,6 or 1-10,15-30) +pageRemover.placeholder=(misalnya 1,2,6 atau 1-10,15-30) #rotate @@ -982,7 +1001,7 @@ pdfToImage.color=Warna pdfToImage.grey=Skala abu-abu pdfToImage.blackwhite=Black and White (Bisa kehilangan data!) pdfToImage.submit=Konversi -pdfToImage.info=Python is not installed. Required for WebP conversion. +pdfToImage.info=Python tidak terinstal. Diperlukan untuk konversi WebP. #addPassword @@ -1016,13 +1035,13 @@ watermark.selectText.3=Ukuran Huruf: watermark.selectText.4=Rotasi (0-360): watermark.selectText.5=widthSpacer (Spasi diantara setiap watermark horisontal): watermark.selectText.6=heightSpacer (Spasi diantara setiap watermark vertikal): -watermark.selectText.7=Opacity (0% - 100%): +watermark.selectText.7=Kejernihan (0% - 100%): watermark.selectText.8=Tipe Watermark: watermark.selectText.9=Gambar Watermark: -watermark.selectText.10=Convert PDF to PDF-Image +watermark.selectText.10=Konversi PDF ke PDF-Image watermark.submit=Tambahkan Watermark -watermark.type.1=Text -watermark.type.2=Image +watermark.type.1=Teks +watermark.type.2=Gambar #Change permissions @@ -1060,7 +1079,7 @@ changeMetadata.author=Penulis: changeMetadata.creationDate=Tanggal Dibuat (yyyy/MM/dd HH:mm:ss): changeMetadata.creator=Pencipta: changeMetadata.keywords=Kata kunci: -changeMetadata.modDate=Tangal Diupdate (yyyy/MM/dd HH:mm:ss): +changeMetadata.modDate=Tangal Diperbarui (yyyy/MM/dd HH:mm:ss): changeMetadata.producer=Produser: changeMetadata.subject=Subjek: changeMetadata.trapped=Terperangkap: @@ -1074,13 +1093,13 @@ pdfToPDFA.title=PDF Ke PDF/A pdfToPDFA.header=PDF ke PDF/A pdfToPDFA.credit=Layanan ini menggunakan ghostscript untuk konversi PDF/A. pdfToPDFA.submit=Konversi -pdfToPDFA.tip=Currently does not work for multiple inputs at once -pdfToPDFA.outputFormat=Output format -pdfToPDFA.pdfWithDigitalSignature=The PDF contains a digital signature. This will be removed in the next step. +pdfToPDFA.tip=Saat ini tidak dapat digunakan untuk beberapa input sekaligus +pdfToPDFA.outputFormat=Format keluaran +pdfToPDFA.pdfWithDigitalSignature=PDF ini mengandung tanda tangan digital. Ini akan dihapus pada langkah berikutnya. #PDFToWord -PDFToWord.title=PDF Ke Word +PDFToWord.title=PDF ke Word PDFToWord.header=PDF ke Word PDFToWord.selectText.1=Hasil format berkas PDFToWord.credit=Layanan ini menggunakan LibreOffice untuk konversi berkas. @@ -1096,7 +1115,7 @@ PDFToPresentation.submit=Konversi #PDFToText -PDFToText.title=PDF Ke RTF (Text) +PDFToText.title=PDF ke RTF (Text) PDFToText.header=PDF ke RTF (Text) PDFToText.selectText.1=Hasil format berkas PDFToText.credit=Layanan ini menggunakan LibreOffice untuk konversi berkas. @@ -1104,20 +1123,20 @@ PDFToText.submit=Konversi #PDFToHTML -PDFToHTML.title=PDF Ke HTML +PDFToHTML.title=PDF ke HTML PDFToHTML.header=PDF ke HTML PDFToHTML.credit=Layanan ini menggunakan pdftohtml untuk konversi berkas. PDFToHTML.submit=Konversi #PDFToXML -PDFToXML.title=PDF Ke XML +PDFToXML.title=PDF ke XML PDFToXML.header=PDF ke XML PDFToXML.credit=Layanan ini menggunakan LibreOffice untuk konversi berkas. PDFToXML.submit=Konversi #PDFToCSV -PDFToCSV.title=PDF Ke CSV +PDFToCSV.title=PDF ke CSV PDFToCSV.header=PDF ke CSV PDFToCSV.prompt=Pilih halaman untuk mengambil tabel PDFToCSV.submit=Ektraksi @@ -1158,67 +1177,65 @@ split-by-sections.vertical.label=Pembagian Vertikal split-by-sections.horizontal.placeholder=Input angka untuk pembagian horizontal split-by-sections.vertical.placeholder=Input angka untuk pembagian vertikal split-by-sections.submit=Pisahkan PDF -split-by-sections.merge=Merge Into One PDF +split-by-sections.merge=Gabung Menjadi Berkas PDF Tunggal #printFile -printFile.title=Print File -printFile.header=Print File to Printer -printFile.selectText.1=Select File to Print -printFile.selectText.2=Enter Printer Name -printFile.submit=Print +printFile.title=Cetak File +printFile.header=Cetak File ke Printer +printFile.selectText.1=Pilih File untuk Dicetak +printFile.selectText.2=Masukkan Nama Printer +printFile.submit=Cetak #licenses -licenses.nav=Licenses -licenses.title=3rd Party Licenses -licenses.header=3rd Party Licenses -licenses.module=Module -licenses.version=Version -licenses.license=License +licenses.nav=Lisensi +licenses.title=Lisensi Pihak Ketiga +licenses.header=Lisensi Pihak Ketiga +licenses.module=Modul +licenses.version=Versi +licenses.license=Lisensi #survey -survey.nav=Survey -survey.title=Stirling-PDF Survey -survey.description=Stirling-PDF has no tracking so we want to hear from our users to improve Stirling-PDF! -survey.changes=Stirling-PDF has changed since the last survey! To find out more please check our blog post here: -survey.changes2=With these changes we are getting paid business support and funding -survey.please=Please consider taking our survey! -survey.disabled=(Survey popup will be disabled in following updates but available at foot of page) -survey.button=Take Survey -survey.dontShowAgain=Don't show again +survey.nav=Survei +survey.title=Survei Stirling-PDF +survey.description=Stirling-PDF tidak memiliki pelacakan, jadi kami ingin mendengar dari pengguna kami untuk meningkatkan Stirling-PDF! +survey.changes=Stirling-PDF telah berubah sejak survei terakhir! Untuk mengetahui lebih lanjut, silakan periksa posting blog kami di sini: +survey.changes2=Dengan perubahan ini, kami mendapatkan dukungan bisnis yang dibayar dan pendanaan +survey.please=Silakan pertimbangkan untuk mengikuti survei kami! +survey.disabled=(Popup survei akan dinonaktifkan dalam pembaruan berikutnya tetapi tersedia di bagian bawah halaman) +survey.button=Ikuti Survei +survey.dontShowAgain=Jangan tampilkan lagi #error -error.sorry=Sorry for the issue! -error.needHelp=Need help / Found an issue? -error.contactTip=If you're still having trouble, don't hesitate to reach out to us for help. You can submit a ticket on our GitHub page or contact us through Discord: -error.404.head=404 - Page Not Found | Oops, we tripped in the code! -error.404.1=We can't seem to find the page you're looking for. -error.404.2=Something went wrong -error.github=Submit a ticket on GitHub -error.showStack=Show Stack Trace -error.copyStack=Copy Stack Trace -error.githubSubmit=GitHub - Submit a ticket -error.discordSubmit=Discord - Submit Support post +error.sorry=Maaf atas masalah ini! +error.needHelp=Butuh bantuan / Menemukan masalah? +error.contactTip=Jika Anda masih mengalami kesulitan, jangan ragu untuk menghubungi kami untuk bantuan. Anda dapat mengirim tiket di halaman GitHub kami atau menghubungi kami melalui Discord: +error.404.head=404 - Halaman Tidak Ditemukan | Ups, kami tersandung dalam kode! +error.404.1=Kami tidak dapat menemukan halaman yang Anda cari. +error.404.2=Terjadi kesalahan +error.github=Kirim tiket di GitHub +error.showStack=Tampilkan Stack Trace +error.copyStack=Salin Stack Trace +error.githubSubmit=GitHub - Kirim tiket +error.discordSubmit=Discord - Kirim pos dukungan #remove-image -removeImage.title=Remove image -removeImage.header=Remove image -removeImage.removeImage=Remove image -removeImage.submit=Remove image - - -splitByChapters.title=Split PDF by Chapters -splitByChapters.header=Split PDF by Chapters -splitByChapters.bookmarkLevel=Bookmark Level -splitByChapters.includeMetadata=Include Metadata -splitByChapters.allowDuplicates=Allow Duplicates -splitByChapters.desc.1=This tool splits a PDF file into multiple PDFs based on its chapter structure. -splitByChapters.desc.2=Bookmark Level: Choose the level of bookmarks to use for splitting (0 for top-level, 1 for second-level, etc.). -splitByChapters.desc.3=Include Metadata: If checked, the original PDF's metadata will be included in each split PDF. -splitByChapters.desc.4=Allow Duplicates: If checked, allows multiple bookmarks on the same page to create separate PDFs. -splitByChapters.submit=Split PDF +removeImage.title=Hapus gambar +removeImage.header=Hapus gambar +removeImage.removeImage=Hapus gambar +removeImage.submit=Hapus gambar +splitByChapters.title=Pecah PDF berdasarkan Bab +splitByChapters.header=Pecah PDF berdasarkan Bab +splitByChapters.bookmarkLevel=Tingkatan Markah +splitByChapters.includeMetadata=Termasuk Metadata +splitByChapters.allowDuplicates=Izinkan Duplikat +splitByChapters.desc.1=Alat ini membagi file PDF menjadi beberapa PDF berdasarkan struktur babnya. +splitByChapters.desc.2=Tingkatan Markah: Pilih tingkatan markah yang digunakan untuk membagi (0 untuk tingkat atas, 1 untuk tingkat kedua, dll.). +splitByChapters.desc.3=Termasuk Metadata: Jika dicentang, metadata asli PDF akan disertakan dalam setiap PDF yang dibagi. +splitByChapters.desc.4=Izinkan Duplikat: Jika dicentang, mengizinkan beberapa markah pada halaman yang sama untuk membuat PDF terpisah. +splitByChapters.submit=Pecah PDF diff --git a/src/main/resources/messages_it_IT.properties b/src/main/resources/messages_it_IT.properties index bc3de60ba..b9ad07650 100644 --- a/src/main/resources/messages_it_IT.properties +++ b/src/main/resources/messages_it_IT.properties @@ -27,7 +27,7 @@ bored=Stanco di aspettare? alphabet=Alfabeto downloadPdf=Scarica PDF text=Testo -font=Font +font=Fonte selectFillter=-- Seleziona -- pageNum=Numero pagina sizes.small=Piccolo @@ -79,6 +79,8 @@ info=Info pro=Pro page=Pagina pages=Pagine +loading=Caricamento... +addToDoc=Aggiungi al documento legal.privacy=Informativa sulla privacy legal.terms=Termini e Condizioni @@ -108,7 +110,7 @@ pipelineOptions.pipelineNamePrompt=Inserisci qui il nome della pipeline pipelineOptions.selectOperation=Seleziona operazione pipelineOptions.addOperationButton=Aggiungi operazione pipelineOptions.pipelineHeader=Pipeline: -pipelineOptions.saveButton=Download +pipelineOptions.saveButton=Salva pipelineOptions.validateButton=Convalidare ######################## @@ -145,7 +147,7 @@ navbar.sections.convertFrom=Converti da PDF navbar.sections.security=Firma & Sicurezza navbar.sections.advance=Avanzate navbar.sections.edit=Visualizza & Modifica -navbar.sections.popular=Populare +navbar.sections.popular=Popolare ############# # SETTINGS # @@ -244,6 +246,7 @@ database.fileNullOrEmpty=Il file non deve essere nullo o vuoto database.failedImportFile=Importazione file non riuscita session.expired=La tua sessione è scaduta. Aggiorna la pagina e riprova. +session.refreshPage=Aggiorna pagina ############# # HOME-PAGE # @@ -748,6 +751,7 @@ certSign.showSig=Mostra firma certSign.reason=Motivo certSign.location=Posizione certSign.name=Nome +certSign.showLogo=Mostra Logo certSign.submit=Firma PDF @@ -782,6 +786,9 @@ compare.highlightColor.2=Evidenzia colore 2: compare.document.1=Documento 1 compare.document.2=Documento 2 compare.submit=Compara +compare.complex.message=Uno o entrambi i documenti forniti sono file di grandi dimensioni, l'accuratezza del confronto potrebbe risultare ridotta +compare.large.file.message=Uno o entrambi i documenti forniti sono troppo grandi per essere elaborati +compare.no.text.message=Uno o entrambi i PDF selezionati non hanno contenuto di testo. Si prega di scegliere PDF con testo per il confronto. #BookToPDF BookToPDF.title=Libri e fumetti in PDF @@ -804,6 +811,11 @@ sign.draw=Disegna Firma sign.text=Testo sign.clear=Cancella sign.add=Aggiungi +sign.saved=Firme salvate +sign.save=Firma salvata +sign.personalSigs=Firme personali +sign.sharedSigs=Firme condivise +sign.noSavedSigs=Nessuna firma salvata trovata #repair @@ -921,7 +933,14 @@ pdfOrganiser.placeholder=(ad es. 1,3,2 o 4-8,2,10-12 o 2n-1) multiTool.title=Multifunzione PDF multiTool.header=Multifunzione PDF multiTool.uploadPrompts=Nome file - +multiTool.selectAll=Select All +multiTool.deselectAll=Deselect All +multiTool.selectPages=Page Select +multiTool.selectedPages=Selected Pages +multiTool.page=Page +multiTool.deleteSelected=Delete Selected +multiTool.downloadAll=Export +multiTool.downloadSelected=Export Selected #view pdf viewPdf.title=Visualizza PDF viewPdf.header=Visualizza PDF @@ -1220,5 +1239,3 @@ splitByChapters.desc.2=Livello segnalibro: seleziona il livello dei segnalibri d splitByChapters.desc.3=Includi metadati: se selezionato, i metadati del PDF originale verranno inclusi in ogni PDF diviso. splitByChapters.desc.4=Consenti duplicati: se selezionata, consente più segnalibri sulla stessa pagina per creare PDF separati. splitByChapters.submit=Dividi PDF - - diff --git a/src/main/resources/messages_ja_JP.properties b/src/main/resources/messages_ja_JP.properties index 6e7aac2c0..113ea186b 100644 --- a/src/main/resources/messages_ja_JP.properties +++ b/src/main/resources/messages_ja_JP.properties @@ -79,6 +79,8 @@ info=Info pro=Pro page=Page pages=Pages +loading=Loading... +addToDoc=Add to Document legal.privacy=プライバシーポリシー legal.terms=利用規約 @@ -244,6 +246,7 @@ database.fileNullOrEmpty=ファイルは null または空であってはなり database.failedImportFile=ファイルのインポートに失敗 session.expired=Your session has expired. Please refresh the page and try again. +session.refreshPage=Refresh Page ############# # HOME-PAGE # @@ -748,6 +751,7 @@ certSign.showSig=署名を表示 certSign.reason=理由 certSign.location=場所 certSign.name=名前 +certSign.showLogo=Show Logo certSign.submit=PDFに署名 @@ -782,6 +786,9 @@ compare.highlightColor.2=ハイライトカラー 2: compare.document.1=ドキュメント 1 compare.document.2=ドキュメント 2 compare.submit=比較 +compare.complex.message=One or both of the provided documents are large files, accuracy of comparison may be reduced +compare.large.file.message=One or Both of the provided documents are too large to process +compare.no.text.message=One or both of the selected PDFs have no text content. Please choose PDFs with text for comparison. #BookToPDF BookToPDF.title=書籍やコミックをPDFに変換 @@ -804,6 +811,11 @@ sign.draw=署名を書く sign.text=テキスト入力 sign.clear=クリア sign.add=追加 +sign.saved=Saved Signatures +sign.save=Save Signature +sign.personalSigs=Personal Signatures +sign.sharedSigs=Shared Signatures +sign.noSavedSigs=No saved signatures found #repair @@ -921,7 +933,14 @@ pdfOrganiser.placeholder=(例:1,3,2または4-8,2,10-12または2n-1) multiTool.title=PDFマルチツール multiTool.header=PDFマルチツール multiTool.uploadPrompts=ファイル名 - +multiTool.selectAll=Select All +multiTool.deselectAll=Deselect All +multiTool.selectPages=Page Select +multiTool.selectedPages=Selected Pages +multiTool.page=Page +multiTool.deleteSelected=Delete Selected +multiTool.downloadAll=Export +multiTool.downloadSelected=Export Selected #view pdf viewPdf.title=PDFを表示 viewPdf.header=PDFを表示 @@ -1220,5 +1239,3 @@ splitByChapters.desc.2=Bookmark Level: Choose the level of bookmarks to use for splitByChapters.desc.3=Include Metadata: If checked, the original PDF's metadata will be included in each split PDF. splitByChapters.desc.4=Allow Duplicates: If checked, allows multiple bookmarks on the same page to create separate PDFs. splitByChapters.submit=Split PDF - - diff --git a/src/main/resources/messages_ko_KR.properties b/src/main/resources/messages_ko_KR.properties index 832f7affb..ced8518ae 100644 --- a/src/main/resources/messages_ko_KR.properties +++ b/src/main/resources/messages_ko_KR.properties @@ -3,8 +3,8 @@ ########### # the direction that the language is written (ltr = left to right, rtl = right to left) language.direction=ltr -addPageNumbers.fontSize=Font Size -addPageNumbers.fontName=Font Name +addPageNumbers.fontSize=폰트 크기 +addPageNumbers.fontName=폰트 이름 pdfPrompt=PDF 파일 선택 multiPdfPrompt=여러 PDF 파일 선택 multiPdfDropPrompt=사용할 모든 PDF 문서를 선택(또는 드래그 앤 드롭)합니다 @@ -47,7 +47,7 @@ green=녹색 blue=파랑 custom=관습... WorkInProgess=작업 진행 중, 작동하지 않거나 버그가 있을 수 있음, 문제가 있으면 보고하십시오! -poweredBy=Powered by +poweredBy=제공 yes=예 no=아니요 changedCredsMessage=계정 정보 변경 성공! @@ -56,15 +56,15 @@ userNotFoundMessage=사용자를 찾을 수 없습니다. incorrectPasswordMessage=현재 비밀번호가 틀립니다. usernameExistsMessage=새 사용자명이 이미 존재합니다. invalidUsernameMessage=잘못된 사용자 이름입니다. 사용자 이름에는 문자, 숫자 및 다음 특수 문자(@._+-)만 포함할 수 있거나 유효한 이메일 주소여야 합니다. -invalidPasswordMessage=The password must not be empty and must not have spaces at the beginning or end. -confirmPasswordErrorMessage=New Password and Confirm New Password must match. +invalidPasswordMessage=비밀번호는 빈칸일 수 없습니다. 또한 시작이나 끝에 공백을 가질 수 없습니다. +confirmPasswordErrorMessage=새 비밀번호와 새 비밀번호 확인이 일치하지 않습니다. deleteCurrentUserMessage=현재 로그인한 사용자를 삭제할 수 없습니다. deleteUsernameExistsMessage=사용자 이름이 존재하지 않으며 삭제할 수 없습니다. downgradeCurrentUserMessage=현재 사용자의 역할을 다운그레이드할 수 없습니다 -disabledCurrentUserMessage=The current user cannot be disabled +disabledCurrentUserMessage=현재 사용자는 비활성화할 수 없습니다 downgradeCurrentUserLongMessage=현재 사용자의 역할을 다운그레이드할 수 없습니다. 따라서 현재 사용자는 표시되지 않습니다. -userAlreadyExistsOAuthMessage=The user already exists as an OAuth2 user. -userAlreadyExistsWebMessage=The user already exists as an web user. +userAlreadyExistsOAuthMessage=이미 OAuth2 사용자로 등록되어 있습니다. +userAlreadyExistsWebMessage=이미 웹 사용자로 등록되어 있습니다. error=오류 oops=어머나! help=도움말 @@ -75,16 +75,18 @@ visitGithub=GitHub 저장소 방문하기 donate=기부하기 color=색상 sponsor=스폰서 -info=Info -pro=Pro -page=Page -pages=Pages +info=정보 +pro=프로 +page=페이지 +pages=페이지 +loading=로딩 중... +addToDoc=문서에 추가 -legal.privacy=Privacy Policy -legal.terms=Terms and Conditions -legal.accessibility=Accessibility -legal.cookie=Cookie Policy -legal.impressum=Impressum +legal.privacy=개인 정보 정책 +legal.terms=이용 약관 +legal.accessibility=접근성 +legal.cookie=쿠키 정책 +legal.impressum=임프레스무 ############### # Pipeline # @@ -96,7 +98,7 @@ pipeline.defaultOption=관습 pipeline.submitButton=전송 pipeline.help=파이프라인 도움말 pipeline.scanHelp=폴더 스캔 도움말 -pipeline.deletePrompt=Are you sure you want to delete pipeline +pipeline.deletePrompt=프로젝트 파이프라인을 삭제하시겠습니까? ###################### # Pipeline Options # @@ -114,45 +116,45 @@ pipelineOptions.validateButton=확인 ######################## # ENTERPRISE EDITION # ######################## -enterpriseEdition.button=Upgrade to Pro -enterpriseEdition.warning=This feature is only available to Pro users. -enterpriseEdition.yamlAdvert=Stirling PDF Pro supports YAML configuration files and other SSO features. +enterpriseEdition.button=프로페셔널 버전으로 업그레이드 +enterpriseEdition.warning=이 기능은 프로 버전 사용자만 이용 가능합니다. +enterpriseEdition.yamlAdvert=스털링 PDF 프로버전은 YAML 구성 파일과 기타 SSO 기능을 지원합니다. enterpriseEdition.ssoAdvert=Looking for more user management features? Check out Stirling PDF Pro ################# # Analytics # ################# -analytics.title=Do you want make Stirling PDF better? -analytics.paragraph1=Stirling PDF has opt in analytics to help us improve the product. We do not track any personal information or file contents. -analytics.paragraph2=Please consider enabling analytics to help Stirling-PDF grow and to allow us to understand our users better. -analytics.enable=Enable analytics -analytics.disable=Disable analytics -analytics.settings=You can change the settings for analytics in the config/settings.yml file +analytics.title=스털링 PDF를 더 나은 서비스로 발전시키고 싶으신가요? +analytics.paragraph1=스털링 PDF는 사용자 정보 및 파일 내용을 추적하지 않는 제품 개선을 위한 옵인 애널리틱스 기능을 제공합니다. +analytics.paragraph2=애널리틱스 기능을 활성화해 주셔서 스�털링-PDF가 성장하고 우리 사용자를 더 잘 이해할 수 있도록 도와주세요. +analytics.enable=애널리틱스 활성화 +analytics.disable=애널리틱스 비활성화 +analytics.settings=애널리틱스 설정은 config/settings.yml 파일에서 변경하실 수 있습니다. ############# # NAVBAR # ############# -navbar.favorite=Favorites +navbar.favorite=즐겨찾기 navbar.darkmode=다크 모드 -navbar.language=Languages +navbar.language=언어 navbar.settings=설정 -navbar.allTools=Tools +navbar.allTools=도구 navbar.multiTool=Multi Tools -navbar.sections.organize=Organize -navbar.sections.convertTo=Convert to PDF -navbar.sections.convertFrom=Convert from PDF -navbar.sections.security=Sign & Security -navbar.sections.advance=Advanced -navbar.sections.edit=View & Edit -navbar.sections.popular=Popular +navbar.sections.organize=조직 +navbar.sections.convertTo=PDF로 변환 +navbar.sections.convertFrom=PDF에서 변환 +navbar.sections.security=서명 & 보안 +navbar.sections.advance=고급 +navbar.sections.edit=보기 & 편집 +navbar.sections.popular=인기 ############# # SETTINGS # ############# settings.title=설정 settings.update=업데이트 가능 -settings.updateAvailable={0} is the current installed version. A new version ({1}) is available. +settings.updateAvailable={0}는 현재 설치된 버전입니다. 새로운 버전 ({1})이 있습니다. settings.appVersion=앱 버전: settings.downloadOption.title=다운로드 옵션 선택 (zip 파일이 아닌 단일 파일 다운로드 시): settings.downloadOption.1=현재 창에서 열기 @@ -161,9 +163,9 @@ settings.downloadOption.3=다운로드 settings.zipThreshold=다운로드한 파일 수가 초과된 경우 파일 압축하기 settings.signOut=로그아웃 settings.accountSettings=계정 설정 -settings.bored.help=Enables easter egg game -settings.cacheInputs.name=Save form inputs -settings.cacheInputs.help=Enable to store previously used inputs for future runs +settings.bored.help=알라딘 게임을 활성화합니다 +settings.cacheInputs.name=입력 저장 +settings.cacheInputs.help=사용한 입력을 다음 실행에 저장하기 위해 활성화 changeCreds.title=계정 정보 변경 changeCreds.header=계정 정보 업데이트 @@ -202,9 +204,9 @@ adminUserSettings.header=사용자 관리 adminUserSettings.admin=관리자 adminUserSettings.user=사용자 adminUserSettings.addUser=새 사용자 추가 -adminUserSettings.deleteUser=Delete User -adminUserSettings.confirmDeleteUser=Should the user be deleted? -adminUserSettings.confirmChangeUserStatus=Should the user be disabled/enabled? +adminUserSettings.deleteUser=유저 삭제 +adminUserSettings.confirmDeleteUser=이 유저를 삭제하시겠습니까? +adminUserSettings.confirmChangeUserStatus=이 유저의 상태를 변경하시겠습니까? adminUserSettings.usernameInfo=사용자 이름은 문자, 숫자, 특수 문자 @._+-만 포함할 수 있으며 유효한 이메일 주소여야 합니다. adminUserSettings.roles=역할 adminUserSettings.role=역할 @@ -217,33 +219,34 @@ adminUserSettings.internalApiUser=내부 API 사용자 adminUserSettings.forceChange=다음 로그인 때 사용자명과 비밀번호를 변경하도록 강제 adminUserSettings.submit=사용자 저장 adminUserSettings.changeUserRole=사용자의 역할 변경 -adminUserSettings.authenticated=Authenticated -adminUserSettings.editOwnProfil=Edit own profile -adminUserSettings.enabledUser=enabled user -adminUserSettings.disabledUser=disabled user -adminUserSettings.activeUsers=Active Users: -adminUserSettings.disabledUsers=Disabled Users: -adminUserSettings.totalUsers=Total Users: -adminUserSettings.lastRequest=Last Request +adminUserSettings.authenticated=인증됨 +adminUserSettings.editOwnProfil=자신의 프로필 편집 +adminUserSettings.enabledUser=활성화된 사용자 +adminUserSettings.disabledUser=비활성화된 사용자 +adminUserSettings.activeUsers=활성화된 사용자: +adminUserSettings.disabledUsers=비활성화된 사용자: +adminUserSettings.totalUsers=총 사용자 수: +adminUserSettings.lastRequest=최근 요청 -database.title=Database Import/Export -database.header=Database Import/Export -database.fileName=File Name -database.creationDate=Creation Date -database.fileSize=File Size -database.deleteBackupFile=Delete Backup File -database.importBackupFile=Import Backup File -database.downloadBackupFile=Download Backup File -database.info_1=When importing data, it is crucial to ensure the correct structure. If you are unsure of what you are doing, seek advice and support from a professional. An error in the structure can cause application malfunctions, up to and including the complete inability to run the application. -database.info_2=The file name does not matter when uploading. It will be renamed afterward to follow the format backup_user_yyyyMMddHHmm.sql, ensuring a consistent naming convention. -database.submit=Import Backup -database.importIntoDatabaseSuccessed=Import into database successed +database.title=데이터베이스 내보내기/임포트 +database.header=데이터베이스 내보내기/임포트 +database.fileName=파일 이름 +database.creationDate=생성 날짜 +database.fileSize=파일 크기 +database.deleteBackupFile=백업 파일 삭제 +database.importBackupFile=백업 파일 가져오기 +database.downloadBackupFile=백업 파일 다운로드 +database.info_1=데이터를 가져올 때 적절한 구조가 중요합니다. 자신이 무엇을 하는지 확실하지 않다면 전문가의 조언과 지원을 청하는 것이 좋습니다. 구조에 오류가 있으면 애플리케이션 기능 실패나 애플리케이션이 완전히 작동하지 못하게 되는 등의 문제를 초래할 수 있습니다. +database.info_2=업로드 시 파일 이름은 중요하지 않습니다. 후에 backup_user_yyyyMMddHHmm.sql 형식으로 다시 지정되어 일관된 이름 규칙을 유지합니다. +database.submit=백업 가져오기 +database.importIntoDatabaseSuccessed=데이터베이스에 성공적으로 가져왔습니다 database.fileNotFound=File not Found -database.fileNullOrEmpty=File must not be null or empty +database.fileNullOrEmpty=파일은 null이나 빈 상태로 될 수 없습니다 database.failedImportFile=Failed Import File -session.expired=Your session has expired. Please refresh the page and try again. +session.expired=세션이 만료되었습니다. 페이지를 새로 고침하고 다시 시도해 주세요. +session.refreshPage=Refresh Page ############# # HOME-PAGE # @@ -254,7 +257,7 @@ home.searchBar=기능 검색... home.viewPdf.title=PDF 뷰어 home.viewPdf.desc=PDF 문서을 보고 주석을 달거나, 텍스트 또는 이미지를 추가합니다. -viewPdf.tags=view,read,annotate,text,image +viewPdf.tags=보기, 읽기, 표시, 텍스트, 이미지 home.multiTool.title=PDF 멀티 툴 home.multiTool.desc=PDF 문서의 페이지를 병합, 회전, 재배열, 제거합니다. @@ -262,96 +265,96 @@ multiTool.tags=Multi Tool,Multi operation,UI,click drag,front end,client side home.merge.title=병합 home.merge.desc=여러 개의 PDF 문서을 쉽게 하나로 합칩니다. -merge.tags=merge,Page operations,Back end,server side +merge.tags=결합, 페이지 작업, 뒷단, 서버 측 home.split.title=분할 home.split.desc=하나의 PDF 문서을 여러 개의 PDF 문서로 분할합니다. -split.tags=Page operations,divide,Multi Page,cut,server side +split.tags=페이지 작업, 분할, 멀티페이지, 자르기, 서버 측 home.rotate.title=회전 home.rotate.desc=PDF 페이지를 회전합니다. -rotate.tags=server side +rotate.tags=서버 측 home.imageToPdf.title=이미지를 PDF로 home.imageToPdf.desc=이미지(PNG, JPEG, GIF)를 PDF 문서로 변환합니다. -imageToPdf.tags=conversion,img,jpg,picture,photo +imageToPdf.tags=변환, 이미지, jpg, 사진, 사진 home.pdfToImage.title=PDF를 이미지로 home.pdfToImage.desc=PDF 문서을 이미지(PNG, JPEG, GIF)로 변환합니다. -pdfToImage.tags=conversion,img,jpg,picture,photo +pdfToImage.tags=변환, 이미지, jpg, 사진, 사진 home.pdfOrganiser.title=정렬 home.pdfOrganiser.desc=PDF 문서의 각 페이지를 원하는 순서대로 재배열하거나 제거합니다. -pdfOrganiser.tags=duplex,even,odd,sort,move +pdfOrganiser.tags=복사, 짝수 페이지, 홀수 페이지, 정렬, 이동 home.addImage.title=사진 추가 home.addImage.desc=PDF 문서의 설정된 위치에 이미지를 추가합니다. (개발 중) -addImage.tags=img,jpg,picture,photo +addImage.tags=이미지, jpg, 사진, 사진 home.watermark.title=워터마크 추가 home.watermark.desc=PDF 문서에 사용자 지정 워터마크를 추가합니다. -watermark.tags=Text,repeating,label,own,copyright,trademark,img,jpg,picture,photo +watermark.tags=텍스트, 반복, 라벨, 소유권, 상표, 이미지, jpg, 사진, 사진 home.permissions.title=권한 변경 home.permissions.desc=PDF 문서의 권한을 변경합니다. -permissions.tags=read,write,edit,print +permissions.tags=읽기, 쓰기, 편집, 인쇄 home.removePages.title=제거 home.removePages.desc=PDF 문서에서 원치 않는 페이지를 제거합니다. -removePages.tags=Remove pages,delete pages +removePages.tags=페이지 제거, 삭제 home.addPassword.title=암호 추가 home.addPassword.desc=PDF 문서를 비밀번호로 암호화합니다. -addPassword.tags=secure,security +addPassword.tags=보안, 안전 home.removePassword.title=비밀번호 제거 home.removePassword.desc=PDF 문서에서 비밀번호를 제거합니다. -removePassword.tags=secure,Decrypt,security,unpassword,delete password +removePassword.tags=보안, 복호화, 안전, 비밀번호 해제, 비밀번호 삭제 home.compressPdfs.title=압축 home.compressPdfs.desc=파일 크기를 줄이기 위해 PDF 문서를 압축합니다. -compressPdfs.tags=squish,small,tiny +compressPdfs.tags=압축, 작게 만드는 home.changeMetadata.title=메타데이터 변경 home.changeMetadata.desc=PDF 문서의 메타데이터를 수정/제거/추가합니다. -changeMetadata.tags=Title,author,date,creation,time,publisher,producer,stats +changeMetadata.tags=제목, 저자, 날짜, 생성 시간, 출판사, 제작자, 통계 home.fileToPDF.title=파일을 PDF로 변환 home.fileToPDF.desc=거의 모든 파일을 PDF로 변환합니다(DOCX, PNG, XLS, PPT, TXT 등) -fileToPDF.tags=transformation,format,document,picture,slide,text,conversion,office,docs,word,excel,powerpoint +fileToPDF.tags=변환, 포맷, 문서, 사진, 슬라이드, 텍스트, 변환, 오피스,-docs, word, excel, powerpoint home.ocr.title=OCR / 깔끔하게 스캔 home.ocr.desc=깔끔하게 스캔한 뒤, PDF 내의 이미지에서 텍스트를 감지하여 텍스트로 다시 추가합니다. -ocr.tags=recognition,text,image,scan,read,identify,detection,editable +ocr.tags=인식, 텍스트, 이미지, 스캔, 읽기, 식별, 감지, 편집 가능한 home.extractImages.title=이미지 추출 home.extractImages.desc=PDF에서 모든 이미지를 추출하여 zip으로 저장합니다. -extractImages.tags=picture,photo,save,archive,zip,capture,grab +extractImages.tags=사진, 스크린샷 저장, 압축, 캡처, 잡아두기 home.pdfToPDFA.title=PDF를 PDF/A로 변환 home.pdfToPDFA.desc=장기 보관을 위해 PDF 문서를 PDF/A 문서로 변환합니다. -pdfToPDFA.tags=archive,long-term,standard,conversion,storage,preservation +pdfToPDFA.tags=보관, 장기 보관, 표준화, 변환, 기록 보존 home.PDFToWord.title=PDF를 Word로 home.PDFToWord.desc=PDF 문서를 Word 형식으로 변환합니다. (DOC, DOCX, ODT) -PDFToWord.tags=doc,docx,odt,word,transformation,format,conversion,office,microsoft,docfile +PDFToWord.tags=doc, docx, odt, word, 변환, 포맷, 변환, 오피스, microsoft, docfile home.PDFToPresentation.title=PDF를 프리젠테이션으로 home.PDFToPresentation.desc=PDF 문서를 프리젠테이션 형식으로 변환합니다. (PPT, PPTX, ODP) -PDFToPresentation.tags=slides,show,office,microsoft +PDFToPresentation.tags=슬라이드, 강의, office, microsoft home.PDFToText.title=PDF to 텍스트/RTF home.PDFToText.desc=PDF 문서를 텍스트 또는 RTF 형식으로 변환합니다. -PDFToText.tags=richformat,richtextformat,rich text format +PDFToText.tags=가이득한 텍스트 형식, 풍부한 텍스트 형식, 풍부한 텍스트 포맷 home.PDFToHTML.title=PDF를 HTML로 home.PDFToHTML.desc=PDF 문서를 HTML 형식으로 변환합니다. -PDFToHTML.tags=web content,browser friendly +PDFToHTML.tags=웹 콘텐츠, 브라우저 친화적 home.PDFToXML.title=PDF를 XML로 변환 @@ -360,63 +363,63 @@ PDFToXML.tags=data-extraction,structured-content,interop,transformation,convert home.ScannerImageSplit.title=스캔한 사진 감지/분할 home.ScannerImageSplit.desc=스캔된 PDF 문서 내에서 여러 장의 사진을 분할합니다. -ScannerImageSplit.tags=separate,auto-detect,scans,multi-photo,organize +ScannerImageSplit.tags=분리, 자동 감지, 스캔, 다중 사진, 조직 home.sign.title=서명 home.sign.desc=PDF 문서에 그림, 텍스트, 이미지로 서명을 추가합니다. -sign.tags=authorize,initials,drawn-signature,text-sign,image-signature +sign.tags=인증, 초기값, 손글씨 서명, 텍스트 서명, 이미지 서명 home.flatten.title=평탄화 home.flatten.desc=PDF 문서에서 모든 상호작용 요소와 양식을 제거합니다. -flatten.tags=static,deactivate,non-interactive,streamline +flatten.tags=정적화, 비활성화, 비 상호작용, 절전 모드 home.repair.title=복구 home.repair.desc=손상된 PDF 문서의 복구를 시도합니다. -repair.tags=fix,restore,correction,recover +repair.tags=수리, 복원, 수정, 회복 home.removeBlanks.title=빈 페이지 제거 home.removeBlanks.desc=PDF 문서에서 빈 페이지를 감지하고 제거합니다. -removeBlanks.tags=cleanup,streamline,non-content,organize +removeBlanks.tags=정돈, 단순화, 콘텐츠 외부 내용 제거, 조직 home.removeAnnotations.title=주석 제거 home.removeAnnotations.desc=PDF에서 모든 주석/주석을 제거합니다. -removeAnnotations.tags=comments,highlight,notes,markup,remove +removeAnnotations.tags=코멘트, 강조 표시, 주석, 마크업, 삭제 home.compare.title=비교 home.compare.desc=2개의 PDF 문서를 비교하고 차이를 표시합니다. -compare.tags=differentiate,contrast,changes,analysis +compare.tags=분별, 대조, 변화, 분석 home.certSign.title=인증서로 서명 home.certSign.desc=PDF 문서에 인증서 또는 키로 서명합니다. (PEM/P12) -certSign.tags=authenticate,PEM,P12,official,encrypt +certSign.tags=인증, PEM, P12, 공식적, 암호화 -home.removeCertSign.title=Remove Certificate Sign -home.removeCertSign.desc=Remove certificate signature from PDF -removeCertSign.tags=authenticate,PEM,P12,official,decrypt +home.removeCertSign.title=서명 제거 +home.removeCertSign.desc=PDF에서 서명을 제거합니다. +removeCertSign.tags=인증, PEM, P12, 공식적, 복호화 home.pageLayout.title=다중 페이지 레이아웃 home.pageLayout.desc=PDF 문서의 여러 페이지를 한 페이지로 합칩니다. -pageLayout.tags=merge,composite,single-view,organize +pageLayout.tags=병합, 합성, 단일 뷰, 정리 home.scalePages.title=페이지 크기 및 배율 조정 home.scalePages.desc=페이지 및 그 페이지 내용의 크기와 배율을 조정합니다. -scalePages.tags=resize,modify,dimension,adapt +scalePages.tags=크기 조정, 수정, 차원, 적응 home.pipeline.title=파이프라인 (고급 기능) home.pipeline.desc=파이프라인 스크립트를 사용해서 PDF 문서에 여러 동작을 수행합니다. -pipeline.tags=automate,sequence,scripted,batch-process +pipeline.tags=자동화, 시퀀스, 스크립트, 배치 처리 home.add-page-numbers.title=페이지 번호 추가 home.add-page-numbers.desc=PDF 문서의 페이지마다, 설정한 위치에 페이지 번호를 삽입합니다. -add-page-numbers.tags=paginate,label,organize,index +add-page-numbers.tags=페이지 번호 추가, 레이블링, 정리, 인덱싱 home.auto-rename.title=자동 이름 변경 home.auto-rename.desc=제목을 감지하여 자동으로 PDF 문서의 파일 이름을 변경합니다. -auto-rename.tags=auto-detect,header-based,organize,relabel +auto-rename.tags=자동 탐지, 헤더 기반, 정리, 재레이블 home.adjust-contrast.title=색상/대비 조정 home.adjust-contrast.desc=PDF 문서의 대비, 채도, 밝기를 조정합니다. -adjust-contrast.tags=color-correction,tune,modify,enhance +adjust-contrast.tags=색상 보정, 조정, 수정, 향상 home.crop.title=PDF 잘라내기 home.crop.desc=PDF 문서를 잘라내서 크기를 줄입니다. (텍스트가 그대로 유지됩니다!) @@ -424,29 +427,29 @@ crop.tags=trim,shrink,edit,shape home.autoSplitPDF.title=자동 문서 나누기 home.autoSplitPDF.desc=구분용 QR코드가 들어있는 페이지를 경계로 하여, 스캔된 PDF 문서를 자동으로 나눕니다. -autoSplitPDF.tags=QR-based,separate,scan-segment,organize +autoSplitPDF.tags=QR 코드 기반, 분리, 스캔 분할, 정리 home.sanitizePdf.title=정제 home.sanitizePdf.desc=PDF 문서에서 스크립트와 같은 요소들을 제거합니다. -sanitizePdf.tags=clean,secure,safe,remove-threats +sanitizePdf.tags=클린징, 보안, 안전, 위협 제거 home.URLToPDF.title=URL/웹사이트를 PDF로 home.URLToPDF.desc=http(s) 웹사이트를 PDF 문서로 변환합니다. -URLToPDF.tags=web-capture,save-page,web-to-doc,archive +URLToPDF.tags=웹 캡처, 페이지 저장, 웹 문서 변환, 장기 보관 home.HTMLToPDF.title=HTML에서 PDF로 home.HTMLToPDF.desc=HTML 파일, 또는 ZIP 파일을 PDF로 변환합니다. -HTMLToPDF.tags=markup,web-content,transformation,convert +HTMLToPDF.tags=마크업, 웹 내용 변환, 변환 home.MarkdownToPDF.title=Markdown에서 PDF로 home.MarkdownToPDF.desc=마크다운 파일을 PDF 문서로 변환합니다. -MarkdownToPDF.tags=markup,web-content,transformation,convert +MarkdownToPDF.tags=마크업, 웹 내용 변환, 변환 home.getPdfInfo.title=PDF 정보 읽기 home.getPdfInfo.desc=PDF 문서의 가능한 모든 정보를 읽습니다. -getPdfInfo.tags=infomation,data,stats,statistics +getPdfInfo.tags=정보 제공, 데이터, 통계, 통계 home.extractPage.title=페이지 추출 @@ -465,29 +468,29 @@ showJS.tags=JS home.autoRedact.title=자동 검열 home.autoRedact.desc=PDF 문서에서 입력된 텍스트들을 자동으로 검열(모자이크)합니다. -autoRedact.tags=Redact,Hide,black out,black,marker,hidden +autoRedact.tags=노출 방지, 숨기기, 검은색 처리, 마커, 숨김 home.tableExtraxt.title=PDF에서 CSV로 home.tableExtraxt.desc=PDF에서 표를 추출하여 CSV로 변환 -tableExtraxt.tags=CSV,Table Extraction,extract,convert +tableExtraxt.tags=CSV, 테이블 추출, 추출, 변환 home.autoSizeSplitPDF.title=크기/개수로 자동 분할 home.autoSizeSplitPDF.desc=단일 PDF를 크기, 페이지 수 또는 문서 수에 따라 여러 문서로 분할 -autoSizeSplitPDF.tags=pdf,split,document,organization +autoSizeSplitPDF.tags=pdf 분할, 문서 분할, 조직화 home.overlay-pdfs.title=PDF 오버레이 home.overlay-pdfs.desc=PDF를 다른 PDF 위에 오버레이 -overlay-pdfs.tags=Overlay +overlay-pdfs.tags=오버레이 home.split-by-sections.title=섹션별로 PDF 분할 home.split-by-sections.desc=PDF의 각 페이지를 더 작은 가로와 세로 구역으로 나눕니다 -split-by-sections.tags=Section Split, Divide, Customize +split-by-sections.tags=섹션 분할, 나누기, 커스텀 home.AddStampRequest.title=PDF에 스탬프 추가 home.AddStampRequest.desc=설정된 위치에 텍스트 추가 또는 이미지 스탬프 추가 -AddStampRequest.tags=Stamp, Add image, center image, Watermark, PDF, Embed, Customize +AddStampRequest.tags=주석 추가, 이미지 중앙 정렬, 워터마크, PDF 임베딩, 커스텀 home.PDFToBook.title=PDF를 책으로 @@ -498,25 +501,25 @@ home.BookToPDF.title=책을 PDF로 home.BookToPDF.desc=구경을 사용하여 책/만화 형식을 PDF로 변환 BookToPDF.tags=Book,Comic,Calibre,Convert,manga,amazon,kindle -home.removeImagePdf.title=Remove image -home.removeImagePdf.desc=Remove image from PDF to reduce file size -removeImagePdf.tags=Remove Image,Page operations,Back end,server side +home.removeImagePdf.title=PDF에서 이미지 제거 +home.removeImagePdf.desc=PDF에서 이미지를 제거하여 파일 크기를 줄입니다. +removeImagePdf.tags=이미지 제거, 페이지 작업, 서버 측 처리 -home.splitPdfByChapters.title=Split PDF by Chapters -home.splitPdfByChapters.desc=Split a PDF into multiple files based on its chapter structure. -splitPdfByChapters.tags=split,chapters,bookmarks,organize +home.splitPdfByChapters.title=챕터별로 PDF 분할 +home.splitPdfByChapters.desc=PDF를 여러 파일로 나눕니다. 각 장의 구조에 따라. +splitPdfByChapters.tags=분할, 챕터, 북마크, 조직화 #replace-invert-color replace-color.title=Replace-Invert-Color -replace-color.header=Replace-Invert Color PDF +replace-color.header=색상 교체/반전 PDF home.replaceColorPdf.title=Replace and Invert Color -home.replaceColorPdf.desc=Replace color for text and background in PDF and invert full color of pdf to reduce file size -replaceColorPdf.tags=Replace Color,Page operations,Back end,server side -replace-color.selectText.1=Replace or Invert color Options -replace-color.selectText.2=Default(Default high contrast colors) -replace-color.selectText.3=Custom(Customized colors) -replace-color.selectText.4=Full-Invert(Invert all colors) +home.replaceColorPdf.desc=PDF에서 텍스트와 배경 색상을 바꾸고 전체 PDF의 색상을 반전하여 파일 크기를 줄입니다. +replaceColorPdf.tags=색상 교체, 페이지 작업, 서버 측 처리 +replace-color.selectText.1=색상 교체 또는 반전 옵션 +replace-color.selectText.2=기본값(고 해밍도 색상) +replace-color.selectText.3=커스텀(커스텀 색상) +replace-color.selectText.4=전체 반전(모든 색상을 반전) replace-color.selectText.5=High contrast color options replace-color.selectText.6=white text on black background replace-color.selectText.7=Black text on white background @@ -748,14 +751,15 @@ certSign.showSig=서명 보기 certSign.reason=이유 certSign.location=위치 certSign.name=이름 +certSign.showLogo=로고 표시 certSign.submit=PDF 서명 #removeCertSign -removeCertSign.title=Remove Certificate Signature -removeCertSign.header=Remove the digital certificate from the PDF -removeCertSign.selectPDF=Select a PDF file: -removeCertSign.submit=Remove Signature +removeCertSign.title=인증서 서명 제거 +removeCertSign.header=PDF에서 디지털 인증서를 제거합니다 +removeCertSign.selectPDF=PDF 파일 선택: +removeCertSign.submit=서명 제거 #removeBlanks @@ -777,11 +781,14 @@ removeAnnotations.submit=제거하다 #compare compare.title=비교 compare.header=PDF 문서 비교 -compare.highlightColor.1=Highlight Color 1: -compare.highlightColor.2=Highlight Color 2: +compare.highlightColor.1=하이라이트 색상 1: +compare.highlightColor.2=하이라이트 색상 2: compare.document.1=문서 1 compare.document.2=문서 2 compare.submit=비교 +compare.complex.message=제공된 한 개 이상의 문서가 큰 파일인 경우, 비교 정확도가 저하될 수 있습니다 +compare.large.file.message=제공된 한 개 이상의 문서가 처리할 수 없을 정도로 큽니다 +compare.no.text.message=선택한 PDF 중 하나 이상은 텍스트 내용이 없습니다. 비교를 위해 텍스트가 포함된 PDF를 선택하세요 #BookToPDF BookToPDF.title=책과 만화를 PDF로 @@ -804,6 +811,11 @@ sign.draw=서명 그리기 sign.text=텍스트 입력 sign.clear=초기화 sign.add=추가 +sign.saved=저장된 서명 +sign.save=서명 저장 +sign.personalSigs=개인용 서명 +sign.sharedSigs=공유용 서명 +sign.noSavedSigs=저장된 서명이 없습니다 #repair @@ -815,7 +827,7 @@ repair.submit=복구 #flatten flatten.title=평탄화 flatten.header=PDF 문서의 레이어 평탄화 -flatten.flattenOnlyForms=Flatten only forms +flatten.flattenOnlyForms=양식만 압축 flatten.submit=평탄화 @@ -830,7 +842,7 @@ ScannerImageSplit.selectText.7=최소 윤곽 영역: ScannerImageSplit.selectText.8=사진의 최소 윤곽선 영역 임계값을 설정합니다. ScannerImageSplit.selectText.9=테두리 크기: ScannerImageSplit.selectText.10=출력에서 흰색 테두리를 방지하기 위해 추가 및 제거되는 테두리의 크기를 설정합니다(기본값: 1). -ScannerImageSplit.info=Python is not installed. It is required to run. +ScannerImageSplit.info=Python이 설치되지 않았습니다. 이 기능을 실행하기 위해 필요합니다 #OCR @@ -857,15 +869,15 @@ ocr.submit=인식 extractImages.title=이미지 추출 extractImages.header=이미지 추출 extractImages.selectText=추출된 이미지를 변환할 이미지 형식을 선택합니다. -extractImages.allowDuplicates=Save duplicate images +extractImages.allowDuplicates=중복 이미지 저장 허용 extractImages.submit=추출 #File to PDF -fileToPDF.title=File to PDF +fileToPDF.title=파일 to PDF fileToPDF.header=다양한 파일을 PDF로 변환 fileToPDF.credit=이 서비스는 파일 변환에 LibreOffice와 Unoconv를 사용합니다. -fileToPDF.supportedFileTypesInfo=Supported File types +fileToPDF.supportedFileTypesInfo=지원되는 파일 형식 fileToPDF.supportedFileTypes=지원되는 파일 형식은 아래와 같습니다. 지원되는 형식의 전체 업데이트 목록은 LibreOffice 설명서를 참조합니다. fileToPDF.submit=PDF로 변환 @@ -895,7 +907,7 @@ merge.title=병합 merge.header=여러 개의 PDF 병합 (2개 이상) merge.sortByName=이름순 정렬 merge.sortByDate=날짜순 정렬 -merge.removeCertSign=Remove digital signature in the merged file? +merge.removeCertSign=병합 파일에서 디지털 서명을 제거하시겠습니까? merge.submit=병합 @@ -913,15 +925,22 @@ pdfOrganiser.mode.6=홀수-짝수 분할 pdfOrganiser.mode.7=첫 번째 항목 삭제 pdfOrganiser.mode.8=마지막 항목 제거 pdfOrganiser.mode.9=첫 번째와 마지막 제거 -pdfOrganiser.mode.10=Odd-Even Merge +pdfOrganiser.mode.10=홀 짝 번갈아가기 병합 pdfOrganiser.placeholder=(예: 1,3,2 또는 4-8,2,10-12 또는 2n-1) #multiTool multiTool.title=PDF 멀티툴 multiTool.header=PDF 멀티툴 -multiTool.uploadPrompts=File Name - +multiTool.uploadPrompts=파일 이름 +multiTool.selectAll=Select All +multiTool.deselectAll=Deselect All +multiTool.selectPages=Page Select +multiTool.selectedPages=Selected Pages +multiTool.page=Page +multiTool.deleteSelected=Delete Selected +multiTool.downloadAll=Export +multiTool.downloadSelected=Export Selected #view pdf viewPdf.title=PDF 뷰어 viewPdf.header=PDF 뷰어 @@ -982,7 +1001,7 @@ pdfToImage.color=컬러 pdfToImage.grey=그레이스케일 pdfToImage.blackwhite=흑백 (데이터 손실 가능성 있음!) pdfToImage.submit=변환 -pdfToImage.info=Python is not installed. Required for WebP conversion. +pdfToImage.info=Python이 설치되어 있지 않습니다. WebP 변환에 필요합니다. #addPassword @@ -1019,7 +1038,7 @@ watermark.selectText.6=세로 간격 (각 워터마크 사이의 세로 공간): watermark.selectText.7=투명도 (0% - 100%): watermark.selectText.8=워터마크 유형: watermark.selectText.9=워터마크 이미지: -watermark.selectText.10=Convert PDF to PDF-Image +watermark.selectText.10=PDF를 PDF-Image로 변환 watermark.submit=워터마크 추가 watermark.type.1=텍스트 watermark.type.2=이미지 @@ -1075,8 +1094,8 @@ pdfToPDFA.header=PDF 문서를 PDF/A로 변환 pdfToPDFA.credit=이 서비스는 PDF/A 변환을 위해 ghostscript 문서를 사용합니다. pdfToPDFA.submit=변환 pdfToPDFA.tip=현재 한 번에 여러 입력에 대해 작동하지 않습니다. -pdfToPDFA.outputFormat=Output format -pdfToPDFA.pdfWithDigitalSignature=The PDF contains a digital signature. This will be removed in the next step. +pdfToPDFA.outputFormat=출력 형식 +pdfToPDFA.pdfWithDigitalSignature=이 PDF에는 디지털 서명이 포함되어 있습니다. 다음 단계에서 이 서명이 제거될 것입니다. #PDFToWord @@ -1162,11 +1181,11 @@ split-by-sections.merge=하나의 PDF로 병합 #printFile -printFile.title=Print File -printFile.header=Print File to Printer -printFile.selectText.1=Select File to Print -printFile.selectText.2=Enter Printer Name -printFile.submit=Print +printFile.title=파일 인쇄 +printFile.header=프린터로 파일 인쇄 +printFile.selectText.1=인쇄할 파일 선택 +printFile.selectText.2=프린터 이름 입력 +printFile.submit=인쇄 #licenses @@ -1178,15 +1197,15 @@ licenses.version=버전 licenses.license=라이센스 #survey -survey.nav=Survey -survey.title=Stirling-PDF Survey -survey.description=Stirling-PDF has no tracking so we want to hear from our users to improve Stirling-PDF! -survey.changes=Stirling-PDF has changed since the last survey! To find out more please check our blog post here: -survey.changes2=With these changes we are getting paid business support and funding +survey.nav=설문조사 +survey.title=스테링-PDF 설문조사 +survey.description=스테링-PDF는 추적 기능이 없으므로 사용자 의견을 듣습니다. 스테링-PDF를 개선합니다! +survey.changes=최근 설문조사를 진행한 이후로 스테링-PDF가 변경되었습니다! 자세한 내용은 여기의 블로그 포스트를 확인하시기 바랍니다: +survey.changes2=이러한 변경 사항으로 인해 수익화된 비즈니스 지원과 펀딩을 받게 되었습니다 survey.please=Please consider taking our survey! -survey.disabled=(Survey popup will be disabled in following updates but available at foot of page) -survey.button=Take Survey -survey.dontShowAgain=Don't show again +survey.disabled=(다음 업데이트에서는 설문 조사 팝업이 무단으로 끄일 수 있으나 페이지 하단에서 사용 가능) +survey.button=설문조사 참여 +survey.dontShowAgain=이것은 다시 보지 않기 #error @@ -1204,21 +1223,19 @@ error.discordSubmit=Discord - 문의 게시 #remove-image -removeImage.title=Remove image -removeImage.header=Remove image -removeImage.removeImage=Remove image -removeImage.submit=Remove image - - -splitByChapters.title=Split PDF by Chapters -splitByChapters.header=Split PDF by Chapters -splitByChapters.bookmarkLevel=Bookmark Level -splitByChapters.includeMetadata=Include Metadata -splitByChapters.allowDuplicates=Allow Duplicates -splitByChapters.desc.1=This tool splits a PDF file into multiple PDFs based on its chapter structure. -splitByChapters.desc.2=Bookmark Level: Choose the level of bookmarks to use for splitting (0 for top-level, 1 for second-level, etc.). -splitByChapters.desc.3=Include Metadata: If checked, the original PDF's metadata will be included in each split PDF. -splitByChapters.desc.4=Allow Duplicates: If checked, allows multiple bookmarks on the same page to create separate PDFs. -splitByChapters.submit=Split PDF +removeImage.title=이미지 제거 +removeImage.header=이미지 제거 +removeImage.removeImage=이미지 제거 +removeImage.submit=제거 +splitByChapters.title=챕터별 PDF 분할 +splitByChapters.header=챕터별 PDF 분할 +splitByChapters.bookmarkLevel=북마크 레벨 +splitByChapters.includeMetadata=메타데이터 포함 +splitByChapters.allowDuplicates=중복 허용 +splitByChapters.desc.1=이 도구는 챕터 구조를 기반으로 한 PDF 파일을 여러 개의 PDF로 분할합니다. +splitByChapters.desc.2=북마크 레벨: 분할에 사용할 북마크 레벨을 선택하세요 (0은 상위 수준, 1은 하위 수준 등). +splitByChapters.desc.3=메타데이터 포함: 체크하면 각 분할된 PDF에는 원본 PDF의 메타데이터가 포함됩니다. +splitByChapters.desc.4=중복 허용: 중복 북마크가 있는 같은 페이지에 여러 번 분할 PDF를 생성합니다. +splitByChapters.submit=PDF 분할 diff --git a/src/main/resources/messages_nl_NL.properties b/src/main/resources/messages_nl_NL.properties index ed8096c3b..8b92a2ecc 100644 --- a/src/main/resources/messages_nl_NL.properties +++ b/src/main/resources/messages_nl_NL.properties @@ -3,8 +3,8 @@ ########### # the direction that the language is written (ltr = left to right, rtl = right to left) language.direction=ltr -addPageNumbers.fontSize=Font Size -addPageNumbers.fontName=Font Name +addPageNumbers.fontSize=Lettertypegrootte +addPageNumbers.fontName=Lettertypenaam pdfPrompt=Selecteer PDF('s) multiPdfPrompt=Selecteer PDF's (2+) multiPdfDropPrompt=Selecteer (of sleep & zet neer) alle PDF's die je nodig hebt @@ -25,13 +25,13 @@ noFavourites=Geen favorieten toegevoegd downloadComplete=Download klaar bored=Verveeld met wachten? alphabet=Alfabet -downloadPdf=Download PDF +downloadPdf=PDF downloaden text=Tekst font=Lettertype selectFillter=-- Selecteer -- pageNum=Paginanummer sizes.small=Klein -sizes.medium=Medium +sizes.medium=Gemiddeld sizes.large=Groot sizes.x-large=Extra groot error.pdfPassword=Het PDF document is beveiligd met een wachtwoord en het wachtwoord is niet ingevoerd of is onjuist @@ -56,18 +56,18 @@ userNotFoundMessage=Gebruiker niet gevonden. incorrectPasswordMessage=Huidige wachtwoord is onjuist. usernameExistsMessage=Nieuwe gebruikersnaam bestaat al. invalidUsernameMessage=Ongeldige gebruikersnaam, gebruikersnaam kan alleen letters, nummers en de volgende speciale tekens @._+- bevatten of moet een geldig emailadres zijn. -invalidPasswordMessage=The password must not be empty and must not have spaces at the beginning or end. +invalidPasswordMessage=Het wachtwoord mag geen spaties ten beginne of einde bevatten en mag niet leeg zijn. confirmPasswordErrorMessage=Nieuw wachtwoord en bevestig wachtwoord moeten overeenkomen. deleteCurrentUserMessage=Kan niet een momenteel ingelogde gebruiker verwijderen. deleteUsernameExistsMessage=De gebruikersnaam bestaat niet en kan niet verwijderd worden. downgradeCurrentUserMessage=Kan de rol van de huidige gebruiker niet downgraden -disabledCurrentUserMessage=The current user cannot be disabled +disabledCurrentUserMessage=De huidige gebruiker kan niet worden uitgeschakeld downgradeCurrentUserLongMessage=Kan de rol van de huidige gebruiker niet downgraden. Huidige gebruiker wordt dus niet weergegeven. userAlreadyExistsOAuthMessage=De gebruiker bestaat al als een OAuth2 gebruiker. userAlreadyExistsWebMessage=De gebruiker bestaat al als een web gebruiker. -error=Error +error=Fout oops=Oeps! -help=Help +help=Hulp goHomepage=Ga naar de startpagina joinDiscord=Word lid van onze Discord server seeDockerHub=Zie Docker Hub @@ -75,16 +75,18 @@ visitGithub=Ga naar de Github Repository donate=Doneer color=Kleur sponsor=Sponsor -info=Info +info=Informatie pro=Pro -page=Page -pages=Pages +page=Pagina +pages=Pagen +loading=Laden... +addToDoc=Toevoegen aan document -legal.privacy=Privacy Policy -legal.terms=Terms and Conditions -legal.accessibility=Accessibility -legal.cookie=Cookie Policy -legal.impressum=Impressum +legal.privacy=Privacybeleid +legal.terms=Voorwaarden van gebruik +legal.accessibility=Toegankelijkheid +legal.cookie=Cookiesbeleid +legal.impressum=Imprint ############### # Pipeline # @@ -224,26 +226,27 @@ adminUserSettings.disabledUser=disabled user adminUserSettings.activeUsers=Active Users: adminUserSettings.disabledUsers=Disabled Users: adminUserSettings.totalUsers=Total Users: -adminUserSettings.lastRequest=Last Request +adminUserSettings.lastRequest=Laatste aanvraag -database.title=Database Import/Export -database.header=Database Import/Export -database.fileName=File Name -database.creationDate=Creation Date -database.fileSize=File Size -database.deleteBackupFile=Delete Backup File -database.importBackupFile=Import Backup File -database.downloadBackupFile=Download Backup File -database.info_1=When importing data, it is crucial to ensure the correct structure. If you are unsure of what you are doing, seek advice and support from a professional. An error in the structure can cause application malfunctions, up to and including the complete inability to run the application. -database.info_2=The file name does not matter when uploading. It will be renamed afterward to follow the format backup_user_yyyyMMddHHmm.sql, ensuring a consistent naming convention. -database.submit=Import Backup -database.importIntoDatabaseSuccessed=Import into database successed +database.title=Database Importeer/Exporteer +database.header=Database Importeer/Exporteer +database.fileName=Bestandsnaam +database.creationDate=Creatiedatum +database.fileSize=Bestandsgrootte +database.deleteBackupFile=Backupbestand verwijderen +database.importBackupFile=Backupbestand importeren +database.downloadBackupFile=Backupbestand downloaden +database.info_1=Bij het importeren van gegevens is het cruciaal om de juiste structuur te zorgen voor. Als je niet zeker bent van wat je doet, raadpleeg dan advies en ondersteuning bij een professionele. Een fout in de structuur kan leiden tot toepassingsfouten, waarmee wellicht zelfs de volledige uitvoerbaarheid van de toepassing belemmerd wordt. +database.info_2=De bestandsnaam maakt geen verschil bij het uploaden. Hij zal later worden herbewoond om de indeling backup_user_yyyyMMddHHmm.sql te volgen, waardoor een consistente bestandsnaamconventie waarborgd wordt. +database.submit=Backup importeren +database.importIntoDatabaseSuccessed=Importeer naar database succesvol database.fileNotFound=File not Found -database.fileNullOrEmpty=File must not be null or empty +database.fileNullOrEmpty=Bestand mag niet null of leeg zijn database.failedImportFile=Failed Import File -session.expired=Your session has expired. Please refresh the page and try again. +session.expired=Je sessie is verlopen. Voer de pagina opnieuw in en probeer het opnieuw. +session.refreshPage=Refresh Page ############# # HOME-PAGE # @@ -465,7 +468,7 @@ showJS.tags=JS home.autoRedact.title=Automatisch censureren home.autoRedact.desc=Automatisch censureren (onherkenbaar maken) van tekst in een PDF op basis van ingevoerde tekst -autoRedact.tags=Redact,Hide,black out,black,marker,hidden +autoRedact.tags=Verzwakken, Verbergen, Uitroepen, Gekleurd, Verborgen home.tableExtraxt.title=PDF naar CSV home.tableExtraxt.desc=Haalt tabellen uit een PDF en converteert ze naar CSV @@ -498,33 +501,33 @@ home.BookToPDF.title=Boek naar PDF home.BookToPDF.desc=Converteert boek-/stripformaat naar PDF met gebruik van Calibre BookToPDF.tags=Boek,Strip,Comic,Calibre,Converteren,manga,amazon,kindle -home.removeImagePdf.title=Remove image -home.removeImagePdf.desc=Remove image from PDF to reduce file size -removeImagePdf.tags=Remove Image,Page operations,Back end,server side +home.removeImagePdf.title=Afbeelding verwijderen +home.removeImagePdf.desc=Afbeeldingen uit PDF verwijderen om het bestandsgrootte te verminderen +removeImagePdf.tags=Afbeelding verwijderen, Paginabewerkingen, Achterkant, Serverkant -home.splitPdfByChapters.title=Split PDF by Chapters -home.splitPdfByChapters.desc=Split a PDF into multiple files based on its chapter structure. -splitPdfByChapters.tags=split,chapters,bookmarks,organize +home.splitPdfByChapters.title=PDF op hoofdstukken splitsen +home.splitPdfByChapters.desc=Splits een PDF op basis van zijn hoofdstukstructuur in meerdere bestanden. +splitPdfByChapters.tags=splitsen, hoofdstukken, bookmarks, organiseren #replace-invert-color replace-color.title=Replace-Invert-Color -replace-color.header=Replace-Invert Color PDF +replace-color.header=Kleur-instellingen voor PDF's home.replaceColorPdf.title=Replace and Invert Color -home.replaceColorPdf.desc=Replace color for text and background in PDF and invert full color of pdf to reduce file size -replaceColorPdf.tags=Replace Color,Page operations,Back end,server side -replace-color.selectText.1=Replace or Invert color Options -replace-color.selectText.2=Default(Default high contrast colors) -replace-color.selectText.3=Custom(Customized colors) -replace-color.selectText.4=Full-Invert(Invert all colors) -replace-color.selectText.5=High contrast color options -replace-color.selectText.6=white text on black background -replace-color.selectText.7=Black text on white background -replace-color.selectText.8=Yellow text on black background -replace-color.selectText.9=Green text on black background -replace-color.selectText.10=Choose text Color -replace-color.selectText.11=Choose background Color -replace-color.submit=Replace +home.replaceColorPdf.desc=Vervang de kleur van tekst en achtergrond in een PDF en omverkeer de volledige kleur van het document om bestandsgrootte te verkleinen. +replaceColorPdf.tags=Kleur vervangen, pagina-acties, achterkant, serverzijde +replace-color.selectText.1=Vervang of invertere kleure opties +replace-color.selectText.2=Standaard (hoog contrast kleuren) +replace-color.selectText.3=Aangepast (aangepaste kleuren) +replace-color.selectText.4=Volledig inverteren (alle kleuren omverkeren) +replace-color.selectText.5=Opties voor hoog contrast +replace-color.selectText.6=wit tekst op een zwart grondvlak +replace-color.selectText.7=zwarte tekst op wit grondvlak +replace-color.selectText.8=gele tekst op een zwart grondvlak +replace-color.selectText.9=groene tekst op een zwart grondvlak +replace-color.selectText.10=Kies de tekstkleur +replace-color.selectText.11=Kies het achtergrondkleur +replace-color.submit=Vervang @@ -543,17 +546,17 @@ login.locked=Je account is geblokkeerd. login.signinTitle=Gelieve in te loggen login.ssoSignIn=Inloggen via Single Sign-on login.oauth2AutoCreateDisabled=OAUTH2 Automatisch aanmaken gebruiker uitgeschakeld -login.oauth2AdminBlockedUser=Registration or logging in of non-registered users is currently blocked. Please contact the administrator. +login.oauth2AdminBlockedUser=Registratie of inloggen van niet-registreerde gebruikers is helaas momenteel geblokkeerd. Neem contact op met de beheerder. login.oauth2RequestNotFound=Autorisatieverzoek niet gevonden login.oauth2InvalidUserInfoResponse=Ongeldige reactie op gebruikersinfo login.oauth2invalidRequest=Ongeldig verzoek login.oauth2AccessDenied=Toegang geweigerd login.oauth2InvalidTokenResponse=Ongeldige tokenreactie login.oauth2InvalidIdToken=Ongeldige ID token -login.userIsDisabled=User is deactivated, login is currently blocked with this username. Please contact the administrator. -login.alreadyLoggedIn=You are already logged in to -login.alreadyLoggedIn2=devices. Please log out of the devices and try again. -login.toManySessions=You have too many active sessions +login.userIsDisabled=De gebruiker is gedesactiveerd, inloggen is momenteel geblokkeerd voor deze gebruikersnaam. Neem contact op met de beheerder. +login.alreadyLoggedIn=U zit reeds ingelogd bij +login.alreadyLoggedIn2=apparaten. U moet u a.u.b. uitloggen van de apparaten en opnieuw proberen. +login.toManySessions=U heeft te veel actieve sessies #auto-redact autoRedact.title=Automatisch censureren @@ -571,7 +574,7 @@ autoRedact.submitButton=Indienen #showJS showJS.title=Toon Javascript showJS.header=Toon Javascript -showJS.downloadJS=Download Javascript +showJS.downloadJS=Javascript downloaden showJS.submit=Toon @@ -585,14 +588,14 @@ pdfToSinglePage.submit=Converteren naar enkele pagina pageExtracter.title=Pagina's extraheren pageExtracter.header=Pagina's extraheren pageExtracter.submit=Extraheren -pageExtracter.placeholder=(e.g. 1,2,8 or 4,7,12-16 or 2n-1) +pageExtracter.placeholder=(bijv. 1,2,8 of 4,7,12-16 of 2n-1) #getPdfInfo getPdfInfo.title=Informatie over PDF ophalen getPdfInfo.header=Informatie over PDF ophalen getPdfInfo.submit=Haal informatie op -getPdfInfo.downloadJson=Download JSON +getPdfInfo.downloadJson=JSON downloaden #markdown-to-pdf @@ -628,7 +631,7 @@ HTMLToPDF.printBackground=De achtergrond van websites weergeven. HTMLToPDF.defaultHeader=Standaard koptekst weergeven (naam en paginanummer) HTMLToPDF.cssMediaType=Wijzig het CSS-mediatype van de pagina. HTMLToPDF.none=Geen -HTMLToPDF.print=Print +HTMLToPDF.print=Printen HTMLToPDF.screen=Scherm @@ -685,7 +688,7 @@ auto-rename.submit=Automatisch hernoemen #adjustContrast adjustContrast.title=Contrast aanpassen adjustContrast.header=Contrast aanpassen -adjustContrast.contrast=Contrast: +adjustContrast.contrast=Kehrbrechting: adjustContrast.brightness=Helderheid: adjustContrast.saturation=Verzadiging: adjustContrast.download=Downloaden @@ -728,7 +731,7 @@ pageLayout.submit=Indienen scalePages.title=Pagina-schaal aanpassen scalePages.header=Pagina-schaal aanpassen scalePages.pageSize=Grootte van een pagina van het document. -scalePages.keepPageSize=Original Size +scalePages.keepPageSize=Oorspronkelijke grootte behouden scalePages.scaleFactor=Zoomniveau (uitsnede) van een pagina. scalePages.submit=Indienen @@ -748,6 +751,7 @@ certSign.showSig=Toon handtekening certSign.reason=Reden certSign.location=Locatie certSign.name=Naam +certSign.showLogo=Logotype tonen certSign.submit=PDF ondertekenen @@ -777,11 +781,14 @@ removeAnnotations.submit=Verwijderen #compare compare.title=Vergelijken compare.header=PDF's vergelijken -compare.highlightColor.1=Highlight Color 1: -compare.highlightColor.2=Highlight Color 2: +compare.highlightColor.1=Hervormingskleur 1: +compare.highlightColor.2=Hervormingskleur 2: compare.document.1=Document 1 compare.document.2=Document 2 compare.submit=Vergelijken +compare.complex.message=Eén of beide van de bijgewerkte documenten zijn grote bestanden, het vergelijken kan mogelijk minder nauwkeurig zijn. +compare.large.file.message=Eén of beiden van de bijgewerkte documenten zijn te groot om verwerkt te worden. +compare.no.text.message=Een of beide geselecteerde PDF-bestanden bevatten geen tekstinhoud. Kies a.u.b. PDF-bestanden met tekst voor vergelijking. #BookToPDF BookToPDF.title=Boeken en strips naar PDF @@ -804,6 +811,11 @@ sign.draw=Handtekening tekenen sign.text=Tekstinvoer sign.clear=Wissen sign.add=Toevoegen +sign.saved=Gesleutelde handtekeningen opgeslagen +sign.save=Opslaan Signatuur +sign.personalSigs=Persoonlijke Signatuuren +sign.sharedSigs=Gedeelde Signatuuren +sign.noSavedSigs=Geen opgeslagen signatuuren gevonden #repair @@ -830,7 +842,7 @@ ScannerImageSplit.selectText.7=Minimum contour oppervlakte: ScannerImageSplit.selectText.8=Stelt de minimale contour oppervlakte drempel in voor een foto ScannerImageSplit.selectText.9=Randgrootte: ScannerImageSplit.selectText.10=Stelt de grootte van de toegevoegde en verwijderde rand in om witte randen in de uitvoer te voorkomen (standaard: 1). -ScannerImageSplit.info=Python is not installed. It is required to run. +ScannerImageSplit.info=Python is niet geïnstalleerd. Het wordt vereist om te worden uitgevoerd. #OCR @@ -857,7 +869,7 @@ ocr.submit=Verwerk PDF met OCR extractImages.title=Afbeeldingen extraheren extractImages.header=Afbeeldingen extraheren extractImages.selectText=Selecteer het beeldformaat voor geëxtraheerde afbeeldingen -extractImages.allowDuplicates=Save duplicate images +extractImages.allowDuplicates=Dubbele afbeeldingen opslaan extractImages.submit=Extraheer @@ -865,7 +877,7 @@ extractImages.submit=Extraheer fileToPDF.title=Bestand naar PDF fileToPDF.header=Zet elk bestand om naar PDF fileToPDF.credit=Deze service gebruikt LibreOffice en Unoconv voor bestandsconversie. -fileToPDF.supportedFileTypesInfo=Supported File types +fileToPDF.supportedFileTypesInfo=Gestandaardiseerde Bestandstypen fileToPDF.supportedFileTypes=Ondersteunde bestandstypen zijn hieronder opgenomen, maar raadpleeg voor een volledige lijst met ondersteunde formaten de LibreOffice-documentatie fileToPDF.submit=Omzetten naar PDF @@ -921,7 +933,14 @@ pdfOrganiser.placeholder=(bijv. 1,3,2 of 4-8,2,10-12 of 2n-1) multiTool.title=PDF Multitool multiTool.header=PDF Multitool multiTool.uploadPrompts=Bestandsnaam - +multiTool.selectAll=Select All +multiTool.deselectAll=Deselect All +multiTool.selectPages=Page Select +multiTool.selectedPages=Selected Pages +multiTool.page=Page +multiTool.deleteSelected=Delete Selected +multiTool.downloadAll=Export +multiTool.downloadSelected=Export Selected #view pdf viewPdf.title=PDF bekijken viewPdf.header=PDF bekijken @@ -982,7 +1001,7 @@ pdfToImage.color=Kleur pdfToImage.grey=Grijstinten pdfToImage.blackwhite=Zwart en wit (kan data verliezen!) pdfToImage.submit=Omzetten -pdfToImage.info=Python is not installed. Required for WebP conversion. +pdfToImage.info=Python is niet geïnstalleerd. Vereist voor WebP-conversie. #addPassword @@ -1019,10 +1038,10 @@ watermark.selectText.6=hoogteSpacer (Ruimte tussen elk watermerk verticaal): watermark.selectText.7=Transparantie (0% - 100%): watermark.selectText.8=Type watermerk: watermark.selectText.9=Watermerk afbeelding: -watermark.selectText.10=Convert PDF to PDF-Image +watermark.selectText.10=PDF omzetten naar PDF-Afbeelding watermark.submit=Watermerk toevoegen -watermark.type.1=Text -watermark.type.2=Image +watermark.type.1=Tekst +watermark.type.2=Afbeelding #Change permissions @@ -1075,7 +1094,7 @@ pdfToPDFA.header=PDF naar PDF/A pdfToPDFA.credit=Deze service gebruikt ghostscript voor PDF/A-conversie pdfToPDFA.submit=Converteren pdfToPDFA.tip=Werkt momenteel niet voor meerdere inputs tegelijkertijd. -pdfToPDFA.outputFormat=Output format +pdfToPDFA.outputFormat=Uitvoerindeling pdfToPDFA.pdfWithDigitalSignature=Dit PDF bestand bevat een digitale handtekening. Deze wordt in de volgende stap verwijderd. @@ -1166,7 +1185,7 @@ printFile.title=Print bestand printFile.header=Print bestand naar printer printFile.selectText.1=Selecteer bestand om te printen printFile.selectText.2=Voer printernaam in -printFile.submit=Print +printFile.submit=Druk af #licenses @@ -1181,8 +1200,8 @@ licenses.license=Licentie survey.nav=Enquête survey.title=Stirling-PDF Enquête survey.description=Stirling-PDF heeft geen tracking, dus we willen van onze gebruikers horen om Stirling-PDF te verbeteren. -survey.changes=Stirling-PDF has changed since the last survey! To find out more please check our blog post here: -survey.changes2=With these changes we are getting paid business support and funding +survey.changes=Stirling-PDF is sinds de laatste enquête veranderd! Zie hier onze blogpost voor meer informatie: +survey.changes2=Met deze veranderingen krijgen we betaalde bedrijfsondersteuning en financiering survey.please=Overweeg alstublieft om onze enquête in te vullen! survey.disabled=(Enquête popup wordt in een toekomstige update weggehaald, maar is beschikbaar aan de onderkant van de pagina.) survey.button=Vul enquête in. @@ -1204,21 +1223,19 @@ error.discordSubmit=Discord - Maak een support post #remove-image -removeImage.title=Remove image -removeImage.header=Remove image -removeImage.removeImage=Remove image -removeImage.submit=Remove image - - -splitByChapters.title=Split PDF by Chapters -splitByChapters.header=Split PDF by Chapters -splitByChapters.bookmarkLevel=Bookmark Level -splitByChapters.includeMetadata=Include Metadata -splitByChapters.allowDuplicates=Allow Duplicates -splitByChapters.desc.1=This tool splits a PDF file into multiple PDFs based on its chapter structure. -splitByChapters.desc.2=Bookmark Level: Choose the level of bookmarks to use for splitting (0 for top-level, 1 for second-level, etc.). -splitByChapters.desc.3=Include Metadata: If checked, the original PDF's metadata will be included in each split PDF. -splitByChapters.desc.4=Allow Duplicates: If checked, allows multiple bookmarks on the same page to create separate PDFs. -splitByChapters.submit=Split PDF +removeImage.title=Afbeelding verwijderen +removeImage.header=Afbeelding verwijderen +removeImage.removeImage=Afbeelding verwijderen +removeImage.submit=Verwijder afbeelding +splitByChapters.title=PDF splits op hoofdstukken +splitByChapters.header=PDF splitsen per hoofdstuk +splitByChapters.bookmarkLevel=Boekmarkeer niveau +splitByChapters.includeMetadata=Metadata inclusief +splitByChapters.allowDuplicates=Dubbele items toestaan +splitByChapters.desc.1=Dit hulpmiddel splits een PDF-bestand op in meerdere PDF's gebaseerd op zijn hoofdstukstructuur. +splitByChapters.desc.2=Boekmarkeer niveau: Kies het boekmarkeer niveau om te gebruiken voor delen (0 voor topniveau, 1 voor tweedelvou, etc.). +splitByChapters.desc.3=Metadata inclusief: Als gecijfeld, de originele PDF's metadata wordt ingevoegd in elk gesplitst PDF-bestand. +splitByChapters.desc.4=Dubbele items toestaan: Als gecijfeld, zorgen multiple boekmarkeersymboolen op dezelfde pagina voor het maken van aparte PDF-bestanden. +splitByChapters.submit=PDF splitsen diff --git a/src/main/resources/messages_no_NB.properties b/src/main/resources/messages_no_NB.properties index 207ab27dc..05b04ad22 100644 --- a/src/main/resources/messages_no_NB.properties +++ b/src/main/resources/messages_no_NB.properties @@ -79,6 +79,8 @@ info=Info pro=Pro page=Page pages=Pages +loading=Loading... +addToDoc=Add to Document legal.privacy=Privacy Policy legal.terms=Terms and Conditions @@ -244,6 +246,7 @@ database.fileNullOrEmpty=Fil må ikke være tom eller null database.failedImportFile=Import av fil mislyktes session.expired=Your session has expired. Please refresh the page and try again. +session.refreshPage=Refresh Page ############# # HOME-PAGE # @@ -748,6 +751,7 @@ certSign.showSig=Vis signatur certSign.reason=Årsak certSign.location=Sted certSign.name=Navn +certSign.showLogo=Show Logo certSign.submit=Signer PDF @@ -782,6 +786,9 @@ compare.highlightColor.2=Uthevingsfarge 2: compare.document.1=Dokument 1 compare.document.2=Dokument 2 compare.submit=Sammenlign +compare.complex.message=One or both of the provided documents are large files, accuracy of comparison may be reduced +compare.large.file.message=One or Both of the provided documents are too large to process +compare.no.text.message=One or both of the selected PDFs have no text content. Please choose PDFs with text for comparison. #BookToPDF BookToPDF.title=Bøker og Tegneserier til PDF @@ -804,6 +811,11 @@ sign.draw=Tegn signatur sign.text=Tekstinput sign.clear=Slett sign.add=Legg til +sign.saved=Saved Signatures +sign.save=Save Signature +sign.personalSigs=Personal Signatures +sign.sharedSigs=Shared Signatures +sign.noSavedSigs=No saved signatures found #repair @@ -921,7 +933,14 @@ pdfOrganiser.placeholder=(f.eks. 1,3,2 eller 4-8,2,10-12 eller 2n-1) multiTool.title=PDF-multiverktøy multiTool.header=PDF-multiverktøy multiTool.uploadPrompts=Filnavn - +multiTool.selectAll=Select All +multiTool.deselectAll=Deselect All +multiTool.selectPages=Page Select +multiTool.selectedPages=Selected Pages +multiTool.page=Page +multiTool.deleteSelected=Delete Selected +multiTool.downloadAll=Export +multiTool.downloadSelected=Export Selected #view pdf viewPdf.title=Vis PDF viewPdf.header=Vis PDF @@ -1220,5 +1239,3 @@ splitByChapters.desc.2=Bookmark Level: Choose the level of bookmarks to use for splitByChapters.desc.3=Include Metadata: If checked, the original PDF's metadata will be included in each split PDF. splitByChapters.desc.4=Allow Duplicates: If checked, allows multiple bookmarks on the same page to create separate PDFs. splitByChapters.submit=Split PDF - - diff --git a/src/main/resources/messages_pl_PL.properties b/src/main/resources/messages_pl_PL.properties index 241ae94c9..4cdb54a0b 100755 --- a/src/main/resources/messages_pl_PL.properties +++ b/src/main/resources/messages_pl_PL.properties @@ -79,6 +79,8 @@ info=informacje pro=Pro page=Strona pages=Strony +loading=Loading... +addToDoc=Add to Document legal.privacy=Polityka Prywatności legal.terms=Zasady i Postanowienia @@ -244,6 +246,7 @@ database.fileNullOrEmpty=Plik nie może być pusty database.failedImportFile=Nie udało się zaimportować pliku session.expired=Twoja sesja wygasła. Odśwież stronę i spróbuj ponownie. +session.refreshPage=Refresh Page ############# # HOME-PAGE # @@ -748,6 +751,7 @@ certSign.showSig=Wyświetl podpis certSign.reason=Organizacja certSign.location=Lokalizacja certSign.name=Nazwa +certSign.showLogo=Show Logo certSign.submit=Podpisz PDF @@ -782,6 +786,9 @@ compare.highlightColor.2=Kolor Podświetlenia 2: compare.document.1=Dokument 1 compare.document.2=Dokument 2 compare.submit=Porównaj +compare.complex.message=One or both of the provided documents are large files, accuracy of comparison may be reduced +compare.large.file.message=One or Both of the provided documents are too large to process +compare.no.text.message=One or both of the selected PDFs have no text content. Please choose PDFs with text for comparison. #BookToPDF BookToPDF.title=eBooki do PDF @@ -804,6 +811,11 @@ sign.draw=Narysuj podpis sign.text=Wprowadź tekst sign.clear=Wyczyść sign.add=Dodaj +sign.saved=Saved Signatures +sign.save=Save Signature +sign.personalSigs=Personal Signatures +sign.sharedSigs=Shared Signatures +sign.noSavedSigs=No saved signatures found #repair @@ -921,7 +933,14 @@ pdfOrganiser.placeholder=(przykład 1,3,2 lub 4-8,2,10-12 lub 2n-1) multiTool.title=Narzędzie Wielofunkcyjne PDF multiTool.header=Narzędzie Wielofunkcyjne PDF multiTool.uploadPrompts=Nazwa pliku - +multiTool.selectAll=Select All +multiTool.deselectAll=Deselect All +multiTool.selectPages=Page Select +multiTool.selectedPages=Selected Pages +multiTool.page=Page +multiTool.deleteSelected=Delete Selected +multiTool.downloadAll=Export +multiTool.downloadSelected=Export Selected #view pdf viewPdf.title=Podejrzyj PDF viewPdf.header=Podejrzyj PDF @@ -1220,5 +1239,3 @@ splitByChapters.desc.2=Poziom Zakładek: Wybierz poziom zakładek, który ma zos splitByChapters.desc.3=Dołącz Metadane: Jeśli opcja ta jest zaznaczona, metadane oryginalnego pliku PDF zostaną uwzględnione w każdym rozdzielonych plików PDF. splitByChapters.desc.4=Zezwól na Duplikaty: Jeśli ta opcja jest zaznaczona, pozwala na tworzenie oddzielnych plików PDF przez wiele zakładek na tej samej stronie. splitByChapters.submit=Podziel PDF - - diff --git a/src/main/resources/messages_pt_BR.properties b/src/main/resources/messages_pt_BR.properties index acdce05cf..bd6765655 100644 --- a/src/main/resources/messages_pt_BR.properties +++ b/src/main/resources/messages_pt_BR.properties @@ -76,9 +76,11 @@ donate=Doar color=Cor sponsor=Patrocinador info=Informações -pro=Pro +pro=Profissional page=Página pages=Páginas +loading=Carregando... +addToDoc=Adicionar ao Documento legal.privacy=Política de Privacidade legal.terms=Termos e Condições @@ -145,7 +147,7 @@ navbar.sections.convertFrom=Converter de PDF navbar.sections.security=Assinatura & Segurança navbar.sections.advance=Avançado navbar.sections.edit=Visualizar & editar -navbar.sections.popular=Popular +navbar.sections.popular=Populares ############# # SETTINGS # @@ -244,6 +246,7 @@ database.fileNullOrEmpty=O arquivo não pode estar nulo ou vazio database.failedImportFile=Falha ao importar arquivo session.expired=Sua sessão expirou. Por gentileza atualize a página e tente novamente. +session.refreshPage=Refresh Page ############# # HOME-PAGE # @@ -748,6 +751,7 @@ certSign.showSig=Mostrar Assinatura certSign.reason=Razão certSign.location=Localização certSign.name=Nome +certSign.showLogo=Mostrar Logotipo certSign.submit=Assinar PDF @@ -782,6 +786,9 @@ compare.highlightColor.2=Cor de destaque 2: compare.document.1=Documento 1 compare.document.2=Documento 2 compare.submit=Comparar +compare.complex.message=Um ou ambos os documentos fornecidos são arquivos grandes, a precisão da comparação pode ser reduzida +compare.large.file.message=Um ou ambos os documentos fornecidos são muito grandes para processar +compare.no.text.message=Um ou ambos os PDFs selecionados não possuem conteúdo de texto. Por favor, escolha PDFs com texto para comparação. #BookToPDF BookToPDF.title=Livros e Quadrinhos para PDF @@ -804,6 +811,11 @@ sign.draw=Desenhar Assinatura sign.text=Inserir texto sign.clear=Limpar sign.add=Adicionar +sign.saved=Assinaturas Salvas +sign.save=Salvar Assinatura +sign.personalSigs=Assinaturas Pessoais +sign.sharedSigs=Assinaturas Compartilhadas +sign.noSavedSigs=Nenhuma assinatura salva encontrada #repair @@ -921,7 +933,14 @@ pdfOrganiser.placeholder=(por exemplo 1,3,2 ou 4-8,2,10-12 ou 2n-1) multiTool.title=Multiferramenta de PDF multiTool.header=Multiferramenta de PDF multiTool.uploadPrompts=Nome do arquivo - +multiTool.selectAll=Select All +multiTool.deselectAll=Deselect All +multiTool.selectPages=Page Select +multiTool.selectedPages=Selected Pages +multiTool.page=Page +multiTool.deleteSelected=Delete Selected +multiTool.downloadAll=Export +multiTool.downloadSelected=Export Selected #view pdf viewPdf.title=Visualizar PDF viewPdf.header=Visualizar PDF @@ -1063,7 +1082,7 @@ changeMetadata.keywords=Palavras-chave: changeMetadata.modDate=Data de modificação (aaaa/MM/dd HH:mm:ss): changeMetadata.producer=Produtor: changeMetadata.subject=Assunto: -changeMetadata.trapped=Trapped: +changeMetadata.trapped=Atrapado: changeMetadata.selectText.4=Outros metadados: changeMetadata.selectText.5=Adicionar entrada de metadados personalizada changeMetadata.submit=Alterar @@ -1220,5 +1239,3 @@ splitByChapters.desc.2=Nível de Marcador: Escolha o nível de marcador a ser us splitByChapters.desc.3=Incluir Metadados: Se marcado, os metadados do PDF original serão incluidos em cada divisão do PDF. splitByChapters.desc.4=Permitir Cópias: Se marcado, habilita vários marcadores na mesma página para criar PDFs separados. splitByChapters.submit=Dividir PDF - - diff --git a/src/main/resources/messages_pt_PT.properties b/src/main/resources/messages_pt_PT.properties index 94b2e5356..2d994bef6 100644 --- a/src/main/resources/messages_pt_PT.properties +++ b/src/main/resources/messages_pt_PT.properties @@ -3,8 +3,8 @@ ########### # the direction that the language is written (ltr = left to right, rtl = right to left) language.direction=ltr -addPageNumbers.fontSize=Font Size -addPageNumbers.fontName=Font Name +addPageNumbers.fontSize=Tamanho da Fonte +addPageNumbers.fontName=Nome da Fonte pdfPrompt=Selecione PDF(s) multiPdfPrompt=Selecione PDFs (2+) multiPdfDropPrompt=Selecione (ou arraste e solte) todos os PDFs necessários @@ -18,11 +18,11 @@ true=Verdadeiro false=Falso unknown=Desconhecido save=Salvar -saveToBrowser=Save to Browser +saveToBrowser=Guardar no Navegador close=Fechar filesSelected=Ficheiros Selecionados noFavourites=Nenhum favorito adicionado -downloadComplete=Download Complete +downloadComplete=Download Completo bored=Entediado esperando? alphabet=Alfabeto downloadPdf=Descarregar PDF @@ -55,36 +55,38 @@ notAuthenticatedMessage=Utilizador não autenticado. userNotFoundMessage=Utilizador inexistente. incorrectPasswordMessage=Senha incorreta. usernameExistsMessage=Esse utilizador já existe. -invalidUsernameMessage=Invalid username, username can only contain letters, numbers and the following special characters @._+- or must be a valid email address. -invalidPasswordMessage=The password must not be empty and must not have spaces at the beginning or end. -confirmPasswordErrorMessage=New Password and Confirm New Password must match. -deleteCurrentUserMessage=Cannot delete currently logged in user. -deleteUsernameExistsMessage=The username does not exist and cannot be deleted. +invalidUsernameMessage=Nome de utilizador inválido, o nome de utilizador pode conter apenas letras, números e os seguintes caracteres especiais @._+- ou deve ser um endereço de email válido. +invalidPasswordMessage=A senha não pode estar vazia e não deve ter espaços no início ou final. +confirmPasswordErrorMessage=Nova Senha e Confirmação de Nova Senha devem corresponder. +deleteCurrentUserMessage=Não pode apagar o utilizador atualmente logado. +deleteUsernameExistsMessage=O nome de utilizador não existe e não pode ser apagado. downgradeCurrentUserMessage=Não é possível fazer downgrade da função do utilizador atual -disabledCurrentUserMessage=The current user cannot be disabled +disabledCurrentUserMessage=O utilizador actual não pode ser desactivado downgradeCurrentUserLongMessage=Não é possível fazer downgrade da função do utilizador atual. Portanto, o utilizador atual não será mostrado. -userAlreadyExistsOAuthMessage=The user already exists as an OAuth2 user. -userAlreadyExistsWebMessage=The user already exists as an web user. -error=Error +userAlreadyExistsOAuthMessage=O utilizador já existe como um utilizador OAuth2. +userAlreadyExistsWebMessage=O utilizador já existe como um utilizador da web. +error=Erro oops=Oops! -help=Help -goHomepage=Go to Homepage -joinDiscord=Join our Discord server -seeDockerHub=See Docker Hub -visitGithub=Visit Github Repository -donate=Donate -color=Color -sponsor=Sponsor -info=Info +help=Ajuda +goHomepage=Ir para a Página Inicial +joinDiscord=Junte-se ao nosso servidor Discord +seeDockerHub=Ver o Docker Hub +visitGithub=Visitar Repositório do Github +donate=Doar +color=Cor +sponsor=Patrocinar +info=Informação pro=Pro -page=Page -pages=Pages +page=Página +pages=Páginas +loading=A carregar... +addToDoc=Adicionar ao Documento -legal.privacy=Privacy Policy -legal.terms=Terms and Conditions -legal.accessibility=Accessibility -legal.cookie=Cookie Policy -legal.impressum=Impressum +legal.privacy=Política de Privacidade +legal.terms=Termos e Condições +legal.accessibility=Acessibilidade +legal.cookie=Política de Cookies +legal.impressum=Impressão ############### # Pipeline # @@ -95,8 +97,8 @@ pipeline.configureButton=Configurar pipeline.defaultOption=Personalizar pipeline.submitButton=Submeter pipeline.help=Pipeline Help -pipeline.scanHelp=Folder Scanning Help -pipeline.deletePrompt=Are you sure you want to delete pipeline +pipeline.scanHelp=Ajuda ao Escaneamento de Pastas +pipeline.deletePrompt=Tem a certeza que quer eliminar o pipeline? ###################### # Pipeline Options # @@ -114,45 +116,45 @@ pipelineOptions.validateButton=Validar ######################## # ENTERPRISE EDITION # ######################## -enterpriseEdition.button=Upgrade to Pro -enterpriseEdition.warning=This feature is only available to Pro users. -enterpriseEdition.yamlAdvert=Stirling PDF Pro supports YAML configuration files and other SSO features. -enterpriseEdition.ssoAdvert=Looking for more user management features? Check out Stirling PDF Pro +enterpriseEdition.button=Atualizar para Pro +enterpriseEdition.warning=Esta funcionalidade está disponível apenas para os utilizadores Pro. +enterpriseEdition.yamlAdvert=Stirling PDF Pro suporta ficheiros de configuração YAML e outras funcionalidades SSO. +enterpriseEdition.ssoAdvert=Procuras mais funcionalidades de gestão de utilizadores? Verifica Stirling PDF Pro ################# # Analytics # ################# -analytics.title=Do you want make Stirling PDF better? -analytics.paragraph1=Stirling PDF has opt in analytics to help us improve the product. We do not track any personal information or file contents. -analytics.paragraph2=Please consider enabling analytics to help Stirling-PDF grow and to allow us to understand our users better. -analytics.enable=Enable analytics -analytics.disable=Disable analytics -analytics.settings=You can change the settings for analytics in the config/settings.yml file +analytics.title=Queres tornar o Stirling PDF melhor? +analytics.paragraph1=O Stirling PDF tem análises de entrada voluntária para nos ajudar a melhorar o produto. Não registamos qualquer informação pessoal ou conteúdo dos ficheiros. +analytics.paragraph2=Considera ativar as análises para nos auxiliar no crescimento do Stirling-PDF e na compreensão dos nossos utilizadores melhor. +analytics.enable=Ativar analítico +analytics.disable=Desativar analítico +analytics.settings=Podes mudar as configurações de análises no ficheiro config/settings.yml ############# # NAVBAR # ############# -navbar.favorite=Favorites +navbar.favorite=Favoritos navbar.darkmode=Modo Escuro -navbar.language=Languages +navbar.language=Idiomas navbar.settings=Configurações -navbar.allTools=Tools +navbar.allTools=Ferramentas navbar.multiTool=Multi Tools -navbar.sections.organize=Organize -navbar.sections.convertTo=Convert to PDF -navbar.sections.convertFrom=Convert from PDF -navbar.sections.security=Sign & Security -navbar.sections.advance=Advanced -navbar.sections.edit=View & Edit -navbar.sections.popular=Popular +navbar.sections.organize=Organizar +navbar.sections.convertTo=Converter para PDF +navbar.sections.convertFrom=Converter de PDF +navbar.sections.security=Assinar & Segurança +navbar.sections.advance=Avançado +navbar.sections.edit=Visualizar & Editar +navbar.sections.popular=Populares ############# # SETTINGS # ############# settings.title=Configurações settings.update=Atualização disponível -settings.updateAvailable={0} is the current installed version. A new version ({1}) is available. +settings.updateAvailable={0} é a versão atual instalada. Uma nova versão ({1}) está disponível. settings.appVersion=Versão da aplicação: settings.downloadOption.title=Escolha a opção de download (para downloads não compactados de ficheiro único): settings.downloadOption.1=Abrir na mesma janela @@ -161,13 +163,13 @@ settings.downloadOption.3=⇬ Fazer download do ficheiro settings.zipThreshold=Compactar ficheiros quando o número de ficheiros baixados exceder settings.signOut=Terminar Sessão settings.accountSettings=Configuração de Conta -settings.bored.help=Enables easter egg game -settings.cacheInputs.name=Save form inputs -settings.cacheInputs.help=Enable to store previously used inputs for future runs +settings.bored.help=Ativa o jogo da páscoa +settings.cacheInputs.name=Guardar entradas do formulário +settings.cacheInputs.help=Ativar para armazenar entradas anteriores do formulário para futuras sessões changeCreds.title=Alterar senha changeCreds.header=Alterar dados da sua conta -changeCreds.changePassword=You are using default login credentials. Please enter a new password +changeCreds.changePassword=Está a usar as credenciais de login predefinidas. Por favor, introduza uma nova senha changeCreds.newUsername=Novo Utilizador changeCreds.oldPassword=Senha Atual changeCreds.newPassword=Nova Senha @@ -176,74 +178,75 @@ changeCreds.submit=Submeter Alterações -account.title=Account Settings -account.accountSettings=Account Settings -account.adminSettings=Admin Settings - View and Add Users -account.userControlSettings=User Control Settings -account.changeUsername=Change Username -account.newUsername=New Username -account.password=Confirmation Password -account.oldPassword=Old password -account.newPassword=New Password -account.changePassword=Change Password -account.confirmNewPassword=Confirm New Password -account.signOut=Sign Out -account.yourApiKey=Your API Key -account.syncTitle=Sync browser settings with Account -account.settingsCompare=Settings Comparison: -account.property=Property -account.webBrowserSettings=Web Browser Setting -account.syncToBrowser=Sync Account -> Browser -account.syncToAccount=Sync Account <- Browser +account.title=Definições da Conta +account.accountSettings=Definições da Conta +account.adminSettings=Definições de Administrador - Visualizar e Adicionar Utilizadores +account.userControlSettings=Definições de Controlo do Utilizador +account.changeUsername=Alterar Nome de Utilizador +account.newUsername=Novo Nome de Utilizador +account.password=Confirmação da Senha +account.oldPassword=Antiga senha +account.newPassword=Nova senha +account.changePassword=Alterar a Senha +account.confirmNewPassword=Confirmar Nova Senha +account.signOut=Sair do Sistema +account.yourApiKey=Sua Chave API +account.syncTitle=sincronizar definições do navegador com a conta +account.settingsCompare=Comparação das Definições: +account.property=Propriedade +account.webBrowserSettings=Configurações do Navegador Web +account.syncToBrowser=Sincronizar Conta -> Navegador +account.syncToAccount=Sincronizar Conta <- Navegador -adminUserSettings.title=User Control Settings -adminUserSettings.header=Admin User Control Settings -adminUserSettings.admin=Admin -adminUserSettings.user=User -adminUserSettings.addUser=Add New User -adminUserSettings.deleteUser=Delete User -adminUserSettings.confirmDeleteUser=Should the user be deleted? -adminUserSettings.confirmChangeUserStatus=Should the user be disabled/enabled? -adminUserSettings.usernameInfo=Username can only contain letters, numbers and the following special characters @._+- or must be a valid email address. -adminUserSettings.roles=Roles -adminUserSettings.role=Role -adminUserSettings.actions=Actions -adminUserSettings.apiUser=Limited API User -adminUserSettings.extraApiUser=Additional Limited API User -adminUserSettings.webOnlyUser=Web Only User -adminUserSettings.demoUser=Demo User (No custom settings) -adminUserSettings.internalApiUser=Internal API User -adminUserSettings.forceChange=Force user to change password on login -adminUserSettings.submit=Save User +adminUserSettings.title=Definições de Controlo do Utilizador +adminUserSettings.header=Definições de Controlo do Utilizador (Admin) +adminUserSettings.admin=Administrador +adminUserSettings.user=Utilizador +adminUserSettings.addUser=Adicionar Novo Utilizador +adminUserSettings.deleteUser=Apagar Utilizador +adminUserSettings.confirmDeleteUser=Deverá o utilizador ser apagado? +adminUserSettings.confirmChangeUserStatus=Deverá a situação do utilizador ser alterada (desativar/ativar)? +adminUserSettings.usernameInfo=O nome de utilizador só pode conter letras, números e os seguintes caracteres especiais @._+- ou deve ser um endereço de email válido. +adminUserSettings.roles=Papeis +adminUserSettings.role=Papel +adminUserSettings.actions=Ações +adminUserSettings.apiUser=Utilizador API Limitado +adminUserSettings.extraApiUser=Utilizador ADicional API Limitado +adminUserSettings.webOnlyUser=Utilizador Apenas Web +adminUserSettings.demoUser=Utilizador Demo (Sem Configurações Personalizadas) +adminUserSettings.internalApiUser=Utilizador API Interno +adminUserSettings.forceChange=Forçar utilizador a mudar a senha ao fazer login +adminUserSettings.submit=Guardar Utilizador adminUserSettings.changeUserRole=Alterar usuário -adminUserSettings.authenticated=Authenticated -adminUserSettings.editOwnProfil=Edit own profile -adminUserSettings.enabledUser=enabled user -adminUserSettings.disabledUser=disabled user -adminUserSettings.activeUsers=Active Users: -adminUserSettings.disabledUsers=Disabled Users: -adminUserSettings.totalUsers=Total Users: -adminUserSettings.lastRequest=Last Request +adminUserSettings.authenticated=Autenticado +adminUserSettings.editOwnProfil=Editar perfil próprio +adminUserSettings.enabledUser=utilizador habilitado +adminUserSettings.disabledUser=utilizador desabilitado +adminUserSettings.activeUsers=Utilizadores Activos: +adminUserSettings.disabledUsers=Utilizadores Desactivados: +adminUserSettings.totalUsers=Total de Utilizadores: +adminUserSettings.lastRequest=Última Requisição -database.title=Database Import/Export -database.header=Database Import/Export -database.fileName=File Name -database.creationDate=Creation Date -database.fileSize=File Size -database.deleteBackupFile=Delete Backup File -database.importBackupFile=Import Backup File -database.downloadBackupFile=Download Backup File -database.info_1=When importing data, it is crucial to ensure the correct structure. If you are unsure of what you are doing, seek advice and support from a professional. An error in the structure can cause application malfunctions, up to and including the complete inability to run the application. -database.info_2=The file name does not matter when uploading. It will be renamed afterward to follow the format backup_user_yyyyMMddHHmm.sql, ensuring a consistent naming convention. -database.submit=Import Backup -database.importIntoDatabaseSuccessed=Import into database successed +database.title=Importação/Exportação de Base de Dados +database.header=Importação/Exportação de Base de Dados +database.fileName=Nome do Ficheiro +database.creationDate=Data de Criação +database.fileSize=Tamanho do Ficheiro +database.deleteBackupFile=Apagar Ficheiro de Backup +database.importBackupFile=Importar Ficheiro de Backup +database.downloadBackupFile=Baixar Ficheiro de Backup +database.info_1=Ao importar dados, é crucial assegurar a estrutura correta. Se não estiver seguro do que está a fazer, busque conselhos e apoio de um profissional. Um erro na estrutura pode causar mal funcionamento da aplicação, até mesmo o impossibilitar de executá-la. +database.info_2=O nome do ficheiro não importa ao carregar. Será renomeado posteriormente para seguir o formato backup_user_yyyyMMddHHmm.sql, garantindo uma convenção de nomenclatura consistente. +database.submit=Importar Backup +database.importIntoDatabaseSuccessed=Importação no banco de dados concluída com sucesso database.fileNotFound=File not Found -database.fileNullOrEmpty=File must not be null or empty +database.fileNullOrEmpty=O ficheiro não pode ser nulo ou vazio database.failedImportFile=Failed Import File -session.expired=Your session has expired. Please refresh the page and try again. +session.expired=A sessão expirou. Por favor, recarregue a página e tente novamente. +session.refreshPage=Refresh Page ############# # HOME-PAGE # @@ -380,7 +383,7 @@ removeBlanks.tags=limpeza,otimização,sem-conteúdo,organizar home.removeAnnotations.title=Removee Notas home.removeAnnotations.desc=Remove todas as notas ou comentário de um PDF. -removeAnnotations.tags=comments,highlight,notes,markup,remove +removeAnnotations.tags=comentários,destaque,notas,marcação,remover home.compare.title=Comparar home.compare.desc=Comparar e mostrar as diferenças entre 2 documentos PDF @@ -390,9 +393,9 @@ home.certSign.title=Assinar com Certificado home.certSign.desc=Assinar um PDF com um Certificado/Chave (PEM/P12) certSign.tags=autenticar,PEM,P12,oficial,criptografar -home.removeCertSign.title=Remove Certificate Sign -home.removeCertSign.desc=Remove certificate signature from PDF -removeCertSign.tags=authenticate,PEM,P12,official,decrypt +home.removeCertSign.title=Remover Assinatura Certificado +home.removeCertSign.desc=Remova a assinatura do certificado do PDF +removeCertSign.tags=autenticar,PEM,P12,oficial,desencriptar home.pageLayout.title=Layout de Múltiplas Páginas home.pageLayout.desc=Juntar várias páginas de um documento PDF em uma única página @@ -465,7 +468,7 @@ showJS.tags=JavaScript home.autoRedact.title=Edição automática home.autoRedact.desc=Edição automática (marca a preto) baseada numa expressão indicada de um PDF. -autoRedact.tags=Redact,Hide,black out,black,marker,hidden +autoRedact.tags=Esconder,censurar,marcador,tampado,máscara,oculto home.tableExtraxt.title=PDF para CSV home.tableExtraxt.desc=Extrai tabelas de um PDF convertendo em um CSV @@ -490,41 +493,41 @@ home.AddStampRequest.desc=Adicionar um carimbo de texto ou imagem AddStampRequest.tags=Carimbo, Adicionar imagem, imagem central, Marca d'água, PDF, Embebido, Personalizado -home.PDFToBook.title=PDF to Book -home.PDFToBook.desc=Converts PDF to Book/Comic formats using calibre +home.PDFToBook.title=PDF para Livro +home.PDFToBook.desc=Converte PDF em formatos de livro/comic utilizando o Calibre PDFToBook.tags=Book,Comic,Calibre,Convert,manga,amazon,kindle -home.BookToPDF.title=Book to PDF -home.BookToPDF.desc=Converts Books/Comics formats to PDF using calibre +home.BookToPDF.title=Livro para PDF +home.BookToPDF.desc=Converte formatos de livros/comics em PDF utilizando o Calibre BookToPDF.tags=Book,Comic,Calibre,Convert,manga,amazon,kindle -home.removeImagePdf.title=Remove image -home.removeImagePdf.desc=Remove image from PDF to reduce file size -removeImagePdf.tags=Remove Image,Page operations,Back end,server side +home.removeImagePdf.title=Remover imagem +home.removeImagePdf.desc=Remova imagem do PDF para reduzir o tamanho do ficheiro +removeImagePdf.tags=Remover Imagem,operações de página,lado de servidor -home.splitPdfByChapters.title=Split PDF by Chapters -home.splitPdfByChapters.desc=Split a PDF into multiple files based on its chapter structure. -splitPdfByChapters.tags=split,chapters,bookmarks,organize +home.splitPdfByChapters.title=Dividir PDF por Capítulos +home.splitPdfByChapters.desc=Divida um PDF em vários arquivos com base na estrutura dos capítulos. +splitPdfByChapters.tags=dividir,capítulos,marcadores,organizar #replace-invert-color replace-color.title=Replace-Invert-Color -replace-color.header=Replace-Invert Color PDF +replace-color.header=Substituir-Inverter Cor do PDF home.replaceColorPdf.title=Replace and Invert Color -home.replaceColorPdf.desc=Replace color for text and background in PDF and invert full color of pdf to reduce file size -replaceColorPdf.tags=Replace Color,Page operations,Back end,server side -replace-color.selectText.1=Replace or Invert color Options -replace-color.selectText.2=Default(Default high contrast colors) -replace-color.selectText.3=Custom(Customized colors) -replace-color.selectText.4=Full-Invert(Invert all colors) -replace-color.selectText.5=High contrast color options -replace-color.selectText.6=white text on black background -replace-color.selectText.7=Black text on white background -replace-color.selectText.8=Yellow text on black background -replace-color.selectText.9=Green text on black background -replace-color.selectText.10=Choose text Color -replace-color.selectText.11=Choose background Color -replace-color.submit=Replace +home.replaceColorPdf.desc=Substituir cor pelo texto e fundo em PDF e inverter toda a cor do PDF para reduzir o tamanho do ficheiro +replaceColorPdf.tags=Substituição de Cor, Operações de Página, Back End, lado do servidor +replace-color.selectText.1=Opções de Substituição ou Inversão de Cor +replace-color.selectText.2=Padrão (Cor de contraste alto padrão) +replace-color.selectText.3=Personalizado ( cores personalizadas) +replace-color.selectText.4=Inversão Total (inverter todas as cores) +replace-color.selectText.5=Opções de cor de contraste alto +replace-color.selectText.6=Texto branco sobre fundo preto +replace-color.selectText.7=Texto preto sobre fundo branco +replace-color.selectText.8=Texto amarelo sobre fundo preto +replace-color.selectText.9=Texto verde sobre fundo preto +replace-color.selectText.10=Escolher cor do texto +replace-color.selectText.11=Escolher cor de fundo +replace-color.submit=Substituir @@ -543,17 +546,17 @@ login.locked=A sua conta foi bloqueada. login.signinTitle=Introduza os seus dados de acesso login.ssoSignIn=Iniciar sessão através de início de sessão único login.oauth2AutoCreateDisabled=OAUTH2 Criação Automática de Utilizador Desativada -login.oauth2AdminBlockedUser=Registration or logging in of non-registered users is currently blocked. Please contact the administrator. -login.oauth2RequestNotFound=Authorization request not found -login.oauth2InvalidUserInfoResponse=Invalid User Info Response -login.oauth2invalidRequest=Invalid Request -login.oauth2AccessDenied=Access Denied -login.oauth2InvalidTokenResponse=Invalid Token Response -login.oauth2InvalidIdToken=Invalid Id Token -login.userIsDisabled=User is deactivated, login is currently blocked with this username. Please contact the administrator. -login.alreadyLoggedIn=You are already logged in to -login.alreadyLoggedIn2=devices. Please log out of the devices and try again. -login.toManySessions=You have too many active sessions +login.oauth2AdminBlockedUser=A registo ou login de utilizadores não-registados está atualmente bloqueado. Por favor, contacte o administrador. +login.oauth2RequestNotFound=Solicitação de autorização não encontrada +login.oauth2InvalidUserInfoResponse=Resposta de informações do utilizador inválida +login.oauth2invalidRequest=Requisito inválido +login.oauth2AccessDenied=Acesso negado +login.oauth2InvalidTokenResponse=Resposta de token inválida +login.oauth2InvalidIdToken=Token de identificação inválido +login.userIsDisabled=O utilizador foi desativado, o login está atualmente bloqueado com esta conta. Por favor, contacte o administrador. +login.alreadyLoggedIn=Já está logado em +login.alreadyLoggedIn2=dispositivos. Por favor, faça logout nos dispositivos e tente novamente. +login.toManySessions=Tem sessões ativas demais #auto-redact autoRedact.title=Edição Automática @@ -585,7 +588,7 @@ pdfToSinglePage.submit=Converter para Página Única pageExtracter.title=Extrair Páginas pageExtracter.header=Extrair Páginas pageExtracter.submit=Extrair -pageExtracter.placeholder=(e.g. 1,2,8 or 4,7,12-16 or 2n-1) +pageExtracter.placeholder=(ex: 1,2,8 ou 4,7,12-16 ou 2n-1) #getPdfInfo @@ -728,7 +731,7 @@ pageLayout.submit=Enviar scalePages.title=Ajustar Tamanho/Escala da Página scalePages.header=Ajustar Tamanho/Escala da Página scalePages.pageSize=Tamanho de uma página do documento. -scalePages.keepPageSize=Original Size +scalePages.keepPageSize=Tamanho original scalePages.scaleFactor=Fator de zoom (corte) de uma página. scalePages.submit=Enviar @@ -741,21 +744,22 @@ certSign.jksNote=Nota: Se o seu tipo de certificado não estiver listado abaixo, certSign.selectKey=Selecione o seu ficheiro de chave privada (formato PKCS#8, pode ser .pem ou .der): certSign.selectCert=Selecione o seu ficheiro de certificado (formato X.509, pode ser .pem ou .der): certSign.selectP12=Selecione o seu ficheiro de armazenamento de chave PKCS#12 (.p12 ou .pfx) (opcional, se fornecido, deve conter a sua chave privada e certificado): -certSign.selectJKS=Select Your Java Keystore File (.jks or .keystore): +certSign.selectJKS=Selecione o seu Arquivo de Java Keystore (.jks ou .keystore): certSign.certType=Tipo de Certificado certSign.password=Digite a senha do seu armazenamento de chave ou chave privada (se aplicável): certSign.showSig=Mostrar Assinatura certSign.reason=Razão certSign.location=Localização certSign.name=Nome +certSign.showLogo=Mostrar Logotipo certSign.submit=Assinar PDF #removeCertSign -removeCertSign.title=Remove Certificate Signature -removeCertSign.header=Remove the digital certificate from the PDF -removeCertSign.selectPDF=Select a PDF file: -removeCertSign.submit=Remove Signature +removeCertSign.title=Remover Assinatura Digital +removeCertSign.header=Remova a assinatura digital do PDF +removeCertSign.selectPDF=Selecione um ficheiro PDF: +removeCertSign.submit=Remover Assinatura #removeBlanks @@ -777,24 +781,27 @@ removeAnnotations.submit=Remover #compare compare.title=Comparar compare.header=Comparar PDFs -compare.highlightColor.1=Highlight Color 1: -compare.highlightColor.2=Highlight Color 2: +compare.highlightColor.1=Cor de Destaque 1: +compare.highlightColor.2=Cor de Destaque 2: compare.document.1=Documento 1 compare.document.2=Documento 2 compare.submit=Comparar +compare.complex.message=Um ou ambos os documentos fornecidos são arquivos grandes, a precisão da comparação pode ser reduzida +compare.large.file.message=Um ou ambos os documentos fornecidos são muito grandes para processar +compare.no.text.message=Um ou ambos os PDFs seleccionados não têm conteúdo textual. Por favor, seleccione PDFs com texto para comparação. #BookToPDF -BookToPDF.title=Books and Comics to PDF -BookToPDF.header=Book to PDF -BookToPDF.credit=Uses Calibre -BookToPDF.submit=Convert +BookToPDF.title=Livros e Quadrinhos para PDF +BookToPDF.header=Livro para PDF +BookToPDF.credit=Utiliza Calibre +BookToPDF.submit=Converter #PDFToBook -PDFToBook.title=PDF to Book -PDFToBook.header=PDF to Book -PDFToBook.selectText.1=Format -PDFToBook.credit=Uses Calibre -PDFToBook.submit=Convert +PDFToBook.title=PDF para Livro +PDFToBook.header=PDF para Livro +PDFToBook.selectText.1=Formatação +PDFToBook.credit=Utiliza Calibre +PDFToBook.submit=Converter #sign sign.title=Assinar @@ -804,6 +811,11 @@ sign.draw=Desenhar Assinatura sign.text=Inserir Texto sign.clear=Limpar sign.add=Adicionar +sign.saved=Assinaturas Guardadas +sign.save=Guardar Assinatura +sign.personalSigs=Assinaturas Pessoais +sign.sharedSigs=Assinaturas Compartilhadas +sign.noSavedSigs=Nenhuma assinatura guardada encontrada #repair @@ -815,7 +827,7 @@ repair.submit=Reparar #flatten flatten.title=Achatar flatten.header=Achatar PDFs -flatten.flattenOnlyForms=Flatten only forms +flatten.flattenOnlyForms=Apenas formularios aplanados flatten.submit=Achatar @@ -830,7 +842,7 @@ ScannerImageSplit.selectText.7=Área mínima de contorno: ScannerImageSplit.selectText.8=Define o limite mínimo da área de contorno para uma foto ScannerImageSplit.selectText.9=Tamanho do contorno: ScannerImageSplit.selectText.10=Define o tamanho do contorno adicionado e removido para evitar contornos brancos na saída (padrão: 1). -ScannerImageSplit.info=Python is not installed. It is required to run. +ScannerImageSplit.info=O Python não está instalado. É necessário para execução. #OCR @@ -857,7 +869,7 @@ ocr.submit=Processar PDF com OCR extractImages.title=Extrair Imagens extractImages.header=Extrair Imagens extractImages.selectText=Selecione o formato de imagem para converter as imagens extraídas -extractImages.allowDuplicates=Save duplicate images +extractImages.allowDuplicates=Guardar imagens duplicadas extractImages.submit=Extrair @@ -865,7 +877,7 @@ extractImages.submit=Extrair fileToPDF.title=Ficheiro para PDF fileToPDF.header=Converter Qualquer ficheiro para PDF fileToPDF.credit=Este serviço usa o LibreOffice e o Unoconv para conversão de ficheiros. -fileToPDF.supportedFileTypesInfo=Supported File types +fileToPDF.supportedFileTypesInfo=Tipos de ficheiros suportados fileToPDF.supportedFileTypes=Os tipos de ficheiro suportados devem incluir os listados abaixo. No entanto, para obter uma lista atualizada completa dos formatos suportados, consulte a documentação do LibreOffice. fileToPDF.submit=Converter para PDF @@ -895,7 +907,7 @@ merge.title=Juntar merge.header=Juntar Vários PDFs (2+) merge.sortByName=Ordenar por nome merge.sortByDate=Ordenar por data -merge.removeCertSign=Remove digital signature in the merged file? +merge.removeCertSign=Remover assinatura digital no ficheiro combinado? merge.submit=Juntar @@ -903,35 +915,42 @@ merge.submit=Juntar pdfOrganiser.title=Organizador de Páginas pdfOrganiser.header=Organizador de Páginas PDF pdfOrganiser.submit=Reorganizar Páginas -pdfOrganiser.mode=Mode -pdfOrganiser.mode.1=Custom Page Order -pdfOrganiser.mode.2=Reverse Order -pdfOrganiser.mode.3=Duplex Sort -pdfOrganiser.mode.4=Booklet Sort -pdfOrganiser.mode.5=Side Stitch Booklet Sort -pdfOrganiser.mode.6=Odd-Even Split -pdfOrganiser.mode.7=Remove First -pdfOrganiser.mode.8=Remove Last -pdfOrganiser.mode.9=Remove First and Last -pdfOrganiser.mode.10=Odd-Even Merge -pdfOrganiser.placeholder=(e.g. 1,3,2 or 4-8,2,10-12 or 2n-1) +pdfOrganiser.mode=Modo +pdfOrganiser.mode.1=Ordenação Personalizada de Páginas +pdfOrganiser.mode.2=Ordem Inversa +pdfOrganiser.mode.3=Ordenação Duplex +pdfOrganiser.mode.4=Ordernação em Panfleto +pdfOrganiser.mode.5=Ordenação em Panfleto com Costura de Lateral +pdfOrganiser.mode.6=Divisão Ímpar-Par +pdfOrganiser.mode.7=Remover Primeira Página +pdfOrganiser.mode.8=Remover última Página +pdfOrganiser.mode.9=Remover Primeira e Última Página +pdfOrganiser.mode.10=Mergulho Ímpar-Par +pdfOrganiser.placeholder=(ex: 1,3,2 ou 4-8,2,10-12 ou 2n-1) #multiTool multiTool.title=Multiferramenta de PDF multiTool.header=Multiferramenta de PDF -multiTool.uploadPrompts=File Name - +multiTool.uploadPrompts=Nome do Arquivo +multiTool.selectAll=Select All +multiTool.deselectAll=Deselect All +multiTool.selectPages=Page Select +multiTool.selectedPages=Selected Pages +multiTool.page=Page +multiTool.deleteSelected=Delete Selected +multiTool.downloadAll=Export +multiTool.downloadSelected=Export Selected #view pdf -viewPdf.title=View PDF -viewPdf.header=View PDF +viewPdf.title=Visualizar PDF +viewPdf.header=Visualizar PDF #pageRemover pageRemover.title=Remover Página pageRemover.header=Remover Páginas do PDF pageRemover.pagesToDelete=Páginas a serem excluídas (insira uma lista separada por vírgulas de números de página): pageRemover.submit=Excluir Páginas -pageRemover.placeholder=(e.g. 1,2,6 or 1-10,15-30) +pageRemover.placeholder=(ex: 1,2,6 ou 1-10,15-30) #rotate @@ -982,7 +1001,7 @@ pdfToImage.color=Colorida pdfToImage.grey=Escala de Cinza pdfToImage.blackwhite=Preto e Branco (pode resultar em perda de dados!) pdfToImage.submit=Converter -pdfToImage.info=Python is not installed. Required for WebP conversion. +pdfToImage.info=O Python não está instalado. Necessário para a conversão de WebP. #addPassword @@ -1019,10 +1038,10 @@ watermark.selectText.6=Espaçamento Vertical (heightSpacer) watermark.selectText.7=Opacidade (0% - 100%) watermark.selectText.8=Tipo de Marca d'Água watermark.selectText.9=Imagem da Marca d'Água -watermark.selectText.10=Convert PDF to PDF-Image +watermark.selectText.10=Converter PDF em Imagem watermark.submit=Adicionar Marca d'Água -watermark.type.1=Text -watermark.type.2=Image +watermark.type.1=Texto +watermark.type.2=Imagem #Change permissions @@ -1063,7 +1082,7 @@ changeMetadata.keywords=Palavras-chave: changeMetadata.modDate=Data de Modificação (aaaa/MM/dd HH:mm:ss): changeMetadata.producer=Produtor: changeMetadata.subject=Assunto: -changeMetadata.trapped=Trapped: +changeMetadata.trapped=Encalhado: changeMetadata.selectText.4=Outros Metadados changeMetadata.selectText.5=Adicionar Entrada de Metadados Personalizados changeMetadata.submit=Mudar @@ -1074,9 +1093,9 @@ pdfToPDFA.title=PDF para PDF/A pdfToPDFA.header=PDF para PDF/A pdfToPDFA.credit=Este serviço usa ghostscript para Conversão de PDF/A pdfToPDFA.submit=Converter -pdfToPDFA.tip=Currently does not work for multiple inputs at once -pdfToPDFA.outputFormat=Output format -pdfToPDFA.pdfWithDigitalSignature=The PDF contains a digital signature. This will be removed in the next step. +pdfToPDFA.tip=Actualmente não funciona para múltiplos inputs de uma só vez +pdfToPDFA.outputFormat=Formato de saída +pdfToPDFA.pdfWithDigitalSignature=O PDF contém um selo digital. Isto será removido no próximo passo. #PDFToWord @@ -1158,15 +1177,15 @@ split-by-sections.vertical.label=Divisões Verticais split-by-sections.horizontal.placeholder=Introduza o número de divisões horizontais split-by-sections.vertical.placeholder=Introduza o número de divisões verticais split-by-sections.submit=Dividir PDF -split-by-sections.merge=Merge Into One PDF +split-by-sections.merge=Fundir em Um único PDF #printFile -printFile.title=Print File -printFile.header=Print File to Printer -printFile.selectText.1=Select File to Print -printFile.selectText.2=Enter Printer Name -printFile.submit=Print +printFile.title=Imprimir Ficheiro +printFile.header=Imprimir ficheiro na impressora +printFile.selectText.1=Selecione o ficheiro a imprimir +printFile.selectText.2=Introduza o nome da impressora +printFile.submit=Imprimir #licenses @@ -1178,47 +1197,45 @@ licenses.version=Versão licenses.license=Licença #survey -survey.nav=Survey -survey.title=Stirling-PDF Survey -survey.description=Stirling-PDF has no tracking so we want to hear from our users to improve Stirling-PDF! -survey.changes=Stirling-PDF has changed since the last survey! To find out more please check our blog post here: -survey.changes2=With these changes we are getting paid business support and funding +survey.nav=Inquérito +survey.title=Inquérito ao Stirling-PDF +survey.description=O Stirling-PDF não tem rastreio, por isso queremos ouvir os nossos utilizadores para melhorar o Stirling-PDF! +survey.changes=O Stirling-PDF mudou desde a última avaliação! Para mais informações, verifique o nosso post no blog aqui: +survey.changes2=Com estas mudanças estamos a obter suporte comercial pago e financiamento survey.please=Please consider taking our survey! -survey.disabled=(Survey popup will be disabled in following updates but available at foot of page) -survey.button=Take Survey -survey.dontShowAgain=Don't show again +survey.disabled=(A caixa de inquérito será desativada nas próximas actualizações mas estará disponível na parte inferior da página) +survey.button=Levar o Inquérito +survey.dontShowAgain=Não mostrar novamente #error -error.sorry=Sorry for the issue! -error.needHelp=Need help / Found an issue? -error.contactTip=If you're still having trouble, don't hesitate to reach out to us for help. You can submit a ticket on our GitHub page or contact us through Discord: -error.404.head=404 - Page Not Found | Oops, we tripped in the code! -error.404.1=We can't seem to find the page you're looking for. -error.404.2=Something went wrong -error.github=Submit a ticket on GitHub -error.showStack=Show Stack Trace -error.copyStack=Copy Stack Trace -error.githubSubmit=GitHub - Submit a ticket -error.discordSubmit=Discord - Submit Support post +error.sorry=Desculpe pelo inconveniente! +error.needHelp=Precisa de ajuda / Encontrou um problema? +error.contactTip=Se ainda estiver a ter problemas, não hesite em entrar em contacto connosco para obter ajuda. Pode submeter um ticket na nossa página do GitHub ou contactar-nos através do Discord: +error.404.head=404 - Página Não Encontrada | Oops, tropeçámos no código! +error.404.1=Não podemos parecer encontrar a página que está a procurar. +error.404.2=Ocorreu um erro +error.github=Submeta um ticket na GitHub +error.showStack=Mostrar Stack Trace +error.copyStack=Copiar Stack Trace +error.githubSubmit=GitHub - Submeter um Ticket +error.discordSubmit=Discord - Submeter um Post de Suporte #remove-image -removeImage.title=Remove image -removeImage.header=Remove image -removeImage.removeImage=Remove image -removeImage.submit=Remove image - - -splitByChapters.title=Split PDF by Chapters -splitByChapters.header=Split PDF by Chapters -splitByChapters.bookmarkLevel=Bookmark Level -splitByChapters.includeMetadata=Include Metadata -splitByChapters.allowDuplicates=Allow Duplicates -splitByChapters.desc.1=This tool splits a PDF file into multiple PDFs based on its chapter structure. -splitByChapters.desc.2=Bookmark Level: Choose the level of bookmarks to use for splitting (0 for top-level, 1 for second-level, etc.). -splitByChapters.desc.3=Include Metadata: If checked, the original PDF's metadata will be included in each split PDF. -splitByChapters.desc.4=Allow Duplicates: If checked, allows multiple bookmarks on the same page to create separate PDFs. -splitByChapters.submit=Split PDF +removeImage.title=Remover imagem +removeImage.header=Remover imagem +removeImage.removeImage=Remover imagem +removeImage.submit=Remover imagem +splitByChapters.title=Dividir o PDF por Capítulos +splitByChapters.header=Dividir o PDF por Capítulos +splitByChapters.bookmarkLevel=Nível de Anotações +splitByChapters.includeMetadata=Incluir Metadados +splitByChapters.allowDuplicates=Permitir Duplicações +splitByChapters.desc.1=Esta ferramenta divide um ficheiro PDF em vários PDFs com base na estrutura dos seus capítulos. +splitByChapters.desc.2=Nível de Anotações: Escolha o nível das anotações a usar para a divisão (0 para topo, 1 para segundo nível, etc.). +splitByChapters.desc.3=Inclua Metadados: Se marcado, os metadados originais do PDF serão incluídos em cada PDF dividido. +splitByChapters.desc.4=Permitir Duplicatas: Se marcado, permite a criação de vários bookmarks na mesma página para criar separadamente vários PDFs. +splitByChapters.submit=Dividir o PDF diff --git a/src/main/resources/messages_ro_RO.properties b/src/main/resources/messages_ro_RO.properties index d7dbffaa7..16e71e354 100644 --- a/src/main/resources/messages_ro_RO.properties +++ b/src/main/resources/messages_ro_RO.properties @@ -79,6 +79,8 @@ info=Informații pro=Pro page=Page pages=Pages +loading=Loading... +addToDoc=Add to Document legal.privacy=Privacy Policy legal.terms=Terms and Conditions @@ -244,6 +246,7 @@ database.fileNullOrEmpty=Fișierul nu trebuie să fie nul sau gol database.failedImportFile=Importul Fișierului a Eșuat session.expired=Your session has expired. Please refresh the page and try again. +session.refreshPage=Refresh Page ############# # HOME-PAGE # @@ -748,6 +751,7 @@ certSign.showSig=Afișează semnătura certSign.reason=Motivul certSign.location=Locația certSign.name=Numele +certSign.showLogo=Show Logo certSign.submit=Semnează PDF @@ -782,6 +786,9 @@ compare.highlightColor.2=Culoare Evidențiere 2: compare.document.1=Documentul 1 compare.document.2=Documentul 2 compare.submit=Compară +compare.complex.message=One or both of the provided documents are large files, accuracy of comparison may be reduced +compare.large.file.message=One or Both of the provided documents are too large to process +compare.no.text.message=One or both of the selected PDFs have no text content. Please choose PDFs with text for comparison. #BookToPDF BookToPDF.title=Cărți și Benzi Desenate în PDF @@ -804,6 +811,11 @@ sign.draw=Desenează Semnătura sign.text=Introdu Textul sign.clear=Curăță sign.add=Adaugă +sign.saved=Saved Signatures +sign.save=Save Signature +sign.personalSigs=Personal Signatures +sign.sharedSigs=Shared Signatures +sign.noSavedSigs=No saved signatures found #repair @@ -921,7 +933,14 @@ pdfOrganiser.placeholder=(ex. 1,3,2 sau 4-8,2,10-12 sau 2n-1) multiTool.title=Instrument PDF multiplu multiTool.header=Instrument PDF multiplu multiTool.uploadPrompts=Nume Fișier - +multiTool.selectAll=Select All +multiTool.deselectAll=Deselect All +multiTool.selectPages=Page Select +multiTool.selectedPages=Selected Pages +multiTool.page=Page +multiTool.deleteSelected=Delete Selected +multiTool.downloadAll=Export +multiTool.downloadSelected=Export Selected #view pdf viewPdf.title=Vizualizează PDF viewPdf.header=Vizualizează PDF @@ -1220,5 +1239,3 @@ splitByChapters.desc.2=Bookmark Level: Choose the level of bookmarks to use for splitByChapters.desc.3=Include Metadata: If checked, the original PDF's metadata will be included in each split PDF. splitByChapters.desc.4=Allow Duplicates: If checked, allows multiple bookmarks on the same page to create separate PDFs. splitByChapters.submit=Split PDF - - diff --git a/src/main/resources/messages_ru_RU.properties b/src/main/resources/messages_ru_RU.properties index d72c6feae..b5068ea7c 100644 --- a/src/main/resources/messages_ru_RU.properties +++ b/src/main/resources/messages_ru_RU.properties @@ -3,8 +3,8 @@ ########### # the direction that the language is written (ltr = left to right, rtl = right to left) language.direction=ltr -addPageNumbers.fontSize=Font Size -addPageNumbers.fontName=Font Name +addPageNumbers.fontSize=Размер шрифта +addPageNumbers.fontName=Название шрифта pdfPrompt=Выберите PDF(ы) multiPdfPrompt=Выберите PDFы (2+) multiPdfDropPrompt=Выберите (или перетащите) все необходимые PDFы @@ -47,7 +47,7 @@ green=Зеленый blue=Синий custom=Обычай... WorkInProgess=Работа продолжается, может не работать или глючить, пожалуйста, сообщайте о любых проблемах! -poweredBy=Powered by +poweredBy=Поддерживается... yes=Да no=Нет changedCredsMessage=Учетные данные изменены! @@ -56,15 +56,15 @@ userNotFoundMessage=Пользователь не найден. incorrectPasswordMessage=Текущий пароль неверен. usernameExistsMessage=Новое имя пользователя уже существует. invalidUsernameMessage=Неверное имя пользователя. Имя пользователя может содержать только буквы, цифры и следующие специальные символы @._+- или должно быть действительным адресом электронной почты. -invalidPasswordMessage=The password must not be empty and must not have spaces at the beginning or end. -confirmPasswordErrorMessage=New Password and Confirm New Password must match. +invalidPasswordMessage=Пароль не должен быть пустым и не должен содержать пробелов в начале или конце. +confirmPasswordErrorMessage=Новый пароль и подтверждение нового пароля должны совпадать. deleteCurrentUserMessage=Невозможно удалить пользователя, вошедшего в систему. deleteUsernameExistsMessage=Имя пользователя не существует и не может быть удалено. downgradeCurrentUserMessage=Невозможно понизить роль текущего пользователя -disabledCurrentUserMessage=The current user cannot be disabled +disabledCurrentUserMessage=Текущий пользователь не может быть отключен downgradeCurrentUserLongMessage=Невозможно понизить роль текущего пользователя. Следовательно, текущий пользователь не будет отображаться. -userAlreadyExistsOAuthMessage=The user already exists as an OAuth2 user. -userAlreadyExistsWebMessage=The user already exists as an web user. +userAlreadyExistsOAuthMessage=Пользователь уже существует как OAuth2 пользователь. +userAlreadyExistsWebMessage=Пользователь уже существует как веб-пользователь. error=Ошибка oops=Ой! help=Помощь @@ -75,16 +75,18 @@ visitGithub=Посетить репозиторий на GitHub donate=Пожертвовать color=Цвет sponsor=Спонсор -info=Info -pro=Pro -page=Page -pages=Pages +info=Информация +pro=Про +page=Страница +pages=Страницы +loading=Загрузка... +addToDoc=Добавить в документ -legal.privacy=Privacy Policy -legal.terms=Terms and Conditions -legal.accessibility=Accessibility -legal.cookie=Cookie Policy -legal.impressum=Impressum +legal.privacy=Политика конфиденциальности +legal.terms=Условия использования +legal.accessibility=Доступность +legal.cookie=Политика кукисов +legal.impressum=Организация ############### # Pipeline # @@ -96,7 +98,7 @@ pipeline.defaultOption=Пользовательский pipeline.submitButton=Отправить pipeline.help=Справка по конвейерной обработке pipeline.scanHelp=Справка по сканированию папок -pipeline.deletePrompt=Are you sure you want to delete pipeline +pipeline.deletePrompt=Вы уверены, что хотите удалить пайплайн ###################### # Pipeline Options # @@ -114,45 +116,45 @@ pipelineOptions.validateButton=Проверить ######################## # ENTERPRISE EDITION # ######################## -enterpriseEdition.button=Upgrade to Pro -enterpriseEdition.warning=This feature is only available to Pro users. -enterpriseEdition.yamlAdvert=Stirling PDF Pro supports YAML configuration files and other SSO features. -enterpriseEdition.ssoAdvert=Looking for more user management features? Check out Stirling PDF Pro +enterpriseEdition.button=Переход к Pro +enterpriseEdition.warning=Этот функционал доступен только пользователям Pro. +enterpriseEdition.yamlAdvert=Stirling PDF Pro поддерживает файлы конфигурации YAML и другие функции единой системы аутентификации (SSO). +enterpriseEdition.ssoAdvert=Ищете больше возможностей управления пользователями? Проверьте Stirling PDF Pro ################# # Analytics # ################# -analytics.title=Do you want make Stirling PDF better? -analytics.paragraph1=Stirling PDF has opt in analytics to help us improve the product. We do not track any personal information or file contents. -analytics.paragraph2=Please consider enabling analytics to help Stirling-PDF grow and to allow us to understand our users better. -analytics.enable=Enable analytics -analytics.disable=Disable analytics -analytics.settings=You can change the settings for analytics in the config/settings.yml file +analytics.title=Хотите улучшить Stirling PDF? +analytics.paragraph1=Stirling PDF использует опциональные данные аналитики для улучшения продукта. Мы не отслеживаем никакую личную информацию или содержимое файлов. +analytics.paragraph2=Пожалуйста, рассмотрите возможность включения аналитики, чтобы помочь Stirling-PDF расти и дать нам возможность лучше понять наших пользователей. +analytics.enable=Включить аналитику +analytics.disable=Отключить аналитику +analytics.settings=Вы можете изменить настройки аналитики в файле config/settings.yml ############# # NAVBAR # ############# -navbar.favorite=Favorites +navbar.favorite=Избранное navbar.darkmode=Темный режим -navbar.language=Languages +navbar.language=Языки navbar.settings=Настройки -navbar.allTools=Tools +navbar.allTools=Конвейеры navbar.multiTool=Multi Tools -navbar.sections.organize=Organize -navbar.sections.convertTo=Convert to PDF -navbar.sections.convertFrom=Convert from PDF -navbar.sections.security=Sign & Security -navbar.sections.advance=Advanced -navbar.sections.edit=View & Edit -navbar.sections.popular=Popular +navbar.sections.organize=Организация +navbar.sections.convertTo=Перевести в PDF +navbar.sections.convertFrom=Перевести из PDF +navbar.sections.security=Подписи и Безопасность +navbar.sections.advance=Продвинутые +navbar.sections.edit=Просмотр и Редактирование +navbar.sections.popular=Популярное ############# # SETTINGS # ############# settings.title=Настройки settings.update=Доступно обновление -settings.updateAvailable={0} is the current installed version. A new version ({1}) is available. +settings.updateAvailable={0} - текущая установленная версия. Доступна новая версия ({1}). settings.appVersion=Версия приложения: settings.downloadOption.title=Выберите вариант загрузки (для загрузки одного файла без zip): settings.downloadOption.1=Открыть в том же окне @@ -161,9 +163,9 @@ settings.downloadOption.3=Загрузить файл settings.zipThreshold=Zip-файлы, когда количество загруженных файлов превышает settings.signOut=Выйти settings.accountSettings=Настройки аккаунта -settings.bored.help=Enables easter egg game -settings.cacheInputs.name=Save form inputs -settings.cacheInputs.help=Enable to store previously used inputs for future runs +settings.bored.help=Включает игру на яйцо +settings.cacheInputs.name=Сохранение введенных данных формы +settings.cacheInputs.help=Включить для хранения ранее использованных значений для будущих запусков changeCreds.title=Изменить учетные данные changeCreds.header=Обновите данные вашей учетной записи @@ -202,9 +204,9 @@ adminUserSettings.header=Настройки контроля пользоват adminUserSettings.admin=Администратор adminUserSettings.user=Пользователь adminUserSettings.addUser=Добавить нового пользователя -adminUserSettings.deleteUser=Delete User -adminUserSettings.confirmDeleteUser=Should the user be deleted? -adminUserSettings.confirmChangeUserStatus=Should the user be disabled/enabled? +adminUserSettings.deleteUser=Удалить пользователя +adminUserSettings.confirmDeleteUser=Должен быть удален этот пользователь? +adminUserSettings.confirmChangeUserStatus=Должен быть отключен/включен этот пользователь? adminUserSettings.usernameInfo=Имя пользователя может содержать только буквы, цифры и следующие специальные символы @._+- или должно быть действительным адресом электронной почты. adminUserSettings.roles=Роли adminUserSettings.role=Роль @@ -217,33 +219,34 @@ adminUserSettings.internalApiUser=Внутренний пользователь adminUserSettings.forceChange=Просить пользователя изменить пароль при входе в систему adminUserSettings.submit=Сохранить пользователя adminUserSettings.changeUserRole=Изменить роль пользователя -adminUserSettings.authenticated=Authenticated -adminUserSettings.editOwnProfil=Edit own profile -adminUserSettings.enabledUser=enabled user -adminUserSettings.disabledUser=disabled user -adminUserSettings.activeUsers=Active Users: -adminUserSettings.disabledUsers=Disabled Users: -adminUserSettings.totalUsers=Total Users: -adminUserSettings.lastRequest=Last Request +adminUserSettings.authenticated=Авторизованный +adminUserSettings.editOwnProfil=Изменить свой профиль +adminUserSettings.enabledUser=активный пользователь +adminUserSettings.disabledUser=отключенный пользователь +adminUserSettings.activeUsers=Активные пользователи: +adminUserSettings.disabledUsers=Отключенные пользователи: +adminUserSettings.totalUsers=Общее количество пользователей: +adminUserSettings.lastRequest=Последний запрос -database.title=Database Import/Export -database.header=Database Import/Export -database.fileName=File Name -database.creationDate=Creation Date -database.fileSize=File Size -database.deleteBackupFile=Delete Backup File -database.importBackupFile=Import Backup File -database.downloadBackupFile=Download Backup File -database.info_1=When importing data, it is crucial to ensure the correct structure. If you are unsure of what you are doing, seek advice and support from a professional. An error in the structure can cause application malfunctions, up to and including the complete inability to run the application. -database.info_2=The file name does not matter when uploading. It will be renamed afterward to follow the format backup_user_yyyyMMddHHmm.sql, ensuring a consistent naming convention. -database.submit=Import Backup -database.importIntoDatabaseSuccessed=Import into database successed +database.title=Импорт/экспорт базы данных +database.header=Импорт/экспорт базы данных +database.fileName=Название файла +database.creationDate=Дата создания +database.fileSize=Размер файла +database.deleteBackupFile=Удалить резервную копию файла +database.importBackupFile=Импортировать резервную копию файла +database.downloadBackupFile=Скачать резервную копию файла +database.info_1=При импорте данных важно убедиться в правильной структуре. Если вы не уверены, что делаете, обратитесь за профессиональной помощью и поддержкой. Ошибка в структуре может привести к сбоям приложений, вплоть до полного их отказа от работы. +database.info_2=Имя файла не имеет значения при загрузке. Оно будет переименовано позже в формат backup_user_yyyyMMddHHmm.sql для обеспечения единообразия названий. +database.submit=Импортировать резервную копию +database.importIntoDatabaseSuccessed=Импорт в базу данных выполнен успешно database.fileNotFound=File not Found -database.fileNullOrEmpty=File must not be null or empty +database.fileNullOrEmpty=Файл не должен быть пустым или NULL database.failedImportFile=Failed Import File -session.expired=Your session has expired. Please refresh the page and try again. +session.expired=Ваша сессия истекла. Пожалуйста, обновите страницу и попробуйте снова. +session.refreshPage=Refresh Page ############# # HOME-PAGE # @@ -254,7 +257,7 @@ home.searchBar=Поиск функций... home.viewPdf.title=Просмотр PDF home.viewPdf.desc=Просмотр, аннотация, добавление текста или изображений -viewPdf.tags=view,read,annotate,text,image +viewPdf.tags=просмотр, чтение, аннотирование, текст, изображение home.multiTool.title=Мультиинструмент PDF home.multiTool.desc=Объединение, поворот, изменение порядка и удаление страниц @@ -262,15 +265,15 @@ multiTool.tags=Multi Tool,Multi operation,UI,click drag,front end,client side home.merge.title=Объединить home.merge.desc=Легко объединяйте несколько PDF-файлов в один. -merge.tags=merge,Page operations,Back end,server side +merge.tags=слияние, операции со страницами, backend, серверная сторона home.split.title=Разделить home.split.desc=Разделить PDF-файлы на несколько документов -split.tags=Page operations,divide,Multi Page,cut,server side +split.tags=операции со страницами, разделение, многостраничный, вырезание, серверная сторона home.rotate.title=Повернуть home.rotate.desc=Легко поворачивайте свои PDF-файлы. -rotate.tags=server side +rotate.tags=серверная сторона home.imageToPdf.title=Изображение в PDF @@ -283,7 +286,7 @@ pdfToImage.tags=conversion,img,jpg,picture,photo home.pdfOrganiser.title=Реорганизация home.pdfOrganiser.desc=Удалить/переставить страницы в любом порядке -pdfOrganiser.tags=duplex,even,odd,sort,move +pdfOrganiser.tags=дуплексный режим, чётные страницы, нечётные страницы, сортировка, перемещение home.addImage.title=Добавить изображение @@ -292,33 +295,33 @@ addImage.tags=img,jpg,picture,photo home.watermark.title=Добавить водяной знак home.watermark.desc=Добавьте собственный водяной знак в документ PDF. -watermark.tags=Text,repeating,label,own,copyright,trademark,img,jpg,picture,photo +watermark.tags=текст, повторяющийся, метка, собственное право, товарный знак, img, jpg, picture, фото home.permissions.title=Изменить разрешения home.permissions.desc=Измените разрешения вашего PDF-документа -permissions.tags=read,write,edit,print +permissions.tags=просмотр, запись, редактирование, печать home.removePages.title=Удаление home.removePages.desc=Удалите ненужные страницы из документа PDF. -removePages.tags=Remove pages,delete pages +removePages.tags=Удалить страницы,удаление страниц home.addPassword.title=Добавить пароль home.addPassword.desc=Зашифруйте PDF-документ паролем. -addPassword.tags=secure,security +addPassword.tags=безопасность,защита home.removePassword.title=Удалить пароль home.removePassword.desc=Снимите защиту паролем с вашего PDF-документа. -removePassword.tags=secure,Decrypt,security,unpassword,delete password +removePassword.tags=безопасность,дешифровать,удаление пароля home.compressPdfs.title=Сжать home.compressPdfs.desc=Сжимайте PDF-файлы, чтобы уменьшить их размер. -compressPdfs.tags=squish,small,tiny +compressPdfs.tags=сжатие,компрессия,узкое home.changeMetadata.title=Изменить метаданные home.changeMetadata.desc=Изменить/удалить/добавить метаданные из документа PDF -changeMetadata.tags=Title,author,date,creation,time,publisher,producer,stats +changeMetadata.tags=заголовок,автор,дата,время создания,время,издатель,производитель,статистика home.fileToPDF.title=Конвертировать файл в PDF home.fileToPDF.desc=Конвертируйте практически любой файл в PDF (DOCX, PNG, XLS, PPT, TXT и другие) @@ -326,12 +329,12 @@ fileToPDF.tags=transformation,format,document,picture,slide,text,conversion,offi home.ocr.title=OCR / Очистка сканирования home.ocr.desc=Очистка сканирования и обнаружение текста на изображениях в PDF-файле и повторно добавляет его как текст. -ocr.tags=recognition,text,image,scan,read,identify,detection,editable +ocr.tags=распознавание,текст,изображение,сканирование,читаемость,идентификация, detektsiya,редактируемое home.extractImages.title=Извлечь изображения home.extractImages.desc=Извлекает все изображения из PDF и сохраняет их в zip -extractImages.tags=picture,photo,save,archive,zip,capture,grab +extractImages.tags=картинка,фото,сохранение,архивация,zip,захват,вытаскивание home.pdfToPDFA.title=PDF в PDF/A home.pdfToPDFA.desc=Преобразование PDF в PDF/A для длительного хранения @@ -356,55 +359,55 @@ PDFToHTML.tags=web content,browser friendly home.PDFToXML.title=PDF в XML home.PDFToXML.desc=Преобразование PDF в формат XML -PDFToXML.tags=data-extraction,structured-content,interop,transformation,convert +PDFToXML.tags=extraksi data,структурированный контент,interop,преобразование,конвертация home.ScannerImageSplit.title=Обнаружение/разделение отсканированных фотографий home.ScannerImageSplit.desc=Разделяет несколько фотографий из фото/PDF -ScannerImageSplit.tags=separate,auto-detect,scans,multi-photo,organize +ScannerImageSplit.tags=разделение,автоматическое обнаружение,сканы,многофотографии,организация home.sign.title=Подпись home.sign.desc=Добавляет подпись в PDF с помощью рисунка, текста или изображения -sign.tags=authorize,initials,drawn-signature,text-sign,image-signature +sign.tags=авторизация,широкополье,подпись,текстовая подпись,изображенная подпись home.flatten.title=Сглаживание home.flatten.desc=Удалить все интерактивные элементы и формы из PDF -flatten.tags=static,deactivate,non-interactive,streamline +flatten.tags=статичная,деактивировать,непривязанное к интерактиву,простота home.repair.title=Ремонт home.repair.desc=Пытается восстановить поврежденный/сломанный PDF -repair.tags=fix,restore,correction,recover +repair.tags=исправление,восстановление,корректировка,восстановление home.removeBlanks.title=Удалить пустые страницы home.removeBlanks.desc=Обнаруживает и удаляет пустые страницы из документа -removeBlanks.tags=cleanup,streamline,non-content,organize +removeBlanks.tags=очистка,простота,без содержания,организация -home.removeAnnotations.title=Remove Annotations -home.removeAnnotations.desc=Removes all comments/annotations from a PDF -removeAnnotations.tags=comments,highlight,notes,markup,remove +home.removeAnnotations.title=Удалить аннотации +home.removeAnnotations.desc=Удаляет все комментарии/аннотации из PDF +removeAnnotations.tags=комментарии, выделение, заметки, обозначения, удаление home.compare.title=Сравнение home.compare.desc=Сравнивает и показывает различия между двумя PDF-документами -compare.tags=differentiate,contrast,changes,analysis +compare.tags=дифференцировать, контрастировать, изменения, анализ home.certSign.title=Подписать сертификатом home.certSign.desc=Подписать PDF сертификатом/ключом (PEM/P12) -certSign.tags=authenticate,PEM,P12,official,encrypt +certSign.tags=авторизация, PEM, P12, официальное, шифрование home.removeCertSign.title=Remove Certificate Sign -home.removeCertSign.desc=Remove certificate signature from PDF -removeCertSign.tags=authenticate,PEM,P12,official,decrypt +home.removeCertSign.desc=Удаляет цифровую подпись из PDF +removeCertSign.tags=авторизация, PEM, P12, официальное, дешифрование home.pageLayout.title=Объединить страницы home.pageLayout.desc=Объединение нескольких страниц документа PDF в одну страницу -pageLayout.tags=merge,composite,single-view,organize +pageLayout.tags=слияние, составление, просмотр, организация home.scalePages.title=Изменить размер/масштаб страницы home.scalePages.desc=Изменить размер/масштаб страницы и/или ее содержимого. -scalePages.tags=resize,modify,dimension,adapt +scalePages.tags=изменение размера, редактирование, размеры, адаптация home.pipeline.title=Конвейер (расширенный) home.pipeline.desc=Выполняйте несколько действий с PDF-файлами, определяя конвейерные сценарии. -pipeline.tags=automate,sequence,scripted,batch-process +pipeline.tags=автоматизация, последовательность, скриптовый процесс, линейный обработчик home.add-page-numbers.title=Добавить номера страниц home.add-page-numbers.desc=Добавляйте номера страниц по всему документу в заданном месте @@ -412,51 +415,51 @@ add-page-numbers.tags=paginate,label,organize,index home.auto-rename.title=Автоматическое переименование PDF-файла home.auto-rename.desc=Автоматическое переименование файла PDF на основе его обнаруженного заголовка -auto-rename.tags=auto-detect,header-based,organize,relabel +auto-rename.tags=автоматическое определение, основанные на заголовках, организация, переименование home.adjust-contrast.title=Настройка цветов/контрастности home.adjust-contrast.desc=Настройка контрастность, насыщенность и яркость PDF-файла -adjust-contrast.tags=color-correction,tune,modify,enhance +adjust-contrast.tags=коррекция цвета, настройка, редактирование, улучшение home.crop.title=Обрезать PDF-файл home.crop.desc=Обрезать PDF-файл, чтобы уменьшить его размер (текст сохраняется!) -crop.tags=trim,shrink,edit,shape +crop.tags=обрезать, сократить, редактировать, форму home.autoSplitPDF.title=Автоматическое разделение страниц home.autoSplitPDF.desc=Автоматическое разделение отсканированного PDF-файла с помощью физического разделителя отсканированных страниц QR-кода -autoSplitPDF.tags=QR-based,separate,scan-segment,organize +autoSplitPDF.tags=QR-коды, разделение, сканирование, обработка home.sanitizePdf.title=Дезинфицировать home.sanitizePdf.desc=Удаление скриптов и других элементов из PDF-файлов -sanitizePdf.tags=clean,secure,safe,remove-threats +sanitizePdf.tags=очистка, безопасность, безопасный, удаление угроз home.URLToPDF.title=URL/сайт в PDF home.URLToPDF.desc=Конвертирует любой http(s)URL в PDF -URLToPDF.tags=web-capture,save-page,web-to-doc,archive +URLToPDF.tags=веб-съёмка, сохранение страницы, веб к документу, архивация home.HTMLToPDF.title=HTML в PDF home.HTMLToPDF.desc=Конвертирует любой HTML-файл или zip-файл в PDF. -HTMLToPDF.tags=markup,web-content,transformation,convert +HTMLToPDF.tags=макетирование, веб-контент, трансформация, конвертация home.MarkdownToPDF.title=Markdown в PDF home.MarkdownToPDF.desc=Конвертирует любой файл Markdown в PDF -MarkdownToPDF.tags=markup,web-content,transformation,convert +MarkdownToPDF.tags=макетирование, веб-контент, трансформация, конвертация home.getPdfInfo.title=Получите ВСЮ информацию в формате PDF home.getPdfInfo.desc=Собирает любую возможную информацию в PDF-файлах. -getPdfInfo.tags=infomation,data,stats,statistics +getPdfInfo.tags=информация, данные, статистика, статистика home.extractPage.title=Извлечь страницу(ы) home.extractPage.desc=Извлекает выбранные страницы из PDF -extractPage.tags=extract +extractPage.tags=вытащить home.PdfToSinglePage.title=PDF в одну большую страницу home.PdfToSinglePage.desc=Объединяет все страницы PDF в одну большую страницу. -PdfToSinglePage.tags=single page +PdfToSinglePage.tags=одна страница home.showJS.title=Показать Javascript @@ -465,29 +468,29 @@ showJS.tags=JS home.autoRedact.title=Автоматическое редактирование home.autoRedact.desc=Автоматическое затемнение (чернение) текста в PDF на основе входного текста -autoRedact.tags=Redact,Hide,black out,black,marker,hidden +autoRedact.tags=Скрыть, Закрыть, закрасить, блокировать, маркер, скрыто home.tableExtraxt.title=PDF в CSV home.tableExtraxt.desc=Извлекает таблицы из PDF и преобразует их в CSV -tableExtraxt.tags=CSV,Table Extraction,extract,convert +tableExtraxt.tags=CSV, извлечение таблицы, вытащить, конвертировать home.autoSizeSplitPDF.title=Автоматическое разделение по размеру/количеству home.autoSizeSplitPDF.desc=Разделяет один PDF на несколько документов на основе размера, количества страниц или количества документов -autoSizeSplitPDF.tags=pdf,split,document,organization +autoSizeSplitPDF.tags=pdf, разделение, документ, организация home.overlay-pdfs.title=Наложение PDF home.overlay-pdfs.desc=Наложение одного PDF поверх другого PDF -overlay-pdfs.tags=Overlay +overlay-pdfs.tags=Перекрытие home.split-by-sections.title=Разделение PDF по секциям home.split-by-sections.desc=Разделение каждой страницы PDF на более мелкие горизонтальные и вертикальные секции -split-by-sections.tags=Section Split, Divide, Customize +split-by-sections.tags=Разделение на разделы, Разделить, Настроить home.AddStampRequest.title=Добавить печать на PDF home.AddStampRequest.desc=Добавление текстовой или изображенческой печати в заданные места -AddStampRequest.tags=Stamp, Add image, center image, Watermark, PDF, Embed, Customize +AddStampRequest.tags=Штамп, добавить изображение, центрировать изображение, Водяной знак, PDF, вставить, Настроить home.PDFToBook.title=PDF в книгу/комикс @@ -498,33 +501,33 @@ home.BookToPDF.title=Книга в PDF home.BookToPDF.desc=Конвертирует форматы книги/комикса в PDF с помощью calibre BookToPDF.tags=Book,Comic,Calibre,Convert,manga,amazon,kindle -home.removeImagePdf.title=Remove image -home.removeImagePdf.desc=Remove image from PDF to reduce file size -removeImagePdf.tags=Remove Image,Page operations,Back end,server side +home.removeImagePdf.title=Удалить изображение +home.removeImagePdf.desc=Удалите изображение из PDF для сокращения размера файла +removeImagePdf.tags=Удалить изображение, операции со страницами, Back end, серверная сторона -home.splitPdfByChapters.title=Split PDF by Chapters -home.splitPdfByChapters.desc=Split a PDF into multiple files based on its chapter structure. -splitPdfByChapters.tags=split,chapters,bookmarks,organize +home.splitPdfByChapters.title=Разделить PDF по разделам +home.splitPdfByChapters.desc=Разделите PDF на несколько файлов на основе структуры его разделов +splitPdfByChapters.tags=разделение, разделы, закладки, организация #replace-invert-color replace-color.title=Replace-Invert-Color -replace-color.header=Replace-Invert Color PDF +replace-color.header=Заменить-Обратное изменение цвета PDF home.replaceColorPdf.title=Replace and Invert Color -home.replaceColorPdf.desc=Replace color for text and background in PDF and invert full color of pdf to reduce file size -replaceColorPdf.tags=Replace Color,Page operations,Back end,server side -replace-color.selectText.1=Replace or Invert color Options -replace-color.selectText.2=Default(Default high contrast colors) -replace-color.selectText.3=Custom(Customized colors) -replace-color.selectText.4=Full-Invert(Invert all colors) -replace-color.selectText.5=High contrast color options -replace-color.selectText.6=white text on black background -replace-color.selectText.7=Black text on white background -replace-color.selectText.8=Yellow text on black background -replace-color.selectText.9=Green text on black background -replace-color.selectText.10=Choose text Color -replace-color.selectText.11=Choose background Color -replace-color.submit=Replace +home.replaceColorPdf.desc=Замените цвет текста и фона в PDF и инвертируйте весь цвет PDF для сокращения размера файла +replaceColorPdf.tags=Заменить цвет, операции со страницами, Back end, серверная сторона +replace-color.selectText.1=Опции замены или обратного изменения цвета +replace-color.selectText.2=По умолчанию (высокий контрастный цвет) +replace-color.selectText.3=Пользовательский выбор (персонализированные цвета) +replace-color.selectText.4=Цветная инверсия (инвертировать все цвета) +replace-color.selectText.5=Высококонтрастные цвета +replace-color.selectText.6=белый текст на черном фоне +replace-color.selectText.7=черный текст на белом фоне +replace-color.selectText.8=желтый текст на черном фоне +replace-color.selectText.9=зеленый текст на черном фоне +replace-color.selectText.10=Выбрать цвет текста +replace-color.selectText.11=Выбрать цвет фона +replace-color.submit=Заменить @@ -543,17 +546,17 @@ login.locked=Ваша учетная запись заблокирована. login.signinTitle=Пожалуйста, войдите login.ssoSignIn=Вход через единый вход login.oauth2AutoCreateDisabled=OAUTH2 Автоматическое создание пользователя отключено -login.oauth2AdminBlockedUser=Registration or logging in of non-registered users is currently blocked. Please contact the administrator. -login.oauth2RequestNotFound=Authorization request not found -login.oauth2InvalidUserInfoResponse=Invalid User Info Response -login.oauth2invalidRequest=Invalid Request -login.oauth2AccessDenied=Access Denied -login.oauth2InvalidTokenResponse=Invalid Token Response -login.oauth2InvalidIdToken=Invalid Id Token -login.userIsDisabled=User is deactivated, login is currently blocked with this username. Please contact the administrator. -login.alreadyLoggedIn=You are already logged in to -login.alreadyLoggedIn2=devices. Please log out of the devices and try again. -login.toManySessions=You have too many active sessions +login.oauth2AdminBlockedUser=Регистрация или вход нерегистрированных пользователей временно заблокированы. Пожалуйста, обратитесь к администратору. +login.oauth2RequestNotFound=Запрос на авторизацию не найден +login.oauth2InvalidUserInfoResponse=Недействительный ответ с информацией о пользователе +login.oauth2invalidRequest=Неверный запрос +login.oauth2AccessDenied=Доступ запрещен +login.oauth2InvalidTokenResponse=Недействительный ответ токена +login.oauth2InvalidIdToken=Недействительный идентификационный токен +login.userIsDisabled=Пользователь деактивирован, вход с данным именем пользователя заблокирован. Пожалуйста, обратитесь к администратору. +login.alreadyLoggedIn=Вы уже вошли в +login.alreadyLoggedIn2=устройства. Выполните выход из устройств и попробуйте снова. +login.toManySessions=У вас слишком много активных сессий #auto-redact autoRedact.title=Автоматическое редактирование @@ -728,7 +731,7 @@ pageLayout.submit=Отправить scalePages.title=Отрегулировать масштаб страницы scalePages.header=Отрегулировать масштаб страницы scalePages.pageSize=Размер страницы документа. -scalePages.keepPageSize=Original Size +scalePages.keepPageSize=Исходный размер scalePages.scaleFactor=Уровень масштабирования (обрезки) страницы. scalePages.submit=Отправить @@ -748,14 +751,15 @@ certSign.showSig=Показать подпись certSign.reason=Причина certSign.location=Местоположение certSign.name=Имя +certSign.showLogo=Показать логотип certSign.submit=Подписать PDF #removeCertSign -removeCertSign.title=Remove Certificate Signature -removeCertSign.header=Remove the digital certificate from the PDF -removeCertSign.selectPDF=Select a PDF file: -removeCertSign.submit=Remove Signature +removeCertSign.title=Удалить цифровую подпись сертификата +removeCertSign.header=Удалите цифровой сертификат из PDF +removeCertSign.selectPDF=Выберите файл PDF: +removeCertSign.submit=Удалить подпись #removeBlanks @@ -777,11 +781,14 @@ removeAnnotations.submit=Удалить #compare compare.title=Сравнение compare.header=Сравнение PDFы -compare.highlightColor.1=Highlight Color 1: -compare.highlightColor.2=Highlight Color 2: +compare.highlightColor.1=Цвет подсветки 1: +compare.highlightColor.2=Цвет подсветки 2: compare.document.1=Документ 1 compare.document.2=Документ 2 compare.submit=Сравнить +compare.complex.message=Один или оба предоставленных документа являются большими файлами, что может снизить точность сравнения +compare.large.file.message=Один или оба предоставленных документа слишком большие для обработки +compare.no.text.message=Выбранные PDF файлы не содержат текстовую информацию. Пожалуйста, выберите PDF файлы с текстом для сравнения. #BookToPDF BookToPDF.title=Книги и комиксы в PDF @@ -804,6 +811,11 @@ sign.draw=Нарисовать подпись sign.text=Ввод текста sign.clear=Очистить sign.add=Добавить +sign.saved=Сохраненные подписи +sign.save=Сохранить подпись +sign.personalSigs=Личные подписи +sign.sharedSigs=Общие подписи +sign.noSavedSigs=Найдено ни одной сохраненной подписи #repair @@ -815,7 +827,7 @@ repair.submit=Ремонт #flatten flatten.title=Сглаживание flatten.header=Сглаживание PDF ов -flatten.flattenOnlyForms=Flatten only forms +flatten.flattenOnlyForms=Плоское представление только форм flatten.submit=Сгладить @@ -830,7 +842,7 @@ ScannerImageSplit.selectText.7=Минимальная площадь конту ScannerImageSplit.selectText.8=Устанавливает минимальный порог области контура для фотографии ScannerImageSplit.selectText.9=Размер границы: ScannerImageSplit.selectText.10=Устанавливает размер добавляемой и удаляемой границы, чтобы предотвратить появление белых границ на выходе (по умолчанию: 1). -ScannerImageSplit.info=Python is not installed. It is required to run. +ScannerImageSplit.info=Установка Python необходима для выполнения. #OCR @@ -857,7 +869,7 @@ ocr.submit=Обработка PDF с OCR extractImages.title=Извлечь изображения extractImages.header=Извлечь изображения extractImages.selectText=Выберите формат изображения для преобразования извлеченных изображений в -extractImages.allowDuplicates=Save duplicate images +extractImages.allowDuplicates=Сохранить дублирующиеся изображения extractImages.submit=Извлечь @@ -865,7 +877,7 @@ extractImages.submit=Извлечь fileToPDF.title=Файл в PDF fileToPDF.header=Конвертировать любой файл в PDF fileToPDF.credit=Этот сервис использует LibreOffice и Unoconv для преобразования файлов. -fileToPDF.supportedFileTypesInfo=Supported File types +fileToPDF.supportedFileTypesInfo=Поддерживаемые файловые типы fileToPDF.supportedFileTypes=Поддерживаемые типы файлов должны включать приведенные ниже, однако полный обновленный список поддерживаемых форматов см. в документации LibreOffice. fileToPDF.submit=Преобразовать в PDF @@ -895,7 +907,7 @@ merge.title=Объединить merge.header=Объединение нескольких PDF-файлов (2+) merge.sortByName=Сортировка по имени merge.sortByDate=Сортировка по дате -merge.removeCertSign=Remove digital signature in the merged file? +merge.removeCertSign=Удалить цифровую подпись в объединенном файле? merge.submit=Объединить @@ -913,15 +925,22 @@ pdfOrganiser.mode.6=Разделение на чётные и нечётные pdfOrganiser.mode.7=Удалить первую pdfOrganiser.mode.8=Удалить последнюю pdfOrganiser.mode.9=Удалить первую и последнюю -pdfOrganiser.mode.10=Odd-Even Merge +pdfOrganiser.mode.10=Нечетное-четное объединение pdfOrganiser.placeholder=(например, 1,3,2 или 4-8,2,10-12 или 2n-1) #multiTool multiTool.title=Мультиинструмент PDF multiTool.header=Мультиинструмент PDF -multiTool.uploadPrompts=File Name - +multiTool.uploadPrompts=Имя файла +multiTool.selectAll=Select All +multiTool.deselectAll=Deselect All +multiTool.selectPages=Page Select +multiTool.selectedPages=Selected Pages +multiTool.page=Page +multiTool.deleteSelected=Delete Selected +multiTool.downloadAll=Export +multiTool.downloadSelected=Export Selected #view pdf viewPdf.title=Просмотреть PDF viewPdf.header=Просмотреть PDF @@ -982,7 +1001,7 @@ pdfToImage.color=Цвет pdfToImage.grey=Оттенки серого pdfToImage.blackwhite=Черно-белый (может потерять данные!) pdfToImage.submit=Конвертировать -pdfToImage.info=Python is not installed. Required for WebP conversion. +pdfToImage.info=Питон не установлен. Необходим для конвертации в WebP. #addPassword @@ -1019,7 +1038,7 @@ watermark.selectText.6=heightSpacer (пробел между каждым вод watermark.selectText.7=Непрозрачность (0% - 100%): watermark.selectText.8=Тип водяного знака: watermark.selectText.9=Изображение водяного знака: -watermark.selectText.10=Convert PDF to PDF-Image +watermark.selectText.10=Конвертировать PDF в PDF-изображение watermark.submit=Добавить водяной знак watermark.type.1=Текст watermark.type.2=Изображение @@ -1063,7 +1082,7 @@ changeMetadata.keywords=Ключевые слова: changeMetadata.modDate=Дата изменения (yyyy/MM/dd HH:mm:ss): changeMetadata.producer=Изготовитель: changeMetadata.subject=Тема: -changeMetadata.trapped=Trapped: +changeMetadata.trapped=Закреплено: changeMetadata.selectText.4=Другие метаданные: changeMetadata.selectText.5=Добавить пользовательскую запись метаданных changeMetadata.submit=Изменить @@ -1074,9 +1093,9 @@ pdfToPDFA.title=PDF в PDF/A pdfToPDFA.header=PDF в PDF/A pdfToPDFA.credit=Этот сервис использует ghostscript для преобразования PDF/A pdfToPDFA.submit=Конвертировать -pdfToPDFA.tip=Currently does not work for multiple inputs at once -pdfToPDFA.outputFormat=Output format -pdfToPDFA.pdfWithDigitalSignature=The PDF contains a digital signature. This will be removed in the next step. +pdfToPDFA.tip=В настоящее время не поддерживается при нескольких входных данных одновременно +pdfToPDFA.outputFormat=Формат вывода +pdfToPDFA.pdfWithDigitalSignature=Этот PDF содержит цифровую подпись. Она будет удалена в следующем шаге. #PDFToWord @@ -1162,11 +1181,11 @@ split-by-sections.merge=Объединить в один PDF #printFile -printFile.title=Print File -printFile.header=Print File to Printer -printFile.selectText.1=Select File to Print -printFile.selectText.2=Enter Printer Name -printFile.submit=Print +printFile.title=Печать файла +printFile.header=Печать файла на принтер +printFile.selectText.1=Выберите файл для печати +printFile.selectText.2=Введите имя принтера +printFile.submit=Печать #licenses @@ -1178,15 +1197,15 @@ licenses.version=Версия licenses.license=Лицензия #survey -survey.nav=Survey -survey.title=Stirling-PDF Survey -survey.description=Stirling-PDF has no tracking so we want to hear from our users to improve Stirling-PDF! -survey.changes=Stirling-PDF has changed since the last survey! To find out more please check our blog post here: -survey.changes2=With these changes we are getting paid business support and funding +survey.nav=Опрос +survey.title=Опрос Stirling-PDF +survey.description=Stirling-PDF не имеет трекинга, поэтому мы хотим услышать от пользователей для улучшения Stirling-PDF! +survey.changes=Stirling-PDF изменился с прошлого опроса! Чтобы узнать больше, пожалуйста, проверьте наш пост на блоге здесь: +survey.changes2=С этими изменениями мы получили коммерческую поддержку и финансирование survey.please=Please consider taking our survey! -survey.disabled=(Survey popup will be disabled in following updates but available at foot of page) -survey.button=Take Survey -survey.dontShowAgain=Don't show again +survey.disabled=(Попап опроса будет отключен в следующих обновлениях, но останется доступен внизу страницы) +survey.button=Пройти опрос +survey.dontShowAgain=Не показывать снова #error @@ -1204,21 +1223,19 @@ error.discordSubmit=Discord - Отправить запрос в поддерж #remove-image -removeImage.title=Remove image -removeImage.header=Remove image -removeImage.removeImage=Remove image -removeImage.submit=Remove image - - -splitByChapters.title=Split PDF by Chapters -splitByChapters.header=Split PDF by Chapters -splitByChapters.bookmarkLevel=Bookmark Level -splitByChapters.includeMetadata=Include Metadata -splitByChapters.allowDuplicates=Allow Duplicates -splitByChapters.desc.1=This tool splits a PDF file into multiple PDFs based on its chapter structure. -splitByChapters.desc.2=Bookmark Level: Choose the level of bookmarks to use for splitting (0 for top-level, 1 for second-level, etc.). -splitByChapters.desc.3=Include Metadata: If checked, the original PDF's metadata will be included in each split PDF. -splitByChapters.desc.4=Allow Duplicates: If checked, allows multiple bookmarks on the same page to create separate PDFs. -splitByChapters.submit=Split PDF +removeImage.title=Удалить изображение +removeImage.header=Удалить изображение +removeImage.removeImage=Удалить изображение +removeImage.submit=Удалить +splitByChapters.title=Разделить PDF по главам +splitByChapters.header=Разделить PDF по главам +splitByChapters.bookmarkLevel=Уровень закладки +splitByChapters.includeMetadata=Включить метаданные +splitByChapters.allowDuplicates=Позволять дубликаты +splitByChapters.desc.1=Этот инструмент разбивает файл PDF на несколько PDF-файлов на основе структуры его глав. +splitByChapters.desc.2=Уровень закладки: выберите уровень закладок, который следует использовать для разделения (0 — самый верхний уровень, 1 — второй уровень и т. д.). +splitByChapters.desc.3=Включить метаданные: если эта опция отмечена, метаданные исходного PDF будут включены в каждый разбитый PDF. +splitByChapters.desc.4=Позволять дубликаты: если эта опция отмечена, на одной странице могут быть созданы несколько PDF из-за нескольких одинаковых закладок. +splitByChapters.submit=Разделить PDF diff --git a/src/main/resources/messages_sk_SK.properties b/src/main/resources/messages_sk_SK.properties index 6e1518a35..d36b54d1a 100644 --- a/src/main/resources/messages_sk_SK.properties +++ b/src/main/resources/messages_sk_SK.properties @@ -79,6 +79,8 @@ info=Info pro=Pro page=Page pages=Pages +loading=Loading... +addToDoc=Add to Document legal.privacy=Privacy Policy legal.terms=Terms and Conditions @@ -244,6 +246,7 @@ database.fileNullOrEmpty=File must not be null or empty database.failedImportFile=Failed Import File session.expired=Your session has expired. Please refresh the page and try again. +session.refreshPage=Refresh Page ############# # HOME-PAGE # @@ -748,6 +751,7 @@ certSign.showSig=Zobraziť podpis certSign.reason=Dôvod certSign.location=Miesto certSign.name=Meno +certSign.showLogo=Show Logo certSign.submit=Podpísať PDF @@ -782,6 +786,9 @@ compare.highlightColor.2=Highlight Color 2: compare.document.1=Dokument 1 compare.document.2=Dokument 2 compare.submit=Porovnať +compare.complex.message=One or both of the provided documents are large files, accuracy of comparison may be reduced +compare.large.file.message=One or Both of the provided documents are too large to process +compare.no.text.message=One or both of the selected PDFs have no text content. Please choose PDFs with text for comparison. #BookToPDF BookToPDF.title=Knihy a komiksy do PDF @@ -804,6 +811,11 @@ sign.draw=Kresliť podpis sign.text=Textový vstup sign.clear=Vymazať sign.add=Pridať +sign.saved=Saved Signatures +sign.save=Save Signature +sign.personalSigs=Personal Signatures +sign.sharedSigs=Shared Signatures +sign.noSavedSigs=No saved signatures found #repair @@ -921,7 +933,14 @@ pdfOrganiser.placeholder=(napr. 1,3,2 alebo 4-8,2,10-12 alebo 2n-1) multiTool.title=PDF Multi Nástroj multiTool.header=PDF Multi Nástroj multiTool.uploadPrompts=File Name - +multiTool.selectAll=Select All +multiTool.deselectAll=Deselect All +multiTool.selectPages=Page Select +multiTool.selectedPages=Selected Pages +multiTool.page=Page +multiTool.deleteSelected=Delete Selected +multiTool.downloadAll=Export +multiTool.downloadSelected=Export Selected #view pdf viewPdf.title=Zobraziť PDF viewPdf.header=Zobraziť PDF @@ -1220,5 +1239,3 @@ splitByChapters.desc.2=Bookmark Level: Choose the level of bookmarks to use for splitByChapters.desc.3=Include Metadata: If checked, the original PDF's metadata will be included in each split PDF. splitByChapters.desc.4=Allow Duplicates: If checked, allows multiple bookmarks on the same page to create separate PDFs. splitByChapters.submit=Split PDF - - diff --git a/src/main/resources/messages_sr_LATN_RS.properties b/src/main/resources/messages_sr_LATN_RS.properties index d1e68c51d..5c5d74d52 100644 --- a/src/main/resources/messages_sr_LATN_RS.properties +++ b/src/main/resources/messages_sr_LATN_RS.properties @@ -79,6 +79,8 @@ info=Info pro=Pro page=Page pages=Pages +loading=Loading... +addToDoc=Add to Document legal.privacy=Privacy Policy legal.terms=Terms and Conditions @@ -244,6 +246,7 @@ database.fileNullOrEmpty=File must not be null or empty database.failedImportFile=Failed Import File session.expired=Your session has expired. Please refresh the page and try again. +session.refreshPage=Refresh Page ############# # HOME-PAGE # @@ -748,6 +751,7 @@ certSign.showSig=Prikaži potpis certSign.reason=Razlog certSign.location=Lokacija certSign.name=Ime +certSign.showLogo=Show Logo certSign.submit=Potpiši PDF @@ -782,6 +786,9 @@ compare.highlightColor.2=Highlight Color 2: compare.document.1=Dokument 1 compare.document.2=Dokument 2 compare.submit=Uporedi +compare.complex.message=One or both of the provided documents are large files, accuracy of comparison may be reduced +compare.large.file.message=One or Both of the provided documents are too large to process +compare.no.text.message=One or both of the selected PDFs have no text content. Please choose PDFs with text for comparison. #BookToPDF BookToPDF.title=Books and Comics to PDF @@ -804,6 +811,11 @@ sign.draw=Nacrtaj potpis sign.text=Tekstualni unos sign.clear=Obriši sign.add=Dodaj +sign.saved=Saved Signatures +sign.save=Save Signature +sign.personalSigs=Personal Signatures +sign.sharedSigs=Shared Signatures +sign.noSavedSigs=No saved signatures found #repair @@ -921,7 +933,14 @@ pdfOrganiser.placeholder=(e.g. 1,3,2 or 4-8,2,10-12 or 2n-1) multiTool.title=PDF Multi Alatka multiTool.header=PDF Multi Alatka multiTool.uploadPrompts=File Name - +multiTool.selectAll=Select All +multiTool.deselectAll=Deselect All +multiTool.selectPages=Page Select +multiTool.selectedPages=Selected Pages +multiTool.page=Page +multiTool.deleteSelected=Delete Selected +multiTool.downloadAll=Export +multiTool.downloadSelected=Export Selected #view pdf viewPdf.title=Prikaz viewPdf.header=Prikaz PDF-a @@ -1220,5 +1239,3 @@ splitByChapters.desc.2=Bookmark Level: Choose the level of bookmarks to use for splitByChapters.desc.3=Include Metadata: If checked, the original PDF's metadata will be included in each split PDF. splitByChapters.desc.4=Allow Duplicates: If checked, allows multiple bookmarks on the same page to create separate PDFs. splitByChapters.submit=Split PDF - - diff --git a/src/main/resources/messages_sv_SE.properties b/src/main/resources/messages_sv_SE.properties index d9d8c0728..2b30cf7bf 100644 --- a/src/main/resources/messages_sv_SE.properties +++ b/src/main/resources/messages_sv_SE.properties @@ -31,7 +31,7 @@ font=Teckensnitt selectFillter=-- Välj -- pageNum=Sidnummer sizes.small=Liten -sizes.medium=Medium +sizes.medium=Mellanvärd sizes.large=Stor sizes.x-large=Extra stor error.pdfPassword=PDF-dokumentet är lösenordsskyddat och antingen har lösenordet inte angetts eller är felaktigt @@ -74,17 +74,19 @@ seeDockerHub=Se Docker Hub visitGithub=Besök GitHub-repositoriet donate=Donera color=Färg -sponsor=Sponsor +sponsor=Sponsör info=Info pro=Pro -page=Page -pages=Pages +page=Sidan +pages=Sidor +loading=Laddar... +addToDoc=Lägg till i dokument -legal.privacy=Privacy Policy -legal.terms=Terms and Conditions -legal.accessibility=Accessibility -legal.cookie=Cookie Policy -legal.impressum=Impressum +legal.privacy=Dataprotektionspolicy +legal.terms=Villkor och betingelser +legal.accessibility=Gängeshållbarhet +legal.cookie=Cockiropfer +legal.impressum=Riksdagens utskott för teknikfrihet ############### # Pipeline # @@ -114,21 +116,21 @@ pipelineOptions.validateButton=Validera ######################## # ENTERPRISE EDITION # ######################## -enterpriseEdition.button=Upgrade to Pro -enterpriseEdition.warning=This feature is only available to Pro users. -enterpriseEdition.yamlAdvert=Stirling PDF Pro supports YAML configuration files and other SSO features. -enterpriseEdition.ssoAdvert=Looking for more user management features? Check out Stirling PDF Pro +enterpriseEdition.button=Uppgradera till Pro +enterpriseEdition.warning=Den här funktionen är endast tillgänglig för Pro-användare. +enterpriseEdition.yamlAdvert=Stirling PDF Pro stöder YAML-konfigurationsfiler och andra SSO funktioner. +enterpriseEdition.ssoAdvert=Söker du fler funktioner för användarhantering? Spana in Stirling PDF Pro. ################# # Analytics # ################# -analytics.title=Do you want make Stirling PDF better? -analytics.paragraph1=Stirling PDF has opt in analytics to help us improve the product. We do not track any personal information or file contents. -analytics.paragraph2=Please consider enabling analytics to help Stirling-PDF grow and to allow us to understand our users better. -analytics.enable=Enable analytics -analytics.disable=Disable analytics -analytics.settings=You can change the settings for analytics in the config/settings.yml file +analytics.title=Vill du göra Stirling PDF bättre? +analytics.paragraph1=Stirling PDF har inaktiverad analys för att hjälpa oss förbättra produkten. Vi spårar ingen personlig information eller filinnehåll. +analytics.paragraph2=Var god aktivera analyser för att hjälpa Stirling-PDF att växa och tillåta oss att förstå våra användare bättre. +analytics.enable=Aktivera analys +analytics.disable=Avaktivera analys +analytics.settings=Du kan ändra analysinställningarna i config/settings.yml-filen ############# # NAVBAR # @@ -145,7 +147,7 @@ navbar.sections.convertFrom=Konvertera från PDF navbar.sections.security=Signera & Säkerhet navbar.sections.advance=Avancerat navbar.sections.edit=Visa & Redigera -navbar.sections.popular=Popular +navbar.sections.popular=Populära ############# # SETTINGS # @@ -243,7 +245,8 @@ database.fileNotFound=Filen hittades inte database.fileNullOrEmpty=Filen får inte vara null eller tom database.failedImportFile=Misslyckades med att importera fil -session.expired=Your session has expired. Please refresh the page and try again. +session.expired=Din session har löpt ut. Uppdatera sidan och försök igen. +session.refreshPage=Refresh Page ############# # HOME-PAGE # @@ -503,28 +506,28 @@ home.removeImagePdf.desc=Ta bort bild från PDF för att minska filstorlek removeImagePdf.tags=Ta bort bild,Sidoperationer,Backend,serversida -home.splitPdfByChapters.title=Split PDF by Chapters -home.splitPdfByChapters.desc=Split a PDF into multiple files based on its chapter structure. -splitPdfByChapters.tags=split,chapters,bookmarks,organize +home.splitPdfByChapters.title=Dela upp PDF efter kapitel +home.splitPdfByChapters.desc=Dela upp en PDF till flera filer baserat på dess kapitelstruktur. +splitPdfByChapters.tags=dela,kapitel,bokmärken,organisera #replace-invert-color replace-color.title=Replace-Invert-Color -replace-color.header=Replace-Invert Color PDF +replace-color.header=Ersätt-Invertera färg på PDF home.replaceColorPdf.title=Replace and Invert Color -home.replaceColorPdf.desc=Replace color for text and background in PDF and invert full color of pdf to reduce file size -replaceColorPdf.tags=Replace Color,Page operations,Back end,server side -replace-color.selectText.1=Replace or Invert color Options -replace-color.selectText.2=Default(Default high contrast colors) -replace-color.selectText.3=Custom(Customized colors) -replace-color.selectText.4=Full-Invert(Invert all colors) -replace-color.selectText.5=High contrast color options -replace-color.selectText.6=white text on black background -replace-color.selectText.7=Black text on white background -replace-color.selectText.8=Yellow text on black background -replace-color.selectText.9=Green text on black background -replace-color.selectText.10=Choose text Color -replace-color.selectText.11=Choose background Color -replace-color.submit=Replace +home.replaceColorPdf.desc=Ersätt färg för text och bakgrund i PDF och invertera hela färgen på PDF för att minska filstorlek +replaceColorPdf.tags=Ersätt Färg, Sidåtgärder, Bakomliggande, Serversid +replace-color.selectText.1=Ersätt eller Invertera färgalternativ +replace-color.selectText.2=Standard (standard höghastighetsfärg) +replace-color.selectText.3=Anpassad (anpassade färger) +replace-color.selectText.4=Full-Invertera (invertera alla färger) +replace-color.selectText.5=Höghastighetsfärgalternativ +replace-color.selectText.6=Vit text på svart bakgrund +replace-color.selectText.7=Svart text på vit bakgrund +replace-color.selectText.8=Gul text på svart bakgrund +replace-color.selectText.9=Grön text på svart bakgrund +replace-color.selectText.10=Välj textfärg +replace-color.selectText.11=Välj bakgrundsfärg +replace-color.submit=Ersätt @@ -551,9 +554,9 @@ login.oauth2AccessDenied=Åtkomst nekad login.oauth2InvalidTokenResponse=Ogiltigt token-svar login.oauth2InvalidIdToken=Ogiltigt Id-token login.userIsDisabled=Användaren är inaktiverad, inloggning är för närvarande blockerad med detta användarnamn. Kontakta administratören. -login.alreadyLoggedIn=You are already logged in to -login.alreadyLoggedIn2=devices. Please log out of the devices and try again. -login.toManySessions=You have too many active sessions +login.alreadyLoggedIn=Du är redan inloggad på +login.alreadyLoggedIn2=enheter. Logga ut från enheterna och försök igen. +login.toManySessions=Du har för många aktiva sessioner #auto-redact autoRedact.title=Auto-redigera @@ -728,7 +731,7 @@ pageLayout.submit=Skicka scalePages.title=Justera sidskala scalePages.header=Justera sidskala scalePages.pageSize=Storlek på en sida i dokumentet. -scalePages.keepPageSize=Original Size +scalePages.keepPageSize=Originalstorlek scalePages.scaleFactor=Zoomnivå (beskärning) för en sida. scalePages.submit=Skicka @@ -748,6 +751,7 @@ certSign.showSig=Visa signatur certSign.reason=Anledning certSign.location=Plats certSign.name=Namn +certSign.showLogo=Visa logo certSign.submit=Signera PDF @@ -782,6 +786,9 @@ compare.highlightColor.2=Markeringsfärg 2: compare.document.1=Dokument 1 compare.document.2=Dokument 2 compare.submit=Jämför +compare.complex.message=En eller båda de angivna dokumenten är stora filer, jämförelsepräzissen kan minska. +compare.large.file.message=En eller båda de angivna dokumenten är för stora att bearbeta +compare.no.text.message=En eller båda de valda PDF:erna innehåller ingen textinnehåll. Välj PDF:er med text för jämförelse. #BookToPDF BookToPDF.title=Böcker och serier till PDF @@ -804,6 +811,11 @@ sign.draw=Rita signatur sign.text=Textinmatning sign.clear=Rensa sign.add=Lägg till +sign.saved=Sparade signaturer +sign.save=Spara signatur +sign.personalSigs=Personliga signaturer +sign.sharedSigs=Delade signaturer +sign.noSavedSigs=Inga sparade signaturer hittades #repair @@ -921,7 +933,14 @@ pdfOrganiser.placeholder=(t.ex. 1,3,2 eller 4-8,2,10-12 eller 2n-1) multiTool.title=PDF-multiverktyg multiTool.header=PDF Multi-verktyg multiTool.uploadPrompts=Filnamn - +multiTool.selectAll=Select All +multiTool.deselectAll=Deselect All +multiTool.selectPages=Page Select +multiTool.selectedPages=Selected Pages +multiTool.page=Page +multiTool.deleteSelected=Delete Selected +multiTool.downloadAll=Export +multiTool.downloadSelected=Export Selected #view pdf viewPdf.title=Visa PDF viewPdf.header=Visa PDF @@ -1013,7 +1032,7 @@ watermark.header=Lägg till vattenstämpel watermark.selectText.1=Välj PDF för att lägga till vattenstämpel till: watermark.selectText.2=Vattenmärkestext: watermark.selectText.3=Teckenstorlek: -watermark.selectText.4=Rotation (0-360): +watermark.selectText.4=Vändning (0-360): watermark.selectText.5=widthSpacer (mellanrum mellan varje vattenstämpel horisontellt): watermark.selectText.6=heightSpacer (mellanrum mellan varje vattenstämpel vertikalt): watermark.selectText.7=Opacitet (0% - 100%): @@ -1181,8 +1200,8 @@ licenses.license=Licens survey.nav=Undersökning survey.title=Stirling-PDF-undersökning survey.description=Stirling-PDF har ingen spårning så vi vill höra från våra användare för att förbättra Stirling-PDF! -survey.changes=Stirling-PDF has changed since the last survey! To find out more please check our blog post here: -survey.changes2=With these changes we are getting paid business support and funding +survey.changes=Stirling-PDF har ändrats sedan den senaste undersökningen. Lär dig mer på vår blogg här: +survey.changes2=Med dessa ändringar fås betalat företagsstöd och finansiering survey.please=Vänligen överväg att delta i vår undersökning! survey.disabled=(Undersökningspopup kommer att inaktiveras i kommande uppdateringar men finns tillgänglig längst ner på sidan) survey.button=Delta i undersökningen @@ -1210,15 +1229,13 @@ removeImage.removeImage=Ta bort bild removeImage.submit=Ta bort bild -splitByChapters.title=Split PDF by Chapters -splitByChapters.header=Split PDF by Chapters -splitByChapters.bookmarkLevel=Bookmark Level -splitByChapters.includeMetadata=Include Metadata -splitByChapters.allowDuplicates=Allow Duplicates -splitByChapters.desc.1=This tool splits a PDF file into multiple PDFs based on its chapter structure. -splitByChapters.desc.2=Bookmark Level: Choose the level of bookmarks to use for splitting (0 for top-level, 1 for second-level, etc.). +splitByChapters.title=Dela upp PDF efter kapitel +splitByChapters.header=Dela upp PDF efter kapitel +splitByChapters.bookmarkLevel=Bokmärkesnivå +splitByChapters.includeMetadata=Inkludera Metadata +splitByChapters.allowDuplicates=Tillåt Dubletter +splitByChapters.desc.1=Detta verktyg delar upp en PDF till flera PDFer baserat på dess kapitelstruktur. +splitByChapters.desc.2=Bokmärkesnivå: Välj nivån av bokmärken att använda för delning (0 för toppnivå, 1 för andra nivå, m.m.). splitByChapters.desc.3=Include Metadata: If checked, the original PDF's metadata will be included in each split PDF. -splitByChapters.desc.4=Allow Duplicates: If checked, allows multiple bookmarks on the same page to create separate PDFs. -splitByChapters.submit=Split PDF - - +splitByChapters.desc.4=Tillåt duplicieringar: Om kryssrutan är markerad tillåts flera bokmärken på samma sida skapa individuella PDF:er. +splitByChapters.submit=Dela upp PDF diff --git a/src/main/resources/messages_th_TH.properties b/src/main/resources/messages_th_TH.properties index 8df2f7fab..b928752ae 100644 --- a/src/main/resources/messages_th_TH.properties +++ b/src/main/resources/messages_th_TH.properties @@ -3,8 +3,8 @@ ########### # the direction that the language is written (ltr = left to right, rtl = right to left) language.direction=ltr -addPageNumbers.fontSize=Font Size -addPageNumbers.fontName=Font Name +addPageNumbers.fontSize=ขนาดตัวอักษร +addPageNumbers.fontName=ชื่อฟอนต์ pdfPrompt=เลือก PDF multiPdfPrompt=เลือก PDF หลายไฟล์ (2 ขึ้นไป) multiPdfDropPrompt=เลือก (หรือลากและวาง) PDF ทั้งหมดที่คุณต้องการ @@ -56,12 +56,12 @@ userNotFoundMessage=ไม่พบผู้ใช้ incorrectPasswordMessage=รหัสผ่านปัจจุบันไม่ถูกต้อง usernameExistsMessage=ชื่อผู้ใช้ใหม่มีอยู่แล้ว invalidUsernameMessage=ชื่อผู้ใช้ไม่ถูกต้อง ชื่อผู้ใช้สามารถประกอบด้วยตัวอักษร ตัวเลข และอักขระพิเศษต่อไปนี้ @._+- หรือจะต้องเป็นที่อยู่อีเมลที่ถูกต้อง -invalidPasswordMessage=The password must not be empty and must not have spaces at the beginning or end. +invalidPasswordMessage=รหัสผ่านไม่ควรว่าง และไม่ควรมีพื้นที่ว่างที่ขอบของข้อความ confirmPasswordErrorMessage=รหัสผ่านใหม่และยืนยันรหัสผ่านใหม่ต้องตรงกัน deleteCurrentUserMessage=ไม่สามารถลบผู้ใช้ที่เข้าสู่ระบบในปัจจุบันได้ deleteUsernameExistsMessage=ชื่อผู้ใช้ไม่ปรากฏและไม่สามารถลบได้ downgradeCurrentUserMessage=ไม่สามารถลดระดับบทบาทของผู้ใช้ปัจจุบันได้ -disabledCurrentUserMessage=The current user cannot be disabled +disabledCurrentUserMessage=ผู้ใช้งานปัจจุบันไม่สามารถปิดการใช้งานได้ downgradeCurrentUserLongMessage=ไม่สามารถลดระดับบทบาทของผู้ใช้ปัจจุบันได้ ดังนั้นผู้ใช้ปัจจุบันจะไม่ปรากฏ userAlreadyExistsOAuthMessage=ผู้ใช้มีอยู่แล้วในฐานะผู้ใช้ OAuth2 userAlreadyExistsWebMessage=ผู้ใช้มีอยู่แล้วในฐานะผู้ใช้เว็บ @@ -76,15 +76,17 @@ donate=บริจาค color=สี sponsor=ผู้สนับสนุน info=ข้อมูล -pro=Pro -page=Page -pages=Pages +pro=โปร +page=หน้า +pages=หน้า +loading=กำลังโหลด... +addToDoc=เพิ่มเข้าสู่เอกสาร -legal.privacy=Privacy Policy -legal.terms=Terms and Conditions -legal.accessibility=Accessibility -legal.cookie=Cookie Policy -legal.impressum=Impressum +legal.privacy=นโยบายความเป็นส่วนตัว +legal.terms=ข้อกำหนดการใช้งาน +legal.accessibility=ความเข้าถึง +legal.cookie=นโยบายคุกกี้ +legal.impressum=ปฏิญญา ############### # Pipeline # @@ -114,8 +116,8 @@ pipelineOptions.validateButton=ตรวจสอบความถูกต้ ######################## # ENTERPRISE EDITION # ######################## -enterpriseEdition.button=Upgrade to Pro -enterpriseEdition.warning=This feature is only available to Pro users. +enterpriseEdition.button=อัปเกรดเป็นโปร +enterpriseEdition.warning=ฟีเจอร์นี้มีให้ใช้งานเฉพาะผู้ใช้ที่เป็นโปรเท่านั้น enterpriseEdition.yamlAdvert=Stirling PDF Pro supports YAML configuration files and other SSO features. enterpriseEdition.ssoAdvert=Looking for more user management features? Check out Stirling PDF Pro @@ -123,12 +125,12 @@ enterpriseEdition.ssoAdvert=Looking for more user management features? Check out ################# # Analytics # ################# -analytics.title=Do you want make Stirling PDF better? -analytics.paragraph1=Stirling PDF has opt in analytics to help us improve the product. We do not track any personal information or file contents. -analytics.paragraph2=Please consider enabling analytics to help Stirling-PDF grow and to allow us to understand our users better. -analytics.enable=Enable analytics -analytics.disable=Disable analytics -analytics.settings=You can change the settings for analytics in the config/settings.yml file +analytics.title=คุณต้องการที่จะทำให้ Stirling PDF ดียิ่งขึ้นไหม? +analytics.paragraph1=Stirling PDF มีการวิเคราะห์แบบสมัครใจเพื่อช่วยเราปรับปรุงผลิตภัณฑ์ เราไม่นำทางความเป็นส่วนตัวหรือเนื้อหาของไฟล์ไปเก็บข้อมูลใด ๆ +analytics.paragraph2=โปรดพิจารณาการเปิดใช้งานการวิเคราะห์เพื่อช่วยให้ Stirling-PDF เจริญเติบโตและทำให้เราเข้าใจผู้ใช้งานมากขึ้น +analytics.enable=เปิดการวิเคราะห์ +analytics.disable=ปิดการวิเคราะห์ +analytics.settings=คุณสามารถเปลี่ยนแปลงการตั้งค่าการวิเคราะห์ในไฟล์ config/settings.yml ############# # NAVBAR # @@ -145,7 +147,7 @@ navbar.sections.convertFrom=แปลงจาก PDF navbar.sections.security=ลงนามและความปลอดภัย navbar.sections.advance=ขั้นสูง navbar.sections.edit=ดูและแก้ไข -navbar.sections.popular=Popular +navbar.sections.popular=ยอดนิยม ############# # SETTINGS # @@ -204,7 +206,7 @@ adminUserSettings.user=ผู้ใช้ adminUserSettings.addUser=เพิ่มผู้ใช้ใหม่ adminUserSettings.deleteUser=ลบผู้ใช้ adminUserSettings.confirmDeleteUser=ควรลบผู้ใช้นี้หรือไม่? -adminUserSettings.confirmChangeUserStatus=Should the user be disabled/enabled? +adminUserSettings.confirmChangeUserStatus=ผู้ใช้นี้ควรถูกปิด/เปิดใช้งานหรือไม่? adminUserSettings.usernameInfo=ชื่อผู้ใช้สามารถประกอบด้วยตัวอักษร ตัวเลข และอักขระพิเศษต่อไปนี้ @._+- หรือจะต้องเป็นที่อยู่อีเมลที่ถูกต้อง adminUserSettings.roles=บทบาท adminUserSettings.role=บทบาท @@ -218,13 +220,13 @@ adminUserSettings.forceChange=บังคับให้ผู้ใช้เ adminUserSettings.submit=บันทึกผู้ใช้ adminUserSettings.changeUserRole=เปลี่ยนบทบาทของผู้ใช้ adminUserSettings.authenticated=ได้รับการยืนยันแล้ว -adminUserSettings.editOwnProfil=Edit own profile -adminUserSettings.enabledUser=enabled user -adminUserSettings.disabledUser=disabled user -adminUserSettings.activeUsers=Active Users: -adminUserSettings.disabledUsers=Disabled Users: -adminUserSettings.totalUsers=Total Users: -adminUserSettings.lastRequest=Last Request +adminUserSettings.editOwnProfil=แก้ไขโปรไฟล์ของตัวเอง +adminUserSettings.enabledUser=ผู้ใช้ที่เปิดใช้งาน +adminUserSettings.disabledUser=ผู้ใช้ที่ปิดใช้งาน +adminUserSettings.activeUsers=ผู้ใช้ที่มีการใช้งาน: +adminUserSettings.disabledUsers=ผู้ใช้ที่ถูกระงับการใช้งาน: +adminUserSettings.totalUsers=ผู้ใช้รวมทั้งหมด: +adminUserSettings.lastRequest=การขอข้อมูลล่าสุด database.title=การนำเข้า/ส่งออกฐานข้อมูล @@ -243,7 +245,8 @@ database.fileNotFound=ไม่พบไฟล์ database.fileNullOrEmpty=ไฟล์ต้องไม่ว่างเปล่าหรือไม่มีข้อมูล database.failedImportFile=การนำเข้าไฟล์ล้มเหลว -session.expired=Your session has expired. Please refresh the page and try again. +session.expired=สถานะของคุณในระบบหมดอายุ กรุณารีเฟรชหน้าและลองใหม่อีกครั้ง +session.refreshPage=Refresh Page ############# # HOME-PAGE # @@ -402,7 +405,7 @@ home.scalePages.title=ปรับขนาด/สเกลหน้า home.scalePages.desc=เปลี่ยนขนาด/สเกลของหน้าและ/หรือเนื้อหาของมัน scalePages.tags=ปรับขนาด, แก้ไข, มิติ, ปรับ -home.pipeline.title=Pipeline +home.pipeline.title=ทิศทางงาน home.pipeline.desc=เรียกใช้งานหลายการกระทำใน PDF โดยกำหนดสคริปต์ pipeline pipeline.tags=อัตโนมัติ, ลำดับ, สคริปต์, ประมวลผลแบทช์ @@ -498,8 +501,8 @@ home.BookToPDF.title=หนังสือเป็น PDF home.BookToPDF.desc=แปลงรูปแบบหนังสือ/การ์ตูนเป็น PDF โดยใช้ Calibre BookToPDF.tags=หนังสือ, การ์ตูน, Calibre, แปลง, มังงะ, amazon, kindle -home.removeImagePdf.title=Remove image -home.removeImagePdf.desc=Remove image from PDF to reduce file size +home.removeImagePdf.title=ลบภาพออกจาก PDF +home.removeImagePdf.desc=ลบภาพออกจาก PDF เพื่อลดขนาดไฟล์ removeImagePdf.tags=Remove Image,Page operations,Back end,server side @@ -550,10 +553,10 @@ login.oauth2invalidRequest=คำขอไม่ถูกต้อง login.oauth2AccessDenied=การเข้าถึงถูกปฏิเสธ login.oauth2InvalidTokenResponse=การตอบกลับโทเค็นไม่ถูกต้อง login.oauth2InvalidIdToken=โทเค็น Id ไม่ถูกต้อง -login.userIsDisabled=User is deactivated, login is currently blocked with this username. Please contact the administrator. -login.alreadyLoggedIn=You are already logged in to -login.alreadyLoggedIn2=devices. Please log out of the devices and try again. -login.toManySessions=You have too many active sessions +login.userIsDisabled=ผู้ใช้งานถูกระงับการใช้งาน ไม่สามารถเข้าสู่ระบบด้วยชื่อผู้ใช้นี้ได้ กรุณาติดต่อผู้ดูแลระบบ +login.alreadyLoggedIn=คุณได้เข้าสู่ระบบใน +login.alreadyLoggedIn2=อุปกรณ์แล้ว กรุณาออกจากระบบจากอุปกรณ์ที่ใช้งานอยู่แล้ว จากนั้นลองใหม่อีกครั้ง +login.toManySessions=คุณมีการเข้าสู่ระบบพร้อมกันเกินกว่ากำหนด #auto-redact autoRedact.title=ซ่อนข้อมูลอัตโนมัติ @@ -713,7 +716,7 @@ autoSplitPDF.submit=ส่ง #pipeline -pipeline.title=Pipeline +pipeline.title=พิ้พลne #pageLayout @@ -728,7 +731,7 @@ pageLayout.submit=ส่ง scalePages.title=ปรับสเกลหน้า scalePages.header=ปรับสเกลหน้า scalePages.pageSize=ขนาดหน้าของเอกสาร -scalePages.keepPageSize=Original Size +scalePages.keepPageSize=ขนาดต้นฉบับ scalePages.scaleFactor=ระดับการซูม (ครอบตัด) ของหน้า scalePages.submit=ส่ง @@ -748,6 +751,7 @@ certSign.showSig=แสดงลายเซ็น certSign.reason=เหตุผล certSign.location=ตำแหน่ง certSign.name=ชื่อ +certSign.showLogo=แสดงโลโก้ certSign.submit=เซ็นชื่อ PDF @@ -782,6 +786,9 @@ compare.highlightColor.2=สีเน้น 2: compare.document.1=เอกสาร 1 compare.document.2=เอกสาร 2 compare.submit=เปรียบเทียบ +compare.complex.message=หนึ่งหรือทั้งสองเอกสารที่ให้มายอมเป็นไฟล์ใหญ่ ความถูกต้องของการเปรียบเทียบอาจลดลง +compare.large.file.message=หนึ่งหรือทั้งสองเอกสารที่ให้มามีขนาดใหญ่มาก ไม่สามารถประมวลผลได้ +compare.no.text.message=หนึ่งหรือทั้งสองเอกสาร PDF ที่เลือกไม่มีเนื้อหาข้อความ กรุณาเลือกเอกสาร PDF ที่มีข้อความสำหรับการเปรียบเทียบ #BookToPDF BookToPDF.title=หนังสือและการ์ตูนเป็น PDF @@ -804,6 +811,11 @@ sign.draw=วาดลายเซ็น sign.text=ป้อนข้อความ sign.clear=ล้าง sign.add=เพิ่ม +sign.saved=ลายเซ็นที่บันทึกไว้ +sign.save=บันทึกลายเซ็น +sign.personalSigs=ลายเซ็นส่วนตัว +sign.sharedSigs=ลายเซ็นร่วม +sign.noSavedSigs=ไม่พบลายเซ็นที่บันทึกไว้ #repair @@ -830,7 +842,7 @@ ScannerImageSplit.selectText.7=พื้นที่เค้าโครงข ScannerImageSplit.selectText.8=ตั้งค่าเกณฑ์พื้นที่เค้าโครงขั้นต่ำสำหรับรูปภาพ ScannerImageSplit.selectText.9=ขนาดขอบ: ScannerImageSplit.selectText.10=ตั้งค่าขนาดขอบที่เพิ่มและลบเพื่อป้องกันขอบขาวในผลลัพธ์ (ค่าเริ่มต้น: 1) -ScannerImageSplit.info=Python is not installed. It is required to run. +ScannerImageSplit.info=Python ไม่มีการติดตั้ง กรุณาติดตั้งเพื่อใช้งาน #OCR @@ -857,7 +869,7 @@ ocr.submit=ประมวลผล PDF ด้วย OCR extractImages.title=แยกรูปภาพ extractImages.header=แยกรูปภาพ extractImages.selectText=เลือกรูปแบบภาพที่จะใช้ในการแปลงรูปภาพที่แยกได้ -extractImages.allowDuplicates=Save duplicate images +extractImages.allowDuplicates=บันทึกลายซ้ำ extractImages.submit=แยก @@ -921,7 +933,14 @@ pdfOrganiser.placeholder=(เช่น 1,3,2 หรือ 4-8,2,10-12 หรื multiTool.title=เครื่องมือ PDF หลายตัว multiTool.header=เครื่องมือ PDF หลายตัว multiTool.uploadPrompts=ชื่อไฟล์ - +multiTool.selectAll=Select All +multiTool.deselectAll=Deselect All +multiTool.selectPages=Page Select +multiTool.selectedPages=Selected Pages +multiTool.page=Page +multiTool.deleteSelected=Delete Selected +multiTool.downloadAll=Export +multiTool.downloadSelected=Export Selected #view pdf viewPdf.title=ดู PDF viewPdf.header=ดู PDF @@ -982,7 +1001,7 @@ pdfToImage.color=สี pdfToImage.grey=ระดับสีเทา pdfToImage.blackwhite=ขาวดำ (อาจสูญเสียข้อมูล!) pdfToImage.submit=แปลง -pdfToImage.info=Python is not installed. Required for WebP conversion. +pdfToImage.info=Python ไม่มีการติดตั้ง จำเป็นสำหรับการแปลง WebP #addPassword @@ -1181,8 +1200,8 @@ licenses.license=ใบอนุญาต survey.nav=สำรวจ survey.title=สำรวจ Stirling-PDF survey.description=Stirling-PDF ไม่มีการติดตาม ดังนั้นเราต้องการฟังความคิดเห็นจากผู้ใช้เพื่อปรับปรุง Stirling-PDF! -survey.changes=Stirling-PDF has changed since the last survey! To find out more please check our blog post here: -survey.changes2=With these changes we are getting paid business support and funding +survey.changes=Stirling-PDF ได้มีการเปลี่ยนแปลงตั้งแต่การสำรวจครั้งล่าสุด! กรุณาตรวจสอบบล็อกของเราที่นี้เพื่อรับข้อมูลเพิ่มเติม: +survey.changes2=ด้วยการเปลี่ยนแปลงเหล่านี้เราได้รับการสนับสนุนทางธุรกิจและการเงินจากผู้ประกอบการ survey.please=กรุณาพิจารณาการสำรวจของเรา! survey.disabled=(ป๊อปอัปการสำรวจจะถูกปิดใช้งานในการอัปเดตต่อไปนี้ แต่สามารถใช้ได้ที่ส่วนท้ายของหน้า) survey.button=เริ่มสำรวจ @@ -1204,21 +1223,19 @@ error.discordSubmit=Discord - ส่งโพสต์การสนับส #remove-image -removeImage.title=Remove image -removeImage.header=Remove image -removeImage.removeImage=Remove image -removeImage.submit=Remove image - - -splitByChapters.title=Split PDF by Chapters -splitByChapters.header=Split PDF by Chapters -splitByChapters.bookmarkLevel=Bookmark Level -splitByChapters.includeMetadata=Include Metadata -splitByChapters.allowDuplicates=Allow Duplicates -splitByChapters.desc.1=This tool splits a PDF file into multiple PDFs based on its chapter structure. -splitByChapters.desc.2=Bookmark Level: Choose the level of bookmarks to use for splitting (0 for top-level, 1 for second-level, etc.). -splitByChapters.desc.3=Include Metadata: If checked, the original PDF's metadata will be included in each split PDF. -splitByChapters.desc.4=Allow Duplicates: If checked, allows multiple bookmarks on the same page to create separate PDFs. -splitByChapters.submit=Split PDF +removeImage.title=ลบภาพ +removeImage.header=ลบภาพ +removeImage.removeImage=ลบภาพ +removeImage.submit=ยืนยันการลบภาพ +splitByChapters.title=แบ่งไฟล์ PDF ตามหมวดหมู่ +splitByChapters.header=แบ่งไฟล์ PDF ตามหมวดหมู่ +splitByChapters.bookmarkLevel=ระดับบุคคลที่ได้รับเลือก +splitByChapters.includeMetadata=รวมข้อมูลเสริม +splitByChapters.allowDuplicates=อนุญาตให้มีการซ้ำ +splitByChapters.desc.1=เครื่องมือนี้จะแบ่งไฟล์ PDF ออกเป็นหลายไฟล์ PDF ตามโครงสร้างหมวดหมู่ของไฟล์นั้นๆ +splitByChapters.desc.2=ระดับบุคคลที่ได้รับเลือก: เลือกระดับบุคคลที่ได้รับเลือกที่จะใช้ในการแบ่ง (0 สำหรับระดับต้น, 1 สำหรับระดับที่สอง เป็นต้น) +splitByChapters.desc.3=รวมข้อมูลเสริม: หากถูกเลือก ข้อมูลเสริมของไฟล์ PDF ที่เดิมจะถูกรวมอยู่ในแต่ละไฟล์ที่แบ่งออก +splitByChapters.desc.4=อนุญาตให้มีการซ้ำ: หากถูกเลือก จะทำให้สามารถสร้างไฟล์ PDF แยกออกมาจากหน้าเดียวกันได้หลายรายการ +splitByChapters.submit=แบ่งไฟล์ PDF diff --git a/src/main/resources/messages_tr_TR.properties b/src/main/resources/messages_tr_TR.properties index ec95707c5..5025d51ae 100644 --- a/src/main/resources/messages_tr_TR.properties +++ b/src/main/resources/messages_tr_TR.properties @@ -79,6 +79,8 @@ info=Bilgi pro=Pro page=Page pages=Pages +loading=Loading... +addToDoc=Add to Document legal.privacy=Gizlilik Politikası legal.terms=Şartlar ve koşullar @@ -244,6 +246,7 @@ database.fileNullOrEmpty=Dosya yok veya boş olmamalıdır database.failedImportFile=Dosya İçe Aktarılamadı session.expired=Your session has expired. Please refresh the page and try again. +session.refreshPage=Refresh Page ############# # HOME-PAGE # @@ -748,6 +751,7 @@ certSign.showSig=İmzayı Göster certSign.reason=Neden certSign.location=Konum certSign.name=İsim +certSign.showLogo=Show Logo certSign.submit=PDF'i İmzala @@ -782,6 +786,9 @@ compare.highlightColor.2=Vurgu Rengi 2: compare.document.1=Belge 1 compare.document.2=Belge 2 compare.submit=Karşılaştır +compare.complex.message=One or both of the provided documents are large files, accuracy of comparison may be reduced +compare.large.file.message=One or Both of the provided documents are too large to process +compare.no.text.message=One or both of the selected PDFs have no text content. Please choose PDFs with text for comparison. #BookToPDF BookToPDF.title=Kitapları ve Çizgi Romanları PDF'e Dönüştürme @@ -804,6 +811,11 @@ sign.draw=İmza Çiz sign.text=Metin Girişi sign.clear=Temizle sign.add=Ekle +sign.saved=Saved Signatures +sign.save=Save Signature +sign.personalSigs=Personal Signatures +sign.sharedSigs=Shared Signatures +sign.noSavedSigs=No saved signatures found #repair @@ -921,7 +933,14 @@ pdfOrganiser.placeholder=(örn. 1,3,2 veya 4-8,2,10-12 veya 2n-1) multiTool.title=PDF Çoklu Araç multiTool.header=PDF Çoklu Araç multiTool.uploadPrompts=Dosya Adı - +multiTool.selectAll=Select All +multiTool.deselectAll=Deselect All +multiTool.selectPages=Page Select +multiTool.selectedPages=Selected Pages +multiTool.page=Page +multiTool.deleteSelected=Delete Selected +multiTool.downloadAll=Export +multiTool.downloadSelected=Export Selected #view pdf viewPdf.title=PDF Görüntüle viewPdf.header=PDF Görüntüle @@ -1220,5 +1239,3 @@ splitByChapters.desc.2=Bookmark Level: Choose the level of bookmarks to use for splitByChapters.desc.3=Include Metadata: If checked, the original PDF's metadata will be included in each split PDF. splitByChapters.desc.4=Allow Duplicates: If checked, allows multiple bookmarks on the same page to create separate PDFs. splitByChapters.submit=Split PDF - - diff --git a/src/main/resources/messages_uk_UA.properties b/src/main/resources/messages_uk_UA.properties index 2a933bb78..176f0365a 100644 --- a/src/main/resources/messages_uk_UA.properties +++ b/src/main/resources/messages_uk_UA.properties @@ -79,6 +79,8 @@ info=Інформація pro=Pro page=Page pages=Pages +loading=Loading... +addToDoc=Add to Document legal.privacy=Privacy Policy legal.terms=Terms and Conditions @@ -244,6 +246,7 @@ database.fileNullOrEmpty=File must not be null or empty database.failedImportFile=Failed Import File session.expired=Your session has expired. Please refresh the page and try again. +session.refreshPage=Refresh Page ############# # HOME-PAGE # @@ -748,6 +751,7 @@ certSign.showSig=Показати підпис certSign.reason=Причина certSign.location=Місцезнаходження certSign.name=Ім'я +certSign.showLogo=Show Logo certSign.submit=Підписати PDF @@ -782,6 +786,9 @@ compare.highlightColor.2=Highlight Color 2: compare.document.1=Документ 1 compare.document.2=Документ 2 compare.submit=Порівняти +compare.complex.message=One or both of the provided documents are large files, accuracy of comparison may be reduced +compare.large.file.message=One or Both of the provided documents are too large to process +compare.no.text.message=One or both of the selected PDFs have no text content. Please choose PDFs with text for comparison. #BookToPDF BookToPDF.title=Книги та комікси в PDF @@ -804,6 +811,11 @@ sign.draw=Намалювати підпис sign.text=Ввід тексту sign.clear=Очистити sign.add=Додати +sign.saved=Saved Signatures +sign.save=Save Signature +sign.personalSigs=Personal Signatures +sign.sharedSigs=Shared Signatures +sign.noSavedSigs=No saved signatures found #repair @@ -921,7 +933,14 @@ pdfOrganiser.placeholder=(наприклад, 1,3,2 або 4-8,2,10-12 або 2n multiTool.title=Мультіінструмент PDF multiTool.header=Мультіінструмент PDF multiTool.uploadPrompts=Ім'я файлу - +multiTool.selectAll=Select All +multiTool.deselectAll=Deselect All +multiTool.selectPages=Page Select +multiTool.selectedPages=Selected Pages +multiTool.page=Page +multiTool.deleteSelected=Delete Selected +multiTool.downloadAll=Export +multiTool.downloadSelected=Export Selected #view pdf viewPdf.title=Переглянути PDF viewPdf.header=Переглянути PDF @@ -1220,5 +1239,3 @@ splitByChapters.desc.2=Bookmark Level: Choose the level of bookmarks to use for splitByChapters.desc.3=Include Metadata: If checked, the original PDF's metadata will be included in each split PDF. splitByChapters.desc.4=Allow Duplicates: If checked, allows multiple bookmarks on the same page to create separate PDFs. splitByChapters.submit=Split PDF - - diff --git a/src/main/resources/messages_vi_VN.properties b/src/main/resources/messages_vi_VN.properties index cb5de6aa9..41c689bcd 100644 --- a/src/main/resources/messages_vi_VN.properties +++ b/src/main/resources/messages_vi_VN.properties @@ -79,6 +79,8 @@ info=Thông tin pro=Pro page=Page pages=Pages +loading=Loading... +addToDoc=Add to Document legal.privacy=Privacy Policy legal.terms=Terms and Conditions @@ -244,6 +246,7 @@ database.fileNullOrEmpty=Tệp không được để trống hoặc rỗng database.failedImportFile=Không thể nhập tệp session.expired=Your session has expired. Please refresh the page and try again. +session.refreshPage=Refresh Page ############# # HOME-PAGE # @@ -748,6 +751,7 @@ certSign.showSig=Hiển thị chữ ký certSign.reason=Lý do certSign.location=Vị trí certSign.name=Tên +certSign.showLogo=Show Logo certSign.submit=Ký PDF @@ -782,6 +786,9 @@ compare.highlightColor.2=Màu đánh dấu 2: compare.document.1=Tài liệu 1 compare.document.2=Tài liệu 2 compare.submit=So sánh +compare.complex.message=One or both of the provided documents are large files, accuracy of comparison may be reduced +compare.large.file.message=One or Both of the provided documents are too large to process +compare.no.text.message=One or both of the selected PDFs have no text content. Please choose PDFs with text for comparison. #BookToPDF BookToPDF.title=Sách và truyện tranh sang PDF @@ -804,6 +811,11 @@ sign.draw=Vẽ chữ ký sign.text=Nhập văn bản sign.clear=Xóa sign.add=Thêm +sign.saved=Saved Signatures +sign.save=Save Signature +sign.personalSigs=Personal Signatures +sign.sharedSigs=Shared Signatures +sign.noSavedSigs=No saved signatures found #repair @@ -921,7 +933,14 @@ pdfOrganiser.placeholder=(ví dụ: 1,3,2 hoặc 4-8,2,10-12 hoặc 2n-1) multiTool.title=Công cụ đa năng PDF multiTool.header=Công cụ đa năng PDF multiTool.uploadPrompts=Tên tệp - +multiTool.selectAll=Select All +multiTool.deselectAll=Deselect All +multiTool.selectPages=Page Select +multiTool.selectedPages=Selected Pages +multiTool.page=Page +multiTool.deleteSelected=Delete Selected +multiTool.downloadAll=Export +multiTool.downloadSelected=Export Selected #view pdf viewPdf.title=Xem PDF viewPdf.header=Xem PDF @@ -1220,5 +1239,3 @@ splitByChapters.desc.2=Bookmark Level: Choose the level of bookmarks to use for splitByChapters.desc.3=Include Metadata: If checked, the original PDF's metadata will be included in each split PDF. splitByChapters.desc.4=Allow Duplicates: If checked, allows multiple bookmarks on the same page to create separate PDFs. splitByChapters.submit=Split PDF - - diff --git a/src/main/resources/messages_zh_CN.properties b/src/main/resources/messages_zh_CN.properties index 5a60398df..1a3f2f437 100644 --- a/src/main/resources/messages_zh_CN.properties +++ b/src/main/resources/messages_zh_CN.properties @@ -79,6 +79,8 @@ info=信息 pro=Pro page=Page pages=Pages +loading=Loading... +addToDoc=Add to Document legal.privacy=Privacy Policy legal.terms=Terms and Conditions @@ -244,6 +246,7 @@ database.fileNullOrEmpty=文件不能为空 database.failedImportFile=导入文件失败 session.expired=Your session has expired. Please refresh the page and try again. +session.refreshPage=Refresh Page ############# # HOME-PAGE # @@ -748,6 +751,7 @@ certSign.showSig=显示签名 certSign.reason=原因 certSign.location=位置 certSign.name=名称 +certSign.showLogo=Show Logo certSign.submit=给PDF签名 @@ -782,6 +786,9 @@ compare.highlightColor.2=高亮颜色 2: compare.document.1=文档 1 compare.document.2=文档 2 compare.submit=比较 +compare.complex.message=One or both of the provided documents are large files, accuracy of comparison may be reduced +compare.large.file.message=One or Both of the provided documents are too large to process +compare.no.text.message=One or both of the selected PDFs have no text content. Please choose PDFs with text for comparison. #BookToPDF BookToPDF.title=电子书和漫画转换成PDF @@ -804,6 +811,11 @@ sign.draw=绘制签名 sign.text=文本输入 sign.clear=清除 sign.add=添加 +sign.saved=Saved Signatures +sign.save=Save Signature +sign.personalSigs=Personal Signatures +sign.sharedSigs=Shared Signatures +sign.noSavedSigs=No saved signatures found #repair @@ -921,7 +933,14 @@ pdfOrganiser.placeholder=(例如:1,3,2 或 4-8,2,10-12 或 2n-1) multiTool.title=PDF多功能工具 multiTool.header=PDF多功能工具 multiTool.uploadPrompts=文件名 - +multiTool.selectAll=Select All +multiTool.deselectAll=Deselect All +multiTool.selectPages=Page Select +multiTool.selectedPages=Selected Pages +multiTool.page=Page +multiTool.deleteSelected=Delete Selected +multiTool.downloadAll=Export +multiTool.downloadSelected=Export Selected #view pdf viewPdf.title=浏览PDF viewPdf.header=浏览PDF @@ -1220,5 +1239,3 @@ splitByChapters.desc.2=Bookmark Level: Choose the level of bookmarks to use for splitByChapters.desc.3=Include Metadata: If checked, the original PDF's metadata will be included in each split PDF. splitByChapters.desc.4=Allow Duplicates: If checked, allows multiple bookmarks on the same page to create separate PDFs. splitByChapters.submit=Split PDF - - diff --git a/src/main/resources/messages_zh_TW.properties b/src/main/resources/messages_zh_TW.properties index cf23acfbb..60b20330c 100644 --- a/src/main/resources/messages_zh_TW.properties +++ b/src/main/resources/messages_zh_TW.properties @@ -79,6 +79,8 @@ info=資訊 pro=專業版 page=頁面 pages=頁面 +loading=載入中... +addToDoc=新增至文件 legal.privacy=隱私權政策 legal.terms=使用條款 @@ -138,7 +140,7 @@ navbar.darkmode=深色模式 navbar.language=語言 navbar.settings=設定 navbar.allTools=工具 -navbar.multiTool=多功能工具 +navbar.multiTool=複合工具 navbar.sections.organize=整理 navbar.sections.convertTo=轉換為 PDF navbar.sections.convertFrom=從 PDF 轉換 @@ -244,6 +246,7 @@ database.fileNullOrEmpty=檔案不得為空或空白 database.failedImportFile=匯入檔案失敗 session.expired=您的工作階段已過期。請重新整理頁面並再試一次。 +session.refreshPage=重新整理頁面 ############# # HOME-PAGE # @@ -748,6 +751,7 @@ certSign.showSig=顯示簽章 certSign.reason=原因 certSign.location=位置 certSign.name=名稱 +certSign.showLogo=顯示 Logo certSign.submit=簽章 PDF @@ -782,6 +786,9 @@ compare.highlightColor.2=標示顏色 2: compare.document.1=文件 1 compare.document.2=文件 2 compare.submit=比較 +compare.complex.message=選擇的檔案大小太大(其中一個或兩者皆是),可能會影響比較的精確度 +compare.large.file.message=選擇的檔案大小超出系統限制(其中一個或兩者皆是),無法處理 +compare.no.text.message=選擇的 PDF 檔案未包含文字(其中一個或兩者皆是)。請選擇含有文字的 PDF 進行比較 #BookToPDF BookToPDF.title=電子書和漫畫轉 PDF @@ -798,12 +805,17 @@ PDFToBook.submit=轉換 #sign sign.title=簽章 -sign.header=簽章 PDF +sign.header=簽署 PDF sign.upload=上傳影像 sign.draw=繪製簽章 sign.text=文字輸入 sign.clear=清除 sign.add=新增 +sign.saved=已儲存的簽章 +sign.save=儲存簽章 +sign.personalSigs=個人簽章 +sign.sharedSigs=共用簽章 +sign.noSavedSigs=尚未儲存任何簽章 #repair @@ -921,7 +933,14 @@ pdfOrganiser.placeholder=(例如 1,3,2 或 4-8,2,10-12 或 2n-1) multiTool.title=PDF 複合工具 multiTool.header=PDF 複合工具 multiTool.uploadPrompts=檔名 - +multiTool.selectAll=Select All +multiTool.deselectAll=Deselect All +multiTool.selectPages=Page Select +multiTool.selectedPages=Selected Pages +multiTool.page=Page +multiTool.deleteSelected=Delete Selected +multiTool.downloadAll=Export +multiTool.downloadSelected=Export Selected #view pdf viewPdf.title=檢視 PDF viewPdf.header=檢視 PDF @@ -1220,5 +1239,3 @@ splitByChapters.desc.2=書籤層級:選擇用於分割的書籤層級(0 表 splitByChapters.desc.3=包含中繼資料:如果勾選,原始 PDF 的中繼資料將包含在每個分割後的 PDF 中。 splitByChapters.desc.4=允許重複:如果勾選,允許同一頁面上的多個書籤建立獨立的 PDF。 splitByChapters.submit=分割 PDF - - diff --git a/src/main/resources/settings.yml.template b/src/main/resources/settings.yml.template index 0381d2cf3..d9971d0c8 100644 --- a/src/main/resources/settings.yml.template +++ b/src/main/resources/settings.yml.template @@ -13,42 +13,42 @@ security: enableLogin: false # set to 'true' to enable login - csrfDisabled: true # Set to 'true' to disable CSRF protection (not recommended for production) + csrfDisabled: true # set to 'true' to disable CSRF protection (not recommended for production) loginAttemptCount: 5 # lock user account after 5 tries; when using e.g. Fail2Ban you can deactivate the function with -1 loginResetTimeMinutes: 120 # lock account for 2 hours after x attempts loginMethod: all # 'all' (Login Username/Password and OAuth2[must be enabled and configured]), 'normal'(only Login with Username/Password) or 'oauth2'(only Login with OAuth2) initialLogin: - username: '' # Initial username for the first login - password: '' # Initial password for the first login + username: '' # initial username for the first login + password: '' # initial password for the first login oauth2: enabled: false # set to 'true' to enable login (Note: enableLogin must also be 'true' for this to work) client: keycloak: issuer: '' # URL of the Keycloak realm's OpenID Connect Discovery endpoint - clientId: '' # Client ID for Keycloak OAuth2 - clientSecret: '' # Client Secret for Keycloak OAuth2 - scopes: openid, profile, email # Scopes for Keycloak OAuth2 - useAsUsername: preferred_username # Field to use as the username for Keycloak OAuth2 + clientId: '' # client ID for Keycloak OAuth2 + clientSecret: '' # client secret for Keycloak OAuth2 + scopes: openid, profile, email # scopes for Keycloak OAuth2 + useAsUsername: preferred_username # field to use as the username for Keycloak OAuth2 google: - clientId: '' # Client ID for Google OAuth2 - clientSecret: '' # Client Secret for Google OAuth2 - scopes: https://www.googleapis.com/auth/userinfo.email, https://www.googleapis.com/auth/userinfo.profile # Scopes for Google OAuth2 - useAsUsername: email # Field to use as the username for Google OAuth2 + clientId: '' # client ID for Google OAuth2 + clientSecret: '' # client secret for Google OAuth2 + scopes: https://www.googleapis.com/auth/userinfo.email, https://www.googleapis.com/auth/userinfo.profile # scopes for Google OAuth2 + useAsUsername: email # field to use as the username for Google OAuth2 github: - clientId: '' # Client ID for GitHub OAuth2 - clientSecret: '' # Client Secret for GitHub OAuth2 - scopes: read:user # Scope for GitHub OAuth2 - useAsUsername: login # Field to use as the username for GitHub OAuth2 - issuer: '' # set to any provider that supports OpenID Connect Discovery (/.well-known/openid-configuration) end-point - clientId: '' # Client ID from your provider - clientSecret: '' # Client Secret from your provider + clientId: '' # client ID for GitHub OAuth2 + clientSecret: '' # client secret for GitHub OAuth2 + scopes: read:user # scope for GitHub OAuth2 + useAsUsername: login # field to use as the username for GitHub OAuth2 + issuer: '' # set to any provider that supports OpenID Connect Discovery (/.well-known/openid-configuration) endpoint + clientId: '' # client ID from your provider + clientSecret: '' # client secret from your provider autoCreateUser: false # set to 'true' to allow auto-creation of non-existing users blockRegistration: false # set to 'true' to deny login with SSO without prior registration by an admin - useAsUsername: email # Default is 'email'; custom fields can be used as the username - scopes: openid, profile, email # Specify the scopes for which the application will request permissions - provider: google # Set this to your OAuth provider's name, e.g., 'google' or 'keycloak' - saml2: - enabled: false # Currently in alpha, not recommended for use yet, enableAlphaFunctionality must be set to true + useAsUsername: email # default is 'email'; custom fields can be used as the username + scopes: openid, profile, email # specify the scopes for which the application will request permissions + provider: google # set this to your OAuth provider's name, e.g., 'google' or 'keycloak' + saml2: + enabled: false # currently in alpha, not recommended for use yet, enableAlphaFunctionality must be set to true autoCreateUser: false # set to 'true' to allow auto-creation of non-existing users blockRegistration: false # set to 'true' to deny login with SSO without prior registration by an admin registrationId: stirling @@ -56,7 +56,7 @@ security: idpSingleLogoutUrl: https://dev-XXXXXXXX.okta.com/app/dev-XXXXXXXX_stirlingpdf_1/externalKey/slo/saml idpSingleLoginUrl: https://dev-XXXXXXXX.okta.com/app/dev-XXXXXXXX_stirlingpdf_1/externalKey/sso/saml idpIssuer: http://www.okta.com/externalKey - idpCert: classpath:octa.crt + idpCert: classpath:okta.crt privateKey: classpath:saml-private-key.key spCert: classpath:saml-public-cert.crt @@ -65,35 +65,35 @@ enterpriseEdition: key: 00000000-0000-0000-0000-000000000000 CustomMetadata: autoUpdateMetadata: false # set to 'true' to automatically update metadata with below values - author: username # Supports text such as 'John Doe' or types such as username to autopopulate with users username - creator: Stirling-PDF # Supports text such as 'Company-PDF' - producer: Stirling-PDF # Supports text such as 'Company-PDF' + author: username # supports text such as 'John Doe' or types such as username to autopopulate with user's username + creator: Stirling-PDF # supports text such as 'Company-PDF' + producer: Stirling-PDF # supports text such as 'Company-PDF' legal: - termsAndConditions: https://www.stirlingpdf.com/terms-and-conditions # URL to the terms and conditions of your application (e.g. https://example.com/terms) Empty string to disable or filename to load from local file in static folder - privacyPolicy: https://www.stirlingpdf.com/privacy-policy # URL to the privacy policy of your application (e.g. https://example.com/privacy) Empty string to disable or filename to load from local file in static folder - accessibilityStatement: '' # URL to the accessibility statement of your application (e.g. https://example.com/accessibility) Empty string to disable or filename to load from local file in static folder - cookiePolicy: '' # URL to the cookie policy of your application (e.g. https://example.com/cookie) Empty string to disable or filename to load from local file in static folder - impressum: '' # URL to the impressum of your application (e.g. https://example.com/impressum) Empty string to disable or filename to load from local file in static folder + termsAndConditions: https://www.stirlingpdf.com/terms-and-conditions # URL to the terms and conditions of your application (e.g. https://example.com/terms). Empty string to disable or filename to load from local file in static folder + privacyPolicy: https://www.stirlingpdf.com/privacy-policy # URL to the privacy policy of your application (e.g. https://example.com/privacy). Empty string to disable or filename to load from local file in static folder + accessibilityStatement: '' # URL to the accessibility statement of your application (e.g. https://example.com/accessibility). Empty string to disable or filename to load from local file in static folder + cookiePolicy: '' # URL to the cookie policy of your application (e.g. https://example.com/cookie). Empty string to disable or filename to load from local file in static folder + impressum: '' # URL to the impressum of your application (e.g. https://example.com/impressum). Empty string to disable or filename to load from local file in static folder system: - defaultLocale: en-US # Set the default language (e.g. 'de-DE', 'fr-FR', etc) + defaultLocale: en-US # set the default language (e.g. 'de-DE', 'fr-FR', etc) googlevisibility: false # 'true' to allow Google visibility (via robots.txt), 'false' to disallow - enableAlphaFunctionality: false # Set to enable functionality which might need more testing before it fully goes live (This feature might make no changes) + enableAlphaFunctionality: false # set to enable functionality which might need more testing before it fully goes live (this feature might make no changes) showUpdate: false # see when a new update is available - showUpdateOnlyAdmin: false # Only admins can see when a new update is available, depending on showUpdate it must be set to 'true' - customHTMLFiles: false # enable to have files placed in /customFiles/templates override the existing template html files - tessdataDir: /usr/share/tessdata # Path to the directory containing the Tessdata files. This setting is relevant for Windows systems. For Windows users, this path should be adjusted to point to the appropriate directory where the Tessdata files are stored. - enableAnalytics: undefined # Set to 'true' to enable analytics, set to 'false' to disable analytics, for enterprise users this is set to true + showUpdateOnlyAdmin: false # only admins can see when a new update is available, depending on showUpdate it must be set to 'true' + customHTMLFiles: false # enable to have files placed in /customFiles/templates override the existing template HTML files + tessdataDir: /usr/share/tessdata # path to the directory containing the Tessdata files. This setting is relevant for Windows systems. For Windows users, this path should be adjusted to point to the appropriate directory where the Tessdata files are stored. + enableAnalytics: undefined # set to 'true' to enable analytics, set to 'false' to disable analytics; for enterprise users, this is set to true ui: - appName: '' # Application's visible name - homeDescription: '' # Short description or tagline shown on homepage. - appNameNavbar: '' # Name displayed on the navigation bar + appName: '' # application's visible name + homeDescription: '' # short description or tagline shown on the homepage + appNameNavbar: '' # name displayed on the navigation bar endpoints: - toRemove: [] # List endpoints to disable (e.g. ['img-to-pdf', 'remove-pages']) - groupsToRemove: [] # List groups to disable (e.g. ['LibreOffice']) + toRemove: [] # list endpoints to disable (e.g. ['img-to-pdf', 'remove-pages']) + groupsToRemove: [] # list groups to disable (e.g. ['LibreOffice']) metrics: enabled: true # 'true' to enable Info APIs (`/api/*`) endpoints, 'false' to disable @@ -102,3 +102,22 @@ metrics: AutomaticallyGenerated: key: example UUID: example + +processExecutor: + sessionLimit: # Process executor instances limits + libreOfficeSessionLimit: 1 + pdfToHtmlSessionLimit: 1 + ocrMyPdfSessionLimit: 2 + pythonOpenCvSessionLimit: 8 + ghostScriptSessionLimit: 16 + weasyPrintSessionLimit: 16 + installAppSessionLimit: 1 + calibreSessionLimit: 1 + timeoutMinutes: # Process executor timeout in minutes + libreOfficetimeoutMinutes: 30 + pdfToHtmltimeoutMinutes: 20 + pythonOpenCvtimeoutMinutes: 30 + ghostScripttimeoutMinutes: 30 + weasyPrinttimeoutMinutes: 30 + installApptimeoutMinutes: 60 + calibretimeoutMinutes: 30 diff --git a/src/main/resources/static/3rdPartyLicenses.json b/src/main/resources/static/3rdPartyLicenses.json index 4c60ddd3c..789ebe0fb 100644 --- a/src/main/resources/static/3rdPartyLicenses.json +++ b/src/main/resources/static/3rdPartyLicenses.json @@ -3,17 +3,24 @@ { "moduleName": "ch.qos.logback:logback-classic", "moduleUrl": "http://www.qos.ch", - "moduleVersion": "1.5.8", + "moduleVersion": "1.5.11", "moduleLicense": "GNU Lesser General Public License", "moduleLicenseUrl": "http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html" }, { "moduleName": "ch.qos.logback:logback-core", "moduleUrl": "http://www.qos.ch", - "moduleVersion": "1.5.8", + "moduleVersion": "1.5.11", "moduleLicense": "GNU Lesser General Public License", "moduleLicenseUrl": "http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html" }, + { + "moduleName": "com.adobe.xmp:xmpcore", + "moduleUrl": "https://www.adobe.com/devnet/xmp/library/eula-xmp-library-java.html", + "moduleVersion": "6.1.11", + "moduleLicense": "The BSD 3-Clause License (BSD3)", + "moduleLicenseUrl": "https://opensource.org/licenses/BSD-3-Clause" + }, { "moduleName": "com.bucket4j:bucket4j_jdk17-core", "moduleUrl": "http://github.com/bucket4j/bucket4j/bucket4j_jdk17-core", @@ -28,6 +35,13 @@ "moduleLicense": "MIT", "moduleLicenseUrl": "https://opensource.org/licenses/MIT" }, + { + "moduleName": "com.drewnoakes:metadata-extractor", + "moduleUrl": "https://drewnoakes.com/code/exif/", + "moduleVersion": "2.19.0", + "moduleLicense": "The Apache Software License, Version 2.0", + "moduleLicenseUrl": "http://www.apache.org/licenses/LICENSE-2.0.txt" + }, { "moduleName": "com.fasterxml.jackson.core:jackson-annotations", "moduleUrl": "https://github.com/FasterXML/jackson", @@ -400,7 +414,7 @@ { "moduleName": "io.micrometer:micrometer-commons", "moduleUrl": "https://github.com/micrometer-metrics/micrometer", - "moduleVersion": "1.13.4", + "moduleVersion": "1.13.6", "moduleLicense": "The Apache Software License, Version 2.0", "moduleLicenseUrl": "http://www.apache.org/licenses/LICENSE-2.0.txt" }, @@ -414,14 +428,14 @@ { "moduleName": "io.micrometer:micrometer-jakarta9", "moduleUrl": "https://github.com/micrometer-metrics/micrometer", - "moduleVersion": "1.13.4", + "moduleVersion": "1.13.6", "moduleLicense": "The Apache Software License, Version 2.0", "moduleLicenseUrl": "http://www.apache.org/licenses/LICENSE-2.0.txt" }, { "moduleName": "io.micrometer:micrometer-observation", "moduleUrl": "https://github.com/micrometer-metrics/micrometer", - "moduleVersion": "1.13.4", + "moduleVersion": "1.13.6", "moduleLicense": "The Apache Software License, Version 2.0", "moduleLicenseUrl": "http://www.apache.org/licenses/LICENSE-2.0.txt" }, @@ -681,7 +695,7 @@ { "moduleName": "org.apache.tomcat.embed:tomcat-embed-el", "moduleUrl": "https://tomcat.apache.org/", - "moduleVersion": "10.1.30", + "moduleVersion": "10.1.31", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "http://www.apache.org/licenses/LICENSE-2.0.txt" }, @@ -776,182 +790,182 @@ { "moduleName": "org.eclipse.jetty.ee10.websocket:jetty-ee10-websocket-jakarta-client", "moduleUrl": "https://jetty.org/", - "moduleVersion": "12.0.13", + "moduleVersion": "12.0.14", "moduleLicense": "Eclipse Public License - Version 2.0", "moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/" }, { "moduleName": "org.eclipse.jetty.ee10.websocket:jetty-ee10-websocket-jakarta-common", "moduleUrl": "https://jetty.org/", - "moduleVersion": "12.0.13", + "moduleVersion": "12.0.14", "moduleLicense": "Eclipse Public License - Version 2.0", "moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/" }, { "moduleName": "org.eclipse.jetty.ee10.websocket:jetty-ee10-websocket-jakarta-server", "moduleUrl": "https://jetty.org/", - "moduleVersion": "12.0.13", + "moduleVersion": "12.0.14", "moduleLicense": "Eclipse Public License - Version 2.0", "moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/" }, { "moduleName": "org.eclipse.jetty.ee10.websocket:jetty-ee10-websocket-jetty-server", "moduleUrl": "https://jetty.org/", - "moduleVersion": "12.0.13", + "moduleVersion": "12.0.14", "moduleLicense": "Eclipse Public License - Version 2.0", "moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/" }, { "moduleName": "org.eclipse.jetty.ee10.websocket:jetty-ee10-websocket-servlet", "moduleUrl": "https://jetty.org/", - "moduleVersion": "12.0.13", + "moduleVersion": "12.0.14", "moduleLicense": "Eclipse Public License - Version 2.0", "moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/" }, { "moduleName": "org.eclipse.jetty.ee10:jetty-ee10-annotations", "moduleUrl": "https://jetty.org/", - "moduleVersion": "12.0.13", + "moduleVersion": "12.0.14", "moduleLicense": "Eclipse Public License - Version 2.0", "moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/" }, { "moduleName": "org.eclipse.jetty.ee10:jetty-ee10-plus", "moduleUrl": "https://jetty.org/", - "moduleVersion": "12.0.13", + "moduleVersion": "12.0.14", "moduleLicense": "Eclipse Public License - Version 2.0", "moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/" }, { "moduleName": "org.eclipse.jetty.ee10:jetty-ee10-servlet", "moduleUrl": "https://jetty.org/", - "moduleVersion": "12.0.13", + "moduleVersion": "12.0.14", "moduleLicense": "Eclipse Public License - Version 2.0", "moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/" }, { "moduleName": "org.eclipse.jetty.ee10:jetty-ee10-servlets", "moduleUrl": "https://jetty.org/", - "moduleVersion": "12.0.13", + "moduleVersion": "12.0.14", "moduleLicense": "Eclipse Public License - Version 2.0", "moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/" }, { "moduleName": "org.eclipse.jetty.ee10:jetty-ee10-webapp", "moduleUrl": "https://jetty.org/", - "moduleVersion": "12.0.13", + "moduleVersion": "12.0.14", "moduleLicense": "Eclipse Public License - Version 2.0", "moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/" }, { "moduleName": "org.eclipse.jetty.websocket:jetty-websocket-core-client", "moduleUrl": "https://jetty.org/", - "moduleVersion": "12.0.13", + "moduleVersion": "12.0.14", "moduleLicense": "Eclipse Public License - Version 2.0", "moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/" }, { "moduleName": "org.eclipse.jetty.websocket:jetty-websocket-core-common", "moduleUrl": "https://jetty.org/", - "moduleVersion": "12.0.13", + "moduleVersion": "12.0.14", "moduleLicense": "Eclipse Public License - Version 2.0", "moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/" }, { "moduleName": "org.eclipse.jetty.websocket:jetty-websocket-core-server", "moduleUrl": "https://jetty.org/", - "moduleVersion": "12.0.13", + "moduleVersion": "12.0.14", "moduleLicense": "Eclipse Public License - Version 2.0", "moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/" }, { "moduleName": "org.eclipse.jetty.websocket:jetty-websocket-jetty-api", "moduleUrl": "https://jetty.org/", - "moduleVersion": "12.0.13", + "moduleVersion": "12.0.14", "moduleLicense": "Eclipse Public License - Version 2.0", "moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/" }, { "moduleName": "org.eclipse.jetty.websocket:jetty-websocket-jetty-common", "moduleUrl": "https://jetty.org/", - "moduleVersion": "12.0.13", + "moduleVersion": "12.0.14", "moduleLicense": "Eclipse Public License - Version 2.0", "moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/" }, { "moduleName": "org.eclipse.jetty:jetty-alpn-client", "moduleUrl": "https://jetty.org/", - "moduleVersion": "12.0.13", + "moduleVersion": "12.0.14", "moduleLicense": "Eclipse Public License - Version 2.0", "moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/" }, { "moduleName": "org.eclipse.jetty:jetty-client", "moduleUrl": "https://jetty.org/", - "moduleVersion": "12.0.13", + "moduleVersion": "12.0.14", "moduleLicense": "Eclipse Public License - Version 2.0", "moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/" }, { "moduleName": "org.eclipse.jetty:jetty-ee", "moduleUrl": "https://jetty.org/", - "moduleVersion": "12.0.13", + "moduleVersion": "12.0.14", "moduleLicense": "Eclipse Public License - Version 2.0", "moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/" }, { "moduleName": "org.eclipse.jetty:jetty-http", "moduleUrl": "https://jetty.org/", - "moduleVersion": "12.0.13", + "moduleVersion": "12.0.14", "moduleLicense": "Eclipse Public License - Version 2.0", "moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/" }, { "moduleName": "org.eclipse.jetty:jetty-io", "moduleUrl": "https://jetty.org/", - "moduleVersion": "12.0.13", + "moduleVersion": "12.0.14", "moduleLicense": "Eclipse Public License - Version 2.0", "moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/" }, { "moduleName": "org.eclipse.jetty:jetty-plus", "moduleUrl": "https://jetty.org/", - "moduleVersion": "12.0.13", + "moduleVersion": "12.0.14", "moduleLicense": "Eclipse Public License - Version 2.0", "moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/" }, { "moduleName": "org.eclipse.jetty:jetty-security", "moduleUrl": "https://jetty.org/", - "moduleVersion": "12.0.13", + "moduleVersion": "12.0.14", "moduleLicense": "Eclipse Public License - Version 2.0", "moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/" }, { "moduleName": "org.eclipse.jetty:jetty-server", "moduleUrl": "https://jetty.org/", - "moduleVersion": "12.0.13", + "moduleVersion": "12.0.14", "moduleLicense": "Eclipse Public License - Version 2.0", "moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/" }, { "moduleName": "org.eclipse.jetty:jetty-session", "moduleUrl": "https://jetty.org/", - "moduleVersion": "12.0.13", + "moduleVersion": "12.0.14", "moduleLicense": "Eclipse Public License - Version 2.0", "moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/" }, { "moduleName": "org.eclipse.jetty:jetty-util", "moduleUrl": "https://jetty.org/", - "moduleVersion": "12.0.13", + "moduleVersion": "12.0.14", "moduleLicense": "Eclipse Public License - Version 2.0", "moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/" }, { "moduleName": "org.eclipse.jetty:jetty-xml", "moduleUrl": "https://jetty.org/", - "moduleVersion": "12.0.13", + "moduleVersion": "12.0.14", "moduleLicense": "Eclipse Public License - Version 2.0", "moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/" }, @@ -1139,266 +1153,266 @@ { "moduleName": "org.springframework.boot:spring-boot", "moduleUrl": "https://spring.io/projects/spring-boot", - "moduleVersion": "3.3.4", + "moduleVersion": "3.3.5", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, { "moduleName": "org.springframework.boot:spring-boot-actuator", "moduleUrl": "https://spring.io/projects/spring-boot", - "moduleVersion": "3.3.4", + "moduleVersion": "3.3.5", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, { "moduleName": "org.springframework.boot:spring-boot-actuator-autoconfigure", "moduleUrl": "https://spring.io/projects/spring-boot", - "moduleVersion": "3.3.4", + "moduleVersion": "3.3.5", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, { "moduleName": "org.springframework.boot:spring-boot-autoconfigure", "moduleUrl": "https://spring.io/projects/spring-boot", - "moduleVersion": "3.3.4", + "moduleVersion": "3.3.5", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, { "moduleName": "org.springframework.boot:spring-boot-devtools", "moduleUrl": "https://spring.io/projects/spring-boot", - "moduleVersion": "3.3.4", + "moduleVersion": "3.3.5", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, { "moduleName": "org.springframework.boot:spring-boot-starter", "moduleUrl": "https://spring.io/projects/spring-boot", - "moduleVersion": "3.3.4", + "moduleVersion": "3.3.5", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, { "moduleName": "org.springframework.boot:spring-boot-starter-actuator", "moduleUrl": "https://spring.io/projects/spring-boot", - "moduleVersion": "3.3.4", + "moduleVersion": "3.3.5", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, { "moduleName": "org.springframework.boot:spring-boot-starter-aop", "moduleUrl": "https://spring.io/projects/spring-boot", - "moduleVersion": "3.3.4", + "moduleVersion": "3.3.5", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, { "moduleName": "org.springframework.boot:spring-boot-starter-data-jpa", "moduleUrl": "https://spring.io/projects/spring-boot", - "moduleVersion": "3.3.4", + "moduleVersion": "3.3.5", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, { "moduleName": "org.springframework.boot:spring-boot-starter-jdbc", "moduleUrl": "https://spring.io/projects/spring-boot", - "moduleVersion": "3.3.4", + "moduleVersion": "3.3.5", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, { "moduleName": "org.springframework.boot:spring-boot-starter-jetty", "moduleUrl": "https://spring.io/projects/spring-boot", - "moduleVersion": "3.3.4", + "moduleVersion": "3.3.5", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, { "moduleName": "org.springframework.boot:spring-boot-starter-json", "moduleUrl": "https://spring.io/projects/spring-boot", - "moduleVersion": "3.3.4", + "moduleVersion": "3.3.5", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, { "moduleName": "org.springframework.boot:spring-boot-starter-logging", "moduleUrl": "https://spring.io/projects/spring-boot", - "moduleVersion": "3.3.4", + "moduleVersion": "3.3.5", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, { "moduleName": "org.springframework.boot:spring-boot-starter-oauth2-client", "moduleUrl": "https://spring.io/projects/spring-boot", - "moduleVersion": "3.3.4", + "moduleVersion": "3.3.5", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, { "moduleName": "org.springframework.boot:spring-boot-starter-security", "moduleUrl": "https://spring.io/projects/spring-boot", - "moduleVersion": "3.3.4", + "moduleVersion": "3.3.5", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, { "moduleName": "org.springframework.boot:spring-boot-starter-thymeleaf", "moduleUrl": "https://spring.io/projects/spring-boot", - "moduleVersion": "3.3.4", + "moduleVersion": "3.3.5", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, { "moduleName": "org.springframework.boot:spring-boot-starter-web", "moduleUrl": "https://spring.io/projects/spring-boot", - "moduleVersion": "3.3.4", + "moduleVersion": "3.3.5", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, { "moduleName": "org.springframework.data:spring-data-commons", "moduleUrl": "https://spring.io/projects/spring-data", - "moduleVersion": "3.3.4", + "moduleVersion": "3.3.5", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, { "moduleName": "org.springframework.data:spring-data-jpa", "moduleUrl": "https://projects.spring.io/spring-data-jpa", - "moduleVersion": "3.3.4", + "moduleVersion": "3.3.5", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, { "moduleName": "org.springframework.security:spring-security-config", "moduleUrl": "https://spring.io/projects/spring-security", - "moduleVersion": "6.3.3", + "moduleVersion": "6.3.4", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, { "moduleName": "org.springframework.security:spring-security-core", "moduleUrl": "https://spring.io/projects/spring-security", - "moduleVersion": "6.3.3", + "moduleVersion": "6.3.4", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, { "moduleName": "org.springframework.security:spring-security-crypto", "moduleUrl": "https://spring.io/projects/spring-security", - "moduleVersion": "6.3.3", + "moduleVersion": "6.3.4", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, { "moduleName": "org.springframework.security:spring-security-oauth2-client", "moduleUrl": "https://spring.io/projects/spring-security", - "moduleVersion": "6.3.3", + "moduleVersion": "6.3.4", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, { "moduleName": "org.springframework.security:spring-security-oauth2-core", "moduleUrl": "https://spring.io/projects/spring-security", - "moduleVersion": "6.3.3", + "moduleVersion": "6.3.4", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, { "moduleName": "org.springframework.security:spring-security-oauth2-jose", "moduleUrl": "https://spring.io/projects/spring-security", - "moduleVersion": "6.3.3", + "moduleVersion": "6.3.4", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, { "moduleName": "org.springframework.security:spring-security-saml2-service-provider", "moduleUrl": "https://spring.io/projects/spring-security", - "moduleVersion": "6.3.3", + "moduleVersion": "6.3.4", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, { "moduleName": "org.springframework.security:spring-security-web", "moduleUrl": "https://spring.io/projects/spring-security", - "moduleVersion": "6.3.3", + "moduleVersion": "6.3.4", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, { "moduleName": "org.springframework:spring-aop", "moduleUrl": "https://github.com/spring-projects/spring-framework", - "moduleVersion": "6.1.13", + "moduleVersion": "6.1.14", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, { "moduleName": "org.springframework:spring-aspects", "moduleUrl": "https://github.com/spring-projects/spring-framework", - "moduleVersion": "6.1.13", + "moduleVersion": "6.1.14", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, { "moduleName": "org.springframework:spring-beans", "moduleUrl": "https://github.com/spring-projects/spring-framework", - "moduleVersion": "6.1.13", + "moduleVersion": "6.1.14", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, { "moduleName": "org.springframework:spring-context", "moduleUrl": "https://github.com/spring-projects/spring-framework", - "moduleVersion": "6.1.13", + "moduleVersion": "6.1.14", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, { "moduleName": "org.springframework:spring-core", "moduleUrl": "https://github.com/spring-projects/spring-framework", - "moduleVersion": "6.1.13", + "moduleVersion": "6.1.14", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, { "moduleName": "org.springframework:spring-expression", "moduleUrl": "https://github.com/spring-projects/spring-framework", - "moduleVersion": "6.1.13", + "moduleVersion": "6.1.14", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, { "moduleName": "org.springframework:spring-jcl", "moduleUrl": "https://github.com/spring-projects/spring-framework", - "moduleVersion": "6.1.13", + "moduleVersion": "6.1.14", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, { "moduleName": "org.springframework:spring-jdbc", "moduleUrl": "https://github.com/spring-projects/spring-framework", - "moduleVersion": "6.1.13", + "moduleVersion": "6.1.14", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, { "moduleName": "org.springframework:spring-orm", "moduleUrl": "https://github.com/spring-projects/spring-framework", - "moduleVersion": "6.1.13", + "moduleVersion": "6.1.14", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, { "moduleName": "org.springframework:spring-tx", "moduleUrl": "https://github.com/spring-projects/spring-framework", - "moduleVersion": "6.1.13", + "moduleVersion": "6.1.14", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, { "moduleName": "org.springframework:spring-web", "moduleUrl": "https://github.com/spring-projects/spring-framework", - "moduleVersion": "6.1.13", + "moduleVersion": "6.1.14", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, diff --git a/src/main/resources/static/css/bootstrap.min.css.map b/src/main/resources/static/css/bootstrap.min.css.map new file mode 100644 index 000000000..3fe6cda5d --- /dev/null +++ b/src/main/resources/static/css/bootstrap.min.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["../../scss/bootstrap.scss","../../scss/_root.scss","../../scss/_reboot.scss","dist/css/bootstrap.css","../../scss/vendor/_rfs.scss","../../scss/mixins/_border-radius.scss","../../scss/_type.scss","../../scss/mixins/_lists.scss","../../scss/_images.scss","../../scss/mixins/_image.scss","../../scss/_containers.scss","../../scss/mixins/_container.scss","../../scss/mixins/_breakpoints.scss","../../scss/_grid.scss","../../scss/mixins/_grid.scss","../../scss/_tables.scss","../../scss/mixins/_table-variants.scss","../../scss/forms/_labels.scss","../../scss/forms/_form-text.scss","../../scss/forms/_form-control.scss","../../scss/mixins/_transition.scss","../../scss/mixins/_gradients.scss","../../scss/forms/_form-select.scss","../../scss/forms/_form-check.scss","../../scss/forms/_form-range.scss","../../scss/forms/_floating-labels.scss","../../scss/forms/_input-group.scss","../../scss/mixins/_forms.scss","../../scss/_buttons.scss","../../scss/mixins/_buttons.scss","../../scss/_transitions.scss","../../scss/_dropdown.scss","../../scss/mixins/_caret.scss","../../scss/_button-group.scss","../../scss/_nav.scss","../../scss/_navbar.scss","../../scss/_card.scss","../../scss/_accordion.scss","../../scss/_breadcrumb.scss","../../scss/_pagination.scss","../../scss/mixins/_pagination.scss","../../scss/_badge.scss","../../scss/_alert.scss","../../scss/mixins/_alert.scss","../../scss/_progress.scss","../../scss/_list-group.scss","../../scss/mixins/_list-group.scss","../../scss/_close.scss","../../scss/_toasts.scss","../../scss/_modal.scss","../../scss/_tooltip.scss","../../scss/mixins/_reset-text.scss","../../scss/_popover.scss","../../scss/_carousel.scss","../../scss/mixins/_clearfix.scss","../../scss/_spinners.scss","../../scss/_offcanvas.scss","../../scss/helpers/_colored-links.scss","../../scss/helpers/_ratio.scss","../../scss/helpers/_position.scss","../../scss/helpers/_visually-hidden.scss","../../scss/mixins/_visually-hidden.scss","../../scss/helpers/_stretched-link.scss","../../scss/helpers/_text-truncation.scss","../../scss/mixins/_text-truncate.scss","../../scss/mixins/_utilities.scss","../../scss/utilities/_api.scss"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Bootstrap v5.0.2 (https://getbootstrap.com/)\n * Copyright 2011-2021 The Bootstrap Authors\n * Copyright 2011-2021 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n */\n\n// scss-docs-start import-stack\n// Configuration\n@import \"functions\";\n@import \"variables\";\n@import \"mixins\";\n@import \"utilities\";\n\n// Layout & components\n@import \"root\";\n@import \"reboot\";\n@import \"type\";\n@import \"images\";\n@import \"containers\";\n@import \"grid\";\n@import \"tables\";\n@import \"forms\";\n@import \"buttons\";\n@import \"transitions\";\n@import \"dropdown\";\n@import \"button-group\";\n@import \"nav\";\n@import \"navbar\";\n@import \"card\";\n@import \"accordion\";\n@import \"breadcrumb\";\n@import \"pagination\";\n@import \"badge\";\n@import \"alert\";\n@import \"progress\";\n@import \"list-group\";\n@import \"close\";\n@import \"toasts\";\n@import \"modal\";\n@import \"tooltip\";\n@import \"popover\";\n@import \"carousel\";\n@import \"spinners\";\n@import \"offcanvas\";\n\n// Helpers\n@import \"helpers\";\n\n// Utilities\n@import \"utilities/api\";\n// scss-docs-end import-stack\n",":root {\n // Custom variable values only support SassScript inside `#{}`.\n @each $color, $value in $colors {\n --#{$variable-prefix}#{$color}: #{$value};\n }\n\n @each $color, $value in $theme-colors {\n --#{$variable-prefix}#{$color}: #{$value};\n }\n\n // Use `inspect` for lists so that quoted items keep the quotes.\n // See https://github.com/sass/sass/issues/2383#issuecomment-336349172\n --#{$variable-prefix}font-sans-serif: #{inspect($font-family-sans-serif)};\n --#{$variable-prefix}font-monospace: #{inspect($font-family-monospace)};\n --#{$variable-prefix}gradient: #{$gradient};\n}\n","// stylelint-disable declaration-no-important, selector-no-qualifying-type, property-no-vendor-prefix\n\n\n// Reboot\n//\n// Normalization of HTML elements, manually forked from Normalize.css to remove\n// styles targeting irrelevant browsers while applying new styles.\n//\n// Normalize is licensed MIT. https://github.com/necolas/normalize.css\n\n\n// Document\n//\n// Change from `box-sizing: content-box` so that `width` is not affected by `padding` or `border`.\n\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\n\n// Root\n//\n// Ability to the value of the root font sizes, affecting the value of `rem`.\n// null by default, thus nothing is generated.\n\n:root {\n font-size: $font-size-root;\n\n @if $enable-smooth-scroll {\n @media (prefers-reduced-motion: no-preference) {\n scroll-behavior: smooth;\n }\n }\n}\n\n\n// Body\n//\n// 1. Remove the margin in all browsers.\n// 2. As a best practice, apply a default `background-color`.\n// 3. Prevent adjustments of font size after orientation changes in iOS.\n// 4. Change the default tap highlight to be completely transparent in iOS.\n\nbody {\n margin: 0; // 1\n font-family: $font-family-base;\n @include font-size($font-size-base);\n font-weight: $font-weight-base;\n line-height: $line-height-base;\n color: $body-color;\n text-align: $body-text-align;\n background-color: $body-bg; // 2\n -webkit-text-size-adjust: 100%; // 3\n -webkit-tap-highlight-color: rgba($black, 0); // 4\n}\n\n\n// Content grouping\n//\n// 1. Reset Firefox's gray color\n// 2. Set correct height and prevent the `size` attribute to make the `hr` look like an input field\n\nhr {\n margin: $hr-margin-y 0;\n color: $hr-color; // 1\n background-color: currentColor;\n border: 0;\n opacity: $hr-opacity;\n}\n\nhr:not([size]) {\n height: $hr-height; // 2\n}\n\n\n// Typography\n//\n// 1. Remove top margins from headings\n// By default, `

`-`

` all receive top and bottom margins. We nuke the top\n// margin for easier control within type scales as it avoids margin collapsing.\n\n%heading {\n margin-top: 0; // 1\n margin-bottom: $headings-margin-bottom;\n font-family: $headings-font-family;\n font-style: $headings-font-style;\n font-weight: $headings-font-weight;\n line-height: $headings-line-height;\n color: $headings-color;\n}\n\nh1 {\n @extend %heading;\n @include font-size($h1-font-size);\n}\n\nh2 {\n @extend %heading;\n @include font-size($h2-font-size);\n}\n\nh3 {\n @extend %heading;\n @include font-size($h3-font-size);\n}\n\nh4 {\n @extend %heading;\n @include font-size($h4-font-size);\n}\n\nh5 {\n @extend %heading;\n @include font-size($h5-font-size);\n}\n\nh6 {\n @extend %heading;\n @include font-size($h6-font-size);\n}\n\n\n// Reset margins on paragraphs\n//\n// Similarly, the top margin on `

`s get reset. However, we also reset the\n// bottom margin to use `rem` units instead of `em`.\n\np {\n margin-top: 0;\n margin-bottom: $paragraph-margin-bottom;\n}\n\n\n// Abbreviations\n//\n// 1. Duplicate behavior to the data-bs-* attribute for our tooltip plugin\n// 2. Add the correct text decoration in Chrome, Edge, Opera, and Safari.\n// 3. Add explicit cursor to indicate changed behavior.\n// 4. Prevent the text-decoration to be skipped.\n\nabbr[title],\nabbr[data-bs-original-title] { // 1\n text-decoration: underline dotted; // 2\n cursor: help; // 3\n text-decoration-skip-ink: none; // 4\n}\n\n\n// Address\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\n\n// Lists\n\nol,\nul {\n padding-left: 2rem;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: $dt-font-weight;\n}\n\n// 1. Undo browser default\n\ndd {\n margin-bottom: .5rem;\n margin-left: 0; // 1\n}\n\n\n// Blockquote\n\nblockquote {\n margin: 0 0 1rem;\n}\n\n\n// Strong\n//\n// Add the correct font weight in Chrome, Edge, and Safari\n\nb,\nstrong {\n font-weight: $font-weight-bolder;\n}\n\n\n// Small\n//\n// Add the correct font size in all browsers\n\nsmall {\n @include font-size($small-font-size);\n}\n\n\n// Mark\n\nmark {\n padding: $mark-padding;\n background-color: $mark-bg;\n}\n\n\n// Sub and Sup\n//\n// Prevent `sub` and `sup` elements from affecting the line height in\n// all browsers.\n\nsub,\nsup {\n position: relative;\n @include font-size($sub-sup-font-size);\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub { bottom: -.25em; }\nsup { top: -.5em; }\n\n\n// Links\n\na {\n color: $link-color;\n text-decoration: $link-decoration;\n\n &:hover {\n color: $link-hover-color;\n text-decoration: $link-hover-decoration;\n }\n}\n\n// And undo these styles for placeholder links/named anchors (without href).\n// It would be more straightforward to just use a[href] in previous block, but that\n// causes specificity issues in many other styles that are too complex to fix.\n// See https://github.com/twbs/bootstrap/issues/19402\n\na:not([href]):not([class]) {\n &,\n &:hover {\n color: inherit;\n text-decoration: none;\n }\n}\n\n\n// Code\n\npre,\ncode,\nkbd,\nsamp {\n font-family: $font-family-code;\n @include font-size(1em); // Correct the odd `em` font sizing in all browsers.\n direction: ltr #{\"/* rtl:ignore */\"};\n unicode-bidi: bidi-override;\n}\n\n// 1. Remove browser default top margin\n// 2. Reset browser default of `1em` to use `rem`s\n// 3. Don't allow content to break outside\n\npre {\n display: block;\n margin-top: 0; // 1\n margin-bottom: 1rem; // 2\n overflow: auto; // 3\n @include font-size($code-font-size);\n color: $pre-color;\n\n // Account for some code outputs that place code tags in pre tags\n code {\n @include font-size(inherit);\n color: inherit;\n word-break: normal;\n }\n}\n\ncode {\n @include font-size($code-font-size);\n color: $code-color;\n word-wrap: break-word;\n\n // Streamline the style when inside anchors to avoid broken underline and more\n a > & {\n color: inherit;\n }\n}\n\nkbd {\n padding: $kbd-padding-y $kbd-padding-x;\n @include font-size($kbd-font-size);\n color: $kbd-color;\n background-color: $kbd-bg;\n @include border-radius($border-radius-sm);\n\n kbd {\n padding: 0;\n @include font-size(1em);\n font-weight: $nested-kbd-font-weight;\n }\n}\n\n\n// Figures\n//\n// Apply a consistent margin strategy (matches our type styles).\n\nfigure {\n margin: 0 0 1rem;\n}\n\n\n// Images and content\n\nimg,\nsvg {\n vertical-align: middle;\n}\n\n\n// Tables\n//\n// Prevent double borders\n\ntable {\n caption-side: bottom;\n border-collapse: collapse;\n}\n\ncaption {\n padding-top: $table-cell-padding-y;\n padding-bottom: $table-cell-padding-y;\n color: $table-caption-color;\n text-align: left;\n}\n\n// 1. Removes font-weight bold by inheriting\n// 2. Matches default `` alignment by inheriting `text-align`.\n// 3. Fix alignment for Safari\n\nth {\n font-weight: $table-th-font-weight; // 1\n text-align: inherit; // 2\n text-align: -webkit-match-parent; // 3\n}\n\nthead,\ntbody,\ntfoot,\ntr,\ntd,\nth {\n border-color: inherit;\n border-style: solid;\n border-width: 0;\n}\n\n\n// Forms\n//\n// 1. Allow labels to use `margin` for spacing.\n\nlabel {\n display: inline-block; // 1\n}\n\n// Remove the default `border-radius` that macOS Chrome adds.\n// See https://github.com/twbs/bootstrap/issues/24093\n\nbutton {\n // stylelint-disable-next-line property-disallowed-list\n border-radius: 0;\n}\n\n// Explicitly remove focus outline in Chromium when it shouldn't be\n// visible (e.g. as result of mouse click or touch tap). It already\n// should be doing this automatically, but seems to currently be\n// confused and applies its very visible two-tone outline anyway.\n\nbutton:focus:not(:focus-visible) {\n outline: 0;\n}\n\n// 1. Remove the margin in Firefox and Safari\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0; // 1\n font-family: inherit;\n @include font-size(inherit);\n line-height: inherit;\n}\n\n// Remove the inheritance of text transform in Firefox\nbutton,\nselect {\n text-transform: none;\n}\n// Set the cursor for non-` - - - - - `; + + // Create filename div and set textContent to sanitize + const fileNameDiv = document.createElement("div"); + fileNameDiv.className = "filename"; + fileNameDiv.textContent = files[i].name; + + // Create page info div and set textContent to sanitize + const pageInfoDiv = document.createElement("div"); + pageInfoDiv.className = "page-info"; + const pageCountSpan = document.createElement("span"); + pageCountSpan.className = "page-count"; + pageCountSpan.textContent = `${pageCount} ${pageLabel}`; + pageInfoDiv.appendChild(pageCountSpan); + + // Create arrows div with buttons + const arrowsDiv = document.createElement("div"); + arrowsDiv.className = "arrows d-flex"; + + const moveUpButton = document.createElement("button"); + moveUpButton.className = "btn btn-secondary move-up"; + moveUpButton.innerHTML = ""; + + const moveDownButton = document.createElement("button"); + moveDownButton.className = "btn btn-secondary move-down"; + moveDownButton.innerHTML = ""; + + const removeButton = document.createElement("button"); + removeButton.className = "btn btn-danger remove-file"; + removeButton.innerHTML = "×"; + + arrowsDiv.append(moveUpButton, moveDownButton, removeButton); + + // Append elements to item and then to list + const itemContainer = document.createElement("div"); + itemContainer.className = "d-flex justify-content-between align-items-center w-100"; + itemContainer.append(fileNameDiv, pageInfoDiv, arrowsDiv); + + item.appendChild(itemContainer); list.appendChild(item); } attachMoveButtons(); } + async function getPDFPageCount(file) { const blobUrl = URL.createObjectURL(file); const pdf = await pdfjsLib.getDocument(blobUrl).promise; diff --git a/src/main/resources/static/js/multitool/PdfActionsManager.js b/src/main/resources/static/js/multitool/PdfActionsManager.js index 033b39919..b4da37183 100644 --- a/src/main/resources/static/js/multitool/PdfActionsManager.js +++ b/src/main/resources/static/js/multitool/PdfActionsManager.js @@ -1,6 +1,7 @@ class PdfActionsManager { pageDirection; pagesContainer; + static selectedPages = []; // Static property shared across all instances constructor(id) { this.pagesContainer = document.getElementById(id); @@ -73,6 +74,11 @@ class PdfActionsManager { this.addFiles(imgContainer); } + insertFileBlankButtonCallback(e) { + var imgContainer = this.getPageContainer(e.target); + this.addFiles(imgContainer, true); + } + splitFileButtonCallback(e) { var imgContainer = this.getPageContainer(e.target); imgContainer.classList.toggle("split-before"); @@ -89,9 +95,11 @@ class PdfActionsManager { this.rotateCWButtonCallback = this.rotateCWButtonCallback.bind(this); this.deletePageButtonCallback = this.deletePageButtonCallback.bind(this); this.insertFileButtonCallback = this.insertFileButtonCallback.bind(this); + this.insertFileBlankButtonCallback = this.insertFileBlankButtonCallback.bind(this); this.splitFileButtonCallback = this.splitFileButtonCallback.bind(this); } + adapt(div) { div.classList.add("pdf-actions_container"); const leftDirection = this.pageDirection === "rtl" ? "right" : "left"; @@ -132,6 +140,45 @@ class PdfActionsManager { div.appendChild(buttonContainer); + //enerate checkbox to select individual pages + const selectCheckbox = document.createElement("input"); + selectCheckbox.type = "checkbox"; + selectCheckbox.classList.add("pdf-actions_checkbox", "form-check-input"); + selectCheckbox.id = `selectPageCheckbox`; + selectCheckbox.checked = window.selectAll; + + div.appendChild(selectCheckbox); + + //only show whenpage select mode is active + if (!window.selectPage) { + selectCheckbox.classList.add("hidden"); + } else { + selectCheckbox.classList.remove("hidden"); + } + + selectCheckbox.onchange = () => { + const pageNumber = Array.from(div.parentNode.children).indexOf(div) + 1; + if (selectCheckbox.checked) { + //adds to array of selected pages + window.selectedPages.push(pageNumber); + } else { + //remove page from selected pages array + const index = window.selectedPages.indexOf(pageNumber); + if (index !== -1) { + window.selectedPages.splice(index, 1); + } + } + + if (window.selectedPages.length > 0 && !window.selectPage) { + window.toggleSelectPageVisibility(); + } + if (window.selectedPages.length == 0 && window.selectPage) { + window.toggleSelectPageVisibility(); + } + + window.updateSelectedPagesDisplay(); + }; + const insertFileButtonContainer = document.createElement("div"); insertFileButtonContainer.classList.add( @@ -152,6 +199,12 @@ class PdfActionsManager { splitFileButton.onclick = this.splitFileButtonCallback; insertFileButtonContainer.appendChild(splitFileButton); + const insertFileBlankButton = document.createElement("button"); + insertFileBlankButton.classList.add("btn", "btn-primary", "pdf-actions_insert-file-blank-button"); + insertFileBlankButton.innerHTML = `insert_page_break`; + insertFileBlankButton.onclick = this.insertFileBlankButtonCallback; + insertFileButtonContainer.appendChild(insertFileBlankButton); + div.appendChild(insertFileButtonContainer); // add this button to every element, but only show it on the last one :D @@ -179,15 +232,29 @@ class PdfActionsManager { }; div.addEventListener("mouseenter", () => { + window.updatePageNumbersAndCheckboxes(); const pageNumber = Array.from(div.parentNode.children).indexOf(div) + 1; adaptPageNumber(pageNumber, div); + const checkbox = document.getElementById(`selectPageCheckbox-${pageNumber}`); + if (checkbox && !window.selectPage) { + checkbox.classList.remove("hidden"); + } }); div.addEventListener("mouseleave", () => { + const pageNumber = Array.from(div.parentNode.children).indexOf(div) + 1; const pageNumberElement = div.querySelector(".page-number"); if (pageNumberElement) { div.removeChild(pageNumberElement); } + const checkbox = document.getElementById(`selectPageCheckbox-${pageNumber}`); + if (checkbox && !window.selectPage) { + checkbox.classList.add("hidden"); + } + }); + + document.addEventListener("selectedPagesUpdated", () => { + window.updateSelectedPagesDisplay(); }); return div; diff --git a/src/main/resources/static/js/multitool/PdfContainer.js b/src/main/resources/static/js/multitool/PdfContainer.js index 0cc1a1107..a9642bb4b 100644 --- a/src/main/resources/static/js/multitool/PdfContainer.js +++ b/src/main/resources/static/js/multitool/PdfContainer.js @@ -22,6 +22,12 @@ class PdfContainer { this.nameAndArchiveFiles = this.nameAndArchiveFiles.bind(this); this.splitPDF = this.splitPDF.bind(this); this.splitAll = this.splitAll.bind(this); + this.deleteSelected = this.deleteSelected.bind(this); + this.toggleSelectAll = this.toggleSelectAll.bind(this); + this.updateSelectedPagesDisplay = this.updateSelectedPagesDisplay.bind(this); + this.toggleSelectPageVisibility = this.toggleSelectPageVisibility.bind(this); + this.updatePagesFromCSV = this.updatePagesFromCSV.bind(this); + this.addFilesBlankAll = this.addFilesBlankAll.bind(this) this.pdfAdapters = pdfAdapters; @@ -31,6 +37,7 @@ class PdfContainer { addFiles: this.addFiles, rotateElement: this.rotateElement, updateFilename: this.updateFilename, + deleteSelected: this.deleteSelected, }); }); @@ -38,6 +45,14 @@ class PdfContainer { window.exportPdf = this.exportPdf; window.rotateAll = this.rotateAll; window.splitAll = this.splitAll; + window.deleteSelected = this.deleteSelected; + window.toggleSelectAll = this.toggleSelectAll; + window.updateSelectedPagesDisplay = this.updateSelectedPagesDisplay; + window.toggleSelectPageVisibility = this.toggleSelectPageVisibility; + window.updatePagesFromCSV = this.updatePagesFromCSV; + window.updateSelectedPagesDisplay = this.updateSelectedPagesDisplay; + window.updatePageNumbersAndCheckboxes = this.updatePageNumbersAndCheckboxes; + window.addFilesBlankAll = this.addFilesBlankAll const filenameInput = document.getElementById("filename-input"); const downloadBtn = document.getElementById("export-button"); @@ -77,19 +92,27 @@ class PdfContainer { } } - addFiles(nextSiblingElement) { - var input = document.createElement("input"); - input.type = "file"; - input.multiple = true; - input.setAttribute("accept", "application/pdf,image/*"); - input.onchange = async (e) => { - const files = e.target.files; + addFiles(nextSiblingElement, blank = false) { + if (blank) { - this.addFilesFromFiles(files, nextSiblingElement); - this.updateFilename(files ? files[0].name : ""); - }; + this.addFilesBlank(nextSiblingElement); - input.click(); + } else { + var input = document.createElement("input"); + input.type = "file"; + input.multiple = true; + input.setAttribute("accept", "application/pdf,image/*"); + input.onchange = async (e) => { + const files = e.target.files; + + this.addFilesFromFiles(files, nextSiblingElement); + this.updateFilename(files ? files[0].name : ""); + const selectAll = document.getElementById("select-pages-container"); + selectAll.classList.toggle("hidden", false); + }; + + input.click(); + } } async addFilesFromFiles(files, nextSiblingElement) { @@ -108,6 +131,47 @@ class PdfContainer { }); } + async addFilesBlank(nextSiblingElement) { + const pdfContent = ` + %PDF-1.4 + 1 0 obj + << /Type /Catalog /Pages 2 0 R >> + endobj + 2 0 obj + << /Type /Pages /Kids [3 0 R] /Count 1 >> + endobj + 3 0 obj + << /Type /Page /Parent 2 0 R /MediaBox [0 0 595 842] /Contents 5 0 R >> + endobj + 5 0 obj + << /Length 44 >> + stream + 0 0 0 595 0 842 re + W + n + endstream + endobj + xref + 0 6 + 0000000000 65535 f + 0000000010 00000 n + 0000000071 00000 n + 0000000121 00000 n + 0000000205 00000 n + 0000000400 00000 n + trailer + << /Size 6 /Root 1 0 R >> + startxref + 278 + %%EOF + `; + const blob = new Blob([pdfContent], { type: 'application/pdf' }); + const url = URL.createObjectURL(blob); + const file = new File([blob], "blank_page.pdf", { type: "application/pdf" }); + await this.addPdfFile(file, nextSiblingElement); + } + + rotateElement(element, deg) { var lastTransform = element.style.rotate; if (!lastTransform) { @@ -215,28 +279,246 @@ class PdfContainer { } rotateAll(deg) { - for (var i = 0; i < this.pagesContainer.childNodes.length; i++) { + for (let i = 0; i < this.pagesContainer.childNodes.length; i++) { const child = this.pagesContainer.children[i]; if (!child) continue; + + const pageIndex = i + 1; + //if in page select mode is active rotate only selected pages + if (window.selectPage && !window.selectedPages.includes(pageIndex)) continue; + const img = child.querySelector("img"); if (!img) continue; + this.rotateElement(img, deg); } } + deleteSelected() { + window.selectedPages.sort((a, b) => a - b); + let deletions = 0; + + window.selectedPages.forEach((pageIndex) => { + const adjustedIndex = pageIndex - 1 - deletions; + const child = this.pagesContainer.children[adjustedIndex]; + if (child) { + this.pagesContainer.removeChild(child); + deletions++; + } + }); + + if (this.pagesContainer.childElementCount === 0) { + const filenameInput = document.getElementById("filename-input"); + const filenameParagraph = document.getElementById("filename"); + const downloadBtn = document.getElementById("export-button"); + + if (filenameInput) + filenameInput.disabled = true; + filenameInput.value = ""; + if (filenameParagraph) + filenameParagraph.innerText = ""; + + downloadBtn.disabled = true; + } + + window.selectedPages = []; + this.updatePageNumbersAndCheckboxes(); + document.dispatchEvent(new Event("selectedPagesUpdated")); + } + + toggleSelectAll() { + const checkboxes = document.querySelectorAll(".pdf-actions_checkbox"); + window.selectAll = !window.selectAll; + const selectIcon = document.getElementById("select-icon"); + const deselectIcon = document.getElementById("deselect-icon"); + + if (selectIcon.style.display === "none") { + selectIcon.style.display = "inline"; + deselectIcon.style.display = "none"; + } else { + selectIcon.style.display = "none"; + deselectIcon.style.display = "inline"; + } + checkboxes.forEach((checkbox) => { + + checkbox.checked = window.selectAll; + + const pageNumber = Array.from(checkbox.parentNode.parentNode.children).indexOf(checkbox.parentNode) + 1; + + if (checkbox.checked) { + if (!window.selectedPages.includes(pageNumber)) { + window.selectedPages.push(pageNumber); + } + } else { + const index = window.selectedPages.indexOf(pageNumber); + if (index !== -1) { + window.selectedPages.splice(index, 1); + } + } + }); + + this.updateSelectedPagesDisplay(); + } + + parseCSVInput(csvInput, maxPageIndex) { + const pages = new Set(); + + csvInput.split(",").forEach((item) => { + const range = item.split("-").map((p) => parseInt(p.trim())); + if (range.length === 2) { + const [start, end] = range; + for (let i = start; i <= end && i <= maxPageIndex; i++) { + if (i > 0) { // Ensure the page number is greater than 0 + pages.add(i); + } + } + } else if (range.length === 1 && Number.isInteger(range[0])) { + const page = range[0]; + if (page > 0 && page <= maxPageIndex) { // Ensure page is within valid range + pages.add(page); + } + } + }); + + return Array.from(pages).sort((a, b) => a - b); + } + + updatePagesFromCSV() { + const csvInput = document.getElementById("csv-input").value; + + const allPages = this.pagesContainer.querySelectorAll(".page-container"); + const maxPageIndex = allPages.length; + + window.selectedPages = this.parseCSVInput(csvInput, maxPageIndex); + + this.updateSelectedPagesDisplay(); + + const allCheckboxes = document.querySelectorAll(".pdf-actions_checkbox"); + allCheckboxes.forEach((checkbox) => { + const page = parseInt(checkbox.getAttribute("data-page-number")); + checkbox.checked = window.selectedPages.includes(page); + }); + } + + formatSelectedPages(pages) { + if (pages.length === 0) return ""; + + pages.sort((a, b) => a - b); // Sort the page numbers in ascending order + const ranges = []; + let start = pages[0]; + let end = start; + + for (let i = 1; i < pages.length; i++) { + if (pages[i] === end + 1) { + // Consecutive page, update end + end = pages[i]; + } else { + // Non-consecutive page, finalize current range + ranges.push(start === end ? `${start}` : `${start}-${end}`); + start = pages[i]; + end = start; + } + } + // Add the last range + ranges.push(start === end ? `${start}` : `${start}-${end}`); + + return ranges.join(", "); + } + + updateSelectedPagesDisplay() { + const selectedPagesList = document.getElementById("selected-pages-list"); + const selectedPagesInput = document.getElementById("csv-input"); + selectedPagesList.innerHTML = ""; // Clear the list + + window.selectedPages.forEach((page) => { + const pageItem = document.createElement("div"); + pageItem.className = "page-item"; + + const pageNumber = document.createElement("span"); + const pagelabel = /*[[#{multiTool.page}]]*/ 'Page'; + pageNumber.className = "selected-page-number"; + pageNumber.innerText = `${pagelabel} ${page}`; + pageItem.appendChild(pageNumber); + + const removeBtn = document.createElement("span"); + removeBtn.className = "remove-btn"; + removeBtn.innerHTML = "✕"; + + // Remove page from selected pages list and update display and checkbox + removeBtn.onclick = () => { + window.selectedPages = window.selectedPages.filter((p) => p !== page); + this.updateSelectedPagesDisplay(); + + const checkbox = document.getElementById(`selectPageCheckbox-${page}`); + if (checkbox) { + checkbox.checked = false; + } + }; + + pageItem.appendChild(removeBtn); + selectedPagesList.appendChild(pageItem); + }); + + // Update the input field with the formatted page list + selectedPagesInput.value = this.formatSelectedPages(window.selectedPages); + } + + parsePageRanges(ranges) { + const pages = new Set(); + + ranges.split(',').forEach(range => { + const [start, end] = range.split('-').map(Number); + if (end) { + for (let i = start; i <= end; i++) { + pages.add(i); + } + } else { + pages.add(start); + } + }); + + return Array.from(pages).sort((a, b) => a - b); + } + + addFilesBlankAll() { + const allPages = this.pagesContainer.querySelectorAll(".page-container"); + allPages.forEach((page, index) => { + if (index !== 0) { + this.addFiles(page, true) + } + }); + } + splitAll() { const allPages = this.pagesContainer.querySelectorAll(".page-container"); - if (this.pagesContainer.querySelectorAll(".split-before").length > 0) { - allPages.forEach(page => { - page.classList.remove("split-before"); - }); - } else { - allPages.forEach(page => { - page.classList.add("split-before"); - }); + + if (!window.selectPage) { + const hasSplit = this.pagesContainer.querySelectorAll(".split-before").length > 0; + if (hasSplit) { + allPages.forEach(page => { + page.classList.remove("split-before"); + }); + } else { + allPages.forEach(page => { + page.classList.add("split-before"); + }); + } + return; } + + allPages.forEach((page, index) => { + const pageIndex = index; + if (window.selectPage && !window.selectedPages.includes(pageIndex)) return; + + if (page.classList.contains("split-before")) { + page.classList.remove("split-before"); + } else { + page.classList.add("split-before"); + } + }); } + async splitPDF(baseDocBytes, splitters) { const baseDocument = await PDFLib.PDFDocument.load(baseDocBytes); const pageNum = baseDocument.getPages().length; @@ -279,52 +561,54 @@ class PdfContainer { return zip; } - async exportPdf() { + async exportPdf(selected) { const pdfDoc = await PDFLib.PDFDocument.create(); const pageContainers = this.pagesContainer.querySelectorAll(".page-container"); // Select all .page-container elements for (var i = 0; i < pageContainers.length; i++) { - const img = pageContainers[i].querySelector("img"); // Find the img element within each .page-container - if (!img) continue; - let page; - if (img.doc) { - const pages = await pdfDoc.copyPages(img.doc, [img.pageIdx]); - page = pages[0]; - pdfDoc.addPage(page); - } else { - page = pdfDoc.addPage([img.naturalWidth, img.naturalHeight]); - const imageBytes = await fetch(img.src).then((res) => res.arrayBuffer()); - const uint8Array = new Uint8Array(imageBytes); - const imageType = detectImageType(uint8Array); + if (!selected || window.selectedPages.includes(i + 1)) { + const img = pageContainers[i].querySelector("img"); // Find the img element within each .page-container + if (!img) continue; + let page; + if (img.doc) { + const pages = await pdfDoc.copyPages(img.doc, [img.pageIdx]); + page = pages[0]; + pdfDoc.addPage(page); + } else { + page = pdfDoc.addPage([img.naturalWidth, img.naturalHeight]); + const imageBytes = await fetch(img.src).then((res) => res.arrayBuffer()); + const uint8Array = new Uint8Array(imageBytes); + const imageType = detectImageType(uint8Array); - let image; - switch (imageType) { - case 'PNG': - image = await pdfDoc.embedPng(imageBytes); - break; - case 'JPEG': - image = await pdfDoc.embedJpg(imageBytes); - break; - case 'TIFF': - image = await pdfDoc.embedTiff(imageBytes); - break; - case 'GIF': - console.warn(`Unsupported image type: ${imageType}`); - continue; // Skip this image - default: - console.warn(`Unsupported image type: ${imageType}`); - continue; // Skip this image + let image; + switch (imageType) { + case 'PNG': + image = await pdfDoc.embedPng(imageBytes); + break; + case 'JPEG': + image = await pdfDoc.embedJpg(imageBytes); + break; + case 'TIFF': + image = await pdfDoc.embedTiff(imageBytes); + break; + case 'GIF': + console.warn(`Unsupported image type: ${imageType}`); + continue; // Skip this image + default: + console.warn(`Unsupported image type: ${imageType}`); + continue; // Skip this image + } + page.drawImage(image, { + x: 0, + y: 0, + width: img.naturalWidth, + height: img.naturalHeight, + }); + } + const rotation = img.style.rotate; + if (rotation) { + const rotationAngle = parseInt(rotation.replace(/[^\d-]/g, "")); + page.setRotation(PDFLib.degrees(page.getRotation().angle + rotationAngle)); } - page.drawImage(image, { - x: 0, - y: 0, - width: img.naturalWidth, - height: img.naturalHeight, - }); - } - const rotation = img.style.rotate; - if (rotation) { - const rotationAngle = parseInt(rotation.replace(/[^\d-]/g, "")); - page.setRotation(PDFLib.degrees(page.getRotation().angle + rotationAngle)); } } pdfDoc.setCreator(stirlingPDFLabel); @@ -436,7 +720,44 @@ class PdfContainer { // filenameInput.value.replace('.',''); // } } + + + toggleSelectPageVisibility() { + window.selectPage = !window.selectPage; + const checkboxes = document.querySelectorAll(".pdf-actions_checkbox"); + checkboxes.forEach(checkbox => { + checkbox.classList.toggle("hidden", !window.selectPage); + }); + const deleteButton = document.getElementById("delete-button"); + deleteButton.classList.toggle("hidden", !window.selectPage); + const selectedPages = document.getElementById("selected-pages-display"); + selectedPages.classList.toggle("hidden", !window.selectPage); + const selectAll = document.getElementById("select-All-Container"); + selectedPages.classList.toggle("hidden", !window.selectPage); + const exportSelected = document.getElementById("export-selected-button"); + exportSelected.classList.toggle("hidden", !window.selectPage); + const selectPagesButton = document.getElementById("select-pages-button"); + selectPagesButton.style.opacity = window.selectPage ? "1" : "0.5"; + + if (window.selectPage) { + this.updatePageNumbersAndCheckboxes(); + } + } + + + updatePageNumbersAndCheckboxes() { + const pageDivs = document.querySelectorAll(".pdf-actions_container"); + + pageDivs.forEach((div, index) => { + const pageNumber = index + 1; + const checkbox = div.querySelector(".pdf-actions_checkbox"); + checkbox.id = `selectPageCheckbox-${pageNumber}`; + checkbox.setAttribute("data-page-number", pageNumber); + checkbox.checked = window.selectedPages.includes(pageNumber); + }); + } } + function detectImageType(uint8Array) { // Check for PNG signature if (uint8Array[0] === 137 && uint8Array[1] === 80 && uint8Array[2] === 78 && uint8Array[3] === 71) { @@ -450,7 +771,7 @@ function detectImageType(uint8Array) { // Check for TIFF signature (little-endian and big-endian) if ((uint8Array[0] === 73 && uint8Array[1] === 73 && uint8Array[2] === 42 && uint8Array[3] === 0) || - (uint8Array[0] === 77 && uint8Array[1] === 77 && uint8Array[2] === 0 && uint8Array[3] === 42)) { + (uint8Array[0] === 77 && uint8Array[1] === 77 && uint8Array[2] === 0 && uint8Array[3] === 42)) { return 'TIFF'; } @@ -461,4 +782,7 @@ function detectImageType(uint8Array) { return 'UNKNOWN'; } + + + export default PdfContainer; diff --git a/src/main/resources/static/js/pipeline.js b/src/main/resources/static/js/pipeline.js index 837b6665d..a1542b414 100644 --- a/src/main/resources/static/js/pipeline.js +++ b/src/main/resources/static/js/pipeline.js @@ -119,7 +119,7 @@ document.getElementById("submitConfigBtn").addEventListener("click", function () formData.append("json", pipelineConfigJson); console.log("formData", formData); - fetch("api/v1/pipeline/handleData", { + fetchWithCsrf("api/v1/pipeline/handleData", { method: "POST", body: formData, }) @@ -154,7 +154,7 @@ let apiDocs = {}; let apiSchemas = {}; let operationSettings = {}; -fetch("v1/api-docs") +fetchWithCsrf("v1/api-docs") .then((response) => response.json()) .then((data) => { apiDocs = data.paths; diff --git a/src/main/resources/static/js/search.js b/src/main/resources/static/js/search.js index aec3e6c18..a4d292ea4 100644 --- a/src/main/resources/static/js/search.js +++ b/src/main/resources/static/js/search.js @@ -70,3 +70,37 @@ document.querySelector("#navbarSearchInput").addEventListener("input", function resultsBox.style.width = window.navItemMaxWidth + "px"; }); +const searchDropdown = document.getElementById('searchDropdown'); +const searchInput = document.getElementById('navbarSearchInput'); +const dropdownMenu = searchDropdown.querySelector('.dropdown-menu'); + +// Handle dropdown shown event +searchDropdown.addEventListener('shown.bs.dropdown', function () { + searchInput.focus(); +}); + +// Handle hover opening +searchDropdown.addEventListener('mouseenter', function () { + const dropdownInstance = new bootstrap.Dropdown(searchDropdown); + dropdownInstance.show(); + + setTimeout(() => { + searchInput.focus(); + }, 100); +}); + +// Handle mouse leave +searchDropdown.addEventListener('mouseleave', function () { + // Check if current value is empty (including if user typed and then deleted) + if (searchInput.value.trim().length === 0) { + searchInput.blur(); + const dropdownInstance = new bootstrap.Dropdown(searchDropdown); + dropdownInstance.hide(); + } +}); + +searchDropdown.addEventListener('hidden.bs.dropdown', function () { + if (searchInput.value.trim().length === 0) { + searchInput.blur(); + } +}); diff --git a/src/main/resources/static/js/thirdParty/bootstrap.min.js.map b/src/main/resources/static/js/thirdParty/bootstrap.min.js.map new file mode 100644 index 000000000..7a01d5cd8 --- /dev/null +++ b/src/main/resources/static/js/thirdParty/bootstrap.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../../js/src/dom/selector-engine.js","../../js/src/util/index.js","../../js/src/dom/event-handler.js","../../js/src/dom/data.js","../../js/src/base-component.js","../../js/src/alert.js","../../js/src/button.js","../../js/src/dom/manipulator.js","../../js/src/carousel.js","../../js/src/collapse.js","../../node_modules/@popperjs/core/lib/enums.js","../../node_modules/@popperjs/core/lib/dom-utils/getNodeName.js","../../node_modules/@popperjs/core/lib/dom-utils/getWindow.js","../../node_modules/@popperjs/core/lib/dom-utils/instanceOf.js","../../node_modules/@popperjs/core/lib/modifiers/applyStyles.js","../../node_modules/@popperjs/core/lib/utils/getBasePlacement.js","../../node_modules/@popperjs/core/lib/dom-utils/getBoundingClientRect.js","../../node_modules/@popperjs/core/lib/dom-utils/getLayoutRect.js","../../node_modules/@popperjs/core/lib/dom-utils/contains.js","../../node_modules/@popperjs/core/lib/dom-utils/getComputedStyle.js","../../node_modules/@popperjs/core/lib/dom-utils/isTableElement.js","../../node_modules/@popperjs/core/lib/dom-utils/getDocumentElement.js","../../node_modules/@popperjs/core/lib/dom-utils/getParentNode.js","../../node_modules/@popperjs/core/lib/dom-utils/getOffsetParent.js","../../node_modules/@popperjs/core/lib/utils/getMainAxisFromPlacement.js","../../node_modules/@popperjs/core/lib/utils/math.js","../../node_modules/@popperjs/core/lib/utils/within.js","../../node_modules/@popperjs/core/lib/utils/mergePaddingObject.js","../../node_modules/@popperjs/core/lib/utils/getFreshSideObject.js","../../node_modules/@popperjs/core/lib/utils/expandToHashMap.js","../../node_modules/@popperjs/core/lib/modifiers/arrow.js","../../node_modules/@popperjs/core/lib/modifiers/computeStyles.js","../../node_modules/@popperjs/core/lib/modifiers/eventListeners.js","../../node_modules/@popperjs/core/lib/utils/getOppositePlacement.js","../../node_modules/@popperjs/core/lib/utils/getOppositeVariationPlacement.js","../../node_modules/@popperjs/core/lib/dom-utils/getWindowScroll.js","../../node_modules/@popperjs/core/lib/dom-utils/getWindowScrollBarX.js","../../node_modules/@popperjs/core/lib/dom-utils/isScrollParent.js","../../node_modules/@popperjs/core/lib/dom-utils/listScrollParents.js","../../node_modules/@popperjs/core/lib/dom-utils/getScrollParent.js","../../node_modules/@popperjs/core/lib/utils/rectToClientRect.js","../../node_modules/@popperjs/core/lib/dom-utils/getClippingRect.js","../../node_modules/@popperjs/core/lib/dom-utils/getViewportRect.js","../../node_modules/@popperjs/core/lib/dom-utils/getDocumentRect.js","../../node_modules/@popperjs/core/lib/utils/getVariation.js","../../node_modules/@popperjs/core/lib/utils/computeOffsets.js","../../node_modules/@popperjs/core/lib/utils/detectOverflow.js","../../node_modules/@popperjs/core/lib/utils/computeAutoPlacement.js","../../node_modules/@popperjs/core/lib/modifiers/flip.js","../../node_modules/@popperjs/core/lib/modifiers/hide.js","../../node_modules/@popperjs/core/lib/modifiers/offset.js","../../node_modules/@popperjs/core/lib/modifiers/popperOffsets.js","../../node_modules/@popperjs/core/lib/modifiers/preventOverflow.js","../../node_modules/@popperjs/core/lib/utils/getAltAxis.js","../../node_modules/@popperjs/core/lib/dom-utils/getCompositeRect.js","../../node_modules/@popperjs/core/lib/dom-utils/getNodeScroll.js","../../node_modules/@popperjs/core/lib/dom-utils/getHTMLElementScroll.js","../../node_modules/@popperjs/core/lib/createPopper.js","../../node_modules/@popperjs/core/lib/utils/debounce.js","../../node_modules/@popperjs/core/lib/utils/mergeByName.js","../../node_modules/@popperjs/core/lib/utils/orderModifiers.js","../../node_modules/@popperjs/core/lib/popper-lite.js","../../node_modules/@popperjs/core/lib/popper.js","../../js/src/dropdown.js","../../js/src/util/scrollbar.js","../../js/src/util/backdrop.js","../../js/src/modal.js","../../js/src/offcanvas.js","../../js/src/util/sanitizer.js","../../js/src/tooltip.js","../../js/src/popover.js","../../js/src/scrollspy.js","../../js/src/tab.js","../../js/src/toast.js","../../js/index.umd.js"],"names":["SelectorEngine","find","selector","element","document","documentElement","concat","Element","prototype","querySelectorAll","call","findOne","querySelector","children","filter","child","matches","parents","ancestor","parentNode","nodeType","Node","ELEMENT_NODE","push","prev","previous","previousElementSibling","next","nextElementSibling","getUID","prefix","Math","floor","random","getElementById","getSelector","getAttribute","hrefAttr","includes","startsWith","split","trim","getSelectorFromElement","getElementFromSelector","triggerTransitionEnd","dispatchEvent","Event","isElement","obj","jquery","getElement","length","typeCheckConfig","componentName","config","configTypes","Object","keys","forEach","property","expectedTypes","value","valueType","toString","match","toLowerCase","RegExp","test","TypeError","toUpperCase","isVisible","getClientRects","getComputedStyle","getPropertyValue","isDisabled","classList","contains","disabled","hasAttribute","findShadowRoot","attachShadow","getRootNode","root","ShadowRoot","noop","reflow","offsetHeight","getjQuery","jQuery","window","body","DOMContentLoadedCallbacks","isRTL","dir","defineJQueryPlugin","plugin","callback","$","name","NAME","JQUERY_NO_CONFLICT","fn","jQueryInterface","Constructor","noConflict","readyState","addEventListener","execute","executeAfterTransition","transitionElement","waitForTransition","emulatedDuration","transitionDuration","transitionDelay","floatTransitionDuration","Number","parseFloat","floatTransitionDelay","getTransitionDurationFromElement","called","handler","target","removeEventListener","setTimeout","getNextActiveElement","list","activeElement","shouldGetNext","isCycleAllowed","index","indexOf","listLength","max","min","namespaceRegex","stripNameRegex","stripUidRegex","eventRegistry","uidEvent","customEvents","mouseenter","mouseleave","customEventsRegex","nativeEvents","Set","getUidEvent","uid","getEvent","findHandler","events","delegationSelector","uidEventList","i","len","event","originalHandler","normalizeParams","originalTypeEvent","delegationFn","delegation","typeEvent","getTypeEvent","has","addHandler","oneOff","wrapFn","relatedTarget","delegateTarget","this","handlers","previousFn","replace","domElements","EventHandler","off","type","apply","bootstrapDelegationHandler","bootstrapHandler","removeHandler","Boolean","on","one","inNamespace","isNamespace","elementEvent","namespace","storeElementEvent","handlerKey","removeNamespacedHandlers","slice","keyHandlers","trigger","args","isNative","jQueryEvent","bubbles","nativeDispatch","defaultPrevented","evt","isPropagationStopped","isImmediatePropagationStopped","isDefaultPrevented","createEvent","initEvent","CustomEvent","cancelable","key","defineProperty","get","preventDefault","elementMap","Map","Data","set","instance","instanceMap","size","console","error","Array","from","remove","delete","BaseComponent","constructor","_element","DATA_KEY","dispose","EVENT_KEY","getOwnPropertyNames","propertyName","_queueCallback","isAnimated","[object Object]","getInstance","VERSION","Error","Alert","close","rootElement","_getRootElement","customEvent","_triggerCloseEvent","_removeElement","closest","_destroyElement","each","data","getOrCreateInstance","alertInstance","handleDismiss","Button","toggle","setAttribute","normalizeData","val","normalizeDataKey","chr","button","Manipulator","setDataAttribute","removeDataAttribute","removeAttribute","getDataAttributes","attributes","dataset","pureKey","charAt","getDataAttribute","offset","rect","getBoundingClientRect","top","scrollTop","left","scrollLeft","position","offsetTop","offsetLeft","Default","interval","keyboard","slide","pause","wrap","touch","DefaultType","ORDER_NEXT","ORDER_PREV","DIRECTION_LEFT","DIRECTION_RIGHT","KEY_TO_DIRECTION","ArrowLeft","ArrowRight","Carousel","super","_items","_interval","_activeElement","_isPaused","_isSliding","touchTimeout","touchStartX","touchDeltaX","_config","_getConfig","_indicatorsElement","_touchSupported","navigator","maxTouchPoints","_pointerEvent","PointerEvent","_addEventListeners","_slide","nextWhenVisible","hidden","cycle","clearInterval","_updateInterval","setInterval","visibilityState","bind","to","activeIndex","_getItemIndex","order","_handleSwipe","absDeltax","abs","direction","_keydown","_addTouchEventListeners","start","pointerType","touches","clientX","move","end","clearTimeout","itemImg","e","add","tagName","_getItemByOrder","isNext","_triggerSlideEvent","eventDirectionName","targetIndex","fromIndex","_setActiveIndicatorElement","activeIndicator","indicators","parseInt","elementInterval","defaultInterval","directionOrOrder","_directionToOrder","activeElementIndex","nextElement","nextElementIndex","isCycling","directionalClassName","orderClassName","_orderToDirection","triggerSlidEvent","completeCallBack","action","ride","carouselInterface","slideIndex","dataApiClickHandler","carousels","parent","Collapse","_isTransitioning","_triggerArray","id","toggleList","elem","filterElement","foundElem","_selector","_parent","_getParent","_addAriaAndCollapsedClass","hide","show","actives","activesData","container","tempActiveData","elemActive","collapseInterface","dimension","_getDimension","style","setTransitioning","scrollSize","triggerArrayLength","isTransitioning","selected","triggerArray","isOpen","triggerData","bottom","right","basePlacements","variationPlacements","reduce","acc","placement","placements","modifierPhases","getNodeName","nodeName","getWindow","node","ownerDocument","defaultView","isHTMLElement","HTMLElement","isShadowRoot","applyStyles$1","enabled","phase","_ref","state","elements","styles","assign","effect","_ref2","initialStyles","popper","options","strategy","margin","arrow","reference","hasOwnProperty","attribute","requires","getBasePlacement","width","height","x","y","getLayoutRect","clientRect","offsetWidth","rootNode","isSameNode","host","isTableElement","getDocumentElement","getParentNode","assignedSlot","getTrueOffsetParent","offsetParent","getOffsetParent","isFirefox","userAgent","currentNode","css","transform","perspective","contain","willChange","getContainingBlock","getMainAxisFromPlacement","round","within","mathMax","mathMin","mergePaddingObject","paddingObject","expandToHashMap","hashMap","arrow$1","_state$modifiersData$","arrowElement","popperOffsets","modifiersData","basePlacement","axis","padding","rects","toPaddingObject","arrowRect","minProp","maxProp","endDiff","startDiff","arrowOffsetParent","clientSize","clientHeight","clientWidth","centerToReference","center","axisProp","centerOffset","_options$element","requiresIfExists","unsetSides","mapToStyles","_Object$assign2","popperRect","offsets","gpuAcceleration","adaptive","roundOffsets","_ref3","dpr","devicePixelRatio","roundOffsetsByDPR","_ref3$x","_ref3$y","hasX","hasY","sideX","sideY","win","heightProp","widthProp","_Object$assign","commonStyles","computeStyles$1","_ref4","_options$gpuAccelerat","_options$adaptive","_options$roundOffsets","data-popper-placement","passive","eventListeners","_options$scroll","scroll","_options$resize","resize","scrollParents","scrollParent","update","hash","getOppositePlacement","matched","getOppositeVariationPlacement","getWindowScroll","pageXOffset","pageYOffset","getWindowScrollBarX","isScrollParent","_getComputedStyle","overflow","overflowX","overflowY","listScrollParents","_element$ownerDocumen","getScrollParent","isBody","visualViewport","updatedList","rectToClientRect","getClientRectFromMixedType","clippingParent","html","getViewportRect","clientTop","clientLeft","getInnerBoundingClientRect","winScroll","scrollWidth","scrollHeight","getDocumentRect","getVariation","computeOffsets","variation","commonX","commonY","mainAxis","detectOverflow","_options","_options$placement","_options$boundary","boundary","_options$rootBoundary","rootBoundary","_options$elementConte","elementContext","_options$altBoundary","altBoundary","_options$padding","altContext","referenceElement","clippingClientRect","mainClippingParents","clippingParents","clipperElement","getClippingParents","firstClippingParent","clippingRect","accRect","getClippingRect","contextElement","referenceClientRect","popperClientRect","elementClientRect","overflowOffsets","offsetData","multiply","computeAutoPlacement","flipVariations","_options$allowedAutoP","allowedAutoPlacements","allPlacements","allowedPlacements","overflows","sort","a","b","flip$1","_skip","_options$mainAxis","checkMainAxis","_options$altAxis","altAxis","checkAltAxis","specifiedFallbackPlacements","fallbackPlacements","_options$flipVariatio","preferredPlacement","oppositePlacement","getExpandedFallbackPlacements","referenceRect","checksMap","makeFallbackChecks","firstFittingPlacement","_basePlacement","isStartVariation","isVertical","mainVariationSide","altVariationSide","checks","every","check","_loop","_i","fittingPlacement","reset","getSideOffsets","preventedOffsets","isAnySideFullyClipped","some","side","hide$1","preventOverflow","referenceOverflow","popperAltOverflow","referenceClippingOffsets","popperEscapeOffsets","isReferenceHidden","hasPopperEscaped","data-popper-reference-hidden","data-popper-escaped","offset$1","_options$offset","invertDistance","skidding","distance","distanceAndSkiddingToXY","_data$state$placement","popperOffsets$1","preventOverflow$1","_options$tether","tether","_options$tetherOffset","tetherOffset","isBasePlacement","tetherOffsetValue","mainSide","altSide","additive","minLen","maxLen","arrowPaddingObject","arrowPaddingMin","arrowPaddingMax","arrowLen","minOffset","maxOffset","clientOffset","offsetModifierValue","tetherMin","tetherMax","preventedOffset","_mainSide","_altSide","_offset","_min","_max","_preventedOffset","getCompositeRect","elementOrVirtualElement","isFixed","isOffsetParentAnElement","DEFAULT_OPTIONS","modifiers","areValidElements","_len","arguments","_key","popperGenerator","generatorOptions","_generatorOptions","_generatorOptions$def","defaultModifiers","_generatorOptions$def2","defaultOptions","pending","orderedModifiers","effectCleanupFns","isDestroyed","setOptions","cleanupModifierEffects","merged","map","visited","result","modifier","dep","depModifier","orderModifiers","current","existing","m","_ref3$options","cleanupFn","forceUpdate","_state$elements","_state$orderedModifie","_state$orderedModifie2","Promise","resolve","then","undefined","destroy","onFirstUpdate","createPopper","computeStyles","applyStyles","flip","REGEXP_KEYDOWN","PLACEMENT_TOP","PLACEMENT_TOPEND","PLACEMENT_BOTTOM","PLACEMENT_BOTTOMEND","PLACEMENT_RIGHT","PLACEMENT_LEFT","display","popperConfig","autoClose","Dropdown","_popper","_menu","_getMenuElement","_inNavbar","_detectNavbar","getParentFromElement","Popper","_getPopperConfig","isDisplayStatic","focus","_completeHide","_getPlacement","parentDropdown","isEnd","_getOffset","popperData","defaultBsPopperConfig","_selectMenuItem","items","dropdownInterface","toggles","context","composedPath","isMenuTarget","clickEvent","isActive","stopPropagation","getToggleButton","clearMenus","click","dataApiKeydownHandler","ScrollBarHelper","getWidth","documentWidth","innerWidth","_disableOverFlow","_setElementAttributes","calculatedValue","_saveInitialAttribute","styleProp","scrollbarWidth","_applyManipulationCallback","_resetElementAttributes","actualValue","removeProperty","callBack","isOverflowing","clickCallback","Backdrop","_isAppended","_append","_getElement","_emulateAnimation","backdrop","createElement","className","appendChild","Modal","_dialog","_backdrop","_initializeBackDrop","_isShown","_ignoreBackdropClick","_scrollBar","_isAnimated","_adjustDialog","_setEscapeEvent","_setResizeEvent","_showBackdrop","_showElement","_hideModal","htmlElement","handleUpdate","modalBody","_enforceFocus","_triggerBackdropTransition","_resetAdjustments","currentTarget","isModalOverflowing","isBodyOverflowing","paddingLeft","paddingRight","showEvent","Offcanvas","visibility","_enforceFocusOnElement","blur","allReadyOpen","el","uriAttrs","SAFE_URL_PATTERN","DATA_URL_PATTERN","allowedAttribute","attr","allowedAttributeList","attrName","nodeValue","regExp","attrRegex","sanitizeHtml","unsafeHtml","allowList","sanitizeFn","createdDocument","DOMParser","parseFromString","allowlistKeys","elName","attributeList","allowedAttributes","innerHTML","BSCLS_PREFIX_REGEX","DISALLOWED_ATTRIBUTES","animation","template","title","delay","customClass","sanitize","AttachmentMap","AUTO","TOP","RIGHT","BOTTOM","LEFT","*","area","br","col","code","div","em","hr","h1","h2","h3","h4","h5","h6","img","li","ol","p","pre","s","small","span","sub","sup","strong","u","ul","HIDE","HIDDEN","SHOW","SHOWN","INSERTED","CLICK","FOCUSIN","FOCUSOUT","MOUSEENTER","MOUSELEAVE","Tooltip","_isEnabled","_timeout","_hoverState","_activeTrigger","tip","_setListeners","enable","disable","toggleEnabled","_initializeOnDelegatedTarget","_isWithActiveTrigger","_enter","_leave","getTipElement","_hideModalHandler","isWithContent","shadowRoot","isInTheDom","tipId","setContent","attachment","_getAttachment","_addAttachmentClass","prevHoverState","_cleanTipClass","getTitle","setElementContent","content","textContent","updateAttachment","dataKey","_getDelegateConfig","_handlePopperPlacementChange","eventIn","eventOut","_fixTitle","originalTitleType","dataAttributes","dataAttr","tabClass","token","tClass","Popover","_getContent","method","ScrollSpy","_scrollElement","_offsets","_targets","_activeTarget","_scrollHeight","_process","refresh","autoMethod","offsetMethod","offsetBase","_getScrollTop","_getScrollHeight","targetSelector","targetBCR","item","_getOffsetHeight","innerHeight","maxScroll","_activate","_clear","queries","link","join","listGroup","navItem","spy","Tab","listElement","itemSelector","hideEvent","complete","active","_transitionComplete","dropdownChild","dropdownElement","dropdown","autohide","Toast","_hasMouseInteraction","_hasKeyboardInteraction","_clearTimeout","_maybeScheduleHide","_onInteraction","isInteracting"],"mappings":"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","sourcesContent":["/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.0.2): dom/selector-engine.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NODE_TEXT = 3\n\nconst SelectorEngine = {\n find(selector, element = document.documentElement) {\n return [].concat(...Element.prototype.querySelectorAll.call(element, selector))\n },\n\n findOne(selector, element = document.documentElement) {\n return Element.prototype.querySelector.call(element, selector)\n },\n\n children(element, selector) {\n return [].concat(...element.children)\n .filter(child => child.matches(selector))\n },\n\n parents(element, selector) {\n const parents = []\n\n let ancestor = element.parentNode\n\n while (ancestor && ancestor.nodeType === Node.ELEMENT_NODE && ancestor.nodeType !== NODE_TEXT) {\n if (ancestor.matches(selector)) {\n parents.push(ancestor)\n }\n\n ancestor = ancestor.parentNode\n }\n\n return parents\n },\n\n prev(element, selector) {\n let previous = element.previousElementSibling\n\n while (previous) {\n if (previous.matches(selector)) {\n return [previous]\n }\n\n previous = previous.previousElementSibling\n }\n\n return []\n },\n\n next(element, selector) {\n let next = element.nextElementSibling\n\n while (next) {\n if (next.matches(selector)) {\n return [next]\n }\n\n next = next.nextElementSibling\n }\n\n return []\n }\n}\n\nexport default SelectorEngine\n","import SelectorEngine from '../dom/selector-engine'\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.0.2): util/index.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nconst MAX_UID = 1000000\nconst MILLISECONDS_MULTIPLIER = 1000\nconst TRANSITION_END = 'transitionend'\n\n// Shoutout AngusCroll (https://goo.gl/pxwQGp)\nconst toType = obj => {\n if (obj === null || obj === undefined) {\n return `${obj}`\n }\n\n return {}.toString.call(obj).match(/\\s([a-z]+)/i)[1].toLowerCase()\n}\n\n/**\n * --------------------------------------------------------------------------\n * Public Util Api\n * --------------------------------------------------------------------------\n */\n\nconst getUID = prefix => {\n do {\n prefix += Math.floor(Math.random() * MAX_UID)\n } while (document.getElementById(prefix))\n\n return prefix\n}\n\nconst getSelector = element => {\n let selector = element.getAttribute('data-bs-target')\n\n if (!selector || selector === '#') {\n let hrefAttr = element.getAttribute('href')\n\n // The only valid content that could double as a selector are IDs or classes,\n // so everything starting with `#` or `.`. If a \"real\" URL is used as the selector,\n // `document.querySelector` will rightfully complain it is invalid.\n // See https://github.com/twbs/bootstrap/issues/32273\n if (!hrefAttr || (!hrefAttr.includes('#') && !hrefAttr.startsWith('.'))) {\n return null\n }\n\n // Just in case some CMS puts out a full URL with the anchor appended\n if (hrefAttr.includes('#') && !hrefAttr.startsWith('#')) {\n hrefAttr = `#${hrefAttr.split('#')[1]}`\n }\n\n selector = hrefAttr && hrefAttr !== '#' ? hrefAttr.trim() : null\n }\n\n return selector\n}\n\nconst getSelectorFromElement = element => {\n const selector = getSelector(element)\n\n if (selector) {\n return document.querySelector(selector) ? selector : null\n }\n\n return null\n}\n\nconst getElementFromSelector = element => {\n const selector = getSelector(element)\n\n return selector ? document.querySelector(selector) : null\n}\n\nconst getTransitionDurationFromElement = element => {\n if (!element) {\n return 0\n }\n\n // Get transition-duration of the element\n let { transitionDuration, transitionDelay } = window.getComputedStyle(element)\n\n const floatTransitionDuration = Number.parseFloat(transitionDuration)\n const floatTransitionDelay = Number.parseFloat(transitionDelay)\n\n // Return 0 if element or transition duration is not found\n if (!floatTransitionDuration && !floatTransitionDelay) {\n return 0\n }\n\n // If multiple durations are defined, take the first\n transitionDuration = transitionDuration.split(',')[0]\n transitionDelay = transitionDelay.split(',')[0]\n\n return (Number.parseFloat(transitionDuration) + Number.parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER\n}\n\nconst triggerTransitionEnd = element => {\n element.dispatchEvent(new Event(TRANSITION_END))\n}\n\nconst isElement = obj => {\n if (!obj || typeof obj !== 'object') {\n return false\n }\n\n if (typeof obj.jquery !== 'undefined') {\n obj = obj[0]\n }\n\n return typeof obj.nodeType !== 'undefined'\n}\n\nconst getElement = obj => {\n if (isElement(obj)) { // it's a jQuery object or a node element\n return obj.jquery ? obj[0] : obj\n }\n\n if (typeof obj === 'string' && obj.length > 0) {\n return SelectorEngine.findOne(obj)\n }\n\n return null\n}\n\nconst typeCheckConfig = (componentName, config, configTypes) => {\n Object.keys(configTypes).forEach(property => {\n const expectedTypes = configTypes[property]\n const value = config[property]\n const valueType = value && isElement(value) ? 'element' : toType(value)\n\n if (!new RegExp(expectedTypes).test(valueType)) {\n throw new TypeError(\n `${componentName.toUpperCase()}: Option \"${property}\" provided type \"${valueType}\" but expected type \"${expectedTypes}\".`\n )\n }\n })\n}\n\nconst isVisible = element => {\n if (!isElement(element) || element.getClientRects().length === 0) {\n return false\n }\n\n return getComputedStyle(element).getPropertyValue('visibility') === 'visible'\n}\n\nconst isDisabled = element => {\n if (!element || element.nodeType !== Node.ELEMENT_NODE) {\n return true\n }\n\n if (element.classList.contains('disabled')) {\n return true\n }\n\n if (typeof element.disabled !== 'undefined') {\n return element.disabled\n }\n\n return element.hasAttribute('disabled') && element.getAttribute('disabled') !== 'false'\n}\n\nconst findShadowRoot = element => {\n if (!document.documentElement.attachShadow) {\n return null\n }\n\n // Can find the shadow root otherwise it'll return the document\n if (typeof element.getRootNode === 'function') {\n const root = element.getRootNode()\n return root instanceof ShadowRoot ? root : null\n }\n\n if (element instanceof ShadowRoot) {\n return element\n }\n\n // when we don't find a shadow root\n if (!element.parentNode) {\n return null\n }\n\n return findShadowRoot(element.parentNode)\n}\n\nconst noop = () => {}\n\nconst reflow = element => element.offsetHeight\n\nconst getjQuery = () => {\n const { jQuery } = window\n\n if (jQuery && !document.body.hasAttribute('data-bs-no-jquery')) {\n return jQuery\n }\n\n return null\n}\n\nconst DOMContentLoadedCallbacks = []\n\nconst onDOMContentLoaded = callback => {\n if (document.readyState === 'loading') {\n // add listener on the first call when the document is in loading state\n if (!DOMContentLoadedCallbacks.length) {\n document.addEventListener('DOMContentLoaded', () => {\n DOMContentLoadedCallbacks.forEach(callback => callback())\n })\n }\n\n DOMContentLoadedCallbacks.push(callback)\n } else {\n callback()\n }\n}\n\nconst isRTL = () => document.documentElement.dir === 'rtl'\n\nconst defineJQueryPlugin = plugin => {\n onDOMContentLoaded(() => {\n const $ = getjQuery()\n /* istanbul ignore if */\n if ($) {\n const name = plugin.NAME\n const JQUERY_NO_CONFLICT = $.fn[name]\n $.fn[name] = plugin.jQueryInterface\n $.fn[name].Constructor = plugin\n $.fn[name].noConflict = () => {\n $.fn[name] = JQUERY_NO_CONFLICT\n return plugin.jQueryInterface\n }\n }\n })\n}\n\nconst execute = callback => {\n if (typeof callback === 'function') {\n callback()\n }\n}\n\nconst executeAfterTransition = (callback, transitionElement, waitForTransition = true) => {\n if (!waitForTransition) {\n execute(callback)\n return\n }\n\n const durationPadding = 5\n const emulatedDuration = getTransitionDurationFromElement(transitionElement) + durationPadding\n\n let called = false\n\n const handler = ({ target }) => {\n if (target !== transitionElement) {\n return\n }\n\n called = true\n transitionElement.removeEventListener(TRANSITION_END, handler)\n execute(callback)\n }\n\n transitionElement.addEventListener(TRANSITION_END, handler)\n setTimeout(() => {\n if (!called) {\n triggerTransitionEnd(transitionElement)\n }\n }, emulatedDuration)\n}\n\n/**\n * Return the previous/next element of a list.\n *\n * @param {array} list The list of elements\n * @param activeElement The active element\n * @param shouldGetNext Choose to get next or previous element\n * @param isCycleAllowed\n * @return {Element|elem} The proper element\n */\nconst getNextActiveElement = (list, activeElement, shouldGetNext, isCycleAllowed) => {\n let index = list.indexOf(activeElement)\n\n // if the element does not exist in the list return an element depending on the direction and if cycle is allowed\n if (index === -1) {\n return list[!shouldGetNext && isCycleAllowed ? list.length - 1 : 0]\n }\n\n const listLength = list.length\n\n index += shouldGetNext ? 1 : -1\n\n if (isCycleAllowed) {\n index = (index + listLength) % listLength\n }\n\n return list[Math.max(0, Math.min(index, listLength - 1))]\n}\n\nexport {\n getElement,\n getUID,\n getSelectorFromElement,\n getElementFromSelector,\n getTransitionDurationFromElement,\n triggerTransitionEnd,\n isElement,\n typeCheckConfig,\n isVisible,\n isDisabled,\n findShadowRoot,\n noop,\n getNextActiveElement,\n reflow,\n getjQuery,\n onDOMContentLoaded,\n isRTL,\n defineJQueryPlugin,\n execute,\n executeAfterTransition\n}\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.0.2): dom/event-handler.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport { getjQuery } from '../util/index'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst namespaceRegex = /[^.]*(?=\\..*)\\.|.*/\nconst stripNameRegex = /\\..*/\nconst stripUidRegex = /::\\d+$/\nconst eventRegistry = {} // Events storage\nlet uidEvent = 1\nconst customEvents = {\n mouseenter: 'mouseover',\n mouseleave: 'mouseout'\n}\nconst customEventsRegex = /^(mouseenter|mouseleave)/i\nconst nativeEvents = new Set([\n 'click',\n 'dblclick',\n 'mouseup',\n 'mousedown',\n 'contextmenu',\n 'mousewheel',\n 'DOMMouseScroll',\n 'mouseover',\n 'mouseout',\n 'mousemove',\n 'selectstart',\n 'selectend',\n 'keydown',\n 'keypress',\n 'keyup',\n 'orientationchange',\n 'touchstart',\n 'touchmove',\n 'touchend',\n 'touchcancel',\n 'pointerdown',\n 'pointermove',\n 'pointerup',\n 'pointerleave',\n 'pointercancel',\n 'gesturestart',\n 'gesturechange',\n 'gestureend',\n 'focus',\n 'blur',\n 'change',\n 'reset',\n 'select',\n 'submit',\n 'focusin',\n 'focusout',\n 'load',\n 'unload',\n 'beforeunload',\n 'resize',\n 'move',\n 'DOMContentLoaded',\n 'readystatechange',\n 'error',\n 'abort',\n 'scroll'\n])\n\n/**\n * ------------------------------------------------------------------------\n * Private methods\n * ------------------------------------------------------------------------\n */\n\nfunction getUidEvent(element, uid) {\n return (uid && `${uid}::${uidEvent++}`) || element.uidEvent || uidEvent++\n}\n\nfunction getEvent(element) {\n const uid = getUidEvent(element)\n\n element.uidEvent = uid\n eventRegistry[uid] = eventRegistry[uid] || {}\n\n return eventRegistry[uid]\n}\n\nfunction bootstrapHandler(element, fn) {\n return function handler(event) {\n event.delegateTarget = element\n\n if (handler.oneOff) {\n EventHandler.off(element, event.type, fn)\n }\n\n return fn.apply(element, [event])\n }\n}\n\nfunction bootstrapDelegationHandler(element, selector, fn) {\n return function handler(event) {\n const domElements = element.querySelectorAll(selector)\n\n for (let { target } = event; target && target !== this; target = target.parentNode) {\n for (let i = domElements.length; i--;) {\n if (domElements[i] === target) {\n event.delegateTarget = target\n\n if (handler.oneOff) {\n // eslint-disable-next-line unicorn/consistent-destructuring\n EventHandler.off(element, event.type, selector, fn)\n }\n\n return fn.apply(target, [event])\n }\n }\n }\n\n // To please ESLint\n return null\n }\n}\n\nfunction findHandler(events, handler, delegationSelector = null) {\n const uidEventList = Object.keys(events)\n\n for (let i = 0, len = uidEventList.length; i < len; i++) {\n const event = events[uidEventList[i]]\n\n if (event.originalHandler === handler && event.delegationSelector === delegationSelector) {\n return event\n }\n }\n\n return null\n}\n\nfunction normalizeParams(originalTypeEvent, handler, delegationFn) {\n const delegation = typeof handler === 'string'\n const originalHandler = delegation ? delegationFn : handler\n\n let typeEvent = getTypeEvent(originalTypeEvent)\n const isNative = nativeEvents.has(typeEvent)\n\n if (!isNative) {\n typeEvent = originalTypeEvent\n }\n\n return [delegation, originalHandler, typeEvent]\n}\n\nfunction addHandler(element, originalTypeEvent, handler, delegationFn, oneOff) {\n if (typeof originalTypeEvent !== 'string' || !element) {\n return\n }\n\n if (!handler) {\n handler = delegationFn\n delegationFn = null\n }\n\n // in case of mouseenter or mouseleave wrap the handler within a function that checks for its DOM position\n // this prevents the handler from being dispatched the same way as mouseover or mouseout does\n if (customEventsRegex.test(originalTypeEvent)) {\n const wrapFn = fn => {\n return function (event) {\n if (!event.relatedTarget || (event.relatedTarget !== event.delegateTarget && !event.delegateTarget.contains(event.relatedTarget))) {\n return fn.call(this, event)\n }\n }\n }\n\n if (delegationFn) {\n delegationFn = wrapFn(delegationFn)\n } else {\n handler = wrapFn(handler)\n }\n }\n\n const [delegation, originalHandler, typeEvent] = normalizeParams(originalTypeEvent, handler, delegationFn)\n const events = getEvent(element)\n const handlers = events[typeEvent] || (events[typeEvent] = {})\n const previousFn = findHandler(handlers, originalHandler, delegation ? handler : null)\n\n if (previousFn) {\n previousFn.oneOff = previousFn.oneOff && oneOff\n\n return\n }\n\n const uid = getUidEvent(originalHandler, originalTypeEvent.replace(namespaceRegex, ''))\n const fn = delegation ?\n bootstrapDelegationHandler(element, handler, delegationFn) :\n bootstrapHandler(element, handler)\n\n fn.delegationSelector = delegation ? handler : null\n fn.originalHandler = originalHandler\n fn.oneOff = oneOff\n fn.uidEvent = uid\n handlers[uid] = fn\n\n element.addEventListener(typeEvent, fn, delegation)\n}\n\nfunction removeHandler(element, events, typeEvent, handler, delegationSelector) {\n const fn = findHandler(events[typeEvent], handler, delegationSelector)\n\n if (!fn) {\n return\n }\n\n element.removeEventListener(typeEvent, fn, Boolean(delegationSelector))\n delete events[typeEvent][fn.uidEvent]\n}\n\nfunction removeNamespacedHandlers(element, events, typeEvent, namespace) {\n const storeElementEvent = events[typeEvent] || {}\n\n Object.keys(storeElementEvent).forEach(handlerKey => {\n if (handlerKey.includes(namespace)) {\n const event = storeElementEvent[handlerKey]\n\n removeHandler(element, events, typeEvent, event.originalHandler, event.delegationSelector)\n }\n })\n}\n\nfunction getTypeEvent(event) {\n // allow to get the native events from namespaced events ('click.bs.button' --> 'click')\n event = event.replace(stripNameRegex, '')\n return customEvents[event] || event\n}\n\nconst EventHandler = {\n on(element, event, handler, delegationFn) {\n addHandler(element, event, handler, delegationFn, false)\n },\n\n one(element, event, handler, delegationFn) {\n addHandler(element, event, handler, delegationFn, true)\n },\n\n off(element, originalTypeEvent, handler, delegationFn) {\n if (typeof originalTypeEvent !== 'string' || !element) {\n return\n }\n\n const [delegation, originalHandler, typeEvent] = normalizeParams(originalTypeEvent, handler, delegationFn)\n const inNamespace = typeEvent !== originalTypeEvent\n const events = getEvent(element)\n const isNamespace = originalTypeEvent.startsWith('.')\n\n if (typeof originalHandler !== 'undefined') {\n // Simplest case: handler is passed, remove that listener ONLY.\n if (!events || !events[typeEvent]) {\n return\n }\n\n removeHandler(element, events, typeEvent, originalHandler, delegation ? handler : null)\n return\n }\n\n if (isNamespace) {\n Object.keys(events).forEach(elementEvent => {\n removeNamespacedHandlers(element, events, elementEvent, originalTypeEvent.slice(1))\n })\n }\n\n const storeElementEvent = events[typeEvent] || {}\n Object.keys(storeElementEvent).forEach(keyHandlers => {\n const handlerKey = keyHandlers.replace(stripUidRegex, '')\n\n if (!inNamespace || originalTypeEvent.includes(handlerKey)) {\n const event = storeElementEvent[keyHandlers]\n\n removeHandler(element, events, typeEvent, event.originalHandler, event.delegationSelector)\n }\n })\n },\n\n trigger(element, event, args) {\n if (typeof event !== 'string' || !element) {\n return null\n }\n\n const $ = getjQuery()\n const typeEvent = getTypeEvent(event)\n const inNamespace = event !== typeEvent\n const isNative = nativeEvents.has(typeEvent)\n\n let jQueryEvent\n let bubbles = true\n let nativeDispatch = true\n let defaultPrevented = false\n let evt = null\n\n if (inNamespace && $) {\n jQueryEvent = $.Event(event, args)\n\n $(element).trigger(jQueryEvent)\n bubbles = !jQueryEvent.isPropagationStopped()\n nativeDispatch = !jQueryEvent.isImmediatePropagationStopped()\n defaultPrevented = jQueryEvent.isDefaultPrevented()\n }\n\n if (isNative) {\n evt = document.createEvent('HTMLEvents')\n evt.initEvent(typeEvent, bubbles, true)\n } else {\n evt = new CustomEvent(event, {\n bubbles,\n cancelable: true\n })\n }\n\n // merge custom information in our event\n if (typeof args !== 'undefined') {\n Object.keys(args).forEach(key => {\n Object.defineProperty(evt, key, {\n get() {\n return args[key]\n }\n })\n })\n }\n\n if (defaultPrevented) {\n evt.preventDefault()\n }\n\n if (nativeDispatch) {\n element.dispatchEvent(evt)\n }\n\n if (evt.defaultPrevented && typeof jQueryEvent !== 'undefined') {\n jQueryEvent.preventDefault()\n }\n\n return evt\n }\n}\n\nexport default EventHandler\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.0.2): dom/data.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst elementMap = new Map()\n\nexport default {\n set(element, key, instance) {\n if (!elementMap.has(element)) {\n elementMap.set(element, new Map())\n }\n\n const instanceMap = elementMap.get(element)\n\n // make it clear we only want one instance per element\n // can be removed later when multiple key/instances are fine to be used\n if (!instanceMap.has(key) && instanceMap.size !== 0) {\n // eslint-disable-next-line no-console\n console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(instanceMap.keys())[0]}.`)\n return\n }\n\n instanceMap.set(key, instance)\n },\n\n get(element, key) {\n if (elementMap.has(element)) {\n return elementMap.get(element).get(key) || null\n }\n\n return null\n },\n\n remove(element, key) {\n if (!elementMap.has(element)) {\n return\n }\n\n const instanceMap = elementMap.get(element)\n\n instanceMap.delete(key)\n\n // free up element references if there are no instances left for an element\n if (instanceMap.size === 0) {\n elementMap.delete(element)\n }\n }\n}\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.0.2): base-component.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport Data from './dom/data'\nimport {\n executeAfterTransition,\n getElement\n} from './util/index'\nimport EventHandler from './dom/event-handler'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst VERSION = '5.0.2'\n\nclass BaseComponent {\n constructor(element) {\n element = getElement(element)\n\n if (!element) {\n return\n }\n\n this._element = element\n Data.set(this._element, this.constructor.DATA_KEY, this)\n }\n\n dispose() {\n Data.remove(this._element, this.constructor.DATA_KEY)\n EventHandler.off(this._element, this.constructor.EVENT_KEY)\n\n Object.getOwnPropertyNames(this).forEach(propertyName => {\n this[propertyName] = null\n })\n }\n\n _queueCallback(callback, element, isAnimated = true) {\n executeAfterTransition(callback, element, isAnimated)\n }\n\n /** Static */\n\n static getInstance(element) {\n return Data.get(element, this.DATA_KEY)\n }\n\n static getOrCreateInstance(element, config = {}) {\n return this.getInstance(element) || new this(element, typeof config === 'object' ? config : null)\n }\n\n static get VERSION() {\n return VERSION\n }\n\n static get NAME() {\n throw new Error('You have to implement the static method \"NAME\", for each component!')\n }\n\n static get DATA_KEY() {\n return `bs.${this.NAME}`\n }\n\n static get EVENT_KEY() {\n return `.${this.DATA_KEY}`\n }\n}\n\nexport default BaseComponent\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.0.2): alert.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport {\n defineJQueryPlugin,\n getElementFromSelector\n} from './util/index'\nimport EventHandler from './dom/event-handler'\nimport BaseComponent from './base-component'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'alert'\nconst DATA_KEY = 'bs.alert'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst SELECTOR_DISMISS = '[data-bs-dismiss=\"alert\"]'\n\nconst EVENT_CLOSE = `close${EVENT_KEY}`\nconst EVENT_CLOSED = `closed${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_ALERT = 'alert'\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_SHOW = 'show'\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Alert extends BaseComponent {\n // Getters\n\n static get NAME() {\n return NAME\n }\n\n // Public\n\n close(element) {\n const rootElement = element ? this._getRootElement(element) : this._element\n const customEvent = this._triggerCloseEvent(rootElement)\n\n if (customEvent === null || customEvent.defaultPrevented) {\n return\n }\n\n this._removeElement(rootElement)\n }\n\n // Private\n\n _getRootElement(element) {\n return getElementFromSelector(element) || element.closest(`.${CLASS_NAME_ALERT}`)\n }\n\n _triggerCloseEvent(element) {\n return EventHandler.trigger(element, EVENT_CLOSE)\n }\n\n _removeElement(element) {\n element.classList.remove(CLASS_NAME_SHOW)\n\n const isAnimated = element.classList.contains(CLASS_NAME_FADE)\n this._queueCallback(() => this._destroyElement(element), element, isAnimated)\n }\n\n _destroyElement(element) {\n element.remove()\n\n EventHandler.trigger(element, EVENT_CLOSED)\n }\n\n // Static\n\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Alert.getOrCreateInstance(this)\n\n if (config === 'close') {\n data[config](this)\n }\n })\n }\n\n static handleDismiss(alertInstance) {\n return function (event) {\n if (event) {\n event.preventDefault()\n }\n\n alertInstance.close(this)\n }\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DISMISS, Alert.handleDismiss(new Alert()))\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n * add .Alert to jQuery only if jQuery is present\n */\n\ndefineJQueryPlugin(Alert)\n\nexport default Alert\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.0.2): button.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport { defineJQueryPlugin } from './util/index'\nimport EventHandler from './dom/event-handler'\nimport BaseComponent from './base-component'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'button'\nconst DATA_KEY = 'bs.button'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst CLASS_NAME_ACTIVE = 'active'\n\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"button\"]'\n\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Button extends BaseComponent {\n // Getters\n\n static get NAME() {\n return NAME\n }\n\n // Public\n\n toggle() {\n // Toggle class and sync the `aria-pressed` attribute with the return value of the `.toggle()` method\n this._element.setAttribute('aria-pressed', this._element.classList.toggle(CLASS_NAME_ACTIVE))\n }\n\n // Static\n\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Button.getOrCreateInstance(this)\n\n if (config === 'toggle') {\n data[config]()\n }\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, event => {\n event.preventDefault()\n\n const button = event.target.closest(SELECTOR_DATA_TOGGLE)\n const data = Button.getOrCreateInstance(button)\n\n data.toggle()\n})\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n * add .Button to jQuery only if jQuery is present\n */\n\ndefineJQueryPlugin(Button)\n\nexport default Button\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.0.2): dom/manipulator.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nfunction normalizeData(val) {\n if (val === 'true') {\n return true\n }\n\n if (val === 'false') {\n return false\n }\n\n if (val === Number(val).toString()) {\n return Number(val)\n }\n\n if (val === '' || val === 'null') {\n return null\n }\n\n return val\n}\n\nfunction normalizeDataKey(key) {\n return key.replace(/[A-Z]/g, chr => `-${chr.toLowerCase()}`)\n}\n\nconst Manipulator = {\n setDataAttribute(element, key, value) {\n element.setAttribute(`data-bs-${normalizeDataKey(key)}`, value)\n },\n\n removeDataAttribute(element, key) {\n element.removeAttribute(`data-bs-${normalizeDataKey(key)}`)\n },\n\n getDataAttributes(element) {\n if (!element) {\n return {}\n }\n\n const attributes = {}\n\n Object.keys(element.dataset)\n .filter(key => key.startsWith('bs'))\n .forEach(key => {\n let pureKey = key.replace(/^bs/, '')\n pureKey = pureKey.charAt(0).toLowerCase() + pureKey.slice(1, pureKey.length)\n attributes[pureKey] = normalizeData(element.dataset[key])\n })\n\n return attributes\n },\n\n getDataAttribute(element, key) {\n return normalizeData(element.getAttribute(`data-bs-${normalizeDataKey(key)}`))\n },\n\n offset(element) {\n const rect = element.getBoundingClientRect()\n\n return {\n top: rect.top + document.body.scrollTop,\n left: rect.left + document.body.scrollLeft\n }\n },\n\n position(element) {\n return {\n top: element.offsetTop,\n left: element.offsetLeft\n }\n }\n}\n\nexport default Manipulator\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.0.2): carousel.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport {\n defineJQueryPlugin,\n getElementFromSelector,\n isRTL,\n isVisible,\n getNextActiveElement,\n reflow,\n triggerTransitionEnd,\n typeCheckConfig\n} from './util/index'\nimport EventHandler from './dom/event-handler'\nimport Manipulator from './dom/manipulator'\nimport SelectorEngine from './dom/selector-engine'\nimport BaseComponent from './base-component'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'carousel'\nconst DATA_KEY = 'bs.carousel'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst ARROW_LEFT_KEY = 'ArrowLeft'\nconst ARROW_RIGHT_KEY = 'ArrowRight'\nconst TOUCHEVENT_COMPAT_WAIT = 500 // Time for mouse compat events to fire after touch\nconst SWIPE_THRESHOLD = 40\n\nconst Default = {\n interval: 5000,\n keyboard: true,\n slide: false,\n pause: 'hover',\n wrap: true,\n touch: true\n}\n\nconst DefaultType = {\n interval: '(number|boolean)',\n keyboard: 'boolean',\n slide: '(boolean|string)',\n pause: '(string|boolean)',\n wrap: 'boolean',\n touch: 'boolean'\n}\n\nconst ORDER_NEXT = 'next'\nconst ORDER_PREV = 'prev'\nconst DIRECTION_LEFT = 'left'\nconst DIRECTION_RIGHT = 'right'\n\nconst KEY_TO_DIRECTION = {\n [ARROW_LEFT_KEY]: DIRECTION_RIGHT,\n [ARROW_RIGHT_KEY]: DIRECTION_LEFT\n}\n\nconst EVENT_SLIDE = `slide${EVENT_KEY}`\nconst EVENT_SLID = `slid${EVENT_KEY}`\nconst EVENT_KEYDOWN = `keydown${EVENT_KEY}`\nconst EVENT_MOUSEENTER = `mouseenter${EVENT_KEY}`\nconst EVENT_MOUSELEAVE = `mouseleave${EVENT_KEY}`\nconst EVENT_TOUCHSTART = `touchstart${EVENT_KEY}`\nconst EVENT_TOUCHMOVE = `touchmove${EVENT_KEY}`\nconst EVENT_TOUCHEND = `touchend${EVENT_KEY}`\nconst EVENT_POINTERDOWN = `pointerdown${EVENT_KEY}`\nconst EVENT_POINTERUP = `pointerup${EVENT_KEY}`\nconst EVENT_DRAG_START = `dragstart${EVENT_KEY}`\nconst EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_CAROUSEL = 'carousel'\nconst CLASS_NAME_ACTIVE = 'active'\nconst CLASS_NAME_SLIDE = 'slide'\nconst CLASS_NAME_END = 'carousel-item-end'\nconst CLASS_NAME_START = 'carousel-item-start'\nconst CLASS_NAME_NEXT = 'carousel-item-next'\nconst CLASS_NAME_PREV = 'carousel-item-prev'\nconst CLASS_NAME_POINTER_EVENT = 'pointer-event'\n\nconst SELECTOR_ACTIVE = '.active'\nconst SELECTOR_ACTIVE_ITEM = '.active.carousel-item'\nconst SELECTOR_ITEM = '.carousel-item'\nconst SELECTOR_ITEM_IMG = '.carousel-item img'\nconst SELECTOR_NEXT_PREV = '.carousel-item-next, .carousel-item-prev'\nconst SELECTOR_INDICATORS = '.carousel-indicators'\nconst SELECTOR_INDICATOR = '[data-bs-target]'\nconst SELECTOR_DATA_SLIDE = '[data-bs-slide], [data-bs-slide-to]'\nconst SELECTOR_DATA_RIDE = '[data-bs-ride=\"carousel\"]'\n\nconst POINTER_TYPE_TOUCH = 'touch'\nconst POINTER_TYPE_PEN = 'pen'\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\nclass Carousel extends BaseComponent {\n constructor(element, config) {\n super(element)\n\n this._items = null\n this._interval = null\n this._activeElement = null\n this._isPaused = false\n this._isSliding = false\n this.touchTimeout = null\n this.touchStartX = 0\n this.touchDeltaX = 0\n\n this._config = this._getConfig(config)\n this._indicatorsElement = SelectorEngine.findOne(SELECTOR_INDICATORS, this._element)\n this._touchSupported = 'ontouchstart' in document.documentElement || navigator.maxTouchPoints > 0\n this._pointerEvent = Boolean(window.PointerEvent)\n\n this._addEventListeners()\n }\n\n // Getters\n\n static get Default() {\n return Default\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n\n next() {\n this._slide(ORDER_NEXT)\n }\n\n nextWhenVisible() {\n // Don't call next when the page isn't visible\n // or the carousel or its parent isn't visible\n if (!document.hidden && isVisible(this._element)) {\n this.next()\n }\n }\n\n prev() {\n this._slide(ORDER_PREV)\n }\n\n pause(event) {\n if (!event) {\n this._isPaused = true\n }\n\n if (SelectorEngine.findOne(SELECTOR_NEXT_PREV, this._element)) {\n triggerTransitionEnd(this._element)\n this.cycle(true)\n }\n\n clearInterval(this._interval)\n this._interval = null\n }\n\n cycle(event) {\n if (!event) {\n this._isPaused = false\n }\n\n if (this._interval) {\n clearInterval(this._interval)\n this._interval = null\n }\n\n if (this._config && this._config.interval && !this._isPaused) {\n this._updateInterval()\n\n this._interval = setInterval(\n (document.visibilityState ? this.nextWhenVisible : this.next).bind(this),\n this._config.interval\n )\n }\n }\n\n to(index) {\n this._activeElement = SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element)\n const activeIndex = this._getItemIndex(this._activeElement)\n\n if (index > this._items.length - 1 || index < 0) {\n return\n }\n\n if (this._isSliding) {\n EventHandler.one(this._element, EVENT_SLID, () => this.to(index))\n return\n }\n\n if (activeIndex === index) {\n this.pause()\n this.cycle()\n return\n }\n\n const order = index > activeIndex ?\n ORDER_NEXT :\n ORDER_PREV\n\n this._slide(order, this._items[index])\n }\n\n // Private\n\n _getConfig(config) {\n config = {\n ...Default,\n ...Manipulator.getDataAttributes(this._element),\n ...(typeof config === 'object' ? config : {})\n }\n typeCheckConfig(NAME, config, DefaultType)\n return config\n }\n\n _handleSwipe() {\n const absDeltax = Math.abs(this.touchDeltaX)\n\n if (absDeltax <= SWIPE_THRESHOLD) {\n return\n }\n\n const direction = absDeltax / this.touchDeltaX\n\n this.touchDeltaX = 0\n\n if (!direction) {\n return\n }\n\n this._slide(direction > 0 ? DIRECTION_RIGHT : DIRECTION_LEFT)\n }\n\n _addEventListeners() {\n if (this._config.keyboard) {\n EventHandler.on(this._element, EVENT_KEYDOWN, event => this._keydown(event))\n }\n\n if (this._config.pause === 'hover') {\n EventHandler.on(this._element, EVENT_MOUSEENTER, event => this.pause(event))\n EventHandler.on(this._element, EVENT_MOUSELEAVE, event => this.cycle(event))\n }\n\n if (this._config.touch && this._touchSupported) {\n this._addTouchEventListeners()\n }\n }\n\n _addTouchEventListeners() {\n const start = event => {\n if (this._pointerEvent && (event.pointerType === POINTER_TYPE_PEN || event.pointerType === POINTER_TYPE_TOUCH)) {\n this.touchStartX = event.clientX\n } else if (!this._pointerEvent) {\n this.touchStartX = event.touches[0].clientX\n }\n }\n\n const move = event => {\n // ensure swiping with one touch and not pinching\n this.touchDeltaX = event.touches && event.touches.length > 1 ?\n 0 :\n event.touches[0].clientX - this.touchStartX\n }\n\n const end = event => {\n if (this._pointerEvent && (event.pointerType === POINTER_TYPE_PEN || event.pointerType === POINTER_TYPE_TOUCH)) {\n this.touchDeltaX = event.clientX - this.touchStartX\n }\n\n this._handleSwipe()\n if (this._config.pause === 'hover') {\n // If it's a touch-enabled device, mouseenter/leave are fired as\n // part of the mouse compatibility events on first tap - the carousel\n // would stop cycling until user tapped out of it;\n // here, we listen for touchend, explicitly pause the carousel\n // (as if it's the second time we tap on it, mouseenter compat event\n // is NOT fired) and after a timeout (to allow for mouse compatibility\n // events to fire) we explicitly restart cycling\n\n this.pause()\n if (this.touchTimeout) {\n clearTimeout(this.touchTimeout)\n }\n\n this.touchTimeout = setTimeout(event => this.cycle(event), TOUCHEVENT_COMPAT_WAIT + this._config.interval)\n }\n }\n\n SelectorEngine.find(SELECTOR_ITEM_IMG, this._element).forEach(itemImg => {\n EventHandler.on(itemImg, EVENT_DRAG_START, e => e.preventDefault())\n })\n\n if (this._pointerEvent) {\n EventHandler.on(this._element, EVENT_POINTERDOWN, event => start(event))\n EventHandler.on(this._element, EVENT_POINTERUP, event => end(event))\n\n this._element.classList.add(CLASS_NAME_POINTER_EVENT)\n } else {\n EventHandler.on(this._element, EVENT_TOUCHSTART, event => start(event))\n EventHandler.on(this._element, EVENT_TOUCHMOVE, event => move(event))\n EventHandler.on(this._element, EVENT_TOUCHEND, event => end(event))\n }\n }\n\n _keydown(event) {\n if (/input|textarea/i.test(event.target.tagName)) {\n return\n }\n\n const direction = KEY_TO_DIRECTION[event.key]\n if (direction) {\n event.preventDefault()\n this._slide(direction)\n }\n }\n\n _getItemIndex(element) {\n this._items = element && element.parentNode ?\n SelectorEngine.find(SELECTOR_ITEM, element.parentNode) :\n []\n\n return this._items.indexOf(element)\n }\n\n _getItemByOrder(order, activeElement) {\n const isNext = order === ORDER_NEXT\n return getNextActiveElement(this._items, activeElement, isNext, this._config.wrap)\n }\n\n _triggerSlideEvent(relatedTarget, eventDirectionName) {\n const targetIndex = this._getItemIndex(relatedTarget)\n const fromIndex = this._getItemIndex(SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element))\n\n return EventHandler.trigger(this._element, EVENT_SLIDE, {\n relatedTarget,\n direction: eventDirectionName,\n from: fromIndex,\n to: targetIndex\n })\n }\n\n _setActiveIndicatorElement(element) {\n if (this._indicatorsElement) {\n const activeIndicator = SelectorEngine.findOne(SELECTOR_ACTIVE, this._indicatorsElement)\n\n activeIndicator.classList.remove(CLASS_NAME_ACTIVE)\n activeIndicator.removeAttribute('aria-current')\n\n const indicators = SelectorEngine.find(SELECTOR_INDICATOR, this._indicatorsElement)\n\n for (let i = 0; i < indicators.length; i++) {\n if (Number.parseInt(indicators[i].getAttribute('data-bs-slide-to'), 10) === this._getItemIndex(element)) {\n indicators[i].classList.add(CLASS_NAME_ACTIVE)\n indicators[i].setAttribute('aria-current', 'true')\n break\n }\n }\n }\n }\n\n _updateInterval() {\n const element = this._activeElement || SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element)\n\n if (!element) {\n return\n }\n\n const elementInterval = Number.parseInt(element.getAttribute('data-bs-interval'), 10)\n\n if (elementInterval) {\n this._config.defaultInterval = this._config.defaultInterval || this._config.interval\n this._config.interval = elementInterval\n } else {\n this._config.interval = this._config.defaultInterval || this._config.interval\n }\n }\n\n _slide(directionOrOrder, element) {\n const order = this._directionToOrder(directionOrOrder)\n const activeElement = SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element)\n const activeElementIndex = this._getItemIndex(activeElement)\n const nextElement = element || this._getItemByOrder(order, activeElement)\n\n const nextElementIndex = this._getItemIndex(nextElement)\n const isCycling = Boolean(this._interval)\n\n const isNext = order === ORDER_NEXT\n const directionalClassName = isNext ? CLASS_NAME_START : CLASS_NAME_END\n const orderClassName = isNext ? CLASS_NAME_NEXT : CLASS_NAME_PREV\n const eventDirectionName = this._orderToDirection(order)\n\n if (nextElement && nextElement.classList.contains(CLASS_NAME_ACTIVE)) {\n this._isSliding = false\n return\n }\n\n if (this._isSliding) {\n return\n }\n\n const slideEvent = this._triggerSlideEvent(nextElement, eventDirectionName)\n if (slideEvent.defaultPrevented) {\n return\n }\n\n if (!activeElement || !nextElement) {\n // Some weirdness is happening, so we bail\n return\n }\n\n this._isSliding = true\n\n if (isCycling) {\n this.pause()\n }\n\n this._setActiveIndicatorElement(nextElement)\n this._activeElement = nextElement\n\n const triggerSlidEvent = () => {\n EventHandler.trigger(this._element, EVENT_SLID, {\n relatedTarget: nextElement,\n direction: eventDirectionName,\n from: activeElementIndex,\n to: nextElementIndex\n })\n }\n\n if (this._element.classList.contains(CLASS_NAME_SLIDE)) {\n nextElement.classList.add(orderClassName)\n\n reflow(nextElement)\n\n activeElement.classList.add(directionalClassName)\n nextElement.classList.add(directionalClassName)\n\n const completeCallBack = () => {\n nextElement.classList.remove(directionalClassName, orderClassName)\n nextElement.classList.add(CLASS_NAME_ACTIVE)\n\n activeElement.classList.remove(CLASS_NAME_ACTIVE, orderClassName, directionalClassName)\n\n this._isSliding = false\n\n setTimeout(triggerSlidEvent, 0)\n }\n\n this._queueCallback(completeCallBack, activeElement, true)\n } else {\n activeElement.classList.remove(CLASS_NAME_ACTIVE)\n nextElement.classList.add(CLASS_NAME_ACTIVE)\n\n this._isSliding = false\n triggerSlidEvent()\n }\n\n if (isCycling) {\n this.cycle()\n }\n }\n\n _directionToOrder(direction) {\n if (![DIRECTION_RIGHT, DIRECTION_LEFT].includes(direction)) {\n return direction\n }\n\n if (isRTL()) {\n return direction === DIRECTION_LEFT ? ORDER_PREV : ORDER_NEXT\n }\n\n return direction === DIRECTION_LEFT ? ORDER_NEXT : ORDER_PREV\n }\n\n _orderToDirection(order) {\n if (![ORDER_NEXT, ORDER_PREV].includes(order)) {\n return order\n }\n\n if (isRTL()) {\n return order === ORDER_PREV ? DIRECTION_LEFT : DIRECTION_RIGHT\n }\n\n return order === ORDER_PREV ? DIRECTION_RIGHT : DIRECTION_LEFT\n }\n\n // Static\n\n static carouselInterface(element, config) {\n const data = Carousel.getOrCreateInstance(element, config)\n\n let { _config } = data\n if (typeof config === 'object') {\n _config = {\n ..._config,\n ...config\n }\n }\n\n const action = typeof config === 'string' ? config : _config.slide\n\n if (typeof config === 'number') {\n data.to(config)\n } else if (typeof action === 'string') {\n if (typeof data[action] === 'undefined') {\n throw new TypeError(`No method named \"${action}\"`)\n }\n\n data[action]()\n } else if (_config.interval && _config.ride) {\n data.pause()\n data.cycle()\n }\n }\n\n static jQueryInterface(config) {\n return this.each(function () {\n Carousel.carouselInterface(this, config)\n })\n }\n\n static dataApiClickHandler(event) {\n const target = getElementFromSelector(this)\n\n if (!target || !target.classList.contains(CLASS_NAME_CAROUSEL)) {\n return\n }\n\n const config = {\n ...Manipulator.getDataAttributes(target),\n ...Manipulator.getDataAttributes(this)\n }\n const slideIndex = this.getAttribute('data-bs-slide-to')\n\n if (slideIndex) {\n config.interval = false\n }\n\n Carousel.carouselInterface(target, config)\n\n if (slideIndex) {\n Carousel.getInstance(target).to(slideIndex)\n }\n\n event.preventDefault()\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_SLIDE, Carousel.dataApiClickHandler)\n\nEventHandler.on(window, EVENT_LOAD_DATA_API, () => {\n const carousels = SelectorEngine.find(SELECTOR_DATA_RIDE)\n\n for (let i = 0, len = carousels.length; i < len; i++) {\n Carousel.carouselInterface(carousels[i], Carousel.getInstance(carousels[i]))\n }\n})\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n * add .Carousel to jQuery only if jQuery is present\n */\n\ndefineJQueryPlugin(Carousel)\n\nexport default Carousel\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.0.2): collapse.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport {\n defineJQueryPlugin,\n getElement,\n getSelectorFromElement,\n getElementFromSelector,\n reflow,\n typeCheckConfig\n} from './util/index'\nimport Data from './dom/data'\nimport EventHandler from './dom/event-handler'\nimport Manipulator from './dom/manipulator'\nimport SelectorEngine from './dom/selector-engine'\nimport BaseComponent from './base-component'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'collapse'\nconst DATA_KEY = 'bs.collapse'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst Default = {\n toggle: true,\n parent: ''\n}\n\nconst DefaultType = {\n toggle: 'boolean',\n parent: '(string|element)'\n}\n\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_COLLAPSE = 'collapse'\nconst CLASS_NAME_COLLAPSING = 'collapsing'\nconst CLASS_NAME_COLLAPSED = 'collapsed'\n\nconst WIDTH = 'width'\nconst HEIGHT = 'height'\n\nconst SELECTOR_ACTIVES = '.show, .collapsing'\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"collapse\"]'\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Collapse extends BaseComponent {\n constructor(element, config) {\n super(element)\n\n this._isTransitioning = false\n this._config = this._getConfig(config)\n this._triggerArray = SelectorEngine.find(\n `${SELECTOR_DATA_TOGGLE}[href=\"#${this._element.id}\"],` +\n `${SELECTOR_DATA_TOGGLE}[data-bs-target=\"#${this._element.id}\"]`\n )\n\n const toggleList = SelectorEngine.find(SELECTOR_DATA_TOGGLE)\n\n for (let i = 0, len = toggleList.length; i < len; i++) {\n const elem = toggleList[i]\n const selector = getSelectorFromElement(elem)\n const filterElement = SelectorEngine.find(selector)\n .filter(foundElem => foundElem === this._element)\n\n if (selector !== null && filterElement.length) {\n this._selector = selector\n this._triggerArray.push(elem)\n }\n }\n\n this._parent = this._config.parent ? this._getParent() : null\n\n if (!this._config.parent) {\n this._addAriaAndCollapsedClass(this._element, this._triggerArray)\n }\n\n if (this._config.toggle) {\n this.toggle()\n }\n }\n\n // Getters\n\n static get Default() {\n return Default\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n\n toggle() {\n if (this._element.classList.contains(CLASS_NAME_SHOW)) {\n this.hide()\n } else {\n this.show()\n }\n }\n\n show() {\n if (this._isTransitioning || this._element.classList.contains(CLASS_NAME_SHOW)) {\n return\n }\n\n let actives\n let activesData\n\n if (this._parent) {\n actives = SelectorEngine.find(SELECTOR_ACTIVES, this._parent)\n .filter(elem => {\n if (typeof this._config.parent === 'string') {\n return elem.getAttribute('data-bs-parent') === this._config.parent\n }\n\n return elem.classList.contains(CLASS_NAME_COLLAPSE)\n })\n\n if (actives.length === 0) {\n actives = null\n }\n }\n\n const container = SelectorEngine.findOne(this._selector)\n if (actives) {\n const tempActiveData = actives.find(elem => container !== elem)\n activesData = tempActiveData ? Collapse.getInstance(tempActiveData) : null\n\n if (activesData && activesData._isTransitioning) {\n return\n }\n }\n\n const startEvent = EventHandler.trigger(this._element, EVENT_SHOW)\n if (startEvent.defaultPrevented) {\n return\n }\n\n if (actives) {\n actives.forEach(elemActive => {\n if (container !== elemActive) {\n Collapse.collapseInterface(elemActive, 'hide')\n }\n\n if (!activesData) {\n Data.set(elemActive, DATA_KEY, null)\n }\n })\n }\n\n const dimension = this._getDimension()\n\n this._element.classList.remove(CLASS_NAME_COLLAPSE)\n this._element.classList.add(CLASS_NAME_COLLAPSING)\n\n this._element.style[dimension] = 0\n\n if (this._triggerArray.length) {\n this._triggerArray.forEach(element => {\n element.classList.remove(CLASS_NAME_COLLAPSED)\n element.setAttribute('aria-expanded', true)\n })\n }\n\n this.setTransitioning(true)\n\n const complete = () => {\n this._element.classList.remove(CLASS_NAME_COLLAPSING)\n this._element.classList.add(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW)\n\n this._element.style[dimension] = ''\n\n this.setTransitioning(false)\n\n EventHandler.trigger(this._element, EVENT_SHOWN)\n }\n\n const capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1)\n const scrollSize = `scroll${capitalizedDimension}`\n\n this._queueCallback(complete, this._element, true)\n this._element.style[dimension] = `${this._element[scrollSize]}px`\n }\n\n hide() {\n if (this._isTransitioning || !this._element.classList.contains(CLASS_NAME_SHOW)) {\n return\n }\n\n const startEvent = EventHandler.trigger(this._element, EVENT_HIDE)\n if (startEvent.defaultPrevented) {\n return\n }\n\n const dimension = this._getDimension()\n\n this._element.style[dimension] = `${this._element.getBoundingClientRect()[dimension]}px`\n\n reflow(this._element)\n\n this._element.classList.add(CLASS_NAME_COLLAPSING)\n this._element.classList.remove(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW)\n\n const triggerArrayLength = this._triggerArray.length\n if (triggerArrayLength > 0) {\n for (let i = 0; i < triggerArrayLength; i++) {\n const trigger = this._triggerArray[i]\n const elem = getElementFromSelector(trigger)\n\n if (elem && !elem.classList.contains(CLASS_NAME_SHOW)) {\n trigger.classList.add(CLASS_NAME_COLLAPSED)\n trigger.setAttribute('aria-expanded', false)\n }\n }\n }\n\n this.setTransitioning(true)\n\n const complete = () => {\n this.setTransitioning(false)\n this._element.classList.remove(CLASS_NAME_COLLAPSING)\n this._element.classList.add(CLASS_NAME_COLLAPSE)\n EventHandler.trigger(this._element, EVENT_HIDDEN)\n }\n\n this._element.style[dimension] = ''\n\n this._queueCallback(complete, this._element, true)\n }\n\n setTransitioning(isTransitioning) {\n this._isTransitioning = isTransitioning\n }\n\n // Private\n\n _getConfig(config) {\n config = {\n ...Default,\n ...config\n }\n config.toggle = Boolean(config.toggle) // Coerce string values\n typeCheckConfig(NAME, config, DefaultType)\n return config\n }\n\n _getDimension() {\n return this._element.classList.contains(WIDTH) ? WIDTH : HEIGHT\n }\n\n _getParent() {\n let { parent } = this._config\n\n parent = getElement(parent)\n\n const selector = `${SELECTOR_DATA_TOGGLE}[data-bs-parent=\"${parent}\"]`\n\n SelectorEngine.find(selector, parent)\n .forEach(element => {\n const selected = getElementFromSelector(element)\n\n this._addAriaAndCollapsedClass(\n selected,\n [element]\n )\n })\n\n return parent\n }\n\n _addAriaAndCollapsedClass(element, triggerArray) {\n if (!element || !triggerArray.length) {\n return\n }\n\n const isOpen = element.classList.contains(CLASS_NAME_SHOW)\n\n triggerArray.forEach(elem => {\n if (isOpen) {\n elem.classList.remove(CLASS_NAME_COLLAPSED)\n } else {\n elem.classList.add(CLASS_NAME_COLLAPSED)\n }\n\n elem.setAttribute('aria-expanded', isOpen)\n })\n }\n\n // Static\n\n static collapseInterface(element, config) {\n let data = Collapse.getInstance(element)\n const _config = {\n ...Default,\n ...Manipulator.getDataAttributes(element),\n ...(typeof config === 'object' && config ? config : {})\n }\n\n if (!data && _config.toggle && typeof config === 'string' && /show|hide/.test(config)) {\n _config.toggle = false\n }\n\n if (!data) {\n data = new Collapse(element, _config)\n }\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n }\n }\n\n static jQueryInterface(config) {\n return this.each(function () {\n Collapse.collapseInterface(this, config)\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n // preventDefault only for elements (which change the URL) not inside the collapsible element\n if (event.target.tagName === 'A' || (event.delegateTarget && event.delegateTarget.tagName === 'A')) {\n event.preventDefault()\n }\n\n const triggerData = Manipulator.getDataAttributes(this)\n const selector = getSelectorFromElement(this)\n const selectorElements = SelectorEngine.find(selector)\n\n selectorElements.forEach(element => {\n const data = Collapse.getInstance(element)\n let config\n if (data) {\n // update parent attribute\n if (data._parent === null && typeof triggerData.parent === 'string') {\n data._config.parent = triggerData.parent\n data._parent = data._getParent()\n }\n\n config = 'toggle'\n } else {\n config = triggerData\n }\n\n Collapse.collapseInterface(element, config)\n })\n})\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n * add .Collapse to jQuery only if jQuery is present\n */\n\ndefineJQueryPlugin(Collapse)\n\nexport default Collapse\n","export var top = 'top';\nexport var bottom = 'bottom';\nexport var right = 'right';\nexport var left = 'left';\nexport var auto = 'auto';\nexport var basePlacements = [top, bottom, right, left];\nexport var start = 'start';\nexport var end = 'end';\nexport var clippingParents = 'clippingParents';\nexport var viewport = 'viewport';\nexport var popper = 'popper';\nexport var reference = 'reference';\nexport var variationPlacements = /*#__PURE__*/basePlacements.reduce(function (acc, placement) {\n return acc.concat([placement + \"-\" + start, placement + \"-\" + end]);\n}, []);\nexport var placements = /*#__PURE__*/[].concat(basePlacements, [auto]).reduce(function (acc, placement) {\n return acc.concat([placement, placement + \"-\" + start, placement + \"-\" + end]);\n}, []); // modifiers that need to read the DOM\n\nexport var beforeRead = 'beforeRead';\nexport var read = 'read';\nexport var afterRead = 'afterRead'; // pure-logic modifiers\n\nexport var beforeMain = 'beforeMain';\nexport var main = 'main';\nexport var afterMain = 'afterMain'; // modifier with the purpose to write to the DOM (or write into a framework state)\n\nexport var beforeWrite = 'beforeWrite';\nexport var write = 'write';\nexport var afterWrite = 'afterWrite';\nexport var modifierPhases = [beforeRead, read, afterRead, beforeMain, main, afterMain, beforeWrite, write, afterWrite];","export default function getNodeName(element) {\n return element ? (element.nodeName || '').toLowerCase() : null;\n}","export default function getWindow(node) {\n if (node == null) {\n return window;\n }\n\n if (node.toString() !== '[object Window]') {\n var ownerDocument = node.ownerDocument;\n return ownerDocument ? ownerDocument.defaultView || window : window;\n }\n\n return node;\n}","import getWindow from \"./getWindow.js\";\n\nfunction isElement(node) {\n var OwnElement = getWindow(node).Element;\n return node instanceof OwnElement || node instanceof Element;\n}\n\nfunction isHTMLElement(node) {\n var OwnElement = getWindow(node).HTMLElement;\n return node instanceof OwnElement || node instanceof HTMLElement;\n}\n\nfunction isShadowRoot(node) {\n // IE 11 has no ShadowRoot\n if (typeof ShadowRoot === 'undefined') {\n return false;\n }\n\n var OwnElement = getWindow(node).ShadowRoot;\n return node instanceof OwnElement || node instanceof ShadowRoot;\n}\n\nexport { isElement, isHTMLElement, isShadowRoot };","import getNodeName from \"../dom-utils/getNodeName.js\";\nimport { isHTMLElement } from \"../dom-utils/instanceOf.js\"; // This modifier takes the styles prepared by the `computeStyles` modifier\n// and applies them to the HTMLElements such as popper and arrow\n\nfunction applyStyles(_ref) {\n var state = _ref.state;\n Object.keys(state.elements).forEach(function (name) {\n var style = state.styles[name] || {};\n var attributes = state.attributes[name] || {};\n var element = state.elements[name]; // arrow is optional + virtual elements\n\n if (!isHTMLElement(element) || !getNodeName(element)) {\n return;\n } // Flow doesn't support to extend this property, but it's the most\n // effective way to apply styles to an HTMLElement\n // $FlowFixMe[cannot-write]\n\n\n Object.assign(element.style, style);\n Object.keys(attributes).forEach(function (name) {\n var value = attributes[name];\n\n if (value === false) {\n element.removeAttribute(name);\n } else {\n element.setAttribute(name, value === true ? '' : value);\n }\n });\n });\n}\n\nfunction effect(_ref2) {\n var state = _ref2.state;\n var initialStyles = {\n popper: {\n position: state.options.strategy,\n left: '0',\n top: '0',\n margin: '0'\n },\n arrow: {\n position: 'absolute'\n },\n reference: {}\n };\n Object.assign(state.elements.popper.style, initialStyles.popper);\n state.styles = initialStyles;\n\n if (state.elements.arrow) {\n Object.assign(state.elements.arrow.style, initialStyles.arrow);\n }\n\n return function () {\n Object.keys(state.elements).forEach(function (name) {\n var element = state.elements[name];\n var attributes = state.attributes[name] || {};\n var styleProperties = Object.keys(state.styles.hasOwnProperty(name) ? state.styles[name] : initialStyles[name]); // Set all values to an empty string to unset them\n\n var style = styleProperties.reduce(function (style, property) {\n style[property] = '';\n return style;\n }, {}); // arrow is optional + virtual elements\n\n if (!isHTMLElement(element) || !getNodeName(element)) {\n return;\n }\n\n Object.assign(element.style, style);\n Object.keys(attributes).forEach(function (attribute) {\n element.removeAttribute(attribute);\n });\n });\n };\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'applyStyles',\n enabled: true,\n phase: 'write',\n fn: applyStyles,\n effect: effect,\n requires: ['computeStyles']\n};","import { auto } from \"../enums.js\";\nexport default function getBasePlacement(placement) {\n return placement.split('-')[0];\n}","export default function getBoundingClientRect(element) {\n var rect = element.getBoundingClientRect();\n return {\n width: rect.width,\n height: rect.height,\n top: rect.top,\n right: rect.right,\n bottom: rect.bottom,\n left: rect.left,\n x: rect.left,\n y: rect.top\n };\n}","import getBoundingClientRect from \"./getBoundingClientRect.js\"; // Returns the layout rect of an element relative to its offsetParent. Layout\n// means it doesn't take into account transforms.\n\nexport default function getLayoutRect(element) {\n var clientRect = getBoundingClientRect(element); // Use the clientRect sizes if it's not been transformed.\n // Fixes https://github.com/popperjs/popper-core/issues/1223\n\n var width = element.offsetWidth;\n var height = element.offsetHeight;\n\n if (Math.abs(clientRect.width - width) <= 1) {\n width = clientRect.width;\n }\n\n if (Math.abs(clientRect.height - height) <= 1) {\n height = clientRect.height;\n }\n\n return {\n x: element.offsetLeft,\n y: element.offsetTop,\n width: width,\n height: height\n };\n}","import { isShadowRoot } from \"./instanceOf.js\";\nexport default function contains(parent, child) {\n var rootNode = child.getRootNode && child.getRootNode(); // First, attempt with faster native method\n\n if (parent.contains(child)) {\n return true;\n } // then fallback to custom implementation with Shadow DOM support\n else if (rootNode && isShadowRoot(rootNode)) {\n var next = child;\n\n do {\n if (next && parent.isSameNode(next)) {\n return true;\n } // $FlowFixMe[prop-missing]: need a better way to handle this...\n\n\n next = next.parentNode || next.host;\n } while (next);\n } // Give up, the result is false\n\n\n return false;\n}","import getWindow from \"./getWindow.js\";\nexport default function getComputedStyle(element) {\n return getWindow(element).getComputedStyle(element);\n}","import getNodeName from \"./getNodeName.js\";\nexport default function isTableElement(element) {\n return ['table', 'td', 'th'].indexOf(getNodeName(element)) >= 0;\n}","import { isElement } from \"./instanceOf.js\";\nexport default function getDocumentElement(element) {\n // $FlowFixMe[incompatible-return]: assume body is always available\n return ((isElement(element) ? element.ownerDocument : // $FlowFixMe[prop-missing]\n element.document) || window.document).documentElement;\n}","import getNodeName from \"./getNodeName.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport { isShadowRoot } from \"./instanceOf.js\";\nexport default function getParentNode(element) {\n if (getNodeName(element) === 'html') {\n return element;\n }\n\n return (// this is a quicker (but less type safe) way to save quite some bytes from the bundle\n // $FlowFixMe[incompatible-return]\n // $FlowFixMe[prop-missing]\n element.assignedSlot || // step into the shadow DOM of the parent of a slotted node\n element.parentNode || ( // DOM Element detected\n isShadowRoot(element) ? element.host : null) || // ShadowRoot detected\n // $FlowFixMe[incompatible-call]: HTMLElement is a Node\n getDocumentElement(element) // fallback\n\n );\n}","import getWindow from \"./getWindow.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nimport isTableElement from \"./isTableElement.js\";\nimport getParentNode from \"./getParentNode.js\";\n\nfunction getTrueOffsetParent(element) {\n if (!isHTMLElement(element) || // https://github.com/popperjs/popper-core/issues/837\n getComputedStyle(element).position === 'fixed') {\n return null;\n }\n\n return element.offsetParent;\n} // `.offsetParent` reports `null` for fixed elements, while absolute elements\n// return the containing block\n\n\nfunction getContainingBlock(element) {\n var isFirefox = navigator.userAgent.toLowerCase().indexOf('firefox') !== -1;\n var isIE = navigator.userAgent.indexOf('Trident') !== -1;\n\n if (isIE && isHTMLElement(element)) {\n // In IE 9, 10 and 11 fixed elements containing block is always established by the viewport\n var elementCss = getComputedStyle(element);\n\n if (elementCss.position === 'fixed') {\n return null;\n }\n }\n\n var currentNode = getParentNode(element);\n\n while (isHTMLElement(currentNode) && ['html', 'body'].indexOf(getNodeName(currentNode)) < 0) {\n var css = getComputedStyle(currentNode); // This is non-exhaustive but covers the most common CSS properties that\n // create a containing block.\n // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block\n\n if (css.transform !== 'none' || css.perspective !== 'none' || css.contain === 'paint' || ['transform', 'perspective'].indexOf(css.willChange) !== -1 || isFirefox && css.willChange === 'filter' || isFirefox && css.filter && css.filter !== 'none') {\n return currentNode;\n } else {\n currentNode = currentNode.parentNode;\n }\n }\n\n return null;\n} // Gets the closest ancestor positioned element. Handles some edge cases,\n// such as table ancestors and cross browser bugs.\n\n\nexport default function getOffsetParent(element) {\n var window = getWindow(element);\n var offsetParent = getTrueOffsetParent(element);\n\n while (offsetParent && isTableElement(offsetParent) && getComputedStyle(offsetParent).position === 'static') {\n offsetParent = getTrueOffsetParent(offsetParent);\n }\n\n if (offsetParent && (getNodeName(offsetParent) === 'html' || getNodeName(offsetParent) === 'body' && getComputedStyle(offsetParent).position === 'static')) {\n return window;\n }\n\n return offsetParent || getContainingBlock(element) || window;\n}","export default function getMainAxisFromPlacement(placement) {\n return ['top', 'bottom'].indexOf(placement) >= 0 ? 'x' : 'y';\n}","export var max = Math.max;\nexport var min = Math.min;\nexport var round = Math.round;","import { max as mathMax, min as mathMin } from \"./math.js\";\nexport default function within(min, value, max) {\n return mathMax(min, mathMin(value, max));\n}","import getFreshSideObject from \"./getFreshSideObject.js\";\nexport default function mergePaddingObject(paddingObject) {\n return Object.assign({}, getFreshSideObject(), paddingObject);\n}","export default function getFreshSideObject() {\n return {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0\n };\n}","export default function expandToHashMap(value, keys) {\n return keys.reduce(function (hashMap, key) {\n hashMap[key] = value;\n return hashMap;\n }, {});\n}","import getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getLayoutRect from \"../dom-utils/getLayoutRect.js\";\nimport contains from \"../dom-utils/contains.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport getMainAxisFromPlacement from \"../utils/getMainAxisFromPlacement.js\";\nimport within from \"../utils/within.js\";\nimport mergePaddingObject from \"../utils/mergePaddingObject.js\";\nimport expandToHashMap from \"../utils/expandToHashMap.js\";\nimport { left, right, basePlacements, top, bottom } from \"../enums.js\";\nimport { isHTMLElement } from \"../dom-utils/instanceOf.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar toPaddingObject = function toPaddingObject(padding, state) {\n padding = typeof padding === 'function' ? padding(Object.assign({}, state.rects, {\n placement: state.placement\n })) : padding;\n return mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements));\n};\n\nfunction arrow(_ref) {\n var _state$modifiersData$;\n\n var state = _ref.state,\n name = _ref.name,\n options = _ref.options;\n var arrowElement = state.elements.arrow;\n var popperOffsets = state.modifiersData.popperOffsets;\n var basePlacement = getBasePlacement(state.placement);\n var axis = getMainAxisFromPlacement(basePlacement);\n var isVertical = [left, right].indexOf(basePlacement) >= 0;\n var len = isVertical ? 'height' : 'width';\n\n if (!arrowElement || !popperOffsets) {\n return;\n }\n\n var paddingObject = toPaddingObject(options.padding, state);\n var arrowRect = getLayoutRect(arrowElement);\n var minProp = axis === 'y' ? top : left;\n var maxProp = axis === 'y' ? bottom : right;\n var endDiff = state.rects.reference[len] + state.rects.reference[axis] - popperOffsets[axis] - state.rects.popper[len];\n var startDiff = popperOffsets[axis] - state.rects.reference[axis];\n var arrowOffsetParent = getOffsetParent(arrowElement);\n var clientSize = arrowOffsetParent ? axis === 'y' ? arrowOffsetParent.clientHeight || 0 : arrowOffsetParent.clientWidth || 0 : 0;\n var centerToReference = endDiff / 2 - startDiff / 2; // Make sure the arrow doesn't overflow the popper if the center point is\n // outside of the popper bounds\n\n var min = paddingObject[minProp];\n var max = clientSize - arrowRect[len] - paddingObject[maxProp];\n var center = clientSize / 2 - arrowRect[len] / 2 + centerToReference;\n var offset = within(min, center, max); // Prevents breaking syntax highlighting...\n\n var axisProp = axis;\n state.modifiersData[name] = (_state$modifiersData$ = {}, _state$modifiersData$[axisProp] = offset, _state$modifiersData$.centerOffset = offset - center, _state$modifiersData$);\n}\n\nfunction effect(_ref2) {\n var state = _ref2.state,\n options = _ref2.options;\n var _options$element = options.element,\n arrowElement = _options$element === void 0 ? '[data-popper-arrow]' : _options$element;\n\n if (arrowElement == null) {\n return;\n } // CSS selector\n\n\n if (typeof arrowElement === 'string') {\n arrowElement = state.elements.popper.querySelector(arrowElement);\n\n if (!arrowElement) {\n return;\n }\n }\n\n if (process.env.NODE_ENV !== \"production\") {\n if (!isHTMLElement(arrowElement)) {\n console.error(['Popper: \"arrow\" element must be an HTMLElement (not an SVGElement).', 'To use an SVG arrow, wrap it in an HTMLElement that will be used as', 'the arrow.'].join(' '));\n }\n }\n\n if (!contains(state.elements.popper, arrowElement)) {\n if (process.env.NODE_ENV !== \"production\") {\n console.error(['Popper: \"arrow\" modifier\\'s `element` must be a child of the popper', 'element.'].join(' '));\n }\n\n return;\n }\n\n state.elements.arrow = arrowElement;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'arrow',\n enabled: true,\n phase: 'main',\n fn: arrow,\n effect: effect,\n requires: ['popperOffsets'],\n requiresIfExists: ['preventOverflow']\n};","import { top, left, right, bottom } from \"../enums.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport getWindow from \"../dom-utils/getWindow.js\";\nimport getDocumentElement from \"../dom-utils/getDocumentElement.js\";\nimport getComputedStyle from \"../dom-utils/getComputedStyle.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport { round } from \"../utils/math.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar unsetSides = {\n top: 'auto',\n right: 'auto',\n bottom: 'auto',\n left: 'auto'\n}; // Round the offsets to the nearest suitable subpixel based on the DPR.\n// Zooming can change the DPR, but it seems to report a value that will\n// cleanly divide the values into the appropriate subpixels.\n\nfunction roundOffsetsByDPR(_ref) {\n var x = _ref.x,\n y = _ref.y;\n var win = window;\n var dpr = win.devicePixelRatio || 1;\n return {\n x: round(round(x * dpr) / dpr) || 0,\n y: round(round(y * dpr) / dpr) || 0\n };\n}\n\nexport function mapToStyles(_ref2) {\n var _Object$assign2;\n\n var popper = _ref2.popper,\n popperRect = _ref2.popperRect,\n placement = _ref2.placement,\n offsets = _ref2.offsets,\n position = _ref2.position,\n gpuAcceleration = _ref2.gpuAcceleration,\n adaptive = _ref2.adaptive,\n roundOffsets = _ref2.roundOffsets;\n\n var _ref3 = roundOffsets === true ? roundOffsetsByDPR(offsets) : typeof roundOffsets === 'function' ? roundOffsets(offsets) : offsets,\n _ref3$x = _ref3.x,\n x = _ref3$x === void 0 ? 0 : _ref3$x,\n _ref3$y = _ref3.y,\n y = _ref3$y === void 0 ? 0 : _ref3$y;\n\n var hasX = offsets.hasOwnProperty('x');\n var hasY = offsets.hasOwnProperty('y');\n var sideX = left;\n var sideY = top;\n var win = window;\n\n if (adaptive) {\n var offsetParent = getOffsetParent(popper);\n var heightProp = 'clientHeight';\n var widthProp = 'clientWidth';\n\n if (offsetParent === getWindow(popper)) {\n offsetParent = getDocumentElement(popper);\n\n if (getComputedStyle(offsetParent).position !== 'static') {\n heightProp = 'scrollHeight';\n widthProp = 'scrollWidth';\n }\n } // $FlowFixMe[incompatible-cast]: force type refinement, we compare offsetParent with window above, but Flow doesn't detect it\n\n\n offsetParent = offsetParent;\n\n if (placement === top) {\n sideY = bottom; // $FlowFixMe[prop-missing]\n\n y -= offsetParent[heightProp] - popperRect.height;\n y *= gpuAcceleration ? 1 : -1;\n }\n\n if (placement === left) {\n sideX = right; // $FlowFixMe[prop-missing]\n\n x -= offsetParent[widthProp] - popperRect.width;\n x *= gpuAcceleration ? 1 : -1;\n }\n }\n\n var commonStyles = Object.assign({\n position: position\n }, adaptive && unsetSides);\n\n if (gpuAcceleration) {\n var _Object$assign;\n\n return Object.assign({}, commonStyles, (_Object$assign = {}, _Object$assign[sideY] = hasY ? '0' : '', _Object$assign[sideX] = hasX ? '0' : '', _Object$assign.transform = (win.devicePixelRatio || 1) < 2 ? \"translate(\" + x + \"px, \" + y + \"px)\" : \"translate3d(\" + x + \"px, \" + y + \"px, 0)\", _Object$assign));\n }\n\n return Object.assign({}, commonStyles, (_Object$assign2 = {}, _Object$assign2[sideY] = hasY ? y + \"px\" : '', _Object$assign2[sideX] = hasX ? x + \"px\" : '', _Object$assign2.transform = '', _Object$assign2));\n}\n\nfunction computeStyles(_ref4) {\n var state = _ref4.state,\n options = _ref4.options;\n var _options$gpuAccelerat = options.gpuAcceleration,\n gpuAcceleration = _options$gpuAccelerat === void 0 ? true : _options$gpuAccelerat,\n _options$adaptive = options.adaptive,\n adaptive = _options$adaptive === void 0 ? true : _options$adaptive,\n _options$roundOffsets = options.roundOffsets,\n roundOffsets = _options$roundOffsets === void 0 ? true : _options$roundOffsets;\n\n if (process.env.NODE_ENV !== \"production\") {\n var transitionProperty = getComputedStyle(state.elements.popper).transitionProperty || '';\n\n if (adaptive && ['transform', 'top', 'right', 'bottom', 'left'].some(function (property) {\n return transitionProperty.indexOf(property) >= 0;\n })) {\n console.warn(['Popper: Detected CSS transitions on at least one of the following', 'CSS properties: \"transform\", \"top\", \"right\", \"bottom\", \"left\".', '\\n\\n', 'Disable the \"computeStyles\" modifier\\'s `adaptive` option to allow', 'for smooth transitions, or remove these properties from the CSS', 'transition declaration on the popper element if only transitioning', 'opacity or background-color for example.', '\\n\\n', 'We recommend using the popper element as a wrapper around an inner', 'element that can have any CSS property transitioned for animations.'].join(' '));\n }\n }\n\n var commonStyles = {\n placement: getBasePlacement(state.placement),\n popper: state.elements.popper,\n popperRect: state.rects.popper,\n gpuAcceleration: gpuAcceleration\n };\n\n if (state.modifiersData.popperOffsets != null) {\n state.styles.popper = Object.assign({}, state.styles.popper, mapToStyles(Object.assign({}, commonStyles, {\n offsets: state.modifiersData.popperOffsets,\n position: state.options.strategy,\n adaptive: adaptive,\n roundOffsets: roundOffsets\n })));\n }\n\n if (state.modifiersData.arrow != null) {\n state.styles.arrow = Object.assign({}, state.styles.arrow, mapToStyles(Object.assign({}, commonStyles, {\n offsets: state.modifiersData.arrow,\n position: 'absolute',\n adaptive: false,\n roundOffsets: roundOffsets\n })));\n }\n\n state.attributes.popper = Object.assign({}, state.attributes.popper, {\n 'data-popper-placement': state.placement\n });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'computeStyles',\n enabled: true,\n phase: 'beforeWrite',\n fn: computeStyles,\n data: {}\n};","import getWindow from \"../dom-utils/getWindow.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar passive = {\n passive: true\n};\n\nfunction effect(_ref) {\n var state = _ref.state,\n instance = _ref.instance,\n options = _ref.options;\n var _options$scroll = options.scroll,\n scroll = _options$scroll === void 0 ? true : _options$scroll,\n _options$resize = options.resize,\n resize = _options$resize === void 0 ? true : _options$resize;\n var window = getWindow(state.elements.popper);\n var scrollParents = [].concat(state.scrollParents.reference, state.scrollParents.popper);\n\n if (scroll) {\n scrollParents.forEach(function (scrollParent) {\n scrollParent.addEventListener('scroll', instance.update, passive);\n });\n }\n\n if (resize) {\n window.addEventListener('resize', instance.update, passive);\n }\n\n return function () {\n if (scroll) {\n scrollParents.forEach(function (scrollParent) {\n scrollParent.removeEventListener('scroll', instance.update, passive);\n });\n }\n\n if (resize) {\n window.removeEventListener('resize', instance.update, passive);\n }\n };\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'eventListeners',\n enabled: true,\n phase: 'write',\n fn: function fn() {},\n effect: effect,\n data: {}\n};","var hash = {\n left: 'right',\n right: 'left',\n bottom: 'top',\n top: 'bottom'\n};\nexport default function getOppositePlacement(placement) {\n return placement.replace(/left|right|bottom|top/g, function (matched) {\n return hash[matched];\n });\n}","var hash = {\n start: 'end',\n end: 'start'\n};\nexport default function getOppositeVariationPlacement(placement) {\n return placement.replace(/start|end/g, function (matched) {\n return hash[matched];\n });\n}","import getWindow from \"./getWindow.js\";\nexport default function getWindowScroll(node) {\n var win = getWindow(node);\n var scrollLeft = win.pageXOffset;\n var scrollTop = win.pageYOffset;\n return {\n scrollLeft: scrollLeft,\n scrollTop: scrollTop\n };\n}","import getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getWindowScroll from \"./getWindowScroll.js\";\nexport default function getWindowScrollBarX(element) {\n // If has a CSS width greater than the viewport, then this will be\n // incorrect for RTL.\n // Popper 1 is broken in this case and never had a bug report so let's assume\n // it's not an issue. I don't think anyone ever specifies width on \n // anyway.\n // Browsers where the left scrollbar doesn't cause an issue report `0` for\n // this (e.g. Edge 2019, IE11, Safari)\n return getBoundingClientRect(getDocumentElement(element)).left + getWindowScroll(element).scrollLeft;\n}","import getComputedStyle from \"./getComputedStyle.js\";\nexport default function isScrollParent(element) {\n // Firefox wants us to check `-x` and `-y` variations as well\n var _getComputedStyle = getComputedStyle(element),\n overflow = _getComputedStyle.overflow,\n overflowX = _getComputedStyle.overflowX,\n overflowY = _getComputedStyle.overflowY;\n\n return /auto|scroll|overlay|hidden/.test(overflow + overflowY + overflowX);\n}","import getScrollParent from \"./getScrollParent.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport getWindow from \"./getWindow.js\";\nimport isScrollParent from \"./isScrollParent.js\";\n/*\ngiven a DOM element, return the list of all scroll parents, up the list of ancesors\nuntil we get to the top window object. This list is what we attach scroll listeners\nto, because if any of these parent elements scroll, we'll need to re-calculate the\nreference element's position.\n*/\n\nexport default function listScrollParents(element, list) {\n var _element$ownerDocumen;\n\n if (list === void 0) {\n list = [];\n }\n\n var scrollParent = getScrollParent(element);\n var isBody = scrollParent === ((_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body);\n var win = getWindow(scrollParent);\n var target = isBody ? [win].concat(win.visualViewport || [], isScrollParent(scrollParent) ? scrollParent : []) : scrollParent;\n var updatedList = list.concat(target);\n return isBody ? updatedList : // $FlowFixMe[incompatible-call]: isBody tells us target will be an HTMLElement here\n updatedList.concat(listScrollParents(getParentNode(target)));\n}","import getParentNode from \"./getParentNode.js\";\nimport isScrollParent from \"./isScrollParent.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nexport default function getScrollParent(node) {\n if (['html', 'body', '#document'].indexOf(getNodeName(node)) >= 0) {\n // $FlowFixMe[incompatible-return]: assume body is always available\n return node.ownerDocument.body;\n }\n\n if (isHTMLElement(node) && isScrollParent(node)) {\n return node;\n }\n\n return getScrollParent(getParentNode(node));\n}","export default function rectToClientRect(rect) {\n return Object.assign({}, rect, {\n left: rect.x,\n top: rect.y,\n right: rect.x + rect.width,\n bottom: rect.y + rect.height\n });\n}","import { viewport } from \"../enums.js\";\nimport getViewportRect from \"./getViewportRect.js\";\nimport getDocumentRect from \"./getDocumentRect.js\";\nimport listScrollParents from \"./listScrollParents.js\";\nimport getOffsetParent from \"./getOffsetParent.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport { isElement, isHTMLElement } from \"./instanceOf.js\";\nimport getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport contains from \"./contains.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport rectToClientRect from \"../utils/rectToClientRect.js\";\nimport { max, min } from \"../utils/math.js\";\n\nfunction getInnerBoundingClientRect(element) {\n var rect = getBoundingClientRect(element);\n rect.top = rect.top + element.clientTop;\n rect.left = rect.left + element.clientLeft;\n rect.bottom = rect.top + element.clientHeight;\n rect.right = rect.left + element.clientWidth;\n rect.width = element.clientWidth;\n rect.height = element.clientHeight;\n rect.x = rect.left;\n rect.y = rect.top;\n return rect;\n}\n\nfunction getClientRectFromMixedType(element, clippingParent) {\n return clippingParent === viewport ? rectToClientRect(getViewportRect(element)) : isHTMLElement(clippingParent) ? getInnerBoundingClientRect(clippingParent) : rectToClientRect(getDocumentRect(getDocumentElement(element)));\n} // A \"clipping parent\" is an overflowable container with the characteristic of\n// clipping (or hiding) overflowing elements with a position different from\n// `initial`\n\n\nfunction getClippingParents(element) {\n var clippingParents = listScrollParents(getParentNode(element));\n var canEscapeClipping = ['absolute', 'fixed'].indexOf(getComputedStyle(element).position) >= 0;\n var clipperElement = canEscapeClipping && isHTMLElement(element) ? getOffsetParent(element) : element;\n\n if (!isElement(clipperElement)) {\n return [];\n } // $FlowFixMe[incompatible-return]: https://github.com/facebook/flow/issues/1414\n\n\n return clippingParents.filter(function (clippingParent) {\n return isElement(clippingParent) && contains(clippingParent, clipperElement) && getNodeName(clippingParent) !== 'body';\n });\n} // Gets the maximum area that the element is visible in due to any number of\n// clipping parents\n\n\nexport default function getClippingRect(element, boundary, rootBoundary) {\n var mainClippingParents = boundary === 'clippingParents' ? getClippingParents(element) : [].concat(boundary);\n var clippingParents = [].concat(mainClippingParents, [rootBoundary]);\n var firstClippingParent = clippingParents[0];\n var clippingRect = clippingParents.reduce(function (accRect, clippingParent) {\n var rect = getClientRectFromMixedType(element, clippingParent);\n accRect.top = max(rect.top, accRect.top);\n accRect.right = min(rect.right, accRect.right);\n accRect.bottom = min(rect.bottom, accRect.bottom);\n accRect.left = max(rect.left, accRect.left);\n return accRect;\n }, getClientRectFromMixedType(element, firstClippingParent));\n clippingRect.width = clippingRect.right - clippingRect.left;\n clippingRect.height = clippingRect.bottom - clippingRect.top;\n clippingRect.x = clippingRect.left;\n clippingRect.y = clippingRect.top;\n return clippingRect;\n}","import getWindow from \"./getWindow.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nexport default function getViewportRect(element) {\n var win = getWindow(element);\n var html = getDocumentElement(element);\n var visualViewport = win.visualViewport;\n var width = html.clientWidth;\n var height = html.clientHeight;\n var x = 0;\n var y = 0; // NB: This isn't supported on iOS <= 12. If the keyboard is open, the popper\n // can be obscured underneath it.\n // Also, `html.clientHeight` adds the bottom bar height in Safari iOS, even\n // if it isn't open, so if this isn't available, the popper will be detected\n // to overflow the bottom of the screen too early.\n\n if (visualViewport) {\n width = visualViewport.width;\n height = visualViewport.height; // Uses Layout Viewport (like Chrome; Safari does not currently)\n // In Chrome, it returns a value very close to 0 (+/-) but contains rounding\n // errors due to floating point numbers, so we need to check precision.\n // Safari returns a number <= 0, usually < -1 when pinch-zoomed\n // Feature detection fails in mobile emulation mode in Chrome.\n // Math.abs(win.innerWidth / visualViewport.scale - visualViewport.width) <\n // 0.001\n // Fallback here: \"Not Safari\" userAgent\n\n if (!/^((?!chrome|android).)*safari/i.test(navigator.userAgent)) {\n x = visualViewport.offsetLeft;\n y = visualViewport.offsetTop;\n }\n }\n\n return {\n width: width,\n height: height,\n x: x + getWindowScrollBarX(element),\n y: y\n };\n}","import getDocumentElement from \"./getDocumentElement.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nimport getWindowScroll from \"./getWindowScroll.js\";\nimport { max } from \"../utils/math.js\"; // Gets the entire size of the scrollable document area, even extending outside\n// of the `` and `` rect bounds if horizontally scrollable\n\nexport default function getDocumentRect(element) {\n var _element$ownerDocumen;\n\n var html = getDocumentElement(element);\n var winScroll = getWindowScroll(element);\n var body = (_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body;\n var width = max(html.scrollWidth, html.clientWidth, body ? body.scrollWidth : 0, body ? body.clientWidth : 0);\n var height = max(html.scrollHeight, html.clientHeight, body ? body.scrollHeight : 0, body ? body.clientHeight : 0);\n var x = -winScroll.scrollLeft + getWindowScrollBarX(element);\n var y = -winScroll.scrollTop;\n\n if (getComputedStyle(body || html).direction === 'rtl') {\n x += max(html.clientWidth, body ? body.clientWidth : 0) - width;\n }\n\n return {\n width: width,\n height: height,\n x: x,\n y: y\n };\n}","export default function getVariation(placement) {\n return placement.split('-')[1];\n}","import getBasePlacement from \"./getBasePlacement.js\";\nimport getVariation from \"./getVariation.js\";\nimport getMainAxisFromPlacement from \"./getMainAxisFromPlacement.js\";\nimport { top, right, bottom, left, start, end } from \"../enums.js\";\nexport default function computeOffsets(_ref) {\n var reference = _ref.reference,\n element = _ref.element,\n placement = _ref.placement;\n var basePlacement = placement ? getBasePlacement(placement) : null;\n var variation = placement ? getVariation(placement) : null;\n var commonX = reference.x + reference.width / 2 - element.width / 2;\n var commonY = reference.y + reference.height / 2 - element.height / 2;\n var offsets;\n\n switch (basePlacement) {\n case top:\n offsets = {\n x: commonX,\n y: reference.y - element.height\n };\n break;\n\n case bottom:\n offsets = {\n x: commonX,\n y: reference.y + reference.height\n };\n break;\n\n case right:\n offsets = {\n x: reference.x + reference.width,\n y: commonY\n };\n break;\n\n case left:\n offsets = {\n x: reference.x - element.width,\n y: commonY\n };\n break;\n\n default:\n offsets = {\n x: reference.x,\n y: reference.y\n };\n }\n\n var mainAxis = basePlacement ? getMainAxisFromPlacement(basePlacement) : null;\n\n if (mainAxis != null) {\n var len = mainAxis === 'y' ? 'height' : 'width';\n\n switch (variation) {\n case start:\n offsets[mainAxis] = offsets[mainAxis] - (reference[len] / 2 - element[len] / 2);\n break;\n\n case end:\n offsets[mainAxis] = offsets[mainAxis] + (reference[len] / 2 - element[len] / 2);\n break;\n\n default:\n }\n }\n\n return offsets;\n}","import getBoundingClientRect from \"../dom-utils/getBoundingClientRect.js\";\nimport getClippingRect from \"../dom-utils/getClippingRect.js\";\nimport getDocumentElement from \"../dom-utils/getDocumentElement.js\";\nimport computeOffsets from \"./computeOffsets.js\";\nimport rectToClientRect from \"./rectToClientRect.js\";\nimport { clippingParents, reference, popper, bottom, top, right, basePlacements, viewport } from \"../enums.js\";\nimport { isElement } from \"../dom-utils/instanceOf.js\";\nimport mergePaddingObject from \"./mergePaddingObject.js\";\nimport expandToHashMap from \"./expandToHashMap.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport default function detectOverflow(state, options) {\n if (options === void 0) {\n options = {};\n }\n\n var _options = options,\n _options$placement = _options.placement,\n placement = _options$placement === void 0 ? state.placement : _options$placement,\n _options$boundary = _options.boundary,\n boundary = _options$boundary === void 0 ? clippingParents : _options$boundary,\n _options$rootBoundary = _options.rootBoundary,\n rootBoundary = _options$rootBoundary === void 0 ? viewport : _options$rootBoundary,\n _options$elementConte = _options.elementContext,\n elementContext = _options$elementConte === void 0 ? popper : _options$elementConte,\n _options$altBoundary = _options.altBoundary,\n altBoundary = _options$altBoundary === void 0 ? false : _options$altBoundary,\n _options$padding = _options.padding,\n padding = _options$padding === void 0 ? 0 : _options$padding;\n var paddingObject = mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements));\n var altContext = elementContext === popper ? reference : popper;\n var referenceElement = state.elements.reference;\n var popperRect = state.rects.popper;\n var element = state.elements[altBoundary ? altContext : elementContext];\n var clippingClientRect = getClippingRect(isElement(element) ? element : element.contextElement || getDocumentElement(state.elements.popper), boundary, rootBoundary);\n var referenceClientRect = getBoundingClientRect(referenceElement);\n var popperOffsets = computeOffsets({\n reference: referenceClientRect,\n element: popperRect,\n strategy: 'absolute',\n placement: placement\n });\n var popperClientRect = rectToClientRect(Object.assign({}, popperRect, popperOffsets));\n var elementClientRect = elementContext === popper ? popperClientRect : referenceClientRect; // positive = overflowing the clipping rect\n // 0 or negative = within the clipping rect\n\n var overflowOffsets = {\n top: clippingClientRect.top - elementClientRect.top + paddingObject.top,\n bottom: elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom,\n left: clippingClientRect.left - elementClientRect.left + paddingObject.left,\n right: elementClientRect.right - clippingClientRect.right + paddingObject.right\n };\n var offsetData = state.modifiersData.offset; // Offsets can be applied only to the popper element\n\n if (elementContext === popper && offsetData) {\n var offset = offsetData[placement];\n Object.keys(overflowOffsets).forEach(function (key) {\n var multiply = [right, bottom].indexOf(key) >= 0 ? 1 : -1;\n var axis = [top, bottom].indexOf(key) >= 0 ? 'y' : 'x';\n overflowOffsets[key] += offset[axis] * multiply;\n });\n }\n\n return overflowOffsets;\n}","import getVariation from \"./getVariation.js\";\nimport { variationPlacements, basePlacements, placements as allPlacements } from \"../enums.js\";\nimport detectOverflow from \"./detectOverflow.js\";\nimport getBasePlacement from \"./getBasePlacement.js\";\nexport default function computeAutoPlacement(state, options) {\n if (options === void 0) {\n options = {};\n }\n\n var _options = options,\n placement = _options.placement,\n boundary = _options.boundary,\n rootBoundary = _options.rootBoundary,\n padding = _options.padding,\n flipVariations = _options.flipVariations,\n _options$allowedAutoP = _options.allowedAutoPlacements,\n allowedAutoPlacements = _options$allowedAutoP === void 0 ? allPlacements : _options$allowedAutoP;\n var variation = getVariation(placement);\n var placements = variation ? flipVariations ? variationPlacements : variationPlacements.filter(function (placement) {\n return getVariation(placement) === variation;\n }) : basePlacements;\n var allowedPlacements = placements.filter(function (placement) {\n return allowedAutoPlacements.indexOf(placement) >= 0;\n });\n\n if (allowedPlacements.length === 0) {\n allowedPlacements = placements;\n\n if (process.env.NODE_ENV !== \"production\") {\n console.error(['Popper: The `allowedAutoPlacements` option did not allow any', 'placements. Ensure the `placement` option matches the variation', 'of the allowed placements.', 'For example, \"auto\" cannot be used to allow \"bottom-start\".', 'Use \"auto-start\" instead.'].join(' '));\n }\n } // $FlowFixMe[incompatible-type]: Flow seems to have problems with two array unions...\n\n\n var overflows = allowedPlacements.reduce(function (acc, placement) {\n acc[placement] = detectOverflow(state, {\n placement: placement,\n boundary: boundary,\n rootBoundary: rootBoundary,\n padding: padding\n })[getBasePlacement(placement)];\n return acc;\n }, {});\n return Object.keys(overflows).sort(function (a, b) {\n return overflows[a] - overflows[b];\n });\n}","import getOppositePlacement from \"../utils/getOppositePlacement.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getOppositeVariationPlacement from \"../utils/getOppositeVariationPlacement.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\nimport computeAutoPlacement from \"../utils/computeAutoPlacement.js\";\nimport { bottom, top, start, right, left, auto } from \"../enums.js\";\nimport getVariation from \"../utils/getVariation.js\"; // eslint-disable-next-line import/no-unused-modules\n\nfunction getExpandedFallbackPlacements(placement) {\n if (getBasePlacement(placement) === auto) {\n return [];\n }\n\n var oppositePlacement = getOppositePlacement(placement);\n return [getOppositeVariationPlacement(placement), oppositePlacement, getOppositeVariationPlacement(oppositePlacement)];\n}\n\nfunction flip(_ref) {\n var state = _ref.state,\n options = _ref.options,\n name = _ref.name;\n\n if (state.modifiersData[name]._skip) {\n return;\n }\n\n var _options$mainAxis = options.mainAxis,\n checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis,\n _options$altAxis = options.altAxis,\n checkAltAxis = _options$altAxis === void 0 ? true : _options$altAxis,\n specifiedFallbackPlacements = options.fallbackPlacements,\n padding = options.padding,\n boundary = options.boundary,\n rootBoundary = options.rootBoundary,\n altBoundary = options.altBoundary,\n _options$flipVariatio = options.flipVariations,\n flipVariations = _options$flipVariatio === void 0 ? true : _options$flipVariatio,\n allowedAutoPlacements = options.allowedAutoPlacements;\n var preferredPlacement = state.options.placement;\n var basePlacement = getBasePlacement(preferredPlacement);\n var isBasePlacement = basePlacement === preferredPlacement;\n var fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipVariations ? [getOppositePlacement(preferredPlacement)] : getExpandedFallbackPlacements(preferredPlacement));\n var placements = [preferredPlacement].concat(fallbackPlacements).reduce(function (acc, placement) {\n return acc.concat(getBasePlacement(placement) === auto ? computeAutoPlacement(state, {\n placement: placement,\n boundary: boundary,\n rootBoundary: rootBoundary,\n padding: padding,\n flipVariations: flipVariations,\n allowedAutoPlacements: allowedAutoPlacements\n }) : placement);\n }, []);\n var referenceRect = state.rects.reference;\n var popperRect = state.rects.popper;\n var checksMap = new Map();\n var makeFallbackChecks = true;\n var firstFittingPlacement = placements[0];\n\n for (var i = 0; i < placements.length; i++) {\n var placement = placements[i];\n\n var _basePlacement = getBasePlacement(placement);\n\n var isStartVariation = getVariation(placement) === start;\n var isVertical = [top, bottom].indexOf(_basePlacement) >= 0;\n var len = isVertical ? 'width' : 'height';\n var overflow = detectOverflow(state, {\n placement: placement,\n boundary: boundary,\n rootBoundary: rootBoundary,\n altBoundary: altBoundary,\n padding: padding\n });\n var mainVariationSide = isVertical ? isStartVariation ? right : left : isStartVariation ? bottom : top;\n\n if (referenceRect[len] > popperRect[len]) {\n mainVariationSide = getOppositePlacement(mainVariationSide);\n }\n\n var altVariationSide = getOppositePlacement(mainVariationSide);\n var checks = [];\n\n if (checkMainAxis) {\n checks.push(overflow[_basePlacement] <= 0);\n }\n\n if (checkAltAxis) {\n checks.push(overflow[mainVariationSide] <= 0, overflow[altVariationSide] <= 0);\n }\n\n if (checks.every(function (check) {\n return check;\n })) {\n firstFittingPlacement = placement;\n makeFallbackChecks = false;\n break;\n }\n\n checksMap.set(placement, checks);\n }\n\n if (makeFallbackChecks) {\n // `2` may be desired in some cases – research later\n var numberOfChecks = flipVariations ? 3 : 1;\n\n var _loop = function _loop(_i) {\n var fittingPlacement = placements.find(function (placement) {\n var checks = checksMap.get(placement);\n\n if (checks) {\n return checks.slice(0, _i).every(function (check) {\n return check;\n });\n }\n });\n\n if (fittingPlacement) {\n firstFittingPlacement = fittingPlacement;\n return \"break\";\n }\n };\n\n for (var _i = numberOfChecks; _i > 0; _i--) {\n var _ret = _loop(_i);\n\n if (_ret === \"break\") break;\n }\n }\n\n if (state.placement !== firstFittingPlacement) {\n state.modifiersData[name]._skip = true;\n state.placement = firstFittingPlacement;\n state.reset = true;\n }\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'flip',\n enabled: true,\n phase: 'main',\n fn: flip,\n requiresIfExists: ['offset'],\n data: {\n _skip: false\n }\n};","import { top, bottom, left, right } from \"../enums.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\n\nfunction getSideOffsets(overflow, rect, preventedOffsets) {\n if (preventedOffsets === void 0) {\n preventedOffsets = {\n x: 0,\n y: 0\n };\n }\n\n return {\n top: overflow.top - rect.height - preventedOffsets.y,\n right: overflow.right - rect.width + preventedOffsets.x,\n bottom: overflow.bottom - rect.height + preventedOffsets.y,\n left: overflow.left - rect.width - preventedOffsets.x\n };\n}\n\nfunction isAnySideFullyClipped(overflow) {\n return [top, right, bottom, left].some(function (side) {\n return overflow[side] >= 0;\n });\n}\n\nfunction hide(_ref) {\n var state = _ref.state,\n name = _ref.name;\n var referenceRect = state.rects.reference;\n var popperRect = state.rects.popper;\n var preventedOffsets = state.modifiersData.preventOverflow;\n var referenceOverflow = detectOverflow(state, {\n elementContext: 'reference'\n });\n var popperAltOverflow = detectOverflow(state, {\n altBoundary: true\n });\n var referenceClippingOffsets = getSideOffsets(referenceOverflow, referenceRect);\n var popperEscapeOffsets = getSideOffsets(popperAltOverflow, popperRect, preventedOffsets);\n var isReferenceHidden = isAnySideFullyClipped(referenceClippingOffsets);\n var hasPopperEscaped = isAnySideFullyClipped(popperEscapeOffsets);\n state.modifiersData[name] = {\n referenceClippingOffsets: referenceClippingOffsets,\n popperEscapeOffsets: popperEscapeOffsets,\n isReferenceHidden: isReferenceHidden,\n hasPopperEscaped: hasPopperEscaped\n };\n state.attributes.popper = Object.assign({}, state.attributes.popper, {\n 'data-popper-reference-hidden': isReferenceHidden,\n 'data-popper-escaped': hasPopperEscaped\n });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'hide',\n enabled: true,\n phase: 'main',\n requiresIfExists: ['preventOverflow'],\n fn: hide\n};","import getBasePlacement from \"../utils/getBasePlacement.js\";\nimport { top, left, right, placements } from \"../enums.js\";\nexport function distanceAndSkiddingToXY(placement, rects, offset) {\n var basePlacement = getBasePlacement(placement);\n var invertDistance = [left, top].indexOf(basePlacement) >= 0 ? -1 : 1;\n\n var _ref = typeof offset === 'function' ? offset(Object.assign({}, rects, {\n placement: placement\n })) : offset,\n skidding = _ref[0],\n distance = _ref[1];\n\n skidding = skidding || 0;\n distance = (distance || 0) * invertDistance;\n return [left, right].indexOf(basePlacement) >= 0 ? {\n x: distance,\n y: skidding\n } : {\n x: skidding,\n y: distance\n };\n}\n\nfunction offset(_ref2) {\n var state = _ref2.state,\n options = _ref2.options,\n name = _ref2.name;\n var _options$offset = options.offset,\n offset = _options$offset === void 0 ? [0, 0] : _options$offset;\n var data = placements.reduce(function (acc, placement) {\n acc[placement] = distanceAndSkiddingToXY(placement, state.rects, offset);\n return acc;\n }, {});\n var _data$state$placement = data[state.placement],\n x = _data$state$placement.x,\n y = _data$state$placement.y;\n\n if (state.modifiersData.popperOffsets != null) {\n state.modifiersData.popperOffsets.x += x;\n state.modifiersData.popperOffsets.y += y;\n }\n\n state.modifiersData[name] = data;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'offset',\n enabled: true,\n phase: 'main',\n requires: ['popperOffsets'],\n fn: offset\n};","import computeOffsets from \"../utils/computeOffsets.js\";\n\nfunction popperOffsets(_ref) {\n var state = _ref.state,\n name = _ref.name;\n // Offsets are the actual position the popper needs to have to be\n // properly positioned near its reference element\n // This is the most basic placement, and will be adjusted by\n // the modifiers in the next step\n state.modifiersData[name] = computeOffsets({\n reference: state.rects.reference,\n element: state.rects.popper,\n strategy: 'absolute',\n placement: state.placement\n });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'popperOffsets',\n enabled: true,\n phase: 'read',\n fn: popperOffsets,\n data: {}\n};","import { top, left, right, bottom, start } from \"../enums.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getMainAxisFromPlacement from \"../utils/getMainAxisFromPlacement.js\";\nimport getAltAxis from \"../utils/getAltAxis.js\";\nimport within from \"../utils/within.js\";\nimport getLayoutRect from \"../dom-utils/getLayoutRect.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\nimport getVariation from \"../utils/getVariation.js\";\nimport getFreshSideObject from \"../utils/getFreshSideObject.js\";\nimport { max as mathMax, min as mathMin } from \"../utils/math.js\";\n\nfunction preventOverflow(_ref) {\n var state = _ref.state,\n options = _ref.options,\n name = _ref.name;\n var _options$mainAxis = options.mainAxis,\n checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis,\n _options$altAxis = options.altAxis,\n checkAltAxis = _options$altAxis === void 0 ? false : _options$altAxis,\n boundary = options.boundary,\n rootBoundary = options.rootBoundary,\n altBoundary = options.altBoundary,\n padding = options.padding,\n _options$tether = options.tether,\n tether = _options$tether === void 0 ? true : _options$tether,\n _options$tetherOffset = options.tetherOffset,\n tetherOffset = _options$tetherOffset === void 0 ? 0 : _options$tetherOffset;\n var overflow = detectOverflow(state, {\n boundary: boundary,\n rootBoundary: rootBoundary,\n padding: padding,\n altBoundary: altBoundary\n });\n var basePlacement = getBasePlacement(state.placement);\n var variation = getVariation(state.placement);\n var isBasePlacement = !variation;\n var mainAxis = getMainAxisFromPlacement(basePlacement);\n var altAxis = getAltAxis(mainAxis);\n var popperOffsets = state.modifiersData.popperOffsets;\n var referenceRect = state.rects.reference;\n var popperRect = state.rects.popper;\n var tetherOffsetValue = typeof tetherOffset === 'function' ? tetherOffset(Object.assign({}, state.rects, {\n placement: state.placement\n })) : tetherOffset;\n var data = {\n x: 0,\n y: 0\n };\n\n if (!popperOffsets) {\n return;\n }\n\n if (checkMainAxis || checkAltAxis) {\n var mainSide = mainAxis === 'y' ? top : left;\n var altSide = mainAxis === 'y' ? bottom : right;\n var len = mainAxis === 'y' ? 'height' : 'width';\n var offset = popperOffsets[mainAxis];\n var min = popperOffsets[mainAxis] + overflow[mainSide];\n var max = popperOffsets[mainAxis] - overflow[altSide];\n var additive = tether ? -popperRect[len] / 2 : 0;\n var minLen = variation === start ? referenceRect[len] : popperRect[len];\n var maxLen = variation === start ? -popperRect[len] : -referenceRect[len]; // We need to include the arrow in the calculation so the arrow doesn't go\n // outside the reference bounds\n\n var arrowElement = state.elements.arrow;\n var arrowRect = tether && arrowElement ? getLayoutRect(arrowElement) : {\n width: 0,\n height: 0\n };\n var arrowPaddingObject = state.modifiersData['arrow#persistent'] ? state.modifiersData['arrow#persistent'].padding : getFreshSideObject();\n var arrowPaddingMin = arrowPaddingObject[mainSide];\n var arrowPaddingMax = arrowPaddingObject[altSide]; // If the reference length is smaller than the arrow length, we don't want\n // to include its full size in the calculation. If the reference is small\n // and near the edge of a boundary, the popper can overflow even if the\n // reference is not overflowing as well (e.g. virtual elements with no\n // width or height)\n\n var arrowLen = within(0, referenceRect[len], arrowRect[len]);\n var minOffset = isBasePlacement ? referenceRect[len] / 2 - additive - arrowLen - arrowPaddingMin - tetherOffsetValue : minLen - arrowLen - arrowPaddingMin - tetherOffsetValue;\n var maxOffset = isBasePlacement ? -referenceRect[len] / 2 + additive + arrowLen + arrowPaddingMax + tetherOffsetValue : maxLen + arrowLen + arrowPaddingMax + tetherOffsetValue;\n var arrowOffsetParent = state.elements.arrow && getOffsetParent(state.elements.arrow);\n var clientOffset = arrowOffsetParent ? mainAxis === 'y' ? arrowOffsetParent.clientTop || 0 : arrowOffsetParent.clientLeft || 0 : 0;\n var offsetModifierValue = state.modifiersData.offset ? state.modifiersData.offset[state.placement][mainAxis] : 0;\n var tetherMin = popperOffsets[mainAxis] + minOffset - offsetModifierValue - clientOffset;\n var tetherMax = popperOffsets[mainAxis] + maxOffset - offsetModifierValue;\n\n if (checkMainAxis) {\n var preventedOffset = within(tether ? mathMin(min, tetherMin) : min, offset, tether ? mathMax(max, tetherMax) : max);\n popperOffsets[mainAxis] = preventedOffset;\n data[mainAxis] = preventedOffset - offset;\n }\n\n if (checkAltAxis) {\n var _mainSide = mainAxis === 'x' ? top : left;\n\n var _altSide = mainAxis === 'x' ? bottom : right;\n\n var _offset = popperOffsets[altAxis];\n\n var _min = _offset + overflow[_mainSide];\n\n var _max = _offset - overflow[_altSide];\n\n var _preventedOffset = within(tether ? mathMin(_min, tetherMin) : _min, _offset, tether ? mathMax(_max, tetherMax) : _max);\n\n popperOffsets[altAxis] = _preventedOffset;\n data[altAxis] = _preventedOffset - _offset;\n }\n }\n\n state.modifiersData[name] = data;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'preventOverflow',\n enabled: true,\n phase: 'main',\n fn: preventOverflow,\n requiresIfExists: ['offset']\n};","export default function getAltAxis(axis) {\n return axis === 'x' ? 'y' : 'x';\n}","import getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getNodeScroll from \"./getNodeScroll.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport isScrollParent from \"./isScrollParent.js\"; // Returns the composite rect of an element relative to its offsetParent.\n// Composite means it takes into account transforms as well as layout.\n\nexport default function getCompositeRect(elementOrVirtualElement, offsetParent, isFixed) {\n if (isFixed === void 0) {\n isFixed = false;\n }\n\n var documentElement = getDocumentElement(offsetParent);\n var rect = getBoundingClientRect(elementOrVirtualElement);\n var isOffsetParentAnElement = isHTMLElement(offsetParent);\n var scroll = {\n scrollLeft: 0,\n scrollTop: 0\n };\n var offsets = {\n x: 0,\n y: 0\n };\n\n if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {\n if (getNodeName(offsetParent) !== 'body' || // https://github.com/popperjs/popper-core/issues/1078\n isScrollParent(documentElement)) {\n scroll = getNodeScroll(offsetParent);\n }\n\n if (isHTMLElement(offsetParent)) {\n offsets = getBoundingClientRect(offsetParent);\n offsets.x += offsetParent.clientLeft;\n offsets.y += offsetParent.clientTop;\n } else if (documentElement) {\n offsets.x = getWindowScrollBarX(documentElement);\n }\n }\n\n return {\n x: rect.left + scroll.scrollLeft - offsets.x,\n y: rect.top + scroll.scrollTop - offsets.y,\n width: rect.width,\n height: rect.height\n };\n}","import getWindowScroll from \"./getWindowScroll.js\";\nimport getWindow from \"./getWindow.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nimport getHTMLElementScroll from \"./getHTMLElementScroll.js\";\nexport default function getNodeScroll(node) {\n if (node === getWindow(node) || !isHTMLElement(node)) {\n return getWindowScroll(node);\n } else {\n return getHTMLElementScroll(node);\n }\n}","export default function getHTMLElementScroll(element) {\n return {\n scrollLeft: element.scrollLeft,\n scrollTop: element.scrollTop\n };\n}","import getCompositeRect from \"./dom-utils/getCompositeRect.js\";\nimport getLayoutRect from \"./dom-utils/getLayoutRect.js\";\nimport listScrollParents from \"./dom-utils/listScrollParents.js\";\nimport getOffsetParent from \"./dom-utils/getOffsetParent.js\";\nimport getComputedStyle from \"./dom-utils/getComputedStyle.js\";\nimport orderModifiers from \"./utils/orderModifiers.js\";\nimport debounce from \"./utils/debounce.js\";\nimport validateModifiers from \"./utils/validateModifiers.js\";\nimport uniqueBy from \"./utils/uniqueBy.js\";\nimport getBasePlacement from \"./utils/getBasePlacement.js\";\nimport mergeByName from \"./utils/mergeByName.js\";\nimport detectOverflow from \"./utils/detectOverflow.js\";\nimport { isElement } from \"./dom-utils/instanceOf.js\";\nimport { auto } from \"./enums.js\";\nvar INVALID_ELEMENT_ERROR = 'Popper: Invalid reference or popper argument provided. They must be either a DOM element or virtual element.';\nvar INFINITE_LOOP_ERROR = 'Popper: An infinite loop in the modifiers cycle has been detected! The cycle has been interrupted to prevent a browser crash.';\nvar DEFAULT_OPTIONS = {\n placement: 'bottom',\n modifiers: [],\n strategy: 'absolute'\n};\n\nfunction areValidElements() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n return !args.some(function (element) {\n return !(element && typeof element.getBoundingClientRect === 'function');\n });\n}\n\nexport function popperGenerator(generatorOptions) {\n if (generatorOptions === void 0) {\n generatorOptions = {};\n }\n\n var _generatorOptions = generatorOptions,\n _generatorOptions$def = _generatorOptions.defaultModifiers,\n defaultModifiers = _generatorOptions$def === void 0 ? [] : _generatorOptions$def,\n _generatorOptions$def2 = _generatorOptions.defaultOptions,\n defaultOptions = _generatorOptions$def2 === void 0 ? DEFAULT_OPTIONS : _generatorOptions$def2;\n return function createPopper(reference, popper, options) {\n if (options === void 0) {\n options = defaultOptions;\n }\n\n var state = {\n placement: 'bottom',\n orderedModifiers: [],\n options: Object.assign({}, DEFAULT_OPTIONS, defaultOptions),\n modifiersData: {},\n elements: {\n reference: reference,\n popper: popper\n },\n attributes: {},\n styles: {}\n };\n var effectCleanupFns = [];\n var isDestroyed = false;\n var instance = {\n state: state,\n setOptions: function setOptions(options) {\n cleanupModifierEffects();\n state.options = Object.assign({}, defaultOptions, state.options, options);\n state.scrollParents = {\n reference: isElement(reference) ? listScrollParents(reference) : reference.contextElement ? listScrollParents(reference.contextElement) : [],\n popper: listScrollParents(popper)\n }; // Orders the modifiers based on their dependencies and `phase`\n // properties\n\n var orderedModifiers = orderModifiers(mergeByName([].concat(defaultModifiers, state.options.modifiers))); // Strip out disabled modifiers\n\n state.orderedModifiers = orderedModifiers.filter(function (m) {\n return m.enabled;\n }); // Validate the provided modifiers so that the consumer will get warned\n // if one of the modifiers is invalid for any reason\n\n if (process.env.NODE_ENV !== \"production\") {\n var modifiers = uniqueBy([].concat(orderedModifiers, state.options.modifiers), function (_ref) {\n var name = _ref.name;\n return name;\n });\n validateModifiers(modifiers);\n\n if (getBasePlacement(state.options.placement) === auto) {\n var flipModifier = state.orderedModifiers.find(function (_ref2) {\n var name = _ref2.name;\n return name === 'flip';\n });\n\n if (!flipModifier) {\n console.error(['Popper: \"auto\" placements require the \"flip\" modifier be', 'present and enabled to work.'].join(' '));\n }\n }\n\n var _getComputedStyle = getComputedStyle(popper),\n marginTop = _getComputedStyle.marginTop,\n marginRight = _getComputedStyle.marginRight,\n marginBottom = _getComputedStyle.marginBottom,\n marginLeft = _getComputedStyle.marginLeft; // We no longer take into account `margins` on the popper, and it can\n // cause bugs with positioning, so we'll warn the consumer\n\n\n if ([marginTop, marginRight, marginBottom, marginLeft].some(function (margin) {\n return parseFloat(margin);\n })) {\n console.warn(['Popper: CSS \"margin\" styles cannot be used to apply padding', 'between the popper and its reference element or boundary.', 'To replicate margin, use the `offset` modifier, as well as', 'the `padding` option in the `preventOverflow` and `flip`', 'modifiers.'].join(' '));\n }\n }\n\n runModifierEffects();\n return instance.update();\n },\n // Sync update – it will always be executed, even if not necessary. This\n // is useful for low frequency updates where sync behavior simplifies the\n // logic.\n // For high frequency updates (e.g. `resize` and `scroll` events), always\n // prefer the async Popper#update method\n forceUpdate: function forceUpdate() {\n if (isDestroyed) {\n return;\n }\n\n var _state$elements = state.elements,\n reference = _state$elements.reference,\n popper = _state$elements.popper; // Don't proceed if `reference` or `popper` are not valid elements\n // anymore\n\n if (!areValidElements(reference, popper)) {\n if (process.env.NODE_ENV !== \"production\") {\n console.error(INVALID_ELEMENT_ERROR);\n }\n\n return;\n } // Store the reference and popper rects to be read by modifiers\n\n\n state.rects = {\n reference: getCompositeRect(reference, getOffsetParent(popper), state.options.strategy === 'fixed'),\n popper: getLayoutRect(popper)\n }; // Modifiers have the ability to reset the current update cycle. The\n // most common use case for this is the `flip` modifier changing the\n // placement, which then needs to re-run all the modifiers, because the\n // logic was previously ran for the previous placement and is therefore\n // stale/incorrect\n\n state.reset = false;\n state.placement = state.options.placement; // On each update cycle, the `modifiersData` property for each modifier\n // is filled with the initial data specified by the modifier. This means\n // it doesn't persist and is fresh on each update.\n // To ensure persistent data, use `${name}#persistent`\n\n state.orderedModifiers.forEach(function (modifier) {\n return state.modifiersData[modifier.name] = Object.assign({}, modifier.data);\n });\n var __debug_loops__ = 0;\n\n for (var index = 0; index < state.orderedModifiers.length; index++) {\n if (process.env.NODE_ENV !== \"production\") {\n __debug_loops__ += 1;\n\n if (__debug_loops__ > 100) {\n console.error(INFINITE_LOOP_ERROR);\n break;\n }\n }\n\n if (state.reset === true) {\n state.reset = false;\n index = -1;\n continue;\n }\n\n var _state$orderedModifie = state.orderedModifiers[index],\n fn = _state$orderedModifie.fn,\n _state$orderedModifie2 = _state$orderedModifie.options,\n _options = _state$orderedModifie2 === void 0 ? {} : _state$orderedModifie2,\n name = _state$orderedModifie.name;\n\n if (typeof fn === 'function') {\n state = fn({\n state: state,\n options: _options,\n name: name,\n instance: instance\n }) || state;\n }\n }\n },\n // Async and optimistically optimized update – it will not be executed if\n // not necessary (debounced to run at most once-per-tick)\n update: debounce(function () {\n return new Promise(function (resolve) {\n instance.forceUpdate();\n resolve(state);\n });\n }),\n destroy: function destroy() {\n cleanupModifierEffects();\n isDestroyed = true;\n }\n };\n\n if (!areValidElements(reference, popper)) {\n if (process.env.NODE_ENV !== \"production\") {\n console.error(INVALID_ELEMENT_ERROR);\n }\n\n return instance;\n }\n\n instance.setOptions(options).then(function (state) {\n if (!isDestroyed && options.onFirstUpdate) {\n options.onFirstUpdate(state);\n }\n }); // Modifiers have the ability to execute arbitrary code before the first\n // update cycle runs. They will be executed in the same order as the update\n // cycle. This is useful when a modifier adds some persistent data that\n // other modifiers need to use, but the modifier is run after the dependent\n // one.\n\n function runModifierEffects() {\n state.orderedModifiers.forEach(function (_ref3) {\n var name = _ref3.name,\n _ref3$options = _ref3.options,\n options = _ref3$options === void 0 ? {} : _ref3$options,\n effect = _ref3.effect;\n\n if (typeof effect === 'function') {\n var cleanupFn = effect({\n state: state,\n name: name,\n instance: instance,\n options: options\n });\n\n var noopFn = function noopFn() {};\n\n effectCleanupFns.push(cleanupFn || noopFn);\n }\n });\n }\n\n function cleanupModifierEffects() {\n effectCleanupFns.forEach(function (fn) {\n return fn();\n });\n effectCleanupFns = [];\n }\n\n return instance;\n };\n}\nexport var createPopper = /*#__PURE__*/popperGenerator(); // eslint-disable-next-line import/no-unused-modules\n\nexport { detectOverflow };","export default function debounce(fn) {\n var pending;\n return function () {\n if (!pending) {\n pending = new Promise(function (resolve) {\n Promise.resolve().then(function () {\n pending = undefined;\n resolve(fn());\n });\n });\n }\n\n return pending;\n };\n}","export default function mergeByName(modifiers) {\n var merged = modifiers.reduce(function (merged, current) {\n var existing = merged[current.name];\n merged[current.name] = existing ? Object.assign({}, existing, current, {\n options: Object.assign({}, existing.options, current.options),\n data: Object.assign({}, existing.data, current.data)\n }) : current;\n return merged;\n }, {}); // IE11 does not support Object.values\n\n return Object.keys(merged).map(function (key) {\n return merged[key];\n });\n}","import { modifierPhases } from \"../enums.js\"; // source: https://stackoverflow.com/questions/49875255\n\nfunction order(modifiers) {\n var map = new Map();\n var visited = new Set();\n var result = [];\n modifiers.forEach(function (modifier) {\n map.set(modifier.name, modifier);\n }); // On visiting object, check for its dependencies and visit them recursively\n\n function sort(modifier) {\n visited.add(modifier.name);\n var requires = [].concat(modifier.requires || [], modifier.requiresIfExists || []);\n requires.forEach(function (dep) {\n if (!visited.has(dep)) {\n var depModifier = map.get(dep);\n\n if (depModifier) {\n sort(depModifier);\n }\n }\n });\n result.push(modifier);\n }\n\n modifiers.forEach(function (modifier) {\n if (!visited.has(modifier.name)) {\n // check for visited object\n sort(modifier);\n }\n });\n return result;\n}\n\nexport default function orderModifiers(modifiers) {\n // order based on dependencies\n var orderedModifiers = order(modifiers); // order based on phase\n\n return modifierPhases.reduce(function (acc, phase) {\n return acc.concat(orderedModifiers.filter(function (modifier) {\n return modifier.phase === phase;\n }));\n }, []);\n}","import { popperGenerator, detectOverflow } from \"./createPopper.js\";\nimport eventListeners from \"./modifiers/eventListeners.js\";\nimport popperOffsets from \"./modifiers/popperOffsets.js\";\nimport computeStyles from \"./modifiers/computeStyles.js\";\nimport applyStyles from \"./modifiers/applyStyles.js\";\nvar defaultModifiers = [eventListeners, popperOffsets, computeStyles, applyStyles];\nvar createPopper = /*#__PURE__*/popperGenerator({\n defaultModifiers: defaultModifiers\n}); // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper, popperGenerator, defaultModifiers, detectOverflow };","import { popperGenerator, detectOverflow } from \"./createPopper.js\";\nimport eventListeners from \"./modifiers/eventListeners.js\";\nimport popperOffsets from \"./modifiers/popperOffsets.js\";\nimport computeStyles from \"./modifiers/computeStyles.js\";\nimport applyStyles from \"./modifiers/applyStyles.js\";\nimport offset from \"./modifiers/offset.js\";\nimport flip from \"./modifiers/flip.js\";\nimport preventOverflow from \"./modifiers/preventOverflow.js\";\nimport arrow from \"./modifiers/arrow.js\";\nimport hide from \"./modifiers/hide.js\";\nvar defaultModifiers = [eventListeners, popperOffsets, computeStyles, applyStyles, offset, flip, preventOverflow, arrow, hide];\nvar createPopper = /*#__PURE__*/popperGenerator({\n defaultModifiers: defaultModifiers\n}); // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper, popperGenerator, defaultModifiers, detectOverflow }; // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper as createPopperLite } from \"./popper-lite.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport * from \"./modifiers/index.js\";","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.0.2): dropdown.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport * as Popper from '@popperjs/core'\n\nimport {\n defineJQueryPlugin,\n getElement,\n getElementFromSelector,\n isDisabled,\n isElement,\n isVisible,\n isRTL,\n noop,\n getNextActiveElement,\n typeCheckConfig\n} from './util/index'\nimport EventHandler from './dom/event-handler'\nimport Manipulator from './dom/manipulator'\nimport SelectorEngine from './dom/selector-engine'\nimport BaseComponent from './base-component'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'dropdown'\nconst DATA_KEY = 'bs.dropdown'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst ESCAPE_KEY = 'Escape'\nconst SPACE_KEY = 'Space'\nconst TAB_KEY = 'Tab'\nconst ARROW_UP_KEY = 'ArrowUp'\nconst ARROW_DOWN_KEY = 'ArrowDown'\nconst RIGHT_MOUSE_BUTTON = 2 // MouseEvent.button value for the secondary button, usually the right button\n\nconst REGEXP_KEYDOWN = new RegExp(`${ARROW_UP_KEY}|${ARROW_DOWN_KEY}|${ESCAPE_KEY}`)\n\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_CLICK = `click${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\nconst EVENT_KEYDOWN_DATA_API = `keydown${EVENT_KEY}${DATA_API_KEY}`\nconst EVENT_KEYUP_DATA_API = `keyup${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_DROPUP = 'dropup'\nconst CLASS_NAME_DROPEND = 'dropend'\nconst CLASS_NAME_DROPSTART = 'dropstart'\nconst CLASS_NAME_NAVBAR = 'navbar'\n\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"dropdown\"]'\nconst SELECTOR_MENU = '.dropdown-menu'\nconst SELECTOR_NAVBAR_NAV = '.navbar-nav'\nconst SELECTOR_VISIBLE_ITEMS = '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)'\n\nconst PLACEMENT_TOP = isRTL() ? 'top-end' : 'top-start'\nconst PLACEMENT_TOPEND = isRTL() ? 'top-start' : 'top-end'\nconst PLACEMENT_BOTTOM = isRTL() ? 'bottom-end' : 'bottom-start'\nconst PLACEMENT_BOTTOMEND = isRTL() ? 'bottom-start' : 'bottom-end'\nconst PLACEMENT_RIGHT = isRTL() ? 'left-start' : 'right-start'\nconst PLACEMENT_LEFT = isRTL() ? 'right-start' : 'left-start'\n\nconst Default = {\n offset: [0, 2],\n boundary: 'clippingParents',\n reference: 'toggle',\n display: 'dynamic',\n popperConfig: null,\n autoClose: true\n}\n\nconst DefaultType = {\n offset: '(array|string|function)',\n boundary: '(string|element)',\n reference: '(string|element|object)',\n display: 'string',\n popperConfig: '(null|object|function)',\n autoClose: '(boolean|string)'\n}\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Dropdown extends BaseComponent {\n constructor(element, config) {\n super(element)\n\n this._popper = null\n this._config = this._getConfig(config)\n this._menu = this._getMenuElement()\n this._inNavbar = this._detectNavbar()\n\n this._addEventListeners()\n }\n\n // Getters\n\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n\n toggle() {\n if (isDisabled(this._element)) {\n return\n }\n\n const isActive = this._element.classList.contains(CLASS_NAME_SHOW)\n\n if (isActive) {\n this.hide()\n return\n }\n\n this.show()\n }\n\n show() {\n if (isDisabled(this._element) || this._menu.classList.contains(CLASS_NAME_SHOW)) {\n return\n }\n\n const parent = Dropdown.getParentFromElement(this._element)\n const relatedTarget = {\n relatedTarget: this._element\n }\n\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW, relatedTarget)\n\n if (showEvent.defaultPrevented) {\n return\n }\n\n // Totally disable Popper for Dropdowns in Navbar\n if (this._inNavbar) {\n Manipulator.setDataAttribute(this._menu, 'popper', 'none')\n } else {\n if (typeof Popper === 'undefined') {\n throw new TypeError('Bootstrap\\'s dropdowns require Popper (https://popper.js.org)')\n }\n\n let referenceElement = this._element\n\n if (this._config.reference === 'parent') {\n referenceElement = parent\n } else if (isElement(this._config.reference)) {\n referenceElement = getElement(this._config.reference)\n } else if (typeof this._config.reference === 'object') {\n referenceElement = this._config.reference\n }\n\n const popperConfig = this._getPopperConfig()\n const isDisplayStatic = popperConfig.modifiers.find(modifier => modifier.name === 'applyStyles' && modifier.enabled === false)\n\n this._popper = Popper.createPopper(referenceElement, this._menu, popperConfig)\n\n if (isDisplayStatic) {\n Manipulator.setDataAttribute(this._menu, 'popper', 'static')\n }\n }\n\n // If this is a touch-enabled device we add extra\n // empty mouseover listeners to the body's immediate children;\n // only needed because of broken event delegation on iOS\n // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n if ('ontouchstart' in document.documentElement &&\n !parent.closest(SELECTOR_NAVBAR_NAV)) {\n [].concat(...document.body.children)\n .forEach(elem => EventHandler.on(elem, 'mouseover', noop))\n }\n\n this._element.focus()\n this._element.setAttribute('aria-expanded', true)\n\n this._menu.classList.toggle(CLASS_NAME_SHOW)\n this._element.classList.toggle(CLASS_NAME_SHOW)\n EventHandler.trigger(this._element, EVENT_SHOWN, relatedTarget)\n }\n\n hide() {\n if (isDisabled(this._element) || !this._menu.classList.contains(CLASS_NAME_SHOW)) {\n return\n }\n\n const relatedTarget = {\n relatedTarget: this._element\n }\n\n this._completeHide(relatedTarget)\n }\n\n dispose() {\n if (this._popper) {\n this._popper.destroy()\n }\n\n super.dispose()\n }\n\n update() {\n this._inNavbar = this._detectNavbar()\n if (this._popper) {\n this._popper.update()\n }\n }\n\n // Private\n\n _addEventListeners() {\n EventHandler.on(this._element, EVENT_CLICK, event => {\n event.preventDefault()\n this.toggle()\n })\n }\n\n _completeHide(relatedTarget) {\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE, relatedTarget)\n if (hideEvent.defaultPrevented) {\n return\n }\n\n // If this is a touch-enabled device we remove the extra\n // empty mouseover listeners we added for iOS support\n if ('ontouchstart' in document.documentElement) {\n [].concat(...document.body.children)\n .forEach(elem => EventHandler.off(elem, 'mouseover', noop))\n }\n\n if (this._popper) {\n this._popper.destroy()\n }\n\n this._menu.classList.remove(CLASS_NAME_SHOW)\n this._element.classList.remove(CLASS_NAME_SHOW)\n this._element.setAttribute('aria-expanded', 'false')\n Manipulator.removeDataAttribute(this._menu, 'popper')\n EventHandler.trigger(this._element, EVENT_HIDDEN, relatedTarget)\n }\n\n _getConfig(config) {\n config = {\n ...this.constructor.Default,\n ...Manipulator.getDataAttributes(this._element),\n ...config\n }\n\n typeCheckConfig(NAME, config, this.constructor.DefaultType)\n\n if (typeof config.reference === 'object' && !isElement(config.reference) &&\n typeof config.reference.getBoundingClientRect !== 'function'\n ) {\n // Popper virtual elements require a getBoundingClientRect method\n throw new TypeError(`${NAME.toUpperCase()}: Option \"reference\" provided type \"object\" without a required \"getBoundingClientRect\" method.`)\n }\n\n return config\n }\n\n _getMenuElement() {\n return SelectorEngine.next(this._element, SELECTOR_MENU)[0]\n }\n\n _getPlacement() {\n const parentDropdown = this._element.parentNode\n\n if (parentDropdown.classList.contains(CLASS_NAME_DROPEND)) {\n return PLACEMENT_RIGHT\n }\n\n if (parentDropdown.classList.contains(CLASS_NAME_DROPSTART)) {\n return PLACEMENT_LEFT\n }\n\n // We need to trim the value because custom properties can also include spaces\n const isEnd = getComputedStyle(this._menu).getPropertyValue('--bs-position').trim() === 'end'\n\n if (parentDropdown.classList.contains(CLASS_NAME_DROPUP)) {\n return isEnd ? PLACEMENT_TOPEND : PLACEMENT_TOP\n }\n\n return isEnd ? PLACEMENT_BOTTOMEND : PLACEMENT_BOTTOM\n }\n\n _detectNavbar() {\n return this._element.closest(`.${CLASS_NAME_NAVBAR}`) !== null\n }\n\n _getOffset() {\n const { offset } = this._config\n\n if (typeof offset === 'string') {\n return offset.split(',').map(val => Number.parseInt(val, 10))\n }\n\n if (typeof offset === 'function') {\n return popperData => offset(popperData, this._element)\n }\n\n return offset\n }\n\n _getPopperConfig() {\n const defaultBsPopperConfig = {\n placement: this._getPlacement(),\n modifiers: [{\n name: 'preventOverflow',\n options: {\n boundary: this._config.boundary\n }\n },\n {\n name: 'offset',\n options: {\n offset: this._getOffset()\n }\n }]\n }\n\n // Disable Popper if we have a static display\n if (this._config.display === 'static') {\n defaultBsPopperConfig.modifiers = [{\n name: 'applyStyles',\n enabled: false\n }]\n }\n\n return {\n ...defaultBsPopperConfig,\n ...(typeof this._config.popperConfig === 'function' ? this._config.popperConfig(defaultBsPopperConfig) : this._config.popperConfig)\n }\n }\n\n _selectMenuItem({ key, target }) {\n const items = SelectorEngine.find(SELECTOR_VISIBLE_ITEMS, this._menu).filter(isVisible)\n\n if (!items.length) {\n return\n }\n\n // if target isn't included in items (e.g. when expanding the dropdown)\n // allow cycling to get the last item in case key equals ARROW_UP_KEY\n getNextActiveElement(items, target, key === ARROW_DOWN_KEY, !items.includes(target)).focus()\n }\n\n // Static\n\n static dropdownInterface(element, config) {\n const data = Dropdown.getOrCreateInstance(element, config)\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n }\n }\n\n static jQueryInterface(config) {\n return this.each(function () {\n Dropdown.dropdownInterface(this, config)\n })\n }\n\n static clearMenus(event) {\n if (event && (event.button === RIGHT_MOUSE_BUTTON || (event.type === 'keyup' && event.key !== TAB_KEY))) {\n return\n }\n\n const toggles = SelectorEngine.find(SELECTOR_DATA_TOGGLE)\n\n for (let i = 0, len = toggles.length; i < len; i++) {\n const context = Dropdown.getInstance(toggles[i])\n if (!context || context._config.autoClose === false) {\n continue\n }\n\n if (!context._element.classList.contains(CLASS_NAME_SHOW)) {\n continue\n }\n\n const relatedTarget = {\n relatedTarget: context._element\n }\n\n if (event) {\n const composedPath = event.composedPath()\n const isMenuTarget = composedPath.includes(context._menu)\n if (\n composedPath.includes(context._element) ||\n (context._config.autoClose === 'inside' && !isMenuTarget) ||\n (context._config.autoClose === 'outside' && isMenuTarget)\n ) {\n continue\n }\n\n // Tab navigation through the dropdown menu or events from contained inputs shouldn't close the menu\n if (context._menu.contains(event.target) && ((event.type === 'keyup' && event.key === TAB_KEY) || /input|select|option|textarea|form/i.test(event.target.tagName))) {\n continue\n }\n\n if (event.type === 'click') {\n relatedTarget.clickEvent = event\n }\n }\n\n context._completeHide(relatedTarget)\n }\n }\n\n static getParentFromElement(element) {\n return getElementFromSelector(element) || element.parentNode\n }\n\n static dataApiKeydownHandler(event) {\n // If not input/textarea:\n // - And not a key in REGEXP_KEYDOWN => not a dropdown command\n // If input/textarea:\n // - If space key => not a dropdown command\n // - If key is other than escape\n // - If key is not up or down => not a dropdown command\n // - If trigger inside the menu => not a dropdown command\n if (/input|textarea/i.test(event.target.tagName) ?\n event.key === SPACE_KEY || (event.key !== ESCAPE_KEY &&\n ((event.key !== ARROW_DOWN_KEY && event.key !== ARROW_UP_KEY) ||\n event.target.closest(SELECTOR_MENU))) :\n !REGEXP_KEYDOWN.test(event.key)) {\n return\n }\n\n const isActive = this.classList.contains(CLASS_NAME_SHOW)\n\n if (!isActive && event.key === ESCAPE_KEY) {\n return\n }\n\n event.preventDefault()\n event.stopPropagation()\n\n if (isDisabled(this)) {\n return\n }\n\n const getToggleButton = () => this.matches(SELECTOR_DATA_TOGGLE) ? this : SelectorEngine.prev(this, SELECTOR_DATA_TOGGLE)[0]\n\n if (event.key === ESCAPE_KEY) {\n getToggleButton().focus()\n Dropdown.clearMenus()\n return\n }\n\n if (event.key === ARROW_UP_KEY || event.key === ARROW_DOWN_KEY) {\n if (!isActive) {\n getToggleButton().click()\n }\n\n Dropdown.getInstance(getToggleButton())._selectMenuItem(event)\n return\n }\n\n if (!isActive || event.key === SPACE_KEY) {\n Dropdown.clearMenus()\n }\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\nEventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_DATA_TOGGLE, Dropdown.dataApiKeydownHandler)\nEventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_MENU, Dropdown.dataApiKeydownHandler)\nEventHandler.on(document, EVENT_CLICK_DATA_API, Dropdown.clearMenus)\nEventHandler.on(document, EVENT_KEYUP_DATA_API, Dropdown.clearMenus)\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n event.preventDefault()\n Dropdown.dropdownInterface(this)\n})\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n * add .Dropdown to jQuery only if jQuery is present\n */\n\ndefineJQueryPlugin(Dropdown)\n\nexport default Dropdown\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.0.2): util/scrollBar.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport SelectorEngine from '../dom/selector-engine'\nimport Manipulator from '../dom/manipulator'\nimport { isElement } from './index'\n\nconst SELECTOR_FIXED_CONTENT = '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top'\nconst SELECTOR_STICKY_CONTENT = '.sticky-top'\n\nclass ScrollBarHelper {\n constructor() {\n this._element = document.body\n }\n\n getWidth() {\n // https://developer.mozilla.org/en-US/docs/Web/API/Window/innerWidth#usage_notes\n const documentWidth = document.documentElement.clientWidth\n return Math.abs(window.innerWidth - documentWidth)\n }\n\n hide() {\n const width = this.getWidth()\n this._disableOverFlow()\n // give padding to element to balance the hidden scrollbar width\n this._setElementAttributes(this._element, 'paddingRight', calculatedValue => calculatedValue + width)\n // trick: We adjust positive paddingRight and negative marginRight to sticky-top elements to keep showing fullwidth\n this._setElementAttributes(SELECTOR_FIXED_CONTENT, 'paddingRight', calculatedValue => calculatedValue + width)\n this._setElementAttributes(SELECTOR_STICKY_CONTENT, 'marginRight', calculatedValue => calculatedValue - width)\n }\n\n _disableOverFlow() {\n this._saveInitialAttribute(this._element, 'overflow')\n this._element.style.overflow = 'hidden'\n }\n\n _setElementAttributes(selector, styleProp, callback) {\n const scrollbarWidth = this.getWidth()\n const manipulationCallBack = element => {\n if (element !== this._element && window.innerWidth > element.clientWidth + scrollbarWidth) {\n return\n }\n\n this._saveInitialAttribute(element, styleProp)\n const calculatedValue = window.getComputedStyle(element)[styleProp]\n element.style[styleProp] = `${callback(Number.parseFloat(calculatedValue))}px`\n }\n\n this._applyManipulationCallback(selector, manipulationCallBack)\n }\n\n reset() {\n this._resetElementAttributes(this._element, 'overflow')\n this._resetElementAttributes(this._element, 'paddingRight')\n this._resetElementAttributes(SELECTOR_FIXED_CONTENT, 'paddingRight')\n this._resetElementAttributes(SELECTOR_STICKY_CONTENT, 'marginRight')\n }\n\n _saveInitialAttribute(element, styleProp) {\n const actualValue = element.style[styleProp]\n if (actualValue) {\n Manipulator.setDataAttribute(element, styleProp, actualValue)\n }\n }\n\n _resetElementAttributes(selector, styleProp) {\n const manipulationCallBack = element => {\n const value = Manipulator.getDataAttribute(element, styleProp)\n if (typeof value === 'undefined') {\n element.style.removeProperty(styleProp)\n } else {\n Manipulator.removeDataAttribute(element, styleProp)\n element.style[styleProp] = value\n }\n }\n\n this._applyManipulationCallback(selector, manipulationCallBack)\n }\n\n _applyManipulationCallback(selector, callBack) {\n if (isElement(selector)) {\n callBack(selector)\n } else {\n SelectorEngine.find(selector, this._element).forEach(callBack)\n }\n }\n\n isOverflowing() {\n return this.getWidth() > 0\n }\n}\n\nexport default ScrollBarHelper\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.0.2): util/backdrop.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport EventHandler from '../dom/event-handler'\nimport { execute, executeAfterTransition, getElement, reflow, typeCheckConfig } from './index'\n\nconst Default = {\n isVisible: true, // if false, we use the backdrop helper without adding any element to the dom\n isAnimated: false,\n rootElement: 'body', // give the choice to place backdrop under different elements\n clickCallback: null\n}\n\nconst DefaultType = {\n isVisible: 'boolean',\n isAnimated: 'boolean',\n rootElement: '(element|string)',\n clickCallback: '(function|null)'\n}\nconst NAME = 'backdrop'\nconst CLASS_NAME_BACKDROP = 'modal-backdrop'\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_SHOW = 'show'\n\nconst EVENT_MOUSEDOWN = `mousedown.bs.${NAME}`\n\nclass Backdrop {\n constructor(config) {\n this._config = this._getConfig(config)\n this._isAppended = false\n this._element = null\n }\n\n show(callback) {\n if (!this._config.isVisible) {\n execute(callback)\n return\n }\n\n this._append()\n\n if (this._config.isAnimated) {\n reflow(this._getElement())\n }\n\n this._getElement().classList.add(CLASS_NAME_SHOW)\n\n this._emulateAnimation(() => {\n execute(callback)\n })\n }\n\n hide(callback) {\n if (!this._config.isVisible) {\n execute(callback)\n return\n }\n\n this._getElement().classList.remove(CLASS_NAME_SHOW)\n\n this._emulateAnimation(() => {\n this.dispose()\n execute(callback)\n })\n }\n\n // Private\n\n _getElement() {\n if (!this._element) {\n const backdrop = document.createElement('div')\n backdrop.className = CLASS_NAME_BACKDROP\n if (this._config.isAnimated) {\n backdrop.classList.add(CLASS_NAME_FADE)\n }\n\n this._element = backdrop\n }\n\n return this._element\n }\n\n _getConfig(config) {\n config = {\n ...Default,\n ...(typeof config === 'object' ? config : {})\n }\n\n // use getElement() with the default \"body\" to get a fresh Element on each instantiation\n config.rootElement = getElement(config.rootElement)\n typeCheckConfig(NAME, config, DefaultType)\n return config\n }\n\n _append() {\n if (this._isAppended) {\n return\n }\n\n this._config.rootElement.appendChild(this._getElement())\n\n EventHandler.on(this._getElement(), EVENT_MOUSEDOWN, () => {\n execute(this._config.clickCallback)\n })\n\n this._isAppended = true\n }\n\n dispose() {\n if (!this._isAppended) {\n return\n }\n\n EventHandler.off(this._element, EVENT_MOUSEDOWN)\n\n this._element.remove()\n this._isAppended = false\n }\n\n _emulateAnimation(callback) {\n executeAfterTransition(callback, this._getElement(), this._config.isAnimated)\n }\n}\n\nexport default Backdrop\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.0.2): modal.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport {\n defineJQueryPlugin,\n getElementFromSelector,\n isRTL,\n isVisible,\n reflow,\n typeCheckConfig\n} from './util/index'\nimport EventHandler from './dom/event-handler'\nimport Manipulator from './dom/manipulator'\nimport SelectorEngine from './dom/selector-engine'\nimport ScrollBarHelper from './util/scrollbar'\nimport BaseComponent from './base-component'\nimport Backdrop from './util/backdrop'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'modal'\nconst DATA_KEY = 'bs.modal'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst ESCAPE_KEY = 'Escape'\n\nconst Default = {\n backdrop: true,\n keyboard: true,\n focus: true\n}\n\nconst DefaultType = {\n backdrop: '(boolean|string)',\n keyboard: 'boolean',\n focus: 'boolean'\n}\n\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDE_PREVENTED = `hidePrevented${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_FOCUSIN = `focusin${EVENT_KEY}`\nconst EVENT_RESIZE = `resize${EVENT_KEY}`\nconst EVENT_CLICK_DISMISS = `click.dismiss${EVENT_KEY}`\nconst EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY}`\nconst EVENT_MOUSEUP_DISMISS = `mouseup.dismiss${EVENT_KEY}`\nconst EVENT_MOUSEDOWN_DISMISS = `mousedown.dismiss${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_OPEN = 'modal-open'\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_STATIC = 'modal-static'\n\nconst SELECTOR_DIALOG = '.modal-dialog'\nconst SELECTOR_MODAL_BODY = '.modal-body'\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"modal\"]'\nconst SELECTOR_DATA_DISMISS = '[data-bs-dismiss=\"modal\"]'\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Modal extends BaseComponent {\n constructor(element, config) {\n super(element)\n\n this._config = this._getConfig(config)\n this._dialog = SelectorEngine.findOne(SELECTOR_DIALOG, this._element)\n this._backdrop = this._initializeBackDrop()\n this._isShown = false\n this._ignoreBackdropClick = false\n this._isTransitioning = false\n this._scrollBar = new ScrollBarHelper()\n }\n\n // Getters\n\n static get Default() {\n return Default\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n\n toggle(relatedTarget) {\n return this._isShown ? this.hide() : this.show(relatedTarget)\n }\n\n show(relatedTarget) {\n if (this._isShown || this._isTransitioning) {\n return\n }\n\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW, {\n relatedTarget\n })\n\n if (showEvent.defaultPrevented) {\n return\n }\n\n this._isShown = true\n\n if (this._isAnimated()) {\n this._isTransitioning = true\n }\n\n this._scrollBar.hide()\n\n document.body.classList.add(CLASS_NAME_OPEN)\n\n this._adjustDialog()\n\n this._setEscapeEvent()\n this._setResizeEvent()\n\n EventHandler.on(this._element, EVENT_CLICK_DISMISS, SELECTOR_DATA_DISMISS, event => this.hide(event))\n\n EventHandler.on(this._dialog, EVENT_MOUSEDOWN_DISMISS, () => {\n EventHandler.one(this._element, EVENT_MOUSEUP_DISMISS, event => {\n if (event.target === this._element) {\n this._ignoreBackdropClick = true\n }\n })\n })\n\n this._showBackdrop(() => this._showElement(relatedTarget))\n }\n\n hide(event) {\n if (event && ['A', 'AREA'].includes(event.target.tagName)) {\n event.preventDefault()\n }\n\n if (!this._isShown || this._isTransitioning) {\n return\n }\n\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE)\n\n if (hideEvent.defaultPrevented) {\n return\n }\n\n this._isShown = false\n const isAnimated = this._isAnimated()\n\n if (isAnimated) {\n this._isTransitioning = true\n }\n\n this._setEscapeEvent()\n this._setResizeEvent()\n\n EventHandler.off(document, EVENT_FOCUSIN)\n\n this._element.classList.remove(CLASS_NAME_SHOW)\n\n EventHandler.off(this._element, EVENT_CLICK_DISMISS)\n EventHandler.off(this._dialog, EVENT_MOUSEDOWN_DISMISS)\n\n this._queueCallback(() => this._hideModal(), this._element, isAnimated)\n }\n\n dispose() {\n [window, this._dialog]\n .forEach(htmlElement => EventHandler.off(htmlElement, EVENT_KEY))\n\n this._backdrop.dispose()\n super.dispose()\n\n /**\n * `document` has 2 events `EVENT_FOCUSIN` and `EVENT_CLICK_DATA_API`\n * Do not move `document` in `htmlElements` array\n * It will remove `EVENT_CLICK_DATA_API` event that should remain\n */\n EventHandler.off(document, EVENT_FOCUSIN)\n }\n\n handleUpdate() {\n this._adjustDialog()\n }\n\n // Private\n\n _initializeBackDrop() {\n return new Backdrop({\n isVisible: Boolean(this._config.backdrop), // 'static' option will be translated to true, and booleans will keep their value\n isAnimated: this._isAnimated()\n })\n }\n\n _getConfig(config) {\n config = {\n ...Default,\n ...Manipulator.getDataAttributes(this._element),\n ...(typeof config === 'object' ? config : {})\n }\n typeCheckConfig(NAME, config, DefaultType)\n return config\n }\n\n _showElement(relatedTarget) {\n const isAnimated = this._isAnimated()\n const modalBody = SelectorEngine.findOne(SELECTOR_MODAL_BODY, this._dialog)\n\n if (!this._element.parentNode || this._element.parentNode.nodeType !== Node.ELEMENT_NODE) {\n // Don't move modal's DOM position\n document.body.appendChild(this._element)\n }\n\n this._element.style.display = 'block'\n this._element.removeAttribute('aria-hidden')\n this._element.setAttribute('aria-modal', true)\n this._element.setAttribute('role', 'dialog')\n this._element.scrollTop = 0\n\n if (modalBody) {\n modalBody.scrollTop = 0\n }\n\n if (isAnimated) {\n reflow(this._element)\n }\n\n this._element.classList.add(CLASS_NAME_SHOW)\n\n if (this._config.focus) {\n this._enforceFocus()\n }\n\n const transitionComplete = () => {\n if (this._config.focus) {\n this._element.focus()\n }\n\n this._isTransitioning = false\n EventHandler.trigger(this._element, EVENT_SHOWN, {\n relatedTarget\n })\n }\n\n this._queueCallback(transitionComplete, this._dialog, isAnimated)\n }\n\n _enforceFocus() {\n EventHandler.off(document, EVENT_FOCUSIN) // guard against infinite focus loop\n EventHandler.on(document, EVENT_FOCUSIN, event => {\n if (document !== event.target &&\n this._element !== event.target &&\n !this._element.contains(event.target)) {\n this._element.focus()\n }\n })\n }\n\n _setEscapeEvent() {\n if (this._isShown) {\n EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS, event => {\n if (this._config.keyboard && event.key === ESCAPE_KEY) {\n event.preventDefault()\n this.hide()\n } else if (!this._config.keyboard && event.key === ESCAPE_KEY) {\n this._triggerBackdropTransition()\n }\n })\n } else {\n EventHandler.off(this._element, EVENT_KEYDOWN_DISMISS)\n }\n }\n\n _setResizeEvent() {\n if (this._isShown) {\n EventHandler.on(window, EVENT_RESIZE, () => this._adjustDialog())\n } else {\n EventHandler.off(window, EVENT_RESIZE)\n }\n }\n\n _hideModal() {\n this._element.style.display = 'none'\n this._element.setAttribute('aria-hidden', true)\n this._element.removeAttribute('aria-modal')\n this._element.removeAttribute('role')\n this._isTransitioning = false\n this._backdrop.hide(() => {\n document.body.classList.remove(CLASS_NAME_OPEN)\n this._resetAdjustments()\n this._scrollBar.reset()\n EventHandler.trigger(this._element, EVENT_HIDDEN)\n })\n }\n\n _showBackdrop(callback) {\n EventHandler.on(this._element, EVENT_CLICK_DISMISS, event => {\n if (this._ignoreBackdropClick) {\n this._ignoreBackdropClick = false\n return\n }\n\n if (event.target !== event.currentTarget) {\n return\n }\n\n if (this._config.backdrop === true) {\n this.hide()\n } else if (this._config.backdrop === 'static') {\n this._triggerBackdropTransition()\n }\n })\n\n this._backdrop.show(callback)\n }\n\n _isAnimated() {\n return this._element.classList.contains(CLASS_NAME_FADE)\n }\n\n _triggerBackdropTransition() {\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED)\n if (hideEvent.defaultPrevented) {\n return\n }\n\n const { classList, scrollHeight, style } = this._element\n const isModalOverflowing = scrollHeight > document.documentElement.clientHeight\n\n // return if the following background transition hasn't yet completed\n if ((!isModalOverflowing && style.overflowY === 'hidden') || classList.contains(CLASS_NAME_STATIC)) {\n return\n }\n\n if (!isModalOverflowing) {\n style.overflowY = 'hidden'\n }\n\n classList.add(CLASS_NAME_STATIC)\n this._queueCallback(() => {\n classList.remove(CLASS_NAME_STATIC)\n if (!isModalOverflowing) {\n this._queueCallback(() => {\n style.overflowY = ''\n }, this._dialog)\n }\n }, this._dialog)\n\n this._element.focus()\n }\n\n // ----------------------------------------------------------------------\n // the following methods are used to handle overflowing modals\n // ----------------------------------------------------------------------\n\n _adjustDialog() {\n const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight\n const scrollbarWidth = this._scrollBar.getWidth()\n const isBodyOverflowing = scrollbarWidth > 0\n\n if ((!isBodyOverflowing && isModalOverflowing && !isRTL()) || (isBodyOverflowing && !isModalOverflowing && isRTL())) {\n this._element.style.paddingLeft = `${scrollbarWidth}px`\n }\n\n if ((isBodyOverflowing && !isModalOverflowing && !isRTL()) || (!isBodyOverflowing && isModalOverflowing && isRTL())) {\n this._element.style.paddingRight = `${scrollbarWidth}px`\n }\n }\n\n _resetAdjustments() {\n this._element.style.paddingLeft = ''\n this._element.style.paddingRight = ''\n }\n\n // Static\n\n static jQueryInterface(config, relatedTarget) {\n return this.each(function () {\n const data = Modal.getOrCreateInstance(this, config)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config](relatedTarget)\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n const target = getElementFromSelector(this)\n\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault()\n }\n\n EventHandler.one(target, EVENT_SHOW, showEvent => {\n if (showEvent.defaultPrevented) {\n // only register focus restorer if modal will actually get shown\n return\n }\n\n EventHandler.one(target, EVENT_HIDDEN, () => {\n if (isVisible(this)) {\n this.focus()\n }\n })\n })\n\n const data = Modal.getOrCreateInstance(target)\n\n data.toggle(this)\n})\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n * add .Modal to jQuery only if jQuery is present\n */\n\ndefineJQueryPlugin(Modal)\n\nexport default Modal\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.0.2): offcanvas.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport {\n defineJQueryPlugin,\n getElementFromSelector,\n isDisabled,\n isVisible,\n typeCheckConfig\n} from './util/index'\nimport ScrollBarHelper from './util/scrollbar'\nimport EventHandler from './dom/event-handler'\nimport BaseComponent from './base-component'\nimport SelectorEngine from './dom/selector-engine'\nimport Manipulator from './dom/manipulator'\nimport Backdrop from './util/backdrop'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'offcanvas'\nconst DATA_KEY = 'bs.offcanvas'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`\nconst ESCAPE_KEY = 'Escape'\n\nconst Default = {\n backdrop: true,\n keyboard: true,\n scroll: false\n}\n\nconst DefaultType = {\n backdrop: 'boolean',\n keyboard: 'boolean',\n scroll: 'boolean'\n}\n\nconst CLASS_NAME_SHOW = 'show'\nconst OPEN_SELECTOR = '.offcanvas.show'\n\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_FOCUSIN = `focusin${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\nconst EVENT_CLICK_DISMISS = `click.dismiss${EVENT_KEY}`\nconst EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY}`\n\nconst SELECTOR_DATA_DISMISS = '[data-bs-dismiss=\"offcanvas\"]'\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"offcanvas\"]'\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Offcanvas extends BaseComponent {\n constructor(element, config) {\n super(element)\n\n this._config = this._getConfig(config)\n this._isShown = false\n this._backdrop = this._initializeBackDrop()\n this._addEventListeners()\n }\n\n // Getters\n\n static get NAME() {\n return NAME\n }\n\n static get Default() {\n return Default\n }\n\n // Public\n\n toggle(relatedTarget) {\n return this._isShown ? this.hide() : this.show(relatedTarget)\n }\n\n show(relatedTarget) {\n if (this._isShown) {\n return\n }\n\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW, { relatedTarget })\n\n if (showEvent.defaultPrevented) {\n return\n }\n\n this._isShown = true\n this._element.style.visibility = 'visible'\n\n this._backdrop.show()\n\n if (!this._config.scroll) {\n new ScrollBarHelper().hide()\n this._enforceFocusOnElement(this._element)\n }\n\n this._element.removeAttribute('aria-hidden')\n this._element.setAttribute('aria-modal', true)\n this._element.setAttribute('role', 'dialog')\n this._element.classList.add(CLASS_NAME_SHOW)\n\n const completeCallBack = () => {\n EventHandler.trigger(this._element, EVENT_SHOWN, { relatedTarget })\n }\n\n this._queueCallback(completeCallBack, this._element, true)\n }\n\n hide() {\n if (!this._isShown) {\n return\n }\n\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE)\n\n if (hideEvent.defaultPrevented) {\n return\n }\n\n EventHandler.off(document, EVENT_FOCUSIN)\n this._element.blur()\n this._isShown = false\n this._element.classList.remove(CLASS_NAME_SHOW)\n this._backdrop.hide()\n\n const completeCallback = () => {\n this._element.setAttribute('aria-hidden', true)\n this._element.removeAttribute('aria-modal')\n this._element.removeAttribute('role')\n this._element.style.visibility = 'hidden'\n\n if (!this._config.scroll) {\n new ScrollBarHelper().reset()\n }\n\n EventHandler.trigger(this._element, EVENT_HIDDEN)\n }\n\n this._queueCallback(completeCallback, this._element, true)\n }\n\n dispose() {\n this._backdrop.dispose()\n super.dispose()\n EventHandler.off(document, EVENT_FOCUSIN)\n }\n\n // Private\n\n _getConfig(config) {\n config = {\n ...Default,\n ...Manipulator.getDataAttributes(this._element),\n ...(typeof config === 'object' ? config : {})\n }\n typeCheckConfig(NAME, config, DefaultType)\n return config\n }\n\n _initializeBackDrop() {\n return new Backdrop({\n isVisible: this._config.backdrop,\n isAnimated: true,\n rootElement: this._element.parentNode,\n clickCallback: () => this.hide()\n })\n }\n\n _enforceFocusOnElement(element) {\n EventHandler.off(document, EVENT_FOCUSIN) // guard against infinite focus loop\n EventHandler.on(document, EVENT_FOCUSIN, event => {\n if (document !== event.target &&\n element !== event.target &&\n !element.contains(event.target)) {\n element.focus()\n }\n })\n element.focus()\n }\n\n _addEventListeners() {\n EventHandler.on(this._element, EVENT_CLICK_DISMISS, SELECTOR_DATA_DISMISS, () => this.hide())\n\n EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS, event => {\n if (this._config.keyboard && event.key === ESCAPE_KEY) {\n this.hide()\n }\n })\n }\n\n // Static\n\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Offcanvas.getOrCreateInstance(this, config)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config](this)\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n const target = getElementFromSelector(this)\n\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault()\n }\n\n if (isDisabled(this)) {\n return\n }\n\n EventHandler.one(target, EVENT_HIDDEN, () => {\n // focus on trigger when it is closed\n if (isVisible(this)) {\n this.focus()\n }\n })\n\n // avoid conflict when clicking a toggler of an offcanvas, while another is open\n const allReadyOpen = SelectorEngine.findOne(OPEN_SELECTOR)\n if (allReadyOpen && allReadyOpen !== target) {\n Offcanvas.getInstance(allReadyOpen).hide()\n }\n\n const data = Offcanvas.getOrCreateInstance(target)\n data.toggle(this)\n})\n\nEventHandler.on(window, EVENT_LOAD_DATA_API, () =>\n SelectorEngine.find(OPEN_SELECTOR).forEach(el => Offcanvas.getOrCreateInstance(el).show())\n)\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\ndefineJQueryPlugin(Offcanvas)\n\nexport default Offcanvas\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.0.2): util/sanitizer.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nconst uriAttrs = new Set([\n 'background',\n 'cite',\n 'href',\n 'itemtype',\n 'longdesc',\n 'poster',\n 'src',\n 'xlink:href'\n])\n\nconst ARIA_ATTRIBUTE_PATTERN = /^aria-[\\w-]*$/i\n\n/**\n * A pattern that recognizes a commonly useful subset of URLs that are safe.\n *\n * Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts\n */\nconst SAFE_URL_PATTERN = /^(?:(?:https?|mailto|ftp|tel|file):|[^#&/:?]*(?:[#/?]|$))/i\n\n/**\n * A pattern that matches safe data URLs. Only matches image, video and audio types.\n *\n * Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts\n */\nconst DATA_URL_PATTERN = /^data:(?:image\\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\\/(?:mpeg|mp4|ogg|webm)|audio\\/(?:mp3|oga|ogg|opus));base64,[\\d+/a-z]+=*$/i\n\nconst allowedAttribute = (attr, allowedAttributeList) => {\n const attrName = attr.nodeName.toLowerCase()\n\n if (allowedAttributeList.includes(attrName)) {\n if (uriAttrs.has(attrName)) {\n return Boolean(SAFE_URL_PATTERN.test(attr.nodeValue) || DATA_URL_PATTERN.test(attr.nodeValue))\n }\n\n return true\n }\n\n const regExp = allowedAttributeList.filter(attrRegex => attrRegex instanceof RegExp)\n\n // Check if a regular expression validates the attribute.\n for (let i = 0, len = regExp.length; i < len; i++) {\n if (regExp[i].test(attrName)) {\n return true\n }\n }\n\n return false\n}\n\nexport const DefaultAllowlist = {\n // Global attributes allowed on any supplied element below.\n '*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN],\n a: ['target', 'href', 'title', 'rel'],\n area: [],\n b: [],\n br: [],\n col: [],\n code: [],\n div: [],\n em: [],\n hr: [],\n h1: [],\n h2: [],\n h3: [],\n h4: [],\n h5: [],\n h6: [],\n i: [],\n img: ['src', 'srcset', 'alt', 'title', 'width', 'height'],\n li: [],\n ol: [],\n p: [],\n pre: [],\n s: [],\n small: [],\n span: [],\n sub: [],\n sup: [],\n strong: [],\n u: [],\n ul: []\n}\n\nexport function sanitizeHtml(unsafeHtml, allowList, sanitizeFn) {\n if (!unsafeHtml.length) {\n return unsafeHtml\n }\n\n if (sanitizeFn && typeof sanitizeFn === 'function') {\n return sanitizeFn(unsafeHtml)\n }\n\n const domParser = new window.DOMParser()\n const createdDocument = domParser.parseFromString(unsafeHtml, 'text/html')\n const allowlistKeys = Object.keys(allowList)\n const elements = [].concat(...createdDocument.body.querySelectorAll('*'))\n\n for (let i = 0, len = elements.length; i < len; i++) {\n const el = elements[i]\n const elName = el.nodeName.toLowerCase()\n\n if (!allowlistKeys.includes(elName)) {\n el.remove()\n\n continue\n }\n\n const attributeList = [].concat(...el.attributes)\n const allowedAttributes = [].concat(allowList['*'] || [], allowList[elName] || [])\n\n attributeList.forEach(attr => {\n if (!allowedAttribute(attr, allowedAttributes)) {\n el.removeAttribute(attr.nodeName)\n }\n })\n }\n\n return createdDocument.body.innerHTML\n}\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.0.2): tooltip.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport * as Popper from '@popperjs/core'\n\nimport {\n defineJQueryPlugin,\n findShadowRoot,\n getElement,\n getUID,\n isElement,\n isRTL,\n noop,\n typeCheckConfig\n} from './util/index'\nimport {\n DefaultAllowlist,\n sanitizeHtml\n} from './util/sanitizer'\nimport Data from './dom/data'\nimport EventHandler from './dom/event-handler'\nimport Manipulator from './dom/manipulator'\nimport SelectorEngine from './dom/selector-engine'\nimport BaseComponent from './base-component'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'tooltip'\nconst DATA_KEY = 'bs.tooltip'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst CLASS_PREFIX = 'bs-tooltip'\nconst BSCLS_PREFIX_REGEX = new RegExp(`(^|\\\\s)${CLASS_PREFIX}\\\\S+`, 'g')\nconst DISALLOWED_ATTRIBUTES = new Set(['sanitize', 'allowList', 'sanitizeFn'])\n\nconst DefaultType = {\n animation: 'boolean',\n template: 'string',\n title: '(string|element|function)',\n trigger: 'string',\n delay: '(number|object)',\n html: 'boolean',\n selector: '(string|boolean)',\n placement: '(string|function)',\n offset: '(array|string|function)',\n container: '(string|element|boolean)',\n fallbackPlacements: 'array',\n boundary: '(string|element)',\n customClass: '(string|function)',\n sanitize: 'boolean',\n sanitizeFn: '(null|function)',\n allowList: 'object',\n popperConfig: '(null|object|function)'\n}\n\nconst AttachmentMap = {\n AUTO: 'auto',\n TOP: 'top',\n RIGHT: isRTL() ? 'left' : 'right',\n BOTTOM: 'bottom',\n LEFT: isRTL() ? 'right' : 'left'\n}\n\nconst Default = {\n animation: true,\n template: '

',\n trigger: 'hover focus',\n title: '',\n delay: 0,\n html: false,\n selector: false,\n placement: 'top',\n offset: [0, 0],\n container: false,\n fallbackPlacements: ['top', 'right', 'bottom', 'left'],\n boundary: 'clippingParents',\n customClass: '',\n sanitize: true,\n sanitizeFn: null,\n allowList: DefaultAllowlist,\n popperConfig: null\n}\n\nconst Event = {\n HIDE: `hide${EVENT_KEY}`,\n HIDDEN: `hidden${EVENT_KEY}`,\n SHOW: `show${EVENT_KEY}`,\n SHOWN: `shown${EVENT_KEY}`,\n INSERTED: `inserted${EVENT_KEY}`,\n CLICK: `click${EVENT_KEY}`,\n FOCUSIN: `focusin${EVENT_KEY}`,\n FOCUSOUT: `focusout${EVENT_KEY}`,\n MOUSEENTER: `mouseenter${EVENT_KEY}`,\n MOUSELEAVE: `mouseleave${EVENT_KEY}`\n}\n\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_MODAL = 'modal'\nconst CLASS_NAME_SHOW = 'show'\n\nconst HOVER_STATE_SHOW = 'show'\nconst HOVER_STATE_OUT = 'out'\n\nconst SELECTOR_TOOLTIP_INNER = '.tooltip-inner'\n\nconst TRIGGER_HOVER = 'hover'\nconst TRIGGER_FOCUS = 'focus'\nconst TRIGGER_CLICK = 'click'\nconst TRIGGER_MANUAL = 'manual'\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Tooltip extends BaseComponent {\n constructor(element, config) {\n if (typeof Popper === 'undefined') {\n throw new TypeError('Bootstrap\\'s tooltips require Popper (https://popper.js.org)')\n }\n\n super(element)\n\n // private\n this._isEnabled = true\n this._timeout = 0\n this._hoverState = ''\n this._activeTrigger = {}\n this._popper = null\n\n // Protected\n this._config = this._getConfig(config)\n this.tip = null\n\n this._setListeners()\n }\n\n // Getters\n\n static get Default() {\n return Default\n }\n\n static get NAME() {\n return NAME\n }\n\n static get Event() {\n return Event\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n // Public\n\n enable() {\n this._isEnabled = true\n }\n\n disable() {\n this._isEnabled = false\n }\n\n toggleEnabled() {\n this._isEnabled = !this._isEnabled\n }\n\n toggle(event) {\n if (!this._isEnabled) {\n return\n }\n\n if (event) {\n const context = this._initializeOnDelegatedTarget(event)\n\n context._activeTrigger.click = !context._activeTrigger.click\n\n if (context._isWithActiveTrigger()) {\n context._enter(null, context)\n } else {\n context._leave(null, context)\n }\n } else {\n if (this.getTipElement().classList.contains(CLASS_NAME_SHOW)) {\n this._leave(null, this)\n return\n }\n\n this._enter(null, this)\n }\n }\n\n dispose() {\n clearTimeout(this._timeout)\n\n EventHandler.off(this._element.closest(`.${CLASS_NAME_MODAL}`), 'hide.bs.modal', this._hideModalHandler)\n\n if (this.tip) {\n this.tip.remove()\n }\n\n if (this._popper) {\n this._popper.destroy()\n }\n\n super.dispose()\n }\n\n show() {\n if (this._element.style.display === 'none') {\n throw new Error('Please use show on visible elements')\n }\n\n if (!(this.isWithContent() && this._isEnabled)) {\n return\n }\n\n const showEvent = EventHandler.trigger(this._element, this.constructor.Event.SHOW)\n const shadowRoot = findShadowRoot(this._element)\n const isInTheDom = shadowRoot === null ?\n this._element.ownerDocument.documentElement.contains(this._element) :\n shadowRoot.contains(this._element)\n\n if (showEvent.defaultPrevented || !isInTheDom) {\n return\n }\n\n const tip = this.getTipElement()\n const tipId = getUID(this.constructor.NAME)\n\n tip.setAttribute('id', tipId)\n this._element.setAttribute('aria-describedby', tipId)\n\n this.setContent()\n\n if (this._config.animation) {\n tip.classList.add(CLASS_NAME_FADE)\n }\n\n const placement = typeof this._config.placement === 'function' ?\n this._config.placement.call(this, tip, this._element) :\n this._config.placement\n\n const attachment = this._getAttachment(placement)\n this._addAttachmentClass(attachment)\n\n const { container } = this._config\n Data.set(tip, this.constructor.DATA_KEY, this)\n\n if (!this._element.ownerDocument.documentElement.contains(this.tip)) {\n container.appendChild(tip)\n EventHandler.trigger(this._element, this.constructor.Event.INSERTED)\n }\n\n if (this._popper) {\n this._popper.update()\n } else {\n this._popper = Popper.createPopper(this._element, tip, this._getPopperConfig(attachment))\n }\n\n tip.classList.add(CLASS_NAME_SHOW)\n\n const customClass = typeof this._config.customClass === 'function' ? this._config.customClass() : this._config.customClass\n if (customClass) {\n tip.classList.add(...customClass.split(' '))\n }\n\n // If this is a touch-enabled device we add extra\n // empty mouseover listeners to the body's immediate children;\n // only needed because of broken event delegation on iOS\n // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n if ('ontouchstart' in document.documentElement) {\n [].concat(...document.body.children).forEach(element => {\n EventHandler.on(element, 'mouseover', noop)\n })\n }\n\n const complete = () => {\n const prevHoverState = this._hoverState\n\n this._hoverState = null\n EventHandler.trigger(this._element, this.constructor.Event.SHOWN)\n\n if (prevHoverState === HOVER_STATE_OUT) {\n this._leave(null, this)\n }\n }\n\n const isAnimated = this.tip.classList.contains(CLASS_NAME_FADE)\n this._queueCallback(complete, this.tip, isAnimated)\n }\n\n hide() {\n if (!this._popper) {\n return\n }\n\n const tip = this.getTipElement()\n const complete = () => {\n if (this._isWithActiveTrigger()) {\n return\n }\n\n if (this._hoverState !== HOVER_STATE_SHOW) {\n tip.remove()\n }\n\n this._cleanTipClass()\n this._element.removeAttribute('aria-describedby')\n EventHandler.trigger(this._element, this.constructor.Event.HIDDEN)\n\n if (this._popper) {\n this._popper.destroy()\n this._popper = null\n }\n }\n\n const hideEvent = EventHandler.trigger(this._element, this.constructor.Event.HIDE)\n if (hideEvent.defaultPrevented) {\n return\n }\n\n tip.classList.remove(CLASS_NAME_SHOW)\n\n // If this is a touch-enabled device we remove the extra\n // empty mouseover listeners we added for iOS support\n if ('ontouchstart' in document.documentElement) {\n [].concat(...document.body.children)\n .forEach(element => EventHandler.off(element, 'mouseover', noop))\n }\n\n this._activeTrigger[TRIGGER_CLICK] = false\n this._activeTrigger[TRIGGER_FOCUS] = false\n this._activeTrigger[TRIGGER_HOVER] = false\n\n const isAnimated = this.tip.classList.contains(CLASS_NAME_FADE)\n this._queueCallback(complete, this.tip, isAnimated)\n this._hoverState = ''\n }\n\n update() {\n if (this._popper !== null) {\n this._popper.update()\n }\n }\n\n // Protected\n\n isWithContent() {\n return Boolean(this.getTitle())\n }\n\n getTipElement() {\n if (this.tip) {\n return this.tip\n }\n\n const element = document.createElement('div')\n element.innerHTML = this._config.template\n\n this.tip = element.children[0]\n return this.tip\n }\n\n setContent() {\n const tip = this.getTipElement()\n this.setElementContent(SelectorEngine.findOne(SELECTOR_TOOLTIP_INNER, tip), this.getTitle())\n tip.classList.remove(CLASS_NAME_FADE, CLASS_NAME_SHOW)\n }\n\n setElementContent(element, content) {\n if (element === null) {\n return\n }\n\n if (isElement(content)) {\n content = getElement(content)\n\n // content is a DOM node or a jQuery\n if (this._config.html) {\n if (content.parentNode !== element) {\n element.innerHTML = ''\n element.appendChild(content)\n }\n } else {\n element.textContent = content.textContent\n }\n\n return\n }\n\n if (this._config.html) {\n if (this._config.sanitize) {\n content = sanitizeHtml(content, this._config.allowList, this._config.sanitizeFn)\n }\n\n element.innerHTML = content\n } else {\n element.textContent = content\n }\n }\n\n getTitle() {\n let title = this._element.getAttribute('data-bs-original-title')\n\n if (!title) {\n title = typeof this._config.title === 'function' ?\n this._config.title.call(this._element) :\n this._config.title\n }\n\n return title\n }\n\n updateAttachment(attachment) {\n if (attachment === 'right') {\n return 'end'\n }\n\n if (attachment === 'left') {\n return 'start'\n }\n\n return attachment\n }\n\n // Private\n\n _initializeOnDelegatedTarget(event, context) {\n const dataKey = this.constructor.DATA_KEY\n context = context || Data.get(event.delegateTarget, dataKey)\n\n if (!context) {\n context = new this.constructor(event.delegateTarget, this._getDelegateConfig())\n Data.set(event.delegateTarget, dataKey, context)\n }\n\n return context\n }\n\n _getOffset() {\n const { offset } = this._config\n\n if (typeof offset === 'string') {\n return offset.split(',').map(val => Number.parseInt(val, 10))\n }\n\n if (typeof offset === 'function') {\n return popperData => offset(popperData, this._element)\n }\n\n return offset\n }\n\n _getPopperConfig(attachment) {\n const defaultBsPopperConfig = {\n placement: attachment,\n modifiers: [\n {\n name: 'flip',\n options: {\n fallbackPlacements: this._config.fallbackPlacements\n }\n },\n {\n name: 'offset',\n options: {\n offset: this._getOffset()\n }\n },\n {\n name: 'preventOverflow',\n options: {\n boundary: this._config.boundary\n }\n },\n {\n name: 'arrow',\n options: {\n element: `.${this.constructor.NAME}-arrow`\n }\n },\n {\n name: 'onChange',\n enabled: true,\n phase: 'afterWrite',\n fn: data => this._handlePopperPlacementChange(data)\n }\n ],\n onFirstUpdate: data => {\n if (data.options.placement !== data.placement) {\n this._handlePopperPlacementChange(data)\n }\n }\n }\n\n return {\n ...defaultBsPopperConfig,\n ...(typeof this._config.popperConfig === 'function' ? this._config.popperConfig(defaultBsPopperConfig) : this._config.popperConfig)\n }\n }\n\n _addAttachmentClass(attachment) {\n this.getTipElement().classList.add(`${CLASS_PREFIX}-${this.updateAttachment(attachment)}`)\n }\n\n _getAttachment(placement) {\n return AttachmentMap[placement.toUpperCase()]\n }\n\n _setListeners() {\n const triggers = this._config.trigger.split(' ')\n\n triggers.forEach(trigger => {\n if (trigger === 'click') {\n EventHandler.on(this._element, this.constructor.Event.CLICK, this._config.selector, event => this.toggle(event))\n } else if (trigger !== TRIGGER_MANUAL) {\n const eventIn = trigger === TRIGGER_HOVER ?\n this.constructor.Event.MOUSEENTER :\n this.constructor.Event.FOCUSIN\n const eventOut = trigger === TRIGGER_HOVER ?\n this.constructor.Event.MOUSELEAVE :\n this.constructor.Event.FOCUSOUT\n\n EventHandler.on(this._element, eventIn, this._config.selector, event => this._enter(event))\n EventHandler.on(this._element, eventOut, this._config.selector, event => this._leave(event))\n }\n })\n\n this._hideModalHandler = () => {\n if (this._element) {\n this.hide()\n }\n }\n\n EventHandler.on(this._element.closest(`.${CLASS_NAME_MODAL}`), 'hide.bs.modal', this._hideModalHandler)\n\n if (this._config.selector) {\n this._config = {\n ...this._config,\n trigger: 'manual',\n selector: ''\n }\n } else {\n this._fixTitle()\n }\n }\n\n _fixTitle() {\n const title = this._element.getAttribute('title')\n const originalTitleType = typeof this._element.getAttribute('data-bs-original-title')\n\n if (title || originalTitleType !== 'string') {\n this._element.setAttribute('data-bs-original-title', title || '')\n if (title && !this._element.getAttribute('aria-label') && !this._element.textContent) {\n this._element.setAttribute('aria-label', title)\n }\n\n this._element.setAttribute('title', '')\n }\n }\n\n _enter(event, context) {\n context = this._initializeOnDelegatedTarget(event, context)\n\n if (event) {\n context._activeTrigger[\n event.type === 'focusin' ? TRIGGER_FOCUS : TRIGGER_HOVER\n ] = true\n }\n\n if (context.getTipElement().classList.contains(CLASS_NAME_SHOW) || context._hoverState === HOVER_STATE_SHOW) {\n context._hoverState = HOVER_STATE_SHOW\n return\n }\n\n clearTimeout(context._timeout)\n\n context._hoverState = HOVER_STATE_SHOW\n\n if (!context._config.delay || !context._config.delay.show) {\n context.show()\n return\n }\n\n context._timeout = setTimeout(() => {\n if (context._hoverState === HOVER_STATE_SHOW) {\n context.show()\n }\n }, context._config.delay.show)\n }\n\n _leave(event, context) {\n context = this._initializeOnDelegatedTarget(event, context)\n\n if (event) {\n context._activeTrigger[\n event.type === 'focusout' ? TRIGGER_FOCUS : TRIGGER_HOVER\n ] = context._element.contains(event.relatedTarget)\n }\n\n if (context._isWithActiveTrigger()) {\n return\n }\n\n clearTimeout(context._timeout)\n\n context._hoverState = HOVER_STATE_OUT\n\n if (!context._config.delay || !context._config.delay.hide) {\n context.hide()\n return\n }\n\n context._timeout = setTimeout(() => {\n if (context._hoverState === HOVER_STATE_OUT) {\n context.hide()\n }\n }, context._config.delay.hide)\n }\n\n _isWithActiveTrigger() {\n for (const trigger in this._activeTrigger) {\n if (this._activeTrigger[trigger]) {\n return true\n }\n }\n\n return false\n }\n\n _getConfig(config) {\n const dataAttributes = Manipulator.getDataAttributes(this._element)\n\n Object.keys(dataAttributes).forEach(dataAttr => {\n if (DISALLOWED_ATTRIBUTES.has(dataAttr)) {\n delete dataAttributes[dataAttr]\n }\n })\n\n config = {\n ...this.constructor.Default,\n ...dataAttributes,\n ...(typeof config === 'object' && config ? config : {})\n }\n\n config.container = config.container === false ? document.body : getElement(config.container)\n\n if (typeof config.delay === 'number') {\n config.delay = {\n show: config.delay,\n hide: config.delay\n }\n }\n\n if (typeof config.title === 'number') {\n config.title = config.title.toString()\n }\n\n if (typeof config.content === 'number') {\n config.content = config.content.toString()\n }\n\n typeCheckConfig(NAME, config, this.constructor.DefaultType)\n\n if (config.sanitize) {\n config.template = sanitizeHtml(config.template, config.allowList, config.sanitizeFn)\n }\n\n return config\n }\n\n _getDelegateConfig() {\n const config = {}\n\n if (this._config) {\n for (const key in this._config) {\n if (this.constructor.Default[key] !== this._config[key]) {\n config[key] = this._config[key]\n }\n }\n }\n\n return config\n }\n\n _cleanTipClass() {\n const tip = this.getTipElement()\n const tabClass = tip.getAttribute('class').match(BSCLS_PREFIX_REGEX)\n if (tabClass !== null && tabClass.length > 0) {\n tabClass.map(token => token.trim())\n .forEach(tClass => tip.classList.remove(tClass))\n }\n }\n\n _handlePopperPlacementChange(popperData) {\n const { state } = popperData\n\n if (!state) {\n return\n }\n\n this.tip = state.elements.popper\n this._cleanTipClass()\n this._addAttachmentClass(this._getAttachment(state.placement))\n }\n\n // Static\n\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Tooltip.getOrCreateInstance(this, config)\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n }\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n * add .Tooltip to jQuery only if jQuery is present\n */\n\ndefineJQueryPlugin(Tooltip)\n\nexport default Tooltip\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.0.2): popover.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport { defineJQueryPlugin } from './util/index'\nimport SelectorEngine from './dom/selector-engine'\nimport Tooltip from './tooltip'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'popover'\nconst DATA_KEY = 'bs.popover'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst CLASS_PREFIX = 'bs-popover'\nconst BSCLS_PREFIX_REGEX = new RegExp(`(^|\\\\s)${CLASS_PREFIX}\\\\S+`, 'g')\n\nconst Default = {\n ...Tooltip.Default,\n placement: 'right',\n offset: [0, 8],\n trigger: 'click',\n content: '',\n template: '
' +\n '
' +\n '

' +\n '
' +\n '
'\n}\n\nconst DefaultType = {\n ...Tooltip.DefaultType,\n content: '(string|element|function)'\n}\n\nconst Event = {\n HIDE: `hide${EVENT_KEY}`,\n HIDDEN: `hidden${EVENT_KEY}`,\n SHOW: `show${EVENT_KEY}`,\n SHOWN: `shown${EVENT_KEY}`,\n INSERTED: `inserted${EVENT_KEY}`,\n CLICK: `click${EVENT_KEY}`,\n FOCUSIN: `focusin${EVENT_KEY}`,\n FOCUSOUT: `focusout${EVENT_KEY}`,\n MOUSEENTER: `mouseenter${EVENT_KEY}`,\n MOUSELEAVE: `mouseleave${EVENT_KEY}`\n}\n\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_SHOW = 'show'\n\nconst SELECTOR_TITLE = '.popover-header'\nconst SELECTOR_CONTENT = '.popover-body'\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Popover extends Tooltip {\n // Getters\n\n static get Default() {\n return Default\n }\n\n static get NAME() {\n return NAME\n }\n\n static get Event() {\n return Event\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n // Overrides\n\n isWithContent() {\n return this.getTitle() || this._getContent()\n }\n\n getTipElement() {\n if (this.tip) {\n return this.tip\n }\n\n this.tip = super.getTipElement()\n\n if (!this.getTitle()) {\n SelectorEngine.findOne(SELECTOR_TITLE, this.tip).remove()\n }\n\n if (!this._getContent()) {\n SelectorEngine.findOne(SELECTOR_CONTENT, this.tip).remove()\n }\n\n return this.tip\n }\n\n setContent() {\n const tip = this.getTipElement()\n\n // we use append for html objects to maintain js events\n this.setElementContent(SelectorEngine.findOne(SELECTOR_TITLE, tip), this.getTitle())\n let content = this._getContent()\n if (typeof content === 'function') {\n content = content.call(this._element)\n }\n\n this.setElementContent(SelectorEngine.findOne(SELECTOR_CONTENT, tip), content)\n\n tip.classList.remove(CLASS_NAME_FADE, CLASS_NAME_SHOW)\n }\n\n // Private\n\n _addAttachmentClass(attachment) {\n this.getTipElement().classList.add(`${CLASS_PREFIX}-${this.updateAttachment(attachment)}`)\n }\n\n _getContent() {\n return this._element.getAttribute('data-bs-content') || this._config.content\n }\n\n _cleanTipClass() {\n const tip = this.getTipElement()\n const tabClass = tip.getAttribute('class').match(BSCLS_PREFIX_REGEX)\n if (tabClass !== null && tabClass.length > 0) {\n tabClass.map(token => token.trim())\n .forEach(tClass => tip.classList.remove(tClass))\n }\n }\n\n // Static\n\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Popover.getOrCreateInstance(this, config)\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n }\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n * add .Popover to jQuery only if jQuery is present\n */\n\ndefineJQueryPlugin(Popover)\n\nexport default Popover\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.0.2): scrollspy.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport {\n defineJQueryPlugin,\n getSelectorFromElement,\n getUID,\n isElement,\n typeCheckConfig\n} from './util/index'\nimport EventHandler from './dom/event-handler'\nimport Manipulator from './dom/manipulator'\nimport SelectorEngine from './dom/selector-engine'\nimport BaseComponent from './base-component'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'scrollspy'\nconst DATA_KEY = 'bs.scrollspy'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst Default = {\n offset: 10,\n method: 'auto',\n target: ''\n}\n\nconst DefaultType = {\n offset: 'number',\n method: 'string',\n target: '(string|element)'\n}\n\nconst EVENT_ACTIVATE = `activate${EVENT_KEY}`\nconst EVENT_SCROLL = `scroll${EVENT_KEY}`\nconst EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_DROPDOWN_ITEM = 'dropdown-item'\nconst CLASS_NAME_ACTIVE = 'active'\n\nconst SELECTOR_DATA_SPY = '[data-bs-spy=\"scroll\"]'\nconst SELECTOR_NAV_LIST_GROUP = '.nav, .list-group'\nconst SELECTOR_NAV_LINKS = '.nav-link'\nconst SELECTOR_NAV_ITEMS = '.nav-item'\nconst SELECTOR_LIST_ITEMS = '.list-group-item'\nconst SELECTOR_DROPDOWN = '.dropdown'\nconst SELECTOR_DROPDOWN_TOGGLE = '.dropdown-toggle'\n\nconst METHOD_OFFSET = 'offset'\nconst METHOD_POSITION = 'position'\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass ScrollSpy extends BaseComponent {\n constructor(element, config) {\n super(element)\n this._scrollElement = this._element.tagName === 'BODY' ? window : this._element\n this._config = this._getConfig(config)\n this._selector = `${this._config.target} ${SELECTOR_NAV_LINKS}, ${this._config.target} ${SELECTOR_LIST_ITEMS}, ${this._config.target} .${CLASS_NAME_DROPDOWN_ITEM}`\n this._offsets = []\n this._targets = []\n this._activeTarget = null\n this._scrollHeight = 0\n\n EventHandler.on(this._scrollElement, EVENT_SCROLL, () => this._process())\n\n this.refresh()\n this._process()\n }\n\n // Getters\n\n static get Default() {\n return Default\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n\n refresh() {\n const autoMethod = this._scrollElement === this._scrollElement.window ?\n METHOD_OFFSET :\n METHOD_POSITION\n\n const offsetMethod = this._config.method === 'auto' ?\n autoMethod :\n this._config.method\n\n const offsetBase = offsetMethod === METHOD_POSITION ?\n this._getScrollTop() :\n 0\n\n this._offsets = []\n this._targets = []\n this._scrollHeight = this._getScrollHeight()\n\n const targets = SelectorEngine.find(this._selector)\n\n targets.map(element => {\n const targetSelector = getSelectorFromElement(element)\n const target = targetSelector ? SelectorEngine.findOne(targetSelector) : null\n\n if (target) {\n const targetBCR = target.getBoundingClientRect()\n if (targetBCR.width || targetBCR.height) {\n return [\n Manipulator[offsetMethod](target).top + offsetBase,\n targetSelector\n ]\n }\n }\n\n return null\n })\n .filter(item => item)\n .sort((a, b) => a[0] - b[0])\n .forEach(item => {\n this._offsets.push(item[0])\n this._targets.push(item[1])\n })\n }\n\n dispose() {\n EventHandler.off(this._scrollElement, EVENT_KEY)\n super.dispose()\n }\n\n // Private\n\n _getConfig(config) {\n config = {\n ...Default,\n ...Manipulator.getDataAttributes(this._element),\n ...(typeof config === 'object' && config ? config : {})\n }\n\n if (typeof config.target !== 'string' && isElement(config.target)) {\n let { id } = config.target\n if (!id) {\n id = getUID(NAME)\n config.target.id = id\n }\n\n config.target = `#${id}`\n }\n\n typeCheckConfig(NAME, config, DefaultType)\n\n return config\n }\n\n _getScrollTop() {\n return this._scrollElement === window ?\n this._scrollElement.pageYOffset :\n this._scrollElement.scrollTop\n }\n\n _getScrollHeight() {\n return this._scrollElement.scrollHeight || Math.max(\n document.body.scrollHeight,\n document.documentElement.scrollHeight\n )\n }\n\n _getOffsetHeight() {\n return this._scrollElement === window ?\n window.innerHeight :\n this._scrollElement.getBoundingClientRect().height\n }\n\n _process() {\n const scrollTop = this._getScrollTop() + this._config.offset\n const scrollHeight = this._getScrollHeight()\n const maxScroll = this._config.offset + scrollHeight - this._getOffsetHeight()\n\n if (this._scrollHeight !== scrollHeight) {\n this.refresh()\n }\n\n if (scrollTop >= maxScroll) {\n const target = this._targets[this._targets.length - 1]\n\n if (this._activeTarget !== target) {\n this._activate(target)\n }\n\n return\n }\n\n if (this._activeTarget && scrollTop < this._offsets[0] && this._offsets[0] > 0) {\n this._activeTarget = null\n this._clear()\n return\n }\n\n for (let i = this._offsets.length; i--;) {\n const isActiveTarget = this._activeTarget !== this._targets[i] &&\n scrollTop >= this._offsets[i] &&\n (typeof this._offsets[i + 1] === 'undefined' || scrollTop < this._offsets[i + 1])\n\n if (isActiveTarget) {\n this._activate(this._targets[i])\n }\n }\n }\n\n _activate(target) {\n this._activeTarget = target\n\n this._clear()\n\n const queries = this._selector.split(',')\n .map(selector => `${selector}[data-bs-target=\"${target}\"],${selector}[href=\"${target}\"]`)\n\n const link = SelectorEngine.findOne(queries.join(','))\n\n if (link.classList.contains(CLASS_NAME_DROPDOWN_ITEM)) {\n SelectorEngine.findOne(SELECTOR_DROPDOWN_TOGGLE, link.closest(SELECTOR_DROPDOWN))\n .classList.add(CLASS_NAME_ACTIVE)\n\n link.classList.add(CLASS_NAME_ACTIVE)\n } else {\n // Set triggered link as active\n link.classList.add(CLASS_NAME_ACTIVE)\n\n SelectorEngine.parents(link, SELECTOR_NAV_LIST_GROUP)\n .forEach(listGroup => {\n // Set triggered links parents as active\n // With both