Compare commits
103 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f4082e3f96 | ||
|
|
c93a48b40d | ||
|
|
75e10efcbd | ||
|
|
2a65fd0825 | ||
|
|
422264a288 | ||
|
|
695fbb0150 | ||
|
|
a17105e650 | ||
|
|
32ac38e93f | ||
|
|
3c0d2b908f | ||
|
|
ab62a93a0d | ||
|
|
5189708d25 | ||
|
|
19831c050c | ||
|
|
e426d99145 | ||
|
|
4088208fc8 | ||
|
|
31ce5b1221 | ||
|
|
be05db22f5 | ||
|
|
79927416e5 | ||
|
|
f95ee31bbd | ||
|
|
40042c37f2 | ||
|
|
1c90b65bca | ||
|
|
2971425544 | ||
|
|
a9ee698432 | ||
|
|
15b5d51957 | ||
|
|
92893b8d4c | ||
|
|
3a6969cad0 | ||
|
|
88e8663d44 | ||
|
|
a2d7490d45 | ||
|
|
c363a1c4e0 | ||
|
|
9e84836cfe | ||
|
|
c8a2789caf | ||
|
|
202b996c2b | ||
|
|
e766a5f583 | ||
|
|
c7d18939fc | ||
|
|
34e198d8e6 | ||
|
|
f6a31e6ed0 | ||
|
|
7768dc9fd9 | ||
|
|
b739d3847e | ||
|
|
a3e5cb51b0 | ||
|
|
ab7a41d155 | ||
|
|
3576c32c52 | ||
|
|
f43fe15193 | ||
|
|
234ae17dc8 | ||
|
|
7ee14ac794 | ||
|
|
ba604bda3e | ||
|
|
036c10fc27 | ||
|
|
baa9410242 | ||
|
|
ab2fe5ef81 | ||
|
|
a926289fb0 | ||
|
|
b711be3061 | ||
|
|
f07ba9192b | ||
|
|
dc2f891632 | ||
|
|
fe9c5a7351 | ||
|
|
d575ba8f9a | ||
|
|
accab3b5bf | ||
|
|
8cbb4367ab | ||
|
|
3ede204918 | ||
|
|
32030e8d85 | ||
|
|
b7d55a3f78 | ||
|
|
699545ddbe | ||
|
|
54b3f17bf9 | ||
|
|
f2015cecbd | ||
|
|
f60a8d87d2 | ||
|
|
eccebd265f | ||
|
|
889c9a114b | ||
|
|
9fd561ecf6 | ||
|
|
1e72960c5f | ||
|
|
5a50c54f29 | ||
|
|
446bc68768 | ||
|
|
76660eb791 | ||
|
|
e0ce3c90de | ||
|
|
aaf94fa981 | ||
|
|
d1aa56266e | ||
|
|
790d4f053d | ||
|
|
e5b25ac8a5 | ||
|
|
b365155e62 | ||
|
|
f4f80a54a8 | ||
|
|
681a8d3443 | ||
|
|
7543f49ba4 | ||
|
|
2e11b632dd | ||
|
|
63bdc0d59e | ||
|
|
56fdf1f3a1 | ||
|
|
a6069c0f9e | ||
|
|
327a44d487 | ||
|
|
7a15930453 | ||
|
|
517e54517c | ||
|
|
ef59ea6fe4 | ||
|
|
10472a6467 | ||
|
|
9a9429c15c | ||
|
|
b17912d607 | ||
|
|
ff315d9d96 | ||
|
|
67f72ad17b | ||
|
|
8f55c38391 | ||
|
|
8245d77c84 | ||
|
|
f5628f16d9 | ||
|
|
47907daea0 | ||
|
|
664253532e | ||
|
|
6108b38098 | ||
|
|
a634c63176 | ||
|
|
109ed6a719 | ||
|
|
ac9312bd7e | ||
|
|
a743493cd3 | ||
|
|
c35355f01a | ||
|
|
ed910da288 |
2
.gitattributes
vendored
@@ -3,6 +3,8 @@
|
|||||||
# Ignore all JavaScript files in a directory
|
# Ignore all JavaScript files in a directory
|
||||||
src/main/resources/static/pdfjs/* linguist-vendored
|
src/main/resources/static/pdfjs/* linguist-vendored
|
||||||
src/main/resources/static/pdfjs/** linguist-vendored
|
src/main/resources/static/pdfjs/** linguist-vendored
|
||||||
|
src/main/resources/static/pdfjs-legacy/* linguist-vendored
|
||||||
|
src/main/resources/static/pdfjs-legacy/** linguist-vendored
|
||||||
src/main/resources/static/css/bootstrap-icons.css linguist-vendored
|
src/main/resources/static/css/bootstrap-icons.css linguist-vendored
|
||||||
src/main/resources/static/css/bootstrap.min.css linguist-vendored
|
src/main/resources/static/css/bootstrap.min.css linguist-vendored
|
||||||
src/main/resources/static/css/fonts/* linguist-vendored
|
src/main/resources/static/css/fonts/* linguist-vendored
|
||||||
|
|||||||
116
.github/ISSUE_TEMPLATE/1-bug.yml
vendored
Normal file
@@ -0,0 +1,116 @@
|
|||||||
|
name: Bug Report
|
||||||
|
description: File a bug report.
|
||||||
|
title: "[Bug]: "
|
||||||
|
body:
|
||||||
|
- type: markdown
|
||||||
|
attributes:
|
||||||
|
value: |
|
||||||
|
## Bug Report
|
||||||
|
|
||||||
|
Thanks for taking the time to fill out this bug report!
|
||||||
|
|
||||||
|
This issue form is for reporting bugs only. Please fill out the following sections to help us understand the issue you are facing.
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
id: problem
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
attributes:
|
||||||
|
label: The Problem
|
||||||
|
description: |
|
||||||
|
Describe the issue you are experiencing here. Tell us what you were trying to do and what happened.
|
||||||
|
|
||||||
|
Provide a clear and concise description of what the problem is.
|
||||||
|
placeholder: Provide a detailed description of the issue.
|
||||||
|
|
||||||
|
- type: markdown
|
||||||
|
attributes:
|
||||||
|
value: |
|
||||||
|
## Environment
|
||||||
|
|
||||||
|
- type: input
|
||||||
|
id: version
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
attributes:
|
||||||
|
label: Version of Stirling-PDF
|
||||||
|
placeholder: e.g., 0.0.2
|
||||||
|
description: What version of Stirling-PDF has the issue?
|
||||||
|
|
||||||
|
- type: input
|
||||||
|
id: last-working-version
|
||||||
|
attributes:
|
||||||
|
label: Last Working Version of Stirling-PDF
|
||||||
|
placeholder: e.g., 0.0.1
|
||||||
|
description: |
|
||||||
|
If known, please provide the last version where the issue did not occur. Otherwise, leave blank.
|
||||||
|
|
||||||
|
- type: input
|
||||||
|
id: url
|
||||||
|
attributes:
|
||||||
|
label: Page Where the Problem Occurred
|
||||||
|
placeholder: e.g., http://localhost:8080/pdf/pipeline
|
||||||
|
description: |
|
||||||
|
If applicable, provide the URL where the issue occurred. Otherwise, leave blank.
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
id: docker
|
||||||
|
attributes:
|
||||||
|
label: Docker Configuration
|
||||||
|
description: |
|
||||||
|
Enter your Docker configuration here if it is relevant to the error. Remove any personal data. Otherwise, leave the field blank.
|
||||||
|
render: txt
|
||||||
|
|
||||||
|
- type: markdown
|
||||||
|
attributes:
|
||||||
|
value: |
|
||||||
|
## Logs
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
id: logs
|
||||||
|
attributes:
|
||||||
|
label: Relevant Log Output
|
||||||
|
description: |
|
||||||
|
Provide any log output that might help us diagnose the issue, such as error messages or stack traces.
|
||||||
|
render: txt
|
||||||
|
|
||||||
|
- type: markdown
|
||||||
|
attributes:
|
||||||
|
value: |
|
||||||
|
## Additional Information
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
id: additional-info
|
||||||
|
attributes:
|
||||||
|
label: Additional Information
|
||||||
|
description: |
|
||||||
|
If you have any additional information that might help us understand and resolve the issue, provide it here.
|
||||||
|
|
||||||
|
- type: markdown
|
||||||
|
attributes:
|
||||||
|
value: |
|
||||||
|
## Browser Information
|
||||||
|
|
||||||
|
- type: dropdown
|
||||||
|
id: browsers
|
||||||
|
attributes:
|
||||||
|
label: Browsers Affected
|
||||||
|
description: |
|
||||||
|
If applicable, select the browsers where you are experiencing the issue. Otherwise, leave blank.
|
||||||
|
multiple: true
|
||||||
|
options:
|
||||||
|
- Firefox
|
||||||
|
- Chrome
|
||||||
|
- Safari
|
||||||
|
- Microsoft Edge
|
||||||
|
- Other
|
||||||
|
|
||||||
|
- type: checkboxes
|
||||||
|
id: terms
|
||||||
|
attributes:
|
||||||
|
label: No Duplicate of the Issue
|
||||||
|
description: |
|
||||||
|
Please confirm that you have searched for similar issues and none of them match your problem.
|
||||||
|
options:
|
||||||
|
- label: I have verified that there are no existing issues raised related to my problem.
|
||||||
|
required: true
|
||||||
76
.github/ISSUE_TEMPLATE/2-feature.yml
vendored
Normal file
@@ -0,0 +1,76 @@
|
|||||||
|
name: Feature Request
|
||||||
|
description: Submit a new feature request.
|
||||||
|
title: "[Feature Request]: "
|
||||||
|
body:
|
||||||
|
- type: markdown
|
||||||
|
attributes:
|
||||||
|
value: |
|
||||||
|
## Feature Request
|
||||||
|
|
||||||
|
Thank you for taking the time to suggest a new feature!
|
||||||
|
|
||||||
|
This form is for proposing features or enhancements. Please fill out the following sections to help us understand your idea or suggestion.
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
id: feature-description
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
attributes:
|
||||||
|
label: Feature Description
|
||||||
|
description: |
|
||||||
|
Describe the feature you would like to see. Tell us what the feature should do and the problem it would solve.
|
||||||
|
|
||||||
|
Provide a clear and concise description of what you want to happen.
|
||||||
|
placeholder: Provide a detailed description of the desired feature.
|
||||||
|
|
||||||
|
- type: markdown
|
||||||
|
attributes:
|
||||||
|
value: |
|
||||||
|
## Motivation
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
id: motivation
|
||||||
|
attributes:
|
||||||
|
label: Why is this feature valuable?
|
||||||
|
description: |
|
||||||
|
Explain why this feature is valuable to you or others. How would it improve the tool or process?
|
||||||
|
|
||||||
|
Describe any relevant scenarios that would benefit from this feature.
|
||||||
|
placeholder: Describe why this feature is important.
|
||||||
|
|
||||||
|
- type: markdown
|
||||||
|
attributes:
|
||||||
|
value: |
|
||||||
|
## Possible Implementation
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
id: implementation
|
||||||
|
attributes:
|
||||||
|
label: Suggested Implementation
|
||||||
|
description: |
|
||||||
|
If you have ideas about how this feature could be implemented, describe them here.
|
||||||
|
|
||||||
|
This section is optional but can be helpful to guide initial discussions.
|
||||||
|
placeholder: Describe how this feature might be implemented.
|
||||||
|
|
||||||
|
- type: markdown
|
||||||
|
attributes:
|
||||||
|
value: |
|
||||||
|
## Additional Information
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
id: additional-info
|
||||||
|
attributes:
|
||||||
|
label: Additional Information
|
||||||
|
description: |
|
||||||
|
If you have any additional information, comments, or resources you think would support or be relevant to your feature request, include them here.
|
||||||
|
|
||||||
|
- type: checkboxes
|
||||||
|
id: search-confirmation
|
||||||
|
attributes:
|
||||||
|
label: No Duplicate of the Feature
|
||||||
|
description: |
|
||||||
|
Please confirm that you have searched for similar features in our repository and found none that match your request.
|
||||||
|
options:
|
||||||
|
- label: I have verified that there are no existing features requests similar to my request.
|
||||||
|
required: true
|
||||||
5
.github/ISSUE_TEMPLATE/config.yml
vendored
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
blank_issues_enabled: true
|
||||||
|
contact_links:
|
||||||
|
- name: 💬 Discord Server
|
||||||
|
url: https://discord.gg/HYmhKj45pU
|
||||||
|
about: You can join our Discord server for real time discussion and support
|
||||||
20
.github/labeler-config.yml
vendored
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
translation:
|
||||||
|
- changed-files:
|
||||||
|
- any-glob-to-any-file: 'src/main/resources/messages_*_*.properties'
|
||||||
|
|
||||||
|
Front End:
|
||||||
|
- changed-files:
|
||||||
|
- any-glob-to-any-file: 'src/main/resources/templates/**'
|
||||||
|
|
||||||
|
java:
|
||||||
|
- changed-files:
|
||||||
|
- any-glob-to-any-file: 'src/main/java/**/*.java'
|
||||||
|
|
||||||
|
documentation:
|
||||||
|
- changed-files:
|
||||||
|
- any-glob-to-any-file: '**/*.md'
|
||||||
|
|
||||||
|
docker:
|
||||||
|
- changed-files:
|
||||||
|
- any-glob-to-any-file: 'Dockerfile'
|
||||||
|
- any-glob-to-any-file: 'Dockerfile-*'
|
||||||
18
.github/workflows/labeler.yml
vendored
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
name: "Pull Request Labeler"
|
||||||
|
on:
|
||||||
|
pull_request_target:
|
||||||
|
types: [opened, synchronize]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
labeler:
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
pull-requests: write
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
- uses: actions/labeler@v5
|
||||||
|
with:
|
||||||
|
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
configuration-path: .github/labeler-config.yml
|
||||||
|
sync-labels: true
|
||||||
32
.github/workflows/stale.yml
vendored
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
name: Close stale issues
|
||||||
|
|
||||||
|
on:
|
||||||
|
schedule:
|
||||||
|
- cron: "30 0 * * *"
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
stale:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
permissions:
|
||||||
|
issues: write
|
||||||
|
pull-requests: write
|
||||||
|
steps:
|
||||||
|
- name: 30 days stale issues
|
||||||
|
uses: actions/stale@v9
|
||||||
|
with:
|
||||||
|
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
days-before-stale: 30
|
||||||
|
days-before-close: 7
|
||||||
|
stale-issue-message: >
|
||||||
|
This issue has been automatically marked as stale because it has had no recent activity.
|
||||||
|
It will be closed if no further activity occurs. Thank you for your contributions.
|
||||||
|
close-issue-message: >
|
||||||
|
This issue has been automatically closed because it has had no recent activity after being marked as stale.
|
||||||
|
Please reopen if you need further assistance.
|
||||||
|
stale-issue-label: "Stale"
|
||||||
|
remove-stale-when-updated: true
|
||||||
|
only-issue-labels: "more-info-needed"
|
||||||
|
days-before-pr-stale: -1 # Prevents PRs from being marked as stale
|
||||||
|
days-before-pr-close: -1 # Prevents PRs from being closed
|
||||||
|
start-date: '2024-07-06T00:00:00Z' # ISO 8601 Format
|
||||||
14
.github/workflows/sync_files.yml
vendored
@@ -7,7 +7,7 @@ on:
|
|||||||
paths:
|
paths:
|
||||||
- "build.gradle"
|
- "build.gradle"
|
||||||
- "src/main/resources/messages_*.properties"
|
- "src/main/resources/messages_*.properties"
|
||||||
- "scripts/translation_status.toml"
|
- "scripts/ignore_translation.toml"
|
||||||
|
|
||||||
permissions:
|
permissions:
|
||||||
contents: write
|
contents: write
|
||||||
@@ -17,9 +17,9 @@ jobs:
|
|||||||
sync-versions:
|
sync-versions:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4.1.1
|
- uses: actions/checkout@v4
|
||||||
- name: Set up Python
|
- name: Set up Python
|
||||||
uses: actions/setup-python@v5.1.0
|
uses: actions/setup-python@v5
|
||||||
with:
|
with:
|
||||||
python-version: "3.x"
|
python-version: "3.x"
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
@@ -36,7 +36,7 @@ jobs:
|
|||||||
git diff --staged --quiet || git commit -m ":floppy_disk: Sync Versions
|
git diff --staged --quiet || git commit -m ":floppy_disk: Sync Versions
|
||||||
> Made via sync_files.yml" || echo "no changes"
|
> Made via sync_files.yml" || echo "no changes"
|
||||||
- name: Create Pull Request
|
- name: Create Pull Request
|
||||||
uses: peter-evans/create-pull-request@v6.0.1
|
uses: peter-evans/create-pull-request@v6
|
||||||
with:
|
with:
|
||||||
token: ${{ secrets.GITHUB_TOKEN }}
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
commit-message: Update files
|
commit-message: Update files
|
||||||
@@ -54,9 +54,9 @@ jobs:
|
|||||||
sync-readme:
|
sync-readme:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4.1.1
|
- uses: actions/checkout@v4
|
||||||
- name: Set up Python
|
- name: Set up Python
|
||||||
uses: actions/setup-python@v5.1.0
|
uses: actions/setup-python@v5
|
||||||
with:
|
with:
|
||||||
python-version: "3.x"
|
python-version: "3.x"
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
@@ -73,7 +73,7 @@ jobs:
|
|||||||
git diff --staged --quiet || git commit -m ":memo: Sync README
|
git diff --staged --quiet || git commit -m ":memo: Sync README
|
||||||
> Made via sync_files.yml" || echo "no changes"
|
> Made via sync_files.yml" || echo "no changes"
|
||||||
- name: Create Pull Request
|
- name: Create Pull Request
|
||||||
uses: peter-evans/create-pull-request@v6.0.1
|
uses: peter-evans/create-pull-request@v6
|
||||||
with:
|
with:
|
||||||
token: ${{ secrets.GITHUB_TOKEN }}
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
commit-message: Update files
|
commit-message: Update files
|
||||||
|
|||||||
@@ -6,9 +6,11 @@ repos:
|
|||||||
args:
|
args:
|
||||||
- --fix
|
- --fix
|
||||||
- --line-length=127
|
- --line-length=127
|
||||||
files: ^((.github/scripts)/.+)?[^/]+\.py$
|
files: ^((.github/scripts|scripts)/.+)?[^/]+\.py$
|
||||||
|
exclude: (split_photos.py)
|
||||||
- id: ruff-format
|
- id: ruff-format
|
||||||
files: ^((.github/scripts)/.+)?[^/]+\.py$
|
files: ^((.github/scripts|scripts)/.+)?[^/]+\.py$
|
||||||
|
exclude: (split_photos.py)
|
||||||
- repo: https://github.com/codespell-project/codespell
|
- repo: https://github.com/codespell-project/codespell
|
||||||
rev: v2.2.6
|
rev: v2.2.6
|
||||||
hooks:
|
hooks:
|
||||||
@@ -33,5 +35,5 @@ repos:
|
|||||||
# args: ["--replace_with= "]
|
# args: ["--replace_with= "]
|
||||||
entry: python .github/scripts/check_tabulator.py
|
entry: python .github/scripts/check_tabulator.py
|
||||||
language: python
|
language: python
|
||||||
exclude: ^src/main/resources/static/pdfjs/
|
exclude: ^(src/main/resources/static/pdfjs|src/main/resources/static/pdfjs-legacy)
|
||||||
files: ^.*(\.html|\.css|\.js)$
|
files: ^.*(\.html|\.css|\.js)$
|
||||||
|
|||||||
40
DATABASE.md
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
# New Database Backup and Import Functionality
|
||||||
|
|
||||||
|
**Full activation will take place on approximately January 5th, 2025!**
|
||||||
|
|
||||||
|
Why is the waiting time six months?
|
||||||
|
|
||||||
|
There are users who only install updates sporadically; if they skip the preparation, it can/will lead to data loss in the database.
|
||||||
|
|
||||||
|
## Functionality Overview
|
||||||
|
|
||||||
|
The newly introduced feature enhances the application with robust database backup and import capabilities. This feature is designed to ensure data integrity and provide a straightforward way to manage database backups. Here's how it works:
|
||||||
|
|
||||||
|
1. Automatic Backup Creation
|
||||||
|
- The system automatically creates a database backup every day at midnight. This ensures that there is always a recent backup available, minimizing the risk of data loss.
|
||||||
|
2. Manual Backup Export
|
||||||
|
- Admin actions that modify the user database trigger a manual export of the database. This keeps the backup up-to-date with the latest changes and provides an extra layer of data security.
|
||||||
|
3. Importing Database Backups
|
||||||
|
- Admin users can import a database backup either via the web interface or API endpoints. This allows for easy restoration of the database to a previous state in case of data corruption or other issues.
|
||||||
|
- The import process ensures that the database structure and data are correctly restored, maintaining the integrity of the application.
|
||||||
|
4. Managing Backup Files
|
||||||
|
- Admins can view a list of all existing backup files, along with their creation dates and sizes. This helps in managing storage and identifying the most recent or relevant backups.
|
||||||
|
- Backup files can be downloaded for offline storage or transferred to other environments, providing flexibility in database management.
|
||||||
|
- Unnecessary backup files can be deleted through the interface to free up storage space and maintain an organized backup directory.
|
||||||
|
|
||||||
|
## User Interface
|
||||||
|
|
||||||
|
### Web Interface
|
||||||
|
|
||||||
|
1. Upload SQL files to import database backups.
|
||||||
|
2. View details of existing backups, such as file names, creation dates, and sizes.
|
||||||
|
3. Download backup files for offline storage.
|
||||||
|
4. Delete outdated or unnecessary backup files.
|
||||||
|
|
||||||
|
### API Endpoints
|
||||||
|
|
||||||
|
1. Import database backups by uploading SQL files.
|
||||||
|
2. Download backup files.
|
||||||
|
3. Delete backup files.
|
||||||
|
|
||||||
|
This new functionality streamlines database management, ensuring that backups are always available and easy to manage, thus improving the reliability and resilience of the application.
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
# Build the application
|
# Build the application
|
||||||
FROM gradle:7.6-jdk17 AS build
|
FROM gradle:8.7-jdk17 AS build
|
||||||
|
|
||||||
# Set the working directory
|
# Set the working directory
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
|
|||||||
162
README.md
@@ -2,13 +2,14 @@
|
|||||||
<h1 align="center">Stirling-PDF</h1>
|
<h1 align="center">Stirling-PDF</h1>
|
||||||
|
|
||||||
[](https://hub.docker.com/r/frooodle/s-pdf)
|
[](https://hub.docker.com/r/frooodle/s-pdf)
|
||||||
[](https://discord.gg/Cn8pWhQRxZ)
|
[](https://discord.gg/HYmhKj45pU)
|
||||||
[](https://github.com/Stirling-Tools/Stirling-PDF/)
|
[](https://github.com/Stirling-Tools/Stirling-PDF/)
|
||||||
[](https://github.com/Stirling-Tools/stirling-pdf)
|
[](https://github.com/Stirling-Tools/stirling-pdf)
|
||||||
[](https://www.paypal.com/donate/?hosted_button_id=MN7JPG5G6G3JL)
|
[](https://www.paypal.com/donate/?hosted_button_id=MN7JPG5G6G3JL)
|
||||||
[](https://github.com/sponsors/Frooodle)
|
[](https://github.com/sponsors/Frooodle)
|
||||||
|
|
||||||
[](https://cloud.digitalocean.com/apps/new?repo=https://github.com/Stirling-Tools/Stirling-PDF/tree/digitalOcean&refcode=c3210994b1af)
|
[](https://cloud.digitalocean.com/apps/new?repo=https://github.com/Stirling-Tools/Stirling-PDF/tree/digitalOcean&refcode=c3210994b1af)
|
||||||
|
[<img src="https://www.ssdnodes.com/wp-content/uploads/2023/11/footer-logo.svg" alt="Name" height="40">](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.
|
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.
|
||||||
|
|
||||||
@@ -21,10 +22,11 @@ All files and PDFs exist either exclusively on the client side, reside in server
|
|||||||
## Features
|
## Features
|
||||||
|
|
||||||
- Dark mode support.
|
- Dark mode support.
|
||||||
- Custom download options (see [here](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/images/settings.png) for example)
|
- Custom download options
|
||||||
- Parallel file processing and downloads
|
- Parallel file processing and downloads
|
||||||
- API for integration with external scripts
|
- API for integration with external scripts
|
||||||
- Optional Login and Authentication support (see [here](https://github.com/Stirling-Tools/Stirling-PDF/tree/main#login-authentication) for documentation)
|
- 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**
|
## **PDF Features**
|
||||||
|
|
||||||
@@ -82,7 +84,8 @@ All files and PDFs exist either exclusively on the client side, reside in server
|
|||||||
- Get all information on a PDF to view or export as JSON.
|
- Get all information on a PDF to view or export as JSON.
|
||||||
|
|
||||||
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)
|
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)
|
||||||
Demo of the app is available [here](https://stirlingpdf.io). username: demo, password: demo
|
|
||||||
|
Demo of the app is available [here](https://stirlingpdf.io).
|
||||||
|
|
||||||
## Technologies used
|
## Technologies used
|
||||||
|
|
||||||
@@ -105,33 +108,36 @@ Please view https://github.com/Stirling-Tools/Stirling-PDF/blob/main/LocalRunGui
|
|||||||
|
|
||||||
https://hub.docker.com/r/frooodle/s-pdf
|
https://hub.docker.com/r/frooodle/s-pdf
|
||||||
|
|
||||||
Stirling PDF has 2 different versions, a Full version and ultra-Lite version. Depending on the types of features you use you may want a smaller image to save on space.
|
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)
|
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.
|
For people that don't mind about space optimization just use the latest tag.
|
||||||

|

|
||||||

|

|
||||||
|

|
||||||
|
|
||||||
Docker Run
|
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``
|
||||||
|
|
||||||
|
### Docker Run
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
docker run -d \
|
docker run -d \
|
||||||
-p 8080:8080 \
|
-p 8080:8080 \
|
||||||
-v /location/of/trainingData:/usr/share/tessdata \
|
-v ./trainingData:/usr/share/tessdata \
|
||||||
-v /location/of/extraConfigs:/configs \
|
-v ./extraConfigs:/configs \
|
||||||
-v /location/of/logs:/logs \
|
-v ./logs:/logs \
|
||||||
-e DOCKER_ENABLE_SECURITY=false \
|
-e DOCKER_ENABLE_SECURITY=false \
|
||||||
-e INSTALL_BOOK_AND_ADVANCED_HTML_OPS=false \
|
-e INSTALL_BOOK_AND_ADVANCED_HTML_OPS=false \
|
||||||
-e LANGS=en_GB \
|
-e LANGS=en_GB \
|
||||||
--name stirling-pdf \
|
--name stirling-pdf \
|
||||||
frooodle/s-pdf:latest
|
frooodle/s-pdf:latest
|
||||||
|
|
||||||
|
|
||||||
Can also add these for customisation but are not required
|
Can also add these for customisation but are not required
|
||||||
|
|
||||||
-v /location/of/customFiles:/customFiles \
|
-v /location/of/customFiles:/customFiles \
|
||||||
```
|
```
|
||||||
|
|
||||||
Docker Compose
|
### Docker Compose
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
version: '3.3'
|
version: '3.3'
|
||||||
@@ -141,10 +147,10 @@ services:
|
|||||||
ports:
|
ports:
|
||||||
- '8080:8080'
|
- '8080:8080'
|
||||||
volumes:
|
volumes:
|
||||||
- /location/of/trainingData:/usr/share/tessdata #Required for extra OCR languages
|
- ./trainingData:/usr/share/tessdata #Required for extra OCR languages
|
||||||
- /location/of/extraConfigs:/configs
|
- ./extraConfigs:/configs
|
||||||
# - /location/of/customFiles:/customFiles/
|
# - ./customFiles:/customFiles/
|
||||||
# - /location/of/logs:/logs/
|
# - ./logs:/logs/
|
||||||
environment:
|
environment:
|
||||||
- DOCKER_ENABLE_SECURITY=false
|
- DOCKER_ENABLE_SECURITY=false
|
||||||
- INSTALL_BOOK_AND_ADVANCED_HTML_OPS=false
|
- INSTALL_BOOK_AND_ADVANCED_HTML_OPS=false
|
||||||
@@ -165,35 +171,36 @@ Stirling PDF currently supports 32!
|
|||||||
| ------------------------------------------- | -------------------------------------- |
|
| ------------------------------------------- | -------------------------------------- |
|
||||||
| English (English) (en_GB) |  |
|
| English (English) (en_GB) |  |
|
||||||
| English (US) (en_US) |  |
|
| English (US) (en_US) |  |
|
||||||
| Arabic (العربية) (ar_AR) |  |
|
| Arabic (العربية) (ar_AR) |  |
|
||||||
| German (Deutsch) (de_DE) |  |
|
| German (Deutsch) (de_DE) |  |
|
||||||
| French (Français) (fr_FR) |  |
|
| French (Français) (fr_FR) |  |
|
||||||
| Spanish (Español) (es_ES) |  |
|
| Spanish (Español) (es_ES) |  |
|
||||||
| Simplified Chinese (简体中文) (zh_CN) |  |
|
| Simplified Chinese (简体中文) (zh_CN) |  |
|
||||||
| Traditional Chinese (繁體中文) (zh_TW) |  |
|
| Traditional Chinese (繁體中文) (zh_TW) |  |
|
||||||
| Catalan (Català) (ca_CA) |  |
|
| Catalan (Català) (ca_CA) |  |
|
||||||
| Italian (Italiano) (it_IT) |  |
|
| Italian (Italiano) (it_IT) |  |
|
||||||
| Swedish (Svenska) (sv_SE) |  |
|
| Swedish (Svenska) (sv_SE) |  |
|
||||||
| Polish (Polski) (pl_PL) |  |
|
| Polish (Polski) (pl_PL) |  |
|
||||||
| Romanian (Română) (ro_RO) |  |
|
| Romanian (Română) (ro_RO) |  |
|
||||||
| Korean (한국어) (ko_KR) |  |
|
| Korean (한국어) (ko_KR) |  |
|
||||||
| Portuguese Brazilian (Português) (pt_BR) |  |
|
| Portuguese Brazilian (Português) (pt_BR) |  |
|
||||||
| Russian (Русский) (ru_RU) |  |
|
| Portuguese (Português) (pt_PT) |  |
|
||||||
| Basque (Euskara) (eu_ES) |  |
|
| Russian (Русский) (ru_RU) |  |
|
||||||
| Japanese (日本語) (ja_JP) |  |
|
| Basque (Euskara) (eu_ES) |  |
|
||||||
| Dutch (Nederlands) (nl_NL) |  |
|
| Japanese (日本語) (ja_JP) |  |
|
||||||
| Greek (Ελληνικά) (el_GR) |  |
|
| Dutch (Nederlands) (nl_NL) |  |
|
||||||
| Turkish (Türkçe) (tr_TR) |  |
|
| Greek (Ελληνικά) (el_GR) |  |
|
||||||
| Indonesia (Bahasa Indonesia) (id_ID) |  |
|
| Turkish (Türkçe) (tr_TR) |  |
|
||||||
| Hindi (हिंदी) (hi_IN) |  |
|
| Indonesia (Bahasa Indonesia) (id_ID) |  |
|
||||||
| Hungarian (Magyar) (hu_HU) |  |
|
| Hindi (हिंदी) (hi_IN) |  |
|
||||||
| Bulgarian (Български) (bg_BG) |  |
|
| Hungarian (Magyar) (hu_HU) |  |
|
||||||
| Sebian Latin alphabet (Srpski) (sr_LATN_RS) |  |
|
| Bulgarian (Български) (bg_BG) |  |
|
||||||
| Ukrainian (Українська) (uk_UA) |  |
|
| Sebian Latin alphabet (Srpski) (sr_LATN_RS) |  |
|
||||||
| Slovakian (Slovensky) (sk_SK) |  |
|
| Ukrainian (Українська) (uk_UA) |  |
|
||||||
| Czech (Česky) (cs_CZ) |  |
|
| Slovakian (Slovensky) (sk_SK) |  |
|
||||||
| Croatian (Hrvatski) (hr_HR) |  |
|
| Czech (Česky) (cs_CZ) |  |
|
||||||
| Norwegian (Norsk) (no_NB) |  |
|
| Croatian (Hrvatski) (hr_HR) |  |
|
||||||
|
| Norwegian (Norsk) (no_NB) |  |
|
||||||
|
|
||||||
## Contributing (creating issues, translations, fixing bugs, etc.)
|
## Contributing (creating issues, translations, fixing bugs, etc.)
|
||||||
|
|
||||||
@@ -214,11 +221,11 @@ Environment variables are also supported and would override the settings file
|
|||||||
For example in the settings.yml you have
|
For example in the settings.yml you have
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
system:
|
security:
|
||||||
enableLogin: 'true'
|
enableLogin: 'true'
|
||||||
```
|
```
|
||||||
|
|
||||||
To have this via an environment variable you would have ``SYSTEM_ENABLELOGIN``
|
To have this via an environment variable you would have ``SECURITY_ENABLELOGIN``
|
||||||
|
|
||||||
The Current list of settings is
|
The Current list of settings is
|
||||||
|
|
||||||
@@ -228,35 +235,36 @@ security:
|
|||||||
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
|
loginAttemptCount: 5 # lock user account after 5 tries
|
||||||
loginResetTimeMinutes: 120 # lock account for 2 hours after x attempts
|
loginResetTimeMinutes: 120 # lock account for 2 hours after x attempts
|
||||||
# initialLogin:
|
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)
|
||||||
# username: "admin" # Initial username for the first login
|
initialLogin:
|
||||||
# password: "stirling" # Initial password for the first login
|
username: '' # Initial username for the first login
|
||||||
# oauth2:
|
password: '' # Initial password for the first login
|
||||||
# enabled: false # set to 'true' to enable login (Note: enableLogin must also be 'true' for this to work)
|
oauth2:
|
||||||
# issuer: "" # set to any provider that supports OpenID Connect Discovery (/.well-known/openid-configuration) end-point
|
enabled: false # set to 'true' to enable login (Note: enableLogin must also be 'true' for this to work)
|
||||||
# clientId: "" # Client ID from your provider
|
client:
|
||||||
# clientSecret: "" # Client Secret from your provider
|
keycloak:
|
||||||
# autoCreateUser: false # set to 'true' to allow auto-creation of non-existing users
|
issuer: '' # URL of the Keycloak realm's OpenID Connect Discovery endpoint
|
||||||
# useAsUsername: "email" # Default is 'email'; custom fields can be used as the username
|
clientId: '' # Client ID for Keycloak OAuth2
|
||||||
# scopes: "openid, profile, email" # Specify the scopes for which the application will request permissions
|
clientSecret: '' # Client Secret for Keycloak OAuth2
|
||||||
# provider: "google" # Set this to your OAuth provider's name, e.g., 'google' or 'keycloak'
|
scopes: openid, profile, email # Scopes for Keycloak OAuth2
|
||||||
# client:
|
useAsUsername: preferred_username # Field to use as the username for Keycloak OAuth2
|
||||||
# google:
|
google:
|
||||||
# clientId: "" # Client ID for Google OAuth2
|
clientId: '' # Client ID for Google OAuth2
|
||||||
# clientSecret: "" # Client Secret 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
|
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
|
useAsUsername: email # Field to use as the username for Google OAuth2
|
||||||
# github:
|
github:
|
||||||
# clientId: "" # Client ID for GitHub OAuth2
|
clientId: '' # Client ID for GitHub OAuth2
|
||||||
# clientSecret: "" # Client Secret for GitHub OAuth2
|
clientSecret: '' # Client Secret for GitHub OAuth2
|
||||||
# scopes: "read:user" # Scope for GitHub OAuth2
|
scopes: read:user # Scope for GitHub OAuth2
|
||||||
# useAsUsername: "login" # Field to use as the username for GitHub OAuth2
|
useAsUsername: login # Field to use as the username for GitHub OAuth2
|
||||||
# keycloak:
|
issuer: '' # set to any provider that supports OpenID Connect Discovery (/.well-known/openid-configuration) end-point
|
||||||
# issuer: "http://192.168.0.123:8888/realms/stirling-pdf" # URL of the Keycloak realm's OpenID Connect Discovery endpoint
|
clientId: '' # Client ID from your provider
|
||||||
# clientId: "stirling-pdf" # Client ID for Keycloak OAuth2
|
clientSecret: '' # Client Secret from your provider
|
||||||
# clientSecret: "" # Client Secret for Keycloak OAuth2
|
autoCreateUser: false # set to 'true' to allow auto-creation of non-existing users
|
||||||
# scopes: "openid, profile, email" # Scopes for Keycloak OAuth2
|
useAsUsername: email # Default is 'email'; custom fields can be used as the username
|
||||||
# useAsUsername: "email" # Field to use as the username for Keycloak OAuth2
|
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'
|
||||||
|
|
||||||
system:
|
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)
|
||||||
@@ -267,9 +275,9 @@ system:
|
|||||||
customHTMLFiles: false # enable to have files placed in /customFiles/templates override the existing template html files
|
customHTMLFiles: false # enable to have files placed in /customFiles/templates override the existing template html files
|
||||||
|
|
||||||
ui:
|
ui:
|
||||||
appName: null # Application's visible name
|
appName: '' # Application's visible name
|
||||||
homeDescription: null # Short description or tagline shown on homepage.
|
homeDescription: '' # Short description or tagline shown on homepage.
|
||||||
appNameNavbar: null # Name displayed on the navigation bar
|
appNameNavbar: '' # Name displayed on the navigation bar
|
||||||
|
|
||||||
endpoints:
|
endpoints:
|
||||||
toRemove: [] # List endpoints to disable (e.g. ['img-to-pdf', 'remove-pages'])
|
toRemove: [] # List endpoints to disable (e.g. ['img-to-pdf', 'remove-pages'])
|
||||||
@@ -303,7 +311,7 @@ For those wanting to use Stirling-PDFs backend API to link with their own custom
|
|||||||
|
|
||||||

|

|
||||||
|
|
||||||
### Prerequisites:
|
### Prerequisites
|
||||||
|
|
||||||
- User must have the folder ./configs volumed within docker so that it is retained during updates.
|
- 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.
|
- Docker users must download the security jar version by setting ``DOCKER_ENABLE_SECURITY`` to ``true`` in environment variables.
|
||||||
|
|||||||
@@ -1,4 +1,7 @@
|
|||||||
| Technology | Ultra-Lite | Full |
|
|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.
|
||||||
|
|
||||||
|
Technology | Ultra-Lite | Full |
|
||||||
| ---------- | :--------: | :---: |
|
| ---------- | :--------: | :---: |
|
||||||
| Java | ✔️ | ✔️ |
|
| Java | ✔️ | ✔️ |
|
||||||
| JavaScript | ✔️ | ✔️ |
|
| JavaScript | ✔️ | ✔️ |
|
||||||
|
|||||||
219
build.gradle
@@ -1,24 +1,29 @@
|
|||||||
plugins {
|
plugins {
|
||||||
id 'java'
|
id "java"
|
||||||
id 'org.springframework.boot' version '3.2.4'
|
id "org.springframework.boot" version "3.3.0"
|
||||||
id 'io.spring.dependency-management' version '1.1.3'
|
id "io.spring.dependency-management" version "1.1.5"
|
||||||
id 'org.springdoc.openapi-gradle-plugin' version '1.8.0'
|
id "org.springdoc.openapi-gradle-plugin" version "1.8.0"
|
||||||
id "io.swagger.swaggerhub" version "1.3.2"
|
id "io.swagger.swaggerhub" version "1.3.2"
|
||||||
id 'edu.sc.seis.launch4j' version '3.0.5'
|
id "edu.sc.seis.launch4j" version "3.0.5"
|
||||||
id 'com.diffplug.spotless' version '6.25.0'
|
id "com.diffplug.spotless" version "6.25.0"
|
||||||
id 'com.github.jk1.dependency-license-report' version '2.6'
|
id "com.github.jk1.dependency-license-report" version "2.8"
|
||||||
}
|
}
|
||||||
|
|
||||||
import com.github.jk1.license.render.*
|
import com.github.jk1.license.render.*
|
||||||
|
|
||||||
group = 'stirling.software'
|
ext {
|
||||||
version = '0.25.3'
|
springBootVersion = "3.3.0"
|
||||||
|
}
|
||||||
|
|
||||||
//17 is lowest but we support and recommend 21
|
group = "stirling.software"
|
||||||
sourceCompatibility = '17'
|
version = "0.26.1"
|
||||||
|
|
||||||
|
// 17 is lowest but we support and recommend 21
|
||||||
|
sourceCompatibility = "17"
|
||||||
|
|
||||||
repositories {
|
repositories {
|
||||||
mavenCentral()
|
mavenCentral()
|
||||||
|
maven { url "https://jitpack.io" }
|
||||||
}
|
}
|
||||||
|
|
||||||
licenseReport {
|
licenseReport {
|
||||||
@@ -28,15 +33,17 @@ licenseReport {
|
|||||||
sourceSets {
|
sourceSets {
|
||||||
main {
|
main {
|
||||||
java {
|
java {
|
||||||
if (System.getenv('DOCKER_ENABLE_SECURITY') == 'false') {
|
if (System.getenv("DOCKER_ENABLE_SECURITY") == "false") {
|
||||||
exclude 'stirling/software/SPDF/config/security/**'
|
exclude "stirling/software/SPDF/config/security/**"
|
||||||
exclude 'stirling/software/SPDF/controller/api/UserController.java'
|
exclude "stirling/software/SPDF/controller/api/UserController.java"
|
||||||
exclude 'stirling/software/SPDF/controller/web/AccountWebController.java'
|
exclude "stirling/software/SPDF/controller/api/DatabaseController.java"
|
||||||
exclude 'stirling/software/SPDF/model/ApiKeyAuthenticationToken.java'
|
exclude "stirling/software/SPDF/controller/web/AccountWebController.java"
|
||||||
exclude 'stirling/software/SPDF/model/Authority.java'
|
exclude "stirling/software/SPDF/controller/web/DatabaseWebController.java"
|
||||||
exclude 'stirling/software/SPDF/model/PersistentLogin.java'
|
exclude "stirling/software/SPDF/model/ApiKeyAuthenticationToken.java"
|
||||||
exclude 'stirling/software/SPDF/model/User.java'
|
exclude "stirling/software/SPDF/model/Authority.java"
|
||||||
exclude 'stirling/software/SPDF/repository/**'
|
exclude "stirling/software/SPDF/model/PersistentLogin.java"
|
||||||
|
exclude "stirling/software/SPDF/model/User.java"
|
||||||
|
exclude "stirling/software/SPDF/repository/**"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -49,34 +56,34 @@ openApi {
|
|||||||
}
|
}
|
||||||
|
|
||||||
launch4j {
|
launch4j {
|
||||||
icon = "${projectDir}/src/main/resources/static/favicon.ico"
|
icon = "${projectDir}/src/main/resources/static/favicon.ico"
|
||||||
|
|
||||||
outfile="Stirling-PDF.exe"
|
outfile="Stirling-PDF.exe"
|
||||||
headerType="console"
|
headerType="console"
|
||||||
jarTask = tasks.bootJar
|
jarTask = tasks.bootJar
|
||||||
|
|
||||||
errTitle="Encountered error, Do you have Java 21?"
|
errTitle="Encountered error, Do you have Java 21?"
|
||||||
downloadUrl="https://download.oracle.com/java/21/latest/jdk-21_windows-x64_bin.exe"
|
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", "ENDPOINTS_GROUPS_TO_REMOVE=CLI"]
|
||||||
jreMinVersion="17"
|
jreMinVersion="17"
|
||||||
|
|
||||||
mutexName="Stirling-PDF"
|
mutexName="Stirling-PDF"
|
||||||
windowTitle="Stirling-PDF"
|
windowTitle="Stirling-PDF"
|
||||||
|
|
||||||
messagesStartupError="An error occurred while starting Stirling-PDF"
|
messagesStartupError="An error occurred while starting Stirling-PDF"
|
||||||
//messagesJreNotFoundError="This application requires a Java Runtime Environment, Please download Java 17."
|
// messagesJreNotFoundError="This application requires a Java Runtime Environment, Please download Java 17."
|
||||||
messagesJreVersionError="You are running the wrong version of Java, Please download Java 21."
|
messagesJreVersionError="You are running the wrong version of Java, Please download Java 21."
|
||||||
messagesLauncherError="Java is corrupted. Please uninstall and then install Java 21."
|
messagesLauncherError="Java is corrupted. Please uninstall and then install Java 21."
|
||||||
messagesInstanceAlreadyExists="Stirling-PDF is already running."
|
messagesInstanceAlreadyExists="Stirling-PDF is already running."
|
||||||
}
|
}
|
||||||
|
|
||||||
spotless {
|
spotless {
|
||||||
java {
|
java {
|
||||||
target project.fileTree('src/main/java')
|
target project.fileTree('src/main/java')
|
||||||
|
|
||||||
googleJavaFormat('1.19.1').aosp().reorderImports(false)
|
googleJavaFormat("1.22.0").aosp().reorderImports(false)
|
||||||
|
|
||||||
importOrder('java', 'javax', 'org', 'com', 'net', 'io')
|
importOrder("java", "javax", "org", "com", "net", "io")
|
||||||
toggleOffOn()
|
toggleOffOn()
|
||||||
trimTrailingWhitespace()
|
trimTrailingWhitespace()
|
||||||
indentWithSpaces()
|
indentWithSpaces()
|
||||||
@@ -84,127 +91,137 @@ spotless {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
tasks.wrapper {
|
||||||
|
gradleVersion = "8.7"
|
||||||
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
//security updates
|
//security updates
|
||||||
implementation 'ch.qos.logback:logback-classic:1.5.3'
|
implementation "ch.qos.logback:logback-classic:1.5.6"
|
||||||
implementation 'ch.qos.logback:logback-core:1.5.3'
|
implementation "ch.qos.logback:logback-core:1.5.6"
|
||||||
implementation 'org.springframework:spring-webmvc:6.1.5'
|
implementation "org.springframework:spring-webmvc:6.1.9"
|
||||||
|
|
||||||
implementation("io.github.pixee:java-security-toolkit:1.1.3")
|
implementation("io.github.pixee:java-security-toolkit:1.1.3")
|
||||||
|
|
||||||
implementation 'org.yaml:snakeyaml:2.2'
|
// implementation "org.yaml:snakeyaml:2.2"
|
||||||
|
implementation 'com.github.Carleslc.Simple-YAML:Simple-Yaml:1.8.4'
|
||||||
|
|
||||||
// Exclude Tomcat and include Jetty
|
// Exclude Tomcat and include Jetty
|
||||||
implementation('org.springframework.boot:spring-boot-starter-web:3.2.4') {
|
implementation("org.springframework.boot:spring-boot-starter-web:$springBootVersion") {
|
||||||
exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat'
|
exclude group: "org.springframework.boot", module: "spring-boot-starter-tomcat"
|
||||||
}
|
}
|
||||||
implementation 'org.springframework.boot:spring-boot-starter-jetty:3.2.4'
|
implementation "org.springframework.boot:spring-boot-starter-jetty:$springBootVersion"
|
||||||
|
|
||||||
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf:3.2.4'
|
implementation "org.springframework.boot:spring-boot-starter-thymeleaf:$springBootVersion"
|
||||||
|
|
||||||
if (System.getenv('DOCKER_ENABLE_SECURITY') != 'false') {
|
if (System.getenv("DOCKER_ENABLE_SECURITY") != "false") {
|
||||||
implementation 'org.springframework.boot:spring-boot-starter-security:3.2.4'
|
implementation "org.springframework.boot:spring-boot-starter-security:$springBootVersion"
|
||||||
implementation '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:3.2.4"
|
implementation "org.springframework.boot:spring-boot-starter-data-jpa:$springBootVersion"
|
||||||
implementation 'org.springframework.boot:spring-boot-starter-oauth2-client:3.2.4'
|
implementation "org.springframework.boot:spring-boot-starter-oauth2-client:$springBootVersion"
|
||||||
|
|
||||||
//2.2.x requires rebuild of DB file.. need migration path
|
//2.2.x requires rebuild of DB file.. need migration path
|
||||||
implementation "com.h2database:h2:2.1.214"
|
implementation "com.h2database:h2:2.1.214"
|
||||||
|
// implementation "com.h2database:h2:2.2.224"
|
||||||
}
|
}
|
||||||
|
|
||||||
testImplementation 'org.springframework.boot:spring-boot-starter-test:3.2.4'
|
testImplementation "org.springframework.boot:spring-boot-starter-test:$springBootVersion"
|
||||||
|
|
||||||
// Batik
|
// Batik
|
||||||
implementation 'org.apache.xmlgraphics:batik-all:1.17'
|
implementation "org.apache.xmlgraphics:batik-all:1.17"
|
||||||
|
|
||||||
// TwelveMonkeys
|
// TwelveMonkeys
|
||||||
implementation 'com.twelvemonkeys.imageio:imageio-batik:3.10.1'
|
implementation "com.twelvemonkeys.imageio:imageio-batik:3.10.1"
|
||||||
implementation 'com.twelvemonkeys.imageio:imageio-bmp:3.10.1'
|
implementation "com.twelvemonkeys.imageio:imageio-bmp:3.10.1"
|
||||||
// implementation 'com.twelvemonkeys.imageio:imageio-hdr:3.10.1'
|
// implementation "com.twelvemonkeys.imageio:imageio-hdr:3.10.1"
|
||||||
// implementation 'com.twelvemonkeys.imageio:imageio-icns:3.10.1'
|
// implementation "com.twelvemonkeys.imageio:imageio-icns:3.10.1"
|
||||||
// implementation 'com.twelvemonkeys.imageio:imageio-iff:3.10.1'
|
// implementation "com.twelvemonkeys.imageio:imageio-iff:3.10.1"
|
||||||
implementation 'com.twelvemonkeys.imageio:imageio-jpeg:3.10.1'
|
implementation "com.twelvemonkeys.imageio:imageio-jpeg:3.11.0"
|
||||||
// implementation 'com.twelvemonkeys.imageio:imageio-pcx:3.10.1'
|
// implementation "com.twelvemonkeys.imageio:imageio-pcx:3.10.1"
|
||||||
// implementation 'com.twelvemonkeys.imageio:imageio-pict:3.10.1'
|
// implementation "com.twelvemonkeys.imageio:imageio-pict:3.10.1"
|
||||||
// implementation 'com.twelvemonkeys.imageio:imageio-pnm:3.10.1'
|
// implementation "com.twelvemonkeys.imageio:imageio-pnm:3.10.1"
|
||||||
// implementation 'com.twelvemonkeys.imageio:imageio-psd:3.10.1'
|
// implementation "com.twelvemonkeys.imageio:imageio-psd:3.10.1"
|
||||||
// implementation 'com.twelvemonkeys.imageio:imageio-sgi:3.10.1'
|
// implementation "com.twelvemonkeys.imageio:imageio-sgi:3.10.1"
|
||||||
// implementation 'com.twelvemonkeys.imageio:imageio-tga:3.10.1'
|
// implementation "com.twelvemonkeys.imageio:imageio-tga:3.10.1"
|
||||||
// implementation 'com.twelvemonkeys.imageio:imageio-thumbsdb:3.10.1'
|
// implementation "com.twelvemonkeys.imageio:imageio-thumbsdb:3.10.1"
|
||||||
implementation 'com.twelvemonkeys.imageio:imageio-tiff:3.10.1'
|
implementation "com.twelvemonkeys.imageio:imageio-tiff:3.10.1"
|
||||||
implementation 'com.twelvemonkeys.imageio:imageio-webp:3.10.1'
|
implementation "com.twelvemonkeys.imageio:imageio-webp:3.10.1"
|
||||||
// implementation 'com.twelvemonkeys.imageio:imageio-xwd:3.10.1'
|
// implementation "com.twelvemonkeys.imageio:imageio-xwd:3.10.1"
|
||||||
|
|
||||||
implementation 'commons-io:commons-io:2.15.1'
|
implementation "commons-io:commons-io:2.16.1"
|
||||||
implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.2.0'
|
implementation "org.springdoc:springdoc-openapi-starter-webmvc-ui:2.2.0"
|
||||||
|
|
||||||
//general PDF
|
//general PDF
|
||||||
|
|
||||||
// https://mvnrepository.com/artifact/com.opencsv/opencsv
|
// https://mvnrepository.com/artifact/com.opencsv/opencsv
|
||||||
implementation ('com.opencsv:opencsv:5.9') {
|
implementation ("com.opencsv:opencsv:5.9") {
|
||||||
exclude group: 'commons-logging', module: 'commons-logging'
|
exclude group: "commons-logging", module: "commons-logging"
|
||||||
}
|
}
|
||||||
|
|
||||||
implementation ('org.apache.pdfbox:pdfbox:3.0.2'){
|
implementation ("org.apache.pdfbox:pdfbox:3.0.2") {
|
||||||
exclude group: 'commons-logging', module: 'commons-logging'
|
exclude group: "commons-logging", module: "commons-logging"
|
||||||
}
|
}
|
||||||
|
|
||||||
implementation ('org.apache.pdfbox:xmpbox:3.0.2'){
|
implementation ("org.apache.pdfbox:xmpbox:3.0.2") {
|
||||||
exclude group: 'commons-logging', module: 'commons-logging'
|
exclude group: "commons-logging", module: "commons-logging"
|
||||||
}
|
}
|
||||||
|
implementation "com.github.Carleslc.Simple-YAML:Simple-Yaml:1.8.4"
|
||||||
|
|
||||||
implementation 'org.bouncycastle:bcprov-jdk18on:1.77'
|
implementation "org.bouncycastle:bcprov-jdk18on:1.78.1"
|
||||||
implementation 'org.bouncycastle:bcpkix-jdk18on:1.77'
|
implementation "org.bouncycastle:bcpkix-jdk18on:1.78.1"
|
||||||
implementation 'org.springframework.boot:spring-boot-starter-actuator:3.2.4'
|
implementation "org.springframework.boot:spring-boot-starter-actuator:$springBootVersion"
|
||||||
implementation 'io.micrometer:micrometer-core:1.12.4'
|
implementation "io.micrometer:micrometer-core:1.13.0"
|
||||||
implementation group: 'com.google.zxing', name: 'core', version: '3.5.3'
|
implementation group: "com.google.zxing", name: "core", version: "3.5.3"
|
||||||
// https://mvnrepository.com/artifact/org.commonmark/commonmark
|
// https://mvnrepository.com/artifact/org.commonmark/commonmark
|
||||||
implementation 'org.commonmark:commonmark:0.22.0'
|
implementation "org.commonmark:commonmark:0.22.0"
|
||||||
implementation 'org.commonmark:commonmark-ext-gfm-tables:0.22.0'
|
implementation "org.commonmark:commonmark-ext-gfm-tables:0.22.0"
|
||||||
// https://mvnrepository.com/artifact/com.github.vladimir-bukhtoyarov/bucket4j-core
|
// https://mvnrepository.com/artifact/com.bucket4j/bucket4j_jdk17
|
||||||
implementation 'com.github.vladimir-bukhtoyarov:bucket4j-core:7.6.0'
|
implementation "com.bucket4j:bucket4j_jdk17-core:8.12.1"
|
||||||
|
|
||||||
implementation 'com.fathzer:javaluator:3.0.3'
|
implementation "com.fathzer:javaluator:3.0.4"
|
||||||
|
|
||||||
developmentOnly("org.springframework.boot:spring-boot-devtools:3.2.4")
|
developmentOnly("org.springframework.boot:spring-boot-devtools:$springBootVersion")
|
||||||
compileOnly 'org.projectlombok:lombok:1.18.32'
|
compileOnly "org.projectlombok:lombok:1.18.32"
|
||||||
annotationProcessor 'org.projectlombok:lombok:1.18.32'
|
annotationProcessor "org.projectlombok:lombok:1.18.32"
|
||||||
|
|
||||||
|
testImplementation 'org.mockito:mockito-inline:3.12.4'
|
||||||
}
|
}
|
||||||
|
|
||||||
tasks.withType(JavaCompile).configureEach {
|
tasks.withType(JavaCompile).configureEach {
|
||||||
dependsOn 'spotlessApply'
|
options.encoding = "UTF-8"
|
||||||
|
dependsOn "spotlessApply"
|
||||||
}
|
}
|
||||||
compileJava {
|
compileJava {
|
||||||
options.compilerArgs << '-parameters'
|
options.compilerArgs << "-parameters"
|
||||||
}
|
}
|
||||||
|
|
||||||
task writeVersion {
|
task writeVersion {
|
||||||
def propsFile = file('src/main/resources/version.properties')
|
def propsFile = file("src/main/resources/version.properties")
|
||||||
def props = new Properties()
|
def props = new Properties()
|
||||||
props.setProperty('version', version)
|
props.setProperty("version", version)
|
||||||
props.store(propsFile.newWriter(), null)
|
props.store(propsFile.newWriter(), null)
|
||||||
}
|
}
|
||||||
|
|
||||||
swaggerhubUpload {
|
swaggerhubUpload {
|
||||||
//dependsOn generateOpenApiDocs // Depends on your task generating Swagger docs
|
//dependsOn generateOpenApiDocs // Depends on your task generating Swagger docs
|
||||||
api 'Stirling-PDF' // The name of your API on SwaggerHub
|
api "Stirling-PDF" // The name of your API on SwaggerHub
|
||||||
owner 'Frooodle' // Your SwaggerHub username (or organization name)
|
owner "Frooodle" // Your SwaggerHub username (or organization name)
|
||||||
version project.version // The version of your API
|
version project.version // The version of your API
|
||||||
inputFile './SwaggerDoc.json' // The path to your Swagger docs
|
inputFile "./SwaggerDoc.json" // The path to your Swagger docs
|
||||||
token "${System.getenv('SWAGGERHUB_API_KEY')}" // Your SwaggerHub API key, passed as an environment variable
|
token "${System.getenv("SWAGGERHUB_API_KEY")}" // Your SwaggerHub API key, passed as an environment variable
|
||||||
oas '3.0.0' // The version of the OpenAPI Specification you're using
|
oas "3.0.0" // The version of the OpenAPI Specification you"re using
|
||||||
}
|
}
|
||||||
|
|
||||||
jar {
|
jar {
|
||||||
enabled = false
|
enabled = false
|
||||||
manifest {
|
manifest {
|
||||||
attributes 'Implementation-Title': 'Stirling-PDF',
|
attributes "Implementation-Title": "Stirling-PDF",
|
||||||
'Implementation-Version': project.version
|
"Implementation-Version": project.version
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
tasks.named('test') {
|
tasks.named("test") {
|
||||||
useJUnitPlatform()
|
useJUnitPlatform()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
apiVersion: v2
|
apiVersion: v2
|
||||||
appVersion: 0.25.3
|
appVersion: 0.26.1
|
||||||
description: locally hosted web application that allows you to perform various operations
|
description: locally hosted web application that allows you to perform various operations
|
||||||
on PDF files
|
on PDF files
|
||||||
home: https://github.com/Stirling-Tools/Stirling-PDF
|
home: https://github.com/Stirling-Tools/Stirling-PDF
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 53 KiB After Width: | Height: | Size: 50 KiB |
|
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 9.4 KiB |
@@ -1,110 +1 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
<svg xmlns="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg" id="Layer_1" x="0" y="0" version="1.1" viewBox="0 0 512 512" style="enable-background:new 0 0 512 512" xml:space="preserve"><defs id="defs173"><linearGradient id="XMLID_5_" x1="304.496" x2="316.036" y1="422.91" y2="326.263" gradientUnits="userSpaceOnUse"><stop offset="0" style="stop-color:#dcf1f3" id="stop156"/><stop offset="1" style="stop-color:#c2c2c9" id="stop158"/></linearGradient></defs><style id="style150" type="text/css">.st1{fill:#c02223}.st2{fill:#882425}.st3{fill:url(#XMLID_5_)}.st4{fill:url(#XMLID_7_)}</style><g id="XMLID_4_"><path id="XMLID_131_" d="M 347.01402,14.355825 98.978019,69.02261 C 73.825483,74.547445 55.942464,96.792175 55.942464,122.52628 v 315.06096 c 0,22.39012 16.719895,41.14548 38.819234,43.76251 L 224.8861,498.36042 339.48636,384.26465 455.76603,265.15425 453.73057,84.870162 C 453.43979,62.916214 433.08513,46.632491 411.71274,51.284984 l -28.78729,6.251786 0.14539,-13.666697 C 383.36162,24.678542 365.62399,10.284894 347.01402,14.355825 Z" class="st1" style="stroke-width:1.45391"/><path id="XMLID_117_" d="m 383.21622,57.53677 v 285.8375 L 456.05681,265.00885 454.02135,78.763767 C 453.87595,59.863016 436.28372,45.905539 417.81914,49.97647 Z" class="st2" style="stroke-width:1.45391"/><polygon id="XMLID_18_" points="234.7 422.6 368.5 387.7 393.5 262.2" class="st3" style="fill:url(#XMLID_5_)" transform="matrix(1.4556308,0,0,1.4548265,-116.73161,-116.45231)"/><linearGradient id="XMLID_7_" x1="223.084" x2="241.417" y1="372.756" y2="114.557" gradientTransform="matrix(1.4539039,0,0,1.4539039,-116.19976,-116.20474)" gradientUnits="userSpaceOnUse"><stop offset="0" style="stop-color:#dcf1f3" id="stop163"/><stop offset="1" style="stop-color:#c2c2c9" id="stop165"/></linearGradient><path id="XMLID_6_" d="m 282.89686,214.84917 c 0,0 -22.24473,-28.93269 -38.67384,-36.78377 -10.46811,-4.94327 -26.02489,-6.83335 -38.23768,-0.72695 -18.02841,9.0142 -19.91848,34.31213 -3.34397,44.34406 3.92553,2.47165 9.15959,4.50711 15.99294,6.10641 36.63838,8.43264 97.12077,25.87949 89.70587,96.10304 0,0 -4.21633,65.86185 -73.56753,73.42215 -12.2128,1.30851 -24.57098,0.43617 -36.493,-2.32625 -16.42911,-3.63476 -45.50719,-11.04967 -59.75545,-19.91849 l -2.61703,-75.16682 h 6.97875 c 0,0 13.81208,33.43978 53.06749,49.57812 7.26952,2.90781 15.26599,4.07093 22.97168,2.90781 9.74116,-1.45391 21.22699,-6.68796 25.87949,-22.53551 0,0 7.85108,-23.11707 -32.85823,-35.76604 -32.56744,-10.17733 -63.24481,-20.64543 -75.89378,-54.95757 -5.961,-16.28371 -6.97874,-34.31212 -2.90781,-51.61358 5.37944,-22.53551 20.79082,-54.23062 64.40794,-67.89732 0,0 57.28381,-15.55677 96.53922,5.52484 l -1.74468,89.70587 z" class="st4" style="fill:url(#XMLID_7_);stroke-width:1.45391"/></g></svg>
|
||||||
<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
|
||||||
|
|
||||||
<svg
|
|
||||||
version="1.1"
|
|
||||||
id="Layer_1"
|
|
||||||
x="0px"
|
|
||||||
y="0px"
|
|
||||||
viewBox="0 0 512 512"
|
|
||||||
style="enable-background:new 0 0 512 512;"
|
|
||||||
xml:space="preserve"
|
|
||||||
sodipodi:docname="favicon.svg"
|
|
||||||
inkscape:version="1.2.2 (732a01da63, 2022-12-09)"
|
|
||||||
inkscape:export-filename="favicon.png"
|
|
||||||
inkscape:export-xdpi="96"
|
|
||||||
inkscape:export-ydpi="96"
|
|
||||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
|
||||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
|
||||||
xmlns:svg="http://www.w3.org/2000/svg"><defs
|
|
||||||
id="defs173">
|
|
||||||
|
|
||||||
|
|
||||||
<linearGradient
|
|
||||||
id="XMLID_5_"
|
|
||||||
gradientUnits="userSpaceOnUse"
|
|
||||||
x1="304.496"
|
|
||||||
y1="422.9102"
|
|
||||||
x2="316.036"
|
|
||||||
y2="326.2626">
|
|
||||||
<stop
|
|
||||||
offset="0"
|
|
||||||
style="stop-color:#DCF1F3"
|
|
||||||
id="stop156" />
|
|
||||||
<stop
|
|
||||||
offset="1"
|
|
||||||
style="stop-color:#C2C2C9"
|
|
||||||
id="stop158" />
|
|
||||||
</linearGradient>
|
|
||||||
|
|
||||||
</defs><sodipodi:namedview
|
|
||||||
id="namedview171"
|
|
||||||
pagecolor="#ffffff"
|
|
||||||
bordercolor="#000000"
|
|
||||||
borderopacity="0.25"
|
|
||||||
inkscape:showpageshadow="2"
|
|
||||||
inkscape:pageopacity="0.0"
|
|
||||||
inkscape:pagecheckerboard="0"
|
|
||||||
inkscape:deskcolor="#d1d1d1"
|
|
||||||
showgrid="false"
|
|
||||||
inkscape:zoom="1.4142136"
|
|
||||||
inkscape:cx="219.91021"
|
|
||||||
inkscape:cy="232.63813"
|
|
||||||
inkscape:window-width="3840"
|
|
||||||
inkscape:window-height="2054"
|
|
||||||
inkscape:window-x="2869"
|
|
||||||
inkscape:window-y="-11"
|
|
||||||
inkscape:window-maximized="1"
|
|
||||||
inkscape:current-layer="XMLID_4_" />
|
|
||||||
<style
|
|
||||||
type="text/css"
|
|
||||||
id="style150">
|
|
||||||
.st0{fill:#FFFFFF;}
|
|
||||||
.st1{fill:#C02223;}
|
|
||||||
.st2{fill:#882425;}
|
|
||||||
.st3{fill:url(#XMLID_5_);}
|
|
||||||
.st4{fill:url(#XMLID_7_);}
|
|
||||||
</style>
|
|
||||||
|
|
||||||
<g
|
|
||||||
id="XMLID_4_">
|
|
||||||
<path
|
|
||||||
id="XMLID_131_"
|
|
||||||
class="st1"
|
|
||||||
d="M 347.01402,14.355825 98.978019,69.02261 C 73.825483,74.547445 55.942464,96.792175 55.942464,122.52628 v 315.06096 c 0,22.39012 16.719895,41.14548 38.819234,43.76251 L 224.8861,498.36042 339.48636,384.26465 455.76603,265.15425 453.73057,84.870162 C 453.43979,62.916214 433.08513,46.632491 411.71274,51.284984 l -28.78729,6.251786 0.14539,-13.666697 C 383.36162,24.678542 365.62399,10.284894 347.01402,14.355825 Z"
|
|
||||||
sodipodi:nodetypes="ccssccccccccc"
|
|
||||||
style="stroke-width:1.45391" /><path
|
|
||||||
id="XMLID_117_"
|
|
||||||
class="st2"
|
|
||||||
d="m 383.21622,57.53677 v 285.8375 L 456.05681,265.00885 454.02135,78.763767 C 453.87595,59.863016 436.28372,45.905539 417.81914,49.97647 Z"
|
|
||||||
style="stroke-width:1.45391" /><polygon
|
|
||||||
id="XMLID_18_"
|
|
||||||
class="st3"
|
|
||||||
points="234.7,422.6 368.5,387.7 393.5,262.2 "
|
|
||||||
style="fill:url(#XMLID_5_)"
|
|
||||||
transform="matrix(1.4556308,0,0,1.4548265,-116.73161,-116.45231)" />
|
|
||||||
<linearGradient
|
|
||||||
id="XMLID_7_"
|
|
||||||
gradientUnits="userSpaceOnUse"
|
|
||||||
x1="223.0838"
|
|
||||||
y1="372.7559"
|
|
||||||
x2="241.4174"
|
|
||||||
y2="114.557"
|
|
||||||
gradientTransform="matrix(1.4539039,0,0,1.4539039,-116.19976,-116.20474)">
|
|
||||||
<stop
|
|
||||||
offset="0"
|
|
||||||
style="stop-color:#DCF1F3"
|
|
||||||
id="stop163" />
|
|
||||||
<stop
|
|
||||||
offset="1"
|
|
||||||
style="stop-color:#C2C2C9"
|
|
||||||
id="stop165" />
|
|
||||||
</linearGradient>
|
|
||||||
<path
|
|
||||||
id="XMLID_6_"
|
|
||||||
class="st4"
|
|
||||||
d="m 282.89686,214.84917 c 0,0 -22.24473,-28.93269 -38.67384,-36.78377 -10.46811,-4.94327 -26.02489,-6.83335 -38.23768,-0.72695 -18.02841,9.0142 -19.91848,34.31213 -3.34397,44.34406 3.92553,2.47165 9.15959,4.50711 15.99294,6.10641 36.63838,8.43264 97.12077,25.87949 89.70587,96.10304 0,0 -4.21633,65.86185 -73.56753,73.42215 -12.2128,1.30851 -24.57098,0.43617 -36.493,-2.32625 -16.42911,-3.63476 -45.50719,-11.04967 -59.75545,-19.91849 l -2.61703,-75.16682 h 6.97875 c 0,0 13.81208,33.43978 53.06749,49.57812 7.26952,2.90781 15.26599,4.07093 22.97168,2.90781 9.74116,-1.45391 21.22699,-6.68796 25.87949,-22.53551 0,0 7.85108,-23.11707 -32.85823,-35.76604 -32.56744,-10.17733 -63.24481,-20.64543 -75.89378,-54.95757 -5.961,-16.28371 -6.97874,-34.31212 -2.90781,-51.61358 5.37944,-22.53551 20.79082,-54.23062 64.40794,-67.89732 0,0 57.28381,-15.55677 96.53922,5.52484 l -1.74468,89.70587 z"
|
|
||||||
style="fill:url(#XMLID_7_);stroke-width:1.45391" />
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 4.0 KiB After Width: | Height: | Size: 2.7 KiB |
|
Before Width: | Height: | Size: 1.4 MiB |
|
Before Width: | Height: | Size: 29 KiB After Width: | Height: | Size: 31 KiB |
|
Before Width: | Height: | Size: 30 KiB After Width: | Height: | Size: 30 KiB |
BIN
images/settings-light.png
Normal file
|
After Width: | Height: | Size: 44 KiB |
|
Before Width: | Height: | Size: 12 KiB |
BIN
images/stirling-home-dark.png
Normal file
|
After Width: | Height: | Size: 242 KiB |
|
Before Width: | Height: | Size: 118 KiB |
|
Before Width: | Height: | Size: 166 KiB After Width: | Height: | Size: 145 KiB |
43
pipeline/defaultWebUIConfigs/OCR images.json
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
{
|
||||||
|
"name": "OCR images",
|
||||||
|
"pipeline": [
|
||||||
|
{
|
||||||
|
"operation": "/api/v1/convert/img/pdf",
|
||||||
|
"parameters": {
|
||||||
|
"fitOption": "fillPage",
|
||||||
|
"colorType": "color",
|
||||||
|
"autoRotate": true,
|
||||||
|
"fileInput": "automated"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"operation": "/api/v1/general/merge-pdfs",
|
||||||
|
"parameters": {
|
||||||
|
"sortType": "orderProvided",
|
||||||
|
"fileInput": "automated"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"operation": "/api/v1/misc/ocr-pdf",
|
||||||
|
"parameters": {
|
||||||
|
"languages": [
|
||||||
|
"eng"
|
||||||
|
],
|
||||||
|
"sidecar": false,
|
||||||
|
"deskew": false,
|
||||||
|
"clean": false,
|
||||||
|
"cleanFinal": false,
|
||||||
|
"ocrType": "skip-text",
|
||||||
|
"ocrRenderType": "hocr",
|
||||||
|
"removeImagesAfter": false,
|
||||||
|
"fileInput": "automated"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"_examples": {
|
||||||
|
"outputDir": "{outputFolder}/{folderName}",
|
||||||
|
"outputFileName": "{filename}-{pipelineName}-{date}-{time}"
|
||||||
|
},
|
||||||
|
"outputDir": "{outputFolder}",
|
||||||
|
"outputFileName": "{filename}"
|
||||||
|
}
|
||||||
@@ -79,7 +79,9 @@ def write_readme(progress_list: list[tuple[str, int]]) -> None:
|
|||||||
file.writelines(content)
|
file.writelines(content)
|
||||||
|
|
||||||
|
|
||||||
def compare_files(default_file_path, file_paths, translation_status_file) -> list[tuple[str, int]]:
|
def compare_files(
|
||||||
|
default_file_path, file_paths, ignore_translation_file
|
||||||
|
) -> list[tuple[str, int]]:
|
||||||
"""Compares the default properties file with other
|
"""Compares the default properties file with other
|
||||||
properties files in the directory.
|
properties files in the directory.
|
||||||
|
|
||||||
@@ -92,18 +94,24 @@ def compare_files(default_file_path, file_paths, translation_status_file) -> lis
|
|||||||
language and progress percentage.
|
language and progress percentage.
|
||||||
""" # noqa: D205
|
""" # noqa: D205
|
||||||
num_lines = sum(
|
num_lines = sum(
|
||||||
1 for line in open(default_file_path, encoding="utf-8") if line.strip() and not line.strip().startswith("#")
|
1
|
||||||
|
for line in open(default_file_path, encoding="utf-8")
|
||||||
|
if line.strip() and not line.strip().startswith("#")
|
||||||
)
|
)
|
||||||
|
|
||||||
result_list = []
|
result_list = []
|
||||||
sort_translation_status: tomlkit.TOMLDocument
|
sort_ignore_translation: tomlkit.TOMLDocument
|
||||||
|
|
||||||
# read toml
|
# read toml
|
||||||
with open(translation_status_file, encoding="utf-8") as f:
|
with open(ignore_translation_file, encoding="utf-8") as f:
|
||||||
sort_translation_status = tomlkit.parse(f.read())
|
sort_ignore_translation = tomlkit.parse(f.read())
|
||||||
|
|
||||||
for file_path in file_paths:
|
for file_path in file_paths:
|
||||||
language = os.path.basename(file_path).split("messages_", 1)[1].split(".properties", 1)[0]
|
language = (
|
||||||
|
os.path.basename(file_path)
|
||||||
|
.split("messages_", 1)[1]
|
||||||
|
.split(".properties", 1)[0]
|
||||||
|
)
|
||||||
|
|
||||||
fails = 0
|
fails = 0
|
||||||
if "en_GB" in language or "en_US" in language:
|
if "en_GB" in language or "en_US" in language:
|
||||||
@@ -111,21 +119,25 @@ def compare_files(default_file_path, file_paths, translation_status_file) -> lis
|
|||||||
result_list.append(("en_US", 100))
|
result_list.append(("en_US", 100))
|
||||||
continue
|
continue
|
||||||
|
|
||||||
if language not in sort_translation_status:
|
if language not in sort_ignore_translation:
|
||||||
sort_translation_status[language] = tomlkit.table()
|
sort_ignore_translation[language] = tomlkit.table()
|
||||||
|
|
||||||
if (
|
if (
|
||||||
"ignore" not in sort_translation_status[language]
|
"ignore" not in sort_ignore_translation[language]
|
||||||
or len(sort_translation_status[language].get("ignore", [])) < 1
|
or len(sort_ignore_translation[language].get("ignore", [])) < 1
|
||||||
):
|
):
|
||||||
sort_translation_status[language]["ignore"] = tomlkit.array(["language.direction"])
|
sort_ignore_translation[language]["ignore"] = tomlkit.array(
|
||||||
|
["language.direction"]
|
||||||
|
)
|
||||||
|
|
||||||
# if "missing" not in sort_translation_status[language]:
|
# if "missing" not in sort_ignore_translation[language]:
|
||||||
# sort_translation_status[language]["missing"] = tomlkit.array()
|
# sort_ignore_translation[language]["missing"] = tomlkit.array()
|
||||||
# elif "language.direction" in sort_translation_status[language]["missing"]:
|
# elif "language.direction" in sort_ignore_translation[language]["missing"]:
|
||||||
# sort_translation_status[language]["missing"].remove("language.direction")
|
# sort_ignore_translation[language]["missing"].remove("language.direction")
|
||||||
|
|
||||||
with open(default_file_path, encoding="utf-8") as default_file, open(file_path, encoding="utf-8") as file:
|
with open(default_file_path, encoding="utf-8") as default_file, open(
|
||||||
|
file_path, encoding="utf-8"
|
||||||
|
) as file:
|
||||||
for _ in range(5):
|
for _ in range(5):
|
||||||
next(default_file)
|
next(default_file)
|
||||||
try:
|
try:
|
||||||
@@ -133,34 +145,45 @@ def compare_files(default_file_path, file_paths, translation_status_file) -> lis
|
|||||||
except StopIteration:
|
except StopIteration:
|
||||||
fails = num_lines
|
fails = num_lines
|
||||||
|
|
||||||
for line_num, (line_default, line_file) in enumerate(zip(default_file, file), start=6):
|
for line_num, (line_default, line_file) in enumerate(
|
||||||
|
zip(default_file, file), start=6
|
||||||
|
):
|
||||||
try:
|
try:
|
||||||
# Ignoring empty lines and lines start with #
|
# Ignoring empty lines and lines start with #
|
||||||
if line_default.strip() == "" or line_default.startswith("#"):
|
if line_default.strip() == "" or line_default.startswith("#"):
|
||||||
continue
|
continue
|
||||||
|
|
||||||
default_key, default_value = line_default.split("=", 1)
|
default_key, default_value = line_default.split("=", 1)
|
||||||
file_key, file_value = line_file.split("=", 1)
|
file_key, file_value = line_file.split("=", 1)
|
||||||
if (
|
if (
|
||||||
default_value.strip() == file_value.strip()
|
default_value.strip() == file_value.strip()
|
||||||
and default_key.strip() not in sort_translation_status[language]["ignore"]
|
and default_key.strip()
|
||||||
|
not in sort_ignore_translation[language]["ignore"]
|
||||||
):
|
):
|
||||||
print(f"{language}: Line {line_num} is missing the translation.")
|
print(
|
||||||
# if default_key.strip() not in sort_translation_status[language]["missing"]:
|
f"{language}: Line {line_num} is missing the translation."
|
||||||
|
)
|
||||||
|
# if default_key.strip() not in sort_ignore_translation[language]["missing"]:
|
||||||
# missing_array = tomlkit.array()
|
# missing_array = tomlkit.array()
|
||||||
# missing_array.append(default_key.strip())
|
# missing_array.append(default_key.strip())
|
||||||
# missing_array.multiline(True)
|
# missing_array.multiline(True)
|
||||||
# sort_translation_status[language]["missing"].extend(missing_array)
|
# sort_ignore_translation[language]["missing"].extend(missing_array)
|
||||||
fails += 1
|
fails += 1
|
||||||
# elif default_key.strip() in sort_translation_status[language]["ignore"]:
|
# elif default_key.strip() in sort_ignore_translation[language]["ignore"]:
|
||||||
# if default_key.strip() in sort_translation_status[language]["missing"]:
|
# if default_key.strip() in sort_ignore_translation[language]["missing"]:
|
||||||
# sort_translation_status[language]["missing"].remove(default_key.strip())
|
# sort_ignore_translation[language]["missing"].remove(default_key.strip())
|
||||||
if default_value.strip() != file_value.strip():
|
if default_value.strip() != file_value.strip():
|
||||||
# if default_key.strip() in sort_translation_status[language]["missing"]:
|
# if default_key.strip() in sort_ignore_translation[language]["missing"]:
|
||||||
# sort_translation_status[language]["missing"].remove(default_key.strip())
|
# sort_ignore_translation[language]["missing"].remove(default_key.strip())
|
||||||
if default_key.strip() in sort_translation_status[language]["ignore"]:
|
if (
|
||||||
sort_translation_status[language]["ignore"].remove(default_key.strip())
|
default_key.strip()
|
||||||
|
in sort_ignore_translation[language]["ignore"]
|
||||||
|
):
|
||||||
|
sort_ignore_translation[language]["ignore"].remove(
|
||||||
|
default_key.strip()
|
||||||
|
)
|
||||||
|
except ValueError:
|
||||||
|
print(f"{line_default}|{line_file}")
|
||||||
|
exit(1)
|
||||||
except IndexError:
|
except IndexError:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
@@ -171,9 +194,9 @@ def compare_files(default_file_path, file_paths, translation_status_file) -> lis
|
|||||||
int((num_lines - fails) * 100 / num_lines),
|
int((num_lines - fails) * 100 / num_lines),
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
translation_status = convert_to_multiline(sort_translation_status)
|
ignore_translation = convert_to_multiline(sort_ignore_translation)
|
||||||
with open(translation_status_file, "w", encoding="utf-8") as file:
|
with open(ignore_translation_file, "w", encoding="utf-8") as file:
|
||||||
file.write(tomlkit.dumps(translation_status))
|
file.write(tomlkit.dumps(ignore_translation))
|
||||||
|
|
||||||
unique_data = list(set(result_list))
|
unique_data = list(set(result_list))
|
||||||
unique_data.sort(key=lambda x: x[1], reverse=True)
|
unique_data.sort(key=lambda x: x[1], reverse=True)
|
||||||
@@ -187,6 +210,8 @@ if __name__ == "__main__":
|
|||||||
reference_file = os.path.join(directory, "messages_en_GB.properties")
|
reference_file = os.path.join(directory, "messages_en_GB.properties")
|
||||||
|
|
||||||
scripts_directory = os.path.join(os.getcwd(), "scripts")
|
scripts_directory = os.path.join(os.getcwd(), "scripts")
|
||||||
translation_state_file = os.path.join(scripts_directory, "translation_status.toml")
|
translation_state_file = os.path.join(scripts_directory, "ignore_translation.toml")
|
||||||
|
|
||||||
write_readme(compare_files(reference_file, messages_file_paths, translation_state_file))
|
write_readme(
|
||||||
|
compare_files(reference_file, messages_file_paths, translation_state_file)
|
||||||
|
)
|
||||||
|
|||||||
@@ -10,7 +10,11 @@ ignore = [
|
|||||||
|
|
||||||
[ca_CA]
|
[ca_CA]
|
||||||
ignore = [
|
ignore = [
|
||||||
|
'PDFToText.tags',
|
||||||
|
'adminUserSettings.admin',
|
||||||
'language.direction',
|
'language.direction',
|
||||||
|
'survey.button',
|
||||||
|
'watermark.type.1',
|
||||||
]
|
]
|
||||||
|
|
||||||
[cs_CZ]
|
[cs_CZ]
|
||||||
@@ -48,6 +52,7 @@ ignore = [
|
|||||||
ignore = [
|
ignore = [
|
||||||
'adminUserSettings.roles',
|
'adminUserSettings.roles',
|
||||||
'color',
|
'color',
|
||||||
|
'error',
|
||||||
'language.direction',
|
'language.direction',
|
||||||
'no',
|
'no',
|
||||||
'showJS.tags',
|
'showJS.tags',
|
||||||
@@ -60,7 +65,26 @@ ignore = [
|
|||||||
|
|
||||||
[fr_FR]
|
[fr_FR]
|
||||||
ignore = [
|
ignore = [
|
||||||
|
'AddStampRequest.alphabet',
|
||||||
|
'AddStampRequest.position',
|
||||||
|
'AddStampRequest.rotation',
|
||||||
|
'PDFToBook.selectText.1',
|
||||||
|
'addPageNumbers.selectText.3',
|
||||||
|
'adminUserSettings.actions',
|
||||||
|
'alphabet',
|
||||||
|
'compare.document.1',
|
||||||
|
'compare.document.2',
|
||||||
|
'info',
|
||||||
'language.direction',
|
'language.direction',
|
||||||
|
'licenses.license',
|
||||||
|
'licenses.module',
|
||||||
|
'licenses.nav',
|
||||||
|
'licenses.version',
|
||||||
|
'pdfOrganiser.mode',
|
||||||
|
'pipeline.title',
|
||||||
|
'pipelineOptions.pipelineHeader',
|
||||||
|
'sponsor',
|
||||||
|
'watermark.type.2',
|
||||||
]
|
]
|
||||||
|
|
||||||
[hi_IN]
|
[hi_IN]
|
||||||
@@ -70,6 +94,7 @@ ignore = [
|
|||||||
|
|
||||||
[hr_HR]
|
[hr_HR]
|
||||||
ignore = [
|
ignore = [
|
||||||
|
'PDFToBook.selectText.1',
|
||||||
'font',
|
'font',
|
||||||
'home.pipeline.title',
|
'home.pipeline.title',
|
||||||
'info',
|
'info',
|
||||||
@@ -113,16 +138,34 @@ ignore = [
|
|||||||
|
|
||||||
[nl_NL]
|
[nl_NL]
|
||||||
ignore = [
|
ignore = [
|
||||||
|
'HTMLToPDF.print',
|
||||||
|
'adjustContrast.contrast',
|
||||||
|
'compare.document.1',
|
||||||
|
'compare.document.2',
|
||||||
|
'error',
|
||||||
|
'getPdfInfo.downloadJson',
|
||||||
|
'help',
|
||||||
|
'info',
|
||||||
'language.direction',
|
'language.direction',
|
||||||
|
'navbar.allTools',
|
||||||
|
'printFile.submit',
|
||||||
|
'showJS.downloadJS',
|
||||||
|
'sponsor',
|
||||||
]
|
]
|
||||||
|
|
||||||
[no_NB]
|
[no_NB]
|
||||||
ignore = [
|
ignore = [
|
||||||
|
'PDFToBook.selectText.1',
|
||||||
|
'adminUserSettings.admin',
|
||||||
|
'info',
|
||||||
'language.direction',
|
'language.direction',
|
||||||
|
'oops',
|
||||||
|
'sponsor',
|
||||||
]
|
]
|
||||||
|
|
||||||
[pl_PL]
|
[pl_PL]
|
||||||
ignore = [
|
ignore = [
|
||||||
|
'PDFToBook.selectText.1',
|
||||||
'language.direction',
|
'language.direction',
|
||||||
]
|
]
|
||||||
|
|
||||||
@@ -148,12 +191,20 @@ ignore = [
|
|||||||
|
|
||||||
[sk_SK]
|
[sk_SK]
|
||||||
ignore = [
|
ignore = [
|
||||||
|
'adminUserSettings.admin',
|
||||||
|
'home.multiTool.title',
|
||||||
|
'info',
|
||||||
'language.direction',
|
'language.direction',
|
||||||
|
'navbar.sections.security',
|
||||||
|
'text',
|
||||||
|
'watermark.type.1',
|
||||||
]
|
]
|
||||||
|
|
||||||
[sr_LATN_RS]
|
[sr_LATN_RS]
|
||||||
ignore = [
|
ignore = [
|
||||||
'language.direction',
|
'language.direction',
|
||||||
|
'licenses.version',
|
||||||
|
'poweredBy',
|
||||||
]
|
]
|
||||||
|
|
||||||
[sv_SE]
|
[sv_SE]
|
||||||
@@ -22,7 +22,8 @@ public class CleanUrlInterceptor implements HandlerInterceptor {
|
|||||||
"error",
|
"error",
|
||||||
"erroroauth",
|
"erroroauth",
|
||||||
"file",
|
"file",
|
||||||
"messageType");
|
"messageType",
|
||||||
|
"infoMessage");
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean preHandle(
|
public boolean preHandle(
|
||||||
@@ -58,7 +59,8 @@ public class CleanUrlInterceptor implements HandlerInterceptor {
|
|||||||
|
|
||||||
// Redirect to the URL with only allowed query parameters
|
// Redirect to the URL with only allowed query parameters
|
||||||
String redirectUrl = requestURI + "?" + newQueryString;
|
String redirectUrl = requestURI + "?" + newQueryString;
|
||||||
response.sendRedirect(redirectUrl);
|
|
||||||
|
response.sendRedirect(request.getContextPath() + redirectUrl);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,17 +4,26 @@ import java.io.FileNotFoundException;
|
|||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.net.URISyntaxException;
|
import java.net.URISyntaxException;
|
||||||
|
import java.net.URL;
|
||||||
import java.nio.file.Files;
|
import java.nio.file.Files;
|
||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
import java.nio.file.Paths;
|
import java.nio.file.Paths;
|
||||||
|
import java.nio.file.StandardCopyOption;
|
||||||
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.simpleyaml.configuration.comments.CommentType;
|
||||||
|
import org.simpleyaml.configuration.file.YamlFile;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
import org.springframework.context.ApplicationContextInitializer;
|
import org.springframework.context.ApplicationContextInitializer;
|
||||||
import org.springframework.context.ConfigurableApplicationContext;
|
import org.springframework.context.ConfigurableApplicationContext;
|
||||||
|
|
||||||
public class ConfigInitializer
|
public class ConfigInitializer
|
||||||
implements ApplicationContextInitializer<ConfigurableApplicationContext> {
|
implements ApplicationContextInitializer<ConfigurableApplicationContext> {
|
||||||
|
|
||||||
|
private static final Logger logger = LoggerFactory.getLogger(ConfigInitializer.class);
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void initialize(ConfigurableApplicationContext applicationContext) {
|
public void initialize(ConfigurableApplicationContext applicationContext) {
|
||||||
try {
|
try {
|
||||||
@@ -44,95 +53,89 @@ public class ConfigInitializer
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// Path templatePath =
|
|
||||||
// Paths.get(
|
// Define the path to the config settings file
|
||||||
// getClass()
|
Path settingsPath = Paths.get("configs", "settings.yml");
|
||||||
// .getClassLoader()
|
// Load the template resource
|
||||||
// .getResource("settings.yml.template")
|
URL settingsTemplateResource =
|
||||||
// .toURI());
|
getClass().getClassLoader().getResource("settings.yml.template");
|
||||||
// Path userPath = Paths.get("configs", "settings.yml");
|
if (settingsTemplateResource == null) {
|
||||||
//
|
throw new IOException("Resource not found: settings.yml.template");
|
||||||
// List<String> templateLines = Files.readAllLines(templatePath);
|
}
|
||||||
// List<String> userLines =
|
|
||||||
// Files.exists(userPath) ? Files.readAllLines(userPath) : new
|
// Create a temporary file to copy the resource content
|
||||||
// ArrayList<>();
|
Path tempTemplatePath = Files.createTempFile("settings.yml", ".template");
|
||||||
//
|
|
||||||
// List<String> resultLines = new ArrayList<>();
|
try (InputStream in = settingsTemplateResource.openStream()) {
|
||||||
// int position = 0;
|
Files.copy(in, tempTemplatePath, StandardCopyOption.REPLACE_EXISTING);
|
||||||
// for (String templateLine : templateLines) {
|
}
|
||||||
// // Check if the line is a comment
|
|
||||||
// if (templateLine.trim().startsWith("#")) {
|
final YamlFile settingsTemplateFile = new YamlFile(tempTemplatePath.toFile());
|
||||||
// String entry = templateLine.trim().substring(1).trim();
|
settingsTemplateFile.loadWithComments();
|
||||||
// if (!entry.isEmpty()) {
|
|
||||||
// // Check if this comment has been uncommented in userLines
|
final YamlFile settingsFile = new YamlFile(settingsPath.toFile());
|
||||||
// String key = entry.split(":")[0].trim();
|
settingsFile.loadWithComments();
|
||||||
// addLine(resultLines, userLines, templateLine, key, position);
|
|
||||||
// } else {
|
// Load headers and comments
|
||||||
// resultLines.add(templateLine);
|
String header = settingsTemplateFile.getHeader();
|
||||||
// }
|
|
||||||
// }
|
// Create a new file for temporary settings
|
||||||
// // Check if the line is a key-value pair
|
final YamlFile tempSettingFile = new YamlFile(settingsPath.toFile());
|
||||||
// else if (templateLine.contains(":")) {
|
tempSettingFile.createNewFile(true);
|
||||||
// String key = templateLine.split(":")[0].trim();
|
tempSettingFile.setHeader(header);
|
||||||
// addLine(resultLines, userLines, templateLine, key, position);
|
|
||||||
// }
|
// Get all keys from the template
|
||||||
// // Handle empty lines
|
List<String> keys =
|
||||||
// else if (templateLine.trim().length() == 0) {
|
Arrays.asList(settingsTemplateFile.getKeys(true).toArray(new String[0]));
|
||||||
// resultLines.add("");
|
|
||||||
// }
|
for (String key : keys) {
|
||||||
// position++;
|
if (!key.contains(".")) {
|
||||||
// }
|
// Add blank lines and comments to specific sections
|
||||||
//
|
tempSettingFile
|
||||||
// // Write the result to the user settings file
|
.path(key)
|
||||||
// Files.write(userPath, resultLines);
|
.comment(settingsTemplateFile.getComment(key))
|
||||||
|
.blankLine();
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
// Copy settings from the template to the settings.yml file
|
||||||
|
changeConfigItemFromCommentToKeyValue(
|
||||||
|
settingsTemplateFile, settingsFile, tempSettingFile, key);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Save the settings.yml file
|
||||||
|
tempSettingFile.save();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Create custom settings file if it doesn't exist
|
||||||
Path customSettingsPath = Paths.get("configs", "custom_settings.yml");
|
Path customSettingsPath = Paths.get("configs", "custom_settings.yml");
|
||||||
if (!Files.exists(customSettingsPath)) {
|
if (!Files.exists(customSettingsPath)) {
|
||||||
Files.createFile(customSettingsPath);
|
Files.createFile(customSettingsPath);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO check parent value instead of just indent lines for duplicate keys (like enabled etc)
|
private void changeConfigItemFromCommentToKeyValue(
|
||||||
private static void addLine(
|
final YamlFile settingsTemplateFile,
|
||||||
List<String> resultLines,
|
final YamlFile settingsFile,
|
||||||
List<String> userLines,
|
final YamlFile tempSettingFile,
|
||||||
String templateLine,
|
String path) {
|
||||||
String key,
|
if (settingsFile.get(path) == null && settingsTemplateFile.get(path) != null) {
|
||||||
int position) {
|
// If the key is only in the template, add it to the temporary settings with comments
|
||||||
boolean added = false;
|
tempSettingFile
|
||||||
int templateIndentationLevel = getIndentationLevel(templateLine);
|
.path(path)
|
||||||
int pos = 0;
|
.set(settingsTemplateFile.get(path))
|
||||||
for (String settingsLine : userLines) {
|
.comment(settingsTemplateFile.getComment(path, CommentType.BLOCK))
|
||||||
if (settingsLine.trim().startsWith(key + ":") && position == pos) {
|
.commentSide(settingsTemplateFile.getComment(path, CommentType.SIDE));
|
||||||
int settingsIndentationLevel = getIndentationLevel(settingsLine);
|
} else if (settingsFile.get(path) != null && settingsTemplateFile.get(path) != null) {
|
||||||
// Check if it is correct settingsLine and has the same parent as templateLine
|
// If the key is in both, update the temporary settings with the main settings' value
|
||||||
if (settingsIndentationLevel == templateIndentationLevel) {
|
// and comments
|
||||||
resultLines.add(settingsLine);
|
tempSettingFile
|
||||||
added = true;
|
.path(path)
|
||||||
break;
|
.set(settingsFile.get(path))
|
||||||
}
|
.comment(settingsTemplateFile.getComment(path, CommentType.BLOCK))
|
||||||
}
|
.commentSide(settingsTemplateFile.getComment(path, CommentType.SIDE));
|
||||||
pos++;
|
} else {
|
||||||
|
// Log if the key is not found in both YAML files
|
||||||
|
logger.info("Key not found in both YAML files: " + path);
|
||||||
}
|
}
|
||||||
if (!added) {
|
|
||||||
resultLines.add(templateLine);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static int getIndentationLevel(String line) {
|
|
||||||
int indentationLevel = 0;
|
|
||||||
String trimmedLine = line.trim();
|
|
||||||
if (trimmedLine.startsWith("#")) {
|
|
||||||
line = trimmedLine.substring(1);
|
|
||||||
}
|
|
||||||
for (char c : line.toCharArray()) {
|
|
||||||
if (c == ' ') {
|
|
||||||
indentationLevel++;
|
|
||||||
} else {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return indentationLevel;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,16 @@
|
|||||||
|
package stirling.software.SPDF.config;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import stirling.software.SPDF.utils.FileInfo;
|
||||||
|
|
||||||
|
public interface DatabaseBackupInterface {
|
||||||
|
void exportDatabase() throws IOException;
|
||||||
|
|
||||||
|
boolean importDatabase();
|
||||||
|
|
||||||
|
boolean hasBackup();
|
||||||
|
|
||||||
|
List<FileInfo> getBackupList();
|
||||||
|
}
|
||||||
@@ -42,9 +42,11 @@ public class CustomAuthenticationFailureHandler extends SimpleUrlAuthenticationF
|
|||||||
String ip = request.getRemoteAddr();
|
String ip = request.getRemoteAddr();
|
||||||
logger.error("Failed login attempt from IP: {}", ip);
|
logger.error("Failed login attempt from IP: {}", ip);
|
||||||
|
|
||||||
|
String contextPath = request.getContextPath();
|
||||||
|
|
||||||
if (exception.getClass().isAssignableFrom(InternalAuthenticationServiceException.class)
|
if (exception.getClass().isAssignableFrom(InternalAuthenticationServiceException.class)
|
||||||
|| "Password must not be null".equalsIgnoreCase(exception.getMessage())) {
|
|| "Password must not be null".equalsIgnoreCase(exception.getMessage())) {
|
||||||
response.sendRedirect("/login?error=oauth2AuthenticationError");
|
response.sendRedirect(contextPath + "/login?error=oauth2AuthenticationError");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -59,13 +61,13 @@ public class CustomAuthenticationFailureHandler extends SimpleUrlAuthenticationF
|
|||||||
loginAttemptService.loginFailed(username);
|
loginAttemptService.loginFailed(username);
|
||||||
if (loginAttemptService.isBlocked(username)
|
if (loginAttemptService.isBlocked(username)
|
||||||
|| exception.getClass().isAssignableFrom(LockedException.class)) {
|
|| exception.getClass().isAssignableFrom(LockedException.class)) {
|
||||||
response.sendRedirect("/login?error=locked");
|
response.sendRedirect(contextPath + "/login?error=locked");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (exception.getClass().isAssignableFrom(BadCredentialsException.class)
|
if (exception.getClass().isAssignableFrom(BadCredentialsException.class)
|
||||||
|| exception.getClass().isAssignableFrom(UsernameNotFoundException.class)) {
|
|| exception.getClass().isAssignableFrom(UsernameNotFoundException.class)) {
|
||||||
response.sendRedirect("/login?error=badcredentials");
|
response.sendRedirect(contextPath + "/login?error=badcredentials");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -37,7 +37,8 @@ public class CustomAuthenticationSuccessHandler
|
|||||||
: null;
|
: null;
|
||||||
|
|
||||||
if (savedRequest != null
|
if (savedRequest != null
|
||||||
&& !RequestUriUtils.isStaticResource(savedRequest.getRedirectUrl())) {
|
&& !RequestUriUtils.isStaticResource(
|
||||||
|
request.getContextPath(), savedRequest.getRedirectUrl())) {
|
||||||
// Redirect to the original destination
|
// Redirect to the original destination
|
||||||
super.onAuthenticationSuccess(request, response, authentication);
|
super.onAuthenticationSuccess(request, response, authentication);
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -28,8 +28,10 @@ public class FirstLoginFilter extends OncePerRequestFilter {
|
|||||||
throws ServletException, IOException {
|
throws ServletException, IOException {
|
||||||
String method = request.getMethod();
|
String method = request.getMethod();
|
||||||
String requestURI = request.getRequestURI();
|
String requestURI = request.getRequestURI();
|
||||||
|
String contextPath = request.getContextPath();
|
||||||
|
|
||||||
// Check if the request is for static resources
|
// Check if the request is for static resources
|
||||||
boolean isStaticResource = RequestUriUtils.isStaticResource(requestURI);
|
boolean isStaticResource = RequestUriUtils.isStaticResource(contextPath, requestURI);
|
||||||
|
|
||||||
// If it's a static resource, just continue the filter chain and skip the logic below
|
// If it's a static resource, just continue the filter chain and skip the logic below
|
||||||
if (isStaticResource) {
|
if (isStaticResource) {
|
||||||
@@ -43,8 +45,8 @@ public class FirstLoginFilter extends OncePerRequestFilter {
|
|||||||
if ("GET".equalsIgnoreCase(method)
|
if ("GET".equalsIgnoreCase(method)
|
||||||
&& user.isPresent()
|
&& user.isPresent()
|
||||||
&& user.get().isFirstLogin()
|
&& user.get().isFirstLogin()
|
||||||
&& !"/change-creds".equals(requestURI)) {
|
&& !(contextPath + "/change-creds").equals(requestURI)) {
|
||||||
response.sendRedirect("/change-creds");
|
response.sendRedirect(contextPath + "/change-creds");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -33,7 +33,8 @@ public class IPRateLimitingFilter implements Filter {
|
|||||||
String method = httpRequest.getMethod();
|
String method = httpRequest.getMethod();
|
||||||
String requestURI = httpRequest.getRequestURI();
|
String requestURI = httpRequest.getRequestURI();
|
||||||
// Check if the request is for static resources
|
// Check if the request is for static resources
|
||||||
boolean isStaticResource = RequestUriUtils.isStaticResource(requestURI);
|
boolean isStaticResource =
|
||||||
|
RequestUriUtils.isStaticResource(httpRequest.getContextPath(), requestURI);
|
||||||
|
|
||||||
// If it's a static resource, just continue the filter chain and skip the logic below
|
// If it's a static resource, just continue the filter chain and skip the logic below
|
||||||
if (isStaticResource) {
|
if (isStaticResource) {
|
||||||
|
|||||||
@@ -1,34 +1,38 @@
|
|||||||
package stirling.software.SPDF.config.security;
|
package stirling.software.SPDF.config.security;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.nio.file.Files;
|
|
||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
import java.nio.file.Paths;
|
import java.nio.file.Paths;
|
||||||
import java.util.List;
|
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
import org.slf4j.Logger;
|
import org.simpleyaml.configuration.file.YamlFile;
|
||||||
import org.slf4j.LoggerFactory;
|
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
import jakarta.annotation.PostConstruct;
|
import jakarta.annotation.PostConstruct;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import stirling.software.SPDF.config.DatabaseBackupInterface;
|
||||||
import stirling.software.SPDF.model.ApplicationProperties;
|
import stirling.software.SPDF.model.ApplicationProperties;
|
||||||
import stirling.software.SPDF.model.Role;
|
import stirling.software.SPDF.model.Role;
|
||||||
|
|
||||||
@Component
|
@Component
|
||||||
|
@Slf4j
|
||||||
public class InitialSecuritySetup {
|
public class InitialSecuritySetup {
|
||||||
|
|
||||||
@Autowired private UserService userService;
|
@Autowired private UserService userService;
|
||||||
|
|
||||||
@Autowired private ApplicationProperties applicationProperties;
|
@Autowired private ApplicationProperties applicationProperties;
|
||||||
|
|
||||||
private static final Logger logger = LoggerFactory.getLogger(InitialSecuritySetup.class);
|
@Autowired private DatabaseBackupInterface databaseBackupHelper;
|
||||||
|
|
||||||
@PostConstruct
|
@PostConstruct
|
||||||
public void init() {
|
public void init() throws IllegalArgumentException, IOException {
|
||||||
if (!userService.hasUsers()) {
|
if (databaseBackupHelper.hasBackup() && !userService.hasUsers()) {
|
||||||
|
databaseBackupHelper.importDatabase();
|
||||||
|
} else if (!userService.hasUsers()) {
|
||||||
initializeAdminUser();
|
initializeAdminUser();
|
||||||
|
} else {
|
||||||
|
databaseBackupHelper.exportDatabase();
|
||||||
}
|
}
|
||||||
initializeInternalApiUser();
|
initializeInternalApiUser();
|
||||||
}
|
}
|
||||||
@@ -42,12 +46,11 @@ public class InitialSecuritySetup {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void initializeAdminUser() {
|
private void initializeAdminUser() throws IOException {
|
||||||
String initialUsername =
|
String initialUsername =
|
||||||
applicationProperties.getSecurity().getInitialLogin().getUsername();
|
applicationProperties.getSecurity().getInitialLogin().getUsername();
|
||||||
String initialPassword =
|
String initialPassword =
|
||||||
applicationProperties.getSecurity().getInitialLogin().getPassword();
|
applicationProperties.getSecurity().getInitialLogin().getPassword();
|
||||||
|
|
||||||
if (initialUsername != null
|
if (initialUsername != null
|
||||||
&& !initialUsername.isEmpty()
|
&& !initialUsername.isEmpty()
|
||||||
&& initialPassword != null
|
&& initialPassword != null
|
||||||
@@ -55,9 +58,9 @@ public class InitialSecuritySetup {
|
|||||||
&& !userService.findByUsernameIgnoreCase(initialUsername).isPresent()) {
|
&& !userService.findByUsernameIgnoreCase(initialUsername).isPresent()) {
|
||||||
try {
|
try {
|
||||||
userService.saveUser(initialUsername, initialPassword, Role.ADMIN.getRoleId());
|
userService.saveUser(initialUsername, initialPassword, Role.ADMIN.getRoleId());
|
||||||
logger.info("Admin user created: " + initialUsername);
|
log.info("Admin user created: " + initialUsername);
|
||||||
} catch (IllegalArgumentException e) {
|
} catch (IllegalArgumentException e) {
|
||||||
logger.error("Failed to initialize security setup", e);
|
log.error("Failed to initialize security setup", e);
|
||||||
System.exit(1);
|
System.exit(1);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@@ -65,54 +68,38 @@ public class InitialSecuritySetup {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void createDefaultAdminUser() {
|
private void createDefaultAdminUser() throws IllegalArgumentException, IOException {
|
||||||
String defaultUsername = "admin";
|
String defaultUsername = "admin";
|
||||||
String defaultPassword = "stirling";
|
String defaultPassword = "stirling";
|
||||||
if (!userService.findByUsernameIgnoreCase(defaultUsername).isPresent()) {
|
if (!userService.findByUsernameIgnoreCase(defaultUsername).isPresent()) {
|
||||||
userService.saveUser(defaultUsername, defaultPassword, Role.ADMIN.getRoleId(), true);
|
userService.saveUser(defaultUsername, defaultPassword, Role.ADMIN.getRoleId(), true);
|
||||||
logger.info("Default admin user created: " + defaultUsername);
|
log.info("Default admin user created: " + defaultUsername);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void initializeInternalApiUser() {
|
private void initializeInternalApiUser() throws IllegalArgumentException, IOException {
|
||||||
if (!userService.usernameExistsIgnoreCase(Role.INTERNAL_API_USER.getRoleId())) {
|
if (!userService.usernameExistsIgnoreCase(Role.INTERNAL_API_USER.getRoleId())) {
|
||||||
userService.saveUser(
|
userService.saveUser(
|
||||||
Role.INTERNAL_API_USER.getRoleId(),
|
Role.INTERNAL_API_USER.getRoleId(),
|
||||||
UUID.randomUUID().toString(),
|
UUID.randomUUID().toString(),
|
||||||
Role.INTERNAL_API_USER.getRoleId());
|
Role.INTERNAL_API_USER.getRoleId());
|
||||||
userService.addApiKeyToUser(Role.INTERNAL_API_USER.getRoleId());
|
userService.addApiKeyToUser(Role.INTERNAL_API_USER.getRoleId());
|
||||||
logger.info("Internal API user created: " + Role.INTERNAL_API_USER.getRoleId());
|
log.info("Internal API user created: " + Role.INTERNAL_API_USER.getRoleId());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void saveKeyToConfig(String key) throws IOException {
|
private void saveKeyToConfig(String key) throws IOException {
|
||||||
Path path = Paths.get("configs", "settings.yml"); // Target the configs/settings.yml
|
Path path = Paths.get("configs", "settings.yml"); // Target the configs/settings.yml
|
||||||
List<String> lines = Files.readAllLines(path);
|
|
||||||
boolean keyFound = false;
|
|
||||||
|
|
||||||
// Search for the existing key to replace it or place to add it
|
final YamlFile settingsYml = new YamlFile(path.toFile());
|
||||||
for (int i = 0; i < lines.size(); i++) {
|
|
||||||
if (lines.get(i).startsWith("AutomaticallyGenerated:")) {
|
|
||||||
keyFound = true;
|
|
||||||
if (i + 1 < lines.size() && lines.get(i + 1).trim().startsWith("key:")) {
|
|
||||||
lines.set(i + 1, " key: " + key);
|
|
||||||
break;
|
|
||||||
} else {
|
|
||||||
lines.add(i + 1, " key: " + key);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// If the section doesn't exist, append it
|
settingsYml.loadWithComments();
|
||||||
if (!keyFound) {
|
|
||||||
lines.add("# Automatically Generated Settings (Do Not Edit Directly)");
|
|
||||||
lines.add("AutomaticallyGenerated:");
|
|
||||||
lines.add(" key: " + key);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Write back to the file
|
settingsYml
|
||||||
Files.write(path, lines);
|
.path("AutomaticallyGenerated.key")
|
||||||
|
.set(key)
|
||||||
|
.comment("# Automatically Generated Settings (Do Not Edit Directly)");
|
||||||
|
settingsYml.save();
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean isValidUUID(String uuid) {
|
private boolean isValidUUID(String uuid) {
|
||||||
|
|||||||
@@ -38,12 +38,12 @@ import stirling.software.SPDF.config.security.oauth2.CustomOAuth2AuthenticationS
|
|||||||
import stirling.software.SPDF.config.security.oauth2.CustomOAuth2LogoutSuccessHandler;
|
import stirling.software.SPDF.config.security.oauth2.CustomOAuth2LogoutSuccessHandler;
|
||||||
import stirling.software.SPDF.config.security.oauth2.CustomOAuth2UserService;
|
import stirling.software.SPDF.config.security.oauth2.CustomOAuth2UserService;
|
||||||
import stirling.software.SPDF.model.ApplicationProperties;
|
import stirling.software.SPDF.model.ApplicationProperties;
|
||||||
import stirling.software.SPDF.model.ApplicationProperties.GithubProvider;
|
|
||||||
import stirling.software.SPDF.model.ApplicationProperties.GoogleProvider;
|
|
||||||
import stirling.software.SPDF.model.ApplicationProperties.KeycloakProvider;
|
|
||||||
import stirling.software.SPDF.model.ApplicationProperties.Security.OAUTH2;
|
import stirling.software.SPDF.model.ApplicationProperties.Security.OAUTH2;
|
||||||
import stirling.software.SPDF.model.ApplicationProperties.Security.OAUTH2.Client;
|
import stirling.software.SPDF.model.ApplicationProperties.Security.OAUTH2.Client;
|
||||||
import stirling.software.SPDF.model.User;
|
import stirling.software.SPDF.model.User;
|
||||||
|
import stirling.software.SPDF.model.provider.GithubProvider;
|
||||||
|
import stirling.software.SPDF.model.provider.GoogleProvider;
|
||||||
|
import stirling.software.SPDF.model.provider.KeycloakProvider;
|
||||||
import stirling.software.SPDF.repository.JPATokenRepositoryImpl;
|
import stirling.software.SPDF.repository.JPATokenRepositoryImpl;
|
||||||
|
|
||||||
@Configuration
|
@Configuration
|
||||||
|
|||||||
@@ -104,6 +104,7 @@ public class UserAuthenticationFilter extends OncePerRequestFilter {
|
|||||||
contextPath + "/fonts/",
|
contextPath + "/fonts/",
|
||||||
contextPath + "/js/",
|
contextPath + "/js/",
|
||||||
contextPath + "/pdfjs/",
|
contextPath + "/pdfjs/",
|
||||||
|
contextPath + "/pdfjs-legacy/",
|
||||||
contextPath + "/api/v1/info/status",
|
contextPath + "/api/v1/info/status",
|
||||||
contextPath + "/site.webmanifest"
|
contextPath + "/site.webmanifest"
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -19,7 +19,6 @@ import org.springframework.web.filter.OncePerRequestFilter;
|
|||||||
import io.github.bucket4j.Bandwidth;
|
import io.github.bucket4j.Bandwidth;
|
||||||
import io.github.bucket4j.Bucket;
|
import io.github.bucket4j.Bucket;
|
||||||
import io.github.bucket4j.ConsumptionProbe;
|
import io.github.bucket4j.ConsumptionProbe;
|
||||||
import io.github.bucket4j.Refill;
|
|
||||||
import io.github.pixee.security.Newlines;
|
import io.github.pixee.security.Newlines;
|
||||||
|
|
||||||
import jakarta.servlet.FilterChain;
|
import jakarta.servlet.FilterChain;
|
||||||
@@ -142,7 +141,10 @@ public class UserBasedRateLimitingFilter extends OncePerRequestFilter {
|
|||||||
|
|
||||||
private Bucket createUserBucket(int limitPerDay) {
|
private Bucket createUserBucket(int limitPerDay) {
|
||||||
Bandwidth limit =
|
Bandwidth limit =
|
||||||
Bandwidth.classic(limitPerDay, Refill.intervally(limitPerDay, Duration.ofDays(1)));
|
Bandwidth.builder()
|
||||||
|
.capacity(limitPerDay)
|
||||||
|
.refillIntervally(limitPerDay, Duration.ofDays(1))
|
||||||
|
.build();
|
||||||
return Bucket.builder().addLimit(limit).build();
|
return Bucket.builder().addLimit(limit).build();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
package stirling.software.SPDF.config.security;
|
package stirling.software.SPDF.config.security;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
@@ -19,6 +20,7 @@ import org.springframework.security.core.userdetails.UsernameNotFoundException;
|
|||||||
import org.springframework.security.crypto.password.PasswordEncoder;
|
import org.springframework.security.crypto.password.PasswordEncoder;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
import stirling.software.SPDF.config.DatabaseBackupInterface;
|
||||||
import stirling.software.SPDF.controller.api.pipeline.UserServiceInterface;
|
import stirling.software.SPDF.controller.api.pipeline.UserServiceInterface;
|
||||||
import stirling.software.SPDF.model.AuthenticationType;
|
import stirling.software.SPDF.model.AuthenticationType;
|
||||||
import stirling.software.SPDF.model.Authority;
|
import stirling.software.SPDF.model.Authority;
|
||||||
@@ -38,8 +40,11 @@ public class UserService implements UserServiceInterface {
|
|||||||
|
|
||||||
@Autowired private MessageSource messageSource;
|
@Autowired private MessageSource messageSource;
|
||||||
|
|
||||||
|
@Autowired DatabaseBackupInterface databaseBackupHelper;
|
||||||
|
|
||||||
// Handle OAUTH2 login and user auto creation.
|
// Handle OAUTH2 login and user auto creation.
|
||||||
public boolean processOAuth2PostLogin(String username, boolean autoCreateUser) {
|
public boolean processOAuth2PostLogin(String username, boolean autoCreateUser)
|
||||||
|
throws IllegalArgumentException, IOException {
|
||||||
if (!isUsernameValid(username)) {
|
if (!isUsernameValid(username)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -131,7 +136,7 @@ public class UserService implements UserServiceInterface {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void saveUser(String username, AuthenticationType authenticationType)
|
public void saveUser(String username, AuthenticationType authenticationType)
|
||||||
throws IllegalArgumentException {
|
throws IllegalArgumentException, IOException {
|
||||||
if (!isUsernameValid(username)) {
|
if (!isUsernameValid(username)) {
|
||||||
throw new IllegalArgumentException(getInvalidUsernameMessage());
|
throw new IllegalArgumentException(getInvalidUsernameMessage());
|
||||||
}
|
}
|
||||||
@@ -142,9 +147,11 @@ public class UserService implements UserServiceInterface {
|
|||||||
user.addAuthority(new Authority(Role.USER.getRoleId(), user));
|
user.addAuthority(new Authority(Role.USER.getRoleId(), user));
|
||||||
user.setAuthenticationType(authenticationType);
|
user.setAuthenticationType(authenticationType);
|
||||||
userRepository.save(user);
|
userRepository.save(user);
|
||||||
|
databaseBackupHelper.exportDatabase();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void saveUser(String username, String password) throws IllegalArgumentException {
|
public void saveUser(String username, String password)
|
||||||
|
throws IllegalArgumentException, IOException {
|
||||||
if (!isUsernameValid(username)) {
|
if (!isUsernameValid(username)) {
|
||||||
throw new IllegalArgumentException(getInvalidUsernameMessage());
|
throw new IllegalArgumentException(getInvalidUsernameMessage());
|
||||||
}
|
}
|
||||||
@@ -154,10 +161,11 @@ public class UserService implements UserServiceInterface {
|
|||||||
user.setEnabled(true);
|
user.setEnabled(true);
|
||||||
user.setAuthenticationType(AuthenticationType.WEB);
|
user.setAuthenticationType(AuthenticationType.WEB);
|
||||||
userRepository.save(user);
|
userRepository.save(user);
|
||||||
|
databaseBackupHelper.exportDatabase();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void saveUser(String username, String password, String role, boolean firstLogin)
|
public void saveUser(String username, String password, String role, boolean firstLogin)
|
||||||
throws IllegalArgumentException {
|
throws IllegalArgumentException, IOException {
|
||||||
if (!isUsernameValid(username)) {
|
if (!isUsernameValid(username)) {
|
||||||
throw new IllegalArgumentException(getInvalidUsernameMessage());
|
throw new IllegalArgumentException(getInvalidUsernameMessage());
|
||||||
}
|
}
|
||||||
@@ -169,10 +177,11 @@ public class UserService implements UserServiceInterface {
|
|||||||
user.setAuthenticationType(AuthenticationType.WEB);
|
user.setAuthenticationType(AuthenticationType.WEB);
|
||||||
user.setFirstLogin(firstLogin);
|
user.setFirstLogin(firstLogin);
|
||||||
userRepository.save(user);
|
userRepository.save(user);
|
||||||
|
databaseBackupHelper.exportDatabase();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void saveUser(String username, String password, String role)
|
public void saveUser(String username, String password, String role)
|
||||||
throws IllegalArgumentException {
|
throws IllegalArgumentException, IOException {
|
||||||
saveUser(username, password, role, false);
|
saveUser(username, password, role, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -206,7 +215,8 @@ public class UserService implements UserServiceInterface {
|
|||||||
return userCount > 0;
|
return userCount > 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void updateUserSettings(String username, Map<String, String> updates) {
|
public void updateUserSettings(String username, Map<String, String> updates)
|
||||||
|
throws IOException {
|
||||||
Optional<User> userOpt = userRepository.findByUsernameIgnoreCase(username);
|
Optional<User> userOpt = userRepository.findByUsernameIgnoreCase(username);
|
||||||
if (userOpt.isPresent()) {
|
if (userOpt.isPresent()) {
|
||||||
User user = userOpt.get();
|
User user = userOpt.get();
|
||||||
@@ -220,6 +230,7 @@ public class UserService implements UserServiceInterface {
|
|||||||
user.setSettings(settingsMap);
|
user.setSettings(settingsMap);
|
||||||
|
|
||||||
userRepository.save(user);
|
userRepository.save(user);
|
||||||
|
databaseBackupHelper.exportDatabase();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -235,22 +246,26 @@ public class UserService implements UserServiceInterface {
|
|||||||
return authorityRepository.findByUserId(user.getId());
|
return authorityRepository.findByUserId(user.getId());
|
||||||
}
|
}
|
||||||
|
|
||||||
public void changeUsername(User user, String newUsername) throws IllegalArgumentException {
|
public void changeUsername(User user, String newUsername)
|
||||||
|
throws IllegalArgumentException, IOException {
|
||||||
if (!isUsernameValid(newUsername)) {
|
if (!isUsernameValid(newUsername)) {
|
||||||
throw new IllegalArgumentException(getInvalidUsernameMessage());
|
throw new IllegalArgumentException(getInvalidUsernameMessage());
|
||||||
}
|
}
|
||||||
user.setUsername(newUsername);
|
user.setUsername(newUsername);
|
||||||
userRepository.save(user);
|
userRepository.save(user);
|
||||||
|
databaseBackupHelper.exportDatabase();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void changePassword(User user, String newPassword) {
|
public void changePassword(User user, String newPassword) throws IOException {
|
||||||
user.setPassword(passwordEncoder.encode(newPassword));
|
user.setPassword(passwordEncoder.encode(newPassword));
|
||||||
userRepository.save(user);
|
userRepository.save(user);
|
||||||
|
databaseBackupHelper.exportDatabase();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void changeFirstUse(User user, boolean firstUse) {
|
public void changeFirstUse(User user, boolean firstUse) throws IOException {
|
||||||
user.setFirstLogin(firstUse);
|
user.setFirstLogin(firstUse);
|
||||||
userRepository.save(user);
|
userRepository.save(user);
|
||||||
|
databaseBackupHelper.exportDatabase();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void changeRole(User user, String newRole) {
|
public void changeRole(User user, String newRole) {
|
||||||
|
|||||||
@@ -0,0 +1,202 @@
|
|||||||
|
package stirling.software.SPDF.config.security.database;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.nio.file.DirectoryStream;
|
||||||
|
import java.nio.file.Files;
|
||||||
|
import java.nio.file.Path;
|
||||||
|
import java.nio.file.Paths;
|
||||||
|
import java.nio.file.attribute.BasicFileAttributes;
|
||||||
|
import java.sql.Connection;
|
||||||
|
import java.sql.DriverManager;
|
||||||
|
import java.sql.ResultSet;
|
||||||
|
import java.sql.SQLException;
|
||||||
|
import java.sql.Statement;
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
import java.time.ZoneId;
|
||||||
|
import java.time.format.DateTimeFormatter;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Comparator;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
import org.springframework.beans.factory.annotation.Value;
|
||||||
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import stirling.software.SPDF.config.DatabaseBackupInterface;
|
||||||
|
import stirling.software.SPDF.utils.FileInfo;
|
||||||
|
|
||||||
|
@Slf4j
|
||||||
|
@Configuration
|
||||||
|
public class DatabaseBackupHelper implements DatabaseBackupInterface {
|
||||||
|
|
||||||
|
@Value("${spring.datasource.url}")
|
||||||
|
private String url;
|
||||||
|
|
||||||
|
private Path backupPath = Paths.get("configs/db/backup/");
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean hasBackup() {
|
||||||
|
// Check if there is at least one backup
|
||||||
|
return !getBackupList().isEmpty();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<FileInfo> getBackupList() {
|
||||||
|
// Check if the backup directory exists, and create it if it does not
|
||||||
|
ensureBackupDirectoryExists();
|
||||||
|
|
||||||
|
List<FileInfo> backupFiles = new ArrayList<>();
|
||||||
|
|
||||||
|
// Read the backup directory and filter for files with the prefix "backup_" and suffix
|
||||||
|
// ".sql"
|
||||||
|
try (DirectoryStream<Path> stream =
|
||||||
|
Files.newDirectoryStream(
|
||||||
|
backupPath,
|
||||||
|
path ->
|
||||||
|
path.getFileName().toString().startsWith("backup_")
|
||||||
|
&& path.getFileName().toString().endsWith(".sql"))) {
|
||||||
|
for (Path entry : stream) {
|
||||||
|
BasicFileAttributes attrs = Files.readAttributes(entry, BasicFileAttributes.class);
|
||||||
|
LocalDateTime modificationDate =
|
||||||
|
LocalDateTime.ofInstant(
|
||||||
|
attrs.lastModifiedTime().toInstant(), ZoneId.systemDefault());
|
||||||
|
LocalDateTime creationDate =
|
||||||
|
LocalDateTime.ofInstant(
|
||||||
|
attrs.creationTime().toInstant(), ZoneId.systemDefault());
|
||||||
|
long fileSize = attrs.size();
|
||||||
|
backupFiles.add(
|
||||||
|
new FileInfo(
|
||||||
|
entry.getFileName().toString(),
|
||||||
|
entry.toString(),
|
||||||
|
modificationDate,
|
||||||
|
fileSize,
|
||||||
|
creationDate));
|
||||||
|
}
|
||||||
|
} catch (IOException e) {
|
||||||
|
log.error("Error reading backup directory: {}", e.getMessage(), e);
|
||||||
|
}
|
||||||
|
return backupFiles;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Imports a database backup from the specified file.
|
||||||
|
public boolean importDatabaseFromUI(String fileName) throws IOException {
|
||||||
|
return this.importDatabaseFromUI(getBackupFilePath(fileName));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Imports a database backup from the specified path.
|
||||||
|
public boolean importDatabaseFromUI(Path tempTemplatePath) throws IOException {
|
||||||
|
boolean success = executeDatabaseScript(tempTemplatePath);
|
||||||
|
if (success) {
|
||||||
|
LocalDateTime dateNow = LocalDateTime.now();
|
||||||
|
DateTimeFormatter myFormatObj = DateTimeFormatter.ofPattern("yyyyMMddHHmm");
|
||||||
|
Path insertOutputFilePath =
|
||||||
|
this.getBackupFilePath("backup_user_" + dateNow.format(myFormatObj) + ".sql");
|
||||||
|
Files.copy(tempTemplatePath, insertOutputFilePath);
|
||||||
|
Files.deleteIfExists(tempTemplatePath);
|
||||||
|
}
|
||||||
|
return success;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean importDatabase() {
|
||||||
|
if (!this.hasBackup()) return false;
|
||||||
|
|
||||||
|
List<FileInfo> backupList = this.getBackupList();
|
||||||
|
backupList.sort(Comparator.comparing(FileInfo::getModificationDate).reversed());
|
||||||
|
|
||||||
|
return executeDatabaseScript(Paths.get(backupList.get(0).getFilePath()));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void exportDatabase() throws IOException {
|
||||||
|
// Check if the backup directory exists, and create it if it does not
|
||||||
|
ensureBackupDirectoryExists();
|
||||||
|
|
||||||
|
// Filter and delete old backups if there are more than 5
|
||||||
|
List<FileInfo> filteredBackupList =
|
||||||
|
this.getBackupList().stream()
|
||||||
|
.filter(backup -> !backup.getFileName().startsWith("backup_user_"))
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
|
||||||
|
if (filteredBackupList.size() > 5) {
|
||||||
|
filteredBackupList.sort(
|
||||||
|
Comparator.comparing(
|
||||||
|
p -> p.getFileName().substring(7, p.getFileName().length() - 4)));
|
||||||
|
Files.deleteIfExists(Paths.get(filteredBackupList.get(0).getFilePath()));
|
||||||
|
log.info("Deleted oldest backup: {}", filteredBackupList.get(0).getFileName());
|
||||||
|
}
|
||||||
|
|
||||||
|
LocalDateTime dateNow = LocalDateTime.now();
|
||||||
|
DateTimeFormatter myFormatObj = DateTimeFormatter.ofPattern("yyyyMMddHHmm");
|
||||||
|
Path insertOutputFilePath =
|
||||||
|
this.getBackupFilePath("backup_" + dateNow.format(myFormatObj) + ".sql");
|
||||||
|
String query = "SCRIPT SIMPLE COLUMNS DROP to '" + insertOutputFilePath.toString() + "';";
|
||||||
|
|
||||||
|
try (Connection conn = DriverManager.getConnection(url, "sa", "");
|
||||||
|
Statement stmt = conn.createStatement()) {
|
||||||
|
stmt.execute(query);
|
||||||
|
log.info("Database export completed: {}", insertOutputFilePath);
|
||||||
|
} catch (SQLException e) {
|
||||||
|
log.error("Error during database export: {}", e.getMessage(), e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Retrieves the H2 database version.
|
||||||
|
public String getH2Version() {
|
||||||
|
String version = "Unknown";
|
||||||
|
try (Connection conn = DriverManager.getConnection(url, "sa", "")) {
|
||||||
|
try (Statement stmt = conn.createStatement();
|
||||||
|
ResultSet rs = stmt.executeQuery("SELECT H2VERSION() AS version")) {
|
||||||
|
if (rs.next()) {
|
||||||
|
version = rs.getString("version");
|
||||||
|
log.info("H2 Database Version: {}", version);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (SQLException e) {
|
||||||
|
log.error("Error retrieving H2 version: {}", e.getMessage(), e);
|
||||||
|
}
|
||||||
|
return version;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Deletes a backup file.
|
||||||
|
public boolean deleteBackupFile(String fileName) throws IOException {
|
||||||
|
Path filePath = this.getBackupFilePath(fileName);
|
||||||
|
if (Files.deleteIfExists(filePath)) {
|
||||||
|
log.info("Deleted backup file: {}", fileName);
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
log.error("File not found or could not be deleted: {}", fileName);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Gets the Path object for a given backup file name.
|
||||||
|
public Path getBackupFilePath(String fileName) {
|
||||||
|
return Paths.get(backupPath.toString(), fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean executeDatabaseScript(Path scriptPath) {
|
||||||
|
try (Connection conn = DriverManager.getConnection(url, "sa", "");
|
||||||
|
Statement stmt = conn.createStatement()) {
|
||||||
|
|
||||||
|
String query = "RUNSCRIPT from '" + scriptPath.toString() + "';";
|
||||||
|
stmt.execute(query);
|
||||||
|
log.info("Database import completed: {}", scriptPath);
|
||||||
|
return true;
|
||||||
|
} catch (SQLException e) {
|
||||||
|
log.error("Error during database import: {}", e.getMessage(), e);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ensureBackupDirectoryExists() {
|
||||||
|
if (Files.notExists(backupPath)) {
|
||||||
|
try {
|
||||||
|
Files.createDirectories(backupPath);
|
||||||
|
} catch (IOException e) {
|
||||||
|
log.error("Error creating directories: {}", e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
package stirling.software.SPDF.config.security.database;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.scheduling.annotation.Scheduled;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
@Component
|
||||||
|
public class ScheduledTasks {
|
||||||
|
|
||||||
|
@Autowired private DatabaseBackupHelper databaseBackupService;
|
||||||
|
|
||||||
|
@Scheduled(cron = "0 0 0 * * ?")
|
||||||
|
public void performBackup() throws IOException {
|
||||||
|
databaseBackupService.exportDatabase();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -48,13 +48,14 @@ public class CustomOAuth2AuthenticationSuccessHandler
|
|||||||
|
|
||||||
// Get the saved request
|
// Get the saved request
|
||||||
HttpSession session = request.getSession(false);
|
HttpSession session = request.getSession(false);
|
||||||
|
String contextPath = request.getContextPath();
|
||||||
SavedRequest savedRequest =
|
SavedRequest savedRequest =
|
||||||
(session != null)
|
(session != null)
|
||||||
? (SavedRequest) session.getAttribute("SPRING_SECURITY_SAVED_REQUEST")
|
? (SavedRequest) session.getAttribute("SPRING_SECURITY_SAVED_REQUEST")
|
||||||
: null;
|
: null;
|
||||||
|
|
||||||
if (savedRequest != null
|
if (savedRequest != null
|
||||||
&& !RequestUriUtils.isStaticResource(savedRequest.getRedirectUrl())) {
|
&& !RequestUriUtils.isStaticResource(contextPath, savedRequest.getRedirectUrl())) {
|
||||||
// Redirect to the original destination
|
// Redirect to the original destination
|
||||||
super.onAuthenticationSuccess(request, response, authentication);
|
super.onAuthenticationSuccess(request, response, authentication);
|
||||||
} else {
|
} else {
|
||||||
@@ -75,16 +76,15 @@ public class CustomOAuth2AuthenticationSuccessHandler
|
|||||||
&& !userService.isAuthenticationTypeByUsername(
|
&& !userService.isAuthenticationTypeByUsername(
|
||||||
username, AuthenticationType.OAUTH2)
|
username, AuthenticationType.OAUTH2)
|
||||||
&& oAuth.getAutoCreateUser()) {
|
&& oAuth.getAutoCreateUser()) {
|
||||||
response.sendRedirect(
|
response.sendRedirect(contextPath + "/logout?oauth2AuthenticationErrorWeb=true");
|
||||||
request.getContextPath() + "/logout?oauth2AuthenticationErrorWeb=true");
|
|
||||||
return;
|
return;
|
||||||
} else {
|
} else {
|
||||||
try {
|
try {
|
||||||
userService.processOAuth2PostLogin(username, oAuth.getAutoCreateUser());
|
userService.processOAuth2PostLogin(username, oAuth.getAutoCreateUser());
|
||||||
response.sendRedirect("/");
|
response.sendRedirect(contextPath + "/");
|
||||||
return;
|
return;
|
||||||
} catch (IllegalArgumentException e) {
|
} catch (IllegalArgumentException e) {
|
||||||
response.sendRedirect("/logout?invalidUsername=true");
|
response.sendRedirect(contextPath + "/logout?invalidUsername=true");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,6 +16,7 @@ import jakarta.servlet.http.HttpSession;
|
|||||||
import stirling.software.SPDF.model.ApplicationProperties;
|
import stirling.software.SPDF.model.ApplicationProperties;
|
||||||
import stirling.software.SPDF.model.ApplicationProperties.Security.OAUTH2;
|
import stirling.software.SPDF.model.ApplicationProperties.Security.OAUTH2;
|
||||||
import stirling.software.SPDF.model.Provider;
|
import stirling.software.SPDF.model.Provider;
|
||||||
|
import stirling.software.SPDF.model.provider.UnsupportedProviderException;
|
||||||
import stirling.software.SPDF.utils.UrlUtils;
|
import stirling.software.SPDF.utils.UrlUtils;
|
||||||
|
|
||||||
public class CustomOAuth2LogoutSuccessHandler extends SimpleUrlLogoutSuccessHandler {
|
public class CustomOAuth2LogoutSuccessHandler extends SimpleUrlLogoutSuccessHandler {
|
||||||
@@ -51,8 +52,8 @@ public class CustomOAuth2LogoutSuccessHandler extends SimpleUrlLogoutSuccessHand
|
|||||||
Provider provider = oauth.getClient().get(registrationId);
|
Provider provider = oauth.getClient().get(registrationId);
|
||||||
issuer = provider.getIssuer();
|
issuer = provider.getIssuer();
|
||||||
clientId = provider.getClientId();
|
clientId = provider.getClientId();
|
||||||
} catch (Exception e) {
|
} catch (UnsupportedProviderException e) {
|
||||||
logger.error("exception", e);
|
logger.error(e.getMessage());
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -0,0 +1,144 @@
|
|||||||
|
package stirling.software.SPDF.controller.api;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.net.URI;
|
||||||
|
import java.nio.file.Files;
|
||||||
|
import java.nio.file.Path;
|
||||||
|
import java.nio.file.StandardCopyOption;
|
||||||
|
|
||||||
|
import org.eclipse.jetty.http.HttpStatus;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.core.io.InputStreamResource;
|
||||||
|
import org.springframework.http.HttpHeaders;
|
||||||
|
import org.springframework.http.MediaType;
|
||||||
|
import org.springframework.http.ResponseEntity;
|
||||||
|
import org.springframework.security.access.prepost.PreAuthorize;
|
||||||
|
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.PostMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RequestParam;
|
||||||
|
import org.springframework.web.multipart.MultipartFile;
|
||||||
|
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
|
||||||
|
|
||||||
|
import io.swagger.v3.oas.annotations.Hidden;
|
||||||
|
import io.swagger.v3.oas.annotations.Operation;
|
||||||
|
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||||
|
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import stirling.software.SPDF.config.security.database.DatabaseBackupHelper;
|
||||||
|
|
||||||
|
@Slf4j
|
||||||
|
@Controller
|
||||||
|
@RequestMapping("/api/v1/database")
|
||||||
|
@PreAuthorize("hasRole('ROLE_ADMIN')")
|
||||||
|
@Tag(name = "Database", description = "Database APIs")
|
||||||
|
public class DatabaseController {
|
||||||
|
|
||||||
|
@Autowired DatabaseBackupHelper databaseBackupHelper;
|
||||||
|
|
||||||
|
@Hidden
|
||||||
|
@PostMapping(consumes = "multipart/form-data", value = "import-database")
|
||||||
|
@Operation(
|
||||||
|
summary = "Import database backup",
|
||||||
|
description = "This endpoint imports a database backup from a SQL file.")
|
||||||
|
public String importDatabase(
|
||||||
|
@RequestParam("fileInput") MultipartFile file, RedirectAttributes redirectAttributes)
|
||||||
|
throws IllegalArgumentException, IOException {
|
||||||
|
if (file == null || file.isEmpty()) {
|
||||||
|
redirectAttributes.addAttribute("error", "fileNullOrEmpty");
|
||||||
|
return "redirect:/database";
|
||||||
|
}
|
||||||
|
log.info("Received file: {}", file.getOriginalFilename());
|
||||||
|
Path tempTemplatePath = Files.createTempFile("backup_", ".sql");
|
||||||
|
try (InputStream in = file.getInputStream()) {
|
||||||
|
Files.copy(in, tempTemplatePath, StandardCopyOption.REPLACE_EXISTING);
|
||||||
|
boolean importSuccess = databaseBackupHelper.importDatabaseFromUI(tempTemplatePath);
|
||||||
|
if (importSuccess) {
|
||||||
|
redirectAttributes.addAttribute("infoMessage", "importIntoDatabaseSuccessed");
|
||||||
|
} else {
|
||||||
|
redirectAttributes.addAttribute("error", "failedImportFile");
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error("Error importing database: {}", e.getMessage());
|
||||||
|
redirectAttributes.addAttribute("error", "failedImportFile");
|
||||||
|
}
|
||||||
|
return "redirect:/database";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Hidden
|
||||||
|
@GetMapping("/import-database-file/{fileName}")
|
||||||
|
public String importDatabaseFromBackupUI(@PathVariable String fileName)
|
||||||
|
throws IllegalArgumentException, IOException {
|
||||||
|
if (fileName == null || fileName.isEmpty()) {
|
||||||
|
return "redirect:/database?error=fileNullOrEmpty";
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if the file exists in the backup list
|
||||||
|
boolean fileExists =
|
||||||
|
databaseBackupHelper.getBackupList().stream()
|
||||||
|
.anyMatch(backup -> backup.getFileName().equals(fileName));
|
||||||
|
if (!fileExists) {
|
||||||
|
log.error("File {} not found in backup list", fileName);
|
||||||
|
return "redirect:/database?error=fileNotFound";
|
||||||
|
}
|
||||||
|
log.info("Received file: {}", fileName);
|
||||||
|
if (databaseBackupHelper.importDatabaseFromUI(fileName)) {
|
||||||
|
log.info("File {} imported to database", fileName);
|
||||||
|
return "redirect:/database?infoMessage=importIntoDatabaseSuccessed";
|
||||||
|
}
|
||||||
|
return "redirect:/database?error=failedImportFile";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Hidden
|
||||||
|
@GetMapping("/delete/{fileName}")
|
||||||
|
@Operation(
|
||||||
|
summary = "Delete a database backup file",
|
||||||
|
description =
|
||||||
|
"This endpoint deletes a database backup file with the specified file name.")
|
||||||
|
public String deleteFile(@PathVariable String fileName) {
|
||||||
|
if (fileName == null || fileName.isEmpty()) {
|
||||||
|
throw new IllegalArgumentException("File must not be null or empty");
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
if (databaseBackupHelper.deleteBackupFile(fileName)) {
|
||||||
|
log.info("Deleted file: {}", fileName);
|
||||||
|
} else {
|
||||||
|
log.error("Failed to delete file: {}", fileName);
|
||||||
|
return "redirect:/database?error=failedToDeleteFile";
|
||||||
|
}
|
||||||
|
} catch (IOException e) {
|
||||||
|
log.error("Error deleting file: {}", e.getMessage());
|
||||||
|
return "redirect:/database?error=" + e.getMessage();
|
||||||
|
}
|
||||||
|
return "redirect:/database";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Hidden
|
||||||
|
@GetMapping("/download/{fileName}")
|
||||||
|
@Operation(
|
||||||
|
summary = "Download a database backup file",
|
||||||
|
description =
|
||||||
|
"This endpoint downloads a database backup file with the specified file name.")
|
||||||
|
public ResponseEntity<?> downloadFile(@PathVariable String fileName) {
|
||||||
|
if (fileName == null || fileName.isEmpty()) {
|
||||||
|
throw new IllegalArgumentException("File must not be null or empty");
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
Path filePath = databaseBackupHelper.getBackupFilePath(fileName);
|
||||||
|
InputStreamResource resource = new InputStreamResource(Files.newInputStream(filePath));
|
||||||
|
return ResponseEntity.ok()
|
||||||
|
.header(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename=" + fileName)
|
||||||
|
.contentType(MediaType.APPLICATION_OCTET_STREAM)
|
||||||
|
.contentLength(Files.size(filePath))
|
||||||
|
.body(resource);
|
||||||
|
} catch (IOException e) {
|
||||||
|
log.error("Error downloading file: {}", e.getMessage());
|
||||||
|
return ResponseEntity.status(HttpStatus.SEE_OTHER_303)
|
||||||
|
.location(URI.create("/database?error=downloadFailed"))
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -10,11 +10,16 @@ import java.util.ArrayList;
|
|||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Comparator;
|
import java.util.Comparator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
import org.apache.pdfbox.Loader;
|
import org.apache.pdfbox.Loader;
|
||||||
import org.apache.pdfbox.multipdf.PDFMergerUtility;
|
import org.apache.pdfbox.multipdf.PDFMergerUtility;
|
||||||
import org.apache.pdfbox.pdmodel.PDDocument;
|
import org.apache.pdfbox.pdmodel.PDDocument;
|
||||||
|
import org.apache.pdfbox.pdmodel.PDDocumentCatalog;
|
||||||
import org.apache.pdfbox.pdmodel.PDPage;
|
import org.apache.pdfbox.pdmodel.PDPage;
|
||||||
|
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.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
import org.springframework.http.ResponseEntity;
|
import org.springframework.http.ResponseEntity;
|
||||||
@@ -38,6 +43,7 @@ public class MergeController {
|
|||||||
|
|
||||||
private static final Logger logger = LoggerFactory.getLogger(MergeController.class);
|
private static final Logger logger = LoggerFactory.getLogger(MergeController.class);
|
||||||
|
|
||||||
|
// Merges a list of PDDocument objects into a single PDDocument
|
||||||
public PDDocument mergeDocuments(List<PDDocument> documents) throws IOException {
|
public PDDocument mergeDocuments(List<PDDocument> documents) throws IOException {
|
||||||
PDDocument mergedDoc = new PDDocument();
|
PDDocument mergedDoc = new PDDocument();
|
||||||
for (PDDocument doc : documents) {
|
for (PDDocument doc : documents) {
|
||||||
@@ -48,6 +54,7 @@ public class MergeController {
|
|||||||
return mergedDoc;
|
return mergedDoc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Returns a comparator for sorting MultipartFile arrays based on the given sort type
|
||||||
private Comparator<MultipartFile> getSortComparator(String sortType) {
|
private Comparator<MultipartFile> getSortComparator(String sortType) {
|
||||||
switch (sortType) {
|
switch (sortType) {
|
||||||
case "byFileName":
|
case "byFileName":
|
||||||
@@ -108,37 +115,78 @@ public class MergeController {
|
|||||||
"This endpoint merges multiple PDF files into a single PDF file. The merged file will contain all pages from the input files in the order they were provided. Input:PDF Output:PDF Type:MISO")
|
"This endpoint merges multiple PDF files into a single PDF file. The merged file will contain all pages from the input files in the order they were provided. Input:PDF Output:PDF Type:MISO")
|
||||||
public ResponseEntity<byte[]> mergePdfs(@ModelAttribute MergePdfsRequest form)
|
public ResponseEntity<byte[]> mergePdfs(@ModelAttribute MergePdfsRequest form)
|
||||||
throws IOException {
|
throws IOException {
|
||||||
List<File> filesToDelete = new ArrayList<File>();
|
List<File> filesToDelete = new ArrayList<>(); // List of temporary files to delete
|
||||||
|
ByteArrayOutputStream docOutputstream =
|
||||||
|
new ByteArrayOutputStream(); // Stream for the merged document
|
||||||
|
PDDocument mergedDocument = null;
|
||||||
|
|
||||||
|
boolean removeCertSign = form.isRemoveCertSign();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
MultipartFile[] files = form.getFileInput();
|
MultipartFile[] files = form.getFileInput();
|
||||||
Arrays.sort(files, getSortComparator(form.getSortType()));
|
Arrays.sort(
|
||||||
|
files,
|
||||||
PDFMergerUtility mergedDoc = new PDFMergerUtility();
|
getSortComparator(
|
||||||
ByteArrayOutputStream docOutputstream = new ByteArrayOutputStream();
|
form.getSortType())); // Sort files based on the given sort type
|
||||||
|
|
||||||
|
PDFMergerUtility mergerUtility = new PDFMergerUtility();
|
||||||
for (MultipartFile multipartFile : files) {
|
for (MultipartFile multipartFile : files) {
|
||||||
File tempFile = GeneralUtils.convertMultipartFileToFile(multipartFile);
|
File tempFile =
|
||||||
filesToDelete.add(tempFile);
|
GeneralUtils.convertMultipartFileToFile(
|
||||||
mergedDoc.addSource(tempFile);
|
multipartFile); // Convert MultipartFile to File
|
||||||
|
filesToDelete.add(tempFile); // Add temp file to the list for later deletion
|
||||||
|
mergerUtility.addSource(tempFile); // Add source file to the merger utility
|
||||||
|
}
|
||||||
|
mergerUtility.setDestinationStream(
|
||||||
|
docOutputstream); // Set the output stream for the merged document
|
||||||
|
mergerUtility.mergeDocuments(null); // Merge the documents
|
||||||
|
|
||||||
|
byte[] mergedPdfBytes = docOutputstream.toByteArray(); // Get merged document bytes
|
||||||
|
|
||||||
|
// Load the merged PDF document
|
||||||
|
mergedDocument = Loader.loadPDF(mergedPdfBytes);
|
||||||
|
|
||||||
|
// Remove signatures if removeCertSign is true
|
||||||
|
if (removeCertSign) {
|
||||||
|
PDDocumentCatalog catalog = mergedDocument.getDocumentCatalog();
|
||||||
|
PDAcroForm acroForm = catalog.getAcroForm();
|
||||||
|
if (acroForm != null) {
|
||||||
|
List<PDField> fieldsToRemove =
|
||||||
|
acroForm.getFields().stream()
|
||||||
|
.filter(field -> field instanceof PDSignatureField)
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
|
||||||
|
if (!fieldsToRemove.isEmpty()) {
|
||||||
|
acroForm.flatten(
|
||||||
|
fieldsToRemove,
|
||||||
|
false); // Flatten the fields, effectively removing them
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
mergedDoc.setDestinationFileName(
|
// Save the modified document to a new ByteArrayOutputStream
|
||||||
files[0].getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_merged.pdf");
|
ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
||||||
mergedDoc.setDestinationStream(docOutputstream);
|
mergedDocument.save(baos);
|
||||||
|
|
||||||
mergedDoc.mergeDocuments(null);
|
|
||||||
|
|
||||||
|
String mergedFileName =
|
||||||
|
files[0].getOriginalFilename().replaceFirst("[.][^.]+$", "")
|
||||||
|
+ "_merged_unsigned.pdf";
|
||||||
return WebResponseUtils.bytesToWebResponse(
|
return WebResponseUtils.bytesToWebResponse(
|
||||||
docOutputstream.toByteArray(), mergedDoc.getDestinationFileName());
|
baos.toByteArray(), mergedFileName); // Return the modified PDF
|
||||||
|
|
||||||
} catch (Exception ex) {
|
} catch (Exception ex) {
|
||||||
logger.error("Error in merge pdf process", ex);
|
logger.error("Error in merge pdf process", ex);
|
||||||
throw ex;
|
throw ex;
|
||||||
} finally {
|
} finally {
|
||||||
for (File file : filesToDelete) {
|
for (File file : filesToDelete) {
|
||||||
if (file != null) {
|
if (file != null) {
|
||||||
Files.deleteIfExists(file.toPath());
|
Files.deleteIfExists(file.toPath()); // Delete temporary files
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
docOutputstream.close();
|
||||||
|
if (mergedDocument != null) {
|
||||||
|
mergedDocument.close(); // Close the merged document
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -145,6 +145,28 @@ public class RearrangePagesPDFController {
|
|||||||
return newPageOrder;
|
return newPageOrder;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Rearrange pages in a PDF file by merging odd and even pages. The first half of the pages will
|
||||||
|
* be the odd pages, and the second half will be the even pages as input. <br>
|
||||||
|
* This method is visible for testing purposes only.
|
||||||
|
*
|
||||||
|
* @param totalPages Total number of pages in the PDF file.
|
||||||
|
* @return List of page numbers in the new order. The first page is 0.
|
||||||
|
*/
|
||||||
|
List<Integer> oddEvenMerge(int totalPages) {
|
||||||
|
List<Integer> newPageOrderZeroBased = new ArrayList<>();
|
||||||
|
int numberOfOddPages = (totalPages + 1) / 2;
|
||||||
|
|
||||||
|
for (int oneBasedIndex = 1; oneBasedIndex < (numberOfOddPages + 1); oneBasedIndex++) {
|
||||||
|
newPageOrderZeroBased.add((oneBasedIndex - 1));
|
||||||
|
if (numberOfOddPages + oneBasedIndex <= totalPages) {
|
||||||
|
newPageOrderZeroBased.add((numberOfOddPages + oneBasedIndex - 1));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return newPageOrderZeroBased;
|
||||||
|
}
|
||||||
|
|
||||||
private List<Integer> processSortTypes(String sortTypes, int totalPages) {
|
private List<Integer> processSortTypes(String sortTypes, int totalPages) {
|
||||||
try {
|
try {
|
||||||
SortTypes mode = SortTypes.valueOf(sortTypes.toUpperCase());
|
SortTypes mode = SortTypes.valueOf(sortTypes.toUpperCase());
|
||||||
@@ -159,6 +181,8 @@ public class RearrangePagesPDFController {
|
|||||||
return sideStitchBooklet(totalPages);
|
return sideStitchBooklet(totalPages);
|
||||||
case ODD_EVEN_SPLIT:
|
case ODD_EVEN_SPLIT:
|
||||||
return oddEvenSplit(totalPages);
|
return oddEvenSplit(totalPages);
|
||||||
|
case ODD_EVEN_MERGE:
|
||||||
|
return oddEvenMerge(totalPages);
|
||||||
case REMOVE_FIRST:
|
case REMOVE_FIRST:
|
||||||
return removeFirst(totalPages);
|
return removeFirst(totalPages);
|
||||||
case REMOVE_LAST:
|
case REMOVE_LAST:
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
package stirling.software.SPDF.controller.api;
|
package stirling.software.SPDF.controller.api;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
import java.security.Principal;
|
import java.security.Principal;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
@@ -42,7 +43,8 @@ public class UserController {
|
|||||||
|
|
||||||
@PreAuthorize("!hasAuthority('ROLE_DEMO_USER')")
|
@PreAuthorize("!hasAuthority('ROLE_DEMO_USER')")
|
||||||
@PostMapping("/register")
|
@PostMapping("/register")
|
||||||
public String register(@ModelAttribute UsernameAndPass requestModel, Model model) {
|
public String register(@ModelAttribute UsernameAndPass requestModel, Model model)
|
||||||
|
throws IOException {
|
||||||
if (userService.usernameExistsIgnoreCase(requestModel.getUsername())) {
|
if (userService.usernameExistsIgnoreCase(requestModel.getUsername())) {
|
||||||
model.addAttribute("error", "Username already exists");
|
model.addAttribute("error", "Username already exists");
|
||||||
return "register";
|
return "register";
|
||||||
@@ -59,11 +61,12 @@ public class UserController {
|
|||||||
@PostMapping("/change-username")
|
@PostMapping("/change-username")
|
||||||
public RedirectView changeUsername(
|
public RedirectView changeUsername(
|
||||||
Principal principal,
|
Principal principal,
|
||||||
@RequestParam(name = "currentPassword") String currentPassword,
|
@RequestParam(name = "currentPasswordChangeUsername") String currentPassword,
|
||||||
@RequestParam(name = "newUsername") String newUsername,
|
@RequestParam(name = "newUsername") String newUsername,
|
||||||
HttpServletRequest request,
|
HttpServletRequest request,
|
||||||
HttpServletResponse response,
|
HttpServletResponse response,
|
||||||
RedirectAttributes redirectAttributes) {
|
RedirectAttributes redirectAttributes)
|
||||||
|
throws IOException {
|
||||||
|
|
||||||
if (!userService.isUsernameValid(newUsername)) {
|
if (!userService.isUsernameValid(newUsername)) {
|
||||||
return new RedirectView("/account?messageType=invalidUsername", true);
|
return new RedirectView("/account?messageType=invalidUsername", true);
|
||||||
@@ -116,7 +119,8 @@ public class UserController {
|
|||||||
@RequestParam(name = "newPassword") String newPassword,
|
@RequestParam(name = "newPassword") String newPassword,
|
||||||
HttpServletRequest request,
|
HttpServletRequest request,
|
||||||
HttpServletResponse response,
|
HttpServletResponse response,
|
||||||
RedirectAttributes redirectAttributes) {
|
RedirectAttributes redirectAttributes)
|
||||||
|
throws IOException {
|
||||||
if (principal == null) {
|
if (principal == null) {
|
||||||
return new RedirectView("/change-creds?messageType=notAuthenticated", true);
|
return new RedirectView("/change-creds?messageType=notAuthenticated", true);
|
||||||
}
|
}
|
||||||
@@ -149,7 +153,8 @@ public class UserController {
|
|||||||
@RequestParam(name = "newPassword") String newPassword,
|
@RequestParam(name = "newPassword") String newPassword,
|
||||||
HttpServletRequest request,
|
HttpServletRequest request,
|
||||||
HttpServletResponse response,
|
HttpServletResponse response,
|
||||||
RedirectAttributes redirectAttributes) {
|
RedirectAttributes redirectAttributes)
|
||||||
|
throws IOException {
|
||||||
if (principal == null) {
|
if (principal == null) {
|
||||||
return new RedirectView("/account?messageType=notAuthenticated", true);
|
return new RedirectView("/account?messageType=notAuthenticated", true);
|
||||||
}
|
}
|
||||||
@@ -176,7 +181,8 @@ public class UserController {
|
|||||||
|
|
||||||
@PreAuthorize("!hasAuthority('ROLE_DEMO_USER')")
|
@PreAuthorize("!hasAuthority('ROLE_DEMO_USER')")
|
||||||
@PostMapping("/updateUserSettings")
|
@PostMapping("/updateUserSettings")
|
||||||
public String updateUserSettings(HttpServletRequest request, Principal principal) {
|
public String updateUserSettings(HttpServletRequest request, Principal principal)
|
||||||
|
throws IOException {
|
||||||
Map<String, String[]> paramMap = request.getParameterMap();
|
Map<String, String[]> paramMap = request.getParameterMap();
|
||||||
Map<String, String> updates = new HashMap<>();
|
Map<String, String> updates = new HashMap<>();
|
||||||
|
|
||||||
@@ -201,7 +207,8 @@ public class UserController {
|
|||||||
@RequestParam(name = "password") String password,
|
@RequestParam(name = "password") String password,
|
||||||
@RequestParam(name = "role") String role,
|
@RequestParam(name = "role") String role,
|
||||||
@RequestParam(name = "forceChange", required = false, defaultValue = "false")
|
@RequestParam(name = "forceChange", required = false, defaultValue = "false")
|
||||||
boolean forceChange) {
|
boolean forceChange)
|
||||||
|
throws IllegalArgumentException, IOException {
|
||||||
|
|
||||||
if (!userService.isUsernameValid(username)) {
|
if (!userService.isUsernameValid(username)) {
|
||||||
return new RedirectView("/addUsers?messageType=invalidUsername", true);
|
return new RedirectView("/addUsers?messageType=invalidUsername", true);
|
||||||
|
|||||||
@@ -105,7 +105,14 @@ public class PipelineProcessor {
|
|||||||
body.add("fileInput", file);
|
body.add("fileInput", file);
|
||||||
|
|
||||||
for (Entry<String, Object> entry : parameters.entrySet()) {
|
for (Entry<String, Object> entry : parameters.entrySet()) {
|
||||||
body.add(entry.getKey(), entry.getValue());
|
if (entry.getValue() instanceof List) {
|
||||||
|
List<?> list = (List<?>) entry.getValue();
|
||||||
|
for (Object item : list) {
|
||||||
|
body.add(entry.getKey(), item);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
body.add(entry.getKey(), entry.getValue());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ResponseEntity<byte[]> response = sendWebRequest(url, body);
|
ResponseEntity<byte[]> response = sendWebRequest(url, body);
|
||||||
@@ -167,7 +174,14 @@ public class PipelineProcessor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (Entry<String, Object> entry : parameters.entrySet()) {
|
for (Entry<String, Object> entry : parameters.entrySet()) {
|
||||||
body.add(entry.getKey(), entry.getValue());
|
if (entry.getValue() instanceof List) {
|
||||||
|
List<?> list = (List<?>) entry.getValue();
|
||||||
|
for (Object item : list) {
|
||||||
|
body.add(entry.getKey(), item);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
body.add(entry.getKey(), entry.getValue());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ResponseEntity<byte[]> response = sendWebRequest(url, body);
|
ResponseEntity<byte[]> response = sendWebRequest(url, body);
|
||||||
|
|||||||
@@ -68,7 +68,6 @@ public class PasswordController {
|
|||||||
boolean canModifyAnnotations = request.isCanModifyAnnotations();
|
boolean canModifyAnnotations = request.isCanModifyAnnotations();
|
||||||
boolean canPrint = request.isCanPrint();
|
boolean canPrint = request.isCanPrint();
|
||||||
boolean canPrintFaithful = request.isCanPrintFaithful();
|
boolean canPrintFaithful = request.isCanPrintFaithful();
|
||||||
|
|
||||||
PDDocument document = Loader.loadPDF(fileInput.getBytes());
|
PDDocument document = Loader.loadPDF(fileInput.getBytes());
|
||||||
AccessPermission ap = new AccessPermission();
|
AccessPermission ap = new AccessPermission();
|
||||||
ap.setCanAssembleDocument(!canAssembleDocument);
|
ap.setCanAssembleDocument(!canAssembleDocument);
|
||||||
|
|||||||
@@ -24,14 +24,14 @@ import io.swagger.v3.oas.annotations.tags.Tag;
|
|||||||
|
|
||||||
import jakarta.servlet.http.HttpServletRequest;
|
import jakarta.servlet.http.HttpServletRequest;
|
||||||
import stirling.software.SPDF.model.ApplicationProperties;
|
import stirling.software.SPDF.model.ApplicationProperties;
|
||||||
import stirling.software.SPDF.model.ApplicationProperties.GithubProvider;
|
|
||||||
import stirling.software.SPDF.model.ApplicationProperties.GoogleProvider;
|
|
||||||
import stirling.software.SPDF.model.ApplicationProperties.KeycloakProvider;
|
|
||||||
import stirling.software.SPDF.model.ApplicationProperties.Security.OAUTH2;
|
import stirling.software.SPDF.model.ApplicationProperties.Security.OAUTH2;
|
||||||
import stirling.software.SPDF.model.ApplicationProperties.Security.OAUTH2.Client;
|
import stirling.software.SPDF.model.ApplicationProperties.Security.OAUTH2.Client;
|
||||||
import stirling.software.SPDF.model.Authority;
|
import stirling.software.SPDF.model.Authority;
|
||||||
import stirling.software.SPDF.model.Role;
|
import stirling.software.SPDF.model.Role;
|
||||||
import stirling.software.SPDF.model.User;
|
import stirling.software.SPDF.model.User;
|
||||||
|
import stirling.software.SPDF.model.provider.GithubProvider;
|
||||||
|
import stirling.software.SPDF.model.provider.GoogleProvider;
|
||||||
|
import stirling.software.SPDF.model.provider.KeycloakProvider;
|
||||||
import stirling.software.SPDF.repository.UserRepository;
|
import stirling.software.SPDF.repository.UserRepository;
|
||||||
|
|
||||||
@Controller
|
@Controller
|
||||||
@@ -43,6 +43,7 @@ public class AccountWebController {
|
|||||||
|
|
||||||
@GetMapping("/login")
|
@GetMapping("/login")
|
||||||
public String login(HttpServletRequest request, Model model, Authentication authentication) {
|
public String login(HttpServletRequest request, Model model, Authentication authentication) {
|
||||||
|
|
||||||
if (authentication != null && authentication.isAuthenticated()) {
|
if (authentication != null && authentication.isAuthenticated()) {
|
||||||
return "redirect:/";
|
return "redirect:/";
|
||||||
}
|
}
|
||||||
@@ -72,8 +73,13 @@ public class AccountWebController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// Remove any null keys/values from the providerList
|
||||||
|
providerList
|
||||||
|
.entrySet()
|
||||||
|
.removeIf(entry -> entry.getKey() == null || entry.getValue() == null);
|
||||||
model.addAttribute("providerlist", providerList);
|
model.addAttribute("providerlist", providerList);
|
||||||
|
|
||||||
|
model.addAttribute("loginMethod", applicationProperties.getSecurity().getLoginMethod());
|
||||||
model.addAttribute(
|
model.addAttribute(
|
||||||
"oAuth2Enabled", applicationProperties.getSecurity().getOAUTH2().getEnabled());
|
"oAuth2Enabled", applicationProperties.getSecurity().getOAUTH2().getEnabled());
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,41 @@
|
|||||||
|
package stirling.software.SPDF.controller.web;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.security.access.prepost.PreAuthorize;
|
||||||
|
import org.springframework.security.core.Authentication;
|
||||||
|
import org.springframework.stereotype.Controller;
|
||||||
|
import org.springframework.ui.Model;
|
||||||
|
import org.springframework.web.bind.annotation.GetMapping;
|
||||||
|
|
||||||
|
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||||
|
|
||||||
|
import jakarta.servlet.http.HttpServletRequest;
|
||||||
|
import stirling.software.SPDF.config.security.database.DatabaseBackupHelper;
|
||||||
|
import stirling.software.SPDF.utils.FileInfo;
|
||||||
|
|
||||||
|
@Controller
|
||||||
|
@Tag(name = "Database Management", description = "Database management and security APIs")
|
||||||
|
public class DatabaseWebController {
|
||||||
|
|
||||||
|
@Autowired private DatabaseBackupHelper databaseBackupHelper;
|
||||||
|
|
||||||
|
@PreAuthorize("hasRole('ROLE_ADMIN')")
|
||||||
|
@GetMapping("/database")
|
||||||
|
public String database(HttpServletRequest request, Model model, Authentication authentication) {
|
||||||
|
String error = request.getParameter("error");
|
||||||
|
String confirmed = request.getParameter("infoMessage");
|
||||||
|
|
||||||
|
if (error != null) {
|
||||||
|
model.addAttribute("error", error);
|
||||||
|
} else if (confirmed != null) {
|
||||||
|
model.addAttribute("infoMessage", confirmed);
|
||||||
|
}
|
||||||
|
|
||||||
|
List<FileInfo> backupList = databaseBackupHelper.getBackupList();
|
||||||
|
model.addAttribute("systemUpdate", backupList);
|
||||||
|
|
||||||
|
return "database";
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -13,6 +13,10 @@ import org.springframework.context.annotation.Configuration;
|
|||||||
import org.springframework.context.annotation.PropertySource;
|
import org.springframework.context.annotation.PropertySource;
|
||||||
|
|
||||||
import stirling.software.SPDF.config.YamlPropertySourceFactory;
|
import stirling.software.SPDF.config.YamlPropertySourceFactory;
|
||||||
|
import stirling.software.SPDF.model.provider.GithubProvider;
|
||||||
|
import stirling.software.SPDF.model.provider.GoogleProvider;
|
||||||
|
import stirling.software.SPDF.model.provider.KeycloakProvider;
|
||||||
|
import stirling.software.SPDF.model.provider.UnsupportedProviderException;
|
||||||
|
|
||||||
@Configuration
|
@Configuration
|
||||||
@ConfigurationProperties(prefix = "")
|
@ConfigurationProperties(prefix = "")
|
||||||
@@ -128,6 +132,15 @@ public class ApplicationProperties {
|
|||||||
private OAUTH2 oauth2;
|
private OAUTH2 oauth2;
|
||||||
private int loginAttemptCount;
|
private int loginAttemptCount;
|
||||||
private long loginResetTimeMinutes;
|
private long loginResetTimeMinutes;
|
||||||
|
private String loginMethod = "all";
|
||||||
|
|
||||||
|
public String getLoginMethod() {
|
||||||
|
return loginMethod;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setLoginMethod(String loginMethod) {
|
||||||
|
this.loginMethod = loginMethod;
|
||||||
|
}
|
||||||
|
|
||||||
public int getLoginAttemptCount() {
|
public int getLoginAttemptCount() {
|
||||||
return loginAttemptCount;
|
return loginAttemptCount;
|
||||||
@@ -187,6 +200,8 @@ public class ApplicationProperties {
|
|||||||
+ initialLogin
|
+ initialLogin
|
||||||
+ ", csrfDisabled="
|
+ ", csrfDisabled="
|
||||||
+ csrfDisabled
|
+ csrfDisabled
|
||||||
|
+ ", loginMethod="
|
||||||
|
+ loginMethod
|
||||||
+ "]";
|
+ "]";
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -355,7 +370,7 @@ public class ApplicationProperties {
|
|||||||
private GithubProvider github = new GithubProvider();
|
private GithubProvider github = new GithubProvider();
|
||||||
private KeycloakProvider keycloak = new KeycloakProvider();
|
private KeycloakProvider keycloak = new KeycloakProvider();
|
||||||
|
|
||||||
public Provider get(String registrationId) throws Exception {
|
public Provider get(String registrationId) throws UnsupportedProviderException {
|
||||||
switch (registrationId.toLowerCase()) {
|
switch (registrationId.toLowerCase()) {
|
||||||
case "google":
|
case "google":
|
||||||
return getGoogle();
|
return getGoogle();
|
||||||
@@ -366,7 +381,8 @@ public class ApplicationProperties {
|
|||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
throw new Exception("Provider not supported, use custom setting.");
|
throw new UnsupportedProviderException(
|
||||||
|
"Logout from the provider is not supported? Report it at https://github.com/Stirling-Tools/Stirling-PDF/issues");
|
||||||
}
|
}
|
||||||
|
|
||||||
public GoogleProvider getGoogle() {
|
public GoogleProvider getGoogle() {
|
||||||
@@ -407,311 +423,6 @@ public class ApplicationProperties {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class GoogleProvider extends Provider {
|
|
||||||
|
|
||||||
private static final String authorizationUri =
|
|
||||||
"https://accounts.google.com/o/oauth2/v2/auth";
|
|
||||||
private static final String tokenUri = "https://www.googleapis.com/oauth2/v4/token";
|
|
||||||
private static final String userInfoUri =
|
|
||||||
"https://www.googleapis.com/oauth2/v3/userinfo?alt=json";
|
|
||||||
|
|
||||||
public String getAuthorizationuri() {
|
|
||||||
return authorizationUri;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getTokenuri() {
|
|
||||||
return tokenUri;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getUserinfouri() {
|
|
||||||
return userInfoUri;
|
|
||||||
}
|
|
||||||
|
|
||||||
private String clientId;
|
|
||||||
private String clientSecret;
|
|
||||||
private Collection<String> scopes = new ArrayList<>();
|
|
||||||
private String useAsUsername = "email";
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getClientId() {
|
|
||||||
return this.clientId;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setClientId(String clientId) {
|
|
||||||
this.clientId = clientId;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getClientSecret() {
|
|
||||||
return this.clientSecret;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setClientSecret(String clientSecret) {
|
|
||||||
this.clientSecret = clientSecret;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Collection<String> getScopes() {
|
|
||||||
if (scopes == null || scopes.isEmpty()) {
|
|
||||||
scopes = new ArrayList<>();
|
|
||||||
scopes.add("https://www.googleapis.com/auth/userinfo.email");
|
|
||||||
scopes.add("https://www.googleapis.com/auth/userinfo.profile");
|
|
||||||
}
|
|
||||||
return scopes;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setScopes(String scopes) {
|
|
||||||
this.scopes =
|
|
||||||
Arrays.stream(scopes.split(",")).map(String::trim).collect(Collectors.toList());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getUseAsUsername() {
|
|
||||||
return this.useAsUsername;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setUseAsUsername(String useAsUsername) {
|
|
||||||
this.useAsUsername = useAsUsername;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String toString() {
|
|
||||||
return "Google [clientId="
|
|
||||||
+ clientId
|
|
||||||
+ ", clientSecret="
|
|
||||||
+ (clientSecret != null && !clientSecret.isEmpty() ? "MASKED" : "NULL")
|
|
||||||
+ ", scopes="
|
|
||||||
+ scopes
|
|
||||||
+ ", useAsUsername="
|
|
||||||
+ useAsUsername
|
|
||||||
+ "]";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getName() {
|
|
||||||
return "google";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getClientName() {
|
|
||||||
return "Google";
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isSettingsValid() {
|
|
||||||
return super.isValid(this.getClientId(), "clientId")
|
|
||||||
&& super.isValid(this.getClientSecret(), "clientSecret")
|
|
||||||
&& super.isValid(this.getScopes(), "scopes")
|
|
||||||
&& isValid(this.getUseAsUsername(), "useAsUsername");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static class GithubProvider extends Provider {
|
|
||||||
private static final String authorizationUri = "https://github.com/login/oauth/authorize";
|
|
||||||
private static final String tokenUri = "https://github.com/login/oauth/access_token";
|
|
||||||
private static final String userInfoUri = "https://api.github.com/user";
|
|
||||||
|
|
||||||
public String getAuthorizationuri() {
|
|
||||||
return authorizationUri;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getTokenuri() {
|
|
||||||
return tokenUri;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getUserinfouri() {
|
|
||||||
return userInfoUri;
|
|
||||||
}
|
|
||||||
|
|
||||||
private String clientId;
|
|
||||||
private String clientSecret;
|
|
||||||
private Collection<String> scopes = new ArrayList<>();
|
|
||||||
private String useAsUsername = "login";
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getIssuer() {
|
|
||||||
return new String();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setIssuer(String issuer) {}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getClientId() {
|
|
||||||
return this.clientId;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setClientId(String clientId) {
|
|
||||||
this.clientId = clientId;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getClientSecret() {
|
|
||||||
return this.clientSecret;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setClientSecret(String clientSecret) {
|
|
||||||
this.clientSecret = clientSecret;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Collection<String> getScopes() {
|
|
||||||
if (scopes == null || scopes.isEmpty()) {
|
|
||||||
scopes = new ArrayList<>();
|
|
||||||
scopes.add("read:user");
|
|
||||||
}
|
|
||||||
return scopes;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setScopes(String scopes) {
|
|
||||||
this.scopes =
|
|
||||||
Arrays.stream(scopes.split(",")).map(String::trim).collect(Collectors.toList());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getUseAsUsername() {
|
|
||||||
return this.useAsUsername;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setUseAsUsername(String useAsUsername) {
|
|
||||||
this.useAsUsername = useAsUsername;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String toString() {
|
|
||||||
return "GitHub [clientId="
|
|
||||||
+ clientId
|
|
||||||
+ ", clientSecret="
|
|
||||||
+ (clientSecret != null && !clientSecret.isEmpty() ? "MASKED" : "NULL")
|
|
||||||
+ ", scopes="
|
|
||||||
+ scopes
|
|
||||||
+ ", useAsUsername="
|
|
||||||
+ useAsUsername
|
|
||||||
+ "]";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getName() {
|
|
||||||
return "github";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getClientName() {
|
|
||||||
return "GitHub";
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isSettingsValid() {
|
|
||||||
return super.isValid(this.getClientId(), "clientId")
|
|
||||||
&& super.isValid(this.getClientSecret(), "clientSecret")
|
|
||||||
&& super.isValid(this.getScopes(), "scopes")
|
|
||||||
&& isValid(this.getUseAsUsername(), "useAsUsername");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static class KeycloakProvider extends Provider {
|
|
||||||
private String issuer;
|
|
||||||
private String clientId;
|
|
||||||
private String clientSecret;
|
|
||||||
private Collection<String> scopes = new ArrayList<>();
|
|
||||||
private String useAsUsername = "email";
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getIssuer() {
|
|
||||||
return this.issuer;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setIssuer(String issuer) {
|
|
||||||
this.issuer = issuer;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getClientId() {
|
|
||||||
return this.clientId;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setClientId(String clientId) {
|
|
||||||
this.clientId = clientId;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getClientSecret() {
|
|
||||||
return this.clientSecret;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setClientSecret(String clientSecret) {
|
|
||||||
this.clientSecret = clientSecret;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Collection<String> getScopes() {
|
|
||||||
if (scopes == null || scopes.isEmpty()) {
|
|
||||||
scopes = new ArrayList<>();
|
|
||||||
scopes.add("profile");
|
|
||||||
scopes.add("email");
|
|
||||||
}
|
|
||||||
return scopes;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setScopes(String scopes) {
|
|
||||||
this.scopes =
|
|
||||||
Arrays.stream(scopes.split(",")).map(String::trim).collect(Collectors.toList());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getUseAsUsername() {
|
|
||||||
return this.useAsUsername;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setUseAsUsername(String useAsUsername) {
|
|
||||||
this.useAsUsername = useAsUsername;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String toString() {
|
|
||||||
return "Keycloak [issuer="
|
|
||||||
+ issuer
|
|
||||||
+ ", clientId="
|
|
||||||
+ clientId
|
|
||||||
+ ", clientSecret="
|
|
||||||
+ (clientSecret != null && !clientSecret.isEmpty() ? "MASKED" : "NULL")
|
|
||||||
+ ", scopes="
|
|
||||||
+ scopes
|
|
||||||
+ ", useAsUsername="
|
|
||||||
+ useAsUsername
|
|
||||||
+ "]";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getName() {
|
|
||||||
return "keycloak";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getClientName() {
|
|
||||||
return "Keycloak";
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isSettingsValid() {
|
|
||||||
return isValid(this.getIssuer(), "issuer")
|
|
||||||
&& isValid(this.getClientId(), "clientId")
|
|
||||||
&& isValid(this.getClientSecret(), "clientSecret")
|
|
||||||
&& isValid(this.getScopes(), "scopes")
|
|
||||||
&& isValid(this.getUseAsUsername(), "useAsUsername");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static class System {
|
public static class System {
|
||||||
private String defaultLocale;
|
private String defaultLocale;
|
||||||
private Boolean googlevisibility;
|
private Boolean googlevisibility;
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ public enum SortTypes {
|
|||||||
BOOKLET_SORT,
|
BOOKLET_SORT,
|
||||||
SIDE_STITCH_BOOKLET_SORT,
|
SIDE_STITCH_BOOKLET_SORT,
|
||||||
ODD_EVEN_SPLIT,
|
ODD_EVEN_SPLIT,
|
||||||
|
ODD_EVEN_MERGE,
|
||||||
REMOVE_FIRST,
|
REMOVE_FIRST,
|
||||||
REMOVE_LAST,
|
REMOVE_LAST,
|
||||||
REMOVE_FIRST_AND_LAST,
|
REMOVE_FIRST_AND_LAST,
|
||||||
|
|||||||
@@ -16,6 +16,7 @@ import jakarta.persistence.GeneratedValue;
|
|||||||
import jakarta.persistence.GenerationType;
|
import jakarta.persistence.GenerationType;
|
||||||
import jakarta.persistence.Id;
|
import jakarta.persistence.Id;
|
||||||
import jakarta.persistence.JoinColumn;
|
import jakarta.persistence.JoinColumn;
|
||||||
|
import jakarta.persistence.Lob;
|
||||||
import jakarta.persistence.MapKeyColumn;
|
import jakarta.persistence.MapKeyColumn;
|
||||||
import jakarta.persistence.OneToMany;
|
import jakarta.persistence.OneToMany;
|
||||||
import jakarta.persistence.Table;
|
import jakarta.persistence.Table;
|
||||||
@@ -55,7 +56,8 @@ public class User {
|
|||||||
|
|
||||||
@ElementCollection
|
@ElementCollection
|
||||||
@MapKeyColumn(name = "setting_key")
|
@MapKeyColumn(name = "setting_key")
|
||||||
@Column(name = "setting_value")
|
@Lob
|
||||||
|
@Column(name = "setting_value", columnDefinition = "CLOB")
|
||||||
@CollectionTable(name = "user_settings", joinColumns = @JoinColumn(name = "user_id"))
|
@CollectionTable(name = "user_settings", joinColumns = @JoinColumn(name = "user_id"))
|
||||||
private Map<String, String> settings = new HashMap<>(); // Key-value pairs of settings.
|
private Map<String, String> settings = new HashMap<>(); // Key-value pairs of settings.
|
||||||
|
|
||||||
|
|||||||
@@ -21,4 +21,10 @@ public class MergePdfsRequest extends MultiplePDFFiles {
|
|||||||
},
|
},
|
||||||
defaultValue = "orderProvided")
|
defaultValue = "orderProvided")
|
||||||
private String sortType = "orderProvided";
|
private String sortType = "orderProvided";
|
||||||
|
|
||||||
|
@Schema(
|
||||||
|
description =
|
||||||
|
"Flag indicating whether to remove certification signatures from the merged PDF. If true, all certification signatures will be removed from the final merged document.",
|
||||||
|
example = "true")
|
||||||
|
private boolean isRemoveCertSign;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ public class RearrangePagesRequest extends PDFWithPageNums {
|
|||||||
+ "DUPLEX_SORT: Sorts pages as if all fronts were scanned then all backs in reverse (1, n, 2, n-1, ...). "
|
+ "DUPLEX_SORT: Sorts pages as if all fronts were scanned then all backs in reverse (1, n, 2, n-1, ...). "
|
||||||
+ "BOOKLET_SORT: Arranges pages for booklet printing (last, first, second, second last, ...).\n"
|
+ "BOOKLET_SORT: Arranges pages for booklet printing (last, first, second, second last, ...).\n"
|
||||||
+ "ODD_EVEN_SPLIT: Splits and arranges pages into odd and even numbered pages.\n"
|
+ "ODD_EVEN_SPLIT: Splits and arranges pages into odd and even numbered pages.\n"
|
||||||
|
+ "ODD_EVEN_MERGE: Merges pages and organises them alternately into odd and even pages.\n"
|
||||||
+ "REMOVE_FIRST: Removes the first page.\n"
|
+ "REMOVE_FIRST: Removes the first page.\n"
|
||||||
+ "REMOVE_LAST: Removes the last page.\n"
|
+ "REMOVE_LAST: Removes the last page.\n"
|
||||||
+ "REMOVE_FIRST_AND_LAST: Removes both the first and the last pages.\n")
|
+ "REMOVE_FIRST_AND_LAST: Removes both the first and the last pages.\n")
|
||||||
|
|||||||
@@ -0,0 +1,115 @@
|
|||||||
|
package stirling.software.SPDF.model.provider;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
import stirling.software.SPDF.model.Provider;
|
||||||
|
|
||||||
|
public class GithubProvider extends Provider {
|
||||||
|
|
||||||
|
private static final String authorizationUri = "https://github.com/login/oauth/authorize";
|
||||||
|
private static final String tokenUri = "https://github.com/login/oauth/access_token";
|
||||||
|
private static final String userInfoUri = "https://api.github.com/user";
|
||||||
|
|
||||||
|
public String getAuthorizationuri() {
|
||||||
|
return authorizationUri;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getTokenuri() {
|
||||||
|
return tokenUri;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getUserinfouri() {
|
||||||
|
return userInfoUri;
|
||||||
|
}
|
||||||
|
|
||||||
|
private String clientId;
|
||||||
|
private String clientSecret;
|
||||||
|
private Collection<String> scopes = new ArrayList<>();
|
||||||
|
private String useAsUsername = "login";
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getIssuer() {
|
||||||
|
return new String();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setIssuer(String issuer) {}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getClientId() {
|
||||||
|
return this.clientId;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setClientId(String clientId) {
|
||||||
|
this.clientId = clientId;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getClientSecret() {
|
||||||
|
return this.clientSecret;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setClientSecret(String clientSecret) {
|
||||||
|
this.clientSecret = clientSecret;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Collection<String> getScopes() {
|
||||||
|
if (scopes == null || scopes.isEmpty()) {
|
||||||
|
scopes = new ArrayList<>();
|
||||||
|
scopes.add("read:user");
|
||||||
|
}
|
||||||
|
return scopes;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setScopes(String scopes) {
|
||||||
|
this.scopes =
|
||||||
|
Arrays.stream(scopes.split(",")).map(String::trim).collect(Collectors.toList());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getUseAsUsername() {
|
||||||
|
return this.useAsUsername;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setUseAsUsername(String useAsUsername) {
|
||||||
|
this.useAsUsername = useAsUsername;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return "GitHub [clientId="
|
||||||
|
+ clientId
|
||||||
|
+ ", clientSecret="
|
||||||
|
+ (clientSecret != null && !clientSecret.isEmpty() ? "MASKED" : "NULL")
|
||||||
|
+ ", scopes="
|
||||||
|
+ scopes
|
||||||
|
+ ", useAsUsername="
|
||||||
|
+ useAsUsername
|
||||||
|
+ "]";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getName() {
|
||||||
|
return "github";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getClientName() {
|
||||||
|
return "GitHub";
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isSettingsValid() {
|
||||||
|
return super.isValid(this.getClientId(), "clientId")
|
||||||
|
&& super.isValid(this.getClientSecret(), "clientSecret")
|
||||||
|
&& super.isValid(this.getScopes(), "scopes")
|
||||||
|
&& isValid(this.getUseAsUsername(), "useAsUsername");
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,109 @@
|
|||||||
|
package stirling.software.SPDF.model.provider;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
import stirling.software.SPDF.model.Provider;
|
||||||
|
|
||||||
|
public class GoogleProvider extends Provider {
|
||||||
|
|
||||||
|
private static final String authorizationUri = "https://accounts.google.com/o/oauth2/v2/auth";
|
||||||
|
private static final String tokenUri = "https://www.googleapis.com/oauth2/v4/token";
|
||||||
|
private static final String userInfoUri =
|
||||||
|
"https://www.googleapis.com/oauth2/v3/userinfo?alt=json";
|
||||||
|
|
||||||
|
public String getAuthorizationuri() {
|
||||||
|
return authorizationUri;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getTokenuri() {
|
||||||
|
return tokenUri;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getUserinfouri() {
|
||||||
|
return userInfoUri;
|
||||||
|
}
|
||||||
|
|
||||||
|
private String clientId;
|
||||||
|
private String clientSecret;
|
||||||
|
private Collection<String> scopes = new ArrayList<>();
|
||||||
|
private String useAsUsername = "email";
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getClientId() {
|
||||||
|
return this.clientId;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setClientId(String clientId) {
|
||||||
|
this.clientId = clientId;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getClientSecret() {
|
||||||
|
return this.clientSecret;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setClientSecret(String clientSecret) {
|
||||||
|
this.clientSecret = clientSecret;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Collection<String> getScopes() {
|
||||||
|
if (scopes == null || scopes.isEmpty()) {
|
||||||
|
scopes = new ArrayList<>();
|
||||||
|
scopes.add("https://www.googleapis.com/auth/userinfo.email");
|
||||||
|
scopes.add("https://www.googleapis.com/auth/userinfo.profile");
|
||||||
|
}
|
||||||
|
return scopes;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setScopes(String scopes) {
|
||||||
|
this.scopes =
|
||||||
|
Arrays.stream(scopes.split(",")).map(String::trim).collect(Collectors.toList());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getUseAsUsername() {
|
||||||
|
return this.useAsUsername;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setUseAsUsername(String useAsUsername) {
|
||||||
|
this.useAsUsername = useAsUsername;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return "Google [clientId="
|
||||||
|
+ clientId
|
||||||
|
+ ", clientSecret="
|
||||||
|
+ (clientSecret != null && !clientSecret.isEmpty() ? "MASKED" : "NULL")
|
||||||
|
+ ", scopes="
|
||||||
|
+ scopes
|
||||||
|
+ ", useAsUsername="
|
||||||
|
+ useAsUsername
|
||||||
|
+ "]";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getName() {
|
||||||
|
return "google";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getClientName() {
|
||||||
|
return "Google";
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isSettingsValid() {
|
||||||
|
return super.isValid(this.getClientId(), "clientId")
|
||||||
|
&& super.isValid(this.getClientSecret(), "clientSecret")
|
||||||
|
&& super.isValid(this.getScopes(), "scopes")
|
||||||
|
&& isValid(this.getUseAsUsername(), "useAsUsername");
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,106 @@
|
|||||||
|
package stirling.software.SPDF.model.provider;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
import stirling.software.SPDF.model.Provider;
|
||||||
|
|
||||||
|
public class KeycloakProvider extends Provider {
|
||||||
|
|
||||||
|
private String issuer;
|
||||||
|
private String clientId;
|
||||||
|
private String clientSecret;
|
||||||
|
private Collection<String> scopes = new ArrayList<>();
|
||||||
|
private String useAsUsername = "email";
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getIssuer() {
|
||||||
|
return this.issuer;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setIssuer(String issuer) {
|
||||||
|
this.issuer = issuer;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getClientId() {
|
||||||
|
return this.clientId;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setClientId(String clientId) {
|
||||||
|
this.clientId = clientId;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getClientSecret() {
|
||||||
|
return this.clientSecret;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setClientSecret(String clientSecret) {
|
||||||
|
this.clientSecret = clientSecret;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Collection<String> getScopes() {
|
||||||
|
if (scopes == null || scopes.isEmpty()) {
|
||||||
|
scopes = new ArrayList<>();
|
||||||
|
scopes.add("profile");
|
||||||
|
scopes.add("email");
|
||||||
|
}
|
||||||
|
return scopes;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setScopes(String scopes) {
|
||||||
|
this.scopes =
|
||||||
|
Arrays.stream(scopes.split(",")).map(String::trim).collect(Collectors.toList());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getUseAsUsername() {
|
||||||
|
return this.useAsUsername;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setUseAsUsername(String useAsUsername) {
|
||||||
|
this.useAsUsername = useAsUsername;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return "Keycloak [issuer="
|
||||||
|
+ issuer
|
||||||
|
+ ", clientId="
|
||||||
|
+ clientId
|
||||||
|
+ ", clientSecret="
|
||||||
|
+ (clientSecret != null && !clientSecret.isEmpty() ? "MASKED" : "NULL")
|
||||||
|
+ ", scopes="
|
||||||
|
+ scopes
|
||||||
|
+ ", useAsUsername="
|
||||||
|
+ useAsUsername
|
||||||
|
+ "]";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getName() {
|
||||||
|
return "keycloak";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getClientName() {
|
||||||
|
return "Keycloak";
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isSettingsValid() {
|
||||||
|
return isValid(this.getIssuer(), "issuer")
|
||||||
|
&& isValid(this.getClientId(), "clientId")
|
||||||
|
&& isValid(this.getClientSecret(), "clientSecret")
|
||||||
|
&& isValid(this.getScopes(), "scopes")
|
||||||
|
&& isValid(this.getUseAsUsername(), "useAsUsername");
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
package stirling.software.SPDF.model.provider;
|
||||||
|
|
||||||
|
public class UnsupportedProviderException extends Exception {
|
||||||
|
public UnsupportedProviderException(String message) {
|
||||||
|
super(message);
|
||||||
|
}
|
||||||
|
}
|
||||||
50
src/main/java/stirling/software/SPDF/utils/FileInfo.java
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
package stirling.software.SPDF.utils;
|
||||||
|
|
||||||
|
import java.nio.file.Path;
|
||||||
|
import java.nio.file.Paths;
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
import java.time.format.DateTimeFormatter;
|
||||||
|
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
@AllArgsConstructor
|
||||||
|
@Data
|
||||||
|
public class FileInfo {
|
||||||
|
private String fileName;
|
||||||
|
private String filePath;
|
||||||
|
private LocalDateTime modificationDate;
|
||||||
|
private long fileSize;
|
||||||
|
private LocalDateTime creationDate;
|
||||||
|
|
||||||
|
private static final DateTimeFormatter DATE_FORMATTER =
|
||||||
|
DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
|
||||||
|
|
||||||
|
// Converts the file path string to a Path object.
|
||||||
|
public Path getFilePathAsPath() {
|
||||||
|
return Paths.get(filePath);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Formats the file size into a human-readable string.
|
||||||
|
public String getFormattedFileSize() {
|
||||||
|
if (fileSize >= 1024 * 1024 * 1024) {
|
||||||
|
return String.format("%.2f GB", fileSize / (1024.0 * 1024 * 1024));
|
||||||
|
} else if (fileSize >= 1024 * 1024) {
|
||||||
|
return String.format("%.2f MB", fileSize / (1024.0 * 1024));
|
||||||
|
} else if (fileSize >= 1024) {
|
||||||
|
return String.format("%.2f KB", fileSize / 1024.0);
|
||||||
|
} else {
|
||||||
|
return String.format("%d Bytes", fileSize);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Formats the modification date to a string.
|
||||||
|
public String getFormattedModificationDate() {
|
||||||
|
return modificationDate.format(DATE_FORMATTER);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Formats the creation date to a string.
|
||||||
|
public String getFormattedCreationDate() {
|
||||||
|
return creationDate.format(DATE_FORMATTER);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -140,6 +140,8 @@ public class PDFToFile {
|
|||||||
new ArrayList<>(
|
new ArrayList<>(
|
||||||
Arrays.asList(
|
Arrays.asList(
|
||||||
"soffice",
|
"soffice",
|
||||||
|
"--headless",
|
||||||
|
"--nologo",
|
||||||
"--infilter=" + libreOfficeFilter,
|
"--infilter=" + libreOfficeFilter,
|
||||||
"--convert-to",
|
"--convert-to",
|
||||||
outputFormat,
|
outputFormat,
|
||||||
|
|||||||
@@ -1,27 +1,27 @@
|
|||||||
package stirling.software.SPDF.utils;
|
package stirling.software.SPDF.utils;
|
||||||
|
|
||||||
import java.awt.Graphics;
|
import java.awt.*;
|
||||||
import java.awt.image.BufferedImage;
|
import java.awt.image.BufferedImage;
|
||||||
import java.awt.image.RenderedImage;
|
import java.awt.image.RenderedImage;
|
||||||
import java.io.ByteArrayOutputStream;
|
import java.io.ByteArrayOutputStream;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Calendar;
|
import java.util.Calendar;
|
||||||
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.zip.ZipEntry;
|
import java.util.zip.ZipEntry;
|
||||||
import java.util.zip.ZipOutputStream;
|
import java.util.zip.ZipOutputStream;
|
||||||
|
|
||||||
import javax.imageio.IIOImage;
|
import javax.imageio.*;
|
||||||
import javax.imageio.ImageIO;
|
|
||||||
import javax.imageio.ImageReader;
|
|
||||||
import javax.imageio.ImageWriteParam;
|
|
||||||
import javax.imageio.ImageWriter;
|
|
||||||
import javax.imageio.stream.ImageOutputStream;
|
import javax.imageio.stream.ImageOutputStream;
|
||||||
|
|
||||||
import org.apache.pdfbox.Loader;
|
import org.apache.pdfbox.Loader;
|
||||||
import org.apache.pdfbox.cos.COSName;
|
import org.apache.pdfbox.cos.COSName;
|
||||||
import org.apache.pdfbox.pdmodel.*;
|
import org.apache.pdfbox.pdmodel.PDDocument;
|
||||||
|
import org.apache.pdfbox.pdmodel.PDPage;
|
||||||
|
import org.apache.pdfbox.pdmodel.PDPageContentStream;
|
||||||
import org.apache.pdfbox.pdmodel.PDPageContentStream.AppendMode;
|
import org.apache.pdfbox.pdmodel.PDPageContentStream.AppendMode;
|
||||||
|
import org.apache.pdfbox.pdmodel.PDResources;
|
||||||
import org.apache.pdfbox.pdmodel.common.PDRectangle;
|
import org.apache.pdfbox.pdmodel.common.PDRectangle;
|
||||||
import org.apache.pdfbox.pdmodel.graphics.PDXObject;
|
import org.apache.pdfbox.pdmodel.graphics.PDXObject;
|
||||||
import org.apache.pdfbox.pdmodel.graphics.form.PDFormXObject;
|
import org.apache.pdfbox.pdmodel.graphics.form.PDFormXObject;
|
||||||
@@ -245,19 +245,64 @@ public class PdfUtils {
|
|||||||
writer.dispose();
|
writer.dispose();
|
||||||
} else {
|
} else {
|
||||||
// Combine all images into a single big image
|
// Combine all images into a single big image
|
||||||
BufferedImage image = pdfRenderer.renderImageWithDPI(0, DPI, colorType);
|
|
||||||
|
// Calculate the combined image dimensions
|
||||||
|
int maxWidth = 0;
|
||||||
|
int totalHeight = 0;
|
||||||
|
|
||||||
|
BufferedImage pdfSizeImage = null;
|
||||||
|
int pdfSizeImageIndex = -1;
|
||||||
|
|
||||||
|
// Using a map to store the rendered dimensions of each page size
|
||||||
|
// to avoid rendering the same page sizes multiple times
|
||||||
|
HashMap<PdfRenderSettingsKey, PdfImageDimensionValue> pageSizes =
|
||||||
|
new HashMap<>();
|
||||||
|
for (int i = 0; i < pageCount; ++i) {
|
||||||
|
PDPage page = document.getPage(i);
|
||||||
|
PDRectangle mediaBox = page.getMediaBox();
|
||||||
|
int rotation = page.getRotation();
|
||||||
|
PdfRenderSettingsKey settings =
|
||||||
|
new PdfRenderSettingsKey(
|
||||||
|
mediaBox.getWidth(), mediaBox.getHeight(), rotation);
|
||||||
|
PdfImageDimensionValue dimension = pageSizes.get(settings);
|
||||||
|
if (dimension == null) {
|
||||||
|
// Render the image to get the dimensions
|
||||||
|
pdfSizeImage = pdfRenderer.renderImageWithDPI(i, DPI, colorType);
|
||||||
|
pdfSizeImageIndex = i;
|
||||||
|
dimension =
|
||||||
|
new PdfImageDimensionValue(
|
||||||
|
pdfSizeImage.getWidth(), pdfSizeImage.getHeight());
|
||||||
|
pageSizes.put(settings, dimension);
|
||||||
|
if (pdfSizeImage.getWidth() > maxWidth) {
|
||||||
|
maxWidth = pdfSizeImage.getWidth();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
totalHeight += dimension.height();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create a new BufferedImage to store the combined images
|
||||||
BufferedImage combined =
|
BufferedImage combined =
|
||||||
new BufferedImage(
|
prepareImageForPdfToImage(maxWidth, totalHeight, imageType);
|
||||||
image.getWidth(),
|
|
||||||
image.getHeight() * pageCount,
|
|
||||||
BufferedImage.TYPE_INT_RGB);
|
|
||||||
Graphics g = combined.getGraphics();
|
Graphics g = combined.getGraphics();
|
||||||
|
|
||||||
|
int currentHeight = 0;
|
||||||
|
BufferedImage pageImage;
|
||||||
|
|
||||||
|
// Check if the first image is the last rendered image
|
||||||
|
boolean firstImageAlreadyRendered = pdfSizeImageIndex == 0;
|
||||||
|
|
||||||
for (int i = 0; i < pageCount; ++i) {
|
for (int i = 0; i < pageCount; ++i) {
|
||||||
if (i != 0) {
|
if (firstImageAlreadyRendered && i == 0) {
|
||||||
image = pdfRenderer.renderImageWithDPI(i, DPI, colorType);
|
pageImage = pdfSizeImage;
|
||||||
|
} else {
|
||||||
|
pageImage = pdfRenderer.renderImageWithDPI(i, DPI, colorType);
|
||||||
}
|
}
|
||||||
g.drawImage(image, 0, i * image.getHeight(), null);
|
|
||||||
|
// Calculate the x-coordinate to center the image
|
||||||
|
int x = (maxWidth - pageImage.getWidth()) / 2;
|
||||||
|
|
||||||
|
g.drawImage(pageImage, x, currentHeight, null);
|
||||||
|
currentHeight += pageImage.getHeight();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Write the image to the output stream
|
// Write the image to the output stream
|
||||||
@@ -296,6 +341,23 @@ public class PdfUtils {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static BufferedImage prepareImageForPdfToImage(
|
||||||
|
int maxWidth, int height, String imageType) {
|
||||||
|
BufferedImage combined;
|
||||||
|
if ("png".equalsIgnoreCase(imageType)) {
|
||||||
|
combined = new BufferedImage(maxWidth, height, BufferedImage.TYPE_INT_ARGB);
|
||||||
|
} else {
|
||||||
|
combined = new BufferedImage(maxWidth, height, BufferedImage.TYPE_INT_RGB);
|
||||||
|
}
|
||||||
|
if (!"png".equalsIgnoreCase(imageType)) {
|
||||||
|
Graphics g = combined.getGraphics();
|
||||||
|
g.setColor(Color.WHITE);
|
||||||
|
g.fillRect(0, 0, combined.getWidth(), combined.getHeight());
|
||||||
|
g.dispose();
|
||||||
|
}
|
||||||
|
return combined;
|
||||||
|
}
|
||||||
|
|
||||||
public static byte[] imageToPdf(
|
public static byte[] imageToPdf(
|
||||||
MultipartFile[] files, String fitOption, boolean autoRotate, String colorType)
|
MultipartFile[] files, String fitOption, boolean autoRotate, String colorType)
|
||||||
throws IOException {
|
throws IOException {
|
||||||
@@ -443,4 +505,10 @@ public class PdfUtils {
|
|||||||
pdf.getDocumentInformation().setCreationDate(pdfMetadata.getCreationDate());
|
pdf.getDocumentInformation().setCreationDate(pdfMetadata.getCreationDate());
|
||||||
pdf.getDocumentInformation().setModificationDate(Calendar.getInstance());
|
pdf.getDocumentInformation().setModificationDate(Calendar.getInstance());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Key for storing the dimensions of a rendered image in a map. */
|
||||||
|
private record PdfRenderSettingsKey(float mediaBoxWidth, float mediaBoxHeight, int rotation) {}
|
||||||
|
|
||||||
|
/** Value for storing the dimensions of a rendered image in a map. */
|
||||||
|
private record PdfImageDimensionValue(int width, int height) {}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,7 +10,22 @@ public class RequestUriUtils {
|
|||||||
|| requestURI.startsWith("/images/")
|
|| requestURI.startsWith("/images/")
|
||||||
|| requestURI.startsWith("/public/")
|
|| requestURI.startsWith("/public/")
|
||||||
|| requestURI.startsWith("/pdfjs/")
|
|| requestURI.startsWith("/pdfjs/")
|
||||||
|
|| requestURI.startsWith("/pdfjs-legacy/")
|
||||||
|| requestURI.endsWith(".svg")
|
|| requestURI.endsWith(".svg")
|
||||||
|
|| requestURI.endsWith(".webmanifest")
|
||||||
|| requestURI.startsWith("/api/v1/info/status");
|
|| requestURI.startsWith("/api/v1/info/status");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static boolean isStaticResource(String contextPath, String requestURI) {
|
||||||
|
|
||||||
|
return requestURI.startsWith(contextPath + "/css/")
|
||||||
|
|| requestURI.startsWith(contextPath + "/fonts/")
|
||||||
|
|| requestURI.startsWith(contextPath + "/js/")
|
||||||
|
|| requestURI.startsWith(contextPath + "/images/")
|
||||||
|
|| requestURI.startsWith(contextPath + "/public/")
|
||||||
|
|| requestURI.startsWith(contextPath + "/pdfjs/")
|
||||||
|
|| requestURI.endsWith(".svg")
|
||||||
|
|| requestURI.endsWith(".webmanifest")
|
||||||
|
|| requestURI.startsWith(contextPath + "/api/v1/info/status");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,8 +4,7 @@ import jakarta.servlet.http.HttpServletRequest;
|
|||||||
|
|
||||||
public class UrlUtils {
|
public class UrlUtils {
|
||||||
|
|
||||||
private UrlUtils() {
|
private UrlUtils() {}
|
||||||
}
|
|
||||||
|
|
||||||
public static String getOrigin(HttpServletRequest request) {
|
public static String getOrigin(HttpServletRequest request) {
|
||||||
String scheme = request.getScheme(); // http or https
|
String scheme = request.getScheme(); // http or https
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ saveToBrowser=Save to Browser
|
|||||||
close=إغلاق
|
close=إغلاق
|
||||||
filesSelected=الملفات المحددة
|
filesSelected=الملفات المحددة
|
||||||
noFavourites=لم تتم إضافة أي مفضلات
|
noFavourites=لم تتم إضافة أي مفضلات
|
||||||
downloadComplete=Download Complete
|
downloadComplete=إكتمل التحميل
|
||||||
bored=الانتظار بالملل؟
|
bored=الانتظار بالملل؟
|
||||||
alphabet=الأبجدية
|
alphabet=الأبجدية
|
||||||
downloadPdf=تنزيل PDF
|
downloadPdf=تنزيل PDF
|
||||||
@@ -29,47 +29,48 @@ text=نص
|
|||||||
font=الخط
|
font=الخط
|
||||||
selectFillter=- حدد -
|
selectFillter=- حدد -
|
||||||
pageNum=رقم الصفحة
|
pageNum=رقم الصفحة
|
||||||
sizes.small=Small
|
sizes.small=صغير
|
||||||
sizes.medium=Medium
|
sizes.medium=وسط
|
||||||
sizes.large=Large
|
sizes.large=كبير
|
||||||
sizes.x-large=X-Large
|
sizes.x-large=كبير جدا
|
||||||
error.pdfPassword=The PDF Document is passworded and either the password was not provided or was incorrect
|
error.pdfPassword=The PDF Document is passworded and either the password was not provided or was incorrect
|
||||||
delete=Delete
|
delete=حذف
|
||||||
username=Username
|
username=اسم المستخدم
|
||||||
password=Password
|
password=كلمة المرور
|
||||||
welcome=Welcome
|
welcome=مرحبا
|
||||||
property=Property
|
property=Property
|
||||||
black=Black
|
black=أسود
|
||||||
white=White
|
white=أبيض
|
||||||
red=Red
|
red=أحمر
|
||||||
green=Green
|
green=أخضر
|
||||||
blue=Blue
|
blue=أزرق
|
||||||
custom=Custom...
|
custom=Custom...
|
||||||
WorkInProgess=Work in progress, May not work or be buggy, Please report any problems!
|
WorkInProgess=Work in progress, May not work or be buggy, Please report any problems!
|
||||||
poweredBy=Powered by
|
poweredBy=Powered by
|
||||||
yes=Yes
|
yes=نعم
|
||||||
no=No
|
no=لا
|
||||||
changedCredsMessage=Credentials changed!
|
changedCredsMessage=Credentials changed!
|
||||||
notAuthenticatedMessage=User not authenticated.
|
notAuthenticatedMessage=User not authenticated.
|
||||||
userNotFoundMessage=User not found.
|
userNotFoundMessage=User not found.
|
||||||
incorrectPasswordMessage=Current password is incorrect.
|
incorrectPasswordMessage=Current password is incorrect.
|
||||||
usernameExistsMessage=New Username already exists.
|
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.
|
invalidUsernameMessage=Invalid username, username can only contain letters, numbers and the following special characters @._+- or must be a valid email address.
|
||||||
|
confirmPasswordErrorMessage=New Password and Confirm New Password must match.
|
||||||
deleteCurrentUserMessage=Cannot delete currently logged in user.
|
deleteCurrentUserMessage=Cannot delete currently logged in user.
|
||||||
deleteUsernameExistsMessage=The username does not exist and cannot be deleted.
|
deleteUsernameExistsMessage=The username does not exist and cannot be deleted.
|
||||||
downgradeCurrentUserMessage=لا يمكن خفض دور المستخدم الحالي
|
downgradeCurrentUserMessage=لا يمكن خفض دور المستخدم الحالي
|
||||||
downgradeCurrentUserLongMessage=لا يمكن تخفيض دور المستخدم الحالي. وبالتالي، لن يظهر المستخدم الحالي.
|
downgradeCurrentUserLongMessage=لا يمكن تخفيض دور المستخدم الحالي. وبالتالي، لن يظهر المستخدم الحالي.
|
||||||
userAlreadyExistsOAuthMessage=The user already exists as an OAuth2 user.
|
userAlreadyExistsOAuthMessage=The user already exists as an OAuth2 user.
|
||||||
userAlreadyExistsWebMessage=The user already exists as an web user.
|
userAlreadyExistsWebMessage=The user already exists as an web user.
|
||||||
error=Error
|
error=خطأ
|
||||||
oops=Oops!
|
oops=Oops!
|
||||||
help=Help
|
help=مساعدة
|
||||||
goHomepage=Go to Homepage
|
goHomepage=الى الصفحة الرئيسية
|
||||||
joinDiscord=Join our Discord server
|
joinDiscord=Join our Discord server
|
||||||
seeDockerHub=See Docker Hub
|
seeDockerHub=See Docker Hub
|
||||||
visitGithub=Visit Github Repository
|
visitGithub=Visit Github Repository
|
||||||
donate=Donate
|
donate=Donate
|
||||||
color=Color
|
color=لون
|
||||||
sponsor=Sponsor
|
sponsor=Sponsor
|
||||||
info=Info
|
info=Info
|
||||||
|
|
||||||
@@ -85,6 +86,7 @@ pipeline.defaultOption=Custom
|
|||||||
pipeline.submitButton=Submit
|
pipeline.submitButton=Submit
|
||||||
pipeline.help=Pipeline Help
|
pipeline.help=Pipeline Help
|
||||||
pipeline.scanHelp=Folder Scanning Help
|
pipeline.scanHelp=Folder Scanning Help
|
||||||
|
pipeline.deletePrompt=Are you sure you want to delete pipeline
|
||||||
|
|
||||||
######################
|
######################
|
||||||
# Pipeline Options #
|
# Pipeline Options #
|
||||||
@@ -107,15 +109,15 @@ pipelineOptions.validateButton=Validate
|
|||||||
#############
|
#############
|
||||||
navbar.favorite=Favorites
|
navbar.favorite=Favorites
|
||||||
navbar.darkmode=الوضع الداكن
|
navbar.darkmode=الوضع الداكن
|
||||||
navbar.language=Languages
|
navbar.language=اللغات
|
||||||
navbar.settings=إعدادات
|
navbar.settings=إعدادات
|
||||||
navbar.allTools=Tools
|
navbar.allTools=أدوات
|
||||||
navbar.multiTool=Multi Tools
|
navbar.multiTool=Multi Tools
|
||||||
navbar.sections.organize=Organize
|
navbar.sections.organize=Organize
|
||||||
navbar.sections.convertTo=Convert to PDF
|
navbar.sections.convertTo=تحويل الى PDF
|
||||||
navbar.sections.convertFrom=Convert from PDF
|
navbar.sections.convertFrom=Convert from PDF
|
||||||
navbar.sections.security=Sign & Security
|
navbar.sections.security=Sign & Security
|
||||||
navbar.sections.advance=Advanced
|
navbar.sections.advance=متقدم
|
||||||
navbar.sections.edit=View & Edit
|
navbar.sections.edit=View & Edit
|
||||||
|
|
||||||
#############
|
#############
|
||||||
@@ -131,7 +133,7 @@ settings.downloadOption.2=فتح في نافذة جديدة
|
|||||||
settings.downloadOption.3=تنزيل الملف
|
settings.downloadOption.3=تنزيل الملف
|
||||||
settings.zipThreshold=ملفات مضغوطة عند تجاوز عدد الملفات التي تم تنزيلها
|
settings.zipThreshold=ملفات مضغوطة عند تجاوز عدد الملفات التي تم تنزيلها
|
||||||
settings.signOut=Sign Out
|
settings.signOut=Sign Out
|
||||||
settings.accountSettings=Account Settings
|
settings.accountSettings=اعدادات الحساب
|
||||||
settings.bored.help=Enables easter egg game
|
settings.bored.help=Enables easter egg game
|
||||||
settings.cacheInputs.name=Save form inputs
|
settings.cacheInputs.name=Save form inputs
|
||||||
settings.cacheInputs.help=Enable to store previously used inputs for future runs
|
settings.cacheInputs.help=Enable to store previously used inputs for future runs
|
||||||
@@ -139,10 +141,10 @@ settings.cacheInputs.help=Enable to store previously used inputs for future runs
|
|||||||
changeCreds.title=Change Credentials
|
changeCreds.title=Change Credentials
|
||||||
changeCreds.header=Update Your Account Details
|
changeCreds.header=Update Your Account Details
|
||||||
changeCreds.changePassword=You are using default login credentials. Please enter a new password
|
changeCreds.changePassword=You are using default login credentials. Please enter a new password
|
||||||
changeCreds.newUsername=New Username
|
changeCreds.newUsername=مستخدم جديد
|
||||||
changeCreds.oldPassword=Current Password
|
changeCreds.oldPassword=كلمة المرور الحالية
|
||||||
changeCreds.newPassword=New Password
|
changeCreds.newPassword=كلمة المرور الجديدة
|
||||||
changeCreds.confirmNewPassword=Confirm New Password
|
changeCreds.confirmNewPassword=تأكيد كلمة المرور الجديدة
|
||||||
changeCreds.submit=Submit Changes
|
changeCreds.submit=Submit Changes
|
||||||
|
|
||||||
|
|
||||||
@@ -173,6 +175,8 @@ adminUserSettings.header=Admin User Control Settings
|
|||||||
adminUserSettings.admin=Admin
|
adminUserSettings.admin=Admin
|
||||||
adminUserSettings.user=User
|
adminUserSettings.user=User
|
||||||
adminUserSettings.addUser=Add New User
|
adminUserSettings.addUser=Add New User
|
||||||
|
adminUserSettings.deleteUser=Delete User
|
||||||
|
adminUserSettings.confirmDeleteUser=Should the user be deleted?
|
||||||
adminUserSettings.usernameInfo=Username can only contain letters, numbers and the following special characters @._+- or must be a valid email address.
|
adminUserSettings.usernameInfo=Username can only contain letters, numbers and the following special characters @._+- or must be a valid email address.
|
||||||
adminUserSettings.roles=Roles
|
adminUserSettings.roles=Roles
|
||||||
adminUserSettings.role=Role
|
adminUserSettings.role=Role
|
||||||
@@ -187,6 +191,23 @@ adminUserSettings.submit=Save User
|
|||||||
adminUserSettings.changeUserRole=تغيير دور المستخدم
|
adminUserSettings.changeUserRole=تغيير دور المستخدم
|
||||||
adminUserSettings.authenticated=Authenticated
|
adminUserSettings.authenticated=Authenticated
|
||||||
|
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
#############
|
#############
|
||||||
# HOME-PAGE #
|
# HOME-PAGE #
|
||||||
#############
|
#############
|
||||||
@@ -491,9 +512,9 @@ pdfToSinglePage.submit=Convert To Single Page
|
|||||||
|
|
||||||
|
|
||||||
#pageExtracter
|
#pageExtracter
|
||||||
pageExtracter.title=Extract Pages
|
pageExtracter.title=استخراج الصفحات
|
||||||
pageExtracter.header=Extract Pages
|
pageExtracter.header=استخراج الصفحات
|
||||||
pageExtracter.submit=Extract
|
pageExtracter.submit=استخراج
|
||||||
pageExtracter.placeholder=(e.g. 1,2,8 or 4,7,12-16 or 2n-1)
|
pageExtracter.placeholder=(e.g. 1,2,8 or 4,7,12-16 or 2n-1)
|
||||||
|
|
||||||
|
|
||||||
@@ -501,7 +522,7 @@ pageExtracter.placeholder=(e.g. 1,2,8 or 4,7,12-16 or 2n-1)
|
|||||||
getPdfInfo.title=Get Info on PDF
|
getPdfInfo.title=Get Info on PDF
|
||||||
getPdfInfo.header=Get Info on PDF
|
getPdfInfo.header=Get Info on PDF
|
||||||
getPdfInfo.submit=Get Info
|
getPdfInfo.submit=Get Info
|
||||||
getPdfInfo.downloadJson=Download JSON
|
getPdfInfo.downloadJson=تحميل JSON
|
||||||
|
|
||||||
|
|
||||||
#markdown-to-pdf
|
#markdown-to-pdf
|
||||||
@@ -679,12 +700,14 @@ removeBlanks.submit=إزالة الفراغات
|
|||||||
#removeAnnotations
|
#removeAnnotations
|
||||||
removeAnnotations.title=Remove Annotations
|
removeAnnotations.title=Remove Annotations
|
||||||
removeAnnotations.header=Remove Annotations
|
removeAnnotations.header=Remove Annotations
|
||||||
removeAnnotations.submit=Remove
|
removeAnnotations.submit=إزالة
|
||||||
|
|
||||||
|
|
||||||
#compare
|
#compare
|
||||||
compare.title=يقارن
|
compare.title=يقارن
|
||||||
compare.header=قارن ملفات PDF
|
compare.header=قارن ملفات PDF
|
||||||
|
compare.highlightColor.1=Highlight Color 1:
|
||||||
|
compare.highlightColor.2=Highlight Color 2:
|
||||||
compare.document.1=المستند 1
|
compare.document.1=المستند 1
|
||||||
compare.document.2=المستند 2
|
compare.document.2=المستند 2
|
||||||
compare.submit=يقارن
|
compare.submit=يقارن
|
||||||
@@ -797,8 +820,9 @@ addImage.submit=إضافة صورة
|
|||||||
#merge
|
#merge
|
||||||
merge.title=دمج
|
merge.title=دمج
|
||||||
merge.header=دمج ملفات PDF متعددة (2+)
|
merge.header=دمج ملفات PDF متعددة (2+)
|
||||||
merge.sortByName=Sort by name
|
merge.sortByName=الترتيب حسب الإسم
|
||||||
merge.sortByDate=Sort by date
|
merge.sortByDate=الترتيب حسب التاريخ
|
||||||
|
merge.removeCertSign=Remove digital signature in the merged file?
|
||||||
merge.submit=دمج
|
merge.submit=دمج
|
||||||
|
|
||||||
|
|
||||||
@@ -816,13 +840,14 @@ pdfOrganiser.mode.6=Odd-Even Split
|
|||||||
pdfOrganiser.mode.7=Remove First
|
pdfOrganiser.mode.7=Remove First
|
||||||
pdfOrganiser.mode.8=Remove Last
|
pdfOrganiser.mode.8=Remove Last
|
||||||
pdfOrganiser.mode.9=Remove First and 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.placeholder=(e.g. 1,3,2 or 4-8,2,10-12 or 2n-1)
|
||||||
|
|
||||||
|
|
||||||
#multiTool
|
#multiTool
|
||||||
multiTool.title=أداة متعددة PDF
|
multiTool.title=أداة متعددة PDF
|
||||||
multiTool.header=أداة متعددة PDF
|
multiTool.header=أداة متعددة PDF
|
||||||
multiTool.uploadPrompts=File Name
|
multiTool.uploadPrompts=إسم الملف
|
||||||
|
|
||||||
#view pdf
|
#view pdf
|
||||||
viewPdf.title=View PDF
|
viewPdf.title=View PDF
|
||||||
@@ -863,7 +888,7 @@ imageToPDF.title=صورة إلى PDF
|
|||||||
imageToPDF.header=صورة إلى PDF
|
imageToPDF.header=صورة إلى PDF
|
||||||
imageToPDF.submit=تحول
|
imageToPDF.submit=تحول
|
||||||
imageToPDF.selectLabel=Image Fit Options
|
imageToPDF.selectLabel=Image Fit Options
|
||||||
imageToPDF.fillPage=Fill Page
|
imageToPDF.fillPage=امل الصفحة
|
||||||
imageToPDF.fitDocumentToImage=Fit Page to Image
|
imageToPDF.fitDocumentToImage=Fit Page to Image
|
||||||
imageToPDF.maintainAspectRatio=Maintain Aspect Ratios
|
imageToPDF.maintainAspectRatio=Maintain Aspect Ratios
|
||||||
imageToPDF.selectText.2=دوران PDF تلقائيًا
|
imageToPDF.selectText.2=دوران PDF تلقائيًا
|
||||||
@@ -902,7 +927,7 @@ addPassword.selectText.10=منع التعديل
|
|||||||
addPassword.selectText.11=منع تعديل التعليقات التوضيحية
|
addPassword.selectText.11=منع تعديل التعليقات التوضيحية
|
||||||
addPassword.selectText.12=منع الطباعة
|
addPassword.selectText.12=منع الطباعة
|
||||||
addPassword.selectText.13=منع طباعة تنسيقات مختلفة
|
addPassword.selectText.13=منع طباعة تنسيقات مختلفة
|
||||||
addPassword.selectText.14=Owner Password
|
addPassword.selectText.14=كلمة مرور المالك
|
||||||
addPassword.selectText.15=Restricts what can be done with the document once it is opened (Not supported by all readers)
|
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.16=Restricts the opening of the document itself
|
||||||
addPassword.submit=تشفير
|
addPassword.submit=تشفير
|
||||||
@@ -921,8 +946,8 @@ watermark.selectText.7=التعتيم (0٪ - 100٪):
|
|||||||
watermark.selectText.8=Watermark Type:
|
watermark.selectText.8=Watermark Type:
|
||||||
watermark.selectText.9=Watermark Image:
|
watermark.selectText.9=Watermark Image:
|
||||||
watermark.submit=إضافة علامة مائية
|
watermark.submit=إضافة علامة مائية
|
||||||
watermark.type.1=Text
|
watermark.type.1=نص
|
||||||
watermark.type.2=Image
|
watermark.type.2=صورة
|
||||||
|
|
||||||
|
|
||||||
#Change permissions
|
#Change permissions
|
||||||
@@ -1017,10 +1042,10 @@ PDFToXML.credit=تستخدم هذه الخدمة LibreOffice لتحويل الم
|
|||||||
PDFToXML.submit=تحويل
|
PDFToXML.submit=تحويل
|
||||||
|
|
||||||
#PDFToCSV
|
#PDFToCSV
|
||||||
PDFToCSV.title=PDF ??? CSV
|
PDFToCSV.title=PDF الى CSV
|
||||||
PDFToCSV.header=PDF ??? CSV
|
PDFToCSV.header=PDF الى CSV
|
||||||
PDFToCSV.prompt=Choose page to extract table
|
PDFToCSV.prompt=Choose page to extract table
|
||||||
PDFToCSV.submit=??????
|
PDFToCSV.submit=تحويل
|
||||||
|
|
||||||
#split-by-size-or-count
|
#split-by-size-or-count
|
||||||
split-by-size-or-count.title=Split PDF by Size or Count
|
split-by-size-or-count.title=Split PDF by Size or Count
|
||||||
@@ -1062,11 +1087,11 @@ split-by-sections.merge=Merge Into One PDF
|
|||||||
|
|
||||||
|
|
||||||
#printFile
|
#printFile
|
||||||
printFile.title=Print File
|
printFile.title=طباعة ملف
|
||||||
printFile.header=Print File to Printer
|
printFile.header=طباعة ملف بالطابعة
|
||||||
printFile.selectText.1=Select File to Print
|
printFile.selectText.1=تحديد ملف للطباعة
|
||||||
printFile.selectText.2=Enter Printer Name
|
printFile.selectText.2=ادخل اسم الطابعة
|
||||||
printFile.submit=Print
|
printFile.submit=طباعة
|
||||||
|
|
||||||
|
|
||||||
#licenses
|
#licenses
|
||||||
@@ -1077,6 +1102,15 @@ licenses.module=Module
|
|||||||
licenses.version=Version
|
licenses.version=Version
|
||||||
licenses.license=License
|
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.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
|
||||||
|
|
||||||
|
|
||||||
#error
|
#error
|
||||||
error.sorry=Sorry for the issue!
|
error.sorry=Sorry for the issue!
|
||||||
|
|||||||
@@ -55,6 +55,7 @@ userNotFoundMessage=Потребителят не е намерен
|
|||||||
incorrectPasswordMessage=Текущата парола е неправилна.
|
incorrectPasswordMessage=Текущата парола е неправилна.
|
||||||
usernameExistsMessage=Новият потребител вече съществува.
|
usernameExistsMessage=Новият потребител вече съществува.
|
||||||
invalidUsernameMessage=Невалидно потребителско име, потребителското име може да съдържа само букви, цифри и следните специални знаци @._+- или трябва да е валиден имейл адрес.
|
invalidUsernameMessage=Невалидно потребителско име, потребителското име може да съдържа само букви, цифри и следните специални знаци @._+- или трябва да е валиден имейл адрес.
|
||||||
|
confirmPasswordErrorMessage=New Password and Confirm New Password must match.
|
||||||
deleteCurrentUserMessage=Не може да се изтрие вписания в момента потребител.
|
deleteCurrentUserMessage=Не може да се изтрие вписания в момента потребител.
|
||||||
deleteUsernameExistsMessage=Потребителското име не съществува и не може да бъде изтрито.
|
deleteUsernameExistsMessage=Потребителското име не съществува и не може да бъде изтрито.
|
||||||
downgradeCurrentUserMessage=Не може да се понижи ролята на текущия потребител
|
downgradeCurrentUserMessage=Не може да се понижи ролята на текущия потребител
|
||||||
@@ -85,6 +86,7 @@ pipeline.defaultOption=Персонализиран
|
|||||||
pipeline.submitButton=Подайте
|
pipeline.submitButton=Подайте
|
||||||
pipeline.help=Pipeline Помощ
|
pipeline.help=Pipeline Помощ
|
||||||
pipeline.scanHelp=Помощ за сканиране на папки
|
pipeline.scanHelp=Помощ за сканиране на папки
|
||||||
|
pipeline.deletePrompt=Are you sure you want to delete pipeline
|
||||||
|
|
||||||
######################
|
######################
|
||||||
# Pipeline Options #
|
# Pipeline Options #
|
||||||
@@ -173,6 +175,8 @@ adminUserSettings.header=Настройки за администраторск
|
|||||||
adminUserSettings.admin=Администратор
|
adminUserSettings.admin=Администратор
|
||||||
adminUserSettings.user=Потребител
|
adminUserSettings.user=Потребител
|
||||||
adminUserSettings.addUser=Добавяне на нов потребител
|
adminUserSettings.addUser=Добавяне на нов потребител
|
||||||
|
adminUserSettings.deleteUser=Delete User
|
||||||
|
adminUserSettings.confirmDeleteUser=Should the user be deleted?
|
||||||
adminUserSettings.usernameInfo=Потребителското име може да съдържа само букви, цифри и следните специални символи @._+- или трябва да е валиден имейл адрес.
|
adminUserSettings.usernameInfo=Потребителското име може да съдържа само букви, цифри и следните специални символи @._+- или трябва да е валиден имейл адрес.
|
||||||
adminUserSettings.roles=Роли
|
adminUserSettings.roles=Роли
|
||||||
adminUserSettings.role=Роля
|
adminUserSettings.role=Роля
|
||||||
@@ -187,6 +191,23 @@ adminUserSettings.submit=Съхранете потребителя
|
|||||||
adminUserSettings.changeUserRole=Промяна на ролята на потребителя
|
adminUserSettings.changeUserRole=Промяна на ролята на потребителя
|
||||||
adminUserSettings.authenticated=Удостоверен
|
adminUserSettings.authenticated=Удостоверен
|
||||||
|
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
#############
|
#############
|
||||||
# HOME-PAGE #
|
# HOME-PAGE #
|
||||||
#############
|
#############
|
||||||
@@ -685,6 +706,8 @@ removeAnnotations.submit=Премахване
|
|||||||
#compare
|
#compare
|
||||||
compare.title=Сравнявай
|
compare.title=Сравнявай
|
||||||
compare.header=Сравнявай PDF-и
|
compare.header=Сравнявай PDF-и
|
||||||
|
compare.highlightColor.1=Highlight Color 1:
|
||||||
|
compare.highlightColor.2=Highlight Color 2:
|
||||||
compare.document.1=Документ 1
|
compare.document.1=Документ 1
|
||||||
compare.document.2=Документ 2
|
compare.document.2=Документ 2
|
||||||
compare.submit=Сравнявай
|
compare.submit=Сравнявай
|
||||||
@@ -799,6 +822,7 @@ merge.title=Обединяване
|
|||||||
merge.header=Обединяване на множество PDF файлове (2+)
|
merge.header=Обединяване на множество PDF файлове (2+)
|
||||||
merge.sortByName=Сортиране по име
|
merge.sortByName=Сортиране по име
|
||||||
merge.sortByDate=Сортиране по дата
|
merge.sortByDate=Сортиране по дата
|
||||||
|
merge.removeCertSign=Remove digital signature in the merged file?
|
||||||
merge.submit=Обединяване
|
merge.submit=Обединяване
|
||||||
|
|
||||||
|
|
||||||
@@ -816,6 +840,7 @@ pdfOrganiser.mode.6=Четно-нечетно разделяне
|
|||||||
pdfOrganiser.mode.7=Премахни първо
|
pdfOrganiser.mode.7=Премахни първо
|
||||||
pdfOrganiser.mode.8=Премахване на последния
|
pdfOrganiser.mode.8=Премахване на последния
|
||||||
pdfOrganiser.mode.9=Премахване на първия и последния
|
pdfOrganiser.mode.9=Премахване на първия и последния
|
||||||
|
pdfOrganiser.mode.10=Odd-Even Merge
|
||||||
pdfOrganiser.placeholder=(напр. 1,3,2 или 4-8,2,10-12 или 2n-1)
|
pdfOrganiser.placeholder=(напр. 1,3,2 или 4-8,2,10-12 или 2n-1)
|
||||||
|
|
||||||
|
|
||||||
@@ -1077,6 +1102,15 @@ licenses.module=Модул
|
|||||||
licenses.version=Версия
|
licenses.version=Версия
|
||||||
licenses.license=Лиценз
|
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.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
|
||||||
|
|
||||||
|
|
||||||
#error
|
#error
|
||||||
error.sorry=Извинете за проблема!
|
error.sorry=Извинете за проблема!
|
||||||
|
|||||||
@@ -55,6 +55,7 @@ userNotFoundMessage=User not found.
|
|||||||
incorrectPasswordMessage=Current password is incorrect.
|
incorrectPasswordMessage=Current password is incorrect.
|
||||||
usernameExistsMessage=New Username already exists.
|
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.
|
invalidUsernameMessage=Invalid username, username can only contain letters, numbers and the following special characters @._+- or must be a valid email address.
|
||||||
|
confirmPasswordErrorMessage=New Password and Confirm New Password must match.
|
||||||
deleteCurrentUserMessage=Cannot delete currently logged in user.
|
deleteCurrentUserMessage=Cannot delete currently logged in user.
|
||||||
deleteUsernameExistsMessage=The username does not exist and cannot be deleted.
|
deleteUsernameExistsMessage=The username does not exist and cannot be deleted.
|
||||||
downgradeCurrentUserMessage=No es pot reduir la funció de l'usuari actual
|
downgradeCurrentUserMessage=No es pot reduir la funció de l'usuari actual
|
||||||
@@ -85,6 +86,7 @@ pipeline.defaultOption=Custom
|
|||||||
pipeline.submitButton=Submit
|
pipeline.submitButton=Submit
|
||||||
pipeline.help=Pipeline Help
|
pipeline.help=Pipeline Help
|
||||||
pipeline.scanHelp=Folder Scanning Help
|
pipeline.scanHelp=Folder Scanning Help
|
||||||
|
pipeline.deletePrompt=Are you sure you want to delete pipeline
|
||||||
|
|
||||||
######################
|
######################
|
||||||
# Pipeline Options #
|
# Pipeline Options #
|
||||||
@@ -173,6 +175,8 @@ adminUserSettings.header=Usuari Admin Opcions Control
|
|||||||
adminUserSettings.admin=Admin
|
adminUserSettings.admin=Admin
|
||||||
adminUserSettings.user=Usuari
|
adminUserSettings.user=Usuari
|
||||||
adminUserSettings.addUser=Afegir Usuari
|
adminUserSettings.addUser=Afegir Usuari
|
||||||
|
adminUserSettings.deleteUser=Delete User
|
||||||
|
adminUserSettings.confirmDeleteUser=Should the user be deleted?
|
||||||
adminUserSettings.usernameInfo=Username can only contain letters, numbers and the following special characters @._+- or must be a valid email address.
|
adminUserSettings.usernameInfo=Username can only contain letters, numbers and the following special characters @._+- or must be a valid email address.
|
||||||
adminUserSettings.roles=Rols
|
adminUserSettings.roles=Rols
|
||||||
adminUserSettings.role=Rol
|
adminUserSettings.role=Rol
|
||||||
@@ -187,6 +191,23 @@ adminUserSettings.submit=Desar Usuari
|
|||||||
adminUserSettings.changeUserRole=Canvia el rol de l'usuari
|
adminUserSettings.changeUserRole=Canvia el rol de l'usuari
|
||||||
adminUserSettings.authenticated=Authenticated
|
adminUserSettings.authenticated=Authenticated
|
||||||
|
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
#############
|
#############
|
||||||
# HOME-PAGE #
|
# HOME-PAGE #
|
||||||
#############
|
#############
|
||||||
@@ -685,6 +706,8 @@ removeAnnotations.submit=Remove
|
|||||||
#compare
|
#compare
|
||||||
compare.title=Comparar
|
compare.title=Comparar
|
||||||
compare.header=Compara PDF
|
compare.header=Compara PDF
|
||||||
|
compare.highlightColor.1=Highlight Color 1:
|
||||||
|
compare.highlightColor.2=Highlight Color 2:
|
||||||
compare.document.1=Document 1
|
compare.document.1=Document 1
|
||||||
compare.document.2=Document 2
|
compare.document.2=Document 2
|
||||||
compare.submit=Comparar
|
compare.submit=Comparar
|
||||||
@@ -799,6 +822,7 @@ merge.title=Fusiona
|
|||||||
merge.header=Fusiona múltiples PDFs (2+)
|
merge.header=Fusiona múltiples PDFs (2+)
|
||||||
merge.sortByName=Sort by name
|
merge.sortByName=Sort by name
|
||||||
merge.sortByDate=Sort by date
|
merge.sortByDate=Sort by date
|
||||||
|
merge.removeCertSign=Remove digital signature in the merged file?
|
||||||
merge.submit=Fusiona
|
merge.submit=Fusiona
|
||||||
|
|
||||||
|
|
||||||
@@ -816,6 +840,7 @@ pdfOrganiser.mode.6=Odd-Even Split
|
|||||||
pdfOrganiser.mode.7=Remove First
|
pdfOrganiser.mode.7=Remove First
|
||||||
pdfOrganiser.mode.8=Remove Last
|
pdfOrganiser.mode.8=Remove Last
|
||||||
pdfOrganiser.mode.9=Remove First and 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.placeholder=(e.g. 1,3,2 or 4-8,2,10-12 or 2n-1)
|
||||||
|
|
||||||
|
|
||||||
@@ -1077,6 +1102,15 @@ licenses.module=Module
|
|||||||
licenses.version=Version
|
licenses.version=Version
|
||||||
licenses.license=License
|
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.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
|
||||||
|
|
||||||
|
|
||||||
#error
|
#error
|
||||||
error.sorry=Sorry for the issue!
|
error.sorry=Sorry for the issue!
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
###########
|
###########
|
||||||
# Generic #
|
# Generic #
|
||||||
###########
|
###########
|
||||||
# the direction that the language is written (ltr = left to right, rtl = right to left)
|
# the direction that the language is written (ltr=left to right, rtl = right to left)
|
||||||
language.direction=ltr
|
language.direction=ltr
|
||||||
|
|
||||||
pdfPrompt=Vyberte PDF soubory
|
pdfPrompt=Vyberte PDF soubory
|
||||||
@@ -55,6 +55,7 @@ userNotFoundMessage=Uživatel nenalezen.
|
|||||||
incorrectPasswordMessage=Současné heslo není správné.
|
incorrectPasswordMessage=Současné heslo není správné.
|
||||||
usernameExistsMessage=Nové uživatelské jméno již existuje.
|
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.
|
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.
|
||||||
|
confirmPasswordErrorMessage=New Password and Confirm New Password must match.
|
||||||
deleteCurrentUserMessage=Nelze smazat aktuální přihlášeného uživatele.
|
deleteCurrentUserMessage=Nelze smazat aktuální přihlášeného uživatele.
|
||||||
deleteUsernameExistsMessage=Uživatelské jméno neexistuje a nelze ho smazat.
|
deleteUsernameExistsMessage=Uživatelské jméno neexistuje a nelze ho smazat.
|
||||||
downgradeCurrentUserMessage=Nelze snížit roli aktuálního uživatele.
|
downgradeCurrentUserMessage=Nelze snížit roli aktuálního uživatele.
|
||||||
@@ -85,6 +86,7 @@ pipeline.defaultOption=Vlastní
|
|||||||
pipeline.submitButton=Odeslat
|
pipeline.submitButton=Odeslat
|
||||||
pipeline.help=Pomoc s pipeline
|
pipeline.help=Pomoc s pipeline
|
||||||
pipeline.scanHelp=Pomoc se skenováním adresáře
|
pipeline.scanHelp=Pomoc se skenováním adresáře
|
||||||
|
pipeline.deletePrompt=Are you sure you want to delete pipeline
|
||||||
|
|
||||||
######################
|
######################
|
||||||
# Pipeline Options #
|
# Pipeline Options #
|
||||||
@@ -173,6 +175,8 @@ adminUserSettings.header=Admin User Control Settings
|
|||||||
adminUserSettings.admin=Admin
|
adminUserSettings.admin=Admin
|
||||||
adminUserSettings.user=Uživatel
|
adminUserSettings.user=Uživatel
|
||||||
adminUserSettings.addUser=Přidat Nového Uživatele
|
adminUserSettings.addUser=Přidat Nového Uživatele
|
||||||
|
adminUserSettings.deleteUser=Delete User
|
||||||
|
adminUserSettings.confirmDeleteUser=Should the user be deleted?
|
||||||
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.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.roles=Role
|
||||||
adminUserSettings.role=Role
|
adminUserSettings.role=Role
|
||||||
@@ -187,10 +191,27 @@ adminUserSettings.submit=Uložit Uživatele
|
|||||||
adminUserSettings.changeUserRole=Zmenit Roli Uživatele
|
adminUserSettings.changeUserRole=Zmenit Roli Uživatele
|
||||||
adminUserSettings.authenticated=Ověřeno
|
adminUserSettings.authenticated=Ověřeno
|
||||||
|
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
#############
|
#############
|
||||||
# HOME-PAGE #
|
# HOME-PAGE #
|
||||||
#############
|
#############
|
||||||
home.desc= Vaše lokálně hostované jednotné kontaktní místo pro všechny vaše potřeby ve formátu PDF
|
home.desc=Vaše lokálně hostované jednotné kontaktní místo pro všechny vaše potřeby ve formátu PDF
|
||||||
home.searchBar=Hledej funkce...
|
home.searchBar=Hledej funkce...
|
||||||
|
|
||||||
|
|
||||||
@@ -685,6 +706,8 @@ removeAnnotations.submit=Odebrat
|
|||||||
#compare
|
#compare
|
||||||
compare.title=Porovnat
|
compare.title=Porovnat
|
||||||
compare.header=Porovnat PDF
|
compare.header=Porovnat PDF
|
||||||
|
compare.highlightColor.1=Highlight Color 1:
|
||||||
|
compare.highlightColor.2=Highlight Color 2:
|
||||||
compare.document.1=Dokument 1
|
compare.document.1=Dokument 1
|
||||||
compare.document.2=Dokument 2
|
compare.document.2=Dokument 2
|
||||||
compare.submit=Porovnat
|
compare.submit=Porovnat
|
||||||
@@ -799,6 +822,7 @@ merge.title=Sloučit
|
|||||||
merge.header=Sloučit více PDF (2+)
|
merge.header=Sloučit více PDF (2+)
|
||||||
merge.sortByName=Seřadit podle názvu
|
merge.sortByName=Seřadit podle názvu
|
||||||
merge.sortByDate=Seřadit podle data
|
merge.sortByDate=Seřadit podle data
|
||||||
|
merge.removeCertSign=Remove digital signature in the merged file?
|
||||||
merge.submit=Sloučit
|
merge.submit=Sloučit
|
||||||
|
|
||||||
|
|
||||||
@@ -816,6 +840,7 @@ pdfOrganiser.mode.6=Liché-Sudé rozdělení
|
|||||||
pdfOrganiser.mode.7=Odstranit první
|
pdfOrganiser.mode.7=Odstranit první
|
||||||
pdfOrganiser.mode.8=Odstranit poslední
|
pdfOrganiser.mode.8=Odstranit poslední
|
||||||
pdfOrganiser.mode.9=Odstranit první a poslední
|
pdfOrganiser.mode.9=Odstranit první a poslední
|
||||||
|
pdfOrganiser.mode.10=Odd-Even Merge
|
||||||
pdfOrganiser.placeholder=(např. 1,3,2 nebo 4-8,2,10-12 nebo 2n-1)
|
pdfOrganiser.placeholder=(např. 1,3,2 nebo 4-8,2,10-12 nebo 2n-1)
|
||||||
|
|
||||||
|
|
||||||
@@ -1077,6 +1102,15 @@ licenses.module=Modul
|
|||||||
licenses.version=Verze
|
licenses.version=Verze
|
||||||
licenses.license=Licence
|
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.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
|
||||||
|
|
||||||
|
|
||||||
#error
|
#error
|
||||||
error.sorry=Omlouváme se za potíže!
|
error.sorry=Omlouváme se za potíže!
|
||||||
|
|||||||
@@ -55,6 +55,7 @@ userNotFoundMessage=Benutzer nicht gefunden.
|
|||||||
incorrectPasswordMessage=Das Passwort ist falsch.
|
incorrectPasswordMessage=Das Passwort ist falsch.
|
||||||
usernameExistsMessage=Neuer Benutzername existiert bereits.
|
usernameExistsMessage=Neuer Benutzername existiert bereits.
|
||||||
invalidUsernameMessage=Ungültiger Benutzername. Der Benutzername darf nur Buchstaben, Zahlen und die folgenden Sonderzeichen @._+- enthalten oder muss eine gültige E-Mail-Adresse sein.
|
invalidUsernameMessage=Ungültiger Benutzername. Der Benutzername darf nur Buchstaben, Zahlen und die folgenden Sonderzeichen @._+- enthalten oder muss eine gültige E-Mail-Adresse sein.
|
||||||
|
confirmPasswordErrorMessage=„Neues Passwort“ und „Neues Passwort bestätigen“ müssen übereinstimmen.
|
||||||
deleteCurrentUserMessage=Der aktuell angemeldete Benutzer kann nicht gelöscht werden.
|
deleteCurrentUserMessage=Der aktuell angemeldete Benutzer kann nicht gelöscht werden.
|
||||||
deleteUsernameExistsMessage=Der Benutzername existiert nicht und kann nicht gelöscht werden.
|
deleteUsernameExistsMessage=Der Benutzername existiert nicht und kann nicht gelöscht werden.
|
||||||
downgradeCurrentUserMessage=Die Rolle des aktuellen Benutzers kann nicht herabgestuft werden
|
downgradeCurrentUserMessage=Die Rolle des aktuellen Benutzers kann nicht herabgestuft werden
|
||||||
@@ -85,6 +86,7 @@ pipeline.defaultOption=Benutzerdefiniert
|
|||||||
pipeline.submitButton=Speichern
|
pipeline.submitButton=Speichern
|
||||||
pipeline.help=Hilfe für Pipeline
|
pipeline.help=Hilfe für Pipeline
|
||||||
pipeline.scanHelp=Hilfe zum Ordnerscan
|
pipeline.scanHelp=Hilfe zum Ordnerscan
|
||||||
|
pipeline.deletePrompt=Möchten Sie die Pipeline wirklich löschen?
|
||||||
|
|
||||||
######################
|
######################
|
||||||
# Pipeline Options #
|
# Pipeline Options #
|
||||||
@@ -173,6 +175,8 @@ adminUserSettings.header=Administrator-Benutzerkontrolle
|
|||||||
adminUserSettings.admin=Administrator
|
adminUserSettings.admin=Administrator
|
||||||
adminUserSettings.user=Benutzer
|
adminUserSettings.user=Benutzer
|
||||||
adminUserSettings.addUser=Neuen Benutzer hinzufügen
|
adminUserSettings.addUser=Neuen Benutzer hinzufügen
|
||||||
|
adminUserSettings.deleteUser=Benutzer löschen
|
||||||
|
adminUserSettings.confirmDeleteUser=Soll der Benutzer gelöscht werden?
|
||||||
adminUserSettings.usernameInfo=Der Benutzername darf nur Buchstaben, Zahlen und die folgenden Sonderzeichen @._+- enthalten oder muss eine gültige E-Mail-Adresse sein.
|
adminUserSettings.usernameInfo=Der Benutzername darf nur Buchstaben, Zahlen und die folgenden Sonderzeichen @._+- enthalten oder muss eine gültige E-Mail-Adresse sein.
|
||||||
adminUserSettings.roles=Rollen
|
adminUserSettings.roles=Rollen
|
||||||
adminUserSettings.role=Rolle
|
adminUserSettings.role=Rolle
|
||||||
@@ -187,6 +191,23 @@ adminUserSettings.submit=Benutzer speichern
|
|||||||
adminUserSettings.changeUserRole=Benutzerrolle ändern
|
adminUserSettings.changeUserRole=Benutzerrolle ändern
|
||||||
adminUserSettings.authenticated=Authentifiziert
|
adminUserSettings.authenticated=Authentifiziert
|
||||||
|
|
||||||
|
|
||||||
|
database.title=Datenbank Import/Export
|
||||||
|
database.header=Datenbank Import/Export
|
||||||
|
database.fileName=Dateiname
|
||||||
|
database.creationDate=Erstellungsdatum
|
||||||
|
database.fileSize=Dateigröße
|
||||||
|
database.deleteBackupFile=Sicherungsdatei löschen
|
||||||
|
database.importBackupFile=Sicherungsdatei importieren
|
||||||
|
database.downloadBackupFile=Sicherungsdatei herunterladen
|
||||||
|
database.info_1=Beim Importieren der Daten ist es von größter Bedeutung, die korrekte Struktur zu gewährleisten. Wenn Sie nicht sicher sind, was Sie tun, suchen Sie Rat und Unterstützung von einem Fachmann. Ein Fehler in der Struktur kann zu Fehlfunktionen der Anwendung führen, bis hin zur vollständigen Nicht-Lauffähigkeit der Anwendung.
|
||||||
|
database.info_2=Der Dateiname spielt beim Hochladen keine Rolle. Dieser wird nachträglich in das Format backup_user_yyyyMMddHHmm.sql geändert, um eine einheitliche Benennung zu gewährleisten.
|
||||||
|
database.submit=Sicherungsdatei importieren
|
||||||
|
database.importIntoDatabaseSuccessed=Import in die Datenbank erfolgreich
|
||||||
|
database.fileNotFound=Datei nicht gefunden
|
||||||
|
database.fileNullOrEmpty=Datei darf nicht null oder leer sein
|
||||||
|
database.failedImportFile=Dateiimport fehlgeschlagen
|
||||||
|
|
||||||
#############
|
#############
|
||||||
# HOME-PAGE #
|
# HOME-PAGE #
|
||||||
#############
|
#############
|
||||||
@@ -332,9 +353,9 @@ home.certSign.title=Mit Zertifikat signieren
|
|||||||
home.certSign.desc=Ein PDF mit einem Zertifikat/Schlüssel (PEM/P12) signieren
|
home.certSign.desc=Ein PDF mit einem Zertifikat/Schlüssel (PEM/P12) signieren
|
||||||
certSign.tags=authentifizieren,pem,p12,offiziell,verschlüsseln
|
certSign.tags=authentifizieren,pem,p12,offiziell,verschlüsseln
|
||||||
|
|
||||||
home.removeCertSign.title=Remove Certificate Sign
|
home.removeCertSign.title=Zertifikatsignatur entfernen
|
||||||
home.removeCertSign.desc=Remove certificate signature from PDF
|
home.removeCertSign.desc=Zertifikatsignatur aus PDF entfernen
|
||||||
removeCertSign.tags=authenticate,PEM,P12,official,decrypt
|
removeCertSign.tags=authentifizieren,PEM,P12,offiziell,entschlüsseln,decrypt
|
||||||
|
|
||||||
home.pageLayout.title=Mehrseitiges Layout
|
home.pageLayout.title=Mehrseitiges Layout
|
||||||
home.pageLayout.desc=Mehrere Seiten eines PDF zu einer Seite zusammenführen
|
home.pageLayout.desc=Mehrere Seiten eines PDF zu einer Seite zusammenführen
|
||||||
@@ -685,6 +706,8 @@ removeAnnotations.submit=Entfernen
|
|||||||
#compare
|
#compare
|
||||||
compare.title=Vergleichen
|
compare.title=Vergleichen
|
||||||
compare.header=PDFs vergleichen
|
compare.header=PDFs vergleichen
|
||||||
|
compare.highlightColor.1=Highlight-Farbe 1:
|
||||||
|
compare.highlightColor.2=Highlight-Farbe 2:
|
||||||
compare.document.1=Dokument 1
|
compare.document.1=Dokument 1
|
||||||
compare.document.2=Dokument 2
|
compare.document.2=Dokument 2
|
||||||
compare.submit=Vergleichen
|
compare.submit=Vergleichen
|
||||||
@@ -799,6 +822,7 @@ merge.title=Zusammenführen
|
|||||||
merge.header=Mehrere PDFs zusammenführen (2+)
|
merge.header=Mehrere PDFs zusammenführen (2+)
|
||||||
merge.sortByName=Nach Namen sortieren
|
merge.sortByName=Nach Namen sortieren
|
||||||
merge.sortByDate=Nach Datum sortieren
|
merge.sortByDate=Nach Datum sortieren
|
||||||
|
merge.removeCertSign=Digitale Signatur in der zusammengeführten Datei entfernen?
|
||||||
merge.submit=Zusammenführen
|
merge.submit=Zusammenführen
|
||||||
|
|
||||||
|
|
||||||
@@ -816,6 +840,7 @@ pdfOrganiser.mode.6=Ungerade-Gerade-Teilung
|
|||||||
pdfOrganiser.mode.7=Erste entfernen
|
pdfOrganiser.mode.7=Erste entfernen
|
||||||
pdfOrganiser.mode.8=Letzte entfernen
|
pdfOrganiser.mode.8=Letzte entfernen
|
||||||
pdfOrganiser.mode.9=Erste und letzte entfernen
|
pdfOrganiser.mode.9=Erste und letzte entfernen
|
||||||
|
pdfOrganiser.mode.10=Ungerade-Gerade-Zusammenführung
|
||||||
pdfOrganiser.placeholder=(z.B. 1,3,2 oder 4-8,2,10-12 oder 2n-1)
|
pdfOrganiser.placeholder=(z.B. 1,3,2 oder 4-8,2,10-12 oder 2n-1)
|
||||||
|
|
||||||
|
|
||||||
@@ -1077,6 +1102,15 @@ licenses.module=Modul
|
|||||||
licenses.version=Version
|
licenses.version=Version
|
||||||
licenses.license=Lizenz
|
licenses.license=Lizenz
|
||||||
|
|
||||||
|
#survey
|
||||||
|
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.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
|
||||||
|
survey.dontShowAgain=Nicht mehr anzeigen
|
||||||
|
|
||||||
|
|
||||||
#error
|
#error
|
||||||
error.sorry=Entschuldigung für das Problem!
|
error.sorry=Entschuldigung für das Problem!
|
||||||
|
|||||||
@@ -55,6 +55,7 @@ userNotFoundMessage=Ο χρήστης δεν βρέθηκε.
|
|||||||
incorrectPasswordMessage=Ο τρέχων κωδικός πρόσβασης είναι λανθασμένος.
|
incorrectPasswordMessage=Ο τρέχων κωδικός πρόσβασης είναι λανθασμένος.
|
||||||
usernameExistsMessage=Το νέο όνομα χρήστη υπάρχει ήδη.
|
usernameExistsMessage=Το νέο όνομα χρήστη υπάρχει ήδη.
|
||||||
invalidUsernameMessage=Μη έγκυρο όνομα χρήστη, όνομα χρήστη μπορεί να περιέχει μόνο γράμματα, αριθμούς και τους ακόλουθους ειδικούς χαρακτήρες @._+- ή πρέπει να είναι έγκυρη διεύθυνση email.
|
invalidUsernameMessage=Μη έγκυρο όνομα χρήστη, όνομα χρήστη μπορεί να περιέχει μόνο γράμματα, αριθμούς και τους ακόλουθους ειδικούς χαρακτήρες @._+- ή πρέπει να είναι έγκυρη διεύθυνση email.
|
||||||
|
confirmPasswordErrorMessage=New Password and Confirm New Password must match.
|
||||||
deleteCurrentUserMessage=Δεν είναι δυνατή η διαγραφή του τρέχοντος συνδεδεμένου χρήστη.
|
deleteCurrentUserMessage=Δεν είναι δυνατή η διαγραφή του τρέχοντος συνδεδεμένου χρήστη.
|
||||||
deleteUsernameExistsMessage=Το όνομα χρήστη δεν υπάρχει και δεν μπορεί να διαγραφεί.
|
deleteUsernameExistsMessage=Το όνομα χρήστη δεν υπάρχει και δεν μπορεί να διαγραφεί.
|
||||||
downgradeCurrentUserMessage=Δεν είναι δυνατή η υποβάθμιση του ρόλου του τρέχοντος χρήστη
|
downgradeCurrentUserMessage=Δεν είναι δυνατή η υποβάθμιση του ρόλου του τρέχοντος χρήστη
|
||||||
@@ -85,6 +86,7 @@ pipeline.defaultOption=Custom
|
|||||||
pipeline.submitButton=Υποβολή
|
pipeline.submitButton=Υποβολή
|
||||||
pipeline.help=Βοήθεια για το Pipeline
|
pipeline.help=Βοήθεια για το Pipeline
|
||||||
pipeline.scanHelp=Βοήθεια για Σάρωση Φακέλων
|
pipeline.scanHelp=Βοήθεια για Σάρωση Φακέλων
|
||||||
|
pipeline.deletePrompt=Are you sure you want to delete pipeline
|
||||||
|
|
||||||
######################
|
######################
|
||||||
# Pipeline Options #
|
# Pipeline Options #
|
||||||
@@ -173,6 +175,8 @@ adminUserSettings.header=Ρυθμίσεις ελέγχου Διαχειριστ
|
|||||||
adminUserSettings.admin=Διαχειριστής
|
adminUserSettings.admin=Διαχειριστής
|
||||||
adminUserSettings.user=Χρήστης
|
adminUserSettings.user=Χρήστης
|
||||||
adminUserSettings.addUser=Προσθήκη νέου Χρήστη
|
adminUserSettings.addUser=Προσθήκη νέου Χρήστη
|
||||||
|
adminUserSettings.deleteUser=Delete User
|
||||||
|
adminUserSettings.confirmDeleteUser=Should the user be deleted?
|
||||||
adminUserSettings.usernameInfo=Username can only contain letters, numbers and the following special characters @._+- or must be a valid email address.
|
adminUserSettings.usernameInfo=Username can only contain letters, numbers and the following special characters @._+- or must be a valid email address.
|
||||||
adminUserSettings.roles=Ρόλοι
|
adminUserSettings.roles=Ρόλοι
|
||||||
adminUserSettings.role=Ρόλος
|
adminUserSettings.role=Ρόλος
|
||||||
@@ -187,6 +191,23 @@ adminUserSettings.submit=Αποθήκευση Χρήστη
|
|||||||
adminUserSettings.changeUserRole=Αλλαγή ρόλου χρήστη
|
adminUserSettings.changeUserRole=Αλλαγή ρόλου χρήστη
|
||||||
adminUserSettings.authenticated=Authenticated
|
adminUserSettings.authenticated=Authenticated
|
||||||
|
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
#############
|
#############
|
||||||
# HOME-PAGE #
|
# HOME-PAGE #
|
||||||
#############
|
#############
|
||||||
@@ -685,6 +706,8 @@ removeAnnotations.submit=Κατάργηση
|
|||||||
#compare
|
#compare
|
||||||
compare.title=Σύγκριση
|
compare.title=Σύγκριση
|
||||||
compare.header=Σύγκριση PDFs
|
compare.header=Σύγκριση PDFs
|
||||||
|
compare.highlightColor.1=Highlight Color 1:
|
||||||
|
compare.highlightColor.2=Highlight Color 2:
|
||||||
compare.document.1=Έγγραφο 1
|
compare.document.1=Έγγραφο 1
|
||||||
compare.document.2=Έγγραφο 2
|
compare.document.2=Έγγραφο 2
|
||||||
compare.submit=Σύγκριση
|
compare.submit=Σύγκριση
|
||||||
@@ -799,6 +822,7 @@ merge.title=Συγχώνευση
|
|||||||
merge.header=Συγχώνευση πολλαπλών PDFs (2+)
|
merge.header=Συγχώνευση πολλαπλών PDFs (2+)
|
||||||
merge.sortByName=Ταξινόμηση με βάση το Όνομα
|
merge.sortByName=Ταξινόμηση με βάση το Όνομα
|
||||||
merge.sortByDate=Ταξινόμηση με βάση την Ημερομηνία
|
merge.sortByDate=Ταξινόμηση με βάση την Ημερομηνία
|
||||||
|
merge.removeCertSign=Remove digital signature in the merged file?
|
||||||
merge.submit=Συγχώνευση
|
merge.submit=Συγχώνευση
|
||||||
|
|
||||||
|
|
||||||
@@ -816,6 +840,7 @@ pdfOrganiser.mode.6=Διαίρεση Μονού-Ζυγού
|
|||||||
pdfOrganiser.mode.7=Αφαίρεση Πρώτου
|
pdfOrganiser.mode.7=Αφαίρεση Πρώτου
|
||||||
pdfOrganiser.mode.8=Αφαίρεση Τελευταίου
|
pdfOrganiser.mode.8=Αφαίρεση Τελευταίου
|
||||||
pdfOrganiser.mode.9=Αφαίρεση Πρώτου και Τελευταίου
|
pdfOrganiser.mode.9=Αφαίρεση Πρώτου και Τελευταίου
|
||||||
|
pdfOrganiser.mode.10=Odd-Even Merge
|
||||||
pdfOrganiser.placeholder=(π.χ. 1,3,2 ή 4-8,2,10-12 ή 2n-1)
|
pdfOrganiser.placeholder=(π.χ. 1,3,2 ή 4-8,2,10-12 ή 2n-1)
|
||||||
|
|
||||||
|
|
||||||
@@ -1077,6 +1102,15 @@ licenses.module=Module
|
|||||||
licenses.version=Εκδοχή
|
licenses.version=Εκδοχή
|
||||||
licenses.license=Άδεια
|
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.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
|
||||||
|
|
||||||
|
|
||||||
#error
|
#error
|
||||||
error.sorry=Συγγνώμη για το ζήτημα!
|
error.sorry=Συγγνώμη για το ζήτημα!
|
||||||
|
|||||||
@@ -55,6 +55,7 @@ userNotFoundMessage=User not found.
|
|||||||
incorrectPasswordMessage=Current password is incorrect.
|
incorrectPasswordMessage=Current password is incorrect.
|
||||||
usernameExistsMessage=New Username already exists.
|
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.
|
invalidUsernameMessage=Invalid username, username can only contain letters, numbers and the following special characters @._+- or must be a valid email address.
|
||||||
|
confirmPasswordErrorMessage=New Password and Confirm New Password must match.
|
||||||
deleteCurrentUserMessage=Cannot delete currently logged in user.
|
deleteCurrentUserMessage=Cannot delete currently logged in user.
|
||||||
deleteUsernameExistsMessage=The username does not exist and cannot be deleted.
|
deleteUsernameExistsMessage=The username does not exist and cannot be deleted.
|
||||||
downgradeCurrentUserMessage=Cannot downgrade current user's role
|
downgradeCurrentUserMessage=Cannot downgrade current user's role
|
||||||
@@ -85,6 +86,7 @@ pipeline.defaultOption=Custom
|
|||||||
pipeline.submitButton=Submit
|
pipeline.submitButton=Submit
|
||||||
pipeline.help=Pipeline Help
|
pipeline.help=Pipeline Help
|
||||||
pipeline.scanHelp=Folder Scanning Help
|
pipeline.scanHelp=Folder Scanning Help
|
||||||
|
pipeline.deletePrompt=Are you sure you want to delete pipeline
|
||||||
|
|
||||||
######################
|
######################
|
||||||
# Pipeline Options #
|
# Pipeline Options #
|
||||||
@@ -173,6 +175,8 @@ adminUserSettings.header=Admin User Control Settings
|
|||||||
adminUserSettings.admin=Admin
|
adminUserSettings.admin=Admin
|
||||||
adminUserSettings.user=User
|
adminUserSettings.user=User
|
||||||
adminUserSettings.addUser=Add New User
|
adminUserSettings.addUser=Add New User
|
||||||
|
adminUserSettings.deleteUser=Delete User
|
||||||
|
adminUserSettings.confirmDeleteUser=Should the user be deleted?
|
||||||
adminUserSettings.usernameInfo=Username can only contain letters, numbers and the following special characters @._+- or must be a valid email address.
|
adminUserSettings.usernameInfo=Username can only contain letters, numbers and the following special characters @._+- or must be a valid email address.
|
||||||
adminUserSettings.roles=Roles
|
adminUserSettings.roles=Roles
|
||||||
adminUserSettings.role=Role
|
adminUserSettings.role=Role
|
||||||
@@ -187,6 +191,23 @@ adminUserSettings.submit=Save User
|
|||||||
adminUserSettings.changeUserRole=Change User's Role
|
adminUserSettings.changeUserRole=Change User's Role
|
||||||
adminUserSettings.authenticated=Authenticated
|
adminUserSettings.authenticated=Authenticated
|
||||||
|
|
||||||
|
|
||||||
|
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 to import file
|
||||||
|
|
||||||
#############
|
#############
|
||||||
# HOME-PAGE #
|
# HOME-PAGE #
|
||||||
#############
|
#############
|
||||||
@@ -685,6 +706,8 @@ removeAnnotations.submit=Remove
|
|||||||
#compare
|
#compare
|
||||||
compare.title=Compare
|
compare.title=Compare
|
||||||
compare.header=Compare PDFs
|
compare.header=Compare PDFs
|
||||||
|
compare.highlightColor.1=Highlight Color 1:
|
||||||
|
compare.highlightColor.2=Highlight Color 2:
|
||||||
compare.document.1=Document 1
|
compare.document.1=Document 1
|
||||||
compare.document.2=Document 2
|
compare.document.2=Document 2
|
||||||
compare.submit=Compare
|
compare.submit=Compare
|
||||||
@@ -799,6 +822,7 @@ merge.title=Merge
|
|||||||
merge.header=Merge multiple PDFs (2+)
|
merge.header=Merge multiple PDFs (2+)
|
||||||
merge.sortByName=Sort by name
|
merge.sortByName=Sort by name
|
||||||
merge.sortByDate=Sort by date
|
merge.sortByDate=Sort by date
|
||||||
|
merge.removeCertSign=Remove digital signature in the merged file?
|
||||||
merge.submit=Merge
|
merge.submit=Merge
|
||||||
|
|
||||||
|
|
||||||
@@ -816,6 +840,7 @@ pdfOrganiser.mode.6=Odd-Even Split
|
|||||||
pdfOrganiser.mode.7=Remove First
|
pdfOrganiser.mode.7=Remove First
|
||||||
pdfOrganiser.mode.8=Remove Last
|
pdfOrganiser.mode.8=Remove Last
|
||||||
pdfOrganiser.mode.9=Remove First and 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.placeholder=(e.g. 1,3,2 or 4-8,2,10-12 or 2n-1)
|
||||||
|
|
||||||
|
|
||||||
@@ -1070,12 +1095,21 @@ printFile.submit=Print
|
|||||||
|
|
||||||
|
|
||||||
#licenses
|
#licenses
|
||||||
licenses.nav=Licenses
|
licenses.nav=Licences
|
||||||
licenses.title=3rd Party Licenses
|
licenses.title=3rd Party Licences
|
||||||
licenses.header=3rd Party Licenses
|
licenses.header=3rd Party Licences
|
||||||
licenses.module=Module
|
licenses.module=Module
|
||||||
licenses.version=Version
|
licenses.version=Version
|
||||||
licenses.license=License
|
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.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
|
||||||
|
|
||||||
|
|
||||||
#error
|
#error
|
||||||
|
|||||||
@@ -55,6 +55,7 @@ userNotFoundMessage=User not found.
|
|||||||
incorrectPasswordMessage=Current password is incorrect.
|
incorrectPasswordMessage=Current password is incorrect.
|
||||||
usernameExistsMessage=New Username already exists.
|
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.
|
invalidUsernameMessage=Invalid username, username can only contain letters, numbers and the following special characters @._+- or must be a valid email address.
|
||||||
|
confirmPasswordErrorMessage=New Password and Confirm New Password must match.
|
||||||
deleteCurrentUserMessage=Cannot delete currently logged in user.
|
deleteCurrentUserMessage=Cannot delete currently logged in user.
|
||||||
deleteUsernameExistsMessage=The username does not exist and cannot be deleted.
|
deleteUsernameExistsMessage=The username does not exist and cannot be deleted.
|
||||||
downgradeCurrentUserMessage=Cannot downgrade current user's role
|
downgradeCurrentUserMessage=Cannot downgrade current user's role
|
||||||
@@ -85,6 +86,7 @@ pipeline.defaultOption=Custom
|
|||||||
pipeline.submitButton=Submit
|
pipeline.submitButton=Submit
|
||||||
pipeline.help=Pipeline Help
|
pipeline.help=Pipeline Help
|
||||||
pipeline.scanHelp=Folder Scanning Help
|
pipeline.scanHelp=Folder Scanning Help
|
||||||
|
pipeline.deletePrompt=Are you sure you want to delete pipeline
|
||||||
|
|
||||||
######################
|
######################
|
||||||
# Pipeline Options #
|
# Pipeline Options #
|
||||||
@@ -173,6 +175,8 @@ adminUserSettings.header=Admin User Control Settings
|
|||||||
adminUserSettings.admin=Admin
|
adminUserSettings.admin=Admin
|
||||||
adminUserSettings.user=User
|
adminUserSettings.user=User
|
||||||
adminUserSettings.addUser=Add New User
|
adminUserSettings.addUser=Add New User
|
||||||
|
adminUserSettings.deleteUser=Delete User
|
||||||
|
adminUserSettings.confirmDeleteUser=Should the user be deleted?
|
||||||
adminUserSettings.usernameInfo=Username can only contain letters, numbers and the following special characters @._+- or must be a valid email address.
|
adminUserSettings.usernameInfo=Username can only contain letters, numbers and the following special characters @._+- or must be a valid email address.
|
||||||
adminUserSettings.roles=Roles
|
adminUserSettings.roles=Roles
|
||||||
adminUserSettings.role=Role
|
adminUserSettings.role=Role
|
||||||
@@ -187,6 +191,23 @@ adminUserSettings.submit=Save User
|
|||||||
adminUserSettings.changeUserRole=Change User's Role
|
adminUserSettings.changeUserRole=Change User's Role
|
||||||
adminUserSettings.authenticated=Authenticated
|
adminUserSettings.authenticated=Authenticated
|
||||||
|
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
#############
|
#############
|
||||||
# HOME-PAGE #
|
# HOME-PAGE #
|
||||||
#############
|
#############
|
||||||
@@ -685,6 +706,8 @@ removeAnnotations.submit=Remove
|
|||||||
#compare
|
#compare
|
||||||
compare.title=Compare
|
compare.title=Compare
|
||||||
compare.header=Compare PDFs
|
compare.header=Compare PDFs
|
||||||
|
compare.highlightColor.1=Highlight Color 1:
|
||||||
|
compare.highlightColor.2=Highlight Color 2:
|
||||||
compare.document.1=Document 1
|
compare.document.1=Document 1
|
||||||
compare.document.2=Document 2
|
compare.document.2=Document 2
|
||||||
compare.submit=Compare
|
compare.submit=Compare
|
||||||
@@ -799,6 +822,7 @@ merge.title=Merge
|
|||||||
merge.header=Merge multiple PDFs (2+)
|
merge.header=Merge multiple PDFs (2+)
|
||||||
merge.sortByName=Sort by name
|
merge.sortByName=Sort by name
|
||||||
merge.sortByDate=Sort by date
|
merge.sortByDate=Sort by date
|
||||||
|
merge.removeCertSign=Remove digital signature in the merged file?
|
||||||
merge.submit=Merge
|
merge.submit=Merge
|
||||||
|
|
||||||
|
|
||||||
@@ -816,6 +840,7 @@ pdfOrganiser.mode.6=Odd-Even Split
|
|||||||
pdfOrganiser.mode.7=Remove First
|
pdfOrganiser.mode.7=Remove First
|
||||||
pdfOrganiser.mode.8=Remove Last
|
pdfOrganiser.mode.8=Remove Last
|
||||||
pdfOrganiser.mode.9=Remove First and 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.placeholder=(e.g. 1,3,2 or 4-8,2,10-12 or 2n-1)
|
||||||
|
|
||||||
|
|
||||||
@@ -1077,6 +1102,15 @@ licenses.module=Module
|
|||||||
licenses.version=Version
|
licenses.version=Version
|
||||||
licenses.license=License
|
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.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
|
||||||
|
|
||||||
|
|
||||||
#error
|
#error
|
||||||
error.sorry=Sorry for the issue!
|
error.sorry=Sorry for the issue!
|
||||||
|
|||||||
@@ -55,6 +55,7 @@ userNotFoundMessage=Usuario no encontrado.
|
|||||||
incorrectPasswordMessage=La contraseña actual no es correcta.
|
incorrectPasswordMessage=La contraseña actual no es correcta.
|
||||||
usernameExistsMessage=El nuevo nombre de usuario está en uso.
|
usernameExistsMessage=El nuevo nombre de usuario está en uso.
|
||||||
invalidUsernameMessage=Nombre de usuario no válido, el nombre de usuario solo puede contener letras, números y los siguientes caracteres especiales @._+- o debe ser una dirección de correo electrónico válida.
|
invalidUsernameMessage=Nombre de usuario no válido, el nombre de usuario solo puede contener letras, números y los siguientes caracteres especiales @._+- o debe ser una dirección de correo electrónico válida.
|
||||||
|
confirmPasswordErrorMessage=New Password and Confirm New Password must match.
|
||||||
deleteCurrentUserMessage=No puede eliminar el usuario que tiene la sesión actualmente en uso.
|
deleteCurrentUserMessage=No puede eliminar el usuario que tiene la sesión actualmente en uso.
|
||||||
deleteUsernameExistsMessage=El usuario no existe y no puede eliminarse.
|
deleteUsernameExistsMessage=El usuario no existe y no puede eliminarse.
|
||||||
downgradeCurrentUserMessage=No se puede degradar el rol del usuario actual
|
downgradeCurrentUserMessage=No se puede degradar el rol del usuario actual
|
||||||
@@ -85,6 +86,7 @@ pipeline.defaultOption=Personalizar
|
|||||||
pipeline.submitButton=Enviar
|
pipeline.submitButton=Enviar
|
||||||
pipeline.help=Ayuda de Canalización
|
pipeline.help=Ayuda de Canalización
|
||||||
pipeline.scanHelp=Ayuda de escaneado de carpetas
|
pipeline.scanHelp=Ayuda de escaneado de carpetas
|
||||||
|
pipeline.deletePrompt=Are you sure you want to delete pipeline
|
||||||
|
|
||||||
######################
|
######################
|
||||||
# Pipeline Options #
|
# Pipeline Options #
|
||||||
@@ -173,6 +175,8 @@ adminUserSettings.header=Configuración de control de usuario administrador
|
|||||||
adminUserSettings.admin=Administrador
|
adminUserSettings.admin=Administrador
|
||||||
adminUserSettings.user=Usuario
|
adminUserSettings.user=Usuario
|
||||||
adminUserSettings.addUser=Añadir Nuevo Usuario
|
adminUserSettings.addUser=Añadir Nuevo Usuario
|
||||||
|
adminUserSettings.deleteUser=Delete User
|
||||||
|
adminUserSettings.confirmDeleteUser=Should the user be deleted?
|
||||||
adminUserSettings.usernameInfo=El nombre de usuario solo puede contener letras, números y los siguientes caracteres especiales @._+- o debe ser una dirección de correo electrónico válida.
|
adminUserSettings.usernameInfo=El nombre de usuario solo puede contener letras, números y los siguientes caracteres especiales @._+- o debe ser una dirección de correo electrónico válida.
|
||||||
adminUserSettings.roles=Roles
|
adminUserSettings.roles=Roles
|
||||||
adminUserSettings.role=Rol
|
adminUserSettings.role=Rol
|
||||||
@@ -187,6 +191,23 @@ adminUserSettings.submit=Guardar Usuario
|
|||||||
adminUserSettings.changeUserRole=Cambiar rol de usuario
|
adminUserSettings.changeUserRole=Cambiar rol de usuario
|
||||||
adminUserSettings.authenticated=Authenticated
|
adminUserSettings.authenticated=Authenticated
|
||||||
|
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
#############
|
#############
|
||||||
# HOME-PAGE #
|
# HOME-PAGE #
|
||||||
#############
|
#############
|
||||||
@@ -685,6 +706,8 @@ removeAnnotations.submit=Eliminar
|
|||||||
#compare
|
#compare
|
||||||
compare.title=Comparar
|
compare.title=Comparar
|
||||||
compare.header=Comparar archivos PDF
|
compare.header=Comparar archivos PDF
|
||||||
|
compare.highlightColor.1=Highlight Color 1:
|
||||||
|
compare.highlightColor.2=Highlight Color 2:
|
||||||
compare.document.1=Documento 1
|
compare.document.1=Documento 1
|
||||||
compare.document.2=Documento 2
|
compare.document.2=Documento 2
|
||||||
compare.submit=Comparar
|
compare.submit=Comparar
|
||||||
@@ -799,6 +822,7 @@ merge.title=Unir
|
|||||||
merge.header=Unir múltiples PDFs (2+)
|
merge.header=Unir múltiples PDFs (2+)
|
||||||
merge.sortByName=Ordenar por nombre
|
merge.sortByName=Ordenar por nombre
|
||||||
merge.sortByDate=Ordenar por fecha
|
merge.sortByDate=Ordenar por fecha
|
||||||
|
merge.removeCertSign=Remove digital signature in the merged file?
|
||||||
merge.submit=Unir
|
merge.submit=Unir
|
||||||
|
|
||||||
|
|
||||||
@@ -816,6 +840,7 @@ pdfOrganiser.mode.6=División par-impar
|
|||||||
pdfOrganiser.mode.7=Quitar primera
|
pdfOrganiser.mode.7=Quitar primera
|
||||||
pdfOrganiser.mode.8=Quitar última
|
pdfOrganiser.mode.8=Quitar última
|
||||||
pdfOrganiser.mode.9=Quitar primera y última
|
pdfOrganiser.mode.9=Quitar primera y última
|
||||||
|
pdfOrganiser.mode.10=Odd-Even Merge
|
||||||
pdfOrganiser.placeholder=(por ej., 1,3,2 o 4-8,2,10-12 o 2n-1)
|
pdfOrganiser.placeholder=(por ej., 1,3,2 o 4-8,2,10-12 o 2n-1)
|
||||||
|
|
||||||
|
|
||||||
@@ -1077,6 +1102,15 @@ licenses.module=Módulo
|
|||||||
licenses.version=Versión
|
licenses.version=Versión
|
||||||
licenses.license=Licencia
|
licenses.license=Licencia
|
||||||
|
|
||||||
|
#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.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
|
||||||
|
|
||||||
|
|
||||||
#error
|
#error
|
||||||
error.sorry=¡Perdón por el fallo!
|
error.sorry=¡Perdón por el fallo!
|
||||||
|
|||||||
@@ -55,6 +55,7 @@ userNotFoundMessage=User not found.
|
|||||||
incorrectPasswordMessage=Current password is incorrect.
|
incorrectPasswordMessage=Current password is incorrect.
|
||||||
usernameExistsMessage=New Username already exists.
|
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.
|
invalidUsernameMessage=Invalid username, username can only contain letters, numbers and the following special characters @._+- or must be a valid email address.
|
||||||
|
confirmPasswordErrorMessage=New Password and Confirm New Password must match.
|
||||||
deleteCurrentUserMessage=Cannot delete currently logged in user.
|
deleteCurrentUserMessage=Cannot delete currently logged in user.
|
||||||
deleteUsernameExistsMessage=The username does not exist and cannot be deleted.
|
deleteUsernameExistsMessage=The username does not exist and cannot be deleted.
|
||||||
downgradeCurrentUserMessage=Ezin da uneko erabiltzailearen rola jaitsi
|
downgradeCurrentUserMessage=Ezin da uneko erabiltzailearen rola jaitsi
|
||||||
@@ -85,6 +86,7 @@ pipeline.defaultOption=Custom
|
|||||||
pipeline.submitButton=Submit
|
pipeline.submitButton=Submit
|
||||||
pipeline.help=Pipeline Help
|
pipeline.help=Pipeline Help
|
||||||
pipeline.scanHelp=Folder Scanning Help
|
pipeline.scanHelp=Folder Scanning Help
|
||||||
|
pipeline.deletePrompt=Are you sure you want to delete pipeline
|
||||||
|
|
||||||
######################
|
######################
|
||||||
# Pipeline Options #
|
# Pipeline Options #
|
||||||
@@ -173,6 +175,8 @@ adminUserSettings.header=Admin Erabiltzailearen Ezarpenen Kontrolak
|
|||||||
adminUserSettings.admin=Admin
|
adminUserSettings.admin=Admin
|
||||||
adminUserSettings.user=Erabiltzaile
|
adminUserSettings.user=Erabiltzaile
|
||||||
adminUserSettings.addUser=Erabiltzaile berria
|
adminUserSettings.addUser=Erabiltzaile berria
|
||||||
|
adminUserSettings.deleteUser=Delete User
|
||||||
|
adminUserSettings.confirmDeleteUser=Should the user be deleted?
|
||||||
adminUserSettings.usernameInfo=Username can only contain letters, numbers and the following special characters @._+- or must be a valid email address.
|
adminUserSettings.usernameInfo=Username can only contain letters, numbers and the following special characters @._+- or must be a valid email address.
|
||||||
adminUserSettings.roles=Rolak
|
adminUserSettings.roles=Rolak
|
||||||
adminUserSettings.role=Rol
|
adminUserSettings.role=Rol
|
||||||
@@ -187,6 +191,23 @@ adminUserSettings.submit=Gorde Erabiltzailea
|
|||||||
adminUserSettings.changeUserRole=Erabiltzailearen rola aldatu
|
adminUserSettings.changeUserRole=Erabiltzailearen rola aldatu
|
||||||
adminUserSettings.authenticated=Authenticated
|
adminUserSettings.authenticated=Authenticated
|
||||||
|
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
#############
|
#############
|
||||||
# HOME-PAGE #
|
# HOME-PAGE #
|
||||||
#############
|
#############
|
||||||
@@ -685,6 +706,8 @@ removeAnnotations.submit=Remove
|
|||||||
#compare
|
#compare
|
||||||
compare.title=Konparatu
|
compare.title=Konparatu
|
||||||
compare.header=Konparatu PDF fitxategiak
|
compare.header=Konparatu PDF fitxategiak
|
||||||
|
compare.highlightColor.1=Highlight Color 1:
|
||||||
|
compare.highlightColor.2=Highlight Color 2:
|
||||||
compare.document.1=1. dokumentua
|
compare.document.1=1. dokumentua
|
||||||
compare.document.2=2. dokumentua
|
compare.document.2=2. dokumentua
|
||||||
compare.submit=Konparatu
|
compare.submit=Konparatu
|
||||||
@@ -799,6 +822,7 @@ merge.title=Elkartu
|
|||||||
merge.header=Elkartu zenbait PDF (2+)
|
merge.header=Elkartu zenbait PDF (2+)
|
||||||
merge.sortByName=Sort by nameOrdenatu izenaren arabera
|
merge.sortByName=Sort by nameOrdenatu izenaren arabera
|
||||||
merge.sortByDate=Ordenatu dataren arabera
|
merge.sortByDate=Ordenatu dataren arabera
|
||||||
|
merge.removeCertSign=Remove digital signature in the merged file?
|
||||||
merge.submit=Elkartu
|
merge.submit=Elkartu
|
||||||
|
|
||||||
|
|
||||||
@@ -816,6 +840,7 @@ pdfOrganiser.mode.6=Odd-Even Split
|
|||||||
pdfOrganiser.mode.7=Remove First
|
pdfOrganiser.mode.7=Remove First
|
||||||
pdfOrganiser.mode.8=Remove Last
|
pdfOrganiser.mode.8=Remove Last
|
||||||
pdfOrganiser.mode.9=Remove First and 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.placeholder=(e.g. 1,3,2 or 4-8,2,10-12 or 2n-1)
|
||||||
|
|
||||||
|
|
||||||
@@ -1077,6 +1102,15 @@ licenses.module=Module
|
|||||||
licenses.version=Version
|
licenses.version=Version
|
||||||
licenses.license=License
|
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.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
|
||||||
|
|
||||||
|
|
||||||
#error
|
#error
|
||||||
error.sorry=Sorry for the issue!
|
error.sorry=Sorry for the issue!
|
||||||
|
|||||||
@@ -55,6 +55,7 @@ userNotFoundMessage=Utilisateur non trouvé.
|
|||||||
incorrectPasswordMessage=Le mot de passe actuel est incorrect.
|
incorrectPasswordMessage=Le mot de passe actuel est incorrect.
|
||||||
usernameExistsMessage=Le nouveau nom d’utilisateur existe déjà.
|
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.
|
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.
|
||||||
|
confirmPasswordErrorMessage=New Password and Confirm New Password must match.
|
||||||
deleteCurrentUserMessage=Impossible de supprimer l’utilisateur actuellement connecté.
|
deleteCurrentUserMessage=Impossible de supprimer l’utilisateur actuellement connecté.
|
||||||
deleteUsernameExistsMessage=Le nom d’utilisateur n’existe pas et ne peut pas être supprimé.
|
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.
|
downgradeCurrentUserMessage=Impossible de rétrograder le rôle de l'utilisateur actuel.
|
||||||
@@ -85,6 +86,7 @@ pipeline.defaultOption=Personnaliser
|
|||||||
pipeline.submitButton=Soumettre
|
pipeline.submitButton=Soumettre
|
||||||
pipeline.help=Aide Pipeline
|
pipeline.help=Aide Pipeline
|
||||||
pipeline.scanHelp=Aide analyse de dossier
|
pipeline.scanHelp=Aide analyse de dossier
|
||||||
|
pipeline.deletePrompt=Are you sure you want to delete pipeline
|
||||||
|
|
||||||
######################
|
######################
|
||||||
# Pipeline Options #
|
# Pipeline Options #
|
||||||
@@ -173,6 +175,8 @@ adminUserSettings.header=Administration des paramètres des utilisateurs
|
|||||||
adminUserSettings.admin=Administateur
|
adminUserSettings.admin=Administateur
|
||||||
adminUserSettings.user=Utilisateur
|
adminUserSettings.user=Utilisateur
|
||||||
adminUserSettings.addUser=Ajouter un utilisateur
|
adminUserSettings.addUser=Ajouter un utilisateur
|
||||||
|
adminUserSettings.deleteUser=Delete User
|
||||||
|
adminUserSettings.confirmDeleteUser=Should the user be deleted?
|
||||||
adminUserSettings.usernameInfo=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.
|
adminUserSettings.usernameInfo=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.
|
||||||
adminUserSettings.roles=Rôles
|
adminUserSettings.roles=Rôles
|
||||||
adminUserSettings.role=Rôle
|
adminUserSettings.role=Rôle
|
||||||
@@ -187,6 +191,23 @@ adminUserSettings.submit=Ajouter
|
|||||||
adminUserSettings.changeUserRole=Changer le rôle de l'utilisateur
|
adminUserSettings.changeUserRole=Changer le rôle de l'utilisateur
|
||||||
adminUserSettings.authenticated=Authentifié
|
adminUserSettings.authenticated=Authentifié
|
||||||
|
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
#############
|
#############
|
||||||
# HOME-PAGE #
|
# HOME-PAGE #
|
||||||
#############
|
#############
|
||||||
@@ -267,7 +288,7 @@ home.fileToPDF.desc=Convertissez presque n’importe quel fichiers en PDF (DOCX,
|
|||||||
fileToPDF.tags=convertion,transformation,format,document,image,slide,texte,conversion,office,docs,word,excel,powerpoint
|
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.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 temps 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
|
ocr.tags=ocr,reconnaissance,texte,image,numérisation,scan,read,identify,detection,editable
|
||||||
|
|
||||||
|
|
||||||
@@ -456,12 +477,12 @@ login.locked=Votre compte a été verrouillé.
|
|||||||
login.signinTitle=Veuillez vous connecter
|
login.signinTitle=Veuillez vous connecter
|
||||||
login.ssoSignIn=Se connecter via l'authentification unique
|
login.ssoSignIn=Se connecter via l'authentification unique
|
||||||
login.oauth2AutoCreateDisabled=OAUTH2 Création automatique d'utilisateur désactivée
|
login.oauth2AutoCreateDisabled=OAUTH2 Création automatique d'utilisateur désactivée
|
||||||
login.oauth2RequestNotFound=Authorization request not found
|
login.oauth2RequestNotFound=Demande d'autorisation introuvable
|
||||||
login.oauth2InvalidUserInfoResponse=Invalid User Info Response
|
login.oauth2InvalidUserInfoResponse=Réponse contenant les informations de l'utilisateur est invalide
|
||||||
login.oauth2invalidRequest=Invalid Request
|
login.oauth2invalidRequest=Requête invalide
|
||||||
login.oauth2AccessDenied=Access Denied
|
login.oauth2AccessDenied=Accès refusé
|
||||||
login.oauth2InvalidTokenResponse=Invalid Token Response
|
login.oauth2InvalidTokenResponse=Réponse contenant le jeton est invalide
|
||||||
login.oauth2InvalidIdToken=Invalid Id Token
|
login.oauth2InvalidIdToken=Jeton d'identification invalide
|
||||||
|
|
||||||
|
|
||||||
#auto-redact
|
#auto-redact
|
||||||
@@ -685,19 +706,21 @@ removeAnnotations.submit=Supprimer
|
|||||||
#compare
|
#compare
|
||||||
compare.title=Comparer
|
compare.title=Comparer
|
||||||
compare.header=Comparer
|
compare.header=Comparer
|
||||||
|
compare.highlightColor.1=Highlight Color 1:
|
||||||
|
compare.highlightColor.2=Highlight Color 2:
|
||||||
compare.document.1=Document 1
|
compare.document.1=Document 1
|
||||||
compare.document.2=Document 2
|
compare.document.2=Document 2
|
||||||
compare.submit=Comparer
|
compare.submit=Comparer
|
||||||
|
|
||||||
#BookToPDF
|
#BookToPDF
|
||||||
BookToPDF.title=Books and Comics to PDF
|
BookToPDF.title=Livres et BD vers PDF
|
||||||
BookToPDF.header=Book to PDF
|
BookToPDF.header=Livre vers PDF
|
||||||
BookToPDF.credit=Utiliser Calibre
|
BookToPDF.credit=Utiliser Calibre
|
||||||
BookToPDF.submit=Convertir
|
BookToPDF.submit=Convertir
|
||||||
|
|
||||||
#PDFToBook
|
#PDFToBook
|
||||||
PDFToBook.title=PDF to Book
|
PDFToBook.title=PDF vers Livre
|
||||||
PDFToBook.header=PDF to Book
|
PDFToBook.header=PDF vers Livre
|
||||||
PDFToBook.selectText.1=Format
|
PDFToBook.selectText.1=Format
|
||||||
PDFToBook.credit=Utiliser Calibre
|
PDFToBook.credit=Utiliser Calibre
|
||||||
PDFToBook.submit=Convertir
|
PDFToBook.submit=Convertir
|
||||||
@@ -799,6 +822,7 @@ merge.title=Fusionner
|
|||||||
merge.header=Fusionner plusieurs PDF
|
merge.header=Fusionner plusieurs PDF
|
||||||
merge.sortByName=Trier par nom
|
merge.sortByName=Trier par nom
|
||||||
merge.sortByDate=Trier par date
|
merge.sortByDate=Trier par date
|
||||||
|
merge.removeCertSign=Remove digital signature in the merged file?
|
||||||
merge.submit=Fusionner
|
merge.submit=Fusionner
|
||||||
|
|
||||||
|
|
||||||
@@ -816,6 +840,7 @@ pdfOrganiser.mode.6=Partage impair-pair
|
|||||||
pdfOrganiser.mode.7=Supprimer le premier
|
pdfOrganiser.mode.7=Supprimer le premier
|
||||||
pdfOrganiser.mode.8=Supprimer le dernier
|
pdfOrganiser.mode.8=Supprimer le dernier
|
||||||
pdfOrganiser.mode.9=Supprimer le premier et 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.placeholder=(e.g. 1,3,2 or 4-8,2,10-12 or 2n-1)
|
||||||
|
|
||||||
|
|
||||||
@@ -1077,6 +1102,15 @@ licenses.module=Module
|
|||||||
licenses.version=Version
|
licenses.version=Version
|
||||||
licenses.license=Licence
|
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.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
|
||||||
|
|
||||||
|
|
||||||
#error
|
#error
|
||||||
error.sorry=Désolé pour ce problème !
|
error.sorry=Désolé pour ce problème !
|
||||||
|
|||||||
@@ -55,6 +55,7 @@ userNotFoundMessage=उपयोगकर्ता नहीं मिला।
|
|||||||
incorrectPasswordMessage=वर्तमान पासवर्ड गलत है।
|
incorrectPasswordMessage=वर्तमान पासवर्ड गलत है।
|
||||||
usernameExistsMessage=नया उपयोगकर्ता नाम पहले से मौजूद है।
|
usernameExistsMessage=नया उपयोगकर्ता नाम पहले से मौजूद है।
|
||||||
invalidUsernameMessage=Invalid username, username can only contain letters, numbers and the following special characters @._+- or must be a valid email address.
|
invalidUsernameMessage=Invalid username, username can only contain letters, numbers and the following special characters @._+- or must be a valid email address.
|
||||||
|
confirmPasswordErrorMessage=New Password and Confirm New Password must match.
|
||||||
deleteCurrentUserMessage=Cannot delete currently logged in user.
|
deleteCurrentUserMessage=Cannot delete currently logged in user.
|
||||||
deleteUsernameExistsMessage=The username does not exist and cannot be deleted.
|
deleteUsernameExistsMessage=The username does not exist and cannot be deleted.
|
||||||
downgradeCurrentUserMessage=मौजूदा यूज़र की भूमिका को डाउनग्रेड नहीं किया जा सकता
|
downgradeCurrentUserMessage=मौजूदा यूज़र की भूमिका को डाउनग्रेड नहीं किया जा सकता
|
||||||
@@ -85,6 +86,7 @@ pipeline.defaultOption=Custom
|
|||||||
pipeline.submitButton=Submit
|
pipeline.submitButton=Submit
|
||||||
pipeline.help=Pipeline Help
|
pipeline.help=Pipeline Help
|
||||||
pipeline.scanHelp=Folder Scanning Help
|
pipeline.scanHelp=Folder Scanning Help
|
||||||
|
pipeline.deletePrompt=Are you sure you want to delete pipeline
|
||||||
|
|
||||||
######################
|
######################
|
||||||
# Pipeline Options #
|
# Pipeline Options #
|
||||||
@@ -173,6 +175,8 @@ adminUserSettings.header=व्यवस्थापक उपयोगकर्
|
|||||||
adminUserSettings.admin=व्यवस्थापक
|
adminUserSettings.admin=व्यवस्थापक
|
||||||
adminUserSettings.user=उपयोगकर्ता
|
adminUserSettings.user=उपयोगकर्ता
|
||||||
adminUserSettings.addUser=नया उपयोगकर्ता जोड़ें
|
adminUserSettings.addUser=नया उपयोगकर्ता जोड़ें
|
||||||
|
adminUserSettings.deleteUser=Delete User
|
||||||
|
adminUserSettings.confirmDeleteUser=Should the user be deleted?
|
||||||
adminUserSettings.usernameInfo=Username can only contain letters, numbers and the following special characters @._+- or must be a valid email address.
|
adminUserSettings.usernameInfo=Username can only contain letters, numbers and the following special characters @._+- or must be a valid email address.
|
||||||
adminUserSettings.roles=रोल्स
|
adminUserSettings.roles=रोल्स
|
||||||
adminUserSettings.role=रोल
|
adminUserSettings.role=रोल
|
||||||
@@ -187,6 +191,23 @@ adminUserSettings.submit=उपयोगकर्ता को सहेजे
|
|||||||
adminUserSettings.changeUserRole=यूज़र की भूमिका बदलें
|
adminUserSettings.changeUserRole=यूज़र की भूमिका बदलें
|
||||||
adminUserSettings.authenticated=Authenticated
|
adminUserSettings.authenticated=Authenticated
|
||||||
|
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
#############
|
#############
|
||||||
# HOME-PAGE #
|
# HOME-PAGE #
|
||||||
#############
|
#############
|
||||||
@@ -685,6 +706,8 @@ removeAnnotations.submit=हटाएं
|
|||||||
#compare
|
#compare
|
||||||
compare.title=तुलना करें
|
compare.title=तुलना करें
|
||||||
compare.header=पीडीएफ़ तुलना करें
|
compare.header=पीडीएफ़ तुलना करें
|
||||||
|
compare.highlightColor.1=Highlight Color 1:
|
||||||
|
compare.highlightColor.2=Highlight Color 2:
|
||||||
compare.document.1=दस्तावेज़ 1
|
compare.document.1=दस्तावेज़ 1
|
||||||
compare.document.2=दस्तावेज़ 2
|
compare.document.2=दस्तावेज़ 2
|
||||||
compare.submit=तुलना करें
|
compare.submit=तुलना करें
|
||||||
@@ -799,6 +822,7 @@ merge.title=मर्ज
|
|||||||
merge.header=एक से अधिक PDF एक साथ मर्ज करें (2+)
|
merge.header=एक से अधिक PDF एक साथ मर्ज करें (2+)
|
||||||
merge.sortByName=नाम से क्रमबद्ध करें
|
merge.sortByName=नाम से क्रमबद्ध करें
|
||||||
merge.sortByDate=तारीख से क्रमबद्ध करें
|
merge.sortByDate=तारीख से क्रमबद्ध करें
|
||||||
|
merge.removeCertSign=Remove digital signature in the merged file?
|
||||||
merge.submit=मर्ज करें
|
merge.submit=मर्ज करें
|
||||||
|
|
||||||
|
|
||||||
@@ -816,6 +840,7 @@ pdfOrganiser.mode.6=Odd-Even Split
|
|||||||
pdfOrganiser.mode.7=Remove First
|
pdfOrganiser.mode.7=Remove First
|
||||||
pdfOrganiser.mode.8=Remove Last
|
pdfOrganiser.mode.8=Remove Last
|
||||||
pdfOrganiser.mode.9=Remove First and 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.placeholder=(e.g. 1,3,2 or 4-8,2,10-12 or 2n-1)
|
||||||
|
|
||||||
|
|
||||||
@@ -1077,6 +1102,15 @@ licenses.module=Module
|
|||||||
licenses.version=Version
|
licenses.version=Version
|
||||||
licenses.license=License
|
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.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
|
||||||
|
|
||||||
|
|
||||||
#error
|
#error
|
||||||
error.sorry=Sorry for the issue!
|
error.sorry=Sorry for the issue!
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
###########
|
###########
|
||||||
# Generic #
|
# Generic #
|
||||||
###########
|
###########
|
||||||
# the direction that the language is written (ltr = left to right, rtl = right to left)
|
# the direction that the language is written (ltr=left to right, rtl = right to left)
|
||||||
language.direction=ltr
|
language.direction=ltr
|
||||||
|
|
||||||
pdfPrompt=Odaberi PDF(ove)
|
pdfPrompt=Odaberi PDF(ove)
|
||||||
@@ -55,6 +55,7 @@ userNotFoundMessage=Korisnik nije pronađen.
|
|||||||
incorrectPasswordMessage=Kriva zaporka.
|
incorrectPasswordMessage=Kriva zaporka.
|
||||||
usernameExistsMessage=Korisničko ime već postoji
|
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.
|
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.
|
||||||
|
confirmPasswordErrorMessage=New Password and Confirm New Password must match.
|
||||||
deleteCurrentUserMessage=Nije moguće izbrisati trenutno prijavljenog korisnika.
|
deleteCurrentUserMessage=Nije moguće izbrisati trenutno prijavljenog korisnika.
|
||||||
deleteUsernameExistsMessage=Korisničko ime ne postoji i ne može se izbrisati.
|
deleteUsernameExistsMessage=Korisničko ime ne postoji i ne može se izbrisati.
|
||||||
downgradeCurrentUserMessage=Nije moguće vratiti unazad ulogu trenutnog korisnika
|
downgradeCurrentUserMessage=Nije moguće vratiti unazad ulogu trenutnog korisnika
|
||||||
@@ -85,6 +86,7 @@ pipeline.defaultOption=Prilagođeno
|
|||||||
pipeline.submitButton=Pošalji
|
pipeline.submitButton=Pošalji
|
||||||
pipeline.help=Pipeline Pomoć
|
pipeline.help=Pipeline Pomoć
|
||||||
pipeline.scanHelp=Pomoć za skeniranje mapa
|
pipeline.scanHelp=Pomoć za skeniranje mapa
|
||||||
|
pipeline.deletePrompt=Are you sure you want to delete pipeline
|
||||||
|
|
||||||
######################
|
######################
|
||||||
# Pipeline Options #
|
# Pipeline Options #
|
||||||
@@ -173,6 +175,8 @@ adminUserSettings.header=Postavka kontrole korisnika za administratora
|
|||||||
adminUserSettings.admin=Administrator
|
adminUserSettings.admin=Administrator
|
||||||
adminUserSettings.user=Korisnik
|
adminUserSettings.user=Korisnik
|
||||||
adminUserSettings.addUser=Dodaj novog korisnika
|
adminUserSettings.addUser=Dodaj novog korisnika
|
||||||
|
adminUserSettings.deleteUser=Delete User
|
||||||
|
adminUserSettings.confirmDeleteUser=Should the user be deleted?
|
||||||
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.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.roles=Uloge
|
||||||
adminUserSettings.role=Uloga
|
adminUserSettings.role=Uloga
|
||||||
@@ -187,6 +191,23 @@ adminUserSettings.submit=Spremi korisnika
|
|||||||
adminUserSettings.changeUserRole=Promijenite korisničku ulogu
|
adminUserSettings.changeUserRole=Promijenite korisničku ulogu
|
||||||
adminUserSettings.authenticated=Autentificirano
|
adminUserSettings.authenticated=Autentificirano
|
||||||
|
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
#############
|
#############
|
||||||
# HOME-PAGE #
|
# HOME-PAGE #
|
||||||
#############
|
#############
|
||||||
@@ -685,6 +706,8 @@ removeAnnotations.submit=Ukloni
|
|||||||
#compare
|
#compare
|
||||||
compare.title=Uporedite
|
compare.title=Uporedite
|
||||||
compare.header=Usporedite PDF-ove
|
compare.header=Usporedite PDF-ove
|
||||||
|
compare.highlightColor.1=Highlight Color 1:
|
||||||
|
compare.highlightColor.2=Highlight Color 2:
|
||||||
compare.document.1=Dokument 1
|
compare.document.1=Dokument 1
|
||||||
compare.document.2=Dokument 2
|
compare.document.2=Dokument 2
|
||||||
compare.submit=Uporedi
|
compare.submit=Uporedi
|
||||||
@@ -799,6 +822,7 @@ merge.title=Spajanje
|
|||||||
merge.header=Spajanje više PDF-ova (2+)
|
merge.header=Spajanje više PDF-ova (2+)
|
||||||
merge.sortByName=Poredaj po imenu
|
merge.sortByName=Poredaj po imenu
|
||||||
merge.sortByDate=Poredaj po datumu
|
merge.sortByDate=Poredaj po datumu
|
||||||
|
merge.removeCertSign=Remove digital signature in the merged file?
|
||||||
merge.submit=Spajanje
|
merge.submit=Spajanje
|
||||||
|
|
||||||
|
|
||||||
@@ -816,6 +840,7 @@ pdfOrganiser.mode.6=Par-Nepar Podjela
|
|||||||
pdfOrganiser.mode.7=Ukloni Prvu
|
pdfOrganiser.mode.7=Ukloni Prvu
|
||||||
pdfOrganiser.mode.8=Ukloni Zadnju
|
pdfOrganiser.mode.8=Ukloni Zadnju
|
||||||
pdfOrganiser.mode.9=Ukloni Prvu i Zadnju
|
pdfOrganiser.mode.9=Ukloni Prvu i Zadnju
|
||||||
|
pdfOrganiser.mode.10=Odd-Even Merge
|
||||||
pdfOrganiser.placeholder=(npr. 1,3,2 ili 4-8,2,10-12 ili 2n-1)
|
pdfOrganiser.placeholder=(npr. 1,3,2 ili 4-8,2,10-12 ili 2n-1)
|
||||||
|
|
||||||
|
|
||||||
@@ -1077,6 +1102,15 @@ licenses.module=Modul
|
|||||||
licenses.version=Verzija
|
licenses.version=Verzija
|
||||||
licenses.license=Licenca
|
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.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
|
||||||
|
|
||||||
|
|
||||||
#error
|
#error
|
||||||
error.sorry=Oprostite zbog problema!
|
error.sorry=Oprostite zbog problema!
|
||||||
|
|||||||
@@ -55,6 +55,7 @@ userNotFoundMessage=A felhasználó nem található.
|
|||||||
incorrectPasswordMessage=A jelenlegi jelszó helytelen.
|
incorrectPasswordMessage=A jelenlegi jelszó helytelen.
|
||||||
usernameExistsMessage=Az új felhasználónév már létezik.
|
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.
|
invalidUsernameMessage=Invalid username, username can only contain letters, numbers and the following special characters @._+- or must be a valid email address.
|
||||||
|
confirmPasswordErrorMessage=New Password and Confirm New Password must match.
|
||||||
deleteCurrentUserMessage=Cannot delete currently logged in user.
|
deleteCurrentUserMessage=Cannot delete currently logged in user.
|
||||||
deleteUsernameExistsMessage=The username does not exist and cannot be deleted.
|
deleteUsernameExistsMessage=The username does not exist and cannot be deleted.
|
||||||
downgradeCurrentUserMessage=A jelenlegi felhasználó szerepkörét nem lehet visszaminősíteni
|
downgradeCurrentUserMessage=A jelenlegi felhasználó szerepkörét nem lehet visszaminősíteni
|
||||||
@@ -85,6 +86,7 @@ pipeline.defaultOption=Custom
|
|||||||
pipeline.submitButton=Submit
|
pipeline.submitButton=Submit
|
||||||
pipeline.help=Pipeline Help
|
pipeline.help=Pipeline Help
|
||||||
pipeline.scanHelp=Folder Scanning Help
|
pipeline.scanHelp=Folder Scanning Help
|
||||||
|
pipeline.deletePrompt=Are you sure you want to delete pipeline
|
||||||
|
|
||||||
######################
|
######################
|
||||||
# Pipeline Options #
|
# Pipeline Options #
|
||||||
@@ -173,6 +175,8 @@ adminUserSettings.header=Adminisztrátori Felhasználói Vezérlési Beállítá
|
|||||||
adminUserSettings.admin=Adminisztrátor
|
adminUserSettings.admin=Adminisztrátor
|
||||||
adminUserSettings.user=Felhasználó
|
adminUserSettings.user=Felhasználó
|
||||||
adminUserSettings.addUser=Új felhasználó hozzáadása
|
adminUserSettings.addUser=Új felhasználó hozzáadása
|
||||||
|
adminUserSettings.deleteUser=Delete User
|
||||||
|
adminUserSettings.confirmDeleteUser=Should the user be deleted?
|
||||||
adminUserSettings.usernameInfo=Username can only contain letters, numbers and the following special characters @._+- or must be a valid email address.
|
adminUserSettings.usernameInfo=Username can only contain letters, numbers and the following special characters @._+- or must be a valid email address.
|
||||||
adminUserSettings.roles=Szerepek
|
adminUserSettings.roles=Szerepek
|
||||||
adminUserSettings.role=Szerep
|
adminUserSettings.role=Szerep
|
||||||
@@ -187,6 +191,23 @@ adminUserSettings.submit=Felhasználó mentése
|
|||||||
adminUserSettings.changeUserRole=Felhasználó szerepkörének módosítása
|
adminUserSettings.changeUserRole=Felhasználó szerepkörének módosítása
|
||||||
adminUserSettings.authenticated=Authenticated
|
adminUserSettings.authenticated=Authenticated
|
||||||
|
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
#############
|
#############
|
||||||
# HOME-PAGE #
|
# HOME-PAGE #
|
||||||
#############
|
#############
|
||||||
@@ -685,6 +706,8 @@ removeAnnotations.submit=Remove
|
|||||||
#compare
|
#compare
|
||||||
compare.title=Összehasonlítás
|
compare.title=Összehasonlítás
|
||||||
compare.header=PDF-ek összehasonlítása
|
compare.header=PDF-ek összehasonlítása
|
||||||
|
compare.highlightColor.1=Highlight Color 1:
|
||||||
|
compare.highlightColor.2=Highlight Color 2:
|
||||||
compare.document.1=Dokumentum 1
|
compare.document.1=Dokumentum 1
|
||||||
compare.document.2=Dokumentum 2
|
compare.document.2=Dokumentum 2
|
||||||
compare.submit=Összehasonlítás
|
compare.submit=Összehasonlítás
|
||||||
@@ -799,6 +822,7 @@ merge.title=Összevonás
|
|||||||
merge.header=Több PDF összevonása (2+)
|
merge.header=Több PDF összevonása (2+)
|
||||||
merge.sortByName=Név szerinti rendezés
|
merge.sortByName=Név szerinti rendezés
|
||||||
merge.sortByDate=Dátum szerinti rendezés
|
merge.sortByDate=Dátum szerinti rendezés
|
||||||
|
merge.removeCertSign=Remove digital signature in the merged file?
|
||||||
merge.submit=Összevonás
|
merge.submit=Összevonás
|
||||||
|
|
||||||
|
|
||||||
@@ -816,6 +840,7 @@ pdfOrganiser.mode.6=Odd-Even Split
|
|||||||
pdfOrganiser.mode.7=Remove First
|
pdfOrganiser.mode.7=Remove First
|
||||||
pdfOrganiser.mode.8=Remove Last
|
pdfOrganiser.mode.8=Remove Last
|
||||||
pdfOrganiser.mode.9=Remove First and 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.placeholder=(e.g. 1,3,2 or 4-8,2,10-12 or 2n-1)
|
||||||
|
|
||||||
|
|
||||||
@@ -1077,6 +1102,15 @@ licenses.module=Module
|
|||||||
licenses.version=Version
|
licenses.version=Version
|
||||||
licenses.license=License
|
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.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
|
||||||
|
|
||||||
|
|
||||||
#error
|
#error
|
||||||
error.sorry=Sorry for the issue!
|
error.sorry=Sorry for the issue!
|
||||||
|
|||||||
@@ -55,6 +55,7 @@ userNotFoundMessage=Pengguna tidak ditemukan.
|
|||||||
incorrectPasswordMessage=Kata sandi saat ini salah.
|
incorrectPasswordMessage=Kata sandi saat ini salah.
|
||||||
usernameExistsMessage=Nama pengguna baru sudah ada.
|
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.
|
invalidUsernameMessage=Invalid username, username can only contain letters, numbers and the following special characters @._+- or must be a valid email address.
|
||||||
|
confirmPasswordErrorMessage=New Password and Confirm New Password must match.
|
||||||
deleteCurrentUserMessage=Cannot delete currently logged in user.
|
deleteCurrentUserMessage=Cannot delete currently logged in user.
|
||||||
deleteUsernameExistsMessage=The username does not exist and cannot be deleted.
|
deleteUsernameExistsMessage=The username does not exist and cannot be deleted.
|
||||||
downgradeCurrentUserMessage=Tidak dapat menurunkan peran pengguna saat ini
|
downgradeCurrentUserMessage=Tidak dapat menurunkan peran pengguna saat ini
|
||||||
@@ -85,6 +86,7 @@ pipeline.defaultOption=Custom
|
|||||||
pipeline.submitButton=Submit
|
pipeline.submitButton=Submit
|
||||||
pipeline.help=Pipeline Help
|
pipeline.help=Pipeline Help
|
||||||
pipeline.scanHelp=Folder Scanning Help
|
pipeline.scanHelp=Folder Scanning Help
|
||||||
|
pipeline.deletePrompt=Are you sure you want to delete pipeline
|
||||||
|
|
||||||
######################
|
######################
|
||||||
# Pipeline Options #
|
# Pipeline Options #
|
||||||
@@ -173,6 +175,8 @@ adminUserSettings.header=Pengaturan Kontrol Admin
|
|||||||
adminUserSettings.admin=Admin
|
adminUserSettings.admin=Admin
|
||||||
adminUserSettings.user=Pengguna
|
adminUserSettings.user=Pengguna
|
||||||
adminUserSettings.addUser=Tambahkan Pengguna Baru
|
adminUserSettings.addUser=Tambahkan Pengguna Baru
|
||||||
|
adminUserSettings.deleteUser=Delete User
|
||||||
|
adminUserSettings.confirmDeleteUser=Should the user be deleted?
|
||||||
adminUserSettings.usernameInfo=Username can only contain letters, numbers and the following special characters @._+- or must be a valid email address.
|
adminUserSettings.usernameInfo=Username can only contain letters, numbers and the following special characters @._+- or must be a valid email address.
|
||||||
adminUserSettings.roles=Peran
|
adminUserSettings.roles=Peran
|
||||||
adminUserSettings.role=Peran
|
adminUserSettings.role=Peran
|
||||||
@@ -187,6 +191,23 @@ adminUserSettings.submit=Simpan Pengguna
|
|||||||
adminUserSettings.changeUserRole=Ubah Peran Pengguna
|
adminUserSettings.changeUserRole=Ubah Peran Pengguna
|
||||||
adminUserSettings.authenticated=Authenticated
|
adminUserSettings.authenticated=Authenticated
|
||||||
|
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
#############
|
#############
|
||||||
# HOME-PAGE #
|
# HOME-PAGE #
|
||||||
#############
|
#############
|
||||||
@@ -685,6 +706,8 @@ removeAnnotations.submit=Hapus
|
|||||||
#compare
|
#compare
|
||||||
compare.title=Bandingkan
|
compare.title=Bandingkan
|
||||||
compare.header=Bandingkan PDF
|
compare.header=Bandingkan PDF
|
||||||
|
compare.highlightColor.1=Highlight Color 1:
|
||||||
|
compare.highlightColor.2=Highlight Color 2:
|
||||||
compare.document.1=Dokumen 1
|
compare.document.1=Dokumen 1
|
||||||
compare.document.2=Dokumen 2
|
compare.document.2=Dokumen 2
|
||||||
compare.submit=Bandingkan
|
compare.submit=Bandingkan
|
||||||
@@ -799,6 +822,7 @@ merge.title=Gabungkan
|
|||||||
merge.header=Gabungkan beberapa PDFs (2+)
|
merge.header=Gabungkan beberapa PDFs (2+)
|
||||||
merge.sortByName=Sortir berdasarkan nama
|
merge.sortByName=Sortir berdasarkan nama
|
||||||
merge.sortByDate=Sortir berdasrkan tanggal
|
merge.sortByDate=Sortir berdasrkan tanggal
|
||||||
|
merge.removeCertSign=Remove digital signature in the merged file?
|
||||||
merge.submit=Gabungkan
|
merge.submit=Gabungkan
|
||||||
|
|
||||||
|
|
||||||
@@ -816,6 +840,7 @@ pdfOrganiser.mode.6=Odd-Even Split
|
|||||||
pdfOrganiser.mode.7=Remove First
|
pdfOrganiser.mode.7=Remove First
|
||||||
pdfOrganiser.mode.8=Remove Last
|
pdfOrganiser.mode.8=Remove Last
|
||||||
pdfOrganiser.mode.9=Remove First and 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.placeholder=(e.g. 1,3,2 or 4-8,2,10-12 or 2n-1)
|
||||||
|
|
||||||
|
|
||||||
@@ -1077,6 +1102,15 @@ licenses.module=Module
|
|||||||
licenses.version=Version
|
licenses.version=Version
|
||||||
licenses.license=License
|
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.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
|
||||||
|
|
||||||
|
|
||||||
#error
|
#error
|
||||||
error.sorry=Sorry for the issue!
|
error.sorry=Sorry for the issue!
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ sizes.large=Largo
|
|||||||
sizes.x-large=Extra-Large
|
sizes.x-large=Extra-Large
|
||||||
error.pdfPassword=Il documento PDF è protetto da password e la password non è stata fornita oppure non era corretta
|
error.pdfPassword=Il documento PDF è protetto da password e la password non è stata fornita oppure non era corretta
|
||||||
delete=Elimina
|
delete=Elimina
|
||||||
username=Username
|
username=Nome utente
|
||||||
password=Password
|
password=Password
|
||||||
welcome=Benvenuto
|
welcome=Benvenuto
|
||||||
property=Proprietà
|
property=Proprietà
|
||||||
@@ -55,6 +55,7 @@ userNotFoundMessage=Utente non trovato.
|
|||||||
incorrectPasswordMessage=La password attuale non è corretta.
|
incorrectPasswordMessage=La password attuale non è corretta.
|
||||||
usernameExistsMessage=Il nuovo nome utente esiste già.
|
usernameExistsMessage=Il nuovo nome utente esiste già.
|
||||||
invalidUsernameMessage=Nome utente non valido, il nome utente può contenere solo lettere, numeri e i seguenti caratteri speciali @._+- o deve essere un indirizzo email valido.
|
invalidUsernameMessage=Nome utente non valido, il nome utente può contenere solo lettere, numeri e i seguenti caratteri speciali @._+- o deve essere un indirizzo email valido.
|
||||||
|
confirmPasswordErrorMessage=La nuova password e la conferma della nuova password devono corrispondere.
|
||||||
deleteCurrentUserMessage=Impossibile eliminare l'utente attualmente connesso.
|
deleteCurrentUserMessage=Impossibile eliminare l'utente attualmente connesso.
|
||||||
deleteUsernameExistsMessage=Il nome utente non esiste e non può essere eliminato.
|
deleteUsernameExistsMessage=Il nome utente non esiste e non può essere eliminato.
|
||||||
downgradeCurrentUserMessage=Impossibile declassare il ruolo dell'utente corrente
|
downgradeCurrentUserMessage=Impossibile declassare il ruolo dell'utente corrente
|
||||||
@@ -85,6 +86,7 @@ pipeline.defaultOption=Personalizzato
|
|||||||
pipeline.submitButton=Invia
|
pipeline.submitButton=Invia
|
||||||
pipeline.help=Aiuto sulla pipeline
|
pipeline.help=Aiuto sulla pipeline
|
||||||
pipeline.scanHelp=Aiuto per la scansione delle cartelle
|
pipeline.scanHelp=Aiuto per la scansione delle cartelle
|
||||||
|
pipeline.deletePrompt=Sei sicuro di voler eliminare la pipeline?
|
||||||
|
|
||||||
######################
|
######################
|
||||||
# Pipeline Options #
|
# Pipeline Options #
|
||||||
@@ -114,7 +116,7 @@ navbar.multiTool=Strumenti multipli
|
|||||||
navbar.sections.organize=Organizza
|
navbar.sections.organize=Organizza
|
||||||
navbar.sections.convertTo=Converti in PDF
|
navbar.sections.convertTo=Converti in PDF
|
||||||
navbar.sections.convertFrom=Converti da PDF
|
navbar.sections.convertFrom=Converti da PDF
|
||||||
navbar.sections.security=Firma Firma & Sicurezza
|
navbar.sections.security=Firma & Sicurezza
|
||||||
navbar.sections.advance=Avanzate
|
navbar.sections.advance=Avanzate
|
||||||
navbar.sections.edit=Visualizza & Modifica
|
navbar.sections.edit=Visualizza & Modifica
|
||||||
|
|
||||||
@@ -173,6 +175,8 @@ adminUserSettings.header=Impostazioni di controllo utente amministratore
|
|||||||
adminUserSettings.admin=Amministratore
|
adminUserSettings.admin=Amministratore
|
||||||
adminUserSettings.user=Utente
|
adminUserSettings.user=Utente
|
||||||
adminUserSettings.addUser=Aggiungi un nuovo Utente
|
adminUserSettings.addUser=Aggiungi un nuovo Utente
|
||||||
|
adminUserSettings.deleteUser=Elimina utente
|
||||||
|
adminUserSettings.confirmDeleteUser=L'utente deve essere eliminato?
|
||||||
adminUserSettings.usernameInfo=Il nome utente può contenere solo lettere, numeri e i seguenti caratteri speciali @._+- oppure deve essere un indirizzo email valido.
|
adminUserSettings.usernameInfo=Il nome utente può contenere solo lettere, numeri e i seguenti caratteri speciali @._+- oppure deve essere un indirizzo email valido.
|
||||||
adminUserSettings.roles=Ruoli
|
adminUserSettings.roles=Ruoli
|
||||||
adminUserSettings.role=Ruolo
|
adminUserSettings.role=Ruolo
|
||||||
@@ -187,6 +191,23 @@ adminUserSettings.submit=Salva utente
|
|||||||
adminUserSettings.changeUserRole=Cambia il ruolo dell'utente
|
adminUserSettings.changeUserRole=Cambia il ruolo dell'utente
|
||||||
adminUserSettings.authenticated=Autenticato
|
adminUserSettings.authenticated=Autenticato
|
||||||
|
|
||||||
|
|
||||||
|
database.title=Importazione/Esportazione database
|
||||||
|
database.header=Importazione/esportazione database
|
||||||
|
database.fileName=Nome file
|
||||||
|
database.creationDate=Data di creazione
|
||||||
|
database.fileSize=Dimensione
|
||||||
|
database.deleteBackupFile=Elimina file di backup
|
||||||
|
database.importBackupFile=Importa file di backup
|
||||||
|
database.downloadBackupFile=Scarica il file di backup
|
||||||
|
database.info_1=Quando si importano i dati, è fondamentale garantire la struttura corretta. Se non sei sicuro di quello che stai facendo, chiedi consiglio e supporto a un professionista. Un errore nella struttura può causare malfunzionamenti dell'applicazione, fino alla completa impossibilità di eseguire l'applicazione.
|
||||||
|
database.info_2=Il nome del file non ha importanza durante il caricamento. Verrà rinominato in seguito per seguire il formato backup_user__yyyyMMddHHmm.sql,garantendo una convenzione di denominazione coerente.
|
||||||
|
database.submit=Importa Backup
|
||||||
|
database.importIntoDatabaseSuccessed=L'importazione nel database è avvenuta con successo
|
||||||
|
database.fileNotFound=File non trovato
|
||||||
|
database.fileNullOrEmpty=Il file non deve essere nullo o vuoto
|
||||||
|
database.failedImportFile=Importazione file non riuscita
|
||||||
|
|
||||||
#############
|
#############
|
||||||
# HOME-PAGE #
|
# HOME-PAGE #
|
||||||
#############
|
#############
|
||||||
@@ -230,7 +251,7 @@ pdfOrganiser.tags=duplex,pari,dispari,ordinamento,spostamento
|
|||||||
|
|
||||||
home.addImage.title=Aggiungi Immagine
|
home.addImage.title=Aggiungi Immagine
|
||||||
home.addImage.desc=Aggiungi un'immagine in un punto specifico del PDF (Lavori in corso)
|
home.addImage.desc=Aggiungi un'immagine in un punto specifico del PDF (Lavori in corso)
|
||||||
addImage.tags=img,jpg,immagine,photo
|
addImage.tags=img,jpg,immagine,foto
|
||||||
|
|
||||||
home.watermark.title=Aggiungi Filigrana
|
home.watermark.title=Aggiungi Filigrana
|
||||||
home.watermark.desc=Aggiungi una filigrana al tuo PDF.
|
home.watermark.desc=Aggiungi una filigrana al tuo PDF.
|
||||||
@@ -332,9 +353,9 @@ home.certSign.title=Firma con certificato
|
|||||||
home.certSign.desc=Firma un PDF con un certificato/chiave (PEM/P12)
|
home.certSign.desc=Firma un PDF con un certificato/chiave (PEM/P12)
|
||||||
certSign.tags=autenticare,PEM,P12,ufficiale,crittografare
|
certSign.tags=autenticare,PEM,P12,ufficiale,crittografare
|
||||||
|
|
||||||
home.removeCertSign.title=Remove Certificate Sign
|
home.removeCertSign.title=Rimuovere firma dal certificato
|
||||||
home.removeCertSign.desc=Remove certificate signature from PDF
|
home.removeCertSign.desc=Rimuovi la firma del certificato dal PDF
|
||||||
removeCertSign.tags=authenticate,PEM,P12,official,decrypt
|
removeCertSign.tags=autenticare,PEM,P12,ufficiale,decifrare
|
||||||
|
|
||||||
home.pageLayout.title=Layout multipagina
|
home.pageLayout.title=Layout multipagina
|
||||||
home.pageLayout.desc=Unisci più pagine di un documento PDF in un'unica pagina
|
home.pageLayout.desc=Unisci più pagine di un documento PDF in un'unica pagina
|
||||||
@@ -685,6 +706,8 @@ removeAnnotations.submit=Rimuovi
|
|||||||
#compare
|
#compare
|
||||||
compare.title=Compara
|
compare.title=Compara
|
||||||
compare.header=Compara PDF
|
compare.header=Compara PDF
|
||||||
|
compare.highlightColor.1=Highlight Color 1:
|
||||||
|
compare.highlightColor.2=Highlight Color 2:
|
||||||
compare.document.1=Documento 1
|
compare.document.1=Documento 1
|
||||||
compare.document.2=Documento 2
|
compare.document.2=Documento 2
|
||||||
compare.submit=Compara
|
compare.submit=Compara
|
||||||
@@ -799,6 +822,7 @@ merge.title=Unisci
|
|||||||
merge.header=Unisci 2 o più PDF
|
merge.header=Unisci 2 o più PDF
|
||||||
merge.sortByName=Ordina per nome
|
merge.sortByName=Ordina per nome
|
||||||
merge.sortByDate=Ordina per data
|
merge.sortByDate=Ordina per data
|
||||||
|
merge.removeCertSign=Rimuovere la firma digitale nel file unito?
|
||||||
merge.submit=Unisci
|
merge.submit=Unisci
|
||||||
|
|
||||||
|
|
||||||
@@ -816,6 +840,7 @@ pdfOrganiser.mode.6=Divisione pari-dispari
|
|||||||
pdfOrganiser.mode.7=Rimuovi prima
|
pdfOrganiser.mode.7=Rimuovi prima
|
||||||
pdfOrganiser.mode.8=Rimuovi ultima
|
pdfOrganiser.mode.8=Rimuovi ultima
|
||||||
pdfOrganiser.mode.9=Rimuovi la prima e l'ultima
|
pdfOrganiser.mode.9=Rimuovi la prima e l'ultima
|
||||||
|
pdfOrganiser.mode.10=Unione pari-dispari
|
||||||
pdfOrganiser.placeholder=(ad es. 1,3,2 o 4-8,2,10-12 o 2n-1)
|
pdfOrganiser.placeholder=(ad es. 1,3,2 o 4-8,2,10-12 o 2n-1)
|
||||||
|
|
||||||
|
|
||||||
@@ -976,7 +1001,7 @@ pdfToPDFA.credit=Questo servizio utilizza OCRmyPDF per la conversione in PDF/A.
|
|||||||
pdfToPDFA.submit=Converti
|
pdfToPDFA.submit=Converti
|
||||||
pdfToPDFA.tip=Attualmente non funziona per più input contemporaneamente
|
pdfToPDFA.tip=Attualmente non funziona per più input contemporaneamente
|
||||||
pdfToPDFA.outputFormat=Formato di output
|
pdfToPDFA.outputFormat=Formato di output
|
||||||
pdfToPDFA.pdfWithDigitalSignature=The PDF contains a digital signature. This will be removed in the next step.
|
pdfToPDFA.pdfWithDigitalSignature=Il PDF contiene una firma digitale. Questo verrà rimosso nel passaggio successivo.
|
||||||
|
|
||||||
|
|
||||||
#PDFToWord
|
#PDFToWord
|
||||||
@@ -1077,6 +1102,15 @@ licenses.module=Modulo
|
|||||||
licenses.version=Versione
|
licenses.version=Versione
|
||||||
licenses.license=Licenza
|
licenses.license=Licenza
|
||||||
|
|
||||||
|
#survey
|
||||||
|
survey.nav=Sondaggio
|
||||||
|
survey.title=Sondaggio Stirling-PDF
|
||||||
|
survey.description=Stirling-PDF non fa tracciamento, quindi vogliamo sentire i nostri utenti per migliorare Stirling-PDF!
|
||||||
|
survey.please=Ti invitiamo a prendere in considerazione la possibilità di partecipare al nostro sondaggio!
|
||||||
|
survey.disabled=(Il popup del sondaggio verrà disabilitato nei prossimi aggiornamenti ma sarà disponibile a piè di pagina)
|
||||||
|
survey.button=Partecipa al sondaggio
|
||||||
|
survey.dontShowAgain=Non mostrare più
|
||||||
|
|
||||||
|
|
||||||
#error
|
#error
|
||||||
error.sorry=Ci scusiamo per il problema!
|
error.sorry=Ci scusiamo per il problema!
|
||||||
|
|||||||
@@ -55,12 +55,13 @@ userNotFoundMessage=ユーザーが見つかりません。
|
|||||||
incorrectPasswordMessage=現在のパスワードが正しくありません。
|
incorrectPasswordMessage=現在のパスワードが正しくありません。
|
||||||
usernameExistsMessage=新しいユーザー名はすでに存在します。
|
usernameExistsMessage=新しいユーザー名はすでに存在します。
|
||||||
invalidUsernameMessage=ユーザー名が無効です。ユーザー名には文字、数字、およびそれに続く特殊文字 @._+- のみを含めることができます。または、有効な電子メール アドレスである必要があります。
|
invalidUsernameMessage=ユーザー名が無効です。ユーザー名には文字、数字、およびそれに続く特殊文字 @._+- のみを含めることができます。または、有効な電子メール アドレスである必要があります。
|
||||||
|
confirmPasswordErrorMessage=新しいパスワードと新しいパスワードの確認は一致する必要があります。
|
||||||
deleteCurrentUserMessage=現在ログインしているユーザーは削除できません。
|
deleteCurrentUserMessage=現在ログインしているユーザーは削除できません。
|
||||||
deleteUsernameExistsMessage=そのユーザー名は存在しないため削除できません。
|
deleteUsernameExistsMessage=そのユーザー名は存在しないため削除できません。
|
||||||
downgradeCurrentUserMessage=現在のユーザーの役割をダウングレードできません
|
downgradeCurrentUserMessage=現在のユーザーの役割をダウングレードできません
|
||||||
downgradeCurrentUserLongMessage=現在のユーザーの役割をダウングレードできません。したがって、現在のユーザーは表示されません。
|
downgradeCurrentUserLongMessage=現在のユーザーの役割をダウングレードできません。したがって、現在のユーザーは表示されません。
|
||||||
userAlreadyExistsOAuthMessage=The user already exists as an OAuth2 user.
|
userAlreadyExistsOAuthMessage=ユーザーは既にOAuth2ユーザーとして存在します。
|
||||||
userAlreadyExistsWebMessage=The user already exists as an web user.
|
userAlreadyExistsWebMessage=ユーザーは既にWebユーザーとして存在します。
|
||||||
error=エラー
|
error=エラー
|
||||||
oops=おっと!
|
oops=おっと!
|
||||||
help=ヘルプ
|
help=ヘルプ
|
||||||
@@ -85,6 +86,7 @@ pipeline.defaultOption=カスタム
|
|||||||
pipeline.submitButton=送信
|
pipeline.submitButton=送信
|
||||||
pipeline.help=パイプラインのヘルプ
|
pipeline.help=パイプラインのヘルプ
|
||||||
pipeline.scanHelp=フォルダ スキャンのヘルプ
|
pipeline.scanHelp=フォルダ スキャンのヘルプ
|
||||||
|
pipeline.deletePrompt=パイプラインを削除してもよろしいですか
|
||||||
|
|
||||||
######################
|
######################
|
||||||
# Pipeline Options #
|
# Pipeline Options #
|
||||||
@@ -107,23 +109,23 @@ pipelineOptions.validateButton=検証
|
|||||||
#############
|
#############
|
||||||
navbar.favorite=Favorites
|
navbar.favorite=Favorites
|
||||||
navbar.darkmode=ダークモード
|
navbar.darkmode=ダークモード
|
||||||
navbar.language=Languages
|
navbar.language=言語
|
||||||
navbar.settings=設定
|
navbar.settings=設定
|
||||||
navbar.allTools=Tools
|
navbar.allTools=ツール
|
||||||
navbar.multiTool=Multi Tools
|
navbar.multiTool=マルチツール
|
||||||
navbar.sections.organize=Organize
|
navbar.sections.organize=整理
|
||||||
navbar.sections.convertTo=Convert to PDF
|
navbar.sections.convertTo=PDFへ変換
|
||||||
navbar.sections.convertFrom=Convert from PDF
|
navbar.sections.convertFrom=PDFから変換
|
||||||
navbar.sections.security=Sign & Security
|
navbar.sections.security=署名とセキュリティ
|
||||||
navbar.sections.advance=Advanced
|
navbar.sections.advance=アドバンスド
|
||||||
navbar.sections.edit=View & Edit
|
navbar.sections.edit=閲覧と編集
|
||||||
|
|
||||||
#############
|
#############
|
||||||
# SETTINGS #
|
# SETTINGS #
|
||||||
#############
|
#############
|
||||||
settings.title=設定
|
settings.title=設定
|
||||||
settings.update=利用可能なアップデート
|
settings.update=利用可能なアップデート
|
||||||
settings.updateAvailable={0} is the current installed version. A new version ({1}) is available.
|
settings.updateAvailable=バージョン {0} がインストールされています。 新しいバージョン ({1}) が利用可能です。
|
||||||
settings.appVersion=Appバージョン:
|
settings.appVersion=Appバージョン:
|
||||||
settings.downloadOption.title=ダウンロードオプション (zip以外の単一ファイル):
|
settings.downloadOption.title=ダウンロードオプション (zip以外の単一ファイル):
|
||||||
settings.downloadOption.1=同じウィンドウで開く
|
settings.downloadOption.1=同じウィンドウで開く
|
||||||
@@ -132,9 +134,9 @@ settings.downloadOption.3=ファイルをダウンロード
|
|||||||
settings.zipThreshold=このファイル数を超えたときにファイルを圧縮する
|
settings.zipThreshold=このファイル数を超えたときにファイルを圧縮する
|
||||||
settings.signOut=サインアウト
|
settings.signOut=サインアウト
|
||||||
settings.accountSettings=アカウント設定
|
settings.accountSettings=アカウント設定
|
||||||
settings.bored.help=Enables easter egg game
|
settings.bored.help=イースターエッグゲームを有効にする
|
||||||
settings.cacheInputs.name=Save form inputs
|
settings.cacheInputs.name=フォームの入力を保存する
|
||||||
settings.cacheInputs.help=Enable to store previously used inputs for future runs
|
settings.cacheInputs.help=以前使用した入力を保存し、次回から使用できるようにする。
|
||||||
|
|
||||||
changeCreds.title=資格情報の変更
|
changeCreds.title=資格情報の変更
|
||||||
changeCreds.header=アカウントの詳細を更新する
|
changeCreds.header=アカウントの詳細を更新する
|
||||||
@@ -173,6 +175,8 @@ adminUserSettings.header=管理者ユーザー制御設定
|
|||||||
adminUserSettings.admin=管理者
|
adminUserSettings.admin=管理者
|
||||||
adminUserSettings.user=ユーザー
|
adminUserSettings.user=ユーザー
|
||||||
adminUserSettings.addUser=新しいユーザを追加
|
adminUserSettings.addUser=新しいユーザを追加
|
||||||
|
adminUserSettings.deleteUser=ユーザの削除
|
||||||
|
adminUserSettings.confirmDeleteUser=ユーザを本当に削除しますか?
|
||||||
adminUserSettings.usernameInfo=ユーザー名には、文字、数字、および次の特殊文字 @._+- のみを含めることができます。または、有効な電子メール アドレスである必要があります。
|
adminUserSettings.usernameInfo=ユーザー名には、文字、数字、および次の特殊文字 @._+- のみを含めることができます。または、有効な電子メール アドレスである必要があります。
|
||||||
adminUserSettings.roles=役割
|
adminUserSettings.roles=役割
|
||||||
adminUserSettings.role=役割
|
adminUserSettings.role=役割
|
||||||
@@ -185,7 +189,24 @@ adminUserSettings.internalApiUser=内部APIユーザー
|
|||||||
adminUserSettings.forceChange=ログイン時にユーザー名/パスワードを強制的に変更する
|
adminUserSettings.forceChange=ログイン時にユーザー名/パスワードを強制的に変更する
|
||||||
adminUserSettings.submit=ユーザーの保存
|
adminUserSettings.submit=ユーザーの保存
|
||||||
adminUserSettings.changeUserRole=ユーザーの役割を変更する
|
adminUserSettings.changeUserRole=ユーザーの役割を変更する
|
||||||
adminUserSettings.authenticated=Authenticated
|
adminUserSettings.authenticated=認証済
|
||||||
|
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
#############
|
#############
|
||||||
# HOME-PAGE #
|
# HOME-PAGE #
|
||||||
@@ -332,8 +353,8 @@ home.certSign.title=証明書による署名
|
|||||||
home.certSign.desc=証明書/キーを使用してPDFに署名します。 (PEM/P12)
|
home.certSign.desc=証明書/キーを使用してPDFに署名します。 (PEM/P12)
|
||||||
certSign.tags=authenticate,PEM,P12,official,encrypt
|
certSign.tags=authenticate,PEM,P12,official,encrypt
|
||||||
|
|
||||||
home.removeCertSign.title=Remove Certificate Sign
|
home.removeCertSign.title=証明書の署名を削除する
|
||||||
home.removeCertSign.desc=Remove certificate signature from PDF
|
home.removeCertSign.desc=PDFから証明書署名を削除する
|
||||||
removeCertSign.tags=authenticate,PEM,P12,official,decrypt
|
removeCertSign.tags=authenticate,PEM,P12,official,decrypt
|
||||||
|
|
||||||
home.pageLayout.title=マルチページレイアウト
|
home.pageLayout.title=マルチページレイアウト
|
||||||
@@ -456,12 +477,12 @@ login.locked=あなたのアカウントはロックされています。
|
|||||||
login.signinTitle=サインインしてください
|
login.signinTitle=サインインしてください
|
||||||
login.ssoSignIn=シングルサインオンでログイン
|
login.ssoSignIn=シングルサインオンでログイン
|
||||||
login.oauth2AutoCreateDisabled=OAuth 2自動作成ユーザーが無効
|
login.oauth2AutoCreateDisabled=OAuth 2自動作成ユーザーが無効
|
||||||
login.oauth2RequestNotFound=Authorization request not found
|
login.oauth2RequestNotFound=認証リクエストが見つかりません
|
||||||
login.oauth2InvalidUserInfoResponse=Invalid User Info Response
|
login.oauth2InvalidUserInfoResponse=無効なユーザー情報の応答
|
||||||
login.oauth2invalidRequest=Invalid Request
|
login.oauth2invalidRequest=無効なリクエスト
|
||||||
login.oauth2AccessDenied=Access Denied
|
login.oauth2AccessDenied=アクセス拒否
|
||||||
login.oauth2InvalidTokenResponse=Invalid Token Response
|
login.oauth2InvalidTokenResponse=無効なトークン応答
|
||||||
login.oauth2InvalidIdToken=Invalid Id Token
|
login.oauth2InvalidIdToken=無効なIDトークン
|
||||||
|
|
||||||
|
|
||||||
#auto-redact
|
#auto-redact
|
||||||
@@ -660,10 +681,10 @@ certSign.submit=PDFに署名
|
|||||||
|
|
||||||
|
|
||||||
#removeCertSign
|
#removeCertSign
|
||||||
removeCertSign.title=Remove Certificate Signature
|
removeCertSign.title=証明書署名の削除
|
||||||
removeCertSign.header=Remove the digital certificate from the PDF
|
removeCertSign.header=PDFから電子証明書を削除する
|
||||||
removeCertSign.selectPDF=Select a PDF file:
|
removeCertSign.selectPDF=PDFファイルの選択:
|
||||||
removeCertSign.submit=Remove Signature
|
removeCertSign.submit=署名の削除
|
||||||
|
|
||||||
|
|
||||||
#removeBlanks
|
#removeBlanks
|
||||||
@@ -685,6 +706,8 @@ removeAnnotations.submit=削除
|
|||||||
#compare
|
#compare
|
||||||
compare.title=比較
|
compare.title=比較
|
||||||
compare.header=PDFの比較
|
compare.header=PDFの比較
|
||||||
|
compare.highlightColor.1=Highlight Color 1:
|
||||||
|
compare.highlightColor.2=Highlight Color 2:
|
||||||
compare.document.1=ドキュメント 1
|
compare.document.1=ドキュメント 1
|
||||||
compare.document.2=ドキュメント 2
|
compare.document.2=ドキュメント 2
|
||||||
compare.submit=比較
|
compare.submit=比較
|
||||||
@@ -721,7 +744,7 @@ repair.submit=修復
|
|||||||
#flatten
|
#flatten
|
||||||
flatten.title=平坦化
|
flatten.title=平坦化
|
||||||
flatten.header=PDFを平坦化する
|
flatten.header=PDFを平坦化する
|
||||||
flatten.flattenOnlyForms=Flatten only forms
|
flatten.flattenOnlyForms=フォームのみを平坦にする
|
||||||
flatten.submit=平坦化
|
flatten.submit=平坦化
|
||||||
|
|
||||||
|
|
||||||
@@ -748,7 +771,7 @@ ocr.selectText.4=ページをきれいにして背景ノイズの中からテキ
|
|||||||
ocr.selectText.5=ページをきれいにして背景ノイズの中からテキストを検出しにくくし、出力はクリーンアップを維持する。
|
ocr.selectText.5=ページをきれいにして背景ノイズの中からテキストを検出しにくくし、出力はクリーンアップを維持する。
|
||||||
ocr.selectText.6=インタラクティブなテキストを含むページを無視し、画像ページのみをOCRする
|
ocr.selectText.6=インタラクティブなテキストを含むページを無視し、画像ページのみをOCRする
|
||||||
ocr.selectText.7=強制OCR、全てのページで元のテキスト要素を全て削除してOCRする
|
ocr.selectText.7=強制OCR、全てのページで元のテキスト要素を全て削除してOCRする
|
||||||
ocr.selectText.8=Normal (PDFにテキストが含まれている場合はエラーになります。)
|
ocr.selectText.8=ノーマル (PDFにテキストが含まれている場合はエラーになります。)
|
||||||
ocr.selectText.9=追加設定
|
ocr.selectText.9=追加設定
|
||||||
ocr.selectText.10=OCRモード
|
ocr.selectText.10=OCRモード
|
||||||
ocr.selectText.11=OCR後に画像を削除する (すべての画像を削除します。変換ステップの一部である場合にのみ有効です)。
|
ocr.selectText.11=OCR後に画像を削除する (すべての画像を削除します。変換ステップの一部である場合にのみ有効です)。
|
||||||
@@ -769,7 +792,7 @@ extractImages.submit=抽出
|
|||||||
fileToPDF.title=ファイルをPDFに変換
|
fileToPDF.title=ファイルをPDFに変換
|
||||||
fileToPDF.header=あらゆるファイルをPDFに変換
|
fileToPDF.header=あらゆるファイルをPDFに変換
|
||||||
fileToPDF.credit=本サービスはファイル変換にLibreOfficeとUnoconvを使用しています。
|
fileToPDF.credit=本サービスはファイル変換にLibreOfficeとUnoconvを使用しています。
|
||||||
fileToPDF.supportedFileTypesInfo=Supported File types
|
fileToPDF.supportedFileTypesInfo=サポートされるファイル形式
|
||||||
fileToPDF.supportedFileTypes=サポートされるファイル形式には以下が含まれますが、完全な更新リストについてはLibreOfficeのドキュメントを参照してください。
|
fileToPDF.supportedFileTypes=サポートされるファイル形式には以下が含まれますが、完全な更新リストについてはLibreOfficeのドキュメントを参照してください。
|
||||||
fileToPDF.submit=PDFを変換
|
fileToPDF.submit=PDFを変換
|
||||||
|
|
||||||
@@ -799,6 +822,7 @@ merge.title=結合
|
|||||||
merge.header=複数のPDFを結合 (2ファイル以上)
|
merge.header=複数のPDFを結合 (2ファイル以上)
|
||||||
merge.sortByName=名前で並べ替え
|
merge.sortByName=名前で並べ替え
|
||||||
merge.sortByDate=日付で並べ替え
|
merge.sortByDate=日付で並べ替え
|
||||||
|
merge.removeCertSign=結合されたファイル内のデジタル署名を削除しますか?
|
||||||
merge.submit=結合
|
merge.submit=結合
|
||||||
|
|
||||||
|
|
||||||
@@ -816,13 +840,14 @@ pdfOrganiser.mode.6=奇数-偶数分割
|
|||||||
pdfOrganiser.mode.7=最初に削除
|
pdfOrganiser.mode.7=最初に削除
|
||||||
pdfOrganiser.mode.8=最後を削除
|
pdfOrganiser.mode.8=最後を削除
|
||||||
pdfOrganiser.mode.9=最初と最後を削除
|
pdfOrganiser.mode.9=最初と最後を削除
|
||||||
|
pdfOrganiser.mode.10=Odd-Even Merge
|
||||||
pdfOrganiser.placeholder=(例:1,3,2または4-8,2,10-12または2n-1)
|
pdfOrganiser.placeholder=(例:1,3,2または4-8,2,10-12または2n-1)
|
||||||
|
|
||||||
|
|
||||||
#multiTool
|
#multiTool
|
||||||
multiTool.title=PDFマルチツール
|
multiTool.title=PDFマルチツール
|
||||||
multiTool.header=PDFマルチツール
|
multiTool.header=PDFマルチツール
|
||||||
multiTool.uploadPrompts=File Name
|
multiTool.uploadPrompts=ファイル名
|
||||||
|
|
||||||
#view pdf
|
#view pdf
|
||||||
viewPdf.title=PDFを表示
|
viewPdf.title=PDFを表示
|
||||||
@@ -976,7 +1001,7 @@ pdfToPDFA.credit=本サービスはPDF/Aの変換にOCRmyPDFを使用してい
|
|||||||
pdfToPDFA.submit=変換
|
pdfToPDFA.submit=変換
|
||||||
pdfToPDFA.tip=現在、一度に複数の入力に対して機能しません
|
pdfToPDFA.tip=現在、一度に複数の入力に対して機能しません
|
||||||
pdfToPDFA.outputFormat=Output format
|
pdfToPDFA.outputFormat=Output format
|
||||||
pdfToPDFA.pdfWithDigitalSignature=The PDF contains a digital signature. This will be removed in the next step.
|
pdfToPDFA.pdfWithDigitalSignature=PDF にはデジタル署名が含まれています。これは次の手順で削除されます。
|
||||||
|
|
||||||
|
|
||||||
#PDFToWord
|
#PDFToWord
|
||||||
@@ -1062,11 +1087,11 @@ split-by-sections.merge=1 つの PDF に結合するかどうか
|
|||||||
|
|
||||||
|
|
||||||
#printFile
|
#printFile
|
||||||
printFile.title=Print File
|
printFile.title=ファイルの印刷
|
||||||
printFile.header=Print File to Printer
|
printFile.header=ファイルをプリンタで印刷
|
||||||
printFile.selectText.1=Select File to Print
|
printFile.selectText.1=印刷するファイルを選択
|
||||||
printFile.selectText.2=Enter Printer Name
|
printFile.selectText.2=プリンタ名を入力
|
||||||
printFile.submit=Print
|
printFile.submit=プリント
|
||||||
|
|
||||||
|
|
||||||
#licenses
|
#licenses
|
||||||
@@ -1077,6 +1102,15 @@ licenses.module=モジュール
|
|||||||
licenses.version=バージョン
|
licenses.version=バージョン
|
||||||
licenses.license=ライセンス
|
licenses.license=ライセンス
|
||||||
|
|
||||||
|
#survey
|
||||||
|
survey.nav=アンケート
|
||||||
|
survey.title=Stirling-PDFのアンケート
|
||||||
|
survey.description=Stirling-PDFには追跡機能がないため、Stirling-PDFをより良くするために皆様の意見を聞かせてください!
|
||||||
|
survey.please=アンケートにご協力ください!
|
||||||
|
survey.disabled=(アンケートのポップアップは、次の更新では無効になりますが、ページの下部に表示されます。)
|
||||||
|
survey.button=アンケートに答える
|
||||||
|
survey.dontShowAgain=再び表示しない
|
||||||
|
|
||||||
|
|
||||||
#error
|
#error
|
||||||
error.sorry=問題が発生したことをお詫び申し上げます!
|
error.sorry=問題が発生したことをお詫び申し上げます!
|
||||||
|
|||||||
@@ -55,6 +55,7 @@ userNotFoundMessage=사용자를 찾을 수 없습니다.
|
|||||||
incorrectPasswordMessage=현재 비밀번호가 틀립니다.
|
incorrectPasswordMessage=현재 비밀번호가 틀립니다.
|
||||||
usernameExistsMessage=새 사용자명이 이미 존재합니다.
|
usernameExistsMessage=새 사용자명이 이미 존재합니다.
|
||||||
invalidUsernameMessage=잘못된 사용자 이름입니다. 사용자 이름에는 문자, 숫자 및 다음 특수 문자(@._+-)만 포함할 수 있거나 유효한 이메일 주소여야 합니다.
|
invalidUsernameMessage=잘못된 사용자 이름입니다. 사용자 이름에는 문자, 숫자 및 다음 특수 문자(@._+-)만 포함할 수 있거나 유효한 이메일 주소여야 합니다.
|
||||||
|
confirmPasswordErrorMessage=New Password and Confirm New Password must match.
|
||||||
deleteCurrentUserMessage=현재 로그인한 사용자를 삭제할 수 없습니다.
|
deleteCurrentUserMessage=현재 로그인한 사용자를 삭제할 수 없습니다.
|
||||||
deleteUsernameExistsMessage=사용자 이름이 존재하지 않으며 삭제할 수 없습니다.
|
deleteUsernameExistsMessage=사용자 이름이 존재하지 않으며 삭제할 수 없습니다.
|
||||||
downgradeCurrentUserMessage=현재 사용자의 역할을 다운그레이드할 수 없습니다
|
downgradeCurrentUserMessage=현재 사용자의 역할을 다운그레이드할 수 없습니다
|
||||||
@@ -85,6 +86,7 @@ pipeline.defaultOption=관습
|
|||||||
pipeline.submitButton=전송
|
pipeline.submitButton=전송
|
||||||
pipeline.help=파이프라인 도움말
|
pipeline.help=파이프라인 도움말
|
||||||
pipeline.scanHelp=폴더 스캔 도움말
|
pipeline.scanHelp=폴더 스캔 도움말
|
||||||
|
pipeline.deletePrompt=Are you sure you want to delete pipeline
|
||||||
|
|
||||||
######################
|
######################
|
||||||
# Pipeline Options #
|
# Pipeline Options #
|
||||||
@@ -173,6 +175,8 @@ adminUserSettings.header=사용자 관리
|
|||||||
adminUserSettings.admin=관리자
|
adminUserSettings.admin=관리자
|
||||||
adminUserSettings.user=사용자
|
adminUserSettings.user=사용자
|
||||||
adminUserSettings.addUser=새 사용자 추가
|
adminUserSettings.addUser=새 사용자 추가
|
||||||
|
adminUserSettings.deleteUser=Delete User
|
||||||
|
adminUserSettings.confirmDeleteUser=Should the user be deleted?
|
||||||
adminUserSettings.usernameInfo=사용자 이름은 문자, 숫자, 특수 문자 @._+-만 포함할 수 있으며 유효한 이메일 주소여야 합니다.
|
adminUserSettings.usernameInfo=사용자 이름은 문자, 숫자, 특수 문자 @._+-만 포함할 수 있으며 유효한 이메일 주소여야 합니다.
|
||||||
adminUserSettings.roles=역할
|
adminUserSettings.roles=역할
|
||||||
adminUserSettings.role=역할
|
adminUserSettings.role=역할
|
||||||
@@ -187,6 +191,23 @@ adminUserSettings.submit=사용자 저장
|
|||||||
adminUserSettings.changeUserRole=사용자의 역할 변경
|
adminUserSettings.changeUserRole=사용자의 역할 변경
|
||||||
adminUserSettings.authenticated=Authenticated
|
adminUserSettings.authenticated=Authenticated
|
||||||
|
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
#############
|
#############
|
||||||
# HOME-PAGE #
|
# HOME-PAGE #
|
||||||
#############
|
#############
|
||||||
@@ -685,6 +706,8 @@ removeAnnotations.submit=제거하다
|
|||||||
#compare
|
#compare
|
||||||
compare.title=비교
|
compare.title=비교
|
||||||
compare.header=PDF 문서 비교
|
compare.header=PDF 문서 비교
|
||||||
|
compare.highlightColor.1=Highlight Color 1:
|
||||||
|
compare.highlightColor.2=Highlight Color 2:
|
||||||
compare.document.1=문서 1
|
compare.document.1=문서 1
|
||||||
compare.document.2=문서 2
|
compare.document.2=문서 2
|
||||||
compare.submit=비교
|
compare.submit=비교
|
||||||
@@ -799,6 +822,7 @@ merge.title=병합
|
|||||||
merge.header=여러 개의 PDF 병합 (2개 이상)
|
merge.header=여러 개의 PDF 병합 (2개 이상)
|
||||||
merge.sortByName=이름순 정렬
|
merge.sortByName=이름순 정렬
|
||||||
merge.sortByDate=날짜순 정렬
|
merge.sortByDate=날짜순 정렬
|
||||||
|
merge.removeCertSign=Remove digital signature in the merged file?
|
||||||
merge.submit=병합
|
merge.submit=병합
|
||||||
|
|
||||||
|
|
||||||
@@ -816,6 +840,7 @@ pdfOrganiser.mode.6=홀수-짝수 분할
|
|||||||
pdfOrganiser.mode.7=첫 번째 항목 삭제
|
pdfOrganiser.mode.7=첫 번째 항목 삭제
|
||||||
pdfOrganiser.mode.8=마지막 항목 제거
|
pdfOrganiser.mode.8=마지막 항목 제거
|
||||||
pdfOrganiser.mode.9=첫 번째와 마지막 제거
|
pdfOrganiser.mode.9=첫 번째와 마지막 제거
|
||||||
|
pdfOrganiser.mode.10=Odd-Even Merge
|
||||||
pdfOrganiser.placeholder=(예: 1,3,2 또는 4-8,2,10-12 또는 2n-1)
|
pdfOrganiser.placeholder=(예: 1,3,2 또는 4-8,2,10-12 또는 2n-1)
|
||||||
|
|
||||||
|
|
||||||
@@ -1077,6 +1102,15 @@ licenses.module=모듈
|
|||||||
licenses.version=버전
|
licenses.version=버전
|
||||||
licenses.license=라이센스
|
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.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
|
||||||
|
|
||||||
|
|
||||||
#error
|
#error
|
||||||
error.sorry=문제를 끼친 점 죄송합니다!
|
error.sorry=문제를 끼친 점 죄송합니다!
|
||||||
|
|||||||
@@ -11,17 +11,17 @@ imgPrompt=Selecteer afbeelding(en)
|
|||||||
genericSubmit=Indienen
|
genericSubmit=Indienen
|
||||||
processTimeWarning=Waarschuwing: Dit proces kan tot een minuut duren afhankelijk van de bestandsgrootte
|
processTimeWarning=Waarschuwing: Dit proces kan tot een minuut duren afhankelijk van de bestandsgrootte
|
||||||
pageOrderPrompt=Aangepaste pagina volgorde (Voer een komma-gescheiden lijst van paginanummers of functies in, zoals 2n+1) :
|
pageOrderPrompt=Aangepaste pagina volgorde (Voer een komma-gescheiden lijst van paginanummers of functies in, zoals 2n+1) :
|
||||||
pageSelectionPrompt=Custom Page Selection (Enter a comma-separated list of page numbers 1,5,6 or Functions like 2n+1) :
|
pageSelectionPrompt=Aangepaste pagina selectie (Voer een komma-gescheiden lijst van paginanummer 1,5,6 of functies zoals 2n+1 in) :
|
||||||
goToPage=Ga
|
goToPage=Ga
|
||||||
true=Waar
|
true=Waar
|
||||||
false=Onwaar
|
false=Onwaar
|
||||||
unknown=Onbekend
|
unknown=Onbekend
|
||||||
save=Opslaan
|
save=Opslaan
|
||||||
saveToBrowser=Save to Browser
|
saveToBrowser=Opslaan in browser
|
||||||
close=Sluiten
|
close=Sluiten
|
||||||
filesSelected=Bestanden geselecteerd
|
filesSelected=Bestanden geselecteerd
|
||||||
noFavourites=Geen favorieten toegevoegd
|
noFavourites=Geen favorieten toegevoegd
|
||||||
downloadComplete=Download Complete
|
downloadComplete=Download klaar
|
||||||
bored=Verveeld met wachten?
|
bored=Verveeld met wachten?
|
||||||
alphabet=Alfabet
|
alphabet=Alfabet
|
||||||
downloadPdf=Download PDF
|
downloadPdf=Download PDF
|
||||||
@@ -54,22 +54,23 @@ notAuthenticatedMessage=Gebruiker niet ingelogd.
|
|||||||
userNotFoundMessage=Gebruiker niet gevonden.
|
userNotFoundMessage=Gebruiker niet gevonden.
|
||||||
incorrectPasswordMessage=Huidige wachtwoord is onjuist.
|
incorrectPasswordMessage=Huidige wachtwoord is onjuist.
|
||||||
usernameExistsMessage=Nieuwe gebruikersnaam bestaat al.
|
usernameExistsMessage=Nieuwe gebruikersnaam bestaat al.
|
||||||
invalidUsernameMessage=Invalid username, username can only contain letters, numbers and the following special characters @._+- or must be a valid email address.
|
invalidUsernameMessage=Ongeldige gebruikersnaam, gebruikersnaam kan alleen letters, nummers en de volgende speciale tekens @._+- bevatten of moet een geldig emailadres zijn.
|
||||||
deleteCurrentUserMessage=Cannot delete currently logged in user.
|
confirmPasswordErrorMessage=Nieuw wachtwoord en bevestig wachtwoord moeten overeenkomen.
|
||||||
deleteUsernameExistsMessage=The username does not exist and cannot be deleted.
|
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
|
downgradeCurrentUserMessage=Kan de rol van de huidige gebruiker niet downgraden
|
||||||
downgradeCurrentUserLongMessage=Kan de rol van de huidige gebruiker niet downgraden. Huidige gebruiker wordt dus niet weergegeven.
|
downgradeCurrentUserLongMessage=Kan de rol van de huidige gebruiker niet downgraden. Huidige gebruiker wordt dus niet weergegeven.
|
||||||
userAlreadyExistsOAuthMessage=The user already exists as an OAuth2 user.
|
userAlreadyExistsOAuthMessage=De gebruiker bestaat al als een OAuth2 gebruiker.
|
||||||
userAlreadyExistsWebMessage=The user already exists as an web user.
|
userAlreadyExistsWebMessage=De gebruiker bestaat al als een web gebruiker.
|
||||||
error=Error
|
error=Error
|
||||||
oops=Oops!
|
oops=Oeps!
|
||||||
help=Help
|
help=Help
|
||||||
goHomepage=Go to Homepage
|
goHomepage=Ga naar de startpagina
|
||||||
joinDiscord=Join our Discord server
|
joinDiscord=Word lid van onze Discord server
|
||||||
seeDockerHub=See Docker Hub
|
seeDockerHub=Zie Docker Hub
|
||||||
visitGithub=Visit Github Repository
|
visitGithub=Ga naar de Github Repository
|
||||||
donate=Donate
|
donate=Doneer
|
||||||
color=Color
|
color=Kleur
|
||||||
sponsor=Sponsor
|
sponsor=Sponsor
|
||||||
info=Info
|
info=Info
|
||||||
|
|
||||||
@@ -78,13 +79,14 @@ info=Info
|
|||||||
###############
|
###############
|
||||||
# Pipeline #
|
# Pipeline #
|
||||||
###############
|
###############
|
||||||
pipeline.header=Pijplijn menu (Alpha)
|
pipeline.header=Pijplijn menu (Beta)
|
||||||
pipeline.uploadButton=Aangepast uploaden
|
pipeline.uploadButton=Aangepast uploaden
|
||||||
pipeline.configureButton=Configureren
|
pipeline.configureButton=Configureren
|
||||||
pipeline.defaultOption=Aangepast
|
pipeline.defaultOption=Aangepast
|
||||||
pipeline.submitButton=Opslaan
|
pipeline.submitButton=Opslaan
|
||||||
pipeline.help=Pipeline Help
|
pipeline.help=Pijplijn help
|
||||||
pipeline.scanHelp=Folder Scanning Help
|
pipeline.scanHelp=Map scannen help
|
||||||
|
pipeline.deletePrompt=Weet je zeker dat je deze pijplijn wil verwijderen?
|
||||||
|
|
||||||
######################
|
######################
|
||||||
# Pipeline Options #
|
# Pipeline Options #
|
||||||
@@ -105,25 +107,25 @@ pipelineOptions.validateButton=Valideren
|
|||||||
#############
|
#############
|
||||||
# NAVBAR #
|
# NAVBAR #
|
||||||
#############
|
#############
|
||||||
navbar.favorite=Favorites
|
navbar.favorite=Favorieten
|
||||||
navbar.darkmode=Donkere modus
|
navbar.darkmode=Donkere modus
|
||||||
navbar.language=Languages
|
navbar.language=Talen
|
||||||
navbar.settings=Instellingen
|
navbar.settings=Instellingen
|
||||||
navbar.allTools=Tools
|
navbar.allTools=Tools
|
||||||
navbar.multiTool=Multi Tools
|
navbar.multiTool=Multitools
|
||||||
navbar.sections.organize=Organize
|
navbar.sections.organize=Organizeren
|
||||||
navbar.sections.convertTo=Convert to PDF
|
navbar.sections.convertTo=Converteren naar PDF
|
||||||
navbar.sections.convertFrom=Convert from PDF
|
navbar.sections.convertFrom=Converteren van PDF
|
||||||
navbar.sections.security=Sign & Security
|
navbar.sections.security=Ondertekenen & beveiliging
|
||||||
navbar.sections.advance=Advanced
|
navbar.sections.advance=Geavanceerd
|
||||||
navbar.sections.edit=View & Edit
|
navbar.sections.edit=Bekijken & wijzigen
|
||||||
|
|
||||||
#############
|
#############
|
||||||
# SETTINGS #
|
# SETTINGS #
|
||||||
#############
|
#############
|
||||||
settings.title=Instellingen
|
settings.title=Instellingen
|
||||||
settings.update=Update beschikbaar
|
settings.update=Update beschikbaar
|
||||||
settings.updateAvailable={0} is the current installed version. A new version ({1}) is available.
|
settings.updateAvailable={0} is de huidig geïnstalleerde versie. Een nieuwe versie ({1}) is beschikbaar.
|
||||||
settings.appVersion=App versie:
|
settings.appVersion=App versie:
|
||||||
settings.downloadOption.title=Kies download optie (Voor enkelvoudige bestanddownloads zonder zip):
|
settings.downloadOption.title=Kies download optie (Voor enkelvoudige bestanddownloads zonder zip):
|
||||||
settings.downloadOption.1=Open in hetzelfde venster
|
settings.downloadOption.1=Open in hetzelfde venster
|
||||||
@@ -132,13 +134,13 @@ settings.downloadOption.3=Download bestand
|
|||||||
settings.zipThreshold=Bestanden zippen wanneer het aantal gedownloade bestanden meer is dan
|
settings.zipThreshold=Bestanden zippen wanneer het aantal gedownloade bestanden meer is dan
|
||||||
settings.signOut=Uitloggen
|
settings.signOut=Uitloggen
|
||||||
settings.accountSettings=Account instellingen
|
settings.accountSettings=Account instellingen
|
||||||
settings.bored.help=Enables easter egg game
|
settings.bored.help=Schakelt geheim spelletje in
|
||||||
settings.cacheInputs.name=Save form inputs
|
settings.cacheInputs.name=Sla invoer in formulieren op
|
||||||
settings.cacheInputs.help=Enable to store previously used inputs for future runs
|
settings.cacheInputs.help=Schakel in om eerdere invoeren op te slaan voor toekomstige uitvoeren
|
||||||
|
|
||||||
changeCreds.title=Inloggegevens wijzigen
|
changeCreds.title=Inloggegevens wijzigen
|
||||||
changeCreds.header=Werk je accountgegevens bij
|
changeCreds.header=Werk je accountgegevens bij
|
||||||
changeCreds.changePassword=You are using default login credentials. Please enter a new password
|
changeCreds.changePassword=Je gebruikt de standaard inloggegevens. Voer alstublieft een nieuw wachtwoord in
|
||||||
changeCreds.newUsername=Nieuwe gebruikersnaam
|
changeCreds.newUsername=Nieuwe gebruikersnaam
|
||||||
changeCreds.oldPassword=Huidige wachtwoord
|
changeCreds.oldPassword=Huidige wachtwoord
|
||||||
changeCreds.newPassword=Nieuw wachtwoord
|
changeCreds.newPassword=Nieuw wachtwoord
|
||||||
@@ -173,25 +175,44 @@ adminUserSettings.header=Beheer gebruikers
|
|||||||
adminUserSettings.admin=Beheerder
|
adminUserSettings.admin=Beheerder
|
||||||
adminUserSettings.user=Gebruiker
|
adminUserSettings.user=Gebruiker
|
||||||
adminUserSettings.addUser=Voeg nieuwe gebruiker toe
|
adminUserSettings.addUser=Voeg nieuwe gebruiker toe
|
||||||
adminUserSettings.usernameInfo=Username can only contain letters, numbers and the following special characters @._+- or must be a valid email address.
|
adminUserSettings.deleteUser=Verwijder gebruiker
|
||||||
|
adminUserSettings.confirmDeleteUser=Moet deze gebruiker verwijderd worden?
|
||||||
|
adminUserSettings.usernameInfo=Gebruikersnaam kan alleen letters, nummers en de volgende speciale tekens @._+- bevatten of moet een geldig emailadres zijn.
|
||||||
adminUserSettings.roles=Rollen
|
adminUserSettings.roles=Rollen
|
||||||
adminUserSettings.role=Rol
|
adminUserSettings.role=Rol
|
||||||
adminUserSettings.actions=Acties
|
adminUserSettings.actions=Acties
|
||||||
adminUserSettings.apiUser=Beperkte API gebruiker
|
adminUserSettings.apiUser=Beperkte API gebruiker
|
||||||
adminUserSettings.extraApiUser=Additional Limited API User
|
adminUserSettings.extraApiUser=Extra beperkte API gebruiker
|
||||||
adminUserSettings.webOnlyUser=Alleen web gebruiker
|
adminUserSettings.webOnlyUser=Alleen web gebruiker
|
||||||
adminUserSettings.demoUser=Demogebruiker (geen aangepaste instellingen)
|
adminUserSettings.demoUser=Demogebruiker (geen aangepaste instellingen)
|
||||||
adminUserSettings.internalApiUser=Internal API User
|
adminUserSettings.internalApiUser=Interne API gebruiker
|
||||||
adminUserSettings.forceChange=Forceer gebruiker om gebruikersnaam/wachtwoord te wijzigen bij inloggen
|
adminUserSettings.forceChange=Forceer gebruiker om gebruikersnaam/wachtwoord te wijzigen bij inloggen
|
||||||
adminUserSettings.submit=Gebruiker opslaan
|
adminUserSettings.submit=Gebruiker opslaan
|
||||||
adminUserSettings.changeUserRole=De rol van de gebruiker wijzigen
|
adminUserSettings.changeUserRole=De rol van de gebruiker wijzigen
|
||||||
adminUserSettings.authenticated=Authenticated
|
adminUserSettings.authenticated=Geauthenticeerd
|
||||||
|
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
#############
|
#############
|
||||||
# HOME-PAGE #
|
# HOME-PAGE #
|
||||||
#############
|
#############
|
||||||
home.desc=Jouw lokaal gehoste one-stop-shop voor al je PDF-behoeften.
|
home.desc=Jouw lokaal gehoste one-stop-shop voor al je PDF-behoeften.
|
||||||
home.searchBar=Zoeken naar functies...
|
home.searchBar=Zoek naar functies...
|
||||||
|
|
||||||
|
|
||||||
home.viewPdf.title=PDF bekijken
|
home.viewPdf.title=PDF bekijken
|
||||||
@@ -200,11 +221,11 @@ viewPdf.tags=bekijken,lezen,annoteren,tekst,afbeelding
|
|||||||
|
|
||||||
home.multiTool.title=PDF multitool
|
home.multiTool.title=PDF multitool
|
||||||
home.multiTool.desc=Pagina's samenvoegen, draaien, herschikken en verwijderen
|
home.multiTool.desc=Pagina's samenvoegen, draaien, herschikken en verwijderen
|
||||||
multiTool.tags=Multitool,Multi bewerking,UI,klik sleep,voorkant,clientzijde,interactief,beweegbaar,verplaats
|
multiTool.tags=Multitool,meerdere bewerkingen,UI,klik sleep,voorkant,clientzijde,interactief,beweegbaar,verplaats
|
||||||
|
|
||||||
home.merge.title=Samenvoegen
|
home.merge.title=Samenvoegen
|
||||||
home.merge.desc=Voeg eenvoudig meerdere PDF's samen tot één.
|
home.merge.desc=Voeg eenvoudig meerdere PDF's samen tot één.
|
||||||
merge.tags=samenvoegen,Pagina bewerkingen,Serverkant
|
merge.tags=samenvoegen,pagina bewerkingen,serverzijde
|
||||||
|
|
||||||
home.split.title=Splitsen
|
home.split.title=Splitsen
|
||||||
home.split.desc=Splits PDF's in meerdere documenten
|
home.split.desc=Splits PDF's in meerdere documenten
|
||||||
@@ -251,7 +272,7 @@ addPassword.tags=veilig,beveiliging
|
|||||||
|
|
||||||
home.removePassword.title=Wachtwoord verwijderen
|
home.removePassword.title=Wachtwoord verwijderen
|
||||||
home.removePassword.desc=Verwijder wachtwoordbeveiliging van je PDF-document.
|
home.removePassword.desc=Verwijder wachtwoordbeveiliging van je PDF-document.
|
||||||
removePassword.tags=veilig,Decrypteren,beveiliging,wachtwoord verwijderen
|
removePassword.tags=veilig,ontsleutelen,beveiliging,wachtwoord verwijderen
|
||||||
|
|
||||||
home.compressPdfs.title=Comprimeren
|
home.compressPdfs.title=Comprimeren
|
||||||
home.compressPdfs.desc=Comprimeer PDF's om hun bestandsgrootte te verkleinen.
|
home.compressPdfs.desc=Comprimeer PDF's om hun bestandsgrootte te verkleinen.
|
||||||
@@ -332,9 +353,9 @@ home.certSign.title=Ondertekenen met certificaat
|
|||||||
home.certSign.desc=Ondertekent een PDF met een certificaat/sleutel (PEM/P12)
|
home.certSign.desc=Ondertekent een PDF met een certificaat/sleutel (PEM/P12)
|
||||||
certSign.tags=authenticeren,PEM,P12,officieel,versleutelen
|
certSign.tags=authenticeren,PEM,P12,officieel,versleutelen
|
||||||
|
|
||||||
home.removeCertSign.title=Remove Certificate Sign
|
home.removeCertSign.title=Verwijder certificaat
|
||||||
home.removeCertSign.desc=Remove certificate signature from PDF
|
home.removeCertSign.desc=Verwijder certificaat van PDF
|
||||||
removeCertSign.tags=authenticate,PEM,P12,official,decrypt
|
removeCertSign.tags=authenticeren,PEM,P12,officieel,ontsleutelen
|
||||||
|
|
||||||
home.pageLayout.title=Multi-pagina indeling
|
home.pageLayout.title=Multi-pagina indeling
|
||||||
home.pageLayout.desc=Voeg meerdere pagina's van een PDF-document samen op één pagina
|
home.pageLayout.desc=Voeg meerdere pagina's van een PDF-document samen op één pagina
|
||||||
@@ -432,13 +453,13 @@ home.AddStampRequest.desc=Voeg tekst of afbeeldingsstempels toe op vaste locatie
|
|||||||
AddStampRequest.tags=Stempel, Afbeelding toevoegen, afbeelding centreren, watermerk, PDF, Insluiten, Aanpassen
|
AddStampRequest.tags=Stempel, Afbeelding toevoegen, afbeelding centreren, watermerk, PDF, Insluiten, Aanpassen
|
||||||
|
|
||||||
|
|
||||||
home.PDFToBook.title=PDF to Book
|
home.PDFToBook.title=PDF naar Boek
|
||||||
home.PDFToBook.desc=Converts PDF to Book/Comic formats using calibre
|
home.PDFToBook.desc=Converteert PDF naar boek-/stripformaat met gebruik van Calibre
|
||||||
PDFToBook.tags=Book,Comic,Calibre,Convert,manga,amazon,kindle
|
PDFToBook.tags=Boek,Strip,Comic,Calibre,Converteren,manga,amazon,kindle
|
||||||
|
|
||||||
home.BookToPDF.title=Book to PDF
|
home.BookToPDF.title=Boek naar PDF
|
||||||
home.BookToPDF.desc=Converts Books/Comics formats to PDF using calibre
|
home.BookToPDF.desc=Converteert boek-/stripformaat naar PDF met gebruik van Calibre
|
||||||
BookToPDF.tags=Book,Comic,Calibre,Convert,manga,amazon,kindle
|
BookToPDF.tags=Boek,Strip,Comic,Calibre,Converteren,manga,amazon,kindle
|
||||||
|
|
||||||
|
|
||||||
###########################
|
###########################
|
||||||
@@ -456,12 +477,12 @@ login.locked=Je account is geblokkeerd.
|
|||||||
login.signinTitle=Gelieve in te loggen
|
login.signinTitle=Gelieve in te loggen
|
||||||
login.ssoSignIn=Inloggen via Single Sign-on
|
login.ssoSignIn=Inloggen via Single Sign-on
|
||||||
login.oauth2AutoCreateDisabled=OAUTH2 Automatisch aanmaken gebruiker uitgeschakeld
|
login.oauth2AutoCreateDisabled=OAUTH2 Automatisch aanmaken gebruiker uitgeschakeld
|
||||||
login.oauth2RequestNotFound=Authorization request not found
|
login.oauth2RequestNotFound=Autorisatieverzoek niet gevonden
|
||||||
login.oauth2InvalidUserInfoResponse=Invalid User Info Response
|
login.oauth2InvalidUserInfoResponse=Ongeldige reactie op gebruikersinfo
|
||||||
login.oauth2invalidRequest=Invalid Request
|
login.oauth2invalidRequest=Ongeldig verzoek
|
||||||
login.oauth2AccessDenied=Access Denied
|
login.oauth2AccessDenied=Toegang geweigerd
|
||||||
login.oauth2InvalidTokenResponse=Invalid Token Response
|
login.oauth2InvalidTokenResponse=Ongeldige tokenreactie
|
||||||
login.oauth2InvalidIdToken=Invalid Id Token
|
login.oauth2InvalidIdToken=Ongeldige ID token
|
||||||
|
|
||||||
|
|
||||||
#auto-redact
|
#auto-redact
|
||||||
@@ -508,7 +529,7 @@ getPdfInfo.downloadJson=Download JSON
|
|||||||
MarkdownToPDF.title=Markdown naar PDF
|
MarkdownToPDF.title=Markdown naar PDF
|
||||||
MarkdownToPDF.header=Markdown naar PDF
|
MarkdownToPDF.header=Markdown naar PDF
|
||||||
MarkdownToPDF.submit=Converteren
|
MarkdownToPDF.submit=Converteren
|
||||||
MarkdownToPDF.help=in ontwikkeling
|
MarkdownToPDF.help=In ontwikkeling
|
||||||
MarkdownToPDF.credit=Gebruikt WeasyPrint
|
MarkdownToPDF.credit=Gebruikt WeasyPrint
|
||||||
|
|
||||||
|
|
||||||
@@ -538,7 +559,7 @@ HTMLToPDF.defaultHeader=Standaard koptekst weergeven (naam en paginanummer)
|
|||||||
HTMLToPDF.cssMediaType=Wijzig het CSS-mediatype van de pagina.
|
HTMLToPDF.cssMediaType=Wijzig het CSS-mediatype van de pagina.
|
||||||
HTMLToPDF.none=Geen
|
HTMLToPDF.none=Geen
|
||||||
HTMLToPDF.print=Print
|
HTMLToPDF.print=Print
|
||||||
HTMLToPDF.screen=Screen
|
HTMLToPDF.screen=Scherm
|
||||||
|
|
||||||
|
|
||||||
#AddStampRequest
|
#AddStampRequest
|
||||||
@@ -660,10 +681,10 @@ certSign.submit=PDF ondertekenen
|
|||||||
|
|
||||||
|
|
||||||
#removeCertSign
|
#removeCertSign
|
||||||
removeCertSign.title=Remove Certificate Signature
|
removeCertSign.title=Verwijder certificaat
|
||||||
removeCertSign.header=Remove the digital certificate from the PDF
|
removeCertSign.header=Verwijder het digitale certificaat van de PDF
|
||||||
removeCertSign.selectPDF=Select a PDF file:
|
removeCertSign.selectPDF=Selecteer een PDF bestand:
|
||||||
removeCertSign.submit=Remove Signature
|
removeCertSign.submit=Verwijder certificaat
|
||||||
|
|
||||||
|
|
||||||
#removeBlanks
|
#removeBlanks
|
||||||
@@ -685,22 +706,24 @@ removeAnnotations.submit=Verwijderen
|
|||||||
#compare
|
#compare
|
||||||
compare.title=Vergelijken
|
compare.title=Vergelijken
|
||||||
compare.header=PDF's vergelijken
|
compare.header=PDF's vergelijken
|
||||||
|
compare.highlightColor.1=Highlight Color 1:
|
||||||
|
compare.highlightColor.2=Highlight Color 2:
|
||||||
compare.document.1=Document 1
|
compare.document.1=Document 1
|
||||||
compare.document.2=Document 2
|
compare.document.2=Document 2
|
||||||
compare.submit=Vergelijken
|
compare.submit=Vergelijken
|
||||||
|
|
||||||
#BookToPDF
|
#BookToPDF
|
||||||
BookToPDF.title=Books and Comics to PDF
|
BookToPDF.title=Boeken en strips naar PDF
|
||||||
BookToPDF.header=Book to PDF
|
BookToPDF.header=Boek naar PDF
|
||||||
BookToPDF.credit=Uses Calibre
|
BookToPDF.credit=Gebruikt Calibre
|
||||||
BookToPDF.submit=Convert
|
BookToPDF.submit=Converteer
|
||||||
|
|
||||||
#PDFToBook
|
#PDFToBook
|
||||||
PDFToBook.title=PDF to Book
|
PDFToBook.title=PDF naar boek
|
||||||
PDFToBook.header=PDF to Book
|
PDFToBook.header=PDF naar boek
|
||||||
PDFToBook.selectText.1=Format
|
PDFToBook.selectText.1=Formaat
|
||||||
PDFToBook.credit=Uses Calibre
|
PDFToBook.credit=Gebruikt Calibre
|
||||||
PDFToBook.submit=Convert
|
PDFToBook.submit=Converteer
|
||||||
|
|
||||||
#sign
|
#sign
|
||||||
sign.title=Ondertekenen
|
sign.title=Ondertekenen
|
||||||
@@ -721,7 +744,7 @@ repair.submit=Repareren
|
|||||||
#flatten
|
#flatten
|
||||||
flatten.title=Afvlakken
|
flatten.title=Afvlakken
|
||||||
flatten.header=PDF's afvlakken
|
flatten.header=PDF's afvlakken
|
||||||
flatten.flattenOnlyForms=Flatten only forms
|
flatten.flattenOnlyForms=Alleen formulieren afvlakken
|
||||||
flatten.submit=Afvlakken
|
flatten.submit=Afvlakken
|
||||||
|
|
||||||
|
|
||||||
@@ -752,7 +775,7 @@ ocr.selectText.8=Normaal (Zal een fout geven als de PDF tekst bevat)
|
|||||||
ocr.selectText.9=Aanvullende instellingen
|
ocr.selectText.9=Aanvullende instellingen
|
||||||
ocr.selectText.10=OCR-modus
|
ocr.selectText.10=OCR-modus
|
||||||
ocr.selectText.11=Verwijder afbeeldingen na OCR (Verwijdert ALLE afbeeldingen, alleen nuttig als onderdeel van conversiestap)
|
ocr.selectText.11=Verwijder afbeeldingen na OCR (Verwijdert ALLE afbeeldingen, alleen nuttig als onderdeel van conversiestap)
|
||||||
ocr.selectText.12=Render Type (Geavanceerd)
|
ocr.selectText.12=Weergave Type (Geavanceerd)
|
||||||
ocr.help=Lees deze documentatie over hoe dit te gebruiken voor andere talen en/of gebruik buiten docker
|
ocr.help=Lees deze documentatie over hoe dit te gebruiken voor andere talen en/of gebruik buiten docker
|
||||||
ocr.credit=Deze dienst maakt gebruik van OCRmyPDF en Tesseract voor OCR.
|
ocr.credit=Deze dienst maakt gebruik van OCRmyPDF en Tesseract voor OCR.
|
||||||
ocr.submit=Verwerk PDF met OCR
|
ocr.submit=Verwerk PDF met OCR
|
||||||
@@ -799,6 +822,7 @@ merge.title=Samenvoegen
|
|||||||
merge.header=Meerdere PDF's samenvoegen (2+)
|
merge.header=Meerdere PDF's samenvoegen (2+)
|
||||||
merge.sortByName=Sorteer op naam
|
merge.sortByName=Sorteer op naam
|
||||||
merge.sortByDate=Sorteer op datum
|
merge.sortByDate=Sorteer op datum
|
||||||
|
merge.removeCertSign=Verwijder digitale handtekening in het samengevoegde bestand?
|
||||||
merge.submit=Samenvoegen
|
merge.submit=Samenvoegen
|
||||||
|
|
||||||
|
|
||||||
@@ -806,23 +830,24 @@ merge.submit=Samenvoegen
|
|||||||
pdfOrganiser.title=Pagina organisator
|
pdfOrganiser.title=Pagina organisator
|
||||||
pdfOrganiser.header=PDF pagina organisator
|
pdfOrganiser.header=PDF pagina organisator
|
||||||
pdfOrganiser.submit=Pagina's herschikken
|
pdfOrganiser.submit=Pagina's herschikken
|
||||||
pdfOrganiser.mode=Mode
|
pdfOrganiser.mode=Modus
|
||||||
pdfOrganiser.mode.1=Custom Page Order
|
pdfOrganiser.mode.1=Aangepaste paginavolgorde
|
||||||
pdfOrganiser.mode.2=Reverse Order
|
pdfOrganiser.mode.2=Omgekeerde volgorde
|
||||||
pdfOrganiser.mode.3=Duplex Sort
|
pdfOrganiser.mode.3=Duplex sorteren
|
||||||
pdfOrganiser.mode.4=Booklet Sort
|
pdfOrganiser.mode.4=Boekje sorteren
|
||||||
pdfOrganiser.mode.5=Side Stitch Booklet Sort
|
pdfOrganiser.mode.5=Zijsteek boekje sorteren
|
||||||
pdfOrganiser.mode.6=Odd-Even Split
|
pdfOrganiser.mode.6=Oneven-even splitsen
|
||||||
pdfOrganiser.mode.7=Remove First
|
pdfOrganiser.mode.7=Eerste verwijderen
|
||||||
pdfOrganiser.mode.8=Remove Last
|
pdfOrganiser.mode.8=Laatste verwijderen
|
||||||
pdfOrganiser.mode.9=Remove First and Last
|
pdfOrganiser.mode.9=Eerste en laaste verwijderen
|
||||||
pdfOrganiser.placeholder=(e.g. 1,3,2 or 4-8,2,10-12 or 2n-1)
|
pdfOrganiser.mode.10=Oneven-even samenvoeken
|
||||||
|
pdfOrganiser.placeholder=(bijv. 1,3,2 of 4-8,2,10-12 of 2n-1)
|
||||||
|
|
||||||
|
|
||||||
#multiTool
|
#multiTool
|
||||||
multiTool.title=PDF Multitool
|
multiTool.title=PDF Multitool
|
||||||
multiTool.header=PDF Multitool
|
multiTool.header=PDF Multitool
|
||||||
multiTool.uploadPrompts=File Name
|
multiTool.uploadPrompts=Bestandsnaam
|
||||||
|
|
||||||
#view pdf
|
#view pdf
|
||||||
viewPdf.title=PDF bekijken
|
viewPdf.title=PDF bekijken
|
||||||
@@ -833,7 +858,7 @@ pageRemover.title=Pagina verwijderaar
|
|||||||
pageRemover.header=PDF pagina verwijderaar
|
pageRemover.header=PDF pagina verwijderaar
|
||||||
pageRemover.pagesToDelete=Te verwijderen pagina's (Voer een door komma's gescheiden lijst met paginanummers in):
|
pageRemover.pagesToDelete=Te verwijderen pagina's (Voer een door komma's gescheiden lijst met paginanummers in):
|
||||||
pageRemover.submit=Pagina's verwijderen
|
pageRemover.submit=Pagina's verwijderen
|
||||||
pageRemover.placeholder=(e.g. 1,2,6 or 1-10,15-30)
|
pageRemover.placeholder=(bijv. 1,2,6 of 1-10,15-30)
|
||||||
|
|
||||||
|
|
||||||
#rotate
|
#rotate
|
||||||
@@ -974,9 +999,9 @@ pdfToPDFA.title=PDF naar PDF/A
|
|||||||
pdfToPDFA.header=PDF naar PDF/A
|
pdfToPDFA.header=PDF naar PDF/A
|
||||||
pdfToPDFA.credit=Deze service gebruikt OCRmyPDF voor PDF/A-conversie
|
pdfToPDFA.credit=Deze service gebruikt OCRmyPDF voor PDF/A-conversie
|
||||||
pdfToPDFA.submit=Converteren
|
pdfToPDFA.submit=Converteren
|
||||||
pdfToPDFA.tip=Currently does not work for multiple inputs at once
|
pdfToPDFA.tip=Werkt momenteel niet voor meerdere inputs tegelijkertijd.
|
||||||
pdfToPDFA.outputFormat=Output format
|
pdfToPDFA.outputFormat=Output format
|
||||||
pdfToPDFA.pdfWithDigitalSignature=The PDF contains a digital signature. This will be removed in the next step.
|
pdfToPDFA.pdfWithDigitalSignature=Dit PDF bestand bevat een digitale handtekening. Deze wordt in de volgende stap verwijderd.
|
||||||
|
|
||||||
|
|
||||||
#PDFToWord
|
#PDFToWord
|
||||||
@@ -1058,14 +1083,14 @@ split-by-sections.vertical.label=Verticale secties
|
|||||||
split-by-sections.horizontal.placeholder=Voer het aantal horizontale secties in
|
split-by-sections.horizontal.placeholder=Voer het aantal horizontale secties in
|
||||||
split-by-sections.vertical.placeholder=Voer het aantal verticale secties in
|
split-by-sections.vertical.placeholder=Voer het aantal verticale secties in
|
||||||
split-by-sections.submit=PDF splitsen
|
split-by-sections.submit=PDF splitsen
|
||||||
split-by-sections.merge=Merge Into One PDF
|
split-by-sections.merge=Samenvoegen in één PDF
|
||||||
|
|
||||||
|
|
||||||
#printFile
|
#printFile
|
||||||
printFile.title=Print File
|
printFile.title=Print bestand
|
||||||
printFile.header=Print File to Printer
|
printFile.header=Print bestand naar printer
|
||||||
printFile.selectText.1=Select File to Print
|
printFile.selectText.1=Selecteer bestand om te printen
|
||||||
printFile.selectText.2=Enter Printer Name
|
printFile.selectText.2=Voer printernaam in
|
||||||
printFile.submit=Print
|
printFile.submit=Print
|
||||||
|
|
||||||
|
|
||||||
@@ -1077,17 +1102,26 @@ licenses.module=Module
|
|||||||
licenses.version=Versie
|
licenses.version=Versie
|
||||||
licenses.license=Licentie
|
licenses.license=Licentie
|
||||||
|
|
||||||
|
#survey
|
||||||
|
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.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.
|
||||||
|
survey.dontShowAgain=Niet weer tonen
|
||||||
|
|
||||||
|
|
||||||
#error
|
#error
|
||||||
error.sorry=Sorry for the issue!
|
error.sorry=Excuses voor het probleem!
|
||||||
error.needHelp=Need help / Found an issue?
|
error.needHelp=Hulp nodig / probleem gevonden?
|
||||||
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.contactTip=Als je nog steeds problemen hebt, schroom niet om contact met ons op te nemen voor hulp. Je kan een ticket op onze Github pagina indienen of ons via Discord bereiken:
|
||||||
error.404.head=404 - Page Not Found | Oops, we tripped in the code!
|
error.404.head=404 - Pagina niet gevonden | Oeps, we struikelden over de code!
|
||||||
error.404.1=We can't seem to find the page you're looking for.
|
error.404.1=We kunnen de pagina die je zoek niet vinden.
|
||||||
error.404.2=Something went wrong
|
error.404.2=Er ging iets mis.
|
||||||
error.github=Submit a ticket on GitHub
|
error.github=Dien een ticket op Github in.
|
||||||
error.showStack=Show Stack Trace
|
error.showStack=Geeft tracering weer
|
||||||
error.copyStack=Copy Stack Trace
|
error.copyStack=Kopieer tracering
|
||||||
error.githubSubmit=GitHub - Submit a ticket
|
error.githubSubmit=GitHub - Dien een ticket in
|
||||||
error.discordSubmit=Discord - Submit Support post
|
error.discordSubmit=Discord - Maak een support post
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
###########
|
###########
|
||||||
# Generic #
|
# Generic #
|
||||||
###########
|
###########
|
||||||
# the direction that the language is written (ltr = left to right, rtl = right to left)
|
# the direction that the language is written (ltr=left to right, rtl = right to left)
|
||||||
language.direction=ltr
|
language.direction=ltr
|
||||||
|
|
||||||
pdfPrompt=Velg PDF(er)
|
pdfPrompt=Velg PDF(er)
|
||||||
@@ -55,6 +55,7 @@ userNotFoundMessage=Bruker ikke funnet.
|
|||||||
incorrectPasswordMessage=Nåværende passord er feil.
|
incorrectPasswordMessage=Nåværende passord er feil.
|
||||||
usernameExistsMessage=Det nye brukernavnet eksisterer allerede.
|
usernameExistsMessage=Det nye brukernavnet eksisterer allerede.
|
||||||
invalidUsernameMessage=Ugyldig brukernavn, brukernavnet kan bare inneholde bokstaver, tall og følgende spesialtegn @._+- eller må være en gyldig e-postadresse.
|
invalidUsernameMessage=Ugyldig brukernavn, brukernavnet kan bare inneholde bokstaver, tall og følgende spesialtegn @._+- eller må være en gyldig e-postadresse.
|
||||||
|
confirmPasswordErrorMessage=Nytt passord og Bekreft nytt passord må være like.
|
||||||
deleteCurrentUserMessage=Kan ikke slette den innloggede brukeren.
|
deleteCurrentUserMessage=Kan ikke slette den innloggede brukeren.
|
||||||
deleteUsernameExistsMessage=Brukernavnet eksisterer ikke og kan ikke slettes.
|
deleteUsernameExistsMessage=Brukernavnet eksisterer ikke og kan ikke slettes.
|
||||||
downgradeCurrentUserMessage=Kan ikke nedgradere den innloggede brukerens rolle.
|
downgradeCurrentUserMessage=Kan ikke nedgradere den innloggede brukerens rolle.
|
||||||
@@ -85,6 +86,7 @@ pipeline.defaultOption=Tilpasset
|
|||||||
pipeline.submitButton=Send inn
|
pipeline.submitButton=Send inn
|
||||||
pipeline.help=Pipeline hjelp
|
pipeline.help=Pipeline hjelp
|
||||||
pipeline.scanHelp=Mappe skanning hjelp
|
pipeline.scanHelp=Mappe skanning hjelp
|
||||||
|
pipeline.deletePrompt=Are you sure you want to delete pipeline
|
||||||
|
|
||||||
######################
|
######################
|
||||||
# Pipeline Options #
|
# Pipeline Options #
|
||||||
@@ -173,6 +175,8 @@ adminUserSettings.header=Admin Brukerkontroll Innstillinger
|
|||||||
adminUserSettings.admin=Admin
|
adminUserSettings.admin=Admin
|
||||||
adminUserSettings.user=Bruker
|
adminUserSettings.user=Bruker
|
||||||
adminUserSettings.addUser=Legg til Ny Bruker
|
adminUserSettings.addUser=Legg til Ny Bruker
|
||||||
|
adminUserSettings.deleteUser=Slett Bruker
|
||||||
|
adminUserSettings.confirmDeleteUser=Skal brukeren slettes?
|
||||||
adminUserSettings.usernameInfo=Brukernavn kan bare inneholde bokstaver, tall og følgende spesialtegn @._+- eller må være en gyldig e-postadresse.
|
adminUserSettings.usernameInfo=Brukernavn kan bare inneholde bokstaver, tall og følgende spesialtegn @._+- eller må være en gyldig e-postadresse.
|
||||||
adminUserSettings.roles=Roller
|
adminUserSettings.roles=Roller
|
||||||
adminUserSettings.role=Rolle
|
adminUserSettings.role=Rolle
|
||||||
@@ -187,6 +191,23 @@ adminUserSettings.submit=Lagre Bruker
|
|||||||
adminUserSettings.changeUserRole=Endre Brukerens Rolle
|
adminUserSettings.changeUserRole=Endre Brukerens Rolle
|
||||||
adminUserSettings.authenticated=Autentisert
|
adminUserSettings.authenticated=Autentisert
|
||||||
|
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
#############
|
#############
|
||||||
# HOME-PAGE #
|
# HOME-PAGE #
|
||||||
#############
|
#############
|
||||||
@@ -536,8 +557,8 @@ HTMLToPDF.marginRight=Høyre margin på siden i millimeter. (Blank for standard)
|
|||||||
HTMLToPDF.printBackground=Vis bakgrunnen til nettsider.
|
HTMLToPDF.printBackground=Vis bakgrunnen til nettsider.
|
||||||
HTMLToPDF.defaultHeader=Aktiver standardtopp (Navn og sidenummer)
|
HTMLToPDF.defaultHeader=Aktiver standardtopp (Navn og sidenummer)
|
||||||
HTMLToPDF.cssMediaType=Endre CSS-mediatypen til siden.
|
HTMLToPDF.cssMediaType=Endre CSS-mediatypen til siden.
|
||||||
HTMLToPDF.none=None
|
HTMLToPDF.none=Ingen
|
||||||
HTMLToPDF.print=Print
|
HTMLToPDF.print=Utskrift
|
||||||
HTMLToPDF.screen=Skjerm
|
HTMLToPDF.screen=Skjerm
|
||||||
|
|
||||||
|
|
||||||
@@ -685,6 +706,8 @@ removeAnnotations.submit=Fjern
|
|||||||
#compare
|
#compare
|
||||||
compare.title=Sammenlign
|
compare.title=Sammenlign
|
||||||
compare.header=Sammenlign PDF-er
|
compare.header=Sammenlign PDF-er
|
||||||
|
compare.highlightColor.1=Highlight Color 1:
|
||||||
|
compare.highlightColor.2=Highlight Color 2:
|
||||||
compare.document.1=Dokument 1
|
compare.document.1=Dokument 1
|
||||||
compare.document.2=Dokument 2
|
compare.document.2=Dokument 2
|
||||||
compare.submit=Sammenlign
|
compare.submit=Sammenlign
|
||||||
@@ -799,6 +822,7 @@ merge.title=Slå sammen
|
|||||||
merge.header=Slå sammen flere PDF-er (2+)
|
merge.header=Slå sammen flere PDF-er (2+)
|
||||||
merge.sortByName=Sorter etter navn
|
merge.sortByName=Sorter etter navn
|
||||||
merge.sortByDate=Sorter etter dato
|
merge.sortByDate=Sorter etter dato
|
||||||
|
merge.removeCertSign=Fjern digital signatur i den sammenslåtte filen?
|
||||||
merge.submit=Slå sammen
|
merge.submit=Slå sammen
|
||||||
|
|
||||||
|
|
||||||
@@ -816,6 +840,7 @@ pdfOrganiser.mode.6=Oddetall-jevntall splitt
|
|||||||
pdfOrganiser.mode.7=Fjern først
|
pdfOrganiser.mode.7=Fjern først
|
||||||
pdfOrganiser.mode.8=Fjern sist
|
pdfOrganiser.mode.8=Fjern sist
|
||||||
pdfOrganiser.mode.9=Fjern først og sist
|
pdfOrganiser.mode.9=Fjern først og sist
|
||||||
|
pdfOrganiser.mode.10=Partall-Oddetall Sammenslåing
|
||||||
pdfOrganiser.placeholder=(f.eks. 1,3,2 eller 4-8,2,10-12 eller 2n-1)
|
pdfOrganiser.placeholder=(f.eks. 1,3,2 eller 4-8,2,10-12 eller 2n-1)
|
||||||
|
|
||||||
|
|
||||||
@@ -1077,6 +1102,15 @@ licenses.module=Modul
|
|||||||
licenses.version=Versjon
|
licenses.version=Versjon
|
||||||
licenses.license=Lisens
|
licenses.license=Lisens
|
||||||
|
|
||||||
|
#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.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
|
||||||
|
|
||||||
|
|
||||||
#error
|
#error
|
||||||
error.sorry=Beklager for problemet!
|
error.sorry=Beklager for problemet!
|
||||||
|
|||||||
822
src/main/resources/messages_pl_PL.properties
Normal file → Executable file
@@ -55,6 +55,7 @@ userNotFoundMessage=User not found.
|
|||||||
incorrectPasswordMessage=Current password is incorrect.
|
incorrectPasswordMessage=Current password is incorrect.
|
||||||
usernameExistsMessage=New Username already exists.
|
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.
|
invalidUsernameMessage=Invalid username, username can only contain letters, numbers and the following special characters @._+- or must be a valid email address.
|
||||||
|
confirmPasswordErrorMessage=New Password and Confirm New Password must match.
|
||||||
deleteCurrentUserMessage=Cannot delete currently logged in user.
|
deleteCurrentUserMessage=Cannot delete currently logged in user.
|
||||||
deleteUsernameExistsMessage=The username does not exist and cannot be deleted.
|
deleteUsernameExistsMessage=The username does not exist and cannot be deleted.
|
||||||
downgradeCurrentUserMessage=Não é possível fazer downgrade da função do usuário atual
|
downgradeCurrentUserMessage=Não é possível fazer downgrade da função do usuário atual
|
||||||
@@ -85,6 +86,7 @@ pipeline.defaultOption=Custom
|
|||||||
pipeline.submitButton=Submit
|
pipeline.submitButton=Submit
|
||||||
pipeline.help=Pipeline Help
|
pipeline.help=Pipeline Help
|
||||||
pipeline.scanHelp=Folder Scanning Help
|
pipeline.scanHelp=Folder Scanning Help
|
||||||
|
pipeline.deletePrompt=Are you sure you want to delete pipeline
|
||||||
|
|
||||||
######################
|
######################
|
||||||
# Pipeline Options #
|
# Pipeline Options #
|
||||||
@@ -173,6 +175,8 @@ adminUserSettings.header=Admin User Control Settings
|
|||||||
adminUserSettings.admin=Admin
|
adminUserSettings.admin=Admin
|
||||||
adminUserSettings.user=User
|
adminUserSettings.user=User
|
||||||
adminUserSettings.addUser=Add New User
|
adminUserSettings.addUser=Add New User
|
||||||
|
adminUserSettings.deleteUser=Delete User
|
||||||
|
adminUserSettings.confirmDeleteUser=Should the user be deleted?
|
||||||
adminUserSettings.usernameInfo=Username can only contain letters, numbers and the following special characters @._+- or must be a valid email address.
|
adminUserSettings.usernameInfo=Username can only contain letters, numbers and the following special characters @._+- or must be a valid email address.
|
||||||
adminUserSettings.roles=Roles
|
adminUserSettings.roles=Roles
|
||||||
adminUserSettings.role=Role
|
adminUserSettings.role=Role
|
||||||
@@ -187,6 +191,23 @@ adminUserSettings.submit=Save User
|
|||||||
adminUserSettings.changeUserRole=Alterar Função de Usuário
|
adminUserSettings.changeUserRole=Alterar Função de Usuário
|
||||||
adminUserSettings.authenticated=Authenticated
|
adminUserSettings.authenticated=Authenticated
|
||||||
|
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
#############
|
#############
|
||||||
# HOME-PAGE #
|
# HOME-PAGE #
|
||||||
#############
|
#############
|
||||||
@@ -685,6 +706,8 @@ removeAnnotations.submit=Remove
|
|||||||
#compare
|
#compare
|
||||||
compare.title=Comparar
|
compare.title=Comparar
|
||||||
compare.header=Comparar PDFs
|
compare.header=Comparar PDFs
|
||||||
|
compare.highlightColor.1=Highlight Color 1:
|
||||||
|
compare.highlightColor.2=Highlight Color 2:
|
||||||
compare.document.1=Documento 1
|
compare.document.1=Documento 1
|
||||||
compare.document.2=Documento 2
|
compare.document.2=Documento 2
|
||||||
compare.submit=Comparar
|
compare.submit=Comparar
|
||||||
@@ -799,6 +822,7 @@ merge.title=Mesclar
|
|||||||
merge.header=Mesclar Vários PDFs (2+)
|
merge.header=Mesclar Vários PDFs (2+)
|
||||||
merge.sortByName=Sort by name
|
merge.sortByName=Sort by name
|
||||||
merge.sortByDate=Sort by date
|
merge.sortByDate=Sort by date
|
||||||
|
merge.removeCertSign=Remove digital signature in the merged file?
|
||||||
merge.submit=Mesclar
|
merge.submit=Mesclar
|
||||||
|
|
||||||
|
|
||||||
@@ -816,6 +840,7 @@ pdfOrganiser.mode.6=Odd-Even Split
|
|||||||
pdfOrganiser.mode.7=Remove First
|
pdfOrganiser.mode.7=Remove First
|
||||||
pdfOrganiser.mode.8=Remove Last
|
pdfOrganiser.mode.8=Remove Last
|
||||||
pdfOrganiser.mode.9=Remove First and 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.placeholder=(e.g. 1,3,2 or 4-8,2,10-12 or 2n-1)
|
||||||
|
|
||||||
|
|
||||||
@@ -1077,6 +1102,15 @@ licenses.module=Module
|
|||||||
licenses.version=Version
|
licenses.version=Version
|
||||||
licenses.license=License
|
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.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
|
||||||
|
|
||||||
|
|
||||||
#error
|
#error
|
||||||
error.sorry=Sorry for the issue!
|
error.sorry=Sorry for the issue!
|
||||||
|
|||||||
@@ -55,6 +55,7 @@ userNotFoundMessage=Utilizador inexistente.
|
|||||||
incorrectPasswordMessage=Senha incorreta.
|
incorrectPasswordMessage=Senha incorreta.
|
||||||
usernameExistsMessage=Esse utilizador já existe.
|
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.
|
invalidUsernameMessage=Invalid username, username can only contain letters, numbers and the following special characters @._+- or must be a valid email address.
|
||||||
|
confirmPasswordErrorMessage=New Password and Confirm New Password must match.
|
||||||
deleteCurrentUserMessage=Cannot delete currently logged in user.
|
deleteCurrentUserMessage=Cannot delete currently logged in user.
|
||||||
deleteUsernameExistsMessage=The username does not exist and cannot be deleted.
|
deleteUsernameExistsMessage=The username does not exist and cannot be deleted.
|
||||||
downgradeCurrentUserMessage=Não é possível fazer downgrade da função do utilizador atual
|
downgradeCurrentUserMessage=Não é possível fazer downgrade da função do utilizador atual
|
||||||
@@ -85,6 +86,7 @@ pipeline.defaultOption=Personalizar
|
|||||||
pipeline.submitButton=Submeter
|
pipeline.submitButton=Submeter
|
||||||
pipeline.help=Pipeline Help
|
pipeline.help=Pipeline Help
|
||||||
pipeline.scanHelp=Folder Scanning Help
|
pipeline.scanHelp=Folder Scanning Help
|
||||||
|
pipeline.deletePrompt=Are you sure you want to delete pipeline
|
||||||
|
|
||||||
######################
|
######################
|
||||||
# Pipeline Options #
|
# Pipeline Options #
|
||||||
@@ -173,6 +175,8 @@ adminUserSettings.header=Admin User Control Settings
|
|||||||
adminUserSettings.admin=Admin
|
adminUserSettings.admin=Admin
|
||||||
adminUserSettings.user=User
|
adminUserSettings.user=User
|
||||||
adminUserSettings.addUser=Add New User
|
adminUserSettings.addUser=Add New User
|
||||||
|
adminUserSettings.deleteUser=Delete User
|
||||||
|
adminUserSettings.confirmDeleteUser=Should the user be deleted?
|
||||||
adminUserSettings.usernameInfo=Username can only contain letters, numbers and the following special characters @._+- or must be a valid email address.
|
adminUserSettings.usernameInfo=Username can only contain letters, numbers and the following special characters @._+- or must be a valid email address.
|
||||||
adminUserSettings.roles=Roles
|
adminUserSettings.roles=Roles
|
||||||
adminUserSettings.role=Role
|
adminUserSettings.role=Role
|
||||||
@@ -187,6 +191,23 @@ adminUserSettings.submit=Save User
|
|||||||
adminUserSettings.changeUserRole=Alterar usuário
|
adminUserSettings.changeUserRole=Alterar usuário
|
||||||
adminUserSettings.authenticated=Authenticated
|
adminUserSettings.authenticated=Authenticated
|
||||||
|
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
#############
|
#############
|
||||||
# HOME-PAGE #
|
# HOME-PAGE #
|
||||||
#############
|
#############
|
||||||
@@ -685,6 +706,8 @@ removeAnnotations.submit=Remover
|
|||||||
#compare
|
#compare
|
||||||
compare.title=Comparar
|
compare.title=Comparar
|
||||||
compare.header=Comparar PDFs
|
compare.header=Comparar PDFs
|
||||||
|
compare.highlightColor.1=Highlight Color 1:
|
||||||
|
compare.highlightColor.2=Highlight Color 2:
|
||||||
compare.document.1=Documento 1
|
compare.document.1=Documento 1
|
||||||
compare.document.2=Documento 2
|
compare.document.2=Documento 2
|
||||||
compare.submit=Comparar
|
compare.submit=Comparar
|
||||||
@@ -799,6 +822,7 @@ merge.title=Juntar
|
|||||||
merge.header=Juntar Vários PDFs (2+)
|
merge.header=Juntar Vários PDFs (2+)
|
||||||
merge.sortByName=Ordenar por nome
|
merge.sortByName=Ordenar por nome
|
||||||
merge.sortByDate=Ordenar por data
|
merge.sortByDate=Ordenar por data
|
||||||
|
merge.removeCertSign=Remove digital signature in the merged file?
|
||||||
merge.submit=Juntar
|
merge.submit=Juntar
|
||||||
|
|
||||||
|
|
||||||
@@ -816,6 +840,7 @@ pdfOrganiser.mode.6=Odd-Even Split
|
|||||||
pdfOrganiser.mode.7=Remove First
|
pdfOrganiser.mode.7=Remove First
|
||||||
pdfOrganiser.mode.8=Remove Last
|
pdfOrganiser.mode.8=Remove Last
|
||||||
pdfOrganiser.mode.9=Remove First and 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.placeholder=(e.g. 1,3,2 or 4-8,2,10-12 or 2n-1)
|
||||||
|
|
||||||
|
|
||||||
@@ -1077,6 +1102,15 @@ licenses.module=Modulos
|
|||||||
licenses.version=Versão
|
licenses.version=Versão
|
||||||
licenses.license=Licença
|
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.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
|
||||||
|
|
||||||
|
|
||||||
#error
|
#error
|
||||||
error.sorry=Sorry for the issue!
|
error.sorry=Sorry for the issue!
|
||||||
|
|||||||
@@ -55,6 +55,7 @@ userNotFoundMessage=User not found.
|
|||||||
incorrectPasswordMessage=Current password is incorrect.
|
incorrectPasswordMessage=Current password is incorrect.
|
||||||
usernameExistsMessage=New Username already exists.
|
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.
|
invalidUsernameMessage=Invalid username, username can only contain letters, numbers and the following special characters @._+- or must be a valid email address.
|
||||||
|
confirmPasswordErrorMessage=New Password and Confirm New Password must match.
|
||||||
deleteCurrentUserMessage=Cannot delete currently logged in user.
|
deleteCurrentUserMessage=Cannot delete currently logged in user.
|
||||||
deleteUsernameExistsMessage=The username does not exist and cannot be deleted.
|
deleteUsernameExistsMessage=The username does not exist and cannot be deleted.
|
||||||
downgradeCurrentUserMessage=Rolul utilizatorului curent nu poate fi retrogradat
|
downgradeCurrentUserMessage=Rolul utilizatorului curent nu poate fi retrogradat
|
||||||
@@ -85,6 +86,7 @@ pipeline.defaultOption=Custom
|
|||||||
pipeline.submitButton=Submit
|
pipeline.submitButton=Submit
|
||||||
pipeline.help=Pipeline Help
|
pipeline.help=Pipeline Help
|
||||||
pipeline.scanHelp=Folder Scanning Help
|
pipeline.scanHelp=Folder Scanning Help
|
||||||
|
pipeline.deletePrompt=Are you sure you want to delete pipeline
|
||||||
|
|
||||||
######################
|
######################
|
||||||
# Pipeline Options #
|
# Pipeline Options #
|
||||||
@@ -173,6 +175,8 @@ adminUserSettings.header=Admin User Control Settings
|
|||||||
adminUserSettings.admin=Admin
|
adminUserSettings.admin=Admin
|
||||||
adminUserSettings.user=User
|
adminUserSettings.user=User
|
||||||
adminUserSettings.addUser=Add New User
|
adminUserSettings.addUser=Add New User
|
||||||
|
adminUserSettings.deleteUser=Delete User
|
||||||
|
adminUserSettings.confirmDeleteUser=Should the user be deleted?
|
||||||
adminUserSettings.usernameInfo=Username can only contain letters, numbers and the following special characters @._+- or must be a valid email address.
|
adminUserSettings.usernameInfo=Username can only contain letters, numbers and the following special characters @._+- or must be a valid email address.
|
||||||
adminUserSettings.roles=Roles
|
adminUserSettings.roles=Roles
|
||||||
adminUserSettings.role=Role
|
adminUserSettings.role=Role
|
||||||
@@ -187,6 +191,23 @@ adminUserSettings.submit=Save User
|
|||||||
adminUserSettings.changeUserRole=Schimbați rolul utilizatorului
|
adminUserSettings.changeUserRole=Schimbați rolul utilizatorului
|
||||||
adminUserSettings.authenticated=Authenticated
|
adminUserSettings.authenticated=Authenticated
|
||||||
|
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
#############
|
#############
|
||||||
# HOME-PAGE #
|
# HOME-PAGE #
|
||||||
#############
|
#############
|
||||||
@@ -685,6 +706,8 @@ removeAnnotations.submit=Remove
|
|||||||
#compare
|
#compare
|
||||||
compare.title=Compară
|
compare.title=Compară
|
||||||
compare.header=Compară PDF-uri
|
compare.header=Compară PDF-uri
|
||||||
|
compare.highlightColor.1=Highlight Color 1:
|
||||||
|
compare.highlightColor.2=Highlight Color 2:
|
||||||
compare.document.1=Document 1
|
compare.document.1=Document 1
|
||||||
compare.document.2=Document 2
|
compare.document.2=Document 2
|
||||||
compare.submit=Compară
|
compare.submit=Compară
|
||||||
@@ -799,6 +822,7 @@ merge.title=Unire
|
|||||||
merge.header=Unirea mai multor PDF-uri (2+)
|
merge.header=Unirea mai multor PDF-uri (2+)
|
||||||
merge.sortByName=Sort by name
|
merge.sortByName=Sort by name
|
||||||
merge.sortByDate=Sort by date
|
merge.sortByDate=Sort by date
|
||||||
|
merge.removeCertSign=Remove digital signature in the merged file?
|
||||||
merge.submit=Unire
|
merge.submit=Unire
|
||||||
|
|
||||||
|
|
||||||
@@ -816,6 +840,7 @@ pdfOrganiser.mode.6=Odd-Even Split
|
|||||||
pdfOrganiser.mode.7=Remove First
|
pdfOrganiser.mode.7=Remove First
|
||||||
pdfOrganiser.mode.8=Remove Last
|
pdfOrganiser.mode.8=Remove Last
|
||||||
pdfOrganiser.mode.9=Remove First and 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.placeholder=(e.g. 1,3,2 or 4-8,2,10-12 or 2n-1)
|
||||||
|
|
||||||
|
|
||||||
@@ -1077,6 +1102,15 @@ licenses.module=Module
|
|||||||
licenses.version=Version
|
licenses.version=Version
|
||||||
licenses.license=License
|
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.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
|
||||||
|
|
||||||
|
|
||||||
#error
|
#error
|
||||||
error.sorry=Sorry for the issue!
|
error.sorry=Sorry for the issue!
|
||||||
|
|||||||
@@ -55,6 +55,7 @@ userNotFoundMessage=Пользователь не найден.
|
|||||||
incorrectPasswordMessage=Текущий пароль неверен.
|
incorrectPasswordMessage=Текущий пароль неверен.
|
||||||
usernameExistsMessage=Новое имя пользователя уже существует.
|
usernameExistsMessage=Новое имя пользователя уже существует.
|
||||||
invalidUsernameMessage=Неверное имя пользователя. Имя пользователя может содержать только буквы, цифры и следующие специальные символы @._+- или должно быть действительным адресом электронной почты.
|
invalidUsernameMessage=Неверное имя пользователя. Имя пользователя может содержать только буквы, цифры и следующие специальные символы @._+- или должно быть действительным адресом электронной почты.
|
||||||
|
confirmPasswordErrorMessage=New Password and Confirm New Password must match.
|
||||||
deleteCurrentUserMessage=Невозможно удалить пользователя, вошедшего в систему.
|
deleteCurrentUserMessage=Невозможно удалить пользователя, вошедшего в систему.
|
||||||
deleteUsernameExistsMessage=Имя пользователя не существует и не может быть удалено.
|
deleteUsernameExistsMessage=Имя пользователя не существует и не может быть удалено.
|
||||||
downgradeCurrentUserMessage=Невозможно понизить роль текущего пользователя
|
downgradeCurrentUserMessage=Невозможно понизить роль текущего пользователя
|
||||||
@@ -85,6 +86,7 @@ pipeline.defaultOption=Пользовательский
|
|||||||
pipeline.submitButton=Отправить
|
pipeline.submitButton=Отправить
|
||||||
pipeline.help=Справка по конвейерной обработке
|
pipeline.help=Справка по конвейерной обработке
|
||||||
pipeline.scanHelp=Справка по сканированию папок
|
pipeline.scanHelp=Справка по сканированию папок
|
||||||
|
pipeline.deletePrompt=Are you sure you want to delete pipeline
|
||||||
|
|
||||||
######################
|
######################
|
||||||
# Pipeline Options #
|
# Pipeline Options #
|
||||||
@@ -173,6 +175,8 @@ adminUserSettings.header=Настройки контроля пользоват
|
|||||||
adminUserSettings.admin=Администратор
|
adminUserSettings.admin=Администратор
|
||||||
adminUserSettings.user=Пользователь
|
adminUserSettings.user=Пользователь
|
||||||
adminUserSettings.addUser=Добавить нового пользователя
|
adminUserSettings.addUser=Добавить нового пользователя
|
||||||
|
adminUserSettings.deleteUser=Delete User
|
||||||
|
adminUserSettings.confirmDeleteUser=Should the user be deleted?
|
||||||
adminUserSettings.usernameInfo=Имя пользователя может содержать только буквы, цифры и следующие специальные символы @._+- или должно быть действительным адресом электронной почты.
|
adminUserSettings.usernameInfo=Имя пользователя может содержать только буквы, цифры и следующие специальные символы @._+- или должно быть действительным адресом электронной почты.
|
||||||
adminUserSettings.roles=Роли
|
adminUserSettings.roles=Роли
|
||||||
adminUserSettings.role=Роль
|
adminUserSettings.role=Роль
|
||||||
@@ -187,6 +191,23 @@ adminUserSettings.submit=Сохранить пользователя
|
|||||||
adminUserSettings.changeUserRole=Изменить роль пользователя
|
adminUserSettings.changeUserRole=Изменить роль пользователя
|
||||||
adminUserSettings.authenticated=Authenticated
|
adminUserSettings.authenticated=Authenticated
|
||||||
|
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
#############
|
#############
|
||||||
# HOME-PAGE #
|
# HOME-PAGE #
|
||||||
#############
|
#############
|
||||||
@@ -685,6 +706,8 @@ removeAnnotations.submit=Удалить
|
|||||||
#compare
|
#compare
|
||||||
compare.title=Сравнение
|
compare.title=Сравнение
|
||||||
compare.header=Сравнение PDFы
|
compare.header=Сравнение PDFы
|
||||||
|
compare.highlightColor.1=Highlight Color 1:
|
||||||
|
compare.highlightColor.2=Highlight Color 2:
|
||||||
compare.document.1=Документ 1
|
compare.document.1=Документ 1
|
||||||
compare.document.2=Документ 2
|
compare.document.2=Документ 2
|
||||||
compare.submit=Сравнить
|
compare.submit=Сравнить
|
||||||
@@ -799,6 +822,7 @@ merge.title=Объединить
|
|||||||
merge.header=Объединение нескольких PDF-файлов (2+)
|
merge.header=Объединение нескольких PDF-файлов (2+)
|
||||||
merge.sortByName=Сортировка по имени
|
merge.sortByName=Сортировка по имени
|
||||||
merge.sortByDate=Сортировка по дате
|
merge.sortByDate=Сортировка по дате
|
||||||
|
merge.removeCertSign=Remove digital signature in the merged file?
|
||||||
merge.submit=Объединить
|
merge.submit=Объединить
|
||||||
|
|
||||||
|
|
||||||
@@ -816,6 +840,7 @@ pdfOrganiser.mode.6=Разделение на чётные и нечётные
|
|||||||
pdfOrganiser.mode.7=Удалить первую
|
pdfOrganiser.mode.7=Удалить первую
|
||||||
pdfOrganiser.mode.8=Удалить последнюю
|
pdfOrganiser.mode.8=Удалить последнюю
|
||||||
pdfOrganiser.mode.9=Удалить первую и последнюю
|
pdfOrganiser.mode.9=Удалить первую и последнюю
|
||||||
|
pdfOrganiser.mode.10=Odd-Even Merge
|
||||||
pdfOrganiser.placeholder=(например, 1,3,2 или 4-8,2,10-12 или 2n-1)
|
pdfOrganiser.placeholder=(например, 1,3,2 или 4-8,2,10-12 или 2n-1)
|
||||||
|
|
||||||
|
|
||||||
@@ -1077,6 +1102,15 @@ licenses.module=Модуль
|
|||||||
licenses.version=Версия
|
licenses.version=Версия
|
||||||
licenses.license=Лицензия
|
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.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
|
||||||
|
|
||||||
|
|
||||||
#error
|
#error
|
||||||
error.sorry=Извините за проблему!
|
error.sorry=Извините за проблему!
|
||||||
|
|||||||
@@ -55,6 +55,7 @@ userNotFoundMessage=Používateľ nebol nájdený.
|
|||||||
incorrectPasswordMessage=Aktuálne heslo je nesprávne.
|
incorrectPasswordMessage=Aktuálne heslo je nesprávne.
|
||||||
usernameExistsMessage=Nové používateľské meno už existuje.
|
usernameExistsMessage=Nové používateľské meno už existuje.
|
||||||
invalidUsernameMessage=Neplatné používateľské meno, používateľské meno musí obsahovať len abecedné znaky a čísla.
|
invalidUsernameMessage=Neplatné používateľské meno, používateľské meno musí obsahovať len abecedné znaky a čísla.
|
||||||
|
confirmPasswordErrorMessage=New Password and Confirm New Password must match.
|
||||||
deleteCurrentUserMessage=Nie je možné zmazať aktuálne prihláseného používateľa.
|
deleteCurrentUserMessage=Nie je možné zmazať aktuálne prihláseného používateľa.
|
||||||
deleteUsernameExistsMessage=Používateľské meno neexistuje a nemôže byť zmazané.
|
deleteUsernameExistsMessage=Používateľské meno neexistuje a nemôže byť zmazané.
|
||||||
downgradeCurrentUserMessage=Nie je možné znížiť rolu aktuálneho používateľa
|
downgradeCurrentUserMessage=Nie je možné znížiť rolu aktuálneho používateľa
|
||||||
@@ -85,6 +86,7 @@ pipeline.defaultOption=Vlastné
|
|||||||
pipeline.submitButton=Odoslať
|
pipeline.submitButton=Odoslať
|
||||||
pipeline.help=Pomoc s pipeline
|
pipeline.help=Pomoc s pipeline
|
||||||
pipeline.scanHelp=Pomoc so skenovaním priečinka
|
pipeline.scanHelp=Pomoc so skenovaním priečinka
|
||||||
|
pipeline.deletePrompt=Are you sure you want to delete pipeline
|
||||||
|
|
||||||
######################
|
######################
|
||||||
# Pipeline Options #
|
# Pipeline Options #
|
||||||
@@ -173,6 +175,8 @@ adminUserSettings.header=Admin nastavenia kontroly používateľov
|
|||||||
adminUserSettings.admin=Admin
|
adminUserSettings.admin=Admin
|
||||||
adminUserSettings.user=Používateľ
|
adminUserSettings.user=Používateľ
|
||||||
adminUserSettings.addUser=Pridať nového používateľa
|
adminUserSettings.addUser=Pridať nového používateľa
|
||||||
|
adminUserSettings.deleteUser=Delete User
|
||||||
|
adminUserSettings.confirmDeleteUser=Should the user be deleted?
|
||||||
adminUserSettings.usernameInfo=Používateľské meno musí obsahovať iba písmená a čísla, žiadne medzery alebo špeciálne znaky.
|
adminUserSettings.usernameInfo=Používateľské meno musí obsahovať iba písmená a čísla, žiadne medzery alebo špeciálne znaky.
|
||||||
adminUserSettings.roles=Role
|
adminUserSettings.roles=Role
|
||||||
adminUserSettings.role=Rola
|
adminUserSettings.role=Rola
|
||||||
@@ -187,6 +191,23 @@ adminUserSettings.submit=Uložiť používateľa
|
|||||||
adminUserSettings.changeUserRole=Zmeniť rolu používateľa
|
adminUserSettings.changeUserRole=Zmeniť rolu používateľa
|
||||||
adminUserSettings.authenticated=Authenticated
|
adminUserSettings.authenticated=Authenticated
|
||||||
|
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
#############
|
#############
|
||||||
# HOME-PAGE #
|
# HOME-PAGE #
|
||||||
#############
|
#############
|
||||||
@@ -685,6 +706,8 @@ removeAnnotations.submit=Odstrániť
|
|||||||
#compare
|
#compare
|
||||||
compare.title=Porovnať
|
compare.title=Porovnať
|
||||||
compare.header=Porovnať PDF
|
compare.header=Porovnať PDF
|
||||||
|
compare.highlightColor.1=Highlight Color 1:
|
||||||
|
compare.highlightColor.2=Highlight Color 2:
|
||||||
compare.document.1=Dokument 1
|
compare.document.1=Dokument 1
|
||||||
compare.document.2=Dokument 2
|
compare.document.2=Dokument 2
|
||||||
compare.submit=Porovnať
|
compare.submit=Porovnať
|
||||||
@@ -799,6 +822,7 @@ merge.title=Zlúčiť
|
|||||||
merge.header=Zlúčiť viacero PDF (2+)
|
merge.header=Zlúčiť viacero PDF (2+)
|
||||||
merge.sortByName=Zoradiť podľa názvu
|
merge.sortByName=Zoradiť podľa názvu
|
||||||
merge.sortByDate=Zoradiť podľa dátumu
|
merge.sortByDate=Zoradiť podľa dátumu
|
||||||
|
merge.removeCertSign=Remove digital signature in the merged file?
|
||||||
merge.submit=Zlúčiť
|
merge.submit=Zlúčiť
|
||||||
|
|
||||||
|
|
||||||
@@ -816,6 +840,7 @@ pdfOrganiser.mode.6=Rozdelenie na nepárne a párne
|
|||||||
pdfOrganiser.mode.7=Odstrániť prvú
|
pdfOrganiser.mode.7=Odstrániť prvú
|
||||||
pdfOrganiser.mode.8=Odstrániť poslednú
|
pdfOrganiser.mode.8=Odstrániť poslednú
|
||||||
pdfOrganiser.mode.9=Odstrániť prvú aj poslednú
|
pdfOrganiser.mode.9=Odstrániť prvú aj poslednú
|
||||||
|
pdfOrganiser.mode.10=Odd-Even Merge
|
||||||
pdfOrganiser.placeholder=(napr. 1,3,2 alebo 4-8,2,10-12 alebo 2n-1)
|
pdfOrganiser.placeholder=(napr. 1,3,2 alebo 4-8,2,10-12 alebo 2n-1)
|
||||||
|
|
||||||
|
|
||||||
@@ -1077,6 +1102,15 @@ licenses.module=Modul
|
|||||||
licenses.version=Verzia
|
licenses.version=Verzia
|
||||||
licenses.license=Licencia
|
licenses.license=Licencia
|
||||||
|
|
||||||
|
#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.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
|
||||||
|
|
||||||
|
|
||||||
#error
|
#error
|
||||||
error.sorry=Ospravedlňujeme sa za problém!
|
error.sorry=Ospravedlňujeme sa za problém!
|
||||||
|
|||||||
@@ -55,6 +55,7 @@ userNotFoundMessage=Korisnik nije pronađen.
|
|||||||
incorrectPasswordMessage=Trenutna šifra je netačna.
|
incorrectPasswordMessage=Trenutna šifra je netačna.
|
||||||
usernameExistsMessage=Novi korisnik već postoji
|
usernameExistsMessage=Novi korisnik već postoji
|
||||||
invalidUsernameMessage=Invalid username, username can only contain letters, numbers and the following special characters @._+- or must be a valid email address.
|
invalidUsernameMessage=Invalid username, username can only contain letters, numbers and the following special characters @._+- or must be a valid email address.
|
||||||
|
confirmPasswordErrorMessage=New Password and Confirm New Password must match.
|
||||||
deleteCurrentUserMessage=Cannot delete currently logged in user.
|
deleteCurrentUserMessage=Cannot delete currently logged in user.
|
||||||
deleteUsernameExistsMessage=The username does not exist and cannot be deleted.
|
deleteUsernameExistsMessage=The username does not exist and cannot be deleted.
|
||||||
downgradeCurrentUserMessage=Nije moguće degradirati ulogu trenutnog korisnika
|
downgradeCurrentUserMessage=Nije moguće degradirati ulogu trenutnog korisnika
|
||||||
@@ -85,6 +86,7 @@ pipeline.defaultOption=Prilagođeno
|
|||||||
pipeline.submitButton=Pošalji
|
pipeline.submitButton=Pošalji
|
||||||
pipeline.help=Pipeline Help
|
pipeline.help=Pipeline Help
|
||||||
pipeline.scanHelp=Folder Scanning Help
|
pipeline.scanHelp=Folder Scanning Help
|
||||||
|
pipeline.deletePrompt=Are you sure you want to delete pipeline
|
||||||
|
|
||||||
######################
|
######################
|
||||||
# Pipeline Options #
|
# Pipeline Options #
|
||||||
@@ -173,6 +175,8 @@ adminUserSettings.header=Podešavanja kontrole korisnika za administratora
|
|||||||
adminUserSettings.admin=Administrator
|
adminUserSettings.admin=Administrator
|
||||||
adminUserSettings.user=Korisnik
|
adminUserSettings.user=Korisnik
|
||||||
adminUserSettings.addUser=Dodaj novog korisnika
|
adminUserSettings.addUser=Dodaj novog korisnika
|
||||||
|
adminUserSettings.deleteUser=Delete User
|
||||||
|
adminUserSettings.confirmDeleteUser=Should the user be deleted?
|
||||||
adminUserSettings.usernameInfo=Username can only contain letters, numbers and the following special characters @._+- or must be a valid email address.
|
adminUserSettings.usernameInfo=Username can only contain letters, numbers and the following special characters @._+- or must be a valid email address.
|
||||||
adminUserSettings.roles=Uloge
|
adminUserSettings.roles=Uloge
|
||||||
adminUserSettings.role=Uloga
|
adminUserSettings.role=Uloga
|
||||||
@@ -187,6 +191,23 @@ adminUserSettings.submit=Sačuvaj korisnika
|
|||||||
adminUserSettings.changeUserRole=Promenite ulogu korisnika
|
adminUserSettings.changeUserRole=Promenite ulogu korisnika
|
||||||
adminUserSettings.authenticated=Authenticated
|
adminUserSettings.authenticated=Authenticated
|
||||||
|
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
#############
|
#############
|
||||||
# HOME-PAGE #
|
# HOME-PAGE #
|
||||||
#############
|
#############
|
||||||
@@ -685,6 +706,8 @@ removeAnnotations.submit=Ukloni
|
|||||||
#compare
|
#compare
|
||||||
compare.title=Uporedi
|
compare.title=Uporedi
|
||||||
compare.header=Uporedi PDF fajlove
|
compare.header=Uporedi PDF fajlove
|
||||||
|
compare.highlightColor.1=Highlight Color 1:
|
||||||
|
compare.highlightColor.2=Highlight Color 2:
|
||||||
compare.document.1=Dokument 1
|
compare.document.1=Dokument 1
|
||||||
compare.document.2=Dokument 2
|
compare.document.2=Dokument 2
|
||||||
compare.submit=Uporedi
|
compare.submit=Uporedi
|
||||||
@@ -799,6 +822,7 @@ merge.title=Spajanje
|
|||||||
merge.header=Spajanje više PDF fajlova (2+)
|
merge.header=Spajanje više PDF fajlova (2+)
|
||||||
merge.sortByName=Sortiraj po imenu
|
merge.sortByName=Sortiraj po imenu
|
||||||
merge.sortByDate=Sortiraj po datumu
|
merge.sortByDate=Sortiraj po datumu
|
||||||
|
merge.removeCertSign=Remove digital signature in the merged file?
|
||||||
merge.submit=Spajanje
|
merge.submit=Spajanje
|
||||||
|
|
||||||
|
|
||||||
@@ -816,6 +840,7 @@ pdfOrganiser.mode.6=Odd-Even Split
|
|||||||
pdfOrganiser.mode.7=Remove First
|
pdfOrganiser.mode.7=Remove First
|
||||||
pdfOrganiser.mode.8=Remove Last
|
pdfOrganiser.mode.8=Remove Last
|
||||||
pdfOrganiser.mode.9=Remove First and 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.placeholder=(e.g. 1,3,2 or 4-8,2,10-12 or 2n-1)
|
||||||
|
|
||||||
|
|
||||||
@@ -1077,6 +1102,15 @@ licenses.module=Module
|
|||||||
licenses.version=Version
|
licenses.version=Version
|
||||||
licenses.license=License
|
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.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
|
||||||
|
|
||||||
|
|
||||||
#error
|
#error
|
||||||
error.sorry=Sorry for the issue!
|
error.sorry=Sorry for the issue!
|
||||||
|
|||||||
@@ -55,6 +55,7 @@ userNotFoundMessage=User not found.
|
|||||||
incorrectPasswordMessage=Current password is incorrect.
|
incorrectPasswordMessage=Current password is incorrect.
|
||||||
usernameExistsMessage=New Username already exists.
|
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.
|
invalidUsernameMessage=Invalid username, username can only contain letters, numbers and the following special characters @._+- or must be a valid email address.
|
||||||
|
confirmPasswordErrorMessage=New Password and Confirm New Password must match.
|
||||||
deleteCurrentUserMessage=Cannot delete currently logged in user.
|
deleteCurrentUserMessage=Cannot delete currently logged in user.
|
||||||
deleteUsernameExistsMessage=The username does not exist and cannot be deleted.
|
deleteUsernameExistsMessage=The username does not exist and cannot be deleted.
|
||||||
downgradeCurrentUserMessage=Kan inte nedgradera nuvarande användares roll
|
downgradeCurrentUserMessage=Kan inte nedgradera nuvarande användares roll
|
||||||
@@ -85,6 +86,7 @@ pipeline.defaultOption=Custom
|
|||||||
pipeline.submitButton=Submit
|
pipeline.submitButton=Submit
|
||||||
pipeline.help=Pipeline Help
|
pipeline.help=Pipeline Help
|
||||||
pipeline.scanHelp=Folder Scanning Help
|
pipeline.scanHelp=Folder Scanning Help
|
||||||
|
pipeline.deletePrompt=Are you sure you want to delete pipeline
|
||||||
|
|
||||||
######################
|
######################
|
||||||
# Pipeline Options #
|
# Pipeline Options #
|
||||||
@@ -173,6 +175,8 @@ adminUserSettings.header=Admin User Control Settings
|
|||||||
adminUserSettings.admin=Admin
|
adminUserSettings.admin=Admin
|
||||||
adminUserSettings.user=User
|
adminUserSettings.user=User
|
||||||
adminUserSettings.addUser=Add New User
|
adminUserSettings.addUser=Add New User
|
||||||
|
adminUserSettings.deleteUser=Delete User
|
||||||
|
adminUserSettings.confirmDeleteUser=Should the user be deleted?
|
||||||
adminUserSettings.usernameInfo=Username can only contain letters, numbers and the following special characters @._+- or must be a valid email address.
|
adminUserSettings.usernameInfo=Username can only contain letters, numbers and the following special characters @._+- or must be a valid email address.
|
||||||
adminUserSettings.roles=Roles
|
adminUserSettings.roles=Roles
|
||||||
adminUserSettings.role=Role
|
adminUserSettings.role=Role
|
||||||
@@ -187,6 +191,23 @@ adminUserSettings.submit=Save User
|
|||||||
adminUserSettings.changeUserRole=Ändra användarens roll
|
adminUserSettings.changeUserRole=Ändra användarens roll
|
||||||
adminUserSettings.authenticated=Authenticated
|
adminUserSettings.authenticated=Authenticated
|
||||||
|
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
#############
|
#############
|
||||||
# HOME-PAGE #
|
# HOME-PAGE #
|
||||||
#############
|
#############
|
||||||
@@ -685,6 +706,8 @@ removeAnnotations.submit=Remove
|
|||||||
#compare
|
#compare
|
||||||
compare.title=Jämför
|
compare.title=Jämför
|
||||||
compare.header=Jämför PDF-filer
|
compare.header=Jämför PDF-filer
|
||||||
|
compare.highlightColor.1=Highlight Color 1:
|
||||||
|
compare.highlightColor.2=Highlight Color 2:
|
||||||
compare.document.1=Dokument 1
|
compare.document.1=Dokument 1
|
||||||
compare.document.2=Dokument 2
|
compare.document.2=Dokument 2
|
||||||
compare.submit=Jämför
|
compare.submit=Jämför
|
||||||
@@ -799,6 +822,7 @@ merge.title=Sammanfoga
|
|||||||
merge.header=Slå samman flera PDF-filer (2+)
|
merge.header=Slå samman flera PDF-filer (2+)
|
||||||
merge.sortByName=Sort by name
|
merge.sortByName=Sort by name
|
||||||
merge.sortByDate=Sort by date
|
merge.sortByDate=Sort by date
|
||||||
|
merge.removeCertSign=Remove digital signature in the merged file?
|
||||||
merge.submit=Slå samman
|
merge.submit=Slå samman
|
||||||
|
|
||||||
|
|
||||||
@@ -816,6 +840,7 @@ pdfOrganiser.mode.6=Odd-Even Split
|
|||||||
pdfOrganiser.mode.7=Remove First
|
pdfOrganiser.mode.7=Remove First
|
||||||
pdfOrganiser.mode.8=Remove Last
|
pdfOrganiser.mode.8=Remove Last
|
||||||
pdfOrganiser.mode.9=Remove First and 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.placeholder=(e.g. 1,3,2 or 4-8,2,10-12 or 2n-1)
|
||||||
|
|
||||||
|
|
||||||
@@ -1077,6 +1102,15 @@ licenses.module=Module
|
|||||||
licenses.version=Version
|
licenses.version=Version
|
||||||
licenses.license=License
|
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.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
|
||||||
|
|
||||||
|
|
||||||
#error
|
#error
|
||||||
error.sorry=Sorry for the issue!
|
error.sorry=Sorry for the issue!
|
||||||
|
|||||||
@@ -55,6 +55,7 @@ userNotFoundMessage=Kullanıcı bulunamadı.
|
|||||||
incorrectPasswordMessage=Mevcut şifre yanlış.
|
incorrectPasswordMessage=Mevcut şifre yanlış.
|
||||||
usernameExistsMessage=Yeni Kullanıcı Adı zaten var.
|
usernameExistsMessage=Yeni Kullanıcı Adı zaten var.
|
||||||
invalidUsernameMessage=Geçersiz kullanıcı adı, kullanıcı adı yalnızca harf, rakam ve aşağıdaki özel karakterleri @._+- içerebilir veya geçerli bir e-posta adresi olmalıdır.
|
invalidUsernameMessage=Geçersiz kullanıcı adı, kullanıcı adı yalnızca harf, rakam ve aşağıdaki özel karakterleri @._+- içerebilir veya geçerli bir e-posta adresi olmalıdır.
|
||||||
|
confirmPasswordErrorMessage=New Password and Confirm New Password must match.
|
||||||
deleteCurrentUserMessage=Şu anda oturum açmış olan kullanıcı silinemiyor.
|
deleteCurrentUserMessage=Şu anda oturum açmış olan kullanıcı silinemiyor.
|
||||||
deleteUsernameExistsMessage=Kullanıcı adı mevcut değil ve silinemez.
|
deleteUsernameExistsMessage=Kullanıcı adı mevcut değil ve silinemez.
|
||||||
downgradeCurrentUserMessage=Mevcut kullanıcının rolü düşürülemiyor
|
downgradeCurrentUserMessage=Mevcut kullanıcının rolü düşürülemiyor
|
||||||
@@ -85,6 +86,7 @@ pipeline.defaultOption=Özel
|
|||||||
pipeline.submitButton=Gönder
|
pipeline.submitButton=Gönder
|
||||||
pipeline.help=Çoklu İşlemler Yardım
|
pipeline.help=Çoklu İşlemler Yardım
|
||||||
pipeline.scanHelp=Klasör Tarama Yardımı
|
pipeline.scanHelp=Klasör Tarama Yardımı
|
||||||
|
pipeline.deletePrompt=Are you sure you want to delete pipeline
|
||||||
|
|
||||||
######################
|
######################
|
||||||
# Pipeline Options #
|
# Pipeline Options #
|
||||||
@@ -173,6 +175,8 @@ adminUserSettings.header=Yönetici Kullanıcı Kontrol Ayarları
|
|||||||
adminUserSettings.admin=Yönetici
|
adminUserSettings.admin=Yönetici
|
||||||
adminUserSettings.user=Kullanıcı
|
adminUserSettings.user=Kullanıcı
|
||||||
adminUserSettings.addUser=Yeni Kullanıcı Ekle
|
adminUserSettings.addUser=Yeni Kullanıcı Ekle
|
||||||
|
adminUserSettings.deleteUser=Delete User
|
||||||
|
adminUserSettings.confirmDeleteUser=Should the user be deleted?
|
||||||
adminUserSettings.usernameInfo=Kullanıcı adı yalnızca harf, rakam ve aşağıdaki özel karakterleri @._+- içerebilir veya geçerli bir e-posta adresi olmalıdır.
|
adminUserSettings.usernameInfo=Kullanıcı adı yalnızca harf, rakam ve aşağıdaki özel karakterleri @._+- içerebilir veya geçerli bir e-posta adresi olmalıdır.
|
||||||
adminUserSettings.roles=Roller
|
adminUserSettings.roles=Roller
|
||||||
adminUserSettings.role=Rol
|
adminUserSettings.role=Rol
|
||||||
@@ -187,6 +191,23 @@ adminUserSettings.submit=Kullanıcıyı Kaydet
|
|||||||
adminUserSettings.changeUserRole=Kullanıcı rolünü değiştir
|
adminUserSettings.changeUserRole=Kullanıcı rolünü değiştir
|
||||||
adminUserSettings.authenticated=Onaylandı
|
adminUserSettings.authenticated=Onaylandı
|
||||||
|
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
#############
|
#############
|
||||||
# HOME-PAGE #
|
# HOME-PAGE #
|
||||||
#############
|
#############
|
||||||
@@ -685,6 +706,8 @@ removeAnnotations.submit=Kaldır
|
|||||||
#compare
|
#compare
|
||||||
compare.title=Karşılaştır
|
compare.title=Karşılaştır
|
||||||
compare.header=PDF'leri Karşılaştır
|
compare.header=PDF'leri Karşılaştır
|
||||||
|
compare.highlightColor.1=Highlight Color 1:
|
||||||
|
compare.highlightColor.2=Highlight Color 2:
|
||||||
compare.document.1=Belge 1
|
compare.document.1=Belge 1
|
||||||
compare.document.2=Belge 2
|
compare.document.2=Belge 2
|
||||||
compare.submit=Karşılaştır
|
compare.submit=Karşılaştır
|
||||||
@@ -799,6 +822,7 @@ merge.title=Birleştir
|
|||||||
merge.header=Çoklu PDF'leri Birleştir (2+)
|
merge.header=Çoklu PDF'leri Birleştir (2+)
|
||||||
merge.sortByName=İsme göre sırala
|
merge.sortByName=İsme göre sırala
|
||||||
merge.sortByDate=Tarihe göre sırala
|
merge.sortByDate=Tarihe göre sırala
|
||||||
|
merge.removeCertSign=Remove digital signature in the merged file?
|
||||||
merge.submit=Birleştir
|
merge.submit=Birleştir
|
||||||
|
|
||||||
|
|
||||||
@@ -816,6 +840,7 @@ pdfOrganiser.mode.6=Tek-Çift Ayrımı
|
|||||||
pdfOrganiser.mode.7=İlk Önce Kaldır
|
pdfOrganiser.mode.7=İlk Önce Kaldır
|
||||||
pdfOrganiser.mode.8=Sonuncuyu Kaldır
|
pdfOrganiser.mode.8=Sonuncuyu Kaldır
|
||||||
pdfOrganiser.mode.9=İlk ve Sonu Kaldır
|
pdfOrganiser.mode.9=İlk ve Sonu Kaldır
|
||||||
|
pdfOrganiser.mode.10=Odd-Even Merge
|
||||||
pdfOrganiser.placeholder=(örn. 1,3,2 veya 4-8,2,10-12 veya 2n-1)
|
pdfOrganiser.placeholder=(örn. 1,3,2 veya 4-8,2,10-12 veya 2n-1)
|
||||||
|
|
||||||
|
|
||||||
@@ -1077,6 +1102,15 @@ licenses.module=Modül
|
|||||||
licenses.version=Versiyon
|
licenses.version=Versiyon
|
||||||
licenses.license=Lisans
|
licenses.license=Lisans
|
||||||
|
|
||||||
|
#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.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
|
||||||
|
|
||||||
|
|
||||||
#error
|
#error
|
||||||
error.sorry=Sorun için özür dileriz!
|
error.sorry=Sorun için özür dileriz!
|
||||||
|
|||||||
@@ -55,23 +55,24 @@ userNotFoundMessage=Користувача не знайдено.
|
|||||||
incorrectPasswordMessage=Поточний пароль невірний.
|
incorrectPasswordMessage=Поточний пароль невірний.
|
||||||
usernameExistsMessage=Нове ім'я користувача вже існує.
|
usernameExistsMessage=Нове ім'я користувача вже існує.
|
||||||
invalidUsernameMessage=Недійсне ім’я користувача, ім’я користувача може містити лише літери, цифри та наступні спеціальні символи @._+- або має бути дійсною електронною адресою.
|
invalidUsernameMessage=Недійсне ім’я користувача, ім’я користувача може містити лише літери, цифри та наступні спеціальні символи @._+- або має бути дійсною електронною адресою.
|
||||||
|
confirmPasswordErrorMessage=New Password and Confirm New Password must match.
|
||||||
deleteCurrentUserMessage=Неможливо видалити користувача, який увійшов в систему.
|
deleteCurrentUserMessage=Неможливо видалити користувача, який увійшов в систему.
|
||||||
deleteUsernameExistsMessage=Ім'я користувача не існує і не може бути видалено.
|
deleteUsernameExistsMessage=Ім'я користувача не існує і не може бути видалено.
|
||||||
downgradeCurrentUserMessage=Неможливо понизити роль поточного користувача
|
downgradeCurrentUserMessage=Неможливо понизити роль поточного користувача
|
||||||
downgradeCurrentUserLongMessage=Неможливо понизити роль поточного користувача. Отже, поточний користувач не відображатиметься.
|
downgradeCurrentUserLongMessage=Неможливо понизити роль поточного користувача. Отже, поточний користувач не відображатиметься.
|
||||||
userAlreadyExistsOAuthMessage=The user already exists as an OAuth2 user.
|
userAlreadyExistsOAuthMessage=The user already exists as an OAuth2 user.
|
||||||
userAlreadyExistsWebMessage=The user already exists as an web user.
|
userAlreadyExistsWebMessage=The user already exists as an web user.
|
||||||
error=Error
|
error=Помилка
|
||||||
oops=Oops!
|
oops=Упс!
|
||||||
help=Help
|
help=Допомога
|
||||||
goHomepage=Go to Homepage
|
goHomepage=До головної сторінки
|
||||||
joinDiscord=Join our Discord server
|
joinDiscord=Приєднуйтесь до нашого Discord серверу
|
||||||
seeDockerHub=See Docker Hub
|
seeDockerHub=Переглянути Docker Hub
|
||||||
visitGithub=Visit Github Repository
|
visitGithub=Переглянути Github репозиторій
|
||||||
donate=Donate
|
donate=Задонатити
|
||||||
color=Color
|
color=Колір
|
||||||
sponsor=Sponsor
|
sponsor=Спонсор
|
||||||
info=Info
|
info=Інформація
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -85,6 +86,7 @@ pipeline.defaultOption=Користувацький
|
|||||||
pipeline.submitButton=Надіслати
|
pipeline.submitButton=Надіслати
|
||||||
pipeline.help=Довідка з конвеєрної обробки
|
pipeline.help=Довідка з конвеєрної обробки
|
||||||
pipeline.scanHelp=Довідка зі сканування папок
|
pipeline.scanHelp=Довідка зі сканування папок
|
||||||
|
pipeline.deletePrompt=Are you sure you want to delete pipeline
|
||||||
|
|
||||||
######################
|
######################
|
||||||
# Pipeline Options #
|
# Pipeline Options #
|
||||||
@@ -105,25 +107,25 @@ pipelineOptions.validateButton=Перевірити
|
|||||||
#############
|
#############
|
||||||
# NAVBAR #
|
# NAVBAR #
|
||||||
#############
|
#############
|
||||||
navbar.favorite=Favorites
|
navbar.favorite=Обране
|
||||||
navbar.darkmode=Темний режим
|
navbar.darkmode=Темний режим
|
||||||
navbar.language=Languages
|
navbar.language=Мови
|
||||||
navbar.settings=Налаштування
|
navbar.settings=Налаштування
|
||||||
navbar.allTools=Tools
|
navbar.allTools=Інструменти
|
||||||
navbar.multiTool=Multi Tools
|
navbar.multiTool=Мультіінструмент
|
||||||
navbar.sections.organize=Organize
|
navbar.sections.organize=Організувати
|
||||||
navbar.sections.convertTo=Convert to PDF
|
navbar.sections.convertTo=Конвертувати в PDF
|
||||||
navbar.sections.convertFrom=Convert from PDF
|
navbar.sections.convertFrom=Конвертувати з PDF
|
||||||
navbar.sections.security=Sign & Security
|
navbar.sections.security=Підпис та Безпека
|
||||||
navbar.sections.advance=Advanced
|
navbar.sections.advance=Додаткове
|
||||||
navbar.sections.edit=View & Edit
|
navbar.sections.edit=Перегляд та Редагування
|
||||||
|
|
||||||
#############
|
#############
|
||||||
# SETTINGS #
|
# SETTINGS #
|
||||||
#############
|
#############
|
||||||
settings.title=Налаштування
|
settings.title=Налаштування
|
||||||
settings.update=Доступне оновлення
|
settings.update=Доступне оновлення
|
||||||
settings.updateAvailable={0} is the current installed version. A new version ({1}) is available.
|
settings.updateAvailable=Зараз встановлена версія {0}. Нова версія ({1}) доступна.
|
||||||
settings.appVersion=Версія додатку:
|
settings.appVersion=Версія додатку:
|
||||||
settings.downloadOption.title=Виберіть варіант завантаження (для завантаження одного файлу без zip):
|
settings.downloadOption.title=Виберіть варіант завантаження (для завантаження одного файлу без zip):
|
||||||
settings.downloadOption.1=Відкрити в тому ж вікні
|
settings.downloadOption.1=Відкрити в тому ж вікні
|
||||||
@@ -173,6 +175,8 @@ adminUserSettings.header=Налаштування контролю корист
|
|||||||
adminUserSettings.admin=Адміністратор
|
adminUserSettings.admin=Адміністратор
|
||||||
adminUserSettings.user=Користувач
|
adminUserSettings.user=Користувач
|
||||||
adminUserSettings.addUser=Додати нового користувача
|
adminUserSettings.addUser=Додати нового користувача
|
||||||
|
adminUserSettings.deleteUser=Видалити користувача
|
||||||
|
adminUserSettings.confirmDeleteUser=Видалити цього користувача?
|
||||||
adminUserSettings.usernameInfo=Ім’я користувача може містити лише літери, цифри та наступні спеціальні символи @._+- або має бути дійсною електронною адресою.
|
adminUserSettings.usernameInfo=Ім’я користувача може містити лише літери, цифри та наступні спеціальні символи @._+- або має бути дійсною електронною адресою.
|
||||||
adminUserSettings.roles=Ролі
|
adminUserSettings.roles=Ролі
|
||||||
adminUserSettings.role=Роль
|
adminUserSettings.role=Роль
|
||||||
@@ -185,7 +189,24 @@ adminUserSettings.internalApiUser=Внутрішній користувач API
|
|||||||
adminUserSettings.forceChange=Примусити користувача змінити пароль при вході в систему
|
adminUserSettings.forceChange=Примусити користувача змінити пароль при вході в систему
|
||||||
adminUserSettings.submit=Зберегти користувача
|
adminUserSettings.submit=Зберегти користувача
|
||||||
adminUserSettings.changeUserRole=Змінити роль користувача
|
adminUserSettings.changeUserRole=Змінити роль користувача
|
||||||
adminUserSettings.authenticated=Authenticated
|
adminUserSettings.authenticated=Автентифіковано
|
||||||
|
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
#############
|
#############
|
||||||
# HOME-PAGE #
|
# HOME-PAGE #
|
||||||
@@ -332,8 +353,8 @@ home.certSign.title=Підписати сертифікатом
|
|||||||
home.certSign.desc=Підписати PDF сертифікатом/ключем (PEM/P12)
|
home.certSign.desc=Підписати PDF сертифікатом/ключем (PEM/P12)
|
||||||
certSign.tags=authenticate,PEM,P12,official,encrypt
|
certSign.tags=authenticate,PEM,P12,official,encrypt
|
||||||
|
|
||||||
home.removeCertSign.title=Remove Certificate Sign
|
home.removeCertSign.title=Видалити підпис сертифікатом
|
||||||
home.removeCertSign.desc=Remove certificate signature from PDF
|
home.removeCertSign.desc=Видалити підпис сертифікатом з PDF-документу
|
||||||
removeCertSign.tags=authenticate,PEM,P12,official,decrypt
|
removeCertSign.tags=authenticate,PEM,P12,official,decrypt
|
||||||
|
|
||||||
home.pageLayout.title=Об'єднати сторінки
|
home.pageLayout.title=Об'єднати сторінки
|
||||||
@@ -401,7 +422,7 @@ home.PdfToSinglePage.desc=Об'єднує всі сторінки PDF в одн
|
|||||||
PdfToSinglePage.tags=single page
|
PdfToSinglePage.tags=single page
|
||||||
|
|
||||||
|
|
||||||
home.showJS.title=Показати Javascript
|
home.showJS.title=Показати JavaScript
|
||||||
home.showJS.desc=Шукає та відображає будь-який JS, вбудований у PDF-файл.
|
home.showJS.desc=Шукає та відображає будь-який JS, вбудований у PDF-файл.
|
||||||
showJS.tags=JS
|
showJS.tags=JS
|
||||||
|
|
||||||
@@ -456,12 +477,12 @@ login.locked=Ваш обліковий запис заблоковано.
|
|||||||
login.signinTitle=Будь ласка, увійдіть
|
login.signinTitle=Будь ласка, увійдіть
|
||||||
login.ssoSignIn=Увійти через єдиний вхід
|
login.ssoSignIn=Увійти через єдиний вхід
|
||||||
login.oauth2AutoCreateDisabled=Автоматичне створення користувача OAUTH2 ВИМКНЕНО
|
login.oauth2AutoCreateDisabled=Автоматичне створення користувача OAUTH2 ВИМКНЕНО
|
||||||
login.oauth2RequestNotFound=Authorization request not found
|
login.oauth2RequestNotFound=Запит на авторизація не знайдено
|
||||||
login.oauth2InvalidUserInfoResponse=Invalid User Info Response
|
login.oauth2InvalidUserInfoResponse=Недійсна відповідь з інформацією користувача
|
||||||
login.oauth2invalidRequest=Invalid Request
|
login.oauth2invalidRequest=Недійсний запит
|
||||||
login.oauth2AccessDenied=Access Denied
|
login.oauth2AccessDenied=Доступ заблоковано
|
||||||
login.oauth2InvalidTokenResponse=Invalid Token Response
|
login.oauth2InvalidTokenResponse=Недійсна відповідь з токеном
|
||||||
login.oauth2InvalidIdToken=Invalid Id Token
|
login.oauth2InvalidIdToken=Недійсний Id токен
|
||||||
|
|
||||||
|
|
||||||
#auto-redact
|
#auto-redact
|
||||||
@@ -478,9 +499,9 @@ autoRedact.submitButton=Надіслати
|
|||||||
|
|
||||||
|
|
||||||
#showJS
|
#showJS
|
||||||
showJS.title=Показати Javascript
|
showJS.title=Показати JavaScript
|
||||||
showJS.header=Показати Javascript
|
showJS.header=Показати JavaScript
|
||||||
showJS.downloadJS=Завантажити Javascript
|
showJS.downloadJS=Завантажити JavaScript
|
||||||
showJS.submit=Показати
|
showJS.submit=Показати
|
||||||
|
|
||||||
|
|
||||||
@@ -660,10 +681,10 @@ certSign.submit=Підписати PDF
|
|||||||
|
|
||||||
|
|
||||||
#removeCertSign
|
#removeCertSign
|
||||||
removeCertSign.title=Remove Certificate Signature
|
removeCertSign.title=Видалення підпису сертифікатом
|
||||||
removeCertSign.header=Remove the digital certificate from the PDF
|
removeCertSign.header=Видалення підпису сертифікатом з PDF документу
|
||||||
removeCertSign.selectPDF=Select a PDF file:
|
removeCertSign.selectPDF=Оберіть PDF-файл:
|
||||||
removeCertSign.submit=Remove Signature
|
removeCertSign.submit=Видалити підпис
|
||||||
|
|
||||||
|
|
||||||
#removeBlanks
|
#removeBlanks
|
||||||
@@ -685,6 +706,8 @@ removeAnnotations.submit=Видалити
|
|||||||
#compare
|
#compare
|
||||||
compare.title=Порівняння
|
compare.title=Порівняння
|
||||||
compare.header=Порівняння PDF
|
compare.header=Порівняння PDF
|
||||||
|
compare.highlightColor.1=Highlight Color 1:
|
||||||
|
compare.highlightColor.2=Highlight Color 2:
|
||||||
compare.document.1=Документ 1
|
compare.document.1=Документ 1
|
||||||
compare.document.2=Документ 2
|
compare.document.2=Документ 2
|
||||||
compare.submit=Порівняти
|
compare.submit=Порівняти
|
||||||
@@ -721,7 +744,7 @@ repair.submit=Ремонтувати
|
|||||||
#flatten
|
#flatten
|
||||||
flatten.title=Згладжування
|
flatten.title=Згладжування
|
||||||
flatten.header=Згладжування PDF
|
flatten.header=Згладжування PDF
|
||||||
flatten.flattenOnlyForms=Flatten only forms
|
flatten.flattenOnlyForms=Згладити тільки форми
|
||||||
flatten.submit=Згладити
|
flatten.submit=Згладити
|
||||||
|
|
||||||
|
|
||||||
@@ -799,6 +822,7 @@ merge.title=Об'єднати
|
|||||||
merge.header=Об'єднання кількох PDF-файлів (2+)
|
merge.header=Об'єднання кількох PDF-файлів (2+)
|
||||||
merge.sortByName=Сортування за ім'ям
|
merge.sortByName=Сортування за ім'ям
|
||||||
merge.sortByDate=Сортування за датою
|
merge.sortByDate=Сортування за датою
|
||||||
|
merge.removeCertSign=Remove digital signature in the merged file?
|
||||||
merge.submit=Об'єднати
|
merge.submit=Об'єднати
|
||||||
|
|
||||||
|
|
||||||
@@ -816,13 +840,14 @@ pdfOrganiser.mode.6=Розділення на парні та непарні с
|
|||||||
pdfOrganiser.mode.7=Видалити першу
|
pdfOrganiser.mode.7=Видалити першу
|
||||||
pdfOrganiser.mode.8=Видалити останню
|
pdfOrganiser.mode.8=Видалити останню
|
||||||
pdfOrganiser.mode.9=Видалити першу та останню
|
pdfOrganiser.mode.9=Видалити першу та останню
|
||||||
|
pdfOrganiser.mode.10=Odd-Even Merge
|
||||||
pdfOrganiser.placeholder=(наприклад, 1,3,2 або 4-8,2,10-12 або 2n-1)
|
pdfOrganiser.placeholder=(наприклад, 1,3,2 або 4-8,2,10-12 або 2n-1)
|
||||||
|
|
||||||
|
|
||||||
#multiTool
|
#multiTool
|
||||||
multiTool.title=Мультіінструмент PDF
|
multiTool.title=Мультіінструмент PDF
|
||||||
multiTool.header=Мультіінструмент PDF
|
multiTool.header=Мультіінструмент PDF
|
||||||
multiTool.uploadPrompts=File Name
|
multiTool.uploadPrompts=Ім'я файлу
|
||||||
|
|
||||||
#view pdf
|
#view pdf
|
||||||
viewPdf.title=Переглянути PDF
|
viewPdf.title=Переглянути PDF
|
||||||
@@ -975,8 +1000,8 @@ pdfToPDFA.header=PDF в PDF/A
|
|||||||
pdfToPDFA.credit=Цей сервіс використовує OCRmyPDF для перетворення у формат PDF/A
|
pdfToPDFA.credit=Цей сервіс використовує OCRmyPDF для перетворення у формат PDF/A
|
||||||
pdfToPDFA.submit=Конвертувати
|
pdfToPDFA.submit=Конвертувати
|
||||||
pdfToPDFA.tip=Наразі не працює для кількох вхідних файлів одночасно
|
pdfToPDFA.tip=Наразі не працює для кількох вхідних файлів одночасно
|
||||||
pdfToPDFA.outputFormat=Output format
|
pdfToPDFA.outputFormat=Вихідний формат
|
||||||
pdfToPDFA.pdfWithDigitalSignature=The PDF contains a digital signature. This will be removed in the next step.
|
pdfToPDFA.pdfWithDigitalSignature=Цей PDF документ має цифровий підпис. Цей підпис буде видалений у наступному кроці.
|
||||||
|
|
||||||
|
|
||||||
#PDFToWord
|
#PDFToWord
|
||||||
@@ -1062,11 +1087,11 @@ split-by-sections.merge=Об'єднати в один PDF
|
|||||||
|
|
||||||
|
|
||||||
#printFile
|
#printFile
|
||||||
printFile.title=Print File
|
printFile.title=Роздрукувати файл
|
||||||
printFile.header=Print File to Printer
|
printFile.header=Роздрукувати файл прінтером
|
||||||
printFile.selectText.1=Select File to Print
|
printFile.selectText.1=Обрати файл для роздрукування
|
||||||
printFile.selectText.2=Enter Printer Name
|
printFile.selectText.2=Обрати назву прінтера
|
||||||
printFile.submit=Print
|
printFile.submit=Роздрукувати
|
||||||
|
|
||||||
|
|
||||||
#licenses
|
#licenses
|
||||||
@@ -1077,6 +1102,15 @@ licenses.module=Модуль
|
|||||||
licenses.version=Версія
|
licenses.version=Версія
|
||||||
licenses.license=Ліцензія
|
licenses.license=Ліцензія
|
||||||
|
|
||||||
|
#survey
|
||||||
|
survey.nav=Опитування
|
||||||
|
survey.title=Опитування Stirling-PDF
|
||||||
|
survey.description=Stirling-PDF не має аналітичних засобів для відслідковування, тому ми хочемо почути думку від користувачів, як покращити Stirling-PDF!
|
||||||
|
survey.please=Будь-ласка, пройдіть опитування!
|
||||||
|
survey.disabled=(Вікно з опитування буде відключено у наступних оновленнях, але буде доступне внизу сторінки)
|
||||||
|
survey.button=Пройти опитування
|
||||||
|
survey.dontShowAgain=Не показувати це вікно
|
||||||
|
|
||||||
|
|
||||||
#error
|
#error
|
||||||
error.sorry=Вибачте за незручності!
|
error.sorry=Вибачте за незручності!
|
||||||
|
|||||||
@@ -10,8 +10,8 @@ multiPdfDropPrompt=选择(或拖拽)所需的PDF
|
|||||||
imgPrompt=选择图像
|
imgPrompt=选择图像
|
||||||
genericSubmit=提交
|
genericSubmit=提交
|
||||||
processTimeWarning=警告:此过程可能需要多达一分钟,具体时间取决于文件大小
|
processTimeWarning=警告:此过程可能需要多达一分钟,具体时间取决于文件大小
|
||||||
pageOrderPrompt=页面顺序(输入逗号分隔的页码列表):
|
pageOrderPrompt=页面顺序(输入逗号分隔的页码列表或函数):
|
||||||
pageSelectionPrompt=自定义页面选择(输入以逗号分隔的页码列表 1,5,6 或 2n+1 等函数):
|
pageSelectionPrompt=自定义页面选择(输入以逗号分隔的页码列表或函数:1,5,6、2n+1):
|
||||||
goToPage=到
|
goToPage=到
|
||||||
true=对
|
true=对
|
||||||
false=错
|
false=错
|
||||||
@@ -33,7 +33,7 @@ sizes.small=小型尺寸
|
|||||||
sizes.medium=中型尺寸
|
sizes.medium=中型尺寸
|
||||||
sizes.large=大型尺寸
|
sizes.large=大型尺寸
|
||||||
sizes.x-large=超大型尺寸
|
sizes.x-large=超大型尺寸
|
||||||
error.pdfPassword=PDF 文档有密码,未提供密码或密码不正确
|
error.pdfPassword=PDF文档有密码,未提供密码或密码不正确
|
||||||
delete=删除
|
delete=删除
|
||||||
username=用户名
|
username=用户名
|
||||||
password=密码
|
password=密码
|
||||||
@@ -55,12 +55,13 @@ userNotFoundMessage=未找到用户。
|
|||||||
incorrectPasswordMessage=当前密码不正确。
|
incorrectPasswordMessage=当前密码不正确。
|
||||||
usernameExistsMessage=新用户名已存在。
|
usernameExistsMessage=新用户名已存在。
|
||||||
invalidUsernameMessage=用户名无效,用户名只能包含字母、数字和以下特殊字符@._+- 或必须是有效的电子邮件地址。
|
invalidUsernameMessage=用户名无效,用户名只能包含字母、数字和以下特殊字符@._+- 或必须是有效的电子邮件地址。
|
||||||
|
confirmPasswordErrorMessage=两次密码不一致。
|
||||||
deleteCurrentUserMessage=无法删除当前登录的用户。
|
deleteCurrentUserMessage=无法删除当前登录的用户。
|
||||||
deleteUsernameExistsMessage=用户名不存在,无法删除。
|
deleteUsernameExistsMessage=用户名不存在,无法删除。
|
||||||
downgradeCurrentUserMessage=无法降级当前用户的角色
|
downgradeCurrentUserMessage=无法降级当前用户的角色
|
||||||
downgradeCurrentUserLongMessage=无法降级当前用户的角色。因此,当前用户将不会显示。
|
downgradeCurrentUserLongMessage=无法降级当前用户的角色。因此,当前用户将不会显示。
|
||||||
userAlreadyExistsOAuthMessage=The user already exists as an OAuth2 user.
|
userAlreadyExistsOAuthMessage=该用户已作为OAuth2用户存在。
|
||||||
userAlreadyExistsWebMessage=The user already exists as an web user.
|
userAlreadyExistsWebMessage=该用户已作为Web用户存在。
|
||||||
error=错误
|
error=错误
|
||||||
oops=哎呀!
|
oops=哎呀!
|
||||||
help=帮助
|
help=帮助
|
||||||
@@ -71,20 +72,21 @@ visitGithub=访问Github仓库
|
|||||||
donate=捐款
|
donate=捐款
|
||||||
color=颜色
|
color=颜色
|
||||||
sponsor=赞助
|
sponsor=赞助
|
||||||
info=Info
|
info=信息
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
###############
|
###############
|
||||||
# Pipeline #
|
# Pipeline #
|
||||||
###############
|
###############
|
||||||
pipeline.header=流水线菜单 (Beta)
|
pipeline.header=流水线菜单(Beta)
|
||||||
pipeline.uploadButton=上传自定义流水线
|
pipeline.uploadButton=上传自定义流水线
|
||||||
pipeline.configureButton=配置
|
pipeline.configureButton=配置
|
||||||
pipeline.defaultOption=自定义
|
pipeline.defaultOption=自定义
|
||||||
pipeline.submitButton=提交
|
pipeline.submitButton=提交
|
||||||
pipeline.help=工作流帮助
|
pipeline.help=工作流帮助
|
||||||
pipeline.scanHelp=文件夹扫描帮助
|
pipeline.scanHelp=文件夹扫描帮助
|
||||||
|
pipeline.deletePrompt=确认删除该工作流?
|
||||||
|
|
||||||
######################
|
######################
|
||||||
# Pipeline Options #
|
# Pipeline Options #
|
||||||
@@ -123,7 +125,7 @@ navbar.sections.edit=查看和编辑
|
|||||||
#############
|
#############
|
||||||
settings.title=设置
|
settings.title=设置
|
||||||
settings.update=可更新
|
settings.update=可更新
|
||||||
settings.updateAvailable={0} is the current installed version. A new version ({1}) is available.
|
settings.updateAvailable=当前版本为 {0},新版本 ({1}) 可用。
|
||||||
settings.appVersion=应用程序版本:
|
settings.appVersion=应用程序版本:
|
||||||
settings.downloadOption.title=选择下载选项(单个文件非压缩文件):
|
settings.downloadOption.title=选择下载选项(单个文件非压缩文件):
|
||||||
settings.downloadOption.1=在同一窗口打开
|
settings.downloadOption.1=在同一窗口打开
|
||||||
@@ -131,10 +133,10 @@ settings.downloadOption.2=在新窗口中打开
|
|||||||
settings.downloadOption.3=下载文件
|
settings.downloadOption.3=下载文件
|
||||||
settings.zipThreshold=当下载的文件数量超过限制时,将文件压缩。
|
settings.zipThreshold=当下载的文件数量超过限制时,将文件压缩。
|
||||||
settings.signOut=登出
|
settings.signOut=登出
|
||||||
settings.accountSettings=帐号设定
|
settings.accountSettings=账号设定
|
||||||
settings.bored.help=Enables easter egg game
|
settings.bored.help=启用彩蛋游戏
|
||||||
settings.cacheInputs.name=Save form inputs
|
settings.cacheInputs.name=保存表单输入
|
||||||
settings.cacheInputs.help=Enable to store previously used inputs for future runs
|
settings.cacheInputs.help=保存先前输入以供日后使用
|
||||||
|
|
||||||
changeCreds.title=更改凭证
|
changeCreds.title=更改凭证
|
||||||
changeCreds.header=更新您的账户详情
|
changeCreds.header=更新您的账户详情
|
||||||
@@ -147,8 +149,8 @@ changeCreds.submit=提交更改
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
account.title=帐号设定
|
account.title=账号设定
|
||||||
account.accountSettings=帐号设定
|
account.accountSettings=账号设定
|
||||||
account.adminSettings=管理员设置 - 查看和添加用户
|
account.adminSettings=管理员设置 - 查看和添加用户
|
||||||
account.userControlSettings=用户控制设置
|
account.userControlSettings=用户控制设置
|
||||||
account.changeUsername=更改用户名
|
account.changeUsername=更改用户名
|
||||||
@@ -159,11 +161,11 @@ account.newPassword=新密码
|
|||||||
account.changePassword=更改密码
|
account.changePassword=更改密码
|
||||||
account.confirmNewPassword=确认新密码
|
account.confirmNewPassword=确认新密码
|
||||||
account.signOut=退出登录
|
account.signOut=退出登录
|
||||||
account.yourApiKey=您的 API 密钥
|
account.yourApiKey=您的API密钥
|
||||||
account.syncTitle=将浏览器设置与账户同步
|
account.syncTitle=将浏览器设置与账户同步
|
||||||
account.settingsCompare=设置比较:
|
account.settingsCompare=设置比较:
|
||||||
account.property=属性
|
account.property=属性
|
||||||
account.webBrowserSettings=Web 浏览器设置
|
account.webBrowserSettings=Web浏览器设置
|
||||||
account.syncToBrowser=同步账户 -> 浏览器
|
account.syncToBrowser=同步账户 -> 浏览器
|
||||||
account.syncToAccount=同步账户 <- 浏览器
|
account.syncToAccount=同步账户 <- 浏览器
|
||||||
|
|
||||||
@@ -173,19 +175,38 @@ adminUserSettings.header=管理员用户控制设置
|
|||||||
adminUserSettings.admin=管理员
|
adminUserSettings.admin=管理员
|
||||||
adminUserSettings.user=用户
|
adminUserSettings.user=用户
|
||||||
adminUserSettings.addUser=添加新用户
|
adminUserSettings.addUser=添加新用户
|
||||||
|
adminUserSettings.deleteUser=删除用户
|
||||||
|
adminUserSettings.confirmDeleteUser=确认删除该用户?
|
||||||
adminUserSettings.usernameInfo=用户名只能包含字母、数字和以下特殊字符@._+-,或者必须是有效的电子邮件地址。
|
adminUserSettings.usernameInfo=用户名只能包含字母、数字和以下特殊字符@._+-,或者必须是有效的电子邮件地址。
|
||||||
adminUserSettings.roles=角色
|
adminUserSettings.roles=角色
|
||||||
adminUserSettings.role=角色
|
adminUserSettings.role=角色
|
||||||
adminUserSettings.actions=操作
|
adminUserSettings.actions=操作
|
||||||
adminUserSettings.apiUser=受限制的 API 用户
|
adminUserSettings.apiUser=受限制的API用户
|
||||||
adminUserSettings.extraApiUser=额外受限制的 API 用户
|
adminUserSettings.extraApiUser=额外受限制的API用户
|
||||||
adminUserSettings.webOnlyUser=仅限 Web 用户
|
adminUserSettings.webOnlyUser=仅限Web用户
|
||||||
adminUserSettings.demoUser=演示用户(无自定义设置)
|
adminUserSettings.demoUser=演示用户(无自定义设置)
|
||||||
adminUserSettings.internalApiUser=内部API用户
|
adminUserSettings.internalApiUser=内部API用户
|
||||||
adminUserSettings.forceChange=强制用户在登录时更改用户名/密码
|
adminUserSettings.forceChange=强制用户在登录时更改用户名/密码
|
||||||
adminUserSettings.submit=保存用户
|
adminUserSettings.submit=保存用户
|
||||||
adminUserSettings.changeUserRole=更改用户角色
|
adminUserSettings.changeUserRole=更改用户角色
|
||||||
adminUserSettings.authenticated=Authenticated
|
adminUserSettings.authenticated=已验证
|
||||||
|
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
#############
|
#############
|
||||||
# HOME-PAGE #
|
# HOME-PAGE #
|
||||||
@@ -328,13 +349,13 @@ home.compare.title=比较
|
|||||||
home.compare.desc=比较并显示两个PDF文档之间的差异
|
home.compare.desc=比较并显示两个PDF文档之间的差异
|
||||||
compare.tags=区分、对比、更改、分析
|
compare.tags=区分、对比、更改、分析
|
||||||
|
|
||||||
home.certSign.title=使用证书签署
|
home.certSign.title=使用证书签名
|
||||||
home.certSign.desc=使用证书/密钥(PEM/P12)对PDF进行签署
|
home.certSign.desc=使用证书/密钥(PEM/P12)对PDF进行签名
|
||||||
certSign.tags=身份验证、PEM、P12、官方、加密
|
certSign.tags=身份验证、PEM、P12、官方、加密
|
||||||
|
|
||||||
home.removeCertSign.title=Remove Certificate Sign
|
home.removeCertSign.title=移除证书签名
|
||||||
home.removeCertSign.desc=Remove certificate signature from PDF
|
home.removeCertSign.desc=移除PDF的证书签名
|
||||||
removeCertSign.tags=authenticate,PEM,P12,official,decrypt
|
removeCertSign.tags=身份验证、PEM、P12、官方、加密
|
||||||
|
|
||||||
home.pageLayout.title=多页布局
|
home.pageLayout.title=多页布局
|
||||||
home.pageLayout.desc=将PDF文档的多个页面合并成一页
|
home.pageLayout.desc=将PDF文档的多个页面合并成一页
|
||||||
@@ -455,13 +476,13 @@ login.invalid=用户名或密码无效。
|
|||||||
login.locked=您的账户已被锁定。
|
login.locked=您的账户已被锁定。
|
||||||
login.signinTitle=请登录
|
login.signinTitle=请登录
|
||||||
login.ssoSignIn=通过单点登录登录
|
login.ssoSignIn=通过单点登录登录
|
||||||
login.oauth2AutoCreateDisabled=OAUTH2自动创建用户已禁用
|
login.oauth2AutoCreateDisabled=OAuth2自动创建用户已禁用
|
||||||
login.oauth2RequestNotFound=Authorization request not found
|
login.oauth2RequestNotFound=找不到验证请求
|
||||||
login.oauth2InvalidUserInfoResponse=Invalid User Info Response
|
login.oauth2InvalidUserInfoResponse=无效的用户信息响应
|
||||||
login.oauth2invalidRequest=Invalid Request
|
login.oauth2invalidRequest=无效请求
|
||||||
login.oauth2AccessDenied=Access Denied
|
login.oauth2AccessDenied=拒绝访问
|
||||||
login.oauth2InvalidTokenResponse=Invalid Token Response
|
login.oauth2InvalidTokenResponse=无效的Token响应
|
||||||
login.oauth2InvalidIdToken=Invalid Id Token
|
login.oauth2InvalidIdToken=无效的Token
|
||||||
|
|
||||||
|
|
||||||
#auto-redact
|
#auto-redact
|
||||||
@@ -478,15 +499,15 @@ autoRedact.submitButton=提交
|
|||||||
|
|
||||||
|
|
||||||
#showJS
|
#showJS
|
||||||
showJS.title=显示 JavaScript
|
showJS.title=显示JavaScript
|
||||||
showJS.header=显示 JavaScript
|
showJS.header=显示JavaScript
|
||||||
showJS.downloadJS=下载 JavaScript
|
showJS.downloadJS=下载JavaScript
|
||||||
showJS.submit=显示
|
showJS.submit=显示
|
||||||
|
|
||||||
|
|
||||||
#pdfToSinglePage
|
#pdfToSinglePage
|
||||||
pdfToSinglePage.title=PDF转为单页
|
pdfToSinglePage.title=PDF转单页
|
||||||
pdfToSinglePage.header=PDF转为单页
|
pdfToSinglePage.header=将PDF转换为单页
|
||||||
pdfToSinglePage.submit=转为单页
|
pdfToSinglePage.submit=转为单页
|
||||||
|
|
||||||
|
|
||||||
@@ -494,7 +515,7 @@ pdfToSinglePage.submit=转为单页
|
|||||||
pageExtracter.title=提取页面
|
pageExtracter.title=提取页面
|
||||||
pageExtracter.header=提取页面
|
pageExtracter.header=提取页面
|
||||||
pageExtracter.submit=提取
|
pageExtracter.submit=提取
|
||||||
pageExtracter.placeholder=(例如 1,2,8 或 4,7,12-16 或 2n-1)
|
pageExtracter.placeholder=(例如:1,2,8 或 4,7,12-16 或 2n-1)
|
||||||
|
|
||||||
|
|
||||||
#getPdfInfo
|
#getPdfInfo
|
||||||
@@ -506,7 +527,7 @@ getPdfInfo.downloadJson=下载JSON
|
|||||||
|
|
||||||
#markdown-to-pdf
|
#markdown-to-pdf
|
||||||
MarkdownToPDF.title=Markdown转PDF
|
MarkdownToPDF.title=Markdown转PDF
|
||||||
MarkdownToPDF.header=Markdown转PDF
|
MarkdownToPDF.header=将Markdown转换为PDF
|
||||||
MarkdownToPDF.submit=转换
|
MarkdownToPDF.submit=转换
|
||||||
MarkdownToPDF.help=正在努力中
|
MarkdownToPDF.help=正在努力中
|
||||||
MarkdownToPDF.credit=此服务使用WeasyPrint进行文件转换。
|
MarkdownToPDF.credit=此服务使用WeasyPrint进行文件转换。
|
||||||
@@ -515,14 +536,14 @@ MarkdownToPDF.credit=此服务使用WeasyPrint进行文件转换。
|
|||||||
|
|
||||||
#url-to-pdf
|
#url-to-pdf
|
||||||
URLToPDF.title=URL转PDF
|
URLToPDF.title=URL转PDF
|
||||||
URLToPDF.header=URL转PDF
|
URLToPDF.header=将URL转换为PDF
|
||||||
URLToPDF.submit=转换
|
URLToPDF.submit=转换
|
||||||
URLToPDF.credit=此服务使用WeasyPrint进行文件转换。
|
URLToPDF.credit=此服务使用WeasyPrint进行文件转换。
|
||||||
|
|
||||||
|
|
||||||
#html-to-pdf
|
#html-to-pdf
|
||||||
HTMLToPDF.title=HTML转PDF
|
HTMLToPDF.title=HTML转PDF
|
||||||
HTMLToPDF.header=HTML转PDF
|
HTMLToPDF.header=将HTML转换为PDF
|
||||||
HTMLToPDF.help=接受HTML文件和包含所需的html/css/images等的ZIP文件
|
HTMLToPDF.help=接受HTML文件和包含所需的html/css/images等的ZIP文件
|
||||||
HTMLToPDF.submit=转换
|
HTMLToPDF.submit=转换
|
||||||
HTMLToPDF.credit=此服务使用WeasyPrint进行文件转换。
|
HTMLToPDF.credit=此服务使用WeasyPrint进行文件转换。
|
||||||
@@ -535,7 +556,7 @@ HTMLToPDF.marginLeft=页面左上边距-以毫米为单位(填空则使用默
|
|||||||
HTMLToPDF.marginRight=页面右边距-以毫米为单位(填空则使用默认值)
|
HTMLToPDF.marginRight=页面右边距-以毫米为单位(填空则使用默认值)
|
||||||
HTMLToPDF.printBackground=页面背景渲染
|
HTMLToPDF.printBackground=页面背景渲染
|
||||||
HTMLToPDF.defaultHeader=启用默认页头(文件名称和页码)
|
HTMLToPDF.defaultHeader=启用默认页头(文件名称和页码)
|
||||||
HTMLToPDF.cssMediaType=更换页面的CSS media type.
|
HTMLToPDF.cssMediaType=更换页面的CSS媒体类型。
|
||||||
HTMLToPDF.none=无
|
HTMLToPDF.none=无
|
||||||
HTMLToPDF.print=打印
|
HTMLToPDF.print=打印
|
||||||
HTMLToPDF.screen=屏幕
|
HTMLToPDF.screen=屏幕
|
||||||
@@ -552,8 +573,8 @@ AddStampRequest.fontSize=字体/图片大小
|
|||||||
AddStampRequest.rotation=旋转角度
|
AddStampRequest.rotation=旋转角度
|
||||||
AddStampRequest.opacity=透明度
|
AddStampRequest.opacity=透明度
|
||||||
AddStampRequest.position=定位
|
AddStampRequest.position=定位
|
||||||
AddStampRequest.overrideX=覆盖 X 坐标
|
AddStampRequest.overrideX=覆盖X坐标
|
||||||
AddStampRequest.overrideY=覆盖 Y 坐标
|
AddStampRequest.overrideY=覆盖Y坐标
|
||||||
AddStampRequest.customMargin=自定义外边距
|
AddStampRequest.customMargin=自定义外边距
|
||||||
AddStampRequest.customColor=自定义文本颜色
|
AddStampRequest.customColor=自定义文本颜色
|
||||||
AddStampRequest.submit=提交
|
AddStampRequest.submit=提交
|
||||||
@@ -643,27 +664,27 @@ scalePages.submit=提交
|
|||||||
|
|
||||||
#certSign
|
#certSign
|
||||||
certSign.title=证书签名
|
certSign.title=证书签名
|
||||||
certSign.header=使用您的证书签署 PDF(进行中)
|
certSign.header=使用您的证书签名PDF(进行中)
|
||||||
certSign.selectPDF=选择要签名的 PDF 文件:
|
certSign.selectPDF=选择要签名的PDF文件:
|
||||||
certSign.jksNote=注意:如果您的证书类型未在下面列出,请使用 keytool 命令行工具将其转换为 Java Keystore (.jks) 文件。 然后,选择下面的 .jks 文件选项。
|
certSign.jksNote=注意:如果您的证书类型未在下面列出,请使用keytool命令行工具将其转换为Java Keystore(.jks)文件。 然后,选择下面的.jks文件选项。
|
||||||
certSign.selectKey=选择您的私钥文件(PKCS#8 格式,可以是 .pem 或 .der):
|
certSign.selectKey=选择您的私钥文件(PKCS#8格式,可以是.pem或.der):
|
||||||
certSign.selectCert=选择您的证书文件(X.509 格式,可以是 .pem 或 .der):
|
certSign.selectCert=选择您的证书文件(X.509格式,可以是.pem或.der):
|
||||||
certSign.selectP12=选择您的 PKCS#12 密钥库文件(.p12 或 .pfx)(可选,如果提供,它应该包含您的私钥和证书):
|
certSign.selectP12=选择您的PKCS#12密钥库文件(.p12或.pfx)(可选,如果提供,它应该包含您的私钥和证书):
|
||||||
certSign.selectJKS=选择你的 Java Keystore 文件 (.jks 或 .keystore):
|
certSign.selectJKS=选择你的Java Keystore文件 (.jks或.keystore):
|
||||||
certSign.certType=证书类型
|
certSign.certType=证书类型
|
||||||
certSign.password=输入您的密钥库或私钥密码(如果有):
|
certSign.password=输入您的密钥库或私钥密码(如果有):
|
||||||
certSign.showSig=显示签名
|
certSign.showSig=显示签名
|
||||||
certSign.reason=原因
|
certSign.reason=原因
|
||||||
certSign.location=位置
|
certSign.location=位置
|
||||||
certSign.name=名称
|
certSign.name=名称
|
||||||
certSign.submit=签署 PDF
|
certSign.submit=给PDF签名
|
||||||
|
|
||||||
|
|
||||||
#removeCertSign
|
#removeCertSign
|
||||||
removeCertSign.title=Remove Certificate Signature
|
removeCertSign.title=移除证书签名
|
||||||
removeCertSign.header=Remove the digital certificate from the PDF
|
removeCertSign.header=移除PDF的证书签名
|
||||||
removeCertSign.selectPDF=Select a PDF file:
|
removeCertSign.selectPDF=选择PDF文件:
|
||||||
removeCertSign.submit=Remove Signature
|
removeCertSign.submit=移除签名
|
||||||
|
|
||||||
|
|
||||||
#removeBlanks
|
#removeBlanks
|
||||||
@@ -684,7 +705,9 @@ removeAnnotations.submit=删除
|
|||||||
|
|
||||||
#compare
|
#compare
|
||||||
compare.title=比较
|
compare.title=比较
|
||||||
compare.header=比较 PDF
|
compare.header=比较PDF
|
||||||
|
compare.highlightColor.1=Highlight Color 1:
|
||||||
|
compare.highlightColor.2=Highlight Color 2:
|
||||||
compare.document.1=文档 1
|
compare.document.1=文档 1
|
||||||
compare.document.2=文档 2
|
compare.document.2=文档 2
|
||||||
compare.submit=比较
|
compare.submit=比较
|
||||||
@@ -714,14 +737,14 @@ sign.add=添加
|
|||||||
|
|
||||||
#repair
|
#repair
|
||||||
repair.title=修复
|
repair.title=修复
|
||||||
repair.header=修复 PDF
|
repair.header=修复PDF
|
||||||
repair.submit=修复
|
repair.submit=修复
|
||||||
|
|
||||||
|
|
||||||
#flatten
|
#flatten
|
||||||
flatten.title=展平
|
flatten.title=展平
|
||||||
flatten.header=展平 PDF
|
flatten.header=展平 PDF
|
||||||
flatten.flattenOnlyForms=Flatten only forms
|
flatten.flattenOnlyForms=仅展平表格
|
||||||
flatten.submit=展平
|
flatten.submit=展平
|
||||||
|
|
||||||
|
|
||||||
@@ -748,7 +771,7 @@ ocr.selectText.4=清理页面,降低OCR在噪点中识别到文本的可能。
|
|||||||
ocr.selectText.5=清洁页面,降低OCR在噪点中识别到文本的可能,保持输出的清洁。
|
ocr.selectText.5=清洁页面,降低OCR在噪点中识别到文本的可能,保持输出的清洁。
|
||||||
ocr.selectText.6=忽略有交互式文本的页面,只对有图像的页面进行OCR。
|
ocr.selectText.6=忽略有交互式文本的页面,只对有图像的页面进行OCR。
|
||||||
ocr.selectText.7=强制OCR,将OCR每个页面,删除所有的原始文本元素。
|
ocr.selectText.7=强制OCR,将OCR每个页面,删除所有的原始文本元素。
|
||||||
ocr.selectText.8=Normal (如果PDF包含文本,将出现错误)
|
ocr.selectText.8=正常 (如果PDF包含文本,将出现错误)
|
||||||
ocr.selectText.9=额外设置
|
ocr.selectText.9=额外设置
|
||||||
ocr.selectText.10=OCR模式
|
ocr.selectText.10=OCR模式
|
||||||
ocr.selectText.11=OCR后移除图像(移除所有图像,只有在转换步骤中才有用)。
|
ocr.selectText.11=OCR后移除图像(移除所有图像,只有在转换步骤中才有用)。
|
||||||
@@ -769,7 +792,7 @@ extractImages.submit=提取
|
|||||||
fileToPDF.title=文件转换为PDF
|
fileToPDF.title=文件转换为PDF
|
||||||
fileToPDF.header=将任何文件转换为PDF。
|
fileToPDF.header=将任何文件转换为PDF。
|
||||||
fileToPDF.credit=此服务使用LibreOffice和Unoconv进行文件转换。
|
fileToPDF.credit=此服务使用LibreOffice和Unoconv进行文件转换。
|
||||||
fileToPDF.supportedFileTypesInfo=Supported File types
|
fileToPDF.supportedFileTypesInfo=支持的文件类型
|
||||||
fileToPDF.supportedFileTypes=支持的文件类型应该包括以下几种,但是,对于支持的格式的完整更新列表,请参考LibreOffice文档。
|
fileToPDF.supportedFileTypes=支持的文件类型应该包括以下几种,但是,对于支持的格式的完整更新列表,请参考LibreOffice文档。
|
||||||
fileToPDF.submit=转换为 PDF
|
fileToPDF.submit=转换为 PDF
|
||||||
|
|
||||||
@@ -777,12 +800,12 @@ fileToPDF.submit=转换为 PDF
|
|||||||
#compress
|
#compress
|
||||||
compress.title=压缩
|
compress.title=压缩
|
||||||
compress.header=压缩PDF
|
compress.header=压缩PDF
|
||||||
compress.credit=此服务使用 Ghostscript 进行 PDF 压缩/优化。
|
compress.credit=此服务使用Ghostscript进行PDF压缩/优化。
|
||||||
compress.selectText.1=手动模式 - 从 1 到 4
|
compress.selectText.1=手动模式 - 从 1 到 4
|
||||||
compress.selectText.2=优化级别:
|
compress.selectText.2=优化级别:
|
||||||
compress.selectText.3=4(文本图像很糟糕)
|
compress.selectText.3=4(文本图像很糟糕)
|
||||||
compress.selectText.4=自动模式 - 自动调整质量以获得精确大小的 PDF
|
compress.selectText.4=自动模式 - 自动调整质量以获得精确大小的PDF
|
||||||
compress.selectText.5=预期 PDF 大小(例如 25MB、10.8MB、25KB)
|
compress.selectText.5=预期PDF大小(例如:25MB、10.8MB、25KB)
|
||||||
compress.submit=压缩
|
compress.submit=压缩
|
||||||
|
|
||||||
|
|
||||||
@@ -799,6 +822,7 @@ merge.title=合并
|
|||||||
merge.header=合并多个PDF(2个以上)。
|
merge.header=合并多个PDF(2个以上)。
|
||||||
merge.sortByName=按名称排序
|
merge.sortByName=按名称排序
|
||||||
merge.sortByDate=按日期排序
|
merge.sortByDate=按日期排序
|
||||||
|
merge.removeCertSign=删除合并文件的数字签名吗?
|
||||||
merge.submit=合并
|
merge.submit=合并
|
||||||
|
|
||||||
|
|
||||||
@@ -816,7 +840,8 @@ pdfOrganiser.mode.6=奇偶拆分
|
|||||||
pdfOrganiser.mode.7=删除第一页
|
pdfOrganiser.mode.7=删除第一页
|
||||||
pdfOrganiser.mode.8=删除最后一页
|
pdfOrganiser.mode.8=删除最后一页
|
||||||
pdfOrganiser.mode.9=删除第一页和最后一页
|
pdfOrganiser.mode.9=删除第一页和最后一页
|
||||||
pdfOrganiser.placeholder=(例如 1,3,2 或 4-8,2,10-12 或 2n-1)
|
pdfOrganiser.mode.10=奇偶合并
|
||||||
|
pdfOrganiser.placeholder=(例如:1,3,2 或 4-8,2,10-12 或 2n-1)
|
||||||
|
|
||||||
|
|
||||||
#multiTool
|
#multiTool
|
||||||
@@ -833,7 +858,7 @@ pageRemover.title=删除页面
|
|||||||
pageRemover.header=PDF页面移除器
|
pageRemover.header=PDF页面移除器
|
||||||
pageRemover.pagesToDelete=要删除的页面(输入一个用逗号分隔的页码列表):
|
pageRemover.pagesToDelete=要删除的页面(输入一个用逗号分隔的页码列表):
|
||||||
pageRemover.submit=删除页面
|
pageRemover.submit=删除页面
|
||||||
pageRemover.placeholder=(例如 1,2,6 或 1-10,15-30)
|
pageRemover.placeholder=(例如:1,2,6 或 1-10,15-30)
|
||||||
|
|
||||||
|
|
||||||
#rotate
|
#rotate
|
||||||
@@ -860,7 +885,7 @@ split.submit=拆分
|
|||||||
|
|
||||||
#merge
|
#merge
|
||||||
imageToPDF.title=图片转PDF
|
imageToPDF.title=图片转PDF
|
||||||
imageToPDF.header=图像转为PDF
|
imageToPDF.header=将图片转换为PDF
|
||||||
imageToPDF.submit=转换
|
imageToPDF.submit=转换
|
||||||
imageToPDF.selectLabel=图片适应选项
|
imageToPDF.selectLabel=图片适应选项
|
||||||
imageToPDF.fillPage=填充页面
|
imageToPDF.fillPage=填充页面
|
||||||
@@ -874,7 +899,7 @@ imageToPDF.selectText.5=转换为独立的PDF文件
|
|||||||
|
|
||||||
#pdfToImage
|
#pdfToImage
|
||||||
pdfToImage.title=PDF转图片
|
pdfToImage.title=PDF转图片
|
||||||
pdfToImage.header=PDF转图片
|
pdfToImage.header=将PDF转换为图片
|
||||||
pdfToImage.selectText=图像格式
|
pdfToImage.selectText=图像格式
|
||||||
pdfToImage.singleOrMultiple=图像结果类型
|
pdfToImage.singleOrMultiple=图像结果类型
|
||||||
pdfToImage.single=单张图片
|
pdfToImage.single=单张图片
|
||||||
@@ -970,55 +995,55 @@ changeMetadata.submit=更改
|
|||||||
|
|
||||||
|
|
||||||
#pdfToPDFA
|
#pdfToPDFA
|
||||||
pdfToPDFA.title=将PDF转换为PDF/A
|
pdfToPDFA.title=PDF转PDF/A
|
||||||
pdfToPDFA.header=PDF转换为PDF/A
|
pdfToPDFA.header=将PDF转换为PDF/A
|
||||||
pdfToPDFA.credit=此服务使用OCRmyPDF进行PDF/A转换
|
pdfToPDFA.credit=此服务使用OCRmyPDF进行PDF/A转换
|
||||||
pdfToPDFA.submit=转换
|
pdfToPDFA.submit=转换
|
||||||
pdfToPDFA.tip=目前不支持上传多个
|
pdfToPDFA.tip=目前不支持上传多个
|
||||||
pdfToPDFA.outputFormat=Output format
|
pdfToPDFA.outputFormat=输出格式
|
||||||
pdfToPDFA.pdfWithDigitalSignature=The PDF contains a digital signature. This will be removed in the next step.
|
pdfToPDFA.pdfWithDigitalSignature=该PDF包含数字签名,下一步将移除该签名。
|
||||||
|
|
||||||
|
|
||||||
#PDFToWord
|
#PDFToWord
|
||||||
PDFToWord.title=PDF to Word
|
PDFToWord.title=PDF转Word
|
||||||
PDFToWord.header=将PDF转换成Word
|
PDFToWord.header=将PDF转换为Word
|
||||||
PDFToWord.selectText.1=输出文件格式
|
PDFToWord.selectText.1=输出文件格式
|
||||||
PDFToWord.credit=此服务使用LibreOffice进行文件转换。
|
PDFToWord.credit=此服务使用LibreOffice进行文件转换。
|
||||||
PDFToWord.submit=转换
|
PDFToWord.submit=转换
|
||||||
|
|
||||||
|
|
||||||
#PDFToPresentation
|
#PDFToPresentation
|
||||||
PDFToPresentation.title=PDF转换为演示文稿
|
PDFToPresentation.title=PDF转演示文稿
|
||||||
PDFToPresentation.header=将PDF转为演示文稿
|
PDFToPresentation.header=将PDF转换为演示文稿
|
||||||
PDFToPresentation.selectText.1=输出文件格式
|
PDFToPresentation.selectText.1=输出文件格式
|
||||||
PDFToPresentation.credit=此服务使用LibreOffice进行文件转换。
|
PDFToPresentation.credit=此服务使用LibreOffice进行文件转换。
|
||||||
PDFToPresentation.submit=转换
|
PDFToPresentation.submit=转换
|
||||||
|
|
||||||
|
|
||||||
#PDFToText
|
#PDFToText
|
||||||
PDFToText.title=PDF to RTF (Text)
|
PDFToText.title=PDF转文本/RTF
|
||||||
PDFToText.header=将PDF转换成文本/RTF
|
PDFToText.header=将PDF转换为文本/RTF
|
||||||
PDFToText.selectText.1=输出文件格式
|
PDFToText.selectText.1=输出文件格式
|
||||||
PDFToText.credit=此服务使用LibreOffice进行文件转换。
|
PDFToText.credit=此服务使用LibreOffice进行文件转换。
|
||||||
PDFToText.submit=转换
|
PDFToText.submit=转换
|
||||||
|
|
||||||
|
|
||||||
#PDFToHTML
|
#PDFToHTML
|
||||||
PDFToHTML.title=PDF To HTML
|
PDFToHTML.title=PDF转HTML
|
||||||
PDFToHTML.header=将PDF转换成HTML
|
PDFToHTML.header=将PDF转换为HTML
|
||||||
PDFToHTML.credit=此服务使用pdftohtml进行文件转换。
|
PDFToHTML.credit=此服务使用pdftohtml进行文件转换。
|
||||||
PDFToHTML.submit=转换
|
PDFToHTML.submit=转换
|
||||||
|
|
||||||
|
|
||||||
#PDFToXML
|
#PDFToXML
|
||||||
PDFToXML.title=PDF To XML
|
PDFToXML.title=PDF转XML
|
||||||
PDFToXML.header=将PDF转换为XML
|
PDFToXML.header=将PDF转换为XML
|
||||||
PDFToXML.credit=此服务使用LibreOffice进行文件转换。
|
PDFToXML.credit=此服务使用LibreOffice进行文件转换。
|
||||||
PDFToXML.submit=转换
|
PDFToXML.submit=转换
|
||||||
|
|
||||||
#PDFToCSV
|
#PDFToCSV
|
||||||
PDFToCSV.title=PDF To CSV
|
PDFToCSV.title=PDF转CSV
|
||||||
PDFToCSV.header=将 PDF 转换为 CSV
|
PDFToCSV.header=将PDF转换为CSV
|
||||||
PDFToCSV.prompt=选择需要提取表格的页面
|
PDFToCSV.prompt=选择需要提取表格的页面
|
||||||
PDFToCSV.submit=提取
|
PDFToCSV.submit=提取
|
||||||
|
|
||||||
@@ -1030,7 +1055,7 @@ split-by-size-or-count.type.size=按照大小
|
|||||||
split-by-size-or-count.type.pageCount=按照页数
|
split-by-size-or-count.type.pageCount=按照页数
|
||||||
split-by-size-or-count.type.docCount=按照文档数
|
split-by-size-or-count.type.docCount=按照文档数
|
||||||
split-by-size-or-count.value.label=输入数值
|
split-by-size-or-count.value.label=输入数值
|
||||||
split-by-size-or-count.value.placeholder=输入大小(例如,2MB或3KB)或数目(例如,5)
|
split-by-size-or-count.value.placeholder=输入大小(例如:2MB或3KB)或数目(例如:5)
|
||||||
split-by-size-or-count.submit=提交
|
split-by-size-or-count.submit=提交
|
||||||
|
|
||||||
|
|
||||||
@@ -1043,7 +1068,7 @@ overlay-pdfs.mode.sequential=按顺序叠加
|
|||||||
overlay-pdfs.mode.interleaved=交错叠加
|
overlay-pdfs.mode.interleaved=交错叠加
|
||||||
overlay-pdfs.mode.fixedRepeat=固定重复叠加
|
overlay-pdfs.mode.fixedRepeat=固定重复叠加
|
||||||
overlay-pdfs.counts.label=叠加次数(仅限固定重复叠加模式)
|
overlay-pdfs.counts.label=叠加次数(仅限固定重复叠加模式)
|
||||||
overlay-pdfs.counts.placeholder=输入用逗号分隔的次数(例如,2,3,1)
|
overlay-pdfs.counts.placeholder=输入用逗号分隔的次数(例如:2,3,1)
|
||||||
overlay-pdfs.position.label=选择叠加位置
|
overlay-pdfs.position.label=选择叠加位置
|
||||||
overlay-pdfs.position.foreground=前面(上面)
|
overlay-pdfs.position.foreground=前面(上面)
|
||||||
overlay-pdfs.position.background=后面(下面)
|
overlay-pdfs.position.background=后面(下面)
|
||||||
@@ -1062,11 +1087,11 @@ split-by-sections.merge=是否合并为一个pdf
|
|||||||
|
|
||||||
|
|
||||||
#printFile
|
#printFile
|
||||||
printFile.title=Print File
|
printFile.title=打印文件
|
||||||
printFile.header=Print File to Printer
|
printFile.header=使用打印机打印文件
|
||||||
printFile.selectText.1=Select File to Print
|
printFile.selectText.1=选择要打印的文件
|
||||||
printFile.selectText.2=Enter Printer Name
|
printFile.selectText.2=输入打印机名称
|
||||||
printFile.submit=Print
|
printFile.submit=打印
|
||||||
|
|
||||||
|
|
||||||
#licenses
|
#licenses
|
||||||
@@ -1077,6 +1102,15 @@ licenses.module=模块
|
|||||||
licenses.version=版本
|
licenses.version=版本
|
||||||
licenses.license=许可证
|
licenses.license=许可证
|
||||||
|
|
||||||
|
#survey
|
||||||
|
survey.nav=调查
|
||||||
|
survey.title=Stirling-PDF调查
|
||||||
|
survey.description=Stirling-PDF没有跟踪器,所以我们希望听取用户的意见来改进Stirling-PDF!
|
||||||
|
survey.please=请考虑参加我们的调查!
|
||||||
|
survey.disabled=(调查弹出窗口将在后续更新中被禁用,但可在页脚处查看)
|
||||||
|
survey.button=参与调查
|
||||||
|
survey.dontShowAgain=不再显示
|
||||||
|
|
||||||
|
|
||||||
#error
|
#error
|
||||||
error.sorry=对此问题感到抱歉!
|
error.sorry=对此问题感到抱歉!
|
||||||
|
|||||||
@@ -54,20 +54,21 @@ notAuthenticatedMessage=使用者未認證。
|
|||||||
userNotFoundMessage=找不到使用者。
|
userNotFoundMessage=找不到使用者。
|
||||||
incorrectPasswordMessage=目前密碼不正確。
|
incorrectPasswordMessage=目前密碼不正確。
|
||||||
usernameExistsMessage=新使用者名稱已存在。
|
usernameExistsMessage=新使用者名稱已存在。
|
||||||
invalidUsernameMessage=使用者名稱無效,使用者名稱只能包含字母、數字和以下特殊字元@._+- 或必須是有效的電子郵件地址。
|
invalidUsernameMessage=使用者名稱無效,使用者名稱只能包含字母、數字和以下特殊字元 @._+- 或必須是有效的電子郵件地址。
|
||||||
|
confirmPasswordErrorMessage=輸入的密碼必需和確認密碼相同。
|
||||||
deleteCurrentUserMessage=無法刪除目前登錄的使用者。
|
deleteCurrentUserMessage=無法刪除目前登錄的使用者。
|
||||||
deleteUsernameExistsMessage=使用者名不存在,無法刪除。
|
deleteUsernameExistsMessage=使用者名不存在,無法刪除。
|
||||||
downgradeCurrentUserMessage=無法降級目前使用者的角色
|
downgradeCurrentUserMessage=無法降級目前使用者的角色
|
||||||
downgradeCurrentUserLongMessage=無法降級目前使用者的角色。因此,不會顯示目前的使用者。
|
downgradeCurrentUserLongMessage=無法降級目前使用者的角色。因此,不會顯示目前的使用者。
|
||||||
userAlreadyExistsOAuthMessage=The user already exists as an OAuth2 user.
|
userAlreadyExistsOAuthMessage=該使用者已於 OAuth2 註冊。
|
||||||
userAlreadyExistsWebMessage=The user already exists as an web user.
|
userAlreadyExistsWebMessage=該使用者已於網頁註冊。
|
||||||
error=錯誤
|
error=錯誤
|
||||||
oops=哎呀!
|
oops=哎呀!
|
||||||
help=幫助
|
help=幫助
|
||||||
goHomepage=前往首頁
|
goHomepage=前往首頁
|
||||||
joinDiscord=加入我們的Discord服務器
|
joinDiscord=加入我們的 Discord 服務器
|
||||||
seeDockerHub=查看Docker Hub
|
seeDockerHub=查看 Docker Hub
|
||||||
visitGithub=訪問Github存儲庫
|
visitGithub=訪問 GitHub 存儲庫
|
||||||
donate=捐贈
|
donate=捐贈
|
||||||
color=顏色
|
color=顏色
|
||||||
sponsor=贊助
|
sponsor=贊助
|
||||||
@@ -85,6 +86,7 @@ pipeline.defaultOption=自訂
|
|||||||
pipeline.submitButton=送出
|
pipeline.submitButton=送出
|
||||||
pipeline.help=管道説明
|
pipeline.help=管道説明
|
||||||
pipeline.scanHelp=資料夾掃描説明
|
pipeline.scanHelp=資料夾掃描説明
|
||||||
|
pipeline.deletePrompt=確定刪除該管道?
|
||||||
|
|
||||||
######################
|
######################
|
||||||
# Pipeline Options #
|
# Pipeline Options #
|
||||||
@@ -105,25 +107,25 @@ pipelineOptions.validateButton=驗證
|
|||||||
#############
|
#############
|
||||||
# NAVBAR #
|
# NAVBAR #
|
||||||
#############
|
#############
|
||||||
navbar.favorite=Favorites
|
navbar.favorite=我的最愛
|
||||||
navbar.darkmode=暗黑模式
|
navbar.darkmode=暗黑模式
|
||||||
navbar.language=Languages
|
navbar.language=語言
|
||||||
navbar.settings=設定
|
navbar.settings=設定
|
||||||
navbar.allTools=Tools
|
navbar.allTools=工具
|
||||||
navbar.multiTool=Multi Tools
|
navbar.multiTool=萬用工具
|
||||||
navbar.sections.organize=Organize
|
navbar.sections.organize=組織
|
||||||
navbar.sections.convertTo=Convert to PDF
|
navbar.sections.convertTo=轉換為 PDF
|
||||||
navbar.sections.convertFrom=Convert from PDF
|
navbar.sections.convertFrom=從 PDF 轉換
|
||||||
navbar.sections.security=Sign & Security
|
navbar.sections.security=簽章與安全性
|
||||||
navbar.sections.advance=Advanced
|
navbar.sections.advance=進階
|
||||||
navbar.sections.edit=View & Edit
|
navbar.sections.edit=檢視與編輯
|
||||||
|
|
||||||
#############
|
#############
|
||||||
# SETTINGS #
|
# SETTINGS #
|
||||||
#############
|
#############
|
||||||
settings.title=設定
|
settings.title=設定
|
||||||
settings.update=有更新可用
|
settings.update=有更新可用
|
||||||
settings.updateAvailable={0} is the current installed version. A new version ({1}) is available.
|
settings.updateAvailable=當前版本為 {0}。歡迎您更新至最新版 ({1})。。
|
||||||
settings.appVersion=應用版本:
|
settings.appVersion=應用版本:
|
||||||
settings.downloadOption.title=選擇下載選項(對於單一檔案非壓縮下載):
|
settings.downloadOption.title=選擇下載選項(對於單一檔案非壓縮下載):
|
||||||
settings.downloadOption.1=在同一視窗中開啟
|
settings.downloadOption.1=在同一視窗中開啟
|
||||||
@@ -132,9 +134,9 @@ settings.downloadOption.3=下載檔案
|
|||||||
settings.zipThreshold=當下載的檔案數量超過時,壓縮檔案
|
settings.zipThreshold=當下載的檔案數量超過時,壓縮檔案
|
||||||
settings.signOut=登出
|
settings.signOut=登出
|
||||||
settings.accountSettings=帳戶設定
|
settings.accountSettings=帳戶設定
|
||||||
settings.bored.help=Enables easter egg game
|
settings.bored.help=啟用彩蛋
|
||||||
settings.cacheInputs.name=Save form inputs
|
settings.cacheInputs.name=輸入檔案下載
|
||||||
settings.cacheInputs.help=Enable to store previously used inputs for future runs
|
settings.cacheInputs.help=開啟記住先前的輸入,做為日後使用
|
||||||
|
|
||||||
changeCreds.title=變更憑證
|
changeCreds.title=變更憑證
|
||||||
changeCreds.header=更新您的帳戶詳細資訊
|
changeCreds.header=更新您的帳戶詳細資訊
|
||||||
@@ -164,8 +166,8 @@ account.syncTitle=將瀏覽器設定與帳戶同步
|
|||||||
account.settingsCompare=設定比較:
|
account.settingsCompare=設定比較:
|
||||||
account.property=屬性
|
account.property=屬性
|
||||||
account.webBrowserSettings=網頁瀏覽器設定
|
account.webBrowserSettings=網頁瀏覽器設定
|
||||||
account.syncToBrowser=同步帳戶 -> 瀏覽器
|
account.syncToBrowser=同步帳戶 → 瀏覽器
|
||||||
account.syncToAccount=同步帳戶 <- 瀏覽器
|
account.syncToAccount=同步帳戶 ← 瀏覽器
|
||||||
|
|
||||||
|
|
||||||
adminUserSettings.title=使用者控制設定
|
adminUserSettings.title=使用者控制設定
|
||||||
@@ -173,7 +175,9 @@ adminUserSettings.header=管理使用者控制設定
|
|||||||
adminUserSettings.admin=管理員
|
adminUserSettings.admin=管理員
|
||||||
adminUserSettings.user=使用者
|
adminUserSettings.user=使用者
|
||||||
adminUserSettings.addUser=新增使用者
|
adminUserSettings.addUser=新增使用者
|
||||||
adminUserSettings.usernameInfo=使用者名稱只能包含字母、數字和以下特殊字元@._+-,或必須是有效的電子郵件地址。
|
adminUserSettings.deleteUser=刪除使用者
|
||||||
|
adminUserSettings.confirmDeleteUser=確認刪除該使用者?
|
||||||
|
adminUserSettings.usernameInfo=使用者名稱只能包含字母、數字和以下特殊字元 @._+-,或必須是有效的電子郵件地址。
|
||||||
adminUserSettings.roles=角色
|
adminUserSettings.roles=角色
|
||||||
adminUserSettings.role=角色
|
adminUserSettings.role=角色
|
||||||
adminUserSettings.actions=操作
|
adminUserSettings.actions=操作
|
||||||
@@ -185,7 +189,24 @@ adminUserSettings.internalApiUser=內部 API 使用者
|
|||||||
adminUserSettings.forceChange=強制使用者在登入時修改使用者名稱/密碼
|
adminUserSettings.forceChange=強制使用者在登入時修改使用者名稱/密碼
|
||||||
adminUserSettings.submit=儲存
|
adminUserSettings.submit=儲存
|
||||||
adminUserSettings.changeUserRole=更改使用者身份
|
adminUserSettings.changeUserRole=更改使用者身份
|
||||||
adminUserSettings.authenticated=Authenticated
|
adminUserSettings.authenticated=已驗證
|
||||||
|
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
#############
|
#############
|
||||||
# HOME-PAGE #
|
# HOME-PAGE #
|
||||||
@@ -332,8 +353,8 @@ home.certSign.title=使用憑證簽章
|
|||||||
home.certSign.desc=使用憑證/金鑰(PEM/P12)簽章 PDF
|
home.certSign.desc=使用憑證/金鑰(PEM/P12)簽章 PDF
|
||||||
certSign.tags=驗證,PEM,P12,官方,加密
|
certSign.tags=驗證,PEM,P12,官方,加密
|
||||||
|
|
||||||
home.removeCertSign.title=Remove Certificate Sign
|
home.removeCertSign.title=移除簽章
|
||||||
home.removeCertSign.desc=Remove certificate signature from PDF
|
home.removeCertSign.desc=從 PDF 移除簽章
|
||||||
removeCertSign.tags=authenticate,PEM,P12,official,decrypt
|
removeCertSign.tags=authenticate,PEM,P12,official,decrypt
|
||||||
|
|
||||||
home.pageLayout.title=多頁面版面配置
|
home.pageLayout.title=多頁面版面配置
|
||||||
@@ -455,13 +476,13 @@ login.invalid=使用者名稱或密碼無效。
|
|||||||
login.locked=您的帳戶已被鎖定。
|
login.locked=您的帳戶已被鎖定。
|
||||||
login.signinTitle=請登入
|
login.signinTitle=請登入
|
||||||
login.ssoSignIn=透過織網單一簽入
|
login.ssoSignIn=透過織網單一簽入
|
||||||
login.oauth2AutoCreateDisabled=OAUTH2自動建立使用者已停用
|
login.oauth2AutoCreateDisabled=OAuth 2.0 自動建立使用者已停用
|
||||||
login.oauth2RequestNotFound=Authorization request not found
|
login.oauth2RequestNotFound=找不到驗證請求
|
||||||
login.oauth2InvalidUserInfoResponse=Invalid User Info Response
|
login.oauth2InvalidUserInfoResponse=無效的使用者資訊回應
|
||||||
login.oauth2invalidRequest=Invalid Request
|
login.oauth2invalidRequest=無效的回應
|
||||||
login.oauth2AccessDenied=Access Denied
|
login.oauth2AccessDenied=存取被拒
|
||||||
login.oauth2InvalidTokenResponse=Invalid Token Response
|
login.oauth2InvalidTokenResponse=無效的 Token 回應
|
||||||
login.oauth2InvalidIdToken=Invalid Id Token
|
login.oauth2InvalidIdToken=無效的 Tokne
|
||||||
|
|
||||||
|
|
||||||
#auto-redact
|
#auto-redact
|
||||||
@@ -645,7 +666,7 @@ scalePages.submit=送出
|
|||||||
certSign.title=憑證簽章
|
certSign.title=憑證簽章
|
||||||
certSign.header=使用您的憑證簽章(進行中)
|
certSign.header=使用您的憑證簽章(進行中)
|
||||||
certSign.selectPDF=選擇要簽章的 PDF 檔案:
|
certSign.selectPDF=選擇要簽章的 PDF 檔案:
|
||||||
certSign.jksNote=注意:如果您的證書類型未在下面列出,請使用keytool命令行工具將其轉換為Java Keystore (.jks) 檔。 然後,選擇下面的 .jks 文件選項。
|
certSign.jksNote=注意:如果您的證書類型未在下面列出,請使用 keytool 命令行工具將其轉換為 Java Keystore (.jks) 檔。 然後,選擇下面的 .jks 文件選項。
|
||||||
certSign.selectKey=選擇您的私鑰文件(PKCS#8 格式,可能是 .pem 或 .der):
|
certSign.selectKey=選擇您的私鑰文件(PKCS#8 格式,可能是 .pem 或 .der):
|
||||||
certSign.selectCert=選擇您的憑證文件(X.509 格式,可能是 .pem 或 .der):
|
certSign.selectCert=選擇您的憑證文件(X.509 格式,可能是 .pem 或 .der):
|
||||||
certSign.selectP12=選擇您的 PKCS#12 金鑰庫文件(.p12 或 .pfx)(可選,如果提供,它應包含您的私鑰和憑證):
|
certSign.selectP12=選擇您的 PKCS#12 金鑰庫文件(.p12 或 .pfx)(可選,如果提供,它應包含您的私鑰和憑證):
|
||||||
@@ -660,10 +681,10 @@ certSign.submit=簽章 PDF
|
|||||||
|
|
||||||
|
|
||||||
#removeCertSign
|
#removeCertSign
|
||||||
removeCertSign.title=Remove Certificate Signature
|
removeCertSign.title=移除憑證簽章
|
||||||
removeCertSign.header=Remove the digital certificate from the PDF
|
removeCertSign.header=從 PDF 檔案中移除憑證簽章
|
||||||
removeCertSign.selectPDF=Select a PDF file:
|
removeCertSign.selectPDF=選擇 PDF 檔案
|
||||||
removeCertSign.submit=Remove Signature
|
removeCertSign.submit=移除
|
||||||
|
|
||||||
|
|
||||||
#removeBlanks
|
#removeBlanks
|
||||||
@@ -685,6 +706,8 @@ removeAnnotations.submit=移除
|
|||||||
#compare
|
#compare
|
||||||
compare.title=比較
|
compare.title=比較
|
||||||
compare.header=比較 PDF
|
compare.header=比較 PDF
|
||||||
|
compare.highlightColor.1=Highlight Color 1:
|
||||||
|
compare.highlightColor.2=Highlight Color 2:
|
||||||
compare.document.1=文件 1
|
compare.document.1=文件 1
|
||||||
compare.document.2=文件 2
|
compare.document.2=文件 2
|
||||||
compare.submit=比較
|
compare.submit=比較
|
||||||
@@ -769,7 +792,7 @@ extractImages.submit=提取
|
|||||||
fileToPDF.title=檔案轉 PDF
|
fileToPDF.title=檔案轉 PDF
|
||||||
fileToPDF.header=將任何檔案轉換為 PDF
|
fileToPDF.header=將任何檔案轉換為 PDF
|
||||||
fileToPDF.credit=此服務使用 LibreOffice 和 Unoconv 進行檔案轉換。
|
fileToPDF.credit=此服務使用 LibreOffice 和 Unoconv 進行檔案轉換。
|
||||||
fileToPDF.supportedFileTypesInfo=Supported File types
|
fileToPDF.supportedFileTypesInfo=支援的檔案類型
|
||||||
fileToPDF.supportedFileTypes=支援的檔案類型應包括以下內容,但要獲得完整的更新支援格式列表,請參閱 LibreOffice 的文件
|
fileToPDF.supportedFileTypes=支援的檔案類型應包括以下內容,但要獲得完整的更新支援格式列表,請參閱 LibreOffice 的文件
|
||||||
fileToPDF.submit=轉換為 PDF
|
fileToPDF.submit=轉換為 PDF
|
||||||
|
|
||||||
@@ -799,6 +822,7 @@ merge.title=合併
|
|||||||
merge.header=合併多個 PDF
|
merge.header=合併多個 PDF
|
||||||
merge.sortByName=依名稱排序
|
merge.sortByName=依名稱排序
|
||||||
merge.sortByDate=依日期排序
|
merge.sortByDate=依日期排序
|
||||||
|
merge.removeCertSign=是否移除合併後檔案的憑證簽章?
|
||||||
merge.submit=合併
|
merge.submit=合併
|
||||||
|
|
||||||
|
|
||||||
@@ -816,6 +840,7 @@ pdfOrganiser.mode.6=奇偶拆分
|
|||||||
pdfOrganiser.mode.7=刪除第一頁
|
pdfOrganiser.mode.7=刪除第一頁
|
||||||
pdfOrganiser.mode.8=刪除最後一頁
|
pdfOrganiser.mode.8=刪除最後一頁
|
||||||
pdfOrganiser.mode.9=刪除第一頁和最後一頁
|
pdfOrganiser.mode.9=刪除第一頁和最後一頁
|
||||||
|
pdfOrganiser.mode.10=Odd-Even Merge
|
||||||
pdfOrganiser.placeholder=(例如 1,3,2 或 4-8,2,10-12 或 2n-1)
|
pdfOrganiser.placeholder=(例如 1,3,2 或 4-8,2,10-12 或 2n-1)
|
||||||
|
|
||||||
|
|
||||||
@@ -975,8 +1000,8 @@ pdfToPDFA.header=PDF 轉 PDF/A
|
|||||||
pdfToPDFA.credit=此服務使用 OCRmyPDF 進行 PDF/A 轉換
|
pdfToPDFA.credit=此服務使用 OCRmyPDF 進行 PDF/A 轉換
|
||||||
pdfToPDFA.submit=轉換
|
pdfToPDFA.submit=轉換
|
||||||
pdfToPDFA.tip=目前不支援上傳多個
|
pdfToPDFA.tip=目前不支援上傳多個
|
||||||
pdfToPDFA.outputFormat=Output format
|
pdfToPDFA.outputFormat=輸出格式
|
||||||
pdfToPDFA.pdfWithDigitalSignature=The PDF contains a digital signature. This will be removed in the next step.
|
pdfToPDFA.pdfWithDigitalSignature=該 PDF 的憑證簽章將會在下一步被移除
|
||||||
|
|
||||||
|
|
||||||
#PDFToWord
|
#PDFToWord
|
||||||
@@ -1058,15 +1083,15 @@ split-by-sections.vertical.label=垂直劃分
|
|||||||
split-by-sections.horizontal.placeholder=輸入水平劃分的數量
|
split-by-sections.horizontal.placeholder=輸入水平劃分的數量
|
||||||
split-by-sections.vertical.placeholder=輸入垂直劃分的數量
|
split-by-sections.vertical.placeholder=輸入垂直劃分的數量
|
||||||
split-by-sections.submit=分割 PDF
|
split-by-sections.submit=分割 PDF
|
||||||
split-by-sections.merge=是否合併為一個pdf
|
split-by-sections.merge=是否合併為一個 PDF
|
||||||
|
|
||||||
|
|
||||||
#printFile
|
#printFile
|
||||||
printFile.title=Print File
|
printFile.title=列印檔案
|
||||||
printFile.header=Print File to Printer
|
printFile.header=使用印表機印出檔案
|
||||||
printFile.selectText.1=Select File to Print
|
printFile.selectText.1=選擇要印的檔案
|
||||||
printFile.selectText.2=Enter Printer Name
|
printFile.selectText.2=輸入印表機名稱
|
||||||
printFile.submit=Print
|
printFile.submit=列印
|
||||||
|
|
||||||
|
|
||||||
#licenses
|
#licenses
|
||||||
@@ -1077,15 +1102,24 @@ licenses.module=模組
|
|||||||
licenses.version=版本
|
licenses.version=版本
|
||||||
licenses.license=許可證
|
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.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
|
||||||
|
|
||||||
|
|
||||||
#error
|
#error
|
||||||
error.sorry=對於這個問題,我們感到抱歉!
|
error.sorry=對於這個問題,我們感到抱歉!
|
||||||
error.needHelp=需要幫助/發現了一個問題?
|
error.needHelp=需要幫助/發現了一個問題?
|
||||||
error.contactTip=如果你仍然遇到問題,請不要猶豫,隨時向我們尋求幫助。你可以在我們的GitHub頁面提交工單,或通過Discord與我們聯繋:
|
error.contactTip=如果你仍然遇到問題,請不要猶豫,隨時向我們尋求幫助。你可以在我們的 GitHub 頁面提交工單,或通過 Discord 與我們聯繋:
|
||||||
error.404.head=404 - 找不到頁面 | 哎呀,我們在代碼中走錯了路!
|
error.404.head=404 - 找不到頁面 | 哎呀,我們在代碼中走錯了路!
|
||||||
error.404.1=我們好像找不到你正在尋找的頁面。
|
error.404.1=我們好像找不到你正在尋找的頁面。
|
||||||
error.404.2=出了點錯誤
|
error.404.2=出了點錯誤
|
||||||
error.github=在GitHub上提交工單
|
error.github=在 GitHub 上提交工單
|
||||||
error.showStack=顯示堆疊追蹤
|
error.showStack=顯示堆疊追蹤
|
||||||
error.copyStack=複製堆疊追蹤
|
error.copyStack=複製堆疊追蹤
|
||||||
error.githubSubmit=GitHub - 提交工單
|
error.githubSubmit=GitHub - 提交工單
|
||||||
|
|||||||
@@ -1,44 +1,54 @@
|
|||||||
# Welcome to settings file
|
#############################################################################################################
|
||||||
# Remove comment marker # if on start of line to enable the configuration
|
# Welcome to settings file from #
|
||||||
# If you want to override with environment parameter follow parameter naming SECURITY_INITIALLOGIN_USERNAME
|
# ____ _____ ___ ____ _ ___ _ _ ____ ____ ____ _____ #
|
||||||
|
# / ___|_ _|_ _| _ \| | |_ _| \ | |/ ___| | _ \| _ \| ___| #
|
||||||
|
# \___ \ | | | || |_) | | | || \| | | _ _____| |_) | | | | |_ #
|
||||||
|
# ___) || | | || _ <| |___ | || |\ | |_| |_____| __/| |_| | _| #
|
||||||
|
# |____/ |_| |___|_| \_\_____|___|_| \_|\____| |_| |____/|_| #
|
||||||
|
# #
|
||||||
|
# Do not comment out any entry, it will be removed on next startup #
|
||||||
|
# If you want to override with environment parameter follow parameter naming SECURITY_INITIALLOGIN_USERNAME #
|
||||||
|
#############################################################################################################
|
||||||
|
|
||||||
|
|
||||||
security:
|
security:
|
||||||
enableLogin: false # set to 'true' to enable login
|
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
|
loginAttemptCount: 5 # lock user account after 5 tries
|
||||||
loginResetTimeMinutes: 120 # lock account for 2 hours after x attempts
|
loginResetTimeMinutes: 120 # lock account for 2 hours after x attempts
|
||||||
# initialLogin:
|
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)
|
||||||
# username: "admin" # Initial username for the first login
|
initialLogin:
|
||||||
# password: "stirling" # Initial password for the first login
|
username: '' # Initial username for the first login
|
||||||
# oauth2:
|
password: '' # Initial password for the first login
|
||||||
# enabled: false # set to 'true' to enable login (Note: enableLogin must also be 'true' for this to work)
|
oauth2:
|
||||||
# issuer: "" # set to any provider that supports OpenID Connect Discovery (/.well-known/openid-configuration) end-point
|
enabled: false # set to 'true' to enable login (Note: enableLogin must also be 'true' for this to work)
|
||||||
# clientId: "" # Client ID from your provider
|
client:
|
||||||
# clientSecret: "" # Client Secret from your provider
|
keycloak:
|
||||||
# autoCreateUser: false # set to 'true' to allow auto-creation of non-existing users
|
issuer: '' # URL of the Keycloak realm's OpenID Connect Discovery endpoint
|
||||||
# useAsUsername: "email" # Default is 'email'; custom fields can be used as the username
|
clientId: '' # Client ID for Keycloak OAuth2
|
||||||
# scopes: "openid, profile, email" # Specify the scopes for which the application will request permissions
|
clientSecret: '' # Client Secret for Keycloak OAuth2
|
||||||
# provider: "google" # Set this to your OAuth provider's name, e.g., 'google' or 'keycloak'
|
scopes: openid, profile, email # Scopes for Keycloak OAuth2
|
||||||
# client:
|
useAsUsername: preferred_username # Field to use as the username for Keycloak OAuth2
|
||||||
# google:
|
google:
|
||||||
# clientId: "" # Client ID for Google OAuth2
|
clientId: '' # Client ID for Google OAuth2
|
||||||
# clientSecret: "" # Client Secret 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
|
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
|
useAsUsername: email # Field to use as the username for Google OAuth2
|
||||||
# github:
|
github:
|
||||||
# clientId: "" # Client ID for GitHub OAuth2
|
clientId: '' # Client ID for GitHub OAuth2
|
||||||
# clientSecret: "" # Client Secret for GitHub OAuth2
|
clientSecret: '' # Client Secret for GitHub OAuth2
|
||||||
# scopes: "read:user" # Scope for GitHub OAuth2
|
scopes: read:user # Scope for GitHub OAuth2
|
||||||
# useAsUsername: "login" # Field to use as the username for GitHub OAuth2
|
useAsUsername: login # Field to use as the username for GitHub OAuth2
|
||||||
# keycloak:
|
issuer: '' # set to any provider that supports OpenID Connect Discovery (/.well-known/openid-configuration) end-point
|
||||||
# issuer: "http://192.168.0.123:8888/realms/stirling-pdf" # URL of the Keycloak realm's OpenID Connect Discovery endpoint
|
clientId: '' # Client ID from your provider
|
||||||
# clientId: "stirling-pdf" # Client ID for Keycloak OAuth2
|
clientSecret: '' # Client Secret from your provider
|
||||||
# clientSecret: "" # Client Secret for Keycloak OAuth2
|
autoCreateUser: false # set to 'true' to allow auto-creation of non-existing users
|
||||||
# scopes: "openid, profile, email" # Scopes for Keycloak OAuth2
|
useAsUsername: email # Default is 'email'; custom fields can be used as the username
|
||||||
# useAsUsername: "email" # Field to use as the username for Keycloak OAuth2
|
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'
|
||||||
|
|
||||||
system:
|
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
|
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
|
showUpdate: false # see when a new update is available
|
||||||
@@ -46,9 +56,9 @@ system:
|
|||||||
customHTMLFiles: false # enable to have files placed in /customFiles/templates override the existing template html files
|
customHTMLFiles: false # enable to have files placed in /customFiles/templates override the existing template html files
|
||||||
|
|
||||||
ui:
|
ui:
|
||||||
appName: null # Application's visible name
|
appName: '' # Application's visible name
|
||||||
homeDescription: null # Short description or tagline shown on homepage.
|
homeDescription: '' # Short description or tagline shown on homepage.
|
||||||
appNameNavbar: null # Name displayed on the navigation bar
|
appNameNavbar: '' # Name displayed on the navigation bar
|
||||||
|
|
||||||
endpoints:
|
endpoints:
|
||||||
toRemove: [] # List endpoints to disable (e.g. ['img-to-pdf', 'remove-pages'])
|
toRemove: [] # List endpoints to disable (e.g. ['img-to-pdf', 'remove-pages'])
|
||||||
|
|||||||