mirror of
https://github.com/arsvendg/Stirling-PDF.git
synced 2026-03-16 13:02:05 +01:00
Compare commits
80 Commits
8f2f715c3e
...
e9e4e09380
| Author | SHA1 | Date | |
|---|---|---|---|
| e9e4e09380 | |||
|
|
5f4f365543 | ||
|
|
f35cbc4310 | ||
|
|
c09fc1541f | ||
|
|
dff53310a7 | ||
|
|
ec537c6fde | ||
|
|
ce70796fff | ||
|
|
7db7192d95 | ||
|
|
d00e7fe958 | ||
|
|
510f39ad41 | ||
|
|
950a0c4b21 | ||
|
|
e6793bd04a | ||
|
|
0f60974a57 | ||
|
|
0ed4c16dc0 | ||
|
|
ea6d4a293e | ||
|
|
191e79da18 | ||
|
|
c54c18b247 | ||
|
|
39cbb5e7d9 | ||
|
|
3df0474ed2 | ||
|
|
9ff2cb63d0 | ||
|
|
d8087d8c55 | ||
|
|
0dfb4d77c0 | ||
|
|
065f53e577 | ||
|
|
c899f605a9 | ||
|
|
47de0f84db | ||
|
|
543b96c033 | ||
|
|
c1126e57bd | ||
|
|
7c5077006d | ||
|
|
3e7889cee8 | ||
|
|
281047f42a | ||
|
|
07f85ea8b4 | ||
|
|
e07f73dce7 | ||
|
|
bfe38c71e8 | ||
|
|
072090d41b | ||
|
|
560936e182 | ||
|
|
6eb79e65fa | ||
|
|
cbe92269f4 | ||
|
|
81871a6f10 | ||
|
|
cf2a7896da | ||
|
|
6a3d95ba09 | ||
|
|
85ed0c38d1 | ||
|
|
6c7dc34640 | ||
|
|
ecfdfa5644 | ||
|
|
11e279bd12 | ||
|
|
929f0bbbe5 | ||
|
|
5751b1ac2d | ||
|
|
4bf78ffd5d | ||
|
|
b7d37deb85 | ||
|
|
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 |
2
.github/ISSUE_TEMPLATE/2-feature.yml
vendored
2
.github/ISSUE_TEMPLATE/2-feature.yml
vendored
@@ -1,6 +1,8 @@
|
|||||||
name: Feature Request
|
name: Feature Request
|
||||||
description: Submit a new feature request.
|
description: Submit a new feature request.
|
||||||
title: "[Feature Request]: "
|
title: "[Feature Request]: "
|
||||||
|
labels:
|
||||||
|
- enhancement
|
||||||
body:
|
body:
|
||||||
- type: markdown
|
- type: markdown
|
||||||
attributes:
|
attributes:
|
||||||
|
|||||||
49
.github/labeler-config.yml
vendored
Normal file
49
.github/labeler-config.yml
vendored
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
Translation:
|
||||||
|
- changed-files:
|
||||||
|
- any-glob-to-any-file: 'src/main/resources/messages_*_*.properties'
|
||||||
|
- any-glob-to-any-file: 'scripts/ignore_translation.toml'
|
||||||
|
|
||||||
|
Front End:
|
||||||
|
- changed-files:
|
||||||
|
- any-glob-to-any-file: 'src/main/resources/templates/**/*'
|
||||||
|
- any-glob-to-any-file: 'src/main/resources/static/**/*'
|
||||||
|
- any-glob-to-any-file: 'src/main/java/stirling/software/SPDF/controller/web/**'
|
||||||
|
|
||||||
|
Java:
|
||||||
|
- changed-files:
|
||||||
|
- any-glob-to-any-file: 'src/main/java/**/*.java'
|
||||||
|
|
||||||
|
Back End:
|
||||||
|
- changed-files:
|
||||||
|
- any-glob-to-any-file: 'src/main/java/stirling/software/SPDF/config/security/**/*'
|
||||||
|
- any-glob-to-any-file: 'src/main/java/stirling/software/SPDF/config/model/provider/**/*'
|
||||||
|
- any-glob-to-any-file: 'src/main/resources/settings.yml.template'
|
||||||
|
- any-glob-to-any-file: 'src/main/resources/banner.txt'
|
||||||
|
|
||||||
|
Security:
|
||||||
|
- changed-files:
|
||||||
|
- any-glob-to-any-file: 'src/main/java/stirling/software/SPDF/config/security/**/*'
|
||||||
|
- any-glob-to-any-file: 'src/main/java/stirling/software/SPDF/config/model/provider/**/*'
|
||||||
|
- any-glob-to-any-file: 'src/main/java/stirling/software/SPDF/config/model/AuthenticationType.java'
|
||||||
|
|
||||||
|
API:
|
||||||
|
- changed-files:
|
||||||
|
- any-glob-to-any-file: 'src/main/java/stirling/software/SPDF/controller/web/MetricsController.java'
|
||||||
|
- any-glob-to-any-file: 'src/main/java/stirling/software/SPDF/controller/api/**/*'
|
||||||
|
|
||||||
|
Documentation:
|
||||||
|
- changed-files:
|
||||||
|
- any-glob-to-any-file: '**/*.md'
|
||||||
|
- any-glob-to-any-file: 'scripts/counter_translation.py'
|
||||||
|
- any-glob-to-any-file: 'scripts/ignore_translation.toml'
|
||||||
|
|
||||||
|
Docker:
|
||||||
|
- changed-files:
|
||||||
|
- any-glob-to-any-file: 'Dockerfile'
|
||||||
|
- any-glob-to-any-file: 'Dockerfile-*'
|
||||||
|
- any-glob-to-any-file: 'exampleYmlFiles/*.yml'
|
||||||
|
|
||||||
|
Test:
|
||||||
|
- changed-files:
|
||||||
|
- any-glob-to-any-file: 'cucumber/**/*'
|
||||||
|
- any-glob-to-any-file: 'src/test**/*'
|
||||||
93
.github/labels.yml
vendored
Normal file
93
.github/labels.yml
vendored
Normal file
@@ -0,0 +1,93 @@
|
|||||||
|
# Labels names are important as they are used by Release Drafter to decide
|
||||||
|
# regarding where to record them in changelog or if to skip them.
|
||||||
|
#
|
||||||
|
# The repository labels will be automatically configured using this file and
|
||||||
|
# the GitHub Action https://github.com/marketplace/actions/github-labeler.
|
||||||
|
- name: "Back End"
|
||||||
|
color: "20CE6C"
|
||||||
|
description: "Issues related to back-end development"
|
||||||
|
from_name: "Back end"
|
||||||
|
- name: "Bug"
|
||||||
|
description: "Something isn't working"
|
||||||
|
color: "EB9CA6"
|
||||||
|
from_name: "bug"
|
||||||
|
- name: "dependencies"
|
||||||
|
description: "Pull requests that update a dependency file"
|
||||||
|
color: "5AA8FC"
|
||||||
|
- name: "Docker"
|
||||||
|
description: "Pull requests that update Docker code"
|
||||||
|
color: "1FCEFF"
|
||||||
|
from_name: "docker"
|
||||||
|
- name: "Documentation"
|
||||||
|
description: "Improvements or additions to documentation"
|
||||||
|
color: "35ABFF"
|
||||||
|
from_name: "documentation"
|
||||||
|
- name: "Done for next release"
|
||||||
|
color: "0CDBD1"
|
||||||
|
- name: "Done"
|
||||||
|
color: "60F13B"
|
||||||
|
- name: "duplicate"
|
||||||
|
description: "This issue or pull request already exists"
|
||||||
|
color: "CDD1D5"
|
||||||
|
- name: "enhancement"
|
||||||
|
description: "New feature or request"
|
||||||
|
color: "A0EEEE"
|
||||||
|
- name: "fix needs confirmation"
|
||||||
|
color: "60A1E7"
|
||||||
|
description: "Fix needs to be confirmed"
|
||||||
|
- name: "Front End"
|
||||||
|
color: "BBD2F1"
|
||||||
|
description: "Issues related to front-end development"
|
||||||
|
- name: "github-actions"
|
||||||
|
description: "Pull requests that update GitHub Actions code"
|
||||||
|
color: "999999"
|
||||||
|
from_name: "github_actions"
|
||||||
|
- name: "good first issue"
|
||||||
|
description: "Good for newcomers"
|
||||||
|
color: "C1B8FF"
|
||||||
|
- name: "help wanted"
|
||||||
|
description: "Extra attention is needed"
|
||||||
|
color: "00E6C4"
|
||||||
|
- name: "invalid"
|
||||||
|
description: "This doesn't seem right"
|
||||||
|
color: "E5E566"
|
||||||
|
- name: "Java"
|
||||||
|
description: "Pull requests that update Java code"
|
||||||
|
color: "FF9E1F"
|
||||||
|
from_name: "java"
|
||||||
|
- name: "Long-term Enhancement"
|
||||||
|
color: "BFDEC3"
|
||||||
|
description: "Enhancements planned for the long term"
|
||||||
|
- name: "more-info-needed"
|
||||||
|
color: "00E4F8"
|
||||||
|
description: "More information is needed"
|
||||||
|
- name: "needs investigation"
|
||||||
|
color: "B8C3A7"
|
||||||
|
description: "Issues that require further investigation"
|
||||||
|
- name: "Prioritised enhancement"
|
||||||
|
color: "4BA2EE"
|
||||||
|
description: "High-priority enhancements"
|
||||||
|
- name: "question"
|
||||||
|
description: "Further information is requested"
|
||||||
|
color: "D97EE5"
|
||||||
|
- name: "Translation"
|
||||||
|
color: "9FABF9"
|
||||||
|
from_name: "translation"
|
||||||
|
- name: "upstream"
|
||||||
|
color: "DEDEDE"
|
||||||
|
- name: "v2"
|
||||||
|
color: "FFFF00"
|
||||||
|
- name: "wontfix"
|
||||||
|
description: "This will not be worked on"
|
||||||
|
color: "FFFFFF"
|
||||||
|
- name: "Security"
|
||||||
|
color: "000000"
|
||||||
|
description: "Security-related issues or pull requests"
|
||||||
|
- name: "API"
|
||||||
|
color: "FFFF00"
|
||||||
|
description: "API-related issues or pull requests"
|
||||||
|
- name: "Test"
|
||||||
|
color: "FF9E1F"
|
||||||
|
description: "Testing-related issues or pull requests"
|
||||||
|
- name: "Stale"
|
||||||
|
color: "000000"
|
||||||
1
.github/scripts/check_tabulator.py
vendored
1
.github/scripts/check_tabulator.py
vendored
@@ -1,4 +1,5 @@
|
|||||||
"""check_tabulator.py"""
|
"""check_tabulator.py"""
|
||||||
|
|
||||||
import argparse
|
import argparse
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
|
|||||||
18
.github/workflows/auto-labeler.yml
vendored
Normal file
18
.github/workflows/auto-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
|
||||||
24
.github/workflows/manage-label.yml
vendored
Normal file
24
.github/workflows/manage-label.yml
vendored
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
name: Manage labels
|
||||||
|
|
||||||
|
on:
|
||||||
|
schedule:
|
||||||
|
- cron: "30 20 * * *"
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
issues: write
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
labeler:
|
||||||
|
name: Labeler
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Check out the repository
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Run Labeler
|
||||||
|
uses: crazy-max/ghaction-github-labeler@v5
|
||||||
|
with:
|
||||||
|
github-token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
yaml-file: .github/labels.yml
|
||||||
|
skip-delete: true
|
||||||
32
.github/workflows/stale.yml
vendored
Normal file
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
|
||||||
16
.github/workflows/sync_files.yml
vendored
16
.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
|
||||||
@@ -51,12 +51,13 @@ jobs:
|
|||||||
[1]: https://github.com/peter-evans/create-pull-request
|
[1]: https://github.com/peter-evans/create-pull-request
|
||||||
draft: false
|
draft: false
|
||||||
delete-branch: true
|
delete-branch: true
|
||||||
|
labels: github-actions
|
||||||
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 +74,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
|
||||||
@@ -88,3 +89,4 @@ jobs:
|
|||||||
[1]: https://github.com/peter-evans/create-pull-request
|
[1]: https://github.com/peter-evans/create-pull-request
|
||||||
draft: false
|
draft: false
|
||||||
delete-branch: true
|
delete-branch: true
|
||||||
|
labels: Documentation,Translation,github-actions
|
||||||
|
|||||||
4
.github/workflows/test.yml
vendored
4
.github/workflows/test.yml
vendored
@@ -29,8 +29,8 @@ jobs:
|
|||||||
|
|
||||||
- name: Install Docker Compose
|
- name: Install Docker Compose
|
||||||
run: |
|
run: |
|
||||||
sudo curl -SL "https://github.com/docker/compose/releases/download/v2.26.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
|
sudo curl -SL "https://github.com/docker/compose/releases/download/v2.29.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
|
||||||
# sudo chmod +x /usr/local/bin/docker-compose
|
sudo chmod +x /usr/local/bin/docker-compose
|
||||||
|
|
||||||
- name: Set up Python
|
- name: Set up Python
|
||||||
uses: actions/setup-python@v4
|
uses: actions/setup-python@v4
|
||||||
|
|||||||
45
.gitignore
vendored
45
.gitignore
vendored
@@ -1,5 +1,3 @@
|
|||||||
|
|
||||||
|
|
||||||
### Eclipse ###
|
### Eclipse ###
|
||||||
.metadata
|
.metadata
|
||||||
bin/
|
bin/
|
||||||
@@ -22,7 +20,6 @@ customFiles/
|
|||||||
configs/
|
configs/
|
||||||
watchedFolders/
|
watchedFolders/
|
||||||
|
|
||||||
|
|
||||||
# Gradle
|
# Gradle
|
||||||
.gradle
|
.gradle
|
||||||
.lock
|
.lock
|
||||||
@@ -119,12 +116,48 @@ watchedFolders/
|
|||||||
*.db
|
*.db
|
||||||
/build
|
/build
|
||||||
|
|
||||||
/.vscode
|
# Byte-compiled / optimized / DLL files
|
||||||
/.idea
|
__pycache__/
|
||||||
|
*.py[cod]
|
||||||
|
*.pyo
|
||||||
|
|
||||||
|
# Virtual environments
|
||||||
|
.env*
|
||||||
|
.venv*
|
||||||
|
env*/
|
||||||
|
venv*/
|
||||||
|
ENV/
|
||||||
|
env.bak/
|
||||||
|
venv.bak/
|
||||||
|
|
||||||
|
# VS Code
|
||||||
|
/.vscode/**/*
|
||||||
|
!/.vscode/settings.json
|
||||||
|
|
||||||
|
# IntelliJ IDEA
|
||||||
|
.idea/
|
||||||
|
*.iml
|
||||||
|
out/
|
||||||
|
|
||||||
# Ignore Mac DS_Store files
|
# Ignore Mac DS_Store files
|
||||||
.DS_Store
|
.DS_Store
|
||||||
**/.DS_Store
|
**/.DS_Store
|
||||||
|
|
||||||
#cucumber
|
# cucumber
|
||||||
/cucumber/reports/**
|
/cucumber/reports/**
|
||||||
|
|
||||||
|
# Certs
|
||||||
|
*.p12
|
||||||
|
*.pem
|
||||||
|
*.crt
|
||||||
|
*.cer
|
||||||
|
*.der
|
||||||
|
*.key
|
||||||
|
*.csr
|
||||||
|
|
||||||
|
# cache
|
||||||
|
.ruff_cache
|
||||||
|
.mypy_cache
|
||||||
|
.pytest_cache
|
||||||
|
.ipynb_checkpoints
|
||||||
|
|
||||||
|
|||||||
@@ -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)$
|
||||||
|
|||||||
53
.vscode/settings.json
vendored
Normal file
53
.vscode/settings.json
vendored
Normal file
@@ -0,0 +1,53 @@
|
|||||||
|
{
|
||||||
|
"java.compile.nullAnalysis.mode": "automatic",
|
||||||
|
"files.eol": "auto",
|
||||||
|
"java.configuration.updateBuildConfiguration": "interactive",
|
||||||
|
"black-formatter.args": ["--line-length", "127"],
|
||||||
|
"flake8.args": ["--max-line-length", "127"],
|
||||||
|
"pylint.args": ["max-line-length", "127"],
|
||||||
|
"[java]": {
|
||||||
|
"editor.tabSize": 4,
|
||||||
|
"editor.detectIndentation": false,
|
||||||
|
"editor.rulers": [127]
|
||||||
|
},
|
||||||
|
"[python]": {
|
||||||
|
"editor.tabSize": 2,
|
||||||
|
"editor.detectIndentation": false,
|
||||||
|
"editor.rulers": [127]
|
||||||
|
},
|
||||||
|
"[gradle-build]": {
|
||||||
|
"editor.tabSize": 4,
|
||||||
|
"editor.detectIndentation": false,
|
||||||
|
"editor.rulers": [127]
|
||||||
|
},
|
||||||
|
"[gradle]": {
|
||||||
|
"editor.tabSize": 4,
|
||||||
|
"editor.detectIndentation": false,
|
||||||
|
"editor.rulers": [127]
|
||||||
|
},
|
||||||
|
"[html]": {
|
||||||
|
"editor.tabSize": 2,
|
||||||
|
"editor.rulers": [127],
|
||||||
|
"files.trimFinalNewlines": false,
|
||||||
|
"files.insertFinalNewline": false
|
||||||
|
},
|
||||||
|
"[javascript]": {
|
||||||
|
"editor.tabSize": 2,
|
||||||
|
"editor.rulers": [127]
|
||||||
|
},
|
||||||
|
"[yaml]": {
|
||||||
|
"files.trimFinalNewlines": false,
|
||||||
|
"files.insertFinalNewline": false
|
||||||
|
},
|
||||||
|
"diffEditor.maxComputationTime": 0,
|
||||||
|
"editor.wordSegmenterLocales": null,
|
||||||
|
"editor.guides.bracketPairs": "active",
|
||||||
|
"editor.guides.bracketPairsHorizontal": "active",
|
||||||
|
"files.insertFinalNewline": true,
|
||||||
|
"files.trimFinalNewlines": true,
|
||||||
|
"files.trimTrailingWhitespace": true,
|
||||||
|
"editor.indentSize": "tabSize",
|
||||||
|
"editor.stickyScroll.enabled": false,
|
||||||
|
"editor.minimap.enabled": false,
|
||||||
|
"editor.formatOnSave": true
|
||||||
|
}
|
||||||
40
DATABASE.md
Normal file
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.
|
||||||
@@ -31,7 +31,7 @@ ENV DOCKER_ENABLE_SECURITY=false \
|
|||||||
PGID=1000 \
|
PGID=1000 \
|
||||||
UMASK=022 \
|
UMASK=022 \
|
||||||
FAT_DOCKER=true \
|
FAT_DOCKER=true \
|
||||||
INSTALL_BOOK_AND_ADVANCED_HTML_OPS=true
|
INSTALL_BOOK_AND_ADVANCED_HTML_OPS=false
|
||||||
|
|
||||||
|
|
||||||
# JDK for app
|
# JDK for app
|
||||||
@@ -45,7 +45,6 @@ RUN echo "@testing https://dl-cdn.alpinelinux.org/alpine/edge/main" | tee -a /et
|
|||||||
tini \
|
tini \
|
||||||
bash \
|
bash \
|
||||||
curl \
|
curl \
|
||||||
calibre@testing \
|
|
||||||
shadow \
|
shadow \
|
||||||
su-exec \
|
su-exec \
|
||||||
openssl \
|
openssl \
|
||||||
|
|||||||
137
README.md
137
README.md
@@ -22,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**
|
||||||
|
|
||||||
@@ -83,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
|
||||||
|
|
||||||
@@ -163,42 +165,46 @@ Please view https://github.com/Stirling-Tools/Stirling-PDF/blob/main/HowToUseOCR
|
|||||||
|
|
||||||
## Supported Languages
|
## Supported Languages
|
||||||
|
|
||||||
Stirling PDF currently supports 32!
|
Stirling PDF currently supports 38!
|
||||||
|
|
||||||
| Language | Progress |
|
| Language | Progress |
|
||||||
| ------------------------------------------- | -------------------------------------- |
|
| ------------------------------------------- | -------------------------------------- |
|
||||||
|
| Arabic (العربية) (ar_AR) |  |
|
||||||
|
| Basque (Euskara) (eu_ES) |  |
|
||||||
|
| Bulgarian (Български) (bg_BG) |  |
|
||||||
|
| Catalan (Català) (ca_CA) |  |
|
||||||
|
| Croatian (Hrvatski) (hr_HR) |  |
|
||||||
|
| Czech (Česky) (cs_CZ) |  |
|
||||||
|
| Danish (Dansk) (da_DK) |  |
|
||||||
|
| Dutch (Nederlands) (nl_NL) |  |
|
||||||
| English (English) (en_GB) |  |
|
| English (English) (en_GB) |  |
|
||||||
| English (US) (en_US) |  |
|
| English (US) (en_US) |  |
|
||||||
| Arabic (العربية) (ar_AR) |  |
|
|
||||||
| German (Deutsch) (de_DE) |  |
|
|
||||||
| French (Français) (fr_FR) |  |
|
| French (Français) (fr_FR) |  |
|
||||||
| Spanish (Español) (es_ES) |  |
|
| German (Deutsch) (de_DE) |  |
|
||||||
| Simplified Chinese (简体中文) (zh_CN) |  |
|
| Greek (Ελληνικά) (el_GR) |  |
|
||||||
| Traditional Chinese (繁體中文) (zh_TW) |  |
|
| Hindi (हिंदी) (hi_IN) |  |
|
||||||
| Catalan (Català) (ca_CA) |  |
|
| Hungarian (Magyar) (hu_HU) |  |
|
||||||
|
| Indonesia (Bahasa Indonesia) (id_ID) |  |
|
||||||
|
| Irish (Gaeilge) (ga_IE) |  |
|
||||||
| Italian (Italiano) (it_IT) |  |
|
| Italian (Italiano) (it_IT) |  |
|
||||||
| Swedish (Svenska) (sv_SE) |  |
|
| Japanese (日本語) (ja_JP) |  |
|
||||||
| Polish (Polski) (pl_PL) |  |
|
| Korean (한국어) (ko_KR) |  |
|
||||||
|
| Norwegian (Norsk) (no_NB) |  |
|
||||||
|
| Polish (Polski) (pl_PL) |  |
|
||||||
|
| Portuguese (Português) (pt_PT) |  |
|
||||||
|
| Portuguese Brazilian (Português) (pt_BR) |  |
|
||||||
| Romanian (Română) (ro_RO) |  |
|
| Romanian (Română) (ro_RO) |  |
|
||||||
| Korean (한국어) (ko_KR) |  |
|
| Russian (Русский) (ru_RU) |  |
|
||||||
| Portuguese Brazilian (Português) (pt_BR) |  |
|
| Sebian Latin alphabet (Srpski) (sr_LATN_RS) |  |
|
||||||
| Portuguese (Português) (pt_PT) |  |
|
| Simplified Chinese (简体中文) (zh_CN) |  |
|
||||||
| Russian (Русский) (ru_RU) |  |
|
| Slovakian (Slovensky) (sk_SK) |  |
|
||||||
| Basque (Euskara) (eu_ES) |  |
|
| Spanish (Español) (es_ES) |  |
|
||||||
| Japanese (日本語) (ja_JP) |  |
|
| Swedish (Svenska) (sv_SE) |  |
|
||||||
| Dutch (Nederlands) (nl_NL) |  |
|
| Thai (ไทย) (th_TH) |  |
|
||||||
| Greek (Ελληνικά) (el_GR) |  |
|
| Traditional Chinese (繁體中文) (zh_TW) |  |
|
||||||
| Turkish (Türkçe) (tr_TR) |  |
|
| Turkish (Türkçe) (tr_TR) |  |
|
||||||
| Indonesia (Bahasa Indonesia) (id_ID) |  |
|
| Ukrainian (Українська) (uk_UA) |  |
|
||||||
| Hindi (हिंदी) (hi_IN) |  |
|
| Vietnamese (Tiếng Việt) (vi_VN) |  |
|
||||||
| Hungarian (Magyar) (hu_HU) |  |
|
|
||||||
| Bulgarian (Български) (bg_BG) |  |
|
|
||||||
| Sebian Latin alphabet (Srpski) (sr_LATN_RS) |  |
|
|
||||||
| Ukrainian (Українська) (uk_UA) |  |
|
|
||||||
| Slovakian (Slovensky) (sk_SK) |  |
|
|
||||||
| Czech (Česky) (cs_CZ) |  |
|
|
||||||
| Croatian (Hrvatski) (hr_HR) |  |
|
|
||||||
| Norwegian (Norsk) (no_NB) |  |
|
|
||||||
|
|
||||||
## Contributing (creating issues, translations, fixing bugs, etc.)
|
## Contributing (creating issues, translations, fixing bugs, etc.)
|
||||||
|
|
||||||
@@ -219,11 +225,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
|
||||||
|
|
||||||
@@ -233,35 +239,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)
|
||||||
@@ -272,9 +279,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'])
|
||||||
@@ -308,7 +315,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,4 @@
|
|||||||
|All versions in a Docker envrionment 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``.
|
|All versions in a Docker environment can download Calibre as a optional extra at runtime to support `book-to-pdf` and `pdf-to-book` using parameter ``INSTALL_BOOK_AND_ADVANCED_HTML_OPS``.
|
||||||
The 'Fat' container contains all those found in 'Full' with security jar along with this Calibre install.
|
The 'Fat' container contains all those found in 'Full' with security jar along with this Calibre install.
|
||||||
|
|
||||||
Technology | Ultra-Lite | Full |
|
Technology | Ultra-Lite | Full |
|
||||||
|
|||||||
28
build.gradle
28
build.gradle
@@ -1,7 +1,7 @@
|
|||||||
plugins {
|
plugins {
|
||||||
id "java"
|
id "java"
|
||||||
id "org.springframework.boot" version "3.3.0"
|
id "org.springframework.boot" version "3.3.2"
|
||||||
id "io.spring.dependency-management" version "1.1.5"
|
id "io.spring.dependency-management" version "1.1.6"
|
||||||
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"
|
||||||
@@ -12,14 +12,16 @@ plugins {
|
|||||||
import com.github.jk1.license.render.*
|
import com.github.jk1.license.render.*
|
||||||
|
|
||||||
ext {
|
ext {
|
||||||
springBootVersion = "3.3.0"
|
springBootVersion = "3.3.2"
|
||||||
}
|
}
|
||||||
|
|
||||||
group = "stirling.software"
|
group = "stirling.software"
|
||||||
version = "0.26.1"
|
version = "0.26.2"
|
||||||
|
|
||||||
// 17 is lowest but we support and recommend 21
|
java {
|
||||||
sourceCompatibility = "17"
|
// 17 is lowest but we support and recommend 21
|
||||||
|
sourceCompatibility = JavaVersion.VERSION_17
|
||||||
|
}
|
||||||
|
|
||||||
repositories {
|
repositories {
|
||||||
mavenCentral()
|
mavenCentral()
|
||||||
@@ -36,8 +38,11 @@ sourceSets {
|
|||||||
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/api/DatabaseController.java"
|
||||||
exclude "stirling/software/SPDF/controller/web/AccountWebController.java"
|
exclude "stirling/software/SPDF/controller/web/AccountWebController.java"
|
||||||
|
exclude "stirling/software/SPDF/controller/web/DatabaseWebController.java"
|
||||||
exclude "stirling/software/SPDF/model/ApiKeyAuthenticationToken.java"
|
exclude "stirling/software/SPDF/model/ApiKeyAuthenticationToken.java"
|
||||||
|
exclude "stirling/software/SPDF/model/AttemptCounter.java"
|
||||||
exclude "stirling/software/SPDF/model/Authority.java"
|
exclude "stirling/software/SPDF/model/Authority.java"
|
||||||
exclude "stirling/software/SPDF/model/PersistentLogin.java"
|
exclude "stirling/software/SPDF/model/PersistentLogin.java"
|
||||||
exclude "stirling/software/SPDF/model/User.java"
|
exclude "stirling/software/SPDF/model/User.java"
|
||||||
@@ -97,7 +102,7 @@ dependencies {
|
|||||||
//security updates
|
//security updates
|
||||||
implementation "ch.qos.logback:logback-classic:1.5.6"
|
implementation "ch.qos.logback:logback-classic:1.5.6"
|
||||||
implementation "ch.qos.logback:logback-core:1.5.6"
|
implementation "ch.qos.logback:logback-core:1.5.6"
|
||||||
implementation "org.springframework:spring-webmvc:6.1.8"
|
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")
|
||||||
|
|
||||||
@@ -120,6 +125,7 @@ dependencies {
|
|||||||
|
|
||||||
//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:$springBootVersion"
|
testImplementation "org.springframework.boot:spring-boot-starter-test:$springBootVersion"
|
||||||
@@ -133,7 +139,7 @@ dependencies {
|
|||||||
// 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"
|
||||||
@@ -181,7 +187,7 @@ dependencies {
|
|||||||
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'
|
testImplementation 'org.mockito:mockito-inline:5.2.0'
|
||||||
}
|
}
|
||||||
|
|
||||||
tasks.withType(JavaCompile).configureEach {
|
tasks.withType(JavaCompile).configureEach {
|
||||||
@@ -192,7 +198,7 @@ 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)
|
||||||
@@ -222,6 +228,6 @@ tasks.named("test") {
|
|||||||
useJUnitPlatform()
|
useJUnitPlatform()
|
||||||
}
|
}
|
||||||
|
|
||||||
task printVersion {
|
task printVersion {
|
||||||
println project.version
|
println project.version
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
apiVersion: v2
|
apiVersion: v2
|
||||||
appVersion: 0.26.1
|
appVersion: 0.26.2
|
||||||
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
|
||||||
|
|||||||
@@ -62,8 +62,10 @@ spec:
|
|||||||
imagePullPolicy: {{ .Values.image.pullPolicy }}
|
imagePullPolicy: {{ .Values.image.pullPolicy }}
|
||||||
securityContext:
|
securityContext:
|
||||||
{{- toYaml .Values.containerSecurityContext | nindent 10 }}
|
{{- toYaml .Values.containerSecurityContext | nindent 10 }}
|
||||||
{{- if .Values.envs }}
|
|
||||||
env:
|
env:
|
||||||
|
- name: SYSTEM_ROOTURIPATH
|
||||||
|
value: {{ .Values.rootPath}}
|
||||||
|
{{- if .Values.envs }}
|
||||||
{{ toYaml .Values.envs | indent 8 }}
|
{{ toYaml .Values.envs | indent 8 }}
|
||||||
{{- end }}
|
{{- end }}
|
||||||
{{- if .Values.extraArgs }}
|
{{- if .Values.extraArgs }}
|
||||||
@@ -75,13 +77,13 @@ spec:
|
|||||||
containerPort: 8080
|
containerPort: 8080
|
||||||
livenessProbe:
|
livenessProbe:
|
||||||
httpGet:
|
httpGet:
|
||||||
path: /
|
path: {{ .Values.rootPath}}
|
||||||
port: http
|
port: http
|
||||||
{{ toYaml .Values.probes.livenessHttpGetConfig | indent 12 }}
|
{{ toYaml .Values.probes.livenessHttpGetConfig | indent 12 }}
|
||||||
{{ toYaml .Values.probes.liveness | indent 10 }}
|
{{ toYaml .Values.probes.liveness | indent 10 }}
|
||||||
readinessProbe:
|
readinessProbe:
|
||||||
httpGet:
|
httpGet:
|
||||||
path: /
|
path: {{ .Values.rootPath}}
|
||||||
port: http
|
port: http
|
||||||
{{ toYaml .Values.probes.readinessHttpGetConfig | indent 12 }}
|
{{ toYaml .Values.probes.readinessHttpGetConfig | indent 12 }}
|
||||||
{{ toYaml .Values.probes.readiness | indent 10 }}
|
{{ toYaml .Values.probes.readiness | indent 10 }}
|
||||||
|
|||||||
@@ -15,6 +15,9 @@ secret:
|
|||||||
commonLabels: {}
|
commonLabels: {}
|
||||||
# team_name: dev
|
# team_name: dev
|
||||||
|
|
||||||
|
# rootpath for the application
|
||||||
|
rootPath: /
|
||||||
|
|
||||||
envs: []
|
envs: []
|
||||||
# - name: UI_APP_NAME
|
# - name: UI_APP_NAME
|
||||||
# value: "Stirling PDF"
|
# value: "Stirling PDF"
|
||||||
@@ -24,8 +27,6 @@ envs: []
|
|||||||
# value: "Stirling PDF"
|
# value: "Stirling PDF"
|
||||||
# - name: ALLOW_GOOGLE_VISIBILITY
|
# - name: ALLOW_GOOGLE_VISIBILITY
|
||||||
# value: "true"
|
# value: "true"
|
||||||
# - name: APP_ROOT_PATH
|
|
||||||
# value: "/"
|
|
||||||
# - name: APP_LOCALE
|
# - name: APP_LOCALE
|
||||||
# value: "en_GB"
|
# value: "en_GB"
|
||||||
|
|
||||||
|
|||||||
106
cucumber/exampleFiles/ghost1.pdf
Normal file
106
cucumber/exampleFiles/ghost1.pdf
Normal file
@@ -0,0 +1,106 @@
|
|||||||
|
%PDF-1.3
|
||||||
|
%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com
|
||||||
|
1 0 obj
|
||||||
|
<<
|
||||||
|
/F1 2 0 R
|
||||||
|
>>
|
||||||
|
endobj
|
||||||
|
2 0 obj
|
||||||
|
<<
|
||||||
|
/BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font
|
||||||
|
>>
|
||||||
|
endobj
|
||||||
|
3 0 obj
|
||||||
|
<<
|
||||||
|
/Contents 9 0 R /MediaBox [ 0 0 612 792 ] /Parent 8 0 R /Resources <<
|
||||||
|
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
|
||||||
|
>> /Rotate 0 /Trans <<
|
||||||
|
|
||||||
|
>>
|
||||||
|
/Type /Page
|
||||||
|
>>
|
||||||
|
endobj
|
||||||
|
4 0 obj
|
||||||
|
<<
|
||||||
|
/Contents 10 0 R /MediaBox [ 0 0 612 792 ] /Parent 8 0 R /Resources <<
|
||||||
|
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
|
||||||
|
>> /Rotate 0 /Trans <<
|
||||||
|
|
||||||
|
>>
|
||||||
|
/Type /Page
|
||||||
|
>>
|
||||||
|
endobj
|
||||||
|
5 0 obj
|
||||||
|
<<
|
||||||
|
/Contents 11 0 R /MediaBox [ 0 0 612 792 ] /Parent 8 0 R /Resources <<
|
||||||
|
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
|
||||||
|
>> /Rotate 0 /Trans <<
|
||||||
|
|
||||||
|
>>
|
||||||
|
/Type /Page
|
||||||
|
>>
|
||||||
|
endobj
|
||||||
|
6 0 obj
|
||||||
|
<<
|
||||||
|
/PageMode /UseNone /Pages 8 0 R /Type /Catalog
|
||||||
|
>>
|
||||||
|
endobj
|
||||||
|
7 0 obj
|
||||||
|
<<
|
||||||
|
/Author (anonymous) /CreationDate (D:20240718233034+00'00') /Creator (ReportLab PDF Library - www.reportlab.com) /Keywords () /ModDate (D:20240718233034+00'00') /Producer (ReportLab PDF Library - www.reportlab.com)
|
||||||
|
/Subject (unspecified) /Title (untitled) /Trapped /False
|
||||||
|
>>
|
||||||
|
endobj
|
||||||
|
8 0 obj
|
||||||
|
<<
|
||||||
|
/Count 3 /Kids [ 3 0 R 4 0 R 5 0 R ] /Type /Pages
|
||||||
|
>>
|
||||||
|
endobj
|
||||||
|
9 0 obj
|
||||||
|
<<
|
||||||
|
/Filter [ /ASCII85Decode /FlateDecode ] /Length 210
|
||||||
|
>>
|
||||||
|
stream
|
||||||
|
Gap@Gb79+X'F"5[`EfJOD4:mD<%*=m+N>oDG,>NK`<U'B^0WYY,dWl^i_UcRk`<"L=<NPC$BtQ<5l$3<Y!?BuoCSYQ6GSt25lpqr0IrP?S[b)9%M"e'HHFqcRO'9eRaR0'DYi*Y.:nEMFAoTM;rPL%EF]`CfoELVl_Q,"LS:%iI;Nc[&bG.*65O]ecfK1'*<>5P_s[usI/ph*0pV~>endstream
|
||||||
|
endobj
|
||||||
|
10 0 obj
|
||||||
|
<<
|
||||||
|
/Filter [ /ASCII85Decode /FlateDecode ] /Length 209
|
||||||
|
>>
|
||||||
|
stream
|
||||||
|
Gap@Gb79+X'F"5Y`EfJOV2A9=!fB]F'tK1LS`,]G+MiTenb&V2-^hqa(5IE#Nr59/!"Qm*5_(BdF!0&h!Yhk/A+\iS'%6tuO$O)9LaZS+flr([1p2&#RS1p/gT[B;rDj-=&=iqUlj(P^/5U@eCFqn4:<lU`l`.HXqG-',hJH.DI.(6L\luSAW`Q'oje[qgVLVIXg%PXe+,<$7('~>endstream
|
||||||
|
endobj
|
||||||
|
11 0 obj
|
||||||
|
<<
|
||||||
|
/Filter [ /ASCII85Decode /FlateDecode ] /Length 209
|
||||||
|
>>
|
||||||
|
stream
|
||||||
|
Gap@GbmK%f(e+0_`ODoa2.):e/i+N3r(.o*Qf\gSNb(bt4FIubi@GIOE=p8Ir3;CbQ@KuG^cdJhODZKQ*upt+*rdZ%!mFmN$*.P)K;`s#]G=8AO3s3DGB.RCOn?[F]bEIg,a>25?B%dh\Z/C6opFE'el@I,P\u\V\]:*JYrrsNJ&d,11VL;$h!43eGu&1X6$+5-h\Vr6!+>4Je,~>endstream
|
||||||
|
endobj
|
||||||
|
xref
|
||||||
|
0 12
|
||||||
|
0000000000 65535 f
|
||||||
|
0000000073 00000 n
|
||||||
|
0000000104 00000 n
|
||||||
|
0000000211 00000 n
|
||||||
|
0000000404 00000 n
|
||||||
|
0000000598 00000 n
|
||||||
|
0000000792 00000 n
|
||||||
|
0000000860 00000 n
|
||||||
|
0000001156 00000 n
|
||||||
|
0000001227 00000 n
|
||||||
|
0000001527 00000 n
|
||||||
|
0000001827 00000 n
|
||||||
|
trailer
|
||||||
|
<<
|
||||||
|
/ID
|
||||||
|
[<0d5cf047e754e05f8d574f067785875c><0d5cf047e754e05f8d574f067785875c>]
|
||||||
|
% ReportLab generated PDF document -- digest (http://www.reportlab.com)
|
||||||
|
|
||||||
|
/Info 7 0 R
|
||||||
|
/Root 6 0 R
|
||||||
|
/Size 12
|
||||||
|
>>
|
||||||
|
startxref
|
||||||
|
2127
|
||||||
|
%%EOF
|
||||||
106
cucumber/exampleFiles/ghost2.pdf
Normal file
106
cucumber/exampleFiles/ghost2.pdf
Normal file
@@ -0,0 +1,106 @@
|
|||||||
|
%PDF-1.3
|
||||||
|
%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com
|
||||||
|
1 0 obj
|
||||||
|
<<
|
||||||
|
/F1 2 0 R
|
||||||
|
>>
|
||||||
|
endobj
|
||||||
|
2 0 obj
|
||||||
|
<<
|
||||||
|
/BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font
|
||||||
|
>>
|
||||||
|
endobj
|
||||||
|
3 0 obj
|
||||||
|
<<
|
||||||
|
/Contents 9 0 R /MediaBox [ 0 0 612 792 ] /Parent 8 0 R /Resources <<
|
||||||
|
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
|
||||||
|
>> /Rotate 0 /Trans <<
|
||||||
|
|
||||||
|
>>
|
||||||
|
/Type /Page
|
||||||
|
>>
|
||||||
|
endobj
|
||||||
|
4 0 obj
|
||||||
|
<<
|
||||||
|
/Contents 10 0 R /MediaBox [ 0 0 612 792 ] /Parent 8 0 R /Resources <<
|
||||||
|
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
|
||||||
|
>> /Rotate 0 /Trans <<
|
||||||
|
|
||||||
|
>>
|
||||||
|
/Type /Page
|
||||||
|
>>
|
||||||
|
endobj
|
||||||
|
5 0 obj
|
||||||
|
<<
|
||||||
|
/Contents 11 0 R /MediaBox [ 0 0 612 792 ] /Parent 8 0 R /Resources <<
|
||||||
|
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
|
||||||
|
>> /Rotate 0 /Trans <<
|
||||||
|
|
||||||
|
>>
|
||||||
|
/Type /Page
|
||||||
|
>>
|
||||||
|
endobj
|
||||||
|
6 0 obj
|
||||||
|
<<
|
||||||
|
/PageMode /UseNone /Pages 8 0 R /Type /Catalog
|
||||||
|
>>
|
||||||
|
endobj
|
||||||
|
7 0 obj
|
||||||
|
<<
|
||||||
|
/Author (anonymous) /CreationDate (D:20240718233034+00'00') /Creator (ReportLab PDF Library - www.reportlab.com) /Keywords () /ModDate (D:20240718233034+00'00') /Producer (ReportLab PDF Library - www.reportlab.com)
|
||||||
|
/Subject (unspecified) /Title (untitled) /Trapped /False
|
||||||
|
>>
|
||||||
|
endobj
|
||||||
|
8 0 obj
|
||||||
|
<<
|
||||||
|
/Count 3 /Kids [ 3 0 R 4 0 R 5 0 R ] /Type /Pages
|
||||||
|
>>
|
||||||
|
endobj
|
||||||
|
9 0 obj
|
||||||
|
<<
|
||||||
|
/Filter [ /ASCII85Decode /FlateDecode ] /Length 207
|
||||||
|
>>
|
||||||
|
stream
|
||||||
|
Gap@G:CDb.*/<p2MVk["e@)7*Z0@"b%+@f/9pA%_U<oOkVp?PnGRb81iPg?0i?(]%^_CSf##%;<!7Ne/-%RR^p@t7hKYZ9eJVHV]fjjHIB:6DrW+2\p16@*`r^CpQZZH'2Pjqd<.&hM2UO%$Wi$te%4QmS;<E"QS\!deQG_XtuEK>b(UbS>%`/0S`k\\5'TNY0mmgH?`8]i_0~>endstream
|
||||||
|
endobj
|
||||||
|
10 0 obj
|
||||||
|
<<
|
||||||
|
/Filter [ /ASCII85Decode /FlateDecode ] /Length 207
|
||||||
|
>>
|
||||||
|
stream
|
||||||
|
Gap@G]afWJ'Lm;=if<;s>V*7BTJ]oQ@P!(q5S+WG1%>L@?8Ue;c>[fY&&IOd5@t@TY@+q.5T<Z'81"J("KhsBa+&u4"n'#6)AjfImh)%$0tVC:aGk",=aJJH#/4]i.WJr9c"cibYm:M-44<%FFlG0Cl\Z'nmo7C"TR+7dk3T#iD(9Pq'\;rQku%o>A_`50SO&7M04=8M'O<Am~>endstream
|
||||||
|
endobj
|
||||||
|
11 0 obj
|
||||||
|
<<
|
||||||
|
/Filter [ /ASCII85Decode /FlateDecode ] /Length 209
|
||||||
|
>>
|
||||||
|
stream
|
||||||
|
Gap@GYmu@>'Ld5[if35r/JNaJ.A.7fP9RpSN*8k^-sEER0,enq1Rsuo@R/uCO-^&Y`F'9d^a?9)?ns+F&dXm[HMgPn6Ep+%TRk5Nh+!(+[H#H:U^.^(YL,PKS'%j/:3O\hJVEK-UUekJTd[A$N^((K^#0Du`i@,/^f5KiUISGr")3/+f9NF8NO1+iUgm^b"X\cE^+[:s!0]Gu6i~>endstream
|
||||||
|
endobj
|
||||||
|
xref
|
||||||
|
0 12
|
||||||
|
0000000000 65535 f
|
||||||
|
0000000073 00000 n
|
||||||
|
0000000104 00000 n
|
||||||
|
0000000211 00000 n
|
||||||
|
0000000404 00000 n
|
||||||
|
0000000598 00000 n
|
||||||
|
0000000792 00000 n
|
||||||
|
0000000860 00000 n
|
||||||
|
0000001156 00000 n
|
||||||
|
0000001227 00000 n
|
||||||
|
0000001524 00000 n
|
||||||
|
0000001822 00000 n
|
||||||
|
trailer
|
||||||
|
<<
|
||||||
|
/ID
|
||||||
|
[<407fc55425168745e56176202aad30c9><407fc55425168745e56176202aad30c9>]
|
||||||
|
% ReportLab generated PDF document -- digest (http://www.reportlab.com)
|
||||||
|
|
||||||
|
/Info 7 0 R
|
||||||
|
/Root 6 0 R
|
||||||
|
/Size 12
|
||||||
|
>>
|
||||||
|
startxref
|
||||||
|
2122
|
||||||
|
%%EOF
|
||||||
106
cucumber/exampleFiles/ghost3.pdf
Normal file
106
cucumber/exampleFiles/ghost3.pdf
Normal file
@@ -0,0 +1,106 @@
|
|||||||
|
%PDF-1.3
|
||||||
|
%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com
|
||||||
|
1 0 obj
|
||||||
|
<<
|
||||||
|
/F1 2 0 R
|
||||||
|
>>
|
||||||
|
endobj
|
||||||
|
2 0 obj
|
||||||
|
<<
|
||||||
|
/BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font
|
||||||
|
>>
|
||||||
|
endobj
|
||||||
|
3 0 obj
|
||||||
|
<<
|
||||||
|
/Contents 9 0 R /MediaBox [ 0 0 612 792 ] /Parent 8 0 R /Resources <<
|
||||||
|
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
|
||||||
|
>> /Rotate 0 /Trans <<
|
||||||
|
|
||||||
|
>>
|
||||||
|
/Type /Page
|
||||||
|
>>
|
||||||
|
endobj
|
||||||
|
4 0 obj
|
||||||
|
<<
|
||||||
|
/Contents 10 0 R /MediaBox [ 0 0 612 792 ] /Parent 8 0 R /Resources <<
|
||||||
|
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
|
||||||
|
>> /Rotate 0 /Trans <<
|
||||||
|
|
||||||
|
>>
|
||||||
|
/Type /Page
|
||||||
|
>>
|
||||||
|
endobj
|
||||||
|
5 0 obj
|
||||||
|
<<
|
||||||
|
/Contents 11 0 R /MediaBox [ 0 0 612 792 ] /Parent 8 0 R /Resources <<
|
||||||
|
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
|
||||||
|
>> /Rotate 0 /Trans <<
|
||||||
|
|
||||||
|
>>
|
||||||
|
/Type /Page
|
||||||
|
>>
|
||||||
|
endobj
|
||||||
|
6 0 obj
|
||||||
|
<<
|
||||||
|
/PageMode /UseNone /Pages 8 0 R /Type /Catalog
|
||||||
|
>>
|
||||||
|
endobj
|
||||||
|
7 0 obj
|
||||||
|
<<
|
||||||
|
/Author (anonymous) /CreationDate (D:20240718233034+00'00') /Creator (ReportLab PDF Library - www.reportlab.com) /Keywords () /ModDate (D:20240718233034+00'00') /Producer (ReportLab PDF Library - www.reportlab.com)
|
||||||
|
/Subject (unspecified) /Title (untitled) /Trapped /False
|
||||||
|
>>
|
||||||
|
endobj
|
||||||
|
8 0 obj
|
||||||
|
<<
|
||||||
|
/Count 3 /Kids [ 3 0 R 4 0 R 5 0 R ] /Type /Pages
|
||||||
|
>>
|
||||||
|
endobj
|
||||||
|
9 0 obj
|
||||||
|
<<
|
||||||
|
/Filter [ /ASCII85Decode /FlateDecode ] /Length 209
|
||||||
|
>>
|
||||||
|
stream
|
||||||
|
Gap@G]+0EH(e/_@iZH]:>:>hu1e>07BJg5<'#:.C1n)e#(QJ6R1Rsuo_gpn.+0-H5$/#"iYR[B.9\'>7!aDAC*rf/t&6O#aH<?-7IT'\?X(&TcABG=ON*Nq`4k=o&p@3,0*31r<)TAP2Pk94p0\"R-_sY1$AYo[8B\?4R>feLAB\mpjZhp"`@J3;"Fm97#9+W,"eb95\+#p\^HN~>endstream
|
||||||
|
endobj
|
||||||
|
10 0 obj
|
||||||
|
<<
|
||||||
|
/Filter [ /ASCII85Decode /FlateDecode ] /Length 209
|
||||||
|
>>
|
||||||
|
stream
|
||||||
|
Gap@G]+0EX'Eriuig+>QHNeD'#n%Sq#n%BW`C'uDUOYK)HdS4E9JMsp+HUmDj&H-t*4?UamXX0peVspk"i_@ba+&u"J>UYDKV_^G,7V==aTZZ<YO7:sNSQ[6"Ja-29NtYjd#=`J@D'h+[QW=:EEb?A<k!f+\`g^?,Vgp7_)91[lR\f.Tkf7VIPLVYM&deF!aYt9Ip^"N",3F'*W~>endstream
|
||||||
|
endobj
|
||||||
|
11 0 obj
|
||||||
|
<<
|
||||||
|
/Filter [ /ASCII85Decode /FlateDecode ] /Length 209
|
||||||
|
>>
|
||||||
|
stream
|
||||||
|
Gap@G]+0EH(e/_@iZH]:>J`g!jPCLm;?AgU"fdk"PQZD\d?lRI_oWc[$tp^]O\:3fK8kWeX2&Jcg0+RoJ]j;2j*upu!b4.o&f)b$I@7CfIYjP^#\VjhC=QhQ]^lV-@<0Tam!0.+Dn@("AK%N,Uc7hb+6VoQ$q2q[7]BB92RoY/.j2N028i1jNf'@<1+Fqf$1&"8omHk`#DHP>OT~>endstream
|
||||||
|
endobj
|
||||||
|
xref
|
||||||
|
0 12
|
||||||
|
0000000000 65535 f
|
||||||
|
0000000073 00000 n
|
||||||
|
0000000104 00000 n
|
||||||
|
0000000211 00000 n
|
||||||
|
0000000404 00000 n
|
||||||
|
0000000598 00000 n
|
||||||
|
0000000792 00000 n
|
||||||
|
0000000860 00000 n
|
||||||
|
0000001156 00000 n
|
||||||
|
0000001227 00000 n
|
||||||
|
0000001526 00000 n
|
||||||
|
0000001826 00000 n
|
||||||
|
trailer
|
||||||
|
<<
|
||||||
|
/ID
|
||||||
|
[<80da26147a484f2b7573da8151a93d2e><80da26147a484f2b7573da8151a93d2e>]
|
||||||
|
% ReportLab generated PDF document -- digest (http://www.reportlab.com)
|
||||||
|
|
||||||
|
/Info 7 0 R
|
||||||
|
/Root 6 0 R
|
||||||
|
/Size 12
|
||||||
|
>>
|
||||||
|
startxref
|
||||||
|
2126
|
||||||
|
%%EOF
|
||||||
1255
cucumber/exampleFiles/images.pdf
Normal file
1255
cucumber/exampleFiles/images.pdf
Normal file
File diff suppressed because it is too large
Load Diff
106
cucumber/exampleFiles/pdfa1.pdf
Normal file
106
cucumber/exampleFiles/pdfa1.pdf
Normal file
@@ -0,0 +1,106 @@
|
|||||||
|
%PDF-1.3
|
||||||
|
%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com
|
||||||
|
1 0 obj
|
||||||
|
<<
|
||||||
|
/F1 2 0 R
|
||||||
|
>>
|
||||||
|
endobj
|
||||||
|
2 0 obj
|
||||||
|
<<
|
||||||
|
/BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font
|
||||||
|
>>
|
||||||
|
endobj
|
||||||
|
3 0 obj
|
||||||
|
<<
|
||||||
|
/Contents 9 0 R /MediaBox [ 0 0 612 792 ] /Parent 8 0 R /Resources <<
|
||||||
|
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
|
||||||
|
>> /Rotate 0 /Trans <<
|
||||||
|
|
||||||
|
>>
|
||||||
|
/Type /Page
|
||||||
|
>>
|
||||||
|
endobj
|
||||||
|
4 0 obj
|
||||||
|
<<
|
||||||
|
/Contents 10 0 R /MediaBox [ 0 0 612 792 ] /Parent 8 0 R /Resources <<
|
||||||
|
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
|
||||||
|
>> /Rotate 0 /Trans <<
|
||||||
|
|
||||||
|
>>
|
||||||
|
/Type /Page
|
||||||
|
>>
|
||||||
|
endobj
|
||||||
|
5 0 obj
|
||||||
|
<<
|
||||||
|
/Contents 11 0 R /MediaBox [ 0 0 612 792 ] /Parent 8 0 R /Resources <<
|
||||||
|
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
|
||||||
|
>> /Rotate 0 /Trans <<
|
||||||
|
|
||||||
|
>>
|
||||||
|
/Type /Page
|
||||||
|
>>
|
||||||
|
endobj
|
||||||
|
6 0 obj
|
||||||
|
<<
|
||||||
|
/PageMode /UseNone /Pages 8 0 R /Type /Catalog
|
||||||
|
>>
|
||||||
|
endobj
|
||||||
|
7 0 obj
|
||||||
|
<<
|
||||||
|
/Author (anonymous) /CreationDate (D:20240718233034+00'00') /Creator (ReportLab PDF Library - www.reportlab.com) /Keywords () /ModDate (D:20240718233034+00'00') /Producer (ReportLab PDF Library - www.reportlab.com)
|
||||||
|
/Subject (unspecified) /Title (untitled) /Trapped /False
|
||||||
|
>>
|
||||||
|
endobj
|
||||||
|
8 0 obj
|
||||||
|
<<
|
||||||
|
/Count 3 /Kids [ 3 0 R 4 0 R 5 0 R ] /Type /Pages
|
||||||
|
>>
|
||||||
|
endobj
|
||||||
|
9 0 obj
|
||||||
|
<<
|
||||||
|
/Filter [ /ASCII85Decode /FlateDecode ] /Length 206
|
||||||
|
>>
|
||||||
|
stream
|
||||||
|
Gap@G\IO3f&4Lr[@S4&T2aReWZ3N'9",Ncra>5AuK^J(o@r?=EP>b]h[L@XZ8q7#[c:#H2:^/=b,p3^,&f-Q.'H%!U?%N\iVa1pLMlh/41\A8@dF5@0al:-1?L;D%LpL3g\9`.3c6N/Mp=sE/nO%^@%Cc3`]e`qqS@[pkUWemMZC<P\fkqa55u)*hIUoU437-gb!e_*&B/,&~>endstream
|
||||||
|
endobj
|
||||||
|
10 0 obj
|
||||||
|
<<
|
||||||
|
/Filter [ /ASCII85Decode /FlateDecode ] /Length 209
|
||||||
|
>>
|
||||||
|
stream
|
||||||
|
Gap@G\IO3V'LdA_ig"8P1PS=kA5Q_GQ\P]*S3\>Q`jHYt?8UdkV`6]UV*On)+1VMV+A@.iF:*6sWfM9f"s.NmVuMto!p7-+,Rb<.h,pdi-&OQ5KO\RRFj.j"A)ScTQ7$hudF^TnZ'XuQA5"O]rYkt><-DJmj'"Ri>n!4`^m409XX`e)AR'*rGsn6m79.18+^ba=qRuss"-A3k+9~>endstream
|
||||||
|
endobj
|
||||||
|
11 0 obj
|
||||||
|
<<
|
||||||
|
/Filter [ /ASCII85Decode /FlateDecode ] /Length 210
|
||||||
|
>>
|
||||||
|
stream
|
||||||
|
Gap@G]+0EH(e/_@iZH]:.1fBHK`Xl'[i1&AjX(\k8hbgo(QJ6R1Rsuo6_I1A5Gg$JL;D#$J2CX;+Cf*cUHk2%H1XmpWe+qZ5moJ#B]>b%%[d,mfSSkS4A:Q4NlOFfrL7eA,s45"eUSakM;927AA,1"-LZ)&nZ/ah=8_X7:?ZMj@J@;r7d`t]Z0\d39M%:$k8[S5D"2oSap4s80l?~>endstream
|
||||||
|
endobj
|
||||||
|
xref
|
||||||
|
0 12
|
||||||
|
0000000000 65535 f
|
||||||
|
0000000073 00000 n
|
||||||
|
0000000104 00000 n
|
||||||
|
0000000211 00000 n
|
||||||
|
0000000404 00000 n
|
||||||
|
0000000598 00000 n
|
||||||
|
0000000792 00000 n
|
||||||
|
0000000860 00000 n
|
||||||
|
0000001156 00000 n
|
||||||
|
0000001227 00000 n
|
||||||
|
0000001523 00000 n
|
||||||
|
0000001823 00000 n
|
||||||
|
trailer
|
||||||
|
<<
|
||||||
|
/ID
|
||||||
|
[<88edee24ee67bd7d6b7cf53cfa2222b0><88edee24ee67bd7d6b7cf53cfa2222b0>]
|
||||||
|
% ReportLab generated PDF document -- digest (http://www.reportlab.com)
|
||||||
|
|
||||||
|
/Info 7 0 R
|
||||||
|
/Root 6 0 R
|
||||||
|
/Size 12
|
||||||
|
>>
|
||||||
|
startxref
|
||||||
|
2124
|
||||||
|
%%EOF
|
||||||
106
cucumber/exampleFiles/pdfa2.pdf
Normal file
106
cucumber/exampleFiles/pdfa2.pdf
Normal file
@@ -0,0 +1,106 @@
|
|||||||
|
%PDF-1.3
|
||||||
|
%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com
|
||||||
|
1 0 obj
|
||||||
|
<<
|
||||||
|
/F1 2 0 R
|
||||||
|
>>
|
||||||
|
endobj
|
||||||
|
2 0 obj
|
||||||
|
<<
|
||||||
|
/BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font
|
||||||
|
>>
|
||||||
|
endobj
|
||||||
|
3 0 obj
|
||||||
|
<<
|
||||||
|
/Contents 9 0 R /MediaBox [ 0 0 612 792 ] /Parent 8 0 R /Resources <<
|
||||||
|
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
|
||||||
|
>> /Rotate 0 /Trans <<
|
||||||
|
|
||||||
|
>>
|
||||||
|
/Type /Page
|
||||||
|
>>
|
||||||
|
endobj
|
||||||
|
4 0 obj
|
||||||
|
<<
|
||||||
|
/Contents 10 0 R /MediaBox [ 0 0 612 792 ] /Parent 8 0 R /Resources <<
|
||||||
|
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
|
||||||
|
>> /Rotate 0 /Trans <<
|
||||||
|
|
||||||
|
>>
|
||||||
|
/Type /Page
|
||||||
|
>>
|
||||||
|
endobj
|
||||||
|
5 0 obj
|
||||||
|
<<
|
||||||
|
/Contents 11 0 R /MediaBox [ 0 0 612 792 ] /Parent 8 0 R /Resources <<
|
||||||
|
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
|
||||||
|
>> /Rotate 0 /Trans <<
|
||||||
|
|
||||||
|
>>
|
||||||
|
/Type /Page
|
||||||
|
>>
|
||||||
|
endobj
|
||||||
|
6 0 obj
|
||||||
|
<<
|
||||||
|
/PageMode /UseNone /Pages 8 0 R /Type /Catalog
|
||||||
|
>>
|
||||||
|
endobj
|
||||||
|
7 0 obj
|
||||||
|
<<
|
||||||
|
/Author (anonymous) /CreationDate (D:20240718233034+00'00') /Creator (ReportLab PDF Library - www.reportlab.com) /Keywords () /ModDate (D:20240718233034+00'00') /Producer (ReportLab PDF Library - www.reportlab.com)
|
||||||
|
/Subject (unspecified) /Title (untitled) /Trapped /False
|
||||||
|
>>
|
||||||
|
endobj
|
||||||
|
8 0 obj
|
||||||
|
<<
|
||||||
|
/Count 3 /Kids [ 3 0 R 4 0 R 5 0 R ] /Type /Pages
|
||||||
|
>>
|
||||||
|
endobj
|
||||||
|
9 0 obj
|
||||||
|
<<
|
||||||
|
/Filter [ /ASCII85Decode /FlateDecode ] /Length 209
|
||||||
|
>>
|
||||||
|
stream
|
||||||
|
Gap@GYmu@>'Ld5[if35rI0]sG)F[U^"c>T)"\\os-r:1V0,enq1Rsuo,*67.@k7U.LRF-P.e"CM2V!>iYi<g`nXh!K?n@$t^rY1$+^0'>=B8H6e;F1WmG#,(eS00(Qe9&:O@nI879DTsT,njXAB?`8:>,Hn3*RV!qh4;&@6%]<9Y*>QZ].Z5o;RAZXg7d[#+bphHs_Ep!QR2TZ2~>endstream
|
||||||
|
endobj
|
||||||
|
10 0 obj
|
||||||
|
<<
|
||||||
|
/Filter [ /ASCII85Decode /FlateDecode ] /Length 210
|
||||||
|
>>
|
||||||
|
stream
|
||||||
|
Gap@G]+0EH(e/_@iZH]:>=,iY1bE)XN?M;1'J/>i&HY;gks]*rj:!DKpb8@`prC#N+9E#o#-<G*!#p7e6j-1sX2k5S,6XmM"taYkfK^k">%usEeEk=sR<UT"dm`rXD;!S`_jS9LU+(R%e'V%WSMfHP.pXZEQqTQq=&D[I[PS(41(NIAZ1R/U?:Z=hSXu!NDF)bpG2F+/I/q/u1-Y~>endstream
|
||||||
|
endobj
|
||||||
|
11 0 obj
|
||||||
|
<<
|
||||||
|
/Filter [ /ASCII85Decode /FlateDecode ] /Length 209
|
||||||
|
>>
|
||||||
|
stream
|
||||||
|
Gap@G_$YcZ'LhbF`EQB$nqi=8S<;#HbK3&f>rnodRPo`Vf4P[3cJidY(I=[K5NWCT'<lHgci?oCRVNST&[k#q4oSC0FWgAt1pD4d_(hIRjn_Nt+cFgJlfm[1U8@/M4r^Pk<@F!@e?%/!-Vq;]nfdLi9]P2M)ck9?)%oNXa_\N<-d"(pjlH%-G`T@Sj&P(j6.@#Xh\Vr6!1iI2/H~>endstream
|
||||||
|
endobj
|
||||||
|
xref
|
||||||
|
0 12
|
||||||
|
0000000000 65535 f
|
||||||
|
0000000073 00000 n
|
||||||
|
0000000104 00000 n
|
||||||
|
0000000211 00000 n
|
||||||
|
0000000404 00000 n
|
||||||
|
0000000598 00000 n
|
||||||
|
0000000792 00000 n
|
||||||
|
0000000860 00000 n
|
||||||
|
0000001156 00000 n
|
||||||
|
0000001227 00000 n
|
||||||
|
0000001526 00000 n
|
||||||
|
0000001827 00000 n
|
||||||
|
trailer
|
||||||
|
<<
|
||||||
|
/ID
|
||||||
|
[<4fcc82a085fe71e34a32d1b23c8b939f><4fcc82a085fe71e34a32d1b23c8b939f>]
|
||||||
|
% ReportLab generated PDF document -- digest (http://www.reportlab.com)
|
||||||
|
|
||||||
|
/Info 7 0 R
|
||||||
|
/Root 6 0 R
|
||||||
|
/Size 12
|
||||||
|
>>
|
||||||
|
startxref
|
||||||
|
2127
|
||||||
|
%%EOF
|
||||||
@@ -14,3 +14,8 @@ def after_scenario(context, scenario):
|
|||||||
os.remove('response_file')
|
os.remove('response_file')
|
||||||
if hasattr(context, 'file_name') and os.path.exists(context.file_name):
|
if hasattr(context, 'file_name') and os.path.exists(context.file_name):
|
||||||
os.remove(context.file_name)
|
os.remove(context.file_name)
|
||||||
|
|
||||||
|
# Remove any temporary files
|
||||||
|
for temp_file in os.listdir('.'):
|
||||||
|
if temp_file.startswith('genericNonCustomisableName') or temp_file.startswith('temp_image_'):
|
||||||
|
os.remove(temp_file)
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
@example
|
@example @general
|
||||||
Feature: API Validation
|
Feature: API Validation
|
||||||
|
|
||||||
@positive @password
|
@positive @password
|
||||||
@@ -92,10 +92,10 @@ Feature: API Validation
|
|||||||
| threshold | 90 |
|
| threshold | 90 |
|
||||||
| whitePercent | 99.9 |
|
| whitePercent | 99.9 |
|
||||||
When I send the API request to the endpoint "/api/v1/misc/remove-blanks"
|
When I send the API request to the endpoint "/api/v1/misc/remove-blanks"
|
||||||
Then the response content type should be "application/pdf"
|
Then the response content type should be "application/octet-stream"
|
||||||
|
And the response file should have extension ".zip"
|
||||||
|
And the response ZIP should contain 1 files
|
||||||
And the response file should have size greater than 0
|
And the response file should have size greater than 0
|
||||||
And the response PDF should contain 0 pages
|
|
||||||
And the response status code should be 200
|
|
||||||
|
|
||||||
@positive @flatten
|
@positive @flatten
|
||||||
Scenario: Flatten PDF
|
Scenario: Flatten PDF
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ Feature: API Validation
|
|||||||
@ocr @positive
|
@ocr @positive
|
||||||
Scenario: Extract Image Scans
|
Scenario: Extract Image Scans
|
||||||
Given I generate a PDF file as "fileInput"
|
Given I generate a PDF file as "fileInput"
|
||||||
And the pdf contains 3 images on 2 pages
|
And the pdf contains 3 images of size 300x300 on 2 pages
|
||||||
And the request data includes
|
And the request data includes
|
||||||
| parameter | value |
|
| parameter | value |
|
||||||
| angleThreshold | 5 |
|
| angleThreshold | 5 |
|
||||||
@@ -125,8 +125,7 @@ Feature: API Validation
|
|||||||
|
|
||||||
@ocr
|
@ocr
|
||||||
Scenario: PDFA
|
Scenario: PDFA
|
||||||
Given I generate a PDF file as "fileInput"
|
Given I use an example file at "exampleFiles/pdfa2.pdf" as parameter "fileInput"
|
||||||
And the pdf contains 3 pages with random text
|
|
||||||
And the request data includes
|
And the request data includes
|
||||||
| parameter | value |
|
| parameter | value |
|
||||||
| outputFormat | pdfa |
|
| outputFormat | pdfa |
|
||||||
@@ -137,8 +136,7 @@ Feature: API Validation
|
|||||||
|
|
||||||
@ocr
|
@ocr
|
||||||
Scenario: PDFA1
|
Scenario: PDFA1
|
||||||
Given I generate a PDF file as "fileInput"
|
Given I use an example file at "exampleFiles/pdfa1.pdf" as parameter "fileInput"
|
||||||
And the pdf contains 3 pages with random text
|
|
||||||
And the request data includes
|
And the request data includes
|
||||||
| parameter | value |
|
| parameter | value |
|
||||||
| outputFormat | pdfa-1 |
|
| outputFormat | pdfa-1 |
|
||||||
@@ -149,8 +147,7 @@ Feature: API Validation
|
|||||||
|
|
||||||
@compress @ghostscript @positive
|
@compress @ghostscript @positive
|
||||||
Scenario: Compress
|
Scenario: Compress
|
||||||
Given I generate a PDF file as "fileInput"
|
Given I use an example file at "exampleFiles/ghost3.pdf" as parameter "fileInput"
|
||||||
And the pdf contains 3 pages with random text
|
|
||||||
And the request data includes
|
And the request data includes
|
||||||
| parameter | value |
|
| parameter | value |
|
||||||
| optimizeLevel | 4 |
|
| optimizeLevel | 4 |
|
||||||
@@ -161,8 +158,7 @@ Feature: API Validation
|
|||||||
|
|
||||||
@compress @ghostscript @positive
|
@compress @ghostscript @positive
|
||||||
Scenario: Compress
|
Scenario: Compress
|
||||||
Given I generate a PDF file as "fileInput"
|
Given I use an example file at "exampleFiles/ghost2.pdf" as parameter "fileInput"
|
||||||
And the pdf contains 3 pages with random text
|
|
||||||
And the request data includes
|
And the request data includes
|
||||||
| parameter | value |
|
| parameter | value |
|
||||||
| optimizeLevel | 1 |
|
| optimizeLevel | 1 |
|
||||||
@@ -175,8 +171,7 @@ Feature: API Validation
|
|||||||
|
|
||||||
@compress @ghostscript @positive
|
@compress @ghostscript @positive
|
||||||
Scenario: Compress
|
Scenario: Compress
|
||||||
Given I generate a PDF file as "fileInput"
|
Given I use an example file at "exampleFiles/ghost1.pdf" as parameter "fileInput"
|
||||||
And the pdf contains 3 pages with random text
|
|
||||||
And the request data includes
|
And the request data includes
|
||||||
| parameter | value |
|
| parameter | value |
|
||||||
| optimizeLevel | 1 |
|
| optimizeLevel | 1 |
|
||||||
|
|||||||
@@ -94,3 +94,23 @@ Feature: API Validation
|
|||||||
| 1 | 10 | 2 | 10 |
|
| 1 | 10 | 2 | 10 |
|
||||||
|
|
||||||
|
|
||||||
|
@extract-images
|
||||||
|
Scenario Outline: Extract Image Scans
|
||||||
|
Given I use an example file at "exampleFiles/images.pdf" as parameter "fileInput"
|
||||||
|
And the request data includes
|
||||||
|
| parameter | value |
|
||||||
|
| format | <format> |
|
||||||
|
When I send the API request to the endpoint "/api/v1/misc/extract-images"
|
||||||
|
Then the response content type should be "application/octet-stream"
|
||||||
|
And the response file should have extension ".zip"
|
||||||
|
And the response ZIP should contain 20 files
|
||||||
|
And the response file should have size greater than 0
|
||||||
|
And the response status code should be 200
|
||||||
|
|
||||||
|
Examples:
|
||||||
|
| format |
|
||||||
|
| png |
|
||||||
|
| gif |
|
||||||
|
| jpeg |
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -6,11 +6,14 @@ import io
|
|||||||
import random
|
import random
|
||||||
import string
|
import string
|
||||||
from reportlab.lib.pagesizes import letter
|
from reportlab.lib.pagesizes import letter
|
||||||
|
from reportlab.lib.utils import ImageReader
|
||||||
from reportlab.pdfgen import canvas
|
from reportlab.pdfgen import canvas
|
||||||
import mimetypes
|
import mimetypes
|
||||||
import requests
|
import requests
|
||||||
import zipfile
|
import zipfile
|
||||||
import shutil
|
import shutil
|
||||||
|
import re
|
||||||
|
from PIL import Image, ImageDraw
|
||||||
|
|
||||||
#########
|
#########
|
||||||
# GIVEN #
|
# GIVEN #
|
||||||
@@ -43,8 +46,6 @@ def step_use_example_file(context, filePath, fileInput):
|
|||||||
except FileNotFoundError:
|
except FileNotFoundError:
|
||||||
raise FileNotFoundError(f"The example file '{filePath}' does not exist.")
|
raise FileNotFoundError(f"The example file '{filePath}' does not exist.")
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@given('the pdf contains {page_count:d} pages')
|
@given('the pdf contains {page_count:d} pages')
|
||||||
def step_pdf_contains_pages(context, page_count):
|
def step_pdf_contains_pages(context, page_count):
|
||||||
writer = PdfWriter()
|
writer = PdfWriter()
|
||||||
@@ -66,8 +67,6 @@ def step_pdf_contains_blank_pages(context, page_count):
|
|||||||
context.files[context.param_name].close()
|
context.files[context.param_name].close()
|
||||||
context.files[context.param_name] = open(context.file_name, 'rb')
|
context.files[context.param_name] = open(context.file_name, 'rb')
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def create_black_box_image(file_name, size):
|
def create_black_box_image(file_name, size):
|
||||||
can = canvas.Canvas(file_name, pagesize=size)
|
can = canvas.Canvas(file_name, pagesize=size)
|
||||||
width, height = size
|
width, height = size
|
||||||
@@ -76,9 +75,25 @@ def create_black_box_image(file_name, size):
|
|||||||
can.showPage()
|
can.showPage()
|
||||||
can.save()
|
can.save()
|
||||||
|
|
||||||
def create_pdf_with_black_boxes(file_name, image_count, page_count):
|
@given(u'the pdf contains {image_count:d} images of size {width:d}x{height:d} on {page_count:d} pages')
|
||||||
page_width, page_height = letter
|
def step_impl(context, image_count, width, height, page_count):
|
||||||
box_size = 72 # 1 inch by 1 inch black box
|
context.param_name = "fileInput"
|
||||||
|
context.file_name = "genericNonCustomisableName.pdf"
|
||||||
|
create_pdf_with_images_and_boxes(context.file_name, image_count, page_count, width, height)
|
||||||
|
if not hasattr(context, 'files'):
|
||||||
|
context.files = {}
|
||||||
|
context.files[context.param_name] = open(context.file_name, 'rb')
|
||||||
|
|
||||||
|
def add_black_boxes_to_image(image):
|
||||||
|
if isinstance(image, str):
|
||||||
|
image = Image.open(image)
|
||||||
|
|
||||||
|
draw = ImageDraw.Draw(image)
|
||||||
|
draw.rectangle([(0, 0), image.size], fill=(0, 0, 0)) # Fill image with black
|
||||||
|
return image
|
||||||
|
|
||||||
|
def create_pdf_with_images_and_boxes(file_name, image_count, page_count, image_width, image_height):
|
||||||
|
page_width, page_height = max(letter[0], image_width), max(letter[1], image_height)
|
||||||
boxes_per_page = image_count // page_count + (1 if image_count % page_count != 0 else 0)
|
boxes_per_page = image_count // page_count + (1 if image_count % page_count != 0 else 0)
|
||||||
|
|
||||||
writer = PdfWriter()
|
writer = PdfWriter()
|
||||||
@@ -86,15 +101,31 @@ def create_pdf_with_black_boxes(file_name, image_count, page_count):
|
|||||||
|
|
||||||
for page in range(page_count):
|
for page in range(page_count):
|
||||||
packet = io.BytesIO()
|
packet = io.BytesIO()
|
||||||
can = canvas.Canvas(packet, pagesize=letter)
|
can = canvas.Canvas(packet, pagesize=(page_width, page_height))
|
||||||
|
|
||||||
for i in range(boxes_per_page):
|
for i in range(boxes_per_page):
|
||||||
if box_counter >= image_count:
|
if box_counter >= image_count:
|
||||||
break
|
break
|
||||||
x = (i % (page_width // box_size)) * box_size
|
|
||||||
y = page_height - ((i // (page_width // box_size) + 1) * box_size)
|
# Simulating a dynamic image creation (replace this with your actual image creation logic)
|
||||||
can.setFillColorRGB(0, 0, 0)
|
# For demonstration, we'll create a simple black image
|
||||||
can.rect(x, y, box_size, box_size, fill=1)
|
dummy_image = Image.new('RGB', (image_width, image_height), color='white') # Create a white image
|
||||||
|
dummy_image = add_black_boxes_to_image(dummy_image) # Add black boxes
|
||||||
|
|
||||||
|
# Convert the PIL Image to bytes to pass to drawImage
|
||||||
|
image_bytes = io.BytesIO()
|
||||||
|
dummy_image.save(image_bytes, format='PNG')
|
||||||
|
image_bytes.seek(0)
|
||||||
|
|
||||||
|
# Check if the image fits in the current page dimensions
|
||||||
|
x = (i % (page_width // image_width)) * image_width
|
||||||
|
y = page_height - (((i % (page_height // image_height)) + 1) * image_height)
|
||||||
|
|
||||||
|
if x + image_width > page_width or y < 0:
|
||||||
|
break
|
||||||
|
|
||||||
|
# Add the image to the PDF
|
||||||
|
can.drawImage(ImageReader(image_bytes), x, y, width=image_width, height=image_height)
|
||||||
box_counter += 1
|
box_counter += 1
|
||||||
|
|
||||||
can.showPage()
|
can.showPage()
|
||||||
@@ -103,9 +134,16 @@ def create_pdf_with_black_boxes(file_name, image_count, page_count):
|
|||||||
new_pdf = PdfReader(packet)
|
new_pdf = PdfReader(packet)
|
||||||
writer.add_page(new_pdf.pages[0])
|
writer.add_page(new_pdf.pages[0])
|
||||||
|
|
||||||
|
# Write the PDF to file
|
||||||
with open(file_name, 'wb') as f:
|
with open(file_name, 'wb') as f:
|
||||||
writer.write(f)
|
writer.write(f)
|
||||||
|
|
||||||
|
# Clean up temporary image files
|
||||||
|
for i in range(image_count):
|
||||||
|
temp_image_path = f"temp_image_{i}.png"
|
||||||
|
if os.path.exists(temp_image_path):
|
||||||
|
os.remove(temp_image_path)
|
||||||
|
|
||||||
@given('the pdf contains {image_count:d} images on {page_count:d} pages')
|
@given('the pdf contains {image_count:d} images on {page_count:d} pages')
|
||||||
def step_pdf_contains_images(context, image_count, page_count):
|
def step_pdf_contains_images(context, image_count, page_count):
|
||||||
if not hasattr(context, 'param_name'):
|
if not hasattr(context, 'param_name'):
|
||||||
@@ -118,7 +156,6 @@ def step_pdf_contains_images(context, image_count, page_count):
|
|||||||
context.files[context.param_name].close()
|
context.files[context.param_name].close()
|
||||||
context.files[context.param_name] = open(context.file_name, 'rb')
|
context.files[context.param_name] = open(context.file_name, 'rb')
|
||||||
|
|
||||||
|
|
||||||
@given('the pdf contains {page_count:d} pages with random text')
|
@given('the pdf contains {page_count:d} pages with random text')
|
||||||
def step_pdf_contains_pages_with_random_text(context, page_count):
|
def step_pdf_contains_pages_with_random_text(context, page_count):
|
||||||
buffer = io.BytesIO()
|
buffer = io.BytesIO()
|
||||||
@@ -186,6 +223,21 @@ def save_generated_pdf(context, filename):
|
|||||||
# WHEN #
|
# WHEN #
|
||||||
########
|
########
|
||||||
|
|
||||||
|
@when('I send a GET request to "{endpoint}"')
|
||||||
|
def step_send_get_request(context, endpoint):
|
||||||
|
base_url = "http://localhost:8080"
|
||||||
|
full_url = f"{base_url}{endpoint}"
|
||||||
|
response = requests.get(full_url)
|
||||||
|
context.response = response
|
||||||
|
|
||||||
|
@when('I send a GET request to "{endpoint}" with parameters')
|
||||||
|
def step_send_get_request_with_params(context, endpoint):
|
||||||
|
base_url = "http://localhost:8080"
|
||||||
|
params = {row['parameter']: row['value'] for row in context.table}
|
||||||
|
full_url = f"{base_url}{endpoint}"
|
||||||
|
response = requests.get(full_url, params=params)
|
||||||
|
context.response = response
|
||||||
|
|
||||||
@when('I send the API request to the endpoint "{endpoint}"')
|
@when('I send the API request to the endpoint "{endpoint}"')
|
||||||
def step_send_api_request(context, endpoint):
|
def step_send_api_request(context, endpoint):
|
||||||
url = f"http://localhost:8080{endpoint}"
|
url = f"http://localhost:8080{endpoint}"
|
||||||
@@ -278,7 +330,6 @@ def step_save_response_file(context, filename):
|
|||||||
f.write(context.response.content)
|
f.write(context.response.content)
|
||||||
print(f"Saved response content to {filename}")
|
print(f"Saved response content to {filename}")
|
||||||
|
|
||||||
|
|
||||||
@then('the response PDF should contain {page_count:d} pages')
|
@then('the response PDF should contain {page_count:d} pages')
|
||||||
def step_check_response_pdf_page_count(context, page_count):
|
def step_check_response_pdf_page_count(context, page_count):
|
||||||
response_file = io.BytesIO(context.response.content)
|
response_file = io.BytesIO(context.response.content)
|
||||||
@@ -305,3 +356,26 @@ def step_check_response_zip_doc_page_count(context, doc_count, pages_per_doc):
|
|||||||
reader = PdfReader(pdf_file)
|
reader = PdfReader(pdf_file)
|
||||||
actual_pages_per_doc = len(reader.pages)
|
actual_pages_per_doc = len(reader.pages)
|
||||||
assert actual_pages_per_doc == pages_per_doc, f"Expected {pages_per_doc} pages per document but got {actual_pages_per_doc} pages in document {file_name}"
|
assert actual_pages_per_doc == pages_per_doc, f"Expected {pages_per_doc} pages per document but got {actual_pages_per_doc} pages in document {file_name}"
|
||||||
|
|
||||||
|
@then('the JSON value of "{key}" should be "{expected_value}"')
|
||||||
|
def step_check_json_value(context, key, expected_value):
|
||||||
|
actual_value = context.response.json().get(key)
|
||||||
|
assert actual_value == expected_value, \
|
||||||
|
f"Expected JSON value for '{key}' to be '{expected_value}' but got '{actual_value}'"
|
||||||
|
|
||||||
|
@then('JSON list entry containing "{identifier_key}" as "{identifier_value}" should have "{target_key}" as "{target_value}"')
|
||||||
|
def step_check_json_list_entry(context, identifier_key, identifier_self, target_key, target_value):
|
||||||
|
json_response = context.response.json()
|
||||||
|
for entry in json_response:
|
||||||
|
if entry.get(identifier_key) == identifier_value:
|
||||||
|
assert entry.get(target_key) == target_value, \
|
||||||
|
f"Expected {target_key} to be {target_value} in entry where {identifier_key} is {identifier_value}, but found {entry.get(target_key)}"
|
||||||
|
break
|
||||||
|
else:
|
||||||
|
raise AssertionError(f"No entry with {identifier_key} as {identifier_value} found")
|
||||||
|
|
||||||
|
@then('the response should match the regex "{pattern}"')
|
||||||
|
def step_response_matches_regex(context, pattern):
|
||||||
|
response_text = context.response.text
|
||||||
|
assert re.match(pattern, response_text), \
|
||||||
|
f"Response '{response_text}' does not match the expected pattern '{pattern}'"
|
||||||
|
|||||||
@@ -22,7 +22,6 @@ services:
|
|||||||
DOCKER_ENABLE_SECURITY: "false"
|
DOCKER_ENABLE_SECURITY: "false"
|
||||||
SECURITY_ENABLELOGIN: "false"
|
SECURITY_ENABLELOGIN: "false"
|
||||||
LANGS: "en_GB,en_US,ar_AR,de_DE,fr_FR,es_ES,zh_CN,zh_TW,ca_CA,it_IT,sv_SE,pl_PL,ro_RO,ko_KR,pt_BR,ru_RU,el_GR,hi_IN,hu_HU,tr_TR,id_ID"
|
LANGS: "en_GB,en_US,ar_AR,de_DE,fr_FR,es_ES,zh_CN,zh_TW,ca_CA,it_IT,sv_SE,pl_PL,ro_RO,ko_KR,pt_BR,ru_RU,el_GR,hi_IN,hu_HU,tr_TR,id_ID"
|
||||||
INSTALL_BOOK_AND_ADVANCED_HTML_OPS: "true"
|
|
||||||
SYSTEM_DEFAULTLOCALE: en-US
|
SYSTEM_DEFAULTLOCALE: en-US
|
||||||
UI_APPNAME: Stirling-PDF
|
UI_APPNAME: Stirling-PDF
|
||||||
UI_HOMEDESCRIPTION: Demo site for Stirling-PDF Latest
|
UI_HOMEDESCRIPTION: Demo site for Stirling-PDF Latest
|
||||||
|
|||||||
@@ -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]
|
||||||
@@ -21,6 +25,11 @@ ignore = [
|
|||||||
'text',
|
'text',
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[da_DK]
|
||||||
|
ignore = [
|
||||||
|
'language.direction',
|
||||||
|
]
|
||||||
|
|
||||||
[de_DE]
|
[de_DE]
|
||||||
ignore = [
|
ignore = [
|
||||||
'AddStampRequest.alphabet',
|
'AddStampRequest.alphabet',
|
||||||
@@ -48,6 +57,7 @@ ignore = [
|
|||||||
ignore = [
|
ignore = [
|
||||||
'adminUserSettings.roles',
|
'adminUserSettings.roles',
|
||||||
'color',
|
'color',
|
||||||
|
'error',
|
||||||
'language.direction',
|
'language.direction',
|
||||||
'no',
|
'no',
|
||||||
'showJS.tags',
|
'showJS.tags',
|
||||||
@@ -60,8 +70,31 @@ 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',
|
'sponsor',
|
||||||
|
'watermark.type.2',
|
||||||
|
]
|
||||||
|
|
||||||
|
[ga_IE]
|
||||||
|
ignore = [
|
||||||
|
'language.direction',
|
||||||
]
|
]
|
||||||
|
|
||||||
[hi_IN]
|
[hi_IN]
|
||||||
@@ -71,6 +104,7 @@ ignore = [
|
|||||||
|
|
||||||
[hr_HR]
|
[hr_HR]
|
||||||
ignore = [
|
ignore = [
|
||||||
|
'PDFToBook.selectText.1',
|
||||||
'font',
|
'font',
|
||||||
'home.pipeline.title',
|
'home.pipeline.title',
|
||||||
'info',
|
'info',
|
||||||
@@ -114,16 +148,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',
|
||||||
]
|
]
|
||||||
|
|
||||||
@@ -149,12 +201,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]
|
||||||
@@ -162,6 +222,14 @@ ignore = [
|
|||||||
'language.direction',
|
'language.direction',
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[th_TH]
|
||||||
|
ignore = [
|
||||||
|
'language.direction',
|
||||||
|
'pipeline.title',
|
||||||
|
'pipelineOptions.pipelineHeader',
|
||||||
|
'showJS.tags',
|
||||||
|
]
|
||||||
|
|
||||||
[tr_TR]
|
[tr_TR]
|
||||||
ignore = [
|
ignore = [
|
||||||
'language.direction',
|
'language.direction',
|
||||||
@@ -172,6 +240,14 @@ ignore = [
|
|||||||
'language.direction',
|
'language.direction',
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[vi_VN]
|
||||||
|
ignore = [
|
||||||
|
'language.direction',
|
||||||
|
'pipeline.title',
|
||||||
|
'pipelineOptions.pipelineHeader',
|
||||||
|
'showJS.tags',
|
||||||
|
]
|
||||||
|
|
||||||
[zh_CN]
|
[zh_CN]
|
||||||
ignore = [
|
ignore = [
|
||||||
'language.direction',
|
'language.direction',
|
||||||
@@ -12,7 +12,8 @@ fi
|
|||||||
umask "$UMASK" || true
|
umask "$UMASK" || true
|
||||||
|
|
||||||
if [[ "$INSTALL_BOOK_AND_ADVANCED_HTML_OPS" == "true" && "$FAT_DOCKER" != "true" ]]; then
|
if [[ "$INSTALL_BOOK_AND_ADVANCED_HTML_OPS" == "true" && "$FAT_DOCKER" != "true" ]]; then
|
||||||
apk add --no-cache calibre@testing
|
echo "issue with calibre in current version, feature currently disabled on Stirling-PDF"
|
||||||
|
#apk add --no-cache calibre@testing
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ "$FAT_DOCKER" != "true" ]]; then
|
if [[ "$FAT_DOCKER" != "true" ]]; then
|
||||||
|
|||||||
@@ -45,7 +45,6 @@ public class SPdfApplication {
|
|||||||
// Check if the BROWSER_OPEN environment variable is set to true
|
// Check if the BROWSER_OPEN environment variable is set to true
|
||||||
String browserOpenEnv = env.getProperty("BROWSER_OPEN");
|
String browserOpenEnv = env.getProperty("BROWSER_OPEN");
|
||||||
boolean browserOpen = browserOpenEnv != null && "true".equalsIgnoreCase(browserOpenEnv);
|
boolean browserOpen = browserOpenEnv != null && "true".equalsIgnoreCase(browserOpenEnv);
|
||||||
|
|
||||||
if (browserOpen) {
|
if (browserOpen) {
|
||||||
try {
|
try {
|
||||||
String url = "http://localhost:" + getNonStaticPort();
|
String url = "http://localhost:" + getNonStaticPort();
|
||||||
@@ -79,13 +78,13 @@ public class SPdfApplication {
|
|||||||
|
|
||||||
// custom javs settings file
|
// custom javs settings file
|
||||||
if (Files.exists(Paths.get("configs/custom_settings.yml"))) {
|
if (Files.exists(Paths.get("configs/custom_settings.yml"))) {
|
||||||
String existing = propertyFiles.getOrDefault("spring.config.additional-location", "");
|
String existingLocation = propertyFiles.getOrDefault("spring.config.additional-location", "");
|
||||||
if (!existing.isEmpty()) {
|
if (!existingLocation.isEmpty()) {
|
||||||
existing += ",";
|
existingLocation += ",";
|
||||||
}
|
}
|
||||||
propertyFiles.put(
|
propertyFiles.put(
|
||||||
"spring.config.additional-location",
|
"spring.config.additional-location",
|
||||||
existing + "file:configs/custom_settings.yml");
|
existingLocation + "file:configs/custom_settings.yml");
|
||||||
} else {
|
} else {
|
||||||
logger.warn("Custom configuration file 'configs/custom_settings.yml' does not exist.");
|
logger.warn("Custom configuration file 'configs/custom_settings.yml' does not exist.");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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(
|
||||||
@@ -31,25 +32,25 @@ public class CleanUrlInterceptor implements HandlerInterceptor {
|
|||||||
String queryString = request.getQueryString();
|
String queryString = request.getQueryString();
|
||||||
if (queryString != null && !queryString.isEmpty()) {
|
if (queryString != null && !queryString.isEmpty()) {
|
||||||
String requestURI = request.getRequestURI();
|
String requestURI = request.getRequestURI();
|
||||||
Map<String, String> parameters = new HashMap<>();
|
Map<String, String> allowedParameters = new HashMap<>();
|
||||||
|
|
||||||
// Keep only the allowed parameters
|
// Keep only the allowed parameters
|
||||||
String[] queryParameters = queryString.split("&");
|
String[] queryParameters = queryString.split("&");
|
||||||
for (String param : queryParameters) {
|
for (String param : queryParameters) {
|
||||||
String[] keyValue = param.split("=");
|
String[] keyValuePair = param.split("=");
|
||||||
if (keyValue.length != 2) {
|
if (keyValuePair.length != 2) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (ALLOWED_PARAMS.contains(keyValue[0])) {
|
if (ALLOWED_PARAMS.contains(keyValuePair[0])) {
|
||||||
parameters.put(keyValue[0], keyValue[1]);
|
allowedParameters.put(keyValuePair[0], keyValuePair[1]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// If there are any parameters that are not allowed
|
// If there are any parameters that are not allowed
|
||||||
if (parameters.size() != queryParameters.length) {
|
if (allowedParameters.size() != queryParameters.length) {
|
||||||
// Construct new query string
|
// Construct new query string
|
||||||
StringBuilder newQueryString = new StringBuilder();
|
StringBuilder newQueryString = new StringBuilder();
|
||||||
for (Map.Entry<String, String> entry : parameters.entrySet()) {
|
for (Map.Entry<String, String> entry : allowedParameters.entrySet()) {
|
||||||
if (newQueryString.length() > 0) {
|
if (newQueryString.length() > 0) {
|
||||||
newQueryString.append("&");
|
newQueryString.append("&");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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();
|
||||||
|
}
|
||||||
@@ -6,28 +6,33 @@ import java.nio.file.Paths;
|
|||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
import org.simpleyaml.configuration.file.YamlFile;
|
import org.simpleyaml.configuration.file.YamlFile;
|
||||||
import org.slf4j.Logger;
|
|
||||||
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();
|
||||||
}
|
}
|
||||||
@@ -41,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
|
||||||
@@ -54,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 {
|
||||||
@@ -64,23 +68,23 @@ 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());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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,205 @@
|
|||||||
|
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.PreparedStatement;
|
||||||
|
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 ?;";
|
||||||
|
|
||||||
|
try (Connection conn = DriverManager.getConnection(url, "sa", "");
|
||||||
|
PreparedStatement stmt = conn.prepareStatement(query)) {
|
||||||
|
stmt.setString(1, insertOutputFilePath.toString());
|
||||||
|
stmt.execute();
|
||||||
|
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) {
|
||||||
|
String query = "RUNSCRIPT from ?;";
|
||||||
|
|
||||||
|
try (Connection conn = DriverManager.getConnection(url, "sa", "");
|
||||||
|
PreparedStatement stmt = conn.prepareStatement(query)) {
|
||||||
|
stmt.setString(1, scriptPath.toString());
|
||||||
|
stmt.execute();
|
||||||
|
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();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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";
|
||||||
@@ -63,7 +65,8 @@ public class UserController {
|
|||||||
@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);
|
||||||
|
|||||||
@@ -1,12 +1,12 @@
|
|||||||
package stirling.software.SPDF.controller.api.misc;
|
package stirling.software.SPDF.controller.api.misc;
|
||||||
|
|
||||||
import java.awt.image.BufferedImage;
|
import java.awt.image.BufferedImage;
|
||||||
|
import java.io.ByteArrayOutputStream;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.stream.Collectors;
|
import java.util.zip.ZipEntry;
|
||||||
import java.util.stream.IntStream;
|
import java.util.zip.ZipOutputStream;
|
||||||
|
|
||||||
import org.apache.pdfbox.Loader;
|
import org.apache.pdfbox.Loader;
|
||||||
import org.apache.pdfbox.pdmodel.PDDocument;
|
import org.apache.pdfbox.pdmodel.PDDocument;
|
||||||
@@ -17,6 +17,7 @@ import org.apache.pdfbox.text.PDFTextStripper;
|
|||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
import org.springframework.http.HttpStatus;
|
import org.springframework.http.HttpStatus;
|
||||||
|
import org.springframework.http.MediaType;
|
||||||
import org.springframework.http.ResponseEntity;
|
import org.springframework.http.ResponseEntity;
|
||||||
import org.springframework.web.bind.annotation.ModelAttribute;
|
import org.springframework.web.bind.annotation.ModelAttribute;
|
||||||
import org.springframework.web.bind.annotation.PostMapping;
|
import org.springframework.web.bind.annotation.PostMapping;
|
||||||
@@ -50,31 +51,31 @@ public class BlankPageController {
|
|||||||
int threshold = request.getThreshold();
|
int threshold = request.getThreshold();
|
||||||
float whitePercent = request.getWhitePercent();
|
float whitePercent = request.getWhitePercent();
|
||||||
|
|
||||||
PDDocument document = null;
|
try (PDDocument document = Loader.loadPDF(inputFile.getBytes())) {
|
||||||
try {
|
|
||||||
document = Loader.loadPDF(inputFile.getBytes());
|
|
||||||
PDPageTree pages = document.getDocumentCatalog().getPages();
|
PDPageTree pages = document.getDocumentCatalog().getPages();
|
||||||
PDFTextStripper textStripper = new PDFTextStripper();
|
PDFTextStripper textStripper = new PDFTextStripper();
|
||||||
|
|
||||||
List<Integer> pagesToKeepIndex = new ArrayList<>();
|
List<PDPage> nonBlankPages = new ArrayList<>();
|
||||||
|
List<PDPage> blankPages = new ArrayList<>();
|
||||||
int pageIndex = 0;
|
int pageIndex = 0;
|
||||||
|
|
||||||
PDFRenderer pdfRenderer = new PDFRenderer(document);
|
PDFRenderer pdfRenderer = new PDFRenderer(document);
|
||||||
pdfRenderer.setSubsamplingAllowed(true);
|
pdfRenderer.setSubsamplingAllowed(true);
|
||||||
for (PDPage page : pages) {
|
for (PDPage page : pages) {
|
||||||
logger.info("checking page " + pageIndex);
|
logger.info("checking page {}", pageIndex);
|
||||||
textStripper.setStartPage(pageIndex + 1);
|
textStripper.setStartPage(pageIndex + 1);
|
||||||
textStripper.setEndPage(pageIndex + 1);
|
textStripper.setEndPage(pageIndex + 1);
|
||||||
String pageText = textStripper.getText(document);
|
String pageText = textStripper.getText(document);
|
||||||
boolean hasText = !pageText.trim().isEmpty();
|
boolean hasText = !pageText.trim().isEmpty();
|
||||||
|
|
||||||
Boolean blank = true;
|
boolean blank = true;
|
||||||
if (hasText) {
|
if (hasText) {
|
||||||
logger.info("page " + pageIndex + " has text, not blank");
|
logger.info("page {} has text, not blank", pageIndex);
|
||||||
blank = false;
|
blank = false;
|
||||||
} else {
|
} else {
|
||||||
boolean hasImages = PdfUtils.hasImagesOnPage(page);
|
boolean hasImages = PdfUtils.hasImagesOnPage(page);
|
||||||
if (hasImages) {
|
if (hasImages) {
|
||||||
logger.info("page " + pageIndex + " has image, running blank detection");
|
logger.info("page {} has image, running blank detection", pageIndex);
|
||||||
// Render image and save as temp file
|
// Render image and save as temp file
|
||||||
BufferedImage image = pdfRenderer.renderImageWithDPI(pageIndex, 30);
|
BufferedImage image = pdfRenderer.renderImageWithDPI(pageIndex, 30);
|
||||||
blank = isBlankImage(image, threshold, whitePercent, threshold);
|
blank = isBlankImage(image, threshold, whitePercent, threshold);
|
||||||
@@ -82,34 +83,57 @@ public class BlankPageController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (blank) {
|
if (blank) {
|
||||||
logger.info("Skipping, Image was blank for page #" + pageIndex);
|
logger.info("Skipping, Image was blank for page #{}", pageIndex);
|
||||||
|
blankPages.add(page);
|
||||||
} else {
|
} else {
|
||||||
logger.info("page " + pageIndex + " has image which is not blank");
|
logger.info("page {} has image which is not blank", pageIndex);
|
||||||
pagesToKeepIndex.add(pageIndex);
|
nonBlankPages.add(page);
|
||||||
}
|
}
|
||||||
|
|
||||||
pageIndex++;
|
pageIndex++;
|
||||||
}
|
}
|
||||||
// Remove pages not present in pagesToKeepIndex
|
|
||||||
List<Integer> pageIndices =
|
ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
||||||
IntStream.range(0, pages.getCount()).boxed().collect(Collectors.toList());
|
ZipOutputStream zos = new ZipOutputStream(baos);
|
||||||
Collections.reverse(pageIndices); // Reverse to prevent index shifting during removal
|
|
||||||
for (Integer i : pageIndices) {
|
String filename =
|
||||||
if (!pagesToKeepIndex.contains(i)) {
|
Filenames.toSimpleFileName(inputFile.getOriginalFilename())
|
||||||
pages.remove(i);
|
.replaceFirst("[.][^.]+$", "");
|
||||||
}
|
|
||||||
|
if (!nonBlankPages.isEmpty()) {
|
||||||
|
createZipEntry(zos, nonBlankPages, filename + "_nonBlankPages.pdf");
|
||||||
|
} else {
|
||||||
|
createZipEntry(zos, blankPages, filename + "_allBlankPages.pdf");
|
||||||
}
|
}
|
||||||
|
|
||||||
return WebResponseUtils.pdfDocToWebResponse(
|
if (!nonBlankPages.isEmpty() && !blankPages.isEmpty()) {
|
||||||
document,
|
createZipEntry(zos, blankPages, filename + "_blankPages.pdf");
|
||||||
Filenames.toSimpleFileName(inputFile.getOriginalFilename())
|
}
|
||||||
.replaceFirst("[.][^.]+$", "")
|
|
||||||
+ "_blanksRemoved.pdf");
|
zos.close();
|
||||||
|
|
||||||
|
logger.info("Returning ZIP file: {}", filename + "_processed.zip");
|
||||||
|
return WebResponseUtils.boasToWebResponse(
|
||||||
|
baos, filename + "_processed.zip", MediaType.APPLICATION_OCTET_STREAM);
|
||||||
|
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
logger.error("exception", e);
|
logger.error("exception", e);
|
||||||
return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
|
return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
|
||||||
} finally {
|
}
|
||||||
if (document != null) document.close();
|
}
|
||||||
|
|
||||||
|
public void createZipEntry(ZipOutputStream zos, List<PDPage> pages, String entryName)
|
||||||
|
throws IOException {
|
||||||
|
try (PDDocument document = new PDDocument()) {
|
||||||
|
|
||||||
|
for (PDPage page : pages) {
|
||||||
|
document.addPage(page);
|
||||||
|
}
|
||||||
|
|
||||||
|
ZipEntry zipEntry = new ZipEntry(entryName);
|
||||||
|
zos.putNextEntry(zipEntry);
|
||||||
|
document.save(zos);
|
||||||
|
zos.closeEntry();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -99,7 +99,7 @@ public class CompressController {
|
|||||||
List<String> command = new ArrayList<>();
|
List<String> command = new ArrayList<>();
|
||||||
command.add("gs");
|
command.add("gs");
|
||||||
command.add("-sDEVICE=pdfwrite");
|
command.add("-sDEVICE=pdfwrite");
|
||||||
command.add("-dCompatibilityLevel=1.4");
|
command.add("-dCompatibilityLevel=1.5");
|
||||||
|
|
||||||
switch (optimizeLevel) {
|
switch (optimizeLevel) {
|
||||||
case 1:
|
case 1:
|
||||||
|
|||||||
@@ -1,21 +1,14 @@
|
|||||||
package stirling.software.SPDF.controller.api.security;
|
package stirling.software.SPDF.controller.api.security;
|
||||||
|
|
||||||
import java.awt.Color;
|
import java.awt.Color;
|
||||||
import java.awt.image.BufferedImage;
|
|
||||||
import java.io.ByteArrayOutputStream;
|
import java.io.ByteArrayOutputStream;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import org.apache.pdfbox.Loader;
|
import org.apache.pdfbox.Loader;
|
||||||
import org.apache.pdfbox.pdmodel.PDDocument;
|
import org.apache.pdfbox.pdmodel.PDDocument;
|
||||||
import org.apache.pdfbox.pdmodel.PDPage;
|
|
||||||
import org.apache.pdfbox.pdmodel.PDPageContentStream;
|
import org.apache.pdfbox.pdmodel.PDPageContentStream;
|
||||||
import org.apache.pdfbox.pdmodel.PDPageContentStream.AppendMode;
|
|
||||||
import org.apache.pdfbox.pdmodel.common.PDRectangle;
|
import org.apache.pdfbox.pdmodel.common.PDRectangle;
|
||||||
import org.apache.pdfbox.pdmodel.graphics.image.LosslessFactory;
|
|
||||||
import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;
|
|
||||||
import org.apache.pdfbox.rendering.ImageType;
|
|
||||||
import org.apache.pdfbox.rendering.PDFRenderer;
|
|
||||||
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;
|
||||||
@@ -32,6 +25,7 @@ import io.swagger.v3.oas.annotations.tags.Tag;
|
|||||||
import stirling.software.SPDF.model.PDFText;
|
import stirling.software.SPDF.model.PDFText;
|
||||||
import stirling.software.SPDF.model.api.security.RedactPdfRequest;
|
import stirling.software.SPDF.model.api.security.RedactPdfRequest;
|
||||||
import stirling.software.SPDF.pdf.TextFinder;
|
import stirling.software.SPDF.pdf.TextFinder;
|
||||||
|
import stirling.software.SPDF.utils.PdfUtils;
|
||||||
import stirling.software.SPDF.utils.WebResponseUtils;
|
import stirling.software.SPDF.utils.WebResponseUtils;
|
||||||
|
|
||||||
@RestController
|
@RestController
|
||||||
@@ -81,22 +75,9 @@ public class RedactController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (convertPDFToImage) {
|
if (convertPDFToImage) {
|
||||||
PDDocument imageDocument = new PDDocument();
|
PDDocument convertedPdf = PdfUtils.convertPdfToPdfImage(document);
|
||||||
PDFRenderer pdfRenderer = new PDFRenderer(document);
|
|
||||||
pdfRenderer.setSubsamplingAllowed(true);
|
|
||||||
for (int page = 0; page < document.getNumberOfPages(); ++page) {
|
|
||||||
BufferedImage bim = pdfRenderer.renderImageWithDPI(page, 300, ImageType.RGB);
|
|
||||||
PDPage newPage = new PDPage(new PDRectangle(bim.getWidth(), bim.getHeight()));
|
|
||||||
imageDocument.addPage(newPage);
|
|
||||||
PDImageXObject pdImage = LosslessFactory.createFromImage(imageDocument, bim);
|
|
||||||
PDPageContentStream contentStream =
|
|
||||||
new PDPageContentStream(
|
|
||||||
imageDocument, newPage, AppendMode.APPEND, true, true);
|
|
||||||
contentStream.drawImage(pdImage, 0, 0);
|
|
||||||
contentStream.close();
|
|
||||||
}
|
|
||||||
document.close();
|
document.close();
|
||||||
document = imageDocument;
|
document = convertedPdf;
|
||||||
}
|
}
|
||||||
|
|
||||||
ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
||||||
|
|||||||
@@ -36,6 +36,7 @@ import io.swagger.v3.oas.annotations.Operation;
|
|||||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||||
|
|
||||||
import stirling.software.SPDF.model.api.security.AddWatermarkRequest;
|
import stirling.software.SPDF.model.api.security.AddWatermarkRequest;
|
||||||
|
import stirling.software.SPDF.utils.PdfUtils;
|
||||||
import stirling.software.SPDF.utils.WebResponseUtils;
|
import stirling.software.SPDF.utils.WebResponseUtils;
|
||||||
|
|
||||||
@RestController
|
@RestController
|
||||||
@@ -60,6 +61,7 @@ public class WatermarkController {
|
|||||||
float opacity = request.getOpacity();
|
float opacity = request.getOpacity();
|
||||||
int widthSpacer = request.getWidthSpacer();
|
int widthSpacer = request.getWidthSpacer();
|
||||||
int heightSpacer = request.getHeightSpacer();
|
int heightSpacer = request.getHeightSpacer();
|
||||||
|
boolean convertPdfToImage = request.isConvertPDFToImage();
|
||||||
|
|
||||||
// Load the input PDF
|
// Load the input PDF
|
||||||
PDDocument document = Loader.loadPDF(pdfFile.getBytes());
|
PDDocument document = Loader.loadPDF(pdfFile.getBytes());
|
||||||
@@ -104,6 +106,12 @@ public class WatermarkController {
|
|||||||
contentStream.close();
|
contentStream.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (convertPdfToImage) {
|
||||||
|
PDDocument convertedPdf = PdfUtils.convertPdfToPdfImage(document);
|
||||||
|
document.close();
|
||||||
|
document = convertedPdf;
|
||||||
|
}
|
||||||
|
|
||||||
return WebResponseUtils.pdfDocToWebResponse(
|
return WebResponseUtils.pdfDocToWebResponse(
|
||||||
document,
|
document,
|
||||||
Filenames.toSimpleFileName(pdfFile.getOriginalFilename())
|
Filenames.toSimpleFileName(pdfFile.getOriginalFilename())
|
||||||
|
|||||||
@@ -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,6 +73,10 @@ 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("loginMethod", applicationProperties.getSecurity().getLoginMethod());
|
||||||
|
|||||||
@@ -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";
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -360,6 +360,8 @@ public class ApplicationProperties {
|
|||||||
+ useAsUsername
|
+ useAsUsername
|
||||||
+ ", provider="
|
+ ", provider="
|
||||||
+ provider
|
+ provider
|
||||||
|
+ ", client="
|
||||||
|
+ client
|
||||||
+ ", scopes="
|
+ ", scopes="
|
||||||
+ scopes
|
+ scopes
|
||||||
+ "]";
|
+ "]";
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|
||||||
|
|||||||
@@ -44,4 +44,7 @@ public class AddWatermarkRequest extends PDFFile {
|
|||||||
|
|
||||||
@Schema(description = "The height spacer between watermark elements", example = "50")
|
@Schema(description = "The height spacer between watermark elements", example = "50")
|
||||||
private int heightSpacer;
|
private int heightSpacer;
|
||||||
|
|
||||||
|
@Schema(description = "Convert the redacted PDF to an image", defaultValue = "false")
|
||||||
|
private boolean convertPDFToImage;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,9 +3,11 @@ package stirling.software.SPDF.repository;
|
|||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
import org.springframework.data.jpa.repository.JpaRepository;
|
import org.springframework.data.jpa.repository.JpaRepository;
|
||||||
|
import org.springframework.stereotype.Repository;
|
||||||
|
|
||||||
import stirling.software.SPDF.model.Authority;
|
import stirling.software.SPDF.model.Authority;
|
||||||
|
|
||||||
|
@Repository
|
||||||
public interface AuthorityRepository extends JpaRepository<Authority, Long> {
|
public interface AuthorityRepository extends JpaRepository<Authority, Long> {
|
||||||
// Set<Authority> findByUsername(String username);
|
// Set<Authority> findByUsername(String username);
|
||||||
Set<Authority> findByUser_Username(String username);
|
Set<Authority> findByUser_Username(String username);
|
||||||
|
|||||||
@@ -1,7 +1,9 @@
|
|||||||
package stirling.software.SPDF.repository;
|
package stirling.software.SPDF.repository;
|
||||||
|
|
||||||
import org.springframework.data.jpa.repository.JpaRepository;
|
import org.springframework.data.jpa.repository.JpaRepository;
|
||||||
|
import org.springframework.stereotype.Repository;
|
||||||
|
|
||||||
import stirling.software.SPDF.model.PersistentLogin;
|
import stirling.software.SPDF.model.PersistentLogin;
|
||||||
|
|
||||||
|
@Repository
|
||||||
public interface PersistentLoginRepository extends JpaRepository<PersistentLogin, String> {}
|
public interface PersistentLoginRepository extends JpaRepository<PersistentLogin, String> {}
|
||||||
|
|||||||
@@ -3,10 +3,12 @@ package stirling.software.SPDF.repository;
|
|||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
|
|
||||||
import org.springframework.data.jpa.repository.JpaRepository;
|
import org.springframework.data.jpa.repository.JpaRepository;
|
||||||
|
import org.springframework.stereotype.Repository;
|
||||||
|
|
||||||
import stirling.software.SPDF.model.User;
|
import stirling.software.SPDF.model.User;
|
||||||
|
|
||||||
public interface UserRepository extends JpaRepository<User, String> {
|
@Repository
|
||||||
|
public interface UserRepository extends JpaRepository<User, Long> {
|
||||||
Optional<User> findByUsernameIgnoreCase(String username);
|
Optional<User> findByUsernameIgnoreCase(String username);
|
||||||
|
|
||||||
Optional<User> findByUsername(String username);
|
Optional<User> findByUsername(String username);
|
||||||
|
|||||||
50
src/main/java/stirling/software/SPDF/utils/FileInfo.java
Normal file
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -341,6 +341,30 @@ public class PdfUtils {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Converts a given Pdf file to PDF-Image.
|
||||||
|
*
|
||||||
|
* @param document to be converted. Note: the caller is responsible for closing the document
|
||||||
|
* @return converted document to PDF-Image
|
||||||
|
* @throws IOException if conversion fails
|
||||||
|
*/
|
||||||
|
public static PDDocument convertPdfToPdfImage(PDDocument document) throws IOException {
|
||||||
|
PDDocument imageDocument = new PDDocument();
|
||||||
|
PDFRenderer pdfRenderer = new PDFRenderer(document);
|
||||||
|
pdfRenderer.setSubsamplingAllowed(true);
|
||||||
|
for (int page = 0; page < document.getNumberOfPages(); ++page) {
|
||||||
|
BufferedImage bim = pdfRenderer.renderImageWithDPI(page, 300, ImageType.RGB);
|
||||||
|
PDPage newPage = new PDPage(new PDRectangle(bim.getWidth(), bim.getHeight()));
|
||||||
|
imageDocument.addPage(newPage);
|
||||||
|
PDImageXObject pdImage = LosslessFactory.createFromImage(imageDocument, bim);
|
||||||
|
PDPageContentStream contentStream =
|
||||||
|
new PDPageContentStream(imageDocument, newPage, AppendMode.APPEND, true, true);
|
||||||
|
contentStream.drawImage(pdImage, 0, 0);
|
||||||
|
contentStream.close();
|
||||||
|
}
|
||||||
|
return imageDocument;
|
||||||
|
}
|
||||||
|
|
||||||
private static BufferedImage prepareImageForPdfToImage(
|
private static BufferedImage prepareImageForPdfToImage(
|
||||||
int maxWidth, int height, String imageType) {
|
int maxWidth, int height, String imageType) {
|
||||||
BufferedImage combined;
|
BufferedImage combined;
|
||||||
|
|||||||
@@ -191,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 #
|
||||||
#############
|
#############
|
||||||
@@ -689,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=يقارن
|
||||||
@@ -926,6 +945,7 @@ watermark.selectText.6=heightSpacer (مسافة بين كل علامة مائي
|
|||||||
watermark.selectText.7=التعتيم (0٪ - 100٪):
|
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.selectText.10=Convert PDF to PDF-Image
|
||||||
watermark.submit=إضافة علامة مائية
|
watermark.submit=إضافة علامة مائية
|
||||||
watermark.type.1=نص
|
watermark.type.1=نص
|
||||||
watermark.type.2=صورة
|
watermark.type.2=صورة
|
||||||
@@ -1105,4 +1125,3 @@ error.showStack=Show Stack Trace
|
|||||||
error.copyStack=Copy Stack Trace
|
error.copyStack=Copy Stack Trace
|
||||||
error.githubSubmit=GitHub - Submit a ticket
|
error.githubSubmit=GitHub - Submit a ticket
|
||||||
error.discordSubmit=Discord - Submit Support post
|
error.discordSubmit=Discord - Submit Support post
|
||||||
|
|
||||||
|
|||||||
@@ -191,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 #
|
||||||
#############
|
#############
|
||||||
@@ -689,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=Сравнявай
|
||||||
@@ -926,6 +945,7 @@ watermark.selectText.6=дължинаSpacer (Разстояние между в
|
|||||||
watermark.selectText.7=Непрозрачност (0% - 100%):
|
watermark.selectText.7=Непрозрачност (0% - 100%):
|
||||||
watermark.selectText.8=Тип воден знак:
|
watermark.selectText.8=Тип воден знак:
|
||||||
watermark.selectText.9=Изображение за воден знак:
|
watermark.selectText.9=Изображение за воден знак:
|
||||||
|
watermark.selectText.10=Convert PDF to PDF-Image
|
||||||
watermark.submit=Добавяне на воден знак
|
watermark.submit=Добавяне на воден знак
|
||||||
watermark.type.1=Текст
|
watermark.type.1=Текст
|
||||||
watermark.type.2=Изображение
|
watermark.type.2=Изображение
|
||||||
@@ -1105,4 +1125,3 @@ error.showStack=Покажи проследяване на стека
|
|||||||
error.copyStack=Копиране на проследяване на стека
|
error.copyStack=Копиране на проследяване на стека
|
||||||
error.githubSubmit=GitHub - Изпратете запитване
|
error.githubSubmit=GitHub - Изпратете запитване
|
||||||
error.discordSubmit=Discord - Изпратете запитване за поддръжка
|
error.discordSubmit=Discord - Изпратете запитване за поддръжка
|
||||||
|
|
||||||
|
|||||||
@@ -191,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 #
|
||||||
#############
|
#############
|
||||||
@@ -689,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
|
||||||
@@ -926,6 +945,7 @@ watermark.selectText.6=separació d'alçada (Espai vertical entre cada Marca d'A
|
|||||||
watermark.selectText.7=Opacitat (0% - 100%):
|
watermark.selectText.7=Opacitat (0% - 100%):
|
||||||
watermark.selectText.8=Watermark Type:
|
watermark.selectText.8=Watermark Type:
|
||||||
watermark.selectText.9=Watermark Image:
|
watermark.selectText.9=Watermark Image:
|
||||||
|
watermark.selectText.10=Convert PDF to PDF-Image
|
||||||
watermark.submit=Afegir Marca d'Aigua
|
watermark.submit=Afegir Marca d'Aigua
|
||||||
watermark.type.1=Text
|
watermark.type.1=Text
|
||||||
watermark.type.2=Image
|
watermark.type.2=Image
|
||||||
@@ -1105,4 +1125,3 @@ error.showStack=Show Stack Trace
|
|||||||
error.copyStack=Copy Stack Trace
|
error.copyStack=Copy Stack Trace
|
||||||
error.githubSubmit=GitHub - Submit a ticket
|
error.githubSubmit=GitHub - Submit a ticket
|
||||||
error.discordSubmit=Discord - Submit Support post
|
error.discordSubmit=Discord - Submit Support post
|
||||||
|
|
||||||
|
|||||||
@@ -191,6 +191,23 @@ 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 #
|
||||||
#############
|
#############
|
||||||
@@ -689,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
|
||||||
@@ -926,6 +945,7 @@ watermark.selectText.6=Výška mezery (Mezera mezi každým vodoznakem svisle):
|
|||||||
watermark.selectText.7=Průhlednost (0% - 100%):
|
watermark.selectText.7=Průhlednost (0% - 100%):
|
||||||
watermark.selectText.8=Typ vodoznaku:
|
watermark.selectText.8=Typ vodoznaku:
|
||||||
watermark.selectText.9=Obrázek vodoznaku:
|
watermark.selectText.9=Obrázek vodoznaku:
|
||||||
|
watermark.selectText.10=Convert PDF to PDF-Image
|
||||||
watermark.submit=Přidat vodoznak
|
watermark.submit=Přidat vodoznak
|
||||||
watermark.type.1=Text
|
watermark.type.1=Text
|
||||||
watermark.type.2=Obrázek
|
watermark.type.2=Obrázek
|
||||||
@@ -1105,4 +1125,3 @@ error.showStack=Zobrazit stopu zásobníku
|
|||||||
error.copyStack=Kopírovat stopu zásobníku
|
error.copyStack=Kopírovat stopu zásobníku
|
||||||
error.githubSubmit=GitHub - Odeslat požadavek
|
error.githubSubmit=GitHub - Odeslat požadavek
|
||||||
error.discordSubmit=Discord - Odeslat příspěvek podpory
|
error.discordSubmit=Discord - Odeslat příspěvek podpory
|
||||||
|
|
||||||
|
|||||||
1127
src/main/resources/messages_da_DK.properties
Normal file
1127
src/main/resources/messages_da_DK.properties
Normal file
File diff suppressed because it is too large
Load Diff
@@ -86,7 +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=Are you sure you want to delete pipeline
|
pipeline.deletePrompt=Möchten Sie die Pipeline wirklich löschen?
|
||||||
|
|
||||||
######################
|
######################
|
||||||
# Pipeline Options #
|
# Pipeline Options #
|
||||||
@@ -191,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 #
|
||||||
#############
|
#############
|
||||||
@@ -689,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
|
||||||
@@ -926,6 +945,7 @@ watermark.selectText.6=höheSpacer (vertikaler Abstand zwischen den einzelnen Wa
|
|||||||
watermark.selectText.7=Deckkraft (0% - 100 %):
|
watermark.selectText.7=Deckkraft (0% - 100 %):
|
||||||
watermark.selectText.8=Wasserzeichen Typ:
|
watermark.selectText.8=Wasserzeichen Typ:
|
||||||
watermark.selectText.9=Wasserzeichen-Bild:
|
watermark.selectText.9=Wasserzeichen-Bild:
|
||||||
|
watermark.selectText.10=Convert PDF to PDF-Image
|
||||||
watermark.submit=Wasserzeichen hinzufügen
|
watermark.submit=Wasserzeichen hinzufügen
|
||||||
watermark.type.1=Text
|
watermark.type.1=Text
|
||||||
watermark.type.2=Bild
|
watermark.type.2=Bild
|
||||||
@@ -1084,13 +1104,13 @@ licenses.version=Version
|
|||||||
licenses.license=Lizenz
|
licenses.license=Lizenz
|
||||||
|
|
||||||
#survey
|
#survey
|
||||||
survey.nav=Survey
|
survey.nav=Umfrage
|
||||||
survey.title=Stirling-PDF Survey
|
survey.title=Stirling-PDF-Umfrage
|
||||||
survey.description=Stirling-PDF has no tracking so we want to hear from our users to improve Stirling-PDF!
|
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=Please consider taking our survey!
|
survey.please=Bitte nehmen Sie an unserer Umfrage teil!
|
||||||
survey.disabled=(Survey popup will be disabled in following updates but available at foot of page)
|
survey.disabled=(Das Umfrage-Popup wird in folgenden Updates deaktiviert, ist aber am Fuß der Seite verfügbar.)
|
||||||
survey.button=Take Survey
|
survey.button=Umfrage durchführen
|
||||||
survey.dontShowAgain=Don't show again
|
survey.dontShowAgain=Nicht mehr anzeigen
|
||||||
|
|
||||||
|
|
||||||
#error
|
#error
|
||||||
@@ -1105,4 +1125,3 @@ error.showStack=Stack-Trace anzeigen
|
|||||||
error.copyStack=Stack-Trace kopieren
|
error.copyStack=Stack-Trace kopieren
|
||||||
error.githubSubmit=GitHub - Ein Ticket einreichen
|
error.githubSubmit=GitHub - Ein Ticket einreichen
|
||||||
error.discordSubmit=Discord - Unterstützungsbeitrag einreichen
|
error.discordSubmit=Discord - Unterstützungsbeitrag einreichen
|
||||||
|
|
||||||
|
|||||||
@@ -191,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 #
|
||||||
#############
|
#############
|
||||||
@@ -689,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=Σύγκριση
|
||||||
@@ -926,6 +945,7 @@ watermark.selectText.6=heightSpacer (Κενό μεταξύ κάθε υδατογ
|
|||||||
watermark.selectText.7=Αδιαφάνεια (Opacity) (0% - 100%):
|
watermark.selectText.7=Αδιαφάνεια (Opacity) (0% - 100%):
|
||||||
watermark.selectText.8=Τύπος Υδατογραφήματος:
|
watermark.selectText.8=Τύπος Υδατογραφήματος:
|
||||||
watermark.selectText.9=Εικόνα Υδατογραφήματος:
|
watermark.selectText.9=Εικόνα Υδατογραφήματος:
|
||||||
|
watermark.selectText.10=Convert PDF to PDF-Image
|
||||||
watermark.submit=Προσθήκη Υδατογραφήματος
|
watermark.submit=Προσθήκη Υδατογραφήματος
|
||||||
watermark.type.1=Κείμενο
|
watermark.type.1=Κείμενο
|
||||||
watermark.type.2=Εικόνα
|
watermark.type.2=Εικόνα
|
||||||
@@ -1105,4 +1125,3 @@ error.showStack=Εμφάνιση Stack Trace
|
|||||||
error.copyStack=Αντιγραφή Stack Trace
|
error.copyStack=Αντιγραφή Stack Trace
|
||||||
error.githubSubmit=GitHub - Υποβάλετε ένα ticket
|
error.githubSubmit=GitHub - Υποβάλετε ένα ticket
|
||||||
error.discordSubmit=Discord - Υποβάλετε ένα Support post
|
error.discordSubmit=Discord - Υποβάλετε ένα Support post
|
||||||
|
|
||||||
|
|||||||
@@ -191,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 #
|
||||||
#############
|
#############
|
||||||
@@ -689,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
|
||||||
@@ -926,6 +945,7 @@ watermark.selectText.6=heightSpacer (Space between each watermark vertically):
|
|||||||
watermark.selectText.7=Opacity (0% - 100%):
|
watermark.selectText.7=Opacity (0% - 100%):
|
||||||
watermark.selectText.8=Watermark Type:
|
watermark.selectText.8=Watermark Type:
|
||||||
watermark.selectText.9=Watermark Image:
|
watermark.selectText.9=Watermark Image:
|
||||||
|
watermark.selectText.10=Convert PDF to PDF-Image
|
||||||
watermark.submit=Add Watermark
|
watermark.submit=Add Watermark
|
||||||
watermark.type.1=Text
|
watermark.type.1=Text
|
||||||
watermark.type.2=Image
|
watermark.type.2=Image
|
||||||
@@ -1105,4 +1125,3 @@ error.showStack=Show Stack Trace
|
|||||||
error.copyStack=Copy Stack Trace
|
error.copyStack=Copy Stack Trace
|
||||||
error.githubSubmit=GitHub - Submit a ticket
|
error.githubSubmit=GitHub - Submit a ticket
|
||||||
error.discordSubmit=Discord - Submit Support post
|
error.discordSubmit=Discord - Submit Support post
|
||||||
|
|
||||||
|
|||||||
@@ -191,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 #
|
||||||
#############
|
#############
|
||||||
@@ -689,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
|
||||||
@@ -926,6 +945,7 @@ watermark.selectText.6=heightSpacer (Space between each watermark vertically):
|
|||||||
watermark.selectText.7=Opacity (0% - 100%):
|
watermark.selectText.7=Opacity (0% - 100%):
|
||||||
watermark.selectText.8=Watermark Type:
|
watermark.selectText.8=Watermark Type:
|
||||||
watermark.selectText.9=Watermark Image:
|
watermark.selectText.9=Watermark Image:
|
||||||
|
watermark.selectText.10=Convert PDF to PDF-Image
|
||||||
watermark.submit=Add Watermark
|
watermark.submit=Add Watermark
|
||||||
watermark.type.1=Text
|
watermark.type.1=Text
|
||||||
watermark.type.2=Image
|
watermark.type.2=Image
|
||||||
@@ -1105,4 +1125,3 @@ error.showStack=Show Stack Trace
|
|||||||
error.copyStack=Copy Stack Trace
|
error.copyStack=Copy Stack Trace
|
||||||
error.githubSubmit=GitHub - Submit a ticket
|
error.githubSubmit=GitHub - Submit a ticket
|
||||||
error.discordSubmit=Discord - Submit Support post
|
error.discordSubmit=Discord - Submit Support post
|
||||||
|
|
||||||
|
|||||||
@@ -60,11 +60,11 @@ deleteCurrentUserMessage=No puede eliminar el usuario que tiene la sesión actua
|
|||||||
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
|
||||||
downgradeCurrentUserLongMessage=No se puede degradar el rol del usuario actual. Por lo tanto, el usuario actual no se mostrará.
|
downgradeCurrentUserLongMessage=No se puede degradar el rol del usuario actual. Por lo tanto, el usuario actual no se mostrará.
|
||||||
userAlreadyExistsOAuthMessage=The user already exists as an OAuth2 user.
|
userAlreadyExistsOAuthMessage=La usuario ya existe como usuario de OAuth2.
|
||||||
userAlreadyExistsWebMessage=The user already exists as an web user.
|
userAlreadyExistsWebMessage=El usuario ya existe como usuario web.
|
||||||
error=Error
|
error=Error
|
||||||
oops=Ups!
|
oops=Ups!
|
||||||
help=Help
|
help=Ayuda
|
||||||
goHomepage=Ir a la página principal
|
goHomepage=Ir a la página principal
|
||||||
joinDiscord=Únase a nuestro servidor Discord
|
joinDiscord=Únase a nuestro servidor Discord
|
||||||
seeDockerHub=Ver Docker Hub
|
seeDockerHub=Ver Docker Hub
|
||||||
@@ -86,7 +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.deletePrompt=¿Estás segura de que quieres eliminar la canalización?
|
||||||
|
|
||||||
######################
|
######################
|
||||||
# Pipeline Options #
|
# Pipeline Options #
|
||||||
@@ -107,18 +107,18 @@ pipelineOptions.validateButton=Validar
|
|||||||
#############
|
#############
|
||||||
# NAVBAR #
|
# NAVBAR #
|
||||||
#############
|
#############
|
||||||
navbar.favorite=Favorites
|
navbar.favorite=Favoritos
|
||||||
navbar.darkmode=Modo oscuro
|
navbar.darkmode=Modo oscuro
|
||||||
navbar.language=Languages
|
navbar.language=Idiomas
|
||||||
navbar.settings=Configuración
|
navbar.settings=Configuración
|
||||||
navbar.allTools=Tools
|
navbar.allTools=Herramientas
|
||||||
navbar.multiTool=Multi Tools
|
navbar.multiTool=Multi herramientas
|
||||||
navbar.sections.organize=Organize
|
navbar.sections.organize=Organize
|
||||||
navbar.sections.convertTo=Convert to PDF
|
navbar.sections.convertTo=Convertir a PDF
|
||||||
navbar.sections.convertFrom=Convert from PDF
|
navbar.sections.convertFrom=Convertir desde PDF
|
||||||
navbar.sections.security=Sign & Security
|
navbar.sections.security=Señalización y seguridad
|
||||||
navbar.sections.advance=Advanced
|
navbar.sections.advance=Avanzado
|
||||||
navbar.sections.edit=View & Edit
|
navbar.sections.edit=Ver y Editar
|
||||||
|
|
||||||
#############
|
#############
|
||||||
# SETTINGS #
|
# SETTINGS #
|
||||||
@@ -175,8 +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.deleteUser=Eliminar Usuario
|
||||||
adminUserSettings.confirmDeleteUser=Should the user be deleted?
|
adminUserSettings.confirmDeleteUser=¿Se debe eliminar al usuario?
|
||||||
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
|
||||||
@@ -189,7 +189,24 @@ adminUserSettings.internalApiUser=Usuario interno de API
|
|||||||
adminUserSettings.forceChange=Forzar usuario a cambiar usuario/contraseña en el acceso
|
adminUserSettings.forceChange=Forzar usuario a cambiar usuario/contraseña en el acceso
|
||||||
adminUserSettings.submit=Guardar Usuario
|
adminUserSettings.submit=Guardar Usuario
|
||||||
adminUserSettings.changeUserRole=Cambiar rol de usuario
|
adminUserSettings.changeUserRole=Cambiar rol de usuario
|
||||||
adminUserSettings.authenticated=Authenticated
|
adminUserSettings.authenticated=Autenticado
|
||||||
|
|
||||||
|
|
||||||
|
database.title=Base de Datos Importar/Exportar
|
||||||
|
database.header=Base de Datos Importar/Exportar
|
||||||
|
database.fileName=Nombre de Archivo
|
||||||
|
database.creationDate=Fecha de creación
|
||||||
|
database.fileSize=Tamaño de archivo
|
||||||
|
database.deleteBackupFile=Eliminar archivo de copia de seguridad
|
||||||
|
database.importBackupFile=Importar archivo de copia de seguridad
|
||||||
|
database.downloadBackupFile=Descargar archivo de copia de seguridad
|
||||||
|
database.info_1=Al importar datos, es fundamental garantizar la estructura correcta. Si no está seguro de lo que está haciendo, busque consejo y apoyo de un profesional. Un error en la estructura puede causar un mal funcionamiento de la aplicación, incluyendo la imposibilidad total de ejecutar la aplicación.
|
||||||
|
database.info_2=El nombre del archivo no importa al cargarlo. Posteriormente se le cambiará el nombre para que siga el formato backup_user_yyyyMMddHHmm.sql, lo que garantiza una convención de nomenclatura coherente.
|
||||||
|
database.submit=Importar Backup
|
||||||
|
database.importIntoDatabaseSuccessed=Importación a la base de datos ha sido exitosa
|
||||||
|
database.fileNotFound=Archivo no encontrado
|
||||||
|
database.fileNullOrEmpty=El archivo no debe ser nulo o vacío.
|
||||||
|
database.failedImportFile=Archivo de importación fallido
|
||||||
|
|
||||||
#############
|
#############
|
||||||
# HOME-PAGE #
|
# HOME-PAGE #
|
||||||
@@ -336,8 +353,8 @@ home.certSign.title=Firmar con certificado
|
|||||||
home.certSign.desc=Firmar un PDF con un Certificado/Clave (PEM/P12)
|
home.certSign.desc=Firmar un PDF con un Certificado/Clave (PEM/P12)
|
||||||
certSign.tags=autentificar,PEM,P12,oficial,encriptar
|
certSign.tags=autentificar,PEM,P12,oficial,encriptar
|
||||||
|
|
||||||
home.removeCertSign.title=Remove Certificate Sign
|
home.removeCertSign.title=Quitar signo de certificado
|
||||||
home.removeCertSign.desc=Remove certificate signature from PDF
|
home.removeCertSign.desc=Eliminar firma de certificado de PDF
|
||||||
removeCertSign.tags=authenticate,PEM,P12,official,decrypt
|
removeCertSign.tags=authenticate,PEM,P12,official,decrypt
|
||||||
|
|
||||||
home.pageLayout.title=Diseño de varias páginas
|
home.pageLayout.title=Diseño de varias páginas
|
||||||
@@ -459,13 +476,13 @@ login.invalid=Nombre de usuario o contraseña erróneos.
|
|||||||
login.locked=Su cuenta se ha bloqueado.
|
login.locked=Su cuenta se ha bloqueado.
|
||||||
login.signinTitle=Por favor, inicie sesión
|
login.signinTitle=Por favor, inicie sesión
|
||||||
login.ssoSignIn=Iniciar sesión a través del inicio de sesión único
|
login.ssoSignIn=Iniciar sesión a través del inicio de sesión único
|
||||||
login.oauth2AutoCreateDisabled=Usuario DE creación automática de OAUTH2 DESACTIVADO
|
login.oauth2AutoCreateDisabled=Usuario de creación automática de OAUTH2 DESACTIVADO
|
||||||
login.oauth2RequestNotFound=Authorization request not found
|
login.oauth2RequestNotFound=Solicitud de autorización no encontrada
|
||||||
login.oauth2InvalidUserInfoResponse=Invalid User Info Response
|
login.oauth2InvalidUserInfoResponse=Respuesta de información de usuario no válida
|
||||||
login.oauth2invalidRequest=Invalid Request
|
login.oauth2invalidRequest=Invalid Request
|
||||||
login.oauth2AccessDenied=Access Denied
|
login.oauth2AccessDenied=Access Denied
|
||||||
login.oauth2InvalidTokenResponse=Invalid Token Response
|
login.oauth2InvalidTokenResponse=Respuesta de token no válida
|
||||||
login.oauth2InvalidIdToken=Invalid Id Token
|
login.oauth2InvalidIdToken=Token de identificación no válido
|
||||||
|
|
||||||
|
|
||||||
#auto-redact
|
#auto-redact
|
||||||
@@ -664,10 +681,10 @@ certSign.submit=Firmar PDF
|
|||||||
|
|
||||||
|
|
||||||
#removeCertSign
|
#removeCertSign
|
||||||
removeCertSign.title=Remove Certificate Signature
|
removeCertSign.title=Eliminar firma del certificado
|
||||||
removeCertSign.header=Remove the digital certificate from the PDF
|
removeCertSign.header=Quitar el certificado digital del PDF
|
||||||
removeCertSign.selectPDF=Select a PDF file:
|
removeCertSign.selectPDF=Seleccione un archivo PDF:
|
||||||
removeCertSign.submit=Remove Signature
|
removeCertSign.submit=Eliminar firma
|
||||||
|
|
||||||
|
|
||||||
#removeBlanks
|
#removeBlanks
|
||||||
@@ -689,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=Color resaltado 1:
|
||||||
|
compare.highlightColor.2=Color resaltado 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
|
||||||
@@ -725,7 +744,7 @@ repair.submit=Reparar
|
|||||||
#flatten
|
#flatten
|
||||||
flatten.title=Aplanar
|
flatten.title=Aplanar
|
||||||
flatten.header=Acoplar archivos PDF
|
flatten.header=Acoplar archivos PDF
|
||||||
flatten.flattenOnlyForms=Flatten only forms
|
flatten.flattenOnlyForms=Aplanar sólo formularios
|
||||||
flatten.submit=Aplanar
|
flatten.submit=Aplanar
|
||||||
|
|
||||||
|
|
||||||
@@ -773,7 +792,7 @@ extractImages.submit=Extraer
|
|||||||
fileToPDF.title=Archivo a PDF
|
fileToPDF.title=Archivo a PDF
|
||||||
fileToPDF.header=Convertir cualquier archivo a PDF
|
fileToPDF.header=Convertir cualquier archivo a PDF
|
||||||
fileToPDF.credit=Este servicio usa LibreOffice y Unoconv para la conversión de archivos
|
fileToPDF.credit=Este servicio usa LibreOffice y Unoconv para la conversión de archivos
|
||||||
fileToPDF.supportedFileTypesInfo=Supported File types
|
fileToPDF.supportedFileTypesInfo=Tipos de archivos admitidos
|
||||||
fileToPDF.supportedFileTypes=Los tipos de archivo soportados deben incluir los indicados a continuación; sin embargo, para una completa y acutualizada lista de formatos soportados, por favor consulte la documentación de LibreOffice
|
fileToPDF.supportedFileTypes=Los tipos de archivo soportados deben incluir los indicados a continuación; sin embargo, para una completa y acutualizada lista de formatos soportados, por favor consulte la documentación de LibreOffice
|
||||||
fileToPDF.submit=Convertir a PDF
|
fileToPDF.submit=Convertir a PDF
|
||||||
|
|
||||||
@@ -926,6 +945,7 @@ watermark.selectText.6=Alto (Espacio entre cada marca de agua verticalmente):
|
|||||||
watermark.selectText.7=Opacidad (0% - 100%):
|
watermark.selectText.7=Opacidad (0% - 100%):
|
||||||
watermark.selectText.8=Tipo de marca de agua:
|
watermark.selectText.8=Tipo de marca de agua:
|
||||||
watermark.selectText.9=Imagen de marca de agua:
|
watermark.selectText.9=Imagen de marca de agua:
|
||||||
|
watermark.selectText.10=Convert PDF to PDF-Image
|
||||||
watermark.submit=Añadir marca de agua
|
watermark.submit=Añadir marca de agua
|
||||||
watermark.type.1=Texto
|
watermark.type.1=Texto
|
||||||
watermark.type.2=Imagen
|
watermark.type.2=Imagen
|
||||||
@@ -981,8 +1001,8 @@ pdfToPDFA.header=PDF a PDF/A
|
|||||||
pdfToPDFA.credit=Este servicio usa OCRmyPDF para la conversión a PDF/A
|
pdfToPDFA.credit=Este servicio usa OCRmyPDF para la conversión a PDF/A
|
||||||
pdfToPDFA.submit=Convertir
|
pdfToPDFA.submit=Convertir
|
||||||
pdfToPDFA.tip=Actualmente no funciona para múltiples entrada a la vez
|
pdfToPDFA.tip=Actualmente no funciona para múltiples entrada a la vez
|
||||||
pdfToPDFA.outputFormat=Output format
|
pdfToPDFA.outputFormat=Formato de salida
|
||||||
pdfToPDFA.pdfWithDigitalSignature=The PDF contains a digital signature. This will be removed in the next step.
|
pdfToPDFA.pdfWithDigitalSignature=El PDF contiene una firma digital. Esto se eliminará en el siguiente paso.
|
||||||
|
|
||||||
|
|
||||||
#PDFToWord
|
#PDFToWord
|
||||||
@@ -1084,13 +1104,13 @@ licenses.version=Versión
|
|||||||
licenses.license=Licencia
|
licenses.license=Licencia
|
||||||
|
|
||||||
#survey
|
#survey
|
||||||
survey.nav=Survey
|
survey.nav=Encuesta
|
||||||
survey.title=Stirling-PDF Survey
|
survey.title=Encuesta Stirling-PDF
|
||||||
survey.description=Stirling-PDF has no tracking so we want to hear from our users to improve Stirling-PDF!
|
survey.description=Stirling-PDF no tiene seguimiento, por lo que queremos escuchar a nuestros usuarios para mejorar Stirling-PDF.
|
||||||
survey.please=Please consider taking our survey!
|
survey.please=¡Considere realizar nuestra encuesta!
|
||||||
survey.disabled=(Survey popup will be disabled in following updates but available at foot of page)
|
survey.disabled=(La ventana emergente de la encuesta se desactivará en las siguientes actualizaciones, pero estará disponible al pie de la página.)
|
||||||
survey.button=Take Survey
|
survey.button=Realizar encuesta
|
||||||
survey.dontShowAgain=Don't show again
|
survey.dontShowAgain=No volver a mostrar
|
||||||
|
|
||||||
|
|
||||||
#error
|
#error
|
||||||
@@ -1105,4 +1125,3 @@ error.showStack=Mostrar seguimiento de pila
|
|||||||
error.copyStack=Mostrar seguimiento de pila
|
error.copyStack=Mostrar seguimiento de pila
|
||||||
error.githubSubmit=GitHub - Enviar un ticket
|
error.githubSubmit=GitHub - Enviar un ticket
|
||||||
error.discordSubmit=Discord - Enviar mensaje de soporte
|
error.discordSubmit=Discord - Enviar mensaje de soporte
|
||||||
|
|
||||||
|
|||||||
@@ -191,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 #
|
||||||
#############
|
#############
|
||||||
@@ -689,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
|
||||||
@@ -926,6 +945,7 @@ watermark.selectText.6=Altuera (ur-marka bakoitzaren arteko espazioa bertikalean
|
|||||||
watermark.selectText.7=Opakutasuna (0% - 100%):
|
watermark.selectText.7=Opakutasuna (0% - 100%):
|
||||||
watermark.selectText.8=Watermark Type:
|
watermark.selectText.8=Watermark Type:
|
||||||
watermark.selectText.9=Watermark Image:
|
watermark.selectText.9=Watermark Image:
|
||||||
|
watermark.selectText.10=Convert PDF to PDF-Image
|
||||||
watermark.submit=Gehitu ur-marka
|
watermark.submit=Gehitu ur-marka
|
||||||
watermark.type.1=Text
|
watermark.type.1=Text
|
||||||
watermark.type.2=Image
|
watermark.type.2=Image
|
||||||
@@ -1105,4 +1125,3 @@ error.showStack=Show Stack Trace
|
|||||||
error.copyStack=Copy Stack Trace
|
error.copyStack=Copy Stack Trace
|
||||||
error.githubSubmit=GitHub - Submit a ticket
|
error.githubSubmit=GitHub - Submit a ticket
|
||||||
error.discordSubmit=Discord - Submit Support post
|
error.discordSubmit=Discord - Submit Support post
|
||||||
|
|
||||||
|
|||||||
@@ -191,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 #
|
||||||
#############
|
#############
|
||||||
@@ -689,6 +706,8 @@ 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
|
||||||
@@ -926,6 +945,7 @@ watermark.selectText.6=heightSpacer (espace entre chaque filigrane verticalement
|
|||||||
watermark.selectText.7=Opacité (de 0% à 100%)
|
watermark.selectText.7=Opacité (de 0% à 100%)
|
||||||
watermark.selectText.8=Type de filigrane
|
watermark.selectText.8=Type de filigrane
|
||||||
watermark.selectText.9=Image du filigrane
|
watermark.selectText.9=Image du filigrane
|
||||||
|
watermark.selectText.10=Convert PDF to PDF-Image
|
||||||
watermark.submit=Ajouter un filigrane
|
watermark.submit=Ajouter un filigrane
|
||||||
watermark.type.1=Text
|
watermark.type.1=Text
|
||||||
watermark.type.2=Image
|
watermark.type.2=Image
|
||||||
@@ -1105,4 +1125,3 @@ error.showStack=Afficher la Stack Trace
|
|||||||
error.copyStack=Copier la Stack Trace
|
error.copyStack=Copier la Stack Trace
|
||||||
error.githubSubmit=GitHub - Créer un ticket
|
error.githubSubmit=GitHub - Créer un ticket
|
||||||
error.discordSubmit=Discord - Poster un message de demande d’assistance
|
error.discordSubmit=Discord - Poster un message de demande d’assistance
|
||||||
|
|
||||||
|
|||||||
1127
src/main/resources/messages_ga_IE.properties
Normal file
1127
src/main/resources/messages_ga_IE.properties
Normal file
File diff suppressed because it is too large
Load Diff
@@ -191,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 #
|
||||||
#############
|
#############
|
||||||
@@ -689,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=तुलना करें
|
||||||
@@ -926,6 +945,7 @@ watermark.selectText.6=ऊंचाई स्पेसर (प्रत्ये
|
|||||||
watermark.selectText.7=अपारदर्शिता (0% - 100%):
|
watermark.selectText.7=अपारदर्शिता (0% - 100%):
|
||||||
watermark.selectText.8=वॉटरमार्क प्रकार:
|
watermark.selectText.8=वॉटरमार्क प्रकार:
|
||||||
watermark.selectText.9=वॉटरमार्क छवि:
|
watermark.selectText.9=वॉटरमार्क छवि:
|
||||||
|
watermark.selectText.10=Convert PDF to PDF-Image
|
||||||
watermark.submit=वॉटरमार्क जोड़ें
|
watermark.submit=वॉटरमार्क जोड़ें
|
||||||
watermark.type.1=Text
|
watermark.type.1=Text
|
||||||
watermark.type.2=Image
|
watermark.type.2=Image
|
||||||
@@ -1105,4 +1125,3 @@ error.showStack=Show Stack Trace
|
|||||||
error.copyStack=Copy Stack Trace
|
error.copyStack=Copy Stack Trace
|
||||||
error.githubSubmit=GitHub - Submit a ticket
|
error.githubSubmit=GitHub - Submit a ticket
|
||||||
error.discordSubmit=Discord - Submit Support post
|
error.discordSubmit=Discord - Submit Support post
|
||||||
|
|
||||||
|
|||||||
@@ -191,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 #
|
||||||
#############
|
#############
|
||||||
@@ -689,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
|
||||||
@@ -926,6 +945,7 @@ watermark.selectText.6=Visina razmaka (Razmak između svakog vodenog žiga okomi
|
|||||||
watermark.selectText.7=Neprozirnost (0% - 100%):
|
watermark.selectText.7=Neprozirnost (0% - 100%):
|
||||||
watermark.selectText.8=Vrsta vodenog žiga:
|
watermark.selectText.8=Vrsta vodenog žiga:
|
||||||
watermark.selectText.9=Slika vodenog žiga:
|
watermark.selectText.9=Slika vodenog žiga:
|
||||||
|
watermark.selectText.10=Convert PDF to PDF-Image
|
||||||
watermark.submit=Dodaj vodeni žig
|
watermark.submit=Dodaj vodeni žig
|
||||||
watermark.type.1=Tekst
|
watermark.type.1=Tekst
|
||||||
watermark.type.2=Slika
|
watermark.type.2=Slika
|
||||||
@@ -1105,4 +1125,3 @@ error.showStack=Prikaži Stack Trace
|
|||||||
error.copyStack=Kopiraj Stack Trace
|
error.copyStack=Kopiraj Stack Trace
|
||||||
error.githubSubmit=GitHub - Pošaljite ticket
|
error.githubSubmit=GitHub - Pošaljite ticket
|
||||||
error.discordSubmit=Discord - Pošalji objavu podrške
|
error.discordSubmit=Discord - Pošalji objavu podrške
|
||||||
|
|
||||||
|
|||||||
@@ -191,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 #
|
||||||
#############
|
#############
|
||||||
@@ -689,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
|
||||||
@@ -926,6 +945,7 @@ watermark.selectText.6=heightSpacer (Hely a vízjelek között függőlegesen):
|
|||||||
watermark.selectText.7=Átlátszóság (0% - 100%):
|
watermark.selectText.7=Átlátszóság (0% - 100%):
|
||||||
watermark.selectText.8=Vízjel típusa:
|
watermark.selectText.8=Vízjel típusa:
|
||||||
watermark.selectText.9=Vízjel képe:
|
watermark.selectText.9=Vízjel képe:
|
||||||
|
watermark.selectText.10=Convert PDF to PDF-Image
|
||||||
watermark.submit=Vízjel hozzáadása
|
watermark.submit=Vízjel hozzáadása
|
||||||
watermark.type.1=Text
|
watermark.type.1=Text
|
||||||
watermark.type.2=Image
|
watermark.type.2=Image
|
||||||
@@ -1105,4 +1125,3 @@ error.showStack=Show Stack Trace
|
|||||||
error.copyStack=Copy Stack Trace
|
error.copyStack=Copy Stack Trace
|
||||||
error.githubSubmit=GitHub - Submit a ticket
|
error.githubSubmit=GitHub - Submit a ticket
|
||||||
error.discordSubmit=Discord - Submit Support post
|
error.discordSubmit=Discord - Submit Support post
|
||||||
|
|
||||||
|
|||||||
@@ -191,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 #
|
||||||
#############
|
#############
|
||||||
@@ -689,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
|
||||||
@@ -926,6 +945,7 @@ watermark.selectText.6=heightSpacer (Spasi diantara setiap watermark vertikal):
|
|||||||
watermark.selectText.7=Opacity (0% - 100%):
|
watermark.selectText.7=Opacity (0% - 100%):
|
||||||
watermark.selectText.8=Tipe Watermark:
|
watermark.selectText.8=Tipe Watermark:
|
||||||
watermark.selectText.9=Gambar Watermark:
|
watermark.selectText.9=Gambar Watermark:
|
||||||
|
watermark.selectText.10=Convert PDF to PDF-Image
|
||||||
watermark.submit=Tambahkan Watermark
|
watermark.submit=Tambahkan Watermark
|
||||||
watermark.type.1=Text
|
watermark.type.1=Text
|
||||||
watermark.type.2=Image
|
watermark.type.2=Image
|
||||||
@@ -1105,4 +1125,3 @@ error.showStack=Show Stack Trace
|
|||||||
error.copyStack=Copy Stack Trace
|
error.copyStack=Copy Stack Trace
|
||||||
error.githubSubmit=GitHub - Submit a ticket
|
error.githubSubmit=GitHub - Submit a ticket
|
||||||
error.discordSubmit=Discord - Submit Support post
|
error.discordSubmit=Discord - Submit Support post
|
||||||
|
|
||||||
|
|||||||
@@ -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à
|
||||||
@@ -116,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
|
||||||
|
|
||||||
@@ -191,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 #
|
||||||
#############
|
#############
|
||||||
@@ -234,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.
|
||||||
@@ -689,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=Evidenzia colore 1:
|
||||||
|
compare.highlightColor.2=Evidenzia colore 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
|
||||||
@@ -926,6 +945,7 @@ watermark.selectText.6=spazio verticale (tra ogni filigrana):
|
|||||||
watermark.selectText.7=Opacità (0% - 100%):
|
watermark.selectText.7=Opacità (0% - 100%):
|
||||||
watermark.selectText.8=Tipo di filigrana:
|
watermark.selectText.8=Tipo di filigrana:
|
||||||
watermark.selectText.9=Immagine filigrana:
|
watermark.selectText.9=Immagine filigrana:
|
||||||
|
watermark.selectText.10=Convert PDF to PDF-Image
|
||||||
watermark.submit=Aggiungi Filigrana
|
watermark.submit=Aggiungi Filigrana
|
||||||
watermark.type.1=Testo
|
watermark.type.1=Testo
|
||||||
watermark.type.2=Immagine
|
watermark.type.2=Immagine
|
||||||
@@ -1105,4 +1125,3 @@ error.showStack=Mostra traccia dello stack
|
|||||||
error.copyStack=Copia traccia dello stack
|
error.copyStack=Copia traccia dello stack
|
||||||
error.githubSubmit=GitHub: invia un ticket
|
error.githubSubmit=GitHub: invia un ticket
|
||||||
error.discordSubmit=Discord: invia post di supporto
|
error.discordSubmit=Discord: invia post di supporto
|
||||||
|
|
||||||
|
|||||||
@@ -191,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 #
|
||||||
#############
|
#############
|
||||||
@@ -689,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=比較
|
||||||
@@ -926,6 +945,7 @@ watermark.selectText.6=高さスペース (各透かし間の垂直方向のス
|
|||||||
watermark.selectText.7=不透明度 (0% - 100%):
|
watermark.selectText.7=不透明度 (0% - 100%):
|
||||||
watermark.selectText.8=透かしの種類:
|
watermark.selectText.8=透かしの種類:
|
||||||
watermark.selectText.9=透かしの画像:
|
watermark.selectText.9=透かしの画像:
|
||||||
|
watermark.selectText.10=Convert PDF to PDF-Image
|
||||||
watermark.submit=透かしを追加
|
watermark.submit=透かしを追加
|
||||||
watermark.type.1=テキスト
|
watermark.type.1=テキスト
|
||||||
watermark.type.2=画像
|
watermark.type.2=画像
|
||||||
@@ -1105,4 +1125,3 @@ error.showStack=スタックトレースを表示
|
|||||||
error.copyStack=スタックトレースをコピー
|
error.copyStack=スタックトレースをコピー
|
||||||
error.githubSubmit=GitHub - チケットを提出
|
error.githubSubmit=GitHub - チケットを提出
|
||||||
error.discordSubmit=Discord - サポート投稿を提出
|
error.discordSubmit=Discord - サポート投稿を提出
|
||||||
|
|
||||||
|
|||||||
@@ -191,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 #
|
||||||
#############
|
#############
|
||||||
@@ -689,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=비교
|
||||||
@@ -926,6 +945,7 @@ watermark.selectText.6=세로 간격 (각 워터마크 사이의 세로 공간):
|
|||||||
watermark.selectText.7=투명도 (0% - 100%):
|
watermark.selectText.7=투명도 (0% - 100%):
|
||||||
watermark.selectText.8=워터마크 유형:
|
watermark.selectText.8=워터마크 유형:
|
||||||
watermark.selectText.9=워터마크 이미지:
|
watermark.selectText.9=워터마크 이미지:
|
||||||
|
watermark.selectText.10=Convert PDF to PDF-Image
|
||||||
watermark.submit=워터마크 추가
|
watermark.submit=워터마크 추가
|
||||||
watermark.type.1=텍스트
|
watermark.type.1=텍스트
|
||||||
watermark.type.2=이미지
|
watermark.type.2=이미지
|
||||||
@@ -1105,4 +1125,3 @@ error.showStack=스택 추적 보기
|
|||||||
error.copyStack=스택 추적 복사
|
error.copyStack=스택 추적 복사
|
||||||
error.githubSubmit=GitHub - 티켓 제출
|
error.githubSubmit=GitHub - 티켓 제출
|
||||||
error.discordSubmit=Discord - 문의 게시
|
error.discordSubmit=Discord - 문의 게시
|
||||||
|
|
||||||
|
|||||||
@@ -191,11 +191,28 @@ adminUserSettings.submit=Gebruiker opslaan
|
|||||||
adminUserSettings.changeUserRole=De rol van de gebruiker wijzigen
|
adminUserSettings.changeUserRole=De rol van de gebruiker wijzigen
|
||||||
adminUserSettings.authenticated=Geauthenticeerd
|
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
|
||||||
@@ -436,11 +453,11 @@ 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=Converteert PDF naar boek-/stripformaat met gebruik van Calibre
|
home.PDFToBook.desc=Converteert PDF naar boek-/stripformaat met gebruik van Calibre
|
||||||
PDFToBook.tags=Boek,Strip,Comic,Calibre,Converteren,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=Converteert boek-/stripformaat naar PDF met gebruik van Calibre
|
home.BookToPDF.desc=Converteert boek-/stripformaat naar PDF met gebruik van Calibre
|
||||||
BookToPDF.tags=Boek,Strip,Comic,Calibre,Converteren,manga,amazon,kindle
|
BookToPDF.tags=Boek,Strip,Comic,Calibre,Converteren,manga,amazon,kindle
|
||||||
|
|
||||||
@@ -542,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
|
||||||
@@ -689,6 +706,8 @@ 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
|
||||||
@@ -926,6 +945,7 @@ watermark.selectText.6=hoogteSpacer (Ruimte tussen elk watermerk verticaal):
|
|||||||
watermark.selectText.7=Transparantie (0% - 100%):
|
watermark.selectText.7=Transparantie (0% - 100%):
|
||||||
watermark.selectText.8=Type watermerk:
|
watermark.selectText.8=Type watermerk:
|
||||||
watermark.selectText.9=Watermerk afbeelding:
|
watermark.selectText.9=Watermerk afbeelding:
|
||||||
|
watermark.selectText.10=Convert PDF to PDF-Image
|
||||||
watermark.submit=Watermerk toevoegen
|
watermark.submit=Watermerk toevoegen
|
||||||
watermark.type.1=Text
|
watermark.type.1=Text
|
||||||
watermark.type.2=Image
|
watermark.type.2=Image
|
||||||
@@ -1105,4 +1125,3 @@ error.showStack=Geeft tracering weer
|
|||||||
error.copyStack=Kopieer tracering
|
error.copyStack=Kopieer tracering
|
||||||
error.githubSubmit=GitHub - Dien een ticket in
|
error.githubSubmit=GitHub - Dien een ticket in
|
||||||
error.discordSubmit=Discord - Maak een support post
|
error.discordSubmit=Discord - Maak een support post
|
||||||
|
|
||||||
|
|||||||
@@ -191,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/Eksport
|
||||||
|
database.header=Database Import/Eksport
|
||||||
|
database.fileName=Fil navn
|
||||||
|
database.creationDate=Opprettelsesdato
|
||||||
|
database.fileSize=Filstørrelse
|
||||||
|
database.deleteBackupFile=Slett sikkerhetskopifil
|
||||||
|
database.importBackupFile=Importer sikkerhetskopifil
|
||||||
|
database.downloadBackupFile=Last ned sikkerhetskopifil
|
||||||
|
database.info_1=Når du importerer data, er det avgjørende å sikre riktig struktur. Hvis du er usikker på hva du gjør, bør du søke råd og støtte fra en profesjonell. En feil i strukturen kan føre til applikasjonsfeil, inkludert fullstendig manglende evne til å kjøre applikasjonen.
|
||||||
|
database.info_2=Filnavnet spiller ingen rolle ved opplasting. Det vil bli omdøpt etterpå for å følge formatet backup_user_yyyyMMddHHmm.sql, for å sikre en konsekvent navnekonvensjon.
|
||||||
|
database.submit=Importer sikkerhetskopi
|
||||||
|
database.importIntoDatabaseSuccessed=Import til database vellykket
|
||||||
|
database.fileNotFound=Fil ikke funnet
|
||||||
|
database.fileNullOrEmpty=Fil må ikke være tom eller null
|
||||||
|
database.failedImportFile=Import av fil mislyktes
|
||||||
|
|
||||||
#############
|
#############
|
||||||
# HOME-PAGE #
|
# HOME-PAGE #
|
||||||
#############
|
#############
|
||||||
@@ -689,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=Uthevingsfarge 1:
|
||||||
|
compare.highlightColor.2=Uthevingsfarge 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
|
||||||
@@ -926,6 +945,7 @@ watermark.selectText.6=Høydeavstand (Avstand mellom hvert vannmerke vertikalt):
|
|||||||
watermark.selectText.7=Opasitet (0% - 100%):
|
watermark.selectText.7=Opasitet (0% - 100%):
|
||||||
watermark.selectText.8=Vannmerketype:
|
watermark.selectText.8=Vannmerketype:
|
||||||
watermark.selectText.9=Vannmerkebilde:
|
watermark.selectText.9=Vannmerkebilde:
|
||||||
|
watermark.selectText.10=Konverter PDF til PDF-Bilde
|
||||||
watermark.submit=Legg til vannmerke
|
watermark.submit=Legg til vannmerke
|
||||||
watermark.type.1=Tekst
|
watermark.type.1=Tekst
|
||||||
watermark.type.2=Bilde
|
watermark.type.2=Bilde
|
||||||
@@ -1105,4 +1125,3 @@ error.showStack=Vis stakksporing
|
|||||||
error.copyStack=Kopier stakksporing
|
error.copyStack=Kopier stakksporing
|
||||||
error.githubSubmit=GitHub - Send inn en billett
|
error.githubSubmit=GitHub - Send inn en billett
|
||||||
error.discordSubmit=Discord - Send inn støtteinnlegg
|
error.discordSubmit=Discord - Send inn støtteinnlegg
|
||||||
|
|
||||||
|
|||||||
@@ -38,13 +38,13 @@ delete=usuń
|
|||||||
username=nazwa użytkownika
|
username=nazwa użytkownika
|
||||||
password=hasło
|
password=hasło
|
||||||
welcome=Witaj
|
welcome=Witaj
|
||||||
property=własnośc
|
property=własność
|
||||||
black=czarny
|
black=czarny
|
||||||
white=biały
|
white=biały
|
||||||
red=czerwony
|
red=czerwony
|
||||||
green=zielony
|
green=zielony
|
||||||
blue=niebieski
|
blue=niebieski
|
||||||
custom=Własny
|
custom=Własny...
|
||||||
WorkInProgess=Praca w toku, proszę zgłaszać błędy!
|
WorkInProgess=Praca w toku, proszę zgłaszać błędy!
|
||||||
poweredBy=Zasilany
|
poweredBy=Zasilany
|
||||||
yes=tak
|
yes=tak
|
||||||
@@ -93,7 +93,7 @@ pipeline.deletePrompt=Na pewno chcesz skasować automatyzacje
|
|||||||
######################
|
######################
|
||||||
pipelineOptions.header=Konfiguracja automatyzacji
|
pipelineOptions.header=Konfiguracja automatyzacji
|
||||||
pipelineOptions.pipelineNameLabel=Nazwa automatyzacji
|
pipelineOptions.pipelineNameLabel=Nazwa automatyzacji
|
||||||
pipelineOptions.saveSettings=Zapisz automatyzacje
|
pipelineOptions.saveSettings=Zapisz ustawienia operacji
|
||||||
pipelineOptions.pipelineNamePrompt=Podaj nazwę automatyzacji
|
pipelineOptions.pipelineNamePrompt=Podaj nazwę automatyzacji
|
||||||
pipelineOptions.selectOperation=Wybierz operację
|
pipelineOptions.selectOperation=Wybierz operację
|
||||||
pipelineOptions.addOperationButton=Dodaj operację
|
pipelineOptions.addOperationButton=Dodaj operację
|
||||||
@@ -125,7 +125,7 @@ navbar.sections.edit=Podgląd i edycja
|
|||||||
#############
|
#############
|
||||||
settings.title=Ustawienia
|
settings.title=Ustawienia
|
||||||
settings.update=Dostępna aktualizacja
|
settings.update=Dostępna aktualizacja
|
||||||
settings.updateAvailable=Wersja {0} jest obecenia zainstalowana , dostępna jest nowa wersja({1}).
|
settings.updateAvailable=Wersja {0} jest obecenia zainstalowana, dostępna jest nowa wersja ({1}).
|
||||||
settings.appVersion=Wersja aplikacji:
|
settings.appVersion=Wersja aplikacji:
|
||||||
settings.downloadOption.title=Wybierz opcję pobierania (w przypadku pobierania pojedynczych plików innych niż ZIP):
|
settings.downloadOption.title=Wybierz opcję pobierania (w przypadku pobierania pojedynczych plików innych niż ZIP):
|
||||||
settings.downloadOption.1=Otwórz w tym samym oknie
|
settings.downloadOption.1=Otwórz w tym samym oknie
|
||||||
@@ -152,7 +152,7 @@ changeCreds.submit=Zapisz zmiany
|
|||||||
account.title=Ustawienia konta
|
account.title=Ustawienia konta
|
||||||
account.accountSettings=Ustawienia konta
|
account.accountSettings=Ustawienia konta
|
||||||
account.adminSettings=Admin - kontrola kont
|
account.adminSettings=Admin - kontrola kont
|
||||||
account.userControlSettings=Kontrola praw uzytkownika
|
account.userControlSettings=Kontrola praw użytkownika
|
||||||
account.changeUsername=Zmień nazwę użytkownika
|
account.changeUsername=Zmień nazwę użytkownika
|
||||||
account.newUsername=Nowa nazwa użytkownika
|
account.newUsername=Nowa nazwa użytkownika
|
||||||
account.password=Potwierdź hasło
|
account.password=Potwierdź hasło
|
||||||
@@ -172,25 +172,42 @@ account.syncToAccount=Wczytaj dane konta z przeglądarki
|
|||||||
|
|
||||||
adminUserSettings.title=Ustawienia konta użytkownika
|
adminUserSettings.title=Ustawienia konta użytkownika
|
||||||
adminUserSettings.header=Ustawienia praw administratora
|
adminUserSettings.header=Ustawienia praw administratora
|
||||||
adminUserSettings.admin=administrator
|
adminUserSettings.admin=Administrator
|
||||||
adminUserSettings.user=użytkownik
|
adminUserSettings.user=Użytkownik
|
||||||
adminUserSettings.addUser=dodaj nowego użytkownika
|
adminUserSettings.addUser=Dodaj nowego użytkownika
|
||||||
adminUserSettings.deleteUser=usuń użytkownika
|
adminUserSettings.deleteUser=Usuń użytkownika
|
||||||
adminUserSettings.confirmDeleteUser=Czy na pewno usunąć użytkownika ?
|
adminUserSettings.confirmDeleteUser=Czy na pewno usunąć użytkownika?
|
||||||
adminUserSettings.usernameInfo=Niewłaściwa nazwa użytkownika - musi zawierać litery, cyfry i @._+- LUB być adresem email.
|
adminUserSettings.usernameInfo=Niewłaściwa nazwa użytkownika - musi zawierać litery, cyfry i @._+- LUB być adresem email.
|
||||||
adminUserSettings.roles=Role
|
adminUserSettings.roles=Role
|
||||||
adminUserSettings.role=Rola
|
adminUserSettings.role=Rola
|
||||||
adminUserSettings.actions=Akcje
|
adminUserSettings.actions=Akcje
|
||||||
adminUserSettings.apiUser=Ograniczony Użytkownik API
|
adminUserSettings.apiUser=Ograniczony Użytkownik API
|
||||||
adminUserSettings.extraApiUser=Dodatkowy ograniczony Użytkownik API
|
adminUserSettings.extraApiUser=Dodatkowy ograniczony Użytkownik API
|
||||||
adminUserSettings.webOnlyUser=Uzytkownik tylko WEB
|
adminUserSettings.webOnlyUser=Użytkownik tylko WEB
|
||||||
adminUserSettings.demoUser=Użytkownik DEMO
|
adminUserSettings.demoUser=Użytkownik DEMO
|
||||||
adminUserSettings.internalApiUser=Wenętrzny użytkownik API
|
adminUserSettings.internalApiUser=Wewnętrzny użytkownik API
|
||||||
adminUserSettings.forceChange=Wymuś zmianę hasło po zalogowaniu
|
adminUserSettings.forceChange=Wymuś zmianę hasło po zalogowaniu
|
||||||
adminUserSettings.submit=Zapisz użytkownika
|
adminUserSettings.submit=Zapisz użytkownika
|
||||||
adminUserSettings.changeUserRole=Zmień rolę użytkownika
|
adminUserSettings.changeUserRole=Zmień rolę użytkownika
|
||||||
adminUserSettings.authenticated=Zalogowany
|
adminUserSettings.authenticated=Zalogowany
|
||||||
|
|
||||||
|
|
||||||
|
database.title=Import/Eksport bazy danych
|
||||||
|
database.header=Import/Eksport bazy danych
|
||||||
|
database.fileName=Nazwa pliku
|
||||||
|
database.creationDate=Data utworzenia
|
||||||
|
database.fileSize=Rozmiar pliku
|
||||||
|
database.deleteBackupFile=Usuń plik kopii zapasowej
|
||||||
|
database.importBackupFile=Importuj plik kopii zapasowej
|
||||||
|
database.downloadBackupFile=Pobierz plik kopii zapasowej
|
||||||
|
database.info_1=Podczas importowania danych, ważne jest, aby upewnić się, że struktura jest poprawna. Jeśli nie jesteś pewien, co robisz, skontaktuj się z profesjonalistą. Błąd w strukturze może spowodować awarie aplikacji, aż do całkowitej niemożności jej uruchomienia.
|
||||||
|
database.info_2=Nazwa pliku nie ma znaczenia podczas przesyłania. Zostanie on później przemianowany, aby przestrzegać formatu backup_user_yyyyMMddHHmm.sql, zapewniając spójną konwencję nazewnictwa.
|
||||||
|
database.submit=Importuj kopię zapasową
|
||||||
|
database.importIntoDatabaseSuccessed=Import do bazy danych zakończony sukcesem
|
||||||
|
database.fileNotFound=Plik nie znaleziony
|
||||||
|
database.fileNullOrEmpty=Plik nie może być pusty
|
||||||
|
database.failedImportFile=Nie udało się zaimportować pliku
|
||||||
|
|
||||||
#############
|
#############
|
||||||
# HOME-PAGE #
|
# HOME-PAGE #
|
||||||
#############
|
#############
|
||||||
@@ -199,8 +216,8 @@ home.searchBar=Szukaj opcji ...
|
|||||||
|
|
||||||
|
|
||||||
home.viewPdf.title=Podejrzyj PDF
|
home.viewPdf.title=Podejrzyj PDF
|
||||||
home.viewPdf.desc=View, annotate, add text or images
|
home.viewPdf.desc=Wyświetl, adnotuj, dodaj tekst lub obrazy
|
||||||
viewPdf.tags=view,read,annotate,text,image
|
viewPdf.tags=wyświetl,czytaj,adnotuj,tekst,obraz
|
||||||
|
|
||||||
home.multiTool.title=Multi narzędzie PDF
|
home.multiTool.title=Multi narzędzie PDF
|
||||||
home.multiTool.desc=Łącz, dziel, obracaj, zmieniaj kolejność i usuwaj strony
|
home.multiTool.desc=Łącz, dziel, obracaj, zmieniaj kolejność i usuwaj strony
|
||||||
@@ -233,7 +250,7 @@ pdfOrganiser.tags=duplex,even,odd,sort,move
|
|||||||
|
|
||||||
|
|
||||||
home.addImage.title=Dodaj obraz
|
home.addImage.title=Dodaj obraz
|
||||||
home.addImage.desc=Dodaje obraz w wybranym miejscu w dokumencie PDF (moduł w budowie)
|
home.addImage.desc=Dodaje obraz w wybranym miejscu w dokumencie PDF
|
||||||
addImage.tags=img,jpg,picture,photo
|
addImage.tags=img,jpg,picture,photo
|
||||||
|
|
||||||
home.watermark.title=Dodaj znak wodny
|
home.watermark.title=Dodaj znak wodny
|
||||||
@@ -264,7 +281,7 @@ compressPdfs.tags=squish,small,tiny
|
|||||||
|
|
||||||
home.changeMetadata.title=Zmień metadane
|
home.changeMetadata.title=Zmień metadane
|
||||||
home.changeMetadata.desc=Zmień/Usuń/Dodaj metadane w dokumencie PDF
|
home.changeMetadata.desc=Zmień/Usuń/Dodaj metadane w dokumencie PDF
|
||||||
changeMetadata.tags==Title,author,date,creation,time,publisher,producer,stats
|
changeMetadata.tags=Title,author,date,creation,time,publisher,producer,stats
|
||||||
|
|
||||||
home.fileToPDF.title=Konwertuj plik do PDF
|
home.fileToPDF.title=Konwertuj plik do PDF
|
||||||
home.fileToPDF.desc=Konwertuj dowolny plik do dokumentu PDF (DOCX, PNG, XLS, PPT, TXT i więcej)
|
home.fileToPDF.desc=Konwertuj dowolny plik do dokumentu PDF (DOCX, PNG, XLS, PPT, TXT i więcej)
|
||||||
@@ -287,7 +304,7 @@ home.PDFToWord.title=PDF na Word
|
|||||||
home.PDFToWord.desc=Konwertuj dokument PDF na formaty Word (DOC, DOCX i ODT)
|
home.PDFToWord.desc=Konwertuj dokument PDF na formaty Word (DOC, DOCX i ODT)
|
||||||
PDFToWord.tags=doc,docx,odt,word,transformation,format,conversion,office,microsoft,docfile
|
PDFToWord.tags=doc,docx,odt,word,transformation,format,conversion,office,microsoft,docfile
|
||||||
|
|
||||||
home.PDFToPresentation.title=PDF na Prezentację
|
home.PDFToPresentation.title=PDF na Prezentację
|
||||||
home.PDFToPresentation.desc=Konwertuj dokument PDF na formaty prezentacji (PPT, PPTX i ODP)
|
home.PDFToPresentation.desc=Konwertuj dokument PDF na formaty prezentacji (PPT, PPTX i ODP)
|
||||||
PDFToPresentation.tags=slides,show,office,microsoft
|
PDFToPresentation.tags=slides,show,office,microsoft
|
||||||
|
|
||||||
@@ -309,7 +326,7 @@ home.ScannerImageSplit.desc=Podziel na wiele zdjęć z jednego zdjęcia/PDF
|
|||||||
ScannerImageSplit.tags=separate,auto-detect,scans,multi-photo,organize
|
ScannerImageSplit.tags=separate,auto-detect,scans,multi-photo,organize
|
||||||
|
|
||||||
home.sign.title=Podpis
|
home.sign.title=Podpis
|
||||||
home.sign.desc=Dodaje podpis do dokument PDF za pomocą rysunku, tekstu lub obrazu
|
home.sign.desc=Dodaje podpis do dokumentu PDF za pomocą rysunku, tekstu lub obrazu
|
||||||
sign.tags=authorize,initials,drawn-signature,text-sign,image-signature
|
sign.tags=authorize,initials,drawn-signature,text-sign,image-signature
|
||||||
|
|
||||||
home.flatten.title=Spłaszcz
|
home.flatten.title=Spłaszcz
|
||||||
@@ -353,7 +370,7 @@ home.pipeline.desc=Wykonaj wiele akcji na dokumentach PDF, tworząc automatyzacj
|
|||||||
pipeline.tags=automate,sequence,scripted,batch-process
|
pipeline.tags=automate,sequence,scripted,batch-process
|
||||||
|
|
||||||
home.add-page-numbers.title=Dodaj numery stron
|
home.add-page-numbers.title=Dodaj numery stron
|
||||||
home.add-page-numbers.desc=Dodaj numbery strony w dokumencie PDF w podanej lokacji
|
home.add-page-numbers.desc=Dodaj numery strony w dokumencie PDF w podanej lokalizacji
|
||||||
add-page-numbers.tags=paginate,label,organize,index
|
add-page-numbers.tags=paginate,label,organize,index
|
||||||
|
|
||||||
home.auto-rename.title=Automatycznie zmień nazwę PDF
|
home.auto-rename.title=Automatycznie zmień nazwę PDF
|
||||||
@@ -365,7 +382,7 @@ home.adjust-contrast.desc=Zmień kolor/nasycenie/jasność w dokumencie PDF
|
|||||||
adjust-contrast.tags=color-correction,tune,modify,enhance
|
adjust-contrast.tags=color-correction,tune,modify,enhance
|
||||||
|
|
||||||
home.crop.title=Przytnij PDF
|
home.crop.title=Przytnij PDF
|
||||||
home.crop.desc=Przytnij dokument PDF w celu zmiejszenia rozmiaru
|
home.crop.desc=Przytnij dokument PDF w celu zmniejszenia rozmiaru
|
||||||
crop.tags=trim,shrink,edit,shape
|
crop.tags=trim,shrink,edit,shape
|
||||||
|
|
||||||
home.autoSplitPDF.title=Automatycznie podziel strony
|
home.autoSplitPDF.title=Automatycznie podziel strony
|
||||||
@@ -373,7 +390,7 @@ home.autoSplitPDF.desc=Automatycznie podziel dokument na strony
|
|||||||
autoSplitPDF.tags=QR-based,separate,scan-segment,organize
|
autoSplitPDF.tags=QR-based,separate,scan-segment,organize
|
||||||
|
|
||||||
home.sanitizePdf.title=Dezynfekcja
|
home.sanitizePdf.title=Dezynfekcja
|
||||||
home.sanitizePdf.desc=Usuń skrupt i inne elementy z dokumentu PDF
|
home.sanitizePdf.desc=Usuń skrypt i inne elementy z dokumentu PDF
|
||||||
sanitizePdf.tags=clean,secure,safe,remove-threats
|
sanitizePdf.tags=clean,secure,safe,remove-threats
|
||||||
|
|
||||||
home.URLToPDF.title=Strona WWW do PDFa
|
home.URLToPDF.title=Strona WWW do PDFa
|
||||||
@@ -410,16 +427,16 @@ home.showJS.desc=Znajduje i pokazuje załączony kod JS w dokumencie PDF
|
|||||||
showJS.tags=JS
|
showJS.tags=JS
|
||||||
|
|
||||||
home.autoRedact.title=Zaciemnij
|
home.autoRedact.title=Zaciemnij
|
||||||
home.autoRedact.desc=Zaciemnia dokument PDF bazująć na podanej wartości
|
home.autoRedact.desc=Zaciemnia dokument PDF bazując na podanej wartości
|
||||||
autoRedact.tags=Redact,Hide,black out,black,marker,hidden
|
autoRedact.tags=Redact,Hide,black out,black,marker,hidden
|
||||||
|
|
||||||
home.tableExtraxt.title=PDF do CSV
|
home.tableExtraxt.title=PDF do CSV
|
||||||
home.tableExtraxt.desc=Konwertuje table z PDF do pliku CSV
|
home.tableExtraxt.desc=Konwertuje tabele z PDF do pliku CSV
|
||||||
tableExtraxt.tags=CSV,Table Extraction,extract,convert
|
tableExtraxt.tags=CSV,Table Extraction,extract,convert
|
||||||
|
|
||||||
|
|
||||||
home.autoSizeSplitPDF.title=Podziel (Rozmiar/Ilość stron)
|
home.autoSizeSplitPDF.title=Podziel (Rozmiar/Ilość stron)
|
||||||
home.autoSizeSplitPDF.desc=Rozdziela dokument PDF na wiele dokumentów bazujać na podanym rozmiarze, ilości stron bądź ilości dokumentów
|
home.autoSizeSplitPDF.desc=Rozdziela dokument PDF na wiele dokumentów bazując na podanym rozmiarze, ilości stron bądź ilości dokumentów
|
||||||
autoSizeSplitPDF.tags=pdf,split,document,organization
|
autoSizeSplitPDF.tags=pdf,split,document,organization
|
||||||
|
|
||||||
|
|
||||||
@@ -432,7 +449,7 @@ home.split-by-sections.desc=Podziel strony PDF w mniejsze sekcje
|
|||||||
split-by-sections.tags=Section Split, Divide, Customize
|
split-by-sections.tags=Section Split, Divide, Customize
|
||||||
|
|
||||||
home.AddStampRequest.title=Dodaj pieczęć
|
home.AddStampRequest.title=Dodaj pieczęć
|
||||||
home.AddStampRequest.desc=Dodaj pieczęć tesktową/obrazową w wyznaczonej lokalizacji dokumentu
|
home.AddStampRequest.desc=Dodaj pieczęć tekstową/obrazową w wyznaczonej lokalizacji dokumentu
|
||||||
AddStampRequest.tags=Stamp, Add image, center image, Watermark, PDF, Embed, Customize
|
AddStampRequest.tags=Stamp, Add image, center image, Watermark, PDF, Embed, Customize
|
||||||
|
|
||||||
|
|
||||||
@@ -464,8 +481,8 @@ login.oauth2RequestNotFound=Błąd logowania OAuth2
|
|||||||
login.oauth2InvalidUserInfoResponse=Niewłaściwe dane logowania
|
login.oauth2InvalidUserInfoResponse=Niewłaściwe dane logowania
|
||||||
login.oauth2invalidRequest=Nieprawidłowe żądanie
|
login.oauth2invalidRequest=Nieprawidłowe żądanie
|
||||||
login.oauth2AccessDenied=Brak dostępu
|
login.oauth2AccessDenied=Brak dostępu
|
||||||
login.oauth2InvalidTokenResponse=Nieprawidłowy odpowiedź na token
|
login.oauth2InvalidTokenResponse=Nieprawidłowa odpowiedź na token
|
||||||
login.oauth2InvalidIdToken=Nieprawidłowa wartośc tokenu
|
login.oauth2InvalidIdToken=Nieprawidłowa wartość tokenu
|
||||||
|
|
||||||
|
|
||||||
#auto-redact
|
#auto-redact
|
||||||
@@ -552,7 +569,7 @@ AddStampRequest.stampType=Typ pieczęci
|
|||||||
AddStampRequest.stampText=Tekst w pieczęci
|
AddStampRequest.stampText=Tekst w pieczęci
|
||||||
AddStampRequest.stampImage=Obraz w pieczęci
|
AddStampRequest.stampImage=Obraz w pieczęci
|
||||||
AddStampRequest.alphabet=Alfabet
|
AddStampRequest.alphabet=Alfabet
|
||||||
AddStampRequest.fontSize=Rozmiar Czcionki/Obrazu
|
AddStampRequest.fontSize=Rozmiar czcionki/obrazu
|
||||||
AddStampRequest.rotation=Obrót
|
AddStampRequest.rotation=Obrót
|
||||||
AddStampRequest.opacity=Przeźroczystość
|
AddStampRequest.opacity=Przeźroczystość
|
||||||
AddStampRequest.position=Pozycja
|
AddStampRequest.position=Pozycja
|
||||||
@@ -567,7 +584,7 @@ AddStampRequest.submit=Wyślij
|
|||||||
sanitizePDF.title=Dezynfekuj PDF
|
sanitizePDF.title=Dezynfekuj PDF
|
||||||
sanitizePDF.header=Dezynfekuj dokument PDF
|
sanitizePDF.header=Dezynfekuj dokument PDF
|
||||||
sanitizePDF.selectText.1=Usuń elementy JavaScript
|
sanitizePDF.selectText.1=Usuń elementy JavaScript
|
||||||
sanitizePDF.selectText.2=Usuń załącznone pliki
|
sanitizePDF.selectText.2=Usuń załączone pliki
|
||||||
sanitizePDF.selectText.3=Usuń metadane
|
sanitizePDF.selectText.3=Usuń metadane
|
||||||
sanitizePDF.selectText.4=Usuń linki
|
sanitizePDF.selectText.4=Usuń linki
|
||||||
sanitizePDF.selectText.5=Usuń czcionki
|
sanitizePDF.selectText.5=Usuń czcionki
|
||||||
@@ -584,23 +601,23 @@ addPageNumbers.selectText.4=Numer początkowy
|
|||||||
addPageNumbers.selectText.5=Ilość stron do ponumerowania
|
addPageNumbers.selectText.5=Ilość stron do ponumerowania
|
||||||
addPageNumbers.selectText.6=Tekst własny
|
addPageNumbers.selectText.6=Tekst własny
|
||||||
addPageNumbers.customTextDesc=Tekst własny
|
addPageNumbers.customTextDesc=Tekst własny
|
||||||
addPageNumbers.numberPagesDesc=Strony do numeracji, wszystkie (all),1-5, 2,5,9
|
addPageNumbers.numberPagesDesc=Strony do numeracji, wszystkie (all), 1-5, 2, 5, 9
|
||||||
addPageNumbers.customNumberDesc=Domyślnie do {n}, również akceptuje 'Strona {n} z {total},Teskt-{n},'{filename}-{n}
|
addPageNumbers.customNumberDesc=Domyślnie do {n}, również akceptuje 'Strona {n} z {total},Teskt-{n},'{filename}-{n}
|
||||||
addPageNumbers.submit=Dodaj numerację stron
|
addPageNumbers.submit=Dodaj numerację stron
|
||||||
|
|
||||||
|
|
||||||
#auto-rename
|
#auto-rename
|
||||||
auto-rename.title=Automatczna zmiana nazwy
|
auto-rename.title=Automatyczna zmiana nazwy
|
||||||
auto-rename.header=Automatczna zmiana nazwy dokumentu PDF
|
auto-rename.header=Automatyczna zmiana nazwy dokumentu PDF
|
||||||
auto-rename.submit=Automatczna zmiana nazwy
|
auto-rename.submit=Automatyczna zmiana nazwy
|
||||||
|
|
||||||
|
|
||||||
#adjustContrast
|
#adjustContrast
|
||||||
adjustContrast.title=Dopasuj kontrast
|
adjustContrast.title=Dopasuj kontrast
|
||||||
adjustContrast.header=Dopasuj kontrast
|
adjustContrast.header=Dopasuj kontrast
|
||||||
adjustContrast.contrast=kontrast:
|
adjustContrast.contrast=Kontrast:
|
||||||
adjustContrast.brightness=jasność:
|
adjustContrast.brightness=Jasność:
|
||||||
adjustContrast.saturation=nasycenie:
|
adjustContrast.saturation=Nasycenie:
|
||||||
adjustContrast.download=Pobierz
|
adjustContrast.download=Pobierz
|
||||||
|
|
||||||
|
|
||||||
@@ -613,11 +630,11 @@ crop.submit=Wyślij
|
|||||||
#autoSplitPDF
|
#autoSplitPDF
|
||||||
autoSplitPDF.title=Automatycznie podziel PDF
|
autoSplitPDF.title=Automatycznie podziel PDF
|
||||||
autoSplitPDF.header=Automatycznie podziel PDF
|
autoSplitPDF.header=Automatycznie podziel PDF
|
||||||
autoSplitPDF.description=Drukuj, wstaw, skanuj, wyślij i pozwól nam automatycznie posortować dokumenty.
|
autoSplitPDF.description=Drukuj, wstaw, skanuj, wyślij i pozwól nam automatycznie posortować dokumenty. Bez ręcznego sortowania.
|
||||||
autoSplitPDF.selectText.1=Wydrukuj strony separacji z poniższych wzorów - (mogą być czarno-białe)
|
autoSplitPDF.selectText.1=Wydrukuj strony separacji z poniższych wzorów - (mogą być czarno-białe)
|
||||||
autoSplitPDF.selectText.2=Skanuj wszystkie swoje dokumenty na raz, wstawiając stronę separator między nie.
|
autoSplitPDF.selectText.2=Skanuj wszystkie swoje dokumenty na raz, wstawiając stronę separator między nie.
|
||||||
autoSplitPDF.selectText.3=Wyślij pojedyńczy duży plik PDF zawierający skan i pozwól Stirling zająć się resztą.
|
autoSplitPDF.selectText.3=Wyślij pojedynczy duży plik PDF zawierający skan i pozwól Stirling PDF zająć się resztą.
|
||||||
autoSplitPDF.selectText.4=Strony separacji sa automatycznie wykrywane i usuwane, gwarantując ładny finalny dokument.
|
autoSplitPDF.selectText.4=Strony separacji są automatycznie wykrywane i usuwane, gwarantując ładny finalny dokument.
|
||||||
autoSplitPDF.formPrompt=Wyślij dokument PDF zawierający strony podziału z Stirling PDF.
|
autoSplitPDF.formPrompt=Wyślij dokument PDF zawierający strony podziału z Stirling PDF.
|
||||||
autoSplitPDF.duplexMode=Skanowanie dwustronne
|
autoSplitPDF.duplexMode=Skanowanie dwustronne
|
||||||
autoSplitPDF.dividerDownload1=Pobierz 'Auto Splitter Divider (minimal).pdf'
|
autoSplitPDF.dividerDownload1=Pobierz 'Auto Splitter Divider (minimal).pdf'
|
||||||
@@ -649,11 +666,11 @@ scalePages.submit=Wykonaj
|
|||||||
certSign.title=Podpisywanie certyfikatem
|
certSign.title=Podpisywanie certyfikatem
|
||||||
certSign.header=Podpisz dokument PDF certyfikatem prywatnym (moduł w budowie)
|
certSign.header=Podpisz dokument PDF certyfikatem prywatnym (moduł w budowie)
|
||||||
certSign.selectPDF=Wybierz dokument PDF do podpisania:
|
certSign.selectPDF=Wybierz dokument PDF do podpisania:
|
||||||
certSign.jksNote=Notka: jeśli twój typ certyfikatu nie jest widoczny na liście , skonwertuj go do formatu Java Keystore (.jks) używając polecenia keytool. Następnie wybierz plik .JKS poniżej z listy.
|
certSign.jksNote=Notka: jeśli twój typ certyfikatu nie jest widoczny na liście, skonwertuj go do formatu Java Keystore (.jks) używając polecenia keytool. Następnie wybierz plik .JKS poniżej z listy.
|
||||||
certSign.selectKey=Wybierz plik klucza prywatnego (format PKCS#8, może to być .pem lub .der):
|
certSign.selectKey=Wybierz plik klucza prywatnego (format PKCS#8, może to być .pem lub .der):
|
||||||
certSign.selectCert=Wybierz plik certyfikatu (format X.509, może to być .pem lub .der):
|
certSign.selectCert=Wybierz plik certyfikatu (format X.509, może to być .pem lub .der):
|
||||||
certSign.selectP12=Wybierz plik magazynu kluczy PKCS#12 (.p12 lub .pfx) (opcjonalnie, jeśli jest podany, powinien zawierać klucz prywatny i certyfikat):
|
certSign.selectP12=Wybierz plik magazynu kluczy PKCS#12 (.p12 lub .pfx) (opcjonalnie, jeśli jest podany, powinien zawierać klucz prywatny i certyfikat):
|
||||||
certSign.selectJKS=Wybierz plik Java Keystore(.jks lub .keystore):
|
certSign.selectJKS=Wybierz plik Java Keystore (.jks lub .keystore):
|
||||||
certSign.certType=Typ certyfikatu
|
certSign.certType=Typ certyfikatu
|
||||||
certSign.password=Wprowadź hasło do magazynu kluczy lub klucza prywatnego (jeśli istnieje):
|
certSign.password=Wprowadź hasło do magazynu kluczy lub klucza prywatnego (jeśli istnieje):
|
||||||
certSign.showSig=Wyświetl podpis
|
certSign.showSig=Wyświetl podpis
|
||||||
@@ -689,6 +706,8 @@ removeAnnotations.submit=Usuń
|
|||||||
#compare
|
#compare
|
||||||
compare.title=Porównaj
|
compare.title=Porównaj
|
||||||
compare.header=Porównaj PDF(y)
|
compare.header=Porównaj PDF(y)
|
||||||
|
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=Porównaj
|
compare.submit=Porównaj
|
||||||
@@ -773,7 +792,7 @@ extractImages.submit=Wyodrębnij
|
|||||||
fileToPDF.title=Plik na PDF
|
fileToPDF.title=Plik na PDF
|
||||||
fileToPDF.header=Konwertuj dowolny plik na dokument PDF
|
fileToPDF.header=Konwertuj dowolny plik na dokument PDF
|
||||||
fileToPDF.credit=Ta usługa używa LibreOffice i Unoconv do konwersji plików.
|
fileToPDF.credit=Ta usługa używa LibreOffice i Unoconv do konwersji plików.
|
||||||
fileToPDF.supportedFileTypesInfo=Supported File types
|
fileToPDF.supportedFileTypesInfo=Obsługiwane typy plików
|
||||||
fileToPDF.supportedFileTypes=Obsługiwane typy plików powinny być zgodne z poniższymi, jednak pełną zaktualizowaną listę obsługiwanych formatów można znaleźć w dokumentacji LibreOffice
|
fileToPDF.supportedFileTypes=Obsługiwane typy plików powinny być zgodne z poniższymi, jednak pełną zaktualizowaną listę obsługiwanych formatów można znaleźć w dokumentacji LibreOffice
|
||||||
fileToPDF.submit=Konwertuj na PDF
|
fileToPDF.submit=Konwertuj na PDF
|
||||||
|
|
||||||
@@ -784,7 +803,7 @@ compress.header=Kompresuj PDF
|
|||||||
compress.credit=Ta usługa używa Ghostscript do kompresji/optymalizacji PDF.
|
compress.credit=Ta usługa używa Ghostscript do kompresji/optymalizacji PDF.
|
||||||
compress.selectText.1=Tryb ręczny - Od 1 do 4
|
compress.selectText.1=Tryb ręczny - Od 1 do 4
|
||||||
compress.selectText.2=Poziom optymalizacji:
|
compress.selectText.2=Poziom optymalizacji:
|
||||||
compress.selectText.3=4 (Straszne dla obrazów tekstowych)
|
compress.selectText.3=4 (Duże dla obrazów tekstowych)
|
||||||
compress.selectText.4=Tryb automatyczny - Automatycznie dostosowuje jakość, aby uzyskać dokładny rozmiar pliku PDF
|
compress.selectText.4=Tryb automatyczny - Automatycznie dostosowuje jakość, aby uzyskać dokładny rozmiar pliku PDF
|
||||||
compress.selectText.5=Oczekiwany rozmiar pliku PDF (np. 25 MB, 10,8 MB, 25 KB)
|
compress.selectText.5=Oczekiwany rozmiar pliku PDF (np. 25 MB, 10,8 MB, 25 KB)
|
||||||
compress.submit=Kompresuj
|
compress.submit=Kompresuj
|
||||||
@@ -801,9 +820,9 @@ addImage.submit=Dodaj obraz
|
|||||||
#merge
|
#merge
|
||||||
merge.title=Połącz
|
merge.title=Połącz
|
||||||
merge.header=Połącz wiele dokumentów PDF (2+)
|
merge.header=Połącz wiele dokumentów PDF (2+)
|
||||||
merge.sortByName=Sort by name
|
merge.sortByName=Sortuj po nazwie
|
||||||
merge.sortByDate=Sort by date
|
merge.sortByDate=Sortuj po dacie
|
||||||
merge.removeCertSign=Remove digital signature in the merged file?
|
merge.removeCertSign=Usuń podpis cyfrowy w scalonym pliku?
|
||||||
merge.submit=Połącz
|
merge.submit=Połącz
|
||||||
|
|
||||||
|
|
||||||
@@ -815,7 +834,7 @@ pdfOrganiser.mode=Tryb
|
|||||||
pdfOrganiser.mode.1=Własna kolejność stron
|
pdfOrganiser.mode.1=Własna kolejność stron
|
||||||
pdfOrganiser.mode.2=Odwrotny
|
pdfOrganiser.mode.2=Odwrotny
|
||||||
pdfOrganiser.mode.3=Dwustronny
|
pdfOrganiser.mode.3=Dwustronny
|
||||||
pdfOrganiser.mode.4=Ksiązki
|
pdfOrganiser.mode.4=Książki
|
||||||
pdfOrganiser.mode.5=Spiętej książki
|
pdfOrganiser.mode.5=Spiętej książki
|
||||||
pdfOrganiser.mode.6=Rozdziel parzyste-nieparzyste
|
pdfOrganiser.mode.6=Rozdziel parzyste-nieparzyste
|
||||||
pdfOrganiser.mode.7=Usuń pierwszą
|
pdfOrganiser.mode.7=Usuń pierwszą
|
||||||
@@ -897,7 +916,7 @@ addPassword.title=Dodaj hasło
|
|||||||
addPassword.header=Dodaj hasło (zaszyfruj)
|
addPassword.header=Dodaj hasło (zaszyfruj)
|
||||||
addPassword.selectText.1=Wybierz plik PDF do zaszyfrowania
|
addPassword.selectText.1=Wybierz plik PDF do zaszyfrowania
|
||||||
addPassword.selectText.2=Hasło
|
addPassword.selectText.2=Hasło
|
||||||
addPassword.selectText.3=Długość hasła
|
addPassword.selectText.3=Długość klucza szyfrowania
|
||||||
addPassword.selectText.4=Wyższe wartości są silniejsze, ale niższe wartości zapewniają lepszą kompatybilność.
|
addPassword.selectText.4=Wyższe wartości są silniejsze, ale niższe wartości zapewniają lepszą kompatybilność.
|
||||||
addPassword.selectText.5=Uprawnienia do zmian
|
addPassword.selectText.5=Uprawnienia do zmian
|
||||||
addPassword.selectText.6=Zablokuj zmiany w dokumencie
|
addPassword.selectText.6=Zablokuj zmiany w dokumencie
|
||||||
@@ -909,7 +928,7 @@ addPassword.selectText.11=Zablokuj modyfikacje adnotacji
|
|||||||
addPassword.selectText.12=Zablokuj drukowanie
|
addPassword.selectText.12=Zablokuj drukowanie
|
||||||
addPassword.selectText.13=Zablokuj drukowanie różnych formatów
|
addPassword.selectText.13=Zablokuj drukowanie różnych formatów
|
||||||
addPassword.selectText.14=Hasło właściciela
|
addPassword.selectText.14=Hasło właściciela
|
||||||
addPassword.selectText.15=Ogranicza akcje które można wykonać na dokumencie, kiedy jest otwarty (nie wspierany przez wszystkie przeglądarki)
|
addPassword.selectText.15=Ogranicza akcje, które można wykonać na dokumencie, kiedy jest otwarty (nie wspierany przez wszystkie przeglądarki)
|
||||||
addPassword.selectText.16=Ogranicza otwarcie dokumentu
|
addPassword.selectText.16=Ogranicza otwarcie dokumentu
|
||||||
addPassword.submit=Zablokuj
|
addPassword.submit=Zablokuj
|
||||||
|
|
||||||
@@ -926,6 +945,7 @@ watermark.selectText.6=Odstęp w pionie (odstęp między każdym znakiem wodnym
|
|||||||
watermark.selectText.7=Nieprzezroczystość (0% - 100%):
|
watermark.selectText.7=Nieprzezroczystość (0% - 100%):
|
||||||
watermark.selectText.8=Typ znaku wodnego:
|
watermark.selectText.8=Typ znaku wodnego:
|
||||||
watermark.selectText.9=Obraz znaku wodnego:
|
watermark.selectText.9=Obraz znaku wodnego:
|
||||||
|
watermark.selectText.10=Convert PDF to PDF-Image
|
||||||
watermark.submit=Dodaj znak wodny
|
watermark.submit=Dodaj znak wodny
|
||||||
watermark.type.1=Tekst
|
watermark.type.1=Tekst
|
||||||
watermark.type.2=Obraz
|
watermark.type.2=Obraz
|
||||||
@@ -1026,7 +1046,7 @@ PDFToXML.submit=Konwertuj
|
|||||||
PDFToCSV.title=PDF na CSV
|
PDFToCSV.title=PDF na CSV
|
||||||
PDFToCSV.header=PDF na CSV
|
PDFToCSV.header=PDF na CSV
|
||||||
PDFToCSV.prompt=Choose page to extract table
|
PDFToCSV.prompt=Choose page to extract table
|
||||||
PDFToCSV.submit=Wyci?g
|
PDFToCSV.submit=Zatwierdź
|
||||||
|
|
||||||
#split-by-size-or-count
|
#split-by-size-or-count
|
||||||
split-by-size-or-count.title=Podziel PDF przez ilość stron bądź rozmiar
|
split-by-size-or-count.title=Podziel PDF przez ilość stron bądź rozmiar
|
||||||
@@ -1081,7 +1101,7 @@ licenses.title=Licencje stron trzecich
|
|||||||
licenses.header=Licencje stron trzecich
|
licenses.header=Licencje stron trzecich
|
||||||
licenses.module=Moduł
|
licenses.module=Moduł
|
||||||
licenses.version=Wersja
|
licenses.version=Wersja
|
||||||
licenses.license=Licencha
|
licenses.license=Licencja
|
||||||
|
|
||||||
#survey
|
#survey
|
||||||
survey.nav=Ankieta
|
survey.nav=Ankieta
|
||||||
@@ -1105,4 +1125,3 @@ error.showStack=Pokaż Stack Trace
|
|||||||
error.copyStack=Kopiuj Stack Trace
|
error.copyStack=Kopiuj Stack Trace
|
||||||
error.githubSubmit=GitHub - wyślij zgłoszenie
|
error.githubSubmit=GitHub - wyślij zgłoszenie
|
||||||
error.discordSubmit=Discord - wyślij posta z prośbą o pomoc
|
error.discordSubmit=Discord - wyślij posta z prośbą o pomoc
|
||||||
|
|
||||||
|
|||||||
@@ -191,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 #
|
||||||
#############
|
#############
|
||||||
@@ -689,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
|
||||||
@@ -926,6 +945,7 @@ watermark.selectText.6=Espaçamento Vertical (heightSpacer)
|
|||||||
watermark.selectText.7=Opacidade (0% - 100%)
|
watermark.selectText.7=Opacidade (0% - 100%)
|
||||||
watermark.selectText.8=Tipo de Marca d'Água
|
watermark.selectText.8=Tipo de Marca d'Água
|
||||||
watermark.selectText.9=Imagem da Marca d'Água
|
watermark.selectText.9=Imagem da Marca d'Água
|
||||||
|
watermark.selectText.10=Convert PDF to PDF-Image
|
||||||
watermark.submit=Adicionar Marca d'Água
|
watermark.submit=Adicionar Marca d'Água
|
||||||
watermark.type.1=Text
|
watermark.type.1=Text
|
||||||
watermark.type.2=Image
|
watermark.type.2=Image
|
||||||
@@ -1105,4 +1125,3 @@ error.showStack=Show Stack Trace
|
|||||||
error.copyStack=Copy Stack Trace
|
error.copyStack=Copy Stack Trace
|
||||||
error.githubSubmit=GitHub - Submit a ticket
|
error.githubSubmit=GitHub - Submit a ticket
|
||||||
error.discordSubmit=Discord - Submit Support post
|
error.discordSubmit=Discord - Submit Support post
|
||||||
|
|
||||||
|
|||||||
@@ -191,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 #
|
||||||
#############
|
#############
|
||||||
@@ -689,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
|
||||||
@@ -926,6 +945,7 @@ watermark.selectText.6=Espaçamento Vertical (heightSpacer)
|
|||||||
watermark.selectText.7=Opacidade (0% - 100%)
|
watermark.selectText.7=Opacidade (0% - 100%)
|
||||||
watermark.selectText.8=Tipo de Marca d'Água
|
watermark.selectText.8=Tipo de Marca d'Água
|
||||||
watermark.selectText.9=Imagem da Marca d'Água
|
watermark.selectText.9=Imagem da Marca d'Água
|
||||||
|
watermark.selectText.10=Convert PDF to PDF-Image
|
||||||
watermark.submit=Adicionar Marca d'Água
|
watermark.submit=Adicionar Marca d'Água
|
||||||
watermark.type.1=Text
|
watermark.type.1=Text
|
||||||
watermark.type.2=Image
|
watermark.type.2=Image
|
||||||
@@ -1105,4 +1125,3 @@ error.showStack=Show Stack Trace
|
|||||||
error.copyStack=Copy Stack Trace
|
error.copyStack=Copy Stack Trace
|
||||||
error.githubSubmit=GitHub - Submit a ticket
|
error.githubSubmit=GitHub - Submit a ticket
|
||||||
error.discordSubmit=Discord - Submit Support post
|
error.discordSubmit=Discord - Submit Support post
|
||||||
|
|
||||||
|
|||||||
@@ -191,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 #
|
||||||
#############
|
#############
|
||||||
@@ -689,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ă
|
||||||
@@ -926,6 +945,7 @@ watermark.selectText.6=heightSpacer (Spațiu între fiecare filigran pe vertical
|
|||||||
watermark.selectText.7=Opacitate (0% - 100%):
|
watermark.selectText.7=Opacitate (0% - 100%):
|
||||||
watermark.selectText.8=Watermark Type:
|
watermark.selectText.8=Watermark Type:
|
||||||
watermark.selectText.9=Watermark Image:
|
watermark.selectText.9=Watermark Image:
|
||||||
|
watermark.selectText.10=Convert PDF to PDF-Image
|
||||||
watermark.submit=Adăugați Filigran
|
watermark.submit=Adăugați Filigran
|
||||||
watermark.type.1=Text
|
watermark.type.1=Text
|
||||||
watermark.type.2=Image
|
watermark.type.2=Image
|
||||||
@@ -1105,4 +1125,3 @@ error.showStack=Show Stack Trace
|
|||||||
error.copyStack=Copy Stack Trace
|
error.copyStack=Copy Stack Trace
|
||||||
error.githubSubmit=GitHub - Submit a ticket
|
error.githubSubmit=GitHub - Submit a ticket
|
||||||
error.discordSubmit=Discord - Submit Support post
|
error.discordSubmit=Discord - Submit Support post
|
||||||
|
|
||||||
|
|||||||
@@ -191,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 #
|
||||||
#############
|
#############
|
||||||
@@ -689,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=Сравнить
|
||||||
@@ -926,6 +945,7 @@ watermark.selectText.6=heightSpacer (пробел между каждым вод
|
|||||||
watermark.selectText.7=Непрозрачность (0% - 100%):
|
watermark.selectText.7=Непрозрачность (0% - 100%):
|
||||||
watermark.selectText.8=Тип водяного знака:
|
watermark.selectText.8=Тип водяного знака:
|
||||||
watermark.selectText.9=Изображение водяного знака:
|
watermark.selectText.9=Изображение водяного знака:
|
||||||
|
watermark.selectText.10=Convert PDF to PDF-Image
|
||||||
watermark.submit=Добавить водяной знак
|
watermark.submit=Добавить водяной знак
|
||||||
watermark.type.1=Текст
|
watermark.type.1=Текст
|
||||||
watermark.type.2=Изображение
|
watermark.type.2=Изображение
|
||||||
@@ -1105,4 +1125,3 @@ error.showStack=Показать стек вызовов
|
|||||||
error.copyStack=Скопировать стек вызовов
|
error.copyStack=Скопировать стек вызовов
|
||||||
error.githubSubmit=GitHub - Отправить заявку
|
error.githubSubmit=GitHub - Отправить заявку
|
||||||
error.discordSubmit=Discord - Отправить запрос в поддержку
|
error.discordSubmit=Discord - Отправить запрос в поддержку
|
||||||
|
|
||||||
|
|||||||
@@ -191,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 #
|
||||||
#############
|
#############
|
||||||
@@ -689,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ť
|
||||||
@@ -926,6 +945,7 @@ watermark.selectText.6=Výška medzery (Medzera medzi jednotlivými vodotlačami
|
|||||||
watermark.selectText.7=Priehľadnosť (0% - 100%):
|
watermark.selectText.7=Priehľadnosť (0% - 100%):
|
||||||
watermark.selectText.8=Typ vodotlače:
|
watermark.selectText.8=Typ vodotlače:
|
||||||
watermark.selectText.9=Obrázok vodotlače:
|
watermark.selectText.9=Obrázok vodotlače:
|
||||||
|
watermark.selectText.10=Convert PDF to PDF-Image
|
||||||
watermark.submit=Pridať vodotlač
|
watermark.submit=Pridať vodotlač
|
||||||
watermark.type.1=Text
|
watermark.type.1=Text
|
||||||
watermark.type.2=Obrázok
|
watermark.type.2=Obrázok
|
||||||
@@ -1105,4 +1125,3 @@ error.showStack=Zobraziť sledovanie zásobníka
|
|||||||
error.copyStack=Kopírovať sledovanie zásobníka
|
error.copyStack=Kopírovať sledovanie zásobníka
|
||||||
error.githubSubmit=GitHub - Podajte tiket
|
error.githubSubmit=GitHub - Podajte tiket
|
||||||
error.discordSubmit=Discord - Podajte príspevok na podporu
|
error.discordSubmit=Discord - Podajte príspevok na podporu
|
||||||
|
|
||||||
|
|||||||
@@ -191,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 #
|
||||||
#############
|
#############
|
||||||
@@ -689,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
|
||||||
@@ -926,6 +945,7 @@ watermark.selectText.6=Visina razmaka (Razmak između svakog vodenog žiga verti
|
|||||||
watermark.selectText.7=Opačitost (0% - 100%):
|
watermark.selectText.7=Opačitost (0% - 100%):
|
||||||
watermark.selectText.8=Tip vodenog žiga:
|
watermark.selectText.8=Tip vodenog žiga:
|
||||||
watermark.selectText.9=Slika vodenog žiga:
|
watermark.selectText.9=Slika vodenog žiga:
|
||||||
|
watermark.selectText.10=Convert PDF to PDF-Image
|
||||||
watermark.submit=Dodaj vodeni žig
|
watermark.submit=Dodaj vodeni žig
|
||||||
watermark.type.1=Text
|
watermark.type.1=Text
|
||||||
watermark.type.2=Image
|
watermark.type.2=Image
|
||||||
@@ -1105,4 +1125,3 @@ error.showStack=Show Stack Trace
|
|||||||
error.copyStack=Copy Stack Trace
|
error.copyStack=Copy Stack Trace
|
||||||
error.githubSubmit=GitHub - Submit a ticket
|
error.githubSubmit=GitHub - Submit a ticket
|
||||||
error.discordSubmit=Discord - Submit Support post
|
error.discordSubmit=Discord - Submit Support post
|
||||||
|
|
||||||
|
|||||||
@@ -191,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 #
|
||||||
#############
|
#############
|
||||||
@@ -689,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
|
||||||
@@ -926,6 +945,7 @@ watermark.selectText.6=heightSpacer (mellanrum mellan varje vattenstämpel verti
|
|||||||
watermark.selectText.7=Opacitet (0% - 100%):
|
watermark.selectText.7=Opacitet (0% - 100%):
|
||||||
watermark.selectText.8=Watermark Type:
|
watermark.selectText.8=Watermark Type:
|
||||||
watermark.selectText.9=Watermark Image:
|
watermark.selectText.9=Watermark Image:
|
||||||
|
watermark.selectText.10=Convert PDF to PDF-Image
|
||||||
watermark.submit=Lägg till vattenstämpel
|
watermark.submit=Lägg till vattenstämpel
|
||||||
watermark.type.1=Text
|
watermark.type.1=Text
|
||||||
watermark.type.2=Image
|
watermark.type.2=Image
|
||||||
@@ -1105,4 +1125,3 @@ error.showStack=Show Stack Trace
|
|||||||
error.copyStack=Copy Stack Trace
|
error.copyStack=Copy Stack Trace
|
||||||
error.githubSubmit=GitHub - Submit a ticket
|
error.githubSubmit=GitHub - Submit a ticket
|
||||||
error.discordSubmit=Discord - Submit Support post
|
error.discordSubmit=Discord - Submit Support post
|
||||||
|
|
||||||
|
|||||||
1127
src/main/resources/messages_th_TH.properties
Normal file
1127
src/main/resources/messages_th_TH.properties
Normal file
File diff suppressed because it is too large
Load Diff
@@ -55,7 +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.
|
confirmPasswordErrorMessage=Yeni Şifre ve Yeni Şifreyi Onayla eşleşmelidir.
|
||||||
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
|
||||||
@@ -86,7 +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.deletePrompt=Çoklu işlemleri silmek istediğinizden emin misiniz
|
||||||
|
|
||||||
######################
|
######################
|
||||||
# Pipeline Options #
|
# Pipeline Options #
|
||||||
@@ -116,7 +116,7 @@ navbar.multiTool=Çoklu Araçlar
|
|||||||
navbar.sections.organize=Düzenle
|
navbar.sections.organize=Düzenle
|
||||||
navbar.sections.convertTo=PDF'ye dönüştür
|
navbar.sections.convertTo=PDF'ye dönüştür
|
||||||
navbar.sections.convertFrom=PDF'den dönüştür
|
navbar.sections.convertFrom=PDF'den dönüştür
|
||||||
navbar.sections.security=Oturum & Güvenlik
|
navbar.sections.security=Oturum ve Güvenlik
|
||||||
navbar.sections.advance=Gelişmiş
|
navbar.sections.advance=Gelişmiş
|
||||||
navbar.sections.edit=Görüntüle ve Düzenle
|
navbar.sections.edit=Görüntüle ve Düzenle
|
||||||
|
|
||||||
@@ -175,8 +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.deleteUser=Kullanıcı Sil
|
||||||
adminUserSettings.confirmDeleteUser=Should the user be deleted?
|
adminUserSettings.confirmDeleteUser=Kullanıcı silinsin mi?
|
||||||
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
|
||||||
@@ -191,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=Veri Tabanını İçe/Dışa Aktar
|
||||||
|
database.header=Veri Tabanını İçe/Dışa Aktar
|
||||||
|
database.fileName=Dosya Adı
|
||||||
|
database.creationDate=Oluşturulma Tarihi
|
||||||
|
database.fileSize=Dosya Boyutu
|
||||||
|
database.deleteBackupFile=Yedekleme Dosyasını Sil
|
||||||
|
database.importBackupFile=Yedekleme Dosyasını İçe Aktar
|
||||||
|
database.downloadBackupFile=Yedekleme Dosyasını İndir
|
||||||
|
database.info_1=Verileri içe aktarırken, yapının doğru olduğundan emin olmak çok önemlidir. Ne yaptığınızdan emin değilseniz, bir uzmandan tavsiye ve destek alın. Yapıdaki bir hata, uygulamanın tamamen çalıştırılamaması da dahil olmak üzere uygulama sorunlarına neden olabilir.
|
||||||
|
database.info_2=Karşıya yüklerken dosya adı önemli değildir. Daha sonra yedekleme_kullanıcısı_yyyyAAggSdd.sql biçiminde yeniden adlandırılacak ve tutarlı bir adlandırma kuralı sağlanacaktır.
|
||||||
|
database.submit=Yedeklemeyi İçe Aktar
|
||||||
|
database.importIntoDatabaseSuccessed=Veri tabanına başarıyla aktarıldı
|
||||||
|
database.fileNotFound=Dosya bulunamadı
|
||||||
|
database.fileNullOrEmpty=Dosya yok veya boş olmamalıdır
|
||||||
|
database.failedImportFile=Dosya İçe Aktarılamadı
|
||||||
|
|
||||||
#############
|
#############
|
||||||
# HOME-PAGE #
|
# HOME-PAGE #
|
||||||
#############
|
#############
|
||||||
@@ -336,9 +353,9 @@ home.certSign.title=Sertifika ile İmzala
|
|||||||
home.certSign.desc=Bir PDF'i Sertifika/Anahtar (PEM/P12) ile imzalar
|
home.certSign.desc=Bir PDF'i Sertifika/Anahtar (PEM/P12) ile imzalar
|
||||||
certSign.tags=doğrula,PEM,P12,resmi,şifrele
|
certSign.tags=doğrula,PEM,P12,resmi,şifrele
|
||||||
|
|
||||||
home.removeCertSign.title=Remove Certificate Sign
|
home.removeCertSign.title=Sertifika İmzasını Kaldır
|
||||||
home.removeCertSign.desc=Remove certificate signature from PDF
|
home.removeCertSign.desc=PDF'ten sertifika imzasını kaldırır
|
||||||
removeCertSign.tags=authenticate,PEM,P12,official,decrypt
|
removeCertSign.tags=doğrula,PEM,P12,resmi,şifre çöz
|
||||||
|
|
||||||
home.pageLayout.title=Çoklu-Sayfa Düzeni
|
home.pageLayout.title=Çoklu-Sayfa Düzeni
|
||||||
home.pageLayout.desc=Bir PDF belgesinin çoklu sayfalarını tek bir sayfada birleştirir
|
home.pageLayout.desc=Bir PDF belgesinin çoklu sayfalarını tek bir sayfada birleştirir
|
||||||
@@ -460,12 +477,12 @@ login.locked=Hesabınız kilitlendi.
|
|||||||
login.signinTitle=Lütfen giriş yapınız.
|
login.signinTitle=Lütfen giriş yapınız.
|
||||||
login.ssoSignIn=Tek Oturum Açma ile Giriş Yap
|
login.ssoSignIn=Tek Oturum Açma ile Giriş Yap
|
||||||
login.oauth2AutoCreateDisabled=OAUTH2 Otomatik Oluşturma Kullanıcı Devre Dışı Bırakıldı
|
login.oauth2AutoCreateDisabled=OAUTH2 Otomatik Oluşturma Kullanıcı Devre Dışı Bırakıldı
|
||||||
login.oauth2RequestNotFound=Authorization request not found
|
login.oauth2RequestNotFound=Yetkilendirme isteği bulunamadı
|
||||||
login.oauth2InvalidUserInfoResponse=Invalid User Info Response
|
login.oauth2InvalidUserInfoResponse=Geçersiz Kullanıcı Bilgisi Yanıtı
|
||||||
login.oauth2invalidRequest=Invalid Request
|
login.oauth2invalidRequest=Geçersiz İstek
|
||||||
login.oauth2AccessDenied=Access Denied
|
login.oauth2AccessDenied=Erişim Reddedildi
|
||||||
login.oauth2InvalidTokenResponse=Invalid Token Response
|
login.oauth2InvalidTokenResponse=Geçersiz Belirteç Yanıtı
|
||||||
login.oauth2InvalidIdToken=Invalid Id Token
|
login.oauth2InvalidIdToken=Geçersiz Kimlik Belirteci
|
||||||
|
|
||||||
|
|
||||||
#auto-redact
|
#auto-redact
|
||||||
@@ -664,10 +681,10 @@ certSign.submit=PDF'i İmzala
|
|||||||
|
|
||||||
|
|
||||||
#removeCertSign
|
#removeCertSign
|
||||||
removeCertSign.title=Remove Certificate Signature
|
removeCertSign.title=Sertifika İmzasını Kaldır
|
||||||
removeCertSign.header=Remove the digital certificate from the PDF
|
removeCertSign.header=PDF'ten dijital sertifikayı kaldırın
|
||||||
removeCertSign.selectPDF=Select a PDF file:
|
removeCertSign.selectPDF=PDF dosyası seçin:
|
||||||
removeCertSign.submit=Remove Signature
|
removeCertSign.submit=İmzayı Kaldır
|
||||||
|
|
||||||
|
|
||||||
#removeBlanks
|
#removeBlanks
|
||||||
@@ -689,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=Vurgu Rengi 1:
|
||||||
|
compare.highlightColor.2=Vurgu Rengi 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
|
||||||
@@ -725,7 +744,7 @@ repair.submit=Onar
|
|||||||
#flatten
|
#flatten
|
||||||
flatten.title=Düzleştir
|
flatten.title=Düzleştir
|
||||||
flatten.header=PDF'leri Düzleştir
|
flatten.header=PDF'leri Düzleştir
|
||||||
flatten.flattenOnlyForms=Flatten only forms
|
flatten.flattenOnlyForms=Yalnızca formları düzleştir
|
||||||
flatten.submit=Düzleştir
|
flatten.submit=Düzleştir
|
||||||
|
|
||||||
|
|
||||||
@@ -803,7 +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.removeCertSign=Birleştirilen dosyadaki dijital imza kaldırılsın mı?
|
||||||
merge.submit=Birleştir
|
merge.submit=Birleştir
|
||||||
|
|
||||||
|
|
||||||
@@ -821,7 +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.mode.10=Tek-Çift Birleştirme
|
||||||
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)
|
||||||
|
|
||||||
|
|
||||||
@@ -926,6 +945,7 @@ watermark.selectText.6=yükseklikBoşluk (Dikeyde her filigran arasında boşluk
|
|||||||
watermark.selectText.7=Opaklık (0% - 100%):
|
watermark.selectText.7=Opaklık (0% - 100%):
|
||||||
watermark.selectText.8=Filigran Türü:
|
watermark.selectText.8=Filigran Türü:
|
||||||
watermark.selectText.9=Filigran Resmi:
|
watermark.selectText.9=Filigran Resmi:
|
||||||
|
watermark.selectText.10=Convert PDF to PDF-Image
|
||||||
watermark.submit=Filigran Ekle
|
watermark.submit=Filigran Ekle
|
||||||
watermark.type.1=Metin
|
watermark.type.1=Metin
|
||||||
watermark.type.2=Resim
|
watermark.type.2=Resim
|
||||||
@@ -1080,17 +1100,17 @@ licenses.nav=Lisanslar
|
|||||||
licenses.title=3. Taraf Lisansları
|
licenses.title=3. Taraf Lisansları
|
||||||
licenses.header=3. Taraf Lisansları
|
licenses.header=3. Taraf Lisansları
|
||||||
licenses.module=Modül
|
licenses.module=Modül
|
||||||
licenses.version=Versiyon
|
licenses.version=Sürüm
|
||||||
licenses.license=Lisans
|
licenses.license=Lisans
|
||||||
|
|
||||||
#survey
|
#survey
|
||||||
survey.nav=Survey
|
survey.nav=Anket
|
||||||
survey.title=Stirling-PDF Survey
|
survey.title=Stirling-PDF Anketi
|
||||||
survey.description=Stirling-PDF has no tracking so we want to hear from our users to improve Stirling-PDF!
|
survey.description=Stirling-PDF'te izleme yok, bu yüzden Stirling-PDF'i iyileştirmek için kullanıcılarımızdan geri bildirim almak istiyoruz!
|
||||||
survey.please=Please consider taking our survey!
|
survey.please=Lütfen anketimize katılmayı düşünün!
|
||||||
survey.disabled=(Survey popup will be disabled in following updates but available at foot of page)
|
survey.disabled=(Anket açılır penceresi sonraki güncellemelerde devre dışı bırakılacak ancak sayfanın alt kısmında yer alacaktır)
|
||||||
survey.button=Take Survey
|
survey.button=Ankete Katıl
|
||||||
survey.dontShowAgain=Don't show again
|
survey.dontShowAgain=Tekrar gösterme
|
||||||
|
|
||||||
|
|
||||||
#error
|
#error
|
||||||
@@ -1105,4 +1125,3 @@ error.showStack=Yığın İzlemesini Göster
|
|||||||
error.copyStack=Yığın İzini Kopyala
|
error.copyStack=Yığın İzini Kopyala
|
||||||
error.githubSubmit=GitHub - Hata gönderin
|
error.githubSubmit=GitHub - Hata gönderin
|
||||||
error.discordSubmit=Discord - Destek gönderisi gönderin
|
error.discordSubmit=Discord - Destek gönderisi gönderin
|
||||||
|
|
||||||
|
|||||||
@@ -191,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 #
|
||||||
#############
|
#############
|
||||||
@@ -689,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=Порівняти
|
||||||
@@ -926,6 +945,7 @@ watermark.selectText.6=heightSpacer (проміжок між кожним вод
|
|||||||
watermark.selectText.7=Непрозорість (0% - 100%):
|
watermark.selectText.7=Непрозорість (0% - 100%):
|
||||||
watermark.selectText.8=Тип водяного знаку:
|
watermark.selectText.8=Тип водяного знаку:
|
||||||
watermark.selectText.9=Зображення водяного знаку:
|
watermark.selectText.9=Зображення водяного знаку:
|
||||||
|
watermark.selectText.10=Convert PDF to PDF-Image
|
||||||
watermark.submit=Додати водяний знак
|
watermark.submit=Додати водяний знак
|
||||||
watermark.type.1=Текст
|
watermark.type.1=Текст
|
||||||
watermark.type.2=Зображення
|
watermark.type.2=Зображення
|
||||||
@@ -1105,4 +1125,3 @@ error.showStack=Показати стек викликів
|
|||||||
error.copyStack=Скопіювати стек викликів
|
error.copyStack=Скопіювати стек викликів
|
||||||
error.githubSubmit=GitHub - Надіслати запит
|
error.githubSubmit=GitHub - Надіслати запит
|
||||||
error.discordSubmit=Discord - Надіслати повідомлення підтримки
|
error.discordSubmit=Discord - Надіслати повідомлення підтримки
|
||||||
|
|
||||||
|
|||||||
1127
src/main/resources/messages_vi_VN.properties
Normal file
1127
src/main/resources/messages_vi_VN.properties
Normal file
File diff suppressed because it is too large
Load Diff
@@ -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,13 +55,13 @@ userNotFoundMessage=未找到用户。
|
|||||||
incorrectPasswordMessage=当前密码不正确。
|
incorrectPasswordMessage=当前密码不正确。
|
||||||
usernameExistsMessage=新用户名已存在。
|
usernameExistsMessage=新用户名已存在。
|
||||||
invalidUsernameMessage=用户名无效,用户名只能包含字母、数字和以下特殊字符@._+- 或必须是有效的电子邮件地址。
|
invalidUsernameMessage=用户名无效,用户名只能包含字母、数字和以下特殊字符@._+- 或必须是有效的电子邮件地址。
|
||||||
confirmPasswordErrorMessage=New Password and Confirm New Password must match.
|
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=帮助
|
||||||
@@ -72,21 +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=Are you sure you want to delete pipeline
|
pipeline.deletePrompt=确认删除该工作流?
|
||||||
|
|
||||||
######################
|
######################
|
||||||
# Pipeline Options #
|
# Pipeline Options #
|
||||||
@@ -125,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=在同一窗口打开
|
||||||
@@ -133,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=更新您的账户详情
|
||||||
@@ -149,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=更改用户名
|
||||||
@@ -161,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=同步账户 <- 浏览器
|
||||||
|
|
||||||
@@ -175,21 +175,38 @@ adminUserSettings.header=管理员用户控制设置
|
|||||||
adminUserSettings.admin=管理员
|
adminUserSettings.admin=管理员
|
||||||
adminUserSettings.user=用户
|
adminUserSettings.user=用户
|
||||||
adminUserSettings.addUser=添加新用户
|
adminUserSettings.addUser=添加新用户
|
||||||
adminUserSettings.deleteUser=Delete User
|
adminUserSettings.deleteUser=删除用户
|
||||||
adminUserSettings.confirmDeleteUser=Should the user be deleted?
|
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.header=数据库 导入/导出
|
||||||
|
database.fileName=文件名
|
||||||
|
database.creationDate=创建时间
|
||||||
|
database.fileSize=文件大小
|
||||||
|
database.deleteBackupFile=删除备份文件
|
||||||
|
database.importBackupFile=导入备份文件
|
||||||
|
database.downloadBackupFile=下载备份文件
|
||||||
|
database.info_1=导入数据时,确保结构正确至关重要。如果您不确定自己在做什么,请寻求专业人士的建议和支持。结构错误会导致应用程序故障,甚至完全无法运行应用程序。
|
||||||
|
database.info_2=上传文件时,文件名并不重要。上传后,文件名将重命名为 backup_user_yyyyMMddHHmm.sql,以确保命名规范的一致性。
|
||||||
|
database.submit=导入备份
|
||||||
|
database.importIntoDatabaseSuccessed=导入数据库成功
|
||||||
|
database.fileNotFound=未找到文件
|
||||||
|
database.fileNullOrEmpty=文件不能为空
|
||||||
|
database.failedImportFile=导入文件失败
|
||||||
|
|
||||||
#############
|
#############
|
||||||
# HOME-PAGE #
|
# HOME-PAGE #
|
||||||
@@ -332,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文档的多个页面合并成一页
|
||||||
@@ -459,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
|
||||||
@@ -482,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=转为单页
|
||||||
|
|
||||||
|
|
||||||
@@ -498,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
|
||||||
@@ -510,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进行文件转换。
|
||||||
@@ -519,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进行文件转换。
|
||||||
@@ -539,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=屏幕
|
||||||
@@ -556,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=提交
|
||||||
@@ -647,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
|
||||||
@@ -688,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=比较
|
||||||
@@ -718,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=展平
|
||||||
|
|
||||||
|
|
||||||
@@ -752,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后移除图像(移除所有图像,只有在转换步骤中才有用)。
|
||||||
@@ -773,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
|
||||||
|
|
||||||
@@ -781,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=压缩
|
||||||
|
|
||||||
|
|
||||||
@@ -803,7 +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.removeCertSign=删除合并文件的数字签名吗?
|
||||||
merge.submit=合并
|
merge.submit=合并
|
||||||
|
|
||||||
|
|
||||||
@@ -821,8 +840,8 @@ 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.mode.10=奇偶合并
|
||||||
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
|
||||||
@@ -839,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
|
||||||
@@ -866,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=填充页面
|
||||||
@@ -880,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=单张图片
|
||||||
@@ -926,6 +945,7 @@ watermark.selectText.6=垂直间距(每个水印之间的垂直距离):
|
|||||||
watermark.selectText.7=透明度(0% - 100%):
|
watermark.selectText.7=透明度(0% - 100%):
|
||||||
watermark.selectText.8=水印类型:
|
watermark.selectText.8=水印类型:
|
||||||
watermark.selectText.9=水印图片:
|
watermark.selectText.9=水印图片:
|
||||||
|
watermark.selectText.10=Convert PDF to PDF-Image
|
||||||
watermark.submit=添加水印
|
watermark.submit=添加水印
|
||||||
watermark.type.1=文字
|
watermark.type.1=文字
|
||||||
watermark.type.2=图片
|
watermark.type.2=图片
|
||||||
@@ -976,55 +996,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=提取
|
||||||
|
|
||||||
@@ -1036,7 +1056,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=提交
|
||||||
|
|
||||||
|
|
||||||
@@ -1049,7 +1069,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=后面(下面)
|
||||||
@@ -1068,11 +1088,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
|
||||||
@@ -1084,13 +1104,13 @@ licenses.version=版本
|
|||||||
licenses.license=许可证
|
licenses.license=许可证
|
||||||
|
|
||||||
#survey
|
#survey
|
||||||
survey.nav=Survey
|
survey.nav=调查
|
||||||
survey.title=Stirling-PDF Survey
|
survey.title=Stirling-PDF调查
|
||||||
survey.description=Stirling-PDF has no tracking so we want to hear from our users to improve Stirling-PDF!
|
survey.description=Stirling-PDF没有跟踪器,所以我们希望听取用户的意见来改进Stirling-PDF!
|
||||||
survey.please=Please consider taking our survey!
|
survey.please=请考虑参加我们的调查!
|
||||||
survey.disabled=(Survey popup will be disabled in following updates but available at foot of page)
|
survey.disabled=(调查弹出窗口将在后续更新中被禁用,但可在页脚处查看)
|
||||||
survey.button=Take Survey
|
survey.button=参与调查
|
||||||
survey.dontShowAgain=Don't show again
|
survey.dontShowAgain=不再显示
|
||||||
|
|
||||||
|
|
||||||
#error
|
#error
|
||||||
@@ -1105,4 +1125,3 @@ error.showStack=显示堆栈跟踪
|
|||||||
error.copyStack=复制堆栈跟踪
|
error.copyStack=复制堆栈跟踪
|
||||||
error.githubSubmit=GitHub - 提交工单
|
error.githubSubmit=GitHub - 提交工单
|
||||||
error.discordSubmit=Discord - 提交支持帖子
|
error.discordSubmit=Discord - 提交支持帖子
|
||||||
|
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ multiPdfPrompt=選擇多個 PDF 檔案
|
|||||||
multiPdfDropPrompt=選擇(或拖放)所有需要的 PDF 檔案
|
multiPdfDropPrompt=選擇(或拖放)所有需要的 PDF 檔案
|
||||||
imgPrompt=選擇圖片
|
imgPrompt=選擇圖片
|
||||||
genericSubmit=送出
|
genericSubmit=送出
|
||||||
processTimeWarning=警告:此過程可能需要長達一分鐘,具體取決於檔案大小
|
processTimeWarning=警告:此過程可能長達一分鐘,具體取決於檔案大小
|
||||||
pageOrderPrompt=自訂頁面順序(輸入以逗號分隔的頁碼或函式,如 2n+1):
|
pageOrderPrompt=自訂頁面順序(輸入以逗號分隔的頁碼或函式,如 2n+1):
|
||||||
pageSelectionPrompt=自訂頁面選擇(輸入以逗號分隔的頁碼 1、5、6 或 2n+1 等函數的清單):
|
pageSelectionPrompt=自訂頁面選擇(輸入以逗號分隔的頁碼 1、5、6 或 2n+1 等函數的清單):
|
||||||
goToPage=前往
|
goToPage=前往
|
||||||
@@ -66,7 +66,7 @@ error=錯誤
|
|||||||
oops=哎呀!
|
oops=哎呀!
|
||||||
help=幫助
|
help=幫助
|
||||||
goHomepage=前往首頁
|
goHomepage=前往首頁
|
||||||
joinDiscord=加入我們的 Discord 服務器
|
joinDiscord=加入我們的 Discord 伺服器
|
||||||
seeDockerHub=查看 Docker Hub
|
seeDockerHub=查看 Docker Hub
|
||||||
visitGithub=訪問 GitHub 存儲庫
|
visitGithub=訪問 GitHub 存儲庫
|
||||||
donate=捐贈
|
donate=捐贈
|
||||||
@@ -108,7 +108,7 @@ pipelineOptions.validateButton=驗證
|
|||||||
# NAVBAR #
|
# NAVBAR #
|
||||||
#############
|
#############
|
||||||
navbar.favorite=我的最愛
|
navbar.favorite=我的最愛
|
||||||
navbar.darkmode=暗黑模式
|
navbar.darkmode=深色模式
|
||||||
navbar.language=語言
|
navbar.language=語言
|
||||||
navbar.settings=設定
|
navbar.settings=設定
|
||||||
navbar.allTools=工具
|
navbar.allTools=工具
|
||||||
@@ -125,7 +125,7 @@ navbar.sections.edit=檢視與編輯
|
|||||||
#############
|
#############
|
||||||
settings.title=設定
|
settings.title=設定
|
||||||
settings.update=有更新可用
|
settings.update=有更新可用
|
||||||
settings.updateAvailable=當前版本為 {0}。歡迎您更新至最新版 ({1})。。
|
settings.updateAvailable=當前版本為 {0}。歡迎你更新至最新版 ({1})。。
|
||||||
settings.appVersion=應用版本:
|
settings.appVersion=應用版本:
|
||||||
settings.downloadOption.title=選擇下載選項(對於單一檔案非壓縮下載):
|
settings.downloadOption.title=選擇下載選項(對於單一檔案非壓縮下載):
|
||||||
settings.downloadOption.1=在同一視窗中開啟
|
settings.downloadOption.1=在同一視窗中開啟
|
||||||
@@ -139,8 +139,8 @@ settings.cacheInputs.name=輸入檔案下載
|
|||||||
settings.cacheInputs.help=開啟記住先前的輸入,做為日後使用
|
settings.cacheInputs.help=開啟記住先前的輸入,做為日後使用
|
||||||
|
|
||||||
changeCreds.title=變更憑證
|
changeCreds.title=變更憑證
|
||||||
changeCreds.header=更新您的帳戶詳細資訊
|
changeCreds.header=更新你的帳戶詳細資訊
|
||||||
changeCreds.changePassword=您使用的是預設登錄認證。請輸入新密碼
|
changeCreds.changePassword=你使用的是預設登錄認證。請輸入新密碼
|
||||||
changeCreds.newUsername=新使用者名稱
|
changeCreds.newUsername=新使用者名稱
|
||||||
changeCreds.oldPassword=目前密碼
|
changeCreds.oldPassword=目前密碼
|
||||||
changeCreds.newPassword=新密碼
|
changeCreds.newPassword=新密碼
|
||||||
@@ -161,7 +161,7 @@ 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=屬性
|
||||||
@@ -191,10 +191,27 @@ adminUserSettings.submit=儲存
|
|||||||
adminUserSettings.changeUserRole=更改使用者身份
|
adminUserSettings.changeUserRole=更改使用者身份
|
||||||
adminUserSettings.authenticated=已驗證
|
adminUserSettings.authenticated=已驗證
|
||||||
|
|
||||||
|
|
||||||
|
database.title=資料庫匯入/匯出
|
||||||
|
database.header=資料庫匯入/匯出
|
||||||
|
database.fileName=檔案名稱
|
||||||
|
database.creationDate=建立日期
|
||||||
|
database.fileSize=檔案大小
|
||||||
|
database.deleteBackupFile=刪除備份檔案
|
||||||
|
database.importBackupFile=匯入備份檔案
|
||||||
|
database.downloadBackupFile=下載備份檔案
|
||||||
|
database.info_1=在匯入資料時,確保正確的結構是至關重要的。如果你不確定自己在做什麼,請尋求專業人士的建議和支持。結構錯誤可能會導致應用程式故障,甚至完全無法運行。
|
||||||
|
database.info_2=上傳時檔案名稱無關緊要。上傳後將重新命名為 backup_user_yyyyMMddHHmm.sql 格式,以確保命名規範一致。
|
||||||
|
database.submit=匯入備份
|
||||||
|
database.importIntoDatabaseSuccessed=成功匯入資料庫
|
||||||
|
database.fileNotFound=檔案未找到
|
||||||
|
database.fileNullOrEmpty=檔案不能為空或空白
|
||||||
|
database.failedImportFile=匯入檔案失敗
|
||||||
|
|
||||||
#############
|
#############
|
||||||
# HOME-PAGE #
|
# HOME-PAGE #
|
||||||
#############
|
#############
|
||||||
home.desc=您的本地主機一站式 PDF 需求解決方案。
|
home.desc=你的本地主機一站式 PDF 需求解決方案。
|
||||||
home.searchBar=搜尋功能...
|
home.searchBar=搜尋功能...
|
||||||
|
|
||||||
|
|
||||||
@@ -215,7 +232,7 @@ home.split.desc=將 PDF 分割為多個文件
|
|||||||
split.tags=頁面操作,劃分,多頁,剪下,伺服器端
|
split.tags=頁面操作,劃分,多頁,剪下,伺服器端
|
||||||
|
|
||||||
home.rotate.title=旋轉
|
home.rotate.title=旋轉
|
||||||
home.rotate.desc=輕鬆旋轉您的 PDF。
|
home.rotate.desc=輕鬆旋轉你的 PDF。
|
||||||
rotate.tags=伺服器端
|
rotate.tags=伺服器端
|
||||||
|
|
||||||
|
|
||||||
@@ -237,24 +254,24 @@ home.addImage.desc=在 PDF 的指定位置新增圖片
|
|||||||
addImage.tags=img,jpg,圖片,照片
|
addImage.tags=img,jpg,圖片,照片
|
||||||
|
|
||||||
home.watermark.title=新增浮水印
|
home.watermark.title=新增浮水印
|
||||||
home.watermark.desc=在您的 PDF 檔案中新增自訂浮水印。
|
home.watermark.desc=在你的 PDF 檔案中新增自訂浮水印。
|
||||||
watermark.tags=文字,重複,標籤,自有,版權,商標,img,jpg,圖片,照片
|
watermark.tags=文字,重複,標籤,自有,版權,商標,img,jpg,圖片,照片
|
||||||
|
|
||||||
home.permissions.title=修改權限
|
home.permissions.title=修改權限
|
||||||
home.permissions.desc=修改您的 PDF 檔案權限
|
home.permissions.desc=修改你的 PDF 檔案權限
|
||||||
permissions.tags=讀取,寫入,編輯,列印
|
permissions.tags=讀取,寫入,編輯,列印
|
||||||
|
|
||||||
|
|
||||||
home.removePages.title=移除
|
home.removePages.title=移除
|
||||||
home.removePages.desc=從您的 PDF 檔案中刪除不需要的頁面。
|
home.removePages.desc=從你的 PDF 檔案中刪除不需要的頁面。
|
||||||
removePages.tags=移除頁面,刪除頁面
|
removePages.tags=移除頁面,刪除頁面
|
||||||
|
|
||||||
home.addPassword.title=新增密碼
|
home.addPassword.title=新增密碼
|
||||||
home.addPassword.desc=用密碼加密您的 PDF 檔案。
|
home.addPassword.desc=用密碼加密你的 PDF 檔案。
|
||||||
addPassword.tags=安全,安全性
|
addPassword.tags=安全,安全性
|
||||||
|
|
||||||
home.removePassword.title=移除密碼
|
home.removePassword.title=移除密碼
|
||||||
home.removePassword.desc=從您的 PDF 檔案中移除密碼保護。
|
home.removePassword.desc=從你的 PDF 檔案中移除密碼保護。
|
||||||
removePassword.tags=安全,解密,安全性,取消密碼,刪除密碼
|
removePassword.tags=安全,解密,安全性,取消密碼,刪除密碼
|
||||||
|
|
||||||
home.compressPdfs.title=壓縮
|
home.compressPdfs.title=壓縮
|
||||||
@@ -456,7 +473,7 @@ login.header=登入
|
|||||||
login.signin=登入
|
login.signin=登入
|
||||||
login.rememberme=記住我
|
login.rememberme=記住我
|
||||||
login.invalid=使用者名稱或密碼無效。
|
login.invalid=使用者名稱或密碼無效。
|
||||||
login.locked=您的帳戶已被鎖定。
|
login.locked=你的帳戶已被鎖定。
|
||||||
login.signinTitle=請登入
|
login.signinTitle=請登入
|
||||||
login.ssoSignIn=透過織網單一簽入
|
login.ssoSignIn=透過織網單一簽入
|
||||||
login.oauth2AutoCreateDisabled=OAuth 2.0 自動建立使用者已停用
|
login.oauth2AutoCreateDisabled=OAuth 2.0 自動建立使用者已停用
|
||||||
@@ -647,15 +664,15 @@ scalePages.submit=送出
|
|||||||
|
|
||||||
#certSign
|
#certSign
|
||||||
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)(可選,如果提供,它應包含你的私鑰和憑證):
|
||||||
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=位置
|
||||||
@@ -689,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=比較
|
||||||
@@ -852,7 +871,7 @@ rotate.submit=旋轉
|
|||||||
#split-pdfs
|
#split-pdfs
|
||||||
split.title=分割 PDF
|
split.title=分割 PDF
|
||||||
split.header=分割 PDF
|
split.header=分割 PDF
|
||||||
split.desc.1=您選擇的數字是您希望進行分割的頁碼
|
split.desc.1=你選擇的數字是你希望進行分割的頁碼
|
||||||
split.desc.2=因此,選擇 1,3,7-9 將會將一個 10 頁的文件分割為 6 個單獨的 PDF,包括:
|
split.desc.2=因此,選擇 1,3,7-9 將會將一個 10 頁的文件分割為 6 個單獨的 PDF,包括:
|
||||||
split.desc.3=文件 #1:頁面 1
|
split.desc.3=文件 #1:頁面 1
|
||||||
split.desc.4=文件 #2:頁面 2 和 3
|
split.desc.4=文件 #2:頁面 2 和 3
|
||||||
@@ -926,6 +945,7 @@ watermark.selectText.6=heightSpacer(每個浮水印之間的垂直間距):
|
|||||||
watermark.selectText.7=不透明度(0% - 100%):
|
watermark.selectText.7=不透明度(0% - 100%):
|
||||||
watermark.selectText.8=浮水印類型:
|
watermark.selectText.8=浮水印類型:
|
||||||
watermark.selectText.9=浮水印影像:
|
watermark.selectText.9=浮水印影像:
|
||||||
|
watermark.selectText.10=Convert PDF to PDF-Image
|
||||||
watermark.submit=新增浮水印
|
watermark.submit=新增浮水印
|
||||||
watermark.type.1=文字
|
watermark.type.1=文字
|
||||||
watermark.type.2=圖片
|
watermark.type.2=圖片
|
||||||
@@ -959,7 +979,7 @@ removePassword.submit=移除
|
|||||||
#changeMetadata
|
#changeMetadata
|
||||||
changeMetadata.title=標題:
|
changeMetadata.title=標題:
|
||||||
changeMetadata.header=變更中繼資料
|
changeMetadata.header=變更中繼資料
|
||||||
changeMetadata.selectText.1=請編輯您希望變更的變數
|
changeMetadata.selectText.1=請編輯你希望變更的變數
|
||||||
changeMetadata.selectText.2=刪除所有中繼資料
|
changeMetadata.selectText.2=刪除所有中繼資料
|
||||||
changeMetadata.selectText.3=顯示自訂中繼資料:
|
changeMetadata.selectText.3=顯示自訂中繼資料:
|
||||||
changeMetadata.author=作者:
|
changeMetadata.author=作者:
|
||||||
@@ -1084,13 +1104,13 @@ licenses.version=版本
|
|||||||
licenses.license=許可證
|
licenses.license=許可證
|
||||||
|
|
||||||
#survey
|
#survey
|
||||||
survey.nav=Survey
|
survey.nav=問卷調查
|
||||||
survey.title=Stirling-PDF Survey
|
survey.title=Stirling-PDF 問卷調查
|
||||||
survey.description=Stirling-PDF has no tracking so we want to hear from our users to improve Stirling-PDF!
|
survey.description=Stirling-PDF 沒有追蹤功能,所以我們希望聽取用戶的意見來改進 Stirling-PDF!
|
||||||
survey.please=Please consider taking our survey!
|
survey.please=請考慮參加我們的問卷調查!
|
||||||
survey.disabled=(Survey popup will be disabled in following updates but available at foot of page)
|
survey.disabled=(問卷調查彈出窗口將在後續更新中停用,但仍可在頁腳處使用)
|
||||||
survey.button=Take Survey
|
survey.button=參加問卷調查
|
||||||
survey.dontShowAgain=Don't show again
|
survey.dontShowAgain=不要再次顯示
|
||||||
|
|
||||||
|
|
||||||
#error
|
#error
|
||||||
@@ -1105,4 +1125,3 @@ error.showStack=顯示堆疊追蹤
|
|||||||
error.copyStack=複製堆疊追蹤
|
error.copyStack=複製堆疊追蹤
|
||||||
error.githubSubmit=GitHub - 提交工單
|
error.githubSubmit=GitHub - 提交工單
|
||||||
error.discordSubmit=Discord - 提交支援帖子
|
error.discordSubmit=Discord - 提交支援帖子
|
||||||
|
|
||||||
|
|||||||
@@ -24,56 +24,56 @@
|
|||||||
{
|
{
|
||||||
"moduleName": "com.fasterxml.jackson.core:jackson-annotations",
|
"moduleName": "com.fasterxml.jackson.core:jackson-annotations",
|
||||||
"moduleUrl": "https://github.com/FasterXML/jackson",
|
"moduleUrl": "https://github.com/FasterXML/jackson",
|
||||||
"moduleVersion": "2.17.1",
|
"moduleVersion": "2.17.2",
|
||||||
"moduleLicense": "The Apache Software License, Version 2.0",
|
"moduleLicense": "The Apache Software License, Version 2.0",
|
||||||
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0.txt"
|
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0.txt"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"moduleName": "com.fasterxml.jackson.core:jackson-core",
|
"moduleName": "com.fasterxml.jackson.core:jackson-core",
|
||||||
"moduleUrl": "https://github.com/FasterXML/jackson-core",
|
"moduleUrl": "https://github.com/FasterXML/jackson-core",
|
||||||
"moduleVersion": "2.17.1",
|
"moduleVersion": "2.17.2",
|
||||||
"moduleLicense": "The Apache Software License, Version 2.0",
|
"moduleLicense": "The Apache Software License, Version 2.0",
|
||||||
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0.txt"
|
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0.txt"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"moduleName": "com.fasterxml.jackson.core:jackson-databind",
|
"moduleName": "com.fasterxml.jackson.core:jackson-databind",
|
||||||
"moduleUrl": "https://github.com/FasterXML/jackson",
|
"moduleUrl": "https://github.com/FasterXML/jackson",
|
||||||
"moduleVersion": "2.17.1",
|
"moduleVersion": "2.17.2",
|
||||||
"moduleLicense": "The Apache Software License, Version 2.0",
|
"moduleLicense": "The Apache Software License, Version 2.0",
|
||||||
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0.txt"
|
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0.txt"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"moduleName": "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml",
|
"moduleName": "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml",
|
||||||
"moduleUrl": "https://github.com/FasterXML/jackson-dataformats-text",
|
"moduleUrl": "https://github.com/FasterXML/jackson-dataformats-text",
|
||||||
"moduleVersion": "2.17.1",
|
"moduleVersion": "2.17.2",
|
||||||
"moduleLicense": "The Apache Software License, Version 2.0",
|
"moduleLicense": "The Apache Software License, Version 2.0",
|
||||||
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0.txt"
|
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0.txt"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"moduleName": "com.fasterxml.jackson.datatype:jackson-datatype-jdk8",
|
"moduleName": "com.fasterxml.jackson.datatype:jackson-datatype-jdk8",
|
||||||
"moduleUrl": "https://github.com/FasterXML/jackson-modules-java8/jackson-datatype-jdk8",
|
"moduleUrl": "https://github.com/FasterXML/jackson-modules-java8/jackson-datatype-jdk8",
|
||||||
"moduleVersion": "2.17.1",
|
"moduleVersion": "2.17.2",
|
||||||
"moduleLicense": "The Apache Software License, Version 2.0",
|
"moduleLicense": "The Apache Software License, Version 2.0",
|
||||||
"moduleLicenseUrl": "http://www.apache.org/licenses/LICENSE-2.0.txt"
|
"moduleLicenseUrl": "http://www.apache.org/licenses/LICENSE-2.0.txt"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"moduleName": "com.fasterxml.jackson.datatype:jackson-datatype-jsr310",
|
"moduleName": "com.fasterxml.jackson.datatype:jackson-datatype-jsr310",
|
||||||
"moduleUrl": "https://github.com/FasterXML/jackson-modules-java8/jackson-datatype-jsr310",
|
"moduleUrl": "https://github.com/FasterXML/jackson-modules-java8/jackson-datatype-jsr310",
|
||||||
"moduleVersion": "2.17.1",
|
"moduleVersion": "2.17.2",
|
||||||
"moduleLicense": "The Apache Software License, Version 2.0",
|
"moduleLicense": "The Apache Software License, Version 2.0",
|
||||||
"moduleLicenseUrl": "http://www.apache.org/licenses/LICENSE-2.0.txt"
|
"moduleLicenseUrl": "http://www.apache.org/licenses/LICENSE-2.0.txt"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"moduleName": "com.fasterxml.jackson.module:jackson-module-parameter-names",
|
"moduleName": "com.fasterxml.jackson.module:jackson-module-parameter-names",
|
||||||
"moduleUrl": "https://github.com/FasterXML/jackson-modules-java8/jackson-module-parameter-names",
|
"moduleUrl": "https://github.com/FasterXML/jackson-modules-java8/jackson-module-parameter-names",
|
||||||
"moduleVersion": "2.17.1",
|
"moduleVersion": "2.17.2",
|
||||||
"moduleLicense": "The Apache Software License, Version 2.0",
|
"moduleLicense": "The Apache Software License, Version 2.0",
|
||||||
"moduleLicenseUrl": "http://www.apache.org/licenses/LICENSE-2.0.txt"
|
"moduleLicenseUrl": "http://www.apache.org/licenses/LICENSE-2.0.txt"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"moduleName": "com.fasterxml.jackson:jackson-bom",
|
"moduleName": "com.fasterxml.jackson:jackson-bom",
|
||||||
"moduleUrl": "https://github.com/FasterXML/jackson-bom",
|
"moduleUrl": "https://github.com/FasterXML/jackson-bom",
|
||||||
"moduleVersion": "2.17.1",
|
"moduleVersion": "2.17.2",
|
||||||
"moduleLicense": "The Apache Software License, Version 2.0",
|
"moduleLicense": "The Apache Software License, Version 2.0",
|
||||||
"moduleLicenseUrl": "http://www.apache.org/licenses/LICENSE-2.0.txt"
|
"moduleLicenseUrl": "http://www.apache.org/licenses/LICENSE-2.0.txt"
|
||||||
},
|
},
|
||||||
@@ -176,19 +176,19 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"moduleName": "com.twelvemonkeys.common:common-image",
|
"moduleName": "com.twelvemonkeys.common:common-image",
|
||||||
"moduleVersion": "3.10.1",
|
"moduleVersion": "3.11.0",
|
||||||
"moduleLicense": "The BSD License",
|
"moduleLicense": "The BSD License",
|
||||||
"moduleLicenseUrl": "https://github.com/haraldk/TwelveMonkeys#license"
|
"moduleLicenseUrl": "https://github.com/haraldk/TwelveMonkeys#license"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"moduleName": "com.twelvemonkeys.common:common-io",
|
"moduleName": "com.twelvemonkeys.common:common-io",
|
||||||
"moduleVersion": "3.10.1",
|
"moduleVersion": "3.11.0",
|
||||||
"moduleLicense": "The BSD License",
|
"moduleLicense": "The BSD License",
|
||||||
"moduleLicenseUrl": "https://github.com/haraldk/TwelveMonkeys#license"
|
"moduleLicenseUrl": "https://github.com/haraldk/TwelveMonkeys#license"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"moduleName": "com.twelvemonkeys.common:common-lang",
|
"moduleName": "com.twelvemonkeys.common:common-lang",
|
||||||
"moduleVersion": "3.10.1",
|
"moduleVersion": "3.11.0",
|
||||||
"moduleLicense": "The BSD License",
|
"moduleLicense": "The BSD License",
|
||||||
"moduleLicenseUrl": "https://github.com/haraldk/TwelveMonkeys#license"
|
"moduleLicenseUrl": "https://github.com/haraldk/TwelveMonkeys#license"
|
||||||
},
|
},
|
||||||
@@ -206,19 +206,19 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"moduleName": "com.twelvemonkeys.imageio:imageio-core",
|
"moduleName": "com.twelvemonkeys.imageio:imageio-core",
|
||||||
"moduleVersion": "3.10.1",
|
"moduleVersion": "3.11.0",
|
||||||
"moduleLicense": "The BSD License",
|
"moduleLicense": "The BSD License",
|
||||||
"moduleLicenseUrl": "https://github.com/haraldk/TwelveMonkeys#license"
|
"moduleLicenseUrl": "https://github.com/haraldk/TwelveMonkeys#license"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"moduleName": "com.twelvemonkeys.imageio:imageio-jpeg",
|
"moduleName": "com.twelvemonkeys.imageio:imageio-jpeg",
|
||||||
"moduleVersion": "3.10.1",
|
"moduleVersion": "3.11.0",
|
||||||
"moduleLicense": "The BSD License",
|
"moduleLicense": "The BSD License",
|
||||||
"moduleLicenseUrl": "https://github.com/haraldk/TwelveMonkeys#license"
|
"moduleLicenseUrl": "https://github.com/haraldk/TwelveMonkeys#license"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"moduleName": "com.twelvemonkeys.imageio:imageio-metadata",
|
"moduleName": "com.twelvemonkeys.imageio:imageio-metadata",
|
||||||
"moduleVersion": "3.10.1",
|
"moduleVersion": "3.11.0",
|
||||||
"moduleLicense": "The BSD License",
|
"moduleLicense": "The BSD License",
|
||||||
"moduleLicenseUrl": "https://github.com/haraldk/TwelveMonkeys#license"
|
"moduleLicenseUrl": "https://github.com/haraldk/TwelveMonkeys#license"
|
||||||
},
|
},
|
||||||
@@ -279,7 +279,7 @@
|
|||||||
{
|
{
|
||||||
"moduleName": "io.micrometer:micrometer-commons",
|
"moduleName": "io.micrometer:micrometer-commons",
|
||||||
"moduleUrl": "https://github.com/micrometer-metrics/micrometer",
|
"moduleUrl": "https://github.com/micrometer-metrics/micrometer",
|
||||||
"moduleVersion": "1.13.0",
|
"moduleVersion": "1.13.2",
|
||||||
"moduleLicense": "The Apache Software License, Version 2.0",
|
"moduleLicense": "The Apache Software License, Version 2.0",
|
||||||
"moduleLicenseUrl": "http://www.apache.org/licenses/LICENSE-2.0.txt"
|
"moduleLicenseUrl": "http://www.apache.org/licenses/LICENSE-2.0.txt"
|
||||||
},
|
},
|
||||||
@@ -293,14 +293,14 @@
|
|||||||
{
|
{
|
||||||
"moduleName": "io.micrometer:micrometer-jakarta9",
|
"moduleName": "io.micrometer:micrometer-jakarta9",
|
||||||
"moduleUrl": "https://github.com/micrometer-metrics/micrometer",
|
"moduleUrl": "https://github.com/micrometer-metrics/micrometer",
|
||||||
"moduleVersion": "1.13.0",
|
"moduleVersion": "1.13.2",
|
||||||
"moduleLicense": "The Apache Software License, Version 2.0",
|
"moduleLicense": "The Apache Software License, Version 2.0",
|
||||||
"moduleLicenseUrl": "http://www.apache.org/licenses/LICENSE-2.0.txt"
|
"moduleLicenseUrl": "http://www.apache.org/licenses/LICENSE-2.0.txt"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"moduleName": "io.micrometer:micrometer-observation",
|
"moduleName": "io.micrometer:micrometer-observation",
|
||||||
"moduleUrl": "https://github.com/micrometer-metrics/micrometer",
|
"moduleUrl": "https://github.com/micrometer-metrics/micrometer",
|
||||||
"moduleVersion": "1.13.0",
|
"moduleVersion": "1.13.2",
|
||||||
"moduleLicense": "The Apache Software License, Version 2.0",
|
"moduleLicense": "The Apache Software License, Version 2.0",
|
||||||
"moduleLicenseUrl": "http://www.apache.org/licenses/LICENSE-2.0.txt"
|
"moduleLicenseUrl": "http://www.apache.org/licenses/LICENSE-2.0.txt"
|
||||||
},
|
},
|
||||||
@@ -313,21 +313,21 @@
|
|||||||
{
|
{
|
||||||
"moduleName": "io.swagger.core.v3:swagger-annotations-jakarta",
|
"moduleName": "io.swagger.core.v3:swagger-annotations-jakarta",
|
||||||
"moduleUrl": "https://github.com/swagger-api/swagger-core/modules/swagger-annotations",
|
"moduleUrl": "https://github.com/swagger-api/swagger-core/modules/swagger-annotations",
|
||||||
"moduleVersion": "2.2.21",
|
"moduleVersion": "2.2.15",
|
||||||
"moduleLicense": "Apache License, Version 2.0",
|
"moduleLicense": "Apache License, Version 2.0",
|
||||||
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
|
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"moduleName": "io.swagger.core.v3:swagger-core-jakarta",
|
"moduleName": "io.swagger.core.v3:swagger-core-jakarta",
|
||||||
"moduleUrl": "https://github.com/swagger-api/swagger-core/modules/swagger-core",
|
"moduleUrl": "https://github.com/swagger-api/swagger-core/modules/swagger-core",
|
||||||
"moduleVersion": "2.2.21",
|
"moduleVersion": "2.2.15",
|
||||||
"moduleLicense": "Apache License, Version 2.0",
|
"moduleLicense": "Apache License, Version 2.0",
|
||||||
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
|
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"moduleName": "io.swagger.core.v3:swagger-models-jakarta",
|
"moduleName": "io.swagger.core.v3:swagger-models-jakarta",
|
||||||
"moduleUrl": "https://github.com/swagger-api/swagger-core/modules/swagger-models",
|
"moduleUrl": "https://github.com/swagger-api/swagger-core/modules/swagger-models",
|
||||||
"moduleVersion": "2.2.21",
|
"moduleVersion": "2.2.15",
|
||||||
"moduleLicense": "Apache License, Version 2.0",
|
"moduleLicense": "Apache License, Version 2.0",
|
||||||
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
|
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
|
||||||
},
|
},
|
||||||
@@ -424,7 +424,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"moduleName": "net.bytebuddy:byte-buddy",
|
"moduleName": "net.bytebuddy:byte-buddy",
|
||||||
"moduleVersion": "1.14.16",
|
"moduleVersion": "1.14.18",
|
||||||
"moduleLicense": "Apache License, Version 2.0",
|
"moduleLicense": "Apache License, Version 2.0",
|
||||||
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0.txt"
|
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0.txt"
|
||||||
},
|
},
|
||||||
@@ -513,7 +513,7 @@
|
|||||||
{
|
{
|
||||||
"moduleName": "org.apache.tomcat.embed:tomcat-embed-el",
|
"moduleName": "org.apache.tomcat.embed:tomcat-embed-el",
|
||||||
"moduleUrl": "https://tomcat.apache.org/",
|
"moduleUrl": "https://tomcat.apache.org/",
|
||||||
"moduleVersion": "10.1.24",
|
"moduleVersion": "10.1.26",
|
||||||
"moduleLicense": "Apache License, Version 2.0",
|
"moduleLicense": "Apache License, Version 2.0",
|
||||||
"moduleLicenseUrl": "http://www.apache.org/licenses/LICENSE-2.0.txt"
|
"moduleLicenseUrl": "http://www.apache.org/licenses/LICENSE-2.0.txt"
|
||||||
},
|
},
|
||||||
@@ -533,7 +533,7 @@
|
|||||||
{
|
{
|
||||||
"moduleName": "org.aspectj:aspectjweaver",
|
"moduleName": "org.aspectj:aspectjweaver",
|
||||||
"moduleUrl": "https://www.eclipse.org/aspectj/",
|
"moduleUrl": "https://www.eclipse.org/aspectj/",
|
||||||
"moduleVersion": "1.9.22",
|
"moduleVersion": "1.9.22.1",
|
||||||
"moduleLicense": "Eclipse Public License - v 2.0",
|
"moduleLicense": "Eclipse Public License - v 2.0",
|
||||||
"moduleLicenseUrl": "https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.txt"
|
"moduleLicenseUrl": "https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.txt"
|
||||||
},
|
},
|
||||||
@@ -587,182 +587,182 @@
|
|||||||
{
|
{
|
||||||
"moduleName": "org.eclipse.jetty.ee10.websocket:jetty-ee10-websocket-jakarta-client",
|
"moduleName": "org.eclipse.jetty.ee10.websocket:jetty-ee10-websocket-jakarta-client",
|
||||||
"moduleUrl": "https://eclipse.dev/jetty/",
|
"moduleUrl": "https://eclipse.dev/jetty/",
|
||||||
"moduleVersion": "12.0.9",
|
"moduleVersion": "12.0.11",
|
||||||
"moduleLicense": "Eclipse Public License - Version 2.0",
|
"moduleLicense": "Eclipse Public License - Version 2.0",
|
||||||
"moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/"
|
"moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"moduleName": "org.eclipse.jetty.ee10.websocket:jetty-ee10-websocket-jakarta-common",
|
"moduleName": "org.eclipse.jetty.ee10.websocket:jetty-ee10-websocket-jakarta-common",
|
||||||
"moduleUrl": "https://eclipse.dev/jetty/",
|
"moduleUrl": "https://eclipse.dev/jetty/",
|
||||||
"moduleVersion": "12.0.9",
|
"moduleVersion": "12.0.11",
|
||||||
"moduleLicense": "Eclipse Public License - Version 2.0",
|
"moduleLicense": "Eclipse Public License - Version 2.0",
|
||||||
"moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/"
|
"moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"moduleName": "org.eclipse.jetty.ee10.websocket:jetty-ee10-websocket-jakarta-server",
|
"moduleName": "org.eclipse.jetty.ee10.websocket:jetty-ee10-websocket-jakarta-server",
|
||||||
"moduleUrl": "https://eclipse.dev/jetty/",
|
"moduleUrl": "https://eclipse.dev/jetty/",
|
||||||
"moduleVersion": "12.0.9",
|
"moduleVersion": "12.0.11",
|
||||||
"moduleLicense": "Eclipse Public License - Version 2.0",
|
"moduleLicense": "Eclipse Public License - Version 2.0",
|
||||||
"moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/"
|
"moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"moduleName": "org.eclipse.jetty.ee10.websocket:jetty-ee10-websocket-jetty-server",
|
"moduleName": "org.eclipse.jetty.ee10.websocket:jetty-ee10-websocket-jetty-server",
|
||||||
"moduleUrl": "https://eclipse.dev/jetty/",
|
"moduleUrl": "https://eclipse.dev/jetty/",
|
||||||
"moduleVersion": "12.0.9",
|
"moduleVersion": "12.0.11",
|
||||||
"moduleLicense": "Eclipse Public License - Version 2.0",
|
"moduleLicense": "Eclipse Public License - Version 2.0",
|
||||||
"moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/"
|
"moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"moduleName": "org.eclipse.jetty.ee10.websocket:jetty-ee10-websocket-servlet",
|
"moduleName": "org.eclipse.jetty.ee10.websocket:jetty-ee10-websocket-servlet",
|
||||||
"moduleUrl": "https://eclipse.dev/jetty/",
|
"moduleUrl": "https://eclipse.dev/jetty/",
|
||||||
"moduleVersion": "12.0.9",
|
"moduleVersion": "12.0.11",
|
||||||
"moduleLicense": "Eclipse Public License - Version 2.0",
|
"moduleLicense": "Eclipse Public License - Version 2.0",
|
||||||
"moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/"
|
"moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"moduleName": "org.eclipse.jetty.ee10:jetty-ee10-annotations",
|
"moduleName": "org.eclipse.jetty.ee10:jetty-ee10-annotations",
|
||||||
"moduleUrl": "https://eclipse.dev/jetty/",
|
"moduleUrl": "https://eclipse.dev/jetty/",
|
||||||
"moduleVersion": "12.0.9",
|
"moduleVersion": "12.0.11",
|
||||||
"moduleLicense": "Eclipse Public License - Version 2.0",
|
"moduleLicense": "Eclipse Public License - Version 2.0",
|
||||||
"moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/"
|
"moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"moduleName": "org.eclipse.jetty.ee10:jetty-ee10-plus",
|
"moduleName": "org.eclipse.jetty.ee10:jetty-ee10-plus",
|
||||||
"moduleUrl": "https://eclipse.dev/jetty/",
|
"moduleUrl": "https://eclipse.dev/jetty/",
|
||||||
"moduleVersion": "12.0.9",
|
"moduleVersion": "12.0.11",
|
||||||
"moduleLicense": "Eclipse Public License - Version 2.0",
|
"moduleLicense": "Eclipse Public License - Version 2.0",
|
||||||
"moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/"
|
"moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"moduleName": "org.eclipse.jetty.ee10:jetty-ee10-servlet",
|
"moduleName": "org.eclipse.jetty.ee10:jetty-ee10-servlet",
|
||||||
"moduleUrl": "https://eclipse.dev/jetty/",
|
"moduleUrl": "https://eclipse.dev/jetty/",
|
||||||
"moduleVersion": "12.0.9",
|
"moduleVersion": "12.0.11",
|
||||||
"moduleLicense": "Eclipse Public License - Version 2.0",
|
"moduleLicense": "Eclipse Public License - Version 2.0",
|
||||||
"moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/"
|
"moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"moduleName": "org.eclipse.jetty.ee10:jetty-ee10-servlets",
|
"moduleName": "org.eclipse.jetty.ee10:jetty-ee10-servlets",
|
||||||
"moduleUrl": "https://eclipse.dev/jetty/",
|
"moduleUrl": "https://eclipse.dev/jetty/",
|
||||||
"moduleVersion": "12.0.9",
|
"moduleVersion": "12.0.11",
|
||||||
"moduleLicense": "Eclipse Public License - Version 2.0",
|
"moduleLicense": "Eclipse Public License - Version 2.0",
|
||||||
"moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/"
|
"moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"moduleName": "org.eclipse.jetty.ee10:jetty-ee10-webapp",
|
"moduleName": "org.eclipse.jetty.ee10:jetty-ee10-webapp",
|
||||||
"moduleUrl": "https://eclipse.dev/jetty/",
|
"moduleUrl": "https://eclipse.dev/jetty/",
|
||||||
"moduleVersion": "12.0.9",
|
"moduleVersion": "12.0.11",
|
||||||
"moduleLicense": "Eclipse Public License - Version 2.0",
|
"moduleLicense": "Eclipse Public License - Version 2.0",
|
||||||
"moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/"
|
"moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"moduleName": "org.eclipse.jetty.websocket:jetty-websocket-core-client",
|
"moduleName": "org.eclipse.jetty.websocket:jetty-websocket-core-client",
|
||||||
"moduleUrl": "https://eclipse.dev/jetty/",
|
"moduleUrl": "https://eclipse.dev/jetty/",
|
||||||
"moduleVersion": "12.0.9",
|
"moduleVersion": "12.0.11",
|
||||||
"moduleLicense": "Eclipse Public License - Version 2.0",
|
"moduleLicense": "Eclipse Public License - Version 2.0",
|
||||||
"moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/"
|
"moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"moduleName": "org.eclipse.jetty.websocket:jetty-websocket-core-common",
|
"moduleName": "org.eclipse.jetty.websocket:jetty-websocket-core-common",
|
||||||
"moduleUrl": "https://eclipse.dev/jetty/",
|
"moduleUrl": "https://eclipse.dev/jetty/",
|
||||||
"moduleVersion": "12.0.9",
|
"moduleVersion": "12.0.11",
|
||||||
"moduleLicense": "Eclipse Public License - Version 2.0",
|
"moduleLicense": "Eclipse Public License - Version 2.0",
|
||||||
"moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/"
|
"moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"moduleName": "org.eclipse.jetty.websocket:jetty-websocket-core-server",
|
"moduleName": "org.eclipse.jetty.websocket:jetty-websocket-core-server",
|
||||||
"moduleUrl": "https://eclipse.dev/jetty/",
|
"moduleUrl": "https://eclipse.dev/jetty/",
|
||||||
"moduleVersion": "12.0.9",
|
"moduleVersion": "12.0.11",
|
||||||
"moduleLicense": "Eclipse Public License - Version 2.0",
|
"moduleLicense": "Eclipse Public License - Version 2.0",
|
||||||
"moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/"
|
"moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"moduleName": "org.eclipse.jetty.websocket:jetty-websocket-jetty-api",
|
"moduleName": "org.eclipse.jetty.websocket:jetty-websocket-jetty-api",
|
||||||
"moduleUrl": "https://eclipse.dev/jetty/",
|
"moduleUrl": "https://eclipse.dev/jetty/",
|
||||||
"moduleVersion": "12.0.9",
|
"moduleVersion": "12.0.11",
|
||||||
"moduleLicense": "Eclipse Public License - Version 2.0",
|
"moduleLicense": "Eclipse Public License - Version 2.0",
|
||||||
"moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/"
|
"moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"moduleName": "org.eclipse.jetty.websocket:jetty-websocket-jetty-common",
|
"moduleName": "org.eclipse.jetty.websocket:jetty-websocket-jetty-common",
|
||||||
"moduleUrl": "https://eclipse.dev/jetty/",
|
"moduleUrl": "https://eclipse.dev/jetty/",
|
||||||
"moduleVersion": "12.0.9",
|
"moduleVersion": "12.0.11",
|
||||||
"moduleLicense": "Eclipse Public License - Version 2.0",
|
"moduleLicense": "Eclipse Public License - Version 2.0",
|
||||||
"moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/"
|
"moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"moduleName": "org.eclipse.jetty:jetty-alpn-client",
|
"moduleName": "org.eclipse.jetty:jetty-alpn-client",
|
||||||
"moduleUrl": "https://eclipse.dev/jetty/",
|
"moduleUrl": "https://eclipse.dev/jetty/",
|
||||||
"moduleVersion": "12.0.9",
|
"moduleVersion": "12.0.11",
|
||||||
"moduleLicense": "Eclipse Public License - Version 2.0",
|
"moduleLicense": "Eclipse Public License - Version 2.0",
|
||||||
"moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/"
|
"moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"moduleName": "org.eclipse.jetty:jetty-client",
|
"moduleName": "org.eclipse.jetty:jetty-client",
|
||||||
"moduleUrl": "https://eclipse.dev/jetty/",
|
"moduleUrl": "https://eclipse.dev/jetty/",
|
||||||
"moduleVersion": "12.0.9",
|
"moduleVersion": "12.0.11",
|
||||||
"moduleLicense": "Eclipse Public License - Version 2.0",
|
"moduleLicense": "Eclipse Public License - Version 2.0",
|
||||||
"moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/"
|
"moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"moduleName": "org.eclipse.jetty:jetty-ee",
|
"moduleName": "org.eclipse.jetty:jetty-ee",
|
||||||
"moduleUrl": "https://eclipse.dev/jetty/",
|
"moduleUrl": "https://eclipse.dev/jetty/",
|
||||||
"moduleVersion": "12.0.9",
|
"moduleVersion": "12.0.11",
|
||||||
"moduleLicense": "Eclipse Public License - Version 2.0",
|
"moduleLicense": "Eclipse Public License - Version 2.0",
|
||||||
"moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/"
|
"moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"moduleName": "org.eclipse.jetty:jetty-http",
|
"moduleName": "org.eclipse.jetty:jetty-http",
|
||||||
"moduleUrl": "https://eclipse.dev/jetty/",
|
"moduleUrl": "https://eclipse.dev/jetty/",
|
||||||
"moduleVersion": "12.0.9",
|
"moduleVersion": "12.0.11",
|
||||||
"moduleLicense": "Eclipse Public License - Version 2.0",
|
"moduleLicense": "Eclipse Public License - Version 2.0",
|
||||||
"moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/"
|
"moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"moduleName": "org.eclipse.jetty:jetty-io",
|
"moduleName": "org.eclipse.jetty:jetty-io",
|
||||||
"moduleUrl": "https://eclipse.dev/jetty/",
|
"moduleUrl": "https://eclipse.dev/jetty/",
|
||||||
"moduleVersion": "12.0.9",
|
"moduleVersion": "12.0.11",
|
||||||
"moduleLicense": "Eclipse Public License - Version 2.0",
|
"moduleLicense": "Eclipse Public License - Version 2.0",
|
||||||
"moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/"
|
"moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"moduleName": "org.eclipse.jetty:jetty-plus",
|
"moduleName": "org.eclipse.jetty:jetty-plus",
|
||||||
"moduleUrl": "https://eclipse.dev/jetty/",
|
"moduleUrl": "https://eclipse.dev/jetty/",
|
||||||
"moduleVersion": "12.0.9",
|
"moduleVersion": "12.0.11",
|
||||||
"moduleLicense": "Eclipse Public License - Version 2.0",
|
"moduleLicense": "Eclipse Public License - Version 2.0",
|
||||||
"moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/"
|
"moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"moduleName": "org.eclipse.jetty:jetty-security",
|
"moduleName": "org.eclipse.jetty:jetty-security",
|
||||||
"moduleUrl": "https://eclipse.dev/jetty/",
|
"moduleUrl": "https://eclipse.dev/jetty/",
|
||||||
"moduleVersion": "12.0.9",
|
"moduleVersion": "12.0.11",
|
||||||
"moduleLicense": "Eclipse Public License - Version 2.0",
|
"moduleLicense": "Eclipse Public License - Version 2.0",
|
||||||
"moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/"
|
"moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"moduleName": "org.eclipse.jetty:jetty-server",
|
"moduleName": "org.eclipse.jetty:jetty-server",
|
||||||
"moduleUrl": "https://eclipse.dev/jetty/",
|
"moduleUrl": "https://eclipse.dev/jetty/",
|
||||||
"moduleVersion": "12.0.9",
|
"moduleVersion": "12.0.11",
|
||||||
"moduleLicense": "Eclipse Public License - Version 2.0",
|
"moduleLicense": "Eclipse Public License - Version 2.0",
|
||||||
"moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/"
|
"moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"moduleName": "org.eclipse.jetty:jetty-session",
|
"moduleName": "org.eclipse.jetty:jetty-session",
|
||||||
"moduleUrl": "https://eclipse.dev/jetty/",
|
"moduleUrl": "https://eclipse.dev/jetty/",
|
||||||
"moduleVersion": "12.0.9",
|
"moduleVersion": "12.0.11",
|
||||||
"moduleLicense": "Eclipse Public License - Version 2.0",
|
"moduleLicense": "Eclipse Public License - Version 2.0",
|
||||||
"moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/"
|
"moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"moduleName": "org.eclipse.jetty:jetty-util",
|
"moduleName": "org.eclipse.jetty:jetty-util",
|
||||||
"moduleUrl": "https://eclipse.dev/jetty/",
|
"moduleUrl": "https://eclipse.dev/jetty/",
|
||||||
"moduleVersion": "12.0.9",
|
"moduleVersion": "12.0.11",
|
||||||
"moduleLicense": "Eclipse Public License - Version 2.0",
|
"moduleLicense": "Eclipse Public License - Version 2.0",
|
||||||
"moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/"
|
"moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"moduleName": "org.eclipse.jetty:jetty-xml",
|
"moduleName": "org.eclipse.jetty:jetty-xml",
|
||||||
"moduleUrl": "https://eclipse.dev/jetty/",
|
"moduleUrl": "https://eclipse.dev/jetty/",
|
||||||
"moduleVersion": "12.0.9",
|
"moduleVersion": "12.0.11",
|
||||||
"moduleLicense": "Eclipse Public License - Version 2.0",
|
"moduleLicense": "Eclipse Public License - Version 2.0",
|
||||||
"moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/"
|
"moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/"
|
||||||
},
|
},
|
||||||
@@ -859,285 +859,285 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"moduleName": "org.springdoc:springdoc-openapi-starter-common",
|
"moduleName": "org.springdoc:springdoc-openapi-starter-common",
|
||||||
"moduleVersion": "2.5.0",
|
"moduleVersion": "2.2.0",
|
||||||
"moduleLicense": "The Apache License, Version 2.0",
|
"moduleLicense": "The Apache License, Version 2.0",
|
||||||
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0.txt"
|
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0.txt"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"moduleName": "org.springdoc:springdoc-openapi-starter-webmvc-api",
|
"moduleName": "org.springdoc:springdoc-openapi-starter-webmvc-api",
|
||||||
"moduleVersion": "2.5.0",
|
"moduleVersion": "2.2.0",
|
||||||
"moduleLicense": "The Apache License, Version 2.0",
|
"moduleLicense": "The Apache License, Version 2.0",
|
||||||
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0.txt"
|
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0.txt"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"moduleName": "org.springdoc:springdoc-openapi-starter-webmvc-ui",
|
"moduleName": "org.springdoc:springdoc-openapi-starter-webmvc-ui",
|
||||||
"moduleVersion": "2.5.0",
|
"moduleVersion": "2.2.0",
|
||||||
"moduleLicense": "The Apache License, Version 2.0",
|
"moduleLicense": "The Apache License, Version 2.0",
|
||||||
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0.txt"
|
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0.txt"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"moduleName": "org.springframework.boot:spring-boot",
|
"moduleName": "org.springframework.boot:spring-boot",
|
||||||
"moduleUrl": "https://spring.io/projects/spring-boot",
|
"moduleUrl": "https://spring.io/projects/spring-boot",
|
||||||
"moduleVersion": "3.3.0",
|
"moduleVersion": "3.3.2",
|
||||||
"moduleLicense": "Apache License, Version 2.0",
|
"moduleLicense": "Apache License, Version 2.0",
|
||||||
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
|
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"moduleName": "org.springframework.boot:spring-boot-actuator",
|
"moduleName": "org.springframework.boot:spring-boot-actuator",
|
||||||
"moduleUrl": "https://spring.io/projects/spring-boot",
|
"moduleUrl": "https://spring.io/projects/spring-boot",
|
||||||
"moduleVersion": "3.3.0",
|
"moduleVersion": "3.3.2",
|
||||||
"moduleLicense": "Apache License, Version 2.0",
|
"moduleLicense": "Apache License, Version 2.0",
|
||||||
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
|
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"moduleName": "org.springframework.boot:spring-boot-actuator-autoconfigure",
|
"moduleName": "org.springframework.boot:spring-boot-actuator-autoconfigure",
|
||||||
"moduleUrl": "https://spring.io/projects/spring-boot",
|
"moduleUrl": "https://spring.io/projects/spring-boot",
|
||||||
"moduleVersion": "3.3.0",
|
"moduleVersion": "3.3.2",
|
||||||
"moduleLicense": "Apache License, Version 2.0",
|
"moduleLicense": "Apache License, Version 2.0",
|
||||||
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
|
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"moduleName": "org.springframework.boot:spring-boot-autoconfigure",
|
"moduleName": "org.springframework.boot:spring-boot-autoconfigure",
|
||||||
"moduleUrl": "https://spring.io/projects/spring-boot",
|
"moduleUrl": "https://spring.io/projects/spring-boot",
|
||||||
"moduleVersion": "3.3.0",
|
"moduleVersion": "3.3.2",
|
||||||
"moduleLicense": "Apache License, Version 2.0",
|
"moduleLicense": "Apache License, Version 2.0",
|
||||||
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
|
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"moduleName": "org.springframework.boot:spring-boot-devtools",
|
"moduleName": "org.springframework.boot:spring-boot-devtools",
|
||||||
"moduleUrl": "https://spring.io/projects/spring-boot",
|
"moduleUrl": "https://spring.io/projects/spring-boot",
|
||||||
"moduleVersion": "3.3.0",
|
"moduleVersion": "3.3.2",
|
||||||
"moduleLicense": "Apache License, Version 2.0",
|
"moduleLicense": "Apache License, Version 2.0",
|
||||||
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
|
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"moduleName": "org.springframework.boot:spring-boot-starter",
|
"moduleName": "org.springframework.boot:spring-boot-starter",
|
||||||
"moduleUrl": "https://spring.io/projects/spring-boot",
|
"moduleUrl": "https://spring.io/projects/spring-boot",
|
||||||
"moduleVersion": "3.3.0",
|
"moduleVersion": "3.3.2",
|
||||||
"moduleLicense": "Apache License, Version 2.0",
|
"moduleLicense": "Apache License, Version 2.0",
|
||||||
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
|
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"moduleName": "org.springframework.boot:spring-boot-starter-actuator",
|
"moduleName": "org.springframework.boot:spring-boot-starter-actuator",
|
||||||
"moduleUrl": "https://spring.io/projects/spring-boot",
|
"moduleUrl": "https://spring.io/projects/spring-boot",
|
||||||
"moduleVersion": "3.3.0",
|
"moduleVersion": "3.3.2",
|
||||||
"moduleLicense": "Apache License, Version 2.0",
|
"moduleLicense": "Apache License, Version 2.0",
|
||||||
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
|
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"moduleName": "org.springframework.boot:spring-boot-starter-aop",
|
"moduleName": "org.springframework.boot:spring-boot-starter-aop",
|
||||||
"moduleUrl": "https://spring.io/projects/spring-boot",
|
"moduleUrl": "https://spring.io/projects/spring-boot",
|
||||||
"moduleVersion": "3.3.0",
|
"moduleVersion": "3.3.2",
|
||||||
"moduleLicense": "Apache License, Version 2.0",
|
"moduleLicense": "Apache License, Version 2.0",
|
||||||
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
|
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"moduleName": "org.springframework.boot:spring-boot-starter-data-jpa",
|
"moduleName": "org.springframework.boot:spring-boot-starter-data-jpa",
|
||||||
"moduleUrl": "https://spring.io/projects/spring-boot",
|
"moduleUrl": "https://spring.io/projects/spring-boot",
|
||||||
"moduleVersion": "3.3.0",
|
"moduleVersion": "3.3.2",
|
||||||
"moduleLicense": "Apache License, Version 2.0",
|
"moduleLicense": "Apache License, Version 2.0",
|
||||||
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
|
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"moduleName": "org.springframework.boot:spring-boot-starter-jdbc",
|
"moduleName": "org.springframework.boot:spring-boot-starter-jdbc",
|
||||||
"moduleUrl": "https://spring.io/projects/spring-boot",
|
"moduleUrl": "https://spring.io/projects/spring-boot",
|
||||||
"moduleVersion": "3.3.0",
|
"moduleVersion": "3.3.2",
|
||||||
"moduleLicense": "Apache License, Version 2.0",
|
"moduleLicense": "Apache License, Version 2.0",
|
||||||
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
|
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"moduleName": "org.springframework.boot:spring-boot-starter-jetty",
|
"moduleName": "org.springframework.boot:spring-boot-starter-jetty",
|
||||||
"moduleUrl": "https://spring.io/projects/spring-boot",
|
"moduleUrl": "https://spring.io/projects/spring-boot",
|
||||||
"moduleVersion": "3.3.0",
|
"moduleVersion": "3.3.2",
|
||||||
"moduleLicense": "Apache License, Version 2.0",
|
"moduleLicense": "Apache License, Version 2.0",
|
||||||
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
|
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"moduleName": "org.springframework.boot:spring-boot-starter-json",
|
"moduleName": "org.springframework.boot:spring-boot-starter-json",
|
||||||
"moduleUrl": "https://spring.io/projects/spring-boot",
|
"moduleUrl": "https://spring.io/projects/spring-boot",
|
||||||
"moduleVersion": "3.3.0",
|
"moduleVersion": "3.3.2",
|
||||||
"moduleLicense": "Apache License, Version 2.0",
|
"moduleLicense": "Apache License, Version 2.0",
|
||||||
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
|
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"moduleName": "org.springframework.boot:spring-boot-starter-logging",
|
"moduleName": "org.springframework.boot:spring-boot-starter-logging",
|
||||||
"moduleUrl": "https://spring.io/projects/spring-boot",
|
"moduleUrl": "https://spring.io/projects/spring-boot",
|
||||||
"moduleVersion": "3.3.0",
|
"moduleVersion": "3.3.2",
|
||||||
"moduleLicense": "Apache License, Version 2.0",
|
"moduleLicense": "Apache License, Version 2.0",
|
||||||
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
|
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"moduleName": "org.springframework.boot:spring-boot-starter-oauth2-client",
|
"moduleName": "org.springframework.boot:spring-boot-starter-oauth2-client",
|
||||||
"moduleUrl": "https://spring.io/projects/spring-boot",
|
"moduleUrl": "https://spring.io/projects/spring-boot",
|
||||||
"moduleVersion": "3.3.0",
|
"moduleVersion": "3.3.2",
|
||||||
"moduleLicense": "Apache License, Version 2.0",
|
"moduleLicense": "Apache License, Version 2.0",
|
||||||
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
|
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"moduleName": "org.springframework.boot:spring-boot-starter-security",
|
"moduleName": "org.springframework.boot:spring-boot-starter-security",
|
||||||
"moduleUrl": "https://spring.io/projects/spring-boot",
|
"moduleUrl": "https://spring.io/projects/spring-boot",
|
||||||
"moduleVersion": "3.3.0",
|
"moduleVersion": "3.3.2",
|
||||||
"moduleLicense": "Apache License, Version 2.0",
|
"moduleLicense": "Apache License, Version 2.0",
|
||||||
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
|
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"moduleName": "org.springframework.boot:spring-boot-starter-thymeleaf",
|
"moduleName": "org.springframework.boot:spring-boot-starter-thymeleaf",
|
||||||
"moduleUrl": "https://spring.io/projects/spring-boot",
|
"moduleUrl": "https://spring.io/projects/spring-boot",
|
||||||
"moduleVersion": "3.3.0",
|
"moduleVersion": "3.3.2",
|
||||||
"moduleLicense": "Apache License, Version 2.0",
|
"moduleLicense": "Apache License, Version 2.0",
|
||||||
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
|
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"moduleName": "org.springframework.boot:spring-boot-starter-web",
|
"moduleName": "org.springframework.boot:spring-boot-starter-web",
|
||||||
"moduleUrl": "https://spring.io/projects/spring-boot",
|
"moduleUrl": "https://spring.io/projects/spring-boot",
|
||||||
"moduleVersion": "3.3.0",
|
"moduleVersion": "3.3.2",
|
||||||
"moduleLicense": "Apache License, Version 2.0",
|
"moduleLicense": "Apache License, Version 2.0",
|
||||||
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
|
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"moduleName": "org.springframework.data:spring-data-commons",
|
"moduleName": "org.springframework.data:spring-data-commons",
|
||||||
"moduleUrl": "https://spring.io/projects/spring-data",
|
"moduleUrl": "https://spring.io/projects/spring-data",
|
||||||
"moduleVersion": "3.3.0",
|
"moduleVersion": "3.3.2",
|
||||||
"moduleLicense": "Apache License, Version 2.0",
|
"moduleLicense": "Apache License, Version 2.0",
|
||||||
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
|
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"moduleName": "org.springframework.data:spring-data-jpa",
|
"moduleName": "org.springframework.data:spring-data-jpa",
|
||||||
"moduleUrl": "https://projects.spring.io/spring-data-jpa",
|
"moduleUrl": "https://projects.spring.io/spring-data-jpa",
|
||||||
"moduleVersion": "3.3.0",
|
"moduleVersion": "3.3.2",
|
||||||
"moduleLicense": "Apache License, Version 2.0",
|
"moduleLicense": "Apache License, Version 2.0",
|
||||||
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
|
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"moduleName": "org.springframework.security:spring-security-config",
|
"moduleName": "org.springframework.security:spring-security-config",
|
||||||
"moduleUrl": "https://spring.io/projects/spring-security",
|
"moduleUrl": "https://spring.io/projects/spring-security",
|
||||||
"moduleVersion": "6.3.0",
|
"moduleVersion": "6.3.1",
|
||||||
"moduleLicense": "Apache License, Version 2.0",
|
"moduleLicense": "Apache License, Version 2.0",
|
||||||
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
|
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"moduleName": "org.springframework.security:spring-security-core",
|
"moduleName": "org.springframework.security:spring-security-core",
|
||||||
"moduleUrl": "https://spring.io/projects/spring-security",
|
"moduleUrl": "https://spring.io/projects/spring-security",
|
||||||
"moduleVersion": "6.3.0",
|
"moduleVersion": "6.3.1",
|
||||||
"moduleLicense": "Apache License, Version 2.0",
|
"moduleLicense": "Apache License, Version 2.0",
|
||||||
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
|
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"moduleName": "org.springframework.security:spring-security-crypto",
|
"moduleName": "org.springframework.security:spring-security-crypto",
|
||||||
"moduleUrl": "https://spring.io/projects/spring-security",
|
"moduleUrl": "https://spring.io/projects/spring-security",
|
||||||
"moduleVersion": "6.3.0",
|
"moduleVersion": "6.3.1",
|
||||||
"moduleLicense": "Apache License, Version 2.0",
|
"moduleLicense": "Apache License, Version 2.0",
|
||||||
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
|
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"moduleName": "org.springframework.security:spring-security-oauth2-client",
|
"moduleName": "org.springframework.security:spring-security-oauth2-client",
|
||||||
"moduleUrl": "https://spring.io/projects/spring-security",
|
"moduleUrl": "https://spring.io/projects/spring-security",
|
||||||
"moduleVersion": "6.3.0",
|
"moduleVersion": "6.3.1",
|
||||||
"moduleLicense": "Apache License, Version 2.0",
|
"moduleLicense": "Apache License, Version 2.0",
|
||||||
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
|
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"moduleName": "org.springframework.security:spring-security-oauth2-core",
|
"moduleName": "org.springframework.security:spring-security-oauth2-core",
|
||||||
"moduleUrl": "https://spring.io/projects/spring-security",
|
"moduleUrl": "https://spring.io/projects/spring-security",
|
||||||
"moduleVersion": "6.3.0",
|
"moduleVersion": "6.3.1",
|
||||||
"moduleLicense": "Apache License, Version 2.0",
|
"moduleLicense": "Apache License, Version 2.0",
|
||||||
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
|
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"moduleName": "org.springframework.security:spring-security-oauth2-jose",
|
"moduleName": "org.springframework.security:spring-security-oauth2-jose",
|
||||||
"moduleUrl": "https://spring.io/projects/spring-security",
|
"moduleUrl": "https://spring.io/projects/spring-security",
|
||||||
"moduleVersion": "6.3.0",
|
"moduleVersion": "6.3.1",
|
||||||
"moduleLicense": "Apache License, Version 2.0",
|
"moduleLicense": "Apache License, Version 2.0",
|
||||||
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
|
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"moduleName": "org.springframework.security:spring-security-web",
|
"moduleName": "org.springframework.security:spring-security-web",
|
||||||
"moduleUrl": "https://spring.io/projects/spring-security",
|
"moduleUrl": "https://spring.io/projects/spring-security",
|
||||||
"moduleVersion": "6.3.0",
|
"moduleVersion": "6.3.1",
|
||||||
"moduleLicense": "Apache License, Version 2.0",
|
"moduleLicense": "Apache License, Version 2.0",
|
||||||
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
|
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"moduleName": "org.springframework:spring-aop",
|
"moduleName": "org.springframework:spring-aop",
|
||||||
"moduleUrl": "https://github.com/spring-projects/spring-framework",
|
"moduleUrl": "https://github.com/spring-projects/spring-framework",
|
||||||
"moduleVersion": "6.1.8",
|
"moduleVersion": "6.1.11",
|
||||||
"moduleLicense": "Apache License, Version 2.0",
|
"moduleLicense": "Apache License, Version 2.0",
|
||||||
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
|
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"moduleName": "org.springframework:spring-aspects",
|
"moduleName": "org.springframework:spring-aspects",
|
||||||
"moduleUrl": "https://github.com/spring-projects/spring-framework",
|
"moduleUrl": "https://github.com/spring-projects/spring-framework",
|
||||||
"moduleVersion": "6.1.8",
|
"moduleVersion": "6.1.11",
|
||||||
"moduleLicense": "Apache License, Version 2.0",
|
"moduleLicense": "Apache License, Version 2.0",
|
||||||
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
|
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"moduleName": "org.springframework:spring-beans",
|
"moduleName": "org.springframework:spring-beans",
|
||||||
"moduleUrl": "https://github.com/spring-projects/spring-framework",
|
"moduleUrl": "https://github.com/spring-projects/spring-framework",
|
||||||
"moduleVersion": "6.1.8",
|
"moduleVersion": "6.1.11",
|
||||||
"moduleLicense": "Apache License, Version 2.0",
|
"moduleLicense": "Apache License, Version 2.0",
|
||||||
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
|
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"moduleName": "org.springframework:spring-context",
|
"moduleName": "org.springframework:spring-context",
|
||||||
"moduleUrl": "https://github.com/spring-projects/spring-framework",
|
"moduleUrl": "https://github.com/spring-projects/spring-framework",
|
||||||
"moduleVersion": "6.1.8",
|
"moduleVersion": "6.1.11",
|
||||||
"moduleLicense": "Apache License, Version 2.0",
|
"moduleLicense": "Apache License, Version 2.0",
|
||||||
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
|
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"moduleName": "org.springframework:spring-core",
|
"moduleName": "org.springframework:spring-core",
|
||||||
"moduleUrl": "https://github.com/spring-projects/spring-framework",
|
"moduleUrl": "https://github.com/spring-projects/spring-framework",
|
||||||
"moduleVersion": "6.1.8",
|
"moduleVersion": "6.1.11",
|
||||||
"moduleLicense": "Apache License, Version 2.0",
|
"moduleLicense": "Apache License, Version 2.0",
|
||||||
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
|
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"moduleName": "org.springframework:spring-expression",
|
"moduleName": "org.springframework:spring-expression",
|
||||||
"moduleUrl": "https://github.com/spring-projects/spring-framework",
|
"moduleUrl": "https://github.com/spring-projects/spring-framework",
|
||||||
"moduleVersion": "6.1.8",
|
"moduleVersion": "6.1.11",
|
||||||
"moduleLicense": "Apache License, Version 2.0",
|
"moduleLicense": "Apache License, Version 2.0",
|
||||||
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
|
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"moduleName": "org.springframework:spring-jcl",
|
"moduleName": "org.springframework:spring-jcl",
|
||||||
"moduleUrl": "https://github.com/spring-projects/spring-framework",
|
"moduleUrl": "https://github.com/spring-projects/spring-framework",
|
||||||
"moduleVersion": "6.1.8",
|
"moduleVersion": "6.1.11",
|
||||||
"moduleLicense": "Apache License, Version 2.0",
|
"moduleLicense": "Apache License, Version 2.0",
|
||||||
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
|
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"moduleName": "org.springframework:spring-jdbc",
|
"moduleName": "org.springframework:spring-jdbc",
|
||||||
"moduleUrl": "https://github.com/spring-projects/spring-framework",
|
"moduleUrl": "https://github.com/spring-projects/spring-framework",
|
||||||
"moduleVersion": "6.1.8",
|
"moduleVersion": "6.1.11",
|
||||||
"moduleLicense": "Apache License, Version 2.0",
|
"moduleLicense": "Apache License, Version 2.0",
|
||||||
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
|
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"moduleName": "org.springframework:spring-orm",
|
"moduleName": "org.springframework:spring-orm",
|
||||||
"moduleUrl": "https://github.com/spring-projects/spring-framework",
|
"moduleUrl": "https://github.com/spring-projects/spring-framework",
|
||||||
"moduleVersion": "6.1.8",
|
"moduleVersion": "6.1.11",
|
||||||
"moduleLicense": "Apache License, Version 2.0",
|
"moduleLicense": "Apache License, Version 2.0",
|
||||||
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
|
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"moduleName": "org.springframework:spring-tx",
|
"moduleName": "org.springframework:spring-tx",
|
||||||
"moduleUrl": "https://github.com/spring-projects/spring-framework",
|
"moduleUrl": "https://github.com/spring-projects/spring-framework",
|
||||||
"moduleVersion": "6.1.8",
|
"moduleVersion": "6.1.11",
|
||||||
"moduleLicense": "Apache License, Version 2.0",
|
"moduleLicense": "Apache License, Version 2.0",
|
||||||
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
|
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"moduleName": "org.springframework:spring-web",
|
"moduleName": "org.springframework:spring-web",
|
||||||
"moduleUrl": "https://github.com/spring-projects/spring-framework",
|
"moduleUrl": "https://github.com/spring-projects/spring-framework",
|
||||||
"moduleVersion": "6.1.8",
|
"moduleVersion": "6.1.11",
|
||||||
"moduleLicense": "Apache License, Version 2.0",
|
"moduleLicense": "Apache License, Version 2.0",
|
||||||
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
|
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"moduleName": "org.springframework:spring-webmvc",
|
"moduleName": "org.springframework:spring-webmvc",
|
||||||
"moduleUrl": "https://github.com/spring-projects/spring-framework",
|
"moduleUrl": "https://github.com/spring-projects/spring-framework",
|
||||||
"moduleVersion": "6.1.8",
|
"moduleVersion": "6.1.9",
|
||||||
"moduleLicense": "Apache License, Version 2.0",
|
"moduleLicense": "Apache License, Version 2.0",
|
||||||
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
|
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
|
||||||
},
|
},
|
||||||
@@ -1175,7 +1175,7 @@
|
|||||||
{
|
{
|
||||||
"moduleName": "org.webjars:swagger-ui",
|
"moduleName": "org.webjars:swagger-ui",
|
||||||
"moduleUrl": "http://webjars.org",
|
"moduleUrl": "http://webjars.org",
|
||||||
"moduleVersion": "5.13.0",
|
"moduleVersion": "5.2.0",
|
||||||
"moduleLicense": "Apache 2.0",
|
"moduleLicense": "Apache 2.0",
|
||||||
"moduleLicenseUrl": "https://github.com/swagger-api/swagger-ui"
|
"moduleLicenseUrl": "https://github.com/swagger-api/swagger-ui"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -1,8 +1,3 @@
|
|||||||
p {
|
|
||||||
text-align: center;
|
|
||||||
margin-top: 2em;
|
|
||||||
}
|
|
||||||
|
|
||||||
.features-container {
|
.features-container {
|
||||||
display: grid;
|
display: grid;
|
||||||
grid-template-columns: repeat(auto-fill, minmax(21rem, 3fr));
|
grid-template-columns: repeat(auto-fill, minmax(21rem, 3fr));
|
||||||
|
|||||||
5
src/main/resources/static/images/flags/dk.svg
Normal file
5
src/main/resources/static/images/flags/dk.svg
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" id="flag-icons-dk" viewBox="0 0 640 480">
|
||||||
|
<path fill="#c8102e" d="M0 0h640.1v480H0z"/>
|
||||||
|
<path fill="#fff" d="M205.7 0h68.6v480h-68.6z"/>
|
||||||
|
<path fill="#fff" d="M0 205.7h640.1v68.6H0z"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 236 B |
7
src/main/resources/static/images/flags/ie.svg
Normal file
7
src/main/resources/static/images/flags/ie.svg
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" id="flag-icons-ie" viewBox="0 0 640 480">
|
||||||
|
<g fill-rule="evenodd" stroke-width="1pt">
|
||||||
|
<path fill="#fff" d="M0 0h640v480H0z"/>
|
||||||
|
<path fill="#009A49" d="M0 0h213.3v480H0z"/>
|
||||||
|
<path fill="#FF7900" d="M426.7 0H640v480H426.7z"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 289 B |
1
src/main/resources/static/images/flags/th.svg
Normal file
1
src/main/resources/static/images/flags/th.svg
Normal file
@@ -0,0 +1 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 900 600"><g fill-rule="evenodd" stroke-width="1pt"><path fill="#a51931" d="M0 0h900v600H0z"/><path fill="#fff" d="M0 120h900v360H0z"/><path fill="#241d4f" d="M0 240h900v120H0z"/></g></svg>
|
||||||
|
After Width: | Height: | Size: 241 B |
11
src/main/resources/static/images/flags/vn.svg
Normal file
11
src/main/resources/static/images/flags/vn.svg
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" id="flag-icons-vn" viewBox="0 0 640 480">
|
||||||
|
<defs>
|
||||||
|
<clipPath id="vn-a">
|
||||||
|
<path fill-opacity=".7" d="M-85.3 0h682.6v512H-85.3z"/>
|
||||||
|
</clipPath>
|
||||||
|
</defs>
|
||||||
|
<g fill-rule="evenodd" clip-path="url(#vn-a)" transform="translate(80)scale(.9375)">
|
||||||
|
<path fill="#da251d" d="M-128 0h768v512h-768z"/>
|
||||||
|
<path fill="#ff0" d="M349.6 381 260 314.3l-89 67.3L204 272l-89-67.7 110.1-1 34.2-109.4L294 203l110.1.1-88.5 68.4 33.9 109.6z"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 490 B |
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user